@12-apps/ui 6.39.19 → 6.40.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/components-guidelines.md +110 -0
- package/dist/_internal/components/data-display/Alert/Alert.js +3 -2
- package/dist/_internal/components/data-display/Alert/Alert.metrics.js +3 -2
- package/dist/_internal/components/data-display/Alert/Alert.styles.js +3 -2
- package/dist/_internal/components/data-display/AsyncStateContainer/AsyncStateContainer.js +3 -3
- package/dist/_internal/components/data-display/Avatar/Avatar.js +3 -3
- package/dist/_internal/components/data-display/Avatar/Avatar.view.js +2 -2
- package/dist/_internal/components/data-display/Badge/Badge.js +9 -7
- package/dist/_internal/components/data-display/Badge/Badge.styles.js +7 -5
- package/dist/_internal/components/data-display/Badge/BadgeContent.js +8 -6
- package/dist/_internal/components/data-display/Banner/Banner.js +3 -2
- package/dist/_internal/components/data-display/Banner/Banner.styles.js +3 -2
- package/dist/_internal/components/data-display/CardKit/CardKebab.js +8 -7
- package/dist/_internal/components/data-display/CardKit/card-actions-context.js +3 -2
- package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js +12 -11
- package/dist/_internal/components/data-display/CardKit/use-row-confirm.js +12 -11
- package/dist/_internal/components/data-display/Carousel/Carousel.chrome.js +8 -6
- package/dist/_internal/components/data-display/Carousel/Carousel.js +12 -10
- package/dist/_internal/components/data-display/Carousel/Carousel.parts.js +7 -5
- package/dist/_internal/components/data-display/Carousel/Carousel.styles.js +7 -5
- package/dist/_internal/components/data-display/Chart/Chart.js +11 -9
- package/dist/_internal/components/data-display/Chart/SpecChart.js +14 -12
- package/dist/_internal/components/data-display/Chart/chart-context.js +8 -6
- package/dist/_internal/components/data-display/Chart/chart-internals.js +7 -5
- package/dist/_internal/components/data-display/Chart/chart-renderers.js +10 -8
- package/dist/_internal/components/data-display/Chart/chart-spec.js +2 -2
- package/dist/_internal/components/data-display/DataGrid/DataGrid.js +3 -3
- package/dist/_internal/components/data-display/DataViews/DataViewsBoard.js +6 -5
- package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +67 -66
- package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +90 -89
- package/dist/_internal/components/data-display/DataViews/DeleteViewDialog.js +13 -12
- package/dist/_internal/components/data-display/DataViews/ManageViewsDialog.js +17 -16
- package/dist/_internal/components/data-display/DataViews/SaveViewModal.js +22 -21
- package/dist/_internal/components/data-display/DataViews/base-card.js +9 -8
- package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +11 -10
- package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +10 -9
- package/dist/_internal/components/data-display/DataViews/base-list-card.js +17 -16
- package/dist/_internal/components/data-display/DataViews/data-views-bar-controls.js +3 -3
- package/dist/_internal/components/data-display/DataViews/data-views-category-pill.js +19 -19
- package/dist/_internal/components/data-display/DataViews/data-views-columns-tab.js +6 -5
- package/dist/_internal/components/data-display/DataViews/data-views-columns.js +9 -8
- package/dist/_internal/components/data-display/DataViews/data-views-day-input.js +3 -3
- package/dist/_internal/components/data-display/DataViews/data-views-display-panel.js +15 -14
- package/dist/_internal/components/data-display/DataViews/data-views-display-tabs.js +8 -7
- package/dist/_internal/components/data-display/DataViews/data-views-empty.js +10 -9
- package/dist/_internal/components/data-display/DataViews/data-views-export.js +10 -9
- package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +25 -25
- package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +19 -18
- package/dist/_internal/components/data-display/DataViews/data-views-grid-helpers.js +8 -7
- package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +63 -62
- package/dist/_internal/components/data-display/DataViews/data-views-header-row.js +6 -5
- package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +36 -35
- package/dist/_internal/components/data-display/DataViews/data-views-layout-context.js +2 -2
- package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +19 -18
- package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +23 -22
- package/dist/_internal/components/data-display/DataViews/data-views-number-input.js +3 -3
- package/dist/_internal/components/data-display/DataViews/data-views-pagination.js +5 -5
- package/dist/_internal/components/data-display/DataViews/data-views-range-pill.js +7 -7
- package/dist/_internal/components/data-display/DataViews/data-views-scope-tabs.js +3 -3
- package/dist/_internal/components/data-display/DataViews/data-views-search.js +3 -3
- package/dist/_internal/components/data-display/DataViews/data-views-select-all-strip.js +10 -9
- package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +26 -25
- package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +35 -34
- package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +25 -24
- package/dist/_internal/components/data-display/DataViews/data-views-view-nav.js +10 -9
- package/dist/_internal/components/data-display/DataViews/list-card-rails.js +3 -3
- package/dist/_internal/components/data-display/DataViews/save-view-preview.js +6 -5
- package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +12 -11
- package/dist/_internal/components/data-display/DataViews/use-saved-views-controller.js +3 -3
- package/dist/_internal/components/data-display/DescriptionItem/DescriptionItem.js +6 -5
- package/dist/_internal/components/data-display/EmptyState/EmptyState.js +2 -2
- package/dist/_internal/components/data-display/FleetMap/FleetBody.js +14 -14
- package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js +13 -13
- package/dist/_internal/components/data-display/FleetMap/FleetMap.js +22 -20
- package/dist/_internal/components/data-display/InteractiveTooltip/InteractiveTooltip.js +2 -2
- package/dist/_internal/components/data-display/LazyImage/LazyImage.hooks.js +1 -1
- package/dist/_internal/components/data-display/LazyImage/LazyImage.js +2 -2
- package/dist/_internal/components/data-display/Lightbox/Lightbox.js +6 -6
- package/dist/_internal/components/data-display/MapPreview/MapDecorations.js +2 -2
- package/dist/_internal/components/data-display/MapPreview/MapLayers.js +4 -4
- package/dist/_internal/components/data-display/MapPreview/MapPreview.hooks.js +2 -2
- package/dist/_internal/components/data-display/MapPreview/MapPreview.js +12 -12
- package/dist/_internal/components/data-display/MapPreview/MapSearchBar.js +3 -3
- 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 +6 -5
- package/dist/_internal/components/data-display/Progress/Progress.metrics.js +4 -3
- package/dist/_internal/components/data-display/Progress/Progress.styles.js +5 -4
- package/dist/_internal/components/data-display/SectionOnboarding/SectionOnboarding.js +3 -3
- package/dist/_internal/components/data-display/Sheet/Sheet.body.js +6 -4
- package/dist/_internal/components/data-display/Sheet/Sheet.js +8 -6
- package/dist/_internal/components/data-display/Sheet/Sheet.styles.js +7 -5
- package/dist/_internal/components/data-display/Table/Table.js +5 -5
- package/dist/_internal/components/data-display/Table/TableParts.hooks.js +2 -2
- package/dist/_internal/components/data-display/Table/TableParts.js +2 -2
- package/dist/_internal/components/data-display/index.js +78 -76
- package/dist/_internal/components/feedback/ConfirmAction/ConfirmAction.js +2 -2
- package/dist/_internal/components/feedback/ConfirmAction/ConfirmButton.js +10 -9
- package/dist/_internal/components/feedback/ConfirmAction/with-confirmation.js +2 -2
- package/dist/_internal/components/feedback/Dialog/Dialog.js +3 -3
- package/dist/_internal/components/feedback/Modal/Modal.js +2 -2
- package/dist/_internal/components/feedback/NotificationStatusNotice/NotificationStatusNotice.js +8 -7
- package/dist/_internal/components/feedback/index.js +19 -18
- package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.js +9 -9
- package/dist/_internal/components/form/AddressAutocomplete/AddressAutocompleteField.js +6 -6
- package/dist/_internal/components/form/AddressAutocomplete/AddressFallbackField.js +4 -4
- package/dist/_internal/components/form/AddressAutocomplete/AddressInputField.js +4 -4
- package/dist/_internal/components/form/AddressAutocomplete/AddressTextField.js +3 -3
- package/dist/_internal/components/form/Autocomplete/Autocomplete.js +4 -4
- package/dist/_internal/components/form/Autocomplete/Autocomplete.parts.js +3 -3
- package/dist/_internal/components/form/Button/Button.js +7 -6
- package/dist/_internal/components/form/Button/Button.styles.js +5 -4
- 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 +9 -9
- package/dist/_internal/components/form/CategorySelect/CategoryPanelFoot.js +4 -4
- package/dist/_internal/components/form/CategorySelect/CategoryPanelHead.js +4 -4
- package/dist/_internal/components/form/CategorySelect/CategoryPanelList.js +6 -6
- package/dist/_internal/components/form/CategorySelect/CategoryRows.js +5 -5
- package/dist/_internal/components/form/CategorySelect/CategorySelect.js +11 -11
- package/dist/_internal/components/form/CategorySelect/CategorySelect.styles.js +3 -3
- package/dist/_internal/components/form/CategorySelect/CategoryTrigger.js +4 -4
- package/dist/_internal/components/form/CepField/CepField.js +6 -6
- package/dist/_internal/components/form/CodeEditor/CodeEditor.js +1 -1
- package/dist/_internal/components/form/Command/Command.js +8 -6
- package/dist/_internal/components/form/Command/Command.styles.js +7 -5
- package/dist/_internal/components/form/CreatableSelect/CreatableSelect.js +3 -3
- package/dist/_internal/components/form/DateRangePicker/DateRangePicker.hooks.js +5 -5
- package/dist/_internal/components/form/DateRangePicker/DateRangePicker.js +12 -12
- package/dist/_internal/components/form/DateRangePicker/DateRangePicker.range.js +4 -4
- package/dist/_internal/components/form/DateRangePicker/DateRangePickerFields.js +5 -5
- package/dist/_internal/components/form/Input/Input.js +5 -5
- package/dist/_internal/components/form/Input/Input.metrics.js +2 -2
- package/dist/_internal/components/form/Input/Input.styles.js +4 -4
- package/dist/_internal/components/form/InputOTP/InputOTP.js +4 -4
- package/dist/_internal/components/form/InputOTP/InputOTP.styles.js +3 -3
- package/dist/_internal/components/form/Label/Label.js +8 -6
- package/dist/_internal/components/form/Label/Label.styles.js +7 -5
- package/dist/_internal/components/form/Menubar/Menubar.item.js +8 -6
- package/dist/_internal/components/form/Menubar/Menubar.js +10 -8
- package/dist/_internal/components/form/Menubar/Menubar.styles.js +7 -5
- package/dist/_internal/components/form/Menubar/Menubar.toolbar.js +9 -7
- package/dist/_internal/components/form/PhoneInput/PhoneInput.js +3 -3
- package/dist/_internal/components/form/RadioGroup/RadioGroup.js +5 -5
- package/dist/_internal/components/form/RadioGroup/RadioGroup.styles.js +3 -3
- package/dist/_internal/components/form/RadioGroup/RadioGroup.variants.js +4 -4
- package/dist/_internal/components/form/RichTextEditor/RichTextEditor.js +2 -2
- package/dist/_internal/components/form/Select/Select.js +4 -4
- package/dist/_internal/components/form/Select/Select.metrics.js +2 -2
- package/dist/_internal/components/form/Switch/Switch.js +8 -7
- package/dist/_internal/components/form/Switch/Switch.parts.js +6 -5
- package/dist/_internal/components/form/Switch/Switch.styles.js +5 -4
- package/dist/_internal/components/form/Textarea/Textarea.js +3 -3
- package/dist/_internal/components/form/Textarea/TextareaRichEditor.js +2 -2
- package/dist/_internal/components/form/Toggle/Toggle.js +4 -4
- package/dist/_internal/components/form/Toggle/Toggle.styles.js +3 -3
- package/dist/_internal/components/form/ToggleGroup/ToggleGroup.js +3 -3
- package/dist/_internal/components/form/UploadButton/UploadButton.js +2 -2
- package/dist/_internal/components/form/index.js +62 -60
- package/dist/_internal/components/form/total-form/Fields/CategoryField.js +12 -12
- package/dist/_internal/components/form/total-form/Fields/CepField.js +7 -7
- package/dist/_internal/components/form/total-form/Fields/SelectField.js +5 -5
- package/dist/_internal/components/form/total-form/Fields/TextField.js +6 -6
- package/dist/_internal/components/form/total-form/Fields/ToggleField.js +4 -4
- package/dist/_internal/components/form/total-form/Fields/index.js +23 -23
- package/dist/_internal/components/form/total-form/SubmitButton.js +8 -7
- package/dist/_internal/components/index.js +180 -178
- package/dist/_internal/components/layout/Box/Box.js +9 -7
- package/dist/_internal/components/layout/Card/Card.js +2 -2
- package/dist/_internal/components/layout/ContentToolbar/ColumnsMenu.js +3 -3
- package/dist/_internal/components/layout/ContentToolbar/FilterTrigger.js +3 -3
- package/dist/_internal/components/layout/ContentToolbar/MultiSelectDropdown.js +4 -4
- package/dist/_internal/components/layout/ContentToolbar/MultiSelectTriggers.js +3 -3
- package/dist/_internal/components/layout/ContentToolbar/SavedViewsMenu.js +3 -3
- package/dist/_internal/components/layout/ContentToolbar/SortByDropdown.js +3 -3
- package/dist/_internal/components/layout/ContentToolbar/ViewSelector.js +3 -3
- package/dist/_internal/components/layout/Separator/Separator.js +3 -3
- package/dist/_internal/components/layout/Separator/Separator.styles.js +2 -2
- package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.js +6 -6
- package/dist/_internal/components/layout/SettingsLayout/SettingsPanel.js +4 -4
- package/dist/_internal/components/layout/SettingsLayout/SettingsSectionChips.js +2 -2
- package/dist/_internal/components/layout/Stack/Stack.js +10 -8
- package/dist/_internal/components/layout/TableFilter/TableFilter.js +3 -3
- package/dist/_internal/components/layout/index.js +16 -16
- package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js +15 -13
- package/dist/_internal/components/navigation/AppHeader/AppHeader.identity.js +7 -5
- package/dist/_internal/components/navigation/CommandPalette/CommandPalette.js +3 -3
- package/dist/_internal/components/navigation/NavigationMenu/NavigationMegaSection.js +2 -2
- package/dist/_internal/components/navigation/NavigationMenu/NavigationMenu.js +4 -4
- package/dist/_internal/components/navigation/NavigationMenu/NavigationStandardBody.js +2 -2
- package/dist/_internal/components/navigation/Pagination/Pagination.js +4 -4
- package/dist/_internal/components/navigation/Pagination/PaginationParts.js +3 -3
- package/dist/_internal/components/navigation/Tabs/Tabs.js +4 -4
- package/dist/_internal/components/navigation/Tabs/Tabs.styles.js +3 -3
- package/dist/_internal/components/navigation/index.js +31 -29
- package/dist/_internal/components/typography/Heading/Heading.js +6 -5
- package/dist/_internal/components/typography/Heading/Heading.metrics.js +4 -3
- package/dist/_internal/components/typography/Heading/Heading.styles.js +5 -4
- package/dist/_internal/components/typography/Text/Text.js +5 -4
- package/dist/_internal/components/typography/Text/Text.metrics.js +4 -3
- package/dist/_internal/components/typography/index.js +8 -7
- package/dist/_internal/components/utility/InstallPrompt/InstallPrompt.js +1 -1
- package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.helpers.js +6 -4
- package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.js +6 -4
- package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.parts.js +6 -4
- package/dist/_internal/components/utility/WorkflowStep/WorkflowStepRow.js +6 -4
- package/dist/_internal/components/utility/index.js +7 -5
- package/dist/_internal/icons/Icon.js +9 -7
- package/dist/_internal/provider/UiProvider.js +8 -6
- package/dist/_internal/provider/mui-bridge.js +7 -5
- package/dist/_internal/provider/use-ui-theme.js +8 -6
- package/dist/_internal/social-login-button/social-login-button.js +17 -16
- package/dist/_internal/tokens/density.core.js +18 -0
- package/dist/_internal/tokens/density.core.js.map +1 -0
- package/dist/_internal/tokens/density.js +31 -0
- package/dist/_internal/tokens/density.js.map +1 -0
- package/dist/_internal/tokens/field-height.core.js +1 -1
- package/dist/_internal/tokens/field-height.js +6 -4
- package/dist/_internal/tokens/theme.js +3 -2
- package/dist/_internal/user-avatar/user-avatar.js +15 -14
- package/dist/charts.js +23 -21
- package/dist/{chunk-N23GCN5U.js → chunk-23XBBGWD.js} +2 -2
- package/dist/{chunk-HVXIOIM5.js → chunk-2MLS6KU4.js} +2 -2
- package/dist/{chunk-BSUG4KMP.js → chunk-2Q5QHSU2.js} +8 -8
- package/dist/{chunk-GMUYCN33.js → chunk-2TSGRQ2J.js} +34 -14
- package/dist/chunk-2TSGRQ2J.js.map +1 -0
- package/dist/{chunk-MCJRHF7Z.js → chunk-2XTBGZSR.js} +10 -10
- package/dist/{chunk-IASDP44E.js → chunk-3AOOI2NR.js} +6 -6
- package/dist/{chunk-7DK6YVJU.js → chunk-3B4YMZD5.js} +2 -2
- package/dist/{chunk-TCV3N44E.js → chunk-3CLBGHTL.js} +2 -2
- package/dist/{chunk-YTY7TD7S.js → chunk-3HKUOLPD.js} +5 -5
- package/dist/{chunk-DFCQQN6P.js → chunk-3PGFMBEI.js} +2 -2
- package/dist/{chunk-NLYNRE7L.js → chunk-3RUCLKAK.js} +4 -4
- package/dist/{chunk-HWSS6C7C.js → chunk-3UXBIUJF.js} +8 -8
- package/dist/{chunk-DJYL2LC6.js → chunk-44Z72DDM.js} +2 -2
- package/dist/{chunk-4WCDMCIS.js → chunk-4CHYMTBT.js} +4 -4
- package/dist/{chunk-FNRPQE2D.js → chunk-4D2IVVHR.js} +2 -2
- package/dist/{chunk-M2Q5CLPU.js → chunk-4JEXYOSN.js} +4 -4
- package/dist/{chunk-HN3PZTUK.js → chunk-4MKVGSHX.js} +5 -5
- package/dist/{chunk-3LSIFHQK.js → chunk-4RXPIHJG.js} +2 -2
- package/dist/{chunk-OQRG34VG.js → chunk-4SHMSLFA.js} +2 -2
- package/dist/{chunk-SLDSWQVE.js → chunk-4SSWJRC4.js} +6 -6
- package/dist/{chunk-FNG33MKA.js → chunk-4UASV6VL.js} +2 -2
- package/dist/{chunk-YTINPQKU.js → chunk-4XHVGUOM.js} +2 -2
- package/dist/{chunk-WZNTZX5N.js → chunk-53TDQYA3.js} +4 -4
- package/dist/{chunk-67O4GPJJ.js → chunk-5A4XPYNK.js} +2 -2
- package/dist/{chunk-OHZU4IT3.js → chunk-5B7BTLN4.js} +2 -2
- package/dist/{chunk-K5V6TCYB.js → chunk-5ETBB2DG.js} +4 -4
- package/dist/{chunk-UMNXSQ7I.js → chunk-5K4G2XYS.js} +2 -2
- package/dist/{chunk-5752357K.js → chunk-5KGABAQB.js} +4 -4
- package/dist/{chunk-JKIKHWD2.js → chunk-5NT2M2JI.js} +4 -4
- package/dist/{chunk-BKASAYQL.js → chunk-5XWCKCHP.js} +8 -8
- package/dist/{chunk-JYR6VV4Y.js → chunk-6BS2RBW4.js} +5 -5
- package/dist/{chunk-HQZRI7UX.js → chunk-6N2EDWMG.js} +4 -4
- package/dist/{chunk-NOKN4HRK.js → chunk-6PPHALM3.js} +2 -2
- package/dist/{chunk-H224XFFD.js → chunk-6REPQ352.js} +2 -2
- package/dist/{chunk-THMT3G3L.js → chunk-743SY4WQ.js} +4 -4
- package/dist/{chunk-KJDBY2KN.js → chunk-7LILFS72.js} +2 -2
- package/dist/{chunk-AG3DY5TH.js → chunk-ADSA76T7.js} +2 -2
- package/dist/{chunk-JH5BKA3Y.js → chunk-AHDNANID.js} +26 -8
- package/dist/chunk-AHDNANID.js.map +1 -0
- package/dist/{chunk-KN4ZE2XZ.js → chunk-AJVFSUC4.js} +19 -19
- package/dist/{chunk-VY2BMSHN.js → chunk-ANYOSBNA.js} +2 -2
- package/dist/{chunk-4WF6ZLIW.js → chunk-APPIPQFT.js} +8 -8
- package/dist/{chunk-YUXDVW62.js → chunk-AQCQ2USS.js} +2 -2
- package/dist/{chunk-37USSARD.js → chunk-AU3GV6UL.js} +4 -4
- package/dist/{chunk-KN5J3NEZ.js → chunk-AW336SO7.js} +2 -2
- package/dist/{chunk-ME3WYPYK.js → chunk-BDBI4W77.js} +5 -5
- package/dist/{chunk-4NPPO63U.js → chunk-BKHO4RSF.js} +5 -5
- package/dist/{chunk-PCLKFR27.js → chunk-BKT2KJ56.js} +8 -8
- package/dist/{chunk-HM2JJNUE.js → chunk-BLUURKCY.js} +5 -5
- package/dist/{chunk-UKX3MPB7.js → chunk-BXEMC4YH.js} +2 -2
- package/dist/{chunk-H6AWKLOV.js → chunk-C6FVXX7Y.js} +2 -2
- package/dist/{chunk-CYZZHWNK.js → chunk-CJ45OL7L.js} +2 -2
- package/dist/{chunk-2S752BIJ.js → chunk-CKI33CN2.js} +2 -2
- package/dist/{chunk-KKN4LLVE.js → chunk-CKPFLEOL.js} +3 -3
- package/dist/{chunk-GC56IWIZ.js → chunk-CLSC36JS.js} +9 -9
- package/dist/{chunk-RDCHT2WN.js → chunk-CLTK76ZF.js} +2 -2
- package/dist/{chunk-EA2UNEL6.js → chunk-CNR5RFKC.js} +2 -2
- package/dist/{chunk-O25SH2MA.js → chunk-COUFRGD6.js} +7 -7
- package/dist/{chunk-MBHWVRV5.js → chunk-D455V3BW.js} +5 -5
- package/dist/{chunk-7X7ZHJHM.js → chunk-DDVNYVJH.js} +2 -2
- package/dist/{chunk-P52LYD6S.js → chunk-DFI2RKVQ.js} +2 -2
- package/dist/{chunk-IRD45DRW.js → chunk-DOLDAAXH.js} +3 -3
- package/dist/{chunk-TEEJ4GNY.js → chunk-DUITNU72.js} +2 -2
- package/dist/{chunk-J5UZB6Y6.js → chunk-E2FMNY6B.js} +2 -2
- package/dist/{chunk-5HDYTTE7.js → chunk-EDBVMLNX.js} +2 -2
- package/dist/{chunk-5CQNBMLK.js → chunk-EKM7C4X2.js} +4 -4
- package/dist/{chunk-L566FMDD.js → chunk-EO5IEWFI.js} +6 -6
- package/dist/{chunk-VY6L74JQ.js → chunk-EQXIW5MQ.js} +4 -4
- package/dist/{chunk-CGO452DC.js → chunk-EXFX3JRN.js} +10 -7
- package/dist/{chunk-CGO452DC.js.map → chunk-EXFX3JRN.js.map} +1 -1
- package/dist/{chunk-6PU3JYVY.js → chunk-F3AYISXT.js} +4 -4
- package/dist/{chunk-IBGP3VSR.js → chunk-FHW3ATT7.js} +2 -2
- package/dist/{chunk-3UABIEP3.js → chunk-FI6BL4UU.js} +2 -2
- package/dist/{chunk-WL6N33AB.js → chunk-FIO55AKI.js} +4 -4
- package/dist/{chunk-Z43N7ASP.js → chunk-FRTEU7ZO.js} +2 -2
- package/dist/{chunk-WB6ZU3B3.js → chunk-FYZJEME4.js} +6 -6
- package/dist/{chunk-IGGXKT5B.js → chunk-G2WERTWZ.js} +2 -2
- package/dist/{chunk-T6EKPFKZ.js → chunk-G3SKAI6S.js} +2 -2
- package/dist/{chunk-WY5PBZ7Q.js → chunk-G6ZPQHBL.js} +2 -2
- package/dist/{chunk-IQJCLFF4.js → chunk-GANW7FXQ.js} +2 -2
- package/dist/{chunk-PA3AA55Q.js → chunk-GBEHJBYM.js} +2 -2
- package/dist/{chunk-ZXSWXE6U.js → chunk-GE26GVHM.js} +5 -5
- package/dist/{chunk-7D2C4LK2.js → chunk-GJ7GIGDS.js} +4 -4
- package/dist/{chunk-7ICK5MXV.js → chunk-GJFAI3J5.js} +10 -10
- package/dist/{chunk-5FAI25JQ.js → chunk-GPT673YL.js} +3 -3
- package/dist/{chunk-QXSW3CNN.js → chunk-GVFPOKJW.js} +2 -2
- package/dist/{chunk-VPPIODKX.js → chunk-H772ZSAI.js} +2 -2
- package/dist/{chunk-DRSY37PB.js → chunk-HDELNMZC.js} +2 -2
- package/dist/{chunk-M4QXG5JP.js → chunk-HQWJUHR4.js} +4 -4
- package/dist/{chunk-K7FSTB2K.js → chunk-HSNOWYEE.js} +2 -2
- package/dist/{chunk-OJ2XR3WH.js → chunk-HZBRXLV7.js} +2 -2
- package/dist/{chunk-BUPDBEBA.js → chunk-I72PREY7.js} +2 -2
- package/dist/{chunk-TXEN3QJ4.js → chunk-IEWAFD6L.js} +2 -2
- package/dist/{chunk-ZBVU2YWV.js → chunk-IITZA6U2.js} +9 -9
- package/dist/{chunk-4BNV5AAI.js → chunk-ITFFA3H2.js} +3 -3
- package/dist/{chunk-RB3X6CEE.js → chunk-IWGW2E35.js} +2 -2
- package/dist/{chunk-RTEY5COP.js → chunk-JB56E4XQ.js} +4 -4
- package/dist/{chunk-7EH4D6FU.js → chunk-JDUIWHJ3.js} +2 -2
- package/dist/{chunk-FLDLUAHW.js → chunk-JE6GQB5J.js} +4 -4
- package/dist/{chunk-35443PF6.js → chunk-JIRZ27RI.js} +2 -2
- package/dist/{chunk-5MW7OYBM.js → chunk-JSGVYOMN.js} +2 -2
- package/dist/{chunk-RNIU447I.js → chunk-JU3FRRO2.js} +2 -2
- package/dist/{chunk-LXT3X33C.js → chunk-JZ5IGO5G.js} +2 -2
- package/dist/{chunk-GEB4WSZH.js → chunk-K2U4BNHQ.js} +3 -3
- package/dist/{chunk-WOAXKWAB.js → chunk-K4A3JDYQ.js} +2 -2
- package/dist/{chunk-2OWKL4CC.js → chunk-KCDNOMMT.js} +9 -9
- package/dist/{chunk-4WNFOBTH.js → chunk-KOX2AEFW.js} +2 -2
- package/dist/{chunk-ZGCPDA3F.js → chunk-KQS4ZJGS.js} +5 -5
- package/dist/{chunk-2K7WPHI3.js → chunk-KW3H5FUS.js} +2 -2
- package/dist/{chunk-I4MRBEWU.js → chunk-KZT5JC3E.js} +12 -12
- package/dist/{chunk-VRPREI27.js → chunk-L75CZ3SI.js} +2 -2
- package/dist/{chunk-YZ2DMP23.js → chunk-LJSKF43D.js} +2 -2
- package/dist/{chunk-62UAI62O.js → chunk-LPWIAVGP.js} +2 -2
- package/dist/{chunk-3CTQZDSD.js → chunk-MKJHDHLF.js} +4 -4
- package/dist/{chunk-URHX4FAQ.js → chunk-MKLIMY3D.js} +2 -2
- package/dist/{chunk-2FM5SUQV.js → chunk-MM5XSAVE.js} +2 -2
- package/dist/{chunk-ORRI6FMN.js → chunk-MT7QJRP7.js} +3 -3
- package/dist/{chunk-CRG24BGI.js → chunk-N4D5V3AA.js} +2 -2
- package/dist/{chunk-FNO5TWBJ.js → chunk-NCEQWEXT.js} +4 -4
- package/dist/{chunk-FWPFCK4D.js → chunk-NDHDBOUH.js} +4 -4
- package/dist/{chunk-JC22FNFA.js → chunk-NFJ3VVD3.js} +2 -2
- package/dist/{chunk-2622YFM6.js → chunk-NSVSC6ZC.js} +6 -6
- package/dist/{chunk-66O55OZI.js → chunk-NYFGFELX.js} +2 -2
- package/dist/{chunk-PZBK3F52.js → chunk-O6MJWHU5.js} +3 -3
- package/dist/chunk-O6MJWHU5.js.map +1 -0
- package/dist/{chunk-2LIRGFEK.js → chunk-O7OQZJ3D.js} +2 -2
- package/dist/{chunk-TGXCG62P.js → chunk-OPT7X3Y6.js} +2 -2
- package/dist/{chunk-WN5PNP6F.js → chunk-OTWMG7B2.js} +4 -4
- package/dist/{chunk-EYZ6QBTV.js → chunk-OXLOC6TC.js} +3 -3
- package/dist/{chunk-4T6UIYJB.js → chunk-OZGJ3YCN.js} +2 -2
- package/dist/{chunk-JXECOCNA.js → chunk-P6Q2O3TU.js} +2 -2
- package/dist/{chunk-YMTZN54Q.js → chunk-P7JF6XT7.js} +2 -2
- package/dist/{chunk-ZN6YATOG.js → chunk-PAT2BQOQ.js} +2 -2
- package/dist/{chunk-TZBOWSAM.js → chunk-PICOOZLX.js} +6 -6
- package/dist/{chunk-JJJM75XF.js → chunk-PNDYAIKM.js} +2 -2
- package/dist/{chunk-EJYJLVPK.js → chunk-PRLYYKMG.js} +3 -3
- package/dist/{chunk-M4KVKQRN.js → chunk-Q33JWFSA.js} +3 -3
- package/dist/{chunk-VJ2BNJ5M.js → chunk-QMELMQPA.js} +4 -4
- package/dist/{chunk-HDJQDMHB.js → chunk-QMHS6ZDI.js} +2 -2
- package/dist/{chunk-O2DLEAUP.js → chunk-QQ46JX5H.js} +4 -4
- package/dist/{chunk-2WVHZIWP.js → chunk-QSRZOXQI.js} +2 -2
- package/dist/{chunk-BRM3T4LQ.js → chunk-QUFKPCWD.js} +6 -6
- package/dist/{chunk-DF4QODJ6.js → chunk-QUIHOPOC.js} +6 -6
- package/dist/{chunk-BVF2BSWV.js → chunk-QWFAEUFV.js} +28 -10
- package/dist/chunk-QWFAEUFV.js.map +1 -0
- package/dist/{chunk-4GB46HLK.js → chunk-QX3CXOJ3.js} +2 -2
- package/dist/{chunk-C3LZ3OGJ.js → chunk-R2FUQV24.js} +2 -2
- package/dist/{chunk-GOWBYHYW.js → chunk-R6SBP5M5.js} +4 -4
- package/dist/{chunk-36JKV7CA.js → chunk-RNC574FS.js} +3 -3
- package/dist/{chunk-4RPFI474.js → chunk-RSDYS5B3.js} +6 -6
- package/dist/{chunk-X4F32GUB.js → chunk-RSWHKOUN.js} +2 -2
- package/dist/{chunk-6RLCBNDV.js → chunk-RUZVK4FV.js} +7 -7
- package/dist/{chunk-X53F33KA.js → chunk-RWXYND4H.js} +2 -2
- package/dist/{chunk-PWZHCBG3.js → chunk-SBV62CSC.js} +2 -2
- package/dist/{chunk-W5TI46QN.js → chunk-SCVBGQFO.js} +3 -3
- package/dist/{chunk-MXCIUKTQ.js → chunk-SDBBJ6FG.js} +4 -4
- package/dist/{chunk-WRCLYSTX.js → chunk-SE4WZIKD.js} +2 -2
- package/dist/{chunk-GY4NBSCN.js → chunk-SE6TW72O.js} +2 -2
- package/dist/{chunk-LP3JCXER.js → chunk-SNW5MJ6I.js} +2 -2
- package/dist/{chunk-5OBGW3FG.js → chunk-STTULW2K.js} +2 -2
- package/dist/{chunk-NR5TW4AH.js → chunk-SXVCXLKU.js} +3 -3
- package/dist/{chunk-MQ277OLB.js → chunk-T2HZ3GVA.js} +8 -8
- package/dist/{chunk-57FZM6GH.js → chunk-T7UUP7VD.js} +2 -2
- package/dist/{chunk-FBUCXTA4.js → chunk-TJ7NQG7E.js} +4 -4
- package/dist/{chunk-I5ZVCY2N.js → chunk-TJPQIFI4.js} +6 -6
- package/dist/{chunk-Y6C4MYZE.js → chunk-TNQDSTIA.js} +7 -7
- package/dist/chunk-TRTX4BDI.js +35 -0
- package/dist/chunk-TRTX4BDI.js.map +1 -0
- package/dist/{chunk-MLQYIJTO.js → chunk-U6W2RY3Z.js} +5 -5
- package/dist/{chunk-LNHYBA4B.js → chunk-UFUMYNKS.js} +2 -2
- package/dist/{chunk-FY6PONLA.js → chunk-UI5O6J6R.js} +4 -4
- package/dist/{chunk-J3XFUCCR.js → chunk-UP6RO2PR.js} +12 -12
- package/dist/{chunk-Y6G4I42P.js → chunk-V3RQFWL6.js} +2 -2
- package/dist/{chunk-ZWCYSAI5.js → chunk-V7A5ZAAF.js} +5 -5
- package/dist/chunk-VBP46YP4.js +42 -0
- package/dist/chunk-VBP46YP4.js.map +1 -0
- package/dist/{chunk-S6JHTEV4.js → chunk-VE3P77TV.js} +3 -3
- package/dist/{chunk-KHPL2J3B.js → chunk-VPAOVEI2.js} +3 -3
- package/dist/{chunk-FERUQ7OB.js → chunk-VYA4QWQL.js} +2 -2
- package/dist/{chunk-ZUME25DS.js → chunk-WGUY7EIB.js} +5 -5
- package/dist/{chunk-N7LPVR7P.js → chunk-WL2S2YB3.js} +4 -4
- package/dist/{chunk-G3XLFQ2Z.js → chunk-WRHBXOGN.js} +3 -3
- package/dist/{chunk-DYGWKZ7T.js → chunk-WTXPGASQ.js} +3 -3
- package/dist/{chunk-OAW6GCS3.js → chunk-WUFTDJ2L.js} +3 -3
- package/dist/{chunk-2JNHWKQK.js → chunk-WUQKXAYF.js} +12 -12
- package/dist/{chunk-B7CNP5HW.js → chunk-WV62BSWA.js} +2 -2
- package/dist/{chunk-JK5UJM4Y.js → chunk-WY35GCHY.js} +9 -9
- package/dist/{chunk-IWEUSZY3.js → chunk-X66E5WSX.js} +3 -3
- package/dist/{chunk-F4KYBBTY.js → chunk-XLXMJ6X2.js} +3 -3
- package/dist/{chunk-JRJCBDGN.js → chunk-XOZYUJQ5.js} +4 -4
- package/dist/{chunk-PARTZ7XI.js → chunk-XP522FFM.js} +2 -2
- package/dist/{chunk-A2TANYNR.js → chunk-XXPEFK4V.js} +7 -7
- package/dist/{chunk-YKEO6UHN.js → chunk-XZJM6EPC.js} +4 -4
- package/dist/{chunk-BLW6KLDR.js → chunk-YFODI4KT.js} +11 -4
- package/dist/chunk-YFODI4KT.js.map +1 -0
- package/dist/{chunk-QOLIBVGS.js → chunk-YGYQC7MT.js} +4 -4
- package/dist/{chunk-U4QUDFPJ.js → chunk-Z4O3F6KU.js} +4 -4
- package/dist/{chunk-DSF4VT7L.js → chunk-ZE56GK5C.js} +3 -3
- package/dist/{chunk-LEHMWJNZ.js → chunk-ZEYUSS3W.js} +5 -5
- package/dist/{chunk-TU5A2CV7.js → chunk-ZFUOLLZS.js} +4 -4
- package/dist/{chunk-S36NC22G.js → chunk-ZK7YERPQ.js} +2 -2
- package/dist/{chunk-SCZABICW.js → chunk-ZO4NO77T.js} +2 -2
- package/dist/{chunk-TCAQOUIB.js → chunk-ZSTSISM6.js} +1 -1
- package/dist/chunk-ZSTSISM6.js.map +1 -0
- package/dist/data-display/Alert.js +3 -2
- package/dist/data-display/AsyncStateContainer.js +3 -3
- package/dist/data-display/Avatar.js +3 -3
- package/dist/data-display/Badge.js +9 -7
- package/dist/data-display/Banner.js +3 -2
- package/dist/data-display/CardKit.js +16 -15
- package/dist/data-display/Carousel.js +12 -10
- package/dist/data-display/Chart.js +23 -21
- package/dist/data-display/DataGrid.js +3 -3
- package/dist/data-display/DataViews.js +112 -111
- package/dist/data-display/DescriptionItem.js +6 -5
- package/dist/data-display/EmptyState.js +2 -2
- package/dist/data-display/FleetMap.js +22 -20
- package/dist/data-display/InteractiveTooltip.js +2 -2
- package/dist/data-display/LazyImage.js +2 -2
- package/dist/data-display/Lightbox.js +6 -6
- package/dist/data-display/MapPreview.js +12 -12
- package/dist/data-display/Progress.js +6 -5
- package/dist/data-display/SectionOnboarding.js +3 -3
- package/dist/data-display/Sheet.js +8 -6
- package/dist/data-display/Table.js +5 -5
- package/dist/feedback/ConfirmAction.js +13 -12
- package/dist/feedback/Dialog.js +3 -3
- package/dist/feedback/Modal.js +2 -2
- package/dist/feedback/NotificationStatusNotice.js +8 -7
- package/dist/form/AddressAutocomplete.js +9 -9
- package/dist/form/Autocomplete.js +4 -4
- package/dist/form/Button.js +7 -6
- package/dist/form/Calendar.js +4 -4
- package/dist/form/CategorySelect.js +11 -11
- package/dist/form/CepField.js +6 -6
- package/dist/form/CodeEditor.js +2 -2
- package/dist/form/Command.js +8 -6
- package/dist/form/CreatableSelect.js +3 -3
- package/dist/form/DateRangePicker.js +12 -12
- package/dist/form/Input.js +5 -5
- package/dist/form/InputOTP.js +4 -4
- package/dist/form/Label.js +8 -6
- package/dist/form/Menubar.js +10 -8
- package/dist/form/PhoneInput.js +3 -3
- package/dist/form/RadioGroup.js +5 -5
- package/dist/form/RichTextEditor.js +2 -2
- package/dist/form/Select.js +4 -4
- package/dist/form/Switch.js +8 -7
- package/dist/form/Textarea.js +3 -3
- package/dist/form/Toggle.js +4 -4
- package/dist/form/ToggleGroup.js +3 -3
- package/dist/form/UploadButton.js +2 -2
- package/dist/form/total-form.js +34 -33
- package/dist/icons.js +9 -7
- package/dist/layout/Box.js +9 -7
- package/dist/layout/Card.js +2 -2
- package/dist/layout/ContentToolbar.js +11 -11
- package/dist/layout/Separator.js +3 -3
- package/dist/layout/SettingsLayout.js +7 -7
- package/dist/layout/Stack.js +10 -8
- package/dist/layout/TableFilter.js +3 -3
- package/dist/native/chunks/{chunk-ONXKFA5Z.js → chunk-A2QNZ4VK.js} +4 -4
- package/dist/native/chunks/{chunk-X6RQGKGF.js → chunk-BST5DUUD.js} +2 -2
- package/dist/native/chunks/{chunk-GUBTMR2K.js → chunk-EDYZEMVD.js} +2 -2
- package/dist/native/chunks/{chunk-SZF56GVJ.js → chunk-LECBJD35.js} +3 -3
- package/dist/native/chunks/{chunk-JBYDLWQA.js → chunk-MTRRGDBQ.js} +5 -5
- package/dist/native/chunks/{chunk-IMGBBIMT.js → chunk-PN7C2BEY.js} +2 -2
- package/dist/native/chunks/{chunk-R5XVZRDD.js → chunk-RADD26LG.js} +46 -5
- package/dist/native/chunks/chunk-RADD26LG.js.map +1 -0
- package/dist/native/chunks/{chunk-4ZAULIDG.js → chunk-S4F364X4.js} +3 -3
- package/dist/native/chunks/{chunk-5IASLIBI.js → chunk-VJFKRXY2.js} +2 -2
- package/dist/native/data-display/Alert.js +3 -3
- package/dist/native/data-display/Avatar.js +3 -3
- package/dist/native/data-display/Badge.js +3 -3
- package/dist/native/data-display/Chip.js +3 -3
- package/dist/native/data-display/EmptyState.js +6 -6
- package/dist/native/data-display/ErrorState.js +5 -5
- package/dist/native/data-display/FleetMap.js +7 -7
- package/dist/native/data-display/LoadingState.js +2 -2
- package/dist/native/data-display/Progress.js +2 -2
- package/dist/native/feedback/Dialog.js +3 -3
- package/dist/native/form/Button.js +4 -4
- package/dist/native/form/Checkbox.js +3 -3
- package/dist/native/form/Input.js +4 -4
- package/dist/native/form/Select.js +5 -5
- package/dist/native/form/Switch.js +2 -2
- package/dist/native/icons.js +3 -3
- package/dist/native/layout/Box.js +3 -3
- package/dist/native/layout/Card.js +2 -2
- package/dist/native/layout/Container.js +2 -2
- package/dist/native/layout/Skeleton.js +3 -3
- package/dist/native/layout/Spacer.js +2 -2
- package/dist/native/layout/Stack.js +3 -3
- package/dist/native/provider.js +2 -2
- package/dist/native/tokens.js +15 -3
- package/dist/native/typography/Heading.js +2 -2
- package/dist/native/typography/Paragraph.js +2 -2
- package/dist/native/typography/Text.js +2 -2
- package/dist/navigation/AppHeader.js +21 -19
- package/dist/navigation/CommandPalette.js +3 -3
- package/dist/navigation/NavigationMenu.js +4 -4
- package/dist/navigation/Pagination.js +4 -4
- package/dist/navigation/Tabs.js +4 -4
- package/dist/provider.js +9 -7
- package/dist/social-login-button.js +17 -16
- package/dist/tokens.js +28 -6
- package/dist/types/components/data-display/LazyImage/LazyImage.d.ts.map +1 -1
- package/dist/types/components/data-display/LazyImage/LazyImage.hooks.d.ts +1 -1
- package/dist/types/components/data-display/LazyImage/LazyImage.hooks.d.ts.map +1 -1
- package/dist/types/provider/mui-bridge.d.ts.map +1 -1
- package/dist/types/tokens/density.core.d.ts +73 -0
- package/dist/types/tokens/density.core.d.ts.map +1 -0
- package/dist/types/tokens/density.d.ts +95 -0
- package/dist/types/tokens/density.d.ts.map +1 -0
- package/dist/types/tokens/field-height.core.d.ts +7 -2
- package/dist/types/tokens/field-height.core.d.ts.map +1 -1
- package/dist/types/tokens/field-height.d.ts +9 -0
- package/dist/types/tokens/field-height.d.ts.map +1 -1
- package/dist/types/tokens/scales.d.ts +2 -1
- package/dist/types/tokens/scales.d.ts.map +1 -1
- package/dist/types/tokens/theme.d.ts +30 -0
- package/dist/types/tokens/theme.d.ts.map +1 -1
- package/dist/types-native/tokens/density.core.d.ts +73 -0
- package/dist/types-native/tokens/density.core.d.ts.map +1 -0
- package/dist/types-native/tokens/field-height.core.d.ts +7 -2
- package/dist/types-native/tokens/field-height.core.d.ts.map +1 -1
- package/dist/types-native/tokens/index.native.d.ts +1 -0
- package/dist/types-native/tokens/index.native.d.ts.map +1 -1
- package/dist/types-native/tokens/theme.d.ts +30 -0
- package/dist/types-native/tokens/theme.d.ts.map +1 -1
- package/dist/typography/Heading.js +6 -5
- package/dist/typography/Text.js +5 -4
- package/dist/user-avatar.js +15 -14
- package/dist/utility/InstallPrompt.js +1 -1
- package/dist/utility/WorkflowStep.js +6 -4
- package/package.json +1 -1
- package/src/components/data-display/LazyImage/LazyImage.hooks.ts +64 -15
- package/src/components/data-display/LazyImage/LazyImage.md +3 -42
- package/src/components/data-display/LazyImage/LazyImage.tsx +44 -8
- package/src/provider/mui-bridge.ts +17 -3
- package/src/tokens/density.core.ts +118 -0
- package/src/tokens/density.ts +134 -0
- package/src/tokens/field-height.core.ts +8 -3
- package/src/tokens/field-height.ts +19 -8
- package/src/tokens/index.native.ts +11 -0
- package/src/tokens/scales.ts +15 -0
- package/src/tokens/theme.ts +43 -2
- package/dist/chunk-BLW6KLDR.js.map +0 -1
- package/dist/chunk-BVF2BSWV.js.map +0 -1
- package/dist/chunk-GMUYCN33.js.map +0 -1
- package/dist/chunk-JH5BKA3Y.js.map +0 -1
- package/dist/chunk-PZBK3F52.js.map +0 -1
- package/dist/chunk-TCAQOUIB.js.map +0 -1
- package/dist/native/chunks/chunk-R5XVZRDD.js.map +0 -1
- /package/dist/{chunk-N23GCN5U.js.map → chunk-23XBBGWD.js.map} +0 -0
- /package/dist/{chunk-HVXIOIM5.js.map → chunk-2MLS6KU4.js.map} +0 -0
- /package/dist/{chunk-BSUG4KMP.js.map → chunk-2Q5QHSU2.js.map} +0 -0
- /package/dist/{chunk-MCJRHF7Z.js.map → chunk-2XTBGZSR.js.map} +0 -0
- /package/dist/{chunk-IASDP44E.js.map → chunk-3AOOI2NR.js.map} +0 -0
- /package/dist/{chunk-7DK6YVJU.js.map → chunk-3B4YMZD5.js.map} +0 -0
- /package/dist/{chunk-TCV3N44E.js.map → chunk-3CLBGHTL.js.map} +0 -0
- /package/dist/{chunk-YTY7TD7S.js.map → chunk-3HKUOLPD.js.map} +0 -0
- /package/dist/{chunk-DFCQQN6P.js.map → chunk-3PGFMBEI.js.map} +0 -0
- /package/dist/{chunk-NLYNRE7L.js.map → chunk-3RUCLKAK.js.map} +0 -0
- /package/dist/{chunk-HWSS6C7C.js.map → chunk-3UXBIUJF.js.map} +0 -0
- /package/dist/{chunk-DJYL2LC6.js.map → chunk-44Z72DDM.js.map} +0 -0
- /package/dist/{chunk-4WCDMCIS.js.map → chunk-4CHYMTBT.js.map} +0 -0
- /package/dist/{chunk-FNRPQE2D.js.map → chunk-4D2IVVHR.js.map} +0 -0
- /package/dist/{chunk-M2Q5CLPU.js.map → chunk-4JEXYOSN.js.map} +0 -0
- /package/dist/{chunk-HN3PZTUK.js.map → chunk-4MKVGSHX.js.map} +0 -0
- /package/dist/{chunk-3LSIFHQK.js.map → chunk-4RXPIHJG.js.map} +0 -0
- /package/dist/{chunk-OQRG34VG.js.map → chunk-4SHMSLFA.js.map} +0 -0
- /package/dist/{chunk-SLDSWQVE.js.map → chunk-4SSWJRC4.js.map} +0 -0
- /package/dist/{chunk-FNG33MKA.js.map → chunk-4UASV6VL.js.map} +0 -0
- /package/dist/{chunk-YTINPQKU.js.map → chunk-4XHVGUOM.js.map} +0 -0
- /package/dist/{chunk-WZNTZX5N.js.map → chunk-53TDQYA3.js.map} +0 -0
- /package/dist/{chunk-67O4GPJJ.js.map → chunk-5A4XPYNK.js.map} +0 -0
- /package/dist/{chunk-OHZU4IT3.js.map → chunk-5B7BTLN4.js.map} +0 -0
- /package/dist/{chunk-K5V6TCYB.js.map → chunk-5ETBB2DG.js.map} +0 -0
- /package/dist/{chunk-UMNXSQ7I.js.map → chunk-5K4G2XYS.js.map} +0 -0
- /package/dist/{chunk-5752357K.js.map → chunk-5KGABAQB.js.map} +0 -0
- /package/dist/{chunk-JKIKHWD2.js.map → chunk-5NT2M2JI.js.map} +0 -0
- /package/dist/{chunk-BKASAYQL.js.map → chunk-5XWCKCHP.js.map} +0 -0
- /package/dist/{chunk-JYR6VV4Y.js.map → chunk-6BS2RBW4.js.map} +0 -0
- /package/dist/{chunk-HQZRI7UX.js.map → chunk-6N2EDWMG.js.map} +0 -0
- /package/dist/{chunk-NOKN4HRK.js.map → chunk-6PPHALM3.js.map} +0 -0
- /package/dist/{chunk-H224XFFD.js.map → chunk-6REPQ352.js.map} +0 -0
- /package/dist/{chunk-THMT3G3L.js.map → chunk-743SY4WQ.js.map} +0 -0
- /package/dist/{chunk-KJDBY2KN.js.map → chunk-7LILFS72.js.map} +0 -0
- /package/dist/{chunk-AG3DY5TH.js.map → chunk-ADSA76T7.js.map} +0 -0
- /package/dist/{chunk-KN4ZE2XZ.js.map → chunk-AJVFSUC4.js.map} +0 -0
- /package/dist/{chunk-VY2BMSHN.js.map → chunk-ANYOSBNA.js.map} +0 -0
- /package/dist/{chunk-4WF6ZLIW.js.map → chunk-APPIPQFT.js.map} +0 -0
- /package/dist/{chunk-YUXDVW62.js.map → chunk-AQCQ2USS.js.map} +0 -0
- /package/dist/{chunk-37USSARD.js.map → chunk-AU3GV6UL.js.map} +0 -0
- /package/dist/{chunk-KN5J3NEZ.js.map → chunk-AW336SO7.js.map} +0 -0
- /package/dist/{chunk-ME3WYPYK.js.map → chunk-BDBI4W77.js.map} +0 -0
- /package/dist/{chunk-4NPPO63U.js.map → chunk-BKHO4RSF.js.map} +0 -0
- /package/dist/{chunk-PCLKFR27.js.map → chunk-BKT2KJ56.js.map} +0 -0
- /package/dist/{chunk-HM2JJNUE.js.map → chunk-BLUURKCY.js.map} +0 -0
- /package/dist/{chunk-UKX3MPB7.js.map → chunk-BXEMC4YH.js.map} +0 -0
- /package/dist/{chunk-H6AWKLOV.js.map → chunk-C6FVXX7Y.js.map} +0 -0
- /package/dist/{chunk-CYZZHWNK.js.map → chunk-CJ45OL7L.js.map} +0 -0
- /package/dist/{chunk-2S752BIJ.js.map → chunk-CKI33CN2.js.map} +0 -0
- /package/dist/{chunk-KKN4LLVE.js.map → chunk-CKPFLEOL.js.map} +0 -0
- /package/dist/{chunk-GC56IWIZ.js.map → chunk-CLSC36JS.js.map} +0 -0
- /package/dist/{chunk-RDCHT2WN.js.map → chunk-CLTK76ZF.js.map} +0 -0
- /package/dist/{chunk-EA2UNEL6.js.map → chunk-CNR5RFKC.js.map} +0 -0
- /package/dist/{chunk-O25SH2MA.js.map → chunk-COUFRGD6.js.map} +0 -0
- /package/dist/{chunk-MBHWVRV5.js.map → chunk-D455V3BW.js.map} +0 -0
- /package/dist/{chunk-7X7ZHJHM.js.map → chunk-DDVNYVJH.js.map} +0 -0
- /package/dist/{chunk-P52LYD6S.js.map → chunk-DFI2RKVQ.js.map} +0 -0
- /package/dist/{chunk-IRD45DRW.js.map → chunk-DOLDAAXH.js.map} +0 -0
- /package/dist/{chunk-TEEJ4GNY.js.map → chunk-DUITNU72.js.map} +0 -0
- /package/dist/{chunk-J5UZB6Y6.js.map → chunk-E2FMNY6B.js.map} +0 -0
- /package/dist/{chunk-5HDYTTE7.js.map → chunk-EDBVMLNX.js.map} +0 -0
- /package/dist/{chunk-5CQNBMLK.js.map → chunk-EKM7C4X2.js.map} +0 -0
- /package/dist/{chunk-L566FMDD.js.map → chunk-EO5IEWFI.js.map} +0 -0
- /package/dist/{chunk-VY6L74JQ.js.map → chunk-EQXIW5MQ.js.map} +0 -0
- /package/dist/{chunk-6PU3JYVY.js.map → chunk-F3AYISXT.js.map} +0 -0
- /package/dist/{chunk-IBGP3VSR.js.map → chunk-FHW3ATT7.js.map} +0 -0
- /package/dist/{chunk-3UABIEP3.js.map → chunk-FI6BL4UU.js.map} +0 -0
- /package/dist/{chunk-WL6N33AB.js.map → chunk-FIO55AKI.js.map} +0 -0
- /package/dist/{chunk-Z43N7ASP.js.map → chunk-FRTEU7ZO.js.map} +0 -0
- /package/dist/{chunk-WB6ZU3B3.js.map → chunk-FYZJEME4.js.map} +0 -0
- /package/dist/{chunk-IGGXKT5B.js.map → chunk-G2WERTWZ.js.map} +0 -0
- /package/dist/{chunk-T6EKPFKZ.js.map → chunk-G3SKAI6S.js.map} +0 -0
- /package/dist/{chunk-WY5PBZ7Q.js.map → chunk-G6ZPQHBL.js.map} +0 -0
- /package/dist/{chunk-IQJCLFF4.js.map → chunk-GANW7FXQ.js.map} +0 -0
- /package/dist/{chunk-PA3AA55Q.js.map → chunk-GBEHJBYM.js.map} +0 -0
- /package/dist/{chunk-ZXSWXE6U.js.map → chunk-GE26GVHM.js.map} +0 -0
- /package/dist/{chunk-7D2C4LK2.js.map → chunk-GJ7GIGDS.js.map} +0 -0
- /package/dist/{chunk-7ICK5MXV.js.map → chunk-GJFAI3J5.js.map} +0 -0
- /package/dist/{chunk-5FAI25JQ.js.map → chunk-GPT673YL.js.map} +0 -0
- /package/dist/{chunk-QXSW3CNN.js.map → chunk-GVFPOKJW.js.map} +0 -0
- /package/dist/{chunk-VPPIODKX.js.map → chunk-H772ZSAI.js.map} +0 -0
- /package/dist/{chunk-DRSY37PB.js.map → chunk-HDELNMZC.js.map} +0 -0
- /package/dist/{chunk-M4QXG5JP.js.map → chunk-HQWJUHR4.js.map} +0 -0
- /package/dist/{chunk-K7FSTB2K.js.map → chunk-HSNOWYEE.js.map} +0 -0
- /package/dist/{chunk-OJ2XR3WH.js.map → chunk-HZBRXLV7.js.map} +0 -0
- /package/dist/{chunk-BUPDBEBA.js.map → chunk-I72PREY7.js.map} +0 -0
- /package/dist/{chunk-TXEN3QJ4.js.map → chunk-IEWAFD6L.js.map} +0 -0
- /package/dist/{chunk-ZBVU2YWV.js.map → chunk-IITZA6U2.js.map} +0 -0
- /package/dist/{chunk-4BNV5AAI.js.map → chunk-ITFFA3H2.js.map} +0 -0
- /package/dist/{chunk-RB3X6CEE.js.map → chunk-IWGW2E35.js.map} +0 -0
- /package/dist/{chunk-RTEY5COP.js.map → chunk-JB56E4XQ.js.map} +0 -0
- /package/dist/{chunk-7EH4D6FU.js.map → chunk-JDUIWHJ3.js.map} +0 -0
- /package/dist/{chunk-FLDLUAHW.js.map → chunk-JE6GQB5J.js.map} +0 -0
- /package/dist/{chunk-35443PF6.js.map → chunk-JIRZ27RI.js.map} +0 -0
- /package/dist/{chunk-5MW7OYBM.js.map → chunk-JSGVYOMN.js.map} +0 -0
- /package/dist/{chunk-RNIU447I.js.map → chunk-JU3FRRO2.js.map} +0 -0
- /package/dist/{chunk-LXT3X33C.js.map → chunk-JZ5IGO5G.js.map} +0 -0
- /package/dist/{chunk-GEB4WSZH.js.map → chunk-K2U4BNHQ.js.map} +0 -0
- /package/dist/{chunk-WOAXKWAB.js.map → chunk-K4A3JDYQ.js.map} +0 -0
- /package/dist/{chunk-2OWKL4CC.js.map → chunk-KCDNOMMT.js.map} +0 -0
- /package/dist/{chunk-4WNFOBTH.js.map → chunk-KOX2AEFW.js.map} +0 -0
- /package/dist/{chunk-ZGCPDA3F.js.map → chunk-KQS4ZJGS.js.map} +0 -0
- /package/dist/{chunk-2K7WPHI3.js.map → chunk-KW3H5FUS.js.map} +0 -0
- /package/dist/{chunk-I4MRBEWU.js.map → chunk-KZT5JC3E.js.map} +0 -0
- /package/dist/{chunk-VRPREI27.js.map → chunk-L75CZ3SI.js.map} +0 -0
- /package/dist/{chunk-YZ2DMP23.js.map → chunk-LJSKF43D.js.map} +0 -0
- /package/dist/{chunk-62UAI62O.js.map → chunk-LPWIAVGP.js.map} +0 -0
- /package/dist/{chunk-3CTQZDSD.js.map → chunk-MKJHDHLF.js.map} +0 -0
- /package/dist/{chunk-URHX4FAQ.js.map → chunk-MKLIMY3D.js.map} +0 -0
- /package/dist/{chunk-2FM5SUQV.js.map → chunk-MM5XSAVE.js.map} +0 -0
- /package/dist/{chunk-ORRI6FMN.js.map → chunk-MT7QJRP7.js.map} +0 -0
- /package/dist/{chunk-CRG24BGI.js.map → chunk-N4D5V3AA.js.map} +0 -0
- /package/dist/{chunk-FNO5TWBJ.js.map → chunk-NCEQWEXT.js.map} +0 -0
- /package/dist/{chunk-FWPFCK4D.js.map → chunk-NDHDBOUH.js.map} +0 -0
- /package/dist/{chunk-JC22FNFA.js.map → chunk-NFJ3VVD3.js.map} +0 -0
- /package/dist/{chunk-2622YFM6.js.map → chunk-NSVSC6ZC.js.map} +0 -0
- /package/dist/{chunk-66O55OZI.js.map → chunk-NYFGFELX.js.map} +0 -0
- /package/dist/{chunk-2LIRGFEK.js.map → chunk-O7OQZJ3D.js.map} +0 -0
- /package/dist/{chunk-TGXCG62P.js.map → chunk-OPT7X3Y6.js.map} +0 -0
- /package/dist/{chunk-WN5PNP6F.js.map → chunk-OTWMG7B2.js.map} +0 -0
- /package/dist/{chunk-EYZ6QBTV.js.map → chunk-OXLOC6TC.js.map} +0 -0
- /package/dist/{chunk-4T6UIYJB.js.map → chunk-OZGJ3YCN.js.map} +0 -0
- /package/dist/{chunk-JXECOCNA.js.map → chunk-P6Q2O3TU.js.map} +0 -0
- /package/dist/{chunk-YMTZN54Q.js.map → chunk-P7JF6XT7.js.map} +0 -0
- /package/dist/{chunk-ZN6YATOG.js.map → chunk-PAT2BQOQ.js.map} +0 -0
- /package/dist/{chunk-TZBOWSAM.js.map → chunk-PICOOZLX.js.map} +0 -0
- /package/dist/{chunk-JJJM75XF.js.map → chunk-PNDYAIKM.js.map} +0 -0
- /package/dist/{chunk-EJYJLVPK.js.map → chunk-PRLYYKMG.js.map} +0 -0
- /package/dist/{chunk-M4KVKQRN.js.map → chunk-Q33JWFSA.js.map} +0 -0
- /package/dist/{chunk-VJ2BNJ5M.js.map → chunk-QMELMQPA.js.map} +0 -0
- /package/dist/{chunk-HDJQDMHB.js.map → chunk-QMHS6ZDI.js.map} +0 -0
- /package/dist/{chunk-O2DLEAUP.js.map → chunk-QQ46JX5H.js.map} +0 -0
- /package/dist/{chunk-2WVHZIWP.js.map → chunk-QSRZOXQI.js.map} +0 -0
- /package/dist/{chunk-BRM3T4LQ.js.map → chunk-QUFKPCWD.js.map} +0 -0
- /package/dist/{chunk-DF4QODJ6.js.map → chunk-QUIHOPOC.js.map} +0 -0
- /package/dist/{chunk-4GB46HLK.js.map → chunk-QX3CXOJ3.js.map} +0 -0
- /package/dist/{chunk-C3LZ3OGJ.js.map → chunk-R2FUQV24.js.map} +0 -0
- /package/dist/{chunk-GOWBYHYW.js.map → chunk-R6SBP5M5.js.map} +0 -0
- /package/dist/{chunk-36JKV7CA.js.map → chunk-RNC574FS.js.map} +0 -0
- /package/dist/{chunk-4RPFI474.js.map → chunk-RSDYS5B3.js.map} +0 -0
- /package/dist/{chunk-X4F32GUB.js.map → chunk-RSWHKOUN.js.map} +0 -0
- /package/dist/{chunk-6RLCBNDV.js.map → chunk-RUZVK4FV.js.map} +0 -0
- /package/dist/{chunk-X53F33KA.js.map → chunk-RWXYND4H.js.map} +0 -0
- /package/dist/{chunk-PWZHCBG3.js.map → chunk-SBV62CSC.js.map} +0 -0
- /package/dist/{chunk-W5TI46QN.js.map → chunk-SCVBGQFO.js.map} +0 -0
- /package/dist/{chunk-MXCIUKTQ.js.map → chunk-SDBBJ6FG.js.map} +0 -0
- /package/dist/{chunk-WRCLYSTX.js.map → chunk-SE4WZIKD.js.map} +0 -0
- /package/dist/{chunk-GY4NBSCN.js.map → chunk-SE6TW72O.js.map} +0 -0
- /package/dist/{chunk-LP3JCXER.js.map → chunk-SNW5MJ6I.js.map} +0 -0
- /package/dist/{chunk-5OBGW3FG.js.map → chunk-STTULW2K.js.map} +0 -0
- /package/dist/{chunk-NR5TW4AH.js.map → chunk-SXVCXLKU.js.map} +0 -0
- /package/dist/{chunk-MQ277OLB.js.map → chunk-T2HZ3GVA.js.map} +0 -0
- /package/dist/{chunk-57FZM6GH.js.map → chunk-T7UUP7VD.js.map} +0 -0
- /package/dist/{chunk-FBUCXTA4.js.map → chunk-TJ7NQG7E.js.map} +0 -0
- /package/dist/{chunk-I5ZVCY2N.js.map → chunk-TJPQIFI4.js.map} +0 -0
- /package/dist/{chunk-Y6C4MYZE.js.map → chunk-TNQDSTIA.js.map} +0 -0
- /package/dist/{chunk-MLQYIJTO.js.map → chunk-U6W2RY3Z.js.map} +0 -0
- /package/dist/{chunk-LNHYBA4B.js.map → chunk-UFUMYNKS.js.map} +0 -0
- /package/dist/{chunk-FY6PONLA.js.map → chunk-UI5O6J6R.js.map} +0 -0
- /package/dist/{chunk-J3XFUCCR.js.map → chunk-UP6RO2PR.js.map} +0 -0
- /package/dist/{chunk-Y6G4I42P.js.map → chunk-V3RQFWL6.js.map} +0 -0
- /package/dist/{chunk-ZWCYSAI5.js.map → chunk-V7A5ZAAF.js.map} +0 -0
- /package/dist/{chunk-S6JHTEV4.js.map → chunk-VE3P77TV.js.map} +0 -0
- /package/dist/{chunk-KHPL2J3B.js.map → chunk-VPAOVEI2.js.map} +0 -0
- /package/dist/{chunk-FERUQ7OB.js.map → chunk-VYA4QWQL.js.map} +0 -0
- /package/dist/{chunk-ZUME25DS.js.map → chunk-WGUY7EIB.js.map} +0 -0
- /package/dist/{chunk-N7LPVR7P.js.map → chunk-WL2S2YB3.js.map} +0 -0
- /package/dist/{chunk-G3XLFQ2Z.js.map → chunk-WRHBXOGN.js.map} +0 -0
- /package/dist/{chunk-DYGWKZ7T.js.map → chunk-WTXPGASQ.js.map} +0 -0
- /package/dist/{chunk-OAW6GCS3.js.map → chunk-WUFTDJ2L.js.map} +0 -0
- /package/dist/{chunk-2JNHWKQK.js.map → chunk-WUQKXAYF.js.map} +0 -0
- /package/dist/{chunk-B7CNP5HW.js.map → chunk-WV62BSWA.js.map} +0 -0
- /package/dist/{chunk-JK5UJM4Y.js.map → chunk-WY35GCHY.js.map} +0 -0
- /package/dist/{chunk-IWEUSZY3.js.map → chunk-X66E5WSX.js.map} +0 -0
- /package/dist/{chunk-F4KYBBTY.js.map → chunk-XLXMJ6X2.js.map} +0 -0
- /package/dist/{chunk-JRJCBDGN.js.map → chunk-XOZYUJQ5.js.map} +0 -0
- /package/dist/{chunk-PARTZ7XI.js.map → chunk-XP522FFM.js.map} +0 -0
- /package/dist/{chunk-A2TANYNR.js.map → chunk-XXPEFK4V.js.map} +0 -0
- /package/dist/{chunk-YKEO6UHN.js.map → chunk-XZJM6EPC.js.map} +0 -0
- /package/dist/{chunk-QOLIBVGS.js.map → chunk-YGYQC7MT.js.map} +0 -0
- /package/dist/{chunk-U4QUDFPJ.js.map → chunk-Z4O3F6KU.js.map} +0 -0
- /package/dist/{chunk-DSF4VT7L.js.map → chunk-ZE56GK5C.js.map} +0 -0
- /package/dist/{chunk-LEHMWJNZ.js.map → chunk-ZEYUSS3W.js.map} +0 -0
- /package/dist/{chunk-TU5A2CV7.js.map → chunk-ZFUOLLZS.js.map} +0 -0
- /package/dist/{chunk-S36NC22G.js.map → chunk-ZK7YERPQ.js.map} +0 -0
- /package/dist/{chunk-SCZABICW.js.map → chunk-ZO4NO77T.js.map} +0 -0
- /package/dist/native/chunks/{chunk-ONXKFA5Z.js.map → chunk-A2QNZ4VK.js.map} +0 -0
- /package/dist/native/chunks/{chunk-X6RQGKGF.js.map → chunk-BST5DUUD.js.map} +0 -0
- /package/dist/native/chunks/{chunk-GUBTMR2K.js.map → chunk-EDYZEMVD.js.map} +0 -0
- /package/dist/native/chunks/{chunk-SZF56GVJ.js.map → chunk-LECBJD35.js.map} +0 -0
- /package/dist/native/chunks/{chunk-JBYDLWQA.js.map → chunk-MTRRGDBQ.js.map} +0 -0
- /package/dist/native/chunks/{chunk-IMGBBIMT.js.map → chunk-PN7C2BEY.js.map} +0 -0
- /package/dist/native/chunks/{chunk-4ZAULIDG.js.map → chunk-S4F364X4.js.map} +0 -0
- /package/dist/native/chunks/{chunk-5IASLIBI.js.map → chunk-VJFKRXY2.js.map} +0 -0
|
@@ -21,7 +21,8 @@ type LazyImageDefaultedKeys =
|
|
|
21
21
|
| 'skeletonProps'
|
|
22
22
|
| 'spinnerProps'
|
|
23
23
|
| 'sx'
|
|
24
|
-
| 'role'
|
|
24
|
+
| 'role'
|
|
25
|
+
| 'data-testid';
|
|
25
26
|
|
|
26
27
|
export type ResolvedLazyImageProps = LazyImageProps &
|
|
27
28
|
Required<Pick<LazyImageProps, LazyImageDefaultedKeys>>;
|
|
@@ -43,6 +44,10 @@ const LAZY_IMAGE_DEFAULTS: Pick<LazyImageProps, LazyImageDefaultedKeys> = {
|
|
|
43
44
|
spinnerProps: {},
|
|
44
45
|
sx: {},
|
|
45
46
|
role: 'img',
|
|
47
|
+
// FUT-2774 #3: with no default, every derived id (`${testId}-img`, …) read
|
|
48
|
+
// literally as `"undefined-img"` for a caller that omitted it — and every
|
|
49
|
+
// such instance on a page collided on the same ids.
|
|
50
|
+
'data-testid': 'lazy-image',
|
|
46
51
|
};
|
|
47
52
|
|
|
48
53
|
// Strips explicitly-undefined props before the merge, so `lazy={undefined}` still
|
|
@@ -141,7 +146,7 @@ const usePlaceholderPhase = (
|
|
|
141
146
|
props: ResolvedLazyImageProps,
|
|
142
147
|
loadingState: NonNullable<LazyImageProps['loadingState']>,
|
|
143
148
|
) => {
|
|
144
|
-
const { placeholder, fadeIn, fadeInDuration } = props;
|
|
149
|
+
const { placeholder, fadeIn, fadeInDuration, src } = props;
|
|
145
150
|
// Only this mode draws a placeholder. Otherwise the real image settling
|
|
146
151
|
// retires the phase at once — batched into the load's own render, with no
|
|
147
152
|
// timer — so a placeholder switched on afterwards never covers a loaded image.
|
|
@@ -149,6 +154,18 @@ const usePlaceholderPhase = (
|
|
|
149
154
|
const [retired, setRetired] = useState(false);
|
|
150
155
|
const fadeTimeoutRef = useTimeoutRef();
|
|
151
156
|
|
|
157
|
+
// FUT-2774 #2: `retired` was set once and never reset, and this hook took
|
|
158
|
+
// no `src` at all — so a mounted instance reused for a NEW image (a
|
|
159
|
+
// carousel swapping `src` rather than remounting) never showed the
|
|
160
|
+
// placeholder again for it. Reset on every `src` change, the same way
|
|
161
|
+
// `useImageSource` already resets `currentSrc`/`isLoading`/`hasError`; drop
|
|
162
|
+
// any fade timer left over from the PREVIOUS image, or it would retire the
|
|
163
|
+
// new placeholder on a schedule that has nothing to do with it.
|
|
164
|
+
useEffect(() => {
|
|
165
|
+
clearTimeout(fadeTimeoutRef.current);
|
|
166
|
+
setRetired(false);
|
|
167
|
+
}, [src, fadeTimeoutRef]);
|
|
168
|
+
|
|
152
169
|
const retire = useCallback(() => setRetired(true), []);
|
|
153
170
|
|
|
154
171
|
// The real image fades in over the placeholder, so it goes when the fade ends.
|
|
@@ -186,23 +203,49 @@ const useImageSource = (
|
|
|
186
203
|
retryCount: 0,
|
|
187
204
|
currentSrc: lazy ? null : src,
|
|
188
205
|
});
|
|
206
|
+
// FUT-2774 #1: the last `src` PROP this hook has already requested — as
|
|
207
|
+
// opposed to `state.currentSrc`, which a retry deliberately diverges from
|
|
208
|
+
// `src` (its cache-busting query string) without a NEW image having
|
|
209
|
+
// arrived. Comparing the effect's guard against `src` itself let a retry's
|
|
210
|
+
// own state update immediately retrigger this effect, which overwrote the
|
|
211
|
+
// cache-busted value back to the plain `src` before the browser ever
|
|
212
|
+
// re-requested it — so `retryOnError` silently never re-fetched anything.
|
|
213
|
+
const requestedSrcRef = useRef<string | null>(lazy ? null : src);
|
|
214
|
+
// `handleImageError` (in `useLazyImage`) owns the retry timer itself, but
|
|
215
|
+
// it schedules against THIS src's identity: read together, the two hooks
|
|
216
|
+
// can tell a timeout meant for an image that is no longer the current one
|
|
217
|
+
// apart from one that still is (FUT-2774, src-changing-mid-retry).
|
|
218
|
+
const retryTimeoutRef = useTimeoutRef();
|
|
189
219
|
|
|
190
|
-
const markVisible = useCallback(
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
);
|
|
220
|
+
const markVisible = useCallback(() => {
|
|
221
|
+
requestedSrcRef.current = src;
|
|
222
|
+
setState((prev) => ({ ...prev, isVisible: true, currentSrc: src }));
|
|
223
|
+
}, [src]);
|
|
194
224
|
useVisibility(props, containerRef, state.isVisible, markVisible);
|
|
195
225
|
|
|
196
|
-
// Load image when it becomes visible
|
|
226
|
+
// Load image when it becomes visible, or when `src` itself changes to a
|
|
227
|
+
// genuinely new value — never when only `state.currentSrc` has (a retry).
|
|
197
228
|
useEffect(() => {
|
|
198
|
-
if (!state.isVisible || !src ||
|
|
229
|
+
if (!state.isVisible || !src || requestedSrcRef.current === src) {
|
|
199
230
|
return;
|
|
200
231
|
}
|
|
201
232
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
233
|
+
// A retry scheduled for the PREVIOUS src must not land on this one: left
|
|
234
|
+
// pending, its stale `setTimeout` would fire later and overwrite this
|
|
235
|
+
// fresh `currentSrc` with `${oldSrc}?retry=N` — cache-busting an image
|
|
236
|
+
// nothing asked for again, and never re-syncing back (FUT-2774).
|
|
237
|
+
clearTimeout(retryTimeoutRef.current);
|
|
238
|
+
requestedSrcRef.current = src;
|
|
239
|
+
setState((prev) => ({
|
|
240
|
+
...prev,
|
|
241
|
+
currentSrc: src,
|
|
242
|
+
isLoading: true,
|
|
243
|
+
hasError: false,
|
|
244
|
+
retryCount: 0,
|
|
245
|
+
}));
|
|
246
|
+
}, [state.isVisible, src, retryTimeoutRef]);
|
|
247
|
+
|
|
248
|
+
return { state, setState, requestedSrcRef, retryTimeoutRef };
|
|
206
249
|
};
|
|
207
250
|
|
|
208
251
|
/**
|
|
@@ -215,8 +258,7 @@ export const useLazyImage = (props: ResolvedLazyImageProps) => {
|
|
|
215
258
|
const { onLoad, onError, retryOnError, maxRetries, retryDelay } = props;
|
|
216
259
|
|
|
217
260
|
const containerRef = useRef<HTMLDivElement>(null);
|
|
218
|
-
const retryTimeoutRef =
|
|
219
|
-
const [state, setState] = useImageSource(props, containerRef);
|
|
261
|
+
const { state, setState, requestedSrcRef, retryTimeoutRef } = useImageSource(props, containerRef);
|
|
220
262
|
|
|
221
263
|
// Handle deprecated showSpinner prop
|
|
222
264
|
const effectiveLoadingState = showSpinner ? 'spinner' : loadingState;
|
|
@@ -244,6 +286,13 @@ export const useLazyImage = (props: ResolvedLazyImageProps) => {
|
|
|
244
286
|
}
|
|
245
287
|
|
|
246
288
|
retryTimeoutRef.current = setTimeout(() => {
|
|
289
|
+
// Belt and suspenders alongside `useImageSource`'s own cancel-on-src-
|
|
290
|
+
// change: if `src` moved on since this timeout was scheduled, this
|
|
291
|
+
// retry is for an image that is no longer live at all — applying it
|
|
292
|
+
// would cache-bust the WRONG `<img>` (FUT-2774).
|
|
293
|
+
if (requestedSrcRef.current !== src) {
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
247
296
|
setState((prev) => ({
|
|
248
297
|
...prev,
|
|
249
298
|
retryCount: prev.retryCount + 1,
|
|
@@ -251,7 +300,7 @@ export const useLazyImage = (props: ResolvedLazyImageProps) => {
|
|
|
251
300
|
}));
|
|
252
301
|
}, retryDelay);
|
|
253
302
|
},
|
|
254
|
-
[onError, retryOnError, state.retryCount, maxRetries, retryDelay, src, retirePlaceholder],
|
|
303
|
+
[onError, retryOnError, state.retryCount, maxRetries, retryDelay, src, retirePlaceholder, requestedSrcRef, retryTimeoutRef],
|
|
255
304
|
);
|
|
256
305
|
|
|
257
306
|
return {
|
|
@@ -16,7 +16,7 @@ The LazyImage component optimizes image loading performance by:
|
|
|
16
16
|
### Basic Usage
|
|
17
17
|
|
|
18
18
|
```tsx
|
|
19
|
-
import { LazyImage } from '@
|
|
19
|
+
import { LazyImage } from '@12-apps/ui';
|
|
20
20
|
|
|
21
21
|
function App() {
|
|
22
22
|
return (
|
|
@@ -225,7 +225,7 @@ wrapping element, rounded to match the image:
|
|
|
225
225
|
| Prop | Type | Default | Description |
|
|
226
226
|
|------|------|---------|-------------|
|
|
227
227
|
| `decoding` | `'async' \| 'sync' \| 'auto'` | `'async'` | Image decoding hint |
|
|
228
|
-
| `loading` | `'eager' \| 'lazy'
|
|
228
|
+
| `loading` | `'eager' \| 'lazy'` | - | Native `loading` attribute; independent of `lazy` (which gates the `IntersectionObserver`) |
|
|
229
229
|
| `fetchPriority` | `'high' \| 'low' \| 'auto'` | - | Fetch priority hint |
|
|
230
230
|
|
|
231
231
|
### Customization Props
|
|
@@ -334,48 +334,9 @@ The LazyImage component follows accessibility best practices:
|
|
|
334
334
|
1. **Lazy Loading**: Images load only when needed, reducing initial page load
|
|
335
335
|
2. **Intersection Observer**: Efficient viewport detection with configurable margins
|
|
336
336
|
3. **Progressive Loading**: Support for placeholder images during load
|
|
337
|
-
4. **Retry Logic**: Automatic retry for failed loads
|
|
337
|
+
4. **Retry Logic**: Automatic retry for failed loads, at a fixed `retryDelay` — the delay does NOT grow between attempts
|
|
338
338
|
5. **Native Loading**: Leverages browser's native lazy loading when available
|
|
339
339
|
|
|
340
|
-
## Migration from Original LazyImage
|
|
341
|
-
|
|
342
|
-
If migrating from the original LazyImage in status-site:
|
|
343
|
-
|
|
344
|
-
```tsx
|
|
345
|
-
// Old usage
|
|
346
|
-
import { LazyImage } from '../components/LazyImage';
|
|
347
|
-
|
|
348
|
-
<LazyImage
|
|
349
|
-
src="image.jpg"
|
|
350
|
-
alt="Description"
|
|
351
|
-
width={400}
|
|
352
|
-
height={300}
|
|
353
|
-
sx={{ borderRadius: 4 }}
|
|
354
|
-
/>
|
|
355
|
-
|
|
356
|
-
// New usage (fully backward compatible)
|
|
357
|
-
import { LazyImage } from '@app-services-monitoring/ui';
|
|
358
|
-
|
|
359
|
-
<LazyImage
|
|
360
|
-
src="image.jpg"
|
|
361
|
-
alt="Description"
|
|
362
|
-
width={400}
|
|
363
|
-
height={300}
|
|
364
|
-
sx={{ borderRadius: 4 }}
|
|
365
|
-
/>
|
|
366
|
-
```
|
|
367
|
-
|
|
368
|
-
### New Features Available After Migration
|
|
369
|
-
|
|
370
|
-
- Error handling with fallback
|
|
371
|
-
- Multiple loading states
|
|
372
|
-
- Retry mechanism
|
|
373
|
-
- Placeholder support
|
|
374
|
-
- Spinner overlay option
|
|
375
|
-
- Event callbacks
|
|
376
|
-
- Better TypeScript support
|
|
377
|
-
- Performance optimizations
|
|
378
|
-
|
|
379
340
|
## Related Components
|
|
380
341
|
|
|
381
342
|
- [Avatar](../Avatar/Avatar.md) - For user profile images
|
|
@@ -88,6 +88,18 @@ const innerLength = (theme: Theme, value: Length): string | undefined =>
|
|
|
88
88
|
const orDefault = (value: Length, fallback: number | string): number | string =>
|
|
89
89
|
value === undefined || value === '' ? fallback : value;
|
|
90
90
|
|
|
91
|
+
/**
|
|
92
|
+
* A width/height as `metrics` and the `ReactNode` `ErrorFallback` read it
|
|
93
|
+
* (FUT-2774 #4): an explicit empty string is normalized to "as if unset"
|
|
94
|
+
* rather than mapped to a component-wide default. Unlike `SkeletonIndicator`
|
|
95
|
+
* (a content-less box with nothing else to size by, hence its own deliberate
|
|
96
|
+
* `'100%'`/`'auto'` fallback), these draw the real image or a `ReactNode`
|
|
97
|
+
* fallback — both have their own intrinsic size, so leaving an unset width
|
|
98
|
+
* unset lets it size naturally (`brand-link.tsx`'s logo relies on exactly
|
|
99
|
+
* this: an unset width capped by its own `sx.maxWidth`).
|
|
100
|
+
*/
|
|
101
|
+
const emptyToUnset = (value: Length): Length => (value === '' ? undefined : value);
|
|
102
|
+
|
|
91
103
|
/** The box the image occupies, as CSS, shared by the real image and every stand-in for it. */
|
|
92
104
|
interface BoxMetrics {
|
|
93
105
|
width?: string;
|
|
@@ -106,10 +118,14 @@ const SkeletonIndicator: React.FC<IndicatorProps> = ({ props }) => {
|
|
|
106
118
|
const theme = useTheme();
|
|
107
119
|
return (
|
|
108
120
|
<Skeleton
|
|
109
|
-
variant
|
|
121
|
+
// FUT-2774 #5: `skeletonProps.variant` was typed but never read — the
|
|
122
|
+
// variant was hard-coded regardless of what a caller passed.
|
|
123
|
+
variant={props.skeletonProps.variant ?? 'rectangular'}
|
|
110
124
|
width={innerLength(theme, orDefault(props.width, '100%'))}
|
|
111
125
|
height={innerLength(theme, orDefault(props.height, 'auto'))}
|
|
112
|
-
|
|
126
|
+
// FUT-2774 #5: `||` reads a caller's `false` the same as "unset", so
|
|
127
|
+
// `skeletonProps.animation={false}` could never turn the animation off.
|
|
128
|
+
animation={props.skeletonProps.animation ?? 'pulse'}
|
|
113
129
|
intensity={props.skeletonProps.intensity}
|
|
114
130
|
borderRadius={styleLength(theme, props.borderRadius)}
|
|
115
131
|
data-testid={`${props['data-testid']}-skeleton`}
|
|
@@ -124,8 +140,11 @@ const SpinnerIndicator: React.FC<IndicatorProps> = ({ props }) => {
|
|
|
124
140
|
return (
|
|
125
141
|
<SpinnerOverlay>
|
|
126
142
|
<CircularProgress
|
|
127
|
-
|
|
128
|
-
|
|
143
|
+
// FUT-2774 #5: `||` read `spinnerProps.size`/`thickness` of `0` the
|
|
144
|
+
// same as unset — the same class of bug FUT-2669 fixed for
|
|
145
|
+
// `width`/`height`, missed here.
|
|
146
|
+
size={styleLength(theme, spinnerProps.size ?? 40)}
|
|
147
|
+
thickness={spinnerProps.thickness ?? 4}
|
|
129
148
|
sx={{ color: spinnerProps.color || theme.palette.primary.main }}
|
|
130
149
|
data-testid={`${props['data-testid']}-spinner`}
|
|
131
150
|
/>
|
|
@@ -209,8 +228,19 @@ const ErrorFallback: React.FC<IndicatorProps> = ({ props, metrics }) => {
|
|
|
209
228
|
return (
|
|
210
229
|
<FallbackContainer
|
|
211
230
|
sx={{
|
|
212
|
-
|
|
213
|
-
height
|
|
231
|
+
// FUT-2774 #4 (see `emptyToUnset`). Does NOT change the confirmed
|
|
232
|
+
// height collapse — `ImageContainer`'s own height was already `'auto'`
|
|
233
|
+
// either way; see `LazyImage.test.stories.tsx` for that separate,
|
|
234
|
+
// unresolved defect. `orDefault(height, 'auto')` is safe to share with
|
|
235
|
+
// `SkeletonIndicator` (unlike width's `'100%'`, deliberately NOT
|
|
236
|
+
// shared — see `emptyToUnset`): a PERCENTAGE height against an
|
|
237
|
+
// auto-height containing block computes to `auto` by spec regardless,
|
|
238
|
+
// so whether `sx.height` is omitted (falling through to
|
|
239
|
+
// `FallbackContainer`'s own `height: '100%'`) or set to the literal
|
|
240
|
+
// `'auto'` here, an unset-height container gives the same result
|
|
241
|
+
// either way — nothing for this fallback to protect against.
|
|
242
|
+
width: innerLength(theme, emptyToUnset(width)),
|
|
243
|
+
height: innerLength(theme, orDefault(height, 'auto')),
|
|
214
244
|
borderRadius: styleLength(theme, borderRadius),
|
|
215
245
|
}}
|
|
216
246
|
data-testid={`${testId}-fallback`}
|
|
@@ -242,8 +272,14 @@ export const LazyImage = React.memo<LazyImageProps>(function LazyImage(rawProps)
|
|
|
242
272
|
const { width, height, borderRadius, alt } = props;
|
|
243
273
|
const testId = props['data-testid'];
|
|
244
274
|
const metrics: BoxMetrics = {
|
|
245
|
-
|
|
246
|
-
|
|
275
|
+
// FUT-2774 #4 (see `emptyToUnset`): `metrics` also sizes the REAL `<img>`,
|
|
276
|
+
// where an unset width means "the image's own intrinsic size" —
|
|
277
|
+
// `brand-link.tsx`'s logo relies on exactly that. `height`'s `'auto'`
|
|
278
|
+
// fallback has no such live case to protect: a percentage height against
|
|
279
|
+
// an auto-height containing block computes to `auto` regardless, so
|
|
280
|
+
// sharing `SkeletonIndicator`'s fallback changes nothing observable.
|
|
281
|
+
width: innerLength(theme, emptyToUnset(width)),
|
|
282
|
+
height: innerLength(theme, orDefault(height, 'auto')),
|
|
247
283
|
objectFit: props.objectFit,
|
|
248
284
|
objectPosition: props.objectPosition,
|
|
249
285
|
borderRadius: styleLength(theme, borderRadius),
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import type { PaletteColor, Theme, ThemeOptions } from '@mui/material/styles/index.js';
|
|
2
2
|
|
|
3
3
|
import { cssLengthToPx, cssTrackingToEm } from '../tokens/css-units';
|
|
4
|
+
import { densityFontSize, resolveDensityFactor } from '../tokens/density';
|
|
4
5
|
import { resolveFieldHeight } from '../tokens/field-height.core';
|
|
5
|
-
import { fieldOverrides } from '../tokens/field-height';
|
|
6
|
+
import { fieldOverrides, mergeMuiComponents } from '../tokens/field-height';
|
|
6
7
|
import { fieldRadius } from '../tokens/field-radius';
|
|
7
8
|
import { accentFor } from '../tokens/scales';
|
|
8
9
|
import {
|
|
@@ -102,6 +103,9 @@ export function uiThemeFromMui(theme: Theme): UiTheme {
|
|
|
102
103
|
spacingUnit: unit,
|
|
103
104
|
radius: { sm: md / 2, md, lg: md * 2, xl: md * 4, full: 9999, field: fieldRadius(theme) },
|
|
104
105
|
fieldHeight: resolveFieldHeight(theme.fieldHeight),
|
|
106
|
+
// A bare MUI theme (never built through `createUiTheme`/`muiThemeOptionsFrom`)
|
|
107
|
+
// carries no `theme.density` — read back as `'normal'`, factor `1`.
|
|
108
|
+
density: theme.density ?? resolveDensityFactor(),
|
|
105
109
|
typography: {
|
|
106
110
|
fontFamily: theme.typography.fontFamily ?? WEB_FONT_FAMILY,
|
|
107
111
|
monospaceFontFamily: WEB_MONOSPACE_FONT_FAMILY,
|
|
@@ -140,9 +144,19 @@ export function muiThemeOptionsFrom(ui: UiTheme): ThemeOptions {
|
|
|
140
144
|
shape: { borderRadius: ui.radius.md },
|
|
141
145
|
fieldRadius: ui.radius.field,
|
|
142
146
|
fieldHeight: ui.fieldHeight,
|
|
143
|
-
|
|
147
|
+
// Additive: children 2–4 (FUT-2766–2768) each add one more source here as
|
|
148
|
+
// their own geometry overrides land — this PR wires the merge helper to
|
|
149
|
+
// `fieldOverrides` alone, since no geometry override exists yet.
|
|
150
|
+
components: mergeMuiComponents(fieldOverrides(ui.radius.field, ui.fieldHeight)),
|
|
144
151
|
spacing: ui.spacingUnit,
|
|
145
|
-
|
|
152
|
+
density: ui.density,
|
|
153
|
+
typography: {
|
|
154
|
+
fontFamily: ui.typography.fontFamily ?? WEB_FONT_FAMILY,
|
|
155
|
+
// MUI multiplies every `pxToRem` size by `fontSize / 14` — the lever a
|
|
156
|
+
// density mode moves (`./tokens/relative.ts`). `htmlFontSize` stays
|
|
157
|
+
// untouched: that is a reader's own zoom/accessibility setting, not this.
|
|
158
|
+
fontSize: densityFontSize(ui.density.factor),
|
|
159
|
+
},
|
|
146
160
|
zIndex: { ...ui.zIndex },
|
|
147
161
|
};
|
|
148
162
|
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* THE ONE DENSITY KNOB, WITH NO RENDERER BEHIND IT.
|
|
3
|
+
*
|
|
4
|
+
* A host that wants a compact admin or a roomy kiosk should say so once, in
|
|
5
|
+
* the theme — not hunt through every component's own numbers. Because every
|
|
6
|
+
* size already goes through `rem(theme, px)` / `theme.spacing()` / `fieldHeight()`
|
|
7
|
+
* (FUT-2585, `./relative.ts`), moving the type scale, the spacing unit and the
|
|
8
|
+
* field height BY THE SAME FACTOR is enough to make the whole package denser
|
|
9
|
+
* or roomier — no `size` step is rewritten, no component is touched (FUT-2764
|
|
10
|
+
* Decision 3).
|
|
11
|
+
*
|
|
12
|
+
* Three named levels, or a raw factor for a repository the three names don't
|
|
13
|
+
* fit (a kiosk app, say). A repository can also redefine what a named level
|
|
14
|
+
* itself means (`densityFactors`). Precedence, highest first, ABOVE
|
|
15
|
+
* `resolveDensityFactor` itself — this file's own resolver has no notion of an
|
|
16
|
+
* "explicit option" to defer to, that is each CALLER's job:
|
|
17
|
+
*
|
|
18
|
+
* - On the `createUiTheme` path (`./theme.ts`): an explicit `spacingUnit` /
|
|
19
|
+
* `fieldHeight` option (`UiThemeOptions` carries no `typography.fontSize` —
|
|
20
|
+
* only `fontFamily`/`monospaceFontFamily`) still wins over EVERYTHING below,
|
|
21
|
+
* unchanged.
|
|
22
|
+
* - On the MUI-native path (`densityThemeOptions`'s output, or a host's own
|
|
23
|
+
* `createTheme()` options merged around it): whichever `typography.fontSize`
|
|
24
|
+
* / `spacing` a host's OWN object literal states last wins — plain
|
|
25
|
+
* JavaScript object-spread order, not a rule this package enforces. See
|
|
26
|
+
* `./density.ts` for exactly where to put it.
|
|
27
|
+
*
|
|
28
|
+
* Below that: a numeric `density` (used as the factor directly, no table
|
|
29
|
+
* lookup, and only when it is a USABLE one — see `resolveDensityFactor`) >
|
|
30
|
+
* `densityFactors[level]` (a repository's own override for a named level,
|
|
31
|
+
* same usability rule) > the built-in table below. No `density` at all
|
|
32
|
+
* resolves to `{ level: 'normal', factor: 1 }` — today, byte-for-byte.
|
|
33
|
+
*
|
|
34
|
+
* This file is the resolver alone, so the native renderer and `./theme.ts`
|
|
35
|
+
* read it without importing MUI. The web reader — `useDensity()`, the MUI
|
|
36
|
+
* theme channel, and the standalone `densityThemeOptions()` — is in
|
|
37
|
+
* `./density.ts`.
|
|
38
|
+
*/
|
|
39
|
+
|
|
40
|
+
export type DensityLevel = 'compact' | 'normal' | 'comfortable';
|
|
41
|
+
|
|
42
|
+
export const DEFAULT_DENSITY: DensityLevel = 'normal';
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* The built-in factor table — the LOWEST-precedence source. A repository's
|
|
46
|
+
* own `densityFactors` entry for a level wins over it; a numeric `density`
|
|
47
|
+
* bypasses it entirely. Confirmed against screenshots before this PR merges
|
|
48
|
+
* (see the ticket's Done when) — `compact` 0.9, `normal` 1 (no-op),
|
|
49
|
+
* `comfortable` 1.1.
|
|
50
|
+
*/
|
|
51
|
+
export const DENSITY_FACTOR: Record<DensityLevel, number> = {
|
|
52
|
+
compact: 0.9,
|
|
53
|
+
normal: 1,
|
|
54
|
+
comfortable: 1.1,
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
export interface ResolvedDensity {
|
|
58
|
+
/** Present only when a NAMED level was given; a raw numeric `density` has no name. */
|
|
59
|
+
level?: DensityLevel;
|
|
60
|
+
factor: number;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* A usable factor — a positive, finite number. The same shape
|
|
65
|
+
* `resolveFieldHeight` (`./field-height.core`) already accepts for a `height`;
|
|
66
|
+
* a numeric `density` and a `densityFactors` entry are held to the same rule
|
|
67
|
+
* so an unusable one falls back exactly the way an unusable `fieldHeight`
|
|
68
|
+
* option already does, rather than baking a `0`, a negative or a `NaN`/
|
|
69
|
+
* `Infinity` into `spacingUnit`/`fieldHeight`/`typography.fontSize`.
|
|
70
|
+
*/
|
|
71
|
+
function isUsableFactor(value: unknown): value is number {
|
|
72
|
+
return typeof value === 'number' && Number.isFinite(value) && value > 0;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Precedence (highest first): a numeric `density` IS the factor, no table lookup —
|
|
77
|
+
* but only when it is a usable one (a positive, finite number); `0`, a negative
|
|
78
|
+
* number, `NaN` or `Infinity` are not a density anyone meant, so they fall back
|
|
79
|
+
* to `'normal'`, factor `1`, exactly as no `density` at all does. A named
|
|
80
|
+
* `density` resolves through `factors?.[level] ?? DENSITY_FACTOR[level]` — a
|
|
81
|
+
* repository's own `densityFactors` override wins over the built-in table, but
|
|
82
|
+
* only when IT is usable too; an unusable entry falls back to the BUILT-IN
|
|
83
|
+
* table's value for that same level (not to `'normal'` — the level itself is
|
|
84
|
+
* still the one asked for, only its factor is unusable). No `density` at all
|
|
85
|
+
* resolves to `{ level: 'normal', factor: 1 }`.
|
|
86
|
+
*/
|
|
87
|
+
export function resolveDensityFactor(
|
|
88
|
+
density?: DensityLevel | number,
|
|
89
|
+
factors?: Partial<Record<DensityLevel, number>>,
|
|
90
|
+
): ResolvedDensity {
|
|
91
|
+
if (typeof density === 'number') {
|
|
92
|
+
if (isUsableFactor(density)) return { factor: density };
|
|
93
|
+
density = undefined; // not usable — fall through to 'normal', below
|
|
94
|
+
}
|
|
95
|
+
const level = density ?? DEFAULT_DENSITY;
|
|
96
|
+
const override = factors?.[level];
|
|
97
|
+
const factor = isUsableFactor(override) ? override : DENSITY_FACTOR[level];
|
|
98
|
+
return { level, factor };
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const BASE_FONT_SIZE = 14; // MUI's own typography.fontSize baseline
|
|
102
|
+
const BASE_SPACING_UNIT = 8; // theme.ts's literal default
|
|
103
|
+
const BASE_FIELD_HEIGHT = 2.5; // field-height.core.ts's DEFAULT_FIELD_HEIGHT
|
|
104
|
+
|
|
105
|
+
/** MUI's own `typography.fontSize` at this factor. `htmlFontSize` is never touched. */
|
|
106
|
+
export function densityFontSize(factor: number): number {
|
|
107
|
+
return BASE_FONT_SIZE * factor;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** The theme's `spacingUnit` at this factor. */
|
|
111
|
+
export function densitySpacingUnit(factor: number): number {
|
|
112
|
+
return BASE_SPACING_UNIT * factor;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/** The standard field height (multiples of the default font size) at this factor. */
|
|
116
|
+
export function densityFieldHeight(factor: number): number {
|
|
117
|
+
return BASE_FIELD_HEIGHT * factor;
|
|
118
|
+
}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { useTheme } from '@mui/material/styles/index.js';
|
|
2
|
+
import type { ThemeOptions } from '@mui/material/styles/index.js';
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
densityFieldHeight,
|
|
6
|
+
densityFontSize,
|
|
7
|
+
densitySpacingUnit,
|
|
8
|
+
resolveDensityFactor,
|
|
9
|
+
type DensityLevel,
|
|
10
|
+
type ResolvedDensity,
|
|
11
|
+
} from './density.core';
|
|
12
|
+
import { fieldOverrides, mergeMuiComponents } from './field-height';
|
|
13
|
+
import { DEFAULT_FIELD_RADIUS } from './field-radius.core';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* DENSITY ON THE WEB: the MUI theme channel, the reader, and the standalone
|
|
17
|
+
* entry point for a host that never calls `createUiTheme`/`UiProvider`.
|
|
18
|
+
*
|
|
19
|
+
* The argument for one density knob, the factor table and its precedence are
|
|
20
|
+
* in `./density.core.ts`.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
export {
|
|
24
|
+
DEFAULT_DENSITY,
|
|
25
|
+
DENSITY_FACTOR,
|
|
26
|
+
densityFieldHeight,
|
|
27
|
+
densityFontSize,
|
|
28
|
+
densitySpacingUnit,
|
|
29
|
+
resolveDensityFactor,
|
|
30
|
+
type DensityLevel,
|
|
31
|
+
type ResolvedDensity,
|
|
32
|
+
} from './density.core';
|
|
33
|
+
|
|
34
|
+
declare module '@mui/material/styles' {
|
|
35
|
+
interface Theme {
|
|
36
|
+
/** The density this theme renders at. See `@12-apps/ui/tokens`' `useDensity`. */
|
|
37
|
+
density?: ResolvedDensity;
|
|
38
|
+
}
|
|
39
|
+
interface ThemeOptions {
|
|
40
|
+
/** The density this theme renders at. See `@12-apps/ui/tokens`' `useDensity`. */
|
|
41
|
+
density?: ResolvedDensity;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* The theme's resolved density — a plain theme read, not a step-shifting
|
|
47
|
+
* resolver (`size` stays hierarchy; see `./density.core.ts`). A `styleOverrides`
|
|
48
|
+
* callback already gets `{ theme }` and can read `theme.density` directly;
|
|
49
|
+
* this is for a component that needs the level in its own render logic
|
|
50
|
+
* (`Table`/`DataGrid`/`DataViews` each read it once to source their own
|
|
51
|
+
* `density` prop's default).
|
|
52
|
+
*
|
|
53
|
+
* Falls back to `resolveDensityFactor()` (`'normal'`, factor `1`) for a bare
|
|
54
|
+
* MUI theme built without `createUiTheme`/`muiThemeOptionsFrom`.
|
|
55
|
+
*/
|
|
56
|
+
export function useDensity(): ResolvedDensity {
|
|
57
|
+
return useTheme().density ?? resolveDensityFactor();
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* The density factor as a MUI `ThemeOptions` fragment, for a host that builds
|
|
62
|
+
* `createTheme()` directly and never calls `createUiTheme`/`UiProvider` — the
|
|
63
|
+
* same precedence `resolveDensityFactor` gives `createUiTheme`, so the two
|
|
64
|
+
* consumption paths agree on `typography`/`spacing`/`fieldHeight`/`components`
|
|
65
|
+
* (FUT-2764's Design section), not just the first two. `fieldHeight` matters
|
|
66
|
+
* on its own: `Input`/`Select`/`Button` each read `theme.fieldHeight` directly
|
|
67
|
+
* (`Input.tsx`, `Select.tsx`, `Button.styles.ts`'s `buttonSize`), so a fragment
|
|
68
|
+
* that carried only `typography`/`spacing` left every field standing at the
|
|
69
|
+
* DEFAULT height (2.5) at every density on this path — the two paths would
|
|
70
|
+
* agree on the type scale and disagree on the one number three components key
|
|
71
|
+
* their own layout off.
|
|
72
|
+
*
|
|
73
|
+
* `components` is the matching MUI-native override (`fieldOverrides`) for a
|
|
74
|
+
* HOST's own bare `TextField`/`Select`, mirroring `muiThemeOptionsFrom`'s own
|
|
75
|
+
* `components: mergeMuiComponents(fieldOverrides(...))`. It carries ONLY the
|
|
76
|
+
* field overrides this function knows about (`MuiOutlinedInput`'s `root`,
|
|
77
|
+
* `input` and `notchedOutline`; `MuiInputLabel`'s `outlined`) — a host with
|
|
78
|
+
* ITS OWN overrides for OTHER components merges them in with
|
|
79
|
+
* `mergeMuiComponents(densityThemeOptions(density).components, hostOverrides)`,
|
|
80
|
+
* which keeps a component only ONE side touches untouched. For a component
|
|
81
|
+
* BOTH sides style, the merge is by INNER key (`root`/`input`/…): a key only
|
|
82
|
+
* one side sets survives from that side, but a key BOTH set is replaced
|
|
83
|
+
* WHOLESALE by whichever source is passed LAST — not deep-merged — so a host
|
|
84
|
+
* wanting to ADD to, say, `MuiOutlinedInput`'s `root` alongside the radius
|
|
85
|
+
* override needs to write that one key's object out in full itself.
|
|
86
|
+
*
|
|
87
|
+
* `fieldRadius` (3rd argument, optional) exists because density does NOT touch
|
|
88
|
+
* the field's CORNER — this is only for a host that already draws its OWN,
|
|
89
|
+
* non-default radius and wants `components` to match it instead of clashing;
|
|
90
|
+
* it defaults
|
|
91
|
+
* to the same {@link DEFAULT_FIELD_RADIUS} `createUiTheme` itself falls back
|
|
92
|
+
* to when a host names no `fieldRadius`, so the two paths still agree with no
|
|
93
|
+
* argument passed at all — the existing 2-argument call keeps working
|
|
94
|
+
* unchanged.
|
|
95
|
+
*
|
|
96
|
+
* **Where to spread it — the first `createTheme()` call, not a later layering
|
|
97
|
+
* one.** `createTheme(options, ...args)` (`createThemeNoVars.js`) only runs
|
|
98
|
+
* `createSpacing`/`createTypography` on `options`, the FIRST argument; every
|
|
99
|
+
* later argument is deep-merged onto the theme those two already built, with
|
|
100
|
+
* no such reprocessing. So a host with a base theme and a SECOND, layering
|
|
101
|
+
* `createTheme()` call on top of it — exactly the shape a two-theme host uses,
|
|
102
|
+
* `createTheme(outer, { palette: { ... } })` — must apply density at the
|
|
103
|
+
* FIRST call (where the base itself is built), never spread onto `outer` in
|
|
104
|
+
* the second one:
|
|
105
|
+
*
|
|
106
|
+
* ```ts
|
|
107
|
+
* // RIGHT — density goes into the base's OWN construction. The second,
|
|
108
|
+
* // layering call is unaffected: it never restates spacing/typography/
|
|
109
|
+
* // fieldHeight/components itself, so `theme.spacing`/`pxToRem`/`fieldHeight`
|
|
110
|
+
* // carry over from `base` UNCHANGED, already correctly scaled.
|
|
111
|
+
* const base = createTheme({ palette: { primary: { main }, ... }, ...densityThemeOptions('compact') });
|
|
112
|
+
* const themed = createTheme(base, { palette: { primary: { main: brand } } });
|
|
113
|
+
*
|
|
114
|
+
* // WRONG — a second, layering argument onto an ALREADY-BUILT theme is
|
|
115
|
+
* // deepmerged with no reprocessing: `spacing`/`typography.fontSize` would
|
|
116
|
+
* // overwrite the already-resolved `theme.spacing` function/`pxToRem` ratio
|
|
117
|
+
* // instead of rescaling them.
|
|
118
|
+
* createTheme(outer, { ...densityThemeOptions('compact') });
|
|
119
|
+
* ```
|
|
120
|
+
*/
|
|
121
|
+
export function densityThemeOptions(
|
|
122
|
+
density: DensityLevel | number,
|
|
123
|
+
factors?: Partial<Record<DensityLevel, number>>,
|
|
124
|
+
fieldRadius: number = DEFAULT_FIELD_RADIUS,
|
|
125
|
+
): Pick<ThemeOptions, 'typography' | 'spacing' | 'fieldHeight' | 'components'> {
|
|
126
|
+
const { factor } = resolveDensityFactor(density, factors);
|
|
127
|
+
const fieldHeight = densityFieldHeight(factor);
|
|
128
|
+
return {
|
|
129
|
+
typography: { fontSize: densityFontSize(factor) },
|
|
130
|
+
spacing: densitySpacingUnit(factor),
|
|
131
|
+
fieldHeight,
|
|
132
|
+
components: mergeMuiComponents(fieldOverrides(fieldRadius, fieldHeight)),
|
|
133
|
+
};
|
|
134
|
+
}
|
|
@@ -44,9 +44,14 @@ export const FIELD_HEIGHT_SCALE: Record<SizeValue, number> = {
|
|
|
44
44
|
xl: 1.4,
|
|
45
45
|
};
|
|
46
46
|
|
|
47
|
-
/**
|
|
48
|
-
|
|
49
|
-
|
|
47
|
+
/**
|
|
48
|
+
* A usable standard height: the given one when it is a positive number, a
|
|
49
|
+
* caller's own `fallback` otherwise — {@link DEFAULT_FIELD_HEIGHT} unless a
|
|
50
|
+
* density factor (`./density.core`) already worked out a denser or roomier
|
|
51
|
+
* one to fall back to instead.
|
|
52
|
+
*/
|
|
53
|
+
export function resolveFieldHeight(height: unknown, fallback: number = DEFAULT_FIELD_HEIGHT): number {
|
|
54
|
+
return typeof height === 'number' && Number.isFinite(height) && height > 0 ? height : fallback;
|
|
50
55
|
}
|
|
51
56
|
|
|
52
57
|
/** A field's height for a size, in multiples of the default font size (`rem`). */
|
|
@@ -120,23 +120,34 @@ export function fieldHeightOverrides(height: number = DEFAULT_FIELD_HEIGHT): Com
|
|
|
120
120
|
}
|
|
121
121
|
|
|
122
122
|
/**
|
|
123
|
-
*
|
|
124
|
-
*
|
|
125
|
-
*
|
|
123
|
+
* Several `Components<Theme>` override sets, merged per component name — a
|
|
124
|
+
* later source's `styleOverrides` win over an earlier one's for the SAME
|
|
125
|
+
* inner key, but neither erases the other's keys. A plain spread of the
|
|
126
|
+
* top-level objects would drop every override but the last source's for a
|
|
127
|
+
* component two sources both style (`fieldOverrides` below merges exactly
|
|
128
|
+
* two; density's geometry overrides, FUT-2766–2768, add more).
|
|
126
129
|
*/
|
|
127
|
-
export function
|
|
130
|
+
export function mergeMuiComponents(...sources: Components<Theme>[]): Components<Theme> {
|
|
128
131
|
type Entry = { styleOverrides?: Record<string, unknown> };
|
|
129
|
-
const
|
|
130
|
-
const
|
|
131
|
-
const names = new Set([...Object.keys(corner), ...Object.keys(tall)]);
|
|
132
|
+
const maps = sources as unknown as Record<string, Entry>[];
|
|
133
|
+
const names = new Set(maps.flatMap((map) => Object.keys(map)));
|
|
132
134
|
return Object.fromEntries(
|
|
133
135
|
[...names].map((name) => [
|
|
134
136
|
name,
|
|
135
|
-
{ styleOverrides: { ...
|
|
137
|
+
{ styleOverrides: Object.assign({}, ...maps.map((map) => map[name]?.styleOverrides)) },
|
|
136
138
|
]),
|
|
137
139
|
) as Components<Theme>;
|
|
138
140
|
}
|
|
139
141
|
|
|
142
|
+
/**
|
|
143
|
+
* Both field overrides — the corner and the height — merged per component.
|
|
144
|
+
* They meet on `MuiOutlinedInput` (`root` from the radius, `input` from the
|
|
145
|
+
* height), so a plain spread would lose one of them.
|
|
146
|
+
*/
|
|
147
|
+
export function fieldOverrides(radius: number | undefined, height: number | undefined): Components<Theme> {
|
|
148
|
+
return mergeMuiComponents(fieldRadiusOverrides(radius), fieldHeightOverrides(height));
|
|
149
|
+
}
|
|
150
|
+
|
|
140
151
|
/**
|
|
141
152
|
* THE field standard on a MUI `TextField` / `Select` / `Autocomplete`, for a
|
|
142
153
|
* composite that renders MUI's own: the field radius, the field height for
|