@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/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-accent-600);
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
- /* Dark surfaces need a lighter, slightly less saturated accent to hold
324
- contrast without glowing. */
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-accent-400);
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-accent-400);
361
- --pinfold-color-accent-hover: var(--pinfold-accent-300);
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-accent-400);
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-accent-600);
408
- --pinfold-color-accent-hover: var(--pinfold-accent-700);
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-accent-500);
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-3);
379
+ --pinfold-acc-pad-y-base: var(--pinfold-space-4);
496
380
  --pinfold-acc-font-base: var(--pinfold-text-md);
497
- --pinfold-acc-radius-base: var(--pinfold-radius-lg);
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-2);
419
+ --pinfold-acc-pad-y-base: var(--pinfold-space-3);
543
420
  --pinfold-acc-font-base: var(--pinfold-text-sm);
544
- --pinfold-acc-radius-base: var(--pinfold-radius-md);
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-4);
425
+ --pinfold-acc-pad-y-base: var(--pinfold-space-5);
549
426
  --pinfold-acc-font-base: var(--pinfold-text-lg);
550
- --pinfold-acc-radius-base: var(--pinfold-radius-xl);
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
- /* Accent edge on the open row. Scales from the centre, so it reads as the row
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: 0;
576
- inset-inline-start: 0;
577
- width: 2px;
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-accordion__item[data-state='open']::before {
588
- transform: scaleY(1);
589
- opacity: 1;
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
- border: var(--pinfold-acc-border) solid var(--pinfold-color-border);
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-accordion__panel {
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-3);
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-variant='filled'] .pinfold-accordion__item[data-state='open'] {
671
- background-color: var(--pinfold-color-surface-selected);
492
+ .pinfold-accordion[data-joined] {
493
+ --pinfold-acc-divider-inset: var(--pinfold-acc-pad-x);
672
494
  }
673
-
674
- /* ghost — text only, hover reveals the row */
675
- .pinfold-accordion[data-variant='ghost'] .pinfold-accordion__item {
676
- --pinfold-acc-item-radius: var(--pinfold-acc-radius);
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='ghost'][data-dividers] .pinfold-accordion__item + .pinfold-accordion__item {
679
- border-top: var(--pinfold-acc-border) solid var(--pinfold-color-border);
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
- transition: background-color var(--pinfold-duration-fast) var(--pinfold-ease),
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
- .pinfold-accordion__trigger:hover .pinfold-accordion__indicator {
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
- /* The plus glyph morphs into a minus instead of spinning. */
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) 68%, transparent);
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(18px) saturate(1.6);
965
- --pinfold-highlight: inset 0 1px 0 color-mix(in oklch, oklch(1 0 0) 40%, transparent);
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
- /* ---------------------------------------------------------------- bauhaus */
970
- /* Geometry and primaries: square corners, heavy rules, offset colour blocks. */
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: 3px;
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-shadow-sm: 5px 5px 0 var(--pinfold-color-text);
991
- --pinfold-shadow-md: 8px 8px 0 var(--pinfold-color-text);
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-neutral-100);
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
  }