summaryrefslogtreecommitdiffstats
path: root/src/objects/_button.scss
diff options
context:
space:
mode:
Diffstat (limited to 'src/objects/_button.scss')
-rw-r--r--src/objects/_button.scss260
1 files changed, 58 insertions, 202 deletions
diff --git a/src/objects/_button.scss b/src/objects/_button.scss
index 097bc21..854e1e3 100644
--- a/src/objects/_button.scss
+++ b/src/objects/_button.scss
@@ -1,17 +1,20 @@
1@use 'sass:list'; 1@use 'sass:list';
2@use 'sass:map';
3@use 'sass:meta';
4@use 'sass:string';
2@use 'iro-sass/src/iro-sass' as iro; 5@use 'iro-sass/src/iro-sass' as iro;
3@use '../functions' as fn; 6@use '../props';
7@use '../core.vars' as core;
4 8
5$sizes: 'sm' 'lg' 'xl' !default; 9@forward 'button.vars';
6$themes: 'accent' 'negative' !default; 10@use 'button.vars' as vars;
7$static-themes: 'black' 'white' !default;
8 11
9@mixin theme($theme: ()) { 12@mixin -apply-theme($theme, $key: ()) {
10 &:link, 13 &:link,
11 &:visited, 14 &:visited,
12 &:enabled { 15 &:enabled {
13 color: fn.color(list.join($theme, --label)); 16 color: props.get($theme, list.join($key, --label)...);
14 background-color: fn.color(list.join($theme, --bg)); 17 background-color: props.get($theme, list.join($key, --bg)...);
15 border-color: transparent; 18 border-color: transparent;
16 } 19 }
17 20
@@ -19,9 +22,9 @@ $static-themes: 'black' 'white' !default;
19 &:link, 22 &:link,
20 &:visited, 23 &:visited,
21 &:enabled { 24 &:enabled {
22 color: fn.color(list.join($theme, --outline-label)); 25 color: props.get($theme, list.join($key, --outline-label));
23 background-color: transparent; 26 background-color: transparent;
24 border-color: fn.color(list.join($theme, --outline-border)); 27 border-color: props.get($theme, list.join($key, --outline-border));
25 } 28 }
26 } 29 }
27 30
@@ -30,217 +33,71 @@ $static-themes: 'black' 'white' !default;
30 &:enabled { 33 &:enabled {
31 &:hover, 34 &:hover,
32 &:focus-visible { 35 &:focus-visible {
33 color: fn.color(list.join($theme, --hover --label)); 36 color: props.get($theme, list.join($key, --hover --label));
34 background-color: fn.color(list.join($theme, --hover --bg)); 37 background-color: props.get($theme, list.join($key, --hover --bg));
35 border-color: transparent; 38 border-color: transparent;
36 } 39 }
37 40
38 &:active { 41 &:active {
39 color: fn.color(list.join($theme, --active --label)); 42 color: props.get($theme, list.join($key, --active --label));
40 background-color: fn.color(list.join($theme, --active --bg)); 43 background-color: props.get($theme, list.join($key, --active --bg));
41 border-color: transparent; 44 border-color: transparent;
42 } 45 }
43 } 46 }
44} 47}
45 48
46@mixin static-theme($theme: ()) { 49@mixin -apply-static-theme($theme, $key: ()) {
47 color: fn.color(list.join($theme, --disabled --label)); 50 color: props.get($theme, list.join($key, --disabled --label));
48 background-color: fn.color(list.join($theme, --disabled --bg)); 51 background-color: props.get($theme, list.join($key, --disabled --bg));
49 border-color: transparent; 52 border-color: transparent;
50 53
51 &::after { 54 &::after {
52 outline: fn.color(list.join($theme, --key-focus --border)) solid fn.dim(--key-focus --border); 55 outline: props.get($theme, list.join($key, --key-focus --border)) solid props.get(vars.$key-focus--border-width);
53 box-shadow: 0 0 0 calc(fn.dim(--key-focus --border) + fn.dim(--key-focus --outline)) fn.color(list.join($theme, --key-focus --outline)); 56 box-shadow:
57 0
58 0
59 0
60 calc(props.get(vars.$key-focus--border-width) + props.get(vars.$key-focus--outline-width))
61 props.get($theme, list.join($key, --key-focus --outline));
54 } 62 }
55 63
56 @include iro.bem-modifier('outline') { 64 @include iro.bem-modifier('outline') {
57 background-color: transparent; 65 background-color: transparent;
58 border-color: fn.color(list.join($theme, --disabled --outline-border)); 66 border-color: props.get($theme, list.join($key, --disabled --outline-border));
59 } 67 }
60 68
61 @include theme($theme); 69 @include -apply-theme($theme, $key);
62 70
63 @include iro.bem-modifier('primary') { 71 @include iro.bem-modifier('primary') {
64 @include theme(list.join($theme, --primary)); 72 @include -apply-theme($theme, list.join($key, --primary));
65 } 73 }
66} 74}
67 75
68@include iro.props-namespace('button') { 76@mixin styles {
69 @include iro.props-store(( 77 @include props.materialize(meta.module-variables('vars'));
70 --dims: (
71 --line-height: 1.4,
72 --pad-i: fn.global-dim(--size --200),
73 --pad-i-label: fn.global-dim(--size --75),
74 --pad-b: fn.global-dim(--size --65),
75 --border: fn.global-dim(--border --medium),
76 --rounding: 10em,
77 --font-size: fn.global-dim(--font-size --100),
78 78
79 --sm: ( 79 @include iro.bem-object('button') {
80 --pad-i: fn.global-dim(--size --150),
81 --pad-i-label: fn.global-dim(--size --50),
82 --pad-b: fn.global-dim(--size --25),
83 --font-size: fn.global-dim(--font-size --75),
84 ),
85 --lg: (
86 --pad-i: fn.global-dim(--size --250),
87 --pad-i-label: fn.global-dim(--size --100),
88 --pad-b: fn.global-dim(--size --100),
89 --font-size: fn.global-dim(--font-size --150),
90 ),
91 --xl: (
92 --pad-i: fn.global-dim(--size --300),
93 --pad-i-label: fn.global-dim(--size --150),
94 --pad-b: fn.global-dim(--size --150),
95 --font-size: fn.global-dim(--font-size --200),
96 ),
97
98 --key-focus: (
99 --border: fn.global-dim(--key-focus --border),
100 --border-offset: fn.global-dim(--key-focus --border-offset),
101 --outline: fn.global-dim(--key-focus --outline),
102 ),
103 ),
104 --colors: (
105 --bg: fn.global-color(--border-mute),
106 --label: fn.global-color(--text),
107 --outline-border: fn.global-color(--border),
108 --outline-label: fn.global-color(--text),
109
110 --hover: (
111 --bg: fn.global-color(--border),
112 --label: fn.global-color(--heading),
113 ),
114 --active: (
115 --bg: fn.global-color(--border-strong),
116 --label: fn.global-color(--heading),
117 ),
118 --disabled: (
119 --bg: fn.global-color(--border-mute),
120 --outline-border: fn.global-color(--border),
121 --label: fn.global-color(--text-disabled),
122 ),
123 --key-focus: (
124 --label: fn.global-color(--focus --text),
125 --border: fn.global-color(--focus --border),
126 --outline: fn.global-color(--focus --outline),
127 ),
128
129 --primary: (
130 --bg: fn.global-color(--base --800),
131 --label: fn.global-color(--base --800-text),
132 --outline-border: fn.global-color(--base --800),
133 --outline-label: fn.global-color(--text),
134
135 --hover: (
136 --bg: fn.global-color(--base --900),
137 --label: fn.global-color(--base --900-text),
138 ),
139 --active: (
140 --bg: fn.global-color(--base --900),
141 --label: fn.global-color(--base --900-text),
142 ),
143 ),
144 ),
145 ));
146
147 @each $theme in $themes {
148 @include iro.props-store((
149 --colors: (
150 --#{$theme}: (
151 --bg: fn.global-color(--#{$theme}-static --900),
152 --label: fn.global-color(--#{$theme}-static --900-text),
153 --outline-border: fn.global-color(--#{$theme} --900),
154 --outline-label: fn.global-color(--#{$theme} --1000),
155
156 --hover: (
157 --bg: fn.global-color(--#{$theme}-static --1000),
158 --label: fn.global-color(--#{$theme}-static --1000-text),
159 ),
160 --active: (
161 --bg: fn.global-color(--#{$theme}-static --1100),
162 --label: fn.global-color(--#{$theme}-static --1100-text),
163 ),
164 ),
165 ),
166 ));
167 }
168
169 @each $theme in $static-themes {
170 @include iro.props-store((
171 --colors: (
172 --static-#{$theme}: (
173 --bg: fn.global-color(--#{$theme}-transparent --200),
174 --label: fn.global-color(--#{$theme}-transparent --900),
175 --outline-border: fn.global-color(--#{$theme}-transparent --300),
176 --outline-label: fn.global-color(--#{$theme}-transparent --900),
177
178 --hover: (
179 --bg: fn.global-color(--#{$theme}-transparent --300),
180 --label: fn.global-color(--#{$theme}-transparent --900),
181 ),
182 --active: (
183 --bg: fn.global-color(--#{$theme}-transparent --400),
184 --label: fn.global-color(--#{$theme}-transparent --900),
185 ),
186 --disabled: (
187 --bg: fn.global-color(--#{$theme}-transparent --200),
188 --outline-border: fn.global-color(--#{$theme}-transparent --300),
189 --label: fn.global-color(--#{$theme}-transparent --500),
190 ),
191 --key-focus: (
192 --bg: fn.global-color(--#{$theme}-transparent --100),
193 --label: fn.global-color(--#{$theme}-transparent --900),
194 --border: fn.global-color(--#{$theme}-transparent --900),
195 --outline: fn.global-color(--#{$theme}-transparent --300),
196 ),
197
198 --primary: (
199 --bg: fn.global-color(--#{$theme}-transparent --800),
200 --label: fn.global-color(--#{$theme}-transparent --text),
201 --outline-border: fn.global-color(--#{$theme}-transparent --800),
202 --outline-label: fn.global-color(--#{$theme}-transparent --900),
203
204 --hover: (
205 --bg: fn.global-color(--#{$theme}-transparent --900),
206 --label: fn.global-color(--#{$theme}-transparent --text),
207 ),
208 --active: (
209 --bg: fn.global-color(--#{$theme}-transparent --900),
210 --label: fn.global-color(--#{$theme}-transparent --text),
211 ),
212 ),
213 ),
214 ),
215 ));
216 }
217
218 @include iro.bem-object(iro.props-namespace()) {
219 position: relative; 80 position: relative;
220 display: inline-block; 81 display: inline-block;
221 padding-block: fn.dim(--pad-b); 82 padding-block: props.get(vars.$pad-b);
222 padding-inline: fn.dim(--pad-i); 83 padding-inline: props.get(vars.$pad-i);
223 font-size: fn.dim(--font-size); 84 font-size: props.get(vars.$font-size);
224 font-weight: 500; 85 font-weight: 500;
225 line-height: fn.dim(--line-height); 86 line-height: props.get(vars.$line-height);
226 color: fn.color(--disabled --label);
227 text-align: center; 87 text-align: center;
228 text-decoration: none; 88 text-decoration: none;
229 background-color: fn.color(--disabled --bg); 89 border: props.get(vars.$border-width) solid transparent;
230 border: fn.dim(--border) solid transparent; 90 border-radius: props.get(vars.$rounding);
231 border-color: fn.color(--disabled --bg);
232 border-radius: fn.dim(--rounding);
233 91
234 &::after { 92 &::after {
235 position: absolute; 93 position: absolute;
236 inset: calc(-1 * fn.dim(--border) - fn.dim(--key-focus --border-offset)); 94 inset: calc(-1 * props.get(vars.$border-width) - props.get(vars.$key-focus--border-offset));
237 z-index: 1; 95 z-index: 1;
238 display: none; 96 display: none;
239 pointer-events: none; 97 pointer-events: none;
240 content: ''; 98 content: '';
241 border-radius: calc(fn.dim(--rounding) + fn.dim(--key-focus --border-offset)); 99 border-radius: calc(props.get(vars.$rounding) + props.get(vars.$key-focus--border-offset));
242 outline: fn.color(--key-focus --border) solid fn.dim(--key-focus --border); 100 outline: transparent solid props.get(vars.$key-focus--border-width);
243 box-shadow: 0 0 0 calc(fn.dim(--key-focus --border) + fn.dim(--key-focus --outline)) fn.color(--key-focus --outline);
244 } 101 }
245 102
246 &:link, 103 &:link,
@@ -254,7 +111,7 @@ $static-themes: 'black' 'white' !default;
254 } 111 }
255 112
256 @include iro.bem-elem('label') { 113 @include iro.bem-elem('label') {
257 margin-inline: fn.dim(--pad-i-label); 114 margin-inline: props.get(vars.$pad-i-label);
258 } 115 }
259 116
260 @include iro.bem-modifier('block') { 117 @include iro.bem-modifier('block') {
@@ -263,37 +120,36 @@ $static-themes: 'black' 'white' !default;
263 120
264 @include iro.bem-modifier('outline') { 121 @include iro.bem-modifier('outline') {
265 background-color: transparent; 122 background-color: transparent;
266 border-color: fn.color(--disabled --outline-border);
267 } 123 }
268 124
269 @each $size in $sizes { 125 @each $mod, $pad-i, $pad-i-label, $pad-b, $font-size in vars.$sizes {
270 @include iro.bem-modifier($size) { 126 @include iro.bem-modifier($mod) {
271 padding-block: fn.dim(--#{$size} --pad-b); 127 padding-block: props.get($pad-b);
272 padding-inline: fn.dim(--#{$size} --pad-i); 128 padding-inline: props.get($pad-i);
273 font-size: fn.dim(--#{$size} --font-size); 129 font-size: props.get($font-size);
274 130
275 @include iro.bem-elem('label') { 131 @include iro.bem-elem('label') {
276 margin-inline: fn.dim(--#{$size} --pad-i-label); 132 margin-inline: props.get($pad-i-label);
277 } 133 }
278 } 134 }
279 } 135 }
280 136
281 @include static-theme; 137 @include -apply-static-theme(vars.$default-theme);
282 138
283 @each $theme in $themes { 139 @each $theme in map.keys(props.get(vars.$themes)) {
284 @include iro.bem-modifier($theme) { 140 @include iro.bem-modifier(string.slice($theme, 3)) {
285 @include theme(--#{$theme}); 141 @include -apply-theme(vars.$themes, $theme);
286 } 142 }
287 } 143 }
288 144
289 @each $theme in $static-themes { 145 @each $theme in map.keys(props.get(vars.$static-themes)) {
290 @include iro.bem-modifier(static-#{$theme}) { 146 @include iro.bem-modifier(string.slice($theme, 3)) {
291 @include static-theme(--static-#{$theme}); 147 @include -apply-static-theme(vars.$static-themes, $theme);
292 } 148 }
293 } 149 }
294 150
295 @include iro.bem-modifier('round') { 151 @include iro.bem-modifier('round') {
296 inline-size: calc(1em * fn.dim(--line-height) + 2 * fn.dim(--pad-b)); 152 inline-size: calc(1em * props.get(vars.$line-height) + 2 * props.get(vars.$pad-b));
297 padding-inline: 0; 153 padding-inline: 0;
298 border-radius: 100em; 154 border-radius: 100em;
299 } 155 }