@12-apps/ui 6.22.0 → 6.24.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 +2 -1
- package/components-catalog.md +7 -0
- package/dist/_internal/components/data-display/AsyncStateContainer/AsyncStateContainer.js +3 -3
- package/dist/_internal/components/data-display/Avatar/Avatar.js +4 -4
- package/dist/_internal/components/data-display/Avatar/Avatar.view.js +2 -2
- package/dist/_internal/components/data-display/Badge/Badge.js +2 -2
- package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js +1 -1
- package/dist/_internal/components/data-display/CardKit/use-row-confirm.js +1 -1
- package/dist/_internal/components/data-display/Carousel/Carousel.js +2 -2
- package/dist/_internal/components/data-display/Chart/Chart.js +4 -4
- package/dist/_internal/components/data-display/Chart/SpecChart.js +7 -7
- package/dist/_internal/components/data-display/Chart/chart-context.js +2 -2
- package/dist/_internal/components/data-display/Chart/chart-renderers.js +3 -3
- package/dist/_internal/components/data-display/Chart/chart-spec.js +2 -2
- package/dist/_internal/components/data-display/DataGrid/DataGrid.js +2 -2
- package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +41 -41
- package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +47 -47
- package/dist/_internal/components/data-display/DataViews/ManageViewsDialog.js +1 -1
- 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 +6 -6
- package/dist/_internal/components/data-display/DataViews/data-views-category-pill.js +5 -5
- package/dist/_internal/components/data-display/DataViews/data-views-display-panel.js +3 -3
- package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +10 -10
- package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +6 -6
- package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +36 -36
- package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +11 -11
- package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +3 -3
- package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +4 -4
- 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-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 +1 -1
- 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 +4 -4
- package/dist/_internal/components/data-display/FleetMap/FleetBody.js +32 -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.base.js +1 -0
- package/dist/_internal/components/data-display/FleetMap/FleetMap.base.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 +47 -0
- package/dist/_internal/components/data-display/FleetMap/FleetMap.js.map +1 -0
- package/dist/_internal/components/data-display/FleetMap/FleetMap.metrics.js +20 -0
- package/dist/_internal/components/data-display/FleetMap/FleetMap.metrics.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 +15 -0
- package/dist/_internal/components/data-display/FleetMap/FleetRoster.js.map +1 -0
- package/dist/_internal/components/data-display/HoverCard/HoverCard.js +2 -2
- package/dist/_internal/components/data-display/Lightbox/Lightbox.js +2 -2
- package/dist/_internal/components/data-display/MapPreview/MapLayers.js +2 -2
- package/dist/_internal/components/data-display/MapPreview/MapPreview.js +6 -6
- package/dist/_internal/components/data-display/Sheet/Sheet.hooks.js +2 -2
- package/dist/_internal/components/data-display/Sheet/Sheet.js +3 -3
- package/dist/_internal/components/data-display/Table/Table.js +3 -3
- package/dist/_internal/components/data-display/index.js +90 -69
- package/dist/_internal/components/feedback/Modal/Modal.js +2 -2
- package/dist/_internal/components/feedback/StackedModal/StackedModal.js +2 -2
- package/dist/_internal/components/feedback/index.js +14 -14
- package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.hooks.js +3 -3
- package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.js +5 -5
- package/dist/_internal/components/form/AddressAutocomplete/AddressAutocompleteField.js +2 -2
- package/dist/_internal/components/form/CategorySelect/CategoryPanel.js +2 -2
- package/dist/_internal/components/form/CategorySelect/CategorySelect.js +4 -4
- package/dist/_internal/components/form/Command/Command.js +2 -2
- package/dist/_internal/components/form/DateRangePicker/DateRangePicker.js +3 -3
- 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/index.js +30 -30
- package/dist/_internal/components/form/total-form/Fields/CategoryField.js +5 -5
- package/dist/_internal/components/form/total-form/Fields/index.js +9 -9
- package/dist/_internal/components/index.js +160 -140
- package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.js +2 -2
- package/dist/_internal/components/layout/index.js +20 -20
- package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js +4 -4
- package/dist/_internal/components/navigation/Pagination/Pagination.js +2 -2
- package/dist/_internal/components/navigation/index.js +12 -12
- package/dist/_internal/components/utility/index.js +4 -4
- package/dist/_internal/platform/aria.js.map +1 -1
- package/dist/_internal/pt-BR.data-display.js +2 -2
- package/dist/_internal/user-avatar/user-avatar.js +5 -5
- package/dist/charts.js +10 -10
- package/dist/{chunk-WGRS4PGY.js → chunk-2C47DEVU.js} +4 -4
- package/dist/chunk-2RQINU5T.js +41 -0
- package/dist/chunk-2RQINU5T.js.map +1 -0
- package/dist/{chunk-WMALDOF5.js → chunk-4G3FGCWX.js} +4 -4
- package/dist/{chunk-ZOUWHGV3.js → chunk-4MGFUPQT.js} +4 -4
- package/dist/{chunk-QFJRB27Q.js → chunk-6LGWJFQK.js} +2 -2
- package/dist/{chunk-XSF6AXEU.js → chunk-6RZDDUSM.js} +2 -2
- package/dist/{chunk-VIK3HAUQ.js → chunk-73NJCGQG.js} +2 -2
- package/dist/{chunk-UU3QAKG6.js → chunk-B7DKSBAE.js} +14 -14
- package/dist/{chunk-3FLVIVOK.js → chunk-BHIGHSXA.js} +2 -2
- package/dist/{chunk-HKV4MQ2W.js → chunk-BLBOYCOV.js} +5 -5
- package/dist/chunk-BTQZ3EX3.js +45 -0
- package/dist/chunk-BTQZ3EX3.js.map +1 -0
- package/dist/{chunk-PFV6RL4Q.js → chunk-C6KTQF4F.js} +3 -3
- package/dist/chunk-CDCTLPMD.js +1 -0
- package/dist/chunk-CDCTLPMD.js.map +1 -0
- package/dist/{chunk-LYSSO6WC.js → chunk-CZPU5TW3.js} +4 -4
- package/dist/{chunk-PMS3H3OO.js → chunk-DF2FFYZ7.js} +4 -4
- package/dist/{chunk-QZBUGUOY.js → chunk-DFLTUI7W.js} +4 -4
- package/dist/{chunk-WLQTHPMX.js → chunk-EJQW2IYW.js} +2 -2
- package/dist/{chunk-VQAM2XZV.js → chunk-EMUBMZMA.js} +2 -2
- package/dist/{chunk-XFUNJYFT.js → chunk-EPNUVSNK.js} +7 -7
- package/dist/{chunk-MSUSZLRE.js → chunk-EWT3WMVY.js} +5 -5
- package/dist/{chunk-Q75SJ35X.js → chunk-GMTM6EN7.js} +3 -3
- package/dist/{chunk-R6SBP5M5.js → chunk-GOWBYHYW.js} +4 -4
- package/dist/{chunk-6NZTYZP5.js → chunk-GVA5CYKP.js} +2 -2
- package/dist/chunk-HMV4QMXS.js +219 -0
- package/dist/chunk-HMV4QMXS.js.map +1 -0
- package/dist/{chunk-VR5HDUBK.js → chunk-HP2ODXNA.js} +2 -2
- package/dist/{chunk-2MMEIN4T.js → chunk-I3E2QHTH.js} +4 -4
- package/dist/{chunk-UVGRRI7N.js → chunk-IPVYEPXO.js} +4 -4
- package/dist/{chunk-5ZTUP65G.js → chunk-JM64OEU6.js} +5 -5
- package/dist/{chunk-7BYFC2MR.js → chunk-JUHUKZGU.js} +7 -7
- package/dist/chunk-JZXWCEH5.js +116 -0
- package/dist/chunk-JZXWCEH5.js.map +1 -0
- package/dist/{chunk-DVUPIVI2.js → chunk-KT6HWAEN.js} +4 -4
- package/dist/{chunk-TLMLEC4F.js → chunk-KW7H5O3K.js} +6 -6
- package/dist/{chunk-VLHGBFR6.js → chunk-MZQTHSLN.js} +3 -3
- package/dist/{chunk-4SQFO4GW.js → chunk-NA7MIEG6.js} +7 -7
- package/dist/{chunk-QWDEOITU.js → chunk-O4VCZTK4.js} +2 -2
- package/dist/{chunk-LS4FMSHY.js → chunk-OAYX4XN7.js} +4 -4
- package/dist/{chunk-Y5UCOBQN.js → chunk-OGGHD64H.js} +4 -4
- package/dist/{chunk-7TZ6OC5T.js → chunk-OH3YGJT5.js} +2 -2
- package/dist/{chunk-REMK55JI.js → chunk-OLZTGVBT.js} +4 -4
- package/dist/{chunk-VNNG46TS.js → chunk-ORSLFKKZ.js} +6 -6
- package/dist/{chunk-ZIYMBR7K.js → chunk-OTH7H3IP.js} +2 -2
- package/dist/{chunk-5NKUYCZD.js → chunk-PN5CQKA2.js} +4 -4
- package/dist/{chunk-J4W4TQPC.js → chunk-QJRDDVZ2.js} +5 -5
- package/dist/{chunk-VNDOQEJ7.js → chunk-QRX5BYUQ.js} +4 -4
- package/dist/{chunk-XT7HMNBW.js → chunk-R6SNYC3D.js} +5 -5
- package/dist/{chunk-W2UTDN4T.js → chunk-RBGOGTT2.js} +4 -4
- package/dist/chunk-RP5FK3SO.js +79 -0
- package/dist/chunk-RP5FK3SO.js.map +1 -0
- package/dist/{chunk-X5MPHXG5.js → chunk-RPWEXIAW.js} +6 -6
- package/dist/chunk-RQWZYD6H.js +1 -0
- package/dist/chunk-RQWZYD6H.js.map +1 -0
- package/dist/{chunk-EXJBPKGW.js → chunk-SHDIZSN5.js} +5 -5
- package/dist/{chunk-23FCBIUN.js → chunk-TNVO2DTB.js} +8 -8
- package/dist/{chunk-AGSBIUPV.js → chunk-TPLKJHNN.js} +4 -4
- package/dist/{chunk-YQ6TNHAC.js → chunk-TTLI6PF7.js} +5 -5
- package/dist/{chunk-U2AC4AQX.js → chunk-TU5EIKJA.js} +4 -4
- package/dist/{chunk-KTK4A3IF.js → chunk-TX5V42AY.js} +11 -11
- package/dist/{chunk-BGYLL467.js → chunk-TXHJX2NG.js} +4 -4
- package/dist/{chunk-FL54G7PV.js → chunk-WIT3Y7JT.js} +2 -2
- package/dist/{chunk-W7Y6RA6W.js → chunk-WR5JFDQ5.js} +4 -4
- package/dist/chunk-XPMGFAJ3.js +36 -0
- package/dist/chunk-XPMGFAJ3.js.map +1 -0
- package/dist/{chunk-2UYR2OOE.js → chunk-YRUCIKPO.js} +4 -4
- package/dist/{chunk-AEGXHZQT.js → chunk-YW5T6KZ5.js} +7 -7
- package/dist/{chunk-QKIJ6YXZ.js → chunk-ZA4U5GDU.js} +4 -4
- package/dist/chunk-ZCPSND5Y.js +64 -0
- package/dist/chunk-ZCPSND5Y.js.map +1 -0
- package/dist/{chunk-ZKR5B6YJ.js → chunk-ZRPGVHTR.js} +2 -2
- package/dist/{chunk-OXQP3N6X.js → chunk-ZTZ6S5Q6.js} +4 -4
- package/dist/data-display/AsyncStateContainer.js +3 -3
- package/dist/data-display/Avatar.js +4 -4
- package/dist/data-display/Badge.js +2 -2
- package/dist/data-display/CardKit.js +11 -11
- package/dist/data-display/Carousel.js +2 -2
- package/dist/data-display/Chart.js +10 -10
- package/dist/data-display/DataGrid.js +2 -2
- package/dist/data-display/DataViews.js +68 -68
- package/dist/data-display/FleetMap.js +55 -0
- package/dist/data-display/FleetMap.js.map +1 -0
- package/dist/data-display/HoverCard.js +2 -2
- package/dist/data-display/Lightbox.js +2 -2
- package/dist/data-display/MapPreview.js +6 -6
- package/dist/data-display/Sheet.js +3 -3
- package/dist/data-display/Table.js +3 -3
- package/dist/feedback/ConfirmAction.js +3 -3
- package/dist/feedback/Modal.js +2 -2
- package/dist/feedback/StackedModal.js +2 -2
- package/dist/form/AddressAutocomplete.js +5 -5
- package/dist/form/CategorySelect.js +4 -4
- package/dist/form/Command.js +2 -2
- package/dist/form/DateRangePicker.js +5 -5
- package/dist/form/PhoneInput.js +3 -3
- package/dist/form/total-form.js +9 -9
- package/dist/layout/SettingsLayout.js +2 -2
- package/dist/locales.js +4 -4
- package/dist/native/chunks/{chunk-T6BJPP3E.js → chunk-DN73KYIZ.js} +1 -1
- package/dist/native/chunks/chunk-DN73KYIZ.js.map +1 -0
- package/dist/native/chunks/chunk-GW7TQ7HO.js +215 -0
- package/dist/native/chunks/chunk-GW7TQ7HO.js.map +1 -0
- package/dist/native/chunks/chunk-MJVSQXOD.js +9 -0
- package/dist/native/chunks/chunk-MJVSQXOD.js.map +1 -0
- package/dist/native/chunks/chunk-ZAQ3AZJM.js +292 -0
- package/dist/native/chunks/chunk-ZAQ3AZJM.js.map +1 -0
- package/dist/native/data-display/Alert.js +4 -4
- package/dist/native/data-display/Avatar.js +3 -3
- package/dist/native/data-display/Badge.js +4 -4
- package/dist/native/data-display/Chip.js +3 -5
- package/dist/native/data-display/Chip.js.map +1 -1
- package/dist/native/data-display/EmptyState.js +9 -286
- package/dist/native/data-display/EmptyState.js.map +1 -1
- package/dist/native/data-display/ErrorState.js +6 -6
- package/dist/native/data-display/FleetMap.js +498 -0
- package/dist/native/data-display/FleetMap.js.map +1 -0
- package/dist/native/data-display/LoadingState.js +3 -3
- package/dist/native/feedback/Dialog.js +3 -3
- package/dist/native/form/Checkbox.js +1 -1
- package/dist/native/form/Input.js +1 -1
- package/dist/native/form/Select.js +1 -1
- package/dist/native/form/Switch.js +1 -1
- package/dist/native/layout/Card.js +3 -3
- package/dist/native/layout/Skeleton.js +6 -209
- package/dist/native/layout/Skeleton.js.map +1 -1
- package/dist/navigation/AppHeader.js +6 -6
- package/dist/navigation/Pagination.js +2 -2
- package/dist/pt-BR.js +4 -4
- 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.base.d.ts +141 -0
- package/dist/types/components/data-display/FleetMap/FleetMap.base.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 +71 -0
- package/dist/types/components/data-display/FleetMap/FleetMap.hooks.d.ts.map +1 -0
- package/dist/types/components/data-display/FleetMap/FleetMap.metrics.d.ts +76 -0
- package/dist/types/components/data-display/FleetMap/FleetMap.metrics.d.ts.map +1 -0
- package/dist/types/components/data-display/FleetMap/FleetMap.types.d.ts +45 -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/platform/aria.d.ts +13 -0
- package/dist/types/platform/aria.d.ts.map +1 -1
- package/dist/types-native/components/data-display/FleetMap/FleetMap.base.d.ts +141 -0
- package/dist/types-native/components/data-display/FleetMap/FleetMap.base.d.ts.map +1 -0
- package/dist/types-native/components/data-display/FleetMap/FleetMap.helpers.d.ts +45 -0
- package/dist/types-native/components/data-display/FleetMap/FleetMap.helpers.d.ts.map +1 -0
- package/dist/types-native/components/data-display/FleetMap/FleetMap.hooks.d.ts +71 -0
- package/dist/types-native/components/data-display/FleetMap/FleetMap.hooks.d.ts.map +1 -0
- package/dist/types-native/components/data-display/FleetMap/FleetMap.metrics.d.ts +76 -0
- package/dist/types-native/components/data-display/FleetMap/FleetMap.metrics.d.ts.map +1 -0
- package/dist/types-native/components/data-display/FleetMap/FleetMap.native.d.ts +30 -0
- package/dist/types-native/components/data-display/FleetMap/FleetMap.native.d.ts.map +1 -0
- package/dist/types-native/components/data-display/FleetMap/FleetMap.types.native.d.ts +36 -0
- package/dist/types-native/components/data-display/FleetMap/FleetMap.types.native.d.ts.map +1 -0
- package/dist/types-native/components/data-display/FleetMap/FleetRoster.native.d.ts +17 -0
- package/dist/types-native/components/data-display/FleetMap/FleetRoster.native.d.ts.map +1 -0
- package/dist/types-native/components/data-display/FleetMap/index.native.d.ts +4 -0
- package/dist/types-native/components/data-display/FleetMap/index.native.d.ts.map +1 -0
- package/dist/types-native/platform/aria.d.ts +13 -0
- package/dist/types-native/platform/aria.d.ts.map +1 -1
- package/dist/user-avatar.js +5 -5
- package/package.json +9 -1
- 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.base.ts +144 -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 +183 -0
- package/src/components/data-display/FleetMap/FleetMap.md +189 -0
- package/src/components/data-display/FleetMap/FleetMap.metrics.ts +81 -0
- package/src/components/data-display/FleetMap/FleetMap.native.tsx +185 -0
- package/src/components/data-display/FleetMap/FleetMap.tsx +163 -0
- package/src/components/data-display/FleetMap/FleetMap.types.native.ts +44 -0
- package/src/components/data-display/FleetMap/FleetMap.types.ts +53 -0
- package/src/components/data-display/FleetMap/FleetRoster.native.tsx +382 -0
- package/src/components/data-display/FleetMap/FleetRoster.tsx +327 -0
- package/src/components/data-display/FleetMap/NATIVE-NOTES.md +14 -0
- package/src/components/data-display/FleetMap/index.native.ts +10 -0
- package/src/components/data-display/FleetMap/index.ts +9 -0
- package/src/components/data-display/FleetMap/tests.md +84 -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/platform/aria.ts +13 -0
- package/dist/chunk-X3HL5C6H.js +0 -1
- package/dist/native/chunks/chunk-T6BJPP3E.js.map +0 -1
- /package/dist/{chunk-X3HL5C6H.js.map → _internal/components/data-display/FleetMap/FleetBody.js.map} +0 -0
- /package/dist/{chunk-WGRS4PGY.js.map → chunk-2C47DEVU.js.map} +0 -0
- /package/dist/{chunk-WMALDOF5.js.map → chunk-4G3FGCWX.js.map} +0 -0
- /package/dist/{chunk-ZOUWHGV3.js.map → chunk-4MGFUPQT.js.map} +0 -0
- /package/dist/{chunk-QFJRB27Q.js.map → chunk-6LGWJFQK.js.map} +0 -0
- /package/dist/{chunk-XSF6AXEU.js.map → chunk-6RZDDUSM.js.map} +0 -0
- /package/dist/{chunk-VIK3HAUQ.js.map → chunk-73NJCGQG.js.map} +0 -0
- /package/dist/{chunk-UU3QAKG6.js.map → chunk-B7DKSBAE.js.map} +0 -0
- /package/dist/{chunk-3FLVIVOK.js.map → chunk-BHIGHSXA.js.map} +0 -0
- /package/dist/{chunk-HKV4MQ2W.js.map → chunk-BLBOYCOV.js.map} +0 -0
- /package/dist/{chunk-PFV6RL4Q.js.map → chunk-C6KTQF4F.js.map} +0 -0
- /package/dist/{chunk-LYSSO6WC.js.map → chunk-CZPU5TW3.js.map} +0 -0
- /package/dist/{chunk-PMS3H3OO.js.map → chunk-DF2FFYZ7.js.map} +0 -0
- /package/dist/{chunk-QZBUGUOY.js.map → chunk-DFLTUI7W.js.map} +0 -0
- /package/dist/{chunk-WLQTHPMX.js.map → chunk-EJQW2IYW.js.map} +0 -0
- /package/dist/{chunk-VQAM2XZV.js.map → chunk-EMUBMZMA.js.map} +0 -0
- /package/dist/{chunk-XFUNJYFT.js.map → chunk-EPNUVSNK.js.map} +0 -0
- /package/dist/{chunk-MSUSZLRE.js.map → chunk-EWT3WMVY.js.map} +0 -0
- /package/dist/{chunk-Q75SJ35X.js.map → chunk-GMTM6EN7.js.map} +0 -0
- /package/dist/{chunk-R6SBP5M5.js.map → chunk-GOWBYHYW.js.map} +0 -0
- /package/dist/{chunk-6NZTYZP5.js.map → chunk-GVA5CYKP.js.map} +0 -0
- /package/dist/{chunk-VR5HDUBK.js.map → chunk-HP2ODXNA.js.map} +0 -0
- /package/dist/{chunk-2MMEIN4T.js.map → chunk-I3E2QHTH.js.map} +0 -0
- /package/dist/{chunk-UVGRRI7N.js.map → chunk-IPVYEPXO.js.map} +0 -0
- /package/dist/{chunk-5ZTUP65G.js.map → chunk-JM64OEU6.js.map} +0 -0
- /package/dist/{chunk-7BYFC2MR.js.map → chunk-JUHUKZGU.js.map} +0 -0
- /package/dist/{chunk-DVUPIVI2.js.map → chunk-KT6HWAEN.js.map} +0 -0
- /package/dist/{chunk-TLMLEC4F.js.map → chunk-KW7H5O3K.js.map} +0 -0
- /package/dist/{chunk-VLHGBFR6.js.map → chunk-MZQTHSLN.js.map} +0 -0
- /package/dist/{chunk-4SQFO4GW.js.map → chunk-NA7MIEG6.js.map} +0 -0
- /package/dist/{chunk-QWDEOITU.js.map → chunk-O4VCZTK4.js.map} +0 -0
- /package/dist/{chunk-LS4FMSHY.js.map → chunk-OAYX4XN7.js.map} +0 -0
- /package/dist/{chunk-Y5UCOBQN.js.map → chunk-OGGHD64H.js.map} +0 -0
- /package/dist/{chunk-7TZ6OC5T.js.map → chunk-OH3YGJT5.js.map} +0 -0
- /package/dist/{chunk-REMK55JI.js.map → chunk-OLZTGVBT.js.map} +0 -0
- /package/dist/{chunk-VNNG46TS.js.map → chunk-ORSLFKKZ.js.map} +0 -0
- /package/dist/{chunk-ZIYMBR7K.js.map → chunk-OTH7H3IP.js.map} +0 -0
- /package/dist/{chunk-5NKUYCZD.js.map → chunk-PN5CQKA2.js.map} +0 -0
- /package/dist/{chunk-J4W4TQPC.js.map → chunk-QJRDDVZ2.js.map} +0 -0
- /package/dist/{chunk-VNDOQEJ7.js.map → chunk-QRX5BYUQ.js.map} +0 -0
- /package/dist/{chunk-XT7HMNBW.js.map → chunk-R6SNYC3D.js.map} +0 -0
- /package/dist/{chunk-W2UTDN4T.js.map → chunk-RBGOGTT2.js.map} +0 -0
- /package/dist/{chunk-X5MPHXG5.js.map → chunk-RPWEXIAW.js.map} +0 -0
- /package/dist/{chunk-EXJBPKGW.js.map → chunk-SHDIZSN5.js.map} +0 -0
- /package/dist/{chunk-23FCBIUN.js.map → chunk-TNVO2DTB.js.map} +0 -0
- /package/dist/{chunk-AGSBIUPV.js.map → chunk-TPLKJHNN.js.map} +0 -0
- /package/dist/{chunk-YQ6TNHAC.js.map → chunk-TTLI6PF7.js.map} +0 -0
- /package/dist/{chunk-U2AC4AQX.js.map → chunk-TU5EIKJA.js.map} +0 -0
- /package/dist/{chunk-KTK4A3IF.js.map → chunk-TX5V42AY.js.map} +0 -0
- /package/dist/{chunk-BGYLL467.js.map → chunk-TXHJX2NG.js.map} +0 -0
- /package/dist/{chunk-FL54G7PV.js.map → chunk-WIT3Y7JT.js.map} +0 -0
- /package/dist/{chunk-W7Y6RA6W.js.map → chunk-WR5JFDQ5.js.map} +0 -0
- /package/dist/{chunk-2UYR2OOE.js.map → chunk-YRUCIKPO.js.map} +0 -0
- /package/dist/{chunk-AEGXHZQT.js.map → chunk-YW5T6KZ5.js.map} +0 -0
- /package/dist/{chunk-QKIJ6YXZ.js.map → chunk-ZA4U5GDU.js.map} +0 -0
- /package/dist/{chunk-ZKR5B6YJ.js.map → chunk-ZRPGVHTR.js.map} +0 -0
- /package/dist/{chunk-OXQP3N6X.js.map → chunk-ZTZ6S5Q6.js.map} +0 -0
|
@@ -8,14 +8,14 @@ import {
|
|
|
8
8
|
import {
|
|
9
9
|
renderTextChildren
|
|
10
10
|
} from "../chunks/chunk-5GJ5OG5R.js";
|
|
11
|
+
import {
|
|
12
|
+
muiTypeStyle
|
|
13
|
+
} from "../chunks/chunk-2UFNPDYT.js";
|
|
11
14
|
import {
|
|
12
15
|
childTestId,
|
|
13
16
|
resolveTestId,
|
|
14
17
|
withoutTestIdProps
|
|
15
18
|
} from "../chunks/chunk-AR5O4BEY.js";
|
|
16
|
-
import {
|
|
17
|
-
muiTypeStyle
|
|
18
|
-
} from "../chunks/chunk-2UFNPDYT.js";
|
|
19
19
|
import {
|
|
20
20
|
useUiTheme
|
|
21
21
|
} from "../chunks/chunk-GWGIWQO7.js";
|
|
@@ -1,213 +1,10 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
import {
|
|
9
|
-
useUiTheme
|
|
10
|
-
} from "../chunks/chunk-GWGIWQO7.js";
|
|
11
|
-
import {
|
|
12
|
-
alpha
|
|
13
|
-
} from "../chunks/chunk-LEMMXZFN.js";
|
|
14
|
-
|
|
15
|
-
// src/components/layout/Skeleton/Skeleton.native.tsx
|
|
16
|
-
import * as React from "react";
|
|
17
|
-
import {
|
|
18
|
-
Animated,
|
|
19
|
-
Easing,
|
|
20
|
-
StyleSheet,
|
|
21
|
-
View
|
|
22
|
-
} from "react-native";
|
|
23
|
-
|
|
24
|
-
// src/components/layout/Skeleton/Skeleton.helpers.ts
|
|
25
|
-
var SKELETON_DEFAULTS = {
|
|
26
|
-
variant: "text",
|
|
27
|
-
animation: "pulse",
|
|
28
|
-
count: 1,
|
|
29
|
-
spacing: 1,
|
|
30
|
-
intensity: "medium",
|
|
31
|
-
glassmorphism: false,
|
|
32
|
-
shimmer: false
|
|
33
|
-
};
|
|
34
|
-
var definedProps = (props) => Object.fromEntries(
|
|
35
|
-
Object.entries(props).filter(([, value]) => value !== void 0)
|
|
36
|
-
);
|
|
37
|
-
var resolveSkeletonProps = (props) => ({ ...SKELETON_DEFAULTS, ...definedProps(props) });
|
|
38
|
-
var skeletonInstanceTestId = (base, index) => base ? `${base}-${index}` : void 0;
|
|
39
|
-
|
|
40
|
-
// src/components/layout/Skeleton/Skeleton.metrics.ts
|
|
41
|
-
var SKELETON_INTENSITY_OPACITY = {
|
|
42
|
-
low: 0.11,
|
|
43
|
-
medium: 0.13,
|
|
44
|
-
high: 0.15
|
|
45
|
-
};
|
|
46
|
-
var SKELETON_DEFAULT_DIMENSIONS = {
|
|
47
|
-
// `text` has no height of its own: MUI's line box gives it one (below).
|
|
48
|
-
text: { width: "100%", height: void 0 },
|
|
49
|
-
circular: { width: 40, height: 40 },
|
|
50
|
-
rectangular: { width: "100%", height: 40 },
|
|
51
|
-
wave: { width: "100%", height: 40 }
|
|
52
|
-
};
|
|
53
|
-
var GLASS_BACKGROUND_ALPHA_FROM = 0.8;
|
|
54
|
-
var GLASS_BORDER_ALPHA = 0.2;
|
|
55
|
-
var GLASS_SHADOW = { offsetY: 8, blur: 32, alpha: 0.1 };
|
|
56
|
-
var SHIMMER_ALPHA = 0.3;
|
|
57
|
-
var SHIMMER_DURATION_MS = 2e3;
|
|
58
|
-
var COMMON_BLACK = "#000";
|
|
59
|
-
var COMMON_WHITE = "#fff";
|
|
60
|
-
var PULSE = { durationMs: 2e3, delayMs: 500, dip: 0.4 };
|
|
61
|
-
var WAVE = { durationMs: 1600, delayMs: 500 };
|
|
62
|
-
var TEXT_LINE_HEIGHT_EM = 1.2;
|
|
63
|
-
var TEXT_SCALE_Y = 0.6;
|
|
64
|
-
|
|
65
|
-
// src/components/layout/Skeleton/Skeleton.native.tsx
|
|
66
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
67
|
-
var PULSE_EASING = Easing.inOut(Easing.ease);
|
|
68
|
-
var PERCENT = /^-?\d+(?:\.\d+)?%$/;
|
|
69
|
-
function dimension(value) {
|
|
70
|
-
if (value === void 0 || typeof value === "number") return value;
|
|
71
|
-
return PERCENT.test(value) ? value : void 0;
|
|
72
|
-
}
|
|
73
|
-
var skeletonTint = (theme, intensity) => alpha(
|
|
74
|
-
theme.mode === "dark" ? COMMON_WHITE : theme.palette.text.primary,
|
|
75
|
-
SKELETON_INTENSITY_OPACITY[intensity]
|
|
76
|
-
);
|
|
77
|
-
var radiusFor = (theme, variant) => {
|
|
78
|
-
if (variant === "circular") return theme.radius.full;
|
|
79
|
-
return variant === "text" ? theme.radius.md : 0;
|
|
80
|
-
};
|
|
81
|
-
function textBoxHeight(theme, height) {
|
|
82
|
-
if (typeof height === "string") return dimension(height);
|
|
83
|
-
const box = height ?? theme.typography.sizes.md.fontSize * TEXT_LINE_HEIGHT_EM;
|
|
84
|
-
return box * TEXT_SCALE_Y;
|
|
85
|
-
}
|
|
86
|
-
function glassStyle(theme) {
|
|
87
|
-
return {
|
|
88
|
-
backgroundColor: alpha(theme.palette.background.paper, GLASS_BACKGROUND_ALPHA_FROM),
|
|
89
|
-
borderWidth: 1,
|
|
90
|
-
borderColor: alpha(theme.palette.divider, GLASS_BORDER_ALPHA),
|
|
91
|
-
boxShadow: `0 ${GLASS_SHADOW.offsetY}px ${GLASS_SHADOW.blur}px 0 ${alpha(COMMON_BLACK, GLASS_SHADOW.alpha)}`
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
function skeletonBoxStyle(theme, a) {
|
|
95
|
-
const box = SKELETON_DEFAULT_DIMENSIONS[a.variant];
|
|
96
|
-
const height = a.height ?? box.height;
|
|
97
|
-
const style = {
|
|
98
|
-
width: dimension(a.width ?? box.width),
|
|
99
|
-
height: a.variant === "text" ? textBoxHeight(theme, height) : dimension(height),
|
|
100
|
-
borderRadius: dimension(a.borderRadius) ?? radiusFor(theme, a.variant),
|
|
101
|
-
backgroundColor: skeletonTint(theme, a.intensity)
|
|
102
|
-
};
|
|
103
|
-
if (a.clipped) style.overflow = "hidden";
|
|
104
|
-
return a.glassmorphism ? { ...style, ...glassStyle(theme) } : style;
|
|
105
|
-
}
|
|
106
|
-
function Wash({ color, durationMs, delayMs, testID }) {
|
|
107
|
-
const progress = useLoopedProgress(true, { durationMs, delayMs, easing: Easing.linear });
|
|
108
|
-
return /* @__PURE__ */ jsx(
|
|
109
|
-
Animated.View,
|
|
110
|
-
{
|
|
111
|
-
testID,
|
|
112
|
-
style: [
|
|
113
|
-
StyleSheet.absoluteFill,
|
|
114
|
-
{
|
|
115
|
-
pointerEvents: "none",
|
|
116
|
-
backgroundColor: color,
|
|
117
|
-
opacity: progress.interpolate({ inputRange: [0, 0.5, 1], outputRange: [0, 1, 0] })
|
|
118
|
-
}
|
|
119
|
-
]
|
|
120
|
-
}
|
|
121
|
-
);
|
|
122
|
-
}
|
|
123
|
-
var effectiveAnimation = (variant, animation) => variant === "wave" ? "wave" : animation;
|
|
124
|
-
function SkeletonBox({
|
|
125
|
-
animation,
|
|
126
|
-
shimmer,
|
|
127
|
-
style,
|
|
128
|
-
testID,
|
|
129
|
-
rest,
|
|
130
|
-
...styleArgs
|
|
131
|
-
}) {
|
|
132
|
-
const theme = useUiTheme();
|
|
133
|
-
const animates = effectiveAnimation(styleArgs.variant, animation);
|
|
134
|
-
const pulse = useLoopedProgress(animates === "pulse", {
|
|
135
|
-
durationMs: PULSE.durationMs,
|
|
136
|
-
delayMs: PULSE.delayMs,
|
|
137
|
-
easing: PULSE_EASING
|
|
138
|
-
});
|
|
139
|
-
const box = skeletonBoxStyle(theme, styleArgs);
|
|
140
|
-
const washId = testID ? `${testID}-wash` : void 0;
|
|
141
|
-
return /* @__PURE__ */ jsxs(
|
|
142
|
-
Animated.View,
|
|
143
|
-
{
|
|
144
|
-
"aria-hidden": true,
|
|
145
|
-
testID,
|
|
146
|
-
style: [
|
|
147
|
-
box,
|
|
148
|
-
animates === "pulse" ? { opacity: pulse.interpolate({ inputRange: [0, 0.5, 1], outputRange: [1, PULSE.dip, 1] }) } : null,
|
|
149
|
-
style
|
|
150
|
-
],
|
|
151
|
-
...rest,
|
|
152
|
-
children: [
|
|
153
|
-
shimmer ? /* @__PURE__ */ jsx(
|
|
154
|
-
Wash,
|
|
155
|
-
{
|
|
156
|
-
color: alpha(COMMON_WHITE, SHIMMER_ALPHA),
|
|
157
|
-
durationMs: SHIMMER_DURATION_MS,
|
|
158
|
-
delayMs: 0,
|
|
159
|
-
testID: washId
|
|
160
|
-
}
|
|
161
|
-
) : null,
|
|
162
|
-
!shimmer && animates === "wave" ? /* @__PURE__ */ jsx(
|
|
163
|
-
Wash,
|
|
164
|
-
{
|
|
165
|
-
color: theme.palette.action.hover,
|
|
166
|
-
durationMs: WAVE.durationMs,
|
|
167
|
-
delayMs: WAVE.delayMs,
|
|
168
|
-
testID: washId
|
|
169
|
-
}
|
|
170
|
-
) : null
|
|
171
|
-
]
|
|
172
|
-
}
|
|
173
|
-
);
|
|
174
|
-
}
|
|
175
|
-
var Skeleton = React.memo(function Skeleton2(rawProps) {
|
|
176
|
-
const resolved = resolveSkeletonProps(rawProps);
|
|
177
|
-
const {
|
|
178
|
-
variant,
|
|
179
|
-
animation,
|
|
180
|
-
width,
|
|
181
|
-
height,
|
|
182
|
-
count,
|
|
183
|
-
spacing,
|
|
184
|
-
borderRadius,
|
|
185
|
-
intensity,
|
|
186
|
-
glassmorphism,
|
|
187
|
-
shimmer,
|
|
188
|
-
style,
|
|
189
|
-
...others
|
|
190
|
-
} = resolved;
|
|
191
|
-
const theme = useUiTheme();
|
|
192
|
-
const testID = resolveTestId(others);
|
|
193
|
-
const box = {
|
|
194
|
-
variant,
|
|
195
|
-
animation,
|
|
196
|
-
intensity,
|
|
197
|
-
width,
|
|
198
|
-
height,
|
|
199
|
-
borderRadius,
|
|
200
|
-
glassmorphism,
|
|
201
|
-
shimmer,
|
|
202
|
-
clipped: shimmer || effectiveAnimation(variant, animation) === "wave",
|
|
203
|
-
style,
|
|
204
|
-
rest: withoutTestIdProps(others)
|
|
205
|
-
};
|
|
206
|
-
if (count === 0) return null;
|
|
207
|
-
if (count === 1) return /* @__PURE__ */ jsx(SkeletonBox, { ...box, testID });
|
|
208
|
-
return /* @__PURE__ */ jsx(View, { style: { gap: theme.spacing(spacing) }, children: Array.from({ length: count }, (_, index) => /* @__PURE__ */ jsx(View, { children: /* @__PURE__ */ jsx(SkeletonBox, { ...box, testID: skeletonInstanceTestId(testID, index) }) }, `skeleton-${index}`)) });
|
|
209
|
-
});
|
|
210
|
-
Skeleton.displayName = "Skeleton";
|
|
2
|
+
Skeleton
|
|
3
|
+
} from "../chunks/chunk-GW7TQ7HO.js";
|
|
4
|
+
import "../chunks/chunk-MLQIOKQZ.js";
|
|
5
|
+
import "../chunks/chunk-AR5O4BEY.js";
|
|
6
|
+
import "../chunks/chunk-GWGIWQO7.js";
|
|
7
|
+
import "../chunks/chunk-LEMMXZFN.js";
|
|
211
8
|
export {
|
|
212
9
|
Skeleton
|
|
213
10
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/layout/Skeleton/Skeleton.native.tsx","../../../src/components/layout/Skeleton/Skeleton.helpers.ts","../../../src/components/layout/Skeleton/Skeleton.metrics.ts"],"sourcesContent":["import * as React from 'react';\nimport {\n Animated,\n Easing,\n StyleSheet,\n View,\n type DimensionValue,\n type StyleProp,\n type ViewProps,\n type ViewStyle,\n} from 'react-native';\n\nimport { resolveSkeletonProps, skeletonInstanceTestId } from './Skeleton.helpers';\nimport {\n COMMON_BLACK,\n COMMON_WHITE,\n GLASS_BACKGROUND_ALPHA_FROM,\n GLASS_BORDER_ALPHA,\n GLASS_SHADOW,\n PULSE,\n SHIMMER_ALPHA,\n SHIMMER_DURATION_MS,\n SKELETON_DEFAULT_DIMENSIONS,\n SKELETON_INTENSITY_OPACITY,\n TEXT_LINE_HEIGHT_EM,\n TEXT_SCALE_Y,\n WAVE,\n} from './Skeleton.metrics';\nimport type {\n SkeletonAnimation,\n SkeletonIntensity,\n SkeletonProps,\n SkeletonVariant,\n} from './Skeleton.types.native';\nimport { useLoopedProgress } from '../../../platform/animation';\nimport { resolveTestId, withoutTestIdProps } from '../../../platform/test-id';\nimport { useUiTheme } from '../../../provider/use-ui-theme.native';\nimport { alpha } from '../../../tokens/color';\nimport type { UiTheme } from '../../../tokens/theme';\n\n/** MUI's `pulseKeyframe` runs `ease-in-out`. */\nconst PULSE_EASING = Easing.inOut(Easing.ease);\nconst PERCENT = /^-?\\d+(?:\\.\\d+)?%$/;\n\n/**\n * A width or a height, as React Native accepts one. The web takes any CSS\n * length; here a number is dp and a percentage is a percentage — anything else\n * (`10rem`, `calc(...)`) has no equivalent and sizes the box from its content,\n * which `NATIVE-NOTES.md` records.\n */\nexport function dimension(value: number | string | undefined): DimensionValue | undefined {\n if (value === undefined || typeof value === 'number') return value;\n return PERCENT.test(value) ? (value as `${number}%`) : undefined;\n}\n\n/** The tint the web writes: the body ink at the intensity's alpha, white in dark mode. */\nexport const skeletonTint = (theme: UiTheme, intensity: SkeletonIntensity): string =>\n alpha(\n theme.mode === 'dark' ? COMMON_WHITE : theme.palette.text.primary,\n SKELETON_INTENSITY_OPACITY[intensity],\n );\n\n/** MUI's radius per variant: a circle, a square rectangle, the theme's 4px on text. */\nconst radiusFor = (theme: UiTheme, variant: SkeletonVariant): number => {\n if (variant === 'circular') return theme.radius.full;\n return variant === 'text' ? theme.radius.md : 0;\n};\n\n/**\n * The `text` variant's height. MUI gives it a `1.2em` line box and squashes the\n * whole box to 60%; React Native's transforms do not change layout, so the two\n * are multiplied out into the height the web actually shows.\n */\nexport function textBoxHeight(\n theme: UiTheme,\n height: number | string | undefined,\n): DimensionValue | undefined {\n if (typeof height === 'string') return dimension(height);\n const box = height ?? theme.typography.sizes.md.fontSize * TEXT_LINE_HEIGHT_EM;\n return box * TEXT_SCALE_Y;\n}\n\n/**\n * `glassmorphism`: the gradient's first stop flat, the hairline, and the web's\n * own box-shadow string — React Native 0.76+ takes CSS shadow syntax, so the\n * two renderers draw the shadow from the same declaration. What is missing is\n * the 20px backdrop blur, which React Native has no equivalent of.\n */\nfunction glassStyle(theme: UiTheme): ViewStyle {\n return {\n backgroundColor: alpha(theme.palette.background.paper, GLASS_BACKGROUND_ALPHA_FROM),\n borderWidth: 1,\n borderColor: alpha(theme.palette.divider, GLASS_BORDER_ALPHA),\n boxShadow: `0 ${GLASS_SHADOW.offsetY}px ${GLASS_SHADOW.blur}px 0 ${alpha(COMMON_BLACK, GLASS_SHADOW.alpha)}`,\n };\n}\n\ninterface SkeletonBoxStyleArgs {\n variant: SkeletonVariant;\n intensity: SkeletonIntensity;\n width?: number | string;\n height?: number | string;\n borderRadius?: number | string;\n glassmorphism: boolean;\n /** A box with a wash sliding over it clips, as MUI's `wave` and the shimmer do. */\n clipped: boolean;\n}\n\n/** The box the web paints, in absolute numbers. */\nexport function skeletonBoxStyle(theme: UiTheme, a: SkeletonBoxStyleArgs): ViewStyle {\n const box = SKELETON_DEFAULT_DIMENSIONS[a.variant];\n const height = a.height ?? box.height;\n const style: ViewStyle = {\n width: dimension(a.width ?? box.width),\n height: a.variant === 'text' ? textBoxHeight(theme, height) : dimension(height),\n borderRadius: dimension(a.borderRadius) ?? radiusFor(theme, a.variant),\n backgroundColor: skeletonTint(theme, a.intensity),\n };\n if (a.clipped) style.overflow = 'hidden';\n return a.glassmorphism ? { ...style, ...glassStyle(theme) } : style;\n}\n\ninterface WashProps {\n color: string;\n durationMs: number;\n delayMs: number;\n testID?: string;\n}\n\n/**\n * MUI's sweeping `::after`, standing still. React Native core has no gradient\n * fill and no pseudo-elements, so the same wash covers the box and fades in and\n * out on the same cadence instead of travelling across it. It carries no\n * `aria-hidden` of its own: the box it sits in is already hidden, and the\n * shared stories count the boxes by that attribute.\n */\nfunction Wash({ color, durationMs, delayMs, testID }: WashProps): React.JSX.Element {\n const progress = useLoopedProgress(true, { durationMs, delayMs, easing: Easing.linear });\n return (\n <Animated.View\n testID={testID}\n style={[\n StyleSheet.absoluteFill,\n {\n pointerEvents: 'none',\n backgroundColor: color,\n opacity: progress.interpolate({ inputRange: [0, 0.5, 1], outputRange: [0, 1, 0] }),\n },\n ]}\n />\n );\n}\n\ninterface SkeletonBoxProps extends SkeletonBoxStyleArgs {\n animation: SkeletonAnimation;\n shimmer: boolean;\n style?: StyleProp<ViewStyle>;\n testID?: string;\n rest: ViewProps;\n}\n\n/** The web's `muiAnimationFor`: the `wave` VARIANT always animates as a wave. */\nconst effectiveAnimation = (\n variant: SkeletonVariant,\n animation: SkeletonAnimation,\n): SkeletonAnimation => (variant === 'wave' ? 'wave' : animation);\n\n/** One skeleton box: the tint, the pulse, and the wash the sweep stands in for. */\nfunction SkeletonBox({\n animation,\n shimmer,\n style,\n testID,\n rest,\n ...styleArgs\n}: SkeletonBoxProps): React.JSX.Element {\n const theme = useUiTheme();\n const animates = effectiveAnimation(styleArgs.variant, animation);\n const pulse = useLoopedProgress(animates === 'pulse', {\n durationMs: PULSE.durationMs,\n delayMs: PULSE.delayMs,\n easing: PULSE_EASING,\n });\n const box = skeletonBoxStyle(theme, styleArgs);\n const washId = testID ? `${testID}-wash` : undefined;\n\n return (\n <Animated.View\n aria-hidden\n testID={testID}\n style={[\n box,\n animates === 'pulse'\n ? { opacity: pulse.interpolate({ inputRange: [0, 0.5, 1], outputRange: [1, PULSE.dip, 1] }) }\n : null,\n style,\n ]}\n {...rest}\n >\n {shimmer ? (\n <Wash\n color={alpha(COMMON_WHITE, SHIMMER_ALPHA)}\n durationMs={SHIMMER_DURATION_MS}\n delayMs={0}\n testID={washId}\n />\n ) : null}\n {!shimmer && animates === 'wave' ? (\n <Wash\n color={theme.palette.action.hover}\n durationMs={WAVE.durationMs}\n delayMs={WAVE.delayMs}\n testID={washId}\n />\n ) : null}\n </Animated.View>\n );\n}\n\n/**\n * The native `Skeleton`: the same box, the same tint and the same default\n * dimensions the MUI half draws, on a `View`.\n */\nexport const Skeleton: React.FC<SkeletonProps> = React.memo(function Skeleton(rawProps) {\n const resolved = resolveSkeletonProps(rawProps);\n const {\n variant,\n animation,\n width,\n height,\n count,\n spacing,\n borderRadius,\n intensity,\n glassmorphism,\n shimmer,\n style,\n ...others\n } = resolved;\n const theme = useUiTheme();\n const testID = resolveTestId(others);\n const box: Omit<SkeletonBoxProps, 'testID'> = {\n variant,\n animation,\n intensity,\n width,\n height,\n borderRadius,\n glassmorphism,\n shimmer,\n clipped: shimmer || effectiveAnimation(variant, animation) === 'wave',\n style,\n rest: withoutTestIdProps(others),\n };\n\n // Handle edge case: count of 0 should render nothing\n if (count === 0) return null;\n if (count === 1) return <SkeletonBox {...box} testID={testID} />;\n\n return (\n <View style={{ gap: theme.spacing(spacing) }}>\n {Array.from({ length: count }, (_, index) => (\n <View key={`skeleton-${index}`}>\n <SkeletonBox {...box} testID={skeletonInstanceTestId(testID, index)} />\n </View>\n ))}\n </View>\n );\n});\n\nSkeleton.displayName = 'Skeleton';\n","import type { SkeletonBaseProps } from './Skeleton.base';\n\ntype SkeletonDefaultedKeys =\n | 'variant'\n | 'animation'\n | 'count'\n | 'spacing'\n | 'intensity'\n | 'glassmorphism'\n | 'shimmer';\n\n/**\n * Generic over the renderer's own props: the web and the native `Skeleton`\n * carry different extras (`className`/`style` against a `View`'s props), and\n * both come back out untouched.\n */\ntype ResolvedSkeletonProps<P extends SkeletonBaseProps> = P &\n Required<Pick<SkeletonBaseProps, SkeletonDefaultedKeys>>;\n\nconst SKELETON_DEFAULTS: Required<Pick<SkeletonBaseProps, SkeletonDefaultedKeys>> = {\n variant: 'text',\n animation: 'pulse',\n count: 1,\n spacing: 1,\n intensity: 'medium',\n glassmorphism: false,\n shimmer: false,\n};\n\n// Strips explicitly-undefined props before the merge, so `count={undefined}` still\n// falls back to the default exactly as a destructuring default would.\nconst definedProps = <P extends SkeletonBaseProps>(props: P): Partial<P> =>\n Object.fromEntries(\n Object.entries(props).filter(([, value]) => value !== undefined),\n ) as Partial<P>;\n\nexport const resolveSkeletonProps = <P extends SkeletonBaseProps>(\n props: P,\n): ResolvedSkeletonProps<P> =>\n ({ ...SKELETON_DEFAULTS, ...definedProps(props) }) as ResolvedSkeletonProps<P>;\n\n/**\n * The id of instance `index` when a caller asked for several. Unnamed\n * skeletons stay unnamed — the web has always cloned `undefined` there.\n */\nexport const skeletonInstanceTestId = (\n base: string | undefined,\n index: number,\n): string | undefined => (base ? `${base}-${index}` : undefined);\n","import type { SkeletonIntensity, SkeletonVariant } from './Skeleton.base';\n\n/**\n * THE NUMBERS BOTH `Skeleton` RENDERERS DRAW WITH.\n *\n * `Skeleton.styles.ts` (web, emotion over MUI's own `Skeleton`) and\n * `Skeleton.native.tsx` (React Native) read this one table. The web turns them\n * into CSS strings — `blur(20px)`, `shimmer 2s infinite` — and native uses the\n * numbers as they are, so neither renderer restates a value.\n *\n * Two groups live here. The first is what the web component WRITES (the\n * intensity alphas, the default box, the glass and shimmer washes). The second\n * is what MUI's own `Skeleton` contributes on the web and the native half\n * therefore has to restate: its pulse keyframe, its wave cadence, and the\n * geometry of the `text` variant. Those are MUI's DEFAULTS — a host that\n * re-themes them moves the web only, which `NATIVE-NOTES.md` records.\n */\n\n/** The tint's alpha over the ink, per intensity. */\nexport const SKELETON_INTENSITY_OPACITY: Record<SkeletonIntensity, number> = {\n low: 0.11,\n medium: 0.13,\n high: 0.15,\n};\n\n/** The box a variant draws when the caller gives no `width`/`height`. */\nexport const SKELETON_DEFAULT_DIMENSIONS: Record<\n SkeletonVariant,\n { width: number | string; height: number | undefined }\n> = {\n // `text` has no height of its own: MUI's line box gives it one (below).\n text: { width: '100%', height: undefined },\n circular: { width: 40, height: 40 },\n rectangular: { width: '100%', height: 40 },\n wave: { width: '100%', height: 40 },\n};\n\n/* ── `glassmorphism` ──────────────────────────────────────────────────────── */\n\n/** The 135° wash over `background.paper`, from the first stop to the last. */\nexport const GLASS_BACKGROUND_ALPHA_FROM = 0.8;\nexport const GLASS_BACKGROUND_ALPHA_TO = 0.4;\nexport const GLASS_BLUR_PX = 20;\nexport const GLASS_BORDER_ALPHA = 0.2;\n/** `0 8px 32px 0 rgba(0, 0, 0, 0.1)`. */\nexport const GLASS_SHADOW = { offsetY: 8, blur: 32, alpha: 0.1 } as const;\n\n/* ── `shimmer` ────────────────────────────────────────────────────────────── */\n\n/** The sweep's middle stop, over white. */\nexport const SHIMMER_ALPHA = 0.3;\nexport const SHIMMER_DURATION_MS = 2000;\n\n/**\n * MUI's `palette.common`, which is a pair of fixed hexes rather than anything\n * derived — so the shared theme has no slot for them and they are named here.\n */\nexport const COMMON_BLACK = '#000';\nexport const COMMON_WHITE = '#fff';\n\n/* ── MUI's own `Skeleton`, restated for the renderer that has no MUI ──────── */\n\n/**\n * MUI's `pulseKeyframe`: opacity 1 → 0.4 → 1, `2s ease-in-out 0.5s infinite`.\n * The delay runs once on the web; native replays it each lap unless the\n * animation is sequenced, which `Skeleton.native.tsx` does.\n */\nexport const PULSE = { durationMs: 2000, delayMs: 500, dip: 0.4 } as const;\n\n/** MUI's `wave` sweep: `1.6s linear 0.5s infinite`, in `palette.action.hover`. */\nexport const WAVE = { durationMs: 1600, delayMs: 500 } as const;\n\n/**\n * The `text` variant, as MUI draws it: a line box `1.2em` tall squashed to 60%\n * of its height (`transform: scale(1, 0.60)`), with a `4px/6.7px` elliptical\n * radius that the same squash turns back into a round 4px. React Native has no\n * `em`, and its transforms do not change layout, so the native half multiplies\n * the two out into one height and draws the plain 4px radius the squash lands on.\n */\nexport const TEXT_LINE_HEIGHT_EM = 1.2;\nexport const TEXT_SCALE_Y = 0.6;\n"],"mappings":";;;;;;;;;;;;;;;AAAA,YAAY,WAAW;AACvB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAKK;;;ACSP,IAAM,oBAA8E;AAAA,EAClF,SAAS;AAAA,EACT,WAAW;AAAA,EACX,OAAO;AAAA,EACP,SAAS;AAAA,EACT,WAAW;AAAA,EACX,eAAe;AAAA,EACf,SAAS;AACX;AAIA,IAAM,eAAe,CAA8B,UACjD,OAAO;AAAA,EACL,OAAO,QAAQ,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,UAAU,MAAS;AACjE;AAEK,IAAM,uBAAuB,CAClC,WAEC,EAAE,GAAG,mBAAmB,GAAG,aAAa,KAAK,EAAE;AAM3C,IAAM,yBAAyB,CACpC,MACA,UACwB,OAAO,GAAG,IAAI,IAAI,KAAK,KAAK;;;AC7B/C,IAAM,6BAAgE;AAAA,EAC3E,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AACR;AAGO,IAAM,8BAGT;AAAA;AAAA,EAEF,MAAM,EAAE,OAAO,QAAQ,QAAQ,OAAU;AAAA,EACzC,UAAU,EAAE,OAAO,IAAI,QAAQ,GAAG;AAAA,EAClC,aAAa,EAAE,OAAO,QAAQ,QAAQ,GAAG;AAAA,EACzC,MAAM,EAAE,OAAO,QAAQ,QAAQ,GAAG;AACpC;AAKO,IAAM,8BAA8B;AAGpC,IAAM,qBAAqB;AAE3B,IAAM,eAAe,EAAE,SAAS,GAAG,MAAM,IAAI,OAAO,IAAI;AAKxD,IAAM,gBAAgB;AACtB,IAAM,sBAAsB;AAM5B,IAAM,eAAe;AACrB,IAAM,eAAe;AASrB,IAAM,QAAQ,EAAE,YAAY,KAAM,SAAS,KAAK,KAAK,IAAI;AAGzD,IAAM,OAAO,EAAE,YAAY,MAAM,SAAS,IAAI;AAS9C,IAAM,sBAAsB;AAC5B,IAAM,eAAe;;;AF2DxB,cAgDA,YAhDA;AAlGJ,IAAM,eAAe,OAAO,MAAM,OAAO,IAAI;AAC7C,IAAM,UAAU;AAQT,SAAS,UAAU,OAAgE;AACxF,MAAI,UAAU,UAAa,OAAO,UAAU,SAAU,QAAO;AAC7D,SAAO,QAAQ,KAAK,KAAK,IAAK,QAAyB;AACzD;AAGO,IAAM,eAAe,CAAC,OAAgB,cAC3C;AAAA,EACE,MAAM,SAAS,SAAS,eAAe,MAAM,QAAQ,KAAK;AAAA,EAC1D,2BAA2B,SAAS;AACtC;AAGF,IAAM,YAAY,CAAC,OAAgB,YAAqC;AACtE,MAAI,YAAY,WAAY,QAAO,MAAM,OAAO;AAChD,SAAO,YAAY,SAAS,MAAM,OAAO,KAAK;AAChD;AAOO,SAAS,cACd,OACA,QAC4B;AAC5B,MAAI,OAAO,WAAW,SAAU,QAAO,UAAU,MAAM;AACvD,QAAM,MAAM,UAAU,MAAM,WAAW,MAAM,GAAG,WAAW;AAC3D,SAAO,MAAM;AACf;AAQA,SAAS,WAAW,OAA2B;AAC7C,SAAO;AAAA,IACL,iBAAiB,MAAM,MAAM,QAAQ,WAAW,OAAO,2BAA2B;AAAA,IAClF,aAAa;AAAA,IACb,aAAa,MAAM,MAAM,QAAQ,SAAS,kBAAkB;AAAA,IAC5D,WAAW,KAAK,aAAa,OAAO,MAAM,aAAa,IAAI,QAAQ,MAAM,cAAc,aAAa,KAAK,CAAC;AAAA,EAC5G;AACF;AAcO,SAAS,iBAAiB,OAAgB,GAAoC;AACnF,QAAM,MAAM,4BAA4B,EAAE,OAAO;AACjD,QAAM,SAAS,EAAE,UAAU,IAAI;AAC/B,QAAM,QAAmB;AAAA,IACvB,OAAO,UAAU,EAAE,SAAS,IAAI,KAAK;AAAA,IACrC,QAAQ,EAAE,YAAY,SAAS,cAAc,OAAO,MAAM,IAAI,UAAU,MAAM;AAAA,IAC9E,cAAc,UAAU,EAAE,YAAY,KAAK,UAAU,OAAO,EAAE,OAAO;AAAA,IACrE,iBAAiB,aAAa,OAAO,EAAE,SAAS;AAAA,EAClD;AACA,MAAI,EAAE,QAAS,OAAM,WAAW;AAChC,SAAO,EAAE,gBAAgB,EAAE,GAAG,OAAO,GAAG,WAAW,KAAK,EAAE,IAAI;AAChE;AAgBA,SAAS,KAAK,EAAE,OAAO,YAAY,SAAS,OAAO,GAAiC;AAClF,QAAM,WAAW,kBAAkB,MAAM,EAAE,YAAY,SAAS,QAAQ,OAAO,OAAO,CAAC;AACvF,SACE;AAAA,IAAC,SAAS;AAAA,IAAT;AAAA,MACC;AAAA,MACA,OAAO;AAAA,QACL,WAAW;AAAA,QACX;AAAA,UACE,eAAe;AAAA,UACf,iBAAiB;AAAA,UACjB,SAAS,SAAS,YAAY,EAAE,YAAY,CAAC,GAAG,KAAK,CAAC,GAAG,aAAa,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC;AAAA,QACnF;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;AAWA,IAAM,qBAAqB,CACzB,SACA,cACuB,YAAY,SAAS,SAAS;AAGvD,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAwC;AACtC,QAAM,QAAQ,WAAW;AACzB,QAAM,WAAW,mBAAmB,UAAU,SAAS,SAAS;AAChE,QAAM,QAAQ,kBAAkB,aAAa,SAAS;AAAA,IACpD,YAAY,MAAM;AAAA,IAClB,SAAS,MAAM;AAAA,IACf,QAAQ;AAAA,EACV,CAAC;AACD,QAAM,MAAM,iBAAiB,OAAO,SAAS;AAC7C,QAAM,SAAS,SAAS,GAAG,MAAM,UAAU;AAE3C,SACE;AAAA,IAAC,SAAS;AAAA,IAAT;AAAA,MACC,eAAW;AAAA,MACX;AAAA,MACA,OAAO;AAAA,QACL;AAAA,QACA,aAAa,UACT,EAAE,SAAS,MAAM,YAAY,EAAE,YAAY,CAAC,GAAG,KAAK,CAAC,GAAG,aAAa,CAAC,GAAG,MAAM,KAAK,CAAC,EAAE,CAAC,EAAE,IAC1F;AAAA,QACJ;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEH;AAAA,kBACC;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,MAAM,cAAc,aAAa;AAAA,YACxC,YAAY;AAAA,YACZ,SAAS;AAAA,YACT,QAAQ;AAAA;AAAA,QACV,IACE;AAAA,QACH,CAAC,WAAW,aAAa,SACxB;AAAA,UAAC;AAAA;AAAA,YACC,OAAO,MAAM,QAAQ,OAAO;AAAA,YAC5B,YAAY,KAAK;AAAA,YACjB,SAAS,KAAK;AAAA,YACd,QAAQ;AAAA;AAAA,QACV,IACE;AAAA;AAAA;AAAA,EACN;AAEJ;AAMO,IAAM,WAA0C,WAAK,SAASA,UAAS,UAAU;AACtF,QAAM,WAAW,qBAAqB,QAAQ;AAC9C,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,IAAI;AACJ,QAAM,QAAQ,WAAW;AACzB,QAAM,SAAS,cAAc,MAAM;AACnC,QAAM,MAAwC;AAAA,IAC5C;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS,WAAW,mBAAmB,SAAS,SAAS,MAAM;AAAA,IAC/D;AAAA,IACA,MAAM,mBAAmB,MAAM;AAAA,EACjC;AAGA,MAAI,UAAU,EAAG,QAAO;AACxB,MAAI,UAAU,EAAG,QAAO,oBAAC,eAAa,GAAG,KAAK,QAAgB;AAE9D,SACE,oBAAC,QAAK,OAAO,EAAE,KAAK,MAAM,QAAQ,OAAO,EAAE,GACxC,gBAAM,KAAK,EAAE,QAAQ,MAAM,GAAG,CAAC,GAAG,UACjC,oBAAC,QACC,8BAAC,eAAa,GAAG,KAAK,QAAQ,uBAAuB,QAAQ,KAAK,GAAG,KAD5D,YAAY,KAAK,EAE5B,CACD,GACH;AAEJ,CAAC;AAED,SAAS,cAAc;","names":["Skeleton"]}
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -7,24 +7,24 @@ import {
|
|
|
7
7
|
AppHeaderIdentity,
|
|
8
8
|
AppHeaderStatus
|
|
9
9
|
} from "../chunk-W2YNUUVJ.js";
|
|
10
|
-
import {
|
|
11
|
-
AppHeaderDetails
|
|
12
|
-
} from "../chunk-6NZTYZP5.js";
|
|
13
10
|
import {
|
|
14
11
|
AppHeaderBrand
|
|
15
12
|
} from "../chunk-H37GIAAM.js";
|
|
13
|
+
import {
|
|
14
|
+
AppHeaderDetails
|
|
15
|
+
} from "../chunk-GVA5CYKP.js";
|
|
16
16
|
import {
|
|
17
17
|
brandGradient,
|
|
18
18
|
highlightOf,
|
|
19
19
|
initialsOf
|
|
20
20
|
} from "../chunk-IQU4HKND.js";
|
|
21
|
-
import "../chunk-
|
|
21
|
+
import "../chunk-OTH7H3IP.js";
|
|
22
22
|
import "../chunk-M2K7BPHX.js";
|
|
23
23
|
import "../chunk-6JZE4IIN.js";
|
|
24
24
|
import "../chunk-POUWN4PX.js";
|
|
25
|
-
import "../chunk-
|
|
26
|
-
import "../chunk-F52N6ACD.js";
|
|
25
|
+
import "../chunk-OLZTGVBT.js";
|
|
27
26
|
import "../chunk-CRN4KKNI.js";
|
|
27
|
+
import "../chunk-F52N6ACD.js";
|
|
28
28
|
import "../chunk-YANLN6HP.js";
|
|
29
29
|
import "../chunk-5KEMPCW4.js";
|
|
30
30
|
import "../chunk-VM3HRSAU.js";
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import "../chunk-MQJDMQJZ.js";
|
|
2
2
|
import {
|
|
3
3
|
Pagination
|
|
4
|
-
} from "../chunk-
|
|
5
|
-
import "../chunk-CZBONNPA.js";
|
|
4
|
+
} from "../chunk-RBGOGTT2.js";
|
|
6
5
|
import "../chunk-BB2IVF76.js";
|
|
6
|
+
import "../chunk-CZBONNPA.js";
|
|
7
7
|
import "../chunk-Z6TIAVEG.js";
|
|
8
8
|
import "../chunk-PZ5AY32C.js";
|
|
9
9
|
export {
|
package/dist/pt-BR.js
CHANGED
|
@@ -20,7 +20,10 @@ import {
|
|
|
20
20
|
PT_BR_LIGHTBOX_COPY,
|
|
21
21
|
PT_BR_MAP_PREVIEW_COPY,
|
|
22
22
|
PT_BR_TIMING_DIAGRAM_COPY
|
|
23
|
-
} from "./chunk-
|
|
23
|
+
} from "./chunk-TU5EIKJA.js";
|
|
24
|
+
import {
|
|
25
|
+
PT_BR_TABLE_FILTER_COPY
|
|
26
|
+
} from "./chunk-A7RIZOAL.js";
|
|
24
27
|
import {
|
|
25
28
|
PT_BR_INSTALL_PROMPT_COPY,
|
|
26
29
|
PT_BR_USER_AVATAR_COPY
|
|
@@ -36,9 +39,6 @@ import {
|
|
|
36
39
|
PT_BR_BREADCRUMB_COPY,
|
|
37
40
|
PT_BR_COMMAND_PALETTE_COPY
|
|
38
41
|
} from "./chunk-62OGPVCL.js";
|
|
39
|
-
import {
|
|
40
|
-
PT_BR_TABLE_FILTER_COPY
|
|
41
|
-
} from "./chunk-A7RIZOAL.js";
|
|
42
42
|
import "./chunk-PZ5AY32C.js";
|
|
43
43
|
export {
|
|
44
44
|
PT_BR_ADDRESS_AUTOCOMPLETE_COPY,
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { FleetMapState } from './FleetMap.hooks';
|
|
3
|
+
import type { FleetMapCopy } from './FleetMap.types';
|
|
4
|
+
export interface FleetBodyProps extends Pick<FleetMapState, 'ordered' | 'centre' | 'markers' | 'select' | 'onKeyDown'> {
|
|
5
|
+
copy: FleetMapCopy;
|
|
6
|
+
selectedId: string | null | undefined;
|
|
7
|
+
laggingAfterSeconds: number;
|
|
8
|
+
staleAfterSeconds: number;
|
|
9
|
+
height: string;
|
|
10
|
+
loading: boolean;
|
|
11
|
+
testId: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* The two halves side by side: the roster that reads the fleet, and the map.
|
|
15
|
+
*
|
|
16
|
+
* A component rather than JSX inside {@link import('./FleetMap').FleetMap}
|
|
17
|
+
* because the layout is where every responsive decision lives, and keeping it
|
|
18
|
+
* here is what leaves the exported component short enough to read in one
|
|
19
|
+
* screen — which the complexity ledger enforces rather than merely suggests.
|
|
20
|
+
*/
|
|
21
|
+
export declare function FleetBody({ ordered, centre, markers, select, onKeyDown, copy, selectedId, laggingAfterSeconds, staleAfterSeconds, height, loading, testId, }: FleetBodyProps): React.JSX.Element;
|
|
22
|
+
//# sourceMappingURL=FleetBody.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FleetBody.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/FleetMap/FleetBody.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGrD,MAAM,WAAW,cACf,SAAQ,IAAI,CAAC,aAAa,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,CAAC;IACtF,IAAI,EAAE,YAAY,CAAC;IACnB,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACtC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,EACxB,OAAO,EACP,MAAM,EACN,OAAO,EACP,MAAM,EACN,SAAS,EACT,IAAI,EACJ,UAAU,EACV,mBAAmB,EACnB,iBAAiB,EACjB,MAAM,EACN,OAAO,EACP,MAAM,GACP,EAAE,cAAc,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAsDpC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { FleetMarker } from './FleetMap.hooks';
|
|
3
|
+
import type { LatLng } from './FleetMap.helpers';
|
|
4
|
+
import type { FleetMapCopy } from './FleetMap.types';
|
|
5
|
+
export interface FleetCanvasProps {
|
|
6
|
+
copy: FleetMapCopy;
|
|
7
|
+
/** Where to point. `null` renders NOTHING — see the component's note. */
|
|
8
|
+
centre: LatLng | null;
|
|
9
|
+
markers: FleetMarker[];
|
|
10
|
+
height: string;
|
|
11
|
+
testId: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* The map half — a NAMED LANDMARK, not an `aria-hidden` one.
|
|
15
|
+
*
|
|
16
|
+
* Its controls are focusable, and `aria-hidden` over a focusable subtree is the
|
|
17
|
+
* `aria-hidden-focus` violation: a keyboard user tabs into something a screen
|
|
18
|
+
* reader insists is not there. `role="region"` with a name is what puts it in a
|
|
19
|
+
* screen reader's landmark rotor, so it can be jumped PAST in one gesture;
|
|
20
|
+
* `role="group"` is not a landmark and would not.
|
|
21
|
+
*
|
|
22
|
+
* ## Skipping it does not silence it, and that is not ours to fix here
|
|
23
|
+
*
|
|
24
|
+
* `MapPreview` puts `aria-live="polite"` on its own root, with an English
|
|
25
|
+
* `aria-label` naming the centre coordinates and zoom. So re-centring the map —
|
|
26
|
+
* which every selection change does — announces something like "Map preview
|
|
27
|
+
* centered at -23.5505, -46.6333 with zoom level 15", in English, however
|
|
28
|
+
* thoroughly a reader has skipped the landmark. Two things follow, and neither
|
|
29
|
+
* is solved by anything this file can do:
|
|
30
|
+
*
|
|
31
|
+
* * a live region announces from wherever the reader is, so the landmark's
|
|
32
|
+
* skippability does not suppress it;
|
|
33
|
+
* * that string is the one piece of user-facing text in this component that
|
|
34
|
+
* does NOT come through `copy`.
|
|
35
|
+
*
|
|
36
|
+
* Fixing it means changing `MapPreview`, which every other consumer shares, so
|
|
37
|
+
* it is stated here rather than quietly claimed away.
|
|
38
|
+
*
|
|
39
|
+
* ## No centre, no map
|
|
40
|
+
*
|
|
41
|
+
* `mapCentre` answers `null` rather than a coordinate for an empty fleet, and
|
|
42
|
+
* that refusal has to survive the whole way down. `MapPreview` has no default
|
|
43
|
+
* centre — it resolves `center || coordinates || { lat: 0, lng: 0 }` — so
|
|
44
|
+
* forwarding `undefined` sails the map to the Gulf of Guinea and prints
|
|
45
|
+
* `Lat: 0.000000` under a default pin. That is exactly the render the helper
|
|
46
|
+
* exists to prevent, and it is reachable: a board that is `loading` with
|
|
47
|
+
* nothing yet reported skips the empty state by design and lands here.
|
|
48
|
+
*/
|
|
49
|
+
export declare function FleetCanvas({ copy, centre, markers, height, testId, }: FleetCanvasProps): React.JSX.Element | null;
|
|
50
|
+
//# sourceMappingURL=FleetCanvas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FleetCanvas.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/FleetMap/FleetCanvas.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAI1B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,YAAY,CAAC;IACnB,yEAAyE;IACzE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AACH,wBAAgB,WAAW,CAAC,EAC1B,IAAI,EACJ,MAAM,EACN,OAAO,EACP,MAAM,EACN,MAAM,GACP,EAAE,gBAAgB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAmB7C"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE CONTRACT BOTH `FleetMap` RENDERERS HONOUR — and nothing else.
|
|
3
|
+
*
|
|
4
|
+
* This file imports no MUI and no react-native, on purpose: it ships in BOTH
|
|
5
|
+
* declaration outputs (`dist/types` and `dist/types-native`), and a native
|
|
6
|
+
* consumer has no `@mui/material` to resolve a type import against.
|
|
7
|
+
*
|
|
8
|
+
* What is NOT here is as deliberate as what is. `map` (the map control bar's
|
|
9
|
+
* six words) lives on the web copy alone, because the map half is web-only
|
|
10
|
+
* until `MapPreview` is ported — see `NATIVE-NOTES.md`. A native caller that
|
|
11
|
+
* had to supply words for a bar no renderer draws would be asked to describe
|
|
12
|
+
* something it cannot see.
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* One tracked unit's newest position, as the caller resolved it.
|
|
16
|
+
*
|
|
17
|
+
* Deliberately says nothing about WHAT is being tracked. A courier, a service
|
|
18
|
+
* van, a field engineer — the component draws a labelled dot with a freshness,
|
|
19
|
+
* and every word that names the domain arrives through the copy object.
|
|
20
|
+
*/
|
|
21
|
+
export interface FleetUnit {
|
|
22
|
+
id: string;
|
|
23
|
+
/** The name a human reads, on the pin and in the roster. */
|
|
24
|
+
label: string;
|
|
25
|
+
latitude: number;
|
|
26
|
+
longitude: number;
|
|
27
|
+
/**
|
|
28
|
+
* The fix's accuracy radius in metres, when the platform reported one.
|
|
29
|
+
*
|
|
30
|
+
* Kept because it is what separates a rooftop GPS fix from a cell-tower guess
|
|
31
|
+
* three blocks wide, and a map that draws both identically tells its reader
|
|
32
|
+
* something false.
|
|
33
|
+
*/
|
|
34
|
+
accuracyM?: number | null;
|
|
35
|
+
/**
|
|
36
|
+
* Seconds since the fix was ACCEPTED, on the server's clock.
|
|
37
|
+
*
|
|
38
|
+
* The caller computes it, and the distinction matters: a device whose own
|
|
39
|
+
* clock is an hour slow would otherwise report itself as an hour stale while
|
|
40
|
+
* reporting perfectly.
|
|
41
|
+
*/
|
|
42
|
+
staleSeconds: number;
|
|
43
|
+
/** A short pre-formatted badge beside the name, e.g. `"2 entregas"`. */
|
|
44
|
+
badge?: string;
|
|
45
|
+
}
|
|
46
|
+
/** How current a unit's newest fix is, derived from the thresholds below. */
|
|
47
|
+
export type FleetFreshness = 'live' | 'lagging' | 'stale';
|
|
48
|
+
/**
|
|
49
|
+
* Every word the board prints, and the two it FORMATS — minus the map's own.
|
|
50
|
+
*
|
|
51
|
+
* `lastSeen` and `accuracy` are functions rather than strings because a
|
|
52
|
+
* duration and a distance are locale rules, and this package holds the same
|
|
53
|
+
* line `StatCard` does: presentation only, the caller owns the formatting. A
|
|
54
|
+
* `lastSeenMinutes: string` template would have made "há 2 min" the only
|
|
55
|
+
* shape any consumer could ever render.
|
|
56
|
+
*/
|
|
57
|
+
export interface FleetMapCopyBase {
|
|
58
|
+
/** The panel's heading. */
|
|
59
|
+
title: string;
|
|
60
|
+
/** What the roster says when nobody is reporting. */
|
|
61
|
+
emptyTitle: string;
|
|
62
|
+
emptyDescription?: string;
|
|
63
|
+
/** The roster list's accessible name — it is the map's readable half. */
|
|
64
|
+
rosterLabel: string;
|
|
65
|
+
/**
|
|
66
|
+
* What a screen reader hears while the roster reloads, e.g. "Atualizando a
|
|
67
|
+
* frota". OPTIONAL, and silence is the honest default: the busy state marks
|
|
68
|
+
* the region stale without uttering anything, the skeletons are hidden from
|
|
69
|
+
* the reader, and this component cannot invent the sentence in the reader's
|
|
70
|
+
* language. Set it and the panel announces politely; leave it and it stays
|
|
71
|
+
* quiet.
|
|
72
|
+
*
|
|
73
|
+
* Announced on a TRANSITION into loading. A board mounted already loading is
|
|
74
|
+
* silent — as any live region is at mount, since there is no change for a
|
|
75
|
+
* reader to observe.
|
|
76
|
+
*/
|
|
77
|
+
loading?: string;
|
|
78
|
+
/** The three freshness words, as a reader sees them on a row. */
|
|
79
|
+
freshness: Record<FleetFreshness, string>;
|
|
80
|
+
/** `(seconds) => "há 2 min"`. */
|
|
81
|
+
lastSeen: (staleSeconds: number) => string;
|
|
82
|
+
/** `(metres) => "±12 m"`. A unit with no accuracy renders none. */
|
|
83
|
+
accuracy: (metres: number) => string;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* The props both renderers take.
|
|
87
|
+
*
|
|
88
|
+
* `height` and `className` are NOT here: the first is a CSS length the web
|
|
89
|
+
* gives the map, and the second is a DOM class. Each side declares its own
|
|
90
|
+
* layout escape hatch beside its own extras.
|
|
91
|
+
*/
|
|
92
|
+
export interface FleetMapBaseProps {
|
|
93
|
+
/** Everyone currently reporting. An empty array renders the empty state. */
|
|
94
|
+
units: readonly FleetUnit[];
|
|
95
|
+
/**
|
|
96
|
+
* Which unit is highlighted: the roster marks it selected, and on the web the
|
|
97
|
+
* map centres on it. `null` selects nobody.
|
|
98
|
+
*
|
|
99
|
+
* PASSING IT AT ALL IS THE DECISION. Present on the first render — `null`
|
|
100
|
+
* included — and the board is controlled for life: it renders what you pass
|
|
101
|
+
* and never moves the selection itself. Absent on the first render and it
|
|
102
|
+
* keeps its own, reporting each change through {@link onSelect}. The mode is
|
|
103
|
+
* latched on that first render, the way React latches an `<input>`, so the
|
|
104
|
+
* component cannot change its own semantics halfway through a session.
|
|
105
|
+
*
|
|
106
|
+
* A controlled board reads `undefined` as "nobody is selected", so
|
|
107
|
+
* `useState<string>()` in the caller behaves: clearing it clears the roster.
|
|
108
|
+
*/
|
|
109
|
+
selectedId?: string | null;
|
|
110
|
+
/**
|
|
111
|
+
* A click or press on a row, and each arrow-key move on the web.
|
|
112
|
+
*
|
|
113
|
+
* Passing {@link selectedId} WITHOUT this is a selection nothing can move:
|
|
114
|
+
* the arrow keys then decline to act and leave the page to scroll, rather
|
|
115
|
+
* than swallowing a keypress that would do nothing.
|
|
116
|
+
*/
|
|
117
|
+
onSelect?: (id: string) => void;
|
|
118
|
+
/**
|
|
119
|
+
* Seconds after which a unit stops reading as `live`, and then as `lagging`.
|
|
120
|
+
*
|
|
121
|
+
* Both carry a GENERIC default (90s and 300s, sized for a phone reporting
|
|
122
|
+
* every twenty seconds) and no domain one, because the answer is entirely a
|
|
123
|
+
* property of the fleet's own ping cadence: a phone reporting every twenty
|
|
124
|
+
* seconds is late at ninety, and a tracker reporting every five minutes is
|
|
125
|
+
* not. A component that picked one would be picking it for every consumer.
|
|
126
|
+
*/
|
|
127
|
+
laggingAfterSeconds?: number;
|
|
128
|
+
staleAfterSeconds?: number;
|
|
129
|
+
/**
|
|
130
|
+
* While true the roster is marked busy, and renders skeletons IF no units
|
|
131
|
+
* have landed yet — a poll over a populated roster keeps the list, because
|
|
132
|
+
* unmounting it throws away the focus inside it.
|
|
133
|
+
*
|
|
134
|
+
* It only ANNOUNCES if the copy's `loading` sentence is set: busy is a state,
|
|
135
|
+
* not an utterance.
|
|
136
|
+
*/
|
|
137
|
+
loading?: boolean;
|
|
138
|
+
/** Test id for the panel root; every child id is derived from it. */
|
|
139
|
+
dataTestId?: string;
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=FleetMap.base.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FleetMap.base.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/FleetMap/FleetMap.base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;;;;;;GAMG;AACH,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,4DAA4D;IAC5D,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B;;;;;;OAMG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB,wEAAwE;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,6EAA6E;AAC7E,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;AAE1D;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB;IAC/B,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yEAAyE;IACzE,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,SAAS,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IAC1C,iCAAiC;IACjC,QAAQ,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,MAAM,CAAC;IAC3C,mEAAmE;IACnE,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;CACtC;AAED;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,4EAA4E;IAC5E,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;IAC5B;;;;;;;;;;;;;OAaG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B;;;;;;OAMG;IACH,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IAChC;;;;;;;;OAQG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { FleetMapProps } from './FleetMap.types';
|
|
3
|
+
/**
|
|
4
|
+
* FleetMap — where a set of tracked units is right now, as a map beside the
|
|
5
|
+
* roster that reads it.
|
|
6
|
+
*
|
|
7
|
+
* Product-free by construction: it draws labelled dots with a freshness, and
|
|
8
|
+
* every word — the heading, the three freshness states, how a duration and a
|
|
9
|
+
* distance are written — arrives through {@link FleetMapProps.copy}. Couriers,
|
|
10
|
+
* service vans and field engineers are all the same picture.
|
|
11
|
+
*
|
|
12
|
+
* ## Three decisions worth knowing before changing it
|
|
13
|
+
*
|
|
14
|
+
* **The roster is the accessible representation, not a sidebar.** A map is a
|
|
15
|
+
* picture and a screen reader cannot read one, so the list carries the
|
|
16
|
+
* information: everything a sighted user gets from a pin — who, how recently,
|
|
17
|
+
* what they are carrying — is on the row. The map is a NAMED region rather than
|
|
18
|
+
* an `aria-hidden` one, because its controls are focusable and hiding a
|
|
19
|
+
* focusable subtree is the `aria-hidden-focus` violation.
|
|
20
|
+
*
|
|
21
|
+
* **Nothing here formats.** `lastSeen` and `accuracy` are functions on the copy
|
|
22
|
+
* object, the same line `StatCard` holds for its `value`: a duration and a
|
|
23
|
+
* distance are locale rules, and a component that wrote "2 min ago" would have
|
|
24
|
+
* made English the only language it could ever render.
|
|
25
|
+
*
|
|
26
|
+
* **An empty fleet is an empty STATE, not an empty map.** A map with no pins is
|
|
27
|
+
* indistinguishable from a map that failed to load, and the difference is the
|
|
28
|
+
* whole question a dispatcher is asking.
|
|
29
|
+
*/
|
|
30
|
+
export declare const FleetMap: React.FC<FleetMapProps>;
|
|
31
|
+
export default FleetMap;
|
|
32
|
+
//# sourceMappingURL=FleetMap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FleetMap.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/FleetMap/FleetMap.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,MAAM,OAAO,CAAC;AAY1B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AA6CtD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,eAAO,MAAM,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAuE5C,CAAC;AAIF,eAAe,QAAQ,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { FleetMapCopy, FleetUnit } from './FleetMap.types';
|
|
2
|
+
/**
|
|
3
|
+
* The copy and the fleet every story and test story shares.
|
|
4
|
+
*
|
|
5
|
+
* A module rather than a per-story literal, so a change to the shape breaks in
|
|
6
|
+
* ONE place rather than in fourteen — and so the test stories assert against
|
|
7
|
+
* the same words the visual ones render.
|
|
8
|
+
*/
|
|
9
|
+
/** English, because stories are developer-facing. A consumer passes its own. */
|
|
10
|
+
export declare const FLEET_COPY: FleetMapCopy;
|
|
11
|
+
/**
|
|
12
|
+
* Three riders around São Paulo, one in each freshness state.
|
|
13
|
+
*
|
|
14
|
+
* Deliberately NOT in staleness order, and the labels deliberately do not agree
|
|
15
|
+
* with it either. `rosterOrder` sorts on staleness and breaks ties on the
|
|
16
|
+
* label, so a fixture whose two orders coincide lets the roster's ordering
|
|
17
|
+
* assertion pass against a LABEL-only sort as readily as the real one — a test
|
|
18
|
+
* reporting coverage it does not have. Here the three orders are all different:
|
|
19
|
+
* declared is [ale, ana, bruno], alphabetical is the same, and the correct
|
|
20
|
+
* answer is [ana, bruno, ale].
|
|
21
|
+
*/
|
|
22
|
+
export declare const FLEET: FleetUnit[];
|
|
23
|
+
//# sourceMappingURL=FleetMap.fixtures.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FleetMap.fixtures.d.ts","sourceRoot":"","sources":["../../../../../src/components/data-display/FleetMap/FleetMap.fixtures.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAEhE;;;;;;GAMG;AAEH,gFAAgF;AAChF,eAAO,MAAM,UAAU,EAAE,YAgBxB,CAAC;AAEF;;;;;;;;;;GAUG;AACH,eAAO,MAAM,KAAK,EAAE,SAAS,EA2B5B,CAAC"}
|