@12-apps/ui 6.38.0 → 6.39.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) 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/MapPreview/MapDecorations.js +2 -2
  30. package/dist/_internal/components/data-display/MapPreview/MapPreview.hooks.js +2 -2
  31. package/dist/_internal/components/data-display/MapPreview/MapPreview.js +7 -7
  32. package/dist/_internal/components/data-display/MapPreview/MapTiles.js +2 -2
  33. package/dist/_internal/components/data-display/MapPreview/StaticMapView.js +4 -4
  34. package/dist/_internal/components/data-display/MapPreview/mapProjection.js +3 -3
  35. package/dist/_internal/components/data-display/MapPreview/useMapPreview.js +3 -3
  36. package/dist/_internal/components/data-display/Table/Table.helpers.js +5 -3
  37. package/dist/_internal/components/data-display/Table/Table.hooks.js +2 -1
  38. package/dist/_internal/components/data-display/Table/Table.js +4 -4
  39. package/dist/_internal/components/data-display/Table/TableParts.hooks.js +4 -2
  40. package/dist/_internal/components/data-display/Table/TableParts.js +4 -2
  41. package/dist/_internal/components/data-display/index.js +18 -18
  42. package/dist/_internal/components/form/Calendar/Calendar.js +5 -4
  43. package/dist/_internal/components/form/Calendar/CalendarDay.js +2 -1
  44. package/dist/_internal/components/form/Calendar/CalendarDayCell.js +3 -2
  45. package/dist/_internal/components/form/Calendar/CalendarMonth.js +4 -3
  46. package/dist/_internal/components/form/DateRangePicker/DateRangePicker.js +5 -5
  47. package/dist/_internal/components/form/Switch/Switch.js +4 -4
  48. package/dist/_internal/components/form/Switch/Switch.metrics.js +5 -1
  49. package/dist/_internal/components/form/Switch/Switch.parts.js +3 -3
  50. package/dist/_internal/components/form/Switch/Switch.styles.js +2 -2
  51. package/dist/_internal/components/form/index.js +9 -9
  52. package/dist/_internal/components/index.js +37 -37
  53. package/dist/_internal/components/layout/CardGrid/CardGrid.js +2 -1
  54. package/dist/_internal/components/layout/Resizable/Resizable.helpers.js +8 -3
  55. package/dist/_internal/components/layout/Resizable/Resizable.hooks.js +3 -2
  56. package/dist/_internal/components/layout/Resizable/Resizable.js +4 -3
  57. package/dist/_internal/components/layout/ScrollArea/ScrollArea.helpers.js +1 -1
  58. package/dist/_internal/components/layout/ScrollArea/ScrollArea.js +2 -2
  59. package/dist/_internal/components/layout/index.js +5 -5
  60. package/dist/_internal/components/utility/InfiniteScroll/InfiniteScroll.hooks.js +1 -1
  61. package/dist/_internal/components/utility/InfiniteScroll/InfiniteScroll.js +4 -3
  62. package/dist/_internal/components/utility/InfiniteScroll/InfiniteScroll.parts.js +2 -1
  63. package/dist/_internal/components/utility/VirtualList/VirtualList.hooks.js +6 -3
  64. package/dist/_internal/components/utility/VirtualList/VirtualList.js +3 -2
  65. package/dist/_internal/components/utility/index.js +5 -5
  66. package/dist/{chunk-J2DAQQQH.js → chunk-222HN7GK.js} +33 -64
  67. package/dist/chunk-222HN7GK.js.map +1 -0
  68. package/dist/{chunk-MR2HKBHS.js → chunk-27LOJVR3.js} +2 -2
  69. package/dist/{chunk-S3D5VBHW.js → chunk-3YOXVNO4.js} +7 -7
  70. package/dist/{chunk-CZIX4BW2.js → chunk-4ALF5PB5.js} +3 -3
  71. package/dist/{chunk-XJPJ6ESI.js → chunk-4OAKGKK5.js} +3 -3
  72. package/dist/{chunk-4CHROSWR.js → chunk-5ETBB2DG.js} +2 -2
  73. package/dist/{chunk-ATSHKSSD.js → chunk-5KNDAC24.js} +20 -7
  74. package/dist/chunk-5KNDAC24.js.map +1 -0
  75. package/dist/{chunk-ULTOQ6ZV.js → chunk-5LWB4BYX.js} +80 -89
  76. package/dist/chunk-5LWB4BYX.js.map +1 -0
  77. package/dist/{chunk-46UPILLK.js → chunk-5NT2M2JI.js} +2 -2
  78. package/dist/{chunk-H5BEWPEY.js → chunk-6N2EDWMG.js} +2 -2
  79. package/dist/{chunk-GJQYM3PM.js → chunk-6PU3JYVY.js} +2 -2
  80. package/dist/{chunk-PUBPZOQJ.js → chunk-AG3DY5TH.js} +8 -5
  81. package/dist/chunk-AG3DY5TH.js.map +1 -0
  82. package/dist/{chunk-PPRV4LTM.js → chunk-BWHOCNGW.js} +4 -4
  83. package/dist/chunk-BWHOCNGW.js.map +1 -0
  84. package/dist/{chunk-TUBCN4DJ.js → chunk-CB6DTWD5.js} +7 -7
  85. package/dist/chunk-CB6DTWD5.js.map +1 -0
  86. package/dist/{chunk-ZAY6OA6F.js → chunk-D4FZ3ANG.js} +15 -5
  87. package/dist/chunk-D4FZ3ANG.js.map +1 -0
  88. package/dist/{chunk-Y7F5JBAT.js → chunk-DDRKYNPB.js} +2 -2
  89. package/dist/{chunk-DLJGBJZW.js → chunk-DGMDQHMI.js} +16 -9
  90. package/dist/chunk-DGMDQHMI.js.map +1 -0
  91. package/dist/{chunk-IAGOUTI6.js → chunk-DNT5PZLF.js} +21 -12
  92. package/dist/chunk-DNT5PZLF.js.map +1 -0
  93. package/dist/{chunk-DZA7RSLX.js → chunk-DVSO3EG6.js} +19 -11
  94. package/dist/chunk-DVSO3EG6.js.map +1 -0
  95. package/dist/{chunk-OS6KPL4D.js → chunk-EHYI2WCJ.js} +4 -4
  96. package/dist/{chunk-NB3FGWU4.js → chunk-EQXIW5MQ.js} +2 -2
  97. package/dist/{chunk-C66RGVAS.js → chunk-ERY6D2OV.js} +6 -4
  98. package/dist/chunk-ERY6D2OV.js.map +1 -0
  99. package/dist/{chunk-M2JTIH5M.js → chunk-F44R7US6.js} +2 -2
  100. package/dist/{chunk-AROBXRC5.js → chunk-F7JTIHV5.js} +18 -7
  101. package/dist/chunk-F7JTIHV5.js.map +1 -0
  102. package/dist/{chunk-XJJXBUPN.js → chunk-FX26DAFF.js} +2 -2
  103. package/dist/{chunk-R6SN73RX.js → chunk-GLHNMTP6.js} +7 -7
  104. package/dist/{chunk-YU26GBNX.js → chunk-H3AQQOTI.js} +9 -4
  105. package/dist/chunk-H3AQQOTI.js.map +1 -0
  106. package/dist/{chunk-HTZNB6IV.js → chunk-H5ZTIELC.js} +23 -8
  107. package/dist/chunk-H5ZTIELC.js.map +1 -0
  108. package/dist/{chunk-GSFNH4C5.js → chunk-HBP2OU4Q.js} +15 -8
  109. package/dist/chunk-HBP2OU4Q.js.map +1 -0
  110. package/dist/{chunk-I4QA2F4L.js → chunk-HBRQPG7H.js} +5 -5
  111. package/dist/{chunk-HGMBY5LP.js → chunk-HQWJUHR4.js} +18 -11
  112. package/dist/chunk-HQWJUHR4.js.map +1 -0
  113. package/dist/{chunk-CNQUCNEA.js → chunk-I3F4C5SS.js} +3 -3
  114. package/dist/{chunk-UFJYJHQI.js → chunk-J5VWGQSR.js} +2 -2
  115. package/dist/{chunk-MTFCPPZ5.js → chunk-JWZJSXI5.js} +3 -2
  116. package/dist/chunk-JWZJSXI5.js.map +1 -0
  117. package/dist/{chunk-4JFL62K3.js → chunk-K7FSTB2K.js} +3 -3
  118. package/dist/{chunk-FFCJ7NR2.js → chunk-KRQUPE4K.js} +4 -4
  119. package/dist/{chunk-2OYFTSG4.js → chunk-KXLUMEDX.js} +2 -2
  120. package/dist/{chunk-DVAAUWTC.js → chunk-LCHCE2G5.js} +2 -2
  121. package/dist/{chunk-G4HBNILE.js → chunk-LEHMWJNZ.js} +3 -3
  122. package/dist/{chunk-P6TNXBDA.js → chunk-MYKWJCR7.js} +9 -9
  123. package/dist/chunk-MYKWJCR7.js.map +1 -0
  124. package/dist/{chunk-TQ6FPOPD.js → chunk-ODW2D5PN.js} +39 -30
  125. package/dist/chunk-ODW2D5PN.js.map +1 -0
  126. package/dist/{chunk-RZYSKQTS.js → chunk-PCBZYORN.js} +3 -3
  127. package/dist/{chunk-5OBXEMQO.js → chunk-PRIBOWX4.js} +3 -3
  128. package/dist/{chunk-F42MJOHM.js → chunk-PVM7XTLZ.js} +64 -62
  129. package/dist/chunk-PVM7XTLZ.js.map +1 -0
  130. package/dist/{chunk-3TDVGZZN.js → chunk-QBTBRJ2Q.js} +37 -13
  131. package/dist/chunk-QBTBRJ2Q.js.map +1 -0
  132. package/dist/{chunk-2WFDHFK4.js → chunk-QNCWSDXE.js} +26 -11
  133. package/dist/chunk-QNCWSDXE.js.map +1 -0
  134. package/dist/{chunk-PQECNGDE.js → chunk-QSRZOXQI.js} +2 -2
  135. package/dist/{chunk-RHIDWUK7.js → chunk-QUWK7SYN.js} +1 -2
  136. package/dist/chunk-QUWK7SYN.js.map +1 -0
  137. package/dist/{chunk-UN5INW6K.js → chunk-R53ZOW4B.js} +8 -4
  138. package/dist/chunk-R53ZOW4B.js.map +1 -0
  139. package/dist/{chunk-DCJSHYE5.js → chunk-RSDYS5B3.js} +4 -4
  140. package/dist/{chunk-N5GVW6RO.js → chunk-S6IWKDWT.js} +2 -2
  141. package/dist/{chunk-TKC6WHGB.js → chunk-SBIZXZPP.js} +2 -2
  142. package/dist/{chunk-D5SZXH7Q.js → chunk-TNBJ4DK4.js} +7 -3
  143. package/dist/chunk-TNBJ4DK4.js.map +1 -0
  144. package/dist/{chunk-PMOEG36E.js → chunk-XZJM6EPC.js} +8 -6
  145. package/dist/chunk-XZJM6EPC.js.map +1 -0
  146. package/dist/{chunk-QF6LTUCE.js → chunk-Y2X7LYIN.js} +4 -4
  147. package/dist/chunk-Y2X7LYIN.js.map +1 -0
  148. package/dist/{chunk-UEVHI62V.js → chunk-YCCY77W5.js} +2 -2
  149. package/dist/{chunk-DF4K5XVW.js → chunk-YZVR5ROE.js} +14 -6
  150. package/dist/chunk-YZVR5ROE.js.map +1 -0
  151. package/dist/{chunk-AUSUCZYR.js → chunk-ZBVU2YWV.js} +5 -5
  152. package/dist/chunk-ZBVU2YWV.js.map +1 -0
  153. package/dist/{chunk-VZIB5W5L.js → chunk-ZGCPDA3F.js} +2 -2
  154. package/dist/data-display/DataGrid.js +4 -4
  155. package/dist/data-display/DataViews.js +29 -29
  156. package/dist/data-display/FleetMap.js +10 -10
  157. package/dist/data-display/MapPreview.js +7 -7
  158. package/dist/data-display/Table.js +4 -4
  159. package/dist/form/Calendar.js +5 -4
  160. package/dist/form/DateRangePicker.js +5 -5
  161. package/dist/form/Switch.js +4 -4
  162. package/dist/layout/CardGrid.js +2 -1
  163. package/dist/layout/Resizable.js +4 -3
  164. package/dist/layout/ScrollArea.js +2 -2
  165. package/dist/native/form/Switch.js +3 -1
  166. package/dist/native/form/Switch.js.map +1 -1
  167. package/dist/types/components/data-display/DataGrid/DataGrid.body.d.ts.map +1 -1
  168. package/dist/types/components/data-display/DataGrid/DataGrid.cells.d.ts +4 -2
  169. package/dist/types/components/data-display/DataGrid/DataGrid.cells.d.ts.map +1 -1
  170. package/dist/types/components/data-display/DataGrid/DataGrid.model.d.ts +7 -1
  171. package/dist/types/components/data-display/DataGrid/DataGrid.model.d.ts.map +1 -1
  172. package/dist/types/components/data-display/DataGrid/DataGrid.types.d.ts +10 -4
  173. package/dist/types/components/data-display/DataGrid/DataGrid.types.d.ts.map +1 -1
  174. package/dist/types/components/data-display/DataViews/data-views-columns.d.ts.map +1 -1
  175. package/dist/types/components/data-display/DataViews/data-views-grid-helpers.d.ts +2 -0
  176. package/dist/types/components/data-display/DataViews/data-views-grid-helpers.d.ts.map +1 -1
  177. package/dist/types/components/data-display/DataViews/data-views-layout-context.d.ts +7 -3
  178. package/dist/types/components/data-display/DataViews/data-views-layout-context.d.ts.map +1 -1
  179. package/dist/types/components/data-display/DataViews/data-views-overflow-costs.d.ts +19 -9
  180. package/dist/types/components/data-display/DataViews/data-views-overflow-costs.d.ts.map +1 -1
  181. package/dist/types/components/data-display/DataViews/data-views-overflow.d.ts.map +1 -1
  182. package/dist/types/components/data-display/MapPreview/MapTiles.d.ts.map +1 -1
  183. package/dist/types/components/data-display/MapPreview/mapProjection.d.ts +6 -1
  184. package/dist/types/components/data-display/MapPreview/mapProjection.d.ts.map +1 -1
  185. package/dist/types/components/data-display/Table/Table.helpers.d.ts +6 -0
  186. package/dist/types/components/data-display/Table/Table.helpers.d.ts.map +1 -1
  187. package/dist/types/components/data-display/Table/Table.hooks.d.ts +9 -1
  188. package/dist/types/components/data-display/Table/Table.hooks.d.ts.map +1 -1
  189. package/dist/types/components/data-display/Table/Table.types.d.ts +6 -2
  190. package/dist/types/components/data-display/Table/Table.types.d.ts.map +1 -1
  191. package/dist/types/components/data-display/Table/TableParts.d.ts +2 -0
  192. package/dist/types/components/data-display/Table/TableParts.d.ts.map +1 -1
  193. package/dist/types/components/form/Calendar/Calendar.d.ts.map +1 -1
  194. package/dist/types/components/form/Calendar/CalendarDay.d.ts.map +1 -1
  195. package/dist/types/components/form/Calendar/CalendarMonth.d.ts.map +1 -1
  196. package/dist/types/components/form/Switch/Switch.metrics.d.ts +13 -3
  197. package/dist/types/components/form/Switch/Switch.metrics.d.ts.map +1 -1
  198. package/dist/types/components/form/Switch/Switch.styles.d.ts.map +1 -1
  199. package/dist/types/components/layout/CardGrid/CardGrid.d.ts +9 -7
  200. package/dist/types/components/layout/CardGrid/CardGrid.d.ts.map +1 -1
  201. package/dist/types/components/layout/Resizable/Resizable.d.ts.map +1 -1
  202. package/dist/types/components/layout/Resizable/Resizable.helpers.d.ts +21 -9
  203. package/dist/types/components/layout/Resizable/Resizable.helpers.d.ts.map +1 -1
  204. package/dist/types/components/layout/Resizable/Resizable.hooks.d.ts +13 -3
  205. package/dist/types/components/layout/Resizable/Resizable.hooks.d.ts.map +1 -1
  206. package/dist/types/components/layout/Resizable/Resizable.types.d.ts +10 -0
  207. package/dist/types/components/layout/Resizable/Resizable.types.d.ts.map +1 -1
  208. package/dist/types/components/layout/ScrollArea/ScrollArea.d.ts.map +1 -1
  209. package/dist/types/components/layout/ScrollArea/ScrollArea.helpers.d.ts +1 -1
  210. package/dist/types/components/layout/ScrollArea/ScrollArea.helpers.d.ts.map +1 -1
  211. package/dist/types/components/layout/ScrollArea/ScrollArea.types.d.ts +4 -1
  212. package/dist/types/components/layout/ScrollArea/ScrollArea.types.d.ts.map +1 -1
  213. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.d.ts.map +1 -1
  214. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.hooks.d.ts +3 -2
  215. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.hooks.d.ts.map +1 -1
  216. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.parts.d.ts +3 -2
  217. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.parts.d.ts.map +1 -1
  218. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.types.d.ts +9 -0
  219. package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.types.d.ts.map +1 -1
  220. package/dist/types/components/utility/VirtualList/VirtualList.d.ts.map +1 -1
  221. package/dist/types/components/utility/VirtualList/VirtualList.hooks.d.ts +24 -28
  222. package/dist/types/components/utility/VirtualList/VirtualList.hooks.d.ts.map +1 -1
  223. package/dist/types/components/utility/VirtualList/VirtualList.types.d.ts +17 -0
  224. package/dist/types/components/utility/VirtualList/VirtualList.types.d.ts.map +1 -1
  225. package/dist/types-native/components/form/Switch/Switch.metrics.d.ts +13 -3
  226. package/dist/types-native/components/form/Switch/Switch.metrics.d.ts.map +1 -1
  227. package/dist/utility/InfiniteScroll.js +4 -3
  228. package/dist/utility/VirtualList.js +3 -2
  229. package/package.json +1 -1
  230. package/src/components/data-display/DataGrid/DataGrid.body.tsx +27 -7
  231. package/src/components/data-display/DataGrid/DataGrid.cells.tsx +33 -9
  232. package/src/components/data-display/DataGrid/DataGrid.model.ts +24 -11
  233. package/src/components/data-display/DataGrid/DataGrid.types.ts +12 -6
  234. package/src/components/data-display/DataViews/data-views-columns.ts +14 -3
  235. package/src/components/data-display/DataViews/data-views-grid-helpers.tsx +5 -3
  236. package/src/components/data-display/DataViews/data-views-layout-context.tsx +12 -9
  237. package/src/components/data-display/DataViews/data-views-overflow-costs.ts +32 -14
  238. package/src/components/data-display/DataViews/data-views-overflow.ts +40 -26
  239. package/src/components/data-display/MapPreview/MapTiles.tsx +16 -9
  240. package/src/components/data-display/MapPreview/mapProjection.ts +10 -5
  241. package/src/components/data-display/Table/Table.helpers.ts +7 -1
  242. package/src/components/data-display/Table/Table.hooks.ts +16 -5
  243. package/src/components/data-display/Table/Table.types.ts +6 -2
  244. package/src/components/data-display/Table/TableParts.tsx +38 -42
  245. package/src/components/form/Calendar/Calendar.tsx +4 -2
  246. package/src/components/form/Calendar/CalendarDay.tsx +6 -3
  247. package/src/components/form/Calendar/CalendarMonth.tsx +6 -3
  248. package/src/components/form/Switch/Switch.metrics.ts +19 -5
  249. package/src/components/form/Switch/Switch.styles.ts +5 -3
  250. package/src/components/layout/CardGrid/CardGrid.tsx +37 -24
  251. package/src/components/layout/Resizable/Resizable.helpers.ts +43 -21
  252. package/src/components/layout/Resizable/Resizable.hooks.ts +17 -9
  253. package/src/components/layout/Resizable/Resizable.md +9 -5
  254. package/src/components/layout/Resizable/Resizable.tsx +20 -8
  255. package/src/components/layout/Resizable/Resizable.types.ts +10 -0
  256. package/src/components/layout/ScrollArea/ScrollArea.helpers.ts +0 -2
  257. package/src/components/layout/ScrollArea/ScrollArea.tsx +5 -3
  258. package/src/components/layout/ScrollArea/ScrollArea.types.ts +4 -1
  259. package/src/components/utility/InfiniteScroll/InfiniteScroll.hooks.ts +5 -4
  260. package/src/components/utility/InfiniteScroll/InfiniteScroll.parts.tsx +29 -12
  261. package/src/components/utility/InfiniteScroll/InfiniteScroll.tsx +11 -5
  262. package/src/components/utility/InfiniteScroll/InfiniteScroll.types.ts +10 -2
  263. package/src/components/utility/VirtualList/VirtualList.hooks.ts +101 -112
  264. package/src/components/utility/VirtualList/VirtualList.tsx +36 -65
  265. package/src/components/utility/VirtualList/VirtualList.types.ts +20 -3
  266. package/dist/chunk-2WFDHFK4.js.map +0 -1
  267. package/dist/chunk-3TDVGZZN.js.map +0 -1
  268. package/dist/chunk-AROBXRC5.js.map +0 -1
  269. package/dist/chunk-ATSHKSSD.js.map +0 -1
  270. package/dist/chunk-AUSUCZYR.js.map +0 -1
  271. package/dist/chunk-C66RGVAS.js.map +0 -1
  272. package/dist/chunk-D5SZXH7Q.js.map +0 -1
  273. package/dist/chunk-DF4K5XVW.js.map +0 -1
  274. package/dist/chunk-DLJGBJZW.js.map +0 -1
  275. package/dist/chunk-DZA7RSLX.js.map +0 -1
  276. package/dist/chunk-F42MJOHM.js.map +0 -1
  277. package/dist/chunk-GSFNH4C5.js.map +0 -1
  278. package/dist/chunk-HGMBY5LP.js.map +0 -1
  279. package/dist/chunk-HTZNB6IV.js.map +0 -1
  280. package/dist/chunk-IAGOUTI6.js.map +0 -1
  281. package/dist/chunk-J2DAQQQH.js.map +0 -1
  282. package/dist/chunk-MTFCPPZ5.js.map +0 -1
  283. package/dist/chunk-P6TNXBDA.js.map +0 -1
  284. package/dist/chunk-PMOEG36E.js.map +0 -1
  285. package/dist/chunk-PPRV4LTM.js.map +0 -1
  286. package/dist/chunk-PUBPZOQJ.js.map +0 -1
  287. package/dist/chunk-QF6LTUCE.js.map +0 -1
  288. package/dist/chunk-RHIDWUK7.js.map +0 -1
  289. package/dist/chunk-TQ6FPOPD.js.map +0 -1
  290. package/dist/chunk-TUBCN4DJ.js.map +0 -1
  291. package/dist/chunk-ULTOQ6ZV.js.map +0 -1
  292. package/dist/chunk-UN5INW6K.js.map +0 -1
  293. package/dist/chunk-YU26GBNX.js.map +0 -1
  294. package/dist/chunk-ZAY6OA6F.js.map +0 -1
  295. /package/dist/{chunk-MR2HKBHS.js.map → chunk-27LOJVR3.js.map} +0 -0
  296. /package/dist/{chunk-S3D5VBHW.js.map → chunk-3YOXVNO4.js.map} +0 -0
  297. /package/dist/{chunk-CZIX4BW2.js.map → chunk-4ALF5PB5.js.map} +0 -0
  298. /package/dist/{chunk-XJPJ6ESI.js.map → chunk-4OAKGKK5.js.map} +0 -0
  299. /package/dist/{chunk-4CHROSWR.js.map → chunk-5ETBB2DG.js.map} +0 -0
  300. /package/dist/{chunk-46UPILLK.js.map → chunk-5NT2M2JI.js.map} +0 -0
  301. /package/dist/{chunk-H5BEWPEY.js.map → chunk-6N2EDWMG.js.map} +0 -0
  302. /package/dist/{chunk-GJQYM3PM.js.map → chunk-6PU3JYVY.js.map} +0 -0
  303. /package/dist/{chunk-Y7F5JBAT.js.map → chunk-DDRKYNPB.js.map} +0 -0
  304. /package/dist/{chunk-OS6KPL4D.js.map → chunk-EHYI2WCJ.js.map} +0 -0
  305. /package/dist/{chunk-NB3FGWU4.js.map → chunk-EQXIW5MQ.js.map} +0 -0
  306. /package/dist/{chunk-M2JTIH5M.js.map → chunk-F44R7US6.js.map} +0 -0
  307. /package/dist/{chunk-XJJXBUPN.js.map → chunk-FX26DAFF.js.map} +0 -0
  308. /package/dist/{chunk-R6SN73RX.js.map → chunk-GLHNMTP6.js.map} +0 -0
  309. /package/dist/{chunk-I4QA2F4L.js.map → chunk-HBRQPG7H.js.map} +0 -0
  310. /package/dist/{chunk-CNQUCNEA.js.map → chunk-I3F4C5SS.js.map} +0 -0
  311. /package/dist/{chunk-UFJYJHQI.js.map → chunk-J5VWGQSR.js.map} +0 -0
  312. /package/dist/{chunk-4JFL62K3.js.map → chunk-K7FSTB2K.js.map} +0 -0
  313. /package/dist/{chunk-FFCJ7NR2.js.map → chunk-KRQUPE4K.js.map} +0 -0
  314. /package/dist/{chunk-2OYFTSG4.js.map → chunk-KXLUMEDX.js.map} +0 -0
  315. /package/dist/{chunk-DVAAUWTC.js.map → chunk-LCHCE2G5.js.map} +0 -0
  316. /package/dist/{chunk-G4HBNILE.js.map → chunk-LEHMWJNZ.js.map} +0 -0
  317. /package/dist/{chunk-RZYSKQTS.js.map → chunk-PCBZYORN.js.map} +0 -0
  318. /package/dist/{chunk-5OBXEMQO.js.map → chunk-PRIBOWX4.js.map} +0 -0
  319. /package/dist/{chunk-PQECNGDE.js.map → chunk-QSRZOXQI.js.map} +0 -0
  320. /package/dist/{chunk-DCJSHYE5.js.map → chunk-RSDYS5B3.js.map} +0 -0
  321. /package/dist/{chunk-N5GVW6RO.js.map → chunk-S6IWKDWT.js.map} +0 -0
  322. /package/dist/{chunk-TKC6WHGB.js.map → chunk-SBIZXZPP.js.map} +0 -0
  323. /package/dist/{chunk-UEVHI62V.js.map → chunk-YCCY77W5.js.map} +0 -0
  324. /package/dist/{chunk-VZIB5W5L.js.map → chunk-ZGCPDA3F.js.map} +0 -0
@@ -10,9 +10,12 @@
10
10
  * passes `sorting.sortBy` owns the sort, and a caller that does not gets the
11
11
  * internal state — the component never holds a second, divergent copy.
12
12
  */
13
+ import { useTheme } from '@mui/material/styles/index.js';
13
14
  import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
14
15
  import type React from 'react';
15
16
 
17
+ import { rem, remPx } from '../../../tokens/relative';
18
+
16
19
  import { processRows } from './DataGrid.rows';
17
20
  import type {
18
21
  DataGridProps,
@@ -22,7 +25,6 @@ import type {
22
25
  SortDirection,
23
26
  } from './DataGrid.types';
24
27
 
25
- const DEFAULT_ROW_HEIGHT = 52;
26
28
  const DEFAULT_PAGE_SIZE = 50;
27
29
  /** Rows rendered on either side of the window, so a fast scroll stays filled. */
28
30
  const OVERSCAN_COUNT = 20;
@@ -48,7 +50,13 @@ export interface VisibleRange {
48
50
  /** Everything the render needs, and nothing it has to derive. */
49
51
  export interface DataGridModel<T extends Record<string, unknown>> {
50
52
  containerRef: React.RefObject<HTMLDivElement | null>;
51
- rowHeight: number;
53
+ /** A row's height as CSS: the design height, density applied, through `rem`. */
54
+ rowHeight: string;
55
+ /**
56
+ * The same height in px (`remPx`) — what the window divides `scrollTop` by.
57
+ * One design number drawn two ways, so the rows and the window never disagree.
58
+ */
59
+ rowPitch: number;
52
60
  visibleColumns: GridColumn<T>[];
53
61
  processedRows: T[];
54
62
  visibleRows: T[];
@@ -67,7 +75,7 @@ export interface DataGridModel<T extends Record<string, unknown>> {
67
75
  onScroll: (event: React.UIEvent<HTMLDivElement>) => void;
68
76
  }
69
77
 
70
- /** The row height a density implies. */
78
+ /** The row height a density implies, in design px. */
71
79
  function densityHeight(base: number, density: DataGridProps['density']): number {
72
80
  if (density === 'compact') return Math.max(base * 0.8, 32);
73
81
  if (density === 'spacious') return base * 1.2;
@@ -114,7 +122,8 @@ function useProcessedRows<T extends Record<string, unknown>>(
114
122
  }
115
123
 
116
124
  /**
117
- * The virtualization window and the scroll handler that moves it.
125
+ * The virtualization window and the scroll handler that moves it. `rowPitch` is
126
+ * px, like the `scrollTop` and `clientHeight` it is divided into.
118
127
  *
119
128
  * Throttled through `requestAnimationFrame`, and only committed once the window
120
129
  * has drifted meaningfully — a `setState` per scroll event re-renders every
@@ -122,7 +131,7 @@ function useProcessedRows<T extends Record<string, unknown>>(
122
131
  */
123
132
  function useRowWindow(
124
133
  rowCount: number,
125
- rowHeight: number,
134
+ rowPitch: number,
126
135
  enabled: boolean,
127
136
  ): { range: VisibleRange; onScroll: (event: React.UIEvent<HTMLDivElement>) => void } {
128
137
  const [range, setRange] = useState<VisibleRange>({ start: 0, end: INITIAL_WINDOW });
@@ -145,8 +154,8 @@ function useRowWindow(
145
154
  const { scrollTop, clientHeight } = event.currentTarget;
146
155
  if (rafRef.current !== null) window.cancelAnimationFrame(rafRef.current);
147
156
  rafRef.current = window.requestAnimationFrame(() => {
148
- const first = Math.floor(scrollTop / rowHeight);
149
- const visible = Math.ceil(clientHeight / rowHeight);
157
+ const first = Math.floor(scrollTop / rowPitch);
158
+ const visible = Math.ceil(clientHeight / rowPitch);
150
159
  const start = Math.max(0, first - OVERSCAN_COUNT);
151
160
  const end = Math.min(first + visible + OVERSCAN_COUNT, rowCount);
152
161
  setRange((current) =>
@@ -158,7 +167,7 @@ function useRowWindow(
158
167
  rafRef.current = null;
159
168
  });
160
169
  },
161
- [enabled, rowHeight, rowCount],
170
+ [enabled, rowPitch, rowCount],
162
171
  );
163
172
 
164
173
  return { range, onScroll };
@@ -282,10 +291,13 @@ export function useDataGridModel<T extends Record<string, unknown>>(
282
291
  props: DataGridProps<T>,
283
292
  ): DataGridModel<T> {
284
293
  const { columns } = props;
294
+ const theme = useTheme();
285
295
  const containerRef = useRef<HTMLDivElement>(null);
286
296
  const [editingCell, setEditingCell] = useState<EditingCell | null>(null);
287
297
  const { sortBy, filters, setInternalSortBy } = useSortAndFilter(props);
288
- const rowHeight = densityHeight(props.rowHeight ?? DEFAULT_ROW_HEIGHT, props.density);
298
+ // 52 design px unless the caller says; the density scales it, then the type scale does.
299
+ const designRowHeight = densityHeight(props.rowHeight ?? 52, props.density);
300
+ const rowPitch = remPx(theme, designRowHeight);
289
301
  const columnMap = useMemo(
290
302
  () => new Map(columns.map((column) => [column.id, column])),
291
303
  [columns],
@@ -294,12 +306,13 @@ export function useDataGridModel<T extends Record<string, unknown>>(
294
306
  const processedRows = useProcessedRows(props, columnMap, sortBy, filters);
295
307
  const virtualized =
296
308
  (props.virtualizeRows ?? true) && processedRows.length > VIRTUALIZATION_THRESHOLD;
297
- const { range, onScroll } = useRowWindow(processedRows.length, rowHeight, virtualized);
309
+ const { range, onScroll } = useRowWindow(processedRows.length, rowPitch, virtualized);
298
310
  const onSort = useSortHandler(props, sortBy, filters, setInternalSortBy);
299
311
 
300
312
  return {
301
313
  containerRef,
302
- rowHeight,
314
+ rowHeight: rem(theme, designRowHeight),
315
+ rowPitch,
303
316
  visibleColumns,
304
317
  processedRows,
305
318
  visibleRows: virtualized ? processedRows.slice(range.start, range.end) : processedRows,
@@ -18,10 +18,14 @@ export interface GridColumn<T = Record<string, unknown>> {
18
18
  accessor?: keyof T | ((row: T) => unknown);
19
19
  /** Column type influences default formatting and editors */
20
20
  type?: 'text' | 'number' | 'date' | 'datetime' | 'boolean' | 'currency' | 'actions';
21
- /** Width hints (px) and min/max constraints */
22
- width?: number;
23
- minWidth?: number;
24
- maxWidth?: number;
21
+ /**
22
+ * Width hint and min/max constraints. A number is design px, scaled with the
23
+ * theme's type scale (1 or less is a fraction of the table, as in `sx`); a
24
+ * string (`'312px'`, `'20%'`) is used as given.
25
+ */
26
+ width?: number | string;
27
+ minWidth?: number | string;
28
+ maxWidth?: number | string;
25
29
  /** Column is initially hidden */
26
30
  hidden?: boolean;
27
31
  /** Pin to left/right (sticky) */
@@ -144,8 +148,10 @@ export interface DataGridProps<T = Record<string, unknown>> extends React.HTMLAt
144
148
  /** Sizing, density, and layout */
145
149
  sizeMode?: GridSizeMode; // auto | fixed | fill
146
150
  density?: GridDensity; // compact | comfortable | spacious
147
- rowHeight?: number; // default row height (px)
148
- headerHeight?: number; // default header height (px)
151
+ /** Row height (default 52) — design px, scaled with the theme's type scale; `density` scales it first. */
152
+ rowHeight?: number;
153
+ /** Header row height (default 56) — design px, scaled with the theme's type scale. */
154
+ headerHeight?: number;
149
155
  footerHeight?: number; // optional
150
156
 
151
157
  /** Interaction features */
@@ -1,5 +1,6 @@
1
1
  "use client";
2
2
 
3
+ import { useTheme, type Theme } from "@mui/material/styles/index.js";
3
4
  import { useMemo } from "react";
4
5
 
5
6
  import { type GridColumn } from "../DataGrid";
@@ -44,6 +45,7 @@ function computeHideableColumns<T extends Record<string, unknown>>(
44
45
  function appendActionsColumn<T extends Record<string, unknown>>(
45
46
  columns: DataViewColumn<T>[],
46
47
  opts: {
48
+ theme: Theme;
47
49
  rowActions?: RowAction<T>[];
48
50
  rowActionsLeading?: (row: T) => React.ReactNode;
49
51
  renderRowMenu?: (row: T) => React.ReactNode;
@@ -51,11 +53,12 @@ function appendActionsColumn<T extends Record<string, unknown>>(
51
53
  getRowId: (row: T) => string | number;
52
54
  },
53
55
  ): DataViewColumn<T>[] {
54
- const { rowActions, rowActionsLeading, renderRowMenu, testIdPrefix, getRowId } = opts;
56
+ const { theme, rowActions, rowActionsLeading, renderRowMenu, testIdPrefix, getRowId } = opts;
55
57
  if ((!rowActions && !renderRowMenu) || columns.some(isActionsColumn)) return columns;
56
58
  return [
57
59
  ...columns,
58
60
  buildRowActionsColumn({
61
+ theme,
59
62
  rowActions: rowActions ?? [],
60
63
  leading: rowActionsLeading,
61
64
  testIdPrefix,
@@ -84,10 +87,18 @@ export function useColumnsWithActions<T extends Record<string, unknown>>(
84
87
  opts: ActionsColumnOpts<T>,
85
88
  ): { columnsWithActions: DataViewColumn<T>[]; allColumnIds: string[] } {
86
89
  const { rowActions, rowActionsLeading, renderRowMenu, testIdPrefix, getRowId } = opts;
90
+ const theme = useTheme();
87
91
  const columnsWithActions = useMemo(
88
92
  () =>
89
- appendActionsColumn(columns, { rowActions, rowActionsLeading, renderRowMenu, testIdPrefix, getRowId }),
90
- [columns, rowActions, rowActionsLeading, renderRowMenu, testIdPrefix, getRowId],
93
+ appendActionsColumn(columns, {
94
+ theme,
95
+ rowActions,
96
+ rowActionsLeading,
97
+ renderRowMenu,
98
+ testIdPrefix,
99
+ getRowId,
100
+ }),
101
+ [columns, theme, rowActions, rowActionsLeading, renderRowMenu, testIdPrefix, getRowId],
91
102
  );
92
103
  const allColumnIds = useMemo(() => columnsWithActions.map((col) => col.id), [columnsWithActions]);
93
104
  return { columnsWithActions, allColumnIds };
@@ -54,6 +54,8 @@ export function buildGridColumns<T extends Record<string, unknown>>(
54
54
  }
55
55
 
56
56
  interface ActionsColumnConfig<T extends Record<string, unknown>> {
57
+ /** Whose type scale the column's width is drawn at. */
58
+ theme: Theme;
57
59
  /** Actions that build the auto "⋮" kebab. Ignored when `renderRowMenu` is set. */
58
60
  rowActions: RowAction<T>[];
59
61
  /** Optional leading slot (e.g. a favourite star) rendered before the kebab. */
@@ -80,7 +82,7 @@ interface ActionsColumnConfig<T extends Record<string, unknown>> {
80
82
  export function buildRowActionsColumn<T extends Record<string, unknown>>(
81
83
  config: ActionsColumnConfig<T>,
82
84
  ): DataViewColumn<T> {
83
- const { rowActions, leading, testIdPrefix, getRowId, renderRowMenu } = config;
85
+ const { theme, rowActions, leading, testIdPrefix, getRowId, renderRowMenu } = config;
84
86
  const kebabActions = rowActions.filter((action) => action.row !== false);
85
87
  return {
86
88
  id: "actions",
@@ -89,8 +91,8 @@ export function buildRowActionsColumn<T extends Record<string, unknown>>(
89
91
  enableSort: false,
90
92
  hideable: false,
91
93
  // Narrow: the column only holds the "⋮" kebab (plus an optional leading icon),
92
- // so it needs room for just one or two icons.
93
- width: leading ? 72 : 44,
94
+ // so it needs room for just one or two icons — 72 or 44 design px.
95
+ width: rem(theme, leading ? 72 : 44),
94
96
  cell: ({ row }) => (
95
97
  <Box component="span" sx={{ display: "inline-flex", alignItems: "center", gap: sxRem(2), justifyContent: "flex-end" }}>
96
98
  {leading?.(row)}
@@ -6,6 +6,7 @@ import GridViewOutlinedIcon from "@mui/icons-material/GridViewOutlined";
6
6
 
7
7
  import { Slider } from "../../form/Slider";
8
8
  import { Box } from "../../../mui/Box";
9
+ import { sxRem } from "../../../tokens/relative";
9
10
 
10
11
  import { useDataViewsCopy } from "./data-views-copy-context";
11
12
  import { DATA_VIEWS_LAYOUTS, type DataViewsLayout } from "./data-views-types";
@@ -41,8 +42,6 @@ const DataViewsLayoutContext = createContext<DataViewsLayoutValue | null>(null);
41
42
 
42
43
  /** Default card zoom (0–100). */
43
44
  const DEFAULT_ZOOM = 35;
44
- /** The card's width in px at scale 1 — the zoom slider multiplies this. */
45
- const BASE_CARD_WIDTH = 180;
46
45
  /** The size multiplier the zoom slider spans (0.75× to 2×). */
47
46
  const CARD_SCALE_RANGE = { min: 0.75, max: 2 } as const;
48
47
 
@@ -103,7 +102,7 @@ export const DENSITY_CARD_SCALE: Record<DataViewsDensity, number> = {
103
102
  comfortable: 1.4,
104
103
  };
105
104
 
106
- /** The width a card aims for: the base width, scaled by zoom, then by density. */
105
+ /** The width a card aims for, in design px: the base width, scaled by zoom, then by density. */
107
106
  export function cardTargetWidthFor(zoom: number, density: DataViewsDensity): number {
108
107
  return Math.round(cardMinWidthForZoom(zoom) * DENSITY_CARD_SCALE[density]);
109
108
  }
@@ -131,7 +130,7 @@ export const DENSITY_BOARD_SCALE: Record<DataViewsDensity, number> = {
131
130
 
132
131
  /**
133
132
  * Map the 0–100 zoom to the card SIZE multiplier. This is the single knob: the
134
- * card's width is {@link BASE_CARD_WIDTH} × scale and its padding + typography
133
+ * card's width is its 180 design px × scale and its padding + typography
135
134
  * scale by the same factor, so the whole card grows together (scale 2 → twice
136
135
  * the size, proportion preserved by the aspect ratio). Passed to a card via
137
136
  * `DataViewCardSelection.scale`.
@@ -141,9 +140,13 @@ export function cardScaleForZoom(zoom: number): number {
141
140
  return CARD_SCALE_RANGE.min + (clamped / 100) * (CARD_SCALE_RANGE.max - CARD_SCALE_RANGE.min);
142
141
  }
143
142
 
144
- /** The card grid's min column width in px = base width × the zoom size multiplier. */
143
+ /**
144
+ * The card grid's min column width in DESIGN px: the card's width at scale 1 —
145
+ * 180 — times the zoom size multiplier. Drawn through `rem` where the track is
146
+ * built (`cardGridTracks`), so it scales with the theme's type scale.
147
+ */
145
148
  export function cardMinWidthForZoom(zoom: number): number {
146
- return Math.round(BASE_CARD_WIDTH * cardScaleForZoom(zoom));
149
+ return Math.round(180 * cardScaleForZoom(zoom));
147
150
  }
148
151
 
149
152
  /** Which layouts this table can actually render. */
@@ -334,8 +337,8 @@ export function DataViewsZoomSlider({ testIdPrefix }: { testIdPrefix: string }):
334
337
  color: "text.secondary",
335
338
  }}
336
339
  >
337
- <GridViewOutlinedIcon sx={{ fontSize: 14 }} />
338
- <Box sx={{ width: 88, display: "flex", alignItems: "center" }}>
340
+ <GridViewOutlinedIcon sx={{ fontSize: sxRem(14) }} />
341
+ <Box sx={{ width: sxRem(88), display: "flex", alignItems: "center" }}>
339
342
  <Slider
340
343
  size="sm"
341
344
  showValue={false}
@@ -348,7 +351,7 @@ export function DataViewsZoomSlider({ testIdPrefix }: { testIdPrefix: string }):
348
351
  data-testid={`${testIdPrefix}-card-zoom`}
349
352
  />
350
353
  </Box>
351
- <GridViewOutlinedIcon sx={{ fontSize: 20 }} />
354
+ <GridViewOutlinedIcon sx={{ fontSize: sxRem(20) }} />
352
355
  </Box>
353
356
  );
354
357
  }
@@ -9,12 +9,21 @@
9
9
  * Every number here is either MEASURED in a browser (and says so) or
10
10
  * deliberately generous. Over-pricing sheds one control too early, which the
11
11
  * "Mais" button absorbs invisibly; under-pricing breaks the line.
12
+ *
13
+ * Every number is DESIGN px — measured at MUI's default type scale. The bar is
14
+ * measured in real px, so a price reaches it through `remPx` (`estimateWidth`,
15
+ * `pricesFor`): a theme that scales its type scales the controls, and so the
16
+ * prices, together — a denser theme fits more pills on the same bar.
12
17
  */
18
+ import type { Theme } from "@mui/material/styles/index.js";
19
+
20
+ import { remPx } from "../../../tokens/relative";
21
+
13
22
  import type { OverflowField } from "./data-views-overflow";
14
23
  import type { RangeValue } from "./data-views-types";
15
24
 
16
25
  /**
17
- * Rough rendered width of a control, in px.
26
+ * Rough rendered width of a control, in px at `theme`'s type scale.
18
27
  *
19
28
  * An ESTIMATE from the label text rather than a real measurement, deliberately:
20
29
  * measuring the true width needs every control mounted first, and mounting them
@@ -22,7 +31,7 @@ import type { RangeValue } from "./data-views-types";
22
31
  * avoid. The estimate only has to rank controls and find the cut point — being
23
32
  * a few px out moves the cut by at most one control, and the overflow catches it.
24
33
  */
25
- export function estimateWidth(text: string, extra: number): number {
34
+ export function estimateWidth(theme: Theme, text: string, extra: number): number {
26
35
  /**
27
36
  * ~7.6px per character at the toolbar's font size, plus 76px of chrome:
28
37
  * horizontal padding, the border, and the dropdown chevron. The chrome used
@@ -41,7 +50,7 @@ export function estimateWidth(text: string, extra: number): number {
41
50
  * still above the ~50 measured, so the slack the comment above asks for is
42
51
  * intact; it is just slack rather than a second control's worth of budget.
43
52
  */
44
- return Math.round(text.length * 7.6) + 56 + extra;
53
+ return remPx(theme, Math.round(text.length * 7.6) + 56 + extra);
45
54
  }
46
55
 
47
56
  /** Is a range bounded at either end? */
@@ -59,7 +68,7 @@ export function pillText<T extends Record<string, unknown>>(field: OverflowField
59
68
  return `${field.label}: ${values.length}`;
60
69
  }
61
70
 
62
- /** Fixed toolbar furniture the filters have to fit around, in px. */
71
+ /** Fixed toolbar furniture the filters have to fit around, in design px. */
63
72
  export const RESERVED = {
64
73
  /** The search box never shrinks below this. */
65
74
  search: 200,
@@ -131,20 +140,28 @@ export const RESERVED = {
131
140
  /**
132
141
  * The row's own padding, plus the gaps BETWEEN the fixed furniture.
133
142
  *
134
- * Not the per-control gaps — `splitFilters` already adds a `GAP` for every
135
- * filter it keeps, so counting a fourth one here charged one gap twice.
143
+ * Not the per-control gaps — `splitFilters` already adds `betweenControls`
144
+ * for every filter it keeps, so counting a fourth one here charged one gap twice.
136
145
  * MEASURED: 32px of padding (16 each side) + three 8px gaps between the
137
146
  * search, the counter and the right cluster.
138
147
  */
139
148
  chrome: 56,
149
+ /** The gap between two controls. */
150
+ betweenControls: 8,
140
151
  } as const;
141
152
 
142
- /** The gap between two controls. */
143
- export const GAP = 8;
153
+ /** {@link RESERVED} at a theme's type scale — the px the measured bar is in. */
154
+ export type Prices = Record<keyof typeof RESERVED, number>;
155
+
156
+ /** Price the furniture for `theme`: every {@link RESERVED} entry through `remPx`. */
157
+ export function pricesFor(theme: Theme): Prices {
158
+ const entries = Object.entries(RESERVED).map(([key, px]) => [key, remPx(theme, px)]);
159
+ return Object.fromEntries(entries) as Prices;
160
+ }
144
161
 
145
162
  /** What the right-hand cluster costs, given what the host actually renders. */
146
- export function rightClusterCost(hasExport: boolean, compact: boolean): number {
147
- const one = compact ? RESERVED.displayControlCompact : RESERVED.displayControl;
163
+ export function rightClusterCost(price: Prices, hasExport: boolean, compact: boolean): number {
164
+ const one = compact ? price.displayControlCompact : price.displayControl;
148
165
  return hasExport ? one * 2 : one;
149
166
  }
150
167
 
@@ -159,13 +176,14 @@ export function rightClusterCost(hasExport: boolean, compact: boolean): number {
159
176
  * as a bar carrying a magnifier, a "Mais 5" pill, and a band of nothing.
160
177
  */
161
178
  export function furnitureCost(
179
+ price: Prices,
162
180
  flags: { searchCollapsed: boolean; counterHidden: boolean; compactControls: boolean },
163
181
  hasExport: boolean,
164
182
  ): number {
165
183
  return (
166
- (flags.searchCollapsed ? RESERVED.searchIcon : RESERVED.search) +
167
- (flags.counterHidden ? 0 : RESERVED.counter) +
168
- rightClusterCost(hasExport, flags.compactControls) +
169
- RESERVED.chrome
184
+ (flags.searchCollapsed ? price.searchIcon : price.search) +
185
+ (flags.counterHidden ? 0 : price.counter) +
186
+ rightClusterCost(price, hasExport, flags.compactControls) +
187
+ price.chrome
170
188
  );
171
189
  }
@@ -1,16 +1,19 @@
1
1
  "use client";
2
2
 
3
+ import { useTheme, type Theme } from "@mui/material/styles/index.js";
3
4
  import { useRef } from "react";
4
5
 
6
+ import { remPx } from "../../../tokens/relative";
5
7
  import { splitToFit, useMeasuredWidth } from "../../utility/Overflow";
6
8
  import {
7
9
  estimateWidth,
8
10
  furnitureCost,
9
- GAP,
10
11
  isRangeSet,
11
12
  pillText,
13
+ pricesFor,
12
14
  RESERVED,
13
15
  rightClusterCost,
16
+ type Prices,
14
17
  } from "./data-views-overflow-costs";
15
18
  import type { FilterFieldConfig, RangeFieldConfig, RangeValue } from "./data-views-types";
16
19
 
@@ -118,15 +121,16 @@ function isActiveField<T extends Record<string, unknown>>(
118
121
  : isRangeSet(ranges[field.id]);
119
122
  }
120
123
 
121
- /** Estimated rendered width of one control at its CURRENT value. */
124
+ /** Estimated rendered width of one control at its CURRENT value, in px at `theme`'s scale. */
122
125
  function fieldWidth<T extends Record<string, unknown>>(
126
+ theme: Theme,
123
127
  field: OverflowField<T>,
124
128
  pills: Record<string, string[]>,
125
129
  ranges: Record<string, RangeValue>,
126
130
  ): number {
127
- if (field.group === "pill") return estimateWidth(pillText(field, pills[field.id] ?? []), 0);
128
- // A bounded range renders two number inputs beside its label.
129
- return estimateWidth(field.label, isRangeSet(ranges[field.id]) ? 100 : 0);
131
+ if (field.group === "pill") return estimateWidth(theme, pillText(field, pills[field.id] ?? []), 0);
132
+ // A bounded range renders two number inputs (100 design px) beside its label.
133
+ return estimateWidth(theme, field.label, isRangeSet(ranges[field.id]) ? 100 : 0);
130
134
  }
131
135
 
132
136
  /** What one split costs on the bar, so the ladder below can price the next step. */
@@ -147,12 +151,16 @@ function splitFilters<T extends Record<string, unknown>>(
147
151
  furniture: number,
148
152
  /** Is the bar already down to icons? "Mais" shrinks with everything else. */
149
153
  compact: boolean,
154
+ /** Whose type scale every price is read at — the bar's own. */
155
+ theme: Theme,
150
156
  ): Split<T> {
151
157
  const active = all.filter((field) => isActiveField(field, pills, ranges));
152
158
  const idle = all.filter((field) => !isActiveField(field, pills, ranges));
159
+ const price = pricesFor(theme);
160
+ const gap = remPx(theme, RESERVED.betweenControls);
153
161
 
154
162
  // "Limpar" rides the end of the cluster whenever anything is applied.
155
- const clearCost = active.length > 0 ? RESERVED.clearAll + GAP : 0;
163
+ const clearCost = active.length > 0 ? price.clearAll + gap : 0;
156
164
  // APPLIED FIRST, BUT NOT EXEMPT.
157
165
  //
158
166
  // Applied controls take the visible slots ahead of idle ones — that part was
@@ -170,13 +178,13 @@ function splitFilters<T extends Record<string, unknown>>(
170
178
  // one part of this that is not filter-shaped, and the part a second cluster
171
179
  // in the design system would otherwise have had to reimplement.
172
180
  const split = splitToFit(all, {
173
- widthOf: (field) => fieldWidth(field, pills, ranges),
181
+ widthOf: (field) => fieldWidth(theme, field, pills, ranges),
174
182
  keyOf: (field) => field.id,
175
- gap: GAP,
183
+ gap,
176
184
  available: width - furniture - clearCost,
177
185
  // The overflow button at the width it will actually have, which on a phone
178
186
  // is the icon-and-badge one.
179
- overflowCost: compact ? RESERVED.overflowButtonCompact : RESERVED.overflowButton,
187
+ overflowCost: compact ? price.overflowButtonCompact : price.overflowButton,
180
188
  priority: [...active, ...idle],
181
189
  });
182
190
  return { ...split, used: split.used + clearCost };
@@ -206,6 +214,7 @@ function computeSplit<T extends Record<string, unknown>>(
206
214
  width: number,
207
215
  /** Does the host render "Exportar" beside "Exibir"? Half the cluster if not. */
208
216
  hasExport: boolean,
217
+ theme: Theme,
209
218
  ): Omit<OverflowSplit<T>, "barRef"> {
210
219
  // Unmeasured (SSR, or jsdom without a ResizeObserver) ⇒ degrade nothing.
211
220
  if (width === 0) {
@@ -219,9 +228,11 @@ function computeSplit<T extends Record<string, unknown>>(
219
228
  searchTakeover: false,
220
229
  };
221
230
  }
231
+ const price = pricesFor(theme);
222
232
  // Pass 1 prices the furniture at its widest — no rung has been taken yet.
223
- let split = splitFilters(all, pills, ranges, width, furnitureCost(UNCOLLAPSED, hasExport), false);
224
- let flags = ladderFlags(split, width, hasExport);
233
+ let budget = furnitureCost(price, UNCOLLAPSED, hasExport);
234
+ let split = splitFilters(all, pills, ranges, width, budget, false, theme);
235
+ let flags = ladderFlags(split, width, hasExport, price);
225
236
  // RE-SPEND WHAT THE LATER RUNGS FREED.
226
237
  //
227
238
  // Rungs 2/4/5 turn 200 + 96 + 216 of furniture into 44 + 0 + 140, and until
@@ -234,13 +245,12 @@ function computeSplit<T extends Record<string, unknown>>(
234
245
  // ladder FURTHER down, and a further rung can only make the furniture
235
246
  // cheaper again — so the budget decreases monotonically and the loop exits
236
247
  // the moment it stops moving. The bound is a backstop, not the exit.
237
- let budget = furnitureCost(UNCOLLAPSED, hasExport);
238
248
  for (let pass = 0; pass < 3; pass += 1) {
239
- const freed = furnitureCost(flags, hasExport);
249
+ const freed = furnitureCost(price, flags, hasExport);
240
250
  if (freed >= budget) break;
241
251
  budget = freed;
242
- split = splitFilters(all, pills, ranges, width, budget, flags.compactControls);
243
- flags = ladderFlags(split, width, hasExport);
252
+ split = splitFilters(all, pills, ranges, width, budget, flags.compactControls, theme);
253
+ flags = ladderFlags(split, width, hasExport, price);
244
254
  }
245
255
  return { inline: split.inline, overflow: split.overflow, ...flags };
246
256
  }
@@ -253,21 +263,22 @@ function ladderFlags<T extends Record<string, unknown>>(
253
263
  split: Split<T>,
254
264
  width: number,
255
265
  hasExport: boolean,
266
+ price: Prices,
256
267
  ): Omit<OverflowSplit<T>, "barRef" | "inline" | "overflow"> {
257
268
  const { overflow, used } = split;
258
- const base = width - used - RESERVED.chrome;
269
+ const base = width - used - price.chrome;
259
270
 
260
271
  // Would the search still make its minimum with the labels on?
261
- const compactControls = base - RESERVED.counter - rightClusterCost(hasExport, false) < RESERVED.search;
262
- const rightCost = rightClusterCost(hasExport, compactControls);
272
+ const compactControls = base - price.counter - rightClusterCost(price, hasExport, false) < price.search;
273
+ const rightCost = rightClusterCost(price, hasExport, compactControls);
263
274
  // …and with them off?
264
- const searchCollapsed = base - RESERVED.counter - rightCost < RESERVED.search;
275
+ const searchCollapsed = base - price.counter - rightCost < price.search;
265
276
  // Everything has collapsed and the row STILL overflows. The controls cannot
266
277
  // shrink further — they are `flexShrink: 0` precisely so an over-packed row
267
278
  // sheds rather than squeezes — so without this last rung they simply paint
268
279
  // outside the toolbar, which is what a narrow phone was doing.
269
280
  const counterHidden =
270
- searchCollapsed && base - RESERVED.counter - rightCost < RESERVED.searchIcon;
281
+ searchCollapsed && base - price.counter - rightCost < price.searchIcon;
271
282
  // Step 6 — below even that, "Limpar" leaves the bar. It is the ONLY control
272
283
  // here with a second home: the overflow panel's footer carries "Limpar todos
273
284
  // os filtros", so nothing is lost, which is exactly why it goes before the
@@ -288,14 +299,14 @@ function ladderFlags<T extends Record<string, unknown>>(
288
299
  // pushed the box under `usableSearch`, and tipped a row that had ample space
289
300
  // to share into a full takeover.
290
301
  const overflowButton = compactControls
291
- ? RESERVED.overflowButtonCompact
292
- : RESERVED.overflowButton;
293
- const shedRoom = width - RESERVED.chrome - (overflow.length > 0 ? overflowButton : 0);
294
- const searchBoxRoom = shedRoom - (counterHidden ? 0 : RESERVED.counter) - rightCost;
302
+ ? price.overflowButtonCompact
303
+ : price.overflowButton;
304
+ const shedRoom = width - price.chrome - (overflow.length > 0 ? overflowButton : 0);
305
+ const searchBoxRoom = shedRoom - (counterHidden ? 0 : price.counter) - rightCost;
295
306
  // Below this a box is too narrow to read what you typed into it, and shrinking
296
307
  // further buys nothing; that is the only point at which taking the whole
297
308
  // cluster is worth losing the filters.
298
- const searchTakeover = searchCollapsed && searchBoxRoom < RESERVED.usableSearch;
309
+ const searchTakeover = searchCollapsed && searchBoxRoom < price.usableSearch;
299
310
 
300
311
  return { compactControls, counterHidden, searchCollapsed, clearAllHidden, searchTakeover };
301
312
  }
@@ -336,16 +347,19 @@ export function useFilterOverflow<T extends Record<string, unknown>>(
336
347
  // first measurement lands (and forever under SSR or jsdom), which
337
348
  // `computeSplit` reads as "degrade nothing".
338
349
  const { ref: barRef, width } = useMeasuredWidth<HTMLDivElement>();
350
+ // The prices follow the theme's type scale, so the answer does too.
351
+ const theme = useTheme();
339
352
  const signature = JSON.stringify({
340
353
  ids: all.map((field) => field.id),
341
354
  pills,
342
355
  ranges,
343
356
  width,
344
357
  hasExport,
358
+ scale: remPx(theme, 1),
345
359
  });
346
360
  const cache = useRef<{ signature: string; split: ReturnType<typeof computeSplit<T>> } | null>(null);
347
361
  if (cache.current === null || (!frozen && cache.current.signature !== signature)) {
348
- cache.current = { signature, split: computeSplit(all, pills, ranges, width, hasExport) };
362
+ cache.current = { signature, split: computeSplit(all, pills, ranges, width, hasExport, theme) };
349
363
  }
350
364
  return { ...cache.current.split, barRef };
351
365
  }
@@ -2,12 +2,14 @@ import { alpha, useTheme } from '@mui/material/styles/index.js';
2
2
  import type { FC } from 'react';
3
3
  import React from 'react';
4
4
 
5
- import { TILE_SIZE } from './mapProjection';
5
+ import { rem } from '../../../tokens/relative';
6
+
7
+ import { TILE_WORLD_UNITS } from './mapProjection';
6
8
  import { tileBackground } from './mapSurface';
7
9
  import type { MapType } from './MapPreview.types';
8
10
 
9
11
  // Two extra rows and columns so panning does not expose an edge.
10
- const VISIBLE_TILES = Math.ceil(800 / TILE_SIZE) + 2;
12
+ const VISIBLE_TILES = Math.ceil(800 / TILE_WORLD_UNITS) + 2;
11
13
  // Tile coordinates are only legible once the grid is reasonably fine.
12
14
  const LABEL_MIN_ZOOM = 10;
13
15
 
@@ -23,6 +25,9 @@ export const MapTiles: FC<MapTilesProps> = ({ origin, zoom, mapType, panOffset }
23
25
  const borderOpacity = theme.palette.mode === 'dark' ? 0.15 : 0.1;
24
26
  const background = tileBackground(mapType, theme);
25
27
  const half = Math.floor(VISIBLE_TILES / 2);
28
+ // A tile is drawn at one design px per world unit, through the type scale.
29
+ const tile = rem(theme, TILE_WORLD_UNITS);
30
+ const grid = rem(theme, TILE_WORLD_UNITS * VISIBLE_TILES);
26
31
 
27
32
  return (
28
33
  <div
@@ -30,12 +35,14 @@ export const MapTiles: FC<MapTilesProps> = ({ origin, zoom, mapType, panOffset }
30
35
  position: 'absolute',
31
36
  top: '50%',
32
37
  left: '50%',
38
+ // The pan is pointer pixels dragged, so it stays px: the grid follows
39
+ // the cursor exactly, whatever the type scale.
33
40
  transform: `translate(calc(-50% + ${panOffset.x}px), calc(-50% + ${panOffset.y}px))`,
34
- width: TILE_SIZE * VISIBLE_TILES,
35
- height: TILE_SIZE * VISIBLE_TILES,
41
+ width: grid,
42
+ height: grid,
36
43
  display: 'grid',
37
- gridTemplateColumns: `repeat(${VISIBLE_TILES}, ${TILE_SIZE}px)`,
38
- gridTemplateRows: `repeat(${VISIBLE_TILES}, ${TILE_SIZE}px)`,
44
+ gridTemplateColumns: `repeat(${VISIBLE_TILES}, ${tile})`,
45
+ gridTemplateRows: `repeat(${VISIBLE_TILES}, ${tile})`,
39
46
  transition: 'transform 0.1s ease-out',
40
47
  }}
41
48
  >
@@ -48,14 +55,14 @@ export const MapTiles: FC<MapTilesProps> = ({ origin, zoom, mapType, panOffset }
48
55
  <div
49
56
  key={`tile-${tileX}-${tileY}`}
50
57
  style={{
51
- width: TILE_SIZE,
52
- height: TILE_SIZE,
58
+ width: tile,
59
+ height: tile,
53
60
  border: `1px solid ${alpha(theme.palette.divider, borderOpacity)}`,
54
61
  background,
55
62
  display: 'flex',
56
63
  alignItems: 'center',
57
64
  justifyContent: 'center',
58
- fontSize: '10px',
65
+ fontSize: rem(theme, 10),
59
66
  color: alpha(theme.palette.text.secondary, 0.3),
60
67
  fontFamily: 'monospace',
61
68
  userSelect: 'none',