@12-apps/ui 6.40.0 → 6.41.1
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/Badge/Badge.js +3 -3
- package/dist/_internal/components/data-display/Badge/Badge.styles.js +3 -3
- package/dist/_internal/components/data-display/Badge/BadgeContent.js +3 -3
- package/dist/_internal/components/data-display/CardKit/CardKebab.js +5 -5
- package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js +5 -5
- package/dist/_internal/components/data-display/CardKit/use-row-confirm.js +5 -5
- package/dist/_internal/components/data-display/Carousel/Carousel.chrome.js +3 -3
- package/dist/_internal/components/data-display/Carousel/Carousel.js +3 -3
- package/dist/_internal/components/data-display/Carousel/Carousel.parts.js +3 -3
- package/dist/_internal/components/data-display/Carousel/Carousel.styles.js +3 -3
- package/dist/_internal/components/data-display/Chart/Chart.js +3 -3
- package/dist/_internal/components/data-display/Chart/SpecChart.js +3 -3
- package/dist/_internal/components/data-display/Chart/chart-context.js +3 -3
- package/dist/_internal/components/data-display/Chart/chart-internals.js +3 -3
- package/dist/_internal/components/data-display/Chart/chart-renderers.js +3 -3
- package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +49 -49
- package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +64 -64
- package/dist/_internal/components/data-display/DataViews/DeleteViewDialog.js +7 -7
- package/dist/_internal/components/data-display/DataViews/ManageViewsDialog.js +8 -8
- package/dist/_internal/components/data-display/DataViews/SaveViewModal.js +14 -14
- package/dist/_internal/components/data-display/DataViews/base-card.js +3 -3
- package/dist/_internal/components/data-display/DataViews/base-list-card.js +3 -3
- package/dist/_internal/components/data-display/DataViews/data-views-bar-controls.js +3 -3
- package/dist/_internal/components/data-display/DataViews/data-views-category-pill.js +18 -18
- package/dist/_internal/components/data-display/DataViews/data-views-columns.js +6 -6
- package/dist/_internal/components/data-display/DataViews/data-views-day-input.js +3 -3
- package/dist/_internal/components/data-display/DataViews/data-views-display-panel.js +6 -6
- package/dist/_internal/components/data-display/DataViews/data-views-empty.js +5 -5
- package/dist/_internal/components/data-display/DataViews/data-views-export.js +5 -5
- package/dist/_internal/components/data-display/DataViews/data-views-filter-panel.js +23 -23
- package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +7 -7
- package/dist/_internal/components/data-display/DataViews/data-views-grid-helpers.js +5 -5
- package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +46 -46
- package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +29 -29
- package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +37 -14
- package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +38 -17
- package/dist/_internal/components/data-display/DataViews/data-views-number-input.js +3 -3
- package/dist/_internal/components/data-display/DataViews/data-views-overflow.js +1 -1
- package/dist/_internal/components/data-display/DataViews/data-views-pagination.js +5 -5
- package/dist/_internal/components/data-display/DataViews/data-views-range-pill.js +6 -6
- package/dist/_internal/components/data-display/DataViews/data-views-search.js +3 -3
- package/dist/_internal/components/data-display/DataViews/data-views-select-all-strip.js +5 -5
- package/dist/_internal/components/data-display/DataViews/data-views-shell-toolbar.js +17 -17
- package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +24 -24
- package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +16 -16
- package/dist/_internal/components/data-display/DataViews/data-views-view-nav.js +5 -5
- package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +7 -7
- package/dist/_internal/components/data-display/FleetMap/FleetBody.js +7 -7
- package/dist/_internal/components/data-display/FleetMap/FleetCanvas.js +6 -6
- package/dist/_internal/components/data-display/FleetMap/FleetMap.fixtures.js +2 -2
- package/dist/_internal/components/data-display/FleetMap/FleetMap.js +9 -9
- package/dist/_internal/components/data-display/MapPreview/MapLayers.js +4 -4
- package/dist/_internal/components/data-display/MapPreview/MapPreview.js +5 -5
- package/dist/_internal/components/data-display/MapPreview/MapSearchBar.js +3 -3
- package/dist/_internal/components/data-display/Sheet/Sheet.body.js +3 -3
- package/dist/_internal/components/data-display/Sheet/Sheet.js +3 -3
- package/dist/_internal/components/data-display/Sheet/Sheet.styles.js +3 -3
- package/dist/_internal/components/data-display/index.js +9 -9
- package/dist/_internal/components/feedback/ConfirmAction/ConfirmButton.js +5 -5
- package/dist/_internal/components/feedback/Dialog/Dialog.js +2 -2
- package/dist/_internal/components/feedback/NotificationStatusNotice/NotificationStatusNotice.js +5 -5
- package/dist/_internal/components/feedback/index.js +8 -8
- package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.js +7 -7
- package/dist/_internal/components/form/AddressAutocomplete/AddressAutocompleteField.js +5 -5
- package/dist/_internal/components/form/AddressAutocomplete/AddressFallbackField.js +4 -4
- package/dist/_internal/components/form/AddressAutocomplete/AddressInputField.js +4 -4
- package/dist/_internal/components/form/AddressAutocomplete/AddressTextField.js +3 -3
- package/dist/_internal/components/form/Autocomplete/Autocomplete.js +5 -5
- package/dist/_internal/components/form/Autocomplete/Autocomplete.parts.js +3 -3
- package/dist/_internal/components/form/Autocomplete/useAutocomplete.js +1 -1
- package/dist/_internal/components/form/Button/Button.js +4 -4
- package/dist/_internal/components/form/Button/Button.styles.js +3 -3
- package/dist/_internal/components/form/CategorySelect/CategoryPanel.js +8 -8
- package/dist/_internal/components/form/CategorySelect/CategoryPanelFoot.js +4 -4
- package/dist/_internal/components/form/CategorySelect/CategoryPanelHead.js +4 -4
- package/dist/_internal/components/form/CategorySelect/CategoryPanelList.js +5 -5
- package/dist/_internal/components/form/CategorySelect/CategoryRows.js +4 -4
- package/dist/_internal/components/form/CategorySelect/CategorySelect.js +10 -10
- package/dist/_internal/components/form/CategorySelect/CategorySelect.styles.js +3 -3
- package/dist/_internal/components/form/CategorySelect/CategoryTrigger.js +4 -4
- package/dist/_internal/components/form/CepField/CepField.js +5 -5
- package/dist/_internal/components/form/CodeEditor/CodeEditor.js +2 -2
- package/dist/_internal/components/form/Command/Command.js +3 -3
- package/dist/_internal/components/form/Command/Command.styles.js +3 -3
- package/dist/_internal/components/form/CreatableSelect/CreatableSelect.js +3 -3
- package/dist/_internal/components/form/DateRangePicker/DateRangePicker.hooks.js +5 -5
- package/dist/_internal/components/form/DateRangePicker/DateRangePicker.js +7 -7
- package/dist/_internal/components/form/DateRangePicker/DateRangePicker.range.js +4 -4
- package/dist/_internal/components/form/DateRangePicker/DateRangePickerFields.js +5 -5
- package/dist/_internal/components/form/Input/Input.js +4 -4
- package/dist/_internal/components/form/Input/Input.styles.js +3 -3
- package/dist/_internal/components/form/InputOTP/InputOTP.js +4 -4
- package/dist/_internal/components/form/InputOTP/InputOTP.styles.js +3 -3
- package/dist/_internal/components/form/Label/Label.js +3 -3
- package/dist/_internal/components/form/Label/Label.styles.js +3 -3
- package/dist/_internal/components/form/Menubar/Menubar.item.js +3 -3
- package/dist/_internal/components/form/Menubar/Menubar.js +3 -3
- package/dist/_internal/components/form/Menubar/Menubar.styles.js +3 -3
- package/dist/_internal/components/form/Menubar/Menubar.toolbar.js +3 -3
- 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 +3 -3
- package/dist/_internal/components/form/RadioGroup/RadioGroup.js +5 -5
- package/dist/_internal/components/form/RadioGroup/RadioGroup.styles.js +3 -3
- package/dist/_internal/components/form/RadioGroup/RadioGroup.variants.js +4 -4
- package/dist/_internal/components/form/RichTextEditor/RichTextEditor.js +3 -3
- package/dist/_internal/components/form/Select/Select.js +3 -3
- package/dist/_internal/components/form/Switch/Switch.js +5 -5
- package/dist/_internal/components/form/Switch/Switch.parts.js +3 -3
- package/dist/_internal/components/form/Switch/Switch.styles.js +2 -2
- package/dist/_internal/components/form/Textarea/Textarea.js +3 -3
- package/dist/_internal/components/form/Textarea/TextareaRichEditor.js +4 -4
- package/dist/_internal/components/form/Toggle/Toggle.js +4 -4
- package/dist/_internal/components/form/Toggle/Toggle.styles.js +3 -3
- package/dist/_internal/components/form/ToggleGroup/ToggleGroup.js +3 -3
- package/dist/_internal/components/form/index.js +54 -48
- package/dist/_internal/components/form/total-form/Fields/CategoryField.js +11 -11
- package/dist/_internal/components/form/total-form/Fields/CepField.js +6 -6
- package/dist/_internal/components/form/total-form/Fields/SelectField.js +4 -4
- package/dist/_internal/components/form/total-form/Fields/TextField.js +5 -5
- package/dist/_internal/components/form/total-form/Fields/ToggleField.js +4 -4
- package/dist/_internal/components/form/total-form/Fields/index.js +24 -24
- package/dist/_internal/components/form/total-form/SubmitButton.js +5 -5
- package/dist/_internal/components/index.js +156 -117
- package/dist/_internal/components/layout/Box/Box.js +6 -6
- package/dist/_internal/components/layout/Card/Card.js +2 -2
- package/dist/_internal/components/layout/ContentToolbar/ColumnsMenu.js +3 -3
- package/dist/_internal/components/layout/ContentToolbar/FilterTrigger.js +3 -3
- package/dist/_internal/components/layout/ContentToolbar/MultiSelectDropdown.js +4 -4
- package/dist/_internal/components/layout/ContentToolbar/MultiSelectTriggers.js +3 -3
- package/dist/_internal/components/layout/ContentToolbar/SavedViewsMenu.js +3 -3
- package/dist/_internal/components/layout/ContentToolbar/SortByDropdown.js +3 -3
- package/dist/_internal/components/layout/ContentToolbar/ViewSelector.js +3 -3
- package/dist/_internal/components/layout/ScrollArea/ScrollArea.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 +4 -4
- package/dist/_internal/components/layout/SettingsLayout/SettingsPanel.js +3 -3
- package/dist/_internal/components/layout/SettingsLayout/SettingsSectionChips.js +2 -2
- package/dist/_internal/components/layout/Stack/Stack.js +7 -7
- package/dist/_internal/components/layout/TableFilter/TableFilter.js +3 -3
- package/dist/_internal/components/layout/index.js +88 -26
- package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js +8 -8
- package/dist/_internal/components/navigation/AppHeader/AppHeader.identity.js +3 -3
- package/dist/_internal/components/navigation/NavigationMenu/NavigationMegaSection.js +2 -2
- package/dist/_internal/components/navigation/NavigationMenu/NavigationMenu.js +4 -4
- package/dist/_internal/components/navigation/NavigationMenu/NavigationStandardBody.js +2 -2
- package/dist/_internal/components/navigation/Pagination/Pagination.js +4 -4
- package/dist/_internal/components/navigation/Pagination/PaginationParts.js +3 -3
- package/dist/_internal/components/navigation/Tabs/Tabs.js +4 -4
- package/dist/_internal/components/navigation/Tabs/Tabs.styles.js +2 -2
- package/dist/_internal/components/navigation/index.js +27 -27
- package/dist/_internal/components/typography/index.js +4 -4
- package/dist/_internal/components/utility/InstallPrompt/InstallPrompt.js +2 -2
- package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.helpers.js +3 -3
- package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.js +3 -3
- package/dist/_internal/components/utility/WorkflowStep/WorkflowStep.parts.js +3 -3
- package/dist/_internal/components/utility/WorkflowStep/WorkflowStepRow.js +3 -3
- package/dist/_internal/components/utility/index.js +16 -16
- 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 +5 -5
- package/dist/_internal/provider/mui-bridge.js +4 -4
- package/dist/_internal/provider/use-ui-theme.js +5 -5
- 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 +7 -7
- package/dist/_internal/tokens/density.js +3 -3
- package/dist/_internal/tokens/field-height.js +2 -2
- package/dist/_internal/user-avatar/user-avatar.js +7 -7
- package/dist/charts.js +3 -3
- package/dist/chunk-2GTORM5E.js +1 -0
- package/dist/chunk-2GTORM5E.js.map +1 -0
- package/dist/{chunk-3PGFMBEI.js → chunk-2LKWJV65.js} +5 -5
- 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-CKPFLEOL.js → chunk-3CUWQXTG.js} +3 -3
- package/dist/{chunk-GVFPOKJW.js → chunk-3CYTVX4T.js} +5 -5
- package/dist/chunk-3DO5AJCG.js +117 -0
- package/dist/chunk-3DO5AJCG.js.map +1 -0
- package/dist/{chunk-TJPQIFI4.js → chunk-3EPA2A4M.js} +8 -8
- package/dist/{chunk-HDELNMZC.js → chunk-3MJHHPRW.js} +2 -2
- package/dist/chunk-3U7WKBMH.js +27 -0
- package/dist/chunk-3U7WKBMH.js.map +1 -0
- package/dist/{chunk-RNC574FS.js → chunk-3UEZ6NUI.js} +2 -2
- package/dist/{chunk-OXLOC6TC.js → chunk-3XS37SQT.js} +3 -3
- package/dist/{chunk-2Q5QHSU2.js → chunk-44USLRMT.js} +8 -8
- package/dist/{chunk-O7OQZJ3D.js → chunk-4GN2RLYL.js} +2 -2
- package/dist/{chunk-QUFKPCWD.js → chunk-4S2LWZ7L.js} +2 -2
- package/dist/{chunk-LPWIAVGP.js → chunk-4UVFPORR.js} +5 -5
- package/dist/{chunk-3B4YMZD5.js → chunk-4Z7GEO2R.js} +2 -2
- package/dist/{chunk-XXPEFK4V.js → chunk-53O2TNSR.js} +5 -5
- package/dist/{chunk-G3SKAI6S.js → chunk-54HTXJJ2.js} +2 -2
- package/dist/{chunk-JE6RZ5L6.js → chunk-5ZOJLYD2.js} +4 -4
- package/dist/{chunk-JDUIWHJ3.js → chunk-6H4TPEMO.js} +2 -2
- package/dist/{chunk-FYZJEME4.js → chunk-6JGATEOF.js} +3 -3
- package/dist/{chunk-ZFUOLLZS.js → chunk-6L2FKTBO.js} +5 -5
- package/dist/{chunk-BDBI4W77.js → chunk-6MD5QXXJ.js} +3 -3
- package/dist/{chunk-ODW2D5PN.js → chunk-6QYKZMEE.js} +5 -2
- package/dist/{chunk-ODW2D5PN.js.map → chunk-6QYKZMEE.js.map} +1 -1
- package/dist/{chunk-LJSKF43D.js → chunk-6TPYT3UC.js} +5 -5
- package/dist/{chunk-KZT5JC3E.js → chunk-6ZD3FI5P.js} +2 -2
- package/dist/{chunk-SBV62CSC.js → chunk-72FPUWD6.js} +2 -2
- package/dist/{chunk-L75CZ3SI.js → chunk-72S2RGWD.js} +2 -2
- package/dist/{chunk-WUFTDJ2L.js → chunk-77BKKPCI.js} +2 -2
- package/dist/{chunk-5A4XPYNK.js → chunk-7FEXRMJE.js} +2 -2
- package/dist/{chunk-AW336SO7.js → chunk-7KKMZJFT.js} +2 -2
- package/dist/{chunk-4SSWJRC4.js → chunk-7TE4TMS3.js} +3 -3
- package/dist/chunk-AEMD6JHZ.js +1 -0
- package/dist/chunk-AEMD6JHZ.js.map +1 -0
- package/dist/{chunk-5XWCKCHP.js → chunk-ALOUJ3CE.js} +4 -4
- package/dist/{chunk-UFUMYNKS.js → chunk-AWG2AJHX.js} +5 -5
- package/dist/{chunk-DDVNYVJH.js → chunk-B3QWQG62.js} +2 -2
- package/dist/{chunk-CKI33CN2.js → chunk-BA6Z52QN.js} +2 -2
- package/dist/{chunk-53TDQYA3.js → chunk-BKZERHNC.js} +4 -4
- package/dist/{chunk-RSWHKOUN.js → chunk-BM4KKGL7.js} +2 -2
- package/dist/chunk-BOWS4U6W.js +1 -0
- package/dist/chunk-BOWS4U6W.js.map +1 -0
- package/dist/{chunk-M4P7NS2L.js → chunk-BR2T72JI.js} +23 -15
- package/dist/chunk-BR2T72JI.js.map +1 -0
- package/dist/{chunk-OZGJ3YCN.js → chunk-BVSSEOLI.js} +2 -2
- package/dist/{chunk-FI6BL4UU.js → chunk-C2TERIB4.js} +2 -2
- package/dist/{chunk-DUITNU72.js → chunk-C6OVO6AT.js} +2 -2
- package/dist/{chunk-WL2S2YB3.js → chunk-CKHFYTIX.js} +4 -4
- package/dist/{chunk-GBEHJBYM.js → chunk-CLK67TNH.js} +2 -2
- package/dist/{chunk-T2HZ3GVA.js → chunk-CM2Q7IH3.js} +4 -4
- package/dist/{chunk-GE26GVHM.js → chunk-CMFJQH6A.js} +2 -2
- package/dist/{chunk-6PPHALM3.js → chunk-CMLIWUBW.js} +4 -4
- package/dist/{chunk-AU3GV6UL.js → chunk-DH5UJD2I.js} +3 -3
- package/dist/{chunk-BKT2KJ56.js → chunk-DH6SL3SY.js} +2 -2
- package/dist/{chunk-APPIPQFT.js → chunk-DH77PLFF.js} +8 -8
- package/dist/{chunk-TRTX4BDI.js → chunk-DJKVSUXH.js} +2 -2
- package/dist/{chunk-VE3P77TV.js → chunk-DLWLIPCP.js} +2 -2
- package/dist/{chunk-MWPXKZ7O.js → chunk-ERY6D2OV.js} +4 -4
- package/dist/{chunk-TJ7NQG7E.js → chunk-FBUCXTA4.js} +4 -4
- package/dist/{chunk-SE6TW72O.js → chunk-FDMQ7H22.js} +2 -2
- package/dist/{chunk-E2FMNY6B.js → chunk-FXWXBEOZ.js} +2 -2
- package/dist/{chunk-UI5O6J6R.js → chunk-FY6PONLA.js} +4 -4
- package/dist/{chunk-QUIHOPOC.js → chunk-G4TKMUOL.js} +2 -2
- package/dist/{chunk-6BS2RBW4.js → chunk-G7XHJPLO.js} +3 -3
- package/dist/{chunk-4RXPIHJG.js → chunk-GE2CCITY.js} +2 -2
- package/dist/{chunk-WRHBXOGN.js → chunk-GG62LKA3.js} +5 -5
- package/dist/{chunk-YQCRQHVU.js → chunk-GI63FQEJ.js} +4 -4
- package/dist/{chunk-WUQKXAYF.js → chunk-GPHURU2K.js} +5 -5
- package/dist/{chunk-GPT673YL.js → chunk-H72YKEGD.js} +2 -2
- package/dist/chunk-HALFOXSZ.js +1 -0
- package/dist/chunk-HALFOXSZ.js.map +1 -0
- package/dist/{chunk-AJVFSUC4.js → chunk-HFVYWHJT.js} +10 -10
- package/dist/{chunk-UP6RO2PR.js → chunk-HKBJZX3C.js} +3 -3
- package/dist/chunk-IC7GHPMK.js +22 -0
- package/dist/chunk-IC7GHPMK.js.map +1 -0
- package/dist/{chunk-V3RQFWL6.js → chunk-IUD6N52Q.js} +3 -3
- package/dist/{chunk-N4D5V3AA.js → chunk-JAGAFEZL.js} +2 -2
- package/dist/{chunk-CLTK76ZF.js → chunk-JE5GEWTG.js} +5 -5
- package/dist/{chunk-23XBBGWD.js → chunk-JFLFZLOA.js} +5 -5
- package/dist/{chunk-BLUURKCY.js → chunk-K6LNHHSH.js} +2 -2
- package/dist/{chunk-HSNOWYEE.js → chunk-K7FSTB2K.js} +2 -2
- package/dist/{chunk-SXVCXLKU.js → chunk-K7MQP2KT.js} +3 -3
- package/dist/{chunk-QQ46JX5H.js → chunk-KHOAXZW2.js} +4 -4
- package/dist/{chunk-SCVBGQFO.js → chunk-KQZGUHYZ.js} +2 -2
- package/dist/{chunk-GJ7GIGDS.js → chunk-LCWGNDTH.js} +2 -2
- package/dist/{chunk-4D2IVVHR.js → chunk-LF3EVXMF.js} +2 -2
- package/dist/{chunk-2XTBGZSR.js → chunk-LGCRL7DK.js} +2 -2
- package/dist/{chunk-WY35GCHY.js → chunk-LODMNSLR.js} +3 -3
- package/dist/{chunk-EXFX3JRN.js → chunk-M47ZOUGF.js} +4 -4
- package/dist/{chunk-AQCQ2USS.js → chunk-M65ZNPLO.js} +2 -2
- package/dist/{chunk-COUFRGD6.js → chunk-MEBQKYH4.js} +4 -4
- package/dist/{chunk-JZ5IGO5G.js → chunk-NCB4GBRL.js} +2 -2
- package/dist/{chunk-SE4WZIKD.js → chunk-NFGIA2ZV.js} +2 -2
- package/dist/{chunk-D455V3BW.js → chunk-NOLSQK4J.js} +28 -30
- package/dist/chunk-NOLSQK4J.js.map +1 -0
- package/dist/{chunk-WTXPGASQ.js → chunk-NPPJ3IJP.js} +4 -4
- package/dist/chunk-NPPJ3IJP.js.map +1 -0
- package/dist/{chunk-H772ZSAI.js → chunk-NQ7NMCRI.js} +2 -2
- package/dist/{chunk-P7JF6XT7.js → chunk-NRSVI23L.js} +2 -2
- package/dist/{chunk-FRTEU7ZO.js → chunk-NU55QUMO.js} +2 -2
- package/dist/chunk-OJUORFGO.js +87 -0
- package/dist/chunk-OJUORFGO.js.map +1 -0
- package/dist/{chunk-JB56E4XQ.js → chunk-PAICZOL5.js} +6 -6
- 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-QX3CXOJ3.js → chunk-PTONBPZL.js} +2 -2
- package/dist/chunk-Q4JWWTL4.js +36 -0
- package/dist/chunk-Q4JWWTL4.js.map +1 -0
- package/dist/{chunk-4UASV6VL.js → chunk-QDELBNL3.js} +2 -2
- package/dist/{chunk-ZE56GK5C.js → chunk-QEI5DC6S.js} +5 -5
- package/dist/chunk-QGUNUXTT.js +1 -0
- package/dist/chunk-QGUNUXTT.js.map +1 -0
- package/dist/{chunk-3UXBIUJF.js → chunk-RDFPM2AQ.js} +5 -5
- 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-BKHO4RSF.js → chunk-RZ2VZ7SL.js} +2 -2
- package/dist/{chunk-MT7QJRP7.js → chunk-S4IXC2V3.js} +3 -3
- package/dist/chunk-SALQ65SM.js +118 -0
- package/dist/chunk-SALQ65SM.js.map +1 -0
- package/dist/{chunk-XOZYUJQ5.js → chunk-SDKOOVEX.js} +5 -3
- package/dist/{chunk-XOZYUJQ5.js.map → chunk-SDKOOVEX.js.map} +1 -1
- package/dist/{chunk-5K4G2XYS.js → chunk-SNBAMWI5.js} +2 -2
- package/dist/{chunk-MKJHDHLF.js → chunk-TCNTIGMY.js} +2 -2
- package/dist/{chunk-EKM7C4X2.js → chunk-TJ3334AJ.js} +3 -3
- package/dist/{chunk-RUZVK4FV.js → chunk-TPVSHO75.js} +3 -3
- package/dist/{chunk-I72PREY7.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-DOLDAAXH.js → chunk-UT73NGRS.js} +3 -3
- package/dist/chunk-VYM2GPR6.js +47 -0
- package/dist/chunk-VYM2GPR6.js.map +1 -0
- package/dist/{chunk-BXEMC4YH.js → chunk-VYV3JOV5.js} +2 -2
- package/dist/{chunk-OTWMG7B2.js → chunk-WN5PNP6F.js} +4 -4
- package/dist/chunk-X3C3VTYS.js +85 -0
- package/dist/chunk-X3C3VTYS.js.map +1 -0
- package/dist/{chunk-HZBRXLV7.js → chunk-XB7HYOMM.js} +2 -2
- package/dist/{chunk-C6FVXX7Y.js → chunk-XBLFK2FL.js} +2 -2
- package/dist/{chunk-EDBVMLNX.js → chunk-XHA2NXLD.js} +2 -2
- package/dist/chunk-XJQNSMGA.js +10 -0
- package/dist/chunk-XJQNSMGA.js.map +1 -0
- package/dist/{chunk-ZO4NO77T.js → chunk-XO4ZUHVH.js} +2 -2
- package/dist/{chunk-OPT7X3Y6.js → chunk-XXL4PM4M.js} +2 -2
- package/dist/{chunk-3HKUOLPD.js → chunk-XZY7O7JJ.js} +4 -4
- package/dist/{chunk-743SY4WQ.js → chunk-YLXQWYOG.js} +5 -5
- package/dist/{chunk-Q33JWFSA.js → chunk-YPIVLPXF.js} +2 -2
- package/dist/{chunk-T7UUP7VD.js → chunk-YRUX7XMQ.js} +2 -2
- package/dist/{chunk-4JEXYOSN.js → chunk-YTXZUTLF.js} +2 -2
- package/dist/{chunk-V7A5ZAAF.js → chunk-YWJDUJAR.js} +3 -3
- package/dist/{chunk-ZK7YERPQ.js → chunk-Z2NN53E5.js} +2 -2
- package/dist/{chunk-CLSC36JS.js → chunk-Z4DKVLYG.js} +3 -3
- package/dist/{chunk-NFJ3VVD3.js → chunk-Z6T5SXST.js} +5 -5
- package/dist/{chunk-IITZA6U2.js → chunk-ZBVU2YWV.js} +9 -9
- package/dist/{chunk-IEWAFD6L.js → chunk-ZC5HDBQO.js} +2 -2
- package/dist/{chunk-KQS4ZJGS.js → chunk-ZGCPDA3F.js} +5 -5
- package/dist/{chunk-AHDNANID.js → chunk-ZH2SZ6B3.js} +2 -2
- package/dist/{chunk-KOX2AEFW.js → chunk-ZKWVCSAB.js} +2 -2
- package/dist/{chunk-K2U4BNHQ.js → chunk-ZNBLGS66.js} +2 -2
- package/dist/{chunk-WGUY7EIB.js → chunk-ZUME25DS.js} +5 -5
- package/dist/data-display/Badge.js +3 -3
- package/dist/data-display/CardKit.js +6 -6
- package/dist/data-display/Carousel.js +3 -3
- package/dist/data-display/Chart.js +3 -3
- package/dist/data-display/Chip.js +1 -0
- package/dist/data-display/DataViews.js +68 -68
- package/dist/data-display/FleetMap.js +9 -9
- package/dist/data-display/MapPreview.js +5 -5
- package/dist/data-display/Sheet.js +3 -3
- package/dist/en-US.js +15 -11
- package/dist/feedback/ConfirmAction.js +5 -5
- package/dist/feedback/Dialog.js +2 -2
- package/dist/feedback/NotificationStatusNotice.js +5 -5
- package/dist/form/AddressAutocomplete.js +7 -7
- package/dist/form/Autocomplete.js +5 -5
- package/dist/form/Button.js +4 -4
- package/dist/form/CategorySelect.js +10 -10
- package/dist/form/CepField.js +5 -5
- package/dist/form/CodeEditor.js +2 -2
- package/dist/form/Command.js +3 -3
- package/dist/form/CreatableSelect.js +3 -3
- package/dist/form/DateRangePicker.js +7 -7
- package/dist/form/Input.js +4 -4
- package/dist/form/InputOTP.js +4 -4
- package/dist/form/Label.js +3 -3
- package/dist/form/Menubar.js +3 -3
- package/dist/form/NumberField.js +29 -0
- package/dist/form/NumberField.js.map +1 -0
- package/dist/form/PhoneInput.js +3 -3
- package/dist/form/RadioGroup.js +5 -5
- package/dist/form/RichTextEditor.js +3 -3
- package/dist/form/Select.js +3 -3
- package/dist/form/Switch.js +5 -5
- package/dist/form/Textarea.js +3 -3
- package/dist/form/Toggle.js +4 -4
- package/dist/form/ToggleGroup.js +3 -3
- package/dist/form/total-form.js +30 -30
- package/dist/icons.js +7 -6
- package/dist/layout/Box.js +6 -6
- package/dist/layout/Card.js +2 -2
- package/dist/layout/Collapsible.js +1 -0
- package/dist/layout/ContentToolbar.js +13 -13
- package/dist/layout/ScrollArea.js +2 -2
- package/dist/layout/SettingCard.js +80 -0
- package/dist/layout/SettingCard.js.map +1 -0
- package/dist/layout/SettingsLayout.js +4 -4
- package/dist/layout/Stack.js +7 -7
- package/dist/layout/TableFilter.js +3 -3
- package/dist/locales.js +37 -23
- package/dist/locales.js.map +1 -1
- package/dist/navigation/AppHeader.js +12 -12
- package/dist/navigation/NavigationMenu.js +4 -4
- package/dist/navigation/Pagination.js +4 -4
- package/dist/navigation/Tabs.js +4 -4
- package/dist/provider.js +6 -6
- package/dist/pt-BR.js +12 -8
- package/dist/social-login-button.js +7 -7
- package/dist/tokens.js +4 -4
- 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/Autocomplete/useAutocomplete.d.ts +9 -0
- package/dist/types/components/form/Autocomplete/useAutocomplete.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.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/pt-BR.layout.d.ts +3 -1
- package/dist/types/pt-BR.layout.d.ts.map +1 -1
- package/dist/user-avatar.js +7 -7
- package/dist/utility/InstallPrompt.js +2 -2
- package/dist/utility/WorkflowStep.js +3 -3
- 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/Autocomplete/useAutocomplete.ts +46 -16
- 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/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-D455V3BW.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-M4P7NS2L.js.map +0 -1
- package/dist/chunk-WTXPGASQ.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-3PGFMBEI.js.map → chunk-2LKWJV65.js.map} +0 -0
- /package/dist/{chunk-IIUB4IOH.js.map → chunk-2XHIF3M3.js.map} +0 -0
- /package/dist/{chunk-CKPFLEOL.js.map → chunk-3CUWQXTG.js.map} +0 -0
- /package/dist/{chunk-GVFPOKJW.js.map → chunk-3CYTVX4T.js.map} +0 -0
- /package/dist/{chunk-TJPQIFI4.js.map → chunk-3EPA2A4M.js.map} +0 -0
- /package/dist/{chunk-HDELNMZC.js.map → chunk-3MJHHPRW.js.map} +0 -0
- /package/dist/{chunk-RNC574FS.js.map → chunk-3UEZ6NUI.js.map} +0 -0
- /package/dist/{chunk-OXLOC6TC.js.map → chunk-3XS37SQT.js.map} +0 -0
- /package/dist/{chunk-2Q5QHSU2.js.map → chunk-44USLRMT.js.map} +0 -0
- /package/dist/{chunk-O7OQZJ3D.js.map → chunk-4GN2RLYL.js.map} +0 -0
- /package/dist/{chunk-QUFKPCWD.js.map → chunk-4S2LWZ7L.js.map} +0 -0
- /package/dist/{chunk-LPWIAVGP.js.map → chunk-4UVFPORR.js.map} +0 -0
- /package/dist/{chunk-3B4YMZD5.js.map → chunk-4Z7GEO2R.js.map} +0 -0
- /package/dist/{chunk-XXPEFK4V.js.map → chunk-53O2TNSR.js.map} +0 -0
- /package/dist/{chunk-G3SKAI6S.js.map → chunk-54HTXJJ2.js.map} +0 -0
- /package/dist/{chunk-JE6RZ5L6.js.map → chunk-5ZOJLYD2.js.map} +0 -0
- /package/dist/{chunk-JDUIWHJ3.js.map → chunk-6H4TPEMO.js.map} +0 -0
- /package/dist/{chunk-FYZJEME4.js.map → chunk-6JGATEOF.js.map} +0 -0
- /package/dist/{chunk-ZFUOLLZS.js.map → chunk-6L2FKTBO.js.map} +0 -0
- /package/dist/{chunk-BDBI4W77.js.map → chunk-6MD5QXXJ.js.map} +0 -0
- /package/dist/{chunk-LJSKF43D.js.map → chunk-6TPYT3UC.js.map} +0 -0
- /package/dist/{chunk-KZT5JC3E.js.map → chunk-6ZD3FI5P.js.map} +0 -0
- /package/dist/{chunk-SBV62CSC.js.map → chunk-72FPUWD6.js.map} +0 -0
- /package/dist/{chunk-L75CZ3SI.js.map → chunk-72S2RGWD.js.map} +0 -0
- /package/dist/{chunk-WUFTDJ2L.js.map → chunk-77BKKPCI.js.map} +0 -0
- /package/dist/{chunk-5A4XPYNK.js.map → chunk-7FEXRMJE.js.map} +0 -0
- /package/dist/{chunk-AW336SO7.js.map → chunk-7KKMZJFT.js.map} +0 -0
- /package/dist/{chunk-4SSWJRC4.js.map → chunk-7TE4TMS3.js.map} +0 -0
- /package/dist/{chunk-5XWCKCHP.js.map → chunk-ALOUJ3CE.js.map} +0 -0
- /package/dist/{chunk-UFUMYNKS.js.map → chunk-AWG2AJHX.js.map} +0 -0
- /package/dist/{chunk-DDVNYVJH.js.map → chunk-B3QWQG62.js.map} +0 -0
- /package/dist/{chunk-CKI33CN2.js.map → chunk-BA6Z52QN.js.map} +0 -0
- /package/dist/{chunk-53TDQYA3.js.map → chunk-BKZERHNC.js.map} +0 -0
- /package/dist/{chunk-RSWHKOUN.js.map → chunk-BM4KKGL7.js.map} +0 -0
- /package/dist/{chunk-OZGJ3YCN.js.map → chunk-BVSSEOLI.js.map} +0 -0
- /package/dist/{chunk-FI6BL4UU.js.map → chunk-C2TERIB4.js.map} +0 -0
- /package/dist/{chunk-DUITNU72.js.map → chunk-C6OVO6AT.js.map} +0 -0
- /package/dist/{chunk-WL2S2YB3.js.map → chunk-CKHFYTIX.js.map} +0 -0
- /package/dist/{chunk-GBEHJBYM.js.map → chunk-CLK67TNH.js.map} +0 -0
- /package/dist/{chunk-T2HZ3GVA.js.map → chunk-CM2Q7IH3.js.map} +0 -0
- /package/dist/{chunk-GE26GVHM.js.map → chunk-CMFJQH6A.js.map} +0 -0
- /package/dist/{chunk-6PPHALM3.js.map → chunk-CMLIWUBW.js.map} +0 -0
- /package/dist/{chunk-AU3GV6UL.js.map → chunk-DH5UJD2I.js.map} +0 -0
- /package/dist/{chunk-BKT2KJ56.js.map → chunk-DH6SL3SY.js.map} +0 -0
- /package/dist/{chunk-APPIPQFT.js.map → chunk-DH77PLFF.js.map} +0 -0
- /package/dist/{chunk-TRTX4BDI.js.map → chunk-DJKVSUXH.js.map} +0 -0
- /package/dist/{chunk-VE3P77TV.js.map → chunk-DLWLIPCP.js.map} +0 -0
- /package/dist/{chunk-MWPXKZ7O.js.map → chunk-ERY6D2OV.js.map} +0 -0
- /package/dist/{chunk-TJ7NQG7E.js.map → chunk-FBUCXTA4.js.map} +0 -0
- /package/dist/{chunk-SE6TW72O.js.map → chunk-FDMQ7H22.js.map} +0 -0
- /package/dist/{chunk-E2FMNY6B.js.map → chunk-FXWXBEOZ.js.map} +0 -0
- /package/dist/{chunk-UI5O6J6R.js.map → chunk-FY6PONLA.js.map} +0 -0
- /package/dist/{chunk-QUIHOPOC.js.map → chunk-G4TKMUOL.js.map} +0 -0
- /package/dist/{chunk-6BS2RBW4.js.map → chunk-G7XHJPLO.js.map} +0 -0
- /package/dist/{chunk-4RXPIHJG.js.map → chunk-GE2CCITY.js.map} +0 -0
- /package/dist/{chunk-WRHBXOGN.js.map → chunk-GG62LKA3.js.map} +0 -0
- /package/dist/{chunk-YQCRQHVU.js.map → chunk-GI63FQEJ.js.map} +0 -0
- /package/dist/{chunk-WUQKXAYF.js.map → chunk-GPHURU2K.js.map} +0 -0
- /package/dist/{chunk-GPT673YL.js.map → chunk-H72YKEGD.js.map} +0 -0
- /package/dist/{chunk-AJVFSUC4.js.map → chunk-HFVYWHJT.js.map} +0 -0
- /package/dist/{chunk-UP6RO2PR.js.map → chunk-HKBJZX3C.js.map} +0 -0
- /package/dist/{chunk-V3RQFWL6.js.map → chunk-IUD6N52Q.js.map} +0 -0
- /package/dist/{chunk-N4D5V3AA.js.map → chunk-JAGAFEZL.js.map} +0 -0
- /package/dist/{chunk-CLTK76ZF.js.map → chunk-JE5GEWTG.js.map} +0 -0
- /package/dist/{chunk-23XBBGWD.js.map → chunk-JFLFZLOA.js.map} +0 -0
- /package/dist/{chunk-BLUURKCY.js.map → chunk-K6LNHHSH.js.map} +0 -0
- /package/dist/{chunk-HSNOWYEE.js.map → chunk-K7FSTB2K.js.map} +0 -0
- /package/dist/{chunk-SXVCXLKU.js.map → chunk-K7MQP2KT.js.map} +0 -0
- /package/dist/{chunk-QQ46JX5H.js.map → chunk-KHOAXZW2.js.map} +0 -0
- /package/dist/{chunk-SCVBGQFO.js.map → chunk-KQZGUHYZ.js.map} +0 -0
- /package/dist/{chunk-GJ7GIGDS.js.map → chunk-LCWGNDTH.js.map} +0 -0
- /package/dist/{chunk-4D2IVVHR.js.map → chunk-LF3EVXMF.js.map} +0 -0
- /package/dist/{chunk-2XTBGZSR.js.map → chunk-LGCRL7DK.js.map} +0 -0
- /package/dist/{chunk-WY35GCHY.js.map → chunk-LODMNSLR.js.map} +0 -0
- /package/dist/{chunk-EXFX3JRN.js.map → chunk-M47ZOUGF.js.map} +0 -0
- /package/dist/{chunk-AQCQ2USS.js.map → chunk-M65ZNPLO.js.map} +0 -0
- /package/dist/{chunk-COUFRGD6.js.map → chunk-MEBQKYH4.js.map} +0 -0
- /package/dist/{chunk-JZ5IGO5G.js.map → chunk-NCB4GBRL.js.map} +0 -0
- /package/dist/{chunk-SE4WZIKD.js.map → chunk-NFGIA2ZV.js.map} +0 -0
- /package/dist/{chunk-H772ZSAI.js.map → chunk-NQ7NMCRI.js.map} +0 -0
- /package/dist/{chunk-P7JF6XT7.js.map → chunk-NRSVI23L.js.map} +0 -0
- /package/dist/{chunk-FRTEU7ZO.js.map → chunk-NU55QUMO.js.map} +0 -0
- /package/dist/{chunk-JB56E4XQ.js.map → chunk-PAICZOL5.js.map} +0 -0
- /package/dist/{chunk-QX3CXOJ3.js.map → chunk-PTONBPZL.js.map} +0 -0
- /package/dist/{chunk-4UASV6VL.js.map → chunk-QDELBNL3.js.map} +0 -0
- /package/dist/{chunk-ZE56GK5C.js.map → chunk-QEI5DC6S.js.map} +0 -0
- /package/dist/{chunk-3UXBIUJF.js.map → chunk-RDFPM2AQ.js.map} +0 -0
- /package/dist/{chunk-BKHO4RSF.js.map → chunk-RZ2VZ7SL.js.map} +0 -0
- /package/dist/{chunk-MT7QJRP7.js.map → chunk-S4IXC2V3.js.map} +0 -0
- /package/dist/{chunk-5K4G2XYS.js.map → chunk-SNBAMWI5.js.map} +0 -0
- /package/dist/{chunk-MKJHDHLF.js.map → chunk-TCNTIGMY.js.map} +0 -0
- /package/dist/{chunk-EKM7C4X2.js.map → chunk-TJ3334AJ.js.map} +0 -0
- /package/dist/{chunk-RUZVK4FV.js.map → chunk-TPVSHO75.js.map} +0 -0
- /package/dist/{chunk-I72PREY7.js.map → chunk-TTJTMDLI.js.map} +0 -0
- /package/dist/{chunk-TU5EIKJA.js.map → chunk-U5SH3VRJ.js.map} +0 -0
- /package/dist/{chunk-DOLDAAXH.js.map → chunk-UT73NGRS.js.map} +0 -0
- /package/dist/{chunk-BXEMC4YH.js.map → chunk-VYV3JOV5.js.map} +0 -0
- /package/dist/{chunk-OTWMG7B2.js.map → chunk-WN5PNP6F.js.map} +0 -0
- /package/dist/{chunk-HZBRXLV7.js.map → chunk-XB7HYOMM.js.map} +0 -0
- /package/dist/{chunk-C6FVXX7Y.js.map → chunk-XBLFK2FL.js.map} +0 -0
- /package/dist/{chunk-EDBVMLNX.js.map → chunk-XHA2NXLD.js.map} +0 -0
- /package/dist/{chunk-ZO4NO77T.js.map → chunk-XO4ZUHVH.js.map} +0 -0
- /package/dist/{chunk-OPT7X3Y6.js.map → chunk-XXL4PM4M.js.map} +0 -0
- /package/dist/{chunk-3HKUOLPD.js.map → chunk-XZY7O7JJ.js.map} +0 -0
- /package/dist/{chunk-743SY4WQ.js.map → chunk-YLXQWYOG.js.map} +0 -0
- /package/dist/{chunk-Q33JWFSA.js.map → chunk-YPIVLPXF.js.map} +0 -0
- /package/dist/{chunk-T7UUP7VD.js.map → chunk-YRUX7XMQ.js.map} +0 -0
- /package/dist/{chunk-4JEXYOSN.js.map → chunk-YTXZUTLF.js.map} +0 -0
- /package/dist/{chunk-V7A5ZAAF.js.map → chunk-YWJDUJAR.js.map} +0 -0
- /package/dist/{chunk-ZK7YERPQ.js.map → chunk-Z2NN53E5.js.map} +0 -0
- /package/dist/{chunk-CLSC36JS.js.map → chunk-Z4DKVLYG.js.map} +0 -0
- /package/dist/{chunk-NFJ3VVD3.js.map → chunk-Z6T5SXST.js.map} +0 -0
- /package/dist/{chunk-IITZA6U2.js.map → chunk-ZBVU2YWV.js.map} +0 -0
- /package/dist/{chunk-IEWAFD6L.js.map → chunk-ZC5HDBQO.js.map} +0 -0
- /package/dist/{chunk-KQS4ZJGS.js.map → chunk-ZGCPDA3F.js.map} +0 -0
- /package/dist/{chunk-AHDNANID.js.map → chunk-ZH2SZ6B3.js.map} +0 -0
- /package/dist/{chunk-KOX2AEFW.js.map → chunk-ZKWVCSAB.js.map} +0 -0
- /package/dist/{chunk-K2U4BNHQ.js.map → chunk-ZNBLGS66.js.map} +0 -0
- /package/dist/{chunk-WGUY7EIB.js.map → chunk-ZUME25DS.js.map} +0 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import Box from '@mui/material/Box/index.js';
|
|
2
|
+
import { useTheme } from '@mui/material/styles/index.js';
|
|
3
|
+
import React, { useId } from 'react';
|
|
4
|
+
|
|
5
|
+
import { Switch } from '../../form/Switch';
|
|
6
|
+
import { SR_ONLY_SX } from '../../form/Label/Label.styles';
|
|
7
|
+
|
|
8
|
+
import { useAsyncSwitch } from './SettingCard.hooks';
|
|
9
|
+
import { PendingSpinner, SaveError, SettingHeader, partTestId } from './SettingCard.parts';
|
|
10
|
+
import { descriptionStyles } from './SettingCard.styles';
|
|
11
|
+
import type { SettingToggleProps } from './SettingCard.types';
|
|
12
|
+
|
|
13
|
+
/** Everything the switch-driven cards share, minus the surface each draws around it. */
|
|
14
|
+
export type SettingSwitchBlockProps = Pick<
|
|
15
|
+
SettingToggleProps,
|
|
16
|
+
'title' | 'headingLevel' | 'icon' | 'summary' | 'checked' | 'onChange' | 'copy' | 'formatError' | 'dataTestId'
|
|
17
|
+
> & { disabled: boolean };
|
|
18
|
+
|
|
19
|
+
/** The ids one switch block wires its label, description and failure line with. */
|
|
20
|
+
export interface SettingSwitchIds {
|
|
21
|
+
titleId: string;
|
|
22
|
+
inputId: string;
|
|
23
|
+
summaryId: string;
|
|
24
|
+
errorId: string;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export const useSettingSwitchIds = (): SettingSwitchIds => {
|
|
28
|
+
const base = useId();
|
|
29
|
+
return {
|
|
30
|
+
titleId: `${base}-title`,
|
|
31
|
+
inputId: `${base}-switch`,
|
|
32
|
+
summaryId: `${base}-summary`,
|
|
33
|
+
errorId: `${base}-error`,
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Title-as-label, the switch, its explanation and the failure line.
|
|
39
|
+
*
|
|
40
|
+
* The switch is never `disabled` while it saves, for the reason Save is not
|
|
41
|
+
* (`SettingCard.tsx`): a disabled control drops keyboard focus. It says
|
|
42
|
+
* `aria-busy` instead, ignores flips until the save settles (see
|
|
43
|
+
* `useAsyncSwitch`), shows a spinner, and a polite live region says the words.
|
|
44
|
+
*/
|
|
45
|
+
export const SettingSwitchBlock: React.FC<
|
|
46
|
+
SettingSwitchBlockProps & { ids: SettingSwitchIds; state: ReturnType<typeof useAsyncSwitch> }
|
|
47
|
+
> = ({ title, headingLevel = 'h3', icon, summary, copy, disabled, dataTestId, ids, state }) => {
|
|
48
|
+
const theme = useTheme();
|
|
49
|
+
const { shown, saving, error, flip } = state;
|
|
50
|
+
const describedBy = [summary != null ? ids.summaryId : null, error ? ids.errorId : null]
|
|
51
|
+
.filter(Boolean)
|
|
52
|
+
.join(' ');
|
|
53
|
+
|
|
54
|
+
const control = (
|
|
55
|
+
<Box sx={{ display: 'inline-flex', alignItems: 'center', gap: 1, flexShrink: 0 }}>
|
|
56
|
+
{saving && <PendingSpinner dataTestId={dataTestId} />}
|
|
57
|
+
<Switch
|
|
58
|
+
id={ids.inputId}
|
|
59
|
+
checked={shown}
|
|
60
|
+
onChange={(event) => void flip(event.target.checked)}
|
|
61
|
+
disabled={disabled}
|
|
62
|
+
error={Boolean(error)}
|
|
63
|
+
aria-describedby={describedBy || undefined}
|
|
64
|
+
inputProps={{ role: 'switch', 'aria-busy': saving }}
|
|
65
|
+
dataTestId={partTestId(dataTestId, 'switch')}
|
|
66
|
+
/>
|
|
67
|
+
</Box>
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
return (
|
|
71
|
+
<>
|
|
72
|
+
<SettingHeader
|
|
73
|
+
titleId={ids.titleId}
|
|
74
|
+
title={title}
|
|
75
|
+
headingLevel={headingLevel}
|
|
76
|
+
icon={icon}
|
|
77
|
+
labelFor={ids.inputId}
|
|
78
|
+
trailing={control}
|
|
79
|
+
dataTestId={dataTestId}
|
|
80
|
+
/>
|
|
81
|
+
{summary != null && (
|
|
82
|
+
<Box component="p" id={ids.summaryId} sx={descriptionStyles(theme)} data-testid={partTestId(dataTestId, 'summary')}>
|
|
83
|
+
{summary}
|
|
84
|
+
</Box>
|
|
85
|
+
)}
|
|
86
|
+
<SaveError id={ids.errorId} message={error} dataTestId={dataTestId} />
|
|
87
|
+
<Box role="status" aria-live="polite" sx={SR_ONLY_SX}>
|
|
88
|
+
{saving ? copy.saving : ''}
|
|
89
|
+
</Box>
|
|
90
|
+
</>
|
|
91
|
+
);
|
|
92
|
+
};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# SettingToggle
|
|
2
|
+
|
|
3
|
+
## Purpose
|
|
4
|
+
|
|
5
|
+
A setting that is **one switch and nothing else**. There is no edit state:
|
|
6
|
+
flipping the switch is the edit, and it saves at once. Part of the
|
|
7
|
+
`layout/SettingCard` family.
|
|
8
|
+
|
|
9
|
+
## Usage
|
|
10
|
+
|
|
11
|
+
```tsx
|
|
12
|
+
import { SettingToggle } from '@12-apps/ui/layout/SettingCard';
|
|
13
|
+
|
|
14
|
+
<SettingToggle
|
|
15
|
+
copy={copy} // SettingSwitchCopy — saving + saveFailed
|
|
16
|
+
title="Two-step sign-in"
|
|
17
|
+
summary="Ask for a code on a new device."
|
|
18
|
+
checked={settings.twoStep}
|
|
19
|
+
onChange={(next) => api.setTwoStep(next)} // may return a promise
|
|
20
|
+
/>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Props
|
|
24
|
+
|
|
25
|
+
| prop | type | default | effect |
|
|
26
|
+
|---|---|---|---|
|
|
27
|
+
| `copy` | `SettingSwitchCopy` | **required** | The "saving" announcement and the fallback error. No shipped default. |
|
|
28
|
+
| `title` | `string` | **required** | The switch's `<label>` — its accessible name, and a tap target far larger than the track. |
|
|
29
|
+
| `checked` | `boolean` | **required** | The persisted value. |
|
|
30
|
+
| `onChange` | `(checked: boolean) => void \| Promise<unknown>` | **required** | Persist a flip. See below. |
|
|
31
|
+
| `summary` | `ReactNode` | — | Explanation under the title; the switch is `aria-describedby` it. |
|
|
32
|
+
| `variant` | `'card' \| 'row'` | `'card'` | `row` drops the surface — for a dependent row inside a [`SettingGroup`](./SettingGroup.md). |
|
|
33
|
+
| `disabled` | `boolean` | `false` | Disables the switch. Also disabled inside a `SettingGroup` whose main switch is off. |
|
|
34
|
+
| `formatError` | `(error: unknown) => string \| undefined` | — | The sentence for a rejected save; `undefined` falls back to `copy.saveFailed`. |
|
|
35
|
+
| `icon`, `dataTestId`, `className`, `sx` | | | As on `SettingCard`. Parts: `-switch`, `-title`, `-summary`, `-saving`, `-error`. |
|
|
36
|
+
|
|
37
|
+
## Saving
|
|
38
|
+
|
|
39
|
+
- The switch shows the new value **at once** and holds it while the promise is
|
|
40
|
+
pending, with a spinner beside it, `aria-busy` on the input, and
|
|
41
|
+
`copy.saving` in a polite live region.
|
|
42
|
+
- **Resolved:** the switch hands back to `checked`, which the host has updated.
|
|
43
|
+
- **Rejected:** the switch returns to `checked` (the value actually saved) and
|
|
44
|
+
the error appears under it in a `role="alert"` line the switch is described
|
|
45
|
+
by.
|
|
46
|
+
- A flip while a save is pending is **ignored**, not queued: two racing writes
|
|
47
|
+
of a boolean have no right answer.
|
|
48
|
+
- The switch is never `disabled` while saving, so keyboard focus stays on it.
|
|
49
|
+
|
|
50
|
+
## Accessibility
|
|
51
|
+
|
|
52
|
+
- `role="switch"` on the input, named by the title, described by the summary
|
|
53
|
+
(and the error, when there is one).
|
|
54
|
+
- The whole title is a `<label for>` the switch — clicking the words flips it.
|
|
55
|
+
|
|
56
|
+
## Best practices
|
|
57
|
+
|
|
58
|
+
- Use it only when the setting is **exactly** one boolean. Anything with a
|
|
59
|
+
value to type or pick is a [`SettingCard`](./SettingCard.md).
|
|
60
|
+
- Several switches about one subject belong in a
|
|
61
|
+
[`SettingGroup`](./SettingGroup.md) with `variant="row"`.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import Box from '@mui/material/Box/index.js';
|
|
2
|
+
import { forwardRef } from 'react';
|
|
3
|
+
|
|
4
|
+
import { useAsyncSwitch } from './SettingCard.hooks';
|
|
5
|
+
import { flatStyles, surfaceStyles, withCallerSx } from './SettingCard.styles';
|
|
6
|
+
import type { SettingToggleProps } from './SettingCard.types';
|
|
7
|
+
import { useSettingGroup } from './SettingGroup.context';
|
|
8
|
+
import { SettingSwitchBlock, useSettingSwitchIds } from './SettingSwitch';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* A setting that is one switch and nothing else. There is no edit state:
|
|
12
|
+
* flipping it IS the edit, and it saves at once.
|
|
13
|
+
*
|
|
14
|
+
* `onChange` may be async. The switch shows the new value while the promise is
|
|
15
|
+
* pending, with a spinner and an announced "saving"; a rejection flips it back
|
|
16
|
+
* to `checked` and shows the error under it.
|
|
17
|
+
*
|
|
18
|
+
* Inside a `SettingGroup` whose main switch is off, it renders disabled.
|
|
19
|
+
*/
|
|
20
|
+
export const SettingToggle = forwardRef<HTMLElement, SettingToggleProps>(function SettingToggle(props, ref) {
|
|
21
|
+
const { checked, onChange, copy, formatError, disabled = false, variant = 'card', dataTestId, className, sx } = props;
|
|
22
|
+
const group = useSettingGroup();
|
|
23
|
+
const ids = useSettingSwitchIds();
|
|
24
|
+
const state = useAsyncSwitch({ checked, onChange, formatError, fallback: copy.saveFailed });
|
|
25
|
+
const card = variant === 'card';
|
|
26
|
+
|
|
27
|
+
return (
|
|
28
|
+
<Box
|
|
29
|
+
component={card ? 'section' : 'div'}
|
|
30
|
+
ref={ref}
|
|
31
|
+
aria-labelledby={ids.titleId}
|
|
32
|
+
aria-busy={state.saving || undefined}
|
|
33
|
+
data-variant={variant}
|
|
34
|
+
data-testid={dataTestId}
|
|
35
|
+
className={className}
|
|
36
|
+
sx={withCallerSx((theme) => (card ? surfaceStyles(theme, false) : flatStyles(theme)), sx)}
|
|
37
|
+
>
|
|
38
|
+
<SettingSwitchBlock {...props} disabled={disabled || group.inactive} ids={ids} state={state} />
|
|
39
|
+
</Box>
|
|
40
|
+
);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
SettingToggle.displayName = 'SettingToggle';
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export { SettingCard } from './SettingCard';
|
|
2
|
+
export { SettingToggle } from './SettingToggle';
|
|
3
|
+
export { SettingGroup } from './SettingGroup';
|
|
4
|
+
export { SettingGrid, SETTING_GRID_CONTAINER } from './SettingGrid';
|
|
5
|
+
export type {
|
|
6
|
+
SettingCardCopy,
|
|
7
|
+
SettingCardProps,
|
|
8
|
+
SettingErrorFormatter,
|
|
9
|
+
SettingGridColumns,
|
|
10
|
+
SettingGridProps,
|
|
11
|
+
SettingGroupProps,
|
|
12
|
+
SettingHeadingLevel,
|
|
13
|
+
SettingSaveResult,
|
|
14
|
+
SettingStatus,
|
|
15
|
+
SettingSwitchCopy,
|
|
16
|
+
SettingToggleProps,
|
|
17
|
+
SettingToggleVariant,
|
|
18
|
+
} from './SettingCard.types';
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# SettingCard family Test Status Tracking
|
|
2
|
+
|
|
3
|
+
`SettingCard`, `SettingToggle`, `SettingGroup` and `SettingGrid` share this
|
|
4
|
+
folder and this file.
|
|
5
|
+
|
|
6
|
+
## Test Files Status
|
|
7
|
+
|
|
8
|
+
- [x] SettingCard.test.stories.tsx, SettingToggle.test.stories.tsx, SettingGroup.test.stories.tsx, SettingGrid.test.stories.tsx created
|
|
9
|
+
- [x] `__tests__/` Vitest suites for all four
|
|
10
|
+
- [x] Core categories implemented (interaction, keyboard, screen reader, focus, responsive/layout, visual states, edge cases)
|
|
11
|
+
|
|
12
|
+
## Storybook Tests Status
|
|
13
|
+
|
|
14
|
+
### Test Results
|
|
15
|
+
|
|
16
|
+
| Test Name | Status | Pass/Fail | Notes |
|
|
17
|
+
| ------------------------------------------- | ------ | --------- | ------------------------------------------------------ |
|
|
18
|
+
| SettingCard › Opens in place | PASS | Pass | form inside the same card; no dialog |
|
|
19
|
+
| SettingCard › Focus round trip | PASS | Pass | first field on open, Edit on close |
|
|
20
|
+
| SettingCard › Keyboard only | PASS | Pass | Tab to Edit, Enter opens, Escape cancels |
|
|
21
|
+
| SettingCard › Save resolves | PASS | Pass | "Saving…", `aria-busy`, then new summary + focus |
|
|
22
|
+
| SettingCard › Save rejects | PASS | Pass | stays open, draft intact, focus stays on Save |
|
|
23
|
+
| SettingCard › Cancel discards | PASS | Pass | reopened form shows the saved value |
|
|
24
|
+
| SettingCard › Accessible names | PASS | Pass | region, heading, "Edit <title>" |
|
|
25
|
+
| SettingCard › Learn more disclosure | PASS | Pass | `aria-expanded` toggles, content visible |
|
|
26
|
+
| SettingToggle › Flip saves | PASS | Pass | optimistic value, busy but enabled, then settles |
|
|
27
|
+
| SettingToggle › Reject reverts | PASS | Pass | back to saved value, error shown |
|
|
28
|
+
| SettingToggle › Keyboard flip | PASS | Pass | Space flips; focus stays on the switch while saving |
|
|
29
|
+
| SettingToggle › Label is the tap target | PASS | Pass | clicking the title flips |
|
|
30
|
+
| SettingGroup › Off dims and disables | PASS | Pass | rows rendered, `inert`, opacity < 1, hint shown |
|
|
31
|
+
| SettingGroup › Off rows skipped by Tab | PASS | Pass | focus never enters the inert rows |
|
|
32
|
+
| SettingGroup › Turn on activates | PASS | Pass | rows live, hint gone, fields accept input |
|
|
33
|
+
| SettingGrid › Columns follow the container | PASS | Pass | 1 / 2 / 3 columns at 360 / 720 / 1080 px containers |
|
|
34
|
+
| SettingGrid › Rows share height | PASS | Pass | three cards of different content, one height |
|
|
35
|
+
| SettingGrid › Open card spans the row | PASS | Pass | open card width equals the grid's; back on cancel |
|
|
36
|
+
|
|
37
|
+
Legend: Pending | Running | PASS | FAIL
|
|
38
|
+
|
|
39
|
+
## Static Stories Status
|
|
40
|
+
|
|
41
|
+
- [x] Default story (each component)
|
|
42
|
+
- [x] Open, Saving, SaveRejected, HostErrorMessage (SettingCard)
|
|
43
|
+
- [x] Saving, SaveRejected, Rows (SettingToggle)
|
|
44
|
+
- [x] Off (dimmed), On, Disabled, OneSubjectPerGroup (SettingGroup)
|
|
45
|
+
- [x] ResponsiveByContainer, OpenCardSpansRow, TwoColumnsMax, Empty (SettingGrid)
|
|
46
|
+
- [x] Disabled state stories
|
|
47
|
+
- [x] Loading (saving) state stories
|
|
48
|
+
- [x] Error state stories
|
|
49
|
+
- [x] Long content / edge cases
|
|
50
|
+
- [x] Dark theme (SettingCard)
|
|
51
|
+
|
|
52
|
+
## Lint Status
|
|
53
|
+
|
|
54
|
+
- [x] No lint errors
|
|
55
|
+
- [x] No warnings
|
|
56
|
+
|
|
57
|
+
## TypeCheck Status
|
|
58
|
+
|
|
59
|
+
- [x] No type errors
|
|
60
|
+
- [x] All props properly typed
|
|
61
|
+
|
|
62
|
+
## Overall Component Status
|
|
63
|
+
|
|
64
|
+
- [x] All tests passing
|
|
65
|
+
- [x] Lint clean
|
|
66
|
+
- [x] TypeCheck clean
|
|
67
|
+
- [x] Stories working
|
|
68
|
+
- [ ] Ready for production (pending review)
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# SettingCard family
|
|
2
|
+
|
|
3
|
+
Four settings-screen building blocks under one subpath,
|
|
4
|
+
`@12-apps/ui/layout/SettingCard` (FUT-2823). `SettingCard` summarises a setting
|
|
5
|
+
while closed and edits it in place, with an async save that stays open on
|
|
6
|
+
failure and a focus round trip. `SettingToggle` is a switch that saves as it
|
|
7
|
+
flips. `SettingGroup` is one subject's main switch with dependent rows that dim
|
|
8
|
+
(never vanish) while it is off. `SettingGrid` lays them out in 1–3 columns by
|
|
9
|
+
container query, with equal-height rows and a full-row span for an open card.
|
|
10
|
+
App-agnostic: every word comes in through props (`SettingCardCopy`,
|
|
11
|
+
`SettingSwitchCopy`, titles, summaries, hints).
|
|
12
|
+
|
|
13
|
+
## Props
|
|
14
|
+
|
|
15
|
+
- **SettingCard** — `copy`, `title`, `onSave` (may be async), `children` (the
|
|
16
|
+
form), `summary`, `status`, `learnMore`, `onCancel`, `open` / `defaultOpen` /
|
|
17
|
+
`onOpenChange`, `disabled`, `saveDisabled`, `formatError`, `headingLevel`,
|
|
18
|
+
`icon`, `dataTestId`, `className`, `sx`.
|
|
19
|
+
- **SettingToggle** — `copy`, `title`, `checked`, `onChange` (may be async),
|
|
20
|
+
`summary`, `variant` (`card` | `row`), `disabled`, `formatError`, `icon`,
|
|
21
|
+
`dataTestId`, `className`, `sx`.
|
|
22
|
+
- **SettingGroup** — `SettingToggle`'s switch props plus `inactiveHint` and
|
|
23
|
+
`children` (the dependent rows).
|
|
24
|
+
- **SettingGrid** — `children`, `minColumnWidth`, `maxColumns`, `gap`,
|
|
25
|
+
`aria-label`, `dataTestId`, `className`, `sx`.
|
|
26
|
+
|
|
27
|
+
## Lint
|
|
28
|
+
|
|
29
|
+
- Clean (`pnpm lint:files src/components/layout/SettingCard`), plus the
|
|
30
|
+
complexity and flakiness gates.
|
|
31
|
+
|
|
32
|
+
## Type Errors
|
|
33
|
+
|
|
34
|
+
- None (`pnpm typecheck`, `tsc -p tsconfig.stories.json`).
|
|
35
|
+
|
|
36
|
+
## Testing Scenarios
|
|
37
|
+
|
|
38
|
+
- Closed/open rendering, in-place open, Escape, controlled mode, no focus steal
|
|
39
|
+
on mount; save pending / resolved / rejected / thrown / double-press /
|
|
40
|
+
`saveDisabled`; cancel discarding uncontrolled drafts; toggle optimistic flip,
|
|
41
|
+
revert, ignored second flip; group inert rows, hint, activation only after
|
|
42
|
+
the save lands; grid container-query CSS, row sizing, open-card span; layout
|
|
43
|
+
measured in Chromium by the test stories.
|
|
44
|
+
|
|
45
|
+
## Storybook Tests List
|
|
46
|
+
|
|
47
|
+
- Layout/SettingCard/Tests → 8, Layout/SettingToggle/Tests → 4,
|
|
48
|
+
Layout/SettingGroup/Tests → 3, Layout/SettingGrid/Tests → 3.
|
|
49
|
+
|
|
50
|
+
## Current
|
|
51
|
+
|
|
52
|
+
- 2026-09-26 16:40 BRT — v1: all four components, copy packs in both locales,
|
|
53
|
+
docs per component. Remaining TODO: first host adoption in the origin host
|
|
54
|
+
(FUT-1659 is the admin screens that would fold onto it).
|
package/src/copy/layout.ts
CHANGED
|
@@ -16,3 +16,32 @@ export interface TableFilterCopy {
|
|
|
16
16
|
rangeMin: string;
|
|
17
17
|
rangeMax: string;
|
|
18
18
|
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* The chrome words of an editable `SettingCard`. The card's own title, summary
|
|
22
|
+
* and status are per-card props; these are the words every card repeats.
|
|
23
|
+
*/
|
|
24
|
+
export interface SettingCardCopy {
|
|
25
|
+
/** The closed card's trigger. Its accessible name also carries the card's title. */
|
|
26
|
+
edit: string;
|
|
27
|
+
/** Discard the draft and close. */
|
|
28
|
+
cancel: string;
|
|
29
|
+
save: string;
|
|
30
|
+
/** Announced (and shown to sighted users as the Save label) while the save is pending. */
|
|
31
|
+
saving: string;
|
|
32
|
+
/** The disclosure that reveals the card's longer explanation. */
|
|
33
|
+
learnMore: string;
|
|
34
|
+
/** Shown when the save rejected and the host's `formatError` gave no sentence of its own. */
|
|
35
|
+
saveFailed: string;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* What a switch that saves the moment it flips says about that save — shared
|
|
40
|
+
* by `SettingToggle` and `SettingGroup`'s main switch.
|
|
41
|
+
*/
|
|
42
|
+
export interface SettingSwitchCopy {
|
|
43
|
+
/** Announced while the flip is being saved. */
|
|
44
|
+
saving: string;
|
|
45
|
+
/** Shown when the save rejected and the host's `formatError` gave no sentence of its own. */
|
|
46
|
+
saveFailed: string;
|
|
47
|
+
}
|
package/src/en-US.layout.ts
CHANGED
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
* is — see `en-US.ts` for why the packs live in per-family files.
|
|
4
4
|
*/
|
|
5
5
|
import type {
|
|
6
|
+
SettingCardCopy,
|
|
7
|
+
SettingSwitchCopy,
|
|
6
8
|
TableFilterCopy,
|
|
7
9
|
} from './copy';
|
|
8
10
|
|
|
@@ -13,3 +15,17 @@ export const EN_US_TABLE_FILTER_COPY: TableFilterCopy = {
|
|
|
13
15
|
rangeMin: "Minimum",
|
|
14
16
|
rangeMax: "Maximum",
|
|
15
17
|
};
|
|
18
|
+
|
|
19
|
+
export const EN_US_SETTING_CARD_COPY: SettingCardCopy = {
|
|
20
|
+
edit: "Edit",
|
|
21
|
+
cancel: "Cancel",
|
|
22
|
+
save: "Save",
|
|
23
|
+
saving: "Saving…",
|
|
24
|
+
learnMore: "Learn more",
|
|
25
|
+
saveFailed: "Could not save. Please try again.",
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export const EN_US_SETTING_SWITCH_COPY: SettingSwitchCopy = {
|
|
29
|
+
saving: "Saving…",
|
|
30
|
+
saveFailed: "Could not save. Please try again.",
|
|
31
|
+
};
|
package/src/locales.ts
CHANGED
|
@@ -38,6 +38,8 @@ import type {
|
|
|
38
38
|
PhoneInputCopy,
|
|
39
39
|
RichEditorToolbarCopy,
|
|
40
40
|
SectionOnboardingCopy,
|
|
41
|
+
SettingCardCopy,
|
|
42
|
+
SettingSwitchCopy,
|
|
41
43
|
SocialLoginCopy,
|
|
42
44
|
TableFilterCopy,
|
|
43
45
|
TimingDiagramCopy,
|
|
@@ -115,6 +117,14 @@ export const TABLE_FILTER_COPY = pack<TableFilterCopy>(
|
|
|
115
117
|
pt.PT_BR_TABLE_FILTER_COPY,
|
|
116
118
|
en.EN_US_TABLE_FILTER_COPY,
|
|
117
119
|
);
|
|
120
|
+
export const SETTING_CARD_COPY = pack<SettingCardCopy>(
|
|
121
|
+
pt.PT_BR_SETTING_CARD_COPY,
|
|
122
|
+
en.EN_US_SETTING_CARD_COPY,
|
|
123
|
+
);
|
|
124
|
+
export const SETTING_SWITCH_COPY = pack<SettingSwitchCopy>(
|
|
125
|
+
pt.PT_BR_SETTING_SWITCH_COPY,
|
|
126
|
+
en.EN_US_SETTING_SWITCH_COPY,
|
|
127
|
+
);
|
|
118
128
|
|
|
119
129
|
// navigation
|
|
120
130
|
export const COMMAND_PALETTE_COPY = pack<CommandPaletteCopy>(
|
package/src/pt-BR.layout.ts
CHANGED
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
* barrel over this folder — see that file for why.
|
|
4
4
|
*/
|
|
5
5
|
import type {
|
|
6
|
+
SettingCardCopy,
|
|
7
|
+
SettingSwitchCopy,
|
|
6
8
|
TableFilterCopy,
|
|
7
9
|
} from './copy';
|
|
8
10
|
|
|
@@ -13,3 +15,17 @@ export const PT_BR_TABLE_FILTER_COPY: TableFilterCopy = {
|
|
|
13
15
|
rangeMin: "Mínimo",
|
|
14
16
|
rangeMax: "Máximo",
|
|
15
17
|
};
|
|
18
|
+
|
|
19
|
+
export const PT_BR_SETTING_CARD_COPY: SettingCardCopy = {
|
|
20
|
+
edit: "Editar",
|
|
21
|
+
cancel: "Cancelar",
|
|
22
|
+
save: "Salvar",
|
|
23
|
+
saving: "Salvando…",
|
|
24
|
+
learnMore: "Saiba mais",
|
|
25
|
+
saveFailed: "Não foi possível salvar. Tente novamente.",
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export const PT_BR_SETTING_SWITCH_COPY: SettingSwitchCopy = {
|
|
29
|
+
saving: "Salvando…",
|
|
30
|
+
saveFailed: "Não foi possível salvar. Tente novamente.",
|
|
31
|
+
};
|
package/dist/chunk-A7RIZOAL.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
// src/pt-BR.layout.ts
|
|
2
|
-
var PT_BR_TABLE_FILTER_COPY = {
|
|
3
|
-
clearAllFilters: "Limpar todos os filtros",
|
|
4
|
-
clearKeyword: "Limpar a busca",
|
|
5
|
-
invalidRange: "O m\xE1ximo deve ser maior ou igual ao m\xEDnimo.",
|
|
6
|
-
rangeMin: "M\xEDnimo",
|
|
7
|
-
rangeMax: "M\xE1ximo"
|
|
8
|
-
};
|
|
9
|
-
|
|
10
|
-
export {
|
|
11
|
-
PT_BR_TABLE_FILTER_COPY
|
|
12
|
-
};
|
|
13
|
-
//# sourceMappingURL=chunk-A7RIZOAL.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/pt-BR.layout.ts"],"sourcesContent":["/**\n * The pt-BR pack for the layout family. Split out of `pt-BR.ts`, which is a\n * barrel over this folder — see that file for why.\n */\nimport type {\n TableFilterCopy,\n} from './copy';\n\nexport const PT_BR_TABLE_FILTER_COPY: TableFilterCopy = {\n clearAllFilters: \"Limpar todos os filtros\",\n clearKeyword: \"Limpar a busca\",\n invalidRange: \"O máximo deve ser maior ou igual ao mínimo.\",\n rangeMin: \"Mínimo\",\n rangeMax: \"Máximo\",\n};\n"],"mappings":";AAQO,IAAM,0BAA2C;AAAA,EACtD,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,cAAc;AAAA,EACd,UAAU;AAAA,EACV,UAAU;AACZ;","names":[]}
|
package/dist/chunk-BY3JEK5T.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
//# sourceMappingURL=chunk-BY3JEK5T.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/DataViews/data-views-more-fields.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * ONE FIELD, RENDERED INSIDE THE \"MAIS\" PANEL.\n *\n * Split from `data-views-more-filters` at the file-size gate, along the seam\n * that was already there: that module is the trigger, the panel and its\n * footer — the chrome — and this is what goes in it.\n *\n * A field with one or two options renders FLAT: inside a panel there is no\n * space to win back, and two labelled checkboxes are faster than a dropdown\n * needing a second click. Past that it becomes a {@link MultiSelectDropdown} —\n * see `INLINE_OPTION_LIMIT`.\n */\nimport Checkbox from \"@mui/material/Checkbox/index.js\";\n\nimport { MultiSelectDropdown } from \"../../layout/ContentToolbar\";\nimport { Box } from \"../../../mui/Box\";\nimport { Text } from \"../../typography/Text\";\n\nimport type { OverflowField } from \"./data-views-overflow\";\nimport { RangeBounds } from \"./data-views-range-pill\";\nimport { isRangeSet } from \"./data-views-range-values\";\nimport type { RangeValue } from \"./data-views-types\";\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\nimport { fieldRadiusPx } from \"../../../tokens/field-radius\";\nimport { fieldHeight } from \"../../../tokens/field-height\";\nimport { fieldEdge } from \"../../../tokens/field-edge\";\nimport { sxRem } from \"../../../tokens/relative\";\n\n/** What each field's control needs, minus the panel's own chrome. */\nexport interface MoreFieldProps {\n pills: Record<string, string[]>;\n ranges: Record<string, RangeValue>;\n onTogglePill: (fieldId: string, value: string, checked: boolean) => void;\n onChangeRange: (fieldId: string, range: RangeValue) => void;\n testIdPrefix: string;\n}\n\n/**\n * Above this many options a field is a DROPDOWN rather than a flat row of\n * checkboxes. Two options cost two lines and read faster laid out; a \"Cliente\"\n * with a dozen turns the panel into a scrolling wall and buries every field\n * under it, which is exactly what the overflow was meant to avoid.\n */\nconst INLINE_OPTION_LIMIT = 2;\n\n/** One overflowed pill: its options as checkboxes, all visible at once. */\nfunction OverflowPill<T extends Record<string, unknown>>({\n field,\n values,\n onToggle,\n onClear,\n testIdPrefix,\n}: {\n field: OverflowField<T>;\n values: string[];\n onToggle: (value: string, checked: boolean) => void;\n onClear: () => void;\n testIdPrefix: string;\n}): React.JSX.Element {\n const copy = useDataViewsCopy();\n const options = field.pill?.options ?? [];\n if (options.length > INLINE_OPTION_LIMIT) {\n return (\n <MultiSelectDropdown\n extraOptionsHeading={copy.filters.optionsHeading}\n clearText={copy.filters.clear}\n clearLabel={copy.filters.clearRange(field.label)}\n label={field.pill?.label ?? field.label}\n options={options}\n selected={new Set(values)}\n onToggle={onToggle}\n onClear={onClear}\n allLabel={copy.filters.allOption}\n searchable={options.length > 6 ? true : undefined}\n searchPlaceholder={copy.filters.optionSearchPlaceholder}\n noResultsLabel={copy.filters.optionsEmpty}\n layout=\"pill\"\n data-testid={`${testIdPrefix}-more-${field.id}`}\n />\n );\n }\n return (\n <Box sx={{ display: \"flex\", flexWrap: \"wrap\", gap: 0.75 }}>\n {(field.pill?.options ?? []).map((option) => {\n const checked = values.includes(option.value);\n return (\n <Box\n key={option.value}\n component=\"label\"\n data-testid={`${testIdPrefix}-more-${field.id}-${option.value}`}\n sx={{\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: 0.25,\n pr: 1,\n border: 1,\n borderStyle: \"solid\",\n minHeight: fieldHeight,\n borderColor: (theme) => (checked ? theme.palette.primary.main : fieldEdge(theme)),\n bgcolor: checked ? \"action.selected\" : \"transparent\",\n borderRadius: fieldRadiusPx,\n cursor: \"pointer\",\n fontSize: sxRem(13),\n color: checked ? \"primary.main\" : \"text.secondary\",\n }}\n >\n <Checkbox\n size=\"small\"\n checked={checked}\n onChange={(event) => onToggle(option.value, event.target.checked)}\n inputProps={{ \"aria-label\": `${field.label}: ${option.label}` }}\n />\n {option.label}\n </Box>\n );\n })}\n </Box>\n );\n}\n\n\n/**\n * One overflowed range: its presets and its two bounds, as the same controls\n * the pill uses.\n *\n * The whole control DELEGATES to {@link RangeBounds} rather than being built\n * here, which is the point — this panel used to render a raw\n * `<input type=\"date\">`, so the masked `dd/mm/aaaa` field existed only while\n * the filter FITTED on the bar. The moment \"Data\" overflowed it reverted to the\n * native control the mask replaced, and a merchant on a narrow screen never saw\n * the fix at all (FUT-744). `Valor` had the twin bug: a bare `type=\"number\"`\n * plus `Number(raw)` dropped the decimal comma this panel is meant to accept.\n *\n * That also retires the intrinsic-width workaround this pair used to need — a\n * native date input reports a wide minimum (its own mask plus the picker\n * glyph), which is what made two of them refuse to shrink and scrolled the\n * panel sideways. A text input has no such minimum.\n *\n * `RangeBounds` renders the preset chips ITSELF, above the inputs. This panel\n * must NOT render its own row as well: when the delegation above landed, the\n * chips it used to draw by hand stayed behind, and \"Data\" showed Hoje/Ontem/\n * Esta semana/Este mês/Este ano twice — two rows, duplicated test ids, and half\n * the panel's height spent saying the same thing (FUT-751).\n */\nfunction OverflowRange<T extends Record<string, unknown>>({\n field,\n value,\n onChange,\n testIdPrefix,\n}: {\n field: OverflowField<T>;\n value: RangeValue;\n onChange: (range: RangeValue) => void;\n testIdPrefix: string;\n}): React.JSX.Element | null {\n // `group === \"range\"` is what selects this component, so `range` is always\n // set; the guard is for the type, not for a state the caller can reach.\n if (!field.range) return null;\n return (\n <RangeBounds\n field={field.range}\n value={value}\n onChange={onChange}\n testId={`${testIdPrefix}-more-${field.id}`}\n />\n );\n}\n\n/**\n * The trigger, badged with how many fields had no room on the bar — and told\n * apart when some of them are APPLIED.\n *\n * An applied filter can land in here now (it is ranked first, not exempt), so\n * this button is the only thing on screen still saying it exists. A neutral\n * badge reading \"3\" would make \"three filters you have not used\" and \"three\n * filters narrowing this list\" look identical, which is the whole failure the\n * old exemption was written to avoid. So an overflow holding applied filters\n * takes the applied tone and counts them in its own badge.\n\n/**\n * Whether a field has anything applied, and how to unapply it — the two shapes\n * (a pill's selected values, a range's bounds) answered in one place so the\n * group that renders them stays a renderer.\n */\nexport function fieldClearing<T extends Record<string, unknown>>({\n field,\n pills,\n ranges,\n onTogglePill,\n onChangeRange,\n}: {\n field: OverflowField<T>;\n} & Pick<MoreFieldProps, \"pills\" | \"ranges\" | \"onTogglePill\" | \"onChangeRange\">): {\n applied: boolean;\n clear: () => void;\n} {\n if (field.group === \"range\") {\n return {\n applied: isRangeSet(ranges[field.id] ?? {}),\n clear: () => onChangeRange(field.id, {}),\n };\n }\n const values = pills[field.id] ?? [];\n return {\n applied: values.length > 0,\n clear: () => values.forEach((value) => onTogglePill(field.id, value, false)),\n };\n}\n\n\n/** One labelled group in the panel: the field's name, then its control. */\nexport function MoreGroup<T extends Record<string, unknown>>({\n field,\n pills,\n ranges,\n onTogglePill,\n onChangeRange,\n testIdPrefix,\n}: {\n field: OverflowField<T>;\n} & MoreFieldProps): React.JSX.Element {\n const copy = useDataViewsCopy();\n const { applied, clear } = fieldClearing({ field, pills, ranges, onTogglePill, onChangeRange });\n return (\n <Box sx={{ mb: 1.5, \"&:last-of-type\": { mb: 0 } }}>\n <Box sx={{ display: \"flex\", alignItems: \"center\", gap: 1, mb: 0.5 }}>\n <Text variant=\"caption\" as=\"span\">\n <Box component=\"span\" sx={{ color: \"text.secondary\" }}>\n {field.label}\n {field.group === \"range\" && isRangeSet(ranges[field.id] ?? {}) ? \" •\" : \"\"}\n </Box>\n </Text>\n {/* The panel's equivalent of the pill's ✕. Without it a field applied\n in here could only be cleared by finding it again on the bar —\n which is where it goes the moment it becomes active, so the\n operator has to close this panel to undo what they just did. */}\n {applied && (\n <Box\n component=\"button\"\n type=\"button\"\n onClick={clear}\n data-testid={`${testIdPrefix}-more-${field.id}-clear`}\n sx={{\n ml: \"auto\",\n border: 0,\n p: 0,\n bgcolor: \"transparent\",\n cursor: \"pointer\",\n font: \"inherit\",\n fontSize: sxRem(12),\n color: \"primary.main\",\n \"&:hover\": { textDecoration: \"underline\" },\n }}\n >\n {copy.filters.clear}\n </Box>\n )}\n </Box>\n {field.group === \"pill\" ? (\n <OverflowPill\n field={field}\n values={pills[field.id] ?? []}\n onToggle={(value, checked) => onTogglePill(field.id, value, checked)}\n onClear={() => (pills[field.id] ?? []).forEach((v) => onTogglePill(field.id, v, false))}\n testIdPrefix={testIdPrefix}\n />\n ) : (\n <OverflowRange\n field={field}\n value={ranges[field.id] ?? {}}\n onChange={(range) => onChangeRange(field.id, range)}\n testIdPrefix={testIdPrefix}\n />\n )}\n </Box>\n );\n}\n\n"],"mappings":"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","names":["default"]}
|
package/dist/chunk-FZJ2FTGE.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
//# sourceMappingURL=chunk-FZJ2FTGE.js.map
|
package/dist/chunk-GRHECKHU.js
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
// src/en-US.layout.ts
|
|
2
|
-
var EN_US_TABLE_FILTER_COPY = {
|
|
3
|
-
clearAllFilters: "Clear all filters",
|
|
4
|
-
clearKeyword: "Clear the search",
|
|
5
|
-
invalidRange: "The maximum must be greater than or equal to the minimum.",
|
|
6
|
-
rangeMin: "Minimum",
|
|
7
|
-
rangeMax: "Maximum"
|
|
8
|
-
};
|
|
9
|
-
|
|
10
|
-
export {
|
|
11
|
-
EN_US_TABLE_FILTER_COPY
|
|
12
|
-
};
|
|
13
|
-
//# sourceMappingURL=chunk-GRHECKHU.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/en-US.layout.ts"],"sourcesContent":["/**\n * The en-US pack for the layout family. Split the same way `pt-BR.layout.ts`\n * is — see `en-US.ts` for why the packs live in per-family files.\n */\nimport type {\n TableFilterCopy,\n} from './copy';\n\nexport const EN_US_TABLE_FILTER_COPY: TableFilterCopy = {\n clearAllFilters: \"Clear all filters\",\n clearKeyword: \"Clear the search\",\n invalidRange: \"The maximum must be greater than or equal to the minimum.\",\n rangeMin: \"Minimum\",\n rangeMax: \"Maximum\",\n};\n"],"mappings":";AAQO,IAAM,0BAA2C;AAAA,EACtD,iBAAiB;AAAA,EACjB,cAAc;AAAA,EACd,cAAc;AAAA,EACd,UAAU;AAAA,EACV,UAAU;AACZ;","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/form/Autocomplete/useAutocomplete.ts"],"sourcesContent":["import { useEffect, useId, useRef, useState } from 'react';\n\nimport {\n defaultGetKey,\n defaultGetLabel,\n defaultGetSuggestionType,\n defaultGetUrl,\n defaultOpenLink,\n filterSuggestions,\n firstGhostSuggestion,\n type MatchMode,\n} from './Autocomplete.helpers';\nimport { handleAutocompleteKey, type KeyContext } from './Autocomplete.keys';\nimport type { AutocompleteProps } from './Autocomplete.types';\n\ntype Setter<V> = React.Dispatch<React.SetStateAction<V>>;\n\n/** All mutable state + refs for one Autocomplete instance. */\ninterface AutocompleteState<T> {\n open: boolean;\n setOpen: Setter<boolean>;\n activeIndex: number;\n setActiveIndex: Setter<number>;\n ghost: string;\n setGhost: Setter<string>;\n inputValue: string;\n setInputValue: Setter<string>;\n composition: boolean;\n setComposition: Setter<boolean>;\n filteredSuggestions: T[];\n setFilteredSuggestions: Setter<T[]>;\n isInputFocused: boolean;\n setIsInputFocused: Setter<boolean>;\n justCompletedGhost: boolean;\n setJustCompletedGhost: Setter<boolean>;\n userClosedDropdown: boolean;\n setUserClosedDropdown: Setter<boolean>;\n inputRef: React.RefObject<HTMLInputElement | null>;\n listRef: React.RefObject<HTMLUListElement | null>;\n debounceRef: React.RefObject<number | undefined>;\n}\n\nfunction useAutocompleteState<T>(value: string, suggestions: T[]): AutocompleteState<T> {\n const [open, setOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState(-1);\n const [ghost, setGhost] = useState('');\n const [inputValue, setInputValue] = useState(value);\n const [composition, setComposition] = useState(false);\n const [filteredSuggestions, setFilteredSuggestions] = useState<T[]>(suggestions);\n const [isInputFocused, setIsInputFocused] = useState(false);\n const [justCompletedGhost, setJustCompletedGhost] = useState(false);\n const [userClosedDropdown, setUserClosedDropdown] = useState(false);\n const inputRef = useRef<HTMLInputElement>(null);\n const listRef = useRef<HTMLUListElement | null>(null);\n const debounceRef = useRef<number | undefined>(undefined);\n return {\n open, setOpen, activeIndex, setActiveIndex, ghost, setGhost, inputValue, setInputValue,\n composition, setComposition, filteredSuggestions, setFilteredSuggestions, isInputFocused,\n setIsInputFocused, justCompletedGhost, setJustCompletedGhost, userClosedDropdown,\n setUserClosedDropdown, inputRef, listRef, debounceRef,\n };\n}\n\n// ---- effects (one tiny hook each; explicit params keep deps complete) --------\n\nfunction useValueSync(value: string, setInputValue: Setter<string>): void {\n useEffect(() => setInputValue(value), [value, setInputValue]);\n}\n\nfunction useDebounceCleanup(debounceRef: React.RefObject<number | undefined>): void {\n useEffect(\n () => () => {\n if (debounceRef.current) window.clearTimeout(debounceRef.current);\n },\n [debounceRef],\n );\n}\n\nfunction useScrollActiveIntoView(\n activeIndex: number,\n optionIdPrefix: string,\n listRef: React.RefObject<HTMLUListElement | null>,\n): void {\n useEffect(() => {\n if (activeIndex < 0 || !listRef.current) return;\n document\n .getElementById(`${optionIdPrefix}-${activeIndex}`)\n ?.scrollIntoView({ block: 'nearest' });\n }, [activeIndex, optionIdPrefix, listRef]);\n}\n\nfunction useGhostFlagReset(justCompletedGhost: boolean, setJustCompletedGhost: Setter<boolean>): void {\n useEffect(() => {\n if (!justCompletedGhost) return;\n const timer = setTimeout(() => setJustCompletedGhost(false), 50);\n return () => clearTimeout(timer);\n }, [justCompletedGhost, setJustCompletedGhost]);\n}\n\nfunction useLoadingOpen(\n isLoading: boolean,\n inputValue: string,\n disabled: boolean,\n userClosedDropdown: boolean,\n setOpen: Setter<boolean>,\n setActiveIndex: Setter<number>,\n): void {\n useEffect(() => {\n if (isLoading && inputValue.trim().length > 0 && !disabled && !userClosedDropdown) setOpen(true);\n if (disabled) {\n setOpen(false);\n setActiveIndex(-1);\n }\n }, [isLoading, inputValue, disabled, userClosedDropdown, setOpen, setActiveIndex]);\n}\n\n/** Inputs to the auto-open check, all primitive/stable so effect deps stay complete. */\ninterface AutoOpenArgs {\n inputValue: string;\n isInputFocused: boolean;\n composition: boolean;\n justCompletedGhost: boolean;\n userClosedDropdown: boolean;\n activeIndex: number;\n setOpen: Setter<boolean>;\n setActiveIndex: Setter<number>;\n}\n\n/** Auto-open the dropdown once local filtering has a fresh result set. */\nfunction maybeAutoOpen(a: AutoOpenArgs, hasResults: boolean): void {\n const canAutoOpen =\n a.inputValue.trim() &&\n a.isInputFocused &&\n !a.composition &&\n !a.justCompletedGhost &&\n !a.userClosedDropdown;\n if (!canAutoOpen) return;\n a.setOpen(true);\n if (hasResults && a.activeIndex === -1) a.setActiveIndex(0);\n}\n\nfunction useLocalFilter<T>(p: AutocompleteProps<T>, s: AutocompleteState<T>): void {\n const propSuggestions = p.suggestions;\n const getLabel = p.getLabel ?? defaultGetLabel;\n const matchMode: MatchMode = p.matchMode ?? 'contains';\n const async = Boolean(p.async);\n const {\n inputValue, isInputFocused, composition, justCompletedGhost, userClosedDropdown, activeIndex,\n setFilteredSuggestions, setOpen, setActiveIndex,\n } = s;\n useEffect(() => {\n const suggestions = propSuggestions ?? [];\n if (async || !inputValue) {\n setFilteredSuggestions(suggestions);\n return;\n }\n const filtered = filterSuggestions(suggestions, inputValue, matchMode, getLabel);\n setFilteredSuggestions(filtered);\n maybeAutoOpen(\n { inputValue, isInputFocused, composition, justCompletedGhost, userClosedDropdown, activeIndex, setOpen, setActiveIndex },\n filtered.length > 0,\n );\n }, [\n propSuggestions, inputValue, async, getLabel, matchMode, isInputFocused, composition,\n justCompletedGhost, userClosedDropdown, activeIndex, setFilteredSuggestions, setOpen, setActiveIndex,\n ]);\n}\n\nfunction useGhostText<T>(p: AutocompleteProps<T>, s: AutocompleteState<T>): void {\n const getLabel = p.getLabel ?? defaultGetLabel;\n const getType = p.getSuggestionType ?? defaultGetSuggestionType;\n const showGhost = p.showGhostText ?? true;\n const { inputValue, filteredSuggestions, isInputFocused, composition, setGhost } = s;\n useEffect(() => {\n if (!inputValue || !isInputFocused || composition || !showGhost) {\n setGhost('');\n return;\n }\n const first = firstGhostSuggestion(filteredSuggestions, inputValue, getLabel, getType);\n setGhost(first ? getLabel(first).slice(inputValue.length) : '');\n }, [inputValue, filteredSuggestions, isInputFocused, composition, showGhost, getLabel, getType, setGhost]);\n}\n\n// ---- selection (split by mode to keep each function under the complexity bar) -\n\nfunction commitMultiSelect<T>(item: T, p: AutocompleteProps<T>, s: AutocompleteState<T>, onChange: (v: string) => void): void {\n const getKey = p.getKey ?? defaultGetKey;\n const current = p.selectedItems ?? [];\n if (!current.some((sel) => getKey(sel) === getKey(item))) p.onSelectedItemsChange?.([...current, item]);\n s.setInputValue('');\n onChange('');\n s.setUserClosedDropdown(false);\n}\n\nfunction commitSingleSelect<T>(item: T, p: AutocompleteProps<T>, s: AutocompleteState<T>, onChange: (v: string) => void): void {\n const label = (p.getLabel ?? defaultGetLabel)(item);\n s.setInputValue(label);\n onChange(label);\n}\n\n/** Apply a pick: open a link suggestion, or commit a search one to the input. */\nfunction commitPick<T>(\n item: T,\n linkUrl: string | null,\n p: AutocompleteProps<T>,\n s: AutocompleteState<T>,\n onChange: (v: string) => void,\n): void {\n if (linkUrl !== null) (p.openLink ?? defaultOpenLink)(linkUrl, item);\n else if (p.multiple) commitMultiSelect(item, p, s, onChange);\n else commitSingleSelect(item, p, s, onChange);\n}\n\nfunction runSelectItem<T>(item: T, p: AutocompleteProps<T>, s: AutocompleteState<T>, onChange: (v: string) => void): void {\n const url = (p.getUrl ?? defaultGetUrl)(item);\n const isLink = (p.getSuggestionType ?? defaultGetSuggestionType)(item) === 'link' && Boolean(url);\n // A single-select pick (search or link) ends the current search: the list\n // stays closed until the user types again. `multiple` mode is unchanged —\n // commitMultiSelect already clears inputValue and resets the flag itself,\n // so the empty-input branch of the filter effect keeps the list closed.\n const isSingleSelectPick = isLink || !p.multiple;\n commitPick(item, isLink ? (url as string) : null, p, s, onChange);\n s.setOpen(false);\n s.setActiveIndex(-1);\n p.onSelect?.(item);\n s.inputRef.current?.focus();\n // Set LAST so a re-fired `onFocus` cannot clear the flag. The close itself\n // relies on the input never blurring during a pick (the option's\n // `onMouseDown` preventDefault, and Enter keeps focus): `onFocus` reopens a\n // non-empty input directly, without reading this flag.\n if (isSingleSelectPick) s.setUserClosedDropdown(true);\n}\n\nfunction buildKeyContext<T>(\n p: AutocompleteProps<T>,\n s: AutocompleteState<T>,\n selectItem: (item: T) => void,\n onChange: (v: string) => void,\n): KeyContext<T> {\n return {\n open: s.open, activeIndex: s.activeIndex, filteredSuggestions: s.filteredSuggestions,\n maxVisibleItems: p.maxVisibleItems ?? 10, allowFreeText: p.allowFreeText ?? true,\n inputValue: s.inputValue, ghost: s.ghost, isInputFocused: s.isInputFocused,\n multiple: Boolean(p.multiple), selectedItems: p.selectedItems ?? [],\n getLabel: p.getLabel ?? defaultGetLabel,\n getSuggestionType: p.getSuggestionType ?? defaultGetSuggestionType,\n setOpen: s.setOpen, setActiveIndex: s.setActiveIndex, setUserClosedDropdown: s.setUserClosedDropdown,\n setInputValue: s.setInputValue, setGhost: s.setGhost, setJustCompletedGhost: s.setJustCompletedGhost,\n debouncedOnChange: onChange, selectItem, onSelectedItemsChange: p.onSelectedItemsChange,\n };\n}\n\n/** The full view-model the presentational component renders. */\nexport interface AutocompleteView<T> {\n id: string;\n listId: string;\n optionIdPrefix: string;\n state: AutocompleteState<T>;\n visibleSuggestions: T[];\n activeDescendant: string | undefined;\n selectItem: (item: T) => void;\n removeSelectedItem: (item: T) => void;\n onKeyDown: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n onInputChange: (e: React.ChangeEvent<HTMLInputElement>) => void;\n onFocus: () => void;\n onBlur: () => void;\n onClickAway: () => void;\n}\n\n/** Wire state, effects, and (plain, per-render) handlers for the Autocomplete component. */\nexport function useAutocomplete<T>(p: AutocompleteProps<T>): AutocompleteView<T> {\n const componentId = useId();\n const id = p.id || componentId;\n const optionIdPrefix = `${id}-option`;\n const s = useAutocompleteState<T>(p.value, p.suggestions ?? []);\n\n const debouncedOnChange = (val: string): void => {\n if (s.debounceRef.current) window.clearTimeout(s.debounceRef.current);\n s.debounceRef.current = window.setTimeout(() => p.onChange(val), p.debounceMs ?? 150);\n };\n\n useValueSync(p.value, s.setInputValue);\n useDebounceCleanup(s.debounceRef);\n useScrollActiveIntoView(s.activeIndex, optionIdPrefix, s.listRef);\n useGhostFlagReset(s.justCompletedGhost, s.setJustCompletedGhost);\n useLoadingOpen(\n Boolean(p.isLoading),\n s.inputValue,\n Boolean(p.disabled),\n s.userClosedDropdown,\n s.setOpen,\n s.setActiveIndex,\n );\n useLocalFilter(p, s);\n useGhostText(p, s);\n\n const selectItem = (item: T): void => runSelectItem(item, p, s, debouncedOnChange);\n\n return {\n id,\n listId: `${id}-listbox`,\n optionIdPrefix,\n state: s,\n visibleSuggestions: s.filteredSuggestions.slice(0, p.maxVisibleItems ?? 10),\n activeDescendant: s.activeIndex >= 0 ? `${optionIdPrefix}-${s.activeIndex}` : undefined,\n selectItem,\n removeSelectedItem: (item: T): void => {\n const getKey = p.getKey ?? defaultGetKey;\n p.onSelectedItemsChange?.((p.selectedItems ?? []).filter((sel) => getKey(sel) !== getKey(item)));\n s.inputRef.current?.focus();\n },\n onKeyDown: (e: React.KeyboardEvent<HTMLInputElement>): void =>\n handleAutocompleteKey(e, s.composition, buildKeyContext(p, s, selectItem, debouncedOnChange)),\n onInputChange: (e: React.ChangeEvent<HTMLInputElement>): void => {\n s.setInputValue(e.target.value);\n debouncedOnChange(e.target.value);\n if (!s.open || s.filteredSuggestions.length === 0) s.setActiveIndex(-1);\n s.setUserClosedDropdown(false);\n },\n onFocus: (): void => {\n s.setIsInputFocused(true);\n s.setUserClosedDropdown(false);\n if (!s.inputValue.trim()) return;\n s.setOpen(true);\n if (s.filteredSuggestions.length > 0 && s.activeIndex === -1) s.setActiveIndex(0);\n },\n onBlur: (): void => {\n window.setTimeout(() => s.setIsInputFocused(false), 150);\n },\n onClickAway: (): void => {\n s.setOpen(false);\n s.setActiveIndex(-1);\n s.setUserClosedDropdown(true);\n },\n };\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/data-display/DataViews/data-views-category-pill.tsx"],"sourcesContent":["\"use client\";\n\nimport { useDataViewsCopy } from \"./data-views-copy-context\";\nimport { CategorySelect } from \"../../form/CategorySelect\";\nimport { MultiSelectDropdown } from \"../../layout/ContentToolbar\";\n\nimport type { FilterFieldConfig, FilterOption } from \"./data-views-types\";\n\n/**\n * Diff a whole-array selection back into per-value toggles.\n *\n * The filter state's only channel is `onTogglePill(field, value, checked)`, but\n * a tree hands back the entire selection at once. Diffing here keeps that one\n * channel the single way a pill ever changes, rather than giving the\n * hierarchical control a private path into the state.\n */\nexport function emitPillDiff(\n fieldId: string,\n before: readonly string[],\n after: readonly string[],\n onTogglePill: (fieldId: string, value: string, checked: boolean) => void,\n): void {\n const had = new Set(before);\n const wants = new Set(after);\n after.forEach((value) => {\n if (!had.has(value)) onTogglePill(fieldId, value, true);\n });\n before.forEach((value) => {\n if (!wants.has(value)) onTogglePill(fieldId, value, false);\n });\n}\n\n/** A filter option as the category tree wants it. */\nconst toCategoryOption = (option: FilterOption) => ({\n id: option.value,\n name: option.label,\n parentId: option.parentId ?? null,\n});\n\ninterface PillControlProps<T extends Record<string, unknown>> {\n fieldId: string;\n pill: FilterFieldConfig<T>;\n selected: string[];\n onTogglePill: (fieldId: string, value: string, checked: boolean) => void;\n onClearField: (fieldId: string) => void;\n onOpenChange?: (open: boolean) => void;\n testIdPrefix: string;\n /** `stacked` in the filter panel, `pill` on the inline bar. */\n layout?: \"stacked\" | \"pill\";\n}\n\n/**\n * One filter pill: the hierarchical category tree, or the flat multi-select.\n *\n * A category set nests, and flattening it into one list is what made \"Massas\"\n * (mercearia) indistinguishable from \"Massas\" (pratos principais). `control:\n * \"category\"` opts a field into the tree, which shows each hit under its parent.\n *\n * {@link FilterFieldConfig.allowParentSelection} decides whether a parent row is\n * itself tickable. It is forwarded rather than fixed here because it is a\n * per-SCREEN question: a filter over a catalogue where products sit on leaves\n * wants \"the whole category\" as one click, while one whose parents are pure\n * grouping would only offer a tick that means nothing.\n */\nexport function PillControl<T extends Record<string, unknown>>({\n fieldId,\n pill,\n selected,\n onTogglePill,\n onClearField,\n onOpenChange,\n testIdPrefix,\n layout = \"pill\",\n}: PillControlProps<T>): React.JSX.Element {\n const copy = useDataViewsCopy();\n const testId = `${testIdPrefix}-filter-${fieldId}`;\n if (pill.control === \"category\") {\n return (\n <CategorySelect\n copy={copy.categorySelect}\n placeholder={pill.label}\n label={layout === \"stacked\" ? pill.label : undefined}\n fullWidth={layout === \"stacked\"}\n options={pill.options.map(toCategoryOption)}\n allowParentSelection={pill.allowParentSelection ?? false}\n value={selected}\n onChange={(next) => emitPillDiff(fieldId, selected, next, onTogglePill)}\n dataTestId={testId}\n />\n );\n }\n return (\n <MultiSelectDropdown\n extraOptionsHeading={copy.filters.optionsHeading}\n clearText={copy.filters.clear}\n clearLabel={copy.filters.clearRange(pill.label)}\n label={pill.label}\n options={pill.options}\n selected={new Set(selected)}\n onToggle={(value, checked) => onTogglePill(fieldId, value, checked)}\n onClear={() => onClearField(fieldId)}\n allLabel={copy.filters.allOption}\n searchable={pill.searchEnabled ? true : undefined}\n searchPlaceholder={copy.filters.optionSearchPlaceholder}\n noResultsLabel={copy.filters.optionsEmpty}\n layout={layout}\n onOpenChange={onOpenChange}\n data-testid={testId}\n />\n );\n}\n"],"mappings":";;;;;;;;;;;AA8EM;AA9DC,SAAS,aACd,SACA,QACA,OACA,cACM;AACN,QAAM,MAAM,IAAI,IAAI,MAAM;AAC1B,QAAM,QAAQ,IAAI,IAAI,KAAK;AAC3B,QAAM,QAAQ,CAAC,UAAU;AACvB,QAAI,CAAC,IAAI,IAAI,KAAK,EAAG,cAAa,SAAS,OAAO,IAAI;AAAA,EACxD,CAAC;AACD,SAAO,QAAQ,CAAC,UAAU;AACxB,QAAI,CAAC,MAAM,IAAI,KAAK,EAAG,cAAa,SAAS,OAAO,KAAK;AAAA,EAC3D,CAAC;AACH;AAGA,IAAM,mBAAmB,CAAC,YAA0B;AAAA,EAClD,IAAI,OAAO;AAAA,EACX,MAAM,OAAO;AAAA,EACb,UAAU,OAAO,YAAY;AAC/B;AA2BO,SAAS,YAA+C;AAAA,EAC7D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS;AACX,GAA2C;AACzC,QAAM,OAAO,iBAAiB;AAC9B,QAAM,SAAS,GAAG,YAAY,WAAW,OAAO;AAChD,MAAI,KAAK,YAAY,YAAY;AAC/B,WACE;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,KAAK;AAAA,QACX,aAAa,KAAK;AAAA,QAClB,OAAO,WAAW,YAAY,KAAK,QAAQ;AAAA,QAC3C,WAAW,WAAW;AAAA,QACtB,SAAS,KAAK,QAAQ,IAAI,gBAAgB;AAAA,QAC1C,sBAAsB,KAAK,wBAAwB;AAAA,QACnD,OAAO;AAAA,QACP,UAAU,CAAC,SAAS,aAAa,SAAS,UAAU,MAAM,YAAY;AAAA,QACtE,YAAY;AAAA;AAAA,IACd;AAAA,EAEJ;AACA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,qBAAqB,KAAK,QAAQ;AAAA,MAClC,WAAW,KAAK,QAAQ;AAAA,MACxB,YAAY,KAAK,QAAQ,WAAW,KAAK,KAAK;AAAA,MAC9C,OAAO,KAAK;AAAA,MACZ,SAAS,KAAK;AAAA,MACd,UAAU,IAAI,IAAI,QAAQ;AAAA,MAC1B,UAAU,CAAC,OAAO,YAAY,aAAa,SAAS,OAAO,OAAO;AAAA,MAClE,SAAS,MAAM,aAAa,OAAO;AAAA,MACnC,UAAU,KAAK,QAAQ;AAAA,MACvB,YAAY,KAAK,gBAAgB,OAAO;AAAA,MACxC,mBAAmB,KAAK,QAAQ;AAAA,MAChC,gBAAgB,KAAK,QAAQ;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,eAAa;AAAA;AAAA,EACf;AAEJ;","names":[]}
|
|
File without changes
|
/package/dist/{chunk-FZJ2FTGE.js.map → _internal/components/form/NumberField/NumberField.js.map}
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|