@pinfold/css 0.1.0 → 0.2.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/README.md +3 -2
- package/dist/accordion.css +76 -178
- package/dist/all.css +118 -370
- package/dist/core.css +12 -116
- package/dist/packs.css +30 -76
- package/dist/reset.css +0 -22
- package/dist/shadcn.css +0 -15
- package/dist/tokens.css +12 -94
- package/package.json +1 -1
package/dist/all.css
CHANGED
|
@@ -1,15 +1,11 @@
|
|
|
1
|
-
/* Pinfold — scoped reset. Applies only inside `.pinfold`, never to the host app.
|
|
2
|
-
A library that resets the page is a library that fights its host. */
|
|
3
1
|
|
|
4
2
|
@layer pinfold.reset {
|
|
5
|
-
|
|
6
3
|
.pinfold,
|
|
7
4
|
.pinfold *,
|
|
8
5
|
.pinfold *::before,
|
|
9
6
|
.pinfold *::after {
|
|
10
7
|
box-sizing: border-box;
|
|
11
8
|
}
|
|
12
|
-
|
|
13
9
|
.pinfold {
|
|
14
10
|
font-family: var(--pinfold-font-sans);
|
|
15
11
|
font-size: var(--pinfold-text-md);
|
|
@@ -18,55 +14,42 @@
|
|
|
18
14
|
-webkit-font-smoothing: antialiased;
|
|
19
15
|
-moz-osx-font-smoothing: grayscale;
|
|
20
16
|
text-rendering: optimizeLegibility;
|
|
21
|
-
/* Proportional digits jump as numbers change; tabular ones do not. */
|
|
22
17
|
font-variant-numeric: tabular-nums;
|
|
23
18
|
}
|
|
24
|
-
|
|
25
19
|
.pinfold :where(button, input, select, textarea) {
|
|
26
20
|
font: inherit;
|
|
27
21
|
color: inherit;
|
|
28
22
|
letter-spacing: inherit;
|
|
29
23
|
margin: 0;
|
|
30
24
|
}
|
|
31
|
-
|
|
32
25
|
.pinfold :where(button) {
|
|
33
26
|
background: none;
|
|
34
27
|
border: 0;
|
|
35
28
|
cursor: pointer;
|
|
36
|
-
/* Kills the 300ms tap delay and the grey flash on touch devices. */
|
|
37
29
|
touch-action: manipulation;
|
|
38
30
|
-webkit-tap-highlight-color: transparent;
|
|
39
31
|
}
|
|
40
|
-
|
|
41
32
|
.pinfold :where(h1, h2, h3, h4, h5, h6, p, figure, dl, dd) {
|
|
42
33
|
margin: 0;
|
|
43
34
|
font-size: inherit;
|
|
44
35
|
font-weight: inherit;
|
|
45
36
|
}
|
|
46
|
-
|
|
47
37
|
.pinfold :where(img, svg, video, canvas) {
|
|
48
38
|
display: block;
|
|
49
39
|
max-width: 100%;
|
|
50
40
|
}
|
|
51
|
-
|
|
52
41
|
.pinfold :where(svg) {
|
|
53
42
|
flex: none;
|
|
54
43
|
}
|
|
55
|
-
|
|
56
44
|
.pinfold ::selection {
|
|
57
45
|
background: var(--pinfold-color-selection);
|
|
58
46
|
}
|
|
59
|
-
|
|
60
|
-
/* Two-tone focus ring, visible on any surface. `outline` stays as the
|
|
61
|
-
forced-colors fallback since box-shadow is dropped in that mode. */
|
|
62
47
|
.pinfold :where(:focus-visible) {
|
|
63
48
|
outline: var(--pinfold-focus-width) solid transparent;
|
|
64
49
|
outline-offset: var(--pinfold-focus-offset);
|
|
65
50
|
box-shadow: var(--pinfold-focus-ring);
|
|
66
51
|
border-radius: var(--pinfold-radius-xs);
|
|
67
52
|
}
|
|
68
|
-
|
|
69
|
-
/* Scrollbars inside Pinfold surfaces follow the palette instead of the OS. */
|
|
70
53
|
.pinfold :where(*) {
|
|
71
54
|
scrollbar-width: thin;
|
|
72
55
|
scrollbar-color: var(--pinfold-color-border-strong) transparent;
|
|
@@ -84,7 +67,6 @@
|
|
|
84
67
|
.pinfold :where(*)::-webkit-scrollbar-track {
|
|
85
68
|
background: transparent;
|
|
86
69
|
}
|
|
87
|
-
|
|
88
70
|
@media (prefers-reduced-motion: reduce) {
|
|
89
71
|
.pinfold,
|
|
90
72
|
.pinfold * {
|
|
@@ -94,9 +76,6 @@
|
|
|
94
76
|
scroll-behavior: auto !important;
|
|
95
77
|
}
|
|
96
78
|
}
|
|
97
|
-
|
|
98
|
-
/* Forced colors (Windows High Contrast): the OS owns colour, so drop our
|
|
99
|
-
decoration and let system colours through. */
|
|
100
79
|
@media (forced-colors: active) {
|
|
101
80
|
.pinfold :where(:focus-visible) {
|
|
102
81
|
outline-color: Highlight;
|
|
@@ -106,28 +85,12 @@
|
|
|
106
85
|
forced-color-adjust: none;
|
|
107
86
|
}
|
|
108
87
|
}
|
|
109
|
-
|
|
110
88
|
}
|
|
111
89
|
|
|
112
|
-
/* Pinfold — design tokens.
|
|
113
|
-
Single source of truth. Components style themselves only through these vars,
|
|
114
|
-
so a palette swap, a dark-mode flip and a consumer override all work through
|
|
115
|
-
the same mechanism instead of three competing ones.
|
|
116
|
-
|
|
117
|
-
Colour is authored in OKLCH for perceptual evenness. `npx pinfold theme`
|
|
118
|
-
regenerates the ramps and also writes sRGB hex fallbacks for browsers
|
|
119
|
-
without OKLCH support. */
|
|
120
90
|
|
|
121
|
-
/* Everything ships inside the `pinfold` cascade layer. Unlayered CSS — including
|
|
122
|
-
every Tailwind utility — beats a layered rule regardless of source order or
|
|
123
|
-
specificity, so `className="px-6"` just works with no `!important` and no
|
|
124
|
-
plugin. */
|
|
125
91
|
@layer pinfold.tokens {
|
|
126
|
-
|
|
127
92
|
:root {
|
|
128
93
|
color-scheme: light dark;
|
|
129
|
-
|
|
130
|
-
/* ---------------------------------------------------------------- ramps */
|
|
131
94
|
--pinfold-primary-50: oklch(0.977 0.014 274);
|
|
132
95
|
--pinfold-primary-100: oklch(0.946 0.033 274);
|
|
133
96
|
--pinfold-primary-200: oklch(0.902 0.063 274);
|
|
@@ -139,14 +102,11 @@
|
|
|
139
102
|
--pinfold-primary-800: oklch(0.432 0.181 274);
|
|
140
103
|
--pinfold-primary-900: oklch(0.380 0.146 274);
|
|
141
104
|
--pinfold-primary-950: oklch(0.283 0.101 274);
|
|
142
|
-
|
|
143
|
-
/* `accent` defaults to the brand ramp; the CLI can give it its own hue. */
|
|
144
105
|
--pinfold-accent-300: var(--pinfold-primary-300);
|
|
145
106
|
--pinfold-accent-400: var(--pinfold-primary-400);
|
|
146
107
|
--pinfold-accent-500: var(--pinfold-primary-500);
|
|
147
108
|
--pinfold-accent-600: var(--pinfold-primary-600);
|
|
148
109
|
--pinfold-accent-700: var(--pinfold-primary-700);
|
|
149
|
-
|
|
150
110
|
--pinfold-neutral-50: oklch(0.985 0.002 274);
|
|
151
111
|
--pinfold-neutral-100: oklch(0.967 0.003 274);
|
|
152
112
|
--pinfold-neutral-200: oklch(0.928 0.006 274);
|
|
@@ -158,66 +118,48 @@
|
|
|
158
118
|
--pinfold-neutral-800: oklch(0.279 0.023 274);
|
|
159
119
|
--pinfold-neutral-900: oklch(0.210 0.021 274);
|
|
160
120
|
--pinfold-neutral-950: oklch(0.145 0.017 274);
|
|
161
|
-
|
|
162
121
|
--pinfold-success-100: oklch(0.946 0.033 158);
|
|
163
122
|
--pinfold-success-300: oklch(0.828 0.111 158);
|
|
164
123
|
--pinfold-success-500: oklch(0.606 0.201 158);
|
|
165
124
|
--pinfold-success-700: oklch(0.491 0.216 158);
|
|
166
125
|
--pinfold-success-900: oklch(0.380 0.146 158);
|
|
167
|
-
|
|
168
126
|
--pinfold-warning-100: oklch(0.946 0.033 78);
|
|
169
127
|
--pinfold-warning-300: oklch(0.828 0.111 78);
|
|
170
128
|
--pinfold-warning-500: oklch(0.606 0.201 78);
|
|
171
129
|
--pinfold-warning-700: oklch(0.491 0.216 78);
|
|
172
130
|
--pinfold-warning-900: oklch(0.380 0.146 78);
|
|
173
|
-
|
|
174
131
|
--pinfold-danger-100: oklch(0.946 0.033 27);
|
|
175
132
|
--pinfold-danger-300: oklch(0.828 0.111 27);
|
|
176
133
|
--pinfold-danger-500: oklch(0.606 0.201 27);
|
|
177
134
|
--pinfold-danger-700: oklch(0.491 0.216 27);
|
|
178
135
|
--pinfold-danger-900: oklch(0.380 0.146 27);
|
|
179
|
-
|
|
180
136
|
--pinfold-info-100: oklch(0.946 0.033 245);
|
|
181
137
|
--pinfold-info-300: oklch(0.828 0.111 245);
|
|
182
138
|
--pinfold-info-500: oklch(0.606 0.201 245);
|
|
183
139
|
--pinfold-info-700: oklch(0.491 0.216 245);
|
|
184
140
|
--pinfold-info-900: oklch(0.380 0.146 245);
|
|
185
|
-
|
|
186
|
-
/* ------------------------------------------------------------ semantics */
|
|
187
141
|
--pinfold-color-bg: var(--pinfold-neutral-50);
|
|
188
142
|
--pinfold-color-bg-subtle: var(--pinfold-neutral-100);
|
|
189
143
|
--pinfold-color-surface: oklch(1 0 0);
|
|
190
144
|
--pinfold-color-surface-raised: oklch(1 0 0);
|
|
191
145
|
--pinfold-color-surface-sunken: var(--pinfold-neutral-100);
|
|
192
|
-
|
|
193
|
-
/* Interaction surfaces carry a trace of the brand, so hover reads as
|
|
194
|
-
"this control is alive" rather than "this control turned grey". */
|
|
195
146
|
--pinfold-color-surface-hover: color-mix(in oklch, var(--pinfold-color-accent) 6%, var(--pinfold-color-surface));
|
|
196
147
|
--pinfold-color-surface-active: color-mix(in oklch, var(--pinfold-color-accent) 11%, var(--pinfold-color-surface));
|
|
197
148
|
--pinfold-color-surface-selected: color-mix(in oklch, var(--pinfold-color-accent) 14%, var(--pinfold-color-surface));
|
|
198
|
-
|
|
199
149
|
--pinfold-color-border: var(--pinfold-neutral-200);
|
|
200
150
|
--pinfold-color-border-strong: var(--pinfold-neutral-300);
|
|
201
151
|
--pinfold-color-border-accent: color-mix(in oklch, var(--pinfold-color-accent) 45%, var(--pinfold-color-border));
|
|
202
|
-
|
|
203
152
|
--pinfold-color-text: var(--pinfold-neutral-900);
|
|
204
153
|
--pinfold-color-text-muted: var(--pinfold-neutral-600);
|
|
205
154
|
--pinfold-color-text-subtle: var(--pinfold-neutral-500);
|
|
206
155
|
--pinfold-color-text-disabled: var(--pinfold-neutral-400);
|
|
207
|
-
|
|
208
|
-
--pinfold-color-accent: var(--pinfold-
|
|
209
|
-
--pinfold-color-accent-hover: var(--pinfold-accent-700);
|
|
156
|
+
--pinfold-color-accent: var(--pinfold-primary-600);
|
|
157
|
+
--pinfold-color-accent-hover: var(--pinfold-primary-700);
|
|
210
158
|
--pinfold-color-accent-subtle: color-mix(in oklch, var(--pinfold-color-accent) 10%, transparent);
|
|
211
159
|
--pinfold-color-accent-contrast: oklch(1 0 0);
|
|
212
|
-
|
|
213
|
-
--pinfold-color-ring: var(--pinfold-accent-500);
|
|
160
|
+
--pinfold-color-ring: var(--pinfold-primary-500);
|
|
214
161
|
--pinfold-color-overlay: color-mix(in oklch, var(--pinfold-neutral-950) 45%, transparent);
|
|
215
162
|
--pinfold-color-selection: color-mix(in oklch, var(--pinfold-color-accent) 22%, transparent);
|
|
216
|
-
|
|
217
|
-
/* --------------------------------------------------------------- depth */
|
|
218
|
-
/* Shadows are tinted with the neutral ramp, never neutral black — untinted
|
|
219
|
-
black over a tinted surface reads as dirt. Two layers: a tight contact
|
|
220
|
-
shadow plus a wide ambient one. */
|
|
221
163
|
--pinfold-shadow-color: var(--pinfold-neutral-900);
|
|
222
164
|
--pinfold-shadow-xs: 0 1px 1px color-mix(in oklch, var(--pinfold-shadow-color) 5%, transparent);
|
|
223
165
|
--pinfold-shadow-sm:
|
|
@@ -232,30 +174,17 @@
|
|
|
232
174
|
--pinfold-shadow-xl:
|
|
233
175
|
0 8px 16px -4px color-mix(in oklch, var(--pinfold-shadow-color) 10%, transparent),
|
|
234
176
|
0 32px 72px -20px color-mix(in oklch, var(--pinfold-shadow-color) 18%, transparent);
|
|
235
|
-
|
|
236
|
-
/* Hairline highlight along the top edge of a raised surface. The detail that
|
|
237
|
-
separates "a box" from "a surface". */
|
|
238
177
|
--pinfold-highlight: inset 0 1px 0 color-mix(in oklch, oklch(1 0 0) 60%, transparent);
|
|
239
|
-
|
|
240
|
-
/* Hooks for style packs (packs.css). Defaults are neutral: no blur, no texture. */
|
|
241
178
|
--pinfold-border-width: 1px;
|
|
242
179
|
--pinfold-backdrop: none;
|
|
243
180
|
--pinfold-texture: none;
|
|
244
|
-
|
|
245
|
-
/* ---------------------------------------------------------------- focus */
|
|
246
181
|
--pinfold-focus-width: 2px;
|
|
247
182
|
--pinfold-focus-offset: 2px;
|
|
248
|
-
/* Two-tone ring: a gap in the page colour, then the ring. Stays visible on
|
|
249
|
-
any surface, including one that matches the ring hue. */
|
|
250
183
|
--pinfold-focus-ring:
|
|
251
184
|
0 0 0 var(--pinfold-focus-offset) var(--pinfold-color-bg),
|
|
252
185
|
0 0 0 calc(var(--pinfold-focus-offset) + var(--pinfold-focus-width)) var(--pinfold-color-ring);
|
|
253
|
-
|
|
254
|
-
/* ---------------------------------------------------------------- shape */
|
|
255
186
|
--pinfold-radius-scale: 1;
|
|
256
187
|
--pinfold-radius-full: 9999px;
|
|
257
|
-
|
|
258
|
-
/* -------------------------------------------------------------- spacing */
|
|
259
188
|
--pinfold-space-1: 0.25rem;
|
|
260
189
|
--pinfold-space-2: 0.5rem;
|
|
261
190
|
--pinfold-space-3: 0.75rem;
|
|
@@ -264,12 +193,9 @@
|
|
|
264
193
|
--pinfold-space-6: 1.5rem;
|
|
265
194
|
--pinfold-space-8: 2rem;
|
|
266
195
|
--pinfold-space-10: 2.5rem;
|
|
267
|
-
|
|
268
|
-
/* ----------------------------------------------------------- typography */
|
|
269
196
|
--pinfold-font-sans: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto,
|
|
270
197
|
"Helvetica Neue", Arial, sans-serif;
|
|
271
198
|
--pinfold-font-mono: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
|
|
272
|
-
/* Fluid type: grows gently with the viewport, never below the floor or past the cap. */
|
|
273
199
|
--pinfold-text-xs: 0.75rem;
|
|
274
200
|
--pinfold-text-sm: clamp(0.8125rem, 0.79rem + 0.1vw, 0.875rem);
|
|
275
201
|
--pinfold-text-md: clamp(0.9375rem, 0.91rem + 0.12vw, 1rem);
|
|
@@ -280,23 +206,16 @@
|
|
|
280
206
|
--pinfold-weight-normal: 400;
|
|
281
207
|
--pinfold-weight-medium: 500;
|
|
282
208
|
--pinfold-weight-semibold: 600;
|
|
283
|
-
/* Larger text needs tighter tracking to look optically even. */
|
|
284
209
|
--pinfold-tracking-tight: -0.011em;
|
|
285
210
|
--pinfold-tracking-normal: 0em;
|
|
286
211
|
--pinfold-tracking-wide: 0.02em;
|
|
287
|
-
|
|
288
|
-
/* --------------------------------------------------------------- motion */
|
|
289
212
|
--pinfold-duration-fast: 120ms;
|
|
290
213
|
--pinfold-duration-md: 200ms;
|
|
291
214
|
--pinfold-duration-slow: 320ms;
|
|
292
|
-
/* Decelerating curve — fast start, soft landing. Reads as responsive. */
|
|
293
215
|
--pinfold-ease: cubic-bezier(0.32, 0.72, 0, 1);
|
|
294
216
|
--pinfold-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
|
|
295
217
|
--pinfold-ease-in-out: cubic-bezier(0.65, 0, 0.35, 1);
|
|
296
|
-
/* One gentle overshoot, for things that appear rather than move. */
|
|
297
218
|
--pinfold-ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
|
|
298
|
-
|
|
299
|
-
/* ---------------------------------------------------------------- layer */
|
|
300
219
|
--pinfold-z-dropdown: 1000;
|
|
301
220
|
--pinfold-z-sticky: 1100;
|
|
302
221
|
--pinfold-z-overlay: 1200;
|
|
@@ -304,9 +223,6 @@
|
|
|
304
223
|
--pinfold-z-toast: 1400;
|
|
305
224
|
--pinfold-z-tooltip: 1500;
|
|
306
225
|
}
|
|
307
|
-
|
|
308
|
-
/* Dark palette. Only the semantic layer flips — the ramps stay identical, so a
|
|
309
|
-
consumer who overrode `--pinfold-primary-500` keeps their brand in both themes. */
|
|
310
226
|
@media (prefers-color-scheme: dark) {
|
|
311
227
|
:root:not([data-pinfold-theme="light"]) {
|
|
312
228
|
--pinfold-color-bg: var(--pinfold-neutral-950);
|
|
@@ -320,12 +236,10 @@
|
|
|
320
236
|
--pinfold-color-text-muted: var(--pinfold-neutral-400);
|
|
321
237
|
--pinfold-color-text-subtle: var(--pinfold-neutral-500);
|
|
322
238
|
--pinfold-color-text-disabled: var(--pinfold-neutral-600);
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
--pinfold-color-accent: var(--pinfold-accent-400);
|
|
326
|
-
--pinfold-color-accent-hover: var(--pinfold-accent-300);
|
|
239
|
+
--pinfold-color-accent: var(--pinfold-primary-400);
|
|
240
|
+
--pinfold-color-accent-hover: var(--pinfold-primary-300);
|
|
327
241
|
--pinfold-color-accent-contrast: var(--pinfold-neutral-950);
|
|
328
|
-
--pinfold-color-ring: var(--pinfold-
|
|
242
|
+
--pinfold-color-ring: var(--pinfold-primary-400);
|
|
329
243
|
--pinfold-shadow-color: oklch(0 0 0);
|
|
330
244
|
--pinfold-shadow-xs: 0 1px 1px color-mix(in oklch, var(--pinfold-shadow-color) 30%, transparent);
|
|
331
245
|
--pinfold-shadow-sm:
|
|
@@ -343,7 +257,6 @@
|
|
|
343
257
|
--pinfold-highlight: inset 0 1px 0 color-mix(in oklch, oklch(1 0 0) 8%, transparent);
|
|
344
258
|
}
|
|
345
259
|
}
|
|
346
|
-
|
|
347
260
|
[data-pinfold-theme="dark"] {
|
|
348
261
|
color-scheme: dark;
|
|
349
262
|
--pinfold-color-bg: var(--pinfold-neutral-950);
|
|
@@ -357,10 +270,10 @@
|
|
|
357
270
|
--pinfold-color-text-muted: var(--pinfold-neutral-400);
|
|
358
271
|
--pinfold-color-text-subtle: var(--pinfold-neutral-500);
|
|
359
272
|
--pinfold-color-text-disabled: var(--pinfold-neutral-600);
|
|
360
|
-
--pinfold-color-accent: var(--pinfold-
|
|
361
|
-
--pinfold-color-accent-hover: var(--pinfold-
|
|
273
|
+
--pinfold-color-accent: var(--pinfold-primary-400);
|
|
274
|
+
--pinfold-color-accent-hover: var(--pinfold-primary-300);
|
|
362
275
|
--pinfold-color-accent-contrast: var(--pinfold-neutral-950);
|
|
363
|
-
--pinfold-color-ring: var(--pinfold-
|
|
276
|
+
--pinfold-color-ring: var(--pinfold-primary-400);
|
|
364
277
|
--pinfold-shadow-color: oklch(0 0 0);
|
|
365
278
|
--pinfold-shadow-xs: 0 1px 1px color-mix(in oklch, var(--pinfold-shadow-color) 30%, transparent);
|
|
366
279
|
--pinfold-shadow-sm:
|
|
@@ -376,7 +289,6 @@
|
|
|
376
289
|
0 8px 16px -4px color-mix(in oklch, var(--pinfold-shadow-color) 55%, transparent),
|
|
377
290
|
0 32px 72px -20px color-mix(in oklch, var(--pinfold-shadow-color) 60%, transparent);
|
|
378
291
|
--pinfold-highlight: inset 0 1px 0 color-mix(in oklch, oklch(1 0 0) 8%, transparent);
|
|
379
|
-
/* Derived tokens, recomputed here so nested sections get their own. */
|
|
380
292
|
--pinfold-color-surface-hover: color-mix(in oklch, var(--pinfold-color-accent) 6%, var(--pinfold-color-surface));
|
|
381
293
|
--pinfold-color-surface-active: color-mix(in oklch, var(--pinfold-color-accent) 11%, var(--pinfold-color-surface));
|
|
382
294
|
--pinfold-color-surface-selected: color-mix(in oklch, var(--pinfold-color-accent) 14%, var(--pinfold-color-surface));
|
|
@@ -387,10 +299,6 @@
|
|
|
387
299
|
--pinfold-focus-ring: 0 0 0 var(--pinfold-focus-offset) var(--pinfold-color-bg),
|
|
388
300
|
0 0 0 calc(var(--pinfold-focus-offset) + var(--pinfold-focus-width)) var(--pinfold-color-ring);
|
|
389
301
|
}
|
|
390
|
-
|
|
391
|
-
/* An explicit light section, e.g. inside a dark page. Mirrors every property the dark
|
|
392
|
-
palette flips, with the :root values; ramps are never redeclared, so a custom
|
|
393
|
-
palette still reaches it. */
|
|
394
302
|
[data-pinfold-theme="light"] {
|
|
395
303
|
color-scheme: light;
|
|
396
304
|
--pinfold-color-bg: var(--pinfold-neutral-50);
|
|
@@ -404,10 +312,10 @@
|
|
|
404
312
|
--pinfold-color-text-muted: var(--pinfold-neutral-600);
|
|
405
313
|
--pinfold-color-text-subtle: var(--pinfold-neutral-500);
|
|
406
314
|
--pinfold-color-text-disabled: var(--pinfold-neutral-400);
|
|
407
|
-
--pinfold-color-accent: var(--pinfold-
|
|
408
|
-
--pinfold-color-accent-hover: var(--pinfold-
|
|
315
|
+
--pinfold-color-accent: var(--pinfold-primary-600);
|
|
316
|
+
--pinfold-color-accent-hover: var(--pinfold-primary-700);
|
|
409
317
|
--pinfold-color-accent-contrast: oklch(1 0 0);
|
|
410
|
-
--pinfold-color-ring: var(--pinfold-
|
|
318
|
+
--pinfold-color-ring: var(--pinfold-primary-500);
|
|
411
319
|
--pinfold-shadow-color: var(--pinfold-neutral-900);
|
|
412
320
|
--pinfold-shadow-xs: 0 1px 1px color-mix(in oklch, var(--pinfold-shadow-color) 5%, transparent);
|
|
413
321
|
--pinfold-shadow-sm: 0 1px 2px color-mix(in oklch, var(--pinfold-shadow-color) 6%, transparent),
|
|
@@ -419,7 +327,6 @@
|
|
|
419
327
|
--pinfold-shadow-xl: 0 8px 16px -4px color-mix(in oklch, var(--pinfold-shadow-color) 10%, transparent),
|
|
420
328
|
0 32px 72px -20px color-mix(in oklch, var(--pinfold-shadow-color) 18%, transparent);
|
|
421
329
|
--pinfold-highlight: inset 0 1px 0 color-mix(in oklch, oklch(1 0 0) 60%, transparent);
|
|
422
|
-
/* Derived tokens, recomputed here so nested sections get their own. */
|
|
423
330
|
--pinfold-color-surface-hover: color-mix(in oklch, var(--pinfold-color-accent) 6%, var(--pinfold-color-surface));
|
|
424
331
|
--pinfold-color-surface-active: color-mix(in oklch, var(--pinfold-color-accent) 11%, var(--pinfold-color-surface));
|
|
425
332
|
--pinfold-color-surface-selected: color-mix(in oklch, var(--pinfold-color-accent) 14%, var(--pinfold-color-surface));
|
|
@@ -430,10 +337,6 @@
|
|
|
430
337
|
--pinfold-focus-ring: 0 0 0 var(--pinfold-focus-offset) var(--pinfold-color-bg),
|
|
431
338
|
0 0 0 calc(var(--pinfold-focus-offset) + var(--pinfold-focus-width)) var(--pinfold-color-ring);
|
|
432
339
|
}
|
|
433
|
-
|
|
434
|
-
/* The radius scale is a multiplier, so the radii are recomputed wherever it can change:
|
|
435
|
-
on :root, on a radius preset and on a style pack. (A custom property inherits its
|
|
436
|
-
computed value; redeclaring only the scale further down would change nothing.) */
|
|
437
340
|
:root,
|
|
438
341
|
[data-pinfold-radius],
|
|
439
342
|
[data-pinfold-style] {
|
|
@@ -444,20 +347,14 @@
|
|
|
444
347
|
--pinfold-radius-xl: calc(1rem * var(--pinfold-radius-scale));
|
|
445
348
|
--pinfold-radius-2xl: calc(1.5rem * var(--pinfold-radius-scale));
|
|
446
349
|
}
|
|
447
|
-
|
|
448
|
-
/* Radius presets, set by the CLI or by <PinfoldProvider radius>. */
|
|
449
350
|
[data-pinfold-radius="none"] { --pinfold-radius-scale: 0; }
|
|
450
351
|
[data-pinfold-radius="sm"] { --pinfold-radius-scale: 0.6; }
|
|
451
352
|
[data-pinfold-radius="md"] { --pinfold-radius-scale: 1; }
|
|
452
353
|
[data-pinfold-radius="lg"] { --pinfold-radius-scale: 1.5; }
|
|
453
354
|
[data-pinfold-radius="full"] { --pinfold-radius-scale: 2.4; }
|
|
454
|
-
|
|
455
|
-
/* Density presets scale spacing without touching type size. */
|
|
456
355
|
[data-pinfold-density="compact"] { --pinfold-density: 0.8; }
|
|
457
356
|
[data-pinfold-density="comfortable"] { --pinfold-density: 1; }
|
|
458
357
|
[data-pinfold-density="spacious"] { --pinfold-density: 1.25; }
|
|
459
|
-
|
|
460
|
-
/* Browsers without color-mix get flat approximations rather than nothing. */
|
|
461
358
|
@supports not (color: color-mix(in oklch, red, blue)) {
|
|
462
359
|
:root {
|
|
463
360
|
--pinfold-color-surface-hover: var(--pinfold-neutral-100);
|
|
@@ -473,31 +370,17 @@
|
|
|
473
370
|
--pinfold-highlight: none;
|
|
474
371
|
}
|
|
475
372
|
}
|
|
476
|
-
|
|
477
373
|
}
|
|
478
374
|
|
|
479
|
-
/* Pinfold — accordion.
|
|
480
|
-
|
|
481
|
-
Two-layer variables: the `size` preset writes the `*-base` vars, and the
|
|
482
|
-
`dimensions` config writes `--pinfold-accordion-*` which wins through the
|
|
483
|
-
var() fallback. Overriding one measurement keeps the preset for the rest.
|
|
484
|
-
|
|
485
|
-
Nothing clips. Rounded rows give their trigger the matching radius instead
|
|
486
|
-
of relying on `overflow: hidden`, because a clipping ancestor would also cut
|
|
487
|
-
off the focus ring. Collapse is pure CSS (`grid-template-rows`) — no height
|
|
488
|
-
measurement, no ResizeObserver, no layout thrash. */
|
|
489
375
|
|
|
490
376
|
@layer pinfold.components {
|
|
491
|
-
|
|
492
377
|
.pinfold-accordion {
|
|
493
|
-
/* preset layer (set by [data-size]) */
|
|
494
378
|
--pinfold-acc-pad-x-base: var(--pinfold-space-4);
|
|
495
|
-
--pinfold-acc-pad-y-base: var(--pinfold-space-
|
|
379
|
+
--pinfold-acc-pad-y-base: var(--pinfold-space-4);
|
|
496
380
|
--pinfold-acc-font-base: var(--pinfold-text-md);
|
|
497
|
-
--pinfold-acc-radius-
|
|
381
|
+
--pinfold-acc-radius-unit: 0.75rem;
|
|
382
|
+
--pinfold-acc-radius-base: calc(var(--pinfold-acc-radius-unit) * var(--pinfold-radius-scale, 1));
|
|
498
383
|
--pinfold-acc-gap-base: 0px;
|
|
499
|
-
|
|
500
|
-
/* config layer (set by `dimensions`) */
|
|
501
384
|
--pinfold-acc-pad-x: var(--pinfold-accordion-padding-x, var(--pinfold-acc-pad-x-base));
|
|
502
385
|
--pinfold-acc-pad-y: var(--pinfold-accordion-padding-y, var(--pinfold-acc-pad-y-base));
|
|
503
386
|
--pinfold-acc-panel-pad-x: var(--pinfold-accordion-panel-padding-x, var(--pinfold-acc-pad-x));
|
|
@@ -511,53 +394,43 @@
|
|
|
511
394
|
--pinfold-acc-gap: var(--pinfold-accordion-gap, var(--pinfold-acc-gap-base));
|
|
512
395
|
--pinfold-acc-border: var(--pinfold-accordion-border-width, var(--pinfold-border-width));
|
|
513
396
|
--pinfold-acc-duration: var(--pinfold-accordion-duration, var(--pinfold-duration-md));
|
|
514
|
-
|
|
515
397
|
--pinfold-acc-accent: var(--pinfold-color-accent);
|
|
516
|
-
--pinfold-acc-item-radius: 0px;
|
|
517
|
-
|
|
398
|
+
--pinfold-acc-item-radius: var(--pinfold-accordion-item-radius, 0px);
|
|
518
399
|
display: flex;
|
|
519
400
|
flex-direction: column;
|
|
520
401
|
gap: var(--pinfold-acc-gap);
|
|
521
|
-
/* Responds to its own width, not the viewport (see "responsive" below). */
|
|
522
402
|
container: pinfold-accordion / inline-size;
|
|
523
403
|
width: var(--pinfold-accordion-width, 100%);
|
|
524
404
|
min-width: var(--pinfold-accordion-min-width, 0);
|
|
525
405
|
max-width: var(--pinfold-accordion-max-width, none);
|
|
526
406
|
height: var(--pinfold-accordion-height, auto);
|
|
527
407
|
max-height: var(--pinfold-accordion-max-height, none);
|
|
408
|
+
border-radius: var(--pinfold-acc-radius);
|
|
528
409
|
font-size: var(--pinfold-acc-font);
|
|
529
410
|
letter-spacing: var(--pinfold-tracking-tight);
|
|
530
411
|
color: var(--pinfold-color-text);
|
|
531
412
|
}
|
|
532
|
-
|
|
533
|
-
/* `dimensions.maxHeight` caps the root and scrolls the rows. */
|
|
534
413
|
.pinfold-accordion[data-clamp] {
|
|
535
414
|
overflow-y: auto;
|
|
536
415
|
overscroll-behavior: contain;
|
|
537
416
|
}
|
|
538
|
-
|
|
539
|
-
/* ------------------------------------------------------------------ sizes */
|
|
540
417
|
.pinfold-accordion[data-size='sm'] {
|
|
541
418
|
--pinfold-acc-pad-x-base: var(--pinfold-space-3);
|
|
542
|
-
--pinfold-acc-pad-y-base: var(--pinfold-space-
|
|
419
|
+
--pinfold-acc-pad-y-base: var(--pinfold-space-3);
|
|
543
420
|
--pinfold-acc-font-base: var(--pinfold-text-sm);
|
|
544
|
-
--pinfold-acc-radius-
|
|
421
|
+
--pinfold-acc-radius-unit: 0.5rem;
|
|
545
422
|
}
|
|
546
423
|
.pinfold-accordion[data-size='lg'] {
|
|
547
424
|
--pinfold-acc-pad-x-base: var(--pinfold-space-5);
|
|
548
|
-
--pinfold-acc-pad-y-base: var(--pinfold-space-
|
|
425
|
+
--pinfold-acc-pad-y-base: var(--pinfold-space-5);
|
|
549
426
|
--pinfold-acc-font-base: var(--pinfold-text-lg);
|
|
550
|
-
--pinfold-acc-radius-
|
|
427
|
+
--pinfold-acc-radius-unit: 1rem;
|
|
551
428
|
}
|
|
552
|
-
|
|
553
|
-
/* ------------------------------------------------------------------ tones */
|
|
554
429
|
.pinfold-accordion[data-tone='neutral'] { --pinfold-acc-accent: var(--pinfold-color-text); }
|
|
555
430
|
.pinfold-accordion[data-tone='success'] { --pinfold-acc-accent: var(--pinfold-success-500); }
|
|
556
431
|
.pinfold-accordion[data-tone='warning'] { --pinfold-acc-accent: var(--pinfold-warning-500); }
|
|
557
432
|
.pinfold-accordion[data-tone='danger'] { --pinfold-acc-accent: var(--pinfold-danger-500); }
|
|
558
433
|
.pinfold-accordion[data-tone='info'] { --pinfold-acc-accent: var(--pinfold-info-500); }
|
|
559
|
-
|
|
560
|
-
/* ------------------------------------------------------------------- item */
|
|
561
434
|
.pinfold-accordion__item {
|
|
562
435
|
position: relative;
|
|
563
436
|
border-radius: var(--pinfold-acc-item-radius);
|
|
@@ -566,125 +439,89 @@
|
|
|
566
439
|
.pinfold-accordion__trigger {
|
|
567
440
|
border-radius: inherit;
|
|
568
441
|
}
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
opening rather than a bar appearing. */
|
|
572
|
-
.pinfold-accordion__item::before {
|
|
442
|
+
.pinfold-accordion[data-dividers]:is([data-variant='solid'], [data-variant='outline'], [data-variant='ghost'], [data-joined])
|
|
443
|
+
.pinfold-accordion__item + .pinfold-accordion__item::before {
|
|
573
444
|
content: '';
|
|
574
445
|
position: absolute;
|
|
575
|
-
inset-block:
|
|
576
|
-
inset-inline
|
|
577
|
-
|
|
578
|
-
background: var(--pinfold-acc-accent);
|
|
579
|
-
border-start-start-radius: inherit;
|
|
580
|
-
border-end-start-radius: inherit;
|
|
581
|
-
transform: scaleY(0);
|
|
582
|
-
opacity: 0;
|
|
583
|
-
transition: transform var(--pinfold-acc-duration) var(--pinfold-ease-out),
|
|
584
|
-
opacity var(--pinfold-duration-fast) linear;
|
|
446
|
+
inset-block-start: calc(var(--pinfold-acc-gap) / -2);
|
|
447
|
+
inset-inline: var(--pinfold-acc-divider-inset, 0);
|
|
448
|
+
border-top: var(--pinfold-acc-border) solid var(--pinfold-accordion-divider-color, var(--pinfold-color-border));
|
|
585
449
|
pointer-events: none;
|
|
586
450
|
}
|
|
587
|
-
.pinfold-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
}
|
|
591
|
-
/* Bordered rows already signal state through the border; the bar would double up. */
|
|
592
|
-
.pinfold-accordion[data-variant='outline'] .pinfold-accordion__item::before,
|
|
593
|
-
.pinfold-accordion[data-variant='separated'] .pinfold-accordion__item::before {
|
|
594
|
-
content: none;
|
|
451
|
+
.pinfold-accordion:is([data-variant='solid'], [data-variant='outline']) {
|
|
452
|
+
--pinfold-acc-divider-inset: var(--pinfold-acc-pad-x);
|
|
453
|
+
border: var(--pinfold-acc-border) solid var(--pinfold-color-border);
|
|
595
454
|
}
|
|
596
|
-
|
|
597
|
-
/* --------------------------------------------------------------- variants */
|
|
598
|
-
/* solid — one card, hairline-divided rows. Corners are rounded on the parts
|
|
599
|
-
that touch them rather than clipped off the container. */
|
|
600
455
|
.pinfold-accordion[data-variant='solid'] {
|
|
601
456
|
background: var(--pinfold-color-surface);
|
|
602
457
|
background-image: var(--pinfold-texture);
|
|
603
458
|
-webkit-backdrop-filter: var(--pinfold-backdrop);
|
|
604
459
|
backdrop-filter: var(--pinfold-backdrop);
|
|
605
|
-
|
|
606
|
-
border-radius: var(--pinfold-acc-radius);
|
|
607
|
-
box-shadow: var(--pinfold-shadow-sm), var(--pinfold-highlight);
|
|
608
|
-
}
|
|
609
|
-
.pinfold-accordion[data-variant='solid'][data-dividers] .pinfold-accordion__item + .pinfold-accordion__item {
|
|
610
|
-
border-top: var(--pinfold-acc-border) solid var(--pinfold-color-border);
|
|
460
|
+
box-shadow: var(--pinfold-shadow-md), var(--pinfold-highlight);
|
|
611
461
|
}
|
|
612
|
-
.pinfold-accordion[data-variant='solid'] .pinfold-accordion__item:first-child .pinfold-accordion__trigger {
|
|
462
|
+
.pinfold-accordion:is([data-variant='solid'], [data-variant='outline']) .pinfold-accordion__item:first-child .pinfold-accordion__trigger {
|
|
613
463
|
border-start-start-radius: var(--pinfold-acc-radius);
|
|
614
464
|
border-start-end-radius: var(--pinfold-acc-radius);
|
|
615
465
|
}
|
|
616
|
-
.pinfold-accordion[data-variant='solid'] .pinfold-accordion__item:last-child .pinfold-
|
|
466
|
+
.pinfold-accordion:is([data-variant='solid'], [data-variant='outline']) .pinfold-accordion__item:last-child .pinfold-accordion__trigger[data-state='closed'] {
|
|
617
467
|
border-end-start-radius: var(--pinfold-acc-radius);
|
|
618
468
|
border-end-end-radius: var(--pinfold-acc-radius);
|
|
619
469
|
}
|
|
620
|
-
|
|
621
|
-
/* outline — each row is its own bordered box */
|
|
622
|
-
.pinfold-accordion[data-variant='outline'] {
|
|
623
|
-
--pinfold-acc-gap-base: var(--pinfold-space-2);
|
|
624
|
-
}
|
|
625
|
-
.pinfold-accordion[data-variant='outline'] .pinfold-accordion__item {
|
|
626
|
-
--pinfold-acc-item-radius: var(--pinfold-acc-radius);
|
|
627
|
-
border: var(--pinfold-acc-border) solid var(--pinfold-color-border);
|
|
628
|
-
transition: border-color var(--pinfold-duration-md) var(--pinfold-ease);
|
|
629
|
-
}
|
|
630
|
-
.pinfold-accordion[data-variant='outline'] .pinfold-accordion__item[data-state='open'] {
|
|
631
|
-
border-color: var(--pinfold-color-border-accent);
|
|
632
|
-
}
|
|
633
|
-
|
|
634
|
-
/* separated — cards with air and elevation */
|
|
635
470
|
.pinfold-accordion[data-variant='separated'] {
|
|
636
|
-
--pinfold-acc-gap-base: var(--pinfold-space-
|
|
471
|
+
--pinfold-acc-gap-base: var(--pinfold-space-2);
|
|
637
472
|
}
|
|
638
473
|
.pinfold-accordion[data-variant='separated'] .pinfold-accordion__item {
|
|
639
|
-
--pinfold-acc-item-radius: var(--pinfold-acc-radius);
|
|
474
|
+
--pinfold-acc-item-radius: var(--pinfold-accordion-item-radius, var(--pinfold-acc-radius));
|
|
640
475
|
background: var(--pinfold-color-surface);
|
|
641
476
|
background-image: var(--pinfold-texture);
|
|
642
477
|
-webkit-backdrop-filter: var(--pinfold-backdrop);
|
|
643
478
|
backdrop-filter: var(--pinfold-backdrop);
|
|
644
479
|
border: var(--pinfold-acc-border) solid var(--pinfold-color-border);
|
|
645
480
|
box-shadow: var(--pinfold-shadow-sm), var(--pinfold-highlight);
|
|
646
|
-
transition: box-shadow var(--pinfold-duration-md) var(--pinfold-ease),
|
|
647
|
-
border-color var(--pinfold-duration-md) var(--pinfold-ease),
|
|
648
|
-
transform var(--pinfold-duration-md) var(--pinfold-ease-out);
|
|
649
|
-
}
|
|
650
|
-
.pinfold-accordion[data-variant='separated'] .pinfold-accordion__item:hover {
|
|
651
|
-
box-shadow: var(--pinfold-shadow-md), var(--pinfold-highlight);
|
|
652
481
|
}
|
|
653
|
-
.pinfold-accordion[data-variant='separated'] .pinfold-accordion__item[data-state='open'] {
|
|
654
|
-
border-color: var(--pinfold-color-border-accent);
|
|
655
|
-
box-shadow: var(--pinfold-shadow-md), var(--pinfold-highlight);
|
|
656
|
-
}
|
|
657
|
-
|
|
658
|
-
/* filled — tinted rows, no borders */
|
|
659
482
|
.pinfold-accordion[data-variant='filled'] {
|
|
660
483
|
--pinfold-acc-gap-base: var(--pinfold-space-2);
|
|
661
484
|
}
|
|
662
485
|
.pinfold-accordion[data-variant='filled'] .pinfold-accordion__item {
|
|
663
|
-
--pinfold-acc-item-radius: var(--pinfold-acc-radius);
|
|
486
|
+
--pinfold-acc-item-radius: var(--pinfold-accordion-item-radius, var(--pinfold-acc-radius));
|
|
664
487
|
background: var(--pinfold-color-bg-subtle);
|
|
665
488
|
background-image: var(--pinfold-texture);
|
|
666
489
|
-webkit-backdrop-filter: var(--pinfold-backdrop);
|
|
667
490
|
backdrop-filter: var(--pinfold-backdrop);
|
|
668
|
-
transition: background-color var(--pinfold-duration-md) var(--pinfold-ease);
|
|
669
491
|
}
|
|
670
|
-
.pinfold-accordion[data-
|
|
671
|
-
|
|
492
|
+
.pinfold-accordion[data-joined] {
|
|
493
|
+
--pinfold-acc-divider-inset: var(--pinfold-acc-pad-x);
|
|
672
494
|
}
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
495
|
+
.pinfold-accordion[data-joined] .pinfold-accordion__item {
|
|
496
|
+
--pinfold-acc-item-radius: 0px;
|
|
497
|
+
}
|
|
498
|
+
.pinfold-accordion[data-joined] .pinfold-accordion__item:first-child {
|
|
499
|
+
border-start-start-radius: var(--pinfold-acc-radius);
|
|
500
|
+
border-start-end-radius: var(--pinfold-acc-radius);
|
|
501
|
+
}
|
|
502
|
+
.pinfold-accordion[data-joined] .pinfold-accordion__item:last-child {
|
|
503
|
+
border-end-start-radius: var(--pinfold-acc-radius);
|
|
504
|
+
border-end-end-radius: var(--pinfold-acc-radius);
|
|
677
505
|
}
|
|
678
|
-
.pinfold-accordion[data-variant='
|
|
679
|
-
|
|
506
|
+
.pinfold-accordion[data-joined][data-variant='separated'] {
|
|
507
|
+
box-shadow: var(--pinfold-shadow-sm), var(--pinfold-highlight);
|
|
508
|
+
}
|
|
509
|
+
.pinfold-accordion[data-joined][data-variant='separated'] .pinfold-accordion__item {
|
|
510
|
+
box-shadow: none;
|
|
511
|
+
}
|
|
512
|
+
.pinfold-accordion[data-joined][data-variant='separated'] .pinfold-accordion__item:not(:last-child) {
|
|
513
|
+
border-bottom-width: 0;
|
|
514
|
+
}
|
|
515
|
+
.pinfold-accordion[data-joined][data-variant='separated'] .pinfold-accordion__item:not(:first-child) {
|
|
516
|
+
border-top-width: 0;
|
|
517
|
+
}
|
|
518
|
+
.pinfold-accordion[data-variant='ghost'] .pinfold-accordion__item {
|
|
519
|
+
--pinfold-acc-item-radius: var(--pinfold-accordion-item-radius, var(--pinfold-acc-radius));
|
|
680
520
|
}
|
|
681
|
-
|
|
682
|
-
/* ----------------------------------------------------------------- header */
|
|
683
521
|
.pinfold-accordion__header {
|
|
684
522
|
display: flex;
|
|
685
523
|
margin: 0;
|
|
686
524
|
}
|
|
687
|
-
|
|
688
525
|
.pinfold-accordion__trigger {
|
|
689
526
|
display: flex;
|
|
690
527
|
align-items: center;
|
|
@@ -696,44 +533,19 @@
|
|
|
696
533
|
line-height: var(--pinfold-leading-tight);
|
|
697
534
|
text-align: start;
|
|
698
535
|
color: var(--pinfold-color-text);
|
|
699
|
-
|
|
700
|
-
color var(--pinfold-duration-fast) var(--pinfold-ease);
|
|
701
|
-
}
|
|
702
|
-
|
|
703
|
-
.pinfold-accordion__trigger:hover {
|
|
704
|
-
background: var(--pinfold-color-surface-hover);
|
|
705
|
-
}
|
|
706
|
-
.pinfold-accordion__trigger:active {
|
|
707
|
-
background: var(--pinfold-color-surface-active);
|
|
708
|
-
}
|
|
709
|
-
|
|
710
|
-
/* Text in the accent: pulled toward the text colour so every tone (500 steps included) clears
|
|
711
|
-
4.5:1 on every variant's open background, in light and dark mode (the a11y report checks). */
|
|
712
|
-
.pinfold-accordion__trigger[data-state='open'] {
|
|
713
|
-
color: color-mix(in oklch, var(--pinfold-acc-accent) 62%, var(--pinfold-color-text));
|
|
536
|
+
cursor: pointer;
|
|
714
537
|
}
|
|
715
|
-
|
|
716
538
|
.pinfold-accordion__trigger[data-disabled] {
|
|
717
539
|
color: var(--pinfold-color-text-disabled);
|
|
718
540
|
cursor: not-allowed;
|
|
719
541
|
}
|
|
720
|
-
.pinfold-accordion__trigger[data-disabled]:hover,
|
|
721
|
-
.pinfold-accordion__trigger[data-disabled]:active {
|
|
722
|
-
background: none;
|
|
723
|
-
}
|
|
724
|
-
|
|
725
|
-
/* The ring is drawn by the core reset as a box-shadow; raise the focused row
|
|
726
|
-
so a neighbouring row's background cannot paint over it. */
|
|
727
542
|
.pinfold-accordion__trigger:focus-visible {
|
|
728
543
|
position: relative;
|
|
729
544
|
z-index: 1;
|
|
730
545
|
}
|
|
731
|
-
|
|
732
546
|
.pinfold-accordion[data-indicator-position='start'] .pinfold-accordion__trigger {
|
|
733
547
|
flex-direction: row-reverse;
|
|
734
548
|
}
|
|
735
|
-
|
|
736
|
-
/* ------------------------------------------------------------------ parts */
|
|
737
549
|
.pinfold-accordion__icon {
|
|
738
550
|
display: inline-flex;
|
|
739
551
|
flex: none;
|
|
@@ -743,7 +555,15 @@
|
|
|
743
555
|
height: var(--pinfold-acc-icon);
|
|
744
556
|
color: var(--pinfold-acc-accent);
|
|
745
557
|
}
|
|
746
|
-
|
|
558
|
+
.pinfold-accordion__end-icon {
|
|
559
|
+
display: inline-flex;
|
|
560
|
+
flex: none;
|
|
561
|
+
align-items: center;
|
|
562
|
+
justify-content: center;
|
|
563
|
+
width: var(--pinfold-acc-icon);
|
|
564
|
+
height: var(--pinfold-acc-icon);
|
|
565
|
+
color: var(--pinfold-color-text-muted);
|
|
566
|
+
}
|
|
747
567
|
.pinfold-accordion__label {
|
|
748
568
|
display: flex;
|
|
749
569
|
flex: 1 1 auto;
|
|
@@ -751,13 +571,10 @@
|
|
|
751
571
|
gap: 2px;
|
|
752
572
|
min-width: 0;
|
|
753
573
|
}
|
|
754
|
-
|
|
755
574
|
.pinfold-accordion__title {
|
|
756
575
|
font-size: var(--pinfold-acc-title);
|
|
757
576
|
overflow-wrap: anywhere;
|
|
758
577
|
}
|
|
759
|
-
|
|
760
|
-
/* Overflow policy per slot: wrap (default for titles), truncate, or clamp to n lines. */
|
|
761
578
|
.pinfold-accordion [data-overflow='truncate'] {
|
|
762
579
|
overflow: hidden;
|
|
763
580
|
text-overflow: ellipsis;
|
|
@@ -770,27 +587,22 @@
|
|
|
770
587
|
line-clamp: var(--pinfold-lines, 2);
|
|
771
588
|
overflow: hidden;
|
|
772
589
|
}
|
|
773
|
-
|
|
774
590
|
.pinfold-accordion__description {
|
|
775
591
|
font-size: var(--pinfold-acc-desc);
|
|
776
592
|
font-weight: var(--pinfold-weight-normal);
|
|
777
593
|
letter-spacing: var(--pinfold-tracking-normal);
|
|
778
594
|
color: var(--pinfold-color-text-muted);
|
|
779
595
|
}
|
|
780
|
-
|
|
781
596
|
.pinfold-accordion__badge {
|
|
782
597
|
flex: none;
|
|
783
598
|
padding: 2px var(--pinfold-space-2);
|
|
784
599
|
font-size: var(--pinfold-text-xs);
|
|
785
600
|
font-weight: var(--pinfold-weight-semibold);
|
|
786
601
|
letter-spacing: var(--pinfold-tracking-wide);
|
|
787
|
-
/* Small text on a tint of its own colour: pulled halfway toward the text colour, so it
|
|
788
|
-
clears 4.5:1 in light and dark mode for every tone (checked by the a11y report). */
|
|
789
602
|
color: color-mix(in oklch, var(--pinfold-acc-accent) 55%, var(--pinfold-color-text));
|
|
790
603
|
background: color-mix(in oklch, var(--pinfold-acc-accent) 12%, transparent);
|
|
791
604
|
border-radius: var(--pinfold-radius-full);
|
|
792
605
|
}
|
|
793
|
-
|
|
794
606
|
.pinfold-accordion__indicator {
|
|
795
607
|
display: inline-flex;
|
|
796
608
|
flex: none;
|
|
@@ -801,17 +613,22 @@
|
|
|
801
613
|
transition: transform var(--pinfold-acc-duration) var(--pinfold-ease-out),
|
|
802
614
|
color var(--pinfold-duration-fast) var(--pinfold-ease);
|
|
803
615
|
}
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
color: var(--pinfold-color-text-muted);
|
|
616
|
+
.pinfold-accordion__trigger:not([data-disabled]):hover .pinfold-accordion__indicator {
|
|
617
|
+
color: var(--pinfold-color-text);
|
|
807
618
|
}
|
|
808
|
-
|
|
809
619
|
.pinfold-accordion__trigger[data-state='open'] .pinfold-accordion__indicator {
|
|
810
620
|
color: var(--pinfold-acc-accent);
|
|
811
621
|
transform: rotate(180deg);
|
|
812
622
|
}
|
|
813
|
-
|
|
814
|
-
|
|
623
|
+
.pinfold-accordion[data-static-indicator] .pinfold-accordion__trigger .pinfold-accordion__indicator {
|
|
624
|
+
transform: none;
|
|
625
|
+
}
|
|
626
|
+
.pinfold-accordion[data-static-indicator] .pinfold-accordion__indicator-bar {
|
|
627
|
+
transition: none;
|
|
628
|
+
}
|
|
629
|
+
.pinfold-accordion:not([data-animate]) :is(.pinfold-accordion__indicator, .pinfold-accordion__indicator-bar) {
|
|
630
|
+
transition: none;
|
|
631
|
+
}
|
|
815
632
|
.pinfold-accordion__indicator .pinfold-accordion__indicator-bar {
|
|
816
633
|
transform-origin: center;
|
|
817
634
|
transition: opacity var(--pinfold-acc-duration) var(--pinfold-ease),
|
|
@@ -825,8 +642,6 @@
|
|
|
825
642
|
opacity: 0;
|
|
826
643
|
transform: rotate(90deg);
|
|
827
644
|
}
|
|
828
|
-
|
|
829
|
-
/* ------------------------------------------------------------------ panel */
|
|
830
645
|
.pinfold-accordion__panel {
|
|
831
646
|
display: grid;
|
|
832
647
|
grid-template-rows: 1fr;
|
|
@@ -835,21 +650,13 @@
|
|
|
835
650
|
line-height: var(--pinfold-leading-normal);
|
|
836
651
|
letter-spacing: var(--pinfold-tracking-normal);
|
|
837
652
|
}
|
|
838
|
-
|
|
839
653
|
.pinfold-accordion__panel[data-state='closed'] {
|
|
840
654
|
grid-template-rows: 0fr;
|
|
841
|
-
/* Takes closed content out of the accessibility tree and the tab order once
|
|
842
|
-
the collapse finishes. */
|
|
843
655
|
visibility: hidden;
|
|
844
656
|
}
|
|
845
|
-
|
|
846
|
-
/* Find-in-page: once the inner box carries hidden="until-found", the browser
|
|
847
|
-
owns its visibility (content-visibility), so the panel itself must stay
|
|
848
|
-
visible for matches to be found. Before hydration the rule above applies. */
|
|
849
657
|
.pinfold-accordion__panel[data-state='closed']:has(> [hidden='until-found']) {
|
|
850
658
|
visibility: visible;
|
|
851
659
|
}
|
|
852
|
-
|
|
853
660
|
.pinfold-accordion[data-animate] .pinfold-accordion__panel {
|
|
854
661
|
transition: grid-template-rows var(--pinfold-acc-duration) var(--pinfold-ease-out),
|
|
855
662
|
visibility 0s linear 0s;
|
|
@@ -858,14 +665,10 @@
|
|
|
858
665
|
transition: grid-template-rows var(--pinfold-acc-duration) var(--pinfold-ease),
|
|
859
666
|
visibility 0s linear var(--pinfold-acc-duration);
|
|
860
667
|
}
|
|
861
|
-
|
|
862
668
|
.pinfold-accordion__panel-inner {
|
|
863
669
|
min-height: 0;
|
|
864
670
|
overflow: hidden;
|
|
865
671
|
}
|
|
866
|
-
|
|
867
|
-
/* Content settles in slightly behind the row opening — the lag is what makes
|
|
868
|
-
the motion read as physical rather than mechanical. */
|
|
869
672
|
.pinfold-accordion[data-animate] .pinfold-accordion__content {
|
|
870
673
|
opacity: 0;
|
|
871
674
|
transform: translateY(-4px);
|
|
@@ -877,153 +680,100 @@
|
|
|
877
680
|
transform: none;
|
|
878
681
|
transition-delay: calc(var(--pinfold-acc-duration) * 0.35);
|
|
879
682
|
}
|
|
880
|
-
|
|
881
|
-
/* `dimensions.panelMaxHeight` caps the open panel and scrolls the rest. */
|
|
882
683
|
.pinfold-accordion[data-scroll] .pinfold-accordion__panel[data-state='open'] .pinfold-accordion__panel-inner {
|
|
883
684
|
max-height: var(--pinfold-accordion-panel-max-height);
|
|
884
685
|
overflow-y: auto;
|
|
885
686
|
overscroll-behavior: contain;
|
|
886
687
|
}
|
|
887
|
-
|
|
888
688
|
.pinfold-accordion__content {
|
|
889
689
|
padding: 0 var(--pinfold-acc-panel-pad-x) var(--pinfold-acc-panel-pad-y);
|
|
890
690
|
}
|
|
891
|
-
|
|
892
691
|
.pinfold-accordion[data-indicator-position='start'] .pinfold-accordion__content {
|
|
893
692
|
padding-inline-start: calc(var(--pinfold-acc-panel-pad-x) + var(--pinfold-acc-icon) + var(--pinfold-space-3));
|
|
894
693
|
}
|
|
895
|
-
|
|
896
|
-
/* ------------------------------------------------------------- responsive */
|
|
897
|
-
/* Narrow containers: the badge drops under the title so the title keeps its
|
|
898
|
-
width; the indicator stays on the first line. */
|
|
899
694
|
@container pinfold-accordion (max-width: 26rem) {
|
|
900
695
|
.pinfold-accordion__trigger {
|
|
901
696
|
flex-wrap: wrap;
|
|
902
697
|
row-gap: var(--pinfold-space-1);
|
|
903
698
|
}
|
|
904
|
-
/* Leaves room for the icon and indicator only, so the badge must wrap. */
|
|
905
699
|
.pinfold-accordion__label {
|
|
906
700
|
flex-basis: calc(100% - 4.5em);
|
|
907
701
|
}
|
|
908
702
|
.pinfold-accordion__indicator {
|
|
909
703
|
order: 1;
|
|
910
704
|
}
|
|
911
|
-
.pinfold-accordion__badge
|
|
705
|
+
.pinfold-accordion__badge,
|
|
706
|
+
.pinfold-accordion__end-icon {
|
|
912
707
|
order: 2;
|
|
708
|
+
}
|
|
709
|
+
.pinfold-accordion__badge,
|
|
710
|
+
.pinfold-accordion__trigger:not(:has(.pinfold-accordion__badge)) .pinfold-accordion__end-icon {
|
|
913
711
|
margin-inline-start: calc(var(--pinfold-acc-icon) + var(--pinfold-space-3));
|
|
914
712
|
}
|
|
915
|
-
.pinfold-accordion__trigger:not(:has(.pinfold-accordion__icon)) .pinfold-accordion__badge {
|
|
713
|
+
.pinfold-accordion__trigger:not(:has(.pinfold-accordion__icon)) :is(.pinfold-accordion__badge, .pinfold-accordion__end-icon) {
|
|
916
714
|
margin-inline-start: 0;
|
|
917
715
|
}
|
|
918
716
|
}
|
|
919
|
-
|
|
920
|
-
/* Touch: every trigger is at least 44px tall (WCAG 2.5.5 / 2.5.8). */
|
|
921
717
|
@media (pointer: coarse) {
|
|
922
718
|
.pinfold-accordion__trigger {
|
|
923
719
|
min-height: 44px;
|
|
924
720
|
}
|
|
925
721
|
}
|
|
926
|
-
|
|
927
722
|
@supports not (color: color-mix(in oklch, red, blue)) {
|
|
928
723
|
.pinfold-accordion__badge {
|
|
929
724
|
background: var(--pinfold-color-bg-subtle);
|
|
930
725
|
}
|
|
931
726
|
}
|
|
932
|
-
|
|
933
727
|
}
|
|
934
728
|
|
|
935
|
-
/* Pinfold — style packs.
|
|
936
|
-
|
|
937
|
-
import '@pinfold/css/core.css';
|
|
938
|
-
import '@pinfold/css/packs.css';
|
|
939
|
-
<PinfoldProvider stylePack="glass"> (or data-pinfold-style="glass" on any element)
|
|
940
|
-
|
|
941
|
-
A pack is only a token recipe: it re-points shape, depth, border, surface and
|
|
942
|
-
type tokens, so every component follows it with no per-component CSS.
|
|
943
|
-
Colour roles are untouched, so text contrast comes from the palette, which
|
|
944
|
-
is contrast-checked (see packs.test.ts).
|
|
945
|
-
|
|
946
|
-
Every pack yields to the user:
|
|
947
|
-
- prefers-reduced-transparency: no translucency, no blur.
|
|
948
|
-
- prefers-contrast: more: opaque surfaces, full-strength borders, no texture.
|
|
949
|
-
- forced-colors: system colours take over; decorative layers are dropped.
|
|
950
|
-
|
|
951
|
-
Packs sit in their own layer after the tokens, so they override the tokens
|
|
952
|
-
but never beat your own unlayered CSS. */
|
|
953
729
|
|
|
954
730
|
@layer pinfold.tokens, pinfold.reset, pinfold.components, pinfold.packs;
|
|
955
|
-
|
|
956
731
|
@layer pinfold.packs {
|
|
957
|
-
|
|
958
|
-
/* ------------------------------------------------------------------ glass */
|
|
959
|
-
/* Frosted, translucent surfaces over whatever is behind them. */
|
|
960
732
|
[data-pinfold-style='glass'] {
|
|
961
|
-
--pinfold-color-surface: color-mix(in oklch, var(--pinfold-color-bg)
|
|
962
|
-
--pinfold-color-bg-subtle: color-mix(in oklch, var(--pinfold-color-bg) 62%, transparent);
|
|
733
|
+
--pinfold-color-surface: color-mix(in oklch, color-mix(in oklch, var(--pinfold-color-accent) 6%, var(--pinfold-color-bg)) 66%, transparent);
|
|
734
|
+
--pinfold-color-bg-subtle: color-mix(in oklch, color-mix(in oklch, var(--pinfold-color-accent) 10%, var(--pinfold-color-bg)) 62%, transparent);
|
|
963
735
|
--pinfold-color-border: color-mix(in oklch, var(--pinfold-color-text) 12%, transparent);
|
|
964
|
-
--pinfold-backdrop: blur(
|
|
965
|
-
--pinfold-highlight: inset 0 1px 0 color-mix(in oklch, oklch(1 0 0)
|
|
736
|
+
--pinfold-backdrop: blur(20px) saturate(1.8);
|
|
737
|
+
--pinfold-highlight: inset 0 1px 0 color-mix(in oklch, oklch(1 0 0) 35%, transparent),
|
|
738
|
+
inset 0 0 0 1px color-mix(in oklch, oklch(1 0 0) 6%, transparent);
|
|
739
|
+
--pinfold-shadow-sm: 0 8px 24px -12px color-mix(in oklch, var(--pinfold-color-accent) 30%, transparent);
|
|
740
|
+
--pinfold-shadow-md: 0 16px 40px -16px color-mix(in oklch, var(--pinfold-color-accent) 38%, transparent);
|
|
741
|
+
--pinfold-radius-scale: 1.5;
|
|
742
|
+
}
|
|
743
|
+
[data-pinfold-style='material'] {
|
|
744
|
+
--pinfold-color-surface: color-mix(in oklch, var(--pinfold-color-accent) 5%, var(--pinfold-color-bg));
|
|
745
|
+
--pinfold-color-bg-subtle: color-mix(in oklch, var(--pinfold-color-accent) 10%, var(--pinfold-color-bg));
|
|
746
|
+
--pinfold-color-border: color-mix(in oklch, var(--pinfold-color-text) 8%, transparent);
|
|
747
|
+
--pinfold-shadow-sm:
|
|
748
|
+
0 1px 2px color-mix(in oklch, var(--pinfold-shadow-color) 18%, transparent),
|
|
749
|
+
0 1px 3px 1px color-mix(in oklch, var(--pinfold-shadow-color) 8%, transparent);
|
|
750
|
+
--pinfold-shadow-md:
|
|
751
|
+
0 1px 2px color-mix(in oklch, var(--pinfold-shadow-color) 18%, transparent),
|
|
752
|
+
0 2px 6px 2px color-mix(in oklch, var(--pinfold-shadow-color) 9%, transparent);
|
|
753
|
+
--pinfold-highlight: 0 0 0 0 transparent;
|
|
966
754
|
--pinfold-radius-scale: 1.4;
|
|
967
755
|
}
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
971
|
-
[data-pinfold-style='bauhaus'] {
|
|
972
|
-
--pinfold-radius-scale: 0;
|
|
973
|
-
--pinfold-border-width: 2px;
|
|
974
|
-
--pinfold-color-border: var(--pinfold-color-text);
|
|
975
|
-
--pinfold-color-border-accent: var(--pinfold-color-accent);
|
|
976
|
-
--pinfold-shadow-sm: 4px 4px 0 var(--pinfold-color-accent);
|
|
977
|
-
--pinfold-shadow-md: 6px 6px 0 var(--pinfold-color-accent);
|
|
978
|
-
--pinfold-highlight: 0 0 0 0 transparent;
|
|
979
|
-
--pinfold-font-sans: Futura, 'Century Gothic', 'Avenir Next', ui-sans-serif, system-ui, sans-serif;
|
|
980
|
-
--pinfold-tracking-tight: 0em;
|
|
756
|
+
[data-pinfold-style='noise'] {
|
|
757
|
+
--pinfold-texture: url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 0.5 0 0 0 0 0.5 0 0 0 0 0.5 0 0 0 0.16 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
|
|
758
|
+
--pinfold-color-bg-subtle: color-mix(in oklch, var(--pinfold-color-accent) 6%, var(--pinfold-color-surface));
|
|
981
759
|
}
|
|
982
|
-
|
|
983
|
-
/* -------------------------------------------------------------- brutalist */
|
|
984
|
-
/* Raw and loud: monospace, thick black rules, hard shadows, no rounding. */
|
|
985
760
|
[data-pinfold-style='brutalist'] {
|
|
986
|
-
--pinfold-radius-scale: 0;
|
|
987
|
-
--pinfold-border-width:
|
|
761
|
+
--pinfold-radius-scale: 0.5;
|
|
762
|
+
--pinfold-border-width: 2px;
|
|
988
763
|
--pinfold-color-border: var(--pinfold-color-text);
|
|
989
764
|
--pinfold-color-border-accent: var(--pinfold-color-text);
|
|
990
|
-
--pinfold-
|
|
991
|
-
--pinfold-shadow-
|
|
765
|
+
--pinfold-color-bg-subtle: color-mix(in oklch, var(--pinfold-color-accent) 14%, var(--pinfold-color-surface));
|
|
766
|
+
--pinfold-shadow-sm: 3px 3px 0 var(--pinfold-color-accent);
|
|
767
|
+
--pinfold-shadow-md: 5px 5px 0 var(--pinfold-color-accent);
|
|
992
768
|
--pinfold-highlight: 0 0 0 0 transparent;
|
|
993
|
-
--pinfold-color-surface-hover: color-mix(in oklch, var(--pinfold-color-accent) 18%, var(--pinfold-color-surface));
|
|
994
|
-
--pinfold-font-sans: var(--pinfold-font-mono);
|
|
995
|
-
--pinfold-tracking-tight: 0em;
|
|
996
|
-
}
|
|
997
|
-
|
|
998
|
-
/* ------------------------------------------------------------------ noise */
|
|
999
|
-
/* Print-like grain on every surface. The texture is a 2 kB SVG, no request. */
|
|
1000
|
-
[data-pinfold-style='noise'] {
|
|
1001
|
-
--pinfold-texture: url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.85' numOctaves='3' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.07 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
|
|
1002
|
-
--pinfold-radius-scale: 0.8;
|
|
1003
|
-
}
|
|
1004
|
-
|
|
1005
|
-
/* ------------------------------------------------------------------- soft */
|
|
1006
|
-
/* Pillowy: generous rounding, no hard borders, wide diffused shadows. */
|
|
1007
|
-
[data-pinfold-style='soft'] {
|
|
1008
|
-
--pinfold-radius-scale: 1.75;
|
|
1009
|
-
--pinfold-color-border: color-mix(in oklch, var(--pinfold-color-text) 6%, transparent);
|
|
1010
|
-
--pinfold-shadow-sm:
|
|
1011
|
-
0 2px 6px -2px color-mix(in oklch, var(--pinfold-shadow-color) 8%, transparent),
|
|
1012
|
-
0 12px 32px -14px color-mix(in oklch, var(--pinfold-shadow-color) 22%, transparent);
|
|
1013
|
-
--pinfold-shadow-md:
|
|
1014
|
-
0 4px 10px -3px color-mix(in oklch, var(--pinfold-shadow-color) 10%, transparent),
|
|
1015
|
-
0 20px 48px -18px color-mix(in oklch, var(--pinfold-shadow-color) 28%, transparent);
|
|
1016
769
|
}
|
|
1017
|
-
|
|
1018
|
-
/* ------------------------------------------------------- user preferences */
|
|
1019
770
|
@media (prefers-reduced-transparency: reduce) {
|
|
1020
771
|
[data-pinfold-style='glass'] {
|
|
1021
|
-
--pinfold-color-surface: var(--pinfold-color-bg);
|
|
1022
|
-
--pinfold-color-bg-subtle: var(--pinfold-
|
|
772
|
+
--pinfold-color-surface: color-mix(in oklch, var(--pinfold-color-accent) 6%, var(--pinfold-color-bg));
|
|
773
|
+
--pinfold-color-bg-subtle: color-mix(in oklch, var(--pinfold-color-accent) 10%, var(--pinfold-color-bg));
|
|
1023
774
|
--pinfold-backdrop: none;
|
|
1024
775
|
}
|
|
1025
776
|
}
|
|
1026
|
-
|
|
1027
777
|
@media (prefers-contrast: more) {
|
|
1028
778
|
[data-pinfold-style] {
|
|
1029
779
|
--pinfold-color-surface: var(--pinfold-color-bg);
|
|
@@ -1032,12 +782,10 @@
|
|
|
1032
782
|
--pinfold-texture: none;
|
|
1033
783
|
}
|
|
1034
784
|
}
|
|
1035
|
-
|
|
1036
785
|
@media (forced-colors: active) {
|
|
1037
786
|
[data-pinfold-style] {
|
|
1038
787
|
--pinfold-backdrop: none;
|
|
1039
788
|
--pinfold-texture: none;
|
|
1040
789
|
}
|
|
1041
790
|
}
|
|
1042
|
-
|
|
1043
791
|
}
|