@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
@@ -1,4 +1,9 @@
1
- export const TILE_SIZE = 256;
1
+ /**
2
+ * One tile's extent in Web Mercator's world units at zoom 0 — the projection's
3
+ * own coordinate space, not a drawn length: the tile index it yields is the
4
+ * same at any drawn size. `MapTiles` draws one world unit as one design px.
5
+ */
6
+ export const TILE_WORLD_UNITS = 256;
2
7
 
3
8
  // Metres covered by one pixel at zoom 0 on the equator; each zoom level halves it.
4
9
  const EQUATOR_METRES_PER_PIXEL = 156543.03392;
@@ -12,8 +17,8 @@ const project = (lat: number, lng: number) => {
12
17
  const boundedSiny = Math.max(-0.9999, Math.min(0.9999, siny));
13
18
 
14
19
  return {
15
- x: TILE_SIZE * (0.5 + lng / 360),
16
- y: TILE_SIZE * (0.5 - Math.log((1 + boundedSiny) / (1 - boundedSiny)) / (4 * Math.PI)),
20
+ x: TILE_WORLD_UNITS * (0.5 + lng / 360),
21
+ y: TILE_WORLD_UNITS * (0.5 - Math.log((1 + boundedSiny) / (1 - boundedSiny)) / (4 * Math.PI)),
17
22
  };
18
23
  };
19
24
 
@@ -22,8 +27,8 @@ export const getTileCoordinates = (lat: number, lng: number, zoom: number) => {
22
27
  const world = project(lat, lng);
23
28
 
24
29
  return {
25
- x: Math.floor(Math.floor(world.x * scale) / TILE_SIZE),
26
- y: Math.floor(Math.floor(world.y * scale) / TILE_SIZE),
30
+ x: Math.floor(Math.floor(world.x * scale) / TILE_WORLD_UNITS),
31
+ y: Math.floor(Math.floor(world.y * scale) / TILE_WORLD_UNITS),
27
32
  };
28
33
  };
29
34
 
@@ -1,5 +1,12 @@
1
1
  import type { TableProps } from './Table.types';
2
2
 
3
+ /**
4
+ * A virtualised row's height in design px: the caller's `rowHeight`, else 52.
5
+ * Resolved here rather than in {@link TABLE_DEFAULTS} so the one number is read
6
+ * where it is drawn (`rem`) and where the window is positioned with it (`remPx`).
7
+ */
8
+ export const tableRowHeight = (rowHeight: number | undefined): number => rowHeight ?? 52;
9
+
3
10
  export const TABLE_DEFAULTS: Partial<TableProps> = {
4
11
  variant: 'default',
5
12
  stripeColor: 'neutral',
@@ -13,7 +20,6 @@ export const TABLE_DEFAULTS: Partial<TableProps> = {
13
20
  selectedRows: [],
14
21
  sortable: false,
15
22
  virtualScrolling: false,
16
- rowHeight: 52,
17
23
  overscan: 5,
18
24
  responsive: false,
19
25
  showColumnToggle: true,
@@ -2,22 +2,31 @@ import { useTheme } from '@mui/material/styles/index.js';
2
2
  import useMediaQuery from '@mui/material/useMediaQuery/index.js';
3
3
  import { useCallback, useEffect, useMemo, useState } from 'react';
4
4
 
5
+ import { rem, remPx } from '../../../tokens/relative';
6
+
5
7
  import type { ColumnConfig, TableProps } from './Table.types';
6
8
 
9
+ /**
10
+ * The virtual window. `rowHeight` and `containerHeight` are design px: the
11
+ * window is computed in the px `scrollTop` is measured in (`remPx`), and what it
12
+ * hands back to draw with stays in design px (`offsetY`) or is CSS already
13
+ * (`totalHeight`), so the rows and the window share one pitch at any type scale.
14
+ */
7
15
  export const useVirtualScrolling = (
8
16
  data: Record<string, unknown>[],
9
17
  rowHeight: number,
10
18
  containerHeight: number,
11
19
  overscan: number = 5
12
20
  ) => {
21
+ const theme = useTheme();
13
22
  const [scrollTop, setScrollTop] = useState(0);
14
23
 
15
24
  const visibleItems = useMemo(() => {
16
- const visibleHeight = containerHeight;
17
- const startIndex = Math.floor(scrollTop / rowHeight);
25
+ const pitch = remPx(theme, rowHeight);
26
+ const startIndex = Math.floor(scrollTop / pitch);
18
27
  const endIndex = Math.min(
19
28
  data.length,
20
- Math.ceil((scrollTop + visibleHeight) / rowHeight)
29
+ Math.ceil((scrollTop + remPx(theme, containerHeight)) / pitch)
21
30
  );
22
31
 
23
32
  const start = Math.max(0, startIndex - overscan);
@@ -27,10 +36,12 @@ export const useVirtualScrolling = (
27
36
  startIndex: start,
28
37
  endIndex: end,
29
38
  items: data.slice(start, end),
30
- totalHeight: data.length * rowHeight,
39
+ /** Every row at the scaled pitch, as CSS. */
40
+ totalHeight: rem(theme, data.length * rowHeight),
41
+ /** Where the first mounted row sits, in design px. */
31
42
  offsetY: start * rowHeight,
32
43
  };
33
- }, [data, rowHeight, containerHeight, scrollTop, overscan]);
44
+ }, [data, rowHeight, containerHeight, scrollTop, overscan, theme]);
34
45
 
35
46
  const handleScroll = useCallback((e: React.UIEvent<HTMLDivElement>) => {
36
47
  setScrollTop(e.currentTarget.scrollTop);
@@ -22,7 +22,9 @@ export interface ColumnConfig {
22
22
  label: string;
23
23
  sortable?: boolean;
24
24
  filterable?: boolean;
25
+ /** A number is design px, scaled with the theme's type scale; a string is used as given. */
25
26
  width?: number | string;
27
+ /** Design px, scaled with the theme's type scale. */
26
28
  minWidth?: number;
27
29
  priority?: number; // 1 = highest priority, higher numbers = lower priority
28
30
  align?: 'left' | 'center' | 'right';
@@ -191,7 +193,8 @@ export interface TableProps extends Omit<MuiTableProps, 'variant'> {
191
193
  virtualScrolling?: boolean;
192
194
 
193
195
  /**
194
- * Height of each row for virtual scrolling (required if virtualScrolling is true)
196
+ * Height of each row for virtual scrolling (default 52) — design px, scaled
197
+ * with the theme's type scale.
195
198
  */
196
199
  rowHeight?: number;
197
200
 
@@ -226,7 +229,8 @@ export interface TableProps extends Omit<MuiTableProps, 'variant'> {
226
229
  showColumnToggle?: boolean;
227
230
 
228
231
  /**
229
- * Container height for virtual scrolling
232
+ * Container height for virtual scrolling (default 400). A number is design
233
+ * px, scaled with the theme's type scale; a string is used as given.
230
234
  */
231
235
  containerHeight?: number | string;
232
236
 
@@ -5,8 +5,12 @@ import TableCell from '@mui/material/TableCell/index.js';
5
5
  import TableHead from '@mui/material/TableHead/index.js';
6
6
  import TableRow from '@mui/material/TableRow/index.js';
7
7
  import TableSortLabel from '@mui/material/TableSortLabel/index.js';
8
+ import { useTheme, type Theme } from '@mui/material/styles/index.js';
8
9
  import React, { useCallback } from 'react';
9
10
 
11
+ import { rem } from '../../../tokens/relative';
12
+
13
+ import { tableRowHeight } from './Table.helpers';
10
14
  import { useVirtualScrolling } from './Table.hooks';
11
15
  import { useTableRowRenderer } from './TableParts.hooks';
12
16
  import type { ColumnConfig, TableBodyProps, TableHeaderProps } from './Table.types';
@@ -23,6 +27,10 @@ const ariaSortFor = (
23
27
  return direction === 'asc' ? 'ascending' : 'descending';
24
28
  };
25
29
 
30
+ /** A column's `width`/`minWidth` as CSS: a number is design px, a string as given. */
31
+ const columnLength = (theme: Theme, value: number | string | undefined): string | undefined =>
32
+ typeof value === 'number' ? rem(theme, value) : value;
33
+
26
34
  // One header cell. Sorting is offered when the table is sortable and the column
27
35
  // has not opted out; aria-sort mirrors the visible indicator.
28
36
  const HeaderCell: React.FC<{
@@ -31,13 +39,17 @@ const HeaderCell: React.FC<{
31
39
  sortConfig?: { key: string; direction: 'asc' | 'desc' };
32
40
  onSort: (columnKey: string) => void;
33
41
  }> = ({ column, sortable, sortConfig, onSort }) => {
42
+ const theme = useTheme();
34
43
  const canSort = Boolean(sortable) && column.sortable !== false;
35
44
  const isSorted = sortConfig?.key === column.key;
36
45
 
37
46
  return (
38
47
  <TableCell
39
48
  align={column.align || 'left'}
40
- style={{ minWidth: column.minWidth, width: column.width }}
49
+ style={{
50
+ minWidth: columnLength(theme, column.minWidth),
51
+ width: columnLength(theme, column.width),
52
+ }}
41
53
  aria-sort={ariaSortFor(canSort, isSorted, sortConfig?.direction)}
42
54
  >
43
55
  {canSort ? (
@@ -120,10 +132,12 @@ export const TableDataRow: React.FC<{
120
132
  rowData: Record<string, unknown>;
121
133
  rowKey: string | number;
122
134
  index: number;
135
+ /** Where a virtualised row sits, in design px — drawn through `rem`, like its height. */
123
136
  offsetY: number;
124
137
  columns: ColumnConfig[];
125
138
  selected: boolean;
126
139
  selectable?: boolean;
140
+ /** Design px; 52 when unset (`tableRowHeight`). */
127
141
  rowHeight?: number;
128
142
  onRowClick?: TableBodyProps['onRowClick'];
129
143
  onRowFocus?: TableBodyProps['onRowFocus'];
@@ -145,8 +159,9 @@ export const TableDataRow: React.FC<{
145
159
  onRowBlur,
146
160
  onSelect,
147
161
  virtualScrolling,
148
- renderCell }) => (
149
-
162
+ renderCell }) => {
163
+ const theme = useTheme();
164
+ return (
150
165
  <TableRow
151
166
  key={String(rowKey)}
152
167
  selected={selected}
@@ -155,12 +170,12 @@ export const TableDataRow: React.FC<{
155
170
  onFocus={(event: React.FocusEvent<globalThis.HTMLTableRowElement>) => onRowFocus?.(event, rowData)}
156
171
  onBlur={(event: React.FocusEvent<globalThis.HTMLTableRowElement>) => onRowBlur?.(event, rowData)}
157
172
  style={virtualScrolling ? {
158
- transform: `translateY(${offsetY}px)`,
173
+ transform: `translateY(${rem(theme, offsetY)})`,
159
174
  position: 'absolute',
160
175
  top: 0,
161
176
  left: 0,
162
177
  right: 0,
163
- height: rowHeight } : undefined}
178
+ height: rem(theme, tableRowHeight(rowHeight)) } : undefined}
164
179
  >
165
180
  {selectable && (
166
181
  <TableCell padding="checkbox">
@@ -186,16 +201,19 @@ export const TableDataRow: React.FC<{
186
201
  );
187
202
  })}
188
203
  </TableRow>
189
- );
204
+ );
205
+ };
190
206
 
191
207
  // Only the rows in view are rendered, positioned by absolute offset inside a
192
- // spacer sized to the full data set.
208
+ // spacer sized to the full data set. `rowHeight`, `containerHeight` and every
209
+ // offset are design px, drawn through `rem`.
193
210
  const VirtualisedBody: React.FC<{
194
211
  visibleItems: {
195
212
  items: Record<string, unknown>[];
196
213
  startIndex: number;
197
214
  offsetY: number;
198
- totalHeight: number;
215
+ /** As CSS. */
216
+ totalHeight: string;
199
217
  };
200
218
  rowHeight: number;
201
219
  containerHeight: number;
@@ -205,12 +223,13 @@ const VirtualisedBody: React.FC<{
205
223
  index: number,
206
224
  offsetY?: number,
207
225
  ) => React.ReactNode;
208
- }> = ({ visibleItems, rowHeight, containerHeight, onScroll, renderTableRow }) => (
209
-
226
+ }> = ({ visibleItems, rowHeight, containerHeight, onScroll, renderTableRow }) => {
227
+ const theme = useTheme();
228
+ return (
210
229
  <Box
211
230
  onScroll={onScroll}
212
231
  style={{
213
- height: containerHeight,
232
+ height: rem(theme, containerHeight),
214
233
  overflow: 'auto',
215
234
  position: 'relative' }}
216
235
  >
@@ -224,8 +243,8 @@ const VirtualisedBody: React.FC<{
224
243
  )}
225
244
  </TableBody>
226
245
  </Box>
227
-
228
- );
246
+ );
247
+ };
229
248
 
230
249
  const PlainBody: React.FC<{
231
250
  data: TableBodyProps['data'];
@@ -238,35 +257,12 @@ const PlainBody: React.FC<{
238
257
  );
239
258
 
240
259
  // Enhanced Table Body Component
241
- export const EnhancedTableBody: React.FC<TableBodyProps> = React.memo(({
242
- data,
243
- columns,
244
- selectedRows = [],
245
- onRowClick,
246
- onRowFocus,
247
- onRowBlur,
248
- onSelectionChange,
249
- rowKeyExtractor,
250
- selectable,
251
- renderRow,
252
- renderCell,
253
- virtualScrolling,
254
- containerHeight,
255
- rowHeight,
256
- overscan = 5 }) => {
257
- const renderTableRow = useTableRowRenderer({
258
- columns,
259
- selectedRows,
260
- onRowClick,
261
- onRowFocus,
262
- onRowBlur,
263
- onSelectionChange,
264
- rowKeyExtractor,
265
- selectable,
266
- renderRow,
267
- renderCell,
268
- virtualScrolling,
269
- rowHeight });
260
+ export const EnhancedTableBody: React.FC<TableBodyProps> = React.memo((props) => {
261
+ const { data, virtualScrolling, containerHeight, overscan = 5 } = props;
262
+ // The row renderer takes the body's own props; its `rowHeight` stays the
263
+ // caller's design px, and the row resolves the default where it draws it.
264
+ const renderTableRow = useTableRowRenderer({ ...props, selectedRows: props.selectedRows ?? [] });
265
+ const rowHeight = tableRowHeight(props.rowHeight);
270
266
 
271
267
  const { visibleItems, handleScroll } = useVirtualScrolling(
272
268
  data,
@@ -3,6 +3,8 @@ import Box from '@mui/material/Box/index.js';
3
3
  import Paper from '@mui/material/Paper/index.js';
4
4
  import React from 'react';
5
5
 
6
+ import { rem, sxRem } from '../../../tokens/relative';
7
+
6
8
  import { resolveCalendarProps } from './Calendar.helpers';
7
9
  import { useCalendar } from './Calendar.hooks';
8
10
  import type { CalendarProps } from './Calendar.types';
@@ -16,9 +18,9 @@ const containerSx = (monthsToShow: number): SxProps<Theme> => ({
16
18
  gap: 3,
17
19
  outline: 'none',
18
20
  '&:focus-within': {
19
- outline: '2px solid',
21
+ outline: (theme: Theme) => `${rem(theme, 2)} solid`,
20
22
  outlineColor: 'primary.main',
21
- outlineOffset: 2,
23
+ outlineOffset: sxRem(2),
22
24
  },
23
25
  });
24
26
 
@@ -3,9 +3,12 @@ import Box from '@mui/material/Box/index.js';
3
3
  import type { FC } from 'react';
4
4
  import React from 'react';
5
5
 
6
+ import { rem, sxRem } from '../../../tokens/relative';
7
+
6
8
  import type { DayRenderArgs } from './Calendar.types';
7
9
 
8
- const CELL_SIZE = 40;
10
+ /** A day cell's edge, 40 design px through the theme's type scale. */
11
+ const CELL_SIZE = sxRem(40);
9
12
 
10
13
  interface DayState extends DayRenderArgs {
11
14
  outside: boolean;
@@ -72,9 +75,9 @@ const dayCellSx = (day: DayRenderArgs, visible: boolean): SxProps<Theme> => ({
72
75
  backgroundColor: hoverBackgroundFor(day),
73
76
  },
74
77
  '&:focus': {
75
- outline: '2px solid',
78
+ outline: (theme: Theme) => `${rem(theme, 2)} solid`,
76
79
  outlineColor: 'primary.main',
77
- outlineOffset: 1,
80
+ outlineOffset: sxRem(1),
78
81
  },
79
82
  });
80
83
 
@@ -6,12 +6,15 @@ import Typography from '@mui/material/Typography/index.js';
6
6
  import type { FC } from 'react';
7
7
  import React from 'react';
8
8
 
9
+ import { sxRem } from '../../../tokens/relative';
10
+
9
11
  import { getMonthName } from './Calendar.dates';
10
12
  import type { CalendarProps, MonthMatrix } from './Calendar.types';
11
13
  import type { DayCellContext } from './CalendarDayCell';
12
14
  import { CalendarDayCell } from './CalendarDayCell';
13
15
 
14
- const SPACER_WIDTH = 32;
16
+ /** The nav spacer's width and the weekday row's height, 32 design px through the type scale. */
17
+ const SPACER_WIDTH = sxRem(32);
15
18
 
16
19
  const GRID_SX = { display: 'grid', gridTemplateColumns: 'repeat(7, 1fr)', gap: 0.5 } as const;
17
20
 
@@ -66,7 +69,7 @@ const WeekdayHeader: FC<{ weekdayNames: string[] }> = ({ weekdayNames }) => (
66
69
  alignItems: 'center',
67
70
  justifyContent: 'center',
68
71
  height: SPACER_WIDTH,
69
- fontSize: '0.875rem',
72
+ fontSize: sxRem(14),
70
73
  fontWeight: 'bold',
71
74
  color: 'text.secondary',
72
75
  }}
@@ -109,7 +112,7 @@ export const CalendarMonth: FC<CalendarMonthProps> = ({
109
112
  January's 5th and February's. Without a per-month hook a test can only
110
113
  reach a day positionally, which is exactly what the flakiness gate
111
114
  refuses. Additive: `calendar-grid` below is unchanged. */
112
- <Box sx={{ minWidth: 280 }} data-testid={`calendar-month-${monthIndex}`}>
115
+ <Box sx={{ minWidth: sxRem(280) }} data-testid={`calendar-month-${monthIndex}`}>
113
116
  <MonthNavHeader
114
117
  title={title}
115
118
  showPrevious={monthIndex === 0}
@@ -87,12 +87,26 @@ export const MUI_SHADOWS: Record<number, string> = {
87
87
  3: ELEVATION_SHADOWS[3],
88
88
  };
89
89
 
90
- /** The iOS thumb's own three-layer shadow, which the web writes out literally. */
91
- export const 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)}`;
90
+ /**
91
+ * How a shadow builder writes one of its lengths. Native takes the px as they
92
+ * stand ({@link AS_PX}); the web hands in its type scale (`rem`), so the iOS
93
+ * shadows scale with the theme like every other length it draws.
94
+ */
95
+ export type ShadowLength = (px: number) => string;
96
+
97
+ /** A length written as the px it was drawn at — what native reads. */
98
+ export const AS_PX: ShadowLength = (value) => `${value}px`;
99
+
100
+ /** The iOS thumb's own three-layer shadow. */
101
+ export const iosThumbShadow = (length: ShadowLength = AS_PX): string =>
102
+ `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)}`;
103
+
104
+ /** {@link iosThumbShadow} in px, as native draws it. */
105
+ export const IOS_THUMB_SHADOW = iosThumbShadow();
92
106
 
93
- /** The iOS track's inset hairline. */
94
- export const iosTrackShadow = (): string =>
95
- `inset 0 0 0 0.5px ${alpha(SWITCH_BLACK, 0.1)}, inset 0 2px 3px ${alpha(SWITCH_BLACK, 0.12)}`;
107
+ /** The iOS track's inset hairline and inner shade. */
108
+ export const iosTrackShadow = (length: ShadowLength = AS_PX): string =>
109
+ `inset 0 0 0 ${length(0.5)} ${alpha(SWITCH_BLACK, 0.1)}, inset 0 ${length(2)} ${length(3)} ${alpha(SWITCH_BLACK, 0.12)}`;
96
110
 
97
111
  /** The resting track: a black wash on iOS, the disabled ink elsewhere. */
98
112
  export const TRACK_ALPHA = { ios: 0.1, android: 0.2, other: 0.3 } as const;
@@ -12,7 +12,6 @@ import {
12
12
  import {
13
13
  DISABLED,
14
14
  IOS_BASE_OFFSET,
15
- IOS_THUMB_SHADOW,
16
15
  IOS_TRAVEL_INSET,
17
16
  SWITCH_GLASS,
18
17
  SWITCH_GLOW,
@@ -30,6 +29,7 @@ import {
30
29
  TRACK_LABEL,
31
30
  TRACK_RADIUS,
32
31
  geometryOf,
32
+ iosThumbShadow,
33
33
  iosTrackShadow,
34
34
  lookOf,
35
35
  seconds,
@@ -108,7 +108,9 @@ const lengthOrPercent = (theme: Theme, value: number | string): string =>
108
108
  typeof value === 'number' ? rem(theme, value) : value;
109
109
 
110
110
  const thumbShadow = (theme: Theme, look: SwitchLook): string =>
111
- look === 'ios' ? IOS_THUMB_SHADOW : (theme.shadows[THUMB_ELEVATION[look]] ?? 'none');
111
+ look === 'ios'
112
+ ? iosThumbShadow((px) => rem(theme, px))
113
+ : (theme.shadows[THUMB_ELEVATION[look]] ?? 'none');
112
114
 
113
115
  /** The ripple that expands from the thumb on hover. */
114
116
  const rippleOverlay = (palette: ColorPalette): CSSObject => ({
@@ -356,7 +358,7 @@ const trackSx = (
356
358
  opacity: 1,
357
359
  transition: `all ${seconds(SWITCH_TRANSITION.ms)} ${SWITCH_TRANSITION.easing}`,
358
360
  position: 'relative',
359
- boxShadow: look === 'ios' ? iosTrackShadow() : 'none',
361
+ boxShadow: look === 'ios' ? iosTrackShadow((px) => rem(theme, px)) : 'none',
360
362
  ...(glass && {
361
363
  backgroundColor: alpha(theme.palette.background.paper, SWITCH_GLASS.trackAlpha),
362
364
  backdropFilter: `blur(${rem(theme, SWITCH_GLASS.trackBlur)})`,
@@ -1,11 +1,13 @@
1
+ import { useTheme, type Theme } from "@mui/material/styles/index.js";
1
2
  import { Children, type CSSProperties, type ReactNode, type Ref } from "react";
2
3
 
4
+ import { rem } from "../../../tokens/relative";
3
5
  import { cn } from "../../../utils/cn";
4
6
 
5
7
  /**
6
8
  * How the grid turns surplus row space into layout:
7
9
  *
8
- * - `"fixed"` — every column is exactly `cardWidth` px; leftover row space is
10
+ * - `"fixed"` — every column is exactly `cardWidth` design px; leftover row space is
9
11
  * spread as even gutters (`justify-content: space-around`). Cards never resize;
10
12
  * the column count changes with the viewport. This is the original tabwoah
11
13
  * card-grid behavior.
@@ -14,7 +16,7 @@ import { cn } from "../../../utils/cn";
14
16
  * left-aligned at a single track's width rather than stretching edge to edge.
15
17
  * - `"scroll"` — a single row that scrolls horizontally, with fluid-width cards
16
18
  * sized from the container so that exactly {@link SCROLL_VISIBLE_CARDS} cards
17
- * plus a {@link SCROLL_PEEK_WIDTH}px sliver of the next one fit on screen (up
19
+ * plus a `GRID.peekPx` sliver of the next one fit on screen (up
18
20
  * to `maxCardWidth`, past which more cards simply fit). The sliver is the
19
21
  * point: it makes the rail visibly continue past the fold, so the row reads as
20
22
  * swipeable instead of as a finished pair of cards. Wrapping is off; the row
@@ -23,19 +25,27 @@ import { cn } from "../../../utils/cn";
23
25
  */
24
26
  export type CardGridVariant = "fixed" | "fluid" | "scroll";
25
27
 
26
- /** The grid gap, in px — mirrors the `gap: 1rem` below, for the scroll math. */
27
- const GRID_GAP = 16;
28
+ /**
29
+ * The grid's own lengths, in design px — every one drawn through `rem`, so the
30
+ * `gap` the grid lays out with and the gap the scroll track math reserves are
31
+ * the same length at any type scale.
32
+ */
33
+ const GRID = {
34
+ /** Between cards: the grid's `gap`, and what the scroll math reserves per gap. */
35
+ gapPx: 16,
36
+ /**
37
+ * `scroll`: the next card left visible past the last whole one — the
38
+ * "there's more, swipe" hint. Wide enough to read as a clipped card (rounded
39
+ * edge + a slice of its photo) rather than as a rendering glitch.
40
+ */
41
+ peekPx: 28,
42
+ /** Under the row — the tabwoah original's Tailwind `pb-0.5`. */
43
+ paddingBottomPx: 2,
44
+ } as const;
28
45
 
29
46
  /** `scroll`: how many WHOLE cards the rail commits to showing at once. */
30
47
  const SCROLL_VISIBLE_CARDS = 2;
31
48
 
32
- /**
33
- * `scroll`: px of the next card left visible past the last whole one — the
34
- * "there's more, swipe" hint. Wide enough to read as a clipped card (rounded
35
- * edge + a slice of its photo) rather than as a rendering glitch.
36
- */
37
- const SCROLL_PEEK_WIDTH = 28;
38
-
39
49
  /**
40
50
  * The `scroll` track width: the widest a card can be while the container still
41
51
  * shows `SCROLL_VISIBLE_CARDS` of them plus the peek — or, when there is nothing
@@ -46,25 +56,27 @@ const SCROLL_PEEK_WIDTH = 28;
46
56
  * that follow them (one between each pair, one before the peeked card), and the
47
57
  * peek. With no overflow there are only N-1 gaps and no peek.
48
58
  */
49
- function scrollTrackWidth(count: number, max: number): string {
59
+ function scrollTrackWidth(theme: Theme, count: number, max: number): string {
50
60
  const tracks = Math.max(1, Math.min(count, SCROLL_VISIBLE_CARDS));
51
61
  const overflows = count > tracks;
52
62
  const gaps = overflows ? tracks : tracks - 1;
53
- const reserved = gaps * GRID_GAP + (overflows ? SCROLL_PEEK_WIDTH : 0);
54
- return `min(${max}px, calc((100% - ${reserved}px) / ${tracks}))`;
63
+ const reserved = gaps * GRID.gapPx + (overflows ? GRID.peekPx : 0);
64
+ return `min(${rem(theme, max)}, calc((100% - ${rem(theme, reserved)}) / ${tracks}))`;
55
65
  }
56
66
 
57
67
  interface CardGridProps {
58
68
  /**
59
- * `"fixed"`: the exact column width in px. `"fluid"`: the minimum column width
69
+ * `"fixed"`: the exact column width. `"fluid"`: the minimum column width
60
70
  * (columns grow from here). `"scroll"`: only seeds the default `maxCardWidth`
61
71
  * — a scroll track has no minimum, because a minimum is exactly what would
62
72
  * break the "two cards plus a peek" promise on a narrow phone.
73
+ *
74
+ * Design px, scaled with the theme's type scale.
63
75
  */
64
76
  cardWidth: number;
65
77
  /**
66
- * `"scroll"` only: the maximum fluid card width in px. Defaults to
67
- * `1.6 × cardWidth`.
78
+ * `"scroll"` only: the maximum fluid card width. Defaults to
79
+ * `1.6 × cardWidth`. Design px, scaled with the theme's type scale.
68
80
  */
69
81
  maxCardWidth?: number;
70
82
  /** Layout behavior — see {@link CardGridVariant}. Defaults to `"fixed"`. */
@@ -84,8 +96,8 @@ interface CardGridProps {
84
96
  *
85
97
  * Ported from the tabwoah card grid (the `"fixed"` variant is verbatim). The one
86
98
  * adaptation: that app is Tailwind (`className="grid gap-4 pb-0.5"`); this one
87
- * has no Tailwind, so those three utilities (display:grid, gap 1rem,
88
- * padding-bottom 2px) live in `style`.
99
+ * has no Tailwind, so those three utilities (display:grid, gap 16 design px,
100
+ * padding-bottom 2 design px) live in `style`, drawn through `rem`.
89
101
  */
90
102
  export function CardGrid({
91
103
  cardWidth,
@@ -96,10 +108,11 @@ export function CardGrid({
96
108
  containerRef,
97
109
  children,
98
110
  }: CardGridProps) {
111
+ const theme = useTheme();
99
112
  const style: CSSProperties = {
100
113
  display: "grid",
101
- gap: "1rem",
102
- paddingBottom: "2px",
114
+ gap: rem(theme, GRID.gapPx),
115
+ paddingBottom: rem(theme, GRID.paddingBottomPx),
103
116
  };
104
117
 
105
118
  if (variant === "scroll") {
@@ -109,14 +122,14 @@ export function CardGrid({
109
122
  // always fit (see `scrollTrackWidth`). Scroll-snap makes a swipe settle on a
110
123
  // card boundary instead of drifting mid-card.
111
124
  style.gridAutoFlow = "column";
112
- style.gridAutoColumns = scrollTrackWidth(Children.count(children), max);
125
+ style.gridAutoColumns = scrollTrackWidth(theme, Children.count(children), max);
113
126
  style.overflowX = "auto";
114
127
  style.overflowY = "hidden";
115
128
  style.scrollSnapType = "x mandatory";
116
129
  } else if (variant === "fluid") {
117
- style.gridTemplateColumns = `repeat(auto-fill, minmax(${cardWidth}px, 1fr))`;
130
+ style.gridTemplateColumns = `repeat(auto-fill, minmax(${rem(theme, cardWidth)}, 1fr))`;
118
131
  } else {
119
- style.gridTemplateColumns = `repeat(auto-fill, ${cardWidth}px)`;
132
+ style.gridTemplateColumns = `repeat(auto-fill, ${rem(theme, cardWidth)})`;
120
133
  // `space-around` only distributes leftover width in the fixed variant; the
121
134
  // fluid variant consumes it via `1fr` and scroll overflows instead.
122
135
  style.justifyContent = "space-around";