@12-apps/ui 6.51.0 → 6.52.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (538) hide show
  1. package/components-guidelines.md +6 -2
  2. package/dist/_internal/components/data-display/Alert/Alert.js +3 -3
  3. package/dist/_internal/components/data-display/Alert/Alert.metrics.js +3 -3
  4. package/dist/_internal/components/data-display/Alert/Alert.styles.js +3 -3
  5. package/dist/_internal/components/data-display/Badge/Badge.js +7 -7
  6. package/dist/_internal/components/data-display/Badge/Badge.styles.js +5 -5
  7. package/dist/_internal/components/data-display/Badge/BadgeContent.js +5 -5
  8. package/dist/_internal/components/data-display/Banner/Banner.js +3 -3
  9. package/dist/_internal/components/data-display/Banner/Banner.styles.js +3 -3
  10. package/dist/_internal/components/data-display/CardKit/CardKebab.js +3 -3
  11. package/dist/_internal/components/data-display/CardKit/card-actions-context.js +3 -3
  12. package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js +3 -3
  13. package/dist/_internal/components/data-display/CardKit/use-row-confirm.js +3 -3
  14. package/dist/_internal/components/data-display/Carousel/Carousel.chrome.js +5 -5
  15. package/dist/_internal/components/data-display/Carousel/Carousel.js +5 -5
  16. package/dist/_internal/components/data-display/Carousel/Carousel.parts.js +5 -5
  17. package/dist/_internal/components/data-display/Carousel/Carousel.styles.js +5 -5
  18. package/dist/_internal/components/data-display/Chart/Chart.js +8 -8
  19. package/dist/_internal/components/data-display/Chart/SpecChart.js +10 -10
  20. package/dist/_internal/components/data-display/Chart/chart-context.js +5 -5
  21. package/dist/_internal/components/data-display/Chart/chart-internals.js +5 -5
  22. package/dist/_internal/components/data-display/Chart/chart-renderers.js +7 -7
  23. package/dist/_internal/components/data-display/Chip/Chip.js +3 -3
  24. package/dist/_internal/components/data-display/Chip/Chip.styles.js +2 -2
  25. package/dist/_internal/components/data-display/DataGrid/DataGrid.js +3 -15
  26. package/dist/_internal/components/data-display/DataGrid/DataGrid.model.js +1 -15
  27. package/dist/_internal/components/data-display/DataViews/DataViewsBoard.js +6 -6
  28. package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +45 -49
  29. package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +54 -58
  30. package/dist/_internal/components/data-display/DataViews/DeleteViewDialog.js +9 -9
  31. package/dist/_internal/components/data-display/DataViews/ManageViewsDialog.js +9 -9
  32. package/dist/_internal/components/data-display/DataViews/SaveViewModal.js +10 -10
  33. package/dist/_internal/components/data-display/DataViews/base-card.js +8 -8
  34. package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +10 -18
  35. package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +9 -17
  36. package/dist/_internal/components/data-display/DataViews/base-list-card.js +13 -21
  37. package/dist/_internal/components/data-display/DataViews/data-views-bar-controls.js +1 -1
  38. package/dist/_internal/components/data-display/DataViews/data-views-category-pill.js +7 -7
  39. package/dist/_internal/components/data-display/DataViews/data-views-columns-tab.js +6 -6
  40. package/dist/_internal/components/data-display/DataViews/data-views-columns.js +3 -3
  41. package/dist/_internal/components/data-display/DataViews/data-views-day-input.js +1 -1
  42. package/dist/_internal/components/data-display/DataViews/data-views-display-panel.js +10 -14
  43. package/dist/_internal/components/data-display/DataViews/data-views-display-tabs.js +7 -15
  44. package/dist/_internal/components/data-display/DataViews/data-views-empty.js +6 -6
  45. package/dist/_internal/components/data-display/DataViews/data-views-export.js +6 -6
  46. package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +12 -12
  47. package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +13 -17
  48. package/dist/_internal/components/data-display/DataViews/data-views-grid-helpers.js +3 -3
  49. package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +41 -45
  50. package/dist/_internal/components/data-display/DataViews/data-views-header-row.js +6 -6
  51. package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +16 -16
  52. package/dist/_internal/components/data-display/DataViews/data-views-layout-context.js +1 -14
  53. package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +14 -14
  54. package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +15 -15
  55. package/dist/_internal/components/data-display/DataViews/data-views-number-input.js +1 -1
  56. package/dist/_internal/components/data-display/DataViews/data-views-pagination.js +4 -4
  57. package/dist/_internal/components/data-display/DataViews/data-views-range-pill.js +3 -3
  58. package/dist/_internal/components/data-display/DataViews/data-views-scope-tabs.js +2 -13
  59. package/dist/_internal/components/data-display/DataViews/data-views-search.js +1 -1
  60. package/dist/_internal/components/data-display/DataViews/data-views-select-all-strip.js +6 -6
  61. package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +14 -18
  62. package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +13 -13
  63. package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +13 -17
  64. package/dist/_internal/components/data-display/DataViews/data-views-view-nav.js +6 -6
  65. package/dist/_internal/components/data-display/DataViews/list-card-rails.js +2 -13
  66. package/dist/_internal/components/data-display/DataViews/save-view-preview.js +6 -6
  67. package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +6 -6
  68. package/dist/_internal/components/data-display/DescriptionItem/DescriptionItem.js +6 -6
  69. package/dist/_internal/components/data-display/FleetMap/FleetBody.js +8 -8
  70. package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js +7 -7
  71. package/dist/_internal/components/data-display/FleetMap/FleetMap.js +13 -13
  72. package/dist/_internal/components/data-display/HoverCard/HoverCard.js +2 -2
  73. package/dist/_internal/components/data-display/LazyImage/LazyImage.js +1 -1
  74. package/dist/_internal/components/data-display/Lightbox/Lightbox.js +7 -7
  75. package/dist/_internal/components/data-display/Lightbox/LightboxControls.js +2 -2
  76. package/dist/_internal/components/data-display/Lightbox/LightboxOverlay.js +3 -3
  77. package/dist/_internal/components/data-display/Lightbox/LightboxThumbnails.js +2 -2
  78. package/dist/_internal/components/data-display/MapPreview/MapLayers.js +3 -3
  79. package/dist/_internal/components/data-display/MapPreview/MapPreview.js +6 -6
  80. package/dist/_internal/components/data-display/MapPreview/MapSearchBar.js +1 -1
  81. package/dist/_internal/components/data-display/Progress/Progress.js +6 -6
  82. package/dist/_internal/components/data-display/Progress/Progress.metrics.js +4 -4
  83. package/dist/_internal/components/data-display/Progress/Progress.styles.js +5 -5
  84. package/dist/_internal/components/data-display/Sheet/Sheet.body.js +5 -5
  85. package/dist/_internal/components/data-display/Sheet/Sheet.js +5 -5
  86. package/dist/_internal/components/data-display/Sheet/Sheet.styles.js +5 -5
  87. package/dist/_internal/components/data-display/Table/Table.helpers.js +1 -1
  88. package/dist/_internal/components/data-display/Table/Table.js +3 -14
  89. package/dist/_internal/components/data-display/Table/TableParts.hooks.js +2 -2
  90. package/dist/_internal/components/data-display/Table/TableParts.js +2 -2
  91. package/dist/_internal/components/data-display/index.js +45 -45
  92. package/dist/_internal/components/feedback/ConfirmAction/ConfirmButton.js +3 -3
  93. package/dist/_internal/components/feedback/Dialog/Dialog.js +3 -3
  94. package/dist/_internal/components/feedback/NotificationStatusNotice/NotificationStatusNotice.js +5 -5
  95. package/dist/_internal/components/feedback/StackedModal/StackedModal.js +2 -2
  96. package/dist/_internal/components/feedback/index.js +10 -10
  97. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.hooks.js +3 -3
  98. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.js +6 -6
  99. package/dist/_internal/components/form/AddressAutocomplete/AddressAutocompleteField.js +3 -3
  100. package/dist/_internal/components/form/AddressAutocomplete/AddressFallbackField.js +1 -1
  101. package/dist/_internal/components/form/AddressAutocomplete/AddressInputField.js +1 -1
  102. package/dist/_internal/components/form/AddressAutocomplete/AddressTextField.js +1 -1
  103. package/dist/_internal/components/form/Autocomplete/Autocomplete.js +1 -1
  104. package/dist/_internal/components/form/Autocomplete/Autocomplete.parts.js +1 -1
  105. package/dist/_internal/components/form/Button/Button.js +3 -3
  106. package/dist/_internal/components/form/Button/Button.styles.js +3 -3
  107. package/dist/_internal/components/form/CategorySelect/CategoryPanel.js +3 -3
  108. package/dist/_internal/components/form/CategorySelect/CategoryPanelFoot.js +1 -1
  109. package/dist/_internal/components/form/CategorySelect/CategoryPanelHead.js +1 -1
  110. package/dist/_internal/components/form/CategorySelect/CategoryPanelList.js +1 -1
  111. package/dist/_internal/components/form/CategorySelect/CategoryRows.js +1 -1
  112. package/dist/_internal/components/form/CategorySelect/CategorySelect.js +5 -5
  113. package/dist/_internal/components/form/CategorySelect/CategorySelect.styles.js +1 -1
  114. package/dist/_internal/components/form/CategorySelect/CategoryTrigger.js +1 -1
  115. package/dist/_internal/components/form/CepField/CepField.js +1 -1
  116. package/dist/_internal/components/form/Command/Command.js +7 -7
  117. package/dist/_internal/components/form/Command/Command.styles.js +5 -5
  118. package/dist/_internal/components/form/CreatableSelect/CreatableSelect.js +1 -1
  119. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.hooks.js +1 -1
  120. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.js +4 -4
  121. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.range.js +1 -1
  122. package/dist/_internal/components/form/DateRangePicker/DateRangePickerFields.js +1 -1
  123. package/dist/_internal/components/form/Input/Input.js +1 -1
  124. package/dist/_internal/components/form/Input/Input.styles.js +1 -1
  125. package/dist/_internal/components/form/InputOTP/InputOTP.js +1 -1
  126. package/dist/_internal/components/form/InputOTP/InputOTP.styles.js +1 -1
  127. package/dist/_internal/components/form/Label/Label.js +5 -5
  128. package/dist/_internal/components/form/Label/Label.styles.js +5 -5
  129. package/dist/_internal/components/form/Menubar/Menubar.item.js +5 -5
  130. package/dist/_internal/components/form/Menubar/Menubar.js +5 -5
  131. package/dist/_internal/components/form/Menubar/Menubar.styles.js +5 -5
  132. package/dist/_internal/components/form/Menubar/Menubar.toolbar.js +5 -5
  133. package/dist/_internal/components/form/NumberField/NumberField.js +1 -1
  134. package/dist/_internal/components/form/PhoneInput/PhoneInput.js +1 -1
  135. package/dist/_internal/components/form/RadioGroup/RadioGroup.js +1 -1
  136. package/dist/_internal/components/form/RadioGroup/RadioGroup.styles.js +1 -1
  137. package/dist/_internal/components/form/RadioGroup/RadioGroup.variants.js +1 -1
  138. package/dist/_internal/components/form/Select/Select.js +1 -1
  139. package/dist/_internal/components/form/Select/Select.menu.js +1 -1
  140. package/dist/_internal/components/form/Select/Select.searchable.js +1 -1
  141. package/dist/_internal/components/form/Select/Select.styles.js +1 -1
  142. package/dist/_internal/components/form/Switch/Switch.js +3 -3
  143. package/dist/_internal/components/form/Switch/Switch.parts.js +3 -3
  144. package/dist/_internal/components/form/Switch/Switch.styles.js +3 -3
  145. package/dist/_internal/components/form/Textarea/Textarea.js +2 -2
  146. package/dist/_internal/components/form/Textarea/TextareaRichEditor.js +1 -1
  147. package/dist/_internal/components/form/Toggle/Toggle.js +1 -1
  148. package/dist/_internal/components/form/Toggle/Toggle.styles.js +1 -1
  149. package/dist/_internal/components/form/ToggleGroup/ToggleGroup.js +1 -1
  150. package/dist/_internal/components/form/index.js +18 -18
  151. package/dist/_internal/components/form/total-form/Fields/CategoryField.js +6 -6
  152. package/dist/_internal/components/form/total-form/Fields/CepField.js +1 -1
  153. package/dist/_internal/components/form/total-form/Fields/SelectField.js +1 -1
  154. package/dist/_internal/components/form/total-form/Fields/TextField.js +1 -1
  155. package/dist/_internal/components/form/total-form/Fields/ToggleField.js +1 -1
  156. package/dist/_internal/components/form/total-form/Fields/index.js +10 -10
  157. package/dist/_internal/components/form/total-form/SubmitButton.js +3 -3
  158. package/dist/_internal/components/index.js +99 -98
  159. package/dist/_internal/components/layout/Box/Box.js +8 -8
  160. package/dist/_internal/components/layout/Card/Card.js +2 -2
  161. package/dist/_internal/components/layout/ContentToolbar/ColumnsMenu.js +1 -1
  162. package/dist/_internal/components/layout/ContentToolbar/FilterTrigger.js +1 -1
  163. package/dist/_internal/components/layout/ContentToolbar/MultiSelectDropdown.js +1 -1
  164. package/dist/_internal/components/layout/ContentToolbar/MultiSelectTriggers.js +1 -1
  165. package/dist/_internal/components/layout/ContentToolbar/SavedViewsMenu.js +1 -1
  166. package/dist/_internal/components/layout/ContentToolbar/SortByDropdown.js +1 -1
  167. package/dist/_internal/components/layout/ContentToolbar/ViewSelector.js +1 -1
  168. package/dist/_internal/components/layout/ScrollArea/ScrollArea.js +2 -2
  169. package/dist/_internal/components/layout/SettingCard/SettingCard.js +13 -13
  170. package/dist/_internal/components/layout/SettingCard/SettingCard.parts.js +12 -12
  171. package/dist/_internal/components/layout/SettingCard/SettingGrid.js +13 -13
  172. package/dist/_internal/components/layout/SettingCard/SettingGroup.js +15 -15
  173. package/dist/_internal/components/layout/SettingCard/SettingSwitch.js +13 -13
  174. package/dist/_internal/components/layout/SettingCard/SettingToggle.js +15 -15
  175. package/dist/_internal/components/layout/Stack/Stack.js +9 -9
  176. package/dist/_internal/components/layout/TableFilter/TableFilter.js +1 -1
  177. package/dist/_internal/components/layout/index.js +25 -25
  178. package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js +9 -9
  179. package/dist/_internal/components/navigation/AppHeader/AppHeader.identity.js +5 -5
  180. package/dist/_internal/components/navigation/NavigationMenu/NavigationMegaSection.js +2 -2
  181. package/dist/_internal/components/navigation/NavigationMenu/NavigationMenu.js +4 -4
  182. package/dist/_internal/components/navigation/NavigationMenu/NavigationStandardBody.js +2 -2
  183. package/dist/_internal/components/navigation/Pagination/Pagination.js +3 -3
  184. package/dist/_internal/components/navigation/Pagination/PaginationParts.js +1 -1
  185. package/dist/_internal/components/navigation/SectionNav/SectionNav.bar.js +12 -11
  186. package/dist/_internal/components/navigation/SectionNav/SectionNav.js +15 -13
  187. package/dist/_internal/components/navigation/SectionNav/SectionNav.parts.js +8 -8
  188. package/dist/_internal/components/navigation/SectionNav/SectionNav.primary.js +9 -9
  189. package/dist/_internal/components/navigation/SectionNav/SectionNav.rail.js +10 -9
  190. package/dist/_internal/components/navigation/SectionNav/SectionNav.railCreate.js +41 -0
  191. package/dist/_internal/components/navigation/SectionNav/SectionNav.railCreate.js.map +1 -0
  192. package/dist/_internal/components/navigation/SectionNav/SectionNav.sheet.js +9 -9
  193. package/dist/_internal/components/navigation/SectionNav/__stories__/fixtures.js +5 -5
  194. package/dist/_internal/components/navigation/Tabs/Tabs.js +1 -1
  195. package/dist/_internal/components/navigation/Tabs/Tabs.styles.js +1 -1
  196. package/dist/_internal/components/navigation/index.js +25 -23
  197. package/dist/_internal/components/typography/Heading/Heading.js +6 -6
  198. package/dist/_internal/components/typography/Heading/Heading.metrics.js +4 -4
  199. package/dist/_internal/components/typography/Heading/Heading.styles.js +5 -5
  200. package/dist/_internal/components/typography/Text/Text.js +5 -5
  201. package/dist/_internal/components/typography/Text/Text.metrics.js +4 -4
  202. package/dist/_internal/components/typography/index.js +8 -8
  203. package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.helpers.js +5 -5
  204. package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.js +5 -5
  205. package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.parts.js +5 -5
  206. package/dist/_internal/components/utility/WorkflowStep/WorkflowStepRow.js +5 -5
  207. package/dist/_internal/components/utility/index.js +5 -5
  208. package/dist/_internal/icons/Icon.js +8 -8
  209. package/dist/_internal/provider/UiProvider.js +7 -7
  210. package/dist/_internal/provider/mui-bridge.js +6 -6
  211. package/dist/_internal/provider/use-ui-theme.js +7 -7
  212. package/dist/_internal/social-login-button/social-login-button.js +11 -11
  213. package/dist/_internal/tokens/density.js +2 -2
  214. package/dist/_internal/tokens/field-height.js +1 -1
  215. package/dist/_internal/tokens/theme.js +3 -3
  216. package/dist/_internal/user-avatar/user-avatar.js +8 -8
  217. package/dist/charts.js +11 -11
  218. package/dist/{chunk-ROSYXRNN.js → chunk-2OTBMU5Z.js} +4 -4
  219. package/dist/{chunk-LPCPS5GZ.js → chunk-3QGMAVUF.js} +4 -4
  220. package/dist/{chunk-D4YPZILH.js → chunk-46MO2WZL.js} +6 -6
  221. package/dist/{chunk-EATBLXBP.js → chunk-4E4MSUY5.js} +4 -4
  222. package/dist/{chunk-ZOUWHGV3.js → chunk-4MGFUPQT.js} +4 -4
  223. package/dist/{chunk-RRG75JJS.js → chunk-4SHMSLFA.js} +2 -2
  224. package/dist/{chunk-YDLJE654.js → chunk-4XET5MWR.js} +2 -2
  225. package/dist/{chunk-J2SFOLGZ.js → chunk-4XHVGUOM.js} +2 -2
  226. package/dist/{chunk-MKJ4FMEF.js → chunk-4ZTHVUXE.js} +2 -2
  227. package/dist/{chunk-5N2UJOCT.js → chunk-57VL5UX7.js} +3 -3
  228. package/dist/{chunk-HGVWYKD4.js → chunk-67LNVBFO.js} +3 -3
  229. package/dist/{chunk-DJCAXJ2R.js → chunk-6J54X3ES.js} +4 -4
  230. package/dist/{chunk-JMMFRTZP.js → chunk-6PYX6V3R.js} +4 -4
  231. package/dist/{chunk-WL7IG7TT.js → chunk-6REPQ352.js} +2 -2
  232. package/dist/chunk-76FANB5I.js +126 -0
  233. package/dist/chunk-76FANB5I.js.map +1 -0
  234. package/dist/{chunk-UXJUTMAY.js → chunk-7GQ2ZZBQ.js} +2 -2
  235. package/dist/{chunk-GPROISHG.js → chunk-7TWZZD7R.js} +2 -2
  236. package/dist/{chunk-DLO5V4AV.js → chunk-7XSICFOJ.js} +3 -3
  237. package/dist/{chunk-S4ZUZ6DS.js → chunk-BAGLUQM3.js} +2 -2
  238. package/dist/{chunk-YK4ZG5Y4.js → chunk-BE5FGUJS.js} +2 -2
  239. package/dist/{chunk-M2GVHVE4.js → chunk-CJ45OL7L.js} +2 -2
  240. package/dist/{chunk-ZR33DDTI.js → chunk-CTXF22BU.js} +4 -4
  241. package/dist/{chunk-A436VORP.js → chunk-CVQYKXC5.js} +2 -2
  242. package/dist/{chunk-P7YUOH2E.js → chunk-CZV6NVCA.js} +4 -8
  243. package/dist/chunk-CZV6NVCA.js.map +1 -0
  244. package/dist/{chunk-MRWYKNBY.js → chunk-DFI2RKVQ.js} +2 -2
  245. package/dist/{chunk-SJ4IAZ3V.js → chunk-DH6J64PS.js} +1 -1
  246. package/dist/chunk-DH6J64PS.js.map +1 -0
  247. package/dist/{chunk-3U45DRNS.js → chunk-DI46ZEWP.js} +2 -2
  248. package/dist/{chunk-XYHNXO6Q.js → chunk-DWJH3KXN.js} +2 -2
  249. package/dist/{chunk-CDVYJB7J.js → chunk-E3GOREEB.js} +2 -2
  250. package/dist/{chunk-MYCR7FMI.js → chunk-E6JRPGMN.js} +9 -9
  251. package/dist/{chunk-K4BLVDYH.js → chunk-EIY5EYO3.js} +2 -2
  252. package/dist/{chunk-MG3SRQ6N.js → chunk-EOTV5BLM.js} +3 -3
  253. package/dist/{chunk-AY5MY7HJ.js → chunk-ERY6D2OV.js} +4 -4
  254. package/dist/{chunk-MT7XMJUJ.js → chunk-F33YKDO2.js} +12 -12
  255. package/dist/{chunk-TJ7NQG7E.js → chunk-FBUCXTA4.js} +4 -4
  256. package/dist/{chunk-32K4DRE5.js → chunk-FQTTVM2A.js} +2 -2
  257. package/dist/{chunk-4A535L3N.js → chunk-FRCBJLV5.js} +7 -7
  258. package/dist/{chunk-EACVF3GX.js → chunk-FRP7NM6X.js} +2 -2
  259. package/dist/{chunk-4B5WSVS7.js → chunk-FXZUVZON.js} +7 -7
  260. package/dist/{chunk-UI5O6J6R.js → chunk-FY6PONLA.js} +4 -4
  261. package/dist/{chunk-ABPTS3XK.js → chunk-G5XHAN56.js} +4 -4
  262. package/dist/{chunk-DSHM7VN6.js → chunk-G6ZPQHBL.js} +2 -2
  263. package/dist/{chunk-WLKCGWIV.js → chunk-GDYGT2KN.js} +4 -4
  264. package/dist/{chunk-HI3D6H37.js → chunk-GJRKWDRR.js} +4 -4
  265. package/dist/{chunk-TH7RBREI.js → chunk-GNHXFJRR.js} +4 -4
  266. package/dist/{chunk-KT5BEZEK.js → chunk-H7SOEZHW.js} +4 -4
  267. package/dist/{chunk-XMJ5AKDM.js → chunk-HCEJT65A.js} +5 -5
  268. package/dist/{chunk-HJUR6ZY6.js → chunk-HCYWRH5N.js} +3 -3
  269. package/dist/{chunk-WF4XK5AS.js → chunk-IWGW2E35.js} +2 -2
  270. package/dist/{chunk-AMSNWV7V.js → chunk-JK7SVLE2.js} +7 -7
  271. package/dist/{chunk-JLOMSSZD.js → chunk-JUHNEYCH.js} +3 -3
  272. package/dist/{chunk-NYHZUVLC.js → chunk-KN3WYEH2.js} +4 -4
  273. package/dist/{chunk-MPYIEIBA.js → chunk-KW3H5FUS.js} +2 -2
  274. package/dist/{chunk-OWILUXWM.js → chunk-LDROG4QI.js} +2 -12
  275. package/dist/chunk-LDROG4QI.js.map +1 -0
  276. package/dist/{chunk-YZHX2HTC.js → chunk-MKLIMY3D.js} +2 -2
  277. package/dist/{chunk-QWTPK3FT.js → chunk-MLDA44NW.js} +3 -3
  278. package/dist/{chunk-HDZQIFHL.js → chunk-MQ277OLB.js} +9 -9
  279. package/dist/{chunk-UDTA7YWD.js → chunk-NGAU6PNB.js} +5 -5
  280. package/dist/{chunk-742Z3VD3.js → chunk-NKJSYZEU.js} +5 -5
  281. package/dist/{chunk-GPTICJVN.js → chunk-OEBHWQSX.js} +3 -3
  282. package/dist/{chunk-W6YR35UL.js → chunk-OYT7YXQL.js} +5 -5
  283. package/dist/{chunk-RV26QUJS.js → chunk-OZPLAOI4.js} +5 -5
  284. package/dist/{chunk-BSEZ33G6.js → chunk-P35CTP6L.js} +3 -3
  285. package/dist/{chunk-TZASFX6G.js → chunk-P53KRCKW.js} +4 -4
  286. package/dist/{chunk-6IWO7CM2.js → chunk-PAT2BQOQ.js} +2 -2
  287. package/dist/{chunk-RCJOTNIW.js → chunk-PJVDIUT2.js} +5 -5
  288. package/dist/{chunk-BHPLHGZP.js → chunk-PM7SI4YT.js} +4 -4
  289. package/dist/{chunk-53HQNN3C.js → chunk-PY3RW5LC.js} +2 -2
  290. package/dist/{chunk-XLLJU5Q7.js → chunk-QEINKMMX.js} +2 -2
  291. package/dist/{chunk-5BV5DOW6.js → chunk-QHXMNSOZ.js} +2 -2
  292. package/dist/{chunk-H556NMKE.js → chunk-QMNNADL3.js} +6 -6
  293. package/dist/{chunk-VJBTFWDK.js → chunk-QQSRZUT4.js} +7 -7
  294. package/dist/{chunk-WNKRFMSI.js → chunk-QWBS22F4.js} +2 -2
  295. package/dist/{chunk-YG46LIVW.js → chunk-QYV7KLEN.js} +4 -4
  296. package/dist/{chunk-ESW4Z5I7.js → chunk-QZY5NG5N.js} +2 -2
  297. package/dist/{chunk-6B5NOR2U.js → chunk-SCCE6VWY.js} +2 -2
  298. package/dist/{chunk-L3MRRAZM.js → chunk-SLSED46V.js} +2 -2
  299. package/dist/chunk-SLSED46V.js.map +1 -0
  300. package/dist/{chunk-NJXDE6D3.js → chunk-SPZAEMGW.js} +9 -9
  301. package/dist/{chunk-TE3XYCX7.js → chunk-STTULW2K.js} +2 -2
  302. package/dist/{chunk-ZDMQDTSH.js → chunk-SV4FYSDL.js} +4 -4
  303. package/dist/{chunk-FDJLYYDA.js → chunk-SZA44EFA.js} +5 -5
  304. package/dist/{chunk-2VV6XZAU.js → chunk-TBZKUZNW.js} +4 -4
  305. package/dist/{chunk-KOBWXZNH.js → chunk-UFCULHHH.js} +2 -2
  306. package/dist/{chunk-FM5RBGG7.js → chunk-UHR7WIOR.js} +2 -2
  307. package/dist/{chunk-I2LF53MJ.js → chunk-UHX2LOT2.js} +3 -12
  308. package/dist/chunk-UHX2LOT2.js.map +1 -0
  309. package/dist/{chunk-AJ4MRDKM.js → chunk-UNEJ4MUR.js} +3 -3
  310. package/dist/{chunk-VAO63IIP.js → chunk-UOQ4AF2N.js} +3 -3
  311. package/dist/{chunk-FYTC4LOD.js → chunk-VEHMODO3.js} +2 -2
  312. package/dist/{chunk-4BI5PCOM.js → chunk-VJXC7VEB.js} +2 -2
  313. package/dist/{chunk-3VFYTZ7I.js → chunk-VVFASSFY.js} +4 -4
  314. package/dist/{chunk-VELGOFCL.js → chunk-VYWCBG3I.js} +13 -8
  315. package/dist/{chunk-VELGOFCL.js.map → chunk-VYWCBG3I.js.map} +1 -1
  316. package/dist/{chunk-IVJKILIX.js → chunk-VZ4VAQX3.js} +2 -2
  317. package/dist/{chunk-FR6BUKSJ.js → chunk-W3CGKCTR.js} +4 -4
  318. package/dist/{chunk-N2BVJAGH.js → chunk-WF7BZT6V.js} +2 -2
  319. package/dist/{chunk-HKEBTPKY.js → chunk-WM4KYIYQ.js} +6 -3
  320. package/dist/chunk-WM4KYIYQ.js.map +1 -0
  321. package/dist/{chunk-OP5JR5Q5.js → chunk-WN5PNP6F.js} +4 -4
  322. package/dist/{chunk-2AMYHIA7.js → chunk-WQRBHMP3.js} +1 -1
  323. package/dist/{chunk-F5BYZNXY.js → chunk-WV62BSWA.js} +2 -2
  324. package/dist/{chunk-C4QKXFZN.js → chunk-X66E5WSX.js} +3 -3
  325. package/dist/{chunk-L3CQTVFU.js → chunk-XAUKQZJK.js} +6 -6
  326. package/dist/{chunk-HF7V3RI5.js → chunk-XG5LPGRV.js} +2 -2
  327. package/dist/{chunk-II7Z5UB6.js → chunk-XNBX3M35.js} +4 -4
  328. package/dist/{chunk-5ZBFADBL.js → chunk-XSHWEUDB.js} +2 -2
  329. package/dist/{chunk-WKB4VWKQ.js → chunk-XW633XLR.js} +4 -4
  330. package/dist/{chunk-6WZUZHJM.js → chunk-YFODI4KT.js} +8 -8
  331. package/dist/{chunk-PXDJQQ6X.js → chunk-YVRLYDYN.js} +4 -4
  332. package/dist/{chunk-GNLNIEJD.js → chunk-ZTTFLIPH.js} +3 -3
  333. package/dist/{chunk-LO4M5D7T.js → chunk-ZUME25DS.js} +3 -3
  334. package/dist/data-display/Alert.js +3 -3
  335. package/dist/data-display/Badge.js +7 -7
  336. package/dist/data-display/Banner.js +3 -3
  337. package/dist/data-display/CardKit.js +6 -6
  338. package/dist/data-display/Carousel.js +5 -5
  339. package/dist/data-display/Chart.js +11 -11
  340. package/dist/data-display/Chip.js +3 -3
  341. package/dist/data-display/DataGrid.js +3 -15
  342. package/dist/data-display/DataViews.js +62 -66
  343. package/dist/data-display/DescriptionItem.js +6 -6
  344. package/dist/data-display/FleetMap.js +13 -13
  345. package/dist/data-display/HoverCard.js +2 -2
  346. package/dist/data-display/LazyImage.js +1 -1
  347. package/dist/data-display/Lightbox.js +7 -7
  348. package/dist/data-display/MapPreview.js +6 -6
  349. package/dist/data-display/Progress.js +6 -6
  350. package/dist/data-display/Sheet.js +5 -5
  351. package/dist/data-display/Table.js +3 -14
  352. package/dist/feedback/ConfirmAction.js +3 -3
  353. package/dist/feedback/Dialog.js +3 -3
  354. package/dist/feedback/NotificationStatusNotice.js +5 -5
  355. package/dist/feedback/StackedModal.js +2 -2
  356. package/dist/form/AddressAutocomplete.js +6 -6
  357. package/dist/form/Autocomplete.js +1 -1
  358. package/dist/form/Button.js +3 -3
  359. package/dist/form/CategorySelect.js +5 -5
  360. package/dist/form/CepField.js +1 -1
  361. package/dist/form/Command.js +7 -7
  362. package/dist/form/CreatableSelect.js +1 -1
  363. package/dist/form/DateRangePicker.js +6 -6
  364. package/dist/form/Input.js +1 -1
  365. package/dist/form/InputOTP.js +1 -1
  366. package/dist/form/Label.js +5 -5
  367. package/dist/form/MenuSelect.js +1 -1
  368. package/dist/form/Menubar.js +5 -5
  369. package/dist/form/NumberField.js +1 -1
  370. package/dist/form/PhoneInput.js +1 -1
  371. package/dist/form/RadioGroup.js +1 -1
  372. package/dist/form/Select.js +1 -1
  373. package/dist/form/Switch.js +3 -3
  374. package/dist/form/Textarea.js +2 -2
  375. package/dist/form/Toggle.js +1 -1
  376. package/dist/form/ToggleGroup.js +1 -1
  377. package/dist/form/total-form.js +12 -12
  378. package/dist/icons.js +8 -8
  379. package/dist/layout/Box.js +8 -8
  380. package/dist/layout/Card.js +2 -2
  381. package/dist/layout/ContentToolbar.js +4 -4
  382. package/dist/layout/ScrollArea.js +2 -2
  383. package/dist/layout/SettingCard.js +18 -18
  384. package/dist/layout/Stack.js +9 -9
  385. package/dist/layout/TableFilter.js +1 -1
  386. package/dist/navigation/AppHeader.js +9 -9
  387. package/dist/navigation/NavigationMenu.js +4 -4
  388. package/dist/navigation/Pagination.js +3 -3
  389. package/dist/navigation/SectionNav.js +15 -13
  390. package/dist/navigation/Tabs.js +1 -1
  391. package/dist/provider.js +8 -8
  392. package/dist/social-login-button.js +11 -11
  393. package/dist/tokens.js +19 -19
  394. package/dist/types/components/data-display/DataGrid/DataGrid.model.d.ts +3 -13
  395. package/dist/types/components/data-display/DataGrid/DataGrid.model.d.ts.map +1 -1
  396. package/dist/types/components/data-display/DataGrid/DataGrid.types.d.ts +6 -0
  397. package/dist/types/components/data-display/DataGrid/DataGrid.types.d.ts.map +1 -1
  398. package/dist/types/components/data-display/DataViews/data-views-layout-context.d.ts +0 -12
  399. package/dist/types/components/data-display/DataViews/data-views-layout-context.d.ts.map +1 -1
  400. package/dist/types/components/data-display/Table/Table.d.ts.map +1 -1
  401. package/dist/types/components/data-display/Table/Table.helpers.d.ts +15 -7
  402. package/dist/types/components/data-display/Table/Table.helpers.d.ts.map +1 -1
  403. package/dist/types/components/data-display/Table/Table.types.d.ts +4 -1
  404. package/dist/types/components/data-display/Table/Table.types.d.ts.map +1 -1
  405. package/dist/types/components/navigation/SectionNav/SectionNav.bar.d.ts.map +1 -1
  406. package/dist/types/components/navigation/SectionNav/SectionNav.rail.d.ts +3 -2
  407. package/dist/types/components/navigation/SectionNav/SectionNav.rail.d.ts.map +1 -1
  408. package/dist/types/components/navigation/SectionNav/SectionNav.railCreate.d.ts +24 -0
  409. package/dist/types/components/navigation/SectionNav/SectionNav.railCreate.d.ts.map +1 -0
  410. package/dist/types/components/navigation/SectionNav/SectionNav.types.d.ts +6 -5
  411. package/dist/types/components/navigation/SectionNav/SectionNav.types.d.ts.map +1 -1
  412. package/dist/types/tokens/density.d.ts +9 -3
  413. package/dist/types/tokens/density.d.ts.map +1 -1
  414. package/dist/typography/Heading.js +6 -6
  415. package/dist/typography/Text.js +5 -5
  416. package/dist/user-avatar.js +8 -8
  417. package/dist/utility/WorkflowStep.js +5 -5
  418. package/package.json +1 -1
  419. package/src/components/data-display/DataGrid/DataGrid.md +12 -1
  420. package/src/components/data-display/DataGrid/DataGrid.model.ts +7 -22
  421. package/src/components/data-display/DataGrid/DataGrid.types.ts +7 -1
  422. package/src/components/data-display/DataViews/data-views-layout-context.tsx +13 -20
  423. package/src/components/data-display/Table/Table.helpers.ts +23 -16
  424. package/src/components/data-display/Table/Table.md +11 -0
  425. package/src/components/data-display/Table/Table.tsx +2 -3
  426. package/src/components/data-display/Table/Table.types.ts +4 -1
  427. package/src/components/navigation/SectionNav/SectionNav.bar.tsx +5 -2
  428. package/src/components/navigation/SectionNav/SectionNav.md +7 -4
  429. package/src/components/navigation/SectionNav/SectionNav.rail.tsx +11 -8
  430. package/src/components/navigation/SectionNav/SectionNav.railCreate.tsx +148 -0
  431. package/src/components/navigation/SectionNav/SectionNav.types.ts +6 -5
  432. package/src/tokens/density.ts +9 -3
  433. package/dist/chunk-HKEBTPKY.js.map +0 -1
  434. package/dist/chunk-I2LF53MJ.js.map +0 -1
  435. package/dist/chunk-L3MRRAZM.js.map +0 -1
  436. package/dist/chunk-OWILUXWM.js.map +0 -1
  437. package/dist/chunk-P7YUOH2E.js.map +0 -1
  438. package/dist/chunk-SJ4IAZ3V.js.map +0 -1
  439. /package/dist/{chunk-ROSYXRNN.js.map → chunk-2OTBMU5Z.js.map} +0 -0
  440. /package/dist/{chunk-LPCPS5GZ.js.map → chunk-3QGMAVUF.js.map} +0 -0
  441. /package/dist/{chunk-D4YPZILH.js.map → chunk-46MO2WZL.js.map} +0 -0
  442. /package/dist/{chunk-EATBLXBP.js.map → chunk-4E4MSUY5.js.map} +0 -0
  443. /package/dist/{chunk-ZOUWHGV3.js.map → chunk-4MGFUPQT.js.map} +0 -0
  444. /package/dist/{chunk-RRG75JJS.js.map → chunk-4SHMSLFA.js.map} +0 -0
  445. /package/dist/{chunk-YDLJE654.js.map → chunk-4XET5MWR.js.map} +0 -0
  446. /package/dist/{chunk-J2SFOLGZ.js.map → chunk-4XHVGUOM.js.map} +0 -0
  447. /package/dist/{chunk-MKJ4FMEF.js.map → chunk-4ZTHVUXE.js.map} +0 -0
  448. /package/dist/{chunk-5N2UJOCT.js.map → chunk-57VL5UX7.js.map} +0 -0
  449. /package/dist/{chunk-HGVWYKD4.js.map → chunk-67LNVBFO.js.map} +0 -0
  450. /package/dist/{chunk-DJCAXJ2R.js.map → chunk-6J54X3ES.js.map} +0 -0
  451. /package/dist/{chunk-JMMFRTZP.js.map → chunk-6PYX6V3R.js.map} +0 -0
  452. /package/dist/{chunk-WL7IG7TT.js.map → chunk-6REPQ352.js.map} +0 -0
  453. /package/dist/{chunk-UXJUTMAY.js.map → chunk-7GQ2ZZBQ.js.map} +0 -0
  454. /package/dist/{chunk-GPROISHG.js.map → chunk-7TWZZD7R.js.map} +0 -0
  455. /package/dist/{chunk-DLO5V4AV.js.map → chunk-7XSICFOJ.js.map} +0 -0
  456. /package/dist/{chunk-S4ZUZ6DS.js.map → chunk-BAGLUQM3.js.map} +0 -0
  457. /package/dist/{chunk-YK4ZG5Y4.js.map → chunk-BE5FGUJS.js.map} +0 -0
  458. /package/dist/{chunk-M2GVHVE4.js.map → chunk-CJ45OL7L.js.map} +0 -0
  459. /package/dist/{chunk-ZR33DDTI.js.map → chunk-CTXF22BU.js.map} +0 -0
  460. /package/dist/{chunk-A436VORP.js.map → chunk-CVQYKXC5.js.map} +0 -0
  461. /package/dist/{chunk-MRWYKNBY.js.map → chunk-DFI2RKVQ.js.map} +0 -0
  462. /package/dist/{chunk-3U45DRNS.js.map → chunk-DI46ZEWP.js.map} +0 -0
  463. /package/dist/{chunk-XYHNXO6Q.js.map → chunk-DWJH3KXN.js.map} +0 -0
  464. /package/dist/{chunk-CDVYJB7J.js.map → chunk-E3GOREEB.js.map} +0 -0
  465. /package/dist/{chunk-MYCR7FMI.js.map → chunk-E6JRPGMN.js.map} +0 -0
  466. /package/dist/{chunk-K4BLVDYH.js.map → chunk-EIY5EYO3.js.map} +0 -0
  467. /package/dist/{chunk-MG3SRQ6N.js.map → chunk-EOTV5BLM.js.map} +0 -0
  468. /package/dist/{chunk-AY5MY7HJ.js.map → chunk-ERY6D2OV.js.map} +0 -0
  469. /package/dist/{chunk-MT7XMJUJ.js.map → chunk-F33YKDO2.js.map} +0 -0
  470. /package/dist/{chunk-TJ7NQG7E.js.map → chunk-FBUCXTA4.js.map} +0 -0
  471. /package/dist/{chunk-32K4DRE5.js.map → chunk-FQTTVM2A.js.map} +0 -0
  472. /package/dist/{chunk-4A535L3N.js.map → chunk-FRCBJLV5.js.map} +0 -0
  473. /package/dist/{chunk-EACVF3GX.js.map → chunk-FRP7NM6X.js.map} +0 -0
  474. /package/dist/{chunk-4B5WSVS7.js.map → chunk-FXZUVZON.js.map} +0 -0
  475. /package/dist/{chunk-UI5O6J6R.js.map → chunk-FY6PONLA.js.map} +0 -0
  476. /package/dist/{chunk-ABPTS3XK.js.map → chunk-G5XHAN56.js.map} +0 -0
  477. /package/dist/{chunk-DSHM7VN6.js.map → chunk-G6ZPQHBL.js.map} +0 -0
  478. /package/dist/{chunk-WLKCGWIV.js.map → chunk-GDYGT2KN.js.map} +0 -0
  479. /package/dist/{chunk-HI3D6H37.js.map → chunk-GJRKWDRR.js.map} +0 -0
  480. /package/dist/{chunk-TH7RBREI.js.map → chunk-GNHXFJRR.js.map} +0 -0
  481. /package/dist/{chunk-KT5BEZEK.js.map → chunk-H7SOEZHW.js.map} +0 -0
  482. /package/dist/{chunk-XMJ5AKDM.js.map → chunk-HCEJT65A.js.map} +0 -0
  483. /package/dist/{chunk-HJUR6ZY6.js.map → chunk-HCYWRH5N.js.map} +0 -0
  484. /package/dist/{chunk-WF4XK5AS.js.map → chunk-IWGW2E35.js.map} +0 -0
  485. /package/dist/{chunk-AMSNWV7V.js.map → chunk-JK7SVLE2.js.map} +0 -0
  486. /package/dist/{chunk-JLOMSSZD.js.map → chunk-JUHNEYCH.js.map} +0 -0
  487. /package/dist/{chunk-NYHZUVLC.js.map → chunk-KN3WYEH2.js.map} +0 -0
  488. /package/dist/{chunk-MPYIEIBA.js.map → chunk-KW3H5FUS.js.map} +0 -0
  489. /package/dist/{chunk-YZHX2HTC.js.map → chunk-MKLIMY3D.js.map} +0 -0
  490. /package/dist/{chunk-QWTPK3FT.js.map → chunk-MLDA44NW.js.map} +0 -0
  491. /package/dist/{chunk-HDZQIFHL.js.map → chunk-MQ277OLB.js.map} +0 -0
  492. /package/dist/{chunk-UDTA7YWD.js.map → chunk-NGAU6PNB.js.map} +0 -0
  493. /package/dist/{chunk-742Z3VD3.js.map → chunk-NKJSYZEU.js.map} +0 -0
  494. /package/dist/{chunk-GPTICJVN.js.map → chunk-OEBHWQSX.js.map} +0 -0
  495. /package/dist/{chunk-W6YR35UL.js.map → chunk-OYT7YXQL.js.map} +0 -0
  496. /package/dist/{chunk-RV26QUJS.js.map → chunk-OZPLAOI4.js.map} +0 -0
  497. /package/dist/{chunk-BSEZ33G6.js.map → chunk-P35CTP6L.js.map} +0 -0
  498. /package/dist/{chunk-TZASFX6G.js.map → chunk-P53KRCKW.js.map} +0 -0
  499. /package/dist/{chunk-6IWO7CM2.js.map → chunk-PAT2BQOQ.js.map} +0 -0
  500. /package/dist/{chunk-RCJOTNIW.js.map → chunk-PJVDIUT2.js.map} +0 -0
  501. /package/dist/{chunk-BHPLHGZP.js.map → chunk-PM7SI4YT.js.map} +0 -0
  502. /package/dist/{chunk-53HQNN3C.js.map → chunk-PY3RW5LC.js.map} +0 -0
  503. /package/dist/{chunk-XLLJU5Q7.js.map → chunk-QEINKMMX.js.map} +0 -0
  504. /package/dist/{chunk-5BV5DOW6.js.map → chunk-QHXMNSOZ.js.map} +0 -0
  505. /package/dist/{chunk-H556NMKE.js.map → chunk-QMNNADL3.js.map} +0 -0
  506. /package/dist/{chunk-VJBTFWDK.js.map → chunk-QQSRZUT4.js.map} +0 -0
  507. /package/dist/{chunk-WNKRFMSI.js.map → chunk-QWBS22F4.js.map} +0 -0
  508. /package/dist/{chunk-YG46LIVW.js.map → chunk-QYV7KLEN.js.map} +0 -0
  509. /package/dist/{chunk-ESW4Z5I7.js.map → chunk-QZY5NG5N.js.map} +0 -0
  510. /package/dist/{chunk-6B5NOR2U.js.map → chunk-SCCE6VWY.js.map} +0 -0
  511. /package/dist/{chunk-NJXDE6D3.js.map → chunk-SPZAEMGW.js.map} +0 -0
  512. /package/dist/{chunk-TE3XYCX7.js.map → chunk-STTULW2K.js.map} +0 -0
  513. /package/dist/{chunk-ZDMQDTSH.js.map → chunk-SV4FYSDL.js.map} +0 -0
  514. /package/dist/{chunk-FDJLYYDA.js.map → chunk-SZA44EFA.js.map} +0 -0
  515. /package/dist/{chunk-2VV6XZAU.js.map → chunk-TBZKUZNW.js.map} +0 -0
  516. /package/dist/{chunk-KOBWXZNH.js.map → chunk-UFCULHHH.js.map} +0 -0
  517. /package/dist/{chunk-FM5RBGG7.js.map → chunk-UHR7WIOR.js.map} +0 -0
  518. /package/dist/{chunk-AJ4MRDKM.js.map → chunk-UNEJ4MUR.js.map} +0 -0
  519. /package/dist/{chunk-VAO63IIP.js.map → chunk-UOQ4AF2N.js.map} +0 -0
  520. /package/dist/{chunk-FYTC4LOD.js.map → chunk-VEHMODO3.js.map} +0 -0
  521. /package/dist/{chunk-4BI5PCOM.js.map → chunk-VJXC7VEB.js.map} +0 -0
  522. /package/dist/{chunk-3VFYTZ7I.js.map → chunk-VVFASSFY.js.map} +0 -0
  523. /package/dist/{chunk-IVJKILIX.js.map → chunk-VZ4VAQX3.js.map} +0 -0
  524. /package/dist/{chunk-FR6BUKSJ.js.map → chunk-W3CGKCTR.js.map} +0 -0
  525. /package/dist/{chunk-N2BVJAGH.js.map → chunk-WF7BZT6V.js.map} +0 -0
  526. /package/dist/{chunk-OP5JR5Q5.js.map → chunk-WN5PNP6F.js.map} +0 -0
  527. /package/dist/{chunk-2AMYHIA7.js.map → chunk-WQRBHMP3.js.map} +0 -0
  528. /package/dist/{chunk-F5BYZNXY.js.map → chunk-WV62BSWA.js.map} +0 -0
  529. /package/dist/{chunk-C4QKXFZN.js.map → chunk-X66E5WSX.js.map} +0 -0
  530. /package/dist/{chunk-L3CQTVFU.js.map → chunk-XAUKQZJK.js.map} +0 -0
  531. /package/dist/{chunk-HF7V3RI5.js.map → chunk-XG5LPGRV.js.map} +0 -0
  532. /package/dist/{chunk-II7Z5UB6.js.map → chunk-XNBX3M35.js.map} +0 -0
  533. /package/dist/{chunk-5ZBFADBL.js.map → chunk-XSHWEUDB.js.map} +0 -0
  534. /package/dist/{chunk-WKB4VWKQ.js.map → chunk-XW633XLR.js.map} +0 -0
  535. /package/dist/{chunk-6WZUZHJM.js.map → chunk-YFODI4KT.js.map} +0 -0
  536. /package/dist/{chunk-PXDJQQ6X.js.map → chunk-YVRLYDYN.js.map} +0 -0
  537. /package/dist/{chunk-GNLNIEJD.js.map → chunk-ZTTFLIPH.js.map} +0 -0
  538. /package/dist/{chunk-LO4M5D7T.js.map → chunk-ZUME25DS.js.map} +0 -0
@@ -16,6 +16,7 @@ import {
16
16
  destinationControl,
17
17
  focusRing,
18
18
  } from './SectionNav.parts';
19
+ import { RailCreateMenu } from './SectionNav.railCreate';
19
20
  import type {
20
21
  SectionNavAction,
21
22
  SectionNavBack,
@@ -114,9 +115,10 @@ function RailHeading({ children }: { children: ReactNode }): React.JSX.Element {
114
115
  }
115
116
 
116
117
  /**
117
- * A menu's groups, listed under its title — nothing folded away on a wide
118
- * screen. A `disabled` menu has no trigger here to refuse, so every row of it
119
- * is inert instead.
118
+ * The `more` menu's groups, listed under its title — the rail has room for the
119
+ * places it holds. A `disabled` menu has no trigger here to refuse, so every
120
+ * row of it is inert instead. (`primary` folds behind one button instead —
121
+ * `RailCreateMenu`.)
120
122
  */
121
123
  function RailMenu({
122
124
  menu,
@@ -262,8 +264,9 @@ function RailDestination({
262
264
  }
263
265
 
264
266
  /**
265
- * The wide-screen layout: a vertical rail — the way back, the destinations,
266
- * then every menu's entries.
267
+ * The wide-screen layout: a vertical rail — the way back, the heading, a
268
+ * `primary` menu as one button that opens it (FUT-3015), the destinations, a
269
+ * `primary` action as a row, then `more` listed in full.
267
270
  *
268
271
  * It fills the column the host gives it and scrolls on its own, like the
269
272
  * sidebar it stands in for.
@@ -300,6 +303,9 @@ export function SectionNavRail({
300
303
  >
301
304
  {back ? <RailBack back={back} linkComponent={linkComponent} testId={`${dataTestId}-back`} /> : null}
302
305
  {heading ? <RailHeading>{heading}</RailHeading> : null}
306
+ {isMenu(primary) ? (
307
+ <RailCreateMenu menu={primary} linkComponent={linkComponent} copy={copy} testId={`${dataTestId}-primary`} />
308
+ ) : null}
303
309
  {destinations.map((destination) => (
304
310
  <RailDestination
305
311
  key={destination.id}
@@ -312,9 +318,6 @@ export function SectionNavRail({
312
318
  {primary && !isMenu(primary) ? (
313
319
  <RailAction action={primary} linkComponent={linkComponent} copy={copy} testId={`${dataTestId}-primary`} />
314
320
  ) : null}
315
- {isMenu(primary) ? (
316
- <RailMenu menu={primary} linkComponent={linkComponent} copy={copy} testId={`${dataTestId}-primary`} />
317
- ) : null}
318
321
  {more ? <RailMenu menu={more} linkComponent={linkComponent} copy={copy} testId={`${dataTestId}-more`} /> : null}
319
322
  </Box>
320
323
  );
@@ -0,0 +1,148 @@
1
+ import Button from '@mui/material/Button/index.js';
2
+ import ListItemIcon from '@mui/material/ListItemIcon/index.js';
3
+ import ListItemText from '@mui/material/ListItemText/index.js';
4
+ import ListSubheader from '@mui/material/ListSubheader/index.js';
5
+ import Menu from '@mui/material/Menu/index.js';
6
+ import MenuItem from '@mui/material/MenuItem/index.js';
7
+ import { useTheme } from '@mui/material/styles/index.js';
8
+ import { useId, useState, type ElementType, type ReactNode } from 'react';
9
+
10
+ import type { SectionNavCopy } from '../../../copy';
11
+ import { rem } from '../../../tokens/scales';
12
+
13
+ import { CountedIcon } from './SectionNav.parts';
14
+ import type { SectionNavEntry, SectionNavMenu } from './SectionNav.types';
15
+
16
+ /** One entry of the open menu: a link through the host's router, or an act. */
17
+ function entryItem(
18
+ groupId: string,
19
+ entry: SectionNavEntry,
20
+ linkComponent: ElementType | undefined,
21
+ copy: SectionNavCopy,
22
+ testId: string,
23
+ close: () => void,
24
+ ): ReactNode {
25
+ const link =
26
+ entry.href === undefined || entry.disabled === true
27
+ ? {}
28
+ : { component: linkComponent ?? 'a', href: entry.href };
29
+ const itemTestId = entry.dataTestId ?? `${testId}-entry-${entry.id}`;
30
+ return (
31
+ <MenuItem
32
+ key={`${groupId}:${entry.id}`}
33
+ {...link}
34
+ disabled={entry.disabled === true}
35
+ selected={entry.active === true}
36
+ aria-current={entry.active === true ? 'page' : undefined}
37
+ data-testid={itemTestId}
38
+ onClick={() => {
39
+ entry.onSelect?.();
40
+ close();
41
+ }}
42
+ sx={{ gap: 1.5, py: 1, whiteSpace: 'normal' }}
43
+ >
44
+ <ListItemIcon sx={{ minWidth: 0, color: 'primary.main' }}>
45
+ <CountedIcon
46
+ icon={entry.icon}
47
+ count={entry.badge}
48
+ label={copy.badge}
49
+ testId={`${itemTestId}-badge`}
50
+ />
51
+ </ListItemIcon>
52
+ <ListItemText
53
+ primary={entry.label}
54
+ secondary={entry.description}
55
+ slotProps={{
56
+ primary: { variant: 'body2', fontWeight: 500 },
57
+ secondary: { variant: 'caption' },
58
+ }}
59
+ sx={{ my: 0 }}
60
+ />
61
+ </MenuItem>
62
+ );
63
+ }
64
+
65
+ /**
66
+ * A rail's `primary` menu as ONE button at the top of the rail, opening an
67
+ * anchored menu of its groups (FUT-3015).
68
+ *
69
+ * The rail lists `more` in full, but a create menu listed that way costs a
70
+ * heading and a two-line row per entry above the fold, for acts a person takes
71
+ * once in a while. Folded behind '+ Criar' it costs one row. The button
72
+ * carries the menu's `label`; the open menu is named by its `title`.
73
+ *
74
+ * `MenuList` skips the group subheaders when the keyboard moves, and the
75
+ * popover hands focus back to the button when it closes on Escape or an
76
+ * outside click. Choosing an entry closes it too, and the entry's link or act
77
+ * takes over.
78
+ */
79
+ export function RailCreateMenu({
80
+ menu,
81
+ linkComponent,
82
+ copy,
83
+ testId,
84
+ }: {
85
+ menu: SectionNavMenu;
86
+ linkComponent: ElementType | undefined;
87
+ copy: SectionNavCopy;
88
+ testId: string;
89
+ }): React.JSX.Element {
90
+ const theme = useTheme();
91
+ const menuId = useId();
92
+ const [anchor, setAnchor] = useState<HTMLElement | null>(null);
93
+ const open = anchor !== null;
94
+ const close = (): void => setAnchor(null);
95
+ const paperTestId: Record<string, string> = { 'data-testid': `${testId}-menu` };
96
+ // One flat list: MUI's MenuList walks its direct children, so a group's
97
+ // subheader and entries cannot sit inside a wrapper.
98
+ const items: ReactNode[] = menu.groups.flatMap((group) => [
99
+ group.title ? (
100
+ <ListSubheader key={`${group.id}-title`} disableSticky sx={{ lineHeight: 2.5, bgcolor: 'transparent' }}>
101
+ {group.title}
102
+ </ListSubheader>
103
+ ) : null,
104
+ ...group.entries.map((entry) => entryItem(group.id, entry, linkComponent, copy, testId, close)),
105
+ ]);
106
+ return (
107
+ <>
108
+ <Button
109
+ variant="contained"
110
+ fullWidth
111
+ startIcon={menu.icon}
112
+ disabled={menu.disabled === true}
113
+ aria-haspopup="menu"
114
+ aria-expanded={open}
115
+ aria-controls={open ? menuId : undefined}
116
+ data-testid={menu.dataTestId ?? testId}
117
+ onClick={(event) => setAnchor(event.currentTarget)}
118
+ sx={{
119
+ my: 1,
120
+ minHeight: rem(theme, 40),
121
+ justifyContent: 'flex-start',
122
+ px: 1.75,
123
+ fontWeight: 600,
124
+ // A place in the rail reads in sentence case, like the rows under it.
125
+ textTransform: 'none',
126
+ }}
127
+ >
128
+ {menu.label}
129
+ </Button>
130
+ <Menu
131
+ id={menuId}
132
+ anchorEl={anchor}
133
+ open={open}
134
+ onClose={close}
135
+ variant="menu"
136
+ anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}
137
+ transformOrigin={{ vertical: 'top', horizontal: 'left' }}
138
+ slotProps={{
139
+ list: { 'aria-label': menu.title },
140
+ // A data attribute is not a declared slot prop, so it rides a spread.
141
+ paper: { ...paperTestId, sx: { minWidth: rem(theme, 260), maxWidth: rem(theme, 340) } },
142
+ }}
143
+ >
144
+ {items}
145
+ </Menu>
146
+ </>
147
+ );
148
+ }
@@ -103,9 +103,9 @@ export interface SectionNavGroup {
103
103
  /**
104
104
  * A menu the nav opens: the centred primary action, or the "more" slot.
105
105
  *
106
- * On a phone it opens as a bottom sheet over the page. In the rail there is
107
- * room for everything, so its groups are listed under `title` instead of
108
- * hiding behind a trigger.
106
+ * On a phone it opens as a bottom sheet over the page. In the rail, `more`
107
+ * is listed under `title`, and `primary` is one button at the top that opens
108
+ * its groups as an anchored menu named by `title` (FUT-3015).
109
109
  */
110
110
  export interface SectionNavMenu {
111
111
  /** The trigger's accessible name, and the visible label of the "more" slot. */
@@ -155,8 +155,9 @@ export interface SectionNavProps {
155
155
  * `bar` — a bottom tab bar for a phone: the destinations, `more` as the last
156
156
  * slot, and `primary` as a raised button in the middle.
157
157
  *
158
- * `rail` — a vertical list for a wide screen, with `back` and `heading` on
159
- * top and every menu's entries listed rather than folded away.
158
+ * `rail` — a vertical list for a wide screen: `back` and `heading` on top,
159
+ * a `primary` menu as one button that opens it, the destinations, and
160
+ * `more`'s entries listed.
160
161
  */
161
162
  layout: 'bar' | 'rail';
162
163
  /** The navigation landmark's accessible name. */
@@ -58,9 +58,15 @@ declare module '@mui/material/styles' {
58
58
  * The theme's resolved density — a plain theme read, not a step-shifting
59
59
  * resolver (`size` stays hierarchy; see `./density.core.ts`). A `styleOverrides`
60
60
  * callback already gets `{ theme }` and can read `theme.density` directly;
61
- * this is for a component that needs the level in its own render logic
62
- * (`Table`/`DataGrid`/`DataViews` each read it once to source their own
63
- * `density` prop's default).
61
+ * this is for a component that needs the level in its own render logic.
62
+ *
63
+ * No table component sources its own discrete density from this any more
64
+ * (FUT-2886, reverting FUT-2769's half of it for `Table`, `DataViews` AND
65
+ * `DataGrid`): a theme density scales a table's row geometry exactly once,
66
+ * through `rem()`, rather than also re-picking a discrete `density` from the
67
+ * theme on top of it — see `resolveTableDensity` (`Table.helpers.ts`),
68
+ * `DEFAULT_DENSITY` (`data-views-layout-context.tsx`), and `DataGrid.model.ts`'s
69
+ * `useDataGridModel` (`props.density ?? 'comfortable'`).
64
70
  *
65
71
  * Falls back to `resolveDensityFactor()` (`'normal'`, factor `1`) for a bare
66
72
  * MUI theme built without `createUiTheme`/`muiThemeOptionsFrom`.
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/navigation/SectionNav/SectionNav.rail.tsx"],"sourcesContent":["import Typography from '@mui/material/Typography/index.js';\nimport { useTheme } from '@mui/material/styles/index.js';\nimport type { ElementType, ReactNode } from 'react';\n\nimport type { SectionNavCopy } from '../../../copy';\nimport { rem } from '../../../tokens/scales';\n\nimport { destinationState, isMenu } from './SectionNav.helpers';\nimport {\n Box,\n CONTROL_RESET,\n CountedIcon,\n NOT_LIVE,\n SlotIcon,\n controlProps,\n destinationControl,\n focusRing,\n} from './SectionNav.parts';\nimport type {\n SectionNavAction,\n SectionNavBack,\n SectionNavDestination,\n SectionNavMenu,\n SectionNavProps,\n} from './SectionNav.types';\n\n/**\n * One rail row: icon, label, and the count at the far end.\n *\n * Destinations and menu entries draw the same row — in the rail there is room\n * for everything, so the difference between \"a place\" and \"an action\" is the\n * section it sits in, not its shape.\n *\n * `active` is the look; `current` is what `aria-current` reports, and is a\n * link's claim only — an action row that is ON says so with `aria-pressed`,\n * which arrives in `control`. Omitted, `current` follows `active`.\n */\nfunction RailRow({\n label,\n description,\n icon,\n count,\n active,\n current = active,\n copy,\n testId,\n control,\n loading = false,\n}: {\n label: string;\n description?: string;\n icon: ReactNode;\n count: number | undefined;\n active: boolean;\n current?: boolean;\n copy: SectionNavCopy;\n testId: string;\n control: Record<string, unknown>;\n loading?: boolean;\n}): React.JSX.Element {\n const theme = useTheme();\n return (\n <Box\n {...control}\n aria-current={current ? 'page' : undefined}\n aria-busy={loading || undefined}\n data-testid={testId}\n sx={{\n ...CONTROL_RESET,\n ...focusRing(theme),\n display: 'flex',\n alignItems: 'center',\n gap: 1.5,\n width: '100%',\n minHeight: rem(theme, 40),\n px: 1.25,\n py: 0.75,\n borderRadius: 1,\n textAlign: 'start',\n color: active ? 'primary.main' : 'text.primary',\n bgcolor: active ? 'action.selected' : 'transparent',\n '&:hover': { bgcolor: active ? 'action.selected' : 'action.hover' },\n '& svg': { color: 'primary.main', fontSize: rem(theme, 20) },\n [NOT_LIVE]: { color: 'text.disabled', '& svg': { color: 'text.disabled' } },\n }}\n >\n <CountedIcon\n icon={<SlotIcon icon={icon} loading={loading} />}\n count={count}\n label={copy.badge}\n testId={`${testId}-badge`}\n />\n <Box component=\"span\" sx={{ display: 'flex', flexDirection: 'column', minWidth: 0 }}>\n <Typography component=\"span\" variant=\"body2\" sx={{ fontWeight: active ? 700 : 500 }}>\n {label}\n </Typography>\n {description ? (\n <Typography component=\"span\" variant=\"caption\" color=\"text.secondary\">\n {description}\n </Typography>\n ) : null}\n </Box>\n </Box>\n );\n}\n\n/** A heading between the rail's sections, in the sidebar's small-caps voice. */\nfunction RailHeading({ children }: { children: ReactNode }): React.JSX.Element {\n return (\n <Typography variant=\"overline\" color=\"text.secondary\" sx={{ px: 1.25, pt: 1.5, lineHeight: 1.6 }}>\n {children}\n </Typography>\n );\n}\n\n/**\n * A menu's groups, listed under its title — nothing folded away on a wide\n * screen. A `disabled` menu has no trigger here to refuse, so every row of it\n * is inert instead.\n */\nfunction RailMenu({\n menu,\n linkComponent,\n copy,\n testId,\n}: {\n menu: SectionNavMenu;\n linkComponent: ElementType | undefined;\n copy: SectionNavCopy;\n testId: string;\n}): React.JSX.Element {\n return (\n <Box component=\"section\" data-testid={testId} sx={{ display: 'flex', flexDirection: 'column', gap: 0.25 }}>\n <RailHeading>{menu.title}</RailHeading>\n {menu.groups.map((group) => (\n <Box key={group.id} sx={{ display: 'flex', flexDirection: 'column', gap: 0.25 }}>\n {group.title ? (\n <Typography variant=\"caption\" color=\"text.secondary\" sx={{ px: 1.25, pt: 0.5 }}>\n {group.title}\n </Typography>\n ) : null}\n {group.entries.map((entry) => (\n <RailRow\n key={entry.id}\n label={entry.label}\n description={entry.description}\n icon={entry.icon}\n count={entry.badge}\n active={entry.active === true}\n copy={copy}\n testId={entry.dataTestId ?? `${testId}-entry-${entry.id}`}\n control={controlProps({\n href: entry.href,\n linkComponent,\n inert: menu.disabled === true || entry.disabled === true,\n onClick: () => entry.onSelect?.(),\n })}\n />\n ))}\n </Box>\n ))}\n </Box>\n );\n}\n\n/** The way back out of the section, at the top of the rail. */\nfunction RailBack({\n back,\n linkComponent,\n testId,\n}: {\n back: SectionNavBack;\n linkComponent: ElementType | undefined;\n testId: string;\n}): React.JSX.Element {\n const theme = useTheme();\n return (\n <Box\n {...controlProps({ href: back.href, linkComponent })}\n data-testid={testId}\n sx={{\n ...CONTROL_RESET,\n ...focusRing(theme),\n display: 'flex',\n alignItems: 'center',\n gap: 1,\n px: 1.25,\n py: 0.75,\n mb: 0.5,\n borderRadius: 1,\n color: 'text.secondary',\n '&:hover': { bgcolor: 'action.hover', color: 'text.primary' },\n '& svg': { fontSize: rem(theme, 20) },\n }}\n >\n {back.icon}\n <Typography component=\"span\" variant=\"body2\" sx={{ fontWeight: 600 }}>\n {back.label}\n </Typography>\n </Box>\n );\n}\n\n/** A primary that ACTS, as one row: there is no sheet to list on a wide screen. */\nfunction RailAction({\n action,\n linkComponent,\n copy,\n testId,\n}: {\n action: SectionNavAction;\n linkComponent: ElementType | undefined;\n copy: SectionNavCopy;\n testId: string;\n}): React.JSX.Element {\n return (\n <RailRow\n label={action.label}\n icon={action.icon}\n count={undefined}\n active={false}\n copy={copy}\n testId={action.dataTestId ?? testId}\n loading={action.loading === true}\n control={controlProps({\n href: undefined,\n linkComponent,\n inert: action.disabled === true,\n busy: action.loading === true,\n onClick: action.onSelect,\n })}\n />\n );\n}\n\n/** A destination as a row: a link, or an action (a toggle when it carries `active`). */\nfunction RailDestination({\n destination,\n linkComponent,\n copy,\n testId,\n}: {\n destination: SectionNavDestination;\n linkComponent: ElementType | undefined;\n copy: SectionNavCopy;\n testId: string;\n}): React.JSX.Element {\n const { current, lit } = destinationState(destination);\n return (\n <RailRow\n label={destination.label}\n icon={destination.icon}\n count={destination.badge}\n active={lit}\n current={current}\n copy={copy}\n testId={testId}\n loading={destination.loading === true}\n control={destinationControl(destination, linkComponent, () => destination.onSelect?.())}\n />\n );\n}\n\n/**\n * The wide-screen layout: a vertical rail — the way back, the destinations,\n * then every menu's entries.\n *\n * It fills the column the host gives it and scrolls on its own, like the\n * sidebar it stands in for.\n */\nexport function SectionNavRail({\n label,\n destinations,\n primary,\n more,\n back,\n heading,\n linkComponent,\n copy,\n dataTestId,\n}: Required<Pick<SectionNavProps, 'label' | 'destinations' | 'copy' | 'dataTestId'>> &\n Pick<SectionNavProps, 'primary' | 'more' | 'back' | 'heading'> & {\n linkComponent: ElementType | undefined;\n }): React.JSX.Element {\n return (\n <Box\n component=\"nav\"\n aria-label={label}\n data-testid={dataTestId}\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: 0.25,\n height: '100%',\n overflowY: 'auto',\n px: 1,\n py: 1.5,\n bgcolor: 'background.paper',\n }}\n >\n {back ? <RailBack back={back} linkComponent={linkComponent} testId={`${dataTestId}-back`} /> : null}\n {heading ? <RailHeading>{heading}</RailHeading> : null}\n {destinations.map((destination) => (\n <RailDestination\n key={destination.id}\n destination={destination}\n linkComponent={linkComponent}\n copy={copy}\n testId={destination.dataTestId ?? `${dataTestId}-dest-${destination.id}`}\n />\n ))}\n {primary && !isMenu(primary) ? (\n <RailAction action={primary} linkComponent={linkComponent} copy={copy} testId={`${dataTestId}-primary`} />\n ) : null}\n {isMenu(primary) ? (\n <RailMenu menu={primary} linkComponent={linkComponent} copy={copy} testId={`${dataTestId}-primary`} />\n ) : null}\n {more ? <RailMenu menu={more} linkComponent={linkComponent} copy={copy} testId={`${dataTestId}-more`} /> : null}\n </Box>\n );\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/data-display/DataViews/data-views-layout-context.tsx"],"sourcesContent":["\"use client\";\n\nimport { createContext, useContext, useEffect, useMemo, useState, type ReactNode } from \"react\";\n\nimport GridViewOutlinedIcon from \"@mui/icons-material/GridViewOutlined\";\n\nimport { Slider } from \"../../form/Slider\";\nimport { Box } from \"../../../mui/Box\";\nimport { sxRem } from \"../../../tokens/relative\";\nimport { useDensity, type DensityLevel } from \"../../../tokens/density\";\n\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\nimport { DATA_VIEWS_LAYOUTS, type DataViewsLayout } from \"./data-views-types\";\n\n/**\n * The DataViews layout (view type): the dense \"Tabela\" grid, the \"Grade\" of\n * cards, the \"Lista\" of full-width rows, or the \"Quadro\" board of state columns.\n * Shared across the toolbar (the toggle) and the body (the selector) via context\n * so a single source of truth drives what renders — each layout only appears\n * when the table opts into it (`renderCard` for the grade, `renderListRow` for\n * the lista, `board` + `renderCard` for the quadro).\n */\nexport type { DataViewsLayout };\n\ninterface DataViewsLayoutValue {\n layout: DataViewsLayout;\n setLayout: (layout: DataViewsLayout) => void;\n /** How much air each record gets — see {@link DataViewsDensity}. */\n density: DataViewsDensity;\n setDensity: (density: DataViewsDensity) => void;\n /** Whether the cards layout is available (a `renderCard` was supplied). */\n canUseCards: boolean;\n /** Whether the list layout is available (a `renderListRow` was supplied). */\n canUseList: boolean;\n /** Whether the board layout is available (a `board` config AND a `renderCard`). */\n canUseBoard: boolean;\n /** Card-size zoom (0–100); drives the card grid's min column width. */\n zoom: number;\n setZoom: (zoom: number) => void;\n}\n\nconst DataViewsLayoutContext = createContext<DataViewsLayoutValue | null>(null);\n\n/** Default card zoom (0–100). */\nconst DEFAULT_ZOOM = 35;\n/** The size multiplier the zoom slider spans (0.75× to 2×). */\nconst CARD_SCALE_RANGE = { min: 0.75, max: 2 } as const;\n\n/**\n * Where the user's layout preference is remembered. ONE key for every DataViews\n * table in the app, on purpose: picking \"Grade\" on Produtos is a statement about\n * how this operator likes to read lists, not about that one screen. Every other\n * screen that CAN render cards then opens in cards, and one that cannot falls\n * back without forgetting the preference.\n */\nconst LAYOUT_STORAGE_KEY = \"dataviews:layout\";\n\n/**\n * The density preference, remembered app-wide for the same reason as the layout:\n * an operator who wants tight rows wants them on every list, not on one.\n */\nconst DENSITY_STORAGE_KEY = \"dataviews:density\";\n\n/**\n * How much room each record gets. It means different things per layout, and\n * that is the point — one control, phrased in the terms of what is on screen:\n *\n * - table / list → row height (\"Baixa / Média / Alta\")\n * - cards → how many fit per row (\"Muitos / Médio / Poucos\")\n *\n * The board is unaffected: its cards are already sized by the zoom slider.\n */\nexport type DataViewsDensity = \"compact\" | \"cozy\" | \"comfortable\";\n\n/** Every density this build knows — the guard's single source. */\nconst DENSITIES: readonly DataViewsDensity[] = [\"compact\", \"cozy\", \"comfortable\"];\n\n/** Vertical padding (theme spacing units) per density, for a table or list row. */\nexport const DENSITY_ROW_PADDING: Record<DataViewsDensity, number> = {\n compact: 0.25,\n cozy: 0.75,\n comfortable: 1.5,\n};\n\n/**\n * The card WIDTH each density aims for, as a multiple of the base card width.\n *\n * Density used to cap the column COUNT, with a track floor of\n * `max(baseWidth, 100% / count)`. That base is a constant, so wherever it won\n * the arithmetic every density produced an identical track — \"Muitos\" and\n * \"Medio\" both drew 3 cards of 279px at md — and where the percentage won\n * instead, on a wide screen, the count was pinned and each card grew to a share\n * of the viewport: ~430px of card holding one chip and two lines of text.\n *\n * One width per density fixes both, because the number `auto-fill` divides by\n * now differs per density at every size. The spread is chosen so the three land\n * on DIFFERENT column counts across the range rather than by eye — 4/3/2 at md,\n * 6/4/3 at lg, 7/5/4 at xl, 13/9/8 at 2560.\n */\nexport const DENSITY_CARD_SCALE: Record<DataViewsDensity, number> = {\n compact: 0.84,\n cozy: 1.15,\n comfortable: 1.4,\n};\n\n/** The width a card aims for, in design px: the base width, scaled by zoom, then by density. */\nexport function cardTargetWidthFor(zoom: number, density: DataViewsDensity): number {\n return Math.round(cardMinWidthForZoom(zoom) * DENSITY_CARD_SCALE[density]);\n}\n\n/**\n * The BOARD's column-width multiplier per density.\n *\n * Density means \"how much air a record gets\", and on a board that is the column\n * width — narrow columns fit more etapas on screen, wide ones give each card\n * room to be read. Without this the board was the one layout the Exibição tab\n * offered nothing for: the format tile switched to Quadro and the whole density\n * section vanished, which reads as a control that broke rather than one that\n * does not apply.\n *\n * The spread is deliberately narrower than the card grid's. A board column has\n * a hard floor (`MIN_COLUMN_WIDTH` — a card below it stops being readable), so\n * a multiplier that undershoots it buys nothing and makes \"Estreita\" a tile\n * that does nothing on a phone.\n */\nexport const DENSITY_BOARD_SCALE: Record<DataViewsDensity, number> = {\n compact: 0.95,\n cozy: 1,\n comfortable: 1.25,\n};\n\n/**\n * Map the 0–100 zoom to the card SIZE multiplier. This is the single knob: the\n * card's width is its 180 design px × scale and its padding + typography\n * scale by the same factor, so the whole card grows together (scale 2 → twice\n * the size, proportion preserved by the aspect ratio). Passed to a card via\n * `DataViewCardSelection.scale`.\n */\nexport function cardScaleForZoom(zoom: number): number {\n const clamped = Math.max(0, Math.min(100, zoom));\n return CARD_SCALE_RANGE.min + (clamped / 100) * (CARD_SCALE_RANGE.max - CARD_SCALE_RANGE.min);\n}\n\n/**\n * The card grid's min column width in DESIGN px: the card's width at scale 1 —\n * 180 — times the zoom size multiplier. Drawn through `rem` where the track is\n * built (`cardGridTracks`), so it scales with the theme's type scale.\n */\nexport function cardMinWidthForZoom(zoom: number): number {\n return Math.round(180 * cardScaleForZoom(zoom));\n}\n\n/** Which layouts this table can actually render. */\ninterface LayoutAvailability {\n canUseCards: boolean;\n canUseList: boolean;\n canUseBoard: boolean;\n}\n\n/** Is this a layout string this build knows? Guards whatever is in storage. */\nfunction isLayout(value: unknown): value is DataViewsLayout {\n return DATA_VIEWS_LAYOUTS.includes(value as DataViewsLayout);\n}\n\n/** Is this a density this build knows? Guards whatever is in storage. */\nfunction isDensity(value: unknown): value is DataViewsDensity {\n return DENSITIES.includes(value as DataViewsDensity);\n}\n\n/**\n * The theme's density level, aliased to `DataViewsDensity` (FUT-2769 —\n * umbrella Decision 7, non-breaking): `DataViewsDensity`'s three names are not\n * the theme's three names, so this is an alias table rather than a verbatim\n * read. `'normal'` (the theme's own default, and what a theme with no density\n * at all resolves to) maps to `'cozy'` — today's literal default, unchanged —\n * so the mapping is a no-op exactly when nothing about density has been said.\n * The STORED per-viewer preference still wins over this default, unchanged\n * from today (below).\n */\nexport function mapThemeToDataViewsDensity(level: DensityLevel): DataViewsDensity {\n if (level === 'compact') return 'compact';\n if (level === 'comfortable') return 'comfortable';\n return 'cozy';\n}\n\n/** The remembered density, or undefined (no window, no value, junk). */\nfunction readStoredDensity(): DataViewsDensity | undefined {\n try {\n if (typeof window === \"undefined\") return undefined;\n const stored = window.localStorage.getItem(DENSITY_STORAGE_KEY);\n return isDensity(stored) ? stored : undefined;\n } catch {\n return undefined;\n }\n}\n\n/**\n * Pin a layout to one this table can render. \"Tabela\" is always available, so it\n * is the floor: a page with no `renderCard` never renders a cards body, one with\n * no `renderListRow` never renders a list, and one with no `board` config never\n * renders a board — whatever is stored, saved in a view, or requested.\n */\nfunction pinLayout(layout: DataViewsLayout, available: LayoutAvailability): DataViewsLayout {\n if (layout === \"cards\") return available.canUseCards ? \"cards\" : \"table\";\n if (layout === \"list\") return available.canUseList ? \"list\" : \"table\";\n if (layout === \"board\") return available.canUseBoard ? \"board\" : \"table\";\n return \"table\";\n}\n\n/** The stored cross-screen preference, or undefined (no window, no value, junk). */\nfunction readStoredLayout(): DataViewsLayout | undefined {\n // Guarded rather than assumed: this module is also imported in Node (tests,\n // any SSR host), and a `localStorage` access can throw outright under a\n // restrictive privacy setting — a thrown read must not take the grid with it.\n try {\n if (typeof window === \"undefined\") return undefined;\n const stored = window.localStorage.getItem(LAYOUT_STORAGE_KEY);\n return isLayout(stored) ? stored : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Remember a preference for every other screen. A failed write is not an error. */\nfunction writeStored(key: string, value: string): void {\n try {\n if (typeof window === \"undefined\") return;\n window.localStorage.setItem(key, value);\n } catch {\n // Private mode / quota / disabled storage: the preference simply does not\n // survive the session. Nothing about the current view depends on it.\n }\n}\n\ninterface LayoutProviderProps extends Partial<LayoutAvailability> {\n /** Which layout to show first when the user has expressed no preference. */\n defaultLayout?: DataViewsLayout;\n /**\n * The layout an APPLIED SAVED VIEW pins, when it stored one. It wins over the\n * remembered preference for as long as that view is applied — the view is a\n * snapshot someone chose to keep — but it does NOT overwrite the preference:\n * only the toggle does that, because only the toggle is the user saying so.\n */\n viewLayout?: DataViewsLayout;\n /**\n * Ignore — and stop writing — the remembered cross-screen preference, making\n * `defaultLayout` authoritative for this table.\n *\n * For a table that exists to SHOW a particular layout rather than to be\n * browsed: a Storybook story called \"Board\", a docs example, a screenshot\n * harness. Without it the remembered preference wins, so opening \"Board\"\n * after having clicked Tabela anywhere renders a table — the demonstration\n * silently showing the wrong thing, and a shared link doing it for everyone\n * whose preference differs.\n *\n * A real screen leaves this off: remembering how someone likes to read\n * lists is the point.\n */\n ignoreStoredLayout?: boolean;\n children: ReactNode;\n}\n\n/**\n * Provides the view-type state, seeded from (in order) the applied saved view's\n * layout, the user's remembered cross-screen preference, then `defaultLayout` —\n * each pinned to what this table can actually render.\n */\nexport function DataViewsLayoutProvider({\n canUseCards = false,\n canUseList = false,\n canUseBoard = false,\n defaultLayout = \"table\",\n viewLayout,\n ignoreStoredLayout = false,\n children,\n}: LayoutProviderProps): React.JSX.Element {\n const availability = { canUseCards, canUseList, canUseBoard };\n // Read once, outside the lazy initializer below: a hook cannot be called\n // from inside one (FUT-2769 — the theme is only a fallback when nothing is\n // stored, same precedence as before this ticket).\n const themeDensity = useDensity();\n const [layout, setLayoutState] = useState<DataViewsLayout>(() =>\n pinLayout(\n viewLayout ?? (ignoreStoredLayout ? undefined : readStoredLayout()) ?? defaultLayout,\n availability,\n ),\n );\n const [density, setDensityState] = useState<DataViewsDensity>(\n () =>\n (ignoreStoredLayout ? undefined : readStoredDensity()) ??\n mapThemeToDataViewsDensity(themeDensity.level ?? \"normal\"),\n );\n const [zoom, setZoom] = useState(DEFAULT_ZOOM);\n // A newly applied view carrying a layout switches to it (its reference-change\n // is the signal, exactly as `appliedState` works for the filters).\n useEffect(() => {\n if (viewLayout) setLayoutState(pinLayout(viewLayout, availability));\n // Availability is derived from props that do not change for a mounted table.\n }, [viewLayout]);\n // Pin again on read: `canUseCards`/`canUseBoard` can flip for a mounted table\n // (a page that supplies `renderCard` only once its card data has loaded), and\n // a stale \"cards\" would otherwise render a cards body with no renderer.\n const effective = pinLayout(layout, availability);\n\n const value = useMemo<DataViewsLayoutValue>(\n () => ({\n layout: effective,\n setLayout: (next: DataViewsLayout) => {\n const pinned = pinLayout(next, availability);\n setLayoutState(pinned);\n // Remember the user's own choice across every screen — see LAYOUT_STORAGE_KEY.\n // A table pinned to a layout does not write: it would teach the\n // preference a value the operator never chose.\n if (!ignoreStoredLayout) writeStored(LAYOUT_STORAGE_KEY, pinned);\n },\n density,\n setDensity: (next: DataViewsDensity) => {\n setDensityState(next);\n if (!ignoreStoredLayout) writeStored(DENSITY_STORAGE_KEY, next);\n },\n canUseCards,\n canUseList,\n canUseBoard,\n zoom,\n setZoom,\n }),\n [effective, density, canUseCards, canUseList, canUseBoard, zoom],\n );\n return <DataViewsLayoutContext.Provider value={value}>{children}</DataViewsLayoutContext.Provider>;\n}\n\n/** Read the current DataViews layout. Throws outside a provider. */\nexport function useDataViewsLayout(): DataViewsLayoutValue {\n const ctx = useContext(DataViewsLayoutContext);\n if (!ctx) {\n throw new Error(\"useDataViewsLayout must be used within a DataViewsLayoutProvider\");\n }\n return ctx;\n}\n\n/**\n * Card-size slider for the toolbar — shown in the CARD-BASED layouts (\"Grade\"\n * and \"Quadro\"), mirroring the tabwoah view-selector's zoom. The board reuses\n * the same `renderCard`, so the same knob scales both.\n *\n * Deliberately ABSENT in \"Lista\" and \"Tabela\" (FUT-733): a list row is\n * full-width and sized by its content, so a card-size multiplier has nothing to\n * act on — a slider that moved and changed nothing would be worse than none.\n */\nexport function DataViewsZoomSlider({ testIdPrefix }: { testIdPrefix: string }): React.JSX.Element | null {\n const { layout, zoom, setZoom } = useDataViewsLayout();\n const copy = useDataViewsCopy();\n if (layout !== \"cards\" && layout !== \"board\") return null;\n return (\n <Box\n sx={{\n display: { xs: \"none\", sm: \"flex\" },\n alignItems: \"center\",\n gap: 1,\n color: \"text.secondary\",\n }}\n >\n <GridViewOutlinedIcon sx={{ fontSize: sxRem(14) }} />\n <Box sx={{ width: sxRem(88), display: \"flex\", alignItems: \"center\" }}>\n <Slider\n size=\"sm\"\n showValue={false}\n value={zoom}\n min={0}\n max={100}\n step={5}\n onChange={(_event, next) => setZoom(Array.isArray(next) ? (next[0] ?? 0) : next)}\n aria-label={copy.display.cardZoom}\n data-testid={`${testIdPrefix}-card-zoom`}\n />\n </Box>\n <GridViewOutlinedIcon sx={{ fontSize: sxRem(20) }} />\n </Box>\n );\n}\n"],"mappings":"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","names":["default"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/data-display/Table/Table.helpers.ts"],"sourcesContent":["import type { TableProps as MuiTableProps } from '@mui/material/Table/index.js';\nimport type { Theme } from '@mui/material/styles/index.js';\nimport type React from 'react';\n\nimport { rem } from '../../../tokens/relative';\nimport type { DensityLevel } from '../../../tokens/density';\n\nimport type { TableDensity, TableProps } from './Table.types';\n\n/**\n * A virtualised row's height in design px: the caller's `rowHeight`, else 52.\n * Resolved here rather than in {@link TABLE_DEFAULTS} so the one number is read\n * where it is drawn (`rem`) and where the window is positioned with it (`remPx`).\n */\nexport const tableRowHeight = (rowHeight: number | undefined): number => rowHeight ?? 52;\n\n/**\n * `density`'s default (FUT-2769): the caller's own prop, else the theme's\n * level — `'normal'` for a theme with no density at all (`useDensity()`'s own\n * fallback) or an unnamed numeric one. `TableDensity` is a verbatim match for\n * the theme's `DensityLevel`, so no alias table is needed, unlike `DataGrid`'s\n * `mapThemeToGridDensity` or `DataViews`' `mapThemeToDataViewsDensity`.\n */\nexport const resolveTableDensity = (\n explicit: TableDensity | undefined,\n themeLevel: DensityLevel | undefined,\n): TableDensity => explicit ?? themeLevel ?? 'normal';\n\n/** The scroll box's height: a number is design px, 400 unless the caller says otherwise. */\nconst scrollHeight = (theme: Theme, containerHeight: number | string | undefined): string => {\n const box = containerHeight || 400;\n return typeof box === 'number' ? rem(theme, box) : box;\n};\n\n/**\n * The table's one scroll container (FUT-2658): `containerHeight` tall\n * whenever it is set, or 400 when `virtualScrolling` is on and it is not,\n * holding the header and the body. `containerHeight` sizes the scroller with\n * or without `virtualScrolling` (FUT-2677) — no consumer relies on the old\n * virtual-only gate, and `stickyHeader` needs this box to stick inside.\n * Inline, so the height it was given reads back off the element. A\n * `containerHeight` of 0 counts as unset: a zero-height scroller shows nothing.\n */\nexport const scrollerStyle = (theme: Theme, p: TableProps): React.CSSProperties | undefined =>\n p.virtualScrolling || p.containerHeight\n ? { height: scrollHeight(theme, p.containerHeight), overflow: 'auto' }\n : undefined;\n\n/**\n * With `stickyHeader`, the scroller takes over the rounded clip the `<table>`\n * gives up (`tableStyles`, FUT-2677) — the caller's container owns it on the\n * basic (children) path, and the loading/empty shells get it too, so their\n * corners do not change between states.\n */\nexport const scrollerRadiusStyle = (\n theme: Theme,\n stickyHeader: boolean | undefined,\n): React.CSSProperties | undefined => (stickyHeader ? { borderRadius: theme.spacing(1) } : undefined);\n\n/** `scrollerStyle` and, with `stickyHeader`, the rounded clip it takes over. */\nexport const containerStyle = (theme: Theme, p: TableProps): React.CSSProperties | undefined => {\n const scroller = scrollerStyle(theme, p);\n const radius = scrollerRadiusStyle(theme, p.stickyHeader);\n return scroller || radius ? { ...scroller, ...radius } : undefined;\n};\n\n/**\n * Only a virtualised table needs its header measured — a plain one never\n * reads `scroll.headerPx`, so it gets no `ResizeObserver` either (FUT-2678).\n */\nexport const headerRefFor = (\n windowHeight: number | undefined,\n headRef: React.RefObject<globalThis.HTMLTableSectionElement | null>,\n): React.RefObject<globalThis.HTMLTableSectionElement | null> | undefined =>\n windowHeight ? headRef : undefined;\n\n/**\n * The window's height in design px when the body is virtualised — only a\n * numeric `containerHeight` virtualises; a string sizes the scroller alone.\n */\nexport const virtualHeight = (p: TableProps): number | undefined =>\n p.virtualScrolling && typeof p.containerHeight === 'number' && p.containerHeight > 0 &&\n tableRowHeight(p.rowHeight) > 0\n ? p.containerHeight\n : undefined;\n\n// `density` is NOT here (FUT-2769): `TableDensity` is a verbatim match for\n// the theme's `DensityLevel`, so `Table.tsx` resolves it itself —\n// `props.density ?? (useDensity().level ?? 'normal')` — reading the theme\n// requires a hook, which this module-level constant cannot call. At\n// `theme.density` unset, or its level `'normal'`, that reproduces this\n// object's OTHER defaults' shape exactly: today's literal `'normal'`.\nexport const TABLE_DEFAULTS: Partial<TableProps> = {\n variant: 'default',\n stripeColor: 'neutral',\n glow: false,\n pulse: false,\n hoverable: false,\n loading: false,\n stickyHeader: false,\n selectable: false,\n selectedRows: [],\n sortable: false,\n virtualScrolling: false,\n overscan: 5,\n responsive: false,\n showColumnToggle: true,\n};\n\n// Strips explicitly-undefined props before the merge, so `prop={undefined}` still\n// falls back to the default as a destructuring default would. Eighteen separate\n// destructuring defaults were most of this component's branch count.\nexport const definedProps = (props: TableProps): Partial<TableProps> =>\n Object.fromEntries(\n Object.entries(props).filter(([, value]) => value !== undefined),\n ) as Partial<TableProps>;\n\n// The container + styled table + optional header, shared by the loading, empty\n// and populated renders.\n\n/** A key `Table` declares on top of MUI's own `TableProps`. */\ntype TableOwnKey = Exclude<keyof TableProps, keyof MuiTableProps>;\n\n/**\n * Every key {@link TableOwnKey} names. None is an HTML attribute: each is read\n * by the table and drawn by its parts, so none may reach the `<table>`\n * (FUT-2658). A `Record` over the key union makes the list exhaustive — a prop\n * added to `Table.types.ts` does not compile until it is named here.\n */\nconst TABLE_OWN_KEYS: Record<TableOwnKey, true> = {\n emptyText: true,\n variant: true,\n stripeColor: true,\n glow: true,\n pulse: true,\n hoverable: true,\n loading: true,\n onRowClick: true,\n onRowFocus: true,\n onRowBlur: true,\n density: true,\n selectable: true,\n selectedRows: true,\n onSelectionChange: true,\n rowKeyExtractor: true,\n sortable: true,\n sortConfig: true,\n onSortChange: true,\n filterable: true,\n filterConfig: true,\n onFilterChange: true,\n columns: true,\n data: true,\n virtualScrolling: true,\n rowHeight: true,\n overscan: true,\n responsive: true,\n columnPriorities: true,\n responsiveBreakpoints: true,\n showColumnToggle: true,\n containerHeight: true,\n loadingComponent: true,\n emptyStateComponent: true,\n keyboardNavigation: true,\n renderRow: true,\n renderCell: true,\n draggableRows: true,\n onRowsReorder: true,\n fixedColumns: true,\n rowStyleConfig: true,\n};\n\nconst NOT_FORWARDED = new Set<string>([...Object.keys(TABLE_OWN_KEYS), 'children']);\n\n/**\n * What the caller passed that is MUI's or the DOM's — `className`, `id`,\n * `style`, `aria-*`, `data-*`, DOM handlers, `sx`, `size`, `padding`,\n * `component` — for `MuiTable` to spread onto the `<table>`. `children` is\n * placed by the table itself.\n */\nexport const tableDomProps = (props: TableProps): Record<string, unknown> =>\n Object.fromEntries(Object.entries(props).filter(([key]) => !NOT_FORWARDED.has(key)));\n"],"mappings":";;;;;AAcO,IAAM,iBAAiB,CAAC,cAA0C,aAAa;AAS/E,IAAM,sBAAsB,CACjC,UACA,eACiB,YAAY,cAAc;AAG7C,IAAM,eAAe,CAAC,OAAc,oBAAyD;AAC3F,QAAM,MAAM,mBAAmB;AAC/B,SAAO,OAAO,QAAQ,WAAW,IAAI,OAAO,GAAG,IAAI;AACrD;AAWO,IAAM,gBAAgB,CAAC,OAAc,MAC1C,EAAE,oBAAoB,EAAE,kBACpB,EAAE,QAAQ,aAAa,OAAO,EAAE,eAAe,GAAG,UAAU,OAAO,IACnE;AAQC,IAAM,sBAAsB,CACjC,OACA,iBACqC,eAAe,EAAE,cAAc,MAAM,QAAQ,CAAC,EAAE,IAAI;AAGpF,IAAM,iBAAiB,CAAC,OAAc,MAAmD;AAC9F,QAAM,WAAW,cAAc,OAAO,CAAC;AACvC,QAAM,SAAS,oBAAoB,OAAO,EAAE,YAAY;AACxD,SAAO,YAAY,SAAS,EAAE,GAAG,UAAU,GAAG,OAAO,IAAI;AAC3D;AAMO,IAAM,eAAe,CAC1B,cACA,YAEA,eAAe,UAAU;AAMpB,IAAM,gBAAgB,CAAC,MAC5B,EAAE,oBAAoB,OAAO,EAAE,oBAAoB,YAAY,EAAE,kBAAkB,KACnF,eAAe,EAAE,SAAS,IAAI,IAC1B,EAAE,kBACF;AAQC,IAAM,iBAAsC;AAAA,EACjD,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,EACN,OAAO;AAAA,EACP,WAAW;AAAA,EACX,SAAS;AAAA,EACT,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,cAAc,CAAC;AAAA,EACf,UAAU;AAAA,EACV,kBAAkB;AAAA,EAClB,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,kBAAkB;AACpB;AAKO,IAAM,eAAe,CAAC,UAC3B,OAAO;AAAA,EACL,OAAO,QAAQ,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,UAAU,MAAS;AACjE;AAcF,IAAM,iBAA4C;AAAA,EAChD,WAAW;AAAA,EACX,SAAS;AAAA,EACT,aAAa;AAAA,EACb,MAAM;AAAA,EACN,OAAO;AAAA,EACP,WAAW;AAAA,EACX,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,mBAAmB;AAAA,EACnB,iBAAiB;AAAA,EACjB,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,SAAS;AAAA,EACT,MAAM;AAAA,EACN,kBAAkB;AAAA,EAClB,WAAW;AAAA,EACX,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,kBAAkB;AAAA,EAClB,uBAAuB;AAAA,EACvB,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,kBAAkB;AAAA,EAClB,qBAAqB;AAAA,EACrB,oBAAoB;AAAA,EACpB,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,eAAe;AAAA,EACf,cAAc;AAAA,EACd,gBAAgB;AAClB;AAEA,IAAM,gBAAgB,oBAAI,IAAY,CAAC,GAAG,OAAO,KAAK,cAAc,GAAG,UAAU,CAAC;AAQ3E,IAAM,gBAAgB,CAAC,UAC5B,OAAO,YAAY,OAAO,QAAQ,KAAK,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,cAAc,IAAI,GAAG,CAAC,CAAC;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/data-display/DataGrid/DataGrid.model.ts"],"sourcesContent":["/**\n * The DataGrid's STATE, in one hook.\n *\n * The component used to hold all of it inline, which made its body 700 lines\n * long and put the row pipeline, the virtualization window and the JSX in one\n * scope where any of them could reach any other. Split out, each piece is a\n * hook with named inputs and the render is left with nothing to do but render.\n *\n * Controlled/uncontrolled is resolved in ONE place per feature: a caller that\n * passes `sorting.sortBy` owns the sort, and a caller that does not gets the\n * internal state — the component never holds a second, divergent copy.\n */\nimport { useTheme } from '@mui/material/styles/index.js';\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type React from 'react';\n\nimport { rem, remPx } from '../../../tokens/relative';\nimport { useDensity, type DensityLevel } from '../../../tokens/density';\n\nimport { processRows } from './DataGrid.rows';\nimport type {\n DataGridProps,\n GridColumn,\n GridDensity,\n GridFilter,\n GridSort,\n SortDirection,\n} from './DataGrid.types';\n\nconst DEFAULT_PAGE_SIZE = 50;\n/** Rows rendered on either side of the window, so a fast scroll stays filled. */\nconst OVERSCAN_COUNT = 20;\n/** Below this many rows, virtualization costs more than it saves. */\nconst VIRTUALIZATION_THRESHOLD = 100;\n/** The initial (and reset) window size, before a scroll has measured anything. */\nconst INITIAL_WINDOW = 50;\n/** Re-window only past this much drift, so a scroll is not one setState per pixel. */\nconst WINDOW_DRIFT = 5;\n\n/** Which id is being edited, or `null`. */\nexport interface EditingCell {\n rowId: string | number;\n colId: string;\n}\n\n/** The visible slice of a virtualized body. */\nexport interface VisibleRange {\n start: number;\n end: number;\n}\n\n/** Everything the render needs, and nothing it has to derive. */\nexport interface DataGridModel<T extends Record<string, unknown>> {\n containerRef: React.RefObject<HTMLDivElement | null>;\n /**\n * The density this render actually used: `props.density`, else the\n * theme-driven default (FUT-2769, {@link mapThemeToGridDensity}). The same\n * value `rowHeight` was scaled by — read it here rather than re-deriving it,\n * so the reported default and the geometry can never disagree.\n */\n density: GridDensity;\n /** A row's height as CSS: the design height, density applied, through `rem`. */\n rowHeight: string;\n /**\n * The same height in px (`remPx`) — what the window divides `scrollTop` by.\n * One design number drawn two ways, so the rows and the window never disagree.\n */\n rowPitch: number;\n visibleColumns: GridColumn<T>[];\n processedRows: T[];\n visibleRows: T[];\n visibleRange: VisibleRange;\n virtualized: boolean;\n sortBy: readonly GridSort[];\n selectedRowIds: Array<string | number>;\n selectedRowIdsSet: ReadonlySet<string | number>;\n expandedRowIdsSet: ReadonlySet<string | number>;\n editingCell: EditingCell | null;\n setEditingCell: (cell: EditingCell | null) => void;\n setSelectedRowIds: (ids: Array<string | number>) => void;\n onSort: (columnId: string) => void;\n onToggleRow: (rowId: string | number, isSelected: boolean) => void;\n onToggleExpansion: (rowId: string | number) => void;\n onScroll: (event: React.UIEvent<HTMLDivElement>) => void;\n}\n\n/** The row height a density implies, in design px. */\nfunction densityHeight(base: number, density: DataGridProps['density']): number {\n if (density === 'compact') return Math.max(base * 0.8, 32);\n if (density === 'spacious') return base * 1.2;\n return base;\n}\n\n/**\n * The theme's density level, aliased to `GridDensity` (FUT-2769 — umbrella\n * Decision 7, non-breaking): `GridDensity`'s three names are not the theme's\n * three names, so this is an alias table rather than a verbatim read.\n * `'normal'` (the theme's own default, and what a theme with no density at\n * all resolves to) maps to `'comfortable'` — today's literal default,\n * unchanged — so the mapping is a no-op exactly when nothing about density\n * has been said.\n */\nexport function mapThemeToGridDensity(level: DensityLevel): GridDensity {\n if (level === 'compact') return 'compact';\n if (level === 'comfortable') return 'spacious';\n return 'comfortable';\n}\n\n/** The rows this render should show, with every client-mode step resolved. */\nfunction useProcessedRows<T extends Record<string, unknown>>(\n props: DataGridProps<T>,\n columnMap: ReadonlyMap<string, GridColumn<T>>,\n sortBy: readonly GridSort[],\n filters: readonly GridFilter[],\n): T[] {\n const { rows, filtering = {}, sorting = {}, pagination, virtualizeRows = true } = props;\n const pageIndex = pagination?.pageIndex ?? 0;\n const pageSize = pagination?.pageSize ?? DEFAULT_PAGE_SIZE;\n return useMemo(\n () =>\n processRows({\n rows,\n columnMap,\n filters,\n sortBy,\n needsFiltering: filtering.mode === 'client' && filters.length > 0,\n needsSorting: sorting.mode === 'client' && sortBy.length > 0,\n // Virtualization already slices; doing both would page a page.\n needsPagination: pagination?.mode === 'client' && !virtualizeRows,\n pageIndex,\n pageSize,\n }),\n [\n rows,\n columnMap,\n filters,\n sortBy,\n filtering.mode,\n sorting.mode,\n pagination?.mode,\n virtualizeRows,\n pageIndex,\n pageSize,\n ],\n );\n}\n\n/**\n * The virtualization window and the scroll handler that moves it. `rowPitch` is\n * px, like the `scrollTop` and `clientHeight` it is divided into.\n *\n * Throttled through `requestAnimationFrame`, and only committed once the window\n * has drifted meaningfully — a `setState` per scroll event re-renders every\n * visible row for a movement the eye cannot see.\n */\nfunction useRowWindow(\n rowCount: number,\n rowPitch: number,\n enabled: boolean,\n): { range: VisibleRange; onScroll: (event: React.UIEvent<HTMLDivElement>) => void } {\n const [range, setRange] = useState<VisibleRange>({ start: 0, end: INITIAL_WINDOW });\n const rafRef = useRef<number | null>(null);\n\n useEffect(() => {\n if (rowCount < range.end) setRange({ start: 0, end: Math.min(INITIAL_WINDOW, rowCount) });\n }, [rowCount, range.end]);\n\n useEffect(\n () => () => {\n if (rafRef.current !== null) window.cancelAnimationFrame(rafRef.current);\n },\n [],\n );\n\n const onScroll = useCallback(\n (event: React.UIEvent<HTMLDivElement>) => {\n if (!enabled) return;\n const { scrollTop, clientHeight } = event.currentTarget;\n if (rafRef.current !== null) window.cancelAnimationFrame(rafRef.current);\n rafRef.current = window.requestAnimationFrame(() => {\n const first = Math.floor(scrollTop / rowPitch);\n const visible = Math.ceil(clientHeight / rowPitch);\n const start = Math.max(0, first - OVERSCAN_COUNT);\n const end = Math.min(first + visible + OVERSCAN_COUNT, rowCount);\n setRange((current) =>\n Math.abs(start - current.start) > WINDOW_DRIFT ||\n Math.abs(end - current.end) > WINDOW_DRIFT\n ? { start, end }\n : current,\n );\n rafRef.current = null;\n });\n },\n [enabled, rowPitch, rowCount],\n );\n\n return { range, onScroll };\n}\n\n/** The next `sortBy` for a header press: asc → desc → unsorted. */\nfunction nextSortBy(current: readonly GridSort[], columnId: string): GridSort[] {\n const existing = current.find((sort) => sort.id === columnId);\n let dir: SortDirection = 'asc';\n if (existing?.dir === 'asc') dir = 'desc';\n else if (existing?.dir === 'desc') dir = null;\n return dir ? [{ id: columnId, dir }] : current.filter((sort) => sort.id !== columnId);\n}\n\n/** Selection + expansion, each resolved once against its controlled prop. */\nfunction useRowFlags<T extends Record<string, unknown>>(\n props: DataGridProps<T>,\n): Pick<\n DataGridModel<T>,\n | 'selectedRowIds'\n | 'selectedRowIdsSet'\n | 'expandedRowIdsSet'\n | 'setSelectedRowIds'\n | 'onToggleRow'\n | 'onToggleExpansion'\n> {\n const { selection = { mode: 'none' }, expansion } = props;\n const [internalSelected, setInternalSelected] = useState(selection.defaultSelectedRowIds ?? []);\n const [internalExpanded, setInternalExpanded] = useState(expansion?.defaultExpandedRowIds ?? []);\n const selectedRowIds = selection.selectedRowIds ?? internalSelected;\n const expandedRowIds = expansion?.expandedRowIds ?? internalExpanded;\n\n const commitSelected = useCallback(\n (ids: Array<string | number>) => {\n if (selection.onChangeSelected) selection.onChangeSelected(ids);\n else setInternalSelected(ids);\n },\n [selection],\n );\n\n return {\n selectedRowIds,\n selectedRowIdsSet: useMemo(() => new Set(selectedRowIds), [selectedRowIds]),\n expandedRowIdsSet: useMemo(() => new Set(expandedRowIds), [expandedRowIds]),\n setSelectedRowIds: commitSelected,\n onToggleRow: (rowId, isSelected) => {\n if (selection.mode === 'single') commitSelected(isSelected ? [rowId] : []);\n else if (selection.mode === 'multi') {\n commitSelected(\n isSelected\n ? [...selectedRowIds, rowId]\n : selectedRowIds.filter((id) => id !== rowId),\n );\n }\n },\n onToggleExpansion: (rowId) => {\n if (!expansion) return;\n const next = expandedRowIds.includes(rowId)\n ? expandedRowIds.filter((id) => id !== rowId)\n : [...expandedRowIds, rowId];\n if (expansion.onChangeExpanded) expansion.onChangeExpanded(next);\n else setInternalExpanded(next);\n },\n };\n}\n\n/**\n * A header press, routed to whoever owns the sort: the server (which must\n * re-query — sorting the current page locally would reorder one page of a\n * dataset and call it sorted), the caller's `onChangeSortBy`, or internal state.\n */\nfunction useSortHandler<T extends Record<string, unknown>>(\n props: DataGridProps<T>,\n sortBy: readonly GridSort[],\n filters: readonly GridFilter[],\n setInternalSortBy: (next: GridSort[]) => void,\n): (columnId: string) => void {\n const { sorting = {}, pagination, onRequestData } = props;\n return useCallback(\n (columnId: string) => {\n const next = nextSortBy(sortBy, columnId);\n if (sorting.mode === 'server' && onRequestData) {\n onRequestData({\n pageIndex: pagination?.pageIndex ?? 0,\n pageSize: pagination?.pageSize ?? DEFAULT_PAGE_SIZE,\n sortBy: next,\n filters: [...filters],\n });\n return;\n }\n if (sorting.onChangeSortBy) sorting.onChangeSortBy(next);\n else setInternalSortBy(next);\n },\n [sortBy, sorting, onRequestData, pagination, filters, setInternalSortBy],\n );\n}\n\n/**\n * Sort and filter, each resolved ONCE against its controlled prop: a caller\n * that passes `sorting.sortBy` owns the sort, and one that does not gets the\n * internal state. The grid never holds a second, divergent copy.\n */\nfunction useSortAndFilter<T extends Record<string, unknown>>(\n props: DataGridProps<T>,\n): {\n sortBy: readonly GridSort[];\n filters: readonly GridFilter[];\n setInternalSortBy: (next: GridSort[]) => void;\n} {\n const { sorting = {}, filtering = {} } = props;\n const [internalSortBy, setInternalSortBy] = useState<GridSort[]>(sorting.defaultSortBy ?? []);\n const [internalFilters] = useState<GridFilter[]>(filtering.defaultFilters ?? []);\n return {\n sortBy: sorting.sortBy ?? internalSortBy,\n filters: filtering.filters ?? internalFilters,\n setInternalSortBy,\n };\n}\n\nexport function useDataGridModel<T extends Record<string, unknown>>(\n props: DataGridProps<T>,\n): DataGridModel<T> {\n const { columns } = props;\n const theme = useTheme();\n const themeDensity = useDensity();\n const containerRef = useRef<HTMLDivElement>(null);\n const [editingCell, setEditingCell] = useState<EditingCell | null>(null);\n const { sortBy, filters, setInternalSortBy } = useSortAndFilter(props);\n // An explicit `density` prop wins; otherwise the theme's own level, aliased\n // to this grid's three names (FUT-2769).\n const density = props.density ?? mapThemeToGridDensity(themeDensity.level ?? 'normal');\n // 52 design px unless the caller says; the density scales it, then the type scale does.\n const designRowHeight = densityHeight(props.rowHeight ?? 52, density);\n const rowPitch = remPx(theme, designRowHeight);\n const columnMap = useMemo(\n () => new Map(columns.map((column) => [column.id, column])),\n [columns],\n );\n const visibleColumns = useMemo(() => columns.filter((column) => !column.hidden), [columns]);\n const processedRows = useProcessedRows(props, columnMap, sortBy, filters);\n const virtualized =\n (props.virtualizeRows ?? true) && processedRows.length > VIRTUALIZATION_THRESHOLD;\n const { range, onScroll } = useRowWindow(processedRows.length, rowPitch, virtualized);\n const onSort = useSortHandler(props, sortBy, filters, setInternalSortBy);\n\n return {\n containerRef,\n density,\n rowHeight: rem(theme, designRowHeight),\n rowPitch,\n visibleColumns,\n processedRows,\n visibleRows: virtualized ? processedRows.slice(range.start, range.end) : processedRows,\n visibleRange: range,\n virtualized,\n sortBy,\n editingCell,\n setEditingCell,\n onSort,\n onScroll,\n ...useRowFlags(props),\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 containerStyle,\n definedProps,\n headerRefFor,\n resolveTableDensity,\n scrollerRadiusStyle,\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 { tableStyles } from './Table.styles';\nimport { rem } from '../../../tokens/relative';\nimport { useDensity } from '../../../tokens/density';\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', 'virtualised'].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 virtualised?: boolean;\n}>(({ theme, customVariant, glow, pulse, hoverable, density, stickyHeader, stripeColor = 'neutral', virtualised }) => {\n return tableStyles({\n theme,\n customVariant,\n glow,\n pulse,\n hoverable,\n density,\n stickyHeader,\n stripeColor,\n virtualised });\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 // The loading and empty shells are not scrollers (no `containerHeight`), so\n // they get only the rounded clip `stickyHeader` moves off the `<table>`,\n // never a height (FUT-2677).\n <TableContainer style={scrollerRadiusStyle(useTheme(), stickyHeader)}>\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 headerRefFor(windowHeight, headRef),\n );\n\n return (\n <Box position=\"relative\">\n <TableContainer\n style={containerStyle(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 virtualised={Boolean(windowHeight)}\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 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 themeDensity = useDensity(); // FUT-2769 — density's default; see resolveTableDensity\n const resolved = { ...TABLE_DEFAULTS, ...definedProps(tableProps) } as TableProps;\n resolved.density = resolveTableDensity(resolved.density, themeDensity.level);\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/tokens/density.ts"],"sourcesContent":["import { useTheme } from '@mui/material/styles/index.js';\nimport type { ThemeOptions } from '@mui/material/styles/index.js';\n\nimport {\n densityFieldHeight,\n densityFontSize,\n densitySpacingUnit,\n resolveDensityFactor,\n type DensityLevel,\n type ResolvedDensity,\n} from './density.core';\nimport {\n checkboxRadioDensityOverrides,\n chipDensityOverrides,\n iconButtonDensityOverrides,\n paginationItemDensityOverrides,\n sliderDensityOverrides,\n switchDensityOverrides,\n tabDensityOverrides,\n tableCellDensityOverrides,\n tabsIndicatorDensityOverrides,\n toggleButtonDensityOverrides,\n} from './density-overrides';\nimport { fieldOverrides, mergeMuiComponents } from './field-height';\nimport { DEFAULT_FIELD_RADIUS } from './field-radius.core';\n\n/**\n * DENSITY ON THE WEB: the MUI theme channel, the reader, and the standalone\n * entry point for a host that never calls `createUiTheme`/`UiProvider`.\n *\n * The argument for one density knob, the factor table and its precedence are\n * in `./density.core.ts`.\n */\n\nexport {\n DEFAULT_DENSITY,\n DENSITY_FACTOR,\n densityFieldHeight,\n densityFontSize,\n densitySpacingUnit,\n resolveDensityFactor,\n type DensityLevel,\n type ResolvedDensity,\n} from './density.core';\n\ndeclare module '@mui/material/styles' {\n interface Theme {\n /** The density this theme renders at. See `@12-apps/ui/tokens`' `useDensity`. */\n density?: ResolvedDensity;\n }\n interface ThemeOptions {\n /** The density this theme renders at. See `@12-apps/ui/tokens`' `useDensity`. */\n density?: ResolvedDensity;\n }\n}\n\n/**\n * The theme's resolved density — a plain theme read, not a step-shifting\n * resolver (`size` stays hierarchy; see `./density.core.ts`). A `styleOverrides`\n * callback already gets `{ theme }` and can read `theme.density` directly;\n * this is for a component that needs the level in its own render logic\n * (`Table`/`DataGrid`/`DataViews` each read it once to source their own\n * `density` prop's default).\n *\n * Falls back to `resolveDensityFactor()` (`'normal'`, factor `1`) for a bare\n * MUI theme built without `createUiTheme`/`muiThemeOptionsFrom`.\n */\nexport function useDensity(): ResolvedDensity {\n return useTheme().density ?? resolveDensityFactor();\n}\n\n/**\n * The density factor as a MUI `ThemeOptions` fragment, for a host that builds\n * `createTheme()` directly and never calls `createUiTheme`/`UiProvider` — the\n * same precedence `resolveDensityFactor` gives `createUiTheme`, so the two\n * consumption paths agree on `typography`/`spacing`/`fieldHeight`/`components`\n * (FUT-2764's Design section), not just the first two. `fieldHeight` matters\n * on its own: `Input`/`Select`/`Button` each read `theme.fieldHeight` directly\n * (`Input.tsx`, `Select.tsx`, `Button.styles.ts`'s `buttonSize`), so a fragment\n * that carried only `typography`/`spacing` left every field standing at the\n * DEFAULT height (2.5) at every density on this path — the two paths would\n * agree on the type scale and disagree on the one number three components key\n * their own layout off.\n *\n * `components` is the matching MUI-native override (`fieldOverrides`, plus\n * FUT-2766's `iconButtonDensityOverrides`/`chipDensityOverrides`, FUT-2767's\n * `checkboxRadioDensityOverrides`/`switchDensityOverrides` and FUT-2768's\n * `toggleButtonDensityOverrides`/`tabDensityOverrides`/\n * `tabsIndicatorDensityOverrides`/`tableCellDensityOverrides`/\n * `paginationItemDensityOverrides`/`sliderDensityOverrides`) for a HOST's own\n * bare `TextField`/`Select`/`IconButton`/`Chip`/`Checkbox`/`Radio`/`Switch`/\n * `ToggleButton`/`Tab`/`Tabs`/`TableCell`/`Pagination`/`Slider`, mirroring\n * `muiThemeOptionsFrom`'s own `components: mergeMuiComponents(...)`. It\n * carries ONLY the overrides this function knows about (`MuiOutlinedInput`'s\n * `root`, `input` and `notchedOutline`; `MuiInputLabel`'s `outlined`;\n * `MuiIconButton`'s `root`/`sizeSmall`/`sizeLarge`; `MuiChip`'s\n * `root`/`sizeSmall`/`label`/`labelSmall`; `MuiCheckbox`'s and `MuiRadio`'s\n * `root`; `MuiSwitch`'s `root`/`switchBase`/`thumb`/`sizeSmall`;\n * `MuiToggleButton`'s `root`/`sizeSmall`/`sizeLarge`; `MuiTab`'s\n * `root`/`labelIcon`; `MuiTabs`'s `indicator`; `MuiTableCell`'s\n * `root`/`sizeSmall`; `MuiPaginationItem`'s `root`/`sizeSmall`/`sizeLarge`;\n * `MuiSlider`'s `root`/`sizeSmall`/`thumb`/`thumbSizeSmall`) — a host with ITS\n * OWN overrides for OTHER components merges them in with\n * `mergeMuiComponents(densityThemeOptions(density).components, hostOverrides)`,\n * which keeps a component only ONE side touches untouched. For a component\n * BOTH sides style, the merge is by INNER key (`root`/`input`/…): a key only\n * one side sets survives from that side, but a key BOTH set is replaced\n * WHOLESALE by whichever source is passed LAST — not deep-merged — so a host\n * wanting to ADD to, say, `MuiOutlinedInput`'s `root` alongside the radius\n * override needs to write that one key's object out in full itself.\n *\n * `fieldRadius` (3rd argument, optional) exists because density does NOT touch\n * the field's CORNER — this is only for a host that already draws its OWN,\n * non-default radius and wants `components` to match it instead of clashing;\n * it defaults\n * to the same {@link DEFAULT_FIELD_RADIUS} `createUiTheme` itself falls back\n * to when a host names no `fieldRadius`, so the two paths still agree with no\n * argument passed at all — the existing 2-argument call keeps working\n * unchanged.\n *\n * **Where to spread it — the first `createTheme()` call, not a later layering\n * one.** `createTheme(options, ...args)` (`createThemeNoVars.js`) only runs\n * `createSpacing`/`createTypography` on `options`, the FIRST argument; every\n * later argument is deep-merged onto the theme those two already built, with\n * no such reprocessing. So a host with a base theme and a SECOND, layering\n * `createTheme()` call on top of it — exactly the shape a two-theme host uses,\n * `createTheme(outer, { palette: { ... } })` — must apply density at the\n * FIRST call (where the base itself is built), never spread onto `outer` in\n * the second one:\n *\n * ```ts\n * // RIGHT — density goes into the base's OWN construction. The second,\n * // layering call is unaffected: it never restates spacing/typography/\n * // fieldHeight/components itself, so `theme.spacing`/`pxToRem`/`fieldHeight`\n * // carry over from `base` UNCHANGED, already correctly scaled.\n * const base = createTheme({ palette: { primary: { main }, ... }, ...densityThemeOptions('compact') });\n * const themed = createTheme(base, { palette: { primary: { main: brand } } });\n *\n * // WRONG — a second, layering argument onto an ALREADY-BUILT theme is\n * // deepmerged with no reprocessing: `spacing`/`typography.fontSize` would\n * // overwrite the already-resolved `theme.spacing` function/`pxToRem` ratio\n * // instead of rescaling them.\n * createTheme(outer, { ...densityThemeOptions('compact') });\n * ```\n */\nexport function densityThemeOptions(\n density: DensityLevel | number,\n factors?: Partial<Record<DensityLevel, number>>,\n fieldRadius: number = DEFAULT_FIELD_RADIUS,\n): Pick<ThemeOptions, 'typography' | 'spacing' | 'fieldHeight' | 'fieldRadius' | 'components'> {\n const { factor } = resolveDensityFactor(density, factors);\n const fieldHeight = densityFieldHeight(factor);\n return {\n typography: { fontSize: densityFontSize(factor) },\n spacing: densitySpacingUnit(factor),\n fieldHeight,\n // A standalone host (never `createUiTheme`/`UiProvider`) that draws its\n // OWN, non-default radius states it through this 3rd argument; reporting\n // it back here (FUT-2967) lets `@12-apps/app-shell`'s `createAppTheme`\n // spread this object's OWN `fieldRadius` into its `createTheme()` call\n // instead of tracking the number separately — the two can never disagree.\n fieldRadius,\n components: mergeMuiComponents(\n fieldOverrides(fieldRadius, fieldHeight),\n iconButtonDensityOverrides(),\n chipDensityOverrides(),\n checkboxRadioDensityOverrides(),\n switchDensityOverrides(),\n toggleButtonDensityOverrides(),\n tabDensityOverrides(),\n tabsIndicatorDensityOverrides(),\n tableCellDensityOverrides(),\n paginationItemDensityOverrides(),\n sliderDensityOverrides(),\n ),\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,gBAAgB;AAmElB,SAAS,aAA8B;AAC5C,SAAO,SAAS,EAAE,WAAW,qBAAqB;AACpD;AA4EO,SAAS,oBACd,SACA,SACA,cAAsB,sBACuE;AAC7F,QAAM,EAAE,OAAO,IAAI,qBAAqB,SAAS,OAAO;AACxD,QAAM,cAAc,mBAAmB,MAAM;AAC7C,SAAO;AAAA,IACL,YAAY,EAAE,UAAU,gBAAgB,MAAM,EAAE;AAAA,IAChD,SAAS,mBAAmB,MAAM;AAAA,IAClC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMA;AAAA,IACA,YAAY;AAAA,MACV,eAAe,aAAa,WAAW;AAAA,MACvC,2BAA2B;AAAA,MAC3B,qBAAqB;AAAA,MACrB,8BAA8B;AAAA,MAC9B,uBAAuB;AAAA,MACvB,6BAA6B;AAAA,MAC7B,oBAAoB;AAAA,MACpB,8BAA8B;AAAA,MAC9B,0BAA0B;AAAA,MAC1B,+BAA+B;AAAA,MAC/B,uBAAuB;AAAA,IACzB;AAAA,EACF;AACF;","names":[]}