@12-apps/ui 6.39.20 → 6.41.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NATIVE.md +1 -1
- package/components-catalog.md +43 -5
- package/components-guidelines.md +110 -0
- package/dist/_internal/components/data-display/Alert/Alert.js +3 -2
- package/dist/_internal/components/data-display/Alert/Alert.metrics.js +3 -2
- package/dist/_internal/components/data-display/Alert/Alert.styles.js +3 -2
- package/dist/_internal/components/data-display/AsyncStateContainer/AsyncStateContainer.js +3 -3
- package/dist/_internal/components/data-display/Avatar/Avatar.js +3 -3
- package/dist/_internal/components/data-display/Avatar/Avatar.view.js +2 -2
- package/dist/_internal/components/data-display/Badge/Badge.js +10 -8
- package/dist/_internal/components/data-display/Badge/Badge.styles.js +8 -6
- package/dist/_internal/components/data-display/Badge/BadgeContent.js +9 -7
- 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 -8
- package/dist/_internal/components/data-display/CardKit/card-actions-context.js +3 -2
- package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js +13 -12
- package/dist/_internal/components/data-display/CardKit/use-row-confirm.js +13 -12
- package/dist/_internal/components/data-display/Carousel/Carousel.chrome.js +9 -7
- package/dist/_internal/components/data-display/Carousel/Carousel.js +13 -11
- package/dist/_internal/components/data-display/Carousel/Carousel.parts.js +8 -6
- package/dist/_internal/components/data-display/Carousel/Carousel.styles.js +8 -6
- package/dist/_internal/components/data-display/Chart/Chart.js +12 -10
- package/dist/_internal/components/data-display/Chart/SpecChart.js +15 -13
- package/dist/_internal/components/data-display/Chart/chart-context.js +9 -7
- package/dist/_internal/components/data-display/Chart/chart-internals.js +8 -6
- package/dist/_internal/components/data-display/Chart/chart-renderers.js +11 -9
- 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 +70 -69
- package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +87 -86
- package/dist/_internal/components/data-display/DataViews/DeleteViewDialog.js +13 -12
- package/dist/_internal/components/data-display/DataViews/ManageViewsDialog.js +17 -16
- package/dist/_internal/components/data-display/DataViews/SaveViewModal.js +17 -16
- package/dist/_internal/components/data-display/DataViews/base-card.js +7 -6
- package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +11 -10
- package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +10 -9
- package/dist/_internal/components/data-display/DataViews/base-list-card.js +15 -14
- package/dist/_internal/components/data-display/DataViews/data-views-bar-controls.js +4 -4
- package/dist/_internal/components/data-display/DataViews/data-views-category-pill.js +20 -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 -9
- package/dist/_internal/components/data-display/DataViews/data-views-day-input.js +4 -4
- package/dist/_internal/components/data-display/DataViews/data-views-display-panel.js +16 -15
- 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 -10
- package/dist/_internal/components/data-display/DataViews/data-views-export.js +11 -10
- package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +26 -26
- package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +20 -19
- package/dist/_internal/components/data-display/DataViews/data-views-grid-helpers.js +9 -8
- package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +66 -65
- 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 +37 -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 +20 -19
- package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +24 -23
- package/dist/_internal/components/data-display/DataViews/data-views-number-input.js +4 -4
- package/dist/_internal/components/data-display/DataViews/data-views-pagination.js +6 -6
- package/dist/_internal/components/data-display/DataViews/data-views-range-pill.js +8 -8
- 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 +4 -4
- package/dist/_internal/components/data-display/DataViews/data-views-select-all-strip.js +11 -10
- package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +27 -26
- package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +30 -29
- package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +26 -25
- package/dist/_internal/components/data-display/DataViews/data-views-view-nav.js +11 -10
- 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 -12
- 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 +15 -15
- package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js +14 -14
- package/dist/_internal/components/data-display/FleetMap/FleetMap.fixtures.js +2 -2
- package/dist/_internal/components/data-display/FleetMap/FleetMap.js +23 -21
- 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 +5 -5
- package/dist/_internal/components/data-display/MapPreview/MapPreview.hooks.js +2 -2
- package/dist/_internal/components/data-display/MapPreview/MapPreview.js +13 -13
- package/dist/_internal/components/data-display/MapPreview/MapSearchBar.js +4 -4
- 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 -5
- package/dist/_internal/components/data-display/Sheet/Sheet.js +9 -7
- package/dist/_internal/components/data-display/Sheet/Sheet.styles.js +8 -6
- package/dist/_internal/components/data-display/Table/Table.js +5 -5
- package/dist/_internal/components/data-display/Table/TableParts.hooks.js +2 -2
- package/dist/_internal/components/data-display/Table/TableParts.js +2 -2
- package/dist/_internal/components/data-display/index.js +77 -75
- package/dist/_internal/components/feedback/ConfirmAction/ConfirmAction.js +2 -2
- package/dist/_internal/components/feedback/ConfirmAction/ConfirmButton.js +11 -10
- 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/Modal/Modal.js +2 -2
- package/dist/_internal/components/feedback/NotificationStatusNotice/NotificationStatusNotice.js +9 -8
- package/dist/_internal/components/feedback/index.js +19 -18
- package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.js +10 -10
- package/dist/_internal/components/form/AddressAutocomplete/AddressAutocompleteField.js +7 -7
- package/dist/_internal/components/form/AddressAutocomplete/AddressFallbackField.js +5 -5
- package/dist/_internal/components/form/AddressAutocomplete/AddressInputField.js +5 -5
- package/dist/_internal/components/form/AddressAutocomplete/AddressTextField.js +4 -4
- package/dist/_internal/components/form/Autocomplete/Autocomplete.js +5 -5
- package/dist/_internal/components/form/Autocomplete/Autocomplete.parts.js +4 -4
- package/dist/_internal/components/form/Button/Button.js +8 -7
- package/dist/_internal/components/form/Button/Button.styles.js +6 -5
- 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 +10 -10
- package/dist/_internal/components/form/CategorySelect/CategoryPanelFoot.js +5 -5
- package/dist/_internal/components/form/CategorySelect/CategoryPanelHead.js +5 -5
- package/dist/_internal/components/form/CategorySelect/CategoryPanelList.js +7 -7
- package/dist/_internal/components/form/CategorySelect/CategoryRows.js +6 -6
- package/dist/_internal/components/form/CategorySelect/CategorySelect.js +12 -12
- package/dist/_internal/components/form/CategorySelect/CategorySelect.styles.js +4 -4
- package/dist/_internal/components/form/CategorySelect/CategoryTrigger.js +5 -5
- package/dist/_internal/components/form/CepField/CepField.js +7 -7
- package/dist/_internal/components/form/CodeEditor/CodeEditor.js +3 -3
- package/dist/_internal/components/form/Command/Command.js +9 -7
- package/dist/_internal/components/form/Command/Command.styles.js +8 -6
- package/dist/_internal/components/form/CreatableSelect/CreatableSelect.js +4 -4
- package/dist/_internal/components/form/DateRangePicker/DateRangePicker.hooks.js +6 -6
- package/dist/_internal/components/form/DateRangePicker/DateRangePicker.js +13 -13
- package/dist/_internal/components/form/DateRangePicker/DateRangePicker.range.js +5 -5
- package/dist/_internal/components/form/DateRangePicker/DateRangePickerFields.js +6 -6
- package/dist/_internal/components/form/Input/Input.js +6 -6
- package/dist/_internal/components/form/Input/Input.metrics.js +2 -2
- package/dist/_internal/components/form/Input/Input.styles.js +5 -5
- package/dist/_internal/components/form/InputOTP/InputOTP.js +5 -5
- package/dist/_internal/components/form/InputOTP/InputOTP.styles.js +4 -4
- package/dist/_internal/components/form/Label/Label.js +9 -7
- package/dist/_internal/components/form/Label/Label.styles.js +8 -6
- package/dist/_internal/components/form/Menubar/Menubar.item.js +9 -7
- package/dist/_internal/components/form/Menubar/Menubar.js +11 -9
- package/dist/_internal/components/form/Menubar/Menubar.styles.js +8 -6
- package/dist/_internal/components/form/Menubar/Menubar.toolbar.js +10 -8
- package/dist/_internal/components/form/NumberField/NumberField.helpers.js +20 -0
- package/dist/_internal/components/form/NumberField/NumberField.js +28 -0
- package/dist/_internal/components/form/NumberField/NumberField.types.js +1 -0
- package/dist/_internal/components/form/NumberField/NumberField.types.js.map +1 -0
- package/dist/_internal/components/form/PhoneInput/PhoneInput.js +4 -4
- package/dist/_internal/components/form/RadioGroup/RadioGroup.js +6 -6
- package/dist/_internal/components/form/RadioGroup/RadioGroup.styles.js +4 -4
- package/dist/_internal/components/form/RadioGroup/RadioGroup.variants.js +5 -5
- package/dist/_internal/components/form/RichTextEditor/RichTextEditor.js +2 -2
- package/dist/_internal/components/form/Select/Select.js +5 -5
- package/dist/_internal/components/form/Select/Select.metrics.js +2 -2
- package/dist/_internal/components/form/Switch/Switch.js +3 -2
- package/dist/_internal/components/form/Switch/Switch.parts.js +3 -2
- package/dist/_internal/components/form/Switch/Switch.styles.js +3 -2
- package/dist/_internal/components/form/Textarea/Textarea.js +4 -4
- package/dist/_internal/components/form/Textarea/TextareaRichEditor.js +5 -5
- package/dist/_internal/components/form/Toggle/Toggle.js +5 -5
- package/dist/_internal/components/form/Toggle/Toggle.styles.js +4 -4
- package/dist/_internal/components/form/ToggleGroup/ToggleGroup.js +4 -4
- package/dist/_internal/components/form/UploadButton/UploadButton.js +2 -2
- package/dist/_internal/components/form/index.js +72 -64
- package/dist/_internal/components/form/total-form/Fields/CategoryField.js +13 -13
- package/dist/_internal/components/form/total-form/Fields/CepField.js +8 -8
- package/dist/_internal/components/form/total-form/Fields/SelectField.js +6 -6
- package/dist/_internal/components/form/total-form/Fields/TextField.js +7 -7
- package/dist/_internal/components/form/total-form/Fields/ToggleField.js +5 -5
- package/dist/_internal/components/form/total-form/Fields/index.js +27 -27
- package/dist/_internal/components/form/total-form/SubmitButton.js +9 -8
- package/dist/_internal/components/index.js +244 -203
- package/dist/_internal/components/layout/Box/Box.js +10 -8
- package/dist/_internal/components/layout/ContentToolbar/ColumnsMenu.js +4 -4
- package/dist/_internal/components/layout/ContentToolbar/FilterTrigger.js +4 -4
- package/dist/_internal/components/layout/ContentToolbar/MultiSelectDropdown.js +5 -5
- package/dist/_internal/components/layout/ContentToolbar/MultiSelectTriggers.js +4 -4
- package/dist/_internal/components/layout/ContentToolbar/SavedViewsMenu.js +4 -4
- package/dist/_internal/components/layout/ContentToolbar/SortByDropdown.js +4 -4
- package/dist/_internal/components/layout/ContentToolbar/ViewSelector.js +4 -4
- package/dist/_internal/components/layout/ScrollArea/ScrollArea.js +2 -2
- package/dist/_internal/components/layout/Separator/Separator.js +3 -3
- package/dist/_internal/components/layout/Separator/Separator.styles.js +2 -2
- package/dist/_internal/components/layout/SettingCard/SettingCard.hooks.js +19 -0
- package/dist/_internal/components/layout/SettingCard/SettingCard.hooks.js.map +1 -0
- package/dist/_internal/components/layout/SettingCard/SettingCard.js +54 -0
- package/dist/_internal/components/layout/SettingCard/SettingCard.js.map +1 -0
- package/dist/_internal/components/layout/SettingCard/SettingCard.metrics.js +12 -0
- package/dist/_internal/components/layout/SettingCard/SettingCard.metrics.js.map +1 -0
- package/dist/_internal/components/layout/SettingCard/SettingCard.parts.js +59 -0
- package/dist/_internal/components/layout/SettingCard/SettingCard.parts.js.map +1 -0
- package/dist/_internal/components/layout/SettingCard/SettingCard.styles.js +37 -0
- package/dist/_internal/components/layout/SettingCard/SettingCard.styles.js.map +1 -0
- package/dist/_internal/components/layout/SettingCard/SettingCard.types.js +1 -0
- package/dist/_internal/components/layout/SettingCard/SettingCard.types.js.map +1 -0
- package/dist/_internal/components/layout/SettingCard/SettingGrid.js +56 -0
- package/dist/_internal/components/layout/SettingCard/SettingGrid.js.map +1 -0
- package/dist/_internal/components/layout/SettingCard/SettingGroup.context.js +10 -0
- package/dist/_internal/components/layout/SettingCard/SettingGroup.context.js.map +1 -0
- package/dist/_internal/components/layout/SettingCard/SettingGroup.js +65 -0
- package/dist/_internal/components/layout/SettingCard/SettingGroup.js.map +1 -0
- package/dist/_internal/components/layout/SettingCard/SettingSwitch.js +63 -0
- package/dist/_internal/components/layout/SettingCard/SettingSwitch.js.map +1 -0
- package/dist/_internal/components/layout/SettingCard/SettingToggle.js +65 -0
- package/dist/_internal/components/layout/SettingCard/SettingToggle.js.map +1 -0
- package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.js +6 -6
- package/dist/_internal/components/layout/SettingsLayout/SettingsPanel.js +4 -4
- package/dist/_internal/components/layout/SettingsLayout/SettingsSectionChips.js +2 -2
- package/dist/_internal/components/layout/Stack/Stack.js +11 -9
- package/dist/_internal/components/layout/TableFilter/TableFilter.js +4 -4
- package/dist/_internal/components/layout/index.js +87 -25
- package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js +15 -13
- package/dist/_internal/components/navigation/AppHeader/AppHeader.identity.js +8 -6
- package/dist/_internal/components/navigation/CommandPalette/CommandPalette.js +3 -3
- package/dist/_internal/components/navigation/Pagination/Pagination.js +5 -5
- package/dist/_internal/components/navigation/Pagination/PaginationParts.js +4 -4
- package/dist/_internal/components/navigation/Tabs/Tabs.js +5 -5
- package/dist/_internal/components/navigation/Tabs/Tabs.styles.js +4 -4
- package/dist/_internal/components/navigation/index.js +33 -31
- package/dist/_internal/components/typography/Heading/Heading.js +6 -5
- package/dist/_internal/components/typography/Heading/Heading.metrics.js +4 -3
- package/dist/_internal/components/typography/Heading/Heading.styles.js +5 -4
- package/dist/_internal/components/typography/Text/Text.js +5 -4
- package/dist/_internal/components/typography/Text/Text.metrics.js +4 -3
- package/dist/_internal/components/typography/index.js +12 -11
- package/dist/_internal/components/utility/InstallPrompt/InstallPrompt.js +2 -2
- package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.helpers.js +7 -5
- package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.js +7 -5
- package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.parts.js +7 -5
- package/dist/_internal/components/utility/WorkflowStep/WorkflowStepRow.js +7 -5
- package/dist/_internal/components/utility/index.js +20 -18
- package/dist/_internal/en-US.data-display.js +2 -2
- package/dist/_internal/en-US.layout.js +5 -1
- package/dist/_internal/icons/Icon.js +10 -8
- package/dist/_internal/provider/UiProvider.js +9 -7
- package/dist/_internal/provider/mui-bridge.js +8 -6
- package/dist/_internal/provider/use-ui-theme.js +9 -7
- package/dist/_internal/pt-BR.data-display.js +2 -2
- package/dist/_internal/pt-BR.layout.js +5 -1
- package/dist/_internal/social-login-button/social-login-button.js +16 -15
- package/dist/_internal/tokens/density.core.js +18 -0
- package/dist/_internal/tokens/density.core.js.map +1 -0
- package/dist/_internal/tokens/density.js +31 -0
- package/dist/_internal/tokens/density.js.map +1 -0
- package/dist/_internal/tokens/field-height.core.js +1 -1
- package/dist/_internal/tokens/field-height.js +7 -5
- package/dist/_internal/tokens/theme.js +3 -2
- package/dist/_internal/user-avatar/user-avatar.js +14 -13
- package/dist/charts.js +24 -22
- package/dist/chunk-2GTORM5E.js +1 -0
- package/dist/chunk-2GTORM5E.js.map +1 -0
- package/dist/{chunk-DFCQQN6P.js → chunk-2LKWJV65.js} +5 -5
- package/dist/{chunk-HVXIOIM5.js → chunk-2MLS6KU4.js} +2 -2
- package/dist/{chunk-IIUB4IOH.js → chunk-2XHIF3M3.js} +4 -4
- package/dist/chunk-33L26P4J.js +27 -0
- package/dist/chunk-33L26P4J.js.map +1 -0
- package/dist/{chunk-IASDP44E.js → chunk-3AOOI2NR.js} +6 -6
- package/dist/{chunk-TCV3N44E.js → chunk-3CLBGHTL.js} +2 -2
- package/dist/{chunk-KKN4LLVE.js → chunk-3CUWQXTG.js} +3 -3
- package/dist/{chunk-QXSW3CNN.js → chunk-3CYTVX4T.js} +5 -5
- package/dist/chunk-3DO5AJCG.js +117 -0
- package/dist/chunk-3DO5AJCG.js.map +1 -0
- package/dist/{chunk-I5ZVCY2N.js → chunk-3EPA2A4M.js} +8 -8
- package/dist/{chunk-DRSY37PB.js → chunk-3MJHHPRW.js} +2 -2
- package/dist/{chunk-NLYNRE7L.js → chunk-3RUCLKAK.js} +4 -4
- package/dist/chunk-3U7WKBMH.js +27 -0
- package/dist/chunk-3U7WKBMH.js.map +1 -0
- package/dist/{chunk-36JKV7CA.js → chunk-3UEZ6NUI.js} +3 -3
- package/dist/{chunk-EYZ6QBTV.js → chunk-3XS37SQT.js} +3 -3
- package/dist/{chunk-BSUG4KMP.js → chunk-44USLRMT.js} +11 -11
- package/dist/{chunk-DJYL2LC6.js → chunk-44Z72DDM.js} +2 -2
- package/dist/{chunk-4WCDMCIS.js → chunk-4CHYMTBT.js} +4 -4
- package/dist/{chunk-2LIRGFEK.js → chunk-4GN2RLYL.js} +2 -2
- package/dist/{chunk-HN3PZTUK.js → chunk-4MKVGSHX.js} +5 -5
- package/dist/{chunk-BRM3T4LQ.js → chunk-4S2LWZ7L.js} +5 -5
- package/dist/{chunk-OQRG34VG.js → chunk-4SHMSLFA.js} +2 -2
- package/dist/{chunk-62UAI62O.js → chunk-4UVFPORR.js} +5 -5
- package/dist/{chunk-YTINPQKU.js → chunk-4XHVGUOM.js} +2 -2
- package/dist/{chunk-7DK6YVJU.js → chunk-4Z7GEO2R.js} +2 -2
- package/dist/{chunk-A2TANYNR.js → chunk-53O2TNSR.js} +6 -6
- package/dist/{chunk-T6EKPFKZ.js → chunk-54HTXJJ2.js} +2 -2
- package/dist/{chunk-OHZU4IT3.js → chunk-5B7BTLN4.js} +2 -2
- package/dist/{chunk-K5V6TCYB.js → chunk-5ETBB2DG.js} +4 -4
- package/dist/{chunk-5752357K.js → chunk-5KGABAQB.js} +4 -4
- package/dist/{chunk-JKIKHWD2.js → chunk-5NT2M2JI.js} +4 -4
- package/dist/{chunk-JE6RZ5L6.js → chunk-5ZOJLYD2.js} +4 -4
- package/dist/{chunk-7EH4D6FU.js → chunk-6H4TPEMO.js} +2 -2
- package/dist/{chunk-WB6ZU3B3.js → chunk-6JGATEOF.js} +6 -6
- package/dist/{chunk-TU5A2CV7.js → chunk-6L2FKTBO.js} +7 -7
- package/dist/{chunk-ME3WYPYK.js → chunk-6MD5QXXJ.js} +5 -5
- package/dist/{chunk-HQZRI7UX.js → chunk-6N2EDWMG.js} +4 -4
- package/dist/{chunk-H224XFFD.js → chunk-6REPQ352.js} +2 -2
- package/dist/{chunk-YZ2DMP23.js → chunk-6TPYT3UC.js} +5 -5
- package/dist/{chunk-I4MRBEWU.js → chunk-6ZD3FI5P.js} +11 -11
- package/dist/{chunk-PWZHCBG3.js → chunk-72FPUWD6.js} +2 -2
- package/dist/{chunk-VRPREI27.js → chunk-72S2RGWD.js} +2 -2
- package/dist/{chunk-OAW6GCS3.js → chunk-77BKKPCI.js} +3 -3
- package/dist/{chunk-67O4GPJJ.js → chunk-7FEXRMJE.js} +2 -2
- package/dist/{chunk-KN5J3NEZ.js → chunk-7KKMZJFT.js} +2 -2
- package/dist/{chunk-KJDBY2KN.js → chunk-7LILFS72.js} +2 -2
- package/dist/{chunk-SLDSWQVE.js → chunk-7TE4TMS3.js} +5 -5
- package/dist/{chunk-AG3DY5TH.js → chunk-ADSA76T7.js} +2 -2
- package/dist/chunk-AEMD6JHZ.js +1 -0
- package/dist/chunk-AEMD6JHZ.js.map +1 -0
- package/dist/{chunk-BKASAYQL.js → chunk-ALOUJ3CE.js} +8 -8
- package/dist/{chunk-VY2BMSHN.js → chunk-ANYOSBNA.js} +2 -2
- package/dist/{chunk-LNHYBA4B.js → chunk-AWG2AJHX.js} +5 -5
- package/dist/{chunk-7X7ZHJHM.js → chunk-B3QWQG62.js} +2 -2
- package/dist/{chunk-2S752BIJ.js → chunk-BA6Z52QN.js} +2 -2
- package/dist/{chunk-X4F32GUB.js → chunk-BM4KKGL7.js} +2 -2
- package/dist/chunk-BOWS4U6W.js +1 -0
- package/dist/chunk-BOWS4U6W.js.map +1 -0
- package/dist/{chunk-4T6UIYJB.js → chunk-BVSSEOLI.js} +2 -2
- package/dist/{chunk-3UABIEP3.js → chunk-C2TERIB4.js} +2 -2
- package/dist/{chunk-TEEJ4GNY.js → chunk-C6OVO6AT.js} +2 -2
- package/dist/{chunk-CYZZHWNK.js → chunk-CJ45OL7L.js} +2 -2
- package/dist/{chunk-N7LPVR7P.js → chunk-CKHFYTIX.js} +4 -4
- package/dist/{chunk-PA3AA55Q.js → chunk-CLK67TNH.js} +2 -2
- package/dist/{chunk-MQ277OLB.js → chunk-CM2Q7IH3.js} +5 -5
- package/dist/{chunk-ZXSWXE6U.js → chunk-CMFJQH6A.js} +5 -5
- package/dist/{chunk-NOKN4HRK.js → chunk-CMLIWUBW.js} +4 -4
- package/dist/{chunk-EA2UNEL6.js → chunk-CNR5RFKC.js} +2 -2
- package/dist/{chunk-P52LYD6S.js → chunk-DFI2RKVQ.js} +2 -2
- package/dist/{chunk-37USSARD.js → chunk-DH5UJD2I.js} +4 -4
- package/dist/{chunk-PCLKFR27.js → chunk-DH6SL3SY.js} +8 -8
- package/dist/chunk-DJKVSUXH.js +35 -0
- package/dist/chunk-DJKVSUXH.js.map +1 -0
- package/dist/{chunk-S6JHTEV4.js → chunk-DLWLIPCP.js} +3 -3
- package/dist/{chunk-KN4ZE2XZ.js → chunk-EIII4QU4.js} +19 -19
- package/dist/{chunk-L566FMDD.js → chunk-EO5IEWFI.js} +6 -6
- package/dist/{chunk-VY6L74JQ.js → chunk-EQXIW5MQ.js} +4 -4
- package/dist/{chunk-MWPXKZ7O.js → chunk-ERY6D2OV.js} +4 -4
- package/dist/{chunk-6PU3JYVY.js → chunk-F3AYISXT.js} +4 -4
- package/dist/{chunk-GY4NBSCN.js → chunk-FDMQ7H22.js} +2 -2
- package/dist/{chunk-IBGP3VSR.js → chunk-FHW3ATT7.js} +2 -2
- package/dist/{chunk-WL6N33AB.js → chunk-FIO55AKI.js} +4 -4
- package/dist/{chunk-5CQNBMLK.js → chunk-FTQBVZ7V.js} +4 -4
- package/dist/{chunk-J5UZB6Y6.js → chunk-FXWXBEOZ.js} +2 -2
- package/dist/{chunk-IGGXKT5B.js → chunk-G2WERTWZ.js} +2 -2
- package/dist/{chunk-DF4QODJ6.js → chunk-G4TKMUOL.js} +6 -6
- package/dist/{chunk-WY5PBZ7Q.js → chunk-G6ZPQHBL.js} +2 -2
- package/dist/{chunk-JYR6VV4Y.js → chunk-G7XHJPLO.js} +5 -5
- package/dist/{chunk-IQJCLFF4.js → chunk-GANW7FXQ.js} +2 -2
- package/dist/{chunk-3LSIFHQK.js → chunk-GE2CCITY.js} +2 -2
- package/dist/{chunk-G3XLFQ2Z.js → chunk-GG62LKA3.js} +6 -6
- package/dist/{chunk-YQCRQHVU.js → chunk-GI63FQEJ.js} +4 -4
- package/dist/{chunk-7ICK5MXV.js → chunk-GJFAI3J5.js} +10 -10
- package/dist/{chunk-2JNHWKQK.js → chunk-GPHURU2K.js} +12 -12
- package/dist/{chunk-5FAI25JQ.js → chunk-H72YKEGD.js} +3 -3
- package/dist/chunk-HALFOXSZ.js +1 -0
- package/dist/chunk-HALFOXSZ.js.map +1 -0
- package/dist/{chunk-J3XFUCCR.js → chunk-HKBJZX3C.js} +12 -12
- package/dist/{chunk-M4QXG5JP.js → chunk-HQWJUHR4.js} +4 -4
- package/dist/chunk-IC7GHPMK.js +22 -0
- package/dist/chunk-IC7GHPMK.js.map +1 -0
- package/dist/{chunk-4BNV5AAI.js → chunk-ITFFA3H2.js} +3 -3
- package/dist/{chunk-RB3X6CEE.js → chunk-IWGW2E35.js} +2 -2
- package/dist/{chunk-O25SH2MA.js → chunk-J6KLT7HP.js} +7 -7
- package/dist/{chunk-CRG24BGI.js → chunk-JAGAFEZL.js} +2 -2
- package/dist/{chunk-RDCHT2WN.js → chunk-JE5GEWTG.js} +5 -5
- package/dist/{chunk-FLDLUAHW.js → chunk-JE6GQB5J.js} +4 -4
- package/dist/{chunk-N23GCN5U.js → chunk-JFLFZLOA.js} +5 -5
- package/dist/{chunk-35443PF6.js → chunk-JIRZ27RI.js} +2 -2
- package/dist/{chunk-5MW7OYBM.js → chunk-JSGVYOMN.js} +2 -2
- package/dist/{chunk-RNIU447I.js → chunk-JU3FRRO2.js} +2 -2
- package/dist/{chunk-WOAXKWAB.js → chunk-K4A3JDYQ.js} +2 -2
- package/dist/{chunk-HM2JJNUE.js → chunk-K6LNHHSH.js} +5 -5
- package/dist/{chunk-NR5TW4AH.js → chunk-K7MQP2KT.js} +3 -3
- package/dist/{chunk-2OWKL4CC.js → chunk-KCDNOMMT.js} +9 -9
- package/dist/{chunk-O2DLEAUP.js → chunk-KHOAXZW2.js} +4 -4
- package/dist/{chunk-W5TI46QN.js → chunk-KQZGUHYZ.js} +3 -3
- package/dist/{chunk-2K7WPHI3.js → chunk-KW3H5FUS.js} +2 -2
- package/dist/{chunk-7D2C4LK2.js → chunk-LCWGNDTH.js} +4 -4
- package/dist/{chunk-FNRPQE2D.js → chunk-LF3EVXMF.js} +2 -2
- package/dist/{chunk-MCJRHF7Z.js → chunk-LGCRL7DK.js} +10 -10
- package/dist/{chunk-JK5UJM4Y.js → chunk-LODMNSLR.js} +9 -9
- package/dist/{chunk-CGO452DC.js → chunk-M47ZOUGF.js} +13 -10
- package/dist/{chunk-CGO452DC.js.map → chunk-M47ZOUGF.js.map} +1 -1
- package/dist/{chunk-YUXDVW62.js → chunk-M65ZNPLO.js} +2 -2
- package/dist/{chunk-URHX4FAQ.js → chunk-MKLIMY3D.js} +2 -2
- package/dist/{chunk-2FM5SUQV.js → chunk-MM5XSAVE.js} +2 -2
- package/dist/{chunk-LXT3X33C.js → chunk-NCB4GBRL.js} +2 -2
- package/dist/{chunk-FNO5TWBJ.js → chunk-NCEQWEXT.js} +4 -4
- package/dist/{chunk-FWPFCK4D.js → chunk-NDHDBOUH.js} +4 -4
- package/dist/{chunk-WRCLYSTX.js → chunk-NFGIA2ZV.js} +2 -2
- package/dist/{chunk-VPPIODKX.js → chunk-NQ7NMCRI.js} +2 -2
- package/dist/{chunk-YMTZN54Q.js → chunk-NRSVI23L.js} +2 -2
- package/dist/{chunk-2622YFM6.js → chunk-NSVSC6ZC.js} +6 -6
- package/dist/{chunk-Z43N7ASP.js → chunk-NU55QUMO.js} +2 -2
- package/dist/{chunk-66O55OZI.js → chunk-NYFGFELX.js} +2 -2
- package/dist/{chunk-PZBK3F52.js → chunk-O6MJWHU5.js} +3 -3
- package/dist/chunk-O6MJWHU5.js.map +1 -0
- package/dist/chunk-OJUORFGO.js +87 -0
- package/dist/chunk-OJUORFGO.js.map +1 -0
- package/dist/{chunk-JXECOCNA.js → chunk-P6Q2O3TU.js} +2 -2
- package/dist/{chunk-RTEY5COP.js → chunk-PAICZOL5.js} +4 -4
- package/dist/{chunk-ZN6YATOG.js → chunk-PAT2BQOQ.js} +2 -2
- package/dist/chunk-PEOOCQ2T.js +140 -0
- package/dist/chunk-PEOOCQ2T.js.map +1 -0
- package/dist/chunk-PGGGKYWG.js +1 -0
- package/dist/chunk-PGGGKYWG.js.map +1 -0
- package/dist/{chunk-TZBOWSAM.js → chunk-PICOOZLX.js} +6 -6
- package/dist/{chunk-JJJM75XF.js → chunk-PNDYAIKM.js} +2 -2
- package/dist/{chunk-EJYJLVPK.js → chunk-PRLYYKMG.js} +3 -3
- package/dist/{chunk-4GB46HLK.js → chunk-PTONBPZL.js} +2 -2
- package/dist/chunk-Q4JWWTL4.js +36 -0
- package/dist/chunk-Q4JWWTL4.js.map +1 -0
- package/dist/{chunk-FNG33MKA.js → chunk-QDELBNL3.js} +2 -2
- package/dist/{chunk-DSF4VT7L.js → chunk-QEI5DC6S.js} +6 -6
- package/dist/chunk-QGUNUXTT.js +1 -0
- package/dist/chunk-QGUNUXTT.js.map +1 -0
- package/dist/{chunk-VJ2BNJ5M.js → chunk-QMELMQPA.js} +4 -4
- package/dist/{chunk-HDJQDMHB.js → chunk-QMHS6ZDI.js} +2 -2
- package/dist/{chunk-2WVHZIWP.js → chunk-QSRZOXQI.js} +2 -2
- package/dist/{chunk-C3LZ3OGJ.js → chunk-R2FUQV24.js} +2 -2
- package/dist/{chunk-GOWBYHYW.js → chunk-R6SBP5M5.js} +4 -4
- package/dist/{chunk-HWSS6C7C.js → chunk-RDFPM2AQ.js} +8 -8
- package/dist/chunk-RDZGXJOD.js +74 -0
- package/dist/chunk-RDZGXJOD.js.map +1 -0
- package/dist/chunk-RN7UJI7S.js +1 -0
- package/dist/chunk-RN7UJI7S.js.map +1 -0
- package/dist/chunk-RPBGUWNF.js +168 -0
- package/dist/chunk-RPBGUWNF.js.map +1 -0
- package/dist/{chunk-4RPFI474.js → chunk-RSDYS5B3.js} +6 -6
- package/dist/{chunk-X53F33KA.js → chunk-RWXYND4H.js} +2 -2
- package/dist/{chunk-4NPPO63U.js → chunk-RZ2VZ7SL.js} +5 -5
- package/dist/{chunk-ORRI6FMN.js → chunk-S4IXC2V3.js} +3 -3
- package/dist/chunk-SALQ65SM.js +118 -0
- package/dist/chunk-SALQ65SM.js.map +1 -0
- package/dist/{chunk-MXCIUKTQ.js → chunk-SDBBJ6FG.js} +4 -4
- package/dist/{chunk-JRJCBDGN.js → chunk-SDKOOVEX.js} +6 -4
- package/dist/{chunk-JRJCBDGN.js.map → chunk-SDKOOVEX.js.map} +1 -1
- package/dist/{chunk-UMNXSQ7I.js → chunk-SNBAMWI5.js} +2 -2
- package/dist/{chunk-LP3JCXER.js → chunk-SNW5MJ6I.js} +2 -2
- package/dist/{chunk-5OBGW3FG.js → chunk-STTULW2K.js} +2 -2
- package/dist/{chunk-3CTQZDSD.js → chunk-TCNTIGMY.js} +4 -4
- package/dist/{chunk-Y6C4MYZE.js → chunk-TNQDSTIA.js} +7 -7
- package/dist/{chunk-6RLCBNDV.js → chunk-TPVSHO75.js} +7 -7
- package/dist/{chunk-BUPDBEBA.js → chunk-TTJTMDLI.js} +2 -2
- package/dist/{chunk-TU5EIKJA.js → chunk-U5SH3VRJ.js} +4 -4
- package/dist/chunk-U67ZQ6VM.js +82 -0
- package/dist/chunk-U67ZQ6VM.js.map +1 -0
- package/dist/{chunk-MLQYIJTO.js → chunk-U6W2RY3Z.js} +5 -5
- package/dist/{chunk-4WF6ZLIW.js → chunk-UGPRBJWB.js} +8 -8
- package/dist/chunk-VBP46YP4.js +42 -0
- package/dist/chunk-VBP46YP4.js.map +1 -0
- package/dist/{chunk-Y6G4I42P.js → chunk-VEEG4UXZ.js} +2 -2
- package/dist/{chunk-IRD45DRW.js → chunk-VOJBLBXE.js} +3 -3
- package/dist/{chunk-KHPL2J3B.js → chunk-VPAOVEI2.js} +3 -3
- package/dist/{chunk-DYGWKZ7T.js → chunk-VWJEM2ER.js} +3 -3
- package/dist/{chunk-FERUQ7OB.js → chunk-VYA4QWQL.js} +2 -2
- package/dist/chunk-VYM2GPR6.js +47 -0
- package/dist/chunk-VYM2GPR6.js.map +1 -0
- package/dist/{chunk-UKX3MPB7.js → chunk-VYV3JOV5.js} +2 -2
- package/dist/{chunk-B7CNP5HW.js → chunk-WV62BSWA.js} +2 -2
- package/dist/chunk-X3C3VTYS.js +85 -0
- package/dist/chunk-X3C3VTYS.js.map +1 -0
- package/dist/{chunk-IWEUSZY3.js → chunk-X66E5WSX.js} +3 -3
- package/dist/{chunk-OJ2XR3WH.js → chunk-XB7HYOMM.js} +2 -2
- package/dist/{chunk-H6AWKLOV.js → chunk-XBLFK2FL.js} +2 -2
- package/dist/{chunk-5HDYTTE7.js → chunk-XHA2NXLD.js} +2 -2
- package/dist/chunk-XJQNSMGA.js +10 -0
- package/dist/chunk-XJQNSMGA.js.map +1 -0
- package/dist/{chunk-F4KYBBTY.js → chunk-XLXMJ6X2.js} +3 -3
- package/dist/{chunk-SCZABICW.js → chunk-XO4ZUHVH.js} +2 -2
- package/dist/{chunk-PARTZ7XI.js → chunk-XP522FFM.js} +2 -2
- package/dist/{chunk-MBHWVRV5.js → chunk-XVZG52CM.js} +8 -8
- package/dist/{chunk-TGXCG62P.js → chunk-XXL4PM4M.js} +2 -2
- package/dist/{chunk-YKEO6UHN.js → chunk-XZJM6EPC.js} +4 -4
- package/dist/{chunk-YTY7TD7S.js → chunk-XZY7O7JJ.js} +5 -5
- package/dist/{chunk-WZNTZX5N.js → chunk-Y2UXX5IQ.js} +4 -4
- package/dist/{chunk-BLW6KLDR.js → chunk-YFODI4KT.js} +11 -4
- package/dist/chunk-YFODI4KT.js.map +1 -0
- package/dist/{chunk-QOLIBVGS.js → chunk-YGYQC7MT.js} +4 -4
- package/dist/{chunk-THMT3G3L.js → chunk-YLXQWYOG.js} +7 -7
- package/dist/{chunk-M4KVKQRN.js → chunk-YPIVLPXF.js} +3 -3
- package/dist/{chunk-57FZM6GH.js → chunk-YRUX7XMQ.js} +2 -2
- package/dist/{chunk-M2Q5CLPU.js → chunk-YTXZUTLF.js} +4 -4
- package/dist/{chunk-ZWCYSAI5.js → chunk-YWJDUJAR.js} +4 -4
- package/dist/{chunk-S36NC22G.js → chunk-Z2NN53E5.js} +2 -2
- package/dist/{chunk-GC56IWIZ.js → chunk-Z4DKVLYG.js} +9 -9
- package/dist/{chunk-U4QUDFPJ.js → chunk-Z4O3F6KU.js} +4 -4
- package/dist/{chunk-JC22FNFA.js → chunk-Z6T5SXST.js} +5 -5
- package/dist/{chunk-TXEN3QJ4.js → chunk-ZC5HDBQO.js} +2 -2
- package/dist/{chunk-LEHMWJNZ.js → chunk-ZEYUSS3W.js} +5 -5
- package/dist/{chunk-JH5BKA3Y.js → chunk-ZH2SZ6B3.js} +26 -8
- package/dist/chunk-ZH2SZ6B3.js.map +1 -0
- package/dist/{chunk-4WNFOBTH.js → chunk-ZKWVCSAB.js} +2 -2
- package/dist/{chunk-GEB4WSZH.js → chunk-ZNBLGS66.js} +3 -3
- package/dist/{chunk-TCAQOUIB.js → chunk-ZSTSISM6.js} +1 -1
- package/dist/chunk-ZSTSISM6.js.map +1 -0
- package/dist/data-display/Alert.js +3 -2
- package/dist/data-display/AsyncStateContainer.js +3 -3
- package/dist/data-display/Avatar.js +3 -3
- package/dist/data-display/Badge.js +10 -8
- package/dist/data-display/Banner.js +3 -2
- package/dist/data-display/CardKit.js +17 -16
- package/dist/data-display/Carousel.js +13 -11
- package/dist/data-display/Chart.js +24 -22
- package/dist/data-display/Chip.js +1 -0
- package/dist/data-display/DataGrid.js +3 -3
- package/dist/data-display/DataViews.js +107 -106
- package/dist/data-display/DescriptionItem.js +6 -5
- package/dist/data-display/EmptyState.js +2 -2
- package/dist/data-display/FleetMap.js +23 -21
- package/dist/data-display/InteractiveTooltip.js +2 -2
- package/dist/data-display/Lightbox.js +6 -6
- package/dist/data-display/MapPreview.js +13 -13
- package/dist/data-display/Progress.js +6 -5
- package/dist/data-display/SectionOnboarding.js +3 -3
- package/dist/data-display/Sheet.js +9 -7
- package/dist/data-display/Table.js +5 -5
- package/dist/en-US.js +15 -11
- package/dist/feedback/ConfirmAction.js +14 -13
- package/dist/feedback/Dialog.js +2 -2
- package/dist/feedback/Modal.js +2 -2
- package/dist/feedback/NotificationStatusNotice.js +9 -8
- package/dist/form/AddressAutocomplete.js +10 -10
- package/dist/form/Autocomplete.js +5 -5
- package/dist/form/Button.js +8 -7
- package/dist/form/Calendar.js +4 -4
- package/dist/form/CategorySelect.js +12 -12
- package/dist/form/CepField.js +7 -7
- package/dist/form/CodeEditor.js +4 -4
- package/dist/form/Command.js +9 -7
- package/dist/form/CreatableSelect.js +4 -4
- package/dist/form/DateRangePicker.js +13 -13
- package/dist/form/Input.js +6 -6
- package/dist/form/InputOTP.js +5 -5
- package/dist/form/Label.js +9 -7
- package/dist/form/Menubar.js +11 -9
- package/dist/form/NumberField.js +29 -0
- package/dist/form/NumberField.js.map +1 -0
- package/dist/form/PhoneInput.js +4 -4
- package/dist/form/RadioGroup.js +6 -6
- package/dist/form/RichTextEditor.js +2 -2
- package/dist/form/Select.js +5 -5
- package/dist/form/Switch.js +3 -2
- package/dist/form/Textarea.js +4 -4
- package/dist/form/Toggle.js +5 -5
- package/dist/form/ToggleGroup.js +4 -4
- package/dist/form/UploadButton.js +2 -2
- package/dist/form/total-form.js +31 -30
- package/dist/icons.js +11 -8
- package/dist/layout/Box.js +10 -8
- package/dist/layout/Collapsible.js +1 -0
- package/dist/layout/ContentToolbar.js +12 -12
- package/dist/layout/ScrollArea.js +2 -2
- package/dist/layout/Separator.js +3 -3
- package/dist/layout/SettingCard.js +80 -0
- package/dist/layout/SettingCard.js.map +1 -0
- package/dist/layout/SettingsLayout.js +7 -7
- package/dist/layout/Stack.js +11 -9
- package/dist/layout/TableFilter.js +4 -4
- package/dist/locales.js +37 -23
- package/dist/locales.js.map +1 -1
- package/dist/native/chunks/{chunk-ONXKFA5Z.js → chunk-A2QNZ4VK.js} +4 -4
- package/dist/native/chunks/{chunk-X6RQGKGF.js → chunk-BST5DUUD.js} +2 -2
- package/dist/native/chunks/{chunk-GUBTMR2K.js → chunk-EDYZEMVD.js} +2 -2
- package/dist/native/chunks/{chunk-SZF56GVJ.js → chunk-LECBJD35.js} +3 -3
- package/dist/native/chunks/{chunk-JBYDLWQA.js → chunk-MTRRGDBQ.js} +5 -5
- package/dist/native/chunks/{chunk-IMGBBIMT.js → chunk-PN7C2BEY.js} +2 -2
- package/dist/native/chunks/{chunk-R5XVZRDD.js → chunk-RADD26LG.js} +46 -5
- package/dist/native/chunks/chunk-RADD26LG.js.map +1 -0
- package/dist/native/chunks/{chunk-4ZAULIDG.js → chunk-S4F364X4.js} +3 -3
- package/dist/native/chunks/{chunk-5IASLIBI.js → chunk-VJFKRXY2.js} +2 -2
- package/dist/native/data-display/Alert.js +3 -3
- package/dist/native/data-display/Avatar.js +3 -3
- package/dist/native/data-display/Badge.js +3 -3
- package/dist/native/data-display/Chip.js +3 -3
- package/dist/native/data-display/EmptyState.js +6 -6
- package/dist/native/data-display/ErrorState.js +5 -5
- package/dist/native/data-display/FleetMap.js +7 -7
- package/dist/native/data-display/LoadingState.js +2 -2
- package/dist/native/data-display/Progress.js +2 -2
- package/dist/native/feedback/Dialog.js +3 -3
- package/dist/native/form/Button.js +4 -4
- package/dist/native/form/Checkbox.js +3 -3
- package/dist/native/form/Input.js +4 -4
- package/dist/native/form/Select.js +5 -5
- package/dist/native/form/Switch.js +2 -2
- package/dist/native/icons.js +3 -3
- package/dist/native/layout/Box.js +3 -3
- package/dist/native/layout/Card.js +2 -2
- package/dist/native/layout/Container.js +2 -2
- package/dist/native/layout/Skeleton.js +3 -3
- package/dist/native/layout/Spacer.js +2 -2
- package/dist/native/layout/Stack.js +3 -3
- package/dist/native/provider.js +2 -2
- package/dist/native/tokens.js +15 -3
- package/dist/native/typography/Heading.js +2 -2
- package/dist/native/typography/Paragraph.js +2 -2
- package/dist/native/typography/Text.js +2 -2
- package/dist/navigation/AppHeader.js +18 -16
- package/dist/navigation/CommandPalette.js +3 -3
- package/dist/navigation/Pagination.js +5 -5
- package/dist/navigation/Tabs.js +5 -5
- package/dist/provider.js +10 -8
- package/dist/pt-BR.js +12 -8
- package/dist/social-login-button.js +16 -15
- package/dist/tokens.js +30 -8
- package/dist/types/components/form/Input/Input.d.ts.map +1 -1
- package/dist/types/components/form/Input/Input.types.d.ts +10 -0
- package/dist/types/components/form/Input/Input.types.d.ts.map +1 -1
- package/dist/types/components/form/NumberField/NumberField.d.ts +21 -0
- package/dist/types/components/form/NumberField/NumberField.d.ts.map +1 -0
- package/dist/types/components/form/NumberField/NumberField.helpers.d.ts +48 -0
- package/dist/types/components/form/NumberField/NumberField.helpers.d.ts.map +1 -0
- package/dist/types/components/form/NumberField/NumberField.types.d.ts +31 -0
- package/dist/types/components/form/NumberField/NumberField.types.d.ts.map +1 -0
- package/dist/types/components/form/NumberField/index.d.ts +3 -0
- package/dist/types/components/form/NumberField/index.d.ts.map +1 -0
- package/dist/types/components/form/index.d.ts +1 -0
- package/dist/types/components/form/index.d.ts.map +1 -1
- package/dist/types/components/layout/SettingCard/SettingCard.d.ts +14 -0
- package/dist/types/components/layout/SettingCard/SettingCard.d.ts.map +1 -0
- package/dist/types/components/layout/SettingCard/SettingCard.hooks.d.ts +79 -0
- package/dist/types/components/layout/SettingCard/SettingCard.hooks.d.ts.map +1 -0
- package/dist/types/components/layout/SettingCard/SettingCard.metrics.d.ts +21 -0
- package/dist/types/components/layout/SettingCard/SettingCard.metrics.d.ts.map +1 -0
- package/dist/types/components/layout/SettingCard/SettingCard.parts.d.ts +49 -0
- package/dist/types/components/layout/SettingCard/SettingCard.parts.d.ts.map +1 -0
- package/dist/types/components/layout/SettingCard/SettingCard.styles.d.ts +48 -0
- package/dist/types/components/layout/SettingCard/SettingCard.styles.d.ts.map +1 -0
- package/dist/types/components/layout/SettingCard/SettingCard.types.d.ts +127 -0
- package/dist/types/components/layout/SettingCard/SettingCard.types.d.ts.map +1 -0
- package/dist/types/components/layout/SettingCard/SettingGrid.d.ts +33 -0
- package/dist/types/components/layout/SettingCard/SettingGrid.d.ts.map +1 -0
- package/dist/types/components/layout/SettingCard/SettingGroup.context.d.ts +13 -0
- package/dist/types/components/layout/SettingCard/SettingGroup.context.d.ts.map +1 -0
- package/dist/types/components/layout/SettingCard/SettingGroup.d.ts +18 -0
- package/dist/types/components/layout/SettingCard/SettingGroup.d.ts.map +1 -0
- package/dist/types/components/layout/SettingCard/SettingSwitch.d.ts +28 -0
- package/dist/types/components/layout/SettingCard/SettingSwitch.d.ts.map +1 -0
- package/dist/types/components/layout/SettingCard/SettingToggle.d.ts +13 -0
- package/dist/types/components/layout/SettingCard/SettingToggle.d.ts.map +1 -0
- package/dist/types/components/layout/SettingCard/index.d.ts +6 -0
- package/dist/types/components/layout/SettingCard/index.d.ts.map +1 -0
- package/dist/types/components/layout/index.d.ts +1 -0
- package/dist/types/components/layout/index.d.ts.map +1 -1
- package/dist/types/copy/layout.d.ts +27 -0
- package/dist/types/copy/layout.d.ts.map +1 -1
- package/dist/types/en-US.layout.d.ts +3 -1
- package/dist/types/en-US.layout.d.ts.map +1 -1
- package/dist/types/locales.d.ts +3 -1
- package/dist/types/locales.d.ts.map +1 -1
- package/dist/types/provider/mui-bridge.d.ts.map +1 -1
- package/dist/types/pt-BR.layout.d.ts +3 -1
- package/dist/types/pt-BR.layout.d.ts.map +1 -1
- package/dist/types/tokens/density.core.d.ts +73 -0
- package/dist/types/tokens/density.core.d.ts.map +1 -0
- package/dist/types/tokens/density.d.ts +95 -0
- package/dist/types/tokens/density.d.ts.map +1 -0
- package/dist/types/tokens/field-height.core.d.ts +7 -2
- package/dist/types/tokens/field-height.core.d.ts.map +1 -1
- package/dist/types/tokens/field-height.d.ts +9 -0
- package/dist/types/tokens/field-height.d.ts.map +1 -1
- package/dist/types/tokens/scales.d.ts +2 -1
- package/dist/types/tokens/scales.d.ts.map +1 -1
- package/dist/types/tokens/theme.d.ts +30 -0
- package/dist/types/tokens/theme.d.ts.map +1 -1
- package/dist/types-native/tokens/density.core.d.ts +73 -0
- package/dist/types-native/tokens/density.core.d.ts.map +1 -0
- package/dist/types-native/tokens/field-height.core.d.ts +7 -2
- package/dist/types-native/tokens/field-height.core.d.ts.map +1 -1
- package/dist/types-native/tokens/index.native.d.ts +1 -0
- package/dist/types-native/tokens/index.native.d.ts.map +1 -1
- package/dist/types-native/tokens/theme.d.ts +30 -0
- package/dist/types-native/tokens/theme.d.ts.map +1 -1
- package/dist/typography/Heading.js +6 -5
- package/dist/typography/Text.js +5 -4
- package/dist/user-avatar.js +14 -13
- package/dist/utility/InstallPrompt.js +2 -2
- package/dist/utility/WorkflowStep.js +7 -5
- package/package.json +9 -1
- package/src/components/form/Input/Input.tsx +2 -0
- package/src/components/form/Input/Input.types.ts +10 -0
- package/src/components/form/NumberField/NumberField.helpers.ts +77 -0
- package/src/components/form/NumberField/NumberField.md +86 -0
- package/src/components/form/NumberField/NumberField.tsx +88 -0
- package/src/components/form/NumberField/NumberField.types.ts +43 -0
- package/src/components/form/NumberField/index.ts +2 -0
- package/src/components/form/NumberField/tests.md +51 -0
- package/src/components/form/NumberField/track.md +42 -0
- package/src/components/form/index.ts +1 -0
- package/src/components/layout/SettingCard/SettingCard.hooks.ts +191 -0
- package/src/components/layout/SettingCard/SettingCard.md +121 -0
- package/src/components/layout/SettingCard/SettingCard.metrics.ts +22 -0
- package/src/components/layout/SettingCard/SettingCard.parts.tsx +162 -0
- package/src/components/layout/SettingCard/SettingCard.styles.ts +142 -0
- package/src/components/layout/SettingCard/SettingCard.tsx +197 -0
- package/src/components/layout/SettingCard/SettingCard.types.ts +140 -0
- package/src/components/layout/SettingCard/SettingGrid.md +65 -0
- package/src/components/layout/SettingCard/SettingGrid.tsx +105 -0
- package/src/components/layout/SettingCard/SettingGroup.context.ts +11 -0
- package/src/components/layout/SettingCard/SettingGroup.md +81 -0
- package/src/components/layout/SettingCard/SettingGroup.tsx +73 -0
- package/src/components/layout/SettingCard/SettingSwitch.tsx +92 -0
- package/src/components/layout/SettingCard/SettingToggle.md +61 -0
- package/src/components/layout/SettingCard/SettingToggle.tsx +43 -0
- package/src/components/layout/SettingCard/index.ts +18 -0
- package/src/components/layout/SettingCard/tests.md +68 -0
- package/src/components/layout/SettingCard/track.md +54 -0
- package/src/components/layout/index.ts +1 -0
- package/src/copy/layout.ts +29 -0
- package/src/en-US.layout.ts +16 -0
- package/src/locales.ts +10 -0
- package/src/provider/mui-bridge.ts +17 -3
- package/src/pt-BR.layout.ts +16 -0
- package/src/tokens/density.core.ts +118 -0
- package/src/tokens/density.ts +134 -0
- package/src/tokens/field-height.core.ts +8 -3
- package/src/tokens/field-height.ts +19 -8
- package/src/tokens/index.native.ts +11 -0
- package/src/tokens/scales.ts +15 -0
- package/src/tokens/theme.ts +43 -2
- package/dist/chunk-A7RIZOAL.js +0 -13
- package/dist/chunk-A7RIZOAL.js.map +0 -1
- package/dist/chunk-BLW6KLDR.js.map +0 -1
- package/dist/chunk-BY3JEK5T.js +0 -1
- package/dist/chunk-FZJ2FTGE.js +0 -1
- package/dist/chunk-GRHECKHU.js +0 -13
- package/dist/chunk-GRHECKHU.js.map +0 -1
- package/dist/chunk-JH5BKA3Y.js.map +0 -1
- package/dist/chunk-PZBK3F52.js.map +0 -1
- package/dist/chunk-TCAQOUIB.js.map +0 -1
- package/dist/native/chunks/chunk-R5XVZRDD.js.map +0 -1
- /package/dist/{chunk-BY3JEK5T.js.map → _internal/components/form/NumberField/NumberField.helpers.js.map} +0 -0
- /package/dist/{chunk-FZJ2FTGE.js.map → _internal/components/form/NumberField/NumberField.js.map} +0 -0
- /package/dist/{chunk-DFCQQN6P.js.map → chunk-2LKWJV65.js.map} +0 -0
- /package/dist/{chunk-HVXIOIM5.js.map → chunk-2MLS6KU4.js.map} +0 -0
- /package/dist/{chunk-IIUB4IOH.js.map → chunk-2XHIF3M3.js.map} +0 -0
- /package/dist/{chunk-IASDP44E.js.map → chunk-3AOOI2NR.js.map} +0 -0
- /package/dist/{chunk-TCV3N44E.js.map → chunk-3CLBGHTL.js.map} +0 -0
- /package/dist/{chunk-KKN4LLVE.js.map → chunk-3CUWQXTG.js.map} +0 -0
- /package/dist/{chunk-QXSW3CNN.js.map → chunk-3CYTVX4T.js.map} +0 -0
- /package/dist/{chunk-I5ZVCY2N.js.map → chunk-3EPA2A4M.js.map} +0 -0
- /package/dist/{chunk-DRSY37PB.js.map → chunk-3MJHHPRW.js.map} +0 -0
- /package/dist/{chunk-NLYNRE7L.js.map → chunk-3RUCLKAK.js.map} +0 -0
- /package/dist/{chunk-36JKV7CA.js.map → chunk-3UEZ6NUI.js.map} +0 -0
- /package/dist/{chunk-EYZ6QBTV.js.map → chunk-3XS37SQT.js.map} +0 -0
- /package/dist/{chunk-BSUG4KMP.js.map → chunk-44USLRMT.js.map} +0 -0
- /package/dist/{chunk-DJYL2LC6.js.map → chunk-44Z72DDM.js.map} +0 -0
- /package/dist/{chunk-4WCDMCIS.js.map → chunk-4CHYMTBT.js.map} +0 -0
- /package/dist/{chunk-2LIRGFEK.js.map → chunk-4GN2RLYL.js.map} +0 -0
- /package/dist/{chunk-HN3PZTUK.js.map → chunk-4MKVGSHX.js.map} +0 -0
- /package/dist/{chunk-BRM3T4LQ.js.map → chunk-4S2LWZ7L.js.map} +0 -0
- /package/dist/{chunk-OQRG34VG.js.map → chunk-4SHMSLFA.js.map} +0 -0
- /package/dist/{chunk-62UAI62O.js.map → chunk-4UVFPORR.js.map} +0 -0
- /package/dist/{chunk-YTINPQKU.js.map → chunk-4XHVGUOM.js.map} +0 -0
- /package/dist/{chunk-7DK6YVJU.js.map → chunk-4Z7GEO2R.js.map} +0 -0
- /package/dist/{chunk-A2TANYNR.js.map → chunk-53O2TNSR.js.map} +0 -0
- /package/dist/{chunk-T6EKPFKZ.js.map → chunk-54HTXJJ2.js.map} +0 -0
- /package/dist/{chunk-OHZU4IT3.js.map → chunk-5B7BTLN4.js.map} +0 -0
- /package/dist/{chunk-K5V6TCYB.js.map → chunk-5ETBB2DG.js.map} +0 -0
- /package/dist/{chunk-5752357K.js.map → chunk-5KGABAQB.js.map} +0 -0
- /package/dist/{chunk-JKIKHWD2.js.map → chunk-5NT2M2JI.js.map} +0 -0
- /package/dist/{chunk-JE6RZ5L6.js.map → chunk-5ZOJLYD2.js.map} +0 -0
- /package/dist/{chunk-7EH4D6FU.js.map → chunk-6H4TPEMO.js.map} +0 -0
- /package/dist/{chunk-WB6ZU3B3.js.map → chunk-6JGATEOF.js.map} +0 -0
- /package/dist/{chunk-TU5A2CV7.js.map → chunk-6L2FKTBO.js.map} +0 -0
- /package/dist/{chunk-ME3WYPYK.js.map → chunk-6MD5QXXJ.js.map} +0 -0
- /package/dist/{chunk-HQZRI7UX.js.map → chunk-6N2EDWMG.js.map} +0 -0
- /package/dist/{chunk-H224XFFD.js.map → chunk-6REPQ352.js.map} +0 -0
- /package/dist/{chunk-YZ2DMP23.js.map → chunk-6TPYT3UC.js.map} +0 -0
- /package/dist/{chunk-I4MRBEWU.js.map → chunk-6ZD3FI5P.js.map} +0 -0
- /package/dist/{chunk-PWZHCBG3.js.map → chunk-72FPUWD6.js.map} +0 -0
- /package/dist/{chunk-VRPREI27.js.map → chunk-72S2RGWD.js.map} +0 -0
- /package/dist/{chunk-OAW6GCS3.js.map → chunk-77BKKPCI.js.map} +0 -0
- /package/dist/{chunk-67O4GPJJ.js.map → chunk-7FEXRMJE.js.map} +0 -0
- /package/dist/{chunk-KN5J3NEZ.js.map → chunk-7KKMZJFT.js.map} +0 -0
- /package/dist/{chunk-KJDBY2KN.js.map → chunk-7LILFS72.js.map} +0 -0
- /package/dist/{chunk-SLDSWQVE.js.map → chunk-7TE4TMS3.js.map} +0 -0
- /package/dist/{chunk-AG3DY5TH.js.map → chunk-ADSA76T7.js.map} +0 -0
- /package/dist/{chunk-BKASAYQL.js.map → chunk-ALOUJ3CE.js.map} +0 -0
- /package/dist/{chunk-VY2BMSHN.js.map → chunk-ANYOSBNA.js.map} +0 -0
- /package/dist/{chunk-LNHYBA4B.js.map → chunk-AWG2AJHX.js.map} +0 -0
- /package/dist/{chunk-7X7ZHJHM.js.map → chunk-B3QWQG62.js.map} +0 -0
- /package/dist/{chunk-2S752BIJ.js.map → chunk-BA6Z52QN.js.map} +0 -0
- /package/dist/{chunk-X4F32GUB.js.map → chunk-BM4KKGL7.js.map} +0 -0
- /package/dist/{chunk-4T6UIYJB.js.map → chunk-BVSSEOLI.js.map} +0 -0
- /package/dist/{chunk-3UABIEP3.js.map → chunk-C2TERIB4.js.map} +0 -0
- /package/dist/{chunk-TEEJ4GNY.js.map → chunk-C6OVO6AT.js.map} +0 -0
- /package/dist/{chunk-CYZZHWNK.js.map → chunk-CJ45OL7L.js.map} +0 -0
- /package/dist/{chunk-N7LPVR7P.js.map → chunk-CKHFYTIX.js.map} +0 -0
- /package/dist/{chunk-PA3AA55Q.js.map → chunk-CLK67TNH.js.map} +0 -0
- /package/dist/{chunk-MQ277OLB.js.map → chunk-CM2Q7IH3.js.map} +0 -0
- /package/dist/{chunk-ZXSWXE6U.js.map → chunk-CMFJQH6A.js.map} +0 -0
- /package/dist/{chunk-NOKN4HRK.js.map → chunk-CMLIWUBW.js.map} +0 -0
- /package/dist/{chunk-EA2UNEL6.js.map → chunk-CNR5RFKC.js.map} +0 -0
- /package/dist/{chunk-P52LYD6S.js.map → chunk-DFI2RKVQ.js.map} +0 -0
- /package/dist/{chunk-37USSARD.js.map → chunk-DH5UJD2I.js.map} +0 -0
- /package/dist/{chunk-PCLKFR27.js.map → chunk-DH6SL3SY.js.map} +0 -0
- /package/dist/{chunk-S6JHTEV4.js.map → chunk-DLWLIPCP.js.map} +0 -0
- /package/dist/{chunk-KN4ZE2XZ.js.map → chunk-EIII4QU4.js.map} +0 -0
- /package/dist/{chunk-L566FMDD.js.map → chunk-EO5IEWFI.js.map} +0 -0
- /package/dist/{chunk-VY6L74JQ.js.map → chunk-EQXIW5MQ.js.map} +0 -0
- /package/dist/{chunk-MWPXKZ7O.js.map → chunk-ERY6D2OV.js.map} +0 -0
- /package/dist/{chunk-6PU3JYVY.js.map → chunk-F3AYISXT.js.map} +0 -0
- /package/dist/{chunk-GY4NBSCN.js.map → chunk-FDMQ7H22.js.map} +0 -0
- /package/dist/{chunk-IBGP3VSR.js.map → chunk-FHW3ATT7.js.map} +0 -0
- /package/dist/{chunk-WL6N33AB.js.map → chunk-FIO55AKI.js.map} +0 -0
- /package/dist/{chunk-5CQNBMLK.js.map → chunk-FTQBVZ7V.js.map} +0 -0
- /package/dist/{chunk-J5UZB6Y6.js.map → chunk-FXWXBEOZ.js.map} +0 -0
- /package/dist/{chunk-IGGXKT5B.js.map → chunk-G2WERTWZ.js.map} +0 -0
- /package/dist/{chunk-DF4QODJ6.js.map → chunk-G4TKMUOL.js.map} +0 -0
- /package/dist/{chunk-WY5PBZ7Q.js.map → chunk-G6ZPQHBL.js.map} +0 -0
- /package/dist/{chunk-JYR6VV4Y.js.map → chunk-G7XHJPLO.js.map} +0 -0
- /package/dist/{chunk-IQJCLFF4.js.map → chunk-GANW7FXQ.js.map} +0 -0
- /package/dist/{chunk-3LSIFHQK.js.map → chunk-GE2CCITY.js.map} +0 -0
- /package/dist/{chunk-G3XLFQ2Z.js.map → chunk-GG62LKA3.js.map} +0 -0
- /package/dist/{chunk-YQCRQHVU.js.map → chunk-GI63FQEJ.js.map} +0 -0
- /package/dist/{chunk-7ICK5MXV.js.map → chunk-GJFAI3J5.js.map} +0 -0
- /package/dist/{chunk-2JNHWKQK.js.map → chunk-GPHURU2K.js.map} +0 -0
- /package/dist/{chunk-5FAI25JQ.js.map → chunk-H72YKEGD.js.map} +0 -0
- /package/dist/{chunk-J3XFUCCR.js.map → chunk-HKBJZX3C.js.map} +0 -0
- /package/dist/{chunk-M4QXG5JP.js.map → chunk-HQWJUHR4.js.map} +0 -0
- /package/dist/{chunk-4BNV5AAI.js.map → chunk-ITFFA3H2.js.map} +0 -0
- /package/dist/{chunk-RB3X6CEE.js.map → chunk-IWGW2E35.js.map} +0 -0
- /package/dist/{chunk-O25SH2MA.js.map → chunk-J6KLT7HP.js.map} +0 -0
- /package/dist/{chunk-CRG24BGI.js.map → chunk-JAGAFEZL.js.map} +0 -0
- /package/dist/{chunk-RDCHT2WN.js.map → chunk-JE5GEWTG.js.map} +0 -0
- /package/dist/{chunk-FLDLUAHW.js.map → chunk-JE6GQB5J.js.map} +0 -0
- /package/dist/{chunk-N23GCN5U.js.map → chunk-JFLFZLOA.js.map} +0 -0
- /package/dist/{chunk-35443PF6.js.map → chunk-JIRZ27RI.js.map} +0 -0
- /package/dist/{chunk-5MW7OYBM.js.map → chunk-JSGVYOMN.js.map} +0 -0
- /package/dist/{chunk-RNIU447I.js.map → chunk-JU3FRRO2.js.map} +0 -0
- /package/dist/{chunk-WOAXKWAB.js.map → chunk-K4A3JDYQ.js.map} +0 -0
- /package/dist/{chunk-HM2JJNUE.js.map → chunk-K6LNHHSH.js.map} +0 -0
- /package/dist/{chunk-NR5TW4AH.js.map → chunk-K7MQP2KT.js.map} +0 -0
- /package/dist/{chunk-2OWKL4CC.js.map → chunk-KCDNOMMT.js.map} +0 -0
- /package/dist/{chunk-O2DLEAUP.js.map → chunk-KHOAXZW2.js.map} +0 -0
- /package/dist/{chunk-W5TI46QN.js.map → chunk-KQZGUHYZ.js.map} +0 -0
- /package/dist/{chunk-2K7WPHI3.js.map → chunk-KW3H5FUS.js.map} +0 -0
- /package/dist/{chunk-7D2C4LK2.js.map → chunk-LCWGNDTH.js.map} +0 -0
- /package/dist/{chunk-FNRPQE2D.js.map → chunk-LF3EVXMF.js.map} +0 -0
- /package/dist/{chunk-MCJRHF7Z.js.map → chunk-LGCRL7DK.js.map} +0 -0
- /package/dist/{chunk-JK5UJM4Y.js.map → chunk-LODMNSLR.js.map} +0 -0
- /package/dist/{chunk-YUXDVW62.js.map → chunk-M65ZNPLO.js.map} +0 -0
- /package/dist/{chunk-URHX4FAQ.js.map → chunk-MKLIMY3D.js.map} +0 -0
- /package/dist/{chunk-2FM5SUQV.js.map → chunk-MM5XSAVE.js.map} +0 -0
- /package/dist/{chunk-LXT3X33C.js.map → chunk-NCB4GBRL.js.map} +0 -0
- /package/dist/{chunk-FNO5TWBJ.js.map → chunk-NCEQWEXT.js.map} +0 -0
- /package/dist/{chunk-FWPFCK4D.js.map → chunk-NDHDBOUH.js.map} +0 -0
- /package/dist/{chunk-WRCLYSTX.js.map → chunk-NFGIA2ZV.js.map} +0 -0
- /package/dist/{chunk-VPPIODKX.js.map → chunk-NQ7NMCRI.js.map} +0 -0
- /package/dist/{chunk-YMTZN54Q.js.map → chunk-NRSVI23L.js.map} +0 -0
- /package/dist/{chunk-2622YFM6.js.map → chunk-NSVSC6ZC.js.map} +0 -0
- /package/dist/{chunk-Z43N7ASP.js.map → chunk-NU55QUMO.js.map} +0 -0
- /package/dist/{chunk-66O55OZI.js.map → chunk-NYFGFELX.js.map} +0 -0
- /package/dist/{chunk-JXECOCNA.js.map → chunk-P6Q2O3TU.js.map} +0 -0
- /package/dist/{chunk-RTEY5COP.js.map → chunk-PAICZOL5.js.map} +0 -0
- /package/dist/{chunk-ZN6YATOG.js.map → chunk-PAT2BQOQ.js.map} +0 -0
- /package/dist/{chunk-TZBOWSAM.js.map → chunk-PICOOZLX.js.map} +0 -0
- /package/dist/{chunk-JJJM75XF.js.map → chunk-PNDYAIKM.js.map} +0 -0
- /package/dist/{chunk-EJYJLVPK.js.map → chunk-PRLYYKMG.js.map} +0 -0
- /package/dist/{chunk-4GB46HLK.js.map → chunk-PTONBPZL.js.map} +0 -0
- /package/dist/{chunk-FNG33MKA.js.map → chunk-QDELBNL3.js.map} +0 -0
- /package/dist/{chunk-DSF4VT7L.js.map → chunk-QEI5DC6S.js.map} +0 -0
- /package/dist/{chunk-VJ2BNJ5M.js.map → chunk-QMELMQPA.js.map} +0 -0
- /package/dist/{chunk-HDJQDMHB.js.map → chunk-QMHS6ZDI.js.map} +0 -0
- /package/dist/{chunk-2WVHZIWP.js.map → chunk-QSRZOXQI.js.map} +0 -0
- /package/dist/{chunk-C3LZ3OGJ.js.map → chunk-R2FUQV24.js.map} +0 -0
- /package/dist/{chunk-GOWBYHYW.js.map → chunk-R6SBP5M5.js.map} +0 -0
- /package/dist/{chunk-HWSS6C7C.js.map → chunk-RDFPM2AQ.js.map} +0 -0
- /package/dist/{chunk-4RPFI474.js.map → chunk-RSDYS5B3.js.map} +0 -0
- /package/dist/{chunk-X53F33KA.js.map → chunk-RWXYND4H.js.map} +0 -0
- /package/dist/{chunk-4NPPO63U.js.map → chunk-RZ2VZ7SL.js.map} +0 -0
- /package/dist/{chunk-ORRI6FMN.js.map → chunk-S4IXC2V3.js.map} +0 -0
- /package/dist/{chunk-MXCIUKTQ.js.map → chunk-SDBBJ6FG.js.map} +0 -0
- /package/dist/{chunk-UMNXSQ7I.js.map → chunk-SNBAMWI5.js.map} +0 -0
- /package/dist/{chunk-LP3JCXER.js.map → chunk-SNW5MJ6I.js.map} +0 -0
- /package/dist/{chunk-5OBGW3FG.js.map → chunk-STTULW2K.js.map} +0 -0
- /package/dist/{chunk-3CTQZDSD.js.map → chunk-TCNTIGMY.js.map} +0 -0
- /package/dist/{chunk-Y6C4MYZE.js.map → chunk-TNQDSTIA.js.map} +0 -0
- /package/dist/{chunk-6RLCBNDV.js.map → chunk-TPVSHO75.js.map} +0 -0
- /package/dist/{chunk-BUPDBEBA.js.map → chunk-TTJTMDLI.js.map} +0 -0
- /package/dist/{chunk-TU5EIKJA.js.map → chunk-U5SH3VRJ.js.map} +0 -0
- /package/dist/{chunk-MLQYIJTO.js.map → chunk-U6W2RY3Z.js.map} +0 -0
- /package/dist/{chunk-4WF6ZLIW.js.map → chunk-UGPRBJWB.js.map} +0 -0
- /package/dist/{chunk-Y6G4I42P.js.map → chunk-VEEG4UXZ.js.map} +0 -0
- /package/dist/{chunk-IRD45DRW.js.map → chunk-VOJBLBXE.js.map} +0 -0
- /package/dist/{chunk-KHPL2J3B.js.map → chunk-VPAOVEI2.js.map} +0 -0
- /package/dist/{chunk-DYGWKZ7T.js.map → chunk-VWJEM2ER.js.map} +0 -0
- /package/dist/{chunk-FERUQ7OB.js.map → chunk-VYA4QWQL.js.map} +0 -0
- /package/dist/{chunk-UKX3MPB7.js.map → chunk-VYV3JOV5.js.map} +0 -0
- /package/dist/{chunk-B7CNP5HW.js.map → chunk-WV62BSWA.js.map} +0 -0
- /package/dist/{chunk-IWEUSZY3.js.map → chunk-X66E5WSX.js.map} +0 -0
- /package/dist/{chunk-OJ2XR3WH.js.map → chunk-XB7HYOMM.js.map} +0 -0
- /package/dist/{chunk-H6AWKLOV.js.map → chunk-XBLFK2FL.js.map} +0 -0
- /package/dist/{chunk-5HDYTTE7.js.map → chunk-XHA2NXLD.js.map} +0 -0
- /package/dist/{chunk-F4KYBBTY.js.map → chunk-XLXMJ6X2.js.map} +0 -0
- /package/dist/{chunk-SCZABICW.js.map → chunk-XO4ZUHVH.js.map} +0 -0
- /package/dist/{chunk-PARTZ7XI.js.map → chunk-XP522FFM.js.map} +0 -0
- /package/dist/{chunk-MBHWVRV5.js.map → chunk-XVZG52CM.js.map} +0 -0
- /package/dist/{chunk-TGXCG62P.js.map → chunk-XXL4PM4M.js.map} +0 -0
- /package/dist/{chunk-YKEO6UHN.js.map → chunk-XZJM6EPC.js.map} +0 -0
- /package/dist/{chunk-YTY7TD7S.js.map → chunk-XZY7O7JJ.js.map} +0 -0
- /package/dist/{chunk-WZNTZX5N.js.map → chunk-Y2UXX5IQ.js.map} +0 -0
- /package/dist/{chunk-QOLIBVGS.js.map → chunk-YGYQC7MT.js.map} +0 -0
- /package/dist/{chunk-THMT3G3L.js.map → chunk-YLXQWYOG.js.map} +0 -0
- /package/dist/{chunk-M4KVKQRN.js.map → chunk-YPIVLPXF.js.map} +0 -0
- /package/dist/{chunk-57FZM6GH.js.map → chunk-YRUX7XMQ.js.map} +0 -0
- /package/dist/{chunk-M2Q5CLPU.js.map → chunk-YTXZUTLF.js.map} +0 -0
- /package/dist/{chunk-ZWCYSAI5.js.map → chunk-YWJDUJAR.js.map} +0 -0
- /package/dist/{chunk-S36NC22G.js.map → chunk-Z2NN53E5.js.map} +0 -0
- /package/dist/{chunk-GC56IWIZ.js.map → chunk-Z4DKVLYG.js.map} +0 -0
- /package/dist/{chunk-U4QUDFPJ.js.map → chunk-Z4O3F6KU.js.map} +0 -0
- /package/dist/{chunk-JC22FNFA.js.map → chunk-Z6T5SXST.js.map} +0 -0
- /package/dist/{chunk-TXEN3QJ4.js.map → chunk-ZC5HDBQO.js.map} +0 -0
- /package/dist/{chunk-LEHMWJNZ.js.map → chunk-ZEYUSS3W.js.map} +0 -0
- /package/dist/{chunk-4WNFOBTH.js.map → chunk-ZKWVCSAB.js.map} +0 -0
- /package/dist/{chunk-GEB4WSZH.js.map → chunk-ZNBLGS66.js.map} +0 -0
- /package/dist/native/chunks/{chunk-ONXKFA5Z.js.map → chunk-A2QNZ4VK.js.map} +0 -0
- /package/dist/native/chunks/{chunk-X6RQGKGF.js.map → chunk-BST5DUUD.js.map} +0 -0
- /package/dist/native/chunks/{chunk-GUBTMR2K.js.map → chunk-EDYZEMVD.js.map} +0 -0
- /package/dist/native/chunks/{chunk-SZF56GVJ.js.map → chunk-LECBJD35.js.map} +0 -0
- /package/dist/native/chunks/{chunk-JBYDLWQA.js.map → chunk-MTRRGDBQ.js.map} +0 -0
- /package/dist/native/chunks/{chunk-IMGBBIMT.js.map → chunk-PN7C2BEY.js.map} +0 -0
- /package/dist/native/chunks/{chunk-4ZAULIDG.js.map → chunk-S4F364X4.js.map} +0 -0
- /package/dist/native/chunks/{chunk-5IASLIBI.js.map → chunk-VJFKRXY2.js.map} +0 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# NumberField
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
|
|
5
|
+
A **digits-only** numeric input whose value is a `number | null`. For the
|
|
6
|
+
counts, durations and limits settings forms are full of — "prepare in 15 min",
|
|
7
|
+
"keep for 30 days" — where a plain text input lets letters in and a
|
|
8
|
+
`type="number"` field brings scroll-wheel surprises, `e`, `-` and a value that is
|
|
9
|
+
a string.
|
|
10
|
+
|
|
11
|
+
- `inputMode="numeric"` on the `<input>` itself, so a phone opens its number pad.
|
|
12
|
+
- A non-digit keystroke never reaches the field; a paste keeps only its digits
|
|
13
|
+
(`"1.500 min"` → `1500`).
|
|
14
|
+
- `suffix` — the unit — is drawn **inside** the field's border, at its end.
|
|
15
|
+
- ArrowUp / ArrowDown move by `step`, never past `min` / `max`.
|
|
16
|
+
- An empty field is `null`. Never `0`, never `NaN`: "cleared" and "zero" stay
|
|
17
|
+
two different answers.
|
|
18
|
+
|
|
19
|
+
Built on [`Input`](../Input/Input.md), so it takes the field radius, height,
|
|
20
|
+
border, variants and sizes like every other field.
|
|
21
|
+
|
|
22
|
+
## Usage
|
|
23
|
+
|
|
24
|
+
```tsx
|
|
25
|
+
import { NumberField } from '@12-apps/ui/form/NumberField';
|
|
26
|
+
|
|
27
|
+
const [minutes, setMinutes] = useState<number | null>(15);
|
|
28
|
+
|
|
29
|
+
<NumberField
|
|
30
|
+
label="Preparation time"
|
|
31
|
+
value={minutes}
|
|
32
|
+
onChange={setMinutes}
|
|
33
|
+
min={1}
|
|
34
|
+
max={120}
|
|
35
|
+
step={5}
|
|
36
|
+
suffix="min"
|
|
37
|
+
helperText="Between 1 and 120"
|
|
38
|
+
/>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Props
|
|
42
|
+
|
|
43
|
+
Everything [`Input`](../Input/Input.md) takes (`label`, `helperText`, `error`,
|
|
44
|
+
`size`, `variant`, `disabled`, `placeholder`, `data-testid`, …), except the ones
|
|
45
|
+
this field owns (`value`, `onChange`, `type`, `inputMode`, `pattern`, `min`,
|
|
46
|
+
`max`, `step`, `endAdornment`, `maxLength`), plus:
|
|
47
|
+
|
|
48
|
+
| prop | type | default | effect |
|
|
49
|
+
|---|---|---|---|
|
|
50
|
+
| `value` | `number \| null` | **required** | The value. `null` renders an empty field. |
|
|
51
|
+
| `onChange` | `(value: number \| null) => void` | **required** | Every edit, as a number, or `null` once cleared. Not called when an edit leaves the number unchanged. |
|
|
52
|
+
| `min` | `number` | — | Where ArrowDown stops, where an empty field's first arrow press lands, and what a blur raises a smaller value to. |
|
|
53
|
+
| `max` | `number` | — | Where ArrowUp stops, and what a blur lowers a larger value to. |
|
|
54
|
+
| `step` | `number` | `1` | How far one arrow press moves. |
|
|
55
|
+
| `suffix` | `ReactNode` | — | The unit, inside the field's border. Also read as part of the field's description. |
|
|
56
|
+
|
|
57
|
+
## Behaviour notes
|
|
58
|
+
|
|
59
|
+
- **Bounds apply to arrows at once, to typing on blur.** Typing `5` on the way to
|
|
60
|
+
`50` must not snap to a minimum of `10` under the reader's fingers; the blur
|
|
61
|
+
brings an out-of-range value back inside.
|
|
62
|
+
- **Digits only means non-negative integers.** There is no minus sign and no
|
|
63
|
+
decimal separator; a field that needs either is not this one.
|
|
64
|
+
- **At most fifteen digits** — the longest run that is always a safe integer, so
|
|
65
|
+
a pasted serial number never becomes a rounded float.
|
|
66
|
+
- From empty, either arrow lands on `min` (or `0`): the first press says "give me
|
|
67
|
+
a number", and the floor is the one both directions agree on.
|
|
68
|
+
- A caller's `onKeyDown` runs first; calling `preventDefault()` in it cancels the
|
|
69
|
+
field's own handling of that key.
|
|
70
|
+
|
|
71
|
+
## Accessibility
|
|
72
|
+
|
|
73
|
+
- `role="spinbutton"` with `aria-valuenow`, `aria-valuemin` and `aria-valuemax`
|
|
74
|
+
— the arrow keys make it one, and a screen reader then says so, and says where
|
|
75
|
+
in the range the value sits.
|
|
76
|
+
- The suffix has an id and is in the input's `aria-describedby` (after the
|
|
77
|
+
helper text), so "15" is announced with its unit.
|
|
78
|
+
- `inputMode="numeric"` and `pattern="[0-9]*"` bring up the numeric keypad on
|
|
79
|
+
iOS and Android.
|
|
80
|
+
|
|
81
|
+
## Best practices
|
|
82
|
+
|
|
83
|
+
- Put the unit in `suffix`, not in the label: "Preparation time" + `min` reads
|
|
84
|
+
better than "Preparation time (min)", and the unit stays next to the number.
|
|
85
|
+
- Store `null` as "not set" on the host side. Coercing it to `0` is how a
|
|
86
|
+
cleared field ends up submitting a value nobody chose.
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import React, { useCallback, useId } from 'react';
|
|
2
|
+
|
|
3
|
+
import { Input } from '../Input';
|
|
4
|
+
|
|
5
|
+
import { clamp, formatValue, isRefusedKey, parseDigits, stepValue } from './NumberField.helpers';
|
|
6
|
+
import type { NumberFieldProps } from './NumberField.types';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* A digits-only number input whose value is a `number | null`.
|
|
10
|
+
*
|
|
11
|
+
* - `inputMode="numeric"` on the `<input>` itself, so a phone opens its number
|
|
12
|
+
* pad (the attribute does nothing anywhere else — see `Input.types.ts`).
|
|
13
|
+
* - A non-digit keystroke never reaches the field, and a paste keeps only its
|
|
14
|
+
* digits: `"1.500 min"` pastes as `1500`.
|
|
15
|
+
* - `suffix` is drawn inside the field's border, and read as its description.
|
|
16
|
+
* - ArrowUp / ArrowDown move by `step`, never past `min` / `max`. Typing may go
|
|
17
|
+
* out of bounds for a moment (typing `5` on the way to `50` must not snap to a
|
|
18
|
+
* minimum of 10); the blur brings it back inside.
|
|
19
|
+
* - Clearing the field reports `null`, not `0` and not `NaN`.
|
|
20
|
+
*
|
|
21
|
+
* `role="spinbutton"` with `aria-valuenow` / `-min` / `-max`, because that is
|
|
22
|
+
* what the arrow keys make it — a screen reader then says so, and says where
|
|
23
|
+
* in the range the value sits.
|
|
24
|
+
*/
|
|
25
|
+
export const NumberField = React.forwardRef<HTMLInputElement, NumberFieldProps>(function NumberField(
|
|
26
|
+
props,
|
|
27
|
+
ref,
|
|
28
|
+
) {
|
|
29
|
+
const {
|
|
30
|
+
value, onChange, min, max, step = 1, suffix, onKeyDown, onBlur, inputProps, id: idProp,
|
|
31
|
+
'aria-describedby': callerDescribedBy, ...rest
|
|
32
|
+
} = props;
|
|
33
|
+
const generated = useId();
|
|
34
|
+
const id = idProp ?? `number-field-${generated}`;
|
|
35
|
+
const suffixId = `${id}-suffix`;
|
|
36
|
+
|
|
37
|
+
const commit = useCallback(
|
|
38
|
+
(next: number | null) => {
|
|
39
|
+
if (next !== value) onChange(next);
|
|
40
|
+
},
|
|
41
|
+
[value, onChange],
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {
|
|
45
|
+
onKeyDown?.(event);
|
|
46
|
+
if (event.defaultPrevented) return;
|
|
47
|
+
if (event.key === 'ArrowUp' || event.key === 'ArrowDown') {
|
|
48
|
+
event.preventDefault();
|
|
49
|
+
commit(stepValue(value, event.key === 'ArrowUp' ? 1 : -1, step, { min, max }));
|
|
50
|
+
} else if (isRefusedKey(event)) {
|
|
51
|
+
event.preventDefault();
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
const handleBlur = (event: React.FocusEvent<HTMLInputElement>) => {
|
|
56
|
+
if (value !== null) commit(clamp(value, { min, max }));
|
|
57
|
+
onBlur?.(event);
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const describedBy = [callerDescribedBy, suffix != null ? suffixId : undefined].filter(Boolean).join(' ');
|
|
61
|
+
|
|
62
|
+
return (
|
|
63
|
+
<Input
|
|
64
|
+
ref={ref}
|
|
65
|
+
{...rest}
|
|
66
|
+
id={id}
|
|
67
|
+
type="text"
|
|
68
|
+
autoComplete="off"
|
|
69
|
+
value={formatValue(value)}
|
|
70
|
+
onChange={(event) => commit(parseDigits(event.target.value))}
|
|
71
|
+
onBlur={handleBlur}
|
|
72
|
+
aria-describedby={describedBy || undefined}
|
|
73
|
+
endAdornment={suffix != null ? <span id={suffixId}>{suffix}</span> : undefined}
|
|
74
|
+
inputProps={{
|
|
75
|
+
...inputProps,
|
|
76
|
+
inputMode: 'numeric',
|
|
77
|
+
pattern: '[0-9]*',
|
|
78
|
+
role: 'spinbutton',
|
|
79
|
+
'aria-valuenow': value ?? undefined,
|
|
80
|
+
'aria-valuemin': min,
|
|
81
|
+
'aria-valuemax': max,
|
|
82
|
+
onKeyDown: handleKeyDown,
|
|
83
|
+
}}
|
|
84
|
+
/>
|
|
85
|
+
);
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
NumberField.displayName = 'NumberField';
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
|
|
3
|
+
import type { InputProps } from '../Input/Input.types';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* What `NumberField` takes over from `Input`: the value and its change are
|
|
7
|
+
* numbers here, not strings, and the element's type, keyboard and trailing
|
|
8
|
+
* slot are the field's own.
|
|
9
|
+
*/
|
|
10
|
+
type OwnedInputProps =
|
|
11
|
+
| 'value'
|
|
12
|
+
| 'defaultValue'
|
|
13
|
+
| 'onChange'
|
|
14
|
+
| 'type'
|
|
15
|
+
| 'inputMode'
|
|
16
|
+
| 'pattern'
|
|
17
|
+
| 'min'
|
|
18
|
+
| 'max'
|
|
19
|
+
| 'step'
|
|
20
|
+
| 'endAdornment'
|
|
21
|
+
| 'maxLength';
|
|
22
|
+
|
|
23
|
+
export interface NumberFieldProps extends Omit<InputProps, OwnedInputProps> {
|
|
24
|
+
/** The value. `null` is an empty field — never `0`, never `NaN`. */
|
|
25
|
+
value: number | null;
|
|
26
|
+
/** Every edit, as the number it now reads, or `null` once cleared. */
|
|
27
|
+
onChange: (value: number | null) => void;
|
|
28
|
+
/**
|
|
29
|
+
* The lowest value ArrowDown reaches, and what a blur raises a smaller one
|
|
30
|
+
* to. Digits only, so the field never holds a negative number whatever this
|
|
31
|
+
* says.
|
|
32
|
+
*/
|
|
33
|
+
min?: number;
|
|
34
|
+
/** The highest value ArrowUp reaches, and what a blur lowers a larger one to. */
|
|
35
|
+
max?: number;
|
|
36
|
+
/** How far one ArrowUp / ArrowDown moves the value. Defaults to 1. */
|
|
37
|
+
step?: number;
|
|
38
|
+
/**
|
|
39
|
+
* The unit, drawn INSIDE the field's border at its end — "min", "%", "kg".
|
|
40
|
+
* Also read to screen readers as part of the field's description.
|
|
41
|
+
*/
|
|
42
|
+
suffix?: ReactNode;
|
|
43
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# NumberField Test Status Tracking
|
|
2
|
+
|
|
3
|
+
## Test Files Status
|
|
4
|
+
|
|
5
|
+
- [x] NumberField.test.stories.tsx created
|
|
6
|
+
- [x] `__tests__/NumberField.test.tsx` (Vitest: helpers + component)
|
|
7
|
+
- [x] Core categories implemented (interaction, keyboard, screen reader, visual/layout, edge cases)
|
|
8
|
+
|
|
9
|
+
## Storybook Tests Status
|
|
10
|
+
|
|
11
|
+
### Test Results
|
|
12
|
+
|
|
13
|
+
| Test Name | Status | Pass/Fail | Notes |
|
|
14
|
+
| -------------------------------- | ------ | --------- | ------------------------------------------------------- |
|
|
15
|
+
| Typing keeps digits only | PASS | Pass | `1a2-3.e` lands as `123` |
|
|
16
|
+
| Paste keeps digits only | PASS | Pass | `1.500 min` reports `1500` |
|
|
17
|
+
| Arrows step within bounds | PASS | Pass | step 5, clamped to 5–20; `aria-valuenow` follows |
|
|
18
|
+
| Clearing reports null | PASS | Pass | reported value is `null`, input empty |
|
|
19
|
+
| Blur clamps typed value | PASS | Pass | typed `5` with min 10 becomes `10` on blur |
|
|
20
|
+
| Suffix inside the border | PASS | Pass | suffix rect inside `.MuiInputBase-root`, right of input |
|
|
21
|
+
| Numeric spinbutton | PASS | Pass | `inputmode`, `aria-value*`, suffix in describedby |
|
|
22
|
+
|
|
23
|
+
Legend: Pending | Running | PASS | FAIL
|
|
24
|
+
|
|
25
|
+
## Static Stories Status
|
|
26
|
+
|
|
27
|
+
- [x] Default story
|
|
28
|
+
- [x] WithSuffix, WithBounds
|
|
29
|
+
- [x] Empty state story (`null`)
|
|
30
|
+
- [x] Error state story
|
|
31
|
+
- [x] Disabled state story
|
|
32
|
+
- [x] Sizes
|
|
33
|
+
- [x] Edge cases (fifteen digits, long suffix)
|
|
34
|
+
|
|
35
|
+
## Lint Status
|
|
36
|
+
|
|
37
|
+
- [x] No lint errors
|
|
38
|
+
- [x] No warnings
|
|
39
|
+
|
|
40
|
+
## TypeCheck Status
|
|
41
|
+
|
|
42
|
+
- [x] No type errors
|
|
43
|
+
- [x] All props properly typed
|
|
44
|
+
|
|
45
|
+
## Overall Component Status
|
|
46
|
+
|
|
47
|
+
- [x] All tests passing
|
|
48
|
+
- [x] Lint clean
|
|
49
|
+
- [x] TypeCheck clean
|
|
50
|
+
- [x] Stories working
|
|
51
|
+
- [ ] Ready for production (pending review)
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# NumberField
|
|
2
|
+
|
|
3
|
+
A digits-only numeric input over `Input` whose value is `number | null` (`null`
|
|
4
|
+
is an empty field). `inputMode="numeric"` on the `<input>`, non-digit keystrokes
|
|
5
|
+
refused and pastes reduced to their digits, a `suffix` drawn inside the field,
|
|
6
|
+
and ArrowUp / ArrowDown stepping by `step` within `min` / `max`. Built for the
|
|
7
|
+
`layout/SettingCard` family's forms (FUT-2823) but independent of it.
|
|
8
|
+
|
|
9
|
+
## Props
|
|
10
|
+
|
|
11
|
+
- **value** — the number, or `null` for an empty field.
|
|
12
|
+
- **onChange** — every edit as a number, or `null` once cleared.
|
|
13
|
+
- **min** — floor for arrows and for the blur clamp.
|
|
14
|
+
- **max** — ceiling for arrows and for the blur clamp.
|
|
15
|
+
- **step** — how far one arrow press moves (default 1).
|
|
16
|
+
- **suffix** — the unit, inside the field border, read as its description.
|
|
17
|
+
- Everything else `Input` takes, minus the props this field owns.
|
|
18
|
+
|
|
19
|
+
## Lint
|
|
20
|
+
|
|
21
|
+
- Clean (`pnpm lint:files src/components/form/NumberField`), including the
|
|
22
|
+
complexity and flakiness gates.
|
|
23
|
+
|
|
24
|
+
## Type Errors
|
|
25
|
+
|
|
26
|
+
- None (`pnpm typecheck`, `tsc -p tsconfig.stories.json`).
|
|
27
|
+
|
|
28
|
+
## Testing Scenarios
|
|
29
|
+
|
|
30
|
+
- Digits-only typing and paste; `null` on clear; arrow stepping and clamping;
|
|
31
|
+
blur clamp; suffix geometry; spinbutton ARIA; caller `onKeyDown` precedence.
|
|
32
|
+
|
|
33
|
+
## Storybook Tests List
|
|
34
|
+
|
|
35
|
+
- Form/NumberField/Tests → 7 interaction stories.
|
|
36
|
+
|
|
37
|
+
## Current
|
|
38
|
+
|
|
39
|
+
- 2026-09-26 16:40 BRT — v1 shipped with `Input` gaining a merged `inputProps`
|
|
40
|
+
pass-through (an attribute `Input` does not recognise otherwise lands on the
|
|
41
|
+
text field's root `<div>`). Remaining TODO: none for v1; a host adoption
|
|
42
|
+
follows in the origin host.
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { useCallback, useEffect, useLayoutEffect, useRef, useState, type RefObject } from 'react';
|
|
2
|
+
|
|
3
|
+
import { focusFirstTabbable } from '../../feedback/Dialog/Dialog.focus';
|
|
4
|
+
|
|
5
|
+
import type { SettingCardProps, SettingErrorFormatter, SettingSaveResult } from './SettingCard.types';
|
|
6
|
+
|
|
7
|
+
/** The sentence a rejected save shows: the host's, else the copy's fallback. */
|
|
8
|
+
export function saveErrorMessage(
|
|
9
|
+
error: unknown,
|
|
10
|
+
formatError: SettingErrorFormatter | undefined,
|
|
11
|
+
fallback: string,
|
|
12
|
+
): string {
|
|
13
|
+
return formatError?.(error) ?? fallback;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Open state that is controlled when `open` is passed and uncontrolled
|
|
18
|
+
* otherwise — the shape MUI's own `useControlled` has, without its dev-only
|
|
19
|
+
* warnings reaching into this package's surface.
|
|
20
|
+
*/
|
|
21
|
+
export function useControllableOpen(
|
|
22
|
+
open: boolean | undefined,
|
|
23
|
+
defaultOpen: boolean,
|
|
24
|
+
onOpenChange: ((open: boolean) => void) | undefined,
|
|
25
|
+
): [boolean, (next: boolean) => void] {
|
|
26
|
+
const [inner, setInner] = useState(defaultOpen);
|
|
27
|
+
const controlled = open !== undefined;
|
|
28
|
+
const value = controlled ? open : inner;
|
|
29
|
+
|
|
30
|
+
const setOpen = useCallback(
|
|
31
|
+
(next: boolean) => {
|
|
32
|
+
if (!controlled) setInner(next);
|
|
33
|
+
onOpenChange?.(next);
|
|
34
|
+
},
|
|
35
|
+
[controlled, onOpenChange],
|
|
36
|
+
);
|
|
37
|
+
|
|
38
|
+
return [value, setOpen];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Runs a save that may or may not be async and reports how it went.
|
|
43
|
+
*
|
|
44
|
+
* `Promise.resolve().then(save)` rather than `await save()`: it also catches a
|
|
45
|
+
* handler that throws SYNCHRONOUSLY, which an `await` inside `try` would too —
|
|
46
|
+
* but it keeps the pending state visible for one tick even when the handler
|
|
47
|
+
* returns nothing, so a save never "succeeds" in the middle of the click that
|
|
48
|
+
* started it. A sequence id drops the outcome of a run the card has since
|
|
49
|
+
* abandoned (closed, or started again).
|
|
50
|
+
*/
|
|
51
|
+
export function useSaveRunner(formatError: SettingErrorFormatter | undefined, fallback: string) {
|
|
52
|
+
const [saving, setSaving] = useState(false);
|
|
53
|
+
const [error, setError] = useState<string | null>(null);
|
|
54
|
+
const seq = useRef(0);
|
|
55
|
+
|
|
56
|
+
useEffect(
|
|
57
|
+
() => () => {
|
|
58
|
+
// Unmounted: whatever is still in flight has nobody left to report to.
|
|
59
|
+
seq.current += 1;
|
|
60
|
+
},
|
|
61
|
+
[],
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
const run = useCallback(
|
|
65
|
+
async (save: () => SettingSaveResult): Promise<boolean> => {
|
|
66
|
+
const mine = (seq.current += 1);
|
|
67
|
+
setSaving(true);
|
|
68
|
+
setError(null);
|
|
69
|
+
try {
|
|
70
|
+
await Promise.resolve().then(save);
|
|
71
|
+
if (seq.current !== mine) return false;
|
|
72
|
+
setSaving(false);
|
|
73
|
+
return true;
|
|
74
|
+
} catch (cause) {
|
|
75
|
+
if (seq.current !== mine) return false;
|
|
76
|
+
setSaving(false);
|
|
77
|
+
setError(saveErrorMessage(cause, formatError, fallback));
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
[formatError, fallback],
|
|
82
|
+
);
|
|
83
|
+
|
|
84
|
+
const reset = useCallback(() => {
|
|
85
|
+
seq.current += 1;
|
|
86
|
+
setSaving(false);
|
|
87
|
+
setError(null);
|
|
88
|
+
}, []);
|
|
89
|
+
|
|
90
|
+
return { saving, error, run, reset };
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* A switch that saves the moment it flips.
|
|
95
|
+
*
|
|
96
|
+
* It shows the flip at once (`pending`) and holds it while the save runs; a
|
|
97
|
+
* success hands back to the host's `checked`, which by then says the same
|
|
98
|
+
* thing, and a failure drops `pending` so the switch returns to what is
|
|
99
|
+
* actually saved. A flip while one is in flight is ignored rather than queued:
|
|
100
|
+
* two racing writes of a boolean have no right answer.
|
|
101
|
+
*/
|
|
102
|
+
export function useAsyncSwitch(options: {
|
|
103
|
+
checked: boolean;
|
|
104
|
+
onChange: (checked: boolean) => SettingSaveResult;
|
|
105
|
+
formatError: SettingErrorFormatter | undefined;
|
|
106
|
+
fallback: string;
|
|
107
|
+
}) {
|
|
108
|
+
const { checked, onChange, formatError, fallback } = options;
|
|
109
|
+
const [pending, setPending] = useState<boolean | null>(null);
|
|
110
|
+
const { saving, error, run } = useSaveRunner(formatError, fallback);
|
|
111
|
+
|
|
112
|
+
const flip = useCallback(
|
|
113
|
+
async (next: boolean) => {
|
|
114
|
+
if (saving) return;
|
|
115
|
+
setPending(next);
|
|
116
|
+
await run(() => onChange(next));
|
|
117
|
+
setPending(null);
|
|
118
|
+
},
|
|
119
|
+
[saving, run, onChange],
|
|
120
|
+
);
|
|
121
|
+
|
|
122
|
+
return { shown: pending ?? checked, saving, error, flip };
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Focus follows the card: into it when it opens, back to the trigger when it
|
|
127
|
+
* closes.
|
|
128
|
+
*
|
|
129
|
+
* Inward, it is the Dialog's own rule (`focusFirstTabbable`, FUT-2696): the
|
|
130
|
+
* first tabbable descendant, and a caller's `autoFocus` keeps winning. The
|
|
131
|
+
* card is NOT a trap — it is inline, the rest of the page is still there, and
|
|
132
|
+
* locking Tab inside it would strand a keyboard user who wants to leave
|
|
133
|
+
* mid-edit. What it owes them is the round trip: the Edit trigger unmounts
|
|
134
|
+
* while the card is open, so without the return focus would fall to <body>
|
|
135
|
+
* and the reader would start again from the top of the page.
|
|
136
|
+
*
|
|
137
|
+
* Only a TRANSITION moves focus: a card mounted open (or closed) leaves focus
|
|
138
|
+
* where the page put it.
|
|
139
|
+
*/
|
|
140
|
+
export function useFocusHandoff(
|
|
141
|
+
open: boolean,
|
|
142
|
+
body: RefObject<HTMLElement | null>,
|
|
143
|
+
trigger: RefObject<HTMLElement | null>,
|
|
144
|
+
): void {
|
|
145
|
+
const previous = useRef(open);
|
|
146
|
+
|
|
147
|
+
useLayoutEffect(() => {
|
|
148
|
+
if (previous.current === open) return;
|
|
149
|
+
previous.current = open;
|
|
150
|
+
if (open && body.current) focusFirstTabbable(body.current);
|
|
151
|
+
if (!open) trigger.current?.focus();
|
|
152
|
+
}, [open, body, trigger]);
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Everything an editable card DOES, apart from how it looks: its open state,
|
|
157
|
+
* the save and its outcome, Cancel, and where focus goes.
|
|
158
|
+
*/
|
|
159
|
+
export function useSettingCard(props: SettingCardProps) {
|
|
160
|
+
const { copy, onSave, onCancel, open: openProp, defaultOpen = false, onOpenChange, formatError } = props;
|
|
161
|
+
const disabled = props.disabled ?? false;
|
|
162
|
+
const saveDisabled = props.saveDisabled ?? false;
|
|
163
|
+
const [open, setOpen] = useControllableOpen(openProp, defaultOpen, onOpenChange);
|
|
164
|
+
const { saving, error, run, reset } = useSaveRunner(formatError, copy.saveFailed);
|
|
165
|
+
const bodyRef = useRef<HTMLDivElement>(null);
|
|
166
|
+
const editRef = useRef<HTMLButtonElement>(null);
|
|
167
|
+
useFocusHandoff(open, bodyRef, editRef);
|
|
168
|
+
|
|
169
|
+
// However the card closed — Cancel, a save, or a controlling host — the
|
|
170
|
+
// next opening starts without the last one's error.
|
|
171
|
+
useEffect(() => {
|
|
172
|
+
if (!open) reset();
|
|
173
|
+
}, [open, reset]);
|
|
174
|
+
|
|
175
|
+
const openCard = useCallback(() => setOpen(true), [setOpen]);
|
|
176
|
+
|
|
177
|
+
const cancel = useCallback(() => {
|
|
178
|
+
if (saving) return;
|
|
179
|
+
setOpen(false);
|
|
180
|
+
onCancel?.();
|
|
181
|
+
}, [saving, setOpen, onCancel]);
|
|
182
|
+
|
|
183
|
+
const save = useCallback(() => {
|
|
184
|
+
if (saving || saveDisabled) return;
|
|
185
|
+
void run(onSave).then((saved) => {
|
|
186
|
+
if (saved) setOpen(false);
|
|
187
|
+
});
|
|
188
|
+
}, [saving, saveDisabled, run, onSave, setOpen]);
|
|
189
|
+
|
|
190
|
+
return { open, disabled, saveDisabled, saving, error, bodyRef, editRef, openCard, cancel, save };
|
|
191
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# SettingCard
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
|
|
5
|
+
One setting, summarised while closed and edited **in place**. A settings screen
|
|
6
|
+
built from these reads as a list of answers ("Sign out after 30 minutes") with
|
|
7
|
+
one Edit each, instead of a wall of open forms.
|
|
8
|
+
|
|
9
|
+
- **Closed:** title, a status pill, a one-line summary, and Edit.
|
|
10
|
+
- **Open:** Edit opens the card where it is — no dialog, no route change —
|
|
11
|
+
around the host's form (`children`), a collapsible "learn more" disclosure and
|
|
12
|
+
Cancel / Save.
|
|
13
|
+
|
|
14
|
+
The card knows nothing about what it edits. The form, the draft and the save
|
|
15
|
+
are the host's; the card owns the open/closed state, the save's pending and
|
|
16
|
+
failed states, and focus.
|
|
17
|
+
|
|
18
|
+
Part of the `layout/SettingCard` family, with
|
|
19
|
+
[`SettingToggle`](./SettingToggle.md), [`SettingGroup`](./SettingGroup.md) and
|
|
20
|
+
[`SettingGrid`](./SettingGrid.md).
|
|
21
|
+
|
|
22
|
+
## Usage
|
|
23
|
+
|
|
24
|
+
```tsx
|
|
25
|
+
import { SettingCard } from '@12-apps/ui/layout/SettingCard';
|
|
26
|
+
import { NumberField } from '@12-apps/ui/form/NumberField';
|
|
27
|
+
import { useLocaleCopy } from '@12-apps/i18n/react';
|
|
28
|
+
import { SETTING_CARD_COPY } from '@12-apps/ui/locales';
|
|
29
|
+
|
|
30
|
+
const copy = useLocaleCopy(SETTING_CARD_COPY);
|
|
31
|
+
const [draft, setDraft] = useState<number | null>(saved);
|
|
32
|
+
|
|
33
|
+
<SettingCard
|
|
34
|
+
copy={copy}
|
|
35
|
+
title="Session timeout"
|
|
36
|
+
summary={`Sign out after ${saved} minutes`}
|
|
37
|
+
status={{ label: 'On', color: 'success' }}
|
|
38
|
+
learnMore="A shorter timeout protects shared devices."
|
|
39
|
+
onCancel={() => setDraft(saved)}
|
|
40
|
+
onSave={() => api.saveTimeout(draft)} // may return a promise
|
|
41
|
+
>
|
|
42
|
+
<NumberField label="Minutes" value={draft} onChange={setDraft} min={5} max={240} suffix="min" />
|
|
43
|
+
</SettingCard>
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Props
|
|
47
|
+
|
|
48
|
+
| prop | type | default | effect |
|
|
49
|
+
|---|---|---|---|
|
|
50
|
+
| `copy` | `SettingCardCopy` | **required** | Edit / Cancel / Save / Saving / Learn more / the fallback error. No shipped default — pass `EN_US_SETTING_CARD_COPY`, `PT_BR_SETTING_CARD_COPY`, or `SETTING_CARD_COPY` through `useLocaleCopy`. |
|
|
51
|
+
| `title` | `string` | **required** | The setting's name. A heading, and the accessible name of the card's region. |
|
|
52
|
+
| `onSave` | `() => void \| Promise<unknown>` | **required** | Persist the draft. See *Saving* below. |
|
|
53
|
+
| `children` | `ReactNode` | **required** | The form. Rendered only while open. |
|
|
54
|
+
| `summary` | `ReactNode` | — | The one line a closed card shows. Ends in an ellipsis rather than wrapping. |
|
|
55
|
+
| `status` | `{ label: string; color?: ColorValue }` | — | The pill beside the title. `label` is always shown, so colour never carries the meaning alone. |
|
|
56
|
+
| `learnMore` | `ReactNode` | — | Longer explanation behind a disclosure in the open card. Omit for no disclosure. |
|
|
57
|
+
| `onCancel` | `() => void` | — | The card closed without saving. Reset the host's draft here. |
|
|
58
|
+
| `open` / `defaultOpen` / `onOpenChange` | | uncontrolled, closed | Controlled or uncontrolled open state. `onOpenChange` hears Edit, Cancel, Escape and a successful save. |
|
|
59
|
+
| `disabled` | `boolean` | `false` | Disables Edit. |
|
|
60
|
+
| `saveDisabled` | `boolean` | `false` | Disables Save — for a draft the host knows is invalid. |
|
|
61
|
+
| `formatError` | `(error: unknown) => string \| undefined` | — | The sentence to show for a rejected save. `undefined` falls back to `copy.saveFailed`. |
|
|
62
|
+
| `headingLevel` | `'h2' … 'h6'` | `'h3'` | Where the title sits in the page outline. |
|
|
63
|
+
| `icon` | `ReactNode` | — | A decorative glyph before the title. |
|
|
64
|
+
| `dataTestId` | `string` | — | Root test id; parts derive `-edit`, `-save`, `-cancel`, `-summary`, `-status`, `-error`, `-saving`, `-body`, `-learn-more`, `-title`. |
|
|
65
|
+
| `className`, `sx` | | | Styling hooks on the root `<section>`. |
|
|
66
|
+
|
|
67
|
+
## Saving
|
|
68
|
+
|
|
69
|
+
- **Pending.** While the promise `onSave` returned is pending, Save shows a
|
|
70
|
+
spinner and `copy.saving`, the card is `aria-busy`, Cancel is disabled and
|
|
71
|
+
further presses of Save are ignored — `onSave` runs once.
|
|
72
|
+
- **Resolved.** The card closes and focus returns to Edit. Update `summary` from
|
|
73
|
+
the saved value in the same handler.
|
|
74
|
+
- **Rejected** (or `onSave` throws). The card **stays open**, the draft is
|
|
75
|
+
untouched, and the error appears in a `role="alert"` line that Save is
|
|
76
|
+
described by. The card never prints `error.message` by itself — that string
|
|
77
|
+
is written for a developer; map it with `formatError`.
|
|
78
|
+
|
|
79
|
+
Save is `aria-disabled`, not `disabled`, while pending: a disabled button drops
|
|
80
|
+
the focus it holds, and a keyboard user whose save then failed would be sent
|
|
81
|
+
back to the top of the page.
|
|
82
|
+
|
|
83
|
+
## Cancelling
|
|
84
|
+
|
|
85
|
+
Cancel (or Escape inside the open card) closes the card and calls `onCancel`.
|
|
86
|
+
`children` unmount on close, so any **uncontrolled** state inside the form is
|
|
87
|
+
discarded by construction; a controlled draft is the host's to reset in
|
|
88
|
+
`onCancel`, as in the example above.
|
|
89
|
+
|
|
90
|
+
## In a grid
|
|
91
|
+
|
|
92
|
+
An open card sets `grid-column: 1 / -1` on itself and carries
|
|
93
|
+
`data-setting-card-open`, so inside a [`SettingGrid`](./SettingGrid.md) — or any
|
|
94
|
+
CSS grid — its form gets the whole row. `height: 100%` lets it match the other
|
|
95
|
+
cards in its row while closed.
|
|
96
|
+
|
|
97
|
+
## Accessibility
|
|
98
|
+
|
|
99
|
+
- The root is a `<section>` labelled by the title; the title is a real heading
|
|
100
|
+
(`headingLevel`).
|
|
101
|
+
- Edit's accessible name is `copy.edit` **plus the title** ("Edit Session
|
|
102
|
+
timeout"), so a grid of cards is not a list of identical buttons.
|
|
103
|
+
- **Focus round trip.** Opening moves focus to the first tabbable element in the
|
|
104
|
+
form — the rule `Dialog` uses (`focusFirstTabbable`, FUT-2696), so a field's
|
|
105
|
+
own `autoFocus` still wins. Closing, by any path, returns focus to Edit. A
|
|
106
|
+
card mounted open does not take focus.
|
|
107
|
+
- **No focus trap.** The card is inline and the page around it stays usable; a
|
|
108
|
+
trap would strand a keyboard user who wants to leave mid-edit. Escape
|
|
109
|
+
cancels.
|
|
110
|
+
- The "learn more" trigger owns `aria-expanded` / `aria-controls`; the region is
|
|
111
|
+
kept mounted so `aria-controls` always resolves.
|
|
112
|
+
- The save failure is `role="alert"`, announced without moving focus.
|
|
113
|
+
|
|
114
|
+
## Best practices
|
|
115
|
+
|
|
116
|
+
- Keep `summary` to the current **value** in words, not a description of the
|
|
117
|
+
setting — the title already says what it is.
|
|
118
|
+
- Use `status` for a state that changes how the summary reads ("Off",
|
|
119
|
+
"Managed by your organisation"); skip it when the summary says it all.
|
|
120
|
+
- A setting that is a single on/off is a [`SettingToggle`](./SettingToggle.md),
|
|
121
|
+
not a card with a switch inside.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The setting-card family's lengths, in design px. The web reads every one
|
|
3
|
+
* through `rem(theme, n)`, so they scale with the host's type scale.
|
|
4
|
+
*/
|
|
5
|
+
export const SETTING_CARD = {
|
|
6
|
+
/** Between the icon and the title. */
|
|
7
|
+
iconGap: 12,
|
|
8
|
+
/** The spinner beside a switch while its flip is saving. */
|
|
9
|
+
spinnerSize: 16,
|
|
10
|
+
/** How far a group's dependent rows sit in from its main switch. */
|
|
11
|
+
groupIndent: 24,
|
|
12
|
+
/** The rule down the left of a group's dependent rows. */
|
|
13
|
+
groupRuleWidth: 2,
|
|
14
|
+
/** The narrowest a grid column gets by default. */
|
|
15
|
+
gridMinColumnWidth: 320,
|
|
16
|
+
} as const;
|
|
17
|
+
|
|
18
|
+
/** The grid's default gap, in theme SPACING units (not px): what `sx`'s `gap: 2` means. */
|
|
19
|
+
export const SETTING_GRID_GAP_UNITS = 2;
|
|
20
|
+
|
|
21
|
+
/** How faded a group's dependent rows are while the main switch is off. */
|
|
22
|
+
export const SETTING_GROUP_INACTIVE_OPACITY = 0.5;
|