@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
@@ -1,438 +0,0 @@
1
- import type { ReactNode } from 'react';
2
- import type { AccessRequirement } from '@dashforge/rbac';
3
- import type { TableVariants } from './table.variants.js';
4
-
5
- // ───── Nested key util ─────
6
-
7
- /**
8
- * Type-level dotted path through an object's nested structure.
9
- *
10
- * `NestedKeyOf<{ user: { name: string } }>` → `'user' | 'user.name'`.
11
- *
12
- * Used as the `field` of a column to give autocomplete on nested
13
- * paths. The runtime lookup happens via `getNestedValue` in
14
- * `_internal/getNestedValue.ts` (split on `.` and walk).
15
- */
16
- export type NestedKeyOf<T extends object> = {
17
- [K in keyof T & (string | number)]: T[K] extends object | undefined
18
- ? T[K] extends ReadonlyArray<unknown>
19
- ? `${K}`
20
- : NonNullable<T[K]> extends object
21
- ? `${K}` | `${K}.${NestedKeyOf<NonNullable<T[K]>>}`
22
- : `${K}`
23
- : `${K}`;
24
- }[keyof T & (string | number)];
25
-
26
- // ───── Column types ─────
27
-
28
- /**
29
- * Auto-detected primitive type for a column. Drives smart defaults:
30
- * - `number` → align right + monospace (`tabular-nums`)
31
- * - `date` → align left + monospace (consistent ISO width)
32
- * - `boolean` → align center
33
- * - `string` → align left (default)
34
- * - `unknown` → fallback to left, no monospace
35
- */
36
- export type TableColumnInferredType =
37
- | 'number'
38
- | 'date'
39
- | 'boolean'
40
- | 'string'
41
- | 'unknown';
42
-
43
- /**
44
- * Context passed to a custom `cellRenderer`. Mirrors what the consumer
45
- * needs to render a cell: row, resolved value, position, selection
46
- * state, expand state, and the resolved RBAC access state for THIS
47
- * column.
48
- */
49
- export interface TableCellContext<T> {
50
- row: T;
51
- value: unknown;
52
- rowIndex: number;
53
- isSelected: boolean;
54
- isExpanded: boolean;
55
- /** Resolved RBAC state for this column. `null` if no `access` set. */
56
- access: { hidden: boolean; disabled: boolean; readonly: boolean } | null;
57
- }
58
-
59
- /**
60
- * One column definition for `<Table>`.
61
- *
62
- * **i18n**: pass `t('users.name')` directly to `header` — `header`
63
- * accepts `string` for the common case. Use the function form
64
- * `header: () => <span>…</span>` only when you need richer JSX.
65
- *
66
- * **Smart defaults**: when `align` / `monospace` are omitted, the
67
- * Table auto-detects the column type from the first non-null value
68
- * across the visible rows and applies `right + tabular-nums` for
69
- * numbers, `center` for booleans, etc. Explicit props always win.
70
- */
71
- export interface TableColumn<T extends object> {
72
- /**
73
- * Dotted path to the value in each row. Supports nested keys
74
- * (`'address.city.zipCode'`) thanks to `NestedKeyOf<T>` typing +
75
- * runtime `getNestedValue()`.
76
- */
77
- field: NestedKeyOf<T> | (string & {});
78
-
79
- /**
80
- * Visible header. Pass a translation string directly:
81
- * `header: t('users.name')`. Use the function form for richer
82
- * JSX (e.g. header with an icon).
83
- */
84
- header: string | (() => ReactNode);
85
-
86
- /** Pixel width (`px`). Mutually informative with `flex`. */
87
- width?: number;
88
- /** Flex grow factor (CSS `flex: <n> 1 0`). */
89
- flex?: number;
90
- /** Minimum pixel width (for resizable columns — deferred to v1-bis). */
91
- minWidth?: number;
92
-
93
- /**
94
- * Horizontal alignment. Default is auto-detected from value type
95
- * (number → right, boolean → center, otherwise left).
96
- */
97
- align?: 'left' | 'right' | 'center';
98
-
99
- /**
100
- * Opt-in to a monospace **font family** for this column. The
101
- * library never auto-applies `font-mono` — it would override the
102
- * consumer's theme `font-sans`. Set `true` explicitly only when
103
- * the design calls for a typewriter font (e.g. raw hex IDs).
104
- *
105
- * The dashforgePreset does NOT own the `fontFamily` axis; the
106
- * consumer configures the mono stack in their own
107
- * `tailwind.config.ts` (`theme.extend.fontFamily.mono`).
108
- */
109
- monospace?: boolean;
110
-
111
- /**
112
- * Apply `font-variant-numeric: tabular-nums` so every digit
113
- * occupies the same width — clean alignment for currency / metric
114
- * columns. Does NOT change the font family. Auto-applied for
115
- * `number` and `date` columns; pass `false` explicitly to opt out
116
- * or `true` to force on a string column.
117
- */
118
- tabularNums?: boolean;
119
-
120
- /**
121
- * Make the column sortable. Pass `true` for default comparator
122
- * (works for string/number/date/boolean) or a custom
123
- * `(a, b) => number`.
124
- */
125
- sortable?: boolean | ((a: T, b: T) => number);
126
-
127
- /**
128
- * Include this column in the global search filter.
129
- * @default false
130
- */
131
- searchable?: boolean;
132
-
133
- /**
134
- * Enable per-column quick filter UI in the column header.
135
- * @default false
136
- */
137
- filterable?: boolean;
138
-
139
- /**
140
- * Override the filter UI type. By default the type is auto-detected
141
- * from `useColumnAutoDetect` (number → range, date → range,
142
- * boolean → select, anything else → text contains). Force a
143
- * specific UI when the autodetect picks the wrong one — e.g. an
144
- * ID column stored as a number that should filter by text contains.
145
- */
146
- filterType?: TableFilterType;
147
-
148
- /**
149
- * Custom cell renderer. Receives the full row + the resolved
150
- * (potentially nested) value, the row index, selection state,
151
- * expansion state, and the RBAC access state.
152
- */
153
- cellRenderer?: (ctx: TableCellContext<T>) => ReactNode;
154
-
155
- /**
156
- * Per-column RBAC. `onUnauthorized: 'hide'` removes the column
157
- * entirely from header AND every row cell (a11y-correct).
158
- * `disable` / `readonly` are forwarded to `cellRenderer` via
159
- * `ctx.access` — the renderer is expected to honor them.
160
- */
161
- access?: AccessRequirement;
162
-
163
- /**
164
- * Pin this column during horizontal scroll. `'left'` (DataGrid v1)
165
- * uses CSS `position: sticky; left: 0`. `'right'` is reserved for
166
- * v1-bis (CSS edge cases around last-column borders). Table
167
- * (non-virtualized) ignores this prop today — only DataGrid honors
168
- * it (Sprint 4.2).
169
- */
170
- sticky?: 'left' | 'right';
171
-
172
- /**
173
- * Allow user to hide this column from the column-visibility dialog.
174
- * Pass `false` for structurally required columns (e.g. an ID column).
175
- * @default true
176
- */
177
- hideable?: boolean;
178
- /** Hidden on first render (the user can re-show via the dialog). */
179
- defaultHidden?: boolean;
180
-
181
- /**
182
- * Allow user to resize this column by dragging the right edge of
183
- * its header. Pass `false` to opt out per-column. The grid-level
184
- * `enableColumnResize` flag must also be on (default `true`).
185
- * @default true
186
- */
187
- resizable?: boolean;
188
- /** Maximum width (px) honored by the resize drag. */
189
- maxWidth?: number;
190
-
191
- /**
192
- * Allow user to reorder this column by dragging its header. Pass
193
- * `false` to pin its position. The grid-level `enableColumnReorder`
194
- * flag must also be on (default `true`).
195
- * @default true
196
- */
197
- reorderable?: boolean;
198
- }
199
-
200
- // ───── State models ─────
201
-
202
- export type TableSortDirection = 'asc' | 'desc';
203
-
204
- export interface TableSortItem {
205
- field: string;
206
- direction: TableSortDirection;
207
- }
208
-
209
- /**
210
- * Sort model. Single-column sort = array of length 1. Multi-column
211
- * sort = array of N (typically up to 3). The order matters: first
212
- * item is the primary sort key, subsequent items break ties.
213
- */
214
- export type TableSortModel = TableSortItem[];
215
-
216
- /**
217
- * Filter operator. The value shape depends on the operator:
218
- * - `contains` → `value: string` (text substring match)
219
- * - `equals` → `value: unknown` (exact match, used for booleans)
220
- * - `between` → `value: [min, max]` where each end can be `null`
221
- * for an open range. Used for number ranges (`value: [10, 50]`)
222
- * and date ranges (`value: ['2024-01-01', '2024-12-31']` as ISO).
223
- */
224
- export type TableFilterOperator = 'contains' | 'equals' | 'between';
225
-
226
- export interface TableFilterItem {
227
- field: string;
228
- op: TableFilterOperator;
229
- value: unknown;
230
- }
231
-
232
- export type TableFilterModel = TableFilterItem[];
233
-
234
- /**
235
- * Column-level filter type hint. Determines which filter UI to
236
- * render in the column header Popover. Auto-detected from
237
- * `useColumnAutoDetect` when omitted:
238
- *
239
- * - `number` → number range filter
240
- * - `date` → date range filter
241
- * - `boolean` → true/false/all select
242
- * - `string` (or anything else) → text contains
243
- */
244
- export type TableFilterType = 'text' | 'number' | 'boolean' | 'date';
245
-
246
- export type TableRowSelectionMode = 'none' | 'single' | 'multiple';
247
-
248
- // ───── i18n labels ─────
249
-
250
- /**
251
- * Internal default strings used by the Table for accessibility
252
- * announcements, density toggle, search placeholder, etc. Pass the
253
- * subset you need to translate; the rest fall back to English.
254
- *
255
- * For column headers, empty state, bulk actions and row action
256
- * labels — pass the translated value directly via the matching
257
- * prop (`header`, `emptyState`, `bulkActions`, `rowActions`).
258
- */
259
- export interface TableLabels {
260
- searchPlaceholder?: string;
261
- /** Shown when the dataset itself is empty (0 input rows). */
262
- noData?: string;
263
- /**
264
- * Shown when the dataset has rows but an active search / filter
265
- * excluded them all. Distinct from `noData` so the user can tell
266
- * "nothing here" from "nothing matches your query".
267
- */
268
- noResults?: string;
269
- loading?: string;
270
- ariaSortNone?: string;
271
- ariaSortAscending?: string;
272
- ariaSortDescending?: string;
273
- ariaSelectRow?: string;
274
- ariaSelectAllRows?: string;
275
- ariaExpandRow?: string;
276
- ariaCollapseRow?: string;
277
- /** "X selected" — `{count}` placeholder gets replaced. */
278
- selectedCount?: string;
279
- clearSelection?: string;
280
- /** Per-column filter Popover. */
281
- filterColumn?: string;
282
- filterApply?: string;
283
- filterClear?: string;
284
- /** Number / date range filter inputs. */
285
- filterMin?: string;
286
- filterMax?: string;
287
- filterFrom?: string;
288
- filterTo?: string;
289
- /** Boolean filter radio options. */
290
- filterAll?: string;
291
- filterTrue?: string;
292
- filterFalse?: string;
293
- /** Density toggle. */
294
- density?: string;
295
- densityCompact?: string;
296
- densityComfortable?: string;
297
- densitySpacious?: string;
298
- /** Column visibility menu (Popover-based, auto-commit). */
299
- columnsButton?: string;
300
- columnsTitle?: string;
301
- /** Aria-label for the tri-state show/hide-all master checkbox. */
302
- columnsToggleAll?: string;
303
- }
304
-
305
- // ───── Slot props ─────
306
-
307
- export interface TableSlotProps {
308
- root?: { className?: string };
309
- toolbar?: { className?: string };
310
- search?: { className?: string };
311
- scroll?: { className?: string };
312
- table?: { className?: string };
313
- thead?: { className?: string };
314
- tbody?: { className?: string };
315
- headerRow?: { className?: string };
316
- headerCell?: { className?: string };
317
- row?: { className?: string };
318
- cell?: { className?: string };
319
- emptyState?: { className?: string };
320
- loadingOverlay?: { className?: string };
321
- selectionCell?: { className?: string };
322
- expandToggleCell?: { className?: string };
323
- expandedRow?: { className?: string };
324
- rowActionsCell?: { className?: string };
325
- bulkActionFooter?: { className?: string };
326
- }
327
-
328
- // ───── Expandable rows config ─────
329
-
330
- export interface TableExpandableConfig<T> {
331
- render: (row: T) => ReactNode;
332
- expandedRowIds?: string[];
333
- onExpandChange?: (ids: string[]) => void;
334
- }
335
-
336
- // ───── Main props ─────
337
-
338
- /**
339
- * Props for `<Table>`.
340
- *
341
- * Hybrid declarative-first architecture: by default every state piece
342
- * (sort, filter, search, selection, expansion) is internal. Pass the
343
- * matching controlled prop + change handler to lift state up.
344
- *
345
- * Smart defaults: column types are auto-detected on first render —
346
- * number columns get right-align + tabular-nums, dates get monospace,
347
- * booleans get center-align, etc. Override via explicit `align` /
348
- * `monospace` per column.
349
- *
350
- * Visual style: Stripe-inspired clean lines by default
351
- * (`variant="lines"`), row actions revealed on hover, sticky header,
352
- * `comfortable` density. Switch via variant / density / size props.
353
- *
354
- * i18n: column `header` accepts plain strings (use `t('...')`
355
- * directly). All internal label strings configurable via `labels`
356
- * prop with English defaults.
357
- */
358
- export interface TableProps<T extends object>
359
- extends Pick<TableVariants, 'variant' | 'size' | 'density'> {
360
- // ───── Data ─────
361
- rows: T[];
362
- cols: TableColumn<T>[];
363
- /**
364
- * Stable row-id resolver — the React key + the identity used by
365
- * selection and row-expansion state.
366
- *
367
- * **Strongly recommended whenever sort / search / selection /
368
- * expandable rows are used.** The default falls back to the
369
- * positional index (`String(index)`); once rows reorder (sort) or
370
- * change presence (search / filter), index `2` points at a
371
- * *different* row, so selection and expansion state silently jump
372
- * to the wrong rows. Pass a value derived from the data itself:
373
- *
374
- * ```tsx
375
- * <Table getRowId={(row) => row.id} … />
376
- * ```
377
- *
378
- * Dashforge emits a `console.warn` in development when `getRowId`
379
- * is omitted and one of those features is active. (`<DataGrid>`
380
- * makes this prop required for the same reason.)
381
- */
382
- getRowId?: (row: T, index: number) => string;
383
-
384
- // ───── Sort ─────
385
- sortModel?: TableSortModel;
386
- onSortChange?: (model: TableSortModel) => void;
387
- /** Default sort applied when uncontrolled. */
388
- defaultSortModel?: TableSortModel;
389
-
390
- // ───── Search ─────
391
- enableSearch?: boolean;
392
- searchQuery?: string;
393
- onSearchQueryChange?: (q: string) => void;
394
- searchPlaceholder?: string;
395
- searchDebounceMs?: number;
396
-
397
- // ───── Per-column filter ─────
398
- filterModel?: TableFilterModel;
399
- onFilterChange?: (model: TableFilterModel) => void;
400
-
401
- // ───── Selection ─────
402
- rowSelection?: TableRowSelectionMode;
403
- selectedRowIds?: string[];
404
- onSelectionChange?: (ids: string[]) => void;
405
- /** Sticky bulk action footer (visible only when selection > 0). */
406
- bulkActions?: (selectedRows: T[]) => ReactNode;
407
-
408
- // ───── Expandable rows ─────
409
- expandable?: TableExpandableConfig<T>;
410
-
411
- // ───── Row actions (revealed on hover) ─────
412
- rowActions?: (row: T) => ReactNode;
413
-
414
- // ───── States ─────
415
- loading?: boolean;
416
- /** Number of skeleton rows shown while `loading=true`. @default 5 */
417
- loadingRowCount?: number;
418
- emptyState?: ReactNode;
419
-
420
- // ───── A11Y ─────
421
- /** Sticky header. @default true */
422
- stickyHeader?: boolean;
423
- /** Optional caption for screen readers. */
424
- caption?: ReactNode;
425
- /** Renders the caption visually too (otherwise sr-only). @default false */
426
- showCaption?: boolean;
427
-
428
- // ───── RBAC ─────
429
- /** Table-level RBAC. `hide` returns null; `disable` greys everything. */
430
- access?: AccessRequirement;
431
-
432
- // ───── i18n ─────
433
- labels?: TableLabels;
434
-
435
- // ───── Customization escape hatches ─────
436
- sx?: string;
437
- slotProps?: TableSlotProps;
438
- }
@@ -1,207 +0,0 @@
1
- import { tv, type VariantProps } from 'tailwind-variants';
2
-
3
- /**
4
- * `<Table>` variant recipe.
5
- *
6
- * Slots:
7
- * - `root` — outer wrapper
8
- * - `toolbar` — search + filter chips row above table
9
- * - `search` — search input
10
- * - `scroll` — `<div class="overflow-auto">` wrapping the table
11
- * - `table` — `<table>` element
12
- * - `thead` — `<thead>` (sticky positioning here)
13
- * - `tbody` — `<tbody>`
14
- * - `headerRow` — `<tr>` inside `<thead>`
15
- * - `headerCell` — `<th>` cell
16
- * - `headerCellButton` — `<button>` inside sortable `<th>`
17
- * - `row` — `<tr>` inside `<tbody>` (data row)
18
- * - `cell` — `<td>` data cell
19
- * - `selectionCell` — first `<td>` when selection mode active
20
- * - `expandToggleCell` — second `<td>` when expandable active
21
- * - `expandedRow` — full-width `<tr>` rendered after an expanded row
22
- * - `rowActionsCell` — last `<td>` when `rowActions` provided
23
- * - `emptyState` — placeholder when rows is empty
24
- * - `loadingOverlay` — skeleton overlay when loading
25
- * - `bulkActionFooter` — sticky footer with bulk actions
26
- *
27
- * Variant axes:
28
- * - `variant` — visual row-division style:
29
- * - `plain` — minimal separators
30
- * - `lines` — Stripe-style thin horizontal dividers (default)
31
- * - `striped` — alternating row backgrounds (zebra)
32
- * - `bordered` — full cell borders
33
- * - `card` — each row rendered as a separate surface card
34
- * - `size` — `sm` / `md` (default) / `lg`
35
- * - `density` — `compact` (40px row) / `comfortable` (default 48px) / `spacious` (56px)
36
- *
37
- * Smart-default alignment (per column) is applied by the Table
38
- * component code, NOT here — it depends on the runtime-detected
39
- * value type, which the recipe doesn't see.
40
- *
41
- * **Dashforge identity rule** (memory: `feedback_dashforge_preset_is_identity`):
42
- * This recipe uses NO `dark:` variants on the neutral palette. The
43
- * `dashforgePreset()` CSS-variable swap auto-inverts neutral tokens
44
- * (`bg-neutral-50` is light surface in light mode, dark surface in
45
- * dark mode — same class, different physical color). Adding a
46
- * `dark:` variant on neutral palette = DOUBLE inversion = breaks
47
- * dark mode. The selected-row state uses the canonical LeftNav
48
- * `itemActive` pattern (`bg-primary-100 text-primary-900 font-medium`),
49
- * which works in both modes because the primary palette has no
50
- * inversion (both `bg` and `text` resolve to the same physical
51
- * colors regardless of mode → guaranteed contrast).
52
- */
53
- export const tableVariants = tv({
54
- slots: {
55
- root: 'w-full',
56
- toolbar: 'flex flex-wrap items-center gap-3 mb-3',
57
- search: [
58
- 'inline-flex items-center gap-2',
59
- 'w-full max-w-sm rounded-md',
60
- 'border border-neutral-300',
61
- // bg-neutral-50 auto-inverts via CSS var swap (light in light mode,
62
- // dark in dark mode). Same semantic as TextField wrapper.
63
- 'bg-neutral-50',
64
- 'focus-within:ring-2 focus-within:ring-primary-500',
65
- 'transition-colors motion-reduce:transition-none',
66
- ],
67
- scroll: 'relative w-full overflow-auto rounded-md',
68
- table: 'w-full caption-bottom text-left',
69
- // thead matches the page surface (auto-inverts). When sticky the
70
- // header sits opaque against the scroll content beneath it.
71
- thead: 'bg-neutral-50',
72
- tbody: '',
73
- headerRow: '',
74
- headerCell: [
75
- // Less prominent than the body — secondary-text intent
76
- // (auto-inverts: dark grey in light mode, light grey in dark).
77
- 'text-neutral-700',
78
- 'font-semibold whitespace-nowrap select-none',
79
- 'border-b border-neutral-200',
80
- ],
81
- headerCellButton: [
82
- 'group inline-flex items-center gap-1 select-none',
83
- // hover increases prominence (auto-inverts).
84
- 'hover:text-neutral-900',
85
- 'focus:outline-none focus-visible:underline',
86
- 'transition-colors motion-reduce:transition-none',
87
- ],
88
- row: [
89
- 'group/row transition-colors motion-reduce:transition-none',
90
- // bg-neutral-100 = "elevated above surface" in both modes via
91
- // auto-inversion. Slightly visible against the table bg.
92
- 'hover:bg-neutral-100',
93
- // Canonical LeftNav `itemActive` pattern — primary palette
94
- // doesn't invert, so dark-navy text on light-blue bg in BOTH
95
- // modes. Guaranteed contrast.
96
- 'data-[selected=true]:bg-primary-100',
97
- 'data-[selected=true]:text-primary-900',
98
- 'data-[selected=true]:font-medium',
99
- ],
100
- cell: [
101
- // Auto-inverts — dark text in light mode, light text in dark mode.
102
- 'text-neutral-900',
103
- 'border-b border-neutral-200',
104
- 'align-middle',
105
- ],
106
- selectionCell: 'w-10 text-center',
107
- expandToggleCell: 'w-10 text-center',
108
- // Expanded panel uses one tier of elevation above the page surface.
109
- expandedRow: 'bg-neutral-100',
110
- rowActionsCell: [
111
- 'w-12 text-right',
112
- // Row actions hidden until row is hovered or focus-within
113
- // (Pencil & Paper UX pattern: reveal-on-hover reduces visual density).
114
- 'opacity-0 group-hover/row:opacity-100 group-focus-within/row:opacity-100',
115
- 'transition-opacity motion-reduce:transition-none',
116
- ],
117
- emptyState: [
118
- 'py-12 text-center text-neutral-500',
119
- ],
120
- loadingOverlay: [
121
- 'pointer-events-none',
122
- ],
123
- bulkActionFooter: [
124
- 'sticky bottom-0 z-20',
125
- 'flex flex-wrap items-center justify-between gap-3',
126
- 'px-3 py-2 mt-0',
127
- 'border-t border-neutral-200',
128
- // Surface-elevated bg + shadow ladder.
129
- 'bg-neutral-50 shadow-md',
130
- ],
131
- },
132
- variants: {
133
- variant: {
134
- plain: {},
135
- lines: {
136
- // Default — Stripe-style 1px horizontal dividers (already
137
- // applied via `border-b` on row + cell). No extra style here.
138
- },
139
- striped: {
140
- // bg-neutral-100/60 = subtle elevation tier (auto-inverts).
141
- row: 'odd:bg-neutral-100/60',
142
- },
143
- bordered: {
144
- table: 'border border-neutral-200',
145
- cell: 'border-r last:border-r-0 border-neutral-200',
146
- headerCell: 'border-r last:border-r-0 border-neutral-200',
147
- },
148
- card: {
149
- scroll: 'overflow-visible',
150
- table: 'border-separate border-spacing-y-2',
151
- row: [
152
- 'rounded-lg shadow-sm',
153
- // Each row becomes an elevated card above the surface.
154
- 'bg-neutral-50',
155
- ],
156
- cell: 'border-b-0 first:rounded-l-lg last:rounded-r-lg',
157
- headerCell: 'border-b-0',
158
- },
159
- },
160
- size: {
161
- sm: {
162
- headerCell: 'text-xs',
163
- cell: 'text-xs',
164
- search: 'text-xs',
165
- },
166
- md: {
167
- headerCell: 'text-sm',
168
- cell: 'text-sm',
169
- search: 'text-sm',
170
- },
171
- lg: {
172
- headerCell: 'text-base',
173
- cell: 'text-base',
174
- search: 'text-base',
175
- },
176
- },
177
- density: {
178
- // Pencil & Paper UX research: 40px / 48px / 56px row height.
179
- compact: {
180
- headerCell: 'px-2 py-1',
181
- cell: 'px-2 py-1',
182
- },
183
- comfortable: {
184
- headerCell: 'px-3 py-2',
185
- cell: 'px-3 py-2',
186
- },
187
- spacious: {
188
- headerCell: 'px-4 py-3',
189
- cell: 'px-4 py-3',
190
- },
191
- },
192
- stickyHeader: {
193
- true: {
194
- thead: 'sticky top-0 z-10',
195
- },
196
- false: {},
197
- },
198
- },
199
- defaultVariants: {
200
- variant: 'lines',
201
- size: 'md',
202
- density: 'comfortable',
203
- stickyHeader: true,
204
- },
205
- });
206
-
207
- export type TableVariants = VariantProps<typeof tableVariants>;