@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.
- package/dist/_internal/components/data-display/DataGrid/DataGrid.body.js +3 -2
- package/dist/_internal/components/data-display/DataGrid/DataGrid.cells.js +2 -1
- package/dist/_internal/components/data-display/DataGrid/DataGrid.js +4 -4
- package/dist/_internal/components/data-display/DataGrid/DataGrid.model.js +2 -1
- package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +19 -19
- package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +26 -26
- package/dist/_internal/components/data-display/DataViews/SaveViewModal.js +5 -5
- package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +4 -4
- package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +3 -3
- package/dist/_internal/components/data-display/DataViews/base-list-card.js +5 -5
- package/dist/_internal/components/data-display/DataViews/data-views-columns.js +2 -2
- package/dist/_internal/components/data-display/DataViews/data-views-display-panel.js +3 -3
- package/dist/_internal/components/data-display/DataViews/data-views-display-tabs.js +2 -2
- package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +8 -8
- package/dist/_internal/components/data-display/DataViews/data-views-grid-helpers.js +1 -1
- package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +16 -16
- package/dist/_internal/components/data-display/DataViews/data-views-layout-context.js +1 -1
- package/dist/_internal/components/data-display/DataViews/data-views-overflow-costs.js +4 -3
- package/dist/_internal/components/data-display/DataViews/data-views-overflow.js +3 -2
- package/dist/_internal/components/data-display/DataViews/data-views-scope-tabs.js +2 -2
- package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +6 -6
- package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +6 -6
- package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +5 -5
- package/dist/_internal/components/data-display/DataViews/list-card-rails.js +2 -2
- package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +3 -3
- package/dist/_internal/components/data-display/FleetMap/FleetBody.js +9 -9
- package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js +8 -8
- package/dist/_internal/components/data-display/FleetMap/FleetMap.js +10 -10
- package/dist/_internal/components/data-display/MapPreview/MapDecorations.js +2 -2
- package/dist/_internal/components/data-display/MapPreview/MapPreview.hooks.js +2 -2
- package/dist/_internal/components/data-display/MapPreview/MapPreview.js +7 -7
- package/dist/_internal/components/data-display/MapPreview/MapTiles.js +2 -2
- package/dist/_internal/components/data-display/MapPreview/StaticMapView.js +4 -4
- package/dist/_internal/components/data-display/MapPreview/mapProjection.js +3 -3
- package/dist/_internal/components/data-display/MapPreview/useMapPreview.js +3 -3
- package/dist/_internal/components/data-display/Table/Table.helpers.js +5 -3
- package/dist/_internal/components/data-display/Table/Table.hooks.js +2 -1
- package/dist/_internal/components/data-display/Table/Table.js +4 -4
- package/dist/_internal/components/data-display/Table/TableParts.hooks.js +4 -2
- package/dist/_internal/components/data-display/Table/TableParts.js +4 -2
- package/dist/_internal/components/data-display/index.js +18 -18
- package/dist/_internal/components/form/Calendar/Calendar.js +5 -4
- package/dist/_internal/components/form/Calendar/CalendarDay.js +2 -1
- package/dist/_internal/components/form/Calendar/CalendarDayCell.js +3 -2
- package/dist/_internal/components/form/Calendar/CalendarMonth.js +4 -3
- package/dist/_internal/components/form/DateRangePicker/DateRangePicker.js +5 -5
- package/dist/_internal/components/form/Switch/Switch.js +4 -4
- package/dist/_internal/components/form/Switch/Switch.metrics.js +5 -1
- package/dist/_internal/components/form/Switch/Switch.parts.js +3 -3
- package/dist/_internal/components/form/Switch/Switch.styles.js +2 -2
- package/dist/_internal/components/form/index.js +9 -9
- package/dist/_internal/components/index.js +37 -37
- package/dist/_internal/components/layout/CardGrid/CardGrid.js +2 -1
- package/dist/_internal/components/layout/Resizable/Resizable.helpers.js +8 -3
- package/dist/_internal/components/layout/Resizable/Resizable.hooks.js +3 -2
- package/dist/_internal/components/layout/Resizable/Resizable.js +4 -3
- package/dist/_internal/components/layout/ScrollArea/ScrollArea.helpers.js +1 -1
- package/dist/_internal/components/layout/ScrollArea/ScrollArea.js +2 -2
- package/dist/_internal/components/layout/index.js +5 -5
- package/dist/_internal/components/utility/InfiniteScroll/InfiniteScroll.hooks.js +1 -1
- package/dist/_internal/components/utility/InfiniteScroll/InfiniteScroll.js +4 -3
- package/dist/_internal/components/utility/InfiniteScroll/InfiniteScroll.parts.js +2 -1
- package/dist/_internal/components/utility/VirtualList/VirtualList.hooks.js +6 -3
- package/dist/_internal/components/utility/VirtualList/VirtualList.js +3 -2
- package/dist/_internal/components/utility/index.js +5 -5
- package/dist/{chunk-J2DAQQQH.js → chunk-222HN7GK.js} +33 -64
- package/dist/chunk-222HN7GK.js.map +1 -0
- package/dist/{chunk-MR2HKBHS.js → chunk-27LOJVR3.js} +2 -2
- package/dist/{chunk-S3D5VBHW.js → chunk-3YOXVNO4.js} +7 -7
- package/dist/{chunk-CZIX4BW2.js → chunk-4ALF5PB5.js} +3 -3
- package/dist/{chunk-XJPJ6ESI.js → chunk-4OAKGKK5.js} +3 -3
- package/dist/{chunk-4CHROSWR.js → chunk-5ETBB2DG.js} +2 -2
- package/dist/{chunk-ATSHKSSD.js → chunk-5KNDAC24.js} +20 -7
- package/dist/chunk-5KNDAC24.js.map +1 -0
- package/dist/{chunk-ULTOQ6ZV.js → chunk-5LWB4BYX.js} +80 -89
- package/dist/chunk-5LWB4BYX.js.map +1 -0
- package/dist/{chunk-46UPILLK.js → chunk-5NT2M2JI.js} +2 -2
- package/dist/{chunk-H5BEWPEY.js → chunk-6N2EDWMG.js} +2 -2
- package/dist/{chunk-GJQYM3PM.js → chunk-6PU3JYVY.js} +2 -2
- package/dist/{chunk-PUBPZOQJ.js → chunk-AG3DY5TH.js} +8 -5
- package/dist/chunk-AG3DY5TH.js.map +1 -0
- package/dist/{chunk-PPRV4LTM.js → chunk-BWHOCNGW.js} +4 -4
- package/dist/chunk-BWHOCNGW.js.map +1 -0
- package/dist/{chunk-TUBCN4DJ.js → chunk-CB6DTWD5.js} +7 -7
- package/dist/chunk-CB6DTWD5.js.map +1 -0
- package/dist/{chunk-ZAY6OA6F.js → chunk-D4FZ3ANG.js} +15 -5
- package/dist/chunk-D4FZ3ANG.js.map +1 -0
- package/dist/{chunk-Y7F5JBAT.js → chunk-DDRKYNPB.js} +2 -2
- package/dist/{chunk-DLJGBJZW.js → chunk-DGMDQHMI.js} +16 -9
- package/dist/chunk-DGMDQHMI.js.map +1 -0
- package/dist/{chunk-IAGOUTI6.js → chunk-DNT5PZLF.js} +21 -12
- package/dist/chunk-DNT5PZLF.js.map +1 -0
- package/dist/{chunk-DZA7RSLX.js → chunk-DVSO3EG6.js} +19 -11
- package/dist/chunk-DVSO3EG6.js.map +1 -0
- package/dist/{chunk-OS6KPL4D.js → chunk-EHYI2WCJ.js} +4 -4
- package/dist/{chunk-NB3FGWU4.js → chunk-EQXIW5MQ.js} +2 -2
- package/dist/{chunk-C66RGVAS.js → chunk-ERY6D2OV.js} +6 -4
- package/dist/chunk-ERY6D2OV.js.map +1 -0
- package/dist/{chunk-M2JTIH5M.js → chunk-F44R7US6.js} +2 -2
- package/dist/{chunk-AROBXRC5.js → chunk-F7JTIHV5.js} +18 -7
- package/dist/chunk-F7JTIHV5.js.map +1 -0
- package/dist/{chunk-XJJXBUPN.js → chunk-FX26DAFF.js} +2 -2
- package/dist/{chunk-R6SN73RX.js → chunk-GLHNMTP6.js} +7 -7
- package/dist/{chunk-YU26GBNX.js → chunk-H3AQQOTI.js} +9 -4
- package/dist/chunk-H3AQQOTI.js.map +1 -0
- package/dist/{chunk-HTZNB6IV.js → chunk-H5ZTIELC.js} +23 -8
- package/dist/chunk-H5ZTIELC.js.map +1 -0
- package/dist/{chunk-GSFNH4C5.js → chunk-HBP2OU4Q.js} +15 -8
- package/dist/chunk-HBP2OU4Q.js.map +1 -0
- package/dist/{chunk-I4QA2F4L.js → chunk-HBRQPG7H.js} +5 -5
- package/dist/{chunk-HGMBY5LP.js → chunk-HQWJUHR4.js} +18 -11
- package/dist/chunk-HQWJUHR4.js.map +1 -0
- package/dist/{chunk-CNQUCNEA.js → chunk-I3F4C5SS.js} +3 -3
- package/dist/{chunk-UFJYJHQI.js → chunk-J5VWGQSR.js} +2 -2
- package/dist/{chunk-MTFCPPZ5.js → chunk-JWZJSXI5.js} +3 -2
- package/dist/chunk-JWZJSXI5.js.map +1 -0
- package/dist/{chunk-4JFL62K3.js → chunk-K7FSTB2K.js} +3 -3
- package/dist/{chunk-FFCJ7NR2.js → chunk-KRQUPE4K.js} +4 -4
- package/dist/{chunk-2OYFTSG4.js → chunk-KXLUMEDX.js} +2 -2
- package/dist/{chunk-DVAAUWTC.js → chunk-LCHCE2G5.js} +2 -2
- package/dist/{chunk-G4HBNILE.js → chunk-LEHMWJNZ.js} +3 -3
- package/dist/{chunk-P6TNXBDA.js → chunk-MYKWJCR7.js} +9 -9
- package/dist/chunk-MYKWJCR7.js.map +1 -0
- package/dist/{chunk-TQ6FPOPD.js → chunk-ODW2D5PN.js} +39 -30
- package/dist/chunk-ODW2D5PN.js.map +1 -0
- package/dist/{chunk-RZYSKQTS.js → chunk-PCBZYORN.js} +3 -3
- package/dist/{chunk-5OBXEMQO.js → chunk-PRIBOWX4.js} +3 -3
- package/dist/{chunk-F42MJOHM.js → chunk-PVM7XTLZ.js} +64 -62
- package/dist/chunk-PVM7XTLZ.js.map +1 -0
- package/dist/{chunk-3TDVGZZN.js → chunk-QBTBRJ2Q.js} +37 -13
- package/dist/chunk-QBTBRJ2Q.js.map +1 -0
- package/dist/{chunk-2WFDHFK4.js → chunk-QNCWSDXE.js} +26 -11
- package/dist/chunk-QNCWSDXE.js.map +1 -0
- package/dist/{chunk-PQECNGDE.js → chunk-QSRZOXQI.js} +2 -2
- package/dist/{chunk-RHIDWUK7.js → chunk-QUWK7SYN.js} +1 -2
- package/dist/chunk-QUWK7SYN.js.map +1 -0
- package/dist/{chunk-UN5INW6K.js → chunk-R53ZOW4B.js} +8 -4
- package/dist/chunk-R53ZOW4B.js.map +1 -0
- package/dist/{chunk-DCJSHYE5.js → chunk-RSDYS5B3.js} +4 -4
- package/dist/{chunk-N5GVW6RO.js → chunk-S6IWKDWT.js} +2 -2
- package/dist/{chunk-TKC6WHGB.js → chunk-SBIZXZPP.js} +2 -2
- package/dist/{chunk-D5SZXH7Q.js → chunk-TNBJ4DK4.js} +7 -3
- package/dist/chunk-TNBJ4DK4.js.map +1 -0
- package/dist/{chunk-PMOEG36E.js → chunk-XZJM6EPC.js} +8 -6
- package/dist/chunk-XZJM6EPC.js.map +1 -0
- package/dist/{chunk-QF6LTUCE.js → chunk-Y2X7LYIN.js} +4 -4
- package/dist/chunk-Y2X7LYIN.js.map +1 -0
- package/dist/{chunk-UEVHI62V.js → chunk-YCCY77W5.js} +2 -2
- package/dist/{chunk-DF4K5XVW.js → chunk-YZVR5ROE.js} +14 -6
- package/dist/chunk-YZVR5ROE.js.map +1 -0
- package/dist/{chunk-AUSUCZYR.js → chunk-ZBVU2YWV.js} +5 -5
- package/dist/chunk-ZBVU2YWV.js.map +1 -0
- package/dist/{chunk-VZIB5W5L.js → chunk-ZGCPDA3F.js} +2 -2
- package/dist/data-display/DataGrid.js +4 -4
- package/dist/data-display/DataViews.js +29 -29
- package/dist/data-display/FleetMap.js +10 -10
- package/dist/data-display/MapPreview.js +7 -7
- package/dist/data-display/Table.js +4 -4
- package/dist/form/Calendar.js +5 -4
- package/dist/form/DateRangePicker.js +5 -5
- package/dist/form/Switch.js +4 -4
- package/dist/layout/CardGrid.js +2 -1
- package/dist/layout/Resizable.js +4 -3
- package/dist/layout/ScrollArea.js +2 -2
- package/dist/native/form/Switch.js +3 -1
- package/dist/native/form/Switch.js.map +1 -1
- package/dist/types/components/data-display/DataGrid/DataGrid.body.d.ts.map +1 -1
- package/dist/types/components/data-display/DataGrid/DataGrid.cells.d.ts +4 -2
- package/dist/types/components/data-display/DataGrid/DataGrid.cells.d.ts.map +1 -1
- package/dist/types/components/data-display/DataGrid/DataGrid.model.d.ts +7 -1
- package/dist/types/components/data-display/DataGrid/DataGrid.model.d.ts.map +1 -1
- package/dist/types/components/data-display/DataGrid/DataGrid.types.d.ts +10 -4
- package/dist/types/components/data-display/DataGrid/DataGrid.types.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-columns.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-grid-helpers.d.ts +2 -0
- package/dist/types/components/data-display/DataViews/data-views-grid-helpers.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-layout-context.d.ts +7 -3
- package/dist/types/components/data-display/DataViews/data-views-layout-context.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-overflow-costs.d.ts +19 -9
- package/dist/types/components/data-display/DataViews/data-views-overflow-costs.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-overflow.d.ts.map +1 -1
- package/dist/types/components/data-display/MapPreview/MapTiles.d.ts.map +1 -1
- package/dist/types/components/data-display/MapPreview/mapProjection.d.ts +6 -1
- package/dist/types/components/data-display/MapPreview/mapProjection.d.ts.map +1 -1
- package/dist/types/components/data-display/Table/Table.helpers.d.ts +6 -0
- package/dist/types/components/data-display/Table/Table.helpers.d.ts.map +1 -1
- package/dist/types/components/data-display/Table/Table.hooks.d.ts +9 -1
- package/dist/types/components/data-display/Table/Table.hooks.d.ts.map +1 -1
- package/dist/types/components/data-display/Table/Table.types.d.ts +6 -2
- package/dist/types/components/data-display/Table/Table.types.d.ts.map +1 -1
- package/dist/types/components/data-display/Table/TableParts.d.ts +2 -0
- package/dist/types/components/data-display/Table/TableParts.d.ts.map +1 -1
- package/dist/types/components/form/Calendar/Calendar.d.ts.map +1 -1
- package/dist/types/components/form/Calendar/CalendarDay.d.ts.map +1 -1
- package/dist/types/components/form/Calendar/CalendarMonth.d.ts.map +1 -1
- package/dist/types/components/form/Switch/Switch.metrics.d.ts +13 -3
- package/dist/types/components/form/Switch/Switch.metrics.d.ts.map +1 -1
- package/dist/types/components/form/Switch/Switch.styles.d.ts.map +1 -1
- package/dist/types/components/layout/CardGrid/CardGrid.d.ts +9 -7
- package/dist/types/components/layout/CardGrid/CardGrid.d.ts.map +1 -1
- package/dist/types/components/layout/Resizable/Resizable.d.ts.map +1 -1
- package/dist/types/components/layout/Resizable/Resizable.helpers.d.ts +21 -9
- package/dist/types/components/layout/Resizable/Resizable.helpers.d.ts.map +1 -1
- package/dist/types/components/layout/Resizable/Resizable.hooks.d.ts +13 -3
- package/dist/types/components/layout/Resizable/Resizable.hooks.d.ts.map +1 -1
- package/dist/types/components/layout/Resizable/Resizable.types.d.ts +10 -0
- package/dist/types/components/layout/Resizable/Resizable.types.d.ts.map +1 -1
- package/dist/types/components/layout/ScrollArea/ScrollArea.d.ts.map +1 -1
- package/dist/types/components/layout/ScrollArea/ScrollArea.helpers.d.ts +1 -1
- package/dist/types/components/layout/ScrollArea/ScrollArea.helpers.d.ts.map +1 -1
- package/dist/types/components/layout/ScrollArea/ScrollArea.types.d.ts +4 -1
- package/dist/types/components/layout/ScrollArea/ScrollArea.types.d.ts.map +1 -1
- package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.d.ts.map +1 -1
- package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.hooks.d.ts +3 -2
- package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.hooks.d.ts.map +1 -1
- package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.parts.d.ts +3 -2
- package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.parts.d.ts.map +1 -1
- package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.types.d.ts +9 -0
- package/dist/types/components/utility/InfiniteScroll/InfiniteScroll.types.d.ts.map +1 -1
- package/dist/types/components/utility/VirtualList/VirtualList.d.ts.map +1 -1
- package/dist/types/components/utility/VirtualList/VirtualList.hooks.d.ts +24 -28
- package/dist/types/components/utility/VirtualList/VirtualList.hooks.d.ts.map +1 -1
- package/dist/types/components/utility/VirtualList/VirtualList.types.d.ts +17 -0
- package/dist/types/components/utility/VirtualList/VirtualList.types.d.ts.map +1 -1
- package/dist/types-native/components/form/Switch/Switch.metrics.d.ts +13 -3
- package/dist/types-native/components/form/Switch/Switch.metrics.d.ts.map +1 -1
- package/dist/utility/InfiniteScroll.js +4 -3
- package/dist/utility/VirtualList.js +3 -2
- package/package.json +1 -1
- package/src/components/data-display/DataGrid/DataGrid.body.tsx +27 -7
- package/src/components/data-display/DataGrid/DataGrid.cells.tsx +33 -9
- package/src/components/data-display/DataGrid/DataGrid.model.ts +24 -11
- package/src/components/data-display/DataGrid/DataGrid.types.ts +12 -6
- package/src/components/data-display/DataViews/data-views-columns.ts +14 -3
- package/src/components/data-display/DataViews/data-views-grid-helpers.tsx +5 -3
- package/src/components/data-display/DataViews/data-views-layout-context.tsx +12 -9
- package/src/components/data-display/DataViews/data-views-overflow-costs.ts +32 -14
- package/src/components/data-display/DataViews/data-views-overflow.ts +40 -26
- package/src/components/data-display/MapPreview/MapTiles.tsx +16 -9
- package/src/components/data-display/MapPreview/mapProjection.ts +10 -5
- package/src/components/data-display/Table/Table.helpers.ts +7 -1
- package/src/components/data-display/Table/Table.hooks.ts +16 -5
- package/src/components/data-display/Table/Table.types.ts +6 -2
- package/src/components/data-display/Table/TableParts.tsx +38 -42
- package/src/components/form/Calendar/Calendar.tsx +4 -2
- package/src/components/form/Calendar/CalendarDay.tsx +6 -3
- package/src/components/form/Calendar/CalendarMonth.tsx +6 -3
- package/src/components/form/Switch/Switch.metrics.ts +19 -5
- package/src/components/form/Switch/Switch.styles.ts +5 -3
- package/src/components/layout/CardGrid/CardGrid.tsx +37 -24
- package/src/components/layout/Resizable/Resizable.helpers.ts +43 -21
- package/src/components/layout/Resizable/Resizable.hooks.ts +17 -9
- package/src/components/layout/Resizable/Resizable.md +9 -5
- package/src/components/layout/Resizable/Resizable.tsx +20 -8
- package/src/components/layout/Resizable/Resizable.types.ts +10 -0
- package/src/components/layout/ScrollArea/ScrollArea.helpers.ts +0 -2
- package/src/components/layout/ScrollArea/ScrollArea.tsx +5 -3
- package/src/components/layout/ScrollArea/ScrollArea.types.ts +4 -1
- package/src/components/utility/InfiniteScroll/InfiniteScroll.hooks.ts +5 -4
- package/src/components/utility/InfiniteScroll/InfiniteScroll.parts.tsx +29 -12
- package/src/components/utility/InfiniteScroll/InfiniteScroll.tsx +11 -5
- package/src/components/utility/InfiniteScroll/InfiniteScroll.types.ts +10 -2
- package/src/components/utility/VirtualList/VirtualList.hooks.ts +101 -112
- package/src/components/utility/VirtualList/VirtualList.tsx +36 -65
- package/src/components/utility/VirtualList/VirtualList.types.ts +20 -3
- package/dist/chunk-2WFDHFK4.js.map +0 -1
- package/dist/chunk-3TDVGZZN.js.map +0 -1
- package/dist/chunk-AROBXRC5.js.map +0 -1
- package/dist/chunk-ATSHKSSD.js.map +0 -1
- package/dist/chunk-AUSUCZYR.js.map +0 -1
- package/dist/chunk-C66RGVAS.js.map +0 -1
- package/dist/chunk-D5SZXH7Q.js.map +0 -1
- package/dist/chunk-DF4K5XVW.js.map +0 -1
- package/dist/chunk-DLJGBJZW.js.map +0 -1
- package/dist/chunk-DZA7RSLX.js.map +0 -1
- package/dist/chunk-F42MJOHM.js.map +0 -1
- package/dist/chunk-GSFNH4C5.js.map +0 -1
- package/dist/chunk-HGMBY5LP.js.map +0 -1
- package/dist/chunk-HTZNB6IV.js.map +0 -1
- package/dist/chunk-IAGOUTI6.js.map +0 -1
- package/dist/chunk-J2DAQQQH.js.map +0 -1
- package/dist/chunk-MTFCPPZ5.js.map +0 -1
- package/dist/chunk-P6TNXBDA.js.map +0 -1
- package/dist/chunk-PMOEG36E.js.map +0 -1
- package/dist/chunk-PPRV4LTM.js.map +0 -1
- package/dist/chunk-PUBPZOQJ.js.map +0 -1
- package/dist/chunk-QF6LTUCE.js.map +0 -1
- package/dist/chunk-RHIDWUK7.js.map +0 -1
- package/dist/chunk-TQ6FPOPD.js.map +0 -1
- package/dist/chunk-TUBCN4DJ.js.map +0 -1
- package/dist/chunk-ULTOQ6ZV.js.map +0 -1
- package/dist/chunk-UN5INW6K.js.map +0 -1
- package/dist/chunk-YU26GBNX.js.map +0 -1
- package/dist/chunk-ZAY6OA6F.js.map +0 -1
- /package/dist/{chunk-MR2HKBHS.js.map → chunk-27LOJVR3.js.map} +0 -0
- /package/dist/{chunk-S3D5VBHW.js.map → chunk-3YOXVNO4.js.map} +0 -0
- /package/dist/{chunk-CZIX4BW2.js.map → chunk-4ALF5PB5.js.map} +0 -0
- /package/dist/{chunk-XJPJ6ESI.js.map → chunk-4OAKGKK5.js.map} +0 -0
- /package/dist/{chunk-4CHROSWR.js.map → chunk-5ETBB2DG.js.map} +0 -0
- /package/dist/{chunk-46UPILLK.js.map → chunk-5NT2M2JI.js.map} +0 -0
- /package/dist/{chunk-H5BEWPEY.js.map → chunk-6N2EDWMG.js.map} +0 -0
- /package/dist/{chunk-GJQYM3PM.js.map → chunk-6PU3JYVY.js.map} +0 -0
- /package/dist/{chunk-Y7F5JBAT.js.map → chunk-DDRKYNPB.js.map} +0 -0
- /package/dist/{chunk-OS6KPL4D.js.map → chunk-EHYI2WCJ.js.map} +0 -0
- /package/dist/{chunk-NB3FGWU4.js.map → chunk-EQXIW5MQ.js.map} +0 -0
- /package/dist/{chunk-M2JTIH5M.js.map → chunk-F44R7US6.js.map} +0 -0
- /package/dist/{chunk-XJJXBUPN.js.map → chunk-FX26DAFF.js.map} +0 -0
- /package/dist/{chunk-R6SN73RX.js.map → chunk-GLHNMTP6.js.map} +0 -0
- /package/dist/{chunk-I4QA2F4L.js.map → chunk-HBRQPG7H.js.map} +0 -0
- /package/dist/{chunk-CNQUCNEA.js.map → chunk-I3F4C5SS.js.map} +0 -0
- /package/dist/{chunk-UFJYJHQI.js.map → chunk-J5VWGQSR.js.map} +0 -0
- /package/dist/{chunk-4JFL62K3.js.map → chunk-K7FSTB2K.js.map} +0 -0
- /package/dist/{chunk-FFCJ7NR2.js.map → chunk-KRQUPE4K.js.map} +0 -0
- /package/dist/{chunk-2OYFTSG4.js.map → chunk-KXLUMEDX.js.map} +0 -0
- /package/dist/{chunk-DVAAUWTC.js.map → chunk-LCHCE2G5.js.map} +0 -0
- /package/dist/{chunk-G4HBNILE.js.map → chunk-LEHMWJNZ.js.map} +0 -0
- /package/dist/{chunk-RZYSKQTS.js.map → chunk-PCBZYORN.js.map} +0 -0
- /package/dist/{chunk-5OBXEMQO.js.map → chunk-PRIBOWX4.js.map} +0 -0
- /package/dist/{chunk-PQECNGDE.js.map → chunk-QSRZOXQI.js.map} +0 -0
- /package/dist/{chunk-DCJSHYE5.js.map → chunk-RSDYS5B3.js.map} +0 -0
- /package/dist/{chunk-N5GVW6RO.js.map → chunk-S6IWKDWT.js.map} +0 -0
- /package/dist/{chunk-TKC6WHGB.js.map → chunk-SBIZXZPP.js.map} +0 -0
- /package/dist/{chunk-UEVHI62V.js.map → chunk-YCCY77W5.js.map} +0 -0
- /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
|
-
|
|
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
|
-
|
|
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 /
|
|
149
|
-
const visible = Math.ceil(clientHeight /
|
|
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,
|
|
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
|
-
|
|
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,
|
|
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
|
-
/**
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
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
|
-
|
|
148
|
-
|
|
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, {
|
|
90
|
-
|
|
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
|
|
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
|
-
/**
|
|
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(
|
|
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
|
|
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
|
-
/**
|
|
143
|
-
export
|
|
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 ?
|
|
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 ?
|
|
167
|
-
(flags.counterHidden ? 0 :
|
|
168
|
-
rightClusterCost(hasExport, flags.compactControls) +
|
|
169
|
-
|
|
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 ?
|
|
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
|
|
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 ?
|
|
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
|
|
224
|
-
let
|
|
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 -
|
|
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 -
|
|
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 -
|
|
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 -
|
|
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
|
-
?
|
|
292
|
-
:
|
|
293
|
-
const shedRoom = width -
|
|
294
|
-
const searchBoxRoom = shedRoom - (counterHidden ? 0 :
|
|
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 <
|
|
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 {
|
|
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 /
|
|
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:
|
|
35
|
-
height:
|
|
41
|
+
width: grid,
|
|
42
|
+
height: grid,
|
|
36
43
|
display: 'grid',
|
|
37
|
-
gridTemplateColumns: `repeat(${VISIBLE_TILES}, ${
|
|
38
|
-
gridTemplateRows: `repeat(${VISIBLE_TILES}, ${
|
|
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:
|
|
52
|
-
height:
|
|
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:
|
|
65
|
+
fontSize: rem(theme, 10),
|
|
59
66
|
color: alpha(theme.palette.text.secondary, 0.3),
|
|
60
67
|
fontFamily: 'monospace',
|
|
61
68
|
userSelect: 'none',
|