defuss-shadcn 0.8.2 → 0.8.3
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/components/button-group/button-group.css +14 -15
- package/dist/components/label/component-skill.md +6 -1
- package/dist/components/select/component-skill.md +11 -2
- package/dist/components/select/select.css +10 -0
- package/dist/components/toggle-group/toggle-group.css +18 -14
- package/dist/documentation/button-group.html +14 -15
- package/dist/documentation/changelog.html +14 -0
- package/dist/documentation/js/layout.js +1 -1
- package/dist/documentation/js/search-index.js +1 -1
- package/dist/documentation/label.html +5 -3
- package/dist/documentation/select.html +18 -7
- package/dist/documentation/toggle-group.html +18 -14
- package/docs/button-group.html +14 -15
- package/docs/changelog.html +14 -0
- package/docs/js/layout.js +1 -1
- package/docs/js/search-index.js +1 -1
- package/docs/label.html +5 -3
- package/docs/select.html +18 -7
- package/docs/toggle-group.html +18 -14
- package/package.json +1 -1
- package/scripts/purge-cdn.ts +9 -4
- package/src/components/button-group/button-group.css +14 -15
- package/src/components/label/component-skill.md +6 -1
- package/src/components/select/component-skill.md +11 -2
- package/src/components/select/select.css +10 -0
- package/src/components/toggle-group/toggle-group.css +18 -14
- package/src/documentation/button-group.html +14 -15
- package/src/documentation/changelog.html +14 -0
- package/src/documentation/js/layout.ts +1 -1
- package/src/documentation/js/search-index.js +1 -1
- package/src/documentation/label.html +5 -3
- package/src/documentation/select.html +18 -7
- package/src/documentation/toggle-group.html +18 -14
- package/tests/e2e/button-group.e2e-fixture.html +2 -1
- package/tests/e2e/button-group.e2e.ts +22 -0
- package/tests/e2e/label.e2e.ts +10 -0
- package/tests/e2e/select.e2e-fixture.html +5 -3
- package/tests/e2e/select.e2e.ts +24 -0
- package/tests/e2e/toggle-group.e2e-fixture.html +10 -0
- package/tests/e2e/toggle-group.e2e.ts +21 -0
|
@@ -10,13 +10,17 @@
|
|
|
10
10
|
margin-inline-start: -1px;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
-
/* Remove internal radii for connected appearance
|
|
14
|
-
|
|
13
|
+
/* Remove internal radii for connected appearance. The orientation gate is
|
|
14
|
+
:where()-wrapped so these INLINE-corner rules only ever apply to
|
|
15
|
+
horizontal groups; ungated they also squared vertical buttons' corners
|
|
16
|
+
at a higher specificity than the vertical block below, leaving "Top"
|
|
17
|
+
with a rounded top-left but a square top-right (issue #13). */
|
|
18
|
+
&:where(:not([data-orientation="vertical"])) > .btn:not(:first-child):not(:has(+ [role="separator"])) {
|
|
15
19
|
border-start-start-radius: 0;
|
|
16
20
|
border-end-start-radius: 0;
|
|
17
21
|
}
|
|
18
22
|
|
|
19
|
-
|
|
23
|
+
&:where(:not([data-orientation="vertical"])) > .btn:not(:last-child):not([role="separator"] + .btn) {
|
|
20
24
|
border-start-end-radius: 0;
|
|
21
25
|
border-end-end-radius: 0;
|
|
22
26
|
}
|
|
@@ -61,26 +65,21 @@
|
|
|
61
65
|
margin-top: -1px;
|
|
62
66
|
}
|
|
63
67
|
|
|
68
|
+
/* Square exactly the BLOCK corners that touch a neighbour — a
|
|
69
|
+
non-first button squares its top edge, a non-last its bottom
|
|
70
|
+
edge; the base .btn radius keeps every outer corner rounded on
|
|
71
|
+
both sides. No per-corner "restore" overrides: the last block's
|
|
72
|
+
restores re-rounded a corner the previous block had just
|
|
73
|
+
squared, which (together with the ungated horizontal rules)
|
|
74
|
+
produced the asymmetric Top/Middle corners of issue #13. */
|
|
64
75
|
& > .btn:not(:first-child) {
|
|
65
76
|
border-start-start-radius: 0;
|
|
66
77
|
border-start-end-radius: 0;
|
|
67
|
-
border-end-start-radius: var(--radius-md);
|
|
68
78
|
}
|
|
69
79
|
|
|
70
80
|
& > .btn:not(:last-child) {
|
|
71
81
|
border-end-start-radius: 0;
|
|
72
82
|
border-end-end-radius: 0;
|
|
73
|
-
border-start-end-radius: var(--radius-md);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
& > .btn:first-child {
|
|
77
|
-
border-start-start-radius: var(--radius-md);
|
|
78
|
-
border-start-end-radius: var(--radius-md);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
& > .btn:last-child {
|
|
82
|
-
border-end-start-radius: var(--radius-md);
|
|
83
|
-
border-end-end-radius: var(--radius-md);
|
|
84
83
|
}
|
|
85
84
|
|
|
86
85
|
& > [role="separator"] {
|
|
@@ -10,6 +10,9 @@ supportedStates: default
|
|
|
10
10
|
|
|
11
11
|
## Native basis
|
|
12
12
|
`<label>` element. Browser provides built-in click-to-focus association with form controls.
|
|
13
|
+
The association is the `for`↔`id` pairing: the label's `for` and the control's `id`
|
|
14
|
+
must be the exact same string — click-to-focus and the accessible name both exist
|
|
15
|
+
only because of it.
|
|
13
16
|
|
|
14
17
|
---
|
|
15
18
|
|
|
@@ -25,6 +28,7 @@ supportedStates: default
|
|
|
25
28
|
|
|
26
29
|
### Basic
|
|
27
30
|
```html
|
|
31
|
+
<!-- for and id are one value in two places — keep them identical -->
|
|
28
32
|
<label class="label" for="email">Email</label>
|
|
29
33
|
<input class="input" id="email" type="email">
|
|
30
34
|
```
|
|
@@ -91,7 +95,8 @@ The label auto-dims when the adjacent control is disabled — no `data-disabled`
|
|
|
91
95
|
|-----------|------|-------|
|
|
92
96
|
| `for` | Always | Matches the `id` of the associated form control |
|
|
93
97
|
|
|
94
|
-
-
|
|
98
|
+
- **One value, written twice:** the label's `for` and the control's `id` must be the exact same string. A mismatch fails silently — the label renders and styles normally but no longer focuses the field or names it for assistive technology. When renaming a control's `id`, update every `for` that pointed at it.
|
|
99
|
+
- Clicking the label focuses the associated input — native `<label>` behavior, and the practical proof the pairing is intact.
|
|
95
100
|
- The required indicator `*` uses `aria-hidden="true"` since the `required` attribute on the input already conveys the requirement to assistive technology.
|
|
96
101
|
- Do not use `<label>` without a `for` attribute or a nested input.
|
|
97
102
|
- In `forced-colors` mode, label text maps to system `LinkText` color.
|
|
@@ -22,10 +22,12 @@ supportedStates: default
|
|
|
22
22
|
## Structure
|
|
23
23
|
|
|
24
24
|
### Basic
|
|
25
|
+
The empty-value placeholder stays selectable (no `disabled`) so it doubles as
|
|
26
|
+
the clear/reset entry — re-choosing it empties the box again.
|
|
25
27
|
```html
|
|
26
28
|
<label class="label" for="fruit">Fruit</label>
|
|
27
29
|
<select class="select" id="fruit">
|
|
28
|
-
<option value=""
|
|
30
|
+
<option value="" selected>Select a fruit</option>
|
|
29
31
|
<option value="apple">Apple</option>
|
|
30
32
|
<option value="banana">Banana</option>
|
|
31
33
|
<option value="cherry">Cherry</option>
|
|
@@ -52,7 +54,11 @@ supportedStates: default
|
|
|
52
54
|
|
|
53
55
|
- Native `<select>` provides full keyboard navigation (arrow keys, type-ahead).
|
|
54
56
|
- Use `<label>` with `for` for description.
|
|
55
|
-
-
|
|
57
|
+
- The placeholder is `<option value="" selected>` **without** `disabled`: a
|
|
58
|
+
disabled placeholder can't be re-selected, so a made selection could never be
|
|
59
|
+
cleared. Keep it selectable and add `required` to the `<select>` when an empty
|
|
60
|
+
value must not submit — native validation then blocks submission while the
|
|
61
|
+
placeholder is still the selection.
|
|
56
62
|
|
|
57
63
|
---
|
|
58
64
|
|
|
@@ -73,5 +79,8 @@ Set `data-size` on the `.select` trigger button.
|
|
|
73
79
|
## Notes
|
|
74
80
|
|
|
75
81
|
- Uses `appearance: none` with a custom chevron via `background-image` SVG.
|
|
82
|
+
- While the empty option is selected, the closed control renders in
|
|
83
|
+
`--muted-foreground` (`:has(> option[value=""]:checked)`) so it reads as a
|
|
84
|
+
placeholder; a real value restores `--foreground`.
|
|
76
85
|
- The dropdown list is rendered by the browser — it cannot be styled.
|
|
77
86
|
- For a fully custom dropdown, use the Combobox component instead.
|
|
@@ -23,6 +23,16 @@
|
|
|
23
23
|
background-position: right 0.5rem center;
|
|
24
24
|
background-size: 1rem;
|
|
25
25
|
|
|
26
|
+
/* Placeholder = the empty-value option. It stays selectable (no
|
|
27
|
+
`disabled`) so it doubles as the clear/reset entry — choosing it
|
|
28
|
+
again empties the box (issue #32). While it is the selection the
|
|
29
|
+
closed control reads as a placeholder; a real value restores
|
|
30
|
+
--foreground because the base rule's color wins over this one.
|
|
31
|
+
option:checked matches the *selected* option in every engine. */
|
|
32
|
+
&:has(> option[value=""]:checked) {
|
|
33
|
+
color: var(--muted-foreground);
|
|
34
|
+
}
|
|
35
|
+
|
|
26
36
|
&:focus {
|
|
27
37
|
border-color: var(--ring);
|
|
28
38
|
box-shadow: 0 0 0 2px oklch(from var(--ring) l c h / 0.2);
|
|
@@ -55,29 +55,33 @@
|
|
|
55
55
|
flex-direction: column;
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
-
/* -- Connected borders: merge adjacent toggle radii ---------
|
|
59
|
-
|
|
58
|
+
/* -- Connected borders: merge adjacent toggle radii ---------
|
|
59
|
+
Square only the corners that actually touch a neighbour:
|
|
60
|
+
inline corners horizontally, block corners vertically. The
|
|
61
|
+
orientation attribute is wrapped in :where() so every rule
|
|
62
|
+
keeps one-class-plus-one-pseudo specificity — the later
|
|
63
|
+
[data-spacing] radius restore must still win the tie.
|
|
64
|
+
(The previous per-corner "restore" overrides let the
|
|
65
|
+
:not(:last-child) block re-round a middle item's top-right
|
|
66
|
+
corner — issue #12.) */
|
|
67
|
+
&:where(:not([data-orientation="vertical"])) > .toggle:not(:first-child) {
|
|
60
68
|
border-start-start-radius: 0;
|
|
61
69
|
border-end-start-radius: 0;
|
|
62
70
|
}
|
|
63
71
|
|
|
64
|
-
|
|
72
|
+
&:where(:not([data-orientation="vertical"])) > .toggle:not(:last-child) {
|
|
65
73
|
border-start-end-radius: 0;
|
|
66
74
|
border-end-end-radius: 0;
|
|
67
75
|
}
|
|
68
76
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
border-end-start-radius: var(--radius-md);
|
|
74
|
-
}
|
|
77
|
+
&:where([data-orientation="vertical"]) > .toggle:not(:first-child) {
|
|
78
|
+
border-start-start-radius: 0;
|
|
79
|
+
border-start-end-radius: 0;
|
|
80
|
+
}
|
|
75
81
|
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
border-start-end-radius: var(--radius-md);
|
|
80
|
-
}
|
|
82
|
+
&:where([data-orientation="vertical"]) > .toggle:not(:last-child) {
|
|
83
|
+
border-end-start-radius: 0;
|
|
84
|
+
border-end-end-radius: 0;
|
|
81
85
|
}
|
|
82
86
|
|
|
83
87
|
/* -- Spacing: adds gap and restores individual radii --------- */
|
|
@@ -322,13 +322,17 @@
|
|
|
322
322
|
margin-inline-start: -1px;
|
|
323
323
|
}
|
|
324
324
|
|
|
325
|
-
/* Remove internal radii for connected appearance
|
|
326
|
-
|
|
325
|
+
/* Remove internal radii for connected appearance. The orientation gate is
|
|
326
|
+
:where()-wrapped so these INLINE-corner rules only ever apply to
|
|
327
|
+
horizontal groups; ungated they also squared vertical buttons' corners
|
|
328
|
+
at a higher specificity than the vertical block below, leaving "Top"
|
|
329
|
+
with a rounded top-left but a square top-right (issue #13). */
|
|
330
|
+
&:where(:not([data-orientation="vertical"])) > .btn:not(:first-child):not(:has(+ [role="separator"])) {
|
|
327
331
|
border-start-start-radius: 0;
|
|
328
332
|
border-end-start-radius: 0;
|
|
329
333
|
}
|
|
330
334
|
|
|
331
|
-
& > .btn:not(:last-child):not([role="separator"] + .btn) {
|
|
335
|
+
&:where(:not([data-orientation="vertical"])) > .btn:not(:last-child):not([role="separator"] + .btn) {
|
|
332
336
|
border-start-end-radius: 0;
|
|
333
337
|
border-end-end-radius: 0;
|
|
334
338
|
}
|
|
@@ -373,26 +377,21 @@
|
|
|
373
377
|
margin-top: -1px;
|
|
374
378
|
}
|
|
375
379
|
|
|
380
|
+
/* Square exactly the BLOCK corners that touch a neighbour — a
|
|
381
|
+
non-first button squares its top edge, a non-last its bottom
|
|
382
|
+
edge; the base .btn radius keeps every outer corner rounded on
|
|
383
|
+
both sides. No per-corner "restore" overrides: the last block's
|
|
384
|
+
restores re-rounded a corner the previous block had just
|
|
385
|
+
squared, which (together with the ungated horizontal rules)
|
|
386
|
+
produced the asymmetric Top/Middle corners of issue #13. */
|
|
376
387
|
& > .btn:not(:first-child) {
|
|
377
388
|
border-start-start-radius: 0;
|
|
378
389
|
border-start-end-radius: 0;
|
|
379
|
-
border-end-start-radius: var(--radius-md);
|
|
380
390
|
}
|
|
381
391
|
|
|
382
392
|
& > .btn:not(:last-child) {
|
|
383
393
|
border-end-start-radius: 0;
|
|
384
394
|
border-end-end-radius: 0;
|
|
385
|
-
border-start-end-radius: var(--radius-md);
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
& > .btn:first-child {
|
|
389
|
-
border-start-start-radius: var(--radius-md);
|
|
390
|
-
border-start-end-radius: var(--radius-md);
|
|
391
|
-
}
|
|
392
|
-
|
|
393
|
-
& > .btn:last-child {
|
|
394
|
-
border-end-start-radius: var(--radius-md);
|
|
395
|
-
border-end-end-radius: var(--radius-md);
|
|
396
395
|
}
|
|
397
396
|
|
|
398
397
|
& > [role="separator"] {
|
|
@@ -109,6 +109,20 @@
|
|
|
109
109
|
|
|
110
110
|
<!-- CHANGELOG_ENTRIES -->
|
|
111
111
|
|
|
112
|
+
<div style="margin-bottom:2.5rem;">
|
|
113
|
+
<div class="flex items-center gap-3 mb-2">
|
|
114
|
+
<h2 style="font-family:var(--font-display);font-size:1.375rem;font-weight:400;letter-spacing:-0.02em;margin:0;">v0.8.3</h2>
|
|
115
|
+
<span class="badge" data-variant="outline" style="font-family:var(--font-mono);">September 08, 2026</span> <code class="changelog-hash">ba23256</code>
|
|
116
|
+
</div>
|
|
117
|
+
<ul style="margin:0;padding-left:1.25rem;" class="text-sm text-muted-foreground flex flex-col gap-1">
|
|
118
|
+
<li>fix(button-group): vertical group had asymmetric corners — Top rounded left, square right (issue #13)</li>
|
|
119
|
+
<li>fix(select): placeholder option must stay selectable so a selection can be cleared (issue #32)</li>
|
|
120
|
+
<li>docs(label): state the for↔id equality contract (issue #17)</li>
|
|
121
|
+
<li>fix(toggle-group): middle item of a vertical group had a rounded top-right corner (issue #12)</li>
|
|
122
|
+
<li>chore(purge-cdn): purge the complete dist payload, not just components+theme</li>
|
|
123
|
+
</ul>
|
|
124
|
+
</div>
|
|
125
|
+
|
|
112
126
|
<div style="margin-bottom:2.5rem;">
|
|
113
127
|
<div class="flex items-center gap-3 mb-2">
|
|
114
128
|
<h2 style="font-family:var(--font-display);font-size:1.375rem;font-weight:400;letter-spacing:-0.02em;margin:0;">v0.8.2</h2>
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
// "version consistency" gate fails if it (or any other version literal in
|
|
15
15
|
// this file) drifts from package.json — the footer once froze an old number
|
|
16
16
|
// forever because it was a second, un-synchronised literal.
|
|
17
|
-
var SITE_VERSION = 'v0.8.
|
|
17
|
+
var SITE_VERSION = 'v0.8.3';
|
|
18
18
|
/* -- Wide mode (must run before first paint, like dark mode) ---
|
|
19
19
|
Strips the content max-width so wide layouts (the marketing blocks)
|
|
20
20
|
render at full width. Persisted per-origin, same key discipline as
|
|
@@ -5,4 +5,4 @@
|
|
|
5
5
|
// doc-site data, not a shipped component contract (AGENTS.md "No window globals").
|
|
6
6
|
globalThis._defussShadcn = globalThis._defussShadcn || {};
|
|
7
7
|
globalThis._defussShadcn.docs = globalThis._defussShadcn.docs || {};
|
|
8
|
-
globalThis._defussShadcn.docs.searchIndex = [{"t":"Introduction","h":"index.html","s":"Overview"},{"t":"Built on five layers.","h":"index.html#toc-built-on-five-layers","s":"Introduction"},{"t":"Installation","h":"installation.html","s":"Overview"},{"t":"Quick start","h":"installation.html#toc-quick-start","s":"Installation"},{"t":"Pinning a version","h":"installation.html#toc-pinning-a-version","s":"Installation"},{"t":"Self-hosting","h":"installation.html#toc-self-hosting","s":"Installation"},{"t":"Component folder structure","h":"installation.html#toc-component-folder-structure","s":"Installation"},{"t":"Theming","h":"theming.html","s":"Overview"},{"t":"Surface / Foreground pairs","h":"theming.html#toc-surface-foreground-pairs","s":"Theming"},{"t":"Utility tokens","h":"theming.html#toc-utility-tokens","s":"Theming"},{"t":"Radius scale","h":"theming.html#toc-radius-scale","s":"Theming"},{"t":"Sidebar tokens","h":"theming.html#toc-sidebar-tokens","s":"Theming"},{"t":"Chart tokens","h":"theming.html#toc-chart-tokens","s":"Theming"},{"t":"Typography tokens","h":"theming.html#toc-typography-tokens","s":"Theming"},{"t":"Shadow scale","h":"theming.html#toc-shadow-scale","s":"Theming"},{"t":"Spacing & Tracking","h":"theming.html#toc-spacing-tracking","s":"Theming"},{"t":"Customization","h":"theming.html#toc-customization","s":"Theming"},{"t":"Dark mode","h":"theming.html#toc-dark-mode","s":"Theming"},{"t":"Dark Mode","h":"dark-mode.html","s":"Overview"},{"t":"How it works","h":"dark-mode.html#toc-how-it-works","s":"Dark Mode"},{"t":"Token pairs","h":"dark-mode.html#toc-token-pairs","s":"Dark Mode"},{"t":"Color scheme declaration","h":"dark-mode.html#toc-color-scheme-declaration","s":"Dark Mode"},{"t":"System preference detection","h":"dark-mode.html#toc-system-preference-detection","s":"Dark Mode"},{"t":"Persistence","h":"dark-mode.html#toc-persistence","s":"Dark Mode"},{"t":"Adding a toggle button","h":"dark-mode.html#toc-adding-a-toggle-button","s":"Dark Mode"},{"t":"Custom themes","h":"dark-mode.html#toc-custom-themes","s":"Dark Mode"},{"t":"Data Attribute API","h":"data-attribute-api.html","s":"Overview"},{"t":"Props → Data Attributes","h":"data-attribute-api.html#toc-props-data-attributes","s":"Data Attribute API"},{"t":"How it works","h":"data-attribute-api.html#toc-how-it-works","s":"Data Attribute API"},{"t":"Why data attributes instead of modifier classes?","h":"data-attribute-api.html#toc-why-data-attributes-instead-of-modifier-classes","s":"Data Attribute API"},{"t":"Styling attributes","h":"data-attribute-api.html#toc-styling-attributes","s":"Data Attribute API"},{"t":"Behavioral attributes","h":"data-attribute-api.html#toc-behavioral-attributes","s":"Data Attribute API"},{"t":"State attributes","h":"data-attribute-api.html#toc-state-attributes","s":"Data Attribute API"},{"t":"ARIA attributes as styling hooks","h":"data-attribute-api.html#toc-aria-attributes-as-styling-hooks","s":"Data Attribute API"},{"t":"The pattern at a glance","h":"data-attribute-api.html#toc-the-pattern-at-a-glance","s":"Data Attribute API"},{"t":"Architecture","h":"architecture.html","s":"Overview"},{"t":"1. AGENTS.md — the philosophy/instruction layer","h":"architecture.html#toc-1-agents-md-the-philosophy-instruction-layer","s":"Architecture"},{"t":"2. The deterministic verifier — an authority layer","h":"architecture.html#toc-2-the-deterministic-verifier-an-authority-layer","s":"Architecture"},{"t":"3. AGENTS.md defers: verifier output is authoritative","h":"architecture.html#toc-3-agents-md-defers-verifier-output-is-authoritative","s":"Architecture"},{"t":"4. The surrounding gates — suppressing hallucination, AI slop and overstating claims","h":"architecture.html#toc-4-the-surrounding-gates-suppressing-hallucination-ai-slop-and-overstating-claims","s":"Architecture"},{"t":"The proof loop","h":"architecture.html#toc-the-proof-loop","s":"Architecture"},{"t":"5. Human expert final review before release","h":"architecture.html#toc-5-human-expert-final-review-before-release","s":"Architecture"},{"t":"Cascade Layers","h":"cascade-layers.html","s":"Overview"},{"t":"What is @layer?","h":"cascade-layers.html#toc-what-is-layer","s":"Cascade Layers"},{"t":"How defuss-shadcn uses it","h":"cascade-layers.html#toc-how-defuss-shadcn-uses-it","s":"Cascade Layers"},{"t":"The cascade order","h":"cascade-layers.html#toc-the-cascade-order","s":"Cascade Layers"},{"t":"Overriding component styles","h":"cascade-layers.html#toc-overriding-component-styles","s":"Cascade Layers"},{"t":"Using with other CSS frameworks","h":"cascade-layers.html#toc-using-with-other-css-frameworks","s":"Cascade Layers"},{"t":"Why not just write unlayered CSS?","h":"cascade-layers.html#toc-why-not-just-write-unlayered-css","s":"Cascade Layers"},{"t":"Why not @scope or Web Components?","h":"cascade-layers.html#toc-why-not-scope-or-web-components","s":"Cascade Layers"},{"t":"Browser support","h":"cascade-layers.html#toc-browser-support","s":"Cascade Layers"},{"t":"ES Modules","h":"es-modules.html","s":"Overview"},{"t":"What is type=\"module\"?","h":"es-modules.html#toc-what-is-type-module","s":"ES Modules"},{"t":"No import, no export","h":"es-modules.html#toc-no-import-no-export","s":"ES Modules"},{"t":"Static pages vs. SPAs","h":"es-modules.html#toc-static-pages-vs-spas","s":"ES Modules"},{"t":"Which components need JS?","h":"es-modules.html#toc-which-components-need-js","s":"ES Modules"},{"t":"Serving locally","h":"es-modules.html#toc-serving-locally","s":"ES Modules"},{"t":"Browser support","h":"es-modules.html#toc-browser-support","s":"ES Modules"},{"t":"Native Web APIs","h":"native-web-apis.html","s":"Overview"},{"t":"The native-first principle","h":"native-web-apis.html#toc-the-native-first-principle","s":"Native Web APIs"},{"t":"API reference","h":"native-web-apis.html#toc-api-reference","s":"Native Web APIs"},{"t":"Animations","h":"animations.html","s":"Overview"},{"t":"The challenge","h":"animations.html#toc-the-challenge","s":"Animations"},{"t":"@starting-style","h":"animations.html#toc-starting-style","s":"Animations"},{"t":"allow-discrete transitions","h":"animations.html#toc-allow-discrete-transitions","s":"Animations"},{"t":"Popover & dialog animation pattern","h":"animations.html#toc-popover-dialog-animation-pattern","s":"Animations"},{"t":"Dialog & sheet animations","h":"animations.html#toc-dialog-sheet-animations","s":"Animations"},{"t":"Accordion animations","h":"animations.html#toc-accordion-animations","s":"Animations"},{"t":"Programmatic exit animations","h":"animations.html#toc-programmatic-exit-animations","s":"Animations"},{"t":"Animation summary","h":"animations.html#toc-animation-summary","s":"Animations"},{"t":"Accessibility","h":"accessibility.html","s":"Overview"},{"t":"Semantic HTML first","h":"accessibility.html#toc-semantic-html-first","s":"Accessibility"},{"t":"ARIA roles","h":"accessibility.html#toc-aria-roles","s":"Accessibility"},{"t":"State attributes","h":"accessibility.html#toc-state-attributes","s":"Accessibility"},{"t":"Relationship attributes","h":"accessibility.html#toc-relationship-attributes","s":"Accessibility"},{"t":"Keyboard navigation","h":"accessibility.html#toc-keyboard-navigation","s":"Accessibility"},{"t":"Roving tabindex","h":"accessibility.html#toc-roving-tabindex","s":"Accessibility"},{"t":"Focus management","h":"accessibility.html#toc-focus-management","s":"Accessibility"},{"t":"Live regions","h":"accessibility.html#toc-live-regions","s":"Accessibility"},{"t":"Screen reader considerations","h":"accessibility.html#toc-screen-reader-considerations","s":"Accessibility"},{"t":"Component Skills","h":"component-skills.html","s":"Overview"},{"t":"What is a component skill?","h":"component-skills.html#toc-what-is-a-component-skill","s":"Component Skills"},{"t":"The SKILL.md index","h":"component-skills.html#toc-the-skill-md-index","s":"Component Skills"},{"t":"Skill file structure","h":"component-skills.html#toc-skill-file-structure","s":"Component Skills"},{"t":"Example: Badge skill file","h":"component-skills.html#toc-example-badge-skill-file","s":"Component Skills"},{"t":"Using skills with AI assistants","h":"component-skills.html#toc-using-skills-with-ai-assistants","s":"Component Skills"},{"t":"Using skills as a human reference","h":"component-skills.html#toc-using-skills-as-a-human-reference","s":"Component Skills"},{"t":"Available skills","h":"component-skills.html#toc-available-skills","s":"Component Skills"},{"t":"Changelog","h":"changelog.html","s":"Overview"},{"t":"v0.8.2","h":"changelog.html#toc-v0-8-2","s":"Changelog"},{"t":"v0.8.1","h":"changelog.html#toc-v0-8-1","s":"Changelog"},{"t":"v0.8.0","h":"changelog.html#toc-v0-8-0","s":"Changelog"},{"t":"v0.7.19","h":"changelog.html#toc-v0-7-19","s":"Changelog"},{"t":"v0.7.18","h":"changelog.html#toc-v0-7-18","s":"Changelog"},{"t":"v0.7.17","h":"changelog.html#toc-v0-7-17","s":"Changelog"},{"t":"v0.7.16","h":"changelog.html#toc-v0-7-16","s":"Changelog"},{"t":"v0.7.15","h":"changelog.html#toc-v0-7-15","s":"Changelog"},{"t":"v0.7.14","h":"changelog.html#toc-v0-7-14","s":"Changelog"},{"t":"v0.7.13-alpha","h":"changelog.html#toc-v0-7-13-alpha","s":"Changelog"},{"t":"v0.7.12-alpha","h":"changelog.html#toc-v0-7-12-alpha","s":"Changelog"},{"t":"v0.7.11-alpha","h":"changelog.html#toc-v0-7-11-alpha","s":"Changelog"},{"t":"v0.7.10-alpha","h":"changelog.html#toc-v0-7-10-alpha","s":"Changelog"},{"t":"v0.7.9-alpha","h":"changelog.html#toc-v0-7-9-alpha","s":"Changelog"},{"t":"v0.7.8-alpha","h":"changelog.html#toc-v0-7-8-alpha","s":"Changelog"},{"t":"v0.7.7-alpha","h":"changelog.html#toc-v0-7-7-alpha","s":"Changelog"},{"t":"v0.7.6-alpha","h":"changelog.html#toc-v0-7-6-alpha","s":"Changelog"},{"t":"v0.7.5-alpha","h":"changelog.html#toc-v0-7-5-alpha","s":"Changelog"},{"t":"v0.7.4-alpha","h":"changelog.html#toc-v0-7-4-alpha","s":"Changelog"},{"t":"v0.7.3-alpha","h":"changelog.html#toc-v0-7-3-alpha","s":"Changelog"},{"t":"v0.7.2-alpha","h":"changelog.html#toc-v0-7-2-alpha","s":"Changelog"},{"t":"v0.7.1-alpha","h":"changelog.html#toc-v0-7-1-alpha","s":"Changelog"},{"t":"v0.7.0-alpha","h":"changelog.html#toc-v0-7-0-alpha","s":"Changelog"},{"t":"v0.6.0-alpha","h":"changelog.html#toc-v0-6-0-alpha","s":"Changelog"},{"t":"v0.5.0-alpha","h":"changelog.html#toc-v0-5-0-alpha","s":"Changelog"},{"t":"v0.4.0-alpha","h":"changelog.html#toc-v0-4-0-alpha","s":"Changelog"},{"t":"v0.3.0","h":"changelog.html#toc-v0-3-0","s":"Changelog"},{"t":"v0.2.1","h":"changelog.html#toc-v0-2-1","s":"Changelog"},{"t":"v0.2.0","h":"changelog.html#toc-v0-2-0","s":"Changelog"},{"t":"Typography","h":"typography.html","s":"Primitives"},{"t":"h2 — The People of the Kingdom","h":"typography.html#toc-h2-the-people-of-the-kingdom","s":"Typography"},{"t":"The King's Plan","h":"typography.html#toc-the-king-s-plan","s":"Typography"},{"t":"CSS view file","h":"typography.html#toc-css-view-file","s":"Typography"},{"t":"Separator","h":"separator.html","s":"Primitives"},{"t":"CSS view file","h":"separator.html#toc-css-view-file","s":"Separator"},{"t":"Icon","h":"icon.html","s":"Primitives"},{"t":"CSS view file","h":"icon.html#toc-css-view-file","s":"Icon"},{"t":"Button","h":"button.html","s":"Actions"},{"t":"CSS view file","h":"button.html#toc-css-view-file","s":"Button"},{"t":"Toggle","h":"toggle.html","s":"Actions"},{"t":"States","h":"toggle.html#toc-states","s":"Toggle"},{"t":"CSS view file","h":"toggle.html#toc-css-view-file","s":"Toggle"},{"t":"JavaScript view file","h":"toggle.html#toc-javascript-view-file","s":"Toggle"},{"t":"Toggle Group","h":"toggle-group.html","s":"Actions"},{"t":"States","h":"toggle-group.html#toc-states","s":"Toggle Group"},{"t":"CSS view file","h":"toggle-group.html#toc-css-view-file","s":"Toggle Group"},{"t":"JavaScript view file","h":"toggle-group.html#toc-javascript-view-file","s":"Toggle Group"},{"t":"Button Group","h":"button-group.html","s":"Actions"},{"t":"CSS view file","h":"button-group.html#toc-css-view-file","s":"Button Group"},{"t":"Toolbar","h":"toolbar.html","s":"Actions"},{"t":"States","h":"toolbar.html#toc-states","s":"Toolbar"},{"t":"CSS view file","h":"toolbar.html#toc-css-view-file","s":"Toolbar"},{"t":"JavaScript view file","h":"toolbar.html#toc-javascript-view-file","s":"Toolbar"},{"t":"Label","h":"label.html","s":"Forms & Inputs"},{"t":"CSS view file","h":"label.html#toc-css-view-file","s":"Label"},{"t":"Input","h":"input.html","s":"Forms & Inputs"},{"t":"CSS view file","h":"input.html#toc-css-view-file","s":"Input"},{"t":"Textarea","h":"textarea.html","s":"Forms & Inputs"},{"t":"CSS view file","h":"textarea.html#toc-css-view-file","s":"Textarea"},{"t":"Checkbox","h":"checkbox.html","s":"Forms & Inputs"},{"t":"CSS view file","h":"checkbox.html#toc-css-view-file","s":"Checkbox"},{"t":"Radio Group","h":"radio.html","s":"Forms & Inputs"},{"t":"CSS view file","h":"radio.html#toc-css-view-file","s":"Radio Group"},{"t":"Switch","h":"switch.html","s":"Forms & Inputs"},{"t":"CSS view file","h":"switch.html#toc-css-view-file","s":"Switch"},{"t":"Slider","h":"slider.html","s":"Forms & Inputs"},{"t":"States","h":"slider.html#toc-states","s":"Slider"},{"t":"CSS view file","h":"slider.html#toc-css-view-file","s":"Slider"},{"t":"JS view file","h":"slider.html#toc-js-view-file","s":"Slider"},{"t":"Select","h":"select.html","s":"Forms & Inputs"},{"t":"CSS view file","h":"select.html#toc-css-view-file","s":"Select"},{"t":"Number Input","h":"number-input.html","s":"Forms & Inputs"},{"t":"States","h":"number-input.html#toc-states","s":"Number Input"},{"t":"CSS view file","h":"number-input.html#toc-css-view-file","s":"Number Input"},{"t":"JavaScript view file","h":"number-input.html#toc-javascript-view-file","s":"Number Input"},{"t":"File Input","h":"file-input.html","s":"Forms & Inputs"},{"t":"CSS view file","h":"file-input.html#toc-css-view-file","s":"File Input"},{"t":"Color Picker","h":"color-picker.html","s":"Forms & Inputs"},{"t":"States","h":"color-picker.html#toc-states","s":"Color Picker"},{"t":"CSS view file","h":"color-picker.html#toc-css-view-file","s":"Color Picker"},{"t":"JavaScript view file","h":"color-picker.html#toc-javascript-view-file","s":"Color Picker"},{"t":"Date Picker","h":"date-picker.html","s":"Forms & Inputs"},{"t":"CSS view file","h":"date-picker.html#toc-css-view-file","s":"Date Picker"},{"t":"Combobox","h":"combobox.html","s":"Forms & Inputs"},{"t":"States","h":"combobox.html#toc-states","s":"Combobox"},{"t":"CSS view file","h":"combobox.html#toc-css-view-file","s":"Combobox"},{"t":"JavaScript view file","h":"combobox.html#toc-javascript-view-file","s":"Combobox"},{"t":"Form","h":"form.html","s":"Forms & Inputs"},{"t":"CSS view file","h":"form.html#toc-css-view-file","s":"Form"},{"t":"Badge","h":"badge.html","s":"Data Display"},{"t":"CSS view file","h":"badge.html#toc-css-view-file","s":"Badge"},{"t":"Avatar","h":"avatar.html","s":"Data Display"},{"t":"States","h":"avatar.html#toc-states","s":"Avatar"},{"t":"CSS view file","h":"avatar.html#toc-css-view-file","s":"Avatar"},{"t":"JavaScript view file","h":"avatar.html#toc-javascript-view-file","s":"Avatar"},{"t":"Card","h":"card.html","s":"Data Display"},{"t":"CSS view file","h":"card.html#toc-css-view-file","s":"Card"},{"t":"Image","h":"image.html","s":"Data Display"},{"t":"States","h":"image.html#toc-states","s":"Image"},{"t":"CSS view file","h":"image.html#toc-css-view-file","s":"Image"},{"t":"JavaScript view file","h":"image.html#toc-javascript-view-file","s":"Image"},{"t":"Statistic","h":"statistic.html","s":"Data Display"},{"t":"CSS view file","h":"statistic.html#toc-css-view-file","s":"Statistic"},{"t":"Table","h":"table.html","s":"Data Display"},{"t":"CSS view file","h":"table.html#toc-css-view-file","s":"Table"},{"t":"Collapsible","h":"collapsible.html","s":"Data Display"},{"t":"CSS view file","h":"collapsible.html#toc-css-view-file","s":"Collapsible"},{"t":"Timeline","h":"timeline.html","s":"Data Display"},{"t":"CSS view file","h":"timeline.html#toc-css-view-file","s":"Timeline"},{"t":"Tree View","h":"tree-view.html","s":"Data Display"},{"t":"States","h":"tree-view.html#toc-states","s":"Tree View"},{"t":"CSS view file","h":"tree-view.html#toc-css-view-file","s":"Tree View"},{"t":"JavaScript view file","h":"tree-view.html#toc-javascript-view-file","s":"Tree View"},{"t":"Calendar","h":"calendar.html","s":"Data Display"},{"t":"States","h":"calendar.html#toc-states","s":"Calendar"},{"t":"CSS view file","h":"calendar.html#toc-css-view-file","s":"Calendar"},{"t":"JavaScript view file","h":"calendar.html#toc-javascript-view-file","s":"Calendar"},{"t":"Carousel","h":"carousel.html","s":"Data Display"},{"t":"States","h":"carousel.html#toc-states","s":"Carousel"},{"t":"CSS view file","h":"carousel.html#toc-css-view-file","s":"Carousel"},{"t":"JavaScript view file","h":"carousel.html#toc-javascript-view-file","s":"Carousel"},{"t":"Scroll Area","h":"scroll-area.html","s":"Data Display"},{"t":"CSS view file","h":"scroll-area.html#toc-css-view-file","s":"Scroll Area"},{"t":"Sortable","h":"sortable.html","s":"Data Display"},{"t":"States","h":"sortable.html#toc-states","s":"Sortable"},{"t":"CSS view file","h":"sortable.html#toc-css-view-file","s":"Sortable"},{"t":"JavaScript view file","h":"sortable.html#toc-javascript-view-file","s":"Sortable"},{"t":"Spinner","h":"spinner.html","s":"Feedback & Status"},{"t":"CSS view file","h":"spinner.html#toc-css-view-file","s":"Spinner"},{"t":"Skeleton","h":"skeleton.html","s":"Feedback & Status"},{"t":"CSS view file","h":"skeleton.html#toc-css-view-file","s":"Skeleton"},{"t":"Progress","h":"progress.html","s":"Feedback & Status"},{"t":"CSS view file","h":"progress.html#toc-css-view-file","s":"Progress"},{"t":"Alert","h":"alert.html","s":"Feedback & Status"},{"t":"CSS view file","h":"alert.html#toc-css-view-file","s":"Alert"},{"t":"Alert Dialog","h":"alert-dialog.html","s":"Feedback & Status"},{"t":"Are you absolutely sure?","h":"alert-dialog.html#ad1-title","s":"Alert Dialog"},{"t":"Publish this post?","h":"alert-dialog.html#ad2-title","s":"Alert Dialog"},{"t":"States","h":"alert-dialog.html#toc-states","s":"Alert Dialog"},{"t":"CSS view file","h":"alert-dialog.html#toc-css-view-file","s":"Alert Dialog"},{"t":"JavaScript view file","h":"alert-dialog.html#toc-javascript-view-file","s":"Alert Dialog"},{"t":"Toast","h":"toast.html","s":"Feedback & Status"},{"t":"States","h":"toast.html#toc-states","s":"Toast"},{"t":"CSS view file","h":"toast.html#toc-css-view-file","s":"Toast"},{"t":"JavaScript view file","h":"toast.html#toc-javascript-view-file","s":"Toast"},{"t":"Popover","h":"popover.html","s":"Overlays"},{"t":"States","h":"popover.html#toc-states","s":"Popover"},{"t":"CSS view file","h":"popover.html#toc-css-view-file","s":"Popover"},{"t":"JavaScript view file","h":"popover.html#toc-javascript-view-file","s":"Popover"},{"t":"Tooltip","h":"tooltip.html","s":"Overlays"},{"t":"States","h":"tooltip.html#toc-states","s":"Tooltip"},{"t":"CSS view file","h":"tooltip.html#toc-css-view-file","s":"Tooltip"},{"t":"JavaScript view file","h":"tooltip.html#toc-javascript-view-file","s":"Tooltip"},{"t":"Context Menu","h":"context-menu.html","s":"Overlays"},{"t":"States","h":"context-menu.html#toc-states","s":"Context Menu"},{"t":"CSS view file","h":"context-menu.html#toc-css-view-file","s":"Context Menu"},{"t":"JavaScript view file","h":"context-menu.html#toc-javascript-view-file","s":"Context Menu"},{"t":"Dialog","h":"dialog.html","s":"Overlays"},{"t":"States","h":"dialog.html#toc-states","s":"Dialog"},{"t":"CSS view file","h":"dialog.html#toc-css-view-file","s":"Dialog"},{"t":"JavaScript view file","h":"dialog.html#toc-javascript-view-file","s":"Dialog"},{"t":"CSS view file","h":"dialog.html#toc-css-view-file","s":"Dialog"},{"t":"JavaScript view file","h":"dialog.html#toc-javascript-view-file","s":"Dialog"},{"t":"Edit Profile","h":"dialog.html#demo-title","s":"Dialog"},{"t":"Delete account?","h":"dialog.html#confirm-title","s":"Dialog"},{"t":"Sheet","h":"sheet.html","s":"Overlays"},{"t":"States","h":"sheet.html#toc-states","s":"Sheet"},{"t":"CSS view file","h":"sheet.html#toc-css-view-file","s":"Sheet"},{"t":"JavaScript view file","h":"sheet.html#toc-javascript-view-file","s":"Sheet"},{"t":"Edit Profile","h":"sheet.html#sheet-right-title","s":"Sheet"},{"t":"Navigation","h":"sheet.html#sheet-left-title","s":"Sheet"},{"t":"Notifications","h":"sheet.html#sheet-top-title","s":"Sheet"},{"t":"Cookie Preferences","h":"sheet.html#sheet-bottom-title","s":"Sheet"},{"t":"Accordion","h":"accordion.html","s":"Overlays"},{"t":"States","h":"accordion.html#toc-states","s":"Accordion"},{"t":"CSS view file","h":"accordion.html#toc-css-view-file","s":"Accordion"},{"t":"JavaScript view file","h":"accordion.html#toc-javascript-view-file","s":"Accordion"},{"t":"CSS view file","h":"accordion.html#toc-css-view-file","s":"Accordion"},{"t":"JavaScript view file","h":"accordion.html#toc-javascript-view-file","s":"Accordion"},{"t":"Command","h":"command.html","s":"Overlays"},{"t":"States","h":"command.html#toc-states","s":"Command"},{"t":"CSS view file","h":"command.html#toc-css-view-file","s":"Command"},{"t":"JavaScript view file","h":"command.html#toc-javascript-view-file","s":"Command"},{"t":"Breadcrumb","h":"breadcrumb.html","s":"Navigation"},{"t":"CSS view file","h":"breadcrumb.html#toc-css-view-file","s":"Breadcrumb"},{"t":"Pagination","h":"pagination.html","s":"Navigation"},{"t":"CSS view file","h":"pagination.html#toc-css-view-file","s":"Pagination"},{"t":"Steps","h":"steps.html","s":"Navigation"},{"t":"CSS view file","h":"steps.html#toc-css-view-file","s":"Steps"},{"t":"Tabs","h":"tabs.html","s":"Navigation"},{"t":"States","h":"tabs.html#toc-states","s":"Tabs"},{"t":"CSS view file","h":"tabs.html#toc-css-view-file","s":"Tabs"},{"t":"JavaScript view file","h":"tabs.html#toc-javascript-view-file","s":"Tabs"},{"t":"Dropdown Menu","h":"dropdown.html","s":"Navigation"},{"t":"States","h":"dropdown.html#toc-states","s":"Dropdown Menu"},{"t":"CSS view file","h":"dropdown.html#toc-css-view-file","s":"Dropdown Menu"},{"t":"JavaScript view file","h":"dropdown.html#toc-javascript-view-file","s":"Dropdown Menu"},{"t":"Navigation Menu","h":"navigation-menu.html","s":"Navigation"},{"t":"States","h":"navigation-menu.html#toc-states","s":"Navigation Menu"},{"t":"CSS view file","h":"navigation-menu.html#toc-css-view-file","s":"Navigation Menu"},{"t":"JavaScript view file","h":"navigation-menu.html#toc-javascript-view-file","s":"Navigation Menu"},{"t":"Sidebar","h":"sidebar.html","s":"Application"},{"t":"States","h":"sidebar.html#toc-states","s":"Sidebar"},{"t":"CSS view file","h":"sidebar.html#toc-css-view-file","s":"Sidebar"},{"t":"JavaScript view file","h":"sidebar.html#toc-javascript-view-file","s":"Sidebar"},{"t":"Site Header","h":"site-header.html","s":"Marketing"},{"t":"CSS view file","h":"site-header.html#toc-css-view-file","s":"Site Header"},{"t":"Hero","h":"hero.html","s":"Marketing"},{"t":"CSS view file","h":"hero.html#toc-css-view-file","s":"Hero"},{"t":"Product Showcase","h":"product-showcase.html","s":"Marketing"},{"t":"CSS view file","h":"product-showcase.html#toc-css-view-file","s":"Product Showcase"},{"t":"States","h":"product-showcase.html#toc-states","s":"Product Showcase"},{"t":"JavaScript view file","h":"product-showcase.html#toc-javascript-view-file","s":"Product Showcase"},{"t":"Brand Logos","h":"brand-logos.html","s":"Marketing"},{"t":"CSS view file","h":"brand-logos.html#toc-css-view-file","s":"Brand Logos"},{"t":"Feature Details","h":"feature-details.html","s":"Marketing"},{"t":"AI That Works Your Way","h":"feature-details.html#toc-ai-that-works-your-way","s":"Feature Details"},{"t":"CSS view file","h":"feature-details.html#toc-css-view-file","s":"Feature Details"},{"t":"Testimonials","h":"testimonials.html","s":"Marketing"},{"t":"CSS view file","h":"testimonials.html#toc-css-view-file","s":"Testimonials"},{"t":"Stats","h":"stats.html","s":"Marketing"},{"t":"Trusted by Teams Everywhere","h":"stats.html#toc-trusted-by-teams-everywhere","s":"Stats"},{"t":"CSS view file","h":"stats.html#toc-css-view-file","s":"Stats"},{"t":"Pricing","h":"pricing.html","s":"Marketing"},{"t":"Simple Pricing, Smarter Work","h":"pricing.html#toc-simple-pricing-smarter-work","s":"Pricing"},{"t":"CSS view file","h":"pricing.html#toc-css-view-file","s":"Pricing"},{"t":"Blog","h":"blog.html","s":"Marketing"},{"t":"Acme Insights","h":"blog.html#toc-acme-insights","s":"Blog"},{"t":"CSS view file","h":"blog.html#toc-css-view-file","s":"Blog"},{"t":"FAQ","h":"faq.html","s":"Marketing"},{"t":"Frequently Asked Questions","h":"faq.html#toc-frequently-asked-questions","s":"FAQ"},{"t":"CSS view file","h":"faq.html#toc-css-view-file","s":"FAQ"},{"t":"Get In Touch","h":"get-in-touch.html","s":"Marketing"},{"t":"Want to know more?","h":"get-in-touch.html#toc-want-to-know-more","s":"Get In Touch"},{"t":"CSS view file","h":"get-in-touch.html#toc-css-view-file","s":"Get In Touch"},{"t":"Newsletter","h":"newsletter.html","s":"Marketing"},{"t":"Stay in the loop","h":"newsletter.html#toc-stay-in-the-loop","s":"Newsletter"},{"t":"CSS view file","h":"newsletter.html#toc-css-view-file","s":"Newsletter"},{"t":"Site Footer","h":"site-footer.html","s":"Marketing"},{"t":"CSS view file","h":"site-footer.html#toc-css-view-file","s":"Site Footer"}];
|
|
8
|
+
globalThis._defussShadcn.docs.searchIndex = [{"t":"Introduction","h":"index.html","s":"Overview"},{"t":"Built on five layers.","h":"index.html#toc-built-on-five-layers","s":"Introduction"},{"t":"Installation","h":"installation.html","s":"Overview"},{"t":"Quick start","h":"installation.html#toc-quick-start","s":"Installation"},{"t":"Pinning a version","h":"installation.html#toc-pinning-a-version","s":"Installation"},{"t":"Self-hosting","h":"installation.html#toc-self-hosting","s":"Installation"},{"t":"Component folder structure","h":"installation.html#toc-component-folder-structure","s":"Installation"},{"t":"Theming","h":"theming.html","s":"Overview"},{"t":"Surface / Foreground pairs","h":"theming.html#toc-surface-foreground-pairs","s":"Theming"},{"t":"Utility tokens","h":"theming.html#toc-utility-tokens","s":"Theming"},{"t":"Radius scale","h":"theming.html#toc-radius-scale","s":"Theming"},{"t":"Sidebar tokens","h":"theming.html#toc-sidebar-tokens","s":"Theming"},{"t":"Chart tokens","h":"theming.html#toc-chart-tokens","s":"Theming"},{"t":"Typography tokens","h":"theming.html#toc-typography-tokens","s":"Theming"},{"t":"Shadow scale","h":"theming.html#toc-shadow-scale","s":"Theming"},{"t":"Spacing & Tracking","h":"theming.html#toc-spacing-tracking","s":"Theming"},{"t":"Customization","h":"theming.html#toc-customization","s":"Theming"},{"t":"Dark mode","h":"theming.html#toc-dark-mode","s":"Theming"},{"t":"Dark Mode","h":"dark-mode.html","s":"Overview"},{"t":"How it works","h":"dark-mode.html#toc-how-it-works","s":"Dark Mode"},{"t":"Token pairs","h":"dark-mode.html#toc-token-pairs","s":"Dark Mode"},{"t":"Color scheme declaration","h":"dark-mode.html#toc-color-scheme-declaration","s":"Dark Mode"},{"t":"System preference detection","h":"dark-mode.html#toc-system-preference-detection","s":"Dark Mode"},{"t":"Persistence","h":"dark-mode.html#toc-persistence","s":"Dark Mode"},{"t":"Adding a toggle button","h":"dark-mode.html#toc-adding-a-toggle-button","s":"Dark Mode"},{"t":"Custom themes","h":"dark-mode.html#toc-custom-themes","s":"Dark Mode"},{"t":"Data Attribute API","h":"data-attribute-api.html","s":"Overview"},{"t":"Props → Data Attributes","h":"data-attribute-api.html#toc-props-data-attributes","s":"Data Attribute API"},{"t":"How it works","h":"data-attribute-api.html#toc-how-it-works","s":"Data Attribute API"},{"t":"Why data attributes instead of modifier classes?","h":"data-attribute-api.html#toc-why-data-attributes-instead-of-modifier-classes","s":"Data Attribute API"},{"t":"Styling attributes","h":"data-attribute-api.html#toc-styling-attributes","s":"Data Attribute API"},{"t":"Behavioral attributes","h":"data-attribute-api.html#toc-behavioral-attributes","s":"Data Attribute API"},{"t":"State attributes","h":"data-attribute-api.html#toc-state-attributes","s":"Data Attribute API"},{"t":"ARIA attributes as styling hooks","h":"data-attribute-api.html#toc-aria-attributes-as-styling-hooks","s":"Data Attribute API"},{"t":"The pattern at a glance","h":"data-attribute-api.html#toc-the-pattern-at-a-glance","s":"Data Attribute API"},{"t":"Architecture","h":"architecture.html","s":"Overview"},{"t":"1. AGENTS.md — the philosophy/instruction layer","h":"architecture.html#toc-1-agents-md-the-philosophy-instruction-layer","s":"Architecture"},{"t":"2. The deterministic verifier — an authority layer","h":"architecture.html#toc-2-the-deterministic-verifier-an-authority-layer","s":"Architecture"},{"t":"3. AGENTS.md defers: verifier output is authoritative","h":"architecture.html#toc-3-agents-md-defers-verifier-output-is-authoritative","s":"Architecture"},{"t":"4. The surrounding gates — suppressing hallucination, AI slop and overstating claims","h":"architecture.html#toc-4-the-surrounding-gates-suppressing-hallucination-ai-slop-and-overstating-claims","s":"Architecture"},{"t":"The proof loop","h":"architecture.html#toc-the-proof-loop","s":"Architecture"},{"t":"5. Human expert final review before release","h":"architecture.html#toc-5-human-expert-final-review-before-release","s":"Architecture"},{"t":"Cascade Layers","h":"cascade-layers.html","s":"Overview"},{"t":"What is @layer?","h":"cascade-layers.html#toc-what-is-layer","s":"Cascade Layers"},{"t":"How defuss-shadcn uses it","h":"cascade-layers.html#toc-how-defuss-shadcn-uses-it","s":"Cascade Layers"},{"t":"The cascade order","h":"cascade-layers.html#toc-the-cascade-order","s":"Cascade Layers"},{"t":"Overriding component styles","h":"cascade-layers.html#toc-overriding-component-styles","s":"Cascade Layers"},{"t":"Using with other CSS frameworks","h":"cascade-layers.html#toc-using-with-other-css-frameworks","s":"Cascade Layers"},{"t":"Why not just write unlayered CSS?","h":"cascade-layers.html#toc-why-not-just-write-unlayered-css","s":"Cascade Layers"},{"t":"Why not @scope or Web Components?","h":"cascade-layers.html#toc-why-not-scope-or-web-components","s":"Cascade Layers"},{"t":"Browser support","h":"cascade-layers.html#toc-browser-support","s":"Cascade Layers"},{"t":"ES Modules","h":"es-modules.html","s":"Overview"},{"t":"What is type=\"module\"?","h":"es-modules.html#toc-what-is-type-module","s":"ES Modules"},{"t":"No import, no export","h":"es-modules.html#toc-no-import-no-export","s":"ES Modules"},{"t":"Static pages vs. SPAs","h":"es-modules.html#toc-static-pages-vs-spas","s":"ES Modules"},{"t":"Which components need JS?","h":"es-modules.html#toc-which-components-need-js","s":"ES Modules"},{"t":"Serving locally","h":"es-modules.html#toc-serving-locally","s":"ES Modules"},{"t":"Browser support","h":"es-modules.html#toc-browser-support","s":"ES Modules"},{"t":"Native Web APIs","h":"native-web-apis.html","s":"Overview"},{"t":"The native-first principle","h":"native-web-apis.html#toc-the-native-first-principle","s":"Native Web APIs"},{"t":"API reference","h":"native-web-apis.html#toc-api-reference","s":"Native Web APIs"},{"t":"Animations","h":"animations.html","s":"Overview"},{"t":"The challenge","h":"animations.html#toc-the-challenge","s":"Animations"},{"t":"@starting-style","h":"animations.html#toc-starting-style","s":"Animations"},{"t":"allow-discrete transitions","h":"animations.html#toc-allow-discrete-transitions","s":"Animations"},{"t":"Popover & dialog animation pattern","h":"animations.html#toc-popover-dialog-animation-pattern","s":"Animations"},{"t":"Dialog & sheet animations","h":"animations.html#toc-dialog-sheet-animations","s":"Animations"},{"t":"Accordion animations","h":"animations.html#toc-accordion-animations","s":"Animations"},{"t":"Programmatic exit animations","h":"animations.html#toc-programmatic-exit-animations","s":"Animations"},{"t":"Animation summary","h":"animations.html#toc-animation-summary","s":"Animations"},{"t":"Accessibility","h":"accessibility.html","s":"Overview"},{"t":"Semantic HTML first","h":"accessibility.html#toc-semantic-html-first","s":"Accessibility"},{"t":"ARIA roles","h":"accessibility.html#toc-aria-roles","s":"Accessibility"},{"t":"State attributes","h":"accessibility.html#toc-state-attributes","s":"Accessibility"},{"t":"Relationship attributes","h":"accessibility.html#toc-relationship-attributes","s":"Accessibility"},{"t":"Keyboard navigation","h":"accessibility.html#toc-keyboard-navigation","s":"Accessibility"},{"t":"Roving tabindex","h":"accessibility.html#toc-roving-tabindex","s":"Accessibility"},{"t":"Focus management","h":"accessibility.html#toc-focus-management","s":"Accessibility"},{"t":"Live regions","h":"accessibility.html#toc-live-regions","s":"Accessibility"},{"t":"Screen reader considerations","h":"accessibility.html#toc-screen-reader-considerations","s":"Accessibility"},{"t":"Component Skills","h":"component-skills.html","s":"Overview"},{"t":"What is a component skill?","h":"component-skills.html#toc-what-is-a-component-skill","s":"Component Skills"},{"t":"The SKILL.md index","h":"component-skills.html#toc-the-skill-md-index","s":"Component Skills"},{"t":"Skill file structure","h":"component-skills.html#toc-skill-file-structure","s":"Component Skills"},{"t":"Example: Badge skill file","h":"component-skills.html#toc-example-badge-skill-file","s":"Component Skills"},{"t":"Using skills with AI assistants","h":"component-skills.html#toc-using-skills-with-ai-assistants","s":"Component Skills"},{"t":"Using skills as a human reference","h":"component-skills.html#toc-using-skills-as-a-human-reference","s":"Component Skills"},{"t":"Available skills","h":"component-skills.html#toc-available-skills","s":"Component Skills"},{"t":"Changelog","h":"changelog.html","s":"Overview"},{"t":"v0.8.3","h":"changelog.html#toc-v0-8-3","s":"Changelog"},{"t":"v0.8.2","h":"changelog.html#toc-v0-8-2","s":"Changelog"},{"t":"v0.8.1","h":"changelog.html#toc-v0-8-1","s":"Changelog"},{"t":"v0.8.0","h":"changelog.html#toc-v0-8-0","s":"Changelog"},{"t":"v0.7.19","h":"changelog.html#toc-v0-7-19","s":"Changelog"},{"t":"v0.7.18","h":"changelog.html#toc-v0-7-18","s":"Changelog"},{"t":"v0.7.17","h":"changelog.html#toc-v0-7-17","s":"Changelog"},{"t":"v0.7.16","h":"changelog.html#toc-v0-7-16","s":"Changelog"},{"t":"v0.7.15","h":"changelog.html#toc-v0-7-15","s":"Changelog"},{"t":"v0.7.14","h":"changelog.html#toc-v0-7-14","s":"Changelog"},{"t":"v0.7.13-alpha","h":"changelog.html#toc-v0-7-13-alpha","s":"Changelog"},{"t":"v0.7.12-alpha","h":"changelog.html#toc-v0-7-12-alpha","s":"Changelog"},{"t":"v0.7.11-alpha","h":"changelog.html#toc-v0-7-11-alpha","s":"Changelog"},{"t":"v0.7.10-alpha","h":"changelog.html#toc-v0-7-10-alpha","s":"Changelog"},{"t":"v0.7.9-alpha","h":"changelog.html#toc-v0-7-9-alpha","s":"Changelog"},{"t":"v0.7.8-alpha","h":"changelog.html#toc-v0-7-8-alpha","s":"Changelog"},{"t":"v0.7.7-alpha","h":"changelog.html#toc-v0-7-7-alpha","s":"Changelog"},{"t":"v0.7.6-alpha","h":"changelog.html#toc-v0-7-6-alpha","s":"Changelog"},{"t":"v0.7.5-alpha","h":"changelog.html#toc-v0-7-5-alpha","s":"Changelog"},{"t":"v0.7.4-alpha","h":"changelog.html#toc-v0-7-4-alpha","s":"Changelog"},{"t":"v0.7.3-alpha","h":"changelog.html#toc-v0-7-3-alpha","s":"Changelog"},{"t":"v0.7.2-alpha","h":"changelog.html#toc-v0-7-2-alpha","s":"Changelog"},{"t":"v0.7.1-alpha","h":"changelog.html#toc-v0-7-1-alpha","s":"Changelog"},{"t":"v0.7.0-alpha","h":"changelog.html#toc-v0-7-0-alpha","s":"Changelog"},{"t":"v0.6.0-alpha","h":"changelog.html#toc-v0-6-0-alpha","s":"Changelog"},{"t":"v0.5.0-alpha","h":"changelog.html#toc-v0-5-0-alpha","s":"Changelog"},{"t":"v0.4.0-alpha","h":"changelog.html#toc-v0-4-0-alpha","s":"Changelog"},{"t":"v0.3.0","h":"changelog.html#toc-v0-3-0","s":"Changelog"},{"t":"v0.2.1","h":"changelog.html#toc-v0-2-1","s":"Changelog"},{"t":"v0.2.0","h":"changelog.html#toc-v0-2-0","s":"Changelog"},{"t":"Typography","h":"typography.html","s":"Primitives"},{"t":"h2 — The People of the Kingdom","h":"typography.html#toc-h2-the-people-of-the-kingdom","s":"Typography"},{"t":"The King's Plan","h":"typography.html#toc-the-king-s-plan","s":"Typography"},{"t":"CSS view file","h":"typography.html#toc-css-view-file","s":"Typography"},{"t":"Separator","h":"separator.html","s":"Primitives"},{"t":"CSS view file","h":"separator.html#toc-css-view-file","s":"Separator"},{"t":"Icon","h":"icon.html","s":"Primitives"},{"t":"CSS view file","h":"icon.html#toc-css-view-file","s":"Icon"},{"t":"Button","h":"button.html","s":"Actions"},{"t":"CSS view file","h":"button.html#toc-css-view-file","s":"Button"},{"t":"Toggle","h":"toggle.html","s":"Actions"},{"t":"States","h":"toggle.html#toc-states","s":"Toggle"},{"t":"CSS view file","h":"toggle.html#toc-css-view-file","s":"Toggle"},{"t":"JavaScript view file","h":"toggle.html#toc-javascript-view-file","s":"Toggle"},{"t":"Toggle Group","h":"toggle-group.html","s":"Actions"},{"t":"States","h":"toggle-group.html#toc-states","s":"Toggle Group"},{"t":"CSS view file","h":"toggle-group.html#toc-css-view-file","s":"Toggle Group"},{"t":"JavaScript view file","h":"toggle-group.html#toc-javascript-view-file","s":"Toggle Group"},{"t":"Button Group","h":"button-group.html","s":"Actions"},{"t":"CSS view file","h":"button-group.html#toc-css-view-file","s":"Button Group"},{"t":"Toolbar","h":"toolbar.html","s":"Actions"},{"t":"States","h":"toolbar.html#toc-states","s":"Toolbar"},{"t":"CSS view file","h":"toolbar.html#toc-css-view-file","s":"Toolbar"},{"t":"JavaScript view file","h":"toolbar.html#toc-javascript-view-file","s":"Toolbar"},{"t":"Label","h":"label.html","s":"Forms & Inputs"},{"t":"CSS view file","h":"label.html#toc-css-view-file","s":"Label"},{"t":"Input","h":"input.html","s":"Forms & Inputs"},{"t":"CSS view file","h":"input.html#toc-css-view-file","s":"Input"},{"t":"Textarea","h":"textarea.html","s":"Forms & Inputs"},{"t":"CSS view file","h":"textarea.html#toc-css-view-file","s":"Textarea"},{"t":"Checkbox","h":"checkbox.html","s":"Forms & Inputs"},{"t":"CSS view file","h":"checkbox.html#toc-css-view-file","s":"Checkbox"},{"t":"Radio Group","h":"radio.html","s":"Forms & Inputs"},{"t":"CSS view file","h":"radio.html#toc-css-view-file","s":"Radio Group"},{"t":"Switch","h":"switch.html","s":"Forms & Inputs"},{"t":"CSS view file","h":"switch.html#toc-css-view-file","s":"Switch"},{"t":"Slider","h":"slider.html","s":"Forms & Inputs"},{"t":"States","h":"slider.html#toc-states","s":"Slider"},{"t":"CSS view file","h":"slider.html#toc-css-view-file","s":"Slider"},{"t":"JS view file","h":"slider.html#toc-js-view-file","s":"Slider"},{"t":"Select","h":"select.html","s":"Forms & Inputs"},{"t":"CSS view file","h":"select.html#toc-css-view-file","s":"Select"},{"t":"Number Input","h":"number-input.html","s":"Forms & Inputs"},{"t":"States","h":"number-input.html#toc-states","s":"Number Input"},{"t":"CSS view file","h":"number-input.html#toc-css-view-file","s":"Number Input"},{"t":"JavaScript view file","h":"number-input.html#toc-javascript-view-file","s":"Number Input"},{"t":"File Input","h":"file-input.html","s":"Forms & Inputs"},{"t":"CSS view file","h":"file-input.html#toc-css-view-file","s":"File Input"},{"t":"Color Picker","h":"color-picker.html","s":"Forms & Inputs"},{"t":"States","h":"color-picker.html#toc-states","s":"Color Picker"},{"t":"CSS view file","h":"color-picker.html#toc-css-view-file","s":"Color Picker"},{"t":"JavaScript view file","h":"color-picker.html#toc-javascript-view-file","s":"Color Picker"},{"t":"Date Picker","h":"date-picker.html","s":"Forms & Inputs"},{"t":"CSS view file","h":"date-picker.html#toc-css-view-file","s":"Date Picker"},{"t":"Combobox","h":"combobox.html","s":"Forms & Inputs"},{"t":"States","h":"combobox.html#toc-states","s":"Combobox"},{"t":"CSS view file","h":"combobox.html#toc-css-view-file","s":"Combobox"},{"t":"JavaScript view file","h":"combobox.html#toc-javascript-view-file","s":"Combobox"},{"t":"Form","h":"form.html","s":"Forms & Inputs"},{"t":"CSS view file","h":"form.html#toc-css-view-file","s":"Form"},{"t":"Badge","h":"badge.html","s":"Data Display"},{"t":"CSS view file","h":"badge.html#toc-css-view-file","s":"Badge"},{"t":"Avatar","h":"avatar.html","s":"Data Display"},{"t":"States","h":"avatar.html#toc-states","s":"Avatar"},{"t":"CSS view file","h":"avatar.html#toc-css-view-file","s":"Avatar"},{"t":"JavaScript view file","h":"avatar.html#toc-javascript-view-file","s":"Avatar"},{"t":"Card","h":"card.html","s":"Data Display"},{"t":"CSS view file","h":"card.html#toc-css-view-file","s":"Card"},{"t":"Image","h":"image.html","s":"Data Display"},{"t":"States","h":"image.html#toc-states","s":"Image"},{"t":"CSS view file","h":"image.html#toc-css-view-file","s":"Image"},{"t":"JavaScript view file","h":"image.html#toc-javascript-view-file","s":"Image"},{"t":"Statistic","h":"statistic.html","s":"Data Display"},{"t":"CSS view file","h":"statistic.html#toc-css-view-file","s":"Statistic"},{"t":"Table","h":"table.html","s":"Data Display"},{"t":"CSS view file","h":"table.html#toc-css-view-file","s":"Table"},{"t":"Collapsible","h":"collapsible.html","s":"Data Display"},{"t":"CSS view file","h":"collapsible.html#toc-css-view-file","s":"Collapsible"},{"t":"Timeline","h":"timeline.html","s":"Data Display"},{"t":"CSS view file","h":"timeline.html#toc-css-view-file","s":"Timeline"},{"t":"Tree View","h":"tree-view.html","s":"Data Display"},{"t":"States","h":"tree-view.html#toc-states","s":"Tree View"},{"t":"CSS view file","h":"tree-view.html#toc-css-view-file","s":"Tree View"},{"t":"JavaScript view file","h":"tree-view.html#toc-javascript-view-file","s":"Tree View"},{"t":"Calendar","h":"calendar.html","s":"Data Display"},{"t":"States","h":"calendar.html#toc-states","s":"Calendar"},{"t":"CSS view file","h":"calendar.html#toc-css-view-file","s":"Calendar"},{"t":"JavaScript view file","h":"calendar.html#toc-javascript-view-file","s":"Calendar"},{"t":"Carousel","h":"carousel.html","s":"Data Display"},{"t":"States","h":"carousel.html#toc-states","s":"Carousel"},{"t":"CSS view file","h":"carousel.html#toc-css-view-file","s":"Carousel"},{"t":"JavaScript view file","h":"carousel.html#toc-javascript-view-file","s":"Carousel"},{"t":"Scroll Area","h":"scroll-area.html","s":"Data Display"},{"t":"CSS view file","h":"scroll-area.html#toc-css-view-file","s":"Scroll Area"},{"t":"Sortable","h":"sortable.html","s":"Data Display"},{"t":"States","h":"sortable.html#toc-states","s":"Sortable"},{"t":"CSS view file","h":"sortable.html#toc-css-view-file","s":"Sortable"},{"t":"JavaScript view file","h":"sortable.html#toc-javascript-view-file","s":"Sortable"},{"t":"Spinner","h":"spinner.html","s":"Feedback & Status"},{"t":"CSS view file","h":"spinner.html#toc-css-view-file","s":"Spinner"},{"t":"Skeleton","h":"skeleton.html","s":"Feedback & Status"},{"t":"CSS view file","h":"skeleton.html#toc-css-view-file","s":"Skeleton"},{"t":"Progress","h":"progress.html","s":"Feedback & Status"},{"t":"CSS view file","h":"progress.html#toc-css-view-file","s":"Progress"},{"t":"Alert","h":"alert.html","s":"Feedback & Status"},{"t":"CSS view file","h":"alert.html#toc-css-view-file","s":"Alert"},{"t":"Alert Dialog","h":"alert-dialog.html","s":"Feedback & Status"},{"t":"Are you absolutely sure?","h":"alert-dialog.html#ad1-title","s":"Alert Dialog"},{"t":"Publish this post?","h":"alert-dialog.html#ad2-title","s":"Alert Dialog"},{"t":"States","h":"alert-dialog.html#toc-states","s":"Alert Dialog"},{"t":"CSS view file","h":"alert-dialog.html#toc-css-view-file","s":"Alert Dialog"},{"t":"JavaScript view file","h":"alert-dialog.html#toc-javascript-view-file","s":"Alert Dialog"},{"t":"Toast","h":"toast.html","s":"Feedback & Status"},{"t":"States","h":"toast.html#toc-states","s":"Toast"},{"t":"CSS view file","h":"toast.html#toc-css-view-file","s":"Toast"},{"t":"JavaScript view file","h":"toast.html#toc-javascript-view-file","s":"Toast"},{"t":"Popover","h":"popover.html","s":"Overlays"},{"t":"States","h":"popover.html#toc-states","s":"Popover"},{"t":"CSS view file","h":"popover.html#toc-css-view-file","s":"Popover"},{"t":"JavaScript view file","h":"popover.html#toc-javascript-view-file","s":"Popover"},{"t":"Tooltip","h":"tooltip.html","s":"Overlays"},{"t":"States","h":"tooltip.html#toc-states","s":"Tooltip"},{"t":"CSS view file","h":"tooltip.html#toc-css-view-file","s":"Tooltip"},{"t":"JavaScript view file","h":"tooltip.html#toc-javascript-view-file","s":"Tooltip"},{"t":"Context Menu","h":"context-menu.html","s":"Overlays"},{"t":"States","h":"context-menu.html#toc-states","s":"Context Menu"},{"t":"CSS view file","h":"context-menu.html#toc-css-view-file","s":"Context Menu"},{"t":"JavaScript view file","h":"context-menu.html#toc-javascript-view-file","s":"Context Menu"},{"t":"Dialog","h":"dialog.html","s":"Overlays"},{"t":"States","h":"dialog.html#toc-states","s":"Dialog"},{"t":"CSS view file","h":"dialog.html#toc-css-view-file","s":"Dialog"},{"t":"JavaScript view file","h":"dialog.html#toc-javascript-view-file","s":"Dialog"},{"t":"CSS view file","h":"dialog.html#toc-css-view-file","s":"Dialog"},{"t":"JavaScript view file","h":"dialog.html#toc-javascript-view-file","s":"Dialog"},{"t":"Edit Profile","h":"dialog.html#demo-title","s":"Dialog"},{"t":"Delete account?","h":"dialog.html#confirm-title","s":"Dialog"},{"t":"Sheet","h":"sheet.html","s":"Overlays"},{"t":"States","h":"sheet.html#toc-states","s":"Sheet"},{"t":"CSS view file","h":"sheet.html#toc-css-view-file","s":"Sheet"},{"t":"JavaScript view file","h":"sheet.html#toc-javascript-view-file","s":"Sheet"},{"t":"Edit Profile","h":"sheet.html#sheet-right-title","s":"Sheet"},{"t":"Navigation","h":"sheet.html#sheet-left-title","s":"Sheet"},{"t":"Notifications","h":"sheet.html#sheet-top-title","s":"Sheet"},{"t":"Cookie Preferences","h":"sheet.html#sheet-bottom-title","s":"Sheet"},{"t":"Accordion","h":"accordion.html","s":"Overlays"},{"t":"States","h":"accordion.html#toc-states","s":"Accordion"},{"t":"CSS view file","h":"accordion.html#toc-css-view-file","s":"Accordion"},{"t":"JavaScript view file","h":"accordion.html#toc-javascript-view-file","s":"Accordion"},{"t":"CSS view file","h":"accordion.html#toc-css-view-file","s":"Accordion"},{"t":"JavaScript view file","h":"accordion.html#toc-javascript-view-file","s":"Accordion"},{"t":"Command","h":"command.html","s":"Overlays"},{"t":"States","h":"command.html#toc-states","s":"Command"},{"t":"CSS view file","h":"command.html#toc-css-view-file","s":"Command"},{"t":"JavaScript view file","h":"command.html#toc-javascript-view-file","s":"Command"},{"t":"Breadcrumb","h":"breadcrumb.html","s":"Navigation"},{"t":"CSS view file","h":"breadcrumb.html#toc-css-view-file","s":"Breadcrumb"},{"t":"Pagination","h":"pagination.html","s":"Navigation"},{"t":"CSS view file","h":"pagination.html#toc-css-view-file","s":"Pagination"},{"t":"Steps","h":"steps.html","s":"Navigation"},{"t":"CSS view file","h":"steps.html#toc-css-view-file","s":"Steps"},{"t":"Tabs","h":"tabs.html","s":"Navigation"},{"t":"States","h":"tabs.html#toc-states","s":"Tabs"},{"t":"CSS view file","h":"tabs.html#toc-css-view-file","s":"Tabs"},{"t":"JavaScript view file","h":"tabs.html#toc-javascript-view-file","s":"Tabs"},{"t":"Dropdown Menu","h":"dropdown.html","s":"Navigation"},{"t":"States","h":"dropdown.html#toc-states","s":"Dropdown Menu"},{"t":"CSS view file","h":"dropdown.html#toc-css-view-file","s":"Dropdown Menu"},{"t":"JavaScript view file","h":"dropdown.html#toc-javascript-view-file","s":"Dropdown Menu"},{"t":"Navigation Menu","h":"navigation-menu.html","s":"Navigation"},{"t":"States","h":"navigation-menu.html#toc-states","s":"Navigation Menu"},{"t":"CSS view file","h":"navigation-menu.html#toc-css-view-file","s":"Navigation Menu"},{"t":"JavaScript view file","h":"navigation-menu.html#toc-javascript-view-file","s":"Navigation Menu"},{"t":"Sidebar","h":"sidebar.html","s":"Application"},{"t":"States","h":"sidebar.html#toc-states","s":"Sidebar"},{"t":"CSS view file","h":"sidebar.html#toc-css-view-file","s":"Sidebar"},{"t":"JavaScript view file","h":"sidebar.html#toc-javascript-view-file","s":"Sidebar"},{"t":"Site Header","h":"site-header.html","s":"Marketing"},{"t":"CSS view file","h":"site-header.html#toc-css-view-file","s":"Site Header"},{"t":"Hero","h":"hero.html","s":"Marketing"},{"t":"CSS view file","h":"hero.html#toc-css-view-file","s":"Hero"},{"t":"Product Showcase","h":"product-showcase.html","s":"Marketing"},{"t":"CSS view file","h":"product-showcase.html#toc-css-view-file","s":"Product Showcase"},{"t":"States","h":"product-showcase.html#toc-states","s":"Product Showcase"},{"t":"JavaScript view file","h":"product-showcase.html#toc-javascript-view-file","s":"Product Showcase"},{"t":"Brand Logos","h":"brand-logos.html","s":"Marketing"},{"t":"CSS view file","h":"brand-logos.html#toc-css-view-file","s":"Brand Logos"},{"t":"Feature Details","h":"feature-details.html","s":"Marketing"},{"t":"AI That Works Your Way","h":"feature-details.html#toc-ai-that-works-your-way","s":"Feature Details"},{"t":"CSS view file","h":"feature-details.html#toc-css-view-file","s":"Feature Details"},{"t":"Testimonials","h":"testimonials.html","s":"Marketing"},{"t":"CSS view file","h":"testimonials.html#toc-css-view-file","s":"Testimonials"},{"t":"Stats","h":"stats.html","s":"Marketing"},{"t":"Trusted by Teams Everywhere","h":"stats.html#toc-trusted-by-teams-everywhere","s":"Stats"},{"t":"CSS view file","h":"stats.html#toc-css-view-file","s":"Stats"},{"t":"Pricing","h":"pricing.html","s":"Marketing"},{"t":"Simple Pricing, Smarter Work","h":"pricing.html#toc-simple-pricing-smarter-work","s":"Pricing"},{"t":"CSS view file","h":"pricing.html#toc-css-view-file","s":"Pricing"},{"t":"Blog","h":"blog.html","s":"Marketing"},{"t":"Acme Insights","h":"blog.html#toc-acme-insights","s":"Blog"},{"t":"CSS view file","h":"blog.html#toc-css-view-file","s":"Blog"},{"t":"FAQ","h":"faq.html","s":"Marketing"},{"t":"Frequently Asked Questions","h":"faq.html#toc-frequently-asked-questions","s":"FAQ"},{"t":"CSS view file","h":"faq.html#toc-css-view-file","s":"FAQ"},{"t":"Get In Touch","h":"get-in-touch.html","s":"Marketing"},{"t":"Want to know more?","h":"get-in-touch.html#toc-want-to-know-more","s":"Get In Touch"},{"t":"CSS view file","h":"get-in-touch.html#toc-css-view-file","s":"Get In Touch"},{"t":"Newsletter","h":"newsletter.html","s":"Marketing"},{"t":"Stay in the loop","h":"newsletter.html#toc-stay-in-the-loop","s":"Newsletter"},{"t":"CSS view file","h":"newsletter.html#toc-css-view-file","s":"Newsletter"},{"t":"Site Footer","h":"site-footer.html","s":"Marketing"},{"t":"CSS view file","h":"site-footer.html#toc-css-view-file","s":"Site Footer"}];
|
|
@@ -107,7 +107,7 @@
|
|
|
107
107
|
<h1 style="font-family:var(--font-display);font-size:2.5rem;font-weight:400;letter-spacing:-0.035em;margin:0 0 0.75rem;">Label</h1>
|
|
108
108
|
<p class="text-muted-foreground leading-relaxed mb-6">
|
|
109
109
|
Renders an accessible label associated with form controls. Built on the native <code><label></code> element
|
|
110
|
-
with <code>:has()</code> for focus-reactive styling. No JavaScript required.
|
|
110
|
+
with <code>:has()</code> for focus-reactive styling. No JavaScript required. The label’s <code>for</code> and the control’s <code>id</code> must carry the <strong>exact same value</strong> — that pairing <em>is</em> the association: it is what makes clicking the label focus the field and lets a screen reader announce the control’s name. Change one side and leave the other, and the label keeps looking right while quietly stopping working.
|
|
111
111
|
</p>
|
|
112
112
|
<!-- Component Skill -->
|
|
113
113
|
<details style="margin-bottom:2rem;border:1px solid var(--border);border-radius:var(--radius-xl);overflow:hidden;">
|
|
@@ -135,6 +135,7 @@
|
|
|
135
135
|
</div>
|
|
136
136
|
|
|
137
137
|
<p style="margin:0 0 0.5rem;font-weight:600;font-size:0.8125rem;font-family:var(--font-mono);">Accessibility</p>
|
|
138
|
+
<p class="text-muted-foreground" style="margin:0 0 0.25rem;">• <strong>One value, written twice:</strong> the label’s <code>for</code> and the control’s <code>id</code> must be the exact same string. A mismatch fails silently — the label renders and styles normally but no longer focuses the field or names it for assistive technology.</p>
|
|
138
139
|
<p class="text-muted-foreground" style="margin:0 0 0.25rem;">• Clicking the label focuses the associated input — this is native <code><label></code> behavior.</p>
|
|
139
140
|
<p class="text-muted-foreground" style="margin:0 0 0.25rem;">• The required indicator <code>*</code> uses <code>aria-hidden="true"</code> since the <code>required</code> attribute on the input already conveys the requirement to assistive technology.</p>
|
|
140
141
|
<p class="text-muted-foreground" style="margin:0 0 0.25rem;">• Do not use <code><label></code> without a <code>for</code> attribute or a nested input.</p>
|
|
@@ -152,7 +153,7 @@
|
|
|
152
153
|
|
|
153
154
|
<!-- Basic -->
|
|
154
155
|
<p class="text-sm font-medium mb-2 mt-6">Default</p>
|
|
155
|
-
<p class="text-xs text-muted-foreground mb-3">Basic label paired with an input. Click the label to focus the input.</p>
|
|
156
|
+
<p class="text-xs text-muted-foreground mb-3">Basic label paired with an input. Click the label to focus the input — <code>for="demo-email"</code> and <code>id="demo-email"</code> must always match; changing one without the other breaks the link.</p>
|
|
156
157
|
<div class="preview">
|
|
157
158
|
<div style="width:100%;max-width:20rem;">
|
|
158
159
|
<label class="label" for="demo-email">Email</label>
|
|
@@ -164,7 +165,8 @@
|
|
|
164
165
|
<svg width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect width="14" height="14" x="8" y="8" rx="2" ry="2"/><path d="M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2"/></svg>
|
|
165
166
|
Copy
|
|
166
167
|
</button>
|
|
167
|
-
<pre><code class="language-markup"><
|
|
168
|
+
<pre><code class="language-markup"><! for and id are one value in two places — keep them identical -->
|
|
169
|
+
<label class="label" for="email">Email</label>
|
|
168
170
|
<input class="input" type="email" id="email" placeholder="you@example.com"></code></pre>
|
|
169
171
|
</div>
|
|
170
172
|
|
|
@@ -106,7 +106,7 @@
|
|
|
106
106
|
</div>
|
|
107
107
|
<h1 style="font-family:var(--font-display);font-size:2.5rem;font-weight:400;letter-spacing:-0.035em;margin:0 0 0.75rem;">Select</h1>
|
|
108
108
|
<p class="text-muted-foreground leading-relaxed mb-6">
|
|
109
|
-
A native dropdown for choosing from a list of options. Built on <code><select></code> with <code>appearance: none</code> and a custom chevron.
|
|
109
|
+
A native dropdown for choosing from a list of options. Built on <code><select></code> with <code>appearance: none</code> and a custom chevron. The empty-value placeholder option stays selectable, so it doubles as the clear/reset entry: re-choosing it empties the box again (add <code>required</code> for mandatory fields).
|
|
110
110
|
</p>
|
|
111
111
|
<!-- Component Skill -->
|
|
112
112
|
<details style="margin-bottom:2rem;border:1px solid var(--border);border-radius:var(--radius-xl);overflow:hidden;">
|
|
@@ -138,23 +138,24 @@
|
|
|
138
138
|
<p style="margin:0 0 0.5rem;font-weight:600;font-size:0.8125rem;font-family:var(--font-mono);">Accessibility</p>
|
|
139
139
|
<p class="text-muted-foreground" style="margin:0 0 0.25rem;">• Native <code><select></code> provides full keyboard navigation (arrow keys, type-ahead).</p>
|
|
140
140
|
<p class="text-muted-foreground" style="margin:0 0 0.25rem;">• Use <code><label></code> with <code>for</code> for description.</p>
|
|
141
|
-
<p class="text-muted-foreground" style="margin:0 0 0;">•
|
|
141
|
+
<p class="text-muted-foreground" style="margin:0 0 0;">• The placeholder is a <code><option value="" selected></code> <strong>without</strong> <code>disabled</code> — a disabled placeholder cannot be re-selected, so a made selection could never be cleared (issue #32). Keep it selectable and mark the field <code>required</code> if empty must not submit; the control reads as a placeholder while the empty option is selected (muted text via <code>:has(option:checked)</code>).</p>
|
|
142
142
|
|
|
143
143
|
|
|
144
144
|
<p style="margin:0 0 0.5rem;font-weight:600;font-size:0.8125rem;font-family:var(--font-mono);">Notes</p>
|
|
145
145
|
<p class="text-muted-foreground" style="margin:0 0 0.25rem;">• Uses <code>appearance: none</code> with a custom chevron via <code>background-image</code> SVG.</p>
|
|
146
146
|
<p class="text-muted-foreground" style="margin:0 0 0.25rem;">• The dropdown list is rendered by the browser — it cannot be styled.</p>
|
|
147
|
-
<p class="text-muted-foreground" style="margin:0 0 0;">• For a fully custom dropdown, use the Combobox component instead.</p>
|
|
147
|
+
<p class="text-muted-foreground" style="margin:0 0 0.25rem;">• For a fully custom dropdown, use the Combobox component instead.</p>
|
|
148
|
+
<p class="text-muted-foreground" style="margin:0 0 0;">• While the empty option is selected the closed control renders muted (<code>:has(> option[value=""]:checked)</code>); choosing a value restores the foreground color.</p>
|
|
148
149
|
</div>
|
|
149
150
|
</details>
|
|
150
151
|
</div>
|
|
151
152
|
<p class="text-sm font-medium mb-2 mt-6">Default</p>
|
|
152
|
-
<p class="text-xs text-muted-foreground mb-3">Native select with placeholder.</p>
|
|
153
|
+
<p class="text-xs text-muted-foreground mb-3">Native select with a clearable placeholder — re-choose "Select a fruit" to empty it again.</p>
|
|
153
154
|
<div class="preview">
|
|
154
155
|
<div style="width:100%;max-width:16rem;">
|
|
155
156
|
<label class="label" for="d-fruit">Fruit</label>
|
|
156
157
|
<select class="select" id="d-fruit">
|
|
157
|
-
<option value=""
|
|
158
|
+
<option value="" selected>Select a fruit</option>
|
|
158
159
|
<option value="apple">Apple</option>
|
|
159
160
|
<option value="banana">Banana</option>
|
|
160
161
|
<option value="cherry">Cherry</option>
|
|
@@ -168,7 +169,7 @@
|
|
|
168
169
|
Copy
|
|
169
170
|
</button>
|
|
170
171
|
<pre><code class="language-markup"><select class="select">
|
|
171
|
-
<option value=""
|
|
172
|
+
<option value="" selected>Select a fruit</option>
|
|
172
173
|
<option value="apple">Apple</option>
|
|
173
174
|
...
|
|
174
175
|
</select></code></pre>
|
|
@@ -178,7 +179,7 @@
|
|
|
178
179
|
<div class="preview">
|
|
179
180
|
<div style="width:100%;max-width:16rem;">
|
|
180
181
|
<select class="select">
|
|
181
|
-
<option value=""
|
|
182
|
+
<option value="" selected>Select timezone</option>
|
|
182
183
|
<optgroup label="Americas">
|
|
183
184
|
<option>New York</option>
|
|
184
185
|
<option>Los Angeles</option>
|
|
@@ -251,6 +252,16 @@
|
|
|
251
252
|
background-position: right 0.5rem center;
|
|
252
253
|
background-size: 1rem;
|
|
253
254
|
|
|
255
|
+
/* Placeholder = the empty-value option. It stays selectable (no
|
|
256
|
+
`disabled`) so it doubles as the clear/reset entry — choosing it
|
|
257
|
+
again empties the box (issue #32). While it is the selection the
|
|
258
|
+
closed control reads as a placeholder; a real value restores
|
|
259
|
+
--foreground because the base rule's color wins over this one.
|
|
260
|
+
option:checked matches the *selected* option in every engine. */
|
|
261
|
+
&:has(> option[value=""]:checked) {
|
|
262
|
+
color: var(--muted-foreground);
|
|
263
|
+
}
|
|
264
|
+
|
|
254
265
|
&:focus {
|
|
255
266
|
border-color: var(--ring);
|
|
256
267
|
box-shadow: 0 0 0 2px oklch(from var(--ring) l c h / 0.2);
|