@12-apps/ui 6.38.0 → 6.39.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (334) hide show
  1. package/dist/_internal/components/data-display/DataGrid/DataGrid.body.js +3 -2
  2. package/dist/_internal/components/data-display/DataGrid/DataGrid.cells.js +2 -1
  3. package/dist/_internal/components/data-display/DataGrid/DataGrid.js +4 -4
  4. package/dist/_internal/components/data-display/DataGrid/DataGrid.model.js +2 -1
  5. package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +19 -19
  6. package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +26 -26
  7. package/dist/_internal/components/data-display/DataViews/SaveViewModal.js +5 -5
  8. package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +4 -4
  9. package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +3 -3
  10. package/dist/_internal/components/data-display/DataViews/base-list-card.js +5 -5
  11. package/dist/_internal/components/data-display/DataViews/data-views-columns.js +2 -2
  12. package/dist/_internal/components/data-display/DataViews/data-views-display-panel.js +3 -3
  13. package/dist/_internal/components/data-display/DataViews/data-views-display-tabs.js +2 -2
  14. package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +8 -8
  15. package/dist/_internal/components/data-display/DataViews/data-views-grid-helpers.js +1 -1
  16. package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +16 -16
  17. package/dist/_internal/components/data-display/DataViews/data-views-layout-context.js +1 -1
  18. package/dist/_internal/components/data-display/DataViews/data-views-overflow-costs.js +4 -3
  19. package/dist/_internal/components/data-display/DataViews/data-views-overflow.js +3 -2
  20. package/dist/_internal/components/data-display/DataViews/data-views-scope-tabs.js +2 -2
  21. package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +6 -6
  22. package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +6 -6
  23. package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +5 -5
  24. package/dist/_internal/components/data-display/DataViews/list-card-rails.js +2 -2
  25. package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +3 -3
  26. package/dist/_internal/components/data-display/FleetMap/FleetBody.js +9 -9
  27. package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js +8 -8
  28. package/dist/_internal/components/data-display/FleetMap/FleetMap.js +10 -10
  29. package/dist/_internal/components/data-display/LazyImage/LazyImage.js +1 -1
  30. package/dist/_internal/components/data-display/MapPreview/MapDecorations.js +2 -2
  31. package/dist/_internal/components/data-display/MapPreview/MapPreview.hooks.js +2 -2
  32. package/dist/_internal/components/data-display/MapPreview/MapPreview.js +7 -7
  33. package/dist/_internal/components/data-display/MapPreview/MapTiles.js +2 -2
  34. package/dist/_internal/components/data-display/MapPreview/StaticMapView.js +4 -4
  35. package/dist/_internal/components/data-display/MapPreview/mapProjection.js +3 -3
  36. package/dist/_internal/components/data-display/MapPreview/useMapPreview.js +3 -3
  37. package/dist/_internal/components/data-display/Table/Table.helpers.js +5 -3
  38. package/dist/_internal/components/data-display/Table/Table.hooks.js +2 -1
  39. package/dist/_internal/components/data-display/Table/Table.js +4 -4
  40. package/dist/_internal/components/data-display/Table/TableParts.hooks.js +4 -2
  41. package/dist/_internal/components/data-display/Table/TableParts.js +4 -2
  42. package/dist/_internal/components/data-display/index.js +19 -19
  43. package/dist/_internal/components/form/Calendar/Calendar.js +5 -4
  44. package/dist/_internal/components/form/Calendar/CalendarDay.js +2 -1
  45. package/dist/_internal/components/form/Calendar/CalendarDayCell.js +3 -2
  46. package/dist/_internal/components/form/Calendar/CalendarMonth.js +4 -3
  47. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.js +5 -5
  48. package/dist/_internal/components/form/Switch/Switch.js +4 -4
  49. package/dist/_internal/components/form/Switch/Switch.metrics.js +5 -1
  50. package/dist/_internal/components/form/Switch/Switch.parts.js +3 -3
  51. package/dist/_internal/components/form/Switch/Switch.styles.js +2 -2
  52. package/dist/_internal/components/form/index.js +9 -9
  53. package/dist/_internal/components/index.js +38 -38
  54. package/dist/_internal/components/layout/CardGrid/CardGrid.js +2 -1
  55. package/dist/_internal/components/layout/Resizable/Resizable.helpers.js +8 -3
  56. package/dist/_internal/components/layout/Resizable/Resizable.hooks.js +3 -2
  57. package/dist/_internal/components/layout/Resizable/Resizable.js +4 -3
  58. package/dist/_internal/components/layout/ScrollArea/ScrollArea.helpers.js +1 -1
  59. package/dist/_internal/components/layout/ScrollArea/ScrollArea.js +2 -2
  60. package/dist/_internal/components/layout/index.js +5 -5
  61. package/dist/_internal/components/utility/InfiniteScroll/InfiniteScroll.hooks.js +1 -1
  62. package/dist/_internal/components/utility/InfiniteScroll/InfiniteScroll.js +4 -3
  63. package/dist/_internal/components/utility/InfiniteScroll/InfiniteScroll.parts.js +2 -1
  64. package/dist/_internal/components/utility/VirtualList/VirtualList.hooks.js +6 -3
  65. package/dist/_internal/components/utility/VirtualList/VirtualList.js +3 -2
  66. package/dist/_internal/components/utility/index.js +5 -5
  67. package/dist/{chunk-J2DAQQQH.js → chunk-222HN7GK.js} +33 -64
  68. package/dist/chunk-222HN7GK.js.map +1 -0
  69. package/dist/{chunk-MR2HKBHS.js → chunk-27LOJVR3.js} +2 -2
  70. package/dist/{chunk-S3D5VBHW.js → chunk-3YOXVNO4.js} +7 -7
  71. package/dist/{chunk-CZIX4BW2.js → chunk-4ALF5PB5.js} +3 -3
  72. package/dist/{chunk-XJPJ6ESI.js → chunk-4OAKGKK5.js} +3 -3
  73. package/dist/{chunk-4CHROSWR.js → chunk-5ETBB2DG.js} +2 -2
  74. package/dist/{chunk-ATSHKSSD.js → chunk-5KNDAC24.js} +20 -7
  75. package/dist/chunk-5KNDAC24.js.map +1 -0
  76. package/dist/{chunk-ULTOQ6ZV.js → chunk-5LWB4BYX.js} +80 -89
  77. package/dist/chunk-5LWB4BYX.js.map +1 -0
  78. package/dist/{chunk-46UPILLK.js → chunk-5NT2M2JI.js} +2 -2
  79. package/dist/{chunk-H5BEWPEY.js → chunk-6N2EDWMG.js} +2 -2
  80. package/dist/{chunk-GJQYM3PM.js → chunk-6PU3JYVY.js} +2 -2
  81. package/dist/{chunk-PUBPZOQJ.js → chunk-AG3DY5TH.js} +8 -5
  82. package/dist/chunk-AG3DY5TH.js.map +1 -0
  83. package/dist/{chunk-PPRV4LTM.js → chunk-BWHOCNGW.js} +4 -4
  84. package/dist/chunk-BWHOCNGW.js.map +1 -0
  85. package/dist/{chunk-TUBCN4DJ.js → chunk-CB6DTWD5.js} +7 -7
  86. package/dist/chunk-CB6DTWD5.js.map +1 -0
  87. package/dist/{chunk-ZAY6OA6F.js → chunk-D4FZ3ANG.js} +15 -5
  88. package/dist/chunk-D4FZ3ANG.js.map +1 -0
  89. package/dist/{chunk-Y7F5JBAT.js → chunk-DDRKYNPB.js} +2 -2
  90. package/dist/{chunk-DLJGBJZW.js → chunk-DGMDQHMI.js} +16 -9
  91. package/dist/chunk-DGMDQHMI.js.map +1 -0
  92. package/dist/{chunk-IAGOUTI6.js → chunk-DNT5PZLF.js} +21 -12
  93. package/dist/chunk-DNT5PZLF.js.map +1 -0
  94. package/dist/{chunk-DZA7RSLX.js → chunk-DVSO3EG6.js} +19 -11
  95. package/dist/chunk-DVSO3EG6.js.map +1 -0
  96. package/dist/{chunk-OS6KPL4D.js → chunk-EHYI2WCJ.js} +4 -4
  97. package/dist/{chunk-NB3FGWU4.js → chunk-EQXIW5MQ.js} +2 -2
  98. package/dist/{chunk-C66RGVAS.js → chunk-ERY6D2OV.js} +6 -4
  99. package/dist/chunk-ERY6D2OV.js.map +1 -0
  100. package/dist/{chunk-M2JTIH5M.js → chunk-F44R7US6.js} +2 -2
  101. package/dist/{chunk-AROBXRC5.js → chunk-F7JTIHV5.js} +18 -7
  102. package/dist/chunk-F7JTIHV5.js.map +1 -0
  103. package/dist/{chunk-T7DE44SP.js → chunk-FF2D7V7T.js} +6 -4
  104. package/dist/chunk-FF2D7V7T.js.map +1 -0
  105. package/dist/{chunk-XJJXBUPN.js → chunk-FX26DAFF.js} +2 -2
  106. package/dist/{chunk-R6SN73RX.js → chunk-GLHNMTP6.js} +7 -7
  107. package/dist/{chunk-YU26GBNX.js → chunk-H3AQQOTI.js} +9 -4
  108. package/dist/chunk-H3AQQOTI.js.map +1 -0
  109. package/dist/{chunk-HTZNB6IV.js → chunk-H5ZTIELC.js} +23 -8
  110. package/dist/chunk-H5ZTIELC.js.map +1 -0
  111. package/dist/{chunk-GSFNH4C5.js → chunk-HBP2OU4Q.js} +15 -8
  112. package/dist/chunk-HBP2OU4Q.js.map +1 -0
  113. package/dist/{chunk-I4QA2F4L.js → chunk-HBRQPG7H.js} +5 -5
  114. package/dist/{chunk-HGMBY5LP.js → chunk-HQWJUHR4.js} +18 -11
  115. package/dist/chunk-HQWJUHR4.js.map +1 -0
  116. package/dist/{chunk-CNQUCNEA.js → chunk-I3F4C5SS.js} +3 -3
  117. package/dist/{chunk-UFJYJHQI.js → chunk-J5VWGQSR.js} +2 -2
  118. package/dist/{chunk-MTFCPPZ5.js → chunk-JWZJSXI5.js} +3 -2
  119. package/dist/chunk-JWZJSXI5.js.map +1 -0
  120. package/dist/{chunk-4JFL62K3.js → chunk-K7FSTB2K.js} +3 -3
  121. package/dist/{chunk-FFCJ7NR2.js → chunk-KRQUPE4K.js} +4 -4
  122. package/dist/{chunk-2OYFTSG4.js → chunk-KXLUMEDX.js} +2 -2
  123. package/dist/{chunk-DVAAUWTC.js → chunk-LCHCE2G5.js} +2 -2
  124. package/dist/{chunk-G4HBNILE.js → chunk-LEHMWJNZ.js} +3 -3
  125. package/dist/{chunk-P6TNXBDA.js → chunk-MYKWJCR7.js} +9 -9
  126. package/dist/chunk-MYKWJCR7.js.map +1 -0
  127. package/dist/{chunk-TQ6FPOPD.js → chunk-ODW2D5PN.js} +39 -30
  128. package/dist/chunk-ODW2D5PN.js.map +1 -0
  129. package/dist/{chunk-RZYSKQTS.js → chunk-PCBZYORN.js} +3 -3
  130. package/dist/{chunk-5OBXEMQO.js → chunk-PRIBOWX4.js} +3 -3
  131. package/dist/{chunk-F42MJOHM.js → chunk-PVM7XTLZ.js} +64 -62
  132. package/dist/chunk-PVM7XTLZ.js.map +1 -0
  133. package/dist/{chunk-3TDVGZZN.js → chunk-QBTBRJ2Q.js} +37 -13
  134. package/dist/chunk-QBTBRJ2Q.js.map +1 -0
  135. package/dist/{chunk-2WFDHFK4.js → chunk-QNCWSDXE.js} +26 -11
  136. package/dist/chunk-QNCWSDXE.js.map +1 -0
  137. package/dist/{chunk-PQECNGDE.js → chunk-QSRZOXQI.js} +2 -2
  138. package/dist/{chunk-RHIDWUK7.js → chunk-QUWK7SYN.js} +1 -2
  139. package/dist/chunk-QUWK7SYN.js.map +1 -0
  140. package/dist/{chunk-UN5INW6K.js → chunk-R53ZOW4B.js} +8 -4
  141. package/dist/chunk-R53ZOW4B.js.map +1 -0
  142. package/dist/{chunk-DCJSHYE5.js → chunk-RSDYS5B3.js} +4 -4
  143. package/dist/{chunk-N5GVW6RO.js → chunk-S6IWKDWT.js} +2 -2
  144. package/dist/{chunk-TKC6WHGB.js → chunk-SBIZXZPP.js} +2 -2
  145. package/dist/{chunk-D5SZXH7Q.js → chunk-TNBJ4DK4.js} +7 -3
  146. package/dist/chunk-TNBJ4DK4.js.map +1 -0
  147. package/dist/{chunk-PMOEG36E.js → chunk-XZJM6EPC.js} +8 -6
  148. package/dist/chunk-XZJM6EPC.js.map +1 -0
  149. package/dist/{chunk-QF6LTUCE.js → chunk-Y2X7LYIN.js} +4 -4
  150. package/dist/chunk-Y2X7LYIN.js.map +1 -0
  151. package/dist/{chunk-UEVHI62V.js → chunk-YCCY77W5.js} +2 -2
  152. package/dist/{chunk-DF4K5XVW.js → chunk-YZVR5ROE.js} +14 -6
  153. package/dist/chunk-YZVR5ROE.js.map +1 -0
  154. package/dist/{chunk-AUSUCZYR.js → chunk-ZBVU2YWV.js} +5 -5
  155. package/dist/chunk-ZBVU2YWV.js.map +1 -0
  156. package/dist/{chunk-VZIB5W5L.js → chunk-ZGCPDA3F.js} +2 -2
  157. package/dist/data-display/DataGrid.js +4 -4
  158. package/dist/data-display/DataViews.js +29 -29
  159. package/dist/data-display/FleetMap.js +10 -10
  160. package/dist/data-display/LazyImage.js +1 -1
  161. package/dist/data-display/MapPreview.js +7 -7
  162. package/dist/data-display/Table.js +4 -4
  163. package/dist/form/Calendar.js +5 -4
  164. package/dist/form/DateRangePicker.js +5 -5
  165. package/dist/form/Switch.js +4 -4
  166. package/dist/layout/CardGrid.js +2 -1
  167. package/dist/layout/Resizable.js +4 -3
  168. package/dist/layout/ScrollArea.js +2 -2
  169. package/dist/native/form/Switch.js +3 -1
  170. package/dist/native/form/Switch.js.map +1 -1
  171. package/dist/types/components/data-display/DataGrid/DataGrid.body.d.ts.map +1 -1
  172. package/dist/types/components/data-display/DataGrid/DataGrid.cells.d.ts +4 -2
  173. package/dist/types/components/data-display/DataGrid/DataGrid.cells.d.ts.map +1 -1
  174. package/dist/types/components/data-display/DataGrid/DataGrid.model.d.ts +7 -1
  175. package/dist/types/components/data-display/DataGrid/DataGrid.model.d.ts.map +1 -1
  176. package/dist/types/components/data-display/DataGrid/DataGrid.types.d.ts +10 -4
  177. package/dist/types/components/data-display/DataGrid/DataGrid.types.d.ts.map +1 -1
  178. package/dist/types/components/data-display/DataViews/data-views-columns.d.ts.map +1 -1
  179. package/dist/types/components/data-display/DataViews/data-views-grid-helpers.d.ts +2 -0
  180. package/dist/types/components/data-display/DataViews/data-views-grid-helpers.d.ts.map +1 -1
  181. package/dist/types/components/data-display/DataViews/data-views-layout-context.d.ts +7 -3
  182. package/dist/types/components/data-display/DataViews/data-views-layout-context.d.ts.map +1 -1
  183. package/dist/types/components/data-display/DataViews/data-views-overflow-costs.d.ts +19 -9
  184. package/dist/types/components/data-display/DataViews/data-views-overflow-costs.d.ts.map +1 -1
  185. package/dist/types/components/data-display/DataViews/data-views-overflow.d.ts.map +1 -1
  186. package/dist/types/components/data-display/LazyImage/LazyImage.d.ts.map +1 -1
  187. package/dist/types/components/data-display/LazyImage/LazyImage.types.d.ts +3 -1
  188. package/dist/types/components/data-display/LazyImage/LazyImage.types.d.ts.map +1 -1
  189. package/dist/types/components/data-display/MapPreview/MapTiles.d.ts.map +1 -1
  190. package/dist/types/components/data-display/MapPreview/mapProjection.d.ts +6 -1
  191. package/dist/types/components/data-display/MapPreview/mapProjection.d.ts.map +1 -1
  192. package/dist/types/components/data-display/Table/Table.helpers.d.ts +6 -0
  193. package/dist/types/components/data-display/Table/Table.helpers.d.ts.map +1 -1
  194. package/dist/types/components/data-display/Table/Table.hooks.d.ts +9 -1
  195. package/dist/types/components/data-display/Table/Table.hooks.d.ts.map +1 -1
  196. package/dist/types/components/data-display/Table/Table.types.d.ts +6 -2
  197. package/dist/types/components/data-display/Table/Table.types.d.ts.map +1 -1
  198. package/dist/types/components/data-display/Table/TableParts.d.ts +2 -0
  199. package/dist/types/components/data-display/Table/TableParts.d.ts.map +1 -1
  200. package/dist/types/components/form/Calendar/Calendar.d.ts.map +1 -1
  201. package/dist/types/components/form/Calendar/CalendarDay.d.ts.map +1 -1
  202. package/dist/types/components/form/Calendar/CalendarMonth.d.ts.map +1 -1
  203. package/dist/types/components/form/Switch/Switch.metrics.d.ts +13 -3
  204. package/dist/types/components/form/Switch/Switch.metrics.d.ts.map +1 -1
  205. package/dist/types/components/form/Switch/Switch.styles.d.ts.map +1 -1
  206. package/dist/types/components/layout/CardGrid/CardGrid.d.ts +9 -7
  207. package/dist/types/components/layout/CardGrid/CardGrid.d.ts.map +1 -1
  208. package/dist/types/components/layout/Resizable/Resizable.d.ts.map +1 -1
  209. package/dist/types/components/layout/Resizable/Resizable.helpers.d.ts +21 -9
  210. package/dist/types/components/layout/Resizable/Resizable.helpers.d.ts.map +1 -1
  211. package/dist/types/components/layout/Resizable/Resizable.hooks.d.ts +13 -3
  212. package/dist/types/components/layout/Resizable/Resizable.hooks.d.ts.map +1 -1
  213. package/dist/types/components/layout/Resizable/Resizable.types.d.ts +10 -0
  214. package/dist/types/components/layout/Resizable/Resizable.types.d.ts.map +1 -1
  215. package/dist/types/components/layout/ScrollArea/ScrollArea.d.ts.map +1 -1
  216. package/dist/types/components/layout/ScrollArea/ScrollArea.helpers.d.ts +1 -1
  217. package/dist/types/components/layout/ScrollArea/ScrollArea.helpers.d.ts.map +1 -1
  218. package/dist/types/components/layout/ScrollArea/ScrollArea.types.d.ts +4 -1
  219. package/dist/types/components/layout/ScrollArea/ScrollArea.types.d.ts.map +1 -1
  220. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.d.ts.map +1 -1
  221. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.hooks.d.ts +3 -2
  222. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.hooks.d.ts.map +1 -1
  223. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.parts.d.ts +3 -2
  224. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.parts.d.ts.map +1 -1
  225. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.types.d.ts +9 -0
  226. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.types.d.ts.map +1 -1
  227. package/dist/types/components/utility/VirtualList/VirtualList.d.ts.map +1 -1
  228. package/dist/types/components/utility/VirtualList/VirtualList.hooks.d.ts +24 -28
  229. package/dist/types/components/utility/VirtualList/VirtualList.hooks.d.ts.map +1 -1
  230. package/dist/types/components/utility/VirtualList/VirtualList.types.d.ts +17 -0
  231. package/dist/types/components/utility/VirtualList/VirtualList.types.d.ts.map +1 -1
  232. package/dist/types-native/components/form/Switch/Switch.metrics.d.ts +13 -3
  233. package/dist/types-native/components/form/Switch/Switch.metrics.d.ts.map +1 -1
  234. package/dist/utility/InfiniteScroll.js +4 -3
  235. package/dist/utility/VirtualList.js +3 -2
  236. package/package.json +1 -1
  237. package/src/components/data-display/DataGrid/DataGrid.body.tsx +27 -7
  238. package/src/components/data-display/DataGrid/DataGrid.cells.tsx +33 -9
  239. package/src/components/data-display/DataGrid/DataGrid.model.ts +24 -11
  240. package/src/components/data-display/DataGrid/DataGrid.types.ts +12 -6
  241. package/src/components/data-display/DataViews/data-views-columns.ts +14 -3
  242. package/src/components/data-display/DataViews/data-views-grid-helpers.tsx +5 -3
  243. package/src/components/data-display/DataViews/data-views-layout-context.tsx +12 -9
  244. package/src/components/data-display/DataViews/data-views-overflow-costs.ts +32 -14
  245. package/src/components/data-display/DataViews/data-views-overflow.ts +40 -26
  246. package/src/components/data-display/LazyImage/LazyImage.tsx +5 -3
  247. package/src/components/data-display/LazyImage/LazyImage.types.ts +3 -1
  248. package/src/components/data-display/MapPreview/MapTiles.tsx +16 -9
  249. package/src/components/data-display/MapPreview/mapProjection.ts +10 -5
  250. package/src/components/data-display/Table/Table.helpers.ts +7 -1
  251. package/src/components/data-display/Table/Table.hooks.ts +16 -5
  252. package/src/components/data-display/Table/Table.types.ts +6 -2
  253. package/src/components/data-display/Table/TableParts.tsx +38 -42
  254. package/src/components/form/Calendar/Calendar.tsx +4 -2
  255. package/src/components/form/Calendar/CalendarDay.tsx +6 -3
  256. package/src/components/form/Calendar/CalendarMonth.tsx +6 -3
  257. package/src/components/form/Switch/Switch.metrics.ts +19 -5
  258. package/src/components/form/Switch/Switch.styles.ts +5 -3
  259. package/src/components/layout/CardGrid/CardGrid.tsx +37 -24
  260. package/src/components/layout/Resizable/Resizable.helpers.ts +43 -21
  261. package/src/components/layout/Resizable/Resizable.hooks.ts +17 -9
  262. package/src/components/layout/Resizable/Resizable.md +9 -5
  263. package/src/components/layout/Resizable/Resizable.tsx +20 -8
  264. package/src/components/layout/Resizable/Resizable.types.ts +10 -0
  265. package/src/components/layout/ScrollArea/ScrollArea.helpers.ts +0 -2
  266. package/src/components/layout/ScrollArea/ScrollArea.tsx +5 -3
  267. package/src/components/layout/ScrollArea/ScrollArea.types.ts +4 -1
  268. package/src/components/utility/InfiniteScroll/InfiniteScroll.hooks.ts +5 -4
  269. package/src/components/utility/InfiniteScroll/InfiniteScroll.parts.tsx +29 -12
  270. package/src/components/utility/InfiniteScroll/InfiniteScroll.tsx +11 -5
  271. package/src/components/utility/InfiniteScroll/InfiniteScroll.types.ts +10 -2
  272. package/src/components/utility/VirtualList/VirtualList.hooks.ts +101 -112
  273. package/src/components/utility/VirtualList/VirtualList.tsx +36 -65
  274. package/src/components/utility/VirtualList/VirtualList.types.ts +20 -3
  275. package/dist/chunk-2WFDHFK4.js.map +0 -1
  276. package/dist/chunk-3TDVGZZN.js.map +0 -1
  277. package/dist/chunk-AROBXRC5.js.map +0 -1
  278. package/dist/chunk-ATSHKSSD.js.map +0 -1
  279. package/dist/chunk-AUSUCZYR.js.map +0 -1
  280. package/dist/chunk-C66RGVAS.js.map +0 -1
  281. package/dist/chunk-D5SZXH7Q.js.map +0 -1
  282. package/dist/chunk-DF4K5XVW.js.map +0 -1
  283. package/dist/chunk-DLJGBJZW.js.map +0 -1
  284. package/dist/chunk-DZA7RSLX.js.map +0 -1
  285. package/dist/chunk-F42MJOHM.js.map +0 -1
  286. package/dist/chunk-GSFNH4C5.js.map +0 -1
  287. package/dist/chunk-HGMBY5LP.js.map +0 -1
  288. package/dist/chunk-HTZNB6IV.js.map +0 -1
  289. package/dist/chunk-IAGOUTI6.js.map +0 -1
  290. package/dist/chunk-J2DAQQQH.js.map +0 -1
  291. package/dist/chunk-MTFCPPZ5.js.map +0 -1
  292. package/dist/chunk-P6TNXBDA.js.map +0 -1
  293. package/dist/chunk-PMOEG36E.js.map +0 -1
  294. package/dist/chunk-PPRV4LTM.js.map +0 -1
  295. package/dist/chunk-PUBPZOQJ.js.map +0 -1
  296. package/dist/chunk-QF6LTUCE.js.map +0 -1
  297. package/dist/chunk-RHIDWUK7.js.map +0 -1
  298. package/dist/chunk-T7DE44SP.js.map +0 -1
  299. package/dist/chunk-TQ6FPOPD.js.map +0 -1
  300. package/dist/chunk-TUBCN4DJ.js.map +0 -1
  301. package/dist/chunk-ULTOQ6ZV.js.map +0 -1
  302. package/dist/chunk-UN5INW6K.js.map +0 -1
  303. package/dist/chunk-YU26GBNX.js.map +0 -1
  304. package/dist/chunk-ZAY6OA6F.js.map +0 -1
  305. /package/dist/{chunk-MR2HKBHS.js.map → chunk-27LOJVR3.js.map} +0 -0
  306. /package/dist/{chunk-S3D5VBHW.js.map → chunk-3YOXVNO4.js.map} +0 -0
  307. /package/dist/{chunk-CZIX4BW2.js.map → chunk-4ALF5PB5.js.map} +0 -0
  308. /package/dist/{chunk-XJPJ6ESI.js.map → chunk-4OAKGKK5.js.map} +0 -0
  309. /package/dist/{chunk-4CHROSWR.js.map → chunk-5ETBB2DG.js.map} +0 -0
  310. /package/dist/{chunk-46UPILLK.js.map → chunk-5NT2M2JI.js.map} +0 -0
  311. /package/dist/{chunk-H5BEWPEY.js.map → chunk-6N2EDWMG.js.map} +0 -0
  312. /package/dist/{chunk-GJQYM3PM.js.map → chunk-6PU3JYVY.js.map} +0 -0
  313. /package/dist/{chunk-Y7F5JBAT.js.map → chunk-DDRKYNPB.js.map} +0 -0
  314. /package/dist/{chunk-OS6KPL4D.js.map → chunk-EHYI2WCJ.js.map} +0 -0
  315. /package/dist/{chunk-NB3FGWU4.js.map → chunk-EQXIW5MQ.js.map} +0 -0
  316. /package/dist/{chunk-M2JTIH5M.js.map → chunk-F44R7US6.js.map} +0 -0
  317. /package/dist/{chunk-XJJXBUPN.js.map → chunk-FX26DAFF.js.map} +0 -0
  318. /package/dist/{chunk-R6SN73RX.js.map → chunk-GLHNMTP6.js.map} +0 -0
  319. /package/dist/{chunk-I4QA2F4L.js.map → chunk-HBRQPG7H.js.map} +0 -0
  320. /package/dist/{chunk-CNQUCNEA.js.map → chunk-I3F4C5SS.js.map} +0 -0
  321. /package/dist/{chunk-UFJYJHQI.js.map → chunk-J5VWGQSR.js.map} +0 -0
  322. /package/dist/{chunk-4JFL62K3.js.map → chunk-K7FSTB2K.js.map} +0 -0
  323. /package/dist/{chunk-FFCJ7NR2.js.map → chunk-KRQUPE4K.js.map} +0 -0
  324. /package/dist/{chunk-2OYFTSG4.js.map → chunk-KXLUMEDX.js.map} +0 -0
  325. /package/dist/{chunk-DVAAUWTC.js.map → chunk-LCHCE2G5.js.map} +0 -0
  326. /package/dist/{chunk-G4HBNILE.js.map → chunk-LEHMWJNZ.js.map} +0 -0
  327. /package/dist/{chunk-RZYSKQTS.js.map → chunk-PCBZYORN.js.map} +0 -0
  328. /package/dist/{chunk-5OBXEMQO.js.map → chunk-PRIBOWX4.js.map} +0 -0
  329. /package/dist/{chunk-PQECNGDE.js.map → chunk-QSRZOXQI.js.map} +0 -0
  330. /package/dist/{chunk-DCJSHYE5.js.map → chunk-RSDYS5B3.js.map} +0 -0
  331. /package/dist/{chunk-N5GVW6RO.js.map → chunk-S6IWKDWT.js.map} +0 -0
  332. /package/dist/{chunk-TKC6WHGB.js.map → chunk-SBIZXZPP.js.map} +0 -0
  333. /package/dist/{chunk-UEVHI62V.js.map → chunk-YCCY77W5.js.map} +0 -0
  334. /package/dist/{chunk-VZIB5W5L.js.map → chunk-ZGCPDA3F.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/layout/CardGrid/CardGrid.tsx"],"sourcesContent":["import { useTheme, type Theme } from \"@mui/material/styles/index.js\";\nimport { Children, type CSSProperties, type ReactNode, type Ref } from \"react\";\n\nimport { rem } from \"../../../tokens/relative\";\nimport { cn } from \"../../../utils/cn\";\n\n/**\n * How the grid turns surplus row space into layout:\n *\n * - `\"fixed\"` — every column is exactly `cardWidth` design px; leftover row space is\n * spread as even gutters (`justify-content: space-around`). Cards never resize;\n * the column count changes with the viewport. This is the original tabwoah\n * card-grid behavior.\n * - `\"fluid\"` — every column is *at least* `cardWidth` px and stretches (`1fr`)\n * to fill the row, so cards grow to use the whole width. A lone card stays\n * left-aligned at a single track's width rather than stretching edge to edge.\n * - `\"scroll\"` — a single row that scrolls horizontally, with fluid-width cards\n * sized from the container so that exactly {@link SCROLL_VISIBLE_CARDS} cards\n * plus a `GRID.peekPx` sliver of the next one fit on screen (up\n * to `maxCardWidth`, past which more cards simply fit). The sliver is the\n * point: it makes the rail visibly continue past the fold, so the row reads as\n * swipeable instead of as a finished pair of cards. Wrapping is off; the row\n * overflows on the x and scroll-snaps to each card's start so a swipe lands on\n * a clean card boundary.\n */\nexport type CardGridVariant = \"fixed\" | \"fluid\" | \"scroll\";\n\n/**\n * The grid's own lengths, in design px — every one drawn through `rem`, so the\n * `gap` the grid lays out with and the gap the scroll track math reserves are\n * the same length at any type scale.\n */\nconst GRID = {\n /** Between cards: the grid's `gap`, and what the scroll math reserves per gap. */\n gapPx: 16,\n /**\n * `scroll`: the next card left visible past the last whole one — the\n * \"there's more, swipe\" hint. Wide enough to read as a clipped card (rounded\n * edge + a slice of its photo) rather than as a rendering glitch.\n */\n peekPx: 28,\n /** Under the row — the tabwoah original's Tailwind `pb-0.5`. */\n paddingBottomPx: 2,\n} as const;\n\n/** `scroll`: how many WHOLE cards the rail commits to showing at once. */\nconst SCROLL_VISIBLE_CARDS = 2;\n\n/**\n * The `scroll` track width: the widest a card can be while the container still\n * shows `SCROLL_VISIBLE_CARDS` of them plus the peek — or, when there is nothing\n * to scroll to, while the cards still divide the row evenly. Capped at `max` so\n * a desktop-width rail packs in more cards instead of inflating them.\n *\n * The container (`100%`) has to cover, in the overflow case: N cards, the N gaps\n * that follow them (one between each pair, one before the peeked card), and the\n * peek. With no overflow there are only N-1 gaps and no peek.\n */\nfunction scrollTrackWidth(theme: Theme, count: number, max: number): string {\n const tracks = Math.max(1, Math.min(count, SCROLL_VISIBLE_CARDS));\n const overflows = count > tracks;\n const gaps = overflows ? tracks : tracks - 1;\n const reserved = gaps * GRID.gapPx + (overflows ? GRID.peekPx : 0);\n return `min(${rem(theme, max)}, calc((100% - ${rem(theme, reserved)}) / ${tracks}))`;\n}\n\ninterface CardGridProps {\n /**\n * `\"fixed\"`: the exact column width. `\"fluid\"`: the minimum column width\n * (columns grow from here). `\"scroll\"`: only seeds the default `maxCardWidth`\n * — a scroll track has no minimum, because a minimum is exactly what would\n * break the \"two cards plus a peek\" promise on a narrow phone.\n *\n * Design px, scaled with the theme's type scale.\n */\n cardWidth: number;\n /**\n * `\"scroll\"` only: the maximum fluid card width. Defaults to\n * `1.6 × cardWidth`. Design px, scaled with the theme's type scale.\n */\n maxCardWidth?: number;\n /** Layout behavior — see {@link CardGridVariant}. Defaults to `\"fixed\"`. */\n variant?: CardGridVariant;\n /** Additional classes appended to the default grid container */\n className?: string;\n /** `data-testid` for the grid container */\n gridTestId?: string;\n /** Ref forwarded to the grid container (used by `useMaxRowsHeight` clipping). */\n containerRef?: Ref<HTMLDivElement>;\n children: ReactNode;\n}\n\n/**\n * Shared grid container for card layouts. Renders responsive columns via CSS\n * grid, in one of three variants (see {@link CardGridVariant}).\n *\n * Ported from the tabwoah card grid (the `\"fixed\"` variant is verbatim). The one\n * adaptation: that app is Tailwind (`className=\"grid gap-4 pb-0.5\"`); this one\n * has no Tailwind, so those three utilities (display:grid, gap 16 design px,\n * padding-bottom 2 design px) live in `style`, drawn through `rem`.\n */\nexport function CardGrid({\n cardWidth,\n maxCardWidth,\n variant = \"fixed\",\n className,\n gridTestId,\n containerRef,\n children,\n}: CardGridProps) {\n const theme = useTheme();\n const style: CSSProperties = {\n display: \"grid\",\n gap: rem(theme, GRID.gapPx),\n paddingBottom: rem(theme, GRID.paddingBottomPx),\n };\n\n if (variant === \"scroll\") {\n const max = maxCardWidth ?? Math.round(cardWidth * 1.6);\n // One row, laid out as implicit columns, that scrolls sideways. Each column\n // is derived from the container so two whole cards plus a peek of the third\n // always fit (see `scrollTrackWidth`). Scroll-snap makes a swipe settle on a\n // card boundary instead of drifting mid-card.\n style.gridAutoFlow = \"column\";\n style.gridAutoColumns = scrollTrackWidth(theme, Children.count(children), max);\n style.overflowX = \"auto\";\n style.overflowY = \"hidden\";\n style.scrollSnapType = \"x mandatory\";\n } else if (variant === \"fluid\") {\n style.gridTemplateColumns = `repeat(auto-fill, minmax(${rem(theme, cardWidth)}, 1fr))`;\n } else {\n style.gridTemplateColumns = `repeat(auto-fill, ${rem(theme, cardWidth)})`;\n // `space-around` only distributes leftover width in the fixed variant; the\n // fluid variant consumes it via `1fr` and scroll overflows instead.\n style.justifyContent = \"space-around\";\n }\n\n // In the scroll variant each card is a snap target, so a swipe aligns to its\n // start. The snap-align sits on a wrapper (the grid item) so callers' children\n // stay untouched; the other variants render children directly.\n const content =\n variant === \"scroll\"\n ? Children.map(children, (child) => (\n <div style={{ scrollSnapAlign: \"start\" }}>{child}</div>\n ))\n : children;\n\n return (\n <div ref={containerRef} className={cn(className)} style={style} data-testid={gridTestId}>\n {content}\n </div>\n );\n}\n"],"mappings":";;;;;;;;AAAA,SAAS,gBAA4B;AACrC,SAAS,gBAA8D;AA8I7D;AA/GV,IAAM,OAAO;AAAA;AAAA,EAEX,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMP,QAAQ;AAAA;AAAA,EAER,iBAAiB;AACnB;AAGA,IAAM,uBAAuB;AAY7B,SAAS,iBAAiB,OAAc,OAAe,KAAqB;AAC1E,QAAM,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,oBAAoB,CAAC;AAChE,QAAM,YAAY,QAAQ;AAC1B,QAAM,OAAO,YAAY,SAAS,SAAS;AAC3C,QAAM,WAAW,OAAO,KAAK,SAAS,YAAY,KAAK,SAAS;AAChE,SAAO,OAAO,IAAI,OAAO,GAAG,CAAC,kBAAkB,IAAI,OAAO,QAAQ,CAAC,OAAO,MAAM;AAClF;AAqCO,SAAS,SAAS;AAAA,EACvB;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAkB;AAChB,QAAM,QAAQ,SAAS;AACvB,QAAM,QAAuB;AAAA,IAC3B,SAAS;AAAA,IACT,KAAK,IAAI,OAAO,KAAK,KAAK;AAAA,IAC1B,eAAe,IAAI,OAAO,KAAK,eAAe;AAAA,EAChD;AAEA,MAAI,YAAY,UAAU;AACxB,UAAM,MAAM,gBAAgB,KAAK,MAAM,YAAY,GAAG;AAKtD,UAAM,eAAe;AACrB,UAAM,kBAAkB,iBAAiB,OAAO,SAAS,MAAM,QAAQ,GAAG,GAAG;AAC7E,UAAM,YAAY;AAClB,UAAM,YAAY;AAClB,UAAM,iBAAiB;AAAA,EACzB,WAAW,YAAY,SAAS;AAC9B,UAAM,sBAAsB,4BAA4B,IAAI,OAAO,SAAS,CAAC;AAAA,EAC/E,OAAO;AACL,UAAM,sBAAsB,qBAAqB,IAAI,OAAO,SAAS,CAAC;AAGtE,UAAM,iBAAiB;AAAA,EACzB;AAKA,QAAM,UACJ,YAAY,WACR,SAAS,IAAI,UAAU,CAAC,UACtB,oBAAC,SAAI,OAAO,EAAE,iBAAiB,QAAQ,GAAI,iBAAM,CAClD,IACD;AAEN,SACE,oBAAC,SAAI,KAAK,cAAc,WAAW,GAAG,SAAS,GAAG,OAAc,eAAa,YAC1E,mBACH;AAEJ;","names":[]}
@@ -4,7 +4,7 @@ import {
4
4
  useMapPointer,
5
5
  useMapSearch,
6
6
  useMapView
7
- } from "./chunk-46UPILLK.js";
7
+ } from "./chunk-5NT2M2JI.js";
8
8
 
9
9
  // src/components/data-display/MapPreview/useMapPreview.ts
10
10
  import { useMemo, useRef } from "react";
@@ -53,4 +53,4 @@ var useMapPreview = (props) => {
53
53
  export {
54
54
  useMapPreview
55
55
  };
56
- //# sourceMappingURL=chunk-PQECNGDE.js.map
56
+ //# sourceMappingURL=chunk-QSRZOXQI.js.map
@@ -9,7 +9,6 @@ var SCROLL_AREA_DEFAULTS = {
9
9
  smoothScroll: true,
10
10
  variant: "default",
11
11
  scrollToTopButton: false,
12
- scrollToTopThreshold: 100,
13
12
  contentPadding: 0,
14
13
  alwaysShowScrollbar: false,
15
14
  disabled: false,
@@ -26,4 +25,4 @@ var resolveScrollAreaProps = (props) => ({
26
25
  export {
27
26
  resolveScrollAreaProps
28
27
  };
29
- //# sourceMappingURL=chunk-RHIDWUK7.js.map
28
+ //# sourceMappingURL=chunk-QUWK7SYN.js.map
@@ -0,0 +1 @@
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 | '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 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":";AAqBA,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,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":[]}
@@ -6,7 +6,11 @@ import {
6
6
  } from "./chunk-SUALMVL7.js";
7
7
  import {
8
8
  CalendarMonth
9
- } from "./chunk-PUBPZOQJ.js";
9
+ } from "./chunk-AG3DY5TH.js";
10
+ import {
11
+ rem,
12
+ sxRem
13
+ } from "./chunk-YKCAJ2TN.js";
10
14
 
11
15
  // src/components/form/Calendar/Calendar.tsx
12
16
  import Box from "@mui/material/Box/index.js";
@@ -20,9 +24,9 @@ var containerSx = (monthsToShow) => ({
20
24
  gap: 3,
21
25
  outline: "none",
22
26
  "&:focus-within": {
23
- outline: "2px solid",
27
+ outline: (theme) => `${rem(theme, 2)} solid`,
24
28
  outlineColor: "primary.main",
25
- outlineOffset: 2
29
+ outlineOffset: sxRem(2)
26
30
  }
27
31
  });
28
32
  var Calendar = React.forwardRef((componentProps, ref) => {
@@ -83,4 +87,4 @@ export {
83
87
  Calendar,
84
88
  Calendar_default
85
89
  };
86
- //# sourceMappingURL=chunk-UN5INW6K.js.map
90
+ //# sourceMappingURL=chunk-R53ZOW4B.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/form/Calendar/Calendar.tsx"],"sourcesContent":["import type { SxProps, Theme } from '@mui/material/styles/index.js';\nimport Box from '@mui/material/Box/index.js';\nimport Paper from '@mui/material/Paper/index.js';\nimport React from 'react';\n\nimport { rem, sxRem } from '../../../tokens/relative';\n\nimport { resolveCalendarProps } from './Calendar.helpers';\nimport { useCalendar } from './Calendar.hooks';\nimport type { CalendarProps } from './Calendar.types';\nimport type { DayCellContext } from './CalendarDayCell';\nimport { CalendarMonth } from './CalendarMonth';\n\nconst containerSx = (monthsToShow: number): SxProps<Theme> => ({\n p: 3,\n display: 'flex',\n flexDirection: monthsToShow > 1 ? 'row' : 'column',\n gap: 3,\n outline: 'none',\n '&:focus-within': {\n outline: (theme: Theme) => `${rem(theme, 2)} solid`,\n outlineColor: 'primary.main',\n outlineOffset: sxRem(2),\n },\n});\n\nexport const Calendar = React.forwardRef<HTMLDivElement, CalendarProps>((componentProps, ref) => {\n const props = resolveCalendarProps(componentProps);\n const { monthsToShow, locale, renderHeader, renderFooter, className, ariaLabel } = props;\n\n const calendar = useCalendar(props);\n\n const dayContext: DayCellContext = {\n selectionMode: props.selectionMode,\n value: props.value,\n range: props.range,\n showOutsideDays: props.showOutsideDays,\n renderDay: props.renderDay,\n dayClassName: props.dayClassName,\n hoveredDate: calendar.hoveredDate,\n focusedDate: calendar.focusedDate,\n today: calendar.today,\n isDisabled: calendar.isDisabled,\n onSelect: calendar.handleDateClick,\n onHover: calendar.handleDateMouseEnter,\n onHoverEnd: calendar.handleDateMouseLeave,\n };\n\n return (\n <Paper\n ref={ref}\n className={className}\n role=\"application\"\n aria-label={ariaLabel}\n tabIndex={0}\n onKeyDown={calendar.handleKeyDown}\n data-testid=\"calendar-container\"\n sx={containerSx(monthsToShow)}\n >\n <Box ref={calendar.gridRef} sx={{ display: 'flex', gap: 3, flexWrap: 'wrap' }}>\n {calendar.monthMatrices.map((matrix, index) => (\n <CalendarMonth\n key={`month-${matrix.year}-${matrix.month}`}\n matrix={matrix}\n monthIndex={index}\n monthsToShow={monthsToShow}\n locale={locale}\n weekdayNames={calendar.weekdayNames}\n renderHeader={renderHeader}\n onPreviousMonth={calendar.goToPreviousMonth}\n onNextMonth={calendar.goToNextMonth}\n dayContext={dayContext}\n />\n ))}\n </Box>\n\n {renderFooter && (\n <Box sx={{ mt: 2, pt: 2, borderTop: 1, borderColor: 'divider' }}>{renderFooter}</Box>\n )}\n </Paper>\n );\n});\n\nCalendar.displayName = 'Calendar';\n\nexport default Calendar;\n"],"mappings":";;;;;;;;;;;;;;;AACA,OAAO,SAAS;AAChB,OAAO,WAAW;AAClB,OAAO,WAAW;AA8Cd,SAYM,KAZN;AApCJ,IAAM,cAAc,CAAC,kBAA0C;AAAA,EAC7D,GAAG;AAAA,EACH,SAAS;AAAA,EACT,eAAe,eAAe,IAAI,QAAQ;AAAA,EAC1C,KAAK;AAAA,EACL,SAAS;AAAA,EACT,kBAAkB;AAAA,IAChB,SAAS,CAAC,UAAiB,GAAG,IAAI,OAAO,CAAC,CAAC;AAAA,IAC3C,cAAc;AAAA,IACd,eAAe,MAAM,CAAC;AAAA,EACxB;AACF;AAEO,IAAM,WAAW,MAAM,WAA0C,CAAC,gBAAgB,QAAQ;AAC/F,QAAM,QAAQ,qBAAqB,cAAc;AACjD,QAAM,EAAE,cAAc,QAAQ,cAAc,cAAc,WAAW,UAAU,IAAI;AAEnF,QAAM,WAAW,YAAY,KAAK;AAElC,QAAM,aAA6B;AAAA,IACjC,eAAe,MAAM;AAAA,IACrB,OAAO,MAAM;AAAA,IACb,OAAO,MAAM;AAAA,IACb,iBAAiB,MAAM;AAAA,IACvB,WAAW,MAAM;AAAA,IACjB,cAAc,MAAM;AAAA,IACpB,aAAa,SAAS;AAAA,IACtB,aAAa,SAAS;AAAA,IACtB,OAAO,SAAS;AAAA,IAChB,YAAY,SAAS;AAAA,IACrB,UAAU,SAAS;AAAA,IACnB,SAAS,SAAS;AAAA,IAClB,YAAY,SAAS;AAAA,EACvB;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,MAAK;AAAA,MACL,cAAY;AAAA,MACZ,UAAU;AAAA,MACV,WAAW,SAAS;AAAA,MACpB,eAAY;AAAA,MACZ,IAAI,YAAY,YAAY;AAAA,MAE5B;AAAA,4BAAC,OAAI,KAAK,SAAS,SAAS,IAAI,EAAE,SAAS,QAAQ,KAAK,GAAG,UAAU,OAAO,GACzE,mBAAS,cAAc,IAAI,CAAC,QAAQ,UACnC;AAAA,UAAC;AAAA;AAAA,YAEC;AAAA,YACA,YAAY;AAAA,YACZ;AAAA,YACA;AAAA,YACA,cAAc,SAAS;AAAA,YACvB;AAAA,YACA,iBAAiB,SAAS;AAAA,YAC1B,aAAa,SAAS;AAAA,YACtB;AAAA;AAAA,UATK,SAAS,OAAO,IAAI,IAAI,OAAO,KAAK;AAAA,QAU3C,CACD,GACH;AAAA,QAEC,gBACC,oBAAC,OAAI,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,WAAW,GAAG,aAAa,UAAU,GAAI,wBAAa;AAAA;AAAA;AAAA,EAEnF;AAEJ,CAAC;AAED,SAAS,cAAc;AAEvB,IAAO,mBAAQ;","names":[]}
@@ -4,16 +4,16 @@ import {
4
4
  MapDecorativePins,
5
5
  MapRoads,
6
6
  MapScaleBar
7
- } from "./chunk-4CHROSWR.js";
7
+ } from "./chunk-5ETBB2DG.js";
8
8
  import {
9
9
  MapTiles
10
- } from "./chunk-HGMBY5LP.js";
10
+ } from "./chunk-HQWJUHR4.js";
11
11
  import {
12
12
  surfaceBackground
13
13
  } from "./chunk-X6AIKCAV.js";
14
14
  import {
15
15
  getTileCoordinates
16
- } from "./chunk-TUBCN4DJ.js";
16
+ } from "./chunk-CB6DTWD5.js";
17
17
 
18
18
  // src/components/data-display/MapPreview/StaticMapView.tsx
19
19
  import Box from "@mui/material/Box/index.js";
@@ -59,4 +59,4 @@ var StaticMapView = ({
59
59
  export {
60
60
  StaticMapView
61
61
  };
62
- //# sourceMappingURL=chunk-DCJSHYE5.js.map
62
+ //# sourceMappingURL=chunk-RSDYS5B3.js.map
@@ -15,7 +15,7 @@ import {
15
15
  } from "./chunk-FRAVVI4A.js";
16
16
  import {
17
17
  Calendar
18
- } from "./chunk-UN5INW6K.js";
18
+ } from "./chunk-R53ZOW4B.js";
19
19
 
20
20
  // src/components/form/DateRangePicker/DateRangePicker.tsx
21
21
  import Box from "@mui/material/Box/index.js";
@@ -181,4 +181,4 @@ export {
181
181
  DateRangePicker,
182
182
  DateRangePicker_default
183
183
  };
184
- //# sourceMappingURL=chunk-N5GVW6RO.js.map
184
+ //# sourceMappingURL=chunk-S6IWKDWT.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  FleetCanvas
3
- } from "./chunk-DVAAUWTC.js";
3
+ } from "./chunk-LCHCE2G5.js";
4
4
  import {
5
5
  FleetRoster
6
6
  } from "./chunk-5JCGBCFJ.js";
@@ -79,4 +79,4 @@ function FleetBody({
79
79
  export {
80
80
  FleetBody
81
81
  };
82
- //# sourceMappingURL=chunk-TKC6WHGB.js.map
82
+ //# sourceMappingURL=chunk-SBIZXZPP.js.map
@@ -47,8 +47,10 @@ var MUI_SHADOWS = {
47
47
  2: ELEVATION_SHADOWS[2],
48
48
  3: ELEVATION_SHADOWS[3]
49
49
  };
50
- var IOS_THUMB_SHADOW = `0 3px 1px 0 ${alpha(SWITCH_BLACK, 0.04)}, 0 3px 8px 0 ${alpha(SWITCH_BLACK, 0.12)}, 0 1px 0 0 ${alpha(SWITCH_BLACK, 0.08)}`;
51
- var iosTrackShadow = () => `inset 0 0 0 0.5px ${alpha(SWITCH_BLACK, 0.1)}, inset 0 2px 3px ${alpha(SWITCH_BLACK, 0.12)}`;
50
+ var AS_PX = (value) => `${value}px`;
51
+ var iosThumbShadow = (length = AS_PX) => `0 ${length(3)} ${length(1)} 0 ${alpha(SWITCH_BLACK, 0.04)}, 0 ${length(3)} ${length(8)} 0 ${alpha(SWITCH_BLACK, 0.12)}, 0 ${length(1)} 0 0 ${alpha(SWITCH_BLACK, 0.08)}`;
52
+ var IOS_THUMB_SHADOW = iosThumbShadow();
53
+ var iosTrackShadow = (length = AS_PX) => `inset 0 0 0 ${length(0.5)} ${alpha(SWITCH_BLACK, 0.1)}, inset 0 ${length(2)} ${length(3)} ${alpha(SWITCH_BLACK, 0.12)}`;
52
54
  var TRACK_ALPHA = { ios: 0.1, android: 0.2, other: 0.3 };
53
55
  var trackColor = (ink, look) => {
54
56
  if (look === "ios") return alpha(ink.black, TRACK_ALPHA.ios);
@@ -113,6 +115,8 @@ export {
113
115
  thumbRadius,
114
116
  THUMB_ELEVATION,
115
117
  MUI_SHADOWS,
118
+ AS_PX,
119
+ iosThumbShadow,
116
120
  IOS_THUMB_SHADOW,
117
121
  iosTrackShadow,
118
122
  TRACK_ALPHA,
@@ -145,4 +149,4 @@ export {
145
149
  seconds,
146
150
  showsTrackLabels
147
151
  };
148
- //# sourceMappingURL=chunk-D5SZXH7Q.js.map
152
+ //# sourceMappingURL=chunk-TNBJ4DK4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/form/Switch/Switch.metrics.ts"],"sourcesContent":["import type { SwitchVariant } from './Switch.base';\nimport { alpha } from '../../../tokens/color';\nimport { ABSOLUTE_INK, ELEVATION_SHADOWS, NEUTRAL_RAMP } from '../../../tokens/ink.core';\nimport type { SizeValue } from '../../../tokens/vocabulary';\n\n/**\n * THE NUMBERS BOTH `Switch` RENDERERS DRAW WITH.\n *\n * `Switch.styles.ts` (web, emotion over MUI's `Switch`) and\n * `Switch.native.tsx` (React Native, drawing the track and thumb itself) read\n * this one table: the geometry per size, the four looks' radii and shadows,\n * the resting track colours, and the type the label, the description and the\n * helper are set in.\n *\n * Spacing is in SPACING UNITS where the web writes `theme.spacing(n)`;\n * everything else is px, a ratio or an alpha.\n */\n\n/** MUI's `palette.common.black`, which `UiTheme` does not carry. */\nexport const SWITCH_BLACK = ABSOLUTE_INK.black;\n\nexport interface SwitchGeometry {\n width: number;\n height: number;\n padding: number;\n thumbSize: number;\n}\n\nexport const SWITCH_SIZES: Record<SizeValue, SwitchGeometry> = {\n xs: { width: 34, height: 18, padding: 1, thumbSize: 14 },\n sm: { width: 42, height: 22, padding: 1, thumbSize: 18 },\n md: { width: 50, height: 26, padding: 1, thumbSize: 22 },\n lg: { width: 58, height: 30, padding: 2, thumbSize: 24 },\n xl: { width: 66, height: 34, padding: 2, thumbSize: 28 },\n};\n\n/** The four platform looks. `label` prints its wording on a `default` track. */\nexport type SwitchLook = 'ios' | 'android' | 'material' | 'default';\n\nexport const lookOf = (variant?: string): SwitchLook => {\n if (variant === 'ios') return 'ios';\n if (variant === 'android') return 'android';\n if (variant === 'material') return 'material';\n return 'default';\n};\n\n/** Track geometry once the caller's overrides and the size preset are combined. */\nexport const geometryOf = (size: SizeValue | undefined, width?: number, height?: number): SwitchGeometry => {\n const preset = SWITCH_SIZES[size as SizeValue] ?? SWITCH_SIZES.md;\n return { ...preset, width: width || preset.width, height: height || preset.height };\n};\n\n/**\n * The thumb's corner. `'50%'` is what the web emits; a renderer with no\n * percentage radius asks {@link thumbRadius} for the px instead.\n */\nexport const THUMB_RADIUS: Record<SwitchLook, (thumbSize: number) => number | string> = {\n ios: () => '50%',\n android: () => 4,\n material: (thumbSize) => thumbSize / 3,\n default: () => '50%',\n};\n\nexport const TRACK_RADIUS: Record<SwitchLook, (height: number) => number> = {\n ios: (height) => height / 2,\n android: (height) => height / 3,\n material: (height) => height / 2.5,\n default: (height) => height / 2,\n};\n\n/** The web's `'50%'` as the px a circle of this size needs. */\nexport const thumbRadius = (look: SwitchLook, thumbSize: number): number => {\n const radius = THUMB_RADIUS[look](thumbSize);\n return typeof radius === 'number' ? radius : thumbSize / 2;\n};\n\n/**\n * The elevation the thumb rests at per look — an INDEX into `theme.shadows`,\n * not the shadow itself, so a host that re-themes MUI's elevations keeps\n * moving the web. {@link MUI_SHADOWS} carries MUI's own values for the native\n * side, which has no `theme.shadows` to read.\n */\nexport const THUMB_ELEVATION: Record<SwitchLook, number> = { ios: 0, android: 3, material: 2, default: 2 };\n\nexport const MUI_SHADOWS: Record<number, string> = {\n 2: ELEVATION_SHADOWS[2],\n 3: ELEVATION_SHADOWS[3],\n};\n\n/**\n * How a shadow builder writes one of its lengths. Native takes the px as they\n * stand ({@link AS_PX}); the web hands in its type scale (`rem`), so the iOS\n * shadows scale with the theme like every other length it draws.\n */\nexport type ShadowLength = (px: number) => string;\n\n/** A length written as the px it was drawn at — what native reads. */\nexport const AS_PX: ShadowLength = (value) => `${value}px`;\n\n/** The iOS thumb's own three-layer shadow. */\nexport const iosThumbShadow = (length: ShadowLength = AS_PX): string =>\n `0 ${length(3)} ${length(1)} 0 ${alpha(SWITCH_BLACK, 0.04)}, 0 ${length(3)} ${length(8)} 0 ${alpha(SWITCH_BLACK, 0.12)}, 0 ${length(1)} 0 0 ${alpha(SWITCH_BLACK, 0.08)}`;\n\n/** {@link iosThumbShadow} in px, as native draws it. */\nexport const IOS_THUMB_SHADOW = iosThumbShadow();\n\n/** The iOS track's inset hairline and inner shade. */\nexport const iosTrackShadow = (length: ShadowLength = AS_PX): string =>\n `inset 0 0 0 ${length(0.5)} ${alpha(SWITCH_BLACK, 0.1)}, inset 0 ${length(2)} ${length(3)} ${alpha(SWITCH_BLACK, 0.12)}`;\n\n/** The resting track: a black wash on iOS, the disabled ink elsewhere. */\nexport const TRACK_ALPHA = { ios: 0.1, android: 0.2, other: 0.3 } as const;\n\n/**\n * `black` is MUI's `palette.common.black` on the web and {@link SWITCH_BLACK}\n * on native, whose theme has no `common` — the same `#000` either way, passed\n * in rather than assumed so a host that themes it still moves the web.\n */\nexport const trackColor = (ink: { black: string; disabled: string }, look: SwitchLook): string => {\n if (look === 'ios') return alpha(ink.black, TRACK_ALPHA.ios);\n const strength = look === 'android' ? TRACK_ALPHA.android : TRACK_ALPHA.other;\n return alpha(ink.disabled, strength);\n};\n\n/** How far the thumb travels, and where it starts. iOS insets differently. */\nexport const thumbTravel = (look: SwitchLook, geometry: SwitchGeometry): { rest: number; travel: number } => {\n const { width, thumbSize, padding } = geometry;\n if (look === 'ios') {\n // The web nudges the whole switch base 2px right and shortens the trip.\n return { rest: padding + IOS_BASE_OFFSET, travel: width - thumbSize - IOS_TRAVEL_INSET };\n }\n return { rest: padding, travel: width - thumbSize - padding * 2 };\n};\n\nexport const IOS_BASE_OFFSET = 2;\nexport const IOS_TRAVEL_INSET = 4;\n\n/** MUI's 300ms `cubic-bezier(0.4, 0, 0.2, 1)`, on everything the switch moves. */\nexport const SWITCH_TRANSITION = { ms: 300, easing: 'cubic-bezier(0.4, 0, 0.2, 1)' } as const;\n\n/** The disabled treatment: the thumb greys and the track fades. */\nexport const DISABLED = { trackOpacity: 0.3, checkedTrackOpacity: 0.5, thumbGrey: 100 } as const;\n\n/** `glass`: a paper wash under a blur, inside a faint divider hairline. */\nexport const SWITCH_GLASS = {\n trackAlpha: 0.1,\n thumbAlpha: 0.9,\n borderAlpha: 0.2,\n trackBlur: 20,\n thumbBlur: 10,\n} as const;\n\n/** `gradient`: the checked track runs light → main → dark; the resting one is fainter. */\nexport const SWITCH_GRADIENT = {\n checked: { angleDeg: 90, stops: [0, 50, 100] },\n resting: { angleDeg: 135, lightAlpha: 0.3, mainAlpha: 0.2 },\n shimmerMs: 3000,\n} as const;\n\n/** `glow`: a halo of the hue around the checked track, breathing every two seconds. */\nexport const SWITCH_GLOW = { blur: 10, alpha: 0.6, insetBlur: 10, insetAlpha: 0.2, ms: 2000 } as const;\n\n/** `pulse`: the thumb breathes; `ripple`: a wash of the hue expands under the pointer. */\nexport const SWITCH_PULSE = { ms: 2000, minOpacity: 0.7, minScale: 0.95 } as const;\nexport const SWITCH_RIPPLE = { alpha: 0.2, ms: 600, scale: 2 } as const;\n\n/** `loading`: a 2px ring inside the thumb, turning once a second. */\nexport const SWITCH_SPINNER = { sizeRatio: 0.6, borderWidth: 2, ms: 1000 } as const;\n\n/** The two icons overlaid on the track, at their own size per step of the scale. */\nexport const SWITCH_ICON_SIZES: Record<SizeValue, number> = { xs: 12, sm: 14, md: 16, lg: 18, xl: 20 };\n/** Where a shown icon sits, and how small a hidden one is drawn. */\nexport const SWITCH_ICON = { inset: 4, hiddenScale: 0.8 } as const;\n\n/** The wording the `label` variant prints inside the track: 0.75rem at 500, 8px in. */\nexport const TRACK_LABEL = { fontSize: 12, fontWeight: 500, insetUnits: 1 } as const;\n\n/** MUI's `body2` for the label, `caption` for the description and the helper text. */\nexport const SWITCH_LABEL = { fontSize: 14, lineHeight: 1.43, fontWeight: 500 } as const;\nexport const SWITCH_DESCRIPTION = { fontSize: 12, lineHeight: 1.66, marginTopUnits: 0.5 } as const;\nexport const SWITCH_HELPER = { fontSize: 12, lineHeight: 1.66, marginTopUnits: 1 } as const;\n\n/** The label row: 16px from the control beside it, 8px above or below it. */\nexport const LABEL_GAP_UNITS = { beside: 2, stacked: 1 } as const;\n\n/**\n * The minimum height of a touch target, in px (FUT-1905).\n *\n * No entry in {@link SWITCH_SIZES} reaches it — `xl`, the largest, is 34px tall\n * and `md` is 26 — so a consumer cannot buy a legal target by passing a bigger\n * `size`. The label is what clears it: see `SwitchLabel` in `Switch.parts.tsx`.\n */\nexport const TAP_TARGET_MIN = 40;\n\n/**\n * `neutral`'s three greys, and the literals the web falls back to for a theme\n * whose grey ramp omits a step. Same three steps `Button` draws its neutral\n * from.\n */\nexport const NEUTRAL_GREY = { main: 700, dark: 800, light: 500 } as const;\nexport const NEUTRAL_FALLBACK = {\n main: NEUTRAL_RAMP[NEUTRAL_GREY.main],\n dark: NEUTRAL_RAMP[NEUTRAL_GREY.dark],\n light: NEUTRAL_RAMP[NEUTRAL_GREY.light],\n} as const;\nexport const NEUTRAL_CONTRAST = ABSOLUTE_INK.white;\n\n/**\n * The RESTING thumb — the knob while the switch is off (FUT-1924).\n *\n * It stays white, and the reason is worth stating because the checked thumb no\n * longer is: the resting track is `theme.palette.action.disabled` washed over\n * the page, which no tenant picks, and a white knob on it is the conventional\n * look in both modes. The CHECKED track is `palette.main`, a colour the tenant\n * does pick, and that is where a stated white was a defect. See `checkedInk`\n * in `Switch.styles.ts` and its native twin.\n */\nexport const RESTING_THUMB = ABSOLUTE_INK.white;\n\n/** Hover: the thumb lifts a shade and takes a halo of the hue. */\nexport const SWITCH_HOVER = { thumbScale: 1.05, elevation: 4, blur: 12, alpha: 0.2 } as const;\n\n/** Focus: MUI rings the thumb rather than moving it. */\nexport const SWITCH_FOCUS_RING = { width: 6, alpha: 0.2 } as const;\n\n/** A duration as the CSS the web has always emitted: `2000` → `2s`. */\nexport const seconds = (ms: number): string => `${ms / 1000}s`;\n\n/** Whether this variant prints its wording inside the track. */\nexport const showsTrackLabels = (variant: SwitchVariant | undefined, onText?: string, offText?: string): boolean =>\n variant === 'label' && Boolean(onText ?? offText);\n"],"mappings":"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","names":[]}
@@ -10,6 +10,9 @@ import {
10
10
  import {
11
11
  default as default2
12
12
  } from "./chunk-6DPAWXZ3.js";
13
+ import {
14
+ sxRem
15
+ } from "./chunk-YKCAJ2TN.js";
13
16
 
14
17
  // src/components/data-display/DataViews/data-views-layout-context.tsx
15
18
  import { createContext, useContext, useEffect, useMemo, useState } from "react";
@@ -17,7 +20,6 @@ import GridViewOutlinedIcon from "@mui/icons-material/GridViewOutlined";
17
20
  import { jsx, jsxs } from "react/jsx-runtime";
18
21
  var DataViewsLayoutContext = createContext(null);
19
22
  var DEFAULT_ZOOM = 35;
20
- var BASE_CARD_WIDTH = 180;
21
23
  var CARD_SCALE_RANGE = { min: 0.75, max: 2 };
22
24
  var LAYOUT_STORAGE_KEY = "dataviews:layout";
23
25
  var DENSITY_STORAGE_KEY = "dataviews:density";
@@ -45,7 +47,7 @@ function cardScaleForZoom(zoom) {
45
47
  return CARD_SCALE_RANGE.min + clamped / 100 * (CARD_SCALE_RANGE.max - CARD_SCALE_RANGE.min);
46
48
  }
47
49
  function cardMinWidthForZoom(zoom) {
48
- return Math.round(BASE_CARD_WIDTH * cardScaleForZoom(zoom));
50
+ return Math.round(180 * cardScaleForZoom(zoom));
49
51
  }
50
52
  function isLayout(value) {
51
53
  return DATA_VIEWS_LAYOUTS.includes(value);
@@ -152,8 +154,8 @@ function DataViewsZoomSlider({ testIdPrefix }) {
152
154
  color: "text.secondary"
153
155
  },
154
156
  children: [
155
- /* @__PURE__ */ jsx(GridViewOutlinedIcon, { sx: { fontSize: 14 } }),
156
- /* @__PURE__ */ jsx(default2, { sx: { width: 88, display: "flex", alignItems: "center" }, children: /* @__PURE__ */ jsx(
157
+ /* @__PURE__ */ jsx(GridViewOutlinedIcon, { sx: { fontSize: sxRem(14) } }),
158
+ /* @__PURE__ */ jsx(default2, { sx: { width: sxRem(88), display: "flex", alignItems: "center" }, children: /* @__PURE__ */ jsx(
157
159
  Slider,
158
160
  {
159
161
  size: "sm",
@@ -167,7 +169,7 @@ function DataViewsZoomSlider({ testIdPrefix }) {
167
169
  "data-testid": `${testIdPrefix}-card-zoom`
168
170
  }
169
171
  ) }),
170
- /* @__PURE__ */ jsx(GridViewOutlinedIcon, { sx: { fontSize: 20 } })
172
+ /* @__PURE__ */ jsx(GridViewOutlinedIcon, { sx: { fontSize: sxRem(20) } })
171
173
  ]
172
174
  }
173
175
  );
@@ -184,4 +186,4 @@ export {
184
186
  useDataViewsLayout,
185
187
  DataViewsZoomSlider
186
188
  };
187
- //# sourceMappingURL=chunk-PMOEG36E.js.map
189
+ //# sourceMappingURL=chunk-XZJM6EPC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/data-display/DataViews/data-views-layout-context.tsx"],"sourcesContent":["\"use client\";\n\nimport { createContext, useContext, useEffect, useMemo, useState, type ReactNode } from \"react\";\n\nimport GridViewOutlinedIcon from \"@mui/icons-material/GridViewOutlined\";\n\nimport { Slider } from \"../../form/Slider\";\nimport { Box } from \"../../../mui/Box\";\nimport { sxRem } from \"../../../tokens/relative\";\n\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\nimport { DATA_VIEWS_LAYOUTS, type DataViewsLayout } from \"./data-views-types\";\n\n/**\n * The DataViews layout (view type): the dense \"Tabela\" grid, the \"Grade\" of\n * cards, the \"Lista\" of full-width rows, or the \"Quadro\" board of state columns.\n * Shared across the toolbar (the toggle) and the body (the selector) via context\n * so a single source of truth drives what renders — each layout only appears\n * when the table opts into it (`renderCard` for the grade, `renderListRow` for\n * the lista, `board` + `renderCard` for the quadro).\n */\nexport type { DataViewsLayout };\n\ninterface DataViewsLayoutValue {\n layout: DataViewsLayout;\n setLayout: (layout: DataViewsLayout) => void;\n /** How much air each record gets — see {@link DataViewsDensity}. */\n density: DataViewsDensity;\n setDensity: (density: DataViewsDensity) => void;\n /** Whether the cards layout is available (a `renderCard` was supplied). */\n canUseCards: boolean;\n /** Whether the list layout is available (a `renderListRow` was supplied). */\n canUseList: boolean;\n /** Whether the board layout is available (a `board` config AND a `renderCard`). */\n canUseBoard: boolean;\n /** Card-size zoom (0–100); drives the card grid's min column width. */\n zoom: number;\n setZoom: (zoom: number) => void;\n}\n\nconst DataViewsLayoutContext = createContext<DataViewsLayoutValue | null>(null);\n\n/** Default card zoom (0–100). */\nconst DEFAULT_ZOOM = 35;\n/** The size multiplier the zoom slider spans (0.75× to 2×). */\nconst CARD_SCALE_RANGE = { min: 0.75, max: 2 } as const;\n\n/**\n * Where the user's layout preference is remembered. ONE key for every DataViews\n * table in the app, on purpose: picking \"Grade\" on Produtos is a statement about\n * how this operator likes to read lists, not about that one screen. Every other\n * screen that CAN render cards then opens in cards, and one that cannot falls\n * back without forgetting the preference.\n */\nconst LAYOUT_STORAGE_KEY = \"dataviews:layout\";\n\n/**\n * The density preference, remembered app-wide for the same reason as the layout:\n * an operator who wants tight rows wants them on every list, not on one.\n */\nconst DENSITY_STORAGE_KEY = \"dataviews:density\";\n\n/**\n * How much room each record gets. It means different things per layout, and\n * that is the point — one control, phrased in the terms of what is on screen:\n *\n * - table / list → row height (\"Baixa / Média / Alta\")\n * - cards → how many fit per row (\"Muitos / Médio / Poucos\")\n *\n * The board is unaffected: its cards are already sized by the zoom slider.\n */\nexport type DataViewsDensity = \"compact\" | \"cozy\" | \"comfortable\";\n\n/** Every density this build knows — the guard's single source. */\nconst DENSITIES: readonly DataViewsDensity[] = [\"compact\", \"cozy\", \"comfortable\"];\n\n/** Vertical padding (theme spacing units) per density, for a table or list row. */\nexport const DENSITY_ROW_PADDING: Record<DataViewsDensity, number> = {\n compact: 0.25,\n cozy: 0.75,\n comfortable: 1.5,\n};\n\n/**\n * The card WIDTH each density aims for, as a multiple of the base card width.\n *\n * Density used to cap the column COUNT, with a track floor of\n * `max(baseWidth, 100% / count)`. That base is a constant, so wherever it won\n * the arithmetic every density produced an identical track — \"Muitos\" and\n * \"Medio\" both drew 3 cards of 279px at md — and where the percentage won\n * instead, on a wide screen, the count was pinned and each card grew to a share\n * of the viewport: ~430px of card holding one chip and two lines of text.\n *\n * One width per density fixes both, because the number `auto-fill` divides by\n * now differs per density at every size. The spread is chosen so the three land\n * on DIFFERENT column counts across the range rather than by eye — 4/3/2 at md,\n * 6/4/3 at lg, 7/5/4 at xl, 13/9/8 at 2560.\n */\nexport const DENSITY_CARD_SCALE: Record<DataViewsDensity, number> = {\n compact: 0.84,\n cozy: 1.15,\n comfortable: 1.4,\n};\n\n/** The width a card aims for, in design px: the base width, scaled by zoom, then by density. */\nexport function cardTargetWidthFor(zoom: number, density: DataViewsDensity): number {\n return Math.round(cardMinWidthForZoom(zoom) * DENSITY_CARD_SCALE[density]);\n}\n\n/**\n * The BOARD's column-width multiplier per density.\n *\n * Density means \"how much air a record gets\", and on a board that is the column\n * width — narrow columns fit more etapas on screen, wide ones give each card\n * room to be read. Without this the board was the one layout the Exibição tab\n * offered nothing for: the format tile switched to Quadro and the whole density\n * section vanished, which reads as a control that broke rather than one that\n * does not apply.\n *\n * The spread is deliberately narrower than the card grid's. A board column has\n * a hard floor (`MIN_COLUMN_WIDTH` — a card below it stops being readable), so\n * a multiplier that undershoots it buys nothing and makes \"Estreita\" a tile\n * that does nothing on a phone.\n */\nexport const DENSITY_BOARD_SCALE: Record<DataViewsDensity, number> = {\n compact: 0.95,\n cozy: 1,\n comfortable: 1.25,\n};\n\n/**\n * Map the 0–100 zoom to the card SIZE multiplier. This is the single knob: the\n * card's width is its 180 design px × scale and its padding + typography\n * scale by the same factor, so the whole card grows together (scale 2 → twice\n * the size, proportion preserved by the aspect ratio). Passed to a card via\n * `DataViewCardSelection.scale`.\n */\nexport function cardScaleForZoom(zoom: number): number {\n const clamped = Math.max(0, Math.min(100, zoom));\n return CARD_SCALE_RANGE.min + (clamped / 100) * (CARD_SCALE_RANGE.max - CARD_SCALE_RANGE.min);\n}\n\n/**\n * The card grid's min column width in DESIGN px: the card's width at scale 1 —\n * 180 — times the zoom size multiplier. Drawn through `rem` where the track is\n * built (`cardGridTracks`), so it scales with the theme's type scale.\n */\nexport function cardMinWidthForZoom(zoom: number): number {\n return Math.round(180 * cardScaleForZoom(zoom));\n}\n\n/** Which layouts this table can actually render. */\ninterface LayoutAvailability {\n canUseCards: boolean;\n canUseList: boolean;\n canUseBoard: boolean;\n}\n\n/** Is this a layout string this build knows? Guards whatever is in storage. */\nfunction isLayout(value: unknown): value is DataViewsLayout {\n return DATA_VIEWS_LAYOUTS.includes(value as DataViewsLayout);\n}\n\n/** Is this a density this build knows? Guards whatever is in storage. */\nfunction isDensity(value: unknown): value is DataViewsDensity {\n return DENSITIES.includes(value as DataViewsDensity);\n}\n\n/** 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: sxRem(14) }} />\n <Box sx={{ width: sxRem(88), display: \"flex\", alignItems: \"center\" }}>\n <Slider\n size=\"sm\"\n showValue={false}\n value={zoom}\n min={0}\n max={100}\n step={5}\n onChange={(_event, next) => setZoom(Array.isArray(next) ? (next[0] ?? 0) : next)}\n aria-label={copy.display.cardZoom}\n data-testid={`${testIdPrefix}-card-zoom`}\n />\n </Box>\n <GridViewOutlinedIcon sx={{ fontSize: sxRem(20) }} />\n </Box>\n );\n}\n"],"mappings":"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","names":["default"]}
@@ -7,7 +7,7 @@ var resolveScrollable = (scrollableTarget) => {
7
7
  }
8
8
  return scrollableTarget;
9
9
  };
10
- var useSentinel = ({ testMode, threshold, scrollableTarget }) => {
10
+ var useSentinel = ({ testMode, rootMargin, scrollableTarget }) => {
11
11
  const sentinelRef = useRef(null);
12
12
  const [isIntersecting, setIsIntersecting] = useState(false);
13
13
  useEffect(() => {
@@ -20,13 +20,13 @@ var useSentinel = ({ testMode, threshold, scrollableTarget }) => {
20
20
  },
21
21
  {
22
22
  root: resolveScrollable(scrollableTarget) || void 0,
23
- rootMargin: `${threshold}px`,
23
+ rootMargin,
24
24
  threshold: 0
25
25
  }
26
26
  );
27
27
  observer.observe(sentinelRef.current);
28
28
  return () => observer.disconnect();
29
- }, [testMode, threshold, scrollableTarget]);
29
+ }, [testMode, rootMargin, scrollableTarget]);
30
30
  return { sentinelRef, isIntersecting };
31
31
  };
32
32
  var useLoadMore = ({
@@ -75,4 +75,4 @@ export {
75
75
  useSentinel,
76
76
  useLoadMore
77
77
  };
78
- //# sourceMappingURL=chunk-QF6LTUCE.js.map
78
+ //# sourceMappingURL=chunk-Y2X7LYIN.js.map
@@ -0,0 +1 @@
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 /** The observer's `rootMargin` — px, which is all `IntersectionObserver` takes. */\n rootMargin: string;\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, rootMargin, 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,\n threshold: 0,\n },\n );\n\n observer.observe(sentinelRef.current);\n\n return () => observer.disconnect();\n }, [testMode, rootMargin, 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;AAcO,IAAM,cAAc,CAAC,EAAE,UAAU,YAAY,iBAAiB,MAAoB;AACvF,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;AAAA,QACA,WAAW;AAAA,MACb;AAAA,IACF;AAEA,aAAS,QAAQ,YAAY,OAAO;AAEpC,WAAO,MAAM,SAAS,WAAW;AAAA,EACnC,GAAG,CAAC,UAAU,YAAY,gBAAgB,CAAC;AAE3C,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":[]}
@@ -8,7 +8,7 @@ import {
8
8
  } from "./chunk-YLGY3D52.js";
9
9
  import {
10
10
  useDataViewsLayout
11
- } from "./chunk-PMOEG36E.js";
11
+ } from "./chunk-XZJM6EPC.js";
12
12
  import {
13
13
  useDataViewsCopy
14
14
  } from "./chunk-KHG57NAE.js";
@@ -246,4 +246,4 @@ export {
246
246
  SortTab,
247
247
  DisplayTab
248
248
  };
249
- //# sourceMappingURL=chunk-UEVHI62V.js.map
249
+ //# sourceMappingURL=chunk-YCCY77W5.js.map
@@ -1,15 +1,21 @@
1
+ import {
2
+ rem,
3
+ remPx
4
+ } from "./chunk-YKCAJ2TN.js";
5
+
1
6
  // src/components/data-display/Table/Table.hooks.ts
2
7
  import { useTheme } from "@mui/material/styles/index.js";
3
8
  import useMediaQuery from "@mui/material/useMediaQuery/index.js";
4
9
  import { useCallback, useEffect, useMemo, useState } from "react";
5
10
  var useVirtualScrolling = (data, rowHeight, containerHeight, overscan = 5) => {
11
+ const theme = useTheme();
6
12
  const [scrollTop, setScrollTop] = useState(0);
7
13
  const visibleItems = useMemo(() => {
8
- const visibleHeight = containerHeight;
9
- const startIndex = Math.floor(scrollTop / rowHeight);
14
+ const pitch = remPx(theme, rowHeight);
15
+ const startIndex = Math.floor(scrollTop / pitch);
10
16
  const endIndex = Math.min(
11
17
  data.length,
12
- Math.ceil((scrollTop + visibleHeight) / rowHeight)
18
+ Math.ceil((scrollTop + remPx(theme, containerHeight)) / pitch)
13
19
  );
14
20
  const start = Math.max(0, startIndex - overscan);
15
21
  const end = Math.min(data.length, endIndex + overscan);
@@ -17,10 +23,12 @@ var useVirtualScrolling = (data, rowHeight, containerHeight, overscan = 5) => {
17
23
  startIndex: start,
18
24
  endIndex: end,
19
25
  items: data.slice(start, end),
20
- totalHeight: data.length * rowHeight,
26
+ /** Every row at the scaled pitch, as CSS. */
27
+ totalHeight: rem(theme, data.length * rowHeight),
28
+ /** Where the first mounted row sits, in design px. */
21
29
  offsetY: start * rowHeight
22
30
  };
23
- }, [data, rowHeight, containerHeight, scrollTop, overscan]);
31
+ }, [data, rowHeight, containerHeight, scrollTop, overscan, theme]);
24
32
  const handleScroll = useCallback((e) => {
25
33
  setScrollTop(e.currentTarget.scrollTop);
26
34
  }, []);
@@ -109,4 +117,4 @@ export {
109
117
  useVirtualScrolling,
110
118
  useTableSelection
111
119
  };
112
- //# sourceMappingURL=chunk-DF4K5XVW.js.map
120
+ //# sourceMappingURL=chunk-YZVR5ROE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/data-display/Table/Table.hooks.ts"],"sourcesContent":["import { useTheme } from '@mui/material/styles/index.js';\nimport useMediaQuery from '@mui/material/useMediaQuery/index.js';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { rem, remPx } from '../../../tokens/relative';\n\nimport type { ColumnConfig, TableProps } from './Table.types';\n\n/**\n * The virtual window. `rowHeight` and `containerHeight` are design px: the\n * window is computed in the px `scrollTop` is measured in (`remPx`), and what it\n * hands back to draw with stays in design px (`offsetY`) or is CSS already\n * (`totalHeight`), so the rows and the window share one pitch at any type scale.\n */\nexport const useVirtualScrolling = (\n data: Record<string, unknown>[],\n rowHeight: number,\n containerHeight: number,\n overscan: number = 5\n) => {\n const theme = useTheme();\n const [scrollTop, setScrollTop] = useState(0);\n \n const visibleItems = useMemo(() => {\n const pitch = remPx(theme, rowHeight);\n const startIndex = Math.floor(scrollTop / pitch);\n const endIndex = Math.min(\n data.length,\n Math.ceil((scrollTop + remPx(theme, containerHeight)) / pitch)\n );\n \n const start = Math.max(0, startIndex - overscan);\n const end = Math.min(data.length, endIndex + overscan);\n \n return {\n startIndex: start,\n endIndex: end,\n items: data.slice(start, end),\n /** Every row at the scaled pitch, as CSS. */\n totalHeight: rem(theme, data.length * rowHeight),\n /** Where the first mounted row sits, in design px. */\n offsetY: start * rowHeight,\n };\n }, [data, rowHeight, containerHeight, scrollTop, overscan, theme]);\n\n const handleScroll = useCallback((e: React.UIEvent<HTMLDivElement>) => {\n setScrollTop(e.currentTarget.scrollTop);\n }, []);\n\n return { visibleItems, handleScroll };\n};\n\n// Responsive Hook\n\nconst useResponsive = (\n columns: ColumnConfig[],\n columnPriorities?: number[]\n) => {\n const theme = useTheme();\n const isMobile = useMediaQuery(theme.breakpoints.down('md'));\n const isTablet = useMediaQuery(theme.breakpoints.down('lg'));\n \n const [hiddenColumns, setHiddenColumns] = useState<number[]>([]);\n const [columnMenuAnchor, setColumnMenuAnchor] = useState<null | HTMLElement>(null);\n\n useEffect(() => {\n if (!columnPriorities) return;\n \n let columnsToHide: number[] = [];\n \n if (isMobile) {\n // Hide lowest priority columns on mobile\n columnsToHide = columnPriorities\n .map((priority, index) => ({ priority, index }))\n .sort((a, b) => b.priority - a.priority)\n .slice(0, Math.floor(columns.length / 2))\n .map(item => item.index);\n } else if (isTablet) {\n // Hide some columns on tablet\n columnsToHide = columnPriorities\n .map((priority, index) => ({ priority, index }))\n .sort((a, b) => b.priority - a.priority)\n .slice(0, Math.floor(columns.length / 3))\n .map(item => item.index);\n }\n \n setHiddenColumns(columnsToHide);\n }, [isMobile, isTablet, columnPriorities, columns.length]);\n\n const visibleColumns = columns.filter((_, index) => !hiddenColumns.includes(index));\n\n return {\n visibleColumns,\n hiddenColumns,\n isMobile,\n columnMenuAnchor,\n setColumnMenuAnchor,\n setHiddenColumns,\n };\n};\n\n// Enhanced Table Header Component\n// Visible/hidden column split for responsive mode, plus row selection.\nexport const useTableSelection = ({\n columns,\n data,\n responsive,\n columnPriorities,\n selectedRows,\n rowKeyExtractor,\n onSelectionChange,\n}: {\n columns?: ColumnConfig[];\n data: TableProps['data'];\n responsive?: boolean;\n columnPriorities?: number[];\n selectedRows: (string | number)[];\n rowKeyExtractor?: (row: Record<string, unknown>, index: number) => string | number;\n onSelectionChange?: TableProps['onSelectionChange'];\n}) => {\n \n // Use responsive hook if responsive mode is enabled\n const {\n visibleColumns,\n hiddenColumns,\n isMobile,\n columnMenuAnchor,\n setColumnMenuAnchor,\n setHiddenColumns,\n } = useResponsive(\n columns || [],\n responsive ? columnPriorities : undefined\n );\n\n // Handle selection changes\n const handleSelectionChange = useCallback((rowKey: string | number, selected: boolean) => {\n if (!onSelectionChange) return;\n \n let newSelection: (string | number)[];\n if (selected) {\n newSelection = [...selectedRows, rowKey];\n } else {\n newSelection = selectedRows.filter(key => key !== rowKey);\n }\n onSelectionChange(newSelection);\n }, [selectedRows, onSelectionChange]);\n\n const handleSelectAll = useCallback((selected: boolean) => {\n if (!onSelectionChange || !data) return;\n \n if (selected) {\n const allKeys = data.map((rowData, index) => \n rowKeyExtractor ? rowKeyExtractor(rowData, index) : (rowData.id as string | number) || index\n );\n onSelectionChange(allKeys);\n } else {\n onSelectionChange([]);\n }\n }, [data, onSelectionChange, rowKeyExtractor]);\n\n // Loading state\n\n return {\n visibleColumns,\n hiddenColumns,\n isMobile,\n columnMenuAnchor,\n setColumnMenuAnchor,\n setHiddenColumns,\n handleSelectionChange,\n handleSelectAll,\n };\n};\n"],"mappings":"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","names":[]}
@@ -9,7 +9,6 @@ import {
9
9
  import {
10
10
  DISABLED,
11
11
  IOS_BASE_OFFSET,
12
- IOS_THUMB_SHADOW,
13
12
  IOS_TRAVEL_INSET,
14
13
  NEUTRAL_CONTRAST,
15
14
  RESTING_THUMB,
@@ -27,12 +26,13 @@ import {
27
26
  TRACK_LABEL,
28
27
  TRACK_RADIUS,
29
28
  geometryOf,
29
+ iosThumbShadow,
30
30
  iosTrackShadow,
31
31
  lookOf,
32
32
  seconds,
33
33
  showsTrackLabels,
34
34
  trackColor
35
- } from "./chunk-D5SZXH7Q.js";
35
+ } from "./chunk-TNBJ4DK4.js";
36
36
  import {
37
37
  inkOver
38
38
  } from "./chunk-2BYKTBDL.js";
@@ -70,7 +70,7 @@ var getColorFromTheme = (theme, color) => {
70
70
  };
71
71
  };
72
72
  var lengthOrPercent = (theme, value) => typeof value === "number" ? rem(theme, value) : value;
73
- var thumbShadow = (theme, look) => look === "ios" ? IOS_THUMB_SHADOW : theme.shadows[THUMB_ELEVATION[look]] ?? "none";
73
+ var thumbShadow = (theme, look) => look === "ios" ? iosThumbShadow((px) => rem(theme, px)) : theme.shadows[THUMB_ELEVATION[look]] ?? "none";
74
74
  var rippleOverlay = (palette) => ({
75
75
  content: '""',
76
76
  position: "absolute",
@@ -259,7 +259,7 @@ var trackSx = (theme, flags, palette, height, look) => {
259
259
  opacity: 1,
260
260
  transition: `all ${seconds(SWITCH_TRANSITION.ms)} ${SWITCH_TRANSITION.easing}`,
261
261
  position: "relative",
262
- boxShadow: look === "ios" ? iosTrackShadow() : "none",
262
+ boxShadow: look === "ios" ? iosTrackShadow((px) => rem(theme, px)) : "none",
263
263
  ...glass && {
264
264
  backgroundColor: alpha(theme.palette.background.paper, SWITCH_GLASS.trackAlpha),
265
265
  backdropFilter: `blur(${rem(theme, SWITCH_GLASS.trackBlur)})`,
@@ -291,4 +291,4 @@ export {
291
291
  onTrackInk,
292
292
  switchSx
293
293
  };
294
- //# sourceMappingURL=chunk-AUSUCZYR.js.map
294
+ //# sourceMappingURL=chunk-ZBVU2YWV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/form/Switch/Switch.styles.ts"],"sourcesContent":["import { alpha } from '@mui/material/styles/index.js';\nimport type { CSSObject, Theme } from '@mui/material/styles/index.js';\n\nimport {\n bounceAnimation,\n glowAnimation,\n pulseAnimation,\n rippleAnimation,\n shimmerAnimation,\n spinAnimation,\n} from './Switch.animations';\nimport {\n DISABLED,\n IOS_BASE_OFFSET,\n IOS_TRAVEL_INSET,\n SWITCH_GLASS,\n SWITCH_GLOW,\n NEUTRAL_CONTRAST,\n SWITCH_FOCUS_RING,\n SWITCH_GRADIENT,\n SWITCH_HOVER,\n SWITCH_PULSE,\n SWITCH_RIPPLE,\n SWITCH_SPINNER,\n SWITCH_TRANSITION,\n RESTING_THUMB,\n THUMB_ELEVATION,\n THUMB_RADIUS,\n TRACK_LABEL,\n TRACK_RADIUS,\n geometryOf,\n iosThumbShadow,\n iosTrackShadow,\n lookOf,\n seconds,\n showsTrackLabels,\n trackColor,\n type SwitchGeometry,\n type SwitchLook,\n} from './Switch.metrics';\nimport type { SwitchVariant } from './Switch.base';\n\nimport { absoluteInk, controlNeutral, neutralTones } from '../../../tokens/ink';\nimport { rem } from '../../../tokens/relative';\nimport { inkOver } from '../../../tokens/theme';\nimport type { ColorValue, SizeValue } from '../../../tokens/vocabulary';\n\n// Every number below comes from `./Switch.metrics`, which the native renderer\n// reads too — see its header. The palette and the shadows stay on the MUI\n// theme so a host that re-themes either keeps moving the web.\ninterface ColorPalette {\n main: string;\n dark?: string;\n light?: string;\n contrastText?: string;\n}\n\n/** `neutral` is not a MUI palette entry, so it is the controls' neutral tone. */\nconst neutralPalette = (theme: Theme): ColorPalette => controlNeutral(theme);\n\n/**\n * Resolves a colour name to a full palette, filling any step the theme leaves\n * out from `main` and then from the primary palette. `danger` is this\n * component's name for the error palette; the rest map straight through.\n */\nconst getColorFromTheme = (theme: Theme, color: string): ColorPalette => {\n if (color === 'neutral') {\n return neutralPalette(theme);\n }\n\n const colorMap: Record<string, ColorPalette | undefined> = {\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 const palette = colorMap[color] ?? theme.palette.primary;\n const { primary } = theme.palette;\n\n return {\n main: palette.main || primary.main,\n dark: palette.dark || palette.main || primary.dark,\n light: palette.light || palette.main || primary.light,\n contrastText: palette.contrastText || NEUTRAL_CONTRAST,\n };\n};\n\nexport interface SwitchFlags {\n customVariant?: SwitchVariant;\n customColor?: ColorValue;\n customSize?: SizeValue;\n glow?: boolean;\n glass?: boolean;\n gradient?: boolean;\n trackWidth?: number;\n trackHeight?: number;\n onText?: string;\n offText?: string;\n loading?: boolean;\n ripple?: boolean;\n pulse?: boolean;\n}\n\n/** A metrics radius on the web: its px through the type scale, a percentage as-is. */\nconst lengthOrPercent = (theme: Theme, value: number | string): string =>\n typeof value === 'number' ? rem(theme, value) : value;\n\nconst thumbShadow = (theme: Theme, look: SwitchLook): string =>\n look === 'ios'\n ? iosThumbShadow((px) => rem(theme, px))\n : (theme.shadows[THUMB_ELEVATION[look]] ?? 'none');\n\n/** The ripple that expands from the thumb on hover. */\nconst rippleOverlay = (palette: ColorPalette): CSSObject => ({\n content: '\"\"',\n position: 'absolute',\n top: '50%',\n left: '50%',\n width: '100%',\n height: '100%',\n borderRadius: '50%',\n background: alpha(palette.main, SWITCH_RIPPLE.alpha),\n animation: `${rippleAnimation} ${seconds(SWITCH_RIPPLE.ms)} ease-out`,\n transform: 'translate(-50%, -50%)',\n pointerEvents: 'none',\n});\n\n/**\n * The ink on the CHECKED track — the thumb, the `on` wording and any on-icon\n * (FUT-1924).\n *\n * All three stated `#fff`, and the checked track is `palette.main`: the one\n * surface in this component the TENANT picks. A store with a pale brand got a\n * white thumb on a pale green bar, which does not read as a knob at all — the\n * switch looks OFF while it is on, so this is a state a user misreads rather\n * than a colour they dislike.\n *\n * The `gradient` flag paints the track `light → main → dark`, so the fills the\n * thumb travels over are handed over together and {@link inkOver} takes the\n * worst of them.\n *\n * The RESTING track is not here on purpose: it is `theme.palette.action.disabled`\n * washed over the page, which no tenant chooses, and a white thumb on it is the\n * conventional look in both modes.\n */\nconst checkedInk = (flags: SwitchFlags, palette: ColorPalette): string => {\n const fills = flags.gradient\n ? [palette.light || palette.main, palette.main, palette.dark || palette.main]\n : [palette.main];\n\n return inkOver(fills, palette.contrastText || NEUTRAL_CONTRAST);\n};\n\n/** The checked track: the filled bar behind the thumb once the switch is on. */\nconst checkedTrack = (theme: Theme, flags: SwitchFlags, palette: ColorPalette): CSSObject => ({\n backgroundColor: palette.main,\n opacity: 1,\n border: 0,\n position: 'relative',\n overflow: 'hidden',\n ...(flags.glow && {\n animation: `${glowAnimation(theme)} ${seconds(SWITCH_GLOW.ms)} ease-in-out infinite`,\n boxShadow: `0 0 ${rem(theme, SWITCH_GLOW.blur)} ${alpha(palette.main, SWITCH_GLOW.alpha)}, inset 0 0 ${rem(theme, SWITCH_GLOW.insetBlur)} ${alpha(palette.main, SWITCH_GLOW.insetAlpha)}`,\n }),\n ...(flags.gradient && {\n background: `linear-gradient(${SWITCH_GRADIENT.checked.angleDeg}deg, ${palette.light || palette.main} ${SWITCH_GRADIENT.checked.stops[0]}%, ${palette.main} ${SWITCH_GRADIENT.checked.stops[1]}%, ${palette.dark || palette.main} ${SWITCH_GRADIENT.checked.stops[2]}%)`,\n backgroundSize: '200% 100%',\n animation: `${shimmerAnimation} ${seconds(SWITCH_GRADIENT.shimmerMs)} ease infinite`,\n }),\n});\n\nconst switchBaseSx = (\n theme: Theme,\n flags: SwitchFlags,\n palette: ColorPalette,\n geometry: SwitchGeometry,\n look: SwitchLook,\n): CSSObject => {\n const { width, thumbSize, padding } = geometry;\n const isIos = look === 'ios';\n\n return {\n padding: rem(theme, padding),\n margin: 0,\n transitionDuration: `${SWITCH_TRANSITION.ms}ms`,\n transitionTimingFunction: SWITCH_TRANSITION.easing,\n ...(isIos && { transform: `translateX(${rem(theme, IOS_BASE_OFFSET)})` }),\n '&:hover': {\n '& .MuiSwitch-thumb': {\n transform: flags.loading ? 'none' : `scale(${SWITCH_HOVER.thumbScale})`,\n boxShadow: `${theme.shadows[SWITCH_HOVER.elevation]}, 0 0 ${rem(theme, SWITCH_HOVER.blur)} ${alpha(palette.main, SWITCH_HOVER.alpha)}`,\n },\n ...(flags.ripple && { '&::after': rippleOverlay(palette) }),\n },\n '&.Mui-checked': {\n // The thumb travels the track minus its own width and both paddings; the\n // iOS look insets differently, so it gets its own distance.\n transform: `translateX(${rem(theme, width - thumbSize - padding * 2)})`,\n color: checkedInk(flags, palette),\n '& .MuiSwitch-thumb': {\n animation: flags.loading ? 'none' : `${bounceAnimation} ${seconds(SWITCH_TRANSITION.ms)} ease-out`,\n /*\n GLASS KEEPS ITS WASH AND GAINS AN OUTLINE (FUT-2067).\n\n It used to keep the wash and nothing else, on the argument that a\n translucent thumb MEANS to show the track through itself, so painting\n it opaque would be repainting the variant rather than fixing it. The\n first half of that is still true and this still does not touch the\n fill. The second half was doing more work than the number supports:\n `SWITCH_GLASS.thumbAlpha` is **0.9**, so nine parts in ten of the knob\n are `background.paper` and one part is the track. On a pale brand that\n composites to within about 1.1:1 of the bar it is sitting on — the\n same \"reads as OFF while it is on\" state FUT-1924 exists for, in the\n one variant whose own argument points AT the tenant-controlled\n surface.\n\n So the separation moves to the EDGE, which is the thing a glass\n surface is allowed to have. The colour is {@link checkedInk} — the\n same derivation the opaque thumb gets, so there is one rule for \"what\n reads on this track\" rather than two — at full strength rather than\n the `divider` hairline at `borderAlpha` 0.2 the resting thumb wears,\n which on a pale track is not an outline at all.\n\n Checked only. The resting track is `action.disabled` washed over the\n page, which no tenant chooses, so the quiet hairline stays right\n there — the same split {@link checkedInk}'s own docblock makes.\n */\n ...(flags.glass\n ? { borderColor: checkedInk(flags, palette) }\n : { backgroundColor: checkedInk(flags, palette) }),\n },\n '& + .MuiSwitch-track': checkedTrack(theme, flags, palette),\n '&.Mui-disabled + .MuiSwitch-track': { opacity: DISABLED.checkedTrackOpacity },\n ...(isIos && { transform: `translateX(${rem(theme, width - thumbSize - IOS_TRAVEL_INSET)})` }),\n },\n '&.Mui-focusVisible .MuiSwitch-thumb': {\n color: palette.main,\n border: `${rem(theme, SWITCH_FOCUS_RING.width)} solid ${alpha(palette.main, SWITCH_FOCUS_RING.alpha)}`,\n },\n '&.Mui-disabled .MuiSwitch-thumb': { color: neutralTones(theme).surface },\n '&.Mui-disabled + .MuiSwitch-track': { opacity: DISABLED.trackOpacity },\n };\n};\n\nconst thumbSx = (\n theme: Theme,\n flags: SwitchFlags,\n palette: ColorPalette,\n thumbSize: number,\n look: SwitchLook,\n): CSSObject => ({\n width: rem(theme, thumbSize),\n height: rem(theme, thumbSize),\n borderRadius: lengthOrPercent(theme, THUMB_RADIUS[look](thumbSize)),\n // `.Mui-checked` above replaces this for the brand-filled track; see\n // {@link RESTING_THUMB} for why the resting one stays white.\n backgroundColor: RESTING_THUMB,\n boxShadow: thumbShadow(theme, look),\n transition: `all ${seconds(SWITCH_TRANSITION.ms)} ${SWITCH_TRANSITION.easing}`,\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n ...(flags.glass && {\n backgroundColor: alpha(theme.palette.background.paper, SWITCH_GLASS.thumbAlpha),\n backdropFilter: `blur(${rem(theme, SWITCH_GLASS.thumbBlur)})`,\n border: `1px solid ${alpha(theme.palette.divider, SWITCH_GLASS.borderAlpha)}`,\n }),\n ...(flags.pulse && { animation: `${pulseAnimation} ${seconds(SWITCH_PULSE.ms)} ease-in-out infinite` }),\n ...(flags.loading && {\n // A spinner drawn inside the thumb rather than over the whole control.\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n width: rem(theme, thumbSize * SWITCH_SPINNER.sizeRatio),\n height: rem(theme, thumbSize * SWITCH_SPINNER.sizeRatio),\n border: `${rem(theme, SWITCH_SPINNER.borderWidth)} solid ${palette.main}`,\n borderTop: `${rem(theme, SWITCH_SPINNER.borderWidth)} solid transparent`,\n borderRadius: '50%',\n animation: `${spinAnimation} ${seconds(SWITCH_SPINNER.ms)} linear infinite`,\n },\n }),\n ...(look === 'material' && {\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n width: '100%',\n height: '100%',\n borderRadius: 'inherit',\n backgroundColor: palette.main,\n opacity: 0,\n transform: 'scale(0)',\n transition: 'all 0.3s ease',\n },\n }),\n});\n\n/** The on/off wording the `label` variant prints inside the track. */\nconst trackLabels = (\n theme: Theme,\n flags: SwitchFlags,\n palette: ColorPalette,\n onText?: string,\n offText?: string,\n): CSSObject => ({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n paddingLeft: theme.spacing(TRACK_LABEL.insetUnits),\n paddingRight: theme.spacing(TRACK_LABEL.insetUnits),\n fontSize: rem(theme, TRACK_LABEL.fontSize),\n fontWeight: TRACK_LABEL.fontWeight,\n color: theme.palette.text.secondary,\n '&::before, &::after': {\n content: '\"\"',\n position: 'absolute',\n fontSize: rem(theme, TRACK_LABEL.fontSize),\n fontWeight: TRACK_LABEL.fontWeight,\n top: '50%',\n transform: 'translateY(-50%)',\n zIndex: 1,\n },\n ...(onText && {\n '&::before': {\n content: `\"${onText}\"`,\n left: theme.spacing(TRACK_LABEL.insetUnits),\n // The `on` word sits at the end the thumb travels TO, which is the\n // filled half of the track once checked.\n color: checkedInk(flags, palette),\n },\n }),\n ...(offText && {\n '&::after': {\n content: `\"${offText}\"`,\n right: theme.spacing(TRACK_LABEL.insetUnits),\n color: theme.palette.text.secondary,\n },\n }),\n});\n\nconst trackSx = (\n theme: Theme,\n flags: SwitchFlags,\n palette: ColorPalette,\n height: number,\n look: SwitchLook,\n): CSSObject => {\n const { glass, gradient, onText, offText, customVariant } = flags;\n\n return {\n borderRadius: rem(theme, TRACK_RADIUS[look](height)),\n backgroundColor: trackColor(\n { black: absoluteInk(theme).black, disabled: theme.palette.action.disabled },\n look,\n ),\n opacity: 1,\n transition: `all ${seconds(SWITCH_TRANSITION.ms)} ${SWITCH_TRANSITION.easing}`,\n position: 'relative',\n boxShadow: look === 'ios' ? iosTrackShadow((px) => rem(theme, px)) : 'none',\n ...(glass && {\n backgroundColor: alpha(theme.palette.background.paper, SWITCH_GLASS.trackAlpha),\n backdropFilter: `blur(${rem(theme, SWITCH_GLASS.trackBlur)})`,\n border: `1px solid ${alpha(theme.palette.divider, SWITCH_GLASS.borderAlpha)}`,\n }),\n ...(gradient &&\n !glass && {\n background: `linear-gradient(${SWITCH_GRADIENT.resting.angleDeg}deg, ${alpha(palette.light || palette.main, SWITCH_GRADIENT.resting.lightAlpha)}, ${alpha(palette.main, SWITCH_GRADIENT.resting.mainAlpha)})`,\n }),\n ...(showsTrackLabels(customVariant, onText, offText) &&\n trackLabels(theme, flags, palette, onText, offText)),\n };\n};\n\n/**\n * The same checked-track ink, for the two ICONS the control overlays on the\n * track — which are drawn as components rather than styles, so they cannot\n * reach {@link checkedInk} directly.\n */\nexport const onTrackInk = (theme: Theme, flags: SwitchFlags): string =>\n checkedInk(flags, getColorFromTheme(theme, flags.customColor ?? 'primary'));\n\nexport const switchSx = (theme: Theme, flags: SwitchFlags): CSSObject => {\n const palette = getColorFromTheme(theme, flags.customColor ?? 'primary');\n const geometry = geometryOf(flags.customSize, flags.trackWidth, flags.trackHeight);\n const look = lookOf(flags.customVariant);\n\n return {\n width: rem(theme, geometry.width),\n height: rem(theme, geometry.height),\n padding: 0,\n overflow: 'visible',\n '& .MuiSwitch-switchBase': switchBaseSx(theme, flags, palette, geometry, look),\n '& .MuiSwitch-thumb': thumbSx(theme, flags, palette, geometry.thumbSize, look),\n '& .MuiSwitch-track': trackSx(theme, flags, palette, geometry.height, look),\n };\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,aAAa;AA0DtB,IAAM,iBAAiB,CAAC,UAA+B,eAAe,KAAK;AAO3E,IAAM,oBAAoB,CAAC,OAAc,UAAgC;AACvE,MAAI,UAAU,WAAW;AACvB,WAAO,eAAe,KAAK;AAAA,EAC7B;AAEA,QAAM,WAAqD;AAAA,IACzD,SAAS,MAAM,QAAQ;AAAA,IACvB,WAAW,MAAM,QAAQ;AAAA,IACzB,SAAS,MAAM,QAAQ;AAAA,IACvB,SAAS,MAAM,QAAQ;AAAA,IACvB,MAAM,MAAM,QAAQ;AAAA,IACpB,QAAQ,MAAM,QAAQ;AAAA,EACxB;AACA,QAAM,UAAU,SAAS,KAAK,KAAK,MAAM,QAAQ;AACjD,QAAM,EAAE,QAAQ,IAAI,MAAM;AAE1B,SAAO;AAAA,IACL,MAAM,QAAQ,QAAQ,QAAQ;AAAA,IAC9B,MAAM,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,IAC9C,OAAO,QAAQ,SAAS,QAAQ,QAAQ,QAAQ;AAAA,IAChD,cAAc,QAAQ,gBAAgB;AAAA,EACxC;AACF;AAmBA,IAAM,kBAAkB,CAAC,OAAc,UACrC,OAAO,UAAU,WAAW,IAAI,OAAO,KAAK,IAAI;AAElD,IAAM,cAAc,CAAC,OAAc,SACjC,SAAS,QACL,eAAe,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC,IACpC,MAAM,QAAQ,gBAAgB,IAAI,CAAC,KAAK;AAG/C,IAAM,gBAAgB,CAAC,aAAsC;AAAA,EAC3D,SAAS;AAAA,EACT,UAAU;AAAA,EACV,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,cAAc;AAAA,EACd,YAAY,MAAM,QAAQ,MAAM,cAAc,KAAK;AAAA,EACnD,WAAW,GAAG,eAAe,IAAI,QAAQ,cAAc,EAAE,CAAC;AAAA,EAC1D,WAAW;AAAA,EACX,eAAe;AACjB;AAoBA,IAAM,aAAa,CAAC,OAAoB,YAAkC;AACxE,QAAM,QAAQ,MAAM,WAChB,CAAC,QAAQ,SAAS,QAAQ,MAAM,QAAQ,MAAM,QAAQ,QAAQ,QAAQ,IAAI,IAC1E,CAAC,QAAQ,IAAI;AAEjB,SAAO,QAAQ,OAAO,QAAQ,gBAAgB,gBAAgB;AAChE;AAGA,IAAM,eAAe,CAAC,OAAc,OAAoB,aAAsC;AAAA,EAC5F,iBAAiB,QAAQ;AAAA,EACzB,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,UAAU;AAAA,EACV,GAAI,MAAM,QAAQ;AAAA,IAChB,WAAW,GAAG,cAAc,KAAK,CAAC,IAAI,QAAQ,YAAY,EAAE,CAAC;AAAA,IAC7D,WAAW,OAAO,IAAI,OAAO,YAAY,IAAI,CAAC,IAAI,MAAM,QAAQ,MAAM,YAAY,KAAK,CAAC,eAAe,IAAI,OAAO,YAAY,SAAS,CAAC,IAAI,MAAM,QAAQ,MAAM,YAAY,UAAU,CAAC;AAAA,EACzL;AAAA,EACA,GAAI,MAAM,YAAY;AAAA,IACpB,YAAY,mBAAmB,gBAAgB,QAAQ,QAAQ,QAAQ,QAAQ,SAAS,QAAQ,IAAI,IAAI,gBAAgB,QAAQ,MAAM,CAAC,CAAC,MAAM,QAAQ,IAAI,IAAI,gBAAgB,QAAQ,MAAM,CAAC,CAAC,MAAM,QAAQ,QAAQ,QAAQ,IAAI,IAAI,gBAAgB,QAAQ,MAAM,CAAC,CAAC;AAAA,IACpQ,gBAAgB;AAAA,IAChB,WAAW,GAAG,gBAAgB,IAAI,QAAQ,gBAAgB,SAAS,CAAC;AAAA,EACtE;AACF;AAEA,IAAM,eAAe,CACnB,OACA,OACA,SACA,UACA,SACc;AACd,QAAM,EAAE,OAAO,WAAW,QAAQ,IAAI;AACtC,QAAM,QAAQ,SAAS;AAEvB,SAAO;AAAA,IACL,SAAS,IAAI,OAAO,OAAO;AAAA,IAC3B,QAAQ;AAAA,IACR,oBAAoB,GAAG,kBAAkB,EAAE;AAAA,IAC3C,0BAA0B,kBAAkB;AAAA,IAC5C,GAAI,SAAS,EAAE,WAAW,cAAc,IAAI,OAAO,eAAe,CAAC,IAAI;AAAA,IACvE,WAAW;AAAA,MACT,sBAAsB;AAAA,QACpB,WAAW,MAAM,UAAU,SAAS,SAAS,aAAa,UAAU;AAAA,QACpE,WAAW,GAAG,MAAM,QAAQ,aAAa,SAAS,CAAC,SAAS,IAAI,OAAO,aAAa,IAAI,CAAC,IAAI,MAAM,QAAQ,MAAM,aAAa,KAAK,CAAC;AAAA,MACtI;AAAA,MACA,GAAI,MAAM,UAAU,EAAE,YAAY,cAAc,OAAO,EAAE;AAAA,IAC3D;AAAA,IACA,iBAAiB;AAAA;AAAA;AAAA,MAGf,WAAW,cAAc,IAAI,OAAO,QAAQ,YAAY,UAAU,CAAC,CAAC;AAAA,MACpE,OAAO,WAAW,OAAO,OAAO;AAAA,MAChC,sBAAsB;AAAA,QACpB,WAAW,MAAM,UAAU,SAAS,GAAG,eAAe,IAAI,QAAQ,kBAAkB,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QA2BvF,GAAI,MAAM,QACN,EAAE,aAAa,WAAW,OAAO,OAAO,EAAE,IAC1C,EAAE,iBAAiB,WAAW,OAAO,OAAO,EAAE;AAAA,MACpD;AAAA,MACA,wBAAwB,aAAa,OAAO,OAAO,OAAO;AAAA,MAC1D,qCAAqC,EAAE,SAAS,SAAS,oBAAoB;AAAA,MAC7E,GAAI,SAAS,EAAE,WAAW,cAAc,IAAI,OAAO,QAAQ,YAAY,gBAAgB,CAAC,IAAI;AAAA,IAC9F;AAAA,IACA,uCAAuC;AAAA,MACrC,OAAO,QAAQ;AAAA,MACf,QAAQ,GAAG,IAAI,OAAO,kBAAkB,KAAK,CAAC,UAAU,MAAM,QAAQ,MAAM,kBAAkB,KAAK,CAAC;AAAA,IACtG;AAAA,IACA,mCAAmC,EAAE,OAAO,aAAa,KAAK,EAAE,QAAQ;AAAA,IACxE,qCAAqC,EAAE,SAAS,SAAS,aAAa;AAAA,EACxE;AACF;AAEA,IAAM,UAAU,CACd,OACA,OACA,SACA,WACA,UACe;AAAA,EACf,OAAO,IAAI,OAAO,SAAS;AAAA,EAC3B,QAAQ,IAAI,OAAO,SAAS;AAAA,EAC5B,cAAc,gBAAgB,OAAO,aAAa,IAAI,EAAE,SAAS,CAAC;AAAA;AAAA;AAAA,EAGlE,iBAAiB;AAAA,EACjB,WAAW,YAAY,OAAO,IAAI;AAAA,EAClC,YAAY,OAAO,QAAQ,kBAAkB,EAAE,CAAC,IAAI,kBAAkB,MAAM;AAAA,EAC5E,UAAU;AAAA,EACV,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,GAAI,MAAM,SAAS;AAAA,IACjB,iBAAiB,MAAM,MAAM,QAAQ,WAAW,OAAO,aAAa,UAAU;AAAA,IAC9E,gBAAgB,QAAQ,IAAI,OAAO,aAAa,SAAS,CAAC;AAAA,IAC1D,QAAQ,aAAa,MAAM,MAAM,QAAQ,SAAS,aAAa,WAAW,CAAC;AAAA,EAC7E;AAAA,EACA,GAAI,MAAM,SAAS,EAAE,WAAW,GAAG,cAAc,IAAI,QAAQ,aAAa,EAAE,CAAC,wBAAwB;AAAA,EACrG,GAAI,MAAM,WAAW;AAAA;AAAA,IAEnB,YAAY;AAAA,MACV,SAAS;AAAA,MACT,UAAU;AAAA,MACV,OAAO,IAAI,OAAO,YAAY,eAAe,SAAS;AAAA,MACtD,QAAQ,IAAI,OAAO,YAAY,eAAe,SAAS;AAAA,MACvD,QAAQ,GAAG,IAAI,OAAO,eAAe,WAAW,CAAC,UAAU,QAAQ,IAAI;AAAA,MACvE,WAAW,GAAG,IAAI,OAAO,eAAe,WAAW,CAAC;AAAA,MACpD,cAAc;AAAA,MACd,WAAW,GAAG,aAAa,IAAI,QAAQ,eAAe,EAAE,CAAC;AAAA,IAC3D;AAAA,EACF;AAAA,EACA,GAAI,SAAS,cAAc;AAAA,IACzB,aAAa;AAAA,MACX,SAAS;AAAA,MACT,UAAU;AAAA,MACV,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,cAAc;AAAA,MACd,iBAAiB,QAAQ;AAAA,MACzB,SAAS;AAAA,MACT,WAAW;AAAA,MACX,YAAY;AAAA,IACd;AAAA,EACF;AACF;AAGA,IAAM,cAAc,CAClB,OACA,OACA,SACA,QACA,aACe;AAAA,EACf,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,aAAa,MAAM,QAAQ,YAAY,UAAU;AAAA,EACjD,cAAc,MAAM,QAAQ,YAAY,UAAU;AAAA,EAClD,UAAU,IAAI,OAAO,YAAY,QAAQ;AAAA,EACzC,YAAY,YAAY;AAAA,EACxB,OAAO,MAAM,QAAQ,KAAK;AAAA,EAC1B,uBAAuB;AAAA,IACrB,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU,IAAI,OAAO,YAAY,QAAQ;AAAA,IACzC,YAAY,YAAY;AAAA,IACxB,KAAK;AAAA,IACL,WAAW;AAAA,IACX,QAAQ;AAAA,EACV;AAAA,EACA,GAAI,UAAU;AAAA,IACZ,aAAa;AAAA,MACX,SAAS,IAAI,MAAM;AAAA,MACnB,MAAM,MAAM,QAAQ,YAAY,UAAU;AAAA;AAAA;AAAA,MAG1C,OAAO,WAAW,OAAO,OAAO;AAAA,IAClC;AAAA,EACF;AAAA,EACA,GAAI,WAAW;AAAA,IACb,YAAY;AAAA,MACV,SAAS,IAAI,OAAO;AAAA,MACpB,OAAO,MAAM,QAAQ,YAAY,UAAU;AAAA,MAC3C,OAAO,MAAM,QAAQ,KAAK;AAAA,IAC5B;AAAA,EACF;AACF;AAEA,IAAM,UAAU,CACd,OACA,OACA,SACA,QACA,SACc;AACd,QAAM,EAAE,OAAO,UAAU,QAAQ,SAAS,cAAc,IAAI;AAE5D,SAAO;AAAA,IACL,cAAc,IAAI,OAAO,aAAa,IAAI,EAAE,MAAM,CAAC;AAAA,IACnD,iBAAiB;AAAA,MACf,EAAE,OAAO,YAAY,KAAK,EAAE,OAAO,UAAU,MAAM,QAAQ,OAAO,SAAS;AAAA,MAC3E;AAAA,IACF;AAAA,IACA,SAAS;AAAA,IACT,YAAY,OAAO,QAAQ,kBAAkB,EAAE,CAAC,IAAI,kBAAkB,MAAM;AAAA,IAC5E,UAAU;AAAA,IACV,WAAW,SAAS,QAAQ,eAAe,CAAC,OAAO,IAAI,OAAO,EAAE,CAAC,IAAI;AAAA,IACrE,GAAI,SAAS;AAAA,MACX,iBAAiB,MAAM,MAAM,QAAQ,WAAW,OAAO,aAAa,UAAU;AAAA,MAC9E,gBAAgB,QAAQ,IAAI,OAAO,aAAa,SAAS,CAAC;AAAA,MAC1D,QAAQ,aAAa,MAAM,MAAM,QAAQ,SAAS,aAAa,WAAW,CAAC;AAAA,IAC7E;AAAA,IACA,GAAI,YACF,CAAC,SAAS;AAAA,MACR,YAAY,mBAAmB,gBAAgB,QAAQ,QAAQ,QAAQ,MAAM,QAAQ,SAAS,QAAQ,MAAM,gBAAgB,QAAQ,UAAU,CAAC,KAAK,MAAM,QAAQ,MAAM,gBAAgB,QAAQ,SAAS,CAAC;AAAA,IAC5M;AAAA,IACF,GAAI,iBAAiB,eAAe,QAAQ,OAAO,KACjD,YAAY,OAAO,OAAO,SAAS,QAAQ,OAAO;AAAA,EACtD;AACF;AAOO,IAAM,aAAa,CAAC,OAAc,UACvC,WAAW,OAAO,kBAAkB,OAAO,MAAM,eAAe,SAAS,CAAC;AAErE,IAAM,WAAW,CAAC,OAAc,UAAkC;AACvE,QAAM,UAAU,kBAAkB,OAAO,MAAM,eAAe,SAAS;AACvE,QAAM,WAAW,WAAW,MAAM,YAAY,MAAM,YAAY,MAAM,WAAW;AACjF,QAAM,OAAO,OAAO,MAAM,aAAa;AAEvC,SAAO;AAAA,IACL,OAAO,IAAI,OAAO,SAAS,KAAK;AAAA,IAChC,QAAQ,IAAI,OAAO,SAAS,MAAM;AAAA,IAClC,SAAS;AAAA,IACT,UAAU;AAAA,IACV,2BAA2B,aAAa,OAAO,OAAO,SAAS,UAAU,IAAI;AAAA,IAC7E,sBAAsB,QAAQ,OAAO,OAAO,SAAS,SAAS,WAAW,IAAI;AAAA,IAC7E,sBAAsB,QAAQ,OAAO,OAAO,SAAS,SAAS,QAAQ,IAAI;AAAA,EAC5E;AACF;","names":[]}
@@ -2,7 +2,7 @@ import {
2
2
  SwitchControl,
3
3
  SwitchHelper,
4
4
  SwitchRow
5
- } from "./chunk-4JFL62K3.js";
5
+ } from "./chunk-K7FSTB2K.js";
6
6
  import {
7
7
  switchIds
8
8
  } from "./chunk-SZS7VZJN.js";
@@ -124,4 +124,4 @@ Switch.displayName = "Switch";
124
124
  export {
125
125
  Switch
126
126
  };
127
- //# sourceMappingURL=chunk-VZIB5W5L.js.map
127
+ //# sourceMappingURL=chunk-ZGCPDA3F.js.map
@@ -1,11 +1,11 @@
1
1
  import "../chunk-L5CPOEDP.js";
2
2
  import {
3
3
  DataGrid
4
- } from "../chunk-G4HBNILE.js";
4
+ } from "../chunk-LEHMWJNZ.js";
5
5
  import "../chunk-EARWC6PD.js";
6
- import "../chunk-DLJGBJZW.js";
7
- import "../chunk-HTZNB6IV.js";
8
- import "../chunk-AROBXRC5.js";
6
+ import "../chunk-DGMDQHMI.js";
7
+ import "../chunk-H5ZTIELC.js";
8
+ import "../chunk-F7JTIHV5.js";
9
9
  import "../chunk-G3E66C6J.js";
10
10
  import "../chunk-YKCAJ2TN.js";
11
11
  import "../chunk-PZ5AY32C.js";