diff options
Diffstat (limited to 'src')
34 files changed, 1694 insertions, 1241 deletions
diff --git a/src/App.scss b/src/App.scss index 95a653ce..e4b02017 100644 --- a/src/App.scss +++ b/src/App.scss @@ -1,10 +1,11 @@ @import './_variables.scss'; + #app { - background-size: cover; - background-attachment: fixed; - background-repeat: no-repeat; - background-position: 0 50px; - min-height: 100vh; + background-size: cover; + background-attachment: fixed; + background-repeat: no-repeat; + background-position: 0 50px; + min-height: 100vh; } i { @@ -12,7 +13,7 @@ i { } h4 { - margin: 0; + margin: 0; } #content { @@ -26,154 +27,280 @@ h4 { } .text-center { - text-align: center; + text-align: center; } body { - font-family: sans-serif; - font-size: 14px; - margin: 0; + font-family: sans-serif; + font-size: 14px; + margin: 0; + color: $fallback--fg; + color: var(--fg, $fallback--fg); } a { - text-decoration: none; + text-decoration: none; + color: $fallback--link; + color: var(--link, $fallback--link); } button{ - user-select: none; + user-select: none; + color: $fallback--faint; + color: var(--faint, $fallback--faint); + background-color: $fallback--btn; + background-color: var(--btn, $fallback--btn); + border: none; + border-radius: $fallback--btnRadius; + border-radius: var(--btnRadius, $fallback--btnRadius); + 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 { + box-shadow: 0px 0px 4px rgba(255, 255, 255, 0.3); + } + + &:disabled { + cursor: not-allowed; + opacity: 0.5; + } + + &.pressed { + color: $fallback--faint; + color: var(--faint, $fallback--faint); + background-color: $fallback--bg; + background-color: var(--bg, $fallback--bg) + } +} + +label.select { + padding: 0; + +} + +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; - border-radius: 5px; - 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 { - box-shadow: 0px 0px 4px rgba(255, 255, 255, 0.3); - } + margin: 0; + color: $fallback--fg; + color: var(--fg, $fallback--fg); + padding: 4px 2em 3px 3px; + width: 100%; + z-index: 1; + height: 29px; + line-height: 16px; + } - &:disabled { - cursor: not-allowed; - opacity: 0.5; + &[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; + display: flex; + flex-wrap: wrap; + margin: 0; + padding: 0 10px 0 10px; } .gaps { - margin: -1em 0 0 -1em; + margin: -1em 0 0 -1em; } .item { - flex: 1; - line-height: 21px; - height: 21px; - overflow: hidden; + flex: 1; + line-height: 50px; + height: 50px; + overflow: hidden; - .nav-icon { - font-size: 1.1em; - margin-left: 0.4em; - } + .nav-icon { + font-size: 1.1em; + margin-left: 0.4em; + } } .gaps > .item { - padding: 1em 0 0 1em; + padding: 1em 0 0 1em; } .auto-size { - flex: 1 + flex: 1 } nav { - width: 100%; + width: 100%; + align-items: center; + position: fixed; + height: 50px; + + .inner-nav { + padding-left: 20px; + padding-right: 20px; + display: flex; align-items: center; - position: fixed; + flex-basis: 970px; + margin: auto; height: 50px; + background-repeat: no-repeat; + background-position: center; + background-size: auto 80%; - .inner-nav { - padding-left: 20px; - padding-right: 20px; - display: flex; - align-items: center; - flex-basis: 970px; - margin: auto; - height: 50px; - background-repeat: no-repeat; - background-position: center; - background-size: contain; + a i { + color: $fallback--link; + color: var(--link, $fallback--link); } + } } main-router { - flex: 1; + flex: 1; } .status.compact { - color: rgba(0, 0, 0, 0.42); - font-weight: 300; + color: rgba(0, 0, 0, 0.42); + font-weight: 300; - p { - margin: 0; - font-size: 0.8em - } + p { + margin: 0; + font-size: 0.8em + } } /* Panel */ .panel { - display: flex; - flex-direction: column; - margin: 0.5em; + display: flex; + flex-direction: column; + margin: 0.5em; - border-radius: 10px; - box-shadow: 1px 1px 4px rgba(0,0,0,.6); - overflow: hidden; + background-color: $fallback--bg; + background-color: var(--bg, $fallback--bg); + + 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 { - content: "¯\\_(ツ)_/¯"; // Could use words but it'd require translations - display: block; - margin: 1em; - text-align: center; + content: "¯\\_(ツ)_/¯"; // Could use words but it'd require translations + display: block; + margin: 1em; + text-align: center; } .panel-heading { - border-radius: 10px 10px 0 0; - background-size: cover; - padding: 0.6em 1.0em; - text-align: left; - font-size: 1.3em; - line-height: 24px; + border-radius: $fallback--panelRadius $fallback--panelRadius 0 0; + border-radius: var(--panelRadius, $fallback--panelRadius) var(--panelRadius, $fallback--panelRadius) 0 0; + background-size: cover; + padding: 0.6em 1.0em; + text-align: left; + font-size: 1.3em; + line-height: 24px; + background-color: $fallback--btn; + background-color: var(--btn, $fallback--btn); } .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 { - line-height: 18px; - padding: 1em; - margin: 0; + line-height: 18px; + padding: 1em; + margin: 0; } .container > * { - min-width: 0px; + min-width: 0px; } .fa { - color: grey; + color: grey; } nav { - z-index: 1000; - box-shadow: 0px 0px 4px rgba(0,0,0,.6); + z-index: 1000; + 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 { @@ -184,9 +311,9 @@ nav { } .main { - flex-basis: 60%; - flex-grow: 1; - flex-shrink: 1; + flex-basis: 60%; + flex-grow: 1; + flex-shrink: 1; } .sidebar-bounds { @@ -201,20 +328,20 @@ nav { } .mobile-shown { - display: none; + display: none; } .panel-switcher { - display: none; - width: 100%; - height: 46px; - button { - display: block; - flex: 1; - max-height: 32px; - margin: 0.5em; - padding: 0.5em; - } + display: none; + width: 100%; + height: 46px; + button { + display: block; + flex: 1; + max-height: 32px; + margin: 0.5em; + padding: 0.5em; + } } @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) { - .mobile-hidden { - display: none; - } + .mobile-hidden { + display: none; + } - .panel-switcher { - display: flex; - } + .panel-switcher { + display: flex; + } - .container { - padding: 0 0 0 0; - } + .container { + padding: 0 0 0 0; + } - .panel { - margin: 0.5em 0 0.5em 0; - } + .panel { + margin: 0.5em 0 0.5em 0; + } } .item.right { - text-align: right; - padding-right: 20px; + text-align: right; + padding-right: 20px; } diff --git a/src/App.vue b/src/App.vue index 2a910bc0..051c601d 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,6 +1,6 @@ <template> - <div id="app" v-bind:style="style" class="base02-background"> - <nav class='container base02-background base05' @click="scrollToTop()" id="nav"> + <div id="app" v-bind:style="style"> + <nav class='container' @click="scrollToTop()" id="nav"> <div class='inner-nav' :style="logoStyle"> <div class='item'> <router-link :to="{ name: 'root'}">{{sitename}}</router-link> @@ -14,8 +14,8 @@ </nav> <div class="container" id="content"> <div class="panel-switcher"> - <button @click="activatePanel('sidebar')" class="base02-background base05">Sidebar</button> - <button @click="activatePanel('timeline')" class="base02-background base05">Timeline</button> + <button @click="activatePanel('sidebar')">Sidebar</button> + <button @click="activatePanel('timeline')">Timeline</button> </div> <div class="sidebar-flexer" :class="{ 'mobile-hidden': mobileActivePanel != 'sidebar'}"> <div class="sidebar-bounds"> diff --git a/src/_variables.scss b/src/_variables.scss index d2b7065d..d90a1d48 100644 --- a/src/_variables.scss +++ b/src/_variables.scss @@ -1,7 +1,27 @@ $main-color: #f58d2c; $main-background: white; $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; diff --git a/src/components/attachment/attachment.vue b/src/components/attachment/attachment.vue index a1b35d91..04f6add4 100644 --- a/src/components/attachment/attachment.vue +++ b/src/components/attachment/attachment.vue @@ -1,5 +1,5 @@ <template> - <div class="attachment base03-border" :class="{[type]: true, loading}" v-show="!isEmpty"> + <div class="attachment" :class="{[type]: true, loading}" v-show="!isEmpty"> <a class="image-attachment" v-if="hidden" @click.prevent="toggleHidden()"> <img :key="nsfwImage" :src="nsfwImage"/> </a> @@ -8,10 +8,10 @@ </div> <a v-if="type === 'image' && !hidden" class="image-attachment" :href="attachment.url" target="_blank"> - <StillImage class="base03-border" referrerpolicy="no-referrer" :mimetype="attachment.mimetype" :src="attachment.large_thumb_url || attachment.url"/> + <StillImage referrerpolicy="no-referrer" :mimetype="attachment.mimetype" :src="attachment.large_thumb_url || attachment.url"/> </a> - <video class="base03" v-if="type === 'video' && !hidden" :src="attachment.url" controls loop></video> + <video v-if="type === 'video' && !hidden" :src="attachment.url" controls loop></video> <audio v-if="type === 'audio'" :src="attachment.url" controls></audio> @@ -30,115 +30,121 @@ <script src="./attachment.js"></script> <style lang="scss"> - .attachments { +@import '../../_variables.scss'; + +.attachments { + display: flex; + flex-wrap: wrap; + margin-right: -0.7em; + + .attachment.media-upload-container { + flex: 0 0 auto; + max-height: 300px; + max-width: 100%; + line-height: 0; + + video { + max-height: 300px; + } + } + + .attachment { + flex: 1 0 30%; + margin: 0.5em 0.7em 0.6em 0.0em; + align-self: flex-start; + border-color: $fallback--border; + border-color: var(--border, $fallback--border); + + border-style: solid; + border-width: 1px; + border-radius: $fallback--attachmentRadius; + border-radius: var(--attachmentRadius, $fallback--attachmentRadius); + overflow: hidden; + + // fixes small gap below video + &.video { + line-height: 0; + } + + &.html { + flex-basis: 90%; + width: 100%; display: flex; - flex-wrap: wrap; - margin-right: -0.7em; + } + + &.loading { + cursor: progress; + } + + .hider { + position: absolute; + margin: 10px; + padding: 5px; + background: rgba(230,230,230,0.6); + font-weight: bold; + z-index: 4; + } + + 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%; + } - .attachment.media-upload-container { - flex: 0 0 auto; - max-height: 300px; - max-width: 100%; + .image { + flex: 1; + img { + border: 0px; + border-radius: $fallback--attachmentRadius; + border-radius: var(--attachmentRadius, $fallback--attachmentRadius); + height: 100%; + object-fit: cover; + } } - - .attachment { - 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: 5px; - 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; - } - - 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; - height: 100%; - object-fit: cover; - } - } - - .text { - flex: 2; - margin: 8px; - word-break: break-all; - h1 { - font-size: 14px; - margin: 0px; - } - } - } - - a.image-attachment { - display: flex; - flex: 1; - - .still-image { - width: 100%; - height: 100%; - } - - 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; - } - } + + .text { + flex: 2; + margin: 8px; + word-break: break-all; + h1 { + font-size: 14px; + margin: 0px; + } + } + } + + a.image-attachment { + display: flex; + flex: 1; + + 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> diff --git a/src/components/chat_panel/chat_panel.vue b/src/components/chat_panel/chat_panel.vue index ec379db5..50bd0017 100644 --- a/src/components/chat_panel/chat_panel.vue +++ b/src/components/chat_panel/chat_panel.vue @@ -1,7 +1,7 @@ <template> <div class="chat-panel"> - <div class="panel panel-default base01-background"> - <div class="panel-heading timeline-heading base02-background base04"> + <div class="panel panel-default"> + <div class="panel-heading timeline-heading"> <div class="title"> {{$t('chat.title')}} </div> @@ -29,30 +29,36 @@ <script src="./chat_panel.js"></script> <style lang="scss"> - .chat-window { - max-height: 200px; - overflow-y: auto; - overflow-x: hidden; - } - .chat-message { - padding: 0.2em 0.5em - } - .chat-avatar { - img { - height: 32px; - width: 32px; - border-radius: 5px; - margin-right: 0.5em; - } - } - .chat-input { - display: flex; - form { - flex: auto; - input { - margin: 0.5em; - width: fill-available; - } - } - } +@import '../../_variables.scss'; + +.chat-window { + max-height: 200px; + overflow-y: auto; + overflow-x: hidden; +} + +.chat-message { + padding: 0.2em 0.5em +} + +.chat-avatar { + img { + height: 32px; + width: 32px; + border-radius: $fallback--avatarRadius; + border-radius: var(--avatarRadius, $fallback--avatarRadius); + margin-right: 0.5em; + } +} + +.chat-input { + display: flex; + form { + flex: auto; + input { + margin: 0.5em; + width: fill-available; + } + } +} </style> diff --git a/src/components/conversation/conversation.vue b/src/components/conversation/conversation.vue index 60d43fff..2ff122c2 100644 --- a/src/components/conversation/conversation.vue +++ b/src/components/conversation/conversation.vue @@ -1,6 +1,6 @@ <template> <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') }} <span v-if="collapsable" style="float:right;"> <small><a href="#" @click.prevent="$emit('toggleExpanded')">Collapse</a></small> diff --git a/src/components/delete_button/delete_button.vue b/src/components/delete_button/delete_button.vue index 845ac777..d13547e2 100644 --- a/src/components/delete_button/delete_button.vue +++ b/src/components/delete_button/delete_button.vue @@ -1,20 +1,21 @@ <template> <div v-if="canDelete"> <a href="#" v-on:click.prevent="deleteStatus()"> - <i class='base09 icon-cancel delete-status'></i> + <i class='icon-cancel delete-status'></i> </a> </div> </template> <script src="./delete_button.js" ></script> -<style lang='scss'> - @import '../../_variables.scss'; +<style lang="scss"> +@import '../../_variables.scss'; - .icon-cancel,.delete-status { - cursor: pointer; - &:hover { - color: $red; - } +.icon-cancel,.delete-status { + cursor: pointer; + &:hover { + color: var(--cRed, $fallback--cRed); + color: $fallback--cRed; } +} </style> diff --git a/src/components/favorite_button/favorite_button.vue b/src/components/favorite_button/favorite_button.vue index 65d368c7..1e1a6970 100644 --- a/src/components/favorite_button/favorite_button.vue +++ b/src/components/favorite_button/favorite_button.vue @@ -1,26 +1,31 @@ <template> <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> </div> <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> </div> </template> <script src="./favorite_button.js" ></script> -<style lang='scss'> - .fav-active { - cursor: pointer; - animation-duration: 0.6s; - &:hover { - color: orange; - } - } - .favorite-button.icon-star { - color: orange; +<style lang="scss"> +@import '../../_variables.scss'; + +.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> diff --git a/src/components/instance_specific_panel/instance_specific_panel.vue b/src/components/instance_specific_panel/instance_specific_panel.vue index b3ea019d..ca8e00c0 100644 --- a/src/components/instance_specific_panel/instance_specific_panel.vue +++ b/src/components/instance_specific_panel/instance_specific_panel.vue @@ -1,6 +1,6 @@ <template> <div class="instance-specific-panel"> - <div class="panel panel-default base01-background"> + <div class="panel panel-default"> <div class="panel-body"> <div v-html="instanceSpecificPanelContent"> </div> diff --git a/src/components/login_form/login_form.vue b/src/components/login_form/login_form.vue index c293d611..67fa95a8 100644 --- a/src/components/login_form/login_form.vue +++ b/src/components/login_form/login_form.vue @@ -1,7 +1,7 @@ <template> - <div class="login panel panel-default base00-background"> + <div class="login panel panel-default"> <!-- Default panel contents --> - <div class="panel-heading base02-background base04"> + <div class="panel-heading"> {{$t('login.login')}} </div> <div class="panel-body"> @@ -17,11 +17,11 @@ <div class='form-group'> <div class='login-bottom'> <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 v-if="authError" class='form-group'> - <div class='error base05'>{{authError}}</div> + <div class='alert error'>{{authError}}</div> </div> </form> </div> @@ -31,27 +31,16 @@ <script src="./login_form.js" ></script> <style lang="scss"> +@import '../../_variables.scss'; .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 { min-height: 28px; width: 10em; } .error { - border-radius: 5px; text-align: center; - background-color: rgba(255, 48, 16, 0.65); - min-height: 28px; - line-height: 28px; } .register { @@ -66,5 +55,4 @@ justify-content: space-between; } } - </style> diff --git a/src/components/media_upload/media_upload.vue b/src/components/media_upload/media_upload.vue index 9e6ad608..8b931d2d 100644 --- a/src/components/media_upload/media_upload.vue +++ b/src/components/media_upload/media_upload.vue @@ -1,8 +1,8 @@ <template> <div class="media-upload" @drop.prevent @dragover.prevent="fileDrag" @drop="fileDrop"> <label class="btn btn-default"> - <i class="base09 icon-spin4 animate-spin" v-if="uploading"></i> - <i class="base09 icon-upload" v-if="!uploading"></i> + <i class="icon-spin4 animate-spin" v-if="uploading"></i> + <i class="icon-upload" v-if="!uploading"></i> <input type=file style="position: fixed; top: -100em"></input> </label> </div> diff --git a/src/components/nav_panel/nav_panel.vue b/src/components/nav_panel/nav_panel.vue index aea841e9..5db3f555 100644 --- a/src/components/nav_panel/nav_panel.vue +++ b/src/components/nav_panel/nav_panel.vue @@ -1,24 +1,24 @@ <template> <div class="nav-panel"> - <div class="panel panel-default base01-background"> - <ul class="base03-border"> + <div class="panel panel-default"> + <ul> <li v-if='currentUser'> - <router-link class="base00-background" to='/main/friends'> + <router-link to='/main/friends'> {{ $t("nav.timeline") }} </router-link> </li> <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") }} </router-link> </li> <li> - <router-link class="base00-background" to='/main/public'> + <router-link to='/main/public'> {{ $t("nav.public_tl") }} </router-link> </li> <li> - <router-link class="base00-background" to='/main/all'> + <router-link to='/main/all'> {{ $t("nav.twkn") }} </router-link> </li> @@ -30,43 +30,58 @@ <script src="./nav_panel.js" ></script> <style lang="scss"> - .nav-panel ul { - list-style: none; - margin: 0; - padding: 0; - } +@import '../../_variables.scss'; - .nav-panel li { - border-bottom: 1px solid; - border-color: inherit; - 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 ul { + list-style: none; + margin: 0; + padding: 0; +} - .nav-panel li:last-child { - border: none; - } +.nav-panel li { + 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 { - display: block; - padding: 0.8em 0.85em; - &:hover { - background-color: transparent; - } - &.router-link-active { - font-weight: bolder; - background-color: transparent; - &:hover { - text-decoration: underline; - } - } - } + &:first-child a { + border-top-right-radius: $fallback--panelRadius; + border-top-right-radius: var(--panelRadius, $fallback--panelRadius); + border-top-left-radius: $fallback--panelRadius; + border-top-left-radius: var(--panelRadius, $fallback--panelRadius); + } + &: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> diff --git a/src/components/notifications/notifications.js b/src/components/notifications/notifications.js index e9b83bf0..e55c6e24 100644 --- a/src/components/notifications/notifications.js +++ b/src/components/notifications/notifications.js @@ -24,11 +24,6 @@ const Notifications = { }, unseenCount () { return this.unseenNotifications.length - }, - hiderStyle () { - return { - background: `linear-gradient(to bottom, rgba(0, 0, 0, 0), ${this.$store.state.config.colors['base00']} 80%)` - } } }, components: { diff --git a/src/components/notifications/notifications.scss b/src/components/notifications/notifications.scss index 3c500b36..3b7403e4 100644 --- a/src/components/notifications/notifications.scss +++ b/src/components/notifications/notifications.scss @@ -4,21 +4,40 @@ // a bit of a hack to allow scrolling below notifications 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 { // force the text to stay centered, while keeping // the button in the right side of the panel heading position: relative; + background: $fallback--btn; + background: var(--btn, $fallback--btn); + color: $fallback--faint; + color: var(--faint, $fallback--faint); .read-button { position: absolute; right: 0.7em; height: 1.8em; line-height: 100%; + background-color: $fallback--btn; + background-color: var(--btn, $fallback--btn); + color: $fallback--faint; + color: var(--faint, $fallback--faint); } } .unseen-count { 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); min-width: 1.3em; border-radius: 1.3em; @@ -27,6 +46,7 @@ font-size: 0.9em; text-align: center; line-height: 1.3em; + padding: 1px; } .notification { @@ -39,6 +59,14 @@ border-bottom: 1px solid; border-bottom-color: inherit; + .notification-gradient { + 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%) + } + + time { + white-space: nowrap; + } .text { min-width: 0px; @@ -48,19 +76,24 @@ overflow: hidden; .icon-retweet.lit { - color: $green; + color: $fallback--cGreen; + color: var(--cGreen, $fallback--cGreen); } .icon-user-plus.lit { - color: $blue; + color: $fallback--cBlue; + color: var(--cBlue, $fallback--cBlue); } .icon-reply.lit { - color: $blue; + color: $fallback--cBlue; + color: var(--cBlue, $fallback--cBlue); } .icon-star.lit { color: orange; + color: $fallback--cOrange; + color: var(--cOrange, $fallback--cOrange); } .status-content { @@ -91,7 +124,8 @@ margin-top: 0.3em; width: 32px; height: 32px; - border-radius: 50%; + border-radius: $fallback--avatarAltRadius; + border-radius: var(--avatarAltRadius, $fallback--avatarAltRadius); overflow: hidden; line-height: 0; @@ -112,7 +146,6 @@ &:last-child { border-bottom: none; - border-radius: 0 0 10px 10px; } } @@ -134,7 +167,8 @@ } .unseen { - border-left: 4px solid rgba(255, 16, 8, 0.75); + border-left: 4px solid $fallback--cRed; + border-left: 4px solid var(--cRed, $fallback--cRed); padding-left: 6px; } } diff --git a/src/components/notifications/notifications.vue b/src/components/notifications/notifications.vue index 8e6f12b2..17bae71e 100644 --- a/src/components/notifications/notifications.vue +++ b/src/components/notifications/notifications.vue @@ -1,12 +1,12 @@ <template> <div class="notifications"> - <div class="panel panel-default base00-background"> - <div class="panel-heading base02-background base04"> + <div class="panel panel-default"> + <div class="panel-heading"> <span class="unseen-count" v-if="unseenCount">{{unseenCount}}</span> {{$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 class="panel-body base03-border"> + <div class="panel-body"> <div v-for="notification in visibleNotifications" :key="notification" class="notification" :class='{"unseen": !notification.seen}'> <div> <a :href="notification.action.user.statusnet_profile_url" target="_blank"> @@ -20,7 +20,7 @@ <i class="fa icon-star lit"></i> <small><router-link :to="{ name: 'conversation', params: { id: notification.status.id } }"><timeago :since="notification.action.created_at" :auto-update="240"></timeago></router-link></small> </h1> - <div class="notification-gradient" :style="hiderStyle"></div> + <div class="notification-gradient"></div> <div class="notification-content" v-html="notification.status.statusnet_html"></div> </div> <div v-if="notification.type === 'repeat'"> @@ -29,7 +29,7 @@ <i class="fa icon-retweet lit"></i> <small><router-link :to="{ name: 'conversation', params: { id: notification.status.id } }"><timeago :since="notification.action.created_at" :auto-update="240"></timeago></router-link></small> </h1> - <div class="notification-gradient" :style="hiderStyle"></div> + <div class="notification-gradient"></div> <div class="notification-content" v-html="notification.status.statusnet_html"></div> </div> <div v-if="notification.type === 'mention'"> diff --git a/src/components/post_status_form/post_status_form.vue b/src/components/post_status_form/post_status_form.vue index 4871bcae..a3b8acde 100644 --- a/src/components/post_status_form/post_status_form.vue +++ b/src/components/post_status_form/post_status_form.vue @@ -1,21 +1,21 @@ <template> <div class="post-status-form"> <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> </div> <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-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-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 v-else class="autocomplete base04"> + <div v-else class="autocomplete"> <span v-if="candidate.img"><img :src="candidate.img"></img></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> @@ -24,18 +24,18 @@ <media-upload @uploading="disableSubmit" @uploaded="addMediaFile" @upload-failed="enableSubmit" :drop-files="dropFiles"></media-upload> <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-else-if="isOverLengthLimit" disabled class="btn btn-default base05 base02-background">{{$t('general.submit')}}</button> - <button v-else :disabled="submitDisabled" type="submit" class="btn btn-default base05 base02-background">{{$t('general.submit')}}</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">{{$t('general.submit')}}</button> + <button v-else :disabled="submitDisabled" type="submit" class="btn btn-default">{{$t('general.submit')}}</button> </div> - <div class='error' v-if="error"> + <div class='alert error' v-if="error"> Error: {{ error }} <i class="icon-cancel" @click="clearError"></i> </div> <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> <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> @@ -50,147 +50,157 @@ <script src="./post_status_form.js"></script> <style lang="scss"> - - .tribute-container { - ul { - padding: 0px; - li { - display: flex; - align-items: center; - } - } - img { - padding: 3px; - width: 16px; - height: 16px; - border-radius: 50%; - } - } - - .post-status-form, .login { - .form-bottom { - display: flex; - padding: 0.5em; - height: 32px; - - button { - width: 10em; - } - - p { - margin: 0.35em; - padding: 0.35em; - 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 { - padding: 0 0.5em; - - .attachment { - position: relative; - margin: 0.5em 0.8em 0.2em 0; - } - - i { - position: absolute; - margin: 10px; - padding: 5px; - background: rgba(230,230,230,0.6); - border-radius: 5px; - font-weight: bold; - } - } - - - .btn { - cursor: pointer; - } - - .btn[disabled] { - cursor: not-allowed; - } - - .icon-cancel { - cursor: pointer; - } - form { - display: flex; - flex-direction: column; - padding: 0.6em; - } - - .form-group { - display: flex; - flex-direction: column; - padding: 0.3em 0.5em 0.6em; - line-height:24px; - } - - form textarea { - border: solid; - border-width: 1px; - border-color: inherit; - border-radius: 5px; - line-height:16px; - padding: 5px; - resize: none; - overflow: hidden; - } - - form textarea:focus { - min-height: 48px; - } - - .btn { - cursor: pointer; - } - - .btn[disabled] { - cursor: not-allowed; - } - - .icon-cancel { - cursor: pointer; - z-index: 4; - } - - .autocomplete-panel { - margin: 0 0.5em 0 0.5em; - border-radius: 5px; - position: absolute; - z-index: 1; - box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.5); - min-width: 75%; - } - - .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: 2px; - object-fit: contain; - } - span { - line-height: 24px; - margin: 0 0.1em 0 0.2em; - } - small { - font-style: italic; - } - } - } - +@import '../../_variables.scss'; + +.tribute-container { + ul { + padding: 0px; + li { + display: flex; + align-items: center; + } + } + img { + padding: 3px; + width: 16px; + height: 16px; + border-radius: $fallback--avatarAltRadius; + border-radius: var(--avatarAltRadius, $fallback--avatarAltRadius); + } +} + +.post-status-form, .login { + .form-bottom { + display: flex; + padding: 0.5em; + height: 32px; + + button { + width: 10em; + } + + p { + margin: 0.35em; + padding: 0.35em; + display: flex; + } + } + + .error { + text-align: center; + } + + .attachments { + padding: 0 0.5em; + + .attachment { + position: relative; + border: 1px solid $fallback--border; + border: 1px solid var(--border, $fallback--border); + margin: 0.5em 0.8em 0.2em 0; + } + + 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 { + cursor: pointer; + } + + .btn[disabled] { + cursor: not-allowed; + } + + .icon-cancel { + cursor: pointer; + } + + form { + display: flex; + flex-direction: column; + padding: 0.6em; + } + + .form-group { + display: flex; + flex-direction: column; + padding: 0.3em 0.5em 0.6em; + line-height:24px; + } + + form textarea { + line-height:16px; + resize: none; + overflow: hidden; + transition: min-height 200ms 100ms; + min-height: 1px; + box-sizing: content-box; + } + + form textarea:focus { + min-height: 48px; + } + + .btn { + cursor: pointer; + } + + .btn[disabled] { + cursor: not-allowed; + } + + .icon-cancel { + cursor: pointer; + z-index: 4; + } + + .autocomplete-panel { + margin: 0 0.5em 0 0.5em; + border-radius: $fallback--tooltipRadius; + border-radius: var(--tooltipRadius, $fallback--tooltipRadius); + position: absolute; + z-index: 1; + box-shadow: 1px 2px 4px rgba(0, 0, 0, 0.5); + min-width: 75%; + background: $fallback--btn; + background: var(--btn, $fallback--btn); + color: $fallback--lightFg; + color: var(--lightFg, $fallback--lightFg); + } + + .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> diff --git a/src/components/registration/registration.vue b/src/components/registration/registration.vue index adc751a3..00f665af 100644 --- a/src/components/registration/registration.vue +++ b/src/components/registration/registration.vue @@ -1,6 +1,6 @@ <template> - <div class="settings panel panel-default base00-background"> - <div class="panel-heading base02-background base04"> + <div class="settings panel panel-default"> + <div class="panel-heading"> {{$t('registration.registration')}} </div> <div class="panel-body"> @@ -39,14 +39,14 @@ </div> --> <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 class='terms-of-service' v-html="termsofservice"> </div> </div> <div v-if="error" class='form-group'> - <div class='error base05'>{{error}}</div> + <div class='alert error'>{{error}}</div> </div> </form> </div> @@ -55,6 +55,7 @@ <script src="./registration.js"></script> <style lang="scss"> +@import '../../_variables.scss'; .registration-form { display: flex; @@ -87,23 +88,10 @@ } form textarea { - border: solid; - border-width: 1px; - border-color: silver; - border-radius: 5px; line-height:16px; - padding: 5px; 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 { max-width: 350px; margin-bottom: 0.4em; @@ -117,12 +105,7 @@ } .error { - border-radius: 5px; text-align: center; - margin: 0.5em 0.6em 0; - background-color: rgba(255, 48, 16, 0.65); - min-height: 28px; - line-height: 28px; } } diff --git a/src/components/retweet_button/retweet_button.vue b/src/components/retweet_button/retweet_button.vue index 7a7ea763..1bee3d08 100644 --- a/src/components/retweet_button/retweet_button.vue +++ b/src/components/retweet_button/retweet_button.vue @@ -1,26 +1,28 @@ <template> <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> </div> <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> </div> </template> <script src="./retweet_button.js" ></script> -<style lang='scss'> - @import '../../_variables.scss'; - .rt-active { - cursor: pointer; - animation-duration: 0.6s; - &:hover { - color: $green; - } - } - .icon-retweet.retweeted { - color: $green; +<style lang="scss"> +@import '../../_variables.scss'; +.rt-active { + cursor: pointer; + animation-duration: 0.6s; + &:hover { + color: $fallback--cGreen; + color: var(--cGreen, $fallback--cGreen); } +} +.icon-retweet.retweeted { + color: $fallback--cGreen; + color: var(--cGreen, $fallback--cGreen); +} </style> diff --git a/src/components/settings/settings.vue b/src/components/settings/settings.vue index 5aa7596a..0c9ddc3e 100644 --- a/src/components/settings/settings.vue +++ b/src/components/settings/settings.vue @@ -1,6 +1,6 @@ <template> - <div class="settings panel panel-default base00-background"> - <div class="panel-heading base02-background base04"> + <div class="settings panel panel-default"> + <div class="panel-heading"> {{$t('settings.settings')}} </div> <div class="panel-body"> @@ -54,32 +54,40 @@ </script> <style lang="scss"> - .setting-item { - margin: 1em 1em 1.4em; - textarea { - width: 100%; - height: 100px; - } +@import '../../_variables.scss'; - .old-avatar { - width: 128px; - border-radius: 5px; - } +.setting-item { + margin: 1em 1em 1.4em; - .new-avatar { - object-fit: cover; - width: 128px; - height: 128px; - border-radius: 5px; - } + textarea { + width: 100%; + height: 100px; + } - .btn { - margin-top: 1em; - min-height: 28px; - width: 10em; - } - } - .setting-list { - list-style-type: none; - } + .old-avatar { + width: 128px; + border-radius: $fallback--avatarRadius; + border-radius: var(--avatarRadius, $fallback--avatarRadius); + } + + .new-avatar { + 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> diff --git a/src/components/status/status.js b/src/components/status/status.js index 7397e80c..56fb2e27 100644 --- a/src/components/status/status.js +++ b/src/components/status/status.js @@ -55,11 +55,6 @@ const Status = { }, muted () { return !this.unmuted && (this.status.user.muted || this.muteWordHits.length > 0) }, isReply () { return !!this.status.in_reply_to_status_id }, - borderColor () { - return { - borderBottomColor: this.$store.state.config.colors['base02'] - } - }, isFocused () { // retweet or root of an expanded conversation if (this.focused) { diff --git a/src/components/status/status.vue b/src/components/status/status.vue index d451b67c..798443f1 100644 --- a/src/components/status/status.vue +++ b/src/components/status/status.vue @@ -1,11 +1,11 @@ <template> - <div class="status-el base00-background" v-if="compact"> + <div class="status-el" v-if="compact"> <div @click.prevent="linkClicked" class="status-content" v-html="status.statusnet_html"></div> <div v-if="loggedIn"> <div class='status-actions'> <div> <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> </div> <retweet-button :loggedIn="loggedIn" :status=status></retweet-button> @@ -14,12 +14,12 @@ </div> <post-status-form class="reply-body" :reply-to="status.id" :attentions="status.attentions" :repliedUser="status.user" v-on:posted="toggleReplying" v-if="replying"/> </div> - <div class="status-el base00-background base03-border status-fadein" v-else-if="!status.deleted" v-bind:class="[{ 'base01-background': isFocused }, { 'status-conversation': inConversation }]" > + <div class="status-el status-fadein" v-else-if="!status.deleted" v-bind:class="[{ 'status-el_focused': isFocused }, { 'status-conversation': inConversation }]" > <template v-if="muted"> <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 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> </template> <template v-if="!muted"> @@ -39,7 +39,7 @@ </a> </div> <div class="media-body"> - <div class="base03-border usercard" v-if="userExpanded"> + <div class="usercard" v-if="userExpanded"> <user-card-content :user="status.user" :switcher="false"></user-card-content> </div> <div class="user-content"> @@ -75,15 +75,15 @@ </h4> </div> <div class="heading-icons"> - <a href="#" @click.prevent="toggleMute" v-if="unmuted"><i class="base09 icon-eye-off"></i></a> - <a :href="status.external_url" target="_blank" v-if="!status.is_local" class="source_url"><i class="base09 icon-binoculars"></i></a> + <a href="#" @click.prevent="toggleMute" v-if="unmuted"><i class="icon-eye-off"></i></a> + <a :href="status.external_url" target="_blank" v-if="!status.is_local" class="source_url"><i class="icon-binoculars"></i></a> <template v-if="expandable"> - <a href="#" @click.prevent="toggleExpanded" class="expand"><i class="base09 icon-plus-squared"></i></a> + <a href="#" @click.prevent="toggleExpanded" class="expand"><i class="icon-plus-squared"></i></a> </template> </div> </div> - <div class="status-preview base00-background base03-border" v-if="showPreview && preview"> + <div class="status-preview" v-if="showPreview && preview"> <StillImage class="avatar" :src="preview.user.profile_image_url_original"/> <div class="text"> <h4> @@ -93,8 +93,8 @@ <div @click.prevent="linkClicked" class="status-content" v-html="preview.statusnet_html"></div> </div> </div> - <div class="status-preview status-preview-loading base00-background base03-border" v-else-if="showPreview"> - <i class="base09 icon-spin4 animate-spin"></i> + <div class="status-preview status-preview-loading" v-else-if="showPreview"> + <i class="icon-spin4 animate-spin"></i> </div> <div @click.prevent="linkClicked" class="status-content" v-html="status.statusnet_html"></div> @@ -108,7 +108,7 @@ <div class='status-actions'> <div v-if="loggedIn"> <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> </div> <retweet-button :loggedIn="loggedIn" :status=status></retweet-button> @@ -117,7 +117,7 @@ </div> </div> </div> - <div class="status base00-background container" v-if="replying"> + <div class="status container" v-if="replying"> <div class="reply-left"/> <post-status-form class="reply-body" :reply-to="status.id" :attentions="status.attentions" :repliedUser="status.user" v-on:posted="toggleReplying"/> </div> @@ -128,318 +128,355 @@ <script src="./status.js" ></script> <style lang="scss"> - @import '../../_variables.scss'; +@import '../../_variables.scss'; + +status-text-container { + display: block; +} + +.status-preview { + position: absolute; + max-width: 34em; + padding: 0.5em; + display: flex; + 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); + margin-top: 0.5em; + margin-left: 1em; + z-index: 50; + + .avatar { + flex-shrink: 0; + width: 32px; + height: 32px; + border-radius: $fallback--avatarAltRadius; + border-radius: var(--avatarAltRadius, $fallback--avatarAltRadius); + } - status-text-container { - display: block; + .text { + h4 { + margin-bottom: 0.4em; + small { + font-weight: lighter; + } + } + padding: 0 0.5em 0.5em 0.5em; + } +} + +.status-preview-loading { + display: block; + font-size: 2em; + min-width: 8em; + text-align: center; +} + +.status-el { + hyphens: auto; + overflow-wrap: break-word; + word-wrap: break-word; + word-break: break-word; + border-left-width: 0px; + line-height: 18px; + 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); } - .status-preview { - position: absolute; - max-width: 34em; - padding: 0.5em; + .usercard { + border-color: $fallback--border; + border-color: var(--border, $fallback--border); + } + + .timeline & { + border-bottom-width: 1px; + border-bottom-style: solid; + } + + .notify { + .avatar { + border-width: 3px; + border-style: solid; + } + } + + .media-body { + flex: 1; + padding-left: 0.5em; + } + + + .user-content { + min-height: 52px; + padding-top: 1px; + } + + .media-heading { display: flex; - border-color: inherit; - border-style: solid; - border-width: 1px; - border-radius: 4px; - box-shadow: 2px 2px 3px rgba(0, 0, 0, 0.5); - margin-top: 0.5em; - margin-left: 1em; - z-index: 50; + min-height: 1.4em; + margin-bottom: 0.3em; + + .links a i { + color: $fallback--link; + color: var(--link, $fallback--link); + } + + small { + font-weight: lighter; + } + + h4 { + margin-right: 0.4em; + } + + .name-and-links { + flex: 1 0; + display: flex; + flex-wrap: wrap; + } + + .replies { + flex-basis: 100%; + } + } + + .source_url { + + } + + .expand { + margin-right: -0.3em; + } + + a { + display: inline-block; + word-break: break-all; + } + + .status-content { + margin: 3px 15px 4px 0; + max-height: 400px; + overflow-y: auto; + overflow-x: hidden; + + img, video { + max-width: 100%; + max-height: 400px; + vertical-align: middle; + object-fit: contain; + } + + blockquote { + margin: 0.2em 0 0.2em 2em; + font-style: italic; + } + } + + p { + margin: 0; + margin-top: 0.2em; + margin-bottom: 0.5em; + } + + .media-left { + margin: 0.2em 0.3em 0 0; .avatar { - flex-shrink: 0; - width: 32px; - height: 32px; - border-radius: 50%; + float: right; + border-radius: $fallback--avatarRadius; + border-radius: var(--avatarRadius, $fallback--avatarRadius); } - .text { - h4 { - margin-bottom: 0.4em; - small { - font-weight: lighter; - } + } + + .retweet-info { + padding: 0.7em 0 0 0.6em; + + .media-left { + display: flex; + + i { + align-self: center; + text-align: right; + flex: 1; + padding-right: 0.3em; } - padding: 0 0.5em 0.5em 0.5em; } } - .status-preview-loading { - display: block; - font-size: 2em; - min-width: 8em; - text-align: center; + +} + +.status-fadein { + animation-duration: 0.5s; + animation-name: fadein; +} + +@keyframes fadein { + from { + opacity: 0; + } + + to { + opacity: 1; } +} - .status-el { - hyphens: auto; - overflow-wrap: break-word; - word-wrap: break-word; - word-break: break-word; - border-left-width: 0px; - line-height: 18px; - - .timeline & { - border-bottom-width: 1px; - border-bottom-style: solid; - } - - .notify { - .avatar { - border-width: 3px; - border-style: solid; - } - } - - .media-body { - flex: 1; - padding-left: 0.5em; - } - - - .user-content { - - min-height: 52px; - padding-top: 1px; - } - - .media-heading { - display: flex; - min-height: 1.4em; - margin-bottom: 0.3em; - - small { - font-weight: lighter; - } - h4 { - margin-right: 0.4em; - } - .name-and-links { - flex: 1 0; - display: flex; - flex-wrap: wrap; - } - .replies { - flex-basis: 100%; - } - } - - .source_url { - - } - - .expand { - margin-right: -0.3em; - } - - a { - display: inline-block; - word-break: break-all; - } - - .status-content { - margin: 3px 15px 4px 0; - max-height: 400px; - overflow-y: auto; - overflow-x: hidden; - - img, video { - max-width: 100%; - max-height: 400px; - vertical-align: middle; - object-fit: contain; - } - - blockquote { - margin: 0.2em 0 0.2em 2em; - font-style: italic; - } - } - - p { - margin: 0; - margin-top: 0.2em; - margin-bottom: 0.5em; - } - - .media-left { - margin: 0.2em 0.3em 0 0; - .avatar { - float: right; - } - } - - .retweet-info { - padding: 0.7em 0 0 0.6em; - - .media-left { - display: flex; - - i { - align-self: center; - text-align: right; - flex: 1; - padding-right: 0.3em; - } - } - } - } - - .status-fadein { - animation-duration: 0.5s; - animation-name: fadein; - } - - @keyframes fadein { - from { - opacity: 0; - } - to { - opacity: 1; - } - } - - .greentext { - color: green; - } - - .status-conversation { - border-left-style: solid; - } - - .status-actions { - padding-top: 0.15em; - width: 100%; - display: flex; - - div, favorite-button { - max-width: 6em; - flex: 1; - } - } - - .icon-reply:hover { - color: $blue; - } - - .icon-reply.icon-reply-active { - color: $blue; - } - - .status .avatar { - width: 48px; - height: 48px; - border-radius: 5px; - overflow: hidden; - - img { - width: 100%; - height: 100%; - } - - &.animated::before { - display: none; - } - - &.retweeted { - width: 40px; - height: 40px; - margin-right: 8px; - margin-bottom: 8px; - } - } - - .status:hover .animated.avatar { - canvas { - display: none; - } - img { - visibility: visible; - } - } - - .status .avatar-retweeter { - width: 24px; - height: 24px; - position: absolute; - margin-left: 24px; - margin-top: 24px; - } - - .status.compact .avatar { - width: 32px; - } - - .status { - padding: 0.4em 0.7em 0.45em 0.7em; - border-left: 4px rgba(255, 48, 16, 0.65); - border-left-style: inherit; - } - - .status-conversation:last-child { - border-bottom: none; - } - - .timeline .panel.timeline { - border-radius: 10px; - overflow: hidden; - } - - .muted { - padding: 0.1em 0.4em 0.1em 0.8em; - button { - margin-left: auto; - } - - .muteWords { - margin-left: 10px; - } - } - - a.unmute { - display: block; - margin-left: auto; - } - - .reply-left { - flex: 0; - min-width: 48px; - } - - .reply-body { - flex: 1; - } - - @media all and (max-width: 960px) { - .status-el { - .name-and-links { - margin-left: -0.25em; - } - } - .status { - max-width: 100%; - } - - .status .avatar { - width: 40px; - height: 40px; - - &.retweeted { - width: 34px; - height: 34px; - margin-right: 8px; - margin-bottom: 8px; - } - } - - .status .avatar-retweeter { - width: 22px; - height: 22px; - position: absolute; - margin-left: 18px; - margin-top: 18px; - } - } +.greentext { + color: green; +} + +.status-conversation { + border-left-style: solid; +} + +.status-actions { + padding-top: 0.15em; + width: 100%; + display: flex; + + div, favorite-button { + max-width: 6em; + flex: 1; + } +} + +.icon-reply:hover { + color: $fallback--cBlue; + color: var(--cBlue, $fallback--cBlue); +} + +.icon-reply.icon-reply-active { + color: $fallback--cBlue; + color: var(--cBlue, $fallback--cBlue); +} + +.status .avatar { + width: 48px; + height: 48px; + border-radius: $fallback--avatarRadius; + border-radius: var(--avatarRadius, $fallback--avatarRadius); + overflow: hidden; + + img { + width: 100%; + height: 100%; + } + + &.animated::before { + display: none; + } + + &.retweeted { + width: 40px; + height: 40px; + margin-right: 8px; + margin-bottom: 8px; + } +} + +.status:hover .animated.avatar { + canvas { + display: none; + } + img { + visibility: visible; + } +} + +.status .avatar-retweeter { + width: 24px; + height: 24px; + position: absolute; + margin-left: 24px; + margin-top: 24px; +} + +.status.compact .avatar { + width: 32px; +} + +.status { + padding: 0.4em 0.7em 0.45em 0.7em; + border-left: 4px $fallback--cRed; + border-left: 4px var(--cRed, $fallback--cRed); + border-left-style: inherit; +} + +.status-conversation:last-child { + border-bottom: none; +} + +.timeline .panel.timeline { + overflow: hidden; +} + +.muted { + padding: 0.1em 0.4em 0.1em 0.8em; + button { + margin-left: auto; + } + + .muteWords { + margin-left: 10px; + } +} + +a.unmute { + display: block; + margin-left: auto; +} + +.reply-left { + flex: 0; + min-width: 48px; +} + +.reply-body { + flex: 1; +} + +@media all and (max-width: 960px) { + .status-el { + .name-and-links { + margin-left: -0.25em; + } + } + + .status { + max-width: 100%; + } + + .status .avatar { + width: 40px; + height: 40px; + + &.retweeted { + width: 34px; + height: 34px; + margin-right: 8px; + margin-bottom: 8px; + } + } + + .status .avatar-retweeter { + width: 22px; + height: 22px; + position: absolute; + margin-left: 18px; + margin-top: 18px; + } +} </style> diff --git a/src/components/still-image/still-image.vue b/src/components/still-image/still-image.vue index 5695c554..a37c678d 100644 --- a/src/components/still-image/still-image.vue +++ b/src/components/still-image/still-image.vue @@ -10,53 +10,56 @@ <style lang="scss"> @import '../../_variables.scss'; .still-image { - position: relative; - line-height: 0; - overflow: hidden; + position: relative; + line-height: 0; + overflow: hidden; + width: 100%; + height: 100%; - &:hover canvas { - display: none; - } + &:hover canvas { + display: none; + } + + img { + width: 100%; + height: 100%; + } + &.animated { + &:hover::before, img { - width: 100%; - height: 100% + visibility: hidden; } - &.animated { - &:hover::before, - 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; - } + &:hover img { + visibility: visible } - canvas { - position: absolute; - top: 0; - bottom: 0; - left: 0; - right: 0; - width: 100%; - height: 100%; + &::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: $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> diff --git a/src/components/style_switcher/style_switcher.js b/src/components/style_switcher/style_switcher.js index a762f914..08bc7113 100644 --- a/src/components/style_switcher/style_switcher.js +++ b/src/components/style_switcher/style_switcher.js @@ -6,9 +6,19 @@ export default { availableStyles: [], selected: this.$store.state.config.theme, bgColorLocal: '', - fgColorLocal: '', + btnColorLocal: '', textColorLocal: '', - linkColorLocal: '' + linkColorLocal: '', + redColorLocal: '', + blueColorLocal: '', + greenColorLocal: '', + orangeColorLocal: '', + btnRadiusLocal: '', + panelRadiusLocal: '', + avatarRadiusLocal: '', + avatarAltRadiusLocal: '', + attachmentRadiusLocal: '', + tooltipRadiusLocal: '' } }, created () { @@ -21,16 +31,29 @@ export default { }) }, mounted () { - this.bgColorLocal = rgbstr2hex(this.$store.state.config.colors['base00']) - this.fgColorLocal = rgbstr2hex(this.$store.state.config.colors['base02']) - this.textColorLocal = rgbstr2hex(this.$store.state.config.colors['base05']) - this.linkColorLocal = rgbstr2hex(this.$store.state.config.colors['base08']) + this.bgColorLocal = rgbstr2hex(this.$store.state.config.colors.bg) + this.btnColorLocal = rgbstr2hex(this.$store.state.config.colors.btn) + this.textColorLocal = rgbstr2hex(this.$store.state.config.colors.fg) + 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: { setCustomTheme () { - if (!this.bgColorLocal && !this.fgColorLocal && !this.linkColorLocal) { + if (!this.bgColorLocal && !this.btnColorLocal && !this.linkColorLocal) { // reset to picked themes } + const rgb = (hex) => { const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex) return result ? { @@ -40,17 +63,33 @@ export default { } : null } const bgRgb = rgb(this.bgColorLocal) - const fgRgb = rgb(this.fgColorLocal) + const btnRgb = rgb(this.btnColorLocal) const textRgb = rgb(this.textColorLocal) 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', { name: 'customTheme', value: { - fg: fgRgb, + fg: btnRgb, bg: bgRgb, 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: { selected () { this.bgColorLocal = this.selected[1] - this.fgColorLocal = this.selected[2] + this.btnColorLocal = this.selected[2] this.textColorLocal = this.selected[3] 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] } } } diff --git a/src/components/style_switcher/style_switcher.vue b/src/components/style_switcher/style_switcher.vue index 31bf546d..9c39b245 100644 --- a/src/components/style_switcher/style_switcher.vue +++ b/src/components/style_switcher/style_switcher.vue @@ -1,99 +1,231 @@ <template> <div> - <p>{{$t('settings.presets')}}</p> - <select v-model="selected" class="style-switcher"> - <option v-for="style in availableStyles" :value="style">{{style[0]}}</option> - </select> - <p>{{$t('settings.theme_help')}}</p> + <div>{{$t('settings.presets')}} + <label for="style-switcher" class='select'> + <select id="style-switcher" v-model="selected" class="style-switcher"> + <option v-for="style in availableStyles" :value="style">{{style[0]}}</option> + </select> + <i class="icon-down-open"/> + </label> + </div> <div class="color-container"> + <p>{{$t('settings.theme_help')}}</p> <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-t" class="theme-color-in" type="text" v-model="bgColorLocal"> </div> <div class="color-item"> - <label for="fgcolor" class="base04 theme-color-lb">{{$t('settings.foreground')}}</label> - <input id="fgcolor" class="theme-color-cl" type="color" v-model="fgColorLocal"> - <input id="fgcolor-t" class="theme-color-in" type="text" v-model="fgColorLocal"> + <label for="fgcolor" class="theme-color-lb">{{$t('settings.foreground')}}</label> + <input id="fgcolor" class="theme-color-cl" type="color" v-model="btnColorLocal"> + <input id="fgcolor-t" class="theme-color-in" type="text" v-model="btnColorLocal"> </div> <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-t" class="theme-color-in" type="text" v-model="textColorLocal"> </div> <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-t" class="theme-color-in" type="text" v-model="linkColorLocal"> </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 class="panel"> - <div class="panel-heading" :style="{ 'background-color': fgColorLocal, 'color': textColorLocal }">Preview</div> + <div class="radius-container"> + <p>{{$t('settings.radii_help')}}</p> + <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="avatar" :style="{ + 'border-radius': avatarRadiusLocal + 'px' + }"> + ( ͡° ͜ʖ ͡°) + </div> <h4>Content</h4> <br> 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> - <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> - <button class="btn base02-background base04" @click="setCustomTheme">{{$t('general.apply')}}</button> + <button class="btn" @click="setCustomTheme">{{$t('general.apply')}}</button> </div> </template> <script src="./style_switcher.js"></script> <style lang="scss"> +@import '../../_variables.scss'; .style-switcher { - margin-right: 1em; + margin-right: 1em; } +.radius-container, .color-container { - display: flex; - flex-wrap: wrap; - justify-content: space-between; + display: flex; + + p { + margin-top: 2em; + margin-bottom: .5em; + } +} +.radius-container { + flex-direction: column; } +.color-container { + flex-wrap: wrap; + justify-content: space-between; +} + +.radius-item, .color-item { - min-width: 20em; - display:flex; - flex: 1 1 0; - align-items: baseline; - margin: 5px 6px 5px 0; + min-width: 20em; + display:flex; + flex: 1 1 0; + align-items: baseline; + 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-radius-in, .theme-color-in { - margin-left: 4px; - border-radius: 2px; - border: 0; + margin-left: 4px; } .theme-color-in { - padding: 5px; - min-width: 4em; - max-width: 7em; - flex: 1; + min-width: 4em; } + +.theme-radius-in { + min-width: 1em; +} + +.theme-radius-in, +.theme-color-in { + max-width: 7em; + flex: 1; +} + +.theme-radius-lb, .theme-color-lb { - flex: 2; - min-width: 7em; - max-width: 10em; + flex: 2; + min-width: 7em; +} + +.theme-radius-lb{ + max-width: 50em; +} + +.theme-color-lb { + max-width: 10em; } .theme-color-cl { - padding: 1px; - max-width: 8em; - align-self: stretch; - height: 100%; - flex: 0; - min-width: 2em; - cursor: pointer; - } - - .theme-preview-content { - padding: 20px; - } + padding: 1px; + max-width: 8em; + height: 100%; + flex: 0; + min-width: 2em; + cursor: pointer; +} + +.theme-preview-content { + 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> diff --git a/src/components/timeline/timeline.vue b/src/components/timeline/timeline.vue index d6ecfd2f..4d2230cb 100644 --- a/src/components/timeline/timeline.vue +++ b/src/components/timeline/timeline.vue @@ -1,48 +1,48 @@ <template> <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"> {{title}} </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}} </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')}} </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')}} </div> </div> - <div class="panel-body base01-background"> + <div class="panel-body"> <div class="timeline"> <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"> - <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> - <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 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"> {{$t('user_card.followers')}} </div> </div> - <div class="panel-body base01-background"> + <div class="panel-body"> <div class="timeline"> <user-card v-for="follower in followers" :key="follower.id" :user="follower" :showFollows="false"></user-card> </div> </div> </div> <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"> {{$t('user_card.followees')}} </div> </div> - <div class="panel-body base01-background"> + <div class="panel-body"> <div class="timeline"> <user-card v-for="friend in friends" :key="friend.id" :user="friend" :showFollows="true"></user-card> </div> @@ -52,51 +52,56 @@ <script src="./timeline.js"></script> <style lang="scss"> +@import '../../_variables.scss'; - .timeline { - .timeline-heading { - position: relative; - display: flex; - } - .title { - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - max-width: 70%; - } - .loadmore-button { - position: absolute; - right: 0.6em; - font-size: 14px; +.timeline { + .timeline-heading { + position: relative; + display: flex; + } - 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); - } + .title { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + max-width: 70%; } - .new-status-notification { - position:relative; - margin-top: -1px; - font-size: 1.1em; - border-width: 1px 0 0 0; - 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> diff --git a/src/components/user_card/user_card.vue b/src/components/user_card/user_card.vue index dd14d1b4..51d6965f 100644 --- a/src/components/user_card/user_card.vue +++ b/src/components/user_card/user_card.vue @@ -1,5 +1,5 @@ <template> - <div class="card base00-background"> + <div class="card"> <a href="#"> <img @click.prevent="toggleUserExpanded" class="avatar" :src="user.profile_image_url"> </a> @@ -7,7 +7,7 @@ <user-card-content :user="user" :switcher="false"></user-card-content> </div> <div class="name-and-screen-name" v-else> - <div class="user-name"> + <div :title="user.name" class="user-name"> {{ user.name }} <span class="follows-you" v-if="!userExpanded && showFollows && user.follows_you"> {{ $t('user_card.follows_you') }} @@ -21,54 +21,58 @@ <script src="./user_card.js"></script> <style lang="scss"> - .name-and-screen-name { - margin-left: 0.7em; - margin-top:0.0em; - margin-right: 2em; - text-align: left; - width: 100%; - } +@import '../../_variables.scss'; - .follows-you { - margin-left: 2em; - float: right; - } +.name-and-screen-name { + margin-left: 0.7em; + margin-top:0.0em; + text-align: left; + width: 100%; +} - .follows { +.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); - .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: $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; - .avatar { - margin-top: 0.2em; - width:32px; - height: 32px; - border-radius: 50%; - } + .panel-heading { + background: transparent; } - .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; - } + p { + margin-bottom: 0; } +} </style> diff --git a/src/components/user_card_content/user_card_content.js b/src/components/user_card_content/user_card_content.js index 8c9ccda1..2e448f1c 100644 --- a/src/components/user_card_content/user_card_content.js +++ b/src/components/user_card_content/user_card_content.js @@ -5,7 +5,7 @@ export default { props: [ 'user', 'switcher' ], computed: { headingStyle () { - const color = this.$store.state.config.colors['base00'] + const color = this.$store.state.config.colors.bg if (color) { const rgb = hex2rgb(color) 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 () { return this.user.id !== this.$store.state.users.currentUser.id }, diff --git a/src/components/user_card_content/user_card_content.vue b/src/components/user_card_content/user_card_content.vue index 71a879df..68e2583f 100644 --- a/src/components/user_card_content/user_card_content.vue +++ b/src/components/user_card_content/user_card_content.vue @@ -9,39 +9,38 @@ <router-link :to="{ name: 'user-profile', params: { id: user.id } }"> <StillImage class="avatar" :src="user.profile_image_url_original"/> </router-link> - <span class="glyphicon glyphicon-user"></span> <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 } }"> <div class='user-screen-name'>@{{user.screen_name}}</div> </router-link> </div> </div> <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') }} </div> <div class="follow" v-if="loggedIn"> <span v-if="user.following"> <!--Following them!--> - <button @click="unfollowUser" class="base04 base00-background pressed"> + <button @click="unfollowUser" class="pressed"> {{ $t('user_card.following') }} </button> </span> <span v-if="!user.following"> - <button @click="followUser" class="base05 base02-background"> + <button @click="followUser"> {{ $t('user_card.follow') }} </button> </span> </div> <div class='mute' v-if='isOtherUser'> <span v-if='user.muted'> - <button @click="toggleMute" class="base04 base00-background pressed"> + <button @click="toggleMute" class="pressed"> {{ $t('user_card.muted') }} </button> </span> <span v-if='!user.muted'> - <button @click="toggleMute" class="base05 base02-background"> + <button @click="toggleMute"> {{ $t('user_card.mute') }} </button> </span> @@ -50,19 +49,19 @@ <form method="POST" :action='subscribeUrl'> <input type="hidden" name="nickname" :value="user.screen_name"> <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') }} </button> </form> </div> <div class='block' v-if='isOtherUser && loggedIn'> <span v-if='user.statusnet_blocking'> - <button @click="unblockUser" class="base04 base00-background pressed"> + <button @click="unblockUser" class="pressed"> {{ $t('user_card.blocked') }} </button> </span> <span v-if='!user.statusnet_blocking'> - <button @click="blockUser" class="base05 base02-background"> + <button @click="blockUser"> {{ $t('user_card.block') }} </button> </span> @@ -70,22 +69,22 @@ </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-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> - <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 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> - <span class="base05">{{user.friends_count}}</span> + <span>{{user.friends_count}}</span> </div> <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> - <span class="base05">{{user.followers_count}}</span> + <span>{{user.followers_count}}</span> </div> </div> <p>{{user.description}}</p> @@ -100,7 +99,8 @@ .profile-panel-background { background-size: cover; - border-radius: 10px; + border-radius: $fallback--panelRadius; + border-radius: var(--panelRadius, $fallback--panelRadius); .panel-heading { padding: 0.6em 0em; @@ -112,39 +112,33 @@ top: -0em; padding-top: 4em; 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 { - color: white; + color: white; padding: 0 16px 16px 16px; margin-bottom: -4em; - .usersettings { - color: white; - opacity: 0.8; - } - - .container{ + .container { padding: 16px 10px 4px 10px; display: flex; - flex-wrap: wrap; - flex-direction: column; - align-content: flex-start; - justify-content: center; max-height: 56px; overflow: hidden; - } - .avatar { - border-radius: 5px; - flex: 1 0 100%; - width: 56px; - height: 56px; - box-shadow: 0px 1px 8px rgba(0,0,0,0.75); - object-fit: cover; + .avatar { + border-radius: $fallback--avatarRadius; + border-radius: var(--avatarRadius, $fallback--avatarRadius); + flex: 1 0 100%; + width: 56px; + height: 56px; + box-shadow: 0px 1px 8px rgba(0,0,0,0.75); + object-fit: cover; - &.animated::before { - display: none; + &.animated::before { + 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 { display: block; @@ -165,18 +164,20 @@ text-align: left; text-overflow: ellipsis; white-space: nowrap; + flex: 1 1 0; } - .user-name{ - color: white; - } + .user-name{ + color: white; + text-overflow: ellipsis; + overflow: hidden; + } .user-screen-name { - color: white; - font-weight: lighter; - font-size: 15px; - padding-right: 0.1em; - flex: 0 0 auto; + color: white; + font-weight: lighter; + font-size: 15px; + padding-right: 0.1em; } .user-interactions { @@ -232,23 +233,24 @@ } .user-counts { - display: flex; - line-height:16px; - padding: 1em 1.5em 0em 1em; - text-align: center; + display: flex; + line-height:16px; + padding: 1em 1.5em 0em 1em; + text-align: center; } .user-count { - flex: 1; + flex: 1; - h5 { - font-size:1em; - font-weight: bolder; - margin: 0 0 0.25em; - } - a { - text-decoration: none; - } + h5 { + color: white; + font-size:1em; + font-weight: bolder; + margin: 0 0 0.25em; + } + a { + text-decoration: none; + } } .dailyAvg { diff --git a/src/components/user_finder/user_finder.vue b/src/components/user_finder/user_finder.vue index 3c69e3b4..69bd1d21 100644 --- a/src/components/user_finder/user_finder.vue +++ b/src/components/user_finder/user_finder.vue @@ -1,13 +1,13 @@ <template> <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"/> {{$t('finder.error_fetching_user')}} </span> <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> <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"/> </span> </span> @@ -16,27 +16,16 @@ <script src="./user_finder.js"></script> <style lang="scss"> - .user-finder-container { - height: 21px; - max-width: 100%; - } +@import '../../_variables.scss'; - .user-finder-icon { - } +.user-finder-container { + height: 29px; + max-width: 100%; +} - .user-finder-input { - border-width: 1px; - border-style: solid; - border-color: inherit; - border-radius: 5px; - max-width: 80%; - padding: 0.1em 0.2em 0.2em 0.2em; - } +.user-finder-input { + max-width: 80%; + vertical-align: middle; +} - .finder-error { - background-color: rgba(255, 48, 16, 0.65); - margin: 0.35em; - border-radius: 5px; - padding: 0.25em; - } </style> diff --git a/src/components/user_panel/user_panel.vue b/src/components/user_panel/user_panel.vue index 1a5e20fb..05af7bc3 100644 --- a/src/components/user_panel/user_panel.vue +++ b/src/components/user_panel/user_panel.vue @@ -2,7 +2,7 @@ <div class="user-panel"> <div v-if='user' class="panel panel-default" style="overflow: visible;"> <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> </div> </div> @@ -11,3 +11,11 @@ </template> <script src="./user_panel.js"></script> + +<style lang="scss"> +.user-panel { + .profile-panel-background .panel-heading { + background: transparent; + } +} +</style> diff --git a/src/components/user_profile/user_profile.vue b/src/components/user_profile/user_profile.vue index 359abfef..838a43ab 100644 --- a/src/components/user_profile/user_profile.vue +++ b/src/components/user_profile/user_profile.vue @@ -1,6 +1,6 @@ <template> <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> </div> <Timeline :title="$t('user_profile.timeline_title')" :timeline="timeline" :timeline-name="'user'" :user-id="userId"/> @@ -15,7 +15,8 @@ flex: 2; flex-basis: 500px; padding-bottom: 10px; - border-radius: 10px; + .panel-heading { + background: transparent; + } } - </style> diff --git a/src/components/user_settings/user_settings.vue b/src/components/user_settings/user_settings.vue index 1ef52bbf..ed1864cc 100644 --- a/src/components/user_settings/user_settings.vue +++ b/src/components/user_settings/user_settings.vue @@ -1,16 +1,16 @@ <template> - <div class="settings panel panel-default base00-background"> - <div class="panel-heading base02-background base04"> + <div class="settings panel panel-default"> + <div class="panel-heading"> {{$t('settings.user_settings')}} </div> <div class="panel-body profile-edit"> <div class="setting-item"> <h3>{{$t('settings.name_bio')}}</h3> <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> - <textarea class="bio base03-border" v-model="newbio"></textarea> - <button :disabled='newname.length <= 0' class="btn btn-default base05 base02-background" @click="updateProfile">{{$t('general.submit')}}</button> + <textarea class="bio" v-model="newbio"></textarea> + <button :disabled='newname.length <= 0' class="btn btn-default" @click="updateProfile">{{$t('general.submit')}}</button> </div> <div class="setting-item"> <h3>{{$t('settings.avatar')}}</h3> @@ -22,8 +22,8 @@ <div> <input type="file" @change="uploadFile(0, $event)" ></input> </div> - <i class="base09 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> + <i class="icon-spin4 animate-spin" v-if="uploading[0]"></i> + <button class="btn btn-default" v-else-if="previews[0]" @click="submitAvatar">{{$t('general.submit')}}</button> </div> <div class="setting-item"> <h3>{{$t('settings.profile_banner')}}</h3> @@ -35,8 +35,8 @@ <div> <input type="file" @change="uploadFile(1, $event)" ></input> </div> - <i class="base09 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> + <i class=" icon-spin4 animate-spin uploading" v-if="uploading[1]"></i> + <button class="btn btn-default" v-else-if="previews[1]" @click="submitBanner">{{$t('general.submit')}}</button> </div> <div class="setting-item"> <h3>{{$t('settings.profile_background')}}</h3> @@ -46,8 +46,8 @@ <div> <input type="file" @change="uploadFile(2, $event)" ></input> </div> - <i class="base09 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> + <i class=" icon-spin4 animate-spin uploading" v-if="uploading[2]"></i> + <button class="btn btn-default" v-else-if="previews[2]" @click="submitBg">{{$t('general.submit')}}</button> </div> <div class="setting-item" v-if="pleromaBackend"> <h3>{{$t('settings.follow_import')}}</h3> @@ -55,8 +55,8 @@ <form v-model="followImportForm"> <input type="file" ref="followlist" v-on:change="followListChange"></input> </form> - <i class="base09 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> + <i class=" icon-spin4 animate-spin uploading" v-if="uploading[3]"></i> + <button class="btn btn-default" v-else @click="importFollows">{{$t('general.submit')}}</button> <div v-if="followsImported"> <i class="icon-cross" @click="dismissImported"></i> <p>{{$t('settings.follows_imported')}}</p> @@ -75,24 +75,16 @@ <style lang="scss"> .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 { - border-width: 1px; - border-style: solid; - border-radius: 5px; margin: 0; } + + input[type=file] { + padding: 5px; + } + .banner { max-width: 400px; - border-radius: 5px; } .uploading { diff --git a/src/i18n/messages.js b/src/i18n/messages.js index cc7dfe7d..7bedfa8c 100644 --- a/src/i18n/messages.js +++ b/src/i18n/messages.js @@ -46,7 +46,7 @@ const de = { settings: 'Einstellungen', theme: 'Farbschema', presets: 'Voreinstellungen', - theme_help: 'Benutze HTML Farbcodes (#aabbcc) um dein Farbschema anzupassen.', + theme_help: 'Benutze HTML Farbcodes (#rrggbb) um dein Farbschema anzupassen.', background: 'Hintergrund', foreground: 'Vordergrund', text: 'Text', @@ -238,11 +238,22 @@ const en = { settings: 'Settings', theme: 'Theme', 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', foreground: 'Foreground', text: 'Text', 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_explanation: 'All statuses containing these words will be muted, one per line', attachments: 'Attachments', @@ -835,7 +846,7 @@ const oc = { settings: 'Paramètres', theme: 'Tèma', 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', foreground: 'Endavant', text: 'Tèxte', @@ -1021,7 +1032,7 @@ const es = { settings: 'Ajustes', theme: 'Tema', 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', foreground: 'Primer plano', text: 'Texto', @@ -1121,7 +1132,7 @@ const pt = { settings: 'Configurações', theme: 'Tema', 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', foreground: 'Primeiro Plano', text: 'Texto', @@ -1221,7 +1232,7 @@ const ru = { settings: 'Настройки', theme: 'Тема', presets: 'Пресеты', - theme_help: 'Используйте шестнадцатеричные коды цветов (#aabbcc) для настройки темы.', + theme_help: 'Используйте шестнадцатеричные коды цветов (#rrggbb) для настройки темы.', background: 'Фон', foreground: 'Передний план', text: 'Текст', diff --git a/src/services/style_setter/style_setter.js b/src/services/style_setter/style_setter.js index 6863bd0a..532af1ba 100644 --- a/src/services/style_setter/style_setter.js +++ b/src/services/style_setter/style_setter.js @@ -45,12 +45,8 @@ const setStyle = (href, commit) => { const styleEl = document.createElement('style') 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' } @@ -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) let colors = {} + let radii = {} let mod = 10 if (isDark) { 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['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 - times(num, (n) => { - 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') - 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') + + colors.link = rgb2hex(col.link.r, col.link.g, col.link.b) // links + colors.icon = rgb2hex((col.bg.r + col.text.r) / 2, (col.bg.g + col.text.g) / 2, (col.bg.b + col.text.b) / 2) // icons + + colors.cBlue = col.cBlue && rgb2hex(col.cBlue.r, col.cBlue.g, col.cBlue.b) + colors.cRed = col.cRed && rgb2hex(col.cRed.r, col.cRed.g, col.cRed.b) + colors.cGreen = col.cGreen && rgb2hex(col.cGreen.r, col.cGreen.g, col.cGreen.b) + 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' commit('setOption', { name: 'colors', value: colors }) + commit('setOption', { name: 'radii', value: radii }) commit('setOption', { name: 'customTheme', value: col }) } @@ -111,12 +120,23 @@ const setPreset = (val, commit) => { const fgRgb = hex2rgb(theme[2]) const textRgb = hex2rgb(theme[3]) 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 = { bg: bgRgb, fg: fgRgb, 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. // We want to cancel loading the theme from config.json if we're already // loading a theme from the persisted state. |
