Merge hj's css overhaul and fix conflicts

This commit is contained in:
shpuld 2018-04-10 00:28:24 +03:00
commit 8835c98529
47 changed files with 1494 additions and 1026 deletions

View file

@ -1,10 +1,11 @@
@import './_variables.scss'; @import './_variables.scss';
#app { #app {
background-size: cover; background-size: cover;
background-attachment: fixed; background-attachment: fixed;
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: 0 50px; background-position: 0 50px;
min-height: 100vh; min-height: 100vh;
} }
i { i {
@ -12,7 +13,7 @@ i {
} }
h4 { h4 {
margin: 0; margin: 0;
} }
#content { #content {
@ -26,154 +27,280 @@ h4 {
} }
.text-center { .text-center {
text-align: center; text-align: center;
} }
body { body {
font-family: sans-serif; font-family: sans-serif;
font-size: 14px; font-size: 14px;
margin: 0; margin: 0;
color: $fallback--fg;
color: var(--fg, $fallback--fg);
} }
a { a {
text-decoration: none; text-decoration: none;
color: $fallback--link;
color: var(--link, $fallback--link);
} }
button{ button{
user-select: none; user-select: none;
border: none; color: $fallback--faint;
border-radius: 5px; color: var(--faint, $fallback--faint);
cursor: pointer; background-color: $fallback--btn;
border-top: 1px solid rgba(255, 255, 255, 0.2); background-color: var(--btn, $fallback--btn);
border-bottom: 1px solid rgba(0, 0, 0, 0.2); border: none;
box-shadow: 0px 0px 2px black; border-radius: $fallback--btnRadius;
font-size: 14px; border-radius: var(--btnRadius, $fallback--btnRadius);
font-family: sans-serif; cursor: pointer;
border-top: 1px solid rgba(255, 255, 255, 0.2);
border-bottom: 1px solid rgba(0, 0, 0, 0.2);
box-shadow: 0px 0px 2px black;
font-size: 14px;
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);
} }
&:disabled { &:disabled {
cursor: not-allowed; cursor: not-allowed;
opacity: 0.5; opacity: 0.5;
} }
&.pressed {
color: $fallback--faint;
color: var(--faint, $fallback--faint);
background-color: $fallback--bg;
background-color: var(--bg, $fallback--bg)
}
} }
.container { label.select {
display: flex; padding: 0;
flex-wrap: wrap;
}
input, textarea, .select {
border: none;
border-radius: $fallback--btnRadius;
border-radius: var(--btnRadius, $fallback--btnRadius);
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: $fallback--lightBg;
background-color: var(--lightBg, $fallback--lightBg);
color: $fallback--lightFg;
color: var(--lightFg, $fallback--lightFg);
font-family: sans-serif;
font-size: 14px;
padding: 8px 7px;
box-sizing: border-box;
display: inline-block;
position: relative;
height: 29px;
line-height: 16px;
.icon-down-open {
position: absolute;
top: 0;
bottom: 0;
right: 5px;
height: 100%;
color: $fallback--fg;
color: var(--fg, $fallback--fg);
line-height: 29px;
z-index: 0;
pointer-events: none;
}
select {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
background: transparent;
border: none;
margin: 0; margin: 0;
padding: 0 10px 0 10px; color: $fallback--fg;
color: var(--fg, $fallback--fg);
padding: 4px 2em 3px 3px;
width: 100%;
z-index: 1;
height: 29px;
line-height: 16px;
}
&[type=radio],
&[type=checkbox] {
display: none;
&:checked + label::before {
color: $fallback--fg;
color: var(--fg, $fallback--fg);
}
+ label::before {
display: inline-block;
content: '';
transition: color 200ms;
width: 1.1em;
height: 1.1em;
border-radius: $fallback--checkBoxRadius;
border-radius: var(--checkBoxRadius, $fallback--checkBoxRadius);
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: $fallback--btn;
background-color: var(--btn, $fallback--btn);
vertical-align: top;
text-align: center;
line-height: 1.1em;
font-size: 1.1em;
box-sizing: border-box;
color: transparent;
overflow: hidden;
box-sizing: border-box;
}
}
}
i[class*=icon-] {
color: $fallback--icon;
color: var(--icon, $fallback--icon)
}
.container {
display: flex;
flex-wrap: wrap;
margin: 0;
padding: 0 10px 0 10px;
} }
.gaps { .gaps {
margin: -1em 0 0 -1em; margin: -1em 0 0 -1em;
} }
.item { .item {
flex: 1; flex: 1;
line-height: 21px; line-height: 50px;
height: 21px; height: 50px;
overflow: hidden; overflow: hidden;
.nav-icon { .nav-icon {
font-size: 1.1em; font-size: 1.1em;
margin-left: 0.4em; margin-left: 0.4em;
} }
} }
.gaps > .item { .gaps > .item {
padding: 1em 0 0 1em; padding: 1em 0 0 1em;
} }
.auto-size { .auto-size {
flex: 1 flex: 1
} }
nav { nav {
width: 100%; width: 100%;
align-items: center; align-items: center;
position: fixed; position: fixed;
height: 50px; height: 50px;
.inner-nav { .inner-nav {
padding-left: 20px; padding-left: 20px;
padding-right: 20px; padding-right: 20px;
display: flex; display: flex;
align-items: center; align-items: center;
flex-basis: 970px; flex-basis: 970px;
margin: auto; margin: auto;
height: 50px; height: 50px;
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: center; background-position: center;
background-size: contain; background-size: auto 80%;
a i {
color: $fallback--link;
color: var(--link, $fallback--link);
} }
}
} }
main-router { main-router {
flex: 1; flex: 1;
} }
.status.compact { .status.compact {
color: rgba(0, 0, 0, 0.42); color: rgba(0, 0, 0, 0.42);
font-weight: 300; font-weight: 300;
p { p {
margin: 0; margin: 0;
font-size: 0.8em font-size: 0.8em
} }
} }
/* Panel */ /* Panel */
.panel { .panel {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
margin: 0.5em; margin: 0.5em;
border-radius: 10px; background-color: $fallback--bg;
box-shadow: 1px 1px 4px rgba(0,0,0,.6); background-color: var(--bg, $fallback--bg);
overflow: hidden;
border-radius: $fallback--panelRadius;
border-radius: var(--panelRadius, $fallback--panelRadius);
box-shadow: 1px 1px 4px rgba(0,0,0,.6);
overflow: hidden;
} }
.panel-body:empty::before { .panel-body:empty::before {
content: "¯\\_(ツ)_/¯"; // Could use words but it'd require translations content: "¯\\_(ツ)_/¯"; // Could use words but it'd require translations
display: block; display: block;
margin: 1em; margin: 1em;
text-align: center; text-align: center;
} }
.panel-heading { .panel-heading {
border-radius: 10px 10px 0 0; border-radius: $fallback--panelRadius $fallback--panelRadius 0 0;
background-size: cover; border-radius: var(--panelRadius, $fallback--panelRadius) var(--panelRadius, $fallback--panelRadius) 0 0;
padding: 0.6em 1.0em; background-size: cover;
text-align: left; padding: 0.6em 1.0em;
font-size: 1.3em; text-align: left;
line-height: 24px; font-size: 1.3em;
line-height: 24px;
background-color: $fallback--btn;
background-color: var(--btn, $fallback--btn);
} }
.panel-footer { .panel-footer {
border-radius: 0 0 10px 10px; border-radius: 0 0 $fallback--panelRadius $fallback--panelRadius;
border-radius: 0 0 var(--panelRadius, $fallback--panelRadius) var(--panelRadius, $fallback--panelRadius);
} }
.panel-body > p { .panel-body > p {
line-height: 18px; line-height: 18px;
padding: 1em; padding: 1em;
margin: 0; margin: 0;
} }
.container > * { .container > * {
min-width: 0px; min-width: 0px;
} }
.fa { .fa {
color: grey; color: grey;
} }
nav { nav {
z-index: 1000; z-index: 1000;
box-shadow: 0px 0px 4px rgba(0,0,0,.6); background-color: $fallback--btn;
background-color: var(--btn, $fallback--btn);
color: $fallback--faint;
color: var(--faint, $fallback--faint);
box-shadow: 0px 0px 4px rgba(0,0,0,.6);
} }
.fade-enter-active, .fade-leave-active { .fade-enter-active, .fade-leave-active {
@ -184,9 +311,9 @@ nav {
} }
.main { .main {
flex-basis: 60%; flex-basis: 60%;
flex-grow: 1; flex-grow: 1;
flex-shrink: 1; flex-shrink: 1;
} }
.sidebar-bounds { .sidebar-bounds {
@ -201,20 +328,20 @@ nav {
} }
.mobile-shown { .mobile-shown {
display: none; display: none;
} }
.panel-switcher { .panel-switcher {
display: none; display: none;
width: 100%; width: 100%;
height: 46px; height: 46px;
button { button {
display: block; display: block;
flex: 1; flex: 1;
max-height: 32px; max-height: 32px;
margin: 0.5em; margin: 0.5em;
padding: 0.5em; padding: 0.5em;
} }
} }
@media all and (min-width: 960px) { @media all and (min-width: 960px) {
@ -248,25 +375,41 @@ nav {
} }
} }
.alert {
margin: 0.35em;
padding: 0.25em;
border-radius: $fallback--tooltipRadius;
border-radius: var(--tooltipRadius, $fallback--tooltipRadius);
color: $fallback--faint;
color: var(--faint, $fallback--faint);
min-height: 28px;
line-height: 28px;
&.error {
background-color: $fallback--cAlertRed;
background-color: var(--cAlertRed, $fallback--cAlertRed);
}
}
@media all and (max-width: 959px) { @media all and (max-width: 959px) {
.mobile-hidden { .mobile-hidden {
display: none; display: none;
} }
.panel-switcher { .panel-switcher {
display: flex; display: flex;
} }
.container { .container {
padding: 0 0 0 0; padding: 0 0 0 0;
} }
.panel { .panel {
margin: 0.5em 0 0.5em 0; margin: 0.5em 0 0.5em 0;
} }
} }
.item.right { .item.right {
text-align: right; text-align: right;
padding-right: 20px; padding-right: 20px;
} }

View file

@ -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">

View file

@ -1,7 +1,27 @@
$main-color: #f58d2c; $main-color: #f58d2c;
$main-background: white; $main-background: white;
$darkened-background: whitesmoke; $darkened-background: whitesmoke;
$green: #0fa00f;
$blue: #0095ff;
$red: #ff0000;
$fallback--bg: #121a24;
$fallback--btn: #182230;
$fallback--faint: #999;
$fallback--fg: #b9b9ba;
$fallback--link: #d8a070;
$fallback--icon: #666;
$fallback--lightBg: rgb(21, 30, 42);
$fallback--lightFg: #b9b9ba;
$fallback--border: #222;
$fallback--cRed: #ff0000;
$fallback--cBlue: #0095ff;
$fallback--cGreen: #0fa00f;
$fallback--cOrange: orange;
$fallback--cAlertRed: rgba(211,16,20,.5);
$fallback--panelRadius: 10px;
$fallback--checkBoxRadius: 2px;
$fallback--btnRadius: 4px;
$fallback--tooltipRadius: 5px;
$fallback--avatarRadius: 4px;
$fallback--avatarAltRadius: 10px;
$fallback--attachmentRadius: 10px;

View file

@ -33,134 +33,139 @@
<script src="./attachment.js"></script> <script src="./attachment.js"></script>
<style lang="scss"> <style lang="scss">
.attachments { @import '../../_variables.scss';
display: flex;
flex-wrap: wrap;
margin-right: -0.7em;
.attachment.media-upload-container { .attachments {
flex: 0 0 auto; display: flex;
max-height: 300px; flex-wrap: wrap;
max-width: 100%; margin-right: -0.7em;
}
.placeholder { .attachment.media-upload-container {
margin-right: 0.5em; flex: 0 0 auto;
} max-height: 300px;
max-width: 100%;
}
.small-attachment { .placeholder {
&.image, &.video { margin-right: 0.5em;
max-width: 35%; }
}
max-height: 100px;
}
.attachment { .small-attachment {
flex: 1 0 30%; &.image, &.video {
margin: 0.5em 0.7em 0.6em 0.0em; max-width: 35%;
align-self: flex-start; }
max-height: 100px;
}
border-style: solid; .attachment {
border-width: 1px; flex: 1 0 30%;
margin: 0.5em 0.7em 0.6em 0.0em;
align-self: flex-start;
border-style: solid;
border-width: 1px;
border-radius: $fallback--attachmentRadius;
border-radius: var(--attachmentRadius, $fallback--attachmentRadius);
border-color: $fallback--border;
border-color: var(--border, $fallback--border);
overflow: hidden;
}
// fixes small gap below video
&.video {
line-height: 0;
}
&.html {
flex-basis: 90%;
width: 100%;
display: flex;
}
&.loading {
cursor: progress;
}
.hider {
position: absolute;
margin: 10px;
padding: 5px;
background: rgba(230,230,230,0.6);
font-weight: bold;
z-index: 4;
}
.small {
max-height: 100px;
}
video {
max-height: 500px;
height: 100%;
width: 100%;
z-index: 0;
}
audio {
width: 100%;
}
img.media-upload {
margin-bottom: -2px;
max-height: 300px;
max-width: 100%;
}
.oembed {
width: 100%;
margin-right: 15px;
display: flex;
img {
width: 100%;
}
.image {
flex: 1;
img {
border: 0px;
border-radius: 5px; border-radius: 5px;
overflow: hidden; height: 100%;
} object-fit: cover;
// fixes small gap below video
&.video {
line-height: 0;
} }
}
&.html { .text {
flex-basis: 90%; flex: 2;
width: 100%; margin: 8px;
display: flex; word-break: break-all;
h1 {
font-size: 14px;
margin: 0px;
} }
}
}
&.loading { .image-attachment {
cursor: progress; display: flex;
} flex: 1;
.hider { .still-image {
position: absolute; width: 100%;
margin: 10px; height: 100%;
padding: 5px; }
background: rgba(230,230,230,0.6);
font-weight: bold;
z-index: 4;
}
.small { .small {
img {
max-height: 100px; max-height: 100px;
} }
video { }
max-height: 500px;
height: 100%;
width: 100%;
z-index: 0;
}
audio { img {
width: 100%; object-fit: contain;
} width: 100%;
height: 100%; /* If this isn't here, chrome will stretch the images */
img.media-upload { max-height: 500px;
margin-bottom: -2px; image-orientation: from-image;
max-height: 300px; }
max-width: 100%; }
} }
.oembed {
width: 100%;
margin-right: 15px;
display: flex;
img {
width: 100%;
}
.image {
flex: 1;
img {
border: 0px;
border-radius: 5px;
height: 100%;
object-fit: cover;
}
}
.text {
flex: 2;
margin: 8px;
word-break: break-all;
h1 {
font-size: 14px;
margin: 0px;
}
}
}
.image-attachment {
display: flex;
flex: 1;
.still-image {
width: 100%;
height: 100%;
}
.small {
img {
max-height: 100px;
}
}
img {
object-fit: contain;
width: 100%;
height: 100%; /* If this isn't here, chrome will stretch the images */
max-height: 500px;
image-orientation: from-image;
}
}
}
</style> </style>

View file

@ -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>
@ -29,30 +29,36 @@
<script src="./chat_panel.js"></script> <script src="./chat_panel.js"></script>
<style lang="scss"> <style lang="scss">
.chat-window { @import '../../_variables.scss';
max-height: 200px;
overflow-y: auto; .chat-window {
overflow-x: hidden; max-height: 200px;
} overflow-y: auto;
.chat-message { overflow-x: hidden;
padding: 0.2em 0.5em }
}
.chat-avatar { .chat-message {
img { padding: 0.2em 0.5em
height: 32px; }
width: 32px;
border-radius: 5px; .chat-avatar {
margin-right: 0.5em; img {
} height: 32px;
} width: 32px;
.chat-input { border-radius: $fallback--avatarRadius;
display: flex; border-radius: var(--avatarRadius, $fallback--avatarRadius);
form { margin-right: 0.5em;
flex: auto; }
input { }
margin: 0.5em;
width: fill-available; .chat-input {
} display: flex;
} form {
} flex: auto;
input {
margin: 0.5em;
width: fill-available;
}
}
}
</style> </style>

View file

@ -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>

View file

@ -1,20 +1,21 @@
<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>
<script src="./delete_button.js" ></script> <script src="./delete_button.js" ></script>
<style lang='scss'> <style lang="scss">
@import '../../_variables.scss'; @import '../../_variables.scss';
.icon-cancel,.delete-status { .icon-cancel,.delete-status {
cursor: pointer; cursor: pointer;
&:hover { &:hover {
color: $red; color: var(--cRed, $fallback--cRed);
} color: $fallback--cRed;
} }
}
</style> </style>

View file

@ -1,26 +1,31 @@
<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>
<script src="./favorite_button.js" ></script> <script src="./favorite_button.js" ></script>
<style lang='scss'> <style lang="scss">
.fav-active { @import '../../_variables.scss';
cursor: pointer;
animation-duration: 0.6s;
&:hover {
color: orange;
}
}
.favorite-button.icon-star {
color: orange;
}
.fav-active {
cursor: pointer;
animation-duration: 0.6s;
&:hover {
color: $fallback--cOrange;
color: var(--cOrange, $fallback--cOrange);
}
}
.favorite-button.icon-star {
color: $fallback--cOrange;
color: var(--cOrange, $fallback--cOrange);
}
</style> </style>

View file

@ -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>

View file

@ -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='alert error'>{{authError}}</div>
</div> </div>
</form> </form>
</div> </div>
@ -31,27 +31,16 @@
<script src="./login_form.js" ></script> <script src="./login_form.js" ></script>
<style lang="scss"> <style lang="scss">
@import '../../_variables.scss';
.login-form { .login-form {
input {
border-width: 1px;
border-style: solid;
border-color: silver;
border-radius: 5px;
padding: 0.1em 0.2em 0.2em 0.2em;
}
.btn { .btn {
min-height: 28px; min-height: 28px;
width: 10em; width: 10em;
} }
.error { .error {
border-radius: 5px;
text-align: center; text-align: center;
background-color: rgba(255, 48, 16, 0.65);
min-height: 28px;
line-height: 28px;
} }
.register { .register {
@ -66,5 +55,4 @@
justify-content: space-between; justify-content: space-between;
} }
} }
</style> </style>

View file

@ -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="icon-spin4 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>

View file

@ -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,43 +30,58 @@
<script src="./nav_panel.js" ></script> <script src="./nav_panel.js" ></script>
<style lang="scss"> <style lang="scss">
.nav-panel ul { @import '../../_variables.scss';
list-style: none;
margin: 0;
padding: 0;
}
.nav-panel li { .nav-panel ul {
border-bottom: 1px solid; list-style: none;
border-color: inherit; margin: 0;
padding: 0; padding: 0;
&:first-child a { }
border-top-right-radius: 10px;
border-top-left-radius: 10px;
}
&:last-child a {
border-bottom-right-radius: 10px;
border-bottom-left-radius: 10px;
}
}
.nav-panel li:last-child { .nav-panel li {
border: none; border-bottom: 1px solid;
} border-color: $fallback--border;
border-color: var(--border, $fallback--border);
background-color: $fallback--bg;
background-color: var(--bg, $fallback--bg);
padding: 0;
.nav-panel a { &:first-child a {
display: block; border-top-right-radius: $fallback--panelRadius;
padding: 0.8em 0.85em; border-top-right-radius: var(--panelRadius, $fallback--panelRadius);
&:hover { border-top-left-radius: $fallback--panelRadius;
background-color: transparent; border-top-left-radius: var(--panelRadius, $fallback--panelRadius);
} }
&.router-link-active {
font-weight: bolder;
background-color: transparent;
&:hover {
text-decoration: underline;
}
}
}
&:last-child a {
border-bottom-right-radius: $fallback--panelRadius;
border-bottom-right-radius: var(--panelRadius, $fallback--panelRadius);
border-bottom-left-radius: $fallback--panelRadius;
border-bottom-left-radius: var(--panelRadius, $fallback--panelRadius);
}
}
.nav-panel li:last-child {
border: none;
}
.nav-panel a {
display: block;
padding: 0.8em 0.85em;
&:hover {
background-color: $fallback--lightBg;
background-color: var(--lightBg, $fallback--lightBg);
}
&.router-link-active {
font-weight: bolder;
background-color: $fallback--lightBg;
background-color: var(--lightBg, $fallback--lightBg);
&:hover {
text-decoration: underline;
}
}
}
</style> </style>

View file

@ -4,21 +4,40 @@
// 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: $fallback--bg;
background: var(--bg, $fallback--bg)
}
.panel-body {
border-color: $fallback--border;
border-color: var(--border, $fallback--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: $fallback--btn;
background: var(--btn, $fallback--btn);
color: $fallback--faint;
color: var(--faint, $fallback--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: $fallback--btn;
background-color: var(--btn, $fallback--btn);
color: $fallback--faint;
color: var(--faint, $fallback--faint);
} }
} }
.unseen-count { .unseen-count {
display: inline-block; display: inline-block;
background-color: rgba(255, 16, 8, 0.8); background-color: $fallback--cRed;
background-color: var(--cRed, $fallback--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 +46,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 {
@ -61,6 +81,10 @@
flex: 1; flex: 1;
} }
time {
white-space: nowrap;
}
.notification-right { .notification-right {
flex: 1; flex: 1;
padding-left: 0.8em; padding-left: 0.8em;
@ -86,19 +110,24 @@
} }
.icon-retweet.lit { .icon-retweet.lit {
color: $green; color: $fallback--cGreen;
color: var(--cGreen, $fallback--cGreen);
} }
.icon-user-plus.lit { .icon-user-plus.lit {
color: $blue; color: $fallback--cBlue;
color: var(--cBlue, $fallback--cBlue);
} }
.icon-reply.lit { .icon-reply.lit {
color: $blue; color: $fallback--cBlue;
color: var(--cBlue, $fallback--cBlue);
} }
.icon-star.lit { .icon-star.lit {
color: orange; color: orange;
color: $fallback--cOrange;
color: var(--cOrange, $fallback--cOrange);
} }
.status-content { .status-content {
@ -126,7 +155,6 @@
&:last-child { &:last-child {
border-bottom: none; border-bottom: none;
border-radius: 0 0 10px 10px;
} }
} }
@ -140,16 +168,10 @@
} }
} }
.notification-gradient {
position: absolute;
width: 100%;
height: 4em;
margin-top:8em;
}
.unseen { .unseen {
border-left: 4px solid rgba(255, 16, 8, 0.75); border-left: 4px solid $fallback--cRed;
padding-left: 0px; border-left: 4px solid var(--cRed, $fallback--cRed);
padding-left: 6px;
} }
} }
@ -158,7 +180,8 @@
margin-top: 0.3em; margin-top: 0.3em;
width: 32px; width: 32px;
height: 32px; height: 32px;
border-radius: 50%; border-radius: $fallback--avatarAltRadius;
border-radius: var(--avatarAltRadius, $fallback--avatarAltRadius);
overflow: hidden; overflow: hidden;
line-height: 0; line-height: 0;

View file

@ -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}'>
<notification :notification="notification"></notification> <notification :notification="notification"></notification>
</div> </div>

View file

@ -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='alert 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>
@ -50,147 +50,157 @@
<script src="./post_status_form.js"></script> <script src="./post_status_form.js"></script>
<style lang="scss"> <style lang="scss">
@import '../../_variables.scss';
.tribute-container { .tribute-container {
ul { ul {
padding: 0px; padding: 0px;
li { li {
display: flex; display: flex;
align-items: center; align-items: center;
} }
} }
img { img {
padding: 3px; padding: 3px;
width: 16px; width: 16px;
height: 16px; height: 16px;
border-radius: 50%; border-radius: $fallback--avatarAltRadius;
} border-radius: var(--avatarAltRadius, $fallback--avatarAltRadius);
} }
}
.post-status-form, .login { .post-status-form, .login {
.form-bottom { .form-bottom {
display: flex; display: flex;
padding: 0.5em; padding: 0.5em;
height: 32px; height: 32px;
button { button {
width: 10em; width: 10em;
} }
p { p {
margin: 0.35em; margin: 0.35em;
padding: 0.35em; padding: 0.35em;
display: flex; display: flex;
} }
} }
.error {
border-radius: 5px;
text-align: center;
background-color: rgba(255, 48, 16, 0.65);
padding: 0.25em;
margin: 0.35em;
display: flex;
}
.attachments { .error {
padding: 0 0.5em; text-align: center;
}
.attachment { .attachments {
position: relative; padding: 0 0.5em;
margin: 0.5em 0.8em 0.2em 0;
}
i { .attachment {
position: absolute; position: relative;
margin: 10px; border: 1px solid $fallback--border;
padding: 5px; border: 1px solid var(--border, $fallback--border);
background: rgba(230,230,230,0.6); margin: 0.5em 0.8em 0.2em 0;
border-radius: 5px; }
font-weight: bold;
} i {
} position: absolute;
margin: 10px;
padding: 5px;
background: rgba(230,230,230,0.6);
border-radius: $fallback--attachmentRadius;
border-radius: var(--attachmentRadius, $fallback--attachmentRadius);
font-weight: bold;
}
}
.btn { .btn {
cursor: pointer; cursor: pointer;
} }
.btn[disabled] { .btn[disabled] {
cursor: not-allowed; cursor: not-allowed;
} }
.icon-cancel { .icon-cancel {
cursor: pointer; cursor: pointer;
} }
form {
display: flex;
flex-direction: column;
padding: 0.6em;
}
.form-group { form {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
padding: 0.3em 0.5em 0.6em; padding: 0.6em;
line-height:24px; }
}
form textarea { .form-group {
border: solid; display: flex;
border-width: 1px; flex-direction: column;
border-color: inherit; padding: 0.3em 0.5em 0.6em;
border-radius: 5px; line-height:24px;
line-height:16px; }
padding: 5px;
resize: none;
overflow: hidden;
}
form textarea:focus { form textarea {
min-height: 48px; line-height:16px;
} resize: none;
overflow: hidden;
transition: min-height 200ms 100ms;
min-height: 1px;
box-sizing: content-box;
}
.btn { form textarea:focus {
cursor: pointer; min-height: 48px;
} }
.btn[disabled] { .btn {
cursor: not-allowed; cursor: pointer;
} }
.icon-cancel { .btn[disabled] {
cursor: pointer; cursor: not-allowed;
z-index: 4; }
}
.autocomplete-panel { .icon-cancel {
margin: 0 0.5em 0 0.5em; cursor: pointer;
border-radius: 5px; z-index: 4;
position: absolute; }
z-index: 1;
box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.5);
min-width: 75%;
}
.autocomplete { .autocomplete-panel {
cursor: pointer; margin: 0 0.5em 0 0.5em;
padding: 0.2em 0.4em 0.2em 0.4em; border-radius: $fallback--tooltipRadius;
border-bottom: 1px solid rgba(0, 0, 0, 0.4); border-radius: var(--tooltipRadius, $fallback--tooltipRadius);
display: flex; position: absolute;
img { z-index: 1;
width: 24px; box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.5);
height: 24px; min-width: 75%;
border-radius: 2px; background: $fallback--btn;
object-fit: contain; background: var(--btn, $fallback--btn);
} color: $fallback--lightFg;
span { color: var(--lightFg, $fallback--lightFg);
line-height: 24px; }
margin: 0 0.1em 0 0.2em;
}
small {
font-style: italic;
}
}
}
.autocomplete {
cursor: pointer;
padding: 0.2em 0.4em 0.2em 0.4em;
border-bottom: 1px solid rgba(0, 0, 0, 0.4);
display: flex;
img {
width: 24px;
height: 24px;
border-radius: $fallback--avatarRadius;
border-radius: var(--avatarRadius, $fallback--avatarRadius);
object-fit: contain;
}
span {
line-height: 24px;
margin: 0 0.1em 0 0.2em;
}
small {
margin-left: .5em;
color: $fallback--faint;
color: var(--faint, $fallback--faint);
}
}
}
</style> </style>

View file

@ -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='alert error'>{{error}}</div>
</div> </div>
</form> </form>
</div> </div>
@ -55,6 +55,7 @@
<script src="./registration.js"></script> <script src="./registration.js"></script>
<style lang="scss"> <style lang="scss">
@import '../../_variables.scss';
.registration-form { .registration-form {
display: flex; display: flex;
@ -87,23 +88,10 @@
} }
form textarea { form textarea {
border: solid;
border-width: 1px;
border-color: silver;
border-radius: 5px;
line-height:16px; line-height:16px;
padding: 5px;
resize: vertical; resize: vertical;
} }
input {
border-width: 1px;
border-style: solid;
border-color: silver;
border-radius: 5px;
padding: 0.1em 0.2em 0.2em 0.2em;
}
.captcha { .captcha {
max-width: 350px; max-width: 350px;
margin-bottom: 0.4em; margin-bottom: 0.4em;
@ -117,12 +105,7 @@
} }
.error { .error {
border-radius: 5px;
text-align: center; text-align: center;
margin: 0.5em 0.6em 0;
background-color: rgba(255, 48, 16, 0.65);
min-height: 28px;
line-height: 28px;
} }
} }

View file

@ -1,26 +1,28 @@
<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>
<script src="./retweet_button.js" ></script> <script src="./retweet_button.js" ></script>
<style lang='scss'> <style lang="scss">
@import '../../_variables.scss'; @import '../../_variables.scss';
.rt-active { .rt-active {
cursor: pointer; cursor: pointer;
animation-duration: 0.6s; animation-duration: 0.6s;
&:hover { &:hover {
color: $green; color: $fallback--cGreen;
} color: var(--cGreen, $fallback--cGreen);
}
.icon-retweet.retweeted {
color: $green;
} }
}
.icon-retweet.retweeted {
color: $fallback--cGreen;
color: var(--cGreen, $fallback--cGreen);
}
</style> </style>

View file

@ -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">
@ -54,32 +54,40 @@
</script> </script>
<style lang="scss"> <style lang="scss">
.setting-item { @import '../../_variables.scss';
margin: 1em 1em 1.4em;
textarea {
width: 100%;
height: 100px;
}
.old-avatar { .setting-item {
width: 128px; margin: 1em 1em 1.4em;
border-radius: 5px;
}
.new-avatar { textarea {
object-fit: cover; width: 100%;
width: 128px; height: 100px;
height: 128px; }
border-radius: 5px;
}
.btn { .old-avatar {
margin-top: 1em; width: 128px;
min-height: 28px; border-radius: $fallback--avatarRadius;
width: 10em; border-radius: var(--avatarRadius, $fallback--avatarRadius);
} }
}
.setting-list { .new-avatar {
list-style-type: none; object-fit: cover;
} width: 128px;
height: 128px;
border-radius: $fallback--avatarRadius;
border-radius: var(--avatarRadius, $fallback--avatarRadius);
}
.btn {
margin-top: 1em;
min-height: 28px;
width: 10em;
}
}
.setting-list {
list-style-type: none;
li {
margin-bottom: 0.5em;
}
}
</style> </style>

View file

@ -60,11 +60,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) {
@ -89,12 +84,6 @@ const Status = {
const lengthScore = this.status.statusnet_html.split(/<p|<br/).length + this.status.text.length / 80 const lengthScore = this.status.statusnet_html.split(/<p|<br/).length + this.status.text.length / 80
return lengthScore > 20 return lengthScore > 20
}, },
hiderStyle () {
const index = this.focused || this.inConversation || this.status.id === this.highlight ? 'base01' : 'base00'
return {
background: `linear-gradient(to bottom, rgba(0, 0, 0, 0), ${this.$store.state.config.colors[index]} 60%)`
}
},
attachmentSize () { attachmentSize () {
if ((this.$store.state.config.hideAttachments && !this.inConversation) || if ((this.$store.state.config.hideAttachments && !this.inConversation) ||
(this.$store.state.config.hideAttachmentsInConv && this.inConversation)) { (this.$store.state.config.hideAttachmentsInConv && this.inConversation)) {

View file

@ -1,16 +1,16 @@
<template> <template>
<div class="status-el base00-background base03-border" :class="[{ 'base01-background': isFocused }, { 'status-conversation': inlineExpanded }]"> <div class="status-el" :class="[{ 'status-el_focused': isFocused }, { 'status-conversation': inlineExpanded }]">
<template v-if="muted && !noReplyLinks"> <template v-if="muted && !noReplyLinks">
<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-else> <template v-else>
<div v-if="retweet && !noHeading" class="media container retweet-info"> <div v-if="retweet && !noHeading" class="media container retweet-info">
<StillImage v-if="retweet" class='avatar' :src="statusoid.user.profile_image_url_original"/> <StillImage v-if="retweet" class='avatar' :src="statusoid.user.profile_image_url_original"/>
<div class="media-body base04"> <div class="media-body">
<a :href="statusoid.user.statusnet_profile_url" style="font-weight: bold;" :title="'@'+statusoid.user.screen_name">{{retweeter}}</a> <a :href="statusoid.user.statusnet_profile_url" style="font-weight: bold;" :title="'@'+statusoid.user.screen_name">{{retweeter}}</a>
<i class='fa icon-retweet retweeted'></i> <i class='fa icon-retweet retweeted'></i>
{{$t('timeline.repeated')}} {{$t('timeline.repeated')}}
@ -24,7 +24,7 @@
</a> </a>
</div> </div>
<div class="status-body"> <div class="status-body">
<div class="base03-border usercard media-body" v-if="userExpanded"> <div class="usercard media-body" 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 v-if="!noHeading" class="media-body container"> <div v-if="!noHeading" class="media-body container">
@ -39,7 +39,7 @@
</router-link> </router-link>
</span> </span>
<a v-if="isReply && !noReplyLinks" href="#" @click.prevent="gotoOriginal(status.in_reply_to_status_id)"> <a v-if="isReply && !noReplyLinks" href="#" @click.prevent="gotoOriginal(status.in_reply_to_status_id)">
<i class="icon-reply base09" @mouseenter="replyEnter(status.in_reply_to_status_id, $event)" @mouseout="replyLeave()"></i> <i class="icon-reply" @mouseenter="replyEnter(status.in_reply_to_status_id, $event)" @mouseout="replyLeave()"></i>
</a> </a>
</span> </span>
</div> </div>
@ -54,23 +54,23 @@
<router-link class="timeago" :to="{ name: 'conversation', params: { id: status.id } }"> <router-link class="timeago" :to="{ name: 'conversation', params: { id: status.id } }">
<timeago :since="status.created_at" :auto-update="60"></timeago> <timeago :since="status.created_at" :auto-update="60"></timeago>
</router-link> </router-link>
<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"><i class="base09 icon-plus-squared"></i></a> <a href="#" @click.prevent="toggleExpanded"><i class="icon-plus-squared"></i></a>
</template> </template>
<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>
</div> </div>
</div> </div>
<div v-if="showPreview" class="status-preview-container"> <div v-if="showPreview" class="status-preview-container">
<status class="status-preview" v-if="preview" :noReplyLinks="true" :statusoid="preview" :compact=true></status> <status class="status-preview" v-if="preview" :noReplyLinks="true" :statusoid="preview" :compact=true></status>
<div class="status-preview status-preview-loading base00-background base03-border" v-else> <div class="status-preview status-preview-loading base00-background base03-border" v-else>
<i class="base09 icon-spin4 animate-spin"></i> <i class="icon-spin4 animate-spin"></i>
</div> </div>
</div> </div>
<div :class="{'tall-status': hideTallStatus}" class="status-content-wrapper"> <div :class="{'tall-status': hideTallStatus}" class="status-content-wrapper">
<a class="tall-status-hider" :style="hiderStyle" v-if="hideTallStatus" href="#" @click.prevent="toggleShowTall">Show more</a> <a class="tall-status-hider" :class="{ 'tall-status-hider_focused': isFocused }" v-if="hideTallStatus" href="#" @click.prevent="toggleShowTall">Show more</a>
<div @click.prevent="linkClicked" class="status-content media-body" v-html="status.statusnet_html"></div> <div @click.prevent="linkClicked" class="status-content media-body" v-html="status.statusnet_html"></div>
<a v-if="showingTall" href="#" class="tall-status-unhider" @click.prevent="toggleShowTall">Show less</a> <a v-if="showingTall" href="#" class="tall-status-unhider" @click.prevent="toggleShowTall">Show less</a>
</div> </div>
@ -83,7 +83,7 @@
<div v-if="!noHeading && !noReplyLinks" class='status-actions media-body'> <div v-if="!noHeading && !noReplyLinks" class='status-actions media-body'>
<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>
@ -101,7 +101,6 @@
</template> </template>
<script src="./status.js" ></script> <script src="./status.js" ></script>
<style lang="scss"> <style lang="scss">
@import '../../_variables.scss'; @import '../../_variables.scss';
@ -113,6 +112,8 @@
.status-preview.status-el { .status-preview.status-el {
border-style: solid; border-style: solid;
border-width: 1px; border-width: 1px;
border-color: $fallback--border;
border-color: var(--border, $fallback--border);
} }
.status-preview-container { .status-preview-container {
@ -124,7 +125,14 @@
position: absolute; position: absolute;
max-width: 95%; max-width: 95%;
display: flex; display: flex;
border-radius: 4px; background-color: $fallback--bg;
background-color: var(--bg, $fallback--bg);
border-color: $fallback--border;
border-color: var(--border, $fallback--border);
border-style: solid;
border-width: 1px;
border-radius: $fallback--tooltipRadius;
border-radius: var(--tooltipRadius, $fallback--tooltipRadius);
box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.5); box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.5);
margin-top: 0.5em; margin-top: 0.5em;
margin-left: 1em; margin-left: 1em;
@ -153,6 +161,15 @@
border-left-width: 0px; border-left-width: 0px;
line-height: 18px; line-height: 18px;
min-width: 0; min-width: 0;
background-color: $fallback--bg;
background-color: var(--bg, $fallback--bg);
border-color: $fallback--border;
border-color: var(--border, $fallback--border);
&_focused {
background-color: $fallback--lightBg;
background-color: var(--lightBg, $fallback--lightBg);
}
.timeline & { .timeline & {
border-bottom-width: 1px; border-bottom-width: 1px;
@ -184,9 +201,11 @@
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
} }
.links { .links a {
padding-top: 1px; padding-top: 1px;
font-size: 12px; font-size: 12px;
color: $fallback--link;
color: var(--link, $fallback--link);
} }
.replies { .replies {
line-height: 16px; line-height: 16px;
@ -231,6 +250,12 @@
width: 100%; width: 100%;
text-align: center; text-align: center;
line-height: 110px; line-height: 110px;
background: linear-gradient(to bottom, rgba(0, 0, 0, 0), $fallback--bg 80%);
background: linear-gradient(to bottom, rgba(0, 0, 0, 0), var(--bg, $fallback--bg) 80%);
&_focused {
background: linear-gradient(to bottom, rgba(0, 0, 0, 0), $fallback--lightBg 80%);
background: linear-gradient(to bottom, rgba(0, 0, 0, 0), var(--lightBg, $fallback--lightBg) 80%);
}
} }
.tall-status-unhider { .tall-status-unhider {
@ -263,10 +288,11 @@
padding: 0.3em 0.6em 0 0.6em; padding: 0.3em 0.6em 0 0.6em;
margin: 0 0 -0.3em 0; margin: 0 0 -0.3em 0;
.avatar { .avatar {
border-radius: $fallback--avatarAltRadius;
border-radius: var(--avatarAltRadius, $fallback--avatarAltRadius);
margin-left: 28px; margin-left: 28px;
width: 20px; width: 20px;
height: 20px; height: 20px;
border-radius: 5px;
} }
.media-body { .media-body {
@ -310,23 +336,27 @@
} }
.icon-reply:hover { .icon-reply:hover {
color: $blue; color: $fallback--cBlue;
color: var(--cBlue, $fallback--cBlue);
} }
.icon-reply.icon-reply-active { .icon-reply.icon-reply-active {
color: $blue; color: $fallback--cBlue;
color: var(--cBlue, $fallback--cBlue);
} }
.status .avatar-compact { .status .avatar-compact {
width: 32px; width: 32px;
height: 32px; height: 32px;
border-radius: 50%; border-radius: $fallback--avatarAltRadius;
border-radius: var(--avatarAltRadius, $fallback--avatarAltRadius);
} }
.avatar { .avatar {
width: 48px; width: 48px;
height: 48px; height: 48px;
border-radius: 5px; border-radius: $fallback--avatarRadius;
border-radius: var(--avatarRadius, $fallback--avatarRadius);
overflow: hidden; overflow: hidden;
position: relative; position: relative;
@ -352,18 +382,11 @@
} }
} }
.status .avatar-retweeter {
width: 24px;
height: 24px;
position: absolute;
margin-left: 24px;
margin-top: 24px;
}
.status { .status {
display: flex; display: flex;
padding: 0.6em; padding: 0.6em;
border-left: 4px rgba(255, 48, 16, 0.65); border-left: 4px $fallback--cRed;
border-left: 4px var(--cRed, $fallback--cRed);
border-left-style: inherit; border-left-style: inherit;
} }
@ -372,7 +395,6 @@
} }
.timeline .panel.timeline { .timeline .panel.timeline {
border-radius: 10px;
overflow: hidden; overflow: hidden;
} }

View file

@ -10,53 +10,56 @@
<style lang="scss"> <style lang="scss">
@import '../../_variables.scss'; @import '../../_variables.scss';
.still-image { .still-image {
position: relative; position: relative;
line-height: 0; line-height: 0;
overflow: hidden; overflow: hidden;
width: 100%;
height: 100%;
&:hover canvas { &:hover canvas {
display: none; display: none;
} }
img {
width: 100%;
height: 100%;
}
&.animated {
&:hover::before,
img { img {
width: 100%; visibility: hidden;
height: 100%
} }
&.animated { &:hover img {
&:hover::before, visibility: visible
img {
visibility: hidden;
}
&:hover img {
visibility: visible
}
&::before {
content: 'gif';
position: absolute;
line-height: 10px;
font-size: 10px;
top: 5px;
left: 5px;
background: rgba(127,127,127,.5);
color: #FFF;
display: block;
padding: 2px 4px;
border-radius: 3px;
z-index: 2;
}
} }
canvas { &::before {
position: absolute; content: 'gif';
top: 0; position: absolute;
bottom: 0; line-height: 10px;
left: 0; font-size: 10px;
right: 0; top: 5px;
width: 100%; left: 5px;
height: 100%; background: rgba(127,127,127,.5);
color: #FFF;
display: block;
padding: 2px 4px;
border-radius: $fallback--tooltipRadius;
border-radius: var(--tooltipRadius, $fallback--tooltipRadius);
z-index: 2;
} }
}
canvas {
position: absolute;
top: 0;
bottom: 0;
left: 0;
right: 0;
width: 100%;
height: 100%;
}
} }
</style> </style>

View file

@ -6,9 +6,19 @@ export default {
availableStyles: [], availableStyles: [],
selected: this.$store.state.config.theme, selected: this.$store.state.config.theme,
bgColorLocal: '', bgColorLocal: '',
fgColorLocal: '', btnColorLocal: '',
textColorLocal: '', textColorLocal: '',
linkColorLocal: '' linkColorLocal: '',
redColorLocal: '',
blueColorLocal: '',
greenColorLocal: '',
orangeColorLocal: '',
btnRadiusLocal: '',
panelRadiusLocal: '',
avatarRadiusLocal: '',
avatarAltRadiusLocal: '',
attachmentRadiusLocal: '',
tooltipRadiusLocal: ''
} }
}, },
created () { created () {
@ -21,16 +31,29 @@ 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.btnColorLocal = rgbstr2hex(this.$store.state.config.colors.btn)
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)
this.redColorLocal = rgbstr2hex(this.$store.state.config.colors.cRed)
this.blueColorLocal = rgbstr2hex(this.$store.state.config.colors.cBlue)
this.greenColorLocal = rgbstr2hex(this.$store.state.config.colors.cGreen)
this.orangeColorLocal = rgbstr2hex(this.$store.state.config.colors.cOrange)
this.btnRadiusLocal = this.$store.state.config.radii.btnRadius || 4
this.panelRadiusLocal = this.$store.state.config.radii.panelRadius || 10
this.avatarRadiusLocal = this.$store.state.config.radii.avatarRadius || 5
this.avatarAltRadiusLocal = this.$store.state.config.radii.avatarAltRadius || 50
this.tooltipRadiusLocal = this.$store.state.config.radii.tooltipRadius || 2
this.attachmentRadiusLocal = this.$store.state.config.radii.attachmentRadius || 5
}, },
methods: { methods: {
setCustomTheme () { setCustomTheme () {
if (!this.bgColorLocal && !this.fgColorLocal && !this.linkColorLocal) { if (!this.bgColorLocal && !this.btnColorLocal && !this.linkColorLocal) {
// reset to picked themes // reset to picked themes
} }
const rgb = (hex) => { const rgb = (hex) => {
const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex) const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex)
return result ? { return result ? {
@ -40,17 +63,33 @@ export default {
} : null } : null
} }
const bgRgb = rgb(this.bgColorLocal) const bgRgb = rgb(this.bgColorLocal)
const fgRgb = rgb(this.fgColorLocal) const btnRgb = rgb(this.btnColorLocal)
const textRgb = rgb(this.textColorLocal) const textRgb = rgb(this.textColorLocal)
const linkRgb = rgb(this.linkColorLocal) const linkRgb = rgb(this.linkColorLocal)
if (bgRgb && fgRgb && linkRgb) {
const redRgb = rgb(this.redColorLocal)
const blueRgb = rgb(this.blueColorLocal)
const greenRgb = rgb(this.greenColorLocal)
const orangeRgb = rgb(this.orangeColorLocal)
if (bgRgb && btnRgb && linkRgb) {
this.$store.dispatch('setOption', { this.$store.dispatch('setOption', {
name: 'customTheme', name: 'customTheme',
value: { value: {
fg: fgRgb, fg: btnRgb,
bg: bgRgb, bg: bgRgb,
text: textRgb, text: textRgb,
link: linkRgb link: linkRgb,
cRed: redRgb,
cBlue: blueRgb,
cGreen: greenRgb,
cOrange: orangeRgb,
btnRadius: this.btnRadiusLocal,
panelRadius: this.panelRadiusLocal,
avatarRadius: this.avatarRadiusLocal,
avatarAltRadius: this.avatarAltRadiusLocal,
tooltipRadius: this.tooltipRadiusLocal,
attachmentRadius: this.attachmentRadiusLocal
}}) }})
} }
} }
@ -58,9 +97,13 @@ export default {
watch: { watch: {
selected () { selected () {
this.bgColorLocal = this.selected[1] this.bgColorLocal = this.selected[1]
this.fgColorLocal = this.selected[2] this.btnColorLocal = this.selected[2]
this.textColorLocal = this.selected[3] this.textColorLocal = this.selected[3]
this.linkColorLocal = this.selected[4] this.linkColorLocal = this.selected[4]
this.redColorLocal = this.selected[5]
this.greenColorLocal = this.selected[6]
this.blueColorLocal = this.selected[7]
this.orangeColorLocal = this.selected[8]
} }
} }
} }

View file

@ -1,99 +1,231 @@
<template> <template>
<div> <div>
<p>{{$t('settings.presets')}}</p> <div>{{$t('settings.presets')}}
<select v-model="selected" class="style-switcher"> <label for="style-switcher" class='select'>
<option v-for="style in availableStyles" :value="style">{{style[0]}}</option> <select id="style-switcher" v-model="selected" class="style-switcher">
</select> <option v-for="style in availableStyles" :value="style">{{style[0]}}</option>
<p>{{$t('settings.theme_help')}}</p> </select>
<i class="icon-down-open"/>
</label>
</div>
<div class="color-container"> <div class="color-container">
<p>{{$t('settings.theme_help')}}</p>
<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="btnColorLocal">
<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="btnColorLocal">
</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>
<div class="color-item">
<label for="redcolor" class="theme-color-lb">{{$t('settings.cRed')}}</label>
<input id="redcolor" class="theme-color-cl" type="color" v-model="redColorLocal">
<input id="redcolor-t" class="theme-color-in" type="text" v-model="redColorLocal">
</div>
<div class="color-item">
<label for="bluecolor" class="theme-color-lb">{{$t('settings.cBlue')}}</label>
<input id="bluecolor" class="theme-color-cl" type="color" v-model="blueColorLocal">
<input id="bluecolor-t" class="theme-color-in" type="text" v-model="blueColorLocal">
</div>
<div class="color-item">
<label for="greencolor" class="theme-color-lb">{{$t('settings.cGreen')}}</label>
<input id="greencolor" class="theme-color-cl" type="color" v-model="greenColorLocal">
<input id="greencolor-t" class="theme-color-in" type="green" v-model="greenColorLocal">
</div>
<div class="color-item">
<label for="orangecolor" class="theme-color-lb">{{$t('settings.cOrange')}}</label>
<input id="orangecolor" class="theme-color-cl" type="color" v-model="orangeColorLocal">
<input id="orangecolor-t" class="theme-color-in" type="text" v-model="orangeColorLocal">
</div>
</div> </div>
<div> <div class="radius-container">
<div class="panel"> <p>{{$t('settings.radii_help')}}</p>
<div class="panel-heading" :style="{ 'background-color': fgColorLocal, 'color': textColorLocal }">Preview</div> <div class="radius-item">
<label for="btnradius" class="theme-radius-lb">{{$t('settings.btnRadius')}}</label>
<input id="btnradius" class="theme-radius-rn" type="range" v-model="btnRadiusLocal" max="16">
<input id="btnradius-t" class="theme-radius-in" type="text" v-model="btnRadiusLocal">
</div>
<div class="radius-item">
<label for="panelradius" class="theme-radius-lb">{{$t('settings.panelRadius')}}</label>
<input id="panelradius" class="theme-radius-rn" type="range" v-model="panelRadiusLocal" max="50">
<input id="panelradius-t" class="theme-radius-in" type="text" v-model="panelRadiusLocal">
</div>
<div class="radius-item">
<label for="avatarradius" class="theme-radius-lb">{{$t('settings.avatarRadius')}}</label>
<input id="avatarradius" class="theme-radius-rn" type="range" v-model="avatarRadiusLocal" max="28">
<input id="avatarradius-t" class="theme-radius-in" type="green" v-model="avatarRadiusLocal">
</div>
<div class="radius-item">
<label for="avataraltradius" class="theme-radius-lb">{{$t('settings.avatarAltRadius')}}</label>
<input id="avataraltradius" class="theme-radius-rn" type="range" v-model="avatarAltRadiusLocal" max="28">
<input id="avataraltradius-t" class="theme-radius-in" type="text" v-model="avatarAltRadiusLocal">
</div>
<div class="radius-item">
<label for="attachmentradius" class="theme-radius-lb">{{$t('settings.attachmentRadius')}}</label>
<input id="attachmentrradius" class="theme-radius-rn" type="range" v-model="attachmentRadiusLocal" max="50">
<input id="attachmentradius-t" class="theme-radius-in" type="text" v-model="attachmentRadiusLocal">
</div>
<div class="radius-item">
<label for="tooltipradius" class="theme-radius-lb">{{$t('settings.tooltipRadius')}}</label>
<input id="tooltipradius" class="theme-radius-rn" type="range" v-model="tooltipRadiusLocal" max="20">
<input id="tooltipradius-t" class="theme-radius-in" type="text" v-model="tooltipRadiusLocal">
</div>
</div>
<div :style="{
'--btnRadius': btnRadiusLocal + 'px',
'--panelRadius': panelRadiusLocal + 'px',
'--avatarRadius': avatarRadiusLocal + 'px',
'--avatarAltRadius': avatarAltRadiusLocal + 'px',
'--tooltipRadius': tooltipRadiusLocal + 'px',
'--attachmentRadius': attachmentRadiusLocal + 'px'
}">
<div class="panel dummy">
<div class="panel-heading" :style="{ 'background-color': btnColorLocal, 'color': textColorLocal }">Preview</div>
<div class="panel-body theme-preview-content" :style="{ 'background-color': bgColorLocal, 'color': textColorLocal }"> <div class="panel-body theme-preview-content" :style="{ 'background-color': bgColorLocal, 'color': textColorLocal }">
<div class="avatar" :style="{
'border-radius': avatarRadiusLocal + 'px'
}">
( ͡° ͜ʖ ͡°)
</div>
<h4>Content</h4> <h4>Content</h4>
<br> <br>
A bunch of more content and A bunch of more content and
<a :style="{ 'color': linkColorLocal }">a nice lil' link</a> <a :style="{ color: linkColorLocal }">a nice lil' link</a>
<i :style="{ color: blueColorLocal }" class="icon-reply"/>
<i :style="{ color: greenColorLocal }" class="icon-retweet"/>
<i :style="{ color: redColorLocal }" class="icon-cancel"/>
<i :style="{ color: orangeColorLocal }" class="icon-star"/>
<br> <br>
<button class="btn" :style="{ 'background-color': fgColorLocal, 'color': textColorLocal }">Button</button> <button class="btn" :style="{ 'background-color': btnColorLocal, 'color': textColorLocal }">Button</button>
</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>
<script src="./style_switcher.js"></script> <script src="./style_switcher.js"></script>
<style lang="scss"> <style lang="scss">
@import '../../_variables.scss';
.style-switcher { .style-switcher {
margin-right: 1em; margin-right: 1em;
}
.radius-container,
.color-container {
display: flex;
p {
margin-top: 2em;
margin-bottom: .5em;
}
}
.radius-container {
flex-direction: column;
} }
.color-container { .color-container {
display: flex; flex-wrap: wrap;
flex-wrap: wrap; justify-content: space-between;
justify-content: space-between;
} }
.radius-item,
.color-item { .color-item {
min-width: 20em; min-width: 20em;
display:flex; display:flex;
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, $fallback--faint);
}
} }
.radius-item {
flex-basis: auto;
}
.theme-radius-rn,
.theme-color-cl {
border: 0;
box-shadow: none;
background: transparent;
color: var(--faint, $fallback--faint);
align-self: stretch;
}
.theme-color-cl, .theme-color-cl,
.theme-radius-in,
.theme-color-in { .theme-color-in {
margin-left: 4px; margin-left: 4px;
border-radius: 2px;
border: 0;
} }
.theme-color-in { .theme-color-in {
padding: 5px; min-width: 4em;
min-width: 4em;
max-width: 7em;
flex: 1;
} }
.theme-radius-in {
min-width: 1em;
}
.theme-radius-in,
.theme-color-in {
max-width: 7em;
flex: 1;
}
.theme-radius-lb,
.theme-color-lb { .theme-color-lb {
flex: 2; flex: 2;
min-width: 7em; min-width: 7em;
max-width: 10em; }
.theme-radius-lb{
max-width: 50em;
}
.theme-color-lb {
max-width: 10em;
} }
.theme-color-cl { .theme-color-cl {
padding: 1px; padding: 1px;
max-width: 8em; max-width: 8em;
align-self: stretch; height: 100%;
height: 100%; flex: 0;
flex: 0; min-width: 2em;
min-width: 2em; cursor: pointer;
cursor: pointer; }
}
.theme-preview-content { .theme-preview-content {
padding: 20px; padding: 20px;
} }
.dummy {
.avatar {
background: linear-gradient(135deg, #b8e1fc 0%,#a9d2f3 10%,#90bae4 25%,#90bcea 37%,#90bff0 50%,#6ba8e5 51%,#a2daf5 83%,#bdf3fd 100%);
color: black;
text-align: center;
height: 48px;
line-height: 48px;
width: 48px;
float: left;
margin-right: 1em;
}
}
</style> </style>

View file

@ -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>
@ -52,51 +52,56 @@
<script src="./timeline.js"></script> <script src="./timeline.js"></script>
<style lang="scss"> <style lang="scss">
@import '../../_variables.scss';
.timeline { .timeline {
.timeline-heading { .timeline-heading {
position: relative; position: relative;
display: flex; display: flex;
}
.title {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
max-width: 70%;
}
.loadmore-button {
position: absolute;
right: 0.6em;
font-size: 14px;
min-width: 6em;
height: 1.8em;
line-height: 100%;
}
.loadmore-text {
position: absolute;
right: 0.6em;
font-size: 14px;
min-width: 6em;
border-radius: 5px;
font-family: sans-serif;
text-align: center;
padding: 0 0.5em 0 0.5em;
opacity: 0.8;
}
.error {
background-color: rgba(255, 48, 16, 0.65);
}
} }
.new-status-notification { .title {
position:relative; white-space: nowrap;
margin-top: -1px; overflow: hidden;
font-size: 1.1em; text-overflow: ellipsis;
border-width: 1px 0 0 0; max-width: 70%;
border-style: solid;
border-radius: 0 0 10px 10px;
padding: 10px;
z-index: 1;
} }
.loadmore-button {
position: absolute;
right: 0.6em;
font-size: 14px;
min-width: 6em;
height: 1.8em;
line-height: 100%;
}
.loadmore-text {
position: absolute;
right: 0.6em;
font-size: 14px;
min-width: 6em;
background-color: transparent;
color: $fallback--faint;
color: var(--faint, $fallback--faint);
font-family: sans-serif;
text-align: center;
padding: 0 0.5em 0 0.5em;
opacity: 0.8;
}
}
.new-status-notification {
position:relative;
margin-top: -1px;
font-size: 1.1em;
border-width: 1px 0 0 0;
border-style: solid;
border-color: var(--border, $fallback--border);
padding: 10px;
z-index: 1;
background-color: $fallback--btn;
background-color: var(--btn, $fallback--btn);
}
</style> </style>

View file

@ -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>
@ -7,7 +7,7 @@
<user-card-content :user="user" :switcher="false"></user-card-content> <user-card-content :user="user" :switcher="false"></user-card-content>
</div> </div>
<div class="name-and-screen-name" v-else> <div class="name-and-screen-name" v-else>
<div class="user-name"> <div :title="user.name" class="user-name">
{{ user.name }} {{ user.name }}
<span class="follows-you" v-if="!userExpanded && showFollows && user.follows_you"> <span class="follows-you" v-if="!userExpanded && showFollows && user.follows_you">
{{ $t('user_card.follows_you') }} {{ $t('user_card.follows_you') }}
@ -21,54 +21,58 @@
<script src="./user_card.js"></script> <script src="./user_card.js"></script>
<style lang="scss"> <style lang="scss">
.name-and-screen-name { @import '../../_variables.scss';
margin-left: 0.7em;
margin-top:0.0em; .name-and-screen-name {
margin-right: 2em; margin-left: 0.7em;
text-align: left; margin-top:0.0em;
width: 100%; text-align: left;
width: 100%;
}
.follows-you {
margin-left: 2em;
float: right;
}
.card {
display: flex;
flex: 1 0;
padding-top: 0.6em;
padding-right: 1em;
padding-bottom: 0.6em;
padding-left: 1em;
border-bottom: 1px solid;
margin: 0;
border-bottom-color: $fallback--border;
border-bottom-color: var(--border, $fallback--border);
.avatar {
margin-top: 0.2em;
width:32px;
height: 32px;
border-radius: $fallback--avatarAltRadius;
border-radius: var(--avatarAltRadius, $fallback--avatarAltRadius);
}
}
.usercard {
width: fill-available;
margin: 0.2em 0 0.7em 0;
border-radius: $fallback--panelRadius;
border-radius: var(--panelRadius, $fallback--panelRadius);
border-style: solid;
border-color: $fallback--border;
border-color: var(--border, $fallback--border);
border-width: 1px;
overflow: hidden;
.panel-heading {
background: transparent;
} }
.follows-you { p {
margin-left: 2em; margin-bottom: 0;
float: right;
}
.follows {
}
.card {
display: flex;
flex: 1 0;
padding-top: 0.6em;
padding-right: 1em;
padding-bottom: 0.6em;
padding-left: 1em;
border-bottom: 1px solid;
margin: 0;
border-bottom-color: inherit;
.avatar {
margin-top: 0.2em;
width:32px;
height: 32px;
border-radius: 50%;
}
}
.usercard {
width: fill-available;
margin: 0.2em 0 0.7em 0;
border-radius: 10px;
border-style: solid;
border-color: inherit;
border-width: 1px;
overflow: hidden;
p {
margin-bottom: 0;
}
} }
}
</style> </style>

View file

@ -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)
@ -15,11 +15,6 @@ export default {
} }
} }
}, },
bodyStyle () {
return {
background: `linear-gradient(to bottom, rgba(0, 0, 0, 0), ${this.$store.state.config.colors['base00']} 80%)`
}
},
isOtherUser () { isOtherUser () {
return this.user.id !== this.$store.state.users.currentUser.id return this.user.id !== this.$store.state.users.currentUser.id
}, },

View file

@ -9,39 +9,38 @@
<router-link :to="{ name: 'user-profile', params: { id: user.id } }"> <router-link :to="{ name: 'user-profile', params: { id: user.id } }">
<StillImage class="avatar" :src="user.profile_image_url_original"/> <StillImage class="avatar" :src="user.profile_image_url_original"/>
</router-link> </router-link>
<span class="glyphicon glyphicon-user"></span>
<div class="name-and-screen-name"> <div class="name-and-screen-name">
<div class='user-name'>{{user.name}}</div> <div :title="user.name" class='user-name'>{{user.name}}</div>
<router-link :to="{ name: 'user-profile', params: { id: user.id } }"> <router-link :to="{ name: 'user-profile', params: { id: user.id } }">
<div class='user-screen-name'>@{{user.screen_name}}</div> <div class='user-screen-name'>@{{user.screen_name}}</div>
</router-link> </router-link>
</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 +49,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>
@ -70,22 +69,22 @@
</div> </div>
</div> </div>
</div> </div>
<div class="panel-body profile-panel-body" :style="bodyStyle"> <div class="panel-body profile-panel-body">
<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>
@ -100,7 +99,8 @@
.profile-panel-background { .profile-panel-background {
background-size: cover; background-size: cover;
border-radius: 10px; border-radius: $fallback--panelRadius;
border-radius: var(--panelRadius, $fallback--panelRadius);
.panel-heading { .panel-heading {
padding: 0.6em 0em; padding: 0.6em 0em;
@ -112,39 +112,33 @@
top: -0em; top: -0em;
padding-top: 4em; padding-top: 4em;
word-wrap: break-word; word-wrap: break-word;
background: linear-gradient(to bottom, rgba(0, 0, 0, 0), $fallback--bg 80%);
background: linear-gradient(to bottom, rgba(0, 0, 0, 0), var(--bg, $fallback--bg) 80%)
} }
.user-info { .user-info {
color: white; color: white;
padding: 0 16px 16px 16px; padding: 0 16px 16px 16px;
margin-bottom: -4em; margin-bottom: -4em;
.usersettings { .container {
color: white;
opacity: 0.8;
}
.container{
padding: 16px 10px 4px 10px; padding: 16px 10px 4px 10px;
display: flex; display: flex;
flex-wrap: wrap;
flex-direction: column;
align-content: flex-start;
justify-content: center;
max-height: 56px; max-height: 56px;
overflow: hidden; overflow: hidden;
}
.avatar { .avatar {
border-radius: 5px; border-radius: $fallback--avatarRadius;
flex: 1 0 100%; border-radius: var(--avatarRadius, $fallback--avatarRadius);
width: 56px; flex: 1 0 100%;
height: 56px; width: 56px;
box-shadow: 0px 1px 8px rgba(0,0,0,0.75); height: 56px;
object-fit: cover; box-shadow: 0px 1px 8px rgba(0,0,0,0.75);
object-fit: cover;
&.animated::before { &.animated::before {
display: none; display: none;
}
} }
} }
@ -157,7 +151,12 @@
} }
} }
text-shadow: 0px 1px 1.5px rgba(0, 0, 0, 1.0); text-shadow: 0px 1px 1.5px rgba(0, 0, 0, 1.0);
.usersettings {
color: #fff;
opacity: .8;
}
.name-and-screen-name { .name-and-screen-name {
display: block; display: block;
@ -165,18 +164,20 @@
text-align: left; text-align: left;
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
flex: 1 1 0;
} }
.user-name{ .user-name{
color: white; color: white;
} text-overflow: ellipsis;
overflow: hidden;
}
.user-screen-name { .user-screen-name {
color: white; color: white;
font-weight: lighter; font-weight: lighter;
font-size: 15px; font-size: 15px;
padding-right: 0.1em; padding-right: 0.1em;
flex: 0 0 auto;
} }
.user-interactions { .user-interactions {
@ -232,23 +233,24 @@
} }
.user-counts { .user-counts {
display: flex; display: flex;
line-height:16px; line-height:16px;
padding: 1em 1.5em 0em 1em; padding: 1em 1.5em 0em 1em;
text-align: center; text-align: center;
} }
.user-count { .user-count {
flex: 1; flex: 1;
h5 { h5 {
font-size:1em; color: white;
font-weight: bolder; font-size:1em;
margin: 0 0 0.25em; font-weight: bolder;
} margin: 0 0 0.25em;
a { }
text-decoration: none; a {
} text-decoration: none;
}
} }
.dailyAvg { .dailyAvg {

View file

@ -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="alert 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>
@ -16,27 +16,16 @@
<script src="./user_finder.js"></script> <script src="./user_finder.js"></script>
<style lang="scss"> <style lang="scss">
.user-finder-container { @import '../../_variables.scss';
height: 21px;
max-width: 100%;
}
.user-finder-icon { .user-finder-container {
} height: 29px;
max-width: 100%;
}
.user-finder-input { .user-finder-input {
border-width: 1px; max-width: 80%;
border-style: solid; vertical-align: middle;
border-color: inherit; }
border-radius: 5px;
max-width: 80%;
padding: 0.1em 0.2em 0.2em 0.2em;
}
.finder-error {
background-color: rgba(255, 48, 16, 0.65);
margin: 0.35em;
border-radius: 5px;
padding: 0.25em;
}
</style> </style>

View file

@ -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 {
.profile-panel-background .panel-heading {
background: transparent;
}
}
</style>

View file

@ -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"/>
@ -15,7 +15,8 @@
flex: 2; flex: 2;
flex-basis: 500px; flex-basis: 500px;
padding-bottom: 10px; padding-bottom: 10px;
border-radius: 10px; .panel-heading {
background: transparent;
}
} }
</style> </style>

View file

@ -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>
@ -75,24 +75,16 @@
<style lang="scss"> <style lang="scss">
.profile-edit { .profile-edit {
.name-changer {
border-width: 1px;
border-style: solid;
border-radius: 5px;
padding: 0.2em 0.2em 0.2em 0.2em;
}
.name-submit {
padding: 0.2em 0.5em 0.2em 0.5em;
}
.bio { .bio {
border-width: 1px;
border-style: solid;
border-radius: 5px;
margin: 0; margin: 0;
} }
input[type=file] {
padding: 5px;
}
.banner { .banner {
max-width: 400px; max-width: 400px;
border-radius: 5px;
} }
.uploading { .uploading {

View file

@ -46,7 +46,7 @@ const de = {
settings: 'Einstellungen', settings: 'Einstellungen',
theme: 'Farbschema', theme: 'Farbschema',
presets: 'Voreinstellungen', presets: 'Voreinstellungen',
theme_help: 'Benutze HTML Farbcodes (#aabbcc) um dein Farbschema anzupassen.', theme_help: 'Benutze HTML Farbcodes (#rrggbb) um dein Farbschema anzupassen.',
background: 'Hintergrund', background: 'Hintergrund',
foreground: 'Vordergrund', foreground: 'Vordergrund',
text: 'Text', text: 'Text',
@ -244,11 +244,22 @@ const en = {
settings: 'Settings', settings: 'Settings',
theme: 'Theme', theme: 'Theme',
presets: 'Presets', presets: 'Presets',
theme_help: 'Use hex color codes (#aabbcc) to customize your color theme.', theme_help: 'Use hex color codes (#rrggbb) to customize your color theme.',
radii_help: 'Set up interface edge rounding (in pixels)',
background: 'Background', background: 'Background',
foreground: 'Foreground', foreground: 'Foreground',
text: 'Text', text: 'Text',
links: 'Links', links: 'Links',
cBlue: 'Blue (Reply, follow)',
cRed: 'Red (Cancel)',
cOrange: 'Orange (Favorite)',
cGreen: 'Green (Retweet)',
btnRadius: 'Buttons',
panelRadius: 'Panels',
avatarRadius: 'Avatars',
avatarAltRadius: 'Avatars (Notifications)',
tooltipRadius: 'Tooltips/alerts',
attachmentRadius: 'Attachments',
filtering: 'Filtering', filtering: 'Filtering',
filtering_explanation: 'All statuses containing these words will be muted, one per line', filtering_explanation: 'All statuses containing these words will be muted, one per line',
attachments: 'Attachments', attachments: 'Attachments',
@ -552,9 +563,13 @@ const ro = {
} }
const ja = { const ja = {
chat: {
title: 'チャット'
},
nav: { nav: {
chat: 'ローカルチャット',
timeline: 'タイムライン', timeline: 'タイムライン',
mentions: '通知', mentions: 'メンション',
public_tl: '公開タイムライン', public_tl: '公開タイムライン',
twkn: '接続しているすべてのネットワーク' twkn: '接続しているすべてのネットワーク'
}, },
@ -562,22 +577,26 @@ const ja = {
follows_you: 'フォローされました!', follows_you: 'フォローされました!',
following: 'フォロー中!', following: 'フォロー中!',
follow: 'フォロー', follow: 'フォロー',
blocked: 'ブロック済み!',
block: 'ブロック',
statuses: 'ステータス', statuses: 'ステータス',
mute: 'ミュート', mute: 'ミュート',
muted: 'ミュート済み', muted: 'ミュート済み',
followers: 'フォロワー', followers: 'フォロワー',
followees: 'フォロー', followees: 'フォロー',
per_day: '/日' per_day: '/日',
remote_follow: 'リモートフォロー'
}, },
timeline: { timeline: {
show_new: '新しいものを表示', show_new: '新しいものを表示',
error_fetching: '更新の取得中にエラーが発生しました', error_fetching: '更新の取得中にエラーが発生しました',
up_to_date: '最新', up_to_date: '最新',
load_older: '古いステータスを読み込む' load_older: '古いステータスを読み込む',
conversation: '会話'
}, },
settings: { settings: {
user_settings: 'ユーザー設定', user_settings: 'ユーザー設定',
name_bio: '名前 & プロフィール', name_bio: '名前プロフィール',
name: '名前', name: '名前',
bio: 'プロフィール', bio: 'プロフィール',
avatar: 'アバター', avatar: 'アバター',
@ -590,14 +609,25 @@ const ja = {
set_new_profile_background: '新しいプロフィールの背景を設定する', set_new_profile_background: '新しいプロフィールの背景を設定する',
settings: '設定', settings: '設定',
theme: 'テーマ', theme: 'テーマ',
presets: 'プリセット',
theme_help: '16進数カラーコード (#aabbcc) を使用してカラーテーマをカスタマイズ出来ます。',
background: '背景',
foreground: '前景',
text: '文字',
links: 'リンク',
filtering: 'フィルタリング', filtering: 'フィルタリング',
filtering_explanation: 'これらの単語を含むすべてのものはミュートされます、1行に1つのワードを入力してください', filtering_explanation: 'これらの単語を含むすべてのものがミュートされます、1行に1つの単語を入力してください。',
attachments: '添付ファイル', attachments: 'ファイル',
hide_attachments_in_tl: 'タイムラインの添付ファイルを隠す', hide_attachments_in_tl: 'タイムラインのファイルを隠す。',
hide_attachments_in_convo: '会話の中の添付ファイルを隠す', hide_attachments_in_convo: '会話の中のファイルを隠す。',
nsfw_clickthrough: 'NSFWファイルの非表示を有効にする', nsfw_clickthrough: 'NSFWファイルの非表示を有効にする。',
autoload: '下にスクロールした時に自動で読み込むようにする', stop_gifs: 'カーソルを重ねた時にGIFを再生する。',
reply_link_preview: 'マウスカーソルを重ねたときに返信リンクプレビューを表示するようにする' autoload: '下にスクロールした時に自動で読み込むようにする。',
streaming: '上までスクロールした時に自動でストリーミングされるようにする。',
reply_link_preview: 'マウスカーソルを重ねた時に返信のプレビューを表示するようにする。',
import_followers_from_a_csv_file: 'CSVファイルからフォローをインポートする。',
follows_imported: 'フォローがインポートされました!処理に少し時間がかかるかもしれません。',
follow_import_error: 'フォロワーのインポート中にエラーが発生しました。'
}, },
notifications: { notifications: {
notifications: '通知', notifications: '通知',
@ -606,7 +636,7 @@ const ja = {
}, },
login: { login: {
login: 'ログイン', login: 'ログイン',
username: 'ユーザーネーム', username: 'ユーザー',
password: 'パスワード', password: 'パスワード',
register: '登録', register: '登録',
logout: 'ログアウト' logout: 'ログアウト'
@ -620,14 +650,18 @@ const ja = {
}, },
post_status: { post_status: {
posting: '投稿', posting: '投稿',
default: 'ちょうど羽田に着陸しました' default: 'ちょうどL.A.に着陸した'
}, },
finder: { finder: {
find_user: 'ユーザー検索', find_user: 'ユーザー検索',
error_fetching_user: 'ユーザー検索でエラーが発生しました' error_fetching_user: 'ユーザー検索でエラーが発生しました'
}, },
general: { general: {
submit: '送信' submit: '送信',
apply: '適用'
},
user_profile: {
timeline_title: 'ユーザータイムライン'
} }
} }
@ -820,7 +854,7 @@ const oc = {
settings: 'Paramètres', settings: 'Paramètres',
theme: 'Tèma', theme: 'Tèma',
presets: 'Pre-enregistrats', presets: 'Pre-enregistrats',
theme_help: 'Emplegatz los còdis de color hex (#aabbcc) per personalizar vòstre tèma de color.', theme_help: 'Emplegatz los còdis de color hex (#rrggbb) per personalizar vòstre tèma de color.',
background: 'Rèire plan', background: 'Rèire plan',
foreground: 'Endavant', foreground: 'Endavant',
text: 'Tèxte', text: 'Tèxte',
@ -1006,7 +1040,7 @@ const es = {
settings: 'Ajustes', settings: 'Ajustes',
theme: 'Tema', theme: 'Tema',
presets: 'Por defecto', presets: 'Por defecto',
theme_help: 'Use códigos de color hexadecimales (#aabbcc) para personalizar su tema de colores.', theme_help: 'Use códigos de color hexadecimales (#rrggbb) para personalizar su tema de colores.',
background: 'Segundo plano', background: 'Segundo plano',
foreground: 'Primer plano', foreground: 'Primer plano',
text: 'Texto', text: 'Texto',
@ -1106,7 +1140,7 @@ const pt = {
settings: 'Configurações', settings: 'Configurações',
theme: 'Tema', theme: 'Tema',
presets: 'Predefinições', presets: 'Predefinições',
theme_help: 'Use cores em código hexadecimal (#aabbcc) para personalizar seu esquema de cores.', theme_help: 'Use cores em código hexadecimal (#rrggbb) para personalizar seu esquema de cores.',
background: 'Plano de Fundo', background: 'Plano de Fundo',
foreground: 'Primeiro Plano', foreground: 'Primeiro Plano',
text: 'Texto', text: 'Texto',
@ -1206,7 +1240,7 @@ const ru = {
settings: 'Настройки', settings: 'Настройки',
theme: 'Тема', theme: 'Тема',
presets: 'Пресеты', presets: 'Пресеты',
theme_help: 'Используйте шестнадцатеричные коды цветов (#aabbcc) для настройки темы.', theme_help: 'Используйте шестнадцатеричные коды цветов (#rrggbb) для настройки темы.',
background: 'Фон', background: 'Фон',
foreground: 'Передний план', foreground: 'Передний план',
text: 'Текст', text: 'Текст',

View file

@ -45,12 +45,8 @@ 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(`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'
} }
@ -68,37 +64,50 @@ const setColors = (col, commit) => {
const isDark = (col.text.r + col.text.g + col.text.b) > (col.bg.r + col.bg.g + col.bg.b) const isDark = (col.text.r + col.text.g + col.text.b) > (col.bg.r + col.bg.g + col.bg.b)
let colors = {} let colors = {}
let radii = {}
let mod = 10 let mod = 10
if (isDark) { if (isDark) {
mod = mod * -1 mod = mod * -1
} }
console.log(JSON.stringify(col, null, ' '))
colors.bg = rgb2hex(col.bg.r, col.bg.g, col.bg.b) // background
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.btn = rgb2hex(col.fg.r, col.fg.g, col.fg.b) // panels & buttons
colors.border = rgb2hex(col.fg.r - mod, col.fg.g - mod, col.fg.b - mod) // borders
colors.faint = rgb2hex(col.text.r + mod * 2, col.text.g + mod * 2, col.text.b + mod * 2) // faint text
colors.fg = rgb2hex(col.text.r, col.text.g, col.text.b) // text
colors.lightFg = rgb2hex(col.text.r - mod, col.text.g - mod, col.text.b - mod) // strong text
colors['base00'] = 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['base02'] = 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['base04'] = 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['base06'] = 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['base09'] = rgb2hex((col.bg.r + col.text.r) / 2, (col.bg.g + col.text.g) / 2, (col.bg.b + col.text.b) / 2) // icons
const num = 10 colors.link = rgb2hex(col.link.r, col.link.g, col.link.b) // links
times(num, (n) => { 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
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')
})
styleSheet.insertRule(`a { color: ${colors['base08']}`, 'index-max') colors.cBlue = col.cBlue && rgb2hex(col.cBlue.r, col.cBlue.g, col.cBlue.b)
styleSheet.insertRule(`body { color: ${colors['base05']}`, 'index-max') colors.cRed = col.cRed && rgb2hex(col.cRed.r, col.cRed.g, col.cRed.b)
styleSheet.insertRule(`.base05-border { border-color: ${colors['base05']}`, 'index-max') colors.cGreen = col.cGreen && rgb2hex(col.cGreen.r, col.cGreen.g, col.cGreen.b)
styleSheet.insertRule(`.base03-border { border-color: ${colors['base03']}`, 'index-max') colors.cOrange = col.cOrange && rgb2hex(col.cOrange.r, col.cOrange.g, col.cOrange.b)
colors.cAlertRed = col.cRed && `rgba(${col.cRed.r}, ${col.cRed.g}, ${col.cRed.b}, .5)`
console.log('OMGGGG')
console.log(JSON.stringify(col))
radii.btnRadius = col.btnRadius
radii.panelRadius = col.panelRadius
radii.avatarRadius = col.avatarRadius
radii.avatarAltRadius = col.avatarAltRadius
radii.tooltipRadius = col.tooltipRadius
radii.attachmentRadius = col.attachmentRadius
styleSheet.toString()
styleSheet.insertRule(`body { ${Object.entries(colors).filter(([k, v]) => v).map(([k, v]) => `--${k}: ${v}`).join(';')} }`, 'index-max')
styleSheet.insertRule(`body { ${Object.entries(radii).filter(([k, v]) => v).map(([k, v]) => `--${k}: ${v}px`).join(';')} }`, 'index-max')
body.style.display = 'initial' body.style.display = 'initial'
commit('setOption', { name: 'colors', value: colors }) commit('setOption', { name: 'colors', value: colors })
commit('setOption', { name: 'radii', value: radii })
commit('setOption', { name: 'customTheme', value: col }) commit('setOption', { name: 'customTheme', value: col })
} }
@ -111,12 +120,23 @@ const setPreset = (val, commit) => {
const fgRgb = hex2rgb(theme[2]) const fgRgb = hex2rgb(theme[2])
const textRgb = hex2rgb(theme[3]) const textRgb = hex2rgb(theme[3])
const linkRgb = hex2rgb(theme[4]) const linkRgb = hex2rgb(theme[4])
const cRedRgb = hex2rgb(theme[5] || '#FF0000')
const cGreenRgb = hex2rgb(theme[6] || '#00FF00')
const cBlueRgb = hex2rgb(theme[7] || '#0000FF')
const cOrangeRgb = hex2rgb(theme[8] || '#E3FF00')
const col = { const col = {
bg: bgRgb, bg: bgRgb,
fg: fgRgb, fg: fgRgb,
text: textRgb, text: textRgb,
link: linkRgb link: linkRgb,
cRed: cRedRgb,
cBlue: cBlueRgb,
cGreen: cGreenRgb,
cOrange: cOrangeRgb
} }
// This is a hack, this function is only called during initial load. // This is a hack, this function is only called during initial load.
// We want to cancel loading the theme from config.json if we're already // We want to cancel loading the theme from config.json if we're already
// loading a theme from the persisted state. // loading a theme from the persisted state.

View file

@ -95,6 +95,18 @@
"css": "logout", "css": "logout",
"code": 59400, "code": 59400,
"src": "fontawesome" "src": "fontawesome"
},
{
"uid": "ccddff8e8670dcd130e3cb55fdfc2fd0",
"css": "down-open",
"code": 59401,
"src": "fontawesome"
},
{
"uid": "44b9e75612c5fad5505edd70d071651f",
"css": "attach",
"code": 59402,
"src": "entypo"
} }
] ]
} }

View file

@ -8,13 +8,6 @@
animation: spin 2s infinite linear; animation: spin 2s infinite linear;
display: inline-block; display: inline-block;
} }
.animate-spin-slow {
-moz-animation: spin 4s infinite linear;
-o-animation: spin 4s infinite linear;
-webkit-animation: spin 4s infinite linear;
animation: spin 4s infinite linear;
display: inline-block;
}
@-moz-keyframes spin { @-moz-keyframes spin {
0% { 0% {
-moz-transform: rotate(0deg); -moz-transform: rotate(0deg);

View file

@ -8,6 +8,8 @@
.icon-plus-squared:before { content: '\e806'; } /* '' */ .icon-plus-squared:before { content: '\e806'; } /* '' */
.icon-cog:before { content: '\e807'; } /* '' */ .icon-cog:before { content: '\e807'; } /* '' */
.icon-logout:before { content: '\e808'; } /* '' */ .icon-logout:before { content: '\e808'; } /* '' */
.icon-down-open:before { content: '\e809'; } /* '' */
.icon-attach:before { content: '\e80a'; } /* '' */
.icon-spin3:before { content: '\e832'; } /* '' */ .icon-spin3:before { content: '\e832'; } /* '' */
.icon-spin4:before { content: '\e834'; } /* '' */ .icon-spin4:before { content: '\e834'; } /* '' */
.icon-menu:before { content: '\f0c9'; } /* '' */ .icon-menu:before { content: '\f0c9'; } /* '' */

File diff suppressed because one or more lines are too long

View file

@ -8,6 +8,8 @@
.icon-plus-squared { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe806;&nbsp;'); } .icon-plus-squared { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe806;&nbsp;'); }
.icon-cog { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe807;&nbsp;'); } .icon-cog { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe807;&nbsp;'); }
.icon-logout { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe808;&nbsp;'); } .icon-logout { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe808;&nbsp;'); }
.icon-down-open { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe809;&nbsp;'); }
.icon-attach { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80a;&nbsp;'); }
.icon-spin3 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe832;&nbsp;'); } .icon-spin3 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe832;&nbsp;'); }
.icon-spin4 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe834;&nbsp;'); } .icon-spin4 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe834;&nbsp;'); }
.icon-menu { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c9;&nbsp;'); } .icon-menu { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c9;&nbsp;'); }

View file

@ -19,6 +19,8 @@
.icon-plus-squared { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe806;&nbsp;'); } .icon-plus-squared { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe806;&nbsp;'); }
.icon-cog { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe807;&nbsp;'); } .icon-cog { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe807;&nbsp;'); }
.icon-logout { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe808;&nbsp;'); } .icon-logout { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe808;&nbsp;'); }
.icon-down-open { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe809;&nbsp;'); }
.icon-attach { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe80a;&nbsp;'); }
.icon-spin3 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe832;&nbsp;'); } .icon-spin3 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe832;&nbsp;'); }
.icon-spin4 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe834;&nbsp;'); } .icon-spin4 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xe834;&nbsp;'); }
.icon-menu { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c9;&nbsp;'); } .icon-menu { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = '&#xf0c9;&nbsp;'); }

View file

@ -1,11 +1,11 @@
@font-face { @font-face {
font-family: 'fontello'; font-family: 'fontello';
src: url('../font/fontello.eot?64848116'); src: url('../font/fontello.eot?73580499');
src: url('../font/fontello.eot?64848116#iefix') format('embedded-opentype'), src: url('../font/fontello.eot?73580499#iefix') format('embedded-opentype'),
url('../font/fontello.woff2?64848116') format('woff2'), url('../font/fontello.woff2?73580499') format('woff2'),
url('../font/fontello.woff?64848116') format('woff'), url('../font/fontello.woff?73580499') format('woff'),
url('../font/fontello.ttf?64848116') format('truetype'), url('../font/fontello.ttf?73580499') format('truetype'),
url('../font/fontello.svg?64848116#fontello') format('svg'); url('../font/fontello.svg?73580499#fontello') format('svg');
font-weight: normal; font-weight: normal;
font-style: normal; font-style: normal;
} }
@ -15,7 +15,7 @@
@media screen and (-webkit-min-device-pixel-ratio:0) { @media screen and (-webkit-min-device-pixel-ratio:0) {
@font-face { @font-face {
font-family: 'fontello'; font-family: 'fontello';
src: url('../font/fontello.svg?64848116#fontello') format('svg'); src: url('../font/fontello.svg?73580499#fontello') format('svg');
} }
} }
*/ */
@ -64,6 +64,8 @@
.icon-plus-squared:before { content: '\e806'; } /* '' */ .icon-plus-squared:before { content: '\e806'; } /* '' */
.icon-cog:before { content: '\e807'; } /* '' */ .icon-cog:before { content: '\e807'; } /* '' */
.icon-logout:before { content: '\e808'; } /* '' */ .icon-logout:before { content: '\e808'; } /* '' */
.icon-down-open:before { content: '\e809'; } /* '' */
.icon-attach:before { content: '\e80a'; } /* '' */
.icon-spin3:before { content: '\e832'; } /* '' */ .icon-spin3:before { content: '\e832'; } /* '' */
.icon-spin4:before { content: '\e834'; } /* '' */ .icon-spin4:before { content: '\e834'; } /* '' */
.icon-menu:before { content: '\f0c9'; } /* '' */ .icon-menu:before { content: '\f0c9'; } /* '' */

View file

@ -229,11 +229,11 @@ body {
} }
@font-face { @font-face {
font-family: 'fontello'; font-family: 'fontello';
src: url('./font/fontello.eot?1253892'); src: url('./font/fontello.eot?97388161');
src: url('./font/fontello.eot?1253892#iefix') format('embedded-opentype'), src: url('./font/fontello.eot?97388161#iefix') format('embedded-opentype'),
url('./font/fontello.woff?1253892') format('woff'), url('./font/fontello.woff?97388161') format('woff'),
url('./font/fontello.ttf?1253892') format('truetype'), url('./font/fontello.ttf?97388161') format('truetype'),
url('./font/fontello.svg?1253892#fontello') format('svg'); url('./font/fontello.svg?97388161#fontello') format('svg');
font-weight: normal; font-weight: normal;
font-style: normal; font-style: normal;
} }
@ -275,7 +275,7 @@ body {
/* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */ /* text-shadow: 1px 1px 1px rgba(127, 127, 127, 0.3); */
} }
</style> </style>
<link rel="stylesheet" href="css/animation.css"><!--[if IE 7]><link rel="stylesheet" href="css/fontello-ie7.css"><![endif]--> <link rel="stylesheet" href="css/animation.css"><!--[if IE 7]><link rel="stylesheet" href="css/" + font.fontname + "-ie7.css"><![endif]-->
<script> <script>
function toggleCodes(on) { function toggleCodes(on) {
var obj = document.getElementById('icons'); var obj = document.getElementById('icons');
@ -291,37 +291,38 @@ body {
</head> </head>
<body> <body>
<div class="container header"> <div class="container header">
<h1> <h1>fontello <small>font demo</small></h1>
fontello
<small>font demo</small>
</h1>
<label class="switch"> <label class="switch">
<input type="checkbox" onclick="toggleCodes(this.checked)">show codes <input type="checkbox" onclick="toggleCodes(this.checked)">show codes
</label> </label>
</div> </div>
<div id="icons" class="container"> <div class="container" id="icons">
<div class="row"> <div class="row">
<div title="Code: 0xe800" class="the-icons span3"><i class="demo-icon icon-cancel">&#xe800;</i> <span class="i-name">icon-cancel</span><span class="i-code">0xe800</span></div> <div class="the-icons span3" title="Code: 0xe800"><i class="demo-icon icon-cancel">&#xe800;</i> <span class="i-name">icon-cancel</span><span class="i-code">0xe800</span></div>
<div title="Code: 0xe801" class="the-icons span3"><i class="demo-icon icon-upload">&#xe801;</i> <span class="i-name">icon-upload</span><span class="i-code">0xe801</span></div> <div class="the-icons span3" title="Code: 0xe801"><i class="demo-icon icon-upload">&#xe801;</i> <span class="i-name">icon-upload</span><span class="i-code">0xe801</span></div>
<div title="Code: 0xe802" class="the-icons span3"><i class="demo-icon icon-star">&#xe802;</i> <span class="i-name">icon-star</span><span class="i-code">0xe802</span></div> <div class="the-icons span3" title="Code: 0xe802"><i class="demo-icon icon-star">&#xe802;</i> <span class="i-name">icon-star</span><span class="i-code">0xe802</span></div>
<div title="Code: 0xe803" class="the-icons span3"><i class="demo-icon icon-star-empty">&#xe803;</i> <span class="i-name">icon-star-empty</span><span class="i-code">0xe803</span></div> <div class="the-icons span3" title="Code: 0xe803"><i class="demo-icon icon-star-empty">&#xe803;</i> <span class="i-name">icon-star-empty</span><span class="i-code">0xe803</span></div>
</div> </div>
<div class="row"> <div class="row">
<div title="Code: 0xe804" class="the-icons span3"><i class="demo-icon icon-retweet">&#xe804;</i> <span class="i-name">icon-retweet</span><span class="i-code">0xe804</span></div> <div class="the-icons span3" title="Code: 0xe804"><i class="demo-icon icon-retweet">&#xe804;</i> <span class="i-name">icon-retweet</span><span class="i-code">0xe804</span></div>
<div title="Code: 0xe805" class="the-icons span3"><i class="demo-icon icon-eye-off">&#xe805;</i> <span class="i-name">icon-eye-off</span><span class="i-code">0xe805</span></div> <div class="the-icons span3" title="Code: 0xe805"><i class="demo-icon icon-eye-off">&#xe805;</i> <span class="i-name">icon-eye-off</span><span class="i-code">0xe805</span></div>
<div title="Code: 0xe806" class="the-icons span3"><i class="demo-icon icon-plus-squared">&#xe806;</i> <span class="i-name">icon-plus-squared</span><span class="i-code">0xe806</span></div> <div class="the-icons span3" title="Code: 0xe806"><i class="demo-icon icon-plus-squared">&#xe806;</i> <span class="i-name">icon-plus-squared</span><span class="i-code">0xe806</span></div>
<div title="Code: 0xe807" class="the-icons span3"><i class="demo-icon icon-cog">&#xe807;</i> <span class="i-name">icon-cog</span><span class="i-code">0xe807</span></div> <div class="the-icons span3" title="Code: 0xe807"><i class="demo-icon icon-cog">&#xe807;</i> <span class="i-name">icon-cog</span><span class="i-code">0xe807</span></div>
</div> </div>
<div class="row"> <div class="row">
<div title="Code: 0xe808" class="the-icons span3"><i class="demo-icon icon-logout">&#xe808;</i> <span class="i-name">icon-logout</span><span class="i-code">0xe808</span></div> <div class="the-icons span3" title="Code: 0xe808"><i class="demo-icon icon-logout">&#xe808;</i> <span class="i-name">icon-logout</span><span class="i-code">0xe808</span></div>
<div title="Code: 0xe832" class="the-icons span3"><i class="demo-icon icon-spin3 animate-spin">&#xe832;</i> <span class="i-name">icon-spin3</span><span class="i-code">0xe832</span></div> <div class="the-icons span3" title="Code: 0xe809"><i class="demo-icon icon-down-open">&#xe809;</i> <span class="i-name">icon-down-open</span><span class="i-code">0xe809</span></div>
<div title="Code: 0xe834" class="the-icons span3"><i class="demo-icon icon-spin4 animate-spin">&#xe834;</i> <span class="i-name">icon-spin4</span><span class="i-code">0xe834</span></div> <div class="the-icons span3" title="Code: 0xe80a"><i class="demo-icon icon-attach">&#xe80a;</i> <span class="i-name">icon-attach</span><span class="i-code">0xe80a</span></div>
<div title="Code: 0xf0c9" class="the-icons span3"><i class="demo-icon icon-menu">&#xf0c9;</i> <span class="i-name">icon-menu</span><span class="i-code">0xf0c9</span></div> <div class="the-icons span3" title="Code: 0xe832"><i class="demo-icon icon-spin3 animate-spin">&#xe832;</i> <span class="i-name">icon-spin3</span><span class="i-code">0xe832</span></div>
</div> </div>
<div class="row"> <div class="row">
<div title="Code: 0xf112" class="the-icons span3"><i class="demo-icon icon-reply">&#xf112;</i> <span class="i-name">icon-reply</span><span class="i-code">0xf112</span></div> <div class="the-icons span3" title="Code: 0xe834"><i class="demo-icon icon-spin4 animate-spin">&#xe834;</i> <span class="i-name">icon-spin4</span><span class="i-code">0xe834</span></div>
<div title="Code: 0xf1e5" class="the-icons span3"><i class="demo-icon icon-binoculars">&#xf1e5;</i> <span class="i-name">icon-binoculars</span><span class="i-code">0xf1e5</span></div> <div class="the-icons span3" title="Code: 0xf0c9"><i class="demo-icon icon-menu">&#xf0c9;</i> <span class="i-name">icon-menu</span><span class="i-code">0xf0c9</span></div>
<div title="Code: 0xf234" class="the-icons span3"><i class="demo-icon icon-user-plus">&#xf234;</i> <span class="i-name">icon-user-plus</span><span class="i-code">0xf234</span></div> <div class="the-icons span3" title="Code: 0xf112"><i class="demo-icon icon-reply">&#xf112;</i> <span class="i-name">icon-reply</span><span class="i-code">0xf112</span></div>
<div class="the-icons span3" title="Code: 0xf1e5"><i class="demo-icon icon-binoculars">&#xf1e5;</i> <span class="i-name">icon-binoculars</span><span class="i-code">0xf1e5</span></div>
</div>
<div class="row">
<div class="the-icons span3" title="Code: 0xf234"><i class="demo-icon icon-user-plus">&#xf234;</i> <span class="i-name">icon-user-plus</span><span class="i-code">0xf234</span></div>
</div> </div>
</div> </div>
<div class="container footer">Generated by <a href="http://fontello.com">fontello.com</a></div> <div class="container footer">Generated by <a href="http://fontello.com">fontello.com</a></div>

Binary file not shown.

View file

@ -1,7 +1,7 @@
<?xml version="1.0" standalone="no"?> <?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg xmlns="http://www.w3.org/2000/svg"> <svg xmlns="http://www.w3.org/2000/svg">
<metadata>Copyright (C) 2017 by original authors @ fontello.com</metadata> <metadata>Copyright (C) 2018 by original authors @ fontello.com</metadata>
<defs> <defs>
<font id="fontello" horiz-adv-x="1000" > <font id="fontello" horiz-adv-x="1000" >
<font-face font-family="fontello" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" /> <font-face font-family="fontello" font-weight="400" font-stretch="normal" units-per-em="1000" ascent="850" descent="-150" />
@ -24,6 +24,10 @@
<glyph glyph-name="logout" unicode="&#xe808;" d="M357 46q0-2 1-11t0-14-2-14-5-11-12-3h-178q-67 0-114 47t-47 114v392q0 67 47 114t114 47h178q8 0 13-5t5-13q0-2 1-11t0-15-2-13-5-11-12-3h-178q-37 0-63-26t-27-64v-392q0-37 27-63t63-27h174t6 0 7-2 4-3 4-5 1-8z m518 304q0-14-11-25l-303-304q-11-10-25-10t-25 10-11 25v161h-250q-14 0-25 11t-11 25v214q0 15 11 25t25 11h250v161q0 14 11 25t25 10 25-10l303-304q11-10 11-25z" horiz-adv-x="928.6" /> <glyph glyph-name="logout" unicode="&#xe808;" d="M357 46q0-2 1-11t0-14-2-14-5-11-12-3h-178q-67 0-114 47t-47 114v392q0 67 47 114t114 47h178q8 0 13-5t5-13q0-2 1-11t0-15-2-13-5-11-12-3h-178q-37 0-63-26t-27-64v-392q0-37 27-63t63-27h174t6 0 7-2 4-3 4-5 1-8z m518 304q0-14-11-25l-303-304q-11-10-25-10t-25 10-11 25v161h-250q-14 0-25 11t-11 25v214q0 15 11 25t25 11h250v161q0 14 11 25t25 10 25-10l303-304q11-10 11-25z" horiz-adv-x="928.6" />
<glyph glyph-name="down-open" unicode="&#xe809;" d="M939 399l-414-413q-10-11-25-11t-25 11l-414 413q-11 11-11 26t11 25l93 92q10 11 25 11t25-11l296-296 296 296q11 11 25 11t26-11l92-92q11-11 11-25t-11-26z" horiz-adv-x="1000" />
<glyph glyph-name="attach" unicode="&#xe80a;" d="M244-140q-102 0-170 72-72 70-74 166t84 190l496 496q80 80 174 54 44-12 79-47t47-79q26-96-54-176l-474-474q-40-40-88-46-48-4-80 28-30 24-27 74t47 92l332 334q24 26 50 0t0-50l-332-332q-44-44-20-70 12-8 24-6 24 4 46 26l474 474q50 50 34 108-16 60-76 76-54 14-108-36l-494-494q-66-76-64-143t52-117q50-48 117-50t141 62l496 494q24 24 50 0 26-22 0-48l-496-496q-82-82-186-82z" horiz-adv-x="939" />
<glyph glyph-name="spin3" unicode="&#xe832;" d="M494 850c-266 0-483-210-494-472-1-19 13-20 13-20l84 0c16 0 19 10 19 18 10 199 176 358 378 358 107 0 205-45 273-118l-58-57c-11-12-11-27 5-31l247-50c21-5 46 11 37 44l-58 227c-2 9-16 22-29 13l-65-60c-89 91-214 148-352 148z m409-508c-16 0-19-10-19-18-10-199-176-358-377-358-108 0-205 45-274 118l59 57c10 12 10 27-5 31l-248 50c-21 5-46-11-37-44l58-227c2-9 16-22 30-13l64 60c89-91 214-148 353-148 265 0 482 210 493 473 1 18-13 19-13 19l-84 0z" horiz-adv-x="1000" /> <glyph glyph-name="spin3" unicode="&#xe832;" d="M494 850c-266 0-483-210-494-472-1-19 13-20 13-20l84 0c16 0 19 10 19 18 10 199 176 358 378 358 107 0 205-45 273-118l-58-57c-11-12-11-27 5-31l247-50c21-5 46 11 37 44l-58 227c-2 9-16 22-29 13l-65-60c-89 91-214 148-352 148z m409-508c-16 0-19-10-19-18-10-199-176-358-377-358-108 0-205 45-274 118l59 57c10 12 10 27-5 31l-248 50c-21 5-46-11-37-44l58-227c2-9 16-22 30-13l64 60c89-91 214-148 353-148 265 0 482 210 493 473 1 18-13 19-13 19l-84 0z" horiz-adv-x="1000" />
<glyph glyph-name="spin4" unicode="&#xe834;" d="M498 850c-114 0-228-39-320-116l0 0c173 140 428 130 588-31 134-134 164-332 89-495-10-29-5-50 12-68 21-20 61-23 84 0 3 3 12 15 15 24 71 180 33 393-112 539-99 98-228 147-356 147z m-409-274c-14 0-29-5-39-16-3-3-13-15-15-24-71-180-34-393 112-539 185-185 479-195 676-31l0 0c-173-140-428-130-589 31-134 134-163 333-89 495 11 29 6 50-12 68-11 11-27 17-44 16z" horiz-adv-x="1001" /> <glyph glyph-name="spin4" unicode="&#xe834;" d="M498 850c-114 0-228-39-320-116l0 0c173 140 428 130 588-31 134-134 164-332 89-495-10-29-5-50 12-68 21-20 61-23 84 0 3 3 12 15 15 24 71 180 33 393-112 539-99 98-228 147-356 147z m-409-274c-14 0-29-5-39-16-3-3-13-15-15-24-71-180-34-393 112-539 185-185 479-195 676-31l0 0c-173-140-428-130-589 31-134 134-163 333-89 495 11 29 6 50-12 68-11 11-27 17-44 16z" horiz-adv-x="1001" />

Before

Width:  |  Height:  |  Size: 7 KiB

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -1,9 +1,9 @@
{ {
"pleroma-dark": [ "Pleroma Dark", "#121a24", "#182230", "#b9b9ba", "#d8a070" ], "pleroma-dark": [ "Pleroma Dark", "#121a24", "#182230", "#b9b9ba", "#d8a070", "#d31014", "#0fa00f", "#0095ff", "#ffa500" ],
"pleroma-light": [ "Pleroma Light", "#f2f4f6", "#dbe0e8", "#304055", "#f86f0f" ], "pleroma-light": [ "Pleroma Light", "#f2f4f6", "#dbe0e8", "#304055", "#f86f0f", "#d31014", "#0fa00f", "#0095ff", "#ffa500" ],
"classic-dark": [ "Classic Dark", "#161c20", "#282e32", "#b9b9b9", "#baaa9c" ], "classic-dark": [ "Classic Dark", "#161c20", "#282e32", "#b9b9b9", "#baaa9c", "#d31014", "#0fa00f", "#0095ff", "#ffa500" ],
"bird": [ "Bird", "#f8fafd", "#e6ecf0", "#14171a", "#0084b8"], "bird": [ "Bird", "#f8fafd", "#e6ecf0", "#14171a", "#0084b8", "#e0245e", "#17bf63", "#1b95e0", "#fab81e"],
"ir-black": [ "Ir Black", "#000000", "#242422", "#b5b3aa", "#ff6c60" ], "ir-black": [ "Ir Black", "#000000", "#242422", "#b5b3aa", "#ff6c60", "#FF6C60", "#A8FF60", "#96CBFE", "#FFFFB6" ],
"monokai": [ "Monokai", "#272822", "#383830", "#f8f8f2", "#f92672" ], "monokai": [ "Monokai", "#272822", "#383830", "#f8f8f2", "#f92672", "#F92672", "#a6e22e", "#66d9ef", "#f4bf75" ],
"mammal": [ "Mammal", "#272c37", "#444b5d", "#f8f8f8", "#9bacc8" ] "mammal": [ "Mammal", "#272c37", "#444b5d", "#f8f8f8", "#9bacc8", "#7f3142", "#2bd850", "#2b90d9", "#ca8f04" ]
} }