File tree 13 files changed +131
-2
lines changed 13 files changed +131
-2
lines changed Original file line number Diff line number Diff line change
1
+ <Dropdown local-class =" dropdown" data-test-dark-mode-menu ...attributes as |dd|>
2
+ <dd .Trigger local-class =" trigger" data-test-dark-mode-toggle>
3
+ {{ svg-jar this.icon local-class =" icon" }}
4
+ </dd .Trigger>
5
+
6
+ <dd .Menu local-class =" menu" as |menu|>
7
+ {{ #each this.colorSchemes as |colorScheme |}}
8
+ <menu .Item>
9
+ <button
10
+ local-class =" menu-button {{ if (eq colorScheme.mode this.colorScheme.scheme ) ' selected' }} "
11
+ type =" button"
12
+ {{ on ' click' (fn this.colorScheme.set colorScheme.mode )}}
13
+ >
14
+ {{ svg-jar colorScheme.svg local-class =" icon" }} {{ colorScheme.mode }}
15
+ </button >
16
+ </menu .Item>
17
+ {{ /each }}
18
+ </dd .Menu>
19
+ </Dropdown >
Original file line number Diff line number Diff line change
1
+ import { inject as service } from '@ember/service' ;
2
+ import Component from '@glimmer/component' ;
3
+
4
+ export default class Header extends Component {
5
+ /** @type {import("../services/dark-mode").default } */
6
+ @service colorScheme ;
7
+
8
+ colorSchemes = [
9
+ { mode : 'light' , svg : 'sun' } ,
10
+ { mode : 'dark' , svg : 'moon' } ,
11
+ { mode : 'system' , svg : 'color-mode' } ,
12
+ ] ;
13
+
14
+ get icon ( ) {
15
+ return this . colorSchemes . find ( ( { mode } ) => mode === this . colorScheme . scheme ) ?. svg ;
16
+ }
17
+ }
Original file line number Diff line number Diff line change
1
+ .dropdown {
2
+ line-height : 1rem ;
3
+ }
4
+
5
+ .icon {
6
+ width : 1.4em ;
7
+ height : auto;
8
+ }
9
+
10
+ .trigger {
11
+ background : none;
12
+ border : 0 ;
13
+ padding : 0 ;
14
+
15
+ /* hide arrow */
16
+ > span {
17
+ display : none !important ;
18
+ }
19
+ }
20
+
21
+ .menu {
22
+ right : 0 ;
23
+ min-width : max-content;
24
+ }
25
+
26
+ .menu-button {
27
+ composes : button-reset from '../styles/shared/buttons.module.css' ;
28
+ align-items : center;
29
+ gap : var (--space-2xs );
30
+ cursor : pointer;
31
+ text-transform : capitalize;
32
+ }
33
+
34
+ .selected {
35
+ background : light-dark (# e6e6e6, # 404040 );
36
+ }
Original file line number Diff line number Diff line change 14
14
</div >
15
15
16
16
<nav local-class =' nav' >
17
+ <ColorSchemeMenu local-class =" color-scheme-menu" />
18
+
17
19
<LinkTo @route =" crates" @query ={{ hash letter =null page =1 }} data-test-all-crates-link>
18
20
Browse All Crates
19
21
</LinkTo >
81
83
</nav >
82
84
83
85
<div local-class =' menu' >
86
+ <ColorSchemeMenu local-class =" color-scheme-menu" />
87
+
84
88
<Dropdown as |dd|>
85
89
<dd .Trigger local-class =" dropdown-button" >
86
90
Menu
Original file line number Diff line number Diff line change 101
101
.nav {
102
102
grid-area : nav;
103
103
display : flex;
104
- align-items : stretch ;
104
+ align-items : center ;
105
105
justify-self : end;
106
106
107
107
@media only screen and (max-width : 900px ) {
115
115
display : none;
116
116
117
117
@media only screen and (max-width : 900px ) {
118
- display : block;
118
+ display : flex;
119
+ align-items : center;
119
120
}
120
121
}
121
122
122
123
.menu-item-with-separator {
123
124
border-top : 1px solid var (--gray-border );
124
125
}
125
126
127
+ .color-scheme-menu {
128
+ margin-right : var (--space-xs );
129
+ }
130
+
126
131
.login-button {
127
132
composes : button-reset from '../styles/shared/buttons.module.css' ;
128
133
display : inline-flex;
Original file line number Diff line number Diff line change @@ -2,6 +2,7 @@ import Controller from '@ember/controller';
2
2
import { inject as service } from '@ember/service' ;
3
3
4
4
export default class ApplicationController extends Controller {
5
+ @service colorScheme ;
5
6
@service design ;
6
7
@service progress ;
7
8
@service router ;
Original file line number Diff line number Diff line change
1
+ import { helper } from '@ember/component/helper' ;
2
+
3
+ export default helper ( function ( [ mode ] ) {
4
+ if ( mode ) {
5
+ window . document . documentElement . dataset . colorScheme = mode ;
6
+ } else {
7
+ delete window . document . documentElement . dataset . colorScheme ;
8
+ }
9
+ } ) ;
Original file line number Diff line number Diff line change
1
+ import { action } from '@ember/object' ;
2
+ import Service from '@ember/service' ;
3
+ import { tracked } from '@glimmer/tracking' ;
4
+
5
+ import * as localStorage from '../utils/local-storage' ;
6
+
7
+ const DEFAULT_SCHEME = 'light' ;
8
+ const VALID_SCHEMES = new Set ( [ 'light' , 'dark' , 'system' ] ) ;
9
+ const LS_KEY = 'color-scheme' ;
10
+
11
+ export default class DesignService extends Service {
12
+ @tracked _scheme = localStorage . getItem ( LS_KEY ) ;
13
+
14
+ get scheme ( ) {
15
+ return VALID_SCHEMES . has ( this . _scheme ) ? this . _scheme : DEFAULT_SCHEME ;
16
+ }
17
+
18
+ @action set ( scheme ) {
19
+ this . _scheme = scheme ;
20
+ localStorage . setItem ( LS_KEY , scheme ) ;
21
+ }
22
+ }
Original file line number Diff line number Diff line change 77
77
color-scheme : light dark;
78
78
}
79
79
80
+ [data-color-scheme = "light" ] {
81
+ color-scheme : light;
82
+ }
83
+
84
+ [data-color-scheme = "dark" ] {
85
+ color-scheme : dark;
86
+ }
87
+
80
88
[data-theme = "new-design" ] {
81
89
--header-bg-color : var (--violet800 );
82
90
--main-bg : white;
Original file line number Diff line number Diff line change 2
2
3
3
{{ page-title " crates.io: Rust Package Registry" separator =' - ' prepend =true }}
4
4
{{ set-theme this.design.theme }}
5
+ {{ set-color-scheme this.colorScheme.scheme }}
5
6
6
7
<ProgressBar />
7
8
<NotificationContainer @position =" top-right" />
You can’t perform that action at this time.
0 commit comments