diff options
-rw-r--r-- | src/_config.scss | 2 | ||||
-rw-r--r-- | src/_core.scss | 7 | ||||
-rw-r--r-- | src/_props.scss | 7 | ||||
-rw-r--r-- | src/objects/_button.scss | 29 | ||||
-rw-r--r-- | src/objects/_button.vars.scss | 15 | ||||
-rw-r--r-- | src/objects/_text-field.scss | 22 | ||||
-rw-r--r-- | src/objects/_text-field.vars.scss | 1 | ||||
-rw-r--r-- | tpl/objects/button.pug | 1 | ||||
-rw-r--r-- | tpl/objects/field-label.pug | 2 | ||||
-rw-r--r-- | tpl/objects/text-field.pug | 1 | ||||
-rw-r--r-- | tpl/views/button.pug | 24 |
11 files changed, 110 insertions, 1 deletions
diff --git a/src/_config.scss b/src/_config.scss index 284d6e7..25c0adb 100644 --- a/src/_config.scss +++ b/src/_config.scss | |||
@@ -25,3 +25,5 @@ $themes: map.deep-merge(( | |||
25 | ), $themes-override) !default; | 25 | ), $themes-override) !default; |
26 | 26 | ||
27 | $theme-default: list.nth(map.keys($themes), 1) !default; | 27 | $theme-default: list.nth(map.keys($themes), 1) !default; |
28 | |||
29 | $explicit-dark-theme: false !default; | ||
diff --git a/src/_core.scss b/src/_core.scss index 7b7a384..2eb04fc 100644 --- a/src/_core.scss +++ b/src/_core.scss | |||
@@ -20,6 +20,13 @@ | |||
20 | } | 20 | } |
21 | } | 21 | } |
22 | } | 22 | } |
23 | |||
24 | @if map.has-key($theme, 'dark') and config.$explicit-dark-theme { | ||
25 | @include bem.theme('dark') { | ||
26 | @include props.materialize(map.values(meta.module-variables('vars'))); | ||
27 | @include props.materialize(map.get($theme, 'dark')); | ||
28 | } | ||
29 | } | ||
23 | } @else { | 30 | } @else { |
24 | @include bem.theme(string.slice($theme-name, 3)) { | 31 | @include bem.theme(string.slice($theme-name, 3)) { |
25 | @include props.materialize(map.get($theme, 'light')); | 32 | @include props.materialize(map.get($theme, 'light')); |
diff --git a/src/_props.scss b/src/_props.scss index ffba054..5590aed 100644 --- a/src/_props.scss +++ b/src/_props.scss | |||
@@ -27,6 +27,13 @@ | |||
27 | } | 27 | } |
28 | } | 28 | } |
29 | 29 | ||
30 | @if config.$explicit-dark-theme { | ||
31 | @include bem.theme('dark') { | ||
32 | @include props.materialize($ref, 'color'); | ||
33 | @include props.materialize($ref, 'dark'); | ||
34 | } | ||
35 | } | ||
36 | |||
30 | @each $theme-name in map.keys(config.$themes) { | 37 | @each $theme-name in map.keys(config.$themes) { |
31 | @if $theme-name != config.$theme-default { | 38 | @if $theme-name != config.$theme-default { |
32 | @include bem.theme(string.slice($theme-name, 3)) { | 39 | @include bem.theme(string.slice($theme-name, 3)) { |
diff --git a/src/objects/_button.scss b/src/objects/_button.scss index 8fbec78..c4ecd87 100644 --- a/src/objects/_button.scss +++ b/src/objects/_button.scss | |||
@@ -109,6 +109,35 @@ | |||
109 | } | 109 | } |
110 | } | 110 | } |
111 | 111 | ||
112 | @include bem.is('highlighted') { | ||
113 | &:link, | ||
114 | &:visited, | ||
115 | &:enabled { | ||
116 | &, | ||
117 | &:hover, | ||
118 | &:focus-visible { | ||
119 | border-color: props.get($theme, list.join($key, --highlighted --border-color)...); | ||
120 | } | ||
121 | |||
122 | box-shadow: | ||
123 | 0 0 0 1px props.get($theme, list.join($key, --highlighted --border-color)...), | ||
124 | props.get(vars.$shadow-x) | ||
125 | props.get(vars.$shadow-y) | ||
126 | props.get(vars.$shadow-blur) | ||
127 | props.get(vars.$shadow-grow) | ||
128 | props.get($theme, list.join($key, --highlighted --shadow-color)...); | ||
129 | |||
130 | &:focus-visible { | ||
131 | box-shadow: | ||
132 | props.get(vars.$shadow-x) | ||
133 | props.get(vars.$shadow-y) | ||
134 | props.get(vars.$shadow-blur) | ||
135 | props.get(vars.$shadow-grow) | ||
136 | props.get($theme, list.join($key, --shadow-color)...); | ||
137 | } | ||
138 | } | ||
139 | } | ||
140 | |||
112 | @include bem.is('selected') { | 141 | @include bem.is('selected') { |
113 | color: props.get($theme, list.join($key, --selected --disabled --label-color)...); | 142 | color: props.get($theme, list.join($key, --selected --disabled --label-color)...); |
114 | background-color: props.get($theme, list.join($key, --selected --disabled --bg-color)...); | 143 | background-color: props.get($theme, list.join($key, --selected --disabled --bg-color)...); |
diff --git a/src/objects/_button.vars.scss b/src/objects/_button.vars.scss index 7b4670f..cc7b7d5 100644 --- a/src/objects/_button.vars.scss +++ b/src/objects/_button.vars.scss | |||
@@ -78,6 +78,11 @@ $default-theme: map.deep-merge(( | |||
78 | --outline-color: props.get(core.$theme, --focus, --outline), | 78 | --outline-color: props.get(core.$theme, --focus, --outline), |
79 | ), | 79 | ), |
80 | 80 | ||
81 | --highlighted: ( | ||
82 | --border-color: props.get(core.$theme, --focus, --border), | ||
83 | --shadow-color: props.get(core.$theme, --focus, --outline), | ||
84 | ), | ||
85 | |||
81 | --selected: ( | 86 | --selected: ( |
82 | --bg-color: props.get(core.$theme, --text), | 87 | --bg-color: props.get(core.$theme, --text), |
83 | --label-color: props.get(core.$theme, --base, --50), | 88 | --label-color: props.get(core.$theme, --base, --50), |
@@ -194,6 +199,11 @@ $default-theme-dark: props.def(--o-button, $default-theme-dark, 'dark'); | |||
194 | --outline-color: props.get(core.$transparent-colors, $theme, --300), | 199 | --outline-color: props.get(core.$transparent-colors, $theme, --300), |
195 | ), | 200 | ), |
196 | 201 | ||
202 | --highlighted: ( | ||
203 | --border-color: props.get(core.$transparent-colors, $theme, --900), | ||
204 | --shadow-color: props.get(core.$transparent-colors, --black, --200), | ||
205 | ), | ||
206 | |||
197 | --selected: ( | 207 | --selected: ( |
198 | --bg-color: props.get(core.$transparent-colors, $theme, --800), | 208 | --bg-color: props.get(core.$transparent-colors, $theme, --800), |
199 | --label-color: props.get(core.$transparent-colors, $theme, --text), | 209 | --label-color: props.get(core.$transparent-colors, $theme, --text), |
@@ -295,6 +305,11 @@ $themes-config: ( | |||
295 | --outline-color: props.get(core.$theme, --focus, --outline), | 305 | --outline-color: props.get(core.$theme, --focus, --outline), |
296 | ), | 306 | ), |
297 | 307 | ||
308 | --highlighted: ( | ||
309 | --border-color: props.get(core.$theme, $key, --900), | ||
310 | --shadow-color: props.get(core.$theme, $key, --200), | ||
311 | ), | ||
312 | |||
298 | --selected: ( | 313 | --selected: ( |
299 | --bg-color: props.get(core.$theme, #{$key}-static, --900), | 314 | --bg-color: props.get(core.$theme, #{$key}-static, --900), |
300 | --label-color: props.get(core.$theme, #{$key}-static, --900-text), | 315 | --label-color: props.get(core.$theme, #{$key}-static, --900-text), |
diff --git a/src/objects/_text-field.scss b/src/objects/_text-field.scss index 6c0e7d2..a52050c 100644 --- a/src/objects/_text-field.scss +++ b/src/objects/_text-field.scss | |||
@@ -120,6 +120,28 @@ | |||
120 | } | 120 | } |
121 | } | 121 | } |
122 | 122 | ||
123 | @include bem.modifier('pill') { | ||
124 | @include bem.multi('&', 'elem' 'bg') { | ||
125 | border-radius: 100em; | ||
126 | } | ||
127 | |||
128 | @include bem.elem('native') { | ||
129 | padding-inline: props.get(vars.$pad-i-pill); | ||
130 | |||
131 | &:focus { | ||
132 | @include bem.sibling-elem('bg') { | ||
133 | border-radius: 100em; | ||
134 | } | ||
135 | } | ||
136 | } | ||
137 | |||
138 | @include bem.modifier('extended') { | ||
139 | @include bem.elem('native') { | ||
140 | padding-inline: props.get(vars.$pad-i); | ||
141 | } | ||
142 | } | ||
143 | } | ||
144 | |||
123 | @include bem.is('invalid') { | 145 | @include bem.is('invalid') { |
124 | @include bem.elem('native') { | 146 | @include bem.elem('native') { |
125 | @include -invalid; | 147 | @include -invalid; |
diff --git a/src/objects/_text-field.vars.scss b/src/objects/_text-field.vars.scss index f64c42b..51099d8 100644 --- a/src/objects/_text-field.vars.scss +++ b/src/objects/_text-field.vars.scss | |||
@@ -4,6 +4,7 @@ | |||
4 | 4 | ||
5 | $line-height: props.def(--o-text-field--line-height, 1.4) !default; | 5 | $line-height: props.def(--o-text-field--line-height, 1.4) !default; |
6 | $pad-i: props.def(--o-text-field--pad-i, props.get(core.$size--125)) !default; | 6 | $pad-i: props.def(--o-text-field--pad-i, props.get(core.$size--125)) !default; |
7 | $pad-i-pill: props.def(--o-text-field--pad-i-pill, props.get(core.$size--175)) !default; | ||
7 | $pad-b: props.def(--o-text-field--pad-b, props.get(core.$size--125)) !default; | 8 | $pad-b: props.def(--o-text-field--pad-b, props.get(core.$size--125)) !default; |
8 | $border-width: props.def(--o-text-field--border-width, props.get(core.$border-width--thin)) !default; | 9 | $border-width: props.def(--o-text-field--border-width, props.get(core.$border-width--thin)) !default; |
9 | $rounding: props.def(--o-text-field--rounding, props.get(core.$rounding--sm)) !default; | 10 | $rounding: props.def(--o-text-field--rounding, props.get(core.$rounding--sm)) !default; |
diff --git a/tpl/objects/button.pug b/tpl/objects/button.pug index c356bfe..3b5de2b 100644 --- a/tpl/objects/button.pug +++ b/tpl/objects/button.pug | |||
@@ -11,6 +11,7 @@ mixin button | |||
11 | 'o-button--badge': attributes.badge, | 11 | 'o-button--badge': attributes.badge, |
12 | 'o-button--icon': !!attributes.icon && !block, | 12 | 'o-button--icon': !!attributes.icon && !block, |
13 | 'is-selected': attributes.selected, | 13 | 'is-selected': attributes.selected, |
14 | 'is-highlighted': attributes.highlighted, | ||
14 | } | 15 | } |
15 | if (attributes.theme) { | 16 | if (attributes.theme) { |
16 | classes['o-button--' + attributes.theme] = true | 17 | classes['o-button--' + attributes.theme] = true |
diff --git a/tpl/objects/field-label.pug b/tpl/objects/field-label.pug index fb96443..192780d 100644 --- a/tpl/objects/field-label.pug +++ b/tpl/objects/field-label.pug | |||
@@ -16,7 +16,7 @@ mixin field-label(label, hint=null) | |||
16 | 16 | ||
17 | let labelStyle = needsLabelWidth ? 'width: ' + attributes.labelWidth : ''; | 17 | let labelStyle = needsLabelWidth ? 'width: ' + attributes.labelWidth : ''; |
18 | 18 | ||
19 | div(class=classes) | 19 | label(class=classes) |
20 | .o-field-label__label(style=labelStyle class=attributes.labelClass)= label | 20 | .o-field-label__label(style=labelStyle class=attributes.labelClass)= label |
21 | .o-field-label__content(class=attributes.contentClass) | 21 | .o-field-label__content(class=attributes.contentClass) |
22 | block | 22 | block |
diff --git a/tpl/objects/text-field.pug b/tpl/objects/text-field.pug index 0342f01..6de30e9 100644 --- a/tpl/objects/text-field.pug +++ b/tpl/objects/text-field.pug | |||
@@ -12,6 +12,7 @@ mixin text-field | |||
12 | let classes = { | 12 | let classes = { |
13 | 'o-text-field': true, | 13 | 'o-text-field': true, |
14 | 'o-text-field--extended': !!block, | 14 | 'o-text-field--extended': !!block, |
15 | 'o-text-field--pill': attributes.pill, | ||
15 | 'is-invalid': attributes.invalid, | 16 | 'is-invalid': attributes.invalid, |
16 | 'is-disabled': attributes.disabled, | 17 | 'is-disabled': attributes.disabled, |
17 | 'l-media': !!block, | 18 | 'l-media': !!block, |
diff --git a/tpl/views/button.pug b/tpl/views/button.pug index 2e54458..4b8c59f 100644 --- a/tpl/views/button.pug +++ b/tpl/views/button.pug | |||
@@ -71,6 +71,8 @@ mixin view-button | |||
71 | .c-box | 71 | .c-box |
72 | +button= 'Idle' | 72 | +button= 'Idle' |
73 | = ' ' | 73 | = ' ' |
74 | +button(highlighted=true)= 'Highlighted' | ||
75 | = ' ' | ||
74 | +button(selected=true)= 'Selected' | 76 | +button(selected=true)= 'Selected' |
75 | = ' ' | 77 | = ' ' |
76 | +button(disabled=true)= 'Disabled' | 78 | +button(disabled=true)= 'Disabled' |
@@ -80,6 +82,8 @@ mixin view-button | |||
80 | br | 82 | br |
81 | +button(badge=true)= 'Idle' | 83 | +button(badge=true)= 'Idle' |
82 | = ' ' | 84 | = ' ' |
85 | +button(badge=true highlighted=true)= 'Highlighted' | ||
86 | = ' ' | ||
83 | +button(badge=true selected=true)= 'Selected' | 87 | +button(badge=true selected=true)= 'Selected' |
84 | = ' ' | 88 | = ' ' |
85 | +button(badge=true disabled=true)= 'Disabled' | 89 | +button(badge=true disabled=true)= 'Disabled' |
@@ -89,6 +93,8 @@ mixin view-button | |||
89 | br | 93 | br |
90 | +button(quiet=true)= 'Idle' | 94 | +button(quiet=true)= 'Idle' |
91 | = ' ' | 95 | = ' ' |
96 | +button(quiet=true highlighted=true)= 'Highlighted' | ||
97 | = ' ' | ||
92 | +button(quiet=true selected=true)= 'Selected' | 98 | +button(quiet=true selected=true)= 'Selected' |
93 | = ' ' | 99 | = ' ' |
94 | +button(quiet=true disabled=true)= 'Disabled' | 100 | +button(quiet=true disabled=true)= 'Disabled' |
@@ -98,6 +104,8 @@ mixin view-button | |||
98 | .c-box | 104 | .c-box |
99 | +button(pill=true)= 'Idle' | 105 | +button(pill=true)= 'Idle' |
100 | = ' ' | 106 | = ' ' |
107 | +button(pill=true highlighted=true)= 'Highlighted' | ||
108 | = ' ' | ||
101 | +button(pill=true selected=true)= 'Selected' | 109 | +button(pill=true selected=true)= 'Selected' |
102 | = ' ' | 110 | = ' ' |
103 | +button(pill=true disabled=true)= 'Disabled' | 111 | +button(pill=true disabled=true)= 'Disabled' |
@@ -107,6 +115,8 @@ mixin view-button | |||
107 | br | 115 | br |
108 | +button(pill=true badge=true)= 'Idle' | 116 | +button(pill=true badge=true)= 'Idle' |
109 | = ' ' | 117 | = ' ' |
118 | +button(pill=true badge=true highlighted=true)= 'Highlighted' | ||
119 | = ' ' | ||
110 | +button(pill=true badge=true selected=true)= 'Selected' | 120 | +button(pill=true badge=true selected=true)= 'Selected' |
111 | = ' ' | 121 | = ' ' |
112 | +button(pill=true badge=true disabled=true)= 'Disabled' | 122 | +button(pill=true badge=true disabled=true)= 'Disabled' |
@@ -116,6 +126,8 @@ mixin view-button | |||
116 | br | 126 | br |
117 | +button(pill=true quiet=true)= 'Idle' | 127 | +button(pill=true quiet=true)= 'Idle' |
118 | = ' ' | 128 | = ' ' |
129 | +button(pill=true quiet=true highlighted=true)= 'Highlighted' | ||
130 | = ' ' | ||
119 | +button(pill=true quiet=true selected=true)= 'Selected' | 131 | +button(pill=true quiet=true selected=true)= 'Selected' |
120 | = ' ' | 132 | = ' ' |
121 | +button(pill=true quiet=true disabled=true)= 'Disabled' | 133 | +button(pill=true quiet=true disabled=true)= 'Disabled' |
@@ -126,6 +138,8 @@ mixin view-button | |||
126 | .c-box | 138 | .c-box |
127 | +button(theme=theme)= 'Idle' | 139 | +button(theme=theme)= 'Idle' |
128 | = ' ' | 140 | = ' ' |
141 | +button(theme=theme highlighted=true)= 'Highlighted' | ||
142 | = ' ' | ||
129 | +button(theme=theme selected=true)= 'Selected' | 143 | +button(theme=theme selected=true)= 'Selected' |
130 | = ' ' | 144 | = ' ' |
131 | +button(theme=theme disabled=true)= 'Disabled' | 145 | +button(theme=theme disabled=true)= 'Disabled' |
@@ -135,6 +149,8 @@ mixin view-button | |||
135 | br | 149 | br |
136 | +button(theme=theme badge=true)= 'Idle' | 150 | +button(theme=theme badge=true)= 'Idle' |
137 | = ' ' | 151 | = ' ' |
152 | +button(theme=theme badge=true highlighted=true)= 'Highlighted' | ||
153 | = ' ' | ||
138 | +button(theme=theme badge=true selected=true)= 'Selected' | 154 | +button(theme=theme badge=true selected=true)= 'Selected' |
139 | = ' ' | 155 | = ' ' |
140 | +button(theme=theme badge=true disabled=true)= 'Disabled' | 156 | +button(theme=theme badge=true disabled=true)= 'Disabled' |
@@ -144,6 +160,8 @@ mixin view-button | |||
144 | br | 160 | br |
145 | +button(theme=theme quiet=true)= 'Idle' | 161 | +button(theme=theme quiet=true)= 'Idle' |
146 | = ' ' | 162 | = ' ' |
163 | +button(theme=theme quiet=true highlighted=true)= 'Highlighted' | ||
164 | = ' ' | ||
147 | +button(theme=theme quiet=true selected=true)= 'Selected' | 165 | +button(theme=theme quiet=true selected=true)= 'Selected' |
148 | = ' ' | 166 | = ' ' |
149 | +button(theme=theme quiet=true disabled=true)= 'Disabled' | 167 | +button(theme=theme quiet=true disabled=true)= 'Disabled' |
@@ -157,6 +175,8 @@ mixin view-button | |||
157 | .c-box(style=`background-color: var(--colors--blue-static--${bg});`) | 175 | .c-box(style=`background-color: var(--colors--blue-static--${bg});`) |
158 | +button(theme=theme)= 'Idle' | 176 | +button(theme=theme)= 'Idle' |
159 | = ' ' | 177 | = ' ' |
178 | +button(theme=theme highlighted=true)= 'Highlighted' | ||
179 | = ' ' | ||
160 | +button(theme=theme selected=true)= 'Selected' | 180 | +button(theme=theme selected=true)= 'Selected' |
161 | = ' ' | 181 | = ' ' |
162 | +button(theme=theme disabled=true)= 'Disabled' | 182 | +button(theme=theme disabled=true)= 'Disabled' |
@@ -166,6 +186,8 @@ mixin view-button | |||
166 | br | 186 | br |
167 | +button(theme=theme badge=true)= 'Idle' | 187 | +button(theme=theme badge=true)= 'Idle' |
168 | = ' ' | 188 | = ' ' |
189 | +button(theme=theme badge=true highlighted=true)= 'Highlighted' | ||
190 | = ' ' | ||
169 | +button(theme=theme badge=true selected=true)= 'Selected' | 191 | +button(theme=theme badge=true selected=true)= 'Selected' |
170 | = ' ' | 192 | = ' ' |
171 | +button(theme=theme badge=true disabled=true)= 'Disabled' | 193 | +button(theme=theme badge=true disabled=true)= 'Disabled' |
@@ -175,6 +197,8 @@ mixin view-button | |||
175 | br | 197 | br |
176 | +button(theme=theme quiet=true)= 'Idle' | 198 | +button(theme=theme quiet=true)= 'Idle' |
177 | = ' ' | 199 | = ' ' |
200 | +button(theme=theme quiet=true highlighted=true)= 'Highlighted' | ||
201 | = ' ' | ||
178 | +button(theme=theme quiet=true selected=true)= 'Selected' | 202 | +button(theme=theme quiet=true selected=true)= 'Selected' |
179 | = ' ' | 203 | = ' ' |
180 | +button(theme=theme quiet=true disabled=true)= 'Disabled' | 204 | +button(theme=theme quiet=true disabled=true)= 'Disabled' |