@gunkin/uiify 0.0.17-alpha → 0.0.20-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 (292) hide show
  1. package/agents/components.md +1 -1
  2. package/agents/index.md +1 -0
  3. package/agents/reference/components/breadcrumb.md +11 -1
  4. package/agents/reference/components/button.md +4 -4
  5. package/agents/reference/components/candle-chart.md +20 -1
  6. package/agents/reference/components/carousel.md +3 -2
  7. package/agents/reference/components/combobox.md +2 -1
  8. package/agents/reference/components/drawer.md +8 -1
  9. package/agents/reference/components/dropdown-menu.md +1 -1
  10. package/agents/reference/components/file-upload.md +12 -1
  11. package/agents/reference/components/line-chart.md +1 -0
  12. package/agents/reference/components/modal.md +8 -1
  13. package/agents/reference/components/number-field.md +14 -3
  14. package/agents/reference/components/pagination.md +22 -1
  15. package/agents/reference/components/slider.md +9 -1
  16. package/agents/reference/components/spinner.md +8 -1
  17. package/agents/reference/components/toast.md +14 -1
  18. package/dist/components/behavior.css +9 -9
  19. package/dist/components/behavior.css.map +1 -1
  20. package/dist/components/breadcrumb/Breadcrumb.d.ts.map +1 -1
  21. package/dist/components/breadcrumb/Breadcrumb.js +21 -4
  22. package/dist/components/breadcrumb/Breadcrumb.js.map +1 -1
  23. package/dist/components/breadcrumb/index.d.ts +1 -1
  24. package/dist/components/breadcrumb/index.d.ts.map +1 -1
  25. package/dist/components/breadcrumb/index.js.map +1 -1
  26. package/dist/components/breadcrumb/types.d.ts +7 -0
  27. package/dist/components/breadcrumb/types.d.ts.map +1 -1
  28. package/dist/components/button/types.d.ts +4 -0
  29. package/dist/components/button/types.d.ts.map +1 -1
  30. package/dist/components/candle-chart/CandleChart.d.ts +1 -1
  31. package/dist/components/candle-chart/CandleChart.d.ts.map +1 -1
  32. package/dist/components/candle-chart/CandleChart.js +81 -46
  33. package/dist/components/candle-chart/CandleChart.js.map +1 -1
  34. package/dist/components/candle-chart/client/CandleChartClient.d.ts.map +1 -1
  35. package/dist/components/candle-chart/client/CandleChartClient.js +5 -0
  36. package/dist/components/candle-chart/client/CandleChartClient.js.map +1 -1
  37. package/dist/components/candle-chart/index.d.ts +1 -1
  38. package/dist/components/candle-chart/index.d.ts.map +1 -1
  39. package/dist/components/candle-chart/index.js.map +1 -1
  40. package/dist/components/candle-chart/types.d.ts +17 -0
  41. package/dist/components/candle-chart/types.d.ts.map +1 -1
  42. package/dist/components/carousel/CarouselMarkup.d.ts.map +1 -1
  43. package/dist/components/carousel/CarouselMarkup.js +20 -3
  44. package/dist/components/carousel/CarouselMarkup.js.map +1 -1
  45. package/dist/components/carousel/carousel-markup.js +2 -2
  46. package/dist/components/carousel/carousel-markup.js.map +1 -1
  47. package/dist/components/carousel/types.d.ts +3 -2
  48. package/dist/components/carousel/types.d.ts.map +1 -1
  49. package/dist/components/combobox/Combobox.d.ts.map +1 -1
  50. package/dist/components/combobox/Combobox.js +37 -23
  51. package/dist/components/combobox/Combobox.js.map +1 -1
  52. package/dist/components/combobox/combobox-store.d.ts.map +1 -1
  53. package/dist/components/combobox/combobox-store.js +5 -2
  54. package/dist/components/combobox/combobox-store.js.map +1 -1
  55. package/dist/components/combobox/types.d.ts +2 -3
  56. package/dist/components/combobox/types.d.ts.map +1 -1
  57. package/dist/components/context-menu/ContextMenu.d.ts.map +1 -1
  58. package/dist/components/context-menu/ContextMenu.js +25 -5
  59. package/dist/components/context-menu/ContextMenu.js.map +1 -1
  60. package/dist/components/drawer/DrawerNative.d.ts +1 -1
  61. package/dist/components/drawer/DrawerNative.d.ts.map +1 -1
  62. package/dist/components/drawer/DrawerNative.js +5 -2
  63. package/dist/components/drawer/DrawerNative.js.map +1 -1
  64. package/dist/components/drawer/index.d.ts +1 -1
  65. package/dist/components/drawer/index.d.ts.map +1 -1
  66. package/dist/components/drawer/index.js.map +1 -1
  67. package/dist/components/drawer/types.d.ts +4 -0
  68. package/dist/components/drawer/types.d.ts.map +1 -1
  69. package/dist/components/dropdown-menu/DropdownMenu.d.ts.map +1 -1
  70. package/dist/components/dropdown-menu/DropdownMenu.js +31 -15
  71. package/dist/components/dropdown-menu/DropdownMenu.js.map +1 -1
  72. package/dist/components/dropdown-menu/DropdownMenuBar.d.ts.map +1 -1
  73. package/dist/components/dropdown-menu/DropdownMenuBar.js +7 -5
  74. package/dist/components/dropdown-menu/DropdownMenuBar.js.map +1 -1
  75. package/dist/components/dropdown-menu/types.d.ts +1 -1
  76. package/dist/components/dropdown-menu/types.d.ts.map +1 -1
  77. package/dist/components/file-upload/FileUpload.d.ts.map +1 -1
  78. package/dist/components/file-upload/FileUpload.js +11 -4
  79. package/dist/components/file-upload/FileUpload.js.map +1 -1
  80. package/dist/components/file-upload/FileUploadRoot.d.ts +1 -1
  81. package/dist/components/file-upload/FileUploadRoot.d.ts.map +1 -1
  82. package/dist/components/file-upload/FileUploadRoot.js +9 -0
  83. package/dist/components/file-upload/FileUploadRoot.js.map +1 -1
  84. package/dist/components/file-upload/index.d.ts +1 -1
  85. package/dist/components/file-upload/index.d.ts.map +1 -1
  86. package/dist/components/file-upload/index.js.map +1 -1
  87. package/dist/components/file-upload/types.d.ts +8 -0
  88. package/dist/components/file-upload/types.d.ts.map +1 -1
  89. package/dist/components/line-chart/LineChart.d.ts.map +1 -1
  90. package/dist/components/line-chart/LineChart.js +3 -2
  91. package/dist/components/line-chart/LineChart.js.map +1 -1
  92. package/dist/components/line-chart/line-chart-geometry.d.ts +2 -2
  93. package/dist/components/line-chart/line-chart-geometry.d.ts.map +1 -1
  94. package/dist/components/line-chart/line-chart-geometry.js +6 -6
  95. package/dist/components/line-chart/line-chart-geometry.js.map +1 -1
  96. package/dist/components/line-chart/types.d.ts +2 -0
  97. package/dist/components/line-chart/types.d.ts.map +1 -1
  98. package/dist/components/modal/Modal.d.ts +1 -1
  99. package/dist/components/modal/Modal.d.ts.map +1 -1
  100. package/dist/components/modal/Modal.js +5 -2
  101. package/dist/components/modal/Modal.js.map +1 -1
  102. package/dist/components/modal/index.d.ts +1 -1
  103. package/dist/components/modal/index.d.ts.map +1 -1
  104. package/dist/components/modal/index.js.map +1 -1
  105. package/dist/components/modal/types.d.ts +4 -0
  106. package/dist/components/modal/types.d.ts.map +1 -1
  107. package/dist/components/number-field/NumberField.d.ts +1 -1
  108. package/dist/components/number-field/NumberField.d.ts.map +1 -1
  109. package/dist/components/number-field/NumberField.js +25 -5
  110. package/dist/components/number-field/NumberField.js.map +1 -1
  111. package/dist/components/number-field/format.d.ts +1 -1
  112. package/dist/components/number-field/format.d.ts.map +1 -1
  113. package/dist/components/number-field/format.js +32 -7
  114. package/dist/components/number-field/format.js.map +1 -1
  115. package/dist/components/number-field/index.d.ts +1 -1
  116. package/dist/components/number-field/index.d.ts.map +1 -1
  117. package/dist/components/number-field/index.js.map +1 -1
  118. package/dist/components/number-field/types.d.ts +11 -2
  119. package/dist/components/number-field/types.d.ts.map +1 -1
  120. package/dist/components/otp-input/OtpInput.d.ts.map +1 -1
  121. package/dist/components/otp-input/OtpInput.js +2 -0
  122. package/dist/components/otp-input/OtpInput.js.map +1 -1
  123. package/dist/components/pagination/Pagination.d.ts.map +1 -1
  124. package/dist/components/pagination/Pagination.js +93 -29
  125. package/dist/components/pagination/Pagination.js.map +1 -1
  126. package/dist/components/pagination/PaginationShell.d.ts +2 -1
  127. package/dist/components/pagination/PaginationShell.d.ts.map +1 -1
  128. package/dist/components/pagination/PaginationShell.js +44 -9
  129. package/dist/components/pagination/PaginationShell.js.map +1 -1
  130. package/dist/components/pagination/index.d.ts +1 -1
  131. package/dist/components/pagination/index.d.ts.map +1 -1
  132. package/dist/components/pagination/index.js.map +1 -1
  133. package/dist/components/pagination/types.d.ts +18 -0
  134. package/dist/components/pagination/types.d.ts.map +1 -1
  135. package/dist/components/slider/client/SliderClient.d.ts.map +1 -1
  136. package/dist/components/slider/client/SliderClient.js +11 -2
  137. package/dist/components/slider/client/SliderClient.js.map +1 -1
  138. package/dist/components/slider/index.d.ts +1 -1
  139. package/dist/components/slider/index.d.ts.map +1 -1
  140. package/dist/components/slider/index.js.map +1 -1
  141. package/dist/components/slider/types.d.ts +5 -0
  142. package/dist/components/slider/types.d.ts.map +1 -1
  143. package/dist/components/spinner/Spinner.d.ts.map +1 -1
  144. package/dist/components/spinner/Spinner.js +6 -3
  145. package/dist/components/spinner/Spinner.js.map +1 -1
  146. package/dist/components/spinner/index.d.ts +1 -1
  147. package/dist/components/spinner/index.d.ts.map +1 -1
  148. package/dist/components/spinner/index.js.map +1 -1
  149. package/dist/components/spinner/types.d.ts +4 -0
  150. package/dist/components/spinner/types.d.ts.map +1 -1
  151. package/dist/components/tags-input/TagsInput.d.ts.map +1 -1
  152. package/dist/components/tags-input/TagsInput.js +2 -0
  153. package/dist/components/tags-input/TagsInput.js.map +1 -1
  154. package/dist/components/toast/Toast.d.ts +1 -1
  155. package/dist/components/toast/Toast.d.ts.map +1 -1
  156. package/dist/components/toast/Toast.js +33 -29
  157. package/dist/components/toast/Toast.js.map +1 -1
  158. package/dist/components/toast/ToastElements.d.ts.map +1 -1
  159. package/dist/components/toast/ToastElements.js +24 -12
  160. package/dist/components/toast/ToastElements.js.map +1 -1
  161. package/dist/components/toast/index.d.ts +1 -1
  162. package/dist/components/toast/index.d.ts.map +1 -1
  163. package/dist/components/toast/index.js.map +1 -1
  164. package/dist/components/toast/types.d.ts +10 -0
  165. package/dist/components/toast/types.d.ts.map +1 -1
  166. package/dist/components/toolbar/Toolbar.d.ts +2 -2
  167. package/dist/components/toolbar/Toolbar.d.ts.map +1 -1
  168. package/dist/components/toolbar/Toolbar.js +8 -4
  169. package/dist/components/toolbar/Toolbar.js.map +1 -1
  170. package/dist/core/direction.d.ts +2 -0
  171. package/dist/core/direction.d.ts.map +1 -1
  172. package/dist/core/direction.js +8 -3
  173. package/dist/core/direction.js.map +1 -1
  174. package/dist/core/dismissable-layer-registry.d.ts.map +1 -1
  175. package/dist/core/dismissable-layer-registry.js +3 -1
  176. package/dist/core/dismissable-layer-registry.js.map +1 -1
  177. package/dist/core/format-label.d.ts +2 -0
  178. package/dist/core/format-label.d.ts.map +1 -0
  179. package/dist/core/format-label.js +13 -0
  180. package/dist/core/format-label.js.map +1 -0
  181. package/dist/core/ime.d.ts +16 -0
  182. package/dist/core/ime.d.ts.map +1 -0
  183. package/dist/core/ime.js +7 -0
  184. package/dist/core/ime.js.map +1 -0
  185. package/dist/core/index.d.ts +3 -0
  186. package/dist/core/index.d.ts.map +1 -1
  187. package/dist/core/index.js +3 -0
  188. package/dist/core/index.js.map +1 -1
  189. package/dist/core/roving-focus-store.d.ts +3 -2
  190. package/dist/core/roving-focus-store.d.ts.map +1 -1
  191. package/dist/core/roving-focus-store.js +5 -3
  192. package/dist/core/roving-focus-store.js.map +1 -1
  193. package/dist/core/roving-focus.d.ts.map +1 -1
  194. package/dist/core/roving-focus.js +10 -5
  195. package/dist/core/roving-focus.js.map +1 -1
  196. package/dist/core/text-direction.d.ts +7 -0
  197. package/dist/core/text-direction.d.ts.map +1 -0
  198. package/dist/core/text-direction.js +7 -0
  199. package/dist/core/text-direction.js.map +1 -0
  200. package/dist/styles/index.css +1 -1
  201. package/package.json +2 -1
  202. package/skills/uiify/SKILL.md +58 -33
  203. package/skills/uiify/references/compositions/card-rhythm.md +0 -2
  204. package/skills/uiify/references/compositions/destructive-confirmation.md +1 -3
  205. package/skills/uiify/references/compositions/form-grouping.md +0 -2
  206. package/skills/uiify/references/compositions/hero-actions.md +3 -5
  207. package/skills/uiify/references/compositions/page-frame.md +0 -2
  208. package/skills/uiify/references/compositions/pricing-actions.md +0 -2
  209. package/skills/uiify/references/compositions/save-feedback.md +1 -3
  210. package/skills/uiify/references/compositions/table-controls.md +1 -3
  211. package/skills/uiify/references/elements/accordion.md +38 -0
  212. package/skills/uiify/references/elements/alert-modal.md +32 -5
  213. package/skills/uiify/references/elements/avatar.md +31 -2
  214. package/skills/uiify/references/elements/badge.md +32 -3
  215. package/skills/uiify/references/elements/bar-chart.md +39 -7
  216. package/skills/uiify/references/elements/breadcrumb.md +38 -0
  217. package/skills/uiify/references/elements/button.md +38 -3
  218. package/skills/uiify/references/elements/candle-chart.md +40 -0
  219. package/skills/uiify/references/elements/card.md +38 -1
  220. package/skills/uiify/references/elements/carousel.md +40 -0
  221. package/skills/uiify/references/elements/checkbox.md +39 -0
  222. package/skills/uiify/references/elements/code-block.md +31 -2
  223. package/skills/uiify/references/elements/collapsible.md +38 -0
  224. package/skills/uiify/references/elements/color-picker.md +39 -0
  225. package/skills/uiify/references/elements/combobox.md +37 -0
  226. package/skills/uiify/references/elements/command-palette.md +33 -12
  227. package/skills/uiify/references/elements/context-menu.md +38 -0
  228. package/skills/uiify/references/elements/cookie-banner.md +30 -2
  229. package/skills/uiify/references/elements/date-picker.md +33 -9
  230. package/skills/uiify/references/elements/divider.md +30 -2
  231. package/skills/uiify/references/elements/drawer.md +38 -0
  232. package/skills/uiify/references/elements/dropdown-menu.md +38 -0
  233. package/skills/uiify/references/elements/empty-state.md +30 -2
  234. package/skills/uiify/references/elements/feature-grid.md +41 -1
  235. package/skills/uiify/references/elements/field.md +33 -3
  236. package/skills/uiify/references/elements/file-upload.md +40 -0
  237. package/skills/uiify/references/elements/footer.md +35 -4
  238. package/skills/uiify/references/elements/form.md +31 -4
  239. package/skills/uiify/references/elements/header.md +31 -3
  240. package/skills/uiify/references/elements/hero.md +43 -3
  241. package/skills/uiify/references/elements/hover-card.md +38 -0
  242. package/skills/uiify/references/elements/image-gallery.md +36 -4
  243. package/skills/uiify/references/elements/inline-alert.md +30 -2
  244. package/skills/uiify/references/elements/input.md +31 -4
  245. package/skills/uiify/references/elements/line-chart.md +38 -0
  246. package/skills/uiify/references/elements/logo-wall.md +31 -2
  247. package/skills/uiify/references/elements/modal.md +38 -0
  248. package/skills/uiify/references/elements/number-field.md +41 -0
  249. package/skills/uiify/references/elements/otp-input.md +39 -0
  250. package/skills/uiify/references/elements/pagination.md +33 -4
  251. package/skills/uiify/references/elements/password-input.md +33 -9
  252. package/skills/uiify/references/elements/popup.md +38 -0
  253. package/skills/uiify/references/elements/pricing-table.md +55 -2
  254. package/skills/uiify/references/elements/progress-bar.md +32 -4
  255. package/skills/uiify/references/elements/radio-group.md +39 -0
  256. package/skills/uiify/references/elements/rating.md +39 -0
  257. package/skills/uiify/references/elements/search-input.md +35 -4
  258. package/skills/uiify/references/elements/segmented-control.md +39 -0
  259. package/skills/uiify/references/elements/select.md +29 -1
  260. package/skills/uiify/references/elements/sidebar.md +33 -10
  261. package/skills/uiify/references/elements/skeleton.md +38 -0
  262. package/skills/uiify/references/elements/slider.md +39 -0
  263. package/skills/uiify/references/elements/spinner.md +38 -0
  264. package/skills/uiify/references/elements/stats-bar.md +30 -2
  265. package/skills/uiify/references/elements/stepper.md +32 -9
  266. package/skills/uiify/references/elements/switch.md +31 -4
  267. package/skills/uiify/references/elements/table-of-contents.md +39 -0
  268. package/skills/uiify/references/elements/table.md +32 -3
  269. package/skills/uiify/references/elements/tabs.md +38 -0
  270. package/skills/uiify/references/elements/tags-input.md +39 -0
  271. package/skills/uiify/references/elements/testimonial.md +35 -4
  272. package/skills/uiify/references/elements/textarea.md +30 -3
  273. package/skills/uiify/references/elements/timeline.md +31 -3
  274. package/skills/uiify/references/elements/toast.md +27 -1
  275. package/skills/uiify/references/elements/toggle-group.md +39 -0
  276. package/skills/uiify/references/elements/toggle.md +39 -0
  277. package/skills/uiify/references/elements/toolbar.md +39 -0
  278. package/skills/uiify/references/elements/tooltip.md +38 -0
  279. package/skills/uiify/references/elements/virtual-scroll.md +39 -0
  280. package/skills/uiify/references/examples/alert-confirmation.md +34 -0
  281. package/skills/uiify/references/examples/field-validation.md +37 -0
  282. package/skills/uiify/references/examples/select-basic.md +35 -0
  283. package/skills/uiify/references/examples/table-controls.md +40 -0
  284. package/skills/uiify/references/guides/assets.md +14 -0
  285. package/skills/uiify/references/guides/content.md +11 -0
  286. package/skills/uiify/references/guides/hierarchy.md +14 -0
  287. package/skills/uiify/references/guides/i18n.md +21 -0
  288. package/skills/uiify/references/guides/reference.md +9 -0
  289. package/skills/uiify/references/guides/states.md +12 -0
  290. package/skills/uiify/references/guides/surface.md +27 -0
  291. package/skills/uiify/scripts/lint.mjs +1 -1
  292. package/skills/uiify/scripts/static.mjs +150 -14
@@ -4,7 +4,47 @@ Binding: gap
4
4
 
5
5
  Present related product capabilities as a coherent set.
6
6
 
7
- Use a repeated grid when the features share the same level and structure. Keep each feature’s heading and explanation in reading order at narrow widths.
7
+ ## Use when
8
+
9
+ Several related capabilities have equal importance and repeat the same content shape.
10
+
11
+ ## Avoid when
12
+
13
+ Do not force unequal priorities or long-form explanations into a uniform grid. Use a comparison table when people must compare values across features.
14
+
15
+ ## Structure
16
+
17
+ This is an app-level composition, not a UIify component. Render a labeled section containing a list of items; give each item a heading and short explanation. Use the same order and content hierarchy for every item.
18
+
19
+ ## Responsive
20
+
21
+ Collapse to one column on narrow screens and retain source order. Avoid fixed heights that clip translated or zoomed text.
22
+
23
+ ## States
24
+
25
+ Keep item actions consistent. If each feature links to detail, link its heading and retain a clear focus indicator.
26
+
27
+ ## Verify
28
+
29
+ Check section label, heading levels, source order, one-column reflow, link names, and the card spacing at mobile width.
30
+
31
+ ## Common mistake
32
+
33
+ Do not use three equal cards to imply equal priority when one feature is the primary action.
34
+
35
+ ## Custom implementation
36
+
37
+ ```html
38
+ <section aria-labelledby="features-title">
39
+ <h2 id="features-title">Built for daily work</h2>
40
+ <ul>
41
+ <li><article><h3>Shared workspace</h3><p>Keep team work together.</p></article></li>
42
+ <li><article><h3>Clear history</h3><p>See what changed and when.</p></article></li>
43
+ </ul>
44
+ </section>
45
+ ```
46
+
47
+ This is an app-level composition; UIify does not currently ship this component.
8
48
 
9
49
  Related laws: references/laws/proximity.md, references/laws/readability.md
10
50
 
@@ -4,11 +4,41 @@ Binding: field
4
4
 
5
5
  Keep a label and its form control together.
6
6
 
7
- Keep each label next to its control. Put a group label on related controls and show validation beside the field it describes.
7
+ ## Use when
8
+
9
+ Keep a form control, its label, instructions, and any validation message connected. Use visible labels that name the expected information; a placeholder is not a substitute.
10
+
11
+ ## Avoid when
12
+
13
+ Do not use a field wrapper without a real form control, or hide instructions needed before the person enters a value.
14
+
15
+ ## Structure
16
+
17
+ Use `Field.Root`, `Field.Label`, `Field.Control`, `Field.Description`, and `Field.Error` with the same `id` on Root and `fieldId` on every part. Put native props such as `name`, `type`, and `autoComplete` on `Field.Control`. Pass `invalid`, `required`, and `disabled` to the parts that need those states; Root does not inject props into them.
18
+
19
+ ## Responsive
20
+
21
+ Keep labels and help text close to the control at narrow widths. Let long instructions and error messages wrap without clipping.
22
+
23
+ ## States
24
+
25
+ Native required validation works without JavaScript. For application validation, set `invalid` on Root and Control and render `Field.Error` with the same state after validation. The control's accessible description includes the error while invalid.
26
+
27
+ ## Verify
28
+
29
+ Click the label and confirm its control receives focus. Inspect the accessibility tree for the control's name and associated description; submit an invalid value and confirm a textual error appears and is announced. Check required, disabled, read-only, and long-message states.
30
+
31
+ ## Common mistake
32
+
33
+ A label and control with different `fieldId` values disconnect the visible label from the input and its instructions.
34
+
35
+ Example: `references/examples/field-validation.md`.
8
36
 
9
37
  Related laws: references/laws/proximity.md, references/laws/accessibility.md
10
38
 
11
39
  ## Sources
12
40
 
13
- - [www.w3.org](https://www.w3.org/WAI/tutorials/forms/grouping/) (verified 2026-10-16)
14
- - [www.w3.org](https://www.w3.org/WAI/tutorials/forms/labels/) (verified 2026-10-16)
41
+ - [www.w3.org](https://www.w3.org/WAI/tutorials/forms/grouping/) (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/WCAG22/Understanding/error-identification.html) (verified 2026-10-17)
44
+ - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/error-suggestion.html) (verified 2026-10-17)
@@ -0,0 +1,40 @@
1
+ # file-upload
2
+
3
+ Binding: file-upload
4
+
5
+ Let people select and manage files for a form or task.
6
+
7
+ ## Use when
8
+
9
+ Let people attach one or more files to a form or task.
10
+
11
+ ## Avoid when
12
+
13
+ Do not require drag and drop as the only way to choose files. Avoid asking for files unrelated to the task.
14
+
15
+ ## Structure
16
+
17
+ Use FileUpload.Root with a labelled HiddenInput and an optional Trigger or Dropzone. Explain allowed formats, size limits, and maximum file count before selection; show selected filenames and provide a named remove action for each file.
18
+
19
+ ## Responsive
20
+
21
+ Keep the browse control and selected-file list usable at narrow widths. Do not rely on a large drop target that pushes the file picker off screen.
22
+
23
+ ## States
24
+
25
+ Report rejected files with the reason, including type, size, or count limits. Keep the accepted files and let people remove them. Treat accept as a picker hint; validate file type and size on the server.
26
+
27
+ ## Verify
28
+
29
+ Test keyboard file selection, the accessible input name, multiple-file selection, dropzone as an optional path, rejected-file feedback, removal, and server-side validation.
30
+
31
+ ## Common mistake
32
+
33
+ Treating the accept attribute as security validation or failing silently when a file is rejected.
34
+
35
+ ## Sources
36
+
37
+ - [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Elements/input/file) (verified 2026-10-17)
38
+ - [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/accept) (verified 2026-10-17)
39
+ - [www.w3.org](https://www.w3.org/WAI/tutorials/forms/labels/) (verified 2026-10-17)
40
+ - [www.w3.org](https://www.w3.org/WAI/tutorials/forms/instructions/) (verified 2026-10-17)
@@ -2,13 +2,44 @@
2
2
 
3
3
  Binding: gap
4
4
 
5
- Offer secondary navigation at the end of a page.
5
+ Offer secondary navigation and supporting information at the end of a page.
6
6
 
7
- Use a named footer landmark for site-wide information and group its links by destination. Preserve the site’s repeated navigation order.
7
+ ## Use when
8
+
9
+ Collect site-wide destinations, contact details, and supporting information after the main content.
10
+
11
+ ## Avoid when
12
+
13
+ Do not use the footer to repeat every page section or create a landmark for a small local card footer.
14
+
15
+ ## Structure
16
+
17
+ Use a page-level footer landmark and group related destinations into labelled navigation lists. Keep repeated link order consistent across pages.
18
+
19
+ ## Responsive
20
+
21
+ Allow link groups to wrap or stack while preserving their source order. Avoid clipped columns and tiny tap targets.
22
+
23
+ ## States
24
+
25
+ Keep destinations available at every viewport; do not hide essential links behind hover-only behavior.
26
+
27
+ ## Verify
28
+
29
+ Check the landmark structure, labels for multiple navigation regions, keyboard access, and reflow at narrow widths and zoom.
30
+
31
+ ## Common mistake
32
+
33
+ Using a page-level footer inside a card and unintentionally creating a landmark.
34
+
35
+ ## Custom implementation
36
+
37
+ Use a semantic footer with headings and navigation lists. This app-level pattern does not add a UIify component.
8
38
 
9
39
  Related laws: references/laws/readability.md, references/laws/accessibility.md
10
40
 
11
41
  ## Sources
12
42
 
13
- - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/consistent-navigation.html) (verified 2026-10-16)
14
- - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html) (verified 2026-10-16)
43
+ - [www.w3.org](https://www.w3.org/WAI/ARIA/apg/patterns/landmarks/) (verified 2026-10-17)
44
+ - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/consistent-navigation.html) (verified 2026-10-17)
45
+ - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/reflow.html) (verified 2026-10-17)
@@ -2,13 +2,40 @@
2
2
 
3
3
  Binding: form
4
4
 
5
- Collect related workspace preferences.
5
+ Collect the information needed to complete one task.
6
6
 
7
- Group related controls and explain the form’s purpose before its fields. Keep submit, validation, and success feedback connected to the form.
7
+ ## Use when
8
+
9
+ Collect the information needed to complete one task, such as signing in, registering, or purchasing. Ask only for information the task needs.
10
+
11
+ ## Avoid when
12
+
13
+ Do not make a form for a collection of unrelated actions or for navigation alone.
14
+
15
+ ## Structure
16
+
17
+ `Form` renders a native `<form>` and uses browser validation by default. Label every control; group related choices with `fieldset` and `legend`. Put one clearly named submit action after the fields. `validationBehavior="aria"` sets `noValidate`, so the page must provide its own accessible validation.
18
+
19
+ ## Responsive
20
+
21
+ A single column is a useful default on narrow screens. Keep each label, control, and its instructions together when the layout changes; UIify `Form` does not impose visual layout.
22
+
23
+ ## States
24
+
25
+ Support invalid submission, pending submission, success, and server error. Show detected errors in text, identify each affected field, and keep entered values after failure so the person can correct them.
26
+
27
+ ## Verify
28
+
29
+ Submit empty and malformed values. Confirm browser validation or the page's own validation is active, errors identify the affected controls in text, values remain available after failure, and success and server-error messages are clear.
30
+
31
+ ## Common mistake
32
+
33
+ Disabling submit before explaining validation can leave people stuck. Let the form explain what needs correction.
8
34
 
9
35
  Related laws: references/laws/proximity.md, references/laws/accessibility.md
10
36
 
11
37
  ## Sources
12
38
 
13
- - [www.w3.org](https://www.w3.org/WAI/tutorials/forms/grouping/) (verified 2026-10-16)
14
- - [www.w3.org](https://www.w3.org/WAI/tutorials/forms/labels/) (verified 2026-10-16)
39
+ - [www.w3.org](https://www.w3.org/WAI/tutorials/forms/grouping/) (verified 2026-10-17)
40
+ - [www.w3.org](https://www.w3.org/WAI/tutorials/forms/labels/) (verified 2026-10-17)
41
+ - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/error-identification.html) (verified 2026-10-17)
@@ -4,11 +4,39 @@ Binding: header
4
4
 
5
5
  Orient visitors with stable top-level navigation.
6
6
 
7
- Use the header for the site identity and primary navigation. Keep repeated navigation in a consistent order and give each navigation landmark a distinct name when there are several.
7
+ ## Use when
8
+
9
+ Orient people with site identity and primary navigation that stays in a consistent place and order across pages.
10
+
11
+ ## Avoid when
12
+
13
+ Do not turn the header into a second page body or hide all navigation behind a menu on wide screens.
14
+
15
+ ## Structure
16
+
17
+ `Header.Root` renders a semantic `<header>`. Place a home link for the site identity, a named `<nav>` with primary links, and at most one prominent action. Mark the current page link with `aria-current="page"`. Give repeated navigation landmarks distinct names when their link sets differ.
18
+
19
+ ## Responsive
20
+
21
+ Keep the logo and one useful action visible on narrow screens. Move secondary navigation behind a clearly named button that opens a `Modal`; leave the full navigation visible on wide screens.
22
+
23
+ ## States
24
+
25
+ Keep navigation order consistent between pages. The `Header` component itself is static; use `@gunkin/uiify/components/header/client` only when scroll hide/reveal is requested.
26
+
27
+ ## Verify
28
+
29
+ Inspect the accessibility tree for the banner and named navigation landmarks. Tab through the logo, links, and action in reading order; on narrow screens open and close the menu with the keyboard and check its focus and accessible name.
30
+
31
+ ## Common mistake
32
+
33
+ Hiding the entire navigation behind a hamburger on desktop makes common destinations harder to scan.
8
34
 
9
35
  Related laws: references/laws/readability.md, references/laws/accessibility.md
10
36
 
11
37
  ## Sources
12
38
 
13
- - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/consistent-navigation.html) (verified 2026-10-16)
14
- - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html) (verified 2026-10-16)
39
+ - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/consistent-navigation.html) (verified 2026-10-17)
40
+ - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html) (verified 2026-10-17)
41
+ - [www.w3.org](https://www.w3.org/WAI/ARIA/apg/practices/landmark-regions/) (verified 2026-10-17)
42
+ - [www.w3.org](https://www.w3.org/WAI/ARIA/apg/patterns/disclosure/examples/disclosure-navigation/) (verified 2026-10-17)
@@ -4,11 +4,51 @@ Binding: gap
4
4
 
5
5
  Introduce the product and its next action.
6
6
 
7
- Lead with the page’s primary purpose, a specific heading, and its main action. Add a secondary action only when it serves a different useful path.
7
+ ## Use when
8
+
9
+ Use a hero on a page whose goal is to help people decide what to do next, such as a landing, pricing, or campaign page. Do not add one to settings, dashboards, or docs; start with the task's content.
10
+
11
+ ## Avoid when
12
+
13
+ Do not lead with a generic slogan, a large decorative image, or multiple equally prominent actions.
14
+
15
+ ## Structure
16
+
17
+ Start with one specific `h1` that states the page's purpose, one supporting sentence, and one main action. Add a secondary action only for a different useful path. Use an image only when it shows the product or subject and supports the page's claim; prefer existing assets from the project, preserve the focal point across responsive crops, and provide suitable alternative text. If no suitable asset exists, keep the layout complete without inventing one.
18
+
19
+ ## Responsive
20
+
21
+ On narrow screens, order the text, action, then image. Let translated or long headings wrap, and keep the main action visible without horizontal scrolling.
22
+
23
+ ## States
24
+
25
+ Check a long or translated heading and the layout when no image is available. Keep action labels and focus states clear in both light and dark themes.
26
+
27
+ ## Verify
28
+
29
+ Confirm there is one `h1`, the main action is visible at 390×844 and 1440×900, and content reflows at 320 CSS px without two-dimensional scrolling. Check image alternative text against its purpose.
30
+
31
+ ## Common mistake
32
+
33
+ A generic slogan, decorative gradient, and two equal buttons do not explain the page or the next step.
34
+
35
+ ## Custom implementation
36
+
37
+ Use a named section, semantic heading, supporting copy, and the documented Button. The main action usually opens another page, so render it as a link. Add only static CSS for layout.
38
+
39
+ ```tsx
40
+ <section aria-labelledby="page-title">
41
+ <h1 id="page-title">Plan releases your whole team can follow</h1>
42
+ <p>Orbit turns scattered tasks into one shared release timeline.</p>
43
+ <Button as="a" href="/signup">Start a free trial</Button>
44
+ </section>
45
+ ```
8
46
 
9
47
  Related laws: references/laws/von-restorff.md, references/laws/accessibility.md
10
48
 
11
49
  ## Sources
12
50
 
13
- - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/use-of-color.html) (verified 2026-10-16)
14
- - [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/use-of-color.html) (verified 2026-10-17)
52
+ - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html) (verified 2026-10-17)
53
+ - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/reflow.html) (verified 2026-10-17)
54
+ - [www.w3.org](https://www.w3.org/WAI/tutorials/images/) (verified 2026-10-17)
@@ -0,0 +1,38 @@
1
+ # hover-card
2
+
3
+ Binding: hover-card
4
+
5
+ A link or control has useful supplementary detail that a person may inspect on hover or keyboard focus without leaving the current page
6
+
7
+ ## Use when
8
+
9
+ A link or control has useful supplementary detail that a person may inspect on hover or keyboard focus without leaving the current page. Keep it optional and short.
10
+
11
+ ## Avoid when
12
+
13
+ Do not place essential instructions, required actions, or the only copy of important information in a hover card. Do not use it for a brief label (tooltip) or a menu of actions.
14
+
15
+ ## Structure
16
+
17
+ Compose `HoverCard` Root, Trigger, and Content. Give the trigger a meaningful name on its own; the card supplements it rather than repairing an ambiguous link label.
18
+
19
+ ## Responsive
20
+
21
+ The card opens on mouse hover and keyboard focus. Touch users need the same essential information elsewhere in the page and a usable trigger. Keep content narrow enough to fit without obscuring nearby controls.
22
+
23
+ ## States
24
+
25
+ Focus or mouse hover opens the card; pointer movement into the content keeps it open, and leaving schedules close. Configure open/close delays only when they improve pointer travel without making content feel unresponsive.
26
+
27
+ ## Verify
28
+
29
+ Test keyboard focus, mouse travel from trigger to card, dismissibility, persistence while moving the pointer, narrow viewports, and that all essential content remains available without hover.
30
+
31
+ ## Common mistake
32
+
33
+ A hover card that closes while the pointer travels from its trigger to its content fails the hover/focus content requirements.
34
+
35
+ ## Sources
36
+
37
+ - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/content-on-hover-or-focus.html) (verified 2026-10-17)
38
+ - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/keyboard.html) (verified 2026-10-17)
@@ -4,17 +4,49 @@ Binding: gap
4
4
 
5
5
  Show related images with useful captions or alternatives.
6
6
 
7
- Represent a gallery as a list of figures. Give each image an alternative that conveys its content and use a caption when the surrounding text needs context.
7
+ ## Use when
8
+
9
+ A related set of images benefits from being browsed together with captions or contextual text.
10
+
11
+ ## Avoid when
12
+
13
+ Do not build a gallery if one image answers the need. Do not hide the only useful visual information behind a lightbox with no inline alternative.
14
+
15
+ ## Structure
16
+
17
+ This is an app-level composition, not a UIify component. Use a list of figures. Write alt text for the image's purpose; use figcaption for additional context, avoiding redundant repetition.
18
+
19
+ ## Responsive
20
+
21
+ Prefer existing project assets. Keep images within their container, preserve intrinsic ratio and important content in responsive crops, and allow the list to stack. Provide intrinsic width and height to reduce layout shift.
22
+
23
+ ## States
24
+
25
+ If images open a larger view, use a real link or button with an accessible name and a way back. Do not imply gallery navigation when items are static.
26
+
27
+ ## Verify
28
+
29
+ Check informative/decorative alternatives, captions, loading and intrinsic dimensions, keyboard access for interactive images, and narrow reflow.
30
+
31
+ ## Common mistake
32
+
33
+ Using the same sentence as both alt text and caption can produce repetitive announcements when both convey identical information.
34
+
35
+ ## Custom implementation
8
36
 
9
37
  ```html
10
38
  <ul>
11
- <li><figure><img src="/place.webp" width="640" height="400" alt="Stone bridge over a river" /><figcaption>Old town bridge</figcaption></figure></li>
39
+ <li><figure>
40
+ <img src="/bridge.webp" width="640" height="400" alt="Stone bridge over a river" />
41
+ <figcaption>Old town bridge at dusk</figcaption>
42
+ </figure></li>
12
43
  </ul>
13
44
  ```
14
45
 
15
- This is an app-level composition recipe; it does not add a component to UIify.
46
+ This is an app-level composition; UIify does not currently ship this component.
16
47
 
17
48
  ## Sources
18
49
 
19
50
  - [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/figure) (verified 2026-10-16)
20
- - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html) (verified 2026-10-16)
51
+ - [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img) (verified 2026-10-16)
52
+ - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/non-text-content.html) (verified 2026-10-16)
@@ -4,13 +4,41 @@ Binding: gap
4
4
 
5
5
  Give a short message context beside the content it affects.
6
6
 
7
- Use a status announcement for non-urgent updates and an alert only for information requiring immediate attention. Keep the message visible in context.
7
+ ## Use when
8
+
9
+ A message belongs beside the content or control it explains. Use status for a non-urgent update and alert only when the information requires immediate attention.
10
+
11
+ ## Avoid when
12
+
13
+ Do not use assertive announcements for routine success, or a toast for an error that must remain visible while the person fixes it.
14
+
15
+ ## Structure
16
+
17
+ This is an app-level composition, not a UIify component. Place concise text in a semantic status/alert element next to the affected content; include a heading when it helps identify the issue.
18
+
19
+ ## Responsive
20
+
21
+ Keep the message in reading order beside the affected field or section. Let text wrap and do not communicate severity by color alone.
22
+
23
+ ## States
24
+
25
+ Use role=status for dynamic, non-urgent updates; use role=alert for urgent messages that should be announced immediately. Keep the message visible until the related issue can be addressed.
26
+
27
+ ## Verify
28
+
29
+ Check announcement timing and role, reading order, message visibility, color contrast, and the relationship to its field/section. Avoid repeating the same announcement through multiple live regions.
30
+
31
+ ## Common mistake
32
+
33
+ Do not move focus to routine status text; the live region should announce the update while focus stays on the user's task.
34
+
35
+ ## Custom implementation
8
36
 
9
37
  ```html
10
38
  <p role="status">Changes saved.</p>
11
39
  ```
12
40
 
13
- This is an app-level composition recipe; it does not add a component to UIify.
41
+ This is an app-level composition; UIify does not currently ship this component.
14
42
 
15
43
  ## Sources
16
44
 
@@ -2,13 +2,40 @@
2
2
 
3
3
  Binding: input
4
4
 
5
- Accept a short text value.
5
+ Accept a short, single-line value.
6
6
 
7
- Give each text input a persistent visible label. Use helper and error text for format or validation details rather than relying on a placeholder.
7
+ ## Use when
8
+
9
+ Collect one short value such as a name, email address, or search query.
10
+
11
+ ## Avoid when
12
+
13
+ Use a textarea for longer free text and a purpose-specific control when it provides a more suitable native input mode.
14
+
15
+ ## Structure
16
+
17
+ Use the documented Input component with an associated visible label. Put format instructions before entry and connect them to the field; keep validation feedback beside the control.
18
+
19
+ ## Responsive
20
+
21
+ Let the field and label reflow within the available width. Keep the label visible and avoid horizontal page scrolling.
22
+
23
+ ## States
24
+
25
+ Preserve entered values when validation fails. Distinguish disabled, read-only, and invalid states, and explain the correction in text.
26
+
27
+ ## Verify
28
+
29
+ Check the label association, input purpose and autocomplete where relevant, keyboard access, error description, and narrow-screen reflow.
30
+
31
+ ## Common mistake
32
+
33
+ Using a placeholder as the only label or instruction.
8
34
 
9
35
  Related laws: references/laws/proximity.md, references/laws/accessibility.md
10
36
 
11
37
  ## Sources
12
38
 
13
- - [www.w3.org](https://www.w3.org/WAI/tutorials/forms/grouping/) (verified 2026-10-16)
14
- - [www.w3.org](https://www.w3.org/WAI/tutorials/forms/labels/) (verified 2026-10-16)
39
+ - [www.w3.org](https://www.w3.org/WAI/tutorials/forms/labels/) (verified 2026-10-17)
40
+ - [www.w3.org](https://www.w3.org/WAI/tutorials/forms/instructions/) (verified 2026-10-17)
41
+ - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/reflow.html) (verified 2026-10-17)
@@ -0,0 +1,38 @@
1
+ # line-chart
2
+
3
+ Binding: line-chart
4
+
5
+ A measured value changes over an ordered time or numeric axis and the trend is useful
6
+
7
+ ## Use when
8
+
9
+ A measured value changes over an ordered time or numeric axis and the trend is useful.
10
+
11
+ ## Avoid when
12
+
13
+ Do not connect unrelated categories with a line or imply precision/time continuity the data does not have. For a few independent categories, use a table or bar chart.
14
+
15
+ ## Structure
16
+
17
+ Use `LineChart` with ordered time/value data, a descriptive accessible label, and axis labels that include units/context. UIify renders a data table fallback. Import the component entry for static rendering; use /client only for interactive points or live history.
18
+
19
+ ## Responsive
20
+
21
+ Keep the data table available as the plot narrows. For live history, 'visibleCount' virtualizes older points and the table follows the visible window; provide another route to full history when users need it.
22
+
23
+ ## States
24
+
25
+ The static component needs no JavaScript. Interactive points use labeled buttons; the client entry adds live readout behavior. Disable announcements for high-frequency streaming updates when repeated speech would overwhelm.
26
+
27
+ ## Verify
28
+
29
+ Check exact values in the table, time/unit labels, trend description, keyboard point controls if enabled, data updates, and narrow viewport.
30
+
31
+ ## Common mistake
32
+
33
+ A default “Line chart” name does not explain which measure, unit, or period the chart shows.
34
+
35
+ ## Sources
36
+
37
+ - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/non-text-content.html) (verified 2026-10-17)
38
+ - [www.w3.org](https://www.w3.org/WAI/tutorials/images/complex/) (verified 2026-10-17)
@@ -4,7 +4,35 @@ Binding: gap
4
4
 
5
5
  Show organizations associated with a product or event.
6
6
 
7
- Give each meaningful organization logo an identifying alternative. If the adjacent text already names it, use an empty alternative to avoid repetition.
7
+ ## Use when
8
+
9
+ A small collection of customer, partner, or member organizations provides relevant context.
10
+
11
+ ## Avoid when
12
+
13
+ Do not present logos as proof of endorsement without permission, or include a large wall of brands that does not help the current decision.
14
+
15
+ ## Structure
16
+
17
+ This is an app-level composition, not a UIify component. Use a list. Give each informative logo an alt text with the organization's name; use empty alt only when adjacent text already names it.
18
+
19
+ ## Responsive
20
+
21
+ Preserve recognizable proportions and allow the list to wrap. Avoid raster logos that become blurry or require horizontal scrolling.
22
+
23
+ ## States
24
+
25
+ If a logo links somewhere, give the link a meaningful accessible name and a real destination. If not interactive, do not make it look like a control.
26
+
27
+ ## Verify
28
+
29
+ Check each image alternative, adjacent duplicate text, logo proportions, list reading order, link purpose, and mobile wrapping.
30
+
31
+ ## Common mistake
32
+
33
+ An empty alt on an informative logo hides the organization name from screen readers.
34
+
35
+ ## Custom implementation
8
36
 
9
37
  ```html
10
38
  <ul aria-label="Organizations using the product">
@@ -12,9 +40,10 @@ Give each meaningful organization logo an identifying alternative. If the adjace
12
40
  </ul>
13
41
  ```
14
42
 
15
- This is an app-level composition recipe; it does not add a component to UIify.
43
+ This is an app-level composition; UIify does not currently ship this component.
16
44
 
17
45
  ## Sources
18
46
 
19
47
  - [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/img) (verified 2026-10-16)
20
48
  - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html) (verified 2026-10-16)
49
+ - [www.w3.org](https://www.w3.org/WAI/WCAG22/Understanding/non-text-content.html) (verified 2026-10-16)
@@ -0,0 +1,38 @@
1
+ # modal
2
+
3
+ Binding: modal
4
+
5
+ Hold attention on a task that must be completed before returning to the page.
6
+
7
+ ## Use when
8
+
9
+ The person must finish or dismiss a focused task before returning to the page. Use inline content when they need to compare it with the page; use `toast` for brief feedback and `alert-modal` for an irreversible decision.
10
+
11
+ ## Avoid when
12
+
13
+ Do not open a modal automatically on page load or use one for content most visitors need to read.
14
+
15
+ ## Structure
16
+
17
+ `Modal` provides a trigger, named dialog, title, optional description and body, close control, and optional footer. Give it a specific title, concise body, and clearly labeled actions. A modal dialog contains its Tab sequence; include a visible way to close it.
18
+
19
+ ## Responsive
20
+
21
+ On narrow screens the default modal becomes a full-width bottom sheet. Its body scrolls while the header and footer remain visible. Keep the task short enough to understand and complete in this space.
22
+
23
+ ## States
24
+
25
+ The native `show-modal` dialog blocks interaction with the page. Its default dismissal allows Escape; `dismiss="none"` requires an explicit close action. Controlled or initially open state requires `ModalClientContent` from `@gunkin/uiify/components/modal/client`.
26
+
27
+ ## Verify
28
+
29
+ Open from the keyboard. Confirm focus enters the dialog, stays within its Tab sequence, Escape closes it when dismissal is enabled, focus returns to the trigger, and the dialog has its visible title as its accessible name. Check long content and footer actions at a narrow viewport.
30
+
31
+ ## Common mistake
32
+
33
+ A generic title such as “Notice” does not explain the task. Name the decision or activity instead.
34
+
35
+ ## Sources
36
+
37
+ - [www.w3.org](https://www.w3.org/WAI/ARIA/apg/patterns/dialog-modal/) (verified 2026-10-17)
38
+ - [developer.mozilla.org](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/dialog) (verified 2026-10-17)