History

Merge pull request #1086 from simon04/prefers-color-scheme

Add support for prefers-color-scheme media query

Jed Fox committed 6 years ago

Commit 364be3b2 parents af8576f cc406a85 files · +62 −16Browse files

Showing the changes to assets/javascripts/app (1 of 5 files). Show all

Unified · Split

assets/javascripts/app/settings.coffee+22−6
@@ -7,7 +7,8 @@ class app.Settings · 6 unmodified lines
77 'arrowScroll'
88 'analyticsConsent'
99 'docs'
10− 'dark'
10+ 'dark' # legacy
11+ 'theme'
1112 'layout'
1213 'size'
1314 'tips'
@@ -31,10 +32,16 @@ class app.Settings · 17 unmodified lines
3132 manualUpdate: false
3233 schema: 1
3334 analyticsConsent: false
35+ theme: 'auto'
3436
3537 constructor: ->
3638 @store = new CookiesStore
3739 @cache = {}
40+ @autoSupported = window.matchMedia('(prefers-color-scheme)').media != 'not all'
41+ if @autoSupported
42+ @darkModeQuery = window.matchMedia('(prefers-color-scheme: dark)')
43+ @darkModeQuery.addListener => @setTheme(@get('theme'))
44+
3845
3946 get: (key) ->
4047 return @cache[key] if @cache.hasOwnProperty(key)
@@ -43,7 +50,7 @@ class app.Settings · 2 unmodified lines
4350 set: (key, value) ->
4451 @store.set(key, value)
4552 delete @cache[key]
46− @toggleDark(value) if key == 'dark'
53+ @setTheme(value) if key == 'theme'
4754 return
4855
4956 del: (key) ->
@@ -114,15 +121,24 @@ class app.Settings · 64 unmodified lines
114121 return
115122
116123 initLayout: ->
117− @toggleDark(@get('dark') is 1)
124+ if @get('dark') is 1
125+ @set('theme', 'dark')
126+ @del 'dark'
127+ @setTheme(@get('theme'))
118128 @toggleLayout(layout, @hasLayout(layout)) for layout in @LAYOUTS
119129 @initSidebarWidth()
120130 return
121131
122− toggleDark: (enable) ->
132+ setTheme: (theme) ->
133+ if theme is 'auto'
134+ theme = if @darkModeQuery.matches then 'dark' else 'default'
123135 classList = document.documentElement.classList
124− classList.toggle('_theme-default', !enable)
125− classList.toggle('_theme-dark', enable)
136+ classList.remove('_theme-default', '_theme-dark')
137+ classList.add('_theme-' + theme)
138+ @updateColorMeta()
139+ return
140+
141+ updateColorMeta: ->
126142 color = getComputedStyle(document.documentElement).getPropertyValue('--headerBackground').trim()
127143 $('meta[name=theme-color]').setAttribute('content', color)
128144 return