@12-apps/ui 6.39.8 → 6.39.9

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 (349) hide show
  1. package/dist/_internal/components/data-display/Alert/Alert.js +2 -2
  2. package/dist/_internal/components/data-display/Alert/Alert.metrics.js +2 -2
  3. package/dist/_internal/components/data-display/Alert/Alert.styles.js +2 -2
  4. package/dist/_internal/components/data-display/Badge/Badge.js +2 -2
  5. package/dist/_internal/components/data-display/Badge/Badge.styles.js +2 -2
  6. package/dist/_internal/components/data-display/Badge/BadgeContent.js +2 -2
  7. package/dist/_internal/components/data-display/Banner/Banner.js +2 -2
  8. package/dist/_internal/components/data-display/Banner/Banner.styles.js +2 -2
  9. package/dist/_internal/components/data-display/CardKit/CardKebab.js +2 -2
  10. package/dist/_internal/components/data-display/CardKit/card-actions-context.js +2 -2
  11. package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js +2 -2
  12. package/dist/_internal/components/data-display/CardKit/use-row-confirm.js +2 -2
  13. package/dist/_internal/components/data-display/Carousel/Carousel.chrome.js +2 -2
  14. package/dist/_internal/components/data-display/Carousel/Carousel.js +2 -2
  15. package/dist/_internal/components/data-display/Carousel/Carousel.parts.js +2 -2
  16. package/dist/_internal/components/data-display/Carousel/Carousel.styles.js +2 -2
  17. package/dist/_internal/components/data-display/Chart/Chart.js +2 -2
  18. package/dist/_internal/components/data-display/Chart/SpecChart.js +2 -2
  19. package/dist/_internal/components/data-display/Chart/chart-context.js +2 -2
  20. package/dist/_internal/components/data-display/Chart/chart-internals.js +2 -2
  21. package/dist/_internal/components/data-display/Chart/chart-renderers.js +2 -2
  22. package/dist/_internal/components/data-display/DataViews/DataViewsBoard.js +5 -5
  23. package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +21 -21
  24. package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +27 -27
  25. package/dist/_internal/components/data-display/DataViews/DeleteViewDialog.js +5 -5
  26. package/dist/_internal/components/data-display/DataViews/ManageViewsDialog.js +5 -5
  27. package/dist/_internal/components/data-display/DataViews/SaveViewModal.js +6 -6
  28. package/dist/_internal/components/data-display/DataViews/base-card.js +5 -5
  29. package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +7 -7
  30. package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +6 -6
  31. package/dist/_internal/components/data-display/DataViews/base-list-card.js +8 -8
  32. package/dist/_internal/components/data-display/DataViews/data-views-bar-controls.js +1 -1
  33. package/dist/_internal/components/data-display/DataViews/data-views-category-pill.js +1 -1
  34. package/dist/_internal/components/data-display/DataViews/data-views-columns-tab.js +5 -5
  35. package/dist/_internal/components/data-display/DataViews/data-views-columns.js +2 -2
  36. package/dist/_internal/components/data-display/DataViews/data-views-day-input.js +1 -1
  37. package/dist/_internal/components/data-display/DataViews/data-views-display-panel.js +8 -8
  38. package/dist/_internal/components/data-display/DataViews/data-views-display-tabs.js +5 -5
  39. package/dist/_internal/components/data-display/DataViews/data-views-empty.js +5 -5
  40. package/dist/_internal/components/data-display/DataViews/data-views-export.js +5 -5
  41. package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +1 -1
  42. package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +7 -7
  43. package/dist/_internal/components/data-display/DataViews/data-views-grid-helpers.js +2 -2
  44. package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +20 -20
  45. package/dist/_internal/components/data-display/DataViews/data-views-header-row.js +5 -5
  46. package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +7 -7
  47. package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +5 -5
  48. package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +6 -6
  49. package/dist/_internal/components/data-display/DataViews/data-views-number-input.js +1 -1
  50. package/dist/_internal/components/data-display/DataViews/data-views-pagination.js +1 -1
  51. package/dist/_internal/components/data-display/DataViews/data-views-range-pill.js +1 -1
  52. package/dist/_internal/components/data-display/DataViews/data-views-search.js +1 -1
  53. package/dist/_internal/components/data-display/DataViews/data-views-select-all-strip.js +5 -5
  54. package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +11 -11
  55. package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +8 -8
  56. package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +10 -10
  57. package/dist/_internal/components/data-display/DataViews/data-views-view-nav.js +5 -5
  58. package/dist/_internal/components/data-display/DataViews/save-view-preview.js +5 -5
  59. package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +2 -2
  60. package/dist/_internal/components/data-display/DescriptionItem/DescriptionItem.js +5 -5
  61. package/dist/_internal/components/data-display/FleetMap/FleetBody.js +1 -1
  62. package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js +1 -1
  63. package/dist/_internal/components/data-display/FleetMap/FleetMap.js +2 -2
  64. package/dist/_internal/components/data-display/MapPreview/MapLayers.js +1 -1
  65. package/dist/_internal/components/data-display/MapPreview/MapPreview.js +1 -1
  66. package/dist/_internal/components/data-display/MapPreview/MapSearchBar.js +1 -1
  67. package/dist/_internal/components/data-display/Progress/Progress.js +5 -5
  68. package/dist/_internal/components/data-display/Progress/Progress.metrics.js +3 -3
  69. package/dist/_internal/components/data-display/Progress/Progress.styles.js +4 -4
  70. package/dist/_internal/components/data-display/Sheet/Sheet.body.js +2 -2
  71. package/dist/_internal/components/data-display/Sheet/Sheet.js +2 -2
  72. package/dist/_internal/components/data-display/Sheet/Sheet.styles.js +2 -2
  73. package/dist/_internal/components/data-display/Table/Table.hooks.js +1 -1
  74. package/dist/_internal/components/data-display/Table/Table.js +5 -4
  75. package/dist/_internal/components/data-display/Table/Table.styles.js +1 -1
  76. package/dist/_internal/components/data-display/Table/TableParts.hooks.js +2 -1
  77. package/dist/_internal/components/data-display/Table/TableParts.js +2 -1
  78. package/dist/_internal/components/data-display/index.js +12 -12
  79. package/dist/_internal/components/feedback/ConfirmAction/ConfirmButton.js +2 -2
  80. package/dist/_internal/components/feedback/NotificationStatusNotice/NotificationStatusNotice.js +2 -2
  81. package/dist/_internal/components/feedback/index.js +2 -2
  82. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.js +1 -1
  83. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocompleteField.js +1 -1
  84. package/dist/_internal/components/form/AddressAutocomplete/AddressFallbackField.js +1 -1
  85. package/dist/_internal/components/form/AddressAutocomplete/AddressInputField.js +1 -1
  86. package/dist/_internal/components/form/AddressAutocomplete/AddressTextField.js +1 -1
  87. package/dist/_internal/components/form/Autocomplete/Autocomplete.js +1 -1
  88. package/dist/_internal/components/form/Autocomplete/Autocomplete.parts.js +1 -1
  89. package/dist/_internal/components/form/Button/Button.js +2 -2
  90. package/dist/_internal/components/form/Button/Button.styles.js +2 -2
  91. package/dist/_internal/components/form/CategorySelect/CategoryPanel.js +1 -1
  92. package/dist/_internal/components/form/CategorySelect/CategoryPanelFoot.js +1 -1
  93. package/dist/_internal/components/form/CategorySelect/CategoryPanelHead.js +1 -1
  94. package/dist/_internal/components/form/CategorySelect/CategoryPanelList.js +1 -1
  95. package/dist/_internal/components/form/CategorySelect/CategoryRows.js +1 -1
  96. package/dist/_internal/components/form/CategorySelect/CategorySelect.js +1 -1
  97. package/dist/_internal/components/form/CategorySelect/CategorySelect.styles.js +1 -1
  98. package/dist/_internal/components/form/CategorySelect/CategoryTrigger.js +1 -1
  99. package/dist/_internal/components/form/CepField/CepField.js +1 -1
  100. package/dist/_internal/components/form/Command/Command.js +2 -2
  101. package/dist/_internal/components/form/Command/Command.styles.js +2 -2
  102. package/dist/_internal/components/form/CreatableSelect/CreatableSelect.js +1 -1
  103. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.hooks.js +1 -1
  104. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.js +1 -1
  105. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.range.js +1 -1
  106. package/dist/_internal/components/form/DateRangePicker/DateRangePickerFields.js +1 -1
  107. package/dist/_internal/components/form/Input/Input.js +1 -1
  108. package/dist/_internal/components/form/Input/Input.styles.js +1 -1
  109. package/dist/_internal/components/form/InputOTP/InputOTP.js +1 -1
  110. package/dist/_internal/components/form/InputOTP/InputOTP.styles.js +1 -1
  111. package/dist/_internal/components/form/Label/Label.js +2 -2
  112. package/dist/_internal/components/form/Label/Label.styles.js +2 -2
  113. package/dist/_internal/components/form/Menubar/Menubar.item.js +2 -2
  114. package/dist/_internal/components/form/Menubar/Menubar.js +2 -2
  115. package/dist/_internal/components/form/Menubar/Menubar.styles.js +2 -2
  116. package/dist/_internal/components/form/Menubar/Menubar.toolbar.js +2 -2
  117. package/dist/_internal/components/form/PhoneInput/PhoneInput.js +1 -1
  118. package/dist/_internal/components/form/RadioGroup/RadioGroup.js +1 -1
  119. package/dist/_internal/components/form/RadioGroup/RadioGroup.styles.js +1 -1
  120. package/dist/_internal/components/form/RadioGroup/RadioGroup.variants.js +1 -1
  121. package/dist/_internal/components/form/Select/Select.js +1 -1
  122. package/dist/_internal/components/form/Switch/Switch.js +2 -2
  123. package/dist/_internal/components/form/Switch/Switch.parts.js +2 -2
  124. package/dist/_internal/components/form/Switch/Switch.styles.js +2 -2
  125. package/dist/_internal/components/form/Textarea/Textarea.js +2 -2
  126. package/dist/_internal/components/form/Textarea/TextareaRichEditor.js +1 -1
  127. package/dist/_internal/components/form/Toggle/Toggle.js +1 -1
  128. package/dist/_internal/components/form/Toggle/Toggle.styles.js +1 -1
  129. package/dist/_internal/components/form/ToggleGroup/ToggleGroup.js +1 -1
  130. package/dist/_internal/components/form/index.js +3 -3
  131. package/dist/_internal/components/form/total-form/Fields/CategoryField.js +1 -1
  132. package/dist/_internal/components/form/total-form/Fields/CepField.js +1 -1
  133. package/dist/_internal/components/form/total-form/Fields/SelectField.js +1 -1
  134. package/dist/_internal/components/form/total-form/Fields/TextField.js +1 -1
  135. package/dist/_internal/components/form/total-form/Fields/ToggleField.js +1 -1
  136. package/dist/_internal/components/form/total-form/Fields/index.js +1 -1
  137. package/dist/_internal/components/form/total-form/SubmitButton.js +2 -2
  138. package/dist/_internal/components/index.js +16 -16
  139. package/dist/_internal/components/layout/Box/Box.js +5 -5
  140. package/dist/_internal/components/layout/ContentToolbar/ColumnsMenu.js +1 -1
  141. package/dist/_internal/components/layout/ContentToolbar/FilterTrigger.js +1 -1
  142. package/dist/_internal/components/layout/ContentToolbar/MultiSelectDropdown.js +1 -1
  143. package/dist/_internal/components/layout/ContentToolbar/MultiSelectTriggers.js +1 -1
  144. package/dist/_internal/components/layout/ContentToolbar/SavedViewsMenu.js +1 -1
  145. package/dist/_internal/components/layout/ContentToolbar/SortByDropdown.js +1 -1
  146. package/dist/_internal/components/layout/ContentToolbar/ViewSelector.js +1 -1
  147. package/dist/_internal/components/layout/Stack/Stack.js +6 -6
  148. package/dist/_internal/components/layout/TableFilter/TableFilter.js +1 -1
  149. package/dist/_internal/components/layout/index.js +1 -1
  150. package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js +2 -2
  151. package/dist/_internal/components/navigation/AppHeader/AppHeader.identity.js +2 -2
  152. package/dist/_internal/components/navigation/Pagination/Pagination.js +1 -1
  153. package/dist/_internal/components/navigation/Pagination/PaginationParts.js +1 -1
  154. package/dist/_internal/components/navigation/Tabs/Tabs.js +1 -1
  155. package/dist/_internal/components/navigation/Tabs/Tabs.styles.js +1 -1
  156. package/dist/_internal/components/navigation/index.js +2 -2
  157. package/dist/_internal/components/typography/Heading/Heading.js +5 -5
  158. package/dist/_internal/components/typography/Heading/Heading.metrics.js +3 -3
  159. package/dist/_internal/components/typography/Heading/Heading.styles.js +4 -4
  160. package/dist/_internal/components/typography/Text/Text.js +4 -4
  161. package/dist/_internal/components/typography/Text/Text.metrics.js +3 -3
  162. package/dist/_internal/components/typography/index.js +7 -7
  163. package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.helpers.js +2 -2
  164. package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.js +2 -2
  165. package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.parts.js +2 -2
  166. package/dist/_internal/components/utility/WorkflowStep/WorkflowStepRow.js +2 -2
  167. package/dist/_internal/components/utility/index.js +2 -2
  168. package/dist/_internal/icons/Icon.js +5 -5
  169. package/dist/_internal/provider/UiProvider.js +4 -4
  170. package/dist/_internal/provider/mui-bridge.js +3 -3
  171. package/dist/_internal/provider/use-ui-theme.js +4 -4
  172. package/dist/_internal/social-login-button/social-login-button.js +8 -8
  173. package/dist/_internal/tokens/field-height.js +1 -1
  174. package/dist/_internal/tokens/theme.js +2 -2
  175. package/dist/_internal/user-avatar/user-avatar.js +5 -5
  176. package/dist/charts.js +2 -2
  177. package/dist/{chunk-OAEYCKBN.js → chunk-2K7WPHI3.js} +2 -2
  178. package/dist/{chunk-7RRXLCOO.js → chunk-2KWYNFVE.js} +4 -4
  179. package/dist/{chunk-JBI7ITL2.js → chunk-3BNQDOHC.js} +2 -2
  180. package/dist/{chunk-YCCY77W5.js → chunk-3IF3I3FI.js} +2 -2
  181. package/dist/{chunk-3KREF4ZF.js → chunk-3PQ5MZMJ.js} +2 -2
  182. package/dist/{chunk-L7NQCLFU.js → chunk-3RHZBO7L.js} +2 -2
  183. package/dist/{chunk-A4OCNJWW.js → chunk-3UABIEP3.js} +2 -2
  184. package/dist/{chunk-XIG3DXXX.js → chunk-5L7N5HER.js} +2 -2
  185. package/dist/{chunk-6WBKOM5K.js → chunk-7DK6YVJU.js} +2 -2
  186. package/dist/{chunk-ASYR22BJ.js → chunk-7XGHJD75.js} +3 -3
  187. package/dist/{chunk-OB56SZGL.js → chunk-B7CNP5HW.js} +2 -2
  188. package/dist/{chunk-PE4ZW3IA.js → chunk-BLW6KLDR.js} +4 -4
  189. package/dist/{chunk-POV2KL2P.js → chunk-CCK7FB2V.js} +16 -2
  190. package/dist/chunk-CCK7FB2V.js.map +1 -0
  191. package/dist/{chunk-QKMJUOVH.js → chunk-CRG24BGI.js} +2 -2
  192. package/dist/{chunk-LKMMJKXU.js → chunk-CYZZHWNK.js} +2 -2
  193. package/dist/{chunk-DUNG7D4B.js → chunk-DSF4VT7L.js} +1 -1
  194. package/dist/{chunk-YOJASBHJ.js → chunk-DYNJQ3HJ.js} +3 -3
  195. package/dist/{chunk-CXMVNYBY.js → chunk-GEB4WSZH.js} +3 -3
  196. package/dist/{chunk-RIF6L54B.js → chunk-H224XFFD.js} +2 -2
  197. package/dist/{chunk-3RMDIO4G.js → chunk-I5T5PQQW.js} +2 -2
  198. package/dist/{chunk-IJFAF3A7.js → chunk-IWEUSZY3.js} +3 -3
  199. package/dist/{chunk-SZ3YFVO5.js → chunk-JGJFL3PF.js} +4 -4
  200. package/dist/{chunk-XEYLYUDM.js → chunk-JH5BKA3Y.js} +2 -2
  201. package/dist/{chunk-U4O47P6S.js → chunk-JQ3D5QP6.js} +2 -2
  202. package/dist/{chunk-5HQNHZ6Z.js → chunk-LH7KMYHC.js} +3 -4
  203. package/dist/chunk-LH7KMYHC.js.map +1 -0
  204. package/dist/{chunk-X4ZRPE37.js → chunk-MBHWVRV5.js} +2 -2
  205. package/dist/{chunk-JQWAANGN.js → chunk-OOCREE37.js} +2 -2
  206. package/dist/{chunk-R2XVTUVR.js → chunk-OQRG34VG.js} +2 -2
  207. package/dist/{chunk-RUEKY3VR.js → chunk-P52LYD6S.js} +2 -2
  208. package/dist/{chunk-CTKQCKRD.js → chunk-PK6TRXV4.js} +2 -2
  209. package/dist/{chunk-RGT6DM5W.js → chunk-PX6TWS5T.js} +68 -42
  210. package/dist/chunk-PX6TWS5T.js.map +1 -0
  211. package/dist/{chunk-3OBC6BOV.js → chunk-QFTBXHOY.js} +2 -2
  212. package/dist/{chunk-QTNHAX2Z.js → chunk-QS2DCLG6.js} +3 -3
  213. package/dist/{chunk-MYWROMGO.js → chunk-QU3JX53V.js} +3 -3
  214. package/dist/{chunk-5JSRM7WC.js → chunk-RB3X6CEE.js} +2 -2
  215. package/dist/{chunk-DW6F7354.js → chunk-S36NC22G.js} +2 -2
  216. package/dist/{chunk-6N4AA2Y7.js → chunk-SNYJSACF.js} +2 -2
  217. package/dist/{chunk-BOGTTXPA.js → chunk-TT3HZRU6.js} +9 -8
  218. package/dist/chunk-TT3HZRU6.js.map +1 -0
  219. package/dist/{chunk-TFMDZQK4.js → chunk-TTZPO345.js} +4 -4
  220. package/dist/{chunk-UITQ7KMK.js → chunk-TYNK662L.js} +3 -3
  221. package/dist/{chunk-YBH4SPMM.js → chunk-URHX4FAQ.js} +2 -2
  222. package/dist/{chunk-4CXCOR6F.js → chunk-V2UZQS2K.js} +2 -2
  223. package/dist/{chunk-VIRYHNEM.js → chunk-WY5PBZ7Q.js} +2 -2
  224. package/dist/{chunk-KAIUDBHM.js → chunk-WYUBTRRV.js} +6 -6
  225. package/dist/{chunk-ISFFETTG.js → chunk-XG7NTGUH.js} +3 -3
  226. package/dist/{chunk-GWEENWIS.js → chunk-Y2HPRRVP.js} +2 -2
  227. package/dist/{chunk-5CQ5HYJW.js → chunk-YMG4CXGI.js} +3 -3
  228. package/dist/{chunk-UGGJ3KDT.js → chunk-YTINPQKU.js} +2 -2
  229. package/dist/{chunk-U3PPLAFB.js → chunk-ZN6YATOG.js} +2 -2
  230. package/dist/{chunk-WHQKH57H.js → chunk-ZXIUIIUE.js} +2 -2
  231. package/dist/data-display/Alert.js +2 -2
  232. package/dist/data-display/Badge.js +2 -2
  233. package/dist/data-display/Banner.js +2 -2
  234. package/dist/data-display/CardKit.js +2 -2
  235. package/dist/data-display/Carousel.js +2 -2
  236. package/dist/data-display/Chart.js +2 -2
  237. package/dist/data-display/DataViews.js +32 -32
  238. package/dist/data-display/DescriptionItem.js +5 -5
  239. package/dist/data-display/FleetMap.js +2 -2
  240. package/dist/data-display/MapPreview.js +1 -1
  241. package/dist/data-display/Progress.js +5 -5
  242. package/dist/data-display/Sheet.js +2 -2
  243. package/dist/data-display/Table.js +5 -4
  244. package/dist/feedback/ConfirmAction.js +2 -2
  245. package/dist/feedback/NotificationStatusNotice.js +2 -2
  246. package/dist/form/AddressAutocomplete.js +1 -1
  247. package/dist/form/Autocomplete.js +1 -1
  248. package/dist/form/Button.js +2 -2
  249. package/dist/form/CategorySelect.js +1 -1
  250. package/dist/form/CepField.js +1 -1
  251. package/dist/form/Command.js +2 -2
  252. package/dist/form/CreatableSelect.js +1 -1
  253. package/dist/form/DateRangePicker.js +1 -1
  254. package/dist/form/Input.js +1 -1
  255. package/dist/form/InputOTP.js +1 -1
  256. package/dist/form/Label.js +2 -2
  257. package/dist/form/Menubar.js +2 -2
  258. package/dist/form/PhoneInput.js +1 -1
  259. package/dist/form/RadioGroup.js +1 -1
  260. package/dist/form/Select.js +1 -1
  261. package/dist/form/Switch.js +2 -2
  262. package/dist/form/Textarea.js +2 -2
  263. package/dist/form/Toggle.js +1 -1
  264. package/dist/form/ToggleGroup.js +1 -1
  265. package/dist/form/total-form.js +2 -2
  266. package/dist/icons.js +5 -5
  267. package/dist/layout/Box.js +5 -5
  268. package/dist/layout/ContentToolbar.js +1 -1
  269. package/dist/layout/Stack.js +6 -6
  270. package/dist/layout/TableFilter.js +1 -1
  271. package/dist/navigation/AppHeader.js +2 -2
  272. package/dist/navigation/Pagination.js +1 -1
  273. package/dist/navigation/Tabs.js +1 -1
  274. package/dist/provider.js +5 -5
  275. package/dist/social-login-button.js +8 -8
  276. package/dist/tokens.js +4 -4
  277. package/dist/types/components/data-display/Table/Table.d.ts.map +1 -1
  278. package/dist/types/components/data-display/Table/Table.hooks.d.ts +3 -2
  279. package/dist/types/components/data-display/Table/Table.hooks.d.ts.map +1 -1
  280. package/dist/types/components/data-display/Table/Table.styles.d.ts +3 -1
  281. package/dist/types/components/data-display/Table/Table.styles.d.ts.map +1 -1
  282. package/dist/types/components/data-display/Table/Table.types.d.ts +6 -4
  283. package/dist/types/components/data-display/Table/Table.types.d.ts.map +1 -1
  284. package/dist/types/components/data-display/Table/TableParts.d.ts +2 -3
  285. package/dist/types/components/data-display/Table/TableParts.d.ts.map +1 -1
  286. package/dist/types/components/data-display/Table/TableParts.hooks.d.ts +6 -2
  287. package/dist/types/components/data-display/Table/TableParts.hooks.d.ts.map +1 -1
  288. package/dist/typography/Heading.js +5 -5
  289. package/dist/typography/Text.js +4 -4
  290. package/dist/user-avatar.js +5 -5
  291. package/dist/utility/WorkflowStep.js +2 -2
  292. package/package.json +1 -1
  293. package/src/components/data-display/Table/Table.hooks.ts +5 -4
  294. package/src/components/data-display/Table/Table.md +6 -0
  295. package/src/components/data-display/Table/Table.styles.ts +28 -1
  296. package/src/components/data-display/Table/Table.tsx +6 -4
  297. package/src/components/data-display/Table/Table.types.ts +6 -4
  298. package/src/components/data-display/Table/TableParts.hooks.tsx +23 -19
  299. package/src/components/data-display/Table/TableParts.tsx +112 -49
  300. package/dist/chunk-5HQNHZ6Z.js.map +0 -1
  301. package/dist/chunk-BOGTTXPA.js.map +0 -1
  302. package/dist/chunk-POV2KL2P.js.map +0 -1
  303. package/dist/chunk-RGT6DM5W.js.map +0 -1
  304. /package/dist/{chunk-OAEYCKBN.js.map → chunk-2K7WPHI3.js.map} +0 -0
  305. /package/dist/{chunk-7RRXLCOO.js.map → chunk-2KWYNFVE.js.map} +0 -0
  306. /package/dist/{chunk-JBI7ITL2.js.map → chunk-3BNQDOHC.js.map} +0 -0
  307. /package/dist/{chunk-YCCY77W5.js.map → chunk-3IF3I3FI.js.map} +0 -0
  308. /package/dist/{chunk-3KREF4ZF.js.map → chunk-3PQ5MZMJ.js.map} +0 -0
  309. /package/dist/{chunk-L7NQCLFU.js.map → chunk-3RHZBO7L.js.map} +0 -0
  310. /package/dist/{chunk-A4OCNJWW.js.map → chunk-3UABIEP3.js.map} +0 -0
  311. /package/dist/{chunk-XIG3DXXX.js.map → chunk-5L7N5HER.js.map} +0 -0
  312. /package/dist/{chunk-6WBKOM5K.js.map → chunk-7DK6YVJU.js.map} +0 -0
  313. /package/dist/{chunk-ASYR22BJ.js.map → chunk-7XGHJD75.js.map} +0 -0
  314. /package/dist/{chunk-OB56SZGL.js.map → chunk-B7CNP5HW.js.map} +0 -0
  315. /package/dist/{chunk-PE4ZW3IA.js.map → chunk-BLW6KLDR.js.map} +0 -0
  316. /package/dist/{chunk-QKMJUOVH.js.map → chunk-CRG24BGI.js.map} +0 -0
  317. /package/dist/{chunk-LKMMJKXU.js.map → chunk-CYZZHWNK.js.map} +0 -0
  318. /package/dist/{chunk-DUNG7D4B.js.map → chunk-DSF4VT7L.js.map} +0 -0
  319. /package/dist/{chunk-YOJASBHJ.js.map → chunk-DYNJQ3HJ.js.map} +0 -0
  320. /package/dist/{chunk-CXMVNYBY.js.map → chunk-GEB4WSZH.js.map} +0 -0
  321. /package/dist/{chunk-RIF6L54B.js.map → chunk-H224XFFD.js.map} +0 -0
  322. /package/dist/{chunk-3RMDIO4G.js.map → chunk-I5T5PQQW.js.map} +0 -0
  323. /package/dist/{chunk-IJFAF3A7.js.map → chunk-IWEUSZY3.js.map} +0 -0
  324. /package/dist/{chunk-SZ3YFVO5.js.map → chunk-JGJFL3PF.js.map} +0 -0
  325. /package/dist/{chunk-XEYLYUDM.js.map → chunk-JH5BKA3Y.js.map} +0 -0
  326. /package/dist/{chunk-U4O47P6S.js.map → chunk-JQ3D5QP6.js.map} +0 -0
  327. /package/dist/{chunk-X4ZRPE37.js.map → chunk-MBHWVRV5.js.map} +0 -0
  328. /package/dist/{chunk-JQWAANGN.js.map → chunk-OOCREE37.js.map} +0 -0
  329. /package/dist/{chunk-R2XVTUVR.js.map → chunk-OQRG34VG.js.map} +0 -0
  330. /package/dist/{chunk-RUEKY3VR.js.map → chunk-P52LYD6S.js.map} +0 -0
  331. /package/dist/{chunk-CTKQCKRD.js.map → chunk-PK6TRXV4.js.map} +0 -0
  332. /package/dist/{chunk-3OBC6BOV.js.map → chunk-QFTBXHOY.js.map} +0 -0
  333. /package/dist/{chunk-QTNHAX2Z.js.map → chunk-QS2DCLG6.js.map} +0 -0
  334. /package/dist/{chunk-MYWROMGO.js.map → chunk-QU3JX53V.js.map} +0 -0
  335. /package/dist/{chunk-5JSRM7WC.js.map → chunk-RB3X6CEE.js.map} +0 -0
  336. /package/dist/{chunk-DW6F7354.js.map → chunk-S36NC22G.js.map} +0 -0
  337. /package/dist/{chunk-6N4AA2Y7.js.map → chunk-SNYJSACF.js.map} +0 -0
  338. /package/dist/{chunk-TFMDZQK4.js.map → chunk-TTZPO345.js.map} +0 -0
  339. /package/dist/{chunk-UITQ7KMK.js.map → chunk-TYNK662L.js.map} +0 -0
  340. /package/dist/{chunk-YBH4SPMM.js.map → chunk-URHX4FAQ.js.map} +0 -0
  341. /package/dist/{chunk-4CXCOR6F.js.map → chunk-V2UZQS2K.js.map} +0 -0
  342. /package/dist/{chunk-VIRYHNEM.js.map → chunk-WY5PBZ7Q.js.map} +0 -0
  343. /package/dist/{chunk-KAIUDBHM.js.map → chunk-WYUBTRRV.js.map} +0 -0
  344. /package/dist/{chunk-ISFFETTG.js.map → chunk-XG7NTGUH.js.map} +0 -0
  345. /package/dist/{chunk-GWEENWIS.js.map → chunk-Y2HPRRVP.js.map} +0 -0
  346. /package/dist/{chunk-5CQ5HYJW.js.map → chunk-YMG4CXGI.js.map} +0 -0
  347. /package/dist/{chunk-UGGJ3KDT.js.map → chunk-YTINPQKU.js.map} +0 -0
  348. /package/dist/{chunk-U3PPLAFB.js.map → chunk-ZN6YATOG.js.map} +0 -0
  349. /package/dist/{chunk-WHQKH57H.js.map → chunk-ZXIUIIUE.js.map} +0 -0
@@ -31,6 +31,24 @@ const useRowSelection = ({
31
31
  [onSelectionChange, selectedRows],
32
32
  );
33
33
 
34
+ type RowRendererProps = Pick<
35
+ TableBodyProps,
36
+ | 'columns'
37
+ | 'onRowClick'
38
+ | 'onRowFocus'
39
+ | 'onRowBlur'
40
+ | 'onSelectionChange'
41
+ | 'rowKeyExtractor'
42
+ | 'selectable'
43
+ | 'renderRow'
44
+ | 'renderCell'
45
+ | 'rowHeight'
46
+ > & {
47
+ selectedRows: Array<string | number>;
48
+ /** Whether the rows are a virtual window's, drawn at exactly `rowHeight`. */
49
+ virtualised: boolean;
50
+ };
51
+
34
52
  export const useTableRowRenderer = ({
35
53
  columns,
36
54
  selectedRows,
@@ -42,22 +60,9 @@ export const useTableRowRenderer = ({
42
60
  selectable,
43
61
  renderRow,
44
62
  renderCell,
45
- virtualScrolling,
63
+ virtualised,
46
64
  rowHeight,
47
- }: Pick<
48
- TableBodyProps,
49
- | 'columns'
50
- | 'onRowClick'
51
- | 'onRowFocus'
52
- | 'onRowBlur'
53
- | 'onSelectionChange'
54
- | 'rowKeyExtractor'
55
- | 'selectable'
56
- | 'renderRow'
57
- | 'renderCell'
58
- | 'virtualScrolling'
59
- | 'rowHeight'
60
- > & { selectedRows: Array<string | number> }) => {
65
+ }: RowRendererProps) => {
61
66
  const getRowKey = useRowKey(rowKeyExtractor);
62
67
  const isRowSelected = useCallback(
63
68
  (rowKey: string | number) => selectedRows.includes(rowKey),
@@ -66,7 +71,7 @@ export const useTableRowRenderer = ({
66
71
  const handleRowSelection = useRowSelection({ selectedRows, onSelectionChange });
67
72
 
68
73
  const renderTableRow = useCallback(
69
- (rowData: Record<string, unknown>, index: number, offsetY: number = 0) => {
74
+ (rowData: Record<string, unknown>, index: number) => {
70
75
  const rowKey = getRowKey(rowData, index);
71
76
  const selected = isRowSelected(rowKey);
72
77
 
@@ -78,7 +83,6 @@ export const useTableRowRenderer = ({
78
83
  rowData={rowData}
79
84
  rowKey={rowKey}
80
85
  index={index}
81
- offsetY={offsetY}
82
86
  columns={columns}
83
87
  selected={selected}
84
88
  selectable={selectable}
@@ -87,7 +91,7 @@ export const useTableRowRenderer = ({
87
91
  onRowFocus={onRowFocus}
88
92
  onRowBlur={onRowBlur}
89
93
  onSelect={handleRowSelection}
90
- virtualScrolling={virtualScrolling}
94
+ virtualised={virtualised}
91
95
  renderCell={renderCell}
92
96
  />
93
97
  );
@@ -104,7 +108,7 @@ export const useTableRowRenderer = ({
104
108
  renderCell,
105
109
  rowHeight,
106
110
  selectable,
107
- virtualScrolling,
111
+ virtualised,
108
112
  ],
109
113
  );
110
114
 
@@ -7,6 +7,7 @@ import TableSortLabel from '@mui/material/TableSortLabel/index.js';
7
7
  import { useTheme, type Theme } from '@mui/material/styles/index.js';
8
8
  import React, { useCallback } from 'react';
9
9
 
10
+ import { FIELD_BORDER_WIDTH } from '../../../tokens/field-height.core';
10
11
  import { rem } from '../../../tokens/relative';
11
12
 
12
13
  import { tableRowHeight } from './Table.helpers';
@@ -125,14 +126,62 @@ export const EnhancedTableHeader: React.FC<TableHeaderProps> = React.memo(({
125
126
 
126
127
  EnhancedTableHeader.displayName = 'EnhancedTableHeader';
127
128
 
129
+ /** How a virtual cell's wrapper places its content along the row, per `align`. */
130
+ const JUSTIFY: Record<NonNullable<ColumnConfig['align']>, React.CSSProperties['justifyContent']> = {
131
+ left: 'flex-start',
132
+ center: 'center',
133
+ right: 'flex-end',
134
+ };
135
+
136
+ /**
137
+ * A virtual cell's content (FUT-2668). The cell has no vertical padding, and
138
+ * this fills its content box — the pitch less the cell's bottom rule, the one
139
+ * hairline every variant draws — so the cell's border box is exactly the pitch
140
+ * whatever it holds. Centred vertically, placed by the column's `align`, and
141
+ * clipped rather than allowed to grow the row.
142
+ */
143
+ const VirtualCellContent: React.FC<{
144
+ rowHeight: number;
145
+ align: NonNullable<ColumnConfig['align']>;
146
+ children: React.ReactNode;
147
+ }> = ({ rowHeight, align, children }) => {
148
+ const theme = useTheme();
149
+ return (
150
+ <div
151
+ style={{
152
+ height: `calc(${rem(theme, rowHeight)} - ${FIELD_BORDER_WIDTH}px)`,
153
+ display: 'flex',
154
+ alignItems: 'center',
155
+ justifyContent: JUSTIFY[align],
156
+ overflow: 'hidden',
157
+ }}
158
+ >
159
+ {children}
160
+ </div>
161
+ );
162
+ };
163
+
164
+ /** What one cell shows: the caller's `renderCell`, else the column's `render`, else the value. */
165
+ const cellContent = (
166
+ column: ColumnConfig,
167
+ rowData: Record<string, unknown>,
168
+ index: number,
169
+ renderCell: TableBodyProps['renderCell'],
170
+ ): React.ReactNode => {
171
+ const value = rowData[column.key];
172
+ if (renderCell) return renderCell(value, column, rowData, index);
173
+ return column.render ? column.render(value, rowData) : (value as React.ReactNode);
174
+ };
175
+
128
176
  // One data row. Split out of the memoised renderTableRow callback so the
129
177
  // callback stays a short dispatch and the row markup is readable on its own.
178
+ // A virtualised row stays in the table's flow at `rowHeight`, and each of its
179
+ // cells holds its content in a `VirtualCellContent` (FUT-2668); a plain row is
180
+ // drawn as MUI draws it.
130
181
  export const TableDataRow: React.FC<{
131
182
  rowData: Record<string, unknown>;
132
183
  rowKey: string | number;
133
184
  index: number;
134
- /** Where a virtualised row sits, in design px — drawn through `rem`, like its height. */
135
- offsetY: number;
136
185
  columns: ColumnConfig[];
137
186
  selected: boolean;
138
187
  selectable?: boolean;
@@ -142,13 +191,13 @@ export const TableDataRow: React.FC<{
142
191
  onRowFocus?: TableBodyProps['onRowFocus'];
143
192
  onRowBlur?: TableBodyProps['onRowBlur'];
144
193
  onSelect: (event: React.MouseEvent | React.ChangeEvent, rowKey: string | number) => void;
145
- virtualScrolling?: boolean;
194
+ /** Whether the row is one of a virtual window's. */
195
+ virtualised: boolean;
146
196
  renderCell?: TableBodyProps['renderCell'];
147
197
  }> = ({
148
198
  rowData,
149
199
  rowKey,
150
200
  index,
151
- offsetY,
152
201
  columns,
153
202
  selected,
154
203
  selectable,
@@ -157,9 +206,19 @@ export const TableDataRow: React.FC<{
157
206
  onRowFocus,
158
207
  onRowBlur,
159
208
  onSelect,
160
- virtualScrolling,
209
+ virtualised,
161
210
  renderCell }) => {
162
211
  const theme = useTheme();
212
+ const pitch = tableRowHeight(rowHeight);
213
+ const fit = (align: NonNullable<ColumnConfig['align']>, content: React.ReactNode) =>
214
+ virtualised ? (
215
+ <VirtualCellContent rowHeight={pitch} align={align}>
216
+ {content}
217
+ </VirtualCellContent>
218
+ ) : (
219
+ content
220
+ );
221
+
163
222
  return (
164
223
  <TableRow
165
224
  key={String(rowKey)}
@@ -168,62 +227,62 @@ export const TableDataRow: React.FC<{
168
227
  onClick={(event: React.MouseEvent<globalThis.HTMLTableRowElement>) => onRowClick?.(event, rowData)}
169
228
  onFocus={(event: React.FocusEvent<globalThis.HTMLTableRowElement>) => onRowFocus?.(event, rowData)}
170
229
  onBlur={(event: React.FocusEvent<globalThis.HTMLTableRowElement>) => onRowBlur?.(event, rowData)}
171
- style={virtualScrolling ? {
172
- transform: `translateY(${rem(theme, offsetY)})`,
173
- position: 'absolute',
174
- top: 0,
175
- left: 0,
176
- right: 0,
177
- height: rem(theme, tableRowHeight(rowHeight)) } : undefined}
230
+ style={virtualised ? { height: rem(theme, pitch) } : undefined}
178
231
  >
179
232
  {selectable && (
180
233
  <TableCell padding="checkbox">
181
- <Checkbox
182
- checked={selected}
183
- onChange={(event) => onSelect(event, rowKey)}
184
- onClick={(event) => event.stopPropagation()}
185
- inputProps={{ 'aria-label': `select row ${index + 1}` }}
186
- />
234
+ {fit(
235
+ 'left',
236
+ <Checkbox
237
+ checked={selected}
238
+ onChange={(event) => onSelect(event, rowKey)}
239
+ onClick={(event) => event.stopPropagation()}
240
+ inputProps={{ 'aria-label': `select row ${index + 1}` }}
241
+ />,
242
+ )}
187
243
  </TableCell>
188
244
  )}
189
- {columns.map((column) => {
190
- const value = rowData[column.key];
191
- return (
192
- <TableCell key={column.key} align={column.align || 'left'}>
193
- {renderCell
194
- ? renderCell(value, column, rowData, index)
195
- : column.render
196
- ? column.render(value, rowData)
197
- : (value as React.ReactNode)
198
- }
199
- </TableCell>
200
- );
201
- })}
245
+ {columns.map((column) => (
246
+ <TableCell key={column.key} align={column.align || 'left'}>
247
+ {fit(column.align || 'left', cellContent(column, rowData, index, renderCell))}
248
+ </TableCell>
249
+ ))}
202
250
  </TableRow>
203
251
  );
204
252
  };
205
253
 
206
- // Only the rows in view are rendered, positioned by absolute offset inside a
207
- // body sized to the full data set. `rowHeight` and every offset are design px,
254
+ /**
255
+ * A stand-in for the rows outside the window, `heightPx` design px tall. A bare
256
+ * `<tr>` and `<td>` with no padding or border: none of MUI's row or cell
257
+ * classes, so hover, striping and cell padding never reach it. Not rendered at
258
+ * all when there is nothing to stand in for.
259
+ */
260
+ const SpacerRow: React.FC<{ heightPx: number; colSpan: number }> = ({ heightPx, colSpan }) => {
261
+ const theme = useTheme();
262
+ if (heightPx <= 0) return null;
263
+ return (
264
+ <tr aria-hidden="true" style={{ height: rem(theme, heightPx) }}>
265
+ <td colSpan={colSpan} style={{ padding: 0, border: 0 }} />
266
+ </tr>
267
+ );
268
+ };
269
+
270
+ // Only the rows in view are rendered, in the table's own flow between two
271
+ // spacer rows standing in for the rest (FUT-2668) — an absolutely positioned
272
+ // `<tr>` is blockified and leaves the column grid. Every height is design px,
208
273
  // drawn through `rem`. The `<tbody>` sits directly in the `<table>`; the one
209
274
  // scroll container wraps the whole table, header included (FUT-2658).
210
275
  const VirtualisedBody: React.FC<{
211
276
  visibleItems: VirtualWindow;
212
- rowHeight: number;
213
- renderTableRow: (
214
- rowData: Record<string, unknown>,
215
- index: number,
216
- offsetY?: number,
217
- ) => React.ReactNode;
218
- }> = ({ visibleItems, rowHeight, renderTableRow }) => (
219
- <TableBody
220
- style={{
221
- height: visibleItems.totalHeight,
222
- position: 'relative' }}
223
- >
224
- {visibleItems.items.map((rowData, index) =>
225
- renderTableRow(rowData, visibleItems.startIndex + index, visibleItems.offsetY + index * rowHeight)
277
+ colSpan: number;
278
+ renderTableRow: (rowData: Record<string, unknown>, index: number) => React.ReactNode;
279
+ }> = ({ visibleItems, colSpan, renderTableRow }) => (
280
+ <TableBody>
281
+ <SpacerRow heightPx={visibleItems.offsetY} colSpan={colSpan} />
282
+ {visibleItems.items.map((rowData, index) =>
283
+ renderTableRow(rowData, visibleItems.startIndex + index)
226
284
  )}
285
+ <SpacerRow heightPx={visibleItems.trailingPx} colSpan={colSpan} />
227
286
  </TableBody>
228
287
  );
229
288
 
@@ -242,13 +301,17 @@ export const EnhancedTableBody: React.FC<TableBodyProps> = React.memo((props) =>
242
301
  const { data, virtualWindow } = props;
243
302
  // The row renderer takes the body's own props; its `rowHeight` stays the
244
303
  // caller's design px, and the row resolves the default where it draws it.
245
- const renderTableRow = useTableRowRenderer({ ...props, selectedRows: props.selectedRows ?? [] });
304
+ const renderTableRow = useTableRowRenderer({
305
+ ...props,
306
+ selectedRows: props.selectedRows ?? [],
307
+ virtualised: Boolean(virtualWindow),
308
+ });
246
309
 
247
310
  if (virtualWindow) {
248
311
  return (
249
312
  <VirtualisedBody
250
313
  visibleItems={virtualWindow}
251
- rowHeight={tableRowHeight(props.rowHeight)}
314
+ colSpan={props.columns.length + (props.selectable ? 1 : 0)}
252
315
  renderTableRow={renderTableRow}
253
316
  />
254
317
  );
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/data-display/Table/Table.hooks.ts"],"sourcesContent":["import { useTheme } from '@mui/material/styles/index.js';\nimport useMediaQuery from '@mui/material/useMediaQuery/index.js';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { rem, remPx } from '../../../tokens/relative';\n\nimport type { ColumnConfig, TableProps, VirtualWindow } from './Table.types';\n\n/**\n * The virtual window. `rowHeight` and `containerHeight` are design px: the\n * window is computed in the px `scrollTop` is measured in (`remPx`), and what it\n * hands back to draw with stays in design px (`offsetY`) or is CSS already\n * (`totalHeight`), so the rows and the window share one pitch at any type scale.\n *\n * The scroller holds the header as well as the body, so the `<tbody>` starts\n * the header's height into it. `handleScroll` measures that height from\n * `headerRef` in the same live px as `scrollTop`, and the window subtracts it\n * before dividing by the pitch (FUT-2658).\n */\nexport const useVirtualScrolling = (\n data: Record<string, unknown>[],\n rowHeight: number,\n containerHeight: number,\n overscan: number = 5,\n headerRef?: React.RefObject<HTMLElement | null>,\n) => {\n const theme = useTheme();\n // Both live px, as the browser measures them.\n const [scroll, setScroll] = useState({ scrollTop: 0, headerPx: 0 });\n \n const visibleItems = useMemo((): VirtualWindow => {\n const pitch = remPx(theme, rowHeight);\n const bodyScrollTop = Math.max(0, scroll.scrollTop - scroll.headerPx);\n const startIndex = Math.floor(bodyScrollTop / pitch);\n const endIndex = Math.min(\n data.length,\n Math.ceil((bodyScrollTop + remPx(theme, containerHeight)) / pitch)\n );\n \n const start = Math.max(0, startIndex - overscan);\n const end = Math.min(data.length, endIndex + overscan);\n \n return {\n startIndex: start,\n endIndex: end,\n items: data.slice(start, end),\n totalHeight: rem(theme, data.length * rowHeight),\n offsetY: start * rowHeight,\n };\n }, [data, rowHeight, containerHeight, scroll, overscan, theme]);\n\n const handleScroll = useCallback((e: React.UIEvent<HTMLDivElement>) => {\n setScroll({\n scrollTop: e.currentTarget.scrollTop,\n headerPx: headerRef?.current?.offsetHeight ?? 0,\n });\n }, [headerRef]);\n\n return { visibleItems, handleScroll };\n};\n\n// Responsive Hook\n\nconst useResponsive = (\n columns: ColumnConfig[],\n columnPriorities?: number[]\n) => {\n const theme = useTheme();\n const isMobile = useMediaQuery(theme.breakpoints.down('md'));\n const isTablet = useMediaQuery(theme.breakpoints.down('lg'));\n \n const [hiddenColumns, setHiddenColumns] = useState<number[]>([]);\n const [columnMenuAnchor, setColumnMenuAnchor] = useState<null | HTMLElement>(null);\n\n useEffect(() => {\n if (!columnPriorities) return;\n \n let columnsToHide: number[] = [];\n \n if (isMobile) {\n // Hide lowest priority columns on mobile\n columnsToHide = columnPriorities\n .map((priority, index) => ({ priority, index }))\n .sort((a, b) => b.priority - a.priority)\n .slice(0, Math.floor(columns.length / 2))\n .map(item => item.index);\n } else if (isTablet) {\n // Hide some columns on tablet\n columnsToHide = columnPriorities\n .map((priority, index) => ({ priority, index }))\n .sort((a, b) => b.priority - a.priority)\n .slice(0, Math.floor(columns.length / 3))\n .map(item => item.index);\n }\n \n setHiddenColumns(columnsToHide);\n }, [isMobile, isTablet, columnPriorities, columns.length]);\n\n const visibleColumns = columns.filter((_, index) => !hiddenColumns.includes(index));\n\n return {\n visibleColumns,\n hiddenColumns,\n isMobile,\n columnMenuAnchor,\n setColumnMenuAnchor,\n setHiddenColumns,\n };\n};\n\n// Enhanced Table Header Component\n// Visible/hidden column split for responsive mode, plus row selection.\nexport const useTableSelection = ({\n columns,\n data,\n responsive,\n columnPriorities,\n selectedRows,\n rowKeyExtractor,\n onSelectionChange,\n}: {\n columns?: ColumnConfig[];\n data: TableProps['data'];\n responsive?: boolean;\n columnPriorities?: number[];\n selectedRows: (string | number)[];\n rowKeyExtractor?: (row: Record<string, unknown>, index: number) => string | number;\n onSelectionChange?: TableProps['onSelectionChange'];\n}) => {\n \n // Use responsive hook if responsive mode is enabled\n const {\n visibleColumns,\n hiddenColumns,\n isMobile,\n columnMenuAnchor,\n setColumnMenuAnchor,\n setHiddenColumns,\n } = useResponsive(\n columns || [],\n responsive ? columnPriorities : undefined\n );\n\n // Handle selection changes\n const handleSelectionChange = useCallback((rowKey: string | number, selected: boolean) => {\n if (!onSelectionChange) return;\n \n let newSelection: (string | number)[];\n if (selected) {\n newSelection = [...selectedRows, rowKey];\n } else {\n newSelection = selectedRows.filter(key => key !== rowKey);\n }\n onSelectionChange(newSelection);\n }, [selectedRows, onSelectionChange]);\n\n const handleSelectAll = useCallback((selected: boolean) => {\n if (!onSelectionChange || !data) return;\n \n if (selected) {\n const allKeys = data.map((rowData, index) => \n rowKeyExtractor ? rowKeyExtractor(rowData, index) : (rowData.id as string | number) || index\n );\n onSelectionChange(allKeys);\n } else {\n onSelectionChange([]);\n }\n }, [data, onSelectionChange, rowKeyExtractor]);\n\n // Loading state\n\n return {\n visibleColumns,\n hiddenColumns,\n isMobile,\n columnMenuAnchor,\n setColumnMenuAnchor,\n setHiddenColumns,\n handleSelectionChange,\n handleSelectAll,\n };\n};\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/data-display/Table/Table.tsx"],"sourcesContent":["import MoreVertIcon from '@mui/icons-material/MoreVert';\nimport Box from '@mui/material/Box/index.js';\nimport FormControlLabel from '@mui/material/FormControlLabel/index.js';\nimport IconButton from '@mui/material/IconButton/index.js';\nimport Menu from '@mui/material/Menu/index.js';\nimport MenuItem from '@mui/material/MenuItem/index.js';\nimport Skeleton from '@mui/material/Skeleton/index.js';\nimport Switch from '@mui/material/Switch/index.js';\nimport MuiTable from '@mui/material/Table/index.js';\nimport TableBody from '@mui/material/TableBody/index.js';\nimport TableCell from '@mui/material/TableCell/index.js';\nimport TableContainer from '@mui/material/TableContainer/index.js';\nimport TableRow from '@mui/material/TableRow/index.js';\nimport { styled, useTheme } from '@mui/material/styles/index.js';\nimport React from 'react';\n\nimport type {\n ColumnConfig,\n TableDensity,\n TableProps,\n TableStripeColor} from './Table.types';\nimport {\n TABLE_DEFAULTS,\n definedProps,\n scrollerStyle,\n tableDomProps,\n tableRowHeight,\n virtualHeight,\n} from './Table.helpers';\nimport { useTableSelection, useVirtualScrolling } from './Table.hooks';\nimport { EnhancedTableBody, EnhancedTableHeader } from './TableParts';\nimport { EmptyRow, NoDataPlaceholder } from './TableStates';\nimport {\n tableStyles } from './Table.styles';\nimport { rem } from '../../../tokens/relative';\n\n// Helper function to get stripe color from theme\nconst StyledTable = styled(MuiTable, {\n shouldForwardProp: (prop) =>\n !['customVariant', 'glow', 'pulse', 'hoverable', 'density', 'stickyHeader', 'stripeColor'].includes(prop as string) })<{\n customVariant?: string;\n glow?: boolean;\n pulse?: boolean;\n hoverable?: boolean;\n density?: TableDensity;\n stickyHeader?: boolean;\n stripeColor?: TableStripeColor;\n}>(({ theme, customVariant, glow, pulse, hoverable, density, stickyHeader, stripeColor = 'neutral' }) => {\n return tableStyles({\n theme,\n customVariant,\n glow,\n pulse,\n hoverable,\n density,\n stickyHeader,\n stripeColor });\n});\n\n// Virtual Scrolling Hook\nconst TableShell: React.FC<{\n innerRef: React.Ref<globalThis.HTMLTableElement>;\n variant?: string;\n stripeColor?: TableStripeColor;\n glow?: boolean;\n pulse?: boolean;\n hoverable?: boolean;\n density?: TableDensity;\n stickyHeader?: boolean;\n header: React.ReactNode;\n rest: Record<string, unknown>;\n children: React.ReactNode;\n}> = ({\n innerRef,\n variant,\n stripeColor,\n glow,\n pulse,\n hoverable,\n density,\n stickyHeader,\n header,\n rest,\n children }) => (\n <TableContainer>\n <StyledTable\n ref={innerRef}\n customVariant={variant}\n stripeColor={stripeColor}\n glow={glow}\n pulse={pulse}\n hoverable={hoverable}\n density={density}\n stickyHeader={stickyHeader}\n {...rest}\n >\n {header}\n {children}\n </StyledTable>\n </TableContainer>\n);\n\nconst SKELETON_ROW_COUNT = 5;\n\nconst LoadingSkeletonRows: React.FC<{ columns?: ColumnConfig[] }> = ({ columns }) => {\n const theme = useTheme();\n return (\n <>\n {Array.from({ length: SKELETON_ROW_COUNT }, (_, index) => (\n <TableRow key={index}>\n {columns?.map((column) => (\n <TableCell key={column.key}>\n <Skeleton height={rem(theme, 20)} />\n </TableCell>\n ))}\n </TableRow>\n ))}\n </>\n );\n};\n\nexport type TableShellProps = Omit<React.ComponentProps<typeof TableShell>, 'children'>;\n\ntype Selection = ReturnType<typeof useTableSelection>;\n\ninterface RendererProps {\n resolved: TableProps;\n selection: Selection;\n innerRef: React.Ref<globalThis.HTMLTableElement>;\n rest: Record<string, unknown>;\n}\n\n// The column-visibility control, shown only when responsive mode has actually\n// hidden something on a narrow viewport.\nconst ColumnToggleMenu: React.FC<{\n columns: ColumnConfig[];\n hiddenColumns: number[];\n anchor: HTMLElement | null;\n setAnchor: (element: HTMLElement | null) => void;\n setHiddenColumns: (next: number[]) => void;\n}> = ({ columns, hiddenColumns, anchor, setAnchor, setHiddenColumns }) => (\n <Box position=\"absolute\" top={8} right={8}>\n <IconButton onClick={(event) => setAnchor(event.currentTarget)} size=\"small\">\n <MoreVertIcon />\n </IconButton>\n <Menu anchorEl={anchor} open={Boolean(anchor)} onClose={() => setAnchor(null)}>\n {columns.map((column, index) => (\n <MenuItem key={column.key}>\n <FormControlLabel\n control={\n <Switch\n checked={!hiddenColumns.includes(index)}\n onChange={(event) =>\n setHiddenColumns(\n event.target.checked\n ? hiddenColumns.filter((i: number) => i !== index)\n : [...hiddenColumns, index],\n )\n }\n size=\"small\"\n />\n }\n label={column.label}\n />\n </MenuItem>\n ))}\n </Menu>\n </Box>\n);\n\n// The populated table. Local because StyledTable cannot cross a module\n// boundary (TS2742).\nconst columnsFor = (resolved: TableProps, selection: Selection): ColumnConfig[] =>\n (resolved.responsive ? selection.visibleColumns : resolved.columns) ?? [];\n\n// The toggle only earns its place when responsive mode has actually hidden\n// something on a narrow viewport.\nconst showsColumnToggle = (resolved: TableProps, selection: Selection): boolean =>\n Boolean(\n resolved.responsive &&\n selection.isMobile &&\n resolved.showColumnToggle &&\n selection.hiddenColumns.length > 0,\n );\n\n// The virtual window lives here, with the one scroller whose offset drives it;\n// the header's ref lets it subtract the height the `<thead>` pushes the body down.\nconst AdvancedTable: React.FC<RendererProps> = ({ resolved: p, selection, innerRef, rest }) => {\n const theme = useTheme();\n const finalColumns = columnsFor(p, selection);\n const showToggle = showsColumnToggle(p, selection);\n const headRef = React.useRef<globalThis.HTMLTableSectionElement>(null);\n const windowHeight = virtualHeight(p);\n const { visibleItems, handleScroll } = useVirtualScrolling(\n p.data ?? [],\n tableRowHeight(p.rowHeight) || 40,\n windowHeight ?? 400,\n p.overscan,\n headRef,\n );\n\n return (\n <Box position=\"relative\">\n <TableContainer\n style={scrollerStyle(theme, p)}\n onScroll={windowHeight ? handleScroll : undefined}\n >\n <StyledTable\n ref={innerRef}\n customVariant={p.variant}\n stripeColor={p.stripeColor}\n glow={p.glow}\n pulse={p.pulse}\n hoverable={p.hoverable}\n density={p.density}\n stickyHeader={p.stickyHeader}\n {...rest}\n >\n <EnhancedTableHeader\n columns={finalColumns}\n data={p.data ?? []}\n sortable={p.sortable}\n sortConfig={p.sortConfig}\n onSortChange={p.onSortChange}\n selectable={p.selectable}\n selectedRows={p.selectedRows}\n onSelectAll={selection.handleSelectAll}\n density={p.density}\n stickyHeader={p.stickyHeader}\n headRef={headRef}\n />\n <EnhancedTableBody\n data={p.data ?? []}\n columns={finalColumns}\n selectedRows={p.selectedRows}\n onRowClick={p.onRowClick}\n onRowFocus={p.onRowFocus}\n onRowBlur={p.onRowBlur}\n onSelectionChange={selection.handleSelectionChange}\n rowKeyExtractor={p.rowKeyExtractor}\n density={p.density}\n selectable={p.selectable}\n hoverable={p.hoverable}\n renderRow={p.renderRow}\n renderCell={p.renderCell}\n virtualScrolling={p.virtualScrolling}\n virtualWindow={windowHeight ? visibleItems : undefined}\n rowHeight={p.rowHeight}\n />\n </StyledTable>\n </TableContainer>\n\n {showToggle && (\n <ColumnToggleMenu\n columns={p.columns ?? []}\n hiddenColumns={selection.hiddenColumns}\n anchor={selection.columnMenuAnchor}\n setAnchor={selection.setColumnMenuAnchor}\n setHiddenColumns={selection.setHiddenColumns}\n />\n )}\n </Box>\n );\n};\n\n// The loading and empty states render the same shell as the populated table, so\n// they share TableShell rather than repeating it three times.\nconst buildShell = ({\n resolved,\n selection,\n innerRef,\n rest,\n finalColumns }: RendererProps & { finalColumns?: ColumnConfig[] }) => ({\n innerRef,\n variant: resolved.variant,\n stripeColor: resolved.stripeColor,\n glow: resolved.glow,\n pulse: resolved.pulse,\n hoverable: resolved.hoverable,\n density: resolved.density,\n stickyHeader: resolved.stickyHeader,\n header: resolved.columns ? (\n <EnhancedTableHeader\n columns={finalColumns ?? []}\n data={[]}\n sortable={resolved.sortable}\n sortConfig={resolved.sortConfig}\n onSortChange={resolved.onSortChange}\n selectable={resolved.selectable}\n selectedRows={resolved.selectedRows}\n onSelectAll={selection.handleSelectAll}\n density={resolved.density}\n stickyHeader={resolved.stickyHeader}\n />\n ) : null,\n rest: rest as Record<string, unknown> });\n\nconst TableLoadingState: React.FC<{\n shell: TableShellProps;\n loadingComponent?: React.ReactNode;\n columns?: ColumnConfig[];\n}> = ({ shell, loadingComponent, columns }) => (\n <TableShell {...shell}>\n <TableBody data-testid=\"table-loading\">\n {loadingComponent || <LoadingSkeletonRows columns={columns} />}\n </TableBody>\n </TableShell>\n);\n\nconst TableEmptyState: React.FC<{\n shell: TableShellProps;\n emptyStateComponent?: React.ReactNode;\n emptyText: string;\n colSpan: number;\n}> = ({ shell, emptyStateComponent, emptyText, colSpan }) => (\n <TableShell {...shell}>\n <EmptyRow colSpan={colSpan}>\n {emptyStateComponent || <NoDataPlaceholder emptyText={emptyText} />}\n </EmptyRow>\n </TableShell>\n);\n\nexport const Table = React.forwardRef<globalThis.HTMLTableElement, TableProps>(\n (tableProps, ref) => {\n const resolved = { ...TABLE_DEFAULTS, ...definedProps(tableProps) } as TableProps;\n const {\n columns,\n data,\n responsive,\n loading,\n loadingComponent,\n emptyStateComponent,\n emptyText,\n children,\n } = resolved;\n\n const selection = useTableSelection({\n columns,\n data,\n responsive,\n columnPriorities: resolved.columnPriorities,\n selectedRows: resolved.selectedRows ?? [],\n rowKeyExtractor: resolved.rowKeyExtractor,\n onSelectionChange: resolved.onSelectionChange });\n\n // Only MUI's and the DOM's own props reach the `<table>` (FUT-2658).\n const rest = tableDomProps(tableProps);\n const renderer: RendererProps = { resolved, selection, innerRef: ref, rest };\n const finalColumns = responsive ? selection.visibleColumns : columns;\n const shell = buildShell({ ...renderer, finalColumns });\n\n if (loading) {\n return (\n <TableLoadingState shell={shell} loadingComponent={loadingComponent} columns={columns} />\n );\n }\n\n if (data && data.length === 0) {\n return (\n <TableEmptyState\n shell={shell}\n emptyStateComponent={emptyStateComponent}\n emptyText={emptyText}\n colSpan={finalColumns?.length || 1}\n />\n );\n }\n\n if (columns && data) return <AdvancedTable {...renderer} />;\n\n // Basic table (backward compatibility)\n return (\n <StyledTable\n ref={ref}\n customVariant={resolved.variant}\n stripeColor={resolved.stripeColor}\n glow={resolved.glow}\n pulse={resolved.pulse}\n hoverable={resolved.hoverable}\n density={resolved.density}\n stickyHeader={resolved.stickyHeader}\n {...rest}\n >\n {children}\n </StyledTable>\n );\n },\n);\n\nTable.displayName = 'Table';"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/data-display/Table/Table.styles.ts"],"sourcesContent":["import { alpha, keyframes } from '@mui/material/styles/index.js';\nimport type { CSSObject, Theme } from '@mui/material/styles/index.js';\n\nimport type { TableDensity, TableStripeColor } from './Table.types';\nimport { rem, rems } from '../../../tokens/relative';\n\nconst pulseAnimation = (theme: Theme) => keyframes`\n 0% {\n box-shadow: 0 0 0 0 currentColor;\n opacity: 1;\n }\n 70% {\n box-shadow: 0 0 0 ${rem(theme, 10)} currentColor;\n opacity: 0;\n }\n 100% {\n box-shadow: 0 0 0 0 currentColor;\n opacity: 0;\n }\n`;\n\n// Density configurations. The row height stays design px (`…Px`) and goes\n// through `rem` where the cell is drawn.\nconst getDensityConfig = (theme: Theme, density: TableDensity = 'normal') => {\n const configs = {\n compact: {\n rowHeightPx: 36,\n cellPadding: rems(theme, 6, 12),\n fontSize: rem(theme, 13),\n headerPadding: rems(theme, 8, 12) },\n normal: {\n rowHeightPx: 52,\n cellPadding: rems(theme, 12, 16),\n fontSize: rem(theme, 14),\n headerPadding: rems(theme, 16, 16) },\n comfortable: {\n rowHeightPx: 68,\n cellPadding: rems(theme, 18, 24),\n fontSize: rem(theme, 14),\n headerPadding: rems(theme, 20, 24) } };\n return configs[density];\n};\n\nconst getStripeColorFromTheme = (theme: { palette: { primary: { main: string }; secondary: { main: string }; info: { main: string }; success: { main: string }; warning: { main: string }; error: { main: string }; action: { hover: string } } }, stripeColor: TableStripeColor = 'neutral') => {\n const colorMap: Record<TableStripeColor, string> = {\n primary: theme.palette.primary.main,\n secondary: theme.palette.secondary.main,\n info: theme.palette.info.main,\n success: theme.palette.success.main,\n warning: theme.palette.warning.main,\n danger: theme.palette.error.main,\n neutral: theme.palette.action.hover };\n return colorMap[stripeColor];\n};\n\n/**\n * The zebra stripe for one body row.\n *\n * `neutral` — the default — resolves to `palette.action.hover`, which ALREADY\n * carries its subtlety in its own alpha (`rgba(0,0,0,0.04)` in the light\n * theme). MUI's `alpha()` REPLACES that channel rather than multiplying it, so\n * re-alpha-ing it at 0.5 amplified the tint 12.5× into `rgba(0,0,0,0.5)` —\n * solid #808080 on a white card, which reads as a selected or errored row\n * rather than as a stripe (FUT-755). It is used as-is instead.\n *\n * The named colours are opaque `*.main` values with no alpha of their own, so\n * they still need one.\n */\nconst stripeRowColor = (\n theme: Parameters<typeof getStripeColorFromTheme>[0],\n stripeColor: TableStripeColor = 'neutral',\n): string => {\n const color = getStripeColorFromTheme(theme, stripeColor);\n return stripeColor === 'neutral' ? color : alpha(color, 0.15);\n};\n\n// One variant applies at a time, so a lookup replaces the mutually exclusive\n// spreads.\nconst TABLE_VARIANTS: Record<string, (args: VariantArgs) => CSSObject> = {\n default: ({ theme }) => ({\n backgroundColor: theme.palette.background.paper,\n '& .MuiTableHead-root': {\n backgroundColor: alpha(theme.palette.primary.main, 0.1) } }),\n striped: ({ theme, stripeColor }) => ({\n backgroundColor: theme.palette.background.paper,\n '& .MuiTableBody-root .MuiTableRow-root:nth-of-type(even)': {\n backgroundColor: stripeRowColor(theme, stripeColor) } }),\n glass: ({ theme }) => ({\n backgroundColor: alpha(theme.palette.background.paper, 0.1),\n backdropFilter: `blur(${rem(theme, 20)})`,\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}` }),\n minimal: ({ theme }) => ({\n backgroundColor: 'transparent',\n '& .MuiTableCell-root': {\n borderBottom: `1px solid ${alpha(theme.palette.divider, 0.1)}` } }),\n gradient: ({ theme }) => ({\n background: `linear-gradient(135deg, ${alpha(theme.palette.primary.main, 0.05)}, ${alpha(theme.palette.secondary.main, 0.05)})`,\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n '& .MuiTableHead-root': {\n background: `linear-gradient(135deg, ${alpha(theme.palette.primary.main, 0.15)}, ${alpha(theme.palette.secondary.main, 0.15)})` },\n '& .MuiTableCell-root': {\n borderBottom: `1px solid ${alpha(theme.palette.divider, 0.15)}` } }) };\n\ntype VariantArgs = {\n theme: Theme;\n densityConfig: ReturnType<typeof getDensityConfig>;\n stripeColor?: TableStripeColor;\n};\n\nconst tableVariantStyles = (args: VariantArgs, customVariant?: string): CSSObject =>\n customVariant ? (TABLE_VARIANTS[customVariant]?.(args) ?? {}) : {};\n\n// Sticky headers and row hover are independent of the variant.\nconst stickyHeaderStyles = (\n theme: Theme,\n densityConfig: ReturnType<typeof getDensityConfig>,\n): CSSObject => ({\n '& .MuiTableHead-root': {\n position: 'sticky',\n top: 0,\n zIndex: 100,\n backgroundColor: theme.palette.background.paper,\n '& .MuiTableCell-root': {\n borderBottom: `${rem(theme, 2)} solid ${theme.palette.divider}`,\n fontWeight: 600,\n padding: densityConfig.headerPadding } } });\n\nconst hoverableRowStyles = (theme: Theme): CSSObject => ({\n '& .MuiTableBody-root .MuiTableRow-root:hover': {\n backgroundColor: alpha(theme.palette.primary.main, 0.08),\n cursor: 'pointer',\n transition: 'background-color 0.15s ease-in-out' } });\n\n// glow and pulse combine into three distinct looks, spelled out rather than\n// layered — the glow-only shadow differs from the one used when both are on.\nconst emphasisStyles = (theme: Theme, glow?: boolean, pulse?: boolean): CSSObject => {\n if (glow && pulse) return ({\n position: 'relative',\n boxShadow: `${rems(theme, 0, 0, 20, 5)} ${alpha(theme.palette.primary.main, 0.3)} !important`,\n filter: 'brightness(1.05)',\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderRadius: 'inherit',\n backgroundColor: theme.palette.primary.main,\n opacity: 0.1,\n animation: `${pulseAnimation(theme)} 2s infinite`,\n pointerEvents: 'none',\n zIndex: -1 } });\n if (glow) return ({\n boxShadow: `${rems(theme, 0, 0, 20, 5)} ${alpha(theme.palette.primary.main, 0.3)} !important`,\n filter: 'brightness(1.05)' });\n if (pulse) return ({\n position: 'relative',\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderRadius: 'inherit',\n backgroundColor: theme.palette.primary.main,\n opacity: 0.1,\n animation: `${pulseAnimation(theme)} 2s infinite`,\n pointerEvents: 'none',\n zIndex: -1 } });\n\n return {};\n};\n\n// The table's own styling, lifted out so the styled() callback just forwards\n// its props.\nexport const tableStyles = ({\n theme,\n customVariant,\n glow,\n pulse,\n hoverable,\n density,\n stickyHeader,\n stripeColor = 'neutral' }: {\n theme: Theme;\n customVariant?: string;\n glow?: boolean;\n pulse?: boolean;\n hoverable?: boolean;\n density?: TableDensity;\n stickyHeader?: boolean;\n stripeColor?: TableStripeColor;\n}): CSSObject => {\n const densityConfig = getDensityConfig(theme, density);\n \n return {\n borderRadius: theme.spacing(1),\n overflow: 'hidden',\n transition: 'all 0.3s ease',\n position: 'relative',\n\n // Density styles\n '& .MuiTableCell-root': {\n padding: densityConfig.cellPadding,\n fontSize: densityConfig.fontSize,\n height: rem(theme, densityConfig.rowHeightPx) },\n\n // Sticky header\n ...tableVariantStyles({ theme, densityConfig, stripeColor }, customVariant),\n ...(stickyHeader ? stickyHeaderStyles(theme, densityConfig) : {}),\n ...(hoverable ? hoverableRowStyles(theme) : {}),\n ...emphasisStyles(theme, glow, pulse),\n\n\n // Variant styles\n\n\n\n\n\n\n\n\n\n\n // Hoverable rows\n\n\n // Selection styles\n '& .MuiTableRow-root.selected': {\n backgroundColor: alpha(theme.palette.primary.main, 0.12),\n '&:hover': {\n backgroundColor: alpha(theme.palette.primary.main, 0.16) } },\n\n // Glow effect\n\n\n // Pulse animation\n\n\n // Both glow and pulse\n\n };\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/data-display/Table/TableParts.hooks.tsx","../src/components/data-display/Table/TableParts.tsx"],"sourcesContent":["import type React from 'react';\nimport { useCallback } from 'react';\n\nimport { TableDataRow } from './TableParts';\nimport type { TableBodyProps } from './Table.types';\n\n// Row identity, selection and the row element itself. Split out of\n// EnhancedTableBody so that component is just the virtualised/plain choice.\n// A row's identity: the caller's extractor, else its id, else its position.\nconst useRowKey = (rowKeyExtractor: TableBodyProps['rowKeyExtractor']) =>\n useCallback(\n (rowData: Record<string, unknown>, index: number): string | number =>\n rowKeyExtractor ? rowKeyExtractor(rowData, index) : (rowData.id as string | number) || index,\n [rowKeyExtractor],\n );\n\nconst useRowSelection = ({\n selectedRows,\n onSelectionChange,\n}: {\n selectedRows: Array<string | number>;\n onSelectionChange: TableBodyProps['onSelectionChange'];\n}) =>\n useCallback(\n (event: React.MouseEvent | React.ChangeEvent, rowKey: string | number) => {\n // Stop propagation so selecting does not also fire the row click.\n event.stopPropagation();\n if (!onSelectionChange) return;\n onSelectionChange(rowKey, !selectedRows.includes(rowKey));\n },\n [onSelectionChange, selectedRows],\n );\n\nexport const useTableRowRenderer = ({\n columns,\n selectedRows,\n onRowClick,\n onRowFocus,\n onRowBlur,\n onSelectionChange,\n rowKeyExtractor,\n selectable,\n renderRow,\n renderCell,\n virtualScrolling,\n rowHeight,\n}: Pick<\n TableBodyProps,\n | 'columns'\n | 'onRowClick'\n | 'onRowFocus'\n | 'onRowBlur'\n | 'onSelectionChange'\n | 'rowKeyExtractor'\n | 'selectable'\n | 'renderRow'\n | 'renderCell'\n | 'virtualScrolling'\n | 'rowHeight'\n> & { selectedRows: Array<string | number> }) => {\n const getRowKey = useRowKey(rowKeyExtractor);\n const isRowSelected = useCallback(\n (rowKey: string | number) => selectedRows.includes(rowKey),\n [selectedRows],\n );\n const handleRowSelection = useRowSelection({ selectedRows, onSelectionChange });\n\n const renderTableRow = useCallback(\n (rowData: Record<string, unknown>, index: number, offsetY: number = 0) => {\n const rowKey = getRowKey(rowData, index);\n const selected = isRowSelected(rowKey);\n\n if (renderRow) return renderRow(rowData, index, selected);\n\n return (\n <TableDataRow\n key={rowKey}\n rowData={rowData}\n rowKey={rowKey}\n index={index}\n offsetY={offsetY}\n columns={columns}\n selected={selected}\n selectable={selectable}\n rowHeight={rowHeight}\n onRowClick={onRowClick}\n onRowFocus={onRowFocus}\n onRowBlur={onRowBlur}\n onSelect={handleRowSelection}\n virtualScrolling={virtualScrolling}\n renderCell={renderCell}\n />\n );\n },\n [\n columns,\n getRowKey,\n isRowSelected,\n handleRowSelection,\n onRowClick,\n onRowFocus,\n onRowBlur,\n renderRow,\n renderCell,\n rowHeight,\n selectable,\n virtualScrolling,\n ],\n );\n\n return renderTableRow;\n};\n","import Checkbox from '@mui/material/Checkbox/index.js';\nimport TableBody from '@mui/material/TableBody/index.js';\nimport TableCell from '@mui/material/TableCell/index.js';\nimport TableHead from '@mui/material/TableHead/index.js';\nimport TableRow from '@mui/material/TableRow/index.js';\nimport TableSortLabel from '@mui/material/TableSortLabel/index.js';\nimport { useTheme, type Theme } from '@mui/material/styles/index.js';\nimport React, { useCallback } from 'react';\n\nimport { rem } from '../../../tokens/relative';\n\nimport { tableRowHeight } from './Table.helpers';\nimport { useTableRowRenderer } from './TableParts.hooks';\nimport type { ColumnConfig, TableBodyProps, TableHeaderProps, VirtualWindow } from './Table.types';\n\n// Mirrors the visible sort indicator for assistive technology; undefined when\n// the column is not sorted, which is what removes the attribute entirely.\nconst ariaSortFor = (\n canSort: boolean,\n isSorted: boolean,\n direction?: 'asc' | 'desc',\n): 'ascending' | 'descending' | undefined => {\n if (!canSort || !isSorted) return undefined;\n\n return direction === 'asc' ? 'ascending' : 'descending';\n};\n\n/** A column's `width`/`minWidth` as CSS: a number is design px, a string as given. */\nconst columnLength = (theme: Theme, value: number | string | undefined): string | undefined =>\n typeof value === 'number' ? rem(theme, value) : value;\n\n// One header cell. Sorting is offered when the table is sortable and the column\n// has not opted out; aria-sort mirrors the visible indicator.\nconst HeaderCell: React.FC<{\n column: ColumnConfig;\n sortable?: boolean;\n sortConfig?: { key: string; direction: 'asc' | 'desc' };\n onSort: (columnKey: string) => void;\n}> = ({ column, sortable, sortConfig, onSort }) => {\n const theme = useTheme();\n const canSort = Boolean(sortable) && column.sortable !== false;\n const isSorted = sortConfig?.key === column.key;\n\n return (\n <TableCell\n align={column.align || 'left'}\n style={{\n minWidth: columnLength(theme, column.minWidth),\n width: columnLength(theme, column.width),\n }}\n aria-sort={ariaSortFor(canSort, isSorted, sortConfig?.direction)}\n >\n {canSort ? (\n <TableSortLabel\n active={isSorted}\n direction={isSorted ? sortConfig?.direction : 'asc'}\n onClick={() => onSort(column.key)}\n data-testid=\"sort-indicator\"\n aria-label={`Sort by ${column.label}`}\n >\n {column.label}\n </TableSortLabel>\n ) : (\n column.label\n )}\n </TableCell>\n );\n};\n\nexport const EnhancedTableHeader: React.FC<TableHeaderProps> = React.memo(({\n columns,\n data,\n sortable,\n sortConfig,\n onSortChange,\n selectable,\n selectedRows = [],\n onSelectAll,\n headRef }) => {\n const handleSort = useCallback(\n (columnKey: string) => {\n if (!sortable || !onSortChange) return;\n \n const direction = \n sortConfig?.key === columnKey && sortConfig.direction === 'asc' ? 'desc' : 'asc';\n onSortChange(columnKey, direction);\n },\n [sortable, onSortChange, sortConfig]\n );\n\n const handleSelectAll = useCallback(\n (event: React.ChangeEvent<globalThis.HTMLInputElement>) => {\n if (!onSelectAll) return;\n onSelectAll(event.target.checked);\n },\n [onSelectAll]\n );\n\n return (\n <TableHead ref={headRef}>\n <TableRow>\n {selectable && (\n <TableCell padding=\"checkbox\">\n <Checkbox\n indeterminate={selectedRows.length > 0 && selectedRows.length < data.length}\n checked={selectedRows.length === data.length && data.length > 0}\n onChange={handleSelectAll}\n inputProps={{ 'aria-label': 'select all' }}\n />\n </TableCell>\n )}\n {columns.map((column) => (\n <HeaderCell\n key={column.key}\n column={column}\n sortable={sortable}\n sortConfig={sortConfig}\n onSort={handleSort}\n />\n ))}\n </TableRow>\n </TableHead>\n );\n});\n\nEnhancedTableHeader.displayName = 'EnhancedTableHeader';\n\n// One data row. Split out of the memoised renderTableRow callback so the\n// callback stays a short dispatch and the row markup is readable on its own.\nexport const TableDataRow: React.FC<{\n rowData: Record<string, unknown>;\n rowKey: string | number;\n index: number;\n /** Where a virtualised row sits, in design px — drawn through `rem`, like its height. */\n offsetY: number;\n columns: ColumnConfig[];\n selected: boolean;\n selectable?: boolean;\n /** Design px; 52 when unset (`tableRowHeight`). */\n rowHeight?: number;\n onRowClick?: TableBodyProps['onRowClick'];\n onRowFocus?: TableBodyProps['onRowFocus'];\n onRowBlur?: TableBodyProps['onRowBlur'];\n onSelect: (event: React.MouseEvent | React.ChangeEvent, rowKey: string | number) => void;\n virtualScrolling?: boolean;\n renderCell?: TableBodyProps['renderCell'];\n}> = ({\n rowData,\n rowKey,\n index,\n offsetY,\n columns,\n selected,\n selectable,\n rowHeight,\n onRowClick,\n onRowFocus,\n onRowBlur,\n onSelect,\n virtualScrolling,\n renderCell }) => {\n const theme = useTheme();\n return (\n <TableRow\n key={String(rowKey)}\n selected={selected}\n className={selected ? 'selected' : ''}\n onClick={(event: React.MouseEvent<globalThis.HTMLTableRowElement>) => onRowClick?.(event, rowData)}\n onFocus={(event: React.FocusEvent<globalThis.HTMLTableRowElement>) => onRowFocus?.(event, rowData)}\n onBlur={(event: React.FocusEvent<globalThis.HTMLTableRowElement>) => onRowBlur?.(event, rowData)}\n style={virtualScrolling ? { \n transform: `translateY(${rem(theme, offsetY)})`,\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n height: rem(theme, tableRowHeight(rowHeight)) } : undefined}\n >\n {selectable && (\n <TableCell padding=\"checkbox\">\n <Checkbox\n checked={selected}\n onChange={(event) => onSelect(event, rowKey)}\n onClick={(event) => event.stopPropagation()}\n inputProps={{ 'aria-label': `select row ${index + 1}` }}\n />\n </TableCell>\n )}\n {columns.map((column) => {\n const value = rowData[column.key];\n return (\n <TableCell key={column.key} align={column.align || 'left'}>\n {renderCell \n ? renderCell(value, column, rowData, index)\n : column.render \n ? column.render(value, rowData) \n : (value as React.ReactNode)\n }\n </TableCell>\n );\n })}\n </TableRow>\n );\n};\n\n// Only the rows in view are rendered, positioned by absolute offset inside a\n// body sized to the full data set. `rowHeight` and every offset are design px,\n// drawn through `rem`. The `<tbody>` sits directly in the `<table>`; the one\n// scroll container wraps the whole table, header included (FUT-2658).\nconst VirtualisedBody: React.FC<{\n visibleItems: VirtualWindow;\n rowHeight: number;\n renderTableRow: (\n rowData: Record<string, unknown>,\n index: number,\n offsetY?: number,\n ) => React.ReactNode;\n}> = ({ visibleItems, rowHeight, renderTableRow }) => (\n <TableBody\n style={{\n height: visibleItems.totalHeight,\n position: 'relative' }}\n >\n {visibleItems.items.map((rowData, index) => \n renderTableRow(rowData, visibleItems.startIndex + index, visibleItems.offsetY + index * rowHeight)\n )}\n </TableBody>\n);\n\nconst PlainBody: React.FC<{\n data: TableBodyProps['data'];\n renderTableRow: (rowData: Record<string, unknown>, index: number) => React.ReactNode;\n}> = ({ data, renderTableRow }) => (\n\n <TableBody>\n {data.map((rowData, index) => renderTableRow(rowData, index))}\n </TableBody>\n);\n\n// Enhanced Table Body Component \nexport const EnhancedTableBody: React.FC<TableBodyProps> = React.memo((props) => {\n const { data, virtualWindow } = props;\n // The row renderer takes the body's own props; its `rowHeight` stays the\n // caller's design px, and the row resolves the default where it draws it.\n const renderTableRow = useTableRowRenderer({ ...props, selectedRows: props.selectedRows ?? [] });\n\n if (virtualWindow) {\n return (\n <VirtualisedBody\n visibleItems={virtualWindow}\n rowHeight={tableRowHeight(props.rowHeight)}\n renderTableRow={renderTableRow}\n />\n );\n }\n\n return (\n <PlainBody data={data} renderTableRow={renderTableRow} />\n );\n});\n\nEnhancedTableBody.displayName = 'EnhancedTableBody';\n\n// Main Table Component\n"],"mappings":"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","names":["useCallback","jsx","useCallback"]}