@12-apps/ui 6.31.0 → 6.32.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components-guidelines.md +31 -0
- package/dist/_internal/components/data-display/Alert/Alert.js +5 -4
- package/dist/_internal/components/data-display/Alert/Alert.metrics.js +3 -2
- package/dist/_internal/components/data-display/Alert/Alert.styles.js +4 -3
- package/dist/_internal/components/data-display/AsyncStateContainer/AsyncStateContainer.js +3 -3
- package/dist/_internal/components/data-display/Avatar/Avatar.js +6 -5
- package/dist/_internal/components/data-display/Avatar/Avatar.view.js +5 -4
- package/dist/_internal/components/data-display/Badge/Badge.animations.js +3 -2
- package/dist/_internal/components/data-display/Badge/Badge.js +6 -5
- package/dist/_internal/components/data-display/Badge/Badge.metrics.js +3 -2
- package/dist/_internal/components/data-display/Badge/Badge.styles.js +4 -3
- package/dist/_internal/components/data-display/Badge/Badge.variants.js +3 -2
- package/dist/_internal/components/data-display/Badge/BadgeContent.js +5 -4
- package/dist/_internal/components/data-display/Banner/Banner.js +3 -2
- package/dist/_internal/components/data-display/Banner/Banner.styles.js +3 -2
- package/dist/_internal/components/data-display/CardKit/CardKebab.js +9 -5
- package/dist/_internal/components/data-display/CardKit/card-actions-context.js +6 -5
- package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js +16 -12
- package/dist/_internal/components/data-display/CardKit/use-row-confirm.js +13 -9
- package/dist/_internal/components/data-display/Carousel/Carousel.chrome.js +9 -5
- package/dist/_internal/components/data-display/Carousel/Carousel.js +13 -9
- package/dist/_internal/components/data-display/Carousel/Carousel.parts.js +8 -4
- package/dist/_internal/components/data-display/Carousel/Carousel.styles.js +8 -4
- package/dist/_internal/components/data-display/Chart/Chart.js +12 -8
- package/dist/_internal/components/data-display/Chart/SpecChart.js +15 -11
- package/dist/_internal/components/data-display/Chart/chart-context.js +9 -5
- package/dist/_internal/components/data-display/Chart/chart-internals.js +8 -4
- package/dist/_internal/components/data-display/Chart/chart-renderers.js +11 -7
- package/dist/_internal/components/data-display/Chart/chart-spec.js +2 -2
- package/dist/_internal/components/data-display/DataGrid/DataGrid.js +3 -3
- package/dist/_internal/components/data-display/DataViews/DataViewsBoard.js +6 -5
- package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +72 -70
- package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +95 -93
- package/dist/_internal/components/data-display/DataViews/DeleteViewDialog.js +13 -9
- package/dist/_internal/components/data-display/DataViews/ManageViewsDialog.js +17 -13
- package/dist/_internal/components/data-display/DataViews/SaveViewModal.js +21 -19
- package/dist/_internal/components/data-display/DataViews/base-card.js +8 -7
- package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +11 -10
- package/dist/_internal/components/data-display/DataViews/base-list-card-gutters.js +5 -4
- package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +10 -9
- package/dist/_internal/components/data-display/DataViews/base-list-card.js +16 -15
- package/dist/_internal/components/data-display/DataViews/card-surface.js +3 -2
- package/dist/_internal/components/data-display/DataViews/data-views-bar-controls.js +6 -1
- package/dist/_internal/components/data-display/DataViews/data-views-category-pill.js +22 -20
- package/dist/_internal/components/data-display/DataViews/data-views-columns-tab.js +6 -5
- package/dist/_internal/components/data-display/DataViews/data-views-columns.js +10 -6
- package/dist/_internal/components/data-display/DataViews/data-views-day-input.js +6 -1
- package/dist/_internal/components/data-display/DataViews/data-views-display-panel.js +16 -12
- package/dist/_internal/components/data-display/DataViews/data-views-display-tabs.js +8 -7
- package/dist/_internal/components/data-display/DataViews/data-views-empty.js +11 -7
- package/dist/_internal/components/data-display/DataViews/data-views-export.js +11 -7
- package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +31 -29
- package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +20 -16
- package/dist/_internal/components/data-display/DataViews/data-views-grid-helpers.js +9 -5
- package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +68 -66
- package/dist/_internal/components/data-display/DataViews/data-views-header-row.js +6 -5
- package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +38 -36
- package/dist/_internal/components/data-display/DataViews/data-views-layout-context.js +2 -2
- package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +21 -17
- package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +24 -20
- package/dist/_internal/components/data-display/DataViews/data-views-number-input.js +6 -1
- package/dist/_internal/components/data-display/DataViews/data-views-pagination.js +11 -4
- package/dist/_internal/components/data-display/DataViews/data-views-range-pill.js +10 -5
- package/dist/_internal/components/data-display/DataViews/data-views-scope-tabs.js +3 -3
- package/dist/_internal/components/data-display/DataViews/data-views-search.js +6 -1
- package/dist/_internal/components/data-display/DataViews/data-views-select-all-strip.js +11 -7
- package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +27 -23
- package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +36 -34
- package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +26 -22
- package/dist/_internal/components/data-display/DataViews/data-views-view-nav.js +11 -7
- package/dist/_internal/components/data-display/DataViews/list-card-rails.js +3 -3
- package/dist/_internal/components/data-display/DataViews/save-view-preview.js +6 -5
- package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +13 -9
- package/dist/_internal/components/data-display/DataViews/use-saved-views-controller.js +3 -3
- package/dist/_internal/components/data-display/DescriptionItem/DescriptionItem.js +6 -5
- package/dist/_internal/components/data-display/EmptyState/EmptyState.js +2 -2
- package/dist/_internal/components/data-display/FleetMap/FleetBody.js +17 -12
- package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js +16 -11
- package/dist/_internal/components/data-display/FleetMap/FleetMap.js +23 -19
- package/dist/_internal/components/data-display/InteractiveTooltip/InteractiveTooltip.js +2 -2
- package/dist/_internal/components/data-display/Lightbox/Lightbox.js +6 -6
- package/dist/_internal/components/data-display/MapPreview/MapDecorations.js +2 -2
- package/dist/_internal/components/data-display/MapPreview/MapLayers.js +7 -2
- package/dist/_internal/components/data-display/MapPreview/MapPreview.hooks.js +2 -2
- package/dist/_internal/components/data-display/MapPreview/MapPreview.js +15 -10
- package/dist/_internal/components/data-display/MapPreview/MapSearchBar.js +6 -1
- package/dist/_internal/components/data-display/MapPreview/MapTiles.js +2 -2
- package/dist/_internal/components/data-display/MapPreview/StaticMapView.js +4 -4
- package/dist/_internal/components/data-display/MapPreview/useMapPreview.js +3 -3
- package/dist/_internal/components/data-display/Progress/Progress.js +6 -5
- package/dist/_internal/components/data-display/Progress/Progress.metrics.js +4 -3
- package/dist/_internal/components/data-display/Progress/Progress.styles.js +5 -4
- package/dist/_internal/components/data-display/SectionOnboarding/SectionOnboarding.js +3 -3
- package/dist/_internal/components/data-display/Sheet/Sheet.body.js +7 -3
- package/dist/_internal/components/data-display/Sheet/Sheet.js +9 -5
- package/dist/_internal/components/data-display/Sheet/Sheet.styles.js +8 -4
- package/dist/_internal/components/data-display/Table/Table.js +3 -3
- package/dist/_internal/components/data-display/index.js +78 -74
- package/dist/_internal/components/feedback/ConfirmAction/ConfirmAction.js +2 -2
- package/dist/_internal/components/feedback/ConfirmAction/ConfirmButton.js +11 -7
- package/dist/_internal/components/feedback/ConfirmAction/with-confirmation.js +2 -2
- package/dist/_internal/components/feedback/Dialog/Dialog.js +2 -2
- package/dist/_internal/components/feedback/NotificationStatusNotice/NotificationStatusNotice.js +12 -8
- package/dist/_internal/components/feedback/StackedModal/StackedModal.js +2 -2
- package/dist/_internal/components/feedback/TutorialOverlay/TutorialOverlay.js +2 -2
- package/dist/_internal/components/feedback/index.js +24 -20
- package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.js +9 -7
- package/dist/_internal/components/form/AddressAutocomplete/AddressAutocompleteField.js +7 -5
- package/dist/_internal/components/form/AddressAutocomplete/AddressFallbackField.js +6 -4
- package/dist/_internal/components/form/AddressAutocomplete/AddressInputField.js +6 -4
- package/dist/_internal/components/form/AddressAutocomplete/AddressTextField.js +5 -3
- package/dist/_internal/components/form/Autocomplete/Autocomplete.js +7 -2
- package/dist/_internal/components/form/Autocomplete/Autocomplete.parts.js +6 -1
- package/dist/_internal/components/form/Button/Button.js +8 -4
- package/dist/_internal/components/form/Button/Button.styles.js +8 -3
- package/dist/_internal/components/form/Calendar/Calendar.js +4 -4
- package/dist/_internal/components/form/Calendar/CalendarDayCell.js +2 -2
- package/dist/_internal/components/form/Calendar/CalendarMonth.js +3 -3
- package/dist/_internal/components/form/CategorySelect/CategoryPanel.js +11 -9
- package/dist/_internal/components/form/CategorySelect/CategoryPanelFoot.js +6 -4
- package/dist/_internal/components/form/CategorySelect/CategoryPanelHead.js +6 -4
- package/dist/_internal/components/form/CategorySelect/CategoryPanelList.js +7 -5
- package/dist/_internal/components/form/CategorySelect/CategoryRows.js +6 -4
- package/dist/_internal/components/form/CategorySelect/CategorySelect.js +14 -12
- package/dist/_internal/components/form/CategorySelect/CategorySelect.styles.js +5 -3
- package/dist/_internal/components/form/CategorySelect/CategoryTrigger.js +6 -4
- package/dist/_internal/components/form/CepField/CepField.js +9 -7
- package/dist/_internal/components/form/Checkbox/Checkbox.js +4 -3
- package/dist/_internal/components/form/CodeEditor/CodeEditor.js +4 -4
- package/dist/_internal/components/form/Command/Command.js +9 -5
- package/dist/_internal/components/form/Command/Command.styles.js +8 -4
- package/dist/_internal/components/form/CreatableSelect/CreatableSelect.js +5 -3
- package/dist/_internal/components/form/DateRangePicker/DateRangePicker.hooks.js +8 -3
- package/dist/_internal/components/form/DateRangePicker/DateRangePicker.js +15 -10
- package/dist/_internal/components/form/DateRangePicker/DateRangePicker.range.js +7 -2
- package/dist/_internal/components/form/DateRangePicker/DateRangePickerFields.js +8 -3
- package/dist/_internal/components/form/Input/Input.js +8 -6
- package/dist/_internal/components/form/Input/Input.metrics.js +3 -2
- package/dist/_internal/components/form/Input/Input.styles.js +7 -5
- package/dist/_internal/components/form/InputOTP/InputOTP.js +7 -5
- package/dist/_internal/components/form/InputOTP/InputOTP.styles.js +5 -3
- package/dist/_internal/components/form/Label/Label.js +9 -5
- package/dist/_internal/components/form/Label/Label.styles.js +8 -4
- package/dist/_internal/components/form/Menubar/Menubar.item.js +9 -5
- package/dist/_internal/components/form/Menubar/Menubar.js +12 -8
- package/dist/_internal/components/form/Menubar/Menubar.styles.js +8 -4
- package/dist/_internal/components/form/Menubar/Menubar.toolbar.js +10 -6
- package/dist/_internal/components/form/PhoneInput/PhoneInput.js +5 -3
- package/dist/_internal/components/form/RadioGroup/RadioGroup.js +8 -6
- package/dist/_internal/components/form/RadioGroup/RadioGroup.styles.js +5 -3
- package/dist/_internal/components/form/RadioGroup/RadioGroup.variants.js +6 -4
- package/dist/_internal/components/form/RichTextEditor/RichTextEditor.js +3 -3
- package/dist/_internal/components/form/Select/Select.js +7 -5
- package/dist/_internal/components/form/Select/Select.metrics.js +3 -2
- package/dist/_internal/components/form/Switch/Switch.js +7 -6
- package/dist/_internal/components/form/Switch/Switch.parts.js +5 -4
- package/dist/_internal/components/form/Switch/Switch.styles.js +4 -3
- package/dist/_internal/components/form/Textarea/Textarea.js +5 -3
- package/dist/_internal/components/form/Textarea/TextareaRichEditor.js +13 -6
- package/dist/_internal/components/form/Textarea/TextareaRichEditor.js.map +1 -1
- package/dist/_internal/components/form/Toggle/Toggle.js +6 -4
- package/dist/_internal/components/form/Toggle/Toggle.styles.js +5 -3
- package/dist/_internal/components/form/ToggleGroup/ToggleGroup.js +6 -1
- package/dist/_internal/components/form/index.js +58 -56
- package/dist/_internal/components/form/total-form/Fields/CategoryField.js +15 -13
- package/dist/_internal/components/form/total-form/Fields/CepField.js +10 -8
- package/dist/_internal/components/form/total-form/Fields/SelectField.js +8 -6
- package/dist/_internal/components/form/total-form/Fields/TextField.js +9 -7
- package/dist/_internal/components/form/total-form/Fields/ToggleField.js +7 -2
- package/dist/_internal/components/form/total-form/Fields/index.js +29 -27
- package/dist/_internal/components/form/total-form/SubmitButton.js +9 -5
- package/dist/_internal/components/index.js +177 -175
- package/dist/_internal/components/layout/Box/Box.js +10 -6
- package/dist/_internal/components/layout/ContentToolbar/ColumnsMenu.js +6 -1
- package/dist/_internal/components/layout/ContentToolbar/FilterTrigger.js +6 -1
- package/dist/_internal/components/layout/ContentToolbar/MultiSelectDropdown.js +7 -2
- package/dist/_internal/components/layout/ContentToolbar/MultiSelectTriggers.js +6 -1
- package/dist/_internal/components/layout/ContentToolbar/SavedViewsMenu.js +8 -1
- package/dist/_internal/components/layout/ContentToolbar/SortByDropdown.js +6 -1
- package/dist/_internal/components/layout/ContentToolbar/ViewSelector.js +6 -1
- package/dist/_internal/components/layout/ScrollArea/ScrollArea.js +3 -3
- package/dist/_internal/components/layout/Stack/Stack.js +11 -7
- package/dist/_internal/components/layout/TableFilter/TableFilter.js +6 -1
- package/dist/_internal/components/layout/index.js +22 -17
- package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js +14 -10
- package/dist/_internal/components/navigation/AppHeader/AppHeader.identity.js +8 -4
- package/dist/_internal/components/navigation/CommandPalette/CommandPalette.js +2 -2
- package/dist/_internal/components/navigation/NavigationMenu/NavigationMegaSection.js +3 -3
- package/dist/_internal/components/navigation/NavigationMenu/NavigationMenu.js +5 -5
- package/dist/_internal/components/navigation/NavigationMenu/NavigationMenuItem.js +2 -2
- package/dist/_internal/components/navigation/NavigationMenu/NavigationStandardBody.js +3 -3
- package/dist/_internal/components/navigation/Pagination/Pagination.js +10 -3
- package/dist/_internal/components/navigation/Pagination/PaginationParts.js +8 -1
- package/dist/_internal/components/navigation/index.js +25 -21
- package/dist/_internal/components/typography/Heading/Heading.js +6 -5
- package/dist/_internal/components/typography/Heading/Heading.metrics.js +4 -3
- package/dist/_internal/components/typography/Heading/Heading.styles.js +5 -4
- package/dist/_internal/components/typography/Paragraph/Paragraph.js +4 -3
- package/dist/_internal/components/typography/Text/Text.js +5 -4
- package/dist/_internal/components/typography/Text/Text.metrics.js +4 -3
- package/dist/_internal/components/typography/index.js +9 -8
- package/dist/_internal/components/utility/InfiniteScroll/InfiniteScroll.js +2 -2
- package/dist/_internal/components/utility/index.js +2 -2
- package/dist/_internal/icons/Icon.js +10 -6
- package/dist/_internal/provider/UiProvider.js +9 -5
- package/dist/_internal/provider/mui-bridge.js +8 -4
- package/dist/_internal/provider/use-ui-theme.js +9 -5
- package/dist/_internal/social-login-button/social-login-button.js +14 -10
- package/dist/_internal/tokens/field-height.core.js +20 -0
- package/dist/_internal/tokens/field-height.core.js.map +1 -0
- package/dist/_internal/tokens/field-height.js +37 -0
- package/dist/_internal/tokens/field-height.js.map +1 -0
- package/dist/_internal/tokens/theme.js +3 -2
- package/dist/_internal/user-avatar/user-avatar.js +14 -10
- package/dist/charts.js +24 -20
- package/dist/{chunk-JUHPNTDA.js → chunk-2DJIS2WQ.js} +13 -6
- package/dist/chunk-2DJIS2WQ.js.map +1 -0
- package/dist/{chunk-JHOBW7OD.js → chunk-2F4YEGYG.js} +4 -4
- package/dist/chunk-2F4YEGYG.js.map +1 -0
- package/dist/{chunk-GOKMLXZH.js → chunk-2SKNSQCP.js} +2 -2
- package/dist/{chunk-YRUCIKPO.js → chunk-2UYR2OOE.js} +4 -4
- package/dist/{chunk-RMB4RTTM.js → chunk-2W4GTZDP.js} +10 -10
- package/dist/{chunk-JVMNE5G4.js → chunk-2X5OQDPH.js} +5 -1
- package/dist/chunk-2X5OQDPH.js.map +1 -0
- package/dist/{chunk-IASDP44E.js → chunk-3AOOI2NR.js} +6 -6
- package/dist/{chunk-BRUJC7OG.js → chunk-3CN2GBIK.js} +3 -3
- package/dist/{chunk-F73D4EMA.js → chunk-3DO5MFXA.js} +1 -1
- package/dist/chunk-3DO5MFXA.js.map +1 -0
- package/dist/{chunk-L6UTYFAB.js → chunk-3E3JYKUK.js} +12 -3
- package/dist/chunk-3E3JYKUK.js.map +1 -0
- package/dist/{chunk-WCLWFN3F.js → chunk-3NA7AO6H.js} +7 -7
- package/dist/{chunk-URK67BAE.js → chunk-3SJZP7KH.js} +5 -5
- package/dist/{chunk-67L5CMXP.js → chunk-3Z23QTCP.js} +8 -8
- package/dist/{chunk-4ETQRBZC.js → chunk-46UPILLK.js} +4 -4
- package/dist/{chunk-SSJHEV5Z.js → chunk-4BEQADWC.js} +2 -2
- package/dist/{chunk-DBXGRZBJ.js → chunk-4D7YIU34.js} +7 -7
- package/dist/{chunk-32MTYYGC.js → chunk-4PIKOJZ4.js} +2 -2
- package/dist/{chunk-SAIKHWH7.js → chunk-56S7A2XT.js} +9 -9
- package/dist/{chunk-UHWHTNUS.js → chunk-5BW7NCM5.js} +4 -4
- package/dist/{chunk-LG6DHNRD.js → chunk-5FA5S2YN.js} +2 -2
- package/dist/{chunk-H35CQ6DF.js → chunk-5KZR3RXL.js} +3 -3
- package/dist/{chunk-MRGPVPQC.js → chunk-5NH24MF5.js} +8 -8
- package/dist/{chunk-IQFUV3BA.js → chunk-5RHMLOIA.js} +2 -2
- package/dist/{chunk-DORPR2YP.js → chunk-5SBJO37T.js} +2 -2
- package/dist/{chunk-3ZGQSWHJ.js → chunk-5U4SJ2DA.js} +5 -5
- package/dist/{chunk-XMDH3MRV.js → chunk-5UWSDTZV.js} +12 -6
- package/dist/chunk-5UWSDTZV.js.map +1 -0
- package/dist/{chunk-QKDFD4VT.js → chunk-62NFZR52.js} +4 -4
- package/dist/{chunk-3PT3SBJ7.js → chunk-65JHGT5F.js} +2 -2
- package/dist/{chunk-H7ZN2GW7.js → chunk-67N6TH6E.js} +2 -2
- package/dist/{chunk-Q5BSNHN7.js → chunk-6M33XQLZ.js} +2 -2
- package/dist/{chunk-IPS55KWK.js → chunk-6M7CMILP.js} +2 -2
- package/dist/{chunk-X2R7QG5I.js → chunk-6MDBMCFK.js} +2 -2
- package/dist/{chunk-PCONTSJJ.js → chunk-6V7D6GRX.js} +11 -11
- package/dist/{chunk-DTKMBI7B.js → chunk-6YLAVHV4.js} +4 -4
- package/dist/{chunk-MCAXIKQD.js → chunk-6ZZNV2PA.js} +4 -4
- package/dist/{chunk-BWSYSSF3.js → chunk-7A3G4W52.js} +3 -3
- package/dist/{chunk-RXSGHPCR.js → chunk-7FOOLP5H.js} +4 -4
- package/dist/{chunk-NJ6D37KV.js → chunk-7FWXG2KF.js} +2 -2
- package/dist/{chunk-XPPEUGHG.js → chunk-7MM2I34E.js} +5 -5
- package/dist/{chunk-F22WT7UX.js → chunk-7NFRTAEU.js} +2 -2
- package/dist/{chunk-OIFBBDYX.js → chunk-7TSQNYQO.js} +2 -2
- package/dist/{chunk-OFMDFN3U.js → chunk-A2QZXV2K.js} +2 -2
- package/dist/{chunk-J2RRZZXC.js → chunk-APT5L7V5.js} +2 -2
- package/dist/{chunk-ZVTJGWIV.js → chunk-AYRHW4DX.js} +2 -2
- package/dist/{chunk-Y2CSBXQT.js → chunk-AZ2KKHID.js} +2 -2
- package/dist/{chunk-NLUZGT4U.js → chunk-AZ4LLAAJ.js} +3 -3
- package/dist/{chunk-HJOABXKN.js → chunk-AZUFGKMQ.js} +4 -4
- package/dist/{chunk-IAVAZ36T.js → chunk-B4BU5CS6.js} +4 -4
- package/dist/{chunk-IRSI3BFF.js → chunk-B64PPHUR.js} +9 -1
- package/dist/chunk-B64PPHUR.js.map +1 -0
- package/dist/{chunk-USPQZQBF.js → chunk-BIIAMH47.js} +7 -4
- package/dist/chunk-BIIAMH47.js.map +1 -0
- package/dist/{chunk-APMEXS3Y.js → chunk-BM4LH7VQ.js} +5 -5
- package/dist/{chunk-JOPTI47I.js → chunk-BM4ZPBBT.js} +3 -3
- package/dist/{chunk-VGSEI7PQ.js → chunk-BTIBFR5L.js} +2 -2
- package/dist/{chunk-6SXZ7CF2.js → chunk-BTVIHTAL.js} +5 -2
- package/dist/chunk-BTVIHTAL.js.map +1 -0
- package/dist/{chunk-C2ZNAQMO.js → chunk-BUXSHLQM.js} +5 -5
- package/dist/{chunk-CIVLXOLG.js → chunk-C5WSPGMP.js} +2 -2
- package/dist/{chunk-SGV7QGYQ.js → chunk-C6R4LVUX.js} +7 -7
- package/dist/{chunk-DV42HAVP.js → chunk-CDNJOA3N.js} +21 -6
- package/dist/chunk-CDNJOA3N.js.map +1 -0
- package/dist/chunk-CGO452DC.js +90 -0
- package/dist/chunk-CGO452DC.js.map +1 -0
- package/dist/{chunk-6SNRPCSK.js → chunk-CR4KC2K5.js} +2 -2
- package/dist/{chunk-4WT4PV4M.js → chunk-CZ5ZL63A.js} +2 -2
- package/dist/{chunk-BPYPUEM5.js → chunk-CZJLWCEG.js} +2 -2
- package/dist/{chunk-YANLN6HP.js → chunk-D6HDJVQW.js} +5 -5
- package/dist/{chunk-6PSAPCTE.js → chunk-DAQ2ZDU2.js} +2 -2
- package/dist/{chunk-PEMZ2ABQ.js → chunk-DDTPMZOB.js} +5 -5
- package/dist/{chunk-XEUSTU7K.js → chunk-DIWC6AQL.js} +6 -6
- package/dist/{chunk-LWAOL4BG.js → chunk-DO3UNZAU.js} +2 -2
- package/dist/{chunk-D5YGDCMP.js → chunk-DZXN3QCX.js} +19 -19
- package/dist/{chunk-GUROYOKQ.js → chunk-EAE5Z5HL.js} +2 -2
- package/dist/{chunk-EYRSUVBC.js → chunk-ECZXTIDR.js} +2 -2
- package/dist/{chunk-3P4THDBM.js → chunk-EIGELK2H.js} +4 -4
- package/dist/{chunk-RRDL7AGQ.js → chunk-EKSSKQUW.js} +6 -2
- package/dist/chunk-EKSSKQUW.js.map +1 -0
- package/dist/{chunk-26ORCF6J.js → chunk-ENUWZ3HW.js} +2 -2
- package/dist/{chunk-DWZ7FLA7.js → chunk-FATRMNVN.js} +5 -5
- package/dist/{chunk-MSKEFXXV.js → chunk-FYFIND6O.js} +13 -5
- package/dist/chunk-FYFIND6O.js.map +1 -0
- package/dist/{chunk-SHQWIDD5.js → chunk-GJQYM3PM.js} +4 -4
- package/dist/{chunk-DX36KZUV.js → chunk-GSWDQ3ZX.js} +4 -4
- package/dist/{chunk-VNEEXUWA.js → chunk-GT7C6TSM.js} +3 -3
- package/dist/{chunk-OHKEQ7QJ.js → chunk-GXEB6MJA.js} +2 -2
- package/dist/{chunk-CPA2YRVZ.js → chunk-H3TNIGMI.js} +2 -2
- package/dist/{chunk-5EQFAFR3.js → chunk-H4NWU2ZN.js} +2 -2
- package/dist/{chunk-QNUWSXF2.js → chunk-H57ZS6W2.js} +3 -3
- package/dist/{chunk-RDFPH47Y.js → chunk-HEVST4CS.js} +10 -6
- package/dist/chunk-HEVST4CS.js.map +1 -0
- package/dist/{chunk-7YTLJUBX.js → chunk-HQZRWOSS.js} +2 -2
- package/dist/{chunk-25R3ITGZ.js → chunk-HTZYFGYE.js} +5 -5
- package/dist/{chunk-BKP7YW3Y.js → chunk-HZXCTLNI.js} +2 -2
- package/dist/{chunk-EFEZWG4C.js → chunk-IBWVEARQ.js} +9 -2
- package/dist/chunk-IBWVEARQ.js.map +1 -0
- package/dist/{chunk-SZZLABMO.js → chunk-IDO4EV7T.js} +3 -3
- package/dist/{chunk-ETU4LNU7.js → chunk-IGAXQRRZ.js} +3 -3
- package/dist/{chunk-ORIFMVN4.js → chunk-IM76SSXI.js} +3 -3
- package/dist/{chunk-EATFKTO3.js → chunk-IOEF32HX.js} +3 -3
- package/dist/{chunk-NR2HXHBR.js → chunk-IYSQRTIX.js} +2 -2
- package/dist/{chunk-YXQ2NJHF.js → chunk-JAYWTSXX.js} +6 -6
- package/dist/{chunk-RRO2EOJB.js → chunk-JB67KPGM.js} +4 -4
- package/dist/{chunk-RIA34EUT.js → chunk-JDY37EML.js} +3 -3
- package/dist/{chunk-SMUZRLFZ.js → chunk-JGOXXKPY.js} +2 -2
- package/dist/{chunk-VYMULXCJ.js → chunk-JLWAYBOP.js} +5 -2
- package/dist/chunk-JLWAYBOP.js.map +1 -0
- package/dist/{chunk-DHQ6ASUD.js → chunk-JPNPXNFH.js} +4 -4
- package/dist/{chunk-XVM4ZIRE.js → chunk-JPXG7IFW.js} +6 -4
- package/dist/chunk-JPXG7IFW.js.map +1 -0
- package/dist/{chunk-4DUHJIR2.js → chunk-JYETSTOQ.js} +2 -2
- package/dist/{chunk-FC74EAW4.js → chunk-JZJOAGBG.js} +4 -4
- package/dist/{chunk-CEA4QA63.js → chunk-KAPKMVKR.js} +2 -3
- package/dist/{chunk-CEA4QA63.js.map → chunk-KAPKMVKR.js.map} +1 -1
- package/dist/{chunk-R7KR5FYJ.js → chunk-KCFCEWF7.js} +2 -2
- package/dist/{chunk-HFBME3C5.js → chunk-KG4VNCNO.js} +4 -4
- package/dist/{chunk-V3RVRZAU.js → chunk-KMUSTQA6.js} +2 -2
- package/dist/{chunk-HSVNFMXY.js → chunk-LB2G6SD6.js} +8 -8
- package/dist/{chunk-ETSKBOXN.js → chunk-LGLHU55A.js} +7 -5
- package/dist/chunk-LGLHU55A.js.map +1 -0
- package/dist/{chunk-RWIBPIPD.js → chunk-LNOYDMFD.js} +6 -6
- package/dist/{chunk-SFAP5EH5.js → chunk-LUMF63BM.js} +4 -4
- package/dist/{chunk-WVJI3Z4P.js → chunk-LWLVWM34.js} +2 -2
- package/dist/{chunk-RFZU5BTG.js → chunk-LYSSO6WC.js} +4 -4
- package/dist/{chunk-GLPHRHIT.js → chunk-M7HX3HKW.js} +2 -2
- package/dist/{chunk-EJJRJYB5.js → chunk-MG73KW54.js} +6 -6
- package/dist/{chunk-QP3KK4KO.js → chunk-MGP5LLEK.js} +10 -10
- package/dist/{chunk-BDVJ65GR.js → chunk-MMPJ2MCE.js} +6 -3
- package/dist/chunk-MMPJ2MCE.js.map +1 -0
- package/dist/{chunk-4EL5ZSZ3.js → chunk-MQZDTGGJ.js} +8 -5
- package/dist/chunk-MQZDTGGJ.js.map +1 -0
- package/dist/{chunk-ATBT4RJZ.js → chunk-MSXNA3UH.js} +2 -2
- package/dist/{chunk-BB2IVF76.js → chunk-MVXFMIVZ.js} +7 -4
- package/dist/chunk-MVXFMIVZ.js.map +1 -0
- package/dist/{chunk-G5G4Q7G6.js → chunk-MYYGXSXF.js} +9 -6
- package/dist/chunk-MYYGXSXF.js.map +1 -0
- package/dist/{chunk-MYUZPUXQ.js → chunk-N74IYYRU.js} +3 -3
- package/dist/{chunk-5YOFMMK3.js → chunk-NBBFFPTA.js} +2 -2
- package/dist/{chunk-272OV2KZ.js → chunk-NFGVP3HN.js} +15 -9
- package/dist/chunk-NFGVP3HN.js.map +1 -0
- package/dist/{chunk-NFJUBPIN.js → chunk-NFLY5JMP.js} +2 -2
- package/dist/{chunk-3BAFJMBH.js → chunk-NKIAP6ZL.js} +4 -4
- package/dist/{chunk-G3WUOPWE.js → chunk-NLBIG5LU.js} +2 -2
- package/dist/{chunk-65IHPI4S.js → chunk-NMX3JAAB.js} +5 -4
- package/dist/chunk-NMX3JAAB.js.map +1 -0
- package/dist/{chunk-CATLG2RT.js → chunk-NU3EQX2L.js} +3 -3
- package/dist/{chunk-55E7GLVT.js → chunk-O4C5LUTJ.js} +6 -6
- package/dist/{chunk-WONCE5GB.js → chunk-OGPOTZAU.js} +18 -10
- package/dist/chunk-OGPOTZAU.js.map +1 -0
- package/dist/{chunk-INH2BDHV.js → chunk-OOGKAFBU.js} +7 -7
- package/dist/{chunk-HZAPN7XD.js → chunk-OZAP2BEP.js} +5 -2
- package/dist/chunk-OZAP2BEP.js.map +1 -0
- package/dist/{chunk-2YOQLBEX.js → chunk-OZZNC4YU.js} +3 -3
- package/dist/{chunk-Q544QEIN.js → chunk-P3L42CBB.js} +15 -9
- package/dist/chunk-P3L42CBB.js.map +1 -0
- package/dist/{chunk-BRAF4MFO.js → chunk-PE4ZW3IA.js} +9 -5
- package/dist/chunk-PE4ZW3IA.js.map +1 -0
- package/dist/{chunk-35GWNOLB.js → chunk-PH5XJGKJ.js} +2 -2
- package/dist/{chunk-AGYGNNOM.js → chunk-PQECNGDE.js} +2 -2
- package/dist/{chunk-IPE5FFFD.js → chunk-PUBPZOQJ.js} +2 -2
- package/dist/{chunk-7DNQHMDO.js → chunk-PXH24VIP.js} +4 -4
- package/dist/chunk-PZBK3F52.js +31 -0
- package/dist/chunk-PZBK3F52.js.map +1 -0
- package/dist/{chunk-7U36V4CU.js → chunk-Q2GZMDZL.js} +4 -4
- package/dist/{chunk-4LDRYLE2.js → chunk-QNHNFU7G.js} +5 -5
- package/dist/{chunk-EN5Q5RPQ.js → chunk-QRUCR4YZ.js} +17 -5
- package/dist/chunk-QRUCR4YZ.js.map +1 -0
- package/dist/{chunk-WBKWIFXA.js → chunk-QYNCPS5W.js} +6 -6
- package/dist/{chunk-C4NRFERD.js → chunk-R2I3LUUH.js} +2 -2
- package/dist/{chunk-RCI6KVN6.js → chunk-R67J6JKT.js} +5 -5
- package/dist/{chunk-GOWBYHYW.js → chunk-R6SBP5M5.js} +4 -4
- package/dist/{chunk-GKGA2ZCW.js → chunk-RAWQMBX6.js} +2 -2
- package/dist/{chunk-6BGS5FND.js → chunk-RGKGBYT2.js} +3 -3
- package/dist/{chunk-A5FIYKAN.js → chunk-RGMSTQ2J.js} +2 -2
- package/dist/{chunk-CPNSVIIB.js → chunk-RP3W6IQO.js} +5 -5
- package/dist/{chunk-WHLVMQNF.js → chunk-RQ5HZDBV.js} +4 -4
- package/dist/chunk-RQ5HZDBV.js.map +1 -0
- package/dist/{chunk-UEJQQVP2.js → chunk-RRX6ZTNX.js} +4 -4
- package/dist/{chunk-OL7UQMBI.js → chunk-RUEKY3VR.js} +2 -2
- package/dist/{chunk-3T2I6BYA.js → chunk-SJIBPRPB.js} +4 -4
- package/dist/{chunk-BHXFPZAA.js → chunk-SLODUPES.js} +16 -10
- package/dist/chunk-SLODUPES.js.map +1 -0
- package/dist/{chunk-TLY2QMU5.js → chunk-SVFA75FO.js} +3 -3
- package/dist/{chunk-R4SOPN6K.js → chunk-SVXHKIGJ.js} +12 -5
- package/dist/chunk-SVXHKIGJ.js.map +1 -0
- package/dist/{chunk-DF2FFYZ7.js → chunk-T53L42XW.js} +10 -10
- package/dist/{chunk-V6YZ3PL5.js → chunk-T5MOGJ56.js} +2 -2
- package/dist/{chunk-WI6GD4MV.js → chunk-TBRAZK3Y.js} +12 -12
- package/dist/{chunk-6VZYQC7T.js → chunk-TCLBB7U4.js} +6 -6
- package/dist/{chunk-5UGXAAZG.js → chunk-TJT4NSFN.js} +2 -2
- package/dist/{chunk-RQFBLYYH.js → chunk-TN55JKIU.js} +2 -2
- package/dist/{chunk-P4BZ7YE6.js → chunk-TTVKL3RD.js} +2 -2
- package/dist/{chunk-UCTJJYVC.js → chunk-TTW4MAOJ.js} +5 -5
- package/dist/{chunk-D6P5PSHU.js → chunk-U3ON6YW3.js} +2 -2
- package/dist/{chunk-VUFMV5Q5.js → chunk-U3PPLAFB.js} +2 -2
- package/dist/{chunk-WVQ47UTI.js → chunk-UEWIIYGA.js} +2 -2
- package/dist/{chunk-SDSAQ5YS.js → chunk-UJE7IKQ4.js} +2 -2
- package/dist/{chunk-AFZUPCBK.js → chunk-V3WWNKHU.js} +6 -6
- package/dist/{chunk-PS3EJLOC.js → chunk-VDZQJBAV.js} +4 -4
- package/dist/chunk-VDZQJBAV.js.map +1 -0
- package/dist/{chunk-D7Q42CRZ.js → chunk-VECWMANF.js} +10 -6
- package/dist/chunk-VECWMANF.js.map +1 -0
- package/dist/{chunk-CKW267ZK.js → chunk-VI7YYAXV.js} +3 -3
- package/dist/{chunk-KJYD5OJ4.js → chunk-VLVMJDGD.js} +2 -2
- package/dist/{chunk-O7SE4PYT.js → chunk-VNHLYDTX.js} +12 -6
- package/dist/chunk-VNHLYDTX.js.map +1 -0
- package/dist/{chunk-2SWQ6HIK.js → chunk-W3FAKT3D.js} +4 -4
- package/dist/{chunk-P7FQUGED.js → chunk-WQSL6MCA.js} +7 -7
- package/dist/{chunk-GSFNH4C5.js → chunk-WROCSDVL.js} +5 -5
- package/dist/{chunk-U7Q2Y6WG.js → chunk-X4HGBK4G.js} +2 -2
- package/dist/{chunk-ZCNCQGWK.js → chunk-X4XYUNRL.js} +2 -2
- package/dist/{chunk-HEWJJ4VE.js → chunk-XLZBZSES.js} +6 -3
- package/dist/chunk-XLZBZSES.js.map +1 -0
- package/dist/{chunk-H2RHA73H.js → chunk-XM6WEANW.js} +8 -8
- package/dist/{chunk-2N2KNXTF.js → chunk-XO27IMBE.js} +3 -3
- package/dist/{chunk-QPMLACIK.js → chunk-XY6KOMRN.js} +2 -2
- package/dist/{chunk-GEZYZ446.js → chunk-Y3IGYWGN.js} +27 -5
- package/dist/chunk-Y3IGYWGN.js.map +1 -0
- package/dist/{chunk-6SK3MTYJ.js → chunk-Y5UCOBQN.js} +4 -4
- package/dist/{chunk-I2IZ53QS.js → chunk-Y7ZS724A.js} +2 -2
- package/dist/{chunk-CJMU3G2J.js → chunk-YCNKH5P6.js} +6 -6
- package/dist/{chunk-O6DRUOUF.js → chunk-YESTO24O.js} +2 -2
- package/dist/{chunk-F65LT7XV.js → chunk-YZKA7UJK.js} +2 -2
- package/dist/{chunk-2DFH74T4.js → chunk-ZB6BX4GO.js} +2 -2
- package/dist/{chunk-7AR2R7TV.js → chunk-ZDWU52DJ.js} +4 -4
- package/dist/{chunk-M7E66OSC.js → chunk-ZPIMPOHV.js} +4 -4
- package/dist/data-display/Alert.js +5 -4
- package/dist/data-display/AsyncStateContainer.js +3 -3
- package/dist/data-display/Avatar.js +6 -5
- package/dist/data-display/Badge.js +6 -5
- package/dist/data-display/Banner.js +3 -2
- package/dist/data-display/CardKit.js +20 -16
- package/dist/data-display/Carousel.js +13 -9
- package/dist/data-display/Chart.js +24 -20
- package/dist/data-display/DataGrid.js +3 -3
- package/dist/data-display/DataViews.js +116 -114
- package/dist/data-display/DescriptionItem.js +6 -5
- package/dist/data-display/EmptyState.js +2 -2
- package/dist/data-display/FleetMap.js +23 -19
- package/dist/data-display/InteractiveTooltip.js +2 -2
- package/dist/data-display/Lightbox.js +6 -6
- package/dist/data-display/MapPreview.js +15 -10
- package/dist/data-display/Progress.js +6 -5
- package/dist/data-display/SectionOnboarding.js +3 -3
- package/dist/data-display/Sheet.js +9 -5
- package/dist/data-display/Table.js +3 -3
- package/dist/feedback/ConfirmAction.js +14 -10
- package/dist/feedback/Dialog.js +2 -2
- package/dist/feedback/NotificationStatusNotice.js +12 -8
- package/dist/feedback/StackedModal.js +2 -2
- package/dist/feedback/TutorialOverlay.js +2 -2
- package/dist/form/AddressAutocomplete.js +9 -7
- package/dist/form/Autocomplete.js +7 -2
- package/dist/form/Button.js +8 -4
- package/dist/form/Calendar.js +4 -4
- package/dist/form/CategorySelect.js +14 -12
- package/dist/form/CepField.js +9 -7
- package/dist/form/Checkbox.js +4 -3
- package/dist/form/CodeEditor.js +4 -4
- package/dist/form/Command.js +9 -5
- package/dist/form/CreatableSelect.js +5 -3
- package/dist/form/DateRangePicker.js +15 -10
- package/dist/form/Input.js +8 -6
- package/dist/form/InputOTP.js +7 -5
- package/dist/form/Label.js +9 -5
- package/dist/form/Menubar.js +12 -8
- package/dist/form/PhoneInput.js +5 -3
- package/dist/form/RadioGroup.js +8 -6
- package/dist/form/RichTextEditor.js +3 -3
- package/dist/form/Select.js +7 -5
- package/dist/form/Switch.js +7 -6
- package/dist/form/Textarea.js +5 -3
- package/dist/form/Toggle.js +6 -4
- package/dist/form/ToggleGroup.js +6 -1
- package/dist/form/total-form.js +36 -34
- package/dist/icons.js +10 -6
- package/dist/layout/Box.js +10 -6
- package/dist/layout/ContentToolbar.js +18 -13
- package/dist/layout/ScrollArea.js +3 -3
- package/dist/layout/Stack.js +11 -7
- package/dist/layout/TableFilter.js +6 -1
- package/dist/native/chunks/{chunk-UKROAIPA.js → chunk-335WGKE6.js} +35 -48
- package/dist/native/chunks/chunk-335WGKE6.js.map +1 -0
- package/dist/native/chunks/{chunk-LB65S6C7.js → chunk-4KWFRDI2.js} +3 -3
- package/dist/native/chunks/{chunk-S5SLTMPB.js → chunk-5IASLIBI.js} +2 -2
- package/dist/native/chunks/{chunk-IVNAQJY6.js → chunk-GUBTMR2K.js} +2 -2
- package/dist/native/chunks/chunk-IMGBBIMT.js +46 -0
- package/dist/native/chunks/chunk-IMGBBIMT.js.map +1 -0
- package/dist/native/chunks/{chunk-T3TYQMAH.js → chunk-KIG4KY4W.js} +18 -13
- package/dist/native/chunks/chunk-KIG4KY4W.js.map +1 -0
- package/dist/native/chunks/{chunk-VAD5YVIZ.js → chunk-OI57L6WL.js} +5 -5
- package/dist/native/chunks/{chunk-V72V2Q45.js → chunk-R5XVZRDD.js} +28 -1
- package/dist/native/chunks/chunk-R5XVZRDD.js.map +1 -0
- package/dist/native/chunks/{chunk-7UEJ2FMQ.js → chunk-X6RQGKGF.js} +2 -2
- package/dist/native/data-display/Alert.js +3 -3
- package/dist/native/data-display/Avatar.js +3 -3
- package/dist/native/data-display/Badge.js +3 -3
- package/dist/native/data-display/Chip.js +3 -3
- package/dist/native/data-display/EmptyState.js +6 -5
- package/dist/native/data-display/ErrorState.js +5 -4
- package/dist/native/data-display/ErrorState.js.map +1 -1
- package/dist/native/data-display/FleetMap.js +7 -6
- package/dist/native/data-display/FleetMap.js.map +1 -1
- package/dist/native/data-display/LoadingState.js +2 -2
- package/dist/native/data-display/Progress.js +2 -2
- package/dist/native/feedback/Dialog.js +3 -3
- package/dist/native/form/Button.js +4 -3
- package/dist/native/form/Checkbox.js +3 -3
- package/dist/native/form/Input.js +7 -3
- package/dist/native/form/Input.js.map +1 -1
- package/dist/native/form/Select.js +27 -14
- package/dist/native/form/Select.js.map +1 -1
- package/dist/native/form/Switch.js +2 -2
- package/dist/native/icons.js +3 -3
- package/dist/native/layout/Box.js +3 -3
- package/dist/native/layout/Card.js +2 -2
- package/dist/native/layout/Container.js +2 -2
- package/dist/native/layout/Skeleton.js +3 -3
- package/dist/native/layout/Spacer.js +2 -2
- package/dist/native/layout/Stack.js +3 -3
- package/dist/native/provider.js +2 -2
- package/dist/native/tokens.js +11 -1
- package/dist/native/typography/Heading.js +2 -2
- package/dist/native/typography/Paragraph.js +2 -2
- package/dist/native/typography/Text.js +2 -2
- package/dist/navigation/AppHeader.js +15 -11
- package/dist/navigation/CommandPalette.js +2 -2
- package/dist/navigation/NavigationMenu.js +5 -5
- package/dist/navigation/Pagination.js +10 -3
- package/dist/provider.js +10 -6
- package/dist/social-login-button.js +14 -10
- package/dist/tokens.js +39 -9
- package/dist/types/components/data-display/DataViews/data-views-bar-controls.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-more-fields.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-range-pill.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/LazyImage/LazyImage.hooks.d.ts +1 -1
- package/dist/types/components/data-display/MapPreview/MapSearchBar.d.ts.map +1 -1
- package/dist/types/components/form/AddressAutocomplete/AddressTextField.d.ts.map +1 -1
- package/dist/types/components/form/Button/Button.styles.d.ts +9 -2
- package/dist/types/components/form/Button/Button.styles.d.ts.map +1 -1
- package/dist/types/components/form/CategorySelect/CategoryPanelHead.d.ts.map +1 -1
- package/dist/types/components/form/CategorySelect/CategorySelect.styles.d.ts +3 -4
- package/dist/types/components/form/CategorySelect/CategorySelect.styles.d.ts.map +1 -1
- package/dist/types/components/form/CreatableSelect/CreatableSelect.d.ts.map +1 -1
- package/dist/types/components/form/Input/Input.d.ts.map +1 -1
- package/dist/types/components/form/Input/Input.metrics.d.ts +26 -16
- package/dist/types/components/form/Input/Input.metrics.d.ts.map +1 -1
- package/dist/types/components/form/Input/Input.styles.d.ts +2 -1
- package/dist/types/components/form/Input/Input.styles.d.ts.map +1 -1
- package/dist/types/components/form/InputOTP/InputOTP.styles.d.ts.map +1 -1
- package/dist/types/components/form/PhoneInput/PhoneInput.d.ts.map +1 -1
- package/dist/types/components/form/RadioGroup/RadioGroup.styles.d.ts.map +1 -1
- package/dist/types/components/form/Select/Select.d.ts.map +1 -1
- package/dist/types/components/form/Textarea/Textarea.d.ts.map +1 -1
- package/dist/types/components/form/Textarea/TextareaRichEditor.d.ts.map +1 -1
- package/dist/types/components/form/Toggle/Toggle.styles.d.ts.map +1 -1
- package/dist/types/components/form/ToggleGroup/ToggleGroup.d.ts.map +1 -1
- package/dist/types/components/form/total-form/Fields/ToggleField.d.ts.map +1 -1
- package/dist/types/components/form/total-form/SubmitButton.d.ts.map +1 -1
- package/dist/types/components/layout/ContentToolbar/ColumnsMenu.d.ts.map +1 -1
- package/dist/types/components/layout/ContentToolbar/FilterTrigger.d.ts.map +1 -1
- package/dist/types/components/layout/ContentToolbar/MultiSelectDropdown.d.ts.map +1 -1
- package/dist/types/components/layout/ContentToolbar/MultiSelectTriggers.d.ts.map +1 -1
- package/dist/types/components/layout/ContentToolbar/SavedViewsMenu.d.ts.map +1 -1
- package/dist/types/components/layout/ContentToolbar/SortByDropdown.d.ts.map +1 -1
- package/dist/types/components/layout/ContentToolbar/ViewSelector.d.ts.map +1 -1
- package/dist/types/components/layout/TableFilter/TableFilter.d.ts.map +1 -1
- package/dist/types/components/navigation/Pagination/PaginationParts.d.ts.map +1 -1
- package/dist/types/provider/mui-bridge.d.ts.map +1 -1
- package/dist/types/tokens/field-height.core.d.ts +49 -0
- package/dist/types/tokens/field-height.core.d.ts.map +1 -0
- package/dist/types/tokens/field-height.d.ts +58 -0
- package/dist/types/tokens/field-height.d.ts.map +1 -0
- package/dist/types/tokens/scales.d.ts +1 -0
- package/dist/types/tokens/scales.d.ts.map +1 -1
- package/dist/types/tokens/theme.d.ts +8 -0
- package/dist/types/tokens/theme.d.ts.map +1 -1
- package/dist/types-native/components/form/Button/Button.native.d.ts.map +1 -1
- package/dist/types-native/components/form/Input/Input.look.native.d.ts +2 -2
- package/dist/types-native/components/form/Input/Input.metrics.d.ts +26 -16
- package/dist/types-native/components/form/Input/Input.metrics.d.ts.map +1 -1
- package/dist/types-native/components/form/Input/Input.native.d.ts.map +1 -1
- package/dist/types-native/components/form/Select/Select.native.d.ts +2 -2
- package/dist/types-native/components/form/Select/Select.native.d.ts.map +1 -1
- package/dist/types-native/components/form/field-pulse.native.d.ts +3 -1
- package/dist/types-native/components/form/field-pulse.native.d.ts.map +1 -1
- package/dist/types-native/tokens/field-height.core.d.ts +49 -0
- package/dist/types-native/tokens/field-height.core.d.ts.map +1 -0
- package/dist/types-native/tokens/index.native.d.ts +1 -0
- package/dist/types-native/tokens/index.native.d.ts.map +1 -1
- package/dist/types-native/tokens/theme.d.ts +8 -0
- package/dist/types-native/tokens/theme.d.ts.map +1 -1
- package/dist/typography/Heading.js +6 -5
- package/dist/typography/Paragraph.js +4 -3
- package/dist/typography/Text.js +5 -4
- package/dist/user-avatar.js +14 -10
- package/dist/utility/InfiniteScroll.js +2 -2
- package/package.json +1 -1
- package/src/components/data-display/DataViews/data-views-bar-controls.tsx +3 -2
- package/src/components/data-display/DataViews/data-views-day-input.tsx +2 -2
- package/src/components/data-display/DataViews/data-views-more-fields.tsx +4 -1
- package/src/components/data-display/DataViews/data-views-number-input.tsx +2 -2
- package/src/components/data-display/DataViews/data-views-range-pill.tsx +6 -3
- package/src/components/data-display/DataViews/data-views-search.tsx +6 -2
- package/src/components/data-display/MapPreview/MapSearchBar.tsx +2 -0
- package/src/components/form/AddressAutocomplete/AddressTextField.tsx +4 -2
- package/src/components/form/Autocomplete/Autocomplete.parts.tsx +2 -2
- package/src/components/form/Button/Button.native.tsx +17 -4
- package/src/components/form/Button/Button.styles.ts +21 -5
- package/src/components/form/CategorySelect/CategoryPanelHead.tsx +3 -3
- package/src/components/form/CategorySelect/CategorySelect.styles.ts +5 -5
- package/src/components/form/CreatableSelect/CreatableSelect.tsx +2 -1
- package/src/components/form/Input/Input.look.native.ts +5 -5
- package/src/components/form/Input/Input.metrics.ts +53 -18
- package/src/components/form/Input/Input.native.tsx +2 -0
- package/src/components/form/Input/Input.styles.ts +4 -2
- package/src/components/form/Input/Input.tsx +9 -3
- package/src/components/form/InputOTP/InputOTP.styles.ts +12 -8
- package/src/components/form/PhoneInput/PhoneInput.tsx +4 -2
- package/src/components/form/RadioGroup/RadioGroup.styles.ts +10 -1
- package/src/components/form/Select/Select.native.tsx +34 -8
- package/src/components/form/Select/Select.tsx +13 -7
- package/src/components/form/Textarea/Textarea.tsx +5 -2
- package/src/components/form/Textarea/TextareaRichEditor.tsx +8 -3
- package/src/components/form/Toggle/Toggle.styles.ts +7 -3
- package/src/components/form/ToggleGroup/ToggleGroup.tsx +5 -0
- package/src/components/form/field-pulse.native.tsx +6 -3
- package/src/components/form/total-form/Fields/ToggleField.tsx +0 -2
- package/src/components/form/total-form/SubmitButton.tsx +4 -9
- package/src/components/layout/ContentToolbar/ColumnsMenu.tsx +3 -2
- package/src/components/layout/ContentToolbar/FilterTrigger.tsx +2 -1
- package/src/components/layout/ContentToolbar/MultiSelectDropdown.tsx +2 -0
- package/src/components/layout/ContentToolbar/MultiSelectTriggers.tsx +7 -5
- package/src/components/layout/ContentToolbar/SavedViewsMenu.tsx +3 -1
- package/src/components/layout/ContentToolbar/SortByDropdown.tsx +2 -1
- package/src/components/layout/ContentToolbar/ViewSelector.tsx +2 -1
- package/src/components/layout/TableFilter/TableFilter.tsx +3 -2
- package/src/components/navigation/Pagination/PaginationParts.tsx +2 -2
- package/src/provider/mui-bridge.ts +6 -2
- package/src/tokens/field-height.core.ts +70 -0
- package/src/tokens/field-height.ts +152 -0
- package/src/tokens/index.native.ts +7 -0
- package/src/tokens/scales.ts +14 -0
- package/src/tokens/theme.ts +10 -0
- package/dist/chunk-272OV2KZ.js.map +0 -1
- package/dist/chunk-4EL5ZSZ3.js.map +0 -1
- package/dist/chunk-65IHPI4S.js.map +0 -1
- package/dist/chunk-6SXZ7CF2.js.map +0 -1
- package/dist/chunk-BB2IVF76.js.map +0 -1
- package/dist/chunk-BDVJ65GR.js.map +0 -1
- package/dist/chunk-BHXFPZAA.js.map +0 -1
- package/dist/chunk-BRAF4MFO.js.map +0 -1
- package/dist/chunk-D7Q42CRZ.js.map +0 -1
- package/dist/chunk-DV42HAVP.js.map +0 -1
- package/dist/chunk-EFEZWG4C.js.map +0 -1
- package/dist/chunk-EN5Q5RPQ.js.map +0 -1
- package/dist/chunk-ETSKBOXN.js.map +0 -1
- package/dist/chunk-F73D4EMA.js.map +0 -1
- package/dist/chunk-G5G4Q7G6.js.map +0 -1
- package/dist/chunk-GEZYZ446.js.map +0 -1
- package/dist/chunk-HEWJJ4VE.js.map +0 -1
- package/dist/chunk-HZAPN7XD.js.map +0 -1
- package/dist/chunk-IRSI3BFF.js.map +0 -1
- package/dist/chunk-JHOBW7OD.js.map +0 -1
- package/dist/chunk-JUHPNTDA.js.map +0 -1
- package/dist/chunk-JVMNE5G4.js.map +0 -1
- package/dist/chunk-L6UTYFAB.js.map +0 -1
- package/dist/chunk-MSKEFXXV.js.map +0 -1
- package/dist/chunk-O7SE4PYT.js.map +0 -1
- package/dist/chunk-PS3EJLOC.js.map +0 -1
- package/dist/chunk-Q544QEIN.js.map +0 -1
- package/dist/chunk-R4SOPN6K.js.map +0 -1
- package/dist/chunk-RDFPH47Y.js.map +0 -1
- package/dist/chunk-RRDL7AGQ.js.map +0 -1
- package/dist/chunk-USPQZQBF.js.map +0 -1
- package/dist/chunk-VYMULXCJ.js.map +0 -1
- package/dist/chunk-WHLVMQNF.js.map +0 -1
- package/dist/chunk-WONCE5GB.js.map +0 -1
- package/dist/chunk-XMDH3MRV.js.map +0 -1
- package/dist/chunk-XVM4ZIRE.js.map +0 -1
- package/dist/native/chunks/chunk-T3TYQMAH.js.map +0 -1
- package/dist/native/chunks/chunk-UKROAIPA.js.map +0 -1
- package/dist/native/chunks/chunk-V72V2Q45.js.map +0 -1
- /package/dist/{chunk-GOKMLXZH.js.map → chunk-2SKNSQCP.js.map} +0 -0
- /package/dist/{chunk-YRUCIKPO.js.map → chunk-2UYR2OOE.js.map} +0 -0
- /package/dist/{chunk-RMB4RTTM.js.map → chunk-2W4GTZDP.js.map} +0 -0
- /package/dist/{chunk-IASDP44E.js.map → chunk-3AOOI2NR.js.map} +0 -0
- /package/dist/{chunk-BRUJC7OG.js.map → chunk-3CN2GBIK.js.map} +0 -0
- /package/dist/{chunk-WCLWFN3F.js.map → chunk-3NA7AO6H.js.map} +0 -0
- /package/dist/{chunk-URK67BAE.js.map → chunk-3SJZP7KH.js.map} +0 -0
- /package/dist/{chunk-67L5CMXP.js.map → chunk-3Z23QTCP.js.map} +0 -0
- /package/dist/{chunk-4ETQRBZC.js.map → chunk-46UPILLK.js.map} +0 -0
- /package/dist/{chunk-SSJHEV5Z.js.map → chunk-4BEQADWC.js.map} +0 -0
- /package/dist/{chunk-DBXGRZBJ.js.map → chunk-4D7YIU34.js.map} +0 -0
- /package/dist/{chunk-32MTYYGC.js.map → chunk-4PIKOJZ4.js.map} +0 -0
- /package/dist/{chunk-SAIKHWH7.js.map → chunk-56S7A2XT.js.map} +0 -0
- /package/dist/{chunk-UHWHTNUS.js.map → chunk-5BW7NCM5.js.map} +0 -0
- /package/dist/{chunk-LG6DHNRD.js.map → chunk-5FA5S2YN.js.map} +0 -0
- /package/dist/{chunk-H35CQ6DF.js.map → chunk-5KZR3RXL.js.map} +0 -0
- /package/dist/{chunk-MRGPVPQC.js.map → chunk-5NH24MF5.js.map} +0 -0
- /package/dist/{chunk-IQFUV3BA.js.map → chunk-5RHMLOIA.js.map} +0 -0
- /package/dist/{chunk-DORPR2YP.js.map → chunk-5SBJO37T.js.map} +0 -0
- /package/dist/{chunk-3ZGQSWHJ.js.map → chunk-5U4SJ2DA.js.map} +0 -0
- /package/dist/{chunk-QKDFD4VT.js.map → chunk-62NFZR52.js.map} +0 -0
- /package/dist/{chunk-3PT3SBJ7.js.map → chunk-65JHGT5F.js.map} +0 -0
- /package/dist/{chunk-H7ZN2GW7.js.map → chunk-67N6TH6E.js.map} +0 -0
- /package/dist/{chunk-Q5BSNHN7.js.map → chunk-6M33XQLZ.js.map} +0 -0
- /package/dist/{chunk-IPS55KWK.js.map → chunk-6M7CMILP.js.map} +0 -0
- /package/dist/{chunk-X2R7QG5I.js.map → chunk-6MDBMCFK.js.map} +0 -0
- /package/dist/{chunk-PCONTSJJ.js.map → chunk-6V7D6GRX.js.map} +0 -0
- /package/dist/{chunk-DTKMBI7B.js.map → chunk-6YLAVHV4.js.map} +0 -0
- /package/dist/{chunk-MCAXIKQD.js.map → chunk-6ZZNV2PA.js.map} +0 -0
- /package/dist/{chunk-BWSYSSF3.js.map → chunk-7A3G4W52.js.map} +0 -0
- /package/dist/{chunk-RXSGHPCR.js.map → chunk-7FOOLP5H.js.map} +0 -0
- /package/dist/{chunk-NJ6D37KV.js.map → chunk-7FWXG2KF.js.map} +0 -0
- /package/dist/{chunk-XPPEUGHG.js.map → chunk-7MM2I34E.js.map} +0 -0
- /package/dist/{chunk-F22WT7UX.js.map → chunk-7NFRTAEU.js.map} +0 -0
- /package/dist/{chunk-OIFBBDYX.js.map → chunk-7TSQNYQO.js.map} +0 -0
- /package/dist/{chunk-OFMDFN3U.js.map → chunk-A2QZXV2K.js.map} +0 -0
- /package/dist/{chunk-J2RRZZXC.js.map → chunk-APT5L7V5.js.map} +0 -0
- /package/dist/{chunk-ZVTJGWIV.js.map → chunk-AYRHW4DX.js.map} +0 -0
- /package/dist/{chunk-Y2CSBXQT.js.map → chunk-AZ2KKHID.js.map} +0 -0
- /package/dist/{chunk-NLUZGT4U.js.map → chunk-AZ4LLAAJ.js.map} +0 -0
- /package/dist/{chunk-HJOABXKN.js.map → chunk-AZUFGKMQ.js.map} +0 -0
- /package/dist/{chunk-IAVAZ36T.js.map → chunk-B4BU5CS6.js.map} +0 -0
- /package/dist/{chunk-APMEXS3Y.js.map → chunk-BM4LH7VQ.js.map} +0 -0
- /package/dist/{chunk-JOPTI47I.js.map → chunk-BM4ZPBBT.js.map} +0 -0
- /package/dist/{chunk-VGSEI7PQ.js.map → chunk-BTIBFR5L.js.map} +0 -0
- /package/dist/{chunk-C2ZNAQMO.js.map → chunk-BUXSHLQM.js.map} +0 -0
- /package/dist/{chunk-CIVLXOLG.js.map → chunk-C5WSPGMP.js.map} +0 -0
- /package/dist/{chunk-SGV7QGYQ.js.map → chunk-C6R4LVUX.js.map} +0 -0
- /package/dist/{chunk-6SNRPCSK.js.map → chunk-CR4KC2K5.js.map} +0 -0
- /package/dist/{chunk-4WT4PV4M.js.map → chunk-CZ5ZL63A.js.map} +0 -0
- /package/dist/{chunk-BPYPUEM5.js.map → chunk-CZJLWCEG.js.map} +0 -0
- /package/dist/{chunk-YANLN6HP.js.map → chunk-D6HDJVQW.js.map} +0 -0
- /package/dist/{chunk-6PSAPCTE.js.map → chunk-DAQ2ZDU2.js.map} +0 -0
- /package/dist/{chunk-PEMZ2ABQ.js.map → chunk-DDTPMZOB.js.map} +0 -0
- /package/dist/{chunk-XEUSTU7K.js.map → chunk-DIWC6AQL.js.map} +0 -0
- /package/dist/{chunk-LWAOL4BG.js.map → chunk-DO3UNZAU.js.map} +0 -0
- /package/dist/{chunk-D5YGDCMP.js.map → chunk-DZXN3QCX.js.map} +0 -0
- /package/dist/{chunk-GUROYOKQ.js.map → chunk-EAE5Z5HL.js.map} +0 -0
- /package/dist/{chunk-EYRSUVBC.js.map → chunk-ECZXTIDR.js.map} +0 -0
- /package/dist/{chunk-3P4THDBM.js.map → chunk-EIGELK2H.js.map} +0 -0
- /package/dist/{chunk-26ORCF6J.js.map → chunk-ENUWZ3HW.js.map} +0 -0
- /package/dist/{chunk-DWZ7FLA7.js.map → chunk-FATRMNVN.js.map} +0 -0
- /package/dist/{chunk-SHQWIDD5.js.map → chunk-GJQYM3PM.js.map} +0 -0
- /package/dist/{chunk-DX36KZUV.js.map → chunk-GSWDQ3ZX.js.map} +0 -0
- /package/dist/{chunk-VNEEXUWA.js.map → chunk-GT7C6TSM.js.map} +0 -0
- /package/dist/{chunk-OHKEQ7QJ.js.map → chunk-GXEB6MJA.js.map} +0 -0
- /package/dist/{chunk-CPA2YRVZ.js.map → chunk-H3TNIGMI.js.map} +0 -0
- /package/dist/{chunk-5EQFAFR3.js.map → chunk-H4NWU2ZN.js.map} +0 -0
- /package/dist/{chunk-QNUWSXF2.js.map → chunk-H57ZS6W2.js.map} +0 -0
- /package/dist/{chunk-7YTLJUBX.js.map → chunk-HQZRWOSS.js.map} +0 -0
- /package/dist/{chunk-25R3ITGZ.js.map → chunk-HTZYFGYE.js.map} +0 -0
- /package/dist/{chunk-BKP7YW3Y.js.map → chunk-HZXCTLNI.js.map} +0 -0
- /package/dist/{chunk-SZZLABMO.js.map → chunk-IDO4EV7T.js.map} +0 -0
- /package/dist/{chunk-ETU4LNU7.js.map → chunk-IGAXQRRZ.js.map} +0 -0
- /package/dist/{chunk-ORIFMVN4.js.map → chunk-IM76SSXI.js.map} +0 -0
- /package/dist/{chunk-EATFKTO3.js.map → chunk-IOEF32HX.js.map} +0 -0
- /package/dist/{chunk-NR2HXHBR.js.map → chunk-IYSQRTIX.js.map} +0 -0
- /package/dist/{chunk-YXQ2NJHF.js.map → chunk-JAYWTSXX.js.map} +0 -0
- /package/dist/{chunk-RRO2EOJB.js.map → chunk-JB67KPGM.js.map} +0 -0
- /package/dist/{chunk-RIA34EUT.js.map → chunk-JDY37EML.js.map} +0 -0
- /package/dist/{chunk-SMUZRLFZ.js.map → chunk-JGOXXKPY.js.map} +0 -0
- /package/dist/{chunk-DHQ6ASUD.js.map → chunk-JPNPXNFH.js.map} +0 -0
- /package/dist/{chunk-4DUHJIR2.js.map → chunk-JYETSTOQ.js.map} +0 -0
- /package/dist/{chunk-FC74EAW4.js.map → chunk-JZJOAGBG.js.map} +0 -0
- /package/dist/{chunk-R7KR5FYJ.js.map → chunk-KCFCEWF7.js.map} +0 -0
- /package/dist/{chunk-HFBME3C5.js.map → chunk-KG4VNCNO.js.map} +0 -0
- /package/dist/{chunk-V3RVRZAU.js.map → chunk-KMUSTQA6.js.map} +0 -0
- /package/dist/{chunk-HSVNFMXY.js.map → chunk-LB2G6SD6.js.map} +0 -0
- /package/dist/{chunk-RWIBPIPD.js.map → chunk-LNOYDMFD.js.map} +0 -0
- /package/dist/{chunk-SFAP5EH5.js.map → chunk-LUMF63BM.js.map} +0 -0
- /package/dist/{chunk-WVJI3Z4P.js.map → chunk-LWLVWM34.js.map} +0 -0
- /package/dist/{chunk-RFZU5BTG.js.map → chunk-LYSSO6WC.js.map} +0 -0
- /package/dist/{chunk-GLPHRHIT.js.map → chunk-M7HX3HKW.js.map} +0 -0
- /package/dist/{chunk-EJJRJYB5.js.map → chunk-MG73KW54.js.map} +0 -0
- /package/dist/{chunk-QP3KK4KO.js.map → chunk-MGP5LLEK.js.map} +0 -0
- /package/dist/{chunk-ATBT4RJZ.js.map → chunk-MSXNA3UH.js.map} +0 -0
- /package/dist/{chunk-MYUZPUXQ.js.map → chunk-N74IYYRU.js.map} +0 -0
- /package/dist/{chunk-5YOFMMK3.js.map → chunk-NBBFFPTA.js.map} +0 -0
- /package/dist/{chunk-NFJUBPIN.js.map → chunk-NFLY5JMP.js.map} +0 -0
- /package/dist/{chunk-3BAFJMBH.js.map → chunk-NKIAP6ZL.js.map} +0 -0
- /package/dist/{chunk-G3WUOPWE.js.map → chunk-NLBIG5LU.js.map} +0 -0
- /package/dist/{chunk-CATLG2RT.js.map → chunk-NU3EQX2L.js.map} +0 -0
- /package/dist/{chunk-55E7GLVT.js.map → chunk-O4C5LUTJ.js.map} +0 -0
- /package/dist/{chunk-INH2BDHV.js.map → chunk-OOGKAFBU.js.map} +0 -0
- /package/dist/{chunk-2YOQLBEX.js.map → chunk-OZZNC4YU.js.map} +0 -0
- /package/dist/{chunk-35GWNOLB.js.map → chunk-PH5XJGKJ.js.map} +0 -0
- /package/dist/{chunk-AGYGNNOM.js.map → chunk-PQECNGDE.js.map} +0 -0
- /package/dist/{chunk-IPE5FFFD.js.map → chunk-PUBPZOQJ.js.map} +0 -0
- /package/dist/{chunk-7DNQHMDO.js.map → chunk-PXH24VIP.js.map} +0 -0
- /package/dist/{chunk-7U36V4CU.js.map → chunk-Q2GZMDZL.js.map} +0 -0
- /package/dist/{chunk-4LDRYLE2.js.map → chunk-QNHNFU7G.js.map} +0 -0
- /package/dist/{chunk-WBKWIFXA.js.map → chunk-QYNCPS5W.js.map} +0 -0
- /package/dist/{chunk-C4NRFERD.js.map → chunk-R2I3LUUH.js.map} +0 -0
- /package/dist/{chunk-RCI6KVN6.js.map → chunk-R67J6JKT.js.map} +0 -0
- /package/dist/{chunk-GOWBYHYW.js.map → chunk-R6SBP5M5.js.map} +0 -0
- /package/dist/{chunk-GKGA2ZCW.js.map → chunk-RAWQMBX6.js.map} +0 -0
- /package/dist/{chunk-6BGS5FND.js.map → chunk-RGKGBYT2.js.map} +0 -0
- /package/dist/{chunk-A5FIYKAN.js.map → chunk-RGMSTQ2J.js.map} +0 -0
- /package/dist/{chunk-CPNSVIIB.js.map → chunk-RP3W6IQO.js.map} +0 -0
- /package/dist/{chunk-UEJQQVP2.js.map → chunk-RRX6ZTNX.js.map} +0 -0
- /package/dist/{chunk-OL7UQMBI.js.map → chunk-RUEKY3VR.js.map} +0 -0
- /package/dist/{chunk-3T2I6BYA.js.map → chunk-SJIBPRPB.js.map} +0 -0
- /package/dist/{chunk-TLY2QMU5.js.map → chunk-SVFA75FO.js.map} +0 -0
- /package/dist/{chunk-DF2FFYZ7.js.map → chunk-T53L42XW.js.map} +0 -0
- /package/dist/{chunk-V6YZ3PL5.js.map → chunk-T5MOGJ56.js.map} +0 -0
- /package/dist/{chunk-WI6GD4MV.js.map → chunk-TBRAZK3Y.js.map} +0 -0
- /package/dist/{chunk-6VZYQC7T.js.map → chunk-TCLBB7U4.js.map} +0 -0
- /package/dist/{chunk-5UGXAAZG.js.map → chunk-TJT4NSFN.js.map} +0 -0
- /package/dist/{chunk-RQFBLYYH.js.map → chunk-TN55JKIU.js.map} +0 -0
- /package/dist/{chunk-P4BZ7YE6.js.map → chunk-TTVKL3RD.js.map} +0 -0
- /package/dist/{chunk-UCTJJYVC.js.map → chunk-TTW4MAOJ.js.map} +0 -0
- /package/dist/{chunk-D6P5PSHU.js.map → chunk-U3ON6YW3.js.map} +0 -0
- /package/dist/{chunk-VUFMV5Q5.js.map → chunk-U3PPLAFB.js.map} +0 -0
- /package/dist/{chunk-WVQ47UTI.js.map → chunk-UEWIIYGA.js.map} +0 -0
- /package/dist/{chunk-SDSAQ5YS.js.map → chunk-UJE7IKQ4.js.map} +0 -0
- /package/dist/{chunk-AFZUPCBK.js.map → chunk-V3WWNKHU.js.map} +0 -0
- /package/dist/{chunk-CKW267ZK.js.map → chunk-VI7YYAXV.js.map} +0 -0
- /package/dist/{chunk-KJYD5OJ4.js.map → chunk-VLVMJDGD.js.map} +0 -0
- /package/dist/{chunk-2SWQ6HIK.js.map → chunk-W3FAKT3D.js.map} +0 -0
- /package/dist/{chunk-P7FQUGED.js.map → chunk-WQSL6MCA.js.map} +0 -0
- /package/dist/{chunk-GSFNH4C5.js.map → chunk-WROCSDVL.js.map} +0 -0
- /package/dist/{chunk-U7Q2Y6WG.js.map → chunk-X4HGBK4G.js.map} +0 -0
- /package/dist/{chunk-ZCNCQGWK.js.map → chunk-X4XYUNRL.js.map} +0 -0
- /package/dist/{chunk-H2RHA73H.js.map → chunk-XM6WEANW.js.map} +0 -0
- /package/dist/{chunk-2N2KNXTF.js.map → chunk-XO27IMBE.js.map} +0 -0
- /package/dist/{chunk-QPMLACIK.js.map → chunk-XY6KOMRN.js.map} +0 -0
- /package/dist/{chunk-6SK3MTYJ.js.map → chunk-Y5UCOBQN.js.map} +0 -0
- /package/dist/{chunk-I2IZ53QS.js.map → chunk-Y7ZS724A.js.map} +0 -0
- /package/dist/{chunk-CJMU3G2J.js.map → chunk-YCNKH5P6.js.map} +0 -0
- /package/dist/{chunk-O6DRUOUF.js.map → chunk-YESTO24O.js.map} +0 -0
- /package/dist/{chunk-F65LT7XV.js.map → chunk-YZKA7UJK.js.map} +0 -0
- /package/dist/{chunk-2DFH74T4.js.map → chunk-ZB6BX4GO.js.map} +0 -0
- /package/dist/{chunk-7AR2R7TV.js.map → chunk-ZDWU52DJ.js.map} +0 -0
- /package/dist/{chunk-M7E66OSC.js.map → chunk-ZPIMPOHV.js.map} +0 -0
- /package/dist/native/chunks/{chunk-LB65S6C7.js.map → chunk-4KWFRDI2.js.map} +0 -0
- /package/dist/native/chunks/{chunk-S5SLTMPB.js.map → chunk-5IASLIBI.js.map} +0 -0
- /package/dist/native/chunks/{chunk-IVNAQJY6.js.map → chunk-GUBTMR2K.js.map} +0 -0
- /package/dist/native/chunks/{chunk-VAD5YVIZ.js.map → chunk-OI57L6WL.js.map} +0 -0
- /package/dist/native/chunks/{chunk-7UEJ2FMQ.js.map → chunk-X6RQGKGF.js.map} +0 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { SizeValue } from './vocabulary';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* THE ONE HEIGHT EVERY FIELD IS DRAWN AT, WITH NO RENDERER BEHIND IT.
|
|
5
|
+
*
|
|
6
|
+
* A filter row used to stand at three heights — a 40px search box, 34px filter
|
|
7
|
+
* pills, 38px category and "Mais" triggers — and a form's default field was
|
|
8
|
+
* 56px beside a 44px button (FUT-2555). A field's height is one decision, so it
|
|
9
|
+
* is one token, the same way its corner is (`./field-radius.core.ts`).
|
|
10
|
+
*
|
|
11
|
+
* It is a multiple of the DEFAULT FONT SIZE — `rem` on the web, the body size on
|
|
12
|
+
* native — not a pixel count, so a field grows with the type it holds: a reader
|
|
13
|
+
* who raises the browser's base size gets taller fields with it instead of text
|
|
14
|
+
* crammed into a fixed box.
|
|
15
|
+
*
|
|
16
|
+
* The web reader and the theme channel are in `./field-height.ts`.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* The standard field height, in multiples of the default font size.
|
|
21
|
+
*
|
|
22
|
+
* 2.5 — 40px at the 16px default: what MUI's small outlined field has always
|
|
23
|
+
* drawn (the filter row's search box), and the 40px touch-target floor the
|
|
24
|
+
* product already holds its controls to.
|
|
25
|
+
*/
|
|
26
|
+
export const DEFAULT_FIELD_HEIGHT = 2.5;
|
|
27
|
+
|
|
28
|
+
/** The px (dp) the default font size stands for — `1rem`, the body size. */
|
|
29
|
+
export const FIELD_HEIGHT_FONT_PX = 16;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* How each step of the size scale relates to the standard height.
|
|
33
|
+
*
|
|
34
|
+
* `sm` and `md` ARE the standard: they were the two everyday densities (a 40px
|
|
35
|
+
* small field, a 56px medium one, a 36px and a 44px button), and a row mixing
|
|
36
|
+
* them is exactly what this token ends. `xs` is the compact step; `lg` and `xl`
|
|
37
|
+
* the roomy ones. All of them stay multiples of the font size.
|
|
38
|
+
*/
|
|
39
|
+
export const FIELD_HEIGHT_SCALE: Record<SizeValue, number> = {
|
|
40
|
+
xs: 0.8,
|
|
41
|
+
sm: 1,
|
|
42
|
+
md: 1,
|
|
43
|
+
lg: 1.2,
|
|
44
|
+
xl: 1.4,
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
/** A usable standard height: the given one when it is a positive number, the default otherwise. */
|
|
48
|
+
export function resolveFieldHeight(height: unknown): number {
|
|
49
|
+
return typeof height === 'number' && Number.isFinite(height) && height > 0 ? height : DEFAULT_FIELD_HEIGHT;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** A field's height for a size, in multiples of the default font size (`rem`). */
|
|
53
|
+
export function fieldHeightRem(height: number, size: SizeValue = 'md'): number {
|
|
54
|
+
// Rounded to 1/10000rem: `3 * 0.8` is 2.4000000000000004 in floating point,
|
|
55
|
+
// and that would be the CSS every field of the step is written with.
|
|
56
|
+
return Math.round(resolveFieldHeight(height) * FIELD_HEIGHT_SCALE[size] * 10_000) / 10_000;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** A field's height for a size in px (dp) — what the native renderer lays out. */
|
|
60
|
+
export function fieldHeightPx(height: number, size: SizeValue = 'md'): number {
|
|
61
|
+
return fieldHeightRem(height, size) * FIELD_HEIGHT_FONT_PX;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* THE ONE RESTING BORDER EVERY FIELD DRAWS: this width, in `fieldEdge`'s colour
|
|
66
|
+
* (`./field-edge.core.ts`, the tone of the theme's hairline that clears the 3:1
|
|
67
|
+
* non-text contrast floor). A variant that draws a different edge on purpose —
|
|
68
|
+
* `glass`, `gradient`, `underline`, a coloured outline button — keeps it.
|
|
69
|
+
*/
|
|
70
|
+
export const FIELD_BORDER_WIDTH = 1;
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import type { Components, CSSObject, Theme } from '@mui/material/styles/index.js';
|
|
2
|
+
|
|
3
|
+
import { fieldEdge } from './field-edge';
|
|
4
|
+
import { fieldRadiusOverrides, fieldRootStyles } from './field-radius';
|
|
5
|
+
import {
|
|
6
|
+
DEFAULT_FIELD_HEIGHT,
|
|
7
|
+
FIELD_BORDER_WIDTH,
|
|
8
|
+
FIELD_HEIGHT_SCALE,
|
|
9
|
+
fieldHeightRem,
|
|
10
|
+
resolveFieldHeight,
|
|
11
|
+
} from './field-height.core';
|
|
12
|
+
|
|
13
|
+
import type { SizeValue } from './vocabulary';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* THE FIELD HEIGHT AND BORDER ON THE WEB: the theme channel, the readers, and
|
|
17
|
+
* the styles that put a MUI text field or select on them.
|
|
18
|
+
*
|
|
19
|
+
* The argument for one height is in `./field-height.core.ts`. It is a top-level
|
|
20
|
+
* theme key for the reason `fieldRadius` is (`./field-radius.ts`): MUI types
|
|
21
|
+
* `shape` in `@mui/system`, which this package does not depend on.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
export {
|
|
25
|
+
DEFAULT_FIELD_HEIGHT,
|
|
26
|
+
FIELD_BORDER_WIDTH,
|
|
27
|
+
FIELD_HEIGHT_SCALE,
|
|
28
|
+
fieldHeightPx,
|
|
29
|
+
fieldHeightRem,
|
|
30
|
+
} from './field-height.core';
|
|
31
|
+
|
|
32
|
+
declare module '@mui/material/styles' {
|
|
33
|
+
interface Theme {
|
|
34
|
+
/** The standard field height, in multiples of the default font size. See `@12-apps/ui/tokens`' `fieldHeight`. */
|
|
35
|
+
fieldHeight?: number;
|
|
36
|
+
}
|
|
37
|
+
interface ThemeOptions {
|
|
38
|
+
/** The standard field height, in multiples of the default font size. Defaults to {@link DEFAULT_FIELD_HEIGHT}. */
|
|
39
|
+
fieldHeight?: number;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** A component's own size string as a step of the field scale — `md` when it is not one. */
|
|
44
|
+
export function asFieldSize(size: string | undefined): SizeValue {
|
|
45
|
+
return size !== undefined && size in FIELD_HEIGHT_SCALE ? (size as SizeValue) : 'md';
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** A field's height for a size, as CSS — `2.5rem` for the default. */
|
|
49
|
+
export function fieldHeight(theme: Theme, size: SizeValue = 'md'): string {
|
|
50
|
+
return `${fieldHeightRem(resolveFieldHeight(theme.fieldHeight), size)}rem`;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** The resting border every field draws: 1px in {@link fieldEdge}'s colour. */
|
|
54
|
+
export function fieldBorder(theme: Theme, surface?: string): string {
|
|
55
|
+
return `${FIELD_BORDER_WIDTH}px solid ${fieldEdge(theme, surface)}`;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* The vertical padding that makes a one-line box `height` tall around MUI's
|
|
60
|
+
* `1.4375em` line — in `em`, so it is measured against the field's own type.
|
|
61
|
+
*/
|
|
62
|
+
const verticalInset = (height: string): string => `calc((${height} - 1.4375em) / 2)`;
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* A MUI `TextField` / `Select` / `Autocomplete` (outlined, one line) at the
|
|
66
|
+
* field height for `size`: the root's own vertical padding goes, the input
|
|
67
|
+
* takes the inset, and the resting label sits on the new centre line.
|
|
68
|
+
*
|
|
69
|
+
* Multiline fields are left alone — their height is their content's — and so
|
|
70
|
+
* are `filled` and `standard`, whose label sits inside the box and which draw
|
|
71
|
+
* their own heights as variants.
|
|
72
|
+
*/
|
|
73
|
+
export function fieldControlStyles(theme: Theme, size: SizeValue = 'md'): CSSObject {
|
|
74
|
+
const inset = verticalInset(fieldHeight(theme, size));
|
|
75
|
+
return {
|
|
76
|
+
'& .MuiOutlinedInput-root:not(.MuiInputBase-multiline)': {
|
|
77
|
+
paddingTop: 0,
|
|
78
|
+
paddingBottom: 0,
|
|
79
|
+
'& .MuiOutlinedInput-input, & .MuiSelect-select': { paddingTop: inset, paddingBottom: inset },
|
|
80
|
+
// A select's display box inherits the ROOT's line height as an absolute
|
|
81
|
+
// length, so at a smaller font (0.875rem) it outgrew the inset measured in
|
|
82
|
+
// its own `em` — 42.88px in a 40px row. Its line follows its own type now.
|
|
83
|
+
'& .MuiSelect-select': { lineHeight: '1.4375em' },
|
|
84
|
+
},
|
|
85
|
+
'& .MuiInputLabel-outlined:not(.MuiInputLabel-shrink)': {
|
|
86
|
+
transform: `translate(14px, ${inset}) scale(1)`,
|
|
87
|
+
},
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* The notched outline's resting colour, as a MUI style-override callback. One
|
|
93
|
+
* function, not one per call: two themes built from the same options must
|
|
94
|
+
* compare equal, and a fresh closure each time would make them differ.
|
|
95
|
+
*/
|
|
96
|
+
const restingEdge = ({ theme }: { theme: Theme }): CSSObject => ({ borderColor: fieldEdge(theme) });
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* MUI component overrides that put MUI's OWN outlined fields on the standard
|
|
100
|
+
* height and the one resting border — for a host's bare `TextField` / `Select`,
|
|
101
|
+
* the way `fieldRadiusOverrides` rounds them. Every size MUI has maps to the standard:
|
|
102
|
+
* a host that wants another density asks this package's fields for a `size`.
|
|
103
|
+
*/
|
|
104
|
+
export function fieldHeightOverrides(height: number = DEFAULT_FIELD_HEIGHT): Components<Theme> {
|
|
105
|
+
const inset = verticalInset(`${fieldHeightRem(height)}rem`);
|
|
106
|
+
return {
|
|
107
|
+
MuiOutlinedInput: {
|
|
108
|
+
styleOverrides: {
|
|
109
|
+
input: { '&:not(.MuiInputBase-inputMultiline)': { paddingTop: inset, paddingBottom: inset } },
|
|
110
|
+
// The one resting border; MUI's hover, focus and error rules outrank it.
|
|
111
|
+
notchedOutline: restingEdge,
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
MuiInputLabel: {
|
|
115
|
+
styleOverrides: {
|
|
116
|
+
outlined: { '&:not(.MuiInputLabel-shrink)': { transform: `translate(14px, ${inset}) scale(1)` } },
|
|
117
|
+
},
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Both field overrides — the corner and the height — merged per component.
|
|
124
|
+
* They meet on `MuiOutlinedInput` (`root` from the radius, `input` from the
|
|
125
|
+
* height), so a plain spread would lose one of them.
|
|
126
|
+
*/
|
|
127
|
+
export function fieldOverrides(radius: number | undefined, height: number | undefined): Components<Theme> {
|
|
128
|
+
type Entry = { styleOverrides?: Record<string, unknown> };
|
|
129
|
+
const corner = fieldRadiusOverrides(radius) as Record<string, Entry>;
|
|
130
|
+
const tall = fieldHeightOverrides(height) as Record<string, Entry>;
|
|
131
|
+
const names = new Set([...Object.keys(corner), ...Object.keys(tall)]);
|
|
132
|
+
return Object.fromEntries(
|
|
133
|
+
[...names].map((name) => [
|
|
134
|
+
name,
|
|
135
|
+
{ styleOverrides: { ...corner[name]?.styleOverrides, ...tall[name]?.styleOverrides } },
|
|
136
|
+
]),
|
|
137
|
+
) as Components<Theme>;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* THE field standard on a MUI `TextField` / `Select` / `Autocomplete`, for a
|
|
142
|
+
* composite that renders MUI's own: the field radius, the field height for
|
|
143
|
+
* `size`, and the one resting border ({@link fieldEdge}). MUI's own hover,
|
|
144
|
+
* focus and error borders outrank the resting one, so they still show.
|
|
145
|
+
*/
|
|
146
|
+
export function fieldTextFieldStyles(theme: Theme, size: SizeValue = 'md'): CSSObject {
|
|
147
|
+
return {
|
|
148
|
+
...fieldRootStyles(theme),
|
|
149
|
+
...fieldControlStyles(theme, size),
|
|
150
|
+
'& .MuiOutlinedInput-notchedOutline': { borderColor: fieldEdge(theme) },
|
|
151
|
+
};
|
|
152
|
+
}
|
|
@@ -8,3 +8,10 @@ export * from './vocabulary';
|
|
|
8
8
|
export * from './theme';
|
|
9
9
|
export * from './color';
|
|
10
10
|
export { DEFAULT_FIELD_RADIUS } from './field-radius.core';
|
|
11
|
+
export {
|
|
12
|
+
DEFAULT_FIELD_HEIGHT,
|
|
13
|
+
FIELD_BORDER_WIDTH,
|
|
14
|
+
FIELD_HEIGHT_SCALE,
|
|
15
|
+
fieldHeightPx,
|
|
16
|
+
fieldHeightRem,
|
|
17
|
+
} from './field-height.core';
|
package/src/tokens/scales.ts
CHANGED
|
@@ -15,6 +15,20 @@ export { headingMetrics } from './typography';
|
|
|
15
15
|
export * from './theme';
|
|
16
16
|
export * from './color';
|
|
17
17
|
export { DEFAULT_FIELD_RADIUS, fieldRadius, fieldRadiusOverrides, fieldRadiusPx, fieldRootStyles } from './field-radius';
|
|
18
|
+
export {
|
|
19
|
+
asFieldSize,
|
|
20
|
+
DEFAULT_FIELD_HEIGHT,
|
|
21
|
+
FIELD_BORDER_WIDTH,
|
|
22
|
+
FIELD_HEIGHT_SCALE,
|
|
23
|
+
fieldBorder,
|
|
24
|
+
fieldControlStyles,
|
|
25
|
+
fieldHeight,
|
|
26
|
+
fieldHeightOverrides,
|
|
27
|
+
fieldHeightPx,
|
|
28
|
+
fieldHeightRem,
|
|
29
|
+
fieldOverrides,
|
|
30
|
+
fieldTextFieldStyles,
|
|
31
|
+
} from './field-height';
|
|
18
32
|
|
|
19
33
|
export interface Accent {
|
|
20
34
|
main: string;
|
package/src/tokens/theme.ts
CHANGED
|
@@ -8,6 +8,7 @@ import { contrastText, DARK_TEXT_PRIMARY, inkOver } from './ink-over';
|
|
|
8
8
|
*/
|
|
9
9
|
export { contrastText, inkOver };
|
|
10
10
|
import { cssLengthToPx, cssTrackingToEm } from './css-units';
|
|
11
|
+
import { resolveFieldHeight } from './field-height.core';
|
|
11
12
|
import { DEFAULT_FIELD_RADIUS } from './field-radius.core';
|
|
12
13
|
import { HEADING_SCALE, type HeadingLevel } from './heading-scale';
|
|
13
14
|
|
|
@@ -113,6 +114,12 @@ export interface UiTheme {
|
|
|
113
114
|
* with (see `./field-radius.core`), MUI's `theme.fieldRadius` on the web.
|
|
114
115
|
*/
|
|
115
116
|
radius: { sm: number; md: number; lg: number; xl: number; full: number; field: number };
|
|
117
|
+
/**
|
|
118
|
+
* The standard field height, in multiples of the default font size — MUI's
|
|
119
|
+
* `theme.fieldHeight` on the web. `fieldHeightPx(theme.fieldHeight, size)`
|
|
120
|
+
* (`./field-height.core`) is the dp a field of `size` lays out at.
|
|
121
|
+
*/
|
|
122
|
+
fieldHeight: number;
|
|
116
123
|
typography: UiTypography;
|
|
117
124
|
zIndex: { appBar: number; drawer: number; modal: number; snackbar: number; tooltip: number };
|
|
118
125
|
}
|
|
@@ -135,6 +142,8 @@ export interface UiThemeOptions {
|
|
|
135
142
|
spacingUnit?: number;
|
|
136
143
|
/** The radius every field is drawn with, in dp. Defaults to {@link DEFAULT_FIELD_RADIUS}. */
|
|
137
144
|
fieldRadius?: number;
|
|
145
|
+
/** The standard field height, in multiples of the default font size. Defaults to 2.5. */
|
|
146
|
+
fieldHeight?: number;
|
|
138
147
|
}
|
|
139
148
|
|
|
140
149
|
const ROOT_FONT_PX = 16;
|
|
@@ -319,6 +328,7 @@ export function createUiTheme(options: UiThemeOptions = {}): UiTheme {
|
|
|
319
328
|
spacing: (units: number) => units * spacingUnit,
|
|
320
329
|
spacingUnit,
|
|
321
330
|
radius: { sm: 2, md: 4, lg: 8, xl: 16, full: 9999, field: options.fieldRadius ?? DEFAULT_FIELD_RADIUS },
|
|
331
|
+
fieldHeight: resolveFieldHeight(options.fieldHeight),
|
|
322
332
|
typography: {
|
|
323
333
|
fontFamily: options.typography?.fontFamily,
|
|
324
334
|
monospaceFontFamily: options.typography?.monospaceFontFamily,
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/form/InputOTP/InputOTP.styles.ts"],"sourcesContent":["import { alpha } from '@mui/material/styles/index.js';\nimport type { CSSObject, Theme } from '@mui/material/styles/index.js';\n\nimport { fieldEdge } from '../../../tokens/field-edge';\nimport { fieldRadius } from '../../../tokens/field-radius';\n\ninterface ColorPalette {\n main: string;\n dark?: string;\n light?: string;\n contrastText?: string;\n}\n\n/** `neutral` is not a MUI palette entry, so it is built from the grey ramp. */\nconst neutralPalette = (theme: Theme): ColorPalette => ({\n main: theme.palette.grey[700],\n dark: theme.palette.grey[800],\n light: theme.palette.grey[500],\n contrastText: '#fff',\n});\n\n/** `danger` is this component's name for the error palette. */\nconst namedPalette = (theme: Theme, color: string): ColorPalette => {\n const colorMap: Record<string, ColorPalette> = {\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: theme.palette.error,\n };\n\n return colorMap[color] || theme.palette.primary;\n};\n\nconst getColorFromTheme = (theme: Theme, color: string): ColorPalette => {\n if (color === 'neutral') {\n return neutralPalette(theme);\n }\n\n const palette = namedPalette(theme, color);\n const { primary } = theme.palette;\n\n return {\n main: palette.main || primary.main,\n dark: palette.dark || palette.main || primary.dark,\n light: palette.light || palette.main || primary.light,\n contrastText: palette.contrastText || '#fff',\n };\n};\n\ntype SizeKey = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/** Each slot is a square, so width and height always match. */\nconst SIZES: Record<SizeKey, { side: string; fontSize: string }> = {\n xs: { side: '32px', fontSize: '0.75rem' },\n sm: { side: '40px', fontSize: '0.875rem' },\n md: { side: '48px', fontSize: '1rem' },\n lg: { side: '56px', fontSize: '1.125rem' },\n xl: { side: '64px', fontSize: '1.25rem' },\n};\n\nexport interface OtpSlotFlags {\n customColor?: string;\n customSize?: string;\n glass?: boolean;\n gradient?: boolean;\n}\n\nexport const otpSlotSx = (theme: Theme, flags: OtpSlotFlags): CSSObject => {\n const { customColor = 'primary', customSize = 'md', glass, gradient } = flags;\n const palette = getColorFromTheme(theme, customColor);\n const { side, fontSize } = SIZES[customSize as SizeKey] ?? SIZES.md;\n\n return {\n width: side,\n height: side,\n '& .MuiOutlinedInput-root': {\n width: side,\n height: side,\n fontSize,\n fontWeight: 600,\n textAlign: 'center',\n borderRadius: fieldRadius(theme),\n ...(glass && {\n backgroundColor: alpha(theme.palette.background.paper, 0.1),\n backdropFilter: 'blur(20px)',\n '& fieldset': { border: `1px solid ${fieldEdge(theme)}` },\n }),\n ...(gradient && {\n '&.Mui-focused fieldset': {\n background: `linear-gradient(135deg, ${palette.main}, ${palette.light})`,\n borderWidth: '2px',\n },\n }),\n '& input': { textAlign: 'center', padding: 0, fontWeight: 'inherit' },\n '&:hover fieldset': { borderColor: palette.main },\n '&.Mui-focused fieldset': { borderColor: palette.main, borderWidth: '2px' },\n },\n };\n};\n"],"mappings":";;;;;;;;AAAA,SAAS,aAAa;AActB,IAAM,iBAAiB,CAAC,WAAgC;AAAA,EACtD,MAAM,MAAM,QAAQ,KAAK,GAAG;AAAA,EAC5B,MAAM,MAAM,QAAQ,KAAK,GAAG;AAAA,EAC5B,OAAO,MAAM,QAAQ,KAAK,GAAG;AAAA,EAC7B,cAAc;AAChB;AAGA,IAAM,eAAe,CAAC,OAAc,UAAgC;AAClE,QAAM,WAAyC;AAAA,IAC7C,SAAS,MAAM,QAAQ;AAAA,IACvB,WAAW,MAAM,QAAQ;AAAA,IACzB,SAAS,MAAM,QAAQ;AAAA,IACvB,SAAS,MAAM,QAAQ;AAAA,IACvB,MAAM,MAAM,QAAQ;AAAA,IACpB,QAAQ,MAAM,QAAQ;AAAA,EACxB;AAEA,SAAO,SAAS,KAAK,KAAK,MAAM,QAAQ;AAC1C;AAEA,IAAM,oBAAoB,CAAC,OAAc,UAAgC;AACvE,MAAI,UAAU,WAAW;AACvB,WAAO,eAAe,KAAK;AAAA,EAC7B;AAEA,QAAM,UAAU,aAAa,OAAO,KAAK;AACzC,QAAM,EAAE,QAAQ,IAAI,MAAM;AAE1B,SAAO;AAAA,IACL,MAAM,QAAQ,QAAQ,QAAQ;AAAA,IAC9B,MAAM,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ;AAAA,IAC9C,OAAO,QAAQ,SAAS,QAAQ,QAAQ,QAAQ;AAAA,IAChD,cAAc,QAAQ,gBAAgB;AAAA,EACxC;AACF;AAKA,IAAM,QAA6D;AAAA,EACjE,IAAI,EAAE,MAAM,QAAQ,UAAU,UAAU;AAAA,EACxC,IAAI,EAAE,MAAM,QAAQ,UAAU,WAAW;AAAA,EACzC,IAAI,EAAE,MAAM,QAAQ,UAAU,OAAO;AAAA,EACrC,IAAI,EAAE,MAAM,QAAQ,UAAU,WAAW;AAAA,EACzC,IAAI,EAAE,MAAM,QAAQ,UAAU,UAAU;AAC1C;AASO,IAAM,YAAY,CAAC,OAAc,UAAmC;AACzE,QAAM,EAAE,cAAc,WAAW,aAAa,MAAM,OAAO,SAAS,IAAI;AACxE,QAAM,UAAU,kBAAkB,OAAO,WAAW;AACpD,QAAM,EAAE,MAAM,SAAS,IAAI,MAAM,UAAqB,KAAK,MAAM;AAEjE,SAAO;AAAA,IACL,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,4BAA4B;AAAA,MAC1B,OAAO;AAAA,MACP,QAAQ;AAAA,MACR;AAAA,MACA,YAAY;AAAA,MACZ,WAAW;AAAA,MACX,cAAc,YAAY,KAAK;AAAA,MAC/B,GAAI,SAAS;AAAA,QACX,iBAAiB,MAAM,MAAM,QAAQ,WAAW,OAAO,GAAG;AAAA,QAC1D,gBAAgB;AAAA,QAChB,cAAc,EAAE,QAAQ,aAAa,UAAU,KAAK,CAAC,GAAG;AAAA,MAC1D;AAAA,MACA,GAAI,YAAY;AAAA,QACd,0BAA0B;AAAA,UACxB,YAAY,2BAA2B,QAAQ,IAAI,KAAK,QAAQ,KAAK;AAAA,UACrE,aAAa;AAAA,QACf;AAAA,MACF;AAAA,MACA,WAAW,EAAE,WAAW,UAAU,SAAS,GAAG,YAAY,UAAU;AAAA,MACpE,oBAAoB,EAAE,aAAa,QAAQ,KAAK;AAAA,MAChD,0BAA0B,EAAE,aAAa,QAAQ,MAAM,aAAa,MAAM;AAAA,IAC5E;AAAA,EACF;AACF;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/form/CategorySelect/CategoryPanelHead.tsx"],"sourcesContent":["'use client';\n\nimport type { CategorySelectCopy } from '../../../copy';\nimport Box from '@mui/material/Box/index.js';\nimport InputBase from '@mui/material/InputBase/index.js';\n\nimport { SearchGlyph } from './CategoryIcons';\nimport {\n chipSx,\n chipWrapSx,\n panelHeadSx,\n pinnedLabelSx,\n pinnedSx,\n} from './CategorySelect.styles';\nimport type { CategorySelectionChip } from './CategorySelect.types';\nimport { fieldRadiusPx } from '../../../tokens/field-radius';\n\ninterface PanelHeadProps {\n query: string;\n placeholder: string;\n sheet: boolean;\n /** Quick actions belong to multi-select only; single-select has nothing to bulk-do. */\n quickActions?: React.ReactNode;\n onQueryChange: (next: string) => void;\n searchInputRef: React.RefObject<HTMLInputElement | null>;\n dataTestId: string;\n copy: CategorySelectCopy;\n}\n\nconst searchFieldSx = {\n position: 'relative',\n display: 'flex',\n alignItems: 'center',\n '& input': {\n width: '100%',\n height: 36,\n padding: '0 30px 0 32px',\n fontSize: 13,\n border: '1px solid',\n borderColor: 'divider',\n borderRadius: fieldRadiusPx,\n background: 'background.paper',\n color: 'text.primary',\n '&:focus': {\n outline: 'none',\n borderColor: 'primary.main',\n boxShadow: (theme: { palette: { primary: { main: string } } }) =>\n `0 0 0 3px ${theme.palette.primary.main}26`,\n },\n },\n} as const;\n\nconst clearButtonSx = {\n position: 'absolute',\n right: 7,\n width: 20,\n height: 20,\n border: 0,\n background: 'action.selected',\n color: 'text.secondary',\n borderRadius: '50%',\n display: 'grid',\n placeItems: 'center',\n cursor: 'pointer',\n fontSize: 12,\n padding: 0,\n lineHeight: 1,\n} as const;\n\n/** Search field, its clear affordance, and the optional quick-action row. */\nexport function CategoryPanelHead({\n query,\n placeholder,\n sheet,\n quickActions,\n onQueryChange,\n searchInputRef,\n dataTestId,\n copy,\n}: PanelHeadProps): React.JSX.Element {\n return (\n <Box sx={(theme) => panelHeadSx(theme, sheet)}>\n <Box sx={searchFieldSx}>\n <SearchGlyph\n style={{\n position: 'absolute',\n left: 10,\n width: 15,\n height: 15,\n opacity: 0.55,\n pointerEvents: 'none',\n }}\n />\n <InputBase\n inputRef={searchInputRef}\n value={query}\n placeholder={placeholder}\n autoComplete=\"off\"\n inputProps={{ 'aria-label': placeholder, 'data-testid': `${dataTestId}-search` }}\n onChange={(event) => onQueryChange(event.target.value)}\n sx={{ width: '100%' }}\n />\n {query.length > 0 && (\n <Box\n component=\"button\"\n type=\"button\"\n aria-label={copy.search.clear}\n data-testid={`${dataTestId}-search-clear`}\n sx={clearButtonSx}\n onClick={() => onQueryChange('')}\n >\n ×\n </Box>\n )}\n </Box>\n {quickActions && (\n <Box\n sx={{\n display: 'flex',\n alignItems: 'center',\n gap: '10px',\n marginTop: '8px',\n fontSize: 12,\n }}\n >\n {quickActions}\n </Box>\n )}\n </Box>\n );\n}\n\ninterface PinnedTrayProps {\n chips: CategorySelectionChip[];\n onRemove: (chipId: string) => void;\n dataTestId: string;\n copy: CategorySelectCopy;\n}\n\n/**\n * The selected categories, pinned above the list.\n *\n * Pinned rather than left in place because a selection made at the bottom of a\n * ten-category tree scrolls out of sight the moment you look for the next one —\n * and a search hides it entirely. Here it survives both.\n */\nexport function CategoryPinnedTray({\n chips,\n onRemove,\n dataTestId,\n copy,\n}: PinnedTrayProps): React.JSX.Element | null {\n if (chips.length === 0) return null;\n return (\n <Box sx={pinnedSx} data-testid={`${dataTestId}-pinned`}>\n <Box sx={pinnedLabelSx}>{copy.search.pinnedLabel(chips.length)}</Box>\n <Box sx={chipWrapSx}>\n {chips.map((chip) => (\n <Box component=\"span\" key={chip.id} sx={chipSx}>\n {chip.label}\n <button\n type=\"button\"\n aria-label={copy.search.removeChip(chip.label)}\n data-testid={`${dataTestId}-unpin-${chip.id}`}\n onClick={() => onRemove(chip.id)}\n >\n ×\n </button>\n </Box>\n ))}\n </Box>\n </Box>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/layout/TableFilter/TableFilter.tsx"],"sourcesContent":["'use client';\n\nimport CloseIcon from '@mui/icons-material/Close';\nimport SearchIcon from '@mui/icons-material/Search';\nimport Box from '@mui/material/Box/index.js';\nimport Checkbox from '@mui/material/Checkbox/index.js';\nimport Divider from '@mui/material/Divider/index.js';\nimport FormControlLabel from '@mui/material/FormControlLabel/index.js';\nimport IconButton from '@mui/material/IconButton/index.js';\nimport InputAdornment from '@mui/material/InputAdornment/index.js';\nimport Link from '@mui/material/Link/index.js';\nimport TextField from '@mui/material/TextField/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport React, { useRef, useState } from 'react';\n\nimport { TableFilterContext, useTableFilterContext } from './TableFilterContext';\nimport type {\n TableFilterCheckboxFieldProps,\n TableFilterKeywordProps,\n TableFilterLayoutProps,\n TableFilterMainProps,\n TableFilterPanelProps,\n TableFilterProps,\n TableFilterRangeFieldProps,\n TableFilterSectionProps,\n} from './TableFilter.types';\nimport { fieldRootStyles } from '../../../tokens/field-radius';\n\nconst PANEL_WIDTH = 280;\n\n/**\n * Compound filter-panel system, MUI port of the reference `TableFilter`. Provides\n * open/close state; `Panel` slides in from the right beside `Main` (no overlap).\n *\n * @example\n * ```tsx\n * <TableFilter open={open} onOpenChange={setOpen} hasActiveFilters={n > 0}>\n * <TableFilter.Layout>\n * <TableFilter.Main>{table}</TableFilter.Main>\n * <TableFilter.Panel onClearAll={clearAll}>\n * <TableFilter.Keyword value={q} onChange={setQ} />\n * <TableFilter.Section title=\"Attributes\">\n * <TableFilter.CheckboxField label=\"Category\" options={cats} selected={sel} onToggle={toggle} />\n * <TableFilter.RangeField label=\"Price\" unit=\"R$\" value={price} onChange={setPrice} />\n * </TableFilter.Section>\n * </TableFilter.Panel>\n * </TableFilter.Layout>\n * </TableFilter>\n * ```\n */\nexport function TableFilter({\n children,\n open,\n onOpenChange,\n hasActiveFilters = false,\n copy,\n}: TableFilterProps): React.JSX.Element {\n return (\n <TableFilterContext.Provider value={{ open, onOpenChange, hasActiveFilters, copy }}>\n {children}\n </TableFilterContext.Provider>\n );\n}\nTableFilter.displayName = 'TableFilter';\n\nconst TableFilterLayout = ({ children, className }: TableFilterLayoutProps): React.JSX.Element => {\n const { open } = useTableFilterContext();\n return (\n <Box\n className={className}\n sx={{\n display: 'flex',\n minHeight: 0,\n minWidth: 0,\n flex: 1,\n alignItems: 'stretch',\n overflow: 'hidden',\n gap: open ? 2 : 0,\n }}\n >\n {children}\n </Box>\n );\n};\nTableFilterLayout.displayName = 'TableFilter.Layout';\n\nconst TableFilterMain = ({ children, className }: TableFilterMainProps): React.JSX.Element => (\n <Box className={className} sx={{ minWidth: 0, flex: 1, overflowY: 'auto', overflowX: 'hidden' }}>\n {children}\n </Box>\n);\nTableFilterMain.displayName = 'TableFilter.Main';\n\nconst TableFilterPanel = ({\n children,\n onClearAll,\n ariaLabel = 'Filters',\n clearTestId,\n}: TableFilterPanelProps): React.JSX.Element => {\n const { open, copy } = useTableFilterContext();\n return (\n <Box\n component=\"aside\"\n aria-label={ariaLabel}\n aria-hidden={!open}\n sx={{\n display: 'flex',\n minHeight: 0,\n flexShrink: 0,\n flexDirection: 'column',\n alignSelf: 'stretch',\n overflow: 'hidden',\n bgcolor: 'background.paper',\n width: open ? PANEL_WIDTH : 0,\n borderLeft: open ? 1 : 0,\n borderColor: 'divider',\n transition: 'width 300ms ease-in-out',\n '@media (prefers-reduced-motion: reduce)': { transition: 'none' },\n }}\n >\n <Box\n sx={{\n display: 'flex',\n minHeight: 0,\n flex: 1,\n flexDirection: 'column',\n overflowY: 'auto',\n overflowX: 'hidden',\n visibility: open ? 'visible' : 'hidden',\n opacity: open ? 1 : 0,\n pointerEvents: open ? 'auto' : 'none',\n transition: 'opacity 200ms ease-out',\n }}\n >\n <Box sx={{ boxSizing: 'border-box', display: 'flex', width: '100%', minWidth: 0, flexDirection: 'column', gap: 2.5, p: 2 }}>\n <Box sx={{ display: 'flex', justifyContent: 'flex-end' }}>\n <Link\n component=\"button\"\n type=\"button\"\n underline=\"hover\"\n data-testid={clearTestId}\n onClick={onClearAll}\n sx={{ fontSize: '0.75rem', color: 'text.secondary' }}\n >\n {copy.clearAllFilters}\n </Link>\n </Box>\n {children}\n </Box>\n </Box>\n </Box>\n );\n};\nTableFilterPanel.displayName = 'TableFilter.Panel';\n\nconst TableFilterKeyword = ({\n value,\n onChange,\n placeholder = 'Press Enter to filter',\n label = 'Filter by keyword',\n testId,\n}: TableFilterKeywordProps): React.JSX.Element => {\n const { copy } = useTableFilterContext();\n const [draft, setDraft] = useState(value);\n const prevValue = useRef(value);\n if (prevValue.current !== value) {\n prevValue.current = value;\n if (draft !== value) setDraft(value);\n }\n\n const commit = (): void => {\n if (draft !== value) onChange(draft);\n };\n const clearKeyword = (): void => {\n setDraft('');\n if (value !== '') onChange('');\n };\n\n return (\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 1 }}>\n <Typography component=\"label\" sx={{ fontSize: '0.75rem', fontWeight: 500, color: 'text.secondary' }}>\n {label}\n </Typography>\n <TextField\n size=\"small\"\n sx={fieldRootStyles}\n name=\"keyword\"\n placeholder={placeholder}\n value={draft}\n onChange={(event) => setDraft(event.target.value)}\n onBlur={commit}\n onKeyDown={(event) => {\n if (event.key !== 'Enter') return;\n event.preventDefault();\n commit();\n }}\n inputProps={{ 'aria-label': label, 'data-testid': testId }}\n InputProps={{\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon sx={{ fontSize: 16, color: 'text.secondary' }} />\n </InputAdornment>\n ),\n endAdornment:\n draft !== '' ? (\n <InputAdornment position=\"end\">\n <IconButton\n size=\"small\"\n aria-label={copy.clearKeyword}\n data-testid={testId ? `${testId}-clear` : undefined}\n onMouseDown={(event) => event.preventDefault()}\n onClick={clearKeyword}\n >\n <CloseIcon sx={{ fontSize: 16 }} />\n </IconButton>\n </InputAdornment>\n ) : null,\n }}\n />\n </Box>\n );\n};\nTableFilterKeyword.displayName = 'TableFilter.Keyword';\n\nconst TableFilterSection = ({ title, children }: TableFilterSectionProps): React.JSX.Element => (\n <Box>\n <Divider sx={{ mb: 2.5 }} />\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 1.5 }}>\n <Typography component=\"h2\" sx={{ fontSize: '0.875rem', fontWeight: 600, color: 'text.primary' }}>\n {title}\n </Typography>\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 2 }}>{children}</Box>\n </Box>\n </Box>\n);\nTableFilterSection.displayName = 'TableFilter.Section';\n\nfunction TableFilterCheckboxField<TValue extends string = string>({\n label,\n options,\n selected,\n onToggle,\n testId,\n}: TableFilterCheckboxFieldProps<TValue>): React.JSX.Element {\n return (\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 1 }} data-testid={testId}>\n <Typography sx={{ fontSize: '0.75rem', fontWeight: 500, color: 'text.secondary' }}>{label}</Typography>\n <Box sx={{ display: 'flex', flexDirection: 'column' }}>\n {options.map((option) => {\n const checked = selected.has(option.value);\n return (\n <FormControlLabel\n key={option.value}\n control={\n <Checkbox\n size=\"small\"\n checked={checked}\n onChange={(event) => onToggle(option.value, event.target.checked)}\n data-testid={testId ? `${testId}-${option.value}` : undefined}\n sx={{ py: 0.25 }}\n />\n }\n label={\n <Box component=\"span\" sx={{ fontSize: '0.875rem' }}>\n {option.label}\n {option.count != null && (\n <Box component=\"span\" sx={{ color: 'text.secondary' }}>\n {' '}\n ({option.count})\n </Box>\n )}\n </Box>\n }\n sx={{ ml: -0.5, mr: 0 }}\n />\n );\n })}\n </Box>\n </Box>\n );\n}\nTableFilterCheckboxField.displayName = 'TableFilter.CheckboxField';\n\nfunction parseBound(text: string): number | undefined {\n if (text.trim() === '') return undefined;\n const parsed = Number(text);\n return Number.isNaN(parsed) ? undefined : parsed;\n}\n\n/** One numeric bound input (min or max) for {@link TableFilterRangeField}. */\nfunction RangeBound({\n bound,\n error,\n placeholder,\n step,\n ariaLabel,\n testId,\n onChange,\n}: {\n bound: number | undefined;\n error: boolean;\n placeholder: string;\n step?: number;\n ariaLabel: string;\n testId?: string;\n onChange: (next: number | undefined) => void;\n}): React.JSX.Element {\n return (\n <TextField\n size=\"small\"\n type=\"number\"\n error={error}\n placeholder={placeholder}\n value={bound != null ? String(bound) : ''}\n onChange={(event) => onChange(parseBound(event.target.value))}\n inputProps={{ step, 'aria-label': ariaLabel, 'data-testid': testId }}\n />\n );\n}\n\n/** Inverted range: both ends set and max < min (surfaced to the user as an error). */\nconst isRangeInverted = (value: { min?: number; max?: number }): boolean =>\n value.min != null && value.max != null && value.max < value.min;\n\nconst TableFilterRangeField = ({\n label,\n value,\n onChange,\n unit,\n step,\n minPlaceholder,\n maxPlaceholder,\n invalidLabel,\n testId,\n}: TableFilterRangeFieldProps): React.JSX.Element => {\n const { copy } = useTableFilterContext();\n const invalid = isRangeInverted(value);\n // A field may override any of the three; unset, they come from the root's\n // table. Neither path reaches an English literal in this package.\n const minText = minPlaceholder ?? copy.rangeMin;\n const maxText = maxPlaceholder ?? copy.rangeMax;\n const invalidText = invalidLabel ?? copy.invalidRange;\n return (\n <Box sx={{ display: 'flex', flexDirection: 'column', gap: 1 }} data-testid={testId}>\n <Typography sx={{ fontSize: '0.75rem', fontWeight: 500, color: 'text.secondary' }}>\n {label}\n {unit ? ` (${unit})` : ''}\n </Typography>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1 }}>\n <RangeBound\n bound={value.min}\n error={invalid}\n placeholder={minText}\n step={step}\n ariaLabel={`${label} ${minText}`}\n testId={testId ? `${testId}-min` : undefined}\n onChange={(min) => onChange({ ...value, min })}\n />\n <Typography component=\"span\" sx={{ color: 'text.secondary' }}>\n –\n </Typography>\n <RangeBound\n bound={value.max}\n error={invalid}\n placeholder={maxText}\n step={step}\n ariaLabel={`${label} ${maxText}`}\n testId={testId ? `${testId}-max` : undefined}\n onChange={(max) => onChange({ ...value, max })}\n />\n </Box>\n {invalid && (\n <Typography\n role=\"alert\"\n data-testid={testId ? `${testId}-error` : undefined}\n sx={{ fontSize: '0.7rem', color: 'error.main' }}\n >\n {invalidText}\n </Typography>\n )}\n </Box>\n );\n};\nTableFilterRangeField.displayName = 'TableFilter.RangeField';\n\nTableFilter.Layout = TableFilterLayout;\nTableFilter.Main = TableFilterMain;\nTableFilter.Panel = TableFilterPanel;\nTableFilter.Keyword = TableFilterKeyword;\nTableFilter.Section = TableFilterSection;\nTableFilter.CheckboxField = TableFilterCheckboxField;\nTableFilter.RangeField = TableFilterRangeField;\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/layout/ContentToolbar/ViewSelector.tsx"],"sourcesContent":["'use client';\n\nimport CheckIcon from '@mui/icons-material/Check';\nimport ChevronDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport GridIcon from '@mui/icons-material/GridViewOutlined';\nimport ListIcon from '@mui/icons-material/FormatListBulletedRounded';\nimport Box from '@mui/material/Box/index.js';\nimport Button from '@mui/material/Button/index.js';\nimport ListItemIcon from '@mui/material/ListItemIcon/index.js';\nimport ListItemText from '@mui/material/ListItemText/index.js';\nimport Menu from '@mui/material/Menu/index.js';\nimport MenuItem from '@mui/material/MenuItem/index.js';\nimport Slider from '@mui/material/Slider/index.js';\n// `SvgIconComponent` is declared inline in @mui/icons-material's barrel and has\n// no module of its own, so the deep-import equivalent is its own definition:\n// `type SvgIconComponent = typeof SvgIcon`.\nimport type SvgIcon from '@mui/material/SvgIcon/index.js';\nimport React, { useState } from 'react';\n\nimport type { ViewMode, ViewSelectorProps } from './ContentToolbar.types';\nimport { fieldRadiusPx } from '../../../tokens/field-radius';\n\nconst VIEW_OPTIONS: { value: ViewMode; label: string; icon: typeof SvgIcon }[] = [\n { value: 'grid', label: 'Grid View', icon: GridIcon },\n { value: 'list', label: 'List View', icon: ListIcon },\n];\n\n/**\n * View selector: a grid/list dropdown plus a card-size zoom slider (grid mode\n * only). Faithful MUI port of the reference toolbar's view control.\n */\nexport function ViewSelector({\n viewMode,\n onViewModeChange,\n zoom,\n onZoomChange,\n cardSizeLabel,\n}: ViewSelectorProps): React.JSX.Element {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const open = Boolean(anchorEl);\n const activeOption = VIEW_OPTIONS.find((option) => option.value === viewMode) ?? VIEW_OPTIONS[0]!;\n const ActiveIcon = activeOption.icon;\n\n return (\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1.5 }}>\n {viewMode === 'grid' && (\n <Box sx={{ width: 96, display: 'flex', alignItems: 'center' }}>\n <Slider\n data-testid=\"resize-card-slider\"\n aria-label={cardSizeLabel}\n value={zoom[0] ?? 0}\n onChange={(_, value) => onZoomChange([value as number])}\n min={0}\n max={100}\n step={1}\n size=\"small\"\n />\n </Box>\n )}\n\n <Button\n data-testid=\"view-mode-btn\"\n variant=\"text\"\n size=\"small\"\n color=\"inherit\"\n aria-label={activeOption.label}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n onClick={(event) => setAnchorEl(event.currentTarget)}\n sx={{ minWidth: 0, height: 32, px: 1, gap: 1, borderRadius: fieldRadiusPx, color: 'text.secondary' }}\n >\n <ActiveIcon sx={{ fontSize: 16 }} />\n <ChevronDownIcon sx={{ fontSize: 14 }} />\n </Button>\n <Menu\n anchorEl={anchorEl}\n open={open}\n onClose={() => setAnchorEl(null)}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n slotProps={{ paper: { sx: { minWidth: 180 } } }}\n >\n {VIEW_OPTIONS.map((option) => {\n const OptionIcon = option.icon;\n const selected = viewMode === option.value;\n return (\n <MenuItem\n key={option.value}\n data-testid={`view-mode-${option.value}`}\n onClick={() => {\n onViewModeChange(option.value);\n setAnchorEl(null);\n }}\n sx={{ gap: 1.5 }}\n >\n <ListItemText>{option.label}</ListItemText>\n <OptionIcon sx={{ fontSize: 16, color: 'text.secondary' }} />\n <ListItemIcon sx={{ minWidth: 'auto !important' }}>\n <CheckIcon sx={{ fontSize: 16, color: selected ? 'text.primary' : 'transparent' }} />\n </ListItemIcon>\n </MenuItem>\n );\n })}\n </Menu>\n </Box>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/navigation/Pagination/PaginationParts.tsx"],"sourcesContent":["import Box from '@mui/material/Box/index.js';\nimport FormControl from '@mui/material/FormControl/index.js';\nimport MenuItem from '@mui/material/MenuItem/index.js';\nimport Select from '@mui/material/Select/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport { styled } from '@mui/material/styles/index.js';\nimport type { FC } from 'react';\nimport React from 'react';\n\nimport { scaleFor } from './Pagination.helpers';\n\n// Kept module-local: styled() components cannot be exported across a module\n// boundary here without tripping TS2742.\nconst ItemsPerPageContainer = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n}));\n\nconst PageInfoContainer = styled(Box)(({ theme }) => ({\n display: 'flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n}));\n\nexport interface ItemsPerPageSelectProps {\n /** The label in front of the select. REQUIRED — it was `\"Show:\"`. */\n pageSizeLabel: string;\n value: number;\n options: number[];\n size: string;\n disabled: boolean;\n testId: string;\n onChange: (value: number) => void;\n}\n\nexport const ItemsPerPageSelect: FC<ItemsPerPageSelectProps> = ({\n pageSizeLabel,\n value,\n options,\n size,\n disabled,\n testId,\n onChange,\n}) => (\n <ItemsPerPageContainer>\n <Typography variant=\"body2\" color=\"text.secondary\">\n {pageSizeLabel}\n </Typography>\n <FormControl size=\"small\" sx={{ minWidth: 80 }}>\n <Select\n value={value}\n onChange={(event) => onChange(event.target.value as number)}\n disabled={disabled}\n data-testid={testId}\n sx={{\n '& .MuiSelect-select': {\n fontSize: scaleFor(size, ['0.875rem', '1rem', '1.125rem']),\n py: scaleFor(size, [0.5, 1, 1.5]),\n },\n }}\n >\n {options.map((option) => (\n <MenuItem key={option} value={option}>\n {option}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n </ItemsPerPageContainer>\n);\n\nexport const PageInfo: FC<{ size: string; testId: string; children: React.ReactNode }> = ({\n size,\n testId,\n children,\n}) => (\n <PageInfoContainer>\n <Typography\n variant=\"body2\"\n color=\"text.secondary\"\n fontSize={scaleFor(size, ['0.75rem', '0.875rem', '1rem'])}\n data-testid={testId}\n >\n {children}\n </Typography>\n </PageInfoContainer>\n);\n"],"mappings":";;;;;AAAA,OAAO,SAAS;AAChB,OAAO,iBAAiB;AACxB,OAAO,cAAc;AACrB,OAAO,YAAY;AACnB,OAAO,gBAAgB;AACvB,SAAS,cAAc;AAwCrB,SACE,KADF;AAhCF,IAAM,wBAAwB,OAAO,GAAG,EAAE,CAAC,EAAE,MAAM,OAAO;AAAA,EACxD,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,KAAK,MAAM,QAAQ,CAAC;AACtB,EAAE;AAEF,IAAM,oBAAoB,OAAO,GAAG,EAAE,CAAC,EAAE,MAAM,OAAO;AAAA,EACpD,SAAS;AAAA,EACT,YAAY;AAAA,EACZ,KAAK,MAAM,QAAQ,CAAC;AACtB,EAAE;AAaK,IAAM,qBAAkD,CAAC;AAAA,EAC9D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MACE,qBAAC,yBACC;AAAA,sBAAC,cAAW,SAAQ,SAAQ,OAAM,kBAC/B,yBACH;AAAA,EACA,oBAAC,eAAY,MAAK,SAAQ,IAAI,EAAE,UAAU,GAAG,GAC3C;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,UAAU,CAAC,UAAU,SAAS,MAAM,OAAO,KAAe;AAAA,MAC1D;AAAA,MACA,eAAa;AAAA,MACb,IAAI;AAAA,QACF,uBAAuB;AAAA,UACrB,UAAU,SAAS,MAAM,CAAC,YAAY,QAAQ,UAAU,CAAC;AAAA,UACzD,IAAI,SAAS,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC;AAAA,QAClC;AAAA,MACF;AAAA,MAEC,kBAAQ,IAAI,CAAC,WACZ,oBAAC,YAAsB,OAAO,QAC3B,oBADY,MAEf,CACD;AAAA;AAAA,EACH,GACF;AAAA,GACF;AAGK,IAAM,WAA4E,CAAC;AAAA,EACxF;AAAA,EACA;AAAA,EACA;AACF,MACE,oBAAC,qBACC;AAAA,EAAC;AAAA;AAAA,IACC,SAAQ;AAAA,IACR,OAAM;AAAA,IACN,UAAU,SAAS,MAAM,CAAC,WAAW,YAAY,MAAM,CAAC;AAAA,IACxD,eAAa;AAAA,IAEZ;AAAA;AACH,GACF;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/layout/ContentToolbar/ColumnsMenu.tsx"],"sourcesContent":["'use client';\n\nimport ColumnsIcon from '@mui/icons-material/ViewColumnRounded';\nimport Box from '@mui/material/Box/index.js';\nimport Checkbox from '@mui/material/Checkbox/index.js';\nimport IconButton from '@mui/material/IconButton/index.js';\nimport ListSubheader from '@mui/material/ListSubheader/index.js';\nimport Menu from '@mui/material/Menu/index.js';\nimport MenuItem from '@mui/material/MenuItem/index.js';\nimport React, { useState } from 'react';\n\nimport type { ColumnVisibilityOption, ColumnsMenuProps } from './ContentToolbar.types';\nimport { fieldRadiusPx } from '../../../tokens/field-radius';\n\n/** One column checkbox row; toggling never closes the menu. */\nfunction ColumnRow({\n option,\n onToggle,\n testId,\n}: {\n option: ColumnVisibilityOption;\n onToggle: (id: string, visible: boolean) => void;\n testId?: string;\n}): React.JSX.Element {\n return (\n <MenuItem\n data-testid={testId}\n onClick={() => onToggle(option.id, !option.visible)}\n disabled={option.locked}\n sx={{ gap: 1 }}\n >\n <Checkbox\n checked={option.visible}\n size=\"small\"\n disableRipple\n sx={{ p: 0, pointerEvents: 'none' }}\n tabIndex={-1}\n />\n <Box component=\"span\" sx={{ flex: 1, minWidth: 0, textAlign: 'left' }}>\n {option.label}\n </Box>\n </MenuItem>\n );\n}\n\n/**\n * Stateless column-visibility selector: a neutral icon button (matching\n * {@link FilterTrigger}/{@link SortByDropdown}) opening a checkbox list of the\n * hideable columns. Purely presentational — the caller owns the visibility state\n * and is notified via `onToggle`. The menu stays open while toggling so several\n * columns can be flipped at once.\n */\nexport function ColumnsMenu({\n columns,\n onToggle,\n title = 'Columns',\n ariaLabel = 'Toggle columns',\n 'data-testid': testId,\n}: ColumnsMenuProps): React.JSX.Element {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const open = Boolean(anchorEl);\n const close = (): void => setAnchorEl(null);\n\n return (\n <>\n <IconButton\n size=\"small\"\n data-testid={testId}\n aria-label={ariaLabel}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n onClick={(event) => setAnchorEl(event.currentTarget)}\n sx={{\n width: 32,\n height: 32,\n borderRadius: fieldRadiusPx,\n color: 'text.secondary',\n bgcolor: open ? 'action.selected' : 'transparent',\n }}\n >\n <ColumnsIcon sx={{ fontSize: 16 }} />\n </IconButton>\n <Menu\n anchorEl={anchorEl}\n open={open}\n onClose={close}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n slotProps={{ paper: { sx: { minWidth: 200 } } }}\n >\n <ListSubheader sx={{ px: 1.5, py: 0.75, fontSize: '0.75rem', fontWeight: 600, color: 'text.primary', lineHeight: 1.5 }}>\n {title}\n </ListSubheader>\n {columns.map((option) => (\n <ColumnRow\n key={option.id}\n option={option}\n onToggle={onToggle}\n testId={testId ? `${testId}-${option.id}` : undefined}\n />\n ))}\n </Menu>\n </>\n );\n}\n"],"mappings":";;;;;AAEA,OAAO,iBAAiB;AACxB,OAAO,SAAS;AAChB,OAAO,cAAc;AACrB,OAAO,gBAAgB;AACvB,OAAO,mBAAmB;AAC1B,OAAO,UAAU;AACjB,OAAO,cAAc;AACrB,SAAgB,gBAAgB;AAgB5B,SAuCA,UAjCE,KANF;AAVJ,SAAS,UAAU;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AACF,GAIsB;AACpB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAa;AAAA,MACb,SAAS,MAAM,SAAS,OAAO,IAAI,CAAC,OAAO,OAAO;AAAA,MAClD,UAAU,OAAO;AAAA,MACjB,IAAI,EAAE,KAAK,EAAE;AAAA,MAEb;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAS,OAAO;AAAA,YAChB,MAAK;AAAA,YACL,eAAa;AAAA,YACb,IAAI,EAAE,GAAG,GAAG,eAAe,OAAO;AAAA,YAClC,UAAU;AAAA;AAAA,QACZ;AAAA,QACA,oBAAC,OAAI,WAAU,QAAO,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,WAAW,OAAO,GACjE,iBAAO,OACV;AAAA;AAAA;AAAA,EACF;AAEJ;AASO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,eAAe;AACjB,GAAwC;AACtC,QAAM,CAAC,UAAU,WAAW,IAAI,SAA6B,IAAI;AACjE,QAAM,OAAO,QAAQ,QAAQ;AAC7B,QAAM,QAAQ,MAAY,YAAY,IAAI;AAE1C,SACE,iCACE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,eAAa;AAAA,QACb,cAAY;AAAA,QACZ,iBAAc;AAAA,QACd,iBAAe;AAAA,QACf,SAAS,CAAC,UAAU,YAAY,MAAM,aAAa;AAAA,QACnD,IAAI;AAAA,UACF,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,cAAc;AAAA,UACd,OAAO;AAAA,UACP,SAAS,OAAO,oBAAoB;AAAA,QACtC;AAAA,QAEA,8BAAC,eAAY,IAAI,EAAE,UAAU,GAAG,GAAG;AAAA;AAAA,IACrC;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,SAAS;AAAA,QACT,cAAc,EAAE,UAAU,UAAU,YAAY,QAAQ;AAAA,QACxD,iBAAiB,EAAE,UAAU,OAAO,YAAY,QAAQ;AAAA,QACxD,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,IAAI,EAAE,EAAE;AAAA,QAE9C;AAAA,8BAAC,iBAAc,IAAI,EAAE,IAAI,KAAK,IAAI,MAAM,UAAU,WAAW,YAAY,KAAK,OAAO,gBAAgB,YAAY,IAAI,GAClH,iBACH;AAAA,UACC,QAAQ,IAAI,CAAC,WACZ;AAAA,YAAC;AAAA;AAAA,cAEC;AAAA,cACA;AAAA,cACA,QAAQ,SAAS,GAAG,MAAM,IAAI,OAAO,EAAE,KAAK;AAAA;AAAA,YAHvC,OAAO;AAAA,UAId,CACD;AAAA;AAAA;AAAA,IACH;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/DataViews/data-views-range-pill.tsx"],"sourcesContent":["'use client';\n\n/**\n * A range filter as a PILL in the inline filter bar — the same affordance the\n * multi-select facets use, so \"Data\" and \"Valor\" sit in the filter row beside\n * \"Pagamento\"/\"Situação\"/\"Método\" instead of floating above the grid.\n *\n * Before this the inline bar rendered pills only, and `rangeFields` had a\n * surface on the slide-in panel alone — which `inlineFilters` REPLACES on a wide\n * screen. So a range filter was invisible on exactly the screens that use it,\n * and a page wanting one had to hang its own inputs outside the grid, outside\n * `DataViewState`, and outside the grid's \"Limpar filtros\" (FUT-668).\n */\nimport CloseIcon from '@mui/icons-material/Close';\nimport ChevronDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport Box from '@mui/material/Box/index.js';\nimport Button from '@mui/material/Button/index.js';\nimport Popover from '@mui/material/Popover/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport React, { useState } from 'react';\n\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\nimport { TableFilter } from '../../layout/TableFilter';\nimport { DayBoundInput } from './data-views-day-input';\nimport { NumberBoundInput } from './data-views-number-input';\nimport { RangePresets } from './data-views-preset-chips';\nimport { presetsFor } from './data-views-range-presets';\nimport {\n isRangeInverted,\n isRangeSet,\n numericRange,\n rangeChipLabel,\n} from './data-views-range-values';\nimport type { RangeFieldConfig, RangeValue } from './data-views-types';\nimport { fieldRadiusPx } from '../../../tokens/field-radius';\n\n\n\n/**\n * One end of the range. A day keeps its `AAAA-MM-DD` string verbatim (the form\n * both the field and the backend speak) and is typed through the masked\n * `dd/mm/aaaa` field rather than a native date input — see\n * {@link DayBoundInput} for why. A number parses, and an unparseable/blank\n * entry CLEARS the bound rather than writing `NaN`.\n */\nfunction BoundField<T extends Record<string, unknown>>({\n field,\n label,\n value,\n onChange,\n testId,\n}: {\n field: RangeFieldConfig<T>;\n label: string;\n value: number | string | undefined;\n onChange: (bound: number | string | undefined) => void;\n testId: string;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n if (field.kind === 'day') {\n return (\n <DayBoundInput\n mask={copy.filters.dayMask}\n label={label}\n value={value == null ? undefined : String(value)}\n onChange={onChange}\n testId={testId}\n />\n );\n }\n return (\n <NumberBoundInput\n label={label}\n value={value}\n unit={field.unit}\n onChange={onChange}\n testId={testId}\n />\n );\n}\n\n\n/**\n * The `De`/`Até` pair for a range — shared by the pill's popover and the\n * slide-in panel's day fields, so the two surfaces cannot drift on what a bound\n * accepts or how it clears.\n */\nexport function RangeBounds<T extends Record<string, unknown>>({\n field,\n value,\n onChange,\n testId,\n}: {\n field: RangeFieldConfig<T>;\n value: RangeValue;\n onChange: (range: RangeValue) => void;\n testId: string;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n const inverted = isRangeInverted(value);\n return (\n <Box data-testid={`${testId}-panel`}>\n {/* Above the inputs, not below: the presets are the answer for most\n merchants, and the two date pickers are the escape hatch. */}\n <Box sx={{ '&:not(:empty)': { mb: 1.5 } }}>\n <RangePresets presets={presetsFor(field, copy)} value={value} onChange={onChange} testId={testId} />\n </Box>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 1.5 }}>\n <BoundField\n field={field}\n label={copy.filters.rangeStart}\n value={value.min}\n onChange={(min) => onChange({ ...value, min })}\n testId={`${testId}-min`}\n />\n <BoundField\n field={field}\n label={copy.filters.rangeEnd}\n value={value.max}\n onChange={(max) => onChange({ ...value, max })}\n testId={`${testId}-max`}\n />\n </Box>\n {inverted && (\n <Typography\n component=\"p\"\n data-testid={`${testId}-inverted`}\n sx={{ mt: 0.75, fontSize: '0.75rem', color: 'error.main' }}\n >\n {copy.filters.rangeInvalid}\n </Typography>\n )}\n {/* BOTH days are in the result. Saying so is FUT-668's other half: the\n bounds compare as ISO strings precisely so `até` keeps its whole day,\n and nothing on screen would otherwise tell the merchant that. */}\n {field.kind === 'day' && !inverted && (\n <Typography\n component=\"p\"\n data-testid={`${testId}-inclusive`}\n sx={{ mt: 0.75, fontSize: '0.75rem', color: 'text.disabled' }}\n >\n {copy.filters.rangeInclusiveNote}\n </Typography>\n )}\n </Box>\n );\n}\n\n/**\n * The pill + its popover. Bounds commit on change (the list is server-driven, so\n * each edit is a query) and the popover stays open, which is what lets a\n * merchant set \"de\" and then \"até\" without re-opening it.\n */\n/** An applied range clears from the pill itself — re-opening to empty two fields is three gestures for one intent. */\nfunction ClearAffordance({\n label,\n onClear,\n testId,\n}: {\n label: string;\n onClear: () => void;\n testId: string;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n const clear = (event: React.SyntheticEvent): void => {\n event.stopPropagation();\n onClear();\n };\n return (\n <Box\n component=\"span\"\n role=\"button\"\n tabIndex={0}\n aria-label={copy.filters.clearRange(label)}\n data-testid={testId}\n onClick={clear}\n onKeyDown={(event: React.KeyboardEvent) => {\n if (event.key !== 'Enter' && event.key !== ' ') return;\n event.preventDefault();\n clear(event);\n }}\n sx={{ display: 'inline-flex', borderRadius: 999, p: 0.125, '&:hover': { bgcolor: 'action.selected' } }}\n >\n <CloseIcon sx={{ fontSize: 14 }} />\n </Box>\n );\n}\n\n/** The pill button: its label carries the applied window, and its tone the state. */\nfunction RangeTrigger<T extends Record<string, unknown>>({\n field,\n value,\n onChange,\n onOpen,\n open,\n testId,\n}: {\n field: RangeFieldConfig<T>;\n value: RangeValue;\n onChange: (range: RangeValue) => void;\n onOpen: (anchor: HTMLElement) => void;\n open: boolean;\n testId: string;\n}): React.JSX.Element {\n const active = isRangeSet(value);\n const inverted = isRangeInverted(value);\n // An INVERTED window gets its own tone rather than the ordinary \"applied\"\n // one: it is applied, and it matches nothing, and those are different states.\n const tone = inverted ? 'error.main' : active ? 'primary.main' : 'divider';\n return (\n <Button\n variant=\"outlined\"\n color=\"inherit\"\n size=\"small\"\n data-testid={testId}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n onClick={(event) => onOpen(event.currentTarget)}\n // ✕ FIRST, chevron LAST — the same shape as every other pill. It used to\n // replace the chevron at the end, so a range pill and a multi-select pill\n // put the clear in different places, and an applied range lost the\n // affordance that says it opens.\n startIcon={\n active ? (\n <ClearAffordance label={field.label} onClear={() => onChange({})} testId={`${testId}-clear-inline`} />\n ) : undefined\n }\n endIcon={<ChevronDownIcon sx={{ fontSize: 16 }} />}\n sx={{\n borderRadius: fieldRadiusPx,\n height: 34,\n px: 1.5,\n maxWidth: 280,\n color: inverted ? 'error.main' : 'text.primary',\n fontWeight: 600,\n fontSize: '0.8125rem',\n textTransform: 'none',\n whiteSpace: 'nowrap',\n borderColor: tone,\n bgcolor: active ? 'action.selected' : 'background.paper',\n '&:hover': {\n borderColor: active ? tone : 'text.primary',\n bgcolor: active ? 'action.selected' : 'action.hover',\n },\n }}\n >\n {/* The applied bounds, in the label — a pill reading only \"Valor\" hides\n the very thing that is narrowing the list. */}\n <Box component=\"span\" sx={{ overflow: 'hidden', textOverflow: 'ellipsis' }}>\n {active ? rangeChipLabel(field, value) : field.label}\n </Box>\n </Button>\n );\n}\n\nexport function RangePill<T extends Record<string, unknown>>({\n field,\n value,\n onChange,\n onOpenChange,\n testIdPrefix,\n}: {\n field: RangeFieldConfig<T>;\n value: RangeValue;\n onChange: (range: RangeValue) => void;\n /** So a measured toolbar can hold still while this is open. */\n onOpenChange?: (open: boolean) => void;\n testIdPrefix: string;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n const [anchor, setAnchor] = useState<HTMLElement | null>(null);\n const active = isRangeSet(value);\n const testId = `${testIdPrefix}-range-${field.id}`;\n return (\n <>\n <RangeTrigger\n field={field}\n value={value}\n onChange={onChange}\n onOpen={(element) => {\n setAnchor(element);\n onOpenChange?.(true);\n }}\n open={Boolean(anchor)}\n testId={testId}\n />\n <Popover\n open={Boolean(anchor)}\n anchorEl={anchor}\n onClose={() => {\n setAnchor(null);\n onOpenChange?.(false);\n }}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n slotProps={{ paper: { sx: { p: 2, mt: 0.5 } } }}\n >\n <RangeBounds field={field} value={value} onChange={onChange} testId={testId} />\n {/* An inverted window is not an error the merchant must fix before the\n list responds — it simply matches nothing, and saying so beats an\n empty grid with no explanation (FUT-668). */}\n {active && (\n <Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between', gap: 2, mt: 1.5 }}>\n <Typography component=\"span\" sx={{ fontSize: '0.75rem', color: 'text.secondary' }}>\n {rangeChipLabel(field, value)}\n </Typography>\n <Button\n variant=\"text\"\n size=\"small\"\n onClick={() => onChange({})}\n data-testid={`${testId}-clear`}\n sx={{ textTransform: 'none' }}\n >\n {copy.filters.clear}\n </Button>\n </Box>\n )}\n </Popover>\n </>\n );\n}\n\n\n/**\n * One range on the SLIDE-IN panel (and the narrow-screen modal): the numeric\n * control the panel already had, or — for a day range, which that control cannot\n * express — the same `De`/`Até` pair the pill's popover uses.\n */\nexport function PanelRangeField<T extends Record<string, unknown>>({\n field,\n value,\n onChange,\n testId,\n}: {\n field: RangeFieldConfig<T>;\n value: RangeValue;\n onChange: (range: RangeValue) => void;\n testId: string;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n if (field.kind === \"day\") {\n return (\n <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: 1 }}>\n <Typography component=\"span\" sx={{ fontSize: \"0.75rem\", fontWeight: 500, color: \"text.secondary\" }}>\n {field.label}\n </Typography>\n <RangeBounds field={field} value={value} onChange={onChange} testId={testId} />\n </Box>\n );\n }\n return (\n <Box sx={{ display: \"flex\", flexDirection: \"column\", gap: 1 }}>\n <TableFilter.RangeField\n label={field.label}\n unit={field.unit}\n value={numericRange(value)}\n onChange={(range) => onChange(range)}\n testId={testId}\n />\n {/* Below the numeric control here, unlike the pill's popover: this one\n renders its own label, and chips above it would separate the label\n from the field it names. */}\n <RangePresets presets={presetsFor(field, copy)} value={value} onChange={onChange} testId={testId} />\n </Box>\n );\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tokens/theme.ts"],"sourcesContent":["import { darken, lighten } from './color';\nimport { contrastText, DARK_TEXT_PRIMARY, inkOver } from './ink-over';\n\n/*\n RE-EXPORTED rather than moved out of the public surface. Both were published\n from here, and `ink-over.ts` exists because this file reached the 400-line cap\n — a caller should not have to learn that.\n*/\nexport { contrastText, inkOver };\nimport { cssLengthToPx, cssTrackingToEm } from './css-units';\nimport { DEFAULT_FIELD_RADIUS } from './field-radius.core';\nimport { HEADING_SCALE, type HeadingLevel } from './heading-scale';\n\nimport type { SizeValue } from './vocabulary';\n\n/**\n * THE THEME BOTH RENDERERS READ.\n *\n * On the web every component styles itself from MUI's `Theme`, which is built\n * by the host (`@12-apps/app-shell`'s `createAppTheme` in the origin apps) and\n * reaches a component through emotion's context. React Native has no emotion,\n * no CSS and no MUI, so a native `Button` needs the same decisions — the\n * palette, the spacing unit, the radius, the type scale — from somewhere that\n * does not import a renderer.\n *\n * This is that somewhere. `UiTheme` is a plain object of numbers and colour\n * strings. `createUiTheme` derives it the way MUI's `createPalette` derives its\n * own: a `light` shade is `lighten(main, 0.2)`, a `dark` shade `darken(main,\n * 0.3)`, `contrastText` flips at a 3:1 ratio against `rgba(0, 0, 0, 0.87)`.\n * Same seeds in, same shades out, on both sides — that is the whole basis for\n * a native button being the web button's colour and not a near miss.\n *\n * Numbers are in px on the web and dp on native; both are the CSS-pixel unit\n * a design is drawn in, so a `fontSize: 16` here IS `1rem` in a web style\n * and `16` in a `StyleSheet`. The web components keep their `rem` strings and\n * derive them from these numbers where the two meet (see `px()` below and the\n * `*.metrics.ts` file beside each ported component).\n *\n * `danger` and `neutral` are this package's names (see `./scales`); `danger`\n * is MUI's `error` and `neutral` is drawn from the grey ramp the way\n * `Button.styles.ts` has always drawn it.\n */\n\nexport type UiThemeMode = 'light' | 'dark';\n\nexport interface UiPaletteColor {\n main: string;\n light: string;\n dark: string;\n contrastText: string;\n}\n\nexport type UiGreyStep = 50 | 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900;\n\nexport interface UiPalette {\n mode: UiThemeMode;\n primary: UiPaletteColor;\n secondary: UiPaletteColor;\n success: UiPaletteColor;\n warning: UiPaletteColor;\n info: UiPaletteColor;\n danger: UiPaletteColor;\n neutral: UiPaletteColor;\n text: { primary: string; secondary: string; disabled: string };\n background: { default: string; paper: string };\n divider: string;\n action: {\n active: string;\n hover: string;\n selected: string;\n disabled: string;\n disabledBackground: string;\n focus: string;\n };\n grey: Record<UiGreyStep, string>;\n}\n\n/** One step of the body scale: `fontSize` in px, `lineHeight` as a ratio. */\nexport interface UiTypeStep {\n fontSize: number;\n lineHeight: number;\n}\n\nexport type UiFontWeight = 'light' | 'normal' | 'medium' | 'semibold' | 'bold';\n\nexport interface UiHeadingStep extends UiTypeStep {\n /** In em, so it scales with the step. `undefined` is \"normal\". */\n letterSpacing?: number;\n normalWeight: number;\n}\n\nexport interface UiTypography {\n /**\n * Native has no fallback stacks: a font is either installed and named, or\n * `undefined` and the platform's own. The web default is MUI's Roboto stack.\n */\n fontFamily: string | undefined;\n monospaceFontFamily: string | undefined;\n sizes: Record<SizeValue, UiTypeStep>;\n weights: Record<UiFontWeight, number>;\n heading: Record<HeadingLevel, UiHeadingStep>;\n}\n\nexport interface UiTheme {\n mode: UiThemeMode;\n palette: UiPalette;\n /** MUI's `theme.spacing(n)`: `n` units of {@link UiTheme.spacingUnit}, in px. */\n spacing: (units: number) => number;\n spacingUnit: number;\n /**\n * `md` is MUI's `shape.borderRadius`; `sm`–`xl` are its halves and doubles.\n * `field` is not on that scale: it is the one corner every field is drawn\n * with (see `./field-radius.core`), MUI's `theme.fieldRadius` on the web.\n */\n radius: { sm: number; md: number; lg: number; xl: number; full: number; field: number };\n typography: UiTypography;\n zIndex: { appBar: number; drawer: number; modal: number; snackbar: number; tooltip: number };\n}\n\n/** A seed for one palette slot: a hex `main`, or any subset of the four shades. */\nexport type UiPaletteSeed = string | Partial<UiPaletteColor>;\n\nexport interface UiThemeOptions {\n mode?: UiThemeMode;\n palette?: Partial<{\n primary: UiPaletteSeed;\n secondary: UiPaletteSeed;\n success: UiPaletteSeed;\n warning: UiPaletteSeed;\n info: UiPaletteSeed;\n danger: UiPaletteSeed;\n background: Partial<UiPalette['background']>;\n }>;\n typography?: Partial<Pick<UiTypography, 'fontFamily' | 'monospaceFontFamily'>>;\n spacingUnit?: number;\n /** The radius every field is drawn with, in dp. Defaults to {@link DEFAULT_FIELD_RADIUS}. */\n fieldRadius?: number;\n}\n\nconst ROOT_FONT_PX = 16;\n\n/** The px value as the rem string the web components write. */\nexport const px = (value: number): string => `${value / ROOT_FONT_PX}rem`;\n\n/** MUI's `createPalette` default tonal offset, exactly. */\nconst TONAL_OFFSET = 0.2;\n\nexport const GREY: Record<UiGreyStep, string> = {\n 50: '#fafafa',\n 100: '#f5f5f5',\n 200: '#eeeeee',\n 300: '#e0e0e0',\n 400: '#bdbdbd',\n 500: '#9e9e9e',\n 600: '#757575',\n 700: '#616161',\n 800: '#424242',\n 900: '#212121',\n};\n\n/**\n * The platform's own seeds. The pair `@12-apps/ui`'s Storybook preview and\n * `@12-apps/app-shell`'s `DEFAULT_THEME_TOKENS` both carry — keep the three in\n * step if the design tokens change.\n */\nexport const DEFAULT_BRAND: Record<UiThemeMode, { primary: string; secondary: string }> = {\n light: { primary: '#6366F1', secondary: '#8B5CF6' },\n dark: { primary: '#818CF8', secondary: '#A78BFA' },\n};\n\n/** MUI's semantic defaults per mode. These are declared shades, not derived. */\nconst SEMANTIC_DEFAULTS: Record<\n UiThemeMode,\n Record<'success' | 'warning' | 'info' | 'danger', UiPaletteColor>\n> = {\n light: {\n success: { main: '#2e7d32', light: '#4caf50', dark: '#1b5e20', contrastText: '#fff' },\n warning: { main: '#ed6c02', light: '#ff9800', dark: '#e65100', contrastText: '#fff' },\n info: { main: '#0288d1', light: '#03a9f4', dark: '#01579b', contrastText: '#fff' },\n danger: { main: '#d32f2f', light: '#ef5350', dark: '#c62828', contrastText: '#fff' },\n },\n dark: {\n success: { main: '#66bb6a', light: '#81c784', dark: '#388e3c', contrastText: DARK_TEXT_PRIMARY },\n warning: { main: '#ffa726', light: '#ffb74d', dark: '#f57c00', contrastText: DARK_TEXT_PRIMARY },\n info: { main: '#29b6f6', light: '#4fc3f7', dark: '#0288d1', contrastText: DARK_TEXT_PRIMARY },\n danger: { main: '#f44336', light: '#e57373', dark: '#d32f2f', contrastText: '#fff' },\n },\n};\n\nconst MODE_DEFAULTS: Record<\n UiThemeMode,\n Pick<UiPalette, 'text' | 'background' | 'divider' | 'action'>\n> = {\n light: {\n text: { primary: DARK_TEXT_PRIMARY, secondary: 'rgba(0, 0, 0, 0.6)', disabled: 'rgba(0, 0, 0, 0.38)' },\n background: { default: '#fff', paper: '#fff' },\n divider: 'rgba(0, 0, 0, 0.12)',\n action: {\n active: 'rgba(0, 0, 0, 0.54)',\n hover: 'rgba(0, 0, 0, 0.04)',\n selected: 'rgba(0, 0, 0, 0.08)',\n disabled: 'rgba(0, 0, 0, 0.26)',\n disabledBackground: 'rgba(0, 0, 0, 0.12)',\n focus: 'rgba(0, 0, 0, 0.12)',\n },\n },\n dark: {\n text: { primary: '#fff', secondary: 'rgba(255, 255, 255, 0.7)', disabled: 'rgba(255, 255, 255, 0.5)' },\n background: { default: '#121212', paper: '#121212' },\n divider: 'rgba(255, 255, 255, 0.12)',\n action: {\n active: '#fff',\n hover: 'rgba(255, 255, 255, 0.08)',\n selected: 'rgba(255, 255, 255, 0.16)',\n disabled: 'rgba(255, 255, 255, 0.3)',\n disabledBackground: 'rgba(255, 255, 255, 0.12)',\n focus: 'rgba(255, 255, 255, 0.12)',\n },\n },\n};\n\n\n/**\n * MUI's `augmentColor` for a custom colour: derive whatever shade the seed\n * left out. `light` is one tonal offset up, `dark` one and a half down.\n */\nexport function augmentColor(seed: UiPaletteSeed): UiPaletteColor {\n const partial = typeof seed === 'string' ? { main: seed } : seed;\n const main = partial.main ?? partial.light ?? partial.dark;\n if (!main) {\n throw new Error('@12-apps/ui: a palette seed needs at least a `main` colour.');\n }\n return {\n main,\n light: partial.light ?? lighten(main, TONAL_OFFSET),\n dark: partial.dark ?? darken(main, TONAL_OFFSET * 1.5),\n contrastText: partial.contrastText ?? contrastText(main),\n };\n}\n\nconst semantic = (\n mode: UiThemeMode,\n key: 'success' | 'warning' | 'info' | 'danger',\n seed: UiPaletteSeed | undefined,\n): UiPaletteColor => (seed === undefined ? SEMANTIC_DEFAULTS[mode][key] : augmentColor(seed));\n\n/** `neutral` as `accentFor` in `./scales` has always drawn it: three greys and white. */\nexport const NEUTRAL: UiPaletteColor = {\n main: GREY[600],\n light: GREY[400],\n dark: GREY[800],\n contrastText: '#fff',\n};\n\n/** The body scale `Text` renders, in px. `Text.tsx`'s rem map is this, divided by 16. */\nexport const TYPE_SIZES: Record<SizeValue, UiTypeStep> = {\n xs: { fontSize: 12, lineHeight: 1.2 },\n sm: { fontSize: 14, lineHeight: 1.3 },\n md: { fontSize: 16, lineHeight: 1.5 },\n lg: { fontSize: 18, lineHeight: 1.4 },\n xl: { fontSize: 20, lineHeight: 1.3 },\n};\n\nexport const FONT_WEIGHTS: Record<UiFontWeight, number> = {\n light: 300,\n normal: 400,\n medium: 500,\n semibold: 600,\n bold: 700,\n};\n\n// `HEADING_SCALE` speaks CSS, this theme speaks numbers; `./css-units` is the\n// one place that conversion is written.\nconst HEADING_STEPS = Object.fromEntries(\n Object.entries(HEADING_SCALE).map(([level, metrics]) => [\n level,\n {\n fontSize: cssLengthToPx(metrics.fontSize, ROOT_FONT_PX),\n lineHeight: metrics.lineHeight,\n letterSpacing: cssTrackingToEm(metrics.letterSpacing),\n normalWeight: metrics.normalWeight,\n },\n ]),\n) as Record<HeadingLevel, UiHeadingStep>;\n\nexport const WEB_FONT_FAMILY = '\"Roboto\", \"Helvetica\", \"Arial\", sans-serif';\nexport const WEB_MONOSPACE_FONT_FAMILY = 'Monaco, Menlo, \"Ubuntu Mono\", \"Courier New\", monospace';\n\n/**\n * Build the theme. Every field is derived here so a host that changes one\n * seed gets every dependent shade recomputed, on both renderers, identically.\n */\nexport function createUiTheme(options: UiThemeOptions = {}): UiTheme {\n const mode = options.mode ?? 'light';\n const seeds = options.palette ?? {};\n const brand = DEFAULT_BRAND[mode];\n const defaults = MODE_DEFAULTS[mode];\n const spacingUnit = options.spacingUnit ?? 8;\n\n const palette: UiPalette = {\n mode,\n primary: augmentColor(seeds.primary ?? brand.primary),\n secondary: augmentColor(seeds.secondary ?? brand.secondary),\n success: semantic(mode, 'success', seeds.success),\n warning: semantic(mode, 'warning', seeds.warning),\n info: semantic(mode, 'info', seeds.info),\n danger: semantic(mode, 'danger', seeds.danger),\n neutral: NEUTRAL,\n text: defaults.text,\n background: { ...defaults.background, ...seeds.background },\n divider: defaults.divider,\n action: defaults.action,\n grey: GREY,\n };\n\n return {\n mode,\n palette,\n spacing: (units: number) => units * spacingUnit,\n spacingUnit,\n radius: { sm: 2, md: 4, lg: 8, xl: 16, full: 9999, field: options.fieldRadius ?? DEFAULT_FIELD_RADIUS },\n typography: {\n fontFamily: options.typography?.fontFamily,\n monospaceFontFamily: options.typography?.monospaceFontFamily,\n sizes: TYPE_SIZES,\n weights: FONT_WEIGHTS,\n heading: HEADING_STEPS,\n },\n zIndex: { appBar: 1100, drawer: 1200, modal: 1300, snackbar: 1400, tooltip: 1500 },\n };\n}\n\n/** The palette slot a house colour name resolves to. */\nexport type UiPaletteKey = 'primary' | 'secondary' | 'success' | 'warning' | 'info' | 'danger' | 'neutral';\n\nexport const DEFAULT_UI_THEME: UiTheme = createUiTheme();\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/form/AddressAutocomplete/AddressTextField.tsx"],"sourcesContent":["import type { TextFieldProps } from '@mui/material/TextField/index.js';\nimport TextField from '@mui/material/TextField/index.js';\nimport { alpha, styled } from '@mui/material/styles/index.js';\nimport type { FC } from 'react';\nimport React from 'react';\n\nimport type { AddressAutocompleteProps } from './AddressAutocomplete.types';\n\nimport { fieldEdge } from '../../../tokens/field-edge';\nimport { fieldRadius, fieldRootStyles } from '../../../tokens/field-radius';\n\n// Kept module-local on purpose: the inferred type of a styled() component cannot\n// be named across a module boundary here (TS2742), so the plain component below\n// is what the rest of the folder imports.\nconst GlassTextField = styled(TextField)(({ theme }) => ({\n '& .MuiOutlinedInput-root': {\n borderRadius: fieldRadius(theme),\n background: `linear-gradient(135deg, ${alpha(theme.palette.background.paper, 0.8)} 0%, ${alpha(theme.palette.background.paper, 0.6)} 100%)`,\n backdropFilter: 'blur(10px)',\n WebkitBackdropFilter: 'blur(10px)',\n border: `1px solid ${fieldEdge(theme)}`,\n transition: theme.transitions.create(['border-color', 'box-shadow', 'background']),\n '&:hover': {\n background: `linear-gradient(135deg, ${alpha(theme.palette.background.paper, 0.9)} 0%, ${alpha(theme.palette.background.paper, 0.7)} 100%)`,\n borderColor: theme.palette.primary.main,\n },\n '&.Mui-focused': {\n background: theme.palette.background.paper,\n boxShadow: `0 0 0 2px ${alpha(theme.palette.primary.main, 0.25)}`,\n },\n '& fieldset': {\n border: 'none',\n },\n },\n}));\n\n/** The plain variants: MUI's own field, on the theme's field radius. */\nconst FieldTextField = styled(TextField)(({ theme }) => fieldRootStyles(theme));\n\nexport type AddressTextFieldProps = Omit<TextFieldProps, 'variant'> & {\n addressVariant: AddressAutocompleteProps['variant'];\n};\n\n// 'glass' is not a MUI variant: it renders the outlined field with the frosted\n// treatment on top.\nexport const AddressTextField: FC<AddressTextFieldProps> = ({ addressVariant, ...props }) =>\n addressVariant === 'glass' ? (\n <GlassTextField variant=\"outlined\" {...props} />\n ) : (\n <FieldTextField variant={addressVariant} {...props} />\n );\n"],"mappings":";;;;;;;;;AACA,OAAO,eAAe;AACtB,SAAS,OAAO,cAAc;AA6C1B;AAjCJ,IAAM,iBAAiB,OAAO,SAAS,EAAE,CAAC,EAAE,MAAM,OAAO;AAAA,EACvD,4BAA4B;AAAA,IAC1B,cAAc,YAAY,KAAK;AAAA,IAC/B,YAAY,2BAA2B,MAAM,MAAM,QAAQ,WAAW,OAAO,GAAG,CAAC,QAAQ,MAAM,MAAM,QAAQ,WAAW,OAAO,GAAG,CAAC;AAAA,IACnI,gBAAgB;AAAA,IAChB,sBAAsB;AAAA,IACtB,QAAQ,aAAa,UAAU,KAAK,CAAC;AAAA,IACrC,YAAY,MAAM,YAAY,OAAO,CAAC,gBAAgB,cAAc,YAAY,CAAC;AAAA,IACjF,WAAW;AAAA,MACT,YAAY,2BAA2B,MAAM,MAAM,QAAQ,WAAW,OAAO,GAAG,CAAC,QAAQ,MAAM,MAAM,QAAQ,WAAW,OAAO,GAAG,CAAC;AAAA,MACnI,aAAa,MAAM,QAAQ,QAAQ;AAAA,IACrC;AAAA,IACA,iBAAiB;AAAA,MACf,YAAY,MAAM,QAAQ,WAAW;AAAA,MACrC,WAAW,aAAa,MAAM,MAAM,QAAQ,QAAQ,MAAM,IAAI,CAAC;AAAA,IACjE;AAAA,IACA,cAAc;AAAA,MACZ,QAAQ;AAAA,IACV;AAAA,EACF;AACF,EAAE;AAGF,IAAM,iBAAiB,OAAO,SAAS,EAAE,CAAC,EAAE,MAAM,MAAM,gBAAgB,KAAK,CAAC;AAQvE,IAAM,mBAA8C,CAAC,EAAE,gBAAgB,GAAG,MAAM,MACrF,mBAAmB,UACjB,oBAAC,kBAAe,SAAQ,YAAY,GAAG,OAAO,IAE9C,oBAAC,kBAAe,SAAS,gBAAiB,GAAG,OAAO;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/form/RadioGroup/RadioGroup.styles.ts"],"sourcesContent":["import { alpha } from '@mui/material/styles/index.js';\nimport type { CSSObject, Theme } from '@mui/material/styles/index.js';\n\nimport { glowAnimation, rippleAnimation, scaleAnimation, slideAnimation } from './RadioGroup.animations';\n\nimport { fieldEdge } from '../../../tokens/field-edge';\nimport { fieldRadius } from '../../../tokens/field-radius';\n\n/** The segment track's padding and border: its corner is the segments' plus these. */\nconst SEGMENT_TRACK_PADDING = 4;\nconst SEGMENT_TRACK_BORDER = 1;\n\ninterface ColorPalette {\n main: string;\n dark?: string;\n light?: string;\n contrastText?: string;\n}\n\n/**\n * `neutral` is not a MUI palette entry, so it is built from the grey ramp. The\n * literal fallbacks cover a theme whose grey ramp has been replaced with one\n * that omits these steps.\n */\nconst neutralPalette = (theme: Theme): ColorPalette => ({\n main: theme.palette.grey?.[700] || '#616161',\n dark: theme.palette.grey?.[800] || '#424242',\n light: theme.palette.grey?.[500] || '#9e9e9e',\n contrastText: '#fff',\n});\n\n/** `danger` is this component's name for the error palette; the rest map straight through. */\nconst namedPalette = (theme: Theme, color: string): ColorPalette => {\n const colorMap: Record<string, ColorPalette> = {\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: theme.palette.error,\n };\n\n return colorMap[color] || theme.palette.primary;\n};\n\n/**\n * Resolves a colour name to a full palette, filling any step the theme leaves\n * out from `main` and then from the primary palette. Split into three so the\n * fallback chains do not all count against one function.\n */\nconst getColorFromTheme = (theme: Theme, color: string): ColorPalette => {\n if (color === 'neutral') {\n return neutralPalette(theme);\n }\n\n const palette = namedPalette(theme, color);\n const { primary } = theme.palette;\n\n // namedPalette always yields a palette, so these need no optional chaining;\n // each step still falls back to `main` and then to primary when the theme\n // leaves it out.\n return {\n main: palette.main || primary.main,\n dark: palette.dark || palette.main || primary.dark,\n light: palette.light || palette.main || primary.light,\n contrastText: palette.contrastText || '#fff',\n };\n};\n\ntype SizeKey = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nconst pickSize = <T,>(map: Record<SizeKey, T>, size: string): T => map[size as SizeKey] ?? map.md;\n\nconst CARD_SIZES: Record<SizeKey, CSSObject> = {\n xs: { padding: '8px', minHeight: '60px' },\n sm: { padding: '12px', minHeight: '70px' },\n md: { padding: '16px', minHeight: '80px' },\n lg: { padding: '20px', minHeight: '90px' },\n xl: { padding: '24px', minHeight: '100px' },\n};\n\nconst BUTTON_SIZES: Record<SizeKey, CSSObject> = {\n xs: { padding: '6px 12px', fontSize: '0.75rem', minHeight: '32px' },\n sm: { padding: '8px 16px', fontSize: '0.875rem', minHeight: '36px' },\n md: { padding: '10px 20px', fontSize: '1rem', minHeight: '40px' },\n lg: { padding: '12px 24px', fontSize: '1.125rem', minHeight: '44px' },\n xl: { padding: '14px 28px', fontSize: '1.25rem', minHeight: '48px' },\n};\n\nconst SEGMENT_SIZES: Record<SizeKey, CSSObject> = {\n xs: { padding: '4px 8px', fontSize: '0.75rem' },\n sm: { padding: '6px 12px', fontSize: '0.875rem' },\n md: { padding: '8px 16px', fontSize: '1rem' },\n lg: { padding: '10px 20px', fontSize: '1.125rem' },\n xl: { padding: '12px 24px', fontSize: '1.25rem' },\n};\n\nexport interface SurfaceFlags {\n selected?: boolean;\n customColor?: string;\n glass?: boolean;\n gradient?: boolean;\n glow?: boolean;\n customSize?: string;\n animated?: boolean;\n}\n\nexport const formLabelSx = (theme: Theme, glass?: boolean, error?: boolean): CSSObject => ({\n marginBottom: theme.spacing(2),\n fontWeight: 600,\n color: error ? theme.palette.error.main : theme.palette.text.primary,\n ...(glass && {\n backgroundColor: alpha(theme.palette.background.paper, 0.1),\n backdropFilter: 'blur(10px)',\n padding: '8px 12px',\n borderRadius: '8px',\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n display: 'inline-block',\n }),\n});\n\n/** The card's resting surface, before glass/gradient/glow override parts of it. */\nconst cardBase = (theme: Theme, flags: SurfaceFlags, palette: ColorPalette): CSSObject => {\n const { selected, animated, customSize = 'md' } = flags;\n\n return {\n cursor: 'pointer',\n transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n border: `2px solid ${selected ? palette.main : fieldEdge(theme)}`,\n backgroundColor: selected ? alpha(palette.main, 0.05) : theme.palette.background.paper,\n position: 'relative' as const,\n overflow: 'hidden' as const,\n ...(animated && { animation: `${slideAnimation} 0.4s ease-out` }),\n // A radial wash that grows from the centre as the card is selected or hovered.\n '&::before': {\n content: '\"\"',\n position: 'absolute',\n top: '50%',\n left: '50%',\n width: selected ? '100%' : '0',\n height: selected ? '100%' : '0',\n background: `radial-gradient(circle, ${alpha(palette.main, 0.1)} 0%, transparent 70%)`,\n transform: 'translate(-50%, -50%)',\n transition: 'all 0.5s ease',\n borderRadius: '50%',\n },\n '&:hover': {\n borderColor: palette.main,\n backgroundColor: alpha(palette.main, 0.02),\n transform: 'translateY(-2px) scale(1.02)',\n boxShadow: `${theme.shadows[4]}, 0 10px 30px -5px ${alpha(palette.main, 0.2)}`,\n '&::before': { width: '120%', height: '120%' },\n },\n '&:active': { transform: 'scale(0.98)' },\n ...pickSize(CARD_SIZES, customSize),\n };\n};\n\nexport const radioCardSx = (theme: Theme, flags: SurfaceFlags): CSSObject => {\n const { selected, customColor = 'primary', glass, gradient, glow } = flags;\n const palette = getColorFromTheme(theme, customColor);\n\n return {\n ...cardBase(theme, flags, palette),\n ...(glass && {\n backgroundColor: selected\n ? alpha(palette.main, 0.1)\n : alpha(theme.palette.background.paper, 0.1),\n backdropFilter: 'blur(20px)',\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n }),\n ...(gradient &&\n selected && {\n background: `linear-gradient(135deg, ${alpha(palette.main, 0.1)}, ${alpha(palette.light || palette.main, 0.05)})`,\n borderColor: palette.main,\n }),\n ...(glow &&\n selected && {\n animation: `${glowAnimation} 2s ease-in-out infinite`,\n boxShadow: `0 0 15px ${alpha(palette.main, 0.4)}`,\n }),\n };\n};\n\n/** The pill button's resting surface, before glass/gradient override parts of it. */\nconst buttonBase = (theme: Theme, flags: SurfaceFlags, palette: ColorPalette): CSSObject => {\n const { selected, animated, customSize = 'md' } = flags;\n\n return {\n borderRadius: fieldRadius(theme),\n transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n fontWeight: 500,\n border: `2px solid ${selected ? palette.main : fieldEdge(theme)}`,\n backgroundColor: selected ? palette.main : 'transparent',\n color: selected ? palette.contrastText || '#fff' : theme.palette.text.primary,\n position: 'relative' as const,\n overflow: 'hidden' as const,\n ...(animated && selected && { animation: `${scaleAnimation} 0.3s ease-out` }),\n // Sized to zero until pressed, when the ripple keyframes expand it.\n '&::after': {\n content: '\"\"',\n position: 'absolute',\n top: '50%',\n left: '50%',\n width: 0,\n height: 0,\n borderRadius: '50%',\n backgroundColor: alpha(palette.contrastText || '#fff', 0.3),\n transform: 'translate(-50%, -50%)',\n pointerEvents: 'none' as const,\n },\n '&:active::after': {\n animation: `${rippleAnimation} 0.6s ease-out`,\n width: '100%',\n height: '100%',\n },\n '&:hover': {\n borderColor: palette.main,\n backgroundColor: selected ? palette.dark : alpha(palette.main, 0.1),\n transform: 'translateY(-1px) scale(1.02)',\n boxShadow: `0 4px 12px ${alpha(palette.main, 0.2)}`,\n },\n '&:active': { transform: 'scale(0.98)' },\n ...pickSize(BUTTON_SIZES, customSize),\n };\n};\n\nexport const buttonRadioSx = (theme: Theme, flags: SurfaceFlags): CSSObject => {\n const { selected, customColor = 'primary', glass, gradient } = flags;\n const palette = getColorFromTheme(theme, customColor);\n\n return {\n ...buttonBase(theme, flags, palette),\n ...(glass && {\n backgroundColor: selected\n ? alpha(palette.main, 0.8)\n : alpha(theme.palette.background.paper, 0.1),\n backdropFilter: 'blur(20px)',\n border: `1px solid ${alpha(theme.palette.divider, 0.2)}`,\n }),\n ...(gradient &&\n selected && {\n background: `linear-gradient(135deg, ${palette.main}, ${palette.dark})`,\n border: 'none',\n }),\n };\n};\n\nexport const segmentContainerSx = (\n theme: Theme,\n glass?: boolean,\n customColor = 'primary',\n): CSSObject => {\n const palette = getColorFromTheme(theme, customColor);\n\n return {\n padding: `${SEGMENT_TRACK_PADDING}px`,\n // Concentric with the segments inside it, which take the field radius.\n borderRadius: fieldRadius(theme) + SEGMENT_TRACK_PADDING + SEGMENT_TRACK_BORDER,\n backgroundColor: glass\n ? alpha(theme.palette.background.paper, 0.1)\n : alpha(palette.main, 0.05),\n backdropFilter: glass ? 'blur(20px)' : 'none',\n border: `${SEGMENT_TRACK_BORDER}px solid ${alpha(theme.palette.divider, 0.2)}`,\n display: 'flex',\n gap: '2px',\n };\n};\n\n/**\n * An underline that grows from the centre outwards, and is already full width\n * when the segment is the selected one.\n */\nconst segmentUnderline = (color: string, selected: boolean): CSSObject => ({\n content: '\"\"',\n position: 'absolute',\n bottom: 0,\n left: selected ? 0 : '50%',\n width: selected ? '100%' : 0,\n height: '2px',\n backgroundColor: color,\n transition: 'all 0.3s ease',\n transform: selected ? 'translateX(0)' : 'translateX(-50%)',\n});\n\nexport const segmentButtonSx = (theme: Theme, flags: SurfaceFlags): CSSObject => {\n const { selected, customColor = 'primary', customSize = 'md', animated } = flags;\n const palette = getColorFromTheme(theme, customColor);\n\n return {\n flex: 1,\n borderRadius: fieldRadius(theme),\n transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n fontWeight: 500,\n backgroundColor: selected ? theme.palette.background.paper : 'transparent',\n color: selected ? palette.main : theme.palette.text.secondary,\n boxShadow: selected\n ? `${theme.shadows[2]}, inset 0 1px 3px ${alpha(palette.main, 0.1)}`\n : 'none',\n position: 'relative' as const,\n overflow: 'hidden' as const,\n ...(animated && selected && { animation: `${scaleAnimation} 0.3s ease-out` }),\n '&::before': segmentUnderline(palette.main, Boolean(selected)),\n '&:hover': {\n backgroundColor: selected\n ? theme.palette.background.paper\n : alpha(theme.palette.action.hover, 0.08),\n color: palette.main,\n '&::before': { width: '100%', left: 0, transform: 'translateX(0)' },\n },\n '&:active': { transform: 'scale(0.98)' },\n ...pickSize(SEGMENT_SIZES, customSize),\n };\n};\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/layout/ContentToolbar/SavedViewsMenu.tsx"],"sourcesContent":["'use client';\n\nimport CheckIcon from '@mui/icons-material/Check';\nimport ChevronDownIcon from '@mui/icons-material/KeyboardArrowDown';\nimport KebabIcon from '@mui/icons-material/MoreVert';\nimport ViewIcon from '@mui/icons-material/Visibility';\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 Menu from '@mui/material/Menu/index.js';\nimport MenuItem from '@mui/material/MenuItem/index.js';\nimport Popover from '@mui/material/Popover/index.js';\nimport Stack from '@mui/material/Stack/index.js';\nimport Typography from '@mui/material/Typography/index.js';\nimport React, { useState } from 'react';\n\nimport type {\n SavedViewLike,\n SavedViewsLabels,\n SavedViewsMenuProps,\n} from './ContentToolbar.types';\n\n/** How many non-pinned views show under \"Recentes\". */\nconst RECENT_LIMIT = 5;\n\ninterface RowHandlers<V extends SavedViewLike> {\n apply: (view: V) => void;\n onEdit: (view: V) => void;\n onDelete: (view: V) => void;\n onSetDefault: (view: V) => void;\n onTogglePin: (view: V) => void;\n onToggleShare: (view: V) => void;\n}\n\nfunction DefaultTag({ label, testId }: { label: string; testId: string }): React.JSX.Element {\n return (\n <Box\n component=\"span\"\n data-testid={testId}\n sx={{ px: 0.75, py: 0.125, borderRadius: 1, fontSize: '0.7rem', bgcolor: 'primary.main', color: 'primary.contrastText' }}\n >\n {label}\n </Box>\n );\n}\n\ninterface KebabAction {\n id: string;\n label: string;\n danger?: boolean;\n run: () => void;\n}\n\n/** Build the per-view ⋮ actions; owner-only mutations follow \"Apply\". */\nfunction buildActions<V extends SavedViewLike>(\n view: V,\n handlers: RowHandlers<V>,\n labels: SavedViewsLabels,\n): KebabAction[] {\n const actions: KebabAction[] = [{ id: 'apply', label: labels.apply, run: () => handlers.apply(view) }];\n if (!view.isOwner) return actions;\n if (!view.isDefault) {\n actions.push({ id: 'default', label: labels.setDefault, run: () => handlers.onSetDefault(view) });\n }\n actions.push({ id: 'pin', label: view.pinned ? labels.unpin : labels.pin, run: () => handlers.onTogglePin(view) });\n actions.push({ id: 'share', label: view.shared ? labels.unshare : labels.share, run: () => handlers.onToggleShare(view) });\n actions.push({ id: 'edit', label: labels.edit, run: () => handlers.onEdit(view) });\n actions.push({ id: 'delete', label: labels.remove, danger: true, run: () => handlers.onDelete(view) });\n return actions;\n}\n\nfunction ViewKebab<V extends SavedViewLike>({\n view,\n handlers,\n labels,\n testIdPrefix,\n}: {\n view: V;\n handlers: RowHandlers<V>;\n labels: SavedViewsLabels;\n testIdPrefix: string;\n}): React.JSX.Element {\n const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);\n const close = (): void => setAnchorEl(null);\n return (\n <>\n <IconButton\n size=\"small\"\n aria-label={`${labels.apply} ${view.name}`}\n data-testid={`${testIdPrefix}-kebab-${view.id}`}\n onClick={(event) => setAnchorEl(event.currentTarget)}\n sx={{ width: 28, height: 28, color: 'text.secondary' }}\n >\n <KebabIcon sx={{ fontSize: 16 }} />\n </IconButton>\n <Menu anchorEl={anchorEl} open={Boolean(anchorEl)} onClose={close}>\n {buildActions(view, handlers, labels).map((action) => (\n <MenuItem\n key={action.id}\n data-testid={`${testIdPrefix}-item-${action.id}-${view.id}`}\n onClick={() => {\n action.run();\n close();\n }}\n sx={action.danger ? { color: 'error.main' } : undefined}\n >\n {action.label}\n </MenuItem>\n ))}\n </Menu>\n </>\n );\n}\n\nfunction ViewRow<V extends SavedViewLike>({\n view,\n handlers,\n labels,\n testIdPrefix,\n}: {\n view: V;\n handlers: RowHandlers<V>;\n labels: SavedViewsLabels;\n testIdPrefix: string;\n}): React.JSX.Element {\n return (\n <Stack direction=\"row\" spacing={1} sx={{ alignItems: 'center' }} data-testid={`${testIdPrefix}-row-${view.id}`}>\n <Box\n onClick={() => handlers.apply(view)}\n sx={{ flex: 1, minWidth: 0, cursor: 'pointer', display: 'flex', alignItems: 'center', gap: 0.75 }}\n data-testid={`${testIdPrefix}-apply-${view.id}`}\n >\n <Typography component=\"span\" sx={{ fontSize: '0.875rem' }}>\n {view.name}\n </Typography>\n {view.isDefault && <DefaultTag label={labels.defaultTag} testId={`${testIdPrefix}-default-${view.id}`} />}\n </Box>\n <ViewKebab view={view} handlers={handlers} labels={labels} testIdPrefix={testIdPrefix} />\n </Stack>\n );\n}\n\nfunction ViewSection<V extends SavedViewLike>({\n title,\n list,\n sectionKey,\n handlers,\n labels,\n testIdPrefix,\n}: {\n title: string;\n list: V[];\n sectionKey: string;\n handlers: RowHandlers<V>;\n labels: SavedViewsLabels;\n testIdPrefix: string;\n}): React.JSX.Element | null {\n if (list.length === 0) return null;\n return (\n <Box data-testid={`${testIdPrefix}-section-${sectionKey}`}>\n <Typography component=\"span\" sx={{ fontSize: '0.75rem', fontWeight: 600, color: 'text.secondary' }}>\n {title}\n </Typography>\n <Stack spacing={0.5} sx={{ mt: 0.5 }}>\n {list.map((view) => (\n <ViewRow key={view.id} view={view} handlers={handlers} labels={labels} testIdPrefix={testIdPrefix} />\n ))}\n </Stack>\n </Box>\n );\n}\n\n/** A borderless footer text button (Save current / Manage all). */\nfunction FooterButton({\n label,\n testId,\n onClick,\n}: {\n label: string;\n testId: string;\n onClick: () => void;\n}): React.JSX.Element {\n return (\n <Button variant=\"text\" size=\"small\" color=\"inherit\" onClick={onClick} data-testid={testId} sx={{ textTransform: 'none' }}>\n {label}\n </Button>\n );\n}\n\n/** The popover contents: the built-in Main vision default, saved-view sections, and footer. */\nfunction PopoverBody<V extends SavedViewLike>({\n views,\n pinned,\n recent,\n activeViewName,\n labels,\n handlers,\n onSelectMain,\n onSaveCurrent,\n onManageAll,\n testIdPrefix,\n}: {\n views: V[];\n pinned: V[];\n recent: V[];\n activeViewName?: string;\n labels: SavedViewsLabels;\n handlers: RowHandlers<V>;\n onSelectMain: () => void;\n onSaveCurrent: () => void;\n onManageAll: () => void;\n testIdPrefix: string;\n}): React.JSX.Element {\n return (\n <Stack spacing={1.5} sx={{ p: 1.5, width: 300 }} data-testid={`${testIdPrefix}-popover`}>\n {/* Built-in no-filter default, always available above the saved views. */}\n <MenuItem data-testid={`${testIdPrefix}-main`} selected={!activeViewName} onClick={onSelectMain} sx={{ borderRadius: 1, px: 1, gap: 1 }}>\n <Box component=\"span\" sx={{ flex: 1, minWidth: 0, fontSize: '0.875rem' }}>\n {labels.mainView}\n </Box>\n {!activeViewName && <CheckIcon sx={{ fontSize: 16, color: 'primary.main' }} />}\n </MenuItem>\n {views.length === 0 ? (\n <Typography sx={{ fontSize: '0.75rem', color: 'text.secondary' }}>{labels.empty}</Typography>\n ) : (\n <>\n <ViewSection title={labels.pinned} list={pinned} sectionKey=\"pinned\" handlers={handlers} labels={labels} testIdPrefix={testIdPrefix} />\n <ViewSection title={labels.recent} list={recent} sectionKey=\"recent\" handlers={handlers} labels={labels} testIdPrefix={testIdPrefix} />\n </>\n )}\n <Box sx={{ borderTop: 1, borderColor: 'divider', pt: 1 }}>\n <Stack spacing={0.5} sx={{ alignItems: 'flex-start' }}>\n <FooterButton label={labels.saveCurrent} testId={`${testIdPrefix}-save-current`} onClick={onSaveCurrent} />\n <FooterButton label={labels.manageAll} testId={`${testIdPrefix}-manage-all`} onClick={onManageAll} />\n </Stack>\n </Box>\n </Stack>\n );\n}\n\n/**\n * Stateless saved-views dropdown: a neutral trigger (styled like the sibling\n * toolbar controls) that shows `activeViewName` when a view is applied, else the\n * built-in \"Main vision\" label. The popover lists the Main vision default plus\n * pinned + recent views; a per-view ⋮ exposes owner-only mutations. This\n * component owns NO data — every action is a callback, so a page-level Connector\n * wires it to the backend.\n */\nexport function SavedViewsMenu<V extends SavedViewLike = SavedViewLike>({\n views,\n activeViewName,\n onApply,\n onSelectMain,\n onSaveCurrent,\n onEdit,\n onDelete,\n onSetDefault,\n onTogglePin,\n onToggleShare,\n onManageAll,\n labels: labelOverrides,\n testIdPrefix = 'views',\n}: SavedViewsMenuProps<V>): React.JSX.Element {\n const [anchorEl, setAnchorEl] = useState<HTMLButtonElement | null>(null);\n const close = (): void => setAnchorEl(null);\n const runAndClose = (action: () => void) => (): void => {\n action();\n close();\n };\n const labels = labelOverrides;\n const pinned = views.filter((view) => view.pinned);\n const recent = views.filter((view) => !view.pinned).slice(0, RECENT_LIMIT);\n\n const handlers: RowHandlers<V> = {\n apply: (view) => {\n onApply(view);\n close();\n },\n onEdit,\n onDelete,\n onSetDefault,\n onTogglePin,\n onToggleShare,\n };\n\n return (\n <>\n <Button\n variant=\"text\"\n size=\"small\"\n color=\"inherit\"\n onClick={(event) => setAnchorEl(event.currentTarget)}\n data-testid={`${testIdPrefix}-button`}\n aria-haspopup=\"menu\"\n aria-expanded={Boolean(anchorEl)}\n aria-label={activeViewName ?? labels.mainView}\n sx={{ minWidth: 0, height: 32, px: 1, gap: 0.5, color: 'text.primary', textTransform: 'none', fontWeight: 600 }}\n >\n {/* Mobile: an eye icon stands in for the view name to keep the toolbar one line. */}\n <ViewIcon sx={{ fontSize: 18, display: { xs: 'inline-flex', md: 'none' } }} />\n <Box component=\"span\" sx={{ display: { xs: 'none', md: 'inline' } }}>\n {activeViewName ?? labels.mainView}\n </Box>\n <ChevronDownIcon sx={{ fontSize: 14 }} />\n </Button>\n <Popover\n open={Boolean(anchorEl)}\n anchorEl={anchorEl}\n onClose={close}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n >\n <PopoverBody\n views={views}\n pinned={pinned}\n recent={recent}\n activeViewName={activeViewName}\n labels={labels}\n handlers={handlers}\n onSelectMain={runAndClose(onSelectMain)}\n onSaveCurrent={runAndClose(onSaveCurrent)}\n onManageAll={runAndClose(onManageAll)}\n testIdPrefix={testIdPrefix}\n />\n </Popover>\n </>\n );\n}\n"],"mappings":"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","names":[]}
|