mirror of
https://git.joinsharkey.org/Sharkey/Sharkey.git
synced 2024-11-27 13:23:09 +02:00
[wip] darkmode
This commit is contained in:
parent
d4a2c6cef4
commit
f2fea7f3cd
11 changed files with 130 additions and 44 deletions
|
@ -62,6 +62,14 @@
|
||||||
app = isMobile ? 'mobile' : 'desktop';
|
app = isMobile ? 'mobile' : 'desktop';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Dark/Light
|
||||||
|
const me = JSON.parse(localStorage.getItem('me') || null);
|
||||||
|
if (me && me.clientSettings) {
|
||||||
|
if ((app == 'desktop' && me.clientSettings.dark) || (app == 'mobile' && me.clientSettings.darkMobile)) {
|
||||||
|
document.documentElement.setAttribute('data-darkmode', 'true');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Script version
|
// Script version
|
||||||
const ver = localStorage.getItem('v') || VERSION;
|
const ver = localStorage.getItem('v') || VERSION;
|
||||||
|
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
* Desktop Client
|
* Desktop Client
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
import Vue from 'vue';
|
||||||
import VueRouter from 'vue-router';
|
import VueRouter from 'vue-router';
|
||||||
|
|
||||||
// Style
|
// Style
|
||||||
|
@ -43,6 +44,30 @@ init(async (launch) => {
|
||||||
require('./views/components');
|
require('./views/components');
|
||||||
require('./views/widgets');
|
require('./views/widgets');
|
||||||
|
|
||||||
|
// Dark/Light
|
||||||
|
Vue.mixin({
|
||||||
|
mounted() {
|
||||||
|
const set = () => {
|
||||||
|
if (!this.$el || !this.os || !this.os.i) return;
|
||||||
|
if (this.os.i.clientSettings.dark) {
|
||||||
|
document.documentElement.setAttribute('data-darkmode', 'true');
|
||||||
|
this.$el.setAttribute('data-darkmode', 'true');
|
||||||
|
} else {
|
||||||
|
document.documentElement.removeAttribute('data-darkmode');
|
||||||
|
this.$el.removeAttribute('data-darkmode');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
set();
|
||||||
|
|
||||||
|
this.$watch('os.i.clientSettings', i => {
|
||||||
|
set();
|
||||||
|
}, {
|
||||||
|
deep: true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// Init router
|
// Init router
|
||||||
const router = new VueRouter({
|
const router = new VueRouter({
|
||||||
mode: 'history',
|
mode: 'history',
|
||||||
|
|
|
@ -44,6 +44,9 @@ html
|
||||||
height 100%
|
height 100%
|
||||||
background #f7f7f7
|
background #f7f7f7
|
||||||
|
|
||||||
|
&[data-darkmode]
|
||||||
|
background #191B22
|
||||||
|
|
||||||
body
|
body
|
||||||
display flex
|
display flex
|
||||||
flex-direction column
|
flex-direction column
|
||||||
|
|
|
@ -291,11 +291,11 @@ export default Vue.extend({
|
||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
@import '~const.styl'
|
@import '~const.styl'
|
||||||
|
|
||||||
.note
|
root(isDark)
|
||||||
margin 0
|
margin 0
|
||||||
padding 0
|
padding 0
|
||||||
background #fff
|
background isDark ? #282C37 : #fff
|
||||||
border-bottom solid 1px #eaeaea
|
border-bottom solid 1px isDark ? #1c2023 : #eaeaea
|
||||||
|
|
||||||
&:first-child
|
&:first-child
|
||||||
border-top-left-radius 6px
|
border-top-left-radius 6px
|
||||||
|
@ -374,7 +374,7 @@ export default Vue.extend({
|
||||||
|
|
||||||
&:hover
|
&:hover
|
||||||
> .main > footer > button
|
> .main > footer > button
|
||||||
color #888
|
color isDark ? #707b97 : #888
|
||||||
|
|
||||||
> .avatar-anchor
|
> .avatar-anchor
|
||||||
display block
|
display block
|
||||||
|
@ -407,7 +407,7 @@ export default Vue.extend({
|
||||||
margin 0 .5em 0 0
|
margin 0 .5em 0 0
|
||||||
padding 0
|
padding 0
|
||||||
overflow hidden
|
overflow hidden
|
||||||
color #627079
|
color isDark ? #fff : #627079
|
||||||
font-size 1em
|
font-size 1em
|
||||||
font-weight bold
|
font-weight bold
|
||||||
text-decoration none
|
text-decoration none
|
||||||
|
@ -426,7 +426,7 @@ export default Vue.extend({
|
||||||
|
|
||||||
> .username
|
> .username
|
||||||
margin 0 .5em 0 0
|
margin 0 .5em 0 0
|
||||||
color #ccc
|
color isDark ? #606984 : #ccc
|
||||||
|
|
||||||
> .info
|
> .info
|
||||||
margin-left auto
|
margin-left auto
|
||||||
|
@ -443,7 +443,7 @@ export default Vue.extend({
|
||||||
border-right solid 1px #eaeaea
|
border-right solid 1px #eaeaea
|
||||||
|
|
||||||
> .created-at
|
> .created-at
|
||||||
color #c0c0c0
|
color isDark ? #606984 : #c0c0c0
|
||||||
|
|
||||||
> .body
|
> .body
|
||||||
|
|
||||||
|
@ -454,7 +454,7 @@ export default Vue.extend({
|
||||||
padding 0
|
padding 0
|
||||||
overflow-wrap break-word
|
overflow-wrap break-word
|
||||||
font-size 1.1em
|
font-size 1.1em
|
||||||
color #717171
|
color isDark ? #fff : #717171
|
||||||
|
|
||||||
>>> .title
|
>>> .title
|
||||||
display block
|
display block
|
||||||
|
@ -462,7 +462,7 @@ export default Vue.extend({
|
||||||
padding 4px
|
padding 4px
|
||||||
font-size 90%
|
font-size 90%
|
||||||
text-align center
|
text-align center
|
||||||
background #eef1f3
|
background isDark ? #2f3944 : #eef1f3
|
||||||
border-radius 4px
|
border-radius 4px
|
||||||
|
|
||||||
>>> .code
|
>>> .code
|
||||||
|
@ -471,12 +471,12 @@ export default Vue.extend({
|
||||||
>>> .quote
|
>>> .quote
|
||||||
margin 8px
|
margin 8px
|
||||||
padding 6px 12px
|
padding 6px 12px
|
||||||
color #aaa
|
color isDark ? #6f808e : #aaa
|
||||||
border-left solid 3px #eee
|
border-left solid 3px isDark ? #637182 : #eee
|
||||||
|
|
||||||
> .reply
|
> .reply
|
||||||
margin-right 8px
|
margin-right 8px
|
||||||
color #717171
|
color isDark ? #99abbf : #717171
|
||||||
|
|
||||||
> .rp
|
> .rp
|
||||||
margin-left 4px
|
margin-left 4px
|
||||||
|
@ -547,13 +547,13 @@ export default Vue.extend({
|
||||||
padding 0 8px
|
padding 0 8px
|
||||||
line-height 32px
|
line-height 32px
|
||||||
font-size 1em
|
font-size 1em
|
||||||
color #ddd
|
color isDark ? #606984 : #ddd
|
||||||
background transparent
|
background transparent
|
||||||
border none
|
border none
|
||||||
cursor pointer
|
cursor pointer
|
||||||
|
|
||||||
&:hover
|
&:hover
|
||||||
color #666
|
color isDark ? #9198af : #666
|
||||||
|
|
||||||
> .count
|
> .count
|
||||||
display inline
|
display inline
|
||||||
|
@ -572,6 +572,12 @@ export default Vue.extend({
|
||||||
padding-top 4px
|
padding-top 4px
|
||||||
background rgba(0, 0, 0, 0.0125)
|
background rgba(0, 0, 0, 0.0125)
|
||||||
|
|
||||||
|
.note[data-darkmode]
|
||||||
|
root(true)
|
||||||
|
|
||||||
|
.note:not([data-darkmode])
|
||||||
|
root(false)
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<style lang="stylus" module>
|
<style lang="stylus" module>
|
||||||
|
|
|
@ -50,17 +50,16 @@ export default Vue.extend({
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
.mk-notes
|
root(isDark)
|
||||||
|
|
||||||
> .date
|
> .date
|
||||||
display block
|
display block
|
||||||
margin 0
|
margin 0
|
||||||
line-height 32px
|
line-height 32px
|
||||||
font-size 14px
|
font-size 14px
|
||||||
text-align center
|
text-align center
|
||||||
color #aaa
|
color isDark ? #666b79 : #aaa
|
||||||
background #fdfdfd
|
background isDark ? #242731 : #fdfdfd
|
||||||
border-bottom solid 1px #eaeaea
|
border-bottom solid 1px isDark ? #1c2023 : #eaeaea
|
||||||
|
|
||||||
span
|
span
|
||||||
margin 0 16px
|
margin 0 16px
|
||||||
|
@ -86,4 +85,11 @@ export default Vue.extend({
|
||||||
|
|
||||||
&:active
|
&:active
|
||||||
background #eee
|
background #eee
|
||||||
|
|
||||||
|
.mk-notes[data-darkmode]
|
||||||
|
root(true)
|
||||||
|
|
||||||
|
.mk-notes:not([data-darkmode])
|
||||||
|
root(false)
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -37,14 +37,17 @@
|
||||||
<section class="web" v-show="page == 'web'">
|
<section class="web" v-show="page == 'web'">
|
||||||
<h1>デザインと表示</h1>
|
<h1>デザインと表示</h1>
|
||||||
<div class="div">
|
<div class="div">
|
||||||
<button class="ui button" @click="customizeHome">ホームをカスタマイズ</button>
|
<button class="ui button" @click="customizeHome" style="margin-bottom: 16px">ホームをカスタマイズ</button>
|
||||||
|
</div>
|
||||||
|
<div class="div">
|
||||||
|
<mk-switch v-model="os.i.clientSettings.dark" @change="onChangeDark" text="ダークモード"/>
|
||||||
|
<mk-switch v-model="os.i.clientSettings.gradientWindowHeader" @change="onChangeGradientWindowHeader" text="ウィンドウのタイトルバーにグラデーションを使用"/>
|
||||||
</div>
|
</div>
|
||||||
<mk-switch v-model="os.i.clientSettings.showPostFormOnTopOfTl" @change="onChangeShowPostFormOnTopOfTl" text="タイムライン上部に投稿フォームを表示する"/>
|
<mk-switch v-model="os.i.clientSettings.showPostFormOnTopOfTl" @change="onChangeShowPostFormOnTopOfTl" text="タイムライン上部に投稿フォームを表示する"/>
|
||||||
<mk-switch v-model="os.i.clientSettings.showReplyTarget" @change="onChangeShowReplyTarget" text="リプライ先を表示する"/>
|
<mk-switch v-model="os.i.clientSettings.showReplyTarget" @change="onChangeShowReplyTarget" text="リプライ先を表示する"/>
|
||||||
<mk-switch v-model="os.i.clientSettings.showMaps" @change="onChangeShowMaps" text="マップの自動展開">
|
<mk-switch v-model="os.i.clientSettings.showMaps" @change="onChangeShowMaps" text="マップの自動展開">
|
||||||
<span>位置情報が添付された投稿のマップを自動的に展開します。</span>
|
<span>位置情報が添付された投稿のマップを自動的に展開します。</span>
|
||||||
</mk-switch>
|
</mk-switch>
|
||||||
<mk-switch v-model="os.i.clientSettings.gradientWindowHeader" @change="onChangeGradientWindowHeader" text="ウィンドウのタイトルバーにグラデーションを使用"/>
|
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<section class="web" v-show="page == 'web'">
|
<section class="web" v-show="page == 'web'">
|
||||||
|
@ -298,6 +301,12 @@ export default Vue.extend({
|
||||||
autoWatch: v
|
autoWatch: v
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
onChangeDark(v) {
|
||||||
|
(this as any).api('i/update_client_setting', {
|
||||||
|
name: 'dark',
|
||||||
|
value: v
|
||||||
|
});
|
||||||
|
},
|
||||||
onChangeShowPostFormOnTopOfTl(v) {
|
onChangeShowPostFormOnTopOfTl(v) {
|
||||||
(this as any).api('i/update_client_setting', {
|
(this as any).api('i/update_client_setting', {
|
||||||
name: 'showPostFormOnTopOfTl',
|
name: 'showPostFormOnTopOfTl',
|
||||||
|
@ -431,7 +440,6 @@ export default Vue.extend({
|
||||||
> .web
|
> .web
|
||||||
> .div
|
> .div
|
||||||
border-bottom solid 1px #eee
|
border-bottom solid 1px #eee
|
||||||
padding 0 0 16px 0
|
margin 16px 0
|
||||||
margin 0 0 16px 0
|
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -66,14 +66,16 @@ export default Vue.extend({
|
||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
@import '~const.styl'
|
@import '~const.styl'
|
||||||
|
|
||||||
.mk-timeline
|
root(isDark)
|
||||||
background #fff
|
background isDark ? #282C37 : #fff
|
||||||
border solid 1px rgba(0, 0, 0, 0.075)
|
border solid 1px rgba(0, 0, 0, 0.075)
|
||||||
border-radius 6px
|
border-radius 6px
|
||||||
|
|
||||||
> header
|
> header
|
||||||
padding 0 8px
|
padding 0 8px
|
||||||
z-index 10
|
z-index 10
|
||||||
|
background isDark ? #313543 : #fff
|
||||||
|
border-radius 6px 6px 0 0
|
||||||
box-shadow 0 1px rgba(0, 0, 0, 0.08)
|
box-shadow 0 1px rgba(0, 0, 0, 0.08)
|
||||||
|
|
||||||
> span
|
> span
|
||||||
|
@ -99,10 +101,16 @@ export default Vue.extend({
|
||||||
background $theme-color
|
background $theme-color
|
||||||
|
|
||||||
&:not([data-is-active])
|
&:not([data-is-active])
|
||||||
color #6f7477
|
color isDark ? #9aa2a7 : #6f7477
|
||||||
cursor pointer
|
cursor pointer
|
||||||
|
|
||||||
&:hover
|
&:hover
|
||||||
color #525a5f
|
color isDark ? #d9dcde : #525a5f
|
||||||
|
|
||||||
|
.mk-timeline[data-darkmode]
|
||||||
|
root(true)
|
||||||
|
|
||||||
|
.mk-timeline:not([data-darkmode])
|
||||||
|
root(false)
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -169,10 +169,10 @@ root(isDark)
|
||||||
> .mk-ui-header-search
|
> .mk-ui-header-search
|
||||||
display none
|
display none
|
||||||
|
|
||||||
.header[data-is-darkmode]
|
.header[data-darkmode]
|
||||||
root(true)
|
root(true)
|
||||||
|
|
||||||
.header
|
.header:not([data-darkmode])
|
||||||
root(false)
|
root(false)
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -34,8 +34,8 @@ export default Vue.extend({
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
.mk-widget-container
|
root(isDark)
|
||||||
background #fff
|
background isDark ? #282C37 : #fff
|
||||||
border solid 1px rgba(0, 0, 0, 0.075)
|
border solid 1px rgba(0, 0, 0, 0.075)
|
||||||
border-radius 6px
|
border-radius 6px
|
||||||
overflow hidden
|
overflow hidden
|
||||||
|
@ -45,6 +45,8 @@ export default Vue.extend({
|
||||||
border none !important
|
border none !important
|
||||||
|
|
||||||
> header
|
> header
|
||||||
|
background isDark ? #313543 : #fff
|
||||||
|
|
||||||
> .title
|
> .title
|
||||||
z-index 1
|
z-index 1
|
||||||
margin 0
|
margin 0
|
||||||
|
@ -52,7 +54,7 @@ export default Vue.extend({
|
||||||
line-height 42px
|
line-height 42px
|
||||||
font-size 0.9em
|
font-size 0.9em
|
||||||
font-weight bold
|
font-weight bold
|
||||||
color #888
|
color isDark ? #e3e5e8 : #888
|
||||||
box-shadow 0 1px rgba(0, 0, 0, 0.07)
|
box-shadow 0 1px rgba(0, 0, 0, 0.07)
|
||||||
|
|
||||||
> [data-fa]
|
> [data-fa]
|
||||||
|
@ -70,16 +72,23 @@ export default Vue.extend({
|
||||||
width 42px
|
width 42px
|
||||||
font-size 0.9em
|
font-size 0.9em
|
||||||
line-height 42px
|
line-height 42px
|
||||||
color #ccc
|
color isDark ? #9baec8 : #ccc
|
||||||
|
|
||||||
&:hover
|
&:hover
|
||||||
color #aaa
|
color isDark ? #b2c1d5 : #aaa
|
||||||
|
|
||||||
&:active
|
&:active
|
||||||
color #999
|
color isDark ? #b2c1d5 : #999
|
||||||
|
|
||||||
&.withGradient
|
&.withGradient
|
||||||
> .title
|
> .title
|
||||||
background linear-gradient(to bottom, #fff, #ececec)
|
background isDark ? linear-gradient(to bottom, #313543, #1d2027) : linear-gradient(to bottom, #fff, #ececec)
|
||||||
box-shadow 0 1px rgba(#000, 0.11)
|
box-shadow 0 1px rgba(#000, 0.11)
|
||||||
|
|
||||||
|
.mk-widget-container[data-darkmode]
|
||||||
|
root(true)
|
||||||
|
|
||||||
|
.mk-widget-container:not([data-darkmode])
|
||||||
|
root(false)
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -465,7 +465,7 @@ export default Vue.extend({
|
||||||
<style lang="stylus" scoped>
|
<style lang="stylus" scoped>
|
||||||
@import '~const.styl'
|
@import '~const.styl'
|
||||||
|
|
||||||
.mk-window
|
root(isDark)
|
||||||
display block
|
display block
|
||||||
|
|
||||||
> .bg
|
> .bg
|
||||||
|
@ -559,7 +559,7 @@ export default Vue.extend({
|
||||||
> .body
|
> .body
|
||||||
height 100%
|
height 100%
|
||||||
overflow hidden
|
overflow hidden
|
||||||
background #fff
|
background isDark ? #282C37 : #fff
|
||||||
border-radius 6px
|
border-radius 6px
|
||||||
box-shadow 0 2px 6px 0 rgba(0, 0, 0, 0.2)
|
box-shadow 0 2px 6px 0 rgba(0, 0, 0, 0.2)
|
||||||
|
|
||||||
|
@ -571,12 +571,12 @@ export default Vue.extend({
|
||||||
overflow hidden
|
overflow hidden
|
||||||
white-space nowrap
|
white-space nowrap
|
||||||
cursor move
|
cursor move
|
||||||
background #fff
|
background isDark ? #313543 : #fff
|
||||||
border-radius 6px 6px 0 0
|
border-radius 6px 6px 0 0
|
||||||
box-shadow 0 1px 0 rgba(#000, 0.1)
|
box-shadow 0 1px 0 rgba(#000, 0.1)
|
||||||
|
|
||||||
&.withGradient
|
&.withGradient
|
||||||
background linear-gradient(to bottom, #fff, #ececec)
|
background isDark ? linear-gradient(to bottom, #313543, #1d2027) : linear-gradient(to bottom, #fff, #ececec)
|
||||||
box-shadow 0 1px 0 rgba(#000, 0.15)
|
box-shadow 0 1px 0 rgba(#000, 0.15)
|
||||||
|
|
||||||
&, *
|
&, *
|
||||||
|
@ -593,7 +593,7 @@ export default Vue.extend({
|
||||||
font-size 1em
|
font-size 1em
|
||||||
line-height $header-height
|
line-height $header-height
|
||||||
font-weight normal
|
font-weight normal
|
||||||
color #666
|
color isDark ? #e3e5e8 : #666
|
||||||
|
|
||||||
> div:last-child
|
> div:last-child
|
||||||
position absolute
|
position absolute
|
||||||
|
@ -608,16 +608,16 @@ export default Vue.extend({
|
||||||
padding 0
|
padding 0
|
||||||
cursor pointer
|
cursor pointer
|
||||||
font-size 1em
|
font-size 1em
|
||||||
color rgba(#000, 0.4)
|
color isDark ? #9baec8 : rgba(#000, 0.4)
|
||||||
border none
|
border none
|
||||||
outline none
|
outline none
|
||||||
background transparent
|
background transparent
|
||||||
|
|
||||||
&:hover
|
&:hover
|
||||||
color rgba(#000, 0.6)
|
color isDark ? #b2c1d5 : rgba(#000, 0.6)
|
||||||
|
|
||||||
&:active
|
&:active
|
||||||
color darken(#000, 30%)
|
color isDark ? #b2c1d5 : darken(#000, 30%)
|
||||||
|
|
||||||
> [data-fa]
|
> [data-fa]
|
||||||
padding 0
|
padding 0
|
||||||
|
@ -632,4 +632,10 @@ export default Vue.extend({
|
||||||
> .main > .body > .content
|
> .main > .body > .content
|
||||||
height calc(100% - 40px)
|
height calc(100% - 40px)
|
||||||
|
|
||||||
|
.mk-window[data-darkmode]
|
||||||
|
root(true)
|
||||||
|
|
||||||
|
.mk-window:not([data-darkmode])
|
||||||
|
root(false)
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
|
|
|
@ -56,6 +56,13 @@ body > noscript {
|
||||||
animation-delay: 0.32s;
|
animation-delay: 0.32s;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
html[data-darkmode] #ini {
|
||||||
|
background: #191b22;
|
||||||
|
}
|
||||||
|
html[data-darkmode] #ini > p {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
@keyframes ini {
|
@keyframes ini {
|
||||||
0%, 80%, 100% {
|
0%, 80%, 100% {
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
|
|
Loading…
Reference in a new issue