summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.stylelintrc.json2
-rw-r--r--package.json14
-rw-r--r--pnpm-lock.yaml728
-rw-r--r--src/_apca.scss164
-rw-r--r--src/_config.defaults.scss314
-rw-r--r--src/_config.scss10
-rw-r--r--src/_core.scss53
-rw-r--r--src/_core.vars.scss93
-rw-r--r--src/_functions.scss82
-rw-r--r--src/_iro-design.scss32
-rw-r--r--src/_layers.scss3
-rw-r--r--src/_mixins.scss42
-rw-r--r--src/_props.scss57
-rw-r--r--src/_themes.scss105
-rw-r--r--src/_utils.scss536
-rw-r--r--src/layouts/_button-group.scss45
-rw-r--r--src/layouts/_button-group.vars.scss14
-rw-r--r--src/layouts/_card-list.scss192
-rw-r--r--src/layouts/_card-list.vars.scss21
-rw-r--r--src/layouts/_container.scss30
-rw-r--r--src/layouts/_container.vars.scss12
-rw-r--r--src/layouts/_flex.scss24
-rw-r--r--src/layouts/_form.scss80
-rw-r--r--src/layouts/_media.scss50
-rw-r--r--src/layouts/_media.vars.scss8
-rw-r--r--src/layouts/_overflow.scss8
-rw-r--r--src/layouts/_split-view.scss119
-rw-r--r--src/layouts/_split-view.vars.scss3
-rw-r--r--src/objects/_action-button.scss213
-rw-r--r--src/objects/_action-button.vars.scss193
-rw-r--r--src/objects/_alert.scss40
-rw-r--r--src/objects/_alert.vars.scss29
-rw-r--r--src/objects/_avatar.scss187
-rw-r--r--src/objects/_avatar.vars.scss18
-rw-r--r--src/objects/_backdrop.scss24
-rw-r--r--src/objects/_badge.scss144
-rw-r--r--src/objects/_badge.vars.scss161
-rw-r--r--src/objects/_button.scss379
-rw-r--r--src/objects/_button.vars.scss446
-rw-r--r--src/objects/_card.scss402
-rw-r--r--src/objects/_card.vars.scss24
-rw-r--r--src/objects/_checkbox.scss380
-rw-r--r--src/objects/_checkbox.vars.scss2
-rw-r--r--src/objects/_divider.scss283
-rw-r--r--src/objects/_divider.vars.scss72
-rw-r--r--src/objects/_emoji.scss66
-rw-r--r--src/objects/_emoji.vars.scss8
-rw-r--r--src/objects/_field-label.scss110
-rw-r--r--src/objects/_figure.scss26
-rw-r--r--src/objects/_figure.vars.scss9
-rw-r--r--src/objects/_heading.scss90
-rw-r--r--src/objects/_heading.vars.scss26
-rw-r--r--src/objects/_icon.scss26
-rw-r--r--src/objects/_lightbox.scss208
-rw-r--r--src/objects/_lightbox.vars.scss12
-rw-r--r--src/objects/_menu.scss154
-rw-r--r--src/objects/_navbar.scss292
-rw-r--r--src/objects/_navbar.vars.scss104
-rw-r--r--src/objects/_palette.scss86
-rw-r--r--src/objects/_placeholders.scss22
-rw-r--r--src/objects/_placeholders.vars.scss6
-rw-r--r--src/objects/_popover.scss56
-rw-r--r--src/objects/_popover.vars.scss11
-rw-r--r--src/objects/_radio.scss248
-rw-r--r--src/objects/_radio.vars.scss2
-rw-r--r--src/objects/_side-nav.scss134
-rw-r--r--src/objects/_side-nav.vars.scss2
-rw-r--r--src/objects/_status-indicator.scss26
-rw-r--r--src/objects/_status-indicator.vars.scss18
-rw-r--r--src/objects/_switch.scss302
-rw-r--r--src/objects/_switch.vars.scss2
-rw-r--r--src/objects/_tabbar.scss113
-rw-r--r--src/objects/_tabbar.vars.scss25
-rw-r--r--src/objects/_table.scss232
-rw-r--r--src/objects/_table.vars.scss2
-rw-r--r--src/objects/_tabs.scss127
-rw-r--r--src/objects/_tabs.vars.scss25
-rw-r--r--src/objects/_text-field.scss272
-rw-r--r--src/objects/_text-field.vars.scss3
-rw-r--r--src/objects/_thumbnail.scss160
-rw-r--r--src/objects/_thumbnail.vars.scss34
-rw-r--r--src/scopes/_blockquotes.scss28
-rw-r--r--src/scopes/_body.scss75
-rw-r--r--src/scopes/_body.vars.scss5
-rw-r--r--src/scopes/_code.scss54
-rw-r--r--src/scopes/_code.vars.scss4
-rw-r--r--src/scopes/_figures.scss21
-rw-r--r--src/scopes/_headings.scss112
-rw-r--r--src/scopes/_implicit.scss269
-rw-r--r--src/scopes/_implicit.vars.scss2
-rw-r--r--src/scopes/_links.scss186
-rw-r--r--src/scopes/_links.vars.scss31
-rw-r--r--src/scopes/_lists.scss80
-rw-r--r--src/scopes/_tables.scss156
-rw-r--r--src_demo/index.scss8
-rw-r--r--tpl/index.pug6
-rw-r--r--tpl/objects/action-button.pug34
-rw-r--r--tpl/objects/badge.pug37
-rw-r--r--tpl/objects/button.pug27
-rw-r--r--tpl/objects/card.pug18
-rw-r--r--tpl/objects/dialog.pug6
-rw-r--r--tpl/objects/divider.pug2
-rw-r--r--tpl/objects/field-label.pug2
-rw-r--r--tpl/objects/icon-nav.pug8
-rw-r--r--tpl/objects/lightbox.pug6
-rw-r--r--tpl/objects/menu.pug2
-rw-r--r--tpl/objects/navbar.pug2
-rw-r--r--tpl/objects/side-nav.pug2
-rw-r--r--tpl/objects/text-field.pug1
-rw-r--r--tpl/views/action-button.pug109
-rw-r--r--tpl/views/badge.pug69
-rw-r--r--tpl/views/button.pug231
-rw-r--r--tpl/views/card.pug70
-rw-r--r--tpl/views/dialog.pug4
-rw-r--r--tpl/views/divider.pug23
-rw-r--r--tpl/views/emoji.pug8
-rw-r--r--tpl/views/form.pug2
-rw-r--r--tpl/views/menu.pug2
-rw-r--r--tpl/views/popover.pug2
-rw-r--r--tpl/views/text-field.pug6
120 files changed, 5549 insertions, 5038 deletions
diff --git a/.stylelintrc.json b/.stylelintrc.json
index c00dafa..0b9d42a 100644
--- a/.stylelintrc.json
+++ b/.stylelintrc.json
@@ -4,7 +4,7 @@
4 "stylelint-config-recess-order" 4 "stylelint-config-recess-order"
5 ], 5 ],
6 "rules": { 6 "rules": {
7 "@stylistic/indentation": 4, 7 "@stylistic/indentation": "tab",
8 "@stylistic/number-leading-zero": "never", 8 "@stylistic/number-leading-zero": "never",
9 "@stylistic/declaration-colon-space-after": null, 9 "@stylistic/declaration-colon-space-after": null,
10 "max-nesting-depth": 7, 10 "max-nesting-depth": 7,
diff --git a/package.json b/package.json
index cc74db1..0ea461b 100644
--- a/package.json
+++ b/package.json
@@ -16,22 +16,24 @@
16 "build:style": "sass --load-path=node_modules src_demo/index.scss public/style.css", 16 "build:style": "sass --load-path=node_modules src_demo/index.scss public/style.css",
17 "lint:style": "stylelint \"src/**/*.scss\"", 17 "lint:style": "stylelint \"src/**/*.scss\"",
18 "fix:style": "stylelint \"src/**/*.scss\" --fix", 18 "fix:style": "stylelint \"src/**/*.scss\" --fix",
19 "serve": "python -m http.server --bind 127.0.0.1 --directory public 8001" 19 "serve": "python -m http.server --bind 127.0.0.1 --directory public 8001",
20 "watch": "nodemon --watch src --watch src_demo --watch tpl -e scss,pug --exec pnpm build"
20 }, 21 },
21 "dependencies": { 22 "dependencies": {
22 "include-media": "^2.0.0", 23 "include-media": "^2.0.0",
23 "iro-sass": "git+https://git.vulpes.one/git/iro-sass.git#351814a60e8909814c7120db96314a1a25d962bd" 24 "iro-sass": "git+https://git.vulpes.one/git/iro-sass.git#f0f84513f8efe533b6ee670a6f1a0c074387b2ec",
25 "nodemon": "^3.1.10"
24 }, 26 },
25 "devDependencies": { 27 "devDependencies": {
26 "iro-icons": "git+https://git.vulpes.one/git/iro-icons.git#8b921f634a565fd9bb8f6e0ddb1b4d7ba207c0a0", 28 "iro-icons": "git+https://git.vulpes.one/git/iro-icons.git#8b921f634a565fd9bb8f6e0ddb1b4d7ba207c0a0",
27 "postcss-scss": "^4.0.6", 29 "postcss-scss": "^4.0.6",
28 "pug": "^3.0.3", 30 "pug": "^3.0.3",
29 "pug-cli": "^1.0.0-alpha6", 31 "pug-cli": "^1.0.0-alpha6",
30 "sass": "^1.79.4", 32 "sass": "^1.89.2",
31 "stylelint": "^16.9.0", 33 "stylelint": "^16.22.0",
32 "stylelint-config-recess-order": "^5.1.1", 34 "stylelint-config-recess-order": "^7.1.0",
33 "stylelint-config-sass-guidelines": "^12.1.0", 35 "stylelint-config-sass-guidelines": "^12.1.0",
34 "stylelint-order": "^6.0.4", 36 "stylelint-order": "^7.0.0",
35 "svg-sprite": "^2.0.4" 37 "svg-sprite": "^2.0.4"
36 } 38 }
37} 39}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index da001c6..600d9ce 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -12,15 +12,18 @@ importers:
12 specifier: ^2.0.0 12 specifier: ^2.0.0
13 version: 2.0.0 13 version: 2.0.0
14 iro-sass: 14 iro-sass:
15 specifier: git+https://git.vulpes.one/git/iro-sass.git#351814a60e8909814c7120db96314a1a25d962bd 15 specifier: git+https://git.vulpes.one/git/iro-sass.git#f0f84513f8efe533b6ee670a6f1a0c074387b2ec
16 version: git+https://git.vulpes.one/git/iro-sass.git#351814a60e8909814c7120db96314a1a25d962bd 16 version: git+https://git.vulpes.one/git/iro-sass.git#f0f84513f8efe533b6ee670a6f1a0c074387b2ec
17 nodemon:
18 specifier: ^3.1.10
19 version: 3.1.10
17 devDependencies: 20 devDependencies:
18 iro-icons: 21 iro-icons:
19 specifier: git+https://git.vulpes.one/git/iro-icons.git#8b921f634a565fd9bb8f6e0ddb1b4d7ba207c0a0 22 specifier: git+https://git.vulpes.one/git/iro-icons.git#8b921f634a565fd9bb8f6e0ddb1b4d7ba207c0a0
20 version: git+https://git.vulpes.one/git/iro-icons.git#8b921f634a565fd9bb8f6e0ddb1b4d7ba207c0a0(svg-sprite@2.0.4) 23 version: git+https://git.vulpes.one/git/iro-icons.git#8b921f634a565fd9bb8f6e0ddb1b4d7ba207c0a0(svg-sprite@2.0.4)
21 postcss-scss: 24 postcss-scss:
22 specifier: ^4.0.6 25 specifier: ^4.0.6
23 version: 4.0.9(postcss@8.4.38) 26 version: 4.0.9(postcss@8.5.4)
24 pug: 27 pug:
25 specifier: ^3.0.3 28 specifier: ^3.0.3
26 version: 3.0.3 29 version: 3.0.3
@@ -28,28 +31,28 @@ importers:
28 specifier: ^1.0.0-alpha6 31 specifier: ^1.0.0-alpha6
29 version: 1.0.0-alpha6 32 version: 1.0.0-alpha6
30 sass: 33 sass:
31 specifier: ^1.79.4 34 specifier: ^1.89.2
32 version: 1.79.4 35 version: 1.89.2
33 stylelint: 36 stylelint:
34 specifier: ^16.9.0 37 specifier: ^16.22.0
35 version: 16.9.0 38 version: 16.22.0
36 stylelint-config-recess-order: 39 stylelint-config-recess-order:
37 specifier: ^5.1.1 40 specifier: ^7.1.0
38 version: 5.1.1(stylelint@16.9.0) 41 version: 7.1.0(stylelint-order@7.0.0(stylelint@16.22.0))(stylelint@16.22.0)
39 stylelint-config-sass-guidelines: 42 stylelint-config-sass-guidelines:
40 specifier: ^12.1.0 43 specifier: ^12.1.0
41 version: 12.1.0(postcss@8.4.38)(stylelint@16.9.0) 44 version: 12.1.0(postcss@8.5.4)(stylelint@16.22.0)
42 stylelint-order: 45 stylelint-order:
43 specifier: ^6.0.4 46 specifier: ^7.0.0
44 version: 6.0.4(stylelint@16.9.0) 47 version: 7.0.0(stylelint@16.22.0)
45 svg-sprite: 48 svg-sprite:
46 specifier: ^2.0.4 49 specifier: ^2.0.4
47 version: 2.0.4 50 version: 2.0.4
48 51
49packages: 52packages:
50 53
51 '@babel/code-frame@7.25.7': 54 '@babel/code-frame@7.27.1':
52 resolution: {integrity: sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==} 55 resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==}
53 engines: {node: '>=6.9.0'} 56 engines: {node: '>=6.9.0'}
54 57
55 '@babel/helper-string-parser@7.24.7': 58 '@babel/helper-string-parser@7.24.7':
@@ -60,12 +63,8 @@ packages:
60 resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} 63 resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==}
61 engines: {node: '>=6.9.0'} 64 engines: {node: '>=6.9.0'}
62 65
63 '@babel/helper-validator-identifier@7.25.7': 66 '@babel/helper-validator-identifier@7.27.1':
64 resolution: {integrity: sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==} 67 resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==}
65 engines: {node: '>=6.9.0'}
66
67 '@babel/highlight@7.25.7':
68 resolution: {integrity: sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==}
69 engines: {node: '>=6.9.0'} 68 engines: {node: '>=6.9.0'}
70 69
71 '@babel/parser@7.24.7': 70 '@babel/parser@7.24.7':
@@ -87,10 +86,20 @@ packages:
87 peerDependencies: 86 peerDependencies:
88 '@csstools/css-tokenizer': ^3.0.1 87 '@csstools/css-tokenizer': ^3.0.1
89 88
89 '@csstools/css-parser-algorithms@3.0.5':
90 resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==}
91 engines: {node: '>=18'}
92 peerDependencies:
93 '@csstools/css-tokenizer': ^3.0.4
94
90 '@csstools/css-tokenizer@3.0.1': 95 '@csstools/css-tokenizer@3.0.1':
91 resolution: {integrity: sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==} 96 resolution: {integrity: sha512-UBqaiu7kU0lfvaP982/o3khfXccVlHPWp0/vwwiIgDF0GmqqqxoiXC/6FCjlS9u92f7CoEz6nXKQnrn1kIAkOw==}
92 engines: {node: '>=18'} 97 engines: {node: '>=18'}
93 98
99 '@csstools/css-tokenizer@3.0.4':
100 resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==}
101 engines: {node: '>=18'}
102
94 '@csstools/media-query-list-parser@3.0.1': 103 '@csstools/media-query-list-parser@3.0.1':
95 resolution: {integrity: sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==} 104 resolution: {integrity: sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==}
96 engines: {node: '>=18'} 105 engines: {node: '>=18'}
@@ -98,11 +107,18 @@ packages:
98 '@csstools/css-parser-algorithms': ^3.0.1 107 '@csstools/css-parser-algorithms': ^3.0.1
99 '@csstools/css-tokenizer': ^3.0.1 108 '@csstools/css-tokenizer': ^3.0.1
100 109
101 '@csstools/selector-specificity@4.0.0': 110 '@csstools/media-query-list-parser@4.0.3':
102 resolution: {integrity: sha512-189nelqtPd8++phaHNwYovKZI0FOzH1vQEE3QhHHkNIGrg5fSs9CbYP3RvfEH5geztnIA9Jwq91wyOIwAW5JIQ==} 111 resolution: {integrity: sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==}
103 engines: {node: '>=18'} 112 engines: {node: '>=18'}
104 peerDependencies: 113 peerDependencies:
105 postcss-selector-parser: ^6.1.0 114 '@csstools/css-parser-algorithms': ^3.0.5
115 '@csstools/css-tokenizer': ^3.0.4
116
117 '@csstools/selector-specificity@5.0.0':
118 resolution: {integrity: sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==}
119 engines: {node: '>=18'}
120 peerDependencies:
121 postcss-selector-parser: ^7.0.0
106 122
107 '@dabh/diagnostics@2.0.3': 123 '@dabh/diagnostics@2.0.3':
108 resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} 124 resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==}
@@ -110,6 +126,9 @@ packages:
110 '@dual-bundle/import-meta-resolve@4.1.0': 126 '@dual-bundle/import-meta-resolve@4.1.0':
111 resolution: {integrity: sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==} 127 resolution: {integrity: sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==}
112 128
129 '@keyv/serialize@1.1.0':
130 resolution: {integrity: sha512-RlDgexML7Z63Q8BSaqhXdCYNBy/JQnqYIwxofUrNLGCblOMHp+xux2Q8nLMLlPpgHQPoU0Do8Z6btCpRBEqZ8g==}
131
113 '@nodelib/fs.scandir@2.1.5': 132 '@nodelib/fs.scandir@2.1.5':
114 resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 133 resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
115 engines: {node: '>= 8'} 134 engines: {node: '>= 8'}
@@ -122,6 +141,88 @@ packages:
122 resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 141 resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
123 engines: {node: '>= 8'} 142 engines: {node: '>= 8'}
124 143
144 '@parcel/watcher-android-arm64@2.5.1':
145 resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==}
146 engines: {node: '>= 10.0.0'}
147 cpu: [arm64]
148 os: [android]
149
150 '@parcel/watcher-darwin-arm64@2.5.1':
151 resolution: {integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==}
152 engines: {node: '>= 10.0.0'}
153 cpu: [arm64]
154 os: [darwin]
155
156 '@parcel/watcher-darwin-x64@2.5.1':
157 resolution: {integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==}
158 engines: {node: '>= 10.0.0'}
159 cpu: [x64]
160 os: [darwin]
161
162 '@parcel/watcher-freebsd-x64@2.5.1':
163 resolution: {integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==}
164 engines: {node: '>= 10.0.0'}
165 cpu: [x64]
166 os: [freebsd]
167
168 '@parcel/watcher-linux-arm-glibc@2.5.1':
169 resolution: {integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==}
170 engines: {node: '>= 10.0.0'}
171 cpu: [arm]
172 os: [linux]
173
174 '@parcel/watcher-linux-arm-musl@2.5.1':
175 resolution: {integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==}
176 engines: {node: '>= 10.0.0'}
177 cpu: [arm]
178 os: [linux]
179
180 '@parcel/watcher-linux-arm64-glibc@2.5.1':
181 resolution: {integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==}
182 engines: {node: '>= 10.0.0'}
183 cpu: [arm64]
184 os: [linux]
185
186 '@parcel/watcher-linux-arm64-musl@2.5.1':
187 resolution: {integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==}
188 engines: {node: '>= 10.0.0'}
189 cpu: [arm64]
190 os: [linux]
191
192 '@parcel/watcher-linux-x64-glibc@2.5.1':
193 resolution: {integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==}
194 engines: {node: '>= 10.0.0'}
195 cpu: [x64]
196 os: [linux]
197
198 '@parcel/watcher-linux-x64-musl@2.5.1':
199 resolution: {integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==}
200 engines: {node: '>= 10.0.0'}
201 cpu: [x64]
202 os: [linux]
203
204 '@parcel/watcher-win32-arm64@2.5.1':
205 resolution: {integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==}
206 engines: {node: '>= 10.0.0'}
207 cpu: [arm64]
208 os: [win32]
209
210 '@parcel/watcher-win32-ia32@2.5.1':
211 resolution: {integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==}
212 engines: {node: '>= 10.0.0'}
213 cpu: [ia32]
214 os: [win32]
215
216 '@parcel/watcher-win32-x64@2.5.1':
217 resolution: {integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==}
218 engines: {node: '>= 10.0.0'}
219 cpu: [x64]
220 os: [win32]
221
222 '@parcel/watcher@2.5.1':
223 resolution: {integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==}
224 engines: {node: '>= 10.0.0'}
225
125 '@resvg/resvg-js-android-arm-eabi@2.6.2': 226 '@resvg/resvg-js-android-arm-eabi@2.6.2':
126 resolution: {integrity: sha512-FrJibrAk6v29eabIPgcTUMPXiEz8ssrAk7TXxsiZzww9UTQ1Z5KAbFJs+Z0Ez+VZTYgnE5IQJqBcoSiMebtPHA==} 227 resolution: {integrity: sha512-FrJibrAk6v29eabIPgcTUMPXiEz8ssrAk7TXxsiZzww9UTQ1Z5KAbFJs+Z0Ez+VZTYgnE5IQJqBcoSiMebtPHA==}
127 engines: {node: '>= 10'} 228 engines: {node: '>= 10'}
@@ -254,22 +355,18 @@ packages:
254 resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 355 resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
255 engines: {node: '>=8'} 356 engines: {node: '>=8'}
256 357
257 ansi-regex@6.1.0:
258 resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==}
259 engines: {node: '>=12'}
260
261 ansi-styles@2.2.1: 358 ansi-styles@2.2.1:
262 resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==} 359 resolution: {integrity: sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==}
263 engines: {node: '>=0.10.0'} 360 engines: {node: '>=0.10.0'}
264 361
265 ansi-styles@3.2.1:
266 resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
267 engines: {node: '>=4'}
268
269 ansi-styles@4.3.0: 362 ansi-styles@4.3.0:
270 resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 363 resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
271 engines: {node: '>=8'} 364 engines: {node: '>=8'}
272 365
366 anymatch@3.1.3:
367 resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
368 engines: {node: '>= 8'}
369
273 argparse@2.0.1: 370 argparse@2.0.1:
274 resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} 371 resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
275 372
@@ -310,6 +407,10 @@ packages:
310 balanced-match@2.0.0: 407 balanced-match@2.0.0:
311 resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} 408 resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==}
312 409
410 binary-extensions@2.3.0:
411 resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
412 engines: {node: '>=8'}
413
313 boolbase@1.0.0: 414 boolbase@1.0.0:
314 resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} 415 resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
315 416
@@ -320,6 +421,9 @@ packages:
320 resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 421 resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
321 engines: {node: '>=8'} 422 engines: {node: '>=8'}
322 423
424 cacheable@1.10.2:
425 resolution: {integrity: sha512-hMkETCRV4hwBAvjQY1/xGw15tlPj+7cM4d5HOlYJJFftLQVRCboVX+mT6AJ6eL0fsqUhSUwDiF+pgfTR2r2Hxg==}
426
323 call-bind@1.0.7: 427 call-bind@1.0.7:
324 resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} 428 resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
325 engines: {node: '>= 0.4'} 429 engines: {node: '>= 0.4'}
@@ -340,15 +444,15 @@ packages:
340 resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==} 444 resolution: {integrity: sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==}
341 engines: {node: '>=0.10.0'} 445 engines: {node: '>=0.10.0'}
342 446
343 chalk@2.4.2:
344 resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
345 engines: {node: '>=4'}
346
347 character-parser@2.2.0: 447 character-parser@2.2.0:
348 resolution: {integrity: sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==} 448 resolution: {integrity: sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==}
349 449
350 chokidar@4.0.1: 450 chokidar@3.6.0:
351 resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} 451 resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
452 engines: {node: '>= 8.10.0'}
453
454 chokidar@4.0.3:
455 resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
352 engines: {node: '>= 14.16.0'} 456 engines: {node: '>= 14.16.0'}
353 457
354 clean-css@4.2.4: 458 clean-css@4.2.4:
@@ -433,8 +537,8 @@ packages:
433 typescript: 537 typescript:
434 optional: true 538 optional: true
435 539
436 css-functions-list@3.2.2: 540 css-functions-list@3.2.3:
437 resolution: {integrity: sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==} 541 resolution: {integrity: sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==}
438 engines: {node: '>=12 || >=16'} 542 engines: {node: '>=12 || >=16'}
439 543
440 css-select@4.3.0: 544 css-select@4.3.0:
@@ -451,6 +555,10 @@ packages:
451 resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} 555 resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==}
452 engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} 556 engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
453 557
558 css-tree@3.1.0:
559 resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==}
560 engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
561
454 css-what@6.1.0: 562 css-what@6.1.0:
455 resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} 563 resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==}
456 engines: {node: '>= 6'} 564 engines: {node: '>= 6'}
@@ -467,8 +575,8 @@ packages:
467 cssom@0.5.0: 575 cssom@0.5.0:
468 resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} 576 resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==}
469 577
470 debug@4.3.7: 578 debug@4.4.1:
471 resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} 579 resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==}
472 engines: {node: '>=6.0'} 580 engines: {node: '>=6.0'}
473 peerDependencies: 581 peerDependencies:
474 supports-color: '*' 582 supports-color: '*'
@@ -484,6 +592,11 @@ packages:
484 resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} 592 resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
485 engines: {node: '>= 0.4'} 593 engines: {node: '>= 0.4'}
486 594
595 detect-libc@1.0.3:
596 resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==}
597 engines: {node: '>=0.10'}
598 hasBin: true
599
487 dir-glob@3.0.1: 600 dir-glob@3.0.1:
488 resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} 601 resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
489 engines: {node: '>=8'} 602 engines: {node: '>=8'}
@@ -543,37 +656,35 @@ packages:
543 fast-deep-equal@3.1.3: 656 fast-deep-equal@3.1.3:
544 resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} 657 resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
545 658
546 fast-glob@3.3.2: 659 fast-glob@3.3.3:
547 resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 660 resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==}
548 engines: {node: '>=8.6.0'} 661 engines: {node: '>=8.6.0'}
549 662
550 fast-uri@3.0.2: 663 fast-uri@3.0.6:
551 resolution: {integrity: sha512-GR6f0hD7XXyNJa25Tb9BuIdN0tdr+0BMi6/CJPH3wJO1JjNG3n/VsSw38AwRdKZABm8lGbPfakLRkYzx2V9row==} 664 resolution: {integrity: sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==}
552 665
553 fastest-levenshtein@1.0.16: 666 fastest-levenshtein@1.0.16:
554 resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} 667 resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==}
555 engines: {node: '>= 4.9.1'} 668 engines: {node: '>= 4.9.1'}
556 669
557 fastq@1.17.1: 670 fastq@1.19.1:
558 resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 671 resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==}
559 672
560 fecha@4.2.3: 673 fecha@4.2.3:
561 resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} 674 resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==}
562 675
563 file-entry-cache@9.1.0: 676 file-entry-cache@10.1.1:
564 resolution: {integrity: sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==} 677 resolution: {integrity: sha512-zcmsHjg2B2zjuBgjdnB+9q0+cWcgWfykIcsDkWDB4GTPtl1eXUA+gTI6sO0u01AqK3cliHryTU55/b2Ow1hfZg==}
565 engines: {node: '>=18'}
566 678
567 fill-range@7.1.1: 679 fill-range@7.1.1:
568 resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 680 resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==}
569 engines: {node: '>=8'} 681 engines: {node: '>=8'}
570 682
571 flat-cache@5.0.0: 683 flat-cache@6.1.11:
572 resolution: {integrity: sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==} 684 resolution: {integrity: sha512-zfOAns94mp7bHG/vCn9Ru2eDCmIxVQ5dELUHKjHfDEOJmHNzE+uGa6208kfkgmtym4a0FFjEuFksCXFacbVhSg==}
573 engines: {node: '>=18'}
574 685
575 flatted@3.3.1: 686 flatted@3.3.3:
576 resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} 687 resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==}
577 688
578 fn.name@1.1.0: 689 fn.name@1.1.0:
579 resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} 690 resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==}
@@ -581,6 +692,11 @@ packages:
581 fs.realpath@1.0.0: 692 fs.realpath@1.0.0:
582 resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 693 resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
583 694
695 fsevents@2.3.3:
696 resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
697 engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
698 os: [darwin]
699
584 function-bind@1.1.2: 700 function-bind@1.1.2:
585 resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 701 resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
586 702
@@ -649,19 +765,29 @@ packages:
649 resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 765 resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
650 engines: {node: '>= 0.4'} 766 engines: {node: '>= 0.4'}
651 767
768 hookified@1.10.0:
769 resolution: {integrity: sha512-dJw0492Iddsj56U1JsSTm9E/0B/29a1AuoSLRAte8vQg/kaTGF3IgjEWT8c8yG4cC10+HisE1x5QAwR0Xwc+DA==}
770
652 html-tags@3.3.1: 771 html-tags@3.3.1:
653 resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} 772 resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==}
654 engines: {node: '>=8'} 773 engines: {node: '>=8'}
655 774
775 ignore-by-default@1.0.1:
776 resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==}
777
656 ignore@5.3.2: 778 ignore@5.3.2:
657 resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} 779 resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==}
658 engines: {node: '>= 4'} 780 engines: {node: '>= 4'}
659 781
660 immutable@4.3.7: 782 ignore@7.0.5:
661 resolution: {integrity: sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==} 783 resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==}
784 engines: {node: '>= 4'}
785
786 immutable@5.1.2:
787 resolution: {integrity: sha512-qHKXW1q6liAk1Oys6umoaZbDRqjcjgSrbnrifHsfsttza7zcvRAsL7mMV6xWcyhwQy7Xj5v4hhbr6b+iDYwlmQ==}
662 788
663 import-fresh@3.3.0: 789 import-fresh@3.3.1:
664 resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} 790 resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==}
665 engines: {node: '>=6'} 791 engines: {node: '>=6'}
666 792
667 imurmurhash@0.1.4: 793 imurmurhash@0.1.4:
@@ -688,8 +814,8 @@ packages:
688 peerDependencies: 814 peerDependencies:
689 svg-sprite: ^2.0.2 815 svg-sprite: ^2.0.2
690 816
691 iro-sass@git+https://git.vulpes.one/git/iro-sass.git#351814a60e8909814c7120db96314a1a25d962bd: 817 iro-sass@git+https://git.vulpes.one/git/iro-sass.git#f0f84513f8efe533b6ee670a6f1a0c074387b2ec:
692 resolution: {commit: 351814a60e8909814c7120db96314a1a25d962bd, repo: https://git.vulpes.one/git/iro-sass.git, type: git} 818 resolution: {commit: f0f84513f8efe533b6ee670a6f1a0c074387b2ec, repo: https://git.vulpes.one/git/iro-sass.git, type: git}
693 version: 1.0.2 819 version: 1.0.2
694 820
695 is-arrayish@0.2.1: 821 is-arrayish@0.2.1:
@@ -698,6 +824,10 @@ packages:
698 is-arrayish@0.3.2: 824 is-arrayish@0.3.2:
699 resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} 825 resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==}
700 826
827 is-binary-path@2.1.0:
828 resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
829 engines: {node: '>=8'}
830
701 is-buffer@1.1.6: 831 is-buffer@1.1.6:
702 resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} 832 resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==}
703 833
@@ -758,9 +888,6 @@ packages:
758 resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} 888 resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
759 hasBin: true 889 hasBin: true
760 890
761 json-buffer@3.0.1:
762 resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
763
764 json-parse-even-better-errors@2.3.1: 891 json-parse-even-better-errors@2.3.1:
765 resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} 892 resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
766 893
@@ -770,8 +897,8 @@ packages:
770 jstransformer@1.0.0: 897 jstransformer@1.0.0:
771 resolution: {integrity: sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==} 898 resolution: {integrity: sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==}
772 899
773 keyv@4.5.4: 900 keyv@5.4.0:
774 resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} 901 resolution: {integrity: sha512-TMckyVjEoacG5IteUpUrOBsFORtheqziVyyY2dLUwg1jwTb8u48LX4TgmtogkNl9Y9unaEJ1luj10fGyjMGFOQ==}
775 902
776 kind-of@3.2.2: 903 kind-of@3.2.2:
777 resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==} 904 resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==}
@@ -784,6 +911,9 @@ packages:
784 known-css-properties@0.34.0: 911 known-css-properties@0.34.0:
785 resolution: {integrity: sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==} 912 resolution: {integrity: sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==}
786 913
914 known-css-properties@0.37.0:
915 resolution: {integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==}
916
787 kuler@2.0.0: 917 kuler@2.0.0:
788 resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} 918 resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==}
789 919
@@ -823,6 +953,9 @@ packages:
823 mdn-data@2.0.30: 953 mdn-data@2.0.30:
824 resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} 954 resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==}
825 955
956 mdn-data@2.12.2:
957 resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==}
958
826 meow@13.2.0: 959 meow@13.2.0:
827 resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} 960 resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==}
828 engines: {node: '>=18'} 961 engines: {node: '>=18'}
@@ -852,11 +985,19 @@ packages:
852 resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} 985 resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==}
853 hasBin: true 986 hasBin: true
854 987
855 nanoid@3.3.7: 988 nanoid@3.3.11:
856 resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 989 resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
857 engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 990 engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
858 hasBin: true 991 hasBin: true
859 992
993 node-addon-api@7.1.1:
994 resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==}
995
996 nodemon@3.1.10:
997 resolution: {integrity: sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==}
998 engines: {node: '>=10'}
999 hasBin: true
1000
860 normalize-path@3.0.0: 1001 normalize-path@3.0.0:
861 resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 1002 resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
862 engines: {node: '>=0.10.0'} 1003 engines: {node: '>=0.10.0'}
@@ -896,8 +1037,8 @@ packages:
896 picocolors@1.0.1: 1037 picocolors@1.0.1:
897 resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} 1038 resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==}
898 1039
899 picocolors@1.1.0: 1040 picocolors@1.1.1:
900 resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} 1041 resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
901 1042
902 picomatch@2.3.1: 1043 picomatch@2.3.1:
903 resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 1044 resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
@@ -925,20 +1066,24 @@ packages:
925 resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} 1066 resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==}
926 engines: {node: '>=4'} 1067 engines: {node: '>=4'}
927 1068
928 postcss-sorting@8.0.2: 1069 postcss-selector-parser@7.1.0:
929 resolution: {integrity: sha512-M9dkSrmU00t/jK7rF6BZSZauA5MAaBW4i5EnJXspMwt4iqTh/L9j6fgMnbElEOfyRyfLfVbIHj/R52zHzAPe1Q==} 1070 resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==}
1071 engines: {node: '>=4'}
1072
1073 postcss-sorting@9.1.0:
1074 resolution: {integrity: sha512-Mn8KJ45HNNG6JBpBizXcyf6LqY/qyqetGcou/nprDnFwBFBLGj0j/sNKV2lj2KMOVOwdXu14aEzqJv8CIV6e8g==}
930 peerDependencies: 1075 peerDependencies:
931 postcss: ^8.4.20 1076 postcss: ^8.4.20
932 1077
933 postcss-value-parser@4.2.0: 1078 postcss-value-parser@4.2.0:
934 resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 1079 resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
935 1080
936 postcss@8.4.38: 1081 postcss@8.5.4:
937 resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} 1082 resolution: {integrity: sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==}
938 engines: {node: ^10 || ^12 || >=14} 1083 engines: {node: ^10 || ^12 || >=14}
939 1084
940 postcss@8.4.47: 1085 postcss@8.5.6:
941 resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} 1086 resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==}
942 engines: {node: ^10 || ^12 || >=14} 1087 engines: {node: ^10 || ^12 || >=14}
943 1088
944 prettysize@2.0.0: 1089 prettysize@2.0.0:
@@ -950,6 +1095,9 @@ packages:
950 promise@7.3.1: 1095 promise@7.3.1:
951 resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} 1096 resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==}
952 1097
1098 pstree.remy@1.1.8:
1099 resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==}
1100
953 pug-attrs@2.0.4: 1101 pug-attrs@2.0.4:
954 resolution: {integrity: sha512-TaZ4Z2TWUPDJcV3wjU3RtUXMrd3kM4Wzjbe3EWnSsZPsJ3LDI0F3yCnf2/W7PPFF+edUFQ0HgDL1IoxSz5K8EQ==} 1102 resolution: {integrity: sha512-TaZ4Z2TWUPDJcV3wjU3RtUXMrd3kM4Wzjbe3EWnSsZPsJ3LDI0F3yCnf2/W7PPFF+edUFQ0HgDL1IoxSz5K8EQ==}
955 1103
@@ -1036,9 +1184,13 @@ packages:
1036 resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} 1184 resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
1037 engines: {node: '>= 6'} 1185 engines: {node: '>= 6'}
1038 1186
1039 readdirp@4.0.2: 1187 readdirp@3.6.0:
1040 resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} 1188 resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
1041 engines: {node: '>= 14.16.0'} 1189 engines: {node: '>=8.10.0'}
1190
1191 readdirp@4.1.2:
1192 resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==}
1193 engines: {node: '>= 14.18.0'}
1042 1194
1043 regenerator-runtime@0.11.1: 1195 regenerator-runtime@0.11.1:
1044 resolution: {integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==} 1196 resolution: {integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==}
@@ -1074,8 +1226,8 @@ packages:
1074 resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 1226 resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
1075 hasBin: true 1227 hasBin: true
1076 1228
1077 reusify@1.0.4: 1229 reusify@1.1.0:
1078 resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 1230 resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==}
1079 engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 1231 engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
1080 1232
1081 right-align@0.1.3: 1233 right-align@0.1.3:
@@ -1095,11 +1247,16 @@ packages:
1095 resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} 1247 resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==}
1096 engines: {node: '>=10'} 1248 engines: {node: '>=10'}
1097 1249
1098 sass@1.79.4: 1250 sass@1.89.2:
1099 resolution: {integrity: sha512-K0QDSNPXgyqO4GZq2HO5Q70TLxTH6cIT59RdoCHMivrC8rqzaTw5ab9prjz9KUN1El4FLXrBXJhik61JR4HcGg==} 1251 resolution: {integrity: sha512-xCmtksBKd/jdJ9Bt9p7nPKiuqrlBMBuuGkQlkhZjjQk3Ty48lv93k5Dq6OPkKt4XwxDJ7tvlfrTa1MPA9bf+QA==}
1100 engines: {node: '>=14.0.0'} 1252 engines: {node: '>=14.0.0'}
1101 hasBin: true 1253 hasBin: true
1102 1254
1255 semver@7.7.2:
1256 resolution: {integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==}
1257 engines: {node: '>=10'}
1258 hasBin: true
1259
1103 set-function-length@1.2.2: 1260 set-function-length@1.2.2:
1104 resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} 1261 resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
1105 engines: {node: '>= 0.4'} 1262 engines: {node: '>= 0.4'}
@@ -1111,6 +1268,10 @@ packages:
1111 simple-swizzle@0.2.2: 1268 simple-swizzle@0.2.2:
1112 resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} 1269 resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==}
1113 1270
1271 simple-update-notifier@2.0.0:
1272 resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==}
1273 engines: {node: '>=10'}
1274
1114 slash@3.0.0: 1275 slash@3.0.0:
1115 resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} 1276 resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
1116 engines: {node: '>=8'} 1277 engines: {node: '>=8'}
@@ -1156,17 +1317,14 @@ packages:
1156 resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1317 resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
1157 engines: {node: '>=8'} 1318 engines: {node: '>=8'}
1158 1319
1159 strip-ansi@7.1.0:
1160 resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
1161 engines: {node: '>=12'}
1162
1163 style-search@0.1.0: 1320 style-search@0.1.0:
1164 resolution: {integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==} 1321 resolution: {integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==}
1165 1322
1166 stylelint-config-recess-order@5.1.1: 1323 stylelint-config-recess-order@7.1.0:
1167 resolution: {integrity: sha512-eDAHWVBelzDbMbdMj15pSw0Ycykv5eLeriJdbGCp0zd44yvhgZLI+wyVHegzXp5NrstxTPSxl0fuOVKdMm0XLA==} 1324 resolution: {integrity: sha512-rFc4Z6SCGgEohr1khsmAZ83X56Tdi2dHY/GB7VT3qJkpKU1V2w+mYlK+b7Za5gpsxEng3jnb4FzWyIl/KTH0AQ==}
1168 peerDependencies: 1325 peerDependencies:
1169 stylelint: '>=16' 1326 stylelint: '>=16.18'
1327 stylelint-order: '>=7'
1170 1328
1171 stylelint-config-sass-guidelines@12.1.0: 1329 stylelint-config-sass-guidelines@12.1.0:
1172 resolution: {integrity: sha512-NTxEtVT6uNSqRvq+A3ScyKhjUrY/Z845TnpWEwnMgIPZ/+/Waa4+51r6OPuQRMu4XZS3D8DK1UaT4TWFBvuuAw==} 1330 resolution: {integrity: sha512-NTxEtVT6uNSqRvq+A3ScyKhjUrY/Z845TnpWEwnMgIPZ/+/Waa4+51r6OPuQRMu4XZS3D8DK1UaT4TWFBvuuAw==}
@@ -1175,10 +1333,11 @@ packages:
1175 postcss: ^8.4.21 1333 postcss: ^8.4.21
1176 stylelint: ^16.1.0 1334 stylelint: ^16.1.0
1177 1335
1178 stylelint-order@6.0.4: 1336 stylelint-order@7.0.0:
1179 resolution: {integrity: sha512-0UuKo4+s1hgQ/uAxlYU4h0o0HS4NiQDud0NAUNI0aa8FJdmYHA5ZZTFHiV5FpmE3071e9pZx5j0QpVJW5zOCUA==} 1337 resolution: {integrity: sha512-rSWxx0KscYfxU02wEskKXES9lkRzuuONMMNkZ7SUc6uiF3tDKm7e+sE0Ax/SBlG4TUf1sp1R6f3/SlsPGmzthg==}
1338 engines: {node: '>=20.19.0'}
1180 peerDependencies: 1339 peerDependencies:
1181 stylelint: ^14.0.0 || ^15.0.0 || ^16.0.1 1340 stylelint: ^16.18.0
1182 1341
1183 stylelint-scss@6.7.0: 1342 stylelint-scss@6.7.0:
1184 resolution: {integrity: sha512-RFIa2A+pVWS5wjNT+whtK7wsbZEWazyqesCuSaPbPlZ8lh2TujwVJSnCYJijg6ChZzwI8pZPRZS1L6A9aCbXDg==} 1343 resolution: {integrity: sha512-RFIa2A+pVWS5wjNT+whtK7wsbZEWazyqesCuSaPbPlZ8lh2TujwVJSnCYJijg6ChZzwI8pZPRZS1L6A9aCbXDg==}
@@ -1186,8 +1345,8 @@ packages:
1186 peerDependencies: 1345 peerDependencies:
1187 stylelint: ^16.0.2 1346 stylelint: ^16.0.2
1188 1347
1189 stylelint@16.9.0: 1348 stylelint@16.22.0:
1190 resolution: {integrity: sha512-31Nm3WjxGOBGpQqF43o3wO9L5AC36TPIe6030Lnm13H3vDMTcS21DrLh69bMX+DBilKqMMVLian4iG6ybBoNRQ==} 1349 resolution: {integrity: sha512-SVEMTdjKNV4ollUrIY9ordZ36zHv2/PHzPjfPMau370MlL2VYXeLgSNMMiEbLGRO8RmD2R8/BVUeF2DfnfkC0w==}
1191 engines: {node: '>=18.12.0'} 1350 engines: {node: '>=18.12.0'}
1192 hasBin: true 1351 hasBin: true
1193 1352
@@ -1203,8 +1362,8 @@ packages:
1203 resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} 1362 resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
1204 engines: {node: '>=8'} 1363 engines: {node: '>=8'}
1205 1364
1206 supports-hyperlinks@3.1.0: 1365 supports-hyperlinks@3.2.0:
1207 resolution: {integrity: sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==} 1366 resolution: {integrity: sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==}
1208 engines: {node: '>=14.18'} 1367 engines: {node: '>=14.18'}
1209 1368
1210 supports-preserve-symlinks-flag@1.0.0: 1369 supports-preserve-symlinks-flag@1.0.0:
@@ -1224,8 +1383,8 @@ packages:
1224 engines: {node: '>=10.13.0'} 1383 engines: {node: '>=10.13.0'}
1225 hasBin: true 1384 hasBin: true
1226 1385
1227 table@6.8.2: 1386 table@6.9.0:
1228 resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==} 1387 resolution: {integrity: sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==}
1229 engines: {node: '>=10.0.0'} 1388 engines: {node: '>=10.0.0'}
1230 1389
1231 text-hex@1.0.0: 1390 text-hex@1.0.0:
@@ -1249,6 +1408,10 @@ packages:
1249 token-stream@1.0.0: 1408 token-stream@1.0.0:
1250 resolution: {integrity: sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==} 1409 resolution: {integrity: sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==}
1251 1410
1411 touch@3.1.1:
1412 resolution: {integrity: sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==}
1413 hasBin: true
1414
1252 triple-beam@1.4.1: 1415 triple-beam@1.4.1:
1253 resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} 1416 resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==}
1254 engines: {node: '>= 14.0.0'} 1417 engines: {node: '>= 14.0.0'}
@@ -1261,6 +1424,9 @@ packages:
1261 uglify-to-browserify@1.0.2: 1424 uglify-to-browserify@1.0.2:
1262 resolution: {integrity: sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==} 1425 resolution: {integrity: sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==}
1263 1426
1427 undefsafe@2.0.5:
1428 resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==}
1429
1264 util-deprecate@1.0.2: 1430 util-deprecate@1.0.2:
1265 resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1431 resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
1266 1432
@@ -1335,23 +1501,17 @@ packages:
1335 1501
1336snapshots: 1502snapshots:
1337 1503
1338 '@babel/code-frame@7.25.7': 1504 '@babel/code-frame@7.27.1':
1339 dependencies: 1505 dependencies:
1340 '@babel/highlight': 7.25.7 1506 '@babel/helper-validator-identifier': 7.27.1
1341 picocolors: 1.1.0 1507 js-tokens: 4.0.0
1508 picocolors: 1.1.1
1342 1509
1343 '@babel/helper-string-parser@7.24.7': {} 1510 '@babel/helper-string-parser@7.24.7': {}
1344 1511
1345 '@babel/helper-validator-identifier@7.24.7': {} 1512 '@babel/helper-validator-identifier@7.24.7': {}
1346 1513
1347 '@babel/helper-validator-identifier@7.25.7': {} 1514 '@babel/helper-validator-identifier@7.27.1': {}
1348
1349 '@babel/highlight@7.25.7':
1350 dependencies:
1351 '@babel/helper-validator-identifier': 7.25.7
1352 chalk: 2.4.2
1353 js-tokens: 4.0.0
1354 picocolors: 1.1.0
1355 1515
1356 '@babel/parser@7.24.7': 1516 '@babel/parser@7.24.7':
1357 dependencies: 1517 dependencies:
@@ -1369,16 +1529,27 @@ snapshots:
1369 dependencies: 1529 dependencies:
1370 '@csstools/css-tokenizer': 3.0.1 1530 '@csstools/css-tokenizer': 3.0.1
1371 1531
1532 '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)':
1533 dependencies:
1534 '@csstools/css-tokenizer': 3.0.4
1535
1372 '@csstools/css-tokenizer@3.0.1': {} 1536 '@csstools/css-tokenizer@3.0.1': {}
1373 1537
1538 '@csstools/css-tokenizer@3.0.4': {}
1539
1374 '@csstools/media-query-list-parser@3.0.1(@csstools/css-parser-algorithms@3.0.1(@csstools/css-tokenizer@3.0.1))(@csstools/css-tokenizer@3.0.1)': 1540 '@csstools/media-query-list-parser@3.0.1(@csstools/css-parser-algorithms@3.0.1(@csstools/css-tokenizer@3.0.1))(@csstools/css-tokenizer@3.0.1)':
1375 dependencies: 1541 dependencies:
1376 '@csstools/css-parser-algorithms': 3.0.1(@csstools/css-tokenizer@3.0.1) 1542 '@csstools/css-parser-algorithms': 3.0.1(@csstools/css-tokenizer@3.0.1)
1377 '@csstools/css-tokenizer': 3.0.1 1543 '@csstools/css-tokenizer': 3.0.1
1378 1544
1379 '@csstools/selector-specificity@4.0.0(postcss-selector-parser@6.1.2)': 1545 '@csstools/media-query-list-parser@4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)':
1380 dependencies: 1546 dependencies:
1381 postcss-selector-parser: 6.1.2 1547 '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4)
1548 '@csstools/css-tokenizer': 3.0.4
1549
1550 '@csstools/selector-specificity@5.0.0(postcss-selector-parser@7.1.0)':
1551 dependencies:
1552 postcss-selector-parser: 7.1.0
1382 1553
1383 '@dabh/diagnostics@2.0.3': 1554 '@dabh/diagnostics@2.0.3':
1384 dependencies: 1555 dependencies:
@@ -1388,6 +1559,8 @@ snapshots:
1388 1559
1389 '@dual-bundle/import-meta-resolve@4.1.0': {} 1560 '@dual-bundle/import-meta-resolve@4.1.0': {}
1390 1561
1562 '@keyv/serialize@1.1.0': {}
1563
1391 '@nodelib/fs.scandir@2.1.5': 1564 '@nodelib/fs.scandir@2.1.5':
1392 dependencies: 1565 dependencies:
1393 '@nodelib/fs.stat': 2.0.5 1566 '@nodelib/fs.stat': 2.0.5
@@ -1398,7 +1571,68 @@ snapshots:
1398 '@nodelib/fs.walk@1.2.8': 1571 '@nodelib/fs.walk@1.2.8':
1399 dependencies: 1572 dependencies:
1400 '@nodelib/fs.scandir': 2.1.5 1573 '@nodelib/fs.scandir': 2.1.5
1401 fastq: 1.17.1 1574 fastq: 1.19.1
1575
1576 '@parcel/watcher-android-arm64@2.5.1':
1577 optional: true
1578
1579 '@parcel/watcher-darwin-arm64@2.5.1':
1580 optional: true
1581
1582 '@parcel/watcher-darwin-x64@2.5.1':
1583 optional: true
1584
1585 '@parcel/watcher-freebsd-x64@2.5.1':
1586 optional: true
1587
1588 '@parcel/watcher-linux-arm-glibc@2.5.1':
1589 optional: true
1590
1591 '@parcel/watcher-linux-arm-musl@2.5.1':
1592 optional: true
1593
1594 '@parcel/watcher-linux-arm64-glibc@2.5.1':
1595 optional: true
1596
1597 '@parcel/watcher-linux-arm64-musl@2.5.1':
1598 optional: true
1599
1600 '@parcel/watcher-linux-x64-glibc@2.5.1':
1601 optional: true
1602
1603 '@parcel/watcher-linux-x64-musl@2.5.1':
1604 optional: true
1605
1606 '@parcel/watcher-win32-arm64@2.5.1':
1607 optional: true
1608
1609 '@parcel/watcher-win32-ia32@2.5.1':
1610 optional: true
1611
1612 '@parcel/watcher-win32-x64@2.5.1':
1613 optional: true
1614
1615 '@parcel/watcher@2.5.1':
1616 dependencies:
1617 detect-libc: 1.0.3
1618 is-glob: 4.0.3
1619 micromatch: 4.0.8
1620 node-addon-api: 7.1.1
1621 optionalDependencies:
1622 '@parcel/watcher-android-arm64': 2.5.1
1623 '@parcel/watcher-darwin-arm64': 2.5.1
1624 '@parcel/watcher-darwin-x64': 2.5.1
1625 '@parcel/watcher-freebsd-x64': 2.5.1
1626 '@parcel/watcher-linux-arm-glibc': 2.5.1
1627 '@parcel/watcher-linux-arm-musl': 2.5.1
1628 '@parcel/watcher-linux-arm64-glibc': 2.5.1
1629 '@parcel/watcher-linux-arm64-musl': 2.5.1
1630 '@parcel/watcher-linux-x64-glibc': 2.5.1
1631 '@parcel/watcher-linux-x64-musl': 2.5.1
1632 '@parcel/watcher-win32-arm64': 2.5.1
1633 '@parcel/watcher-win32-ia32': 2.5.1
1634 '@parcel/watcher-win32-x64': 2.5.1
1635 optional: true
1402 1636
1403 '@resvg/resvg-js-android-arm-eabi@2.6.2': 1637 '@resvg/resvg-js-android-arm-eabi@2.6.2':
1404 optional: true 1638 optional: true
@@ -1451,7 +1685,7 @@ snapshots:
1451 '@resvg/resvg-js-win32-ia32-msvc': 2.6.2 1685 '@resvg/resvg-js-win32-ia32-msvc': 2.6.2
1452 '@resvg/resvg-js-win32-x64-msvc': 2.6.2 1686 '@resvg/resvg-js-win32-x64-msvc': 2.6.2
1453 1687
1454 '@stylistic/stylelint-plugin@3.1.1(stylelint@16.9.0)': 1688 '@stylistic/stylelint-plugin@3.1.1(stylelint@16.22.0)':
1455 dependencies: 1689 dependencies:
1456 '@csstools/css-parser-algorithms': 3.0.1(@csstools/css-tokenizer@3.0.1) 1690 '@csstools/css-parser-algorithms': 3.0.1(@csstools/css-tokenizer@3.0.1)
1457 '@csstools/css-tokenizer': 3.0.1 1691 '@csstools/css-tokenizer': 3.0.1
@@ -1460,7 +1694,7 @@ snapshots:
1460 postcss-selector-parser: 6.1.2 1694 postcss-selector-parser: 6.1.2
1461 postcss-value-parser: 4.2.0 1695 postcss-value-parser: 4.2.0
1462 style-search: 0.1.0 1696 style-search: 0.1.0
1463 stylelint: 16.9.0 1697 stylelint: 16.22.0
1464 1698
1465 '@trysound/sax@0.2.0': {} 1699 '@trysound/sax@0.2.0': {}
1466 1700
@@ -1487,7 +1721,7 @@ snapshots:
1487 ajv@8.17.1: 1721 ajv@8.17.1:
1488 dependencies: 1722 dependencies:
1489 fast-deep-equal: 3.1.3 1723 fast-deep-equal: 3.1.3
1490 fast-uri: 3.0.2 1724 fast-uri: 3.0.6
1491 json-schema-traverse: 1.0.0 1725 json-schema-traverse: 1.0.0
1492 require-from-string: 2.0.2 1726 require-from-string: 2.0.2
1493 1727
@@ -1501,18 +1735,17 @@ snapshots:
1501 1735
1502 ansi-regex@5.0.1: {} 1736 ansi-regex@5.0.1: {}
1503 1737
1504 ansi-regex@6.1.0: {}
1505
1506 ansi-styles@2.2.1: {} 1738 ansi-styles@2.2.1: {}
1507 1739
1508 ansi-styles@3.2.1:
1509 dependencies:
1510 color-convert: 1.9.3
1511
1512 ansi-styles@4.3.0: 1740 ansi-styles@4.3.0:
1513 dependencies: 1741 dependencies:
1514 color-convert: 2.0.1 1742 color-convert: 2.0.1
1515 1743
1744 anymatch@3.1.3:
1745 dependencies:
1746 normalize-path: 3.0.0
1747 picomatch: 2.3.1
1748
1516 argparse@2.0.1: {} 1749 argparse@2.0.1: {}
1517 1750
1518 array-union@2.1.0: {} 1751 array-union@2.1.0: {}
@@ -1547,6 +1780,8 @@ snapshots:
1547 1780
1548 balanced-match@2.0.0: {} 1781 balanced-match@2.0.0: {}
1549 1782
1783 binary-extensions@2.3.0: {}
1784
1550 boolbase@1.0.0: {} 1785 boolbase@1.0.0: {}
1551 1786
1552 brace-expansion@1.1.11: 1787 brace-expansion@1.1.11:
@@ -1558,6 +1793,11 @@ snapshots:
1558 dependencies: 1793 dependencies:
1559 fill-range: 7.1.1 1794 fill-range: 7.1.1
1560 1795
1796 cacheable@1.10.2:
1797 dependencies:
1798 hookified: 1.10.0
1799 keyv: 5.4.0
1800
1561 call-bind@1.0.7: 1801 call-bind@1.0.7:
1562 dependencies: 1802 dependencies:
1563 es-define-property: 1.0.0 1803 es-define-property: 1.0.0
@@ -1583,19 +1823,25 @@ snapshots:
1583 strip-ansi: 3.0.1 1823 strip-ansi: 3.0.1
1584 supports-color: 2.0.0 1824 supports-color: 2.0.0
1585 1825
1586 chalk@2.4.2:
1587 dependencies:
1588 ansi-styles: 3.2.1
1589 escape-string-regexp: 1.0.5
1590 supports-color: 5.5.0
1591
1592 character-parser@2.2.0: 1826 character-parser@2.2.0:
1593 dependencies: 1827 dependencies:
1594 is-regex: 1.1.4 1828 is-regex: 1.1.4
1595 1829
1596 chokidar@4.0.1: 1830 chokidar@3.6.0:
1831 dependencies:
1832 anymatch: 3.1.3
1833 braces: 3.0.3
1834 glob-parent: 5.1.2
1835 is-binary-path: 2.1.0
1836 is-glob: 4.0.3
1837 normalize-path: 3.0.0
1838 readdirp: 3.6.0
1839 optionalDependencies:
1840 fsevents: 2.3.3
1841
1842 chokidar@4.0.3:
1597 dependencies: 1843 dependencies:
1598 readdirp: 4.0.2 1844 readdirp: 4.1.2
1599 1845
1600 clean-css@4.2.4: 1846 clean-css@4.2.4:
1601 dependencies: 1847 dependencies:
@@ -1679,11 +1925,11 @@ snapshots:
1679 cosmiconfig@9.0.0: 1925 cosmiconfig@9.0.0:
1680 dependencies: 1926 dependencies:
1681 env-paths: 2.2.1 1927 env-paths: 2.2.1
1682 import-fresh: 3.3.0 1928 import-fresh: 3.3.1
1683 js-yaml: 4.1.0 1929 js-yaml: 4.1.0
1684 parse-json: 5.2.0 1930 parse-json: 5.2.0
1685 1931
1686 css-functions-list@3.2.2: {} 1932 css-functions-list@3.2.3: {}
1687 1933
1688 css-select@4.3.0: 1934 css-select@4.3.0:
1689 dependencies: 1935 dependencies:
@@ -1705,6 +1951,11 @@ snapshots:
1705 mdn-data: 2.0.30 1951 mdn-data: 2.0.30
1706 source-map-js: 1.2.1 1952 source-map-js: 1.2.1
1707 1953
1954 css-tree@3.1.0:
1955 dependencies:
1956 mdn-data: 2.12.2
1957 source-map-js: 1.2.1
1958
1708 css-what@6.1.0: {} 1959 css-what@6.1.0: {}
1709 1960
1710 cssesc@3.0.0: {} 1961 cssesc@3.0.0: {}
@@ -1715,9 +1966,11 @@ snapshots:
1715 1966
1716 cssom@0.5.0: {} 1967 cssom@0.5.0: {}
1717 1968
1718 debug@4.3.7: 1969 debug@4.4.1(supports-color@5.5.0):
1719 dependencies: 1970 dependencies:
1720 ms: 2.1.3 1971 ms: 2.1.3
1972 optionalDependencies:
1973 supports-color: 5.5.0
1721 1974
1722 decamelize@1.2.0: {} 1975 decamelize@1.2.0: {}
1723 1976
@@ -1727,6 +1980,9 @@ snapshots:
1727 es-errors: 1.3.0 1980 es-errors: 1.3.0
1728 gopd: 1.0.1 1981 gopd: 1.0.1
1729 1982
1983 detect-libc@1.0.3:
1984 optional: true
1985
1730 dir-glob@3.0.1: 1986 dir-glob@3.0.1:
1731 dependencies: 1987 dependencies:
1732 path-type: 4.0.0 1988 path-type: 4.0.0
@@ -1777,7 +2033,7 @@ snapshots:
1777 2033
1778 fast-deep-equal@3.1.3: {} 2034 fast-deep-equal@3.1.3: {}
1779 2035
1780 fast-glob@3.3.2: 2036 fast-glob@3.3.3:
1781 dependencies: 2037 dependencies:
1782 '@nodelib/fs.stat': 2.0.5 2038 '@nodelib/fs.stat': 2.0.5
1783 '@nodelib/fs.walk': 1.2.8 2039 '@nodelib/fs.walk': 1.2.8
@@ -1785,35 +2041,39 @@ snapshots:
1785 merge2: 1.4.1 2041 merge2: 1.4.1
1786 micromatch: 4.0.8 2042 micromatch: 4.0.8
1787 2043
1788 fast-uri@3.0.2: {} 2044 fast-uri@3.0.6: {}
1789 2045
1790 fastest-levenshtein@1.0.16: {} 2046 fastest-levenshtein@1.0.16: {}
1791 2047
1792 fastq@1.17.1: 2048 fastq@1.19.1:
1793 dependencies: 2049 dependencies:
1794 reusify: 1.0.4 2050 reusify: 1.1.0
1795 2051
1796 fecha@4.2.3: {} 2052 fecha@4.2.3: {}
1797 2053
1798 file-entry-cache@9.1.0: 2054 file-entry-cache@10.1.1:
1799 dependencies: 2055 dependencies:
1800 flat-cache: 5.0.0 2056 flat-cache: 6.1.11
1801 2057
1802 fill-range@7.1.1: 2058 fill-range@7.1.1:
1803 dependencies: 2059 dependencies:
1804 to-regex-range: 5.0.1 2060 to-regex-range: 5.0.1
1805 2061
1806 flat-cache@5.0.0: 2062 flat-cache@6.1.11:
1807 dependencies: 2063 dependencies:
1808 flatted: 3.3.1 2064 cacheable: 1.10.2
1809 keyv: 4.5.4 2065 flatted: 3.3.3
2066 hookified: 1.10.0
1810 2067
1811 flatted@3.3.1: {} 2068 flatted@3.3.3: {}
1812 2069
1813 fn.name@1.1.0: {} 2070 fn.name@1.1.0: {}
1814 2071
1815 fs.realpath@1.0.0: {} 2072 fs.realpath@1.0.0: {}
1816 2073
2074 fsevents@2.3.3:
2075 optional: true
2076
1817 function-bind@1.1.2: {} 2077 function-bind@1.1.2: {}
1818 2078
1819 get-caller-file@2.0.5: {} 2079 get-caller-file@2.0.5: {}
@@ -1853,7 +2113,7 @@ snapshots:
1853 dependencies: 2113 dependencies:
1854 array-union: 2.1.0 2114 array-union: 2.1.0
1855 dir-glob: 3.0.1 2115 dir-glob: 3.0.1
1856 fast-glob: 3.3.2 2116 fast-glob: 3.3.3
1857 ignore: 5.3.2 2117 ignore: 5.3.2
1858 merge2: 1.4.1 2118 merge2: 1.4.1
1859 slash: 3.0.0 2119 slash: 3.0.0
@@ -1888,13 +2148,19 @@ snapshots:
1888 dependencies: 2148 dependencies:
1889 function-bind: 1.1.2 2149 function-bind: 1.1.2
1890 2150
2151 hookified@1.10.0: {}
2152
1891 html-tags@3.3.1: {} 2153 html-tags@3.3.1: {}
1892 2154
2155 ignore-by-default@1.0.1: {}
2156
1893 ignore@5.3.2: {} 2157 ignore@5.3.2: {}
1894 2158
1895 immutable@4.3.7: {} 2159 ignore@7.0.5: {}
2160
2161 immutable@5.1.2: {}
1896 2162
1897 import-fresh@3.3.0: 2163 import-fresh@3.3.1:
1898 dependencies: 2164 dependencies:
1899 parent-module: 1.0.1 2165 parent-module: 1.0.1
1900 resolve-from: 4.0.0 2166 resolve-from: 4.0.0
@@ -1916,12 +2182,16 @@ snapshots:
1916 dependencies: 2182 dependencies:
1917 svg-sprite: 2.0.4 2183 svg-sprite: 2.0.4
1918 2184
1919 iro-sass@git+https://git.vulpes.one/git/iro-sass.git#351814a60e8909814c7120db96314a1a25d962bd: {} 2185 iro-sass@git+https://git.vulpes.one/git/iro-sass.git#f0f84513f8efe533b6ee670a6f1a0c074387b2ec: {}
1920 2186
1921 is-arrayish@0.2.1: {} 2187 is-arrayish@0.2.1: {}
1922 2188
1923 is-arrayish@0.3.2: {} 2189 is-arrayish@0.3.2: {}
1924 2190
2191 is-binary-path@2.1.0:
2192 dependencies:
2193 binary-extensions: 2.3.0
2194
1925 is-buffer@1.1.6: {} 2195 is-buffer@1.1.6: {}
1926 2196
1927 is-core-module@2.14.0: 2197 is-core-module@2.14.0:
@@ -1971,8 +2241,6 @@ snapshots:
1971 dependencies: 2241 dependencies:
1972 argparse: 2.0.1 2242 argparse: 2.0.1
1973 2243
1974 json-buffer@3.0.1: {}
1975
1976 json-parse-even-better-errors@2.3.1: {} 2244 json-parse-even-better-errors@2.3.1: {}
1977 2245
1978 json-schema-traverse@1.0.0: {} 2246 json-schema-traverse@1.0.0: {}
@@ -1982,9 +2250,9 @@ snapshots:
1982 is-promise: 2.2.2 2250 is-promise: 2.2.2
1983 promise: 7.3.1 2251 promise: 7.3.1
1984 2252
1985 keyv@4.5.4: 2253 keyv@5.4.0:
1986 dependencies: 2254 dependencies:
1987 json-buffer: 3.0.1 2255 '@keyv/serialize': 1.1.0
1988 2256
1989 kind-of@3.2.2: 2257 kind-of@3.2.2:
1990 dependencies: 2258 dependencies:
@@ -1994,6 +2262,8 @@ snapshots:
1994 2262
1995 known-css-properties@0.34.0: {} 2263 known-css-properties@0.34.0: {}
1996 2264
2265 known-css-properties@0.37.0: {}
2266
1997 kuler@2.0.0: {} 2267 kuler@2.0.0: {}
1998 2268
1999 lazy-cache@1.0.4: {} 2269 lazy-cache@1.0.4: {}
@@ -2025,6 +2295,8 @@ snapshots:
2025 2295
2026 mdn-data@2.0.30: {} 2296 mdn-data@2.0.30: {}
2027 2297
2298 mdn-data@2.12.2: {}
2299
2028 meow@13.2.0: {} 2300 meow@13.2.0: {}
2029 2301
2030 merge2@1.4.1: {} 2302 merge2@1.4.1: {}
@@ -2048,7 +2320,23 @@ snapshots:
2048 2320
2049 mustache@4.2.0: {} 2321 mustache@4.2.0: {}
2050 2322
2051 nanoid@3.3.7: {} 2323 nanoid@3.3.11: {}
2324
2325 node-addon-api@7.1.1:
2326 optional: true
2327
2328 nodemon@3.1.10:
2329 dependencies:
2330 chokidar: 3.6.0
2331 debug: 4.4.1(supports-color@5.5.0)
2332 ignore-by-default: 1.0.1
2333 minimatch: 3.1.2
2334 pstree.remy: 1.1.8
2335 semver: 7.7.2
2336 simple-update-notifier: 2.0.0
2337 supports-color: 5.5.0
2338 touch: 3.1.1
2339 undefsafe: 2.0.5
2052 2340
2053 normalize-path@3.0.0: {} 2341 normalize-path@3.0.0: {}
2054 2342
@@ -2072,7 +2360,7 @@ snapshots:
2072 2360
2073 parse-json@5.2.0: 2361 parse-json@5.2.0:
2074 dependencies: 2362 dependencies:
2075 '@babel/code-frame': 7.25.7 2363 '@babel/code-frame': 7.27.1
2076 error-ex: 1.3.2 2364 error-ex: 1.3.2
2077 json-parse-even-better-errors: 2.3.1 2365 json-parse-even-better-errors: 2.3.1
2078 lines-and-columns: 1.2.4 2366 lines-and-columns: 1.2.4
@@ -2085,7 +2373,7 @@ snapshots:
2085 2373
2086 picocolors@1.0.1: {} 2374 picocolors@1.0.1: {}
2087 2375
2088 picocolors@1.1.0: {} 2376 picocolors@1.1.1: {}
2089 2377
2090 picomatch@2.3.1: {} 2378 picomatch@2.3.1: {}
2091 2379
@@ -2093,35 +2381,40 @@ snapshots:
2093 2381
2094 postcss-resolve-nested-selector@0.1.6: {} 2382 postcss-resolve-nested-selector@0.1.6: {}
2095 2383
2096 postcss-safe-parser@7.0.1(postcss@8.4.47): 2384 postcss-safe-parser@7.0.1(postcss@8.5.6):
2097 dependencies: 2385 dependencies:
2098 postcss: 8.4.47 2386 postcss: 8.5.6
2099 2387
2100 postcss-scss@4.0.9(postcss@8.4.38): 2388 postcss-scss@4.0.9(postcss@8.5.4):
2101 dependencies: 2389 dependencies:
2102 postcss: 8.4.38 2390 postcss: 8.5.4
2103 2391
2104 postcss-selector-parser@6.1.2: 2392 postcss-selector-parser@6.1.2:
2105 dependencies: 2393 dependencies:
2106 cssesc: 3.0.0 2394 cssesc: 3.0.0
2107 util-deprecate: 1.0.2 2395 util-deprecate: 1.0.2
2108 2396
2109 postcss-sorting@8.0.2(postcss@8.4.38): 2397 postcss-selector-parser@7.1.0:
2398 dependencies:
2399 cssesc: 3.0.0
2400 util-deprecate: 1.0.2
2401
2402 postcss-sorting@9.1.0(postcss@8.5.4):
2110 dependencies: 2403 dependencies:
2111 postcss: 8.4.38 2404 postcss: 8.5.4
2112 2405
2113 postcss-value-parser@4.2.0: {} 2406 postcss-value-parser@4.2.0: {}
2114 2407
2115 postcss@8.4.38: 2408 postcss@8.5.4:
2116 dependencies: 2409 dependencies:
2117 nanoid: 3.3.7 2410 nanoid: 3.3.11
2118 picocolors: 1.0.1 2411 picocolors: 1.1.1
2119 source-map-js: 1.2.1 2412 source-map-js: 1.2.1
2120 2413
2121 postcss@8.4.47: 2414 postcss@8.5.6:
2122 dependencies: 2415 dependencies:
2123 nanoid: 3.3.7 2416 nanoid: 3.3.11
2124 picocolors: 1.1.0 2417 picocolors: 1.1.1
2125 source-map-js: 1.2.1 2418 source-map-js: 1.2.1
2126 2419
2127 prettysize@2.0.0: {} 2420 prettysize@2.0.0: {}
@@ -2132,6 +2425,8 @@ snapshots:
2132 dependencies: 2425 dependencies:
2133 asap: 2.0.6 2426 asap: 2.0.6
2134 2427
2428 pstree.remy@1.1.8: {}
2429
2135 pug-attrs@2.0.4: 2430 pug-attrs@2.0.4:
2136 dependencies: 2431 dependencies:
2137 constantinople: 3.1.2 2432 constantinople: 3.1.2
@@ -2293,7 +2588,11 @@ snapshots:
2293 string_decoder: 1.3.0 2588 string_decoder: 1.3.0
2294 util-deprecate: 1.0.2 2589 util-deprecate: 1.0.2
2295 2590
2296 readdirp@4.0.2: {} 2591 readdirp@3.6.0:
2592 dependencies:
2593 picomatch: 2.3.1
2594
2595 readdirp@4.1.2: {}
2297 2596
2298 regenerator-runtime@0.11.1: {} 2597 regenerator-runtime@0.11.1: {}
2299 2598
@@ -2317,7 +2616,7 @@ snapshots:
2317 path-parse: 1.0.7 2616 path-parse: 1.0.7
2318 supports-preserve-symlinks-flag: 1.0.0 2617 supports-preserve-symlinks-flag: 1.0.0
2319 2618
2320 reusify@1.0.4: {} 2619 reusify@1.1.0: {}
2321 2620
2322 right-align@0.1.3: 2621 right-align@0.1.3:
2323 dependencies: 2622 dependencies:
@@ -2333,11 +2632,15 @@ snapshots:
2333 2632
2334 safe-stable-stringify@2.4.3: {} 2633 safe-stable-stringify@2.4.3: {}
2335 2634
2336 sass@1.79.4: 2635 sass@1.89.2:
2337 dependencies: 2636 dependencies:
2338 chokidar: 4.0.1 2637 chokidar: 4.0.3
2339 immutable: 4.3.7 2638 immutable: 5.1.2
2340 source-map-js: 1.2.1 2639 source-map-js: 1.2.1
2640 optionalDependencies:
2641 '@parcel/watcher': 2.5.1
2642
2643 semver@7.7.2: {}
2341 2644
2342 set-function-length@1.2.2: 2645 set-function-length@1.2.2:
2343 dependencies: 2646 dependencies:
@@ -2354,6 +2657,10 @@ snapshots:
2354 dependencies: 2657 dependencies:
2355 is-arrayish: 0.3.2 2658 is-arrayish: 0.3.2
2356 2659
2660 simple-update-notifier@2.0.0:
2661 dependencies:
2662 semver: 7.7.2
2663
2357 slash@3.0.0: {} 2664 slash@3.0.0: {}
2358 2665
2359 slice-ansi@4.0.0: 2666 slice-ansi@4.0.0:
@@ -2394,32 +2701,28 @@ snapshots:
2394 dependencies: 2701 dependencies:
2395 ansi-regex: 5.0.1 2702 ansi-regex: 5.0.1
2396 2703
2397 strip-ansi@7.1.0:
2398 dependencies:
2399 ansi-regex: 6.1.0
2400
2401 style-search@0.1.0: {} 2704 style-search@0.1.0: {}
2402 2705
2403 stylelint-config-recess-order@5.1.1(stylelint@16.9.0): 2706 stylelint-config-recess-order@7.1.0(stylelint-order@7.0.0(stylelint@16.22.0))(stylelint@16.22.0):
2404 dependencies: 2707 dependencies:
2405 stylelint: 16.9.0 2708 stylelint: 16.22.0
2406 stylelint-order: 6.0.4(stylelint@16.9.0) 2709 stylelint-order: 7.0.0(stylelint@16.22.0)
2407 2710
2408 stylelint-config-sass-guidelines@12.1.0(postcss@8.4.38)(stylelint@16.9.0): 2711 stylelint-config-sass-guidelines@12.1.0(postcss@8.5.4)(stylelint@16.22.0):
2409 dependencies: 2712 dependencies:
2410 '@stylistic/stylelint-plugin': 3.1.1(stylelint@16.9.0) 2713 '@stylistic/stylelint-plugin': 3.1.1(stylelint@16.22.0)
2411 postcss: 8.4.38 2714 postcss: 8.5.4
2412 postcss-scss: 4.0.9(postcss@8.4.38) 2715 postcss-scss: 4.0.9(postcss@8.5.4)
2413 stylelint: 16.9.0 2716 stylelint: 16.22.0
2414 stylelint-scss: 6.7.0(stylelint@16.9.0) 2717 stylelint-scss: 6.7.0(stylelint@16.22.0)
2415 2718
2416 stylelint-order@6.0.4(stylelint@16.9.0): 2719 stylelint-order@7.0.0(stylelint@16.22.0):
2417 dependencies: 2720 dependencies:
2418 postcss: 8.4.38 2721 postcss: 8.5.4
2419 postcss-sorting: 8.0.2(postcss@8.4.38) 2722 postcss-sorting: 9.1.0(postcss@8.5.4)
2420 stylelint: 16.9.0 2723 stylelint: 16.22.0
2421 2724
2422 stylelint-scss@6.7.0(stylelint@16.9.0): 2725 stylelint-scss@6.7.0(stylelint@16.22.0):
2423 dependencies: 2726 dependencies:
2424 css-tree: 2.3.1 2727 css-tree: 2.3.1
2425 is-plain-object: 5.0.0 2728 is-plain-object: 5.0.0
@@ -2428,48 +2731,47 @@ snapshots:
2428 postcss-resolve-nested-selector: 0.1.6 2731 postcss-resolve-nested-selector: 0.1.6
2429 postcss-selector-parser: 6.1.2 2732 postcss-selector-parser: 6.1.2
2430 postcss-value-parser: 4.2.0 2733 postcss-value-parser: 4.2.0
2431 stylelint: 16.9.0 2734 stylelint: 16.22.0
2432 2735
2433 stylelint@16.9.0: 2736 stylelint@16.22.0:
2434 dependencies: 2737 dependencies:
2435 '@csstools/css-parser-algorithms': 3.0.1(@csstools/css-tokenizer@3.0.1) 2738 '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4)
2436 '@csstools/css-tokenizer': 3.0.1 2739 '@csstools/css-tokenizer': 3.0.4
2437 '@csstools/media-query-list-parser': 3.0.1(@csstools/css-parser-algorithms@3.0.1(@csstools/css-tokenizer@3.0.1))(@csstools/css-tokenizer@3.0.1) 2740 '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)
2438 '@csstools/selector-specificity': 4.0.0(postcss-selector-parser@6.1.2) 2741 '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.1.0)
2439 '@dual-bundle/import-meta-resolve': 4.1.0 2742 '@dual-bundle/import-meta-resolve': 4.1.0
2440 balanced-match: 2.0.0 2743 balanced-match: 2.0.0
2441 colord: 2.9.3 2744 colord: 2.9.3
2442 cosmiconfig: 9.0.0 2745 cosmiconfig: 9.0.0
2443 css-functions-list: 3.2.2 2746 css-functions-list: 3.2.3
2444 css-tree: 2.3.1 2747 css-tree: 3.1.0
2445 debug: 4.3.7 2748 debug: 4.4.1(supports-color@5.5.0)
2446 fast-glob: 3.3.2 2749 fast-glob: 3.3.3
2447 fastest-levenshtein: 1.0.16 2750 fastest-levenshtein: 1.0.16
2448 file-entry-cache: 9.1.0 2751 file-entry-cache: 10.1.1
2449 global-modules: 2.0.0 2752 global-modules: 2.0.0
2450 globby: 11.1.0 2753 globby: 11.1.0
2451 globjoin: 0.1.4 2754 globjoin: 0.1.4
2452 html-tags: 3.3.1 2755 html-tags: 3.3.1
2453 ignore: 5.3.2 2756 ignore: 7.0.5
2454 imurmurhash: 0.1.4 2757 imurmurhash: 0.1.4
2455 is-plain-object: 5.0.0 2758 is-plain-object: 5.0.0
2456 known-css-properties: 0.34.0 2759 known-css-properties: 0.37.0
2457 mathml-tag-names: 2.1.3 2760 mathml-tag-names: 2.1.3
2458 meow: 13.2.0 2761 meow: 13.2.0
2459 micromatch: 4.0.8 2762 micromatch: 4.0.8
2460 normalize-path: 3.0.0 2763 normalize-path: 3.0.0
2461 picocolors: 1.1.0 2764 picocolors: 1.1.1
2462 postcss: 8.4.47 2765 postcss: 8.5.6
2463 postcss-resolve-nested-selector: 0.1.6 2766 postcss-resolve-nested-selector: 0.1.6
2464 postcss-safe-parser: 7.0.1(postcss@8.4.47) 2767 postcss-safe-parser: 7.0.1(postcss@8.5.6)
2465 postcss-selector-parser: 6.1.2 2768 postcss-selector-parser: 7.1.0
2466 postcss-value-parser: 4.2.0 2769 postcss-value-parser: 4.2.0
2467 resolve-from: 5.0.0 2770 resolve-from: 5.0.0
2468 string-width: 4.2.3 2771 string-width: 4.2.3
2469 strip-ansi: 7.1.0 2772 supports-hyperlinks: 3.2.0
2470 supports-hyperlinks: 3.1.0
2471 svg-tags: 1.0.0 2773 svg-tags: 1.0.0
2472 table: 6.8.2 2774 table: 6.9.0
2473 write-file-atomic: 5.0.1 2775 write-file-atomic: 5.0.1
2474 transitivePeerDependencies: 2776 transitivePeerDependencies:
2475 - supports-color 2777 - supports-color
@@ -2485,7 +2787,7 @@ snapshots:
2485 dependencies: 2787 dependencies:
2486 has-flag: 4.0.0 2788 has-flag: 4.0.0
2487 2789
2488 supports-hyperlinks@3.1.0: 2790 supports-hyperlinks@3.2.0:
2489 dependencies: 2791 dependencies:
2490 has-flag: 4.0.0 2792 has-flag: 4.0.0
2491 supports-color: 7.2.0 2793 supports-color: 7.2.0
@@ -2524,7 +2826,7 @@ snapshots:
2524 picocolors: 1.0.1 2826 picocolors: 1.0.1
2525 stable: 0.1.8 2827 stable: 0.1.8
2526 2828
2527 table@6.8.2: 2829 table@6.9.0:
2528 dependencies: 2830 dependencies:
2529 ajv: 8.17.1 2831 ajv: 8.17.1
2530 lodash.truncate: 4.4.2 2832 lodash.truncate: 4.4.2
@@ -2546,6 +2848,8 @@ snapshots:
2546 2848
2547 token-stream@1.0.0: {} 2849 token-stream@1.0.0: {}
2548 2850
2851 touch@3.1.1: {}
2852
2549 triple-beam@1.4.1: {} 2853 triple-beam@1.4.1: {}
2550 2854
2551 uglify-js@2.8.29: 2855 uglify-js@2.8.29:
@@ -2558,6 +2862,8 @@ snapshots:
2558 uglify-to-browserify@1.0.2: 2862 uglify-to-browserify@1.0.2:
2559 optional: true 2863 optional: true
2560 2864
2865 undefsafe@2.0.5: {}
2866
2561 util-deprecate@1.0.2: {} 2867 util-deprecate@1.0.2: {}
2562 2868
2563 vinyl@2.2.1: 2869 vinyl@2.2.1:
diff --git a/src/_apca.scss b/src/_apca.scss
index c65f46e..c5da4a0 100644
--- a/src/_apca.scss
+++ b/src/_apca.scss
@@ -7,121 +7,121 @@
7@use 'sass:math'; 7@use 'sass:math';
8 8
9$SA98G: ( 9$SA98G: (
10 mainTRC: 2.4, 10 mainTRC: 2.4,
11 11
12 sRco: .2126729, 12 sRco: .2126729,
13 sGco: .7151522, 13 sGco: .7151522,
14 sBco: .072175, 14 sBco: .072175,
15 15
16 normBG: .56, 16 normBG: .56,
17 normTXT: .57, 17 normTXT: .57,
18 revTXT: .62, 18 revTXT: .62,
19 revBG: .65, 19 revBG: .65,
20 20
21 blkThrs: .022, 21 blkThrs: .022,
22 blkClmp: 1.414, 22 blkClmp: 1.414,
23 scaleBoW: 1.14, 23 scaleBoW: 1.14,
24 scaleWoB: 1.14, 24 scaleWoB: 1.14,
25 loBoWoffset: .027, 25 loBoWoffset: .027,
26 loWoBoffset: .027, 26 loWoBoffset: .027,
27 deltaYmin: .0005, 27 deltaYmin: .0005,
28 loClip: .0001, 28 loClip: .0001,
29 29
30 mFactor: 1.9468554433171, 30 mFactor: 1.9468554433171,
31 mOffsetIn: .0387393816571401, 31 mOffsetIn: .0387393816571401,
32 mExpAdj: .283343396420869, 32 mExpAdj: .283343396420869,
33 mOffsetOut: .312865795870758, 33 mOffsetOut: .312865795870758,
34); 34);
35 35
36@function sRGB_to_Y($color) { 36@function sRGB_to_Y($color) {
37 $rgb: color.to-space($color, rgb); 37 $rgb: color.to-space($color, rgb);
38 38
39 @return map.get($SA98G, sRco) * math.pow(math.div(color.channel($rgb, 'red'), 255), map.get($SA98G, mainTRC)) + 39 @return map.get($SA98G, sRco) * math.pow(math.div(color.channel($rgb, 'red'), 255), map.get($SA98G, mainTRC)) +
40 map.get($SA98G, sGco) * math.pow(math.div(color.channel($rgb, 'green'), 255), map.get($SA98G, mainTRC)) + 40 map.get($SA98G, sGco) * math.pow(math.div(color.channel($rgb, 'green'), 255), map.get($SA98G, mainTRC)) +
41 map.get($SA98G, sBco) * math.pow(math.div(color.channel($rgb, 'blue'), 255), map.get($SA98G, mainTRC)); 41 map.get($SA98G, sBco) * math.pow(math.div(color.channel($rgb, 'blue'), 255), map.get($SA98G, mainTRC));
42} 42}
43 43
44@function Y_to_sRGB($y) { 44@function Y_to_sRGB($y) {
45 $c: math.round(math.pow($y, math.div(1, map.get($SA98G, mainTRC))) * 255); 45 $c: math.round(math.pow($y, math.div(1, map.get($SA98G, mainTRC))) * 255);
46 @return rgb($c, $c, $c); 46 @return rgb($c, $c, $c);
47} 47}
48 48
49@function contrast($txtY, $bgY) { 49@function contrast($txtY, $bgY) {
50 /* stylelint-disable-next-line @stylistic/number-no-trailing-zeros */ 50 /* stylelint-disable-next-line @stylistic/number-no-trailing-zeros */
51 $icp: .0 1.1; 51 $icp: .0 1.1;
52 52
53 @if math.min($txtY, $bgY) < list.nth($icp, 1) or math.max($txtY, $bgY) > list.nth($icp, 2) { 53 @if math.min($txtY, $bgY) < list.nth($icp, 1) or math.max($txtY, $bgY) > list.nth($icp, 2) {
54 @return 0; 54 @return 0;
55 } 55 }
56 56
57 @if $txtY <= map.get($SA98G, blkThrs) { 57 @if $txtY <= map.get($SA98G, blkThrs) {
58 $txtY: $txtY + math.pow(map.get($SA98G, blkThrs) - $txtY, map.get($SA98G, blkClmp)); 58 $txtY: $txtY + math.pow(map.get($SA98G, blkThrs) - $txtY, map.get($SA98G, blkClmp));
59 } 59 }
60 @if $bgY <= map.get($SA98G, blkThrs) { 60 @if $bgY <= map.get($SA98G, blkThrs) {
61 $bgY: $bgY + math.pow(map.get($SA98G, blkThrs) - $bgY, map.get($SA98G, blkClmp)); 61 $bgY: $bgY + math.pow(map.get($SA98G, blkThrs) - $bgY, map.get($SA98G, blkClmp));
62 } 62 }
63 63
64 @if math.abs($bgY - $txtY) < map.get($SA98G, deltaYmin) { 64 @if math.abs($bgY - $txtY) < map.get($SA98G, deltaYmin) {
65 @return 0; 65 @return 0;
66 } 66 }
67 67
68 $outputContrast: 0; 68 $outputContrast: 0;
69 69
70 @if $bgY > $txtY { 70 @if $bgY > $txtY {
71 $SAPC: map.get($SA98G, scaleBoW) * (math.pow($bgY, map.get($SA98G, normBG)) - math.pow($txtY, map.get($SA98G, normTXT))); 71 $SAPC: map.get($SA98G, scaleBoW) * (math.pow($bgY, map.get($SA98G, normBG)) - math.pow($txtY, map.get($SA98G, normTXT)));
72 72
73 @if $SAPC >= map.get($SA98G, loClip) { 73 @if $SAPC >= map.get($SA98G, loClip) {
74 $outputContrast: $SAPC - map.get($SA98G, loBoWoffset); 74 $outputContrast: $SAPC - map.get($SA98G, loBoWoffset);
75 } 75 }
76 } @else { 76 } @else {
77 $SAPC: map.get($SA98G, scaleWoB) * (math.pow($bgY, map.get($SA98G, revBG)) - math.pow($txtY, map.get($SA98G, revTXT))); 77 $SAPC: map.get($SA98G, scaleWoB) * (math.pow($bgY, map.get($SA98G, revBG)) - math.pow($txtY, map.get($SA98G, revTXT)));
78 78
79 @if $SAPC <= -1 * map.get($SA98G, loClip) { 79 @if $SAPC <= -1 * map.get($SA98G, loClip) {
80 $outputContrast: $SAPC + map.get($SA98G, loWoBoffset); 80 $outputContrast: $SAPC + map.get($SA98G, loWoBoffset);
81 } 81 }
82 } 82 }
83 83
84 @return $outputContrast * 100; 84 @return $outputContrast * 100;
85} 85}
86 86
87@function reverse($contrast, $knownY, $knownType: 'bg') { 87@function reverse($contrast, $knownY, $knownType: 'bg') {
88 $unknownY: $knownY; 88 $unknownY: $knownY;
89 89
90 $knownExp: 0; 90 $knownExp: 0;
91 $unknownExp: 0; 91 $unknownExp: 0;
92 92
93 $scale: map.get($SA98G, if($contrast > 0, scaleBoW, scaleWoB)); 93 $scale: map.get($SA98G, if($contrast > 0, scaleBoW, scaleWoB));
94 $offset: map.get($SA98G, if($contrast > 0, loBoWoffset, loWoBoffset)); 94 $offset: map.get($SA98G, if($contrast > 0, loBoWoffset, loWoBoffset));
95 95
96 $contrast: math.div($contrast * .01 + $offset, $scale); 96 $contrast: math.div($contrast * .01 + $offset, $scale);
97 97
98 @if $knownY <= map.get($SA98G, blkThrs) { 98 @if $knownY <= map.get($SA98G, blkThrs) {
99 $knownY: $knownY + math.pow(map.get($SA98G, blkThrs) - $knownY, map.get($SA98G, blkClmp)); 99 $knownY: $knownY + math.pow(map.get($SA98G, blkThrs) - $knownY, map.get($SA98G, blkClmp));
100 } 100 }
101 101
102 @if $knownType == 'bg' { 102 @if $knownType == 'bg' {
103 $knownExp: map.get($SA98G, if($contrast > 0, normBG, revBG)); 103 $knownExp: map.get($SA98G, if($contrast > 0, normBG, revBG));
104 $unknownExp: map.get($SA98G, if($contrast > 0, normTXT, revTXT)); 104 $unknownExp: map.get($SA98G, if($contrast > 0, normTXT, revTXT));
105 $unknownY: math.pow(math.pow($knownY, $knownExp) - $contrast, math.div(1, $unknownExp)); 105 $unknownY: math.pow(math.pow($knownY, $knownExp) - $contrast, math.div(1, $unknownExp));
106 } @else { 106 } @else {
107 $knownExp: map.get($SA98G, if($contrast > 0, normTXT, revTXT)); 107 $knownExp: map.get($SA98G, if($contrast > 0, normTXT, revTXT));
108 $unknownExp: map.get($SA98G, if($contrast > 0, normBG, revBG)); 108 $unknownExp: map.get($SA98G, if($contrast > 0, normBG, revBG));
109 $unknownY: math.pow($contrast + math.pow($knownY, $knownExp), math.div(1, $unknownExp)); 109 $unknownY: math.pow($contrast + math.pow($knownY, $knownExp), math.div(1, $unknownExp));
110 } 110 }
111 111
112 @if '#{$unknownY}' == '#{math.sqrt(-1)}' { 112 @if '#{$unknownY}' == '#{math.sqrt(-1)}' {
113 @return false; 113 @return false;
114 } 114 }
115 115
116 @if $unknownY > 1.06 or $unknownY < 0 { 116 @if $unknownY > 1.06 or $unknownY < 0 {
117 @return false; 117 @return false;
118 } 118 }
119 119
120 @if $unknownY <= map.get($SA98G, blkThrs) { 120 @if $unknownY <= map.get($SA98G, blkThrs) {
121 $unknownY: math.pow(($unknownY + map.get($SA98G, mOffsetIn)) * map.get($SA98G, mFactor), math.div(map.get($SA98G, mExpAdj), map.get($SA98G, blkClmp))) * math.div(1, map.get($SA98G, mFactor)) - map.get($SA98G, mOffsetOut); 121 $unknownY: math.pow(($unknownY + map.get($SA98G, mOffsetIn)) * map.get($SA98G, mFactor), math.div(map.get($SA98G, mExpAdj), map.get($SA98G, blkClmp))) * math.div(1, map.get($SA98G, mFactor)) - map.get($SA98G, mOffsetOut);
122 } 122 }
123 123
124 $unknownY: math.max(math.min($unknownY, 1), 0); 124 $unknownY: math.max(math.min($unknownY, 1), 0);
125 125
126 @return $unknownY; 126 @return $unknownY;
127} 127}
diff --git a/src/_config.defaults.scss b/src/_config.defaults.scss
index cf23f29..861b600 100644
--- a/src/_config.defaults.scss
+++ b/src/_config.defaults.scss
@@ -4,184 +4,194 @@
4@use 'iro-sass/src/easing' as easing; 4@use 'iro-sass/src/easing' as easing;
5 5
6$static-colors: ( 6$static-colors: (
7 --base: hsl(0, 0%, 98%), 7 --base: hsl(0, 0%, 98%),
8 8
9 --levels: ( 9 --levels: (
10 --100: math.div(0, 12) * 110 - 10, 10 --100: math.div(0, 12) * 110 - 10,
11 --200: math.div(1, 12) * 110 - 10, 11 --200: math.div(1, 12) * 110 - 10,
12 --300: math.div(2, 12) * 110 - 10, 12 --300: math.div(2, 12) * 110 - 10,
13 --400: math.div(3, 12) * 110 - 10, 13 --400: math.div(3, 12) * 110 - 10,
14 --500: math.div(4, 12) * 110 - 10, 14 --500: math.div(4, 12) * 110 - 10,
15 --600: math.div(5, 12) * 110 - 10, 15 --600: math.div(5, 12) * 110 - 10,
16 --700: math.div(6, 12) * 110 - 10, 16 --700: math.div(6, 12) * 110 - 10,
17 --800: math.div(7, 12) * 110 - 10, 17 --800: math.div(7, 12) * 110 - 10,
18 --900: math.div(8, 12) * 110 - 10, 18 --900: math.div(8, 12) * 110 - 10,
19 --1000: math.div(9, 12) * 110 - 10, 19 --1000: math.div(9, 12) * 110 - 10,
20 --1100: math.div(10, 12) * 110 - 10, 20 --1100: math.div(10, 12) * 110 - 10,
21 --1200: math.div(11, 12) * 110 - 10, 21 --1200: math.div(11, 12) * 110 - 10,
22 --1300: math.div(12, 12) * 110 - 10, 22 --1300: math.div(12, 12) * 110 - 10,
23 ), 23 ),
24 24
25 --palettes: ( 25 --palettes: (
26 --blue: oklch(56% .14 275.25), 26 --blue: oklch(56% .14 275.25),
27 --purple: oklch(56% .14 305.58), 27 --purple: oklch(56% .14 305.58),
28 --red: oklch(56% .14 14.69), 28 --red: oklch(56% .14 14.69),
29 --green: oklch(56% .14 150.48), 29 --green: oklch(56% .14 150.48),
30 --yellow: oklch(56% .14 84.08), 30 --yellow: oklch(56% .14 84.08),
31 ), 31 ),
32 32
33 --transparents: ( 33 --transparents: (
34 --100: 0, 34 --100: 0,
35 --200: .1, 35 --200: .1,
36 --300: .25, 36 --300: .25,
37 --400: .4, 37 --400: .4,
38 --500: .55, 38 --500: .55,
39 --600: .7, 39 --600: .7,
40 --700: .8, 40 --700: .8,
41 --800: .9, 41 --800: .9,
42 --900: 1, 42 --900: 1,
43 ), 43 ),
44); 44);
45 45
46$semantic-colors-common: ( 46$semantic-colors-common: (
47 --accent: --blue, 47 --accent: --blue,
48 --accent-static: --blue-static, 48 --accent-static: --blue-static,
49 --positive: --green, 49 --positive: --green,
50 --positive-static: --green-static, 50 --positive-static: --green-static,
51 --negative: --red, 51 --negative: --red,
52 --negative-static: --red-static, 52 --negative-static: --red-static,
53 --warning: --yellow, 53 --warning: --yellow,
54 --warning-static: --yellow-static, 54 --warning-static: --yellow-static,
55 55
56 --focus-raw: --accent, 56 --focus-raw: --accent,
57 --focus-static: --accent-static, 57 --focus-static: --accent-static,
58 58
59 --border-mute: --base --200, 59 --border-mute: --base --200,
60 --border: --base --300, 60 --border: --base --300,
61 --border-strong: --base --400, 61 --border-strong: --base --400,
62 62
63 --text-disabled: --base --500, 63 --text-disabled: --base --500,
64 --text-mute-more: --base --600, 64 --text-mute-more: --base --600,
65 --text-mute: --base --700, 65 --text-mute: --base --700,
66 --text: --base --800, 66 --text: --base --800,
67 --heading: --base --900, 67 --heading: --base --900,
68 68
69 --focus: ( 69 --focus: (
70 --outline: --focus-raw --400, 70 --outline: --focus-raw --400,
71 --border-mute: --focus-raw --900, 71 --border-mute: --focus-raw --900,
72 --border: --focus-raw --1000, 72 --border: --focus-raw --1000,
73 --border-text: --focus-raw --1000-text, 73 --border-text: --focus-raw --1000-text,
74 --border-strong: --focus-raw --1100, 74 --border-strong: --focus-raw --1100,
75 --text: --focus-raw --1100, 75 --text: --focus-raw --1100,
76 ), 76 ),
77); 77);
78 78
79$theme-light: ( 79$theme-light: (
80 --levels: ( 80 --levels: (
81 --grays: ( 81 --grays: (
82 --50: (-8) (.2 + .8 * easing.ease(math.div(0, 12))), 82 --50: (-8) (.2 + .8 * easing.ease(math.div(0, 12))),
83 --75: (-4) (.2 + .8 * easing.ease(math.div(1, 12))), 83 --75: (-4) (.2 + .8 * easing.ease(math.div(1, 12))),
84 --100: (0) (.2 + .8 * easing.ease(math.div(2, 12))), 84 --100: (0) (.2 + .8 * easing.ease(math.div(2, 12))),
85 85
86 --200: (easing.cubic-bezier(.2, .1, .9, .9, math.div(1, 7)) * 98) (.2 + .8 * easing.ease(math.div(3, 12))), 86 --200: (easing.cubic-bezier(.2, .1, .9, .9, math.div(1, 7)) * 98) (.2 + .8 * easing.ease(math.div(3, 12))),
87 --300: (easing.cubic-bezier(.2, .1, .9, .9, math.div(2, 7)) * 98) (.2 + .8 * easing.ease(math.div(4, 12))), 87 --300: (easing.cubic-bezier(.2, .1, .9, .9, math.div(2, 7)) * 98) (.2 + .8 * easing.ease(math.div(4, 12))),
88 --400: (easing.cubic-bezier(.2, .1, .9, .9, math.div(3, 7)) * 98) (.2 + .8 * easing.ease(math.div(5, 12))), 88 --400: (easing.cubic-bezier(.2, .1, .9, .9, math.div(3, 7)) * 98) (.2 + .8 * easing.ease(math.div(5, 12))),
89 89
90 --500: (easing.cubic-bezier(.2, .1, .9, .9, math.div(4, 7)) * 98) (.2 + .8 * easing.ease(math.div(6, 12))), 90 --500: (easing.cubic-bezier(.2, .1, .9, .9, math.div(4, 7)) * 98) (.2 + .8 * easing.ease(math.div(6, 12))),
91 --600: (easing.cubic-bezier(.2, .1, .9, .9, math.div(5, 7)) * 98) (.2 + .8 * easing.ease(math.div(7, 12))), 91 --600: (easing.cubic-bezier(.2, .1, .9, .9, math.div(5, 7)) * 98) (.2 + .8 * easing.ease(math.div(7, 12))),
92 --700: (easing.cubic-bezier(.2, .1, .9, .9, math.div(6, 7)) * 98) (.2 + .8 * easing.ease(math.div(8, 12))), 92 --700: (easing.cubic-bezier(.2, .1, .9, .9, math.div(6, 7)) * 98) (.2 + .8 * easing.ease(math.div(8, 12))),
93 --800: (easing.cubic-bezier(.2, .1, .9, .9, math.div(7, 7)) * 98) (.2 + .8 * easing.ease(math.div(9, 12))), 93 --800: (easing.cubic-bezier(.2, .1, .9, .9, math.div(7, 7)) * 98) (.2 + .8 * easing.ease(math.div(9, 12))),
94 --900: (106) (.2 + .8 * easing.ease(math.div(10, 12))), 94 --900: (106) (.2 + .8 * easing.ease(math.div(10, 12))),
95 ), 95 ),
96 96
97 --colors: ( 97 --colors: (
98 --100: (math.div(0, 12) * 94 + 7) (.2 + .8 * easing.ease(math.div(0, 12))), 98 --100: (math.div(0, 12) * 94 + 7) (.2 + .8 * easing.ease(math.div(0, 12))),
99 --200: (math.div(1, 12) * 94 + 7) (.2 + .8 * easing.ease(math.div(1, 12))), 99 --200: (math.div(1, 12) * 94 + 7) (.2 + .8 * easing.ease(math.div(1, 12))),
100 --300: (math.div(2, 12) * 94 + 7) (.2 + .8 * easing.ease(math.div(2, 12))), 100 --300: (math.div(2, 12) * 94 + 7) (.2 + .8 * easing.ease(math.div(2, 12))),
101 --400: (math.div(3, 12) * 94 + 7) (.2 + .8 * easing.ease(math.div(3, 12))), 101 --400: (math.div(3, 12) * 94 + 7) (.2 + .8 * easing.ease(math.div(3, 12))),
102 --500: (math.div(4, 12) * 94 + 7) (.2 + .8 * easing.ease(math.div(4, 12))), 102 --500: (math.div(4, 12) * 94 + 7) (.2 + .8 * easing.ease(math.div(4, 12))),
103 --600: (math.div(5, 12) * 94 + 7) (.2 + .8 * easing.ease(math.div(5, 12))), 103 --600: (math.div(5, 12) * 94 + 7) (.2 + .8 * easing.ease(math.div(5, 12))),
104 --700: (math.div(6, 12) * 94 + 7) (.2 + .8 * easing.ease(math.div(6, 12))), 104 --700: (math.div(6, 12) * 94 + 7) (.2 + .8 * easing.ease(math.div(6, 12))),
105 --800: (math.div(7, 12) * 94 + 7) (.2 + .8 * easing.ease(math.div(7, 12))), 105 --800: (math.div(7, 12) * 94 + 7) (.2 + .8 * easing.ease(math.div(7, 12))),
106 --900: (math.div(8, 12) * 94 + 7) (.2 + .8 * easing.ease(math.div(8, 12))), 106 --900: (math.div(8, 12) * 94 + 7) (.2 + .8 * easing.ease(math.div(8, 12))),
107 --1000: (math.div(9, 12) * 94 + 7) (.2 + .8 * easing.ease(math.div(9, 12))), 107 --1000: (math.div(9, 12) * 94 + 7) (.2 + .8 * easing.ease(math.div(9, 12))),
108 --1100: (math.div(10, 12) * 94 + 7) (.2 + .8 * easing.ease(math.div(10, 12))), 108 --1100: (math.div(10, 12) * 94 + 7) (.2 + .8 * easing.ease(math.div(10, 12))),
109 --1200: (math.div(11, 12) * 94 + 7) (.2 + .8 * easing.ease(math.div(11, 12))), 109 --1200: (math.div(11, 12) * 94 + 7) (.2 + .8 * easing.ease(math.div(11, 12))),
110 --1300: (math.div(12, 12) * 94 + 7) (.2 + .8 * easing.ease(math.div(12, 12))), 110 --1300: (math.div(12, 12) * 94 + 7) (.2 + .8 * easing.ease(math.div(12, 12))),
111 ), 111 ),
112 ), 112 ),
113 113
114 --palettes: ( 114 --palettes: (
115 --base: hsl(260, 70%, 98%) --grays, 115 --base: hsl(260, 70%, 98%) --grays,
116 --blue: oklch(56% .16 275.25) --colors, 116 --blue: oklch(56% .16 275.25) --colors,
117 --purple: oklch(56% .16 305.58) --colors, 117 --purple: oklch(56% .16 305.58) --colors,
118 --red: oklch(56% .16 14.69) --colors, 118 --red: oklch(56% .16 14.69) --colors,
119 --green: oklch(56% .16 150.48) --colors, 119 --green: oklch(56% .16 150.48) --colors,
120 --yellow: oklch(56% .16 84.08) --colors, 120 --yellow: oklch(56% .16 84.08) --colors,
121 ), 121 ),
122 122
123 --semantic: map.merge($semantic-colors-common, ( 123 --semantic: map.merge($semantic-colors-common, (
124 --bg-l2: --base --50, 124 --bg-l2: --base --50,
125 --bg-l1: --base --100, 125 --bg-l1: --base --100,
126 --bg-base: --base --200, 126 --bg-base: --base --200,
127 )),
128 127
129 --constants: ( 128 --box: (
130 --shadow: rgba(#000, .15), 129 --border: --base --200,
131 ), 130 --border-strong: --base --300,
131 ),
132 )),
133
134 --constants: (
135 --shadow: rgba(#000, .1),
136 ),
132); 137);
133 138
134$theme-dark: ( 139$theme-dark: (
135 --levels: ( 140 --levels: (
136 --grays: ( 141 --grays: (
137 --50: (4.4) (.3 + .7 * easing.ease(math.div(10, 12))), 142 --50: (4.4) (.3 + .7 * easing.ease(math.div(10, 12))),
138 --75: (2.5) (.3 + .7 * easing.ease(math.div(9, 12))), 143 --75: (2.5) (.3 + .7 * easing.ease(math.div(9, 12))),
139 --100: (0) (.3 + .7 * easing.ease(math.div(8, 12))), 144 --100: (0) (.3 + .7 * easing.ease(math.div(8, 12))),
140 145
141 --200: (easing.cubic-bezier(.3, .1, .8, .8, math.div(1, 8)) * -108) (.3 + .7 * easing.ease(math.div(7, 12))), 146 --200: (easing.cubic-bezier(.3, .1, .8, .8, math.div(1, 8)) * -108) (.3 + .7 * easing.ease(math.div(7, 12))),
142 --300: (easing.cubic-bezier(.3, .1, .8, .8, math.div(2, 8)) * -108) (.3 + .7 * easing.ease(math.div(6, 12))), 147 --300: (easing.cubic-bezier(.3, .1, .8, .8, math.div(2, 8)) * -108) (.3 + .7 * easing.ease(math.div(6, 12))),
143 --400: (easing.cubic-bezier(.3, .1, .8, .8, math.div(3, 8)) * -108) (.3 + .7 * easing.ease(math.div(5, 12))), 148 --400: (easing.cubic-bezier(.3, .1, .8, .8, math.div(3, 8)) * -108) (.3 + .7 * easing.ease(math.div(5, 12))),
144 149
145 --500: (easing.cubic-bezier(.3, .1, .8, .8, math.div(4, 8)) * -108) (.3 + .7 * easing.ease(math.div(4, 12))), 150 --500: (easing.cubic-bezier(.3, .1, .8, .8, math.div(4, 8)) * -108) (.3 + .7 * easing.ease(math.div(4, 12))),
146 --600: (easing.cubic-bezier(.3, .1, .8, .8, math.div(5, 8)) * -108) (.3 + .7 * easing.ease(math.div(3, 12))), 151 --600: (easing.cubic-bezier(.3, .1, .8, .8, math.div(5, 8)) * -108) (.3 + .7 * easing.ease(math.div(3, 12))),
147 --700: (easing.cubic-bezier(.3, .1, .8, .8, math.div(6, 8)) * -108) (.3 + .7 * easing.ease(math.div(2, 12))), 152 --700: (easing.cubic-bezier(.3, .1, .8, .8, math.div(6, 8)) * -108) (.3 + .7 * easing.ease(math.div(2, 12))),
148 --800: (easing.cubic-bezier(.3, .1, .8, .8, math.div(7, 8)) * -108) (.3 + .7 * easing.ease(math.div(1, 12))), 153 --800: (easing.cubic-bezier(.3, .1, .8, .8, math.div(7, 8)) * -108) (.3 + .7 * easing.ease(math.div(1, 12))),
149 --900: (easing.cubic-bezier(.3, .1, .8, .8, math.div(8, 8)) * -108) (.3 + .7 * easing.ease(math.div(0, 12))), 154 --900: (easing.cubic-bezier(.3, .1, .8, .8, math.div(8, 8)) * -108) (.3 + .7 * easing.ease(math.div(0, 12))),
150 ), 155 ),
151 156
152 --colors: ( 157 --colors: (
153 --100: (easing.cubic-bezier(.2, .1, .8, .8, math.div(0, 12)) * -109 - .5) (.3 + .7 * easing.ease(math.div(0, 12))), 158 --100: (easing.cubic-bezier(.2, .1, .8, .8, math.div(0, 12)) * -109 - .5) (.3 + .7 * easing.ease(math.div(0, 12))),
154 --200: (easing.cubic-bezier(.2, .1, .8, .8, math.div(1, 12)) * -109 - .5) (.3 + .7 * easing.ease(math.div(1, 12))), 159 --200: (easing.cubic-bezier(.2, .1, .8, .8, math.div(1, 12)) * -109 - .5) (.3 + .7 * easing.ease(math.div(1, 12))),
155 --300: (easing.cubic-bezier(.2, .1, .8, .8, math.div(2, 12)) * -109 - .5) (.3 + .7 * easing.ease(math.div(2, 12))), 160 --300: (easing.cubic-bezier(.2, .1, .8, .8, math.div(2, 12)) * -109 - .5) (.3 + .7 * easing.ease(math.div(2, 12))),
156 --400: (easing.cubic-bezier(.2, .1, .8, .8, math.div(3, 12)) * -109 - .5) (.3 + .7 * easing.ease(math.div(3, 12))), 161 --400: (easing.cubic-bezier(.2, .1, .8, .8, math.div(3, 12)) * -109 - .5) (.3 + .7 * easing.ease(math.div(3, 12))),
157 --500: (easing.cubic-bezier(.2, .1, .8, .8, math.div(4, 12)) * -109 - .5) (.3 + .7 * easing.ease(math.div(4, 12))), 162 --500: (easing.cubic-bezier(.2, .1, .8, .8, math.div(4, 12)) * -109 - .5) (.3 + .7 * easing.ease(math.div(4, 12))),
158 --600: (easing.cubic-bezier(.2, .1, .8, .8, math.div(5, 12)) * -109 - .5) (.3 + .7 * easing.ease(math.div(5, 12))), 163 --600: (easing.cubic-bezier(.2, .1, .8, .8, math.div(5, 12)) * -109 - .5) (.3 + .7 * easing.ease(math.div(5, 12))),
159 --700: (easing.cubic-bezier(.2, .1, .8, .8, math.div(6, 12)) * -109 - .5) (.3 + .7 * easing.ease(math.div(6, 12))), 164 --700: (easing.cubic-bezier(.2, .1, .8, .8, math.div(6, 12)) * -109 - .5) (.3 + .7 * easing.ease(math.div(6, 12))),
160 --800: (easing.cubic-bezier(.2, .1, .8, .8, math.div(7, 12)) * -109 - .5) (.3 + .7 * easing.ease(math.div(7, 12))), 165 --800: (easing.cubic-bezier(.2, .1, .8, .8, math.div(7, 12)) * -109 - .5) (.3 + .7 * easing.ease(math.div(7, 12))),
161 --900: (easing.cubic-bezier(.2, .1, .8, .8, math.div(8, 12)) * -109 - .5) (.3 + .7 * easing.ease(math.div(8, 12))), 166 --900: (easing.cubic-bezier(.2, .1, .8, .8, math.div(8, 12)) * -109 - .5) (.3 + .7 * easing.ease(math.div(8, 12))),
162 --1000: (easing.cubic-bezier(.2, .1, .8, .8, math.div(9, 12)) * -109 - .5) (.3 + .7 * easing.ease(math.div(9, 12))), 167 --1000: (easing.cubic-bezier(.2, .1, .8, .8, math.div(9, 12)) * -109 - .5) (.3 + .7 * easing.ease(math.div(9, 12))),
163 --1100: (easing.cubic-bezier(.2, .1, .8, .8, math.div(10, 12)) * -109 - .5) (.3 + .7 * easing.ease(math.div(10, 12))), 168 --1100: (easing.cubic-bezier(.2, .1, .8, .8, math.div(10, 12)) * -109 - .5) (.3 + .7 * easing.ease(math.div(10, 12))),
164 --1200: (easing.cubic-bezier(.2, .1, .8, .8, math.div(11, 12)) * -109 - .5) (.3 + .7 * easing.ease(math.div(11, 12))), 169 --1200: (easing.cubic-bezier(.2, .1, .8, .8, math.div(11, 12)) * -109 - .5) (.3 + .7 * easing.ease(math.div(11, 12))),
165 --1300: (easing.cubic-bezier(.2, .1, .8, .8, math.div(12, 12)) * -109 - .5) (.3 + .7 * easing.ease(math.div(12, 12))), 170 --1300: (easing.cubic-bezier(.2, .1, .8, .8, math.div(12, 12)) * -109 - .5) (.3 + .7 * easing.ease(math.div(12, 12))),
166 ), 171 ),
167 ), 172 ),
168 173
169 --palettes: ( 174 --palettes: (
170 --base: hsl(257, 7%, 20%) --grays, 175 --base: hsl(257, 7%, 20%) --grays,
171 --blue: oklch(56% .16 275.25) --colors, 176 --blue: oklch(56% .16 275.25) --colors,
172 --purple: oklch(56% .16 305.58) --colors, 177 --purple: oklch(56% .16 305.58) --colors,
173 --red: oklch(56% .16 14.69) --colors, 178 --red: oklch(56% .16 14.69) --colors,
174 --green: oklch(56% .16 150.48) --colors, 179 --green: oklch(56% .16 150.48) --colors,
175 --yellow: oklch(56% .16 84.08) --colors, 180 --yellow: oklch(56% .16 84.08) --colors,
176 ), 181 ),
182
183 --semantic: map.merge($semantic-colors-common, (
184 --bg-base: --base --50,
185 --bg-l1: --base --75,
186 --bg-l2: --base --100,
177 187
178 --semantic: map.merge($semantic-colors-common, ( 188 --box: (
179 --bg-base: --base --50, 189 --border: --base --100,
180 --bg-l1: --base --75, 190 --border-strong: --base --100,
181 --bg-l2: --base --100, 191 ),
182 )), 192 )),
183 193
184 --constants: ( 194 --constants: (
185 --shadow: rgba(#000, .5), 195 --shadow: rgba(#000, .35),
186 ), 196 ),
187); 197);
diff --git a/src/_config.scss b/src/_config.scss
index 284d6e7..764d953 100644
--- a/src/_config.scss
+++ b/src/_config.scss
@@ -18,10 +18,12 @@ $theme-dark: map.deep-merge(def.$theme-dark, $theme-dark-override) !default;
18 18
19$themes-override: () !default; 19$themes-override: () !default;
20$themes: map.deep-merge(( 20$themes: map.deep-merge((
21 --main: ( 21 --main: (
22 light: $theme-light, 22 light: $theme-light,
23 dark: $theme-dark, 23 dark: $theme-dark,
24 ), 24 ),
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..7be4b0d 100644
--- a/src/_core.scss
+++ b/src/_core.scss
@@ -9,30 +9,37 @@
9@forward 'core.vars'; 9@forward 'core.vars';
10 10
11@mixin styles { 11@mixin styles {
12 @each $theme-name, $theme in vars.$themes { 12 @each $theme-name, $theme in vars.$themes {
13 @if $theme-name == config.$theme-default { 13 @if $theme-name == config.$theme-default {
14 :root { 14 :root {
15 @include props.materialize(map.values(meta.module-variables('vars'))); 15 @include props.materialize(map.values(meta.module-variables('vars')));
16 16
17 @if map.has-key($theme, 'dark') { 17 @if map.has-key($theme, 'dark') {
18 @media (prefers-color-scheme: dark) { 18 @media (prefers-color-scheme: dark) {
19 @include props.materialize(map.get($theme, 'dark')); 19 @include props.materialize(map.get($theme, 'dark'));
20 } 20 }
21 } 21 }
22 } 22 }
23 } @else {
24 @include bem.theme(string.slice($theme-name, 3)) {
25 @include props.materialize(map.get($theme, 'light'));
26 23
27 color: props.get(vars.$theme, --text); 24 @if map.has-key($theme, 'dark') and config.$explicit-dark-theme {
28 background-color: props.get(vars.$theme, --bg-base); 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 }
30 } @else {
31 @include bem.theme(string.slice($theme-name, 3)) {
32 @include props.materialize(map.get($theme, 'light'));
29 33
30 @if map.has-key($theme, 'dark') { 34 color: props.get(vars.$theme, --text);
31 @media (prefers-color-scheme: dark) { 35 background-color: props.get(vars.$theme, --bg-base);
32 @include props.materialize(map.get($theme, 'dark')); 36
33 } 37 @if map.has-key($theme, 'dark') {
34 } 38 @media (prefers-color-scheme: dark) {
35 } 39 @include props.materialize(map.get($theme, 'dark'));
36 } 40 }
37 } 41 }
42 }
43 }
44 }
38} 45}
diff --git a/src/_core.vars.scss b/src/_core.vars.scss
index 0a94534..f7a9ebc 100644
--- a/src/_core.vars.scss
+++ b/src/_core.vars.scss
@@ -89,11 +89,18 @@ $border-width--thick: props.def(--border-width--thick, 4px) !default;
89$border-width--medium: props.def(--border-width--medium, 2px) !default; 89$border-width--medium: props.def(--border-width--medium, 2px) !default;
90$border-width--thin: props.def(--border-width--thin, 1px) !default; 90$border-width--thin: props.def(--border-width--thin, 1px) !default;
91 91
92$shadow--x: props.def(--shadow--x, 0) !default; 92$shadow--l1--x: props.def(--shadow--l1--x, 0) !default;
93$shadow--y: props.def(--shadow--y, 1px) !default; 93$shadow--l1--y: props.def(--shadow--l1--y, 2px) !default;
94$shadow--blur: props.def(--shadow--blur, 4px) !default; 94$shadow--l1--blur: props.def(--shadow--l1--blur, 3px) !default;
95$shadow--l1--grow: props.def(--shadow--l1--grow, -1px) !default;
95 96
96$rounding: props.def(--rounding, 4px) !default; 97$shadow--l2--x: props.def(--shadow--l2--x, 0) !default;
98$shadow--l2--y: props.def(--shadow--l2--y, 5px) !default;
99$shadow--l2--blur: props.def(--shadow--l2--blur, 12px) !default;
100$shadow--l2--grow: props.def(--shadow--l2--grow, -4px) !default;
101
102$rounding: props.def(--rounding, 12px) !default;
103$rounding--sm: props.def(--rounding--sm, 4px) !default;
97 104
98$key-focus--outline-width: props.def(--key-focus--outline-width, props.get($border-width--thick)) !default; 105$key-focus--outline-width: props.def(--key-focus--outline-width, props.get($border-width--thick)) !default;
99$key-focus--border-width: props.def(--key-focus--border-width, props.get($border-width--medium)) !default; 106$key-focus--border-width: props.def(--key-focus--border-width, props.get($border-width--medium)) !default;
@@ -109,8 +116,8 @@ $sticky-top-offset: props.def(--sticky-top-offset, 0rem) !default;
109$-static-colors: (); 116$-static-colors: ();
110 117
111@each $palette-name, $palette in map.get(config.$static-colors, --palettes) { 118@each $palette-name, $palette in map.get(config.$static-colors, --palettes) {
112 $palette: fn.palette($palette, map.get(config.$static-colors, --levels), map.get(config.$static-colors, --base)); 119 $palette: fn.palette($palette, map.get(config.$static-colors, --levels), map.get(config.$static-colors, --base));
113 $-static-colors: map.merge($-static-colors, ( $palette-name: $palette )); 120 $-static-colors: map.merge($-static-colors, ( $palette-name: $palette ));
114} 121}
115 122
116// 123//
@@ -118,11 +125,11 @@ $-static-colors: ();
118$transparent-colors: props.def(--transparent-colors, (), 'color'); 125$transparent-colors: props.def(--transparent-colors, (), 'color');
119 126
120@each $palette-name, $palette in (--black: #000 #fff, --white: #fff #000) { 127@each $palette-name, $palette in (--black: #000 #fff, --white: #fff #000) {
121 $color: list.nth($palette, 1); 128 $color: list.nth($palette, 1);
122 $text: list.nth($palette, 2); 129 $text: list.nth($palette, 2);
123 130
124 $palette: fn.transparent-palette($color, $text, map.get(config.$static-colors, --transparents)); 131 $palette: fn.transparent-palette($color, $text, map.get(config.$static-colors, --transparents));
125 $transparent-colors: props.merge($transparent-colors, ( $palette-name: $palette )); 132 $transparent-colors: props.merge($transparent-colors, ( $palette-name: $palette ));
126} 133}
127 134
128// 135//
@@ -130,47 +137,47 @@ $transparent-colors: props.def(--transparent-colors, (), 'color');
130$themes: (); 137$themes: ();
131 138
132@each $theme-name, $theme in config.$themes { 139@each $theme-name, $theme in config.$themes {
133 @each $variant-name, $variant in $theme { 140 @each $variant-name, $variant in $theme {
134 @if $variant != null { 141 @if $variant != null {
135 $compiled: props.def(--colors, (), 'color'); 142 $compiled: props.def(--colors, (), 'color');
136 143
137 @each $palette-name, $palette in $-static-colors { 144 @each $palette-name, $palette in $-static-colors {
138 $compiled: props.merge($compiled, ( #{$palette-name}-static: $palette )); 145 $compiled: props.merge($compiled, ( #{$palette-name}-static: $palette ));
139 } 146 }
140 147
141 @each $palette-name, $palette in map.get($variant, --palettes) { 148 @each $palette-name, $palette in map.get($variant, --palettes) {
142 $base-color: list.nth($palette, 1); 149 $base-color: list.nth($palette, 1);
143 $levels: list.nth($palette, 2); 150 $levels: list.nth($palette, 2);
144 151
145 $palette: fn.palette($base-color, map.get($variant, --levels, $levels), list.nth(map.get($variant, --palettes, --base), 1)); 152 $palette: fn.palette($base-color, map.get($variant, --levels, $levels), list.nth(map.get($variant, --palettes, --base), 1));
146 $compiled: props.merge($compiled, ( $palette-name: $palette )); 153 $compiled: props.merge($compiled, ( $palette-name: $palette ));
147 } 154 }
148 155
149 @each $color, $value in map.get($variant, --constants) { 156 @each $color, $value in map.get($variant, --constants) {
150 $compiled: props.merge($compiled, ( $color: $value )); 157 $compiled: props.merge($compiled, ( $color: $value ));
151 } 158 }
152 159
153 @each $color, $ref in map.get($variant, --semantic) { 160 @each $color, $ref in map.get($variant, --semantic) {
154 $res: (); 161 $res: ();
155 162
156 @if meta.type-of($ref) == 'map' { 163 @if meta.type-of($ref) == 'map' {
157 @each $key, $r in $ref { 164 @each $key, $r in $ref {
158 $re1: list.nth($r, 1); 165 $re1: list.nth($r, 1);
159 $re2: functions.list-slice($r, 2); 166 $re2: functions.list-slice($r, 2);
160 $res: map.merge($res, ($key: props.get($compiled, $re1, $re2...))); 167 $res: map.merge($res, ($key: props.get($compiled, $re1, $re2...)));
161 } 168 }
162 } @else { 169 } @else {
163 $ref1: list.nth($ref, 1); 170 $ref1: list.nth($ref, 1);
164 $ref2: functions.list-slice($ref, 2); 171 $ref2: functions.list-slice($ref, 2);
165 $res: props.get($compiled, $ref1, $ref2...); 172 $res: props.get($compiled, $ref1, $ref2...);
166 } 173 }
167 174
168 $compiled: props.merge($compiled, ( $color: $res )); 175 $compiled: props.merge($compiled, ( $color: $res ));
169 } 176 }
170 177
171 $themes: map.set($themes, $theme-name, $variant-name, $compiled); 178 $themes: map.set($themes, $theme-name, $variant-name, $compiled);
172 } 179 }
173 } 180 }
174} 181}
175 182
176$theme: map.get($themes, config.$theme-default, light) !default; 183$theme: map.get($themes, config.$theme-default, light) !default;
diff --git a/src/_functions.scss b/src/_functions.scss
index 62caf8c..ec1f9d8 100644
--- a/src/_functions.scss
+++ b/src/_functions.scss
@@ -8,59 +8,63 @@
8@use 'apca'; 8@use 'apca';
9 9
10@function palette($base-color, $levels, $ref-color: $base-color) { 10@function palette($base-color, $levels, $ref-color: $base-color) {
11 $base-lch: color.to-space($base-color, oklch); 11 $base-lch: color.to-space($base-color, oklch);
12 $ref-lch: color.to-space($ref-color, oklch); 12 $ref-lch: color.to-space($ref-color, oklch);
13 13
14 $ref-l: color.channel($ref-lch, 'lightness'); 14 $ref-l: color.channel($ref-lch, 'lightness');
15 $ref-y: apca.sRGB_to_Y($ref-lch); 15 $ref-y: apca.sRGB_to_Y($ref-lch);
16 16
17 $black-y: apca.sRGB_to_Y(#000); 17 $black-y: apca.sRGB_to_Y(#000);
18 $white-y: apca.sRGB_to_Y(#fff); 18 $white-y: apca.sRGB_to_Y(#fff);
19 19
20 $palette: (); 20 $palette: ();
21 21
22 @each $key, $level in $levels { 22 @each $key, $level in $levels {
23 $color: list.nth($level, 1); 23 $color: list.nth($level, 1);
24 $y: 0; 24 $y: 0;
25 $c: 1; 25 $c: 1;
26 $h: 0deg;
26 27
27 @if list.length($level) > 1 { 28 @if list.length($level) > 1 {
28 $c: list.nth($level, 2); 29 $c: list.nth($level, 2);
29 } 30 }
31 @if list.length($level) > 2 {
32 $h: list.nth($level, 3);
33 }
30 34
31 @if meta.type-of($color) != 'color' { 35 @if meta.type-of($color) != 'color' {
32 $y: apca.reverse($color, $ref-y); 36 $y: apca.reverse($color, $ref-y);
33 $l: color.channel($base-lch, 'lightness'); 37 $l: color.channel($base-lch, 'lightness');
34 38
35 @if $y != false { 39 @if $y != false {
36 $l: color.channel(apca.Y_to_sRGB($y), 'lightness', oklch); 40 $l: color.channel(apca.Y_to_sRGB($y), 'lightness', oklch);
37 } @else { 41 } @else {
38 $y: $ref-y; 42 $y: $ref-y;
39 } 43 }
40 44
41 $color: oklch($l ($c * color.channel($base-lch, 'chroma')) color.channel($base-lch, 'hue')); 45 $color: oklch($l ($c * color.channel($base-lch, 'chroma')) ($h + color.channel($base-lch, 'hue')));
42 } @else { 46 } @else {
43 $y: apca.sRGB_to_Y($color); 47 $y: apca.sRGB_to_Y($color);
44 } 48 }
45 49
46 $contrast-black: apca.contrast($black-y, $y); 50 $contrast-black: apca.contrast($black-y, $y);
47 $contrast-white: apca.contrast($white-y, $y); 51 $contrast-white: apca.contrast($white-y, $y);
48 52
49 $palette: map.set($palette, $key, $color); 53 $palette: map.set($palette, $key, $color);
50 $palette: map.set($palette, #{$key}-text, if(math.abs($contrast-black) > math.abs($contrast-white), #000, #fff)); 54 $palette: map.set($palette, #{$key}-text, if(math.abs($contrast-black) > math.abs($contrast-white), #000, #fff));
51 } 55 }
52 56
53 @return $palette; 57 @return $palette;
54} 58}
55 59
56@function transparent-palette($color, $text, $alphas) { 60@function transparent-palette($color, $text, $alphas) {
57 $palette: ( 61 $palette: (
58 --text: $text, 62 --text: $text,
59 ); 63 );
60 64
61 @each $key, $alpha in $alphas { 65 @each $key, $alpha in $alphas {
62 $palette: map.set($palette, $key, rgba($color, $alpha)); 66 $palette: map.set($palette, $key, rgba($color, $alpha));
63 } 67 }
64 68
65 @return $palette; 69 @return $palette;
66} 70}
diff --git a/src/_iro-design.scss b/src/_iro-design.scss
index 5ed32e9..22e50c0 100644
--- a/src/_iro-design.scss
+++ b/src/_iro-design.scss
@@ -1,28 +1,29 @@
1$breakpoints: ( 1$breakpoints: (
2 lg: 1340px, 2 lg: 1340px,
3 md: 900px, 3 md: 900px,
4 sm: 620px, 4 sm: 620px,
5 xs: 400px, 5 xs: 400px,
6) !default; 6) !default;
7 7
8@use 'iro-sass/src/responsive' with ( 8@use 'iro-sass/src/responsive' with (
9 $named-viewports: $breakpoints 9 $named-viewports: $breakpoints
10); 10);
11 11
12@forward 'include-media/dist/include-media' as media--* with ( 12@forward 'include-media/dist/include-media' as media--* with (
13 $breakpoints: $breakpoints, 13 $breakpoints: $breakpoints,
14 $unit-intervals: ( 14 $unit-intervals: (
15 'px': 1, 15 'px': 1,
16 'em': .01, 16 'em': .01,
17 'rem': .01, 17 'rem': .01,
18 '': 0 18 '': 0
19 ) !default, 19 ) !default,
20); 20);
21 21
22@forward 'config.defaults' as config-defaults--*; 22@forward 'config.defaults' as config-defaults--*;
23@forward 'config' as config--*; 23@forward 'config' as config--*;
24@forward 'props' as props--*; 24@forward 'props' as props--*;
25@forward 'core' as core--*; 25@forward 'core' as core--*;
26@forward 'layers' as layers--*;
26 27
27@forward 'layouts/button-group' as l-button-group--*; 28@forward 'layouts/button-group' as l-button-group--*;
28@forward 'layouts/card-list' as l-card-list--*; 29@forward 'layouts/card-list' as l-card-list--*;
@@ -37,21 +38,21 @@ $breakpoints: (
37@forward 'scopes/body' as s-body--*; 38@forward 'scopes/body' as s-body--*;
38@forward 'scopes/blockquotes' as s-blockquotes--*; 39@forward 'scopes/blockquotes' as s-blockquotes--*;
39@forward 'scopes/code' as s-code--*; 40@forward 'scopes/code' as s-code--*;
41@forward 'scopes/figures' as s-figures--*;
40@forward 'scopes/headings' as s-headings--*; 42@forward 'scopes/headings' as s-headings--*;
41@forward 'scopes/links' as s-links--*; 43@forward 'scopes/links' as s-links--*;
42@forward 'scopes/lists' as s-lists--*; 44@forward 'scopes/lists' as s-lists--*;
43@forward 'scopes/tables' as s-tables--*; 45@forward 'scopes/tables' as s-tables--*;
44 46
45@forward 'objects/action-button' as o-action-button--*;
46@forward 'objects/alert' as o-alert--*; 47@forward 'objects/alert' as o-alert--*;
47@forward 'objects/avatar' as o-avatar--*; 48@forward 'objects/avatar' as o-avatar--*;
48@forward 'objects/backdrop' as o-backdrop--*; 49@forward 'objects/backdrop' as o-backdrop--*;
49@forward 'objects/badge' as o-badge--*;
50@forward 'objects/button' as o-button--*; 50@forward 'objects/button' as o-button--*;
51@forward 'objects/card' as o-card--*; 51@forward 'objects/card' as o-card--*;
52@forward 'objects/checkbox' as o-checkbox--*; 52@forward 'objects/checkbox' as o-checkbox--*;
53@forward 'objects/divider' as o-divider--*; 53@forward 'objects/divider' as o-divider--*;
54@forward 'objects/emoji' as o-emoji--*; 54@forward 'objects/emoji' as o-emoji--*;
55@forward 'objects/figure' as o-figure--*;
55@forward 'objects/field-label' as o-field-label--*; 56@forward 'objects/field-label' as o-field-label--*;
56@forward 'objects/heading' as o-heading--*; 57@forward 'objects/heading' as o-heading--*;
57@forward 'objects/icon' as o-icon--*; 58@forward 'objects/icon' as o-icon--*;
@@ -59,13 +60,14 @@ $breakpoints: (
59@forward 'objects/menu' as o-menu--*; 60@forward 'objects/menu' as o-menu--*;
60@forward 'objects/navbar' as o-navbar--*; 61@forward 'objects/navbar' as o-navbar--*;
61@forward 'objects/palette' as o-palette--*; 62@forward 'objects/palette' as o-palette--*;
63@forward 'objects/placeholders' as o-placeholders--*;
62@forward 'objects/popover' as o-popover--*; 64@forward 'objects/popover' as o-popover--*;
63@forward 'objects/radio' as o-radio--*; 65@forward 'objects/radio' as o-radio--*;
64@forward 'objects/side-nav' as o-side-nav--*; 66@forward 'objects/side-nav' as o-side-nav--*;
65@forward 'objects/status-indicator' as o-status-indicator--*; 67@forward 'objects/status-indicator' as o-status-indicator--*;
66@forward 'objects/switch' as o-switch--*; 68@forward 'objects/switch' as o-switch--*;
67@forward 'objects/table' as o-table--*; 69@forward 'objects/table' as o-table--*;
68@forward 'objects/tabs' as o-tabs--*; 70@forward 'objects/tabbar' as o-tabbar--*;
69@forward 'objects/text-field' as o-text-field--*; 71@forward 'objects/text-field' as o-text-field--*;
70@forward 'objects/thumbnail' as o-thumbnail--*; 72@forward 'objects/thumbnail' as o-thumbnail--*;
71 73
diff --git a/src/_layers.scss b/src/_layers.scss
new file mode 100644
index 0000000..2a80190
--- /dev/null
+++ b/src/_layers.scss
@@ -0,0 +1,3 @@
1@mixin styles {
2 @layer scope, theme, object, layout, component, utility;
3}
diff --git a/src/_mixins.scss b/src/_mixins.scss
index 49d3b6f..8899778 100644
--- a/src/_mixins.scss
+++ b/src/_mixins.scss
@@ -2,37 +2,37 @@
2@use 'functions' as fn; 2@use 'functions' as fn;
3 3
4@mixin set-font($basis, $values: ()) { 4@mixin set-font($basis, $values: ()) {
5 $values: fn.set-font($basis, $values); 5 $values: fn.set-font($basis, $values);
6 6
7 @each $prop, $value in $values { 7 @each $prop, $value in $values {
8 @if $value != null { 8 @if $value != null {
9 #{$prop}: $value; 9 #{$prop}: $value;
10 } 10 }
11 } 11 }
12} 12}
13 13
14@mixin heading-strong($size) { 14@mixin heading-strong($size) {
15 font-size: fn.global-dim(list.join(--heading, $size)); 15 font-size: fn.global-dim(list.join(--heading, $size));
16 color: fn.global-color(--heading); 16 color: fn.global-color(--heading);
17} 17}
18 18
19@mixin heading-medium($size) { 19@mixin heading-medium($size) {
20 @include set-font(--standard, ( 20 @include set-font(--standard, (
21 --line-height: null, 21 --line-height: null,
22 --size: fn.global-dim(list.join(--heading, $size)), 22 --size: fn.global-dim(list.join(--heading, $size)),
23 --weight: bold 23 --weight: bold
24 )); 24 ));
25 25
26 color: fn.global-color(--heading); 26 color: fn.global-color(--heading);
27} 27}
28 28
29@mixin heading-faint($size) { 29@mixin heading-faint($size) {
30 @include set-font(--standard, ( 30 @include set-font(--standard, (
31 --line-height: null, 31 --line-height: null,
32 --size: fn.global-dim(list.join(--heading, $size)), 32 --size: fn.global-dim(list.join(--heading, $size)),
33 --weight: 500, 33 --weight: 500,
34 --spacing: 1px 34 --spacing: 1px
35 )); 35 ));
36 36
37 color: fn.global-color(--text-mute); 37 color: fn.global-color(--text-mute);
38} 38}
diff --git a/src/_props.scss b/src/_props.scss
index ffba054..0b2306d 100644
--- a/src/_props.scss
+++ b/src/_props.scss
@@ -8,34 +8,41 @@
8@use 'iro-sass/src/props'; 8@use 'iro-sass/src/props';
9 9
10@mixin materialize-at-root($ref) { 10@mixin materialize-at-root($ref) {
11 @if meta.type-of($ref) == 'map' { 11 @if meta.type-of($ref) == 'map' {
12 $ref: map.values($ref); 12 $ref: map.values($ref);
13 } 13 }
14 14
15 :root { 15 :root {
16 @include props.materialize($ref, null); 16 @include props.materialize($ref, null);
17 @include props.materialize($ref, 'color'); 17 @include props.materialize($ref, 'color');
18 18
19 @each $breakpoint in map.keys(media.$breakpoints) { 19 @each $breakpoint in map.keys(media.$breakpoints) {
20 @include media.media('<=#{$breakpoint}') { 20 @include media.media('<=#{$breakpoint}') {
21 @include props.materialize($ref, $breakpoint); 21 @include props.materialize($ref, $breakpoint);
22 } 22 }
23 } 23 }
24 24
25 @media (prefers-color-scheme: dark) { 25 @media (prefers-color-scheme: dark) {
26 @include props.materialize($ref, 'dark'); 26 @include props.materialize($ref, 'dark');
27 } 27 }
28 } 28 }
29 29
30 @each $theme-name in map.keys(config.$themes) { 30 @if config.$explicit-dark-theme {
31 @if $theme-name != config.$theme-default { 31 @include bem.theme('dark') {
32 @include bem.theme(string.slice($theme-name, 3)) { 32 @include props.materialize($ref, 'color');
33 @include props.materialize($ref, 'color'); 33 @include props.materialize($ref, 'dark');
34 }
35 }
34 36
35 @media (prefers-color-scheme: dark) { 37 @each $theme-name in map.keys(config.$themes) {
36 @include props.materialize($ref, 'dark'); 38 @if $theme-name != config.$theme-default {
37 } 39 @include bem.theme(string.slice($theme-name, 3)) {
38 } 40 @include props.materialize($ref, 'color');
39 } 41
40 } 42 @media (prefers-color-scheme: dark) {
43 @include props.materialize($ref, 'dark');
44 }
45 }
46 }
47 }
41} 48}
diff --git a/src/_themes.scss b/src/_themes.scss
index 32b617b..fe5a0cb 100644
--- a/src/_themes.scss
+++ b/src/_themes.scss
@@ -1,4 +1,5 @@
1@use 'sass:map'; 1@use 'sass:map';
2@use 'sass:string';
2@use 'iro-sass/src/bem'; 3@use 'iro-sass/src/bem';
3@use 'iro-sass/src/props'; 4@use 'iro-sass/src/props';
4@use 'include-media/dist/include-media' as media; 5@use 'include-media/dist/include-media' as media;
@@ -7,67 +8,67 @@
7@forward 'core.vars'; 8@forward 'core.vars';
8 9
9@mixin styles { 10@mixin styles {
10 @include bem.theme('base') { 11 @include bem.theme('base') {
11 background-color: props.get(vars.$theme, --bg-base); 12 background-color: props.get(vars.$theme, --bg-base);
12 13
13 @include bem.suffix('light') { 14 @include bem.suffix('light') {
14 @media (prefers-color-scheme: light) { 15 @media (prefers-color-scheme: light) {
15 background-color: props.get(vars.$theme, --bg-base); 16 background-color: props.get(vars.$theme, --bg-base);
16 } 17 }
17 } 18 }
18 19
19 @include bem.suffix('dark') { 20 @include bem.suffix('dark') {
20 @media (prefers-color-scheme: dark) { 21 @media (prefers-color-scheme: dark) {
21 background-color: props.get(vars.$theme, --bg-base); 22 background-color: props.get(vars.$theme, --bg-base);
22 } 23 }
23 } 24 }
24 } 25 }
25 26
26 @include bem.theme('l1') { 27 @include bem.theme('l1') {
27 background-color: props.get(vars.$theme, --bg-l1); 28 background-color: props.get(vars.$theme, --bg-l1);
28 29
29 @include bem.suffix('light') { 30 @include bem.suffix('light') {
30 @media (prefers-color-scheme: light) { 31 @media (prefers-color-scheme: light) {
31 background-color: props.get(vars.$theme, --bg-l1); 32 background-color: props.get(vars.$theme, --bg-l1);
32 } 33 }
33 } 34 }
34 35
35 @include bem.suffix('dark') { 36 @include bem.suffix('dark') {
36 @media (prefers-color-scheme: dark) { 37 @media (prefers-color-scheme: dark) {
37 background-color: props.get(vars.$theme, --bg-l1); 38 background-color: props.get(vars.$theme, --bg-l1);
38 } 39 }
39 } 40 }
40 } 41 }
41 42
42 @include bem.theme('l2') { 43 @include bem.theme('l2') {
43 background-color: props.get(vars.$theme, --bg-l2); 44 background-color: props.get(vars.$theme, --bg-l2);
44 45
45 @include bem.suffix('light') { 46 @include bem.suffix('light') {
46 @media (prefers-color-scheme: light) { 47 @media (prefers-color-scheme: light) {
47 background-color: props.get(vars.$theme, --bg-l2); 48 background-color: props.get(vars.$theme, --bg-l2);
48 } 49 }
49 } 50 }
50 51
51 @include bem.suffix('dark') { 52 @include bem.suffix('dark') {
52 @media (prefers-color-scheme: dark) { 53 @media (prefers-color-scheme: dark) {
53 background-color: props.get(vars.$theme, --bg-l2); 54 background-color: props.get(vars.$theme, --bg-l2);
54 } 55 }
55 } 56 }
56 } 57 }
57 58
58 @include bem.theme('50') { 59 @include bem.theme('50') {
59 background-color: props.get(vars.$theme, --base, --50); 60 background-color: props.get(vars.$theme, --base, --50);
60 61
61 @include bem.suffix('light') { 62 @include bem.suffix('light') {
62 @media (prefers-color-scheme: light) { 63 @media (prefers-color-scheme: light) {
63 background-color: props.get(vars.$theme, --base, --50); 64 background-color: props.get(vars.$theme, --base, --50);
64 } 65 }
65 } 66 }
66 67
67 @include bem.suffix('dark') { 68 @include bem.suffix('dark') {
68 @media (prefers-color-scheme: dark) { 69 @media (prefers-color-scheme: dark) {
69 background-color: props.get(vars.$theme, --base, --50); 70 background-color: props.get(vars.$theme, --base, --50);
70 } 71 }
71 } 72 }
72 } 73 }
73} 74}
diff --git a/src/_utils.scss b/src/_utils.scss
index 4fb122a..3dae3b6 100644
--- a/src/_utils.scss
+++ b/src/_utils.scss
@@ -1,4 +1,5 @@
1@use 'sass:map'; 1@use 'sass:map';
2@use 'sass:string';
2@use 'iro-sass/src/bem'; 3@use 'iro-sass/src/bem';
3@use 'iro-sass/src/props'; 4@use 'iro-sass/src/props';
4@use 'include-media/dist/include-media' as media; 5@use 'include-media/dist/include-media' as media;
@@ -8,301 +9,372 @@
8 9
9/* stylelint-disable-next-line scss/dollar-variable-pattern */ 10/* stylelint-disable-next-line scss/dollar-variable-pattern */
10$-dirs: ( 11$-dirs: (
11 '': '', 12 '': '',
12 'bs': '-block-start', 13 'b': '-block',
13 'be': '-block-end', 14 'bs': '-block-start',
14 'b': '-block', 15 'be': '-block-end',
15 'is': '-inline-start', 16 'i': '-inline',
16 'ie': '-inline-end', 17 'is': '-inline-start',
17 'i': '-inline', 18 'ie': '-inline-end',
18) !default; 19) !default;
19 20
20/* stylelint-disable-next-line scss/dollar-variable-pattern */ 21/* stylelint-disable-next-line scss/dollar-variable-pattern */
21$-sizes: ( 22$-sizes: (
22 0: vars.$size--0, 23 0: vars.$size--0,
23 10: vars.$size--10, 24 10: vars.$size--10,
24 50: vars.$size--50, 25 50: vars.$size--50,
25 75: vars.$size--75, 26 75: vars.$size--75,
26 100: vars.$size--100, 27 100: vars.$size--100,
27 125: vars.$size--125, 28 125: vars.$size--125,
28 200: vars.$size--200, 29 200: vars.$size--200,
29 400: vars.$size--400, 30 400: vars.$size--400,
30 700: vars.$size--700, 31 700: vars.$size--700,
31 800: vars.$size--800, 32 800: vars.$size--800,
33) !default;
34
35$-font-sizes: (
36 50: vars.$font-size--50,
37 75: vars.$font-size--75,
38 100: vars.$font-size--100,
39 150: vars.$font-size--150,
40 200: vars.$font-size--200,
41 300: vars.$font-size--300,
32) !default; 42) !default;
33 43
34@mixin styles { 44@mixin styles {
35 @include bem.utility('d-block') { 45 @include bem.utility('d-block') {
36 display: block; 46 display: block;
37 } 47 }
48
49 @include bem.utility('d-inline-block') {
50 display: inline-block;
51 }
52
53 @include bem.utility('d-contents') {
54 display: contents;
55 }
56
57 @include bem.utility('d-flex') {
58 display: flex;
59 }
38 60
39 @include bem.utility('d-inline-block') { 61 @include bem.utility('td-none') {
40 display: inline-block; 62 text-decoration: none;
41 } 63 }
42 64
43 @include bem.utility('d-contents') { 65 @include bem.utility('d-none') {
44 display: contents; 66 display: none;
45 }
46 67
47 @include bem.utility('d-flex') { 68 @each $breakpoint in map.keys(media.$breakpoints) {
48 display: flex; 69 @include media.media('<=#{$breakpoint}') {
49 } 70 @include bem.suffix('#{$breakpoint}-lo') {
71 display: none;
72 }
73 }
50 74
51 @include bem.utility('td-none') { 75 @include media.media('>#{$breakpoint}') {
52 text-decoration: none; 76 @include bem.suffix('#{$breakpoint}-hi') {
53 } 77 display: none;
78 }
79 }
80 }
54 81
55 @include bem.utility('d-none') { 82 @include bem.at-theme('js') {
56 display: none; 83 @include bem.suffix('js') {
84 display: none;
85 }
86 }
57 87
58 @each $breakpoint in map.keys(media.$breakpoints) { 88 @include bem.at-theme('no-js') {
59 @include media.media('<=#{$breakpoint}') { 89 @include bem.suffix('no-js') {
60 @include bem.suffix('#{$breakpoint}-lo') { 90 display: none;
61 display: none; 91 }
62 } 92 }
63 }
64 93
65 @include media.media('>#{$breakpoint}') { 94 @include bem.suffix('empty') {
66 @include bem.suffix('#{$breakpoint}-hi') { 95 &:empty {
67 display: none; 96 display: none;
68 } 97 }
69 } 98 }
70 } 99 }
71 100
72 @include bem.at-theme('js') { 101 @include bem.utility('va-top') {
73 @include bem.suffix('js') { 102 vertical-align: top;
74 display: none; 103 }
75 }
76 }
77 104
78 @include bem.at-theme('no-js') { 105 @include bem.utility('va-baseline') {
79 @include bem.suffix('no-js') { 106 vertical-align: baseline;
80 display: none; 107 }
81 }
82 }
83 108
84 @include bem.suffix('empty') { 109 @include bem.utility('va-middle') {
85 &:empty { 110 vertical-align: middle;
86 display: none; 111 }
87 }
88 }
89 }
90 112
91 @include bem.utility('va-top') { 113 @include bem.utility('va-bottom') {
92 vertical-align: top; 114 vertical-align: bottom;
93 } 115 }
94 116
95 @include bem.utility('va-baseline') { 117 @include bem.utility('ta-start') {
96 vertical-align: baseline; 118 text-align: start;
97 } 119 }
98 120
99 @include bem.utility('va-middle') { 121 @include bem.utility('ta-end') {
100 vertical-align: middle; 122 text-align: end;
101 } 123 }
102 124
103 @include bem.utility('va-bottom') { 125 @include bem.utility('ta-center') {
104 vertical-align: bottom; 126 text-align: center;
105 } 127 }
106 128
107 @include bem.utility('ta-start') { 129 @include bem.utility('fw-normal') {
108 text-align: start; 130 font-weight: normal;
109 } 131 }
110 132
111 @include bem.utility('ta-end') { 133 @include bem.utility('ai-center') {
112 text-align: end; 134 align-items: center;
113 } 135 }
114 136
115 @include bem.utility('ta-center') { 137 @include bem.utility('ai-start') {
116 text-align: center; 138 align-items: flex-start;
117 } 139 }
118 140
119 @include bem.utility('fw-normal') { 141 @include bem.utility('ai-end') {
120 font-weight: normal; 142 align-items: flex-end;
121 } 143 }
122 144
123 @include bem.utility('ai-center') { 145 @include bem.utility('ac-center') {
124 align-items: center; 146 align-content: center;
125 } 147 }
126 148
127 @include bem.utility('ai-start') { 149 @include bem.utility('jc-center') {
128 align-items: flex-start; 150 justify-content: center;
129 } 151 }
130 152
131 @include bem.utility('ai-end') { 153 @include bem.utility('jc-start') {
132 align-items: flex-end; 154 justify-content: flex-start;
133 } 155 }
134 156
135 @include bem.utility('jc-center') { 157 @include bem.utility('jc-end') {
136 justify-content: center; 158 justify-content: flex-end;
137 } 159 }
138 160
139 @include bem.utility('jc-start') { 161 @include bem.utility('tt-upper') {
140 justify-content: flex-start; 162 text-transform: uppercase;
141 } 163 }
142 164
143 @include bem.utility('jc-end') { 165 @include bem.utility('tt-lower') {
144 justify-content: flex-end; 166 text-transform: lowercase;
145 } 167 }
146 168
147 @include bem.utility('tt-upper') { 169 @include bem.utility('c-heading') {
148 text-transform: uppercase; 170 color: props.get(vars.$theme, --heading);
149 }
150 171
151 @include bem.utility('tt-lower') { 172 @each $theme in map.keys(props.get(vars.$transparent-colors)) {
152 text-transform: lowercase; 173 $theme-name: static-#{string.slice($theme, 3)};
153 } 174
175 @include bem.at-theme($theme-name) {
176 color: props.get(vars.$transparent-colors, $theme, --900);
177 }
178 }
179 }
154 180
155 @include bem.utility('c-heading') { 181 @include bem.utility('c-text') {
156 color: props.get(vars.$theme, --heading); 182 color: props.get(vars.$theme, --text);
157 }
158 183
159 @include bem.utility('c-text') { 184 @each $theme in map.keys(props.get(vars.$transparent-colors)) {
160 color: props.get(vars.$theme, --text); 185 $theme-name: static-#{string.slice($theme, 3)};
161 } 186
187 @include bem.at-theme($theme-name) {
188 color: props.get(vars.$transparent-colors, $theme, --800);
189 }
190 }
191 }
162 192
163 @include bem.utility('c-mute') { 193 @include bem.utility('c-mute') {
164 color: props.get(vars.$theme, --text-mute); 194 color: props.get(vars.$theme, --text-mute);
165 }
166 195
167 @include bem.utility('c-mute-more') { 196 @each $theme in map.keys(props.get(vars.$transparent-colors)) {
168 color: props.get(vars.$theme, --text-mute-more); 197 $theme-name: static-#{string.slice($theme, 3)};
169 } 198
199 @include bem.at-theme($theme-name) {
200 color: props.get(vars.$transparent-colors, $theme, --700);
201 }
202 }
203 }
170 204
171 @each $dir, $prop in (is: inline-size, bs: block-size) { 205 @include bem.utility('c-mute-more') {
172 @include bem.utility('#{$dir}-100') { 206 color: props.get(vars.$theme, --text-mute-more);
173 #{$prop}: 100%; 207
174 } 208 @each $theme in map.keys(props.get(vars.$transparent-colors)) {
209 $theme-name: static-#{string.slice($theme, 3)};
210
211 @include bem.at-theme($theme-name) {
212 color: props.get(vars.$transparent-colors, $theme, --600);
213 }
214 }
215 }
216
217 @each $mod, $size in $-font-sizes {
218 @include bem.utility('fs-#{$mod}') {
219 font-size: props.get($size);
220 }
221 }
222
223 @each $dir, $prop in (is: inline-size, bs: block-size) {
224 @include bem.utility('#{$dir}-100') {
225 #{$prop}: 100%;
226 }
175 227
176 @include bem.utility('#{$dir}-75') { 228 @include bem.utility('#{$dir}-75') {
177 #{$prop}: 75%; 229 #{$prop}: 75%;
178 } 230 }
179 231
180 @include bem.utility('#{$dir}-50') { 232 @include bem.utility('#{$dir}-50') {
181 #{$prop}: 50%; 233 #{$prop}: 50%;
182 } 234 }
183 235
184 @include bem.utility('#{$dir}-25') { 236 @include bem.utility('#{$dir}-25') {
185 #{$prop}: 25%; 237 #{$prop}: 25%;
186 } 238 }
187 239
188 @include bem.utility('#{$dir}-1px') { 240 @include bem.utility('#{$dir}-1px') {
189 #{$prop}: 1px; 241 #{$prop}: 1px;
190 } 242 }
191 243
192 @include bem.utility('#{$dir}-0') { 244 @include bem.utility('#{$dir}-0') {
193 #{$prop}: 0; 245 #{$prop}: 0;
194 } 246 }
195 } 247 }
248
249 @include bem.utility('elp') {
250 overflow: hidden;
251 text-overflow: ellipsis;
252 white-space: nowrap;
253 }
254
255 @include bem.utility('o-auto') {
256 overflow: auto;
257 }
196 258
197 @include bem.utility('elp') { 259 @include bem.utility('o-hidden') {
198 overflow: hidden; 260 overflow: hidden;
199 text-overflow: ellipsis; 261 }
200 white-space: nowrap;
201 }
202 262
203 @include bem.utility('o-hidden') { 263 @include bem.utility('p-static') {
204 overflow: hidden; 264 position: static;
205 } 265 }
206 266
207 @include bem.utility('p-static') { 267 @include bem.utility('p-relative') {
208 position: static; 268 position: relative;
209 } 269 }
210 270
211 @include bem.utility('p-relative') { 271 @include bem.utility('p-fixed') {
212 position: relative; 272 position: fixed;
213 } 273 }
214 274
215 @include bem.utility('p-fixed') { 275 @include bem.utility('p-sticky-bs') {
216 position: fixed; 276 position: sticky;
217 } 277 inset-block-start: props.get(vars.$sticky-top-offset);
278 }
218 279
219 @include bem.utility('p-sticky-bs') { 280 @include bem.utility('p-sticky-be') {
220 position: sticky; 281 position: sticky;
221 inset-block-start: props.get(vars.$sticky-top-offset); 282 inset-block-end: 0;
222 } 283 }
223 284
224 @include bem.utility('p-sticky-be') { 285 @include bem.utility('br-round') {
225 position: sticky; 286 border-radius: props.get(vars.$rounding);
226 inset-block-end: 0; 287 }
227 }
228 288
229 @include bem.utility('br-round') { 289 @include bem.utility('br-round-sm') {
230 border-radius: props.get(vars.$rounding); 290 border-radius: props.get(vars.$rounding--sm);
231 } 291 }
232 292
233 @each $dir, $suffix in $-dirs { 293 @each $dir, $suffix in $-dirs {
234 @include bem.utility('m#{$dir}-auto') { 294 @include bem.utility('m#{$dir}-auto') {
235 margin#{$suffix}: auto; 295 margin#{$suffix}: auto;
236 } 296 }
237 297
238 @include bem.utility('p#{$dir}-auto') { 298 @include bem.utility('p#{$dir}-auto') {
239 padding#{$suffix}: auto; 299 padding#{$suffix}: auto;
240 } 300 }
241 301
242 @each $mod, $size in $-sizes { 302 @each $mod, $size in $-sizes {
243 @include bem.utility('m#{$dir}-#{$mod}') { 303 @include bem.utility('m#{$dir}-#{$mod}') {
244 margin#{$suffix}: props.get($size); 304 margin#{$suffix}: props.get($size);
245 } 305 }
246 306
247 @include bem.utility('p#{$dir}-#{$mod}') { 307 @include bem.utility('p#{$dir}-#{$mod}') {
248 padding#{$suffix}: props.get($size); 308 padding#{$suffix}: props.get($size);
249 } 309 }
250 } 310 }
251 311
252 @include bem.utility('b#{$dir}-0') { 312 @include bem.utility('b#{$dir}-0') {
253 border#{$suffix}: 0; 313 border#{$suffix}: 0;
254 314
255 @include bem.suffix('light') { 315 @include bem.suffix('light') {
256 @media (prefers-color-scheme: light) { 316 @media (prefers-color-scheme: light) {
257 border#{$suffix}: 0; 317 border#{$suffix}: 0;
258 } 318 }
259 } 319 }
260 320
261 @include bem.suffix('dark') { 321 @include bem.suffix('dark') {
262 @media (prefers-color-scheme: dark) { 322 @media (prefers-color-scheme: dark) {
263 border#{$suffix}: 0; 323 border#{$suffix}: 0;
264 } 324 }
265 } 325 }
266 } 326 }
267 327
268 @include bem.utility('b#{$dir}-1') { 328 @include bem.utility('b#{$dir}-1') {
269 border#{$suffix}: props.get(vars.$border-width--thin) solid props.get(vars.$theme, --border); 329 border#{$suffix}: props.get(vars.$border-width--thin) solid props.get(vars.$theme, --border);
270 330
271 @include bem.suffix('light') { 331 @include bem.suffix('light') {
272 @media (prefers-color-scheme: light) { 332 @media (prefers-color-scheme: light) {
273 border#{$suffix}: props.get(vars.$border-width--thin) solid props.get(vars.$theme, --border); 333 border#{$suffix}: props.get(vars.$border-width--thin) solid props.get(vars.$theme, --border);
274 } 334 }
275 } 335 }
276 336
277 @include bem.suffix('dark') { 337 @include bem.suffix('dark') {
278 @media (prefers-color-scheme: dark) { 338 @media (prefers-color-scheme: dark) {
279 border#{$suffix}: props.get(vars.$border-width--thin) solid props.get(vars.$theme, --border); 339 border#{$suffix}: props.get(vars.$border-width--thin) solid props.get(vars.$theme, --border);
280 } 340 }
281 } 341 }
282 } 342 }
283 343
284 @include bem.utility('b#{$dir}-1-mute') { 344 @include bem.utility('b#{$dir}-1-mute') {
285 border#{$suffix}: props.get(vars.$border-width--thin) solid props.get(vars.$theme, --border-mute); 345 border#{$suffix}: props.get(vars.$border-width--thin) solid props.get(vars.$theme, --border-mute);
286 346
287 @include bem.suffix('light') { 347 @include bem.suffix('light') {
288 @media (prefers-color-scheme: light) { 348 @media (prefers-color-scheme: light) {
289 border#{$suffix}: props.get(vars.$border-width--thin) solid props.get(vars.$theme, --border-mute); 349 border#{$suffix}: props.get(vars.$border-width--thin) solid props.get(vars.$theme, --border-mute);
290 } 350 }
291 } 351 }
292 352
293 @include bem.suffix('dark') { 353 @include bem.suffix('dark') {
294 @media (prefers-color-scheme: dark) { 354 @media (prefers-color-scheme: dark) {
295 border#{$suffix}: props.get(vars.$border-width--thin) solid props.get(vars.$theme, --border-mute); 355 border#{$suffix}: props.get(vars.$border-width--thin) solid props.get(vars.$theme, --border-mute);
296 } 356 }
297 } 357 }
298 } 358 }
299 } 359 }
300 360
301 @include bem.utility('mbs-neutralize') { 361 @include bem.utility('mbs-neutralize') {
302 &::before { 362 &::before {
303 display: block; 363 display: block;
304 margin-block: -100em 100em; 364 margin-block: -100em 100em;
305 content: ''; 365 content: '';
306 } 366 }
307 } 367 }
368
369 @include bem.utility('sr-only') {
370 position: absolute;
371 width: 1px;
372 height: 1px;
373 padding: 0;
374 margin: -1px;
375 overflow: hidden;
376 white-space: nowrap;
377 border: 0;
378 clip-path: inset(50%);
379 }
308} 380}
diff --git a/src/layouts/_button-group.scss b/src/layouts/_button-group.scss
index c51ae7e..44719be 100644
--- a/src/layouts/_button-group.scss
+++ b/src/layouts/_button-group.scss
@@ -5,13 +5,46 @@
5 5
6@forward 'button-group.vars'; 6@forward 'button-group.vars';
7@use 'button-group.vars' as vars; 7@use 'button-group.vars' as vars;
8@use '../objects/button.vars' as button;
8 9
9@mixin styles { 10@mixin styles {
10 @include materialize-at-root(meta.module-variables('vars')); 11 @include materialize-at-root(meta.module-variables('vars'));
11 12
12 @include bem.layout('button-group') { 13 @include bem.layout('button-group') {
13 display: flex; 14 display: inline-flex;
14 flex-wrap: wrap; 15 flex-wrap: wrap;
15 gap: props.get(vars.$spacing); 16 gap: props.get(vars.$gap);
16 } 17
18 @each $mod, $size in vars.$sizes {
19 @include bem.modifier($mod) {
20 gap: props.get($size);
21 }
22 }
23
24 @include bem.modifier('align-block') {
25 margin-inline: calc(-1 * props.get(button.$pad-i) - props.get(button.$border-width));
26
27 @include bem.modifier('pill') {
28 margin-inline: calc(-1 * props.get(button.$pad-i-pill) - props.get(button.$border-width));
29 }
30
31 @include bem.modifier('icon') {
32 margin-inline: calc(-1 * props.get(button.$pad-b) - props.get(button.$border-width) - .5em * (props.get(button.$line-height) - 1));
33 }
34
35 @each $mod, $pad-i, $pad-i-label, $pad-i-pill, $pad-b, $font-size in button.$fixed-sizes {
36 @include bem.modifier('action-#{$mod}') {
37 margin-inline: calc(-1 * props.get($pad-i) - props.get(button.$border-width));
38
39 @include bem.modifier('pill') {
40 margin-inline: calc(-1 * props.get($pad-i-pill) - props.get(button.$border-width));
41 }
42
43 @include bem.modifier('icon') {
44 margin-inline: calc(-1 * props.get($pad-b) - props.get(button.$border-width) - .5em * (props.get(button.$line-height) - 1));
45 }
46 }
47 }
48 }
49 }
17} 50}
diff --git a/src/layouts/_button-group.vars.scss b/src/layouts/_button-group.vars.scss
index 95ac8f8..b56eec7 100644
--- a/src/layouts/_button-group.vars.scss
+++ b/src/layouts/_button-group.vars.scss
@@ -1,4 +1,16 @@
1@use 'iro-sass/src/props'; 1@use 'iro-sass/src/props';
2@use '../core.vars' as core; 2@use '../core.vars' as core;
3 3
4$spacing: props.def(--l-button-group--spacing, props.get(core.$size--150)) !default; 4$gap: props.def(--l-button-group--gap, props.get(core.$size--150)) !default;
5
6$gapless: props.def(--l-button-group--gapless, 0) !default;
7$sm: props.def(--l-button-group--sm, props.get(core.$size--100)) !default;
8$lg: props.def(--l-button-group--lg, props.get(core.$size--300)) !default;
9$xl: props.def(--l-button-group--xl, props.get(core.$size--450)) !default;
10
11$sizes: (
12 'gapless': $gapless,
13 'sm': $sm,
14 'lg': $lg,
15 'xl': $xl,
16) !default;
diff --git a/src/layouts/_card-list.scss b/src/layouts/_card-list.scss
index 8ef40c5..aedbfd0 100644
--- a/src/layouts/_card-list.scss
+++ b/src/layouts/_card-list.scss
@@ -8,75 +8,151 @@
8@use 'card-list.vars' as vars; 8@use 'card-list.vars' as vars;
9 9
10@mixin styles { 10@mixin styles {
11 @include materialize-at-root(meta.module-variables('vars')); 11 @include materialize-at-root(meta.module-variables('vars'));
12 12
13 @include bem.layout('card-list') { 13 @include bem.layout('card-list') {
14 display: flex; 14 display: flex;
15 flex-direction: column; 15 flex-direction: column;
16 gap: props.get(vars.$row-gap); 16 gap: props.get(vars.$row-gap);
17 17
18 @include bem.modifier('quiet') { 18 @include bem.modifier('merge') {
19 row-gap: props.get(vars.$quiet--row-gap); 19 position: relative;
20 } 20 gap: calc(2 * props.get(vars.$merge-padding) + props.get(vars.$border-width));
21 padding: props.get(vars.$merge-padding);
22 background-color: props.get(vars.$card-bg-color);
23 border: props.get(vars.$border-width) solid props.get(vars.$border-color);
24 border-radius: calc(props.get(vars.$rounding) + props.get(vars.$merge-padding));
21 25
22 @include bem.modifier('grid') { 26 @include bem.elem('card') {
23 display: grid; 27 &:not(:last-child) {
24 grid-template-columns: repeat(auto-fill, minmax(props.get(vars.$grid--col-width), 1fr)); 28 position: relative;
25 gap: props.get(vars.$grid--row-gap) props.get(vars.$grid--col-gap); 29 border-end-start-radius: 0;
30 border-end-end-radius: 0;
26 31
27 @include bem.modifier('quiet') { 32 &::after {
28 row-gap: props.get(vars.$grid--quiet--row-gap); 33 position: absolute;
29 } 34 inset-block-start: calc(100% + props.get(vars.$merge-padding) + props.get(vars.$border-width));
30 } 35 inset-inline: calc(-1 * props.get(vars.$merge-padding) - props.get(vars.$border-width));
36 display: block;
37 block-size: props.get(vars.$border-width);
38 content: '';
39 background-color: props.get(vars.$border-color);
40 }
41 }
31 42
32 @include bem.modifier('masonry') { 43 &:hover,
33 display: block; 44 &:active,
34 columns: auto props.get(vars.$masonry--col-width); 45 &:focus-visible {
35 column-gap: props.get(vars.$masonry--col-gap); 46 transform: none;
47 }
36 48
37 @include bem.elem('card') { 49 @include bem.next-twin-elem {
38 margin-block-end: props.get(vars.$masonry--row-gap); 50 border-start-start-radius: 0;
39 break-inside: avoid; 51 border-start-end-radius: 0;
40 } 52 }
53 }
41 54
42 @include bem.modifier('quiet') { 55 @include bem.modifier('borderless') {
43 @include bem.elem('card') { 56 border-color: props.get(vars.$card-bg-color);
44 margin-block-end: props.get(vars.$masonry--quiet--row-gap);
45 }
46 }
47 }
48 57
49 @include bem.modifier('masonry-h') { 58 @include bem.elem('card') {
50 flex-flow: row wrap; 59 &:not(:last-child) {
51 gap: props.get(vars.$masonry-h--row-gap) props.get(vars.$masonry-h--col-gap); 60 &::after {
61 inset-inline: calc(-1 * props.get(vars.$merge-padding) - 2 * props.get(vars.$border-width));
62 }
63 }
64 }
65 }
52 66
53 @include bem.modifier('no-flush') { 67 @include bem.modifier('shadow') {
54 &::after { 68 box-shadow:
55 display: block; 69 props.get(vars.$shadow-x)
56 flex: 1 0 auto; 70 props.get(vars.$shadow-y)
57 inline-size: props.get(vars.$masonry-h--row-height); 71 props.get(vars.$shadow-blur)
58 content: ''; 72 props.get(vars.$shadow-grow)
59 } 73 props.get(vars.$shadow-color);
60 } 74 }
75 }
61 76
62 @include bem.elem('card') { 77 @include bem.modifier('quiet') {
63 flex: 1 0 auto; 78 row-gap: props.get(vars.$quiet--row-gap);
64 max-inline-size: 100%; 79 }
65 }
66 80
67 @include bem.elem('card-image') { 81 @include bem.modifier('grid') {
68 block-size: props.get(vars.$masonry-h--row-height); 82 display: grid;
69 } 83 grid-template-columns: repeat(auto-fill, minmax(props.get(vars.$grid--col-width), 1fr));
84 gap: props.get(vars.$grid--row-gap) props.get(vars.$grid--col-gap);
70 85
71 @include bem.modifier('quiet') { 86 @include bem.modifier('quiet') {
72 row-gap: props.get(vars.$masonry-h--quiet--row-gap); 87 row-gap: props.get(vars.$grid--quiet--row-gap);
73 } 88 }
74 } 89 }
75 90
76 @include bem.modifier('aspect-5\\/4') { 91 @include bem.modifier('grid-sm') {
77 @include bem.elem('card-image') { 92 display: grid;
78 aspect-ratio: 5 / 4; 93 grid-template-columns: repeat(auto-fill, minmax(props.get(vars.$grid-sm--col-width), 1fr));
79 } 94 gap: props.get(vars.$grid-sm--row-gap) props.get(vars.$grid-sm--col-gap);
80 } 95
81 } 96 @include bem.modifier('grid-sm') {
97 @include media.media('<=md') {
98 display: flex;
99 gap: props.get(vars.$row-gap);
100 }
101 }
102
103 @include bem.modifier('quiet') {
104 row-gap: props.get(vars.$grid-sm--quiet--row-gap);
105 }
106 }
107
108 @include bem.modifier('masonry') {
109 display: block;
110 columns: auto props.get(vars.$masonry--col-width);
111 column-gap: props.get(vars.$masonry--col-gap);
112
113 @include bem.elem('card') {
114 margin-block-end: props.get(vars.$masonry--row-gap);
115 break-inside: avoid;
116 }
117
118 @include bem.modifier('quiet') {
119 @include bem.elem('card') {
120 margin-block-end: props.get(vars.$masonry--quiet--row-gap);
121 }
122 }
123 }
124
125 @include bem.modifier('masonry-h') {
126 flex-flow: row wrap;
127 gap: props.get(vars.$masonry-h--row-gap) props.get(vars.$masonry-h--col-gap);
128
129 @include bem.modifier('no-flush') {
130 &::after {
131 display: block;
132 flex: 1 0 auto;
133 inline-size: props.get(vars.$masonry-h--row-height);
134 content: '';
135 }
136 }
137
138 @include bem.elem('card') {
139 flex: 1 0 auto;
140 max-inline-size: 100%;
141 }
142
143 @include bem.elem('card-image') {
144 block-size: props.get(vars.$masonry-h--row-height);
145 }
146
147 @include bem.modifier('quiet') {
148 row-gap: props.get(vars.$masonry-h--quiet--row-gap);
149 }
150 }
151
152 @include bem.modifier('aspect-5\\/4') {
153 @include bem.elem('card-image') {
154 aspect-ratio: 5 / 4;
155 }
156 }
157 }
82} 158}
diff --git a/src/layouts/_card-list.vars.scss b/src/layouts/_card-list.vars.scss
index f77bfbf..75e72cc 100644
--- a/src/layouts/_card-list.vars.scss
+++ b/src/layouts/_card-list.vars.scss
@@ -1,5 +1,10 @@
1@use 'iro-sass/src/props'; 1@use 'iro-sass/src/props';
2@use '../core.vars' as core; 2@use '../core.vars' as core;
3@use '../objects/card' as card;
4
5$border-width: props.def(--l-card-list--border-width, props.get(card.$border-width)) !default;
6$merge-padding: props.def(--l-card-list--merge-padding, props.get(core.$border-width--thick)) !default;
7$rounding: props.def(--l-card-list--rounding, props.get(card.$rounding)) !default;
3 8
4$row-gap: props.def(--l-card-list--row-gap, props.get(core.$size--200)) !default; 9$row-gap: props.def(--l-card-list--row-gap, props.get(core.$size--200)) !default;
5$quiet--row-gap: props.def(--l-card-list--quiet--row-gap, props.get(core.$size--800)) !default; 10$quiet--row-gap: props.def(--l-card-list--quiet--row-gap, props.get(core.$size--800)) !default;
@@ -9,6 +14,11 @@ $grid--col-gap: props.def(--l-card-list--grid--col-gap, props.get(core.$s
9$grid--col-width: props.def(--l-card-list--grid--col-width, props.get(core.$size--3200)) !default; 14$grid--col-width: props.def(--l-card-list--grid--col-width, props.get(core.$size--3200)) !default;
10$grid--quiet--row-gap: props.def(--l-card-list--grid--quiet--row-gap, props.get(core.$size--800)) !default; 15$grid--quiet--row-gap: props.def(--l-card-list--grid--quiet--row-gap, props.get(core.$size--800)) !default;
11 16
17$grid-sm--row-gap: props.def(--l-card-list--grid-md--row-gap, props.get(core.$size--200)) !default;
18$grid-sm--col-gap: props.def(--l-card-list--grid-md--col-gap, props.get(core.$size--200)) !default;
19$grid-sm--col-width: props.def(--l-card-list--grid-md--col-width, props.get(core.$size--4600)) !default;
20$grid-sm--quiet--row-gap: props.def(--l-card-list--grid-sm--quiet--row-gap, props.get(core.$size--800)) !default;
21
12$masonry--row-gap: props.def(--l-card-list--masonry--row-gap, props.get(core.$size--400)) !default; 22$masonry--row-gap: props.def(--l-card-list--masonry--row-gap, props.get(core.$size--400)) !default;
13$masonry--col-gap: props.def(--l-card-list--masonry--col-gap, props.get(core.$size--400)) !default; 23$masonry--col-gap: props.def(--l-card-list--masonry--col-gap, props.get(core.$size--400)) !default;
14$masonry--col-width: props.def(--l-card-list--masonry--col-width, props.get(core.$size--3200)) !default; 24$masonry--col-width: props.def(--l-card-list--masonry--col-width, props.get(core.$size--3200)) !default;
@@ -19,4 +29,13 @@ $masonry-h--col-gap: props.def(--l-card-list--masonry-h--col-gap, props.g
19$masonry-h--row-height: props.def(--l-card-list--masonry-h--row-height, props.get(core.$size--3200)) !default; 29$masonry-h--row-height: props.def(--l-card-list--masonry-h--row-height, props.get(core.$size--3200)) !default;
20$masonry-h--quiet--row-gap: props.def(--l-card-list--masonry-h--quiet--row-gap, props.get(core.$size--800)) !default; 30$masonry-h--quiet--row-gap: props.def(--l-card-list--masonry-h--quiet--row-gap, props.get(core.$size--800)) !default;
21 31
22$border-color: props.def(--l-card-list--border-color, props.get(core.$theme, --border), 'color') !default; 32$shadow-x: props.def(--l-card-list--shadow-x, props.get(card.$shadow-x)) !default;
33$shadow-y: props.def(--l-card-list--shadow-y, props.get(card.$shadow-y)) !default;
34$shadow-blur: props.def(--l-card-list--shadow-blur, props.get(card.$shadow-blur)) !default;
35$shadow-grow: props.def(--l-card-list--shadow-grow, props.get(card.$shadow-grow)) !default;
36
37$card-bg-color: props.def(--l-card-list--bg-color, props.get(card.$bg-color), 'color') !default;
38$border-color: props.def(--l-card-list--border-color, props.get(card.$border-color), 'color') !default;
39$shadow-color: props.def(--l-card-list--shadow-color, props.get(card.$shadow-color), 'color') !default;
40
41$border-color-dark: props.def(--l-card-list--border-color, props.get(core.$theme, --bg-l1), 'dark') !default;
diff --git a/src/layouts/_container.scss b/src/layouts/_container.scss
index 17ab2f0..0ae68c1 100644
--- a/src/layouts/_container.scss
+++ b/src/layouts/_container.scss
@@ -7,22 +7,22 @@
7@use 'container.vars' as vars; 7@use 'container.vars' as vars;
8 8
9@mixin styles { 9@mixin styles {
10 @include materialize-at-root(meta.module-variables('vars')); 10 @include materialize-at-root(meta.module-variables('vars'));
11 11
12 @include bem.layout('container') { 12 @include bem.layout('container') {
13 @each $mod, $size in vars.$fixed-sizes { 13 @each $mod, $size in vars.$fixed-sizes {
14 @include bem.modifier($mod) { 14 @include bem.modifier($mod) {
15 max-inline-size: props.get($size); 15 max-inline-size: props.get($size);
16 margin-inline: auto; 16 margin-inline: auto;
17 } 17 }
18 } 18 }
19 19
20 @include bem.modifier('pad-i') { 20 @include bem.modifier('pad-i') {
21 padding-inline: props.get(vars.$pad-i); 21 padding-inline: props.get(vars.$pad-i);
22 } 22 }
23 23
24 @include bem.modifier('pad-b') { 24 @include bem.modifier('pad-b') {
25 padding-block: props.get(vars.$pad-b); 25 padding-block: props.get(vars.$pad-b);
26 } 26 }
27 } 27 }
28} 28}
diff --git a/src/layouts/_container.vars.scss b/src/layouts/_container.vars.scss
index cba7574..8f0cef6 100644
--- a/src/layouts/_container.vars.scss
+++ b/src/layouts/_container.vars.scss
@@ -2,14 +2,14 @@
2@use 'iro-sass/src/props'; 2@use 'iro-sass/src/props';
3@use '../core.vars' as core; 3@use '../core.vars' as core;
4 4
5$fixed-125: props.def(--l-container--fixed-125, fn.px-to-rem(720px)) !default; 5$fixed-200: props.def(--l-container--fixed-200, fn.px-to-rem(1300px)) !default;
6$fixed: props.def(--l-container--fixed, fn.px-to-rem(610px)) !default; 6$fixed-150: props.def(--l-container--fixed-150, fn.px-to-rem(860px)) !default;
7$fixed-75: props.def(--l-container--fixed-75, fn.px-to-rem(500px)) !default; 7$fixed: props.def(--l-container--fixed, fn.px-to-rem(680px)) !default;
8 8
9$fixed-sizes: ( 9$fixed-sizes: (
10 'fixed-125': $fixed-125, 10 'fixed-200': $fixed-200,
11 'fixed': $fixed, 11 'fixed-150': $fixed-150,
12 'fixed-75': $fixed-75 12 'fixed': $fixed
13) !default; 13) !default;
14 14
15$pad-i: props.def(--l-container--pad-i, props.get(core.$size--400)) !default; 15$pad-i: props.def(--l-container--pad-i, props.get(core.$size--400)) !default;
diff --git a/src/layouts/_flex.scss b/src/layouts/_flex.scss
index 902ecdb..c99b253 100644
--- a/src/layouts/_flex.scss
+++ b/src/layouts/_flex.scss
@@ -1,19 +1,19 @@
1@use 'iro-sass/src/bem'; 1@use 'iro-sass/src/bem';
2 2
3@mixin styles { 3@mixin styles {
4 @include bem.layout('flex') { 4 @include bem.layout('flex') {
5 display: flex; 5 display: flex;
6 6
7 @include bem.modifier('column') { 7 @include bem.modifier('column') {
8 flex-direction: column; 8 flex-direction: column;
9 } 9 }
10 10
11 @include bem.modifier('wrap') { 11 @include bem.modifier('wrap') {
12 flex-wrap: wrap; 12 flex-wrap: wrap;
13 } 13 }
14 14
15 @include bem.modifier('wrap-reverse') { 15 @include bem.modifier('wrap-reverse') {
16 flex-wrap: wrap-reverse; 16 flex-wrap: wrap-reverse;
17 } 17 }
18 } 18 }
19} 19}
diff --git a/src/layouts/_form.scss b/src/layouts/_form.scss
index 5f0567b..c804262 100644
--- a/src/layouts/_form.scss
+++ b/src/layouts/_form.scss
@@ -7,53 +7,53 @@
7@use 'form.vars' as vars; 7@use 'form.vars' as vars;
8 8
9@mixin styles { 9@mixin styles {
10 @include materialize-at-root(meta.module-variables('vars')); 10 @include materialize-at-root(meta.module-variables('vars'));
11 11
12 @include bem.layout('form') { 12 @include bem.layout('form') {
13 display: flex; 13 display: flex;
14 flex-direction: column; 14 flex-direction: column;
15 gap: props.get(vars.$item-spacing-b) props.get(vars.$label-spacing-i); 15 gap: props.get(vars.$item-spacing-b) props.get(vars.$label-spacing-i);
16 16
17 @include bem.elem('item') { 17 @include bem.elem('item') {
18 display: block; 18 display: block;
19 } 19 }
20 20
21 @include bem.elem('item-content') { 21 @include bem.elem('item-content') {
22 @include bem.modifier('align-start') { 22 @include bem.modifier('align-start') {
23 align-self: start; 23 align-self: start;
24 } 24 }
25 } 25 }
26 26
27 @include bem.modifier('row') { 27 @include bem.modifier('row') {
28 flex-direction: row; 28 flex-direction: row;
29 align-items: flex-end; 29 align-items: flex-end;
30 } 30 }
31 31
32 @include bem.modifier('labels-start', 'labels-end') { 32 @include bem.modifier('labels-start', 'labels-end') {
33 display: grid; 33 display: grid;
34 grid-template-rows: auto; 34 grid-template-rows: auto;
35 grid-template-columns: auto 1fr; 35 grid-template-columns: auto 1fr;
36 align-items: baseline; 36 align-items: baseline;
37 37
38 @include bem.elem('item') { 38 @include bem.elem('item') {
39 display: contents; 39 display: contents;
40 } 40 }
41 41
42 @include bem.elem('item-label') { 42 @include bem.elem('item-label') {
43 grid-column: 1; 43 grid-column: 1;
44 padding-inline-end: 0; 44 padding-inline-end: 0;
45 } 45 }
46 46
47 @include bem.elem('item-content') { 47 @include bem.elem('item-content') {
48 grid-column: 2; 48 grid-column: 2;
49 margin-block-start: 0; 49 margin-block-start: 0;
50 } 50 }
51 } 51 }
52 52
53 @include bem.modifier('labels-end') { 53 @include bem.modifier('labels-end') {
54 @include bem.elem('item-label') { 54 @include bem.elem('item-label') {
55 text-align: end; 55 text-align: end;
56 } 56 }
57 } 57 }
58 } 58 }
59} 59}
diff --git a/src/layouts/_media.scss b/src/layouts/_media.scss
index 2192db5..929e60f 100644
--- a/src/layouts/_media.scss
+++ b/src/layouts/_media.scss
@@ -7,35 +7,35 @@
7@use 'media.vars' as vars; 7@use 'media.vars' as vars;
8 8
9@mixin styles { 9@mixin styles {
10 @include materialize-at-root(meta.module-variables('vars')); 10 @include materialize-at-root(meta.module-variables('vars'));
11 11
12 @include bem.layout('media') { 12 @include bem.layout('media') {
13 display: flex; 13 display: flex;
14 gap: props.get(vars.$gap); 14 gap: props.get(vars.$gap);
15 align-items: center; 15 align-items: center;
16 line-height: 1.4; 16 line-height: 1.4;
17 17
18 @each $mod, $size in vars.$sizes { 18 @each $mod, $size in vars.$sizes {
19 @include bem.modifier($mod) { 19 @include bem.modifier($mod) {
20 gap: props.get($size); 20 gap: props.get($size);
21 } 21 }
22 } 22 }
23 23
24 @include bem.modifier('wrap') { 24 @include bem.modifier('wrap') {
25 flex-wrap: wrap; 25 flex-wrap: wrap;
26 } 26 }
27 27
28 @include bem.elem('block') { 28 @include bem.elem('block') {
29 flex: 0 0 auto; 29 flex: 0 0 auto;
30 30
31 @include bem.modifier('shrink', 'main') { 31 @include bem.modifier('shrink', 'main') {
32 flex-shrink: 1; 32 flex-shrink: 1;
33 min-inline-size: 0; 33 min-inline-size: 0;
34 } 34 }
35 35
36 @include bem.modifier('main') { 36 @include bem.modifier('main') {
37 inline-size: 100%; 37 inline-size: 100%;
38 } 38 }
39 } 39 }
40 } 40 }
41} 41}
diff --git a/src/layouts/_media.vars.scss b/src/layouts/_media.vars.scss
index fd6d986..dcb10de 100644
--- a/src/layouts/_media.vars.scss
+++ b/src/layouts/_media.vars.scss
@@ -9,8 +9,8 @@ $lg: props.def(--l-media--lg, props.get(core.$size--300)) !default;
9$xl: props.def(--l-media--xl, props.get(core.$size--450)) !default; 9$xl: props.def(--l-media--xl, props.get(core.$size--450)) !default;
10 10
11$sizes: ( 11$sizes: (
12 'gapless': $gapless, 12 'gapless': $gapless,
13 'sm': $sm, 13 'sm': $sm,
14 'lg': $lg, 14 'lg': $lg,
15 'xl': $xl, 15 'xl': $xl,
16) !default; 16) !default;
diff --git a/src/layouts/_overflow.scss b/src/layouts/_overflow.scss
index 9fba7eb..6d31d37 100644
--- a/src/layouts/_overflow.scss
+++ b/src/layouts/_overflow.scss
@@ -3,9 +3,9 @@
3@use '../core.vars' as core; 3@use '../core.vars' as core;
4 4
5@mixin styles { 5@mixin styles {
6 @include bem.layout('overflow') { 6 @include bem.layout('overflow') {
7 overflow: auto; 7 overflow: auto;
8 scrollbar-color: props.get(core.$theme, --text-disabled) transparent; 8 scrollbar-color: props.get(core.$theme, --text-disabled) transparent;
9 } 9 }
10} 10}
11 11
diff --git a/src/layouts/_split-view.scss b/src/layouts/_split-view.scss
index 2744510..6469a7d 100644
--- a/src/layouts/_split-view.scss
+++ b/src/layouts/_split-view.scss
@@ -8,69 +8,84 @@
8@use 'split-view.vars' as vars; 8@use 'split-view.vars' as vars;
9 9
10@mixin styles { 10@mixin styles {
11 @include materialize-at-root(meta.module-variables('vars')); 11 @include materialize-at-root(meta.module-variables('vars'));
12 12
13 @include bem.layout('split-view') { 13 @include bem.layout('split-view') {
14 display: flex; 14 display: flex;
15 gap: props.get(vars.$col-gap); 15 gap: props.get(vars.$col-gap);
16 align-items: start; 16 align-items: start;
17 17
18 @include bem.modifier('gapless') { 18 @include bem.elem('panel') {
19 gap: props.get(vars.$gapless); 19 flex: 1 1 auto;
20 } 20 inline-size: 100%;
21 min-inline-size: 0;
21 22
22 @include bem.elem('panel') { 23 @include bem.modifier('side-25') {
23 flex: 1 1 auto; 24 flex: 0 0 auto;
24 inline-size: 100%; 25 inline-size: 25%;
25 min-inline-size: 0; 26 min-inline-size: props.get(vars.$panel--side-25--min);
27 }
26 28
27 @include bem.modifier('side-25') { 29 @include bem.modifier('sticky-0') {
28 flex: 0 0 auto; 30 position: sticky;
29 inline-size: 25%; 31 inset-block-start: 0;
30 min-inline-size: props.get(vars.$panel--side-25--min); 32 }
31 }
32 33
33 @include bem.modifier('sticky-0') { 34 @include bem.modifier('sticky') {
34 position: sticky; 35 position: sticky;
35 inset-block-start: 0; 36 inset-block-start: props.get(vars.$panel--sticky-offset);
36 } 37 }
37 38
38 @include bem.modifier('sticky') { 39 @include bem.modifier('sticky-400') {
39 position: sticky; 40 position: sticky;
40 inset-block-start: props.get(vars.$panel--sticky-offset); 41 inset-block-start: calc(props.get(vars.$panel--sticky-400--inset) + props.get(vars.$panel--sticky-offset));
41 } 42 }
42 43
43 @include bem.modifier('sticky-400') { 44 @include bem.modifier('sticky-1200') {
44 position: sticky; 45 position: sticky;
45 inset-block-start: calc(props.get(vars.$panel--sticky-400--inset) + props.get(vars.$panel--sticky-offset)); 46 inset-block-start: calc(props.get(vars.$panel--sticky-1200--inset) + props.get(vars.$panel--sticky-offset));
46 } 47 }
47 } 48 }
48 49
49 @include bem.elem('content') { 50 @include bem.modifier('gapless') {
50 inline-size: 100%; 51 gap: props.get(vars.$gapless);
51 }
52 52
53 @include media.media('<=md') { 53 @include bem.elem('panel') {
54 flex-direction: column; 54 @include bem.modifier('side-25') {
55 gap: props.get(vars.$row-gap); 55 min-inline-size: calc(props.get(vars.$panel--side-25--min) + props.get(vars.$col-gap) - props.get(vars.$gapless));
56 align-items: stretch; 56 }
57 }
58 }
57 59
58 @include bem.modifier('wrap-reverse') { 60 @include bem.elem('content') {
59 flex-direction: column-reverse; 61 inline-size: 100%;
60 } 62 }
61 63
62 @include bem.elem('panel') { 64 @include media.media('<=md') {
63 flex: 1 1 auto; 65 flex-direction: column;
66 gap: props.get(vars.$row-gap);
67 align-items: stretch;
64 68
65 @include bem.modifier('side-25') { 69 @include bem.modifier('gapless') {
66 inline-size: auto; 70 gap: props.get(vars.$gapless);
67 min-inline-size: 0; 71 }
68 }
69 72
70 @include bem.modifier('sticky', 'sticky-400') { 73 @include bem.modifier('wrap-reverse') {
71 position: static; 74 flex-direction: column-reverse;
72 } 75 }
73 } 76
74 } 77 @include bem.elem('panel') {
75 } 78 inline-size: auto;
79
80 @include bem.modifier('side-25') {
81 inline-size: auto;
82 min-inline-size: 0;
83 }
84
85 @include bem.modifier('sticky', 'sticky-400', 'sticky-1200') {
86 position: static;
87 }
88 }
89 }
90 }
76} 91}
diff --git a/src/layouts/_split-view.vars.scss b/src/layouts/_split-view.vars.scss
index 01562e1..d519939 100644
--- a/src/layouts/_split-view.vars.scss
+++ b/src/layouts/_split-view.vars.scss
@@ -4,9 +4,10 @@
4$col-gap: props.def(--l-split-view--col-gap, props.get(core.$size--800)) !default; 4$col-gap: props.def(--l-split-view--col-gap, props.get(core.$size--800)) !default;
5$row-gap: props.def(--l-split-view--row-gap, props.get(core.$size--600)) !default; 5$row-gap: props.def(--l-split-view--row-gap, props.get(core.$size--600)) !default;
6 6
7$gapless: props.def(--l-split-view--gapless, 0) !default; 7$gapless: props.def(--l-split-view--gapless, 0rem) !default;
8 8
9$panel--side-25--min: props.def(--l-split-view--panel--side-25--min, props.get(core.$size--3200)) !default; 9$panel--side-25--min: props.def(--l-split-view--panel--side-25--min, props.get(core.$size--3200)) !default;
10$panel--sticky-400--inset: props.def(--l-split-view--panel--sticky-400--inset, props.get(core.$size--400)) !default; 10$panel--sticky-400--inset: props.def(--l-split-view--panel--sticky-400--inset, props.get(core.$size--400)) !default;
11$panel--sticky-1200--inset: props.def(--l-split-view--panel--sticky-1200--inset, props.get(core.$size--1200)) !default;
11 12
12$panel--sticky-offset: props.def(--l-split-view--panel--sticky-offset, props.get(core.$sticky-top-offset)) !default; 13$panel--sticky-offset: props.def(--l-split-view--panel--sticky-offset, props.get(core.$sticky-top-offset)) !default;
diff --git a/src/objects/_action-button.scss b/src/objects/_action-button.scss
deleted file mode 100644
index 1dd4b84..0000000
--- a/src/objects/_action-button.scss
+++ /dev/null
@@ -1,213 +0,0 @@
1@use 'sass:list';
2@use 'sass:map';
3@use 'sass:meta';
4@use 'sass:string';
5@use 'iro-sass/src/bem';
6@use 'iro-sass/src/props';
7@use '../props' as *;
8
9@forward 'action-button.vars';
10@use 'action-button.vars' as vars;
11
12@mixin -apply-theme($theme, $key: ()) {
13 color: props.get($theme, list.join($key, --disabled --label-color)...);
14 background-color: props.get($theme, list.join($key, --disabled --bg-color)...);
15 border-color: props.get($theme, list.join($key, --disabled --border-color)...);
16
17 &::after {
18 outline-color: props.get($theme, list.join($key, --key-focus --border-color)...);
19 box-shadow:
20 0
21 0
22 0
23 calc(props.get(vars.$key-focus--border-width) + props.get(vars.$key-focus--outline-width))
24 props.get($theme, list.join($key, --key-focus --outline-color)...);
25 }
26
27 &:link,
28 &:visited,
29 &:enabled {
30 color: props.get($theme, list.join($key, --label-color)...);
31 background-color: props.get($theme, list.join($key, --bg-color)...);
32 border-color: props.get($theme, list.join($key, --border-color)...);
33
34 &:hover,
35 &:focus-visible {
36 color: props.get($theme, list.join($key, --hover --label-color)...);
37 background-color: props.get($theme, list.join($key, --hover --bg-color)...);
38 border-color: props.get($theme, list.join($key, --hover --border-color)...);
39 }
40
41 &:active {
42 color: props.get($theme, list.join($key, --active --label-color)...);
43 background-color: props.get($theme, list.join($key, --active --bg-color)...);
44 border-color: props.get($theme, list.join($key, --active --border-color)...);
45 }
46 }
47
48 @include bem.modifier('quiet') {
49 color: props.get($theme, list.join($key, --quiet --disabled --label-color)...);
50 background-color: transparent;
51 border-color: transparent;
52
53 &:link,
54 &:visited,
55 &:enabled {
56 color: props.get($theme, list.join($key, --quiet --label-color)...);
57 background-color: transparent;
58 border-color: transparent;
59
60 &:hover,
61 &:focus-visible {
62 color: props.get($theme, list.join($key, --quiet --hover --label-color)...);
63 background-color: props.get($theme, list.join($key, --quiet --hover --bg-color)...);
64 border-color: transparent;
65 }
66
67 &:active {
68 color: props.get($theme, list.join($key, --quiet --active --label-color)...);
69 background-color: props.get($theme, list.join($key, --quiet --active --bg-color)...);
70 border-color: transparent;
71 }
72 }
73 }
74
75 @include bem.is('selected') {
76 color: props.get($theme, list.join($key, --selected --disabled --label-color)...);
77 background-color: props.get($theme, list.join($key, --selected --disabled --bg-color)...);
78 border-color: props.get($theme, list.join($key, --selected --disabled --border-color)...);
79
80 &:link,
81 &:visited,
82 &:enabled {
83 color: props.get($theme, list.join($key, --selected --label-color)...);
84 background-color: props.get($theme, list.join($key, --selected --bg-color)...);
85 border-color: props.get($theme, list.join($key, --selected --border-color)...);
86
87 &:hover,
88 &:focus-visible {
89 color: props.get($theme, list.join($key, --selected --hover --label-color)...);
90 background-color: props.get($theme, list.join($key, --selected --hover --bg-color)...);
91 border-color: props.get($theme, list.join($key, --selected --hover --border-color)...);
92 }
93
94 &:active {
95 color: props.get($theme, list.join($key, --selected --active --label-color)...);
96 background-color: props.get($theme, list.join($key, --selected --active --bg-color)...);
97 border-color: props.get($theme, list.join($key, --selected --active --border-color)...);
98 }
99 }
100 }
101}
102
103@mixin styles {
104 @include materialize-at-root(meta.module-variables('vars'));
105
106 @include bem.object('action-button') {
107 position: relative;
108 display: inline-block;
109 padding-block: props.get(vars.$pad-b);
110 padding-inline: props.get(vars.$pad-i);
111 line-height: props.get(vars.$line-height);
112 text-align: center;
113 text-decoration: none;
114 text-overflow: ellipsis;
115 white-space: nowrap;
116 border: props.get(vars.$border-width) solid transparent;
117 border-radius: props.get(vars.$rounding);
118
119 &::after {
120 position: absolute;
121 inset: calc(-1 * props.get(vars.$border-width) - props.get(vars.$key-focus--border-offset));
122 z-index: 1;
123 display: none;
124 pointer-events: none;
125 content: '';
126 border-radius: calc(props.get(vars.$rounding) + props.get(vars.$key-focus--border-offset));
127 outline: transparent solid props.get(vars.$key-focus--border-width);
128 }
129
130 &:link,
131 &:visited,
132 &:enabled {
133 &:focus-visible {
134 &::after {
135 display: block;
136 }
137 }
138 }
139
140 @include bem.elem('label') {
141 margin-inline: props.get(vars.$pad-i-label);
142 }
143
144 @include -apply-theme(vars.$default-theme);
145
146 @each $theme in map.keys(props.get(vars.$themes)) {
147 @include bem.modifier(string.slice($theme, 3)) {
148 @include -apply-theme(vars.$themes, $theme);
149 }
150 }
151
152 @include bem.modifier('pill') {
153 padding-inline: props.get(vars.$pad-i-pill);
154 border-radius: 100em;
155
156 &::after {
157 border-radius: 100em;
158 }
159 }
160
161 @include bem.modifier('icon') {
162 inline-size: calc(1em * props.get(vars.$line-height) + 2 * props.get(vars.$pad-b));
163 padding-inline: 0;
164 }
165
166 @each $mod, $pad-i, $pad-i-label, $pad-i-pill, $pad-b, $font-size in vars.$fixed-sizes {
167 @include bem.modifier($mod) {
168 padding-block: props.get($pad-b);
169 padding-inline: props.get($pad-i);
170 font-size: props.get($font-size);
171
172 @include bem.elem('label') {
173 margin-inline: props.get($pad-i-label);
174 }
175
176 @include bem.modifier('pill') {
177 padding-inline: props.get($pad-i-pill);
178 }
179
180 @include bem.modifier('icon') {
181 inline-size: calc(1em * props.get(vars.$line-height) + 2 * props.get($pad-b));
182 padding-inline: 0;
183 }
184 }
185 }
186
187 @include bem.modifier('align-block') {
188 margin-inline: calc(-1 * props.get(vars.$pad-i) - props.get(vars.$border-width));
189
190 @include bem.modifier('pill') {
191 margin-inline: calc(-1 * props.get(vars.$pad-i-pill) - props.get(vars.$border-width));
192 }
193
194 @include bem.modifier('icon') {
195 margin-inline: calc(-1 * props.get(vars.$pad-b) - props.get(vars.$border-width) - .5em * (props.get(vars.$line-height) - 1));
196 }
197
198 @each $mod, $pad-i, $pad-i-label, $pad-i-pill, $pad-b, $font-size in vars.$fixed-sizes {
199 @include bem.modifier($mod) {
200 margin-inline: calc(-1 * props.get($pad-i) - props.get(vars.$border-width));
201
202 @include bem.modifier('pill') {
203 margin-inline: calc(-1 * props.get($pad-i-pill) - props.get(vars.$border-width));
204 }
205
206 @include bem.modifier('icon') {
207 margin-inline: calc(-1 * props.get($pad-b) - props.get(vars.$border-width) - .5em * (props.get(vars.$line-height) - 1));
208 }
209 }
210 }
211 }
212 }
213}
diff --git a/src/objects/_action-button.vars.scss b/src/objects/_action-button.vars.scss
deleted file mode 100644
index 8c3d510..0000000
--- a/src/objects/_action-button.vars.scss
+++ /dev/null
@@ -1,193 +0,0 @@
1@use 'sass:map';
2@use 'sass:string';
3@use 'iro-sass/src/props';
4@use '../core.vars' as core;
5
6$line-height: props.def(--o-action-button--line-height, 1.4) !default;
7$pad-i: props.def(--o-action-button--pad-i, props.get(core.$size--150)) !default;
8$pad-i-label: props.def(--o-action-button--pad-i-label, props.get(core.$size--50)) !default;
9$pad-i-pill: props.def(--o-action-button--pad-i-pill, props.get(core.$size--200)) !default;
10$pad-b: props.def(--o-action-button--pad-b, props.get(core.$size--85)) !default;
11$border-width: props.def(--o-action-button--border-width, props.get(core.$border-width--thin)) !default;
12$rounding: props.def(--o-action-button--rounding, props.get(core.$rounding)) !default;
13$font-size: props.def(--o-action-button--font-size, props.get(core.$font-size--100)) !default;
14
15$pad-i--sm: props.def(--o-action-button--sm--pad-i, props.get(core.$size--100)) !default;
16$pad-i-label--sm: props.def(--o-action-button--sm--pad-i-label, props.get(core.$size--25)) !default;
17$pad-i-pill--sm: props.def(--o-action-button--sm--pad-i-pill, props.get(core.$size--150)) !default;
18$pad-b--sm: props.def(--o-action-button--sm--pad-b, props.get(core.$size--40)) !default;
19$font-size--sm: props.def(--o-action-button--sm--font-size, props.get(core.$font-size--75)) !default;
20
21$pad-i--lg: props.def(--o-action-button--lg--pad-i, props.get(core.$size--175)) !default;
22$pad-i-label--lg: props.def(--o-action-button--lg--pad-i-label, props.get(core.$size--100)) !default;
23$pad-i-pill--lg: props.def(--o-action-button--lg--pad-i-pill, props.get(core.$size--250)) !default;
24$pad-b--lg: props.def(--o-action-button--lg--pad-b, props.get(core.$size--115)) !default;
25$font-size--lg: props.def(--o-action-button--lg--font-size, props.get(core.$font-size--150)) !default;
26
27$pad-i--xl: props.def(--o-action-button--xl--pad-i, props.get(core.$size--225)) !default;
28$pad-i-label--xl: props.def(--o-action-button--xl--pad-i-label, props.get(core.$size--150)) !default;
29$pad-i-pill--xl: props.def(--o-action-button--xl--pad-i-pill, props.get(core.$size--300)) !default;
30$pad-b--xl: props.def(--o-action-button--xl--pad-b, props.get(core.$size--150)) !default;
31$font-size--xl: props.def(--o-action-button--xl--font-size, props.get(core.$font-size--200)) !default;
32
33$key-focus--border-width: props.def(--o-action-button--key-focus--border-width, props.get(core.$key-focus--border-width)) !default;
34$key-focus--border-offset: props.def(--o-action-button--key-focus--border-offset, props.get(core.$key-focus--border-offset)) !default;
35$key-focus--outline-width: props.def(--o-action-button--key-focus--outline-width, props.get(core.$key-focus--outline-width)) !default;
36
37$fixed-sizes: (
38 'sm' $pad-i--sm $pad-i-label--sm $pad-i-pill--sm $pad-b--sm $font-size--sm,
39 'lg' $pad-i--lg $pad-i-label--lg $pad-i-pill--lg $pad-b--lg $font-size--lg,
40 'xl' $pad-i--xl $pad-i-label--xl $pad-i-pill--xl $pad-b--xl $font-size--xl,
41) !default;
42
43$themes: props.def(--o-action-button, (), 'color');
44
45$default-theme-override: () !default;
46$default-theme: map.deep-merge((
47 --bg-color: props.get(core.$theme, --base, --75),
48 --label-color: props.get(core.$theme, --text),
49 --border-color: props.get(core.$theme, --border-strong),
50
51 --hover: (
52 --bg-color: props.get(core.$theme, --border-mute),
53 --label-color: props.get(core.$theme, --heading),
54 --border-color: props.get(core.$theme, --text-mute-more),
55 ),
56
57 --active: (
58 --bg-color: props.get(core.$theme, --border),
59 --label-color: props.get(core.$theme, --heading),
60 --border-color: props.get(core.$theme, --text-mute),
61 ),
62
63 --disabled: (
64 --bg-color: props.get(core.$theme, --bg-l1),
65 --label-color: props.get(core.$theme, --border-strong),
66 --border-color: props.get(core.$theme, --border),
67 ),
68
69 --key-focus: (
70 --border-color: props.get(core.$theme, --focus, --border),
71 --outline-color: props.get(core.$theme, --focus, --outline),
72 ),
73
74 --selected: (
75 --bg-color: props.get(core.$theme, --heading),
76 --label-color: props.get(core.$theme, --base, --50),
77 --border-color: props.get(core.$theme, --heading),
78
79 --hover: (
80 --bg-color: props.get(core.$theme, --text),
81 --label-color: props.get(core.$theme, --base, --50),
82 --border-color: props.get(core.$theme, --text),
83 ),
84
85 --active: (
86 --bg-color: props.get(core.$theme, --text-mute),
87 --label-color: props.get(core.$theme, --base, --50),
88 --border-color: props.get(core.$theme, --text-mute),
89 ),
90
91 --disabled: (
92 --bg-color: props.get(core.$theme, --border-mute),
93 --label-color: props.get(core.$theme, --border-strong),
94 --border-color: props.get(core.$theme, --border-mute),
95 ),
96 ),
97
98 --quiet: (
99 --label-color: props.get(core.$theme, --text),
100
101 --hover: (
102 --bg-color: props.get(core.$theme, --border-mute),
103 --label-color: props.get(core.$theme, --heading),
104 ),
105
106 --active: (
107 --bg-color: props.get(core.$theme, --border),
108 --label-color: props.get(core.$theme, --heading),
109 ),
110
111 --disabled: (
112 --label-color: props.get(core.$theme, --border-strong),
113 ),
114 ),
115), $default-theme-override) !default;
116$default-theme: props.def(--o-action-button, $default-theme, 'color');
117
118@each $theme in map.keys(props.get(core.$transparent-colors)) {
119 $button-theme: --static-#{string.slice($theme, 3)};
120
121 $themes: props.merge($themes, (
122 $button-theme: (
123 --bg-color: props.get(core.$transparent-colors, $theme, --100),
124 --label-color: props.get(core.$transparent-colors, $theme, --900),
125 --border-color: props.get(core.$transparent-colors, $theme, --400),
126
127 --hover: (
128 --bg-color: props.get(core.$transparent-colors, $theme, --300),
129 --label-color: props.get(core.$transparent-colors, $theme, --900),
130 --border-color: props.get(core.$transparent-colors, $theme, --500),
131 ),
132
133 --active: (
134 --bg-color: props.get(core.$transparent-colors, $theme, --400),
135 --label-color: props.get(core.$transparent-colors, $theme, --900),
136 --border-color: props.get(core.$transparent-colors, $theme, --600),
137 ),
138
139 --disabled: (
140 --bg-color: props.get(core.$transparent-colors, $theme, --100),
141 --label-color: props.get(core.$transparent-colors, $theme, --500),
142 --border-color: props.get(core.$transparent-colors, $theme, --300),
143 ),
144
145 --key-focus: (
146 --border-color: props.get(core.$transparent-colors, $theme, --900),
147 --outline-color: props.get(core.$transparent-colors, $theme, --300),
148 ),
149
150 --selected: (
151 --bg-color: props.get(core.$transparent-colors, $theme, --800),
152 --label-color: props.get(core.$transparent-colors, $theme, --text),
153 --border-color: props.get(core.$transparent-colors, $theme, --100),
154
155 --hover: (
156 --bg-color: props.get(core.$transparent-colors, $theme, --900),
157 --label-color: props.get(core.$transparent-colors, $theme, --text),
158 --border-color: props.get(core.$transparent-colors, $theme, --100),
159 ),
160
161 --active: (
162 --bg-color: props.get(core.$transparent-colors, $theme, --900),
163 --label-color: props.get(core.$transparent-colors, $theme, --text),
164 --border-color: props.get(core.$transparent-colors, $theme, --100),
165 ),
166
167 --disabled: (
168 --bg-color: props.get(core.$transparent-colors, $theme, --200),
169 --label-color: props.get(core.$transparent-colors, $theme, --500),
170 --border-color: props.get(core.$transparent-colors, $theme, --100),
171 ),
172 ),
173
174 --quiet: (
175 --label-color: props.get(core.$transparent-colors, $theme, --900),
176
177 --hover: (
178 --bg-color: props.get(core.$transparent-colors, $theme, --300),
179 --label-color: props.get(core.$transparent-colors, $theme, --900),
180 ),
181
182 --active: (
183 --bg-color: props.get(core.$transparent-colors, $theme, --400),
184 --label-color: props.get(core.$transparent-colors, $theme, --900),
185 ),
186
187 --disabled: (
188 --label-color: props.get(core.$transparent-colors, $theme, --500),
189 ),
190 ),
191 )
192 ));
193}
diff --git a/src/objects/_alert.scss b/src/objects/_alert.scss
index 825f7ce..697ac18 100644
--- a/src/objects/_alert.scss
+++ b/src/objects/_alert.scss
@@ -8,19 +8,33 @@
8@use 'alert.vars' as vars; 8@use 'alert.vars' as vars;
9 9
10@mixin styles { 10@mixin styles {
11 @include materialize-at-root(meta.module-variables('vars')); 11 @include materialize-at-root(meta.module-variables('vars'));
12 12
13 @include bem.object('alert') { 13 @include bem.object('alert') {
14 padding-block: props.get(vars.$pad-b); 14 padding-block: props.get(vars.$pad-b);
15 padding-inline: props.get(vars.$pad-i); 15 padding-inline: props.get(vars.$pad-i);
16 background-color: props.get(vars.$bg-color); 16 background-color: props.get(vars.$bg-color);
17 border: props.get(vars.$border-width) solid props.get(vars.$border-color); 17 border: props.get(vars.$border-width) solid transparent;
18 border-radius: props.get(vars.$rounding); 18 border-color: props.get(vars.$border-color);
19 border-radius: props.get(vars.$rounding);
20 box-shadow:
21 props.get(vars.$shadow-x)
22 props.get(vars.$shadow-y)
23 props.get(vars.$shadow-blur)
24 props.get(vars.$shadow-grow)
25 props.get(vars.$shadow-color);
19 26
20 @each $mod, $theme in vars.$themes-config { 27 @each $mod, $theme in vars.$themes-config {
21 @include bem.modifier($mod) { 28 @include bem.modifier($mod) {
22 border-color: props.get(vars.$themes, $theme, --border-color); 29 background-color: props.get(vars.$themes, $theme, --bg-color);
23 } 30 border-color: props.get(vars.$themes, $theme, --border-color);
24 } 31 box-shadow:
25 } 32 props.get(vars.$shadow-x)
33 props.get(vars.$shadow-y)
34 props.get(vars.$shadow-blur)
35 props.get(vars.$shadow-grow)
36 props.get(vars.$themes, $theme, --shadow-color);
37 }
38 }
39 }
26} 40}
diff --git a/src/objects/_alert.vars.scss b/src/objects/_alert.vars.scss
index 53c9e68..62d3414 100644
--- a/src/objects/_alert.vars.scss
+++ b/src/objects/_alert.vars.scss
@@ -6,22 +6,31 @@ $pad-i: props.def(--o-alert--pad-i, props.get(core.$size--250)) !default;
6$pad-b: props.def(--o-alert--pad-b, props.get(core.$size--200)) !default; 6$pad-b: props.def(--o-alert--pad-b, props.get(core.$size--200)) !default;
7$rounding: props.def(--o-alert--rounding, props.get(core.$rounding)) !default; 7$rounding: props.def(--o-alert--rounding, props.get(core.$rounding)) !default;
8 8
9$shadow-x: props.def(--o-alert--shadow-x, props.get(core.$shadow--l2--x)) !default;
10$shadow-y: props.def(--o-alert--shadow-y, props.get(core.$shadow--l2--y)) !default;
11$shadow-blur: props.def(--o-alert--shadow-blur, props.get(core.$shadow--l2--blur)) !default;
12$shadow-grow: props.def(--o-alert--shadow-grow, props.get(core.$shadow--l2--grow)) !default;
13
9$bg-color: props.def(--o-alert--bg-color, props.get(core.$theme, --bg-l2), 'color') !default; 14$bg-color: props.def(--o-alert--bg-color, props.get(core.$theme, --bg-l2), 'color') !default;
10$border-color: props.def(--o-alert--border-color, props.get(core.$theme, --text-mute-more), 'color') !default; 15$border-color: props.def(--o-alert--border-color, props.get(core.$theme, --text-mute-more) props.get(core.$theme, --text-mute-more) props.get(core.$theme, --text-mute), 'color') !default;
16
17$shadow-color: props.def(--o-alert--shadow-color, props.get(core.$transparent-colors, --black, --200), 'color') !default;
11 18
12$themes-config: ( 19$themes-config: (
13 accent: --accent, 20 accent: --accent,
14 positive: --positive, 21 positive: --positive,
15 negative: --negative, 22 negative: --negative,
16 warning: --warning, 23 warning: --warning,
17) !default; 24) !default;
18 25
19$themes: props.def(--o-alert, (), 'color'); 26$themes: props.def(--o-alert, (), 'color');
20 27
21@each $theme, $key in $themes-config { 28@each $theme, $key in $themes-config {
22 $themes: props.merge($themes, ( 29 $themes: props.merge($themes, (
23 $key: ( 30 $key: (
24 --border-color: props.get(core.$theme, $key, --700), 31 --bg-color: props.get(core.$theme, --bg-l2),
25 ) 32 --border-color: props.get(core.$theme, $key, --700) props.get(core.$theme, $key, --700) props.get(core.$theme, $key, --800),
26 )); 33 --shadow-color: props.get(core.$theme, $key, --200),
34 )
35 ));
27} 36}
diff --git a/src/objects/_avatar.scss b/src/objects/_avatar.scss
index fc4ffcd..9d51ffb 100644
--- a/src/objects/_avatar.scss
+++ b/src/objects/_avatar.scss
@@ -7,111 +7,120 @@
7@use 'avatar.vars' as vars; 7@use 'avatar.vars' as vars;
8 8
9@mixin status($indicator-size) { 9@mixin status($indicator-size) {
10 @include bem.elem('status') { 10 @include bem.elem('status') {
11 inline-size: props.get($indicator-size); 11 inline-size: props.get($indicator-size);
12 block-size: props.get($indicator-size); 12 block-size: props.get($indicator-size);
13 13
14 @include bem.next-elem('content') { 14 @include bem.sibling-elem('content') {
15 mask-image: radial-gradient(circle calc(.5 * props.get($indicator-size) + props.get(vars.$indicator-spacing)) at 15 mask-image: radial-gradient(circle calc(.5 * props.get($indicator-size) + props.get(vars.$indicator-spacing)) at
16 calc(100% - .5 * props.get($indicator-size)) 16 calc(100% - .5 * props.get($indicator-size))
17 calc(100% - .5 * props.get($indicator-size)), 17 calc(100% - .5 * props.get($indicator-size)),
18 transparent 95%, 18 transparent 95%,
19 #fff); 19 #fff);
20 } 20 }
21 } 21 }
22} 22}
23 23
24@mixin styles { 24@mixin styles {
25 @include materialize-at-root(meta.module-variables('vars')); 25 @include materialize-at-root(meta.module-variables('vars'));
26 26
27 @include bem.object('avatar') { 27 @include bem.object('avatar') {
28 position: relative; 28 position: relative;
29 display: inline-block; 29 display: inline-block;
30 font-size: props.get(vars.$font-size); 30 font-size: props.get(vars.$font-size);
31 font-style: normal; 31 font-style: normal;
32 vertical-align: .05em; 32 vertical-align: .05em;
33 border-radius: props.get(vars.$rounding); 33 border-radius: props.get(vars.$rounding);
34 34
35 &::after { 35 &::after {
36 position: absolute; 36 position: absolute;
37 inset: calc(-1 * props.get(vars.$key-focus--border-offset)); 37 inset: calc(-1 * props.get(vars.$key-focus--border-offset));
38 z-index: 1; 38 z-index: 1;
39 display: none; 39 display: none;
40 pointer-events: none; 40 pointer-events: none;
41 content: ''; 41 outline: props.get(vars.$key-focus--border-color) solid props.get(vars.$key-focus--border-width);
42 border: props.get(vars.$key-focus--border-offset) solid transparent; 42 content: '';
43 border-radius: props.get(vars.$rounding); 43 border: props.get(vars.$key-focus--border-offset) solid transparent;
44 outline: props.get(vars.$key-focus--border-color) solid props.get(vars.$key-focus--border-width); 44 border-radius: props.get(vars.$rounding);
45 box-shadow: 45 box-shadow:
46 0 46 0
47 0 47 0
48 0 48 0
49 calc(props.get(vars.$key-focus--border-width) + props.get(vars.$key-focus--outline-width)) 49 calc(props.get(vars.$key-focus--border-width) + props.get(vars.$key-focus--outline-width))
50 props.get(vars.$key-focus--outline-color); 50 props.get(vars.$key-focus--outline-color);
51 } 51 }
52 52
53 @include bem.elem('status') { 53 @include bem.elem('status') {
54 position: absolute; 54 position: absolute;
55 inset-block-end: 0; 55 inset-block-end: 0;
56 inset-inline-end: 0; 56 inset-inline-end: 0;
57 } 57 }
58 58
59 @include status(vars.$indicator-size); 59 @include status(vars.$indicator-size);
60 60
61 @include bem.elem('content') { 61 @include bem.elem('content') {
62 display: block; 62 display: block;
63 inline-size: props.get(vars.$size); 63 inline-size: props.get(vars.$size);
64 block-size: props.get(vars.$size); 64 block-size: props.get(vars.$size);
65 line-height: props.get(vars.$size); 65 line-height: props.get(vars.$size);
66 text-align: center; 66 text-align: center;
67 object-fit: cover; 67 object-fit: cover;
68 object-position: center center; 68 object-position: center center;
69 border-radius: props.get(vars.$rounding); 69 border-radius: props.get(vars.$rounding);
70 } 70 }
71 71
72 @include bem.modifier('circle') { 72 @include bem.modifier('circle') {
73 border-radius: 100%; 73 border-radius: 100%;
74 74
75 &::after { 75 &::after {
76 border-radius: 100%; 76 border-radius: 100%;
77 } 77 }
78 78
79 @include bem.elem('content') { 79 @include bem.elem('content') {
80 border-radius: 100%; 80 border-radius: 100%;
81 } 81 }
82 } 82 }
83 83
84 @include bem.modifier('placeholder') { 84 @include bem.modifier('placeholder') {
85 @include bem.elem('content') { 85 @include bem.elem('content') {
86 background-color: hsl(0, 0%, props.get(vars.$bg-color--l)); 86 background-color: hsl(0, 0%, props.get(vars.$bg-color--l));
87 } 87 }
88 } 88 }
89 89
90 @include bem.modifier('colored') { 90 @include bem.modifier('colored') {
91 @include bem.elem('content') { 91 @include bem.elem('content') {
92 color: #fff; 92 color: #fff;
93 background-color: hsl(props.get(vars.$bg-color--h), props.get(vars.$bg-color--s), props.get(vars.$bg-color--l)); 93 background-color: hsl(props.get(vars.$bg-color--h), props.get(vars.$bg-color--s), props.get(vars.$bg-color--l));
94 } 94 }
95 } 95 }
96 96
97 @each $mod, $size, $font-size, $indicator-size in vars.$sizes { 97 @include bem.modifier('colored-gradient') {
98 @include bem.modifier($mod) { 98 @include bem.elem('content') {
99 font-size: props.get($font-size); 99 color: #fff;
100 background: linear-gradient(props.get(vars.$bg-angle),
101 hsl(props.get(vars.$bg-color--h), props.get(vars.$bg-color--s), props.get(vars.$bg-color--l)),
102 hsl(props.get(vars.$bg-color-2--h), props.get(vars.$bg-color-2--s), props.get(vars.$bg-color-2--l)));
103 }
104 }
105
106 @each $mod, $size, $font-size, $indicator-size in vars.$sizes {
107 @include bem.modifier($mod) {
108 font-size: props.get($font-size);
100 109
101 @include status($indicator-size); 110 @include status($indicator-size);
102 111
103 @include bem.elem('content') { 112 @include bem.elem('content') {
104 inline-size: props.get($size); 113 inline-size: props.get($size);
105 block-size: props.get($size); 114 block-size: props.get($size);
106 line-height: props.get($size); 115 line-height: props.get($size);
107 } 116 }
108 } 117 }
109 } 118 }
110 119
111 &:focus-visible { 120 &:focus-visible {
112 &::after { 121 &::after {
113 display: block; 122 display: block;
114 } 123 }
115 } 124 }
116 } 125 }
117} 126}
diff --git a/src/objects/_avatar.vars.scss b/src/objects/_avatar.vars.scss
index 72fb397..2374f5a 100644
--- a/src/objects/_avatar.vars.scss
+++ b/src/objects/_avatar.vars.scss
@@ -39,14 +39,20 @@ $bg-color--h: props.def(--o-avatar--bg-color--h, 354, 'color') !default;
39$bg-color--s: props.def(--o-avatar--bg-color--s, 44%, 'color') !default; 39$bg-color--s: props.def(--o-avatar--bg-color--s, 44%, 'color') !default;
40$bg-color--l: props.def(--o-avatar--bg-color--l, 45%, 'color') !default; 40$bg-color--l: props.def(--o-avatar--bg-color--l, 45%, 'color') !default;
41 41
42$bg-color-2--h: props.def(--o-avatar--bg-color-2--h, 354, 'color') !default;
43$bg-color-2--s: props.def(--o-avatar--bg-color-2--s, 44%, 'color') !default;
44$bg-color-2--l: props.def(--o-avatar--bg-color-2--l, 45%, 'color') !default;
45
46$bg-angle: props.def(--o-avatar--bg-angle, 180deg) !default;
47
42$key-focus--border-color: props.def(--o-avatar--key-focus--border-color, props.get(core.$theme, --focus, --border), 'color') !default; 48$key-focus--border-color: props.def(--o-avatar--key-focus--border-color, props.get(core.$theme, --focus, --border), 'color') !default;
43$key-focus--outline-color: props.def(--o-avatar--key-focus--outline-color, props.get(core.$theme, --focus, --outline), 'color') !default; 49$key-focus--outline-color: props.def(--o-avatar--key-focus--outline-color, props.get(core.$theme, --focus, --outline), 'color') !default;
44 50
45$sizes: ( 51$sizes: (
46 'xs' $size--xs $font-size--xs $indicator-size--xs, 52 'xs' $size--xs $font-size--xs $indicator-size--xs,
47 'sm' $size--sm $font-size--sm $indicator-size--sm, 53 'sm' $size--sm $font-size--sm $indicator-size--sm,
48 'lg' $size--lg $font-size--lg $indicator-size--lg, 54 'lg' $size--lg $font-size--lg $indicator-size--lg,
49 'xl' $size--xl $font-size--xl $indicator-size--xl, 55 'xl' $size--xl $font-size--xl $indicator-size--xl,
50 'xxl' $size--xxl $font-size--xxl $indicator-size--xxl, 56 'xxl' $size--xxl $font-size--xxl $indicator-size--xxl,
51 'xxxl' $size--xxxl $font-size--xxxl $indicator-size--xxxl, 57 'xxxl' $size--xxxl $font-size--xxxl $indicator-size--xxxl,
52) !default; 58) !default;
diff --git a/src/objects/_backdrop.scss b/src/objects/_backdrop.scss
index 9cc9e2e..346cf5f 100644
--- a/src/objects/_backdrop.scss
+++ b/src/objects/_backdrop.scss
@@ -7,17 +7,17 @@
7@use 'backdrop.vars' as vars; 7@use 'backdrop.vars' as vars;
8 8
9@mixin styles { 9@mixin styles {
10 @include materialize-at-root(meta.module-variables('vars')); 10 @include materialize-at-root(meta.module-variables('vars'));
11 11
12 @include bem.object('backdrop') { 12 @include bem.object('backdrop') {
13 position: fixed; 13 position: fixed;
14 inset: 0; 14 inset: 0;
15 z-index: props.get(vars.$z-index); 15 z-index: props.get(vars.$z-index);
16 box-sizing: border-box; 16 box-sizing: border-box;
17 display: flex; 17 display: flex;
18 flex-direction: column; 18 flex-direction: column;
19 overflow: auto; 19 overflow: auto;
20 background-color: props.get(vars.$bg-color); 20 background-color: props.get(vars.$bg-color);
21 backdrop-filter: blur(props.get(vars.$blur)); 21 backdrop-filter: blur(props.get(vars.$blur));
22 } 22 }
23} 23}
diff --git a/src/objects/_badge.scss b/src/objects/_badge.scss
deleted file mode 100644
index 9f3e307..0000000
--- a/src/objects/_badge.scss
+++ /dev/null
@@ -1,144 +0,0 @@
1@use 'sass:list';
2@use 'sass:map';
3@use 'sass:meta';
4@use 'sass:string';
5@use 'iro-sass/src/bem';
6@use 'iro-sass/src/props';
7@use '../props' as *;
8@use '../core.vars' as core;
9
10@forward 'badge.vars';
11@use 'badge.vars' as vars;
12
13@mixin -apply-theme($theme, $key: (), $static: false) {
14 color: props.get($theme, list.join($key, --label)...);
15 background-color: props.get($theme, list.join($key, --bg)...);
16
17 &:link,
18 &:visited,
19 &:enabled {
20 &:hover,
21 &:focus-visible {
22 color: props.get($theme, list.join($key, --hover --label)...);
23 background-color: props.get($theme, list.join($key, --hover --bg)...);
24 }
25
26 &:active {
27 color: props.get($theme, list.join($key, --active --label)...);
28 background-color: props.get($theme, list.join($key, --active --bg)...);
29 }
30 }
31
32 @include bem.modifier('quiet') {
33 color: props.get($theme, list.join($key, --quiet --label)...);
34 background-color: props.get($theme, list.join($key, --quiet --bg)...);
35
36 &:link,
37 &:visited,
38 &:enabled {
39 &:hover,
40 &:focus-visible {
41 color: props.get($theme, list.join($key, --quiet --hover --label)...);
42 background-color: props.get($theme, list.join($key, --quiet --hover --bg)...);
43 }
44
45 &:active {
46 color: props.get($theme, list.join($key, --quiet --active --label)...);
47 background-color: props.get($theme, list.join($key, --quiet --active --bg)...);
48 }
49 }
50 }
51
52 @if $static {
53 &::after {
54 outline-color: props.get($theme, list.join($key, --key-focus --border)...);
55 box-shadow:
56 0
57 0
58 0
59 calc(props.get(vars.$key-focus--border-width) + props.get(vars.$key-focus--outline-width))
60 props.get($theme, list.join($key, --key-focus --outline)...);
61 }
62 }
63}
64
65@mixin styles {
66 @include materialize-at-root(meta.module-variables('vars'));
67
68 @include bem.object('badge') {
69 position: relative;
70 display: inline-block;
71 padding-block: props.get(vars.$pad-b);
72 padding-inline: props.get(vars.$pad-i);
73 font-size: props.get(vars.$font-size);
74 line-height: props.get(core.$font--standard--line-height);
75 text-align: center;
76 text-decoration: none;
77 background-clip: padding-box;
78 border-radius: props.get(vars.$rounding);
79
80 &::after {
81 position: absolute;
82 inset: calc(-1 * props.get(vars.$key-focus--border-offset));
83 z-index: 1;
84 display: none;
85 pointer-events: none;
86 content: '';
87 border-radius: calc(props.get(vars.$rounding) + props.get(vars.$key-focus--border-offset));
88 outline: transparent solid props.get(vars.$key-focus--border-width);
89 }
90
91 &:link,
92 &:visited,
93 &:enabled {
94 &:focus-visible {
95 &::after {
96 display: block;
97 }
98 }
99 }
100
101 @include bem.elem('label') {
102 margin-inline: props.get(vars.$pad-i-label);
103 }
104
105 @include -apply-theme(vars.$default-theme, $static: true);
106
107 @each $theme in map.keys(props.get(vars.$themes)) {
108 @include bem.modifier(string.slice($theme, 3)) {
109 @include -apply-theme(vars.$themes, $theme);
110 }
111 }
112
113 @each $theme in map.keys(props.get(vars.$static-themes)) {
114 @include bem.modifier(string.slice($theme, 3)) {
115 @include -apply-theme(vars.$static-themes, $theme, true);
116 }
117 }
118
119 @include bem.modifier('pill') {
120 padding-inline: props.get(vars.$pad-i-pill);
121 border-radius: 10em;
122
123 &::after {
124 border-radius: 10em;
125 }
126 }
127
128 @each $mod, $pad-b, $pad-i, $pad-i-pill, $pad-i-label, $font-size in vars.$sizes {
129 @include bem.modifier($mod) {
130 padding-block: props.get($pad-b);
131 padding-inline: props.get($pad-i);
132 font-size: props.get($font-size);
133
134 @include bem.elem('label') {
135 margin-inline: props.get($pad-i-label);
136 }
137
138 @include bem.modifier('pill') {
139 padding-inline: props.get($pad-i-pill);
140 }
141 }
142 }
143 }
144}
diff --git a/src/objects/_badge.vars.scss b/src/objects/_badge.vars.scss
deleted file mode 100644
index 6327e7b..0000000
--- a/src/objects/_badge.vars.scss
+++ /dev/null
@@ -1,161 +0,0 @@
1@use 'sass:map';
2@use 'sass:string';
3@use 'iro-sass/src/props';
4@use '../core.vars' as core;
5
6$pad-b: props.def(--o-badge--pad-b, props.get(core.$size--50)) !default;
7$pad-i: props.def(--o-badge--pad-i, props.get(core.$size--100)) !default;
8$pad-i-pill: props.def(--o-badge--pad-i-pill, props.get(core.$size--150)) !default;
9$pad-i-label: props.def(--o-badge--pad-i-label, props.get(core.$size--50)) !default;
10$rounding: props.def(--o-badge--rounding, props.get(core.$rounding)) !default;
11$font-size: props.def(--o-badge--font-size, props.get(core.$font-size--75)) !default;
12
13$pad-b--sm: props.def(--o-badge--sm--pad-b, props.get(core.$size--25)) !default;
14$pad-i--sm: props.def(--o-badge--sm--pad-i, props.get(core.$size--75)) !default;
15$pad-i-pill--sm: props.def(--o-badge--sm--pad-i-pill, props.get(core.$size--125)) !default;
16$pad-i-label--sm: props.def(--o-badge--sm--pad-i-label, props.get(core.$size--25)) !default;
17$font-size--sm: props.def(--o-badge--sm--font-size, props.get(core.$font-size--50)) !default;
18
19$pad-b--lg: props.def(--o-badge--lg--pad-b, props.get(core.$size--75)) !default;
20$pad-i--lg: props.def(--o-badge--lg--pad-i, props.get(core.$size--125)) !default;
21$pad-i-pill--lg: props.def(--o-badge--lg--pad-i-pill, props.get(core.$size--175)) !default;
22$pad-i-label--lg: props.def(--o-badge--lg--pad-i-label, props.get(core.$size--50)) !default;
23$font-size--lg: props.def(--o-badge--lg--font-size, props.get(core.$font-size--100)) !default;
24
25$pad-b--xl: props.def(--o-badge--xl--pad-b, props.get(core.$size--100)) !default;
26$pad-i--xl: props.def(--o-badge--xl--pad-i, props.get(core.$size--150)) !default;
27$pad-i-pill--xl: props.def(--o-badge--xl--pad-i-pill, props.get(core.$size--225)) !default;
28$pad-i-label--xl: props.def(--o-badge--xl--pad-i-label, props.get(core.$size--75)) !default;
29$font-size--xl: props.def(--o-badge--xl--font-size, props.get(core.$font-size--150)) !default;
30
31$key-focus--border-width: props.def(--o-badge--key-focus--border-width, props.get(core.$key-focus--border-width)) !default;
32$key-focus--border-offset: props.def(--o-badge--key-focus--border-offset, props.get(core.$key-focus--border-offset)) !default;
33$key-focus--outline-width: props.def(--o-badge--key-focus--outline-width, props.get(core.$key-focus--outline-width)) !default;
34
35$sizes: (
36 'sm' $pad-b--sm $pad-i--sm $pad-i-pill--sm $pad-i-label--sm $font-size--sm,
37 'lg' $pad-b--lg $pad-i--lg $pad-i-pill--lg $pad-i-label--lg $font-size--lg,
38 'xl' $pad-b--xl $pad-i--xl $pad-i-pill--xl $pad-i-label--xl $font-size--xl,
39) !default;
40
41$default-theme-override: () !default;
42$default-theme: props.def(--o-badge, (
43 --bg: props.get(core.$theme, --heading),
44 --label: props.get(core.$theme, --bg-l2),
45
46 --hover: (
47 --bg: props.get(core.$theme, --text),
48 --label: props.get(core.$theme, --bg-l2),
49 ),
50
51 --active: (
52 --bg: props.get(core.$theme, --text-mute),
53 --label: props.get(core.$theme, --bg-l2),
54 ),
55
56 --key-focus: (
57 --label: props.get(core.$theme, --focus, --text),
58 --border: props.get(core.$theme, --focus, --border),
59 --outline: props.get(core.$theme, --focus, --outline),
60 ),
61
62 --quiet: (
63 --bg: props.get(core.$theme, --border-mute),
64 --label: props.get(core.$theme, --heading),
65
66 --hover: (
67 --bg: props.get(core.$theme, --border),
68 --label: props.get(core.$theme, --heading),
69 ),
70
71 --active: (
72 --bg: props.get(core.$theme, --border-strong),
73 --label: props.get(core.$theme, --heading),
74 ),
75 )
76), 'color');
77$default-theme: props.merge($default-theme, $default-theme-override);
78
79$static-themes: props.def(--o-badge, (), 'color');
80
81@each $theme in map.keys(props.get(core.$transparent-colors)) {
82 $badge-theme: --static-#{string.slice($theme, 3)};
83
84 $static-themes: props.merge($static-themes, (
85 $badge-theme: (
86 --bg: props.get(core.$transparent-colors, $theme, --800),
87 --label: props.get(core.$transparent-colors, $theme, --text),
88
89 --hover: (
90 --bg: props.get(core.$transparent-colors, $theme, --900),
91 --label: props.get(core.$transparent-colors, $theme, --text),
92 ),
93
94 --active: (
95 --bg: props.get(core.$transparent-colors, $theme, --900),
96 --label: props.get(core.$transparent-colors, $theme, --text),
97 ),
98
99 --key-focus: (
100 --bg: props.get(core.$transparent-colors, $theme, --100),
101 --label: props.get(core.$transparent-colors, $theme, --900),
102 --border: props.get(core.$transparent-colors, $theme, --900),
103 --outline: props.get(core.$transparent-colors, $theme, --300),
104 ),
105
106 --quiet: (
107 --bg: props.get(core.$transparent-colors, $theme, --200),
108 --label: props.get(core.$transparent-colors, $theme, --900),
109 --hover: (
110 --bg: props.get(core.$transparent-colors, $theme, --300),
111 --label: props.get(core.$transparent-colors, $theme, --900),
112 ),
113 --active: (
114 --bg: props.get(core.$transparent-colors, $theme, --400),
115 --label: props.get(core.$transparent-colors, $theme, --900),
116 ),
117 )
118 )
119 ));
120}
121
122$themes-config: (
123 accent: --accent,
124 positive: --positive,
125 negative: --negative,
126 warning: --warning,
127) !default;
128
129$themes: props.def(--o-badge, (), 'color');
130
131@each $theme, $key in $themes-config {
132 $themes: props.merge($themes, (
133 --#{$theme}: (
134 --bg: props.get(core.$theme, #{$key}-static, --900),
135 --label: props.get(core.$theme, #{$key}-static, --900-text),
136
137 --hover: (
138 --bg: props.get(core.$theme, #{$key}-static, --1000),
139 --label: props.get(core.$theme, #{$key}-static, --1000-text),
140 ),
141
142 --active: (
143 --bg: props.get(core.$theme, #{$key}-static, --1100),
144 --label: props.get(core.$theme, #{$key}-static, --1000-text),
145 ),
146
147 --quiet: (
148 --bg: props.get(core.$theme, $key, --200),
149 --label: props.get(core.$theme, $key, --1100),
150 --hover: (
151 --bg: props.get(core.$theme, $key, --300),
152 --label: props.get(core.$theme, $key, --1200),
153 ),
154 --active: (
155 --bg: props.get(core.$theme, $key, --400),
156 --label: props.get(core.$theme, $key, --1300),
157 ),
158 )
159 )
160 ));
161}
diff --git a/src/objects/_button.scss b/src/objects/_button.scss
index aaf55b5..8163cf9 100644
--- a/src/objects/_button.scss
+++ b/src/objects/_button.scss
@@ -5,154 +5,281 @@
5@use 'iro-sass/src/bem'; 5@use 'iro-sass/src/bem';
6@use 'iro-sass/src/props'; 6@use 'iro-sass/src/props';
7@use '../props' as *; 7@use '../props' as *;
8@use '../core.vars' as core;
9 8
10@forward 'button.vars'; 9@forward 'button.vars';
11@use 'button.vars' as vars; 10@use 'button.vars' as vars;
12 11
13@mixin -apply-theme($theme, $key: ()) { 12@mixin -apply-theme($theme, $key: ()) {
14 &:link, 13 color: props.get($theme, list.join($key, --disabled --label-color)...);
15 &:visited, 14 background-color: props.get($theme, list.join($key, --disabled --bg-color)...);
16 &:enabled { 15 border-color: props.get($theme, list.join($key, --disabled --border-color)...);
17 color: props.get($theme, list.join($key, --label)...);
18 background-color: props.get($theme, list.join($key, --bg)...);
19 border-color: transparent;
20 }
21
22 @include bem.modifier('outline') {
23 &:link,
24 &:visited,
25 &:enabled {
26 color: props.get($theme, list.join($key, --outline-label)...);
27 background-color: transparent;
28 border-color: props.get($theme, list.join($key, --outline-border)...);
29 }
30 }
31 16
32 &:link, 17 &::after {
33 &:visited, 18 outline-color: props.get($theme, list.join($key, --key-focus --border-color)...);
34 &:enabled { 19 box-shadow:
35 &:hover, 20 0
36 &:focus-visible { 21 0
37 color: props.get($theme, list.join($key, --hover --label)...); 22 0
38 background-color: props.get($theme, list.join($key, --hover --bg)...); 23 calc(props.get(vars.$key-focus--border-width) + props.get(vars.$key-focus--outline-width))
39 border-color: transparent; 24 props.get($theme, list.join($key, --key-focus --outline-color)...);
40 } 25 }
41 26
42 &:active { 27 &:link,
43 color: props.get($theme, list.join($key, --active --label)...); 28 &:visited,
44 background-color: props.get($theme, list.join($key, --active --bg)...); 29 &:enabled {
45 border-color: transparent; 30 color: props.get($theme, list.join($key, --label-color)...);
46 } 31 background-color: props.get($theme, list.join($key, --bg-color)...);
47 } 32 border-color: props.get($theme, list.join($key, --border-color)...);
48} 33 box-shadow:
34 props.get(vars.$shadow-x)
35 props.get(vars.$shadow-y)
36 props.get(vars.$shadow-blur)
37 props.get(vars.$shadow-grow)
38 props.get($theme, list.join($key, --shadow-color)...);
39
40 &:hover,
41 &:focus-visible {
42 color: props.get($theme, list.join($key, --hover --label-color)...);
43 background-color: props.get($theme, list.join($key, --hover --bg-color)...);
44 border-color: props.get($theme, list.join($key, --hover --border-color)...);
45 }
49 46
50@mixin -apply-static-theme($theme, $key: ()) { 47 &:active {
51 color: props.get($theme, list.join($key, --disabled --label)...); 48 color: props.get($theme, list.join($key, --active --label-color)...);
52 background-color: props.get($theme, list.join($key, --disabled --bg)...); 49 background-color: props.get($theme, list.join($key, --active --bg-color)...);
53 border-color: transparent; 50 border-color: props.get($theme, list.join($key, --active --border-color)...);
51 box-shadow: none;
52 }
53 }
54 54
55 &::after { 55 @include bem.modifier('badge') {
56 outline-color: props.get($theme, list.join($key, --key-focus --border)...); 56 color: props.get($theme, list.join($key, --badge --label-color)...);
57 box-shadow: 57 background-color: props.get($theme, list.join($key, --badge --bg-color)...);
58 0 58 border-color: props.get($theme, list.join($key, --badge --border-color)...);
59 0 59 box-shadow: none;
60 0 60
61 calc(props.get(vars.$key-focus--border-width) + props.get(vars.$key-focus--outline-width)) 61 &:link,
62 props.get($theme, list.join($key, --key-focus --outline)...); 62 &:visited,
63 } 63 &:enabled {
64 64 color: props.get($theme, list.join($key, --badge --label-color)...);
65 @include bem.modifier('outline') { 65 background-color: props.get($theme, list.join($key, --badge --bg-color)...);
66 background-color: transparent; 66 border-color: props.get($theme, list.join($key, --badge --border-color)...);
67 border-color: props.get($theme, list.join($key, --disabled --outline-border)...); 67 box-shadow: none;
68 } 68
69 &:hover,
70 &:focus-visible {
71 color: props.get($theme, list.join($key, --badge --hover --label-color)...);
72 background-color: props.get($theme, list.join($key, --badge --hover --bg-color)...);
73 border-color: props.get($theme, list.join($key, --badge --hover --border-color)...);
74 }
75
76 &:active {
77 color: props.get($theme, list.join($key, --badge --active --label-color)...);
78 background-color: props.get($theme, list.join($key, --badge --active --bg-color)...);
79 border-color: props.get($theme, list.join($key, --badge --active --border-color)...);
80 }
81 }
82 }
83
84 @include bem.modifier('quiet') {
85 color: props.get($theme, list.join($key, --quiet --disabled --label-color)...);
86 background-color: transparent;
87 border-color: transparent;
88
89 &:link,
90 &:visited,
91 &:enabled {
92 color: props.get($theme, list.join($key, --quiet --label-color)...);
93 background-color: transparent;
94 border-color: transparent;
95 box-shadow: none;
96
97 &:hover,
98 &:focus-visible {
99 color: props.get($theme, list.join($key, --quiet --hover --label-color)...);
100 background-color: props.get($theme, list.join($key, --quiet --hover --bg-color)...);
101 border-color: transparent;
102 }
103
104 &:active {
105 color: props.get($theme, list.join($key, --quiet --active --label-color)...);
106 background-color: props.get($theme, list.join($key, --quiet --active --bg-color)...);
107 border-color: transparent;
108 }
109 }
110 }
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
141 @include bem.is('selected') {
142 color: props.get($theme, list.join($key, --selected --disabled --label-color)...);
143 background-color: props.get($theme, list.join($key, --selected --disabled --bg-color)...);
144 border-color: props.get($theme, list.join($key, --selected --disabled --border-color)...);
69 145
70 @include -apply-theme($theme, $key); 146 @include bem.multi('&:link, &:visited, &:enabled', 'modifier' 'badge') {
147 color: props.get($theme, list.join($key, --selected --label-color)...);
148 background-color: props.get($theme, list.join($key, --selected --bg-color)...);
149 border-color: props.get($theme, list.join($key, --selected --border-color)...);
150 }
71 151
72 @include bem.modifier('primary') { 152 &:link,
73 @include -apply-theme($theme, list.join($key, --primary)); 153 &:visited,
74 } 154 &:enabled {
155 &:hover,
156 &:focus-visible {
157 color: props.get($theme, list.join($key, --selected --hover --label-color)...);
158 background-color: props.get($theme, list.join($key, --selected --hover --bg-color)...);
159 border-color: props.get($theme, list.join($key, --selected --hover --border-color)...);
160 }
161
162 &:active {
163 color: props.get($theme, list.join($key, --selected --active --label-color)...);
164 background-color: props.get($theme, list.join($key, --selected --active --bg-color)...);
165 border-color: props.get($theme, list.join($key, --selected --active --border-color)...);
166 }
167 }
168 }
75} 169}
76 170
77@mixin styles { 171@mixin styles {
78 @include materialize-at-root(meta.module-variables('vars')); 172 @include materialize-at-root(meta.module-variables('vars'));
79 173
80 @include bem.object('button') { 174 @include bem.object('button') {
81 position: relative; 175 position: relative;
82 display: inline-block; 176 display: inline-block;
83 padding-block: props.get(vars.$pad-b); 177 padding-block: props.get(vars.$pad-b);
84 padding-inline: props.get(vars.$pad-i); 178 padding-inline: props.get(vars.$pad-i);
85 font-size: props.get(vars.$font-size); 179 text-overflow: ellipsis;
86 font-weight: 500; 180 font-size: props.get(vars.$font-size);
87 line-height: props.get(vars.$line-height); 181 line-height: props.get(vars.$line-height);
88 text-align: center; 182 text-align: center;
89 text-decoration: none; 183 white-space: nowrap;
90 border: props.get(vars.$border-width) solid transparent; 184 text-decoration: none;
91 border-radius: props.get(vars.$rounding); 185 border: props.get(vars.$border-width) solid transparent;
186 border-radius: props.get(vars.$rounding);
187 transition: color .1s, background-color .1s, border-color .1s, box-shadow .1s;
92 188
93 &::after { 189 &::after {
94 position: absolute; 190 position: absolute;
95 inset: calc(-1 * props.get(vars.$border-width) - props.get(vars.$key-focus--border-offset)); 191 inset: calc(-1 * props.get(vars.$border-width) - props.get(vars.$key-focus--border-offset));
96 z-index: 1; 192 z-index: 1;
97 display: none; 193 display: none;
98 pointer-events: none; 194 pointer-events: none;
99 content: ''; 195 outline: transparent solid props.get(vars.$key-focus--border-width);
100 border-radius: calc(props.get(vars.$rounding) + props.get(vars.$key-focus--border-offset)); 196 content: '';
101 outline: transparent solid props.get(vars.$key-focus--border-width); 197 border-radius: calc(props.get(vars.$rounding) + props.get(vars.$key-focus--border-offset));
102 } 198 }
103 199
104 &:link, 200 &:link,
105 &:visited, 201 &:visited,
106 &:enabled { 202 &:enabled {
107 &:focus-visible { 203 &:focus-visible {
108 &::after { 204 transition: none;
109 display: block;
110 }
111 }
112 }
113 205
114 @include bem.elem('label') { 206 &::after {
115 margin-inline: props.get(vars.$pad-i-label); 207 display: block;
116 } 208 }
117 209 }
118 @include bem.modifier('block') { 210 }
119 display: block; 211
120 } 212 @include bem.elem('label') {
121 213 margin-inline: props.get(vars.$pad-i-label);
122 @include bem.modifier('outline') { 214 }
123 background-color: transparent; 215
124 } 216 @include -apply-theme(vars.$default-theme);
217
218 @each $theme in map.keys(props.get(vars.$themes)) {
219 @include bem.modifier(string.slice($theme, 3)) {
220 @include -apply-theme(vars.$themes, $theme);
221 }
222 }
223
224 @include bem.modifier('pill') {
225 padding-inline: props.get(vars.$pad-i-pill);
226 border-radius: 100em;
125 227
126 @each $mod, $pad-i, $pad-i-label, $pad-b, $font-size in vars.$sizes { 228 &::after {
127 @include bem.modifier($mod) { 229 border-radius: 100em;
128 padding-block: props.get($pad-b); 230 }
129 padding-inline: props.get($pad-i); 231 }
130 font-size: props.get($font-size);
131 232
132 @include bem.elem('label') { 233 @include bem.modifier('icon') {
133 margin-inline: props.get($pad-i-label); 234 inline-size: calc(1em * props.get(vars.$line-height) + 2 * props.get(vars.$pad-b));
134 } 235 padding-inline: 0;
135 } 236 }
136 }
137 237
138 @include -apply-static-theme(vars.$default-theme); 238 @each $mod, $pad-i, $pad-i-label, $pad-i-pill, $pad-b, $font-size in vars.$fixed-sizes {
239 @include bem.modifier($mod) {
240 padding-block: props.get($pad-b);
241 padding-inline: props.get($pad-i);
242 font-size: props.get($font-size);
139 243
140 @each $theme in map.keys(props.get(vars.$themes)) { 244 @include bem.elem('label') {
141 @include bem.modifier(string.slice($theme, 3)) { 245 margin-inline: props.get($pad-i-label);
142 @include -apply-theme(vars.$themes, $theme); 246 }
143 }
144 }
145 247
146 @each $theme in map.keys(props.get(vars.$static-themes)) { 248 @include bem.modifier('pill') {
147 @include bem.modifier(string.slice($theme, 3)) { 249 padding-inline: props.get($pad-i-pill);
148 @include -apply-static-theme(vars.$static-themes, $theme); 250 }
149 } 251
150 } 252 @include bem.modifier('icon') {
253 inline-size: calc(1em * props.get(vars.$line-height) + 2 * props.get($pad-b));
254 padding-inline: 0;
255 }
256 }
257 }
258
259 @include bem.modifier('align-block') {
260 margin-inline: calc(-1 * props.get(vars.$pad-i) - props.get(vars.$border-width));
261
262 @include bem.modifier('pill') {
263 margin-inline: calc(-1 * props.get(vars.$pad-i-pill) - props.get(vars.$border-width));
264 }
265
266 @include bem.modifier('icon') {
267 margin-inline: calc(-1 * props.get(vars.$pad-b) - props.get(vars.$border-width) - .5em * (props.get(vars.$line-height) - 1));
268 }
269
270 @each $mod, $pad-i, $pad-i-label, $pad-i-pill, $pad-b, $font-size in vars.$fixed-sizes {
271 @include bem.modifier($mod) {
272 margin-inline: calc(-1 * props.get($pad-i) - props.get(vars.$border-width));
151 273
152 @include bem.modifier('round') { 274 @include bem.modifier('pill') {
153 inline-size: calc(1em * props.get(vars.$line-height) + 2 * props.get(vars.$pad-b)); 275 margin-inline: calc(-1 * props.get($pad-i-pill) - props.get(vars.$border-width));
154 padding-inline: 0; 276 }
155 border-radius: 100em; 277
156 } 278 @include bem.modifier('icon') {
157 } 279 margin-inline: calc(-1 * props.get($pad-b) - props.get(vars.$border-width) - .5em * (props.get(vars.$line-height) - 1));
280 }
281 }
282 }
283 }
284 }
158} 285}
diff --git a/src/objects/_button.vars.scss b/src/objects/_button.vars.scss
index f70bde7..6e2298f 100644
--- a/src/objects/_button.vars.scss
+++ b/src/objects/_button.vars.scss
@@ -4,165 +4,371 @@
4@use '../core.vars' as core; 4@use '../core.vars' as core;
5 5
6$line-height: props.def(--o-button--line-height, 1.4) !default; 6$line-height: props.def(--o-button--line-height, 1.4) !default;
7$pad-i: props.def(--o-button--pad-i, props.get(core.$size--200)) !default; 7$border-width: props.def(--o-button--border-width, props.get(core.$border-width--thin)) !default;
8$pad-i-label: props.def(--o-button--pad-i-label, props.get(core.$size--50)) !default; 8$rounding: props.def(--o-button--rounding, props.get(core.$rounding--sm)) !default;
9$pad-b: props.def(--o-button--pad-b, props.get(core.$size--65)) !default;
10$border-width: props.def(--o-button--border-width, props.get(core.$border-width--medium)) !default;
11$rounding: props.def(--o-button--rounding, 10em) !default;
12$font-size: props.def(--o-button--font-size, props.get(core.$font-size--100)) !default;
13 9
14$pad-i--sm: props.def(--o-button--sm--pad-i, props.get(core.$size--150)) !default; 10$pad-i--sm: props.def(--o-button--sm--pad-i, props.get(core.$size--75)) !default;
15$pad-i-label--sm: props.def(--o-button--sm--pad-i-label, props.get(core.$size--25)) !default; 11$pad-i-label--sm: props.def(--o-button--sm--pad-i-label, props.get(core.$size--25)) !default;
16$pad-b--sm: props.def(--o-button--sm--pad-b, props.get(core.$size--25)) !default; 12$pad-i-pill--sm: props.def(--o-button--sm--pad-i-pill, props.get(core.$size--115)) !default;
13$pad-b--sm: props.def(--o-button--sm--pad-b, props.get(core.$size--40)) !default;
17$font-size--sm: props.def(--o-button--sm--font-size, props.get(core.$font-size--75)) !default; 14$font-size--sm: props.def(--o-button--sm--font-size, props.get(core.$font-size--75)) !default;
18 15
19$pad-i--lg: props.def(--o-button--lg--pad-i, props.get(core.$size--250)) !default; 16$pad-i: props.def(--o-button--pad-i, props.get(core.$size--115)) !default;
20$pad-i-label--lg: props.def(--o-button--lg--pad-i-label, props.get(core.$size--100)) !default; 17$pad-i-label: props.def(--o-button--pad-i-label, props.get(core.$size--40)) !default;
21$pad-b--lg: props.def(--o-button--lg--pad-b, props.get(core.$size--100)) !default; 18$pad-i-pill: props.def(--o-button--pad-i-pill, props.get(core.$size--150)) !default;
19$pad-b: props.def(--o-button--pad-b, props.get(core.$size--85)) !default;
20$font-size: props.def(--o-button--font-size, props.get(core.$font-size--100)) !default;
21
22$pad-i--lg: props.def(--o-button--lg--pad-i, props.get(core.$size--160)) !default;
23$pad-i-label--lg: props.def(--o-button--lg--pad-i-label, props.get(core.$size--65)) !default;
24$pad-i-pill--lg: props.def(--o-button--lg--pad-i-pill, props.get(core.$size--175)) !default;
25$pad-b--lg: props.def(--o-button--lg--pad-b, props.get(core.$size--115)) !default;
22$font-size--lg: props.def(--o-button--lg--font-size, props.get(core.$font-size--150)) !default; 26$font-size--lg: props.def(--o-button--lg--font-size, props.get(core.$font-size--150)) !default;
23 27
24$pad-i--xl: props.def(--o-button--xl--pad-i, props.get(core.$size--300)) !default; 28$pad-i--xl: props.def(--o-button--xl--pad-i, props.get(core.$size--200)) !default;
25$pad-i-label--xl: props.def(--o-button--xl--pad-i-label, props.get(core.$size--150)) !default; 29$pad-i-label--xl: props.def(--o-button--xl--pad-i-label, props.get(core.$size--85)) !default;
30$pad-i-pill--xl: props.def(--o-button--xl--pad-i-pill, props.get(core.$size--225)) !default;
26$pad-b--xl: props.def(--o-button--xl--pad-b, props.get(core.$size--150)) !default; 31$pad-b--xl: props.def(--o-button--xl--pad-b, props.get(core.$size--150)) !default;
27$font-size--xl: props.def(--o-button--xl--font-size, props.get(core.$font-size--200)) !default; 32$font-size--xl: props.def(--o-button--xl--font-size, props.get(core.$font-size--200)) !default;
28 33
34$shadow-x: props.def(--o-button--shadow-x, props.get(core.$shadow--l1--x)) !default;
35$shadow-y: props.def(--o-button--shadow-y, props.get(core.$shadow--l1--y)) !default;
36$shadow-blur: props.def(--o-button--shadow-blur, props.get(core.$shadow--l1--blur)) !default;
37$shadow-grow: props.def(--o-button--shadow-grow, props.get(core.$shadow--l1--grow)) !default;
38
29$key-focus--border-width: props.def(--o-button--key-focus--border-width, props.get(core.$key-focus--border-width)) !default; 39$key-focus--border-width: props.def(--o-button--key-focus--border-width, props.get(core.$key-focus--border-width)) !default;
30$key-focus--border-offset: props.def(--o-button--key-focus--border-offset, props.get(core.$key-focus--border-offset)) !default; 40$key-focus--border-offset: props.def(--o-button--key-focus--border-offset, props.get(core.$key-focus--border-offset)) !default;
31$key-focus--outline-width: props.def(--o-button--key-focus--outline-width, props.get(core.$key-focus--outline-width)) !default; 41$key-focus--outline-width: props.def(--o-button--key-focus--outline-width, props.get(core.$key-focus--outline-width)) !default;
32 42
33$sizes: ( 43$fixed-sizes: (
34 'sm' $pad-i--sm $pad-i-label--sm $pad-b--sm $font-size--sm, 44 'sm' $pad-i--sm $pad-i-label--sm $pad-i-pill--sm $pad-b--sm $font-size--sm,
35 'lg' $pad-i--lg $pad-i-label--lg $pad-b--lg $font-size--lg, 45 'lg' $pad-i--lg $pad-i-label--lg $pad-i-pill--lg $pad-b--lg $font-size--lg,
36 'xl' $pad-i--xl $pad-i-label--xl $pad-b--xl $font-size--xl, 46 'xl' $pad-i--xl $pad-i-label--xl $pad-i-pill--xl $pad-b--xl $font-size--xl,
37) !default; 47) !default;
38 48
49$themes: props.def(--o-button, (), 'color');
50
39$default-theme-override: () !default; 51$default-theme-override: () !default;
40$default-theme: props.def(--o-button, ( 52$default-theme: map.deep-merge((
41 --bg: props.get(core.$theme, --border-mute), 53 --bg-color: props.get(core.$theme, --bg-l2),
42 --label: props.get(core.$theme, --text), 54 --label-color: props.get(core.$theme, --text),
43 --outline-border: props.get(core.$theme, --border), 55 --border-color: props.get(core.$theme, --box, --border) props.get(core.$theme, --box, --border) props.get(core.$theme, --box, --border-strong),
44 --outline-label: props.get(core.$theme, --text), 56 --shadow-color: props.get(core.$theme, --shadow),
57
58 --hover: (
59 --bg-color: props.get(core.$theme, --bg-l1),
60 --label-color: props.get(core.$theme, --heading),
61 --border-color: props.get(core.$theme, --border),
62 ),
63
64 --active: (
65 --bg-color: props.get(core.$theme, --border-mute),
66 --label-color: props.get(core.$theme, --heading),
67 --border-color: props.get(core.$theme, --border-strong),
68 ),
69
70 --disabled: (
71 --bg-color: transparent,
72 --label-color: props.get(core.$theme, --border-strong),
73 --border-color: props.get(core.$theme, --text-disabled),
74 ),
75
76 --key-focus: (
77 --border-color: props.get(core.$theme, --focus, --border),
78 --outline-color: props.get(core.$theme, --focus, --outline),
79 ),
80
81 --highlighted: (
82 --border-color: props.get(core.$theme, --focus, --border),
83 --shadow-color: props.get(core.$theme, --focus, --outline),
84 ),
85
86 --selected: (
87 --bg-color: props.get(core.$theme, --text),
88 --label-color: props.get(core.$theme, --base, --50),
89 --border-color: props.get(core.$theme, --text) props.get(core.$theme, --text) props.get(core.$theme, --heading),
90
91 --hover: (
92 --bg-color: props.get(core.$theme, --heading),
93 --label-color: props.get(core.$theme, --base, --50),
94 --border-color: props.get(core.$theme, --heading),
95 ),
96
97 --active: (
98 --bg-color: props.get(core.$theme, --heading),
99 --label-color: props.get(core.$theme, --base, --50),
100 --border-color: props.get(core.$theme, --heading),
101 ),
102
103 --disabled: (
104 --bg-color: props.get(core.$theme, --border-mute),
105 --label-color: props.get(core.$theme, --border-strong),
106 --border-color: props.get(core.$theme, --border-mute),
107 ),
108 ),
109
110 --badge: (
111 --bg-color: props.get(core.$theme, --border-mute),
112 --label-color: props.get(core.$theme, --heading),
113 --border-color: props.get(core.$theme, --border-mute),
114
115 --hover: (
116 --bg-color: props.get(core.$theme, --border),
117 --label-color: props.get(core.$theme, --heading),
118 --border-color: props.get(core.$theme, --border),
119 ),
45 120
46 --hover: ( 121 --active: (
47 --bg: props.get(core.$theme, --border), 122 --bg-color: props.get(core.$theme, --border-strong),
48 --label: props.get(core.$theme, --heading), 123 --label-color: props.get(core.$theme, --heading),
49 ), 124 --border-color: props.get(core.$theme, --border-strong),
125 ),
126 ),
50 127
51 --active: ( 128 --quiet: (
52 --bg: props.get(core.$theme, --border-strong), 129 --label-color: props.get(core.$theme, --text),
53 --label: props.get(core.$theme, --heading),
54 ),
55 130
56 --disabled: ( 131 --hover: (
57 --bg: props.get(core.$theme, --border-mute), 132 --bg-color: props.get(core.$theme, --border-mute),
58 --outline-border: props.get(core.$theme, --border), 133 --label-color: props.get(core.$theme, --heading),
59 --label: props.get(core.$theme, --text-disabled), 134 ),
60 ),
61 135
62 --key-focus: ( 136 --active: (
63 --label: props.get(core.$theme, --focus, --text), 137 --bg-color: props.get(core.$theme, --border),
64 --border: props.get(core.$theme, --focus, --border), 138 --label-color: props.get(core.$theme, --heading),
65 --outline: props.get(core.$theme, --focus, --outline), 139 ),
66 ),
67 140
68 --primary: ( 141 --disabled: (
69 --bg: props.get(core.$theme, --base, --900), 142 --label-color: props.get(core.$theme, --border-strong),
70 --label: props.get(core.$theme, --base, --900-text), 143 ),
71 --outline-border: props.get(core.$theme, --base, --900), 144 ),
72 --outline-label: props.get(core.$theme, --text), 145), $default-theme-override) !default;
146$default-theme: props.def(--o-button, $default-theme, 'color');
73 147
74 --hover: ( 148$default-theme-dark-override: () !default;
75 --bg: props.get(core.$theme, --base, --800), 149$default-theme-dark: map.deep-merge((
76 --label: props.get(core.$theme, --base, --800-text), 150 --bg-color: props.get(core.$theme, --border-mute),
77 ), 151 --border-color: props.get(core.$theme, --border-mute),
78 152
79 --active: ( 153 --hover: (
80 --bg: props.get(core.$theme, --base, --700), 154 --bg-color: props.get(core.$theme, --border),
81 --label: props.get(core.$theme, --base, --700-text), 155 --border-color: props.get(core.$theme, --border),
82 ), 156 ),
83 ),
84), 'color');
85$default-theme: props.merge($default-theme, $default-theme-override);
86 157
87$static-themes: props.def(--o-button, (), 'color'); 158 --active: (
159 --bg-color: props.get(core.$theme, --border-strong),
160 --border-color: props.get(core.$theme, --border-strong),
161 ),
162
163 --selected: (
164 --border-color: props.get(core.$theme, --text),
165 ),
166), $default-theme-override) !default;
167$default-theme-dark: props.def(--o-button, $default-theme-dark, 'dark');
88 168
89@each $theme in map.keys(props.get(core.$transparent-colors)) { 169@each $theme in map.keys(props.get(core.$transparent-colors)) {
90 $button-theme: --static-#{string.slice($theme, 3)}; 170 $button-theme: --static-#{string.slice($theme, 3)};
171
172 $themes: props.merge($themes, (
173 $button-theme: (
174 --bg-color: props.get(core.$transparent-colors, $theme, --200),
175 --label-color: props.get(core.$transparent-colors, $theme, --900),
176 --border-color: props.get(core.$transparent-colors, $theme, --300) props.get(core.$transparent-colors, $theme, --300) props.get(core.$transparent-colors, $theme, --400),
177 --shadow-color: props.get(core.$transparent-colors, --black, --200),
178
179 --hover: (
180 --bg-color: props.get(core.$transparent-colors, $theme, --300),
181 --label-color: props.get(core.$transparent-colors, $theme, --900),
182 --border-color: props.get(core.$transparent-colors, $theme, --400),
183 ),
184
185 --active: (
186 --bg-color: props.get(core.$transparent-colors, $theme, --400),
187 --label-color: props.get(core.$transparent-colors, $theme, --900),
188 --border-color: props.get(core.$transparent-colors, $theme, --500),
189 ),
190
191 --disabled: (
192 --bg-color: props.get(core.$transparent-colors, $theme, --100),
193 --label-color: props.get(core.$transparent-colors, $theme, --500),
194 --border-color: props.get(core.$transparent-colors, $theme, --300),
195 ),
91 196
92 $static-themes: props.merge($static-themes, ( 197 --key-focus: (
93 $button-theme: ( 198 --border-color: props.get(core.$transparent-colors, $theme, --900),
94 --bg: props.get(core.$transparent-colors, $theme, --200), 199 --outline-color: props.get(core.$transparent-colors, $theme, --300),
95 --label: props.get(core.$transparent-colors, $theme, --900), 200 ),
96 --outline-border: props.get(core.$transparent-colors, $theme, --300),
97 --outline-label: props.get(core.$transparent-colors, $theme, --900),
98 201
99 --hover: ( 202 --highlighted: (
100 --bg: props.get(core.$transparent-colors, $theme, --300), 203 --border-color: props.get(core.$transparent-colors, $theme, --900),
101 --label: props.get(core.$transparent-colors, $theme, --900), 204 --shadow-color: props.get(core.$transparent-colors, --black, --200),
102 ), 205 ),
103 206
104 --active: ( 207 --selected: (
105 --bg: props.get(core.$transparent-colors, $theme, --400), 208 --bg-color: props.get(core.$transparent-colors, $theme, --800),
106 --label: props.get(core.$transparent-colors, $theme, --900), 209 --label-color: props.get(core.$transparent-colors, $theme, --text),
107 ), 210 --border-color: props.get(core.$transparent-colors, $theme, --100) props.get(core.$transparent-colors, $theme, --100) props.get(core.$transparent-colors, $theme, --200),
108 211
109 --disabled: ( 212 --hover: (
110 --bg: props.get(core.$transparent-colors, $theme, --200), 213 --bg-color: props.get(core.$transparent-colors, $theme, --900),
111 --outline-border: props.get(core.$transparent-colors, $theme, --300), 214 --label-color: props.get(core.$transparent-colors, $theme, --text),
112 --label: props.get(core.$transparent-colors, $theme, --500), 215 --border-color: props.get(core.$transparent-colors, $theme, --100),
113 ), 216 ),
114 217
115 --key-focus: ( 218 --active: (
116 --bg: props.get(core.$transparent-colors, $theme, --100), 219 --bg-color: props.get(core.$transparent-colors, $theme, --900),
117 --label: props.get(core.$transparent-colors, $theme, --900), 220 --label-color: props.get(core.$transparent-colors, $theme, --text),
118 --border: props.get(core.$transparent-colors, $theme, --900), 221 --border-color: props.get(core.$transparent-colors, $theme, --100),
119 --outline: props.get(core.$transparent-colors, $theme, --300), 222 ),
120 ),
121 223
122 --primary: ( 224 --disabled: (
123 --bg: props.get(core.$transparent-colors, $theme, --800), 225 --bg-color: props.get(core.$transparent-colors, $theme, --200),
124 --label: props.get(core.$transparent-colors, $theme, --text), 226 --label-color: props.get(core.$transparent-colors, $theme, --500),
125 --outline-border: props.get(core.$transparent-colors, $theme, --800), 227 --border-color: props.get(core.$transparent-colors, $theme, --100),
126 --outline-label: props.get(core.$transparent-colors, $theme, --900), 228 ),
127 229 ),
128 --hover: (
129 --bg: props.get(core.$transparent-colors, $theme, --900),
130 --label: props.get(core.$transparent-colors, $theme, --text),
131 ),
132 230
133 --active: ( 231 --badge: (
134 --bg: props.get(core.$transparent-colors, $theme, --900), 232 --bg-color: props.get(core.$transparent-colors, $theme, --200),
135 --label: props.get(core.$transparent-colors, $theme, --text), 233 --label-color: props.get(core.$transparent-colors, $theme, --900),
136 ), 234 --border-color: transparent,
137 ) 235
138 ) 236 --hover: (
139 )); 237 --bg-color: props.get(core.$transparent-colors, $theme, --300),
238 --label-color: props.get(core.$transparent-colors, $theme, --900),
239 --border-color: transparent,
240 ),
241
242 --active: (
243 --bg-color: props.get(core.$transparent-colors, $theme, --400),
244 --label-color: props.get(core.$transparent-colors, $theme, --900),
245 --border-color: transparent,
246 ),
247 ),
248
249 --quiet: (
250 --label-color: props.get(core.$transparent-colors, $theme, --900),
251
252 --hover: (
253 --bg-color: props.get(core.$transparent-colors, $theme, --200),
254 --label-color: props.get(core.$transparent-colors, $theme, --900),
255 ),
256
257 --active: (
258 --bg-color: props.get(core.$transparent-colors, $theme, --300),
259 --label-color: props.get(core.$transparent-colors, $theme, --900),
260 ),
261
262 --disabled: (
263 --label-color: props.get(core.$transparent-colors, $theme, --500),
264 ),
265 ),
266 )
267 ));
140} 268}
141 269
142$themes-config: ( 270$themes-config: (
143 accent: --accent, 271 accent: --accent,
144 negative: --negative, 272 positive: --positive,
273 negative: --negative,
274 warning: --warning,
145) !default; 275) !default;
146 276
147$themes: props.def(--o-button, (), 'color');
148
149@each $theme, $key in $themes-config { 277@each $theme, $key in $themes-config {
150 $themes: props.merge($themes, ( 278 $themes: props.merge($themes, (
151 --#{$theme}: ( 279 --#{$theme}: (
152 --bg: props.get(core.$theme, #{$key}-static, --900), 280 --bg-color: props.get(core.$theme, $key, --100),
153 --label: props.get(core.$theme, #{$key}-static, --900-text), 281 --label-color: props.get(core.$theme, $key, --1100),
154 --outline-border: props.get(core.$theme, $key, --900), 282 --border-color: props.get(core.$theme, $key, --500) props.get(core.$theme, $key, --500) props.get(core.$theme, $key, --600),
155 --outline-label: props.get(core.$theme, $key, --1000), 283 --shadow-color: props.get(core.$theme, $key, --200),
284
285 --hover: (
286 --bg-color: props.get(core.$theme, $key, --200),
287 --label-color: props.get(core.$theme, $key, --1200),
288 --border-color: props.get(core.$theme, $key, --600),
289 ),
290
291 --active: (
292 --bg-color: props.get(core.$theme, $key, --300),
293 --label-color: props.get(core.$theme, $key, --1300),
294 --border-color: props.get(core.$theme, $key, --800),
295 ),
296
297 --disabled: (
298 --bg-color: props.get(core.$theme, --bg-l1),
299 --label-color: props.get(core.$theme, --border-strong),
300 --border-color: props.get(core.$theme, --border),
301 ),
302
303 --key-focus: (
304 --border-color: props.get(core.$theme, --focus, --border),
305 --outline-color: props.get(core.$theme, --focus, --outline),
306 ),
307
308 --highlighted: (
309 --border-color: props.get(core.$theme, $key, --900),
310 --shadow-color: props.get(core.$theme, $key, --200),
311 ),
312
313 --selected: (
314 --bg-color: props.get(core.$theme, #{$key}-static, --900),
315 --label-color: props.get(core.$theme, #{$key}-static, --900-text),
316 --border-color: props.get(core.$theme, #{$key}-static, --900) props.get(core.$theme, #{$key}-static, --900) props.get(core.$theme, #{$key}-static, --1000),
317
318 --hover: (
319 --bg-color: props.get(core.$theme, #{$key}-static, --1000),
320 --label-color: props.get(core.$theme, #{$key}-static, --1000-text),
321 --border-color: props.get(core.$theme, #{$key}-static, --1000),
322 ),
323
324 --active: (
325 --bg-color: props.get(core.$theme, #{$key}-static, --1100),
326 --label-color: props.get(core.$theme, #{$key}-static, --1100-text),
327 --border-color: props.get(core.$theme, #{$key}-static, --1100),
328 ),
329
330 --disabled: (
331 --bg-color: props.get(core.$theme, --border-mute),
332 --label-color: props.get(core.$theme, --border-strong),
333 --border-color: props.get(core.$theme, --border-mute),
334 ),
335 ),
156 336
157 --hover: ( 337 --badge: (
158 --bg: props.get(core.$theme, #{$key}-static, --1000), 338 --bg-color: props.get(core.$theme, $key, --100),
159 --label: props.get(core.$theme, #{$key}-static, --1000-text), 339 --label-color: props.get(core.$theme, $key, --1100),
160 ), 340 --border-color: props.get(core.$theme, $key, --300),
341
342 --hover: (
343 --bg-color: props.get(core.$theme, $key, --200),
344 --label-color: props.get(core.$theme, $key, --1200),
345 --border-color: props.get(core.$theme, $key, --400),
346 ),
347
348 --active: (
349 --bg-color: props.get(core.$theme, $key, --300),
350 --label-color: props.get(core.$theme, $key, --1300),
351 --border-color: props.get(core.$theme, $key, --500),
352 ),
353 ),
161 354
162 --active: ( 355 --quiet: (
163 --bg: props.get(core.$theme, #{$key}-static, --1100), 356 --label-color: props.get(core.$theme, $key, --1100),
164 --label: props.get(core.$theme, #{$key}-static, --1100-text), 357
165 ), 358 --hover: (
166 ) 359 --bg-color: props.get(core.$theme, $key, --200),
167 )); 360 --label-color: props.get(core.$theme, $key, --1200),
361 ),
362
363 --active: (
364 --bg-color: props.get(core.$theme, $key, --300),
365 --label-color: props.get(core.$theme, $key, --1300),
366 ),
367
368 --disabled: (
369 --label-color: props.get(core.$theme, --border-strong),
370 ),
371 ),
372 )
373 ));
168} 374}
diff --git a/src/objects/_card.scss b/src/objects/_card.scss
index e6f266d..ebab339 100644
--- a/src/objects/_card.scss
+++ b/src/objects/_card.scss
@@ -8,194 +8,270 @@
8@use 'card.vars' as vars; 8@use 'card.vars' as vars;
9 9
10@mixin styles { 10@mixin styles {
11 @include materialize-at-root(meta.module-variables('vars')); 11 @include materialize-at-root(meta.module-variables('vars'));
12 12
13 @include bem.object('card') { 13 @include bem.object('card') {
14 position: relative; 14 position: relative;
15 display: flex; 15 display: flex;
16 flex-direction: column; 16 flex-direction: column;
17 margin: calc(-1 * props.get(vars.$key-focus--border-width)); 17 background-color: props.get(vars.$bg-color);
18 background-color: props.get(vars.$bg-color); 18 border: props.get(vars.$border-width) solid transparent;
19 background-clip: content-box; 19 border-color: props.get(vars.$border-color);
20 border: props.get(vars.$key-focus--border-offset) solid transparent; 20 border-radius: props.get(vars.$rounding);
21 border-radius: calc(props.get(vars.$rounding) + props.get(vars.$key-focus--border-offset)); 21 transition: transform .2s, background-color .2s, border-color .2s, box-shadow .2s;
22 transition: transform .2s;
23 22
24 @include bem.multi('&:link, &:visited, &:enabled', 'modifier' 'interactive') { 23 @include bem.multi('&:link, &:visited, &:enabled', 'modifier' 'interactive') {
25 &:hover, 24 &:hover,
26 &:active, 25 &:active,
27 &:focus-visible { 26 &:focus-visible {
28 transform: translateY(props.get(vars.$hover--offset-b)); 27 background-color: props.get(vars.$hover--bg-color);
28 border-color: props.get(vars.$hover--border-color);
29 box-shadow: none;
30 transform: translateY(props.get(vars.$hover--offset-b));
31 }
29 32
30 @include bem.elem('body') { 33 &:focus-visible {
31 @include bem.modifier('hidden') { 34 margin: calc(-1 * props.get(vars.$key-focus--border-width));
32 visibility: visible; 35 outline: props.get(vars.$key-focus--border-color) solid props.get(vars.$key-focus--border-width);
33 opacity: 1; 36 border: calc(props.get(vars.$key-focus--border-offset) + props.get(vars.$border-width)) solid transparent;
34 transition: 37 border-radius: calc(props.get(vars.$rounding) + props.get(vars.$key-focus--border-offset));
35 opacity .2s ease, 38 box-shadow:
36 visibility .2s linear; 39 0 0 0
37 } 40 calc(props.get(vars.$key-focus--border-width) + props.get(vars.$key-focus--outline-width))
38 } 41 props.get(vars.$key-focus--outline-color);
39 } 42 transition: transform .2s;
43 }
44 }
40 45
41 &:focus-visible { 46 @include bem.modifier('borderless') {
42 outline: props.get(vars.$key-focus--border-color) solid props.get(vars.$key-focus--border-width); 47 border-color: props.get(vars.$bg-color);
43 box-shadow: 48 }
44 0
45 0
46 0
47 calc(props.get(vars.$key-focus--border-width) + props.get(vars.$key-focus--outline-width))
48 props.get(vars.$key-focus--outline-color);
49 }
50 }
51 49
52 @include bem.elem('avatar') { 50 @include bem.modifier('shadow') {
53 margin-block-start: props.get(vars.$pad-b); 51 box-shadow:
54 margin-inline-start: props.get(vars.$pad-i); 52 props.get(vars.$shadow-x)
55 } 53 props.get(vars.$shadow-y)
54 props.get(vars.$shadow-blur)
55 props.get(vars.$shadow-grow)
56 props.get(vars.$shadow-color);
56 57
57 @include bem.elem('image') { 58 @include bem.modifier('quiet') {
58 display: block; 59 @include bem.elem('image') {
59 flex: 0 0 auto; 60 box-shadow:
60 inline-size: 100%; 61 props.get(vars.$shadow-x)
61 object-fit: cover; 62 props.get(vars.$shadow-y)
62 transition: transform .2s, opacity .2s; 63 props.get(vars.$shadow-blur)
64 props.get(vars.$shadow-grow)
65 props.get(vars.$shadow-color);
66 }
67 }
68 }
63 69
64 &:first-child { 70 @include bem.elem('avatar') {
65 border-start-start-radius: props.get(vars.$rounding); 71 margin-block-start: props.get(vars.$pad-b);
66 border-start-end-radius: props.get(vars.$rounding); 72 margin-inline-start: props.get(vars.$pad-i);
67 } 73 }
68 74
69 &:last-child { 75 @include bem.elem('image') {
70 border-end-start-radius: props.get(vars.$rounding); 76 position: relative;
71 border-end-end-radius: props.get(vars.$rounding); 77 display: block;
72 } 78 flex: 0 0 auto;
79 inline-size: calc(100% + 2 * props.get(vars.$border-width));
80 margin: calc(-1 * props.get(vars.$border-width));
81 overflow: hidden;
82 object-fit: cover;
83 transition: background-color .2s, transform .2s, opacity .2s;
73 84
74 @include bem.next-elem('avatar') { 85 &:first-child {
75 margin-block-start: calc(-.7 * props.get(avatar.$size--xl)); 86 border-start-start-radius: calc(props.get(vars.$rounding) - props.get(vars.$border-width));
76 } 87 border-start-end-radius: calc(props.get(vars.$rounding) - props.get(vars.$border-width));
77 } 88 }
78 89
79 @include bem.elem('body') { 90 &:last-child {
80 flex: 1 0 auto; 91 border-end-start-radius: calc(props.get(vars.$rounding) - props.get(vars.$border-width));
81 padding-block: props.get(vars.$pad-b); 92 border-end-end-radius: calc(props.get(vars.$rounding) - props.get(vars.$border-width));
82 padding-inline: props.get(vars.$pad-i); 93 }
83 94
84 &::before { 95 @include bem.next-elem('avatar') {
85 display: block; 96 margin-block-start: calc(-.7 * props.get(avatar.$size--xl));
86 margin-block: -100em 100em; 97 }
87 content: ''; 98 }
88 }
89 99
90 @include bem.modifier('hidden') { 100 @include bem.elem('image-img') {
91 position: absolute; 101 display: block;
92 inset-block-end: 0; 102 inline-size: 100%;
93 inset-inline: 0; 103 object-fit: cover;
94 z-index: 10; 104 }
95 visibility: hidden;
96 background-color: props.get(vars.$bg-color);
97 //border-end-start-radius: props.get(vars.$rounding);
98 //border-end-end-radius: props.get(vars.$rounding);
99 opacity: 0;
100 transition:
101 opacity .2s ease,
102 visibility 0s .2s linear;
103 105
104 @include bem.next-elem('image') { 106 @include bem.elem('image-overlay') {
105 border-start-start-radius: props.get(vars.$rounding); 107 position: absolute;
106 border-start-end-radius: props.get(vars.$rounding); 108 inset-block-end: 0;
107 } 109 inset-inline: 0;
108 } 110 z-index: 5;
109 } 111 padding-block: props.get(vars.$image-overlay--pad-b);
112 padding-inline: props.get(vars.$image-overlay--pad-i);
113 }
110 114
111 @include bem.elem('content') { 115 @include bem.elem('body') {
112 margin-block-start: props.get(vars.$spacing); 116 flex: 1 0 auto;
113 } 117 padding-block: props.get(vars.$pad-b);
118 padding-inline: props.get(vars.$pad-i);
114 119
115 @include bem.elem('footer') { 120 &::before {
116 flex: 0 0 auto; 121 display: block;
117 padding-block: 0 props.get(vars.$pad-b); 122 margin-block: -100em 100em;
118 padding-inline: props.get(vars.$pad-i); 123 content: '';
119 margin-block-start: calc(-1 * props.get(vars.$pad-b)); 124 }
125 }
120 126
121 &::before { 127 @include bem.elem('content') {
122 display: block; 128 margin-block-start: props.get(vars.$spacing);
123 block-size: props.get(vars.$divider-width); 129 }
124 margin-block: props.get(vars.$spacing);
125 content: '';
126 background-color: props.get(vars.$divider-width);
127 }
128 }
129 130
130 @include bem.modifier('quiet') { 131 @include bem.elem('footer') {
131 position: relative; 132 flex: 0 0 auto;
132 margin: 0; 133 padding-block: 0 props.get(vars.$pad-b);
133 background-color: transparent; 134 padding-inline: props.get(vars.$pad-i);
134 border: 0; 135 margin-block-start: calc(-1 * props.get(vars.$pad-b));
135 136
136 @include bem.multi('&:link, &:visited, &:enabled', 'modifier' 'interactive') { 137 &::before {
137 &:hover, 138 display: block;
138 &:active, 139 block-size: props.get(vars.$divider-width);
139 &:focus-visible { 140 margin-block: props.get(vars.$spacing);
140 transform: none; 141 content: '';
142 background-color: props.get(vars.$divider-width);
143 }
144 }
141 145
142 @include bem.elem('image') { 146 @include bem.modifier('quiet') {
143 background-color: props.get(vars.$quiet--hover--image-color); 147 margin-inline: 0;
144 opacity: .75; 148 background-color: transparent;
145 transform: translateY(props.get(vars.$hover--offset-b)); 149 border: 0;
146 } 150 box-shadow: none;
147 }
148 151
149 &:focus-visible { 152 @include bem.multi('&:link, &:visited, &:enabled', 'modifier' 'interactive') {
150 outline: none; 153 &:hover,
151 box-shadow: none; 154 &:active,
155 &:focus-visible {
156 background-color: transparent;
157 transform: none;
152 158
153 @include bem.elem('image') { 159 @include bem.elem('image') {
154 background-color: props.get(vars.$quiet--hover--image-color); 160 background-color: props.get(vars.$quiet--hover--image-color);
155 outline: props.get(vars.$key-focus--border-color) solid props.get(vars.$key-focus--border-width); 161 opacity: .75;
156 box-shadow: 162 transform: translateY(props.get(vars.$hover--offset-b));
157 0 163 }
158 0 164 }
159 0
160 calc(props.get(vars.$key-focus--border-width) + props.get(vars.$key-focus--outline-width))
161 props.get(vars.$key-focus--outline-color);
162 opacity: 1;
163 }
164 }
165 }
166 165
167 @include bem.elem('image') { 166 &:focus-visible {
168 position: relative; 167 margin: 0;
169 margin: calc(-1 * props.get(vars.$key-focus--border-width)); 168 outline: none;
170 background-color: props.get(vars.$quiet--image-color); 169 border: 0;
171 background-clip: padding-box; 170 box-shadow: none;
172 border: props.get(vars.$key-focus--border-offset) solid transparent;
173 border-radius: calc(props.get(vars.$rounding) + props.get(vars.$key-focus--border-offset));
174 }
175 171
176 @include bem.elem('body') { 172 @include bem.elem('image') {
177 padding: 0; 173 margin: calc(-1 * props.get(vars.$key-focus--border-width));
178 padding-block-start: props.get(vars.$spacing); 174 outline: props.get(vars.$key-focus--border-color) solid props.get(vars.$key-focus--border-width);
179 } 175 background-color: props.get(vars.$quiet--hover--image-color);
176 border: props.get(vars.$key-focus--border-offset) solid transparent;
177 border-radius: calc(props.get(vars.$rounding) + props.get(vars.$key-focus--border-offset));
178 box-shadow:
179 0
180 0
181 0
182 calc(props.get(vars.$key-focus--border-width) + props.get(vars.$key-focus--outline-width))
183 props.get(vars.$key-focus--outline-color);
184 opacity: 1;
185 }
186 }
187 }
180 188
181 @include bem.elem('footer') { 189 @include bem.elem('image') {
182 padding-inline: 0; 190 position: relative;
183 } 191 background-color: props.get(vars.$quiet--image-color);
184 } 192 background-clip: padding-box;
193 border-radius: props.get(vars.$rounding);
194 }
185 195
186 @include bem.modifier('horizontal') { 196 @include bem.elem('body') {
187 flex-direction: row; 197 padding: 0;
188 align-items: center; 198 padding-block-start: props.get(vars.$spacing);
199 }
189 200
190 @include bem.elem('body') { 201 @include bem.elem('footer') {
191 flex: 0 0 auto; 202 padding-inline: 0;
203 }
204 }
192 205
193 @include bem.modifier('main') { 206 @include bem.modifier('thumbnail') {
194 flex-shrink: 1; 207 @include bem.elem('image') {
195 inline-size: 100%; 208 border-radius: props.get(vars.$rounding);
196 min-inline-size: 0; 209 }
197 } 210
198 } 211 @include bem.elem('body') {
199 } 212 position: absolute;
200 } 213 inset-block-end: calc(-1 * props.get(vars.$border-width));
214 inset-inline: calc(-1 * props.get(vars.$border-width));
215 z-index: 10;
216 visibility: hidden;
217 background-color: props.get(vars.$hover--bg-color);
218 border-color: transparent;
219 border-style: solid;
220 border-width: 0 props.get(vars.$border-width) props.get(vars.$border-width);
221 border-end-start-radius: calc(props.get(vars.$rounding) - props.get(vars.$border-width));
222 border-end-end-radius: calc(props.get(vars.$rounding) - props.get(vars.$border-width));
223 opacity: 0;
224 transition:
225 border-color .2s ease,
226 opacity .2s ease,
227 visibility 0s .2s linear;
228 }
229
230 @include bem.multi('&:link, &:visited, &:enabled', 'modifier' 'interactive') {
231 &:hover,
232 &:active,
233 &:focus-visible {
234 @include bem.elem('body') {
235 visibility: visible;
236 border-color: props.get(vars.$hover--border-color);
237 opacity: 1;
238 transition:
239 border-color .2s ease,
240 opacity .2s ease,
241 visibility .2s linear;
242 }
243 }
244 }
245 }
246
247 @include bem.modifier('horizontal') {
248 flex-direction: row;
249 align-items: center;
250
251 @include bem.elem('image') {
252 align-self: stretch;
253 inline-size: auto;
254
255 &:first-child {
256 border-start-end-radius: 0;
257 border-end-start-radius: props.get(vars.$rounding);
258 }
259
260 &:last-child {
261 border-start-end-radius: props.get(vars.$rounding);
262 border-end-start-radius: 0;
263 }
264 }
265
266 @include bem.elem('body') {
267 flex: 0 0 auto;
268
269 @include bem.modifier('main') {
270 flex-shrink: 1;
271 inline-size: 100%;
272 min-inline-size: 0;
273 }
274 }
275 }
276 }
201} 277}
diff --git a/src/objects/_card.vars.scss b/src/objects/_card.vars.scss
index 8ee7158..ebfba10 100644
--- a/src/objects/_card.vars.scss
+++ b/src/objects/_card.vars.scss
@@ -2,21 +2,35 @@
2@use 'iro-sass/src/props'; 2@use 'iro-sass/src/props';
3@use '../core.vars' as core; 3@use '../core.vars' as core;
4 4
5$divider-width: props.def(--o-card--divider-width, props.get(core.$border-width--thin)) !default; 5$divider-width: props.def(--o-card--divider-width, props.get(core.$border-width--thin)) !default;
6$pad-i: props.def(--o-card--pad-i, props.get(core.$size--300)) !default; 6$border-width: props.def(--o-card--border-width, props.get(core.$border-width--thin)) !default;
7$pad-b: props.def(--o-card--pad-b, props.get(core.$size--250)) !default; 7$sub-border-width: props.def(--o-card--sub-border-width, props.get(core.$border-width--thick)) !default;
8$spacing: props.def(--o-card--spacing, props.get(core.$size--200)) !default; 8$pad-i: props.def(--o-card--pad-i, props.get(core.$size--300)) !default;
9$rounding: props.def(--o-card--rounding, props.get(core.$rounding)) !default; 9$pad-b: props.def(--o-card--pad-b, props.get(core.$size--250)) !default;
10$spacing: props.def(--o-card--spacing, props.get(core.$size--200)) !default;
11$rounding: props.def(--o-card--rounding, props.get(core.$rounding)) !default;
12$image-overlay--pad-i: props.def(--o-card--image-overlay--pad-i, props.get($pad-i)) !default;
13$image-overlay--pad-b: props.def(--o-card--image-overlay--pad-b, props.get($pad-b)) !default;
10 14
11$hover--offset-b: props.def(--o-card--hover--offset-b, calc(-1 * props.get(core.$size--65))) !default; 15$hover--offset-b: props.def(--o-card--hover--offset-b, calc(-1 * props.get(core.$size--65))) !default;
12 16
17$shadow-x: props.def(--o-card--shadow-x, props.get(core.$shadow--l1--x)) !default;
18$shadow-y: props.def(--o-card--shadow-y, props.get(core.$shadow--l1--y)) !default;
19$shadow-blur: props.def(--o-card--shadow-blur, props.get(core.$shadow--l1--blur)) !default;
20$shadow-grow: props.def(--o-card--shadow-grow, props.get(core.$shadow--l1--grow)) !default;
21
13$key-focus--border-width: props.def(--o-card--key-focus--border-width, props.get(core.$key-focus--border-width)) !default; 22$key-focus--border-width: props.def(--o-card--key-focus--border-width, props.get(core.$key-focus--border-width)) !default;
14$key-focus--border-offset: props.def(--o-card--key-focus--border-offset, props.get(core.$key-focus--border-offset)) !default; 23$key-focus--border-offset: props.def(--o-card--key-focus--border-offset, props.get(core.$key-focus--border-offset)) !default;
15$key-focus--outline-width: props.def(--o-card--key-focus--outline-width, props.get(core.$key-focus--outline-width)) !default; 24$key-focus--outline-width: props.def(--o-card--key-focus--outline-width, props.get(core.$key-focus--outline-width)) !default;
16 25
26$shadow-color: props.def(--o-card--shadow-color, props.get(core.$theme, --shadow), 'color') !default;
17$bg-color: props.def(--o-card--bg-color, props.get(core.$theme, --bg-l2), 'color') !default; 27$bg-color: props.def(--o-card--bg-color, props.get(core.$theme, --bg-l2), 'color') !default;
28$border-color: props.def(--o-card--border-color, props.get(core.$theme, --box, --border), 'color') !default;
18$divider-color: props.def(--o-card--divider-color, props.get(core.$theme, --border-mute), 'color') !default; 29$divider-color: props.def(--o-card--divider-color, props.get(core.$theme, --border-mute), 'color') !default;
19 30
31$hover--bg-color: props.def(--o-card--hover--bg-color, color-mix(in lch, props.get($bg-color), props.get(core.$theme, --border-mute)), 'color') !default;
32$hover--border-color: props.def(--o-card--hover--border-color, props.get(core.$theme, --border), 'color') !default;
33
20$key-focus--label-color: props.def(--o-card--key-focus--label-color, props.get(core.$theme, --focus, --text), 'color') !default; 34$key-focus--label-color: props.def(--o-card--key-focus--label-color, props.get(core.$theme, --focus, --text), 'color') !default;
21$key-focus--border-color: props.def(--o-card--key-focus--border-color, props.get(core.$theme, --focus, --border), 'color') !default; 35$key-focus--border-color: props.def(--o-card--key-focus--border-color, props.get(core.$theme, --focus, --border), 'color') !default;
22$key-focus--outline-color: props.def(--o-card--key-focus--outline-color, props.get(core.$theme, --focus, --outline), 'color') !default; 36$key-focus--outline-color: props.def(--o-card--key-focus--outline-color, props.get(core.$theme, --focus, --outline), 'color') !default;
diff --git a/src/objects/_checkbox.scss b/src/objects/_checkbox.scss
index 82dd596..5faafb9 100644
--- a/src/objects/_checkbox.scss
+++ b/src/objects/_checkbox.scss
@@ -9,223 +9,223 @@
9@use 'checkbox.vars' as vars; 9@use 'checkbox.vars' as vars;
10 10
11@mixin styles { 11@mixin styles {
12 @include materialize-at-root(meta.module-variables('vars')); 12 @include materialize-at-root(meta.module-variables('vars'));
13 13
14 @include bem.object('checkbox') { 14 @include bem.object('checkbox') {
15 position: relative; 15 position: relative;
16 display: inline-block; 16 display: inline-block;
17 padding-block: props.get(vars.$pad-b); 17 padding-block: props.get(vars.$pad-b);
18 padding-inline: props.get(vars.$pad-i); 18 padding-inline: props.get(vars.$pad-i);
19 margin-inline: 19 margin-inline:
20 calc(-1 * props.get(vars.$pad-i) - props.get(vars.$key-focus--border-offset)) 20 calc(-1 * props.get(vars.$pad-i) - props.get(vars.$key-focus--border-offset))
21 calc(props.get(vars.$spacing-sibling) - props.get(vars.$pad-b) - props.get(vars.$key-focus--border-offset)); 21 calc(props.get(vars.$spacing-sibling) - props.get(vars.$pad-b) - props.get(vars.$key-focus--border-offset));
22 22
23 @include bem.elem('box') { 23 @include bem.elem('box') {
24 position: relative; 24 position: relative;
25 display: inline-block; 25 display: inline-block;
26 flex: 0 0 auto; 26 flex: 0 0 auto;
27 inline-size: props.get(vars.$size); 27 inline-size: props.get(vars.$size);
28 block-size: props.get(vars.$size); 28 block-size: props.get(vars.$size);
29 margin-block-start: calc(.5em * props.get(core.$font--standard--line-height) - .5 * props.get(vars.$size) - props.get(vars.$key-focus--border-offset)); 29 margin-block-start: calc(.5em * props.get(core.$font--standard--line-height) - .5 * props.get(vars.$size) - props.get(vars.$key-focus--border-offset));
30 vertical-align: top; 30 vertical-align: top;
31 background-color: props.get(vars.$box-border-color); 31 background-color: props.get(vars.$box-border-color);
32 background-clip: padding-box; 32 background-clip: padding-box;
33 border: props.get(vars.$key-focus--border-offset) solid transparent; 33 border: props.get(vars.$key-focus--border-offset) solid transparent;
34 border-radius: calc(props.get(vars.$border-width) + props.get(vars.$key-focus--border-offset)); 34 border-radius: calc(props.get(vars.$border-width) + props.get(vars.$key-focus--border-offset));
35 35
36 &::before, 36 &::before,
37 &::after { 37 &::after {
38 position: absolute; 38 position: absolute;
39 display: block; 39 display: block;
40 content: ''; 40 content: '';
41 } 41 }
42 42
43 &::before { 43 &::before {
44 inset-block-start: props.get(vars.$border-width); 44 inset-block-start: props.get(vars.$border-width);
45 inset-inline-start: props.get(vars.$border-width); 45 inset-inline-start: props.get(vars.$border-width);
46 z-index: 2; 46 z-index: 2;
47 inline-size: calc(props.get(vars.$size) - 2 * props.get(vars.$border-width)); 47 inline-size: calc(props.get(vars.$size) - 2 * props.get(vars.$border-width));
48 block-size: calc(props.get(vars.$size) - 2 * props.get(vars.$border-width)); 48 block-size: calc(props.get(vars.$size) - 2 * props.get(vars.$border-width));
49 background-color: props.get(vars.$box-bg-color); 49 background-color: props.get(vars.$box-bg-color);
50 transition: transform .2s ease; 50 transition: transform .2s ease;
51 } 51 }
52 52
53 &::after { 53 &::after {
54 inset-block-start: calc(.5 * props.get(vars.$size) - 1px); 54 inset-block-start: calc(.5 * props.get(vars.$size) - 1px);
55 inset-inline-start: calc(1.5 * props.get(vars.$border-width)); 55 inset-inline-start: calc(1.5 * props.get(vars.$border-width));
56 z-index: 3; 56 z-index: 3;
57 box-sizing: border-box; 57 box-sizing: border-box;
58 inline-size: calc(props.get(vars.$size) - 3 * props.get(vars.$border-width)); 58 inline-size: calc(props.get(vars.$size) - 3 * props.get(vars.$border-width));
59 block-size: 0; 59 block-size: 0;
60 border-color: props.get(vars.$box-bg-color); 60 border-color: props.get(vars.$box-bg-color);
61 border-style: solid; 61 border-style: solid;
62 border-radius: 2px; 62 border-radius: 2px;
63 transition: transform .2s ease; 63 transform: scale(0);
64 transform: scale(0); 64 transition: transform .2s ease;
65 border-block-width: 0 2px; 65 border-block-width: 0 2px;
66 border-inline-width: 0 2px; 66 border-inline-width: 0 2px;
67 } 67 }
68 } 68 }
69 69
70 @include bem.elem('check-icon') { 70 @include bem.elem('check-icon') {
71 position: absolute; 71 position: absolute;
72 inset-block-start: calc(1 * props.get(vars.$border-width)); 72 inset-block-start: calc(1 * props.get(vars.$border-width));
73 inset-inline-start: calc(1 * props.get(vars.$border-width)); 73 inset-inline-start: calc(1 * props.get(vars.$border-width));
74 z-index: 2; 74 z-index: 2;
75 display: block; 75 display: block;
76 inline-size: calc(100% - 2 * props.get(vars.$border-width)); 76 inline-size: calc(100% - 2 * props.get(vars.$border-width));
77 block-size: calc(100% - 2 * props.get(vars.$border-width)); 77 block-size: calc(100% - 2 * props.get(vars.$border-width));
78 margin: 0; 78 margin: 0;
79 color: props.get(vars.$box-bg-color); 79 color: props.get(vars.$box-bg-color);
80 stroke-width: fn.px-to-rem(3px); 80 stroke-width: fn.px-to-rem(3px);
81 transition: transform .2s ease; 81 transform: scale(0);
82 transform: scale(0); 82 transform-origin: 40% 90%;
83 transform-origin: 40% 90%; 83 transition: transform .2s ease;
84 } 84 }
85 85
86 @include bem.elem('label') { 86 @include bem.elem('label') {
87 margin-inline-start: calc(props.get(vars.$label-gap) - props.get(vars.$key-focus--border-offset)); 87 margin-inline-start: calc(props.get(vars.$label-gap) - props.get(vars.$key-focus--border-offset));
88 } 88 }
89 89
90 @include bem.elem('native') { 90 @include bem.elem('native') {
91 position: absolute; 91 position: absolute;
92 inset-block-start: 0; 92 inset-block-start: 0;
93 inset-inline-start: 0; 93 inset-inline-start: 0;
94 z-index: -1; 94 z-index: -1;
95 inline-size: 100%; 95 inline-size: 100%;
96 block-size: 100%; 96 block-size: 100%;
97 padding: 0; 97 padding: 0;
98 margin: 0; 98 margin: 0;
99 overflow: hidden; 99 overflow: hidden;
100 appearance: none; 100 appearance: none;
101 border-radius: props.get(vars.$rounding); 101 border-radius: props.get(vars.$rounding);
102 102
103 &:hover, 103 &:hover,
104 &:focus-visible { 104 &:focus-visible {
105 @include bem.sibling-elem('label') { 105 @include bem.sibling-elem('label') {
106 color: props.get(vars.$hover--label-color); 106 color: props.get(vars.$hover--label-color);
107 } 107 }
108 108
109 @include bem.sibling-elem('box') { 109 @include bem.sibling-elem('box') {
110 background-color: props.get(vars.$hover--box-border-color); 110 background-color: props.get(vars.$hover--box-border-color);
111 } 111 }
112 } 112 }
113 113
114 &:checked { 114 &:checked {
115 @include bem.sibling-elem('box') { 115 @include bem.sibling-elem('box') {
116 &::before { 116 &::before {
117 transform: scale(0); 117 transform: scale(0);
118 } 118 }
119 119
120 @include bem.elem('check-icon') { 120 @include bem.elem('check-icon') {
121 transform: scale(1); 121 transform: scale(1);
122 } 122 }
123 } 123 }
124 } 124 }
125 125
126 &:indeterminate { 126 &:indeterminate {
127 @include bem.sibling-elem('box') { 127 @include bem.sibling-elem('box') {
128 &::before { 128 &::before {
129 transform: scale(0); 129 transform: scale(0);
130 } 130 }
131 131
132 &::after { 132 &::after {
133 transform: scale(1); 133 transform: scale(1);
134 } 134 }
135 135
136 @include bem.elem('check-icon') { 136 @include bem.elem('check-icon') {
137 transform: scale(0); 137 transform: scale(0);
138 } 138 }
139 } 139 }
140 } 140 }
141 141
142 &:disabled { 142 &:disabled {
143 @include bem.sibling-elem('label') { 143 @include bem.sibling-elem('label') {
144 color: props.get(vars.$disabled--label-color); 144 color: props.get(vars.$disabled--label-color);
145 } 145 }
146 146
147 @include bem.sibling-elem('box') { 147 @include bem.sibling-elem('box') {
148 background-color: props.get(vars.$disabled--box-border-color); 148 background-color: props.get(vars.$disabled--box-border-color);
149 149
150 &::before { 150 &::before {
151 background-color: props.get(vars.$disabled--box-bg-color); 151 background-color: props.get(vars.$disabled--box-bg-color);
152 } 152 }
153 } 153 }
154 } 154 }
155 155
156 &:focus-visible { 156 &:focus-visible {
157 @include bem.sibling-elem('label') { 157 @include bem.sibling-elem('label') {
158 color: props.get(vars.$key-focus--label-color); 158 color: props.get(vars.$key-focus--label-color);
159 } 159 }
160 160
161 @include bem.sibling-elem('box') { 161 @include bem.sibling-elem('box') {
162 outline: props.get(vars.$key-focus--border-color) solid props.get(vars.$key-focus--border-width); 162 outline: props.get(vars.$key-focus--border-color) solid props.get(vars.$key-focus--border-width);
163 box-shadow: 163 box-shadow:
164 0 164 0
165 0 165 0
166 0 166 0
167 calc(props.get(vars.$key-focus--border-width) + props.get(vars.$key-focus--outline-width)) 167 calc(props.get(vars.$key-focus--border-width) + props.get(vars.$key-focus--outline-width))
168 props.get(vars.$key-focus--outline-color); 168 props.get(vars.$key-focus--outline-color);
169 } 169 }
170 } 170 }
171 } 171 }
172 172
173 @include bem.modifier('standalone') { 173 @include bem.modifier('standalone') {
174 @include bem.elem('box') { 174 @include bem.elem('box') {
175 margin-block-start: 0; 175 margin-block-start: 0;
176 } 176 }
177 } 177 }
178 178
179 @include bem.modifier('accent') { 179 @include bem.modifier('accent') {
180 @include bem.elem('native') { 180 @include bem.elem('native') {
181 &:checked { 181 &:checked {
182 @include bem.sibling-elem('box') { 182 @include bem.sibling-elem('box') {
183 background-color: props.get(vars.$accent--box-border-color); 183 background-color: props.get(vars.$accent--box-border-color);
184 } 184 }
185 185
186 &:hover, 186 &:hover,
187 &:focus-visible { 187 &:focus-visible {
188 @include bem.sibling-elem('box') { 188 @include bem.sibling-elem('box') {
189 background-color: props.get(vars.$accent--hover--box-border-color); 189 background-color: props.get(vars.$accent--hover--box-border-color);
190 } 190 }
191 } 191 }
192 } 192 }
193 193
194 &:indeterminate { 194 &:indeterminate {
195 @include bem.sibling-elem('box') { 195 @include bem.sibling-elem('box') {
196 background-color: props.get(vars.$accent--box-border-color); 196 background-color: props.get(vars.$accent--box-border-color);
197 } 197 }
198 198
199 &:hover, 199 &:hover,
200 &:focus-visible { 200 &:focus-visible {
201 @include bem.sibling-elem('box') { 201 @include bem.sibling-elem('box') {
202 background-color: props.get(vars.$accent--hover--box-border-color); 202 background-color: props.get(vars.$accent--hover--box-border-color);
203 } 203 }
204 } 204 }
205 } 205 }
206 206
207 &:disabled { 207 &:disabled {
208 @include bem.sibling-elem('box') { 208 @include bem.sibling-elem('box') {
209 background-color: props.get(vars.$disabled--box-border-color); 209 background-color: props.get(vars.$disabled--box-border-color);
210 210
211 &::before { 211 &::before {
212 background-color: props.get(vars.$disabled--box-bg-color); 212 background-color: props.get(vars.$disabled--box-bg-color);
213 } 213 }
214 } 214 }
215 215
216 &:checked { 216 &:checked {
217 @include bem.sibling-elem('box') { 217 @include bem.sibling-elem('box') {
218 background-color: props.get(vars.$disabled--box-border-color); 218 background-color: props.get(vars.$disabled--box-border-color);
219 } 219 }
220 } 220 }
221 221
222 &:indeterminate { 222 &:indeterminate {
223 @include bem.sibling-elem('box') { 223 @include bem.sibling-elem('box') {
224 background-color: props.get(vars.$disabled--box-border-color); 224 background-color: props.get(vars.$disabled--box-border-color);
225 } 225 }
226 } 226 }
227 } 227 }
228 } 228 }
229 } 229 }
230 } 230 }
231} 231}
diff --git a/src/objects/_checkbox.vars.scss b/src/objects/_checkbox.vars.scss
index aee26e6..25a0d3d 100644
--- a/src/objects/_checkbox.vars.scss
+++ b/src/objects/_checkbox.vars.scss
@@ -7,7 +7,7 @@ $label-gap: props.def(--o-checkbox--label-gap, props.get(core.$size--125))
7$border-width: props.def(--o-checkbox--border-width, props.get(core.$border-width--medium)) !default; 7$border-width: props.def(--o-checkbox--border-width, props.get(core.$border-width--medium)) !default;
8$pad-i: props.def(--o-checkbox--pad-i, props.get(core.$size--65)) !default; 8$pad-i: props.def(--o-checkbox--pad-i, props.get(core.$size--65)) !default;
9$pad-b: props.def(--o-checkbox--pad-b, props.get(core.$size--65)) !default; 9$pad-b: props.def(--o-checkbox--pad-b, props.get(core.$size--65)) !default;
10$rounding: props.def(--o-checkbox--rounding, props.get(core.$rounding)) !default; 10$rounding: props.def(--o-checkbox--rounding, props.get(core.$rounding--sm)) !default;
11$spacing-sibling: props.def(--o-checkbox--spacing-sibling, props.get(core.$size--300)) !default; 11$spacing-sibling: props.def(--o-checkbox--spacing-sibling, props.get(core.$size--300)) !default;
12 12
13$key-focus--border-width: props.def(--o-checkbox--key-focus--border-width, props.get(core.$key-focus--border-width)) !default; 13$key-focus--border-width: props.def(--o-checkbox--key-focus--border-width, props.get(core.$key-focus--border-width)) !default;
diff --git a/src/objects/_divider.scss b/src/objects/_divider.scss
index 65f1718..27af173 100644
--- a/src/objects/_divider.scss
+++ b/src/objects/_divider.scss
@@ -10,138 +10,195 @@
10@use 'divider.vars' as vars; 10@use 'divider.vars' as vars;
11 11
12@mixin styles { 12@mixin styles {
13 @include materialize-at-root(meta.module-variables('vars')); 13 @include materialize-at-root(meta.module-variables('vars'));
14 14
15 @include bem.object('divider') { 15 @include bem.object('divider') {
16 display: flex; 16 display: flex;
17 flex: 0 0 auto; 17 flex: 0 0 auto;
18 flex-direction: row; 18 flex-direction: row;
19 align-items: center; 19 align-items: center;
20 block-size: 1em; 20 block-size: 1em;
21 margin-block: props.get(vars.$margin-b); 21 margin-block: props.get(vars.$margin-b);
22 font-size: props.get(vars.$strong--label-font-size); 22 font-size: props.get(vars.$strong--label-font-size);
23 font-weight: 700; 23 font-weight: 700;
24 line-height: 1; 24 line-height: 1;
25 color: props.get(vars.$strong--label-color); 25 color: props.get(vars.$strong--label-color);
26 text-transform: uppercase; 26 text-transform: uppercase;
27 letter-spacing: .5px; 27 letter-spacing: .5px;
28 background-color: transparent; 28 background-color: transparent;
29 29
30 &::before, 30 &::before,
31 &::after { 31 &::after {
32 flex: 1 1 auto; 32 flex: 1 1 auto;
33 inline-size: 100%; 33 inline-size: 100%;
34 block-size: props.get(vars.$strong--border-width); 34 block-size: props.get(vars.$strong--border-width);
35 content: ''; 35 content: '';
36 background-color: props.get(vars.$strong--bg-color); 36 background-color: props.get(vars.$strong--bg-color);
37 } 37 }
38 38
39 &::before { 39 &::before {
40 display: block; 40 display: block;
41 } 41 }
42 42
43 @include bem.elem('label') { 43 @include bem.elem('label') {
44 flex: 0 0 auto; 44 flex: 0 0 auto;
45 } 45 }
46 46
47 @include bem.modifier('vertical') { 47 @include bem.modifier('vertical') {
48 align-self: stretch; 48 align-self: stretch;
49 inline-size: 1px; 49 inline-size: props.get(vars.$vertical--border-width);
50 block-size: auto; 50 block-size: auto;
51 margin-block: 0; 51 margin-block: 0;
52 background-color: props.get(vars.$faint--bg-color); 52 background-color: props.get(vars.$strong--bg-color);
53 53
54 &::before, 54 &::before,
55 &::after { 55 &::after {
56 display: none; 56 display: none;
57 } 57 }
58 } 58 }
59 59
60 @include bem.modifier('medium') { 60 @include bem.modifier('dot') {
61 font-size: props.get(vars.$medium--label-font-size); 61 align-self: center;
62 font-weight: 500; 62 inline-size: props.get(vars.$dot--size);
63 color: props.get(vars.$medium--label-color); 63 block-size: props.get(vars.$dot--size);
64 margin-block: 0;
65 background-color: props.get(vars.$strong--bg-color);
66 border-radius: props.get(vars.$dot--size);
64 67
65 &::before, 68 &::before,
66 &::after { 69 &::after {
67 block-size: props.get(vars.$medium--border-width); 70 display: none;
68 background-color: props.get(vars.$medium--bg-color); 71 }
69 } 72 }
70 }
71 73
72 @include bem.modifier('faint') { 74 @include bem.modifier('medium') {
73 font-size: props.get(vars.$faint--label-font-size); 75 font-size: props.get(vars.$medium--label-font-size);
74 font-weight: 500; 76 font-weight: 500;
75 color: props.get(vars.$faint--label-color); 77 color: props.get(vars.$medium--label-color);
76 78
77 &::before, 79 &::before,
78 &::after { 80 &::after {
79 block-size: props.get(vars.$faint--border-width); 81 block-size: props.get(vars.$medium--border-width);
80 background-color: props.get(vars.$faint--bg-color); 82 background-color: props.get(vars.$medium--bg-color);
81 } 83 }
82 84
83 @include bem.modifier('vertical') { 85 @include bem.modifier('vertical') {
84 background-color: props.get(vars.$vertical--faint--bg-color); 86 background-color: props.get(vars.$medium--bg-color);
85 } 87 }
86 }
87 88
88 @include bem.modifier('labelled') { 89 @include bem.modifier('dot') {
89 &::before { 90 background-color: props.get(vars.$medium--bg-color);
90 margin-inline-end: 1em; 91 }
91 } 92 }
92 93
93 &::after { 94 @include bem.modifier('quiet') {
94 display: block; 95 font-size: props.get(vars.$quiet--label-font-size);
95 margin-inline-start: 1em; 96 font-weight: 500;
96 } 97 color: props.get(vars.$quiet--label-color);
97 }
98 98
99 @each $theme in map.keys(props.get(vars.$themes)) { 99 &::before,
100 @include bem.modifier(string.slice($theme, 3)) { 100 &::after {
101 &::before, 101 block-size: props.get(vars.$quiet--border-width);
102 &::after { 102 background-color: props.get(vars.$quiet--bg-color);
103 background-color: props.get(vars.$themes, $theme, --bg); 103 }
104 }
105 104
106 @include bem.elem('label') { 105 @include bem.modifier('vertical') {
107 color: props.get(vars.$themes, $theme, --label); 106 background-color: props.get(vars.$vertical--quiet--bg-color);
108 } 107 }
109 }
110 }
111 108
112 @each $theme in map.keys(props.get(vars.$static-themes)) { 109 @include bem.modifier('dot') {
113 @include bem.modifier(string.slice($theme, 3)) { 110 background-color: props.get(vars.$dot--quiet--bg-color);
114 &::before, 111 }
115 &::after { 112 }
116 background-color: props.get(vars.$static-themes, $theme, --strong, --bg);
117 }
118 113
119 @include bem.elem('label') { 114 @include bem.modifier('faint') {
120 color: props.get(vars.$static-themes, $theme, --strong, --label); 115 font-size: props.get(vars.$faint--label-font-size);
121 } 116 font-weight: 500;
117 color: props.get(vars.$faint--label-color);
122 118
123 @include bem.modifier('medium') { 119 &::before,
124 &::before, 120 &::after {
125 &::after { 121 block-size: props.get(vars.$faint--border-width);
126 background-color: props.get(vars.$static-themes, $theme, --medium, --bg); 122 background-color: props.get(vars.$faint--bg-color);
127 } 123 }
124
125 @include bem.modifier('vertical') {
126 background-color: props.get(vars.$vertical--quiet--bg-color);
127 }
128
129 @include bem.modifier('dot') {
130 background-color: props.get(vars.$dot--quiet--bg-color);
131 }
132 }
133
134 @include bem.modifier('labelled') {
135 &::before {
136 margin-inline-end: 1em;
137 }
138
139 &::after {
140 display: block;
141 margin-inline-start: 1em;
142 }
143 }
144
145 @each $theme in map.keys(props.get(vars.$themes)) {
146 @include bem.modifier(string.slice($theme, 3)) {
147 &::before,
148 &::after {
149 background-color: props.get(vars.$themes, $theme, --bg);
150 }
151
152 @include bem.elem('label') {
153 color: props.get(vars.$themes, $theme, --label);
154 }
155 }
156 }
157
158 @each $theme in map.keys(props.get(vars.$static-themes)) {
159 @include bem.modifier(string.slice($theme, 3)) {
160 &::before,
161 &::after {
162 background-color: props.get(vars.$static-themes, $theme, --strong, --bg);
163 }
164
165 @include bem.elem('label') {
166 color: props.get(vars.$static-themes, $theme, --strong, --label);
167 }
168
169 @include bem.modifier('medium') {
170 &::before,
171 &::after {
172 background-color: props.get(vars.$static-themes, $theme, --medium, --bg);
173 }
174
175 @include bem.elem('label') {
176 color: props.get(vars.$static-themes, $theme, --medium, --label);
177 }
178 }
179
180 @include bem.modifier('quiet') {
181 &::before,
182 &::after {
183 background-color: props.get(vars.$static-themes, $theme, --quiet, --bg);
184 }
128 185
129 @include bem.elem('label') { 186 @include bem.elem('label') {
130 color: props.get(vars.$static-themes, $theme, --medium, --label); 187 color: props.get(vars.$static-themes, $theme, --quiet, --label);
131 } 188 }
132 } 189 }
133 190
134 @include bem.modifier('faint') { 191 @include bem.modifier('faint') {
135 &::before, 192 &::before,
136 &::after { 193 &::after {
137 background-color: props.get(vars.$static-themes, $theme, --faint, --bg); 194 background-color: props.get(vars.$static-themes, $theme, --faint, --bg);
138 } 195 }
139 196
140 @include bem.elem('label') { 197 @include bem.elem('label') {
141 color: props.get(vars.$static-themes, $theme, --faint, --label); 198 color: props.get(vars.$static-themes, $theme, --faint, --label);
142 } 199 }
143 } 200 }
144 } 201 }
145 } 202 }
146 } 203 }
147} 204}
diff --git a/src/objects/_divider.vars.scss b/src/objects/_divider.vars.scss
index 1117fd5..688fbb3 100644
--- a/src/objects/_divider.vars.scss
+++ b/src/objects/_divider.vars.scss
@@ -3,7 +3,9 @@
3@use 'iro-sass/src/props'; 3@use 'iro-sass/src/props';
4@use '../core.vars' as core; 4@use '../core.vars' as core;
5 5
6$margin-b: props.def(--o-divider--size, props.get(core.$size--85)) !default; 6$margin-b: props.def(--o-divider--size, props.get(core.$size--85)) !default;
7$vertical--border-width: props.def(--o-divider--vertical--width, props.get(core.$border-width--thin)) !default;
8$dot--size: props.def(--o-divider--dot--size, props.get(core.$size--50)) !default;
7 9
8$strong--border-width: props.def(--o-divider--strong--border-width, props.get(core.$border-width--thick)) !default; 10$strong--border-width: props.def(--o-divider--strong--border-width, props.get(core.$border-width--thick)) !default;
9$strong--label-font-size: props.def(--o-divider--strong--label-font-size, props.get(core.$font-size--100)) !default; 11$strong--label-font-size: props.def(--o-divider--strong--label-font-size, props.get(core.$font-size--100)) !default;
@@ -11,6 +13,9 @@ $strong--label-font-size: props.def(--o-divider--strong--label-font-size, props.
11$medium--border-width: props.def(--o-divider--medium--border-width, props.get(core.$border-width--medium)) !default; 13$medium--border-width: props.def(--o-divider--medium--border-width, props.get(core.$border-width--medium)) !default;
12$medium--label-font-size: props.def(--o-divider--medium--label-font-size, props.get(core.$font-size--75)) !default; 14$medium--label-font-size: props.def(--o-divider--medium--label-font-size, props.get(core.$font-size--75)) !default;
13 15
16$quiet--border-width: props.def(--o-divider--quiet--border-width, props.get(core.$border-width--thin)) !default;
17$quiet--label-font-size: props.def(--o-divider--quiet--label-font-size, props.get(core.$font-size--50)) !default;
18
14$faint--border-width: props.def(--o-divider--faint--border-width, props.get(core.$border-width--thin)) !default; 19$faint--border-width: props.def(--o-divider--faint--border-width, props.get(core.$border-width--thin)) !default;
15$faint--label-font-size: props.def(--o-divider--faint--label-font-size, props.get(core.$font-size--50)) !default; 20$faint--label-font-size: props.def(--o-divider--faint--label-font-size, props.get(core.$font-size--50)) !default;
16 21
@@ -20,46 +25,55 @@ $strong--label-color: props.def(--o-divider--strong--label-color, props.get(core
20$medium--bg-color: props.def(--o-divider--medium--bg-color, props.get(core.$theme, --border), 'color') !default; 25$medium--bg-color: props.def(--o-divider--medium--bg-color, props.get(core.$theme, --border), 'color') !default;
21$medium--label-color: props.def(--o-divider--medium--label-color, props.get(core.$theme, --text-mute), 'color') !default; 26$medium--label-color: props.def(--o-divider--medium--label-color, props.get(core.$theme, --text-mute), 'color') !default;
22 27
23$faint--bg-color: props.def(--o-divider--faint--bg-color, props.get(core.$theme, --border), 'color') !default; 28$quiet--bg-color: props.def(--o-divider--quiet--bg-color, props.get(core.$theme, --border), 'color') !default;
24$faint--label-color: props.def(--o-divider--faint--label-color, props.get(core.$theme, --text-mute-more), 'color') !default; 29$quiet--label-color: props.def(--o-divider--quiet--label-color, props.get(core.$theme, --text-mute-more), 'color') !default;
30
31$faint--bg-color: props.def(--o-divider--faint--bg-color, props.get(core.$theme, --border-mute), 'color') !default;
32$faint--label-color: props.def(--o-divider--faint--label-color, props.get(core.$theme, --text-disabled), 'color') !default;
33
34$vertical--quiet--bg-color: props.def(--o-divider--vertical--quiet--bg-color, props.get(core.$theme, --border-mute), 'color') !default;
25 35
26$vertical--faint--bg-color: props.def(--o-divider--faint--bg-color, props.get(core.$theme, --border-mute), 'color') !default; 36$dot--quiet--bg-color: props.def(--o-divider--dot--quiet--bg-color, props.get(core.$theme, --border-mute), 'color') !default;
27 37
28$static-themes: props.def(--o-divider, (), 'color'); 38$static-themes: props.def(--o-divider, (), 'color');
29 39
30@each $theme in map.keys(props.get(core.$transparent-colors)) { 40@each $theme in map.keys(props.get(core.$transparent-colors)) {
31 $button-theme: --static-#{string.slice($theme, 3)}; 41 $button-theme: --static-#{string.slice($theme, 3)};
32 42
33 $static-themes: props.merge($static-themes, ( 43 $static-themes: props.merge($static-themes, (
34 $button-theme: ( 44 $button-theme: (
35 --strong: ( 45 --strong: (
36 --bg: props.get(core.$transparent-colors, $theme, --800), 46 --bg: props.get(core.$transparent-colors, $theme, --800),
37 --label: props.get(core.$transparent-colors, $theme, --900), 47 --label: props.get(core.$transparent-colors, $theme, --900),
38 ), 48 ),
39 --medium: ( 49 --medium: (
40 --bg: props.get(core.$transparent-colors, $theme, --300), 50 --bg: props.get(core.$transparent-colors, $theme, --300),
41 --label: props.get(core.$transparent-colors, $theme, --500), 51 --label: props.get(core.$transparent-colors, $theme, --500),
42 ), 52 ),
43 --faint: ( 53 --quiet: (
44 --bg: props.get(core.$transparent-colors, $theme, --300), 54 --bg: props.get(core.$transparent-colors, $theme, --300),
45 --label: props.get(core.$transparent-colors, $theme, --500), 55 --label: props.get(core.$transparent-colors, $theme, --500),
46 ), 56 ),
47 ) 57 --faint: (
48 )); 58 --bg: props.get(core.$transparent-colors, $theme, --200),
59 --label: props.get(core.$transparent-colors, $theme, --400),
60 ),
61 )
62 ));
49} 63}
50 64
51$themes-config: ( 65$themes-config: (
52 accent: --accent, 66 accent: --accent,
53 negative: --negative, 67 negative: --negative,
54) !default; 68) !default;
55 69
56$themes: props.def(--o-divider, (), 'color'); 70$themes: props.def(--o-divider, (), 'color');
57 71
58@each $theme, $key in $themes-config { 72@each $theme, $key in $themes-config {
59 $themes: props.merge($themes, ( 73 $themes: props.merge($themes, (
60 --#{$theme}: ( 74 --#{$theme}: (
61 --bg: props.get(core.$theme, $key, --800), 75 --bg: props.get(core.$theme, $key, --800),
62 --label: props.get(core.$theme, $key, --1000), 76 --label: props.get(core.$theme, $key, --1000),
63 ) 77 )
64 )); 78 ));
65} 79}
diff --git a/src/objects/_emoji.scss b/src/objects/_emoji.scss
index ce2dfa7..fd36535 100644
--- a/src/objects/_emoji.scss
+++ b/src/objects/_emoji.scss
@@ -8,43 +8,43 @@
8@use 'emoji.vars' as vars; 8@use 'emoji.vars' as vars;
9 9
10@mixin styles { 10@mixin styles {
11 @include materialize-at-root(meta.module-variables('vars')); 11 @include materialize-at-root(meta.module-variables('vars'));
12 12
13 @include bem.object('emoji') { 13 @include bem.object('emoji') {
14 position: relative; 14 position: relative;
15 display: inline-block; 15 display: inline-block;
16 inline-size: calc(props.get(vars.$size)); 16 inline-size: calc(props.get(vars.$size));
17 block-size: calc(props.get(vars.$size)); 17 block-size: calc(props.get(vars.$size));
18 padding: calc(props.get(vars.$pad)); 18 padding: calc(props.get(vars.$pad));
19 margin: calc(-1 * props.get(vars.$pad)); 19 margin: calc(-1 * props.get(vars.$pad));
20 vertical-align: props.get(vars.$valign); 20 vertical-align: props.get(vars.$valign);
21 object-fit: contain; 21 object-fit: contain;
22 22
23 @include bem.modifier('icon') { 23 @include bem.modifier('icon') {
24 margin: calc(-1 * props.get(vars.$pad) - .5 * (props.get(vars.$size) - props.get(icon.$size))); 24 margin: calc(-1 * props.get(vars.$pad) - .5 * (props.get(vars.$size) - props.get(icon.$size)));
25 vertical-align: props.get(icon.$valign); 25 vertical-align: props.get(icon.$valign);
26 } 26 }
27 27
28 @each $mod, $size, $valign in vars.$sizes { 28 @each $mod, $size, $valign in vars.$sizes {
29 @include bem.modifier($mod) { 29 @include bem.modifier($mod) {
30 inline-size: props.get($size); 30 inline-size: props.get($size);
31 block-size: props.get($size); 31 block-size: props.get($size);
32 vertical-align: props.get($valign); 32 vertical-align: props.get($valign);
33 33
34 @include bem.modifier('icon') { 34 @include bem.modifier('icon') {
35 margin: calc(-1 * props.get(vars.$pad) - .5 * (props.get($size) - props.get(icon.$size))); 35 margin: calc(-1 * props.get(vars.$pad) - .5 * (props.get($size) - props.get(icon.$size)));
36 } 36 }
37 } 37 }
38 } 38 }
39 39
40 @include bem.modifier('zoomable') { 40 @include bem.modifier('zoomable') {
41 border-radius: calc(props.get(vars.$rounding) / props.get(vars.$zoom)); 41 border-radius: calc(props.get(vars.$rounding) / props.get(vars.$zoom));
42 transition: transform .2s ease, background-color .2s ease; 42 transition: transform .2s ease, background-color .2s ease;
43 43
44 &:hover { 44 &:hover {
45 background-color: props.get(vars.$bg-color); 45 background-color: props.get(vars.$bg-color);
46 transform: scale(props.get(vars.$zoom)); 46 transform: scale(props.get(vars.$zoom));
47 } 47 }
48 } 48 }
49 } 49 }
50} 50}
diff --git a/src/objects/_emoji.vars.scss b/src/objects/_emoji.vars.scss
index fbfb935..b7a8a43 100644
--- a/src/objects/_emoji.vars.scss
+++ b/src/objects/_emoji.vars.scss
@@ -4,7 +4,7 @@
4 4
5$size: props.def(--o-emoji--size, calc(1 / 14 * 18em)) !default; 5$size: props.def(--o-emoji--size, calc(1 / 14 * 18em)) !default;
6$pad: props.def(--o-emoji--pad, .3em) !default; 6$pad: props.def(--o-emoji--pad, .3em) !default;
7$rounding: props.def(--o-emoji--rounding, props.get(core.$rounding)) !default; 7$rounding: props.def(--o-emoji--rounding, props.get(core.$rounding--sm)) !default;
8$zoom: props.def(--o-emoji--zoom, 3) !default; 8$zoom: props.def(--o-emoji--zoom, 3) !default;
9$valign: props.def(--o-emoji--valign, -.25em) !default; 9$valign: props.def(--o-emoji--valign, -.25em) !default;
10 10
@@ -18,9 +18,9 @@ $size--200: props.def(--o-emoji--200--size, calc(1 / 14 * 38em)) !default;
18$valign--200: props.def(--o-emoji--200--valign, -1em) !default; 18$valign--200: props.def(--o-emoji--200--valign, -1em) !default;
19 19
20$sizes: ( 20$sizes: (
21 '125' $size--125 $valign--125, 21 '125' $size--125 $valign--125,
22 '150' $size--150 $valign--150, 22 '150' $size--150 $valign--150,
23 '200' $size--200 $valign--200, 23 '200' $size--200 $valign--200,
24) !default; 24) !default;
25 25
26$bg-color: props.def(--o-emoji--bg-color, props.get(core.$theme, --border-mute), 'color') !default; 26$bg-color: props.def(--o-emoji--bg-color, props.get(core.$theme, --border-mute), 'color') !default;
diff --git a/src/objects/_field-label.scss b/src/objects/_field-label.scss
index 564ab2b..aa12eb5 100644
--- a/src/objects/_field-label.scss
+++ b/src/objects/_field-label.scss
@@ -7,70 +7,70 @@
7@use 'field-label.vars' as vars; 7@use 'field-label.vars' as vars;
8 8
9@mixin styles { 9@mixin styles {
10 @include materialize-at-root(meta.module-variables('vars')); 10 @include materialize-at-root(meta.module-variables('vars'));
11 11
12 @include bem.object('field-label') { 12 @include bem.object('field-label') {
13 @include bem.elem('label') { 13 @include bem.elem('label') {
14 display: block; 14 display: block;
15 flex: 0 0 auto; 15 flex: 0 0 auto;
16 padding-inline-end: props.get(vars.$spacing-i); 16 padding-inline-end: props.get(vars.$spacing-i);
17 font-size: props.get(vars.$label-font-size); 17 font-size: props.get(vars.$label-font-size);
18 font-weight: 400; 18 font-weight: 400;
19 line-height: 1.3; 19 line-height: 1.3;
20 color: props.get(vars.$label-color); 20 color: props.get(vars.$label-color);
21 21
22 @include bem.next-elem('content') { 22 @include bem.next-elem('content') {
23 margin-block-start: props.get(vars.$spacing-b); 23 margin-block-start: props.get(vars.$spacing-b);
24 } 24 }
25 } 25 }
26 26
27 @include bem.elem('content') { 27 @include bem.elem('content') {
28 display: block; 28 display: block;
29 flex: 1 1 auto; 29 flex: 1 1 auto;
30 } 30 }
31 31
32 @include bem.elem('hint') { 32 @include bem.elem('hint') {
33 display: block; 33 display: block;
34 margin-block-start: props.get(vars.$spacing-b); 34 margin-block-start: props.get(vars.$spacing-b);
35 font-size: props.get(vars.$hint-font-size); 35 font-size: props.get(vars.$hint-font-size);
36 color: props.get(vars.$hint-color); 36 color: props.get(vars.$hint-color);
37 } 37 }
38 38
39 @include bem.is('invalid') { 39 @include bem.is('invalid') {
40 @include bem.elem('hint') { 40 @include bem.elem('hint') {
41 color: props.get(vars.$error-hint-color); 41 color: props.get(vars.$error-hint-color);
42 } 42 }
43 } 43 }
44 44
45 @include bem.is('disabled') { 45 @include bem.is('disabled') {
46 @include bem.elem('label', 'hint') { 46 @include bem.elem('label', 'hint') {
47 color: props.get(vars.$disabled-color); 47 color: props.get(vars.$disabled-color);
48 } 48 }
49 } 49 }
50 50
51 @include bem.modifier('align-start', 'align-end') { 51 @include bem.modifier('align-start', 'align-end') {
52 display: flex; 52 display: flex;
53 align-items: baseline; 53 align-items: baseline;
54 54
55 @include bem.elem('label') { 55 @include bem.elem('label') {
56 display: inline-block; 56 display: inline-block;
57 57
58 @include bem.next-elem('content') { 58 @include bem.next-elem('content') {
59 margin-block-start: 0; 59 margin-block-start: 0;
60 } 60 }
61 } 61 }
62 } 62 }
63 63
64 @include bem.modifier('align-start') { 64 @include bem.modifier('align-start') {
65 @include bem.elem('label') { 65 @include bem.elem('label') {
66 text-align: start; 66 text-align: start;
67 } 67 }
68 } 68 }
69 69
70 @include bem.modifier('align-end') { 70 @include bem.modifier('align-end') {
71 @include bem.elem('label') { 71 @include bem.elem('label') {
72 text-align: end; 72 text-align: end;
73 } 73 }
74 } 74 }
75 } 75 }
76} 76}
diff --git a/src/objects/_figure.scss b/src/objects/_figure.scss
new file mode 100644
index 0000000..27e0f6a
--- /dev/null
+++ b/src/objects/_figure.scss
@@ -0,0 +1,26 @@
1@use 'sass:meta';
2@use 'iro-sass/src/bem';
3@use 'iro-sass/src/props';
4@use '../props' as *;
5
6@forward 'figure.vars';
7@use 'figure.vars' as vars;
8
9@mixin styles {
10 @include materialize-at-root(meta.module-variables('vars'));
11
12 @include bem.object('figure') {
13 @include bem.elem('caption') {
14 padding-block: props.get(vars.$pad-b);
15 font-size: props.get(vars.$font-size);
16 color: props.get(vars.$text-color);
17 border-block-end: props.get(vars.$border-width) solid props.get(vars.$border-color);
18
19 &::before {
20 display: block;
21 margin-block: -100em 100em;
22 content: '';
23 }
24 }
25 }
26}
diff --git a/src/objects/_figure.vars.scss b/src/objects/_figure.vars.scss
new file mode 100644
index 0000000..78f5d15
--- /dev/null
+++ b/src/objects/_figure.vars.scss
@@ -0,0 +1,9 @@
1@use 'iro-sass/src/props';
2@use '../core.vars' as core;
3
4$pad-b: props.def(--o-figure--pad-b, props.get(core.$size--100)) !default;
5$border-width: props.def(--o-figure--border-width, props.get(core.$border-width--thin)) !default;
6$font-size: props.def(--o-figure--font-size, props.get(core.$font-size--100)) !default;
7
8$text-color: props.def(--o-figure--text-color, props.get(core.$theme, --text-mute-more), 'color') !default;
9$border-color: props.def(--o-figure--border-color, props.get(core.$theme, --border), 'color') !default;
diff --git a/src/objects/_heading.scss b/src/objects/_heading.scss
index f5932f5..d27b595 100644
--- a/src/objects/_heading.scss
+++ b/src/objects/_heading.scss
@@ -7,54 +7,54 @@
7@use 'heading.vars' as vars; 7@use 'heading.vars' as vars;
8 8
9@mixin styles { 9@mixin styles {
10 @include materialize-at-root(meta.module-variables('vars')); 10 @include materialize-at-root(meta.module-variables('vars'));
11 11
12 @include bem.object('heading') { 12 @include bem.object('heading') {
13 display: block; 13 display: block;
14 margin-block-start: props.get(vars.$margin-bs); 14 margin-block-start: props.get(vars.$margin-bs);
15 font-family: props.get(vars.$font-family); 15 font-family: props.get(vars.$font-family);
16 font-weight: props.get(vars.$font-weight); 16 font-weight: props.get(vars.$font-weight);
17 font-feature-settings: props.get(vars.$feature-settings); 17 font-feature-settings: props.get(vars.$feature-settings);
18 line-height: props.get(vars.$line-height); 18 line-height: props.get(vars.$line-height);
19 color: props.get(vars.$text-color); 19 color: props.get(vars.$text-color);
20 text-transform: none; 20 text-transform: none;
21 letter-spacing: normal; 21 letter-spacing: normal;
22 transform: translateX(props.get(vars.$offset));
23 22
24 & + & { 23 & + & {
25 margin-block-start: props.get(vars.$margin-bs-sibling); 24 margin-block-start: props.get(vars.$margin-bs-sibling);
26 } 25 }
27 26
28 @include bem.elem('highlight') { 27 @include bem.elem('highlight') {
29 background-image: linear-gradient(to top, 28 background-image: linear-gradient(to top,
30 transparent .05em, 29 transparent .05em,
31 props.get(vars.$bg-color) .05em, 30 props.get(vars.$bg-color) .05em,
32 props.get(vars.$bg-color) .5em, 31 props.get(vars.$bg-color) .5em,
33 transparent .5em); 32 transparent .5em);
34 } 33 }
35 34
36 @each $mod, $font-family, $line-height, $font-size, $font-weight, $letter-spacing, $feature-settings in vars.$sizes { 35 @each $mod, $font-family, $line-height, $font-size, $font-weight, $letter-spacing, $feature-settings in vars.$sizes {
37 @include bem.modifier($mod) { 36 @include bem.modifier($mod) {
38 font-family: props.get($font-family); 37 font-family: props.get($font-family);
39 font-size: props.get($font-size); 38 font-size: props.get($font-size);
40 font-weight: props.get($font-weight); 39 font-weight: props.get($font-weight);
41 font-feature-settings: props.get($feature-settings); 40 font-feature-settings: props.get($feature-settings);
42 line-height: props.get($line-height); 41 line-height: props.get($line-height);
43 letter-spacing: props.get($letter-spacing); 42 letter-spacing: props.get($letter-spacing);
44 } 43 }
45 } 44 }
46 45
47 @include bem.modifier('display') { 46 @include bem.modifier('display') {
48 @each $mod, $font-family, $line-height, $font-size, $font-weight, $letter-spacing, $feature-settings in vars.$display--sizes { 47 @each $mod, $font-family, $line-height, $font-size, $font-weight, $letter-spacing, $feature-settings in vars.$display--sizes {
49 @include bem.modifier($mod) { 48 @include bem.modifier($mod) {
50 font-family: props.get($font-family); 49 font-family: props.get($font-family);
51 font-size: props.get($font-size); 50 font-size: props.get($font-size);
52 font-weight: props.get($font-weight); 51 font-weight: props.get($font-weight);
53 font-feature-settings: props.get($feature-settings); 52 font-feature-settings: props.get($feature-settings);
54 line-height: props.get($line-height); 53 line-height: props.get($line-height);
55 letter-spacing: props.get($letter-spacing); 54 letter-spacing: props.get($letter-spacing);
56 } 55 transform: translateX(props.get(vars.$offset));
57 } 56 }
58 } 57 }
59 } 58 }
59 }
60} 60}
diff --git a/src/objects/_heading.vars.scss b/src/objects/_heading.vars.scss
index 5cd6767..1d6df26 100644
--- a/src/objects/_heading.vars.scss
+++ b/src/objects/_heading.vars.scss
@@ -5,7 +5,7 @@ $offset: props.def(--o-heading--offset, -.02em) !default;
5$margin-bs: props.def(--o-heading--margin-bs, props.get(core.$size--700)) !default; 5$margin-bs: props.def(--o-heading--margin-bs, props.get(core.$size--700)) !default;
6$margin-bs-sibling: props.def(--o-heading--margin-bs-sibling, props.get(core.$size--325)) !default; 6$margin-bs-sibling: props.def(--o-heading--margin-bs-sibling, props.get(core.$size--325)) !default;
7 7
8$text-color: props.def(--o-heading--text-color, props.get(core.$theme, --heading), 'color'); 8$text-color: props.def(--o-heading--text-color, props.get(core.$theme, --heading), 'color') !default;
9$bg-color: props.def(--o-heading--bg-color, props.get(core.$theme, --base, --50), 'color') !default; 9$bg-color: props.def(--o-heading--bg-color, props.get(core.$theme, --base, --50), 'color') !default;
10 10
11$font-family: props.def(--o-heading--font-family, props.get(core.$font--standard--family)) !default; 11$font-family: props.def(--o-heading--font-family, props.get(core.$font--standard--family)) !default;
@@ -56,12 +56,12 @@ $letter-spacing--xs: props.def(--o-heading--xs--letter-spacing, 1px) !default;
56$feature-settings--xs: props.def(--o-heading--xs--feature-settings, props.get(core.$font--standard--feature-settings)) !default; 56$feature-settings--xs: props.def(--o-heading--xs--feature-settings, props.get(core.$font--standard--feature-settings)) !default;
57 57
58$sizes: ( 58$sizes: (
59 'xs' $font-family--xs $line-height--xs $font-size--xs $font-weight--xs $letter-spacing--xs $feature-settings--xs, 59 'xs' $font-family--xs $line-height--xs $font-size--xs $font-weight--xs $letter-spacing--xs $feature-settings--xs,
60 'sm' $font-family--sm $line-height--sm $font-size--sm $font-weight--sm $letter-spacing--sm $feature-settings--sm, 60 'sm' $font-family--sm $line-height--sm $font-size--sm $font-weight--sm $letter-spacing--sm $feature-settings--sm,
61 'md' $font-family--md $line-height--md $font-size--md $font-weight--md $letter-spacing--md $feature-settings--md, 61 'md' $font-family--md $line-height--md $font-size--md $font-weight--md $letter-spacing--md $feature-settings--md,
62 'lg' $font-family--lg $line-height--lg $font-size--lg $font-weight--lg $letter-spacing--lg $feature-settings--lg, 62 'lg' $font-family--lg $line-height--lg $font-size--lg $font-weight--lg $letter-spacing--lg $feature-settings--lg,
63 'xl' $font-family--xl $line-height--xl $font-size--xl $font-weight--xl $letter-spacing--xl $feature-settings--xl, 63 'xl' $font-family--xl $line-height--xl $font-size--xl $font-weight--xl $letter-spacing--xl $feature-settings--xl,
64 'xxl' $font-family--xxl $line-height--xxl $font-size--xxl $font-weight--xxl $letter-spacing--xxl $feature-settings--xxl, 64 'xxl' $font-family--xxl $line-height--xxl $font-size--xxl $font-weight--xxl $letter-spacing--xxl $feature-settings--xxl,
65) !default; 65) !default;
66 66
67$display--font-family--xxl: props.def(--o-heading--display--xxl--font-family, props.get(core.$font--headline--family)) !default; 67$display--font-family--xxl: props.def(--o-heading--display--xxl--font-family, props.get(core.$font--headline--family)) !default;
@@ -114,10 +114,10 @@ $display--font-size--sm--md: props.def(--o-heading--display--sm--font-size, pro
114$display--font-size--xs--md: props.def(--o-heading--display--xs--font-size, props.get(core.$font-size--50), 'md') !default; 114$display--font-size--xs--md: props.def(--o-heading--display--xs--font-size, props.get(core.$font-size--50), 'md') !default;
115 115
116$display--sizes: ( 116$display--sizes: (
117 'xs' $display--font-family--xs $display--line-height--xs $display--font-size--xs $display--font-weight--xs $display--letter-spacing--xs $display--feature-settings--xs, 117 'xs' $display--font-family--xs $display--line-height--xs $display--font-size--xs $display--font-weight--xs $display--letter-spacing--xs $display--feature-settings--xs,
118 'sm' $display--font-family--sm $display--line-height--sm $display--font-size--sm $display--font-weight--sm $display--letter-spacing--sm $display--feature-settings--sm, 118 'sm' $display--font-family--sm $display--line-height--sm $display--font-size--sm $display--font-weight--sm $display--letter-spacing--sm $display--feature-settings--sm,
119 'md' $display--font-family--md $display--line-height--md $display--font-size--md $display--font-weight--md $display--letter-spacing--md $display--feature-settings--md, 119 'md' $display--font-family--md $display--line-height--md $display--font-size--md $display--font-weight--md $display--letter-spacing--md $display--feature-settings--md,
120 'lg' $display--font-family--lg $display--line-height--lg $display--font-size--lg $display--font-weight--lg $display--letter-spacing--lg $display--feature-settings--lg, 120 'lg' $display--font-family--lg $display--line-height--lg $display--font-size--lg $display--font-weight--lg $display--letter-spacing--lg $display--feature-settings--lg,
121 'xl' $display--font-family--xl $display--line-height--xl $display--font-size--xl $display--font-weight--xl $display--letter-spacing--xl $display--feature-settings--xl, 121 'xl' $display--font-family--xl $display--line-height--xl $display--font-size--xl $display--font-weight--xl $display--letter-spacing--xl $display--feature-settings--xl,
122 'xxl' $display--font-family--xxl $display--line-height--xxl $display--font-size--xxl $display--font-weight--xxl $display--letter-spacing--xxl $display--feature-settings--xxl, 122 'xxl' $display--font-family--xxl $display--line-height--xxl $display--font-size--xxl $display--font-weight--xxl $display--letter-spacing--xxl $display--feature-settings--xxl,
123) !default; 123) !default;
diff --git a/src/objects/_icon.scss b/src/objects/_icon.scss
index 187938e..1941960 100644
--- a/src/objects/_icon.scss
+++ b/src/objects/_icon.scss
@@ -7,19 +7,19 @@
7@use 'icon.vars' as vars; 7@use 'icon.vars' as vars;
8 8
9@mixin styles { 9@mixin styles {
10 @include materialize-at-root(meta.module-variables('vars')); 10 @include materialize-at-root(meta.module-variables('vars'));
11 11
12 @include bem.object('icon') { 12 @include bem.object('icon') {
13 display: inline; 13 display: inline;
14 inline-size: props.get(vars.$size); 14 inline-size: props.get(vars.$size);
15 block-size: props.get(vars.$size); 15 block-size: props.get(vars.$size);
16 vertical-align: props.get(vars.$valign); 16 vertical-align: props.get(vars.$valign);
17 stroke-linecap: round; 17 stroke-width: props.get(vars.$stroke-width);
18 stroke-linejoin: round; 18 stroke-linecap: round;
19 stroke-width: props.get(vars.$stroke-width); 19 stroke-linejoin: round;
20 20
21 @include bem.modifier('block') { 21 @include bem.modifier('block') {
22 display: block; 22 display: block;
23 } 23 }
24 } 24 }
25} 25}
diff --git a/src/objects/_lightbox.scss b/src/objects/_lightbox.scss
index b62c353..b95148f 100644
--- a/src/objects/_lightbox.scss
+++ b/src/objects/_lightbox.scss
@@ -9,127 +9,127 @@
9@use 'lightbox.vars' as vars; 9@use 'lightbox.vars' as vars;
10 10
11@mixin styles { 11@mixin styles {
12 @include materialize-at-root(meta.module-variables('vars')); 12 @include materialize-at-root(meta.module-variables('vars'));
13 13
14 @include bem.object('lightbox') { 14 @include bem.object('lightbox') {
15 flex: 1 1 auto; 15 flex: 1 1 auto;
16 min-block-size: 0; 16 min-block-size: 0;
17 17
18 @include bem.elem('header') { 18 @include bem.elem('header') {
19 display: flex; 19 display: flex;
20 grid-area: header; 20 grid-area: header;
21 align-items: flex-start; 21 align-items: flex-start;
22 padding-block-start: props.get(vars.$pad); 22 padding-block-start: props.get(vars.$pad);
23 padding-inline: props.get(vars.$pad); 23 padding-inline: props.get(vars.$pad);
24 } 24 }
25 25
26 @include bem.elem('img') { 26 @include bem.elem('img') {
27 box-sizing: border-box; 27 box-sizing: border-box;
28 display: block; 28 display: block;
29 grid-area: content; 29 grid-area: content;
30 place-self: center; 30 place-self: center;
31 inline-size: auto; 31 inline-size: auto;
32 max-inline-size: 100%; 32 max-inline-size: 100%;
33 block-size: auto; 33 block-size: auto;
34 max-block-size: props.get(vars.$image--max-height); 34 max-block-size: props.get(vars.$image--max-height);
35 padding: props.get(vars.$pad); 35 padding: props.get(vars.$pad);
36 margin-inline: auto; 36 margin-inline: auto;
37 border-radius: calc(props.get(vars.$pad) + props.get(vars.$image--border-radius)); 37 border-radius: calc(props.get(vars.$pad) + props.get(vars.$image--border-radius));
38 } 38 }
39 39
40 @include bem.elem('thumbnails') { 40 @include bem.elem('thumbnails') {
41 display: none; 41 display: none;
42 grid-area: thumbnails; 42 grid-area: thumbnails;
43 gap: props.get(vars.$thumbnails--spacing); 43 gap: props.get(vars.$thumbnails--spacing);
44 padding: props.get(vars.$pad); 44 padding: props.get(vars.$pad);
45 margin-block-start: calc(-1 * props.get(vars.$pad)); 45 margin-block-start: calc(-1 * props.get(vars.$pad));
46 overflow: auto; 46 overflow: auto;
47 } 47 }
48 48
49 @include bem.elem('close-btn') { 49 @include bem.elem('close-btn') {
50 display: none; 50 display: none;
51 flex: 0 0 auto; 51 flex: 0 0 auto;
52 margin-block-start: calc(-.5 * props.get(vars.$pad)); 52 margin-block-start: calc(-.5 * props.get(vars.$pad));
53 margin-inline: auto calc(-.5 * props.get(vars.$pad)); 53 margin-inline: auto calc(-.5 * props.get(vars.$pad));
54 font-size: props.get(vars.$close-button--font-size); 54 font-size: props.get(vars.$close-button--font-size);
55 } 55 }
56 56
57 @include bem.elem('nav-btn') { 57 @include bem.elem('nav-btn') {
58 position: relative; 58 position: relative;
59 display: none; 59 display: none;
60 align-self: center; 60 align-self: center;
61 overflow: visible; 61 overflow: visible;
62 font-size: props.get(vars.$nav-button--font-size); 62 font-size: props.get(vars.$nav-button--font-size);
63 63
64 &::before { 64 &::before {
65 position: absolute; 65 position: absolute;
66 inset-block-start: 50%; 66 inset-block-start: 50%;
67 display: block; 67 display: block;
68 inline-size: props.get(vars.$nav-button--inline-size); 68 inline-size: props.get(vars.$nav-button--inline-size);
69 block-size: props.get(vars.$nav-button--block-size); 69 block-size: props.get(vars.$nav-button--block-size);
70 content: ''; 70 content: '';
71 transform: translateY(-50%); 71 transform: translateY(-50%);
72 } 72 }
73 73
74 @include bem.modifier('prev') { 74 @include bem.modifier('prev') {
75 grid-area: prev; 75 grid-area: prev;
76 margin-inline: calc(.5 * props.get(vars.$pad)) calc(-1 * props.get(vars.$pad)); 76 margin-inline: calc(.5 * props.get(vars.$pad)) calc(-1 * props.get(vars.$pad));
77 77
78 &::before { 78 &::before {
79 inset-inline-start: 0; 79 inset-inline-start: 0;
80 } 80 }
81 } 81 }
82 82
83 @include bem.modifier('next') { 83 @include bem.modifier('next') {
84 grid-area: next; 84 grid-area: next;
85 margin-inline: calc(-1 * props.get(vars.$pad)) calc(.5 * props.get(vars.$pad)); 85 margin-inline: calc(-1 * props.get(vars.$pad)) calc(.5 * props.get(vars.$pad));
86 86
87 &::before { 87 &::before {
88 inset-inline-end: 0; 88 inset-inline-end: 0;
89 } 89 }
90 } 90 }
91 } 91 }
92 92
93 @include bem.modifier('interactive') { 93 @include bem.modifier('interactive') {
94 display: grid; 94 display: grid;
95 grid-template-areas: 95 grid-template-areas:
96 'header header header' 96 'header header header'
97 'prev content next' 97 'prev content next'
98 'thumbnails thumbnails thumbnails'; 98 'thumbnails thumbnails thumbnails';
99 grid-template-rows: auto minmax(0, 1fr) auto auto; 99 grid-template-rows: auto minmax(0, 1fr) auto auto;
100 grid-template-columns: auto minmax(0, 1fr) auto; 100 grid-template-columns: auto minmax(0, 1fr) auto;
101 101
102 @include bem.modifier('fullscreen') { 102 @include bem.modifier('fullscreen') {
103 block-size: props.get(vars.$fullscreen--height); 103 block-size: props.get(vars.$fullscreen--height);
104 } 104 }
105 105
106 @include bem.elem('img') { 106 @include bem.elem('img') {
107 display: none; 107 display: none;
108 max-block-size: 100%; 108 max-block-size: 100%;
109 margin-inline: 0; 109 margin-inline: 0;
110 110
111 @include bem.multi('&:target', 'is' 'visible') { 111 @include bem.multi('&:target', 'is' 'visible') {
112 display: block; 112 display: block;
113 } 113 }
114 } 114 }
115 115
116 @include bem.elem('thumbnails') { 116 @include bem.elem('thumbnails') {
117 display: flex; 117 display: flex;
118 } 118 }
119 119
120 @include bem.elem('close-btn') { 120 @include bem.elem('close-btn') {
121 display: block; 121 display: block;
122 } 122 }
123 123
124 @include bem.elem('nav-btn') { 124 @include bem.elem('nav-btn') {
125 display: block; 125 display: block;
126 } 126 }
127 } 127 }
128 128
129 @each $theme in map.keys(props.get(vars.$static-themes)) { 129 @each $theme in map.keys(props.get(vars.$static-themes)) {
130 @include bem.modifier(string.slice($theme, 3)) { 130 @include bem.modifier(string.slice($theme, 3)) {
131 color: props.get(vars.$static-themes, $theme, --text); 131 color: props.get(vars.$static-themes, $theme, --text);
132 } 132 }
133 } 133 }
134 } 134 }
135} 135}
diff --git a/src/objects/_lightbox.vars.scss b/src/objects/_lightbox.vars.scss
index cc926e4..6d22aa8 100644
--- a/src/objects/_lightbox.vars.scss
+++ b/src/objects/_lightbox.vars.scss
@@ -23,11 +23,11 @@ $thumbnails--spacing: props.def(--o-lightbox--thumbnails--spacing, props.get(cor
23$static-themes: props.def(--o-lightbox, (), 'color'); 23$static-themes: props.def(--o-lightbox, (), 'color');
24 24
25@each $theme in map.keys(props.get(core.$transparent-colors)) { 25@each $theme in map.keys(props.get(core.$transparent-colors)) {
26 $lightbox-theme: --static-#{string.slice($theme, 3)}; 26 $lightbox-theme: --static-#{string.slice($theme, 3)};
27 27
28 $static-themes: props.merge($static-themes, ( 28 $static-themes: props.merge($static-themes, (
29 $lightbox-theme: ( 29 $lightbox-theme: (
30 --text: props.get(core.$transparent-colors, $theme, --800), 30 --text: props.get(core.$transparent-colors, $theme, --800),
31 ) 31 )
32 )); 32 ));
33} 33}
diff --git a/src/objects/_menu.scss b/src/objects/_menu.scss
index 4d31874..f370067 100644
--- a/src/objects/_menu.scss
+++ b/src/objects/_menu.scss
@@ -8,95 +8,95 @@
8@use 'menu.vars' as vars; 8@use 'menu.vars' as vars;
9 9
10@mixin styles { 10@mixin styles {
11 @include materialize-at-root(meta.module-variables('vars')); 11 @include materialize-at-root(meta.module-variables('vars'));
12 12
13 @include bem.object('menu') { 13 @include bem.object('menu') {
14 display: flex; 14 display: flex;
15 flex-direction: column; 15 flex-direction: column;
16 gap: props.get(vars.$spacing); 16 gap: props.get(vars.$spacing);
17 17
18 @include bem.elem('header') { 18 @include bem.elem('header') {
19 padding-block: props.get(vars.$item--pad-b); 19 padding-block: props.get(vars.$item--pad-b);
20 padding-inline: props.get(vars.$item--pad-i); 20 padding-inline: props.get(vars.$item--pad-i);
21 font-size: props.get(vars.$header--font-size); 21 font-size: props.get(vars.$header--font-size);
22 font-weight: 500; 22 font-weight: 500;
23 color: props.get(vars.$header--label-color); 23 color: props.get(vars.$header--label-color);
24 text-transform: uppercase; 24 text-transform: uppercase;
25 letter-spacing: .5px; 25 letter-spacing: .5px;
26 26
27 @include bem.next-twin-elem { 27 @include bem.next-twin-elem {
28 margin-block-start: calc(props.get(vars.$separator-width) + props.get(vars.$spacing)); 28 margin-block-start: calc(props.get(vars.$separator-width) + props.get(vars.$spacing));
29 } 29 }
30 } 30 }
31 31
32 @include bem.elem('item') { 32 @include bem.elem('item') {
33 padding-block: props.get(vars.$item--pad-b); 33 padding-block: props.get(vars.$item--pad-b);
34 padding-inline: props.get(vars.$item--pad-i); 34 padding-inline: props.get(vars.$item--pad-i);
35 margin: calc(-1 * props.get(vars.$item--key-focus--outline-width)); 35 margin: calc(-1 * props.get(vars.$item--key-focus--outline-width));
36 color: props.get(vars.$item--disabled--label-color); 36 color: props.get(vars.$item--disabled--label-color);
37 background-clip: padding-box; 37 background-clip: padding-box;
38 border: props.get(vars.$item--key-focus--outline-width) solid transparent; 38 border: props.get(vars.$item--key-focus--outline-width) solid transparent;
39 border-radius: calc(props.get(vars.$item--rounding) + props.get(vars.$item--key-focus--outline-width)); 39 border-radius: calc(props.get(vars.$item--rounding) + props.get(vars.$item--key-focus--outline-width));
40 40
41 &:link, 41 &:link,
42 &:visited, 42 &:visited,
43 &:enabled { 43 &:enabled {
44 color: currentColor; 44 color: currentColor;
45 45
46 @include bem.multi('&:hover, &:focus-visible', 'is' 'selected') { 46 @include bem.multi('&:hover, &:focus-visible', 'is' 'selected') {
47 color: props.get(vars.$item--hover--label-color); 47 color: props.get(vars.$item--hover--label-color);
48 background-color: props.get(vars.$item--hover--bg-color); 48 background-color: props.get(vars.$item--hover--bg-color);
49 } 49 }
50 50
51 &:active { 51 &:active {
52 color: props.get(vars.$item--active--label-color); 52 color: props.get(vars.$item--active--label-color);
53 background-color: props.get(vars.$item--active--bg-color); 53 background-color: props.get(vars.$item--active--bg-color);
54 } 54 }
55 55
56 &:focus-visible { 56 &:focus-visible {
57 outline: props.get(vars.$item--key-focus--border-color) solid props.get(vars.$item--key-focus--border-width); 57 outline: props.get(vars.$item--key-focus--border-color) solid props.get(vars.$item--key-focus--border-width);
58 box-shadow: 58 box-shadow:
59 0 59 0
60 0 60 0
61 0 61 0
62 calc(props.get(vars.$item--key-focus--border-width) + props.get(vars.$item--key-focus--outline-width)) 62 calc(props.get(vars.$item--key-focus--border-width) + props.get(vars.$item--key-focus--outline-width))
63 props.get(vars.$item--key-focus--outline-color); 63 props.get(vars.$item--key-focus--outline-color);
64 } 64 }
65 } 65 }
66 66
67 @include bem.next-elem('header') { 67 @include bem.next-elem('header') {
68 margin-block-start: calc(props.get(vars.$separator-width) + props.get(vars.$spacing)); 68 margin-block-start: calc(props.get(vars.$separator-width) + props.get(vars.$spacing));
69 } 69 }
70 } 70 }
71 71
72 @include bem.elem('header') { 72 @include bem.elem('header') {
73 &:link, 73 &:link,
74 &:visited, 74 &:visited,
75 &:enabled { 75 &:enabled {
76 color: props.get(vars.$header--label-color); 76 color: props.get(vars.$header--label-color);
77 } 77 }
78 } 78 }
79 79
80 @include bem.elem('separator') { 80 @include bem.elem('separator') {
81 block-size: 1px; 81 block-size: 1px;
82 margin-block: props.get(vars.$separator-width); 82 margin-block: props.get(vars.$separator-width);
83 margin-inline: props.get(vars.$item--pad-i); 83 margin-inline: props.get(vars.$item--pad-i);
84 background-color: props.get(vars.$separator-color); 84 background-color: props.get(vars.$separator-color);
85 } 85 }
86 86
87 @include bem.elem('slot') { 87 @include bem.elem('slot') {
88 padding-block: props.get(vars.$item--pad-b); 88 padding-block: props.get(vars.$item--pad-b);
89 padding-inline: props.get(vars.$item--pad-i); 89 padding-inline: props.get(vars.$item--pad-i);
90 } 90 }
91 91
92 @include bem.elem('icon-slot') { 92 @include bem.elem('icon-slot') {
93 display: flex; 93 display: flex;
94 justify-content: center; 94 justify-content: center;
95 inline-size: props.get(icon.$size); 95 inline-size: props.get(icon.$size);
96 } 96 }
97 97
98 @include bem.modifier('pull') { 98 @include bem.modifier('pull') {
99 margin: calc(-1 * props.get(vars.$item--pad-i)); 99 margin: calc(-1 * props.get(vars.$item--pad-i));
100 } 100 }
101 } 101 }
102} 102}
diff --git a/src/objects/_navbar.scss b/src/objects/_navbar.scss
index 59d4c51..ec03c62 100644
--- a/src/objects/_navbar.scss
+++ b/src/objects/_navbar.scss
@@ -9,183 +9,183 @@
9@use 'navbar.vars' as vars; 9@use 'navbar.vars' as vars;
10 10
11@mixin styles { 11@mixin styles {
12 @include materialize-at-root(meta.module-variables('vars')); 12 @include materialize-at-root(meta.module-variables('vars'));
13 13
14 @include bem.object('navbar') { 14 @include bem.object('navbar') {
15 display: flex; 15 display: flex;
16 block-size: props.get(vars.$block-size); 16 block-size: props.get(vars.$block-size);
17 17
18 @include bem.elem('item-content-text') { 18 @include bem.elem('item-content-text') {
19 margin-inline: props.get(vars.$item--pad-i-label); 19 margin-inline: props.get(vars.$item--pad-i-label);
20 } 20 }
21 21
22 @include bem.elem('item-content') { 22 @include bem.elem('item-content') {
23 position: relative; 23 position: relative;
24 padding-block: props.get(vars.$item--pad-b); 24 padding-block: props.get(vars.$item--pad-b);
25 padding-inline: props.get(vars.$item--pad-i); 25 padding-inline: props.get(vars.$item--pad-i);
26 font-size: props.get(vars.$item--font-size); 26 font-size: props.get(vars.$item--font-size);
27 color: currentColor; 27 color: currentColor;
28 white-space: nowrap; 28 white-space: nowrap;
29 border-radius: 100em; 29 border-radius: 100em;
30 30
31 &::after { 31 &::after {
32 position: absolute; 32 position: absolute;
33 inset: calc(-1 * props.get(vars.$key-focus--border-offset)); 33 inset: calc(-1 * props.get(vars.$key-focus--border-offset));
34 z-index: -10; 34 z-index: -10;
35 display: block; 35 display: block;
36 pointer-events: none; 36 visibility: hidden;
37 visibility: hidden; 37 pointer-events: none;
38 content: ''; 38 outline: props.get(vars.$default-theme, --key-focus, --border) solid props.get(vars.$key-focus--border-width);
39 border-radius: 100em; 39 content: '';
40 outline: props.get(vars.$default-theme, --key-focus, --border) solid props.get(vars.$key-focus--border-width); 40 border-radius: 100em;
41 box-shadow: 41 box-shadow:
42 0 42 0
43 0 43 0
44 0 44 0
45 calc(props.get(vars.$key-focus--border-width) + props.get(vars.$key-focus--outline-width)) 45 calc(props.get(vars.$key-focus--border-width) + props.get(vars.$key-focus--outline-width))
46 props.get(vars.$default-theme, --key-focus, --outline); 46 props.get(vars.$default-theme, --key-focus, --outline);
47 } 47 }
48 } 48 }
49 49
50 @include bem.elem('item') { 50 @include bem.elem('item') {
51 display: flex; 51 display: flex;
52 flex-direction: column; 52 flex-direction: column;
53 align-items: center; 53 align-items: center;
54 justify-content: center; 54 justify-content: center;
55 inline-size: 100%; 55 inline-size: 100%;
56 padding-inline: calc(.5 * props.get(vars.$spacing)); 56 padding-inline: calc(.5 * props.get(vars.$spacing));
57 font-weight: 500; 57 font-weight: 500;
58 color: props.get(vars.$default-theme, --disabled, --label-color); 58 color: props.get(vars.$default-theme, --disabled, --label-color);
59 59
60 &:link, 60 &:link,
61 &:visited, 61 &:visited,
62 &:enabled { 62 &:enabled {
63 color: props.get(vars.$default-theme, --label-color); 63 color: props.get(vars.$default-theme, --label-color);
64 64
65 &:hover, 65 &:hover,
66 &:focus-visible { 66 &:focus-visible {
67 color: props.get(vars.$default-theme, --hover, --label-color); 67 color: props.get(vars.$default-theme, --hover, --label-color);
68 68
69 @include bem.elem('item-content') { 69 @include bem.elem('item-content') {
70 background-color: props.get(vars.$default-theme, --hover, --bg-color); 70 background-color: props.get(vars.$default-theme, --hover, --bg-color);
71 } 71 }
72 } 72 }
73 73
74 &:focus-visible { 74 &:focus-visible {
75 @include bem.elem('item-content') { 75 @include bem.elem('item-content') {
76 &::after { 76 &::after {
77 visibility: visible; 77 visibility: visible;
78 } 78 }
79 } 79 }
80 } 80 }
81 81
82 &:active { 82 &:active {
83 color: props.get(vars.$default-theme, --active, --label-color); 83 color: props.get(vars.$default-theme, --active, --label-color);
84 84
85 @include bem.elem('item-content') { 85 @include bem.elem('item-content') {
86 background-color: props.get(vars.$default-theme, --active, --bg-color); 86 background-color: props.get(vars.$default-theme, --active, --bg-color);
87 } 87 }
88 } 88 }
89 } 89 }
90 90
91 @include bem.is('selected') { 91 @include bem.is('selected') {
92 font-weight: bold; 92 font-weight: bold;
93 color: props.get(vars.$default-theme, --selected, --disabled, --label-color); 93 color: props.get(vars.$default-theme, --selected, --disabled, --label-color);
94 94
95 @include bem.elem('item-content') { 95 @include bem.elem('item-content') {
96 background-color: props.get(vars.$default-theme, --selected, --disabled, --bg-color); 96 background-color: props.get(vars.$default-theme, --selected, --disabled, --bg-color);
97 } 97 }
98 98
99 &:link, 99 &:link,
100 &:visited, 100 &:visited,
101 &:enabled { 101 &:enabled {
102 color: props.get(vars.$default-theme, --selected, --label-color); 102 color: props.get(vars.$default-theme, --selected, --label-color);
103 103
104 @include bem.elem('item-content') { 104 @include bem.elem('item-content') {
105 background-color: props.get(vars.$default-theme, --selected, --bg-color); 105 background-color: props.get(vars.$default-theme, --selected, --bg-color);
106 } 106 }
107 107
108 &:hover, 108 &:hover,
109 &:focus-visible { 109 &:focus-visible {
110 color: props.get(vars.$default-theme, --selected, --hover, --label-color); 110 color: props.get(vars.$default-theme, --selected, --hover, --label-color);
111 111
112 @include bem.elem('item-content') { 112 @include bem.elem('item-content') {
113 background-color: props.get(vars.$default-theme, --selected, --hover, --bg-color); 113 background-color: props.get(vars.$default-theme, --selected, --hover, --bg-color);
114 } 114 }
115 } 115 }
116 116
117 &:active { 117 &:active {
118 color: props.get(vars.$default-theme, --selected, --active, --label-color); 118 color: props.get(vars.$default-theme, --selected, --active, --label-color);
119 119
120 @include bem.elem('item-content') { 120 @include bem.elem('item-content') {
121 background-color: props.get(vars.$default-theme, --selected, --active, --bg-color); 121 background-color: props.get(vars.$default-theme, --selected, --active, --bg-color);
122 } 122 }
123 } 123 }
124 } 124 }
125 } 125 }
126 } 126 }
127 127
128 @include bem.modifier('hide-unselected') { 128 @include bem.modifier('hide-unselected') {
129 @include bem.elem('item') { 129 @include bem.elem('item') {
130 display: none; 130 display: none;
131 131
132 @include bem.is('selected') { 132 @include bem.is('selected') {
133 display: flex; 133 display: flex;
134 } 134 }
135 } 135 }
136 } 136 }
137 137
138 @include bem.modifier('adapt') { 138 @include bem.modifier('adapt') {
139 gap: props.get(vars.$spacing); 139 gap: props.get(vars.$spacing);
140 block-size: 100%; 140 block-size: 100%;
141 141
142 @include bem.elem('item') { 142 @include bem.elem('item') {
143 padding-inline: 0; 143 padding-inline: 0;
144 } 144 }
145 } 145 }
146 146
147 147
148 @include bem.modifier('align-block') { 148 @include bem.modifier('align-block') {
149 margin-inline: calc(-1 * props.get(vars.$item--pad-i)); 149 margin-inline: calc(-1 * props.get(vars.$item--pad-i));
150 } 150 }
151 151
152 @include bem.modifier('quiet') { 152 @include bem.modifier('quiet') {
153 @include bem.elem('item') { 153 @include bem.elem('item') {
154 @include bem.is('selected') { 154 @include bem.is('selected') {
155 color: props.get(vars.$default-theme, --quiet, --selected, --disabled, --label-color); 155 color: props.get(vars.$default-theme, --quiet, --selected, --disabled, --label-color);
156 156
157 @include bem.elem('item-content') { 157 @include bem.elem('item-content') {
158 background-color: props.get(vars.$default-theme, --quiet, --selected, --disabled, --bg-color); 158 background-color: props.get(vars.$default-theme, --quiet, --selected, --disabled, --bg-color);
159 } 159 }
160 160
161 &:link, 161 &:link,
162 &:visited, 162 &:visited,
163 &:enabled { 163 &:enabled {
164 color: props.get(vars.$default-theme, --quiet, --selected, --label-color); 164 color: props.get(vars.$default-theme, --quiet, --selected, --label-color);
165 165
166 @include bem.elem('item-content') { 166 @include bem.elem('item-content') {
167 background-color: props.get(vars.$default-theme, --quiet, --selected, --bg-color); 167 background-color: props.get(vars.$default-theme, --quiet, --selected, --bg-color);
168 } 168 }
169 169
170 &:hover, 170 &:hover,
171 &:focus-visible { 171 &:focus-visible {
172 color: props.get(vars.$default-theme, --quiet, --selected, --hover, --label-color); 172 color: props.get(vars.$default-theme, --quiet, --selected, --hover, --label-color);
173 173
174 @include bem.elem('item-content') { 174 @include bem.elem('item-content') {
175 background-color: props.get(vars.$default-theme, --quiet, --selected, --hover, --bg-color); 175 background-color: props.get(vars.$default-theme, --quiet, --selected, --hover, --bg-color);
176 } 176 }
177 } 177 }
178 178
179 &:active { 179 &:active {
180 color: props.get(vars.$default-theme, --quiet, --selected, --active, --label-color); 180 color: props.get(vars.$default-theme, --quiet, --selected, --active, --label-color);
181 181
182 @include bem.elem('item-content') { 182 @include bem.elem('item-content') {
183 background-color: props.get(vars.$default-theme, --quiet, --selected, --active, --bg-color); 183 background-color: props.get(vars.$default-theme, --quiet, --selected, --active, --bg-color);
184 } 184 }
185 } 185 }
186 } 186 }
187 } 187 }
188 } 188 }
189 } 189 }
190 } 190 }
191} 191}
diff --git a/src/objects/_navbar.vars.scss b/src/objects/_navbar.vars.scss
index da280fd..8e18def 100644
--- a/src/objects/_navbar.vars.scss
+++ b/src/objects/_navbar.vars.scss
@@ -7,7 +7,7 @@ $block-size: props.def(--o-navbar--block-size, props.get(core.$size--800)) !defa
7$spacing: props.def(--o-navbar--spacing, props.get(core.$size--200)) !default; 7$spacing: props.def(--o-navbar--spacing, props.get(core.$size--200)) !default;
8 8
9$item--pad-i: props.def(--o-navbar--item--pad-i, props.get(core.$size--150)) !default; 9$item--pad-i: props.def(--o-navbar--item--pad-i, props.get(core.$size--150)) !default;
10$item--pad-i-label: props.def(--o-action-button--pad-i-label, props.get(core.$size--25)) !default; 10$item--pad-i-label: props.def(--o-navbar--item--pad-i-label, props.get(core.$size--25)) !default;
11$item--pad-b: props.def(--o-navbar--item--pad-b, props.get(core.$size--40)) !default; 11$item--pad-b: props.def(--o-navbar--item--pad-b, props.get(core.$size--40)) !default;
12$item--font-size: props.def(--o-navbar--item--font-size, props.get(core.$font-size--75)) !default; 12$item--font-size: props.def(--o-navbar--item--font-size, props.get(core.$font-size--75)) !default;
13 13
@@ -17,68 +17,68 @@ $key-focus--outline-width: props.def(--o-navbar--key-focus--outline-width, props
17 17
18$default-theme-override: () !default; 18$default-theme-override: () !default;
19$default-theme: map.deep-merge(( 19$default-theme: map.deep-merge((
20 --label-color: props.get(core.$theme, --text), 20 --label-color: props.get(core.$theme, --text),
21 21
22 --hover: ( 22 --hover: (
23 --bg-color: props.get(core.$theme, --border-mute), 23 --bg-color: props.get(core.$theme, --border-mute),
24 --label-color: props.get(core.$theme, --heading), 24 --label-color: props.get(core.$theme, --heading),
25 ), 25 ),
26 26
27 --active: ( 27 --active: (
28 --bg-color: props.get(core.$theme, --border), 28 --bg-color: props.get(core.$theme, --border),
29 --label-color: props.get(core.$theme, --heading), 29 --label-color: props.get(core.$theme, --heading),
30 ), 30 ),
31 31
32 --disabled: ( 32 --disabled: (
33 --label-color: props.get(core.$theme, --border-strong), 33 --label-color: props.get(core.$theme, --border-strong),
34 ), 34 ),
35 35
36 --key-focus: ( 36 --key-focus: (
37 --label: props.get(core.$theme, --focus, --text), 37 --label: props.get(core.$theme, --focus, --text),
38 --border: props.get(core.$theme, --focus, --border), 38 --border: props.get(core.$theme, --focus, --border),
39 --outline: props.get(core.$theme, --focus, --outline), 39 --outline: props.get(core.$theme, --focus, --outline),
40 ), 40 ),
41 41
42 --selected: ( 42 --selected: (
43 --bg-color: props.get(core.$theme, --heading), 43 --bg-color: props.get(core.$theme, --heading),
44 --label-color: props.get(core.$theme, --base, --50), 44 --label-color: props.get(core.$theme, --base, --50),
45 45
46 --hover: ( 46 --hover: (
47 --bg-color: props.get(core.$theme, --text), 47 --bg-color: props.get(core.$theme, --text),
48 --label-color: props.get(core.$theme, --base, --50), 48 --label-color: props.get(core.$theme, --base, --50),
49 ), 49 ),
50 50
51 --active: ( 51 --active: (
52 --bg-color: props.get(core.$theme, --text-mute), 52 --bg-color: props.get(core.$theme, --text-mute),
53 --label-color: props.get(core.$theme, --base, --50), 53 --label-color: props.get(core.$theme, --base, --50),
54 ), 54 ),
55 55
56 --disabled: ( 56 --disabled: (
57 --bg-color: props.get(core.$theme, --border-mute), 57 --bg-color: props.get(core.$theme, --border-mute),
58 --label-color: props.get(core.$theme, --border-strong), 58 --label-color: props.get(core.$theme, --border-strong),
59 ), 59 ),
60 ), 60 ),
61 61
62 --quiet: ( 62 --quiet: (
63 --selected: ( 63 --selected: (
64 --bg-color: props.get(core.$theme, --accent, --200), 64 --bg-color: props.get(core.$theme, --accent, --200),
65 --label-color: props.get(core.$theme, --accent, --1100), 65 --label-color: props.get(core.$theme, --accent, --1100),
66 66
67 --hover: ( 67 --hover: (
68 --bg-color: props.get(core.$theme, --accent, --300), 68 --bg-color: props.get(core.$theme, --accent, --300),
69 --label-color: props.get(core.$theme, --accent, --1200), 69 --label-color: props.get(core.$theme, --accent, --1200),
70 ), 70 ),
71 71
72 --active: ( 72 --active: (
73 --bg-color: props.get(core.$theme, --accent, --400), 73 --bg-color: props.get(core.$theme, --accent, --400),
74 --label-color: props.get(core.$theme, --accent, --1300), 74 --label-color: props.get(core.$theme, --accent, --1300),
75 ), 75 ),
76 76
77 --disabled: ( 77 --disabled: (
78 --bg-color: props.get(core.$theme, --accent, --200), 78 --bg-color: props.get(core.$theme, --accent, --200),
79 --label-color: props.get(core.$theme, --accent, --800), 79 --label-color: props.get(core.$theme, --accent, --800),
80 ), 80 ),
81 ) 81 )
82 ) 82 )
83), $default-theme-override) !default; 83), $default-theme-override) !default;
84$default-theme: props.def(--o-navbar, $default-theme, 'color'); 84$default-theme: props.def(--o-navbar, $default-theme, 'color');
diff --git a/src/objects/_palette.scss b/src/objects/_palette.scss
index 8a6cdb2..79c0f6c 100644
--- a/src/objects/_palette.scss
+++ b/src/objects/_palette.scss
@@ -7,57 +7,57 @@
7@use '../core.vars' as core; 7@use '../core.vars' as core;
8 8
9@mixin styles { 9@mixin styles {
10 @include bem.object('palette') { 10 @include bem.object('palette') {
11 display: flex; 11 display: flex;
12 block-size: 3em; 12 block-size: 3em;
13 13
14 @include bem.elem('item') { 14 @include bem.elem('item') {
15 flex: 1 1 auto; 15 flex: 1 1 auto;
16 16
17 $palette: map.get(config.$themes, config.$theme-default, light, --palettes, --base); 17 $palette: map.get(config.$themes, config.$theme-default, light, --palettes, --base);
18 $levels: map.get(config.$themes, config.$theme-default, light, --levels, list.nth($palette, 2)); 18 $levels: map.get(config.$themes, config.$theme-default, light, --levels, list.nth($palette, 2));
19 19
20 @for $i from 1 through list.length($levels) { 20 @for $i from 1 through list.length($levels) {
21 $key: list.nth(map.keys($levels), $i); 21 $key: list.nth(map.keys($levels), $i);
22 22
23 &:nth-child(#{$i}) { 23 &:nth-child(#{$i}) {
24 background-color: props.get(core.$theme, --base, $key); 24 background-color: props.get(core.$theme, --base, $key);
25 } 25 }
26 } 26 }
27 } 27 }
28 28
29 @each $palette-name, $palette in map.get(config.$themes, config.$theme-default, light, --palettes) { 29 @each $palette-name, $palette in map.get(config.$themes, config.$theme-default, light, --palettes) {
30 $levels: map.get(config.$themes, config.$theme-default, light, --levels, list.nth($palette, 2)); 30 $levels: map.get(config.$themes, config.$theme-default, light, --levels, list.nth($palette, 2));
31 31
32 @include bem.modifier(string.slice($palette-name, 3)) { 32 @include bem.modifier(string.slice($palette-name, 3)) {
33 @include bem.elem('item') { 33 @include bem.elem('item') {
34 @for $i from 1 through list.length($levels) { 34 @for $i from 1 through list.length($levels) {
35 $key: list.nth(map.keys($levels), $i); 35 $key: list.nth(map.keys($levels), $i);
36 36
37 &:nth-child(#{$i}) { 37 &:nth-child(#{$i}) {
38 background-color: props.get(core.$theme, $palette-name, $key); 38 background-color: props.get(core.$theme, $palette-name, $key);
39 } 39 }
40 } 40 }
41 } 41 }
42 } 42 }
43 } 43 }
44 44
45 @include bem.modifier('static') { 45 @include bem.modifier('static') {
46 @each $palette-name, $palette in map.get(config.$static-colors, --palettes) { 46 @each $palette-name, $palette in map.get(config.$static-colors, --palettes) {
47 $levels: map.get(config.$static-colors, --levels); 47 $levels: map.get(config.$static-colors, --levels);
48 48
49 @include bem.modifier(string.slice($palette-name, 3)) { 49 @include bem.modifier(string.slice($palette-name, 3)) {
50 @include bem.elem('item') { 50 @include bem.elem('item') {
51 @for $i from 1 through list.length($levels) { 51 @for $i from 1 through list.length($levels) {
52 $key: list.nth(map.keys($levels), $i); 52 $key: list.nth(map.keys($levels), $i);
53 53
54 &:nth-child(#{$i}) { 54 &:nth-child(#{$i}) {
55 background-color: props.get(core.$theme, #{$palette-name}-static, $key); 55 background-color: props.get(core.$theme, #{$palette-name}-static, $key);
56 } 56 }
57 } 57 }
58 } 58 }
59 } 59 }
60 } 60 }
61 } 61 }
62 } 62 }
63} 63}
diff --git a/src/objects/_placeholders.scss b/src/objects/_placeholders.scss
new file mode 100644
index 0000000..80fc913
--- /dev/null
+++ b/src/objects/_placeholders.scss
@@ -0,0 +1,22 @@
1@use 'sass:meta';
2@use 'iro-sass/src/bem';
3@use 'iro-sass/src/props';
4@use '../props' as *;
5
6@forward 'placeholders.vars';
7@use 'placeholders.vars' as vars;
8
9@mixin styles {
10 @include materialize-at-root(meta.module-variables('vars'));
11
12 @include bem.object('placeholders') {
13 @include bem.elem('placeholder') {
14 display: inline-block;
15 min-block-size: props.get(vars.$min-block-size);
16 vertical-align: middle;
17 background-color: currentColor;
18 border-radius: props.get(vars.$rounding);
19 opacity: props.get(vars.$opacity);
20 }
21 }
22}
diff --git a/src/objects/_placeholders.vars.scss b/src/objects/_placeholders.vars.scss
new file mode 100644
index 0000000..a2e41e2
--- /dev/null
+++ b/src/objects/_placeholders.vars.scss
@@ -0,0 +1,6 @@
1@use 'iro-sass/src/props';
2@use '../core.vars' as core;
3
4$min-block-size: props.def(--o-placeholder--min-block-size, 1em) !default;
5$rounding: props.def(--o-placeholder--rounding, props.get(core.$rounding)) !default;
6$opacity: props.def(--o-placeholder--opacity, .5) !default;
diff --git a/src/objects/_popover.scss b/src/objects/_popover.scss
index 3fe6310..2746477 100644
--- a/src/objects/_popover.scss
+++ b/src/objects/_popover.scss
@@ -7,33 +7,39 @@
7@use 'popover.vars' as vars; 7@use 'popover.vars' as vars;
8 8
9@mixin styles { 9@mixin styles {
10 @include materialize-at-root(meta.module-variables('vars')); 10 @include materialize-at-root(meta.module-variables('vars'));
11 11
12 @include bem.object('popover') { 12 @include bem.object('popover') {
13 position: fixed; 13 position: fixed;
14 inset-block-start: 0; 14 inset-block-start: 0;
15 inset-inline-start: 0; 15 inset-inline-start: 0;
16 z-index: props.get(vars.$z-index); 16 z-index: props.get(vars.$z-index);
17 padding-block: props.get(vars.$pad-b); 17 padding-block: props.get(vars.$pad-b);
18 padding-inline: props.get(vars.$pad-i); 18 padding-inline: props.get(vars.$pad-i);
19 margin: 0; 19 margin: 0;
20 color: currentColor; 20 color: currentColor;
21 background-color: props.get(vars.$bg-color); 21 background-color: props.get(vars.$bg-color);
22 filter: props.get(vars.$filter); 22 border: props.get(vars.$border-width) solid transparent;
23 border: props.get(vars.$border-width) solid props.get(vars.$border-color); 23 border-color: props.get(vars.$border-color);
24 border-radius: props.get(vars.$rounding); 24 border-radius: props.get(vars.$rounding);
25 transform: translate(var(--x), var(--y)); 25 box-shadow:
26 props.get(vars.$shadow-x)
27 props.get(vars.$shadow-y)
28 props.get(vars.$shadow-blur)
29 props.get(vars.$shadow-grow)
30 props.get(vars.$shadow-color);
31 transform: translate(var(--x), var(--y));
26 32
27 @include bem.modifier('up-left') { 33 @include bem.modifier('up-left') {
28 transform: translate(var(--x), calc(var(--y) - 100%)); 34 transform: translate(var(--x), calc(var(--y) - 100%));
29 } 35 }
30 36
31 @include bem.modifier('up-right') { 37 @include bem.modifier('up-right') {
32 transform: translate(calc(var(--x) - 100%), calc(var(--y) - 100%)); 38 transform: translate(calc(var(--x) - 100%), calc(var(--y) - 100%));
33 } 39 }
34 40
35 @include bem.modifier('down-right') { 41 @include bem.modifier('down-right') {
36 transform: translate(calc(var(--x) - 100%), var(--y)); 42 transform: translate(calc(var(--x) - 100%), var(--y));
37 } 43 }
38 } 44 }
39} 45}
diff --git a/src/objects/_popover.vars.scss b/src/objects/_popover.vars.scss
index b76112e..e560d1b 100644
--- a/src/objects/_popover.vars.scss
+++ b/src/objects/_popover.vars.scss
@@ -9,6 +9,11 @@ $separator-width: props.def(--o-popover--separator-width, props.get(core.$size--
9$rounding: props.def(--o-popover--rounding, props.get(core.$rounding)) !default; 9$rounding: props.def(--o-popover--rounding, props.get(core.$rounding)) !default;
10$border-width: props.def(--o-popover--border-width, props.get(core.$border-width--thin)) !default; 10$border-width: props.def(--o-popover--border-width, props.get(core.$border-width--thin)) !default;
11 11
12$bg-color: props.def(--o-popover--bg-color, props.get(core.$theme, --bg-l2), 'color') !default; 12$shadow-x: props.def(--o-popover--shadow-x, props.get(core.$shadow--l2--x)) !default;
13$border-color: props.def(--o-popover--border-color, props.get(core.$theme, --border), 'color') !default; 13$shadow-y: props.def(--o-popover--shadow-y, props.get(core.$shadow--l2--y)) !default;
14$filter: props.def(--o-popover--filter, drop-shadow(props.get(core.$shadow--x) props.get(core.$shadow--y) props.get(core.$shadow--blur) props.get(core.$theme, --shadow)), 'color') !default; 14$shadow-blur: props.def(--o-popover--shadow-blur, props.get(core.$shadow--l2--blur)) !default;
15$shadow-grow: props.def(--o-popover--shadow-grow, props.get(core.$shadow--l2--grow)) !default;
16
17$bg-color: props.def(--o-popover--bg-color, props.get(core.$theme, --bg-l2), 'color') !default;
18$border-color: props.def(--o-popover--border-color, props.get(core.$theme, --box, --border) props.get(core.$theme, --box, --border) props.get(core.$theme, --box, --border-strong), 'color') !default;
19$shadow-color: props.def(--o-popover--shadow-color, props.get(core.$theme, --shadow), 'color') !default;
diff --git a/src/objects/_radio.scss b/src/objects/_radio.scss
index aef6b92..8327a15 100644
--- a/src/objects/_radio.scss
+++ b/src/objects/_radio.scss
@@ -8,147 +8,147 @@
8@use 'radio.vars' as vars; 8@use 'radio.vars' as vars;
9 9
10@mixin styles { 10@mixin styles {
11 @include materialize-at-root(meta.module-variables('vars')); 11 @include materialize-at-root(meta.module-variables('vars'));
12 12
13 @include bem.object('radio') { 13 @include bem.object('radio') {
14 position: relative; 14 position: relative;
15 display: inline-block; 15 display: inline-block;
16 padding-block: props.get(vars.$pad-b); 16 padding-block: props.get(vars.$pad-b);
17 padding-inline: props.get(vars.$pad-i); 17 padding-inline: props.get(vars.$pad-i);
18 margin-inline: 18 margin-inline:
19 calc(-1 * props.get(vars.$pad-i) - props.get(vars.$key-focus--border-offset)) 19 calc(-1 * props.get(vars.$pad-i) - props.get(vars.$key-focus--border-offset))
20 calc(props.get(vars.$spacing-sibling) - props.get(vars.$pad-i) - props.get(vars.$key-focus--border-offset)); 20 calc(props.get(vars.$spacing-sibling) - props.get(vars.$pad-i) - props.get(vars.$key-focus--border-offset));
21 21
22 @include bem.elem('circle') { 22 @include bem.elem('circle') {
23 display: inline-block; 23 display: inline-block;
24 flex: 0 0 auto; 24 flex: 0 0 auto;
25 inline-size: props.get(vars.$diameter); 25 inline-size: props.get(vars.$diameter);
26 block-size: props.get(vars.$diameter); 26 block-size: props.get(vars.$diameter);
27 margin-block-start: calc(.5em * props.get(core.$font--standard--line-height) - .5 * props.get(vars.$diameter) - props.get(vars.$key-focus--border-offset)); 27 margin-block-start: calc(.5em * props.get(core.$font--standard--line-height) - .5 * props.get(vars.$diameter) - props.get(vars.$key-focus--border-offset));
28 vertical-align: top; 28 vertical-align: top;
29 background-color: props.get(vars.$circle-border-color); 29 background-color: props.get(vars.$circle-border-color);
30 background-clip: padding-box; 30 background-clip: padding-box;
31 border: props.get(vars.$key-focus--border-offset) solid transparent; 31 border: props.get(vars.$key-focus--border-offset) solid transparent;
32 border-radius: 2em; 32 border-radius: 2em;
33 33
34 &::after { 34 &::after {
35 position: relative; 35 position: relative;
36 inset-block-start: props.get(vars.$border-width); 36 inset-block-start: props.get(vars.$border-width);
37 inset-inline-start: props.get(vars.$border-width); 37 inset-inline-start: props.get(vars.$border-width);
38 display: block; 38 display: block;
39 inline-size: calc(props.get(vars.$diameter) - 2 * props.get(vars.$border-width)); 39 inline-size: calc(props.get(vars.$diameter) - 2 * props.get(vars.$border-width));
40 block-size: calc(props.get(vars.$diameter) - 2 * props.get(vars.$border-width)); 40 block-size: calc(props.get(vars.$diameter) - 2 * props.get(vars.$border-width));
41 content: ''; 41 content: '';
42 background-color: props.get(vars.$circle-bg-color); 42 background-color: props.get(vars.$circle-bg-color);
43 border-radius: props.get(vars.$diameter); 43 border-radius: props.get(vars.$diameter);
44 transition: transform .2s ease; 44 transition: transform .2s ease;
45 } 45 }
46 } 46 }
47 47
48 @include bem.elem('label') { 48 @include bem.elem('label') {
49 margin-inline-start: calc(props.get(vars.$label-gap) - props.get(vars.$key-focus--border-offset)); 49 margin-inline-start: calc(props.get(vars.$label-gap) - props.get(vars.$key-focus--border-offset));
50 } 50 }
51 51
52 @include bem.elem('native') { 52 @include bem.elem('native') {
53 position: absolute; 53 position: absolute;
54 inset-block-start: 0; 54 inset-block-start: 0;
55 inset-inline-start: 0; 55 inset-inline-start: 0;
56 z-index: -1; 56 z-index: -1;
57 inline-size: 100%; 57 inline-size: 100%;
58 block-size: 100%; 58 block-size: 100%;
59 padding: 0; 59 padding: 0;
60 margin: 0; 60 margin: 0;
61 overflow: hidden; 61 overflow: hidden;
62 appearance: none; 62 appearance: none;
63 border-radius: props.get(vars.$rounding); 63 border-radius: props.get(vars.$rounding);
64 64
65 &:hover, 65 &:hover,
66 &:focus-visible { 66 &:focus-visible {
67 @include bem.sibling-elem('label') { 67 @include bem.sibling-elem('label') {
68 color: props.get(vars.$hover--label-color); 68 color: props.get(vars.$hover--label-color);
69 } 69 }
70 70
71 @include bem.sibling-elem('circle') { 71 @include bem.sibling-elem('circle') {
72 background-color: props.get(vars.$hover--circle-border-color); 72 background-color: props.get(vars.$hover--circle-border-color);
73 } 73 }
74 } 74 }
75 75
76 &:checked { 76 &:checked {
77 @include bem.sibling-elem('circle') { 77 @include bem.sibling-elem('circle') {
78 &::after { 78 &::after {
79 transform: scale(.44); 79 transform: scale(.44);
80 } 80 }
81 } 81 }
82 } 82 }
83 83
84 &:disabled { 84 &:disabled {
85 @include bem.sibling-elem('label') { 85 @include bem.sibling-elem('label') {
86 color: props.get(vars.$disabled--label-color); 86 color: props.get(vars.$disabled--label-color);
87 } 87 }
88 88
89 @include bem.sibling-elem('circle') { 89 @include bem.sibling-elem('circle') {
90 background-color: props.get(vars.$disabled--circle-border-color); 90 background-color: props.get(vars.$disabled--circle-border-color);
91 91
92 &::after { 92 &::after {
93 background-color: props.get(vars.$disabled--circle-bg-color); 93 background-color: props.get(vars.$disabled--circle-bg-color);
94 } 94 }
95 } 95 }
96 } 96 }
97 97
98 &:focus-visible { 98 &:focus-visible {
99 @include bem.sibling-elem('label') { 99 @include bem.sibling-elem('label') {
100 color: props.get(vars.$key-focus--label-color); 100 color: props.get(vars.$key-focus--label-color);
101 } 101 }
102 102
103 @include bem.sibling-elem('circle') { 103 @include bem.sibling-elem('circle') {
104 outline: props.get(vars.$key-focus--border-color) solid props.get(vars.$key-focus--border-width); 104 outline: props.get(vars.$key-focus--border-color) solid props.get(vars.$key-focus--border-width);
105 box-shadow: 105 box-shadow:
106 0 106 0
107 0 107 0
108 0 108 0
109 calc(props.get(vars.$key-focus--border-width) + props.get(vars.$key-focus--outline-width)) 109 calc(props.get(vars.$key-focus--border-width) + props.get(vars.$key-focus--outline-width))
110 props.get(vars.$key-focus--outline-color); 110 props.get(vars.$key-focus--outline-color);
111 } 111 }
112 } 112 }
113 } 113 }
114 114
115 @include bem.modifier('standalone') { 115 @include bem.modifier('standalone') {
116 @include bem.elem('circle') { 116 @include bem.elem('circle') {
117 margin-block-start: 0; 117 margin-block-start: 0;
118 } 118 }
119 } 119 }
120 120
121 @include bem.modifier('accent') { 121 @include bem.modifier('accent') {
122 @include bem.elem('native') { 122 @include bem.elem('native') {
123 &:checked { 123 &:checked {
124 @include bem.sibling-elem('circle') { 124 @include bem.sibling-elem('circle') {
125 background-color: props.get(vars.$accent--circle-border-color); 125 background-color: props.get(vars.$accent--circle-border-color);
126 } 126 }
127 127
128 &:hover, 128 &:hover,
129 &:focus-visible { 129 &:focus-visible {
130 @include bem.sibling-elem('circle') { 130 @include bem.sibling-elem('circle') {
131 background-color: props.get(vars.$accent--hover--circle-border-color); 131 background-color: props.get(vars.$accent--hover--circle-border-color);
132 } 132 }
133 } 133 }
134 } 134 }
135 135
136 &:disabled { 136 &:disabled {
137 @include bem.sibling-elem('circle') { 137 @include bem.sibling-elem('circle') {
138 background-color: props.get(vars.$disabled--circle-border-color); 138 background-color: props.get(vars.$disabled--circle-border-color);
139 139
140 &::after { 140 &::after {
141 background-color: props.get(vars.$disabled--circle-bg-color); 141 background-color: props.get(vars.$disabled--circle-bg-color);
142 } 142 }
143 } 143 }
144 144
145 &:checked { 145 &:checked {
146 @include bem.sibling-elem('circle') { 146 @include bem.sibling-elem('circle') {
147 background-color: props.get(vars.$disabled--circle-border-color); 147 background-color: props.get(vars.$disabled--circle-border-color);
148 } 148 }
149 } 149 }
150 } 150 }
151 } 151 }
152 } 152 }
153 } 153 }
154} 154}
diff --git a/src/objects/_radio.vars.scss b/src/objects/_radio.vars.scss
index 51ea581..b18ae2b 100644
--- a/src/objects/_radio.vars.scss
+++ b/src/objects/_radio.vars.scss
@@ -7,7 +7,7 @@ $label-gap: props.def(--o-radio--label-gap, props.get(core.$size--125)) !
7$border-width: props.def(--o-radio--border-width, props.get(core.$border-width--medium)) !default; 7$border-width: props.def(--o-radio--border-width, props.get(core.$border-width--medium)) !default;
8$pad-i: props.def(--o-radio--pad-i, props.get(core.$size--65)) !default; 8$pad-i: props.def(--o-radio--pad-i, props.get(core.$size--65)) !default;
9$pad-b: props.def(--o-radio--pad-b, props.get(core.$size--65)) !default; 9$pad-b: props.def(--o-radio--pad-b, props.get(core.$size--65)) !default;
10$rounding: props.def(--o-radio--rounding, props.get(core.$rounding)) !default; 10$rounding: props.def(--o-radio--rounding, props.get(core.$rounding--sm)) !default;
11$spacing-sibling: props.def(--o-radio--spacing-sibling, props.get(core.$size--300)) !default; 11$spacing-sibling: props.def(--o-radio--spacing-sibling, props.get(core.$size--300)) !default;
12 12
13$key-focus--border-width: props.def(--o-radio--key-focus--border-width, props.get(core.$key-focus--border-width)) !default; 13$key-focus--border-width: props.def(--o-radio--key-focus--border-width, props.get(core.$key-focus--border-width)) !default;
diff --git a/src/objects/_side-nav.scss b/src/objects/_side-nav.scss
index 6c60777..4a1feda 100644
--- a/src/objects/_side-nav.scss
+++ b/src/objects/_side-nav.scss
@@ -8,83 +8,83 @@
8@use 'side-nav.vars' as vars; 8@use 'side-nav.vars' as vars;
9 9
10@mixin styles { 10@mixin styles {
11 @include materialize-at-root(meta.module-variables('vars')); 11 @include materialize-at-root(meta.module-variables('vars'));
12 12
13 @include bem.object('side-nav') { 13 @include bem.object('side-nav') {
14 display: flex; 14 display: flex;
15 flex-direction: column; 15 flex-direction: column;
16 gap: props.get(vars.$spacing); 16 gap: props.get(vars.$spacing);
17 17
18 @include bem.elem('header') { 18 @include bem.elem('header') {
19 padding-block: props.get(vars.$item--pad-b); 19 padding-block: props.get(vars.$item--pad-b);
20 padding-inline: props.get(vars.$item--pad-i); 20 padding-inline: props.get(vars.$item--pad-i);
21 font-size: props.get(vars.$header--font-size); 21 font-size: props.get(vars.$header--font-size);
22 font-weight: 500; 22 font-weight: 500;
23 color: props.get(vars.$header--label-color); 23 color: props.get(vars.$header--label-color);
24 text-transform: uppercase; 24 text-transform: uppercase;
25 letter-spacing: .5px; 25 letter-spacing: .5px;
26 26
27 @include bem.next-twin-elem { 27 @include bem.next-twin-elem {
28 margin-block-start: calc(props.get(vars.$separator) + props.get(vars.$spacing)); 28 margin-block-start: calc(props.get(vars.$separator) + props.get(vars.$spacing));
29 } 29 }
30 } 30 }
31 31
32 @include bem.elem('item') { 32 @include bem.elem('item') {
33 padding-block: props.get(vars.$item--pad-b); 33 padding-block: props.get(vars.$item--pad-b);
34 padding-inline: props.get(vars.$item--pad-i); 34 padding-inline: props.get(vars.$item--pad-i);
35 margin: calc(-1 * props.get(vars.$item--key-focus--border-offset)); 35 margin: calc(-1 * props.get(vars.$item--key-focus--border-offset));
36 color: props.get(vars.$item--disabled--label-color); 36 color: props.get(vars.$item--disabled--label-color);
37 background-clip: padding-box; 37 background-clip: padding-box;
38 border: props.get(vars.$item--key-focus--border-offset) solid transparent; 38 border: props.get(vars.$item--key-focus--border-offset) solid transparent;
39 border-radius: calc(props.get(vars.$item--rounding) + props.get(vars.$item--key-focus--border-offset)); 39 border-radius: calc(props.get(vars.$item--rounding) + props.get(vars.$item--key-focus--border-offset));
40 40
41 &:link, 41 &:link,
42 &:visited, 42 &:visited,
43 &:enabled { 43 &:enabled {
44 color: currentColor; 44 color: currentColor;
45 45
46 @include bem.multi('&:hover, &:focus-visible', 'is' 'selected') { 46 @include bem.multi('&:hover, &:focus-visible', 'is' 'selected') {
47 color: props.get(vars.$item--hover--label-color); 47 color: props.get(vars.$item--hover--label-color);
48 background-color: props.get(vars.$item--hover--bg-color); 48 background-color: props.get(vars.$item--hover--bg-color);
49 } 49 }
50 50
51 &:active { 51 &:active {
52 color: props.get(vars.$item--active--label-color); 52 color: props.get(vars.$item--active--label-color);
53 background-color: props.get(vars.$item--active--bg-color); 53 background-color: props.get(vars.$item--active--bg-color);
54 } 54 }
55 55
56 &:focus-visible { 56 &:focus-visible {
57 outline: props.get(vars.$item--key-focus--border-color) solid props.get(vars.$item--key-focus--border-width); 57 outline: props.get(vars.$item--key-focus--border-color) solid props.get(vars.$item--key-focus--border-width);
58 box-shadow: 58 box-shadow:
59 0 59 0
60 0 60 0
61 0 61 0
62 calc(props.get(vars.$item--key-focus--border-width) + props.get(vars.$item--key-focus--outline-width)) 62 calc(props.get(vars.$item--key-focus--border-width) + props.get(vars.$item--key-focus--outline-width))
63 props.get(vars.$item--key-focus--outline-color); 63 props.get(vars.$item--key-focus--outline-color);
64 } 64 }
65 } 65 }
66 66
67 @include bem.next-elem('header') { 67 @include bem.next-elem('header') {
68 margin-block-start: calc(props.get(vars.$separator) + props.get(vars.$spacing)); 68 margin-block-start: calc(props.get(vars.$separator) + props.get(vars.$spacing));
69 } 69 }
70 } 70 }
71 71
72 @include bem.elem('header') { 72 @include bem.elem('header') {
73 &:link, 73 &:link,
74 &:visited, 74 &:visited,
75 &:enabled { 75 &:enabled {
76 color: props.get(vars.$header--label-color); 76 color: props.get(vars.$header--label-color);
77 } 77 }
78 } 78 }
79 79
80 @include bem.elem('separator') { 80 @include bem.elem('separator') {
81 block-size: props.get(vars.$separator); 81 block-size: props.get(vars.$separator);
82 } 82 }
83 83
84 @include bem.elem('icon-slot') { 84 @include bem.elem('icon-slot') {
85 display: flex; 85 display: flex;
86 justify-content: center; 86 justify-content: center;
87 inline-size: props.get(icon.$size); 87 inline-size: props.get(icon.$size);
88 } 88 }
89 } 89 }
90} 90}
diff --git a/src/objects/_side-nav.vars.scss b/src/objects/_side-nav.vars.scss
index 122dba6..711b2a7 100644
--- a/src/objects/_side-nav.vars.scss
+++ b/src/objects/_side-nav.vars.scss
@@ -8,7 +8,7 @@ $separator: props.def(--o-side-nav--separator, props.get(core.$size--200
8 8
9$item--pad-i: props.def(--o-side-nav--item--pad-i, props.get(core.$size--150)) !default; 9$item--pad-i: props.def(--o-side-nav--item--pad-i, props.get(core.$size--150)) !default;
10$item--pad-b: props.def(--o-side-nav--item--pad-b, props.get(core.$size--100)) !default; 10$item--pad-b: props.def(--o-side-nav--item--pad-b, props.get(core.$size--100)) !default;
11$item--rounding: props.def(--o-side-nav--item--rounding, props.get(core.$rounding)) !default; 11$item--rounding: props.def(--o-side-nav--item--rounding, props.get(core.$rounding--sm)) !default;
12 12
13$item--key-focus--border-width: props.def(--o-side-nav--item--key-focus--border-width, props.get(core.$key-focus--border-width)) !default; 13$item--key-focus--border-width: props.def(--o-side-nav--item--key-focus--border-width, props.get(core.$key-focus--border-width)) !default;
14$item--key-focus--border-offset: props.def(--o-side-nav--item--key-focus--border-offset, props.get(core.$key-focus--border-offset)) !default; 14$item--key-focus--border-offset: props.def(--o-side-nav--item--key-focus--border-offset, props.get(core.$key-focus--border-offset)) !default;
diff --git a/src/objects/_status-indicator.scss b/src/objects/_status-indicator.scss
index 1fcdf02..4e4aa42 100644
--- a/src/objects/_status-indicator.scss
+++ b/src/objects/_status-indicator.scss
@@ -9,19 +9,19 @@
9@use 'status-indicator.vars' as vars; 9@use 'status-indicator.vars' as vars;
10 10
11@mixin styles { 11@mixin styles {
12 @include materialize-at-root(meta.module-variables('vars')); 12 @include materialize-at-root(meta.module-variables('vars'));
13 13
14 @include bem.object('status-indicator') { 14 @include bem.object('status-indicator') {
15 display: inline-block; 15 display: inline-block;
16 inline-size: props.get(vars.$size); 16 inline-size: props.get(vars.$size);
17 block-size: props.get(vars.$size); 17 block-size: props.get(vars.$size);
18 background-color: props.get(vars.$default); 18 background-color: props.get(vars.$default);
19 border-radius: 10em; 19 border-radius: 10em;
20 20
21 @each $theme in map.keys(props.get(vars.$themes)) { 21 @each $theme in map.keys(props.get(vars.$themes)) {
22 @include bem.is(string.slice($theme, 3)) { 22 @include bem.is(string.slice($theme, 3)) {
23 background-color: props.get(vars.$themes, $theme); 23 background-color: props.get(vars.$themes, $theme);
24 } 24 }
25 } 25 }
26 } 26 }
27} 27}
diff --git a/src/objects/_status-indicator.vars.scss b/src/objects/_status-indicator.vars.scss
index 6289145..55b446a 100644
--- a/src/objects/_status-indicator.vars.scss
+++ b/src/objects/_status-indicator.vars.scss
@@ -9,18 +9,18 @@ $default: props.def(--o-status-indicator--default, props.get(core.$theme, --bord
9$primary: props.def(--o-status-indicator--primary, props.get(core.$theme, --text), 'color') !default; 9$primary: props.def(--o-status-indicator--primary, props.get(core.$theme, --text), 'color') !default;
10 10
11$themes-config: ( 11$themes-config: (
12 accent: --accent, 12 accent: --accent,
13 positive: --positive, 13 positive: --positive,
14 negative: --negative, 14 negative: --negative,
15 warning: --warning, 15 warning: --warning,
16) !default; 16) !default;
17 17
18$themes: props.def(--o-status-indicator, (), 'color'); 18$themes: props.def(--o-status-indicator, (), 'color');
19 19
20@each $theme, $key in $themes-config { 20@each $theme, $key in $themes-config {
21 @if $theme != --base { 21 @if $theme != --base {
22 $themes: props.merge($themes, ( 22 $themes: props.merge($themes, (
23 --#{$theme}: props.get(core.$theme, $key, --700), 23 --#{$theme}: props.get(core.$theme, $key, --700),
24 )); 24 ));
25 } 25 }
26} 26}
diff --git a/src/objects/_switch.scss b/src/objects/_switch.scss
index 8612d31..48cec24 100644
--- a/src/objects/_switch.scss
+++ b/src/objects/_switch.scss
@@ -8,181 +8,181 @@
8@use 'switch.vars' as vars; 8@use 'switch.vars' as vars;
9 9
10@mixin styles { 10@mixin styles {
11 @include materialize-at-root(meta.module-variables('vars')); 11 @include materialize-at-root(meta.module-variables('vars'));
12 12
13 @include bem.object('switch') { 13 @include bem.object('switch') {
14 position: relative; 14 position: relative;
15 display: inline-block; 15 display: inline-block;
16 padding-block: props.get(vars.$pad-b); 16 padding-block: props.get(vars.$pad-b);
17 padding-inline: props.get(vars.$pad-i); 17 padding-inline: props.get(vars.$pad-i);
18 margin-inline: 18 margin-inline:
19 calc(-1 * props.get(vars.$pad-i) - props.get(vars.$key-focus--border-offset)) 19 calc(-1 * props.get(vars.$pad-i) - props.get(vars.$key-focus--border-offset))
20 calc(props.get(vars.$spacing-sibling) - props.get(vars.$pad-i) - props.get(vars.$key-focus--border-offset)); 20 calc(props.get(vars.$spacing-sibling) - props.get(vars.$pad-i) - props.get(vars.$key-focus--border-offset));
21 21
22 @include bem.elem('indicator') { 22 @include bem.elem('indicator') {
23 display: inline-block; 23 display: inline-block;
24 flex: 0 0 auto; 24 flex: 0 0 auto;
25 inline-size: props.get(vars.$inline-size); 25 inline-size: props.get(vars.$inline-size);
26 block-size: props.get(vars.$block-size); 26 block-size: props.get(vars.$block-size);
27 margin-block-start: calc(.5em * props.get(core.$font--standard--line-height) - .5 * props.get(vars.$block-size) - props.get(vars.$key-focus--border-offset)); 27 margin-block-start: calc(.5em * props.get(core.$font--standard--line-height) - .5 * props.get(vars.$block-size) - props.get(vars.$key-focus--border-offset));
28 vertical-align: top; 28 vertical-align: top;
29 background-color: props.get(vars.$track-bg-color); 29 background-color: props.get(vars.$track-bg-color);
30 background-clip: padding-box; 30 background-clip: padding-box;
31 border: props.get(vars.$key-focus--border-offset) solid transparent; 31 border: props.get(vars.$key-focus--border-offset) solid transparent;
32 border-radius: 2em; 32 border-radius: 2em;
33 transition: background-color .2s ease; 33 transition: background-color .2s ease;
34 34
35 &::after { 35 &::after {
36 display: block; 36 display: block;
37 inline-size: calc(props.get(vars.$block-size) - 2 * props.get(vars.$border-width)); 37 inline-size: calc(props.get(vars.$block-size) - 2 * props.get(vars.$border-width));
38 block-size: calc(props.get(vars.$block-size) - 2 * props.get(vars.$border-width)); 38 block-size: calc(props.get(vars.$block-size) - 2 * props.get(vars.$border-width));
39 content: ''; 39 content: '';
40 background-color: props.get(vars.$handle-bg-color); 40 background-color: props.get(vars.$handle-bg-color);
41 border: props.get(vars.$border-width) solid props.get(vars.$handle-border-color); 41 border: props.get(vars.$border-width) solid props.get(vars.$handle-border-color);
42 border-radius: props.get(vars.$inline-size); 42 border-radius: props.get(vars.$inline-size);
43 transition: transform .2s ease; 43 transition: transform .2s ease;
44 } 44 }
45 } 45 }
46 46
47 @include bem.elem('label') { 47 @include bem.elem('label') {
48 margin-inline-start: props.get(vars.$label-gap); 48 margin-inline-start: props.get(vars.$label-gap);
49 } 49 }
50 50
51 @include bem.elem('native') { 51 @include bem.elem('native') {
52 position: absolute; 52 position: absolute;
53 inset-block-start: 0; 53 inset-block-start: 0;
54 inset-inline-start: 0; 54 inset-inline-start: 0;
55 z-index: -1; 55 z-index: -1;
56 inline-size: 100%; 56 inline-size: 100%;
57 block-size: 100%; 57 block-size: 100%;
58 padding: 0; 58 padding: 0;
59 margin: 0; 59 margin: 0;
60 overflow: hidden; 60 overflow: hidden;
61 appearance: none; 61 appearance: none;
62 border-radius: props.get(vars.$rounding); 62 border-radius: props.get(vars.$rounding);
63 63
64 &:hover, 64 &:hover,
65 &:focus-visible { 65 &:focus-visible {
66 @include bem.sibling-elem('label') { 66 @include bem.sibling-elem('label') {
67 color: props.get(vars.$hover--label-color); 67 color: props.get(vars.$hover--label-color);
68 } 68 }
69 69
70 @include bem.sibling-elem('indicator') { 70 @include bem.sibling-elem('indicator') {
71 &::after { 71 &::after {
72 border-color: props.get(vars.$hover--handle-border-color); 72 border-color: props.get(vars.$hover--handle-border-color);
73 } 73 }
74 } 74 }
75 } 75 }
76 76
77 &:checked { 77 &:checked {
78 @include bem.sibling-elem('indicator') { 78 @include bem.sibling-elem('indicator') {
79 background-color: props.get(vars.$handle-border-color); 79 background-color: props.get(vars.$handle-border-color);
80 80
81 &::after { 81 &::after {
82 border-color: props.get(vars.$handle-border-color); 82 border-color: props.get(vars.$handle-border-color);
83 transform: translate(calc(props.get(vars.$inline-size) - props.get(vars.$block-size) + .5px), 0); 83 transform: translate(calc(props.get(vars.$inline-size) - props.get(vars.$block-size) + .5px), 0);
84 } 84 }
85 } 85 }
86 86
87 &:hover, 87 &:hover,
88 &:focus-visible { 88 &:focus-visible {
89 @include bem.sibling-elem('indicator') { 89 @include bem.sibling-elem('indicator') {
90 background-color: props.get(vars.$hover--handle-border-color); 90 background-color: props.get(vars.$hover--handle-border-color);
91 91
92 &::after { 92 &::after {
93 border-color: props.get(vars.$hover--handle-border-color); 93 border-color: props.get(vars.$hover--handle-border-color);
94 } 94 }
95 } 95 }
96 } 96 }
97 } 97 }
98 98
99 &:disabled { 99 &:disabled {
100 @include bem.sibling-elem('label') { 100 @include bem.sibling-elem('label') {
101 color: props.get(vars.$disabled--label-color); 101 color: props.get(vars.$disabled--label-color);
102 } 102 }
103 103
104 @include bem.sibling-elem('indicator') { 104 @include bem.sibling-elem('indicator') {
105 background-color: props.get(vars.$disabled--track-bg-color); 105 background-color: props.get(vars.$disabled--track-bg-color);
106 106
107 &::after { 107 &::after {
108 background-color: props.get(vars.$disabled--handle-bg-color); 108 background-color: props.get(vars.$disabled--handle-bg-color);
109 border-color: props.get(vars.$disabled--handle-border-color); 109 border-color: props.get(vars.$disabled--handle-border-color);
110 } 110 }
111 } 111 }
112 112
113 &:checked { 113 &:checked {
114 @include bem.sibling-elem('indicator') { 114 @include bem.sibling-elem('indicator') {
115 background-color: props.get(vars.$disabled--handle-border-color); 115 background-color: props.get(vars.$disabled--handle-border-color);
116 116
117 &::after { 117 &::after {
118 border-color: props.get(vars.$disabled--handle-border-color); 118 border-color: props.get(vars.$disabled--handle-border-color);
119 } 119 }
120 } 120 }
121 } 121 }
122 } 122 }
123 123
124 &:focus-visible { 124 &:focus-visible {
125 @include bem.sibling-elem('label') { 125 @include bem.sibling-elem('label') {
126 color: props.get(vars.$key-focus--label-color); 126 color: props.get(vars.$key-focus--label-color);
127 } 127 }
128 128
129 @include bem.sibling-elem('indicator') { 129 @include bem.sibling-elem('indicator') {
130 outline: props.get(vars.$key-focus--border-color) solid props.get(vars.$key-focus--border-width); 130 outline: props.get(vars.$key-focus--border-color) solid props.get(vars.$key-focus--border-width);
131 box-shadow: 131 box-shadow:
132 0 132 0
133 0 133 0
134 0 134 0
135 calc(props.get(vars.$key-focus--border-width) + props.get(vars.$key-focus--outline-width)) 135 calc(props.get(vars.$key-focus--border-width) + props.get(vars.$key-focus--outline-width))
136 props.get(vars.$key-focus--outline-color); 136 props.get(vars.$key-focus--outline-color);
137 } 137 }
138 } 138 }
139 } 139 }
140 140
141 @include bem.modifier('standalone') { 141 @include bem.modifier('standalone') {
142 @include bem.elem('indicator') { 142 @include bem.elem('indicator') {
143 margin-block-start: 0; 143 margin-block-start: 0;
144 } 144 }
145 } 145 }
146 146
147 @include bem.modifier('accent') { 147 @include bem.modifier('accent') {
148 @include bem.elem('native') { 148 @include bem.elem('native') {
149 &:checked { 149 &:checked {
150 @include bem.sibling-elem('indicator') { 150 @include bem.sibling-elem('indicator') {
151 background-color: props.get(vars.$accent--handle-border-color); 151 background-color: props.get(vars.$accent--handle-border-color);
152 152
153 &::after { 153 &::after {
154 border-color: props.get(vars.$accent--handle-border-color); 154 border-color: props.get(vars.$accent--handle-border-color);
155 } 155 }
156 } 156 }
157 157
158 &:hover, 158 &:hover,
159 &:focus-visible { 159 &:focus-visible {
160 @include bem.sibling-elem('indicator') { 160 @include bem.sibling-elem('indicator') {
161 background-color: props.get(vars.$accent--hover--handle-border-color); 161 background-color: props.get(vars.$accent--hover--handle-border-color);
162 162
163 &::after { 163 &::after {
164 border-color: props.get(vars.$accent--hover--handle-border-color); 164 border-color: props.get(vars.$accent--hover--handle-border-color);
165 } 165 }
166 } 166 }
167 } 167 }
168 } 168 }
169 169
170 &:disabled { 170 &:disabled {
171 @include bem.sibling-elem('label') { 171 @include bem.sibling-elem('label') {
172 color: props.get(vars.$disabled--label-color); 172 color: props.get(vars.$disabled--label-color);
173 } 173 }
174 174
175 &:checked { 175 &:checked {
176 @include bem.sibling-elem('indicator') { 176 @include bem.sibling-elem('indicator') {
177 background-color: props.get(vars.$disabled--handle-border-color); 177 background-color: props.get(vars.$disabled--handle-border-color);
178 178
179 &::after { 179 &::after {
180 border-color: props.get(vars.$disabled--handle-border-color); 180 border-color: props.get(vars.$disabled--handle-border-color);
181 } 181 }
182 } 182 }
183 } 183 }
184 } 184 }
185 } 185 }
186 } 186 }
187 } 187 }
188} 188}
diff --git a/src/objects/_switch.vars.scss b/src/objects/_switch.vars.scss
index 85596af..10489a5 100644
--- a/src/objects/_switch.vars.scss
+++ b/src/objects/_switch.vars.scss
@@ -8,7 +8,7 @@ $label-gap: props.def(--o-switch--label-gap, props.get(core.$size--125)) !
8$border-width: props.def(--o-switch--border-width, props.get(core.$border-width--medium)) !default; 8$border-width: props.def(--o-switch--border-width, props.get(core.$border-width--medium)) !default;
9$pad-i: props.def(--o-switch--pad-i, props.get(core.$size--65)) !default; 9$pad-i: props.def(--o-switch--pad-i, props.get(core.$size--65)) !default;
10$pad-b: props.def(--o-switch--pad-b, props.get(core.$size--65)) !default; 10$pad-b: props.def(--o-switch--pad-b, props.get(core.$size--65)) !default;
11$rounding: props.def(--o-switch--rounding, props.get(core.$rounding)) !default; 11$rounding: props.def(--o-switch--rounding, props.get(core.$rounding--sm)) !default;
12$spacing-sibling: props.def(--o-switch--spacing-sibling, props.get(core.$size--300)) !default; 12$spacing-sibling: props.def(--o-switch--spacing-sibling, props.get(core.$size--300)) !default;
13 13
14$key-focus--border-width: props.def(--o-switch--key-focus--border-width, props.get(core.$key-focus--border-width)) !default; 14$key-focus--border-width: props.def(--o-switch--key-focus--border-width, props.get(core.$key-focus--border-width)) !default;
diff --git a/src/objects/_tabbar.scss b/src/objects/_tabbar.scss
new file mode 100644
index 0000000..a9daaae
--- /dev/null
+++ b/src/objects/_tabbar.scss
@@ -0,0 +1,113 @@
1@use 'sass:map';
2@use 'sass:meta';
3@use 'sass:string';
4@use 'iro-sass/src/bem';
5@use 'iro-sass/src/props';
6@use '../props' as *;
7
8@forward 'tabbar.vars';
9@use 'tabbar.vars' as vars;
10
11@mixin styles {
12 @include materialize-at-root(meta.module-variables('vars'));
13
14 @include bem.object('tabbar') {
15 min-inline-size: 0;
16 block-size: props.get(vars.$block-size);
17 overflow: hidden;
18
19 &::after {
20 display: block;
21 block-size: props.get(vars.$indicator--width);
22 margin-block-start: calc(-1 * props.get(vars.$indicator--width));
23 content: '';
24 background-color: props.get(vars.$railing--bg-color);
25 }
26
27 @include bem.elem('tabs') {
28 display: flex;
29 block-size: 100%;
30 margin-inline: calc(-.5 * props.get(vars.$spacing));
31 overflow-inline: auto;
32 }
33
34 @include bem.modifier('quiet') {
35 box-shadow: none;
36 }
37
38 @include bem.modifier('adapt') {
39 block-size: 100%;
40 }
41
42 @include bem.elem('tab') {
43 position: relative;
44 display: flex;
45 align-items: center;
46 padding-inline: calc(.5 * props.get(vars.$spacing));
47 color: props.get(vars.$tab--text-color);
48 white-space: nowrap;
49
50 &::before {
51 position: absolute;
52 inset-block-start: 50%;
53 inset-inline: calc(-1 * props.get(vars.$tab--pad-i) + .5 * props.get(vars.$spacing));
54 z-index: -10;
55 block-size: 1.5em;
56 content: '';
57 border-radius: props.get(vars.$rounding);
58 transform: translateY(-50%);
59 }
60
61 &::after {
62 position: absolute;
63 inset-block-end: 0;
64 inset-inline: calc(.5 * props.get(vars.$spacing));
65 z-index: 10;
66 display: none;
67 block-size: props.get(vars.$indicator--width);
68 content: '';
69 background-color: props.get(vars.$tab--selected--text-color);
70 }
71
72 &:link,
73 &:visited {
74 &:hover,
75 &:active,
76 &:focus-visible {
77 color: props.get(vars.$tab--selected--text-color);
78 }
79
80 &:focus-visible {
81 &::before {
82 color: props.get(vars.$key-focus--text-color);
83 text-decoration: none;
84 outline: props.get(vars.$key-focus--border-color) solid props.get(vars.$key-focus--border-width);
85 box-shadow: 0 0 0
86 calc(props.get(vars.$key-focus--border-width) + props.get(vars.$key-focus--outline-width))
87 props.get(vars.$key-focus--outline-color);
88 }
89 }
90 }
91
92 @include bem.is('selected') {
93 color: props.get(vars.$tab--selected--text-color);
94
95 &::after {
96 display: block;
97 }
98 }
99 }
100
101 @include bem.modifier('accent') {
102 @include bem.elem('tab') {
103 &::after {
104 background-color: props.get(vars.$tab--accent--text-color);
105 }
106
107 @include bem.is('selected') {
108 color: props.get(vars.$tab--accent--text-color);
109 }
110 }
111 }
112 }
113}
diff --git a/src/objects/_tabbar.vars.scss b/src/objects/_tabbar.vars.scss
new file mode 100644
index 0000000..4095629
--- /dev/null
+++ b/src/objects/_tabbar.vars.scss
@@ -0,0 +1,25 @@
1@use 'sass:map';
2@use 'sass:string';
3@use 'iro-sass/src/props';
4@use '../core.vars' as core;
5
6$block-size: props.def(--o-tabbar--block-size, props.get(core.$size--700)) !default;
7$rounding: props.def(--o-tabbar--rounding, props.get(core.$rounding--sm)) !default;
8$spacing: props.def(--o-tabbar--spacing, props.get(core.$size--400)) !default;
9$tab--pad-i: props.def(--o-tabbar--tab--pad-i, props.get(core.$size--50)) !default;
10
11$indicator--width: props.def(--o-tabbar--indicator--width, props.get(core.$border-width--medium)) !default;
12
13$key-focus--border-width: props.def(--o-tabbar--key-focus--border-width, props.get(core.$key-focus--border-width)) !default;
14$key-focus--border-offset: props.def(--o-tabbar--key-focus--border-offset, props.get(core.$key-focus--border-offset)) !default;
15$key-focus--outline-width: props.def(--o-tabbar--key-focus--outline-width, props.get(core.$key-focus--outline-width)) !default;
16
17$tab--text-color: props.def(--o-tabbar--tab--text-color, props.get(core.$theme, --text-mute), 'color') !default;
18$tab--selected--text-color: props.def(--o-tabbar--tab--selected--text-color, props.get(core.$theme, --heading), 'color') !default;
19$tab--accent--text-color: props.def(--o-tabbar--tab--accent--text-color, props.get(core.$theme, --accent, --1100), 'color') !default;
20
21$railing--bg-color: props.def(--o-tabbar--railing--bg-color, props.get(core.$theme, --border-mute), 'color') !default;
22
23$key-focus--text-color: props.def(--o-tabbar--key-focus--text-color, props.get(core.$theme, --focus, --text), 'color') !default;
24$key-focus--border-color: props.def(--o-tabbar--key-focus--border-color, props.get(core.$theme, --focus, --border), 'color') !default;
25$key-focus--outline-color: props.def(--o-tabbar--key-focus--outline-color, props.get(core.$theme, --focus, --outline), 'color') !default;
diff --git a/src/objects/_table.scss b/src/objects/_table.scss
index 2b63737..9e4891d 100644
--- a/src/objects/_table.scss
+++ b/src/objects/_table.scss
@@ -7,141 +7,141 @@
7@use 'table.vars' as vars; 7@use 'table.vars' as vars;
8 8
9@mixin styles { 9@mixin styles {
10 @include materialize-at-root(meta.module-variables('vars')); 10 @include materialize-at-root(meta.module-variables('vars'));
11 11
12 @include bem.object('table') { 12 @include bem.object('table') {
13 border-spacing: 0; 13 border-spacing: 0;
14 border-collapse: separate; 14 border-collapse: separate;
15 15
16 @include bem.modifier('fixed') { 16 @include bem.modifier('fixed') {
17 table-layout: fixed; 17 table-layout: fixed;
18 } 18 }
19 19
20 @include bem.elem('head-cell') { 20 @include bem.elem('head-cell') {
21 padding-block: props.get(vars.$pad-b); 21 padding-block: props.get(vars.$pad-b);
22 padding-inline: props.get(vars.$pad-i); 22 padding-inline: props.get(vars.$pad-i);
23 font-family: props.get(vars.$heading--font-family); 23 font-family: props.get(vars.$heading--font-family);
24 font-size: props.get(vars.$heading--font-size); 24 font-size: props.get(vars.$heading--font-size);
25 font-weight: props.get(vars.$heading--font-weight); 25 font-weight: props.get(vars.$heading--font-weight);
26 color: props.get(vars.$heading-color); 26 color: props.get(vars.$heading-color);
27 text-align: start; 27 text-align: start;
28 text-transform: props.get(vars.$heading--text-transform); 28 text-transform: props.get(vars.$heading--text-transform);
29 letter-spacing: props.get(vars.$heading--letter-spacing); 29 letter-spacing: props.get(vars.$heading--letter-spacing);
30 } 30 }
31 31
32 @include bem.elem('cell') { 32 @include bem.elem('cell') {
33 padding-block: props.get(vars.$pad-b); 33 padding-block: props.get(vars.$pad-b);
34 padding-inline: props.get(vars.$pad-i); 34 padding-inline: props.get(vars.$pad-i);
35 border-color: props.get(vars.$border-color); 35 border-color: props.get(vars.$border-color);
36 border-style: solid; 36 border-style: solid;
37 border-width: 0; 37 border-width: 0;
38 border-block-start-width: props.get(vars.$border-width); 38 border-block-start-width: props.get(vars.$border-width);
39 39
40 @include bem.modifier('divider') { 40 @include bem.modifier('divider') {
41 border-inline-end-width: props.get(vars.$border-width); 41 border-inline-end-width: props.get(vars.$border-width);
42 } 42 }
43 } 43 }
44 44
45 @include bem.elem('row') { 45 @include bem.elem('row') {
46 &:last-child { 46 &:last-child {
47 @include bem.elem('cell') { 47 @include bem.elem('cell') {
48 border-block-end-width: props.get(vars.$border-width); 48 border-block-end-width: props.get(vars.$border-width);
49 } 49 }
50 } 50 }
51 } 51 }
52 52
53 @include bem.modifier('flush') { 53 @include bem.modifier('flush') {
54 @include bem.elem('head-cell', 'cell') { 54 @include bem.elem('head-cell', 'cell') {
55 &:first-child { 55 &:first-child {
56 padding-inline-start: 0; 56 padding-inline-start: 0;
57 } 57 }
58 58
59 &:last-child { 59 &:last-child {
60 padding-inline-end: 0; 60 padding-inline-end: 0;
61 } 61 }
62 } 62 }
63 } 63 }
64 64
65 @include bem.modifier('box') { 65 @include bem.modifier('box') {
66 @include bem.elem('cell') { 66 @include bem.elem('cell') {
67 background-color: props.get(vars.$box--bg-color); 67 background-color: props.get(vars.$box--bg-color);
68 68
69 &:first-child { 69 &:first-child {
70 border-inline-start-width: props.get(vars.$border-width); 70 border-inline-start-width: props.get(vars.$border-width);
71 } 71 }
72 72
73 &:last-child { 73 &:last-child {
74 border-inline-end-width: props.get(vars.$border-width); 74 border-inline-end-width: props.get(vars.$border-width);
75 } 75 }
76 } 76 }
77 77
78 @include bem.elem('row') { 78 @include bem.elem('row') {
79 &:first-child { 79 &:first-child {
80 @include bem.elem('cell') { 80 @include bem.elem('cell') {
81 &:first-child { 81 &:first-child {
82 border-start-start-radius: props.get(vars.$rounding); 82 border-start-start-radius: props.get(vars.$rounding);
83 } 83 }
84 84
85 &:last-child { 85 &:last-child {
86 border-start-end-radius: props.get(vars.$rounding); 86 border-start-end-radius: props.get(vars.$rounding);
87 } 87 }
88 } 88 }
89 } 89 }
90 90
91 &:last-child { 91 &:last-child {
92 @include bem.elem('cell') { 92 @include bem.elem('cell') {
93 &:first-child { 93 &:first-child {
94 border-end-start-radius: props.get(vars.$rounding); 94 border-end-start-radius: props.get(vars.$rounding);
95 } 95 }
96 96
97 &:last-child { 97 &:last-child {
98 border-end-end-radius: props.get(vars.$rounding); 98 border-end-end-radius: props.get(vars.$rounding);
99 } 99 }
100 } 100 }
101 } 101 }
102 } 102 }
103 } 103 }
104 104
105 @include bem.modifier('interactive') { 105 @include bem.modifier('interactive') {
106 @include bem.elem('row') { 106 @include bem.elem('row') {
107 @include bem.elem('cell') { 107 @include bem.elem('cell') {
108 cursor: pointer; 108 cursor: pointer;
109 } 109 }
110 110
111 &:hover { 111 &:hover {
112 @include bem.elem('cell') { 112 @include bem.elem('cell') {
113 background-color: props.get(vars.$hover--bg-color); 113 background-color: props.get(vars.$hover--bg-color);
114 } 114 }
115 } 115 }
116 116
117 &:active { 117 &:active {
118 @include bem.elem('cell') { 118 @include bem.elem('cell') {
119 background-color: props.get(vars.$active--bg-color); 119 background-color: props.get(vars.$active--bg-color);
120 } 120 }
121 } 121 }
122 } 122 }
123 123
124 @include bem.modifier('box') { 124 @include bem.modifier('box') {
125 @include bem.elem('row') { 125 @include bem.elem('row') {
126 &:hover { 126 &:hover {
127 @include bem.elem('cell') { 127 @include bem.elem('cell') {
128 background-color: props.get(vars.$box--hover--bg-color); 128 background-color: props.get(vars.$box--hover--bg-color);
129 } 129 }
130 } 130 }
131 131
132 &:active { 132 &:active {
133 @include bem.elem('cell') { 133 @include bem.elem('cell') {
134 background-color: props.get(vars.$box--active--bg-color); 134 background-color: props.get(vars.$box--active--bg-color);
135 } 135 }
136 } 136 }
137 } 137 }
138 } 138 }
139 } 139 }
140 140
141 @include bem.modifier('sm') { 141 @include bem.modifier('sm') {
142 @include bem.elem('head-cell', 'cell') { 142 @include bem.elem('head-cell', 'cell') {
143 padding-block: props.get(vars.$pad-b--sm); 143 padding-block: props.get(vars.$pad-b--sm);
144 } 144 }
145 } 145 }
146 } 146 }
147} 147}
diff --git a/src/objects/_table.vars.scss b/src/objects/_table.vars.scss
index d1d53d7..b8d8093 100644
--- a/src/objects/_table.vars.scss
+++ b/src/objects/_table.vars.scss
@@ -4,7 +4,7 @@
4 4
5$pad-i: props.def(--o-table--pad-i, props.get(core.$size--175)) !default; 5$pad-i: props.def(--o-table--pad-i, props.get(core.$size--175)) !default;
6$pad-b: props.def(--o-table--pad-b, props.get(core.$size--125)) !default; 6$pad-b: props.def(--o-table--pad-b, props.get(core.$size--125)) !default;
7$rounding: props.def(--o-table--rounding, props.get(core.$rounding)) !default; 7$rounding: props.def(--o-table--rounding, props.get(core.$rounding--sm)) !default;
8$border-width: props.def(--o-table--border-width, props.get(core.$border-width--thin)) !default; 8$border-width: props.def(--o-table--border-width, props.get(core.$border-width--thin)) !default;
9 9
10$heading--font-family: props.def(--o-table--heading--font-family, props.get(core.$font--standard--family)) !default; 10$heading--font-family: props.def(--o-table--heading--font-family, props.get(core.$font--standard--family)) !default;
diff --git a/src/objects/_tabs.scss b/src/objects/_tabs.scss
deleted file mode 100644
index 61085c2..0000000
--- a/src/objects/_tabs.scss
+++ /dev/null
@@ -1,127 +0,0 @@
1@use 'sass:map';
2@use 'sass:meta';
3@use 'sass:string';
4@use 'iro-sass/src/bem';
5@use 'iro-sass/src/props';
6@use '../props' as *;
7
8@forward 'tabs.vars';
9@use 'tabs.vars' as vars;
10
11@mixin styles {
12 @include materialize-at-root(meta.module-variables('vars'));
13
14 @include bem.object('tabs') {
15 position: relative;
16 display: flex;
17 gap: props.get(vars.$spacing);
18 min-inline-size: 0;
19 block-size: props.get(vars.$block-size);
20 padding-inline: calc(.5 * props.get(vars.$spacing));
21 margin-inline: calc(-.5 * props.get(vars.$spacing));
22 overflow-inline: auto;
23
24 &::after {
25 position: absolute;
26 inset-block-end: 0;
27 inset-inline: calc(.5 * props.get(vars.$spacing));
28 z-index: -10;
29 block-size: props.get(vars.$indicator--width);
30 content: '';
31 background-color: props.get(vars.$railing--bg-color);
32 }
33
34 @include bem.modifier('quiet') {
35 &::after {
36 display: none;
37 }
38 }
39
40 @include bem.modifier('adapt') {
41 block-size: 100%;
42 }
43
44 @include bem.elem('tab') {
45 position: relative;
46 display: flex;
47 align-items: center;
48 color: props.get(vars.$tab--text-color);
49 white-space: nowrap;
50 border-block: props.get(vars.$indicator--width) solid transparent;
51
52 &::before {
53 position: absolute;
54 inset-block-start: 50%;
55 inset-inline: calc(-1 * props.get(vars.$tab--pad-i));
56 z-index: -10;
57 block-size: 1.5em;
58 content: '';
59 border-radius: props.get(vars.$rounding);
60 transform: translateY(-50%);
61 }
62
63 &:link,
64 &:visited {
65 &:hover,
66 &:active,
67 &:focus-visible {
68 color: props.get(vars.$tab--selected--text-color);
69 }
70
71 &:focus-visible {
72 &::before {
73 color: props.get(vars.$key-focus--text-color);
74 text-decoration: none;
75 outline: props.get(vars.$key-focus--border-color) solid props.get(vars.$key-focus--border-width);
76 box-shadow: 0 0 0
77 calc(props.get(vars.$key-focus--border-width) + props.get(vars.$key-focus--outline-width))
78 props.get(vars.$key-focus--outline-color);
79 }
80 }
81 }
82
83 @include bem.is('selected') {
84 color: props.get(vars.$tab--selected--text-color);
85 border-block-end-color: props.get(vars.$tab--selected--text-color);
86 }
87 }
88
89 @include bem.elem('caret') {
90 display: none;
91 }
92
93 @include bem.modifier('accent') {
94 @include bem.elem('tab') {
95 @include bem.is('selected') {
96 color: props.get(vars.$tab--accent--text-color);
97 border-block-end-color: props.get(vars.$tab--accent--text-color);
98 }
99 }
100 }
101
102 @include bem.is('collapsed') {
103 @include bem.elem('tab') {
104 display: none;
105
106 @include bem.is('selected') {
107 display: flex;
108 color: props.get(vars.$tab--text-color);
109 border-block-end-color: transparent;
110
111 &:link,
112 &:visited {
113 &:hover,
114 &:active,
115 &:focus-visible {
116 color: props.get(vars.$tab--selected--text-color);
117 }
118 }
119 }
120 }
121
122 @include bem.elem('caret') {
123 display: block;
124 }
125 }
126 }
127}
diff --git a/src/objects/_tabs.vars.scss b/src/objects/_tabs.vars.scss
deleted file mode 100644
index 08b24cb..0000000
--- a/src/objects/_tabs.vars.scss
+++ /dev/null
@@ -1,25 +0,0 @@
1@use 'sass:map';
2@use 'sass:string';
3@use 'iro-sass/src/props';
4@use '../core.vars' as core;
5
6$block-size: props.def(--o-tabs--block-size, props.get(core.$size--700)) !default;
7$rounding: props.def(--o-tabs--rounding, props.get(core.$rounding)) !default;
8$spacing: props.def(--o-tabs--spacing, props.get(core.$size--400)) !default;
9$tab--pad-i: props.def(--o-tabs--tab--pad-i, props.get(core.$size--50)) !default;
10
11$indicator--width: props.def(--o-tabs--indicator--width, props.get(core.$border-width--medium)) !default;
12
13$key-focus--border-width: props.def(--o-tabs--key-focus--border-width, props.get(core.$key-focus--border-width)) !default;
14$key-focus--border-offset: props.def(--o-tabs--key-focus--border-offset, props.get(core.$key-focus--border-offset)) !default;
15$key-focus--outline-width: props.def(--o-tabs--key-focus--outline-width, props.get(core.$key-focus--outline-width)) !default;
16
17$tab--text-color: props.def(--o-tabs--tab--text-color, props.get(core.$theme, --text-mute), 'color') !default;
18$tab--selected--text-color: props.def(--o-tabs--tab--selected--text-color, props.get(core.$theme, --heading), 'color') !default;
19$tab--accent--text-color: props.def(--o-tabs--tab--accent--text-color, props.get(core.$theme, --accent, --1100), 'color') !default;
20
21$railing--bg-color: props.def(--o-tabs--railing--bg-color, props.get(core.$theme, --border-mute), 'color') !default;
22
23$key-focus--text-color: props.def(--o-tabs--key-focus--text-color, props.get(core.$theme, --focus, --text), 'color') !default;
24$key-focus--border-color: props.def(--o-tabs--key-focus--border-color, props.get(core.$theme, --focus, --border), 'color') !default;
25$key-focus--outline-color: props.def(--o-tabs--key-focus--outline-color, props.get(core.$theme, --focus, --outline), 'color') !default;
diff --git a/src/objects/_text-field.scss b/src/objects/_text-field.scss
index 6c0e7d2..b89e148 100644
--- a/src/objects/_text-field.scss
+++ b/src/objects/_text-field.scss
@@ -7,159 +7,181 @@
7@use 'text-field.vars' as vars; 7@use 'text-field.vars' as vars;
8 8
9@mixin -invalid { 9@mixin -invalid {
10 $focus-border-offset: calc(props.get(vars.$border-width) - props.get(vars.$focus--border-width)); 10 $focus-border-offset: calc(props.get(vars.$border-width) - props.get(vars.$focus--border-width));
11 11
12 @include bem.sibling-elem('bg') { 12 @include bem.sibling-elem('bg') {
13 inset-block: $focus-border-offset; 13 inset-block: $focus-border-offset;
14 inset-inline: $focus-border-offset; 14 inset-inline: $focus-border-offset;
15 border: props.get(vars.$focus--border-width) solid props.get(vars.$error--border-color); 15 border: props.get(vars.$focus--border-width) solid props.get(vars.$error--border-color);
16 border-radius: calc(props.get(vars.$rounding) - $focus-border-offset); 16 border-radius: calc(props.get(vars.$rounding) - $focus-border-offset);
17 } 17 }
18 18
19 &:hover { 19 &:hover {
20 @include bem.sibling-elem('bg') { 20 @include bem.sibling-elem('bg') {
21 border-color: props.get(vars.$error--hover--border-color); 21 border-color: props.get(vars.$error--hover--border-color);
22 } 22 }
23 } 23 }
24 24
25 &:focus { 25 &:focus {
26 @include bem.sibling-elem('bg') { 26 @include bem.sibling-elem('bg') {
27 border-color: props.get(vars.$error--focus--border-color); 27 border-color: props.get(vars.$error--focus--border-color);
28 } 28 }
29 } 29 }
30} 30}
31 31
32@mixin -keyboard-focus { 32@mixin -keyboard-focus {
33 @include bem.sibling-elem('bg') { 33 @include bem.sibling-elem('bg') {
34 border-color: props.get(vars.$key-focus--border-color); 34 outline: props.get(vars.$key-focus--outline-color) solid props.get(vars.$key-focus--border-width);
35 outline: props.get(vars.$key-focus--outline-color) solid props.get(vars.$key-focus--border-width); 35 border-color: props.get(vars.$key-focus--border-color);
36 //outline-offset: props.get(vars.$focus --border); 36 //outline-offset: props.get(vars.$focus --border);
37 } 37 }
38} 38}
39 39
40@mixin styles { 40@mixin styles {
41 @include materialize-at-root(meta.module-variables('vars')); 41 @include materialize-at-root(meta.module-variables('vars'));
42 42
43 @include bem.object('text-field') { 43 @include bem.object('text-field') {
44 $focus-border-offset: calc(props.get(vars.$border-width) - props.get(vars.$focus--border-width)); 44 $focus-border-offset: calc(props.get(vars.$border-width) - props.get(vars.$focus--border-width));
45 45
46 position: relative; 46 position: relative;
47 min-inline-size: 0; 47 min-inline-size: 0;
48 background-color: props.get(vars.$bg-color); 48 background-color: props.get(vars.$bg-color);
49 border-radius: props.get(vars.$rounding); 49 border-radius: props.get(vars.$rounding);
50 50
51 @include bem.elem('bg') { 51 @include bem.elem('bg') {
52 position: absolute; 52 position: absolute;
53 inset-block: 0; 53 inset-block: 0;
54 inset-inline: 0; 54 inset-inline: 0;
55 display: block; 55 display: block;
56 pointer-events: none; 56 pointer-events: none;
57 border: props.get(vars.$border-width) solid props.get(vars.$border-color); 57 border: props.get(vars.$border-width) solid props.get(vars.$border-color);
58 border-radius: props.get(vars.$rounding); 58 border-radius: props.get(vars.$rounding);
59 } 59 }
60 60
61 @include bem.elem('native') { 61 @include bem.elem('native') {
62 box-sizing: border-box; 62 box-sizing: border-box;
63 inline-size: 100%; 63 inline-size: 100%;
64 padding-block: calc(props.get(vars.$pad-b) - .5em * (props.get(vars.$line-height) - 1)); 64 padding-block: calc(props.get(vars.$pad-b) - .5em * (props.get(vars.$line-height) - 1));
65 padding-inline: props.get(vars.$pad-i); 65 padding-inline: props.get(vars.$pad-i);
66 font: inherit; 66 font: inherit;
67 line-height: props.get(vars.$line-height); 67 line-height: props.get(vars.$line-height);
68 color: props.get(vars.$text-color); 68 color: props.get(vars.$text-color);
69 appearance: none; 69 appearance: none;
70 resize: none; 70 resize: none;
71 background-color: transparent; 71 background-color: transparent;
72 border: 1px solid transparent; 72 border: 1px solid transparent;
73 73
74 &::placeholder { 74 &::placeholder {
75 font-style: italic; 75 font-style: italic;
76 color: props.get(vars.$placeholder-color); 76 color: props.get(vars.$placeholder-color);
77 opacity: 1; 77 opacity: 1;
78 } 78 }
79 79
80 &:hover { 80 &:hover {
81 @include bem.sibling-elem('bg') { 81 @include bem.sibling-elem('bg') {
82 border-color: props.get(vars.$hover--border-color); 82 border-color: props.get(vars.$hover--border-color);
83 } 83 }
84 } 84 }
85 85
86 &:focus { 86 &:focus {
87 outline: 0; 87 outline: 0;
88 88
89 @include bem.sibling-elem('bg') { 89 @include bem.sibling-elem('bg') {
90 inset-block: $focus-border-offset; 90 inset-block: $focus-border-offset;
91 inset-inline: $focus-border-offset; 91 inset-inline: $focus-border-offset;
92 border: props.get(vars.$focus--border-width) solid props.get(vars.$focus--border-color); 92 border: props.get(vars.$focus--border-width) solid props.get(vars.$focus--border-color);
93 border-radius: calc(props.get(vars.$rounding) - $focus-border-offset); 93 border-radius: calc(props.get(vars.$rounding) - $focus-border-offset);
94 } 94 }
95 } 95 }
96 96
97 &:invalid { 97 &:invalid {
98 @include -invalid; 98 @include -invalid;
99 } 99 }
100 100
101 &:focus-visible, 101 &:focus-visible,
102 &:invalid:focus-visible { 102 &:invalid:focus-visible {
103 @include -keyboard-focus; 103 @include -keyboard-focus;
104 } 104 }
105 } 105 }
106 106
107 @include bem.modifier('extended') { 107 @include bem.modifier('extended') {
108 padding: props.get(vars.$extended--pad); 108 padding: props.get(vars.$extended--pad);
109 109
110 @include bem.multi('&', 'elem' 'bg') { 110 @include bem.multi('&', 'elem' 'bg') {
111 border-radius: calc(props.get(vars.$rounding) + props.get(vars.$extended--pad)); 111 border-radius: calc(props.get(vars.$rounding) + props.get(vars.$extended--pad));
112 } 112 }
113 113
114 @include bem.elem('native') { 114 @include bem.elem('native') {
115 &:focus { 115 &:focus {
116 @include bem.sibling-elem('bg') { 116 @include bem.sibling-elem('bg') {
117 border-radius: calc(props.get(vars.$rounding) + props.get(vars.$extended--pad) - $focus-border-offset); 117 border-radius: calc(props.get(vars.$rounding) + props.get(vars.$extended--pad) - $focus-border-offset);
118 } 118 }
119 } 119 }
120 } 120 }
121 } 121 }
122 122
123 @include bem.is('invalid') { 123 @include bem.modifier('pill') {
124 @include bem.elem('native') { 124 @include bem.multi('&', 'elem' 'bg') {
125 @include -invalid; 125 border-radius: 100em;
126 }
126 127
127 &:focus-visible { 128 @include bem.elem('native') {
128 @include -keyboard-focus; 129 padding-inline: props.get(vars.$pad-i-pill);
129 }
130 }
131 }
132 130
133 @include bem.is('disabled') { 131 &:focus {
134 background-color: props.get(vars.$disabled--bg-color); 132 @include bem.sibling-elem('bg') {
133 border-radius: 100em;
134 }
135 }
136 }
135 137
136 @include bem.elem('native') { 138 @include bem.modifier('extended') {
137 color: props.get(vars.$disabled--text-color); 139 @include bem.elem('native') {
140 padding-inline: props.get(vars.$pad-i);
141 }
142 }
143 }
138 144
139 &::placeholder { 145 @include bem.is('invalid') {
140 color: props.get(vars.$disabled--placeholder-color); 146 @include bem.elem('native') {
141 } 147 @include -invalid;
142 }
143 148
144 @include bem.elem('bg') { 149 &:focus-visible {
145 border-color: props.get(vars.$disabled--border-color); 150 @include -keyboard-focus;
146 } 151 }
152 }
153 }
147 154
148 @include bem.is('invalid') { 155 @include bem.is('disabled') {
149 @include bem.elem('native') { 156 background-color: props.get(vars.$disabled--bg-color);
150 @include bem.sibling-elem('bg') {
151 border-color: props.get(vars.$disabled--border-color);
152 }
153 }
154 }
155 157
156 @include bem.elem('native') { 158 @include bem.elem('native') {
157 &:invalid { 159 color: props.get(vars.$disabled--text-color);
158 @include bem.sibling-elem('bg') { 160
159 border-color: props.get(vars.$disabled--border-color); 161 &::placeholder {
160 } 162 color: props.get(vars.$disabled--placeholder-color);
161 } 163 }
162 } 164 }
163 } 165
164 } 166 @include bem.elem('bg') {
167 border-color: props.get(vars.$disabled--border-color);
168 }
169
170 @include bem.is('invalid') {
171 @include bem.elem('native') {
172 @include bem.sibling-elem('bg') {
173 border-color: props.get(vars.$disabled--border-color);
174 }
175 }
176 }
177
178 @include bem.elem('native') {
179 &:invalid {
180 @include bem.sibling-elem('bg') {
181 border-color: props.get(vars.$disabled--border-color);
182 }
183 }
184 }
185 }
186 }
165} 187}
diff --git a/src/objects/_text-field.vars.scss b/src/objects/_text-field.vars.scss
index 833eacb..51099d8 100644
--- a/src/objects/_text-field.vars.scss
+++ b/src/objects/_text-field.vars.scss
@@ -4,9 +4,10 @@
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)) !default; 10$rounding: props.def(--o-text-field--rounding, props.get(core.$rounding--sm)) !default;
10 11
11$extended--pad: props.def(--o-text-field--extended--pad, props.get(core.$size--50)) !default; 12$extended--pad: props.def(--o-text-field--extended--pad, props.get(core.$size--50)) !default;
12 13
diff --git a/src/objects/_thumbnail.scss b/src/objects/_thumbnail.scss
index 73a8cb0..60a98af 100644
--- a/src/objects/_thumbnail.scss
+++ b/src/objects/_thumbnail.scss
@@ -9,96 +9,96 @@
9@use 'thumbnail.vars' as vars; 9@use 'thumbnail.vars' as vars;
10 10
11@mixin styles { 11@mixin styles {
12 @include materialize-at-root(meta.module-variables('vars')); 12 @include materialize-at-root(meta.module-variables('vars'));
13 13
14 @include bem.object('thumbnail') { 14 @include bem.object('thumbnail') {
15 position: relative; 15 position: relative;
16 display: block; 16 display: block;
17 flex: 0 0 auto; 17 flex: 0 0 auto;
18 inline-size: props.get(vars.$size); 18 inline-size: props.get(vars.$size);
19 block-size: props.get(vars.$size); 19 block-size: props.get(vars.$size);
20 overflow: hidden; 20 overflow: hidden;
21 border-radius: props.get(vars.$rounding); 21 outline: props.get(vars.$border-color) solid props.get(vars.$border-width);
22 outline: props.get(vars.$border-color) solid props.get(vars.$border-width); 22 outline-offset: calc(-1 * props.get(vars.$border-width));
23 outline-offset: calc(-1 * props.get(vars.$border-width)); 23 border-radius: props.get(vars.$rounding);
24 opacity: .75; 24 opacity: .75;
25 25
26 &:hover, 26 &:hover,
27 &:active, 27 &:active,
28 &:focus-visible { 28 &:focus-visible {
29 outline-color: props.get(vars.$hover--border-color); 29 outline-color: props.get(vars.$hover--border-color);
30 opacity: 1; 30 opacity: 1;
31 } 31 }
32 32
33 @include bem.is('selected') { 33 @include bem.is('selected') {
34 $focus-border-offset: calc(-1 * props.get(vars.$selected--border-width)); 34 $focus-border-offset: calc(-1 * props.get(vars.$selected--border-width));
35 35
36 margin: $focus-border-offset; 36 margin: $focus-border-offset;
37 border: props.get(vars.$selected--border-width) solid props.get(vars.$selected--border-color); 37 outline: none;
38 border-radius: calc(props.get(vars.$rounding) - $focus-border-offset); 38 border: props.get(vars.$selected--border-width) solid props.get(vars.$selected--border-color);
39 outline: none; 39 border-radius: calc(props.get(vars.$rounding) - $focus-border-offset);
40 opacity: 1; 40 opacity: 1;
41 } 41 }
42 42
43 @include bem.elem('image') { 43 @include bem.elem('image') {
44 position: absolute; 44 position: absolute;
45 inset-block-start: 0; 45 inset-block-start: 0;
46 inset-inline-start: 0; 46 inset-inline-start: 0;
47 display: block; 47 display: block;
48 inline-size: 100%; 48 inline-size: 100%;
49 block-size: 100%; 49 block-size: 100%;
50 object-fit: cover; 50 object-fit: cover;
51 object-position: center center; 51 object-position: center center;
52 } 52 }
53 53
54 @include bem.elem('icon') { 54 @include bem.elem('icon') {
55 position: absolute; 55 position: absolute;
56 inset-block-start: 50%; 56 inset-block-start: 50%;
57 inset-inline-start: 50%; 57 inset-inline-start: 50%;
58 transform: translate(-50%, -50%); 58 transform: translate(-50%, -50%);
59 } 59 }
60 60
61 &:focus-visible { 61 &:focus-visible {
62 $focus-border-offset: calc(-1 * props.get(vars.$key-focus--border-offset)); 62 $focus-border-offset: calc(-1 * props.get(vars.$key-focus--border-offset));
63 63
64 margin: $focus-border-offset; 64 margin: $focus-border-offset;
65 border: props.get(vars.$key-focus--border-offset) solid transparent; 65 outline: props.get(vars.$key-focus--border-color) solid props.get(vars.$key-focus--border-width);
66 border-radius: calc(props.get(vars.$rounding) - $focus-border-offset); 66 outline-offset: 0;
67 outline: props.get(vars.$key-focus--border-color) solid props.get(vars.$key-focus--border-width); 67 border: props.get(vars.$key-focus--border-offset) solid transparent;
68 outline-offset: 0; 68 border-radius: calc(props.get(vars.$rounding) - $focus-border-offset);
69 box-shadow: 69 box-shadow:
70 0 70 0
71 0 71 0
72 0 72 0
73 calc(props.get(vars.$key-focus--outline-width) + props.get(vars.$key-focus--border-width)) 73 calc(props.get(vars.$key-focus--outline-width) + props.get(vars.$key-focus--border-width))
74 props.get(vars.$key-focus--outline-color); 74 props.get(vars.$key-focus--outline-color);
75 } 75 }
76 76
77 @each $theme in map.keys(props.get(vars.$static-themes)) { 77 @each $theme in map.keys(props.get(vars.$static-themes)) {
78 @include bem.modifier(string.slice($theme, 3)) { 78 @include bem.modifier(string.slice($theme, 3)) {
79 outline-color: props.get(vars.$static-themes, $theme, --border); 79 outline-color: props.get(vars.$static-themes, $theme, --border);
80 80
81 &:hover, 81 &:hover,
82 &:active, 82 &:active,
83 &:focus-visible { 83 &:focus-visible {
84 outline-color: props.get(vars.$static-themes, $theme, --hover, --border); 84 outline-color: props.get(vars.$static-themes, $theme, --hover, --border);
85 } 85 }
86 86
87 @include bem.is('selected') { 87 @include bem.is('selected') {
88 border-color: props.get(vars.$static-themes, $theme, --selected, --border); 88 border-color: props.get(vars.$static-themes, $theme, --selected, --border);
89 } 89 }
90 90
91 &:focus-visible { 91 &:focus-visible {
92 border-color: transparent; 92 outline-color: props.get(vars.$static-themes, $theme, --key-focus, --border);
93 outline-color: props.get(vars.$static-themes, $theme, --key-focus, --border); 93 border-color: transparent;
94 box-shadow: 94 box-shadow:
95 0 95 0
96 0 96 0
97 0 97 0
98 calc(props.get(vars.$key-focus--outline-width) + props.get(vars.$key-focus--border-width)) 98 calc(props.get(vars.$key-focus--outline-width) + props.get(vars.$key-focus--border-width))
99 props.get(vars.$static-themes, $theme, --key-focus, --outline); 99 props.get(vars.$static-themes, $theme, --key-focus, --outline);
100 } 100 }
101 } 101 }
102 } 102 }
103 } 103 }
104} 104}
diff --git a/src/objects/_thumbnail.vars.scss b/src/objects/_thumbnail.vars.scss
index ba8cebe..e49e52e 100644
--- a/src/objects/_thumbnail.vars.scss
+++ b/src/objects/_thumbnail.vars.scss
@@ -4,7 +4,7 @@
4@use '../core.vars' as core; 4@use '../core.vars' as core;
5 5
6$size: props.def(--o-thumbnail--size, props.get(core.$size--700)) !default; 6$size: props.def(--o-thumbnail--size, props.get(core.$size--700)) !default;
7$rounding: props.def(--o-thumbnail--rounding, props.get(core.$rounding)) !default; 7$rounding: props.def(--o-thumbnail--rounding, props.get(core.$rounding--sm)) !default;
8$spacing: props.def(--o-thumbnail--spacing, props.get(core.$size--100)) !default; 8$spacing: props.def(--o-thumbnail--spacing, props.get(core.$size--100)) !default;
9$border-width: props.def(--o-thumbnail--border-width, props.get(core.$border-width--thin)) !default; 9$border-width: props.def(--o-thumbnail--border-width, props.get(core.$border-width--thin)) !default;
10 10
@@ -28,24 +28,24 @@ $size--md: props.def(--o-thumbnail--size, props.get(core.$size--600), 'md') !def
28$static-themes: props.def(--o-thumbnail, (), 'color'); 28$static-themes: props.def(--o-thumbnail, (), 'color');
29 29
30@each $theme in map.keys(props.get(core.$transparent-colors)) { 30@each $theme in map.keys(props.get(core.$transparent-colors)) {
31 $thumbnail-theme: --static-#{string.slice($theme, 3)}; 31 $thumbnail-theme: --static-#{string.slice($theme, 3)};
32 32
33 $static-themes: props.merge($static-themes, ( 33 $static-themes: props.merge($static-themes, (
34 $thumbnail-theme: ( 34 $thumbnail-theme: (
35 --border: props.get(core.$transparent-colors, $theme, --400), 35 --border: props.get(core.$transparent-colors, $theme, --400),
36 36
37 --hover: ( 37 --hover: (
38 --border: props.get(core.$transparent-colors, $theme, --500), 38 --border: props.get(core.$transparent-colors, $theme, --500),
39 ), 39 ),
40 40
41 --selected: ( 41 --selected: (
42 --border: props.get(core.$transparent-colors, $theme, --900), 42 --border: props.get(core.$transparent-colors, $theme, --900),
43 ), 43 ),
44 44
45 --key-focus: ( 45 --key-focus: (
46 --border: props.get(core.$transparent-colors, $theme, --900), 46 --border: props.get(core.$transparent-colors, $theme, --900),
47 --outline: props.get(core.$transparent-colors, $theme, --300), 47 --outline: props.get(core.$transparent-colors, $theme, --300),
48 ), 48 ),
49 ) 49 )
50 )); 50 ));
51} 51}
diff --git a/src/scopes/_blockquotes.scss b/src/scopes/_blockquotes.scss
index 91a7785..a99add8 100644
--- a/src/scopes/_blockquotes.scss
+++ b/src/scopes/_blockquotes.scss
@@ -7,20 +7,20 @@
7@use 'blockquotes.vars' as vars; 7@use 'blockquotes.vars' as vars;
8 8
9@mixin styles { 9@mixin styles {
10 @include materialize-at-root(meta.module-variables('vars')); 10 @include materialize-at-root(meta.module-variables('vars'));
11 11
12 @include bem.scope('blockquotes') { 12 @include bem.scope('blockquotes') {
13 blockquote { 13 blockquote {
14 padding-inline-start: calc(props.get(vars.$indent) - props.get(vars.$border-width)); 14 padding-inline-start: calc(props.get(vars.$indent) - props.get(vars.$border-width));
15 margin-block: props.get(vars.$margin-bs) 0; 15 margin-block: props.get(vars.$margin-bs) 0;
16 margin-inline: 1px 0; 16 margin-inline: 1px 0;
17 border-inline-start: props.get(vars.$border-width) solid props.get(vars.$border-color); 17 border-inline-start: props.get(vars.$border-width) solid props.get(vars.$border-color);
18 } 18 }
19 19
20 @include bem.modifier('compact') { 20 @include bem.modifier('compact') {
21 blockquote { 21 blockquote {
22 padding-inline-start: calc(props.get(vars.$compact--indent) - props.get(vars.$border-width)); 22 padding-inline-start: calc(props.get(vars.$compact--indent) - props.get(vars.$border-width));
23 } 23 }
24 } 24 }
25 } 25 }
26} 26}
diff --git a/src/scopes/_body.scss b/src/scopes/_body.scss
index 9091117..f307f58 100644
--- a/src/scopes/_body.scss
+++ b/src/scopes/_body.scss
@@ -7,44 +7,53 @@
7@use 'body.vars' as vars; 7@use 'body.vars' as vars;
8 8
9@mixin styles { 9@mixin styles {
10 @include materialize-at-root(meta.module-variables('vars')); 10 @include materialize-at-root(meta.module-variables('vars'));
11 11
12 @include bem.scope('body') { 12 @include bem.scope('body') {
13 font-size: props.get(vars.$font-size); 13 font-size: props.get(vars.$font-size);
14 line-height: props.get(vars.$line-height);
14 15
15 p, 16 strong {
16 li { 17 color: props.get(vars.$strong--text-color);
17 max-inline-size: props.get(vars.$paragraph--max-inline-size); 18 }
18 margin-block-start: props.get(vars.$paragraph--margin-bs);
19 }
20 19
21 img { 20 p,
22 display: block; 21 ul,
23 inline-size: auto; 22 ol {
24 max-inline-size: 100%; 23 max-inline-size: props.get(vars.$paragraph--max-inline-size);
25 block-size: auto; 24 margin-block-start: props.get(vars.$paragraph--margin-bs);
26 max-block-size: props.get(vars.$img--max-block-size); 25 }
27 margin-block-start: props.get(vars.$paragraph--margin-bs);
28 }
29 26
30 figure { 27 ul,
31 margin-block-start: props.get(vars.$paragraph--margin-bs); 28 ol {
29 box-sizing: border-box;
30 }
32 31
33 img { 32 img {
34 margin-block: 0; 33 display: block;
35 } 34 inline-size: auto;
36 } 35 max-inline-size: 100%;
36 block-size: auto;
37 max-block-size: props.get(vars.$img--max-block-size);
38 margin-block-start: props.get(vars.$paragraph--margin-bs);
39 }
37 40
38 hr { 41 figure {
39 margin-block: calc(2 * props.get(vars.$paragraph--margin-bs)); 42 margin-block-start: props.get(vars.$paragraph--margin-bs);
40 }
41 43
42 ul, 44 img {
43 ol, 45 margin-block: 0;
44 table, 46 }
45 pre, 47 }
46 blockquote { 48
47 margin-block-start: props.get(vars.$paragraph--margin-bs); 49 hr {
48 } 50 margin-block: calc(2 * props.get(vars.$paragraph--margin-bs));
49 } 51 }
52
53 table,
54 pre,
55 blockquote {
56 margin-block-start: props.get(vars.$paragraph--margin-bs);
57 }
58 }
50} 59}
diff --git a/src/scopes/_body.vars.scss b/src/scopes/_body.vars.scss
index 79556fa..1de2cfd 100644
--- a/src/scopes/_body.vars.scss
+++ b/src/scopes/_body.vars.scss
@@ -4,6 +4,9 @@
4@use '../layouts/container.vars' as container; 4@use '../layouts/container.vars' as container;
5 5
6$font-size: props.def(--s-body--font-size, props.get(core.$font-size--150)) !default; 6$font-size: props.def(--s-body--font-size, props.get(core.$font-size--150)) !default;
7$line-height: props.def(--s-body--line-height, calc(props.get(core.$font--standard--line-height) + .1)) !default;
7$paragraph--margin-bs: props.def(--s-body--paragraph--margin-bs, props.get(core.$size--300)) !default; 8$paragraph--margin-bs: props.def(--s-body--paragraph--margin-bs, props.get(core.$size--300)) !default;
8$paragraph--max-inline-size: props.def(--s-body--paragraph--max-inline-size, props.get(container.$fixed)) !default; 9$paragraph--max-inline-size: props.def(--s-body--paragraph--max-inline-size, props.get(container.$fixed)) !default;
9$img--max-block-size: props.def(--s-body--img--max-block-size, calc(100vh - props.get(core.$size--2400))) !default; 10$img--max-block-size: props.def(--s-body--img--max-block-size, none) !default;
11
12$strong--text-color: props.def(--s-body--strong--text-color, props.get(core.$theme, --heading), 'color') !default;
diff --git a/src/scopes/_code.scss b/src/scopes/_code.scss
index 9b2a63d..8147a14 100644
--- a/src/scopes/_code.scss
+++ b/src/scopes/_code.scss
@@ -7,34 +7,34 @@
7@use 'code.vars' as vars; 7@use 'code.vars' as vars;
8 8
9@mixin styles { 9@mixin styles {
10 @include materialize-at-root(meta.module-variables('vars')); 10 @include materialize-at-root(meta.module-variables('vars'));
11 11
12 @include bem.scope('code') { 12 @include bem.scope('code') {
13 code { 13 code {
14 padding-block: props.get(vars.$inline--pad-b); 14 padding-block: props.get(vars.$inline--pad-b);
15 padding-inline: props.get(vars.$inline--pad-i); 15 padding-inline: props.get(vars.$inline--pad-i);
16 color: props.get(vars.$inline--fg); 16 color: props.get(vars.$inline--fg);
17 background-color: props.get(vars.$inline--bg); 17 background-color: props.get(vars.$inline--bg);
18 border-radius: props.get(vars.$inline--rounding); 18 border-radius: props.get(vars.$inline--rounding);
19 } 19 }
20 20
21 pre { 21 pre {
22 padding-block: props.get(vars.$block--pad-b); 22 padding-block: props.get(vars.$block--pad-b);
23 padding-inline: props.get(vars.$block--pad-i); 23 padding-inline: props.get(vars.$block--pad-i);
24 margin-block: props.get(vars.$block--margin-bs) 0; 24 margin-block: props.get(vars.$block--margin-bs) 0;
25 margin-inline: 0; 25 margin-inline: 0;
26 color: props.get(vars.$block--fg); 26 color: props.get(vars.$block--fg);
27 background-color: props.get(vars.$block--bg); 27 background-color: props.get(vars.$block--bg);
28 border-radius: props.get(vars.$block--rounding); 28 border-radius: props.get(vars.$block--rounding);
29 29
30 code { 30 code {
31 display: inline-block; 31 display: inline-block;
32 padding: 0; 32 padding: 0;
33 margin-inline-end: props.get(vars.$block--pad-i); 33 margin-inline-end: props.get(vars.$block--pad-i);
34 color: currentColor; 34 color: currentColor;
35 background-color: transparent; 35 background-color: transparent;
36 border-radius: 0; 36 border-radius: 0;
37 } 37 }
38 } 38 }
39 } 39 }
40} 40}
diff --git a/src/scopes/_code.vars.scss b/src/scopes/_code.vars.scss
index 8a040c2..08472f2 100644
--- a/src/scopes/_code.vars.scss
+++ b/src/scopes/_code.vars.scss
@@ -4,12 +4,12 @@
4 4
5$inline--pad-i: props.def(--s-code--inline--pad-i, props.get(core.$size--50)) !default; 5$inline--pad-i: props.def(--s-code--inline--pad-i, props.get(core.$size--50)) !default;
6$inline--pad-b: props.def(--s-code--inline--pad-b, props.get(core.$size--10)) !default; 6$inline--pad-b: props.def(--s-code--inline--pad-b, props.get(core.$size--10)) !default;
7$inline--rounding: props.def(--s-code--inline--rounding, props.get(core.$rounding)) !default; 7$inline--rounding: props.def(--s-code--inline--rounding, props.get(core.$rounding--sm)) !default;
8 8
9$block--pad-i: props.def(--s-code--block--pad-i, props.get(core.$size--150)) !default; 9$block--pad-i: props.def(--s-code--block--pad-i, props.get(core.$size--150)) !default;
10$block--pad-b: props.def(--s-code--block--pad-b, props.get(core.$size--85)) !default; 10$block--pad-b: props.def(--s-code--block--pad-b, props.get(core.$size--85)) !default;
11$block--margin-bs: props.def(--s-code--block--margin-bs, props.get(implicit.$paragraph--margin-bs)) !default; 11$block--margin-bs: props.def(--s-code--block--margin-bs, props.get(implicit.$paragraph--margin-bs)) !default;
12$block--rounding: props.def(--s-code--block--rounding, props.get(core.$rounding)) !default; 12$block--rounding: props.def(--s-code--block--rounding, props.get(core.$rounding--sm)) !default;
13 13
14$inline--fg: props.def(--s-code--inline--fg, props.get(core.$theme, --heading), 'color') !default; 14$inline--fg: props.def(--s-code--inline--fg, props.get(core.$theme, --heading), 'color') !default;
15$inline--bg: props.def(--s-code--inline--bg, props.get(core.$theme, --base, --200), 'color') !default; 15$inline--bg: props.def(--s-code--inline--bg, props.get(core.$theme, --base, --200), 'color') !default;
diff --git a/src/scopes/_figures.scss b/src/scopes/_figures.scss
new file mode 100644
index 0000000..d931820
--- /dev/null
+++ b/src/scopes/_figures.scss
@@ -0,0 +1,21 @@
1@use 'sass:meta';
2@use 'iro-sass/src/bem';
3@use 'iro-sass/src/props';
4@use '../objects/figure.vars' as figure;
5
6@mixin styles {
7 @include bem.scope('figures') {
8 figcaption {
9 padding-block: props.get(figure.$pad-b);
10 font-size: props.get(figure.$font-size);
11 color: props.get(figure.$text-color);
12 border-block-end: props.get(figure.$border-width) solid props.get(figure.$border-color);
13
14 &::before {
15 display: block;
16 margin-block: -100em 100em;
17 content: '';
18 }
19 }
20 }
21}
diff --git a/src/scopes/_headings.scss b/src/scopes/_headings.scss
index 32559cd..f8a7854 100644
--- a/src/scopes/_headings.scss
+++ b/src/scopes/_headings.scss
@@ -4,64 +4,64 @@
4@use '../objects/heading.vars' as heading; 4@use '../objects/heading.vars' as heading;
5 5
6@mixin styles { 6@mixin styles {
7 /* stylelint-disable-next-line scss/dollar-variable-pattern */ 7 /* stylelint-disable-next-line scss/dollar-variable-pattern */
8 $-size-map: ( 8 $-size-map: (
9 xs: h6, 9 xs: h6,
10 sm: h5, 10 sm: h5,
11 md: h4, 11 md: h4,
12 lg: h3, 12 lg: h3,
13 xl: h2, 13 xl: h2,
14 xxl: h1, 14 xxl: h1,
15 ); 15 );
16 16
17 @include bem.scope('headings') { 17 @include bem.scope('headings') {
18 h1, 18 h1,
19 h2, 19 h2,
20 h3, 20 h3,
21 h4, 21 h4,
22 h5, 22 h5,
23 h6 { 23 h6 {
24 display: block; 24 display: block;
25 margin-block-start: props.get(heading.$margin-bs); 25 margin-block-start: props.get(heading.$margin-bs);
26 font-family: props.get(heading.$font-family); 26 font-family: props.get(heading.$font-family);
27 font-weight: props.get(heading.$font-weight); 27 font-weight: props.get(heading.$font-weight);
28 font-feature-settings: props.get(heading.$feature-settings); 28 font-feature-settings: props.get(heading.$feature-settings);
29 line-height: props.get(heading.$line-height); 29 line-height: props.get(heading.$line-height);
30 text-transform: none; 30 text-transform: none;
31 letter-spacing: normal; 31 letter-spacing: normal;
32 transform: translateX(props.get(heading.$offset)); 32 transform: translateX(props.get(heading.$offset));
33 } 33 }
34 34
35 @include bem.elem('highlight') { 35 @include bem.elem('highlight') {
36 background-image: linear-gradient(to top, 36 background-image: linear-gradient(to top,
37 transparent .15em, 37 transparent .15em,
38 props.get(heading.$bg-color) .15em, 38 props.get(heading.$bg-color) .15em,
39 props.get(heading.$bg-color) .6em, 39 props.get(heading.$bg-color) .6em,
40 transparent .6em); 40 transparent .6em);
41 } 41 }
42 42
43 @each $mod, $font-family, $line-height, $font-size, $font-weight, $letter-spacing, $feature-settings in heading.$sizes { 43 @each $mod, $font-family, $line-height, $font-size, $font-weight, $letter-spacing, $feature-settings in heading.$sizes {
44 #{map.get($-size-map, $mod)} { 44 #{map.get($-size-map, $mod)} {
45 font-family: props.get($font-family); 45 font-family: props.get($font-family);
46 font-size: props.get($font-size); 46 font-size: props.get($font-size);
47 font-weight: props.get($font-weight); 47 font-weight: props.get($font-weight);
48 font-feature-settings: props.get($feature-settings); 48 font-feature-settings: props.get($feature-settings);
49 line-height: props.get($line-height); 49 line-height: props.get($line-height);
50 letter-spacing: props.get($letter-spacing); 50 letter-spacing: props.get($letter-spacing);
51 } 51 }
52 } 52 }
53 53
54 @include bem.modifier('display') { 54 @include bem.modifier('display') {
55 @each $mod, $font-family, $line-height, $font-size, $font-weight, $letter-spacing, $feature-settings in heading.$display--sizes { 55 @each $mod, $font-family, $line-height, $font-size, $font-weight, $letter-spacing, $feature-settings in heading.$display--sizes {
56 #{map.get($-size-map, $mod)} { 56 #{map.get($-size-map, $mod)} {
57 font-family: props.get($font-family); 57 font-family: props.get($font-family);
58 font-size: props.get($font-size); 58 font-size: props.get($font-size);
59 font-weight: props.get($font-weight); 59 font-weight: props.get($font-weight);
60 font-feature-settings: props.get($feature-settings); 60 font-feature-settings: props.get($feature-settings);
61 line-height: props.get($line-height); 61 line-height: props.get($line-height);
62 letter-spacing: props.get($letter-spacing); 62 letter-spacing: props.get($letter-spacing);
63 } 63 }
64 } 64 }
65 } 65 }
66 } 66 }
67} 67}
diff --git a/src/scopes/_implicit.scss b/src/scopes/_implicit.scss
index 020e311..cee1639 100644
--- a/src/scopes/_implicit.scss
+++ b/src/scopes/_implicit.scss
@@ -1,5 +1,7 @@
1@use 'sass:map';
1@use 'sass:math'; 2@use 'sass:math';
2@use 'sass:meta'; 3@use 'sass:meta';
4@use 'sass:string';
3@use 'iro-sass/src/bem'; 5@use 'iro-sass/src/bem';
4@use 'iro-sass/src/props'; 6@use 'iro-sass/src/props';
5@use '../props' as *; 7@use '../props' as *;
@@ -9,151 +11,170 @@
9@use 'implicit.vars' as vars; 11@use 'implicit.vars' as vars;
10 12
11@mixin styles { 13@mixin styles {
12 @include materialize-at-root(meta.module-variables('vars')); 14 @include materialize-at-root(meta.module-variables('vars'));
13 15
14 @layer scope { 16 @layer scope {
15 html { 17 html {
16 accent-color: props.get(core.$theme, --accent, --600); 18 accent-color: props.get(core.$theme, --accent, --600);
17 scrollbar-color: props.get(core.$theme, --text-disabled) transparent; 19 scrollbar-color: props.get(core.$theme, --text-disabled) transparent;
18 } 20 }
19 21
20 body { 22 body {
21 padding: 0; 23 padding: 0;
22 margin: 0; 24 margin: 0;
23 font-family: props.get(vars.$body--font-family); 25 font-family: props.get(vars.$body--font-family);
24 font-size: props.get(vars.$body--font-size); 26 font-size: props.get(vars.$body--font-size);
25 font-feature-settings: props.get(vars.$body--feature-settings); 27 font-feature-settings: props.get(vars.$body--feature-settings);
26 line-height: props.get(vars.$body--line-height); 28 line-height: props.get(vars.$body--line-height);
27 color: props.get(core.$theme, --text); 29 color: props.get(core.$theme, --text);
28 background-color: props.get(core.$theme, --bg-base); 30 background-color: props.get(core.$theme, --bg-base);
29 } 31 }
30 32
31 pre, 33 pre,
32 code { 34 code {
33 font-family: props.get(vars.$code--font-family); 35 font-family: props.get(vars.$code--font-family);
34 font-size: props.get(vars.$code--font-size); 36 font-size: props.get(vars.$code--font-size);
35 font-feature-settings: props.get(vars.$code--feature-settings); 37 font-feature-settings: props.get(vars.$code--feature-settings);
36 line-height: props.get(vars.$code--line-height); 38 line-height: props.get(vars.$code--line-height);
37 } 39 }
38 40
39 pre { 41 pre {
40 margin: 0; 42 margin: 0;
41 overflow-x: auto; 43 overflow-x: auto;
42 44
43 code { 45 code {
44 font-size: 1em; 46 font-size: 1em;
45 color: currentColor; 47 color: currentColor;
46 } 48 }
47 } 49 }
48 50
49 h1, 51 h1,
50 h2, 52 h2,
51 h3, 53 h3,
52 h4, 54 h4,
53 h5, 55 h5,
54 h6 { 56 h6 {
55 margin-block: props.get(vars.$heading--margin-bs) 0; 57 margin-block: props.get(vars.$heading--margin-bs) 0;
56 font-family: props.get(vars.$heading--font-family); 58 font-family: props.get(vars.$heading--font-family);
57 font-size: props.get(vars.$heading--font-size); 59 font-size: props.get(vars.$heading--font-size);
58 font-weight: props.get(vars.$heading--font-weight); 60 font-weight: props.get(vars.$heading--font-weight);
59 font-feature-settings: props.get(vars.$heading--feature-settings); 61 font-feature-settings: props.get(vars.$heading--feature-settings);
60 line-height: props.get(vars.$heading--line-height); 62 line-height: props.get(vars.$heading--line-height);
61 color: props.get(vars.$heading--color); 63 color: props.get(vars.$heading--color);
62 64
63 & + & { 65 & + & {
64 margin-block-start: props.get(vars.$heading--margin-bs-sibling); 66 margin-block-start: props.get(vars.$heading--margin-bs-sibling);
65 } 67 }
66 } 68 }
67 69
68 p { 70 p {
69 margin-block: props.get(vars.$paragraph--margin-bs) 0; 71 margin-block: props.get(vars.$paragraph--margin-bs) 0;
70 72
71 &:empty { 73 &:empty {
72 display: none; 74 display: none;
73 } 75 }
74 } 76 }
75 77
76 strong { 78 strong {
77 font-weight: bold; 79 font-weight: bold;
78 } 80 }
79 81
80 small { 82 small {
81 font-size: props.get(vars.$small--font-size); 83 font-size: props.get(vars.$small--font-size);
82 } 84 }
83 85
84 ul, 86 ul,
85 ol { 87 ol {
86 padding: 0; 88 padding: 0;
87 margin: 0; 89 margin: 0;
88 list-style: none; 90 list-style: none;
89 } 91 }
90 92
91 li { 93 li {
92 padding: 0; 94 padding: 0;
93 margin: 0; 95 margin: 0;
94 } 96 }
95 97
96 :focus, 98 :focus,
97 :focus-visible { 99 :focus-visible {
98 outline: 0; 100 outline: 0;
99 } 101 }
100 102
101 :link, 103 :link,
102 :visited { 104 :visited {
103 color: currentColor; 105 color: currentColor;
104 text-decoration: none; 106 text-decoration: none;
105 } 107 }
106 108
107 109
108 button, 110 button,
109 input, 111 input,
110 textarea { 112 textarea {
111 box-sizing: content-box; 113 box-sizing: content-box;
112 padding: 0; 114 padding: 0;
113 margin: 0; 115 margin: 0;
114 font-family: inherit; 116 font-family: inherit;
115 font-size: 1em; 117 font-size: 1em;
116 font-style: inherit; 118 font-style: inherit;
117 font-weight: inherit; 119 font-weight: inherit;
118 line-height: inherit; 120 line-height: inherit;
119 color: currentColor; 121 color: currentColor;
120 text-align: inherit; 122 text-align: inherit;
121 text-transform: inherit; 123 text-transform: inherit;
122 appearance: none; 124 appearance: none;
123 background: none; 125 background: none;
124 border: 0; 126 border: 0;
125 127
126 &::-moz-focus-inner { 128 &::-moz-focus-inner {
127 border: 0; 129 border: 0;
128 } 130 }
129 } 131 }
130 132
131 input, 133 input,
132 textarea { 134 textarea {
133 &::placeholder { 135 &::placeholder {
134 color: props.get(core.$theme, --text-mute); 136 color: props.get(core.$theme, --text-mute);
135 opacity: 1; 137 opacity: 1;
136 } 138 }
137 139
138 &:disabled { 140 &:disabled {
139 color: props.get(core.$theme, --text-disabled); 141 color: props.get(core.$theme, --text-disabled);
140 } 142 }
141 } 143 }
142 144
143 textarea { 145 textarea {
144 block-size: calc(1em * props.get(core.$font--standard--line-height)); 146 block-size: calc(1em * props.get(core.$font--standard--line-height));
145 } 147 }
146 148
147 hr { 149 hr {
148 block-size: props.get(core.$border-width--thin); 150 block-size: props.get(core.$border-width--thin);
149 margin: 0; 151 margin: 0;
150 background-color: props.get(core.$theme, --border); 152 background-color: props.get(core.$theme, --border);
151 border: 0; 153 border: 0;
152 } 154 }
153 155
154 figure { 156 figure {
155 padding: 0; 157 padding: 0;
156 margin: 0; 158 margin: 0;
157 } 159 }
158 } 160
161 @each $theme in map.keys(props.get(core.$transparent-colors)) {
162 .t-static-#{string.slice($theme, 3)} {
163 color: props.get(core.$transparent-colors, $theme, --800);
164
165 h1,
166 h2,
167 h3,
168 h4,
169 h5,
170 h6 {
171 color: props.get(core.$transparent-colors, $theme, --900);
172 }
173
174 hr {
175 color: props.get(core.$transparent-colors, $theme, --400);
176 }
177 }
178 }
179 }
159} 180}
diff --git a/src/scopes/_implicit.vars.scss b/src/scopes/_implicit.vars.scss
index e809ac3..388f0af 100644
--- a/src/scopes/_implicit.vars.scss
+++ b/src/scopes/_implicit.vars.scss
@@ -23,4 +23,4 @@ $heading--font-weight: props.def(--s-implicit--heading--font-weight, bold)
23$heading--font-size: props.def(--s-implicit--heading--font-size, props.get(core.$font-size--100)); 23$heading--font-size: props.def(--s-implicit--heading--font-size, props.get(core.$font-size--100));
24$heading--feature-settings: props.def(--s-implicit--heading--feature-settings, props.get(core.$font--standard--feature-settings)) !default; 24$heading--feature-settings: props.def(--s-implicit--heading--feature-settings, props.get(core.$font--standard--feature-settings)) !default;
25 25
26$heading--color: props.def(--s-implicit--heading--color, props.get(core.$theme, --heading), 'color'); 26$heading--color: props.def(--s-implicit--heading--color, props.get(core.$theme, --heading), 'color') !default;
diff --git a/src/scopes/_links.scss b/src/scopes/_links.scss
index 4092633..9ade0c2 100644
--- a/src/scopes/_links.scss
+++ b/src/scopes/_links.scss
@@ -9,111 +9,111 @@
9@use 'links.vars' as vars; 9@use 'links.vars' as vars;
10 10
11@mixin styles { 11@mixin styles {
12 @include materialize-at-root(meta.module-variables('vars')); 12 @include materialize-at-root(meta.module-variables('vars'));
13 13
14 @include bem.scope('links') { 14 @include bem.scope('links') {
15 :link, 15 :link,
16 :visited { 16 :visited {
17 color: currentColor; 17 color: currentColor;
18 text-decoration: underline; 18 text-decoration: underline;
19 text-decoration-thickness: props.get(vars.$underline-width); 19 text-decoration-thickness: props.get(vars.$underline-width);
20 text-decoration-color: props.get(vars.$underline-color); 20 text-decoration-color: props.get(vars.$underline-color);
21 border-radius: props.get(vars.$rounding); 21 border-radius: props.get(vars.$rounding-sm);
22 box-decoration-break: clone; 22 box-decoration-break: clone;
23 23
24 &:hover { 24 &:hover {
25 text-decoration: underline; 25 text-decoration: underline;
26 text-decoration-skip-ink: none; 26 text-decoration-thickness: props.get(vars.$hover--underline-width);
27 text-decoration-thickness: props.get(vars.$hover--underline-width); 27 text-decoration-skip-ink: none;
28 } 28 }
29 29
30 &:focus-visible { 30 &:focus-visible {
31 color: props.get(vars.$key-focus--text-color); 31 color: props.get(vars.$key-focus--text-color);
32 text-decoration: none; 32 text-decoration: none;
33 outline: props.get(vars.$key-focus--border-color) solid props.get(vars.$key-focus--border-width); 33 outline: props.get(vars.$key-focus--border-color) solid props.get(vars.$key-focus--border-width);
34 box-shadow: 34 box-shadow:
35 0 35 0
36 0 36 0
37 0 37 0
38 calc(props.get(vars.$key-focus--border-width) + props.get(vars.$key-focus--outline-width)) 38 calc(props.get(vars.$key-focus--border-width) + props.get(vars.$key-focus--outline-width))
39 props.get(vars.$key-focus--outline-color); 39 props.get(vars.$key-focus--outline-color);
40 } 40 }
41 } 41 }
42 42
43 @include bem.modifier('invisible') { 43 @include bem.modifier('invisible') {
44 :link, 44 :link,
45 :visited { 45 :visited {
46 text-decoration: none; 46 text-decoration: none;
47 } 47 }
48 } 48 }
49 49
50 @include bem.modifier('colored') { 50 @include bem.modifier('colored') {
51 :link { 51 :link {
52 color: props.get(vars.$colored--text-color); 52 color: props.get(vars.$colored--text-color);
53 text-decoration-color: props.get(vars.$colored--underline-color); 53 text-decoration-color: props.get(vars.$colored--underline-color);
54 54
55 &:hover { 55 &:hover {
56 color: props.get(vars.$colored--hover--text-color); 56 color: props.get(vars.$colored--hover--text-color);
57 } 57 }
58 } 58 }
59 59
60 :visited { 60 :visited {
61 color: props.get(vars.$colored--visited--text-color); 61 color: props.get(vars.$colored--visited--text-color);
62 text-decoration-color: props.get(vars.$colored--visited--underline-color); 62 text-decoration-color: props.get(vars.$colored--visited--underline-color);
63 63
64 &:hover { 64 &:hover {
65 color: props.get(vars.$colored--visited--hover--text-color); 65 color: props.get(vars.$colored--visited--hover--text-color);
66 } 66 }
67 } 67 }
68 } 68 }
69 69
70 @each $theme in map.keys(props.get(vars.$static-themes)) { 70 @each $theme in map.keys(props.get(vars.$static-themes)) {
71 @include bem.modifier(string.slice($theme, 3)) { 71 @include bem.modifier(string.slice($theme, 3)) {
72 :link, 72 :link,
73 :visited { 73 :visited {
74 color: props.get(vars.$static-themes, $theme, --text-color); 74 color: props.get(vars.$static-themes, $theme, --text-color);
75 text-decoration-color: props.get(vars.$static-themes, $theme, --underline-color); 75 text-decoration-color: props.get(vars.$static-themes, $theme, --underline-color);
76 76
77 &:hover { 77 &:hover {
78 color: props.get(vars.$static-themes, $theme, --hover, --text-color); 78 color: props.get(vars.$static-themes, $theme, --hover, --text-color);
79 } 79 }
80 80
81 &:focus-visible { 81 &:focus-visible {
82 color: props.get(vars.$static-themes, $theme, --key-focus, --text-color); 82 color: props.get(vars.$static-themes, $theme, --key-focus, --text-color);
83 outline-color: props.get(vars.$static-themes, $theme, --key-focus, --border-color); 83 outline-color: props.get(vars.$static-themes, $theme, --key-focus, --border-color);
84 box-shadow: 84 box-shadow:
85 0 85 0
86 0 86 0
87 0 87 0
88 calc(props.get(vars.$key-focus--border-width) + props.get(vars.$key-focus--outline-width)) 88 calc(props.get(vars.$key-focus--border-width) + props.get(vars.$key-focus--outline-width))
89 props.get(vars.$static-themes, $theme, --key-focus, --outline-color); 89 props.get(vars.$static-themes, $theme, --key-focus, --outline-color);
90 } 90 }
91 } 91 }
92 } 92 }
93 } 93 }
94 94
95 @include bem.elem('image') { 95 @include bem.elem('image') {
96 img { 96 img {
97 margin-inline: calc(-1 * props.get(vars.$key-focus--border-offset)); 97 margin-inline: calc(-1 * props.get(vars.$key-focus--border-offset));
98 border: props.get(vars.$key-focus--border-offset) solid transparent; 98 border: props.get(vars.$key-focus--border-offset) solid transparent;
99 border-radius: calc(props.get(vars.$rounding) + props.get(vars.$key-focus--border-offset)); 99 border-radius: calc(props.get(vars.$rounding) + props.get(vars.$key-focus--border-offset));
100 } 100 }
101 101
102 &:link, 102 &:link,
103 &:visited { 103 &:visited {
104 &:focus-visible { 104 &:focus-visible {
105 outline: none; 105 outline: none;
106 box-shadow: none; 106 box-shadow: none;
107 107
108 img { 108 img {
109 outline: props.get(vars.$key-focus--border-color) solid 109 outline: props.get(vars.$key-focus--border-color) solid
110 props.get(vars.$key-focus--border-width); 110 props.get(vars.$key-focus--border-width);
111 box-shadow: 0 0 0 111 box-shadow: 0 0 0
112 calc(props.get(vars.$key-focus--border-width) + props.get(vars.$key-focus--outline-width)) 112 calc(props.get(vars.$key-focus--border-width) + props.get(vars.$key-focus--outline-width))
113 props.get(vars.$key-focus--outline-color); 113 props.get(vars.$key-focus--outline-color);
114 } 114 }
115 } 115 }
116 } 116 }
117 } 117 }
118 } 118 }
119} 119}
diff --git a/src/scopes/_links.vars.scss b/src/scopes/_links.vars.scss
index 91a73ab..c69cc32 100644
--- a/src/scopes/_links.vars.scss
+++ b/src/scopes/_links.vars.scss
@@ -4,6 +4,7 @@
4@use '../core.vars' as core; 4@use '../core.vars' as core;
5 5
6$rounding: props.def(--s-links--rounding, props.get(core.$rounding)) !default; 6$rounding: props.def(--s-links--rounding, props.get(core.$rounding)) !default;
7$rounding-sm: props.def(--s-links--rounding-sm, props.get(core.$rounding--sm)) !default;
7$underline-width: props.def(--s-links--underline-width, props.get(core.$border-width--thin)) !default; 8$underline-width: props.def(--s-links--underline-width, props.get(core.$border-width--thin)) !default;
8$hover--underline-width: props.def(--s-links--hover--underline-width, props.get(core.$border-width--medium)) !default; 9$hover--underline-width: props.def(--s-links--hover--underline-width, props.get(core.$border-width--medium)) !default;
9 10
@@ -27,22 +28,22 @@ $key-focus--outline-color: props.def(--s-links--key-focus--outline-color, props.
27 28
28$static-themes: props.def(--s-links, (), 'color'); 29$static-themes: props.def(--s-links, (), 'color');
29@each $theme in map.keys(props.get(core.$transparent-colors)) { 30@each $theme in map.keys(props.get(core.$transparent-colors)) {
30 $link-theme: --static-#{string.slice($theme, 3)}; 31 $link-theme: --static-#{string.slice($theme, 3)};
31 32
32 $static-themes: props.merge($static-themes, ( 33 $static-themes: props.merge($static-themes, (
33 $link-theme: ( 34 $link-theme: (
34 --text-color: props.get(core.$transparent-colors, $theme, --800), 35 --text-color: currentColor,
35 --underline-color: props.get(core.$transparent-colors, $theme, --500), 36 --underline-color: props.get(core.$transparent-colors, $theme, --500),
36 37
37 --hover: ( 38 --hover: (
38 --text-color: props.get(core.$transparent-colors, $theme, --900), 39 --text-color: props.get(core.$transparent-colors, $theme, --900),
39 ), 40 ),
40 41
41 --key-focus: ( 42 --key-focus: (
42 --text-color: props.get(core.$transparent-colors, $theme, --900), 43 --text-color: props.get(core.$transparent-colors, $theme, --900),
43 --border-color: props.get(core.$transparent-colors, $theme, --900), 44 --border-color: props.get(core.$transparent-colors, $theme, --900),
44 --outline-color: props.get(core.$transparent-colors, $theme, --300), 45 --outline-color: props.get(core.$transparent-colors, $theme, --300),
45 ), 46 ),
46 ) 47 )
47 )); 48 ));
48} 49}
diff --git a/src/scopes/_lists.scss b/src/scopes/_lists.scss
index 98b1df1..fc8a577 100644
--- a/src/scopes/_lists.scss
+++ b/src/scopes/_lists.scss
@@ -8,53 +8,53 @@
8@use 'lists.vars' as vars; 8@use 'lists.vars' as vars;
9 9
10@mixin styles { 10@mixin styles {
11 @include materialize-at-root(meta.module-variables('vars')); 11 @include materialize-at-root(meta.module-variables('vars'));
12 12
13 @include bem.scope('lists') { 13 @include bem.scope('lists') {
14 ul, 14 ul,
15 ol { 15 ol {
16 padding-inline-start: props.get(vars.$indent); 16 padding-inline-start: props.get(vars.$indent);
17 margin-block-start: props.get(vars.$margin-bs); 17 margin-block-start: props.get(vars.$margin-bs);
18 18
19 ul, 19 ul,
20 ol { 20 ol {
21 margin-block-start: 0; 21 margin-block-start: 0;
22 } 22 }
23 } 23 }
24 24
25 ul { 25 ul {
26 list-style: disc; 26 list-style: disc;
27 } 27 }
28 28
29 ol { 29 ol {
30 list-style: decimal; 30 list-style: decimal;
31 } 31 }
32 32
33 dl { 33 dl {
34 padding: 0; 34 padding: 0;
35 margin-block: props.get(vars.$margin-bs) 0; 35 margin-block: props.get(vars.$margin-bs) 0;
36 margin-inline: 0; 36 margin-inline: 0;
37 } 37 }
38 38
39 dt { 39 dt {
40 font-weight: bold; 40 font-weight: bold;
41 color: props.get(core.$theme, --heading); 41 color: props.get(core.$theme, --heading);
42 } 42 }
43 43
44 dd { 44 dd {
45 margin-block: 0; 45 margin-block: 0;
46 margin-inline: props.get(vars.$indent) 0; 46 margin-inline: props.get(vars.$indent) 0;
47 } 47 }
48 48
49 @include bem.modifier('compact') { 49 @include bem.modifier('compact') {
50 ul, 50 ul,
51 ol { 51 ol {
52 padding-inline-start: calc(props.get(vars.$compact--indent) - 3px); 52 padding-inline-start: calc(props.get(vars.$compact--indent) - 3px);
53 } 53 }
54 54
55 dd { 55 dd {
56 margin-inline-start: calc(props.get(vars.$compact--indent) - 3px); 56 margin-inline-start: calc(props.get(vars.$compact--indent) - 3px);
57 } 57 }
58 } 58 }
59 } 59 }
60} 60}
diff --git a/src/scopes/_tables.scss b/src/scopes/_tables.scss
index 0a87eaa..5b64301 100644
--- a/src/scopes/_tables.scss
+++ b/src/scopes/_tables.scss
@@ -8,95 +8,95 @@
8@use 'tables.vars' as vars; 8@use 'tables.vars' as vars;
9 9
10@mixin styles { 10@mixin styles {
11 @include materialize-at-root(meta.module-variables('vars')); 11 @include materialize-at-root(meta.module-variables('vars'));
12 12
13 @include bem.scope('tables') { 13 @include bem.scope('tables') {
14 table { 14 table {
15 margin-block-start: props.get(vars.$margin-bs); 15 margin-block-start: props.get(vars.$margin-bs);
16 border-spacing: 0; 16 border-spacing: 0;
17 border-collapse: separate; 17 border-collapse: separate;
18 } 18 }
19 19
20 th { 20 th {
21 padding-block: props.get(table.$pad-b); 21 padding-block: props.get(table.$pad-b);
22 padding-inline: props.get(table.$pad-i); 22 padding-inline: props.get(table.$pad-i);
23 font-family: props.get(table.$heading--font-family); 23 font-family: props.get(table.$heading--font-family);
24 font-size: props.get(table.$heading--font-size); 24 font-size: props.get(table.$heading--font-size);
25 font-weight: props.get(table.$heading--font-weight); 25 font-weight: props.get(table.$heading--font-weight);
26 color: props.get(table.$heading-color); 26 color: props.get(table.$heading-color);
27 text-align: start; 27 text-align: start;
28 text-transform: props.get(table.$heading--text-transform); 28 text-transform: props.get(table.$heading--text-transform);
29 letter-spacing: props.get(table.$heading--letter-spacing); 29 letter-spacing: props.get(table.$heading--letter-spacing);
30 } 30 }
31 31
32 td { 32 td {
33 padding-block: props.get(table.$pad-b); 33 padding-block: props.get(table.$pad-b);
34 padding-inline: props.get(table.$pad-i); 34 padding-inline: props.get(table.$pad-i);
35 border-color: props.get(table.$border-color); 35 border-color: props.get(table.$border-color);
36 border-style: solid; 36 border-style: solid;
37 border-width: 0; 37 border-width: 0;
38 border-block-start-width: props.get(table.$border-width); 38 border-block-start-width: props.get(table.$border-width);
39 } 39 }
40 40
41 tr { 41 tr {
42 &:last-child { 42 &:last-child {
43 td { 43 td {
44 border-block-end-width: props.get(table.$border-width); 44 border-block-end-width: props.get(table.$border-width);
45 } 45 }
46 } 46 }
47 } 47 }
48 48
49 @include bem.modifier('flush') { 49 @include bem.modifier('flush') {
50 th, 50 th,
51 td { 51 td {
52 &:first-child { 52 &:first-child {
53 padding-inline-start: 0; 53 padding-inline-start: 0;
54 } 54 }
55 55
56 &:last-child { 56 &:last-child {
57 padding-inline-end: 0; 57 padding-inline-end: 0;
58 } 58 }
59 } 59 }
60 } 60 }
61 61
62 @include bem.modifier('box') { 62 @include bem.modifier('box') {
63 td { 63 td {
64 background-color: props.get(table.$box--bg-color); 64 background-color: props.get(table.$box--bg-color);
65 65
66 &:first-child { 66 &:first-child {
67 border-inline-start-width: props.get(table.$border-width); 67 border-inline-start-width: props.get(table.$border-width);
68 } 68 }
69 69
70 &:last-child { 70 &:last-child {
71 border-inline-end-width: props.get(table.$border-width); 71 border-inline-end-width: props.get(table.$border-width);
72 } 72 }
73 } 73 }
74 74
75 tr { 75 tr {
76 &:first-child { 76 &:first-child {
77 td { 77 td {
78 &:first-child { 78 &:first-child {
79 border-start-start-radius: props.get(table.$rounding); 79 border-start-start-radius: props.get(table.$rounding);
80 } 80 }
81 81
82 &:last-child { 82 &:last-child {
83 border-start-end-radius: props.get(table.$rounding); 83 border-start-end-radius: props.get(table.$rounding);
84 } 84 }
85 } 85 }
86 } 86 }
87 87
88 &:last-child { 88 &:last-child {
89 td { 89 td {
90 &:first-child { 90 &:first-child {
91 border-end-start-radius: props.get(table.$rounding); 91 border-end-start-radius: props.get(table.$rounding);
92 } 92 }
93 93
94 &:last-child { 94 &:last-child {
95 border-end-end-radius: props.get(table.$rounding); 95 border-end-end-radius: props.get(table.$rounding);
96 } 96 }
97 } 97 }
98 } 98 }
99 } 99 }
100 } 100 }
101 } 101 }
102} 102}
diff --git a/src_demo/index.scss b/src_demo/index.scss
index a04624a..5614bc4 100644
--- a/src_demo/index.scss
+++ b/src_demo/index.scss
@@ -1,11 +1,13 @@
1@use '../src/iro-design' as iro; 1@use '../src/iro-design' as iro;
2 2
3@include iro.layers--styles;
3@include iro.core--styles; 4@include iro.core--styles;
4 5
5@include iro.s-implicit--styles; 6@include iro.s-implicit--styles;
6@include iro.s-body--styles; 7@include iro.s-body--styles;
7@include iro.s-blockquotes--styles; 8@include iro.s-blockquotes--styles;
8@include iro.s-code--styles; 9@include iro.s-code--styles;
10@include iro.s-figures--styles;
9@include iro.s-headings--styles; 11@include iro.s-headings--styles;
10@include iro.s-links--styles; 12@include iro.s-links--styles;
11@include iro.s-lists--styles; 13@include iro.s-lists--styles;
@@ -21,29 +23,29 @@
21@include iro.l-split-view--styles; 23@include iro.l-split-view--styles;
22 24
23@include iro.o-icon--styles; 25@include iro.o-icon--styles;
24@include iro.o-action-button--styles;
25@include iro.o-alert--styles; 26@include iro.o-alert--styles;
26@include iro.o-avatar--styles; 27@include iro.o-avatar--styles;
27@include iro.o-backdrop--styles; 28@include iro.o-backdrop--styles;
28@include iro.o-badge--styles;
29@include iro.o-button--styles; 29@include iro.o-button--styles;
30@include iro.o-card--styles; 30@include iro.o-card--styles;
31@include iro.o-checkbox--styles; 31@include iro.o-checkbox--styles;
32@include iro.o-divider--styles; 32@include iro.o-divider--styles;
33@include iro.o-emoji--styles; 33@include iro.o-emoji--styles;
34@include iro.o-figure--styles;
34@include iro.o-field-label--styles; 35@include iro.o-field-label--styles;
35@include iro.o-heading--styles; 36@include iro.o-heading--styles;
36@include iro.o-lightbox--styles; 37@include iro.o-lightbox--styles;
37@include iro.o-menu--styles; 38@include iro.o-menu--styles;
38@include iro.o-navbar--styles; 39@include iro.o-navbar--styles;
39@include iro.o-palette--styles; 40@include iro.o-palette--styles;
41@include iro.o-placeholders--styles;
40@include iro.o-popover--styles; 42@include iro.o-popover--styles;
41@include iro.o-radio--styles; 43@include iro.o-radio--styles;
42@include iro.o-side-nav--styles; 44@include iro.o-side-nav--styles;
43@include iro.o-status-indicator--styles; 45@include iro.o-status-indicator--styles;
44@include iro.o-switch--styles; 46@include iro.o-switch--styles;
45@include iro.o-table--styles; 47@include iro.o-table--styles;
46@include iro.o-tabs--styles; 48@include iro.o-tabbar--styles;
47@include iro.o-text-field--styles; 49@include iro.o-text-field--styles;
48@include iro.o-thumbnail--styles; 50@include iro.o-thumbnail--styles;
49 51
diff --git a/tpl/index.pug b/tpl/index.pug
index 7d73c75..0f1b5b0 100644
--- a/tpl/index.pug
+++ b/tpl/index.pug
@@ -9,7 +9,6 @@ include layouts/container.pug
9include objects/palette.pug 9include objects/palette.pug
10include objects/heading.pug 10include objects/heading.pug
11include objects/divider.pug 11include objects/divider.pug
12include objects/badge.pug
13include objects/button.pug 12include objects/button.pug
14include objects/text-field.pug 13include objects/text-field.pug
15include objects/field-label.pug 14include objects/field-label.pug
@@ -17,7 +16,6 @@ include objects/radio.pug
17include objects/checkbox.pug 16include objects/checkbox.pug
18include objects/switch.pug 17include objects/switch.pug
19include objects/form.pug 18include objects/form.pug
20include objects/action-button.pug
21include objects/overflow-button.pug 19include objects/overflow-button.pug
22include objects/status-indicator.pug 20include objects/status-indicator.pug
23include objects/avatar.pug 21include objects/avatar.pug
@@ -62,7 +60,6 @@ include views/links.pug
62include views/code.pug 60include views/code.pug
63include views/blockquote.pug 61include views/blockquote.pug
64include views/list.pug 62include views/list.pug
65include views/badge.pug
66include views/button.pug 63include views/button.pug
67include views/text-field.pug 64include views/text-field.pug
68include views/field-label.pug 65include views/field-label.pug
@@ -70,7 +67,6 @@ include views/radio.pug
70include views/checkbox.pug 67include views/checkbox.pug
71include views/switch.pug 68include views/switch.pug
72include views/form.pug 69include views/form.pug
73include views/action-button.pug
74include views/overflow-button.pug 70include views/overflow-button.pug
75include views/status-indicator.pug 71include views/status-indicator.pug
76include views/avatar.pug 72include views/avatar.pug
@@ -110,7 +106,6 @@ html
110 +view-blockquote 106 +view-blockquote
111 +view-list 107 +view-list
112 +view-emoji 108 +view-emoji
113 +view-badge
114 +view-button 109 +view-button
115 +view-text-field 110 +view-text-field
116 +view-field-label 111 +view-field-label
@@ -118,7 +113,6 @@ html
118 +view-checkbox 113 +view-checkbox
119 +view-switch 114 +view-switch
120 +view-form 115 +view-form
121 +view-action-button
122 //+view-overflow-button 116 //+view-overflow-button
123 +view-status-indicator 117 +view-status-indicator
124 +view-avatar 118 +view-avatar
diff --git a/tpl/objects/action-button.pug b/tpl/objects/action-button.pug
deleted file mode 100644
index e9b6fe3..0000000
--- a/tpl/objects/action-button.pug
+++ /dev/null
@@ -1,34 +0,0 @@
1include icon.pug
2
3mixin action-button
4 -
5 let classes = {
6 'o-action-button': true,
7 'u-d-block': attributes.block,
8 'o-action-button--quiet': attributes.quiet,
9 'o-action-button--pill': attributes.pill,
10 'o-action-button--icon': !!attributes.icon && !block,
11 'is-selected': attributes.selected
12 }
13 if (attributes.theme) {
14 classes['o-action-button--' + attributes.theme] = true
15 }
16 if (attributes.size) {
17 classes['o-action-button--' + attributes.size] = true
18 }
19 if (attributes.class) {
20 classes[attributes.class] = true;
21 }
22
23 let href = attributes.disabled ? null : '#';
24
25 a(class=classes href=href)
26 if attributes.icon
27 +icon(attributes.icon)
28 = ' '
29 if block
30 span.o-action-button__label
31 block
32 if attributes.postIcon
33 = ' '
34 +icon(attributes.postIcon)
diff --git a/tpl/objects/badge.pug b/tpl/objects/badge.pug
deleted file mode 100644
index 48e4029..0000000
--- a/tpl/objects/badge.pug
+++ /dev/null
@@ -1,37 +0,0 @@
1mixin badge(variant)
2 -
3 let classes = {
4 'o-badge': true,
5 'o-badge--pill': !!attributes.pill,
6 'o-badge--quiet': !!attributes.quiet,
7 'o-menu__badge': !!attributes.menu,
8 }
9 if (attributes.size) {
10 classes['o-badge--' + attributes.size] = true
11 }
12 if (variant) {
13 classes['o-badge--' + variant] = true
14 }
15
16 if attributes.href
17 a(href=attributes.href class=classes)
18 if attributes.icon
19 +icon(attributes.icon)
20 = ' '
21 if block
22 span.o-badge__label
23 block
24 if attributes.postIcon
25 = ' '
26 +icon(attributes.postIcon)
27 else
28 span(class=classes)
29 if attributes.icon
30 +icon(attributes.icon)
31 = ' '
32 if block
33 span.o-badge__label
34 block
35 if attributes.postIcon
36 = ' '
37 +icon(attributes.postIcon)
diff --git a/tpl/objects/button.pug b/tpl/objects/button.pug
index 0884c8d..3b5de2b 100644
--- a/tpl/objects/button.pug
+++ b/tpl/objects/button.pug
@@ -1,22 +1,31 @@
1mixin a-button 1include icon.pug
2
3mixin button
2 - 4 -
3 let classes = { 5 let classes = {
4 'o-button': true, 6 'o-button': true,
5 'o-button--block': attributes.block, 7 'u-d-block': attributes.block,
6 'o-button--primary': attributes.primary, 8 'o-button--secondary': attributes.secondary,
7 'o-button--outline': attributes.outline, 9 'o-button--quiet': attributes.quiet,
8 'o-button--round': !!attributes.icon && !block 10 'o-button--pill': attributes.pill,
11 'o-button--badge': attributes.badge,
12 'o-button--icon': !!attributes.icon && !block,
13 'is-selected': attributes.selected,
14 'is-highlighted': attributes.highlighted,
9 } 15 }
10 if (attributes.variant) { 16 if (attributes.theme) {
11 classes['o-button--' + attributes.variant] = true 17 classes['o-button--' + attributes.theme] = true
12 } 18 }
13 if (attributes.size) { 19 if (attributes.size) {
14 classes['o-button--' + attributes.size] = true 20 classes['o-button--' + attributes.size] = true
15 } 21 }
22 if (attributes.class) {
23 classes[attributes.class] = true;
24 }
16 25
17 let href = attributes.disabled ? null : '#'; 26 let href = attributes.disabled ? null : '#';
18 27
19 a(class=classes href=href aria-disabled=attributes.disabled && String(attributes.disabled)) 28 a(class=classes href=href)
20 if attributes.icon 29 if attributes.icon
21 +icon(attributes.icon) 30 +icon(attributes.icon)
22 = ' ' 31 = ' '
diff --git a/tpl/objects/card.pug b/tpl/objects/card.pug
index 2ab9bef..feb1441 100644
--- a/tpl/objects/card.pug
+++ b/tpl/objects/card.pug
@@ -1,8 +1,11 @@
1mixin card 1mixin card
2 - 2 -
3 let classes = { 3 let classes = {
4 'o-card': true, 4 'o-card': true,
5 'o-card--quiet': !!attributes.quiet, 5 'o-card--borderless': !!attributes.borderless,
6 'o-card--shadow': !!attributes.shadow,
7 'o-card--quiet': !!attributes.quiet,
8 'o-card--thumbnail': !!attributes.thumbnail,
6 } 9 }
7 10
8 if (attributes.class) { 11 if (attributes.class) {
@@ -26,7 +29,16 @@ mixin card-image
26 classes[attributes.class] = true; 29 classes[attributes.class] = true;
27 } 30 }
28 31
29 img(class=classes src=attributes.src style=attributes.style) 32 let imgClasses = {
33 'o-card__image-img': true,
34 'l-card-list__card-image': attributes.list
35 }
36
37 div(class=classes)
38 img(class=imgClasses src=attributes.src style=attributes.style)
39 if block
40 .o-card__image-overlay
41 block
30 42
31mixin card-body 43mixin card-body
32 .o-card__body(style=attributes.style) 44 .o-card__body(style=attributes.style)
diff --git a/tpl/objects/dialog.pug b/tpl/objects/dialog.pug
index 3ceae69..1a2f061 100644
--- a/tpl/objects/dialog.pug
+++ b/tpl/objects/dialog.pug
@@ -54,13 +54,13 @@ mixin dialog(title)
54 else 54 else
55 if title 55 if title
56 +div-heading('xl')(class='o-dialog__title l-media__block l-media__block--main')= title 56 +div-heading('xl')(class='o-dialog__title l-media__block l-media__block--main')= title
57 +action-button(round=true quiet=true icon='x' class='o-dialog__close-btn l-media__block') 57 +button(round=true quiet=true icon='x' class='o-dialog__close-btn l-media__block')
58 58
59 section(class=bodyClass) 59 section(class=bodyClass)
60 if slots.body 60 if slots.body
61 - slots.body() 61 - slots.body()
62 62
63 footer.o-dialog__footer.l-button-group 63 footer.o-dialog__footer.l-button-group
64 +a-button(outline=true)= 'Cancel' 64 +button(outline=true)= 'Cancel'
65 = ' ' 65 = ' '
66 +a-button(variant='accent')= 'Continue' 66 +button(variant='accent')= 'Continue'
diff --git a/tpl/objects/divider.pug b/tpl/objects/divider.pug
index 46425cd..ed4d27a 100644
--- a/tpl/objects/divider.pug
+++ b/tpl/objects/divider.pug
@@ -3,6 +3,8 @@ mixin divider(level)
3 let classes = { 3 let classes = {
4 'o-divider': true, 4 'o-divider': true,
5 'o-divider--labelled': !!block, 5 'o-divider--labelled': !!block,
6 'o-divider--vertical': !!attributes.vertical,
7 'o-divider--dot': !!attributes.dot,
6 ['o-divider--' + level]: true, 8 ['o-divider--' + level]: true,
7 ['o-divider--' + attributes.color]: !!attributes.color 9 ['o-divider--' + attributes.color]: !!attributes.color
8 } 10 }
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/icon-nav.pug b/tpl/objects/icon-nav.pug
index f1c7d8a..afdf2db 100644
--- a/tpl/objects/icon-nav.pug
+++ b/tpl/objects/icon-nav.pug
@@ -1,6 +1,6 @@
1include icon.pug 1include icon.pug
2include status-indicator.pug 2include status-indicator.pug
3include action-button.pug 3include button.pug
4 4
5mixin icon-nav 5mixin icon-nav
6 - 6 -
@@ -19,9 +19,9 @@ mixin icon-nav-item(icon)
19 - 19 -
20 let classes = { 20 let classes = {
21 'o-icon-nav__item': true, 21 'o-icon-nav__item': true,
22 'o-action-button': true, 22 'o-button': true,
23 'o-action-button--round': true, 23 'o-button--round': true,
24 'o-action-button--quiet': true, 24 'o-button--quiet': true,
25 'is-selected': attributes.selected, 25 'is-selected': attributes.selected,
26 } 26 }
27 if (attributes.class) { 27 if (attributes.class) {
diff --git a/tpl/objects/lightbox.pug b/tpl/objects/lightbox.pug
index 842d44a..2d520b5 100644
--- a/tpl/objects/lightbox.pug
+++ b/tpl/objects/lightbox.pug
@@ -23,14 +23,14 @@ mixin lightbox(images)
23 header.o-lightbox__header 23 header.o-lightbox__header
24 div(class=linksClasses) 24 div(class=linksClasses)
25 block 25 block
26 +action-button(theme=attributes.theme pill=true quiet=true icon='x' class='o-lightbox__close-btn') 26 +button(theme=attributes.theme pill=true quiet=true icon='x' class='o-lightbox__close-btn')
27 27
28 each img, i in images 28 each img, i in images
29 img(src=images[i] id=('image-' + i) class=`o-lightbox__img ${attributes.interactive && !i ? 'is-visible' : ''}`) 29 img(src=images[i] id=('image-' + i) class=`o-lightbox__img ${attributes.interactive && !i ? 'is-visible' : ''}`)
30 30
31 if images.length > 1 31 if images.length > 1
32 +action-button(theme=attributes.theme pill=true quiet=true icon='chevron-left' class='o-lightbox__nav-btn o-lightbox__nav-btn--prev') 32 +button(theme=attributes.theme pill=true quiet=true icon='chevron-left' class='o-lightbox__nav-btn o-lightbox__nav-btn--prev')
33 +action-button(theme=attributes.theme pill=true quiet=true icon='chevron-right' class='o-lightbox__nav-btn o-lightbox__nav-btn--next') 33 +button(theme=attributes.theme pill=true quiet=true icon='chevron-right' class='o-lightbox__nav-btn o-lightbox__nav-btn--next')
34 34
35 .o-lightbox__thumbnails 35 .o-lightbox__thumbnails
36 each img, i in images 36 each img, i in images
diff --git a/tpl/objects/menu.pug b/tpl/objects/menu.pug
index 578f9bc..802f9bd 100644
--- a/tpl/objects/menu.pug
+++ b/tpl/objects/menu.pug
@@ -1,6 +1,6 @@
1include icon.pug 1include icon.pug
2include status-indicator.pug 2include status-indicator.pug
3include action-button.pug 3include button.pug
4 4
5mixin menu 5mixin menu
6 - 6 -
diff --git a/tpl/objects/navbar.pug b/tpl/objects/navbar.pug
index 5c7642c..14ec9d3 100644
--- a/tpl/objects/navbar.pug
+++ b/tpl/objects/navbar.pug
@@ -1,6 +1,6 @@
1include icon.pug 1include icon.pug
2include status-indicator.pug 2include status-indicator.pug
3include action-button.pug 3include button.pug
4 4
5mixin navbar 5mixin navbar
6 - 6 -
diff --git a/tpl/objects/side-nav.pug b/tpl/objects/side-nav.pug
index ccd24e4..2dcbd84 100644
--- a/tpl/objects/side-nav.pug
+++ b/tpl/objects/side-nav.pug
@@ -1,6 +1,6 @@
1include icon.pug 1include icon.pug
2include status-indicator.pug 2include status-indicator.pug
3include action-button.pug 3include button.pug
4 4
5mixin side-nav 5mixin side-nav
6 - 6 -
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/action-button.pug b/tpl/views/action-button.pug
deleted file mode 100644
index 8fbf9ea..0000000
--- a/tpl/views/action-button.pug
+++ /dev/null
@@ -1,109 +0,0 @@
1mixin view-action-button
2 +view('action-button', 'Action button')
3 .c-box
4 +action-button(size='sm')= 'Idle'
5 = ' '
6 +action-button= 'Idle'
7 = ' '
8 +action-button(size='lg')= 'Idle'
9 = ' '
10 +action-button(size='xl')= 'Idle'
11
12 .c-box
13 +action-button(icon='trash' size='sm')
14 = ' '
15 +action-button(icon='trash')
16 = ' '
17 +action-button(icon='trash' size='lg')
18 = ' '
19 +action-button(icon='trash' size='xl')
20
21 .c-box
22 +action-button(pill=true size='sm')= 'Idle'
23 = ' '
24 +action-button(pill=true)= 'Idle'
25 = ' '
26 +action-button(pill=true size='lg')= 'Idle'
27 = ' '
28 +action-button(pill=true size='xl')= 'Idle'
29
30 .c-box
31 +action-button(pill=true icon='trash' size='sm')
32 = ' '
33 +action-button(pill=true icon='trash')
34 = ' '
35 +action-button(pill=true icon='trash' size='lg')
36 = ' '
37 +action-button(pill=true icon='trash' size='xl')
38
39 .c-box
40 +action-button= 'Label'
41 = ' '
42 +action-button(icon='trash')= 'Label'
43 = ' '
44 +action-button(icon='trash')
45
46 .c-box
47 +action-button(quiet=true)= 'Label'
48 = ' '
49 +action-button(quiet=true icon='trash')= 'Label'
50 = ' '
51 +action-button(quiet=true icon='trash')
52
53 .c-box
54 +action-button= 'Idle'
55 = ' '
56 +action-button(selected=true)= 'Selected'
57 = ' '
58 +action-button(disabled=true)= 'Disabled'
59 = ' '
60 +action-button(selected=true disabled=true)= 'Selected + disabled'
61
62 .c-box
63 +action-button(quiet=true )= 'Idle'
64 = ' '
65 +action-button(quiet=true selected=true)= 'Selected'
66 = ' '
67 +action-button(quiet=true disabled=true)= 'Disabled'
68 = ' '
69 +action-button(quiet=true selected=true disabled=true)= 'Selected + disabled'
70
71 .c-box
72 +action-button(pill=true)= 'Idle'
73 = ' '
74 +action-button(pill=true selected=true)= 'Selected'
75 = ' '
76 +action-button(pill=true disabled=true)= 'Disabled'
77 = ' '
78 +action-button(pill=true selected=true disabled=true)= 'Selected + disabled'
79
80 .c-box
81 +action-button(pill=true quiet=true)= 'Idle'
82 = ' '
83 +action-button(pill=true quiet=true selected=true)= 'Selected'
84 = ' '
85 +action-button(pill=true quiet=true disabled=true)= 'Disabled'
86 = ' '
87 +action-button(pill=true quiet=true selected=true disabled=true)= 'Selected + disabled'
88
89 each theme in ['static-black', 'static-white']
90 -
91 const bg = theme.startsWith('static-black') ? 500 : 1000;
92
93 .c-box(style=`background-color: var(--colors--blue-static--${bg});`)
94 +action-button(theme=theme)= 'Idle'
95 = ' '
96 +action-button(theme=theme selected=true)= 'Selected'
97 = ' '
98 +action-button(theme=theme disabled=true)= 'Disabled'
99 = ' '
100 +action-button(theme=theme selected=true disabled=true)= 'Selected + disabled'
101
102 .c-box(style=`background-color: var(--colors--blue-static--${bg});`)
103 +action-button(theme=theme quiet=true)= 'Idle'
104 = ' '
105 +action-button(theme=theme quiet=true selected=true)= 'Selected'
106 = ' '
107 +action-button(theme=theme quiet=true disabled=true)= 'Disabled'
108 = ' '
109 +action-button(theme=theme quiet=true selected=true disabled=true)= 'Selected + disabled'
diff --git a/tpl/views/badge.pug b/tpl/views/badge.pug
deleted file mode 100644
index cc1f346..0000000
--- a/tpl/views/badge.pug
+++ /dev/null
@@ -1,69 +0,0 @@
1mixin view-badge
2 +view('badge', 'Badge')
3 .c-box
4 +badge(size='sm' href='#')= '50'
5 = ' '
6 +badge(href='#')= '100'
7 = ' '
8 +badge(size='lg' href='#')= '200'
9 = ' '
10 +badge(size='xl' href='#')= '300'
11
12 .c-box
13 +badge(pill=true size='sm' href='#')= '50'
14 = ' '
15 +badge(pill=true href='#')= '100'
16 = ' '
17 +badge(pill=true size='lg' href='#')= '200'
18 = ' '
19 +badge(pill=true size='xl' href='#')= '300'
20
21 .c-box
22 +badge(icon='image' size='sm' href='#')= '50'
23 = ' '
24 +badge(icon='image' href='#')= '100'
25 = ' '
26 +badge(icon='image' size='lg' href='#')= '200'
27 = ' '
28 +badge(icon='image' size='xl' href='#')= '300'
29
30 .c-box
31 +badge(pill=true icon='image' size='sm' href='#')= '50'
32 = ' '
33 +badge(pill=true icon='image' href='#')= '100'
34 = ' '
35 +badge(pill=true icon='image' size='lg' href='#')= '200'
36 = ' '
37 +badge(pill=true icon='image' size='xl' href='#')= '300'
38
39 .c-box
40 +badge(href='#')= '100'
41 = ' '
42 +badge(quiet=true href='#')= '100'
43 = ' '
44 +badge(pill=true href='#')= '100'
45 = ' '
46 +badge(quiet=true pill=true href='#')= '100'
47
48 each theme in ['accent', 'positive', 'negative', 'warning']
49 .c-box
50 +badge(theme)(href='#')= 'new'
51 = ' '
52 +badge(theme)(quiet=true href='#')= 'new'
53 = ' '
54 +badge(theme)(pill=true href='#')= 'new'
55 = ' '
56 +badge(theme)(quiet=true pill=true href='#')= 'new'
57
58 each theme in ['static-black', 'static-white']
59 -
60 const bg = theme.startsWith('static-black') ? 500 : 1000;
61
62 .c-box(style=`background-color: var(--colors--blue-static--${bg});`)
63 +badge(theme)(href='#')= 'new'
64 = ' '
65 +badge(theme)(quiet=true href='#')= 'new'
66 = ' '
67 +badge(theme)(pill=true href='#')= 'new'
68 = ' '
69 +badge(theme)(quiet=true pill=true href='#')= 'new'
diff --git a/tpl/views/button.pug b/tpl/views/button.pug
index edd8ef6..4b8c59f 100644
--- a/tpl/views/button.pug
+++ b/tpl/views/button.pug
@@ -1,85 +1,206 @@
1mixin view-button 1mixin view-button
2 +view('button', 'Button') 2 +view('button', 'Button')
3 .c-box 3 .c-box
4 +a-button(size='sm')= 'Button' 4 +button(size='sm')= 'Idle'
5 = ' ' 5 = ' '
6 +a-button= 'Button' 6 +button= 'Idle'
7 = ' ' 7 = ' '
8 +a-button(size='lg')= 'Button' 8 +button(size='lg')= 'Idle'
9 = ' ' 9 = ' '
10 +a-button(size='xl')= 'Button' 10 +button(size='xl')= 'Idle'
11 br
12 br
13 +button(icon='trash' size='sm')
14 = ' '
15 +button(icon='trash')
16 = ' '
17 +button(icon='trash' size='lg')
18 = ' '
19 +button(icon='trash' size='xl')
20 br
21 br
22 +button(icon='user' size='sm')= 'Idle'
23 = ' '
24 +button(icon='user')= 'Idle'
25 = ' '
26 +button(icon='user' size='lg')= 'Idle'
27 = ' '
28 +button(icon='user' size='xl')= 'Idle'
11 29
12 .c-box 30 .c-box
13 +a-button(size='sm' outline=true)= 'Button' 31 +button(pill=true size='sm')= 'Idle'
32 = ' '
33 +button(pill=true)= 'Idle'
34 = ' '
35 +button(pill=true size='lg')= 'Idle'
36 = ' '
37 +button(pill=true size='xl')= 'Idle'
38 br
39 br
40 +button(pill=true icon='trash' size='sm')
41 = ' '
42 +button(pill=true icon='trash')
14 = ' ' 43 = ' '
15 +a-button(outline=true)= 'Button' 44 +button(pill=true icon='trash' size='lg')
16 = ' ' 45 = ' '
17 +a-button(size='lg' outline=true)= 'Button' 46 +button(pill=true icon='trash' size='xl')
47 br
48 br
49 +button(pill=true icon='user' size='sm')= 'Idle'
50 = ' '
51 +button(pill=true icon='user')= 'Idle'
52 = ' '
53 +button(pill=true icon='user' size='lg')= 'Idle'
18 = ' ' 54 = ' '
19 +a-button(size='xl' outline=true)= 'Button' 55 +button(pill=true icon='user' size='xl')= 'Idle'
20 56
21 .c-box 57 .c-box
22 +a-button(postIcon='arrow-right' size='sm')= 'Button' 58 +button= 'Label'
23 = ' ' 59 = ' '
24 +a-button(postIcon='arrow-right')= 'Button' 60 +button(icon='trash')= 'Label'
25 = ' ' 61 = ' '
26 +a-button(postIcon='arrow-right' size='lg')= 'Button' 62 +button(icon='trash')
63 br
64 br
65 +button(quiet=true)= 'Label'
27 = ' ' 66 = ' '
28 +a-button(postIcon='arrow-right' size='xl')= 'Button' 67 +button(quiet=true icon='trash')= 'Label'
68 = ' '
69 +button(quiet=true icon='trash')
29 70
30 .c-box 71 .c-box
31 .l-button-group 72 +button= 'Idle'
32 +a-button= 'Button' 73 = ' '
33 +a-button(disabled=true)= 'Button' 74 +button(highlighted=true)= 'Highlighted'
34 +a-button(outline=true)= 'Button' 75 = ' '
35 +a-button(outline=true disabled=true)= 'Button' 76 +button(selected=true)= 'Selected'
77 = ' '
78 +button(disabled=true)= 'Disabled'
79 = ' '
80 +button(selected=true disabled=true)= 'Selected + disabled'
81 br
36 br 82 br
37 .l-button-group 83 +button(badge=true)= 'Idle'
38 +a-button(icon='trash') 84 = ' '
39 +a-button(disabled=true icon='trash') 85 +button(badge=true highlighted=true)= 'Highlighted'
40 +a-button(outline=true icon='trash') 86 = ' '
41 +a-button(outline=true disabled=true icon='trash') 87 +button(badge=true selected=true)= 'Selected'
88 = ' '
89 +button(badge=true disabled=true)= 'Disabled'
90 = ' '
91 +button(badge=true selected=true disabled=true)= 'Selected + disabled'
92 br
93 br
94 +button(quiet=true)= 'Idle'
95 = ' '
96 +button(quiet=true highlighted=true)= 'Highlighted'
97 = ' '
98 +button(quiet=true selected=true)= 'Selected'
99 = ' '
100 +button(quiet=true disabled=true)= 'Disabled'
101 = ' '
102 +button(quiet=true selected=true disabled=true)= 'Selected + disabled'
42 103
43 each theme in ['primary', 'accent', 'negative'] 104 .c-box
105 +button(pill=true)= 'Idle'
106 = ' '
107 +button(pill=true highlighted=true)= 'Highlighted'
108 = ' '
109 +button(pill=true selected=true)= 'Selected'
110 = ' '
111 +button(pill=true disabled=true)= 'Disabled'
112 = ' '
113 +button(pill=true selected=true disabled=true)= 'Selected + disabled'
114 br
115 br
116 +button(pill=true badge=true)= 'Idle'
117 = ' '
118 +button(pill=true badge=true highlighted=true)= 'Highlighted'
119 = ' '
120 +button(pill=true badge=true selected=true)= 'Selected'
121 = ' '
122 +button(pill=true badge=true disabled=true)= 'Disabled'
123 = ' '
124 +button(pill=true badge=true selected=true disabled=true)= 'Selected + disabled'
125 br
126 br
127 +button(pill=true quiet=true)= 'Idle'
128 = ' '
129 +button(pill=true quiet=true highlighted=true)= 'Highlighted'
130 = ' '
131 +button(pill=true quiet=true selected=true)= 'Selected'
132 = ' '
133 +button(pill=true quiet=true disabled=true)= 'Disabled'
134 = ' '
135 +button(pill=true quiet=true selected=true disabled=true)= 'Selected + disabled'
136
137 each theme, i in ['accent', 'positive', 'negative', 'warning']
44 .c-box 138 .c-box
45 .l-button-group 139 +button(theme=theme)= 'Idle'
46 +a-button(variant=theme)= 'Button' 140 = ' '
47 +a-button(variant=theme disabled=true)= 'Button' 141 +button(theme=theme highlighted=true)= 'Highlighted'
48 +a-button(variant=theme outline=true)= 'Button' 142 = ' '
49 +a-button(variant=theme outline=true disabled=true)= 'Button' 143 +button(theme=theme selected=true)= 'Selected'
144 = ' '
145 +button(theme=theme disabled=true)= 'Disabled'
146 = ' '
147 +button(theme=theme selected=true disabled=true)= 'Selected + disabled'
50 br 148 br
51 .l-button-group 149 br
52 +a-button(variant=theme icon='trash') 150 +button(theme=theme badge=true)= 'Idle'
53 +a-button(variant=theme disabled=true icon='trash') 151 = ' '
54 +a-button(variant=theme outline=true icon='trash') 152 +button(theme=theme badge=true highlighted=true)= 'Highlighted'
55 +a-button(variant=theme outline=true disabled=true icon='trash') 153 = ' '
154 +button(theme=theme badge=true selected=true)= 'Selected'
155 = ' '
156 +button(theme=theme badge=true disabled=true)= 'Disabled'
157 = ' '
158 +button(theme=theme badge=true selected=true disabled=true)= 'Selected + disabled'
159 br
160 br
161 +button(theme=theme quiet=true)= 'Idle'
162 = ' '
163 +button(theme=theme quiet=true highlighted=true)= 'Highlighted'
164 = ' '
165 +button(theme=theme quiet=true selected=true)= 'Selected'
166 = ' '
167 +button(theme=theme quiet=true disabled=true)= 'Disabled'
168 = ' '
169 +button(theme=theme quiet=true selected=true disabled=true)= 'Selected + disabled'
56 170
57 each theme in ['static-black', 'static-white'] 171 each theme in ['static-black', 'static-white']
58 - 172 -
59 const bg = theme.startsWith('static-black') ? 500 : 1000; 173 const bg = theme.startsWith('static-black') ? 500 : 1000;
60 174
61 .c-box(style=`background-color: var(--colors--blue-static--${bg});`) 175 .c-box(style=`background-color: var(--colors--blue-static--${bg});`)
62 .l-button-group 176 +button(theme=theme)= 'Idle'
63 +a-button(variant=theme)= 'Button' 177 = ' '
64 +a-button(variant=theme disabled=true)= 'Button' 178 +button(theme=theme highlighted=true)= 'Highlighted'
65 +a-button(variant=theme outline=true)= 'Button' 179 = ' '
66 +a-button(variant=theme outline=true disabled=true)= 'Button' 180 +button(theme=theme selected=true)= 'Selected'
181 = ' '
182 +button(theme=theme disabled=true)= 'Disabled'
183 = ' '
184 +button(theme=theme selected=true disabled=true)= 'Selected + disabled'
185 br
186 br
187 +button(theme=theme badge=true)= 'Idle'
188 = ' '
189 +button(theme=theme badge=true highlighted=true)= 'Highlighted'
190 = ' '
191 +button(theme=theme badge=true selected=true)= 'Selected'
192 = ' '
193 +button(theme=theme badge=true disabled=true)= 'Disabled'
194 = ' '
195 +button(theme=theme badge=true selected=true disabled=true)= 'Selected + disabled'
67 br 196 br
68 .l-button-group
69 +a-button(variant=theme icon='trash')
70 +a-button(variant=theme disabled=true icon='trash')
71 +a-button(variant=theme outline=true icon='trash')
72 +a-button(variant=theme outline=true disabled=true icon='trash')
73
74 .c-box(style=`background-color: var(--colors--blue-static--${bg});`)
75 .l-button-group
76 +a-button(variant=theme primary=true)= 'Button'
77 +a-button(variant=theme primary=true disabled=true)= 'Button'
78 +a-button(variant=theme primary=true outline=true)= 'Button'
79 +a-button(variant=theme primary=true outline=true disabled=true)= 'Button'
80 br 197 br
81 .l-button-group 198 +button(theme=theme quiet=true)= 'Idle'
82 +a-button(variant=theme primary=true icon='trash') 199 = ' '
83 +a-button(variant=theme primary=true disabled=true icon='trash') 200 +button(theme=theme quiet=true highlighted=true)= 'Highlighted'
84 +a-button(variant=theme primary=true outline=true icon='trash') 201 = ' '
85 +a-button(variant=theme primary=true outline=true disabled=true icon='trash') 202 +button(theme=theme quiet=true selected=true)= 'Selected'
203 = ' '
204 +button(theme=theme quiet=true disabled=true)= 'Disabled'
205 = ' '
206 +button(theme=theme quiet=true selected=true disabled=true)= 'Selected + disabled'
diff --git a/tpl/views/card.pug b/tpl/views/card.pug
index 633cf01..e982925 100644
--- a/tpl/views/card.pug
+++ b/tpl/views/card.pug
@@ -1,6 +1,63 @@
1mixin view-card 1mixin view-card
2 +view('card', 'Card')(wide=true) 2 +view('card', 'Card')(wide=true)
3 .l-card-list
4 +card(href='#' class='l-card-list__card')
5 +card-body
6 strong= 'Lorem ipsum dolor'
7 = 'sit amet'
8 +card(href='#' class='l-card-list__card' shadow=true)
9 +card-body
10 strong= 'Lorem ipsum dolor'
11 = 'sit amet'
12 +card(href='#' class='l-card-list__card' borderless=true)
13 +card-body
14 strong= 'Lorem ipsum dolor'
15 = 'sit amet'
16 +card(href='#' class='l-card-list__card' shadow=true borderless=true)
17 +card-body
18 strong= 'Lorem ipsum dolor'
19 = 'sit amet'
20
21 +divider('faint')(class='u-mb-700')
22
23 .l-card-list.l-card-list--merge
24 +card(href='#' class='l-card-list__card' borderless=true)
25 +card-body
26 strong= 'Lorem ipsum dolor'
27 = 'sit amet'
28 +card(href='#' class='l-card-list__card' borderless=true)
29 +card-body
30 strong= 'Lorem ipsum dolor'
31 = 'sit amet'
32 +card(href='#' class='l-card-list__card' borderless=true)
33 +card-body
34 strong= 'Lorem ipsum dolor'
35 = 'sit amet'
36
37 +divider('faint')(class='u-mb-700')
38
39 .l-card-list.l-card-list--merge.l-card-list--borderless.l-card-list--shadow
40 +card(href='#' class='l-card-list__card' borderless=true)
41 +card-body
42 strong= 'Lorem ipsum dolor'
43 = 'sit amet'
44 +card(href='#' class='l-card-list__card' borderless=true)
45 +card-body
46 strong= 'Lorem ipsum dolor'
47 = 'sit amet'
48 +card(href='#' class='l-card-list__card' borderless=true)
49 +card-body
50 strong= 'Lorem ipsum dolor'
51 = 'sit amet'
52
53 +divider('faint')(class='u-mb-700')
54
3 .l-card-list.l-card-list--masonry 55 .l-card-list.l-card-list--masonry
56 +card(thumbnail=true href='#' class='l-card-list__card')
57 +card-image(src='Drawing_Half.png')
58 +card-body
59 +card-title= 'XS Heading'
60
4 +card(href='#' class='l-card-list__card') 61 +card(href='#' class='l-card-list__card')
5 +card-image(src='Drawing_Half.png' style={ 'aspect-ratio': '21 / 9' }) 62 +card-image(src='Drawing_Half.png' style={ 'aspect-ratio': '21 / 9' })
6 +card-avatar(src='avatar.png') 63 +card-avatar(src='avatar.png')
@@ -26,29 +83,30 @@ mixin view-card
26 +card-body 83 +card-body
27 .l-media 84 .l-media
28 .l-media__block 85 .l-media__block
29 +badge('positive')(quiet=true icon='repeat' href='#') 86 +button(theme='positive' badge=true pill=true size='sm' icon='repeat' href='#')
30 strong= '12' 87 strong= '12'
31 .l-media__block 88 .l-media__block
32 +badge('warning')(quiet=true icon='star' href='#') 89 +button(theme='warning' badge=true pill=true size='sm' icon='star' href='#')
33 strong= '34' 90 strong= '34'
34 .l-media__block.u-mis-auto 91 .l-media__block.u-mis-auto
35 +a-button(primary=true)= 'Reply' 92 +button(selected=true)= 'Reply'
36 93
37 +card(quiet=true href='#' class='l-card-list__card') 94 +card(quiet=true href='#' class='l-card-list__card')
38 +card-image(src='Drawing_Half.png' style={ 'aspect-ratio': '21 / 9' }) 95 +card-image(src='Drawing_Half.png' style={ 'aspect-ratio': '21 / 9' })
96 +button(badge=true selected=true)= 'Drawings'
39 +card-body 97 +card-body
40 +card-title= 'XS Heading' 98 +card-title= 'XS Heading'
41 +card-content 99 +card-content
42 p= loremIpsum 100 p= loremIpsum
43 p= loremIpsum 101 p= loremIpsum
44 102
45 each layout in ['grid', 'masonry', 'masonry-h'] 103 each layout in ['grid', 'grid-sm', 'masonry', 'masonry-h']
46 - 104 -
47 let quiet = true 105 let quiet = true
48 106
49 let classes = { 107 let classes = {
50 'l-card-list': true, 108 'l-card-list': true,
51 'l-card-list--aspect-5/4': layout === 'grid', 109 'l-card-list--aspect-5/4': ['grid', 'grid-sm'].includes(layout),
52 'l-card-list--quiet': quiet, 110 'l-card-list--quiet': quiet,
53 } 111 }
54 classes[`l-card-list--${layout}`] = true; 112 classes[`l-card-list--${layout}`] = true;
@@ -59,7 +117,7 @@ mixin view-card
59 div(class=classes) 117 div(class=classes)
60 each img, i in ['Drawing_Half.png', '0000 Cover@0.5x.webp', 'avatar.png', '01 Design Cody.png', 'avatar.png', 'Drawing_Half.png'] 118 each img, i in ['Drawing_Half.png', '0000 Cover@0.5x.webp', 'avatar.png', '01 Design Cody.png', 'avatar.png', 'Drawing_Half.png']
61 +card(quiet=quiet href='#' class='l-card-list__card') 119 +card(quiet=quiet href='#' class='l-card-list__card')
62 +card-image(src=img class='l-card-list__card-image') 120 +card-image(src=img list=true)
63 +card-body 121 +card-body
64 .l-media 122 .l-media
65 .l-media__block.l-media__block--main 123 .l-media__block.l-media__block--main
diff --git a/tpl/views/dialog.pug b/tpl/views/dialog.pug
index 5a659dd..9c2e520 100644
--- a/tpl/views/dialog.pug
+++ b/tpl/views/dialog.pug
@@ -53,8 +53,8 @@ mixin view-dialog
53 +dialog 53 +dialog
54 +slot('header') 54 +slot('header')
55 .l-media__block.l-flex 55 .l-media__block.l-flex
56 +action-button(quiet=true icon='chevron-left') 56 +button(quiet=true icon='chevron-left')
57 +action-button(quiet=true icon='chevron-right') 57 +button(quiet=true icon='chevron-right')
58 .l-media__block.l-media__block--main 58 .l-media__block.l-media__block--main
59 +div-heading('xl')(class="u-mt-0")= 'Tags' 59 +div-heading('xl')(class="u-mt-0")= 'Tags'
60 +slot('sidebar') 60 +slot('sidebar')
diff --git a/tpl/views/divider.pug b/tpl/views/divider.pug
index e2f2e01..5429ab5 100644
--- a/tpl/views/divider.pug
+++ b/tpl/views/divider.pug
@@ -12,24 +12,45 @@ mixin view-divider
12 12
13 .c-box 13 .c-box
14 +div-heading('xs')= 'Heading' 14 +div-heading('xs')= 'Heading'
15 +divider('quiet')
16 p= loremIpsum
17
18 .c-box
19 +div-heading('xs')= 'Heading'
15 +divider('faint') 20 +divider('faint')
16 p= loremIpsum 21 p= loremIpsum
17 22
18 .c-box 23 .c-box
19 +divider('strong')= 'Strong' 24 +divider('strong')= 'Strong'
20 +divider('medium')= 'Medium' 25 +divider('medium')= 'Medium'
26 +divider('quiet')= 'Quiet'
21 +divider('faint')= 'Faint' 27 +divider('faint')= 'Faint'
22 +divider('strong') 28 +divider('strong')
23 +divider('medium') 29 +divider('medium')
30 +divider('quiet')
24 +divider('faint') 31 +divider('faint')
25 32
33 .c-box
34 .l-media(style="height: 1em")
35 +divider('strong')(vertical=true class="l-media__block")
36 +divider('medium')(vertical=true class="l-media__block")
37 +divider('quiet')(vertical=true class="l-media__block")
38 +divider('faint')(vertical=true class="l-media__block")
39 .l-media(style="height: 1em")
40 +divider('strong')(dot=true class="l-media__block")
41 +divider('medium')(dot=true class="l-media__block")
42 +divider('quiet')(dot=true class="l-media__block")
43 +divider('faint')(dot=true class="l-media__block")
44
26 each theme in ['accent', 'negative'] 45 each theme in ['accent', 'negative']
27 .c-box 46 .c-box
28 +divider('strong')(color=theme)= 'Strong' 47 +divider('strong')(color=theme)= 'Strong'
29 +divider('medium')(color=theme)= 'Medium' 48 +divider('medium')(color=theme)= 'Medium'
49 +divider('quiet')(color=theme)= 'Quiet'
30 +divider('faint')(color=theme)= 'Faint' 50 +divider('faint')(color=theme)= 'Faint'
31 +divider('strong')(color=theme) 51 +divider('strong')(color=theme)
32 +divider('medium')(color=theme) 52 +divider('medium')(color=theme)
53 +divider('quiet')(color=theme)
33 +divider('faint')(color=theme) 54 +divider('faint')(color=theme)
34 55
35 each theme in ['static-black', 'static-white'] 56 each theme in ['static-black', 'static-white']
@@ -39,7 +60,9 @@ mixin view-divider
39 .c-box(style=`background-color: var(--colors--blue-static--${bg});`) 60 .c-box(style=`background-color: var(--colors--blue-static--${bg});`)
40 +divider('strong')(color=theme)= 'Strong' 61 +divider('strong')(color=theme)= 'Strong'
41 +divider('medium')(color=theme)= 'Medium' 62 +divider('medium')(color=theme)= 'Medium'
63 +divider('quiet')(color=theme)= 'Quiet'
42 +divider('faint')(color=theme)= 'Faint' 64 +divider('faint')(color=theme)= 'Faint'
43 +divider('strong')(color=theme) 65 +divider('strong')(color=theme)
44 +divider('medium')(color=theme) 66 +divider('medium')(color=theme)
67 +divider('quiet')(color=theme)
45 +divider('faint')(color=theme) 68 +divider('faint')(color=theme)
diff --git a/tpl/views/emoji.pug b/tpl/views/emoji.pug
index 3d01ca7..d6e2b56 100644
--- a/tpl/views/emoji.pug
+++ b/tpl/views/emoji.pug
@@ -1,14 +1,14 @@
1mixin view-emoji 1mixin view-emoji
2 +view('emoji', 'Emoji') 2 +view('emoji', 'Emoji')
3 .c-box 3 .c-box
4 +action-button(icon='trash') 4 +button(icon='trash')
5 = ' ' 5 = ' '
6 +action-button 6 +button
7 +emoji('drgn')(size='icon') 7 +emoji('drgn')(size='icon')
8 = ' ' 8 = ' '
9 +action-button(icon='trash' quiet=true) 9 +button(icon='trash' quiet=true)
10 = ' ' 10 = ' '
11 +action-button(quiet=true) 11 +button(quiet=true)
12 +emoji('drgn')(size='icon') 12 +emoji('drgn')(size='icon')
13 13
14 .c-box 14 .c-box
diff --git a/tpl/views/form.pug b/tpl/views/form.pug
index 5b24757..ca9e224 100644
--- a/tpl/views/form.pug
+++ b/tpl/views/form.pug
@@ -27,4 +27,4 @@ mixin view-form
27 +checkbox= 'I\'ve read and accept the terms and conditions' 27 +checkbox= 'I\'ve read and accept the terms and conditions'
28 28
29 +form-item('') 29 +form-item('')
30 +a-button(variant='primary')= 'Register' 30 +button(variant='primary')= 'Register'
diff --git a/tpl/views/menu.pug b/tpl/views/menu.pug
index 7c5df03..682f8bb 100644
--- a/tpl/views/menu.pug
+++ b/tpl/views/menu.pug
@@ -2,7 +2,7 @@ mixin view-menu
2 +view('menu', 'Menu') 2 +view('menu', 'Menu')
3 .c-box 3 .c-box
4 div(style={ display: 'flex', 'flex-direction': 'column', 'align-items': 'flex-start' }) 4 div(style={ display: 'flex', 'flex-direction': 'column', 'align-items': 'flex-start' })
5 +action-button(quiet=true selected=true)= 'Menu' 5 +button(quiet=true selected=true)= 'Menu'
6 +popover 6 +popover
7 +menu 7 +menu
8 +menu-slot(class='l-media') 8 +menu-slot(class='l-media')
diff --git a/tpl/views/popover.pug b/tpl/views/popover.pug
index b269596..bd78471 100644
--- a/tpl/views/popover.pug
+++ b/tpl/views/popover.pug
@@ -1,6 +1,6 @@
1mixin view-popover 1mixin view-popover
2 +view('popover', 'Popover') 2 +view('popover', 'Popover')
3 .c-box 3 .c-box
4 +action-button(quiet=true selected=true)= 'Popover' 4 +button(quiet=true selected=true)= 'Popover'
5 +popover 5 +popover
6 = loremIpsum 6 = loremIpsum
diff --git a/tpl/views/text-field.pug b/tpl/views/text-field.pug
index 165e2ce..4309ff6 100644
--- a/tpl/views/text-field.pug
+++ b/tpl/views/text-field.pug
@@ -16,8 +16,8 @@ mixin view-text-field
16 div 16 div
17 +text-field(placeholder='Just landed in L.A.' class="u-p-50") 17 +text-field(placeholder='Just landed in L.A.' class="u-p-50")
18 +slot('pre') 18 +slot('pre')
19 +action-button(quiet=true class='l-media__block')= 'Volpeon' 19 +button(quiet=true class='l-media__block')= 'Volpeon'
20 +divider('vertical')(class='u-mis-50') 20 +divider('vertical')(class='u-mis-50')
21 +slot('post') 21 +slot('post')
22 +action-button(quiet=true icon='smile' class='l-media__block') 22 +button(quiet=true icon='smile' class='l-media__block')
23 +action-button(quiet=true icon='send' class='l-media__block') 23 +button(quiet=true icon='send' class='l-media__block')