getting rid of baseXX, some small fixes. Seems to be usable.
This commit is contained in:
parent
936ca1a38c
commit
aa0564406a
32 changed files with 761 additions and 636 deletions
79
src/App.scss
79
src/App.scss
|
@ -33,14 +33,18 @@ body {
|
||||||
font-family: sans-serif;
|
font-family: sans-serif;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
color: var(--fg);
|
||||||
}
|
}
|
||||||
|
|
||||||
a {
|
a {
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
|
color: var(--link);
|
||||||
}
|
}
|
||||||
|
|
||||||
button{
|
button{
|
||||||
user-select: none;
|
user-select: none;
|
||||||
|
color: var(--faint);
|
||||||
|
background-color: var(--btn);
|
||||||
border: none;
|
border: none;
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
|
@ -50,6 +54,8 @@ button{
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
font-family: sans-serif;
|
font-family: sans-serif;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
&:hover {
|
&:hover {
|
||||||
box-shadow: 0px 0px 4px rgba(255, 255, 255, 0.3);
|
box-shadow: 0px 0px 4px rgba(255, 255, 255, 0.3);
|
||||||
}
|
}
|
||||||
|
@ -58,8 +64,72 @@ button{
|
||||||
cursor: not-allowed;
|
cursor: not-allowed;
|
||||||
opacity: 0.5;
|
opacity: 0.5;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&.pressed {
|
||||||
|
color: var(--faint);
|
||||||
|
background-color: var(--bg)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
input, textarea, select {
|
||||||
|
border: none;
|
||||||
|
border-radius: 5px;
|
||||||
|
border-bottom: 1px solid rgba(255, 255, 255, 0.2);
|
||||||
|
border-top: 1px solid rgba(0, 0, 0, 0.2);
|
||||||
|
box-shadow: 0px 0px 2px black inset;
|
||||||
|
background-color: var(--lightBg);
|
||||||
|
color: var(--lightFg);
|
||||||
|
font-family: sans-serif;
|
||||||
|
font-size: 14px;
|
||||||
|
padding: 5px;
|
||||||
|
|
||||||
|
// TODO: Restyle <select> in a decent way. Needs different markup
|
||||||
|
// -webkit-appearance:none;
|
||||||
|
// -moz-appearance:none;
|
||||||
|
// appearance:none;
|
||||||
|
|
||||||
|
&[type=radio],
|
||||||
|
&[type=checkbox] {
|
||||||
|
display: none;
|
||||||
|
&:checked + label::before {
|
||||||
|
color: var(--fg);
|
||||||
|
}
|
||||||
|
+ label::before {
|
||||||
|
display: inline-block;
|
||||||
|
content: '✔';
|
||||||
|
transition: color 200ms;
|
||||||
|
width: 1.1em;
|
||||||
|
height: 1.1em;
|
||||||
|
border-radius: 2px;
|
||||||
|
border-bottom: 1px solid rgba(255, 255, 255, 0.2);
|
||||||
|
border-top: 1px solid rgba(0, 0, 0, 0.2);
|
||||||
|
box-shadow: 0px 0px 2px black inset;
|
||||||
|
margin-right: .5em;
|
||||||
|
background-color: var(--btn);
|
||||||
|
vertical-align: baseline;
|
||||||
|
text-align: center;
|
||||||
|
line-height: 1.1em;
|
||||||
|
font-size: 1.1em;
|
||||||
|
box-sizing: border-box;
|
||||||
|
color: transparent;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.icon-cancel,
|
||||||
|
.icon-reply,
|
||||||
|
.icon-retweet,
|
||||||
|
.icon-star-empty,
|
||||||
|
.icon-eye-off,
|
||||||
|
.icon-binoculars,
|
||||||
|
.icon-plus-squared,
|
||||||
|
.icon-spin4 {
|
||||||
|
color: var(--icon)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
.container {
|
.container {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
|
@ -73,8 +143,8 @@ button{
|
||||||
|
|
||||||
.item {
|
.item {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
line-height: 21px;
|
line-height: 25px;
|
||||||
height: 21px;
|
height: 25px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
|
||||||
.nav-icon {
|
.nav-icon {
|
||||||
|
@ -132,6 +202,8 @@ main-router {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
margin: 0.5em;
|
margin: 0.5em;
|
||||||
|
|
||||||
|
background-color: var(--bg);
|
||||||
|
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
box-shadow: 1px 1px 4px rgba(0,0,0,.6);
|
box-shadow: 1px 1px 4px rgba(0,0,0,.6);
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
@ -151,6 +223,7 @@ main-router {
|
||||||
text-align: left;
|
text-align: left;
|
||||||
font-size: 1.3em;
|
font-size: 1.3em;
|
||||||
line-height: 24px;
|
line-height: 24px;
|
||||||
|
background-color: var(--btn);
|
||||||
}
|
}
|
||||||
|
|
||||||
.panel-footer {
|
.panel-footer {
|
||||||
|
@ -173,6 +246,8 @@ main-router {
|
||||||
|
|
||||||
nav {
|
nav {
|
||||||
z-index: 1000;
|
z-index: 1000;
|
||||||
|
background-color: var(--bg);
|
||||||
|
color: var(--faint);
|
||||||
box-shadow: 0px 0px 4px rgba(0,0,0,.6);
|
box-shadow: 0px 0px 4px rgba(0,0,0,.6);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<template>
|
<template>
|
||||||
<div id="app" v-bind:style="style" class="base02-background">
|
<div id="app" v-bind:style="style">
|
||||||
<nav class='container base02-background base05' @click="scrollToTop()" id="nav">
|
<nav class='container' @click="scrollToTop()" id="nav">
|
||||||
<div class='inner-nav' :style="logoStyle">
|
<div class='inner-nav' :style="logoStyle">
|
||||||
<div class='item'>
|
<div class='item'>
|
||||||
<router-link :to="{ name: 'root'}">{{sitename}}</router-link>
|
<router-link :to="{ name: 'root'}">{{sitename}}</router-link>
|
||||||
|
@ -14,8 +14,8 @@
|
||||||
</nav>
|
</nav>
|
||||||
<div class="container" id="content">
|
<div class="container" id="content">
|
||||||
<div class="panel-switcher">
|
<div class="panel-switcher">
|
||||||
<button @click="activatePanel('sidebar')" class="base02-background base05">Sidebar</button>
|
<button @click="activatePanel('sidebar')">Sidebar</button>
|
||||||
<button @click="activatePanel('timeline')" class="base02-background base05">Timeline</button>
|
<button @click="activatePanel('timeline')">Timeline</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="sidebar-flexer" :class="{ 'mobile-hidden': mobileActivePanel != 'sidebar'}">
|
<div class="sidebar-flexer" :class="{ 'mobile-hidden': mobileActivePanel != 'sidebar'}">
|
||||||
<div class="sidebar-bounds">
|
<div class="sidebar-bounds">
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
$main-color: #f58d2c;
|
$main-color: #f58d2c;
|
||||||
$main-background: white;
|
$main-background: white;
|
||||||
$darkened-background: whitesmoke;
|
$darkened-background: whitesmoke;
|
||||||
$green: #0fa00f;
|
$green_: #0fa00f;
|
||||||
$blue: #0095ff;
|
$blue_: #0095ff;
|
||||||
$red: #ff0000;
|
$red_: #ff0000;
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="attachment base03-border" :class="{[type]: true, loading}" v-show="!isEmpty">
|
<div class="attachment" :class="{[type]: true, loading}" v-show="!isEmpty">
|
||||||
<a class="image-attachment" v-if="hidden" @click.prevent="toggleHidden()">
|
<a class="image-attachment" v-if="hidden" @click.prevent="toggleHidden()">
|
||||||
<img :key="nsfwImage" :src="nsfwImage"/>
|
<img :key="nsfwImage" :src="nsfwImage"/>
|
||||||
</a>
|
</a>
|
||||||
|
@ -8,10 +8,10 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<a v-if="type === 'image' && !hidden" class="image-attachment" :href="attachment.url" target="_blank">
|
<a v-if="type === 'image' && !hidden" class="image-attachment" :href="attachment.url" target="_blank">
|
||||||
<StillImage class="base03-border" referrerpolicy="no-referrer" :mimetype="attachment.mimetype" :src="attachment.large_thumb_url || attachment.url"/>
|
<StillImage referrerpolicy="no-referrer" :mimetype="attachment.mimetype" :src="attachment.large_thumb_url || attachment.url"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
<video class="base03" v-if="type === 'video' && !hidden" :src="attachment.url" controls loop></video>
|
<video v-if="type === 'video' && !hidden" :src="attachment.url" controls loop></video>
|
||||||
|
|
||||||
<audio v-if="type === 'audio'" :src="attachment.url" controls></audio>
|
<audio v-if="type === 'audio'" :src="attachment.url" controls></audio>
|
||||||
|
|
||||||
|
@ -30,7 +30,7 @@
|
||||||
<script src="./attachment.js"></script>
|
<script src="./attachment.js"></script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
.attachments {
|
.attachments {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
margin-right: -0.7em;
|
margin-right: -0.7em;
|
||||||
|
@ -45,6 +45,7 @@
|
||||||
flex: 1 0 30%;
|
flex: 1 0 30%;
|
||||||
margin: 0.5em 0.7em 0.6em 0.0em;
|
margin: 0.5em 0.7em 0.6em 0.0em;
|
||||||
align-self: flex-start;
|
align-self: flex-start;
|
||||||
|
border-color: var(--border);
|
||||||
|
|
||||||
border-style: solid;
|
border-style: solid;
|
||||||
border-width: 1px;
|
border-width: 1px;
|
||||||
|
@ -126,11 +127,6 @@
|
||||||
display: flex;
|
display: flex;
|
||||||
flex: 1;
|
flex: 1;
|
||||||
|
|
||||||
.still-image {
|
|
||||||
width: 100%;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
|
|
||||||
img {
|
img {
|
||||||
object-fit: contain;
|
object-fit: contain;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="chat-panel">
|
<div class="chat-panel">
|
||||||
<div class="panel panel-default base01-background">
|
<div class="panel panel-default">
|
||||||
<div class="panel-heading timeline-heading base02-background base04">
|
<div class="panel-heading timeline-heading">
|
||||||
<div class="title">
|
<div class="title">
|
||||||
{{$t('chat.title')}}
|
{{$t('chat.title')}}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="timeline panel panel-default">
|
<div class="timeline panel panel-default">
|
||||||
<div class="panel-heading base02-background base04 base03-border conversation-heading">
|
<div class="panel-heading conversation-heading">
|
||||||
{{ $t('timeline.conversation') }}
|
{{ $t('timeline.conversation') }}
|
||||||
<span v-if="collapsable" style="float:right;">
|
<span v-if="collapsable" style="float:right;">
|
||||||
<small><a href="#" @click.prevent="$emit('toggleExpanded')">Collapse</a></small>
|
<small><a href="#" @click.prevent="$emit('toggleExpanded')">Collapse</a></small>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<template>
|
<template>
|
||||||
<div v-if="canDelete">
|
<div v-if="canDelete">
|
||||||
<a href="#" v-on:click.prevent="deleteStatus()">
|
<a href="#" v-on:click.prevent="deleteStatus()">
|
||||||
<i class='base09 icon-cancel delete-status'></i>
|
<i class='icon-cancel delete-status'></i>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
@ -14,7 +14,8 @@
|
||||||
.icon-cancel,.delete-status {
|
.icon-cancel,.delete-status {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
&:hover {
|
&:hover {
|
||||||
color: $red;
|
color: $red_;
|
||||||
|
color: var(--red);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
<template>
|
<template>
|
||||||
<div v-if="loggedIn">
|
<div v-if="loggedIn">
|
||||||
<i :class='classes' class='favorite-button fav-active base09' @click.prevent='favorite()'/>
|
<i :class='classes' class='favorite-button fav-active' @click.prevent='favorite()'/>
|
||||||
<span v-if='status.fave_num > 0'>{{status.fave_num}}</span>
|
<span v-if='status.fave_num > 0'>{{status.fave_num}}</span>
|
||||||
</div>
|
</div>
|
||||||
<div v-else>
|
<div v-else>
|
||||||
<i :class='classes' class='favorite-button base09'/>
|
<i :class='classes' class='favorite-button'/>
|
||||||
<span v-if='status.fave_num > 0'>{{status.fave_num}}</span>
|
<span v-if='status.fave_num > 0'>{{status.fave_num}}</span>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
@ -17,10 +17,12 @@
|
||||||
animation-duration: 0.6s;
|
animation-duration: 0.6s;
|
||||||
&:hover {
|
&:hover {
|
||||||
color: orange;
|
color: orange;
|
||||||
|
color: var(--cOrange);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.favorite-button.icon-star {
|
.favorite-button.icon-star {
|
||||||
color: orange;
|
color: orange;
|
||||||
|
color: var(--cOrange);
|
||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="instance-specific-panel">
|
<div class="instance-specific-panel">
|
||||||
<div class="panel panel-default base01-background">
|
<div class="panel panel-default">
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
<div v-html="instanceSpecificPanelContent">
|
<div v-html="instanceSpecificPanelContent">
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="login panel panel-default base00-background">
|
<div class="login panel panel-default">
|
||||||
<!-- Default panel contents -->
|
<!-- Default panel contents -->
|
||||||
<div class="panel-heading base02-background base04">
|
<div class="panel-heading">
|
||||||
{{$t('login.login')}}
|
{{$t('login.login')}}
|
||||||
</div>
|
</div>
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
|
@ -17,11 +17,11 @@
|
||||||
<div class='form-group'>
|
<div class='form-group'>
|
||||||
<div class='login-bottom'>
|
<div class='login-bottom'>
|
||||||
<div><router-link :to="{name: 'registration'}" v-if='registrationOpen' class='register'>{{$t('login.register')}}</router-link></div>
|
<div><router-link :to="{name: 'registration'}" v-if='registrationOpen' class='register'>{{$t('login.register')}}</router-link></div>
|
||||||
<button :disabled="loggingIn" type='submit' class='btn btn-default base04 base02-background'>{{$t('login.login')}}</button>
|
<button :disabled="loggingIn" type='submit' class='btn btn-default'>{{$t('login.login')}}</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="authError" class='form-group'>
|
<div v-if="authError" class='form-group'>
|
||||||
<div class='error base05'>{{authError}}</div>
|
<div class='error'>{{authError}}</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
@ -34,9 +34,6 @@
|
||||||
|
|
||||||
.login-form {
|
.login-form {
|
||||||
input {
|
input {
|
||||||
border-width: 1px;
|
|
||||||
border-style: solid;
|
|
||||||
border-color: silver;
|
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
padding: 0.1em 0.2em 0.2em 0.2em;
|
padding: 0.1em 0.2em 0.2em 0.2em;
|
||||||
}
|
}
|
||||||
|
@ -50,6 +47,7 @@
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
background-color: rgba(255, 48, 16, 0.65);
|
background-color: rgba(255, 48, 16, 0.65);
|
||||||
|
background-color: var(--cRed);
|
||||||
min-height: 28px;
|
min-height: 28px;
|
||||||
line-height: 28px;
|
line-height: 28px;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="media-upload" @drop.prevent @dragover.prevent="fileDrag" @drop="fileDrop">
|
<div class="media-upload" @drop.prevent @dragover.prevent="fileDrag" @drop="fileDrop">
|
||||||
<label class="btn btn-default">
|
<label class="btn btn-default">
|
||||||
<i class="base09 icon-spin4 animate-spin" v-if="uploading"></i>
|
<i class="animate-spin" v-if="uploading"></i>
|
||||||
<i class="base09 icon-upload" v-if="!uploading"></i>
|
<i class="icon-upload" v-if="!uploading"></i>
|
||||||
<input type=file style="position: fixed; top: -100em"></input>
|
<input type=file style="position: fixed; top: -100em"></input>
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -1,24 +1,24 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="nav-panel">
|
<div class="nav-panel">
|
||||||
<div class="panel panel-default base01-background">
|
<div class="panel panel-default">
|
||||||
<ul class="base03-border">
|
<ul>
|
||||||
<li v-if='currentUser'>
|
<li v-if='currentUser'>
|
||||||
<router-link class="base00-background" to='/main/friends'>
|
<router-link to='/main/friends'>
|
||||||
{{ $t("nav.timeline") }}
|
{{ $t("nav.timeline") }}
|
||||||
</router-link>
|
</router-link>
|
||||||
</li>
|
</li>
|
||||||
<li v-if='currentUser'>
|
<li v-if='currentUser'>
|
||||||
<router-link class="base00-background" :to="{ name: 'mentions', params: { username: currentUser.screen_name } }">
|
<router-link :to="{ name: 'mentions', params: { username: currentUser.screen_name } }">
|
||||||
{{ $t("nav.mentions") }}
|
{{ $t("nav.mentions") }}
|
||||||
</router-link>
|
</router-link>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<router-link class="base00-background" to='/main/public'>
|
<router-link to='/main/public'>
|
||||||
{{ $t("nav.public_tl") }}
|
{{ $t("nav.public_tl") }}
|
||||||
</router-link>
|
</router-link>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<router-link class="base00-background" to='/main/all'>
|
<router-link to='/main/all'>
|
||||||
{{ $t("nav.twkn") }}
|
{{ $t("nav.twkn") }}
|
||||||
</router-link>
|
</router-link>
|
||||||
</li>
|
</li>
|
||||||
|
@ -30,15 +30,16 @@
|
||||||
<script src="./nav_panel.js" ></script>
|
<script src="./nav_panel.js" ></script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
.nav-panel ul {
|
.nav-panel ul {
|
||||||
list-style: none;
|
list-style: none;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-panel li {
|
.nav-panel li {
|
||||||
border-bottom: 1px solid;
|
border-bottom: 1px solid;
|
||||||
border-color: inherit;
|
border-color: var(--border);
|
||||||
|
background-color: var(--bg);
|
||||||
padding: 0;
|
padding: 0;
|
||||||
&:first-child a {
|
&:first-child a {
|
||||||
border-top-right-radius: 10px;
|
border-top-right-radius: 10px;
|
||||||
|
@ -48,21 +49,21 @@
|
||||||
border-bottom-right-radius: 10px;
|
border-bottom-right-radius: 10px;
|
||||||
border-bottom-left-radius: 10px;
|
border-bottom-left-radius: 10px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-panel li:last-child {
|
.nav-panel li:last-child {
|
||||||
border: none;
|
border: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.nav-panel a {
|
.nav-panel a {
|
||||||
display: block;
|
display: block;
|
||||||
padding: 0.8em 0.85em;
|
padding: 0.8em 0.85em;
|
||||||
&:hover {
|
&:hover {
|
||||||
background-color: transparent;
|
background-color: var(--lightBg);
|
||||||
}
|
}
|
||||||
&.router-link-active {
|
&.router-link-active {
|
||||||
font-weight: bolder;
|
font-weight: bolder;
|
||||||
background-color: transparent;
|
background-color: var(--lightBg);
|
||||||
&:hover {
|
&:hover {
|
||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,7 @@ const Notifications = {
|
||||||
},
|
},
|
||||||
hiderStyle () {
|
hiderStyle () {
|
||||||
return {
|
return {
|
||||||
background: `linear-gradient(to bottom, rgba(0, 0, 0, 0), ${this.$store.state.config.colors['base00']} 80%)`
|
background: `linear-gradient(to bottom, rgba(0, 0, 0, 0), ${this.$store.state.config.colors.bg} 80%)`
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -4,21 +4,33 @@
|
||||||
// a bit of a hack to allow scrolling below notifications
|
// a bit of a hack to allow scrolling below notifications
|
||||||
padding-bottom: 15em;
|
padding-bottom: 15em;
|
||||||
|
|
||||||
|
.panel {
|
||||||
|
background: var(--bg)
|
||||||
|
}
|
||||||
|
|
||||||
|
.panel-body {
|
||||||
|
border-color: var(--border)
|
||||||
|
}
|
||||||
|
|
||||||
.panel-heading {
|
.panel-heading {
|
||||||
// force the text to stay centered, while keeping
|
// force the text to stay centered, while keeping
|
||||||
// the button in the right side of the panel heading
|
// the button in the right side of the panel heading
|
||||||
position: relative;
|
position: relative;
|
||||||
|
background: var(--btn);
|
||||||
|
color: var(--faint);
|
||||||
.read-button {
|
.read-button {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
right: 0.7em;
|
right: 0.7em;
|
||||||
height: 1.8em;
|
height: 1.8em;
|
||||||
line-height: 100%;
|
line-height: 100%;
|
||||||
|
background-color: var(--btn);
|
||||||
|
color: var(--faint);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.unseen-count {
|
.unseen-count {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
background-color: rgba(255, 16, 8, 0.8);
|
background-color: var(--cRed);
|
||||||
text-shadow: 0px 0px 3px rgba(0, 0, 0, 0.5);
|
text-shadow: 0px 0px 3px rgba(0, 0, 0, 0.5);
|
||||||
min-width: 1.3em;
|
min-width: 1.3em;
|
||||||
border-radius: 1.3em;
|
border-radius: 1.3em;
|
||||||
|
@ -27,6 +39,7 @@
|
||||||
font-size: 0.9em;
|
font-size: 0.9em;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
line-height: 1.3em;
|
line-height: 1.3em;
|
||||||
|
padding: 1px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.notification {
|
.notification {
|
||||||
|
@ -48,19 +61,23 @@
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
|
||||||
.icon-retweet.lit {
|
.icon-retweet.lit {
|
||||||
color: $green;
|
color: $green_;
|
||||||
|
color: var(--cGreen);
|
||||||
}
|
}
|
||||||
|
|
||||||
.icon-user-plus.lit {
|
.icon-user-plus.lit {
|
||||||
color: $blue;
|
color: $blue_;
|
||||||
|
color: var(--cBlue);
|
||||||
}
|
}
|
||||||
|
|
||||||
.icon-reply.lit {
|
.icon-reply.lit {
|
||||||
color: $blue;
|
color: $blue_;
|
||||||
|
color: var(--cBlue);
|
||||||
}
|
}
|
||||||
|
|
||||||
.icon-star.lit {
|
.icon-star.lit {
|
||||||
color: orange;
|
color: orange;
|
||||||
|
color: var(--cOrange);
|
||||||
}
|
}
|
||||||
|
|
||||||
.status-content {
|
.status-content {
|
||||||
|
@ -134,7 +151,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.unseen {
|
.unseen {
|
||||||
border-left: 4px solid rgba(255, 16, 8, 0.75);
|
border-left: 4px solid var(--cRed);
|
||||||
padding-left: 6px;
|
padding-left: 6px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,12 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="notifications">
|
<div class="notifications">
|
||||||
<div class="panel panel-default base00-background">
|
<div class="panel panel-default">
|
||||||
<div class="panel-heading base02-background base04">
|
<div class="panel-heading">
|
||||||
<span class="unseen-count" v-if="unseenCount">{{unseenCount}}</span>
|
<span class="unseen-count" v-if="unseenCount">{{unseenCount}}</span>
|
||||||
{{$t('notifications.notifications')}}
|
{{$t('notifications.notifications')}}
|
||||||
<button v-if="unseenCount" @click.prevent="markAsSeen" class="base04 base02-background read-button">{{$t('notifications.read')}}</button>
|
<button v-if="unseenCount" @click.prevent="markAsSeen" class="read-button">{{$t('notifications.read')}}</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="panel-body base03-border">
|
<div class="panel-body">
|
||||||
<div v-for="notification in visibleNotifications" :key="notification" class="notification" :class='{"unseen": !notification.seen}'>
|
<div v-for="notification in visibleNotifications" :key="notification" class="notification" :class='{"unseen": !notification.seen}'>
|
||||||
<div>
|
<div>
|
||||||
<a :href="notification.action.user.statusnet_profile_url" target="_blank">
|
<a :href="notification.action.user.statusnet_profile_url" target="_blank">
|
||||||
|
|
|
@ -1,21 +1,21 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="post-status-form">
|
<div class="post-status-form">
|
||||||
<form @submit.prevent="postStatus(newStatus)">
|
<form @submit.prevent="postStatus(newStatus)">
|
||||||
<div class="form-group base03-border" >
|
<div class="form-group" >
|
||||||
<textarea @click="setCaret" @keyup="setCaret" v-model="newStatus.status" :placeholder="$t('post_status.default')" rows="1" class="form-control" @keydown.down="cycleForward" @keydown.up="cycleBackward" @keydown.shift.tab="cycleBackward" @keydown.tab="cycleForward" @keydown.enter="replaceCandidate" @keydown.meta.enter="postStatus(newStatus)" @keyup.ctrl.enter="postStatus(newStatus)" @drop="fileDrop" @dragover.prevent="fileDrag" @input="resize" @paste="paste"></textarea>
|
<textarea @click="setCaret" @keyup="setCaret" v-model="newStatus.status" :placeholder="$t('post_status.default')" rows="1" class="form-control" @keydown.down="cycleForward" @keydown.up="cycleBackward" @keydown.shift.tab="cycleBackward" @keydown.tab="cycleForward" @keydown.enter="replaceCandidate" @keydown.meta.enter="postStatus(newStatus)" @keyup.ctrl.enter="postStatus(newStatus)" @drop="fileDrop" @dragover.prevent="fileDrag" @input="resize" @paste="paste"></textarea>
|
||||||
</div>
|
</div>
|
||||||
<div style="position:relative;" v-if="candidates">
|
<div style="position:relative;" v-if="candidates">
|
||||||
<div class="autocomplete-panel base05-background">
|
<div class="autocomplete-panel">
|
||||||
<div v-for="candidate in candidates" @click="replace(candidate.utf || (candidate.screen_name + ' '))">
|
<div v-for="candidate in candidates" @click="replace(candidate.utf || (candidate.screen_name + ' '))">
|
||||||
<div v-if="candidate.highlighted" class="autocomplete base02">
|
<div v-if="candidate.highlighted" class="autocomplete">
|
||||||
<span v-if="candidate.img"><img :src="candidate.img"></span>
|
<span v-if="candidate.img"><img :src="candidate.img"></span>
|
||||||
<span v-else>{{candidate.utf}}</span>
|
<span v-else>{{candidate.utf}}</span>
|
||||||
<span>{{candidate.screen_name}}<small class="base02">{{candidate.name}}</small></span>
|
<span>{{candidate.screen_name}}<small>{{candidate.name}}</small></span>
|
||||||
</div>
|
</div>
|
||||||
<div v-else class="autocomplete base04">
|
<div v-else class="autocomplete">
|
||||||
<span v-if="candidate.img"><img :src="candidate.img"></img></span>
|
<span v-if="candidate.img"><img :src="candidate.img"></img></span>
|
||||||
<span v-else>{{candidate.utf}}</span>
|
<span v-else>{{candidate.utf}}</span>
|
||||||
<span>{{candidate.screen_name}}<small class="base02">{{candidate.name}}</small></span>
|
<span>{{candidate.screen_name}}<small>{{candidate.name}}</small></span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -24,18 +24,18 @@
|
||||||
<media-upload @uploading="disableSubmit" @uploaded="addMediaFile" @upload-failed="enableSubmit" :drop-files="dropFiles"></media-upload>
|
<media-upload @uploading="disableSubmit" @uploaded="addMediaFile" @upload-failed="enableSubmit" :drop-files="dropFiles"></media-upload>
|
||||||
|
|
||||||
<p v-if="isOverLengthLimit" class="error">{{ charactersLeft }}</p>
|
<p v-if="isOverLengthLimit" class="error">{{ charactersLeft }}</p>
|
||||||
<p v-else-if="hasStatusLengthLimit" class="base04">{{ charactersLeft }}</p>
|
<p v-else-if="hasStatusLengthLimit">{{ charactersLeft }}</p>
|
||||||
|
|
||||||
<button v-if="posting" disabled class="btn btn-default base05 base02-background">{{$t('post_status.posting')}}</button>
|
<button v-if="posting" disabled class="btn btn-default">{{$t('post_status.posting')}}</button>
|
||||||
<button v-else-if="isOverLengthLimit" disabled class="btn btn-default base05 base02-background">{{$t('general.submit')}}</button>
|
<button v-else-if="isOverLengthLimit" disabled class="btn btn-default">{{$t('general.submit')}}</button>
|
||||||
<button v-else :disabled="submitDisabled" type="submit" class="btn btn-default base05 base02-background">{{$t('general.submit')}}</button>
|
<button v-else :disabled="submitDisabled" type="submit" class="btn btn-default">{{$t('general.submit')}}</button>
|
||||||
</div>
|
</div>
|
||||||
<div class='error' v-if="error">
|
<div class='error' v-if="error">
|
||||||
Error: {{ error }}
|
Error: {{ error }}
|
||||||
<i class="icon-cancel" @click="clearError"></i>
|
<i class="icon-cancel" @click="clearError"></i>
|
||||||
</div>
|
</div>
|
||||||
<div class="attachments">
|
<div class="attachments">
|
||||||
<div class="media-upload-container attachment base03-border" v-for="file in newStatus.files">
|
<div class="media-upload-container attachment" v-for="file in newStatus.files">
|
||||||
<i class="fa icon-cancel" @click="removeMediaFile(file)"></i>
|
<i class="fa icon-cancel" @click="removeMediaFile(file)"></i>
|
||||||
<img class="thumbnail media-upload" :src="file.image" v-if="type(file) === 'image'"></img>
|
<img class="thumbnail media-upload" :src="file.image" v-if="type(file) === 'image'"></img>
|
||||||
<video v-if="type(file) === 'video'" :src="file.image" controls></video>
|
<video v-if="type(file) === 'video'" :src="file.image" controls></video>
|
||||||
|
@ -51,7 +51,7 @@
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
|
|
||||||
.tribute-container {
|
.tribute-container {
|
||||||
ul {
|
ul {
|
||||||
padding: 0px;
|
padding: 0px;
|
||||||
li {
|
li {
|
||||||
|
@ -65,9 +65,9 @@
|
||||||
height: 16px;
|
height: 16px;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.post-status-form, .login {
|
.post-status-form, .login {
|
||||||
.form-bottom {
|
.form-bottom {
|
||||||
display: flex;
|
display: flex;
|
||||||
padding: 0.5em;
|
padding: 0.5em;
|
||||||
|
@ -87,6 +87,7 @@
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
background-color: rgba(255, 48, 16, 0.65);
|
background-color: rgba(255, 48, 16, 0.65);
|
||||||
|
background-color: var(--cRed);
|
||||||
padding: 0.25em;
|
padding: 0.25em;
|
||||||
margin: 0.35em;
|
margin: 0.35em;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
@ -97,6 +98,7 @@
|
||||||
|
|
||||||
.attachment {
|
.attachment {
|
||||||
position: relative;
|
position: relative;
|
||||||
|
border: var(--border);
|
||||||
margin: 0.5em 0.8em 0.2em 0;
|
margin: 0.5em 0.8em 0.2em 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -122,6 +124,7 @@
|
||||||
.icon-cancel {
|
.icon-cancel {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
form {
|
form {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
|
@ -136,9 +139,6 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
form textarea {
|
form textarea {
|
||||||
border: solid;
|
|
||||||
border-width: 1px;
|
|
||||||
border-color: inherit;
|
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
line-height:16px;
|
line-height:16px;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
|
@ -170,6 +170,8 @@
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.5);
|
box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.5);
|
||||||
min-width: 75%;
|
min-width: 75%;
|
||||||
|
background: var(--btn);
|
||||||
|
color: var(--lightFg);
|
||||||
}
|
}
|
||||||
|
|
||||||
.autocomplete {
|
.autocomplete {
|
||||||
|
@ -188,9 +190,10 @@
|
||||||
margin: 0 0.1em 0 0.2em;
|
margin: 0 0.1em 0 0.2em;
|
||||||
}
|
}
|
||||||
small {
|
small {
|
||||||
font-style: italic;
|
margin-left: .5em;
|
||||||
}
|
color: var(--faint);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="settings panel panel-default base00-background">
|
<div class="settings panel panel-default">
|
||||||
<div class="panel-heading base02-background base04">
|
<div class="panel-heading">
|
||||||
{{$t('registration.registration')}}
|
{{$t('registration.registration')}}
|
||||||
</div>
|
</div>
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
|
@ -39,14 +39,14 @@
|
||||||
</div>
|
</div>
|
||||||
-->
|
-->
|
||||||
<div class='form-group'>
|
<div class='form-group'>
|
||||||
<button :disabled="registering" type='submit' class='btn btn-default base05 base02-background'>{{$t('general.submit')}}</button>
|
<button :disabled="registering" type='submit' class='btn btn-default'>{{$t('general.submit')}}</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class='terms-of-service' v-html="termsofservice">
|
<div class='terms-of-service' v-html="termsofservice">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="error" class='form-group'>
|
<div v-if="error" class='form-group'>
|
||||||
<div class='error base05'>{{error}}</div>
|
<div class='error'>{{error}}</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
@ -97,9 +97,6 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
input {
|
input {
|
||||||
border-width: 1px;
|
|
||||||
border-style: solid;
|
|
||||||
border-color: silver;
|
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
padding: 0.1em 0.2em 0.2em 0.2em;
|
padding: 0.1em 0.2em 0.2em 0.2em;
|
||||||
}
|
}
|
||||||
|
@ -121,6 +118,7 @@
|
||||||
text-align: center;
|
text-align: center;
|
||||||
margin: 0.5em 0.6em 0;
|
margin: 0.5em 0.6em 0;
|
||||||
background-color: rgba(255, 48, 16, 0.65);
|
background-color: rgba(255, 48, 16, 0.65);
|
||||||
|
background-color: var(--cRed);
|
||||||
min-height: 28px;
|
min-height: 28px;
|
||||||
line-height: 28px;
|
line-height: 28px;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
<template>
|
<template>
|
||||||
<div v-if="loggedIn">
|
<div v-if="loggedIn">
|
||||||
<i :class='classes' class='icon-retweet rt-active base09' v-on:click.prevent='retweet()'></i>
|
<i :class='classes' class='icon-retweet rt-active' v-on:click.prevent='retweet()'></i>
|
||||||
<span v-if='status.repeat_num > 0'>{{status.repeat_num}}</span>
|
<span v-if='status.repeat_num > 0'>{{status.repeat_num}}</span>
|
||||||
</div>
|
</div>
|
||||||
<div v-else>
|
<div v-else>
|
||||||
<i :class='classes' class='icon-retweet base09'></i>
|
<i :class='classes' class='icon-retweet'></i>
|
||||||
<span v-if='status.repeat_num > 0'>{{status.repeat_num}}</span>
|
<span v-if='status.repeat_num > 0'>{{status.repeat_num}}</span>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
@ -17,10 +17,12 @@
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
animation-duration: 0.6s;
|
animation-duration: 0.6s;
|
||||||
&:hover {
|
&:hover {
|
||||||
color: $green;
|
color: $green_;
|
||||||
|
color: var(--cGreen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.icon-retweet.retweeted {
|
.icon-retweet.retweeted {
|
||||||
color: $green;
|
color: $green_;
|
||||||
|
color: var(--cGreen);
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="settings panel panel-default base00-background">
|
<div class="settings panel panel-default">
|
||||||
<div class="panel-heading base02-background base04">
|
<div class="panel-heading">
|
||||||
{{$t('settings.settings')}}
|
{{$t('settings.settings')}}
|
||||||
</div>
|
</div>
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
|
|
|
@ -55,11 +55,6 @@ const Status = {
|
||||||
},
|
},
|
||||||
muted () { return !this.unmuted && (this.status.user.muted || this.muteWordHits.length > 0) },
|
muted () { return !this.unmuted && (this.status.user.muted || this.muteWordHits.length > 0) },
|
||||||
isReply () { return !!this.status.in_reply_to_status_id },
|
isReply () { return !!this.status.in_reply_to_status_id },
|
||||||
borderColor () {
|
|
||||||
return {
|
|
||||||
borderBottomColor: this.$store.state.config.colors['base02']
|
|
||||||
}
|
|
||||||
},
|
|
||||||
isFocused () {
|
isFocused () {
|
||||||
// retweet or root of an expanded conversation
|
// retweet or root of an expanded conversation
|
||||||
if (this.focused) {
|
if (this.focused) {
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="status-el base00-background" v-if="compact">
|
<div class="status-el" v-if="compact">
|
||||||
<div @click.prevent="linkClicked" class="status-content" v-html="status.statusnet_html"></div>
|
<div @click.prevent="linkClicked" class="status-content" v-html="status.statusnet_html"></div>
|
||||||
<div v-if="loggedIn">
|
<div v-if="loggedIn">
|
||||||
<div class='status-actions'>
|
<div class='status-actions'>
|
||||||
<div>
|
<div>
|
||||||
<a href="#" v-on:click.prevent="toggleReplying">
|
<a href="#" v-on:click.prevent="toggleReplying">
|
||||||
<i class="base09 icon-reply" :class="{'icon-reply-active': replying}"></i>
|
<i class="icon-reply" :class="{'icon-reply-active': replying}"></i>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<retweet-button :loggedIn="loggedIn" :status=status></retweet-button>
|
<retweet-button :loggedIn="loggedIn" :status=status></retweet-button>
|
||||||
|
@ -14,12 +14,12 @@
|
||||||
</div>
|
</div>
|
||||||
<post-status-form class="reply-body" :reply-to="status.id" :attentions="status.attentions" :repliedUser="status.user" v-on:posted="toggleReplying" v-if="replying"/>
|
<post-status-form class="reply-body" :reply-to="status.id" :attentions="status.attentions" :repliedUser="status.user" v-on:posted="toggleReplying" v-if="replying"/>
|
||||||
</div>
|
</div>
|
||||||
<div class="status-el base00-background base03-border status-fadein" v-else-if="!status.deleted" v-bind:class="[{ 'base01-background': isFocused }, { 'status-conversation': inConversation }]" >
|
<div class="status-el status-fadein" v-else-if="!status.deleted" v-bind:class="[{ 'status-el_focused': isFocused }, { 'status-conversation': inConversation }]" >
|
||||||
<template v-if="muted">
|
<template v-if="muted">
|
||||||
<div class="media status container muted">
|
<div class="media status container muted">
|
||||||
<small><router-link :to="{ name: 'user-profile', params: { id: status.user.id } }">{{status.user.screen_name}}</router-link></small>
|
<small><router-link :to="{ name: 'user-profile', params: { id: status.user.id } }">{{status.user.screen_name}}</router-link></small>
|
||||||
<small class="muteWords">{{muteWordHits.join(', ')}}</small>
|
<small class="muteWords">{{muteWordHits.join(', ')}}</small>
|
||||||
<a href="#" class="unmute" @click.prevent="toggleMute"><i class="base09 icon-eye-off"></i></a>
|
<a href="#" class="unmute" @click.prevent="toggleMute"><i class="icon-eye-off"></i></a>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<template v-if="!muted">
|
<template v-if="!muted">
|
||||||
|
@ -39,7 +39,7 @@
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="media-body">
|
<div class="media-body">
|
||||||
<div class="base03-border usercard" v-if="userExpanded">
|
<div class="usercard" v-if="userExpanded">
|
||||||
<user-card-content :user="status.user" :switcher="false"></user-card-content>
|
<user-card-content :user="status.user" :switcher="false"></user-card-content>
|
||||||
</div>
|
</div>
|
||||||
<div class="user-content">
|
<div class="user-content">
|
||||||
|
@ -75,15 +75,15 @@
|
||||||
</h4>
|
</h4>
|
||||||
</div>
|
</div>
|
||||||
<div class="heading-icons">
|
<div class="heading-icons">
|
||||||
<a href="#" @click.prevent="toggleMute" v-if="unmuted"><i class="base09 icon-eye-off"></i></a>
|
<a href="#" @click.prevent="toggleMute" v-if="unmuted"><i class="icon-eye-off"></i></a>
|
||||||
<a :href="status.external_url" target="_blank" v-if="!status.is_local" class="source_url"><i class="base09 icon-binoculars"></i></a>
|
<a :href="status.external_url" target="_blank" v-if="!status.is_local" class="source_url"><i class="icon-binoculars"></i></a>
|
||||||
<template v-if="expandable">
|
<template v-if="expandable">
|
||||||
<a href="#" @click.prevent="toggleExpanded" class="expand"><i class="base09 icon-plus-squared"></i></a>
|
<a href="#" @click.prevent="toggleExpanded" class="expand"><i class="icon-plus-squared"></i></a>
|
||||||
</template>
|
</template>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="status-preview base00-background base03-border" v-if="showPreview && preview">
|
<div class="status-preview" v-if="showPreview && preview">
|
||||||
<StillImage class="avatar" :src="preview.user.profile_image_url_original"/>
|
<StillImage class="avatar" :src="preview.user.profile_image_url_original"/>
|
||||||
<div class="text">
|
<div class="text">
|
||||||
<h4>
|
<h4>
|
||||||
|
@ -93,8 +93,8 @@
|
||||||
<div @click.prevent="linkClicked" class="status-content" v-html="preview.statusnet_html"></div>
|
<div @click.prevent="linkClicked" class="status-content" v-html="preview.statusnet_html"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="status-preview status-preview-loading base00-background base03-border" v-else-if="showPreview">
|
<div class="status-preview status-preview-loading" v-else-if="showPreview">
|
||||||
<i class="base09 icon-spin4 animate-spin"></i>
|
<i class="icon-spin4 animate-spin"></i>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div @click.prevent="linkClicked" class="status-content" v-html="status.statusnet_html"></div>
|
<div @click.prevent="linkClicked" class="status-content" v-html="status.statusnet_html"></div>
|
||||||
|
@ -108,7 +108,7 @@
|
||||||
<div class='status-actions'>
|
<div class='status-actions'>
|
||||||
<div v-if="loggedIn">
|
<div v-if="loggedIn">
|
||||||
<a href="#" v-on:click.prevent="toggleReplying">
|
<a href="#" v-on:click.prevent="toggleReplying">
|
||||||
<i class="base09 icon-reply" :class="{'icon-reply-active': replying}"></i>
|
<i class="icon-reply" :class="{'icon-reply-active': replying}"></i>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<retweet-button :loggedIn="loggedIn" :status=status></retweet-button>
|
<retweet-button :loggedIn="loggedIn" :status=status></retweet-button>
|
||||||
|
@ -117,7 +117,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="status base00-background container" v-if="replying">
|
<div class="status container" v-if="replying">
|
||||||
<div class="reply-left"/>
|
<div class="reply-left"/>
|
||||||
<post-status-form class="reply-body" :reply-to="status.id" :attentions="status.attentions" :repliedUser="status.user" v-on:posted="toggleReplying"/>
|
<post-status-form class="reply-body" :reply-to="status.id" :attentions="status.attentions" :repliedUser="status.user" v-on:posted="toggleReplying"/>
|
||||||
</div>
|
</div>
|
||||||
|
@ -128,18 +128,19 @@
|
||||||
<script src="./status.js" ></script>
|
<script src="./status.js" ></script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
@import '../../_variables.scss';
|
@import '../../_variables.scss';
|
||||||
|
|
||||||
status-text-container {
|
status-text-container {
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
||||||
.status-preview {
|
.status-preview {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
max-width: 34em;
|
max-width: 34em;
|
||||||
padding: 0.5em;
|
padding: 0.5em;
|
||||||
display: flex;
|
display: flex;
|
||||||
border-color: inherit;
|
background-color: var(--bg);
|
||||||
|
border-color: var(--border);
|
||||||
border-style: solid;
|
border-style: solid;
|
||||||
border-width: 1px;
|
border-width: 1px;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
|
@ -154,6 +155,7 @@
|
||||||
height: 32px;
|
height: 32px;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.text {
|
.text {
|
||||||
h4 {
|
h4 {
|
||||||
margin-bottom: 0.4em;
|
margin-bottom: 0.4em;
|
||||||
|
@ -163,22 +165,32 @@
|
||||||
}
|
}
|
||||||
padding: 0 0.5em 0.5em 0.5em;
|
padding: 0 0.5em 0.5em 0.5em;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.status-preview-loading {
|
.status-preview-loading {
|
||||||
display: block;
|
display: block;
|
||||||
font-size: 2em;
|
font-size: 2em;
|
||||||
min-width: 8em;
|
min-width: 8em;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.status-el {
|
.status-el {
|
||||||
hyphens: auto;
|
hyphens: auto;
|
||||||
overflow-wrap: break-word;
|
overflow-wrap: break-word;
|
||||||
word-wrap: break-word;
|
word-wrap: break-word;
|
||||||
word-break: break-word;
|
word-break: break-word;
|
||||||
border-left-width: 0px;
|
border-left-width: 0px;
|
||||||
line-height: 18px;
|
line-height: 18px;
|
||||||
|
background-color: var(--bg);
|
||||||
|
border-color: var(--border);
|
||||||
|
|
||||||
|
&_focused {
|
||||||
|
background-color: var(--lightBg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.usercard {
|
||||||
|
border-color: var(--border);
|
||||||
|
}
|
||||||
|
|
||||||
.timeline & {
|
.timeline & {
|
||||||
border-bottom-width: 1px;
|
border-bottom-width: 1px;
|
||||||
|
@ -267,6 +279,7 @@
|
||||||
margin: 0.2em 0.3em 0 0;
|
margin: 0.2em 0.3em 0 0;
|
||||||
.avatar {
|
.avatar {
|
||||||
float: right;
|
float: right;
|
||||||
|
border-radius: 5px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -284,31 +297,33 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
.status-fadein {
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.status-fadein {
|
||||||
animation-duration: 0.5s;
|
animation-duration: 0.5s;
|
||||||
animation-name: fadein;
|
animation-name: fadein;
|
||||||
}
|
}
|
||||||
|
|
||||||
@keyframes fadein {
|
@keyframes fadein {
|
||||||
from {
|
from {
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
}
|
}
|
||||||
to {
|
to {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.greentext {
|
.greentext {
|
||||||
color: green;
|
color: green;
|
||||||
}
|
}
|
||||||
|
|
||||||
.status-conversation {
|
.status-conversation {
|
||||||
border-left-style: solid;
|
border-left-style: solid;
|
||||||
}
|
}
|
||||||
|
|
||||||
.status-actions {
|
.status-actions {
|
||||||
padding-top: 0.15em;
|
padding-top: 0.15em;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
display: flex;
|
display: flex;
|
||||||
|
@ -317,14 +332,16 @@
|
||||||
max-width: 6em;
|
max-width: 6em;
|
||||||
flex: 1;
|
flex: 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.icon-reply:hover {
|
.icon-reply:hover {
|
||||||
color: $blue;
|
color: $blue_;
|
||||||
|
color: var(--cBlue);
|
||||||
}
|
}
|
||||||
|
|
||||||
.icon-reply.icon-reply-active {
|
.icon-reply.icon-reply-active {
|
||||||
color: $blue;
|
color: $blue_;
|
||||||
|
color: var(--cBlue);
|
||||||
}
|
}
|
||||||
|
|
||||||
.status .avatar {
|
.status .avatar {
|
||||||
|
@ -373,7 +390,7 @@
|
||||||
|
|
||||||
.status {
|
.status {
|
||||||
padding: 0.4em 0.7em 0.45em 0.7em;
|
padding: 0.4em 0.7em 0.45em 0.7em;
|
||||||
border-left: 4px rgba(255, 48, 16, 0.65);
|
border-left: 4px var(--cRed);
|
||||||
border-left-style: inherit;
|
border-left-style: inherit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,10 +21,10 @@ export default {
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
mounted () {
|
mounted () {
|
||||||
this.bgColorLocal = rgbstr2hex(this.$store.state.config.colors['base00'])
|
this.bgColorLocal = rgbstr2hex(this.$store.state.config.colors.bg)
|
||||||
this.fgColorLocal = rgbstr2hex(this.$store.state.config.colors['base02'])
|
this.fgColorLocal = rgbstr2hex(this.$store.state.config.colors.lightBg)
|
||||||
this.textColorLocal = rgbstr2hex(this.$store.state.config.colors['base05'])
|
this.textColorLocal = rgbstr2hex(this.$store.state.config.colors.fg)
|
||||||
this.linkColorLocal = rgbstr2hex(this.$store.state.config.colors['base08'])
|
this.linkColorLocal = rgbstr2hex(this.$store.state.config.colors.link)
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
setCustomTheme () {
|
setCustomTheme () {
|
||||||
|
|
|
@ -7,22 +7,22 @@
|
||||||
<p>{{$t('settings.theme_help')}}</p>
|
<p>{{$t('settings.theme_help')}}</p>
|
||||||
<div class="color-container">
|
<div class="color-container">
|
||||||
<div class="color-item">
|
<div class="color-item">
|
||||||
<label for="bgcolor" class="base04 theme-color-lb">{{$t('settings.background')}}</label>
|
<label for="bgcolor" class="theme-color-lb">{{$t('settings.background')}}</label>
|
||||||
<input id="bgcolor" class="theme-color-cl" type="color" v-model="bgColorLocal">
|
<input id="bgcolor" class="theme-color-cl" type="color" v-model="bgColorLocal">
|
||||||
<input id="bgcolor-t" class="theme-color-in" type="text" v-model="bgColorLocal">
|
<input id="bgcolor-t" class="theme-color-in" type="text" v-model="bgColorLocal">
|
||||||
</div>
|
</div>
|
||||||
<div class="color-item">
|
<div class="color-item">
|
||||||
<label for="fgcolor" class="base04 theme-color-lb">{{$t('settings.foreground')}}</label>
|
<label for="fgcolor" class="theme-color-lb">{{$t('settings.foreground')}}</label>
|
||||||
<input id="fgcolor" class="theme-color-cl" type="color" v-model="fgColorLocal">
|
<input id="fgcolor" class="theme-color-cl" type="color" v-model="fgColorLocal">
|
||||||
<input id="fgcolor-t" class="theme-color-in" type="text" v-model="fgColorLocal">
|
<input id="fgcolor-t" class="theme-color-in" type="text" v-model="fgColorLocal">
|
||||||
</div>
|
</div>
|
||||||
<div class="color-item">
|
<div class="color-item">
|
||||||
<label for="textcolor" class="base04 theme-color-lb">{{$t('settings.text')}}</label>
|
<label for="textcolor" class="theme-color-lb">{{$t('settings.text')}}</label>
|
||||||
<input id="textcolor" class="theme-color-cl" type="color" v-model="textColorLocal">
|
<input id="textcolor" class="theme-color-cl" type="color" v-model="textColorLocal">
|
||||||
<input id="textcolor-t" class="theme-color-in" type="text" v-model="textColorLocal">
|
<input id="textcolor-t" class="theme-color-in" type="text" v-model="textColorLocal">
|
||||||
</div>
|
</div>
|
||||||
<div class="color-item">
|
<div class="color-item">
|
||||||
<label for="linkcolor" class="base04 theme-color-lb">{{$t('settings.links')}}</label>
|
<label for="linkcolor" class="theme-color-lb">{{$t('settings.links')}}</label>
|
||||||
<input id="linkcolor" class="theme-color-cl" type="color" v-model="linkColorLocal">
|
<input id="linkcolor" class="theme-color-cl" type="color" v-model="linkColorLocal">
|
||||||
<input id="linkcolor-t" class="theme-color-in" type="text" v-model="linkColorLocal">
|
<input id="linkcolor-t" class="theme-color-in" type="text" v-model="linkColorLocal">
|
||||||
</div>
|
</div>
|
||||||
|
@ -40,7 +40,7 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<button class="btn base02-background base04" @click="setCustomTheme">{{$t('general.apply')}}</button>
|
<button class="btn" @click="setCustomTheme">{{$t('general.apply')}}</button>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -63,6 +63,10 @@
|
||||||
flex: 1 1 0;
|
flex: 1 1 0;
|
||||||
align-items: baseline;
|
align-items: baseline;
|
||||||
margin: 5px 6px 5px 0;
|
margin: 5px 6px 5px 0;
|
||||||
|
|
||||||
|
label {
|
||||||
|
color: var(--faint);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.theme-color-cl,
|
.theme-color-cl,
|
||||||
.theme-color-in {
|
.theme-color-in {
|
||||||
|
|
|
@ -1,48 +1,48 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="timeline panel panel-default" v-if="viewing == 'statuses'">
|
<div class="timeline panel panel-default" v-if="viewing == 'statuses'">
|
||||||
<div class="panel-heading timeline-heading base02-background base04">
|
<div class="panel-heading timeline-heading">
|
||||||
<div class="title">
|
<div class="title">
|
||||||
{{title}}
|
{{title}}
|
||||||
</div>
|
</div>
|
||||||
<button @click.prevent="showNewStatuses" class="base05 base02-background loadmore-button" v-if="timeline.newStatusCount > 0 && !timelineError">
|
<button @click.prevent="showNewStatuses" class="loadmore-button" v-if="timeline.newStatusCount > 0 && !timelineError">
|
||||||
{{$t('timeline.show_new')}}{{newStatusCountStr}}
|
{{$t('timeline.show_new')}}{{newStatusCountStr}}
|
||||||
</button>
|
</button>
|
||||||
<div @click.prevent class="base06 error loadmore-text" v-if="timelineError">
|
<div @click.prevent class="loadmore-text" v-if="timelineError">
|
||||||
{{$t('timeline.error_fetching')}}
|
{{$t('timeline.error_fetching')}}
|
||||||
</div>
|
</div>
|
||||||
<div @click.prevent class="base04 base02-background loadmore-text" v-if="!timeline.newStatusCount > 0 && !timelineError">
|
<div @click.prevent class="loadmore-text" v-if="!timeline.newStatusCount > 0 && !timelineError">
|
||||||
{{$t('timeline.up_to_date')}}
|
{{$t('timeline.up_to_date')}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="panel-body base01-background">
|
<div class="panel-body">
|
||||||
<div class="timeline">
|
<div class="timeline">
|
||||||
<status-or-conversation v-for="status in timeline.visibleStatuses" :key="status.id" v-bind:statusoid="status"></status-or-conversation>
|
<status-or-conversation v-for="status in timeline.visibleStatuses" :key="status.id" v-bind:statusoid="status"></status-or-conversation>
|
||||||
<a href="#" v-on:click.prevent='fetchOlderStatuses()' v-if="!timeline.loading">
|
<a href="#" v-on:click.prevent='fetchOlderStatuses()' v-if="!timeline.loading">
|
||||||
<div class="base02-background base03-border new-status-notification text-center">{{$t('timeline.load_older')}}</div>
|
<div class="new-status-notification text-center">{{$t('timeline.load_older')}}</div>
|
||||||
</a>
|
</a>
|
||||||
<div class="base02-background base03-border new-status-notification text-center" v-else>...</div>
|
<div class="new-status-notification text-center" v-else>...</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="timeline panel panel-default" v-else-if="viewing == 'followers'">
|
<div class="timeline panel panel-default" v-else-if="viewing == 'followers'">
|
||||||
<div class="panel-heading timeline-heading base02-background base04">
|
<div class="panel-heading timeline-heading">
|
||||||
<div class="title">
|
<div class="title">
|
||||||
{{$t('user_card.followers')}}
|
{{$t('user_card.followers')}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="panel-body base01-background">
|
<div class="panel-body">
|
||||||
<div class="timeline">
|
<div class="timeline">
|
||||||
<user-card v-for="follower in followers" :key="follower.id" :user="follower" :showFollows="false"></user-card>
|
<user-card v-for="follower in followers" :key="follower.id" :user="follower" :showFollows="false"></user-card>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="timeline panel panel-default" v-else-if="viewing == 'friends'">
|
<div class="timeline panel panel-default" v-else-if="viewing == 'friends'">
|
||||||
<div class="panel-heading timeline-heading base02-background base04">
|
<div class="panel-heading timeline-heading">
|
||||||
<div class="title">
|
<div class="title">
|
||||||
{{$t('user_card.followees')}}
|
{{$t('user_card.followees')}}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="panel-body base01-background">
|
<div class="panel-body">
|
||||||
<div class="timeline">
|
<div class="timeline">
|
||||||
<user-card v-for="friend in friends" :key="friend.id" :user="friend" :showFollows="true"></user-card>
|
<user-card v-for="friend in friends" :key="friend.id" :user="friend" :showFollows="true"></user-card>
|
||||||
</div>
|
</div>
|
||||||
|
@ -79,13 +79,16 @@
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
min-width: 6em;
|
min-width: 6em;
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
|
background-color: transparent;
|
||||||
|
color: var(--faint);
|
||||||
font-family: sans-serif;
|
font-family: sans-serif;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
padding: 0 0.5em 0 0.5em;
|
padding: 0 0.5em 0 0.5em;
|
||||||
opacity: 0.8;
|
opacity: 0.8;
|
||||||
}
|
}
|
||||||
.error {
|
.error {
|
||||||
background-color: rgba(255, 48, 16, 0.65);
|
color: var(--lightFg);
|
||||||
|
background-color: var(--cRed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -96,6 +99,7 @@
|
||||||
border-width: 1px 0 0 0;
|
border-width: 1px 0 0 0;
|
||||||
border-style: solid;
|
border-style: solid;
|
||||||
border-radius: 0 0 10px 10px;
|
border-radius: 0 0 10px 10px;
|
||||||
|
border-color: var(--border);
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="card base00-background">
|
<div class="card">
|
||||||
<a href="#">
|
<a href="#">
|
||||||
<img @click.prevent="toggleUserExpanded" class="avatar" :src="user.profile_image_url">
|
<img @click.prevent="toggleUserExpanded" class="avatar" :src="user.profile_image_url">
|
||||||
</a>
|
</a>
|
||||||
|
@ -21,24 +21,24 @@
|
||||||
<script src="./user_card.js"></script>
|
<script src="./user_card.js"></script>
|
||||||
|
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
.name-and-screen-name {
|
.name-and-screen-name {
|
||||||
margin-left: 0.7em;
|
margin-left: 0.7em;
|
||||||
margin-top:0.0em;
|
margin-top:0.0em;
|
||||||
margin-right: 2em;
|
margin-right: 2em;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.follows-you {
|
.follows-you {
|
||||||
margin-left: 2em;
|
margin-left: 2em;
|
||||||
float: right;
|
float: right;
|
||||||
}
|
}
|
||||||
|
|
||||||
.follows {
|
.follows {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.card {
|
.card {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex: 1 0;
|
flex: 1 0;
|
||||||
padding-top: 0.6em;
|
padding-top: 0.6em;
|
||||||
|
@ -47,8 +47,7 @@
|
||||||
padding-left: 1em;
|
padding-left: 1em;
|
||||||
border-bottom: 1px solid;
|
border-bottom: 1px solid;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
border-bottom-color: inherit;
|
border-bottom-color: var(--border);
|
||||||
|
|
||||||
|
|
||||||
.avatar {
|
.avatar {
|
||||||
margin-top: 0.2em;
|
margin-top: 0.2em;
|
||||||
|
@ -56,9 +55,9 @@
|
||||||
height: 32px;
|
height: 32px;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.usercard {
|
.usercard {
|
||||||
width: fill-available;
|
width: fill-available;
|
||||||
margin: 0.2em 0 0.7em 0;
|
margin: 0.2em 0 0.7em 0;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
|
@ -67,6 +66,9 @@
|
||||||
border-width: 1px;
|
border-width: 1px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
|
||||||
|
.panel-heading {
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
p {
|
p {
|
||||||
margin-bottom: 0;
|
margin-bottom: 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@ export default {
|
||||||
props: [ 'user', 'switcher' ],
|
props: [ 'user', 'switcher' ],
|
||||||
computed: {
|
computed: {
|
||||||
headingStyle () {
|
headingStyle () {
|
||||||
const color = this.$store.state.config.colors['base00']
|
const color = this.$store.state.config.colors.bg
|
||||||
if (color) {
|
if (color) {
|
||||||
const rgb = hex2rgb(color)
|
const rgb = hex2rgb(color)
|
||||||
console.log(rgb)
|
console.log(rgb)
|
||||||
|
@ -17,7 +17,7 @@ export default {
|
||||||
},
|
},
|
||||||
bodyStyle () {
|
bodyStyle () {
|
||||||
return {
|
return {
|
||||||
background: `linear-gradient(to bottom, rgba(0, 0, 0, 0), ${this.$store.state.config.colors['base00']} 80%)`
|
background: `linear-gradient(to bottom, rgba(0, 0, 0, 0), ${this.$store.state.config.colors.bg} 80%)`
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
isOtherUser () {
|
isOtherUser () {
|
||||||
|
|
|
@ -18,30 +18,30 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="isOtherUser" class="user-interactions">
|
<div v-if="isOtherUser" class="user-interactions">
|
||||||
<div v-if="user.follows_you && loggedIn" class="following base06">
|
<div v-if="user.follows_you && loggedIn" class="following">
|
||||||
{{ $t('user_card.follows_you') }}
|
{{ $t('user_card.follows_you') }}
|
||||||
</div>
|
</div>
|
||||||
<div class="follow" v-if="loggedIn">
|
<div class="follow" v-if="loggedIn">
|
||||||
<span v-if="user.following">
|
<span v-if="user.following">
|
||||||
<!--Following them!-->
|
<!--Following them!-->
|
||||||
<button @click="unfollowUser" class="base04 base00-background pressed">
|
<button @click="unfollowUser" class="pressed">
|
||||||
{{ $t('user_card.following') }}
|
{{ $t('user_card.following') }}
|
||||||
</button>
|
</button>
|
||||||
</span>
|
</span>
|
||||||
<span v-if="!user.following">
|
<span v-if="!user.following">
|
||||||
<button @click="followUser" class="base05 base02-background">
|
<button @click="followUser">
|
||||||
{{ $t('user_card.follow') }}
|
{{ $t('user_card.follow') }}
|
||||||
</button>
|
</button>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div class='mute' v-if='isOtherUser'>
|
<div class='mute' v-if='isOtherUser'>
|
||||||
<span v-if='user.muted'>
|
<span v-if='user.muted'>
|
||||||
<button @click="toggleMute" class="base04 base00-background pressed">
|
<button @click="toggleMute" class="pressed">
|
||||||
{{ $t('user_card.muted') }}
|
{{ $t('user_card.muted') }}
|
||||||
</button>
|
</button>
|
||||||
</span>
|
</span>
|
||||||
<span v-if='!user.muted'>
|
<span v-if='!user.muted'>
|
||||||
<button @click="toggleMute" class="base05 base02-background">
|
<button @click="toggleMute">
|
||||||
{{ $t('user_card.mute') }}
|
{{ $t('user_card.mute') }}
|
||||||
</button>
|
</button>
|
||||||
</span>
|
</span>
|
||||||
|
@ -50,19 +50,19 @@
|
||||||
<form method="POST" :action='subscribeUrl'>
|
<form method="POST" :action='subscribeUrl'>
|
||||||
<input type="hidden" name="nickname" :value="user.screen_name">
|
<input type="hidden" name="nickname" :value="user.screen_name">
|
||||||
<input type="hidden" name="profile" value="">
|
<input type="hidden" name="profile" value="">
|
||||||
<button click="submit" class="remote-button base05 base02-background">
|
<button click="submit" class="remote-button">
|
||||||
{{ $t('user_card.remote_follow') }}
|
{{ $t('user_card.remote_follow') }}
|
||||||
</button>
|
</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<div class='block' v-if='isOtherUser && loggedIn'>
|
<div class='block' v-if='isOtherUser && loggedIn'>
|
||||||
<span v-if='user.statusnet_blocking'>
|
<span v-if='user.statusnet_blocking'>
|
||||||
<button @click="unblockUser" class="base04 base00-background pressed">
|
<button @click="unblockUser" class="pressed">
|
||||||
{{ $t('user_card.blocked') }}
|
{{ $t('user_card.blocked') }}
|
||||||
</button>
|
</button>
|
||||||
</span>
|
</span>
|
||||||
<span v-if='!user.statusnet_blocking'>
|
<span v-if='!user.statusnet_blocking'>
|
||||||
<button @click="blockUser" class="base05 base02-background">
|
<button @click="blockUser">
|
||||||
{{ $t('user_card.block') }}
|
{{ $t('user_card.block') }}
|
||||||
</button>
|
</button>
|
||||||
</span>
|
</span>
|
||||||
|
@ -73,19 +73,19 @@
|
||||||
<div class="panel-body profile-panel-body" :style="bodyStyle">
|
<div class="panel-body profile-panel-body" :style="bodyStyle">
|
||||||
<div class="user-counts">
|
<div class="user-counts">
|
||||||
<div class="user-count">
|
<div class="user-count">
|
||||||
<a href="#" v-on:click.prevent="setProfileView('statuses')" v-if="switcher"><h5 class="base05">{{ $t('user_card.statuses') }}</h5></a>
|
<a href="#" v-on:click.prevent="setProfileView('statuses')" v-if="switcher"><h5>{{ $t('user_card.statuses') }}</h5></a>
|
||||||
<h5 v-else>{{ $t('user_card.statuses') }}</h5>
|
<h5 v-else>{{ $t('user_card.statuses') }}</h5>
|
||||||
<span class="base05">{{user.statuses_count}} <br><span class="dailyAvg">{{dailyAvg}} {{ $t('user_card.per_day') }}</span></span>
|
<span>{{user.statuses_count}} <br><span class="dailyAvg">{{dailyAvg}} {{ $t('user_card.per_day') }}</span></span>
|
||||||
</div>
|
</div>
|
||||||
<div class="user-count">
|
<div class="user-count">
|
||||||
<a href="#" v-on:click.prevent="setProfileView('friends')" v-if="switcher"><h5 class="base05">{{ $t('user_card.followees') }}</h5></a>
|
<a href="#" v-on:click.prevent="setProfileView('friends')" v-if="switcher"><h5>{{ $t('user_card.followees') }}</h5></a>
|
||||||
<h5 v-else>{{ $t('user_card.followees') }}</h5>
|
<h5 v-else>{{ $t('user_card.followees') }}</h5>
|
||||||
<span class="base05">{{user.friends_count}}</span>
|
<span>{{user.friends_count}}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="user-count">
|
<div class="user-count">
|
||||||
<a href="#" v-on:click.prevent="setProfileView('followers')" v-if="switcher"><h5 class="base05">{{ $t('user_card.followers') }}</h5></a>
|
<a href="#" v-on:click.prevent="setProfileView('followers')" v-if="switcher"><h5>{{ $t('user_card.followers') }}</h5></a>
|
||||||
<h5 v-else>{{ $t('user_card.followers') }}</h5>
|
<h5 v-else>{{ $t('user_card.followers') }}</h5>
|
||||||
<span class="base05">{{user.followers_count}}</span>
|
<span>{{user.followers_count}}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<p>{{user.description}}</p>
|
<p>{{user.description}}</p>
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
<template>
|
<template>
|
||||||
<span class="user-finder-container">
|
<span class="user-finder-container">
|
||||||
<span class="finder-error base05" v-if="error">
|
<span class="finder-error" v-if="error">
|
||||||
<i class="icon-cancel user-finder-icon" @click="dismissError"/>
|
<i class="icon-cancel user-finder-icon" @click="dismissError"/>
|
||||||
{{$t('finder.error_fetching_user')}}
|
{{$t('finder.error_fetching_user')}}
|
||||||
</span>
|
</span>
|
||||||
<i class="icon-spin4 user-finder-icon animate-spin-slow" v-if="loading" />
|
<i class="icon-spin4 user-finder-icon animate-spin-slow" v-if="loading" />
|
||||||
<a href="#" v-if="hidden"><i class="icon-user-plus user-finder-icon" @click.prevent.stop="toggleHidden"/></a>
|
<a href="#" v-if="hidden"><i class="icon-user-plus user-finder-icon" @click.prevent.stop="toggleHidden"/></a>
|
||||||
<span v-else>
|
<span v-else>
|
||||||
<input class="user-finder-input base03-border" @keyup.enter="findUser(username)" v-model="username" :placeholder="$t('finder.find_user')" id="user-finder-input" type="text"/>
|
<input class="user-finder-input" @keyup.enter="findUser(username)" v-model="username" :placeholder="$t('finder.find_user')" id="user-finder-input" type="text"/>
|
||||||
<i class="icon-cancel user-finder-icon" @click.prevent.stop="toggleHidden"/>
|
<i class="icon-cancel user-finder-icon" @click.prevent.stop="toggleHidden"/>
|
||||||
</span>
|
</span>
|
||||||
</span>
|
</span>
|
||||||
|
@ -25,9 +25,6 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.user-finder-input {
|
.user-finder-input {
|
||||||
border-width: 1px;
|
|
||||||
border-style: solid;
|
|
||||||
border-color: inherit;
|
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
max-width: 80%;
|
max-width: 80%;
|
||||||
padding: 0.1em 0.2em 0.2em 0.2em;
|
padding: 0.1em 0.2em 0.2em 0.2em;
|
||||||
|
@ -38,5 +35,6 @@
|
||||||
margin: 0.35em;
|
margin: 0.35em;
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
padding: 0.25em;
|
padding: 0.25em;
|
||||||
|
color: var(--faint);
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
<div class="user-panel">
|
<div class="user-panel">
|
||||||
<div v-if='user' class="panel panel-default" style="overflow: visible;">
|
<div v-if='user' class="panel panel-default" style="overflow: visible;">
|
||||||
<user-card-content :user="user" :switcher="false"></user-card-content>
|
<user-card-content :user="user" :switcher="false"></user-card-content>
|
||||||
<div class="panel-footer base00-background">
|
<div class="panel-footer">
|
||||||
<post-status-form v-if='user'></post-status-form>
|
<post-status-form v-if='user'></post-status-form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -11,3 +11,11 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script src="./user_panel.js"></script>
|
<script src="./user_panel.js"></script>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
.user-panel {
|
||||||
|
.panel-heading {
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<div v-if="user" class="user-profile panel panel-default base00-background">
|
<div v-if="user" class="user-profile panel panel-default">
|
||||||
<user-card-content :user="user" :switcher="true"></user-card-content>
|
<user-card-content :user="user" :switcher="true"></user-card-content>
|
||||||
</div>
|
</div>
|
||||||
<Timeline :title="$t('user_profile.timeline_title')" :timeline="timeline" :timeline-name="'user'" :user-id="userId"/>
|
<Timeline :title="$t('user_profile.timeline_title')" :timeline="timeline" :timeline-name="'user'" :user-id="userId"/>
|
||||||
|
@ -16,6 +16,9 @@
|
||||||
flex-basis: 500px;
|
flex-basis: 500px;
|
||||||
padding-bottom: 10px;
|
padding-bottom: 10px;
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
|
.panel-heading {
|
||||||
|
background: transparent;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="settings panel panel-default base00-background">
|
<div class="settings panel panel-default">
|
||||||
<div class="panel-heading base02-background base04">
|
<div class="panel-heading">
|
||||||
{{$t('settings.user_settings')}}
|
{{$t('settings.user_settings')}}
|
||||||
</div>
|
</div>
|
||||||
<div class="panel-body profile-edit">
|
<div class="panel-body profile-edit">
|
||||||
<div class="setting-item">
|
<div class="setting-item">
|
||||||
<h3>{{$t('settings.name_bio')}}</h3>
|
<h3>{{$t('settings.name_bio')}}</h3>
|
||||||
<p>{{$t('settings.name')}}</p>
|
<p>{{$t('settings.name')}}</p>
|
||||||
<input class='name-changer base03-border' id='username' v-model="newname"></input>
|
<input class='name-changer' id='username' v-model="newname"></input>
|
||||||
<p>{{$t('settings.bio')}}</p>
|
<p>{{$t('settings.bio')}}</p>
|
||||||
<textarea class="bio base03-border" v-model="newbio"></textarea>
|
<textarea class="bio" v-model="newbio"></textarea>
|
||||||
<button :disabled='newname.length <= 0' class="btn btn-default base05 base02-background" @click="updateProfile">{{$t('general.submit')}}</button>
|
<button :disabled='newname.length <= 0' class="btn btn-default" @click="updateProfile">{{$t('general.submit')}}</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="setting-item">
|
<div class="setting-item">
|
||||||
<h3>{{$t('settings.avatar')}}</h3>
|
<h3>{{$t('settings.avatar')}}</h3>
|
||||||
|
@ -22,8 +22,8 @@
|
||||||
<div>
|
<div>
|
||||||
<input type="file" @change="uploadFile(0, $event)" ></input>
|
<input type="file" @change="uploadFile(0, $event)" ></input>
|
||||||
</div>
|
</div>
|
||||||
<i class="base09 icon-spin4 animate-spin" v-if="uploading[0]"></i>
|
<i class="icon-spin4 animate-spin" v-if="uploading[0]"></i>
|
||||||
<button class="btn btn-default base05 base02-background" v-else-if="previews[0]" @click="submitAvatar">{{$t('general.submit')}}</button>
|
<button class="btn btn-default" v-else-if="previews[0]" @click="submitAvatar">{{$t('general.submit')}}</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="setting-item">
|
<div class="setting-item">
|
||||||
<h3>{{$t('settings.profile_banner')}}</h3>
|
<h3>{{$t('settings.profile_banner')}}</h3>
|
||||||
|
@ -35,8 +35,8 @@
|
||||||
<div>
|
<div>
|
||||||
<input type="file" @change="uploadFile(1, $event)" ></input>
|
<input type="file" @change="uploadFile(1, $event)" ></input>
|
||||||
</div>
|
</div>
|
||||||
<i class="base09 icon-spin4 animate-spin uploading" v-if="uploading[1]"></i>
|
<i class=" icon-spin4 animate-spin uploading" v-if="uploading[1]"></i>
|
||||||
<button class="btn btn-default base05 base02-background" v-else-if="previews[1]" @click="submitBanner">{{$t('general.submit')}}</button>
|
<button class="btn btn-default" v-else-if="previews[1]" @click="submitBanner">{{$t('general.submit')}}</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="setting-item">
|
<div class="setting-item">
|
||||||
<h3>{{$t('settings.profile_background')}}</h3>
|
<h3>{{$t('settings.profile_background')}}</h3>
|
||||||
|
@ -46,8 +46,8 @@
|
||||||
<div>
|
<div>
|
||||||
<input type="file" @change="uploadFile(2, $event)" ></input>
|
<input type="file" @change="uploadFile(2, $event)" ></input>
|
||||||
</div>
|
</div>
|
||||||
<i class="base09 icon-spin4 animate-spin uploading" v-if="uploading[2]"></i>
|
<i class=" icon-spin4 animate-spin uploading" v-if="uploading[2]"></i>
|
||||||
<button class="btn btn-default base05 base02-background" v-else-if="previews[2]" @click="submitBg">{{$t('general.submit')}}</button>
|
<button class="btn btn-default" v-else-if="previews[2]" @click="submitBg">{{$t('general.submit')}}</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="setting-item" v-if="pleromaBackend">
|
<div class="setting-item" v-if="pleromaBackend">
|
||||||
<h3>{{$t('settings.follow_import')}}</h3>
|
<h3>{{$t('settings.follow_import')}}</h3>
|
||||||
|
@ -55,8 +55,8 @@
|
||||||
<form v-model="followImportForm">
|
<form v-model="followImportForm">
|
||||||
<input type="file" ref="followlist" v-on:change="followListChange"></input>
|
<input type="file" ref="followlist" v-on:change="followListChange"></input>
|
||||||
</form>
|
</form>
|
||||||
<i class="base09 icon-spin4 animate-spin uploading" v-if="uploading[3]"></i>
|
<i class=" icon-spin4 animate-spin uploading" v-if="uploading[3]"></i>
|
||||||
<button class="btn btn-default base05 base02-background" v-else @click="importFollows">{{$t('general.submit')}}</button>
|
<button class="btn btn-default" v-else @click="importFollows">{{$t('general.submit')}}</button>
|
||||||
<div v-if="followsImported">
|
<div v-if="followsImported">
|
||||||
<i class="icon-cross" @click="dismissImported"></i>
|
<i class="icon-cross" @click="dismissImported"></i>
|
||||||
<p>{{$t('settings.follows_imported')}}</p>
|
<p>{{$t('settings.follows_imported')}}</p>
|
||||||
|
@ -76,8 +76,6 @@
|
||||||
<style lang="scss">
|
<style lang="scss">
|
||||||
.profile-edit {
|
.profile-edit {
|
||||||
.name-changer {
|
.name-changer {
|
||||||
border-width: 1px;
|
|
||||||
border-style: solid;
|
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
padding: 0.2em 0.2em 0.2em 0.2em;
|
padding: 0.2em 0.2em 0.2em 0.2em;
|
||||||
}
|
}
|
||||||
|
@ -85,11 +83,15 @@
|
||||||
padding: 0.2em 0.5em 0.2em 0.5em;
|
padding: 0.2em 0.5em 0.2em 0.5em;
|
||||||
}
|
}
|
||||||
.bio {
|
.bio {
|
||||||
border-width: 1px;
|
|
||||||
border-style: solid;
|
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
input[type=file] {
|
||||||
|
padding: 5px;
|
||||||
|
border-radius: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
.banner {
|
.banner {
|
||||||
max-width: 400px;
|
max-width: 400px;
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
|
|
|
@ -45,12 +45,10 @@ const setStyle = (href, commit) => {
|
||||||
|
|
||||||
const styleEl = document.createElement('style')
|
const styleEl = document.createElement('style')
|
||||||
head.appendChild(styleEl)
|
head.appendChild(styleEl)
|
||||||
const styleSheet = styleEl.sheet
|
// const styleSheet = styleEl.sheet
|
||||||
|
|
||||||
styleSheet.insertRule(`a { color: ${colors['base08']}`, 'index-max')
|
// styleSheet.insertRule(`a { color: ${colors['base08']}`, 'index-max')
|
||||||
styleSheet.insertRule(`body { color: ${colors['base05']}`, 'index-max')
|
// styleSheet.insertRule(`body { color: ${colors['base05']}`, 'index-max')
|
||||||
styleSheet.insertRule(`.base05-border { border-color: ${colors['base05']}`, 'index-max')
|
|
||||||
styleSheet.insertRule(`.base03-border { border-color: ${colors['base03']}`, 'index-max')
|
|
||||||
body.style.display = 'initial'
|
body.style.display = 'initial'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -74,28 +72,30 @@ const setColors = (col, commit) => {
|
||||||
mod = mod * -1
|
mod = mod * -1
|
||||||
}
|
}
|
||||||
|
|
||||||
colors['base00'] = rgb2hex(col.bg.r, col.bg.g, col.bg.b) // background
|
colors.bg = rgb2hex(col.bg.r, col.bg.g, col.bg.b) // background
|
||||||
colors['base01'] = rgb2hex((col.bg.r + col.fg.r) / 2, (col.bg.g + col.fg.g) / 2, (col.bg.b + col.fg.b) / 2) // hilighted bg
|
colors.lightBg = rgb2hex((col.bg.r + col.fg.r) / 2, (col.bg.g + col.fg.g) / 2, (col.bg.b + col.fg.b) / 2) // hilighted bg
|
||||||
colors['base02'] = rgb2hex(col.fg.r, col.fg.g, col.fg.b) // panels & buttons
|
colors.btn = rgb2hex(col.fg.r, col.fg.g, col.fg.b) // panels & buttons
|
||||||
colors['base03'] = rgb2hex(col.fg.r - mod, col.fg.g - mod, col.fg.b - mod) // borders
|
colors.border = rgb2hex(col.fg.r - mod, col.fg.g - mod, col.fg.b - mod) // borders
|
||||||
colors['base04'] = rgb2hex(col.text.r + mod * 2, col.text.g + mod * 2, col.text.b + mod * 2) // faint text
|
colors.faint = rgb2hex(col.text.r + mod * 2, col.text.g + mod * 2, col.text.b + mod * 2) // faint text
|
||||||
colors['base05'] = rgb2hex(col.text.r, col.text.g, col.text.b) // text
|
colors.fg = rgb2hex(col.text.r, col.text.g, col.text.b) // text
|
||||||
colors['base06'] = rgb2hex(col.text.r - mod, col.text.g - mod, col.text.b - mod) // strong text
|
colors.lightFg = rgb2hex(col.text.r - mod, col.text.g - mod, col.text.b - mod) // strong text
|
||||||
colors['base07'] = rgb2hex(col.text.r - mod * 2, col.text.g - mod * 2, col.text.b - mod * 2)
|
colors['base07'] = rgb2hex(col.text.r - mod * 2, col.text.g - mod * 2, col.text.b - mod * 2)
|
||||||
colors['base08'] = rgb2hex(col.link.r, col.link.g, col.link.b) // links
|
colors.link = rgb2hex(col.link.r, col.link.g, col.link.b) // links
|
||||||
colors['base09'] = rgb2hex((col.bg.r + col.text.r) / 2, (col.bg.g + col.text.g) / 2, (col.bg.b + col.text.b) / 2) // icons
|
colors.icon = rgb2hex((col.bg.r + col.text.r) / 2, (col.bg.g + col.text.g) / 2, (col.bg.b + col.text.b) / 2) // icons
|
||||||
|
colors.cBlue = 'blue'
|
||||||
|
colors.cRed = 'red'
|
||||||
|
colors.cGreen = 'green'
|
||||||
|
colors.cYellow = 'yellow'
|
||||||
|
colors.cOrange = 'orange'
|
||||||
|
|
||||||
const num = 10
|
const colorVars = Object.entries(colors).map(([k, v]) => {
|
||||||
times(num, (n) => {
|
return `--${k}: ${v}`
|
||||||
const color = colors[`base0${num - 1 - n}`]
|
|
||||||
styleSheet.insertRule(`.base0${num - 1 - n} { color: ${color}`, 'index-max')
|
|
||||||
styleSheet.insertRule(`.base0${num - 1 - n}-background { background-color: ${color}`, 'index-max')
|
|
||||||
})
|
})
|
||||||
|
console.log(colorVars)
|
||||||
|
|
||||||
styleSheet.insertRule(`a { color: ${colors['base08']}`, 'index-max')
|
styleSheet.insertRule(`body { ${colorVars.join(';')} }`, 'index-max')
|
||||||
styleSheet.insertRule(`body { color: ${colors['base05']}`, 'index-max')
|
// styleSheet.insertRule(`.base05-border { border-color: ${colors['base05']}`, 'index-max')
|
||||||
styleSheet.insertRule(`.base05-border { border-color: ${colors['base05']}`, 'index-max')
|
// styleSheet.insertRule(`.base03-border { border-color: ${colors['base03']}`, 'index-max')
|
||||||
styleSheet.insertRule(`.base03-border { border-color: ${colors['base03']}`, 'index-max')
|
|
||||||
body.style.display = 'initial'
|
body.style.display = 'initial'
|
||||||
|
|
||||||
commit('setOption', { name: 'colors', value: colors })
|
commit('setOption', { name: 'colors', value: colors })
|
||||||
|
|
Loading…
Reference in a new issue