@12-apps/ui 6.30.1 → 6.30.3
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/dist/_internal/components/data-display/Alert/Alert.js +4 -4
- package/dist/_internal/components/data-display/Alert/Alert.metrics.js +2 -2
- package/dist/_internal/components/data-display/Alert/Alert.styles.js +3 -3
- package/dist/_internal/components/data-display/Avatar/Avatar.js +5 -5
- package/dist/_internal/components/data-display/Avatar/Avatar.view.js +3 -3
- package/dist/_internal/components/data-display/Badge/Badge.animations.js +2 -2
- package/dist/_internal/components/data-display/Badge/Badge.js +6 -6
- package/dist/_internal/components/data-display/Badge/Badge.metrics.js +2 -2
- package/dist/_internal/components/data-display/Badge/Badge.styles.js +3 -3
- package/dist/_internal/components/data-display/Badge/Badge.variants.js +2 -2
- package/dist/_internal/components/data-display/Badge/BadgeContent.js +4 -4
- package/dist/_internal/components/data-display/Banner/Banner.js +2 -2
- package/dist/_internal/components/data-display/Banner/Banner.styles.js +2 -2
- package/dist/_internal/components/data-display/CardKit/CardKebab.js +6 -6
- package/dist/_internal/components/data-display/CardKit/card-actions-context.js +5 -5
- package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js +11 -11
- package/dist/_internal/components/data-display/CardKit/use-row-confirm.js +7 -7
- package/dist/_internal/components/data-display/Carousel/Carousel.chrome.js +2 -2
- package/dist/_internal/components/data-display/Carousel/Carousel.js +5 -5
- package/dist/_internal/components/data-display/Carousel/Carousel.parts.js +2 -2
- package/dist/_internal/components/data-display/Carousel/Carousel.styles.js +2 -2
- package/dist/_internal/components/data-display/Chart/Chart.js +6 -6
- package/dist/_internal/components/data-display/Chart/SpecChart.js +9 -9
- package/dist/_internal/components/data-display/Chart/chart-context.js +4 -4
- package/dist/_internal/components/data-display/Chart/chart-internals.js +2 -2
- package/dist/_internal/components/data-display/Chart/chart-renderers.js +5 -5
- package/dist/_internal/components/data-display/DataViews/DataViewsBoard.js +5 -5
- package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +52 -52
- package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +68 -68
- package/dist/_internal/components/data-display/DataViews/DeleteViewDialog.js +8 -8
- package/dist/_internal/components/data-display/DataViews/ManageViewsDialog.js +10 -10
- package/dist/_internal/components/data-display/DataViews/SaveViewModal.js +13 -13
- package/dist/_internal/components/data-display/DataViews/base-card.js +7 -7
- package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +10 -10
- package/dist/_internal/components/data-display/DataViews/base-list-card-gutters.js +4 -4
- package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +9 -9
- package/dist/_internal/components/data-display/DataViews/base-list-card.js +14 -14
- package/dist/_internal/components/data-display/DataViews/card-surface.js +2 -2
- package/dist/_internal/components/data-display/DataViews/data-views-category-pill.js +11 -11
- package/dist/_internal/components/data-display/DataViews/data-views-columns-tab.js +5 -5
- package/dist/_internal/components/data-display/DataViews/data-views-columns.js +7 -7
- package/dist/_internal/components/data-display/DataViews/data-views-display-panel.js +13 -13
- package/dist/_internal/components/data-display/DataViews/data-views-display-tabs.js +7 -7
- package/dist/_internal/components/data-display/DataViews/data-views-empty.js +8 -8
- package/dist/_internal/components/data-display/DataViews/data-views-export.js +8 -8
- package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +12 -12
- package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +14 -14
- package/dist/_internal/components/data-display/DataViews/data-views-grid-helpers.js +6 -6
- package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +49 -49
- package/dist/_internal/components/data-display/DataViews/data-views-header-row.js +5 -5
- package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +21 -21
- 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 +29 -6
- package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +33 -10
- package/dist/_internal/components/data-display/DataViews/data-views-overflow.js +1 -1
- package/dist/_internal/components/data-display/DataViews/data-views-pagination.js +3 -3
- package/dist/_internal/components/data-display/DataViews/data-views-scope-tabs.js +3 -3
- package/dist/_internal/components/data-display/DataViews/data-views-select-all-strip.js +8 -8
- package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +18 -18
- package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +20 -20
- package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +17 -17
- package/dist/_internal/components/data-display/DataViews/data-views-view-nav.js +8 -8
- package/dist/_internal/components/data-display/DataViews/list-card-rails.js +3 -3
- package/dist/_internal/components/data-display/DataViews/save-view-preview.js +5 -5
- package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +9 -9
- package/dist/_internal/components/data-display/DataViews/use-saved-views-controller.js +2 -2
- package/dist/_internal/components/data-display/DescriptionItem/DescriptionItem.js +5 -5
- package/dist/_internal/components/data-display/FleetMap/FleetBody.js +11 -11
- package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js +10 -10
- package/dist/_internal/components/data-display/FleetMap/FleetMap.fixtures.js +2 -2
- package/dist/_internal/components/data-display/FleetMap/FleetMap.js +15 -15
- package/dist/_internal/components/data-display/HoverCard/HoverCard.js +2 -2
- package/dist/_internal/components/data-display/Lightbox/Lightbox.js +3 -3
- package/dist/_internal/components/data-display/MapPreview/MapDecorations.js +2 -2
- package/dist/_internal/components/data-display/MapPreview/MapLayers.js +2 -2
- package/dist/_internal/components/data-display/MapPreview/MapPreview.hooks.js +2 -2
- package/dist/_internal/components/data-display/MapPreview/MapPreview.js +9 -9
- 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 +5 -5
- package/dist/_internal/components/data-display/Progress/Progress.metrics.js +3 -3
- package/dist/_internal/components/data-display/Progress/Progress.styles.js +4 -4
- package/dist/_internal/components/data-display/Sheet/Sheet.body.js +2 -2
- package/dist/_internal/components/data-display/Sheet/Sheet.hooks.js +2 -2
- package/dist/_internal/components/data-display/Sheet/Sheet.js +5 -5
- package/dist/_internal/components/data-display/Sheet/Sheet.styles.js +2 -2
- package/dist/_internal/components/data-display/Table/Table.js +3 -3
- package/dist/_internal/components/data-display/index.js +57 -57
- package/dist/_internal/components/feedback/ConfirmAction/ConfirmButton.js +6 -6
- package/dist/_internal/components/feedback/Modal/Modal.js +2 -2
- package/dist/_internal/components/feedback/NotificationStatusNotice/NotificationStatusNotice.js +8 -8
- package/dist/_internal/components/feedback/index.js +14 -14
- package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.js +5 -5
- package/dist/_internal/components/form/AddressAutocomplete/AddressAutocompleteField.js +3 -3
- package/dist/_internal/components/form/Autocomplete/Autocomplete.js +1 -1
- package/dist/_internal/components/form/Button/Button.js +5 -5
- package/dist/_internal/components/form/Button/Button.styles.js +3 -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 +5 -5
- package/dist/_internal/components/form/CategorySelect/CategoryPanelList.js +3 -3
- package/dist/_internal/components/form/CategorySelect/CategoryRows.js +2 -2
- package/dist/_internal/components/form/CategorySelect/CategorySelect.js +9 -9
- package/dist/_internal/components/form/CepField/CepField.js +2 -2
- package/dist/_internal/components/form/Checkbox/Checkbox.js +3 -3
- package/dist/_internal/components/form/CodeEditor/CodeEditor.js +1 -1
- package/dist/_internal/components/form/Command/Command.js +2 -2
- package/dist/_internal/components/form/Command/Command.styles.js +2 -2
- package/dist/_internal/components/form/DateRangePicker/DateRangePicker.js +7 -7
- package/dist/_internal/components/form/Input/Input.js +1 -1
- package/dist/_internal/components/form/InputOTP/InputOTP.js +2 -2
- package/dist/_internal/components/form/Label/Label.js +2 -2
- package/dist/_internal/components/form/Label/Label.styles.js +2 -2
- package/dist/_internal/components/form/Menubar/Menubar.item.js +2 -2
- package/dist/_internal/components/form/Menubar/Menubar.js +2 -2
- package/dist/_internal/components/form/Menubar/Menubar.styles.js +2 -2
- package/dist/_internal/components/form/Menubar/Menubar.toolbar.js +2 -2
- package/dist/_internal/components/form/NumberField/NumberField.helpers.js +20 -0
- package/dist/_internal/components/form/NumberField/NumberField.js +21 -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/Switch/Switch.js +5 -5
- package/dist/_internal/components/form/Switch/Switch.parts.js +4 -4
- package/dist/_internal/components/form/Switch/Switch.styles.js +3 -3
- package/dist/_internal/components/form/UploadButton/UploadButton.js +2 -2
- package/dist/_internal/components/form/index.js +47 -41
- package/dist/_internal/components/form/total-form/Fields/CategoryField.js +10 -10
- package/dist/_internal/components/form/total-form/Fields/CepField.js +3 -3
- package/dist/_internal/components/form/total-form/Fields/TextField.js +2 -2
- package/dist/_internal/components/form/total-form/Fields/index.js +20 -20
- package/dist/_internal/components/form/total-form/SubmitButton.js +6 -6
- package/dist/_internal/components/index.js +194 -153
- package/dist/_internal/components/layout/Box/Box.js +5 -5
- package/dist/_internal/components/layout/ScrollArea/ScrollArea.js +1 -1
- package/dist/_internal/components/layout/SettingCard/SettingCard.focus.js +8 -0
- package/dist/_internal/components/layout/SettingCard/SettingCard.focus.js.map +1 -0
- 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 +44 -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 +49 -0
- package/dist/_internal/components/layout/SettingCard/SettingCard.parts.js.map +1 -0
- package/dist/_internal/components/layout/SettingCard/SettingCard.rem.js +8 -0
- package/dist/_internal/components/layout/SettingCard/SettingCard.rem.js.map +1 -0
- package/dist/_internal/components/layout/SettingCard/SettingCard.styles.js +35 -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 +46 -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 +55 -0
- package/dist/_internal/components/layout/SettingCard/SettingGroup.js.map +1 -0
- package/dist/_internal/components/layout/SettingCard/SettingSwitch.js +53 -0
- package/dist/_internal/components/layout/SettingCard/SettingSwitch.js.map +1 -0
- package/dist/_internal/components/layout/SettingCard/SettingToggle.js +55 -0
- package/dist/_internal/components/layout/SettingCard/SettingToggle.js.map +1 -0
- package/dist/_internal/components/layout/SettingsLayout/SettingsLayout.js +3 -3
- package/dist/_internal/components/layout/Stack/Stack.js +6 -6
- package/dist/_internal/components/layout/index.js +74 -12
- package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js +9 -9
- package/dist/_internal/components/navigation/AppHeader/AppHeader.identity.js +2 -2
- package/dist/_internal/components/navigation/CommandPalette/CommandPalette.js +3 -3
- package/dist/_internal/components/navigation/Pagination/Pagination.js +2 -2
- package/dist/_internal/components/navigation/Tabs/Tabs.js +2 -2
- package/dist/_internal/components/navigation/index.js +26 -26
- package/dist/_internal/components/typography/Heading/Heading.js +5 -5
- package/dist/_internal/components/typography/Heading/Heading.metrics.js +3 -3
- package/dist/_internal/components/typography/Heading/Heading.styles.js +4 -4
- package/dist/_internal/components/typography/Paragraph/Paragraph.js +3 -3
- package/dist/_internal/components/typography/Text/Text.js +4 -4
- package/dist/_internal/components/typography/Text/Text.metrics.js +3 -3
- package/dist/_internal/components/typography/index.js +11 -11
- package/dist/_internal/components/utility/InstallPrompt/InstallPrompt.js +3 -3
- package/dist/_internal/components/utility/InstallPrompt/usePwaInstall.js +2 -2
- package/dist/_internal/components/utility/index.js +15 -15
- 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 +6 -6
- package/dist/_internal/provider/UiProvider.js +4 -4
- package/dist/_internal/provider/mui-bridge.js +3 -3
- package/dist/_internal/provider/use-ui-theme.js +4 -4
- 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 +11 -11
- package/dist/_internal/tokens/theme.js +2 -2
- package/dist/_internal/user-avatar/user-avatar.js +11 -11
- package/dist/charts.js +15 -15
- package/dist/{chunk-TSEWUY4V.js → chunk-23LZNANO.js} +2 -2
- package/dist/{chunk-K2EHH7TC.js → chunk-2CJXYSOE.js} +7 -7
- package/dist/{chunk-HGJHZ5PE.js → chunk-2DHVWNTO.js} +7 -7
- package/dist/{chunk-K2JH7QPR.js → chunk-2F2HPQNQ.js} +3 -3
- package/dist/chunk-2GTORM5E.js +1 -0
- package/dist/chunk-2GTORM5E.js.map +1 -0
- package/dist/{chunk-C5YBXQTK.js → chunk-2QJKWH7Q.js} +3 -3
- package/dist/{chunk-W3FAKT3D.js → chunk-2SWQ6HIK.js} +4 -4
- 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-3PUOLOEP.js → chunk-37L6O266.js} +2 -2
- package/dist/{chunk-EVXFEXBS.js → chunk-3ELEPGCP.js} +2 -2
- package/dist/{chunk-RVGG5YJY.js → chunk-3HJLJFLA.js} +2 -2
- package/dist/chunk-3U7WKBMH.js +27 -0
- package/dist/chunk-3U7WKBMH.js.map +1 -0
- package/dist/{chunk-VESIQYBF.js → chunk-3ZTC2VEO.js} +9 -9
- package/dist/{chunk-46UPILLK.js → chunk-4ETQRBZC.js} +4 -4
- package/dist/chunk-4HDP2PZD.js +9 -0
- package/dist/chunk-4HDP2PZD.js.map +1 -0
- package/dist/{chunk-PFZAUMJA.js → chunk-4JGBWPG7.js} +2 -2
- package/dist/{chunk-7IKWIWWV.js → chunk-53LG7IT4.js} +11 -11
- package/dist/{chunk-S2GDYA6R.js → chunk-5GMHJ7Y5.js} +5 -5
- package/dist/{chunk-IABE56TG.js → chunk-5ZOJLYD2.js} +4 -4
- package/dist/{chunk-XXE6NTJB.js → chunk-5ZXVYKHU.js} +10 -5
- package/dist/chunk-5ZXVYKHU.js.map +1 -0
- package/dist/{chunk-4XVH6IWN.js → chunk-66KAONOC.js} +3 -3
- package/dist/{chunk-4MXFPDKL.js → chunk-6CAP4STN.js} +4 -4
- package/dist/{chunk-C5EFVSBN.js → chunk-6HJLYSBM.js} +2 -2
- package/dist/{chunk-CASZGBCA.js → chunk-6P3CRSAW.js} +5 -5
- package/dist/chunk-6PPF5WEN.js +30 -0
- package/dist/chunk-6PPF5WEN.js.map +1 -0
- package/dist/{chunk-Y5UCOBQN.js → chunk-6SK3MTYJ.js} +4 -4
- package/dist/{chunk-JQL4GG5L.js → chunk-6VMTF23F.js} +5 -5
- package/dist/{chunk-EPRA5QLB.js → chunk-6XUZDJZY.js} +2 -2
- package/dist/{chunk-B6IURHSZ.js → chunk-7DNQHMDO.js} +4 -4
- package/dist/{chunk-SLMA4UQS.js → chunk-A3TISECJ.js} +3 -3
- package/dist/{chunk-FVPN4YKW.js → chunk-ABSHD35E.js} +3 -3
- package/dist/chunk-AEMD6JHZ.js +1 -0
- package/dist/chunk-AEMD6JHZ.js.map +1 -0
- package/dist/{chunk-PQECNGDE.js → chunk-AGYGNNOM.js} +2 -2
- package/dist/{chunk-SUTNQG7E.js → chunk-ALU3BH37.js} +4 -4
- package/dist/{chunk-MGPA6KTM.js → chunk-AMFP64L3.js} +2 -2
- package/dist/{chunk-VEGT5PAD.js → chunk-BAISDZ3L.js} +21 -21
- package/dist/chunk-BOWS4U6W.js +1 -0
- package/dist/chunk-BOWS4U6W.js.map +1 -0
- package/dist/{chunk-CZJLWCEG.js → chunk-BPYPUEM5.js} +2 -2
- package/dist/{chunk-3MALHTZQ.js → chunk-C4J7PVVI.js} +3 -3
- package/dist/{chunk-7OZBOS75.js → chunk-CK2NTT4S.js} +6 -6
- package/dist/{chunk-Q5NAZ7TW.js → chunk-CSGUSHAO.js} +4 -4
- package/dist/{chunk-YTYROOLY.js → chunk-D22EGB3T.js} +3 -3
- package/dist/{chunk-VNGYJXAU.js → chunk-DBV6DDQI.js} +2 -2
- package/dist/{chunk-6PKVHFCK.js → chunk-DCRNBKMY.js} +9 -9
- package/dist/{chunk-PMS3H3OO.js → chunk-DF2FFYZ7.js} +4 -4
- package/dist/chunk-DG2A4DQU.js +118 -0
- package/dist/chunk-DG2A4DQU.js.map +1 -0
- package/dist/{chunk-RBGOGTT2.js → chunk-DWZ7FLA7.js} +4 -4
- package/dist/{chunk-237NDIT2.js → chunk-E3O72LBJ.js} +2 -2
- package/dist/{chunk-OH3YGJT5.js → chunk-EMNGIYH6.js} +5 -5
- package/dist/{chunk-XFUNJYFT.js → chunk-EPNUVSNK.js} +7 -7
- package/dist/{chunk-35UG2QDB.js → chunk-EUEUZI4L.js} +2 -2
- package/dist/{chunk-KUJLZFDW.js → chunk-FCG5YR6T.js} +3 -3
- package/dist/{chunk-2UBFDRL7.js → chunk-FCTURAZF.js} +2 -2
- package/dist/{chunk-UC6A6ASM.js → chunk-FFQKUTO6.js} +2 -2
- package/dist/{chunk-J3ZP6EUS.js → chunk-FNIHELAR.js} +2 -2
- package/dist/{chunk-SQV3HPTZ.js → chunk-G76H5PEM.js} +4 -4
- package/dist/{chunk-FLIMEQUA.js → chunk-GBX5ACPF.js} +5 -5
- package/dist/{chunk-22ZJH7RY.js → chunk-GN26LHNJ.js} +2 -2
- package/dist/{chunk-5KFZGB5U.js → chunk-GS7ESED2.js} +2 -2
- package/dist/{chunk-FGUK3D54.js → chunk-GZHZ7OTY.js} +3 -3
- package/dist/chunk-HALFOXSZ.js +1 -0
- package/dist/chunk-HALFOXSZ.js.map +1 -0
- package/dist/{chunk-BLBOYCOV.js → chunk-HKV4MQ2W.js} +5 -5
- package/dist/{chunk-K4JRHQMI.js → chunk-HMJM6DKA.js} +3 -3
- package/dist/{chunk-ZWIDQEJ4.js → chunk-HT7DWIR4.js} +5 -5
- package/dist/{chunk-UVD5NFRF.js → chunk-I3PGXMVJ.js} +2 -2
- package/dist/{chunk-Z52HVR4J.js → chunk-I4IPGIRF.js} +2 -2
- package/dist/{chunk-HR7YTBR7.js → chunk-IASDP44E.js} +4 -4
- package/dist/chunk-IAVQXQ3V.js +82 -0
- package/dist/chunk-IAVQXQ3V.js.map +1 -0
- package/dist/chunk-IC7GHPMK.js +22 -0
- package/dist/chunk-IC7GHPMK.js.map +1 -0
- package/dist/{chunk-VKH7AENA.js → chunk-IFNJWH55.js} +2 -2
- package/dist/{chunk-PUBPZOQJ.js → chunk-IPE5FFFD.js} +2 -2
- package/dist/{chunk-HP2ODXNA.js → chunk-IPS55KWK.js} +2 -2
- package/dist/{chunk-BILJU2DX.js → chunk-JFOATIMF.js} +5 -5
- package/dist/{chunk-MCBG6R5A.js → chunk-JH77UDWB.js} +3 -3
- package/dist/{chunk-XYDW5RQB.js → chunk-JTJR63WI.js} +2 -2
- package/dist/{chunk-IVVOIDE5.js → chunk-KHVKQPQ5.js} +3 -3
- package/dist/chunk-KRR6KK5J.js +117 -0
- package/dist/chunk-KRR6KK5J.js.map +1 -0
- package/dist/{chunk-T5WNNEP5.js → chunk-KVCS6IEI.js} +2 -2
- package/dist/{chunk-HZ6L7WXE.js → chunk-LGOIBC2C.js} +7 -7
- package/dist/chunk-LGPQVKHC.js +47 -0
- package/dist/chunk-LGPQVKHC.js.map +1 -0
- package/dist/{chunk-BKAB4KZK.js → chunk-LKAKYP42.js} +5 -5
- package/dist/{chunk-ZPIMPOHV.js → chunk-M7E66OSC.js} +4 -4
- package/dist/{chunk-VVXA7T2M.js → chunk-MG6XC5SK.js} +2 -2
- package/dist/{chunk-554SVTCN.js → chunk-MKZNP32D.js} +4 -4
- package/dist/chunk-MPRZDEKY.js +168 -0
- package/dist/chunk-MPRZDEKY.js.map +1 -0
- package/dist/{chunk-MSS6IU5X.js → chunk-N6V6BFKD.js} +3 -3
- package/dist/{chunk-OLQDB346.js → chunk-NH4XD62U.js} +2 -2
- package/dist/{chunk-GH2DC7PS.js → chunk-NPN7JTRM.js} +4 -4
- package/dist/{chunk-AIBNBWQU.js → chunk-NR7LSYLM.js} +2 -2
- package/dist/{chunk-3XLDTVLC.js → chunk-NU2HND2Y.js} +5 -5
- package/dist/{chunk-T2VO32Z2.js → chunk-OG5LJPI3.js} +2 -2
- package/dist/{chunk-REMK55JI.js → chunk-OLZTGVBT.js} +4 -4
- package/dist/{chunk-URVNHKM2.js → chunk-ON7PRAAC.js} +6 -6
- package/dist/{chunk-EZMCWRXO.js → chunk-OTMJBGJA.js} +24 -26
- package/dist/chunk-OTMJBGJA.js.map +1 -0
- package/dist/{chunk-3TFUAKWJ.js → chunk-OVOSDXFM.js} +2 -2
- package/dist/{chunk-SONWG2RT.js → chunk-OW4UEIXA.js} +5 -5
- package/dist/{chunk-23FCBIUN.js → chunk-P7FQUGED.js} +8 -8
- package/dist/{chunk-V7F53GEO.js → chunk-P7IVAMAU.js} +7 -7
- package/dist/{chunk-JYF3HT7M.js → chunk-PD6JRCUT.js} +8 -8
- package/dist/chunk-PGGGKYWG.js +1 -0
- package/dist/chunk-PGGGKYWG.js.map +1 -0
- package/dist/{chunk-B474PL5O.js → chunk-PKFFJAQ6.js} +2 -2
- package/dist/{chunk-EUKYQXYU.js → chunk-PLDVEJPR.js} +2 -2
- package/dist/{chunk-HT4B2DJU.js → chunk-PZEC5CQA.js} +4 -4
- package/dist/chunk-Q4JWWTL4.js +36 -0
- package/dist/chunk-Q4JWWTL4.js.map +1 -0
- package/dist/chunk-Q6FUSSLK.js +140 -0
- package/dist/chunk-Q6FUSSLK.js.map +1 -0
- package/dist/{chunk-6FUOUUYO.js → chunk-Q6STVEYJ.js} +4 -4
- package/dist/{chunk-6IKX5IIX.js → chunk-Q75SJ35X.js} +5 -5
- package/dist/{chunk-WC5XYWTE.js → chunk-QGJBNVC2.js} +2 -2
- package/dist/chunk-QGUNUXTT.js +1 -0
- package/dist/chunk-QGUNUXTT.js.map +1 -0
- package/dist/{chunk-KFZT3PHA.js → chunk-QHJ7FTZK.js} +4 -4
- package/dist/{chunk-NUB4T3RQ.js → chunk-QJ6KWJJH.js} +2 -2
- package/dist/chunk-R6XVOUNC.js +85 -0
- package/dist/chunk-R6XVOUNC.js.map +1 -0
- package/dist/{chunk-CZPU5TW3.js → chunk-RFZU5BTG.js} +2 -2
- package/dist/chunk-RH4QT7YT.js +74 -0
- package/dist/chunk-RH4QT7YT.js.map +1 -0
- package/dist/{chunk-JGV66VUK.js → chunk-RLCMVSJZ.js} +2 -2
- package/dist/chunk-RN7UJI7S.js +1 -0
- package/dist/chunk-RN7UJI7S.js.map +1 -0
- package/dist/{chunk-JB67KPGM.js → chunk-RRO2EOJB.js} +4 -4
- package/dist/{chunk-JJ3VR7WX.js → chunk-RZLWW3KC.js} +2 -2
- package/dist/{chunk-MZQTHSLN.js → chunk-S7HRED4D.js} +2 -2
- package/dist/{chunk-EXJBPKGW.js → chunk-SHDIZSN5.js} +5 -5
- package/dist/{chunk-GJQYM3PM.js → chunk-SHQWIDD5.js} +4 -4
- package/dist/{chunk-L6TCIZFR.js → chunk-SUAGBFYJ.js} +3 -3
- package/dist/{chunk-K5V3KCFI.js → chunk-SVBR3GWG.js} +6 -6
- package/dist/{chunk-DAPK3ADA.js → chunk-TC3EPGGJ.js} +4 -4
- package/dist/{chunk-DEE6IPGI.js → chunk-TJXNVREN.js} +2 -2
- package/dist/{chunk-WREIYOXN.js → chunk-TLMLEC4F.js} +7 -7
- package/dist/{chunk-57ZSQB5V.js → chunk-TLRTLYVT.js} +2 -2
- package/dist/{chunk-DUWF5LUK.js → chunk-TNCCCLLO.js} +4 -4
- package/dist/{chunk-TQ6FPOPD.js → chunk-TPKSOHB5.js} +5 -2
- package/dist/{chunk-TQ6FPOPD.js.map → chunk-TPKSOHB5.js.map} +1 -1
- package/dist/{chunk-JPVDZXXX.js → chunk-U5RQBHRY.js} +2 -2
- package/dist/{chunk-TU5EIKJA.js → chunk-U5SH3VRJ.js} +4 -4
- package/dist/chunk-V32X24SH.js +87 -0
- package/dist/chunk-V32X24SH.js.map +1 -0
- package/dist/{chunk-J4W4TQPC.js → chunk-V5P5Q6HM.js} +6 -6
- package/dist/{chunk-DQOLW4B5.js → chunk-VBMV2W4K.js} +3 -3
- package/dist/{chunk-57W2C7HY.js → chunk-VOHT6ZX3.js} +8 -8
- package/dist/{chunk-QYNCPS5W.js → chunk-WBKWIFXA.js} +6 -6
- package/dist/{chunk-VJFH2AXT.js → chunk-WG7HIXJ7.js} +8 -8
- package/dist/{chunk-VMXDTCYF.js → chunk-WMALDOF5.js} +4 -4
- package/dist/{chunk-I3FXTIKA.js → chunk-WP6Y2NJQ.js} +3 -3
- package/dist/chunk-WP6Y2NJQ.js.map +1 -0
- package/dist/{chunk-2L2NWXWJ.js → chunk-WRXD464C.js} +2 -2
- package/dist/{chunk-KT6HWAEN.js → chunk-WZUNBSS7.js} +2 -2
- package/dist/{chunk-NWQWUYOV.js → chunk-XGB3YF32.js} +2 -2
- package/dist/chunk-XJQNSMGA.js +10 -0
- package/dist/chunk-XJQNSMGA.js.map +1 -0
- package/dist/{chunk-QRX5BYUQ.js → chunk-Y6KPZQPI.js} +4 -4
- package/dist/{chunk-ZYKDPX3W.js → chunk-YY66AKSK.js} +2 -2
- package/dist/{chunk-62NA6IF3.js → chunk-ZBZ76VR7.js} +3 -3
- package/dist/{chunk-OXQP3N6X.js → chunk-ZTZ6S5Q6.js} +4 -4
- package/dist/data-display/Alert.js +4 -4
- package/dist/data-display/Avatar.js +5 -5
- package/dist/data-display/Badge.js +6 -6
- package/dist/data-display/Banner.js +2 -2
- package/dist/data-display/CardKit.js +15 -15
- package/dist/data-display/Carousel.js +5 -5
- package/dist/data-display/Chart.js +15 -15
- package/dist/data-display/Chip.js +1 -0
- package/dist/data-display/DataViews.js +88 -88
- package/dist/data-display/DescriptionItem.js +5 -5
- package/dist/data-display/FleetMap.js +15 -15
- package/dist/data-display/HoverCard.js +2 -2
- package/dist/data-display/Lightbox.js +3 -3
- package/dist/data-display/MapPreview.js +9 -9
- package/dist/data-display/Progress.js +5 -5
- package/dist/data-display/Sheet.js +5 -5
- package/dist/data-display/Table.js +3 -3
- package/dist/en-US.js +15 -11
- package/dist/feedback/ConfirmAction.js +9 -9
- package/dist/feedback/Modal.js +2 -2
- package/dist/feedback/NotificationStatusNotice.js +8 -8
- package/dist/form/AddressAutocomplete.js +5 -5
- package/dist/form/Autocomplete.js +1 -1
- package/dist/form/Button.js +5 -5
- package/dist/form/Calendar.js +4 -4
- package/dist/form/CategorySelect.js +9 -9
- package/dist/form/CepField.js +2 -2
- package/dist/form/Checkbox.js +3 -3
- package/dist/form/CodeEditor.js +1 -1
- package/dist/form/Command.js +2 -2
- package/dist/form/DateRangePicker.js +7 -7
- package/dist/form/Input.js +1 -1
- package/dist/form/InputOTP.js +2 -2
- package/dist/form/Label.js +2 -2
- package/dist/form/Menubar.js +2 -2
- package/dist/form/NumberField.js +22 -0
- package/dist/form/NumberField.js.map +1 -0
- package/dist/form/Switch.js +5 -5
- package/dist/form/UploadButton.js +2 -2
- package/dist/form/total-form.js +24 -24
- package/dist/icons.js +7 -6
- package/dist/layout/Box.js +5 -5
- package/dist/layout/Collapsible.js +1 -0
- package/dist/layout/ContentToolbar.js +3 -3
- package/dist/layout/ScrollArea.js +1 -1
- package/dist/layout/SettingCard.js +70 -0
- package/dist/layout/SettingCard.js.map +1 -0
- package/dist/layout/SettingsLayout.js +3 -3
- package/dist/layout/Stack.js +6 -6
- package/dist/locales.js +37 -23
- package/dist/locales.js.map +1 -1
- package/dist/navigation/AppHeader.js +11 -11
- package/dist/navigation/CommandPalette.js +3 -3
- package/dist/navigation/Pagination.js +2 -2
- package/dist/navigation/Tabs.js +2 -2
- package/dist/provider.js +5 -5
- package/dist/pt-BR.js +12 -8
- package/dist/social-login-button.js +11 -11
- package/dist/tokens.js +2 -2
- package/dist/types/components/data-display/DataViews/data-views-category-pill.d.ts +6 -1
- package/dist/types/components/data-display/DataViews/data-views-category-pill.d.ts.map +1 -1
- package/dist/types/components/data-display/DataViews/data-views-more-fields.d.ts +0 -11
- 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-overflow.d.ts.map +1 -1
- 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.focus.d.ts +19 -0
- package/dist/types/components/layout/SettingCard/SettingCard.focus.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.rem.d.ts +12 -0
- package/dist/types/components/layout/SettingCard/SettingCard.rem.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/pt-BR.layout.d.ts +3 -1
- package/dist/types/pt-BR.layout.d.ts.map +1 -1
- package/dist/typography/Heading.js +5 -5
- package/dist/typography/Paragraph.js +3 -3
- package/dist/typography/Text.js +4 -4
- package/dist/user-avatar.js +11 -11
- package/dist/utility/InstallPrompt.js +4 -4
- package/package.json +9 -1
- package/src/components/data-display/DataViews/data-views-category-pill.tsx +6 -1
- package/src/components/data-display/DataViews/data-views-more-fields.tsx +43 -37
- package/src/components/data-display/DataViews/data-views-overflow.ts +12 -1
- package/src/components/form/Input/Input.tsx +25 -12
- 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 +48 -0
- package/src/components/form/index.ts +1 -0
- package/src/components/layout/SettingCard/SettingCard.focus.ts +49 -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.rem.ts +14 -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 +63 -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/pt-BR.layout.ts +16 -0
- package/dist/chunk-A7RIZOAL.js +0 -13
- package/dist/chunk-A7RIZOAL.js.map +0 -1
- package/dist/chunk-BY3JEK5T.js +0 -1
- package/dist/chunk-EZMCWRXO.js.map +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-I3FXTIKA.js.map +0 -1
- package/dist/chunk-XXE6NTJB.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-TSEWUY4V.js.map → chunk-23LZNANO.js.map} +0 -0
- /package/dist/{chunk-K2EHH7TC.js.map → chunk-2CJXYSOE.js.map} +0 -0
- /package/dist/{chunk-HGJHZ5PE.js.map → chunk-2DHVWNTO.js.map} +0 -0
- /package/dist/{chunk-K2JH7QPR.js.map → chunk-2F2HPQNQ.js.map} +0 -0
- /package/dist/{chunk-C5YBXQTK.js.map → chunk-2QJKWH7Q.js.map} +0 -0
- /package/dist/{chunk-W3FAKT3D.js.map → chunk-2SWQ6HIK.js.map} +0 -0
- /package/dist/{chunk-IIUB4IOH.js.map → chunk-2XHIF3M3.js.map} +0 -0
- /package/dist/{chunk-3PUOLOEP.js.map → chunk-37L6O266.js.map} +0 -0
- /package/dist/{chunk-EVXFEXBS.js.map → chunk-3ELEPGCP.js.map} +0 -0
- /package/dist/{chunk-RVGG5YJY.js.map → chunk-3HJLJFLA.js.map} +0 -0
- /package/dist/{chunk-VESIQYBF.js.map → chunk-3ZTC2VEO.js.map} +0 -0
- /package/dist/{chunk-46UPILLK.js.map → chunk-4ETQRBZC.js.map} +0 -0
- /package/dist/{chunk-PFZAUMJA.js.map → chunk-4JGBWPG7.js.map} +0 -0
- /package/dist/{chunk-7IKWIWWV.js.map → chunk-53LG7IT4.js.map} +0 -0
- /package/dist/{chunk-S2GDYA6R.js.map → chunk-5GMHJ7Y5.js.map} +0 -0
- /package/dist/{chunk-IABE56TG.js.map → chunk-5ZOJLYD2.js.map} +0 -0
- /package/dist/{chunk-4XVH6IWN.js.map → chunk-66KAONOC.js.map} +0 -0
- /package/dist/{chunk-4MXFPDKL.js.map → chunk-6CAP4STN.js.map} +0 -0
- /package/dist/{chunk-C5EFVSBN.js.map → chunk-6HJLYSBM.js.map} +0 -0
- /package/dist/{chunk-CASZGBCA.js.map → chunk-6P3CRSAW.js.map} +0 -0
- /package/dist/{chunk-Y5UCOBQN.js.map → chunk-6SK3MTYJ.js.map} +0 -0
- /package/dist/{chunk-JQL4GG5L.js.map → chunk-6VMTF23F.js.map} +0 -0
- /package/dist/{chunk-EPRA5QLB.js.map → chunk-6XUZDJZY.js.map} +0 -0
- /package/dist/{chunk-B6IURHSZ.js.map → chunk-7DNQHMDO.js.map} +0 -0
- /package/dist/{chunk-SLMA4UQS.js.map → chunk-A3TISECJ.js.map} +0 -0
- /package/dist/{chunk-FVPN4YKW.js.map → chunk-ABSHD35E.js.map} +0 -0
- /package/dist/{chunk-PQECNGDE.js.map → chunk-AGYGNNOM.js.map} +0 -0
- /package/dist/{chunk-SUTNQG7E.js.map → chunk-ALU3BH37.js.map} +0 -0
- /package/dist/{chunk-MGPA6KTM.js.map → chunk-AMFP64L3.js.map} +0 -0
- /package/dist/{chunk-VEGT5PAD.js.map → chunk-BAISDZ3L.js.map} +0 -0
- /package/dist/{chunk-CZJLWCEG.js.map → chunk-BPYPUEM5.js.map} +0 -0
- /package/dist/{chunk-3MALHTZQ.js.map → chunk-C4J7PVVI.js.map} +0 -0
- /package/dist/{chunk-7OZBOS75.js.map → chunk-CK2NTT4S.js.map} +0 -0
- /package/dist/{chunk-Q5NAZ7TW.js.map → chunk-CSGUSHAO.js.map} +0 -0
- /package/dist/{chunk-YTYROOLY.js.map → chunk-D22EGB3T.js.map} +0 -0
- /package/dist/{chunk-VNGYJXAU.js.map → chunk-DBV6DDQI.js.map} +0 -0
- /package/dist/{chunk-6PKVHFCK.js.map → chunk-DCRNBKMY.js.map} +0 -0
- /package/dist/{chunk-PMS3H3OO.js.map → chunk-DF2FFYZ7.js.map} +0 -0
- /package/dist/{chunk-RBGOGTT2.js.map → chunk-DWZ7FLA7.js.map} +0 -0
- /package/dist/{chunk-237NDIT2.js.map → chunk-E3O72LBJ.js.map} +0 -0
- /package/dist/{chunk-OH3YGJT5.js.map → chunk-EMNGIYH6.js.map} +0 -0
- /package/dist/{chunk-XFUNJYFT.js.map → chunk-EPNUVSNK.js.map} +0 -0
- /package/dist/{chunk-35UG2QDB.js.map → chunk-EUEUZI4L.js.map} +0 -0
- /package/dist/{chunk-KUJLZFDW.js.map → chunk-FCG5YR6T.js.map} +0 -0
- /package/dist/{chunk-2UBFDRL7.js.map → chunk-FCTURAZF.js.map} +0 -0
- /package/dist/{chunk-UC6A6ASM.js.map → chunk-FFQKUTO6.js.map} +0 -0
- /package/dist/{chunk-J3ZP6EUS.js.map → chunk-FNIHELAR.js.map} +0 -0
- /package/dist/{chunk-SQV3HPTZ.js.map → chunk-G76H5PEM.js.map} +0 -0
- /package/dist/{chunk-FLIMEQUA.js.map → chunk-GBX5ACPF.js.map} +0 -0
- /package/dist/{chunk-22ZJH7RY.js.map → chunk-GN26LHNJ.js.map} +0 -0
- /package/dist/{chunk-5KFZGB5U.js.map → chunk-GS7ESED2.js.map} +0 -0
- /package/dist/{chunk-FGUK3D54.js.map → chunk-GZHZ7OTY.js.map} +0 -0
- /package/dist/{chunk-BLBOYCOV.js.map → chunk-HKV4MQ2W.js.map} +0 -0
- /package/dist/{chunk-K4JRHQMI.js.map → chunk-HMJM6DKA.js.map} +0 -0
- /package/dist/{chunk-ZWIDQEJ4.js.map → chunk-HT7DWIR4.js.map} +0 -0
- /package/dist/{chunk-UVD5NFRF.js.map → chunk-I3PGXMVJ.js.map} +0 -0
- /package/dist/{chunk-Z52HVR4J.js.map → chunk-I4IPGIRF.js.map} +0 -0
- /package/dist/{chunk-HR7YTBR7.js.map → chunk-IASDP44E.js.map} +0 -0
- /package/dist/{chunk-VKH7AENA.js.map → chunk-IFNJWH55.js.map} +0 -0
- /package/dist/{chunk-PUBPZOQJ.js.map → chunk-IPE5FFFD.js.map} +0 -0
- /package/dist/{chunk-HP2ODXNA.js.map → chunk-IPS55KWK.js.map} +0 -0
- /package/dist/{chunk-BILJU2DX.js.map → chunk-JFOATIMF.js.map} +0 -0
- /package/dist/{chunk-MCBG6R5A.js.map → chunk-JH77UDWB.js.map} +0 -0
- /package/dist/{chunk-XYDW5RQB.js.map → chunk-JTJR63WI.js.map} +0 -0
- /package/dist/{chunk-IVVOIDE5.js.map → chunk-KHVKQPQ5.js.map} +0 -0
- /package/dist/{chunk-T5WNNEP5.js.map → chunk-KVCS6IEI.js.map} +0 -0
- /package/dist/{chunk-HZ6L7WXE.js.map → chunk-LGOIBC2C.js.map} +0 -0
- /package/dist/{chunk-BKAB4KZK.js.map → chunk-LKAKYP42.js.map} +0 -0
- /package/dist/{chunk-ZPIMPOHV.js.map → chunk-M7E66OSC.js.map} +0 -0
- /package/dist/{chunk-VVXA7T2M.js.map → chunk-MG6XC5SK.js.map} +0 -0
- /package/dist/{chunk-554SVTCN.js.map → chunk-MKZNP32D.js.map} +0 -0
- /package/dist/{chunk-MSS6IU5X.js.map → chunk-N6V6BFKD.js.map} +0 -0
- /package/dist/{chunk-OLQDB346.js.map → chunk-NH4XD62U.js.map} +0 -0
- /package/dist/{chunk-GH2DC7PS.js.map → chunk-NPN7JTRM.js.map} +0 -0
- /package/dist/{chunk-AIBNBWQU.js.map → chunk-NR7LSYLM.js.map} +0 -0
- /package/dist/{chunk-3XLDTVLC.js.map → chunk-NU2HND2Y.js.map} +0 -0
- /package/dist/{chunk-T2VO32Z2.js.map → chunk-OG5LJPI3.js.map} +0 -0
- /package/dist/{chunk-REMK55JI.js.map → chunk-OLZTGVBT.js.map} +0 -0
- /package/dist/{chunk-URVNHKM2.js.map → chunk-ON7PRAAC.js.map} +0 -0
- /package/dist/{chunk-3TFUAKWJ.js.map → chunk-OVOSDXFM.js.map} +0 -0
- /package/dist/{chunk-SONWG2RT.js.map → chunk-OW4UEIXA.js.map} +0 -0
- /package/dist/{chunk-23FCBIUN.js.map → chunk-P7FQUGED.js.map} +0 -0
- /package/dist/{chunk-V7F53GEO.js.map → chunk-P7IVAMAU.js.map} +0 -0
- /package/dist/{chunk-JYF3HT7M.js.map → chunk-PD6JRCUT.js.map} +0 -0
- /package/dist/{chunk-B474PL5O.js.map → chunk-PKFFJAQ6.js.map} +0 -0
- /package/dist/{chunk-EUKYQXYU.js.map → chunk-PLDVEJPR.js.map} +0 -0
- /package/dist/{chunk-HT4B2DJU.js.map → chunk-PZEC5CQA.js.map} +0 -0
- /package/dist/{chunk-6FUOUUYO.js.map → chunk-Q6STVEYJ.js.map} +0 -0
- /package/dist/{chunk-6IKX5IIX.js.map → chunk-Q75SJ35X.js.map} +0 -0
- /package/dist/{chunk-WC5XYWTE.js.map → chunk-QGJBNVC2.js.map} +0 -0
- /package/dist/{chunk-KFZT3PHA.js.map → chunk-QHJ7FTZK.js.map} +0 -0
- /package/dist/{chunk-NUB4T3RQ.js.map → chunk-QJ6KWJJH.js.map} +0 -0
- /package/dist/{chunk-CZPU5TW3.js.map → chunk-RFZU5BTG.js.map} +0 -0
- /package/dist/{chunk-JGV66VUK.js.map → chunk-RLCMVSJZ.js.map} +0 -0
- /package/dist/{chunk-JB67KPGM.js.map → chunk-RRO2EOJB.js.map} +0 -0
- /package/dist/{chunk-JJ3VR7WX.js.map → chunk-RZLWW3KC.js.map} +0 -0
- /package/dist/{chunk-MZQTHSLN.js.map → chunk-S7HRED4D.js.map} +0 -0
- /package/dist/{chunk-EXJBPKGW.js.map → chunk-SHDIZSN5.js.map} +0 -0
- /package/dist/{chunk-GJQYM3PM.js.map → chunk-SHQWIDD5.js.map} +0 -0
- /package/dist/{chunk-L6TCIZFR.js.map → chunk-SUAGBFYJ.js.map} +0 -0
- /package/dist/{chunk-K5V3KCFI.js.map → chunk-SVBR3GWG.js.map} +0 -0
- /package/dist/{chunk-DAPK3ADA.js.map → chunk-TC3EPGGJ.js.map} +0 -0
- /package/dist/{chunk-DEE6IPGI.js.map → chunk-TJXNVREN.js.map} +0 -0
- /package/dist/{chunk-WREIYOXN.js.map → chunk-TLMLEC4F.js.map} +0 -0
- /package/dist/{chunk-57ZSQB5V.js.map → chunk-TLRTLYVT.js.map} +0 -0
- /package/dist/{chunk-DUWF5LUK.js.map → chunk-TNCCCLLO.js.map} +0 -0
- /package/dist/{chunk-JPVDZXXX.js.map → chunk-U5RQBHRY.js.map} +0 -0
- /package/dist/{chunk-TU5EIKJA.js.map → chunk-U5SH3VRJ.js.map} +0 -0
- /package/dist/{chunk-J4W4TQPC.js.map → chunk-V5P5Q6HM.js.map} +0 -0
- /package/dist/{chunk-DQOLW4B5.js.map → chunk-VBMV2W4K.js.map} +0 -0
- /package/dist/{chunk-57W2C7HY.js.map → chunk-VOHT6ZX3.js.map} +0 -0
- /package/dist/{chunk-QYNCPS5W.js.map → chunk-WBKWIFXA.js.map} +0 -0
- /package/dist/{chunk-VJFH2AXT.js.map → chunk-WG7HIXJ7.js.map} +0 -0
- /package/dist/{chunk-VMXDTCYF.js.map → chunk-WMALDOF5.js.map} +0 -0
- /package/dist/{chunk-2L2NWXWJ.js.map → chunk-WRXD464C.js.map} +0 -0
- /package/dist/{chunk-KT6HWAEN.js.map → chunk-WZUNBSS7.js.map} +0 -0
- /package/dist/{chunk-NWQWUYOV.js.map → chunk-XGB3YF32.js.map} +0 -0
- /package/dist/{chunk-QRX5BYUQ.js.map → chunk-Y6KPZQPI.js.map} +0 -0
- /package/dist/{chunk-ZYKDPX3W.js.map → chunk-YY66AKSK.js.map} +0 -0
- /package/dist/{chunk-62NA6IF3.js.map → chunk-ZBZ76VR7.js.map} +0 -0
- /package/dist/{chunk-OXQP3N6X.js.map → chunk-ZTZ6S5Q6.js.map} +0 -0
|
@@ -9,15 +9,15 @@
|
|
|
9
9
|
*
|
|
10
10
|
* A field with one or two options renders FLAT: inside a panel there is no
|
|
11
11
|
* space to win back, and two labelled checkboxes are faster than a dropdown
|
|
12
|
-
* needing a second click. Past that
|
|
13
|
-
* see `
|
|
12
|
+
* needing a second click. Past that — or whenever the field asks for a tree or
|
|
13
|
+
* a search — it is the bar's own {@link PillControl}; see `sharesBarControl`.
|
|
14
14
|
*/
|
|
15
15
|
import Checkbox from "@mui/material/Checkbox/index.js";
|
|
16
16
|
|
|
17
|
-
import { MultiSelectDropdown } from "../../layout/ContentToolbar";
|
|
18
17
|
import { Box } from "../../../mui/Box";
|
|
19
18
|
import { Text } from "../../typography/Text";
|
|
20
19
|
|
|
20
|
+
import { PillControl } from "./data-views-category-pill";
|
|
21
21
|
import type { OverflowField } from "./data-views-overflow";
|
|
22
22
|
import { RangeBounds } from "./data-views-range-pill";
|
|
23
23
|
import { isRangeSet } from "./data-views-range-values";
|
|
@@ -41,42 +41,59 @@ export interface MoreFieldProps {
|
|
|
41
41
|
*/
|
|
42
42
|
const INLINE_OPTION_LIMIT = 2;
|
|
43
43
|
|
|
44
|
-
/**
|
|
44
|
+
/**
|
|
45
|
+
* Whether an overflowed pill keeps the SAME control it has on the bar.
|
|
46
|
+
*
|
|
47
|
+
* The panel used to build its own flat dropdown for every field past two
|
|
48
|
+
* options, so a field's config only held while it fitted: `control:
|
|
49
|
+
* "category"` lost its tree (subcategories flattened into one list, no
|
|
50
|
+
* "Marcar tudo", no count footer) and `searchEnabled` lost its search, on
|
|
51
|
+
* exactly the phone widths where most filters live in here. Anything the bar
|
|
52
|
+
* would render as a dropdown now renders as the bar's own {@link PillControl};
|
|
53
|
+
* only a plain two-option field — one that did not ask for a dropdown, a tree
|
|
54
|
+
* or a search — stays a flat checkbox row, which is a panel layout rather than
|
|
55
|
+
* a different control (the filter panel draws the same line).
|
|
56
|
+
*/
|
|
57
|
+
function sharesBarControl<T extends Record<string, unknown>>(field: OverflowField<T>): boolean {
|
|
58
|
+
const pill = field.pill;
|
|
59
|
+
if (!pill) return false;
|
|
60
|
+
return (
|
|
61
|
+
pill.control === "category" ||
|
|
62
|
+
pill.control === "multiselect" ||
|
|
63
|
+
pill.searchEnabled === true ||
|
|
64
|
+
pill.options.length > INLINE_OPTION_LIMIT
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** One overflowed pill: the bar's control, or its options as checkboxes. */
|
|
45
69
|
function OverflowPill<T extends Record<string, unknown>>({
|
|
46
70
|
field,
|
|
47
71
|
values,
|
|
48
|
-
|
|
72
|
+
onTogglePill,
|
|
49
73
|
onClear,
|
|
50
74
|
testIdPrefix,
|
|
51
75
|
}: {
|
|
52
76
|
field: OverflowField<T>;
|
|
53
77
|
values: string[];
|
|
54
|
-
|
|
78
|
+
onTogglePill: (fieldId: string, value: string, checked: boolean) => void;
|
|
55
79
|
onClear: () => void;
|
|
56
80
|
testIdPrefix: string;
|
|
57
81
|
}): React.JSX.Element {
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
if (options.length > INLINE_OPTION_LIMIT) {
|
|
82
|
+
const testId = `${testIdPrefix}-more-${field.id}`;
|
|
83
|
+
if (field.pill && sharesBarControl(field)) {
|
|
61
84
|
return (
|
|
62
|
-
<
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
onClear={onClear}
|
|
71
|
-
allLabel={copy.filters.allOption}
|
|
72
|
-
searchable={options.length > 6 ? true : undefined}
|
|
73
|
-
searchPlaceholder={copy.filters.optionSearchPlaceholder}
|
|
74
|
-
noResultsLabel={copy.filters.optionsEmpty}
|
|
75
|
-
layout="pill"
|
|
76
|
-
data-testid={`${testIdPrefix}-more-${field.id}`}
|
|
85
|
+
<PillControl
|
|
86
|
+
fieldId={field.id}
|
|
87
|
+
pill={field.pill}
|
|
88
|
+
selected={values}
|
|
89
|
+
onTogglePill={onTogglePill}
|
|
90
|
+
onClearField={onClear}
|
|
91
|
+
testIdPrefix={testIdPrefix}
|
|
92
|
+
testId={testId}
|
|
77
93
|
/>
|
|
78
94
|
);
|
|
79
95
|
}
|
|
96
|
+
const onToggle = (value: string, checked: boolean) => onTogglePill(field.id, value, checked);
|
|
80
97
|
return (
|
|
81
98
|
<Box sx={{ display: "flex", flexWrap: "wrap", gap: 0.75 }}>
|
|
82
99
|
{(field.pill?.options ?? []).map((option) => {
|
|
@@ -85,7 +102,7 @@ function OverflowPill<T extends Record<string, unknown>>({
|
|
|
85
102
|
<Box
|
|
86
103
|
key={option.value}
|
|
87
104
|
component="label"
|
|
88
|
-
data-testid={`${
|
|
105
|
+
data-testid={`${testId}-${option.value}`}
|
|
89
106
|
sx={{
|
|
90
107
|
display: "inline-flex",
|
|
91
108
|
alignItems: "center",
|
|
@@ -163,17 +180,6 @@ function OverflowRange<T extends Record<string, unknown>>({
|
|
|
163
180
|
);
|
|
164
181
|
}
|
|
165
182
|
|
|
166
|
-
/**
|
|
167
|
-
* The trigger, badged with how many fields had no room on the bar — and told
|
|
168
|
-
* apart when some of them are APPLIED.
|
|
169
|
-
*
|
|
170
|
-
* An applied filter can land in here now (it is ranked first, not exempt), so
|
|
171
|
-
* this button is the only thing on screen still saying it exists. A neutral
|
|
172
|
-
* badge reading "3" would make "three filters you have not used" and "three
|
|
173
|
-
* filters narrowing this list" look identical, which is the whole failure the
|
|
174
|
-
* old exemption was written to avoid. So an overflow holding applied filters
|
|
175
|
-
* takes the applied tone and counts them in its own badge.
|
|
176
|
-
|
|
177
183
|
/**
|
|
178
184
|
* Whether a field has anything applied, and how to unapply it — the two shapes
|
|
179
185
|
* (a pill's selected values, a range's bounds) answered in one place so the
|
|
@@ -257,7 +263,7 @@ export function MoreGroup<T extends Record<string, unknown>>({
|
|
|
257
263
|
<OverflowPill
|
|
258
264
|
field={field}
|
|
259
265
|
values={pills[field.id] ?? []}
|
|
260
|
-
|
|
266
|
+
onTogglePill={onTogglePill}
|
|
261
267
|
onClear={() => (pills[field.id] ?? []).forEach((v) => onTogglePill(field.id, v, false))}
|
|
262
268
|
testIdPrefix={testIdPrefix}
|
|
263
269
|
/>
|
|
@@ -347,5 +347,16 @@ export function useFilterOverflow<T extends Record<string, unknown>>(
|
|
|
347
347
|
if (cache.current === null || (!frozen && cache.current.signature !== signature)) {
|
|
348
348
|
cache.current = { signature, split: computeSplit(all, pills, ranges, width, hasExport) };
|
|
349
349
|
}
|
|
350
|
-
|
|
350
|
+
// The cache holds the ARRANGEMENT — which ids sit on the bar, which in "Mais"
|
|
351
|
+
// — never the fields themselves. The signature keys on ids, so a field whose
|
|
352
|
+
// options arrive after the first measurement (a category list still loading)
|
|
353
|
+
// does not re-split, and handing back the cached objects served the empty
|
|
354
|
+
// list for good: "Categoria" in "Mais" rendered a label with no control under
|
|
355
|
+
// it (FUT-2828). Re-reading each field from `all` keeps the slots and the
|
|
356
|
+
// current config.
|
|
357
|
+
const { split } = cache.current;
|
|
358
|
+
const current = new Map(all.map((field) => [field.id, field]));
|
|
359
|
+
const fresh = (fields: OverflowField<T>[]): OverflowField<T>[] =>
|
|
360
|
+
fields.map((field) => current.get(field.id) ?? field);
|
|
361
|
+
return { ...split, inline: fresh(split.inline), overflow: fresh(split.overflow), barRef };
|
|
351
362
|
}
|
|
@@ -80,6 +80,28 @@ const interactionProps = (
|
|
|
80
80
|
onClick: loading ? undefined : onClick,
|
|
81
81
|
});
|
|
82
82
|
|
|
83
|
+
/**
|
|
84
|
+
* `aria-label` has to ride `inputProps` to reach the `<input>` (FUT-755), and
|
|
85
|
+
* `aria-describedby` the same way — spread with the rest, either lands on the
|
|
86
|
+
* FormControl DIV that the text field renders as its root, which carries no
|
|
87
|
+
* role, so the field kept no accessible name or description and a source
|
|
88
|
+
* grep saying "this input is labelled" disagreed with the DOM. NumberField's
|
|
89
|
+
* suffix rides this to reach a caller's field (FUT-2823); this does not also
|
|
90
|
+
* join MUI's own helper-text id the way the shared package's later Input
|
|
91
|
+
* does — this maintenance line predates that fix.
|
|
92
|
+
*/
|
|
93
|
+
const mergedInputProps = (
|
|
94
|
+
dataTestId: string | undefined,
|
|
95
|
+
inputProps: InputProps['inputProps'],
|
|
96
|
+
ariaLabel: string | undefined,
|
|
97
|
+
ariaDescribedBy: string | undefined,
|
|
98
|
+
) => ({
|
|
99
|
+
'data-testid': dataTestId,
|
|
100
|
+
...inputProps,
|
|
101
|
+
...(ariaLabel === undefined ? {} : { 'aria-label': ariaLabel }),
|
|
102
|
+
...(ariaDescribedBy === undefined ? {} : { 'aria-describedby': ariaDescribedBy }),
|
|
103
|
+
});
|
|
104
|
+
|
|
83
105
|
export const Input = React.forwardRef<HTMLInputElement, InputProps>(
|
|
84
106
|
(
|
|
85
107
|
{
|
|
@@ -99,6 +121,8 @@ export const Input = React.forwardRef<HTMLInputElement, InputProps>(
|
|
|
99
121
|
onFocus,
|
|
100
122
|
onBlur,
|
|
101
123
|
'aria-label': ariaLabel,
|
|
124
|
+
'aria-describedby': ariaDescribedBy,
|
|
125
|
+
inputProps,
|
|
102
126
|
...rest
|
|
103
127
|
},
|
|
104
128
|
ref,
|
|
@@ -120,18 +144,7 @@ export const Input = React.forwardRef<HTMLInputElement, InputProps>(
|
|
|
120
144
|
{...interactionProps(loading, onClick, props.disabled)}
|
|
121
145
|
onFocus={onFocus}
|
|
122
146
|
onBlur={onBlur}
|
|
123
|
-
|
|
124
|
-
* `aria-label` has to ride `inputProps` to reach the `<input>` (FUT-755).
|
|
125
|
-
* Spread with the rest it lands on the FormControl DIV that the text
|
|
126
|
-
* field renders as its root, which carries no role — so the field kept
|
|
127
|
-
* no accessible name, and a source grep saying "this input is labelled"
|
|
128
|
-
* disagreed with the DOM. The reports search box and the block-title
|
|
129
|
-
* inputs were both named in source and anonymous to a screen reader.
|
|
130
|
-
*/
|
|
131
|
-
inputProps={{
|
|
132
|
-
'data-testid': dataTestId,
|
|
133
|
-
...(ariaLabel === undefined ? {} : { 'aria-label': ariaLabel }),
|
|
134
|
-
}}
|
|
147
|
+
inputProps={mergedInputProps(dataTestId, inputProps, ariaLabel, ariaDescribedBy)}
|
|
135
148
|
InputProps={{
|
|
136
149
|
startAdornment: startAdornment && (
|
|
137
150
|
<InputAdornment position="start">{startAdornment}</InputAdornment>
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { InputBaseComponentProps } from '@mui/material/InputBase/index.js';
|
|
1
2
|
import type { InputLabelProps as MuiInputLabelProps } from '@mui/material/InputLabel/index.js';
|
|
2
3
|
import type { InputHTMLAttributes } from 'react';
|
|
3
4
|
import type React from 'react';
|
|
@@ -31,4 +32,13 @@ export interface InputProps
|
|
|
31
32
|
* the TYPE was missing, so it failed to compile. FUT-729.
|
|
32
33
|
*/
|
|
33
34
|
InputLabelProps?: Partial<MuiInputLabelProps>;
|
|
35
|
+
/**
|
|
36
|
+
* Attributes for the `<input>` element itself. Anything else this component
|
|
37
|
+
* does not recognise lands on the text field's ROOT `<div>`, where
|
|
38
|
+
* `inputMode`, `pattern`, `role` and `aria-value*` do nothing. Merged, not
|
|
39
|
+
* spread over: the field's own `data-testid` stays the default a caller can
|
|
40
|
+
* override, and the `aria-label` / `aria-describedby` it builds still land
|
|
41
|
+
* last.
|
|
42
|
+
*/
|
|
43
|
+
inputProps?: InputBaseComponentProps;
|
|
34
44
|
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The pure half of `NumberField`: what a keystroke may add, what a string of
|
|
3
|
+
* digits is worth, and where an arrow key lands. Kept apart from the component
|
|
4
|
+
* so every rule is a plain function a unit test can hold.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* The most digits the field keeps. Fifteen is the longest run that is always
|
|
9
|
+
* a safe integer (`Number.MAX_SAFE_INTEGER` has sixteen, but not every
|
|
10
|
+
* sixteen-digit number is below it), so a pasted serial number can never turn
|
|
11
|
+
* into a rounded float.
|
|
12
|
+
*/
|
|
13
|
+
export const MAX_DIGITS = 15;
|
|
14
|
+
|
|
15
|
+
export interface NumberBounds {
|
|
16
|
+
min?: number;
|
|
17
|
+
max?: number;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** Everything that is not a digit, removed; then cut to {@link MAX_DIGITS}. */
|
|
21
|
+
export function digitsOf(raw: string): string {
|
|
22
|
+
return raw.replace(/\D+/g, '').slice(0, MAX_DIGITS);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* What the field's text is worth. An empty field is `null` — never `0`, and
|
|
27
|
+
* never `NaN` — so "cleared" and "zero" stay two different answers.
|
|
28
|
+
*/
|
|
29
|
+
export function parseDigits(raw: string): number | null {
|
|
30
|
+
const digits = digitsOf(raw);
|
|
31
|
+
return digits === '' ? null : Number(digits);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** The text a value shows as. */
|
|
35
|
+
export function formatValue(value: number | null): string {
|
|
36
|
+
return value === null || !Number.isFinite(value) ? '' : String(value);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/** `value`, held inside whichever bounds are set. */
|
|
40
|
+
export function clamp(value: number, { min, max }: NumberBounds): number {
|
|
41
|
+
if (max !== undefined && value > max) return max;
|
|
42
|
+
if (min !== undefined && value < min) return min;
|
|
43
|
+
return value;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Where ArrowUp (`+1`) or ArrowDown (`-1`) takes the value.
|
|
48
|
+
*
|
|
49
|
+
* From empty, either arrow lands on the floor (`min`, else 0) rather than
|
|
50
|
+
* stepping past it: the first press says "give me a number", and the floor is
|
|
51
|
+
* the only one both directions agree on.
|
|
52
|
+
*/
|
|
53
|
+
export function stepValue(
|
|
54
|
+
value: number | null,
|
|
55
|
+
direction: 1 | -1,
|
|
56
|
+
step: number,
|
|
57
|
+
bounds: NumberBounds,
|
|
58
|
+
): number {
|
|
59
|
+
if (value === null) return clamp(bounds.min ?? 0, bounds);
|
|
60
|
+
return clamp(value + direction * step, bounds);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* A key that would type a character the field refuses. Shortcuts (Ctrl/Cmd +
|
|
65
|
+
* a letter — copy, paste, select all) and the named keys (`Backspace`,
|
|
66
|
+
* `ArrowLeft`, `Tab`) are left alone: only a single printable character that
|
|
67
|
+
* is not a digit is blocked.
|
|
68
|
+
*/
|
|
69
|
+
export function isRefusedKey(event: {
|
|
70
|
+
key: string;
|
|
71
|
+
ctrlKey: boolean;
|
|
72
|
+
metaKey: boolean;
|
|
73
|
+
altKey: boolean;
|
|
74
|
+
}): boolean {
|
|
75
|
+
if (event.ctrlKey || event.metaKey || event.altKey) return false;
|
|
76
|
+
return event.key.length === 1 && !/\d/.test(event.key);
|
|
77
|
+
}
|
|
@@ -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,48 @@
|
|
|
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.
|
|
43
|
+
- 2026-09-26 21:33 BRT — backported onto the `ui-6.30.x` maintenance line
|
|
44
|
+
(FUT-2823). `Input` there also gained a top-level `aria-describedby` route
|
|
45
|
+
to the `<input>`, the same way `aria-label` already rode `inputProps` — the
|
|
46
|
+
suffix's id reaches the field either way, but this line's `Input` does not
|
|
47
|
+
also join MUI's own helper-text id into it, a separate fix `main` shipped
|
|
48
|
+
after this line's fork point.
|