@dashforge/tw 0.11.0-beta → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/CHANGELOG.md +13 -12
  2. package/COVERAGE.md +2 -2
  3. package/PARITY.md +7 -9
  4. package/PERFORMANCE.md +3 -4
  5. package/THEME-AUDIT.md +3 -4
  6. package/dist/components/Accordion/Accordion.d.ts +21 -0
  7. package/dist/components/Accordion/Accordion.d.ts.map +1 -0
  8. package/dist/components/Accordion/accordion.types.d.ts +74 -0
  9. package/dist/components/Accordion/accordion.types.d.ts.map +1 -0
  10. package/dist/components/Accordion/accordion.variants.d.ts +58 -0
  11. package/dist/components/Accordion/accordion.variants.d.ts.map +1 -0
  12. package/dist/components/AppShell/AppShell.d.ts +46 -0
  13. package/dist/components/AppShell/AppShell.d.ts.map +1 -0
  14. package/dist/components/AppShell/appShell.types.d.ts +62 -0
  15. package/dist/components/AppShell/appShell.types.d.ts.map +1 -0
  16. package/dist/components/AppShell/appShell.variants.d.ts +65 -0
  17. package/dist/components/AppShell/appShell.variants.d.ts.map +1 -0
  18. package/dist/components/AspectRatio/AspectRatio.d.ts +36 -0
  19. package/dist/components/AspectRatio/AspectRatio.d.ts.map +1 -0
  20. package/dist/components/AspectRatio/aspectRatio.types.d.ts +50 -0
  21. package/dist/components/AspectRatio/aspectRatio.types.d.ts.map +1 -0
  22. package/dist/components/Autocomplete/Autocomplete.d.ts +32 -0
  23. package/dist/components/Autocomplete/Autocomplete.d.ts.map +1 -0
  24. package/dist/components/Autocomplete/autocomplete.types.d.ts +214 -0
  25. package/dist/components/Autocomplete/autocomplete.types.d.ts.map +1 -0
  26. package/dist/components/Autocomplete/autocomplete.variants.d.ts +214 -0
  27. package/dist/components/Autocomplete/autocomplete.variants.d.ts.map +1 -0
  28. package/dist/components/Box/Box.d.ts +36 -0
  29. package/dist/components/Box/Box.d.ts.map +1 -0
  30. package/dist/components/Box/box.types.d.ts +54 -0
  31. package/dist/components/Box/box.types.d.ts.map +1 -0
  32. package/dist/components/Box/box.variants.d.ts +402 -0
  33. package/dist/components/Box/box.variants.d.ts.map +1 -0
  34. package/dist/components/Breadcrumbs/Breadcrumbs.d.ts +23 -0
  35. package/dist/components/Breadcrumbs/Breadcrumbs.d.ts.map +1 -0
  36. package/dist/components/Breadcrumbs/breadcrumbs.types.d.ts +98 -0
  37. package/dist/components/Breadcrumbs/breadcrumbs.types.d.ts.map +1 -0
  38. package/dist/components/Breadcrumbs/breadcrumbs.variants.d.ts +85 -0
  39. package/dist/components/Breadcrumbs/breadcrumbs.variants.d.ts.map +1 -0
  40. package/dist/components/Button/Button.d.ts +44 -0
  41. package/dist/components/Button/Button.d.ts.map +1 -0
  42. package/dist/components/Button/button.types.d.ts +66 -0
  43. package/dist/components/Button/button.types.d.ts.map +1 -0
  44. package/dist/components/Button/button.variants.d.ts +104 -0
  45. package/dist/components/Button/button.variants.d.ts.map +1 -0
  46. package/dist/components/Calendar/Calendar.d.ts +14 -0
  47. package/dist/components/Calendar/Calendar.d.ts.map +1 -0
  48. package/dist/components/Calendar/calendar.types.d.ts +72 -0
  49. package/dist/components/Calendar/calendar.types.d.ts.map +1 -0
  50. package/dist/components/Calendar/calendar.variants.d.ts +99 -0
  51. package/dist/components/Calendar/calendar.variants.d.ts.map +1 -0
  52. package/dist/components/Checkbox/Checkbox.d.ts +31 -0
  53. package/dist/components/Checkbox/Checkbox.d.ts.map +1 -0
  54. package/dist/components/Checkbox/checkbox.types.d.ts +86 -0
  55. package/dist/components/Checkbox/checkbox.types.d.ts.map +1 -0
  56. package/dist/components/Checkbox/checkbox.variants.d.ts +109 -0
  57. package/dist/components/Checkbox/checkbox.variants.d.ts.map +1 -0
  58. package/dist/components/ConfirmDialog/ConfirmDialog.d.ts +38 -0
  59. package/dist/components/ConfirmDialog/ConfirmDialog.d.ts.map +1 -0
  60. package/dist/components/ConfirmDialog/confirmDialog.types.d.ts +80 -0
  61. package/dist/components/ConfirmDialog/confirmDialog.types.d.ts.map +1 -0
  62. package/dist/components/ConfirmDialog/confirmDialog.variants.d.ts +90 -0
  63. package/dist/components/ConfirmDialog/confirmDialog.variants.d.ts.map +1 -0
  64. package/dist/components/Container/Container.d.ts +35 -0
  65. package/dist/components/Container/Container.d.ts.map +1 -0
  66. package/dist/components/Container/container.types.d.ts +41 -0
  67. package/dist/components/Container/container.types.d.ts.map +1 -0
  68. package/dist/components/Container/container.variants.d.ts +93 -0
  69. package/dist/components/Container/container.variants.d.ts.map +1 -0
  70. package/dist/components/DataGrid/DataGrid.d.ts +29 -0
  71. package/dist/components/DataGrid/DataGrid.d.ts.map +1 -0
  72. package/dist/components/DataGrid/dataGrid.types.d.ts +214 -0
  73. package/dist/components/DataGrid/dataGrid.types.d.ts.map +1 -0
  74. package/dist/components/DataGrid/dataGrid.variants.d.ts +222 -0
  75. package/dist/components/DataGrid/dataGrid.variants.d.ts.map +1 -0
  76. package/dist/components/DataGrid/filters/ColumnFilters.d.ts +23 -0
  77. package/dist/components/DataGrid/filters/ColumnFilters.d.ts.map +1 -0
  78. package/dist/components/DataGrid/reorder/useColumnReorder.d.ts +50 -0
  79. package/dist/components/DataGrid/reorder/useColumnReorder.d.ts.map +1 -0
  80. package/dist/components/DataGrid/resize/useColumnResize.d.ts +39 -0
  81. package/dist/components/DataGrid/resize/useColumnResize.d.ts.map +1 -0
  82. package/dist/components/DataGrid/visibility/ColumnVisibilityMenu.d.ts +44 -0
  83. package/dist/components/DataGrid/visibility/ColumnVisibilityMenu.d.ts.map +1 -0
  84. package/dist/components/DatePicker/DatePicker.d.ts +14 -0
  85. package/dist/components/DatePicker/DatePicker.d.ts.map +1 -0
  86. package/dist/components/DatePicker/datePicker.types.d.ts +88 -0
  87. package/dist/components/DatePicker/datePicker.types.d.ts.map +1 -0
  88. package/dist/components/DatePicker/datePicker.variants.d.ts +97 -0
  89. package/dist/components/DatePicker/datePicker.variants.d.ts.map +1 -0
  90. package/dist/components/DateRangePicker/DateRangePicker.d.ts +13 -0
  91. package/dist/components/DateRangePicker/DateRangePicker.d.ts.map +1 -0
  92. package/dist/components/DateRangePicker/dateRangePicker.types.d.ts +85 -0
  93. package/dist/components/DateRangePicker/dateRangePicker.types.d.ts.map +1 -0
  94. package/dist/components/DateRangePicker/dateRangePicker.variants.d.ts +183 -0
  95. package/dist/components/DateRangePicker/dateRangePicker.variants.d.ts.map +1 -0
  96. package/dist/components/DateTimePicker/DateTimePicker.d.ts +13 -0
  97. package/dist/components/DateTimePicker/DateTimePicker.d.ts.map +1 -0
  98. package/dist/components/DateTimePicker/dateTimePicker.types.d.ts +90 -0
  99. package/dist/components/DateTimePicker/dateTimePicker.types.d.ts.map +1 -0
  100. package/dist/components/DateTimePicker/dateTimePicker.variants.d.ts +107 -0
  101. package/dist/components/DateTimePicker/dateTimePicker.variants.d.ts.map +1 -0
  102. package/dist/components/Dialog/Dialog.d.ts +17 -0
  103. package/dist/components/Dialog/Dialog.d.ts.map +1 -0
  104. package/dist/components/Dialog/dialog.types.d.ts +75 -0
  105. package/dist/components/Dialog/dialog.types.d.ts.map +1 -0
  106. package/dist/components/Dialog/dialog.variants.d.ts +80 -0
  107. package/dist/components/Dialog/dialog.variants.d.ts.map +1 -0
  108. package/dist/components/Divider/Divider.d.ts +50 -0
  109. package/dist/components/Divider/Divider.d.ts.map +1 -0
  110. package/dist/components/Divider/divider.types.d.ts +47 -0
  111. package/dist/components/Divider/divider.types.d.ts.map +1 -0
  112. package/dist/components/Divider/divider.variants.d.ts +129 -0
  113. package/dist/components/Divider/divider.variants.d.ts.map +1 -0
  114. package/dist/components/Grid/Grid.d.ts +32 -0
  115. package/dist/components/Grid/Grid.d.ts.map +1 -0
  116. package/dist/components/Grid/grid.types.d.ts +103 -0
  117. package/dist/components/Grid/grid.types.d.ts.map +1 -0
  118. package/dist/components/Grid/grid.variants.d.ts +453 -0
  119. package/dist/components/Grid/grid.variants.d.ts.map +1 -0
  120. package/dist/components/LeftNav/LeftNav.d.ts +34 -0
  121. package/dist/components/LeftNav/LeftNav.d.ts.map +1 -0
  122. package/dist/components/LeftNav/leftNav.types.d.ts +136 -0
  123. package/dist/components/LeftNav/leftNav.types.d.ts.map +1 -0
  124. package/dist/components/LeftNav/leftNav.variants.d.ts +143 -0
  125. package/dist/components/LeftNav/leftNav.variants.d.ts.map +1 -0
  126. package/dist/components/NumberField/NumberField.d.ts +18 -0
  127. package/dist/components/NumberField/NumberField.d.ts.map +1 -0
  128. package/dist/components/NumberField/numberField.types.d.ts +79 -0
  129. package/dist/components/NumberField/numberField.types.d.ts.map +1 -0
  130. package/dist/components/NumberField/numberField.variants.d.ts +169 -0
  131. package/dist/components/NumberField/numberField.variants.d.ts.map +1 -0
  132. package/dist/components/OTPField/OTPField.d.ts +25 -0
  133. package/dist/components/OTPField/OTPField.d.ts.map +1 -0
  134. package/dist/components/OTPField/otpField.types.d.ts +74 -0
  135. package/dist/components/OTPField/otpField.types.d.ts.map +1 -0
  136. package/dist/components/OTPField/otpField.variants.d.ts +105 -0
  137. package/dist/components/OTPField/otpField.variants.d.ts.map +1 -0
  138. package/dist/components/Pagination/Pagination.d.ts +32 -0
  139. package/dist/components/Pagination/Pagination.d.ts.map +1 -0
  140. package/dist/components/Pagination/pagination.helpers.d.ts +23 -0
  141. package/dist/components/Pagination/pagination.helpers.d.ts.map +1 -0
  142. package/dist/components/Pagination/pagination.types.d.ts +120 -0
  143. package/dist/components/Pagination/pagination.types.d.ts.map +1 -0
  144. package/dist/components/Pagination/pagination.variants.d.ts +150 -0
  145. package/dist/components/Pagination/pagination.variants.d.ts.map +1 -0
  146. package/dist/components/Popover/Popover.d.ts +15 -0
  147. package/dist/components/Popover/Popover.d.ts.map +1 -0
  148. package/dist/components/Popover/popover.types.d.ts +45 -0
  149. package/dist/components/Popover/popover.types.d.ts.map +1 -0
  150. package/dist/components/Popover/popover.variants.d.ts +34 -0
  151. package/dist/components/Popover/popover.variants.d.ts.map +1 -0
  152. package/dist/components/RadioGroup/RadioGroup.d.ts +35 -0
  153. package/dist/components/RadioGroup/RadioGroup.d.ts.map +1 -0
  154. package/dist/components/RadioGroup/radioGroup.types.d.ts +103 -0
  155. package/dist/components/RadioGroup/radioGroup.types.d.ts.map +1 -0
  156. package/dist/components/RadioGroup/radioGroup.variants.d.ts +166 -0
  157. package/dist/components/RadioGroup/radioGroup.variants.d.ts.map +1 -0
  158. package/dist/components/Skeleton/Skeleton.d.ts +23 -0
  159. package/dist/components/Skeleton/Skeleton.d.ts.map +1 -0
  160. package/dist/components/Skeleton/skeleton.types.d.ts +56 -0
  161. package/dist/components/Skeleton/skeleton.types.d.ts.map +1 -0
  162. package/dist/components/Skeleton/skeleton.variants.d.ts +110 -0
  163. package/dist/components/Skeleton/skeleton.variants.d.ts.map +1 -0
  164. package/dist/components/Snackbar/Snackbar.d.ts +37 -0
  165. package/dist/components/Snackbar/Snackbar.d.ts.map +1 -0
  166. package/dist/components/Snackbar/snackbar.types.d.ts +86 -0
  167. package/dist/components/Snackbar/snackbar.types.d.ts.map +1 -0
  168. package/dist/components/Snackbar/snackbar.variants.d.ts +153 -0
  169. package/dist/components/Snackbar/snackbar.variants.d.ts.map +1 -0
  170. package/dist/components/Stack/Stack.d.ts +24 -0
  171. package/dist/components/Stack/Stack.d.ts.map +1 -0
  172. package/dist/components/Stack/stack.types.d.ts +61 -0
  173. package/dist/components/Stack/stack.types.d.ts.map +1 -0
  174. package/dist/components/Stack/stack.variants.d.ts +163 -0
  175. package/dist/components/Stack/stack.variants.d.ts.map +1 -0
  176. package/dist/components/Switch/Switch.d.ts +15 -0
  177. package/dist/components/Switch/Switch.d.ts.map +1 -0
  178. package/dist/components/Switch/switch.types.d.ts +47 -0
  179. package/dist/components/Switch/switch.types.d.ts.map +1 -0
  180. package/dist/components/Switch/switch.variants.d.ts +105 -0
  181. package/dist/components/Switch/switch.variants.d.ts.map +1 -0
  182. package/dist/components/Table/Table.d.ts +24 -0
  183. package/dist/components/Table/Table.d.ts.map +1 -0
  184. package/dist/components/Table/cells/RenderButton.d.ts +13 -0
  185. package/dist/components/Table/cells/RenderButton.d.ts.map +1 -0
  186. package/dist/components/Table/cells/RenderChip.d.ts +80 -0
  187. package/dist/components/Table/cells/RenderChip.d.ts.map +1 -0
  188. package/dist/components/Table/cells/RenderText.d.ts +21 -0
  189. package/dist/components/Table/cells/RenderText.d.ts.map +1 -0
  190. package/dist/components/Table/cells/RenderTwoLine.d.ts +20 -0
  191. package/dist/components/Table/cells/RenderTwoLine.d.ts.map +1 -0
  192. package/dist/components/Table/cells/RowActionsMenu.d.ts +36 -0
  193. package/dist/components/Table/cells/RowActionsMenu.d.ts.map +1 -0
  194. package/dist/components/Table/cells/index.d.ts +11 -0
  195. package/dist/components/Table/cells/index.d.ts.map +1 -0
  196. package/dist/components/Table/table.types.d.ts +399 -0
  197. package/dist/components/Table/table.types.d.ts.map +1 -0
  198. package/dist/components/Table/table.variants.d.ts +285 -0
  199. package/dist/components/Table/table.variants.d.ts.map +1 -0
  200. package/dist/components/Tabs/Tabs.d.ts +19 -0
  201. package/dist/components/Tabs/Tabs.d.ts.map +1 -0
  202. package/dist/components/Tabs/tabs.types.d.ts +61 -0
  203. package/dist/components/Tabs/tabs.types.d.ts.map +1 -0
  204. package/dist/components/Tabs/tabs.variants.d.ts +82 -0
  205. package/dist/components/Tabs/tabs.variants.d.ts.map +1 -0
  206. package/dist/components/Tabs/useTabs.d.ts +55 -0
  207. package/dist/components/Tabs/useTabs.d.ts.map +1 -0
  208. package/dist/components/TextField/TextField.d.ts +25 -0
  209. package/dist/components/TextField/TextField.d.ts.map +1 -0
  210. package/dist/components/TextField/textField.types.d.ts +98 -0
  211. package/dist/components/TextField/textField.types.d.ts.map +1 -0
  212. package/dist/components/TextField/textField.variants.d.ts +166 -0
  213. package/dist/components/TextField/textField.variants.d.ts.map +1 -0
  214. package/dist/components/Textarea/Textarea.d.ts +16 -0
  215. package/dist/components/Textarea/Textarea.d.ts.map +1 -0
  216. package/dist/components/Textarea/textarea.types.d.ts +63 -0
  217. package/dist/components/Textarea/textarea.types.d.ts.map +1 -0
  218. package/dist/components/Textarea/textarea.variants.d.ts +197 -0
  219. package/dist/components/Textarea/textarea.variants.d.ts.map +1 -0
  220. package/dist/components/TimePicker/TimePicker.d.ts +12 -0
  221. package/dist/components/TimePicker/TimePicker.d.ts.map +1 -0
  222. package/dist/components/TimePicker/timePicker.types.d.ts +80 -0
  223. package/dist/components/TimePicker/timePicker.types.d.ts.map +1 -0
  224. package/dist/components/TimePicker/timePicker.variants.d.ts +103 -0
  225. package/dist/components/TimePicker/timePicker.variants.d.ts.map +1 -0
  226. package/dist/components/Tooltip/Tooltip.d.ts +29 -0
  227. package/dist/components/Tooltip/Tooltip.d.ts.map +1 -0
  228. package/dist/components/Tooltip/tooltip.types.d.ts +47 -0
  229. package/dist/components/Tooltip/tooltip.types.d.ts.map +1 -0
  230. package/dist/components/Tooltip/tooltip.variants.d.ts +34 -0
  231. package/dist/components/Tooltip/tooltip.variants.d.ts.map +1 -0
  232. package/dist/components/TopBar/TopBar.d.ts +33 -0
  233. package/dist/components/TopBar/TopBar.d.ts.map +1 -0
  234. package/dist/components/TopBar/topBar.types.d.ts +49 -0
  235. package/dist/components/TopBar/topBar.types.d.ts.map +1 -0
  236. package/dist/components/TopBar/topBar.variants.d.ts +79 -0
  237. package/dist/components/TopBar/topBar.variants.d.ts.map +1 -0
  238. package/dist/components/Typography/Typography.d.ts +42 -0
  239. package/dist/components/Typography/Typography.d.ts.map +1 -0
  240. package/dist/components/Typography/typography.types.d.ts +61 -0
  241. package/dist/components/Typography/typography.types.d.ts.map +1 -0
  242. package/dist/components/Typography/typography.variants.d.ts +167 -0
  243. package/dist/components/Typography/typography.variants.d.ts.map +1 -0
  244. package/dist/components/VisuallyHidden/VisuallyHidden.d.ts +42 -0
  245. package/dist/components/VisuallyHidden/VisuallyHidden.d.ts.map +1 -0
  246. package/dist/components/VisuallyHidden/visuallyHidden.types.d.ts +42 -0
  247. package/dist/components/VisuallyHidden/visuallyHidden.types.d.ts.map +1 -0
  248. package/dist/components/_shared/data/getNestedValue.d.ts +20 -0
  249. package/dist/components/_shared/data/getNestedValue.d.ts.map +1 -0
  250. package/dist/components/_shared/data/useColumnAutoDetect.d.ts +45 -0
  251. package/dist/components/_shared/data/useColumnAutoDetect.d.ts.map +1 -0
  252. package/dist/components/_shared/data/useControllableState.d.ts +23 -0
  253. package/dist/components/_shared/data/useControllableState.d.ts.map +1 -0
  254. package/dist/components/_shared/data/useDebouncedValue.d.ts +10 -0
  255. package/dist/components/_shared/data/useDebouncedValue.d.ts.map +1 -0
  256. package/dist/components/_shared/data/useTableFilter.d.ts +36 -0
  257. package/dist/components/_shared/data/useTableFilter.d.ts.map +1 -0
  258. package/dist/components/_shared/data/useTableSearch.d.ts +23 -0
  259. package/dist/components/_shared/data/useTableSearch.d.ts.map +1 -0
  260. package/dist/components/_shared/data/useTableSelection.d.ts +25 -0
  261. package/dist/components/_shared/data/useTableSelection.d.ts.map +1 -0
  262. package/dist/components/_shared/data/useTableSort.d.ts +20 -0
  263. package/dist/components/_shared/data/useTableSort.d.ts.map +1 -0
  264. package/dist/components/_shared/data/useVirtualizer.d.ts +107 -0
  265. package/dist/components/_shared/data/useVirtualizer.d.ts.map +1 -0
  266. package/dist/components/_shared/resolveValidationState.d.ts +42 -0
  267. package/dist/components/_shared/resolveValidationState.d.ts.map +1 -0
  268. package/dist/hooks/useAccessState.d.ts +37 -0
  269. package/dist/hooks/useAccessState.d.ts.map +1 -0
  270. package/dist/index.d.ts +146 -1
  271. package/dist/index.d.ts.map +1 -0
  272. package/dist/index.esm.js +1 -1
  273. package/dist/src/index.d.ts +1 -1
  274. package/dist/tsconfig.lib.tsbuildinfo +1 -0
  275. package/dist/utils/cn.d.ts +26 -0
  276. package/dist/utils/cn.d.ts.map +1 -0
  277. package/package.json +7 -7
  278. package/src/components/TextField/TextField.test.tsx +5 -1
  279. package/vite.config.ts +8 -0
  280. package/vitest.config.mts +8 -1
package/CHANGELOG.md CHANGED
@@ -12,6 +12,17 @@ This project follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
12
12
  > duplicated intentionally — no shared "lowest common denominator" headless
13
13
  > layer.
14
14
 
15
+ ## [1.0.0] — 2026-05-23
16
+
17
+ **Stable release.** First semver-stable version. The public API is now
18
+ governed by strict semver — any future breaking change requires a major
19
+ bump. Functionally identical to the previous beta tarball.
20
+
21
+ - Version: `1.0.0`
22
+ - Cross-package `@dashforge/*` peer-dependency ranges updated to `^1.0.0`.
23
+ - See the [top-level CHANGELOG](https://github.com/kensaadi/dashforge/blob/main/CHANGELOG.md#100---2026-05-23) for the coordinated release context.
24
+ - See [`MIGRATION.md`](https://github.com/kensaadi/dashforge/blob/main/MIGRATION.md) for the upgrade guide from any `0.x-beta` to `1.0.0` (no code changes required).
25
+
15
26
  ## [0.11.0-beta] — 2026-05-22
16
27
 
17
28
  **Sprint 7 — Tabs.** `<Tabs>` rebuilt as a custom, clean-room component.
@@ -137,8 +148,8 @@ Strictly additive — no breaking changes on existing component APIs.
137
148
  starts a column-reorder drag. On coarse-pointer (touch) devices the
138
149
  reorder `draggable` affordance is disabled — native HTML5
139
150
  drag-and-drop does not fire touch events, so it was a dead
140
- interaction. (A pointer-event reorder covering touch is tracked in
141
- `REFINEMENT-NOTES.md`.)
151
+ interaction. A pointer-event reorder covering touch is tracked
152
+ internally.
142
153
  - **`Table`** now emits a dev-only `console.warn` when `getRowId` is
143
154
  omitted while sort / search / selection / expandable rows are
144
155
  active — the positional-index fallback breaks row identity on
@@ -1349,16 +1360,6 @@ have shipped as `0.2.2-beta` in isolation.
1349
1360
  Breadcrumbs in its center slot, so fixing the Breadcrumbs link
1350
1361
  fixes TopBar transitively.
1351
1362
 
1352
- ### Internal
1353
-
1354
- - **`libs/dashforge/tw/CONSUMER-VALIDATION.md`** — Sprint 2 P1
1355
- deliverable. Per-component status table for the dash-consumer
1356
- end-to-end validation pass (24 components, 7-point check each).
1357
- Records the pattern lesson that motivated the Autocomplete
1358
- async fix: the bug was invisible to both unit tests (using
1359
- static `options`) and the docs lab (static demo) — only a real
1360
- consumer with `loadOptions` configured exposed it.
1361
-
1362
1363
  ### Compatibility
1363
1364
 
1364
1365
  | Compatibility axis | Pre-`0.3.0` | Post-`0.3.0` |
package/COVERAGE.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # COVERAGE — `@dashforge/tw`
2
2
 
3
- > Sprint 6 P4 deliverable (2026-05-20). Test-coverage audit + the
4
- > gap-fill done this sprint, plus the tracked debt.
3
+ > Test-coverage audit for `@dashforge/tw`. Current numbers, the gap-fill
4
+ > performed, and the tracked debt.
5
5
 
6
6
  ## Current coverage (`vitest --coverage`, v8 provider)
7
7
 
package/PARITY.md CHANGED
@@ -1,19 +1,17 @@
1
1
  # `@dashforge/tw` ↔ `@dashforge/ui` parity audit
2
2
 
3
- > Sprint 3 P1 deliverable (2026-05-19). Per-component diff between the
4
- > two Dashforge UI lines for the **10 bridge-integrated components**.
3
+ > Per-component diff between the two Dashforge UI lines for the
4
+ > **10 bridge-integrated components**.
5
5
  >
6
- > **Motivation (revised post-Sprint 2).** This audit does NOT exist to
7
- > support customer migration MUI→TW (no consumer switches across UI
8
- > ecosystems in real life). It exists because:
6
+ > **Motivation.** This audit ensures:
9
7
  >
10
8
  > 1. **Internal consistency** — a refactor on `@dashforge/ui` that
11
9
  > doesn't land on `@dashforge/tw` would otherwise be invisible.
12
- > 2. **Bridge contract validation** — proves that the same
13
- > `@dashforge/forms` schema works identically on both lines.
14
- > 3. **Foundation for Sprint 5 starter kits** — two parallel kits
10
+ > 2. **Bridge contract validation** — the same `@dashforge/forms`
11
+ > schema works identically on both lines.
12
+ > 3. **Parallel starter-kit maintainability** — two parallel kits
15
13
  > (one MUI, one TW) require call-site-level parity to stay
16
- > parallel-maintainable.
14
+ > in sync.
17
15
 
18
16
  ## Versions audited
19
17
 
package/PERFORMANCE.md CHANGED
@@ -1,9 +1,8 @@
1
1
  # `@dashforge/tw` performance baseline
2
2
 
3
- > Sprint 3 P4 deliverable (2026-05-19). Establishes the pre-`1.0.0`
4
- > performance commitment for `@dashforge/tw@0.4.0-beta` (29
5
- > components). Every subsequent release MUST hold this line or
6
- > justify the regression in `CHANGELOG.md`.
3
+ > Establishes the performance commitment for `@dashforge/tw`. Every
4
+ > subsequent release should hold these numbers or justify any
5
+ > regression in `CHANGELOG.md`.
7
6
 
8
7
  ## Bundle size
9
8
 
package/THEME-AUDIT.md CHANGED
@@ -1,15 +1,14 @@
1
1
  # THEME-AUDIT — @dashforge/tw catalog identity sweep
2
2
 
3
- > Sprint 4.3 deliverable (2026-05-19). Audit of every `@dashforge/tw`
4
- > component against the **default `dashforgePreset()` identity rule**
5
- > (memory: `feedback_dashforge_preset_is_identity`).
3
+ > Audit of every `@dashforge/tw` component against the **default
4
+ > `dashforgePreset()` identity rule**.
6
5
  >
7
6
  > **Rule recap.** The `dashforgePreset()` CSS-variable swap
8
7
  > auto-inverts the neutral palette:
9
8
  > `bg-neutral-50` / `text-neutral-900` etc. resolve to the
10
9
  > appropriate physical color via `--df-tw-color-neutral-N`. Adding a
11
10
  > `dark:` variant on a neutral class **double-inverts** the value
12
- > and breaks dark mode. The Sprint 4.1 Table fix established the
11
+ > and breaks dark mode. The Table fix established the
13
12
  > canonical patterns; Sprint 4.3 applies them to the whole catalog.
14
13
 
15
14
  ## Scoring legend
@@ -0,0 +1,21 @@
1
+ import type { AccordionProps } from './accordion.types.js';
2
+ /**
3
+ * Dashforge TW `<Accordion>` — collapsible section list.
4
+ *
5
+ * Built on `@radix-ui/react-accordion`:
6
+ * - APG accordion pattern: `role="region"` on content, header
7
+ * button with `aria-expanded` and `aria-controls` linked to
8
+ * the panel.
9
+ * - Keyboard support: Space / Enter toggle, ArrowDown / ArrowUp
10
+ * move focus between triggers, Home / End to extremes.
11
+ * - Two modes:
12
+ * - `type="single"` — at most one section open at a time;
13
+ * `collapsible` allows clicking the open section to close it
14
+ * (default true).
15
+ * - `type="multiple"` — multiple sections open simultaneously.
16
+ *
17
+ * The trigger renders a chevron that flips 180° via CSS
18
+ * (`data-state=open` selector) — no React state, no JS animation.
19
+ */
20
+ export declare function Accordion(props: AccordionProps): import("react/jsx-runtime").JSX.Element;
21
+ //# sourceMappingURL=Accordion.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Accordion.d.ts","sourceRoot":"","sources":["../../../src/components/Accordion/Accordion.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,cAAc,EAGf,MAAM,sBAAsB,CAAC;AAE9B;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,2CAqE9C"}
@@ -0,0 +1,74 @@
1
+ import type { ReactNode } from 'react';
2
+ export interface AccordionSlotProps {
3
+ root?: {
4
+ className?: string;
5
+ };
6
+ item?: {
7
+ className?: string;
8
+ };
9
+ header?: {
10
+ className?: string;
11
+ };
12
+ trigger?: {
13
+ className?: string;
14
+ };
15
+ content?: {
16
+ className?: string;
17
+ };
18
+ chevron?: {
19
+ className?: string;
20
+ };
21
+ }
22
+ /**
23
+ * Single accordion section — paired `{ value, header, content }`.
24
+ * The `value` is the canonical id (used in `value` / `defaultValue`
25
+ * to control which sections are expanded).
26
+ */
27
+ export interface AccordionItem {
28
+ value: string;
29
+ /** Trigger label (clickable to expand / collapse). */
30
+ header: ReactNode;
31
+ /** Section body, revealed when this item is expanded. */
32
+ content: ReactNode;
33
+ /** Per-item disabled flag. */
34
+ disabled?: boolean;
35
+ }
36
+ interface AccordionBaseProps {
37
+ items: AccordionItem[];
38
+ /** Root className shortcut. */
39
+ sx?: string;
40
+ /** Per-slot overrides. */
41
+ slotProps?: AccordionSlotProps;
42
+ }
43
+ /**
44
+ * Single-mode props — at most one section open at a time.
45
+ * `collapsible: true` (default) lets the user close the open
46
+ * section by clicking it again.
47
+ */
48
+ export interface AccordionSingleProps extends AccordionBaseProps {
49
+ type?: 'single';
50
+ value?: string;
51
+ defaultValue?: string;
52
+ onValueChange?: (value: string) => void;
53
+ /** @default true */
54
+ collapsible?: boolean;
55
+ }
56
+ /**
57
+ * Multiple-mode props — any number of sections open simultaneously.
58
+ */
59
+ export interface AccordionMultipleProps extends AccordionBaseProps {
60
+ type: 'multiple';
61
+ value?: string[];
62
+ defaultValue?: string[];
63
+ onValueChange?: (value: string[]) => void;
64
+ }
65
+ /**
66
+ * Props for `<Accordion>`.
67
+ *
68
+ * Built on `@radix-ui/react-accordion`. Discriminated by `type`:
69
+ * - `type="single"` (default) — `value` is `string`.
70
+ * - `type="multiple"` — `value` is `string[]`.
71
+ */
72
+ export type AccordionProps = AccordionSingleProps | AccordionMultipleProps;
73
+ export {};
74
+ //# sourceMappingURL=accordion.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accordion.types.d.ts","sourceRoot":"","sources":["../../../src/components/Accordion/accordion.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEvC,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjC,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACjC,OAAO,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAClC;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,MAAM,EAAE,SAAS,CAAC;IAClB,yDAAyD;IACzD,OAAO,EAAE,SAAS,CAAC;IACnB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,UAAU,kBAAkB;IAC1B,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,+BAA+B;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,0BAA0B;IAC1B,SAAS,CAAC,EAAE,kBAAkB,CAAC;CAChC;AAED;;;;GAIG;AACH,MAAM,WAAW,oBAAqB,SAAQ,kBAAkB;IAC9D,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,oBAAoB;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAuB,SAAQ,kBAAkB;IAChE,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;CAC3C;AAED;;;;;;GAMG;AACH,MAAM,MAAM,cAAc,GAAG,oBAAoB,GAAG,sBAAsB,CAAC"}
@@ -0,0 +1,58 @@
1
+ import { type VariantProps } from 'tailwind-variants';
2
+ export declare const accordionVariants: import("tailwind-variants").TVReturnType<{
3
+ [key: string]: {
4
+ [key: string]: import("tailwind-merge").ClassNameValue | {
5
+ content?: import("tailwind-merge").ClassNameValue;
6
+ root?: import("tailwind-merge").ClassNameValue;
7
+ header?: import("tailwind-merge").ClassNameValue;
8
+ trigger?: import("tailwind-merge").ClassNameValue;
9
+ item?: import("tailwind-merge").ClassNameValue;
10
+ chevron?: import("tailwind-merge").ClassNameValue;
11
+ };
12
+ };
13
+ } | {
14
+ [x: string]: {
15
+ [x: string]: import("tailwind-merge").ClassNameValue | {
16
+ content?: import("tailwind-merge").ClassNameValue;
17
+ root?: import("tailwind-merge").ClassNameValue;
18
+ header?: import("tailwind-merge").ClassNameValue;
19
+ trigger?: import("tailwind-merge").ClassNameValue;
20
+ item?: import("tailwind-merge").ClassNameValue;
21
+ chevron?: import("tailwind-merge").ClassNameValue;
22
+ };
23
+ };
24
+ } | {}, {
25
+ root: string;
26
+ item: string;
27
+ header: string;
28
+ trigger: string[];
29
+ content: string[];
30
+ chevron: string[];
31
+ }, undefined, {
32
+ [key: string]: {
33
+ [key: string]: import("tailwind-merge").ClassNameValue | {
34
+ content?: import("tailwind-merge").ClassNameValue;
35
+ root?: import("tailwind-merge").ClassNameValue;
36
+ header?: import("tailwind-merge").ClassNameValue;
37
+ trigger?: import("tailwind-merge").ClassNameValue;
38
+ item?: import("tailwind-merge").ClassNameValue;
39
+ chevron?: import("tailwind-merge").ClassNameValue;
40
+ };
41
+ };
42
+ } | {}, {
43
+ root: string;
44
+ item: string;
45
+ header: string;
46
+ trigger: string[];
47
+ content: string[];
48
+ chevron: string[];
49
+ }, import("tailwind-variants").TVReturnType<unknown, {
50
+ root: string;
51
+ item: string;
52
+ header: string;
53
+ trigger: string[];
54
+ content: string[];
55
+ chevron: string[];
56
+ }, undefined, unknown, unknown, undefined>>;
57
+ export type AccordionVariants = VariantProps<typeof accordionVariants>;
58
+ //# sourceMappingURL=accordion.variants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accordion.variants.d.ts","sourceRoot":"","sources":["../../../src/components/Accordion/accordion.variants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAM,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE1D,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2CA2B5B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,YAAY,CAAC,OAAO,iBAAiB,CAAC,CAAC"}
@@ -0,0 +1,46 @@
1
+ import type { AppShellProps } from './appShell.types.js';
2
+ /**
3
+ * Dashforge TW AppShell — top-level layout orchestrator.
4
+ *
5
+ * ┌──────────────────────────────────────────┐
6
+ * │ header │ ← `header` slot
7
+ * ├────────┬─────────────────────────────────┤
8
+ * │ │ │
9
+ * │ nav │ main │ ← `nav` + `children`
10
+ * │ │ │
11
+ * ├────────┴─────────────────────────────────┤
12
+ * │ footer │ ← `footer` slot
13
+ * └──────────────────────────────────────────┘
14
+ *
15
+ * **Responsive**:
16
+ * - `≥ md`: nav stays in the inline slot at the left.
17
+ * - `< md`: nav becomes a slide-in drawer toggled by `navOpen`.
18
+ * A backdrop closes the drawer on click (mirrors `<Dialog>` UX).
19
+ *
20
+ * **Body scroll lock**: when the mobile drawer is open we add
21
+ * `overflow-hidden` to `<body>` to prevent dual-scroll wobble. The
22
+ * effect cleans up on close + on unmount.
23
+ *
24
+ * **A11y**:
25
+ * - `<main>` landmark wraps the content area.
26
+ * - `<header>` / `<footer>` come for free from their HTML tags.
27
+ * - The mobile drawer + backdrop participate in the standard
28
+ * "click outside to close" pattern — `Escape` closes the drawer
29
+ * too (added via global keydown).
30
+ * - **Focus trap** (WCAG 2.4.3) — when the mobile drawer opens:
31
+ * 1. The previously-focused element is captured.
32
+ * 2. Focus moves to the first focusable element inside the drawer.
33
+ * 3. Tab / Shift+Tab wrap inside the drawer (cycle from
34
+ * last → first and first → last) — Tab can never escape
35
+ * to the page underneath while the drawer is open.
36
+ * 4. On close, focus returns to the captured element (typically
37
+ * the hamburger toggle the user pressed to open the drawer).
38
+ * This pattern matches WAI-ARIA APG's modal dialog guidance even
39
+ * though the drawer isn't strictly a dialog — same focus
40
+ * management makes keyboard users' experience predictable.
41
+ * - **`role="dialog"` + `aria-modal="true"`** are applied to the
42
+ * drawer when open so screen readers announce it as a modal
43
+ * overlay rather than just an aside.
44
+ */
45
+ export declare function AppShell(props: AppShellProps): import("react/jsx-runtime").JSX.Element;
46
+ //# sourceMappingURL=AppShell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AppShell.d.ts","sourceRoot":"","sources":["../../../src/components/AppShell/AppShell.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AA0BzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,aAAa,2CAsK5C"}
@@ -0,0 +1,62 @@
1
+ import type { ReactNode } from 'react';
2
+ import type { AppShellVariants } from './appShell.variants.js';
3
+ export interface AppShellSlotProps {
4
+ root?: {
5
+ className?: string;
6
+ };
7
+ header?: {
8
+ className?: string;
9
+ };
10
+ nav?: {
11
+ className?: string;
12
+ };
13
+ navMobile?: {
14
+ className?: string;
15
+ };
16
+ main?: {
17
+ className?: string;
18
+ };
19
+ footer?: {
20
+ className?: string;
21
+ };
22
+ backdrop?: {
23
+ className?: string;
24
+ };
25
+ }
26
+ /**
27
+ * Props for `<AppShell>`.
28
+ *
29
+ * Top-level layout orchestrator with 4 named slots:
30
+ *
31
+ * - `header` (top, sticky)
32
+ * - `nav` (left side, fixed-width on desktop, drawer on mobile)
33
+ * - `footer` (bottom, non-sticky)
34
+ * - `children` (main content, scrolls independently)
35
+ *
36
+ * Responsive behavior:
37
+ * - **≥ md (768px)**: nav is rendered inline at the left.
38
+ * - **< md**: nav slides in as an overlay drawer when
39
+ * `navOpen={true}` (controlled).
40
+ *
41
+ * The shell is router-agnostic — pass any nav/header content. Typical
42
+ * pairing is `<LeftNav>` + `<TopBar>` (with a hamburger button in
43
+ * `TopBar.start` that flips `navOpen`).
44
+ */
45
+ export interface AppShellProps extends AppShellVariants {
46
+ header?: ReactNode;
47
+ nav?: ReactNode;
48
+ footer?: ReactNode;
49
+ children?: ReactNode;
50
+ /**
51
+ * Mobile drawer open state. Controlled — provide
52
+ * `onNavOpenChange` to update. When `undefined`, the mobile drawer
53
+ * is always closed (consumer hasn't wired up the toggle yet).
54
+ */
55
+ navOpen?: boolean;
56
+ onNavOpenChange?: (open: boolean) => void;
57
+ /** Root className shortcut. */
58
+ sx?: string;
59
+ /** Per-slot className overrides. */
60
+ slotProps?: AppShellSlotProps;
61
+ }
62
+ //# sourceMappingURL=appShell.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appShell.types.d.ts","sourceRoot":"","sources":["../../../src/components/AppShell/appShell.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC,GAAG,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7B,SAAS,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,MAAM,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC,QAAQ,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACnC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,aAAc,SAAQ,gBAAgB;IACrD,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB;;;;OAIG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,eAAe,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1C,+BAA+B;IAC/B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,oCAAoC;IACpC,SAAS,CAAC,EAAE,iBAAiB,CAAC;CAC/B"}
@@ -0,0 +1,65 @@
1
+ import { type VariantProps } from 'tailwind-variants';
2
+ /**
3
+ * Tailwind-variants recipe for `<AppShell>`.
4
+ *
5
+ * Slots:
6
+ * - `root` — outer flex column (full viewport)
7
+ * - `header` — top region
8
+ * - `body` — flex row holding nav + main
9
+ * - `nav` — desktop nav rail (md+)
10
+ * - `navMobile` — mobile drawer (slide-in)
11
+ * - `main` — scrollable content area
12
+ * - `footer` — bottom region
13
+ * - `backdrop` — semi-opaque overlay behind the mobile drawer
14
+ */
15
+ export declare const appShellVariants: import("tailwind-variants").TVReturnType<{
16
+ navOpen: {
17
+ true: {
18
+ navMobile: string;
19
+ backdrop: string;
20
+ };
21
+ };
22
+ }, {
23
+ root: string;
24
+ header: string;
25
+ body: string;
26
+ nav: string;
27
+ navMobile: string[];
28
+ main: string;
29
+ footer: string;
30
+ backdrop: string[];
31
+ }, undefined, {
32
+ navOpen: {
33
+ true: {
34
+ navMobile: string;
35
+ backdrop: string;
36
+ };
37
+ };
38
+ }, {
39
+ root: string;
40
+ header: string;
41
+ body: string;
42
+ nav: string;
43
+ navMobile: string[];
44
+ main: string;
45
+ footer: string;
46
+ backdrop: string[];
47
+ }, import("tailwind-variants").TVReturnType<{
48
+ navOpen: {
49
+ true: {
50
+ navMobile: string;
51
+ backdrop: string;
52
+ };
53
+ };
54
+ }, {
55
+ root: string;
56
+ header: string;
57
+ body: string;
58
+ nav: string;
59
+ navMobile: string[];
60
+ main: string;
61
+ footer: string;
62
+ backdrop: string[];
63
+ }, undefined, unknown, unknown, undefined>>;
64
+ export type AppShellVariants = VariantProps<typeof appShellVariants>;
65
+ //# sourceMappingURL=appShell.variants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appShell.variants.d.ts","sourceRoot":"","sources":["../../../src/components/AppShell/appShell.variants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAM,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE1D;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2CAoC3B,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,YAAY,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type { AspectRatioProps } from './aspectRatio.types.js';
2
+ /**
3
+ * `<AspectRatio>` — locks the aspect ratio of its child container,
4
+ * regardless of width. The classic use is responsive images and
5
+ * embedded media: an `<img>` that takes 100% of the available width
6
+ * but always renders at 16:9 (or 1:1, or whatever the source ratio is)
7
+ * — no jumping layouts during image load, no whitespace below the
8
+ * media, no JS measurement.
9
+ *
10
+ * Implementation: native CSS `aspect-ratio` property. Supported in
11
+ * every browser shipped from 2021 onward (Chrome 88, Firefox 89,
12
+ * Safari 15, Edge 88). No padding-bottom hack — that workaround
13
+ * predates the native property and brings ugly absolute-positioning
14
+ * requirements on the child.
15
+ *
16
+ * Why a component if it's "just one CSS property"?
17
+ * Two reasons:
18
+ * 1. Discoverability — `<AspectRatio ratio={16/9}>` documents the
19
+ * intent at the call site. `style={{ aspectRatio: '16/9' }}` is
20
+ * the same thing functionally, but harder to spot in a 200-line
21
+ * component file.
22
+ * 2. Composition — pairs naturally with `sx="rounded-xl overflow-hidden"`
23
+ * for the canonical "rounded clipped media" pattern. Forgetting
24
+ * the `overflow-hidden` is the #1 mistake we want to prevent
25
+ * through documentation (it's in this component's MDX, at the
26
+ * top of the Notes).
27
+ *
28
+ * Child contract:
29
+ * The single child is expected to fill the container — typically
30
+ * `<img>` / `<video>` with `className="w-full h-full object-cover"`.
31
+ * We don't force this via CSS (the consumer might want a centered
32
+ * icon instead of a filling image) — but it's the 99% case, and the
33
+ * docs show it first.
34
+ */
35
+ export declare const AspectRatio: import("react").ForwardRefExoticComponent<AspectRatioProps & import("react").RefAttributes<HTMLElement>>;
36
+ //# sourceMappingURL=AspectRatio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AspectRatio.d.ts","sourceRoot":"","sources":["../../../src/components/AspectRatio/AspectRatio.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,eAAO,MAAM,WAAW,0GAiCvB,CAAC"}
@@ -0,0 +1,50 @@
1
+ import type { ElementType, HTMLAttributes, ReactNode } from 'react';
2
+ /**
3
+ * Props for `<AspectRatio>` — content-shape primitive that locks the
4
+ * aspect ratio of its child regardless of width.
5
+ *
6
+ * Implementation: uses the native CSS `aspect-ratio` property
7
+ * (supported in all current browsers since 2021 — Chrome 88+, Firefox 89+,
8
+ * Safari 15+, Edge 88+). No padding-bottom hack, no JS measurement.
9
+ *
10
+ * `ratio` accepts:
11
+ * • A number — width / height. `16/9` is 1.7777…, `1` is square,
12
+ * `4/3` is 1.333…, `21/9` is ultrawide cinema.
13
+ * • A string with the CSS `aspect-ratio` syntax, e.g. `'16 / 9'`,
14
+ * `'4 / 3'`. Useful when you want the source ratio to read clearly
15
+ * in the JSX (`ratio="16 / 9"` is more legible than `ratio={16/9}`).
16
+ *
17
+ * The component renders a single element with `aspect-ratio: X` and
18
+ * `width: 100%`. The child is expected to fill it — typically an
19
+ * `<img>` or `<video>` with `className="w-full h-full object-cover"`.
20
+ *
21
+ * Why not a TV recipe?
22
+ * The ratio is arbitrary (`16/9`, `1`, `2.35`, anything). Tailwind
23
+ * has `aspect-square` / `aspect-video` / `aspect-[16/9]` arbitrary
24
+ * values, but enumerating every conceivable ratio in TV would be
25
+ * pointless. We set `style={{ aspectRatio }}` directly — pure CSS
26
+ * property, no class purge concerns.
27
+ */
28
+ export interface AspectRatioProps extends Omit<HTMLAttributes<HTMLDivElement>, 'className'> {
29
+ /**
30
+ * Aspect ratio as width/height. Number (`16/9`) or CSS string
31
+ * (`'16 / 9'`). Default `1` (square).
32
+ */
33
+ ratio?: number | string;
34
+ /**
35
+ * The child that fills the locked-ratio container. Typically an
36
+ * `<img>` or `<video>` with `className="w-full h-full object-cover"`.
37
+ */
38
+ children?: ReactNode;
39
+ /**
40
+ * Override the rendered HTML tag. Defaults to `'div'`.
41
+ */
42
+ as?: ElementType;
43
+ /**
44
+ * Utility classes appended to the base. Resolved via `tailwind-merge`.
45
+ * Common overrides: `sx="rounded-xl overflow-hidden"` to clip the
46
+ * child's overflow (image bleeds otherwise).
47
+ */
48
+ sx?: string;
49
+ }
50
+ //# sourceMappingURL=aspectRatio.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aspectRatio.types.d.ts","sourceRoot":"","sources":["../../../src/components/AspectRatio/aspectRatio.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEpE;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,WAAW,gBACf,SAAQ,IAAI,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,WAAW,CAAC;IACzD;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAExB;;;OAGG;IACH,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB;;OAEG;IACH,EAAE,CAAC,EAAE,WAAW,CAAC;IAEjB;;;;OAIG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;CACb"}
@@ -0,0 +1,32 @@
1
+ import type { AutocompleteOption, AutocompleteProps } from './autocomplete.types.js';
2
+ /**
3
+ * Dashforge TW Autocomplete — bridge-integrated single-select combobox.
4
+ *
5
+ * **Implementation note (F5-A, rev. 2)**
6
+ *
7
+ * The first revision wrapped `react-aria-components`' `<ComboBox>` to get
8
+ * AAA-grade a11y for free. In practice React Aria's internal state
9
+ * machine fought every controlled-state pattern we tried (the input text
10
+ * would not clear when `selectedKey` went to `null`, even with a forced
11
+ * remount via `key` bumping). To get deterministic behaviour we own all
12
+ * of the state ourselves:
13
+ *
14
+ * - `inputValue` — the visible text in the `<input>`
15
+ * - `isOpen` — popover visibility
16
+ * - `highlightedIndex` — keyboard navigation cursor
17
+ *
18
+ * A11y is still solid:
19
+ * - `role="combobox"` + `aria-autocomplete="list"` on the input
20
+ * - `aria-expanded`, `aria-controls`, `aria-activedescendant`
21
+ * - `role="listbox"` / `role="option"` with `aria-selected`
22
+ * - Full keyboard nav (↑/↓ navigate, Enter selects, Escape closes,
23
+ * Home/End jump, Tab closes, click-outside closes)
24
+ * - Required field gets `aria-required="true"`
25
+ *
26
+ * F5-A scope: single-select, static options, contains-substring filter
27
+ * (case-insensitive). Multi-select, free-solo text, generic option
28
+ * shapes, and async runtime options (`optionsFromFieldData`) are
29
+ * deferred to F5-A-bis.
30
+ */
31
+ export declare function Autocomplete<TOption = AutocompleteOption>(props: AutocompleteProps<TOption>): import("react/jsx-runtime").JSX.Element | null;
32
+ //# sourceMappingURL=Autocomplete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Autocomplete.d.ts","sourceRoot":"","sources":["../../../src/components/Autocomplete/Autocomplete.tsx"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EACV,kBAAkB,EAClB,iBAAiB,EAElB,MAAM,yBAAyB,CAAC;AA8FjC;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAG,kBAAkB,EACvD,KAAK,EAAE,iBAAiB,CAAC,OAAO,CAAC,kDAy5BlC"}