@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.
Files changed (237) hide show
  1. package/agents/components.md +13 -0
  2. package/agents/index.md +31 -1
  3. package/agents/reference/components/alert.md +44 -0
  4. package/agents/reference/components/aspect-ratio.md +26 -0
  5. package/agents/reference/components/avatar.md +32 -0
  6. package/agents/reference/components/badge.md +31 -0
  7. package/agents/reference/components/card.md +24 -0
  8. package/agents/reference/components/checkbox.md +2 -0
  9. package/agents/reference/components/date-picker.md +23 -0
  10. package/agents/reference/components/description-list.md +38 -0
  11. package/agents/reference/components/empty.md +45 -0
  12. package/agents/reference/components/fieldset.md +31 -0
  13. package/agents/reference/components/form-error-summary.md +33 -0
  14. package/agents/reference/components/input-group.md +33 -0
  15. package/agents/reference/components/item.md +52 -0
  16. package/agents/reference/components/progress.md +16 -0
  17. package/dist/components/alert/Alert.d.ts +15 -0
  18. package/dist/components/alert/Alert.d.ts.map +1 -0
  19. package/dist/components/alert/Alert.js +61 -0
  20. package/dist/components/alert/Alert.js.map +1 -0
  21. package/dist/components/alert/index.d.ts +3 -0
  22. package/dist/components/alert/index.d.ts.map +1 -0
  23. package/dist/components/alert/index.js +7 -0
  24. package/dist/components/alert/index.js.map +1 -0
  25. package/dist/components/alert/types.d.ts +20 -0
  26. package/dist/components/alert/types.d.ts.map +1 -0
  27. package/dist/components/alert/types.js +1 -0
  28. package/dist/components/alert/types.js.map +1 -0
  29. package/dist/components/alert.d.ts +1 -0
  30. package/dist/components/alert.js +1 -0
  31. package/dist/components/aspect-ratio/AspectRatio.d.ts +7 -0
  32. package/dist/components/aspect-ratio/AspectRatio.d.ts.map +1 -0
  33. package/dist/components/aspect-ratio/AspectRatio.js +26 -0
  34. package/dist/components/aspect-ratio/AspectRatio.js.map +1 -0
  35. package/dist/components/aspect-ratio/index.d.ts +3 -0
  36. package/dist/components/aspect-ratio/index.d.ts.map +1 -0
  37. package/dist/components/aspect-ratio/index.js +5 -0
  38. package/dist/components/aspect-ratio/index.js.map +1 -0
  39. package/dist/components/aspect-ratio/types.d.ts +9 -0
  40. package/dist/components/aspect-ratio/types.d.ts.map +1 -0
  41. package/dist/components/aspect-ratio/types.js +1 -0
  42. package/dist/components/aspect-ratio/types.js.map +1 -0
  43. package/dist/components/aspect-ratio.d.ts +1 -0
  44. package/dist/components/aspect-ratio.js +1 -0
  45. package/dist/components/avatar/Avatar.d.ts +7 -0
  46. package/dist/components/avatar/Avatar.d.ts.map +1 -0
  47. package/dist/components/avatar/Avatar.js +24 -0
  48. package/dist/components/avatar/Avatar.js.map +1 -0
  49. package/dist/components/avatar/index.d.ts +3 -0
  50. package/dist/components/avatar/index.d.ts.map +1 -0
  51. package/dist/components/avatar/index.js +5 -0
  52. package/dist/components/avatar/index.js.map +1 -0
  53. package/dist/components/avatar/types.d.ts +12 -0
  54. package/dist/components/avatar/types.d.ts.map +1 -0
  55. package/dist/components/avatar/types.js +1 -0
  56. package/dist/components/avatar/types.js.map +1 -0
  57. package/dist/components/avatar.d.ts +1 -0
  58. package/dist/components/avatar.js +1 -0
  59. package/dist/components/badge/Badge.d.ts +7 -0
  60. package/dist/components/badge/Badge.d.ts.map +1 -0
  61. package/dist/components/badge/Badge.js +21 -0
  62. package/dist/components/badge/Badge.js.map +1 -0
  63. package/dist/components/badge/index.d.ts +3 -0
  64. package/dist/components/badge/index.d.ts.map +1 -0
  65. package/dist/components/badge/index.js +5 -0
  66. package/dist/components/badge/index.js.map +1 -0
  67. package/dist/components/badge/types.d.ts +11 -0
  68. package/dist/components/badge/types.d.ts.map +1 -0
  69. package/dist/components/badge/types.js +1 -0
  70. package/dist/components/badge/types.js.map +1 -0
  71. package/dist/components/badge.d.ts +1 -0
  72. package/dist/components/badge.js +1 -0
  73. package/dist/components/behavior.css +12 -0
  74. package/dist/components/behavior.css.map +1 -1
  75. package/dist/components/card/Card.d.ts +7 -0
  76. package/dist/components/card/Card.d.ts.map +1 -0
  77. package/dist/components/card/Card.js +16 -0
  78. package/dist/components/card/Card.js.map +1 -0
  79. package/dist/components/card/index.d.ts +3 -0
  80. package/dist/components/card/index.d.ts.map +1 -0
  81. package/dist/components/card/index.js +5 -0
  82. package/dist/components/card/index.js.map +1 -0
  83. package/dist/components/card/types.d.ts +7 -0
  84. package/dist/components/card/types.d.ts.map +1 -0
  85. package/dist/components/card/types.js +1 -0
  86. package/dist/components/card/types.js.map +1 -0
  87. package/dist/components/card.d.ts +1 -0
  88. package/dist/components/card.js +1 -0
  89. package/dist/components/checkbox/types.d.ts +2 -0
  90. package/dist/components/checkbox/types.d.ts.map +1 -1
  91. package/dist/components/date-picker/DatePicker.d.ts +7 -0
  92. package/dist/components/date-picker/DatePicker.d.ts.map +1 -0
  93. package/dist/components/date-picker/DatePicker.js +19 -0
  94. package/dist/components/date-picker/DatePicker.js.map +1 -0
  95. package/dist/components/date-picker/index.d.ts +3 -0
  96. package/dist/components/date-picker/index.d.ts.map +1 -0
  97. package/dist/components/date-picker/index.js +5 -0
  98. package/dist/components/date-picker/index.js.map +1 -0
  99. package/dist/components/date-picker/types.d.ts +5 -0
  100. package/dist/components/date-picker/types.d.ts.map +1 -0
  101. package/dist/components/date-picker/types.js +1 -0
  102. package/dist/components/date-picker/types.js.map +1 -0
  103. package/dist/components/date-picker.d.ts +1 -0
  104. package/dist/components/date-picker.js +1 -0
  105. package/dist/components/description-list/DescriptionList.d.ts +15 -0
  106. package/dist/components/description-list/DescriptionList.d.ts.map +1 -0
  107. package/dist/components/description-list/DescriptionList.js +48 -0
  108. package/dist/components/description-list/DescriptionList.js.map +1 -0
  109. package/dist/components/description-list/index.d.ts +3 -0
  110. package/dist/components/description-list/index.d.ts.map +1 -0
  111. package/dist/components/description-list/index.js +7 -0
  112. package/dist/components/description-list/index.js.map +1 -0
  113. package/dist/components/description-list/types.d.ts +15 -0
  114. package/dist/components/description-list/types.d.ts.map +1 -0
  115. package/dist/components/description-list/types.js +1 -0
  116. package/dist/components/description-list/types.js.map +1 -0
  117. package/dist/components/description-list.d.ts +1 -0
  118. package/dist/components/description-list.js +1 -0
  119. package/dist/components/empty/Empty.d.ts +19 -0
  120. package/dist/components/empty/Empty.d.ts.map +1 -0
  121. package/dist/components/empty/Empty.js +56 -0
  122. package/dist/components/empty/Empty.js.map +1 -0
  123. package/dist/components/empty/index.d.ts +3 -0
  124. package/dist/components/empty/index.d.ts.map +1 -0
  125. package/dist/components/empty/index.js +8 -0
  126. package/dist/components/empty/index.js.map +1 -0
  127. package/dist/components/empty/types.d.ts +19 -0
  128. package/dist/components/empty/types.d.ts.map +1 -0
  129. package/dist/components/empty/types.js +1 -0
  130. package/dist/components/empty/types.js.map +1 -0
  131. package/dist/components/empty.d.ts +1 -0
  132. package/dist/components/empty.js +1 -0
  133. package/dist/components/fieldset/Fieldset.d.ts +11 -0
  134. package/dist/components/fieldset/Fieldset.d.ts.map +1 -0
  135. package/dist/components/fieldset/Fieldset.js +38 -0
  136. package/dist/components/fieldset/Fieldset.js.map +1 -0
  137. package/dist/components/fieldset/index.d.ts +3 -0
  138. package/dist/components/fieldset/index.d.ts.map +1 -0
  139. package/dist/components/fieldset/index.js +6 -0
  140. package/dist/components/fieldset/index.js.map +1 -0
  141. package/dist/components/fieldset/types.d.ts +11 -0
  142. package/dist/components/fieldset/types.d.ts.map +1 -0
  143. package/dist/components/fieldset/types.js +1 -0
  144. package/dist/components/fieldset/types.js.map +1 -0
  145. package/dist/components/fieldset.d.ts +1 -0
  146. package/dist/components/fieldset.js +1 -0
  147. package/dist/components/form-error-summary/FormErrorSummary.d.ts +7 -0
  148. package/dist/components/form-error-summary/FormErrorSummary.d.ts.map +1 -0
  149. package/dist/components/form-error-summary/FormErrorSummary.js +25 -0
  150. package/dist/components/form-error-summary/FormErrorSummary.js.map +1 -0
  151. package/dist/components/form-error-summary/index.d.ts +3 -0
  152. package/dist/components/form-error-summary/index.d.ts.map +1 -0
  153. package/dist/components/form-error-summary/index.js +5 -0
  154. package/dist/components/form-error-summary/index.js.map +1 -0
  155. package/dist/components/form-error-summary/types.d.ts +12 -0
  156. package/dist/components/form-error-summary/types.d.ts.map +1 -0
  157. package/dist/components/form-error-summary/types.js +1 -0
  158. package/dist/components/form-error-summary/types.js.map +1 -0
  159. package/dist/components/form-error-summary.d.ts +1 -0
  160. package/dist/components/form-error-summary.js +1 -0
  161. package/dist/components/index.d.ts +13 -0
  162. package/dist/components/index.d.ts.map +1 -1
  163. package/dist/components/index.js +13 -0
  164. package/dist/components/index.js.map +1 -1
  165. package/dist/components/input-group/InputGroup.d.ts +5 -0
  166. package/dist/components/input-group/InputGroup.d.ts.map +1 -0
  167. package/dist/components/input-group/InputGroup.js +37 -0
  168. package/dist/components/input-group/InputGroup.js.map +1 -0
  169. package/dist/components/input-group/index.d.ts +3 -0
  170. package/dist/components/input-group/index.d.ts.map +1 -0
  171. package/dist/components/input-group/index.js +6 -0
  172. package/dist/components/input-group/index.js.map +1 -0
  173. package/dist/components/input-group/types.d.ts +12 -0
  174. package/dist/components/input-group/types.d.ts.map +1 -0
  175. package/dist/components/input-group/types.js +1 -0
  176. package/dist/components/input-group/types.js.map +1 -0
  177. package/dist/components/input-group.d.ts +1 -0
  178. package/dist/components/input-group.js +1 -0
  179. package/dist/components/internal/native-check-control/NativeCheckControl.d.ts.map +1 -1
  180. package/dist/components/internal/native-check-control/NativeCheckControl.js +4 -0
  181. package/dist/components/internal/native-check-control/NativeCheckControl.js.map +1 -1
  182. package/dist/components/internal/native-check-control/types.d.ts +2 -0
  183. package/dist/components/internal/native-check-control/types.d.ts.map +1 -1
  184. package/dist/components/item/Item.d.ts +23 -0
  185. package/dist/components/item/Item.d.ts.map +1 -0
  186. package/dist/components/item/Item.js +64 -0
  187. package/dist/components/item/Item.js.map +1 -0
  188. package/dist/components/item/index.d.ts +3 -0
  189. package/dist/components/item/index.d.ts.map +1 -0
  190. package/dist/components/item/index.js +9 -0
  191. package/dist/components/item/index.js.map +1 -0
  192. package/dist/components/item/types.d.ts +23 -0
  193. package/dist/components/item/types.d.ts.map +1 -0
  194. package/dist/components/item/types.js +1 -0
  195. package/dist/components/item/types.js.map +1 -0
  196. package/dist/components/item.d.ts +1 -0
  197. package/dist/components/item.js +1 -0
  198. package/dist/components/progress/Progress.d.ts +7 -0
  199. package/dist/components/progress/Progress.d.ts.map +1 -0
  200. package/dist/components/progress/Progress.js +9 -0
  201. package/dist/components/progress/Progress.js.map +1 -0
  202. package/dist/components/progress/index.d.ts +3 -0
  203. package/dist/components/progress/index.d.ts.map +1 -0
  204. package/dist/components/progress/index.js +5 -0
  205. package/dist/components/progress/index.js.map +1 -0
  206. package/dist/components/progress/types.d.ts +3 -0
  207. package/dist/components/progress/types.d.ts.map +1 -0
  208. package/dist/components/progress/types.js +1 -0
  209. package/dist/components/progress/types.js.map +1 -0
  210. package/dist/components/progress.d.ts +1 -0
  211. package/dist/components/progress.js +1 -0
  212. package/dist/styles/index.css +1 -1
  213. package/package.json +1 -1
  214. package/skills/uiify/SKILL.md +42 -36
  215. package/skills/uiify/references/elements/alert-modal.md +5 -5
  216. package/skills/uiify/references/elements/aspect-ratio.md +59 -0
  217. package/skills/uiify/references/elements/avatar.md +10 -19
  218. package/skills/uiify/references/elements/badge.md +11 -19
  219. package/skills/uiify/references/elements/card.md +10 -21
  220. package/skills/uiify/references/elements/checkbox.md +1 -1
  221. package/skills/uiify/references/elements/date-picker.md +11 -15
  222. package/skills/uiify/references/elements/description-list.md +38 -0
  223. package/skills/uiify/references/elements/empty-state.md +12 -23
  224. package/skills/uiify/references/elements/field.md +2 -2
  225. package/skills/uiify/references/elements/fieldset.md +39 -0
  226. package/skills/uiify/references/elements/form-error-summary.md +39 -0
  227. package/skills/uiify/references/elements/inline-alert.md +11 -19
  228. package/skills/uiify/references/elements/input-group.md +39 -0
  229. package/skills/uiify/references/elements/item.md +39 -0
  230. package/skills/uiify/references/elements/modal.md +1 -1
  231. package/skills/uiify/references/elements/progress-bar.md +11 -20
  232. package/skills/uiify/references/elements/select.md +1 -1
  233. package/skills/uiify/references/examples/alert-confirmation.md +21 -9
  234. package/skills/uiify/references/examples/field-validation.md +2 -2
  235. package/skills/uiify/references/examples/select-basic.md +1 -1
  236. package/skills/uiify/references/examples/table-controls.md +3 -2
  237. package/skills/uiify/references/guides/verification.md +9 -0
@@ -10,38 +10,47 @@ disable-model-invocation: true
10
10
 
11
11
  Page request: $ARGUMENTS
12
12
 
13
- Add UIify component and UX knowledge to the user's request. Follow the agent's normal workflow and the project's instructions; this skill is a reference, not a separate interaction protocol. Do not add approval gates, fixed stages, routine questions or pauses. Use ordinary language in the user's language for useful progress and results, without internal stage names or machine-readable status markers. Proceed with authorized work autonomously; handle genuine missing requirements through the agent's normal workflow.
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
- Use the explicit request in the conversation if the client does not substitute `$ARGUMENTS`. Read repository instructions, the relevant package manifest and framework config, and a route example as needed. Resolve `@gunkin/uiify` from the selected workspace, including hoisted dependencies in parent workspaces. Follow the requested framework's route conventions and RSC/client boundaries. Create the requested route rather than replacing the home page; `src/App.tsx` is a destination only when it matches the request.
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 a managed state block merely because this skill was invoked. Create or update planning files only when the user or project workflow calls for them, preserving unrelated content. Keep changes within the requested page and necessary source files; setup and dependency changes follow the user's request and project rules.
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
- Use the request to choose an internal approach; do not ask the user to choose a mode:
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
- - Reproduce an explicit visual reference while preserving its layout, content and recognizable details; read the reference guide before choosing composition and compare again after rendering.
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
- Use this precedence: explicit brief or reference → existing project → selected recipes → aesthetic guidance. This classification only guides the work; continue the agent's normal workflow.
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. Skip it for routine UI changes where imagery and type are not part of the design decision.
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
- 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, not a guessed UIify API.
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
- For each selected element with a fourth-column reference path, read that file once. A blank path means no curated recipe is available. From the Composition index, read only relationships where both elements are needed on the page. Read each selected reference and linked law once, including the related laws named by element recipes. Do not load the complete catalog or unrelated component references.
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 mapped components, read the resolved package's `agents/index.md` once and the relevant `agents/reference/components/<name>.md`, then adapt a documented example. Import from `@gunkin/uiify/components/<name>`. Inspect Runtime exports and the Types/declaration file 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. Prefer these version-matched references over memory. Use UIify wherever its documented API covers the interaction; for gaps, use semantic native HTML or custom components following UIify's public styling and accessibility contracts.
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` when available for design direction; if absent, use the built-in guidance below. Consult `vercel-react-best-practices` for relevant React performance decisions and `web-design-guidelines` for reviews. These skills are optional references. UIify's public component and styling contracts take precedence over conflicting advice.
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 the visual direction in the subject, audience and primary job. Plan clear typography, hierarchy, grouping, purposeful copy and responsive layout using existing semantic color roles. Choose one signature detail appropriate to the subject and keep the rest restrained. Avoid defaulting to a gradient hero, repeated equal cards or decorative numbering without a reason. Preserve visible focus, keyboard-sized targets and reduced-motion behavior.
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 decision the person makes, keep labels and validation close to controls, and give one `Button` the save action. Use documented anatomy:
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
- ```tsx
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
- Use applicable project build, typecheck and test commands when permitted. The optional `node <resolved-skill-directory>/scripts/lint.mjs <project-root>` runs the static checks compiled from the published laws when this skill was built and prints their names; it does not read `DESIGN.md` or other design files. It inspects literal attributes of lowercase intrinsic JSX tags and of parts imported from `@gunkin/uiify/components` or `@gunkin/uiify/elements` (for example `Button` or `Field.Control`); other custom components are not analyzed. No findings is not proof of accessibility. Missing parsers or execution failures mean unavailable, never a pass.
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
- For localized pages, also render once with `dir="rtl"` and once with a long-text locale.
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 the task's scope and rerun the affected checks. If commands, installation or browser execution are unavailable or prohibited, report those checks as not run and explain the limitation. Report actual checks and remaining issues in ordinary language; never claim a check passed without running it.
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
- avatar|profile-picture|gap|references/elements/avatar.md
89
- badge|chip,tag|gap|references/elements/badge.md
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|gap|references/elements/card.md
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|gap|references/elements/date-picker.md
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|no-results|gap|references/elements/empty-state.md
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|gap|references/elements/inline-alert.md
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|gap|references/elements/progress-bar.md
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
- A short, important message requires an immediate response, especially confirmation before a consequential action. Use a regular modal for a task or optional information, and inline validation for recoverable form errors.
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 so it remains understandable in the modal at narrow widths and zoom. Allow the text to wrap; do not rely on color or icon alone to explain the consequence.
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 modal [dialog role=alertdialog] opened by native invokers. Cancel and Action request close. Use the client entry only when application-controlled state is required.
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 the accessible name and description, opening and closing by keyboard, focus containment and return, both explicit choices, and the 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.
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: gap
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 person's identity helps distinguish nearby content, such as a participant list or comment author.
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 add a portrait when the name already provides all needed context and the image adds no information. Do not use an avatar as the only way to identify a person.
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
- This is an app-level composition, not a UIify component. Use an img with concise alt text when the portrait adds identity; use alt="" when visible adjacent text already names the person. Keep the name as text.
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
- Set intrinsic dimensions to reserve space, preserve a consistent crop, and avoid shrinking the image below its useful size.
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
- Provide a stable initials or generic fallback when no usable image exists. If the image fails, keep the person's visible name.
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
- Check image alternative against nearby text, loading/failure fallback, intrinsic dimensions, and list reading order.
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 makes assistive technology announce the same identity twice.
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-16)
47
- - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/non-text-content.html) (verified 2026-10-16)
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: gap
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 status or category qualifies nearby content and helps people scan it.
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 a badge for a control, long explanation, or decoration that repeats an adjacent heading without adding meaning.
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
- This is an app-level composition, not a UIify component. Use non-interactive text beside the item it qualifies. Include the status in words; color and shape are supplementary.
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
- Allow text to wrap or choose a concise label that remains readable at zoom. Keep the badge attached to its related heading or value in reading order.
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
- For status changes, update the text and announce meaningful dynamic changes in an appropriate status region. Do not use badge styling alone to indicate selection.
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
- Check text contrast, status conveyed without color, association with the item, zoom, and dynamic announcement only when needed.
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 green dot without a textual status does not explain what “active” means.
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-16)
46
- - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html) (verified 2026-10-16)
47
- - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/use-of-color.html) (verified 2026-10-16)
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: gap
3
+ Binding: card
4
4
 
5
5
  Group one feature heading and its explanation.
6
6
 
7
7
  ## Use when
8
8
 
9
- A small set of related content needs a clear grouping, with a heading and supporting detail.
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 card-within-card nesting and whole-surface click behavior when the card contains multiple independent controls.
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
- This is an app-level composition, not a UIify component. Group one topic under a heading, add a concise description, and use a link for one clear destination. If the card has one destination, make the heading link the primary control; keep other controls separate.
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 cards in reading order when the grid stacks. Let content determine height and align repeated actions without truncating essential labels.
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
- Use links for navigation and buttons for in-place actions. Add selected/pressed state only when the card itself represents a selectable item.
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
- Check heading hierarchy, reading order, single versus multiple actions, keyboard reachability, focus visibility, and one-column reflow.
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 an entire card clickable while also placing buttons or links inside it creates nested, ambiguous controls.
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-16)
51
- - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/visual-presentation.html) (verified 2026-10-16)
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: gap
3
+ Binding: date-picker
4
4
 
5
- Collect one calendar date using the browser’s native date control.
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. Avoid replacing the native picker with a custom calendar unless the task requires behavior that has been tested for keyboard and assistive technology.
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
- Use a visible label with a native input of type date. Add min and max only when the constraints are real, explain them before entry, and associate error feedback with the field.
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
- Allow the browser’s date UI to use the platform layout; keep the field within the available width and do not assume every browser displays the same picker.
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
- Distinguish an empty value, a valid date, and a date outside the allowed range. The submitted date value is a calendar date normalized as yyyy-mm-dd.
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 keyboard entry and picker operation in target browsers, date bounds, visible format guidance, validation text, and narrow-screen behavior.
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
- Treating a date-only value as a timestamp with a time zone.
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-17)
42
- - [www.w3.org](https://www.w3.org/WAI/tutorials/forms/labels/) (verified 2026-10-17)
43
- - [www.w3.org](https://www.w3.org/WAI/tutorials/forms/instructions/) (verified 2026-10-17)
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)