css-tags 0.1.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.
Files changed (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +875 -0
  3. package/carousel.js +86 -0
  4. package/components/accessibility.css +51 -0
  5. package/components/actions.css +76 -0
  6. package/components/alert.css +122 -0
  7. package/components/application-patterns.css +122 -0
  8. package/components/badge.css +125 -0
  9. package/components/box-extra.css +220 -0
  10. package/components/box.css +75 -0
  11. package/components/card.css +130 -0
  12. package/components/carousel.css +76 -0
  13. package/components/chip.css +71 -0
  14. package/components/container.css +55 -0
  15. package/components/content-patterns.css +234 -0
  16. package/components/disclosure.css +581 -0
  17. package/components/divider.css +68 -0
  18. package/components/flex.css +59 -0
  19. package/components/form-patterns.css +273 -0
  20. package/components/form.css +130 -0
  21. package/components/grid.css +82 -0
  22. package/components/identity.css +59 -0
  23. package/components/img-container.css +141 -0
  24. package/components/img-container.js +75 -0
  25. package/components/list.css +69 -0
  26. package/components/loading.css +112 -0
  27. package/components/masonry.css +48 -0
  28. package/components/modal.css +73 -0
  29. package/components/navigation-patterns.css +245 -0
  30. package/components/navigation.css +200 -0
  31. package/components/popover.css +49 -0
  32. package/components/site-shell.css +180 -0
  33. package/components/status.css +110 -0
  34. package/components/table.css +98 -0
  35. package/components/tabs.css +103 -0
  36. package/components/tooltip.css +87 -0
  37. package/components/tooltips.css +73 -0
  38. package/components/view-transition.css +73 -0
  39. package/core/base.css +62 -0
  40. package/core/defaults.css +490 -0
  41. package/core/engine.css +32 -0
  42. package/core/mixins.css +376 -0
  43. package/core/palette-accent.css +8 -0
  44. package/core/palette-base.css +107 -0
  45. package/core/palette-extended.css +142 -0
  46. package/core/palette-feedback.css +62 -0
  47. package/core/palette.css +7 -0
  48. package/core/reset.css +270 -0
  49. package/core/text.css +171 -0
  50. package/core/theme.css +608 -0
  51. package/core/tokens.css +488 -0
  52. package/core/typography.css +327 -0
  53. package/index.css +66 -0
  54. package/layouts/layout-extra.css +204 -0
  55. package/layouts/layout-extras-helpers.css +19 -0
  56. package/layouts/layout.css +348 -0
  57. package/package.json +66 -0
  58. package/theme-generator.css +979 -0
  59. package/themes/example-brand.css +59 -0
  60. package/themes/theme-packs.css +31 -0
  61. package/types/css-tags.d.ts +482 -0
  62. package/utilities/utilities.css +564 -0
  63. package/view-transition.js +111 -0
@@ -0,0 +1,581 @@
1
+ /**
2
+ * disclosure.css
3
+ *
4
+ * Native `details`/`summary` disclosure, accordion, and details-based tabs.
5
+ * Semantic HTML first — zero JS required.
6
+ * Progressive enhancement via @starting-style and interpolate-size.
7
+ * --------------------------------------------------------------------------
8
+ * Selectors: details, summary, .accordion / [data-accordion],
9
+ * .tabs-details / [data-tabs-details]
10
+ *
11
+ * Variants:
12
+ * [data-disclosure="compact"] Tighter padding
13
+ * [data-disclosure="flush"] No border, no background (inline toggle)
14
+ * [data-disclosure="bordered"] Heavier bordered container style
15
+ * summary[data-summary-end] Chevron on the left, text on the right
16
+ *
17
+ * Tokens (all optional, sensible defaults derive from theme):
18
+ * --disclosure-border-color Outer border color
19
+ * --disclosure-border-width Outer border width
20
+ * --disclosure-bg Panel background
21
+ * --disclosure-radius Corner rounding
22
+ * --disclosure-padding Content + summary inline/block padding
23
+ * --disclosure-gap Gap around content area
24
+ * --disclosure-transition Duration for open/close animation
25
+ *
26
+ * --disclosure-summary-bg Summary resting background
27
+ * --disclosure-summary-color Summary resting text color
28
+ * --disclosure-summary-weight Summary font weight
29
+ * --disclosure-summary-hover-bg Summary hover background
30
+ * --disclosure-summary-hover-color Summary hover text color
31
+ *
32
+ * --disclosure-content-bg Content-area background (if distinct)
33
+ *
34
+ * --accordion-gap Gap between accordion items
35
+ * --accordion-radius Outer radius on first/last items
36
+ */
37
+
38
+
39
+ /* ╔══════════════════════════════════════════════════════════════════════════╗
40
+ ║ BASE DETAILS / SUMMARY ║
41
+ ╚══════════════════════════════════════════════════════════════════════════╝ */
42
+
43
+ details {
44
+ --_border-color: var(--disclosure-border-color, var(--outline-subtle));
45
+ --_border-width: var(--disclosure-border-width, var(--border-width, 1px));
46
+ --_bg: var(--disclosure-bg, var(--surface-default, transparent));
47
+ --_radius: var(--disclosure-radius, var(--radius-md, 0.5rem));
48
+ --_padding: var(--disclosure-padding, 1rem);
49
+ --_transition: var(--disclosure-transition, 200ms);
50
+
51
+ border: var(--_border-width) solid var(--_border-color);
52
+ border-radius: var(--_radius);
53
+ background: var(--_bg);
54
+ overflow: hidden;
55
+ }
56
+
57
+ summary {
58
+ --_bg: var(--disclosure-summary-bg, transparent);
59
+ --_color: var(--disclosure-summary-color, var(--text-overt, inherit));
60
+ --_weight: var(--disclosure-summary-weight, var(--font-weight-medium, 500));
61
+ --_hover-bg: var(--disclosure-summary-hover-bg, var(--highlight-bg-subtle));
62
+ --_hover-color: var(--disclosure-summary-hover-color, var(--text-overt, inherit));
63
+
64
+ display: flex;
65
+ align-items: center;
66
+ justify-content: space-between;
67
+ gap: 0.75rem;
68
+ padding: var(--_padding);
69
+ background: var(--_bg);
70
+ color: var(--_color);
71
+ font-weight: var(--_weight);
72
+ cursor: pointer;
73
+ user-select: none;
74
+ list-style: none;
75
+ transition:
76
+ background-color var(--_transition) ease-out,
77
+ color var(--_transition) ease-out;
78
+ }
79
+
80
+ /* Hide default marker across engines */
81
+ summary::-webkit-details-marker { display: none; }
82
+ summary::marker { content: ''; }
83
+
84
+ /* Chevron indicator via ::after */
85
+ summary::after {
86
+ content: '';
87
+ flex-shrink: 0;
88
+ width: 0.5em;
89
+ height: 0.5em;
90
+ border-inline-end: 2px solid currentColor;
91
+ border-block-end: 2px solid currentColor;
92
+ transform: rotate(-45deg);
93
+ transition: transform var(--_transition) ease;
94
+ margin-inline-start: auto;
95
+ }
96
+
97
+ details[open] > summary::after {
98
+ transform: rotate(45deg);
99
+ }
100
+
101
+ /* Hover & Focus */
102
+ summary:hover {
103
+ background: var(--_hover-bg);
104
+ color: var(--_hover-color);
105
+ }
106
+
107
+ summary:focus-visible {
108
+ outline: var(--focus-ring-width, 2px) solid var(--focus-ring-color, var(--outline-focus));
109
+ outline-offset: calc(-1 * var(--focus-ring-width, 2px));
110
+ }
111
+
112
+ /* ── Content area ── */
113
+ details > :not(summary) {
114
+ padding-inline: var(--disclosure-padding, 1rem);
115
+ background: var(--disclosure-content-bg, transparent);
116
+ }
117
+
118
+ details > summary + * {
119
+ padding-block-start: var(--disclosure-padding, 1rem);
120
+ }
121
+
122
+ details > :last-child:not(summary) {
123
+ padding-block-end: var(--disclosure-padding, 1rem);
124
+ }
125
+
126
+
127
+ /* ╔══════════════════════════════════════════════════════════════════════════╗
128
+ ║ CONTENT ANIMATION — @starting-style + interpolate-size ║
129
+ ║ Progressive enhancement: browsers without support get instant toggle ║
130
+ ╚══════════════════════════════════════════════════════════════════════════╝ */
131
+
132
+ /*
133
+ * Allow height to transition from 0 → auto using interpolate-size.
134
+ * Wrap the content in a <div> or <p> directly after <summary> for best results.
135
+ * Falls back to instant show/hide in older browsers.
136
+ */
137
+ @supports (interpolate-size: allow-keywords) {
138
+ details {
139
+ interpolate-size: allow-keywords;
140
+ }
141
+
142
+ details > :not(summary) {
143
+ overflow: hidden;
144
+ block-size: auto;
145
+ transition:
146
+ block-size var(--disclosure-transition, 200ms) ease-out,
147
+ opacity var(--disclosure-transition, 200ms) ease-out,
148
+ padding-block var(--disclosure-transition, 200ms) ease-out;
149
+ }
150
+
151
+ details:not([open]) > :not(summary) {
152
+ block-size: 0;
153
+ opacity: 0;
154
+ padding-block: 0;
155
+ }
156
+
157
+ /* Entry animation: start collapsed, transition to auto */
158
+ @starting-style {
159
+ details[open] > :not(summary) {
160
+ block-size: 0;
161
+ opacity: 0;
162
+ padding-block: 0;
163
+ }
164
+ }
165
+ }
166
+
167
+
168
+ /* ╔══════════════════════════════════════════════════════════════════════════╗
169
+ ║ VARIANT: compact ║
170
+ ║ Tighter spacing for dense UIs (sidebars, settings panels) ║
171
+ ╚══════════════════════════════════════════════════════════════════════════╝ */
172
+
173
+ details[data-disclosure="compact"],
174
+ :is(.accordion, [data-accordion])[data-disclosure="compact"] > details {
175
+ --disclosure-padding: 0.625rem 0.875rem;
176
+ }
177
+
178
+ details[data-disclosure="compact"] > summary {
179
+ font-size: 0.875rem;
180
+ gap: 0.5rem;
181
+ }
182
+
183
+
184
+ /* ╔══════════════════════════════════════════════════════════════════════════╗
185
+ ║ VARIANT: flush ║
186
+ ║ No border, no background — inline toggle (e.g. "Show code ▸") ║
187
+ ╚══════════════════════════════════════════════════════════════════════════╝ */
188
+
189
+ details[data-disclosure="flush"] {
190
+ border: none;
191
+ background: transparent;
192
+ border-radius: 0;
193
+ }
194
+
195
+ details[data-disclosure="flush"] > summary {
196
+ padding-inline: 0;
197
+ background: transparent;
198
+ color: var(--text-link, var(--accent));
199
+ font-weight: var(--font-weight-normal, 400);
200
+ gap: 0.375rem;
201
+ justify-content: flex-start;
202
+ }
203
+
204
+ details[data-disclosure="flush"] > summary:hover {
205
+ background: transparent;
206
+ color: var(--text-link-hover, var(--accent-overt));
207
+ }
208
+
209
+ details[data-disclosure="flush"] > summary::after {
210
+ transform: rotate(-45deg);
211
+ width: 0.4em;
212
+ height: 0.4em;
213
+ margin-inline-start: 0;
214
+ }
215
+
216
+ details[data-disclosure="flush"][open] > summary::after {
217
+ transform: rotate(45deg);
218
+ }
219
+
220
+ details[data-disclosure="flush"] > :not(summary) {
221
+ padding-inline: 0;
222
+ }
223
+
224
+
225
+ /* ╔══════════════════════════════════════════════════════════════════════════╗
226
+ ║ VARIANT: bordered ║
227
+ ║ Heavier bordered container with distinct summary/content split ║
228
+ ╚══════════════════════════════════════════════════════════════════════════╝ */
229
+
230
+ details[data-disclosure="bordered"] {
231
+ --disclosure-border-width: var(--border-width-thick, 2px);
232
+ --disclosure-border-color: var(--outline-default, var(--outline-subtle));
233
+ --disclosure-radius: var(--radius-lg, 0.75rem);
234
+ box-shadow: 0 1px 3px oklch(from var(--base, #fff) calc(l - 50%) 0.02 h / 0.08);
235
+ }
236
+
237
+ details[data-disclosure="bordered"] > summary {
238
+ background: var(--surface-subtle);
239
+ border-block-end: var(--disclosure-border-width, var(--border-width-thick, 2px)) solid var(--disclosure-border-color, var(--outline-default));
240
+ font-weight: var(--font-weight-semibold, 600);
241
+ }
242
+
243
+ details[data-disclosure="bordered"]:not([open]) > summary {
244
+ border-block-end-color: transparent;
245
+ }
246
+
247
+ details[data-disclosure="bordered"] > :not(summary) {
248
+ background: var(--disclosure-content-bg, var(--surface-default, transparent));
249
+ }
250
+
251
+
252
+ /* ╔══════════════════════════════════════════════════════════════════════════╗
253
+ ║ VARIANT: summary-end — right-aligned text, chevron leads ║
254
+ ║ Usage: <summary data-summary-end>Show code</summary> ║
255
+ ║ Ideal for "Code" toggles, debug info, footnotes ║
256
+ ╚══════════════════════════════════════════════════════════════════════════╝ */
257
+
258
+ summary[data-summary-end] {
259
+ flex-direction: row-reverse;
260
+ justify-content: flex-end;
261
+ }
262
+
263
+ summary[data-summary-end]::after {
264
+ margin-inline-start: 0;
265
+ margin-inline-end: 0;
266
+ }
267
+
268
+
269
+ /* ╔══════════════════════════════════════════════════════════════════════════╗
270
+ ║ ACCORDION — .accordion / [data-accordion] ║
271
+ ╚══════════════════════════════════════════════════════════════════════════╝ */
272
+
273
+ :is(.accordion, [data-accordion]) {
274
+ --_radius: var(--accordion-radius, var(--disclosure-radius, var(--radius-md, 0.5rem)));
275
+ --_gap: var(--accordion-gap, 0px);
276
+
277
+ display: flex;
278
+ flex-direction: column;
279
+ gap: var(--_gap);
280
+ }
281
+
282
+ /* Strip individual radii when stacked together */
283
+ :is(.accordion, [data-accordion]) > details {
284
+ border-radius: 0;
285
+ }
286
+
287
+ /* First child: round top corners */
288
+ :is(.accordion, [data-accordion]) > details:first-child {
289
+ border-start-start-radius: var(--_radius);
290
+ border-start-end-radius: var(--_radius);
291
+ }
292
+
293
+ /* Last child: round bottom corners */
294
+ :is(.accordion, [data-accordion]) > details:last-child {
295
+ border-end-start-radius: var(--_radius);
296
+ border-end-end-radius: var(--_radius);
297
+ }
298
+
299
+ /* Collapse shared borders when gap = 0 */
300
+ :is(.accordion, [data-accordion]) > details + details {
301
+ margin-block-start: calc(-1 * var(--disclosure-border-width, var(--border-width, 1px)));
302
+ }
303
+
304
+ /* Open item gets subtle emphasis in accordion context */
305
+ :is(.accordion, [data-accordion]) > details[open] > summary {
306
+ background: var(--disclosure-summary-hover-bg, var(--highlight-bg-subtle));
307
+ }
308
+
309
+
310
+ /* ── Accordion with explicit gap — each item is standalone ── */
311
+
312
+ :is(.accordion, [data-accordion])[style*="--accordion-gap"] > details,
313
+ :is(.accordion, [data-accordion])[gap] > details {
314
+ border-radius: var(--_radius);
315
+ margin-block-start: 0;
316
+ }
317
+
318
+
319
+ /* ╔══════════════════════════════════════════════════════════════════════════╗
320
+ ║ DETAILS-BASED TABS (stacked) — .tabs-details-stacked ║
321
+ ║ Vertical disclosure-driven tabs. Each summary is a full-width row. ║
322
+ ╚══════════════════════════════════════════════════════════════════════════╝ */
323
+
324
+ :is(.tabs-details-stacked, [data-tabs-details-stacked]) {
325
+ display: flex;
326
+ flex-direction: column;
327
+ gap: 0;
328
+ }
329
+
330
+ :is(.tabs-details-stacked, [data-tabs-details-stacked]) > details {
331
+ border-radius: 0;
332
+ }
333
+
334
+ :is(.tabs-details-stacked, [data-tabs-details-stacked]) > details + details {
335
+ margin-block-start: calc(-1 * var(--disclosure-border-width, var(--border-width, 1px)));
336
+ }
337
+
338
+ :is(.tabs-details-stacked, [data-tabs-details-stacked]) > details:first-child {
339
+ border-start-start-radius: var(--disclosure-radius, var(--radius-md, 0.5rem));
340
+ border-start-end-radius: var(--disclosure-radius, var(--radius-md, 0.5rem));
341
+ }
342
+
343
+ :is(.tabs-details-stacked, [data-tabs-details-stacked]) > details:last-child {
344
+ border-end-start-radius: var(--disclosure-radius, var(--radius-md, 0.5rem));
345
+ border-end-end-radius: var(--disclosure-radius, var(--radius-md, 0.5rem));
346
+ }
347
+
348
+ :is(.tabs-details-stacked, [data-tabs-details-stacked]) > details[open] > summary {
349
+ background: var(--disclosure-summary-hover-bg, var(--highlight-bg-subtle));
350
+ color: var(--text-overt);
351
+ border-inline-start: 3px solid var(--accent, currentColor);
352
+ }
353
+
354
+
355
+ /* ╔══════════════════════════════════════════════════════════════════════════╗
356
+ ║ GRID TABS — .tabs-details / [data-tabs-details] ║
357
+ ║ Horizontal tab bar using CSS subgrid + ::details-content. ║
358
+ ║ Pure CSS, zero JS. Set --tab-count to match the number of tabs. ║
359
+ ║ ║
360
+ ║ Tokens: ║
361
+ ║ --tab-count Number of tabs (for grid columns) ║
362
+ ║ --tabs-gap Column gap between tab buttons ║
363
+ ║ --tabs-border-color Bottom border of tab row ║
364
+ ║ --tabs-active-color Active tab indicator color ║
365
+ ║ --tabs-panel-padding Padding inside the tab panel ║
366
+ ║ --tabs-radius Border radius for boxed variant ║
367
+ ║ ║
368
+ ║ Usage: ║
369
+ ║ <div class="tabs-details" style="--tab-count: 3"> ║
370
+ ║ <details name="my-tabs" open style="--n: 1"> ║
371
+ ║ <summary>Tab 1</summary> ║
372
+ ║ <p>Panel 1 content</p> ║
373
+ ║ </details> ║
374
+ ║ <details name="my-tabs" style="--n: 2"> ║
375
+ ║ <summary>Tab 2</summary> ║
376
+ ║ <p>Panel 2 content</p> ║
377
+ ║ </details> ║
378
+ ║ <details name="my-tabs" style="--n: 3"> ║
379
+ ║ <summary>Tab 3</summary> ║
380
+ ║ <p>Panel 3 content</p> ║
381
+ ║ </details> ║
382
+ ║ </div> ║
383
+ ╚══════════════════════════════════════════════════════════════════════════╝ */
384
+
385
+ :is(.tabs-details, [data-tabs-details]) {
386
+ --_tab-count: var(--tab-count, 3);
387
+ --_gap: var(--tabs-gap, 0rem);
388
+ --_border-color: var(--tabs-border-color, var(--outline-subtle));
389
+ --_active-color: var(--tabs-active-color, var(--accent, currentColor));
390
+ --_panel-padding: var(--tabs-panel-padding, var(--disclosure-padding, 1rem));
391
+ --_radius: var(--tabs-radius, var(--disclosure-radius, var(--radius-md, 0.5rem)));
392
+ --_transition: var(--disclosure-transition, 200ms);
393
+
394
+ display: grid;
395
+ grid-template-columns: repeat(var(--_tab-count), minmax(0, 1fr));
396
+ grid-template-rows: auto 1fr;
397
+ column-gap: var(--_gap);
398
+ }
399
+
400
+ /* Each details element spans the full grid */
401
+ :is(.tabs-details, [data-tabs-details]) > details {
402
+ display: grid;
403
+ grid-template-columns: subgrid;
404
+ grid-template-rows: subgrid;
405
+ grid-column: 1 / -1;
406
+ grid-row: 1 / span 2;
407
+ margin: 0;
408
+
409
+ /* Reset base details styles in tab context */
410
+ border: none;
411
+ border-radius: 0;
412
+ background: transparent;
413
+ overflow: visible;
414
+ }
415
+
416
+ /* Summary acts as the tab button */
417
+ :is(.tabs-details, [data-tabs-details]) > details > summary {
418
+ grid-row: 1;
419
+ grid-column: var(--n, 1) / span 1;
420
+ z-index: 1;
421
+
422
+ display: flex;
423
+ align-items: center;
424
+ justify-content: center;
425
+ padding: 0.75rem 1rem;
426
+ gap: 0.5rem;
427
+
428
+ color: var(--text-subtle);
429
+ font-weight: var(--font-weight-medium, 500);
430
+ background: transparent;
431
+ border: none;
432
+ border-block-end: 2px solid transparent;
433
+ cursor: pointer;
434
+ user-select: none;
435
+ transition:
436
+ color var(--_transition) ease-out,
437
+ border-color var(--_transition) ease-out;
438
+ }
439
+
440
+ /* Remove chevron in tab context */
441
+ :is(.tabs-details, [data-tabs-details]) > details > summary::after {
442
+ display: none;
443
+ }
444
+
445
+ /* Tab hover */
446
+ :is(.tabs-details, [data-tabs-details]) > details > summary:hover {
447
+ color: var(--text-overt);
448
+ background: transparent;
449
+ }
450
+
451
+ /* Tab focus */
452
+ :is(.tabs-details, [data-tabs-details]) > details > summary:focus-visible {
453
+ outline: var(--focus-ring-width, 2px) solid var(--focus-ring-color, var(--outline-focus));
454
+ outline-offset: -2px;
455
+ }
456
+
457
+ /* Active tab */
458
+ :is(.tabs-details, [data-tabs-details]) > details[open] > summary {
459
+ color: var(--text-overt);
460
+ font-weight: var(--font-weight-semibold, 600);
461
+ border-block-end-color: var(--_active-color);
462
+ background: transparent;
463
+ border-inline-start: none;
464
+ }
465
+
466
+ /* Tab panel — uses ::details-content for native open/close */
467
+ :is(.tabs-details, [data-tabs-details]) > details::details-content {
468
+ grid-row: 2;
469
+ grid-column: 1 / -1;
470
+ padding: var(--_panel-padding);
471
+
472
+ /* Smooth open/close */
473
+ opacity: 1;
474
+ block-size: auto;
475
+ overflow: visible;
476
+ transition:
477
+ opacity var(--_transition) ease-out,
478
+ display var(--_transition) ease-out allow-discrete;
479
+ }
480
+
481
+ :is(.tabs-details, [data-tabs-details]) > details:not([open])::details-content {
482
+ display: none;
483
+ opacity: 0;
484
+ }
485
+
486
+ /* Content inside panel — reset disclosure content padding */
487
+ :is(.tabs-details, [data-tabs-details]) > details > :not(summary) {
488
+ padding: 0;
489
+ margin: 0;
490
+ background: transparent;
491
+ }
492
+
493
+ /* Entry animation */
494
+ @starting-style {
495
+ :is(.tabs-details, [data-tabs-details]) > details[open]::details-content {
496
+ opacity: 0;
497
+ }
498
+ }
499
+
500
+
501
+ /* ── Boxed variant — card-style tabs that visually connect to panel ── */
502
+
503
+ :is(.tabs-details, [data-tabs-details]):is(.boxed, [data-tabs-boxed]) > details > summary {
504
+ border: var(--border-width, 1px) solid var(--_border-color);
505
+ border-block-end: none;
506
+ border-radius: var(--_radius) var(--_radius) 0 0;
507
+ background: var(--surface-subtle, var(--highlight-bg-muted));
508
+ margin-inline-end: -1px;
509
+ position: relative;
510
+ }
511
+
512
+ /* Active boxed tab — connects visually to the panel */
513
+ :is(.tabs-details, [data-tabs-details]):is(.boxed, [data-tabs-boxed]) > details[open] > summary {
514
+ background: var(--surface-default, var(--base));
515
+ z-index: 2;
516
+ border-block-end-color: transparent;
517
+ }
518
+
519
+ /* Bridge between active tab and panel */
520
+ :is(.tabs-details, [data-tabs-details]):is(.boxed, [data-tabs-boxed]) > details[open] > summary::after {
521
+ display: block;
522
+ content: '';
523
+ position: absolute;
524
+ inset-inline: 0;
525
+ inset-block-end: -1px;
526
+ block-size: 2px;
527
+ background: var(--surface-default, var(--base));
528
+ border: none;
529
+ width: auto;
530
+ height: auto;
531
+ transform: none;
532
+ }
533
+
534
+ /* Boxed panel styling */
535
+ :is(.tabs-details, [data-tabs-details]):is(.boxed, [data-tabs-boxed]) > details::details-content {
536
+ border: var(--border-width, 1px) solid var(--_border-color);
537
+ border-radius: 0 0 var(--_radius) var(--_radius);
538
+ margin-block-start: -1px;
539
+ background: var(--surface-default, var(--base));
540
+ }
541
+
542
+
543
+ /* ── Pill variant — rounded tab buttons with filled active state ── */
544
+
545
+ :is(.tabs-details, [data-tabs-details]):is(.pills, [data-tabs-pills]) {
546
+ column-gap: 0.25rem;
547
+ }
548
+
549
+ :is(.tabs-details, [data-tabs-details]):is(.pills, [data-tabs-pills]) > details > summary {
550
+ border: none;
551
+ border-radius: var(--radius-full, 9999px);
552
+ padding: 0.5rem 1.25rem;
553
+ }
554
+
555
+ :is(.tabs-details, [data-tabs-details]):is(.pills, [data-tabs-pills]) > details > summary:hover {
556
+ background: var(--highlight-bg-subtle);
557
+ }
558
+
559
+ :is(.tabs-details, [data-tabs-details]):is(.pills, [data-tabs-pills]) > details[open] > summary {
560
+ background: var(--accent);
561
+ color: var(--text-on-base, #fff);
562
+ border-block-end: none;
563
+ }
564
+
565
+ :is(.tabs-details, [data-tabs-details]):is(.pills, [data-tabs-pills]) > details[open] > summary::after {
566
+ display: none;
567
+ }
568
+
569
+
570
+ /* ╔══════════════════════════════════════════════════════════════════════════╗
571
+ ║ REDUCED MOTION — respect user preference ║
572
+ ╚══════════════════════════════════════════════════════════════════════════╝ */
573
+
574
+ @media (prefers-reduced-motion: reduce) {
575
+ summary,
576
+ summary::after,
577
+ details > :not(summary),
578
+ details::details-content {
579
+ transition-duration: 0ms !important;
580
+ }
581
+ }
@@ -0,0 +1,68 @@
1
+ /**
2
+ * divider.css
3
+ *
4
+ * Semantic horizontal rules and opt-in horizontal or vertical separators.
5
+ * Native <hr> is the preferred content separator. Other hosts should carry
6
+ * role="separator" and an aria-orientation when they are meaningful.
7
+ */
8
+
9
+ :is(hr, divider, [data-divider], .divider) {
10
+ --_divider-role-color: var(--divider-color-subtle, var(--outline-subtle));
11
+ --_divider-color: var(--divider-color, var(--_divider-role-color));
12
+ --_divider-size: var(--divider-size, var(--border-width, 1px));
13
+ --_divider-style: var(--divider-style, solid);
14
+ --_divider-gap: var(--divider-gap, var(--space-md, 1rem));
15
+ --_divider-length: var(--divider-length, 100%);
16
+
17
+ display: block;
18
+ box-sizing: border-box;
19
+ flex: none;
20
+ align-self: stretch;
21
+ inline-size: var(--_divider-length);
22
+ block-size: 0;
23
+ margin-block: var(--_divider-gap);
24
+ margin-inline: 0;
25
+ padding: 0;
26
+ overflow: visible;
27
+ border: 0;
28
+ border-block-start: var(--_divider-size) var(--_divider-style) var(--_divider-color);
29
+ background: none;
30
+ }
31
+
32
+ :is(hr, divider, [data-divider], .divider)[strength="muted"] {
33
+ --_divider-role-color: var(--divider-color-muted, var(--outline-muted));
34
+ }
35
+
36
+ :is(hr, divider, [data-divider], .divider)[strength="default"] {
37
+ --_divider-role-color: var(--divider-color-default, var(--outline-default, var(--outline)));
38
+ }
39
+
40
+ :is(hr, divider, [data-divider], .divider)[strength="overt"] {
41
+ --_divider-role-color: var(--divider-color-overt, var(--outline-overt));
42
+ }
43
+
44
+ :is(hr, divider, [data-divider], .divider)[strength="accent"] {
45
+ --_divider-role-color: var(--divider-color-accent, var(--accent));
46
+ }
47
+
48
+ :is(hr, divider, [data-divider], .divider):is(
49
+ [orientation="vertical"],
50
+ [aria-orientation="vertical"],
51
+ [vertical]
52
+ ) {
53
+ --_divider-length: var(--divider-length, auto);
54
+
55
+ inline-size: 0;
56
+ block-size: var(--_divider-length);
57
+ min-block-size: var(--divider-min-length, 1.5rem);
58
+ margin-block: 0;
59
+ margin-inline: var(--_divider-gap);
60
+ border-block-start: 0;
61
+ border-inline-start: var(--_divider-size) var(--_divider-style) var(--_divider-color);
62
+ }
63
+
64
+ @media (forced-colors: active) {
65
+ :is(hr, divider, [data-divider], .divider) {
66
+ --_divider-color: CanvasText;
67
+ }
68
+ }