@12-apps/ui 6.37.0 → 6.39.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 (917) hide show
  1. package/dist/_internal/components/data-display/AsyncStateContainer/AsyncStateContainer.js +4 -4
  2. package/dist/_internal/components/data-display/CardKit/CardKebab.js +2 -2
  3. package/dist/_internal/components/data-display/DataGrid/DataGrid.body.js +3 -2
  4. package/dist/_internal/components/data-display/DataGrid/DataGrid.cells.js +2 -1
  5. package/dist/_internal/components/data-display/DataGrid/DataGrid.js +4 -4
  6. package/dist/_internal/components/data-display/DataGrid/DataGrid.model.js +2 -1
  7. package/dist/_internal/components/data-display/DataViews/DataViewsBoard.js +2 -2
  8. package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +49 -49
  9. package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +61 -62
  10. package/dist/_internal/components/data-display/DataViews/DeleteViewDialog.js +4 -5
  11. package/dist/_internal/components/data-display/DataViews/ManageViewsDialog.js +4 -5
  12. package/dist/_internal/components/data-display/DataViews/SaveViewModal.js +9 -10
  13. package/dist/_internal/components/data-display/DataViews/base-card.js +4 -5
  14. package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +6 -6
  15. package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +5 -5
  16. package/dist/_internal/components/data-display/DataViews/base-list-card.js +9 -10
  17. package/dist/_internal/components/data-display/DataViews/data-views-category-pill.js +8 -8
  18. package/dist/_internal/components/data-display/DataViews/data-views-columns-tab.js +2 -2
  19. package/dist/_internal/components/data-display/DataViews/data-views-columns.js +3 -3
  20. package/dist/_internal/components/data-display/DataViews/data-views-display-panel.js +6 -6
  21. package/dist/_internal/components/data-display/DataViews/data-views-display-tabs.js +3 -3
  22. package/dist/_internal/components/data-display/DataViews/data-views-empty.js +2 -2
  23. package/dist/_internal/components/data-display/DataViews/data-views-export.js +2 -2
  24. package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +14 -14
  25. package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +12 -12
  26. package/dist/_internal/components/data-display/DataViews/data-views-grid-helpers.js +2 -2
  27. package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +46 -46
  28. package/dist/_internal/components/data-display/DataViews/data-views-header-row.js +2 -2
  29. package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +14 -14
  30. package/dist/_internal/components/data-display/DataViews/data-views-layout-context.js +1 -1
  31. package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +11 -11
  32. package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +12 -12
  33. package/dist/_internal/components/data-display/DataViews/data-views-overflow-costs.js +4 -3
  34. package/dist/_internal/components/data-display/DataViews/data-views-overflow.js +3 -2
  35. package/dist/_internal/components/data-display/DataViews/data-views-pagination.js +4 -4
  36. package/dist/_internal/components/data-display/DataViews/data-views-range-pill.js +2 -2
  37. package/dist/_internal/components/data-display/DataViews/data-views-scope-tabs.js +2 -2
  38. package/dist/_internal/components/data-display/DataViews/data-views-select-all-strip.js +2 -2
  39. package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +18 -18
  40. package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +18 -19
  41. package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +17 -17
  42. package/dist/_internal/components/data-display/DataViews/data-views-view-nav.js +2 -2
  43. package/dist/_internal/components/data-display/DataViews/list-card-rails.js +2 -2
  44. package/dist/_internal/components/data-display/DataViews/save-view-preview.js +2 -2
  45. package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +4 -4
  46. package/dist/_internal/components/data-display/DescriptionItem/DescriptionItem.js +2 -2
  47. package/dist/_internal/components/data-display/FleetMap/FleetBody.js +12 -12
  48. package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js +8 -8
  49. package/dist/_internal/components/data-display/FleetMap/FleetMap.js +13 -13
  50. package/dist/_internal/components/data-display/FleetMap/FleetRoster.js +3 -3
  51. package/dist/_internal/components/data-display/LazyImage/LazyImage.js +3 -3
  52. package/dist/_internal/components/data-display/LoadingState/LoadingState.js +3 -3
  53. package/dist/_internal/components/data-display/MapPreview/MapDecorations.js +2 -2
  54. package/dist/_internal/components/data-display/MapPreview/MapPreview.hooks.js +2 -2
  55. package/dist/_internal/components/data-display/MapPreview/MapPreview.js +7 -7
  56. package/dist/_internal/components/data-display/MapPreview/MapTiles.js +2 -2
  57. package/dist/_internal/components/data-display/MapPreview/StaticMapView.js +4 -4
  58. package/dist/_internal/components/data-display/MapPreview/mapProjection.js +3 -3
  59. package/dist/_internal/components/data-display/MapPreview/useMapPreview.js +3 -3
  60. package/dist/_internal/components/data-display/StatCard/StatCard.js +3 -3
  61. package/dist/_internal/components/data-display/Table/Table.helpers.js +5 -3
  62. package/dist/_internal/components/data-display/Table/Table.hooks.js +2 -1
  63. package/dist/_internal/components/data-display/Table/Table.js +4 -4
  64. package/dist/_internal/components/data-display/Table/TableParts.hooks.js +4 -2
  65. package/dist/_internal/components/data-display/Table/TableParts.js +4 -2
  66. package/dist/_internal/components/data-display/index.js +27 -27
  67. package/dist/_internal/components/feedback/Dialog/Dialog.js +3 -3
  68. package/dist/_internal/components/feedback/Dialog/Dialog.styles.js +2 -2
  69. package/dist/_internal/components/feedback/Modal/Modal.js +3 -2
  70. package/dist/_internal/components/feedback/Modal/Modal.styles.js +2 -1
  71. package/dist/_internal/components/feedback/Sonner/Sonner.js +2 -2
  72. package/dist/_internal/components/feedback/Sonner/SonnerToast.js +1 -1
  73. package/dist/_internal/components/feedback/StackedModal/StackedModal.js +4 -3
  74. package/dist/_internal/components/feedback/StackedModal/StackedModal.parts.js +3 -2
  75. package/dist/_internal/components/feedback/StackedModal/StackedModal.styles.js +2 -1
  76. package/dist/_internal/components/feedback/Toast/Toast.js +2 -1
  77. package/dist/_internal/components/feedback/TutorialOverlay/TutorialOverlay.geometry.js +1 -1
  78. package/dist/_internal/components/feedback/TutorialOverlay/TutorialOverlay.hooks.js +3 -2
  79. package/dist/_internal/components/feedback/TutorialOverlay/TutorialOverlay.js +5 -4
  80. package/dist/_internal/components/feedback/TutorialOverlay/TutorialStepBody.js +2 -1
  81. package/dist/_internal/components/feedback/index.js +14 -15
  82. package/dist/_internal/components/form/Calendar/Calendar.js +5 -4
  83. package/dist/_internal/components/form/Calendar/CalendarDay.js +2 -1
  84. package/dist/_internal/components/form/Calendar/CalendarDayCell.js +3 -2
  85. package/dist/_internal/components/form/Calendar/CalendarMonth.js +4 -3
  86. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.js +5 -5
  87. package/dist/_internal/components/form/Switch/Switch.js +4 -4
  88. package/dist/_internal/components/form/Switch/Switch.metrics.js +5 -1
  89. package/dist/_internal/components/form/Switch/Switch.parts.js +3 -3
  90. package/dist/_internal/components/form/Switch/Switch.styles.js +2 -2
  91. package/dist/_internal/components/form/index.js +9 -9
  92. package/dist/_internal/components/form/total-form/FormErrorSnackbar.js +3 -2
  93. package/dist/_internal/components/index.js +117 -118
  94. package/dist/_internal/components/layout/Accordion/Accordion.js +3 -2
  95. package/dist/_internal/components/layout/Accordion/Accordion.styles.js +2 -1
  96. package/dist/_internal/components/layout/Box/Box.js +1 -1
  97. package/dist/_internal/components/layout/Card/Card.js +3 -3
  98. package/dist/_internal/components/layout/Card/Card.styles.js +2 -2
  99. package/dist/_internal/components/layout/CardGrid/CardGrid.js +2 -1
  100. package/dist/_internal/components/layout/Collapsible/Collapsible.helpers.js +2 -1
  101. package/dist/_internal/components/layout/Collapsible/Collapsible.js +3 -2
  102. package/dist/_internal/components/layout/ContentToolbar/ColumnsMenu.js +1 -1
  103. package/dist/_internal/components/layout/ContentToolbar/ContentToolbar.js +1 -1
  104. package/dist/_internal/components/layout/ContentToolbar/FilterTrigger.js +1 -1
  105. package/dist/_internal/components/layout/ContentToolbar/MultiSelectDropdown.js +1 -1
  106. package/dist/_internal/components/layout/ContentToolbar/SavedViewsMenu.js +1 -1
  107. package/dist/_internal/components/layout/ContentToolbar/SortByDropdown.js +1 -1
  108. package/dist/_internal/components/layout/ContentToolbar/ViewSelector.js +1 -1
  109. package/dist/_internal/components/layout/Dashboard/Dashboard.js +2 -2
  110. package/dist/_internal/components/layout/Dashboard/DashboardParts.js +1 -1
  111. package/dist/_internal/components/layout/Drawer/Drawer.js +2 -1
  112. package/dist/_internal/components/layout/Resizable/Resizable.helpers.js +8 -3
  113. package/dist/_internal/components/layout/Resizable/Resizable.hooks.js +3 -2
  114. package/dist/_internal/components/layout/Resizable/Resizable.js +4 -3
  115. package/dist/_internal/components/layout/ScrollArea/ScrollArea.helpers.js +1 -1
  116. package/dist/_internal/components/layout/ScrollArea/ScrollArea.js +6 -5
  117. package/dist/_internal/components/layout/ScrollArea/ScrollArea.styles.js +6 -3
  118. package/dist/_internal/components/layout/ScrollArea/ScrollAreaContent.js +2 -1
  119. package/dist/_internal/components/layout/ScrollArea/ScrollViewport.js +3 -2
  120. package/dist/_internal/components/layout/Separator/Separator.js +4 -2
  121. package/dist/_internal/components/layout/Separator/Separator.styles.js +3 -1
  122. package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.items.js +3 -3
  123. package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.js +8 -8
  124. package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.rail.js +4 -4
  125. package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.styles.js +6 -5
  126. package/dist/_internal/components/layout/SettingsLayout/SettingsPanel.js +5 -5
  127. package/dist/_internal/components/layout/SettingsLayout/SettingsSectionChips.js +3 -3
  128. package/dist/_internal/components/layout/SettingsLayout/SettingsSectionHeader.js +2 -2
  129. package/dist/_internal/components/layout/SettingsLayout/SettingsStatusMarker.js +2 -2
  130. package/dist/_internal/components/layout/Sidebar/Sidebar.js +2 -1
  131. package/dist/_internal/components/layout/Skeleton/Skeleton.js +3 -2
  132. package/dist/_internal/components/layout/Skeleton/Skeleton.styles.js +6 -3
  133. package/dist/_internal/components/layout/Spacer/Spacer.js +2 -1
  134. package/dist/_internal/components/layout/Stack/Stack.js +2 -2
  135. package/dist/_internal/components/layout/TableFilter/TableFilter.js +1 -1
  136. package/dist/_internal/components/layout/index.js +31 -32
  137. package/dist/_internal/components/navigation/AppHeader/AppHeader.brand.js +1 -1
  138. package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js +3 -4
  139. package/dist/_internal/components/navigation/AppHeader/AppHeader.identity.js +2 -2
  140. package/dist/_internal/components/navigation/AppHeader/AppHeader.js +1 -1
  141. package/dist/_internal/components/navigation/Breadcrumbs/BreadcrumbEntry.js +2 -2
  142. package/dist/_internal/components/navigation/Breadcrumbs/Breadcrumbs.js +3 -3
  143. package/dist/_internal/components/navigation/Breadcrumbs/Breadcrumbs.styles.js +1 -1
  144. package/dist/_internal/components/navigation/CommandPalette/CommandPalette.js +3 -3
  145. package/dist/_internal/components/navigation/CommandPalette/CommandPaletteResults.js +2 -2
  146. package/dist/_internal/components/navigation/CommandPalette/ShortcutChip.js +1 -1
  147. package/dist/_internal/components/navigation/ContextMenu/ContextMenu.js +1 -1
  148. package/dist/_internal/components/navigation/DropdownMenu/DropdownMenu.js +1 -1
  149. package/dist/_internal/components/navigation/NavigationMenu/NavigationMegaSection.js +4 -4
  150. package/dist/_internal/components/navigation/NavigationMenu/NavigationMenu.js +6 -6
  151. package/dist/_internal/components/navigation/NavigationMenu/NavigationMenu.shell.js +2 -2
  152. package/dist/_internal/components/navigation/NavigationMenu/NavigationMenu.styles.js +1 -1
  153. package/dist/_internal/components/navigation/NavigationMenu/NavigationMenuItem.js +2 -2
  154. package/dist/_internal/components/navigation/NavigationMenu/NavigationStandardBody.js +4 -4
  155. package/dist/_internal/components/navigation/Pagination/Pagination.js +3 -3
  156. package/dist/_internal/components/navigation/Pagination/Pagination.styles.js +1 -1
  157. package/dist/_internal/components/navigation/Pagination/PaginationParts.js +2 -1
  158. package/dist/_internal/components/navigation/Tabs/Tabs.js +10 -3
  159. package/dist/_internal/components/navigation/Tabs/Tabs.styles.js +8 -1
  160. package/dist/_internal/components/navigation/Tabs/TabsPanel.js +2 -1
  161. package/dist/_internal/components/navigation/index.js +26 -27
  162. package/dist/_internal/components/typography/Blockquote/Blockquote.js +1 -1
  163. package/dist/_internal/components/typography/Code/Code.js +1 -1
  164. package/dist/_internal/components/typography/Text/Text.js +1 -1
  165. package/dist/_internal/components/typography/index.js +3 -3
  166. package/dist/_internal/components/utility/AnimatedIcon/AnimatedIcon.animations.js +2 -1
  167. package/dist/_internal/components/utility/AnimatedIcon/AnimatedIcon.js +3 -3
  168. package/dist/_internal/components/utility/AnimatedIcon/AnimatedIcon.styles.js +2 -2
  169. package/dist/_internal/components/utility/AspectRatio/AspectRatio.js +2 -1
  170. package/dist/_internal/components/utility/InfiniteScroll/InfiniteScroll.hooks.js +1 -1
  171. package/dist/_internal/components/utility/InfiniteScroll/InfiniteScroll.js +4 -3
  172. package/dist/_internal/components/utility/InfiniteScroll/InfiniteScroll.parts.js +2 -1
  173. package/dist/_internal/components/utility/VirtualList/VirtualList.hooks.js +6 -3
  174. package/dist/_internal/components/utility/VirtualList/VirtualList.js +3 -2
  175. package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.js +3 -3
  176. package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.parts.js +1 -1
  177. package/dist/_internal/components/utility/WorkflowStep/WorkflowStepRow.js +2 -2
  178. package/dist/_internal/components/utility/index.js +12 -12
  179. package/dist/_internal/social-login-button/social-login-button.js +6 -7
  180. package/dist/_internal/tokens/shadow.js +19 -8
  181. package/dist/_internal/tokens/shadow.js.map +1 -1
  182. package/dist/_internal/user-avatar/user-avatar.js +4 -5
  183. package/dist/{chunk-J2DAQQQH.js → chunk-222HN7GK.js} +33 -64
  184. package/dist/chunk-222HN7GK.js.map +1 -0
  185. package/dist/{chunk-2BIVCYTO.js → chunk-27LOJVR3.js} +5 -5
  186. package/dist/{chunk-BLJDCMFU.js → chunk-2ARVNCVU.js} +7 -7
  187. package/dist/chunk-2ARVNCVU.js.map +1 -0
  188. package/dist/{chunk-CRZXSZ5O.js → chunk-2S752BIJ.js} +2 -2
  189. package/dist/{chunk-IYTBTK2M.js → chunk-2WU52FLP.js} +19 -30
  190. package/dist/chunk-2WU52FLP.js.map +1 -0
  191. package/dist/{chunk-RSQMPCCR.js → chunk-34643ATX.js} +10 -4
  192. package/dist/chunk-34643ATX.js.map +1 -0
  193. package/dist/{chunk-6GRZ77IS.js → chunk-3AIRFAI3.js} +13 -12
  194. package/dist/chunk-3AIRFAI3.js.map +1 -0
  195. package/dist/{chunk-Q73PTVNO.js → chunk-3FNXOCBD.js} +24 -12
  196. package/dist/chunk-3FNXOCBD.js.map +1 -0
  197. package/dist/{chunk-BAQBUKDU.js → chunk-3KREF4ZF.js} +2 -2
  198. package/dist/{chunk-EL7CMURV.js → chunk-3LSIFHQK.js} +3 -3
  199. package/dist/chunk-3LSIFHQK.js.map +1 -0
  200. package/dist/{chunk-MP4VSWHK.js → chunk-3NJMNMWB.js} +12 -2
  201. package/dist/chunk-3NJMNMWB.js.map +1 -0
  202. package/dist/{chunk-N52O2OKZ.js → chunk-3NNO6YIH.js} +8 -3
  203. package/dist/chunk-3NNO6YIH.js.map +1 -0
  204. package/dist/{chunk-SYN46YL6.js → chunk-3RMDIO4G.js} +3 -3
  205. package/dist/{chunk-S3D5VBHW.js → chunk-3YOXVNO4.js} +7 -7
  206. package/dist/{chunk-MJ3BVWPZ.js → chunk-43G3WMYN.js} +12 -7
  207. package/dist/chunk-43G3WMYN.js.map +1 -0
  208. package/dist/{chunk-E7MSDXED.js → chunk-43H66TVT.js} +12 -5
  209. package/dist/chunk-43H66TVT.js.map +1 -0
  210. package/dist/{chunk-IL7JZKXY.js → chunk-442FSG7G.js} +3 -3
  211. package/dist/{chunk-JL75FJRG.js → chunk-4ALF5PB5.js} +4 -4
  212. package/dist/{chunk-DYVAOEW4.js → chunk-4D4LLSQC.js} +6 -5
  213. package/dist/chunk-4D4LLSQC.js.map +1 -0
  214. package/dist/{chunk-NEGCJNGJ.js → chunk-4G47KBTP.js} +9 -9
  215. package/dist/chunk-4G47KBTP.js.map +1 -0
  216. package/dist/{chunk-MVXFMIVZ.js → chunk-4GB46HLK.js} +8 -4
  217. package/dist/chunk-4GB46HLK.js.map +1 -0
  218. package/dist/{chunk-CS3KOKL3.js → chunk-4GWHYLEB.js} +2 -2
  219. package/dist/{chunk-XJPJ6ESI.js → chunk-4OAKGKK5.js} +3 -3
  220. package/dist/{chunk-4OEKIFBC.js → chunk-4VMFS3VJ.js} +6 -3
  221. package/dist/chunk-4VMFS3VJ.js.map +1 -0
  222. package/dist/{chunk-6CTPDNNX.js → chunk-52G2KRL4.js} +14 -14
  223. package/dist/chunk-52G2KRL4.js.map +1 -0
  224. package/dist/{chunk-4CHROSWR.js → chunk-5ETBB2DG.js} +2 -2
  225. package/dist/{chunk-E7T3A4IR.js → chunk-5JCGBCFJ.js} +2 -2
  226. package/dist/{chunk-ATSHKSSD.js → chunk-5KNDAC24.js} +20 -7
  227. package/dist/chunk-5KNDAC24.js.map +1 -0
  228. package/dist/{chunk-ULTOQ6ZV.js → chunk-5LWB4BYX.js} +80 -89
  229. package/dist/chunk-5LWB4BYX.js.map +1 -0
  230. package/dist/{chunk-FC7NQ6XM.js → chunk-5MW7OYBM.js} +2 -2
  231. package/dist/{chunk-46UPILLK.js → chunk-5NT2M2JI.js} +2 -2
  232. package/dist/{chunk-MK4CH4VT.js → chunk-5OUEKIWQ.js} +14 -12
  233. package/dist/chunk-5OUEKIWQ.js.map +1 -0
  234. package/dist/{chunk-GHXFCMFP.js → chunk-5QAJ3Y5F.js} +3 -3
  235. package/dist/{chunk-GHXFCMFP.js.map → chunk-5QAJ3Y5F.js.map} +1 -1
  236. package/dist/{chunk-CPTY6UZ6.js → chunk-6KEXHOIF.js} +5 -4
  237. package/dist/chunk-6KEXHOIF.js.map +1 -0
  238. package/dist/{chunk-H5BEWPEY.js → chunk-6N2EDWMG.js} +2 -2
  239. package/dist/{chunk-BW62QQAG.js → chunk-6N4AA2Y7.js} +2 -2
  240. package/dist/{chunk-EFHIMCJN.js → chunk-6P2OFMBX.js} +11 -9
  241. package/dist/chunk-6P2OFMBX.js.map +1 -0
  242. package/dist/{chunk-GJQYM3PM.js → chunk-6PU3JYVY.js} +2 -2
  243. package/dist/{chunk-GUW5BUK7.js → chunk-6WBKOM5K.js} +15 -7
  244. package/dist/chunk-6WBKOM5K.js.map +1 -0
  245. package/dist/{chunk-7EIOXZWL.js → chunk-74P3YX7R.js} +4 -4
  246. package/dist/{chunk-VYSFKR32.js → chunk-75CGLX6Q.js} +3 -3
  247. package/dist/{chunk-VYSFKR32.js.map → chunk-75CGLX6Q.js.map} +1 -1
  248. package/dist/{chunk-LVEG6XQL.js → chunk-76X6JRVI.js} +19 -33
  249. package/dist/chunk-76X6JRVI.js.map +1 -0
  250. package/dist/{chunk-2NLYGZP3.js → chunk-77JL5XVD.js} +13 -9
  251. package/dist/chunk-77JL5XVD.js.map +1 -0
  252. package/dist/{chunk-PUBPZOQJ.js → chunk-AG3DY5TH.js} +8 -5
  253. package/dist/chunk-AG3DY5TH.js.map +1 -0
  254. package/dist/{chunk-T3WHW7ZC.js → chunk-BAZXVFLR.js} +10 -6
  255. package/dist/chunk-BAZXVFLR.js.map +1 -0
  256. package/dist/{chunk-7F7TTOYN.js → chunk-BEGTLELZ.js} +7 -6
  257. package/dist/chunk-BEGTLELZ.js.map +1 -0
  258. package/dist/{chunk-VT5HQ2AD.js → chunk-BFMDA6UO.js} +3 -3
  259. package/dist/{chunk-R75DZ3AK.js → chunk-BVLMKSHX.js} +2 -2
  260. package/dist/{chunk-75LOTMSN.js → chunk-BWHOCNGW.js} +5 -5
  261. package/dist/chunk-BWHOCNGW.js.map +1 -0
  262. package/dist/{chunk-PMP6WJJS.js → chunk-BWMHGENX.js} +20 -19
  263. package/dist/chunk-BWMHGENX.js.map +1 -0
  264. package/dist/{chunk-TUBCN4DJ.js → chunk-CB6DTWD5.js} +7 -7
  265. package/dist/chunk-CB6DTWD5.js.map +1 -0
  266. package/dist/{chunk-CAHWCSRE.js → chunk-D46SLMCX.js} +22 -8
  267. package/dist/chunk-D46SLMCX.js.map +1 -0
  268. package/dist/{chunk-FFOQZRFC.js → chunk-D4FZ3ANG.js} +15 -5
  269. package/dist/chunk-D4FZ3ANG.js.map +1 -0
  270. package/dist/{chunk-2OIP3T5O.js → chunk-DBFRCTI5.js} +4 -4
  271. package/dist/{chunk-2OIP3T5O.js.map → chunk-DBFRCTI5.js.map} +1 -1
  272. package/dist/{chunk-HNPWZ3W2.js → chunk-DDRKYNPB.js} +4 -4
  273. package/dist/{chunk-DLJGBJZW.js → chunk-DGMDQHMI.js} +16 -9
  274. package/dist/chunk-DGMDQHMI.js.map +1 -0
  275. package/dist/{chunk-IAGOUTI6.js → chunk-DNT5PZLF.js} +21 -12
  276. package/dist/chunk-DNT5PZLF.js.map +1 -0
  277. package/dist/{chunk-HU7TX7RB.js → chunk-DUBTI4DI.js} +4 -4
  278. package/dist/{chunk-DZA7RSLX.js → chunk-DVSO3EG6.js} +19 -11
  279. package/dist/chunk-DVSO3EG6.js.map +1 -0
  280. package/dist/{chunk-RMCNEKBZ.js → chunk-DW6F7354.js} +2 -2
  281. package/dist/{chunk-Q4BQYYPU.js → chunk-E2QIKJX2.js} +11 -5
  282. package/dist/chunk-E2QIKJX2.js.map +1 -0
  283. package/dist/{chunk-XJUEHG72.js → chunk-EERUSI52.js} +2 -2
  284. package/dist/{chunk-NDNYD4FG.js → chunk-EHYI2WCJ.js} +5 -5
  285. package/dist/{chunk-NB3FGWU4.js → chunk-EQXIW5MQ.js} +2 -2
  286. package/dist/{chunk-QAP3FW33.js → chunk-ERY6D2OV.js} +35 -23
  287. package/dist/chunk-ERY6D2OV.js.map +1 -0
  288. package/dist/{chunk-NPP44TQG.js → chunk-EYZ6QBTV.js} +2 -2
  289. package/dist/{chunk-NPP44TQG.js.map → chunk-EYZ6QBTV.js.map} +1 -1
  290. package/dist/{chunk-2ZIHZLF5.js → chunk-F44R7US6.js} +4 -4
  291. package/dist/{chunk-AROBXRC5.js → chunk-F7JTIHV5.js} +18 -7
  292. package/dist/chunk-F7JTIHV5.js.map +1 -0
  293. package/dist/{chunk-U342T7ZR.js → chunk-FOCU4QT5.js} +13 -10
  294. package/dist/chunk-FOCU4QT5.js.map +1 -0
  295. package/dist/{chunk-35S6QI5G.js → chunk-FX26DAFF.js} +2 -2
  296. package/dist/{chunk-FYTLKHEN.js → chunk-FYKFQPVT.js} +19 -18
  297. package/dist/chunk-FYKFQPVT.js.map +1 -0
  298. package/dist/{chunk-TVL5V2JK.js → chunk-GGMB6LJH.js} +7 -3
  299. package/dist/chunk-GGMB6LJH.js.map +1 -0
  300. package/dist/{chunk-AYLEZM6T.js → chunk-GLFTIGOF.js} +3 -3
  301. package/dist/{chunk-QEG3P5D4.js → chunk-GLHNMTP6.js} +13 -13
  302. package/dist/{chunk-7UZ2TFIK.js → chunk-GNCSDUGY.js} +12 -4
  303. package/dist/chunk-GNCSDUGY.js.map +1 -0
  304. package/dist/{chunk-L4UP5VYS.js → chunk-GVH7C2PT.js} +2 -2
  305. package/dist/{chunk-MBSYD3ZU.js → chunk-GWFAINQ7.js} +3 -3
  306. package/dist/chunk-GWFAINQ7.js.map +1 -0
  307. package/dist/{chunk-YU26GBNX.js → chunk-H3AQQOTI.js} +9 -4
  308. package/dist/chunk-H3AQQOTI.js.map +1 -0
  309. package/dist/{chunk-HTZNB6IV.js → chunk-H5ZTIELC.js} +23 -8
  310. package/dist/chunk-H5ZTIELC.js.map +1 -0
  311. package/dist/{chunk-AER4245J.js → chunk-H67EL3CG.js} +6 -6
  312. package/dist/{chunk-GSFNH4C5.js → chunk-HBP2OU4Q.js} +15 -8
  313. package/dist/chunk-HBP2OU4Q.js.map +1 -0
  314. package/dist/{chunk-57JLS55D.js → chunk-HBRQPG7H.js} +7 -7
  315. package/dist/{chunk-3D6HXKZM.js → chunk-HDJQDMHB.js} +18 -13
  316. package/dist/chunk-HDJQDMHB.js.map +1 -0
  317. package/dist/{chunk-HGMBY5LP.js → chunk-HQWJUHR4.js} +18 -11
  318. package/dist/chunk-HQWJUHR4.js.map +1 -0
  319. package/dist/{chunk-UZ6AUTE6.js → chunk-I3F4C5SS.js} +7 -7
  320. package/dist/{chunk-L7SFH3ED.js → chunk-I7GSRTGQ.js} +37 -28
  321. package/dist/chunk-I7GSRTGQ.js.map +1 -0
  322. package/dist/{chunk-Q4CAZ2TP.js → chunk-IG23YZZR.js} +6 -5
  323. package/dist/chunk-IG23YZZR.js.map +1 -0
  324. package/dist/{chunk-5W4BLTDI.js → chunk-IWFENXST.js} +7 -6
  325. package/dist/chunk-IWFENXST.js.map +1 -0
  326. package/dist/{chunk-HXEBKOSM.js → chunk-J5UZB6Y6.js} +2 -2
  327. package/dist/chunk-J5UZB6Y6.js.map +1 -0
  328. package/dist/{chunk-4CXEWFKO.js → chunk-J5VWGQSR.js} +2 -2
  329. package/dist/{chunk-AJ5SDHX5.js → chunk-JCL7WK4G.js} +2 -2
  330. package/dist/{chunk-MTFCPPZ5.js → chunk-JWZJSXI5.js} +3 -2
  331. package/dist/chunk-JWZJSXI5.js.map +1 -0
  332. package/dist/{chunk-5CKDRLRN.js → chunk-JXECOCNA.js} +35 -19
  333. package/dist/chunk-JXECOCNA.js.map +1 -0
  334. package/dist/{chunk-WUTHROII.js → chunk-JYWF76Z5.js} +11 -5
  335. package/dist/chunk-JYWF76Z5.js.map +1 -0
  336. package/dist/{chunk-B76QCDCE.js → chunk-K4L42FF6.js} +6 -3
  337. package/dist/chunk-K4L42FF6.js.map +1 -0
  338. package/dist/{chunk-4JFL62K3.js → chunk-K7FSTB2K.js} +3 -3
  339. package/dist/{chunk-WE3LJPRN.js → chunk-KE473LK6.js} +2 -2
  340. package/dist/{chunk-TBF2CPJW.js → chunk-KIHGTL2D.js} +21 -11
  341. package/dist/chunk-KIHGTL2D.js.map +1 -0
  342. package/dist/{chunk-3T5Z5HXF.js → chunk-KM3Y5TCG.js} +40 -36
  343. package/dist/chunk-KM3Y5TCG.js.map +1 -0
  344. package/dist/{chunk-C55AWF3U.js → chunk-KRQUPE4K.js} +4 -4
  345. package/dist/{chunk-SJO3K7SB.js → chunk-KXLUMEDX.js} +4 -4
  346. package/dist/{chunk-RWTFZ7J5.js → chunk-L4G5BZFF.js} +22 -13
  347. package/dist/chunk-L4G5BZFF.js.map +1 -0
  348. package/dist/{chunk-HB7ISSLK.js → chunk-L5RQIQIP.js} +26 -22
  349. package/dist/chunk-L5RQIQIP.js.map +1 -0
  350. package/dist/{chunk-CQPFSEJB.js → chunk-L7NQCLFU.js} +2 -2
  351. package/dist/{chunk-DVAAUWTC.js → chunk-LCHCE2G5.js} +2 -2
  352. package/dist/{chunk-G4HBNILE.js → chunk-LEHMWJNZ.js} +3 -3
  353. package/dist/{chunk-OATHOXIU.js → chunk-MC4KYGSX.js} +8 -8
  354. package/dist/chunk-MC4KYGSX.js.map +1 -0
  355. package/dist/{chunk-P6TNXBDA.js → chunk-MYKWJCR7.js} +9 -9
  356. package/dist/chunk-MYKWJCR7.js.map +1 -0
  357. package/dist/{chunk-YVUD3MY4.js → chunk-N23GCN5U.js} +7 -4
  358. package/dist/chunk-N23GCN5U.js.map +1 -0
  359. package/dist/{chunk-2TJOCI54.js → chunk-NCEQWEXT.js} +3 -3
  360. package/dist/{chunk-2TJOCI54.js.map → chunk-NCEQWEXT.js.map} +1 -1
  361. package/dist/{chunk-IVIHRZEY.js → chunk-NDMPXMW2.js} +12 -8
  362. package/dist/chunk-NDMPXMW2.js.map +1 -0
  363. package/dist/{chunk-UUUMNJPP.js → chunk-NLYNRE7L.js} +10 -10
  364. package/dist/chunk-NLYNRE7L.js.map +1 -0
  365. package/dist/{chunk-KLWW67WP.js → chunk-NOKN4HRK.js} +12 -11
  366. package/dist/chunk-NOKN4HRK.js.map +1 -0
  367. package/dist/{chunk-LIG7TKIB.js → chunk-NYFNF7I5.js} +11 -6
  368. package/dist/chunk-NYFNF7I5.js.map +1 -0
  369. package/dist/{chunk-KK57AHWS.js → chunk-OAEYCKBN.js} +2 -2
  370. package/dist/{chunk-JGRE56GQ.js → chunk-OB56SZGL.js} +2 -2
  371. package/dist/{chunk-TQ6FPOPD.js → chunk-ODW2D5PN.js} +39 -30
  372. package/dist/chunk-ODW2D5PN.js.map +1 -0
  373. package/dist/{chunk-VRDNUY4H.js → chunk-OHC3F7GJ.js} +4 -4
  374. package/dist/chunk-OHC3F7GJ.js.map +1 -0
  375. package/dist/{chunk-E4TNDTWV.js → chunk-OL2BEJZR.js} +2 -2
  376. package/dist/{chunk-ZTYUKEN3.js → chunk-OVXSQQDK.js} +12 -7
  377. package/dist/chunk-OVXSQQDK.js.map +1 -0
  378. package/dist/{chunk-ZQL5RXVE.js → chunk-PA3AA55Q.js} +2 -2
  379. package/dist/{chunk-ZQL5RXVE.js.map → chunk-PA3AA55Q.js.map} +1 -1
  380. package/dist/{chunk-IKLOIONQ.js → chunk-PCBZYORN.js} +3 -3
  381. package/dist/{chunk-CQLPDY2J.js → chunk-PRIBOWX4.js} +3 -3
  382. package/dist/{chunk-F42MJOHM.js → chunk-PVM7XTLZ.js} +64 -62
  383. package/dist/chunk-PVM7XTLZ.js.map +1 -0
  384. package/dist/{chunk-LT4NEKXB.js → chunk-QA2ZGCRL.js} +3 -3
  385. package/dist/{chunk-3TDVGZZN.js → chunk-QBTBRJ2Q.js} +37 -13
  386. package/dist/chunk-QBTBRJ2Q.js.map +1 -0
  387. package/dist/{chunk-2E2WOBID.js → chunk-QGFBIUOK.js} +5 -5
  388. package/dist/chunk-QGFBIUOK.js.map +1 -0
  389. package/dist/{chunk-2WFDHFK4.js → chunk-QNCWSDXE.js} +26 -11
  390. package/dist/chunk-QNCWSDXE.js.map +1 -0
  391. package/dist/{chunk-PQECNGDE.js → chunk-QSRZOXQI.js} +2 -2
  392. package/dist/{chunk-RHIDWUK7.js → chunk-QUWK7SYN.js} +1 -2
  393. package/dist/chunk-QUWK7SYN.js.map +1 -0
  394. package/dist/{chunk-ROT57BP4.js → chunk-R2XVTUVR.js} +2 -2
  395. package/dist/{chunk-UN5INW6K.js → chunk-R53ZOW4B.js} +8 -4
  396. package/dist/chunk-R53ZOW4B.js.map +1 -0
  397. package/dist/{chunk-MVKYNDT2.js → chunk-RKROWJVF.js} +11 -9
  398. package/dist/chunk-RKROWJVF.js.map +1 -0
  399. package/dist/{chunk-DCJSHYE5.js → chunk-RSDYS5B3.js} +4 -4
  400. package/dist/{chunk-NYZO3JNB.js → chunk-RXJQA3FQ.js} +2 -3
  401. package/dist/chunk-RXJQA3FQ.js.map +1 -0
  402. package/dist/{chunk-N5GVW6RO.js → chunk-S6IWKDWT.js} +2 -2
  403. package/dist/{chunk-DB2ZFZVW.js → chunk-SBIZXZPP.js} +3 -3
  404. package/dist/{chunk-NCPWLHZT.js → chunk-SKT2V2OX.js} +3 -3
  405. package/dist/{chunk-EOW2ECB3.js → chunk-SNURSSTN.js} +2 -2
  406. package/dist/{chunk-GRDPGHQJ.js → chunk-SV6JGFHG.js} +9 -5
  407. package/dist/chunk-SV6JGFHG.js.map +1 -0
  408. package/dist/{chunk-CZBND7AY.js → chunk-T7DE44SP.js} +2 -2
  409. package/dist/{chunk-D5SZXH7Q.js → chunk-TNBJ4DK4.js} +7 -3
  410. package/dist/chunk-TNBJ4DK4.js.map +1 -0
  411. package/dist/{chunk-3CVTQZQJ.js → chunk-TNYKM4UU.js} +13 -9
  412. package/dist/chunk-TNYKM4UU.js.map +1 -0
  413. package/dist/{chunk-3VMGE7CU.js → chunk-TZFBJ47T.js} +3 -3
  414. package/dist/chunk-TZFBJ47T.js.map +1 -0
  415. package/dist/{chunk-VFHGILXI.js → chunk-U3DBQXPI.js} +20 -17
  416. package/dist/chunk-U3DBQXPI.js.map +1 -0
  417. package/dist/{chunk-QKPD322X.js → chunk-UFNIS7KC.js} +2 -2
  418. package/dist/chunk-UFNIS7KC.js.map +1 -0
  419. package/dist/{chunk-BNEWMFVB.js → chunk-UGGJ3KDT.js} +2 -2
  420. package/dist/{chunk-L4QCIUTJ.js → chunk-UMNXSQ7I.js} +3 -3
  421. package/dist/{chunk-L4QCIUTJ.js.map → chunk-UMNXSQ7I.js.map} +1 -1
  422. package/dist/{chunk-2CTTASUD.js → chunk-V5EWCJBT.js} +7 -4
  423. package/dist/chunk-V5EWCJBT.js.map +1 -0
  424. package/dist/{chunk-236V2GRH.js → chunk-VCBV5JM7.js} +49 -41
  425. package/dist/chunk-VCBV5JM7.js.map +1 -0
  426. package/dist/{chunk-KREWQAEV.js → chunk-VIRYHNEM.js} +2 -2
  427. package/dist/{chunk-PT2XADGH.js → chunk-VPRNKJHP.js} +9 -6
  428. package/dist/chunk-VPRNKJHP.js.map +1 -0
  429. package/dist/{chunk-JXUWWPZR.js → chunk-VQYR64QB.js} +14 -8
  430. package/dist/chunk-VQYR64QB.js.map +1 -0
  431. package/dist/{chunk-72DKEBJM.js → chunk-VRPREI27.js} +3 -3
  432. package/dist/chunk-VRPREI27.js.map +1 -0
  433. package/dist/{chunk-N6CSXHFJ.js → chunk-WN5PNP6F.js} +2 -2
  434. package/dist/{chunk-6QLPSMTA.js → chunk-XEWMY4ZM.js} +52 -47
  435. package/dist/chunk-XEWMY4ZM.js.map +1 -0
  436. package/dist/{chunk-XR46FSOH.js → chunk-XIG3DXXX.js} +2 -2
  437. package/dist/{chunk-GHTBUJ6E.js → chunk-XRUW7DMH.js} +2 -2
  438. package/dist/{chunk-CSTAQX2B.js → chunk-XWZJLXJT.js} +7 -6
  439. package/dist/chunk-XWZJLXJT.js.map +1 -0
  440. package/dist/{chunk-PMOEG36E.js → chunk-XZJM6EPC.js} +8 -6
  441. package/dist/chunk-XZJM6EPC.js.map +1 -0
  442. package/dist/{chunk-QF6LTUCE.js → chunk-Y2X7LYIN.js} +4 -4
  443. package/dist/chunk-Y2X7LYIN.js.map +1 -0
  444. package/dist/{chunk-MBC55H6M.js → chunk-Y5UTYBZW.js} +12 -6
  445. package/dist/chunk-Y5UTYBZW.js.map +1 -0
  446. package/dist/{chunk-WTOYEWW6.js → chunk-YBH4SPMM.js} +4 -3
  447. package/dist/chunk-YBH4SPMM.js.map +1 -0
  448. package/dist/{chunk-JLQGRZMN.js → chunk-YCCY77W5.js} +3 -3
  449. package/dist/{chunk-5QWQR7XT.js → chunk-YHGOPZXW.js} +11 -8
  450. package/dist/chunk-YHGOPZXW.js.map +1 -0
  451. package/dist/{chunk-6BDYC4RA.js → chunk-YRSR5LVZ.js} +3 -3
  452. package/dist/{chunk-57JY4OI2.js → chunk-YUXDVW62.js} +3 -3
  453. package/dist/chunk-YUXDVW62.js.map +1 -0
  454. package/dist/{chunk-DF4K5XVW.js → chunk-YZVR5ROE.js} +14 -6
  455. package/dist/chunk-YZVR5ROE.js.map +1 -0
  456. package/dist/{chunk-RNEYZTE4.js → chunk-Z6MCTGIK.js} +2 -2
  457. package/dist/{chunk-RNEYZTE4.js.map → chunk-Z6MCTGIK.js.map} +1 -1
  458. package/dist/{chunk-AUSUCZYR.js → chunk-ZBVU2YWV.js} +5 -5
  459. package/dist/chunk-ZBVU2YWV.js.map +1 -0
  460. package/dist/{chunk-VZIB5W5L.js → chunk-ZGCPDA3F.js} +2 -2
  461. package/dist/data-display/AsyncStateContainer.js +4 -4
  462. package/dist/data-display/CardKit.js +2 -2
  463. package/dist/data-display/DataGrid.js +4 -4
  464. package/dist/data-display/DataViews.js +68 -69
  465. package/dist/data-display/DescriptionItem.js +2 -2
  466. package/dist/data-display/FleetMap.js +13 -13
  467. package/dist/data-display/LazyImage.js +3 -3
  468. package/dist/data-display/LoadingState.js +3 -3
  469. package/dist/data-display/MapPreview.js +7 -7
  470. package/dist/data-display/StatCard.js +3 -3
  471. package/dist/data-display/Table.js +4 -4
  472. package/dist/feedback/Dialog.js +3 -3
  473. package/dist/feedback/Modal.js +3 -2
  474. package/dist/feedback/Sonner.js +2 -2
  475. package/dist/feedback/StackedModal.js +4 -3
  476. package/dist/feedback/Toast.js +2 -1
  477. package/dist/feedback/TutorialOverlay.js +5 -4
  478. package/dist/form/Calendar.js +5 -4
  479. package/dist/form/DateRangePicker.js +5 -5
  480. package/dist/form/Switch.js +4 -4
  481. package/dist/form/total-form.js +2 -2
  482. package/dist/layout/Accordion.js +3 -2
  483. package/dist/layout/Box.js +1 -1
  484. package/dist/layout/Card.js +3 -3
  485. package/dist/layout/CardGrid.js +2 -1
  486. package/dist/layout/Collapsible.js +3 -2
  487. package/dist/layout/ContentToolbar.js +7 -7
  488. package/dist/layout/Dashboard.js +2 -2
  489. package/dist/layout/Drawer.js +2 -1
  490. package/dist/layout/Resizable.js +4 -3
  491. package/dist/layout/ScrollArea.js +6 -5
  492. package/dist/layout/Separator.js +4 -2
  493. package/dist/layout/SettingsLayout.js +8 -8
  494. package/dist/layout/Sidebar.js +2 -1
  495. package/dist/layout/Skeleton.js +3 -2
  496. package/dist/layout/Spacer.js +2 -1
  497. package/dist/layout/Stack.js +2 -2
  498. package/dist/layout/TableFilter.js +1 -1
  499. package/dist/native/form/Switch.js +3 -1
  500. package/dist/native/form/Switch.js.map +1 -1
  501. package/dist/navigation/AppHeader.js +6 -7
  502. package/dist/navigation/Breadcrumbs.js +3 -3
  503. package/dist/navigation/CommandPalette.js +3 -3
  504. package/dist/navigation/ContextMenu.js +1 -1
  505. package/dist/navigation/DropdownMenu.js +1 -1
  506. package/dist/navigation/NavigationMenu.js +6 -6
  507. package/dist/navigation/Pagination.js +3 -3
  508. package/dist/navigation/Tabs.js +10 -3
  509. package/dist/social-login-button.js +6 -7
  510. package/dist/types/components/data-display/DataGrid/DataGrid.body.d.ts.map +1 -1
  511. package/dist/types/components/data-display/DataGrid/DataGrid.cells.d.ts +4 -2
  512. package/dist/types/components/data-display/DataGrid/DataGrid.cells.d.ts.map +1 -1
  513. package/dist/types/components/data-display/DataGrid/DataGrid.model.d.ts +7 -1
  514. package/dist/types/components/data-display/DataGrid/DataGrid.model.d.ts.map +1 -1
  515. package/dist/types/components/data-display/DataGrid/DataGrid.types.d.ts +10 -4
  516. package/dist/types/components/data-display/DataGrid/DataGrid.types.d.ts.map +1 -1
  517. package/dist/types/components/data-display/DataViews/data-views-columns.d.ts.map +1 -1
  518. package/dist/types/components/data-display/DataViews/data-views-grid-helpers.d.ts +2 -0
  519. package/dist/types/components/data-display/DataViews/data-views-grid-helpers.d.ts.map +1 -1
  520. package/dist/types/components/data-display/DataViews/data-views-layout-context.d.ts +7 -3
  521. package/dist/types/components/data-display/DataViews/data-views-layout-context.d.ts.map +1 -1
  522. package/dist/types/components/data-display/DataViews/data-views-overflow-costs.d.ts +19 -9
  523. package/dist/types/components/data-display/DataViews/data-views-overflow-costs.d.ts.map +1 -1
  524. package/dist/types/components/data-display/DataViews/data-views-overflow.d.ts.map +1 -1
  525. package/dist/types/components/data-display/MapPreview/MapTiles.d.ts.map +1 -1
  526. package/dist/types/components/data-display/MapPreview/mapProjection.d.ts +6 -1
  527. package/dist/types/components/data-display/MapPreview/mapProjection.d.ts.map +1 -1
  528. package/dist/types/components/data-display/Table/Table.helpers.d.ts +6 -0
  529. package/dist/types/components/data-display/Table/Table.helpers.d.ts.map +1 -1
  530. package/dist/types/components/data-display/Table/Table.hooks.d.ts +9 -1
  531. package/dist/types/components/data-display/Table/Table.hooks.d.ts.map +1 -1
  532. package/dist/types/components/data-display/Table/Table.types.d.ts +6 -2
  533. package/dist/types/components/data-display/Table/Table.types.d.ts.map +1 -1
  534. package/dist/types/components/data-display/Table/TableParts.d.ts +2 -0
  535. package/dist/types/components/data-display/Table/TableParts.d.ts.map +1 -1
  536. package/dist/types/components/feedback/Dialog/Dialog.styles.d.ts.map +1 -1
  537. package/dist/types/components/feedback/Modal/Modal.d.ts.map +1 -1
  538. package/dist/types/components/feedback/Modal/Modal.styles.d.ts.map +1 -1
  539. package/dist/types/components/feedback/StackedModal/StackedModal.parts.d.ts.map +1 -1
  540. package/dist/types/components/feedback/StackedModal/StackedModal.styles.d.ts.map +1 -1
  541. package/dist/types/components/feedback/Toast/Toast.d.ts.map +1 -1
  542. package/dist/types/components/feedback/TutorialOverlay/TutorialOverlay.d.ts.map +1 -1
  543. package/dist/types/components/feedback/TutorialOverlay/TutorialOverlay.geometry.d.ts +3 -1
  544. package/dist/types/components/feedback/TutorialOverlay/TutorialOverlay.geometry.d.ts.map +1 -1
  545. package/dist/types/components/feedback/TutorialOverlay/TutorialOverlay.hooks.d.ts.map +1 -1
  546. package/dist/types/components/feedback/TutorialOverlay/TutorialStepBody.d.ts.map +1 -1
  547. package/dist/types/components/form/Calendar/Calendar.d.ts.map +1 -1
  548. package/dist/types/components/form/Calendar/CalendarDay.d.ts.map +1 -1
  549. package/dist/types/components/form/Calendar/CalendarMonth.d.ts.map +1 -1
  550. package/dist/types/components/form/Switch/Switch.metrics.d.ts +13 -3
  551. package/dist/types/components/form/Switch/Switch.metrics.d.ts.map +1 -1
  552. package/dist/types/components/form/Switch/Switch.styles.d.ts.map +1 -1
  553. package/dist/types/components/layout/Accordion/Accordion.d.ts.map +1 -1
  554. package/dist/types/components/layout/Accordion/Accordion.styles.d.ts.map +1 -1
  555. package/dist/types/components/layout/Box/Box.d.ts +2 -1
  556. package/dist/types/components/layout/Box/Box.d.ts.map +1 -1
  557. package/dist/types/components/layout/Card/Card.styles.d.ts.map +1 -1
  558. package/dist/types/components/layout/CardGrid/CardGrid.d.ts +9 -7
  559. package/dist/types/components/layout/CardGrid/CardGrid.d.ts.map +1 -1
  560. package/dist/types/components/layout/Collapsible/Collapsible.d.ts.map +1 -1
  561. package/dist/types/components/layout/Collapsible/Collapsible.helpers.d.ts +1 -1
  562. package/dist/types/components/layout/Collapsible/Collapsible.helpers.d.ts.map +1 -1
  563. package/dist/types/components/layout/Drawer/Drawer.d.ts.map +1 -1
  564. package/dist/types/components/layout/Resizable/Resizable.d.ts.map +1 -1
  565. package/dist/types/components/layout/Resizable/Resizable.helpers.d.ts +21 -9
  566. package/dist/types/components/layout/Resizable/Resizable.helpers.d.ts.map +1 -1
  567. package/dist/types/components/layout/Resizable/Resizable.hooks.d.ts +13 -3
  568. package/dist/types/components/layout/Resizable/Resizable.hooks.d.ts.map +1 -1
  569. package/dist/types/components/layout/Resizable/Resizable.types.d.ts +10 -0
  570. package/dist/types/components/layout/Resizable/Resizable.types.d.ts.map +1 -1
  571. package/dist/types/components/layout/ScrollArea/ScrollArea.d.ts.map +1 -1
  572. package/dist/types/components/layout/ScrollArea/ScrollArea.helpers.d.ts +1 -1
  573. package/dist/types/components/layout/ScrollArea/ScrollArea.helpers.d.ts.map +1 -1
  574. package/dist/types/components/layout/ScrollArea/ScrollArea.styles.d.ts +6 -0
  575. package/dist/types/components/layout/ScrollArea/ScrollArea.styles.d.ts.map +1 -1
  576. package/dist/types/components/layout/ScrollArea/ScrollArea.types.d.ts +4 -1
  577. package/dist/types/components/layout/ScrollArea/ScrollArea.types.d.ts.map +1 -1
  578. package/dist/types/components/layout/ScrollArea/ScrollViewport.d.ts.map +1 -1
  579. package/dist/types/components/layout/Separator/Separator.d.ts.map +1 -1
  580. package/dist/types/components/layout/Separator/Separator.styles.d.ts +7 -4
  581. package/dist/types/components/layout/Separator/Separator.styles.d.ts.map +1 -1
  582. package/dist/types/components/layout/SettingsLayout/SettingsLayout.items.d.ts.map +1 -1
  583. package/dist/types/components/layout/SettingsLayout/SettingsLayout.rail.d.ts.map +1 -1
  584. package/dist/types/components/layout/SettingsLayout/SettingsLayout.styles.d.ts +4 -4
  585. package/dist/types/components/layout/SettingsLayout/SettingsLayout.styles.d.ts.map +1 -1
  586. package/dist/types/components/layout/Sidebar/Sidebar.d.ts.map +1 -1
  587. package/dist/types/components/layout/Skeleton/Skeleton.d.ts.map +1 -1
  588. package/dist/types/components/layout/Skeleton/Skeleton.styles.d.ts +8 -1
  589. package/dist/types/components/layout/Skeleton/Skeleton.styles.d.ts.map +1 -1
  590. package/dist/types/components/layout/Spacer/Spacer.d.ts.map +1 -1
  591. package/dist/types/components/layout/TableFilter/TableFilter.d.ts.map +1 -1
  592. package/dist/types/components/navigation/AppHeader/AppHeader.d.ts.map +1 -1
  593. package/dist/types/components/navigation/AppHeader/AppHeader.details.d.ts.map +1 -1
  594. package/dist/types/components/navigation/AppHeader/AppHeader.identity.d.ts.map +1 -1
  595. package/dist/types/components/navigation/Breadcrumbs/Breadcrumbs.styles.d.ts +2 -2
  596. package/dist/types/components/navigation/Breadcrumbs/Breadcrumbs.styles.d.ts.map +1 -1
  597. package/dist/types/components/navigation/DropdownMenu/DropdownMenu.d.ts.map +1 -1
  598. package/dist/types/components/navigation/NavigationMenu/NavigationMegaSection.d.ts.map +1 -1
  599. package/dist/types/components/navigation/NavigationMenu/NavigationMenu.d.ts.map +1 -1
  600. package/dist/types/components/navigation/NavigationMenu/NavigationMenu.shell.d.ts.map +1 -1
  601. package/dist/types/components/navigation/NavigationMenu/NavigationMenu.styles.d.ts +2 -2
  602. package/dist/types/components/navigation/NavigationMenu/NavigationMenu.styles.d.ts.map +1 -1
  603. package/dist/types/components/navigation/NavigationMenu/NavigationStandardBody.d.ts.map +1 -1
  604. package/dist/types/components/navigation/Pagination/Pagination.d.ts.map +1 -1
  605. package/dist/types/components/navigation/Pagination/PaginationParts.d.ts.map +1 -1
  606. package/dist/types/components/navigation/Tabs/Tabs.d.ts.map +1 -1
  607. package/dist/types/components/navigation/Tabs/Tabs.styles.d.ts.map +1 -1
  608. package/dist/types/components/navigation/Tabs/TabsPanel.d.ts.map +1 -1
  609. package/dist/types/components/utility/AnimatedIcon/AnimatedIcon.animations.d.ts +9 -8
  610. package/dist/types/components/utility/AnimatedIcon/AnimatedIcon.animations.d.ts.map +1 -1
  611. package/dist/types/components/utility/AnimatedIcon/AnimatedIcon.styles.d.ts +1 -1
  612. package/dist/types/components/utility/AnimatedIcon/AnimatedIcon.styles.d.ts.map +1 -1
  613. package/dist/types/components/utility/AspectRatio/AspectRatio.d.ts.map +1 -1
  614. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.d.ts.map +1 -1
  615. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.hooks.d.ts +3 -2
  616. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.hooks.d.ts.map +1 -1
  617. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.parts.d.ts +3 -2
  618. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.parts.d.ts.map +1 -1
  619. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.types.d.ts +9 -0
  620. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.types.d.ts.map +1 -1
  621. package/dist/types/components/utility/VirtualList/VirtualList.d.ts.map +1 -1
  622. package/dist/types/components/utility/VirtualList/VirtualList.hooks.d.ts +24 -28
  623. package/dist/types/components/utility/VirtualList/VirtualList.hooks.d.ts.map +1 -1
  624. package/dist/types/components/utility/VirtualList/VirtualList.types.d.ts +17 -0
  625. package/dist/types/components/utility/VirtualList/VirtualList.types.d.ts.map +1 -1
  626. package/dist/types/social-login-button/social-login-button.d.ts.map +1 -1
  627. package/dist/types-native/components/form/Switch/Switch.metrics.d.ts +13 -3
  628. package/dist/types-native/components/form/Switch/Switch.metrics.d.ts.map +1 -1
  629. package/dist/typography/Blockquote.js +1 -1
  630. package/dist/typography/Code.js +1 -1
  631. package/dist/typography/Text.js +1 -1
  632. package/dist/user-avatar.js +4 -5
  633. package/dist/utility/AnimatedIcon.js +3 -3
  634. package/dist/utility/AspectRatio.js +2 -1
  635. package/dist/utility/InfiniteScroll.js +4 -3
  636. package/dist/utility/VirtualList.js +3 -2
  637. package/dist/utility/WorkflowStep.js +3 -3
  638. package/package.json +1 -1
  639. package/src/components/data-display/DataGrid/DataGrid.body.tsx +27 -7
  640. package/src/components/data-display/DataGrid/DataGrid.cells.tsx +33 -9
  641. package/src/components/data-display/DataGrid/DataGrid.model.ts +24 -11
  642. package/src/components/data-display/DataGrid/DataGrid.types.ts +12 -6
  643. package/src/components/data-display/DataViews/data-views-columns.ts +14 -3
  644. package/src/components/data-display/DataViews/data-views-grid-helpers.tsx +5 -3
  645. package/src/components/data-display/DataViews/data-views-layout-context.tsx +12 -9
  646. package/src/components/data-display/DataViews/data-views-overflow-costs.ts +32 -14
  647. package/src/components/data-display/DataViews/data-views-overflow.ts +40 -26
  648. package/src/components/data-display/MapPreview/MapTiles.tsx +16 -9
  649. package/src/components/data-display/MapPreview/mapProjection.ts +10 -5
  650. package/src/components/data-display/Table/Table.helpers.ts +7 -1
  651. package/src/components/data-display/Table/Table.hooks.ts +16 -5
  652. package/src/components/data-display/Table/Table.types.ts +6 -2
  653. package/src/components/data-display/Table/TableParts.tsx +38 -42
  654. package/src/components/feedback/Dialog/Dialog.styles.ts +16 -28
  655. package/src/components/feedback/Modal/Modal.styles.ts +9 -8
  656. package/src/components/feedback/Modal/Modal.tsx +3 -2
  657. package/src/components/feedback/Sonner/Sonner.tsx +4 -4
  658. package/src/components/feedback/Sonner/SonnerToast.tsx +9 -9
  659. package/src/components/feedback/StackedModal/StackedModal.parts.tsx +26 -19
  660. package/src/components/feedback/StackedModal/StackedModal.styles.ts +11 -9
  661. package/src/components/feedback/Toast/Toast.tsx +11 -7
  662. package/src/components/feedback/TutorialOverlay/TutorialOverlay.geometry.ts +2 -3
  663. package/src/components/feedback/TutorialOverlay/TutorialOverlay.hooks.ts +6 -1
  664. package/src/components/feedback/TutorialOverlay/TutorialOverlay.tsx +43 -37
  665. package/src/components/feedback/TutorialOverlay/TutorialStepBody.tsx +3 -2
  666. package/src/components/form/Calendar/Calendar.tsx +4 -2
  667. package/src/components/form/Calendar/CalendarDay.tsx +6 -3
  668. package/src/components/form/Calendar/CalendarMonth.tsx +6 -3
  669. package/src/components/form/Switch/Switch.metrics.ts +19 -5
  670. package/src/components/form/Switch/Switch.styles.ts +5 -3
  671. package/src/components/layout/Accordion/Accordion.styles.ts +8 -6
  672. package/src/components/layout/Accordion/Accordion.tsx +10 -8
  673. package/src/components/layout/Box/Box.tsx +18 -5
  674. package/src/components/layout/Card/Card.styles.ts +22 -30
  675. package/src/components/layout/CardGrid/CardGrid.tsx +37 -24
  676. package/src/components/layout/Collapsible/Collapsible.helpers.ts +4 -2
  677. package/src/components/layout/Collapsible/Collapsible.tsx +8 -4
  678. package/src/components/layout/ContentToolbar/ColumnsMenu.tsx +1 -1
  679. package/src/components/layout/ContentToolbar/ContentToolbar.tsx +2 -2
  680. package/src/components/layout/ContentToolbar/FilterTrigger.tsx +2 -2
  681. package/src/components/layout/ContentToolbar/MultiSelectDropdown.tsx +1 -1
  682. package/src/components/layout/ContentToolbar/SavedViewsMenu.tsx +2 -2
  683. package/src/components/layout/ContentToolbar/SortByDropdown.tsx +2 -2
  684. package/src/components/layout/ContentToolbar/ViewSelector.tsx +2 -2
  685. package/src/components/layout/Dashboard/Dashboard.tsx +1 -1
  686. package/src/components/layout/Dashboard/DashboardParts.tsx +1 -1
  687. package/src/components/layout/Drawer/Drawer.tsx +23 -10
  688. package/src/components/layout/Resizable/Resizable.helpers.ts +43 -21
  689. package/src/components/layout/Resizable/Resizable.hooks.ts +17 -9
  690. package/src/components/layout/Resizable/Resizable.md +9 -5
  691. package/src/components/layout/Resizable/Resizable.tsx +20 -8
  692. package/src/components/layout/Resizable/Resizable.types.ts +10 -0
  693. package/src/components/layout/ScrollArea/ScrollArea.helpers.ts +0 -2
  694. package/src/components/layout/ScrollArea/ScrollArea.styles.ts +45 -32
  695. package/src/components/layout/ScrollArea/ScrollArea.tsx +35 -18
  696. package/src/components/layout/ScrollArea/ScrollArea.types.ts +4 -1
  697. package/src/components/layout/ScrollArea/ScrollAreaContent.tsx +2 -2
  698. package/src/components/layout/ScrollArea/ScrollViewport.tsx +6 -4
  699. package/src/components/layout/Separator/Separator.styles.ts +30 -9
  700. package/src/components/layout/Separator/Separator.tsx +4 -3
  701. package/src/components/layout/SettingsLayout/SettingsLayout.items.tsx +4 -2
  702. package/src/components/layout/SettingsLayout/SettingsLayout.rail.tsx +6 -5
  703. package/src/components/layout/SettingsLayout/SettingsLayout.styles.ts +9 -7
  704. package/src/components/layout/SettingsLayout/SettingsLayout.tsx +2 -2
  705. package/src/components/layout/SettingsLayout/SettingsPanel.tsx +1 -1
  706. package/src/components/layout/SettingsLayout/SettingsSectionChips.tsx +3 -3
  707. package/src/components/layout/SettingsLayout/SettingsSectionHeader.tsx +3 -3
  708. package/src/components/layout/SettingsLayout/SettingsStatusMarker.tsx +2 -2
  709. package/src/components/layout/Sidebar/Sidebar.tsx +16 -6
  710. package/src/components/layout/Skeleton/Skeleton.styles.ts +13 -3
  711. package/src/components/layout/Skeleton/Skeleton.tsx +6 -4
  712. package/src/components/layout/Spacer/Spacer.tsx +16 -1
  713. package/src/components/layout/TableFilter/TableFilter.tsx +2 -1
  714. package/src/components/navigation/AppHeader/AppHeader.brand.tsx +2 -2
  715. package/src/components/navigation/AppHeader/AppHeader.details.tsx +9 -7
  716. package/src/components/navigation/AppHeader/AppHeader.identity.tsx +28 -15
  717. package/src/components/navigation/AppHeader/AppHeader.tsx +18 -6
  718. package/src/components/navigation/Breadcrumbs/BreadcrumbEntry.tsx +4 -4
  719. package/src/components/navigation/Breadcrumbs/Breadcrumbs.styles.tsx +15 -15
  720. package/src/components/navigation/CommandPalette/CommandPalette.tsx +7 -7
  721. package/src/components/navigation/CommandPalette/CommandPaletteResults.tsx +5 -5
  722. package/src/components/navigation/CommandPalette/ShortcutChip.tsx +1 -1
  723. package/src/components/navigation/ContextMenu/ContextMenu.tsx +8 -8
  724. package/src/components/navigation/DropdownMenu/DropdownMenu.tsx +25 -16
  725. package/src/components/navigation/NavigationMenu/NavigationMegaSection.tsx +5 -4
  726. package/src/components/navigation/NavigationMenu/NavigationMenu.shell.tsx +22 -20
  727. package/src/components/navigation/NavigationMenu/NavigationMenu.styles.ts +11 -11
  728. package/src/components/navigation/NavigationMenu/NavigationMenu.tsx +7 -2
  729. package/src/components/navigation/NavigationMenu/NavigationMenuItem.tsx +12 -12
  730. package/src/components/navigation/NavigationMenu/NavigationStandardBody.tsx +3 -2
  731. package/src/components/navigation/Pagination/Pagination.styles.ts +18 -18
  732. package/src/components/navigation/Pagination/Pagination.tsx +2 -1
  733. package/src/components/navigation/Pagination/PaginationParts.tsx +4 -3
  734. package/src/components/navigation/Tabs/Tabs.styles.ts +14 -12
  735. package/src/components/navigation/Tabs/Tabs.tsx +11 -9
  736. package/src/components/navigation/Tabs/TabsPanel.tsx +10 -3
  737. package/src/components/typography/Blockquote/Blockquote.tsx +8 -8
  738. package/src/components/typography/Code/Code.tsx +17 -17
  739. package/src/components/typography/Text/Text.tsx +2 -2
  740. package/src/components/utility/AnimatedIcon/AnimatedIcon.animations.ts +38 -35
  741. package/src/components/utility/AnimatedIcon/AnimatedIcon.styles.ts +51 -46
  742. package/src/components/utility/AnimatedIcon/AnimatedIcon.tsx +1 -1
  743. package/src/components/utility/AspectRatio/AspectRatio.tsx +13 -2
  744. package/src/components/utility/InfiniteScroll/InfiniteScroll.hooks.ts +5 -4
  745. package/src/components/utility/InfiniteScroll/InfiniteScroll.parts.tsx +29 -12
  746. package/src/components/utility/InfiniteScroll/InfiniteScroll.tsx +11 -5
  747. package/src/components/utility/InfiniteScroll/InfiniteScroll.types.ts +10 -2
  748. package/src/components/utility/VirtualList/VirtualList.hooks.ts +101 -112
  749. package/src/components/utility/VirtualList/VirtualList.tsx +36 -65
  750. package/src/components/utility/VirtualList/VirtualList.types.ts +20 -3
  751. package/src/components/utility/WorkflowStep/WorkflowStep.parts.tsx +7 -7
  752. package/src/social-login-button/social-login-button.tsx +25 -8
  753. package/dist/chunk-236V2GRH.js.map +0 -1
  754. package/dist/chunk-2CTTASUD.js.map +0 -1
  755. package/dist/chunk-2E2WOBID.js.map +0 -1
  756. package/dist/chunk-2NLYGZP3.js.map +0 -1
  757. package/dist/chunk-2WFDHFK4.js.map +0 -1
  758. package/dist/chunk-3CVTQZQJ.js.map +0 -1
  759. package/dist/chunk-3D6HXKZM.js.map +0 -1
  760. package/dist/chunk-3T5Z5HXF.js.map +0 -1
  761. package/dist/chunk-3TDVGZZN.js.map +0 -1
  762. package/dist/chunk-3VMGE7CU.js.map +0 -1
  763. package/dist/chunk-4OEKIFBC.js.map +0 -1
  764. package/dist/chunk-57JY4OI2.js.map +0 -1
  765. package/dist/chunk-5CKDRLRN.js.map +0 -1
  766. package/dist/chunk-5QWQR7XT.js.map +0 -1
  767. package/dist/chunk-5W4BLTDI.js.map +0 -1
  768. package/dist/chunk-6CTPDNNX.js.map +0 -1
  769. package/dist/chunk-6GRZ77IS.js.map +0 -1
  770. package/dist/chunk-6QLPSMTA.js.map +0 -1
  771. package/dist/chunk-72DKEBJM.js.map +0 -1
  772. package/dist/chunk-73BEVJCS.js +0 -28
  773. package/dist/chunk-73BEVJCS.js.map +0 -1
  774. package/dist/chunk-75LOTMSN.js.map +0 -1
  775. package/dist/chunk-7F7TTOYN.js.map +0 -1
  776. package/dist/chunk-7UZ2TFIK.js.map +0 -1
  777. package/dist/chunk-AROBXRC5.js.map +0 -1
  778. package/dist/chunk-ATSHKSSD.js.map +0 -1
  779. package/dist/chunk-AUSUCZYR.js.map +0 -1
  780. package/dist/chunk-B76QCDCE.js.map +0 -1
  781. package/dist/chunk-BLJDCMFU.js.map +0 -1
  782. package/dist/chunk-CAHWCSRE.js.map +0 -1
  783. package/dist/chunk-CPTY6UZ6.js.map +0 -1
  784. package/dist/chunk-CSTAQX2B.js.map +0 -1
  785. package/dist/chunk-D5SZXH7Q.js.map +0 -1
  786. package/dist/chunk-DF4K5XVW.js.map +0 -1
  787. package/dist/chunk-DLJGBJZW.js.map +0 -1
  788. package/dist/chunk-DYVAOEW4.js.map +0 -1
  789. package/dist/chunk-DZA7RSLX.js.map +0 -1
  790. package/dist/chunk-E7MSDXED.js.map +0 -1
  791. package/dist/chunk-EFHIMCJN.js.map +0 -1
  792. package/dist/chunk-EL7CMURV.js.map +0 -1
  793. package/dist/chunk-F42MJOHM.js.map +0 -1
  794. package/dist/chunk-FFOQZRFC.js.map +0 -1
  795. package/dist/chunk-FYTLKHEN.js.map +0 -1
  796. package/dist/chunk-GRDPGHQJ.js.map +0 -1
  797. package/dist/chunk-GSFNH4C5.js.map +0 -1
  798. package/dist/chunk-GUW5BUK7.js.map +0 -1
  799. package/dist/chunk-HB7ISSLK.js.map +0 -1
  800. package/dist/chunk-HGMBY5LP.js.map +0 -1
  801. package/dist/chunk-HTZNB6IV.js.map +0 -1
  802. package/dist/chunk-HXEBKOSM.js.map +0 -1
  803. package/dist/chunk-IAGOUTI6.js.map +0 -1
  804. package/dist/chunk-IVIHRZEY.js.map +0 -1
  805. package/dist/chunk-IYTBTK2M.js.map +0 -1
  806. package/dist/chunk-J2DAQQQH.js.map +0 -1
  807. package/dist/chunk-JXUWWPZR.js.map +0 -1
  808. package/dist/chunk-KLWW67WP.js.map +0 -1
  809. package/dist/chunk-L7SFH3ED.js.map +0 -1
  810. package/dist/chunk-LIG7TKIB.js.map +0 -1
  811. package/dist/chunk-LVEG6XQL.js.map +0 -1
  812. package/dist/chunk-MBC55H6M.js.map +0 -1
  813. package/dist/chunk-MBSYD3ZU.js.map +0 -1
  814. package/dist/chunk-MJ3BVWPZ.js.map +0 -1
  815. package/dist/chunk-MK4CH4VT.js.map +0 -1
  816. package/dist/chunk-MP4VSWHK.js.map +0 -1
  817. package/dist/chunk-MTFCPPZ5.js.map +0 -1
  818. package/dist/chunk-MVKYNDT2.js.map +0 -1
  819. package/dist/chunk-MVXFMIVZ.js.map +0 -1
  820. package/dist/chunk-N52O2OKZ.js.map +0 -1
  821. package/dist/chunk-NEGCJNGJ.js.map +0 -1
  822. package/dist/chunk-NYZO3JNB.js.map +0 -1
  823. package/dist/chunk-OATHOXIU.js.map +0 -1
  824. package/dist/chunk-P6TNXBDA.js.map +0 -1
  825. package/dist/chunk-PMOEG36E.js.map +0 -1
  826. package/dist/chunk-PMP6WJJS.js.map +0 -1
  827. package/dist/chunk-PT2XADGH.js.map +0 -1
  828. package/dist/chunk-PUBPZOQJ.js.map +0 -1
  829. package/dist/chunk-Q4BQYYPU.js.map +0 -1
  830. package/dist/chunk-Q4CAZ2TP.js.map +0 -1
  831. package/dist/chunk-Q73PTVNO.js.map +0 -1
  832. package/dist/chunk-QAP3FW33.js.map +0 -1
  833. package/dist/chunk-QF6LTUCE.js.map +0 -1
  834. package/dist/chunk-QKPD322X.js.map +0 -1
  835. package/dist/chunk-RHIDWUK7.js.map +0 -1
  836. package/dist/chunk-RSQMPCCR.js.map +0 -1
  837. package/dist/chunk-RWTFZ7J5.js.map +0 -1
  838. package/dist/chunk-T3WHW7ZC.js.map +0 -1
  839. package/dist/chunk-TBF2CPJW.js.map +0 -1
  840. package/dist/chunk-TQ6FPOPD.js.map +0 -1
  841. package/dist/chunk-TUBCN4DJ.js.map +0 -1
  842. package/dist/chunk-TVL5V2JK.js.map +0 -1
  843. package/dist/chunk-U342T7ZR.js.map +0 -1
  844. package/dist/chunk-ULTOQ6ZV.js.map +0 -1
  845. package/dist/chunk-UN5INW6K.js.map +0 -1
  846. package/dist/chunk-UUUMNJPP.js.map +0 -1
  847. package/dist/chunk-VFHGILXI.js.map +0 -1
  848. package/dist/chunk-VRDNUY4H.js.map +0 -1
  849. package/dist/chunk-WTOYEWW6.js.map +0 -1
  850. package/dist/chunk-WUTHROII.js.map +0 -1
  851. package/dist/chunk-YU26GBNX.js.map +0 -1
  852. package/dist/chunk-YVUD3MY4.js.map +0 -1
  853. package/dist/chunk-ZTYUKEN3.js.map +0 -1
  854. /package/dist/{chunk-2BIVCYTO.js.map → chunk-27LOJVR3.js.map} +0 -0
  855. /package/dist/{chunk-CRZXSZ5O.js.map → chunk-2S752BIJ.js.map} +0 -0
  856. /package/dist/{chunk-BAQBUKDU.js.map → chunk-3KREF4ZF.js.map} +0 -0
  857. /package/dist/{chunk-SYN46YL6.js.map → chunk-3RMDIO4G.js.map} +0 -0
  858. /package/dist/{chunk-S3D5VBHW.js.map → chunk-3YOXVNO4.js.map} +0 -0
  859. /package/dist/{chunk-IL7JZKXY.js.map → chunk-442FSG7G.js.map} +0 -0
  860. /package/dist/{chunk-JL75FJRG.js.map → chunk-4ALF5PB5.js.map} +0 -0
  861. /package/dist/{chunk-CS3KOKL3.js.map → chunk-4GWHYLEB.js.map} +0 -0
  862. /package/dist/{chunk-XJPJ6ESI.js.map → chunk-4OAKGKK5.js.map} +0 -0
  863. /package/dist/{chunk-4CHROSWR.js.map → chunk-5ETBB2DG.js.map} +0 -0
  864. /package/dist/{chunk-E7T3A4IR.js.map → chunk-5JCGBCFJ.js.map} +0 -0
  865. /package/dist/{chunk-FC7NQ6XM.js.map → chunk-5MW7OYBM.js.map} +0 -0
  866. /package/dist/{chunk-46UPILLK.js.map → chunk-5NT2M2JI.js.map} +0 -0
  867. /package/dist/{chunk-H5BEWPEY.js.map → chunk-6N2EDWMG.js.map} +0 -0
  868. /package/dist/{chunk-BW62QQAG.js.map → chunk-6N4AA2Y7.js.map} +0 -0
  869. /package/dist/{chunk-GJQYM3PM.js.map → chunk-6PU3JYVY.js.map} +0 -0
  870. /package/dist/{chunk-7EIOXZWL.js.map → chunk-74P3YX7R.js.map} +0 -0
  871. /package/dist/{chunk-VT5HQ2AD.js.map → chunk-BFMDA6UO.js.map} +0 -0
  872. /package/dist/{chunk-R75DZ3AK.js.map → chunk-BVLMKSHX.js.map} +0 -0
  873. /package/dist/{chunk-HNPWZ3W2.js.map → chunk-DDRKYNPB.js.map} +0 -0
  874. /package/dist/{chunk-HU7TX7RB.js.map → chunk-DUBTI4DI.js.map} +0 -0
  875. /package/dist/{chunk-RMCNEKBZ.js.map → chunk-DW6F7354.js.map} +0 -0
  876. /package/dist/{chunk-XJUEHG72.js.map → chunk-EERUSI52.js.map} +0 -0
  877. /package/dist/{chunk-NDNYD4FG.js.map → chunk-EHYI2WCJ.js.map} +0 -0
  878. /package/dist/{chunk-NB3FGWU4.js.map → chunk-EQXIW5MQ.js.map} +0 -0
  879. /package/dist/{chunk-2ZIHZLF5.js.map → chunk-F44R7US6.js.map} +0 -0
  880. /package/dist/{chunk-35S6QI5G.js.map → chunk-FX26DAFF.js.map} +0 -0
  881. /package/dist/{chunk-AYLEZM6T.js.map → chunk-GLFTIGOF.js.map} +0 -0
  882. /package/dist/{chunk-QEG3P5D4.js.map → chunk-GLHNMTP6.js.map} +0 -0
  883. /package/dist/{chunk-L4UP5VYS.js.map → chunk-GVH7C2PT.js.map} +0 -0
  884. /package/dist/{chunk-AER4245J.js.map → chunk-H67EL3CG.js.map} +0 -0
  885. /package/dist/{chunk-57JLS55D.js.map → chunk-HBRQPG7H.js.map} +0 -0
  886. /package/dist/{chunk-UZ6AUTE6.js.map → chunk-I3F4C5SS.js.map} +0 -0
  887. /package/dist/{chunk-4CXEWFKO.js.map → chunk-J5VWGQSR.js.map} +0 -0
  888. /package/dist/{chunk-AJ5SDHX5.js.map → chunk-JCL7WK4G.js.map} +0 -0
  889. /package/dist/{chunk-4JFL62K3.js.map → chunk-K7FSTB2K.js.map} +0 -0
  890. /package/dist/{chunk-WE3LJPRN.js.map → chunk-KE473LK6.js.map} +0 -0
  891. /package/dist/{chunk-C55AWF3U.js.map → chunk-KRQUPE4K.js.map} +0 -0
  892. /package/dist/{chunk-SJO3K7SB.js.map → chunk-KXLUMEDX.js.map} +0 -0
  893. /package/dist/{chunk-CQPFSEJB.js.map → chunk-L7NQCLFU.js.map} +0 -0
  894. /package/dist/{chunk-DVAAUWTC.js.map → chunk-LCHCE2G5.js.map} +0 -0
  895. /package/dist/{chunk-G4HBNILE.js.map → chunk-LEHMWJNZ.js.map} +0 -0
  896. /package/dist/{chunk-KK57AHWS.js.map → chunk-OAEYCKBN.js.map} +0 -0
  897. /package/dist/{chunk-JGRE56GQ.js.map → chunk-OB56SZGL.js.map} +0 -0
  898. /package/dist/{chunk-E4TNDTWV.js.map → chunk-OL2BEJZR.js.map} +0 -0
  899. /package/dist/{chunk-IKLOIONQ.js.map → chunk-PCBZYORN.js.map} +0 -0
  900. /package/dist/{chunk-CQLPDY2J.js.map → chunk-PRIBOWX4.js.map} +0 -0
  901. /package/dist/{chunk-LT4NEKXB.js.map → chunk-QA2ZGCRL.js.map} +0 -0
  902. /package/dist/{chunk-PQECNGDE.js.map → chunk-QSRZOXQI.js.map} +0 -0
  903. /package/dist/{chunk-ROT57BP4.js.map → chunk-R2XVTUVR.js.map} +0 -0
  904. /package/dist/{chunk-DCJSHYE5.js.map → chunk-RSDYS5B3.js.map} +0 -0
  905. /package/dist/{chunk-N5GVW6RO.js.map → chunk-S6IWKDWT.js.map} +0 -0
  906. /package/dist/{chunk-DB2ZFZVW.js.map → chunk-SBIZXZPP.js.map} +0 -0
  907. /package/dist/{chunk-NCPWLHZT.js.map → chunk-SKT2V2OX.js.map} +0 -0
  908. /package/dist/{chunk-EOW2ECB3.js.map → chunk-SNURSSTN.js.map} +0 -0
  909. /package/dist/{chunk-CZBND7AY.js.map → chunk-T7DE44SP.js.map} +0 -0
  910. /package/dist/{chunk-BNEWMFVB.js.map → chunk-UGGJ3KDT.js.map} +0 -0
  911. /package/dist/{chunk-KREWQAEV.js.map → chunk-VIRYHNEM.js.map} +0 -0
  912. /package/dist/{chunk-N6CSXHFJ.js.map → chunk-WN5PNP6F.js.map} +0 -0
  913. /package/dist/{chunk-XR46FSOH.js.map → chunk-XIG3DXXX.js.map} +0 -0
  914. /package/dist/{chunk-GHTBUJ6E.js.map → chunk-XRUW7DMH.js.map} +0 -0
  915. /package/dist/{chunk-JLQGRZMN.js.map → chunk-YCCY77W5.js.map} +0 -0
  916. /package/dist/{chunk-6BDYC4RA.js.map → chunk-YRSR5LVZ.js.map} +0 -0
  917. /package/dist/{chunk-VZIB5W5L.js.map → chunk-ZGCPDA3F.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/navigation/ContextMenu/ContextMenu.tsx"],"sourcesContent":["import Divider from '@mui/material/Divider/index.js';\nimport ListItemIcon from '@mui/material/ListItemIcon/index.js';\nimport ListItemText from '@mui/material/ListItemText/index.js';\nimport Menu from '@mui/material/Menu/index.js';\nimport MenuItem from '@mui/material/MenuItem/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport { alpha, styled } from '@mui/material/styles/index.js';\nimport type { CSSObject, Theme } from '@mui/material/styles/index.js';\nimport React, { cloneElement, isValidElement,useState } from 'react';\n\nimport type { ContextMenuItem,ContextMenuProps } from './ContextMenu.types';\nimport { absoluteInk, neutralTones, shadowInk, sheen } from '../../../tokens/ink';\nimport { rem } from '../../../tokens/relative';\n\nconst StyledMenu = styled(Menu, {\n shouldForwardProp: (prop) => prop !== 'customVariant' && prop !== 'size',\n})<{ customVariant?: string; size?: string }>(({ theme, customVariant, size }) => ({\n '& .MuiPaper-root': {\n minWidth: 160,\n borderRadius: theme.spacing(1),\n\n ...(customVariant === 'glass' && {\n backgroundColor: alpha(theme.palette.background.paper, 0.85),\n backdropFilter: 'blur(20px)',\n border: `1px solid ${alpha(theme.palette.divider, 0.1)}`,\n boxShadow: `0 8px 32px ${shadowInk(theme, 0.12)}`,\n }),\n\n ...(customVariant === 'dark' && {\n backgroundColor: alpha(neutralTones(theme).inverseSurface, 0.95),\n color: absoluteInk(theme).white,\n '& .MuiMenuItem-root': {\n color: absoluteInk(theme).white,\n },\n '& .MuiListItemIcon-root': {\n color: absoluteInk(theme).white,\n },\n '& .MuiDivider-root': {\n borderColor: sheen(theme, 0.12),\n },\n }),\n\n ...(size === 'sm' && {\n '& .MuiMenuItem-root': {\n fontSize: rem(theme, 14),\n minHeight: 32,\n padding: theme.spacing(0.5, 1.5),\n },\n }),\n\n ...(size === 'lg' && {\n '& .MuiMenuItem-root': {\n fontSize: rem(theme, 18),\n minHeight: 48,\n padding: theme.spacing(1.5, 2),\n },\n }),\n },\n}));\n\n// `color` names a palette key (`success`, `warning`, …) that MUI's Theme type does\n// not index, so it is read structurally and falls back to primary.\nconst paletteColor = (theme: Theme, color: string): string =>\n (theme.palette as unknown as Record<string, { main?: string }>)[color]?.main ||\n theme.palette.primary.main;\n\nconst accentStyles = (theme: Theme, color: string): CSSObject => {\n const main = paletteColor(theme, color);\n\n return {\n color: main,\n '& .MuiListItemIcon-root': { color: main },\n '&:hover': { backgroundColor: alpha(main, 0.08) },\n };\n};\n\nconst StyledMenuItem = styled(MenuItem, {\n shouldForwardProp: (prop) => !['color', 'dangerous'].includes(prop as string),\n})<{ color?: string; dangerous?: boolean }>(({ theme, color, dangerous }) => ({\n borderRadius: theme.spacing(0.5),\n margin: theme.spacing(0.25, 0.5),\n transition: 'all 0.2s ease',\n\n '&:hover': {\n backgroundColor: alpha(dangerous ? theme.palette.error.main : theme.palette.primary.main, 0.08),\n },\n\n ...(dangerous && {\n color: theme.palette.error.main,\n '& .MuiListItemIcon-root': {\n color: theme.palette.error.main,\n },\n }),\n\n ...(color && color !== 'default' && !dangerous ? accentStyles(theme, color) : {}),\n}));\n\nconst MenuHeader = styled(Typography)(({ theme }) => ({\n padding: theme.spacing(1, 2),\n fontSize: rem(theme, 12),\n fontWeight: 600,\n textTransform: 'uppercase',\n color: theme.palette.text.secondary,\n letterSpacing: 0.5,\n}));\n\nconst ShortcutText = styled(Typography)(({ theme }) => ({\n fontSize: rem(theme, 12),\n color: theme.palette.text.secondary,\n marginLeft: 'auto',\n paddingLeft: theme.spacing(2),\n}));\n\nconst renderMenuItem = (\n item: ContextMenuItem,\n handleItemClick: (item: ContextMenuItem) => void,\n size?: string,\n) => {\n if (item.type === 'divider') {\n return <Divider key={item.id} sx={{ my: 0.5 }} />;\n }\n\n if (item.type === 'header') {\n return <MenuHeader key={item.id}>{item.label}</MenuHeader>;\n }\n\n const hasIcon = !!item.icon;\n\n return (\n <StyledMenuItem\n key={item.id}\n disabled={item.disabled}\n onClick={() => handleItemClick(item)}\n color={item.color}\n dangerous={item.dangerous}\n >\n {hasIcon && (\n <ListItemIcon sx={{ minWidth: size === 'sm' ? 32 : 40 }}>{item.icon}</ListItemIcon>\n )}\n <ListItemText primary={item.label} />\n {item.shortcut && <ShortcutText variant=\"caption\">{item.shortcut}</ShortcutText>}\n </StyledMenuItem>\n );\n};\n\ninterface TriggerOptions {\n disabled: boolean;\n triggerClassName?: string;\n triggerStyle?: React.CSSProperties;\n}\n\n// The trigger is whatever the caller passed as children. A single element is\n// cloned, so the handler and cursor land on the caller's own node; anything else\n// gets wrapped in a div that can carry them.\nconst buildTrigger = (\n children: React.ReactNode,\n onContextMenu: (event: React.MouseEvent) => void,\n { disabled, triggerClassName, triggerStyle }: TriggerOptions,\n) => {\n const cursor = disabled ? 'default' : 'context-menu';\n\n if (!isValidElement(children)) {\n return (\n <div\n onContextMenu={onContextMenu}\n className={triggerClassName}\n style={{ ...triggerStyle, cursor }}\n >\n {children}\n </div>\n );\n }\n\n const element = children as React.ReactElement<{\n onContextMenu?: (event: React.MouseEvent) => void;\n className?: string;\n style?: React.CSSProperties;\n }>;\n\n return cloneElement(element, {\n onContextMenu,\n className: [\n element.props.className,\n triggerClassName,\n !disabled ? 'context-menu-trigger' : '',\n ]\n .filter(Boolean)\n .join(' '),\n style: { ...element.props.style, ...triggerStyle, cursor },\n });\n};\n\nexport const ContextMenu = React.forwardRef<HTMLDivElement, ContextMenuProps>(\n (\n {\n variant = 'default',\n items,\n children,\n disabled = false,\n onOpen,\n onClose,\n size = 'md',\n triggerClassName,\n triggerStyle,\n ...menuProps\n },\n ref,\n ) => {\n const [contextMenu, setContextMenu] = useState<{\n mouseX: number;\n mouseY: number;\n } | null>(null);\n\n const handleContextMenu = (event: React.MouseEvent) => {\n if (disabled) return;\n\n event.preventDefault();\n setContextMenu(\n contextMenu === null\n ? {\n mouseX: event.clientX + 2,\n mouseY: event.clientY - 6,\n }\n : null,\n );\n onOpen?.(event);\n };\n\n const handleClose = () => {\n setContextMenu(null);\n onClose?.();\n };\n\n const handleItemClick = (item: ContextMenuItem) => {\n if (item.onClick) {\n item.onClick();\n }\n handleClose();\n };\n\n const triggerElement = buildTrigger(children, handleContextMenu, {\n disabled,\n triggerClassName,\n triggerStyle,\n });\n\n return (\n <>\n {triggerElement}\n <StyledMenu\n ref={ref}\n open={contextMenu !== null}\n onClose={handleClose}\n anchorReference=\"anchorPosition\"\n anchorPosition={\n contextMenu !== null ? { top: contextMenu.mouseY, left: contextMenu.mouseX } : undefined\n }\n customVariant={variant}\n size={size}\n {...menuProps}\n >\n {items.map((item) => renderMenuItem(item, handleItemClick, size))}\n </StyledMenu>\n </>\n );\n },\n);\n\nContextMenu.displayName = 'ContextMenu';\n"],"mappings":";;;;;;;;;;;AAAA,OAAO,aAAa;AACpB,OAAO,kBAAkB;AACzB,OAAO,kBAAkB;AACzB,OAAO,UAAU;AACjB,OAAO,cAAc;AACrB,OAAO,gBAAgB;AACvB,SAAS,OAAO,cAAc;AAE9B,OAAO,SAAS,cAAc,gBAAe,gBAAgB;AA+GlD,SAgIL,UAhIK,KAUP,YAVO;AAzGX,IAAM,aAAa,OAAO,MAAM;AAAA,EAC9B,mBAAmB,CAAC,SAAS,SAAS,mBAAmB,SAAS;AACpE,CAAC,EAA6C,CAAC,EAAE,OAAO,eAAe,KAAK,OAAO;AAAA,EACjF,oBAAoB;AAAA,IAClB,UAAU;AAAA,IACV,cAAc,MAAM,QAAQ,CAAC;AAAA,IAE7B,GAAI,kBAAkB,WAAW;AAAA,MAC/B,iBAAiB,MAAM,MAAM,QAAQ,WAAW,OAAO,IAAI;AAAA,MAC3D,gBAAgB;AAAA,MAChB,QAAQ,aAAa,MAAM,MAAM,QAAQ,SAAS,GAAG,CAAC;AAAA,MACtD,WAAW,cAAc,UAAU,OAAO,IAAI,CAAC;AAAA,IACjD;AAAA,IAEA,GAAI,kBAAkB,UAAU;AAAA,MAC9B,iBAAiB,MAAM,aAAa,KAAK,EAAE,gBAAgB,IAAI;AAAA,MAC/D,OAAO,YAAY,KAAK,EAAE;AAAA,MAC1B,uBAAuB;AAAA,QACrB,OAAO,YAAY,KAAK,EAAE;AAAA,MAC5B;AAAA,MACA,2BAA2B;AAAA,QACzB,OAAO,YAAY,KAAK,EAAE;AAAA,MAC5B;AAAA,MACA,sBAAsB;AAAA,QACpB,aAAa,MAAM,OAAO,IAAI;AAAA,MAChC;AAAA,IACF;AAAA,IAEA,GAAI,SAAS,QAAQ;AAAA,MACnB,uBAAuB;AAAA,QACrB,UAAU,IAAI,OAAO,EAAE;AAAA,QACvB,WAAW;AAAA,QACX,SAAS,MAAM,QAAQ,KAAK,GAAG;AAAA,MACjC;AAAA,IACF;AAAA,IAEA,GAAI,SAAS,QAAQ;AAAA,MACnB,uBAAuB;AAAA,QACrB,UAAU,IAAI,OAAO,EAAE;AAAA,QACvB,WAAW;AAAA,QACX,SAAS,MAAM,QAAQ,KAAK,CAAC;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AACF,EAAE;AAIF,IAAM,eAAe,CAAC,OAAc,UACjC,MAAM,QAAyD,KAAK,GAAG,QACxE,MAAM,QAAQ,QAAQ;AAExB,IAAM,eAAe,CAAC,OAAc,UAA6B;AAC/D,QAAM,OAAO,aAAa,OAAO,KAAK;AAEtC,SAAO;AAAA,IACL,OAAO;AAAA,IACP,2BAA2B,EAAE,OAAO,KAAK;AAAA,IACzC,WAAW,EAAE,iBAAiB,MAAM,MAAM,IAAI,EAAE;AAAA,EAClD;AACF;AAEA,IAAM,iBAAiB,OAAO,UAAU;AAAA,EACtC,mBAAmB,CAAC,SAAS,CAAC,CAAC,SAAS,WAAW,EAAE,SAAS,IAAc;AAC9E,CAAC,EAA2C,CAAC,EAAE,OAAO,OAAO,UAAU,OAAO;AAAA,EAC5E,cAAc,MAAM,QAAQ,GAAG;AAAA,EAC/B,QAAQ,MAAM,QAAQ,MAAM,GAAG;AAAA,EAC/B,YAAY;AAAA,EAEZ,WAAW;AAAA,IACT,iBAAiB,MAAM,YAAY,MAAM,QAAQ,MAAM,OAAO,MAAM,QAAQ,QAAQ,MAAM,IAAI;AAAA,EAChG;AAAA,EAEA,GAAI,aAAa;AAAA,IACf,OAAO,MAAM,QAAQ,MAAM;AAAA,IAC3B,2BAA2B;AAAA,MACzB,OAAO,MAAM,QAAQ,MAAM;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,GAAI,SAAS,UAAU,aAAa,CAAC,YAAY,aAAa,OAAO,KAAK,IAAI,CAAC;AACjF,EAAE;AAEF,IAAM,aAAa,OAAO,UAAU,EAAE,CAAC,EAAE,MAAM,OAAO;AAAA,EACpD,SAAS,MAAM,QAAQ,GAAG,CAAC;AAAA,EAC3B,UAAU,IAAI,OAAO,EAAE;AAAA,EACvB,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,OAAO,MAAM,QAAQ,KAAK;AAAA,EAC1B,eAAe;AACjB,EAAE;AAEF,IAAM,eAAe,OAAO,UAAU,EAAE,CAAC,EAAE,MAAM,OAAO;AAAA,EACtD,UAAU,IAAI,OAAO,EAAE;AAAA,EACvB,OAAO,MAAM,QAAQ,KAAK;AAAA,EAC1B,YAAY;AAAA,EACZ,aAAa,MAAM,QAAQ,CAAC;AAC9B,EAAE;AAEF,IAAM,iBAAiB,CACrB,MACA,iBACA,SACG;AACH,MAAI,KAAK,SAAS,WAAW;AAC3B,WAAO,oBAAC,WAAsB,IAAI,EAAE,IAAI,IAAI,KAAvB,KAAK,EAAqB;AAAA,EACjD;AAEA,MAAI,KAAK,SAAS,UAAU;AAC1B,WAAO,oBAAC,cAA0B,eAAK,SAAf,KAAK,EAAgB;AAAA,EAC/C;AAEA,QAAM,UAAU,CAAC,CAAC,KAAK;AAEvB,SACE;AAAA,IAAC;AAAA;AAAA,MAEC,UAAU,KAAK;AAAA,MACf,SAAS,MAAM,gBAAgB,IAAI;AAAA,MACnC,OAAO,KAAK;AAAA,MACZ,WAAW,KAAK;AAAA,MAEf;AAAA,mBACC,oBAAC,gBAAa,IAAI,EAAE,UAAU,SAAS,OAAO,KAAK,GAAG,GAAI,eAAK,MAAK;AAAA,QAEtE,oBAAC,gBAAa,SAAS,KAAK,OAAO;AAAA,QAClC,KAAK,YAAY,oBAAC,gBAAa,SAAQ,WAAW,eAAK,UAAS;AAAA;AAAA;AAAA,IAV5D,KAAK;AAAA,EAWZ;AAEJ;AAWA,IAAM,eAAe,CACnB,UACA,eACA,EAAE,UAAU,kBAAkB,aAAa,MACxC;AACH,QAAM,SAAS,WAAW,YAAY;AAEtC,MAAI,CAAC,eAAe,QAAQ,GAAG;AAC7B,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,WAAW;AAAA,QACX,OAAO,EAAE,GAAG,cAAc,OAAO;AAAA,QAEhC;AAAA;AAAA,IACH;AAAA,EAEJ;AAEA,QAAM,UAAU;AAMhB,SAAO,aAAa,SAAS;AAAA,IAC3B;AAAA,IACA,WAAW;AAAA,MACT,QAAQ,MAAM;AAAA,MACd;AAAA,MACA,CAAC,WAAW,yBAAyB;AAAA,IACvC,EACG,OAAO,OAAO,EACd,KAAK,GAAG;AAAA,IACX,OAAO,EAAE,GAAG,QAAQ,MAAM,OAAO,GAAG,cAAc,OAAO;AAAA,EAC3D,CAAC;AACH;AAEO,IAAM,cAAc,MAAM;AAAA,EAC/B,CACE;AAAA,IACE,UAAU;AAAA,IACV;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,GACA,QACG;AACH,UAAM,CAAC,aAAa,cAAc,IAAI,SAG5B,IAAI;AAEd,UAAM,oBAAoB,CAAC,UAA4B;AACrD,UAAI,SAAU;AAEd,YAAM,eAAe;AACrB;AAAA,QACE,gBAAgB,OACZ;AAAA,UACE,QAAQ,MAAM,UAAU;AAAA,UACxB,QAAQ,MAAM,UAAU;AAAA,QAC1B,IACA;AAAA,MACN;AACA,eAAS,KAAK;AAAA,IAChB;AAEA,UAAM,cAAc,MAAM;AACxB,qBAAe,IAAI;AACnB,gBAAU;AAAA,IACZ;AAEA,UAAM,kBAAkB,CAAC,SAA0B;AACjD,UAAI,KAAK,SAAS;AAChB,aAAK,QAAQ;AAAA,MACf;AACA,kBAAY;AAAA,IACd;AAEA,UAAM,iBAAiB,aAAa,UAAU,mBAAmB;AAAA,MAC/D;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,WACE,iCACG;AAAA;AAAA,MACD;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,MAAM,gBAAgB;AAAA,UACtB,SAAS;AAAA,UACT,iBAAgB;AAAA,UAChB,gBACE,gBAAgB,OAAO,EAAE,KAAK,YAAY,QAAQ,MAAM,YAAY,OAAO,IAAI;AAAA,UAEjF,eAAe;AAAA,UACf;AAAA,UACC,GAAG;AAAA,UAEH,gBAAM,IAAI,CAAC,SAAS,eAAe,MAAM,iBAAiB,IAAI,CAAC;AAAA;AAAA,MAClE;AAAA,OACF;AAAA,EAEJ;AACF;AAEA,YAAY,cAAc;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/navigation/Pagination/PaginationParts.tsx"],"sourcesContent":["import Box from '@mui/material/Box/index.js';\nimport FormControl from '@mui/material/FormControl/index.js';\nimport MenuItem from '@mui/material/MenuItem/index.js';\nimport Select from '@mui/material/Select/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport { styled } from '@mui/material/styles/index.js';\nimport type { FC } from 'react';\nimport React from 'react';\n\nimport { scaleFor } from './Pagination.helpers';\nimport { asFieldSize, fieldTextFieldStyles } from '../../../tokens/field-height';\n\n// Kept module-local: styled() components cannot be exported across a module\n// boundary here without tripping TS2742.\nconst ItemsPerPageContainer = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n}));\n\nconst PageInfoContainer = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n}));\n\nexport interface ItemsPerPageSelectProps {\n /** The label in front of the select. REQUIRED — it was `\"Show:\"`. */\n pageSizeLabel: string;\n value: number;\n options: number[];\n size: string;\n disabled: boolean;\n testId: string;\n onChange: (value: number) => void;\n}\n\nexport const ItemsPerPageSelect: FC<ItemsPerPageSelectProps> = ({\n pageSizeLabel,\n value,\n options,\n size,\n disabled,\n testId,\n onChange,\n}) => (\n <ItemsPerPageContainer>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {pageSizeLabel}\n </Typography>\n <FormControl size=\"small\" sx={(theme) => ({ minWidth: 80, ...fieldTextFieldStyles(theme, asFieldSize(size)) })}>\n <Select\n value={value}\n onChange={(event) => onChange(event.target.value as number)}\n disabled={disabled}\n data-testid={testId}\n sx={{\n '& .MuiSelect-select': {\n fontSize: scaleFor(size, ['0.875rem', '1rem', '1.125rem']),\n },\n }}\n >\n {options.map((option) => (\n <MenuItem key={option} value={option}>\n {option}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n </ItemsPerPageContainer>\n);\n\nexport const PageInfo: FC<{ size: string; testId: string; children: React.ReactNode }> = ({\n size,\n testId,\n children,\n}) => (\n <PageInfoContainer>\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n fontSize={scaleFor(size, ['0.75rem', '0.875rem', '1rem'])}\n data-testid={testId}\n >\n {children}\n </Typography>\n </PageInfoContainer>\n);\n"],"mappings":";;;;;;;;;AAAA,OAAO,SAAS;AAChB,OAAO,iBAAiB;AACxB,OAAO,cAAc;AACrB,OAAO,YAAY;AACnB,OAAO,gBAAgB;AACvB,SAAS,cAAc;AAyCrB,SACE,KADF;AAhCF,IAAM,wBAAwB,OAAO,GAAG,EAAE,CAAC,EAAE,MAAM,OAAO;AAAA,EACxD,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,KAAK,MAAM,QAAQ,CAAC;AACtB,EAAE;AAEF,IAAM,oBAAoB,OAAO,GAAG,EAAE,CAAC,EAAE,MAAM,OAAO;AAAA,EACpD,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,KAAK,MAAM,QAAQ,CAAC;AACtB,EAAE;AAaK,IAAM,qBAAkD,CAAC;AAAA,EAC9D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MACE,qBAAC,yBACC;AAAA,sBAAC,cAAW,SAAQ,SAAQ,OAAM,kBAC/B,yBACH;AAAA,EACA,oBAAC,eAAY,MAAK,SAAQ,IAAI,CAAC,WAAW,EAAE,UAAU,IAAI,GAAG,qBAAqB,OAAO,YAAY,IAAI,CAAC,EAAE,IAC1G;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,UAAU,CAAC,UAAU,SAAS,MAAM,OAAO,KAAe;AAAA,MAC1D;AAAA,MACA,eAAa;AAAA,MACb,IAAI;AAAA,QACF,uBAAuB;AAAA,UACrB,UAAU,SAAS,MAAM,CAAC,YAAY,QAAQ,UAAU,CAAC;AAAA,QAC3D;AAAA,MACF;AAAA,MAEC,kBAAQ,IAAI,CAAC,WACZ,oBAAC,YAAsB,OAAO,QAC3B,oBADY,MAEf,CACD;AAAA;AAAA,EACH,GACF;AAAA,GACF;AAGK,IAAM,WAA4E,CAAC;AAAA,EACxF;AAAA,EACA;AAAA,EACA;AACF,MACE,oBAAC,qBACC;AAAA,EAAC;AAAA;AAAA,IACC,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,UAAU,SAAS,MAAM,CAAC,WAAW,YAAY,MAAM,CAAC;AAAA,IACxD,eAAa;AAAA,IAEZ;AAAA;AACH,GACF;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/utility/AspectRatio/AspectRatio.tsx"],"sourcesContent":["import Box from '@mui/material/Box/index.js';\nimport React from 'react';\n\nimport type { AspectRatioProps } from './AspectRatio.types';\n\nexport const AspectRatio: React.FC<AspectRatioProps> = ({\n children,\n variant = '16:9',\n ratio,\n maxWidth,\n maxHeight,\n dataTestId,\n sx,\n ...props\n}) => {\n const getAspectRatio = () => {\n if (variant === 'custom' && ratio) {\n return ratio;\n }\n\n switch (variant) {\n case '16:9':\n return 16 / 9;\n case '4:3':\n return 4 / 3;\n case '1:1':\n return 1;\n case '3:2':\n return 3 / 2;\n case '21:9':\n return 21 / 9;\n default:\n return 16 / 9;\n }\n };\n\n const aspectRatio = getAspectRatio();\n\n return (\n <Box\n data-testid={dataTestId}\n sx={{\n position: 'relative',\n width: '100%',\n maxWidth,\n maxHeight,\n ...sx,\n }}\n {...props}\n >\n <Box\n sx={{\n width: '100%',\n paddingTop: `${(1 / aspectRatio) * 100}%`,\n position: 'relative',\n }}\n >\n <Box\n sx={{\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n overflow: 'hidden',\n }}\n >\n {children}\n </Box>\n </Box>\n </Box>\n );\n};\n"],"mappings":";AAAA,OAAO,SAAS;AAyDR;AApDD,IAAM,cAA0C,CAAC;AAAA,EACtD;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAM;AACJ,QAAM,iBAAiB,MAAM;AAC3B,QAAI,YAAY,YAAY,OAAO;AACjC,aAAO;AAAA,IACT;AAEA,YAAQ,SAAS;AAAA,MACf,KAAK;AACH,eAAO,KAAK;AAAA,MACd,KAAK;AACH,eAAO,IAAI;AAAA,MACb,KAAK;AACH,eAAO;AAAA,MACT,KAAK;AACH,eAAO,IAAI;AAAA,MACb,KAAK;AACH,eAAO,KAAK;AAAA,MACd;AACE,eAAO,KAAK;AAAA,IAChB;AAAA,EACF;AAEA,QAAM,cAAc,eAAe;AAEnC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAa;AAAA,MACb,IAAI;AAAA,QACF,UAAU;AAAA,QACV,OAAO;AAAA,QACP;AAAA,QACA;AAAA,QACA,GAAG;AAAA,MACL;AAAA,MACC,GAAG;AAAA,MAEJ;AAAA,QAAC;AAAA;AAAA,UACC,IAAI;AAAA,YACF,OAAO;AAAA,YACP,YAAY,GAAI,IAAI,cAAe,GAAG;AAAA,YACtC,UAAU;AAAA,UACZ;AAAA,UAEA;AAAA,YAAC;AAAA;AAAA,cACC,IAAI;AAAA,gBACF,UAAU;AAAA,gBACV,KAAK;AAAA,gBACL,MAAM;AAAA,gBACN,OAAO;AAAA,gBACP,QAAQ;AAAA,gBACR,SAAS;AAAA,gBACT,YAAY;AAAA,gBACZ,gBAAgB;AAAA,gBAChB,UAAU;AAAA,cACZ;AAAA,cAEC;AAAA;AAAA,UACH;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/typography/Blockquote/Blockquote.tsx"],"sourcesContent":["import FormatQuote from '@mui/icons-material/FormatQuote';\nimport type { Theme } from '@mui/material/styles/index.js';\nimport Box from '@mui/material/Box/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport { alpha, styled } from '@mui/material/styles/index.js';\nimport React from 'react';\n\nimport type { BlockquoteProps } from './Blockquote.types';\nimport { absoluteInk, controlNeutral, neutralTones } from '../../../tokens/ink';\nimport { rem } from '../../../tokens/relative';\n\nconst getColorFromTheme = (theme: Theme, color: string) => {\n if (color === 'neutral') {\n const { main, light, dark } = controlNeutral(theme);\n return { main, light, dark };\n }\n\n const colorMap: Record<string, typeof theme.palette.primary> = {\n primary: theme.palette.primary,\n secondary: theme.palette.secondary,\n success: theme.palette.success,\n warning: theme.palette.warning,\n info: theme.palette.info,\n danger: theme.palette.error,\n };\n\n return colorMap[color] || theme.palette.primary;\n};\n\nconst StyledBlockquote = styled('blockquote', {\n shouldForwardProp: (prop) => !['customVariant', 'customColor'].includes(prop as string),\n})<{\n customVariant?: string;\n customColor?: string;\n}>(({ theme, customVariant = 'default', customColor = 'neutral' }) => {\n const colorPalette = getColorFromTheme(theme, customColor);\n\n const baseStyles = {\n margin: '1.5em 0',\n padding: 0,\n position: 'relative' as const,\n fontFamily: theme.typography.body1.fontFamily,\n fontSize: rem(theme, 18),\n lineHeight: 1.6,\n fontStyle: 'italic',\n color: theme.palette.text.primary,\n };\n\n // Return styles based on variant\n if (customVariant === 'bordered') {\n return {\n ...baseStyles,\n padding: theme.spacing(3),\n border: `2px solid ${alpha(colorPalette.main, 0.2)}`,\n borderRadius: theme.shape.borderRadius * 2,\n backgroundColor: alpha(colorPalette.main, 0.03),\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n top: -1,\n left: -1,\n right: -1,\n bottom: -1,\n background: `linear-gradient(135deg, ${colorPalette.main}, ${colorPalette.light})`,\n borderRadius: theme.shape.borderRadius * 2,\n padding: '2px',\n WebkitMask: `linear-gradient(${absoluteInk(theme).white} 0 0) content-box, linear-gradient(${absoluteInk(theme).white} 0 0)`,\n WebkitMaskComposite: 'exclude',\n mask: `linear-gradient(${absoluteInk(theme).white} 0 0) content-box, linear-gradient(${absoluteInk(theme).white} 0 0)`,\n maskComposite: 'exclude',\n },\n };\n }\n\n if (customVariant === 'citation') {\n return {\n ...baseStyles,\n padding: theme.spacing(2, 3),\n backgroundColor:\n theme.palette.mode === 'dark'\n ? alpha(theme.palette.background.paper, 0.8)\n : alpha(neutralTones(theme).canvas, 0.95),\n backdropFilter: theme.palette.mode === 'dark' ? 'blur(10px)' : 'none',\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n borderRadius: theme.shape.borderRadius * 2,\n boxShadow: theme.palette.mode === 'dark' ? theme.shadows[4] : 'none',\n textAlign: 'center' as const,\n };\n }\n\n // Default variant\n return {\n ...baseStyles,\n paddingLeft: theme.spacing(3),\n borderLeft: `4px solid ${colorPalette.main}`,\n backgroundColor: alpha(colorPalette.main, 0.05),\n padding: theme.spacing(2, 3),\n borderRadius: theme.shape.borderRadius,\n };\n});\n\nconst QuoteIcon = styled(FormatQuote)<{ customColor: string }>(({ theme, customColor }) => {\n const colorPalette = getColorFromTheme(theme, customColor);\n \n return {\n position: 'absolute',\n top: theme.spacing(1),\n left: theme.spacing(1),\n fontSize: rem(theme, 32),\n opacity: 0.3,\n transform: 'rotate(180deg)',\n color: colorPalette.main,\n };\n});\n\nconst CitationContainer = styled(Box)(({ theme }) => ({\n marginTop: theme.spacing(2),\n textAlign: 'right',\n fontStyle: 'normal',\n opacity: 0.8,\n}));\n\nconst AuthorName = styled(Typography)(({ theme }) => ({\n fontWeight: 600,\n fontSize: rem(theme, 14),\n marginBottom: theme.spacing(0.5),\n}));\n\nconst SourceName = styled(Typography)(({ theme }) => ({\n fontSize: rem(theme, 12),\n opacity: 0.7,\n}));\n\nexport const Blockquote = React.forwardRef<globalThis.HTMLQuoteElement, BlockquoteProps>(\n ({ variant = 'default', author, source, color = 'neutral', children, ...props }, ref) => {\n const showCitation = author || source;\n const showIcon = variant === 'bordered' || variant === 'citation';\n\n return (\n <StyledBlockquote ref={ref} customVariant={variant} customColor={color} {...props}>\n {showIcon && <QuoteIcon customColor={color} />}\n\n <Typography\n component=\"div\"\n sx={{\n fontSize: 'inherit',\n lineHeight: 'inherit',\n fontStyle: 'inherit',\n color: 'inherit',\n margin: 0,\n }}\n >\n {children}\n </Typography>\n\n {showCitation && (\n <CitationContainer>\n {author && <AuthorName>— {author}</AuthorName>}\n {source && <SourceName>{source}</SourceName>}\n </CitationContainer>\n )}\n </StyledBlockquote>\n );\n },\n);\n\nBlockquote.displayName = 'Blockquote';"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/feedback/TutorialOverlay/TutorialOverlay.geometry.ts"],"sourcesContent":["const DEFAULT_PADDING = 16;\n\nexport const getElementBounds = (selector: string): globalThis.DOMRect | null =>\n document.querySelector(selector)?.getBoundingClientRect() ?? null;\n\n// With placement 'auto', the side with the most free space around the target\n// wins.\nconst pickPlacement = (targetBounds: globalThis.DOMRect): string => {\n const spaces = {\n top: targetBounds.top,\n bottom: window.innerHeight - targetBounds.bottom,\n left: targetBounds.left,\n right: window.innerWidth - targetBounds.right,\n };\n\n return Object.entries(spaces).reduce((a, b) => (b[1] > a[1] ? b : a))[0];\n};\n\nconst offsetFor = (\n placement: string,\n targetBounds: globalThis.DOMRect,\n tooltipBounds: globalThis.DOMRect,\n padding: number,\n): { top: number; left: number } => {\n const centredLeft = targetBounds.left + targetBounds.width / 2 - tooltipBounds.width / 2;\n const centredTop = targetBounds.top + targetBounds.height / 2 - tooltipBounds.height / 2;\n\n switch (placement) {\n case 'top':\n return { top: targetBounds.top - tooltipBounds.height - padding, left: centredLeft };\n case 'bottom':\n return { top: targetBounds.bottom + padding, left: centredLeft };\n case 'left':\n return { top: centredTop, left: targetBounds.left - tooltipBounds.width - padding };\n case 'right':\n return { top: centredTop, left: targetBounds.right + padding };\n default:\n return { top: 0, left: 0 };\n }\n};\n\n// Keeps the tooltip fully on screen, whatever the chosen side works out to.\nconst clampToViewport = (\n position: { top: number; left: number },\n tooltipBounds: globalThis.DOMRect,\n padding: number,\n) => ({\n top: Math.max(padding, Math.min(position.top, window.innerHeight - tooltipBounds.height - padding)),\n left: Math.max(padding, Math.min(position.left, window.innerWidth - tooltipBounds.width - padding)),\n});\n\nexport const calculateTooltipPosition = (\n targetBounds: globalThis.DOMRect,\n tooltipBounds: globalThis.DOMRect,\n placement: string,\n padding = DEFAULT_PADDING,\n) => {\n const finalPlacement = placement === 'auto' ? pickPlacement(targetBounds) : placement;\n const offset = offsetFor(finalPlacement, targetBounds, tooltipBounds, padding);\n\n return {\n position: clampToViewport(offset, tooltipBounds, padding),\n placement: finalPlacement,\n };\n};\n"],"mappings":";AAAA,IAAM,kBAAkB;AAEjB,IAAM,mBAAmB,CAAC,aAC/B,SAAS,cAAc,QAAQ,GAAG,sBAAsB,KAAK;AAI/D,IAAM,gBAAgB,CAAC,iBAA6C;AAClE,QAAM,SAAS;AAAA,IACb,KAAK,aAAa;AAAA,IAClB,QAAQ,OAAO,cAAc,aAAa;AAAA,IAC1C,MAAM,aAAa;AAAA,IACnB,OAAO,OAAO,aAAa,aAAa;AAAA,EAC1C;AAEA,SAAO,OAAO,QAAQ,MAAM,EAAE,OAAO,CAAC,GAAG,MAAO,EAAE,CAAC,IAAI,EAAE,CAAC,IAAI,IAAI,CAAE,EAAE,CAAC;AACzE;AAEA,IAAM,YAAY,CAChB,WACA,cACA,eACA,YACkC;AAClC,QAAM,cAAc,aAAa,OAAO,aAAa,QAAQ,IAAI,cAAc,QAAQ;AACvF,QAAM,aAAa,aAAa,MAAM,aAAa,SAAS,IAAI,cAAc,SAAS;AAEvF,UAAQ,WAAW;AAAA,IACjB,KAAK;AACH,aAAO,EAAE,KAAK,aAAa,MAAM,cAAc,SAAS,SAAS,MAAM,YAAY;AAAA,IACrF,KAAK;AACH,aAAO,EAAE,KAAK,aAAa,SAAS,SAAS,MAAM,YAAY;AAAA,IACjE,KAAK;AACH,aAAO,EAAE,KAAK,YAAY,MAAM,aAAa,OAAO,cAAc,QAAQ,QAAQ;AAAA,IACpF,KAAK;AACH,aAAO,EAAE,KAAK,YAAY,MAAM,aAAa,QAAQ,QAAQ;AAAA,IAC/D;AACE,aAAO,EAAE,KAAK,GAAG,MAAM,EAAE;AAAA,EAC7B;AACF;AAGA,IAAM,kBAAkB,CACtB,UACA,eACA,aACI;AAAA,EACJ,KAAK,KAAK,IAAI,SAAS,KAAK,IAAI,SAAS,KAAK,OAAO,cAAc,cAAc,SAAS,OAAO,CAAC;AAAA,EAClG,MAAM,KAAK,IAAI,SAAS,KAAK,IAAI,SAAS,MAAM,OAAO,aAAa,cAAc,QAAQ,OAAO,CAAC;AACpG;AAEO,IAAM,2BAA2B,CACtC,cACA,eACA,WACA,UAAU,oBACP;AACH,QAAM,iBAAiB,cAAc,SAAS,cAAc,YAAY,IAAI;AAC5E,QAAM,SAAS,UAAU,gBAAgB,cAAc,eAAe,OAAO;AAE7E,SAAO;AAAA,IACL,UAAU,gBAAgB,QAAQ,eAAe,OAAO;AAAA,IACxD,WAAW;AAAA,EACb;AACF;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/utility/WorkflowStep/WorkflowStep.parts.tsx"],"sourcesContent":["import Box from '@mui/material/Box/index.js';\nimport type { CSSObject, Theme } from '@mui/material/styles/index.js';\nimport { styled } from '@mui/material/styles/index.js';\nimport React, { forwardRef, useCallback } from 'react';\n\nimport type { StepColors } from './WorkflowStep.helpers';\nimport { indicatorSizeFor, stepColors, stepPalette } from './WorkflowStep.helpers';\nimport type {\n StepConnectorProps,\n StepContentProps,\n StepIndicatorProps,\n WorkflowStepProps,\n} from './WorkflowStep.types';\nimport { neutralTones } from '../../../tokens/ink';\nimport { rem } from '../../../tokens/relative';\n\n// `outlined` shows the surface through a coloured rim; the other three fill it and\n// differ only in what border they keep.\nconst indicatorVariantStyles = (\n theme: Theme,\n variant: WorkflowStepProps['variant'],\n { backgroundColor, borderColor, textColor }: StepColors,\n): CSSObject => {\n if (variant === 'outlined') {\n return {\n border: `2px solid ${borderColor}`,\n backgroundColor: theme.palette.background.paper,\n };\n }\n\n const filled = { backgroundColor, color: textColor };\n\n switch (variant) {\n case 'filled':\n return filled;\n case 'minimal':\n return { ...filled, border: 'none' };\n case 'default':\n return { ...filled, border: `1px solid ${borderColor}` };\n default:\n return {};\n }\n};\n\nconst StepItem = styled(Box, {\n shouldForwardProp: (prop) => !['orientation', 'isLast'].includes(prop as string),\n})<{\n orientation: WorkflowStepProps['orientation'];\n isLast: boolean;\n}>(({ orientation, isLast }) => ({\n display: 'flex',\n flexDirection: orientation === 'vertical' ? 'column' : 'row',\n alignItems: orientation === 'vertical' ? 'flex-start' : 'center',\n flex: orientation === 'horizontal' && !isLast ? 1 : 'none',\n position: 'relative',\n minWidth: 0, // Allow content to shrink\n}));\n\nconst StepIndicator = styled(Box, {\n shouldForwardProp: (prop) => !['size', 'variant', 'color', 'isActive', 'isCompleted', 'isError', 'interactive', 'disabled'].includes(prop as string),\n})<{\n size: WorkflowStepProps['size'];\n variant: WorkflowStepProps['variant'];\n color: WorkflowStepProps['color'];\n isActive: boolean;\n isCompleted: boolean;\n isError: boolean;\n interactive: boolean;\n animated: boolean;\n disabled: boolean;\n}>(({ theme, size, variant, color, isActive, isCompleted, isError, interactive, animated, disabled }) => {\n const indicatorSize = indicatorSizeFor(size);\n const palette = stepPalette(theme, color);\n const { backgroundColor, borderColor, textColor } = stepColors(theme, palette, {\n isActive,\n isCompleted,\n isError,\n variant,\n });\n\n return {\n width: indicatorSize,\n height: indicatorSize,\n borderRadius: '50%',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n fontSize: rem(theme, 12),\n fontWeight: theme.typography.fontWeightMedium,\n cursor: interactive && !disabled ? 'pointer' : 'default',\n transition: animated\n ? theme.transitions.create(['background-color', 'border-color', 'transform'], {\n duration: theme.transitions.duration.short,\n })\n : 'none',\n flexShrink: 0,\n\n ...indicatorVariantStyles(theme, variant, { backgroundColor, borderColor, textColor }),\n\n // Interactive states\n ...(interactive && !disabled && {\n '&:hover': {\n transform: 'scale(1.1)',\n boxShadow: theme.shadows[2],\n },\n '&:focus-visible': {\n outline: `2px solid ${palette.main}`,\n outlineOffset: '2px',\n },\n }),\n\n // Disabled state\n ...(disabled && {\n opacity: 0.5,\n cursor: 'not-allowed',\n }),\n };\n});\n\nconst StepContent = styled(Box, {\n shouldForwardProp: (prop) => !['orientation', 'interactive', 'disabled'].includes(prop as string),\n})<{\n orientation: WorkflowStepProps['orientation'];\n interactive: boolean;\n disabled: boolean;\n}>(({ theme, orientation, interactive, disabled }) => ({\n display: 'flex',\n flexDirection: 'column',\n alignItems: orientation === 'vertical' ? 'flex-start' : 'center',\n textAlign: orientation === 'vertical' ? 'left' : 'center',\n marginTop: orientation === 'vertical' ? theme.spacing(1) : theme.spacing(0.5),\n marginLeft: orientation === 'horizontal' ? theme.spacing(1) : 0,\n cursor: interactive && !disabled ? 'pointer' : 'default',\n minWidth: 0,\n flex: 1,\n\n '& .step-title': {\n fontSize: rem(theme, 14),\n fontWeight: theme.typography.fontWeightMedium,\n color: theme.palette.text.primary,\n marginBottom: theme.spacing(0.5),\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n maxWidth: '100%',\n },\n\n '& .step-description': {\n fontSize: rem(theme, 12),\n color: theme.palette.text.secondary,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n maxWidth: '100%',\n },\n\n ...(disabled && {\n opacity: 0.5,\n }),\n}));\n\nconst StepConnector = styled(Box, {\n shouldForwardProp: (prop) => !['orientation', 'isCompleted', 'color', 'variant'].includes(prop as string),\n})<{\n orientation: WorkflowStepProps['orientation'];\n isCompleted: boolean;\n color: WorkflowStepProps['color'];\n variant: WorkflowStepProps['variant'];\n}>(({ theme, orientation, isCompleted, color, variant }) => {\n const colorKey = color || 'primary';\n const colorValue = colorKey === 'neutral' \n ? { main: neutralTones(theme).emphasis }\n : theme.palette[colorKey as 'primary' | 'secondary' | 'success' | 'warning' | 'error'];\n const connectorColor = isCompleted ? colorValue.main : neutralTones(theme).track;\n\n return {\n flex: 1,\n position: 'relative',\n \n ...(orientation === 'horizontal' && {\n height: '2px',\n backgroundColor: connectorColor,\n margin: `0 ${theme.spacing(1)}`,\n minWidth: theme.spacing(2),\n }),\n \n ...(orientation === 'vertical' && {\n width: '2px',\n backgroundColor: connectorColor,\n minHeight: theme.spacing(3),\n marginLeft: theme.spacing(2),\n position: 'absolute',\n left: '50%',\n transform: 'translateX(-50%)',\n top: '100%',\n }),\n\n transition: theme.transitions.create('background-color', {\n duration: theme.transitions.duration.short,\n }),\n\n ...(variant === 'minimal' && {\n opacity: 0.6,\n }),\n };\n});\n\n/**\n * Individual step indicator component\n */\nconst StepIndicatorComponent = forwardRef<HTMLDivElement, StepIndicatorProps>(({\n step,\n index,\n isActive,\n isCompleted,\n isError,\n variant,\n color,\n size,\n showNumbers,\n showIcons,\n completedIcon,\n errorIcon,\n interactive,\n animated,\n disabled,\n onClick,\n 'data-testid': dataTestId,\n}, ref) => {\n const handleClick = useCallback(() => {\n if (interactive && !disabled && onClick) {\n onClick(index, step);\n }\n }, [interactive, disabled, onClick, index, step]);\n\n const handleKeyDown = useCallback((event: React.KeyboardEvent) => {\n if (interactive && !disabled && (event.key === 'Enter' || event.key === ' ')) {\n event.preventDefault();\n if (onClick) {\n onClick(index, step);\n }\n }\n }, [interactive, disabled, onClick, index, step]);\n\n const renderIndicatorContent = () => {\n if (isError && errorIcon) {\n return errorIcon;\n }\n if (isCompleted && completedIcon) {\n return completedIcon;\n }\n if (showIcons && step.icon) {\n return step.icon;\n }\n if (showNumbers) {\n return index + 1;\n }\n return null;\n };\n\n return (\n <StepIndicator\n ref={ref}\n size={size}\n variant={variant}\n color={color}\n isActive={isActive}\n isCompleted={isCompleted}\n isError={isError}\n interactive={interactive}\n animated={animated}\n disabled={Boolean(disabled || step.disabled)}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n role={interactive ? 'button' : undefined}\n tabIndex={interactive && !disabled && !step.disabled ? 0 : -1}\n aria-label={`Step ${index + 1}: ${step.title}`}\n aria-current={isActive ? 'step' : undefined}\n data-testid={dataTestId}\n >\n {renderIndicatorContent()}\n </StepIndicator>\n );\n});\n\nStepIndicatorComponent.displayName = 'StepIndicator';\n\n/**\n * Step connector component\n */\nconst StepConnectorComponent = forwardRef<HTMLDivElement, StepConnectorProps>(({\n isCompleted,\n orientation,\n variant,\n color,\n 'data-testid': dataTestId,\n}, ref) => (\n <StepConnector\n ref={ref}\n orientation={orientation}\n isCompleted={isCompleted}\n color={color}\n variant={variant}\n data-testid={dataTestId}\n />\n));\n\nStepConnectorComponent.displayName = 'StepConnector';\n\n/**\n * Step content component\n */\nconst StepContentComponent = forwardRef<HTMLDivElement, StepContentProps>(({\n step,\n index,\n orientation,\n interactive,\n disabled,\n onClick,\n 'data-testid': dataTestId,\n}, ref) => {\n const handleClick = useCallback(() => {\n if (interactive && !disabled && onClick) {\n onClick(index, step);\n }\n }, [interactive, disabled, onClick, index, step]);\n\n const handleKeyDown = useCallback((event: React.KeyboardEvent) => {\n if (interactive && !disabled && (event.key === 'Enter' || event.key === ' ')) {\n event.preventDefault();\n if (onClick) {\n onClick(index, step);\n }\n }\n }, [interactive, disabled, onClick, index, step]);\n\n return (\n <StepContent\n ref={ref}\n orientation={orientation}\n interactive={interactive}\n disabled={Boolean(disabled || step.disabled)}\n onClick={handleClick}\n onKeyDown={handleKeyDown}\n role={interactive ? 'button' : undefined}\n tabIndex={interactive && !disabled && !step.disabled ? 0 : -1}\n data-testid={dataTestId}\n >\n <div className=\"step-title\">{step.title}</div>\n {step.description && (\n <div className=\"step-description\">{step.description}</div>\n )}\n </StepContent>\n );\n});\n\nStepContentComponent.displayName = 'StepContent';\n\n/**\n * A plain wrapper around the styled row. Exporting the styled component itself\n * trips TS2742 — its inferred type names a pnpm-internal @mui/system path.\n */\nexport const StepItemRow: React.FC<{\n orientation: WorkflowStepProps['orientation'];\n isLast: boolean;\n children: React.ReactNode;\n}> = ({ orientation, isLast, children }) => (\n <StepItem orientation={orientation} isLast={isLast}>\n {children}\n </StepItem>\n);\n\nexport { StepConnectorComponent, StepContentComponent, StepIndicatorComponent };\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/layout/Resizable/Resizable.hooks.ts"],"sourcesContent":["import React, { useCallback, useRef, useState } from 'react';\n\nimport type { Bounds } from './Resizable.helpers';\nimport { resizedTo } from './Resizable.helpers';\nimport type { ResizeHandle } from './Resizable.types';\n\ninterface ResizeArgs {\n width: number;\n height: number;\n bounds: Bounds;\n disabled: boolean;\n onResize?: (width: number, height: number) => void;\n}\n\n/**\n * Tracks the box's size across a drag. The listeners live on the document rather\n * than the handle, so the pointer can leave the handle — or the component — mid\n * drag without the resize sticking.\n */\nexport const useResize = ({ width, height, bounds, disabled, onResize }: ResizeArgs) => {\n const [size, setSize] = useState({ width, height });\n const [isResizing, setIsResizing] = useState(false);\n const startPos = useRef({ x: 0, y: 0 });\n const startSize = useRef({ width: 0, height: 0 });\n const activeHandle = useRef<ResizeHandle | null>(null);\n\n React.useEffect(() => {\n setSize({ width, height });\n }, [width, height]);\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent, handle: ResizeHandle) => {\n if (disabled) return;\n\n e.preventDefault();\n e.stopPropagation();\n\n setIsResizing(true);\n activeHandle.current = handle;\n startPos.current = { x: e.clientX, y: e.clientY };\n startSize.current = { width: size.width, height: size.height };\n\n const handleMouseMove = (move: globalThis.MouseEvent) => {\n const delta = {\n x: move.clientX - startPos.current.x,\n y: move.clientY - startPos.current.y,\n };\n const next = resizedTo(handle, delta, startSize.current, bounds);\n\n setSize(next);\n onResize?.(next.width, next.height);\n };\n\n const handleMouseUp = () => {\n setIsResizing(false);\n activeHandle.current = null;\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n };\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n },\n [disabled, size, bounds, onResize],\n );\n\n return { size, isResizing, activeHandle, handleMouseDown };\n};\n"],"mappings":";;;;;AAAA,OAAO,SAAS,aAAa,QAAQ,gBAAgB;AAmB9C,IAAM,YAAY,CAAC,EAAE,OAAO,QAAQ,QAAQ,UAAU,SAAS,MAAkB;AACtF,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,EAAE,OAAO,OAAO,CAAC;AAClD,QAAM,CAAC,YAAY,aAAa,IAAI,SAAS,KAAK;AAClD,QAAM,WAAW,OAAO,EAAE,GAAG,GAAG,GAAG,EAAE,CAAC;AACtC,QAAM,YAAY,OAAO,EAAE,OAAO,GAAG,QAAQ,EAAE,CAAC;AAChD,QAAM,eAAe,OAA4B,IAAI;AAErD,QAAM,UAAU,MAAM;AACpB,YAAQ,EAAE,OAAO,OAAO,CAAC;AAAA,EAC3B,GAAG,CAAC,OAAO,MAAM,CAAC;AAElB,QAAM,kBAAkB;AAAA,IACtB,CAAC,GAAqB,WAAyB;AAC7C,UAAI,SAAU;AAEd,QAAE,eAAe;AACjB,QAAE,gBAAgB;AAElB,oBAAc,IAAI;AAClB,mBAAa,UAAU;AACvB,eAAS,UAAU,EAAE,GAAG,EAAE,SAAS,GAAG,EAAE,QAAQ;AAChD,gBAAU,UAAU,EAAE,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO;AAE7D,YAAM,kBAAkB,CAAC,SAAgC;AACvD,cAAM,QAAQ;AAAA,UACZ,GAAG,KAAK,UAAU,SAAS,QAAQ;AAAA,UACnC,GAAG,KAAK,UAAU,SAAS,QAAQ;AAAA,QACrC;AACA,cAAM,OAAO,UAAU,QAAQ,OAAO,UAAU,SAAS,MAAM;AAE/D,gBAAQ,IAAI;AACZ,mBAAW,KAAK,OAAO,KAAK,MAAM;AAAA,MACpC;AAEA,YAAM,gBAAgB,MAAM;AAC1B,sBAAc,KAAK;AACnB,qBAAa,UAAU;AACvB,iBAAS,oBAAoB,aAAa,eAAe;AACzD,iBAAS,oBAAoB,WAAW,aAAa;AAAA,MACvD;AAEA,eAAS,iBAAiB,aAAa,eAAe;AACtD,eAAS,iBAAiB,WAAW,aAAa;AAAA,IACpD;AAAA,IACA,CAAC,UAAU,MAAM,QAAQ,QAAQ;AAAA,EACnC;AAEA,SAAO,EAAE,MAAM,YAAY,cAAc,gBAAgB;AAC3D;","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\";\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 card's width in px at scale 1 — the zoom slider multiplies this. */\nconst BASE_CARD_WIDTH = 180;\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: 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 {@link BASE_CARD_WIDTH} × 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/** The card grid's min column width in px = base width × the zoom size multiplier. */\nexport function cardMinWidthForZoom(zoom: number): number {\n return Math.round(BASE_CARD_WIDTH * 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/** 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 const [layout, setLayoutState] = useState<DataViewsLayout>(() =>\n pinLayout(\n viewLayout ?? (ignoreStoredLayout ? undefined : readStoredLayout()) ?? defaultLayout,\n availability,\n ),\n );\n const [density, setDensityState] = useState<DataViewsDensity>(\n () => (ignoreStoredLayout ? undefined : readStoredDensity()) ?? \"cozy\",\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: 14 }} />\n <Box sx={{ width: 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: 20 }} />\n </Box>\n );\n}\n"],"mappings":"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","names":["default"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/navigation/Pagination/Pagination.styles.ts"],"sourcesContent":["import { alpha } from '@mui/material/styles/index.js';\nimport type { CSSObject, Theme } from '@mui/material/styles/index.js';\nimport { rem } from '../../../tokens/relative';\n\nconst ITEM_SIZE_STYLES: Record<string, (theme: Theme) => CSSObject> = {\n sm: (theme) => ({\n fontSize: rem(theme, 14),\n minWidth: 28,\n height: 28,\n padding: theme.spacing(0.25, 0.5) }),\n lg: (theme) => ({\n fontSize: rem(theme, 18),\n minWidth: 44,\n height: 44,\n padding: theme.spacing(1, 1.5) }) };\n\n// One variant applies at a time, so a lookup replaces the mutually exclusive\n// spreads.\nconst ITEM_VARIANTS: Record<string, (theme: Theme, customSize?: string) => CSSObject> = {\n default: (theme, _customSize) => ({\n borderRadius: theme.spacing(1),\n '&:hover': {\n backgroundColor: alpha(theme.palette.primary.main, 0.08),\n transform: 'translateY(-1px)',\n boxShadow: `0 2px 8px ${alpha(theme.palette.primary.main, 0.15)}` },\n '&.Mui-selected': {\n backgroundColor: theme.palette.primary.main,\n color: theme.palette.primary.contrastText,\n boxShadow: `0 4px 12px ${alpha(theme.palette.primary.main, 0.3)}`,\n '&:hover': {\n backgroundColor: theme.palette.primary.dark,\n transform: 'translateY(-2px)' } } }),\n rounded: (theme, customSize) => ({\n borderRadius: '50%',\n minWidth: customSize === 'sm' ? 28 : customSize === 'lg' ? 44 : 36,\n width: customSize === 'sm' ? 28 : customSize === 'lg' ? 44 : 36,\n '&:hover': {\n backgroundColor: alpha(theme.palette.primary.main, 0.08),\n transform: 'scale(1.1)',\n boxShadow: `0 4px 16px ${alpha(theme.palette.primary.main, 0.2)}` },\n '&.Mui-selected': {\n backgroundColor: theme.palette.primary.main,\n color: theme.palette.primary.contrastText,\n transform: 'scale(1.05)',\n boxShadow: `0 6px 20px ${alpha(theme.palette.primary.main, 0.3)}`,\n '&:hover': {\n backgroundColor: theme.palette.primary.dark,\n transform: 'scale(1.15)' } } }),\n dots: (theme, customSize) => ({\n borderRadius: '50%',\n minWidth: customSize === 'sm' ? 8 : customSize === 'lg' ? 12 : 10,\n width: customSize === 'sm' ? 8 : customSize === 'lg' ? 12 : 10,\n height: customSize === 'sm' ? 8 : customSize === 'lg' ? 12 : 10,\n fontSize: 0,\n backgroundColor: alpha(theme.palette.text.secondary, 0.3),\n '&:hover': {\n backgroundColor: alpha(theme.palette.primary.main, 0.5),\n transform: 'scale(1.3)' },\n '&.Mui-selected': {\n backgroundColor: theme.palette.primary.main,\n transform: 'scale(1.2)',\n '&:hover': {\n backgroundColor: theme.palette.primary.dark,\n transform: 'scale(1.4)' } },\n '&.MuiPaginationItem-previousNext, &.MuiPaginationItem-firstLast': {\n display: 'none' } }),\n minimal: (theme, _customSize) => ({\n borderRadius: theme.spacing(0.5),\n backgroundColor: 'transparent',\n color: theme.palette.text.secondary,\n padding: theme.spacing(0.5, 1),\n '&:hover': {\n backgroundColor: alpha(theme.palette.primary.main, 0.04),\n color: theme.palette.primary.main },\n '&.Mui-selected': {\n backgroundColor: 'transparent',\n color: theme.palette.primary.main,\n fontWeight: 600,\n position: 'relative',\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n bottom: 0,\n left: '50%',\n transform: 'translateX(-50%)',\n width: '60%',\n height: 2,\n backgroundColor: theme.palette.primary.main,\n borderRadius: 1 } } }) };\n\nconst itemSizeStyles = (theme: Theme, customSize?: string): CSSObject =>\n customSize ? (ITEM_SIZE_STYLES[customSize]?.(theme) ?? {}) : {};\n\nconst itemVariantStyles = (theme: Theme, customVariant?: string, customSize?: string): CSSObject =>\n customVariant ? (ITEM_VARIANTS[customVariant]?.(theme, customSize) ?? {}) : {};\n\n// The pagination list's own styling, lifted out so the styled() callback is a\n// single spread.\nexport const paginationStyles = ({\n theme,\n customVariant,\n customSize }: {\n theme: Theme;\n customVariant?: string;\n customSize?: string;\n}): CSSObject => ({\n '& .MuiPagination-ul': {\n gap: customVariant === 'minimal' ? theme.spacing(0.5) : theme.spacing(1) },\n\n '& .MuiPaginationItem-root': {\n ...itemSizeStyles(theme, customSize),\n ...itemVariantStyles(theme, customVariant, customSize),\n transition: 'all 0.2s ease',\n fontWeight: 500,\n\n\n\n\n\n // Default variant (flat design)\n\n\n // Rounded variant\n\n\n // Dots variant (minimal circular dots)\n\n\n // Minimal variant (text-only)\n\n },\n\n // Hide ellipsis for dots variant\n ...(customVariant === 'dots' && {\n '& .MuiPaginationItem-ellipsis': {\n display: 'none' } }) });\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/navigation/NavigationMenu/NavigationStandardBody.tsx"],"sourcesContent":["import MenuIcon from '@mui/icons-material/Menu';\nimport Box from '@mui/material/Box/index.js';\nimport Divider from '@mui/material/Divider/index.js';\nimport Fade from '@mui/material/Fade/index.js';\nimport ListItemIcon from '@mui/material/ListItemIcon/index.js';\nimport ListItemText from '@mui/material/ListItemText/index.js';\nimport Paper from '@mui/material/Paper/index.js';\nimport { alpha } from '@mui/material/styles/index.js';\nimport type { FC, ReactNode } from 'react';\nimport React from 'react';\n\nimport { CollapseToggle, LogoBar, MenuList } from './NavigationMenu.shell';\nimport { slideIn } from './NavigationMenu.styles';\nimport type { NavigationMenuItem } from './NavigationMenu.types';\nimport { renderMenuItem } from './NavigationMenuItem';\n\nconst DividerRule: FC = () => (\n <Divider\n sx={{\n my: 1,\n opacity: 0.5,\n background: (theme) =>\n `linear-gradient(90deg, transparent 0%, ${alpha(theme.palette.divider, 0.5)} 50%, transparent 100%)`,\n }}\n />\n);\n\nconst VerticalLogo: FC<{ logo: ReactNode; collapsed: boolean }> = ({ logo, collapsed }) => (\n <LogoBar>\n {collapsed ? (\n <Box sx={{ display: 'flex', justifyContent: 'center' }}>\n <MenuIcon />\n </Box>\n ) : (\n logo\n )}\n </LogoBar>\n);\n\nconst CollapseControl: FC<{ collapsed: boolean; onToggle: () => void }> = ({\n collapsed,\n onToggle,\n}) => (\n <CollapseToggle onClick={onToggle}>\n <ListItemIcon sx={{ minWidth: collapsed ? 0 : 40, justifyContent: 'center' }}>\n <MenuIcon />\n </ListItemIcon>\n {!collapsed && <ListItemText primary=\"Collapse\" />}\n </CollapseToggle>\n);\n\nconst MenuItems: FC<{\n items: NavigationMenuItem[];\n variant: string;\n size: string;\n collapsed: boolean;\n minimal: boolean;\n showDividers: boolean;\n}> = ({ items, variant, size, collapsed, minimal, showDividers }) => (\n <MenuList variant={variant} size={size}>\n {items.map((item, index) => (\n <React.Fragment key={item.id}>\n <Box\n sx={{\n // Staggered so the list fills in rather than appearing at once.\n animation: `${slideIn} 0.4s ease-out`,\n animationDelay: `${index * 0.05}s`,\n animationFillMode: 'both',\n }}\n >\n {renderMenuItem(item, variant, size, collapsed, minimal, 0)}\n </Box>\n {showDividers && index < items.length - 1 && <DividerRule />}\n </React.Fragment>\n ))}\n </MenuList>\n);\n\nconst EndPanel: FC<{ children: ReactNode }> = ({ children }) => (\n <Fade in timeout={600}>\n <Box\n sx={{\n mt: 'auto',\n p: 2,\n borderTop: (theme) => `1px solid ${alpha(theme.palette.divider, 0.1)}`,\n background: (theme) =>\n `linear-gradient(180deg, transparent 0%, ${alpha(theme.palette.background.default, 0.5)} 100%)`,\n }}\n >\n {children}\n </Box>\n </Fade>\n);\n\nexport interface NavigationStandardBodyProps {\n variant: string;\n size: string;\n minimal: boolean;\n collapsed: boolean;\n collapsible: boolean;\n showDividers: boolean;\n items: NavigationMenuItem[];\n logo?: ReactNode;\n endContent?: ReactNode;\n onCollapseToggle: () => void;\n}\n\n// The list-based layouts (vertical and horizontal). The logo and the collapse\n// control only apply to the vertical one.\nexport const NavigationStandardBody: FC<NavigationStandardBodyProps> = ({\n variant,\n size,\n minimal,\n collapsed,\n collapsible,\n showDividers,\n items,\n logo,\n endContent,\n onCollapseToggle,\n}) => {\n const isVertical = variant === 'vertical';\n // Only the horizontal bar is raised; vertical rails and minimal sit flat.\n const elevation = !minimal && variant === 'horizontal' ? 1 : 0;\n\n return (\n <Paper\n elevation={elevation}\n sx={{\n width: '100%',\n height: isVertical ? '100%' : 'auto',\n overflow: 'hidden',\n background: minimal ? 'transparent' : undefined,\n }}\n >\n {logo && isVertical && <VerticalLogo logo={logo} collapsed={collapsed} />}\n\n {collapsible && isVertical && (\n <CollapseControl collapsed={collapsed} onToggle={onCollapseToggle} />\n )}\n\n <MenuItems\n items={items}\n variant={variant}\n size={size}\n collapsed={collapsed}\n minimal={minimal}\n showDividers={showDividers}\n />\n\n {endContent && <EndPanel>{endContent}</EndPanel>}\n </Paper>\n );\n};\n"],"mappings":";;;;;;;;;;;;;AAAA,OAAO,cAAc;AACrB,OAAO,SAAS;AAChB,OAAO,aAAa;AACpB,OAAO,UAAU;AACjB,OAAO,kBAAkB;AACzB,OAAO,kBAAkB;AACzB,OAAO,WAAW;AAClB,SAAS,aAAa;AAEtB,OAAO,WAAW;AAQhB,cA0BA,YA1BA;AADF,IAAM,cAAkB,MACtB;AAAA,EAAC;AAAA;AAAA,IACC,IAAI;AAAA,MACF,IAAI;AAAA,MACJ,SAAS;AAAA,MACT,YAAY,CAAC,UACX,0CAA0C,MAAM,MAAM,QAAQ,SAAS,GAAG,CAAC;AAAA,IAC/E;AAAA;AACF;AAGF,IAAM,eAA4D,CAAC,EAAE,MAAM,UAAU,MACnF,oBAAC,WACE,sBACC,oBAAC,OAAI,IAAI,EAAE,SAAS,QAAQ,gBAAgB,SAAS,GACnD,8BAAC,YAAS,GACZ,IAEA,MAEJ;AAGF,IAAM,kBAAoE,CAAC;AAAA,EACzE;AAAA,EACA;AACF,MACE,qBAAC,kBAAe,SAAS,UACvB;AAAA,sBAAC,gBAAa,IAAI,EAAE,UAAU,YAAY,IAAI,IAAI,gBAAgB,SAAS,GACzE,8BAAC,YAAS,GACZ;AAAA,EACC,CAAC,aAAa,oBAAC,gBAAa,SAAQ,YAAW;AAAA,GAClD;AAGF,IAAM,YAOD,CAAC,EAAE,OAAO,SAAS,MAAM,WAAW,SAAS,aAAa,MAC7D,oBAAC,YAAS,SAAkB,MACzB,gBAAM,IAAI,CAAC,MAAM,UAChB,qBAAC,MAAM,UAAN,EACC;AAAA;AAAA,IAAC;AAAA;AAAA,MACC,IAAI;AAAA;AAAA,QAEF,WAAW,GAAG,OAAO;AAAA,QACrB,gBAAgB,GAAG,QAAQ,IAAI;AAAA,QAC/B,mBAAmB;AAAA,MACrB;AAAA,MAEC,yBAAe,MAAM,SAAS,MAAM,WAAW,SAAS,CAAC;AAAA;AAAA,EAC5D;AAAA,EACC,gBAAgB,QAAQ,MAAM,SAAS,KAAK,oBAAC,eAAY;AAAA,KAXvC,KAAK,EAY1B,CACD,GACH;AAGF,IAAM,WAAwC,CAAC,EAAE,SAAS,MACxD,oBAAC,QAAK,IAAE,MAAC,SAAS,KAChB;AAAA,EAAC;AAAA;AAAA,IACC,IAAI;AAAA,MACF,IAAI;AAAA,MACJ,GAAG;AAAA,MACH,WAAW,CAAC,UAAU,aAAa,MAAM,MAAM,QAAQ,SAAS,GAAG,CAAC;AAAA,MACpE,YAAY,CAAC,UACX,2CAA2C,MAAM,MAAM,QAAQ,WAAW,SAAS,GAAG,CAAC;AAAA,IAC3F;AAAA,IAEC;AAAA;AACH,GACF;AAkBK,IAAM,yBAA0D,CAAC;AAAA,EACtE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,aAAa,YAAY;AAE/B,QAAM,YAAY,CAAC,WAAW,YAAY,eAAe,IAAI;AAE7D,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,IAAI;AAAA,QACF,OAAO;AAAA,QACP,QAAQ,aAAa,SAAS;AAAA,QAC9B,UAAU;AAAA,QACV,YAAY,UAAU,gBAAgB;AAAA,MACxC;AAAA,MAEC;AAAA,gBAAQ,cAAc,oBAAC,gBAAa,MAAY,WAAsB;AAAA,QAEtE,eAAe,cACd,oBAAC,mBAAgB,WAAsB,UAAU,kBAAkB;AAAA,QAGrE;AAAA,UAAC;AAAA;AAAA,YACC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA;AAAA,QACF;AAAA,QAEC,cAAc,oBAAC,YAAU,sBAAW;AAAA;AAAA;AAAA,EACvC;AAEJ;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/form/Calendar/CalendarMonth.tsx"],"sourcesContent":["import ChevronLeft from '@mui/icons-material/ChevronLeft';\nimport ChevronRight from '@mui/icons-material/ChevronRight';\nimport Box from '@mui/material/Box/index.js';\nimport IconButton from '@mui/material/IconButton/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport type { FC } from 'react';\nimport React from 'react';\n\nimport { getMonthName } from './Calendar.dates';\nimport type { CalendarProps, MonthMatrix } from './Calendar.types';\nimport type { DayCellContext } from './CalendarDayCell';\nimport { CalendarDayCell } from './CalendarDayCell';\n\nconst SPACER_WIDTH = 32;\n\nconst GRID_SX = { display: 'grid', gridTemplateColumns: 'repeat(7, 1fr)', gap: 0.5 } as const;\n\n// Only the outermost months carry arrows; the ones between get a spacer so their\n// titles stay centred.\nconst MonthNavHeader: FC<{\n title: React.ReactNode;\n showPrevious: boolean;\n showNext: boolean;\n onPreviousMonth: () => void;\n onNextMonth: () => void;\n}> = ({ title, showPrevious, showNext, onPreviousMonth, onNextMonth }) => (\n <Box\n sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', mb: 2 }}\n data-testid=\"calendar-header\"\n >\n {showPrevious && (\n <IconButton onClick={onPreviousMonth} size=\"small\" data-testid=\"calendar-prev-month\">\n <ChevronLeft />\n </IconButton>\n )}\n\n <Typography\n variant=\"h6\"\n component=\"h2\"\n sx={{ fontWeight: 'bold', flex: 1, textAlign: 'center' }}\n >\n {title}\n </Typography>\n\n {showNext && (\n <IconButton onClick={onNextMonth} size=\"small\" data-testid=\"calendar-next-month\">\n <ChevronRight />\n </IconButton>\n )}\n\n {!showPrevious && !showNext && <Box sx={{ width: SPACER_WIDTH }} />}\n </Box>\n);\n\nconst WeekdayHeader: FC<{ weekdayNames: string[] }> = ({ weekdayNames }) => (\n <Box sx={{ ...GRID_SX, mb: 1 }}>\n {weekdayNames.map((weekday, index) => (\n <Box\n // Narrow weekday names repeat within a week ('S', 'T'), so position is\n // the only stable key here.\n key={`weekday-${index}`}\n role=\"columnheader\"\n data-testid={`calendar-weekday-${index}`}\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n height: SPACER_WIDTH,\n fontSize: '0.875rem',\n fontWeight: 'bold',\n color: 'text.secondary',\n }}\n >\n {weekday}\n </Box>\n ))}\n </Box>\n);\n\nexport interface CalendarMonthProps {\n matrix: MonthMatrix;\n monthIndex: number;\n monthsToShow: number;\n locale: string;\n weekdayNames: string[];\n renderHeader?: CalendarProps['renderHeader'];\n onPreviousMonth: () => void;\n onNextMonth: () => void;\n dayContext: DayCellContext;\n}\n\nexport const CalendarMonth: FC<CalendarMonthProps> = ({\n matrix,\n monthIndex,\n monthsToShow,\n locale,\n weekdayNames,\n renderHeader,\n onPreviousMonth,\n onNextMonth,\n dayContext,\n}) => {\n const monthName = getMonthName(matrix.month, matrix.year, locale);\n const title = renderHeader ? renderHeader({ month: matrix.month, year: matrix.year }) : monthName;\n\n return (\n /* The month is addressable by its position, because in a multi-month\n calendar every day number appears once PER MONTH — `calendar-date-5` is\n January's 5th and February's. Without a per-month hook a test can only\n reach a day positionally, which is exactly what the flakiness gate\n refuses. Additive: `calendar-grid` below is unchanged. */\n <Box sx={{ minWidth: 280 }} data-testid={`calendar-month-${monthIndex}`}>\n <MonthNavHeader\n title={title}\n showPrevious={monthIndex === 0}\n showNext={monthIndex === monthsToShow - 1}\n onPreviousMonth={onPreviousMonth}\n onNextMonth={onNextMonth}\n />\n\n <WeekdayHeader weekdayNames={weekdayNames} />\n\n <Box\n role=\"grid\"\n aria-labelledby={`month-${monthIndex}`}\n data-testid=\"calendar-grid\"\n sx={GRID_SX}\n >\n {matrix.weeks.flat().map((day) => (\n <CalendarDayCell key={day.key} day={day} {...dayContext} />\n ))}\n </Box>\n </Box>\n );\n};\n"],"mappings":";;;;;;;;AAAA,OAAO,iBAAiB;AACxB,OAAO,kBAAkB;AACzB,OAAO,SAAS;AAChB,OAAO,gBAAgB;AACvB,OAAO,gBAAgB;AAsBrB,SAMM,KANN;AAbF,IAAM,eAAe;AAErB,IAAM,UAAU,EAAE,SAAS,QAAQ,qBAAqB,kBAAkB,KAAK,IAAI;AAInF,IAAM,iBAMD,CAAC,EAAE,OAAO,cAAc,UAAU,iBAAiB,YAAY,MAClE;AAAA,EAAC;AAAA;AAAA,IACC,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,gBAAgB,iBAAiB,IAAI,EAAE;AAAA,IACpF,eAAY;AAAA,IAEX;AAAA,sBACC,oBAAC,cAAW,SAAS,iBAAiB,MAAK,SAAQ,eAAY,uBAC7D,8BAAC,eAAY,GACf;AAAA,MAGF;AAAA,QAAC;AAAA;AAAA,UACC,SAAQ;AAAA,UACR,WAAU;AAAA,UACV,IAAI,EAAE,YAAY,QAAQ,MAAM,GAAG,WAAW,SAAS;AAAA,UAEtD;AAAA;AAAA,MACH;AAAA,MAEC,YACC,oBAAC,cAAW,SAAS,aAAa,MAAK,SAAQ,eAAY,uBACzD,8BAAC,gBAAa,GAChB;AAAA,MAGD,CAAC,gBAAgB,CAAC,YAAY,oBAAC,OAAI,IAAI,EAAE,OAAO,aAAa,GAAG;AAAA;AAAA;AACnE;AAGF,IAAM,gBAAgD,CAAC,EAAE,aAAa,MACpE,oBAAC,OAAI,IAAI,EAAE,GAAG,SAAS,IAAI,EAAE,GAC1B,uBAAa,IAAI,CAAC,SAAS,UAC1B;AAAA,EAAC;AAAA;AAAA,IAIC,MAAK;AAAA,IACL,eAAa,oBAAoB,KAAK;AAAA,IACtC,IAAI;AAAA,MACF,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,gBAAgB;AAAA,MAChB,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,YAAY;AAAA,MACZ,OAAO;AAAA,IACT;AAAA,IAEC;AAAA;AAAA,EAbI,WAAW,KAAK;AAcvB,CACD,GACH;AAeK,IAAM,gBAAwC,CAAC;AAAA,EACpD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,YAAY,aAAa,OAAO,OAAO,OAAO,MAAM,MAAM;AAChE,QAAM,QAAQ,eAAe,aAAa,EAAE,OAAO,OAAO,OAAO,MAAM,OAAO,KAAK,CAAC,IAAI;AAExF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAME,qBAAC,OAAI,IAAI,EAAE,UAAU,IAAI,GAAG,eAAa,kBAAkB,UAAU,IACnE;AAAA;AAAA,QAAC;AAAA;AAAA,UACC;AAAA,UACA,cAAc,eAAe;AAAA,UAC7B,UAAU,eAAe,eAAe;AAAA,UACxC;AAAA,UACA;AAAA;AAAA,MACF;AAAA,MAEA,oBAAC,iBAAc,cAA4B;AAAA,MAE3C;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,mBAAiB,SAAS,UAAU;AAAA,UACpC,eAAY;AAAA,UACZ,IAAI;AAAA,UAEH,iBAAO,MAAM,KAAK,EAAE,IAAI,CAAC,QACxB,oBAAC,mBAA8B,KAAW,GAAG,cAAvB,IAAI,GAA+B,CAC1D;AAAA;AAAA,MACH;AAAA,OACF;AAAA;AAEJ;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/layout/Skeleton/Skeleton.styles.ts"],"sourcesContent":["import { alpha } from '@mui/material/styles/index.js';\nimport type { CSSObject, Theme } from '@mui/material/styles/index.js';\n\nimport type { SkeletonProps } from './Skeleton.types';\nimport {\n GLASS_BACKGROUND_ALPHA_FROM,\n GLASS_BACKGROUND_ALPHA_TO,\n GLASS_BLUR_PX,\n GLASS_BORDER_ALPHA,\n GLASS_SHADOW,\n SHIMMER_ALPHA,\n SHIMMER_DURATION_MS,\n SKELETON_DEFAULT_DIMENSIONS,\n SKELETON_INTENSITY_OPACITY,\n} from './Skeleton.metrics';\nimport { modeInk, shadowInk, sheen } from '../../../tokens/ink';\n\ntype SkeletonVariant = NonNullable<SkeletonProps['variant']>;\ntype SkeletonIntensity = NonNullable<SkeletonProps['intensity']>;\n\n/** `wave` is our own name for a rectangle that animates; MUI has no such variant. */\nexport const muiVariantFor = (\n variant: SkeletonVariant,\n): 'circular' | 'rectangular' | 'text' => {\n switch (variant) {\n case 'circular':\n return 'circular';\n case 'rectangular':\n case 'wave':\n return 'rectangular';\n default:\n return 'text';\n }\n};\n\nexport const muiAnimationFor = (\n variant: SkeletonVariant,\n animation: SkeletonProps['animation'],\n) => {\n if (variant === 'wave') return 'wave';\n return animation;\n};\n\n// Derived from the shared metrics, not restated: the native `Skeleton` reads\n// the same table, so the two renderers cannot disagree on a default box.\nexport const defaultDimensions = (\n variant: SkeletonVariant,\n): { width: number | string; height: number | undefined } =>\n // The `default:` arm the old switch had: an unrecognised variant used to fall\n // back rather than hand `undefined` to a caller that then reads `.width`.\n SKELETON_DEFAULT_DIMENSIONS[variant] ?? SKELETON_DEFAULT_DIMENSIONS.rectangular;\n\nconst intensityOpacity = (intensity: SkeletonIntensity): number =>\n SKELETON_INTENSITY_OPACITY[intensity] ?? SKELETON_INTENSITY_OPACITY.medium;\n\nconst glassmorphismStyles = (theme: Theme): CSSObject => ({\n background: `linear-gradient(135deg,\n ${alpha(theme.palette.background.paper, GLASS_BACKGROUND_ALPHA_FROM)} 0%,\n ${alpha(theme.palette.background.paper, GLASS_BACKGROUND_ALPHA_TO)} 100%)`,\n backdropFilter: `blur(${GLASS_BLUR_PX}px)`,\n border: `1px solid ${alpha(theme.palette.divider, GLASS_BORDER_ALPHA)}`,\n boxShadow: `0 ${GLASS_SHADOW.offsetY}px ${GLASS_SHADOW.blur}px 0 ${shadowInk(theme, GLASS_SHADOW.alpha)}`,\n});\n\n// The sweep is a pseudo-element sliding across the box, so the box has to clip it\n// and establish a positioning context — hence `position`/`overflow` below.\nconst shimmerStyles = (theme: Theme): CSSObject => ({\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n right: 0,\n bottom: 0,\n left: 0,\n background: `linear-gradient(\n 90deg,\n transparent,\n ${sheen(theme, SHIMMER_ALPHA)},\n transparent\n )`,\n transform: 'translateX(-100%)',\n animation: `shimmer ${SHIMMER_DURATION_MS / 1000}s infinite`,\n },\n '@keyframes shimmer': {\n '100%': {\n transform: 'translateX(100%)',\n },\n },\n});\n\ninterface SkeletonStyleArgs {\n intensity: SkeletonIntensity;\n borderRadius?: number | string;\n glassmorphism: boolean;\n shimmer: boolean;\n style?: React.CSSProperties;\n}\n\nexport const skeletonStyles = (\n theme: Theme,\n { intensity, borderRadius, glassmorphism, shimmer, style }: SkeletonStyleArgs,\n): CSSObject => ({\n borderRadius,\n backgroundColor: alpha(\n theme.palette.mode === 'dark' ? modeInk(theme) : theme.palette.text.primary,\n intensityOpacity(intensity),\n ),\n ...(shimmer && {\n position: 'relative' as const,\n overflow: 'hidden' as const,\n }),\n ...(glassmorphism ? glassmorphismStyles(theme) : {}),\n ...(shimmer ? shimmerStyles(theme) : {}),\n ...style,\n});\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA,SAAS,aAAa;AAqBf,IAAM,gBAAgB,CAC3B,YACwC;AACxC,UAAQ,SAAS;AAAA,IACf,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEO,IAAM,kBAAkB,CAC7B,SACA,cACG;AACH,MAAI,YAAY,OAAQ,QAAO;AAC/B,SAAO;AACT;AAIO,IAAM,oBAAoB,CAC/B;AAAA;AAAA;AAAA,EAIA,4BAA4B,OAAO,KAAK,4BAA4B;AAAA;AAEtE,IAAM,mBAAmB,CAAC,cACxB,2BAA2B,SAAS,KAAK,2BAA2B;AAEtE,IAAM,sBAAsB,CAAC,WAA6B;AAAA,EACxD,YAAY;AAAA,UACJ,MAAM,MAAM,QAAQ,WAAW,OAAO,2BAA2B,CAAC;AAAA,UAClE,MAAM,MAAM,QAAQ,WAAW,OAAO,yBAAyB,CAAC;AAAA,EACxE,gBAAgB,QAAQ,aAAa;AAAA,EACrC,QAAQ,aAAa,MAAM,MAAM,QAAQ,SAAS,kBAAkB,CAAC;AAAA,EACrE,WAAW,KAAK,aAAa,OAAO,MAAM,aAAa,IAAI,QAAQ,UAAU,OAAO,aAAa,KAAK,CAAC;AACzG;AAIA,IAAM,gBAAgB,CAAC,WAA6B;AAAA,EAClD,YAAY;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,IACV,KAAK;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,YAAY;AAAA;AAAA;AAAA,YAGJ,MAAM,OAAO,aAAa,CAAC;AAAA;AAAA;AAAA,IAGnC,WAAW;AAAA,IACX,WAAW,WAAW,sBAAsB,GAAI;AAAA,EAClD;AAAA,EACA,sBAAsB;AAAA,IACpB,QAAQ;AAAA,MACN,WAAW;AAAA,IACb;AAAA,EACF;AACF;AAUO,IAAM,iBAAiB,CAC5B,OACA,EAAE,WAAW,cAAc,eAAe,SAAS,MAAM,OAC1C;AAAA,EACf;AAAA,EACA,iBAAiB;AAAA,IACf,MAAM,QAAQ,SAAS,SAAS,QAAQ,KAAK,IAAI,MAAM,QAAQ,KAAK;AAAA,IACpE,iBAAiB,SAAS;AAAA,EAC5B;AAAA,EACA,GAAI,WAAW;AAAA,IACb,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAAA,EACA,GAAI,gBAAgB,oBAAoB,KAAK,IAAI,CAAC;AAAA,EAClD,GAAI,UAAU,cAAc,KAAK,IAAI,CAAC;AAAA,EACtC,GAAG;AACL;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/layout/Separator/Separator.tsx"],"sourcesContent":["import Box from '@mui/material/Box/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport { useTheme } from '@mui/material/styles/index.js';\nimport React from 'react';\n\nimport { separatorBlockMargin, separatorStyles } from './Separator.styles';\nimport type { SeparatorProps } from './Separator.types';\n\nexport const Separator: React.FC<SeparatorProps> = ({\n variant = 'solid',\n orientation = 'horizontal',\n size = 'md',\n color,\n margin,\n length,\n children,\n className,\n 'data-testid': dataTestId,\n}) => {\n const theme = useTheme();\n const styles = separatorStyles(theme, { variant, orientation, size, color, margin, length });\n\n if (children) {\n const isHorizontal = orientation === 'horizontal';\n // The rules either side of the label sit INSIDE the row, which carries the\n // margin; their own would add it a second time.\n const ruleStyles = { ...styles, margin: 0 };\n\n return (\n <Box\n className={className}\n // The plain branch below has always carried the caller's hook; this one\n // silently dropped it, so a LABELLED separator was the one variant no\n // test could address except through its own words.\n data-testid={dataTestId}\n sx={{\n display: 'flex',\n alignItems: 'center',\n margin: separatorBlockMargin(size, margin, isHorizontal),\n flexDirection: isHorizontal ? 'row' : 'column',\n gap: theme.spacing(2),\n }}\n >\n <Box sx={ruleStyles} />\n {/*\n No background behind the label. The two rules and the words are a FLEX\n ROW — the rules stop where the label starts — so there is nothing for a\n background to mask, and painting one made the label a coloured pill on\n every surface that is not `background.default`. On a white card it read\n as a highlight nobody had asked for.\n */}\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n sx={{ flexShrink: 0, padding: theme.spacing(0, 1) }}\n >\n {children}\n </Typography>\n <Box sx={ruleStyles} />\n </Box>\n );\n }\n\n return (\n <Box\n className={className}\n sx={styles}\n role=\"separator\"\n aria-orientation={orientation}\n data-testid={dataTestId}\n />\n );\n};\n"],"mappings":";;;;;;AAAA,OAAO,SAAS;AAChB,OAAO,gBAAgB;AACvB,SAAS,gBAAgB;AA2BnB,SAcE,KAdF;AArBC,IAAM,YAAsC,CAAC;AAAA,EAClD,UAAU;AAAA,EACV,cAAc;AAAA,EACd,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,eAAe;AACjB,MAAM;AACJ,QAAM,QAAQ,SAAS;AACvB,QAAM,SAAS,gBAAgB,OAAO,EAAE,SAAS,aAAa,MAAM,OAAO,QAAQ,OAAO,CAAC;AAE3F,MAAI,UAAU;AACZ,UAAM,eAAe,gBAAgB;AAGrC,UAAM,aAAa,EAAE,GAAG,QAAQ,QAAQ,EAAE;AAE1C,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QAIA,eAAa;AAAA,QACb,IAAI;AAAA,UACF,SAAS;AAAA,UACT,YAAY;AAAA,UACZ,QAAQ,qBAAqB,MAAM,QAAQ,YAAY;AAAA,UACvD,eAAe,eAAe,QAAQ;AAAA,UACtC,KAAK,MAAM,QAAQ,CAAC;AAAA,QACtB;AAAA,QAEA;AAAA,8BAAC,OAAI,IAAI,YAAY;AAAA,UAQrB;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,OAAM;AAAA,cACN,IAAI,EAAE,YAAY,GAAG,SAAS,MAAM,QAAQ,GAAG,CAAC,EAAE;AAAA,cAEjD;AAAA;AAAA,UACH;AAAA,UACA,oBAAC,OAAI,IAAI,YAAY;AAAA;AAAA;AAAA,IACvB;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,IAAI;AAAA,MACJ,MAAK;AAAA,MACL,oBAAkB;AAAA,MAClB,eAAa;AAAA;AAAA,EACf;AAEJ;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/social-login-button/social-login-button.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from 'react';\nimport Box from '@mui/material/Box/index.js';\nimport Stack from '@mui/material/Stack/index.js';\nimport { useTheme, type Theme } from '@mui/material/styles/index.js';\nimport { Button } from '../components/form/Button';\nimport { Card, CardContent } from '../components/layout/Card';\nimport { Heading } from '../components/typography/Heading';\nimport { Text } from '../components/typography/Text';\nimport { Separator } from '../components/layout/Separator';\nimport type { SocialLoginCopy } from '../copy/form';\nimport { EN_US_SOCIAL_LOGIN_COPY } from '../en-US.form';\nimport { uiInk, type UiInk } from '../tokens/ink';\n\nexport type SocialProvider = 'google' | 'facebook' | 'apple';\n\n/**\n * SVG Icons for social providers\n */\nconst GoogleIcon = (): React.ReactElement => {\n const logo = uiInk(useTheme()).socialBrand.googleLogo;\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M22.56 12.25c0-.78-.07-1.53-.2-2.25H12v4.26h5.92c-.26 1.37-1.04 2.53-2.21 3.31v2.77h3.57c2.08-1.92 3.28-4.74 3.28-8.09z\"\n fill={logo.blue}\n />\n <path\n d=\"M12 23c2.97 0 5.46-.98 7.28-2.66l-3.57-2.77c-.98.66-2.23 1.06-3.71 1.06-2.86 0-5.29-1.93-6.16-4.53H2.18v2.84C3.99 20.53 7.7 23 12 23z\"\n fill={logo.green}\n />\n <path\n d=\"M5.84 14.09c-.22-.66-.35-1.36-.35-2.09s.13-1.43.35-2.09V7.07H2.18C1.43 8.55 1 10.22 1 12s.43 3.45 1.18 4.93l2.85-2.22.81-.62z\"\n fill={logo.yellow}\n />\n <path\n d=\"M12 5.38c1.62 0 3.06.56 4.21 1.64l3.15-3.15C17.45 2.09 14.97 1 12 1 7.7 1 3.99 3.47 2.18 7.07l3.66 2.84c.87-2.6 3.3-4.53 6.16-4.53z\"\n fill={logo.red}\n />\n </svg>\n );\n};\n\nconst FacebookIcon = (): React.ReactElement => {\n const { logo } = uiInk(useTheme()).socialBrand.facebook;\n return (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M24 12c0-6.627-5.373-12-12-12S0 5.373 0 12c0 5.99 4.388 10.954 10.125 11.854V15.47H7.078V12h3.047V9.356c0-3.007 1.792-4.668 4.533-4.668 1.312 0 2.686.234 2.686.234v2.953H15.83c-1.491 0-1.956.925-1.956 1.874V12h3.328l-.532 3.469h-2.796v8.385C19.612 22.954 24 17.99 24 12z\"\n fill={logo}\n />\n </svg>\n );\n};\n\nconst AppleIcon = (): React.ReactElement => (\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"currentColor\" xmlns=\"http://www.w3.org/2000/svg\">\n <path d=\"M17.05 20.28c-.98.95-2.05.8-3.08.35-1.09-.46-2.09-.48-3.24 0-1.44.62-2.2.44-3.06-.35C2.79 15.25 3.51 7.59 9.05 7.31c1.35.07 2.29.74 3.08.8 1.18-.24 2.31-.93 3.57-.84 1.51.12 2.65.72 3.4 1.8-3.12 1.87-2.38 5.98.48 7.13-.57 1.5-1.31 2.99-2.54 4.09l.01-.01zM12.03 7.25c-.15-2.23 1.66-4.07 3.74-4.25.29 2.58-2.34 4.5-3.74 4.25z\" />\n </svg>\n);\n\n/**\n * Google's logo on a disabled button: one flat grey, faded (FUT-2393).\n *\n * The G is drawn in Google's four colours, hard-coded in its SVG, so MUI\n * greying a disabled button's label left a full-colour G beside it. The grey\n * label still said the button could not be pressed; an icon-only button has no\n * label, and read as ready to tap.\n *\n * `brightness(0)` draws the G in one flat colour, as Google's own disabled\n * button does, and the theme's `disabledOpacity` fades it, the step MUI dims a\n * disabled control by. `grayscale` would not do: it turns the four colours four\n * different greys, and the yellow arc all but vanished (1.26:1 against white).\n *\n * Google's alone: Facebook's and Apple's logos are drawn in the button's\n * `currentColor`, so they grey with the label by themselves, and fading them\n * again would all but erase them. Keyed on `.Mui-disabled`, the class MUI greys\n * the label by, so the logo and the label always agree. A loading button\n * carries it too, but its spinner replaces the logo slot.\n */\nconst GOOGLE_LOGO_WHEN_DISABLED_SX = {\n '&.Mui-disabled .MuiButton-startIcon': {\n filter: 'brightness(0)',\n opacity: (theme: Theme) => theme.palette.action.disabledOpacity,\n },\n} as const;\n\n/**\n * Facebook's logo in its button's own colour (FUT-2393).\n *\n * `FacebookIcon` is the blue roundel, drawn in #1877F2 with the \"f\" cut out of\n * it. On the button's own #1877F2 the roundel vanished: a label beside nothing,\n * and an icon-only button an empty blue slab. In `currentColor` it is the white\n * roundel Facebook's own button carries, and a disabled button greys it with\n * the label. Set on the button rather than in `FacebookIcon`, which a host may\n * draw on a white page.\n */\nconst FACEBOOK_LOGO_IN_BUTTON_COLOUR_SX = {\n '& .MuiButton-startIcon path': { fill: 'currentColor' },\n} as const;\n\n/** A provider's own colour, read from the theme's `uiInk.socialBrand` as an `sx` value. */\nconst brand =\n (pick: (colours: UiInk['socialBrand']) => string) =>\n (theme: Theme): string =>\n pick(uiInk(theme).socialBrand);\n\ninterface ProviderConfig {\n Icon: () => React.ReactElement;\n variant: 'solid' | 'outline' | 'ghost';\n color: 'primary' | 'secondary' | 'neutral';\n sx?: object;\n}\n\nconst providerConfig: Record<SocialProvider, ProviderConfig> = {\n google: {\n Icon: GoogleIcon,\n variant: 'outline',\n color: 'neutral',\n sx: {\n backgroundColor: brand((c) => c.google.background),\n color: brand((c) => c.google.text),\n borderColor: brand((c) => c.google.border),\n '&:hover': {\n backgroundColor: brand((c) => c.google.hover),\n borderColor: brand((c) => c.google.hoverBorder),\n },\n ...GOOGLE_LOGO_WHEN_DISABLED_SX,\n },\n },\n facebook: {\n Icon: FacebookIcon,\n variant: 'solid',\n color: 'primary',\n sx: {\n backgroundColor: brand((c) => c.facebook.background),\n color: brand((c) => c.facebook.text),\n '&:hover': {\n backgroundColor: brand((c) => c.facebook.hover),\n },\n ...FACEBOOK_LOGO_IN_BUTTON_COLOUR_SX,\n },\n },\n apple: {\n Icon: AppleIcon,\n variant: 'solid',\n color: 'neutral',\n sx: {\n backgroundColor: brand((c) => c.apple.background),\n color: brand((c) => c.apple.text),\n '&:hover': {\n backgroundColor: brand((c) => c.apple.hover),\n },\n },\n },\n};\n\nexport interface SocialLoginButtonProps {\n provider: SocialProvider;\n onClick?: () => void;\n loading?: boolean;\n disabled?: boolean;\n fullWidth?: boolean;\n /**\n * The three provider labels (FUT-1263). `SOCIAL_LOGIN_COPY` ships both\n * languages, so a host passes `SOCIAL_LOGIN_COPY[\"pt-BR\"]` rather than\n * authoring a word.\n *\n * These used to be English string literals inside `providerConfig`, reachable\n * by nothing: a pt-BR storefront rendered \"Continue with Google\" on an\n * otherwise Portuguese sign-in screen and had no way to change it.\n *\n * OPTIONAL, unlike every other `copy` in this package, and defaulted to the\n * en-US pack. That is a deliberate exception so this ships as a MINOR: making\n * it required would break every existing caller on a routine update. The cost\n * is the one this package's convention exists to avoid — a host that says\n * nothing still renders English — so a consumer wanting Portuguese must pass\n * the pack, and FUT-1263 is not closed until it does.\n */\n copy?: SocialLoginCopy;\n /**\n * Per-provider test hook. Without one all three buttons render the same\n * `data-testid`, leaving their visible text as the only selector — which is\n * exactly the text a host is now expected to translate.\n */\n dataTestId?: string;\n /**\n * The provider's logo alone, centred (FUT-2393).\n *\n * For a row of providers in a narrow block, where \"Continuar com o Google\"\n * wraps to two lines at 320px and two providers cannot share a line. The\n * label is not dropped: it stays the button's accessible name, so a screen\n * reader still announces the provider, and its `title`, so a pointer\n * hovering the logo reads it too.\n */\n iconOnly?: boolean;\n}\n\n/**\n * What an icon-only social button changes: the logo centred, with no gap\n * reserved for a label and no margin MUI keeps beside a start icon.\n */\nconst ICON_ONLY_SX = {\n justifyContent: 'center',\n gap: 0,\n '& .MuiButton-startIcon': { margin: 0 },\n} as const;\n\n/**\n * Social login button using UI package Button component\n */\nexport const SocialLoginButton = React.forwardRef<HTMLButtonElement, SocialLoginButtonProps>(\n (\n {\n provider,\n onClick,\n loading = false,\n disabled = false,\n fullWidth = true,\n copy = EN_US_SOCIAL_LOGIN_COPY,\n dataTestId,\n iconOnly = false,\n },\n ref,\n ) => {\n const config = providerConfig[provider];\n const label = copy[provider];\n\n return (\n <Button\n ref={ref}\n variant={config.variant}\n color={config.color}\n size=\"lg\"\n loading={loading}\n disabled={disabled}\n onClick={onClick}\n icon={<config.Icon />}\n dataTestId={dataTestId}\n fullWidth={fullWidth}\n {...(iconOnly ? { 'aria-label': label, title: label } : {})}\n sx={{\n minHeight: 48,\n justifyContent: 'flex-start',\n gap: 2,\n ...(iconOnly ? ICON_ONLY_SX : {}),\n ...config.sx,\n }}\n >\n {iconOnly ? undefined : label}\n </Button>\n );\n }\n);\n\nSocialLoginButton.displayName = 'SocialLoginButton';\n\n/**\n * Container for social login buttons with optional divider\n */\nexport interface SocialLoginContainerProps {\n children: React.ReactNode;\n title?: string;\n subtitle?: string;\n showDivider?: boolean;\n dividerText?: string;\n /**\n * How wide the card is allowed to get. Defaults to the 400 it has always\n * intended, so nothing that does not ask for a width moves.\n *\n * Worth passing for a card holding a FORM rather than a row of provider\n * buttons: 400 was chosen for the latter, and an e-mail + password pair reads\n * cramped in it.\n */\n maxWidth?: number | string;\n}\n\nexport function SocialLoginContainer({\n children,\n title = \"Sign in to continue\",\n subtitle,\n showDivider = false,\n dividerText = \"or\",\n maxWidth = 400,\n}: SocialLoginContainerProps): React.ReactElement {\n return (\n // `width: 100%` is what makes the cap below mean anything. Every caller\n // centres this card in a flex column (`Container variant=\"centered\"` does),\n // and a flex item under `align-items: center` sizes to its CONTENT — so the\n // card sat at whatever the longest label happened to need, ~267px, at every\n // viewport from 390 to 1280. The 400 was never reached, which is why raising\n // it would have changed nothing; the card had no width to cap.\n <Card variant=\"elevated\" borderRadius=\"lg\" sx={{ width: '100%', maxWidth }}>\n <CardContent>\n <Stack spacing={3} sx={{ width: '100%' }}>\n {title && (\n <Box sx={{ textAlign: 'center' }}>\n <Heading level=\"h2\">\n {title}\n </Heading>\n {subtitle && (\n <Text color=\"secondary\" size=\"sm\">\n {subtitle}\n </Text>\n )}\n </Box>\n )}\n\n <Stack spacing={2}>\n {children}\n </Stack>\n\n {showDivider && (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 2 }}>\n <Separator />\n <Text color=\"secondary\" size=\"sm\">\n {dividerText}\n </Text>\n <Separator />\n </Box>\n )}\n </Stack>\n </CardContent>\n </Card>\n );\n}\n\nexport { GoogleIcon, FacebookIcon, AppleIcon };\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/layout/ScrollArea/ScrollArea.tsx"],"sourcesContent":["import KeyboardArrowUp from '@mui/icons-material/KeyboardArrowUp';\nimport Box from '@mui/material/Box/index.js';\nimport CircularProgress from '@mui/material/CircularProgress/index.js';\nimport Fab from '@mui/material/Fab/index.js';\nimport Zoom from '@mui/material/Zoom/index.js';\nimport { alpha, useTheme } from '@mui/material/styles/index.js';\nimport type { FC } from 'react';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\n\nimport type { ResolvedScrollAreaProps } from './ScrollArea.helpers';\nimport { resolveScrollAreaProps } from './ScrollArea.helpers';\nimport type { ScrollAreaProps } from './ScrollArea.types';\nimport { ScrollAreaContent } from './ScrollAreaContent';\nimport { ScrollViewport } from './ScrollViewport';\n\n// Owns the scroll container ref (merging in any ref the caller passed) and\n// reports size changes through a ResizeObserver.\nconst useObservedScrollRef = ({\n externalScrollRef,\n onResize }: {\n externalScrollRef?: React.Ref<HTMLDivElement>;\n onResize?: ScrollAreaProps['onResize'];\n}) => {\n const internalScrollRef = useRef<HTMLDivElement>(null);\n const [containerDimensions, setContainerDimensions] = useState({ width: 0, height: 0 });\n\n // Track container dimensions with ResizeObserver\n useEffect(() => {\n if (!internalScrollRef.current) return;\n\n const resizeObserver = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (entry) {\n const { width, height } = entry.contentRect;\n setContainerDimensions({ width, height });\n onResize?.({ width, height });\n }\n });\n\n resizeObserver.observe(internalScrollRef.current);\n return () => resizeObserver.disconnect();\n }, [onResize]);\n\n // Callback ref that updates both internal and external refs\n const setScrollRef = useCallback(\n (node: HTMLDivElement | null) => {\n // Update internal ref\n (internalScrollRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n // Update external ref if provided\n if (externalScrollRef) {\n (externalScrollRef as React.MutableRefObject<HTMLDivElement | null>).current = node;\n }\n },\n [externalScrollRef],\n );\n\n // Use internal ref for accessing the element\n\n return { scrollRef: internalScrollRef, setScrollRef, containerDimensions };\n};\n\n// Scroll position, the transient \"is scrolling\" flag that drives auto-hide, the\n// observed container size, and the scroll-to-top affordance.\n// The scrollbar shows while scrolling and hides once movement stops.\nconst useAutoHide = ({\n autoHide,\n alwaysShowScrollbar,\n autoHideDelay }: {\n autoHide: boolean;\n alwaysShowScrollbar: boolean;\n autoHideDelay: number;\n}) => {\n const [isScrolling, setIsScrolling] = useState(false);\n const timeoutRef = useRef<number | undefined>(undefined);\n\n const noteScroll = useCallback(() => {\n if (!autoHide || alwaysShowScrollbar) return;\n\n setIsScrolling(true);\n window.clearTimeout(timeoutRef.current);\n timeoutRef.current = window.setTimeout(() => setIsScrolling(false), autoHideDelay);\n }, [autoHide, alwaysShowScrollbar, autoHideDelay]);\n\n useEffect(() => () => window.clearTimeout(timeoutRef.current), []);\n\n return { isScrolling, noteScroll };\n};\n\nconst useScrollArea = (\n props: ResolvedScrollAreaProps & { externalScrollRef?: React.Ref<HTMLDivElement> },\n) => {\n const {\n disabled,\n onScroll,\n onResize,\n externalScrollRef,\n autoHide,\n autoHideDelay,\n alwaysShowScrollbar,\n scrollToTopButton,\n scrollToTopThreshold,\n smoothScroll } = props;\n\n const { scrollRef, setScrollRef, containerDimensions } = useObservedScrollRef({\n externalScrollRef,\n onResize });\n const [showScrollToTop, setShowScrollToTop] = useState(false);\n const { isScrolling, noteScroll } = useAutoHide({\n autoHide,\n alwaysShowScrollbar,\n autoHideDelay });\n\n const handleScroll = useCallback(\n (event: React.UIEvent<HTMLDivElement>) => {\n if (disabled) return;\n\n noteScroll();\n\n if (scrollToTopButton && scrollRef.current) {\n setShowScrollToTop(scrollRef.current.scrollTop > scrollToTopThreshold);\n }\n\n onScroll?.(event);\n },\n [disabled, noteScroll, scrollToTopButton, scrollToTopThreshold, onScroll, scrollRef],\n );\n\n const scrollToTop = useCallback(() => {\n scrollRef.current?.scrollTo({ top: 0, behavior: smoothScroll ? 'smooth' : 'auto' });\n }, [smoothScroll, scrollRef]);\n\n return {\n scrollRef,\n setScrollRef,\n isScrolling,\n showScrollToTop,\n containerDimensions,\n handleScroll,\n scrollToTop };\n};\n\nconst LoadingOverlay: FC = () => (\n <Box\n sx={{\n position: 'absolute',\n top: '50%',\n left: '50%',\n transform: 'translate(-50%, -50%)',\n zIndex: 10 }}\n >\n <CircularProgress />\n </Box>\n);\n\n// The label is guarded at the call site rather than defaulted: the props union\n// already makes it required alongside `scrollToTopButton`, and a fab with an\n// empty accessible name is the exact failure this port exists to remove.\nconst ScrollToTopFab: FC<{\n visible: boolean;\n glass: boolean;\n scrollToTopLabel: string;\n onClick: () => void;\n}> = ({\n visible,\n glass,\n scrollToTopLabel,\n onClick }) => {\n const theme = useTheme();\n\n return (\n <Zoom in={visible}>\n <Fab\n size=\"small\"\n aria-label={scrollToTopLabel}\n onClick={onClick}\n sx={{\n position: 'absolute',\n bottom: 16,\n right: 16,\n zIndex: 1,\n backgroundColor: glass\n ? alpha(theme.palette.primary.main, 0.2)\n : theme.palette.primary.main,\n backdropFilter: glass ? 'blur(10px)' : 'none',\n '&:hover': {\n backgroundColor: glass\n ? alpha(theme.palette.primary.main, 0.3)\n : theme.palette.primary.dark } }}\n >\n <KeyboardArrowUp />\n </Fab>\n </Zoom>\n );\n};\n\nexport const ScrollArea: React.FC<ScrollAreaProps> = (componentProps) => {\n const resolved = resolveScrollAreaProps(componentProps);\n const {\n regionLabel,\n scrollToTopLabel,\n children,\n width,\n height,\n maxHeight,\n maxWidth,\n orientation: _orientation,\n scrollbarSize: _scrollbarSize,\n autoHide,\n autoHideDelay: _autoHideDelay,\n smoothScroll: _smoothScroll,\n variant,\n onScroll: _onScroll,\n scrollToTopButton,\n scrollToTopThreshold: _scrollToTopThreshold,\n scrollbarColor: _scrollbarColor,\n scrollbarTrackColor: _scrollbarTrackColor,\n contentPadding: _contentPadding,\n alwaysShowScrollbar,\n disabled,\n loading,\n emptyContent,\n testId,\n scrollRef: externalScrollRef,\n onResize: _onResize,\n sx,\n ...props\n } = resolved;\n\n const {\n scrollRef,\n setScrollRef,\n isScrolling,\n showScrollToTop,\n containerDimensions,\n handleScroll,\n scrollToTop } = useScrollArea({ ...resolved, externalScrollRef });\n\n // Auto-hide keeps the scrollbar out of the way until the user is scrolling.\n const shouldShowScrollbar = alwaysShowScrollbar || !autoHide || isScrolling;\n\n return (\n <Box\n data-testid={testId}\n sx={{ position: 'relative', width, height, maxHeight, maxWidth, ...sx }}\n {...props}\n >\n <ScrollViewport\n {...resolved}\n regionLabel={regionLabel}\n shouldShowScrollbar={shouldShowScrollbar}\n setScrollRef={setScrollRef}\n onScroll={handleScroll}\n >\n <ScrollAreaContent\n emptyContent={emptyContent}\n scrollRef={scrollRef}\n containerWidth={containerDimensions.width}\n >\n {children}\n </ScrollAreaContent>\n </ScrollViewport>\n\n {loading && <LoadingOverlay />}\n\n {scrollToTopButton && scrollToTopLabel && !disabled && !loading && (\n <ScrollToTopFab\n scrollToTopLabel={scrollToTopLabel}\n visible={showScrollToTop}\n glass={variant === 'glass'}\n onClick={scrollToTop}\n />\n )}\n </Box>\n );\n};\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/utility/InfiniteScroll/InfiniteScroll.hooks.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\n\nimport type { InfiniteScrollProps } from './InfiniteScroll.types';\n\ntype ScrollableTarget = InfiniteScrollProps['scrollableTarget'];\n\n/** A string target is looked up by id first, then as a selector. */\nconst resolveScrollable = (scrollableTarget: ScrollableTarget): Element | null => {\n if (!scrollableTarget) return null;\n\n if (typeof scrollableTarget === 'string') {\n return (\n document.getElementById(scrollableTarget) || document.querySelector(scrollableTarget)\n );\n }\n\n return scrollableTarget;\n};\n\ninterface ObserverArgs {\n testMode: boolean;\n threshold: number;\n scrollableTarget: ScrollableTarget;\n}\n\n/**\n * Watches a zero-size sentinel at the end of the list. `rootMargin` is what makes\n * it fire before the sentinel is actually on screen, so the next page is already\n * loading by the time the user reaches the bottom.\n */\nexport const useSentinel = ({ testMode, threshold, scrollableTarget }: ObserverArgs) => {\n const sentinelRef = useRef<HTMLDivElement>(null);\n const [isIntersecting, setIsIntersecting] = useState(false);\n\n useEffect(() => {\n if (testMode || !sentinelRef.current) return;\n\n const observer = new window.IntersectionObserver(\n ([entry]) => {\n if (entry) {\n setIsIntersecting(entry.isIntersecting);\n }\n },\n {\n root: resolveScrollable(scrollableTarget) || undefined,\n rootMargin: `${threshold}px`,\n threshold: 0,\n },\n );\n\n observer.observe(sentinelRef.current);\n\n return () => observer.disconnect();\n }, [testMode, threshold, scrollableTarget]);\n\n return { sentinelRef, isIntersecting };\n};\n\ntype LoadArgs = Pick<\n InfiniteScrollProps,\n 'hasMore' | 'loading' | 'error' | 'loadMore' | 'onError' | 'testTriggerRef'\n> & {\n isIntersecting: boolean;\n testMode: boolean;\n};\n\n/**\n * A ref rather than state guards re-entry, so a second intersection landing while\n * the first `loadMore` is still in flight is dropped rather than queued.\n */\nexport const useLoadMore = ({\n hasMore,\n loading,\n error,\n loadMore,\n onError,\n isIntersecting,\n testMode,\n testTriggerRef,\n}: LoadArgs) => {\n const loadingRef = useRef(false);\n\n const handleLoadMore = useCallback(async () => {\n if (loadingRef.current || !hasMore || error) {\n return;\n }\n\n loadingRef.current = true;\n\n try {\n await loadMore();\n } catch (err) {\n const errorObj = err instanceof Error ? err : new Error('Unknown error');\n onError?.(errorObj);\n } finally {\n loadingRef.current = false;\n }\n }, [hasMore, error, loadMore, onError]);\n\n // Expose test trigger for test mode\n useEffect(() => {\n if (testMode && testTriggerRef) {\n testTriggerRef.current = handleLoadMore;\n }\n\n return () => {\n if (testMode && testTriggerRef) {\n testTriggerRef.current = undefined;\n }\n };\n }, [testMode, testTriggerRef, handleLoadMore]);\n\n useEffect(() => {\n if (isIntersecting && hasMore && !loading && !error) {\n handleLoadMore();\n }\n }, [isIntersecting, hasMore, loading, error, handleLoadMore]);\n};\n"],"mappings":";AAAA,SAAS,aAAa,WAAW,QAAQ,gBAAgB;AAOzD,IAAM,oBAAoB,CAAC,qBAAuD;AAChF,MAAI,CAAC,iBAAkB,QAAO;AAE9B,MAAI,OAAO,qBAAqB,UAAU;AACxC,WACE,SAAS,eAAe,gBAAgB,KAAK,SAAS,cAAc,gBAAgB;AAAA,EAExF;AAEA,SAAO;AACT;AAaO,IAAM,cAAc,CAAC,EAAE,UAAU,WAAW,iBAAiB,MAAoB;AACtF,QAAM,cAAc,OAAuB,IAAI;AAC/C,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAS,KAAK;AAE1D,YAAU,MAAM;AACd,QAAI,YAAY,CAAC,YAAY,QAAS;AAEtC,UAAM,WAAW,IAAI,OAAO;AAAA,MAC1B,CAAC,CAAC,KAAK,MAAM;AACX,YAAI,OAAO;AACT,4BAAkB,MAAM,cAAc;AAAA,QACxC;AAAA,MACF;AAAA,MACA;AAAA,QACE,MAAM,kBAAkB,gBAAgB,KAAK;AAAA,QAC7C,YAAY,GAAG,SAAS;AAAA,QACxB,WAAW;AAAA,MACb;AAAA,IACF;AAEA,aAAS,QAAQ,YAAY,OAAO;AAEpC,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,UAAU,WAAW,gBAAgB,CAAC;AAE1C,SAAO,EAAE,aAAa,eAAe;AACvC;AAcO,IAAM,cAAc,CAAC;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAgB;AACd,QAAM,aAAa,OAAO,KAAK;AAE/B,QAAM,iBAAiB,YAAY,YAAY;AAC7C,QAAI,WAAW,WAAW,CAAC,WAAW,OAAO;AAC3C;AAAA,IACF;AAEA,eAAW,UAAU;AAErB,QAAI;AACF,YAAM,SAAS;AAAA,IACjB,SAAS,KAAK;AACZ,YAAM,WAAW,eAAe,QAAQ,MAAM,IAAI,MAAM,eAAe;AACvE,gBAAU,QAAQ;AAAA,IACpB,UAAE;AACA,iBAAW,UAAU;AAAA,IACvB;AAAA,EACF,GAAG,CAAC,SAAS,OAAO,UAAU,OAAO,CAAC;AAGtC,YAAU,MAAM;AACd,QAAI,YAAY,gBAAgB;AAC9B,qBAAe,UAAU;AAAA,IAC3B;AAEA,WAAO,MAAM;AACX,UAAI,YAAY,gBAAgB;AAC9B,uBAAe,UAAU;AAAA,MAC3B;AAAA,IACF;AAAA,EACF,GAAG,CAAC,UAAU,gBAAgB,cAAc,CAAC;AAE7C,YAAU,MAAM;AACd,QAAI,kBAAkB,WAAW,CAAC,WAAW,CAAC,OAAO;AACnD,qBAAe;AAAA,IACjB;AAAA,EACF,GAAG,CAAC,gBAAgB,SAAS,SAAS,OAAO,cAAc,CAAC;AAC9D;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/layout/Dashboard/DashboardParts.tsx"],"sourcesContent":["'use client';\n\nimport CloseIcon from '@mui/icons-material/Close';\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore';\nimport ExportIcon from '@mui/icons-material/FileDownloadOutlined';\nimport FilterIcon from '@mui/icons-material/FilterListRounded';\nimport InfoIcon from '@mui/icons-material/InfoOutlined';\nimport SettingsIcon from '@mui/icons-material/SettingsOutlined';\nimport Badge from '@mui/material/Badge/index.js';\nimport Box from '@mui/material/Box/index.js';\nimport Dialog from '@mui/material/Dialog/index.js';\nimport DialogContent from '@mui/material/DialogContent/index.js';\nimport DialogTitle from '@mui/material/DialogTitle/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 Popover from '@mui/material/Popover/index.js';\nimport Tooltip from '@mui/material/Tooltip/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport React, { useState } from 'react';\n\nimport { HeaderActions } from '../../form/HeaderActions';\nimport { HeaderButton } from '../../form/HeaderButton';\nimport { useDashboardContext } from './DashboardContext';\nimport type {\n DashboardActionProps,\n DashboardActionsProps,\n DashboardExportFormat,\n DashboardExportProps,\n DashboardFilterToggleProps,\n DashboardInfoProps,\n DashboardSettingsProps,\n} from './Dashboard.types';\nimport { sxRem } from '../../../tokens/relative';\n\n/** Flexible spacer — everything composed after it is pushed to the right. */\nexport const DashboardSpacer = (): React.JSX.Element => <Box sx={{ flex: 1 }} aria-hidden />;\nDashboardSpacer.displayName = 'Dashboard.Spacer';\n\nexport const DashboardInfo = ({\n title = 'About this page',\n children,\n ariaLabel = 'Page information',\n}: DashboardInfoProps): React.JSX.Element => {\n const { testIdPrefix } = useDashboardContext();\n const [anchorEl, setAnchorEl] = useState<HTMLButtonElement | null>(null);\n const open = Boolean(anchorEl);\n return (\n <>\n <Tooltip title={ariaLabel}>\n <IconButton\n size=\"small\"\n aria-label={ariaLabel}\n aria-haspopup=\"dialog\"\n onClick={(e) => setAnchorEl(e.currentTarget)}\n data-testid={`${testIdPrefix}-info-trigger`}\n sx={{ color: 'text.secondary' }}\n >\n <InfoIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n <Popover\n open={open}\n anchorEl={anchorEl}\n onClose={() => setAnchorEl(null)}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n slotProps={{ paper: { sx: { width: 360, maxWidth: '90vw' } } }}\n data-testid={`${testIdPrefix}-info-popover`}\n >\n <Box sx={{ px: 2, py: 1.5, borderBottom: 1, borderColor: 'divider', display: 'flex', gap: 1, alignItems: 'center' }}>\n <InfoIcon fontSize=\"small\" sx={{ color: 'text.secondary' }} />\n <Typography sx={{ fontWeight: 600 }}>{title}</Typography>\n </Box>\n <Box sx={{ px: 2, py: 1.5, fontSize: sxRem(14), color: 'text.secondary' }}>{children}</Box>\n </Popover>\n </>\n );\n};\nDashboardInfo.displayName = 'Dashboard.Info';\n\nexport const DashboardFilterToggle = ({ ariaLabel }: DashboardFilterToggleProps): React.JSX.Element => {\n const { filtersVisible, toggleFilters, activeFilterCount, testIdPrefix } = useDashboardContext();\n const label = ariaLabel ?? (filtersVisible ? 'Hide filters' : 'Show filters');\n return (\n <Tooltip title={label}>\n <IconButton\n size=\"small\"\n aria-label={label}\n aria-pressed={filtersVisible}\n onClick={toggleFilters}\n data-testid={`${testIdPrefix}-filter-toggle`}\n sx={{ color: filtersVisible ? 'primary.main' : 'text.secondary', bgcolor: filtersVisible ? 'action.selected' : 'transparent' }}\n >\n <Badge badgeContent={activeFilterCount} color=\"primary\" overlap=\"circular\">\n <FilterIcon fontSize=\"small\" />\n </Badge>\n </IconButton>\n </Tooltip>\n );\n};\nDashboardFilterToggle.displayName = 'Dashboard.FilterToggle';\n\nexport const DashboardSettings = ({\n title = 'Settings',\n closeLabel,\n children,\n ariaLabel = 'Settings',\n href,\n linkComponent,\n}: DashboardSettingsProps): React.JSX.Element => {\n const { testIdPrefix } = useDashboardContext();\n const [open, setOpen] = useState(false);\n\n // Link mode: the gear navigates to a settings route (e.g. the page's\n // Configuração section) instead of opening an in-page dialog.\n if (href) {\n const LinkComponent = linkComponent ?? 'a';\n return (\n <Tooltip title={ariaLabel}>\n <IconButton\n size=\"small\"\n aria-label={ariaLabel}\n component={LinkComponent}\n href={href}\n data-testid={`${testIdPrefix}-settings-trigger`}\n sx={{ color: 'text.secondary' }}\n >\n <SettingsIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n );\n }\n\n return (\n <>\n <Tooltip title={ariaLabel}>\n <IconButton\n size=\"small\"\n aria-label={ariaLabel}\n aria-haspopup=\"dialog\"\n onClick={() => setOpen(true)}\n data-testid={`${testIdPrefix}-settings-trigger`}\n sx={{ color: 'text.secondary' }}\n >\n <SettingsIcon fontSize=\"small\" />\n </IconButton>\n </Tooltip>\n <Dialog open={open} onClose={() => setOpen(false)} maxWidth=\"sm\" fullWidth data-testid={`${testIdPrefix}-settings-dialog`}>\n <DialogTitle sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>\n {title}\n <IconButton aria-label={closeLabel} size=\"small\" onClick={() => setOpen(false)}>\n <CloseIcon fontSize=\"small\" />\n </IconButton>\n </DialogTitle>\n <DialogContent dividers>{children}</DialogContent>\n </Dialog>\n </>\n );\n};\nDashboardSettings.displayName = 'Dashboard.Settings';\n\nconst DEFAULT_EXPORT_FORMATS: DashboardExportFormat[] = [\n { id: 'csv', label: 'CSV (.csv)' },\n { id: 'xlsx', label: 'Excel (.xlsx)' },\n { id: 'json', label: 'JSON (.json)' },\n];\n\nexport const DashboardExport = ({\n formats = DEFAULT_EXPORT_FORMATS,\n onExport,\n label = 'Export',\n}: DashboardExportProps): React.JSX.Element => {\n const { testIdPrefix } = useDashboardContext();\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const open = Boolean(anchorEl);\n return (\n <>\n <HeaderButton\n variant=\"outlined\"\n color=\"inherit\"\n text={label}\n icon={<ExportIcon fontSize=\"small\" />}\n endIcon={<ExpandMoreIcon fontSize=\"small\" />}\n onClick={(e) => setAnchorEl(e.currentTarget)}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n dataTestId={`${testIdPrefix}-export-trigger`}\n />\n <Menu anchorEl={anchorEl} open={open} onClose={() => setAnchorEl(null)} data-testid={`${testIdPrefix}-export-menu`}>\n {formats.map((format) => (\n <MenuItem\n key={format.id}\n onClick={() => {\n onExport(format.id);\n setAnchorEl(null);\n }}\n data-testid={`${testIdPrefix}-export-${format.id}`}\n >\n {format.label}\n </MenuItem>\n ))}\n </Menu>\n </>\n );\n};\nDashboardExport.displayName = 'Dashboard.Export';\n\nexport const DashboardAction = ({ children }: DashboardActionProps): React.JSX.Element => (\n <Box sx={{ display: 'inline-flex' }}>{children}</Box>\n);\nDashboardAction.displayName = 'Dashboard.Action';\n\n/**\n * The header's actions, declared as a LIST — `<Dashboard.Action>`'s plural.\n *\n * `<Dashboard.Action>` is a slot: it renders whatever you hand it, once per\n * action, and a page with five of them draws five equally-loud buttons. That is\n * the right primitive for one button and the wrong one for five, and the pages\n * here that grew a fifth action all grew it the same way — by adding a fifth\n * slot, because the slot was the only thing on offer.\n *\n * This part answers the question the slot cannot: given N actions, how many\n * belong on the bar? See {@link HeaderActions} for the rule (0 ⇒ nothing,\n * 1 ⇒ a button, n ⇒ a button and a menu of the rest).\n *\n * Both stay. A header still composes `<Dashboard.Action>` for the one control\n * that is not an action at all — a link, a toggle, a status pill — and reaches\n * for this when it has actions to rank.\n */\nexport const DashboardActions = ({\n actions,\n moreLabel,\n collapseBelow,\n}: DashboardActionsProps): React.JSX.Element => {\n const { testIdPrefix } = useDashboardContext();\n return (\n <HeaderActions\n actions={actions}\n moreLabel={moreLabel}\n collapseBelow={collapseBelow}\n testIdPrefix={`${testIdPrefix}-actions`}\n />\n );\n};\nDashboardActions.displayName = 'Dashboard.Actions';\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/layout/ScrollArea/ScrollArea.helpers.ts"],"sourcesContent":["import type { ScrollAreaProps } from './ScrollArea.types';\n\ntype ScrollAreaDefaultedKeys =\n | 'width'\n | 'height'\n | 'orientation'\n | 'scrollbarSize'\n | 'autoHide'\n | 'autoHideDelay'\n | 'smoothScroll'\n | 'variant'\n | 'scrollToTopButton'\n | 'scrollToTopThreshold'\n | 'contentPadding'\n | 'alwaysShowScrollbar'\n | 'disabled'\n | 'loading'\n | 'testId';\n\nexport type ResolvedScrollAreaProps = ScrollAreaProps &\n Required<Pick<ScrollAreaProps, ScrollAreaDefaultedKeys>>;\n\nconst SCROLL_AREA_DEFAULTS: Pick<ScrollAreaProps, ScrollAreaDefaultedKeys> = {\n width: '100%',\n height: '100%',\n orientation: 'vertical',\n scrollbarSize: 'medium',\n autoHide: true,\n autoHideDelay: 1000,\n smoothScroll: true,\n variant: 'default',\n scrollToTopButton: false,\n scrollToTopThreshold: 100,\n contentPadding: 0,\n alwaysShowScrollbar: false,\n disabled: false,\n loading: false,\n testId: 'scroll-area',\n};\n\n// Strips explicitly-undefined props before the merge, so `prop={undefined}` still\n// falls back to the default exactly as a destructuring default would. Applied as\n// a merge rather than destructuring defaults, which would otherwise put fifteen\n// branches into the component's own complexity budget.\nexport const resolveScrollAreaProps = (props: ScrollAreaProps): ResolvedScrollAreaProps =>\n ({\n ...SCROLL_AREA_DEFAULTS,\n ...(Object.fromEntries(\n Object.entries(props).filter(([, value]) => value !== undefined),\n ) as Partial<ScrollAreaProps>),\n }) as ResolvedScrollAreaProps;\n"],"mappings":";AAsBA,IAAM,uBAAuE;AAAA,EAC3E,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,eAAe;AAAA,EACf,UAAU;AAAA,EACV,eAAe;AAAA,EACf,cAAc;AAAA,EACd,SAAS;AAAA,EACT,mBAAmB;AAAA,EACnB,sBAAsB;AAAA,EACtB,gBAAgB;AAAA,EAChB,qBAAqB;AAAA,EACrB,UAAU;AAAA,EACV,SAAS;AAAA,EACT,QAAQ;AACV;AAMO,IAAM,yBAAyB,CAAC,WACpC;AAAA,EACC,GAAG;AAAA,EACH,GAAI,OAAO;AAAA,IACT,OAAO,QAAQ,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,UAAU,MAAS;AAAA,EACjE;AACF;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/feedback/TutorialOverlay/TutorialOverlay.hooks.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\n\nimport { calculateTooltipPosition, getElementBounds } from './TutorialOverlay.geometry';\nimport type { TutorialOverlayProps } from './TutorialOverlay.types';\n\n// Tracks the highlighted element's box, re-measuring on resize and scroll. Scroll\n// is captured (third argument true) so it fires for any scrolling ancestor, not\n// just the window.\nconst useTargetBounds = ({\n active,\n target,\n}: {\n active: boolean;\n target?: string;\n}) => {\n const [targetBounds, setTargetBounds] = useState<globalThis.DOMRect | null>(null);\n const [isVisible, setIsVisible] = useState(false);\n\n useEffect(() => {\n if (!active || !target) return;\n\n const updateBounds = () => {\n const bounds = getElementBounds(target);\n setTargetBounds(bounds);\n setIsVisible(Boolean(bounds));\n };\n\n updateBounds();\n\n window.addEventListener('resize', updateBounds);\n window.addEventListener('scroll', updateBounds, true);\n\n return () => {\n window.removeEventListener('resize', updateBounds);\n window.removeEventListener('scroll', updateBounds, true);\n };\n }, [active, target]);\n\n return { targetBounds, isVisible };\n};\n\n// Places the tooltip against the measured target once both boxes are known.\nconst useTooltipPlacement = ({\n targetBounds,\n isVisible,\n preferredPosition,\n}: {\n targetBounds: globalThis.DOMRect | null;\n isVisible: boolean;\n preferredPosition?: string;\n}) => {\n const tooltipRef = useRef<HTMLDivElement>(null);\n const [tooltipPosition, setTooltipPosition] = useState({ top: 0, left: 0 });\n const [actualPlacement, setActualPlacement] = useState<string>('bottom');\n\n useEffect(() => {\n if (!targetBounds || !tooltipRef.current || !isVisible) return;\n\n const { position, placement } = calculateTooltipPosition(\n targetBounds,\n tooltipRef.current.getBoundingClientRect(),\n preferredPosition || 'auto',\n );\n\n setTooltipPosition(position);\n setActualPlacement(placement);\n }, [targetBounds, isVisible, preferredPosition]);\n\n return { tooltipRef, tooltipPosition, actualPlacement };\n};\n\n// Arrow keys step through the tour, Escape skips it.\nconst useTutorialKeyboard = ({\n enabled,\n onNext,\n onPrev,\n onSkip,\n}: {\n enabled: boolean;\n onNext: () => void;\n onPrev: () => void;\n onSkip: () => void;\n}) => {\n useEffect(() => {\n if (!enabled) return;\n\n const handleKeyPress = (e: globalThis.KeyboardEvent) => {\n switch (e.key) {\n case 'ArrowLeft':\n onPrev();\n break;\n case 'ArrowRight':\n onNext();\n break;\n case 'Escape':\n onSkip();\n break;\n }\n };\n\n window.addEventListener('keydown', handleKeyPress);\n return () => window.removeEventListener('keydown', handleKeyPress);\n }, [enabled, onNext, onPrev, onSkip]);\n};\n\nexport const useTutorialOverlay = ({\n steps,\n initialStep,\n active,\n allowKeyboardNavigation,\n onComplete,\n onSkip,\n onStepComplete,\n}: {\n steps: TutorialOverlayProps['steps'];\n initialStep: number;\n active: boolean;\n allowKeyboardNavigation: boolean;\n onComplete?: () => void;\n onSkip?: () => void;\n onStepComplete?: (stepId: string) => void;\n}) => {\n const [currentStep, setCurrentStep] = useState(initialStep);\n\n const currentStepData = steps[currentStep];\n const isLastStep = currentStep === steps.length - 1;\n\n const { targetBounds, isVisible } = useTargetBounds({\n active,\n target: currentStepData?.target,\n });\n\n const { tooltipRef, tooltipPosition, actualPlacement } = useTooltipPlacement({\n targetBounds,\n isVisible,\n preferredPosition: currentStepData?.position,\n });\n\n const handleNext = useCallback(() => {\n const currentStepId = steps[currentStep]?.id;\n if (currentStepId) onStepComplete?.(currentStepId);\n\n if (currentStep < steps.length - 1) {\n setCurrentStep(currentStep + 1);\n return;\n }\n\n onComplete?.();\n }, [currentStep, steps, onComplete, onStepComplete]);\n\n const handlePrev = useCallback(() => {\n setCurrentStep((step) => Math.max(step - 1, 0));\n }, []);\n\n const handleSkip = useCallback(() => {\n onSkip?.();\n }, [onSkip]);\n\n const handleRestart = useCallback(() => {\n setCurrentStep(0);\n }, []);\n\n useTutorialKeyboard({\n enabled: allowKeyboardNavigation && active,\n onNext: handleNext,\n onPrev: handlePrev,\n onSkip: handleSkip,\n });\n\n return {\n currentStep,\n currentStepData,\n isLastStep,\n isVisible,\n targetBounds,\n tooltipRef,\n tooltipPosition,\n actualPlacement,\n progress: ((currentStep + 1) / steps.length) * 100,\n handleNext,\n handlePrev,\n handleSkip,\n handleRestart,\n };\n};\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/feedback/StackedModal/StackedModal.parts.tsx"],"sourcesContent":["import ChevronLeftIcon from '@mui/icons-material/ChevronLeft';\nimport CloseIcon from '@mui/icons-material/Close';\nimport Box from '@mui/material/Box/index.js';\nimport CircularProgress from '@mui/material/CircularProgress/index.js';\nimport DialogActions from '@mui/material/DialogActions/index.js';\nimport DialogContent from '@mui/material/DialogContent/index.js';\nimport DialogTitle from '@mui/material/DialogTitle/index.js';\nimport IconButton from '@mui/material/IconButton/index.js';\nimport Skeleton from '@mui/material/Skeleton/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport { styled } from '@mui/material/styles/index.js';\nimport type { FC, ReactNode } from 'react';\nimport React from 'react';\nimport { safeAreaBottom } from '../../../utils/viewport';\nimport {\n loadingOverlayStyles,\n modalContentStyles,\n titleLeftStyles,\n titleRightStyles,\n titleStyles,\n} from './StackedModal.styles';\n\nconst StyledDialogTitle = styled(DialogTitle, {\n shouldForwardProp: (prop) => prop !== 'rtl',\n})<{ rtl?: boolean }>(({ theme, rtl }) => titleStyles(theme, rtl));\n\nconst DialogTitleLeft = styled(Box)(({ theme }) => titleLeftStyles(theme));\nconst DialogTitleRight = styled(Box)(({ theme }) => titleRightStyles(theme));\nconst LoadingOverlay = styled(Box)(({ theme }) => loadingOverlayStyles(theme));\n\n/**\n * The padded content wrapper callers put inside a StackedModal. The explicit\n * `typeof DialogContent` annotation keeps its type nameable across package\n * boundaries (TS2742) now that it is re-exported from the barrel.\n */\nexport const StackedModalContent: typeof DialogContent = styled(DialogContent)(({ theme }) =>\n modalContentStyles(theme),\n) as typeof DialogContent;\n\n/** Sub-element test IDs derive from the modal's own, or stay off when it has none. */\nexport const testId = (base: string | undefined, suffix: string): string | undefined =>\n base ? `${base}-${suffix}` : undefined;\n\n/**\n * A wrapper marking the subtree that should render as modal actions — the\n * StackedModal pulls it out of `children` and places it by device.\n */\nexport const StackedModalActions: FC<{ children?: ReactNode }> = ({ children }) => <>{children}</>;\n\n/** Separates the `StackedModalActions` subtree from the rest of the content. */\nconst splitModalChildren = (children: ReactNode): { content: ReactNode; actions: ReactNode } => {\n let actions: ReactNode = null;\n\n React.Children.forEach(children, (child) => {\n if (React.isValidElement<{ children?: ReactNode }>(child) && child.type === StackedModalActions) {\n actions = child.props.children;\n }\n });\n\n const content = React.Children.toArray(children).filter(\n (child) => !(React.isValidElement(child) && child.type === StackedModalActions),\n );\n\n return { content, actions };\n};\n\n/**\n * Works out what renders where: a `StackedModalActions` child wins over the\n * `actions` prop, and on phones those actions move out of the header into a\n * pinned bottom bar.\n */\nexport const resolveModalContent = (\n children: ReactNode,\n actions: ReactNode,\n isMobile: boolean,\n): {\n content: ReactNode;\n modalActions: ReactNode;\n headerActions: ReactNode;\n hasMobileActions: boolean;\n} => {\n const { content, actions: childActions } = splitModalChildren(children);\n const modalActions = childActions ?? actions;\n return {\n content,\n modalActions,\n headerActions: isMobile ? null : modalActions,\n hasMobileActions: Boolean(isMobile && modalActions),\n };\n};\n\n/** The panel's own ARIA ids, unless the caller wired it to its own labels. */\nexport const modalAriaIds = (\n modalId: string,\n ariaLabelledBy?: string,\n ariaDescribedBy?: string,\n): { titleId: string; descId: string } => ({\n titleId: ariaLabelledBy || `modal-title-${modalId}`,\n descId: ariaDescribedBy || `modal-desc-${modalId}`,\n});\n\nexport const ModalLoadingOverlay: FC<{ loadingText?: string; dataTestId?: string }> = ({\n loadingText,\n dataTestId,\n}) => (\n <LoadingOverlay data-testid={testId(dataTestId, 'loading-overlay')}>\n <CircularProgress size={40} data-testid={testId(dataTestId, 'loading-spinner')} />\n {loadingText && (\n <Typography variant=\"body2\" sx={{ mt: 2 }} data-testid={testId(dataTestId, 'loading-text')}>\n {loadingText}\n </Typography>\n )}\n </LoadingOverlay>\n);\n\ninterface ModalHeaderProps {\n titleId: string;\n navigationTitle?: ReactNode;\n /** Deeper than the first panel, so the leading button goes back instead of closing. */\n canGoBack: boolean;\n onBack: () => void;\n /** The back arrow's accessible name — it carries a glyph only. REQUIRED. */\n backLabel: string;\n onClose: () => void;\n /** Renders the bar without its ✕ — the panel's content owns the dismiss. */\n hideClose?: boolean;\n /** Header actions — desktop only; on phones they move to the footer. */\n headerActions?: ReactNode;\n rtl?: boolean;\n dataTestId?: string;\n}\n\n/**\n * The bar's leading control: back at depth ≥2, otherwise close — and nothing at\n * all when the panel's content carries its own ✕ (`hideClose`).\n */\nconst HeaderLeadingButton: FC<\n Pick<\n ModalHeaderProps,\n 'canGoBack' | 'onBack' | 'backLabel' | 'onClose' | 'hideClose' | 'rtl' | 'dataTestId'\n >\n> = ({ canGoBack, onBack, backLabel, onClose, hideClose, rtl, dataTestId }) => {\n if (canGoBack) {\n return (\n <IconButton\n edge=\"start\"\n color=\"inherit\"\n onClick={onBack}\n aria-label={backLabel}\n size=\"small\"\n sx={{ transform: rtl ? 'rotate(180deg)' : 'none' }}\n data-testid={testId(dataTestId, 'back-button')}\n >\n <ChevronLeftIcon />\n </IconButton>\n );\n }\n if (hideClose) return null;\n return (\n <IconButton\n edge=\"start\"\n color=\"inherit\"\n onClick={onClose}\n aria-label=\"close\"\n size=\"small\"\n data-testid={testId(dataTestId, 'close-button')}\n >\n <CloseIcon />\n </IconButton>\n );\n};\n\nexport const ModalHeader: FC<ModalHeaderProps> = ({\n titleId,\n navigationTitle,\n canGoBack,\n onBack,\n onClose,\n hideClose,\n backLabel,\n headerActions,\n rtl,\n dataTestId,\n}) => (\n <StyledDialogTitle id={titleId} rtl={rtl} data-testid={testId(dataTestId, 'header')}>\n <DialogTitleLeft>\n <HeaderLeadingButton\n canGoBack={canGoBack}\n onBack={onBack}\n backLabel={backLabel}\n onClose={onClose}\n hideClose={hideClose}\n rtl={rtl}\n dataTestId={dataTestId}\n />\n {navigationTitle && (\n <Typography\n variant=\"h6\"\n component=\"h2\"\n noWrap\n sx={{ ml: canGoBack || !hideClose ? 1 : 0 }}\n data-testid={testId(dataTestId, 'title')}\n >\n {navigationTitle}\n </Typography>\n )}\n </DialogTitleLeft>\n <DialogTitleRight data-testid={testId(dataTestId, 'header-actions')}>\n {headerActions}\n </DialogTitleRight>\n </StyledDialogTitle>\n);\n\nconst ContentSkeleton: FC = () => (\n <Box sx={{ p: 3 }}>\n <Skeleton variant=\"text\" width=\"60%\" height={32} />\n <Skeleton variant=\"text\" width=\"100%\" />\n <Skeleton variant=\"text\" width=\"100%\" />\n <Skeleton variant=\"rectangular\" height={200} sx={{ mt: 2 }} />\n </Box>\n);\n\ninterface ModalBodyProps {\n descId: string;\n showSkeleton: boolean;\n /** When there is no action bar, the body is what reaches the bottom of the panel. */\n endsPanel: boolean;\n dataTestId?: string;\n children?: ReactNode;\n}\n\nexport const ModalBody: FC<ModalBodyProps> = ({\n descId,\n showSkeleton,\n endsPanel,\n dataTestId,\n children,\n}) => (\n <Box\n id={descId}\n sx={{\n position: 'relative',\n flex: 1,\n overflow: 'auto',\n // iOS momentum scrolling, and no scroll-chaining to the page behind —\n // without `contain`, an overscroll at the end of the list rubber-bands the\n // whole panel and springs back before the last row can be tapped.\n WebkitOverflowScrolling: 'touch',\n overscrollBehavior: 'contain',\n // The content itself ends the panel when there is no action bar, so it has\n // to clear the home indicator on its own.\n ...(endsPanel ? safeAreaBottom(0) : {}),\n }}\n data-testid={testId(dataTestId, 'content')}\n >\n {showSkeleton ? <ContentSkeleton /> : children}\n </Box>\n);\n\n/** The phone-only pinned action bar; on desktop the actions live in the header. */\nexport const ModalFooter: FC<{ dataTestId?: string; children?: ReactNode }> = ({\n dataTestId,\n children,\n}) => (\n <DialogActions\n sx={{\n borderTop: (theme) => `1px solid ${theme.palette.divider}`,\n padding: 2,\n // Never let the action row sit under the iOS home indicator.\n flexShrink: 0,\n ...safeAreaBottom(16),\n }}\n data-testid={testId(dataTestId, 'footer')}\n >\n {children}\n </DialogActions>\n);\n\ninterface PanelContentsProps extends ModalHeaderProps {\n showSkeleton: boolean;\n loadingText?: string;\n descId: string;\n content: ReactNode;\n /** The resolved actions, already placed in the header or destined for the footer. */\n modalActions: ReactNode;\n hasMobileActions: boolean;\n}\n\n/** Everything inside the sliding panel: the loading veil, header, body and action bar. */\nexport const ModalPanelContents: FC<PanelContentsProps> = ({\n showSkeleton,\n loadingText,\n descId,\n content,\n modalActions,\n hasMobileActions,\n ...header\n}) => (\n <>\n {showSkeleton && (\n <ModalLoadingOverlay loadingText={loadingText} dataTestId={header.dataTestId} />\n )}\n <ModalHeader {...header} />\n <ModalBody\n descId={descId}\n showSkeleton={showSkeleton}\n endsPanel={!hasMobileActions}\n dataTestId={header.dataTestId}\n >\n {content}\n </ModalBody>\n {hasMobileActions && (\n <ModalFooter dataTestId={header.dataTestId}>{modalActions}</ModalFooter>\n )}\n </>\n);\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/layout/ScrollArea/ScrollViewport.tsx"],"sourcesContent":["import Box from '@mui/material/Box/index.js';\nimport { useTheme } from '@mui/material/styles/index.js';\nimport type { FC, ReactNode, UIEvent } from 'react';\nimport React from 'react';\n\nimport { getOverflowStyle, getVariantStyles } from './ScrollArea.styles';\nimport type { ResolvedScrollAreaProps } from './ScrollArea.helpers';\n\nexport interface ScrollViewportProps\n extends Pick<\n ResolvedScrollAreaProps,\n | 'height'\n | 'maxHeight'\n | 'orientation'\n | 'scrollbarSize'\n | 'scrollbarColor'\n | 'scrollbarTrackColor'\n | 'contentPadding'\n | 'variant'\n | 'disabled'\n | 'loading'\n | 'smoothScroll'\n > {\n /** The scroll region's accessible name. REQUIRED. */\n regionLabel: string;\n children: ReactNode;\n shouldShowScrollbar: boolean;\n setScrollRef: (node: HTMLDivElement | null) => void;\n onScroll: (event: UIEvent<HTMLDivElement>) => void;\n}\n\n// The element that actually scrolls: its own overflow and scrollbar styling,\n// plus the disabled and loading treatments.\nexport const ScrollViewport: FC<ScrollViewportProps> = ({\n regionLabel,\n children,\n height,\n maxHeight,\n orientation,\n scrollbarSize,\n scrollbarColor,\n scrollbarTrackColor,\n contentPadding,\n variant,\n disabled,\n loading,\n smoothScroll,\n shouldShowScrollbar,\n setScrollRef,\n onScroll,\n}) => {\n const theme = useTheme();\n\n return (\n <Box\n ref={setScrollRef}\n onScroll={onScroll}\n role=\"region\"\n aria-label={regionLabel}\n aria-busy={loading}\n tabIndex={disabled ? -1 : 0}\n sx={{\n width: '100%',\n height: '100%',\n // Use an explicit maxHeight when height is 'auto', else inherit.\n maxHeight: height === 'auto' && maxHeight ? maxHeight : '100%',\n padding: contentPadding,\n opacity: loading ? 0.5 : 1,\n pointerEvents: disabled || loading ? 'none' : 'auto',\n transition: 'opacity 0.3s ease',\n '&:focus': {\n outline: 'none',\n '&:focus-visible': {\n outline: `2px solid ${theme.palette.primary.main}`,\n outlineOffset: -2,\n },\n },\n ...getOverflowStyle({ disabled, orientation }),\n ...getVariantStyles({\n theme,\n variant,\n orientation,\n scrollbarSize,\n scrollbarColor,\n scrollbarTrackColor,\n shouldShowScrollbar,\n }),\n }}\n style={{ scrollBehavior: smoothScroll ? 'smooth' : 'auto' }}\n >\n {children}\n </Box>\n );\n};\n"],"mappings":";;;;;;AAAA,OAAO,SAAS;AAChB,SAAS,gBAAgB;AAqDrB;AArBG,IAAM,iBAA0C,CAAC;AAAA,EACtD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,QAAQ,SAAS;AAEvB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,KAAK;AAAA,MACL;AAAA,MACA,MAAK;AAAA,MACL,cAAY;AAAA,MACZ,aAAW;AAAA,MACX,UAAU,WAAW,KAAK;AAAA,MAC1B,IAAI;AAAA,QACF,OAAO;AAAA,QACP,QAAQ;AAAA;AAAA,QAER,WAAW,WAAW,UAAU,YAAY,YAAY;AAAA,QACxD,SAAS;AAAA,QACT,SAAS,UAAU,MAAM;AAAA,QACzB,eAAe,YAAY,UAAU,SAAS;AAAA,QAC9C,YAAY;AAAA,QACZ,WAAW;AAAA,UACT,SAAS;AAAA,UACT,mBAAmB;AAAA,YACjB,SAAS,aAAa,MAAM,QAAQ,QAAQ,IAAI;AAAA,YAChD,eAAe;AAAA,UACjB;AAAA,QACF;AAAA,QACA,GAAG,iBAAiB,EAAE,UAAU,YAAY,CAAC;AAAA,QAC7C,GAAG,iBAAiB;AAAA,UAClB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,MACH;AAAA,MACA,OAAO,EAAE,gBAAgB,eAAe,WAAW,OAAO;AAAA,MAEzD;AAAA;AAAA,EACH;AAEJ;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/layout/Drawer/Drawer.tsx"],"sourcesContent":["import Close from '@mui/icons-material/Close';\nimport type { Theme } from '@mui/material/styles/index.js';\nimport Box from '@mui/material/Box/index.js';\nimport MuiDrawer from '@mui/material/Drawer/index.js';\nimport IconButton from '@mui/material/IconButton/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport { alpha, useTheme } from '@mui/material/styles/index.js';\nimport React from 'react';\n\nimport type { DrawerContentProps,DrawerHeaderProps, DrawerProps } from './Drawer.types';\nimport { shadowInk } from '../../../tokens/ink';\n\ntype DrawerAnchor = 'left' | 'right' | 'top' | 'bottom';\n\n// `variant` doubles as a position preset, but an explicit `anchor` always wins.\nconst resolveAnchor = (\n anchor: DrawerProps['anchor'],\n variant: DrawerProps['variant'],\n): DrawerAnchor => {\n if (anchor) return anchor;\n\n // Map variant to anchor position\n switch (variant) {\n case 'right':\n return 'right';\n case 'top':\n return 'top';\n case 'bottom':\n return 'bottom';\n case 'glass':\n return 'right';\n case 'left':\n default:\n return 'left';\n }\n};\n\nconst buildDrawerStyles = (\n theme: Theme,\n anchor: DrawerAnchor,\n variant: DrawerProps['variant'],\n width: DrawerProps['width'],\n height: DrawerProps['height'],\n // Merged LAST into the surface's own rules, so a caller can shape the sliding\n // surface itself (rounded corners on a bottom sheet, a docked panel's offset)\n // without reaching for the MUI paper class from outside. Undefined by default:\n // omit it and the drawer styles exactly as it always has.\n paperSx?: DrawerProps['paperSx'],\n) => {\n const baseStyles = {\n width: ['left', 'right'].includes(anchor) ? width : '100%',\n height: ['top', 'bottom'].includes(anchor) ? height : '100%',\n flexShrink: 0,\n };\n\n if (variant === 'glass') {\n return {\n ...baseStyles,\n '& .MuiDrawer-paper': {\n width,\n height: '100%',\n backgroundColor: alpha(theme.palette.background.paper, 0.1),\n backdropFilter: 'blur(20px)',\n border: `1px solid ${alpha(theme.palette.primary.main, 0.2)}`,\n boxShadow: `0 8px 32px ${shadowInk(theme, 0.1)}`,\n ...paperSx,\n },\n };\n }\n\n return {\n ...baseStyles,\n '& .MuiDrawer-paper': {\n width: ['left', 'right'].includes(anchor) ? width : '100%',\n height: ['top', 'bottom'].includes(anchor) ? height : '100%',\n boxSizing: 'border-box',\n ...paperSx,\n },\n };\n};\n\nexport const Drawer: React.FC<DrawerProps> = ({\n children,\n open,\n onClose,\n variant = 'left',\n anchor,\n width = 280,\n height = '100%',\n persistent = false,\n backdrop = true,\n hideBackdrop = false,\n keepMounted = false,\n paperSx,\n className,\n dataTestId,\n ...rest\n}) => {\n const theme = useTheme();\n const drawerAnchor = resolveAnchor(anchor, variant);\n\n return (\n <MuiDrawer\n anchor={drawerAnchor}\n open={open}\n onClose={onClose}\n variant={persistent ? 'persistent' : 'temporary'}\n ModalProps={{\n keepMounted,\n hideBackdrop,\n BackdropProps: {\n invisible: !backdrop,\n },\n }}\n sx={buildDrawerStyles(theme, drawerAnchor, variant, width, height, paperSx)}\n className={className}\n data-testid={dataTestId || 'drawer'}\n {...rest}\n >\n {children}\n </MuiDrawer>\n );\n};\n\nexport const DrawerHeader: React.FC<DrawerHeaderProps> = ({\n children,\n onClose,\n showCloseButton = true,\n closeLabel,\n dataTestId,\n}) => {\n const theme = useTheme();\n\n return (\n <Box\n data-testid={dataTestId || 'drawer-header'}\n sx={{\n display: 'flex',\n alignItems: 'center',\n padding: theme.spacing(2),\n borderBottom: `1px solid ${theme.palette.divider}`,\n minHeight: 64,\n justifyContent: 'space-between',\n }}\n >\n <Box sx={{ flex: 1 }} data-testid={dataTestId ? `${dataTestId}-title` : 'drawer-title'}>\n {typeof children === 'string' ? <Typography variant=\"h6\">{children}</Typography> : children}\n </Box>\n {showCloseButton && onClose && (\n <IconButton\n onClick={onClose}\n edge=\"end\"\n aria-label={closeLabel ?? 'Close drawer'}\n data-testid={dataTestId ? `${dataTestId}-close` : 'drawer-close'}\n >\n <Close />\n </IconButton>\n )}\n </Box>\n );\n};\n\nexport const DrawerContent: React.FC<DrawerContentProps> = ({ children, padding = true, dataTestId }) => {\n const theme = useTheme();\n\n return (\n <Box\n data-testid={dataTestId || 'drawer-content'}\n sx={{\n flex: 1,\n overflow: 'auto',\n padding: padding ? theme.spacing(2) : 0,\n }}\n >\n {children}\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-overflow.ts"],"sourcesContent":["\"use client\";\n\nimport { useRef } from \"react\";\n\nimport { splitToFit, useMeasuredWidth } from \"../../utility/Overflow\";\nimport {\n estimateWidth,\n furnitureCost,\n GAP,\n isRangeSet,\n pillText,\n RESERVED,\n rightClusterCost,\n} from \"./data-views-overflow-costs\";\nimport type { FilterFieldConfig, RangeFieldConfig, RangeValue } from \"./data-views-types\";\n\n/**\n * PROGRESSIVE COLLAPSE — which filter controls fit on the toolbar, measured.\n *\n * Two rules, and both come from watching the all-or-nothing version fail:\n *\n * 1. Controls shed ONE AT A TIME into an overflow, never all at once. With four\n * filters and room for three, hiding all four throws away the room that was\n * there.\n * 2. An APPLIED filter is ranked first, not exempt. Applied controls take the\n * visible slots ahead of idle ones, and go into \"Mais\" like anything else\n * when even those slots run out. Exempting them outright — the earlier rule\n * — meant four applied filters on a phone claimed more width than the row\n * had, and the bar painted past its own edge: the pills were reachable only\n * by scrolling the toolbar sideways. Hiding one is safe because \"Mais\" says\n * how many applied filters are behind it; scrolling one off-screen says\n * nothing at all.\n *\n * It MEASURES rather than picking a breakpoint, which is what\n * `FILTERS-CONTRACT.md` asks for: pages declare different numbers of filters\n * with different label lengths, and the same page collapses at a different\n * width in another language. A shared breakpoint is wrong for at least one\n * table by construction.\n *\n * Collapsing is presentation only — nothing here emits a query, drops a filter\n * or changes a rendered row.\n */\n\n/** A filter control on the bar: a multi-select pill or a min/max range. */\nexport interface OverflowField<T extends Record<string, unknown>> {\n id: string;\n label: string;\n /** Which control it is — the caller renders the right one. */\n group: \"pill\" | \"range\";\n pill?: FilterFieldConfig<T>;\n range?: RangeFieldConfig<T>;\n}\n\n/** What the caller renders inline, and what goes behind \"Mais\". */\nexport interface OverflowSplit<T extends Record<string, unknown>> {\n inline: OverflowField<T>[];\n overflow: OverflowField<T>[];\n /**\n * Step 2 — Exibir/Exportar drop their text labels and become icons.\n * Cheap: both keep their icon, their tooltip and their position.\n */\n compactControls: boolean;\n /**\n * Step 5, and the LAST resort — the \"N de N\" counter is dropped.\n *\n * Only once every control has already collapsed and the row STILL does not\n * fit, which on a six-filter table is below about 400px. The counter goes\n * last because it is the only thing left that reports rather than does: an\n * operator can act without knowing the total, but not without the search.\n */\n counterHidden: boolean;\n /**\n * Step 4 — the search collapses to a magnifier that expands on click.\n * The most expensive step, so it is taken last: the search is the one\n * control on the bar that cannot be guessed from an icon's position.\n */\n searchCollapsed: boolean;\n /**\n * Step 6, below even the counter — \"Limpar\" leaves the bar.\n *\n * The one control here with a second home: the overflow panel's footer\n * carries \"Limpar todos os filtros\". So it goes before the search icon or\n * \"Mais\", neither of which has anywhere else to be.\n */\n clearAllHidden: boolean;\n /**\n * Expanding the magnifier must take the whole cluster, filters and all.\n *\n * Only on the rungs where what is left over would be too narrow to read —\n * on a large phone the box simply shrinks and the filters stay, which is why\n * this is its own answer rather than `searchCollapsed` reused.\n */\n searchTakeover: boolean;\n /** Attach to the toolbar row being measured. */\n barRef: React.RefObject<HTMLDivElement | null>;\n}\n\n/** Every declared control, pills first, in the order the bar renders them. */\nexport function toOverflowFields<T extends Record<string, unknown>>(\n fields: FilterFieldConfig<T>[],\n rangeFields: RangeFieldConfig<T>[],\n): OverflowField<T>[] {\n return [\n ...fields.map((pill) => ({ id: pill.id, label: pill.label, group: \"pill\" as const, pill })),\n ...rangeFields.map((range) => ({ id: range.id, label: range.label, group: \"range\" as const, range })),\n ];\n}\n\n\n/** Is this control carrying a value the operator set? */\nfunction isActiveField<T extends Record<string, unknown>>(\n field: OverflowField<T>,\n pills: Record<string, string[]>,\n ranges: Record<string, RangeValue>,\n): boolean {\n return field.group === \"pill\"\n ? (pills[field.id]?.length ?? 0) > 0\n : isRangeSet(ranges[field.id]);\n}\n\n/** Estimated rendered width of one control at its CURRENT value. */\nfunction fieldWidth<T extends Record<string, unknown>>(\n field: OverflowField<T>,\n pills: Record<string, string[]>,\n ranges: Record<string, RangeValue>,\n): number {\n if (field.group === \"pill\") return estimateWidth(pillText(field, pills[field.id] ?? []), 0);\n // A bounded range renders two number inputs beside its label.\n return estimateWidth(field.label, isRangeSet(ranges[field.id]) ? 100 : 0);\n}\n\n/** What one split costs on the bar, so the ladder below can price the next step. */\ntype Split<T extends Record<string, unknown>> = {\n inline: OverflowField<T>[];\n overflow: OverflowField<T>[];\n /** Width the surviving inline controls occupy, incl. the \"Mais\" button. */\n used: number;\n};\n\n/** Step 1 — shed filter controls into the overflow. Pure. */\nfunction splitFilters<T extends Record<string, unknown>>(\n all: OverflowField<T>[],\n pills: Record<string, string[]>,\n ranges: Record<string, RangeValue>,\n width: number,\n /** Search + counter + right cluster + chrome, at the rung being considered. */\n furniture: number,\n /** Is the bar already down to icons? \"Mais\" shrinks with everything else. */\n compact: boolean,\n): Split<T> {\n const active = all.filter((field) => isActiveField(field, pills, ranges));\n const idle = all.filter((field) => !isActiveField(field, pills, ranges));\n\n // \"Limpar\" rides the end of the cluster whenever anything is applied.\n const clearCost = active.length > 0 ? RESERVED.clearAll + GAP : 0;\n // APPLIED FIRST, BUT NOT EXEMPT.\n //\n // Applied controls take the visible slots ahead of idle ones — that part was\n // always right. Exempting them from the overflow entirely was not: applying\n // a value LENGTHENS a control (\"Pagamento (1)\"), so on a phone four applied\n // filters claimed more width than the row had and the bar simply painted\n // past its own edge, leaving pills reachable only by scrolling sideways.\n //\n // An applied filter hidden in \"Mais\" is not lost the way it would be if it\n // vanished silently: the trigger goes to the applied tone and says how many\n // are in there (see `MoreTrigger`), which is the same signal the pill itself\n // was carrying. A control you scroll off-screen carries no signal at all.\n //\n // The keep-what-fits loop itself is `splitToFit` (`utility/Overflow`) — the\n // one part of this that is not filter-shaped, and the part a second cluster\n // in the design system would otherwise have had to reimplement.\n const split = splitToFit(all, {\n widthOf: (field) => fieldWidth(field, pills, ranges),\n keyOf: (field) => field.id,\n gap: GAP,\n available: width - furniture - clearCost,\n // The overflow button at the width it will actually have, which on a phone\n // is the icon-and-badge one.\n overflowCost: compact ? RESERVED.overflowButtonCompact : RESERVED.overflowButton,\n priority: [...active, ...idle],\n });\n return { ...split, used: split.used + clearCost };\n}\n\n/**\n * THE DEGRADATION LADDER — cheapest loss first, and each rung taken only if\n * the one before it did not free enough:\n *\n * 1. filter controls move into the \"Mais\" overflow (`splitFilters`)\n * 2. Exibir / Exportar drop their text labels (`compactControls`)\n * 3. the search shrinks toward its minimum (CSS: it is `flex: 1`)\n * 4. the search itself collapses to an icon (`searchCollapsed`)\n *\n * Step 3 needs no flag — the search is a flex child, so it gives up width on\n * its own until it hits `RESERVED.search`. The flags mark the two steps that\n * change what is RENDERED rather than how wide it is.\n *\n * Measured against what is CURRENTLY on the bar, never a breakpoint: a\n * two-filter page and a five-filter page would otherwise collapse at the same\n * width, and only one of them would be right.\n */\nfunction computeSplit<T extends Record<string, unknown>>(\n all: OverflowField<T>[],\n pills: Record<string, string[]>,\n ranges: Record<string, RangeValue>,\n width: number,\n /** Does the host render \"Exportar\" beside \"Exibir\"? Half the cluster if not. */\n hasExport: boolean,\n): Omit<OverflowSplit<T>, \"barRef\"> {\n // Unmeasured (SSR, or jsdom without a ResizeObserver) ⇒ degrade nothing.\n if (width === 0) {\n return {\n inline: all,\n overflow: [],\n compactControls: false,\n counterHidden: false,\n searchCollapsed: false,\n clearAllHidden: false,\n searchTakeover: false,\n };\n }\n // Pass 1 prices the furniture at its widest — no rung has been taken yet.\n let split = splitFilters(all, pills, ranges, width, furnitureCost(UNCOLLAPSED, hasExport), false);\n let flags = ladderFlags(split, width, hasExport);\n // RE-SPEND WHAT THE LATER RUNGS FREED.\n //\n // Rungs 2/4/5 turn 200 + 96 + 216 of furniture into 44 + 0 + 140, and until\n // this loop existed nobody handed those ~330px back to the filters: the\n // split was decided once, against the uncollapsed row, so a phone shed every\n // control and then sat with a band of empty bar beside \"Mais 5\".\n //\n // Settles rather than oscillates, and cannot overfill: a cheaper furniture\n // can only give the filters MORE room, more filter width can only push the\n // ladder FURTHER down, and a further rung can only make the furniture\n // cheaper again — so the budget decreases monotonically and the loop exits\n // the moment it stops moving. The bound is a backstop, not the exit.\n let budget = furnitureCost(UNCOLLAPSED, hasExport);\n for (let pass = 0; pass < 3; pass += 1) {\n const freed = furnitureCost(flags, hasExport);\n if (freed >= budget) break;\n budget = freed;\n split = splitFilters(all, pills, ranges, width, budget, flags.compactControls);\n flags = ladderFlags(split, width, hasExport);\n }\n return { inline: split.inline, overflow: split.overflow, ...flags };\n}\n\n/** The widest the furniture ever is — every rung still untaken. */\nconst UNCOLLAPSED = { searchCollapsed: false, counterHidden: false, compactControls: false };\n\n/** Rungs 2 and 4-6, priced against what the filters actually took. */\nfunction ladderFlags<T extends Record<string, unknown>>(\n split: Split<T>,\n width: number,\n hasExport: boolean,\n): Omit<OverflowSplit<T>, \"barRef\" | \"inline\" | \"overflow\"> {\n const { overflow, used } = split;\n const base = width - used - RESERVED.chrome;\n\n // Would the search still make its minimum with the labels on?\n const compactControls = base - RESERVED.counter - rightClusterCost(hasExport, false) < RESERVED.search;\n const rightCost = rightClusterCost(hasExport, compactControls);\n // …and with them off?\n const searchCollapsed = base - RESERVED.counter - rightCost < RESERVED.search;\n // Everything has collapsed and the row STILL overflows. The controls cannot\n // shrink further — they are `flexShrink: 0` precisely so an over-packed row\n // sheds rather than squeezes — so without this last rung they simply paint\n // outside the toolbar, which is what a narrow phone was doing.\n const counterHidden =\n searchCollapsed && base - RESERVED.counter - rightCost < RESERVED.searchIcon;\n // Step 6 — below even that, \"Limpar\" leaves the bar. It is the ONLY control\n // here with a second home: the overflow panel's footer carries \"Limpar todos\n // os filtros\", so nothing is lost, which is exactly why it goes before the\n // search icon or \"Mais\" (neither of which has anywhere else to be). Guarded\n // on there BEING an overflow, because with no panel the footer does not\n // exist and dropping this would strand the operator.\n const clearAllHidden = counterHidden && overflow.length > 0;\n // What the keyword box would get if the operator expanded the magnifier.\n // `searchCollapsed` is a different question — it asks whether the box fits at\n // its PREFERRED 200px, and is deliberately pessimistic — so reusing it to\n // decide the takeover evicted the filters on screens where the box had plenty\n // of room to simply shrink.\n //\n // Asked with the inline filters SHED, because shedding them is exactly what\n // expanding the box does: the row re-splits and they go behind \"Mais\".\n // Measuring against the resting row instead made a filter argue for its own\n // eviction — now that a large phone keeps one, its width came out of `base`,\n // pushed the box under `usableSearch`, and tipped a row that had ample space\n // to share into a full takeover.\n const overflowButton = compactControls\n ? RESERVED.overflowButtonCompact\n : RESERVED.overflowButton;\n const shedRoom = width - RESERVED.chrome - (overflow.length > 0 ? overflowButton : 0);\n const searchBoxRoom = shedRoom - (counterHidden ? 0 : RESERVED.counter) - rightCost;\n // Below this a box is too narrow to read what you typed into it, and shrinking\n // further buys nothing; that is the only point at which taking the whole\n // cluster is worth losing the filters.\n const searchTakeover = searchCollapsed && searchBoxRoom < RESERVED.usableSearch;\n\n return { compactControls, counterHidden, searchCollapsed, clearAllHidden, searchTakeover };\n}\n\n/**\n * Split the declared filter controls into what fits and what goes behind\n * \"Mais\", measured against the live toolbar width.\n *\n * Cached on a SIGNATURE rather than by `useMemo` over the inputs: hosts declare\n * their fields inline, so `all` is a fresh array on every render while the\n * configuration is unchanged, and a reference-keyed memo would never hit.\n */\nexport function useFilterOverflow<T extends Record<string, unknown>>(\n all: OverflowField<T>[],\n pills: Record<string, string[]>,\n ranges: Record<string, RangeValue>,\n /**\n * A filter control is open — hold the current answer until it closes.\n *\n * Applying a filter changes that control's LABEL (\"Valor\" becomes \"Valor: ≥\n * R$ 1\"), which changes its measured width, which re-runs the whole split\n * while its popover is open on top of it. Measured: setting a minimum moved\n * the trigger 192px left, took the popover with it, and pushed two other\n * controls into a newly-appeared \"Mais 2\" — so reaching for the second bound\n * meant chasing the control across the row. Nobody sets a range that way.\n *\n * Frozen only for the duration: closing re-measures against the new labels,\n * so the row still ends up correct, it just does not rearrange under a hand\n * that is mid-edit.\n */\n frozen = false,\n /** Whether \"Exportar\" is on the bar — see `rightClusterCost`. */\n hasExport = true,\n): OverflowSplit<T> {\n // The measurement is `useMeasuredWidth` (`utility/Overflow`): the same\n // ResizeObserver every collapsing cluster in the design system reads, so\n // there is one loop to get right rather than one per bar. `0` until the\n // first measurement lands (and forever under SSR or jsdom), which\n // `computeSplit` reads as \"degrade nothing\".\n const { ref: barRef, width } = useMeasuredWidth<HTMLDivElement>();\n const signature = JSON.stringify({\n ids: all.map((field) => field.id),\n pills,\n ranges,\n width,\n hasExport,\n });\n const cache = useRef<{ signature: string; split: ReturnType<typeof computeSplit<T>> } | null>(null);\n if (cache.current === null || (!frozen && cache.current.signature !== signature)) {\n cache.current = { signature, split: computeSplit(all, pills, ranges, width, hasExport) };\n }\n return { ...cache.current.split, barRef };\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/components/data-display/MapPreview/mapProjection.ts"],"sourcesContent":["export const TILE_SIZE = 256;\n\n// Metres covered by one pixel at zoom 0 on the equator; each zoom level halves it.\nconst EQUATOR_METRES_PER_PIXEL = 156543.03392;\nconst SCALE_BAR_PIXELS = 100;\nconst GEOCODE_DELAY_MS = 300;\n\n// Web Mercator. Longitude maps linearly; latitude goes through the log of the\n// tangent, clamped just short of the poles where that diverges.\nconst project = (lat: number, lng: number) => {\n const siny = Math.sin((lat * Math.PI) / 180);\n const boundedSiny = Math.max(-0.9999, Math.min(0.9999, siny));\n\n return {\n x: TILE_SIZE * (0.5 + lng / 360),\n y: TILE_SIZE * (0.5 - Math.log((1 + boundedSiny) / (1 - boundedSiny)) / (4 * Math.PI)),\n };\n};\n\nexport const getTileCoordinates = (lat: number, lng: number, zoom: number) => {\n const scale = 1 << zoom;\n const world = project(lat, lng);\n\n return {\n x: Math.floor(Math.floor(world.x * scale) / TILE_SIZE),\n y: Math.floor(Math.floor(world.y * scale) / TILE_SIZE),\n };\n};\n\nexport const getScaleDistance = (zoom: number): string => {\n const distance = (EQUATOR_METRES_PER_PIXEL / Math.pow(2, zoom)) * SCALE_BAR_PIXELS;\n\n if (distance >= 1000) return `${Math.round(distance / 1000)} km`;\n // Round to the nearest 100m so the bar reads as a round number.\n if (distance >= 100) return `${Math.round(distance / 100) * 100} m`;\n return `${Math.round(distance)} m`;\n};\n\nconst MOCK_GEOCODE_RESULTS: Record<string, { lat: number; lng: number }> = {\n 'san francisco': { lat: 37.7749, lng: -122.4194 },\n 'new york': { lat: 40.7128, lng: -74.006 },\n london: { lat: 51.5074, lng: -0.1278 },\n tokyo: { lat: 35.6762, lng: 139.6503 },\n paris: { lat: 48.8566, lng: 2.3522 },\n};\n\n// Stands in for a Places lookup, delay included so the disabled search field is\n// actually observable.\nexport const geocode = async (address: string): Promise<{ lat: number; lng: number } | null> => {\n await new Promise((resolve) => window.setTimeout(resolve, GEOCODE_DELAY_MS));\n return MOCK_GEOCODE_RESULTS[address.toLowerCase().trim()] || null;\n};\n"],"mappings":";AAAO,IAAM,YAAY;AAGzB,IAAM,2BAA2B;AACjC,IAAM,mBAAmB;AACzB,IAAM,mBAAmB;AAIzB,IAAM,UAAU,CAAC,KAAa,QAAgB;AAC5C,QAAM,OAAO,KAAK,IAAK,MAAM,KAAK,KAAM,GAAG;AAC3C,QAAM,cAAc,KAAK,IAAI,SAAS,KAAK,IAAI,QAAQ,IAAI,CAAC;AAE5D,SAAO;AAAA,IACL,GAAG,aAAa,MAAM,MAAM;AAAA,IAC5B,GAAG,aAAa,MAAM,KAAK,KAAK,IAAI,gBAAgB,IAAI,YAAY,KAAK,IAAI,KAAK;AAAA,EACpF;AACF;AAEO,IAAM,qBAAqB,CAAC,KAAa,KAAa,SAAiB;AAC5E,QAAM,QAAQ,KAAK;AACnB,QAAM,QAAQ,QAAQ,KAAK,GAAG;AAE9B,SAAO;AAAA,IACL,GAAG,KAAK,MAAM,KAAK,MAAM,MAAM,IAAI,KAAK,IAAI,SAAS;AAAA,IACrD,GAAG,KAAK,MAAM,KAAK,MAAM,MAAM,IAAI,KAAK,IAAI,SAAS;AAAA,EACvD;AACF;AAEO,IAAM,mBAAmB,CAAC,SAAyB;AACxD,QAAM,WAAY,2BAA2B,KAAK,IAAI,GAAG,IAAI,IAAK;AAElE,MAAI,YAAY,IAAM,QAAO,GAAG,KAAK,MAAM,WAAW,GAAI,CAAC;AAE3D,MAAI,YAAY,IAAK,QAAO,GAAG,KAAK,MAAM,WAAW,GAAG,IAAI,GAAG;AAC/D,SAAO,GAAG,KAAK,MAAM,QAAQ,CAAC;AAChC;AAEA,IAAM,uBAAqE;AAAA,EACzE,iBAAiB,EAAE,KAAK,SAAS,KAAK,UAAU;AAAA,EAChD,YAAY,EAAE,KAAK,SAAS,KAAK,QAAQ;AAAA,EACzC,QAAQ,EAAE,KAAK,SAAS,KAAK,QAAQ;AAAA,EACrC,OAAO,EAAE,KAAK,SAAS,KAAK,SAAS;AAAA,EACrC,OAAO,EAAE,KAAK,SAAS,KAAK,OAAO;AACrC;AAIO,IAAM,UAAU,OAAO,YAAkE;AAC9F,QAAM,IAAI,QAAQ,CAAC,YAAY,OAAO,WAAW,SAAS,gBAAgB,CAAC;AAC3E,SAAO,qBAAqB,QAAQ,YAAY,EAAE,KAAK,CAAC,KAAK;AAC/D;","names":[]}