@dashforge/tw 1.1.0 → 1.1.1

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 (390) hide show
  1. package/CHANGELOG.md +21 -1
  2. package/dist/index.esm.js +1 -1
  3. package/dist/src/index.d.ts +1 -1
  4. package/package.json +8 -3
  5. package/.swcrc +0 -29
  6. package/A11Y.md +0 -130
  7. package/CONSUMER-VALIDATION.md +0 -130
  8. package/COVERAGE.md +0 -63
  9. package/PARITY.md +0 -481
  10. package/PERFORMANCE.md +0 -227
  11. package/REFINEMENT-NOTES.md +0 -50
  12. package/THEME-AUDIT.md +0 -174
  13. package/dashforge-tw-1.0.0.tgz +0 -0
  14. package/eslint.config.mjs +0 -62
  15. package/project.json +0 -15
  16. package/rollup.config.cjs +0 -16
  17. package/src/components/Accordion/Accordion.test.tsx +0 -95
  18. package/src/components/Accordion/Accordion.tsx +0 -97
  19. package/src/components/Accordion/accordion.types.ts +0 -66
  20. package/src/components/Accordion/accordion.variants.ts +0 -32
  21. package/src/components/Alert/Alert.test.tsx +0 -302
  22. package/src/components/Alert/Alert.tsx +0 -186
  23. package/src/components/Alert/alert.types.ts +0 -144
  24. package/src/components/Alert/alert.variants.ts +0 -71
  25. package/src/components/AppShell/AppShell.test.tsx +0 -223
  26. package/src/components/AppShell/AppShell.tsx +0 -239
  27. package/src/components/AppShell/appShell.types.ts +0 -49
  28. package/src/components/AppShell/appShell.variants.ts +0 -54
  29. package/src/components/AspectRatio/AspectRatio.test.tsx +0 -173
  30. package/src/components/AspectRatio/AspectRatio.tsx +0 -73
  31. package/src/components/AspectRatio/aspectRatio.types.ts +0 -54
  32. package/src/components/Autocomplete/Autocomplete.perf.test.tsx +0 -225
  33. package/src/components/Autocomplete/Autocomplete.test.tsx +0 -556
  34. package/src/components/Autocomplete/Autocomplete.tsx +0 -1069
  35. package/src/components/Autocomplete/autocomplete.types.ts +0 -198
  36. package/src/components/Autocomplete/autocomplete.variants.ts +0 -141
  37. package/src/components/Avatar/Avatar.test.tsx +0 -287
  38. package/src/components/Avatar/Avatar.tsx +0 -304
  39. package/src/components/Avatar/avatar.types.ts +0 -205
  40. package/src/components/Avatar/avatar.variants.ts +0 -194
  41. package/src/components/Badge/Badge.test.tsx +0 -385
  42. package/src/components/Badge/Badge.tsx +0 -174
  43. package/src/components/Badge/badge.types.ts +0 -154
  44. package/src/components/Badge/badge.variants.ts +0 -161
  45. package/src/components/Box/Box.test.tsx +0 -391
  46. package/src/components/Box/Box.tsx +0 -112
  47. package/src/components/Box/box.types.ts +0 -116
  48. package/src/components/Box/box.variants.ts +0 -230
  49. package/src/components/Breadcrumbs/Breadcrumbs.perf.test.tsx +0 -128
  50. package/src/components/Breadcrumbs/Breadcrumbs.test.tsx +0 -231
  51. package/src/components/Breadcrumbs/Breadcrumbs.tsx +0 -203
  52. package/src/components/Breadcrumbs/breadcrumbs.types.ts +0 -87
  53. package/src/components/Breadcrumbs/breadcrumbs.variants.ts +0 -54
  54. package/src/components/Button/Button.test.tsx +0 -204
  55. package/src/components/Button/Button.tsx +0 -151
  56. package/src/components/Button/button.types.ts +0 -110
  57. package/src/components/Button/button.variants.ts +0 -159
  58. package/src/components/Calendar/Calendar.test.tsx +0 -75
  59. package/src/components/Calendar/Calendar.tsx +0 -264
  60. package/src/components/Calendar/calendar.types.ts +0 -65
  61. package/src/components/Calendar/calendar.variants.ts +0 -64
  62. package/src/components/Card/Card.test.tsx +0 -291
  63. package/src/components/Card/Card.tsx +0 -241
  64. package/src/components/Card/card.types.ts +0 -132
  65. package/src/components/Checkbox/Checkbox.test.tsx +0 -146
  66. package/src/components/Checkbox/Checkbox.tsx +0 -286
  67. package/src/components/Checkbox/checkbox.types.ts +0 -88
  68. package/src/components/Checkbox/checkbox.variants.ts +0 -68
  69. package/src/components/Chip/Chip.test.tsx +0 -316
  70. package/src/components/Chip/Chip.tsx +0 -224
  71. package/src/components/Chip/chip.types.ts +0 -128
  72. package/src/components/Chip/chip.variants.ts +0 -173
  73. package/src/components/ConfirmDialog/ConfirmDialog.perf.test.tsx +0 -172
  74. package/src/components/ConfirmDialog/ConfirmDialog.test.tsx +0 -311
  75. package/src/components/ConfirmDialog/ConfirmDialog.tsx +0 -252
  76. package/src/components/ConfirmDialog/confirmDialog.types.ts +0 -70
  77. package/src/components/ConfirmDialog/confirmDialog.variants.ts +0 -76
  78. package/src/components/Container/Container.test.tsx +0 -209
  79. package/src/components/Container/Container.tsx +0 -74
  80. package/src/components/Container/container.types.ts +0 -45
  81. package/src/components/Container/container.variants.ts +0 -81
  82. package/src/components/DataGrid/DataGrid.perf.test.tsx +0 -114
  83. package/src/components/DataGrid/DataGrid.test.tsx +0 -1153
  84. package/src/components/DataGrid/DataGrid.tsx +0 -1282
  85. package/src/components/DataGrid/dataGrid.types.ts +0 -238
  86. package/src/components/DataGrid/dataGrid.variants.ts +0 -152
  87. package/src/components/DataGrid/filters/ColumnFilters.test.tsx +0 -330
  88. package/src/components/DataGrid/filters/ColumnFilters.tsx +0 -456
  89. package/src/components/DataGrid/reorder/useColumnReorder.test.ts +0 -130
  90. package/src/components/DataGrid/reorder/useColumnReorder.ts +0 -144
  91. package/src/components/DataGrid/resize/useColumnResize.test.ts +0 -144
  92. package/src/components/DataGrid/resize/useColumnResize.ts +0 -135
  93. package/src/components/DataGrid/visibility/ColumnVisibilityMenu.tsx +0 -186
  94. package/src/components/DatePicker/DatePicker.test.tsx +0 -76
  95. package/src/components/DatePicker/DatePicker.tsx +0 -305
  96. package/src/components/DatePicker/datePicker.types.ts +0 -77
  97. package/src/components/DatePicker/datePicker.variants.ts +0 -50
  98. package/src/components/DateRangePicker/DateRangePicker.test.tsx +0 -92
  99. package/src/components/DateRangePicker/DateRangePicker.tsx +0 -510
  100. package/src/components/DateRangePicker/dateRangePicker.types.ts +0 -74
  101. package/src/components/DateRangePicker/dateRangePicker.variants.ts +0 -101
  102. package/src/components/DateTimePicker/DateTimePicker.test.tsx +0 -78
  103. package/src/components/DateTimePicker/DateTimePicker.tsx +0 -347
  104. package/src/components/DateTimePicker/dateTimePicker.types.ts +0 -79
  105. package/src/components/DateTimePicker/dateTimePicker.variants.ts +0 -55
  106. package/src/components/Dialog/Dialog.test.tsx +0 -96
  107. package/src/components/Dialog/Dialog.tsx +0 -102
  108. package/src/components/Dialog/dialog.types.ts +0 -62
  109. package/src/components/Dialog/dialog.variants.ts +0 -66
  110. package/src/components/Divider/Divider.test.tsx +0 -243
  111. package/src/components/Divider/Divider.tsx +0 -140
  112. package/src/components/Divider/divider.types.ts +0 -52
  113. package/src/components/Divider/divider.variants.ts +0 -116
  114. package/src/components/Grid/Grid.test.tsx +0 -321
  115. package/src/components/Grid/Grid.tsx +0 -148
  116. package/src/components/Grid/grid.types.ts +0 -112
  117. package/src/components/Grid/grid.variants.ts +0 -133
  118. package/src/components/IconButton/IconButton.test.tsx +0 -367
  119. package/src/components/IconButton/IconButton.tsx +0 -159
  120. package/src/components/IconButton/iconButton.types.ts +0 -106
  121. package/src/components/IconButton/iconButton.variants.ts +0 -31
  122. package/src/components/LeftNav/LeftNav.perf.test.tsx +0 -172
  123. package/src/components/LeftNav/LeftNav.test.tsx +0 -302
  124. package/src/components/LeftNav/LeftNav.tsx +0 -330
  125. package/src/components/LeftNav/leftNav.types.ts +0 -120
  126. package/src/components/LeftNav/leftNav.variants.ts +0 -107
  127. package/src/components/Menu/Menu.test.tsx +0 -408
  128. package/src/components/Menu/Menu.tsx +0 -335
  129. package/src/components/Menu/menu.types.ts +0 -221
  130. package/src/components/Menu/menu.variants.ts +0 -132
  131. package/src/components/NumberField/NumberField.test.tsx +0 -83
  132. package/src/components/NumberField/NumberField.tsx +0 -321
  133. package/src/components/NumberField/numberField.types.ts +0 -72
  134. package/src/components/NumberField/numberField.variants.ts +0 -94
  135. package/src/components/OTPField/OTPField.test.tsx +0 -121
  136. package/src/components/OTPField/OTPField.tsx +0 -250
  137. package/src/components/OTPField/otpField.types.ts +0 -58
  138. package/src/components/OTPField/otpField.variants.ts +0 -72
  139. package/src/components/Pagination/Pagination.test.tsx +0 -314
  140. package/src/components/Pagination/Pagination.tsx +0 -277
  141. package/src/components/Pagination/pagination.helpers.ts +0 -102
  142. package/src/components/Pagination/pagination.types.ts +0 -117
  143. package/src/components/Pagination/pagination.variants.ts +0 -117
  144. package/src/components/Popover/Popover.test.tsx +0 -72
  145. package/src/components/Popover/Popover.tsx +0 -55
  146. package/src/components/Popover/popover.types.ts +0 -42
  147. package/src/components/Popover/popover.variants.ts +0 -24
  148. package/src/components/RadioGroup/RadioGroup.test.tsx +0 -140
  149. package/src/components/RadioGroup/RadioGroup.tsx +0 -283
  150. package/src/components/RadioGroup/radioGroup.types.ts +0 -85
  151. package/src/components/RadioGroup/radioGroup.variants.ts +0 -87
  152. package/src/components/Skeleton/Skeleton.test.tsx +0 -127
  153. package/src/components/Skeleton/Skeleton.tsx +0 -49
  154. package/src/components/Skeleton/skeleton.types.ts +0 -59
  155. package/src/components/Skeleton/skeleton.variants.ts +0 -87
  156. package/src/components/Snackbar/Snackbar.perf.test.tsx +0 -144
  157. package/src/components/Snackbar/Snackbar.test.tsx +0 -327
  158. package/src/components/Snackbar/Snackbar.tsx +0 -316
  159. package/src/components/Snackbar/snackbar.types.ts +0 -127
  160. package/src/components/Snackbar/snackbar.variants.ts +0 -81
  161. package/src/components/Spinner/Spinner.test.tsx +0 -199
  162. package/src/components/Spinner/Spinner.tsx +0 -158
  163. package/src/components/Spinner/spinner.types.ts +0 -113
  164. package/src/components/Spinner/spinner.variants.ts +0 -83
  165. package/src/components/Stack/Stack.test.tsx +0 -309
  166. package/src/components/Stack/Stack.tsx +0 -115
  167. package/src/components/Stack/stack.types.ts +0 -68
  168. package/src/components/Stack/stack.variants.ts +0 -80
  169. package/src/components/Switch/Switch.test.tsx +0 -131
  170. package/src/components/Switch/Switch.tsx +0 -158
  171. package/src/components/Switch/switch.types.ts +0 -36
  172. package/src/components/Switch/switch.variants.ts +0 -70
  173. package/src/components/Table/Table.perf.test.tsx +0 -81
  174. package/src/components/Table/Table.test.tsx +0 -674
  175. package/src/components/Table/Table.tsx +0 -863
  176. package/src/components/Table/cells/RenderButton.tsx +0 -23
  177. package/src/components/Table/cells/RenderChip.tsx +0 -37
  178. package/src/components/Table/cells/RenderText.tsx +0 -37
  179. package/src/components/Table/cells/RenderTwoLine.tsx +0 -34
  180. package/src/components/Table/cells/RowActionsMenu.tsx +0 -147
  181. package/src/components/Table/cells/cells.test.tsx +0 -247
  182. package/src/components/Table/cells/index.ts +0 -14
  183. package/src/components/Table/table.types.ts +0 -438
  184. package/src/components/Table/table.variants.ts +0 -207
  185. package/src/components/Tabs/Tabs.test.tsx +0 -145
  186. package/src/components/Tabs/Tabs.tsx +0 -77
  187. package/src/components/Tabs/tabs.types.ts +0 -55
  188. package/src/components/Tabs/tabs.variants.ts +0 -69
  189. package/src/components/Tabs/useTabs.ts +0 -167
  190. package/src/components/TextField/TextField.test.tsx +0 -198
  191. package/src/components/TextField/TextField.tsx +0 -245
  192. package/src/components/TextField/textField.types.ts +0 -90
  193. package/src/components/TextField/textField.variants.ts +0 -105
  194. package/src/components/Textarea/Textarea.test.tsx +0 -75
  195. package/src/components/Textarea/Textarea.tsx +0 -190
  196. package/src/components/Textarea/textarea.types.ts +0 -60
  197. package/src/components/Textarea/textarea.variants.ts +0 -85
  198. package/src/components/TimePicker/TimePicker.test.tsx +0 -65
  199. package/src/components/TimePicker/TimePicker.tsx +0 -274
  200. package/src/components/TimePicker/timePicker.types.ts +0 -69
  201. package/src/components/TimePicker/timePicker.variants.ts +0 -53
  202. package/src/components/Tooltip/Tooltip.test.tsx +0 -73
  203. package/src/components/Tooltip/Tooltip.tsx +0 -70
  204. package/src/components/Tooltip/tooltip.types.ts +0 -44
  205. package/src/components/Tooltip/tooltip.variants.ts +0 -28
  206. package/src/components/TopBar/TopBar.test.tsx +0 -129
  207. package/src/components/TopBar/TopBar.tsx +0 -66
  208. package/src/components/TopBar/topBar.types.ts +0 -42
  209. package/src/components/TopBar/topBar.variants.ts +0 -38
  210. package/src/components/Typography/Typography.test.tsx +0 -247
  211. package/src/components/Typography/Typography.tsx +0 -112
  212. package/src/components/Typography/typography.types.ts +0 -65
  213. package/src/components/Typography/typography.variants.ts +0 -130
  214. package/src/components/VisuallyHidden/VisuallyHidden.test.tsx +0 -86
  215. package/src/components/VisuallyHidden/VisuallyHidden.tsx +0 -59
  216. package/src/components/VisuallyHidden/visuallyHidden.types.ts +0 -45
  217. package/src/components/_shared/data/getNestedValue.test.ts +0 -50
  218. package/src/components/_shared/data/getNestedValue.ts +0 -32
  219. package/src/components/_shared/data/useColumnAutoDetect.test.ts +0 -123
  220. package/src/components/_shared/data/useColumnAutoDetect.ts +0 -100
  221. package/src/components/_shared/data/useControllableState.ts +0 -48
  222. package/src/components/_shared/data/useDebouncedValue.ts +0 -24
  223. package/src/components/_shared/data/useTableFilter.test.ts +0 -166
  224. package/src/components/_shared/data/useTableFilter.ts +0 -118
  225. package/src/components/_shared/data/useTableSearch.test.ts +0 -115
  226. package/src/components/_shared/data/useTableSearch.ts +0 -66
  227. package/src/components/_shared/data/useTableSelection.test.ts +0 -100
  228. package/src/components/_shared/data/useTableSelection.ts +0 -100
  229. package/src/components/_shared/data/useTableSort.test.ts +0 -150
  230. package/src/components/_shared/data/useTableSort.ts +0 -141
  231. package/src/components/_shared/data/useVirtualizer.test.ts +0 -158
  232. package/src/components/_shared/data/useVirtualizer.ts +0 -199
  233. package/src/components/_shared/resolveValidationState.ts +0 -60
  234. package/src/components/_shared/severity/index.ts +0 -33
  235. package/src/components/_shared/severity/severity.types.ts +0 -50
  236. package/src/components/_shared/severity/severityIcons.tsx +0 -104
  237. package/src/components/_shared/severity/severityVariants.test.ts +0 -136
  238. package/src/components/_shared/severity/severityVariants.ts +0 -115
  239. package/src/components/_shared/themeIdentity.test.ts +0 -113
  240. package/src/hooks/useAccessState.spec.tsx +0 -161
  241. package/src/hooks/useAccessState.ts +0 -81
  242. package/src/index.ts +0 -550
  243. package/src/utils/cn.spec.ts +0 -16
  244. package/src/utils/cn.ts +0 -29
  245. package/test-output/vitest/coverage/base.css +0 -224
  246. package/test-output/vitest/coverage/block-navigation.js +0 -87
  247. package/test-output/vitest/coverage/clover.xml +0 -2418
  248. package/test-output/vitest/coverage/coverage-final.json +0 -89
  249. package/test-output/vitest/coverage/favicon.png +0 -0
  250. package/test-output/vitest/coverage/index.html +0 -746
  251. package/test-output/vitest/coverage/prettify.css +0 -1
  252. package/test-output/vitest/coverage/prettify.js +0 -2
  253. package/test-output/vitest/coverage/sort-arrow-sprite.png +0 -0
  254. package/test-output/vitest/coverage/sorter.js +0 -210
  255. package/test-output/vitest/coverage/src/components/Accordion/Accordion.tsx.html +0 -376
  256. package/test-output/vitest/coverage/src/components/Accordion/accordion.variants.ts.html +0 -181
  257. package/test-output/vitest/coverage/src/components/Accordion/index.html +0 -131
  258. package/test-output/vitest/coverage/src/components/AppShell/AppShell.tsx.html +0 -802
  259. package/test-output/vitest/coverage/src/components/AppShell/appShell.variants.ts.html +0 -247
  260. package/test-output/vitest/coverage/src/components/AppShell/index.html +0 -131
  261. package/test-output/vitest/coverage/src/components/AspectRatio/AspectRatio.tsx.html +0 -304
  262. package/test-output/vitest/coverage/src/components/AspectRatio/index.html +0 -116
  263. package/test-output/vitest/coverage/src/components/Autocomplete/Autocomplete.tsx.html +0 -3292
  264. package/test-output/vitest/coverage/src/components/Autocomplete/autocomplete.variants.ts.html +0 -508
  265. package/test-output/vitest/coverage/src/components/Autocomplete/index.html +0 -131
  266. package/test-output/vitest/coverage/src/components/Box/Box.tsx.html +0 -334
  267. package/test-output/vitest/coverage/src/components/Box/box.variants.ts.html +0 -775
  268. package/test-output/vitest/coverage/src/components/Box/index.html +0 -131
  269. package/test-output/vitest/coverage/src/components/Breadcrumbs/Breadcrumbs.tsx.html +0 -694
  270. package/test-output/vitest/coverage/src/components/Breadcrumbs/breadcrumbs.variants.ts.html +0 -247
  271. package/test-output/vitest/coverage/src/components/Breadcrumbs/index.html +0 -131
  272. package/test-output/vitest/coverage/src/components/Button/Button.tsx.html +0 -535
  273. package/test-output/vitest/coverage/src/components/Button/button.variants.ts.html +0 -562
  274. package/test-output/vitest/coverage/src/components/Button/index.html +0 -131
  275. package/test-output/vitest/coverage/src/components/Checkbox/Checkbox.tsx.html +0 -943
  276. package/test-output/vitest/coverage/src/components/Checkbox/checkbox.variants.ts.html +0 -289
  277. package/test-output/vitest/coverage/src/components/Checkbox/index.html +0 -131
  278. package/test-output/vitest/coverage/src/components/ConfirmDialog/ConfirmDialog.tsx.html +0 -841
  279. package/test-output/vitest/coverage/src/components/ConfirmDialog/confirmDialog.variants.ts.html +0 -313
  280. package/test-output/vitest/coverage/src/components/ConfirmDialog/index.html +0 -131
  281. package/test-output/vitest/coverage/src/components/Container/Container.tsx.html +0 -307
  282. package/test-output/vitest/coverage/src/components/Container/container.variants.ts.html +0 -328
  283. package/test-output/vitest/coverage/src/components/Container/index.html +0 -131
  284. package/test-output/vitest/coverage/src/components/DataGrid/DataGrid.tsx.html +0 -3937
  285. package/test-output/vitest/coverage/src/components/DataGrid/dataGrid.variants.ts.html +0 -541
  286. package/test-output/vitest/coverage/src/components/DataGrid/filters/ColumnFilters.tsx.html +0 -1453
  287. package/test-output/vitest/coverage/src/components/DataGrid/filters/index.html +0 -116
  288. package/test-output/vitest/coverage/src/components/DataGrid/index.html +0 -131
  289. package/test-output/vitest/coverage/src/components/DataGrid/reorder/index.html +0 -116
  290. package/test-output/vitest/coverage/src/components/DataGrid/reorder/useColumnReorder.ts.html +0 -517
  291. package/test-output/vitest/coverage/src/components/DataGrid/resize/index.html +0 -116
  292. package/test-output/vitest/coverage/src/components/DataGrid/resize/useColumnResize.ts.html +0 -490
  293. package/test-output/vitest/coverage/src/components/DataGrid/visibility/ColumnVisibilityMenu.tsx.html +0 -592
  294. package/test-output/vitest/coverage/src/components/DataGrid/visibility/index.html +0 -116
  295. package/test-output/vitest/coverage/src/components/DateTimePicker/DateTimePicker.tsx.html +0 -1042
  296. package/test-output/vitest/coverage/src/components/DateTimePicker/dateTimePicker.variants.ts.html +0 -337
  297. package/test-output/vitest/coverage/src/components/DateTimePicker/index.html +0 -131
  298. package/test-output/vitest/coverage/src/components/Dialog/Dialog.tsx.html +0 -391
  299. package/test-output/vitest/coverage/src/components/Dialog/dialog.variants.ts.html +0 -283
  300. package/test-output/vitest/coverage/src/components/Dialog/index.html +0 -131
  301. package/test-output/vitest/coverage/src/components/Divider/Divider.tsx.html +0 -505
  302. package/test-output/vitest/coverage/src/components/Divider/divider.variants.ts.html +0 -433
  303. package/test-output/vitest/coverage/src/components/Divider/index.html +0 -131
  304. package/test-output/vitest/coverage/src/components/Grid/Grid.tsx.html +0 -529
  305. package/test-output/vitest/coverage/src/components/Grid/grid.variants.ts.html +0 -484
  306. package/test-output/vitest/coverage/src/components/Grid/index.html +0 -131
  307. package/test-output/vitest/coverage/src/components/LeftNav/LeftNav.tsx.html +0 -1075
  308. package/test-output/vitest/coverage/src/components/LeftNav/index.html +0 -131
  309. package/test-output/vitest/coverage/src/components/LeftNav/leftNav.variants.ts.html +0 -406
  310. package/test-output/vitest/coverage/src/components/NumberField/NumberField.tsx.html +0 -1048
  311. package/test-output/vitest/coverage/src/components/NumberField/index.html +0 -131
  312. package/test-output/vitest/coverage/src/components/NumberField/numberField.variants.ts.html +0 -367
  313. package/test-output/vitest/coverage/src/components/OTPField/OTPField.tsx.html +0 -835
  314. package/test-output/vitest/coverage/src/components/OTPField/index.html +0 -131
  315. package/test-output/vitest/coverage/src/components/OTPField/otpField.variants.ts.html +0 -301
  316. package/test-output/vitest/coverage/src/components/Pagination/Pagination.tsx.html +0 -916
  317. package/test-output/vitest/coverage/src/components/Pagination/index.html +0 -146
  318. package/test-output/vitest/coverage/src/components/Pagination/pagination.helpers.ts.html +0 -391
  319. package/test-output/vitest/coverage/src/components/Pagination/pagination.variants.ts.html +0 -436
  320. package/test-output/vitest/coverage/src/components/Popover/Popover.tsx.html +0 -250
  321. package/test-output/vitest/coverage/src/components/Popover/index.html +0 -131
  322. package/test-output/vitest/coverage/src/components/Popover/popover.variants.ts.html +0 -157
  323. package/test-output/vitest/coverage/src/components/RadioGroup/RadioGroup.tsx.html +0 -934
  324. package/test-output/vitest/coverage/src/components/RadioGroup/index.html +0 -131
  325. package/test-output/vitest/coverage/src/components/RadioGroup/radioGroup.variants.ts.html +0 -346
  326. package/test-output/vitest/coverage/src/components/Skeleton/Skeleton.tsx.html +0 -232
  327. package/test-output/vitest/coverage/src/components/Skeleton/index.html +0 -131
  328. package/test-output/vitest/coverage/src/components/Skeleton/skeleton.variants.ts.html +0 -346
  329. package/test-output/vitest/coverage/src/components/Snackbar/Snackbar.tsx.html +0 -979
  330. package/test-output/vitest/coverage/src/components/Snackbar/index.html +0 -131
  331. package/test-output/vitest/coverage/src/components/Snackbar/snackbar.variants.ts.html +0 -307
  332. package/test-output/vitest/coverage/src/components/Stack/Stack.tsx.html +0 -430
  333. package/test-output/vitest/coverage/src/components/Stack/index.html +0 -131
  334. package/test-output/vitest/coverage/src/components/Stack/stack.variants.ts.html +0 -325
  335. package/test-output/vitest/coverage/src/components/Switch/Switch.tsx.html +0 -559
  336. package/test-output/vitest/coverage/src/components/Switch/index.html +0 -131
  337. package/test-output/vitest/coverage/src/components/Switch/switch.variants.ts.html +0 -295
  338. package/test-output/vitest/coverage/src/components/Table/Table.tsx.html +0 -2677
  339. package/test-output/vitest/coverage/src/components/Table/cells/RenderButton.tsx.html +0 -154
  340. package/test-output/vitest/coverage/src/components/Table/cells/RenderChip.tsx.html +0 -385
  341. package/test-output/vitest/coverage/src/components/Table/cells/RenderText.tsx.html +0 -196
  342. package/test-output/vitest/coverage/src/components/Table/cells/RenderTwoLine.tsx.html +0 -187
  343. package/test-output/vitest/coverage/src/components/Table/cells/RowActionsMenu.tsx.html +0 -526
  344. package/test-output/vitest/coverage/src/components/Table/cells/index.html +0 -191
  345. package/test-output/vitest/coverage/src/components/Table/cells/index.ts.html +0 -127
  346. package/test-output/vitest/coverage/src/components/Table/index.html +0 -131
  347. package/test-output/vitest/coverage/src/components/Table/table.variants.ts.html +0 -706
  348. package/test-output/vitest/coverage/src/components/Tabs/Tabs.tsx.html +0 -283
  349. package/test-output/vitest/coverage/src/components/Tabs/index.html +0 -131
  350. package/test-output/vitest/coverage/src/components/Tabs/tabs.variants.ts.html +0 -292
  351. package/test-output/vitest/coverage/src/components/TextField/TextField.tsx.html +0 -820
  352. package/test-output/vitest/coverage/src/components/TextField/index.html +0 -131
  353. package/test-output/vitest/coverage/src/components/TextField/textField.variants.ts.html +0 -400
  354. package/test-output/vitest/coverage/src/components/Textarea/Textarea.tsx.html +0 -655
  355. package/test-output/vitest/coverage/src/components/Textarea/index.html +0 -131
  356. package/test-output/vitest/coverage/src/components/Textarea/textarea.variants.ts.html +0 -340
  357. package/test-output/vitest/coverage/src/components/Tooltip/Tooltip.tsx.html +0 -295
  358. package/test-output/vitest/coverage/src/components/Tooltip/index.html +0 -131
  359. package/test-output/vitest/coverage/src/components/Tooltip/tooltip.variants.ts.html +0 -169
  360. package/test-output/vitest/coverage/src/components/TopBar/TopBar.tsx.html +0 -283
  361. package/test-output/vitest/coverage/src/components/TopBar/index.html +0 -131
  362. package/test-output/vitest/coverage/src/components/TopBar/topBar.variants.ts.html +0 -199
  363. package/test-output/vitest/coverage/src/components/Typography/Typography.tsx.html +0 -421
  364. package/test-output/vitest/coverage/src/components/Typography/index.html +0 -131
  365. package/test-output/vitest/coverage/src/components/Typography/typography.variants.ts.html +0 -436
  366. package/test-output/vitest/coverage/src/components/VisuallyHidden/VisuallyHidden.tsx.html +0 -262
  367. package/test-output/vitest/coverage/src/components/VisuallyHidden/index.html +0 -116
  368. package/test-output/vitest/coverage/src/components/_shared/data/getNestedValue.ts.html +0 -181
  369. package/test-output/vitest/coverage/src/components/_shared/data/index.html +0 -236
  370. package/test-output/vitest/coverage/src/components/_shared/data/useColumnAutoDetect.ts.html +0 -385
  371. package/test-output/vitest/coverage/src/components/_shared/data/useControllableState.ts.html +0 -229
  372. package/test-output/vitest/coverage/src/components/_shared/data/useDebouncedValue.ts.html +0 -157
  373. package/test-output/vitest/coverage/src/components/_shared/data/useTableFilter.ts.html +0 -439
  374. package/test-output/vitest/coverage/src/components/_shared/data/useTableSearch.ts.html +0 -283
  375. package/test-output/vitest/coverage/src/components/_shared/data/useTableSelection.ts.html +0 -385
  376. package/test-output/vitest/coverage/src/components/_shared/data/useTableSort.ts.html +0 -508
  377. package/test-output/vitest/coverage/src/components/_shared/data/useVirtualizer.ts.html +0 -682
  378. package/test-output/vitest/coverage/src/components/_shared/index.html +0 -116
  379. package/test-output/vitest/coverage/src/components/_shared/resolveValidationState.ts.html +0 -265
  380. package/test-output/vitest/coverage/src/hooks/index.html +0 -116
  381. package/test-output/vitest/coverage/src/hooks/useAccessState.ts.html +0 -328
  382. package/test-output/vitest/coverage/src/index.html +0 -116
  383. package/test-output/vitest/coverage/src/index.ts.html +0 -1153
  384. package/test-output/vitest/coverage/src/utils/cn.ts.html +0 -172
  385. package/test-output/vitest/coverage/src/utils/index.html +0 -116
  386. package/tsconfig.json +0 -13
  387. package/tsconfig.lib.json +0 -58
  388. package/tsconfig.spec.json +0 -34
  389. package/vite.config.ts +0 -33
  390. package/vitest.config.mts +0 -29
package/PARITY.md DELETED
@@ -1,481 +0,0 @@
1
- # `@dashforge/tw` ↔ `@dashforge/ui` parity audit
2
-
3
- > Per-component diff between the two Dashforge UI lines for the
4
- > **10 bridge-integrated components**.
5
- >
6
- > **Motivation.** This audit ensures:
7
- >
8
- > 1. **Internal consistency** — a refactor on `@dashforge/ui` that
9
- > doesn't land on `@dashforge/tw` would otherwise be invisible.
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
13
- > (one MUI, one TW) require call-site-level parity to stay
14
- > in sync.
15
-
16
- ## Versions audited
17
-
18
- | Lib | Version | Date |
19
- |---|---|---|
20
- | `@dashforge/tw` | `0.3.0-beta` | 2026-05-18 |
21
- | `@dashforge/ui` | `0.2.3-beta` | 2026-05-15 |
22
-
23
- ## Scoring legend
24
-
25
- | Symbol | Meaning |
26
- |---|---|
27
- | ✓ | Parity verified — the two lines accept the same prop / behave the same way at the call-site level. |
28
- | ⚠ | Intentional delta — different prop or slightly different behavior, motivated and documented in the per-component section below. |
29
- | ✗ | Unintended drift — bug or oversight, files a follow-up issue. |
30
-
31
- ## Bridge contract — universal across all 10 components
32
-
33
- Both libs share an identical bridge contract. The following props
34
- behave **byte-identical** in both lines (verified by reading the
35
- types files of all 10 components):
36
-
37
- | Prop | Type | Semantics |
38
- |---|---|---|
39
- | `name` | `string` (required) | Field name registered with the `DashFormProvider` bridge. |
40
- | `rules` | `unknown` | Validation rules forwarded to the bridge engine — opaque to the component. |
41
- | `visibleWhen` | `(engine: Engine) => boolean` | Engine predicate. Component returns `null` when false. |
42
- | `access` | `AccessRequirement` | RBAC requirement. Behaviors (`hide` / `disable` / `readonly`) identical in both libs. |
43
- | `helperText` | `ReactNode` | Helper text slot below the control. Auto-replaced with bridge error message when (a) error is true and (b) the Form Closure v1 gate passes (`touched \|\| submitCount > 0`). |
44
- | `error` | `boolean` | Explicit error semaphore override. Cuts ahead of the bridge's auto-error. |
45
- | `label` | `ReactNode` | Visible label. |
46
-
47
- The bridge integration semantics (Form Closure v1 error gating, prop
48
- precedence, granular per-field subscriptions, StrictMode-safe
49
- unregister on unmount) are implemented identically across both lines
50
- via the shared `@dashforge/ui-core` + `@dashforge/forms` packages.
51
-
52
- This is the **portability layer**: any consumer who swaps
53
- `@dashforge/ui` for `@dashforge/tw` (or vice versa) keeps their
54
- form schemas, validation rules, and RBAC declarations unchanged.
55
-
56
- ## Per-component parity table
57
-
58
- | # | Component | Signature | Behavior | Variant axis | Bridge | Overall |
59
- |---|---|---|---|---|---|---|
60
- | 1 | Button | ✓ | ✓ | ⚠ | ✓ | ⚠ |
61
- | 2 | TextField | ✓ | ✓ | ⚠ | ✓ | ⚠ |
62
- | 3 | Checkbox | ⚠ | ✓ | ✓ | ✓ | ⚠ |
63
- | 4 | Switch | ⚠ | ✓ | ✓ | ✓ | ⚠ |
64
- | 5 | RadioGroup | ⚠ | ✓ | ⚠ | ✓ | ⚠ |
65
- | 6 | Textarea | ⚠ | ✓ | ⚠ | ✓ | ⚠ |
66
- | 7 | NumberField | ✓ | ✓ | ⚠ | ✓ | ⚠ |
67
- | 8 | OTPField | ✓ | ✓ | ⚠ | ✓ | ⚠ |
68
- | 9 | Autocomplete | ⚠ | ⚠ | ⚠ | ✓ | ⚠ |
69
- | 10 | DateTimePicker | ✓ | ✓ | ✓ | ✓ | ✓ |
70
-
71
- **No `✗` rows** — no unintended drift was discovered. All deltas
72
- are intentional and motivated below. The single `✓` overall
73
- (DateTimePicker) is the only component where the two lines are
74
- truly byte-identical at the prop level.
75
-
76
- ---
77
-
78
- ## 1. Button
79
-
80
- ### Signature
81
-
82
- | Prop | `@dashforge/ui` (MUI) | `@dashforge/tw` |
83
- |---|---|---|
84
- | Inherits | `Omit<MuiButtonProps, 'disabled'>` | `Omit<ButtonHTMLAttributes, 'className' \| 'color'>` + `Pick<TVariants, 'variant' \| 'color' \| 'size' \| 'fullWidth' \| 'loading'>` |
85
- | `access` | ✓ | ✓ |
86
- | `disabled` | ✓ | ✓ |
87
- | `asChild` | ✗ | ✓ (Radix Slot polymorphism) |
88
- | `sx` | ✗ (MUI sx-object inherited via MuiButtonProps) | ✓ (utility-string) |
89
- | `loading` | ✗ (consumer adds it manually) | ✓ (built-in variant axis) |
90
-
91
- ### Variant axis ⚠
92
-
93
- | Axis | MUI | TW |
94
- |---|---|---|
95
- | `variant` | `contained` \| `outlined` \| `text` | `solid` \| `outline` \| `soft` \| `ghost` |
96
- | `size` | `small` \| `medium` \| `large` | `sm` \| `md` \| `lg` |
97
- | `color` | `primary` \| `secondary` \| `error` \| `info` \| `success` \| `warning` | same 6 intents |
98
- | `fullWidth` | ✓ | ✓ |
99
-
100
- **Intentional delta.** TW renames `contained → solid`, adds `soft`
101
- + `ghost` variants, renames sizes to short forms. The MUI naming is
102
- a vestige of Material Design vocabulary; TW adopts the
103
- shadcn/Radix/Mantine common-denominator naming because that's what
104
- TW-native developers expect.
105
-
106
- ### Notes
107
-
108
- - `loading` is a built-in TW variant (renders spinner + sets
109
- `aria-busy`). On MUI side it's a consumer-level pattern.
110
- - TW's `asChild` (Radix Slot) is more powerful than MUI's
111
- `component`/`href` polymorphism — single API, no DOM doubling.
112
-
113
- ---
114
-
115
- ## 2. TextField
116
-
117
- ### Signature
118
-
119
- | Prop | MUI | TW |
120
- |---|---|---|
121
- | Inherits | `Omit<MuiTextFieldProps, 'name' \| 'SelectProps' \| 'InputProps' \| 'InputLabelProps' \| 'FormHelperTextProps' \| 'inputProps'>` | `Omit<InputHTMLAttributes, 'size' \| 'className'>` + `Pick<TVariants, 'size' \| 'layout' \| 'fullWidth'>` |
122
- | `layout` | ✓ (`floating` \| `stacked` \| `inline`) | ✓ (same enum) |
123
- | `required` | ✓ (renders asterisk) | ✓ (same) |
124
- | `slotProps.prefix/suffix` | ✗ (use `slotProps.input.startAdornment` / `endAdornment` — MUI v9 API) | ✓ (new in `0.3.0-beta` — inline adornments) |
125
- | `sx` | MUI sx-object | TW utility-string |
126
-
127
- ### Variant axis ⚠
128
-
129
- | Axis | MUI | TW |
130
- |---|---|---|
131
- | `variant` | `outlined` \| `filled` \| `standard` | not exposed (defaults to `outlined`-equivalent) |
132
- | `size` | `small` \| `medium` | `sm` \| `md` \| `lg` |
133
- | `layout` | `floating` \| `stacked` \| `inline` | same |
134
-
135
- **Intentional delta.** TW intentionally drops MUI's
136
- `variant="standard"` (underline-only field) — it's a Material Design
137
- artifact that doesn't fit a typical Tailwind design system. TW also
138
- drops MUI's `variant="filled"` for now (no design system demand).
139
-
140
- ### Notes
141
-
142
- - TW exposes `slotProps.prefix` / `slotProps.suffix` (added in
143
- `0.3.0-beta`) for inline adornments. MUI achieves the same via
144
- `slotProps.input.startAdornment` / `endAdornment` — different shape,
145
- same outcome.
146
- - MUI's deprecated `inputProps` / `InputProps` / `InputLabelProps` /
147
- `FormHelperTextProps` are explicitly Omit-ed from TW (cleanly,
148
- since TW never inherited them in the first place).
149
-
150
- ---
151
-
152
- ## 3. Checkbox
153
-
154
- ### Signature ⚠
155
-
156
- | Prop | MUI | TW |
157
- |---|---|---|
158
- | Inherits | `Omit<MuiCheckboxProps, 'name'>` (inherits MUI's `onChange: (event, checked) => void`) | `Pick<TVariants, 'size'>` (no HTML attrs inherited) |
159
- | `onChange` | ✓ MUI HTML signature: `(event, checked) => void` | ✗ (not exposed) |
160
- | `onCheckedChange` | ✗ | ✓ Radix signature: `(checked: boolean) => void` |
161
- | `checked` / `defaultChecked` | ✓ | ✓ |
162
- | `slotProps.indicator` | ✗ | ✓ |
163
-
164
- **Intentional delta.** Callback signature differs: MUI uses the HTML
165
- `onChange(event, checked)`, TW uses Radix's `onCheckedChange(checked)`.
166
- A consumer rewriting `<Checkbox onChange={…}>` → `<Checkbox onCheckedChange={…}>`
167
- is the only call-site change. Documented in `customization.mdx`
168
- (Sprint 3 P2).
169
-
170
- ### Variant axis ✓
171
-
172
- Both libs expose `size` only (`small`/`medium`/`large` MUI ↔
173
- `sm`/`md`/`lg` TW — same naming convention as Button).
174
-
175
- ### Notes
176
-
177
- - TW's Indicator renders BOTH `<CheckIcon />` and `<DashIcon />` and
178
- toggles via Radix `data-state` (added in `0.3.0-beta`).
179
- Indeterminate state is handled CSS-only.
180
- - Bridge contract identical: `useDashFieldMeta(name)` granular
181
- subscription, Form Closure v1 gating.
182
-
183
- ---
184
-
185
- ## 4. Switch
186
-
187
- ### Signature ⚠
188
-
189
- Same delta as Checkbox: TW exposes `onCheckedChange(checked)` (Radix),
190
- MUI exposes `onChange(event, checked)` (HTML). All other props
191
- identical (name, label, rules, visibleWhen, helperText, error, access,
192
- checked, defaultChecked, disabled).
193
-
194
- ### Variant axis ✓
195
-
196
- Both libs: `size` only.
197
-
198
- ### Notes
199
-
200
- - TW gates the thumb-slide animation on `prefers-reduced-motion`
201
- (added Sprint 2 0.3.0-beta).
202
-
203
- ---
204
-
205
- ## 5. RadioGroup
206
-
207
- ### Signature ⚠
208
-
209
- | Prop | MUI | TW |
210
- |---|---|---|
211
- | Inherits | `Omit<MuiRadioGroupProps, 'name'>` | `RadioGroupVariants` (Pick-style) |
212
- | `onChange` | ✓ MUI signature | ✗ |
213
- | `onValueChange` | ✗ | ✓ Radix signature: `(value: string) => void` |
214
- | `options` | ✓ (`RadioGroupOption[]` — identical shape) | ✓ |
215
- | `RadioGroupOption.access` | ✓ option-level RBAC | ✓ option-level RBAC |
216
-
217
- ### Variant axis ⚠
218
-
219
- | Axis | MUI | TW |
220
- |---|---|---|
221
- | `orientation` | inherited from MUI's `row` boolean | dedicated `orientation: 'horizontal' \| 'vertical'` |
222
- | `size` | inherited (`small`/`medium`) | `sm` \| `md` \| `lg` |
223
-
224
- **Intentional delta.** TW exposes `orientation` as a typed variant
225
- axis (vs MUI's legacy `row={true}` boolean). MUI's `row` prop is a
226
- Material legacy; TW's `orientation` is the Radix/Aria standard.
227
-
228
- ### Notes
229
-
230
- - Option-level RBAC is implemented identically in both libs
231
- (`hide` keeps selected option visible-but-disabled to expose the
232
- user's previous choice).
233
- - Group-level access has precedence over option-level access in
234
- both libs.
235
-
236
- ---
237
-
238
- ## 6. Textarea
239
-
240
- ### Signature ⚠
241
-
242
- | Prop | MUI | TW |
243
- |---|---|---|
244
- | Inherits | `Omit<MuiTextFieldProps, 'name'>` (with internal `multiline={true}` hard-coded) | `Omit<TextareaHTMLAttributes, 'name' \| 'size' \| 'onChange' \| 'onBlur' \| 'value' \| 'defaultValue'>` + `TextareaVariants` |
245
- | `rows` / `minRows` | ✓ (defaults `minRows={3}`) | ✓ (`rows` defaults to 3) |
246
- | `resize` | ✗ (CSS native, no prop) | ✓ variant axis (`none` \| `vertical` \| `horizontal` \| `both`) |
247
-
248
- ### Variant axis ⚠
249
-
250
- TW adds the `resize` variant axis as a typed prop. MUI relies on the
251
- consumer adding inline `style={{ resize: 'vertical' }}` or CSS.
252
-
253
- ### Notes
254
-
255
- - Form bridge contract identical.
256
- - TW exposes own `onChange` / `onBlur` typed for `HTMLTextAreaElement`;
257
- MUI inherits from MUI's `TextFieldProps` typing for the
258
- multiline-disguised-as-input case.
259
-
260
- ---
261
-
262
- ## 7. NumberField
263
-
264
- ### Signature
265
-
266
- | Prop | MUI | TW |
267
- |---|---|---|
268
- | Inherits | `Omit<MuiTextFieldProps, 'name' \| 'type' \| 'value' \| 'onChange'>` | `Omit<InputHTMLAttributes, 'name' \| 'type' \| 'size' \| ...>` + `NumberFieldVariants` |
269
- | `value` | `number \| string \| null` | `number \| string \| null` (identical) |
270
- | `min` / `max` / `step` | inherited HTML attrs | typed at top level |
271
- | `showStepper` | ✗ | ✓ (TW-only: inline +/− buttons) |
272
- | `slotProps.stepper` / `slotProps.stepperButton` | ✗ | ✓ |
273
-
274
- ### Variant axis ⚠
275
-
276
- TW exposes the stepper as a typed feature (`showStepper={true}`).
277
- MUI's NumberField is a plain `type="number"` input with no stepper UI.
278
-
279
- ### Behavior ✓
280
-
281
- **Value contract is byte-identical** between the two lines:
282
-
283
- - Bridge storage type: `number \| null` (NEVER `NaN`)
284
- - UI display: `number → String(number)`, `null/undefined → ""`
285
- - Empty string → `setValue(name, null)`
286
- - Parseable number → `setValue(name, parsed)`
287
- - Non-numeric input → no bridge write (UI keeps string for UX,
288
- bridge stays at last valid value)
289
- - Parsing uses `Number(...)` + `Number.isFinite(...)`. No locale parsing.
290
-
291
- This contract is explicitly documented in both lines' types files —
292
- the audit confirms they match word-for-word.
293
-
294
- ---
295
-
296
- ## 8. OTPField
297
-
298
- ### Signature
299
-
300
- | Prop | MUI | TW |
301
- |---|---|---|
302
- | `length` | ✓ (default 6) | ✓ (default 6) |
303
- | `mode` | `numeric` \| `alphanumeric` \| `alpha` | `numeric` \| `alphanumeric` |
304
- | `onComplete` | ✓ | ✓ |
305
- | `onChange` | `(value: string) => void` | `(value: string) => void` (identical) |
306
- | `autoFocus` | ✓ (default `true`) | not in types (defaults via native `<input autoFocus>`) |
307
-
308
- ### Variant axis ⚠
309
-
310
- | Axis | MUI | TW |
311
- |---|---|---|
312
- | Slot rendering | custom React per-slot | custom React per-slot + Tailwind variant (`size`, `tone`) |
313
-
314
- **Intentional delta.** TW drops MUI's `alpha`-only mode (no design
315
- system demand; consumers needing pure-alpha can use `alphanumeric`
316
- + client-side filter). TW also exposes per-slot styling via typed
317
- `slotProps.slot` / `slotProps.slotChar`.
318
-
319
- ### Behavior ✓
320
-
321
- Both libs:
322
- - Sanitize input per `mode` on every keystroke
323
- - Sanitize paste content and fill slots sequentially
324
- - Emit `onChange` with the joined sanitized value (≤ `length`)
325
- - Fire `onComplete` when all slots filled
326
-
327
- ---
328
-
329
- ## 9. Autocomplete
330
-
331
- ### Signature ⚠
332
-
333
- | Prop | MUI | TW |
334
- |---|---|---|
335
- | `multiple` (multi-select) | ✗ (MUI v9 inherits but Dashforge wrapper doesn't expose) | ✓ |
336
- | `freeSolo` | ✗ (MUI inherits but wrapper hides it) | ✓ |
337
- | `loadOptions` (async loader) | ✗ | ✓ |
338
- | `loadDebounceMs` | ✗ | ✓ (default 250ms) |
339
- | `optionsFromFieldData` | ✓ (MUI-only feature for runtime options from form runtime) | ✗ (TW doesn't have a runtime-data integration yet — F6+ work) |
340
- | `getOptionValue` / `getOptionLabel` / `getOptionDisabled` | ✓ | ✓ |
341
- | `getOptionKey` | ✗ | ✓ |
342
- | `onChange` | `(value: TValue \| null) => void` | `onValueChange: (AutocompleteValue) => void` (AutocompleteValue = `string \| string[] \| null`) |
343
-
344
- ### Variant axis ⚠
345
-
346
- | Axis | MUI | TW |
347
- |---|---|---|
348
- | Mode | single-select only | single + multi + free-solo |
349
- | Async | not in wrapper (use MUI's directly if needed) | first-class `loadOptions` prop |
350
-
351
- **Intentional delta — TW is feature-ahead.** TW's Autocomplete is
352
- the most-extended bridge component:
353
-
354
- - **Multi-select** (chips inside input, backspace to remove last)
355
- - **Free-solo** (Enter commits typed text as value)
356
- - **Async loadOptions** (debounced, replaces static `options` while
357
- the user types)
358
-
359
- MUI's Dashforge wrapper trails behind because: (a) MUI's underlying
360
- Autocomplete already supports these via inherited props, so wrapping
361
- them feels redundant; (b) the MUI consumer can drop down to
362
- `MuiAutocomplete` directly when they need these features. TW had to
363
- implement them from scratch (built on React Aria's `useComboBox`),
364
- so it was natural to expose them as first-class props.
365
-
366
- **Reverse delta — MUI is ahead on**: `optionsFromFieldData` (runtime
367
- field data integration for dynamic option lists fed by the form
368
- engine). This is a F6+ feature on the TW roadmap.
369
-
370
- ### Behavior ⚠
371
-
372
- The core bridge contract is parity:
373
-
374
- - Storage policy: option pick → mapped `option.value`; clear → `null`
375
- - Form Closure v1 error gating
376
- - StrictMode-safe unregister on unmount
377
-
378
- But the **storage type** differs:
379
- - MUI: `TValue \| null` where TValue is `string | number`
380
- - TW: `string \| string[] \| null` (`string[]` for multi-select)
381
-
382
- This is a real call-site delta. A consumer migrating MUI → TW with
383
- a NumberField-style numeric `TValue` would need to switch to string
384
- storage + cast on submission.
385
-
386
- ---
387
-
388
- ## 10. DateTimePicker
389
-
390
- ### Signature ✓
391
-
392
- All props parity:
393
-
394
- - `mode: 'date' \| 'time' \| 'datetime'` — identical
395
- - `value: string \| null` — identical (ISO 8601-ish naive string)
396
- - `min` / `max` / `step` — identical
397
- - `name` / `rules` / `visibleWhen` / `access` — identical (bridge)
398
- - `label` / `helperText` / `error` / `required` / `disabled` — identical
399
-
400
- ### Variant axis ✓
401
-
402
- Layout: both libs allow `stacked` / `inline` and downgrade `floating`
403
- to `stacked` with a dev warning (rationale: native input always
404
- shows a placeholder mask that overlaps the floating label).
405
-
406
- ### Behavior ✓
407
-
408
- Both libs:
409
- - Use native `<input type="date|time|datetime-local">`
410
- - Bridge contract identical
411
- - ISO string contract identical (`datetime-local` is naive — no TZ;
412
- if you need TZ-aware persistence, both libs say to convert
413
- upstream)
414
-
415
- **This is the cleanest parity case in the audit** — the only ✓✓✓
416
- across all four columns. Likely because both lines deliberately
417
- chose native HTML5 inputs over a custom calendar widget, leaving
418
- very little surface to diverge on.
419
-
420
- ### Notes
421
-
422
- - MUI exposes `@deprecated inputProps` / `InputLabelProps` shims for
423
- MUI v7 backward compatibility. TW never had these (no MUI lineage).
424
-
425
- ---
426
-
427
- ## Summary of intentional deltas
428
-
429
- 1. **Callback signatures**: TW prefers Radix-style `onCheckedChange` /
430
- `onValueChange` (single-arg). MUI inherits HTML `onChange(event, value)`.
431
- → **Documented in `customization.mdx` decision tree.**
432
- 2. **Variant taxonomy**: TW uses shadcn/Radix common-denominator
433
- vocabulary (`solid`/`outline`/`soft`/`ghost`, `sm`/`md`/`lg`).
434
- MUI uses Material Design vocabulary (`contained`/`outlined`/`text`,
435
- `small`/`medium`/`large`). 1:1 mappable.
436
- 3. **`sx` shape**: TW = utility string, MUI = sx-object. Same name,
437
- different semantics — by design (see `customization.mdx` §1).
438
- 4. **TW-only props**: `slotProps`, `asChild` (Button), `loading`
439
- (Button), `slotProps.prefix/suffix` (TextField), `showStepper`
440
- (NumberField), `multiple` / `freeSolo` / `loadOptions`
441
- (Autocomplete), `resize` variant (Textarea).
442
- 5. **MUI-only props**: `optionsFromFieldData` (Autocomplete runtime
443
- data integration).
444
-
445
- ## Components NOT covered by this audit
446
-
447
- The MUI line has these additional components that have no TW
448
- counterpart yet (NOT in scope for this audit — they're not part of
449
- the bridge-integrated tier):
450
-
451
- - `Select` (MUI-only) — TW uses Autocomplete for select-like UX
452
- - `Animate` (MUI-only utility)
453
-
454
- The TW line has these additional components with no MUI counterpart
455
- (Sprint 1-2 Foundation work, not in scope here):
456
-
457
- - `Typography`, `Box`, `Stack`, `Grid`, `Container`, `Divider`,
458
- `AspectRatio`, `VisuallyHidden` (8 Foundation primitives)
459
-
460
- Tier-4 components (Dialog, Tabs, Tooltip, Popover, Accordion) ship in
461
- Sprint 3 P3 — they will be MUI-side counterparts of MUI's own
462
- `Dialog`, `Tabs`, `Tooltip`, `Popover`, `Accordion`. Future PARITY.md
463
- revisions will include them.
464
-
465
- ## Follow-up items
466
-
467
- No `✗` rows surfaced, so no critical follow-ups. The intentional
468
- deltas are documented above. The following nice-to-haves were
469
- identified but are explicitly deferred:
470
-
471
- | Item | Notes | Sprint |
472
- |---|---|---|
473
- | Optional `onChange` (HTML-style) on Checkbox / Switch / RadioGroup | For MUI-migrating consumers who want byte-identical call-sites. Could be added as an additional optional callback alongside `onCheckedChange`. | Not planned. Intentional choice; documented in customization.mdx instead. |
474
- | `optionsFromFieldData` on TW Autocomplete | Runtime field data integration. Requires F6 infrastructure (form runtime data hooks not yet ported to TW). | Sprint 6 (post-1.0 candidate). |
475
- | MUI-side `loadOptions` / `freeSolo` / `multiple` exposure | MUI consumer can use `MuiAutocomplete` directly for these. Not adding to the wrapper unless concrete demand. | Not planned. |
476
- | `variant="standard"` / `"filled"` on TW TextField | No design system demand. | Not planned. |
477
-
478
- Maintenance pact: every release that touches a bridge-integrated
479
- component on either line MUST re-run this audit. The cost is low
480
- (~30 min for a single-component diff) and the consistency value is
481
- high.