@toybreaker/fiko 0.6.4 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.css +2 -0
- package/omg/0reset.css +2 -1
- package/omg/1vars.css +8 -1
- package/omg/3base.css +1 -1
- package/omg/4layout.css +27 -111
- package/omg/5components.css +179 -121
- package/omg/utils/animation.css +54 -0
- package/omg/utils/fiko.css +111 -62
- package/omg/utils/layout.css +152 -14
- package/omg/utils/misc.css +1 -8
- package/omg/utils/spacing.css +13 -13
- package/omg/utils/text.css +95 -7
- package/omg/utils/transitions.css +22 -0
- package/omg/utils/visibility.css +26 -0
- package/package.json +2 -2
- package/template/branding/roles.css +37 -5
- package/template/branding/theme-toggle.js +74 -0
package/index.css
CHANGED
|
@@ -50,5 +50,7 @@
|
|
|
50
50
|
@import url(omg/utils/aspect.css) layer(utilities);
|
|
51
51
|
@import url(omg/utils/gradients.css) layer(utilities);
|
|
52
52
|
@import url(omg/utils/misc.css) layer(utilities);
|
|
53
|
+
@import url(omg/utils/animation.css) layer(utilities);
|
|
54
|
+
@import url(omg/utils/transitions.css) layer(utilities);
|
|
53
55
|
|
|
54
56
|
@import url(omg/utils/fiko.css) layer(utilities);
|
package/omg/0reset.css
CHANGED
package/omg/1vars.css
CHANGED
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
/* Brand palette overrides live in branding/palette.css */
|
|
4
4
|
|
|
5
5
|
:root {
|
|
6
|
+
color-scheme: light dark;
|
|
7
|
+
|
|
6
8
|
/* ── COLOR NEUTRALS ──────────────────────────── */
|
|
7
9
|
--dark: oklch(0.20 0 0);
|
|
8
10
|
--darkT25: color-mix(in oklch, var(--dark), transparent 75%);
|
|
@@ -19,10 +21,15 @@
|
|
|
19
21
|
/* ── SIZING ─────────────────────────────────── */
|
|
20
22
|
--tap_size: clamp(42px, 5vw, 52px);
|
|
21
23
|
--radius: 6px;
|
|
22
|
-
--
|
|
24
|
+
--radius_sm: 3px;
|
|
25
|
+
--borderpx: 1px;
|
|
23
26
|
--sticky_header_height: 88px; /* override in 000/ per client */
|
|
27
|
+
--sticky_z: 20;
|
|
24
28
|
--maximise: -1.5rem; /* negative container bleed */
|
|
25
29
|
|
|
30
|
+
/* ── TYPOGRAPHY EXTRAS ───────────────────────── */
|
|
31
|
+
--mono: ui-monospace, "Cascadia Code", "SF Mono", Menlo, Consolas, monospace;
|
|
32
|
+
|
|
26
33
|
/* ── SPACING ─────────────────────────────────── */
|
|
27
34
|
--spaceH: 1.75svw;
|
|
28
35
|
--spaceV: 1.5svh;
|
package/omg/3base.css
CHANGED
package/omg/4layout.css
CHANGED
|
@@ -1,126 +1,42 @@
|
|
|
1
1
|
/*! 🐉 404.css | MIT License */
|
|
2
|
-
/* 4layout.css */
|
|
2
|
+
/* 4layout.css — semantic element layout defaults */
|
|
3
3
|
|
|
4
|
-
/*
|
|
5
|
-
|
|
6
|
-
/* Container query setup */
|
|
7
|
-
container-type: inline-size;
|
|
8
|
-
container-name: main-container;
|
|
4
|
+
/* ── NAV ────────────────────────────────────────── */
|
|
5
|
+
/* Single scrollable row, no visible scrollbar */
|
|
9
6
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
gap: var(--breath);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/* Responsive grid using container queries
|
|
23
|
-
This leverages the breakpoint variables defined in 1vars.css */
|
|
24
|
-
@container main-container (min-width: var(--bp_sm)) {
|
|
25
|
-
.grid {
|
|
26
|
-
--grid_cols: 2;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
@container main-container (min-width: var(--bp_md)) {
|
|
31
|
-
.grid {
|
|
32
|
-
--grid_cols: 3;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
@container main-container (min-width: var(--bp_lg)) {
|
|
37
|
-
.grid {
|
|
38
|
-
--grid_cols: 4;
|
|
39
|
-
}
|
|
7
|
+
nav {
|
|
8
|
+
display: flex;
|
|
9
|
+
flex-wrap: nowrap;
|
|
10
|
+
align-items: center;
|
|
11
|
+
gap: var(--spaceH);
|
|
12
|
+
width: 100%;
|
|
13
|
+
overflow-x: auto;
|
|
14
|
+
overflow-y: hidden;
|
|
15
|
+
scrollbar-width: none; /* Firefox */
|
|
40
16
|
}
|
|
41
17
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
display: flex;
|
|
45
|
-
flex-wrap: wrap;
|
|
46
|
-
align-items: center;
|
|
47
|
-
justify-content: space-between;
|
|
48
|
-
gap: 1px;
|
|
18
|
+
nav::-webkit-scrollbar {
|
|
19
|
+
display: none; /* Chrome / Safari */
|
|
49
20
|
}
|
|
50
21
|
|
|
51
22
|
nav ul,
|
|
52
23
|
nav ol {
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
24
|
+
display: flex;
|
|
25
|
+
flex-wrap: nowrap;
|
|
26
|
+
align-items: center;
|
|
27
|
+
gap: var(--spaceH);
|
|
28
|
+
padding: 0;
|
|
29
|
+
margin: 0;
|
|
30
|
+
list-style: none;
|
|
58
31
|
}
|
|
59
32
|
|
|
60
33
|
nav li {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
/* Optional: Add responsive navigation behavior */
|
|
66
|
-
@container main-container (max-width: var(--bp_sm)) {
|
|
67
|
-
nav {
|
|
68
|
-
flex-direction: column;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
nav ul,
|
|
72
|
-
nav ol {
|
|
73
|
-
flex-direction: column;
|
|
74
|
-
width: 100%;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/* ── BENTO BOX ──────────────────────────────────── */
|
|
79
|
-
/* Mosaic product grid. Wrap cards in <div class="bento">
|
|
80
|
-
*
|
|
81
|
-
* Token-driven: adjust --bento_cols / --bento_rows at any level.
|
|
82
|
-
* aspect-ratio keeps cells proportional automatically.
|
|
83
|
-
* grid-auto-flow: dense fills gaps — add items in any order.
|
|
84
|
-
*
|
|
85
|
-
* Quick override examples:
|
|
86
|
-
* style="--bento_cols:4; --bento_rows:2" → 4×2 landscape
|
|
87
|
-
* style="--bento_cols:2; --bento_rows:4" → 2×4 portrait
|
|
88
|
-
*
|
|
89
|
-
* Span modifiers on children:
|
|
90
|
-
* .bento_col_2 / .bento_col_3 → span N columns
|
|
91
|
-
* .bento_row_2 / .bento_row_3 → span N rows
|
|
92
|
-
* .bento_full → full width
|
|
93
|
-
*/
|
|
94
|
-
|
|
95
|
-
.bento {
|
|
96
|
-
--bento_cols: 3;
|
|
97
|
-
--bento_rows: 3;
|
|
98
|
-
display: grid;
|
|
99
|
-
grid-template-columns: repeat(var(--bento_cols), 1fr);
|
|
100
|
-
grid-template-rows: repeat(var(--bento_rows), 1fr);
|
|
101
|
-
grid-auto-flow: dense;
|
|
102
|
-
gap: calc(var(--spaceV) * 0.5) calc(var(--spaceH) * 0.5);
|
|
103
|
-
width: 100%;
|
|
104
|
-
aspect-ratio: var(--bento_cols) / var(--bento_rows);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
/* Featured first child: 2×2 */
|
|
108
|
-
.bento > :first-child { grid-column: span 2; grid-row: span 2; }
|
|
109
|
-
|
|
110
|
-
/* ── Span modifiers ─────────────────────────────── */
|
|
111
|
-
.bento > .bento_col_2 { grid-column: span 2; }
|
|
112
|
-
.bento > .bento_col_3 { grid-column: span 3; }
|
|
113
|
-
.bento > .bento_full { grid-column: 1 / -1; }
|
|
114
|
-
.bento > .bento_row_2 { grid-row: span 2; }
|
|
115
|
-
.bento > .bento_row_3 { grid-row: span 3; }
|
|
116
|
-
|
|
117
|
-
/* ── Responsive defaults ────────────────────────── */
|
|
118
|
-
@container main-container (max-width: 479px) {
|
|
119
|
-
.bento { --bento_cols: 1; --bento_rows: 6; }
|
|
120
|
-
.bento > :first-child { grid-column: span 1; grid-row: span 1; }
|
|
34
|
+
display: flex;
|
|
35
|
+
align-items: center;
|
|
36
|
+
flex-shrink: 0;
|
|
37
|
+
white-space: nowrap;
|
|
121
38
|
}
|
|
122
39
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
.bento > :first-child { grid-column: span 2; grid-row: span 2; }
|
|
40
|
+
nav a {
|
|
41
|
+
white-space: nowrap;
|
|
126
42
|
}
|
package/omg/5components.css
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/*! 🐉 404.css | MIT License */
|
|
2
|
-
/* 5components.css — interactive
|
|
2
|
+
/* 5components.css — interactive element defaults and component classes */
|
|
3
|
+
|
|
4
|
+
/* ── BUTTON / INPUT ─────────────────────────────── */
|
|
3
5
|
|
|
4
|
-
/* BUTTON / INPUT — shape & layout */
|
|
5
6
|
button,
|
|
6
7
|
.button input[type="submit"],
|
|
7
8
|
input[type="button"],
|
|
@@ -26,7 +27,7 @@ input[type="reset"],
|
|
|
26
27
|
user-select: none;
|
|
27
28
|
}
|
|
28
29
|
|
|
29
|
-
/*
|
|
30
|
+
/* .button — wraps a <button> inside an <a> */
|
|
30
31
|
.button {
|
|
31
32
|
border: none;
|
|
32
33
|
border-radius: var(--radius);
|
|
@@ -45,7 +46,8 @@ button:hover {
|
|
|
45
46
|
transform: translateY(3px);
|
|
46
47
|
}
|
|
47
48
|
|
|
48
|
-
/* LINK
|
|
49
|
+
/* ── LINK ───────────────────────────────────────── */
|
|
50
|
+
|
|
49
51
|
a:not(.underline),
|
|
50
52
|
[role="link"] {
|
|
51
53
|
outline: none;
|
|
@@ -71,7 +73,9 @@ a input[type="reset"] {
|
|
|
71
73
|
user-select: none;
|
|
72
74
|
}
|
|
73
75
|
|
|
74
|
-
/* CTA BUTTON
|
|
76
|
+
/* ── CTA BUTTON ─────────────────────────────────── */
|
|
77
|
+
/* .button_cta — filled primary action */
|
|
78
|
+
|
|
75
79
|
.button_cta button {
|
|
76
80
|
background-color: var(--cta);
|
|
77
81
|
border-color: var(--cta);
|
|
@@ -82,12 +86,15 @@ a input[type="reset"] {
|
|
|
82
86
|
border-color: var(--cta_hover);
|
|
83
87
|
}
|
|
84
88
|
|
|
85
|
-
/* SVG
|
|
89
|
+
/* ── SVG ────────────────────────────────────────── */
|
|
90
|
+
|
|
86
91
|
svg:not(:root) {
|
|
87
92
|
overflow: hidden;
|
|
88
93
|
}
|
|
89
94
|
|
|
90
|
-
/*
|
|
95
|
+
/* ── CONTROLS ───────────────────────────────────── */
|
|
96
|
+
/* Sticky header shell — fixed height for layout stability */
|
|
97
|
+
|
|
91
98
|
.controls {
|
|
92
99
|
height: var(--sticky_header_height);
|
|
93
100
|
min-height: var(--sticky_header_height);
|
|
@@ -100,90 +107,14 @@ svg:not(:root) {
|
|
|
100
107
|
z-index: 20;
|
|
101
108
|
}
|
|
102
109
|
|
|
103
|
-
/* ── HEADING SCALE ──────────────────────────────── */
|
|
104
|
-
|
|
105
|
-
.h1,
|
|
106
|
-
.h2,
|
|
107
|
-
.h3,
|
|
108
|
-
.h4,
|
|
109
|
-
.h5,
|
|
110
|
-
.h6 {
|
|
111
|
-
user-select: none !important;
|
|
112
|
-
line-height: 1.2 !important;
|
|
113
|
-
font-family: var(--font_family) !important;
|
|
114
|
-
}
|
|
115
|
-
.h1 {
|
|
116
|
-
font-size: calc(var(--font_size) * 2.5) !important;
|
|
117
|
-
font-weight: var(--weight_light) !important;
|
|
118
|
-
}
|
|
119
|
-
.h2 {
|
|
120
|
-
font-size: calc(var(--font_size) * 2) !important;
|
|
121
|
-
font-weight: var(--weight_light) !important;
|
|
122
|
-
}
|
|
123
|
-
.h3 {
|
|
124
|
-
font-size: calc(var(--font_size) * 1.75) !important;
|
|
125
|
-
font-weight: var(--weight_thin) !important;
|
|
126
|
-
}
|
|
127
|
-
.h4 {
|
|
128
|
-
font-size: calc(var(--font_size) * 1.5) !important;
|
|
129
|
-
font-weight: var(--weight_thin) !important;
|
|
130
|
-
}
|
|
131
|
-
.h5 {
|
|
132
|
-
font-size: calc(var(--font_size) * 1.25) !important;
|
|
133
|
-
font-weight: var(--weight_thin) !important;
|
|
134
|
-
}
|
|
135
|
-
.h6 {
|
|
136
|
-
font-size: calc(var(--font_size) * 1) !important;
|
|
137
|
-
font-weight: var(--weight_light) !important;
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
/* ── TEXT UTILITIES ─────────────────────────────── */
|
|
141
|
-
|
|
142
|
-
.dim {
|
|
143
|
-
color: var(--text);
|
|
144
|
-
font-size: calc(var(--font_size) * 0.95);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
.underline {
|
|
148
|
-
text-decoration: underline;
|
|
149
|
-
text-underline-offset: 3px;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
.prose {
|
|
153
|
-
max-width: 66ch;
|
|
154
|
-
margin-inline: auto;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
.typewriter {
|
|
158
|
-
font-family: var(--font_serif);
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
.cat {
|
|
162
|
-
text-transform: capitalize;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
/* ── LAYOUT UTILITIES ───────────────────────────── */
|
|
166
|
-
|
|
167
|
-
.maximise {
|
|
168
|
-
margin-left: var(--maximise);
|
|
169
|
-
margin-right: var(--maximise);
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
.clipped_circle {
|
|
173
|
-
clip-path: circle(50px at center);
|
|
174
|
-
}
|
|
175
|
-
|
|
176
110
|
/* ── ACCORDION ──────────────────────────────────── */
|
|
177
111
|
/* Usage: <details class="accordion"><summary>Title</summary><div>…</div></details>
|
|
178
|
-
*
|
|
179
|
-
*
|
|
112
|
+
* Chevron rotates 180° when open. Use .dotted modifier for dot-leader.
|
|
113
|
+
* Use .accordion_chevron modifier for right-pointing arrow style.
|
|
180
114
|
*/
|
|
181
115
|
|
|
182
|
-
details.accordion {
|
|
183
|
-
border-bottom: var(--borderpx) solid var(--border_color);
|
|
184
|
-
}
|
|
185
|
-
|
|
186
116
|
details.accordion > summary {
|
|
117
|
+
border-bottom: var(--borderpx) solid var(--border_color);
|
|
187
118
|
display: flex;
|
|
188
119
|
flex-direction: row;
|
|
189
120
|
align-items: center;
|
|
@@ -228,7 +159,7 @@ details.accordion > summary::after {
|
|
|
228
159
|
transform: rotate(0deg);
|
|
229
160
|
transition: transform var(--transition);
|
|
230
161
|
order: 2;
|
|
231
|
-
margin-
|
|
162
|
+
margin-inline-start: auto;
|
|
232
163
|
}
|
|
233
164
|
|
|
234
165
|
details.accordion[open] > summary::after {
|
|
@@ -243,66 +174,193 @@ details.accordion > :not(summary) {
|
|
|
243
174
|
padding: var(--spaceV) var(--spaceH);
|
|
244
175
|
}
|
|
245
176
|
|
|
246
|
-
/* ── ACCORDION DOTTED
|
|
247
|
-
/*
|
|
177
|
+
/* ── ACCORDION DOTTED ───────────────────────────── */
|
|
178
|
+
/* Modifier: <details class="accordion dotted">
|
|
248
179
|
* Adds a dotted leader between the label and the chevron.
|
|
249
180
|
*/
|
|
250
181
|
|
|
182
|
+
details.accordion.dotted > summary {
|
|
183
|
+
border-bottom: none;
|
|
184
|
+
}
|
|
185
|
+
|
|
251
186
|
details.accordion.dotted > summary::before {
|
|
252
187
|
content: "";
|
|
253
188
|
flex: 1;
|
|
254
|
-
border-bottom: var(--borderpx) dotted currentColor;
|
|
189
|
+
border-bottom: max(2px, var(--borderpx)) dotted currentColor;
|
|
255
190
|
margin-inline: 0.5rem;
|
|
256
191
|
align-self: center;
|
|
257
192
|
opacity: 0.3;
|
|
258
193
|
order: 1;
|
|
259
194
|
}
|
|
260
195
|
|
|
261
|
-
/* ── ACCORDION
|
|
262
|
-
/* Modifier: <details class="accordion
|
|
263
|
-
*
|
|
264
|
-
* Closed: → pointing right. Open: rotated 90° pointing down.
|
|
265
|
-
* Composable: stack with other modifiers for full editorial style.
|
|
266
|
-
* Color: currentColor by default; override with CSS custom property.
|
|
196
|
+
/* ── ACCORDION PLUS/MINUS ───────────────────────── */
|
|
197
|
+
/* Modifier: <details class="accordion accordion_pm">
|
|
198
|
+
* Plus when closed, minus when open. No rotation — clean toggle symbol.
|
|
267
199
|
*/
|
|
268
200
|
|
|
269
|
-
details.accordion.
|
|
270
|
-
|
|
201
|
+
details.accordion.accordion_pm > summary::after {
|
|
202
|
+
content: "+";
|
|
203
|
+
background-color: transparent;
|
|
204
|
+
-webkit-mask-image: none;
|
|
205
|
+
mask-image: none;
|
|
206
|
+
width: auto;
|
|
207
|
+
height: auto;
|
|
208
|
+
font-size: 1.75em;
|
|
209
|
+
font-weight: var(--weight_thin);
|
|
210
|
+
line-height: 1;
|
|
211
|
+
color: var(--primary);
|
|
212
|
+
transition: color var(--transition);
|
|
213
|
+
transform: none;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
details.accordion.accordion_pm[open] > summary::after {
|
|
217
|
+
content: "−";
|
|
218
|
+
transform: none;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/* ── FORM ELEMENTS ──────────────────────────────── */
|
|
222
|
+
/* Inputs, textarea, select. Wrap with .field for labelled stacks. */
|
|
223
|
+
|
|
224
|
+
input[type="text"],
|
|
225
|
+
input[type="email"],
|
|
226
|
+
input[type="password"],
|
|
227
|
+
input[type="search"],
|
|
228
|
+
input[type="tel"],
|
|
229
|
+
input[type="url"],
|
|
230
|
+
input[type="number"],
|
|
231
|
+
input[type="date"],
|
|
232
|
+
select {
|
|
233
|
+
height: var(--tap_size);
|
|
234
|
+
padding-inline: var(--spaceH);
|
|
235
|
+
padding-block: var(--spaceV);
|
|
236
|
+
border: var(--borderpx) solid var(--border_color);
|
|
237
|
+
border-radius: var(--radius);
|
|
238
|
+
background: transparent;
|
|
239
|
+
color: inherit;
|
|
240
|
+
font: inherit;
|
|
241
|
+
outline: none;
|
|
242
|
+
transition: border-color var(--transition);
|
|
243
|
+
width: 100%;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
textarea {
|
|
247
|
+
min-height: calc(var(--tap_size) * 2);
|
|
248
|
+
padding-inline: var(--spaceH);
|
|
249
|
+
padding-block: var(--spaceV);
|
|
250
|
+
border: var(--borderpx) solid var(--border_color);
|
|
251
|
+
border-radius: var(--radius);
|
|
252
|
+
background: transparent;
|
|
253
|
+
color: inherit;
|
|
254
|
+
font: inherit;
|
|
255
|
+
outline: none;
|
|
256
|
+
resize: vertical;
|
|
257
|
+
transition: border-color var(--transition);
|
|
258
|
+
width: 100%;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/* focus — highlight border, suppress default outline (reset handles :focus-visible) */
|
|
262
|
+
input[type="text"]:focus-visible,
|
|
263
|
+
input[type="email"]:focus-visible,
|
|
264
|
+
input[type="password"]:focus-visible,
|
|
265
|
+
input[type="search"]:focus-visible,
|
|
266
|
+
input[type="tel"]:focus-visible,
|
|
267
|
+
input[type="url"]:focus-visible,
|
|
268
|
+
input[type="number"]:focus-visible,
|
|
269
|
+
input[type="date"]:focus-visible,
|
|
270
|
+
textarea:focus-visible,
|
|
271
|
+
select:focus-visible {
|
|
272
|
+
border-color: var(--primary);
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
/* disabled */
|
|
276
|
+
input[type="text"]:disabled,
|
|
277
|
+
input[type="email"]:disabled,
|
|
278
|
+
input[type="password"]:disabled,
|
|
279
|
+
input[type="search"]:disabled,
|
|
280
|
+
input[type="tel"]:disabled,
|
|
281
|
+
input[type="url"]:disabled,
|
|
282
|
+
input[type="number"]:disabled,
|
|
283
|
+
input[type="date"]:disabled,
|
|
284
|
+
textarea:disabled,
|
|
285
|
+
select:disabled {
|
|
286
|
+
opacity: 0.45;
|
|
287
|
+
cursor: not-allowed;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/* invalid — semantic red (OKLCH) */
|
|
291
|
+
input[type="text"]:invalid,
|
|
292
|
+
input[type="email"]:invalid,
|
|
293
|
+
input[type="password"]:invalid,
|
|
294
|
+
input[type="search"]:invalid,
|
|
295
|
+
input[type="tel"]:invalid,
|
|
296
|
+
input[type="url"]:invalid,
|
|
297
|
+
input[type="number"]:invalid,
|
|
298
|
+
input[type="date"]:invalid,
|
|
299
|
+
textarea:invalid,
|
|
300
|
+
select:invalid,
|
|
301
|
+
input[type="text"][aria-invalid="true"],
|
|
302
|
+
input[type="email"][aria-invalid="true"],
|
|
303
|
+
input[type="password"][aria-invalid="true"],
|
|
304
|
+
input[type="search"][aria-invalid="true"],
|
|
305
|
+
input[type="tel"][aria-invalid="true"],
|
|
306
|
+
input[type="url"][aria-invalid="true"],
|
|
307
|
+
input[type="number"][aria-invalid="true"],
|
|
308
|
+
input[type="date"][aria-invalid="true"],
|
|
309
|
+
textarea[aria-invalid="true"],
|
|
310
|
+
select[aria-invalid="true"] {
|
|
311
|
+
border-color: oklch(0.6 0.22 25);
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
/* select — hide native arrow, inject currentColor chevron via mask */
|
|
315
|
+
select {
|
|
316
|
+
appearance: none;
|
|
317
|
+
-webkit-appearance: none;
|
|
318
|
+
padding-inline-end: calc(var(--spaceH) + 1.75em);
|
|
319
|
+
background-image: none;
|
|
320
|
+
/* chevron pseudo not possible on replaced elements; use wrapper .select_wrap instead */
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/* .select_wrap — wraps <select> to inject a currentColor chevron via ::after */
|
|
324
|
+
.select_wrap {
|
|
325
|
+
position: relative;
|
|
326
|
+
display: inline-flex;
|
|
327
|
+
width: 100%;
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
.select_wrap select {
|
|
331
|
+
width: 100%;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
.select_wrap::after {
|
|
271
335
|
content: "";
|
|
272
|
-
|
|
336
|
+
position: absolute;
|
|
337
|
+
inset-block: 0;
|
|
338
|
+
inset-inline-end: var(--spaceH);
|
|
273
339
|
width: 1.25em;
|
|
274
340
|
height: 1.25em;
|
|
275
|
-
|
|
341
|
+
margin-block: auto;
|
|
276
342
|
background-color: currentColor;
|
|
277
|
-
-webkit-mask-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='
|
|
343
|
+
-webkit-mask-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6 9L12 15L18 9'/%3E%3C/svg%3E");
|
|
278
344
|
-webkit-mask-size: contain;
|
|
279
345
|
-webkit-mask-repeat: no-repeat;
|
|
280
346
|
-webkit-mask-position: center;
|
|
281
|
-
mask-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='
|
|
347
|
+
mask-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M6 9L12 15L18 9'/%3E%3C/svg%3E");
|
|
282
348
|
mask-size: contain;
|
|
283
349
|
mask-repeat: no-repeat;
|
|
284
350
|
mask-position: center;
|
|
285
|
-
|
|
286
|
-
transition:
|
|
287
|
-
transform 200ms ease,
|
|
288
|
-
background-color var(--transition);
|
|
289
|
-
line-height: 1;
|
|
290
|
-
font-size: 1em;
|
|
351
|
+
pointer-events: none;
|
|
291
352
|
}
|
|
292
353
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
}
|
|
354
|
+
/* ── FIELD WRAPPER ──────────────────────────────── */
|
|
355
|
+
/* Usage: <div class="field"><label>…</label><input …></div> */
|
|
296
356
|
|
|
297
|
-
|
|
298
|
-
|
|
357
|
+
.field {
|
|
358
|
+
display: flex;
|
|
359
|
+
flex-direction: column;
|
|
360
|
+
gap: calc(var(--spaceV) * 0.5);
|
|
361
|
+
}
|
|
299
362
|
|
|
300
|
-
.
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
margin: 0 0 0 8px;
|
|
304
|
-
height: var(--borderpx);
|
|
305
|
-
position: relative;
|
|
306
|
-
top: 0;
|
|
307
|
-
opacity: 0.25;
|
|
363
|
+
.field label {
|
|
364
|
+
font-weight: var(--weight_regular);
|
|
365
|
+
user-select: none;
|
|
308
366
|
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/*! 🐉 404.css | MIT License */
|
|
2
|
+
/* utils/animation.css — @starting-style on-enter helpers */
|
|
3
|
+
|
|
4
|
+
/* ── ENTER TRANSITIONS ── */
|
|
5
|
+
/* Apply to any element that should animate in when first rendered.
|
|
6
|
+
* Requires a transition on the property being animated.
|
|
7
|
+
* Usage: <div class="fade_in"> or <dialog class="slide_up">
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
.fade_in {
|
|
11
|
+
opacity: 1;
|
|
12
|
+
transition: opacity var(--transition);
|
|
13
|
+
}
|
|
14
|
+
@starting-style {
|
|
15
|
+
.fade_in {
|
|
16
|
+
opacity: 0;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
.slide_up {
|
|
21
|
+
translate: 0 0;
|
|
22
|
+
opacity: 1;
|
|
23
|
+
transition: translate var(--transition), opacity var(--transition);
|
|
24
|
+
}
|
|
25
|
+
@starting-style {
|
|
26
|
+
.slide_up {
|
|
27
|
+
translate: 0 1rem;
|
|
28
|
+
opacity: 0;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.slide_down {
|
|
33
|
+
translate: 0 0;
|
|
34
|
+
opacity: 1;
|
|
35
|
+
transition: translate var(--transition), opacity var(--transition);
|
|
36
|
+
}
|
|
37
|
+
@starting-style {
|
|
38
|
+
.slide_down {
|
|
39
|
+
translate: 0 -1rem;
|
|
40
|
+
opacity: 0;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.scale_in {
|
|
45
|
+
scale: 1;
|
|
46
|
+
opacity: 1;
|
|
47
|
+
transition: scale var(--transition), opacity var(--transition);
|
|
48
|
+
}
|
|
49
|
+
@starting-style {
|
|
50
|
+
.scale_in {
|
|
51
|
+
scale: 0.95;
|
|
52
|
+
opacity: 0;
|
|
53
|
+
}
|
|
54
|
+
}
|