@12-apps/ui 6.35.0 → 6.36.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/_internal/components/data-display/Alert/Alert.js +3 -3
- package/dist/_internal/components/data-display/Alert/Alert.styles.js +2 -2
- package/dist/_internal/components/data-display/AlertDialog/AlertDialog.js +2 -2
- package/dist/_internal/components/data-display/AsyncStateContainer/AsyncStateContainer.js +5 -5
- package/dist/_internal/components/data-display/Avatar/Avatar.animations.js +2 -1
- package/dist/_internal/components/data-display/Avatar/Avatar.js +4 -4
- package/dist/_internal/components/data-display/Avatar/Avatar.view.js +3 -3
- package/dist/_internal/components/data-display/Badge/Badge.animations.js +2 -1
- package/dist/_internal/components/data-display/Badge/Badge.js +6 -6
- package/dist/_internal/components/data-display/Badge/Badge.styles.js +4 -4
- package/dist/_internal/components/data-display/Badge/Badge.variants.js +2 -2
- package/dist/_internal/components/data-display/Badge/BadgeContent.js +5 -5
- package/dist/_internal/components/data-display/Banner/Banner.js +3 -3
- package/dist/_internal/components/data-display/Banner/Banner.styles.js +2 -2
- package/dist/_internal/components/data-display/CardKit/CardKebab.js +1 -1
- package/dist/_internal/components/data-display/CardKit/card-actions-context.js +4 -4
- package/dist/_internal/components/data-display/CardKit/list-card-parts.js +1 -1
- package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js +10 -10
- package/dist/_internal/components/data-display/CardKit/use-row-confirm.js +7 -7
- package/dist/_internal/components/data-display/Carousel/Carousel.chrome.js +3 -3
- package/dist/_internal/components/data-display/Carousel/Carousel.js +6 -6
- package/dist/_internal/components/data-display/Carousel/Carousel.parts.js +2 -2
- package/dist/_internal/components/data-display/Carousel/Carousel.slide.js +2 -1
- package/dist/_internal/components/data-display/Carousel/Carousel.styles.js +6 -4
- package/dist/_internal/components/data-display/Chart/Chart.js +7 -7
- package/dist/_internal/components/data-display/Chart/ChartComposables.js +2 -1
- package/dist/_internal/components/data-display/Chart/SpecChart.js +8 -8
- package/dist/_internal/components/data-display/Chart/chart-axis.js +2 -1
- package/dist/_internal/components/data-display/Chart/chart-context.js +4 -4
- package/dist/_internal/components/data-display/Chart/chart-internals.js +4 -2
- package/dist/_internal/components/data-display/Chart/chart-renderers.js +6 -6
- package/dist/_internal/components/data-display/Chip/Chip.js +3 -2
- package/dist/_internal/components/data-display/Chip/Chip.styles.js +2 -1
- package/dist/_internal/components/data-display/DataGrid/DataGrid.js +3 -2
- package/dist/_internal/components/data-display/DataGrid/DataGrid.states.js +2 -1
- package/dist/_internal/components/data-display/DataViews/DataViewsBoard.js +2 -2
- package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +28 -28
- package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +40 -40
- package/dist/_internal/components/data-display/DataViews/DeleteViewDialog.js +1 -1
- package/dist/_internal/components/data-display/DataViews/ManageViewsDialog.js +7 -7
- package/dist/_internal/components/data-display/DataViews/SaveViewModal.js +3 -3
- package/dist/_internal/components/data-display/DataViews/base-card.js +5 -5
- package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +7 -7
- package/dist/_internal/components/data-display/DataViews/base-list-card-gutters.js +3 -3
- package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +3 -3
- package/dist/_internal/components/data-display/DataViews/base-list-card.js +9 -9
- package/dist/_internal/components/data-display/DataViews/card-surface.js +3 -2
- package/dist/_internal/components/data-display/DataViews/data-views-bar-controls.js +1 -1
- package/dist/_internal/components/data-display/DataViews/data-views-category-pill.js +1 -1
- package/dist/_internal/components/data-display/DataViews/data-views-columns-tab.js +1 -1
- package/dist/_internal/components/data-display/DataViews/data-views-columns.js +3 -3
- package/dist/_internal/components/data-display/DataViews/data-views-day-input.js +2 -1
- package/dist/_internal/components/data-display/DataViews/data-views-display-panel.js +5 -5
- package/dist/_internal/components/data-display/DataViews/data-views-display-tabs.js +3 -3
- package/dist/_internal/components/data-display/DataViews/data-views-drag.js +2 -1
- package/dist/_internal/components/data-display/DataViews/data-views-empty.js +2 -2
- package/dist/_internal/components/data-display/DataViews/data-views-export.js +2 -2
- package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +5 -5
- package/dist/_internal/components/data-display/DataViews/data-views-glyphs.js +2 -1
- package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +6 -6
- package/dist/_internal/components/data-display/DataViews/data-views-grid-helpers.js +2 -2
- package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +25 -25
- package/dist/_internal/components/data-display/DataViews/data-views-header-row.js +1 -1
- package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +8 -8
- package/dist/_internal/components/data-display/DataViews/data-views-layout-context.js +1 -1
- package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +5 -5
- package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +6 -6
- package/dist/_internal/components/data-display/DataViews/data-views-number-input.js +2 -1
- package/dist/_internal/components/data-display/DataViews/data-views-pagination.js +1 -1
- package/dist/_internal/components/data-display/DataViews/data-views-range-pill.js +4 -4
- package/dist/_internal/components/data-display/DataViews/data-views-scope-tabs.js +3 -3
- package/dist/_internal/components/data-display/DataViews/data-views-scopes.js +1 -1
- package/dist/_internal/components/data-display/DataViews/data-views-search.js +2 -2
- package/dist/_internal/components/data-display/DataViews/data-views-select-all-strip.js +1 -1
- package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +9 -9
- package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +12 -12
- package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +8 -8
- package/dist/_internal/components/data-display/DataViews/data-views-view-nav.js +2 -2
- package/dist/_internal/components/data-display/DataViews/list-card-rails.js +1 -1
- package/dist/_internal/components/data-display/DataViews/save-view-preview.js +2 -2
- package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +5 -5
- package/dist/_internal/components/data-display/DateTimeDisplay/DateTimeDisplay.js +2 -1
- package/dist/_internal/components/data-display/DateTimeDisplay/index.js +2 -1
- package/dist/_internal/components/data-display/DescriptionItem/DescriptionItem.js +2 -2
- package/dist/_internal/components/data-display/EmptyState/EmptyState.js +2 -1
- package/dist/_internal/components/data-display/ErrorState/ErrorState.js +1 -1
- package/dist/_internal/components/data-display/FleetMap/FleetBody.js +15 -15
- package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js +13 -13
- package/dist/_internal/components/data-display/FleetMap/FleetMap.js +17 -17
- package/dist/_internal/components/data-display/FleetMap/FleetRoster.js +2 -1
- package/dist/_internal/components/data-display/HoverCard/HoverCard.animations.js +2 -1
- package/dist/_internal/components/data-display/HoverCard/HoverCard.content.js +2 -1
- package/dist/_internal/components/data-display/HoverCard/HoverCard.js +5 -4
- package/dist/_internal/components/data-display/HoverCard/HoverCard.styles.js +3 -2
- package/dist/_internal/components/data-display/InteractiveTooltip/InteractiveTooltip.hooks.js +1 -1
- package/dist/_internal/components/data-display/InteractiveTooltip/InteractiveTooltip.js +4 -4
- package/dist/_internal/components/data-display/InteractiveTooltip/InteractiveTooltip.styles.js +4 -2
- package/dist/_internal/components/data-display/LazyImage/LazyImage.hooks.js +2 -1
- package/dist/_internal/components/data-display/LazyImage/LazyImage.js +3 -2
- package/dist/_internal/components/data-display/Lightbox/Lightbox.constants.js +4 -4
- package/dist/_internal/components/data-display/Lightbox/Lightbox.hooks.js +3 -3
- package/dist/_internal/components/data-display/Lightbox/Lightbox.js +9 -9
- package/dist/_internal/components/data-display/Lightbox/LightboxControls.js +3 -3
- package/dist/_internal/components/data-display/Lightbox/LightboxOverlay.js +4 -4
- package/dist/_internal/components/data-display/Lightbox/LightboxStage.js +3 -3
- package/dist/_internal/components/data-display/Lightbox/LightboxThumbnails.js +3 -3
- package/dist/_internal/components/data-display/Lightbox/useLightbox.js +4 -4
- package/dist/_internal/components/data-display/LoadingState/LoadingState.js +2 -1
- package/dist/_internal/components/data-display/MapPreview/MapControlBar.js +2 -1
- package/dist/_internal/components/data-display/MapPreview/MapDecorations.js +3 -3
- package/dist/_internal/components/data-display/MapPreview/MapLayers.js +5 -4
- package/dist/_internal/components/data-display/MapPreview/MapMarkers.js +3 -3
- package/dist/_internal/components/data-display/MapPreview/MapOverlays.js +1 -1
- package/dist/_internal/components/data-display/MapPreview/MapPreview.helpers.js +2 -1
- package/dist/_internal/components/data-display/MapPreview/MapPreview.js +12 -12
- package/dist/_internal/components/data-display/MapPreview/MapSearchBar.js +2 -1
- package/dist/_internal/components/data-display/MapPreview/MapTiles.js +3 -2
- package/dist/_internal/components/data-display/MapPreview/StaticMapView.js +5 -5
- package/dist/_internal/components/data-display/MapPreview/mapSurface.js +4 -3
- package/dist/_internal/components/data-display/Popover/Popover.js +2 -1
- package/dist/_internal/components/data-display/Progress/Progress.js +3 -3
- package/dist/_internal/components/data-display/Progress/Progress.styles.js +2 -2
- package/dist/_internal/components/data-display/SectionOnboarding/SectionOnboarding.js +4 -4
- package/dist/_internal/components/data-display/Sheet/Sheet.animations.js +2 -1
- package/dist/_internal/components/data-display/Sheet/Sheet.body.js +4 -4
- package/dist/_internal/components/data-display/Sheet/Sheet.hooks.js +3 -2
- package/dist/_internal/components/data-display/Sheet/Sheet.js +7 -7
- package/dist/_internal/components/data-display/Sheet/Sheet.parts.js +3 -2
- package/dist/_internal/components/data-display/Sheet/Sheet.styles.js +3 -3
- package/dist/_internal/components/data-display/StatCard/StatCard.js +2 -2
- package/dist/_internal/components/data-display/Stepper/Stepper.js +2 -2
- package/dist/_internal/components/data-display/Table/Table.js +2 -2
- package/dist/_internal/components/data-display/Table/Table.styles.js +1 -1
- package/dist/_internal/components/data-display/Timeline/Timeline.js +3 -3
- package/dist/_internal/components/data-display/Timeline/TimelineRow.js +2 -2
- package/dist/_internal/components/data-display/TimingDiagram/TimingDiagram.js +3 -3
- package/dist/_internal/components/data-display/TimingDiagram/TimingDiagram.views.js +2 -2
- package/dist/_internal/components/data-display/Tooltip/Tooltip.js +2 -2
- package/dist/_internal/components/data-display/index.js +87 -87
- package/dist/_internal/components/feedback/ConfirmAction/ConfirmAction.js +4 -4
- package/dist/_internal/components/feedback/ConfirmAction/ConfirmAction.parts.js +3 -3
- package/dist/_internal/components/feedback/ConfirmAction/ConfirmButton.js +5 -5
- package/dist/_internal/components/feedback/ConfirmAction/with-confirmation.js +4 -4
- package/dist/_internal/components/feedback/NotificationStatusNotice/NotificationStatusNotice.js +4 -4
- package/dist/_internal/components/feedback/Sonner/Sonner.js +1 -1
- package/dist/_internal/components/feedback/Sonner/SonnerToast.js +1 -1
- package/dist/_internal/components/feedback/index.js +9 -9
- package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.js +1 -1
- package/dist/_internal/components/form/AddressAutocomplete/AddressAutocompleteField.js +1 -1
- package/dist/_internal/components/form/Button/Button.js +1 -1
- package/dist/_internal/components/form/Button/Button.styles.js +1 -1
- package/dist/_internal/components/form/CategorySelect/CategoryPanel.js +1 -1
- package/dist/_internal/components/form/CategorySelect/CategoryPanelFoot.js +1 -1
- package/dist/_internal/components/form/CategorySelect/CategoryPanelHead.js +1 -1
- package/dist/_internal/components/form/CategorySelect/CategoryPanelList.js +1 -1
- package/dist/_internal/components/form/CategorySelect/CategoryRows.js +1 -1
- package/dist/_internal/components/form/CategorySelect/CategorySelect.js +1 -1
- package/dist/_internal/components/form/CategorySelect/CategorySelect.styles.js +1 -1
- package/dist/_internal/components/form/CategorySelect/CategoryTrigger.js +1 -1
- package/dist/_internal/components/form/CepField/CepField.js +1 -1
- package/dist/_internal/components/form/Checkbox/Checkbox.js +1 -1
- package/dist/_internal/components/form/CodeEditor/CodeEditor.js +1 -1
- package/dist/_internal/components/form/Command/Command.js +1 -1
- package/dist/_internal/components/form/Command/Command.styles.js +1 -1
- package/dist/_internal/components/form/CreatableSelect/CreatableSelect.js +1 -1
- package/dist/_internal/components/form/DateRangePicker/DateRangePicker.hooks.js +4 -3
- package/dist/_internal/components/form/DateRangePicker/DateRangePicker.js +6 -6
- package/dist/_internal/components/form/DateRangePicker/DateRangePicker.range.js +3 -2
- package/dist/_internal/components/form/DateRangePicker/DateRangePickerFields.js +4 -3
- package/dist/_internal/components/form/InputOTP/InputOTP.js +1 -1
- package/dist/_internal/components/form/InputOTP/InputOTP.styles.js +1 -1
- package/dist/_internal/components/form/Label/Label.js +1 -1
- package/dist/_internal/components/form/Label/Label.styles.js +1 -1
- package/dist/_internal/components/form/Menubar/Menubar.item.js +1 -1
- package/dist/_internal/components/form/Menubar/Menubar.js +1 -1
- package/dist/_internal/components/form/Menubar/Menubar.styles.js +1 -1
- package/dist/_internal/components/form/Menubar/Menubar.toolbar.js +1 -1
- package/dist/_internal/components/form/PhoneInput/PhoneInput.js +1 -1
- package/dist/_internal/components/form/RadioGroup/RadioGroup.js +1 -1
- package/dist/_internal/components/form/RadioGroup/RadioGroup.styles.js +1 -1
- package/dist/_internal/components/form/RadioGroup/RadioGroup.variants.js +1 -1
- package/dist/_internal/components/form/RichTextEditor/RichTextEditor.js +1 -1
- package/dist/_internal/components/form/Slider/Slider.js +1 -1
- package/dist/_internal/components/form/Slider/Slider.styles.js +1 -1
- package/dist/_internal/components/form/Switch/Switch.js +1 -1
- package/dist/_internal/components/form/Switch/Switch.parts.js +1 -1
- package/dist/_internal/components/form/Switch/Switch.styles.js +1 -1
- package/dist/_internal/components/form/Textarea/Textarea.js +2 -2
- package/dist/_internal/components/form/Textarea/TextareaRichEditor.js +2 -2
- package/dist/_internal/components/form/Toggle/Toggle.js +1 -1
- package/dist/_internal/components/form/Toggle/Toggle.styles.js +1 -1
- package/dist/_internal/components/form/ToggleGroup/ToggleGroup.js +1 -1
- package/dist/_internal/components/form/index.js +7 -7
- package/dist/_internal/components/form/total-form/Fields/CategoryField.js +1 -1
- package/dist/_internal/components/form/total-form/Fields/CepField.js +1 -1
- package/dist/_internal/components/form/total-form/Fields/SelectField.js +1 -1
- package/dist/_internal/components/form/total-form/Fields/TextField.js +1 -1
- package/dist/_internal/components/form/total-form/Fields/ToggleField.js +1 -1
- package/dist/_internal/components/form/total-form/Fields/index.js +1 -1
- package/dist/_internal/components/form/total-form/SubmitButton.js +1 -1
- package/dist/_internal/components/index.js +108 -108
- package/dist/_internal/components/layout/Box/Box.js +1 -1
- package/dist/_internal/components/layout/ContentToolbar/ColumnsMenu.js +1 -1
- package/dist/_internal/components/layout/ContentToolbar/FilterTrigger.js +1 -1
- package/dist/_internal/components/layout/ContentToolbar/MultiSelectDropdown.js +1 -1
- package/dist/_internal/components/layout/ContentToolbar/MultiSelectTriggers.js +1 -1
- package/dist/_internal/components/layout/ContentToolbar/SavedViewsMenu.js +1 -1
- package/dist/_internal/components/layout/ContentToolbar/SortByDropdown.js +1 -1
- package/dist/_internal/components/layout/ContentToolbar/ViewSelector.js +1 -1
- package/dist/_internal/components/layout/Stack/Stack.js +1 -1
- package/dist/_internal/components/layout/TableFilter/TableFilter.js +1 -1
- package/dist/_internal/components/layout/index.js +1 -1
- package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js +8 -8
- package/dist/_internal/components/navigation/AppHeader/AppHeader.identity.js +1 -1
- package/dist/_internal/components/navigation/Breadcrumbs/BreadcrumbEntry.js +3 -3
- package/dist/_internal/components/navigation/Breadcrumbs/Breadcrumbs.js +4 -4
- package/dist/_internal/components/navigation/Breadcrumbs/Breadcrumbs.styles.js +2 -2
- package/dist/_internal/components/navigation/CommandPalette/CommandPalette.js +1 -1
- package/dist/_internal/components/navigation/ContextMenu/ContextMenu.js +1 -1
- package/dist/_internal/components/navigation/DropdownMenu/DropdownMenu.js +1 -1
- package/dist/_internal/components/navigation/NavigationMenu/NavigationMegaSection.js +5 -5
- package/dist/_internal/components/navigation/NavigationMenu/NavigationMenu.js +7 -7
- package/dist/_internal/components/navigation/NavigationMenu/NavigationMenu.shell.js +3 -3
- package/dist/_internal/components/navigation/NavigationMenu/NavigationMenu.styles.js +2 -2
- package/dist/_internal/components/navigation/NavigationMenu/NavigationMenuItem.js +3 -3
- package/dist/_internal/components/navigation/NavigationMenu/NavigationStandardBody.js +5 -5
- package/dist/_internal/components/navigation/Pagination/Pagination.js +1 -1
- package/dist/_internal/components/navigation/index.js +17 -17
- package/dist/_internal/components/typography/Blockquote/Blockquote.js +1 -1
- package/dist/_internal/components/typography/Code/Code.js +1 -1
- package/dist/_internal/components/typography/Text/Text.js +1 -1
- package/dist/_internal/components/typography/index.js +1 -1
- package/dist/_internal/components/utility/AnimatedIcon/AnimatedIcon.js +1 -1
- package/dist/_internal/components/utility/AnimatedIcon/AnimatedIcon.styles.js +1 -1
- package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.js +1 -1
- package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.parts.js +1 -1
- package/dist/_internal/components/utility/WorkflowStep/WorkflowStepRow.js +1 -1
- package/dist/_internal/components/utility/index.js +1 -1
- package/dist/_internal/icons/Icon.js +1 -1
- package/dist/_internal/provider/UiProvider.js +1 -1
- package/dist/_internal/provider/mui-bridge.js +1 -1
- package/dist/_internal/provider/use-ui-theme.js +1 -1
- package/dist/_internal/social-login-button/social-login-button.js +1 -1
- package/dist/_internal/user-avatar/user-avatar.js +5 -5
- package/dist/charts.js +8 -8
- package/dist/{chunk-BNU4RLEC.js → chunk-2FM5SUQV.js} +8 -4
- package/dist/chunk-2FM5SUQV.js.map +1 -0
- package/dist/{chunk-APT5L7V5.js → chunk-2LIRGFEK.js} +2 -2
- package/dist/{chunk-LDDN254Q.js → chunk-2UCLUDEB.js} +2 -2
- package/dist/{chunk-6SYFPRTT.js → chunk-343OLRFT.js} +2 -2
- package/dist/{chunk-VDGJV7MP.js → chunk-3AQD2EA6.js} +9 -9
- package/dist/chunk-3AQD2EA6.js.map +1 -0
- package/dist/{chunk-3GQ6PNEM.js → chunk-3GTMGPNQ.js} +20 -5
- package/dist/chunk-3GTMGPNQ.js.map +1 -0
- package/dist/{chunk-TFZI36UD.js → chunk-3KA6MYIR.js} +4 -3
- package/dist/chunk-3KA6MYIR.js.map +1 -0
- package/dist/{chunk-5VWYCVXF.js → chunk-3U3H3BZM.js} +6 -3
- package/dist/chunk-3U3H3BZM.js.map +1 -0
- package/dist/{chunk-H2YBVBPW.js → chunk-3UIDKLML.js} +15 -11
- package/dist/chunk-3UIDKLML.js.map +1 -0
- package/dist/{chunk-M5BTIIL7.js → chunk-4CHROSWR.js} +15 -14
- package/dist/chunk-4CHROSWR.js.map +1 -0
- package/dist/{chunk-VR3U4QA5.js → chunk-4CTLEUK3.js} +6 -5
- package/dist/chunk-4CTLEUK3.js.map +1 -0
- package/dist/{chunk-ACZH2NUW.js → chunk-4NQXHPQR.js} +6 -4
- package/dist/chunk-4NQXHPQR.js.map +1 -0
- package/dist/{chunk-QTWXVOPT.js → chunk-4OW4O4A2.js} +17 -11
- package/dist/chunk-4OW4O4A2.js.map +1 -0
- package/dist/{chunk-U2IRCTAR.js → chunk-4WCDMCIS.js} +2 -2
- package/dist/{chunk-2F4YEGYG.js → chunk-57FZM6GH.js} +5 -2
- package/dist/chunk-57FZM6GH.js.map +1 -0
- package/dist/{chunk-E6YBXAZN.js → chunk-5IAVC4BT.js} +6 -6
- package/dist/chunk-5IAVC4BT.js.map +1 -0
- package/dist/{chunk-OGTTJKHI.js → chunk-5QWQR7XT.js} +4 -4
- package/dist/{chunk-DRE6DSJ7.js → chunk-5TJRJSJY.js} +3 -3
- package/dist/{chunk-5ZQUJ7LT.js → chunk-5UTAEHSB.js} +5 -2
- package/dist/chunk-5UTAEHSB.js.map +1 -0
- package/dist/{chunk-XZBCPL4N.js → chunk-5W4BLTDI.js} +2 -2
- package/dist/{chunk-Z35J5B6D.js → chunk-62UAI62O.js} +9 -8
- package/dist/chunk-62UAI62O.js.map +1 -0
- package/dist/{chunk-YG2VQUZO.js → chunk-6BDYC4RA.js} +3 -3
- package/dist/{chunk-QHUTSAFG.js → chunk-6CTPDNNX.js} +4 -4
- package/dist/{chunk-CU4TF7C7.js → chunk-6GRZ77IS.js} +4 -4
- package/dist/{chunk-YLBRXDYH.js → chunk-7EIOXZWL.js} +2 -2
- package/dist/{chunk-BD2GGIGS.js → chunk-ADHMNIWS.js} +9 -5
- package/dist/chunk-ADHMNIWS.js.map +1 -0
- package/dist/{chunk-Y2E73IG2.js → chunk-AJ5SDHX5.js} +4 -4
- package/dist/chunk-AJ5SDHX5.js.map +1 -0
- package/dist/{chunk-ZHEZISMI.js → chunk-AK2HOD6B.js} +2 -2
- package/dist/{chunk-2PWVPTS3.js → chunk-AUHYR7ID.js} +11 -9
- package/dist/chunk-AUHYR7ID.js.map +1 -0
- package/dist/{chunk-QWHURFJ3.js → chunk-B2VXP2B2.js} +6 -3
- package/dist/chunk-B2VXP2B2.js.map +1 -0
- package/dist/{chunk-YSKGLU2V.js → chunk-B7BNNSM2.js} +8 -5
- package/dist/chunk-B7BNNSM2.js.map +1 -0
- package/dist/{chunk-7ZWC5CKA.js → chunk-BAFDSAWY.js} +10 -9
- package/dist/chunk-BAFDSAWY.js.map +1 -0
- package/dist/{chunk-VZAGBDZ2.js → chunk-BJZOBG24.js} +2 -2
- package/dist/{chunk-YDPUBGJ7.js → chunk-BNEWMFVB.js} +10 -6
- package/dist/chunk-BNEWMFVB.js.map +1 -0
- package/dist/{chunk-ZUQIOWLN.js → chunk-BSYPPO2I.js} +42 -38
- package/dist/chunk-BSYPPO2I.js.map +1 -0
- package/dist/{chunk-NXX3ZQKO.js → chunk-BYH5GPLT.js} +25 -20
- package/dist/chunk-BYH5GPLT.js.map +1 -0
- package/dist/{chunk-CS3RKXT5.js → chunk-CHFHILTM.js} +2 -2
- package/dist/{chunk-DMYBTD5Y.js → chunk-CPWWMGYR.js} +2 -2
- package/dist/{chunk-L4V2LRKH.js → chunk-CSN3F36H.js} +13 -8
- package/dist/chunk-CSN3F36H.js.map +1 -0
- package/dist/{chunk-XSMMFCMQ.js → chunk-CWDV64TD.js} +3 -3
- package/dist/{chunk-IUCTYNIR.js → chunk-CX66M55F.js} +18 -17
- package/dist/chunk-CX66M55F.js.map +1 -0
- package/dist/{chunk-PGNJCUDA.js → chunk-CZBND7AY.js} +38 -21
- package/dist/chunk-CZBND7AY.js.map +1 -0
- package/dist/{chunk-73HBIIRB.js → chunk-D2UDM2SU.js} +12 -8
- package/dist/chunk-D2UDM2SU.js.map +1 -0
- package/dist/{chunk-YU647YW4.js → chunk-DB2ZFZVW.js} +7 -4
- package/dist/chunk-DB2ZFZVW.js.map +1 -0
- package/dist/{chunk-GUVBR62X.js → chunk-DCJSHYE5.js} +4 -4
- package/dist/{chunk-VV7MGILP.js → chunk-DMWSXWCZ.js} +3 -3
- package/dist/{chunk-JYRQBZEV.js → chunk-DVAAUWTC.js} +2 -2
- package/dist/{chunk-C6NI3FAV.js → chunk-DVGBFT6O.js} +2 -2
- package/dist/{chunk-5RP3KXC7.js → chunk-DY4BP5WA.js} +7 -6
- package/dist/chunk-DY4BP5WA.js.map +1 -0
- package/dist/{chunk-W5ENK5CM.js → chunk-DZNMS2SH.js} +5 -5
- package/dist/{chunk-QO6QWBDI.js → chunk-E4TNDTWV.js} +7 -4
- package/dist/chunk-E4TNDTWV.js.map +1 -0
- package/dist/{chunk-IFSUKWE7.js → chunk-E7T3A4IR.js} +10 -6
- package/dist/chunk-E7T3A4IR.js.map +1 -0
- package/dist/{chunk-I6EVBLFX.js → chunk-EA2UNEL6.js} +20 -11
- package/dist/chunk-EA2UNEL6.js.map +1 -0
- package/dist/{chunk-5E3XZAED.js → chunk-EARWC6PD.js} +6 -2
- package/dist/chunk-EARWC6PD.js.map +1 -0
- package/dist/{chunk-NVNZFT5X.js → chunk-EIYTS5VZ.js} +23 -22
- package/dist/chunk-EIYTS5VZ.js.map +1 -0
- package/dist/{chunk-GN5EZPSL.js → chunk-EJYJLVPK.js} +37 -29
- package/dist/chunk-EJYJLVPK.js.map +1 -0
- package/dist/{chunk-F5KEWLZK.js → chunk-FC7NQ6XM.js} +4 -4
- package/dist/{chunk-MISZGWO7.js → chunk-FPVYD7BO.js} +13 -9
- package/dist/chunk-FPVYD7BO.js.map +1 -0
- package/dist/{chunk-NIS523UM.js → chunk-FWPFCK4D.js} +2 -2
- package/dist/{chunk-7VJH4FYU.js → chunk-FZ4YTEP2.js} +5 -5
- package/dist/chunk-FZ4YTEP2.js.map +1 -0
- package/dist/{chunk-UCTJJYVC.js → chunk-G4HBNILE.js} +2 -2
- package/dist/{chunk-2B76FIMN.js → chunk-GHTBUJ6E.js} +5 -3
- package/dist/chunk-GHTBUJ6E.js.map +1 -0
- package/dist/{chunk-5NFPO3YY.js → chunk-GJRKWDRR.js} +9 -4
- package/dist/chunk-GJRKWDRR.js.map +1 -0
- package/dist/{chunk-VDZQJBAV.js → chunk-GY4NBSCN.js} +5 -2
- package/dist/chunk-GY4NBSCN.js.map +1 -0
- package/dist/{chunk-57IB5NTM.js → chunk-HB7ISSLK.js} +2 -2
- package/dist/{chunk-WR7ELCIL.js → chunk-HCT5ELST.js} +9 -3
- package/dist/chunk-HCT5ELST.js.map +1 -0
- package/dist/{chunk-6Q5GZUQ5.js → chunk-HGMBY5LP.js} +2 -2
- package/dist/{chunk-2AKQPXSJ.js → chunk-HJPPNVCF.js} +2 -2
- package/dist/{chunk-MZMGQKT3.js → chunk-HN3PZTUK.js} +10 -6
- package/dist/chunk-HN3PZTUK.js.map +1 -0
- package/dist/{chunk-JOR6E23V.js → chunk-IGGXKT5B.js} +3 -3
- package/dist/{chunk-F52N6ACD.js → chunk-IM4DMKH4.js} +14 -9
- package/dist/chunk-IM4DMKH4.js.map +1 -0
- package/dist/{chunk-KLMP2BYC.js → chunk-IVJKILIX.js} +2 -2
- package/dist/{chunk-X7PVFAYJ.js → chunk-JGRE56GQ.js} +6 -3
- package/dist/chunk-JGRE56GQ.js.map +1 -0
- package/dist/{chunk-MRB6GROF.js → chunk-JJJM75XF.js} +12 -12
- package/dist/chunk-JJJM75XF.js.map +1 -0
- package/dist/{chunk-HJWOB62A.js → chunk-JJSZP3TW.js} +4 -4
- package/dist/{chunk-AI7NVWIG.js → chunk-JOKWTRWL.js} +2 -2
- package/dist/{chunk-AI7NVWIG.js.map → chunk-JOKWTRWL.js.map} +1 -1
- package/dist/{chunk-JCJGJX7V.js → chunk-K4EKTMTC.js} +10 -6
- package/dist/chunk-K4EKTMTC.js.map +1 -0
- package/dist/{chunk-UCA47HM7.js → chunk-KCAW6HRO.js} +2 -2
- package/dist/{chunk-7HFGVT3G.js → chunk-KJDBY2KN.js} +31 -27
- package/dist/chunk-KJDBY2KN.js.map +1 -0
- package/dist/{chunk-LOJK733T.js → chunk-KJK2Q35C.js} +9 -5
- package/dist/chunk-KJK2Q35C.js.map +1 -0
- package/dist/{chunk-VAGHW3K2.js → chunk-KREWQAEV.js} +9 -4
- package/dist/chunk-KREWQAEV.js.map +1 -0
- package/dist/{chunk-KE5MX4PI.js → chunk-L3B36HA5.js} +2 -2
- package/dist/{chunk-OLZTGVBT.js → chunk-LYVTJLCF.js} +2 -2
- package/dist/{chunk-4M34ALEP.js → chunk-M3MHYE2M.js} +7 -8
- package/dist/chunk-M3MHYE2M.js.map +1 -0
- package/dist/{chunk-2WGMMFGV.js → chunk-M5ZXL52T.js} +15 -14
- package/dist/chunk-M5ZXL52T.js.map +1 -0
- package/dist/{chunk-C6FRVGMC.js → chunk-M6PWPEAV.js} +10 -7
- package/dist/chunk-M6PWPEAV.js.map +1 -0
- package/dist/{chunk-WW4N2LRM.js → chunk-MBC55H6M.js} +4 -4
- package/dist/{chunk-AATIHNPI.js → chunk-MK4CH4VT.js} +2 -2
- package/dist/{chunk-RV4Y4O67.js → chunk-MLQYIJTO.js} +6 -5
- package/dist/chunk-MLQYIJTO.js.map +1 -0
- package/dist/{chunk-A2CTAEIS.js → chunk-MO47Y26B.js} +24 -23
- package/dist/chunk-MO47Y26B.js.map +1 -0
- package/dist/{chunk-XRMZMBE3.js → chunk-MTEQEPNY.js} +7 -3
- package/dist/chunk-MTEQEPNY.js.map +1 -0
- package/dist/{chunk-JWK4GI2I.js → chunk-N2GEKC4J.js} +32 -20
- package/dist/chunk-N2GEKC4J.js.map +1 -0
- package/dist/{chunk-AJSPLHG4.js → chunk-NNQCWXGY.js} +8 -5
- package/dist/chunk-NNQCWXGY.js.map +1 -0
- package/dist/{chunk-IDO4EV7T.js → chunk-NR5TW4AH.js} +3 -3
- package/dist/{chunk-O26MKGIC.js → chunk-NRIV2CQ2.js} +12 -6
- package/dist/chunk-NRIV2CQ2.js.map +1 -0
- package/dist/{chunk-6DC5SVHM.js → chunk-NSKQANRY.js} +2 -2
- package/dist/{chunk-24NXQG5F.js → chunk-ODFJTEIL.js} +11 -10
- package/dist/chunk-ODFJTEIL.js.map +1 -0
- package/dist/{chunk-MLBKACV6.js → chunk-OG6LYQ7C.js} +13 -11
- package/dist/chunk-OG6LYQ7C.js.map +1 -0
- package/dist/{chunk-H6YVO55T.js → chunk-OHZU4IT3.js} +17 -13
- package/dist/chunk-OHZU4IT3.js.map +1 -0
- package/dist/{chunk-EAE5Z5HL.js → chunk-OJ2XR3WH.js} +2 -2
- package/dist/{chunk-BR7RM3WR.js → chunk-OZPLAOI4.js} +2 -2
- package/dist/{chunk-DZHN5FFX.js → chunk-PBMCRDZI.js} +7 -6
- package/dist/chunk-PBMCRDZI.js.map +1 -0
- package/dist/{chunk-ZXSUWFQX.js → chunk-PGPPN63I.js} +8 -5
- package/dist/chunk-PGPPN63I.js.map +1 -0
- package/dist/{chunk-ZWSS3K4F.js → chunk-PL2AB5HJ.js} +11 -6
- package/dist/chunk-PL2AB5HJ.js.map +1 -0
- package/dist/{chunk-ZTKLKOOO.js → chunk-POV2KL2P.js} +21 -20
- package/dist/chunk-POV2KL2P.js.map +1 -0
- package/dist/{chunk-GIRRCEVH.js → chunk-PT2XADGH.js} +4 -4
- package/dist/{chunk-5ZTQTJAJ.js → chunk-PWF32ILG.js} +4 -4
- package/dist/{chunk-65YAR3OZ.js → chunk-Q2YNXJEL.js} +11 -7
- package/dist/chunk-Q2YNXJEL.js.map +1 -0
- package/dist/{chunk-DBCITC4P.js → chunk-QB3TVUPD.js} +6 -6
- package/dist/{chunk-I2CRLUS7.js → chunk-QIKPGMMO.js} +2 -2
- package/dist/{chunk-MXZ43UCQ.js → chunk-QOLIBVGS.js} +3 -3
- package/dist/{chunk-TPQVLBTY.js → chunk-R2WMSXQR.js} +3 -3
- package/dist/{chunk-ULIM42PE.js → chunk-RIF6L54B.js} +10 -8
- package/dist/chunk-RIF6L54B.js.map +1 -0
- package/dist/{chunk-M5T3COS2.js → chunk-RIRTW5EU.js} +17 -5
- package/dist/chunk-RIRTW5EU.js.map +1 -0
- package/dist/{chunk-JHEGDDZQ.js → chunk-RKI3MRKX.js} +6 -3
- package/dist/chunk-RKI3MRKX.js.map +1 -0
- package/dist/{chunk-SYNMQWT4.js → chunk-RL2UIC4E.js} +7 -4
- package/dist/chunk-RL2UIC4E.js.map +1 -0
- package/dist/{chunk-RORP6DWR.js → chunk-RZ2C5CAW.js} +13 -12
- package/dist/chunk-RZ2C5CAW.js.map +1 -0
- package/dist/{chunk-UO7ERXYX.js → chunk-S3D5VBHW.js} +16 -6
- package/dist/chunk-S3D5VBHW.js.map +1 -0
- package/dist/{chunk-SCRN2RE4.js → chunk-S5UY5U73.js} +1 -2
- package/dist/chunk-S5UY5U73.js.map +1 -0
- package/dist/{chunk-4V532JF6.js → chunk-SOHQPPYJ.js} +8 -6
- package/dist/chunk-SOHQPPYJ.js.map +1 -0
- package/dist/{chunk-XREYLKUX.js → chunk-SQYC57ZN.js} +12 -11
- package/dist/chunk-SQYC57ZN.js.map +1 -0
- package/dist/{chunk-F7HQVKIR.js → chunk-SYVNWXVW.js} +4 -4
- package/dist/{chunk-CMTR3WEA.js → chunk-TNQDSTIA.js} +30 -33
- package/dist/chunk-TNQDSTIA.js.map +1 -0
- package/dist/{chunk-MGC4QOMP.js → chunk-TQ2557I5.js} +1 -1
- package/dist/{chunk-C7TCBAVX.js → chunk-TQBRWZA4.js} +2 -2
- package/dist/{chunk-56QVP2MU.js → chunk-TQCQCW2P.js} +18 -11
- package/dist/chunk-TQCQCW2P.js.map +1 -0
- package/dist/{chunk-CZT3AV7I.js → chunk-TRHWA74K.js} +6 -3
- package/dist/chunk-TRHWA74K.js.map +1 -0
- package/dist/{chunk-EDO2WS5B.js → chunk-TXGB2WSW.js} +7 -4
- package/dist/chunk-TXGB2WSW.js.map +1 -0
- package/dist/{chunk-NNQLDFKG.js → chunk-TYBZ4XZZ.js} +15 -9
- package/dist/chunk-TYBZ4XZZ.js.map +1 -0
- package/dist/{chunk-TEUX42YW.js → chunk-TZASFX6G.js} +10 -7
- package/dist/chunk-TZASFX6G.js.map +1 -0
- package/dist/{chunk-BO2SDMNQ.js → chunk-U4QUDFPJ.js} +2 -2
- package/dist/{chunk-AQSX3YH2.js → chunk-UL7L6MFT.js} +18 -10
- package/dist/chunk-UL7L6MFT.js.map +1 -0
- package/dist/{chunk-SKX4NA6E.js → chunk-V74PXUQN.js} +8 -8
- package/dist/{chunk-A2DYU5WN.js → chunk-VIUDWOV6.js} +5 -6
- package/dist/chunk-VIUDWOV6.js.map +1 -0
- package/dist/{chunk-5ZT4ZIZB.js → chunk-VNOFFVRQ.js} +6 -3
- package/dist/chunk-VNOFFVRQ.js.map +1 -0
- package/dist/{chunk-UMP5MQ7X.js → chunk-WFAJTO2B.js} +27 -26
- package/dist/chunk-WFAJTO2B.js.map +1 -0
- package/dist/{chunk-OYP27CYE.js → chunk-WOAXKWAB.js} +2 -2
- package/dist/{chunk-W3CLJ7JE.js → chunk-WPA26LXA.js} +4 -4
- package/dist/{chunk-2X5OQDPH.js → chunk-WRCLYSTX.js} +7 -4
- package/dist/chunk-WRCLYSTX.js.map +1 -0
- package/dist/{chunk-X4PS3E3V.js → chunk-X6AIKCAV.js} +8 -5
- package/dist/chunk-X6AIKCAV.js.map +1 -0
- package/dist/{chunk-KTYZRAB7.js → chunk-XJPJ6ESI.js} +9 -6
- package/dist/chunk-XJPJ6ESI.js.map +1 -0
- package/dist/{chunk-GVLMG5WQ.js → chunk-XZW2U6KR.js} +9 -9
- package/dist/chunk-XZW2U6KR.js.map +1 -0
- package/dist/{chunk-LI6OLYUB.js → chunk-YBTC4XNO.js} +2 -2
- package/dist/chunk-YLGY3D52.js +62 -0
- package/dist/chunk-YLGY3D52.js.map +1 -0
- package/dist/{chunk-H3B5PIM3.js → chunk-YYVB7IWQ.js} +19 -11
- package/dist/chunk-YYVB7IWQ.js.map +1 -0
- package/dist/{chunk-OOSD7363.js → chunk-ZAFFKQQU.js} +6 -6
- package/dist/chunk-ZAFFKQQU.js.map +1 -0
- package/dist/{chunk-IT7ATXU7.js → chunk-ZHV7TCAC.js} +15 -11
- package/dist/chunk-ZHV7TCAC.js.map +1 -0
- package/dist/{chunk-KUVOMH5I.js → chunk-ZZ4MMUBY.js} +5 -4
- package/dist/chunk-ZZ4MMUBY.js.map +1 -0
- package/dist/data-display/Alert.js +3 -3
- package/dist/data-display/AlertDialog.js +2 -2
- package/dist/data-display/AsyncStateContainer.js +5 -5
- package/dist/data-display/Avatar.js +4 -4
- package/dist/data-display/Badge.js +6 -6
- package/dist/data-display/Banner.js +3 -3
- package/dist/data-display/CardKit.js +12 -12
- package/dist/data-display/Carousel.js +6 -6
- package/dist/data-display/Chart.js +8 -8
- package/dist/data-display/Chip.js +3 -2
- package/dist/data-display/DataGrid.js +3 -2
- package/dist/data-display/DataViews.js +49 -49
- package/dist/data-display/DescriptionItem.js +2 -2
- package/dist/data-display/EmptyState.js +2 -1
- package/dist/data-display/ErrorState.js +1 -1
- package/dist/data-display/FleetMap.js +17 -17
- package/dist/data-display/HoverCard.js +5 -4
- package/dist/data-display/InteractiveTooltip.js +4 -4
- package/dist/data-display/LazyImage.js +3 -2
- package/dist/data-display/Lightbox.js +9 -9
- package/dist/data-display/LoadingState.js +2 -1
- package/dist/data-display/MapPreview.js +12 -12
- package/dist/data-display/Popover.js +2 -1
- package/dist/data-display/Progress.js +3 -3
- package/dist/data-display/SectionOnboarding.js +4 -4
- package/dist/data-display/Sheet.js +7 -7
- package/dist/data-display/StatCard.js +2 -2
- package/dist/data-display/Stepper.js +2 -2
- package/dist/data-display/Table.js +2 -2
- package/dist/data-display/Timeline.js +3 -3
- package/dist/data-display/TimingDiagram.js +3 -3
- package/dist/data-display/Tooltip.js +2 -2
- package/dist/feedback/ConfirmAction.js +6 -6
- package/dist/feedback/NotificationStatusNotice.js +4 -4
- package/dist/feedback/Sonner.js +1 -1
- package/dist/form/AddressAutocomplete.js +1 -1
- package/dist/form/Button.js +1 -1
- package/dist/form/CategorySelect.js +1 -1
- package/dist/form/CepField.js +1 -1
- package/dist/form/Checkbox.js +1 -1
- package/dist/form/CodeEditor.js +1 -1
- package/dist/form/Command.js +1 -1
- package/dist/form/CreatableSelect.js +1 -1
- package/dist/form/DateRangePicker.js +6 -6
- package/dist/form/InputOTP.js +1 -1
- package/dist/form/Label.js +1 -1
- package/dist/form/Menubar.js +1 -1
- package/dist/form/PhoneInput.js +1 -1
- package/dist/form/RadioGroup.js +1 -1
- package/dist/form/RichTextEditor.js +1 -1
- package/dist/form/Slider.js +1 -1
- package/dist/form/Switch.js +1 -1
- package/dist/form/Textarea.js +2 -2
- package/dist/form/Toggle.js +1 -1
- package/dist/form/ToggleGroup.js +1 -1
- package/dist/form/total-form.js +1 -1
- package/dist/icons.js +1 -1
- package/dist/layout/Box.js +1 -1
- package/dist/layout/ContentToolbar.js +1 -1
- package/dist/layout/Stack.js +1 -1
- package/dist/layout/TableFilter.js +1 -1
- package/dist/navigation/AppHeader.js +8 -8
- package/dist/navigation/Breadcrumbs.js +4 -4
- package/dist/navigation/CommandPalette.js +1 -1
- package/dist/navigation/ContextMenu.js +1 -1
- package/dist/navigation/DropdownMenu.js +1 -1
- package/dist/navigation/NavigationMenu.js +7 -7
- package/dist/navigation/Pagination.js +1 -1
- package/dist/provider.js +1 -1
- package/dist/social-login-button.js +1 -1
- package/dist/tokens.js +7 -7
- package/dist/types/components/data-display/Alert/Alert.styles.d.ts +4 -4
- package/dist/types/components/data-display/Alert/Alert.styles.d.ts.map +1 -1
- package/dist/types/components/data-display/AlertDialog/AlertDialog.d.ts.map +1 -1
- package/dist/types/components/data-display/Avatar/Avatar.animations.d.ts +2 -1
- package/dist/types/components/data-display/Avatar/Avatar.animations.d.ts.map +1 -1
- package/dist/types/components/data-display/Avatar/Avatar.d.ts.map +1 -1
- package/dist/types/components/data-display/Avatar/Avatar.view.d.ts.map +1 -1
- package/dist/types/components/data-display/Badge/Badge.animations.d.ts +4 -3
- package/dist/types/components/data-display/Badge/Badge.animations.d.ts.map +1 -1
- package/dist/types/components/data-display/Badge/Badge.styles.d.ts +6 -5
- package/dist/types/components/data-display/Badge/Badge.styles.d.ts.map +1 -1
- package/dist/types/components/data-display/Badge/BadgeContent.d.ts.map +1 -1
- package/dist/types/components/data-display/Banner/Banner.styles.d.ts +1 -1
- package/dist/types/components/data-display/Banner/Banner.styles.d.ts.map +1 -1
- package/dist/types/components/data-display/Carousel/Carousel.d.ts.map +1 -1
- package/dist/types/components/data-display/Carousel/Carousel.parts.d.ts.map +1 -1
- package/dist/types/components/data-display/Carousel/Carousel.slide.d.ts.map +1 -1
- package/dist/types/components/data-display/Carousel/Carousel.styles.d.ts +14 -2
- package/dist/types/components/data-display/Carousel/Carousel.styles.d.ts.map +1 -1
- package/dist/types/components/data-display/Chart/ChartComposables.d.ts +3 -1
- package/dist/types/components/data-display/Chart/ChartComposables.d.ts.map +1 -1
- package/dist/types/components/data-display/Chart/chart-axis.d.ts +9 -3
- package/dist/types/components/data-display/Chart/chart-axis.d.ts.map +1 -1
- package/dist/types/components/data-display/Chart/chart-context.d.ts.map +1 -1
- package/dist/types/components/data-display/Chart/chart-internals.d.ts +5 -1
- package/dist/types/components/data-display/Chart/chart-internals.d.ts.map +1 -1
- package/dist/types/components/data-display/Chart/chart-renderers.d.ts.map +1 -1
- package/dist/types/components/data-display/Chip/Chip.styles.d.ts.map +1 -1
- package/dist/types/components/data-display/DataGrid/DataGrid.states.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/DataViewsBoard.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/base-card.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/base-list-card-geometry.d.ts +21 -17
- package/dist/types/components/data-display/DataViews/base-list-card-geometry.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/base-list-card-gutters.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/base-list-card-slots.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/card-surface.d.ts +1 -1
- package/dist/types/components/data-display/DataViews/card-surface.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-day-input.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-display-panel.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-drag.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-empty.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-export.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-glyphs.d.ts +3 -2
- package/dist/types/components/data-display/DataViews/data-views-glyphs.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-grid-helpers.d.ts +2 -1
- package/dist/types/components/data-display/DataViews/data-views-grid-helpers.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-more-filters.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-number-input.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-scopes.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-search.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-toolbar.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/save-view-preview.d.ts.map +1 -1
- package/dist/types/components/data-display/DateTimeDisplay/DateTimeDisplay.d.ts.map +1 -1
- package/dist/types/components/data-display/DescriptionItem/DescriptionItem.d.ts.map +1 -1
- package/dist/types/components/data-display/EmptyState/EmptyState.d.ts.map +1 -1
- package/dist/types/components/data-display/FleetMap/FleetBody.d.ts.map +1 -1
- package/dist/types/components/data-display/FleetMap/FleetMap.d.ts.map +1 -1
- package/dist/types/components/data-display/FleetMap/FleetRoster.d.ts.map +1 -1
- package/dist/types/components/data-display/HoverCard/HoverCard.animations.d.ts +6 -5
- package/dist/types/components/data-display/HoverCard/HoverCard.animations.d.ts.map +1 -1
- package/dist/types/components/data-display/HoverCard/HoverCard.content.d.ts.map +1 -1
- package/dist/types/components/data-display/HoverCard/HoverCard.d.ts.map +1 -1
- package/dist/types/components/data-display/HoverCard/HoverCard.styles.d.ts.map +1 -1
- package/dist/types/components/data-display/InteractiveTooltip/InteractiveTooltip.d.ts.map +1 -1
- package/dist/types/components/data-display/InteractiveTooltip/InteractiveTooltip.hooks.d.ts +1 -1
- package/dist/types/components/data-display/InteractiveTooltip/InteractiveTooltip.hooks.d.ts.map +1 -1
- package/dist/types/components/data-display/InteractiveTooltip/InteractiveTooltip.styles.d.ts +6 -1
- package/dist/types/components/data-display/InteractiveTooltip/InteractiveTooltip.styles.d.ts.map +1 -1
- 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/components/data-display/Lightbox/Lightbox.constants.d.ts +5 -1
- package/dist/types/components/data-display/Lightbox/Lightbox.constants.d.ts.map +1 -1
- package/dist/types/components/data-display/Lightbox/Lightbox.d.ts.map +1 -1
- package/dist/types/components/data-display/Lightbox/Lightbox.hooks.d.ts.map +1 -1
- package/dist/types/components/data-display/Lightbox/LightboxControls.d.ts.map +1 -1
- package/dist/types/components/data-display/Lightbox/LightboxStage.d.ts.map +1 -1
- package/dist/types/components/data-display/Lightbox/LightboxThumbnails.d.ts.map +1 -1
- package/dist/types/components/data-display/LoadingState/LoadingState.d.ts.map +1 -1
- package/dist/types/components/data-display/MapPreview/MapControlBar.d.ts.map +1 -1
- package/dist/types/components/data-display/MapPreview/MapLayers.d.ts.map +1 -1
- package/dist/types/components/data-display/MapPreview/MapOverlays.d.ts +5 -2
- package/dist/types/components/data-display/MapPreview/MapOverlays.d.ts.map +1 -1
- package/dist/types/components/data-display/MapPreview/MapPreview.d.ts.map +1 -1
- package/dist/types/components/data-display/MapPreview/MapPreview.helpers.d.ts +1 -1
- package/dist/types/components/data-display/MapPreview/MapPreview.helpers.d.ts.map +1 -1
- package/dist/types/components/data-display/MapPreview/MapSearchBar.d.ts.map +1 -1
- package/dist/types/components/data-display/MapPreview/mapSurface.d.ts +2 -2
- package/dist/types/components/data-display/MapPreview/mapSurface.d.ts.map +1 -1
- package/dist/types/components/data-display/Popover/Popover.d.ts.map +1 -1
- package/dist/types/components/data-display/Progress/Progress.d.ts.map +1 -1
- package/dist/types/components/data-display/Progress/Progress.styles.d.ts +9 -7
- package/dist/types/components/data-display/Progress/Progress.styles.d.ts.map +1 -1
- package/dist/types/components/data-display/Sheet/Sheet.animations.d.ts +4 -3
- package/dist/types/components/data-display/Sheet/Sheet.animations.d.ts.map +1 -1
- package/dist/types/components/data-display/Sheet/Sheet.body.d.ts.map +1 -1
- package/dist/types/components/data-display/Sheet/Sheet.parts.d.ts.map +1 -1
- package/dist/types/components/data-display/Sheet/Sheet.styles.d.ts.map +1 -1
- package/dist/types/components/data-display/StatCard/StatCard.d.ts.map +1 -1
- package/dist/types/components/data-display/Table/Table.d.ts.map +1 -1
- package/dist/types/components/data-display/Table/Table.styles.d.ts.map +1 -1
- package/dist/types/components/data-display/Timeline/Timeline.d.ts.map +1 -1
- package/dist/types/components/data-display/Timeline/TimelineRow.d.ts.map +1 -1
- package/dist/types/components/data-display/TimingDiagram/TimingDiagram.d.ts.map +1 -1
- package/dist/types/components/data-display/TimingDiagram/TimingDiagram.views.d.ts +2 -1
- package/dist/types/components/data-display/TimingDiagram/TimingDiagram.views.d.ts.map +1 -1
- package/dist/types/components/data-display/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/typography/Blockquote.js +1 -1
- package/dist/typography/Code.js +1 -1
- package/dist/typography/Text.js +1 -1
- package/dist/user-avatar.js +5 -5
- package/dist/utility/AnimatedIcon.js +1 -1
- package/dist/utility/WorkflowStep.js +1 -1
- package/package.json +1 -1
- package/src/components/data-display/Alert/Alert.styles.tsx +22 -21
- package/src/components/data-display/Alert/Alert.tsx +8 -8
- package/src/components/data-display/AlertDialog/AlertDialog.tsx +12 -10
- package/src/components/data-display/Avatar/Avatar.animations.ts +5 -2
- package/src/components/data-display/Avatar/Avatar.tsx +4 -3
- package/src/components/data-display/Avatar/Avatar.view.tsx +31 -37
- package/src/components/data-display/Badge/Badge.animations.ts +13 -10
- package/src/components/data-display/Badge/Badge.styles.ts +30 -40
- package/src/components/data-display/Badge/Badge.variants.ts +13 -13
- package/src/components/data-display/Badge/BadgeContent.tsx +10 -4
- package/src/components/data-display/Banner/Banner.styles.ts +8 -8
- package/src/components/data-display/Banner/Banner.tsx +4 -4
- package/src/components/data-display/CardKit/list-card-parts.tsx +1 -1
- package/src/components/data-display/Carousel/Carousel.parts.tsx +13 -11
- package/src/components/data-display/Carousel/Carousel.slide.tsx +3 -2
- package/src/components/data-display/Carousel/Carousel.styles.ts +34 -16
- package/src/components/data-display/Carousel/Carousel.tsx +2 -3
- package/src/components/data-display/Chart/Chart.tsx +4 -4
- package/src/components/data-display/Chart/ChartComposables.tsx +16 -5
- package/src/components/data-display/Chart/chart-axis.ts +13 -9
- package/src/components/data-display/Chart/chart-context.ts +17 -2
- package/src/components/data-display/Chart/chart-internals.ts +30 -13
- package/src/components/data-display/Chart/chart-renderers.tsx +2 -1
- package/src/components/data-display/Chip/Chip.styles.tsx +4 -3
- package/src/components/data-display/DataGrid/DataGrid.states.tsx +3 -1
- package/src/components/data-display/DataViews/DataViewsBoard.tsx +16 -8
- package/src/components/data-display/DataViews/base-card.tsx +12 -11
- package/src/components/data-display/DataViews/base-list-card-geometry.tsx +28 -19
- package/src/components/data-display/DataViews/base-list-card-gutters.tsx +2 -1
- package/src/components/data-display/DataViews/base-list-card-slots.tsx +13 -11
- package/src/components/data-display/DataViews/card-surface.ts +19 -18
- package/src/components/data-display/DataViews/data-views-day-input.tsx +2 -1
- package/src/components/data-display/DataViews/data-views-display-panel.tsx +5 -4
- package/src/components/data-display/DataViews/data-views-display-tabs.tsx +6 -6
- package/src/components/data-display/DataViews/data-views-drag.tsx +7 -5
- package/src/components/data-display/DataViews/data-views-empty.tsx +2 -1
- package/src/components/data-display/DataViews/data-views-export.tsx +5 -3
- package/src/components/data-display/DataViews/data-views-glyphs.tsx +17 -14
- package/src/components/data-display/DataViews/data-views-grid-helpers.tsx +8 -5
- package/src/components/data-display/DataViews/data-views-more-filters.tsx +5 -4
- package/src/components/data-display/DataViews/data-views-number-input.tsx +2 -1
- package/src/components/data-display/DataViews/data-views-range-pill.tsx +1 -1
- package/src/components/data-display/DataViews/data-views-scopes.tsx +12 -6
- package/src/components/data-display/DataViews/data-views-search.tsx +9 -8
- package/src/components/data-display/DataViews/data-views-toolbar.tsx +2 -1
- package/src/components/data-display/DataViews/data-views-view-nav.tsx +4 -4
- package/src/components/data-display/DataViews/save-view-preview.tsx +3 -2
- package/src/components/data-display/DateTimeDisplay/DateTimeDisplay.tsx +4 -3
- package/src/components/data-display/DescriptionItem/DescriptionItem.tsx +6 -3
- package/src/components/data-display/EmptyState/EmptyState.tsx +6 -5
- package/src/components/data-display/ErrorState/ErrorState.tsx +6 -6
- package/src/components/data-display/FleetMap/FleetBody.tsx +4 -1
- package/src/components/data-display/FleetMap/FleetMap.tsx +6 -4
- package/src/components/data-display/FleetMap/FleetRoster.tsx +7 -5
- package/src/components/data-display/HoverCard/HoverCard.animations.ts +13 -11
- package/src/components/data-display/HoverCard/HoverCard.content.tsx +8 -5
- package/src/components/data-display/HoverCard/HoverCard.styles.ts +40 -38
- package/src/components/data-display/HoverCard/HoverCard.tsx +19 -8
- package/src/components/data-display/InteractiveTooltip/InteractiveTooltip.hooks.ts +2 -2
- package/src/components/data-display/InteractiveTooltip/InteractiveTooltip.styles.ts +25 -12
- package/src/components/data-display/InteractiveTooltip/InteractiveTooltip.tsx +3 -2
- package/src/components/data-display/LazyImage/LazyImage.hooks.ts +8 -3
- package/src/components/data-display/LazyImage/LazyImage.tsx +48 -23
- package/src/components/data-display/Lightbox/Lightbox.constants.ts +7 -2
- package/src/components/data-display/Lightbox/Lightbox.hooks.ts +7 -4
- package/src/components/data-display/Lightbox/Lightbox.tsx +3 -2
- package/src/components/data-display/Lightbox/LightboxControls.tsx +6 -5
- package/src/components/data-display/Lightbox/LightboxStage.tsx +30 -18
- package/src/components/data-display/Lightbox/LightboxThumbnails.tsx +10 -8
- package/src/components/data-display/LoadingState/LoadingState.tsx +4 -3
- package/src/components/data-display/MapPreview/MapControlBar.tsx +3 -2
- package/src/components/data-display/MapPreview/MapDecorations.tsx +12 -12
- package/src/components/data-display/MapPreview/MapLayers.tsx +1 -2
- package/src/components/data-display/MapPreview/MapMarkers.tsx +8 -8
- package/src/components/data-display/MapPreview/MapOverlays.tsx +8 -5
- package/src/components/data-display/MapPreview/MapPreview.helpers.ts +3 -4
- package/src/components/data-display/MapPreview/MapPreview.tsx +3 -1
- package/src/components/data-display/MapPreview/MapSearchBar.tsx +4 -3
- package/src/components/data-display/MapPreview/mapSurface.ts +6 -4
- package/src/components/data-display/Popover/Popover.tsx +23 -11
- package/src/components/data-display/Progress/Progress.styles.ts +20 -11
- package/src/components/data-display/Progress/Progress.tsx +12 -9
- package/src/components/data-display/Sheet/Sheet.animations.ts +11 -9
- package/src/components/data-display/Sheet/Sheet.body.tsx +2 -1
- package/src/components/data-display/Sheet/Sheet.parts.tsx +8 -7
- package/src/components/data-display/Sheet/Sheet.styles.ts +35 -30
- package/src/components/data-display/StatCard/StatCard.tsx +4 -3
- package/src/components/data-display/Stepper/Stepper.tsx +17 -17
- package/src/components/data-display/Table/Table.styles.ts +21 -20
- package/src/components/data-display/Table/Table.tsx +26 -16
- package/src/components/data-display/Timeline/Timeline.tsx +4 -3
- package/src/components/data-display/Timeline/TimelineRow.tsx +23 -22
- package/src/components/data-display/TimingDiagram/TimingDiagram.tsx +8 -7
- package/src/components/data-display/TimingDiagram/TimingDiagram.views.tsx +29 -28
- package/src/components/data-display/Tooltip/Tooltip.tsx +23 -10
- package/dist/chunk-24NXQG5F.js.map +0 -1
- package/dist/chunk-2B76FIMN.js.map +0 -1
- package/dist/chunk-2F4YEGYG.js.map +0 -1
- package/dist/chunk-2PWVPTS3.js.map +0 -1
- package/dist/chunk-2WGMMFGV.js.map +0 -1
- package/dist/chunk-2X5OQDPH.js.map +0 -1
- package/dist/chunk-3GQ6PNEM.js.map +0 -1
- package/dist/chunk-4M34ALEP.js.map +0 -1
- package/dist/chunk-4V532JF6.js.map +0 -1
- package/dist/chunk-56QVP2MU.js.map +0 -1
- package/dist/chunk-5E3XZAED.js.map +0 -1
- package/dist/chunk-5NFPO3YY.js.map +0 -1
- package/dist/chunk-5RP3KXC7.js.map +0 -1
- package/dist/chunk-5VWYCVXF.js.map +0 -1
- package/dist/chunk-5ZQUJ7LT.js.map +0 -1
- package/dist/chunk-5ZT4ZIZB.js.map +0 -1
- package/dist/chunk-65YAR3OZ.js.map +0 -1
- package/dist/chunk-73HBIIRB.js.map +0 -1
- package/dist/chunk-7HFGVT3G.js.map +0 -1
- package/dist/chunk-7VJH4FYU.js.map +0 -1
- package/dist/chunk-7ZWC5CKA.js.map +0 -1
- package/dist/chunk-A2CTAEIS.js.map +0 -1
- package/dist/chunk-A2DYU5WN.js.map +0 -1
- package/dist/chunk-ACZH2NUW.js.map +0 -1
- package/dist/chunk-AJSPLHG4.js.map +0 -1
- package/dist/chunk-AQSX3YH2.js.map +0 -1
- package/dist/chunk-BD2GGIGS.js.map +0 -1
- package/dist/chunk-BNU4RLEC.js.map +0 -1
- package/dist/chunk-C6FRVGMC.js.map +0 -1
- package/dist/chunk-CMTR3WEA.js.map +0 -1
- package/dist/chunk-CZT3AV7I.js.map +0 -1
- package/dist/chunk-DZHN5FFX.js.map +0 -1
- package/dist/chunk-E6YBXAZN.js.map +0 -1
- package/dist/chunk-EDO2WS5B.js.map +0 -1
- package/dist/chunk-F52N6ACD.js.map +0 -1
- package/dist/chunk-GN5EZPSL.js.map +0 -1
- package/dist/chunk-GVLMG5WQ.js.map +0 -1
- package/dist/chunk-H2YBVBPW.js.map +0 -1
- package/dist/chunk-H3B5PIM3.js.map +0 -1
- package/dist/chunk-H6YVO55T.js.map +0 -1
- package/dist/chunk-I6EVBLFX.js.map +0 -1
- package/dist/chunk-IFSUKWE7.js.map +0 -1
- package/dist/chunk-IT7ATXU7.js.map +0 -1
- package/dist/chunk-IUCTYNIR.js.map +0 -1
- package/dist/chunk-JCJGJX7V.js.map +0 -1
- package/dist/chunk-JHEGDDZQ.js.map +0 -1
- package/dist/chunk-JWK4GI2I.js.map +0 -1
- package/dist/chunk-KTYZRAB7.js.map +0 -1
- package/dist/chunk-KUVOMH5I.js.map +0 -1
- package/dist/chunk-L4V2LRKH.js.map +0 -1
- package/dist/chunk-LOJK733T.js.map +0 -1
- package/dist/chunk-M5BTIIL7.js.map +0 -1
- package/dist/chunk-M5T3COS2.js.map +0 -1
- package/dist/chunk-MISZGWO7.js.map +0 -1
- package/dist/chunk-MLBKACV6.js.map +0 -1
- package/dist/chunk-MRB6GROF.js.map +0 -1
- package/dist/chunk-MZMGQKT3.js.map +0 -1
- package/dist/chunk-NNQLDFKG.js.map +0 -1
- package/dist/chunk-NVNZFT5X.js.map +0 -1
- package/dist/chunk-NXX3ZQKO.js.map +0 -1
- package/dist/chunk-O26MKGIC.js.map +0 -1
- package/dist/chunk-OOSD7363.js.map +0 -1
- package/dist/chunk-PGNJCUDA.js.map +0 -1
- package/dist/chunk-QO6QWBDI.js.map +0 -1
- package/dist/chunk-QTWXVOPT.js.map +0 -1
- package/dist/chunk-QWHURFJ3.js.map +0 -1
- package/dist/chunk-RORP6DWR.js.map +0 -1
- package/dist/chunk-RV4Y4O67.js.map +0 -1
- package/dist/chunk-SCRN2RE4.js.map +0 -1
- package/dist/chunk-SNR537TI.js +0 -59
- package/dist/chunk-SNR537TI.js.map +0 -1
- package/dist/chunk-SYNMQWT4.js.map +0 -1
- package/dist/chunk-TEUX42YW.js.map +0 -1
- package/dist/chunk-TFZI36UD.js.map +0 -1
- package/dist/chunk-ULIM42PE.js.map +0 -1
- package/dist/chunk-UMP5MQ7X.js.map +0 -1
- package/dist/chunk-UO7ERXYX.js.map +0 -1
- package/dist/chunk-VAGHW3K2.js.map +0 -1
- package/dist/chunk-VDGJV7MP.js.map +0 -1
- package/dist/chunk-VDZQJBAV.js.map +0 -1
- package/dist/chunk-VR3U4QA5.js.map +0 -1
- package/dist/chunk-WR7ELCIL.js.map +0 -1
- package/dist/chunk-X4PS3E3V.js.map +0 -1
- package/dist/chunk-X7PVFAYJ.js.map +0 -1
- package/dist/chunk-XREYLKUX.js.map +0 -1
- package/dist/chunk-XRMZMBE3.js.map +0 -1
- package/dist/chunk-Y2E73IG2.js.map +0 -1
- package/dist/chunk-YDPUBGJ7.js.map +0 -1
- package/dist/chunk-YSKGLU2V.js.map +0 -1
- package/dist/chunk-YU647YW4.js.map +0 -1
- package/dist/chunk-Z35J5B6D.js.map +0 -1
- package/dist/chunk-ZTKLKOOO.js.map +0 -1
- package/dist/chunk-ZUQIOWLN.js.map +0 -1
- package/dist/chunk-ZWSS3K4F.js.map +0 -1
- package/dist/chunk-ZXSUWFQX.js.map +0 -1
- /package/dist/{chunk-APT5L7V5.js.map → chunk-2LIRGFEK.js.map} +0 -0
- /package/dist/{chunk-LDDN254Q.js.map → chunk-2UCLUDEB.js.map} +0 -0
- /package/dist/{chunk-6SYFPRTT.js.map → chunk-343OLRFT.js.map} +0 -0
- /package/dist/{chunk-U2IRCTAR.js.map → chunk-4WCDMCIS.js.map} +0 -0
- /package/dist/{chunk-OGTTJKHI.js.map → chunk-5QWQR7XT.js.map} +0 -0
- /package/dist/{chunk-DRE6DSJ7.js.map → chunk-5TJRJSJY.js.map} +0 -0
- /package/dist/{chunk-XZBCPL4N.js.map → chunk-5W4BLTDI.js.map} +0 -0
- /package/dist/{chunk-YG2VQUZO.js.map → chunk-6BDYC4RA.js.map} +0 -0
- /package/dist/{chunk-QHUTSAFG.js.map → chunk-6CTPDNNX.js.map} +0 -0
- /package/dist/{chunk-CU4TF7C7.js.map → chunk-6GRZ77IS.js.map} +0 -0
- /package/dist/{chunk-YLBRXDYH.js.map → chunk-7EIOXZWL.js.map} +0 -0
- /package/dist/{chunk-ZHEZISMI.js.map → chunk-AK2HOD6B.js.map} +0 -0
- /package/dist/{chunk-VZAGBDZ2.js.map → chunk-BJZOBG24.js.map} +0 -0
- /package/dist/{chunk-CS3RKXT5.js.map → chunk-CHFHILTM.js.map} +0 -0
- /package/dist/{chunk-DMYBTD5Y.js.map → chunk-CPWWMGYR.js.map} +0 -0
- /package/dist/{chunk-XSMMFCMQ.js.map → chunk-CWDV64TD.js.map} +0 -0
- /package/dist/{chunk-GUVBR62X.js.map → chunk-DCJSHYE5.js.map} +0 -0
- /package/dist/{chunk-VV7MGILP.js.map → chunk-DMWSXWCZ.js.map} +0 -0
- /package/dist/{chunk-JYRQBZEV.js.map → chunk-DVAAUWTC.js.map} +0 -0
- /package/dist/{chunk-C6NI3FAV.js.map → chunk-DVGBFT6O.js.map} +0 -0
- /package/dist/{chunk-W5ENK5CM.js.map → chunk-DZNMS2SH.js.map} +0 -0
- /package/dist/{chunk-F5KEWLZK.js.map → chunk-FC7NQ6XM.js.map} +0 -0
- /package/dist/{chunk-NIS523UM.js.map → chunk-FWPFCK4D.js.map} +0 -0
- /package/dist/{chunk-UCTJJYVC.js.map → chunk-G4HBNILE.js.map} +0 -0
- /package/dist/{chunk-57IB5NTM.js.map → chunk-HB7ISSLK.js.map} +0 -0
- /package/dist/{chunk-6Q5GZUQ5.js.map → chunk-HGMBY5LP.js.map} +0 -0
- /package/dist/{chunk-2AKQPXSJ.js.map → chunk-HJPPNVCF.js.map} +0 -0
- /package/dist/{chunk-JOR6E23V.js.map → chunk-IGGXKT5B.js.map} +0 -0
- /package/dist/{chunk-KLMP2BYC.js.map → chunk-IVJKILIX.js.map} +0 -0
- /package/dist/{chunk-HJWOB62A.js.map → chunk-JJSZP3TW.js.map} +0 -0
- /package/dist/{chunk-UCA47HM7.js.map → chunk-KCAW6HRO.js.map} +0 -0
- /package/dist/{chunk-KE5MX4PI.js.map → chunk-L3B36HA5.js.map} +0 -0
- /package/dist/{chunk-OLZTGVBT.js.map → chunk-LYVTJLCF.js.map} +0 -0
- /package/dist/{chunk-WW4N2LRM.js.map → chunk-MBC55H6M.js.map} +0 -0
- /package/dist/{chunk-AATIHNPI.js.map → chunk-MK4CH4VT.js.map} +0 -0
- /package/dist/{chunk-IDO4EV7T.js.map → chunk-NR5TW4AH.js.map} +0 -0
- /package/dist/{chunk-6DC5SVHM.js.map → chunk-NSKQANRY.js.map} +0 -0
- /package/dist/{chunk-EAE5Z5HL.js.map → chunk-OJ2XR3WH.js.map} +0 -0
- /package/dist/{chunk-BR7RM3WR.js.map → chunk-OZPLAOI4.js.map} +0 -0
- /package/dist/{chunk-GIRRCEVH.js.map → chunk-PT2XADGH.js.map} +0 -0
- /package/dist/{chunk-5ZTQTJAJ.js.map → chunk-PWF32ILG.js.map} +0 -0
- /package/dist/{chunk-DBCITC4P.js.map → chunk-QB3TVUPD.js.map} +0 -0
- /package/dist/{chunk-I2CRLUS7.js.map → chunk-QIKPGMMO.js.map} +0 -0
- /package/dist/{chunk-MXZ43UCQ.js.map → chunk-QOLIBVGS.js.map} +0 -0
- /package/dist/{chunk-TPQVLBTY.js.map → chunk-R2WMSXQR.js.map} +0 -0
- /package/dist/{chunk-F7HQVKIR.js.map → chunk-SYVNWXVW.js.map} +0 -0
- /package/dist/{chunk-MGC4QOMP.js.map → chunk-TQ2557I5.js.map} +0 -0
- /package/dist/{chunk-C7TCBAVX.js.map → chunk-TQBRWZA4.js.map} +0 -0
- /package/dist/{chunk-BO2SDMNQ.js.map → chunk-U4QUDFPJ.js.map} +0 -0
- /package/dist/{chunk-SKX4NA6E.js.map → chunk-V74PXUQN.js.map} +0 -0
- /package/dist/{chunk-OYP27CYE.js.map → chunk-WOAXKWAB.js.map} +0 -0
- /package/dist/{chunk-W3CLJ7JE.js.map → chunk-WPA26LXA.js.map} +0 -0
- /package/dist/{chunk-LI6OLYUB.js.map → chunk-YBTC4XNO.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/DataViews/base-list-card-geometry.tsx"],"sourcesContent":["\"use client\";\n\nimport { useTheme } from \"@mui/material/styles/index.js\";\n\nimport {\n CARD_RADIUS,\n cardSurfaceStyles,\n isActionable,\n isSelectable,\n slotTestIds,\n} from \"./card-surface\";\nimport { useDragItem } from \"./data-views-drag\";\nimport { DENSITY_ROW_PADDING } from \"./data-views-layout-context\";\nimport { RAIL_COUNT, RAIL_GAP, railsTemplateFor, useListRails } from \"./list-card-rails\";\nimport { STACK_BREAK } from \"./base-list-card-slots\";\nimport type { BaseListCardProps } from \"./base-list-card\";\n\n/**\n * THE ROW'S GEOMETRY AND SURFACE, split from the component at the size gate.\n *\n * Everything here answers \"what shape is this row, and where do its slots land\"\n * — the rails, the density padding, the two-line collapse, the drag and\n * selection plumbing. None of it renders anything, which is why the two halves\n * can live apart without either becoming harder to follow.\n */\n/**\n * Whether a click was really a click, or the tail of a text selection.\n *\n * Without this, selecting an order id to copy it navigates away instead — the\n * single most annoying thing a clickable row does.\n */\nfunction isTextSelection(): boolean {\n return (globalThis.getSelection?.()?.toString().length ?? 0) > 0;\n}\n\n/** Keyboard equivalence for a card that acts but does not navigate. */\nfunction clickKeys(onClick: () => void) {\n return (event: React.KeyboardEvent): void => {\n if (event.key !== \"Enter\" && event.key !== \" \") return;\n event.preventDefault();\n onClick();\n };\n}\n\n/**\n * Geometry: the rails, the density padding, the two-line collapse.\n *\n * SCALE IS `zoom`, NOT A SET OF MULTIPLIED FONT SIZES.\n *\n * It used to be the latter, on exactly three values — title, value, row padding\n * — so the slider left the subtitle, the meta labels, the rules, the checkbox,\n * the grip, the chip and the menu at their fixed sizes, and the row came apart\n * as you dragged it. Multiplying the rest is not a fix: the checkbox and the\n * chip are MUI internals sized in their own px, and no prop we pass reaches\n * them.\n *\n * `zoom` scales the used value of every length in the subtree — ours and theirs\n * — and unlike `transform: scale` it REFLOWS, so the row still occupies the\n * space it draws and the rails still resolve. Verified against the group: at\n * 1.4 all four rows keep identical rail edges, because subgrid tracks and the\n * zoom that reads them are the same for every row.\n */\n/**\n * DIVIDER COMPOSES WITH THE VARIANT — it changes the row's SHAPE, not its\n * surface.\n *\n * It used to set `border: 0` and hard-code its own rule colour, which discarded\n * whatever the variant had drawn: `outline`, `text` and `ghost` all collapsed\n * to one identical flush row, and the variant control silently stopped meaning\n * anything the moment `divider` was on.\n *\n * Now only the GEOMETRY changes here — the box's sides go, one edge stays — and\n * no `borderColor` is written, so the colour set by `cardSurfaceStyles` survives.\n * A variant that draws no border of its own gets the neutral rule from\n * {@link rowStyles}.\n */\nexport function rowSx(opts: {\n inGroup: boolean;\n railCount: number;\n cellTemplate: string | null;\n gutters: { disclose: boolean; drag: boolean; select: boolean };\n metaColumns: number;\n pad: number;\n padY: number;\n scale: number;\n divider: boolean;\n interactive: boolean;\n draggable: boolean;\n}): Record<string, unknown> {\n const { inGroup, railCount, cellTemplate, gutters, metaColumns, pad, padY, scale, divider, interactive, draggable } = opts;\n return {\n position: \"relative\",\n borderRadius: CARD_RADIUS,\n display: \"grid\",\n zoom: scale,\n // SUBGRID AND `container-type` CANNOT COEXIST on one element: containment\n // makes the box size independently of its parent, so the browser drops the\n // subgrid and every slot stacks into one column. (Observed exactly that —\n // computed `grid-template-columns: 1222px` on a card asking for subgrid.)\n //\n // So inside a group the GROUP is the query container and the row is the\n // subgrid; standalone, the row is both the container and its own grid.\n ...(inGroup\n ? { gridColumn: `span ${railCount}`, gridTemplateColumns: \"subgrid\" }\n : {\n containerType: \"inline-size\",\n gridTemplateColumns: cellTemplate ?? railsTemplateFor(gutters, metaColumns),\n }),\n alignItems: \"center\",\n // Wide enough that the meta cluster, the value and the status read as three\n // columns rather than one run of text — the complaint that started all this\n // was `MÉTODO PIX R$ 13,90` scanning as a single phrase.\n columnGap: RAIL_GAP,\n width: \"100%\",\n px: pad,\n py: padY,\n cursor: draggable ? \"grab\" : interactive ? \"pointer\" : undefined,\n ...(draggable ? { touchAction: \"none\", \"&:active\": { cursor: \"grabbing\" } } : {}),\n ...(interactive ? { \"&:hover\": { backgroundColor: \"action.hover\" } } : {}),\n // A real focus ring, which a clickable <div> never had.\n \"&:focus-visible\": { outline: 2, outlineStyle: \"solid\", outlineColor: \"primary.main\", outlineOffset: 2 },\n // TWO-LINE, below the point where the shared rails stop helping.\n //\n // The standard mobile transaction row: what the record IS and what it COST\n // on the first line, the supporting detail on the second. Better than\n // truncating four columns into ellipses, and the reason each slot carries a\n // `data-slot` — the placement is explicit rather than whatever order the\n // children happen to be in.\n //\n // [ select ][ leading ][ title …………… ][ menu ]\n // [ (cells) …………… ][ value ]\n //\n // The MENU stays in the top-right corner at every width. It is the row's\n // one fixed landmark — an overflow that moves to the second line on a phone\n // is an overflow nobody finds twice.\n [`@container (max-width: ${STACK_BREAK}px)`]: {\n gridTemplateColumns: \"auto auto minmax(0, 1fr) max-content\",\n ...(inGroup ? { gridColumn: `span ${RAIL_COUNT}` } : {}),\n rowGap: 0.75,\n columnGap: 1,\n '& > [data-slot=\"drag\"]': { display: \"none\" },\n '& > [data-slot=\"select\"]': { gridArea: \"1 / 1\" },\n '& > [data-slot=\"leading\"]': { gridArea: \"1 / 2\" },\n '& > [data-slot=\"caption\"]': { gridArea: \"1 / 3\" },\n '& > [data-slot=\"actions\"]': { gridArea: \"1 / 4\", justifyContent: \"flex-end\" },\n '& > [data-slot=\"meta\"]': { display: \"none\" },\n // Second line, starting under the title rather than under the checkbox.\n '& > [data-slot=\"value\"]': { gridArea: \"2 / 4\", textAlign: \"right\" },\n },\n ...(divider\n ? { borderRadius: 0, borderWidth: 0, borderBottomWidth: 1, borderStyle: \"solid\" }\n : {}),\n };\n}\n\n/**\n * A selectable full-width row: a marker, a title over a subtitle, labelled\n * middle columns, a value, a status, actions and a menu.\n *\n * A SHELL, like {@link BaseCard}. Domain rows live in the app and compose it.\n */\n/**\n * The id this row drags under, or nothing.\n *\n * `undefined` is the inert answer: `useDragItem` treats a missing id as \"no\n * drag\", which is how the card's own veto (`draggable={false}`) and an\n * unactionable record both switch dragging off without the card knowing\n * anything about the container above it.\n */\nfunction dragIdFor(\n props: BaseListCardProps,\n actionable: boolean,\n): string | number | undefined {\n return props.draggable === false || !actionable ? undefined : props.dragId;\n}\n\n/**\n * What the meta cluster amounts to — asked once, used three times: to size the\n * rail, to close the cluster with a rule, and to decide whether the value has\n * anything to be divided FROM.\n */\nexport function metaShape(props: BaseListCardProps): { columns: number; present: boolean } {\n const columns = props.meta?.length ?? 0;\n return { columns, present: columns > 0 || props.metaSlot != null };\n}\n\n/**\n * Everything the row derives before it can render — extracted so the component\n * stays inside the size budget.\n */\nexport function useRowShell(props: BaseListCardProps) {\n const actionable = isActionable(props.state);\n const group = useListRails();\n const scale = props.scale ?? 1;\n return {\n group,\n actionable,\n scale,\n theme: useTheme(),\n selectable: isSelectable(props),\n slot: slotTestIds(props.testId),\n drag: useDragItem(dragIdFor(props, actionable)),\n // Standalone holds no gutter open: there is no list beside it to line up\n // with, so a reserved-but-empty rail is pure inset.\n reserve: group?.reserveGutters ?? false,\n // 1, not 1.5. The row's contents still have to line up with the toolbar\n // above them, but 12px of card padding stacked on the checkbox's own 9px\n // and an empty drag gutter's 24px read as a row indented for no reason.\n //\n // Not multiplied by `scale` — the row's `zoom` already scales it, and doing\n // both would square the factor on padding alone.\n pad: 1,\n padY: DENSITY_ROW_PADDING[group?.density ?? props.density ?? \"cozy\"],\n // A card that navigates does so with a real anchor, so it takes no click\n // handler of its own — the stretched link IS the target.\n acts: props.onClick != null && props.href == null && actionable,\n };\n}\n\n/** The click/keyboard props a row that acts (but does not navigate) needs. */\nexport function actionProps(onClick: (() => void) | undefined) {\n return {\n role: \"button\",\n tabIndex: 0,\n onClick: () => {\n if (isTextSelection()) return;\n onClick?.();\n },\n onKeyDown: clickKeys(() => onClick?.()),\n };\n}\n\n/** The surface and the geometry, merged — the row's whole `sx` in one place. */\n\n/**\n * The row's painted surface, plus the divider's colour fallback.\n *\n * A variant with no border of its own (`text`, `ghost`) would draw its rule in\n * the inherited colour — the TEXT colour, i.e. a black bar across the row. The\n * neutral divider token is supplied only in that case; a variant that has a\n * border keeps it, which is the whole point of composing the two.\n */\nfunction rowSurface(\n props: BaseListCardProps,\n shell: ReturnType<typeof useRowShell>,\n): Record<string, unknown> {\n const { theme, selectable, drag } = shell;\n const surface = cardSurfaceStyles(\n { ...props, selectable, shape: \"row\", state: drag.dragging ? \"disabled\" : props.state },\n theme,\n );\n if (props.divider !== true || surface.borderColor != null) return surface;\n return { ...surface, borderBottomColor: theme.palette.divider };\n}\n\nexport function rowStyles(\n props: BaseListCardProps,\n shell: ReturnType<typeof useRowShell>,\n cellTemplate: string | null,\n): Record<string, unknown> {\n const { group, selectable, drag, reserve, pad, padY, scale, acts } = shell;\n return {\n ...rowSurface(props, shell),\n ...rowSx({\n inGroup: group !== null,\n railCount: group?.railCount ?? RAIL_COUNT,\n cellTemplate,\n gutters: {\n disclose: reserve || props.children != null,\n drag: reserve || drag.draggable,\n select: reserve || selectable,\n },\n metaColumns: metaShape(props).columns,\n pad,\n padY,\n scale,\n divider: props.divider ?? false,\n interactive: acts || props.href != null,\n draggable: drag.draggable && drag.handleProps === undefined,\n }),\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/FleetMap/FleetMap.tsx"],"sourcesContent":["import Box from '@mui/material/Box/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport { useTheme } from '@mui/material/styles/index.js';\nimport React from 'react';\n\nimport { SR_ONLY_SX } from '../../form/Label/Label.styles';\nimport { EmptyState } from '../EmptyState/EmptyState';\n\nimport { FleetBody } from './FleetBody';\nimport { useFleetMap } from './FleetMap.hooks';\nimport {\n FLEET_DEFAULT_LAGGING_AFTER_SECONDS,\n FLEET_DEFAULT_STALE_AFTER_SECONDS,\n FLEET_PANEL,\n} from './FleetMap.metrics';\nimport type { FleetMapProps } from './FleetMap.types';\n\n/** The map's own default height. Overridable, and never a hardcoded viewport. */\nconst DEFAULT_HEIGHT = '420px';\n\n/**\n * The reload announcement, and nothing else.\n *\n * `aria-busy` marks the region stale for assistive technology but UTTERS\n * nothing, and the skeletons beside it are `aria-hidden` — so a screen-reader\n * user got silence while the roster reloaded. This is the utterance.\n *\n * Optional by design: the sentence is in the reader's language, which only the\n * caller knows, and inventing an English one in a component whose whole premise\n * is that every word arrives through `copy` would be the bug it exists to\n * avoid. No `copy.loading`, no region.\n *\n * ## The node outlives the text, and that is the whole trick\n *\n * A live region has to be in the DOM BEFORE its content changes; a screen\n * reader watches an existing region for mutations rather than announcing one\n * that appears already populated. Mounting region-and-text together in a single\n * commit is the classic silent case — it satisfies a DOM assertion while\n * announcing nothing. So the region mounts as soon as the caller offers the\n * copy and merely EMPTIES when idle, which is what `CepField`, `UploadButton`\n * and `DateRangePickerFields` all do.\n */\nfunction FleetStatus({\n announcement,\n loading,\n testId,\n}: {\n announcement: string | undefined;\n loading: boolean;\n testId: string;\n}): React.JSX.Element | null {\n // No copy, no region at all — the caller has not asked for an announcement.\n if (announcement === undefined) return null;\n return (\n <Box role=\"status\" aria-live=\"polite\" data-testid={`${testId}-status`} sx={SR_ONLY_SX}>\n {loading ? announcement : ''}\n </Box>\n );\n}\n\n/**\n * FleetMap — where a set of tracked units is right now, as a map beside the\n * roster that reads it.\n *\n * Product-free by construction: it draws labelled dots with a freshness, and\n * every word — the heading, the three freshness states, how a duration and a\n * distance are written — arrives through {@link FleetMapProps.copy}. Couriers,\n * service vans and field engineers are all the same picture.\n *\n * ## Three decisions worth knowing before changing it\n *\n * **The roster is the accessible representation, not a sidebar.** A map is a\n * picture and a screen reader cannot read one, so the list carries the\n * information: everything a sighted user gets from a pin — who, how recently,\n * what they are carrying — is on the row. The map is a NAMED region rather than\n * an `aria-hidden` one, because its controls are focusable and hiding a\n * focusable subtree is the `aria-hidden-focus` violation.\n *\n * **Nothing here formats.** `lastSeen` and `accuracy` are functions on the copy\n * object, the same line `StatCard` holds for its `value`: a duration and a\n * distance are locale rules, and a component that wrote \"2 min ago\" would have\n * made English the only language it could ever render.\n *\n * **An empty fleet is an empty STATE, not an empty map.** A map with no pins is\n * indistinguishable from a map that failed to load, and the difference is the\n * whole question a dispatcher is asking.\n */\nexport const FleetMap: React.FC<FleetMapProps> = React.memo(\n ({\n units,\n copy,\n // NO default. `undefined` is what tells the hook the caller does not own\n // the selection; defaulting it to `null` here made every render look\n // controlled and the uncontrolled path unreachable.\n selectedId,\n onSelect,\n laggingAfterSeconds = FLEET_DEFAULT_LAGGING_AFTER_SECONDS,\n staleAfterSeconds = FLEET_DEFAULT_STALE_AFTER_SECONDS,\n height = DEFAULT_HEIGHT,\n loading = false,\n className,\n dataTestId,\n }) => {\n const theme = useTheme();\n const testId = dataTestId || 'fleet-map';\n const headingId = React.useId();\n const { ordered, active, centre, select, markers, onKeyDown } = useFleetMap(\n units,\n selectedId,\n onSelect,\n );\n\n return (\n <Box\n role=\"region\"\n aria-labelledby={headingId}\n className={className}\n data-testid={testId}\n sx={{ display: 'flex', flexDirection: 'column', gap: theme.spacing(FLEET_PANEL.gapUnits), minWidth: 0 }}\n >\n <Typography\n id={headingId}\n variant=\"subtitle1\"\n component=\"h2\"\n data-testid={`${testId}-title`}\n sx={{ fontWeight: theme.typography.fontWeightMedium }}\n >\n {copy.title}\n </Typography>\n\n <FleetStatus announcement={copy.loading} loading={loading} testId={testId} />\n\n {!loading && ordered.length === 0 ? (\n <EmptyState\n variant=\"minimal\"\n title={copy.emptyTitle}\n description={copy.emptyDescription}\n dataTestId={`${testId}-empty`}\n />\n ) : (\n <FleetBody\n ordered={ordered}\n centre={centre}\n markers={markers}\n select={select}\n onKeyDown={onKeyDown}\n copy={copy}\n selectedId={active}\n laggingAfterSeconds={laggingAfterSeconds}\n staleAfterSeconds={staleAfterSeconds}\n height={height}\n loading={loading}\n testId={testId}\n />\n )}\n </Box>\n );\n },\n);\n\nFleetMap.displayName = 'FleetMap';\n\nexport default FleetMap;\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAAA,OAAO,SAAS;AAChB,OAAO,gBAAgB;AACvB,SAAS,gBAAgB;AACzB,OAAO,WAAW;AAmDd,cA2DE,YA3DF;AApCJ,IAAM,iBAAiB;AAwBvB,SAAS,YAAY;AAAA,EACnB;AAAA,EACA;AAAA,EACA;AACF,GAI6B;AAE3B,MAAI,iBAAiB,OAAW,QAAO;AACvC,SACE,oBAAC,OAAI,MAAK,UAAS,aAAU,UAAS,eAAa,GAAG,MAAM,WAAW,IAAI,YACxE,oBAAU,eAAe,IAC5B;AAEJ;AA6BO,IAAM,WAAoC,MAAM;AAAA,EACrD,CAAC;AAAA,IACC;AAAA,IACA;AAAA;AAAA;AAAA;AAAA,IAIA;AAAA,IACA;AAAA,IACA,sBAAsB;AAAA,IACtB,oBAAoB;AAAA,IACpB,SAAS;AAAA,IACT,UAAU;AAAA,IACV;AAAA,IACA;AAAA,EACF,MAAM;AACJ,UAAM,QAAQ,SAAS;AACvB,UAAM,SAAS,cAAc;AAC7B,UAAM,YAAY,MAAM,MAAM;AAC9B,UAAM,EAAE,SAAS,QAAQ,QAAQ,QAAQ,SAAS,UAAU,IAAI;AAAA,MAC9D;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WACE;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,mBAAiB;AAAA,QACjB;AAAA,QACA,eAAa;AAAA,QACb,IAAI,EAAE,SAAS,QAAQ,eAAe,UAAU,KAAK,MAAM,QAAQ,YAAY,QAAQ,GAAG,UAAU,EAAE;AAAA,QAEtG;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,IAAI;AAAA,cACJ,SAAQ;AAAA,cACR,WAAU;AAAA,cACV,eAAa,GAAG,MAAM;AAAA,cACtB,IAAI,EAAE,YAAY,MAAM,WAAW,iBAAiB;AAAA,cAEnD,eAAK;AAAA;AAAA,UACR;AAAA,UAEA,oBAAC,eAAY,cAAc,KAAK,SAAS,SAAkB,QAAgB;AAAA,UAE1E,CAAC,WAAW,QAAQ,WAAW,IAC9B;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,OAAO,KAAK;AAAA,cACZ,aAAa,KAAK;AAAA,cAClB,YAAY,GAAG,MAAM;AAAA;AAAA,UACvB,IAEA;AAAA,YAAC;AAAA;AAAA,cACC;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,YAAY;AAAA,cACZ;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA;AAAA,UACF;AAAA;AAAA;AAAA,IAEJ;AAAA,EAEJ;AACF;AAEA,SAAS,cAAc;AAEvB,IAAO,mBAAQ;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/Badge/BadgeContent.tsx"],"sourcesContent":["import CloseIcon from '@mui/icons-material/Close';\nimport IconButton from '@mui/material/IconButton/index.js';\nimport { useTheme } from '@mui/material/styles/index.js';\nimport type { FC, ReactNode } from 'react';\nimport React from 'react';\n\nimport { BADGE_CONTENT_GAP, BADGE_SIZES } from './Badge.metrics';\nimport { getSizeStyles } from './Badge.styles';\nimport type { BadgeSize } from './Badge.types';\nimport { rem, sxRem } from '../../../tokens/relative';\n\n// Derived from the shared metrics: `xl` takes `lg`'s glyph, which is what the\n// hand-written map did through its `?? CLOSE_ICON_SIZES.lg` fallback.\nconst CLOSE_ICON_SIZES: Record<string, number> = Object.fromEntries(\n Object.entries(BADGE_SIZES).map(([size, metrics]) => [size, metrics.closeIconSize]),\n);\n\nconst makeTestId =\n (dataTestId?: string) =>\n (suffix: string): string =>\n dataTestId ? `${dataTestId}-${suffix}` : `badge-${suffix}`;\n\nconst BadgeIcon: FC<{ icon: ReactNode; size: BadgeSize; testId: string }> = ({\n icon,\n size,\n testId,\n}) => {\n const theme = useTheme();\n return (\n <span\n key=\"icon\"\n data-testid={testId}\n style={{\n fontSize: rem(theme, getSizeStyles(size).step.iconSize),\n display: 'inline-flex',\n alignItems: 'center',\n }}\n >\n {icon}\n </span>\n );\n};\n\nconst BadgeCloseButton: FC<{ size: BadgeSize; testId: string; onClose: (e: React.MouseEvent) => void }> = ({\n size,\n testId,\n onClose,\n}) => (\n <IconButton\n key=\"close\"\n size=\"small\"\n onClick={onClose}\n data-testid={testId}\n sx={{\n p: 0,\n ml: 0.5,\n color: 'inherit',\n '& svg': { fontSize: sxRem(CLOSE_ICON_SIZES[size] ?? BADGE_SIZES.lg.closeIconSize) },\n '&:hover': { opacity: 0.8 },\n }}\n >\n <CloseIcon />\n </IconButton>\n);\n\n// The badge's inner run: optional icon, the content itself, optional close\n// button. A dot badge shows none of it.\nexport const buildBadgeContent = ({\n variant,\n size,\n icon,\n closable,\n dataTestId,\n baseContent,\n onClose,\n}: {\n variant: string;\n size: BadgeSize;\n icon?: ReactNode;\n closable?: boolean;\n dataTestId?: string;\n baseContent: ReactNode;\n onClose: (e: React.MouseEvent) => void;\n}): ReactNode => {\n if (variant === 'dot') return '';\n\n const testId = makeTestId(dataTestId);\n const parts: ReactNode[] = [];\n\n if (icon) parts.push(<BadgeIcon key=\"icon\" icon={icon} size={size} testId={testId('icon')} />);\n\n if (baseContent !== null && baseContent !== undefined) {\n parts.push(\n <span key=\"content\" data-testid={testId('content')}>\n {baseContent}\n </span>,\n );\n }\n\n if (closable && !variant.includes('dot')) {\n parts.push(\n <BadgeCloseButton key=\"close\" size={size} testId={testId('close')} onClose={onClose} />,\n );\n }\n\n if (parts.length === 0) return null;\n\n return (\n <span style={{ display: 'inline-flex', alignItems: 'center', gap: `${BADGE_CONTENT_GAP}px` }}>{parts}</span>\n );\n};\n"],"mappings":";;;;;;;;;;;;;AAAA,OAAO,eAAe;AACtB,OAAO,gBAAgB;AACvB,SAAS,gBAAgB;AA2BrB;AAhBJ,IAAM,mBAA2C,OAAO;AAAA,EACtD,OAAO,QAAQ,WAAW,EAAE,IAAI,CAAC,CAAC,MAAM,OAAO,MAAM,CAAC,MAAM,QAAQ,aAAa,CAAC;AACpF;AAEA,IAAM,aACJ,CAAC,eACD,CAAC,WACC,aAAa,GAAG,UAAU,IAAI,MAAM,KAAK,SAAS,MAAM;AAE5D,IAAM,YAAsE,CAAC;AAAA,EAC3E;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,QAAQ,SAAS;AACvB,SACE;AAAA,IAAC;AAAA;AAAA,MAEC,eAAa;AAAA,MACb,OAAO;AAAA,QACL,UAAU,IAAI,OAAO,cAAc,IAAI,EAAE,KAAK,QAAQ;AAAA,QACtD,SAAS;AAAA,QACT,YAAY;AAAA,MACd;AAAA,MAEC;AAAA;AAAA,IARG;AAAA,EASN;AAEJ;AAEA,IAAM,mBAAoG,CAAC;AAAA,EACzG;AAAA,EACA;AAAA,EACA;AACF,MACE;AAAA,EAAC;AAAA;AAAA,IAEC,MAAK;AAAA,IACL,SAAS;AAAA,IACT,eAAa;AAAA,IACb,IAAI;AAAA,MACF,GAAG;AAAA,MACH,IAAI;AAAA,MACJ,OAAO;AAAA,MACP,SAAS,EAAE,UAAU,MAAM,iBAAiB,IAAI,KAAK,YAAY,GAAG,aAAa,EAAE;AAAA,MACnF,WAAW,EAAE,SAAS,IAAI;AAAA,IAC5B;AAAA,IAEA,8BAAC,aAAU;AAAA;AAAA,EAZP;AAaN;AAKK,IAAM,oBAAoB,CAAC;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAQiB;AACf,MAAI,YAAY,MAAO,QAAO;AAE9B,QAAM,SAAS,WAAW,UAAU;AACpC,QAAM,QAAqB,CAAC;AAE5B,MAAI,KAAM,OAAM,KAAK,oBAAC,aAAqB,MAAY,MAAY,QAAQ,OAAO,MAAM,KAApD,MAAuD,CAAE;AAE7F,MAAI,gBAAgB,QAAQ,gBAAgB,QAAW;AACrD,UAAM;AAAA,MACJ,oBAAC,UAAmB,eAAa,OAAO,SAAS,GAC9C,yBADO,SAEV;AAAA,IACF;AAAA,EACF;AAEA,MAAI,YAAY,CAAC,QAAQ,SAAS,KAAK,GAAG;AACxC,UAAM;AAAA,MACJ,oBAAC,oBAA6B,MAAY,QAAQ,OAAO,OAAO,GAAG,WAA7C,OAA+D;AAAA,IACvF;AAAA,EACF;AAEA,MAAI,MAAM,WAAW,EAAG,QAAO;AAE/B,SACE,oBAAC,UAAK,OAAO,EAAE,SAAS,eAAe,YAAY,UAAU,KAAK,GAAG,iBAAiB,KAAK,GAAI,iBAAM;AAEzG;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/Lightbox/Lightbox.hooks.ts"],"sourcesContent":["import type React from 'react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\n\nimport {\n DEFAULT_AUTOPLAY_INTERVAL_MS,\n MAX_ZOOM,\n MIN_SWIPE_DISTANCE,\n MIN_ZOOM,\n WHEEL_ZOOM_FACTOR,\n ZOOM_STEP,\n} from './Lightbox.constants';\nimport type { LightboxItem, LightboxProps } from './Lightbox.types';\n\nconst clampZoom = (zoom: number): number => Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, zoom));\n\n// Items with no explicit type are images.\nconst isImageItem = (item?: LightboxItem): item is LightboxItem =>\n Boolean(item && (item.type === 'image' || !item.type));\n\n// Images are fetched once and remembered, so stepping back to one is instant.\nexport const usePreloader = () => {\n const [preloadedImages, setPreloadedImages] = useState<Set<string>>(new Set());\n\n return useCallback(\n (src: string) => {\n if (preloadedImages.has(src)) return;\n\n const img = new window.Image();\n img.onload = () => setPreloadedImages((prev) => new Set([...prev, src]));\n img.src = src;\n },\n [preloadedImages],\n );\n};\n\nexport interface ZoomState {\n zoomLevel: number;\n panOffset: { x: number; y: number };\n setZoomLevel: React.Dispatch<React.SetStateAction<number>>;\n resetZoom: () => void;\n zoomIn: () => void;\n zoomOut: () => void;\n}\n\nexport const useZoomState = (): ZoomState => {\n const [zoomLevel, setZoomLevel] = useState(1);\n const [panOffset, setPanOffset] = useState({ x: 0, y: 0 });\n\n const resetZoom = useCallback(() => {\n setZoomLevel(1);\n setPanOffset({ x: 0, y: 0 });\n }, []);\n\n const zoomIn = useCallback(() => setZoomLevel((prev) => Math.min(MAX_ZOOM, prev * ZOOM_STEP)), []);\n const zoomOut = useCallback(\n () => setZoomLevel((prev) => Math.max(MIN_ZOOM, prev / ZOOM_STEP)),\n [],\n );\n\n return { zoomLevel, panOffset, setZoomLevel, resetZoom, zoomIn, zoomOut };\n};\n\nexport const useWheelZoom = ({\n enabled,\n setZoomLevel,\n}: {\n enabled: boolean;\n setZoomLevel: React.Dispatch<React.SetStateAction<number>>;\n}) =>\n useCallback(\n (event: React.WheelEvent) => {\n if (!enabled) return;\n\n event.preventDefault();\n // Scrolling up (negative deltaY) zooms in.\n setZoomLevel((prev) => clampZoom(prev + event.deltaY * -WHEEL_ZOOM_FACTOR));\n },\n [enabled, setZoomLevel],\n );\n\nexport const useNavigation = ({\n items,\n loop,\n startIndex,\n resetZoom,\n preloadImage,\n}: {\n items: LightboxItem[];\n loop: boolean;\n startIndex: number;\n resetZoom: () => void;\n preloadImage: (src: string) => void;\n}) => {\n const [currentIndex, setCurrentIndex] = useState(\n Math.max(0, Math.min(startIndex, items.length - 1)),\n );\n\n const goToIndex = useCallback(\n (index: number) => {\n if (items.length === 0) return;\n\n // Looping wraps both ways; otherwise the index sticks at the ends.\n const newIndex = loop\n ? ((index % items.length) + items.length) % items.length\n : Math.max(0, Math.min(index, items.length - 1));\n\n setCurrentIndex(newIndex);\n resetZoom();\n\n // Fetch the neighbours so a step in either direction shows immediately.\n [items[newIndex - 1], items[newIndex + 1]]\n .filter(isImageItem)\n .forEach((item) => preloadImage(item.src));\n },\n [items, loop, resetZoom, preloadImage],\n );\n\n const next = useCallback(() => {\n if (currentIndex < items.length - 1 || loop) goToIndex(currentIndex + 1);\n }, [currentIndex, items.length, loop, goToIndex]);\n\n const prev = useCallback(() => {\n if (currentIndex > 0 || loop) goToIndex(currentIndex - 1);\n }, [currentIndex, loop, goToIndex]);\n\n return { currentIndex, goToIndex, next, prev };\n};\n\nexport const useAutoplay = ({\n isOpen,\n autoplay,\n itemCount,\n currentIndex,\n next,\n}: {\n isOpen: boolean;\n autoplay: LightboxProps['autoplay'];\n itemCount: number;\n currentIndex: number;\n next: () => void;\n}) => {\n const [isAutoPlaying, setIsAutoPlaying] = useState(false);\n const timerRef = useRef<number | undefined>(undefined);\n\n useEffect(() => {\n if (!isAutoPlaying || !autoplay || itemCount <= 1) return;\n\n const interval =\n typeof autoplay === 'object'\n ? autoplay.interval || DEFAULT_AUTOPLAY_INTERVAL_MS\n : DEFAULT_AUTOPLAY_INTERVAL_MS;\n\n timerRef.current = window.setTimeout(next, interval);\n\n return () => window.clearTimeout(timerRef.current);\n }, [isAutoPlaying, autoplay, currentIndex, next, itemCount]);\n\n // Opening a gallery with more than one item starts the slideshow.\n useEffect(() => {\n setIsAutoPlaying(Boolean(isOpen && autoplay && itemCount > 1));\n }, [isOpen, autoplay, itemCount]);\n\n const stopAutoplay = useCallback(() => {\n setIsAutoPlaying(false);\n window.clearTimeout(timerRef.current);\n }, []);\n\n return { isAutoPlaying, setIsAutoPlaying, stopAutoplay };\n};\n\nexport const useLightboxKeyboard = ({\n isOpen,\n showControls,\n autoplay,\n close,\n prev,\n next,\n setIsAutoPlaying,\n}: {\n isOpen: boolean;\n showControls: boolean;\n autoplay: LightboxProps['autoplay'];\n close: () => void;\n prev: () => void;\n next: () => void;\n setIsAutoPlaying: React.Dispatch<React.SetStateAction<boolean>>;\n}) => {\n useEffect(() => {\n if (!isOpen) return;\n\n const arrows: Record<string, () => void> = { ArrowLeft: prev, ArrowRight: next };\n\n const handleKeyDown = (event: { key: string; preventDefault: () => void }) => {\n if (event.key === 'Escape') {\n close();\n return;\n }\n\n const arrow = arrows[event.key];\n if (arrow && showControls) {\n event.preventDefault();\n arrow();\n return;\n }\n\n if (event.key === ' ') {\n event.preventDefault();\n if (autoplay) setIsAutoPlaying((playing) => !playing);\n }\n };\n\n document.addEventListener('keydown', handleKeyDown);\n return () => document.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, showControls, close, prev, next, autoplay, setIsAutoPlaying]);\n};\n\n// Horizontal swipes step through the gallery; a downward swipe dismisses it.\nexport const useSwipe = ({\n prev,\n next,\n close,\n}: {\n prev: () => void;\n next: () => void;\n close: () => void;\n}) => {\n const touchStartRef = useRef<{ x: number; y: number } | null>(null);\n\n const handleTouchStart = useCallback((event: React.TouchEvent) => {\n const touch = event.touches.length === 1 ? event.touches[0] : undefined;\n if (touch) touchStartRef.current = { x: touch.clientX, y: touch.clientY };\n }, []);\n\n const handleTouchEnd = useCallback(\n (event: React.TouchEvent) => {\n const start = touchStartRef.current;\n const touch = event.changedTouches[0];\n touchStartRef.current = null;\n if (!start || !touch) return;\n\n const deltaX = touch.clientX - start.x;\n const deltaY = touch.clientY - start.y;\n\n // Whichever axis moved further decides what the gesture meant.\n if (Math.abs(deltaX) > Math.abs(deltaY)) {\n if (Math.abs(deltaX) > MIN_SWIPE_DISTANCE) {\n if (deltaX > 0) prev();\n else next();\n }\n return;\n }\n\n if (deltaY > MIN_SWIPE_DISTANCE) close();\n },\n [prev, next, close],\n );\n\n return { handleTouchStart, handleTouchEnd };\n};\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/Avatar/Avatar.view.tsx"],"sourcesContent":["import MuiAvatar from '@mui/material/Avatar/index.js';\nimport Badge from '@mui/material/Badge/index.js';\nimport Fade from '@mui/material/Fade/index.js';\nimport { alpha, useTheme, styled } from '@mui/material/styles/index.js';\nimport type { CSSObject, Theme } from '@mui/material/styles/index.js';\nimport React from 'react';\n\nimport { pulseAnimation, rotateAnimation, scaleInAnimation, shimmerAnimation } from './Avatar.animations';\nimport {\n AVATAR_SIZES,\n AVATAR_TRANSITION_EASING,\n AVATAR_TRANSITION_MS,\n ACTIVE_SCALE,\n BORDER_HALO_ALPHA,\n BORDER_WIDTH,\n FADE_MS,\n FOCUS_RING,\n GLOW,\n HOVER,\n LOADING_OVERLAY,\n PULSE,\n ROUNDED_RADIUS_UNITS,\n SCALE_IN_MS,\n SHIMMER,\n SPINNER,\n STATUS_DOT,\n} from './Avatar.metrics';\nimport type { AvatarSize, AvatarStatus, ContentType } from './Avatar.types';\nimport { absoluteInk, controlNeutral, neutralTones } from '../../../tokens/ink';\nimport { rem } from '../../../tokens/relative';\n\nexport type { ContentType };\n\n\ninterface PaletteLike {\n main: string;\n contrastText?: string;\n light?: string;\n dark?: string;\n}\n\nconst getColorFromTheme = (theme: Theme, color: string): PaletteLike => {\n const neutral = controlNeutral(theme);\n const colorMap: Record<string, PaletteLike> = {\n primary: theme.palette.primary,\n secondary: theme.palette.secondary,\n success: theme.palette.success,\n warning: theme.palette.warning,\n info: theme.palette.info,\n // `danger`, not `error`. This map was keyed on MUI's word while the prop\n // took the house one, so `danger` matched nothing and fell through to\n // primary — a red avatar rendering blue, silently.\n danger: theme.palette.error,\n neutral: { main: neutral.main, contrastText: neutral.contrastText },\n };\n\n return colorMap[color] || theme.palette.primary;\n};\n\ninterface SizeStyle {\n width: number;\n height: number;\n}\n\n// Derived from the shared metrics, not restated: the native `Avatar` reads the\n// same table, so the two renderers cannot disagree on a box.\nconst sizeMap: Record<AvatarSize, SizeStyle> = Object.fromEntries(\n Object.entries(AVATAR_SIZES).map(([size, step]) => [\n size,\n { width: step.box, height: step.box },\n ]),\n) as Record<AvatarSize, SizeStyle>;\n\nconst getSizeStyles = (size: AvatarSize): SizeStyle => sizeMap[size] || sizeMap.md;\n\n/** The glyph size in design px, read through the type scale where it is drawn. */\nconst glyphPx = (size: AvatarSize): number => (AVATAR_SIZES[size] || AVATAR_SIZES.md).fontSize;\n\nconst getStatusColor = (status: AvatarStatus, theme: Theme): string => {\n // The same four decisions the native half reads out of `Avatar.metrics`,\n // against MUI's `Theme` rather than the shared one.\n const statusColorMap: Record<AvatarStatus, string> = {\n online: theme.palette.success.main,\n offline: neutralTones(theme).muted,\n away: theme.palette.warning.main,\n busy: theme.palette.error.main,\n };\n\n return statusColorMap[status] || statusColorMap.offline;\n};\n\n/** Hover/active lift, only when the avatar is interactive. */\nconst interactiveStyles = (interactive: boolean | undefined, main: string): CSSObject =>\n interactive\n ? {\n '&:hover': {\n transform: `scale(${HOVER.scale}) translateY(-${HOVER.lift}px)`,\n boxShadow: `0 ${HOVER.shadowY}px ${HOVER.shadowBlur}px ${alpha(main, HOVER.shadowAlpha)}`,\n filter: `brightness(${HOVER.brightness})`,\n zIndex: 10,\n },\n '&:active': { transform: `scale(${ACTIVE_SCALE})` },\n }\n : {};\n\n/** Shimmer gradient while the image loads. */\nconst loadingStyles = (isLoading: boolean | undefined, main: string): CSSObject =>\n isLoading\n ? {\n background: `linear-gradient(\n 90deg,\n ${alpha(main, SHIMMER.fromAlpha)},\n ${alpha(main, SHIMMER.toAlpha)},\n ${alpha(main, SHIMMER.fromAlpha)}\n )`,\n backgroundSize: '200% 100%',\n animation: `${shimmerAnimation} ${SHIMMER.durationMs / 1000}s ease-in-out infinite`,\n }\n : {};\n\n/** Corner radius per shape variant (circle/status are round). */\nconst variantRadius = (variant: string | undefined, theme: Theme): CSSObject => {\n if (variant === 'square') return { borderRadius: 0 };\n if (variant === 'rounded') return { borderRadius: theme.spacing(ROUNDED_RADIUS_UNITS) };\n return { borderRadius: '50%' };\n};\n\n/** Paper ring when bordered (e.g. inside an AvatarGroup). */\nconst borderedStyles = (bordered: boolean | undefined, theme: Theme): CSSObject =>\n bordered\n ? {\n border: `${BORDER_WIDTH}px solid ${theme.palette.background.paper}`,\n boxShadow: `0 0 0 1px ${alpha(theme.palette.divider, BORDER_HALO_ALPHA)}`,\n }\n : {};\n\n/** Glow adds the halo; pulse adds the expanding ring — either or both. */\nconst glowPulseStyles = (\n glow: boolean | undefined,\n pulse: boolean | undefined,\n main: string,\n): CSSObject => {\n const styles: CSSObject = {};\n if (glow) {\n styles.boxShadow = `0 0 ${GLOW.blur}px ${GLOW.spread}px ${alpha(main, GLOW.alpha)} !important`;\n styles.filter = `brightness(${GLOW.brightness})`;\n }\n if (pulse) {\n styles.position = 'relative';\n styles['&::after'] = {\n content: '\"\"',\n position: 'absolute',\n top: '50%',\n left: '50%',\n width: '100%',\n height: '100%',\n borderRadius: 'inherit',\n transform: 'translate(-50%, -50%)',\n backgroundColor: main,\n opacity: PULSE.alpha,\n animation: `${pulseAnimation} ${PULSE.durationMs / 1000}s infinite`,\n pointerEvents: 'none',\n zIndex: -1,\n };\n }\n return styles;\n};\n\ninterface StyledAvatarProps {\n customVariant?: string;\n customSize?: AvatarSize;\n customColor?: string;\n glow?: boolean;\n pulse?: boolean;\n bordered?: boolean;\n isLoading?: boolean;\n hasError?: boolean;\n interactive?: boolean;\n}\n\nconst STYLED_AVATAR_PROPS = [\n 'customVariant',\n 'customSize',\n 'customColor',\n 'glow',\n 'pulse',\n 'bordered',\n 'isLoading',\n 'hasError',\n 'interactive',\n];\n\nconst StyledAvatar = styled(MuiAvatar, {\n shouldForwardProp: (prop) => !STYLED_AVATAR_PROPS.includes(prop as string),\n})<StyledAvatarProps>(\n ({\n theme,\n customVariant,\n customSize = 'md',\n customColor = 'primary',\n glow,\n pulse,\n bordered,\n isLoading,\n hasError,\n interactive,\n }) => {\n const palette = getColorFromTheme(theme, customColor);\n return {\n ...getSizeStyles(customSize),\n fontSize: rem(theme, glyphPx(customSize)),\n transition: `all ${AVATAR_TRANSITION_MS / 1000}s ${AVATAR_TRANSITION_EASING}`,\n position: 'relative',\n overflow: 'visible',\n animation: `${scaleInAnimation} ${SCALE_IN_MS / 1000}s ease-out`,\n cursor: interactive ? 'pointer' : 'default',\n backgroundColor: hasError ? theme.palette.error.main : palette.main,\n color: hasError ? theme.palette.error.contrastText : (palette.contrastText ?? absoluteInk(theme).white),\n ...interactiveStyles(interactive, palette.main),\n ...loadingStyles(isLoading, palette.main),\n ...variantRadius(customVariant, theme),\n ...borderedStyles(bordered, theme),\n ...glowPulseStyles(glow, pulse, palette.main),\n '&:focus-visible': {\n outline: `${FOCUS_RING.width}px solid ${alpha(palette.main, FOCUS_RING.alpha)}`,\n outlineOffset: FOCUS_RING.offset,\n },\n };\n },\n);\n\nconst LoadingOverlay = styled('div')<{ size: AvatarSize }>(({ theme, size }) => {\n const sizeStyles = getSizeStyles(size);\n return {\n position: 'absolute',\n top: 0,\n left: 0,\n width: sizeStyles.width,\n height: sizeStyles.height,\n borderRadius: 'inherit',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n backgroundColor: alpha(theme.palette.background.paper, LOADING_OVERLAY.paperAlpha),\n backdropFilter: `blur(${LOADING_OVERLAY.blur}px)`,\n '& .loading-spinner': {\n width: sizeStyles.width * SPINNER.scale,\n height: sizeStyles.height * SPINNER.scale,\n border: `${SPINNER.ringWidth}px solid ${alpha(theme.palette.primary.main, SPINNER.trackAlpha)}`,\n borderTopColor: theme.palette.primary.main,\n borderRadius: '50%',\n animation: `${rotateAnimation} ${SPINNER.durationMs / 1000}s linear infinite`,\n },\n };\n});\n\nconst StatusBadge = styled(Badge, {\n shouldForwardProp: (prop) => !['statusColor', 'avatarSize'].includes(prop as string),\n})<{\n statusColor?: string;\n avatarSize?: AvatarSize;\n}>(({ theme, statusColor, avatarSize = 'md' }) => {\n const sizeStyles = getSizeStyles(avatarSize);\n const badgeSize = Math.max(STATUS_DOT.min, sizeStyles.width * STATUS_DOT.scale);\n\n return {\n '& .MuiBadge-badge': {\n backgroundColor: statusColor || theme.palette.success.main,\n color: statusColor || theme.palette.success.main,\n width: badgeSize,\n height: badgeSize,\n borderRadius: '50%',\n border: `${STATUS_DOT.borderWidth}px solid ${theme.palette.background.paper}`,\n '&::after': {\n position: 'absolute',\n top: 0,\n left: 0,\n width: '100%',\n height: '100%',\n borderRadius: '50%',\n backgroundColor: 'currentColor',\n content: '\"\"',\n },\n },\n };\n});\n\nexport interface AvatarViewProps {\n mounted: boolean;\n variant: string;\n size: AvatarSize;\n color: string;\n glow: boolean;\n pulse: boolean;\n bordered: boolean;\n showSpinner: boolean;\n imageError: boolean;\n clickable: boolean;\n imgSrc?: string;\n alt?: string;\n ariaLabel: string;\n content: React.ReactNode;\n contentType: ContentType;\n className?: string;\n dataTestId?: string;\n status?: AvatarStatus;\n forwardedRef: React.Ref<HTMLDivElement>;\n onClick: (event: React.MouseEvent<HTMLDivElement>) => void;\n handleImageError: React.ReactEventHandler;\n handleImageLoad: () => void;\n rest: Record<string, unknown>;\n}\n\n/** The avatar box itself: the styled MUI avatar plus the loading overlay. */\nfunction AvatarSurface(props: AvatarViewProps): React.JSX.Element {\n const { showSpinner, dataTestId, clickable } = props;\n const testId = (suffix: string): string | undefined =>\n dataTestId ? `${dataTestId}-${suffix}` : undefined;\n\n return (\n <Fade in={props.mounted} timeout={FADE_MS}>\n <div style={{ position: 'relative', display: 'inline-block' }}>\n <StyledAvatar\n ref={props.forwardedRef}\n className={props.className}\n customVariant={props.variant}\n customSize={props.size}\n customColor={props.color}\n glow={props.glow}\n pulse={props.pulse}\n bordered={props.bordered}\n isLoading={showSpinner}\n hasError={props.imageError}\n interactive={clickable}\n src={props.imgSrc}\n alt={props.alt}\n onClick={props.onClick}\n tabIndex={clickable ? 0 : undefined}\n role={clickable ? 'button' : undefined}\n aria-label={props.ariaLabel}\n data-testid={dataTestId}\n {...props.rest}\n // Load/error fire on the inner <img>, not the root — and don't bubble.\n // Wiring them via the img slot lets `imageLoading` actually clear (else\n // the spinner overlays the avatar forever whenever `src` is set). Keep\n // after {...props.rest} so a consumer-supplied slotProps can't override\n // and detach these handlers.\n slotProps={{ img: { onError: props.handleImageError, onLoad: props.handleImageLoad } }}\n >\n {showSpinner ? null : (\n <span data-testid={testId(props.contentType)}>{props.content}</span>\n )}\n </StyledAvatar>\n {showSpinner && (\n <LoadingOverlay size={props.size} data-testid={testId('loading')}>\n <div className=\"loading-spinner\" data-testid={testId('loading-spinner')} />\n </LoadingOverlay>\n )}\n </div>\n </Fade>\n );\n}\n\n/** Presentational avatar: the surface, wrapped in a status dot badge when requested. */\nexport function AvatarView(props: AvatarViewProps): React.JSX.Element {\n const theme = useTheme();\n const surface = <AvatarSurface {...props} />;\n\n if (props.variant === 'status' && props.status) {\n return (\n <StatusBadge\n overlap=\"circular\"\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n variant=\"dot\"\n statusColor={getStatusColor(props.status, theme)}\n avatarSize={props.size}\n data-testid={props.dataTestId ? `${props.dataTestId}-badge` : undefined}\n >\n {surface}\n </StatusBadge>\n );\n }\n\n return surface;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/Carousel/Carousel.slide.tsx"],"sourcesContent":["import Box from '@mui/material/Box/index.js';\nimport Paper from '@mui/material/Paper/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport { useTheme } from '@mui/material/styles/index.js';\nimport React from 'react';\n\nimport type { CarouselItem, CarouselProps } from './Carousel.types';\nimport { onMedia, shadowInk } from '../../../tokens/ink';\n\nexport interface CarouselSlideProps {\n item: CarouselItem;\n index: number;\n isActive: boolean;\n variant: NonNullable<CarouselProps['variant']>;\n clickable: boolean;\n onSelect: (item: CarouselItem, index: number) => void;\n}\n\n/**\n * A slide's caption. Over an image it is white with a shadow so it stays legible\n * against whatever the photograph happens to be; on a bare surface it uses the\n * ordinary text colours.\n */\nconst SlideCaption: React.FC<Pick<CarouselItem, 'title' | 'description' | 'content' | 'image'>> = ({\n title,\n description,\n content,\n image,\n}) => (\n <Box sx={{ position: 'relative', zIndex: 1, textAlign: 'center', p: 3 }}>\n {title && (\n <Typography\n variant=\"h5\"\n sx={(theme) => ({\n color: image ? onMedia(theme) : 'text.primary',\n textShadow: image ? `0 2px 4px ${shadowInk(theme, 0.5)}` : 'none',\n mb: 1,\n })}\n >\n {title}\n </Typography>\n )}\n\n {description && (\n <Typography\n variant=\"body1\"\n sx={(theme) => ({\n color: image ? onMedia(theme) : 'text.secondary',\n textShadow: image ? `0 1px 2px ${shadowInk(theme, 0.5)}` : 'none',\n })}\n >\n {description}\n </Typography>\n )}\n\n {content}\n </Box>\n);\n\nexport const CarouselSlide: React.FC<CarouselSlideProps> = ({\n item,\n index,\n isActive,\n variant,\n clickable,\n onSelect,\n}) => {\n const theme = useTheme();\n\n const content = (\n <Box\n sx={{\n width: '100%',\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n cursor: clickable ? 'pointer' : 'default',\n position: 'relative',\n }}\n onClick={() => onSelect(item, index)}\n >\n {item.image && (\n <Box\n component=\"img\"\n src={item.image}\n alt={item.alt || item.title}\n sx={{\n width: '100%',\n height: '100%',\n objectFit: 'cover',\n position: 'absolute',\n top: 0,\n left: 0,\n }}\n />\n )}\n\n <SlideCaption\n title={item.title}\n description={item.description}\n content={item.content}\n image={item.image}\n />\n </Box>\n );\n\n // The cards variant gives each slide its own raised surface, and lifts the\n // active one further so the stack reads as a deck rather than a strip.\n if (variant === 'cards') {\n return (\n <Paper\n elevation={isActive ? 8 : 2}\n sx={{\n width: '100%',\n height: '100%',\n overflow: 'hidden',\n transform: isActive ? 'scale(1)' : 'scale(0.9)',\n transition: theme.transitions.create(['transform', 'box-shadow']),\n }}\n >\n {content}\n </Paper>\n );\n }\n\n return content;\n};\n\nexport interface CarouselTrackProps {\n items: CarouselItem[];\n activeIndex: number;\n variant: NonNullable<CarouselProps['variant']>;\n animation: NonNullable<CarouselProps['animation']>;\n transition: React.ElementType;\n clickable: boolean;\n onSelect: (item: CarouselItem, index: number) => void;\n}\n\n/**\n * The slides themselves. Every slide stays mounted and absolutely positioned so\n * the transition has both the outgoing and incoming one to work with; `display`\n * is what actually hides the rest.\n */\nexport const CarouselTrack: React.FC<CarouselTrackProps> = ({\n items,\n activeIndex,\n variant,\n animation,\n transition: Transition,\n clickable,\n onSelect,\n}) => (\n <Box\n data-testid=\"carousel-track\"\n sx={{\n width: '100%',\n height: '100%',\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n }}\n >\n {items.map((item, index) => (\n <Transition\n key={item.id}\n in={index === activeIndex}\n timeout={600}\n {...(animation === 'flip' && { direction: 'left' as const })}\n >\n <Box\n data-testid={`carousel-slide-${index}`}\n data-active={index === activeIndex}\n sx={{\n position: 'absolute',\n width: '100%',\n height: '100%',\n display: index === activeIndex ? 'block' : 'none',\n }}\n >\n <CarouselSlide\n item={item}\n index={index}\n isActive={index === activeIndex}\n variant={variant}\n clickable={clickable}\n onSelect={onSelect}\n />\n </Box>\n </Transition>\n ))}\n </Box>\n);\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/ErrorState/ErrorState.tsx"],"sourcesContent":["import ErrorOutlineIcon from '@mui/icons-material/ErrorOutline';\nimport RefreshIcon from '@mui/icons-material/Refresh';\nimport WarningAmberIcon from '@mui/icons-material/WarningAmber';\nimport Box from '@mui/material/Box/index.js';\nimport Button from '@mui/material/Button/index.js';\nimport Stack from '@mui/material/Stack/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport { useTheme } from '@mui/material/styles/index.js';\nimport type { Theme } from '@mui/material/styles/index.js';\nimport React from 'react';\n\nimport {\n ERROR_ICON_BOX,\n ERROR_ICON_BOX_OPACITY,\n ERROR_ICON_SIZE,\n ERROR_MESSAGE_LINE_HEIGHT,\n ERROR_MESSAGE_MAX_WIDTH,\n ERROR_STATE_GAP_UNITS,\n ERROR_STATE_MIN_HEIGHT,\n ERROR_STATE_PADDING_UNITS,\n ERROR_TEXT_GAP_UNITS,\n RETRY_MARGIN_TOP_UNITS,\n RETRY_MIN_WIDTH,\n} from './ErrorState.metrics';\nimport type { ErrorStateProps, ErrorStateSeverity } from './ErrorState.types';\nimport { resolveTestId } from '../../../platform/test-id';\nimport { sxRem } from '../../../tokens/relative';\n\nconst makeTestId =\n (dataTestId?: string) =>\n (suffix: string): string =>\n dataTestId ? `${dataTestId}-${suffix}` : `error-state-${suffix}`;\n\nconst paletteFor = (theme: Theme, severity: ErrorStateSeverity) =>\n severity === 'error' ? theme.palette.error : theme.palette.warning;\n\nconst ErrorIcon: React.FC<{\n severity: ErrorStateSeverity;\n icon?: React.ReactNode;\n testId: string;\n}> = ({ severity, icon, testId }) => {\n const theme = useTheme();\n const color = paletteFor(theme, severity);\n const Fallback = severity === 'error' ? ErrorOutlineIcon : WarningAmberIcon;\n\n return (\n <Box\n data-testid={testId}\n sx={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n width: ERROR_ICON_BOX,\n height: ERROR_ICON_BOX,\n borderRadius: '50%',\n backgroundColor: color.light,\n opacity: ERROR_ICON_BOX_OPACITY,\n }}\n >\n {icon || <Fallback sx={{ fontSize: sxRem(ERROR_ICON_SIZE), color: color.main }} />}\n </Box>\n );\n};\n\nconst ErrorText: React.FC<{\n title?: string;\n message: string;\n titleId: string;\n testId: (suffix: string) => string;\n}> = ({ title, message, titleId, testId }) => {\n const theme = useTheme();\n\n return (\n <Stack spacing={ERROR_TEXT_GAP_UNITS} alignItems=\"center\">\n {title && (\n <Typography\n id={titleId}\n variant=\"h6\"\n component=\"h3\"\n data-testid={testId('title')}\n sx={{\n fontWeight: theme.typography.fontWeightMedium,\n color: theme.palette.text.primary,\n }}\n >\n {title}\n </Typography>\n )}\n\n <Typography\n id={`${titleId}-message`}\n variant=\"body2\"\n color=\"text.secondary\"\n data-testid={testId('message')}\n sx={{\n maxWidth: ERROR_MESSAGE_MAX_WIDTH,\n lineHeight: ERROR_MESSAGE_LINE_HEIGHT,\n }}\n >\n {message}\n </Typography>\n </Stack>\n );\n};\n\nexport const ErrorState: React.FC<ErrorStateProps> = React.memo((props) => {\n const {\n message,\n title,\n onRetry,\n retryLabel = 'Retry',\n severity = 'error',\n icon,\n className,\n } = props;\n const theme = useTheme();\n const titleId = React.useId();\n // `dataTestId` is the documented spelling; `testID`, the shared contract's\n // other one, resolves to the same id.\n const dataTestId = resolveTestId(props);\n const testId = makeTestId(dataTestId);\n\n return (\n <Box\n role=\"alert\"\n aria-labelledby={title ? titleId : undefined}\n aria-describedby={`${titleId}-message`}\n className={className}\n data-testid={dataTestId || 'error-state'}\n sx={{\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n textAlign: 'center',\n padding: theme.spacing(ERROR_STATE_PADDING_UNITS),\n minHeight: ERROR_STATE_MIN_HEIGHT,\n gap: theme.spacing(ERROR_STATE_GAP_UNITS),\n }}\n >\n <ErrorIcon severity={severity} icon={icon} testId={testId('icon')} />\n\n <ErrorText title={title} message={message} titleId={titleId} testId={testId} />\n\n {onRetry && (\n <Button\n variant=\"outlined\"\n color={severity}\n onClick={onRetry}\n startIcon={<RefreshIcon />}\n data-testid={testId('retry-button')}\n sx={{\n mt: theme.spacing(RETRY_MARGIN_TOP_UNITS),\n minWidth: RETRY_MIN_WIDTH,\n }}\n >\n {retryLabel}\n </Button>\n )}\n </Box>\n );\n});\n\nErrorState.displayName = 'ErrorState';\n\nexport default ErrorState;\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/Banner/Banner.tsx"],"sourcesContent":["import CheckCircle from '@mui/icons-material/CheckCircle';\nimport Close from '@mui/icons-material/Close';\nimport Error from '@mui/icons-material/Error';\nimport Info from '@mui/icons-material/Info';\nimport Warning from '@mui/icons-material/Warning';\nimport Box from '@mui/material/Box/index.js';\nimport Button from '@mui/material/Button/index.js';\nimport IconButton from '@mui/material/IconButton/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport { alpha, styled } from '@mui/material/styles/index.js';\nimport type { Theme } from '@mui/material/styles/index.js';\nimport React from 'react';\n\nimport { BANNER_TINT_S, bannerPartStyles, bannerPointerStates, fadeInSlide, getVariantColor } from './Banner.styles';\nimport { FOCUS } from '../Alert/Alert.metrics';\nimport type { BannerProps, BannerVariant } from './Banner.types';\nimport { rem } from '../../../tokens/relative';\n\n\n\nconst StyledBanner = styled(Box, {\n shouldForwardProp: (prop) => !['variant', 'sticky', 'fullWidth'].includes(prop as string),\n})<{\n variant: BannerVariant;\n sticky: boolean;\n fullWidth: boolean;\n}>(({ theme, variant, sticky, fullWidth }) => {\n\n const colorPalette = getVariantColor(theme, variant);\n\n return {\n display: 'flex',\n alignItems: 'flex-start',\n gap: theme.spacing(1.5),\n padding: theme.spacing(1.5, 2),\n borderRadius: theme.spacing(1),\n backgroundColor: alpha(colorPalette.main, 0.1),\n border: `1px solid ${alpha(colorPalette.main, 0.2)}`,\n color: colorPalette.main,\n position: sticky ? 'sticky' : 'relative',\n top: sticky ? 0 : 'auto',\n zIndex: sticky ? theme.zIndex.appBar : 'auto',\n width: fullWidth ? '100vw' : '100%',\n marginLeft: fullWidth ? '50%' : 0,\n transform: fullWidth ? 'translateX(-50%)' : 'none',\n animation: `${fadeInSlide} 0.3s ease-out`,\n transition: `all 0.3s cubic-bezier(0.4, 0, 0.2, 1), box-shadow ${BANNER_TINT_S}s cubic-bezier(0.4, 0, 0.2, 1)`,\n\n ...bannerPointerStates(theme),\n\n // Focus: `:focus-visible`, not `:focus-within`.\n //\n // The banner carries `tabIndex={0}`, so a MOUSE CLICK focused it and\n // painted this ring — a keyboard affordance answering a pointer, which is\n // what made clicking one look like an error state. `:focus-visible` is the\n // browser's own answer to whether the focus came from the keyboard: the\n // ring stays for whoever tabs here and never fires on a click. Same defect\n // and same fix as `Alert`, which is the sibling surface (FUT-1458).\n '&:focus-visible': {\n outline: `${FOCUS.ringWidth}px solid ${alpha(colorPalette.main, FOCUS.ringAlpha)}`,\n outlineOffset: `${FOCUS.offset}px`,\n },\n\n ...bannerPartStyles(theme, colorPalette),\n\n // Responsive layout\n [theme.breakpoints.down('sm')]: {\n flexDirection: 'column',\n alignItems: 'stretch',\n gap: theme.spacing(1),\n \n '.banner-content': {\n order: 1,\n },\n\n '.banner-actions': {\n order: 2,\n justifyContent: 'flex-start',\n marginTop: theme.spacing(1),\n marginLeft: 0,\n },\n },\n\n // Glass effect variant (optional enhancement)\n '&.banner-glass': {\n backgroundColor: alpha(theme.palette.background.paper, 0.1),\n backdropFilter: 'blur(20px)',\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n color: theme.palette.text.primary,\n \n '.banner-icon': {\n color: colorPalette.main,\n },\n },\n };\n});\n\nconst getVariantIcon = (variant: BannerVariant) => {\n const iconMap: Record<BannerVariant, React.ReactNode> = {\n info: <Info />,\n success: <CheckCircle />,\n warning: <Warning />,\n critical: <Error />,\n };\n return iconMap[variant];\n};\n\ntype BannerAction = NonNullable<BannerProps['actions']>[number];\n\n// Warnings and criticals interrupt the screen reader; the rest are announced\n// politely when it next pauses.\nconst resolveAriaAnnouncement = (variant: BannerVariant) => ({\n role: variant === 'warning' || variant === 'critical' ? 'alert' : 'status',\n live: (variant === 'critical' ? 'assertive' : 'polite') as 'assertive' | 'polite',\n});\n\nconst testIdFor = (base: string | undefined, suffix: string) =>\n base ? `${base}-${suffix}` : `banner-${suffix}`;\n\n// Resolves the banner's palette once, rather than per property as the inline\n// version did — getVariantColor was being called nine times to build one button.\nconst buildActionSx = (\n theme: Theme,\n variant: BannerVariant,\n actionVariant: BannerAction['variant'],\n) => {\n const palette = getVariantColor(theme, variant);\n\n return {\n minWidth: 'auto',\n px: 1.5,\n py: 0.5,\n fontSize: rem(theme, 13),\n fontWeight: 500,\n borderRadius: 1,\n\n ...(actionVariant === 'primary' && {\n backgroundColor: palette.main,\n color: theme.palette.getContrastText(palette.main),\n\n // Colour only. The banner itself moves nothing under a pointer, and an\n // action that lifts inside one that does not is the inconsistency a\n // reader notices without being able to name it (FUT-1458).\n '&:hover': {\n backgroundColor: palette.dark || palette.main,\n },\n }),\n\n ...(actionVariant === 'secondary' && {\n borderColor: palette.main,\n color: palette.main,\n\n '&:hover': {\n backgroundColor: alpha(palette.main, 0.1),\n borderColor: palette.main,\n },\n }),\n };\n};\n\nconst BannerActionButton: React.FC<{\n action: BannerAction;\n variant: BannerVariant;\n dataTestId?: string;\n}> = ({ action, variant, dataTestId }) => (\n <Button\n size=\"small\"\n variant={action.variant === 'primary' ? 'contained' : 'outlined'}\n onClick={action.onClick}\n data-testid={testIdFor(dataTestId, 'action')}\n sx={(theme) => buildActionSx(theme, variant, action.variant)}\n >\n {action.label}\n </Button>\n);\n\nconst BannerBody: React.FC<{\n displayIcon: React.ReactNode;\n title?: BannerProps['title'];\n description?: BannerProps['description'];\n dataTestId?: string;\n children?: React.ReactNode;\n}> = ({ displayIcon, title, description, dataTestId, children }) => (\n <>\n {displayIcon && (\n <Box className=\"banner-icon\" aria-hidden=\"true\" data-testid={testIdFor(dataTestId, 'icon')}>\n {displayIcon}\n </Box>\n )}\n\n <Box className=\"banner-content\">\n {title && (\n <Typography\n className=\"banner-title\"\n variant=\"subtitle2\"\n component=\"div\"\n data-testid={testIdFor(dataTestId, 'title')}\n >\n {title}\n </Typography>\n )}\n {description && (\n <Typography\n className=\"banner-description\"\n variant=\"body2\"\n component=\"div\"\n data-testid={testIdFor(dataTestId, 'message')}\n >\n {description}\n </Typography>\n )}\n {children}\n </Box>\n </>\n);\n\nconst BannerTrailing: React.FC<{\n actions?: BannerProps['actions'];\n variant: BannerVariant;\n dismissible: boolean;\n onDismissClick: () => void;\n dismissLabel: string;\n dataTestId?: string;\n}> = ({ actions, variant, dismissible, onDismissClick, dismissLabel, dataTestId }) => (\n <Box display=\"flex\" alignItems=\"center\" gap={1}>\n {actions && actions.length > 0 && (\n <Box className=\"banner-actions\">\n {actions.map((action, index) => (\n <BannerActionButton\n key={index}\n action={action}\n variant={variant}\n dataTestId={dataTestId}\n />\n ))}\n </Box>\n )}\n\n {dismissible && (\n <IconButton\n className=\"banner-dismiss\"\n size=\"small\"\n onClick={onDismissClick}\n aria-label={dismissLabel}\n data-testid={testIdFor(dataTestId, 'close')}\n sx={{ transition: 'all 0.2s ease' }}\n >\n <Close fontSize=\"small\" />\n </IconButton>\n )}\n </Box>\n);\n\nexport const Banner = React.forwardRef<HTMLDivElement, BannerProps>(\n (\n {\n variant = 'info',\n title,\n description,\n icon,\n dismissible = false,\n dismissLabel,\n onDismiss,\n actions,\n sticky = false,\n fullWidth = false,\n className,\n children,\n 'data-testid': dataTestId = 'banner',\n ...props\n },\n ref,\n ) => {\n const [visible, setVisible] = React.useState(true);\n\n const handleDismiss = React.useCallback(() => {\n setVisible(false);\n onDismiss?.();\n }, [onDismiss]);\n\n const displayIcon = icon || getVariantIcon(variant);\n\n const { role: ariaRole, live: ariaLive } = resolveAriaAnnouncement(variant);\n\n if (!visible) {\n return null;\n }\n\n return (\n <StyledBanner\n ref={ref}\n variant={variant}\n sticky={sticky}\n fullWidth={fullWidth}\n className={className}\n role={ariaRole}\n aria-live={ariaLive}\n aria-atomic=\"true\"\n tabIndex={0}\n data-testid={dataTestId}\n {...props}\n >\n <BannerBody\n displayIcon={displayIcon}\n title={title}\n description={description}\n dataTestId={dataTestId}\n >\n {children}\n </BannerBody>\n\n <BannerTrailing\n actions={actions}\n variant={variant}\n dismissible={dismissible}\n onDismissClick={handleDismiss}\n dismissLabel={dismissLabel}\n dataTestId={dataTestId}\n />\n </StyledBanner>\n );\n },\n);\n\nBanner.displayName = 'Banner';"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/Chart/chart-renderers.tsx"],"sourcesContent":["import type { Theme } from '@mui/material/styles/index.js';\nimport React from 'react';\nimport {\n Area,\n AreaChart,\n Bar,\n BarChart,\n CartesianGrid,\n Cell,\n ComposedChart,\n Legend,\n Line,\n LineChart,\n Pie,\n PieChart,\n PolarAngleAxis,\n PolarGrid,\n PolarRadiusAxis,\n Radar,\n RadarChart,\n Scatter,\n ScatterChart,\n Tooltip,\n XAxis,\n YAxis,\n} from 'recharts';\n\nimport type { ChartProps, ChartSeries } from './Chart.types';\nimport { ChartLegendContent, ChartTooltipContent } from './ChartComposables';\nimport { buildChartContext, type ChartRenderContext } from './chart-context';\nimport { uiInk } from '../../../tokens/ink';\n\n/**\n * Per-type Recharts renderers for the prop-driven Chart, dispatched from a\n * registry keyed by `ChartProps['type']`. Each renderer reads a prepared\n * {@link ChartRenderContext} so every function stays small.\n */\n\nfunction chartExtras(ctx: ChartRenderContext): React.ReactNode[] {\n const { props } = ctx;\n const nodes: React.ReactNode[] = [];\n if (props.showTooltip !== false) {\n nodes.push(\n <Tooltip key=\"tooltip\" content={<ChartTooltipContent valueFormatter={props.valueFormatter} />} />,\n );\n }\n if (props.showLegend !== false) {\n nodes.push(<Legend key=\"legend\" content={<ChartLegendContent />} />);\n }\n return nodes;\n}\n\n/**\n * Gridlines: solid, and one step below the card border. A dashed line at the\n * border's own weight competes with the data drawn over it.\n */\nfunction chartGrid(ctx: ChartRenderContext): React.ReactElement {\n return <CartesianGrid key=\"grid\" stroke={ctx.gridStroke} strokeOpacity={ctx.gridOpacity} />;\n}\n\nfunction cartesianAxes(ctx: ChartRenderContext): React.ReactNode[] {\n const { props, axisConfig } = ctx;\n const nodes: React.ReactNode[] = [];\n if (props.showCartesianGrid !== false) nodes.push(chartGrid(ctx));\n nodes.push(\n <XAxis\n key=\"x\"\n dataKey={props.xAxisKey ?? 'name'}\n style={ctx.axisStyle}\n label={props.xAxisLabel}\n tickMargin={axisConfig.tickMargin}\n ticks={axisConfig.categoryTicks}\n tickFormatter={axisConfig.tickFormatter}\n />,\n <YAxis\n key=\"y\"\n style={ctx.axisStyle}\n label={props.yAxisLabel}\n // Sized from its own widest tick: a fixed 60px lets \"R$ 1.234,56\" spill\n // out of the card, which is the other way axis text ends up on top of\n // something.\n width=\"auto\"\n tickMargin={axisConfig.tickMargin}\n tickFormatter={props.valueFormatter}\n allowDecimals={props.allowDecimalTicks !== false}\n />,\n );\n return nodes;\n}\n\nfunction renderLine(ctx: ChartRenderContext): React.ReactElement {\n return (\n <LineChart {...ctx.commonProps}>\n {cartesianAxes(ctx)}\n {chartExtras(ctx)}\n {ctx.chartSeries.map((s, index) => (\n <Line\n key={s.dataKey}\n type={ctx.strokeType}\n dataKey={s.dataKey}\n name={s.name}\n stroke={s.color ?? ctx.chartColors[index % ctx.chartColors.length]}\n strokeWidth={s.strokeWidth ?? 2}\n dot={s.dot !== false}\n activeDot={s.activeDot !== false ? { r: 8 } : false}\n animationDuration={ctx.animationDuration}\n />\n ))}\n </LineChart>\n );\n}\n\nfunction renderBar(ctx: ChartRenderContext): React.ReactElement {\n return (\n <BarChart {...ctx.commonProps}>\n {cartesianAxes(ctx)}\n {chartExtras(ctx)}\n {ctx.chartSeries.map((s, index) => (\n <Bar\n key={s.dataKey}\n dataKey={s.dataKey}\n name={s.name}\n fill={s.fill ?? s.color ?? ctx.chartColors[index % ctx.chartColors.length]}\n stackId={ctx.props.stacked ? 'stack' : undefined}\n radius={ctx.barGeometry.radius}\n maxBarSize={ctx.barGeometry.maxBarSize}\n animationDuration={ctx.animationDuration}\n />\n ))}\n </BarChart>\n );\n}\n\nfunction renderArea(ctx: ChartRenderContext): React.ReactElement {\n return (\n <AreaChart {...ctx.commonProps}>\n {cartesianAxes(ctx)}\n {chartExtras(ctx)}\n {ctx.chartSeries.map((s, index) => (\n <Area\n key={s.dataKey}\n type={ctx.strokeType}\n dataKey={s.dataKey}\n name={s.name}\n stroke={s.color ?? ctx.chartColors[index % ctx.chartColors.length]}\n fill={s.fill ?? s.color ?? ctx.chartColors[index % ctx.chartColors.length]}\n fillOpacity={s.fillOpacity ?? 0.6}\n stackId={ctx.props.stacked ? 'stack' : undefined}\n animationDuration={ctx.animationDuration}\n />\n ))}\n </AreaChart>\n );\n}\n\nfunction pieCenterLabel(ctx: ChartRenderContext): React.ReactNode {\n const { centerLabel } = ctx.props;\n const innerRadius = ctx.props.innerRadius ?? 0;\n if (!centerLabel || innerRadius <= 0) return null;\n const fill = ctx.props.variant === 'neon' ? uiInk(ctx.theme).dataVizNeon.accent : ctx.theme.palette.text.primary;\n return (\n <text\n x=\"50%\"\n y=\"50%\"\n textAnchor=\"middle\"\n dominantBaseline=\"middle\"\n style={{ fontSize: ctx.sizeStyles.fontSize, fill, fontWeight: 600 }}\n >\n {typeof centerLabel === 'string' ? (\n centerLabel\n ) : (\n <>\n <tspan\n x=\"50%\"\n dy=\"-0.6em\"\n style={{ fontSize: '0.875em', fontWeight: 500, fill: ctx.theme.palette.text.secondary }}\n >\n {centerLabel.label}\n </tspan>\n <tspan x=\"50%\" dy=\"1.4em\" style={{ fontSize: '1.5em', fontWeight: 700 }}>\n {centerLabel.value}\n </tspan>\n </>\n )}\n </text>\n );\n}\n\nfunction renderPie(ctx: ChartRenderContext): React.ReactElement {\n const { props } = ctx;\n return (\n <PieChart>\n {chartExtras(ctx)}\n <Pie\n data={props.data}\n dataKey={ctx.chartSeries[0]?.dataKey ?? 'value'}\n nameKey={props.xAxisKey ?? 'name'}\n cx=\"50%\"\n cy=\"50%\"\n outerRadius={ctx.sizeStyles.height / 3}\n innerRadius={props.innerRadius ?? 0}\n fill={ctx.chartColors[0]}\n label={props.showValues ?? false}\n animationDuration={ctx.animationDuration}\n >\n {props.data.map((entry, index) => (\n <Cell key={`cell-${index}`} fill={ctx.chartColors[index % ctx.chartColors.length]} />\n ))}\n </Pie>\n {pieCenterLabel(ctx)}\n </PieChart>\n );\n}\n\nfunction renderRadar(ctx: ChartRenderContext): React.ReactElement {\n return (\n <RadarChart {...ctx.commonProps}>\n <PolarGrid stroke={ctx.gridStroke} />\n <PolarAngleAxis dataKey={ctx.props.xAxisKey ?? 'name'} style={ctx.axisStyle} />\n <PolarRadiusAxis style={ctx.axisStyle} />\n {chartExtras(ctx)}\n {ctx.chartSeries.map((s, index) => (\n <Radar\n key={s.dataKey}\n dataKey={s.dataKey}\n name={s.name}\n stroke={s.color ?? ctx.chartColors[index % ctx.chartColors.length]}\n fill={s.fill ?? s.color ?? ctx.chartColors[index % ctx.chartColors.length]}\n fillOpacity={s.fillOpacity ?? 0.6}\n animationDuration={ctx.animationDuration}\n />\n ))}\n </RadarChart>\n );\n}\n\nfunction renderScatter(ctx: ChartRenderContext): React.ReactElement {\n const { props } = ctx;\n return (\n <ScatterChart {...ctx.commonProps}>\n {props.showCartesianGrid !== false && chartGrid(ctx)}\n <XAxis\n dataKey={props.xAxisKey ?? 'name'}\n style={ctx.axisStyle}\n label={props.xAxisLabel}\n tickMargin={ctx.axisConfig.tickMargin}\n />\n <YAxis\n dataKey={ctx.chartSeries[0]?.dataKey}\n style={ctx.axisStyle}\n label={props.yAxisLabel}\n tickMargin={ctx.axisConfig.tickMargin}\n />\n {chartExtras(ctx)}\n <Scatter\n name={ctx.chartSeries[0]?.name ?? 'Data'}\n data={props.data}\n fill={ctx.chartColors[0]}\n animationDuration={ctx.animationDuration}\n />\n </ScatterChart>\n );\n}\n\nfunction composedSeries(ctx: ChartRenderContext, s: ChartSeries, index: number): React.ReactElement {\n const color = s.color ?? ctx.chartColors[index % ctx.chartColors.length];\n if (s.type === 'bar') {\n return (\n <Bar\n key={s.dataKey}\n dataKey={s.dataKey}\n name={s.name}\n fill={color}\n radius={ctx.barGeometry.radius}\n maxBarSize={ctx.barGeometry.maxBarSize}\n animationDuration={ctx.animationDuration}\n />\n );\n }\n if (s.type === 'area') {\n return (\n <Area\n key={s.dataKey}\n type={ctx.strokeType}\n dataKey={s.dataKey}\n name={s.name}\n stroke={color}\n fill={color}\n fillOpacity={0.6}\n animationDuration={ctx.animationDuration}\n />\n );\n }\n return (\n <Line\n key={s.dataKey}\n type={ctx.strokeType}\n dataKey={s.dataKey}\n name={s.name}\n stroke={color}\n animationDuration={ctx.animationDuration}\n />\n );\n}\n\nfunction renderComposed(ctx: ChartRenderContext): React.ReactElement {\n return (\n <ComposedChart {...ctx.commonProps}>\n {cartesianAxes(ctx)}\n {chartExtras(ctx)}\n {ctx.chartSeries.map((s, index) => composedSeries(ctx, s, index))}\n </ComposedChart>\n );\n}\n\nconst RENDERERS: Record<string, (ctx: ChartRenderContext) => React.ReactElement> = {\n line: renderLine,\n bar: renderBar,\n area: renderArea,\n pie: renderPie,\n radar: renderRadar,\n scatter: renderScatter,\n composed: renderComposed,\n};\n\n/** Render the Recharts element for the requested chart type. */\nexport function renderChartByType(props: ChartProps, theme: Theme): React.ReactElement {\n const renderer = RENDERERS[props.type ?? 'line'];\n const ctx = buildChartContext(props, theme);\n return renderer ? renderer(ctx) : <></>;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/Sheet/Sheet.animations.ts"],"sourcesContent":["import { keyframes } from '@mui/material/styles/index.js';\n\n/** Spring physics used by the draggable variant's snap-point animation. */\nexport const SPRING_CONFIG = {\n tension: 200,\n friction: 25,\n velocity: 0,\n};\n\n/** Velocity threshold for snap detection (pixels per millisecond). */\nexport const DEFAULT_VELOCITY_THRESHOLD = 0.5;\n\n/** Drag resistance factor applied past the first and last snap points. */\nexport const DEFAULT_DRAG_RESISTANCE = 0.3;\n\nexport const pulseAnimation = keyframes`\n 0% {\n box-shadow: 0 0 0 0 rgba(var(--pulse-color), 0.4);\n }\n 70% {\n box-shadow: 0 0 0 20px rgba(var(--pulse-color), 0);\n }\n 100% {\n box-shadow: 0 0 0 0 rgba(var(--pulse-color), 0);\n }\n`;\n\nexport const shimmerAnimation = keyframes`\n 0% {\n background-position: -1000px 0;\n }\n 100% {\n background-position: 1000px 0;\n }\n`;\n\nexport const glowAnimation = keyframes`\n 0%, 100% {\n box-shadow: 0 0 20px 5px rgba(var(--glow-color), 0.3);\n }\n 50% {\n box-shadow: 0 0 35px 10px rgba(var(--glow-color), 0.5);\n }\n`;\n"],"mappings":";AAAA,SAAS,iBAAiB;AAGnB,IAAM,gBAAgB;AAAA,EAC3B,SAAS;AAAA,EACT,UAAU;AAAA,EACV,UAAU;AACZ;AAGO,IAAM,6BAA6B;AAGnC,IAAM,0BAA0B;AAEhC,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAYvB,IAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASzB,IAAM,gBAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/Sheet/Sheet.styles.ts"],"sourcesContent":["import { alpha } from '@mui/material/styles/index.js';\nimport type { CSSObject, Theme } from '@mui/material/styles/index.js';\nimport type React from 'react';\n\nimport { glowAnimation, pulseAnimation, shimmerAnimation } from './Sheet.animations';\nimport type { SheetProps } from './Sheet.types';\nimport { shadowInk, sheen } from '../../../tokens/ink';\nimport { accentFor } from '../../../tokens/scales';\n\ntype Position = NonNullable<SheetProps['position']>;\ntype Variant = NonNullable<SheetProps['variant']>;\ntype Size = NonNullable<SheetProps['size']>;\ntype Color = NonNullable<SheetProps['color']>;\n\nconst isHorizontalPosition = (position: Position) => position === 'left' || position === 'right';\n\n/**\n * Horizontal (left/right) sheets are viewport-aware: a px floor keeps the panel\n * usable, `…vw` lets the larger presets grow on wide screens (lg ≥32%, xl ≥40%\n * of the viewport), and the outer `min(92vw, …)` guarantees the panel never\n * overflows a small screen.\n */\nconst HORIZONTAL_SIZES: Record<Size, string> = {\n xs: 'min(92vw, 240px)',\n sm: 'min(92vw, 320px)',\n md: 'min(92vw, 400px)',\n lg: 'min(92vw, max(560px, 32vw))',\n xl: 'min(92vw, max(720px, 40vw))',\n full: '100%',\n};\n\n/**\n * `size` governs a vertical sheet's MAIN axis, and it is a CEILING rather than\n * a height: the panel is as tall as what it holds, and starts scrolling only\n * once that would pass the preset.\n *\n * It was a fixed `height`, which meant a short sheet reserved the rest of the\n * preset as dead space — a `md` sheet holding three lines and a button drew a\n * 400px panel and floated them in it. `min(…, 100%)` keeps the ceiling under\n * the viewport, which is also what MUI's own bottom paper asks for.\n *\n * `full` is absent on purpose: it is not a ceiling, it is the whole viewport,\n * and `sizeStyles` answers it before it gets here.\n */\nconst VERTICAL_SIZES: Record<Exclude<Size, 'full'>, string> = {\n xs: 'min(200px, 100%)',\n sm: 'min(300px, 100%)',\n md: 'min(400px, 100%)',\n lg: 'min(500px, 100%)',\n xl: 'min(600px, 100%)',\n};\n\n/**\n * How wide a top/bottom sheet is allowed to get — its CROSS axis, so it is one\n * rule rather than one per `size` preset.\n *\n * A bottom sheet spanning the full width is a phone layout, and it was the only\n * layout this component had: on a desktop a panel holding a sentence and one\n * button was drawn 1900px wide, with the content stranded in the middle of it.\n * 640px is Material's own ceiling for a bottom sheet above the handset\n * breakpoint, and below it `100%` gives the phone back exactly what it had.\n *\n * `fullHeight` is the documented opt-out — it expands a vertical sheet along\n * this axis — and it becomes meaningful here for the first time: it used to\n * name the behaviour every bottom sheet already had.\n */\nconst VERTICAL_MAX_WIDTH = 'min(100%, 640px)';\n\ninterface SizeStyleInput {\n position: Position;\n size: Size;\n isDraggableVariant: boolean;\n currentHeight: number | null;\n}\n\nconst sizeStyles = ({\n position,\n size,\n isDraggableVariant,\n currentHeight,\n}: SizeStyleInput) => {\n if (isHorizontalPosition(position)) {\n return { width: HORIZONTAL_SIZES[size] ?? HORIZONTAL_SIZES.md };\n }\n\n // `full` is not a size on the scale — it is THE WHOLE VIEWPORT, on both axes,\n // and it has to stay that: a consumer using it for a phone takeover would\n // otherwise get a content-hugging 640px card out of a catalog bump, with\n // nothing in the API left to ask for what they had. So it is answered before\n // either rule below touches it.\n if (size === 'full') return { width: '100%', height: '100%' };\n\n // The cross axis is the same rule whatever the preset, and the draggable\n // variant needs it too — dragging moves the panel's height, never its width.\n // `marginInline` is what centres it: MUI pins the bottom paper `left: 0;\n // right: 0`, so a definite width plus auto margins resolves to the middle.\n const cross = { width: VERTICAL_MAX_WIDTH, marginInline: 'auto' };\n\n // The draggable variant owns its own height: the snap point decides it, so a\n // preset would fight the drag.\n if (isDraggableVariant && currentHeight !== null) {\n return { ...cross, height: currentHeight };\n }\n\n return {\n ...cross,\n // A CEILING, not a height — see `VERTICAL_SIZES`. `height: auto` is stated\n // rather than left off so the rule survives a caller who set a height on a\n // previous render, and it is what lets the panel hug what it holds.\n height: 'auto',\n maxHeight: VERTICAL_SIZES[size] ?? VERTICAL_SIZES.md,\n };\n};\n\n/** `r, g, b` for a hex colour, so it can feed an `rgba(var(--x), a)` custom property. */\nconst toRgbTriplet = (hexColor: string) => {\n const hex = hexColor.replace('#', '');\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n return `${r}, ${g}, ${b}`;\n};\n\nconst roundedStyles = (theme: Theme, position: Position) => {\n const radius = theme.spacing(2);\n const byPosition: Record<Position, string> = {\n top: `0 0 ${radius} ${radius}`,\n bottom: `${radius} ${radius} 0 0`,\n left: `0 ${radius} ${radius} 0`,\n right: `${radius} 0 0 ${radius}`,\n };\n return { borderRadius: byPosition[position] };\n};\n\ninterface VariantStyleInput {\n theme: Theme;\n variant: Variant;\n color: Color;\n position: Position;\n elevation: number;\n glow: boolean;\n pulse: boolean;\n glass: boolean;\n gradient: boolean;\n rounded: boolean;\n disabled: boolean;\n isDragging: boolean;\n isAnimating: boolean;\n isDraggableVariant: boolean;\n isVerticalSheet: boolean;\n}\n\ntype SurfaceInput = VariantStyleInput & { accent: string };\n\n/**\n * Each variant's own additions to the shared surface — never the shared part\n * itself. Every arm of the old switch re-spread the same base, glow, pulse and\n * rounded objects before adding these few rules; `variantStyles` applies that\n * prefix once and lets the table hold only what actually differs.\n */\nconst SURFACES: Record<Variant, (input: SurfaceInput) => Record<string, unknown>> = {\n draggable: ({ theme, elevation, accent }) => ({\n boxShadow: `\n ${theme.shadows[Math.min(elevation + 4, 24)]},\n 0 -2px 10px 0 ${shadowInk(theme, 0.1)}\n `,\n border: `1px solid ${alpha(theme.palette.divider, 0.12)}`,\n borderTop: `2px solid ${alpha(accent, 0.3)}`,\n transition: theme.transitions.create(['transform', 'box-shadow', 'border-color'], {\n duration: theme.transitions.duration.shorter,\n easing: theme.transitions.easing.easeInOut,\n }),\n '&:hover': { borderTopColor: alpha(accent, 0.5) },\n }),\n\n glass: ({ theme, glass }) => ({\n backgroundColor: alpha(theme.palette.background.paper, glass ? 0.75 : 0.95),\n backdropFilter: 'blur(24px) saturate(180%)',\n WebkitBackdropFilter: 'blur(24px) saturate(180%)',\n border: `1px solid ${alpha(theme.palette.divider, 0.15)}`,\n boxShadow: `\n 0 8px 32px 0 ${shadowInk(theme, 0.15)},\n inset 0 0 0 1px ${sheen(theme, 0.1)}\n `,\n }),\n\n gradient: ({ theme, color, gradient, accent }) => ({\n background: gradient\n ? `linear-gradient(\n 135deg,\n ${theme.palette.background.paper} 0%,\n ${alpha(accent, 0.08)} 50%,\n ${alpha(accentFor(theme, color)?.dark || accent, 0.12)} 100%\n )`\n : theme.palette.background.paper,\n position: 'relative' as const,\n overflow: 'hidden' as const,\n '&::before': gradient ? shimmerOverlay(theme) : {},\n }),\n\n elevated: ({ theme, elevation }) => ({\n boxShadow: `\n ${theme.shadows[elevation]},\n 0 20px 40px -15px ${shadowInk(theme, 0.15)}\n `,\n transform: 'translateZ(0)',\n willChange: 'transform',\n }),\n\n minimal: () => ({ boxShadow: 'none', border: 'none' }),\n\n default: () => ({}),\n};\n\n/** The sweep of light the gradient variant runs across itself. */\nconst shimmerOverlay = (theme: Theme) => ({\n content: '\"\"',\n position: 'absolute',\n top: 0,\n left: '-100%',\n width: '100%',\n height: '100%',\n background: `linear-gradient(\n 90deg,\n transparent,\n ${sheen(theme, 0.2)},\n transparent\n )`,\n animation: `${shimmerAnimation} 3s infinite`,\n});\n\n/**\n * The parts of the surface that do not depend on the variant: the paper colour,\n * the transition suppression while a drag or spring is driving the panel, the\n * disabled and cursor states, and the two colour custom properties the glow and\n * pulse keyframes read.\n */\nconst baseSurface = (input: VariantStyleInput, accent: string) => {\n const { theme, disabled, isDragging, isAnimating, isDraggableVariant, isVerticalSheet } = input;\n const colorRgb = toRgbTriplet(accent);\n\n return {\n backgroundColor: theme.palette.background.paper,\n // A transition would fight the per-frame height writes while a drag or a\n // snap animation is driving the panel.\n transition:\n !isDragging && !isAnimating\n ? theme.transitions.create(['all'], {\n duration: theme.transitions.duration.standard,\n easing: theme.transitions.easing.easeInOut,\n })\n : 'none',\n opacity: disabled ? 0.5 : 1,\n pointerEvents: disabled ? ('none' as const) : ('auto' as const),\n cursor: isDraggableVariant && isVerticalSheet ? 'grab' : 'auto',\n '--pulse-color': colorRgb,\n '--glow-color': colorRgb,\n ...(isDragging && { cursor: 'grabbing' }),\n };\n};\n\nconst variantStyles = (input: VariantStyleInput) => {\n const { theme, variant, color, position, glow, pulse, rounded } = input;\n const accent = accentFor(theme, color)?.main || theme.palette.primary.main;\n\n return {\n ...baseSurface(input, accent),\n // glow first, then pulse: with both set the pulse keyframes win the shared\n // `animation` slot, which is the order the original spread produced.\n ...(glow && { animation: `${glowAnimation} 2s ease-in-out infinite`, filter: 'brightness(1.05)' }),\n ...(pulse && { animation: `${pulseAnimation} 2s infinite`, position: 'relative' as const }),\n ...(rounded && roundedStyles(theme, position)),\n ...(SURFACES[variant] ?? SURFACES.default)({ ...input, accent }),\n };\n};\n\ninterface PanelSxInput extends VariantStyleInput {\n size: Size;\n currentHeight: number | null;\n fullHeight: boolean;\n style?: React.CSSProperties;\n}\n\n/**\n * The drawer paper's complete `sx`: its size, its variant surface, the caller's\n * own `style`, and the full-height rule.\n *\n * Built here rather than in the component so the component holds no style\n * branches of its own — the cross-axis rule below is four on its own.\n */\nexport const panelSx = (input: PanelSxInput): CSSObject => {\n const { position, size, isDraggableVariant, isVerticalSheet, currentHeight, fullHeight, style } =\n input;\n\n return {\n // The DEFAULT, so the glow and the elevated shadow are not clipped by the\n // panel they hang off. It used to be stated last, which made it a rule\n // nothing could override — including `gradient`, whose own `overflow:\n // hidden` is what keeps its shimmer inside the panel. That was invisible\n // while every vertical sheet was full-bleed, because the sweep starts at\n // `left: -100%` and a full-width panel put it off-screen; a 640px one puts\n // it on the backdrop beside the sheet.\n overflow: 'visible',\n ...sizeStyles({ position, size, isDraggableVariant, currentHeight }),\n // A COLUMN, so `maxHeight` above can be a ceiling rather than a height: the\n // body is then a flex item that shrinks against it, and the scrolling falls\n // to `SheetContent` where it belongs. Without this the panel would clip a\n // long sheet instead of scrolling it.\n ...(isVerticalSheet ? { display: 'flex', flexDirection: 'column' } : {}),\n ...variantStyles(input),\n ...style,\n // Expand only the cross axis so the chosen `size` still governs the main\n // axis: side sheets keep their (responsive) width and go full-height;\n // top/bottom sheets keep their height and go full-width.\n ...(fullHeight &&\n !isDraggableVariant &&\n (isHorizontalPosition(position) ? { height: '100%' } : { width: '100%' })),\n };\n};\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/Banner/Banner.styles.ts"],"sourcesContent":["import { alpha, keyframes } from '@mui/material/styles/index.js';\nimport type { CSSObject, PaletteColor, Theme } from '@mui/material/styles/index.js';\n\nimport type { BannerVariant } from './Banner.types';\nimport { ACTIVE, HOVER } from '../Alert/Alert.metrics';\nimport { modeInk } from '../../../tokens/ink';\nimport { rem } from '../../../tokens/relative';\n\n// Animations\nexport const fadeInSlide = keyframes`\n from {\n opacity: 0;\n transform: translateY(-10px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n`;\n\nconst pulseAnimation = keyframes`\n 0% {\n box-shadow: 0 0 0 0 currentColor;\n opacity: 0.7;\n }\n 70% {\n box-shadow: 0 0 0 8px currentColor;\n opacity: 0;\n }\n 100% {\n box-shadow: 0 0 0 0 currentColor;\n opacity: 0;\n }\n`;\n\nexport const getVariantColor = (theme: Theme, variant: BannerVariant) => {\n const colorMap = {\n info: theme.palette.info,\n success: theme.palette.success,\n warning: theme.palette.warning,\n critical: theme.palette.error,\n };\n return colorMap[variant];\n};\n\nexport const bannerPartStyles = (theme: Theme, colorPalette: PaletteColor): CSSObject => ({\n // Icon container\n '.banner-icon': {\n flexShrink: 0,\n marginTop: theme.spacing(0.25),\n color: colorPalette.main,\n fontSize: rem(theme, 20),\n display: 'flex',\n alignItems: 'center',\n position: 'relative',\n\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n inset: -4,\n borderRadius: '50%',\n background: alpha(colorPalette.main, 0.1),\n animation: `${pulseAnimation} 3s infinite`,\n },\n },\n\n // Content area\n '.banner-content': {\n flex: 1,\n minWidth: 0, // Prevents flex item overflow\n },\n\n // Title styles\n '.banner-title': {\n fontWeight: 600,\n fontSize: rem(theme, 16),\n lineHeight: 1.4,\n marginBottom: theme.spacing(0.5),\n color: colorPalette.dark || colorPalette.main,\n },\n\n // Description styles \n '.banner-description': {\n fontSize: rem(theme, 14),\n lineHeight: 1.5,\n opacity: 0.9,\n color: 'inherit',\n },\n\n // Actions area\n '.banner-actions': {\n display: 'flex',\n flexShrink: 0,\n gap: theme.spacing(1),\n alignItems: 'center',\n marginTop: theme.spacing(1),\n\n [theme.breakpoints.up('sm')]: {\n marginTop: 0,\n marginLeft: theme.spacing(2),\n },\n },\n\n // Dismiss button\n '.banner-dismiss': {\n color: 'inherit',\n opacity: 0.7,\n marginLeft: theme.spacing(1),\n flexShrink: 0,\n\n // Opacity and a wash only: the dismiss used to spin 90deg, which drew the\n // eye to the way out rather than to the message. Same fix as `Alert`'s\n // close button, which is the sibling surface (FUT-1458).\n '&:hover': {\n opacity: 1,\n backgroundColor: alpha(colorPalette.main, 0.1),\n },\n\n '&:focus-visible': {\n opacity: 1,\n outline: `2px solid ${colorPalette.main}`,\n outlineOffset: '2px',\n },\n },\n});\n\n/**\n * The pointer states, from `Alert`'s own table.\n *\n * Banner had NO hover at all — measured ΔE76 0.00 on every variant in both\n * modes — so moving between the two surfaces gave feedback on one and silence\n * on the other. They are the same kind of thing and now answer a pointer the\n * same way.\n *\n * Neither block may declare `transition`: `:active` under a mouse always\n * implies `:hover`, so a shorthand here would outrank the root's and reset the\n * opacity fade the press is built on.\n */\n/** The same flat inset tint `Alert` paints; see `ACTIVE` for why it is a layer. */\nconst tint = (theme: Theme, a: number): string =>\n `inset 0 0 0 100vmax ${alpha(modeInk(theme), a)}`;\n\nexport const bannerPointerStates = (theme: Theme): CSSObject => ({\n '&:hover': {\n boxShadow: tint(theme, HOVER.tintAlpha),\n },\n\n // The `:not(:has(…))` names CONTROLS, not any descendant: `:active` matches\n // an ancestor of whatever is pressed, so without it pressing the dismiss or\n // an action dimmed the message that owns it. Excluding `:has(:active)`\n // wholesale does not work — pressing the TEXT makes that text `:active` too,\n // so the guard matched on every press and the state never fired.\n '&:active:not(:has(button:active, a:active, [role=\"button\"]:active))': {\n boxShadow: tint(theme, ACTIVE.tintAlpha),\n transition: 'none',\n },\n});\n\n/** The seconds the tint takes easing back, shared with `Alert`. */\nexport const BANNER_TINT_S = ACTIVE.ms / 1000;\n"],"mappings":";;;;;;;;;;;;AAAA,SAAS,OAAO,iBAAiB;AAS1B,IAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAW3B,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAehB,IAAM,kBAAkB,CAAC,OAAc,YAA2B;AACvE,QAAM,WAAW;AAAA,IACf,MAAM,MAAM,QAAQ;AAAA,IACpB,SAAS,MAAM,QAAQ;AAAA,IACvB,SAAS,MAAM,QAAQ;AAAA,IACvB,UAAU,MAAM,QAAQ;AAAA,EAC1B;AACA,SAAO,SAAS,OAAO;AACzB;AAEO,IAAM,mBAAmB,CAAC,OAAc,kBAA2C;AAAA;AAAA,EAExF,gBAAgB;AAAA,IACd,YAAY;AAAA,IACZ,WAAW,MAAM,QAAQ,IAAI;AAAA,IAC7B,OAAO,aAAa;AAAA,IACpB,UAAU,IAAI,OAAO,EAAE;AAAA,IACvB,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,UAAU;AAAA,IAEV,aAAa;AAAA,MACX,SAAS;AAAA,MACT,UAAU;AAAA,MACV,OAAO;AAAA,MACP,cAAc;AAAA,MACd,YAAY,MAAM,aAAa,MAAM,GAAG;AAAA,MACxC,WAAW,GAAG,cAAc;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA,EAGA,mBAAmB;AAAA,IACjB,MAAM;AAAA,IACN,UAAU;AAAA;AAAA,EACZ;AAAA;AAAA,EAGA,iBAAiB;AAAA,IACf,YAAY;AAAA,IACZ,UAAU,IAAI,OAAO,EAAE;AAAA,IACvB,YAAY;AAAA,IACZ,cAAc,MAAM,QAAQ,GAAG;AAAA,IAC/B,OAAO,aAAa,QAAQ,aAAa;AAAA,EAC3C;AAAA;AAAA,EAGA,uBAAuB;AAAA,IACrB,UAAU,IAAI,OAAO,EAAE;AAAA,IACvB,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,OAAO;AAAA,EACT;AAAA;AAAA,EAGA,mBAAmB;AAAA,IACjB,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,KAAK,MAAM,QAAQ,CAAC;AAAA,IACpB,YAAY;AAAA,IACZ,WAAW,MAAM,QAAQ,CAAC;AAAA,IAE1B,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG;AAAA,MAC5B,WAAW;AAAA,MACX,YAAY,MAAM,QAAQ,CAAC;AAAA,IAC7B;AAAA,EACF;AAAA;AAAA,EAGA,mBAAmB;AAAA,IACjB,OAAO;AAAA,IACP,SAAS;AAAA,IACT,YAAY,MAAM,QAAQ,CAAC;AAAA,IAC3B,YAAY;AAAA;AAAA;AAAA;AAAA,IAKZ,WAAW;AAAA,MACT,SAAS;AAAA,MACT,iBAAiB,MAAM,aAAa,MAAM,GAAG;AAAA,IAC/C;AAAA,IAEA,mBAAmB;AAAA,MACjB,SAAS;AAAA,MACT,SAAS,aAAa,aAAa,IAAI;AAAA,MACvC,eAAe;AAAA,IACjB;AAAA,EACF;AACF;AAeA,IAAM,OAAO,CAAC,OAAc,MAC1B,uBAAuB,MAAM,QAAQ,KAAK,GAAG,CAAC,CAAC;AAE1C,IAAM,sBAAsB,CAAC,WAA6B;AAAA,EAC/D,WAAW;AAAA,IACT,WAAW,KAAK,OAAO,MAAM,SAAS;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,uEAAuE;AAAA,IACrE,WAAW,KAAK,OAAO,OAAO,SAAS;AAAA,IACvC,YAAY;AAAA,EACd;AACF;AAGO,IAAM,gBAAgB,OAAO,KAAK;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/Badge/Badge.animations.ts"],"sourcesContent":["import { keyframes } from '@mui/material/styles/index.js';\n\nimport { BOUNCE, FADE_IN_SCALE, GLOW_PULSE, PULSE } from './Badge.metrics';\n\nexport const pulseAnimation = keyframes`\n 0% {\n transform: scale(1);\n opacity: 1;\n }\n 70% {\n transform: scale(${PULSE.scale});\n opacity: ${PULSE.opacity};\n }\n 100% {\n transform: scale(1);\n opacity: 1;\n }\n`;\n\n// Define bounce animation\nexport const bounceAnimation = keyframes`\n 0%, 20%, 50%, 80%, 100% {\n transform: translateY(0) scale(1);\n }\n 40% {\n transform: translateY(-${BOUNCE.lift}px) scale(${BOUNCE.scale});\n }\n 60% {\n transform: translateY(-${BOUNCE.secondLift}px) scale(${BOUNCE.secondScale});\n }\n`;\n\n// Define shimmer animation\nexport const shimmerAnimation = keyframes`\n 0% {\n background-position: -1000px 0;\n }\n 100% {\n background-position: 1000px 0;\n }\n`;\n\n// Define fade in animation with scale\nexport const fadeInScaleAnimation = keyframes`\n 0% {\n opacity: 0;\n transform: scale(${FADE_IN_SCALE.from});\n }\n 50% {\n transform: scale(${FADE_IN_SCALE.overshoot});\n }\n 100% {\n opacity: 1;\n transform: scale(1);\n }\n`;\n\n// Define glow pulse animation\nexport const glowPulseAnimation = keyframes`\n 0% {\n box-shadow: 0 0 ${GLOW_PULSE.fromBlur}px ${GLOW_PULSE.fromSpread}px rgba(var(--glow-color), ${GLOW_PULSE.fromAlpha});\n }\n 50% {\n box-shadow: 0 0 ${GLOW_PULSE.toBlur}px ${GLOW_PULSE.toSpread}px rgba(var(--glow-color), ${GLOW_PULSE.toAlpha});\n }\n 100% {\n box-shadow: 0 0 ${GLOW_PULSE.fromBlur}px ${GLOW_PULSE.fromSpread}px rgba(var(--glow-color), ${GLOW_PULSE.fromAlpha});\n }\n`;\n"],"mappings":";;;;;;;;AAAA,SAAS,iBAAiB;AAInB,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAMP,MAAM,KAAK;AAAA,eACnB,MAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASrB,IAAM,kBAAkB;AAAA;AAAA;AAAA;AAAA;AAAA,6BAKF,OAAO,IAAI,aAAa,OAAO,KAAK;AAAA;AAAA;AAAA,6BAGpC,OAAO,UAAU,aAAa,OAAO,WAAW;AAAA;AAAA;AAKtE,IAAM,mBAAmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUzB,IAAM,uBAAuB;AAAA;AAAA;AAAA,uBAGb,cAAc,IAAI;AAAA;AAAA;AAAA,uBAGlB,cAAc,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASvC,IAAM,qBAAqB;AAAA;AAAA,sBAEZ,WAAW,QAAQ,MAAM,WAAW,UAAU,8BAA8B,WAAW,SAAS;AAAA;AAAA;AAAA,sBAGhG,WAAW,MAAM,MAAM,WAAW,QAAQ,8BAA8B,WAAW,OAAO;AAAA;AAAA;AAAA,sBAG1F,WAAW,QAAQ,MAAM,WAAW,UAAU,8BAA8B,WAAW,SAAS;AAAA;AAAA;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/Popover/Popover.tsx"],"sourcesContent":["import type { PaperProps } from '@mui/material/Paper/index.js';\nimport Paper from '@mui/material/Paper/index.js';\nimport MuiPopover from '@mui/material/Popover/index.js';\nimport { alpha, keyframes, styled } from '@mui/material/styles/index.js';\nimport React from 'react';\n\nimport type { PopoverProps } from './Popover.types';\nimport { shadowInk } from '../../../tokens/ink';\n\n// Define pulse animation\nconst pulseAnimation = keyframes`\n 0% {\n box-shadow: 0 0 0 0 currentColor;\n opacity: 1;\n }\n 70% {\n box-shadow: 0 0 0 10px currentColor;\n opacity: 0;\n }\n 100% {\n box-shadow: 0 0 0 0 currentColor;\n opacity: 0;\n }\n`;\n\nconst StyledPaper = styled(Paper, {\n shouldForwardProp: (prop) => \n !['customVariant', 'glow', 'pulse'].includes(prop as string),\n})<{ \n customVariant?: string; \n glow?: boolean; \n pulse?: boolean; \n}>(({ theme, customVariant, glow, pulse }) => ({\n borderRadius: theme.spacing(1.5),\n transition: 'all 0.3s ease',\n position: 'relative',\n overflow: 'hidden',\n\n // Variant styles\n ...(customVariant === 'default' && {\n backgroundColor: theme.palette.background.paper,\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n boxShadow: theme.shadows[8],\n }),\n\n ...(customVariant === 'glass' && {\n backgroundColor: alpha(theme.palette.background.paper, 0.1),\n backdropFilter: 'blur(20px)',\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n boxShadow: `0 8px 32px ${shadowInk(theme, 0.1)}`,\n }),\n\n ...(customVariant === 'arrow' && {\n backgroundColor: theme.palette.background.paper,\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n boxShadow: theme.shadows[12],\n }),\n\n // Glow effect\n ...(glow && !pulse && {\n boxShadow: `0 0 20px 5px ${alpha(theme.palette.primary.main, 0.3)} !important`,\n filter: 'brightness(1.05)',\n }),\n\n // Pulse animation\n ...(pulse && !glow && {\n position: 'relative',\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderRadius: 'inherit',\n backgroundColor: theme.palette.primary.main,\n opacity: 0.1,\n animation: `${pulseAnimation} 2s infinite`,\n pointerEvents: 'none',\n zIndex: -1,\n },\n }),\n\n // Both glow and pulse\n ...(glow && pulse && {\n position: 'relative',\n boxShadow: `0 0 20px 5px ${alpha(theme.palette.primary.main, 0.3)} !important`,\n filter: 'brightness(1.05)',\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n borderRadius: 'inherit',\n backgroundColor: theme.palette.primary.main,\n opacity: 0.1,\n animation: `${pulseAnimation} 2s infinite`,\n pointerEvents: 'none',\n zIndex: -1,\n },\n }),\n}));\n\nexport const Popover = React.forwardRef<HTMLDivElement, PopoverProps>(\n ({\n variant = 'default',\n glow = false,\n pulse = false,\n maxWidth = 400,\n dataTestId,\n children,\n ...props\n }, ref) => (\n <MuiPopover\n ref={ref}\n data-testid={dataTestId || 'popover-content'}\n PaperProps={{\n component: StyledPaper as React.ComponentType<PaperProps>,\n customVariant: variant,\n glow,\n pulse,\n sx: { maxWidth },\n ...props.PaperProps,\n } as PaperProps & { customVariant?: string; glow?: boolean; pulse?: boolean }}\n {...props}\n >\n {children}\n </MuiPopover>\n )\n);\n\nPopover.displayName = 'Popover';"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/Carousel/Carousel.styles.ts"],"sourcesContent":["import { alpha } from '@mui/material/styles/index.js';\nimport type { CSSObject, Theme } from '@mui/material/styles/index.js';\n\nimport type { CarouselProps } from './Carousel.types';\nimport { accentFor, sxRem } from '../../../tokens/scales';\n\ntype Variant = NonNullable<CarouselProps['variant']>;\ntype Size = NonNullable<CarouselProps['size']>;\ntype Color = NonNullable<CarouselProps['color']>;\n\nconst SIZES: Record<Size, { height: number; fontSize: (theme: Theme) => string }> = {\n xs: { height: 200, fontSize: sxRem(12) },\n sm: { height: 300, fontSize: sxRem(14) },\n md: { height: 400, fontSize: sxRem(16) },\n lg: { height: 500, fontSize: sxRem(18) },\n xl: { height: 600, fontSize: sxRem(20) },\n};\n\nconst sizeStyles = (size: Size) => SIZES[size] ?? SIZES.md;\n\ninterface ContainerStyleInput {\n theme: Theme;\n variant: Variant;\n size: Size;\n color: Color;\n height: number | string;\n width: number | string;\n glow: boolean;\n pulse: boolean;\n glass: boolean;\n gradient: boolean;\n}\n\n/**\n * Each variant's own additions to the shared frame. The old switch re-spread the\n * same base, glow and pulse objects in all six arms before adding these; only\n * these differ, so the shared prefix is applied once by `containerStyles`.\n */\nconst SURFACES: Record<Variant, (input: ContainerStyleInput) => CSSObject> = {\n glass: ({ theme, color, glass }) => ({\n backgroundColor: alpha(theme.palette.background.paper, glass ? 0.1 : 0.9),\n backdropFilter: 'blur(20px)',\n border: `1px solid ${alpha(accentFor(theme, color).main, 0.2)}`,\n }),\n\n gradient: ({ theme, color, gradient }) => ({\n background: gradient\n ? `linear-gradient(135deg, ${alpha(accentFor(theme, color).light, 0.1)}, ${alpha(accentFor(theme, color).dark, 0.1)})`\n : 'transparent',\n }),\n\n elevated: ({ theme }) => ({ boxShadow: theme.shadows[8] }),\n\n minimal: () => ({ border: 'none', boxShadow: 'none' }),\n\n cards: ({ theme }) => ({ padding: theme.spacing(2) }),\n\n default: () => ({}),\n};\n\nexport const containerStyles = (input: ContainerStyleInput): CSSObject => {\n const { theme, variant, size, color, height, width, glow, pulse } = input;\n const accent = accentFor(theme, color).main;\n\n return {\n position: 'relative' as const,\n width,\n // A numeric height is taken literally; anything else falls back to the size\n // preset, since a percentage cannot resolve against an unsized parent here.\n height: typeof height === 'number' ? height : sizeStyles(size).height,\n overflow: 'hidden',\n borderRadius: theme.spacing(1),\n transition: theme.transitions.create(['all'], {\n duration: theme.transitions.duration.standard,\n }),\n ...(glow && { boxShadow: `0 0 30px ${alpha(accent, 0.4)}` }),\n ...(pulse && {\n animation: 'pulse 2s infinite',\n '@keyframes pulse': {\n '0%': { boxShadow: `0 0 0 0 ${alpha(accent, 0.4)}` },\n '70%': { boxShadow: `0 0 0 20px ${alpha(accent, 0)}` },\n '100%': { boxShadow: `0 0 0 0 ${alpha(accent, 0)}` },\n },\n }),\n ...(SURFACES[variant] ?? SURFACES.default)(input),\n };\n};\n"],"mappings":";;;;;;;;AAAA,SAAS,aAAa;AAUtB,IAAM,QAA8E;AAAA,EAClF,IAAI,EAAE,QAAQ,KAAK,UAAU,MAAM,EAAE,EAAE;AAAA,EACvC,IAAI,EAAE,QAAQ,KAAK,UAAU,MAAM,EAAE,EAAE;AAAA,EACvC,IAAI,EAAE,QAAQ,KAAK,UAAU,MAAM,EAAE,EAAE;AAAA,EACvC,IAAI,EAAE,QAAQ,KAAK,UAAU,MAAM,EAAE,EAAE;AAAA,EACvC,IAAI,EAAE,QAAQ,KAAK,UAAU,MAAM,EAAE,EAAE;AACzC;AAEA,IAAM,aAAa,CAAC,SAAe,MAAM,IAAI,KAAK,MAAM;AAoBxD,IAAM,WAAuE;AAAA,EAC3E,OAAO,CAAC,EAAE,OAAO,OAAO,MAAM,OAAO;AAAA,IACnC,iBAAiB,MAAM,MAAM,QAAQ,WAAW,OAAO,QAAQ,MAAM,GAAG;AAAA,IACxE,gBAAgB;AAAA,IAChB,QAAQ,aAAa,MAAM,UAAU,OAAO,KAAK,EAAE,MAAM,GAAG,CAAC;AAAA,EAC/D;AAAA,EAEA,UAAU,CAAC,EAAE,OAAO,OAAO,SAAS,OAAO;AAAA,IACzC,YAAY,WACR,2BAA2B,MAAM,UAAU,OAAO,KAAK,EAAE,OAAO,GAAG,CAAC,KAAK,MAAM,UAAU,OAAO,KAAK,EAAE,MAAM,GAAG,CAAC,MACjH;AAAA,EACN;AAAA,EAEA,UAAU,CAAC,EAAE,MAAM,OAAO,EAAE,WAAW,MAAM,QAAQ,CAAC,EAAE;AAAA,EAExD,SAAS,OAAO,EAAE,QAAQ,QAAQ,WAAW,OAAO;AAAA,EAEpD,OAAO,CAAC,EAAE,MAAM,OAAO,EAAE,SAAS,MAAM,QAAQ,CAAC,EAAE;AAAA,EAEnD,SAAS,OAAO,CAAC;AACnB;AAEO,IAAM,kBAAkB,CAAC,UAA0C;AACxE,QAAM,EAAE,OAAO,SAAS,MAAM,OAAO,QAAQ,OAAO,MAAM,MAAM,IAAI;AACpE,QAAM,SAAS,UAAU,OAAO,KAAK,EAAE;AAEvC,SAAO;AAAA,IACL,UAAU;AAAA,IACV;AAAA;AAAA;AAAA,IAGA,QAAQ,OAAO,WAAW,WAAW,SAAS,WAAW,IAAI,EAAE;AAAA,IAC/D,UAAU;AAAA,IACV,cAAc,MAAM,QAAQ,CAAC;AAAA,IAC7B,YAAY,MAAM,YAAY,OAAO,CAAC,KAAK,GAAG;AAAA,MAC5C,UAAU,MAAM,YAAY,SAAS;AAAA,IACvC,CAAC;AAAA,IACD,GAAI,QAAQ,EAAE,WAAW,YAAY,MAAM,QAAQ,GAAG,CAAC,GAAG;AAAA,IAC1D,GAAI,SAAS;AAAA,MACX,WAAW;AAAA,MACX,oBAAoB;AAAA,QAClB,MAAM,EAAE,WAAW,WAAW,MAAM,QAAQ,GAAG,CAAC,GAAG;AAAA,QACnD,OAAO,EAAE,WAAW,cAAc,MAAM,QAAQ,CAAC,CAAC,GAAG;AAAA,QACrD,QAAQ,EAAE,WAAW,WAAW,MAAM,QAAQ,CAAC,CAAC,GAAG;AAAA,MACrD;AAAA,IACF;AAAA,IACA,IAAI,SAAS,OAAO,KAAK,SAAS,SAAS,KAAK;AAAA,EAClD;AACF;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/Chart/chart-internals.ts"],"sourcesContent":["import { alpha, type Theme } from '@mui/material/styles/index.js';\nimport type { CSSProperties } from 'react';\n\nimport type { ChartProps, ChartSeries } from './Chart.types';\nimport { uiInk } from '../../../tokens/ink';\nimport { accentFor, sxRem } from '../../../tokens/scales';\n\n/**\n * Non-JSX internals of the prop-driven Chart: size/variant styling, palette\n * resolution and series auto-detection. Split from Chart.tsx to keep every\n * function inside the repo's complexity budget.\n */\n\nexport interface SizeStyles {\n height: number;\n fontSize: string;\n /**\n * Gap between an axis line and its tick labels, px.\n *\n * Recharts' default of 2 is not enough. The bottom VALUE tick is centred on\n * the x-axis line, so its text box reaches ~0.79em BELOW that line, while\n * the category labels begin 2px under the 6px tick mark — the two collide at\n * the axis corner, at every viewport. Each value below is ~0.8em of its own\n * font size, which clears the value label's descender with ~6px to spare.\n */\n tickMargin: number;\n}\n\ntype SizePreset = Omit<SizeStyles, 'fontSize'> & { fontSize: (theme: Theme) => string };\n\nconst SIZE_PRESETS: Record<NonNullable<ChartProps['size']>, SizePreset> = {\n xs: { height: 200, fontSize: sxRem(12), tickMargin: 10 },\n sm: { height: 300, fontSize: sxRem(14), tickMargin: 12 },\n md: { height: 400, fontSize: sxRem(16), tickMargin: 14 },\n lg: { height: 500, fontSize: sxRem(18), tickMargin: 16 },\n xl: { height: 600, fontSize: sxRem(20), tickMargin: 18 },\n};\n\nexport function getSizeStyles(theme: Theme, size: ChartProps['size'], height?: number): SizeStyles {\n const preset = SIZE_PRESETS[size ?? 'md'] ?? SIZE_PRESETS.md;\n return { ...preset, fontSize: preset.fontSize(theme), height: height ?? preset.height };\n}\n\nexport function getDefaultColors(theme: Theme, variant: ChartProps['variant'], colors?: string[]): string[] {\n if (colors) return colors;\n if (variant === 'neon') return [...uiInk(theme).dataVizNeon.series];\n return [\n theme.palette.primary.main,\n theme.palette.secondary.main,\n theme.palette.success.main,\n theme.palette.warning.main,\n theme.palette.error.main,\n theme.palette.info.main,\n ];\n}\n\ntype SxStyles = Record<string, unknown>;\n\ninterface VariantOptions {\n variant: NonNullable<ChartProps['variant']>;\n color: NonNullable<ChartProps['color']>;\n glow: boolean;\n pulse: boolean;\n glass: boolean;\n gradient: boolean;\n disabled: boolean;\n}\n\nfunction effectStyles(theme: Theme, options: VariantOptions): SxStyles {\n const accent = accentFor(theme, options.color).main;\n const glow = options.glow ? { boxShadow: `0 0 30px ${alpha(accent, 0.4)}` } : {};\n const pulse = options.pulse\n ? {\n animation: 'pulse 2s infinite',\n '@keyframes pulse': {\n '0%': { boxShadow: `0 0 0 0 ${alpha(accent, 0.4)}` },\n '70%': { boxShadow: `0 0 0 20px ${alpha(accent, 0)}` },\n '100%': { boxShadow: `0 0 0 0 ${alpha(accent, 0)}` },\n },\n }\n : {};\n return { ...glow, ...pulse };\n}\n\nfunction variantSurface(theme: Theme, options: VariantOptions): SxStyles {\n switch (options.variant) {\n case 'glass':\n return {\n backgroundColor: alpha(theme.palette.background.paper, options.glass ? 0.1 : 0.9),\n backdropFilter: 'blur(20px)',\n border: `1px solid ${alpha(theme.palette.divider, 0.1)}`,\n };\n case 'gradient':\n return {\n background: options.gradient\n ? `linear-gradient(135deg, ${alpha(accentFor(theme, options.color).light, 0.05)}, ${alpha(accentFor(theme, options.color).dark, 0.05)})`\n : theme.palette.background.paper,\n };\n case 'elevated':\n return { boxShadow: theme.shadows[4] };\n case 'minimal':\n return { border: 'none', backgroundColor: 'transparent' };\n case 'neon': {\n const neon = uiInk(theme).dataVizNeon;\n return {\n backgroundColor: neon.ground,\n border: `1px solid ${alpha(neon.accent, 0.3)}`,\n '& .recharts-cartesian-grid-horizontal line, & .recharts-cartesian-grid-vertical line': {\n stroke: alpha(neon.accent, 0.1),\n },\n };\n }\n default:\n return { backgroundColor: theme.palette.background.paper };\n }\n}\n\nexport function getVariantStyles(theme: Theme, options: VariantOptions): SxStyles {\n return {\n borderRadius: theme.spacing(1),\n transition: theme.transitions.create(['all'], {\n duration: theme.transitions.duration.standard,\n }),\n opacity: options.disabled ? 0.5 : 1,\n pointerEvents: options.disabled ? ('none' as const) : ('auto' as const),\n ...effectStyles(theme, options),\n ...variantSurface(theme, options),\n };\n}\n\n/** Explicit series, or one series per non-axis key found in the first row. */\nexport function resolveSeries(\n data: ChartProps['data'],\n series: ChartSeries[] | undefined,\n xAxisKey: string,\n palette: string[],\n): ChartSeries[] {\n if (series) return series;\n if (data.length === 0) return [];\n return Object.keys(data[0] ?? {})\n .filter((key) => key !== xAxisKey)\n .map((key, index) => ({\n dataKey: key,\n name: key,\n color: palette[index % palette.length],\n }));\n}\n\ninterface AxisTextStyles {\n axisStyle: CSSProperties;\n gridStroke: string;\n /**\n * Multiplier applied to `gridStroke`'s own alpha. Gridlines must read one\n * step BELOW the card border — the border is `divider`, so half of it —\n * without being dashed at data weight. Expressing the step as an opacity\n * rather than a second colour keeps it derived from the theme's divider\n * whatever form that takes (rgba, hex, or a CSS variable, which the colour\n * helpers cannot decompose).\n */\n gridOpacity: number;\n}\n\nexport function getAxisStyles(theme: Theme, variant: ChartProps['variant'], fontSize: string): AxisTextStyles {\n const neon = variant === 'neon';\n const neonAccent = uiInk(theme).dataVizNeon.accent;\n return {\n axisStyle: {\n fontSize,\n fill: neon ? neonAccent : theme.palette.text.secondary,\n // Ticks are columns of digits: they have to line up between rows.\n fontVariantNumeric: 'tabular-nums',\n },\n gridStroke: neon ? alpha(neonAccent, 0.1) : theme.palette.divider,\n // The neon grid is already a 10%-alpha cyan; halving it again would erase it.\n gridOpacity: neon ? 1 : 0.5,\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/FleetMap/FleetRoster.tsx"],"sourcesContent":["import Box from '@mui/material/Box/index.js';\nimport Stack from '@mui/material/Stack/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport { useTheme, type SxProps, type Theme } from '@mui/material/styles/index.js';\nimport React from 'react';\n\nimport { Skeleton } from '../../layout/Skeleton/Skeleton';\n\nimport { freshnessOf } from './FleetMap.helpers';\nimport { FLEET_DOT, FLEET_ROSTER, FLEET_ROW, FLEET_SKELETON } from './FleetMap.metrics';\nimport type { FleetFreshness, FleetMapCopy, FleetUnit } from './FleetMap.types';\n\n/**\n * The roster beside the map — and the ACCESSIBLE half of this component.\n *\n * A map is a picture of positions and a screen reader cannot read a picture, so\n * the panel's information is carried by this list. That is not a consolation\n * prize: the list answers the questions a dispatcher actually asks — who is\n * reporting, how recently, and what are they carrying — and it answers them in\n * an order the map cannot express.\n *\n * The map beside it is a NAMED LANDMARK rather than an `aria-hidden` one, so a\n * reader can skip it in one gesture — see `FleetCanvas`, which carries the\n * reason it must not be hidden.\n */\n\n/** Each freshness draws from the semantic palette, never a hardcoded hex. */\nfunction freshnessColor(freshness: FleetFreshness, theme: Theme): string {\n if (freshness === 'live') return theme.palette.success.main;\n if (freshness === 'lagging') return theme.palette.warning.main;\n return theme.palette.text.disabled;\n}\n\n/**\n * A row's two lines of text — the name, and the one-line summary under it.\n *\n * Split out of `FleetRow` to keep that function under the size gate, and the\n * seam is the natural one: everything here is READ, nothing is interactive.\n */\nfunction RowText({\n unit,\n copy,\n freshness,\n testId,\n}: Pick<RowProps, 'unit' | 'copy' | 'freshness' | 'testId'>): React.JSX.Element {\n const theme = useTheme();\n\n // Dropped rather than rendered empty: a phone that reports no accuracy radius\n // would otherwise print a trailing separator with nothing after it.\n const meta = [\n copy.freshness[freshness],\n copy.lastSeen(unit.staleSeconds),\n unit.accuracyM == null ? null : copy.accuracy(unit.accuracyM),\n ]\n .filter((part): part is string => Boolean(part))\n .join(' · ');\n\n return (\n <Stack sx={{ minWidth: 0, flexGrow: 1 }}>\n <Typography\n variant=\"body2\"\n component=\"p\"\n data-testid={`${testId}-label`}\n sx={{ fontWeight: theme.typography.fontWeightMedium, overflowWrap: 'anywhere' }}\n >\n {unit.label}\n </Typography>\n <Typography\n variant=\"caption\"\n component=\"p\"\n data-testid={`${testId}-meta`}\n sx={{ color: theme.palette.text.secondary }}\n >\n {meta}\n </Typography>\n </Stack>\n );\n}\n\n/**\n * Keep the selected row visible INSIDE the roster.\n *\n * The roster caps its own height, so a dispatcher arrowing through a fleet of\n * thirty otherwise walks the selection below the fold with nothing moving —\n * `aria-activedescendant` follows, and a SIGHTED keyboard user sees no feedback\n * at all.\n *\n * Watches the row's POSITION as well as its selectedness, because the roster\n * re-sorts on every poll: a rider who stays selected while their staleness\n * moves them down the list would otherwise slide out of view with the effect\n * never re-running.\n *\n * Arithmetic rather than `scrollIntoView({ block: 'nearest' })` because that\n * walks every scrollable ancestor, the document included, and `nearest` only\n * spares an ancestor the row is already visible in — which is exactly false\n * when the panel is off screen. Re-running on every re-sort, it would yank the\n * whole page back to the map on a timer, and drag it there on mount for any\n * board rendered below the fold with a selection already set.\n */\nfunction useKeptInView(\n selected: boolean,\n position: number,\n): React.RefObject<HTMLDivElement | null> {\n const row = React.useRef<HTMLDivElement>(null);\n\n React.useEffect(() => {\n const box = row.current;\n const list = box?.parentElement;\n if (!selected || !box || !list) return;\n const top = box.offsetTop - list.offsetTop;\n if (top < list.scrollTop) {\n list.scrollTop = top;\n } else if (top + box.offsetHeight > list.scrollTop + list.clientHeight) {\n list.scrollTop = top + box.offsetHeight - list.clientHeight;\n }\n }, [selected, position]);\n\n return row;\n}\n\n/**\n * A row's own box, selected or not.\n *\n * Out of line because the hover rule needs the explanation more than the JSX\n * has room for: hover must never WEAKEN the selection. Written flat as\n * `'&:hover': { backgroundColor: action.hover }`, the pseudo-class wins on\n * specificity and repaints the selected row with the hover tint — measured at\n * `rgba(0,0,0,0.08)` idle against `rgba(0,0,0,0.04)` hovered, so pointing at\n * the selected row visually DESELECTED it and made it indistinguishable from\n * any other row under the cursor.\n */\nfunction rowSx(theme: Theme, selected: boolean): SxProps<Theme> {\n const resting = selected ? theme.palette.action.selected : 'transparent';\n return {\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(FLEET_ROW.gapUnits),\n padding: theme.spacing(FLEET_ROW.paddingYUnits, FLEET_ROW.paddingXUnits),\n // `1`, not `theme.shape.borderRadius / 4`. MUI's `sx` reads a NUMBER here as\n // a multiple of `theme.shape.borderRadius`, so dividing the theme value out\n // and letting `sx` multiply it back in is quadratic: measured 4px on the\n // default theme — which is why this looked right — and 36px on a host that\n // sets its own radius to 12. In a package whose whole premise is being\n // re-themed, only the multiple is portable.\n borderRadius: FLEET_ROW.radiusMultiple,\n cursor: 'pointer',\n backgroundColor: resting,\n '&:hover': {\n backgroundColor: selected ? theme.palette.action.selected : theme.palette.action.hover,\n },\n };\n}\n\ninterface RowProps {\n unit: FleetUnit;\n copy: FleetMapCopy;\n freshness: FleetFreshness;\n selected: boolean;\n onSelect: (id: string) => void;\n /** The row's DOM id, which `aria-activedescendant` points at. */\n optionId: string;\n /** Where the row sits in the re-sorted roster — see the scroll effect. */\n position: number;\n testId: string;\n}\n\nfunction FleetRow({\n unit,\n copy,\n freshness,\n selected,\n onSelect,\n optionId,\n position,\n testId,\n}: RowProps): React.JSX.Element {\n const theme = useTheme();\n const color = freshnessColor(freshness, theme);\n const row = useKeptInView(selected, position);\n\n return (\n <Box\n ref={row}\n role=\"option\"\n aria-selected={selected}\n id={optionId}\n data-testid={testId}\n data-freshness={freshness}\n onClick={() => onSelect(unit.id)}\n sx={rowSx(theme, selected)}\n >\n {/* The dot repeats what the freshness word beside it already says, so it\n is hidden rather than read twice — and colour is never the only\n carrier of the state. */}\n <Box\n aria-hidden=\"true\"\n data-testid={`${testId}-dot`}\n sx={{\n width: FLEET_DOT.size,\n height: FLEET_DOT.size,\n borderRadius: '50%',\n flexShrink: 0,\n backgroundColor: color,\n }}\n />\n <RowText unit={unit} copy={copy} freshness={freshness} testId={testId} />\n {unit.badge && (\n <Typography\n variant=\"caption\"\n component=\"span\"\n data-testid={`${testId}-badge`}\n sx={{ color: theme.palette.text.secondary, flexShrink: 0 }}\n >\n {unit.badge}\n </Typography>\n )}\n </Box>\n );\n}\n\n/**\n * What stands in for the roster before any unit has landed.\n *\n * `aria-hidden`, because three grey bars are not information — the panel's\n * `aria-busy` and its optional announcement carry that. The radius is the same\n * MULTIPLE a real row uses rather than a raw pixel count: `Skeleton` forwards\n * the number into `sx`, where it scales with `theme.shape.borderRadius`, so a\n * literal `4` drew 16px against the rows' 4px on the default theme and 48px\n * against 12px on a re-themed host.\n */\nfunction FirstLoad({ testId }: { testId: string }): React.JSX.Element {\n return (\n <Stack spacing={FLEET_SKELETON.gapUnits} data-testid={`${testId}-skeleton`} aria-hidden=\"true\">\n {Array.from({ length: FLEET_SKELETON.rows }, (_, row) => (\n <Skeleton\n key={row}\n variant=\"rectangular\"\n height={FLEET_SKELETON.height}\n borderRadius={FLEET_SKELETON.radiusMultiple}\n />\n ))}\n </Stack>\n );\n}\n\nexport interface FleetRosterProps {\n units: readonly FleetUnit[];\n copy: FleetMapCopy;\n selectedId: string | null | undefined;\n onSelect: (id: string) => void;\n laggingAfterSeconds: number;\n staleAfterSeconds: number;\n loading: boolean;\n testId: string;\n onKeyDown: (event: React.KeyboardEvent<HTMLDivElement>) => void;\n}\n\nexport function FleetRoster({\n units,\n copy,\n selectedId,\n onSelect,\n laggingAfterSeconds,\n staleAfterSeconds,\n loading,\n testId,\n onKeyDown,\n}: FleetRosterProps): React.JSX.Element {\n const theme = useTheme();\n // Generated, not derived from `dataTestId`: two boards on one page filtered\n // from the same fleet would otherwise emit duplicate DOM ids and an ambiguous\n // `aria-activedescendant`. Same reason the heading uses one.\n const rowIdPrefix = React.useId();\n const optionId = (id: string): string => `${rowIdPrefix}-${id}`;\n\n // The selection is CONTROLLED, so it can name a unit that has since dropped\n // out of the freshness window — a courier ending their shift mid-poll. The\n // attribute must then be absent rather than pointing at an element that no\n // longer renders, which announces nothing and fails an axe audit. `mapCentre`\n // and `nextSelection` both handle the same case; this is the third place.\n const active = units.some((unit) => unit.id === selectedId) ? selectedId : null;\n\n // Only when there is nothing to show yet. Unmounting a populated listbox on\n // every poll destroys the focus inside it, so a dispatcher arrowing through\n // the roster is thrown back to the top of the page each time the data\n // refreshes — and the rows they were reading vanish and return.\n if (loading && units.length === 0) return <FirstLoad testId={testId} />;\n\n return (\n <Box\n role=\"listbox\"\n // A single tab stop with arrow keys inside, which is the listbox pattern:\n // a dispatcher tabbing past a fleet of thirty should not have to press it\n // thirty times to reach the map.\n tabIndex={0}\n aria-label={copy.rosterLabel}\n aria-activedescendant={active ? optionId(active) : undefined}\n data-testid={`${testId}-roster`}\n onKeyDown={onKeyDown}\n sx={{\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(FLEET_ROSTER.gapUnits),\n overflowY: 'auto',\n minWidth: 0,\n '&:focus-visible': {\n outline: `${FLEET_ROSTER.focusRingWidth}px solid ${theme.palette.primary.main}`,\n outlineOffset: FLEET_ROSTER.focusRingOffset,\n },\n }}\n >\n {units.map((unit, index) => (\n <FleetRow\n key={unit.id}\n unit={unit}\n copy={copy}\n freshness={freshnessOf(unit.staleSeconds, laggingAfterSeconds, staleAfterSeconds)}\n selected={unit.id === active}\n onSelect={onSelect}\n optionId={optionId(unit.id)}\n position={index}\n testId={`${testId}-${unit.id}`}\n />\n ))}\n </Box>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/HoverCard/HoverCard.animations.ts"],"sourcesContent":["import { keyframes } from '@mui/material/styles/index.js';\n\nexport const pulseAnimation = keyframes`\n 0% {\n box-shadow: 0 0 0 0 currentColor;\n opacity: 1;\n }\n 70% {\n box-shadow: 0 0 0 10px currentColor;\n opacity: 0;\n }\n 100% {\n box-shadow: 0 0 0 0 currentColor;\n opacity: 0;\n }\n`;\n\nexport const slideInUp = keyframes`\n from {\n opacity: 0;\n transform: translateY(8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n`;\n\nexport const slideInDown = keyframes`\n from {\n opacity: 0;\n transform: translateY(-8px);\n }\n to {\n opacity: 1;\n transform: translateY(0);\n }\n`;\n\nexport const slideInLeft = keyframes`\n from {\n opacity: 0;\n transform: translateX(8px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n`;\n\nexport const slideInRight = keyframes`\n from {\n opacity: 0;\n transform: translateX(-8px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n`;\n\nexport const scaleIn = keyframes`\n from {\n opacity: 0;\n transform: scale(0.8);\n }\n to {\n opacity: 1;\n transform: scale(1);\n }\n`;\n\n// Arrow component\n"],"mappings":";AAAA,SAAS,iBAAiB;AAEnB,IAAM,iBAAiB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAevB,IAAM,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWlB,IAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWpB,IAAM,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWpB,IAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWrB,IAAM,UAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/Stepper/Stepper.tsx"],"sourcesContent":["import CheckCircle from '@mui/icons-material/CheckCircle';\nimport Box from '@mui/material/Box/index.js';\nimport Button from '@mui/material/Button/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport { styled } from '@mui/material/styles/index.js';\nimport React from 'react';\n\nimport type { Step, StepItemProps, StepperProps } from './Stepper.types';\nimport { neutralTones } from '../../../tokens/ink';\nimport { sxRem } from '../../../tokens/relative';\nimport type { SizeValue } from '../../../tokens/scales';\n\n/**\n * The five house stops, drawn rather than collapsed.\n *\n * These were two-way ternaries on `sm`, which is what a two-value size prop\n * allows; with the full scale they have to be real values or the three new\n * stops would render identically to `md` and the prop would be a lie.\n */\nconst STEP_MIN_WIDTH: Record<SizeValue, number> = { xs: 44, sm: 56, md: 80, lg: 96, xl: 112 };\nconst STEP_ICON_SIZE: Record<SizeValue, number> = { xs: 14, sm: 18, md: 24, lg: 30, xl: 36 };\n\n\nconst StepperRoot = styled(Box, {\n shouldForwardProp: (prop) => prop !== 'orientation',\n})<{ orientation: 'horizontal' | 'vertical'; component?: React.ElementType }>(({ orientation }) => ({\n display: 'flex',\n flexDirection: orientation === 'horizontal' ? 'row' : 'column',\n // Use flex-start to align all step circles at the same vertical position\n alignItems: 'flex-start',\n}));\n\nconst StepItem = styled(Box, {\n shouldForwardProp: (prop) => !['orientation', 'isLast'].includes(prop as string),\n})<{ orientation: 'horizontal' | 'vertical'; isLast: boolean }>(({ orientation, isLast }) => ({\n display: 'flex',\n // For horizontal: row layout so connector appears beside step content\n // For vertical: column layout so connector appears below step content\n flexDirection: orientation === 'horizontal' ? 'row' : 'column',\n // For horizontal: flex-start to keep circles aligned at top\n // For vertical: center to align connector with centered circle\n alignItems: orientation === 'horizontal' ? 'flex-start' : 'center',\n flex: orientation === 'horizontal' && !isLast ? 1 : 'none',\n position: 'relative',\n // For vertical: ensure consistent width for proper centering\n ...(orientation === 'vertical' && {\n width: '100%',\n }),\n}));\n\n/** Circle diameter per size. */\nconst CIRCLE_SIZE: Record<SizeValue, number> = { xs: 24, sm: 32, md: 48, lg: 60, xl: 72 };\n\nconst StepButton = styled(Button, {\n shouldForwardProp: (prop) =>\n !['isActive', 'isCompleted', 'clickable', 'stepSize'].includes(prop as string),\n})<{ isActive: boolean; isCompleted: boolean; clickable: boolean; stepSize: SizeValue }>(\n ({ theme, isActive, isCompleted, clickable, stepSize }) => ({\n minWidth: CIRCLE_SIZE[stepSize],\n width: CIRCLE_SIZE[stepSize],\n height: CIRCLE_SIZE[stepSize],\n borderRadius: '50%',\n padding: 0,\n backgroundColor: isCompleted\n ? theme.palette.primary.main\n : isActive\n ? theme.palette.primary.main\n : neutralTones(theme).track,\n color: isCompleted || isActive ? theme.palette.primary.contrastText : theme.palette.text.primary,\n cursor: clickable ? 'pointer' : 'default',\n pointerEvents: clickable ? 'auto' : 'none',\n transition: theme.transitions.create(['background-color', 'transform'], {\n duration: theme.transitions.duration.short,\n }),\n '&:hover': clickable\n ? {\n backgroundColor: isCompleted\n ? theme.palette.primary.dark\n : isActive\n ? theme.palette.primary.dark\n : neutralTones(theme).subtle,\n transform: 'scale(1.05)',\n }\n : {},\n '&:disabled': {\n backgroundColor: neutralTones(theme).track,\n color: theme.palette.text.disabled,\n },\n }),\n);\n\nconst StepConnector = styled(Box, {\n shouldForwardProp: (prop) =>\n !['orientation', 'isCompleted', 'size'].includes(prop as string),\n})<{ orientation: 'horizontal' | 'vertical'; isCompleted: boolean; size: SizeValue }>(\n ({ theme, orientation, isCompleted, size }) => ({\n backgroundColor: isCompleted ? theme.palette.primary.main : neutralTones(theme).track,\n transition: theme.transitions.create('background-color', {\n duration: theme.transitions.duration.short,\n }),\n ...(orientation === 'horizontal'\n ? {\n flex: 1,\n height: 2,\n // Vertically centered on the circle (circle/2 - 1 for the 2px line).\n marginTop: CIRCLE_SIZE[size] / 2 - 1,\n marginLeft: 8,\n marginRight: 8,\n minWidth: 24,\n }\n : {\n width: 2,\n height: 32,\n marginTop: 8,\n marginBottom: 8,\n // Use margin auto to center horizontally\n marginLeft: 'auto',\n marginRight: 'auto',\n }),\n }),\n);\n\nconst StepLabel = styled(Box, {\n shouldForwardProp: (prop) => prop !== 'orientation',\n})<{ orientation: 'horizontal' | 'vertical' }>(({ orientation }) => ({\n textAlign: 'center',\n marginTop: orientation === 'horizontal' ? 8 : 0,\n}));\n\ntype StepSize = SizeValue;\ntype LabelVariant = 'caption' | 'body2';\n\n/** Space-joined state classes for a step (active / completed / optional). */\nfunction stepClasses(isActive: boolean, isCompleted: boolean, optional?: boolean): string {\n return [\n isActive && 'stepper-step-active',\n isCompleted && 'stepper-step-completed',\n optional && 'stepper-step-optional',\n ]\n .filter(Boolean)\n .join(' ');\n}\n\n/** The circle content-column width per orientation/size. */\nfunction contentSx(orientation: 'horizontal' | 'vertical', size: StepSize) {\n return orientation === 'horizontal'\n ? { minWidth: STEP_MIN_WIDTH[size], maxWidth: 150, flex: '0 1 auto' }\n : { flexShrink: 0 };\n}\n\ninterface StepPartProps {\n step: Step;\n index: number;\n isActive: boolean;\n size: StepSize;\n labelVariant: LabelVariant;\n}\n\n/** The step circle: a check when completed, otherwise the 1-based index. */\nconst StepCircle: React.FC<\n StepPartProps & { isCompleted: boolean; isClickable: boolean; onClick: () => void }\n> = ({ step, index, isActive, isCompleted, isClickable, size, labelVariant, onClick }) => {\n const state = isCompleted ? ' (completed)' : isActive ? ' (current)' : '';\n return (\n <StepButton\n isActive={isActive}\n isCompleted={isCompleted}\n clickable={isClickable}\n stepSize={size}\n onClick={onClick}\n disabled={step.disabled}\n aria-current={isActive ? 'step' : undefined}\n aria-label={`Step ${index + 1}: ${step.label}${step.optional ? ' (optional)' : ''}${state}`}\n data-testid={`stepper-step-icon-${index}`}\n >\n {isCompleted ? (\n <CheckCircle sx={{ fontSize: sxRem(STEP_ICON_SIZE[size]) }} />\n ) : (\n <Typography variant={labelVariant} fontWeight=\"bold\">\n {index + 1}\n </Typography>\n )}\n </StepButton>\n );\n};\n\n/** The step label block: title, optional marker, and description. */\nconst StepLabelBlock: React.FC<StepPartProps & { orientation: 'horizontal' | 'vertical' }> = ({\n step,\n index,\n isActive,\n orientation,\n size,\n labelVariant,\n}) => (\n <StepLabel\n orientation={orientation}\n data-testid={`stepper-step-label-${index}`}\n sx={size === 'sm' && orientation === 'horizontal' ? { mt: '2px' } : undefined}\n >\n <Typography\n variant={labelVariant}\n fontWeight={isActive ? 'bold' : 'normal'}\n color={isActive ? 'primary' : 'textPrimary'}\n >\n {step.label}\n {step.optional && (\n <Typography component=\"span\" variant=\"caption\" color=\"textSecondary\" sx={{ ml: 1 }}>\n (optional)\n </Typography>\n )}\n </Typography>\n {step.description && (\n <Typography variant=\"caption\" color=\"textSecondary\" display=\"block\">\n {step.description}\n </Typography>\n )}\n </StepLabel>\n);\n\nconst StepperItem: React.FC<StepItemProps> = ({\n step,\n index,\n isActive,\n isCompleted,\n isLast,\n orientation,\n size,\n variant,\n clickable,\n onStepClick,\n renderConnector,\n nextStep,\n}) => {\n const labelVariant: LabelVariant = size === 'sm' ? 'caption' : 'body2';\n const isClickable = Boolean(clickable) && !step.disabled && (variant === 'non-linear' || !isActive);\n const handleStepClick = () => {\n if (isClickable && onStepClick) onStepClick(step.id);\n };\n const connector =\n renderConnector && nextStep ? (\n renderConnector(step, nextStep, { completed: isCompleted, active: isActive })\n ) : (\n <StepConnector orientation={orientation} isCompleted={isCompleted} size={size} data-testid={`stepper-connector-${index}`} />\n );\n\n return (\n <StepItem\n orientation={orientation}\n isLast={isLast}\n role=\"listitem\"\n data-testid={`stepper-step-${index}`}\n className={stepClasses(isActive, isCompleted, step.optional)}\n >\n <Box\n display=\"flex\"\n flexDirection=\"column\"\n alignItems=\"center\"\n data-testid={`stepper-step-content-${index}`}\n sx={contentSx(orientation, size)}\n >\n <StepCircle\n step={step}\n index={index}\n isActive={isActive}\n isCompleted={isCompleted}\n isClickable={isClickable}\n size={size}\n labelVariant={labelVariant}\n onClick={handleStepClick}\n />\n <StepLabelBlock\n step={step}\n index={index}\n isActive={isActive}\n orientation={orientation}\n size={size}\n labelVariant={labelVariant}\n />\n </Box>\n {!isLast && connector}\n </StepItem>\n );\n};\n\nexport const Stepper: React.FC<StepperProps> = ({\n steps,\n activeId,\n completed = new Set(),\n orientation = 'horizontal',\n size = 'md',\n variant = 'linear',\n onStepChange,\n clickable,\n renderConnector,\n className,\n 'data-testid': dataTestId,\n}) => {\n // Determine clickable behavior\n const isClickable = clickable ?? variant === 'non-linear';\n\n return (\n <StepperRoot\n component=\"ol\"\n orientation={orientation}\n className={className}\n data-testid={dataTestId || 'stepper-container'}\n sx={{\n listStyle: 'none',\n padding: 0,\n margin: 0,\n }}\n >\n {steps.map((step, index) => {\n const isActive = step.id === activeId;\n const isCompleted = completed.has(step.id);\n const isLast = index === steps.length - 1;\n const nextStep = !isLast ? steps[index + 1] : undefined;\n\n return (\n <StepperItem\n key={step.id}\n step={step}\n index={index}\n isActive={isActive}\n isCompleted={isCompleted}\n isLast={isLast}\n orientation={orientation}\n size={size}\n variant={variant}\n clickable={isClickable}\n onStepClick={onStepChange}\n renderConnector={renderConnector}\n nextStep={nextStep}\n />\n );\n })}\n </StepperRoot>\n );\n};"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/DataViews/data-views-drag.tsx"],"sourcesContent":["\"use client\";\n\nimport { createContext, useContext, type ReactNode } from \"react\";\n\nimport { Box } from \"../../../mui/Box\";\n\n/**\n * DRAGGING, OWNED BY THE CONTAINER AND NOT BY THE CARD.\n *\n * A card cannot know whether it is draggable. The same `BaseListCard` renders\n * inside a reorderable queue, a read-only report and a board column that moves\n * items between columns — and only the thing holding them knows which. So the\n * container publishes a drag context and every card inside it becomes\n * draggable; a card with no container above it renders exactly as before, with\n * no handle and no listeners.\n *\n * This is a SEAM, not a drag implementation. It carries whatever props the\n * host's library hands out — dnd-kit's `attributes`/`listeners`, react-dnd's\n * connector output, or plain HTML5 `draggable` + `onDragStart` — because\n * picking one of those for every consumer of `@12-apps/ui` is a decision this\n * package has no business making. There is no drag dependency here, and adding\n * one would force it on every app that installs the library.\n */\n\n/** The props a container hands to one item. Deliberately untyped-ish: each DnD library has its own shape. */\nexport type DragItemProps = Record<string, unknown>;\n\nexport interface DragContainerValue {\n /**\n * Props for the item's ROOT — the element that moves. dnd-kit wants its\n * `setNodeRef` and transform style here; HTML5 wants `draggable` and\n * `onDragStart`.\n */\n itemProps: (id: string | number) => DragItemProps;\n /**\n * Props for the HANDLE alone, when the container wants drags to start only\n * from the grip.\n *\n * Whole-card dragging breaks the two things a card must still do: selecting\n * text in it, and hitting the checkbox without the row sliding away. When a\n * container returns handle props, the card puts them on the grip and leaves\n * the rest of itself alone.\n */\n handleProps?: (id: string | number) => DragItemProps;\n /** The id currently being dragged, so its card can dim itself. */\n activeId?: string | number | null;\n /**\n * WHERE THE DRAGGED ITEM WOULD LAND — the one thing a drag cannot be honest\n * without.\n *\n * A list that dims the row you picked up and shows nothing else asks you to\n * guess the outcome and find out by dropping. The marker turns that into a\n * statement: THIS gap is where it goes.\n *\n * Published by the container, not computed by the card, for the same reason\n * everything else here is: only the thing holding the items knows the\n * geometry — which one you are over, which edge of it, and whether that\n * position is legal. A card knows none of that about its neighbours.\n *\n * `null` while nothing is being dragged, or while the pointer is over no\n * valid target.\n */\n dropIndicator?: { id: string | number; edge: \"before\" | \"after\" } | null;\n}\n\nconst DragContainerContext = createContext<DragContainerValue | null>(null);\n\n/**\n * Marks everything inside as draggable. Cards read this; nothing else does.\n */\nexport function DragContainerProvider({\n value,\n children,\n}: {\n value: DragContainerValue;\n children: ReactNode;\n}): React.JSX.Element {\n return <DragContainerContext.Provider value={value}>{children}</DragContainerContext.Provider>;\n}\n\n/**\n * What one card needs to know about dragging.\n *\n * Returns the inert answer when there is no container OR no `dragId` — a card\n * that forgot its id must not render a handle that does nothing, which is worse\n * than no handle at all.\n */\nexport function useDragItem(dragId: string | number | undefined): {\n draggable: boolean;\n itemProps: DragItemProps;\n handleProps: DragItemProps | undefined;\n dragging: boolean;\n /** Which of this card's edges the marker sits on, or null for neither. */\n dropEdge: \"before\" | \"after\" | null;\n} {\n const container = useContext(DragContainerContext);\n if (!container || dragId === undefined) {\n return { draggable: false, itemProps: {}, handleProps: undefined, dragging: false, dropEdge: null };\n }\n const indicator = container.dropIndicator;\n return {\n draggable: true,\n itemProps: container.itemProps(dragId),\n handleProps: container.handleProps?.(dragId),\n dragging: container.activeId === dragId,\n dropEdge: indicator != null && indicator.id === dragId ? indicator.edge : null,\n };\n}\n\n/**\n * THE DROP MARKER — one rule across the card's edge, drawn where the item lands.\n *\n * Shared by every draggable surface rather than reimplemented per card, so a\n * reorderable list, a board column and a grid of tiles all say the same thing\n * the same way. A consumer wiring its own DnD gets this for free by publishing\n * `dropIndicator`; it never draws the marker itself.\n *\n * ABSOLUTE, AND OUTSIDE THE FLOW ON PURPOSE. A marker that took layout space\n * would push every row below it down by its own height the moment it appeared —\n * the list would twitch as you dragged across it, and the gap you were aiming\n * at would move out from under the pointer. Drawn over the gap instead, nothing\n * reflows.\n *\n * `pointerEvents: none` so it cannot swallow the dragover events that placed it,\n * and `aria-hidden` because the position it reports belongs in a live region the\n * LIST owns — fifty rows each announcing a marker is a screen-reader nightmare.\n */\nexport function DropIndicator({ edge }: { edge: \"before\" | \"after\" }): React.JSX.Element {\n return (\n <Box\n aria-hidden\n data-slot=\"drop-indicator\"\n data-drop-edge={edge}\n sx={{\n position: \"absolute\",\n left: 0,\n right: 0,\n // Centred ON the gap rather than inside the card: the item lands\n // BETWEEN two rows, and a rule sitting within one of them reads as\n // \"into this row\" instead.\n ...(edge === \"before\" ? { top: -2 } : { bottom: -2 }),\n height: 3,\n borderRadius: 2,\n bgcolor: \"primary.main\",\n pointerEvents: \"none\",\n zIndex: 2,\n }}\n />\n );\n}\n\n/**\n * The grip. Six dots, the convention everywhere, drawn rather than imported so\n * this costs no icon dependency.\n *\n * `cursor: grab` on the handle only when the container gates drags to it —\n * otherwise the whole card carries the cursor and the handle is just an\n * affordance saying so.\n */\nexport function DragHandle({\n handleProps,\n gated,\n testId,\n}: {\n handleProps: DragItemProps | undefined;\n gated: boolean;\n testId?: string;\n}): React.JSX.Element {\n return (\n <Box\n component=\"span\"\n aria-hidden={handleProps ? undefined : true}\n data-testid={testId}\n {...handleProps}\n sx={{\n display: \"inline-grid\",\n gridTemplateColumns: \"repeat(2, 3px)\",\n gap: \"2px\",\n flexShrink: 0,\n p: 0.5,\n borderRadius: 1,\n color: \"text.disabled\",\n cursor: gated ? \"grab\" : \"inherit\",\n touchAction: \"none\",\n \"&:active\": { cursor: gated ? \"grabbing\" : \"inherit\" },\n \"&:hover\": { color: \"text.secondary\" },\n }}\n >\n {Array.from({ length: 6 }).map((_, index) => (\n <Box\n key={index}\n component=\"span\"\n sx={{ width: 3, height: 3, borderRadius: \"50%\", bgcolor: \"currentColor\" }}\n />\n ))}\n </Box>\n );\n}\n"],"mappings":";;;;;AAEA,SAAS,eAAe,kBAAkC;AA2EjD;AAZT,IAAM,uBAAuB,cAAyC,IAAI;AAKnE,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AACF,GAGsB;AACpB,SAAO,oBAAC,qBAAqB,UAArB,EAA8B,OAAe,UAAS;AAChE;AASO,SAAS,YAAY,QAO1B;AACA,QAAM,YAAY,WAAW,oBAAoB;AACjD,MAAI,CAAC,aAAa,WAAW,QAAW;AACtC,WAAO,EAAE,WAAW,OAAO,WAAW,CAAC,GAAG,aAAa,QAAW,UAAU,OAAO,UAAU,KAAK;AAAA,EACpG;AACA,QAAM,YAAY,UAAU;AAC5B,SAAO;AAAA,IACL,WAAW;AAAA,IACX,WAAW,UAAU,UAAU,MAAM;AAAA,IACrC,aAAa,UAAU,cAAc,MAAM;AAAA,IAC3C,UAAU,UAAU,aAAa;AAAA,IACjC,UAAU,aAAa,QAAQ,UAAU,OAAO,SAAS,UAAU,OAAO;AAAA,EAC5E;AACF;AAoBO,SAAS,cAAc,EAAE,KAAK,GAAoD;AACvF,SACE;AAAA,IAACA;AAAA,IAAA;AAAA,MACC,eAAW;AAAA,MACX,aAAU;AAAA,MACV,kBAAgB;AAAA,MAChB,IAAI;AAAA,QACF,UAAU;AAAA,QACV,MAAM;AAAA,QACN,OAAO;AAAA;AAAA;AAAA;AAAA,QAIP,GAAI,SAAS,WAAW,EAAE,KAAK,GAAG,IAAI,EAAE,QAAQ,GAAG;AAAA,QACnD,QAAQ;AAAA,QACR,cAAc;AAAA,QACd,SAAS;AAAA,QACT,eAAe;AAAA,QACf,QAAQ;AAAA,MACV;AAAA;AAAA,EACF;AAEJ;AAUO,SAAS,WAAW;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AACF,GAIsB;AACpB,SACE;AAAA,IAACA;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,eAAa,cAAc,SAAY;AAAA,MACvC,eAAa;AAAA,MACZ,GAAG;AAAA,MACJ,IAAI;AAAA,QACF,SAAS;AAAA,QACT,qBAAqB;AAAA,QACrB,KAAK;AAAA,QACL,YAAY;AAAA,QACZ,GAAG;AAAA,QACH,cAAc;AAAA,QACd,OAAO;AAAA,QACP,QAAQ,QAAQ,SAAS;AAAA,QACzB,aAAa;AAAA,QACb,YAAY,EAAE,QAAQ,QAAQ,aAAa,UAAU;AAAA,QACrD,WAAW,EAAE,OAAO,iBAAiB;AAAA,MACvC;AAAA,MAEC,gBAAM,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,CAAC,GAAG,UACjC;AAAA,QAACA;AAAA,QAAA;AAAA,UAEC,WAAU;AAAA,UACV,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,cAAc,OAAO,SAAS,eAAe;AAAA;AAAA,QAFnE;AAAA,MAGP,CACD;AAAA;AAAA,EACH;AAEJ;","names":["default"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/DataViews/data-views-export.tsx"],"sourcesContent":["\"use client\";\n\nimport DownloadRoundedIcon from \"@mui/icons-material/DownloadRounded\";\nimport KeyboardArrowDownRoundedIcon from \"@mui/icons-material/KeyboardArrowDownRounded\";\nimport CircularProgress from \"@mui/material/CircularProgress/index.js\";\nimport Popover from \"@mui/material/Popover/index.js\";\nimport { useState } from \"react\";\n\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\nimport { Button } from \"../../form/Button\";\nimport { Box } from \"../../../mui/Box\";\nimport { Text } from \"../../typography/Text\";\n\nimport type { DataViewQuery } from \"./data-views-types\";\nimport { sxRem } from \"../../../tokens/relative\";\n\n/**\n * EXPORT — the current QUERY, never the rendered page.\n *\n * Exporting what happens to be on screen is the single most common bug in an\n * admin table: the operator filtered 214 records, sees 25, exports, and gets\n * 25 — with nothing anywhere saying so. So this control does not touch the\n * loaded rows at all. It hands the host the same `DataViewQuery` the grid is\n * showing, unpaginated, and the HOST re-queries the backend — the same\n * division as everywhere else here: the component emits, the host fetches.\n *\n * The menu states the number it is about to export before the click, so the\n * two possible answers (the selection, or the whole filtered set) are never a\n * guess.\n */\n\n/** What a host can be asked to produce. */\nexport type DataViewExportFormat = \"xlsx\" | \"csv\" | \"json\";\n\n/** The request handed to the host when the operator picks a format. */\nexport interface DataViewExportRequest {\n format: DataViewExportFormat;\n /**\n * The live query with `page: 1` and `pageSize` set to the whole matched\n * total — i.e. \"everything this filter selects\", not this page.\n */\n query: DataViewQuery;\n /**\n * The selected row ids, when the operator has a selection. The host filters\n * the re-queried rows to these; absent means the whole filtered set.\n */\n selectedIds?: Array<string | number>;\n /** The visible columns, in the operator's current order. */\n columns: { id: string; label: string }[];\n}\n\n/** Injected export. Absent ⇒ no Exportar control, exactly like `renderCard`. */\nexport interface DataViewExport {\n /** Runs the export. Awaited, so the trigger can show it is working. */\n onExport: (request: DataViewExportRequest) => Promise<void> | void;\n /** Formats to offer, in menu order. Defaults to all three. */\n formats?: DataViewExportFormat[];\n}\n\n/** One line per format: what it is, and when to reach for it. */\n\nconst ALL_FORMATS: DataViewExportFormat[] = [\"xlsx\", \"csv\", \"json\"];\n\ninterface ExportMenuProps {\n config: DataViewExport;\n /** The live query — copied and unpaginated before it reaches the host. */\n query: DataViewQuery;\n /** The unpaginated total, so the label can state what \"tudo\" means. */\n totalCount: number;\n selectedIds: Array<string | number>;\n columns: { id: string; label: string }[];\n testIdPrefix: string;\n /** Render icon-only (measured upstream). */\n compact?: boolean;\n}\n\n/** \"Exportando 214 itens filtrados\" / \"3 itens selecionados\" — never a guess. */\nfunction scopeLabel(selected: number, total: number): string {\n if (selected > 0) {\n return `${selected} ${selected === 1 ? \"item selecionado\" : \"itens selecionados\"}`;\n }\n return `${total} ${total === 1 ? \"item filtrado\" : \"itens filtrados\"}`;\n}\n\n/** The trigger. Shows a spinner while the host's export is still running. */\nfunction ExportTrigger({\n busy,\n onOpen,\n testIdPrefix,\n compact,\n}: {\n busy: boolean;\n onOpen: (anchor: HTMLElement) => void;\n testIdPrefix: string;\n /** Icon only — step 2 of the toolbar's degradation ladder. */\n compact?: boolean;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n return (\n <Button\n variant=\"outline\"\n size=\"sm\"\n color=\"neutral\"\n disabled={busy}\n onClick={(event) => onOpen(event.currentTarget as HTMLElement)}\n dataTestId={`${testIdPrefix}-export-trigger`}\n aria-label={copy.export.trigger}\n // The label is gone, so the tooltip is the only thing naming the control.\n title={compact ? copy.export.trigger : undefined}\n >\n <Box component=\"span\" sx={{ display: \"inline-flex\", alignItems: \"center\", gap: 0.5 }}>\n {busy ? <CircularProgress size={14} /> : <DownloadRoundedIcon fontSize=\"small\" />}\n {!compact && (\n <Box component=\"span\" sx={{ display: { xs: \"none\", sm: \"inline\" } }}>\n {copy.export.triggerLabel}\n </Box>\n )}\n {/* Dropped with the label — see the note on the Exibir trigger. */}\n {!compact && <KeyboardArrowDownRoundedIcon fontSize=\"small\" />}\n </Box>\n </Button>\n );\n}\n\n/** One format row: what it produces, and when to reach for it. */\nfunction FormatRow({\n format,\n onPick,\n testIdPrefix,\n}: {\n format: DataViewExportFormat;\n onPick: () => void;\n testIdPrefix: string;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n return (\n <Box\n component=\"button\"\n type=\"button\"\n onClick={onPick}\n data-testid={`${testIdPrefix}-export-${format}`}\n sx={{\n display: \"flex\",\n flexDirection: \"column\",\n alignItems: \"flex-start\",\n width: \"100%\",\n px: 1.5,\n py: 1,\n border: 0,\n background: \"none\",\n cursor: \"pointer\",\n font: \"inherit\",\n textAlign: \"left\",\n \"&:hover\": { bgcolor: \"action.hover\" },\n }}\n >\n <Box component=\"span\" sx={{ fontSize: sxRem(13) }}>\n {copy.export.formats[format]?.label ?? format}\n </Box>\n <Box component=\"span\" sx={{ fontSize: sxRem(11), color: \"text.disabled\" }}>\n {copy.export.formats[format]?.hint ?? \"\"}\n </Box>\n </Box>\n );\n}\n\n/** The panel: what is about to be exported, then the formats. */\nfunction ExportPanel({\n formats,\n selectedCount,\n totalCount,\n columnCount,\n onPick,\n testIdPrefix,\n}: {\n formats: DataViewExportFormat[];\n selectedCount: number;\n totalCount: number;\n columnCount: number;\n onPick: (format: DataViewExportFormat) => void;\n testIdPrefix: string;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n return (\n <Box data-testid={`${testIdPrefix}-export-panel`}>\n <Box sx={{ px: 1.5, pt: 1, pb: 1, borderBottom: 1, borderColor: \"divider\" }}>\n <Text variant=\"caption\" as=\"p\">\n <Box component=\"span\" data-testid={`${testIdPrefix}-export-scope`}>\n Exportando {scopeLabel(selectedCount, totalCount)}\n </Box>\n </Text>\n <Text variant=\"caption\" as=\"p\">\n <Box component=\"span\" sx={{ color: \"text.disabled\" }}>\n {copy.export.visibleColumns(columnCount)}\n </Box>\n </Text>\n </Box>\n {formats.map((format) => (\n <FormatRow\n key={format}\n format={format}\n onPick={() => onPick(format)}\n testIdPrefix={testIdPrefix}\n />\n ))}\n </Box>\n );\n}\n\n/** The toolbar's Exportar control. Renders nothing when no host wired it. */\nexport function DataViewsExportMenu({\n config,\n query,\n totalCount,\n selectedIds,\n columns,\n testIdPrefix,\n compact,\n}: ExportMenuProps): React.JSX.Element {\n const [anchor, setAnchor] = useState<HTMLElement | null>(null);\n const [busy, setBusy] = useState(false);\n\n const run = async (format: DataViewExportFormat): Promise<void> => {\n setAnchor(null);\n setBusy(true);\n try {\n await config.onExport({\n format,\n // UNPAGINATED: page 1 of a page as large as the whole result. The host\n // re-queries with this; nothing here reads the loaded rows.\n query: { ...query, page: 1, pageSize: Math.max(1, totalCount) },\n selectedIds: selectedIds.length > 0 ? [...selectedIds] : undefined,\n columns,\n });\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <>\n <ExportTrigger busy={busy} onOpen={setAnchor} testIdPrefix={testIdPrefix} compact={compact} />\n <Popover\n open={Boolean(anchor)}\n anchorEl={anchor}\n onClose={() => setAnchor(null)}\n anchorOrigin={{ vertical: \"bottom\", horizontal: \"right\" }}\n transformOrigin={{ vertical: \"top\", horizontal: \"right\" }}\n slotProps={{ paper: { sx: { width: 260, maxWidth: \"calc(100vw - 32px)\" } } }}\n >\n <ExportPanel\n formats={config.formats ?? ALL_FORMATS}\n selectedCount={selectedIds.length}\n totalCount={totalCount}\n columnCount={columns.length}\n onPick={(format) => void run(format)}\n testIdPrefix={testIdPrefix}\n />\n </Popover>\n </>\n );\n}\n"],"mappings":"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","names":["default"]}
|