@12-apps/ui 6.21.0 → 6.23.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/NATIVE.md +6 -4
- package/components-catalog.md +7 -0
- package/dist/_internal/components/data-display/Alert/Alert.js +4 -4
- package/dist/_internal/components/data-display/Alert/Alert.styles.js +2 -2
- package/dist/_internal/components/data-display/AsyncStateContainer/AsyncStateContainer.js +8 -8
- package/dist/_internal/components/data-display/Badge/Badge.js +3 -3
- package/dist/_internal/components/data-display/CardKit/CardKebab.js +4 -4
- package/dist/_internal/components/data-display/CardKit/card-actions-context.js +5 -5
- package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js +9 -9
- package/dist/_internal/components/data-display/CardKit/use-row-confirm.js +4 -4
- package/dist/_internal/components/data-display/Chart/Chart.js +3 -3
- package/dist/_internal/components/data-display/Chart/SpecChart.js +5 -5
- package/dist/_internal/components/data-display/Chart/chart-renderers.js +2 -2
- package/dist/_internal/components/data-display/Chip/Chip.js +3 -3
- package/dist/_internal/components/data-display/Chip/Chip.styles.js +2 -2
- package/dist/_internal/components/data-display/DataGrid/DataGrid.js +2 -2
- package/dist/_internal/components/data-display/DataViews/DataViewsBoard.js +3 -3
- package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +50 -50
- package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +68 -65
- package/dist/_internal/components/data-display/DataViews/DeleteViewDialog.js +10 -7
- package/dist/_internal/components/data-display/DataViews/ManageViewsDialog.js +11 -8
- package/dist/_internal/components/data-display/DataViews/SaveViewModal.js +14 -11
- package/dist/_internal/components/data-display/DataViews/base-card.js +9 -7
- package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +7 -7
- package/dist/_internal/components/data-display/DataViews/base-list-card-gutters.js +3 -3
- package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +6 -6
- package/dist/_internal/components/data-display/DataViews/base-list-card.js +15 -13
- package/dist/_internal/components/data-display/DataViews/data-views-category-pill.js +12 -12
- package/dist/_internal/components/data-display/DataViews/data-views-columns-tab.js +3 -3
- package/dist/_internal/components/data-display/DataViews/data-views-columns.js +5 -5
- package/dist/_internal/components/data-display/DataViews/data-views-display-panel.js +8 -8
- package/dist/_internal/components/data-display/DataViews/data-views-display-tabs.js +3 -3
- package/dist/_internal/components/data-display/DataViews/data-views-empty.js +5 -5
- package/dist/_internal/components/data-display/DataViews/data-views-export.js +5 -5
- package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +15 -15
- package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +12 -12
- package/dist/_internal/components/data-display/DataViews/data-views-grid-helpers.js +4 -4
- package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +46 -46
- package/dist/_internal/components/data-display/DataViews/data-views-header-row.js +3 -3
- package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +21 -21
- package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +6 -6
- package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +9 -9
- package/dist/_internal/components/data-display/DataViews/data-views-pagination.js +3 -3
- package/dist/_internal/components/data-display/DataViews/data-views-range-pill.js +2 -2
- package/dist/_internal/components/data-display/DataViews/data-views-select-all-strip.js +5 -5
- package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +13 -13
- package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +21 -18
- package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +12 -12
- package/dist/_internal/components/data-display/DataViews/data-views-view-nav.js +5 -5
- package/dist/_internal/components/data-display/DataViews/list-card-rails.js +2 -2
- package/dist/_internal/components/data-display/DataViews/save-view-preview.js +3 -3
- package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +7 -7
- package/dist/_internal/components/data-display/DescriptionItem/DescriptionItem.js +3 -3
- package/dist/_internal/components/data-display/EmptyState/EmptyState.js +2 -2
- package/dist/_internal/components/data-display/ErrorState/ErrorState.js +2 -2
- package/dist/_internal/components/data-display/FleetMap/FleetBody.js +31 -0
- package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js +23 -0
- package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js.map +1 -0
- package/dist/_internal/components/data-display/FleetMap/FleetMap.fixtures.js +57 -0
- package/dist/_internal/components/data-display/FleetMap/FleetMap.fixtures.js.map +1 -0
- package/dist/_internal/components/data-display/FleetMap/FleetMap.helpers.js +14 -0
- package/dist/_internal/components/data-display/FleetMap/FleetMap.helpers.js.map +1 -0
- package/dist/_internal/components/data-display/FleetMap/FleetMap.hooks.js +9 -0
- package/dist/_internal/components/data-display/FleetMap/FleetMap.hooks.js.map +1 -0
- package/dist/_internal/components/data-display/FleetMap/FleetMap.js +46 -0
- package/dist/_internal/components/data-display/FleetMap/FleetMap.js.map +1 -0
- package/dist/_internal/components/data-display/FleetMap/FleetMap.types.js +1 -0
- package/dist/_internal/components/data-display/FleetMap/FleetMap.types.js.map +1 -0
- package/dist/_internal/components/data-display/FleetMap/FleetRoster.js +14 -0
- package/dist/_internal/components/data-display/FleetMap/FleetRoster.js.map +1 -0
- package/dist/_internal/components/data-display/LazyImage/LazyImage.js +4 -4
- package/dist/_internal/components/data-display/Lightbox/Lightbox.js +1 -1
- package/dist/_internal/components/data-display/LoadingState/LoadingState.js +4 -4
- 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/useMapPreview.js +3 -3
- package/dist/_internal/components/data-display/Progress/Progress.js +2 -2
- package/dist/_internal/components/data-display/SectionOnboarding/SectionOnboarding.js +3 -3
- package/dist/_internal/components/data-display/Sheet/Sheet.js +3 -3
- package/dist/_internal/components/data-display/StatCard/StatCard.js +4 -4
- package/dist/_internal/components/data-display/Table/Table.js +2 -2
- package/dist/_internal/components/data-display/index.js +88 -68
- package/dist/_internal/components/feedback/ConfirmAction/ConfirmButton.js +4 -4
- package/dist/_internal/components/feedback/Dialog/Dialog.base.js +1 -0
- package/dist/_internal/components/feedback/Dialog/Dialog.base.js.map +1 -0
- package/dist/_internal/components/feedback/Dialog/Dialog.helpers.js +12 -0
- package/dist/_internal/components/feedback/Dialog/Dialog.helpers.js.map +1 -0
- package/dist/_internal/components/feedback/Dialog/Dialog.js +6 -2
- package/dist/_internal/components/feedback/Dialog/Dialog.metrics.js +42 -0
- package/dist/_internal/components/feedback/Dialog/Dialog.metrics.js.map +1 -0
- package/dist/_internal/components/feedback/Dialog/Dialog.styles.js +3 -1
- package/dist/_internal/components/feedback/TutorialOverlay/TutorialOverlay.js +2 -2
- package/dist/_internal/components/feedback/index.js +16 -13
- package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.hooks.js +3 -3
- package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.js +7 -7
- package/dist/_internal/components/form/AddressAutocomplete/AddressAutocompleteField.js +3 -3
- package/dist/_internal/components/form/Autocomplete/Autocomplete.js +2 -2
- package/dist/_internal/components/form/Button/Button.js +3 -3
- package/dist/_internal/components/form/Calendar/Calendar.js +4 -4
- package/dist/_internal/components/form/Calendar/CalendarDayCell.js +2 -2
- package/dist/_internal/components/form/Calendar/CalendarMonth.js +3 -3
- package/dist/_internal/components/form/CategorySelect/CategoryPanel.js +5 -5
- package/dist/_internal/components/form/CategorySelect/CategoryPanelList.js +3 -3
- package/dist/_internal/components/form/CategorySelect/CategoryRows.js +2 -2
- package/dist/_internal/components/form/CategorySelect/CategorySelect.js +10 -10
- package/dist/_internal/components/form/CepField/CepField.js +4 -4
- package/dist/_internal/components/form/Checkbox/Checkbox.js +2 -2
- package/dist/_internal/components/form/CodeEditor/CodeEditor.js +2 -2
- package/dist/_internal/components/form/Command/Command.js +2 -2
- package/dist/_internal/components/form/DateRangePicker/DateRangePicker.js +6 -6
- package/dist/_internal/components/form/Input/Input.js +3 -3
- package/dist/_internal/components/form/Label/Label.js +2 -2
- package/dist/_internal/components/form/Menubar/Menubar.js +5 -5
- package/dist/_internal/components/form/Menubar/Menubar.toolbar.js +2 -2
- package/dist/_internal/components/form/PhoneInput/PhoneInput.hooks.js +2 -2
- package/dist/_internal/components/form/PhoneInput/PhoneInput.js +3 -3
- package/dist/_internal/components/form/Select/Select.js +2 -2
- package/dist/_internal/components/form/Switch/Switch.js +2 -2
- package/dist/_internal/components/form/index.js +55 -55
- package/dist/_internal/components/form/total-form/Fields/CategoryField.js +11 -11
- package/dist/_internal/components/form/total-form/Fields/CepField.js +5 -5
- package/dist/_internal/components/form/total-form/Fields/SelectField.js +3 -3
- package/dist/_internal/components/form/total-form/Fields/TextField.js +4 -4
- package/dist/_internal/components/form/total-form/Fields/index.js +25 -25
- package/dist/_internal/components/form/total-form/SubmitButton.js +4 -4
- package/dist/_internal/components/index.js +198 -175
- package/dist/_internal/components/layout/Box/Box.js +2 -2
- package/dist/_internal/components/layout/Card/Card.base.js +1 -0
- package/dist/_internal/components/layout/Card/Card.base.js.map +1 -0
- package/dist/_internal/components/layout/Card/Card.helpers.js +1 -1
- package/dist/_internal/components/layout/Card/Card.js +6 -3
- package/dist/_internal/components/layout/Card/Card.metrics.js +44 -0
- package/dist/_internal/components/layout/Card/Card.metrics.js.map +1 -0
- package/dist/_internal/components/layout/Card/Card.styles.js +3 -1
- package/dist/_internal/components/layout/Container/Container.js +2 -2
- package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.js +2 -2
- package/dist/_internal/components/layout/Skeleton/Skeleton.js +3 -3
- package/dist/_internal/components/layout/Spacer/Spacer.js +2 -2
- package/dist/_internal/components/layout/Stack/Stack.js +3 -3
- package/dist/_internal/components/layout/index.js +30 -28
- package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js +12 -9
- package/dist/_internal/components/navigation/CommandPalette/CommandPalette.js +2 -2
- package/dist/_internal/components/navigation/Pagination/Pagination.js +2 -2
- package/dist/_internal/components/navigation/index.js +22 -19
- package/dist/_internal/components/typography/Heading/Heading.js +2 -2
- package/dist/_internal/components/typography/Paragraph/Paragraph.js +2 -2
- package/dist/_internal/components/typography/Text/Text.js +2 -2
- package/dist/_internal/components/typography/index.js +4 -4
- package/dist/_internal/components/utility/InfiniteScroll/InfiniteScroll.js +2 -2
- package/dist/_internal/components/utility/InstallPrompt/InstallPrompt.js +2 -2
- package/dist/_internal/components/utility/index.js +8 -8
- package/dist/_internal/icons/Icon.js +2 -2
- package/dist/_internal/platform/test-id.js +3 -1
- package/dist/_internal/pt-BR.data-display.js +2 -2
- package/dist/_internal/social-login-button/social-login-button.js +11 -9
- package/dist/_internal/tokens/mui-type.js +1 -0
- package/dist/_internal/tokens/mui-type.js.map +1 -1
- package/dist/_internal/tokens/shadow.js +18 -0
- package/dist/_internal/tokens/shadow.js.map +1 -0
- package/dist/_internal/user-avatar/user-avatar.js +10 -8
- package/dist/charts.js +6 -6
- package/dist/{chunk-NUE774AN.js → chunk-25R3ITGZ.js} +2 -2
- package/dist/{chunk-Z6UEOSL7.js → chunk-2FDBR77W.js} +3 -3
- package/dist/{chunk-IFNK5TPI.js → chunk-2HPP6RVC.js} +2 -2
- package/dist/chunk-2RQINU5T.js +41 -0
- package/dist/chunk-2RQINU5T.js.map +1 -0
- package/dist/{chunk-GCXYCDOA.js → chunk-2UGJIKVA.js} +2 -2
- package/dist/{chunk-26Z7QWID.js → chunk-343TTIHD.js} +2 -2
- package/dist/{chunk-BRSF5NRT.js → chunk-3FLVIVOK.js} +4 -4
- package/dist/{chunk-BDVNAU2C.js → chunk-4523RYE7.js} +5 -5
- package/dist/{chunk-4ETQRBZC.js → chunk-46UPILLK.js} +4 -4
- package/dist/{chunk-WMALDOF5.js → chunk-4G3FGCWX.js} +4 -4
- package/dist/{chunk-I3MDKPGG.js → chunk-4IVOHL32.js} +2 -2
- package/dist/{chunk-SAHQLXNN.js → chunk-4LRFGB3K.js} +4 -4
- package/dist/{chunk-ZOUWHGV3.js → chunk-4MGFUPQT.js} +4 -4
- package/dist/{chunk-TLX66HCW.js → chunk-4OHRZW7U.js} +5 -5
- package/dist/{chunk-2QFTAGDH.js → chunk-4X4KM4ZB.js} +4 -4
- package/dist/{chunk-7ZH7ZB33.js → chunk-4XZXLB4I.js} +4 -4
- package/dist/{chunk-6PRA45LC.js → chunk-5KEMPCW4.js} +54 -45
- package/dist/chunk-5KEMPCW4.js.map +1 -0
- package/dist/{chunk-77F36LQQ.js → chunk-5OIH36KX.js} +3 -3
- package/dist/chunk-5V4UPOWK.js +36 -0
- package/dist/chunk-5V4UPOWK.js.map +1 -0
- package/dist/{chunk-GDEXYUPF.js → chunk-67L7HMEP.js} +2 -2
- package/dist/{chunk-ZFPJBKVZ.js → chunk-6JGPPTLX.js} +5 -5
- package/dist/chunk-6Q6T3FW5.js +92 -0
- package/dist/chunk-6Q6T3FW5.js.map +1 -0
- package/dist/chunk-73BEVJCS.js +28 -0
- package/dist/chunk-73BEVJCS.js.map +1 -0
- package/dist/{chunk-VIK3HAUQ.js → chunk-73NJCGQG.js} +2 -2
- package/dist/{chunk-D4T646G4.js → chunk-7NSX7A5H.js} +2 -2
- package/dist/{chunk-QS7ZGRNS.js → chunk-7VN7LFBA.js} +6 -6
- package/dist/{chunk-3UOHKHOT.js → chunk-ACFGEZ4Q.js} +3 -3
- package/dist/{chunk-GBNOYRLP.js → chunk-AEGXHZQT.js} +8 -8
- package/dist/{chunk-D2IASECY.js → chunk-AIRWM7KK.js} +39 -28
- package/dist/chunk-AIRWM7KK.js.map +1 -0
- package/dist/{chunk-BEH4DN63.js → chunk-AJGYHDA5.js} +6 -6
- package/dist/{chunk-65DLYC4S.js → chunk-AVGTTWTE.js} +4 -4
- package/dist/{chunk-PXH24VIP.js → chunk-B6IURHSZ.js} +4 -4
- package/dist/chunk-BEBLRL5D.js +177 -0
- package/dist/chunk-BEBLRL5D.js.map +1 -0
- package/dist/{chunk-XEE7PLDR.js → chunk-BZTFPSWT.js} +4 -4
- package/dist/{chunk-B3BK2SNS.js → chunk-C3CMEDSO.js} +2 -2
- package/dist/{chunk-OH3YGJT5.js → chunk-CBTY36TU.js} +2 -2
- package/dist/chunk-CDCTLPMD.js +1 -0
- package/dist/chunk-CDCTLPMD.js.map +1 -0
- package/dist/chunk-CF3FAAPC.js +79 -0
- package/dist/chunk-CF3FAAPC.js.map +1 -0
- package/dist/{chunk-JIINGMEB.js → chunk-CHPZTF34.js} +7 -7
- package/dist/{chunk-PWXL3QQ6.js → chunk-CJBBGMIA.js} +2 -2
- package/dist/{chunk-BPYPUEM5.js → chunk-CZJLWCEG.js} +2 -2
- package/dist/{chunk-FPWB5ILF.js → chunk-DRHIIUDO.js} +5 -5
- package/dist/{chunk-BEGWE5O4.js → chunk-DTC224UJ.js} +4 -4
- package/dist/{chunk-UB76PBDF.js → chunk-DVFIE54C.js} +2 -2
- package/dist/{chunk-GO4MVQGC.js → chunk-DW5FRWRQ.js} +2 -2
- package/dist/{chunk-6Z4H2Y77.js → chunk-E27Y7FF2.js} +4 -4
- package/dist/{chunk-PANMJFDS.js → chunk-E55CJV65.js} +2 -2
- package/dist/{chunk-JXAYT6LX.js → chunk-EJQW2IYW.js} +2 -2
- package/dist/{chunk-TPIBJP4S.js → chunk-EOHKZGOZ.js} +2 -2
- package/dist/{chunk-MSUSZLRE.js → chunk-EWT3WMVY.js} +5 -5
- package/dist/chunk-F7VBGS4C.js +64 -0
- package/dist/chunk-F7VBGS4C.js.map +1 -0
- package/dist/{chunk-DH75UNF3.js → chunk-FGK2C7JR.js} +2 -2
- package/dist/{chunk-RI5JZLZL.js → chunk-FKUYRQSP.js} +1 -1
- package/dist/chunk-FKUYRQSP.js.map +1 -0
- package/dist/{chunk-AD776JPA.js → chunk-FR67FG2U.js} +2 -2
- package/dist/{chunk-SHQWIDD5.js → chunk-GJQYM3PM.js} +4 -4
- package/dist/{chunk-7KTU6YMQ.js → chunk-GMTM6EN7.js} +5 -5
- package/dist/{chunk-WROCSDVL.js → chunk-GSFNH4C5.js} +5 -5
- package/dist/{chunk-PF5HDFYY.js → chunk-GVA5CYKP.js} +4 -4
- package/dist/chunk-GYXUCS37.js +36 -0
- package/dist/chunk-GYXUCS37.js.map +1 -0
- package/dist/{chunk-Z5ABJLTM.js → chunk-HFXTAEYY.js} +2 -2
- package/dist/{chunk-FOMK3WPG.js → chunk-HLYPI5CO.js} +4 -4
- package/dist/{chunk-VR5HDUBK.js → chunk-HP2ODXNA.js} +2 -2
- package/dist/{chunk-GBRKP5GZ.js → chunk-I5SBTNV2.js} +2 -2
- package/dist/{chunk-TP4N3X2Q.js → chunk-IPVYEPXO.js} +5 -5
- package/dist/{chunk-RRO2EOJB.js → chunk-JB67KPGM.js} +4 -4
- package/dist/{chunk-5ZOJLYD2.js → chunk-JE6RZ5L6.js} +4 -4
- package/dist/{chunk-4HYXEMBP.js → chunk-JIKWZDNK.js} +2 -2
- package/dist/{chunk-4MLDWACO.js → chunk-JM64OEU6.js} +12 -12
- package/dist/{chunk-2QLVUVVR.js → chunk-JSH3HFDQ.js} +2 -2
- package/dist/{chunk-TZ4SFX3M.js → chunk-JWW2Z3RH.js} +4 -4
- package/dist/{chunk-QFHH2NU5.js → chunk-JXNT5TUP.js} +3 -3
- package/dist/{chunk-FINCVAAR.js → chunk-KHWCX4LI.js} +4 -4
- package/dist/{chunk-THZ2NAA4.js → chunk-KW7H5O3K.js} +7 -7
- package/dist/{chunk-XLJJ2ZAP.js → chunk-L4U23SBX.js} +11 -11
- package/dist/{chunk-ZXLIWOXC.js → chunk-LS4FMSHY.js} +5 -5
- package/dist/{chunk-SFAP5EH5.js → chunk-LUMF63BM.js} +4 -4
- package/dist/{chunk-CZPU5TW3.js → chunk-LYSSO6WC.js} +4 -4
- package/dist/{chunk-736HP6BL.js → chunk-M4LQRQFL.js} +2 -2
- package/dist/{chunk-426FTCMF.js → chunk-MESRKY67.js} +2 -2
- package/dist/{chunk-B5PYBEXO.js → chunk-MP4VSWHK.js} +2 -2
- package/dist/chunk-MQNKRIGC.js +205 -0
- package/dist/chunk-MQNKRIGC.js.map +1 -0
- package/dist/{chunk-UOPQOBQZ.js → chunk-MYGNIFZC.js} +3 -3
- package/dist/{chunk-6RGWDKUL.js → chunk-N2TUX4A5.js} +4 -4
- package/dist/{chunk-VWGR5XUP.js → chunk-NWNSUHEB.js} +2 -2
- package/dist/{chunk-4K7FDVAB.js → chunk-O3336DJ6.js} +2 -2
- package/dist/{chunk-YCCKY5VW.js → chunk-OFOYMZRY.js} +4 -4
- package/dist/{chunk-OCXCH2ZW.js → chunk-OIKQO73C.js} +7 -7
- package/dist/{chunk-QZDBWXZG.js → chunk-OP65D4UR.js} +2 -2
- package/dist/{chunk-MCRIT46W.js → chunk-OTH7H3IP.js} +5 -5
- package/dist/{chunk-BQQONDW5.js → chunk-OVLNF4AZ.js} +6 -6
- package/dist/{chunk-AGYGNNOM.js → chunk-PQECNGDE.js} +2 -2
- package/dist/{chunk-IIROZKW5.js → chunk-PRUSQQDT.js} +2 -2
- package/dist/{chunk-IPE5FFFD.js → chunk-PUBPZOQJ.js} +2 -2
- package/dist/{chunk-FB36IHCE.js → chunk-QFVFHIHE.js} +8 -8
- package/dist/{chunk-V5P5Q6HM.js → chunk-QJRDDVZ2.js} +3 -3
- package/dist/{chunk-WBKWIFXA.js → chunk-QYNCPS5W.js} +6 -6
- package/dist/{chunk-VPHOSIPB.js → chunk-R6SNYC3D.js} +10 -10
- package/dist/{chunk-STH66VLA.js → chunk-R7R3LOKW.js} +2 -2
- package/dist/{chunk-W2UTDN4T.js → chunk-RBGOGTT2.js} +4 -4
- package/dist/chunk-RQWZYD6H.js +1 -0
- package/dist/chunk-RQWZYD6H.js.map +1 -0
- package/dist/{chunk-VWBWKLXX.js → chunk-SX3V2DLV.js} +4 -4
- package/dist/{chunk-P7FQUGED.js → chunk-TNVO2DTB.js} +5 -5
- package/dist/{chunk-WTIOCG4M.js → chunk-TOYEP23N.js} +2 -2
- package/dist/{chunk-G2IPK2XE.js → chunk-TPLKJHNN.js} +8 -8
- package/dist/{chunk-U2AC4AQX.js → chunk-TU5EIKJA.js} +4 -4
- package/dist/{chunk-ZGHIHEND.js → chunk-TW3BXVEU.js} +2 -2
- package/dist/chunk-TWQYDKCA.js +113 -0
- package/dist/chunk-TWQYDKCA.js.map +1 -0
- package/dist/{chunk-BGYLL467.js → chunk-TXHJX2NG.js} +4 -4
- package/dist/{chunk-6F5IKY32.js → chunk-TYJR4GOF.js} +6 -2
- package/dist/{chunk-6F5IKY32.js.map → chunk-TYJR4GOF.js.map} +1 -1
- package/dist/{chunk-5RQ7N63M.js → chunk-TZDDL3DR.js} +2 -2
- package/dist/{chunk-RPQ3W2C6.js → chunk-U2ZDN2AL.js} +2 -2
- package/dist/{chunk-WPZT2JD4.js → chunk-U7Q2Y6WG.js} +2 -2
- package/dist/{chunk-E46PG577.js → chunk-URXT5TOY.js} +4 -4
- package/dist/chunk-VM3HRSAU.js +79 -0
- package/dist/chunk-VM3HRSAU.js.map +1 -0
- package/dist/{chunk-P6IPJYCS.js → chunk-VNNG46TS.js} +6 -6
- package/dist/{chunk-CXVMD6FE.js → chunk-VON4BFK4.js} +3 -3
- package/dist/{chunk-2SWQ6HIK.js → chunk-W3FAKT3D.js} +4 -4
- package/dist/{chunk-JDMYD6QC.js → chunk-W4SDVTZC.js} +2 -2
- package/dist/{chunk-7MAOQIWA.js → chunk-W4YWU7LQ.js} +2 -2
- package/dist/{chunk-Y46RBFBV.js → chunk-W7Y6RA6W.js} +6 -6
- package/dist/{chunk-XFU2S6XT.js → chunk-WGRS4PGY.js} +10 -10
- package/dist/{chunk-OOGEYCJH.js → chunk-WIT3Y7JT.js} +2 -2
- package/dist/{chunk-KT6HWAEN.js → chunk-WQA4LIIK.js} +4 -4
- package/dist/{chunk-J2KSG754.js → chunk-WRDPWEIC.js} +5 -5
- package/dist/{chunk-RPWEXIAW.js → chunk-X5MPHXG5.js} +6 -6
- package/dist/{chunk-UEIVXFUC.js → chunk-XELVDPKL.js} +5 -5
- package/dist/{chunk-RRZBATXK.js → chunk-XKV5ZIBG.js} +3 -3
- package/dist/{chunk-ZKFYBC6G.js → chunk-XSF6AXEU.js} +2 -2
- package/dist/{chunk-R6RVBYTU.js → chunk-XUJG2HFW.js} +3 -3
- package/dist/{chunk-S5LE2ARG.js → chunk-YANLN6HP.js} +66 -56
- package/dist/chunk-YANLN6HP.js.map +1 -0
- package/dist/{chunk-FRQ4HNGF.js → chunk-YJ4HM25H.js} +2 -2
- package/dist/{chunk-TVO5STZB.js → chunk-YQ6TNHAC.js} +3 -3
- package/dist/{chunk-BNNSO4MC.js → chunk-YTOYMJPM.js} +5 -5
- package/dist/{chunk-IH4RSRQA.js → chunk-ZA4U5GDU.js} +6 -6
- package/dist/data-display/Alert.js +4 -4
- package/dist/data-display/AsyncStateContainer.js +8 -8
- package/dist/data-display/Badge.js +3 -3
- package/dist/data-display/CardKit.js +13 -13
- package/dist/data-display/Chart.js +6 -6
- package/dist/data-display/Chip.js +3 -3
- package/dist/data-display/DataGrid.js +2 -2
- package/dist/data-display/DataViews.js +84 -80
- package/dist/data-display/DescriptionItem.js +3 -3
- package/dist/data-display/EmptyState.js +2 -2
- package/dist/data-display/ErrorState.js +2 -2
- package/dist/data-display/FleetMap.js +54 -0
- package/dist/data-display/FleetMap.js.map +1 -0
- package/dist/data-display/LazyImage.js +4 -4
- package/dist/data-display/Lightbox.js +1 -1
- package/dist/data-display/LoadingState.js +4 -4
- package/dist/data-display/MapPreview.js +7 -7
- package/dist/data-display/Progress.js +2 -2
- package/dist/data-display/SectionOnboarding.js +3 -3
- package/dist/data-display/Sheet.js +3 -3
- package/dist/data-display/StatCard.js +4 -4
- package/dist/data-display/Table.js +2 -2
- package/dist/feedback/ConfirmAction.js +4 -4
- package/dist/feedback/Dialog.js +6 -2
- package/dist/feedback/TutorialOverlay.js +2 -2
- package/dist/form/AddressAutocomplete.js +7 -7
- package/dist/form/Autocomplete.js +2 -2
- package/dist/form/Button.js +3 -3
- package/dist/form/Calendar.js +4 -4
- package/dist/form/CategorySelect.js +10 -10
- package/dist/form/CepField.js +4 -4
- package/dist/form/Checkbox.js +2 -2
- package/dist/form/CodeEditor.js +2 -2
- package/dist/form/Command.js +2 -2
- package/dist/form/DateRangePicker.js +11 -11
- package/dist/form/Input.js +3 -3
- package/dist/form/Label.js +2 -2
- package/dist/form/Menubar.js +5 -5
- package/dist/form/PhoneInput.js +3 -3
- package/dist/form/Select.js +2 -2
- package/dist/form/Switch.js +2 -2
- package/dist/form/total-form.js +30 -30
- package/dist/icons.js +2 -2
- package/dist/layout/Box.js +2 -2
- package/dist/layout/Card.js +6 -3
- package/dist/layout/Container.js +2 -2
- package/dist/layout/ContentToolbar.js +3 -3
- package/dist/layout/SettingsLayout.js +2 -2
- package/dist/layout/Skeleton.js +3 -3
- package/dist/layout/Spacer.js +2 -2
- package/dist/layout/Stack.js +3 -3
- package/dist/locales.js +4 -4
- package/dist/native/chunks/{chunk-HSIND52T.js → chunk-2UFNPDYT.js} +2 -1
- package/dist/native/chunks/chunk-2UFNPDYT.js.map +1 -0
- package/dist/native/chunks/{chunk-OGWPPQL4.js → chunk-75JQYVDZ.js} +3 -3
- package/dist/native/chunks/{chunk-WKMDCNIN.js → chunk-7LTVGW23.js} +2 -2
- package/dist/native/chunks/{chunk-QZAUOHDQ.js → chunk-AR5O4BEY.js} +6 -2
- package/dist/native/chunks/{chunk-QZAUOHDQ.js.map → chunk-AR5O4BEY.js.map} +1 -1
- package/dist/native/chunks/{chunk-RJVM5YDE.js → chunk-ATS7STZJ.js} +4 -4
- package/dist/native/chunks/{chunk-YTHR4Y5P.js → chunk-GWGIWQO7.js} +2 -2
- package/dist/native/chunks/{chunk-P3PL4WBO.js → chunk-LEMMXZFN.js} +24 -24
- package/dist/native/chunks/{chunk-P3PL4WBO.js.map → chunk-LEMMXZFN.js.map} +1 -1
- package/dist/native/chunks/chunk-NRN37A5K.js +67 -0
- package/dist/native/chunks/chunk-NRN37A5K.js.map +1 -0
- package/dist/native/chunks/{chunk-D4EYAXNG.js → chunk-QYUD3S6F.js} +5 -5
- package/dist/native/data-display/Alert.js +8 -8
- package/dist/native/data-display/Avatar.js +7 -7
- package/dist/native/data-display/Badge.js +8 -8
- package/dist/native/data-display/Chip.js +4 -4
- package/dist/native/data-display/EmptyState.js +11 -11
- package/dist/native/data-display/ErrorState.js +11 -11
- package/dist/native/data-display/LoadingState.js +7 -7
- package/dist/native/data-display/Progress.js +3 -3
- package/dist/native/feedback/Dialog.js +496 -0
- package/dist/native/feedback/Dialog.js.map +1 -0
- package/dist/native/form/Button.js +4 -4
- package/dist/native/form/Checkbox.js +5 -5
- package/dist/native/form/Input.js +5 -5
- package/dist/native/form/Select.js +6 -6
- package/dist/native/form/Switch.js +3 -3
- package/dist/native/icons.js +4 -4
- package/dist/native/layout/Box.js +4 -4
- package/dist/native/layout/Card.js +494 -0
- package/dist/native/layout/Card.js.map +1 -0
- package/dist/native/layout/Container.js +3 -3
- package/dist/native/layout/Skeleton.js +6 -6
- package/dist/native/layout/Spacer.js +3 -3
- package/dist/native/layout/Stack.js +4 -4
- package/dist/native/provider.js +2 -2
- package/dist/native/tokens.js +1 -1
- package/dist/native/typography/Heading.js +3 -3
- package/dist/native/typography/Paragraph.js +3 -3
- package/dist/native/typography/Text.js +3 -3
- package/dist/navigation/AppHeader.js +14 -11
- package/dist/navigation/CommandPalette.js +2 -2
- package/dist/navigation/Pagination.js +2 -2
- package/dist/pt-BR.js +4 -4
- package/dist/social-login-button.js +11 -9
- package/dist/types/components/data-display/FleetMap/FleetBody.d.ts +22 -0
- package/dist/types/components/data-display/FleetMap/FleetBody.d.ts.map +1 -0
- package/dist/types/components/data-display/FleetMap/FleetCanvas.d.ts +50 -0
- package/dist/types/components/data-display/FleetMap/FleetCanvas.d.ts.map +1 -0
- package/dist/types/components/data-display/FleetMap/FleetMap.d.ts +32 -0
- package/dist/types/components/data-display/FleetMap/FleetMap.d.ts.map +1 -0
- package/dist/types/components/data-display/FleetMap/FleetMap.fixtures.d.ts +23 -0
- package/dist/types/components/data-display/FleetMap/FleetMap.fixtures.d.ts.map +1 -0
- package/dist/types/components/data-display/FleetMap/FleetMap.helpers.d.ts +45 -0
- package/dist/types/components/data-display/FleetMap/FleetMap.helpers.d.ts.map +1 -0
- package/dist/types/components/data-display/FleetMap/FleetMap.hooks.d.ts +54 -0
- package/dist/types/components/data-display/FleetMap/FleetMap.hooks.d.ts.map +1 -0
- package/dist/types/components/data-display/FleetMap/FleetMap.types.d.ts +145 -0
- package/dist/types/components/data-display/FleetMap/FleetMap.types.d.ts.map +1 -0
- package/dist/types/components/data-display/FleetMap/FleetRoster.d.ts +15 -0
- package/dist/types/components/data-display/FleetMap/FleetRoster.d.ts.map +1 -0
- package/dist/types/components/data-display/FleetMap/index.d.ts +5 -0
- package/dist/types/components/data-display/FleetMap/index.d.ts.map +1 -0
- package/dist/types/components/data-display/index.d.ts +1 -0
- package/dist/types/components/data-display/index.d.ts.map +1 -1
- package/dist/types/components/feedback/Dialog/Dialog.base.d.ts +64 -0
- package/dist/types/components/feedback/Dialog/Dialog.base.d.ts.map +1 -0
- package/dist/types/components/feedback/Dialog/Dialog.d.ts.map +1 -1
- package/dist/types/components/feedback/Dialog/Dialog.helpers.d.ts +35 -0
- package/dist/types/components/feedback/Dialog/Dialog.helpers.d.ts.map +1 -0
- package/dist/types/components/feedback/Dialog/Dialog.metrics.d.ts +133 -0
- package/dist/types/components/feedback/Dialog/Dialog.metrics.d.ts.map +1 -0
- package/dist/types/components/feedback/Dialog/Dialog.styles.d.ts +4 -4
- package/dist/types/components/feedback/Dialog/Dialog.styles.d.ts.map +1 -1
- package/dist/types/components/feedback/Dialog/Dialog.types.d.ts +8 -41
- package/dist/types/components/feedback/Dialog/Dialog.types.d.ts.map +1 -1
- package/dist/types/components/feedback/Dialog/index.d.ts +1 -1
- package/dist/types/components/feedback/Dialog/index.d.ts.map +1 -1
- package/dist/types/components/layout/Card/Card.base.d.ts +77 -0
- package/dist/types/components/layout/Card/Card.base.d.ts.map +1 -0
- package/dist/types/components/layout/Card/Card.d.ts.map +1 -1
- package/dist/types/components/layout/Card/Card.helpers.d.ts +8 -3
- package/dist/types/components/layout/Card/Card.helpers.d.ts.map +1 -1
- package/dist/types/components/layout/Card/Card.metrics.d.ts +182 -0
- package/dist/types/components/layout/Card/Card.metrics.d.ts.map +1 -0
- package/dist/types/components/layout/Card/Card.styles.d.ts +2 -2
- package/dist/types/components/layout/Card/Card.styles.d.ts.map +1 -1
- package/dist/types/components/layout/Card/Card.types.d.ts +10 -44
- package/dist/types/components/layout/Card/Card.types.d.ts.map +1 -1
- package/dist/types/components/layout/Card/index.d.ts +1 -1
- package/dist/types/components/layout/Card/index.d.ts.map +1 -1
- package/dist/types/platform/test-id.d.ts +14 -0
- package/dist/types/platform/test-id.d.ts.map +1 -1
- package/dist/types/tokens/mui-type.d.ts +1 -1
- package/dist/types/tokens/mui-type.d.ts.map +1 -1
- package/dist/types/tokens/shadow.d.ts +40 -0
- package/dist/types/tokens/shadow.d.ts.map +1 -0
- package/dist/types-native/components/feedback/Dialog/Dialog.base.d.ts +64 -0
- package/dist/types-native/components/feedback/Dialog/Dialog.base.d.ts.map +1 -0
- package/dist/types-native/components/feedback/Dialog/Dialog.helpers.d.ts +35 -0
- package/dist/types-native/components/feedback/Dialog/Dialog.helpers.d.ts.map +1 -0
- package/dist/types-native/components/feedback/Dialog/Dialog.look.native.d.ts +44 -0
- package/dist/types-native/components/feedback/Dialog/Dialog.look.native.d.ts.map +1 -0
- package/dist/types-native/components/feedback/Dialog/Dialog.metrics.d.ts +133 -0
- package/dist/types-native/components/feedback/Dialog/Dialog.metrics.d.ts.map +1 -0
- package/dist/types-native/components/feedback/Dialog/Dialog.native.d.ts +8 -0
- package/dist/types-native/components/feedback/Dialog/Dialog.native.d.ts.map +1 -0
- package/dist/types-native/components/feedback/Dialog/Dialog.types.native.d.ts +25 -0
- package/dist/types-native/components/feedback/Dialog/Dialog.types.native.d.ts.map +1 -0
- package/dist/types-native/components/feedback/Dialog/DialogParts.native.d.ts +39 -0
- package/dist/types-native/components/feedback/Dialog/DialogParts.native.d.ts.map +1 -0
- package/dist/types-native/components/feedback/Dialog/index.native.d.ts +4 -0
- package/dist/types-native/components/feedback/Dialog/index.native.d.ts.map +1 -0
- package/dist/types-native/components/layout/Card/Card.base.d.ts +77 -0
- package/dist/types-native/components/layout/Card/Card.base.d.ts.map +1 -0
- package/dist/types-native/components/layout/Card/Card.helpers.d.ts +11 -0
- package/dist/types-native/components/layout/Card/Card.helpers.d.ts.map +1 -0
- package/dist/types-native/components/layout/Card/Card.look.native.d.ts +57 -0
- package/dist/types-native/components/layout/Card/Card.look.native.d.ts.map +1 -0
- package/dist/types-native/components/layout/Card/Card.metrics.d.ts +182 -0
- package/dist/types-native/components/layout/Card/Card.metrics.d.ts.map +1 -0
- package/dist/types-native/components/layout/Card/Card.native.d.ts +11 -0
- package/dist/types-native/components/layout/Card/Card.native.d.ts.map +1 -0
- package/dist/types-native/components/layout/Card/Card.types.native.d.ts +28 -0
- package/dist/types-native/components/layout/Card/Card.types.native.d.ts.map +1 -0
- package/dist/types-native/components/layout/Card/CardParts.native.d.ts +55 -0
- package/dist/types-native/components/layout/Card/CardParts.native.d.ts.map +1 -0
- package/dist/types-native/components/layout/Card/index.native.d.ts +4 -0
- package/dist/types-native/components/layout/Card/index.native.d.ts.map +1 -0
- package/dist/types-native/platform/pulse-ring.native.d.ts +35 -0
- package/dist/types-native/platform/pulse-ring.native.d.ts.map +1 -0
- package/dist/types-native/platform/test-id.d.ts +14 -0
- package/dist/types-native/platform/test-id.d.ts.map +1 -1
- package/dist/types-native/tokens/mui-type.d.ts +1 -1
- package/dist/types-native/tokens/mui-type.d.ts.map +1 -1
- package/dist/types-native/tokens/shadow.d.ts +40 -0
- package/dist/types-native/tokens/shadow.d.ts.map +1 -0
- package/dist/typography/Heading.js +2 -2
- package/dist/typography/Paragraph.js +2 -2
- package/dist/typography/Text.js +2 -2
- package/dist/user-avatar.js +10 -8
- package/dist/utility/InfiniteScroll.js +2 -2
- package/dist/utility/InstallPrompt.js +2 -2
- package/package.json +13 -1
- package/src/components/data-display/CardKit/NATIVE-NOTES.md +48 -0
- package/src/components/data-display/FleetMap/FleetBody.tsx +96 -0
- package/src/components/data-display/FleetMap/FleetCanvas.tsx +80 -0
- package/src/components/data-display/FleetMap/FleetMap.fixtures.ts +70 -0
- package/src/components/data-display/FleetMap/FleetMap.helpers.ts +85 -0
- package/src/components/data-display/FleetMap/FleetMap.hooks.ts +164 -0
- package/src/components/data-display/FleetMap/FleetMap.md +182 -0
- package/src/components/data-display/FleetMap/FleetMap.tsx +169 -0
- package/src/components/data-display/FleetMap/FleetMap.types.ts +148 -0
- package/src/components/data-display/FleetMap/FleetRoster.tsx +321 -0
- package/src/components/data-display/FleetMap/index.ts +9 -0
- package/src/components/data-display/FleetMap/tests.md +79 -0
- package/src/components/data-display/FleetMap/track.md +50 -0
- package/src/components/data-display/index.ts +1 -0
- package/src/components/feedback/ConfirmAction/ConfirmAction.md +10 -4
- package/src/components/feedback/Dialog/Dialog.base.ts +69 -0
- package/src/components/feedback/Dialog/Dialog.helpers.ts +75 -0
- package/src/components/feedback/Dialog/Dialog.look.native.ts +159 -0
- package/src/components/feedback/Dialog/Dialog.metrics.ts +140 -0
- package/src/components/feedback/Dialog/Dialog.native.tsx +149 -0
- package/src/components/feedback/Dialog/Dialog.styles.ts +63 -41
- package/src/components/feedback/Dialog/Dialog.tsx +58 -74
- package/src/components/feedback/Dialog/Dialog.types.native.ts +46 -0
- package/src/components/feedback/Dialog/Dialog.types.ts +24 -41
- package/src/components/feedback/Dialog/DialogParts.native.tsx +257 -0
- package/src/components/feedback/Dialog/NATIVE-NOTES.md +16 -0
- package/src/components/feedback/Dialog/index.native.ts +16 -0
- package/src/components/feedback/Dialog/index.ts +8 -2
- package/src/components/layout/Card/Card.base.ts +92 -0
- package/src/components/layout/Card/Card.helpers.ts +13 -7
- package/src/components/layout/Card/Card.look.native.ts +204 -0
- package/src/components/layout/Card/Card.metrics.ts +171 -0
- package/src/components/layout/Card/Card.native.tsx +130 -0
- package/src/components/layout/Card/Card.styles.ts +88 -48
- package/src/components/layout/Card/Card.tsx +41 -25
- package/src/components/layout/Card/Card.types.native.ts +59 -0
- package/src/components/layout/Card/Card.types.ts +30 -45
- package/src/components/layout/Card/CardParts.native.tsx +262 -0
- package/src/components/layout/Card/NATIVE-NOTES.md +15 -0
- package/src/components/layout/Card/index.native.ts +18 -0
- package/src/components/layout/Card/index.ts +9 -0
- package/src/platform/pulse-ring.native.tsx +82 -0
- package/src/platform/test-id.ts +17 -0
- package/src/tokens/mui-type.ts +2 -1
- package/src/tokens/shadow.ts +59 -0
- package/dist/chunk-6PRA45LC.js.map +0 -1
- package/dist/chunk-D2IASECY.js.map +0 -1
- package/dist/chunk-RI5JZLZL.js.map +0 -1
- package/dist/chunk-S5LE2ARG.js.map +0 -1
- package/dist/chunk-VMF3UXM4.js +0 -137
- package/dist/chunk-VMF3UXM4.js.map +0 -1
- package/dist/chunk-X3HL5C6H.js +0 -1
- package/dist/native/chunks/chunk-HSIND52T.js.map +0 -1
- /package/dist/{chunk-X3HL5C6H.js.map → _internal/components/data-display/FleetMap/FleetBody.js.map} +0 -0
- /package/dist/{chunk-NUE774AN.js.map → chunk-25R3ITGZ.js.map} +0 -0
- /package/dist/{chunk-Z6UEOSL7.js.map → chunk-2FDBR77W.js.map} +0 -0
- /package/dist/{chunk-IFNK5TPI.js.map → chunk-2HPP6RVC.js.map} +0 -0
- /package/dist/{chunk-GCXYCDOA.js.map → chunk-2UGJIKVA.js.map} +0 -0
- /package/dist/{chunk-26Z7QWID.js.map → chunk-343TTIHD.js.map} +0 -0
- /package/dist/{chunk-BRSF5NRT.js.map → chunk-3FLVIVOK.js.map} +0 -0
- /package/dist/{chunk-BDVNAU2C.js.map → chunk-4523RYE7.js.map} +0 -0
- /package/dist/{chunk-4ETQRBZC.js.map → chunk-46UPILLK.js.map} +0 -0
- /package/dist/{chunk-WMALDOF5.js.map → chunk-4G3FGCWX.js.map} +0 -0
- /package/dist/{chunk-I3MDKPGG.js.map → chunk-4IVOHL32.js.map} +0 -0
- /package/dist/{chunk-SAHQLXNN.js.map → chunk-4LRFGB3K.js.map} +0 -0
- /package/dist/{chunk-ZOUWHGV3.js.map → chunk-4MGFUPQT.js.map} +0 -0
- /package/dist/{chunk-TLX66HCW.js.map → chunk-4OHRZW7U.js.map} +0 -0
- /package/dist/{chunk-2QFTAGDH.js.map → chunk-4X4KM4ZB.js.map} +0 -0
- /package/dist/{chunk-7ZH7ZB33.js.map → chunk-4XZXLB4I.js.map} +0 -0
- /package/dist/{chunk-77F36LQQ.js.map → chunk-5OIH36KX.js.map} +0 -0
- /package/dist/{chunk-GDEXYUPF.js.map → chunk-67L7HMEP.js.map} +0 -0
- /package/dist/{chunk-ZFPJBKVZ.js.map → chunk-6JGPPTLX.js.map} +0 -0
- /package/dist/{chunk-VIK3HAUQ.js.map → chunk-73NJCGQG.js.map} +0 -0
- /package/dist/{chunk-D4T646G4.js.map → chunk-7NSX7A5H.js.map} +0 -0
- /package/dist/{chunk-QS7ZGRNS.js.map → chunk-7VN7LFBA.js.map} +0 -0
- /package/dist/{chunk-3UOHKHOT.js.map → chunk-ACFGEZ4Q.js.map} +0 -0
- /package/dist/{chunk-GBNOYRLP.js.map → chunk-AEGXHZQT.js.map} +0 -0
- /package/dist/{chunk-BEH4DN63.js.map → chunk-AJGYHDA5.js.map} +0 -0
- /package/dist/{chunk-65DLYC4S.js.map → chunk-AVGTTWTE.js.map} +0 -0
- /package/dist/{chunk-PXH24VIP.js.map → chunk-B6IURHSZ.js.map} +0 -0
- /package/dist/{chunk-XEE7PLDR.js.map → chunk-BZTFPSWT.js.map} +0 -0
- /package/dist/{chunk-B3BK2SNS.js.map → chunk-C3CMEDSO.js.map} +0 -0
- /package/dist/{chunk-OH3YGJT5.js.map → chunk-CBTY36TU.js.map} +0 -0
- /package/dist/{chunk-JIINGMEB.js.map → chunk-CHPZTF34.js.map} +0 -0
- /package/dist/{chunk-PWXL3QQ6.js.map → chunk-CJBBGMIA.js.map} +0 -0
- /package/dist/{chunk-BPYPUEM5.js.map → chunk-CZJLWCEG.js.map} +0 -0
- /package/dist/{chunk-FPWB5ILF.js.map → chunk-DRHIIUDO.js.map} +0 -0
- /package/dist/{chunk-BEGWE5O4.js.map → chunk-DTC224UJ.js.map} +0 -0
- /package/dist/{chunk-UB76PBDF.js.map → chunk-DVFIE54C.js.map} +0 -0
- /package/dist/{chunk-GO4MVQGC.js.map → chunk-DW5FRWRQ.js.map} +0 -0
- /package/dist/{chunk-6Z4H2Y77.js.map → chunk-E27Y7FF2.js.map} +0 -0
- /package/dist/{chunk-PANMJFDS.js.map → chunk-E55CJV65.js.map} +0 -0
- /package/dist/{chunk-JXAYT6LX.js.map → chunk-EJQW2IYW.js.map} +0 -0
- /package/dist/{chunk-TPIBJP4S.js.map → chunk-EOHKZGOZ.js.map} +0 -0
- /package/dist/{chunk-MSUSZLRE.js.map → chunk-EWT3WMVY.js.map} +0 -0
- /package/dist/{chunk-DH75UNF3.js.map → chunk-FGK2C7JR.js.map} +0 -0
- /package/dist/{chunk-AD776JPA.js.map → chunk-FR67FG2U.js.map} +0 -0
- /package/dist/{chunk-SHQWIDD5.js.map → chunk-GJQYM3PM.js.map} +0 -0
- /package/dist/{chunk-7KTU6YMQ.js.map → chunk-GMTM6EN7.js.map} +0 -0
- /package/dist/{chunk-WROCSDVL.js.map → chunk-GSFNH4C5.js.map} +0 -0
- /package/dist/{chunk-PF5HDFYY.js.map → chunk-GVA5CYKP.js.map} +0 -0
- /package/dist/{chunk-Z5ABJLTM.js.map → chunk-HFXTAEYY.js.map} +0 -0
- /package/dist/{chunk-FOMK3WPG.js.map → chunk-HLYPI5CO.js.map} +0 -0
- /package/dist/{chunk-VR5HDUBK.js.map → chunk-HP2ODXNA.js.map} +0 -0
- /package/dist/{chunk-GBRKP5GZ.js.map → chunk-I5SBTNV2.js.map} +0 -0
- /package/dist/{chunk-TP4N3X2Q.js.map → chunk-IPVYEPXO.js.map} +0 -0
- /package/dist/{chunk-RRO2EOJB.js.map → chunk-JB67KPGM.js.map} +0 -0
- /package/dist/{chunk-5ZOJLYD2.js.map → chunk-JE6RZ5L6.js.map} +0 -0
- /package/dist/{chunk-4HYXEMBP.js.map → chunk-JIKWZDNK.js.map} +0 -0
- /package/dist/{chunk-4MLDWACO.js.map → chunk-JM64OEU6.js.map} +0 -0
- /package/dist/{chunk-2QLVUVVR.js.map → chunk-JSH3HFDQ.js.map} +0 -0
- /package/dist/{chunk-TZ4SFX3M.js.map → chunk-JWW2Z3RH.js.map} +0 -0
- /package/dist/{chunk-QFHH2NU5.js.map → chunk-JXNT5TUP.js.map} +0 -0
- /package/dist/{chunk-FINCVAAR.js.map → chunk-KHWCX4LI.js.map} +0 -0
- /package/dist/{chunk-THZ2NAA4.js.map → chunk-KW7H5O3K.js.map} +0 -0
- /package/dist/{chunk-XLJJ2ZAP.js.map → chunk-L4U23SBX.js.map} +0 -0
- /package/dist/{chunk-ZXLIWOXC.js.map → chunk-LS4FMSHY.js.map} +0 -0
- /package/dist/{chunk-SFAP5EH5.js.map → chunk-LUMF63BM.js.map} +0 -0
- /package/dist/{chunk-CZPU5TW3.js.map → chunk-LYSSO6WC.js.map} +0 -0
- /package/dist/{chunk-736HP6BL.js.map → chunk-M4LQRQFL.js.map} +0 -0
- /package/dist/{chunk-426FTCMF.js.map → chunk-MESRKY67.js.map} +0 -0
- /package/dist/{chunk-B5PYBEXO.js.map → chunk-MP4VSWHK.js.map} +0 -0
- /package/dist/{chunk-UOPQOBQZ.js.map → chunk-MYGNIFZC.js.map} +0 -0
- /package/dist/{chunk-6RGWDKUL.js.map → chunk-N2TUX4A5.js.map} +0 -0
- /package/dist/{chunk-VWGR5XUP.js.map → chunk-NWNSUHEB.js.map} +0 -0
- /package/dist/{chunk-4K7FDVAB.js.map → chunk-O3336DJ6.js.map} +0 -0
- /package/dist/{chunk-YCCKY5VW.js.map → chunk-OFOYMZRY.js.map} +0 -0
- /package/dist/{chunk-OCXCH2ZW.js.map → chunk-OIKQO73C.js.map} +0 -0
- /package/dist/{chunk-QZDBWXZG.js.map → chunk-OP65D4UR.js.map} +0 -0
- /package/dist/{chunk-MCRIT46W.js.map → chunk-OTH7H3IP.js.map} +0 -0
- /package/dist/{chunk-BQQONDW5.js.map → chunk-OVLNF4AZ.js.map} +0 -0
- /package/dist/{chunk-AGYGNNOM.js.map → chunk-PQECNGDE.js.map} +0 -0
- /package/dist/{chunk-IIROZKW5.js.map → chunk-PRUSQQDT.js.map} +0 -0
- /package/dist/{chunk-IPE5FFFD.js.map → chunk-PUBPZOQJ.js.map} +0 -0
- /package/dist/{chunk-FB36IHCE.js.map → chunk-QFVFHIHE.js.map} +0 -0
- /package/dist/{chunk-V5P5Q6HM.js.map → chunk-QJRDDVZ2.js.map} +0 -0
- /package/dist/{chunk-WBKWIFXA.js.map → chunk-QYNCPS5W.js.map} +0 -0
- /package/dist/{chunk-VPHOSIPB.js.map → chunk-R6SNYC3D.js.map} +0 -0
- /package/dist/{chunk-STH66VLA.js.map → chunk-R7R3LOKW.js.map} +0 -0
- /package/dist/{chunk-W2UTDN4T.js.map → chunk-RBGOGTT2.js.map} +0 -0
- /package/dist/{chunk-VWBWKLXX.js.map → chunk-SX3V2DLV.js.map} +0 -0
- /package/dist/{chunk-P7FQUGED.js.map → chunk-TNVO2DTB.js.map} +0 -0
- /package/dist/{chunk-WTIOCG4M.js.map → chunk-TOYEP23N.js.map} +0 -0
- /package/dist/{chunk-G2IPK2XE.js.map → chunk-TPLKJHNN.js.map} +0 -0
- /package/dist/{chunk-U2AC4AQX.js.map → chunk-TU5EIKJA.js.map} +0 -0
- /package/dist/{chunk-ZGHIHEND.js.map → chunk-TW3BXVEU.js.map} +0 -0
- /package/dist/{chunk-BGYLL467.js.map → chunk-TXHJX2NG.js.map} +0 -0
- /package/dist/{chunk-5RQ7N63M.js.map → chunk-TZDDL3DR.js.map} +0 -0
- /package/dist/{chunk-RPQ3W2C6.js.map → chunk-U2ZDN2AL.js.map} +0 -0
- /package/dist/{chunk-WPZT2JD4.js.map → chunk-U7Q2Y6WG.js.map} +0 -0
- /package/dist/{chunk-E46PG577.js.map → chunk-URXT5TOY.js.map} +0 -0
- /package/dist/{chunk-P6IPJYCS.js.map → chunk-VNNG46TS.js.map} +0 -0
- /package/dist/{chunk-CXVMD6FE.js.map → chunk-VON4BFK4.js.map} +0 -0
- /package/dist/{chunk-2SWQ6HIK.js.map → chunk-W3FAKT3D.js.map} +0 -0
- /package/dist/{chunk-JDMYD6QC.js.map → chunk-W4SDVTZC.js.map} +0 -0
- /package/dist/{chunk-7MAOQIWA.js.map → chunk-W4YWU7LQ.js.map} +0 -0
- /package/dist/{chunk-Y46RBFBV.js.map → chunk-W7Y6RA6W.js.map} +0 -0
- /package/dist/{chunk-XFU2S6XT.js.map → chunk-WGRS4PGY.js.map} +0 -0
- /package/dist/{chunk-OOGEYCJH.js.map → chunk-WIT3Y7JT.js.map} +0 -0
- /package/dist/{chunk-KT6HWAEN.js.map → chunk-WQA4LIIK.js.map} +0 -0
- /package/dist/{chunk-J2KSG754.js.map → chunk-WRDPWEIC.js.map} +0 -0
- /package/dist/{chunk-RPWEXIAW.js.map → chunk-X5MPHXG5.js.map} +0 -0
- /package/dist/{chunk-UEIVXFUC.js.map → chunk-XELVDPKL.js.map} +0 -0
- /package/dist/{chunk-RRZBATXK.js.map → chunk-XKV5ZIBG.js.map} +0 -0
- /package/dist/{chunk-ZKFYBC6G.js.map → chunk-XSF6AXEU.js.map} +0 -0
- /package/dist/{chunk-R6RVBYTU.js.map → chunk-XUJG2HFW.js.map} +0 -0
- /package/dist/{chunk-FRQ4HNGF.js.map → chunk-YJ4HM25H.js.map} +0 -0
- /package/dist/{chunk-TVO5STZB.js.map → chunk-YQ6TNHAC.js.map} +0 -0
- /package/dist/{chunk-BNNSO4MC.js.map → chunk-YTOYMJPM.js.map} +0 -0
- /package/dist/{chunk-IH4RSRQA.js.map → chunk-ZA4U5GDU.js.map} +0 -0
- /package/dist/native/chunks/{chunk-OGWPPQL4.js.map → chunk-75JQYVDZ.js.map} +0 -0
- /package/dist/native/chunks/{chunk-WKMDCNIN.js.map → chunk-7LTVGW23.js.map} +0 -0
- /package/dist/native/chunks/{chunk-RJVM5YDE.js.map → chunk-ATS7STZJ.js.map} +0 -0
- /package/dist/native/chunks/{chunk-YTHR4Y5P.js.map → chunk-GWGIWQO7.js.map} +0 -0
- /package/dist/native/chunks/{chunk-D4EYAXNG.js.map → chunk-QYUD3S6F.js.map} +0 -0
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import type { MapPreviewCopy } from '../../../copy';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* One tracked unit's newest position, as the caller resolved it.
|
|
5
|
+
*
|
|
6
|
+
* Deliberately says nothing about WHAT is being tracked. A courier, a service
|
|
7
|
+
* van, a field engineer — the component draws a labelled dot with a freshness,
|
|
8
|
+
* and every word that names the domain arrives through {@link FleetMapCopy}.
|
|
9
|
+
*/
|
|
10
|
+
export interface FleetUnit {
|
|
11
|
+
id: string;
|
|
12
|
+
/** The name a human reads, on the pin and in the roster. */
|
|
13
|
+
label: string;
|
|
14
|
+
latitude: number;
|
|
15
|
+
longitude: number;
|
|
16
|
+
/**
|
|
17
|
+
* The fix's accuracy radius in metres, when the platform reported one.
|
|
18
|
+
*
|
|
19
|
+
* Kept because it is what separates a rooftop GPS fix from a cell-tower guess
|
|
20
|
+
* three blocks wide, and a map that draws both identically tells its reader
|
|
21
|
+
* something false.
|
|
22
|
+
*/
|
|
23
|
+
accuracyM?: number | null;
|
|
24
|
+
/**
|
|
25
|
+
* Seconds since the fix was ACCEPTED, on the server's clock.
|
|
26
|
+
*
|
|
27
|
+
* The caller computes it, and the distinction matters: a device whose own
|
|
28
|
+
* clock is an hour slow would otherwise report itself as an hour stale while
|
|
29
|
+
* reporting perfectly.
|
|
30
|
+
*/
|
|
31
|
+
staleSeconds: number;
|
|
32
|
+
/** A short pre-formatted badge beside the name, e.g. `"2 entregas"`. */
|
|
33
|
+
badge?: string;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** How current a unit's newest fix is, derived from the thresholds below. */
|
|
37
|
+
export type FleetFreshness = 'live' | 'lagging' | 'stale';
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Every word the board prints, and the two it FORMATS.
|
|
41
|
+
*
|
|
42
|
+
* `lastSeen` and `accuracy` are functions rather than strings because a
|
|
43
|
+
* duration and a distance are locale rules, and this package holds the same
|
|
44
|
+
* line `StatCard` does: presentation only, the caller owns the formatting. A
|
|
45
|
+
* `lastSeenMinutes: string` template would have made "há 2 min" the only
|
|
46
|
+
* shape any consumer could ever render.
|
|
47
|
+
*/
|
|
48
|
+
export interface FleetMapCopy {
|
|
49
|
+
/** The panel's heading. */
|
|
50
|
+
title: string;
|
|
51
|
+
/** What the roster says when nobody is reporting. */
|
|
52
|
+
emptyTitle: string;
|
|
53
|
+
emptyDescription?: string;
|
|
54
|
+
/** The roster list's accessible name — it is the map's readable half. */
|
|
55
|
+
rosterLabel: string;
|
|
56
|
+
/**
|
|
57
|
+
* What a screen reader hears while the roster reloads, e.g. "Atualizando a
|
|
58
|
+
* frota". OPTIONAL, and silence is the honest default: `aria-busy` marks the
|
|
59
|
+
* region stale without uttering anything, the skeletons are `aria-hidden`,
|
|
60
|
+
* and this component cannot invent the sentence in the reader's language.
|
|
61
|
+
* Set it and the panel announces politely; leave it and it stays quiet.
|
|
62
|
+
*
|
|
63
|
+
* Announced on a TRANSITION into loading. A board mounted already loading is
|
|
64
|
+
* silent — as any live region is at mount, since there is no change for a
|
|
65
|
+
* reader to observe.
|
|
66
|
+
*/
|
|
67
|
+
loading?: string;
|
|
68
|
+
/**
|
|
69
|
+
* The map region's accessible name.
|
|
70
|
+
*
|
|
71
|
+
* The map is NOT `aria-hidden`, and that is deliberate rather than an
|
|
72
|
+
* oversight: it carries focusable controls (zoom, centre, map type), and
|
|
73
|
+
* `aria-hidden` over a focusable subtree is the `aria-hidden-focus`
|
|
74
|
+
* violation — a keyboard user tabs into a region a screen reader insists is
|
|
75
|
+
* not there. So it is a NAMED region a reader can skip past instead, and the
|
|
76
|
+
* roster beside it carries every fact a pin does.
|
|
77
|
+
*
|
|
78
|
+
* Skipping it does not silence it: `MapPreview` carries its own
|
|
79
|
+
* `aria-live="polite"` and announces its centre in English on every
|
|
80
|
+
* re-centre. See `FleetCanvas` for why that is stated rather than fixed here.
|
|
81
|
+
*/
|
|
82
|
+
mapLabel: string;
|
|
83
|
+
/** The three freshness words, as a reader sees them on a row. */
|
|
84
|
+
freshness: Record<FleetFreshness, string>;
|
|
85
|
+
/** `(seconds) => "há 2 min"`. */
|
|
86
|
+
lastSeen: (staleSeconds: number) => string;
|
|
87
|
+
/** `(metres) => "±12 m"`. A unit with no accuracy renders none. */
|
|
88
|
+
accuracy: (metres: number) => string;
|
|
89
|
+
/** The map control bar's own six names. */
|
|
90
|
+
map: MapPreviewCopy;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** Props for the {@link FleetMap} live board. */
|
|
94
|
+
export interface FleetMapProps {
|
|
95
|
+
/** Everyone currently reporting. An empty array renders the empty state. */
|
|
96
|
+
units: readonly FleetUnit[];
|
|
97
|
+
copy: FleetMapCopy;
|
|
98
|
+
/**
|
|
99
|
+
* Which unit is highlighted: the map centres on it and the roster marks it
|
|
100
|
+
* selected. `null` selects nobody and centres on the whole fleet.
|
|
101
|
+
*
|
|
102
|
+
* PASSING IT AT ALL IS THE DECISION. Present on the first render — `null`
|
|
103
|
+
* included — and the board is controlled for life: it renders what you pass
|
|
104
|
+
* and never moves the selection itself. Absent on the first render and it
|
|
105
|
+
* keeps its own, reporting each change through {@link onSelect}. The mode is
|
|
106
|
+
* latched on that first render, the way React latches an `<input>`, so the
|
|
107
|
+
* component cannot change its own semantics halfway through a session.
|
|
108
|
+
*
|
|
109
|
+
* A controlled board reads `undefined` as "nobody is selected", so
|
|
110
|
+
* `useState<string>()` in the caller behaves: clearing it clears the roster.
|
|
111
|
+
*/
|
|
112
|
+
selectedId?: string | null;
|
|
113
|
+
/**
|
|
114
|
+
* A click on a row or a pin, and each arrow-key move. Fires in both modes, so
|
|
115
|
+
* an uncontrolled board can still be observed.
|
|
116
|
+
*
|
|
117
|
+
* Passing {@link selectedId} WITHOUT this is a selection nothing can move:
|
|
118
|
+
* the arrow keys then decline to act and leave the page to scroll, rather
|
|
119
|
+
* than swallowing a keypress that would do nothing.
|
|
120
|
+
*/
|
|
121
|
+
onSelect?: (id: string) => void;
|
|
122
|
+
/**
|
|
123
|
+
* Seconds after which a unit stops reading as `live`, and then as `lagging`.
|
|
124
|
+
*
|
|
125
|
+
* Both carry a GENERIC default (90s and 300s, sized for a phone reporting
|
|
126
|
+
* every twenty seconds) and no domain one, because the answer is entirely a
|
|
127
|
+
* property of the fleet's own ping cadence: a phone reporting every twenty
|
|
128
|
+
* seconds is late at ninety, and a tracker reporting every five minutes is
|
|
129
|
+
* not. A component that picked one would be picking it for every consumer.
|
|
130
|
+
*/
|
|
131
|
+
laggingAfterSeconds?: number;
|
|
132
|
+
staleAfterSeconds?: number;
|
|
133
|
+
/** Map height, any CSS length. */
|
|
134
|
+
height?: string;
|
|
135
|
+
/**
|
|
136
|
+
* While true the map and roster are marked `aria-busy`, and the roster renders
|
|
137
|
+
* skeletons IF no units have landed yet — a poll over a populated roster keeps
|
|
138
|
+
* the list, because unmounting it throws away the focus inside it.
|
|
139
|
+
*
|
|
140
|
+
* It only ANNOUNCES if {@link FleetMapCopy.loading} is set — `aria-busy` is a
|
|
141
|
+
* state, not an utterance. The panel root is deliberately not the busy
|
|
142
|
+
* element, so that announcement sits outside the busy subtree.
|
|
143
|
+
*/
|
|
144
|
+
loading?: boolean;
|
|
145
|
+
className?: string;
|
|
146
|
+
/** Test id for the panel root; every child id is derived from it. */
|
|
147
|
+
dataTestId?: string;
|
|
148
|
+
}
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
import Box from '@mui/material/Box/index.js';
|
|
2
|
+
import Stack from '@mui/material/Stack/index.js';
|
|
3
|
+
import Typography from '@mui/material/Typography/index.js';
|
|
4
|
+
import { useTheme, type SxProps, type Theme } from '@mui/material/styles/index.js';
|
|
5
|
+
import React from 'react';
|
|
6
|
+
|
|
7
|
+
import { Skeleton } from '../../layout/Skeleton/Skeleton';
|
|
8
|
+
|
|
9
|
+
import { freshnessOf } from './FleetMap.helpers';
|
|
10
|
+
import type { FleetFreshness, FleetMapCopy, FleetUnit } from './FleetMap.types';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* The roster beside the map — and the ACCESSIBLE half of this component.
|
|
14
|
+
*
|
|
15
|
+
* A map is a picture of positions and a screen reader cannot read a picture, so
|
|
16
|
+
* the panel's information is carried by this list. That is not a consolation
|
|
17
|
+
* prize: the list answers the questions a dispatcher actually asks — who is
|
|
18
|
+
* reporting, how recently, and what are they carrying — and it answers them in
|
|
19
|
+
* an order the map cannot express.
|
|
20
|
+
*
|
|
21
|
+
* The map beside it is a NAMED LANDMARK rather than an `aria-hidden` one, so a
|
|
22
|
+
* reader can skip it in one gesture — see `FleetCanvas`, which carries the
|
|
23
|
+
* reason it must not be hidden.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
/** Each freshness draws from the semantic palette, never a hardcoded hex. */
|
|
27
|
+
function freshnessColor(freshness: FleetFreshness, theme: Theme): string {
|
|
28
|
+
if (freshness === 'live') return theme.palette.success.main;
|
|
29
|
+
if (freshness === 'lagging') return theme.palette.warning.main;
|
|
30
|
+
return theme.palette.text.disabled;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* A row's two lines of text — the name, and the one-line summary under it.
|
|
35
|
+
*
|
|
36
|
+
* Split out of `FleetRow` to keep that function under the size gate, and the
|
|
37
|
+
* seam is the natural one: everything here is READ, nothing is interactive.
|
|
38
|
+
*/
|
|
39
|
+
function RowText({
|
|
40
|
+
unit,
|
|
41
|
+
copy,
|
|
42
|
+
freshness,
|
|
43
|
+
testId,
|
|
44
|
+
}: Pick<RowProps, 'unit' | 'copy' | 'freshness' | 'testId'>): React.JSX.Element {
|
|
45
|
+
const theme = useTheme();
|
|
46
|
+
|
|
47
|
+
// Dropped rather than rendered empty: a phone that reports no accuracy radius
|
|
48
|
+
// would otherwise print a trailing separator with nothing after it.
|
|
49
|
+
const meta = [
|
|
50
|
+
copy.freshness[freshness],
|
|
51
|
+
copy.lastSeen(unit.staleSeconds),
|
|
52
|
+
unit.accuracyM == null ? null : copy.accuracy(unit.accuracyM),
|
|
53
|
+
]
|
|
54
|
+
.filter((part): part is string => Boolean(part))
|
|
55
|
+
.join(' · ');
|
|
56
|
+
|
|
57
|
+
return (
|
|
58
|
+
<Stack sx={{ minWidth: 0, flexGrow: 1 }}>
|
|
59
|
+
<Typography
|
|
60
|
+
variant="body2"
|
|
61
|
+
component="p"
|
|
62
|
+
data-testid={`${testId}-label`}
|
|
63
|
+
sx={{ fontWeight: theme.typography.fontWeightMedium, overflowWrap: 'anywhere' }}
|
|
64
|
+
>
|
|
65
|
+
{unit.label}
|
|
66
|
+
</Typography>
|
|
67
|
+
<Typography
|
|
68
|
+
variant="caption"
|
|
69
|
+
component="p"
|
|
70
|
+
data-testid={`${testId}-meta`}
|
|
71
|
+
sx={{ color: theme.palette.text.secondary }}
|
|
72
|
+
>
|
|
73
|
+
{meta}
|
|
74
|
+
</Typography>
|
|
75
|
+
</Stack>
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* Keep the selected row visible INSIDE the roster.
|
|
81
|
+
*
|
|
82
|
+
* The roster caps its own height, so a dispatcher arrowing through a fleet of
|
|
83
|
+
* thirty otherwise walks the selection below the fold with nothing moving —
|
|
84
|
+
* `aria-activedescendant` follows, and a SIGHTED keyboard user sees no feedback
|
|
85
|
+
* at all.
|
|
86
|
+
*
|
|
87
|
+
* Watches the row's POSITION as well as its selectedness, because the roster
|
|
88
|
+
* re-sorts on every poll: a rider who stays selected while their staleness
|
|
89
|
+
* moves them down the list would otherwise slide out of view with the effect
|
|
90
|
+
* never re-running.
|
|
91
|
+
*
|
|
92
|
+
* Arithmetic rather than `scrollIntoView({ block: 'nearest' })` because that
|
|
93
|
+
* walks every scrollable ancestor, the document included, and `nearest` only
|
|
94
|
+
* spares an ancestor the row is already visible in — which is exactly false
|
|
95
|
+
* when the panel is off screen. Re-running on every re-sort, it would yank the
|
|
96
|
+
* whole page back to the map on a timer, and drag it there on mount for any
|
|
97
|
+
* board rendered below the fold with a selection already set.
|
|
98
|
+
*/
|
|
99
|
+
function useKeptInView(
|
|
100
|
+
selected: boolean,
|
|
101
|
+
position: number,
|
|
102
|
+
): React.RefObject<HTMLDivElement | null> {
|
|
103
|
+
const row = React.useRef<HTMLDivElement>(null);
|
|
104
|
+
|
|
105
|
+
React.useEffect(() => {
|
|
106
|
+
const box = row.current;
|
|
107
|
+
const list = box?.parentElement;
|
|
108
|
+
if (!selected || !box || !list) return;
|
|
109
|
+
const top = box.offsetTop - list.offsetTop;
|
|
110
|
+
if (top < list.scrollTop) {
|
|
111
|
+
list.scrollTop = top;
|
|
112
|
+
} else if (top + box.offsetHeight > list.scrollTop + list.clientHeight) {
|
|
113
|
+
list.scrollTop = top + box.offsetHeight - list.clientHeight;
|
|
114
|
+
}
|
|
115
|
+
}, [selected, position]);
|
|
116
|
+
|
|
117
|
+
return row;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* A row's own box, selected or not.
|
|
122
|
+
*
|
|
123
|
+
* Out of line because the hover rule needs the explanation more than the JSX
|
|
124
|
+
* has room for: hover must never WEAKEN the selection. Written flat as
|
|
125
|
+
* `'&:hover': { backgroundColor: action.hover }`, the pseudo-class wins on
|
|
126
|
+
* specificity and repaints the selected row with the hover tint — measured at
|
|
127
|
+
* `rgba(0,0,0,0.08)` idle against `rgba(0,0,0,0.04)` hovered, so pointing at
|
|
128
|
+
* the selected row visually DESELECTED it and made it indistinguishable from
|
|
129
|
+
* any other row under the cursor.
|
|
130
|
+
*/
|
|
131
|
+
function rowSx(theme: Theme, selected: boolean): SxProps<Theme> {
|
|
132
|
+
const resting = selected ? theme.palette.action.selected : 'transparent';
|
|
133
|
+
return {
|
|
134
|
+
display: 'flex',
|
|
135
|
+
alignItems: 'center',
|
|
136
|
+
gap: theme.spacing(1.5),
|
|
137
|
+
padding: theme.spacing(1, 1.5),
|
|
138
|
+
// `1`, not `theme.shape.borderRadius / 4`. MUI's `sx` reads a NUMBER here as
|
|
139
|
+
// a multiple of `theme.shape.borderRadius`, so dividing the theme value out
|
|
140
|
+
// and letting `sx` multiply it back in is quadratic: measured 4px on the
|
|
141
|
+
// default theme — which is why this looked right — and 36px on a host that
|
|
142
|
+
// sets its own radius to 12. In a package whose whole premise is being
|
|
143
|
+
// re-themed, only the multiple is portable.
|
|
144
|
+
borderRadius: 1,
|
|
145
|
+
cursor: 'pointer',
|
|
146
|
+
backgroundColor: resting,
|
|
147
|
+
'&:hover': {
|
|
148
|
+
backgroundColor: selected ? theme.palette.action.selected : theme.palette.action.hover,
|
|
149
|
+
},
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
interface RowProps {
|
|
154
|
+
unit: FleetUnit;
|
|
155
|
+
copy: FleetMapCopy;
|
|
156
|
+
freshness: FleetFreshness;
|
|
157
|
+
selected: boolean;
|
|
158
|
+
onSelect: (id: string) => void;
|
|
159
|
+
/** The row's DOM id, which `aria-activedescendant` points at. */
|
|
160
|
+
optionId: string;
|
|
161
|
+
/** Where the row sits in the re-sorted roster — see the scroll effect. */
|
|
162
|
+
position: number;
|
|
163
|
+
testId: string;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
function FleetRow({
|
|
167
|
+
unit,
|
|
168
|
+
copy,
|
|
169
|
+
freshness,
|
|
170
|
+
selected,
|
|
171
|
+
onSelect,
|
|
172
|
+
optionId,
|
|
173
|
+
position,
|
|
174
|
+
testId,
|
|
175
|
+
}: RowProps): React.JSX.Element {
|
|
176
|
+
const theme = useTheme();
|
|
177
|
+
const color = freshnessColor(freshness, theme);
|
|
178
|
+
const row = useKeptInView(selected, position);
|
|
179
|
+
|
|
180
|
+
return (
|
|
181
|
+
<Box
|
|
182
|
+
ref={row}
|
|
183
|
+
role="option"
|
|
184
|
+
aria-selected={selected}
|
|
185
|
+
id={optionId}
|
|
186
|
+
data-testid={testId}
|
|
187
|
+
data-freshness={freshness}
|
|
188
|
+
onClick={() => onSelect(unit.id)}
|
|
189
|
+
sx={rowSx(theme, selected)}
|
|
190
|
+
>
|
|
191
|
+
{/* The dot repeats what the freshness word beside it already says, so it
|
|
192
|
+
is hidden rather than read twice — and colour is never the only
|
|
193
|
+
carrier of the state. */}
|
|
194
|
+
<Box
|
|
195
|
+
aria-hidden="true"
|
|
196
|
+
data-testid={`${testId}-dot`}
|
|
197
|
+
sx={{
|
|
198
|
+
width: 10,
|
|
199
|
+
height: 10,
|
|
200
|
+
borderRadius: '50%',
|
|
201
|
+
flexShrink: 0,
|
|
202
|
+
backgroundColor: color,
|
|
203
|
+
}}
|
|
204
|
+
/>
|
|
205
|
+
<RowText unit={unit} copy={copy} freshness={freshness} testId={testId} />
|
|
206
|
+
{unit.badge && (
|
|
207
|
+
<Typography
|
|
208
|
+
variant="caption"
|
|
209
|
+
component="span"
|
|
210
|
+
data-testid={`${testId}-badge`}
|
|
211
|
+
sx={{ color: theme.palette.text.secondary, flexShrink: 0 }}
|
|
212
|
+
>
|
|
213
|
+
{unit.badge}
|
|
214
|
+
</Typography>
|
|
215
|
+
)}
|
|
216
|
+
</Box>
|
|
217
|
+
);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* What stands in for the roster before any unit has landed.
|
|
222
|
+
*
|
|
223
|
+
* `aria-hidden`, because three grey bars are not information — the panel's
|
|
224
|
+
* `aria-busy` and its optional announcement carry that. The radius is the same
|
|
225
|
+
* MULTIPLE a real row uses rather than a raw pixel count: `Skeleton` forwards
|
|
226
|
+
* the number into `sx`, where it scales with `theme.shape.borderRadius`, so a
|
|
227
|
+
* literal `4` drew 16px against the rows' 4px on the default theme and 48px
|
|
228
|
+
* against 12px on a re-themed host.
|
|
229
|
+
*/
|
|
230
|
+
function FirstLoad({ testId }: { testId: string }): React.JSX.Element {
|
|
231
|
+
return (
|
|
232
|
+
<Stack spacing={1} data-testid={`${testId}-skeleton`} aria-hidden="true">
|
|
233
|
+
{[0, 1, 2].map((row) => (
|
|
234
|
+
<Skeleton key={row} variant="rectangular" height={44} borderRadius={1} />
|
|
235
|
+
))}
|
|
236
|
+
</Stack>
|
|
237
|
+
);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
export interface FleetRosterProps {
|
|
241
|
+
units: readonly FleetUnit[];
|
|
242
|
+
copy: FleetMapCopy;
|
|
243
|
+
selectedId: string | null | undefined;
|
|
244
|
+
onSelect: (id: string) => void;
|
|
245
|
+
laggingAfterSeconds: number;
|
|
246
|
+
staleAfterSeconds: number;
|
|
247
|
+
loading: boolean;
|
|
248
|
+
testId: string;
|
|
249
|
+
onKeyDown: (event: React.KeyboardEvent<HTMLDivElement>) => void;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
export function FleetRoster({
|
|
253
|
+
units,
|
|
254
|
+
copy,
|
|
255
|
+
selectedId,
|
|
256
|
+
onSelect,
|
|
257
|
+
laggingAfterSeconds,
|
|
258
|
+
staleAfterSeconds,
|
|
259
|
+
loading,
|
|
260
|
+
testId,
|
|
261
|
+
onKeyDown,
|
|
262
|
+
}: FleetRosterProps): React.JSX.Element {
|
|
263
|
+
const theme = useTheme();
|
|
264
|
+
// Generated, not derived from `dataTestId`: two boards on one page filtered
|
|
265
|
+
// from the same fleet would otherwise emit duplicate DOM ids and an ambiguous
|
|
266
|
+
// `aria-activedescendant`. Same reason the heading uses one.
|
|
267
|
+
const rowIdPrefix = React.useId();
|
|
268
|
+
const optionId = (id: string): string => `${rowIdPrefix}-${id}`;
|
|
269
|
+
|
|
270
|
+
// The selection is CONTROLLED, so it can name a unit that has since dropped
|
|
271
|
+
// out of the freshness window — a courier ending their shift mid-poll. The
|
|
272
|
+
// attribute must then be absent rather than pointing at an element that no
|
|
273
|
+
// longer renders, which announces nothing and fails an axe audit. `mapCentre`
|
|
274
|
+
// and `nextSelection` both handle the same case; this is the third place.
|
|
275
|
+
const active = units.some((unit) => unit.id === selectedId) ? selectedId : null;
|
|
276
|
+
|
|
277
|
+
// Only when there is nothing to show yet. Unmounting a populated listbox on
|
|
278
|
+
// every poll destroys the focus inside it, so a dispatcher arrowing through
|
|
279
|
+
// the roster is thrown back to the top of the page each time the data
|
|
280
|
+
// refreshes — and the rows they were reading vanish and return.
|
|
281
|
+
if (loading && units.length === 0) return <FirstLoad testId={testId} />;
|
|
282
|
+
|
|
283
|
+
return (
|
|
284
|
+
<Box
|
|
285
|
+
role="listbox"
|
|
286
|
+
// A single tab stop with arrow keys inside, which is the listbox pattern:
|
|
287
|
+
// a dispatcher tabbing past a fleet of thirty should not have to press it
|
|
288
|
+
// thirty times to reach the map.
|
|
289
|
+
tabIndex={0}
|
|
290
|
+
aria-label={copy.rosterLabel}
|
|
291
|
+
aria-activedescendant={active ? optionId(active) : undefined}
|
|
292
|
+
data-testid={`${testId}-roster`}
|
|
293
|
+
onKeyDown={onKeyDown}
|
|
294
|
+
sx={{
|
|
295
|
+
display: 'flex',
|
|
296
|
+
flexDirection: 'column',
|
|
297
|
+
gap: theme.spacing(0.5),
|
|
298
|
+
overflowY: 'auto',
|
|
299
|
+
minWidth: 0,
|
|
300
|
+
'&:focus-visible': {
|
|
301
|
+
outline: `2px solid ${theme.palette.primary.main}`,
|
|
302
|
+
outlineOffset: 2,
|
|
303
|
+
},
|
|
304
|
+
}}
|
|
305
|
+
>
|
|
306
|
+
{units.map((unit, index) => (
|
|
307
|
+
<FleetRow
|
|
308
|
+
key={unit.id}
|
|
309
|
+
unit={unit}
|
|
310
|
+
copy={copy}
|
|
311
|
+
freshness={freshnessOf(unit.staleSeconds, laggingAfterSeconds, staleAfterSeconds)}
|
|
312
|
+
selected={unit.id === active}
|
|
313
|
+
onSelect={onSelect}
|
|
314
|
+
optionId={optionId(unit.id)}
|
|
315
|
+
position={index}
|
|
316
|
+
testId={`${testId}-${unit.id}`}
|
|
317
|
+
/>
|
|
318
|
+
))}
|
|
319
|
+
</Box>
|
|
320
|
+
);
|
|
321
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { FleetMap } from './FleetMap';
|
|
2
|
+
export { freshnessOf, mapCentre, nextSelection, rosterOrder } from './FleetMap.helpers';
|
|
3
|
+
export type { LatLng } from './FleetMap.helpers';
|
|
4
|
+
export type {
|
|
5
|
+
FleetFreshness,
|
|
6
|
+
FleetMapCopy,
|
|
7
|
+
FleetMapProps,
|
|
8
|
+
FleetUnit,
|
|
9
|
+
} from './FleetMap.types';
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# FleetMap Test Status Tracking
|
|
2
|
+
|
|
3
|
+
## Test Files Status
|
|
4
|
+
|
|
5
|
+
- [x] `FleetMap.test.stories.tsx` created
|
|
6
|
+
- [x] `__tests__/fleet-map-helpers.test.ts` created — the four pure decisions,
|
|
7
|
+
at their boundaries, where a story is expensive to stage and an
|
|
8
|
+
off-by-one reads identically on screen
|
|
9
|
+
- [x] `__tests__/fleet-map-hook.test.ts` created — the two decisions the DOM
|
|
10
|
+
cannot show: `centre`'s IDENTITY across a poll, and who owns the
|
|
11
|
+
selection across a re-render
|
|
12
|
+
- [x] `__tests__/fleet-map-guards.test.tsx` created — the behaviours the review
|
|
13
|
+
rounds added guards for, in the suite CI actually runs (`test-storybook`
|
|
14
|
+
is deliberately not wired into this repo's CI)
|
|
15
|
+
- [x] `__tests__/fleet-map-theme.test.tsx` created — the row and its first-load
|
|
16
|
+
skeleton under two host themes, because a radius that looks right on the
|
|
17
|
+
default one is not evidence in a package built to be re-themed
|
|
18
|
+
- [x] All applicable test categories implemented
|
|
19
|
+
|
|
20
|
+
## Storybook Tests Status
|
|
21
|
+
|
|
22
|
+
### Test Results
|
|
23
|
+
|
|
24
|
+
| Test Name | Status | Pass/Fail | Notes |
|
|
25
|
+
| --- | --- | --- | --- |
|
|
26
|
+
| Basic Interaction | Running | PASS | rows render, roster ordered freshest first |
|
|
27
|
+
| Freshness | Running | PASS | three states, words not colour, caller formats |
|
|
28
|
+
| Thresholds are props | Running | PASS | same fleet reads differently on tighter bounds |
|
|
29
|
+
| Selection | Running | PASS | click reports, `aria-selected` on one row only |
|
|
30
|
+
| Keyboard Navigation | Running | PASS | one tab stop, arrows move and wrap |
|
|
31
|
+
| Screen Reader | Running | PASS | region, named listbox, map named not hidden |
|
|
32
|
+
| Empty State | Running | PASS | empty state renders, no map canvas |
|
|
33
|
+
| Loading State | Running | PASS | busy, skeletons, NOT the empty state, and silent |
|
|
34
|
+
| Edge Cases | Running | PASS | one unit, long name, no badge, zero seconds |
|
|
35
|
+
| Active Descendant | Running | PASS | points at a row that exists, id is generated |
|
|
36
|
+
| Stale Selection | Running | PASS | a selection that left the fleet dangles nothing |
|
|
37
|
+
| Loading Announcement | Running | PASS | `role="status"` carries `copy.loading` |
|
|
38
|
+
| Loading Keeps Roster | Running | PASS | a poll over a populated roster keeps the listbox |
|
|
39
|
+
| Uncontrolled Selection | Running | PASS | works with neither selection prop passed |
|
|
40
|
+
| Controlled Without Handler | Running | PASS | arrows left un-prevented for the page |
|
|
41
|
+
| Idle Announcement Region | Running | PASS | the live region exists, and is empty, while idle |
|
|
42
|
+
|
|
43
|
+
Legend: Pending | Running | PASS | FAIL
|
|
44
|
+
|
|
45
|
+
Not implemented, and why: **Form Interaction** — the component has no form.
|
|
46
|
+
**Focus Management** — covered inside Keyboard Navigation, since the listbox's
|
|
47
|
+
single tab stop IS its focus contract. **Performance** — the roster is a short
|
|
48
|
+
list by construction (a fleet is people, not rows), so a render benchmark would
|
|
49
|
+
measure the fixture rather than the component.
|
|
50
|
+
|
|
51
|
+
## Static Stories Status
|
|
52
|
+
|
|
53
|
+
- [x] Default story
|
|
54
|
+
- [x] Empty state
|
|
55
|
+
- [x] Loading state
|
|
56
|
+
- [x] One unit
|
|
57
|
+
- [x] All stale
|
|
58
|
+
- [x] Tight thresholds
|
|
59
|
+
- [x] Long names / no accuracy
|
|
60
|
+
- [x] Selectable (controlled)
|
|
61
|
+
- [x] Compact height
|
|
62
|
+
|
|
63
|
+
## Lint Status
|
|
64
|
+
|
|
65
|
+
- [x] No lint errors
|
|
66
|
+
- [x] No warnings
|
|
67
|
+
- [x] Clean under `eslint.flakiness.config.mjs`
|
|
68
|
+
|
|
69
|
+
## TypeCheck Status
|
|
70
|
+
|
|
71
|
+
- [x] No type errors
|
|
72
|
+
- [x] All props properly typed, no `any`
|
|
73
|
+
|
|
74
|
+
## Overall Component Status
|
|
75
|
+
|
|
76
|
+
- [x] Lint clean
|
|
77
|
+
- [x] TypeCheck clean
|
|
78
|
+
- [x] Stories working
|
|
79
|
+
- [x] Unit tests passing (35: 16 helpers + 8 hook + 9 guards + 2 theme)
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# FleetMap
|
|
2
|
+
|
|
3
|
+
Where a set of tracked units is right now: a map beside the roster that reads
|
|
4
|
+
it. Product-free — it draws labelled dots with a freshness, and every word plus
|
|
5
|
+
the two formatters arrive through `copy`. Built for a delivery fleet and
|
|
6
|
+
deliberately not named after one.
|
|
7
|
+
|
|
8
|
+
## Props
|
|
9
|
+
|
|
10
|
+
| prop | effect |
|
|
11
|
+
| --- | --- |
|
|
12
|
+
| `units` | who is reporting; empty renders the empty state rather than an empty map |
|
|
13
|
+
| `copy` | every word, and the `lastSeen` / `accuracy` formatters |
|
|
14
|
+
| `selectedId` | controlled selection; the map centres on it |
|
|
15
|
+
| `onSelect` | fired by a row click, each arrow-key move, and a pin click (mouse only — the pin is not focusable) |
|
|
16
|
+
| `laggingAfterSeconds` | when a unit stops reading as `live` |
|
|
17
|
+
| `staleAfterSeconds` | when it stops reading as `lagging` |
|
|
18
|
+
| `height` | the map's height |
|
|
19
|
+
| `loading` | first-load skeletons, map and roster `aria-busy` |
|
|
20
|
+
| `className` | on the panel root |
|
|
21
|
+
| `dataTestId` | root TEST id; DOM ids are generated separately |
|
|
22
|
+
|
|
23
|
+
## Lint
|
|
24
|
+
|
|
25
|
+
Clean, including the flakiness config.
|
|
26
|
+
|
|
27
|
+
## Type Errors
|
|
28
|
+
|
|
29
|
+
None.
|
|
30
|
+
|
|
31
|
+
## Testing Scenarios
|
|
32
|
+
|
|
33
|
+
Freshness at both thresholds and at their collapse; the centroid fallback and
|
|
34
|
+
the Atlantic-null for an empty fleet; roster order and its tie-break; selection
|
|
35
|
+
wrapping at both ends and a selection that has left the fleet; the empty state
|
|
36
|
+
against the loading state, which are opposite messages.
|
|
37
|
+
|
|
38
|
+
## Storybook Tests List
|
|
39
|
+
|
|
40
|
+
`BasicInteraction`, `FreshnessTest`, `ThresholdsAreProps`, `SelectionTest`,
|
|
41
|
+
`KeyboardNavigationTest`, `ControlledWithoutHandlerTest`, `ScreenReaderTest`,
|
|
42
|
+
`ActiveDescendantTest`, `StaleSelectionTest`, `EmptyStateTest`,
|
|
43
|
+
`LoadingStateTest`, `IdleAnnouncementRegionTest`, `LoadingAnnouncementTest`,
|
|
44
|
+
`LoadingKeepsThePopulatedRosterTest`, `UncontrolledSelectionTest`,
|
|
45
|
+
`EdgeCaseTest`.
|
|
46
|
+
|
|
47
|
+
## Current
|
|
48
|
+
|
|
49
|
+
Shipped. Its first consumer is an adopter's courier-tracking panel, which
|
|
50
|
+
composes it with its own transport and its own words.
|
|
@@ -61,13 +61,19 @@ escape hatch for the same button in a context where the action is harmless.
|
|
|
61
61
|
Refs are not forwarded (the HOC renders trigger + popup as a fragment, so there
|
|
62
62
|
is no single node to hand back). Use `<ConfirmAction>` where a ref is needed.
|
|
63
63
|
|
|
64
|
-
### `
|
|
64
|
+
### `createConfirmButton` — the HOC, pre-applied
|
|
65
65
|
|
|
66
|
-
`withConfirmation(Button)
|
|
67
|
-
|
|
66
|
+
`withConfirmation(Button)`, wrapped up for you. Use it when you just want a
|
|
67
|
+
guarded button and have no reason to build your own wrapper.
|
|
68
|
+
|
|
69
|
+
A FACTORY rather than a ready-made component, because the wording it bakes in is
|
|
70
|
+
the caller's: it takes the host's `ConfirmActionCopy` and its error sentence, and
|
|
71
|
+
returns the button. Build it once at module scope and use it like any other.
|
|
68
72
|
|
|
69
73
|
```tsx
|
|
70
|
-
import {
|
|
74
|
+
import { createConfirmButton } from '@12-apps/ui/feedback/ConfirmAction';
|
|
75
|
+
|
|
76
|
+
const ConfirmButton = createConfirmButton(PT_BR_CONFIRM_ACTION_COPY, 'Algo deu errado.');
|
|
71
77
|
|
|
72
78
|
<ConfirmButton
|
|
73
79
|
color="danger"
|