@gunkin/uiify 0.0.20-alpha → 0.0.22-alpha
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/agents/components.md +13 -0
- package/agents/index.md +31 -1
- package/agents/reference/components/alert.md +44 -0
- package/agents/reference/components/aspect-ratio.md +26 -0
- package/agents/reference/components/avatar.md +32 -0
- package/agents/reference/components/badge.md +31 -0
- package/agents/reference/components/card.md +24 -0
- package/agents/reference/components/checkbox.md +2 -0
- package/agents/reference/components/date-picker.md +23 -0
- package/agents/reference/components/description-list.md +38 -0
- package/agents/reference/components/empty.md +45 -0
- package/agents/reference/components/fieldset.md +31 -0
- package/agents/reference/components/form-error-summary.md +33 -0
- package/agents/reference/components/input-group.md +33 -0
- package/agents/reference/components/item.md +52 -0
- package/agents/reference/components/progress.md +16 -0
- package/dist/components/alert/Alert.d.ts +15 -0
- package/dist/components/alert/Alert.d.ts.map +1 -0
- package/dist/components/alert/Alert.js +61 -0
- package/dist/components/alert/Alert.js.map +1 -0
- package/dist/components/alert/index.d.ts +3 -0
- package/dist/components/alert/index.d.ts.map +1 -0
- package/dist/components/alert/index.js +7 -0
- package/dist/components/alert/index.js.map +1 -0
- package/dist/components/alert/types.d.ts +20 -0
- package/dist/components/alert/types.d.ts.map +1 -0
- package/dist/components/alert/types.js +1 -0
- package/dist/components/alert/types.js.map +1 -0
- package/dist/components/alert.d.ts +1 -0
- package/dist/components/alert.js +1 -0
- package/dist/components/aspect-ratio/AspectRatio.d.ts +7 -0
- package/dist/components/aspect-ratio/AspectRatio.d.ts.map +1 -0
- package/dist/components/aspect-ratio/AspectRatio.js +26 -0
- package/dist/components/aspect-ratio/AspectRatio.js.map +1 -0
- package/dist/components/aspect-ratio/index.d.ts +3 -0
- package/dist/components/aspect-ratio/index.d.ts.map +1 -0
- package/dist/components/aspect-ratio/index.js +5 -0
- package/dist/components/aspect-ratio/index.js.map +1 -0
- package/dist/components/aspect-ratio/types.d.ts +9 -0
- package/dist/components/aspect-ratio/types.d.ts.map +1 -0
- package/dist/components/aspect-ratio/types.js +1 -0
- package/dist/components/aspect-ratio/types.js.map +1 -0
- package/dist/components/aspect-ratio.d.ts +1 -0
- package/dist/components/aspect-ratio.js +1 -0
- package/dist/components/avatar/Avatar.d.ts +7 -0
- package/dist/components/avatar/Avatar.d.ts.map +1 -0
- package/dist/components/avatar/Avatar.js +24 -0
- package/dist/components/avatar/Avatar.js.map +1 -0
- package/dist/components/avatar/index.d.ts +3 -0
- package/dist/components/avatar/index.d.ts.map +1 -0
- package/dist/components/avatar/index.js +5 -0
- package/dist/components/avatar/index.js.map +1 -0
- package/dist/components/avatar/types.d.ts +12 -0
- package/dist/components/avatar/types.d.ts.map +1 -0
- package/dist/components/avatar/types.js +1 -0
- package/dist/components/avatar/types.js.map +1 -0
- package/dist/components/avatar.d.ts +1 -0
- package/dist/components/avatar.js +1 -0
- package/dist/components/badge/Badge.d.ts +7 -0
- package/dist/components/badge/Badge.d.ts.map +1 -0
- package/dist/components/badge/Badge.js +21 -0
- package/dist/components/badge/Badge.js.map +1 -0
- package/dist/components/badge/index.d.ts +3 -0
- package/dist/components/badge/index.d.ts.map +1 -0
- package/dist/components/badge/index.js +5 -0
- package/dist/components/badge/index.js.map +1 -0
- package/dist/components/badge/types.d.ts +11 -0
- package/dist/components/badge/types.d.ts.map +1 -0
- package/dist/components/badge/types.js +1 -0
- package/dist/components/badge/types.js.map +1 -0
- package/dist/components/badge.d.ts +1 -0
- package/dist/components/badge.js +1 -0
- package/dist/components/behavior.css +12 -0
- package/dist/components/behavior.css.map +1 -1
- package/dist/components/card/Card.d.ts +7 -0
- package/dist/components/card/Card.d.ts.map +1 -0
- package/dist/components/card/Card.js +16 -0
- package/dist/components/card/Card.js.map +1 -0
- package/dist/components/card/index.d.ts +3 -0
- package/dist/components/card/index.d.ts.map +1 -0
- package/dist/components/card/index.js +5 -0
- package/dist/components/card/index.js.map +1 -0
- package/dist/components/card/types.d.ts +7 -0
- package/dist/components/card/types.d.ts.map +1 -0
- package/dist/components/card/types.js +1 -0
- package/dist/components/card/types.js.map +1 -0
- package/dist/components/card.d.ts +1 -0
- package/dist/components/card.js +1 -0
- package/dist/components/checkbox/types.d.ts +2 -0
- package/dist/components/checkbox/types.d.ts.map +1 -1
- package/dist/components/date-picker/DatePicker.d.ts +7 -0
- package/dist/components/date-picker/DatePicker.d.ts.map +1 -0
- package/dist/components/date-picker/DatePicker.js +19 -0
- package/dist/components/date-picker/DatePicker.js.map +1 -0
- package/dist/components/date-picker/index.d.ts +3 -0
- package/dist/components/date-picker/index.d.ts.map +1 -0
- package/dist/components/date-picker/index.js +5 -0
- package/dist/components/date-picker/index.js.map +1 -0
- package/dist/components/date-picker/types.d.ts +5 -0
- package/dist/components/date-picker/types.d.ts.map +1 -0
- package/dist/components/date-picker/types.js +1 -0
- package/dist/components/date-picker/types.js.map +1 -0
- package/dist/components/date-picker.d.ts +1 -0
- package/dist/components/date-picker.js +1 -0
- package/dist/components/description-list/DescriptionList.d.ts +15 -0
- package/dist/components/description-list/DescriptionList.d.ts.map +1 -0
- package/dist/components/description-list/DescriptionList.js +48 -0
- package/dist/components/description-list/DescriptionList.js.map +1 -0
- package/dist/components/description-list/index.d.ts +3 -0
- package/dist/components/description-list/index.d.ts.map +1 -0
- package/dist/components/description-list/index.js +7 -0
- package/dist/components/description-list/index.js.map +1 -0
- package/dist/components/description-list/types.d.ts +15 -0
- package/dist/components/description-list/types.d.ts.map +1 -0
- package/dist/components/description-list/types.js +1 -0
- package/dist/components/description-list/types.js.map +1 -0
- package/dist/components/description-list.d.ts +1 -0
- package/dist/components/description-list.js +1 -0
- package/dist/components/empty/Empty.d.ts +19 -0
- package/dist/components/empty/Empty.d.ts.map +1 -0
- package/dist/components/empty/Empty.js +56 -0
- package/dist/components/empty/Empty.js.map +1 -0
- package/dist/components/empty/index.d.ts +3 -0
- package/dist/components/empty/index.d.ts.map +1 -0
- package/dist/components/empty/index.js +8 -0
- package/dist/components/empty/index.js.map +1 -0
- package/dist/components/empty/types.d.ts +19 -0
- package/dist/components/empty/types.d.ts.map +1 -0
- package/dist/components/empty/types.js +1 -0
- package/dist/components/empty/types.js.map +1 -0
- package/dist/components/empty.d.ts +1 -0
- package/dist/components/empty.js +1 -0
- package/dist/components/fieldset/Fieldset.d.ts +11 -0
- package/dist/components/fieldset/Fieldset.d.ts.map +1 -0
- package/dist/components/fieldset/Fieldset.js +38 -0
- package/dist/components/fieldset/Fieldset.js.map +1 -0
- package/dist/components/fieldset/index.d.ts +3 -0
- package/dist/components/fieldset/index.d.ts.map +1 -0
- package/dist/components/fieldset/index.js +6 -0
- package/dist/components/fieldset/index.js.map +1 -0
- package/dist/components/fieldset/types.d.ts +11 -0
- package/dist/components/fieldset/types.d.ts.map +1 -0
- package/dist/components/fieldset/types.js +1 -0
- package/dist/components/fieldset/types.js.map +1 -0
- package/dist/components/fieldset.d.ts +1 -0
- package/dist/components/fieldset.js +1 -0
- package/dist/components/form-error-summary/FormErrorSummary.d.ts +7 -0
- package/dist/components/form-error-summary/FormErrorSummary.d.ts.map +1 -0
- package/dist/components/form-error-summary/FormErrorSummary.js +25 -0
- package/dist/components/form-error-summary/FormErrorSummary.js.map +1 -0
- package/dist/components/form-error-summary/index.d.ts +3 -0
- package/dist/components/form-error-summary/index.d.ts.map +1 -0
- package/dist/components/form-error-summary/index.js +5 -0
- package/dist/components/form-error-summary/index.js.map +1 -0
- package/dist/components/form-error-summary/types.d.ts +12 -0
- package/dist/components/form-error-summary/types.d.ts.map +1 -0
- package/dist/components/form-error-summary/types.js +1 -0
- package/dist/components/form-error-summary/types.js.map +1 -0
- package/dist/components/form-error-summary.d.ts +1 -0
- package/dist/components/form-error-summary.js +1 -0
- package/dist/components/index.d.ts +13 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +13 -0
- package/dist/components/index.js.map +1 -1
- package/dist/components/input-group/InputGroup.d.ts +5 -0
- package/dist/components/input-group/InputGroup.d.ts.map +1 -0
- package/dist/components/input-group/InputGroup.js +37 -0
- package/dist/components/input-group/InputGroup.js.map +1 -0
- package/dist/components/input-group/index.d.ts +3 -0
- package/dist/components/input-group/index.d.ts.map +1 -0
- package/dist/components/input-group/index.js +6 -0
- package/dist/components/input-group/index.js.map +1 -0
- package/dist/components/input-group/types.d.ts +12 -0
- package/dist/components/input-group/types.d.ts.map +1 -0
- package/dist/components/input-group/types.js +1 -0
- package/dist/components/input-group/types.js.map +1 -0
- package/dist/components/input-group.d.ts +1 -0
- package/dist/components/input-group.js +1 -0
- package/dist/components/internal/native-check-control/NativeCheckControl.d.ts.map +1 -1
- package/dist/components/internal/native-check-control/NativeCheckControl.js +4 -0
- package/dist/components/internal/native-check-control/NativeCheckControl.js.map +1 -1
- package/dist/components/internal/native-check-control/types.d.ts +2 -0
- package/dist/components/internal/native-check-control/types.d.ts.map +1 -1
- package/dist/components/item/Item.d.ts +23 -0
- package/dist/components/item/Item.d.ts.map +1 -0
- package/dist/components/item/Item.js +64 -0
- package/dist/components/item/Item.js.map +1 -0
- package/dist/components/item/index.d.ts +3 -0
- package/dist/components/item/index.d.ts.map +1 -0
- package/dist/components/item/index.js +9 -0
- package/dist/components/item/index.js.map +1 -0
- package/dist/components/item/types.d.ts +23 -0
- package/dist/components/item/types.d.ts.map +1 -0
- package/dist/components/item/types.js +1 -0
- package/dist/components/item/types.js.map +1 -0
- package/dist/components/item.d.ts +1 -0
- package/dist/components/item.js +1 -0
- package/dist/components/progress/Progress.d.ts +7 -0
- package/dist/components/progress/Progress.d.ts.map +1 -0
- package/dist/components/progress/Progress.js +9 -0
- package/dist/components/progress/Progress.js.map +1 -0
- package/dist/components/progress/index.d.ts +3 -0
- package/dist/components/progress/index.d.ts.map +1 -0
- package/dist/components/progress/index.js +5 -0
- package/dist/components/progress/index.js.map +1 -0
- package/dist/components/progress/types.d.ts +3 -0
- package/dist/components/progress/types.d.ts.map +1 -0
- package/dist/components/progress/types.js +1 -0
- package/dist/components/progress/types.js.map +1 -0
- package/dist/components/progress.d.ts +1 -0
- package/dist/components/progress.js +1 -0
- package/dist/styles/index.css +1 -1
- package/package.json +1 -1
- package/skills/uiify/SKILL.md +42 -36
- package/skills/uiify/references/elements/alert-modal.md +5 -5
- package/skills/uiify/references/elements/aspect-ratio.md +59 -0
- package/skills/uiify/references/elements/avatar.md +10 -19
- package/skills/uiify/references/elements/badge.md +11 -19
- package/skills/uiify/references/elements/card.md +10 -21
- package/skills/uiify/references/elements/checkbox.md +1 -1
- package/skills/uiify/references/elements/date-picker.md +11 -15
- package/skills/uiify/references/elements/description-list.md +38 -0
- package/skills/uiify/references/elements/empty-state.md +12 -23
- package/skills/uiify/references/elements/field.md +2 -2
- package/skills/uiify/references/elements/fieldset.md +39 -0
- package/skills/uiify/references/elements/form-error-summary.md +39 -0
- package/skills/uiify/references/elements/inline-alert.md +11 -19
- package/skills/uiify/references/elements/input-group.md +39 -0
- package/skills/uiify/references/elements/item.md +39 -0
- package/skills/uiify/references/elements/modal.md +1 -1
- package/skills/uiify/references/elements/progress-bar.md +11 -20
- package/skills/uiify/references/elements/select.md +1 -1
- package/skills/uiify/references/examples/alert-confirmation.md +21 -9
- package/skills/uiify/references/examples/field-validation.md +2 -2
- package/skills/uiify/references/examples/select-basic.md +1 -1
- package/skills/uiify/references/examples/table-controls.md +3 -2
- package/skills/uiify/references/guides/verification.md +9 -0
package/skills/uiify/SKILL.md
CHANGED
|
@@ -10,38 +10,47 @@ disable-model-invocation: true
|
|
|
10
10
|
|
|
11
11
|
Page request: $ARGUMENTS
|
|
12
12
|
|
|
13
|
-
Add UIify
|
|
13
|
+
Add UIify knowledge using the agent's normal workflow and project instructions. Do not add approval gates, fixed stages, routine questions or pauses. Work autonomously. Use ordinary language in the user's language, without internal stage names or machine-readable status markers.
|
|
14
14
|
|
|
15
15
|
## Project context
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
If `$ARGUMENTS` is not substituted, use the explicit conversation request. Inspect repository instructions and relevant manifest, framework config and route examples. Resolve `@gunkin/uiify` from the selected workspace, including hoisted dependencies. Follow the framework's route conventions and RSC/client boundaries; `src/App.tsx` is a destination only when requested. Preserve the home page when creating another route.
|
|
18
18
|
|
|
19
|
-
Reuse existing design decisions, tokens and conventions, including `DESIGN.md` when present. Do not create `DESIGN.md` or
|
|
19
|
+
Reuse existing design decisions, tokens and conventions, including `DESIGN.md` when present. Do not create `DESIGN.md` or managed state merely for this skill. Setup, dependencies and planning files follow project rules and the request. Preserve unrelated files, routes and content.
|
|
20
20
|
|
|
21
21
|
## Choose an approach before composition
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
Choose internally: reproduce a supplied reference; extend the existing UI for scoped work; create/redesign for a new direction; audit for findings only. For a reference, read its guide before composition and compare again after rendering.
|
|
24
24
|
|
|
25
|
-
|
|
26
|
-
- Extend the existing UI for a scoped change; keep surrounding routes and established design choices intact.
|
|
27
|
-
- Create or redesign when the request asks for a new page or a broad visual change.
|
|
28
|
-
- Audit when the user asks for findings rather than implementation; report observed issues and evidence.
|
|
25
|
+
For a compact plan or handoff, use a UI brief:
|
|
29
26
|
|
|
30
|
-
|
|
27
|
+
```text
|
|
28
|
+
Place + job: /settings/profile — edit delivery preferences.
|
|
29
|
+
Keep + UI: existing routes/theme; Field email, Select frequency, Checkbox marketing, Button save.
|
|
30
|
+
Flow + proof: invalid → inline error; valid → demo confirmation + retained values; keyboard, narrow layout.
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Adapt or reuse the brief in the user's language; no parser, required file or output. Keep exact API names; expand ambiguity before coding.
|
|
34
|
+
|
|
35
|
+
Use this precedence: explicit brief or reference → existing project → selected recipes → aesthetic guidance.
|
|
31
36
|
|
|
32
|
-
When images or typography shape the composition, read `references/guides/assets.md` before choosing material.
|
|
37
|
+
When images or typography shape the composition, read `references/guides/assets.md` before choosing material.
|
|
33
38
|
|
|
34
39
|
## Select knowledge for the page
|
|
35
40
|
|
|
36
|
-
|
|
41
|
+
`references/` paths are relative to this skill directory; `agents/` paths are relative to the resolved package root. Read each distinct file once, reusing it across selected elements.
|
|
37
42
|
|
|
38
|
-
|
|
43
|
+
Match the needed elements to the Index by name or alias. Use the listed component binding; never invent a binding. A `gap` or an unlisted element needs custom UI composed from available UIify controls or semantic native HTML, not a guessed UIify API.
|
|
39
44
|
|
|
40
|
-
For
|
|
45
|
+
For each selected element with a fourth-column reference path, read that file once. A blank path means no curated recipe. Read and adapt its linked example for part wiring. From the Composition index, read only relationships where both elements are needed. Follow each selected reference and linked law, including laws named by element recipes. Do not load unrelated references or the complete catalog.
|
|
46
|
+
|
|
47
|
+
For mapped components, read the package's `agents/index.md` and relevant `agents/reference/components/<name>.md`, then adapt a documented example. Check its Runtime exports before rendering: use the explicit `NameRoot` export when available. A namespace export is not itself a JSX component; use its `.Root` or an explicit root export. Import from `@gunkin/uiify/components/<name>`. If the reference leaves an export, required prop or part relationship ambiguous, inspect its listed Types/declaration file and runtime exports before using it. Prefer these version-matched references over memory.
|
|
48
|
+
|
|
49
|
+
Reuse documented UIify components, including controls inside custom gaps. Check `agents/components.md` for controls absent from recipes. Do not replace an available Button, Input, Checkbox or AlertModal with a raw-tag lookalike. Keep native HTML when no component fits, the page demonstrates native semantics, or layer rules prohibit the import; preserve semantic structures such as `fieldset`, `dl` and forms.
|
|
41
50
|
|
|
42
51
|
## Design guidance
|
|
43
52
|
|
|
44
|
-
Consult `frontend-design`
|
|
53
|
+
Consult `frontend-design` for visual direction; if absent, use the built-in guidance below. Optional: `vercel-react-best-practices` for React performance, `web-design-guidelines` for reviews. UIify's public component and styling contracts take precedence over conflicting advice.
|
|
45
54
|
|
|
46
55
|
After the page renders, review it with a guide only when its question applies:
|
|
47
56
|
|
|
@@ -53,30 +62,21 @@ After the page renders, review it with a guide only when its question applies:
|
|
|
53
62
|
- `references/guides/states.md` — does the page still work outside the happy path?
|
|
54
63
|
- `references/guides/i18n.md` — only when the page is localized, the project has an i18n setup, or the request mentions languages, RTL or CJK.
|
|
55
64
|
|
|
56
|
-
Ground
|
|
65
|
+
Ground visual direction in the subject, audience and primary job. Use clear typography, hierarchy, grouping, purposeful copy, responsive layout and existing semantic color roles. Choose one signature detail; keep the rest restrained. Avoid automatic gradient heroes, equal cards or decorative numbering. Preserve visible focus, keyboard-sized targets and reduced-motion behavior.
|
|
57
66
|
|
|
58
|
-
For a settings page, group fields by the
|
|
67
|
+
For a settings page, group fields by decision and give one `Button` the save action. Adapt the Field example in `agents/index.md`: Root gets `id`, Label/Control/Description/Error get the same `fieldId`. Pass `invalid`/`required` to both Root and Control. `Field.Control as="input"` supplies UIify Input and its ID. Keep Field's ID/ARIA wiring and Description mounted when showing Error. Wrap standalone `Select.Root` in a native `<label>`; Field.Label wires only Field.Control.
|
|
59
68
|
|
|
60
|
-
|
|
61
|
-
<Field.Root id="email" invalid={invalid} required>
|
|
62
|
-
<Field.Label fieldId="email" required>Email</Field.Label>
|
|
63
|
-
<Field.Control as="input" fieldId="email" type="email" invalid={invalid} required />
|
|
64
|
-
<Field.Error fieldId="email" invalid={invalid}>Enter a valid email address</Field.Error>
|
|
65
|
-
</Field.Root>
|
|
66
|
-
<Button type="submit">Save changes</Button>
|
|
67
|
-
```
|
|
69
|
+
Wire each requested action through its outcome: a dialog closing is not a mutation. Keep cancel/error paths safe; if an action removes its opener, focus a surviving target, including the empty state. Describe in-memory demos as demos; claim persistence only when implemented.
|
|
68
70
|
|
|
69
71
|
Do not add an unrelated marketing hero or make every field group an equally prominent card. For unresolved gaps, explain material limitations in plain language; research only when it helps the request. Research does not grant approval to change the library's public API or mark a catalog gap accepted.
|
|
70
72
|
|
|
71
73
|
## Verification guidance
|
|
72
74
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
Reuse existing browser and accessibility tooling to inspect responsive layouts, keyboard access and requested interactions. When missing tools are needed for quality verification, use Playwright for browser checks and axe-core (or the project's axe integration) for accessibility checks. Before installing missing Playwright or axe-core packages or downloading browser binaries, notify the user briefly in their language, explaining what will be installed and why. For example: “I'll install Playwright and axe-core as development tools to check the page in a browser and catch accessibility issues.” This is a notification, not a confirmation question; continue within existing authorization and respect project installation rules. Use the project's package manager and development dependencies, reuse existing integrations, and install only what is needed.
|
|
75
|
+
Finish the edits before running applicable project build, typecheck and test commands. Run relevant verification once against the stable result. On failure, fix related findings together, diagnose with focused checks, then rerun the required final gate. For the optional static lint and its limits, read `references/guides/verification.md`.
|
|
76
76
|
|
|
77
|
-
|
|
77
|
+
Reuse existing browser and accessibility tooling for responsive layouts, keyboard access and requested interactions. Before installing missing Playwright or axe-core tooling or browser binaries, notify the user what is needed and why. This is a notification, not a confirmation question; follow project rules, its package manager and development dependencies. Use Playwright for browser checks and axe-core for accessibility.
|
|
78
78
|
|
|
79
|
-
Repair findings within
|
|
79
|
+
Repair findings within scope and rerun affected checks. Report unavailable or prohibited checks as not run, with the reason; never claim a check passed without running it.
|
|
80
80
|
|
|
81
81
|
## Index
|
|
82
82
|
|
|
@@ -85,13 +85,14 @@ One line per element: `element|aliases|uiify component or gap|reference path`. A
|
|
|
85
85
|
```text
|
|
86
86
|
accordion|faq-accordion,disclosure|accordion|references/elements/accordion.md
|
|
87
87
|
alert-modal|confirmation-dialog,alert-dialog|alert-modal|references/elements/alert-modal.md
|
|
88
|
-
|
|
89
|
-
|
|
88
|
+
aspect-ratio|media-frame,responsive-embed|aspect-ratio|references/elements/aspect-ratio.md
|
|
89
|
+
avatar|profile-picture|avatar|references/elements/avatar.md
|
|
90
|
+
badge|chip,tag|badge|references/elements/badge.md
|
|
90
91
|
bar-chart|column-chart|gap|references/elements/bar-chart.md
|
|
91
92
|
breadcrumb|breadcrumbs|breadcrumb|references/elements/breadcrumb.md
|
|
92
93
|
button|cta-button,icon-button,primary-button|button|references/elements/button.md
|
|
93
94
|
candle-chart|candlestick-chart|candle-chart|references/elements/candle-chart.md
|
|
94
|
-
card|content-card|
|
|
95
|
+
card|content-card|card|references/elements/card.md
|
|
95
96
|
carousel|testimonial-carousel,image-slider|carousel|references/elements/carousel.md
|
|
96
97
|
checkbox||checkbox|references/elements/checkbox.md
|
|
97
98
|
code-block|code-snippet|gap|references/elements/code-block.md
|
|
@@ -101,22 +102,27 @@ combobox|autocomplete,typeahead|combobox|references/elements/combobox.md
|
|
|
101
102
|
command-palette|spotlight-search|gap|references/elements/command-palette.md
|
|
102
103
|
context-menu|right-click-menu|context-menu|references/elements/context-menu.md
|
|
103
104
|
cookie-banner|cookie-consent|gap|references/elements/cookie-banner.md
|
|
104
|
-
date-picker|calendar-picker|
|
|
105
|
+
date-picker|native-date-field,calendar-picker|date-picker|references/elements/date-picker.md
|
|
106
|
+
description-list|definition-list,key-value-list|description-list|references/elements/description-list.md
|
|
105
107
|
divider|separator|gap|references/elements/divider.md
|
|
106
108
|
drawer|sheet,off-canvas-menu|drawer|references/elements/drawer.md
|
|
107
109
|
dropdown-menu|menu|dropdown-menu|references/elements/dropdown-menu.md
|
|
108
|
-
empty-state|
|
|
110
|
+
empty-state|empty-state|empty|references/elements/empty-state.md
|
|
109
111
|
feature-grid|feature-cards,feature-list|gap|references/elements/feature-grid.md
|
|
110
112
|
field|form-field|field|references/elements/field.md
|
|
113
|
+
fieldset|fieldset-legend|fieldset|references/elements/fieldset.md
|
|
111
114
|
file-upload|file-input,dropzone|file-upload|references/elements/file-upload.md
|
|
112
115
|
footer|site-footer|gap|references/elements/footer.md
|
|
113
116
|
form||form|references/elements/form.md
|
|
117
|
+
form-error-summary|error-summary|form-error-summary|references/elements/form-error-summary.md
|
|
114
118
|
header|navbar,top-nav|header|references/elements/header.md
|
|
115
119
|
hero|hero-section,hero-banner|gap|references/elements/hero.md
|
|
116
120
|
hover-card||hover-card|references/elements/hover-card.md
|
|
117
121
|
image-gallery|gallery,lightbox|gap|references/elements/image-gallery.md
|
|
118
|
-
inline-alert|banner-alert,callout|
|
|
122
|
+
inline-alert|banner-alert,callout|alert|references/elements/inline-alert.md
|
|
119
123
|
input|text-input|input|references/elements/input.md
|
|
124
|
+
input-group|input-prefix-suffix|input-group|references/elements/input-group.md
|
|
125
|
+
item|list-item|item|references/elements/item.md
|
|
120
126
|
line-chart|sparkline|line-chart|references/elements/line-chart.md
|
|
121
127
|
logo-wall|logo-cloud,customer-logos|gap|references/elements/logo-wall.md
|
|
122
128
|
modal|dialog|modal|references/elements/modal.md
|
|
@@ -126,7 +132,7 @@ pagination||pagination|references/elements/pagination.md
|
|
|
126
132
|
password-input|show-hide-password|gap|references/elements/password-input.md
|
|
127
133
|
popup|popover|popup|references/elements/popup.md
|
|
128
134
|
pricing-table|pricing,plan-cards,pricing-plans|gap|references/elements/pricing-table.md
|
|
129
|
-
progress-bar|progress,linear-progress|
|
|
135
|
+
progress-bar|progress,linear-progress|progress|references/elements/progress-bar.md
|
|
130
136
|
radio-group|radio|radio-group|references/elements/radio-group.md
|
|
131
137
|
rating|star-rating|rating|references/elements/rating.md
|
|
132
138
|
search-input|search-box|gap|references/elements/search-input.md
|
|
@@ -6,7 +6,7 @@ A short, important message requires an immediate response, especially confirmati
|
|
|
6
6
|
|
|
7
7
|
## Use when
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Confirm a consequential action. Use a regular modal for a task or optional information, inline validation for recoverable form errors.
|
|
10
10
|
|
|
11
11
|
## Avoid when
|
|
12
12
|
|
|
@@ -14,19 +14,19 @@ Do not use alert dialogs for routine notices or long, structured content. Do not
|
|
|
14
14
|
|
|
15
15
|
## Structure
|
|
16
16
|
|
|
17
|
-
The convenience `AlertModal` provides a trigger, visible title, optional short description, Cancel, and Action. State the consequence in the description and make both choices explicit; the action uses the destructive variant.
|
|
17
|
+
The convenience `AlertModal` provides a trigger, visible title, optional short description, Cancel, and Action. State the consequence in the description and make both choices explicit; the action uses the destructive variant. When composing parts, give the title and description unique IDs and put matching `aria-labelledby` and `aria-describedby` on `AlertModalContent`; the parts do not infer them.
|
|
18
18
|
|
|
19
19
|
## Responsive
|
|
20
20
|
|
|
21
|
-
Keep the message concise
|
|
21
|
+
Keep the message concise and wrapping at narrow widths and zoom. Explain consequences in text.
|
|
22
22
|
|
|
23
23
|
## States
|
|
24
24
|
|
|
25
|
-
Tier 0 uses a native
|
|
25
|
+
Tier 0 uses a native [dialog role=alertdialog] opened by invokers. Cancel and Action request close; the convenience shell does not perform an application action. For mutations, compose `AlertModalTrigger`, `AlertModalContent`, `AlertModalCancel`, `AlertModalAction` from `@gunkin/uiify/components/alert-modal`: Content's `id` matches each button's `target`. Connect Action's native `onClick` to the effect in your application's client boundary. There is no `alert-modal/client` entry. `onClose` alone does not mean confirmation: Cancel and Escape also close. Keep those paths free of mutations.
|
|
26
26
|
|
|
27
27
|
## Verify
|
|
28
28
|
|
|
29
|
-
Check
|
|
29
|
+
Check name/description, keyboard opening/closing, containment, return and narrow/zoomed layout. Confirm initial focus lands on Cancel, the safe choice: `AlertModal` renders Cancel before Action, so keep focusable content out of the dialog body above them. Cancel/Escape retain native opener focus. Only when confirmation removes that opener, focus the next/previous row or an empty-state heading with `tabIndex={-1}`. An unconditional `onClose` focus override also runs after Cancel/Escape and breaks their return.
|
|
30
30
|
|
|
31
31
|
## Common mistake
|
|
32
32
|
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# aspect-ratio
|
|
2
|
+
|
|
3
|
+
Binding: aspect-ratio
|
|
4
|
+
|
|
5
|
+
Frame media at a preferred proportion as available inline size changes.
|
|
6
|
+
|
|
7
|
+
## Use when
|
|
8
|
+
|
|
9
|
+
Media needs a stable shape as available inline size changes.
|
|
10
|
+
|
|
11
|
+
## Avoid when
|
|
12
|
+
|
|
13
|
+
Text or controls must determine height. Keep captions outside the frame; preserve meaningful image detail.
|
|
14
|
+
|
|
15
|
+
## Structure
|
|
16
|
+
|
|
17
|
+
```tsx
|
|
18
|
+
import { AspectRatio } from "@gunkin/uiify";
|
|
19
|
+
import "@gunkin/uiify/components/behavior.css";
|
|
20
|
+
|
|
21
|
+
<AspectRatio ratio={16 / 9} className="media-frame">
|
|
22
|
+
<img src="/landscape.jpg" alt="Mountain lake" width={1600} height={900} />
|
|
23
|
+
</AspectRatio>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
Direct import: `@gunkin/uiify/components/aspect-ratio`. This reusable layout Component is Tier 0. It renders two wrappers: root `data-uiify-aspect-ratio`, then `data-part="content"` around children. Root forwards native props, events, `className`, `style`, `ref`, `as` and `render`; custom renderers must forward props/ref. Owned markers cannot be overridden.
|
|
27
|
+
|
|
28
|
+
`ratio?: number` accepts a positive finite number (width/height). Square default: `1`; invalid numbers fall back to `1`. Omission leaves the stylesheet default and permits a CSS `--uiify-aspect-ratio` override; an explicit ratio writes that property.
|
|
29
|
+
|
|
30
|
+
## Responsive
|
|
31
|
+
|
|
32
|
+
Let the parent constrain width. Required behavior CSS uses native `aspect-ratio` and absolute content to isolate intrinsic child sizing. Media fit and visuals are optional consumer CSS:
|
|
33
|
+
|
|
34
|
+
```css
|
|
35
|
+
.media-frame [data-part="content"] > img {
|
|
36
|
+
inline-size: 100%;
|
|
37
|
+
block-size: 100%;
|
|
38
|
+
object-fit: cover;
|
|
39
|
+
}
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Use `contain` to retain the whole image. The component imposes no fitting or clipping on arbitrary children.
|
|
43
|
+
|
|
44
|
+
## States
|
|
45
|
+
|
|
46
|
+
Static sizing has no loading, playback, focus or hydration state and needs no client JavaScript.
|
|
47
|
+
|
|
48
|
+
## Verify
|
|
49
|
+
|
|
50
|
+
Check square, 16:9 and 4:5 frames with scripts disabled at narrow/wide widths, oversized intrinsic media, cover/contain crops, RTL and CJK captions at 200% text size. Check embeds' keyboard behavior separately.
|
|
51
|
+
|
|
52
|
+
## Common mistake
|
|
53
|
+
|
|
54
|
+
Definite width and height defeat preferred-ratio sizing. Avoid JS measurement, padding emulation, or meaningful text inside the media area.
|
|
55
|
+
|
|
56
|
+
## Sources
|
|
57
|
+
|
|
58
|
+
- [www.radix-ui.com](https://www.radix-ui.com/primitives/docs/components/aspect-ratio) (verified 2026-10-19)
|
|
59
|
+
- [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/aspect-ratio) (verified 2026-10-19)
|
|
@@ -1,47 +1,38 @@
|
|
|
1
1
|
# avatar
|
|
2
2
|
|
|
3
|
-
Binding:
|
|
3
|
+
Binding: avatar
|
|
4
4
|
|
|
5
5
|
Identify a person or account with a compact image and fallback.
|
|
6
6
|
|
|
7
7
|
## Use when
|
|
8
8
|
|
|
9
|
-
A
|
|
9
|
+
A compact portrait or initials help distinguish a person near comments, participants, or account details.
|
|
10
10
|
|
|
11
11
|
## Avoid when
|
|
12
12
|
|
|
13
|
-
Do not
|
|
13
|
+
Do not rely on the avatar as the only visible way to identify a person. Skip it when it adds no information.
|
|
14
14
|
|
|
15
15
|
## Structure
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
`Avatar` requires `name` and `fallback`; the root is named as an image. Without `src`, it displays the fallback. With `src`, it renders an empty-alt image. Set `aria-hidden="true"` when adjacent visible text already names the person.
|
|
18
18
|
|
|
19
19
|
## Responsive
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
Choose `size` (`sm`, `md`, or `lg`) for a consistent compact footprint. Keep the person's visible name available in reading order where the surrounding composition needs it.
|
|
22
22
|
|
|
23
23
|
## States
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
The fallback is chosen when `src` is absent at render time. A later image-load failure does not replace it automatically.
|
|
26
26
|
|
|
27
27
|
## Verify
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
Unit and public-page tests check the accessible image name, fallback and empty-alt image markup, size attributes, and the adjacent visible-name pattern.
|
|
30
30
|
|
|
31
31
|
## Common mistake
|
|
32
32
|
|
|
33
|
-
Repeating the adjacent name in alt text
|
|
34
|
-
|
|
35
|
-
## Custom implementation
|
|
36
|
-
|
|
37
|
-
```html
|
|
38
|
-
<img src="/people/ada.webp" width="40" height="40" alt="" />
|
|
39
|
-
<span>Ada Lovelace</span>
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
This is an app-level composition; UIify does not currently ship this component.
|
|
33
|
+
Repeating the adjacent person's name in image alt text can announce the identity twice.
|
|
43
34
|
|
|
44
35
|
## Sources
|
|
45
36
|
|
|
46
|
-
- [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img) (verified 2026-10-
|
|
47
|
-
- [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/non-text-content.html) (verified 2026-10-
|
|
37
|
+
- [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img) (verified 2026-10-19)
|
|
38
|
+
- [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/non-text-content.html) (verified 2026-10-19)
|
|
@@ -1,47 +1,39 @@
|
|
|
1
1
|
# badge
|
|
2
2
|
|
|
3
|
-
Binding:
|
|
3
|
+
Binding: badge
|
|
4
4
|
|
|
5
5
|
Mark a short status or category beside related content.
|
|
6
6
|
|
|
7
7
|
## Use when
|
|
8
8
|
|
|
9
|
-
A short
|
|
9
|
+
A short visible label helps people scan the state or category of nearby content.
|
|
10
10
|
|
|
11
11
|
## Avoid when
|
|
12
12
|
|
|
13
|
-
Do not use
|
|
13
|
+
Do not use Badge as a control, for long explanations, or for status conveyed by color alone.
|
|
14
14
|
|
|
15
15
|
## Structure
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
`Badge` renders a text `span`. Its `variant` (`secondary`, `success`, `warning`, or `destructive`) and `size` (`sm`, `md`, or `lg`) write `data-variant` and `data-size`. Keep the state or category in the text.
|
|
18
18
|
|
|
19
19
|
## Responsive
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
Keep labels concise and attached to the related content in reading order. Check long translated text and zoom.
|
|
22
22
|
|
|
23
23
|
## States
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
Badge is static text. It does not add a role, keyboard behavior, selection state, or live announcement.
|
|
26
26
|
|
|
27
27
|
## Verify
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
Unit tests check the native span, text, optional attributes, root props and ref. Check contrast and meaning without color in the consumer's chosen theme.
|
|
30
30
|
|
|
31
31
|
## Common mistake
|
|
32
32
|
|
|
33
|
-
A
|
|
34
|
-
|
|
35
|
-
## Custom implementation
|
|
36
|
-
|
|
37
|
-
```html
|
|
38
|
-
<p>Deployment <span>Pending review</span></p>
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
This is an app-level composition; UIify does not currently ship this component.
|
|
33
|
+
A colored dot or a green background without a textual status does not explain the state.
|
|
42
34
|
|
|
43
35
|
## Sources
|
|
44
36
|
|
|
45
|
-
- [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/span) (verified 2026-10-
|
|
46
|
-
- [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html) (verified 2026-10-
|
|
47
|
-
- [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/use-of-color.html) (verified 2026-10-
|
|
37
|
+
- [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/span) (verified 2026-10-19)
|
|
38
|
+
- [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html) (verified 2026-10-19)
|
|
39
|
+
- [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/use-of-color.html) (verified 2026-10-19)
|
|
@@ -1,51 +1,40 @@
|
|
|
1
1
|
# card
|
|
2
2
|
|
|
3
|
-
Binding:
|
|
3
|
+
Binding: card
|
|
4
4
|
|
|
5
5
|
Group one feature heading and its explanation.
|
|
6
6
|
|
|
7
7
|
## Use when
|
|
8
8
|
|
|
9
|
-
A
|
|
9
|
+
A related heading, explanation, and optional links or actions need a clear content group.
|
|
10
10
|
|
|
11
11
|
## Avoid when
|
|
12
12
|
|
|
13
|
-
Do not wrap every paragraph or list item in a card. Avoid
|
|
13
|
+
Do not wrap every paragraph or list item in a card. Avoid whole-surface click behavior when the card contains independent controls.
|
|
14
14
|
|
|
15
15
|
## Structure
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
`Card` renders a `div` by default and accepts `as` for a semantic root such as `article`. Compose native headings, text, links, and buttons as children; each control remains independent.
|
|
18
18
|
|
|
19
19
|
## Responsive
|
|
20
20
|
|
|
21
|
-
Keep
|
|
21
|
+
Let content set the height. Keep links readable and allow the layout around cards to stack in source order at narrow widths and zoom.
|
|
22
22
|
|
|
23
23
|
## States
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
Card has no selection or interaction state. Add interactive semantics to a link, button, or other child only.
|
|
26
26
|
|
|
27
27
|
## Verify
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
Unit and public-page tests check the content root and independent link. Check heading order, focus visibility on child controls, and one-column reflow in the consumer layout.
|
|
30
30
|
|
|
31
31
|
## Common mistake
|
|
32
32
|
|
|
33
|
-
Making
|
|
34
|
-
|
|
35
|
-
## Custom implementation
|
|
36
|
-
|
|
37
|
-
```html
|
|
38
|
-
<article aria-labelledby="plan-title">
|
|
39
|
-
<h2 id="plan-title"><a href="/plans/pro">Pro plan</a></h2>
|
|
40
|
-
<p>For teams that need shared workspaces.</p>
|
|
41
|
-
</article>
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
This is an app-level composition; UIify does not currently ship this component.
|
|
33
|
+
Making the whole card a link while also nesting other links or buttons creates ambiguous interactive content.
|
|
45
34
|
|
|
46
35
|
Related laws: references/laws/proximity.md, references/laws/readability.md
|
|
47
36
|
|
|
48
37
|
## Sources
|
|
49
38
|
|
|
50
|
-
- [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html) (verified 2026-10-
|
|
51
|
-
- [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/visual-presentation.html) (verified 2026-10-
|
|
39
|
+
- [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html) (verified 2026-10-19)
|
|
40
|
+
- [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/visual-presentation.html) (verified 2026-10-19)
|
|
@@ -14,7 +14,7 @@ Use a radio group when exactly one option can be selected. Use a switch for a si
|
|
|
14
14
|
|
|
15
15
|
## Structure
|
|
16
16
|
|
|
17
|
-
Use the documented Checkbox with a stable id and a visible, descriptive label. Group related choices in a fieldset with a legend; use the indeterminate state only for an aggregate that represents mixed child selections.
|
|
17
|
+
Use the documented Checkbox with a stable id and a visible, descriptive label. For form submission, provide its native `name` and `value`. Group related choices in a fieldset with a legend; use the indeterminate state only for an aggregate that represents mixed child selections.
|
|
18
18
|
|
|
19
19
|
## Responsive
|
|
20
20
|
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# date-picker
|
|
2
2
|
|
|
3
|
-
Binding:
|
|
3
|
+
Binding: date-picker
|
|
4
4
|
|
|
5
|
-
Collect one calendar date
|
|
5
|
+
Collect one calendar date with the browser’s native date input.
|
|
6
6
|
|
|
7
7
|
## Use when
|
|
8
8
|
|
|
@@ -10,34 +10,30 @@ Collect one calendar date without a time, such as a start or due date.
|
|
|
10
10
|
|
|
11
11
|
## Avoid when
|
|
12
12
|
|
|
13
|
-
Use a date-time control when time matters.
|
|
13
|
+
Use a date-time control when time matters. Do not replace the native picker with a custom calendar unless its keyboard and assistive-technology behavior is in scope and tested.
|
|
14
14
|
|
|
15
15
|
## Structure
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
`DatePicker` renders a native `input[type="date"]`. It accepts native input props and ref except `type`, which is fixed; `invalid` sets `aria-invalid` and `data-invalid`. Add a separate visible label and caller-owned help/error relationships. Use `min`, `max`, `required`, `name`, and `value` only as needed. The submitted date is `yyyy-mm-dd`; display and picker UI belong to the browser and locale.
|
|
18
18
|
|
|
19
19
|
## Responsive
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
The optional stylesheet styles only the outer control: border, surface/text, typography, logical padding, minimum inline size, focus, invalid, and disabled state. Preserve native `appearance`, picker icon, and calendar internals.
|
|
22
22
|
|
|
23
23
|
## States
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
Preserve native empty/value, required, bounds, disabled, and invalid behavior. Revalidate on the server; a date-only value is not a timestamp or time-zone value.
|
|
26
26
|
|
|
27
27
|
## Verify
|
|
28
28
|
|
|
29
|
-
Test
|
|
29
|
+
Test label, native entry/picker, submitted value, required/bounds, visible focus, invalid/disabled style, and narrow layout with JavaScript disabled. Browser picker operation and visuals remain unverified until each target engine is exercised.
|
|
30
30
|
|
|
31
31
|
## Common mistake
|
|
32
32
|
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
## Custom implementation
|
|
36
|
-
|
|
37
|
-
Use a labelled native input with type date. This app-level pattern does not add a UIify date-picker component.
|
|
33
|
+
Do not add a custom calendar, convert the date to a time-zone timestamp, style vendor-only picker pseudo-elements, or use a placeholder as the only label.
|
|
38
34
|
|
|
39
35
|
## Sources
|
|
40
36
|
|
|
41
|
-
- [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/input/date) (verified 2026-10-
|
|
42
|
-
- [
|
|
43
|
-
- [www.w3.org](https://www.w3.org/WAI/tutorials/forms/
|
|
37
|
+
- [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/input/date) (verified 2026-10-19)
|
|
38
|
+
- [html.spec.whatwg.org](https://html.spec.whatwg.org/multipage/input.html) (verified 2026-10-19)
|
|
39
|
+
- [www.w3.org](https://www.w3.org/WAI/tutorials/forms/labels/) (verified 2026-10-19)
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# description-list
|
|
2
|
+
|
|
3
|
+
Binding: description-list
|
|
4
|
+
|
|
5
|
+
Present descriptive terms and their associated values.
|
|
6
|
+
|
|
7
|
+
## Use when
|
|
8
|
+
|
|
9
|
+
Show descriptive metadata as terms with associated values, such as status and owner.
|
|
10
|
+
|
|
11
|
+
## Avoid when
|
|
12
|
+
|
|
13
|
+
Use a table for tabular data and a list for tasks or actions. Do not use `dl` as a generic visual grid without term/value relationships.
|
|
14
|
+
|
|
15
|
+
## Structure
|
|
16
|
+
|
|
17
|
+
`DescriptionList` renders `dl`; compose `DescriptionTerm` (`dt`) and `DescriptionDetails` (`dd`) in consumer-authored source order. Keep each term adjacent to its description. Multiple terms or descriptions may be grouped when the content calls for it; no table roles or action-column API is added.
|
|
18
|
+
|
|
19
|
+
## Responsive
|
|
20
|
+
|
|
21
|
+
Let terms and long values wrap. A visual grid may stack at narrow widths, but DOM order remains term then details and uses logical CSS.
|
|
22
|
+
|
|
23
|
+
## States
|
|
24
|
+
|
|
25
|
+
This is static descriptive content with no selection or interaction state.
|
|
26
|
+
|
|
27
|
+
## Verify
|
|
28
|
+
|
|
29
|
+
Check source order, term/value pairing, long and CJK values, RTL, and zoom reflow. Assistive-technology announcements vary; no browser or screen-reader verification is recorded.
|
|
30
|
+
|
|
31
|
+
## Common mistake
|
|
32
|
+
|
|
33
|
+
Do not replace the native `dl`/`dt`/`dd` structure with table roles or make values depend on visual column alignment.
|
|
34
|
+
|
|
35
|
+
## Sources
|
|
36
|
+
|
|
37
|
+
- [design-system.service.gov.uk](https://design-system.service.gov.uk/components/summary-list/) (verified 2026-10-19)
|
|
38
|
+
- [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/dl) (verified 2026-10-19)
|