@12-apps/ui 6.20.0 → 6.21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NATIVE.md +5 -1
- package/dist/_internal/components/data-display/Alert/Alert.js +4 -4
- package/dist/_internal/components/data-display/Alert/Alert.styles.js +2 -2
- package/dist/_internal/components/data-display/AsyncStateContainer/AsyncStateContainer.js +7 -7
- package/dist/_internal/components/data-display/Avatar/Avatar.js +2 -2
- package/dist/_internal/components/data-display/Badge/Badge.js +3 -3
- package/dist/_internal/components/data-display/CardKit/CardKebab.js +4 -4
- package/dist/_internal/components/data-display/CardKit/card-actions-context.js +5 -5
- package/dist/_internal/components/data-display/CardKit/use-remove-confirm.js +10 -10
- package/dist/_internal/components/data-display/CardKit/use-row-confirm.js +5 -5
- package/dist/_internal/components/data-display/Carousel/Carousel.js +3 -3
- package/dist/_internal/components/data-display/Chart/Chart.js +4 -4
- package/dist/_internal/components/data-display/Chart/SpecChart.js +7 -7
- package/dist/_internal/components/data-display/Chart/chart-context.js +2 -2
- package/dist/_internal/components/data-display/Chart/chart-renderers.js +3 -3
- package/dist/_internal/components/data-display/DataGrid/DataGrid.js +2 -2
- package/dist/_internal/components/data-display/DataViews/DataViewsBoard.js +3 -3
- package/dist/_internal/components/data-display/DataViews/DataViewsGrid.js +52 -51
- package/dist/_internal/components/data-display/DataViews/DataViewsTableBase.js +73 -69
- package/dist/_internal/components/data-display/DataViews/DeleteViewDialog.js +5 -5
- package/dist/_internal/components/data-display/DataViews/ManageViewsDialog.js +7 -7
- package/dist/_internal/components/data-display/DataViews/SaveViewModal.js +16 -12
- package/dist/_internal/components/data-display/DataViews/base-card.js +7 -5
- package/dist/_internal/components/data-display/DataViews/base-list-card-geometry.js +7 -7
- package/dist/_internal/components/data-display/DataViews/base-list-card-gutters.js +10 -3
- package/dist/_internal/components/data-display/DataViews/base-list-card-slots.js +6 -6
- package/dist/_internal/components/data-display/DataViews/base-list-card.js +14 -13
- package/dist/_internal/components/data-display/DataViews/data-views-category-pill.js +17 -15
- package/dist/_internal/components/data-display/DataViews/data-views-columns-tab.js +3 -3
- package/dist/_internal/components/data-display/DataViews/data-views-columns.js +5 -5
- package/dist/_internal/components/data-display/DataViews/data-views-display-panel.js +8 -8
- package/dist/_internal/components/data-display/DataViews/data-views-display-tabs.js +3 -3
- 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 +21 -19
- package/dist/_internal/components/data-display/DataViews/data-views-grid-bodies.js +12 -12
- package/dist/_internal/components/data-display/DataViews/data-views-grid-helpers.js +4 -4
- package/dist/_internal/components/data-display/DataViews/data-views-grid-parts.js +47 -46
- package/dist/_internal/components/data-display/DataViews/data-views-header-row.js +3 -3
- package/dist/_internal/components/data-display/DataViews/data-views-inline-bar.js +27 -26
- package/dist/_internal/components/data-display/DataViews/data-views-more-fields.js +8 -8
- package/dist/_internal/components/data-display/DataViews/data-views-more-filters.js +11 -11
- package/dist/_internal/components/data-display/DataViews/data-views-range-pill.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 +14 -14
- package/dist/_internal/components/data-display/DataViews/data-views-table-parts.js +25 -21
- package/dist/_internal/components/data-display/DataViews/data-views-toolbar.js +13 -13
- package/dist/_internal/components/data-display/DataViews/data-views-view-nav.js +5 -5
- package/dist/_internal/components/data-display/DataViews/list-card-rails.js +2 -2
- package/dist/_internal/components/data-display/DataViews/save-view-preview.js +3 -3
- package/dist/_internal/components/data-display/DataViews/use-data-views-state.js +8 -8
- package/dist/_internal/components/data-display/DataViews/use-saved-views-controller.js +2 -2
- package/dist/_internal/components/data-display/DescriptionItem/DescriptionItem.js +3 -3
- package/dist/_internal/components/data-display/EmptyState/EmptyState.js +3 -3
- package/dist/_internal/components/data-display/ErrorState/ErrorState.js +2 -2
- package/dist/_internal/components/data-display/HoverCard/HoverCard.js +1 -1
- package/dist/_internal/components/data-display/LazyImage/LazyImage.js +3 -3
- package/dist/_internal/components/data-display/Lightbox/Lightbox.js +5 -5
- package/dist/_internal/components/data-display/LoadingState/LoadingState.js +3 -3
- package/dist/_internal/components/data-display/MapPreview/MapDecorations.js +2 -2
- package/dist/_internal/components/data-display/MapPreview/MapLayers.js +3 -3
- package/dist/_internal/components/data-display/MapPreview/MapPreview.hooks.js +2 -2
- package/dist/_internal/components/data-display/MapPreview/MapPreview.js +11 -11
- package/dist/_internal/components/data-display/MapPreview/MapTiles.js +2 -2
- package/dist/_internal/components/data-display/MapPreview/StaticMapView.js +4 -4
- package/dist/_internal/components/data-display/MapPreview/useMapPreview.js +3 -3
- package/dist/_internal/components/data-display/SectionOnboarding/SectionOnboarding.js +4 -4
- package/dist/_internal/components/data-display/Sheet/Sheet.js +2 -2
- package/dist/_internal/components/data-display/StatCard/StatCard.js +3 -3
- package/dist/_internal/components/data-display/Table/Table.js +3 -3
- package/dist/_internal/components/data-display/index.js +59 -59
- package/dist/_internal/components/feedback/ConfirmAction/ConfirmButton.js +4 -4
- package/dist/_internal/components/feedback/TutorialOverlay/TutorialOverlay.js +2 -2
- package/dist/_internal/components/feedback/index.js +9 -9
- package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.hooks.js +3 -3
- package/dist/_internal/components/form/AddressAutocomplete/AddressAutocomplete.js +12 -10
- package/dist/_internal/components/form/AddressAutocomplete/AddressAutocompleteField.js +7 -5
- package/dist/_internal/components/form/AddressAutocomplete/AddressFallbackField.js +5 -3
- package/dist/_internal/components/form/AddressAutocomplete/AddressInputField.js +5 -3
- package/dist/_internal/components/form/AddressAutocomplete/AddressTextField.js +4 -2
- package/dist/_internal/components/form/Autocomplete/Autocomplete.js +2 -2
- package/dist/_internal/components/form/Button/Button.js +3 -3
- package/dist/_internal/components/form/Calendar/Calendar.js +4 -4
- package/dist/_internal/components/form/Calendar/CalendarDayCell.js +2 -2
- package/dist/_internal/components/form/Calendar/CalendarMonth.js +3 -3
- package/dist/_internal/components/form/CategorySelect/CategoryPanel.js +10 -8
- package/dist/_internal/components/form/CategorySelect/CategoryPanelFoot.js +5 -3
- package/dist/_internal/components/form/CategorySelect/CategoryPanelHead.js +5 -3
- package/dist/_internal/components/form/CategorySelect/CategoryPanelList.js +7 -5
- package/dist/_internal/components/form/CategorySelect/CategoryRows.js +6 -4
- package/dist/_internal/components/form/CategorySelect/CategorySelect.js +14 -12
- package/dist/_internal/components/form/CategorySelect/CategorySelect.styles.js +4 -2
- package/dist/_internal/components/form/CategorySelect/CategoryTrigger.js +5 -3
- package/dist/_internal/components/form/CepField/CepField.js +10 -4
- package/dist/_internal/components/form/Checkbox/Checkbox.base.js +1 -0
- package/dist/_internal/components/form/Checkbox/Checkbox.base.js.map +1 -0
- package/dist/_internal/components/form/Checkbox/Checkbox.helpers.js +2 -1
- package/dist/_internal/components/form/Checkbox/Checkbox.js +9 -2
- package/dist/_internal/components/form/Checkbox/Checkbox.metrics.js +34 -0
- package/dist/_internal/components/form/Checkbox/Checkbox.metrics.js.map +1 -0
- package/dist/_internal/components/form/CodeEditor/CodeEditor.js +6 -4
- package/dist/_internal/components/form/CreatableSelect/CreatableSelect.js +4 -2
- package/dist/_internal/components/form/DateRangePicker/DateRangePicker.js +5 -5
- package/dist/_internal/components/form/Input/Input.base.js +1 -0
- package/dist/_internal/components/form/Input/Input.base.js.map +1 -0
- package/dist/_internal/components/form/Input/Input.helpers.js +23 -0
- package/dist/_internal/components/form/Input/Input.helpers.js.map +1 -0
- package/dist/_internal/components/form/Input/Input.js +9 -3
- package/dist/_internal/components/form/Input/Input.metrics.js +53 -0
- package/dist/_internal/components/form/Input/Input.metrics.js.map +1 -0
- package/dist/_internal/components/form/Input/Input.styles.js +10 -4
- package/dist/_internal/components/form/InputOTP/InputOTP.js +5 -3
- package/dist/_internal/components/form/InputOTP/InputOTP.styles.js +4 -2
- package/dist/_internal/components/form/Menubar/Menubar.js +4 -4
- package/dist/_internal/components/form/Menubar/Menubar.toolbar.js +2 -2
- package/dist/_internal/components/form/PhoneInput/PhoneInput.js +4 -2
- package/dist/_internal/components/form/RadioGroup/RadioGroup.js +6 -4
- package/dist/_internal/components/form/RadioGroup/RadioGroup.styles.js +4 -2
- package/dist/_internal/components/form/RadioGroup/RadioGroup.variants.js +5 -3
- package/dist/_internal/components/form/RichTextEditor/RichTextEditor.js +4 -2
- package/dist/_internal/components/form/Select/Select.base.js +1 -0
- package/dist/_internal/components/form/Select/Select.base.js.map +1 -0
- package/dist/_internal/components/form/Select/Select.helpers.js +48 -0
- package/dist/_internal/components/form/Select/Select.helpers.js.map +1 -0
- package/dist/_internal/components/form/Select/Select.js +10 -2
- package/dist/_internal/components/form/Select/Select.metrics.js +38 -0
- package/dist/_internal/components/form/Select/Select.metrics.js.map +1 -0
- package/dist/_internal/components/form/Switch/Switch.base.js +1 -0
- package/dist/_internal/components/form/Switch/Switch.base.js.map +1 -0
- package/dist/_internal/components/form/Switch/Switch.helpers.js +59 -0
- package/dist/_internal/components/form/Switch/Switch.helpers.js.map +1 -0
- package/dist/_internal/components/form/Switch/Switch.js +9 -3
- package/dist/_internal/components/form/Switch/Switch.metrics.js +83 -0
- package/dist/_internal/components/form/Switch/Switch.metrics.js.map +1 -0
- package/dist/_internal/components/form/Switch/Switch.parts.js +7 -2
- package/dist/_internal/components/form/Switch/Switch.styles.js +6 -1
- package/dist/_internal/components/form/Textarea/Textarea.js +5 -3
- package/dist/_internal/components/form/Textarea/Textarea.styles.js +4 -2
- package/dist/_internal/components/form/Textarea/TextareaRichEditor.js +4 -2
- package/dist/_internal/components/form/Textarea/TextareaRichEditor.js.map +1 -1
- package/dist/_internal/components/form/Toggle/Toggle.js +5 -3
- package/dist/_internal/components/form/Toggle/Toggle.styles.js +4 -2
- package/dist/_internal/components/form/index.js +53 -47
- package/dist/_internal/components/form/total-form/Fields/CategoryField.js +15 -13
- package/dist/_internal/components/form/total-form/Fields/CepField.js +11 -5
- package/dist/_internal/components/form/total-form/Fields/SelectField.js +11 -3
- package/dist/_internal/components/form/total-form/Fields/TextField.js +10 -4
- package/dist/_internal/components/form/total-form/Fields/index.js +29 -21
- package/dist/_internal/components/form/total-form/SubmitButton.js +4 -4
- package/dist/_internal/components/index.js +140 -134
- package/dist/_internal/components/layout/Box/Box.js +2 -2
- package/dist/_internal/components/layout/Container/Container.js +2 -2
- package/dist/_internal/components/layout/ScrollArea/ScrollArea.js +3 -3
- package/dist/_internal/components/layout/Skeleton/Skeleton.js +2 -2
- package/dist/_internal/components/layout/Spacer/Spacer.js +2 -2
- package/dist/_internal/components/layout/Stack/Stack.js +3 -3
- package/dist/_internal/components/layout/index.js +13 -13
- package/dist/_internal/components/navigation/AppHeader/AppHeader.details.js +6 -6
- package/dist/_internal/components/navigation/CommandPalette/CommandPalette.js +2 -2
- package/dist/_internal/components/navigation/NavigationMenu/NavigationMegaSection.js +3 -3
- package/dist/_internal/components/navigation/NavigationMenu/NavigationMenu.js +5 -5
- package/dist/_internal/components/navigation/NavigationMenu/NavigationMenuItem.js +2 -2
- package/dist/_internal/components/navigation/NavigationMenu/NavigationStandardBody.js +3 -3
- package/dist/_internal/components/navigation/index.js +13 -13
- package/dist/_internal/components/typography/Heading/Heading.js +2 -2
- package/dist/_internal/components/typography/Paragraph/Paragraph.js +2 -2
- package/dist/_internal/components/typography/Text/Text.js +2 -2
- package/dist/_internal/components/typography/index.js +4 -4
- package/dist/_internal/components/utility/InfiniteScroll/InfiniteScroll.js +2 -2
- package/dist/_internal/components/utility/index.js +2 -2
- package/dist/_internal/icons/Icon.js +3 -3
- package/dist/_internal/icons/paths.generated.js +1 -1
- package/dist/_internal/platform/aria.js +17 -1
- package/dist/_internal/platform/aria.js.map +1 -1
- package/dist/_internal/platform/test-id.js +3 -1
- package/dist/_internal/social-login-button/social-login-button.js +6 -6
- package/dist/_internal/tokens/field-edge.core.js +11 -0
- package/dist/_internal/tokens/field-edge.core.js.map +1 -0
- package/dist/_internal/tokens/field-edge.js +5 -2
- package/dist/_internal/user-avatar/user-avatar.js +7 -7
- package/dist/charts.js +13 -13
- package/dist/{chunk-2PCOC3PT.js → chunk-26Z7QWID.js} +2 -2
- package/dist/chunk-2ECT4IY2.js +250 -0
- package/dist/chunk-2ECT4IY2.js.map +1 -0
- package/dist/{chunk-IJIT5HQP.js → chunk-2QFTAGDH.js} +3 -3
- package/dist/{chunk-ENNW5SKT.js → chunk-2QLVUVVR.js} +2 -2
- package/dist/{chunk-W3FAKT3D.js → chunk-2SWQ6HIK.js} +4 -4
- package/dist/{chunk-7P2HZLEG.js → chunk-3UOHKHOT.js} +3 -3
- package/dist/{chunk-URWGRPL7.js → chunk-3W7IEWEL.js} +2 -2
- package/dist/{chunk-Z7JNCB5Q.js → chunk-426FTCMF.js} +2 -2
- package/dist/{chunk-46UPILLK.js → chunk-4ETQRBZC.js} +4 -4
- package/dist/{chunk-NQC6H7GY.js → chunk-4HYXEMBP.js} +2 -2
- package/dist/{chunk-43NEBUV3.js → chunk-4K7FDVAB.js} +2 -2
- package/dist/{chunk-LMJBINWN.js → chunk-4MLDWACO.js} +13 -13
- package/dist/{chunk-GGE7Y53F.js → chunk-4TXIZ5WI.js} +2 -2
- package/dist/{chunk-J6UFAMIC.js → chunk-5RQ7N63M.js} +2 -2
- package/dist/chunk-5ZNU2U4D.js +41 -0
- package/dist/chunk-5ZNU2U4D.js.map +1 -0
- package/dist/{chunk-AVGTTWTE.js → chunk-65DLYC4S.js} +4 -4
- package/dist/{chunk-QLWBQQW7.js → chunk-6F5IKY32.js} +5 -1
- package/dist/chunk-6F5IKY32.js.map +1 -0
- package/dist/{chunk-B2A4DG77.js → chunk-6RGWDKUL.js} +6 -6
- package/dist/{chunk-DCEMUZJQ.js → chunk-6WIDZGXE.js} +2 -2
- package/dist/{chunk-R7MX5KPJ.js → chunk-6YLAVHV4.js} +4 -4
- package/dist/{chunk-E27Y7FF2.js → chunk-6Z4H2Y77.js} +4 -4
- package/dist/{chunk-PNYXXLPU.js → chunk-736HP6BL.js} +2 -2
- package/dist/{chunk-C52BELLW.js → chunk-77F36LQQ.js} +3 -3
- package/dist/chunk-7FDU3FIN.js +13 -0
- package/dist/chunk-7FDU3FIN.js.map +1 -0
- package/dist/{chunk-RXSGHPCR.js → chunk-7FOOLP5H.js} +4 -4
- package/dist/{chunk-74OZ5KVR.js → chunk-7KTU6YMQ.js} +6 -6
- package/dist/{chunk-X5D3PTWI.js → chunk-7MAOQIWA.js} +2 -2
- package/dist/{chunk-5ZF3VASA.js → chunk-7ZH7ZB33.js} +7 -7
- package/dist/{chunk-FX5DY6VR.js → chunk-AD776JPA.js} +7 -4
- package/dist/chunk-AD776JPA.js.map +1 -0
- package/dist/{chunk-PQECNGDE.js → chunk-AGYGNNOM.js} +2 -2
- package/dist/{chunk-PU3AAKRR.js → chunk-AJ6XEO4E.js} +2 -2
- package/dist/{chunk-WX7VWW3W.js → chunk-B3BK2SNS.js} +2 -2
- package/dist/{chunk-VJK5FBNK.js → chunk-B5PYBEXO.js} +2 -2
- package/dist/{chunk-47UD6DZ4.js → chunk-BDVNAU2C.js} +4 -4
- package/dist/{chunk-FGLV6BXQ.js → chunk-BEGWE5O4.js} +5 -5
- package/dist/{chunk-6IUTT6BK.js → chunk-BEH4DN63.js} +4 -4
- package/dist/{chunk-HKV4MQ2W.js → chunk-BLBOYCOV.js} +5 -5
- package/dist/{chunk-24BUCMQA.js → chunk-BNNSO4MC.js} +5 -5
- package/dist/{chunk-CZJLWCEG.js → chunk-BPYPUEM5.js} +2 -2
- package/dist/{chunk-NHSMLVNC.js → chunk-BQQONDW5.js} +7 -7
- package/dist/{chunk-DQHC5P64.js → chunk-BRSF5NRT.js} +4 -4
- package/dist/{chunk-M7OHXNLF.js → chunk-CXVMD6FE.js} +3 -3
- package/dist/{chunk-LYSSO6WC.js → chunk-CZPU5TW3.js} +4 -4
- package/dist/{chunk-DOADQW7I.js → chunk-D4T646G4.js} +2 -2
- package/dist/{chunk-2W4CIWTW.js → chunk-DBYFC6CF.js} +3 -3
- package/dist/{chunk-76GZ55IC.js → chunk-DF2FFYZ7.js} +7 -7
- package/dist/chunk-DFK6QCXX.js +150 -0
- package/dist/chunk-DFK6QCXX.js.map +1 -0
- package/dist/{chunk-BILE3A7F.js → chunk-DH75UNF3.js} +2 -2
- package/dist/{chunk-MLOWPVVW.js → chunk-EPEJMTCQ.js} +16 -13
- package/dist/chunk-EPEJMTCQ.js.map +1 -0
- package/dist/{chunk-6D5WEZ2L.js → chunk-FB36IHCE.js} +8 -8
- package/dist/{chunk-OI3HOI74.js → chunk-FGUESLDX.js} +2 -2
- package/dist/{chunk-PC5FFEIY.js → chunk-FINCVAAR.js} +4 -4
- package/dist/{chunk-YK2PETUP.js → chunk-FRQ4HNGF.js} +2 -2
- package/dist/{chunk-WO52KYSU.js → chunk-G2IPK2XE.js} +10 -10
- package/dist/{chunk-E4FGKZID.js → chunk-GBNOYRLP.js} +8 -8
- package/dist/{chunk-UNF65XZW.js → chunk-GBRKP5GZ.js} +2 -2
- package/dist/{chunk-VLHGBFR6.js → chunk-GCXYCDOA.js} +2 -2
- package/dist/{chunk-EX3PSZLV.js → chunk-GDEXYUPF.js} +3 -3
- package/dist/{chunk-4N4ENTF7.js → chunk-GO4MVQGC.js} +2 -2
- package/dist/{chunk-HDNK7BAX.js → chunk-GT7C6TSM.js} +3 -3
- package/dist/chunk-GY6KNVMI.js +39 -0
- package/dist/chunk-GY6KNVMI.js.map +1 -0
- package/dist/{chunk-HBAPVB7T.js → chunk-HKKSZ7HG.js} +2 -2
- package/dist/{chunk-3AOOI2NR.js → chunk-HR7YTBR7.js} +4 -4
- package/dist/{chunk-AEGX66N7.js → chunk-I3MDKPGG.js} +2 -2
- package/dist/{chunk-7BYFC2MR.js → chunk-I7HYGIEJ.js} +6 -6
- package/dist/{chunk-D7FJ2GAD.js → chunk-IFNK5TPI.js} +2 -2
- package/dist/{chunk-PODGTNXS.js → chunk-IH4RSRQA.js} +4 -4
- package/dist/{chunk-UF27D35R.js → chunk-IIROZKW5.js} +2 -2
- package/dist/{chunk-PUBPZOQJ.js → chunk-IPE5FFFD.js} +2 -2
- package/dist/{chunk-37YPZHAG.js → chunk-JDMYD6QC.js} +2 -2
- package/dist/{chunk-HSAH5QUQ.js → chunk-JIINGMEB.js} +6 -6
- package/dist/{chunk-NRUYYGDZ.js → chunk-JXAYT6LX.js} +2 -2
- package/dist/{chunk-VMNSGE2G.js → chunk-KEVPUBOE.js} +5 -1
- package/dist/chunk-KEVPUBOE.js.map +1 -0
- package/dist/{chunk-ZBNTFWTG.js → chunk-KIHQE5YA.js} +2 -2
- package/dist/{chunk-DVUPIVI2.js → chunk-KT6HWAEN.js} +4 -4
- package/dist/{chunk-MY5VNNSP.js → chunk-MCRIT46W.js} +4 -4
- package/dist/chunk-MLCFODJO.js +135 -0
- package/dist/chunk-MLCFODJO.js.map +1 -0
- package/dist/{chunk-Q5EQC7NL.js → chunk-N5IVVLTH.js} +8 -5
- package/dist/chunk-N5IVVLTH.js.map +1 -0
- package/dist/{chunk-6XPNJLXE.js → chunk-NARIG5FL.js} +2 -2
- package/dist/{chunk-MBYO2F4Y.js → chunk-NUE774AN.js} +6 -6
- package/dist/{chunk-ZEBJT5JZ.js → chunk-OCXCH2ZW.js} +12 -12
- package/dist/{chunk-7TZ6OC5T.js → chunk-OH3YGJT5.js} +2 -2
- package/dist/{chunk-SM3NRN7L.js → chunk-ON2CMKTI.js} +2 -2
- package/dist/{chunk-VCTKJHXD.js → chunk-OOGEYCJH.js} +2 -2
- package/dist/{chunk-J54WH74M.js → chunk-P6IPJYCS.js} +6 -6
- package/dist/{chunk-23FCBIUN.js → chunk-P7FQUGED.js} +8 -8
- package/dist/{chunk-THBT56JE.js → chunk-PANMJFDS.js} +2 -2
- package/dist/{chunk-LZRURORY.js → chunk-PF5HDFYY.js} +3 -3
- package/dist/{chunk-YVW7VPK4.js → chunk-PFLKPNBU.js} +2 -2
- package/dist/{chunk-7EESF76V.js → chunk-PWXL3QQ6.js} +2 -2
- package/dist/{chunk-7DNQHMDO.js → chunk-PXH24VIP.js} +4 -4
- package/dist/{chunk-HBZIN6IQ.js → chunk-PZEC5CQA.js} +2 -2
- package/dist/{chunk-LAHDFBDE.js → chunk-QFHH2NU5.js} +3 -3
- package/dist/{chunk-GBB6XQ56.js → chunk-QGBMCB76.js} +2 -2
- package/dist/{chunk-SOCKK67R.js → chunk-QRX5BYUQ.js} +7 -7
- package/dist/{chunk-QZWKC3AP.js → chunk-QS7ZGRNS.js} +2 -2
- package/dist/{chunk-IH4CX43Q.js → chunk-QZDBWXZG.js} +2 -2
- package/dist/{chunk-PHCSPHDH.js → chunk-R6RVBYTU.js} +3 -3
- package/dist/{chunk-KZSKI2R3.js → chunk-RPQ3W2C6.js} +2 -2
- package/dist/{chunk-HEG7JIBM.js → chunk-RPWEXIAW.js} +5 -5
- package/dist/{chunk-JB67KPGM.js → chunk-RRO2EOJB.js} +4 -4
- package/dist/{chunk-BLT5ZBVL.js → chunk-RRX6ZTNX.js} +2 -2
- package/dist/{chunk-7RZ4WOQW.js → chunk-RRZBATXK.js} +3 -3
- package/dist/{chunk-RMSH2I3O.js → chunk-S6YY2WWK.js} +40 -50
- package/dist/chunk-S6YY2WWK.js.map +1 -0
- package/dist/{chunk-7JWXLDRH.js → chunk-SAHQLXNN.js} +4 -4
- package/dist/{chunk-LUMF63BM.js → chunk-SFAP5EH5.js} +4 -4
- package/dist/{chunk-EGRFMPGD.js → chunk-SHDIZSN5.js} +6 -6
- package/dist/{chunk-GJQYM3PM.js → chunk-SHQWIDD5.js} +4 -4
- package/dist/{chunk-BJ3J6FTN.js → chunk-STH66VLA.js} +40 -23
- package/dist/chunk-STH66VLA.js.map +1 -0
- package/dist/{chunk-FCOEJCUP.js → chunk-TFO6GBW7.js} +2 -2
- package/dist/{chunk-2ZDTGI5V.js → chunk-THZ2NAA4.js} +7 -7
- package/dist/{chunk-OQXOYHIV.js → chunk-TLX66HCW.js} +45 -37
- package/dist/chunk-TLX66HCW.js.map +1 -0
- package/dist/{chunk-VJFH2AXT.js → chunk-TP4N3X2Q.js} +2 -2
- package/dist/{chunk-B7BZAIHL.js → chunk-TPIBJP4S.js} +2 -2
- package/dist/{chunk-Q4NOI2CR.js → chunk-TVO5STZB.js} +5 -5
- package/dist/{chunk-JB7JE4QZ.js → chunk-TZ4SFX3M.js} +3 -3
- package/dist/{chunk-JD364H3Y.js → chunk-TZ633UZA.js} +6 -5
- package/dist/chunk-TZ633UZA.js.map +1 -0
- package/dist/{chunk-HEK4LQT6.js → chunk-UB76PBDF.js} +2 -2
- package/dist/{chunk-NFAKRI4S.js → chunk-UEIVXFUC.js} +2 -2
- package/dist/{chunk-DX527XPL.js → chunk-UOPQOBQZ.js} +3 -3
- package/dist/{chunk-X24P3ZYW.js → chunk-V5P5Q6HM.js} +10 -10
- package/dist/{chunk-7DBFEZRC.js → chunk-VIK3HAUQ.js} +2 -2
- package/dist/{chunk-74EZ565M.js → chunk-VPHOSIPB.js} +5 -5
- package/dist/{chunk-SX3V2DLV.js → chunk-VWBWKLXX.js} +4 -4
- package/dist/{chunk-VEFDL77X.js → chunk-VWGR5XUP.js} +2 -2
- package/dist/{chunk-SEH7KOVG.js → chunk-VXTYVJDK.js} +2 -2
- package/dist/{chunk-QYNCPS5W.js → chunk-WBKWIFXA.js} +6 -6
- package/dist/{chunk-YFHIESMD.js → chunk-WPZT2JD4.js} +2 -2
- package/dist/{chunk-GSFNH4C5.js → chunk-WROCSDVL.js} +5 -5
- package/dist/{chunk-VSLUFBMT.js → chunk-WTIOCG4M.js} +41 -27
- package/dist/chunk-WTIOCG4M.js.map +1 -0
- package/dist/{chunk-QZBUGUOY.js → chunk-XEE7PLDR.js} +6 -6
- package/dist/{chunk-Z4GWXTZV.js → chunk-XFU2S6XT.js} +7 -7
- package/dist/{chunk-RQDN4BN5.js → chunk-XLJJ2ZAP.js} +16 -16
- package/dist/{chunk-ACDYA5WC.js → chunk-XZTOIEKI.js} +2 -2
- package/dist/{chunk-LKVIZNUM.js → chunk-Y46RBFBV.js} +8 -8
- package/dist/{chunk-WBVHRLIS.js → chunk-YCCKY5VW.js} +5 -5
- package/dist/{chunk-SKZHOWTS.js → chunk-YDI6IJ6F.js} +2 -2
- package/dist/{chunk-V3SBJ3PB.js → chunk-Z5ABJLTM.js} +2 -2
- package/dist/{chunk-KQ74QU55.js → chunk-Z6UEOSL7.js} +3 -3
- package/dist/{chunk-G5ZVD5IJ.js → chunk-ZDWU52DJ.js} +2 -2
- package/dist/{chunk-2EKALM6P.js → chunk-ZFPJBKVZ.js} +4 -4
- package/dist/{chunk-FP4R47TM.js → chunk-ZGHIHEND.js} +2 -2
- package/dist/{chunk-F2DOTCF3.js → chunk-ZKFYBC6G.js} +2 -2
- package/dist/{chunk-4MGFUPQT.js → chunk-ZOUWHGV3.js} +4 -4
- package/dist/{chunk-4WK2RTVY.js → chunk-ZXLIWOXC.js} +5 -5
- package/dist/{chunk-UMDXGIRZ.js → chunk-ZZOOSKSV.js} +2 -2
- package/dist/data-display/Alert.js +4 -4
- package/dist/data-display/AsyncStateContainer.js +7 -7
- package/dist/data-display/Avatar.js +2 -2
- package/dist/data-display/Badge.js +3 -3
- package/dist/data-display/CardKit.js +18 -18
- package/dist/data-display/Carousel.js +3 -3
- package/dist/data-display/Chart.js +13 -13
- package/dist/data-display/DataGrid.js +2 -2
- package/dist/data-display/DataViews.js +89 -84
- package/dist/data-display/DescriptionItem.js +3 -3
- package/dist/data-display/EmptyState.js +3 -3
- package/dist/data-display/ErrorState.js +2 -2
- package/dist/data-display/HoverCard.js +1 -1
- package/dist/data-display/LazyImage.js +3 -3
- package/dist/data-display/Lightbox.js +5 -5
- package/dist/data-display/LoadingState.js +3 -3
- package/dist/data-display/MapPreview.js +11 -11
- package/dist/data-display/SectionOnboarding.js +4 -4
- package/dist/data-display/Sheet.js +2 -2
- package/dist/data-display/StatCard.js +3 -3
- package/dist/data-display/Table.js +3 -3
- package/dist/feedback/ConfirmAction.js +7 -7
- package/dist/feedback/TutorialOverlay.js +2 -2
- package/dist/form/AddressAutocomplete.js +12 -10
- package/dist/form/Autocomplete.js +2 -2
- package/dist/form/Button.js +3 -3
- package/dist/form/Calendar.js +4 -4
- package/dist/form/CategorySelect.js +14 -12
- package/dist/form/CepField.js +10 -4
- package/dist/form/Checkbox.js +9 -2
- package/dist/form/CodeEditor.js +6 -4
- package/dist/form/CreatableSelect.js +4 -2
- package/dist/form/DateRangePicker.js +5 -5
- package/dist/form/Input.js +9 -3
- package/dist/form/InputOTP.js +5 -3
- package/dist/form/Menubar.js +4 -4
- package/dist/form/PhoneInput.js +4 -2
- package/dist/form/RadioGroup.js +6 -4
- package/dist/form/RichTextEditor.js +4 -2
- package/dist/form/Select.js +10 -2
- package/dist/form/Switch.js +9 -3
- package/dist/form/Textarea.js +5 -3
- package/dist/form/Toggle.js +5 -3
- package/dist/form/total-form.js +33 -28
- package/dist/icons.js +3 -3
- package/dist/layout/Box.js +2 -2
- package/dist/layout/Container.js +2 -2
- package/dist/layout/ContentToolbar.js +6 -6
- package/dist/layout/ScrollArea.js +3 -3
- package/dist/layout/Skeleton.js +2 -2
- package/dist/layout/Spacer.js +2 -2
- package/dist/layout/Stack.js +3 -3
- package/dist/native/chunks/{chunk-Q52IDAF2.js → chunk-D4EYAXNG.js} +6 -2
- package/dist/native/chunks/chunk-D4EYAXNG.js.map +1 -0
- package/dist/native/chunks/{chunk-EKKNUEA6.js → chunk-OGWPPQL4.js} +2 -2
- package/dist/native/chunks/chunk-OXHZDFJZ.js +15 -0
- package/dist/native/chunks/chunk-OXHZDFJZ.js.map +1 -0
- package/dist/native/chunks/{chunk-M4DTJDWU.js → chunk-QZAUOHDQ.js} +1 -1
- package/dist/native/chunks/chunk-QZAUOHDQ.js.map +1 -0
- package/dist/native/chunks/{chunk-UKCCYP52.js → chunk-RJVM5YDE.js} +2 -2
- package/dist/native/chunks/chunk-T6BJPP3E.js +26 -0
- package/dist/native/chunks/chunk-T6BJPP3E.js.map +1 -0
- package/dist/native/chunks/chunk-WKMDCNIN.js +351 -0
- package/dist/native/chunks/chunk-WKMDCNIN.js.map +1 -0
- package/dist/native/data-display/Alert.js +3 -3
- package/dist/native/data-display/Avatar.js +2 -2
- package/dist/native/data-display/Badge.js +3 -3
- package/dist/native/data-display/Chip.js +2 -2
- package/dist/native/data-display/EmptyState.js +4 -4
- package/dist/native/data-display/ErrorState.js +4 -4
- package/dist/native/data-display/LoadingState.js +1 -1
- package/dist/native/form/Button.js +2 -2
- package/dist/native/form/Checkbox.js +233 -0
- package/dist/native/form/Checkbox.js.map +1 -0
- package/dist/native/form/Input.js +233 -0
- package/dist/native/form/Input.js.map +1 -0
- package/dist/native/form/Select.js +348 -0
- package/dist/native/form/Select.js.map +1 -0
- package/dist/native/form/Switch.js +511 -0
- package/dist/native/form/Switch.js.map +1 -0
- package/dist/native/icons.js +2 -2
- package/dist/native/layout/Box.js +2 -2
- package/dist/native/layout/Container.js +1 -1
- package/dist/native/layout/Skeleton.js +1 -1
- package/dist/native/layout/Spacer.js +1 -1
- package/dist/native/layout/Stack.js +2 -2
- package/dist/native/typography/Heading.js +1 -1
- package/dist/native/typography/Paragraph.js +1 -1
- package/dist/native/typography/Text.js +1 -1
- package/dist/navigation/AppHeader.js +6 -6
- package/dist/navigation/CommandPalette.js +2 -2
- package/dist/navigation/NavigationMenu.js +5 -5
- package/dist/social-login-button.js +6 -6
- package/dist/types/components/form/Checkbox/Checkbox.base.d.ts +36 -0
- package/dist/types/components/form/Checkbox/Checkbox.base.d.ts.map +1 -0
- package/dist/types/components/form/Checkbox/Checkbox.d.ts.map +1 -1
- package/dist/types/components/form/Checkbox/Checkbox.helpers.d.ts +9 -3
- package/dist/types/components/form/Checkbox/Checkbox.helpers.d.ts.map +1 -1
- package/dist/types/components/form/Checkbox/Checkbox.metrics.d.ts +92 -0
- package/dist/types/components/form/Checkbox/Checkbox.metrics.d.ts.map +1 -0
- package/dist/types/components/form/Checkbox/Checkbox.types.d.ts +8 -10
- package/dist/types/components/form/Checkbox/Checkbox.types.d.ts.map +1 -1
- package/dist/types/components/form/Checkbox/index.d.ts +1 -1
- package/dist/types/components/form/Checkbox/index.d.ts.map +1 -1
- package/dist/types/components/form/Input/Input.base.d.ts +62 -0
- package/dist/types/components/form/Input/Input.base.d.ts.map +1 -0
- package/dist/types/components/form/Input/Input.d.ts.map +1 -1
- package/dist/types/components/form/Input/Input.helpers.d.ts +11 -0
- package/dist/types/components/form/Input/Input.helpers.d.ts.map +1 -0
- package/dist/types/components/form/Input/Input.metrics.d.ts +186 -0
- package/dist/types/components/form/Input/Input.metrics.d.ts.map +1 -0
- package/dist/types/components/form/Input/Input.styles.d.ts +1 -35
- package/dist/types/components/form/Input/Input.styles.d.ts.map +1 -1
- package/dist/types/components/form/Input/Input.types.d.ts +12 -17
- package/dist/types/components/form/Input/Input.types.d.ts.map +1 -1
- package/dist/types/components/form/Input/index.d.ts +1 -1
- package/dist/types/components/form/Input/index.d.ts.map +1 -1
- package/dist/types/components/form/Select/Select.base.d.ts +75 -0
- package/dist/types/components/form/Select/Select.base.d.ts.map +1 -0
- package/dist/types/components/form/Select/Select.d.ts.map +1 -1
- package/dist/types/components/form/Select/Select.helpers.d.ts +36 -0
- package/dist/types/components/form/Select/Select.helpers.d.ts.map +1 -0
- package/dist/types/components/form/Select/Select.metrics.d.ts +72 -0
- package/dist/types/components/form/Select/Select.metrics.d.ts.map +1 -0
- package/dist/types/components/form/Select/Select.types.d.ts +12 -49
- package/dist/types/components/form/Select/Select.types.d.ts.map +1 -1
- package/dist/types/components/form/Select/index.d.ts +1 -1
- package/dist/types/components/form/Select/index.d.ts.map +1 -1
- package/dist/types/components/form/Switch/Switch.base.d.ts +111 -0
- package/dist/types/components/form/Switch/Switch.base.d.ts.map +1 -0
- package/dist/types/components/form/Switch/Switch.d.ts.map +1 -1
- package/dist/types/components/form/Switch/Switch.helpers.d.ts +17 -0
- package/dist/types/components/form/Switch/Switch.helpers.d.ts.map +1 -0
- package/dist/types/components/form/Switch/Switch.metrics.d.ts +194 -0
- package/dist/types/components/form/Switch/Switch.metrics.d.ts.map +1 -0
- package/dist/types/components/form/Switch/Switch.parts.d.ts.map +1 -1
- package/dist/types/components/form/Switch/Switch.styles.d.ts +5 -3
- package/dist/types/components/form/Switch/Switch.styles.d.ts.map +1 -1
- package/dist/types/components/form/Switch/Switch.types.d.ts +9 -91
- package/dist/types/components/form/Switch/Switch.types.d.ts.map +1 -1
- package/dist/types/components/form/Switch/index.d.ts +1 -1
- package/dist/types/components/form/Switch/index.d.ts.map +1 -1
- package/dist/types/icons/paths.generated.d.ts +4 -0
- package/dist/types/icons/paths.generated.d.ts.map +1 -1
- package/dist/types/platform/aria.d.ts +59 -1
- package/dist/types/platform/aria.d.ts.map +1 -1
- package/dist/types/platform/test-id.d.ts +10 -0
- package/dist/types/platform/test-id.d.ts.map +1 -1
- package/dist/types/tokens/field-edge.core.d.ts +27 -0
- package/dist/types/tokens/field-edge.core.d.ts.map +1 -0
- package/dist/types/tokens/field-edge.d.ts +8 -9
- package/dist/types/tokens/field-edge.d.ts.map +1 -1
- package/dist/types-native/components/form/Checkbox/Checkbox.base.d.ts +36 -0
- package/dist/types-native/components/form/Checkbox/Checkbox.base.d.ts.map +1 -0
- package/dist/types-native/components/form/Checkbox/Checkbox.helpers.d.ts +13 -0
- package/dist/types-native/components/form/Checkbox/Checkbox.helpers.d.ts.map +1 -0
- package/dist/types-native/components/form/Checkbox/Checkbox.metrics.d.ts +92 -0
- package/dist/types-native/components/form/Checkbox/Checkbox.metrics.d.ts.map +1 -0
- package/dist/types-native/components/form/Checkbox/Checkbox.native.d.ts +21 -0
- package/dist/types-native/components/form/Checkbox/Checkbox.native.d.ts.map +1 -0
- package/dist/types-native/components/form/Checkbox/Checkbox.types.native.d.ts +27 -0
- package/dist/types-native/components/form/Checkbox/Checkbox.types.native.d.ts.map +1 -0
- package/dist/types-native/components/form/Checkbox/index.native.d.ts +3 -0
- package/dist/types-native/components/form/Checkbox/index.native.d.ts.map +1 -0
- package/dist/types-native/components/form/Input/Input.base.d.ts +62 -0
- package/dist/types-native/components/form/Input/Input.base.d.ts.map +1 -0
- package/dist/types-native/components/form/Input/Input.helpers.d.ts +11 -0
- package/dist/types-native/components/form/Input/Input.helpers.d.ts.map +1 -0
- package/dist/types-native/components/form/Input/Input.look.native.d.ts +61 -0
- package/dist/types-native/components/form/Input/Input.look.native.d.ts.map +1 -0
- package/dist/types-native/components/form/Input/Input.metrics.d.ts +186 -0
- package/dist/types-native/components/form/Input/Input.metrics.d.ts.map +1 -0
- package/dist/types-native/components/form/Input/Input.native.d.ts +22 -0
- package/dist/types-native/components/form/Input/Input.native.d.ts.map +1 -0
- package/dist/types-native/components/form/Input/Input.types.native.d.ts +20 -0
- package/dist/types-native/components/form/Input/Input.types.native.d.ts.map +1 -0
- package/dist/types-native/components/form/Input/index.native.d.ts +3 -0
- package/dist/types-native/components/form/Input/index.native.d.ts.map +1 -0
- package/dist/types-native/components/form/Select/Select.base.d.ts +75 -0
- package/dist/types-native/components/form/Select/Select.base.d.ts.map +1 -0
- package/dist/types-native/components/form/Select/Select.helpers.d.ts +36 -0
- package/dist/types-native/components/form/Select/Select.helpers.d.ts.map +1 -0
- package/dist/types-native/components/form/Select/Select.look.native.d.ts +26 -0
- package/dist/types-native/components/form/Select/Select.look.native.d.ts.map +1 -0
- package/dist/types-native/components/form/Select/Select.metrics.d.ts +72 -0
- package/dist/types-native/components/form/Select/Select.metrics.d.ts.map +1 -0
- package/dist/types-native/components/form/Select/Select.native.d.ts +21 -0
- package/dist/types-native/components/form/Select/Select.native.d.ts.map +1 -0
- package/dist/types-native/components/form/Select/Select.types.native.d.ts +29 -0
- package/dist/types-native/components/form/Select/Select.types.native.d.ts.map +1 -0
- package/dist/types-native/components/form/Select/index.native.d.ts +3 -0
- package/dist/types-native/components/form/Select/index.native.d.ts.map +1 -0
- package/dist/types-native/components/form/Switch/Switch.base.d.ts +111 -0
- package/dist/types-native/components/form/Switch/Switch.base.d.ts.map +1 -0
- package/dist/types-native/components/form/Switch/Switch.helpers.d.ts +17 -0
- package/dist/types-native/components/form/Switch/Switch.helpers.d.ts.map +1 -0
- package/dist/types-native/components/form/Switch/Switch.look.native.d.ts +43 -0
- package/dist/types-native/components/form/Switch/Switch.look.native.d.ts.map +1 -0
- package/dist/types-native/components/form/Switch/Switch.metrics.d.ts +194 -0
- package/dist/types-native/components/form/Switch/Switch.metrics.d.ts.map +1 -0
- package/dist/types-native/components/form/Switch/Switch.native.d.ts +20 -0
- package/dist/types-native/components/form/Switch/Switch.native.d.ts.map +1 -0
- package/dist/types-native/components/form/Switch/Switch.types.native.d.ts +27 -0
- package/dist/types-native/components/form/Switch/Switch.types.native.d.ts.map +1 -0
- package/dist/types-native/components/form/Switch/index.native.d.ts +3 -0
- package/dist/types-native/components/form/Switch/index.native.d.ts.map +1 -0
- package/dist/types-native/components/form/field-pulse.native.d.ts +18 -0
- package/dist/types-native/components/form/field-pulse.native.d.ts.map +1 -0
- package/dist/types-native/icons/paths.generated.d.ts +4 -0
- package/dist/types-native/icons/paths.generated.d.ts.map +1 -1
- package/dist/types-native/platform/aria.d.ts +59 -1
- package/dist/types-native/platform/aria.d.ts.map +1 -1
- package/dist/types-native/platform/test-id.d.ts +10 -0
- package/dist/types-native/platform/test-id.d.ts.map +1 -1
- package/dist/types-native/tokens/field-edge.core.d.ts +27 -0
- package/dist/types-native/tokens/field-edge.core.d.ts.map +1 -0
- package/dist/types-native/utils/withDefaults.d.ts +13 -0
- package/dist/types-native/utils/withDefaults.d.ts.map +1 -0
- package/dist/typography/Heading.js +2 -2
- package/dist/typography/Paragraph.js +2 -2
- package/dist/typography/Text.js +2 -2
- package/dist/user-avatar.js +7 -7
- package/dist/utility/InfiniteScroll.js +2 -2
- package/package.json +17 -1
- package/src/components/form/Checkbox/Checkbox.base.ts +36 -0
- package/src/components/form/Checkbox/Checkbox.helpers.ts +13 -13
- package/src/components/form/Checkbox/Checkbox.metrics.ts +73 -0
- package/src/components/form/Checkbox/Checkbox.native.tsx +246 -0
- package/src/components/form/Checkbox/Checkbox.tsx +34 -21
- package/src/components/form/Checkbox/Checkbox.types.native.ts +29 -0
- package/src/components/form/Checkbox/Checkbox.types.ts +12 -11
- package/src/components/form/Checkbox/NATIVE-NOTES.md +11 -0
- package/src/components/form/Checkbox/index.native.ts +8 -0
- package/src/components/form/Checkbox/index.ts +1 -1
- package/src/components/form/Input/Input.base.ts +84 -0
- package/src/components/form/Input/Input.helpers.ts +43 -0
- package/src/components/form/Input/Input.look.native.ts +246 -0
- package/src/components/form/Input/Input.metrics.ts +229 -0
- package/src/components/form/Input/Input.native.tsx +240 -0
- package/src/components/form/Input/Input.styles.ts +45 -51
- package/src/components/form/Input/Input.tsx +46 -42
- package/src/components/form/Input/Input.types.native.ts +29 -0
- package/src/components/form/Input/Input.types.ts +15 -17
- package/src/components/form/Input/NATIVE-NOTES.md +14 -0
- package/src/components/form/Input/index.native.ts +2 -0
- package/src/components/form/Input/index.ts +1 -1
- package/src/components/form/Select/NATIVE-NOTES.md +12 -0
- package/src/components/form/Select/Select.base.ts +78 -0
- package/src/components/form/Select/Select.helpers.ts +82 -0
- package/src/components/form/Select/Select.look.native.ts +99 -0
- package/src/components/form/Select/Select.metrics.ts +90 -0
- package/src/components/form/Select/Select.native.tsx +264 -0
- package/src/components/form/Select/Select.tsx +37 -25
- package/src/components/form/Select/Select.types.native.ts +30 -0
- package/src/components/form/Select/Select.types.ts +14 -51
- package/src/components/form/Select/index.native.ts +9 -0
- package/src/components/form/Select/index.ts +7 -1
- package/src/components/form/Switch/NATIVE-NOTES.md +12 -0
- package/src/components/form/Switch/Switch.base.ts +136 -0
- package/src/components/form/Switch/Switch.helpers.ts +61 -0
- package/src/components/form/Switch/Switch.look.native.ts +187 -0
- package/src/components/form/Switch/Switch.metrics.ts +191 -0
- package/src/components/form/Switch/Switch.native.tsx +360 -0
- package/src/components/form/Switch/Switch.parts.tsx +4 -4
- package/src/components/form/Switch/Switch.styles.ts +109 -147
- package/src/components/form/Switch/Switch.tsx +4 -2
- package/src/components/form/Switch/Switch.types.native.ts +34 -0
- package/src/components/form/Switch/Switch.types.ts +16 -117
- package/src/components/form/Switch/index.native.ts +8 -0
- package/src/components/form/Switch/index.ts +6 -1
- package/src/components/form/field-pulse.native.tsx +78 -0
- package/src/icons/glyphs.json +4 -0
- package/src/icons/paths.generated.ts +4 -0
- package/src/platform/aria.ts +72 -1
- package/src/platform/test-id.ts +13 -0
- package/src/tokens/field-edge.core.ts +87 -0
- package/src/tokens/field-edge.ts +10 -66
- package/dist/chunk-BJ3J6FTN.js.map +0 -1
- package/dist/chunk-FX5DY6VR.js.map +0 -1
- package/dist/chunk-JD364H3Y.js.map +0 -1
- package/dist/chunk-MLOWPVVW.js.map +0 -1
- package/dist/chunk-OQXOYHIV.js.map +0 -1
- package/dist/chunk-Q5EQC7NL.js.map +0 -1
- package/dist/chunk-QLWBQQW7.js.map +0 -1
- package/dist/chunk-RMSH2I3O.js.map +0 -1
- package/dist/chunk-TBWEIQUR.js +0 -263
- package/dist/chunk-TBWEIQUR.js.map +0 -1
- package/dist/chunk-VMNSGE2G.js.map +0 -1
- package/dist/chunk-VSLUFBMT.js.map +0 -1
- package/dist/native/chunks/chunk-4NK5ZQZ3.js +0 -10
- package/dist/native/chunks/chunk-4NK5ZQZ3.js.map +0 -1
- package/dist/native/chunks/chunk-M4DTJDWU.js.map +0 -1
- package/dist/native/chunks/chunk-Q52IDAF2.js.map +0 -1
- /package/dist/{chunk-2PCOC3PT.js.map → chunk-26Z7QWID.js.map} +0 -0
- /package/dist/{chunk-IJIT5HQP.js.map → chunk-2QFTAGDH.js.map} +0 -0
- /package/dist/{chunk-ENNW5SKT.js.map → chunk-2QLVUVVR.js.map} +0 -0
- /package/dist/{chunk-W3FAKT3D.js.map → chunk-2SWQ6HIK.js.map} +0 -0
- /package/dist/{chunk-7P2HZLEG.js.map → chunk-3UOHKHOT.js.map} +0 -0
- /package/dist/{chunk-URWGRPL7.js.map → chunk-3W7IEWEL.js.map} +0 -0
- /package/dist/{chunk-Z7JNCB5Q.js.map → chunk-426FTCMF.js.map} +0 -0
- /package/dist/{chunk-46UPILLK.js.map → chunk-4ETQRBZC.js.map} +0 -0
- /package/dist/{chunk-NQC6H7GY.js.map → chunk-4HYXEMBP.js.map} +0 -0
- /package/dist/{chunk-43NEBUV3.js.map → chunk-4K7FDVAB.js.map} +0 -0
- /package/dist/{chunk-LMJBINWN.js.map → chunk-4MLDWACO.js.map} +0 -0
- /package/dist/{chunk-GGE7Y53F.js.map → chunk-4TXIZ5WI.js.map} +0 -0
- /package/dist/{chunk-J6UFAMIC.js.map → chunk-5RQ7N63M.js.map} +0 -0
- /package/dist/{chunk-AVGTTWTE.js.map → chunk-65DLYC4S.js.map} +0 -0
- /package/dist/{chunk-B2A4DG77.js.map → chunk-6RGWDKUL.js.map} +0 -0
- /package/dist/{chunk-DCEMUZJQ.js.map → chunk-6WIDZGXE.js.map} +0 -0
- /package/dist/{chunk-R7MX5KPJ.js.map → chunk-6YLAVHV4.js.map} +0 -0
- /package/dist/{chunk-E27Y7FF2.js.map → chunk-6Z4H2Y77.js.map} +0 -0
- /package/dist/{chunk-PNYXXLPU.js.map → chunk-736HP6BL.js.map} +0 -0
- /package/dist/{chunk-C52BELLW.js.map → chunk-77F36LQQ.js.map} +0 -0
- /package/dist/{chunk-RXSGHPCR.js.map → chunk-7FOOLP5H.js.map} +0 -0
- /package/dist/{chunk-74OZ5KVR.js.map → chunk-7KTU6YMQ.js.map} +0 -0
- /package/dist/{chunk-X5D3PTWI.js.map → chunk-7MAOQIWA.js.map} +0 -0
- /package/dist/{chunk-5ZF3VASA.js.map → chunk-7ZH7ZB33.js.map} +0 -0
- /package/dist/{chunk-PQECNGDE.js.map → chunk-AGYGNNOM.js.map} +0 -0
- /package/dist/{chunk-PU3AAKRR.js.map → chunk-AJ6XEO4E.js.map} +0 -0
- /package/dist/{chunk-WX7VWW3W.js.map → chunk-B3BK2SNS.js.map} +0 -0
- /package/dist/{chunk-VJK5FBNK.js.map → chunk-B5PYBEXO.js.map} +0 -0
- /package/dist/{chunk-47UD6DZ4.js.map → chunk-BDVNAU2C.js.map} +0 -0
- /package/dist/{chunk-FGLV6BXQ.js.map → chunk-BEGWE5O4.js.map} +0 -0
- /package/dist/{chunk-6IUTT6BK.js.map → chunk-BEH4DN63.js.map} +0 -0
- /package/dist/{chunk-HKV4MQ2W.js.map → chunk-BLBOYCOV.js.map} +0 -0
- /package/dist/{chunk-24BUCMQA.js.map → chunk-BNNSO4MC.js.map} +0 -0
- /package/dist/{chunk-CZJLWCEG.js.map → chunk-BPYPUEM5.js.map} +0 -0
- /package/dist/{chunk-NHSMLVNC.js.map → chunk-BQQONDW5.js.map} +0 -0
- /package/dist/{chunk-DQHC5P64.js.map → chunk-BRSF5NRT.js.map} +0 -0
- /package/dist/{chunk-M7OHXNLF.js.map → chunk-CXVMD6FE.js.map} +0 -0
- /package/dist/{chunk-LYSSO6WC.js.map → chunk-CZPU5TW3.js.map} +0 -0
- /package/dist/{chunk-DOADQW7I.js.map → chunk-D4T646G4.js.map} +0 -0
- /package/dist/{chunk-2W4CIWTW.js.map → chunk-DBYFC6CF.js.map} +0 -0
- /package/dist/{chunk-76GZ55IC.js.map → chunk-DF2FFYZ7.js.map} +0 -0
- /package/dist/{chunk-BILE3A7F.js.map → chunk-DH75UNF3.js.map} +0 -0
- /package/dist/{chunk-6D5WEZ2L.js.map → chunk-FB36IHCE.js.map} +0 -0
- /package/dist/{chunk-OI3HOI74.js.map → chunk-FGUESLDX.js.map} +0 -0
- /package/dist/{chunk-PC5FFEIY.js.map → chunk-FINCVAAR.js.map} +0 -0
- /package/dist/{chunk-YK2PETUP.js.map → chunk-FRQ4HNGF.js.map} +0 -0
- /package/dist/{chunk-WO52KYSU.js.map → chunk-G2IPK2XE.js.map} +0 -0
- /package/dist/{chunk-E4FGKZID.js.map → chunk-GBNOYRLP.js.map} +0 -0
- /package/dist/{chunk-UNF65XZW.js.map → chunk-GBRKP5GZ.js.map} +0 -0
- /package/dist/{chunk-VLHGBFR6.js.map → chunk-GCXYCDOA.js.map} +0 -0
- /package/dist/{chunk-EX3PSZLV.js.map → chunk-GDEXYUPF.js.map} +0 -0
- /package/dist/{chunk-4N4ENTF7.js.map → chunk-GO4MVQGC.js.map} +0 -0
- /package/dist/{chunk-HDNK7BAX.js.map → chunk-GT7C6TSM.js.map} +0 -0
- /package/dist/{chunk-HBAPVB7T.js.map → chunk-HKKSZ7HG.js.map} +0 -0
- /package/dist/{chunk-3AOOI2NR.js.map → chunk-HR7YTBR7.js.map} +0 -0
- /package/dist/{chunk-AEGX66N7.js.map → chunk-I3MDKPGG.js.map} +0 -0
- /package/dist/{chunk-7BYFC2MR.js.map → chunk-I7HYGIEJ.js.map} +0 -0
- /package/dist/{chunk-D7FJ2GAD.js.map → chunk-IFNK5TPI.js.map} +0 -0
- /package/dist/{chunk-PODGTNXS.js.map → chunk-IH4RSRQA.js.map} +0 -0
- /package/dist/{chunk-UF27D35R.js.map → chunk-IIROZKW5.js.map} +0 -0
- /package/dist/{chunk-PUBPZOQJ.js.map → chunk-IPE5FFFD.js.map} +0 -0
- /package/dist/{chunk-37YPZHAG.js.map → chunk-JDMYD6QC.js.map} +0 -0
- /package/dist/{chunk-HSAH5QUQ.js.map → chunk-JIINGMEB.js.map} +0 -0
- /package/dist/{chunk-NRUYYGDZ.js.map → chunk-JXAYT6LX.js.map} +0 -0
- /package/dist/{chunk-ZBNTFWTG.js.map → chunk-KIHQE5YA.js.map} +0 -0
- /package/dist/{chunk-DVUPIVI2.js.map → chunk-KT6HWAEN.js.map} +0 -0
- /package/dist/{chunk-MY5VNNSP.js.map → chunk-MCRIT46W.js.map} +0 -0
- /package/dist/{chunk-6XPNJLXE.js.map → chunk-NARIG5FL.js.map} +0 -0
- /package/dist/{chunk-MBYO2F4Y.js.map → chunk-NUE774AN.js.map} +0 -0
- /package/dist/{chunk-ZEBJT5JZ.js.map → chunk-OCXCH2ZW.js.map} +0 -0
- /package/dist/{chunk-7TZ6OC5T.js.map → chunk-OH3YGJT5.js.map} +0 -0
- /package/dist/{chunk-SM3NRN7L.js.map → chunk-ON2CMKTI.js.map} +0 -0
- /package/dist/{chunk-VCTKJHXD.js.map → chunk-OOGEYCJH.js.map} +0 -0
- /package/dist/{chunk-J54WH74M.js.map → chunk-P6IPJYCS.js.map} +0 -0
- /package/dist/{chunk-23FCBIUN.js.map → chunk-P7FQUGED.js.map} +0 -0
- /package/dist/{chunk-THBT56JE.js.map → chunk-PANMJFDS.js.map} +0 -0
- /package/dist/{chunk-LZRURORY.js.map → chunk-PF5HDFYY.js.map} +0 -0
- /package/dist/{chunk-YVW7VPK4.js.map → chunk-PFLKPNBU.js.map} +0 -0
- /package/dist/{chunk-7EESF76V.js.map → chunk-PWXL3QQ6.js.map} +0 -0
- /package/dist/{chunk-7DNQHMDO.js.map → chunk-PXH24VIP.js.map} +0 -0
- /package/dist/{chunk-HBZIN6IQ.js.map → chunk-PZEC5CQA.js.map} +0 -0
- /package/dist/{chunk-LAHDFBDE.js.map → chunk-QFHH2NU5.js.map} +0 -0
- /package/dist/{chunk-GBB6XQ56.js.map → chunk-QGBMCB76.js.map} +0 -0
- /package/dist/{chunk-SOCKK67R.js.map → chunk-QRX5BYUQ.js.map} +0 -0
- /package/dist/{chunk-QZWKC3AP.js.map → chunk-QS7ZGRNS.js.map} +0 -0
- /package/dist/{chunk-IH4CX43Q.js.map → chunk-QZDBWXZG.js.map} +0 -0
- /package/dist/{chunk-PHCSPHDH.js.map → chunk-R6RVBYTU.js.map} +0 -0
- /package/dist/{chunk-KZSKI2R3.js.map → chunk-RPQ3W2C6.js.map} +0 -0
- /package/dist/{chunk-HEG7JIBM.js.map → chunk-RPWEXIAW.js.map} +0 -0
- /package/dist/{chunk-JB67KPGM.js.map → chunk-RRO2EOJB.js.map} +0 -0
- /package/dist/{chunk-BLT5ZBVL.js.map → chunk-RRX6ZTNX.js.map} +0 -0
- /package/dist/{chunk-7RZ4WOQW.js.map → chunk-RRZBATXK.js.map} +0 -0
- /package/dist/{chunk-7JWXLDRH.js.map → chunk-SAHQLXNN.js.map} +0 -0
- /package/dist/{chunk-LUMF63BM.js.map → chunk-SFAP5EH5.js.map} +0 -0
- /package/dist/{chunk-EGRFMPGD.js.map → chunk-SHDIZSN5.js.map} +0 -0
- /package/dist/{chunk-GJQYM3PM.js.map → chunk-SHQWIDD5.js.map} +0 -0
- /package/dist/{chunk-FCOEJCUP.js.map → chunk-TFO6GBW7.js.map} +0 -0
- /package/dist/{chunk-2ZDTGI5V.js.map → chunk-THZ2NAA4.js.map} +0 -0
- /package/dist/{chunk-VJFH2AXT.js.map → chunk-TP4N3X2Q.js.map} +0 -0
- /package/dist/{chunk-B7BZAIHL.js.map → chunk-TPIBJP4S.js.map} +0 -0
- /package/dist/{chunk-Q4NOI2CR.js.map → chunk-TVO5STZB.js.map} +0 -0
- /package/dist/{chunk-JB7JE4QZ.js.map → chunk-TZ4SFX3M.js.map} +0 -0
- /package/dist/{chunk-HEK4LQT6.js.map → chunk-UB76PBDF.js.map} +0 -0
- /package/dist/{chunk-NFAKRI4S.js.map → chunk-UEIVXFUC.js.map} +0 -0
- /package/dist/{chunk-DX527XPL.js.map → chunk-UOPQOBQZ.js.map} +0 -0
- /package/dist/{chunk-X24P3ZYW.js.map → chunk-V5P5Q6HM.js.map} +0 -0
- /package/dist/{chunk-7DBFEZRC.js.map → chunk-VIK3HAUQ.js.map} +0 -0
- /package/dist/{chunk-74EZ565M.js.map → chunk-VPHOSIPB.js.map} +0 -0
- /package/dist/{chunk-SX3V2DLV.js.map → chunk-VWBWKLXX.js.map} +0 -0
- /package/dist/{chunk-VEFDL77X.js.map → chunk-VWGR5XUP.js.map} +0 -0
- /package/dist/{chunk-SEH7KOVG.js.map → chunk-VXTYVJDK.js.map} +0 -0
- /package/dist/{chunk-QYNCPS5W.js.map → chunk-WBKWIFXA.js.map} +0 -0
- /package/dist/{chunk-YFHIESMD.js.map → chunk-WPZT2JD4.js.map} +0 -0
- /package/dist/{chunk-GSFNH4C5.js.map → chunk-WROCSDVL.js.map} +0 -0
- /package/dist/{chunk-QZBUGUOY.js.map → chunk-XEE7PLDR.js.map} +0 -0
- /package/dist/{chunk-Z4GWXTZV.js.map → chunk-XFU2S6XT.js.map} +0 -0
- /package/dist/{chunk-RQDN4BN5.js.map → chunk-XLJJ2ZAP.js.map} +0 -0
- /package/dist/{chunk-ACDYA5WC.js.map → chunk-XZTOIEKI.js.map} +0 -0
- /package/dist/{chunk-LKVIZNUM.js.map → chunk-Y46RBFBV.js.map} +0 -0
- /package/dist/{chunk-WBVHRLIS.js.map → chunk-YCCKY5VW.js.map} +0 -0
- /package/dist/{chunk-SKZHOWTS.js.map → chunk-YDI6IJ6F.js.map} +0 -0
- /package/dist/{chunk-V3SBJ3PB.js.map → chunk-Z5ABJLTM.js.map} +0 -0
- /package/dist/{chunk-KQ74QU55.js.map → chunk-Z6UEOSL7.js.map} +0 -0
- /package/dist/{chunk-G5ZVD5IJ.js.map → chunk-ZDWU52DJ.js.map} +0 -0
- /package/dist/{chunk-2EKALM6P.js.map → chunk-ZFPJBKVZ.js.map} +0 -0
- /package/dist/{chunk-FP4R47TM.js.map → chunk-ZGHIHEND.js.map} +0 -0
- /package/dist/{chunk-F2DOTCF3.js.map → chunk-ZKFYBC6G.js.map} +0 -0
- /package/dist/{chunk-4MGFUPQT.js.map → chunk-ZOUWHGV3.js.map} +0 -0
- /package/dist/{chunk-4WK2RTVY.js.map → chunk-ZXLIWOXC.js.map} +0 -0
- /package/dist/{chunk-UMDXGIRZ.js.map → chunk-ZZOOSKSV.js.map} +0 -0
- /package/dist/native/chunks/{chunk-EKKNUEA6.js.map → chunk-OGWPPQL4.js.map} +0 -0
- /package/dist/native/chunks/{chunk-UKCCYP52.js.map → chunk-RJVM5YDE.js.map} +0 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Select on React Native
|
|
2
|
+
|
|
3
|
+
Known rendering gaps, one bullet each; `pnpm native:ledger` reads them.
|
|
4
|
+
|
|
5
|
+
- The option list is an absolutely positioned panel under the field, not a portal over the screen: React Native's `Modal` traps focus and covers the viewport, which is right for a dialog and wrong for a dropdown. So the list is clipped by any ancestor that hides its overflow, it cannot escape a `ScrollView`, and there is no backdrop — the list closes on a pick, on Escape, or when the field is pressed again, never by a tap elsewhere.
|
|
6
|
+
- Arrow keys open the list and Escape closes it, through react-native-web's DOM key events; `Enter` toggles it, because react-native-web's `Pressable` already answers `Enter` as a press. None of the three exists on a device, where the list is a touch surface — so there is no highlighted option to walk.
|
|
7
|
+
- The label sits above the field rather than floating into a notch in its border, and the arrow is laid out in flow rather than absolutely at `right: 7`; the 1px difference that costs is taken out of the gap before the glyph, so the value still stops 32px from the edge. Both follow from React Native having no notched outline and no `position: absolute` inside a text run.
|
|
8
|
+
- `glass` paints its 0.1 paper wash without the 20px backdrop blur (React Native has no backdrop filter), and `gradient` paints the first stop of its 135° fill flat inside a 2px ring of the gradient's first hue — React Native core has no gradient fill and no masked pseudo-element border.
|
|
9
|
+
- Hover has no touch equivalent: the web's hover border, its brighter glass wash and the `action.hover` wash under a menu row are not drawn. `glow` is a shadow on iOS and an elevation on Android, so its halo is not symmetrical there, and it does not brighten on focus the way the web's does.
|
|
10
|
+
- `defaultValue` selects an option here and does nothing on the web, where `Select.tsx` passes `value={value ?? ''}` and MUI's controlled value wins over it. Fixing that is a web change.
|
|
11
|
+
- The list is rendered in full inside a `ScrollView` capped at the window height less 96px, where MUI's `Menu` measures the anchor and flips or shifts to stay on screen; a list opened near the bottom of a device screen runs off it.
|
|
12
|
+
- The display slot, the option labels, the label and the helper text are set in MUI's own numbers (`body1` at 16px on a 23px line, the 0.75 shrunk label, `caption` at 12px); a host that re-themes MUI's typography variants moves the web only.
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { SizeValue } from '../../../tokens/vocabulary';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* THE CONTRACT BOTH RENDERERS HONOUR — and nothing else.
|
|
5
|
+
*
|
|
6
|
+
* No MUI and no react-native here: this file is in BOTH declaration outputs,
|
|
7
|
+
* and a native consumer has no `@mui/material` to resolve a type import
|
|
8
|
+
* against. See `Button.base.ts`.
|
|
9
|
+
*/
|
|
10
|
+
export type SelectVariant = 'default' | 'glass' | 'gradient';
|
|
11
|
+
|
|
12
|
+
/** What a value can be. The DOM stringifies either, so the two are compared as strings. */
|
|
13
|
+
export type SelectValue = string | number;
|
|
14
|
+
|
|
15
|
+
export interface SelectOption {
|
|
16
|
+
value: SelectValue;
|
|
17
|
+
label: string;
|
|
18
|
+
disabled?: boolean;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* The contract both renderers honour.
|
|
23
|
+
*
|
|
24
|
+
* `value`, `defaultValue` and `onChange` are NOT here: MUI types the value as
|
|
25
|
+
* `unknown` and the change as its own `SelectChangeEvent`, while the native
|
|
26
|
+
* side takes a `SelectValue` and synthesises the `{ target: { value } }` shape
|
|
27
|
+
* the web handlers already read.
|
|
28
|
+
*/
|
|
29
|
+
export interface SelectBaseProps {
|
|
30
|
+
/**
|
|
31
|
+
* Visual variant of the select component
|
|
32
|
+
* @default 'default'
|
|
33
|
+
*/
|
|
34
|
+
variant?: SelectVariant;
|
|
35
|
+
/**
|
|
36
|
+
* Array of options to display in the select
|
|
37
|
+
*/
|
|
38
|
+
options: SelectOption[];
|
|
39
|
+
/**
|
|
40
|
+
* Label for the select field
|
|
41
|
+
*/
|
|
42
|
+
label?: string;
|
|
43
|
+
/**
|
|
44
|
+
* Helper text to display below the select
|
|
45
|
+
*/
|
|
46
|
+
helperText?: string;
|
|
47
|
+
/**
|
|
48
|
+
* Whether the select should take full width
|
|
49
|
+
* @default true
|
|
50
|
+
*/
|
|
51
|
+
fullWidth?: boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Size of the select component
|
|
54
|
+
* @default 'medium'
|
|
55
|
+
*/
|
|
56
|
+
size?: SizeValue;
|
|
57
|
+
/**
|
|
58
|
+
* Placeholder text when no option is selected
|
|
59
|
+
*/
|
|
60
|
+
placeholder?: string;
|
|
61
|
+
/**
|
|
62
|
+
* Paints the field, the label and the helper text in the danger hue
|
|
63
|
+
*/
|
|
64
|
+
error?: boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Whether to show a glow effect
|
|
67
|
+
* @default false
|
|
68
|
+
*/
|
|
69
|
+
glow?: boolean;
|
|
70
|
+
/**
|
|
71
|
+
* Whether to show a pulse animation
|
|
72
|
+
* @default false
|
|
73
|
+
*/
|
|
74
|
+
pulse?: boolean;
|
|
75
|
+
disabled?: boolean;
|
|
76
|
+
testID?: string;
|
|
77
|
+
dataTestId?: string;
|
|
78
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import type { SelectBaseProps, SelectOption, SelectValue } from './Select.base';
|
|
2
|
+
import { withDefaults } from '../../../utils/withDefaults';
|
|
3
|
+
|
|
4
|
+
type SelectDefaultedKeys = 'variant' | 'size' | 'fullWidth' | 'error' | 'glow' | 'pulse' | 'disabled';
|
|
5
|
+
|
|
6
|
+
export type ResolvedSelectProps<P extends SelectBaseProps> = P &
|
|
7
|
+
Required<Pick<SelectBaseProps, SelectDefaultedKeys>>;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* `Select.tsx` leaves `variant`, `size`, `glow` and `pulse` undefined on
|
|
11
|
+
* purpose — undefined resolves to the default variant, MUI's medium and no
|
|
12
|
+
* effects, which keeps its render function under the complexity budget. The
|
|
13
|
+
* native renderer has to name them, so the same resolution happens here.
|
|
14
|
+
*/
|
|
15
|
+
const SELECT_DEFAULTS: Required<Pick<SelectBaseProps, SelectDefaultedKeys>> = {
|
|
16
|
+
variant: 'default',
|
|
17
|
+
size: 'md',
|
|
18
|
+
fullWidth: true,
|
|
19
|
+
error: false,
|
|
20
|
+
glow: false,
|
|
21
|
+
pulse: false,
|
|
22
|
+
disabled: false,
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export const resolveSelectProps = <P extends SelectBaseProps>(props: P): ResolvedSelectProps<P> =>
|
|
26
|
+
withDefaults(props, SELECT_DEFAULTS as Partial<P>) as ResolvedSelectProps<P>;
|
|
27
|
+
|
|
28
|
+
/** One row of the list: an option, or the disabled placeholder above them. */
|
|
29
|
+
export interface SelectItem {
|
|
30
|
+
value: SelectValue;
|
|
31
|
+
label: string;
|
|
32
|
+
disabled: boolean;
|
|
33
|
+
/** The placeholder is not an option: it carries no test id and cannot be chosen. */
|
|
34
|
+
placeholder: boolean;
|
|
35
|
+
option?: SelectOption;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* The list MUI renders: the placeholder first when there is one, then the
|
|
40
|
+
* options, in the order `renderMenuItems` builds them.
|
|
41
|
+
*/
|
|
42
|
+
export function selectItems(options: SelectOption[], placeholder?: string): SelectItem[] {
|
|
43
|
+
const items: SelectItem[] = options.map((option) => ({
|
|
44
|
+
value: option.value,
|
|
45
|
+
label: option.label,
|
|
46
|
+
disabled: option.disabled === true,
|
|
47
|
+
placeholder: false,
|
|
48
|
+
option,
|
|
49
|
+
}));
|
|
50
|
+
if (placeholder === undefined || placeholder === '') return items;
|
|
51
|
+
return [{ value: '', label: placeholder, disabled: true, placeholder: true }, ...items];
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* What the display slot shows.
|
|
56
|
+
*
|
|
57
|
+
* The LAST match wins, which is MUI's own answer: `SelectInput` walks its
|
|
58
|
+
* children and overwrites the display for every child whose value matches, so
|
|
59
|
+
* a list carrying both an empty placeholder and a real empty-valued option
|
|
60
|
+
* shows the option. Values are compared as strings because the DOM stringifies
|
|
61
|
+
* them anyway (MUI's `areEqualValues`).
|
|
62
|
+
*/
|
|
63
|
+
export function displayLabel(items: SelectItem[], value: SelectValue): string {
|
|
64
|
+
let label = '';
|
|
65
|
+
for (const item of items) {
|
|
66
|
+
if (String(item.value) === String(value)) label = item.label;
|
|
67
|
+
}
|
|
68
|
+
return label;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** The three ids the web puts on the control, spelled exactly as it spells them. */
|
|
72
|
+
export function selectTestIds(id: string | undefined): {
|
|
73
|
+
root: string | undefined;
|
|
74
|
+
trigger: string;
|
|
75
|
+
option: (value: SelectValue) => string;
|
|
76
|
+
} {
|
|
77
|
+
return {
|
|
78
|
+
root: id,
|
|
79
|
+
trigger: id ? `${id}-select` : 'select',
|
|
80
|
+
option: (value) => (id ? `${id}-option-${value}` : `option-${value}`),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import type { TextStyle, ViewStyle } from 'react-native';
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
MUI_MENU_SHADOW,
|
|
5
|
+
SELECT_DISPLAY_MIN_HEIGHT,
|
|
6
|
+
SELECT_ICON,
|
|
7
|
+
SELECT_ICON_GAP,
|
|
8
|
+
SELECT_MENU,
|
|
9
|
+
inputVariantFor,
|
|
10
|
+
selectedWashAlpha,
|
|
11
|
+
} from './Select.metrics';
|
|
12
|
+
import type { SelectVariant } from './Select.base';
|
|
13
|
+
import { INPUT_FONT_SIZE, INPUT_LINE_HEIGHT } from '../Input/Input.metrics';
|
|
14
|
+
import { fieldLook, horizontalBorderInset, type FieldState } from '../Input/Input.look.native';
|
|
15
|
+
import { alpha } from '../../../tokens/color';
|
|
16
|
+
import type { UiTheme } from '../../../tokens/theme';
|
|
17
|
+
import type { SizeValue } from '../../../tokens/vocabulary';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* WHAT A NATIVE `Select` PAINTS.
|
|
21
|
+
*
|
|
22
|
+
* The box is the `Input`'s box: a select on the web is an `OutlinedInput` with
|
|
23
|
+
* a display slot where the value would be typed, so `fieldLook` decides the
|
|
24
|
+
* fill, the edges and the inset, and this file only says what a select adds —
|
|
25
|
+
* room for the arrow, and the list under it.
|
|
26
|
+
*/
|
|
27
|
+
export interface SelectLook {
|
|
28
|
+
box: ViewStyle;
|
|
29
|
+
display: TextStyle;
|
|
30
|
+
iconGap: number;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function selectLook(
|
|
34
|
+
theme: UiTheme,
|
|
35
|
+
variant: SelectVariant,
|
|
36
|
+
size: SizeValue,
|
|
37
|
+
state: FieldState,
|
|
38
|
+
): SelectLook {
|
|
39
|
+
const inputVariant = inputVariantFor(variant);
|
|
40
|
+
const look = fieldLook(theme, inputVariant, size, state);
|
|
41
|
+
const inset = horizontalBorderInset(inputVariant, state.focused);
|
|
42
|
+
|
|
43
|
+
return {
|
|
44
|
+
box: {
|
|
45
|
+
...look.box,
|
|
46
|
+
// MUI's arrow is absolute at `right: 7`; laid out in flow it takes the
|
|
47
|
+
// row's right inset instead, and {@link SELECT_ICON_GAP} makes up the
|
|
48
|
+
// difference so the value still stops 32px from the edge.
|
|
49
|
+
paddingRight: SELECT_ICON.right - inset,
|
|
50
|
+
},
|
|
51
|
+
display: {
|
|
52
|
+
...look.value,
|
|
53
|
+
minHeight: SELECT_DISPLAY_MIN_HEIGHT,
|
|
54
|
+
fontSize: INPUT_FONT_SIZE,
|
|
55
|
+
lineHeight: INPUT_LINE_HEIGHT,
|
|
56
|
+
},
|
|
57
|
+
iconGap: SELECT_ICON_GAP,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** The option list's paper: MUI's `Menu`, at elevation 8 on the theme's radius. */
|
|
62
|
+
export function menuStyle(theme: UiTheme, maxHeight: number): ViewStyle {
|
|
63
|
+
return {
|
|
64
|
+
position: 'absolute',
|
|
65
|
+
top: '100%',
|
|
66
|
+
left: 0,
|
|
67
|
+
right: 0,
|
|
68
|
+
zIndex: theme.zIndex.modal,
|
|
69
|
+
maxHeight,
|
|
70
|
+
paddingVertical: SELECT_MENU.listPaddingVertical,
|
|
71
|
+
backgroundColor: theme.palette.background.paper,
|
|
72
|
+
borderRadius: theme.radius.md,
|
|
73
|
+
boxShadow: MUI_MENU_SHADOW,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** One `MenuItem`: 48px tall at least, 6px by 16px of padding, washed when selected. */
|
|
78
|
+
export function optionStyle(theme: UiTheme, selected: boolean, disabled: boolean): ViewStyle {
|
|
79
|
+
return {
|
|
80
|
+
minHeight: SELECT_MENU.itemMinHeight,
|
|
81
|
+
justifyContent: 'center',
|
|
82
|
+
paddingVertical: SELECT_MENU.itemPaddingVertical,
|
|
83
|
+
paddingHorizontal: SELECT_MENU.itemPaddingHorizontal,
|
|
84
|
+
backgroundColor: selected
|
|
85
|
+
? alpha(theme.palette.primary.main, selectedWashAlpha(theme))
|
|
86
|
+
: 'transparent',
|
|
87
|
+
opacity: disabled ? SELECT_MENU.disabledOpacity : 1,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** A `MenuItem`'s label: MUI's `body1`, the same type the display slot sets. */
|
|
92
|
+
export function optionTextStyle(theme: UiTheme): TextStyle {
|
|
93
|
+
return {
|
|
94
|
+
color: theme.palette.text.primary,
|
|
95
|
+
fontFamily: theme.typography.fontFamily,
|
|
96
|
+
fontSize: INPUT_FONT_SIZE,
|
|
97
|
+
lineHeight: INPUT_LINE_HEIGHT,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import type { SelectVariant } from './Select.base';
|
|
2
|
+
import type { InputVariant } from '../Input/Input.base';
|
|
3
|
+
import { ICON_SIZES } from '../../../icons/Icon.types';
|
|
4
|
+
import type { UiTheme } from '../../../tokens/theme';
|
|
5
|
+
import type { SizeValue } from '../../../tokens/vocabulary';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* THE NUMBERS BOTH `Select` RENDERERS DRAW WITH.
|
|
9
|
+
*
|
|
10
|
+
* A `Select` on the web IS an `OutlinedInput` with a display slot and an arrow
|
|
11
|
+
* where the value would be typed, so the box's own numbers — the padding, the
|
|
12
|
+
* border, the radius, the field edge — are `Input.metrics.ts`'s, read through
|
|
13
|
+
* {@link inputVariantFor} rather than restated. What is here is what a select
|
|
14
|
+
* has and a text field does not: the arrow, the option list, and the two
|
|
15
|
+
* heights MUI's `FormControl` offers.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
/** Our three variants onto the `Input` variant that draws the same box. */
|
|
19
|
+
export const inputVariantFor = (variant: SelectVariant): InputVariant =>
|
|
20
|
+
variant === 'default' ? 'outlined' : variant;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* The house scale as a `FormControl` size.
|
|
24
|
+
*
|
|
25
|
+
* Not `muiSize`: that collapses five onto MUI's three, and a FormControl takes
|
|
26
|
+
* only two — `sm` draws small and EVERY other step, `xs` included, draws
|
|
27
|
+
* medium. Restated from `Select.tsx`'s `formControlSize` so the native side
|
|
28
|
+
* reads the same lossy map rather than inventing a kinder one.
|
|
29
|
+
*/
|
|
30
|
+
export const selectInputSize = (size: SizeValue | undefined): 'sm' | 'md' =>
|
|
31
|
+
size === 'sm' ? 'sm' : 'md';
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* The arrow: MUI's `ArrowDropDown` at `SvgIcon`'s medium size, 7px from the
|
|
35
|
+
* right edge, turned over while the list is open. The display slot reserves
|
|
36
|
+
* 32px for it, so the flow-laid glyph takes the difference as a margin.
|
|
37
|
+
*/
|
|
38
|
+
export const SELECT_ICON = {
|
|
39
|
+
size: ICON_SIZES.md,
|
|
40
|
+
right: 7,
|
|
41
|
+
displayPaddingRight: 32,
|
|
42
|
+
openRotateDeg: 180,
|
|
43
|
+
} as const;
|
|
44
|
+
|
|
45
|
+
/** What the glyph leaves between itself and the value: 32 - 24 - 7. */
|
|
46
|
+
export const SELECT_ICON_GAP =
|
|
47
|
+
SELECT_ICON.displayPaddingRight - SELECT_ICON.size - SELECT_ICON.right;
|
|
48
|
+
|
|
49
|
+
/** `.MuiSelect-select`'s floor, MUI's `1.4375em` at the 16px body size. */
|
|
50
|
+
export const SELECT_DISPLAY_MIN_HEIGHT = 23;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* The option list: MUI's `Menu` over a `MenuList` of `MenuItem`s.
|
|
54
|
+
*
|
|
55
|
+
* `selectedAlpha` is `palette.action.selectedOpacity`, which MUI doubles in
|
|
56
|
+
* dark mode; `disabledOpacity` is `palette.action.disabledOpacity`. Neither is
|
|
57
|
+
* on `UiTheme`, whose `action` carries colours rather than opacities.
|
|
58
|
+
*/
|
|
59
|
+
export const SELECT_MENU = {
|
|
60
|
+
itemMinHeight: 48,
|
|
61
|
+
itemPaddingVertical: 6,
|
|
62
|
+
itemPaddingHorizontal: 16,
|
|
63
|
+
listPaddingVertical: 8,
|
|
64
|
+
selectedAlpha: { light: 0.08, dark: 0.16 },
|
|
65
|
+
disabledOpacity: 0.38,
|
|
66
|
+
/** MUI's `Menu` paper is `calc(100% - 96px)` tall at most. */
|
|
67
|
+
maxHeightInset: 96,
|
|
68
|
+
} as const;
|
|
69
|
+
|
|
70
|
+
/** MUI's `theme.shadows[8]`, the elevation a `Menu` paper rests at. */
|
|
71
|
+
export const MUI_MENU_SHADOW =
|
|
72
|
+
'0px 5px 5px -3px rgba(0,0,0,0.2),0px 8px 10px 1px rgba(0,0,0,0.14),0px 3px 14px 2px rgba(0,0,0,0.12)';
|
|
73
|
+
|
|
74
|
+
/** The wash behind the option the value currently names. */
|
|
75
|
+
export const selectedWashAlpha = (theme: UiTheme): number =>
|
|
76
|
+
theme.mode === 'dark' ? SELECT_MENU.selectedAlpha.dark : SELECT_MENU.selectedAlpha.light;
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* The box a select draws IS the input's box, so these are the input's tables
|
|
80
|
+
* under this component's names — the border widths, the glass and gradient
|
|
81
|
+
* alphas, the halo and the pulse. Restating them here is how the two controls
|
|
82
|
+
* would come to disagree about what an outlined field looks like.
|
|
83
|
+
*/
|
|
84
|
+
export {
|
|
85
|
+
INPUT_BORDER as SELECT_BORDER,
|
|
86
|
+
INPUT_GLASS as SELECT_GLASS,
|
|
87
|
+
INPUT_GLOW as SELECT_GLOW,
|
|
88
|
+
INPUT_GRADIENT as SELECT_GRADIENT,
|
|
89
|
+
INPUT_PULSE as SELECT_PULSE,
|
|
90
|
+
} from '../Input/Input.metrics';
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import {
|
|
3
|
+
Platform,
|
|
4
|
+
Pressable,
|
|
5
|
+
ScrollView,
|
|
6
|
+
StyleSheet,
|
|
7
|
+
Text as RNText,
|
|
8
|
+
View,
|
|
9
|
+
useWindowDimensions,
|
|
10
|
+
type ViewStyle,
|
|
11
|
+
} from 'react-native';
|
|
12
|
+
|
|
13
|
+
import {
|
|
14
|
+
displayLabel,
|
|
15
|
+
resolveSelectProps,
|
|
16
|
+
selectItems,
|
|
17
|
+
selectTestIds,
|
|
18
|
+
type SelectItem,
|
|
19
|
+
} from './Select.helpers';
|
|
20
|
+
import { menuStyle, optionStyle, optionTextStyle, selectLook, type SelectLook } from './Select.look.native';
|
|
21
|
+
import {
|
|
22
|
+
SELECT_GLOW,
|
|
23
|
+
SELECT_ICON,
|
|
24
|
+
SELECT_MENU,
|
|
25
|
+
SELECT_PULSE,
|
|
26
|
+
inputVariantFor,
|
|
27
|
+
selectInputSize,
|
|
28
|
+
} from './Select.metrics';
|
|
29
|
+
import type { SelectProps, SelectValue } from './Select.types.native';
|
|
30
|
+
import { Icon } from '../../../icons/Icon.native';
|
|
31
|
+
import { webAria, webKeyDown, webRole, type WebKeyEvent } from '../../../platform/aria';
|
|
32
|
+
import { resolveTestId, withoutTestIdProps } from '../../../platform/test-id';
|
|
33
|
+
import { useUiTheme } from '../../../provider/use-ui-theme.native';
|
|
34
|
+
import { FieldPulse } from '../field-pulse.native';
|
|
35
|
+
import { helperStyle, labelStyle, type FieldState } from '../Input/Input.look.native';
|
|
36
|
+
|
|
37
|
+
/** MUI's halo on the outlined input, painted as a shadow. */
|
|
38
|
+
function glowStyle(color: string): ViewStyle {
|
|
39
|
+
return Platform.select<ViewStyle>({
|
|
40
|
+
android: { elevation: SELECT_GLOW.rest.blur / 2 },
|
|
41
|
+
default: {
|
|
42
|
+
shadowColor: color,
|
|
43
|
+
shadowOpacity: SELECT_GLOW.rest.alpha,
|
|
44
|
+
shadowRadius: SELECT_GLOW.rest.blur,
|
|
45
|
+
shadowOffset: { width: 0, height: 0 },
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
interface MenuProps {
|
|
51
|
+
items: SelectItem[];
|
|
52
|
+
value: SelectValue;
|
|
53
|
+
testIdFor: (value: SelectValue) => string;
|
|
54
|
+
onPick: (item: SelectItem) => void;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/** The option list: MUI's `Menu`, under the field rather than portalled over it. */
|
|
58
|
+
function SelectMenu({ items, value, testIdFor, onPick }: MenuProps): React.JSX.Element {
|
|
59
|
+
const theme = useUiTheme();
|
|
60
|
+
const { height } = useWindowDimensions();
|
|
61
|
+
const textStyle = optionTextStyle(theme);
|
|
62
|
+
|
|
63
|
+
return (
|
|
64
|
+
<View style={menuStyle(theme, height - SELECT_MENU.maxHeightInset)} {...webRole('listbox')}>
|
|
65
|
+
<ScrollView>
|
|
66
|
+
{items.map((item) => {
|
|
67
|
+
const selected = String(item.value) === String(value);
|
|
68
|
+
return (
|
|
69
|
+
<Pressable
|
|
70
|
+
key={`${item.placeholder ? 'placeholder' : 'option'}-${item.value}`}
|
|
71
|
+
role="option"
|
|
72
|
+
aria-selected={selected}
|
|
73
|
+
aria-disabled={item.disabled}
|
|
74
|
+
disabled={item.disabled}
|
|
75
|
+
testID={item.placeholder ? undefined : testIdFor(item.value)}
|
|
76
|
+
onPress={() => onPick(item)}
|
|
77
|
+
style={optionStyle(theme, selected, item.disabled)}
|
|
78
|
+
>
|
|
79
|
+
<RNText style={textStyle}>{item.label}</RNText>
|
|
80
|
+
</Pressable>
|
|
81
|
+
);
|
|
82
|
+
})}
|
|
83
|
+
</ScrollView>
|
|
84
|
+
</View>
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
interface TriggerProps {
|
|
89
|
+
testID: string;
|
|
90
|
+
look: SelectLook;
|
|
91
|
+
open: boolean;
|
|
92
|
+
disabled: boolean;
|
|
93
|
+
error: boolean;
|
|
94
|
+
glow: boolean;
|
|
95
|
+
display: string;
|
|
96
|
+
labelId?: string;
|
|
97
|
+
helperId?: string;
|
|
98
|
+
onToggle: () => void;
|
|
99
|
+
onKey: (event: WebKeyEvent) => void;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* The field itself: MUI's display slot and its arrow, under one `combobox`.
|
|
104
|
+
*
|
|
105
|
+
* `tabIndex` is spelled out because react-native-web only makes a handful of
|
|
106
|
+
* roles focusable on its own, and `combobox` is not one of them — without it
|
|
107
|
+
* the control would not be a tab stop. It goes to -1 when disabled, which is
|
|
108
|
+
* what the web does by leaving the attribute off a disabled field entirely.
|
|
109
|
+
*/
|
|
110
|
+
function SelectTrigger(props: TriggerProps): React.JSX.Element {
|
|
111
|
+
const theme = useUiTheme();
|
|
112
|
+
const { testID, look, open, disabled, error, glow, display, labelId, helperId } = props;
|
|
113
|
+
|
|
114
|
+
return (
|
|
115
|
+
<Pressable
|
|
116
|
+
testID={testID}
|
|
117
|
+
role="combobox"
|
|
118
|
+
tabIndex={disabled ? -1 : 0}
|
|
119
|
+
aria-expanded={open}
|
|
120
|
+
aria-disabled={disabled}
|
|
121
|
+
disabled={disabled}
|
|
122
|
+
onPress={props.onToggle}
|
|
123
|
+
style={[look.box, glow ? glowStyle(theme.palette.primary.main) : null]}
|
|
124
|
+
{...webAria({
|
|
125
|
+
'aria-haspopup': 'listbox',
|
|
126
|
+
'aria-invalid': error,
|
|
127
|
+
...(labelId === undefined ? {} : { 'aria-labelledby': labelId }),
|
|
128
|
+
...(helperId === undefined ? {} : { 'aria-describedby': helperId }),
|
|
129
|
+
})}
|
|
130
|
+
{...webKeyDown(props.onKey)}
|
|
131
|
+
>
|
|
132
|
+
<RNText style={look.display} numberOfLines={1}>
|
|
133
|
+
{display}
|
|
134
|
+
</RNText>
|
|
135
|
+
<Icon
|
|
136
|
+
name="ArrowDropDown"
|
|
137
|
+
size={SELECT_ICON.size}
|
|
138
|
+
color={disabled ? theme.palette.action.disabled : theme.palette.action.active}
|
|
139
|
+
testID={`${testID}-icon`}
|
|
140
|
+
style={[
|
|
141
|
+
{ marginLeft: look.iconGap },
|
|
142
|
+
open ? { transform: [{ rotate: `${SELECT_ICON.openRotateDeg}deg` }] } : null,
|
|
143
|
+
]}
|
|
144
|
+
/>
|
|
145
|
+
</Pressable>
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/** The value the control shows, controlled by the caller or held here. */
|
|
150
|
+
function useSelectValue(
|
|
151
|
+
value: SelectValue | undefined,
|
|
152
|
+
defaultValue: SelectValue | undefined,
|
|
153
|
+
): [SelectValue, (next: SelectValue) => void] {
|
|
154
|
+
const [own, setOwn] = React.useState<SelectValue>(defaultValue ?? '');
|
|
155
|
+
return [value ?? own, setOwn];
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/**
|
|
159
|
+
* The native `Select`.
|
|
160
|
+
*
|
|
161
|
+
* The list is an absolutely positioned panel under the field rather than a
|
|
162
|
+
* portal over the screen: React Native's `Modal` traps focus, which is right
|
|
163
|
+
* for a dialog and wrong for a dropdown — and wrong for the shared stories,
|
|
164
|
+
* which expect the trigger to keep focus while the list is open. The trade is
|
|
165
|
+
* recorded in `NATIVE-NOTES.md`.
|
|
166
|
+
*/
|
|
167
|
+
export const Select = React.forwardRef<View, SelectProps>((rawProps, ref) => {
|
|
168
|
+
const {
|
|
169
|
+
variant, options, label, helperText, fullWidth, size, placeholder, error, glow, pulse,
|
|
170
|
+
disabled, value, defaultValue, onChange, onOpen, onClose, style, ...others
|
|
171
|
+
} = resolveSelectProps(rawProps);
|
|
172
|
+
|
|
173
|
+
const theme = useUiTheme();
|
|
174
|
+
const [open, setOpen] = React.useState(false);
|
|
175
|
+
const [current, setCurrent] = useSelectValue(value, defaultValue);
|
|
176
|
+
const labelId = React.useId();
|
|
177
|
+
const helperId = React.useId();
|
|
178
|
+
|
|
179
|
+
const items = selectItems(options, placeholder);
|
|
180
|
+
const ids = selectTestIds(resolveTestId(others));
|
|
181
|
+
const state: FieldState = { focused: open && !disabled, error, disabled };
|
|
182
|
+
const look = selectLook(theme, variant, size, state);
|
|
183
|
+
|
|
184
|
+
const setOpenState = (next: boolean): void => {
|
|
185
|
+
if (next === open) return;
|
|
186
|
+
setOpen(next);
|
|
187
|
+
(next ? onOpen : onClose)?.();
|
|
188
|
+
};
|
|
189
|
+
|
|
190
|
+
const handleKey = (event: WebKeyEvent): void => {
|
|
191
|
+
if (event.key === 'Escape') setOpenState(false);
|
|
192
|
+
if (event.key === 'ArrowDown' || event.key === 'ArrowUp') setOpenState(true);
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
const pick = (item: SelectItem): void => {
|
|
196
|
+
setOpenState(false);
|
|
197
|
+
if (item.option === undefined) return;
|
|
198
|
+
setCurrent(item.value);
|
|
199
|
+
onChange?.({ target: { value: item.value } }, item.option);
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
return (
|
|
203
|
+
<View
|
|
204
|
+
ref={ref}
|
|
205
|
+
testID={ids.root}
|
|
206
|
+
style={[styles.root, fullWidth ? styles.fullWidth : styles.auto, style]}
|
|
207
|
+
{...withoutTestIdProps(others)}
|
|
208
|
+
>
|
|
209
|
+
{pulse ? (
|
|
210
|
+
<FieldPulse
|
|
211
|
+
color={theme.palette.primary.main}
|
|
212
|
+
radius={theme.spacing(SELECT_PULSE.radiusUnits)}
|
|
213
|
+
testID={`${ids.trigger}-pulse`}
|
|
214
|
+
/>
|
|
215
|
+
) : null}
|
|
216
|
+
{label === undefined ? null : (
|
|
217
|
+
<RNText id={labelId} style={labelStyle(theme, inputVariantFor(variant), size, state)}>
|
|
218
|
+
{label}
|
|
219
|
+
</RNText>
|
|
220
|
+
)}
|
|
221
|
+
<View style={[styles.anchor, open ? { zIndex: theme.zIndex.modal } : null]}>
|
|
222
|
+
<SelectTrigger
|
|
223
|
+
testID={ids.trigger}
|
|
224
|
+
look={look}
|
|
225
|
+
open={open}
|
|
226
|
+
disabled={disabled}
|
|
227
|
+
error={error}
|
|
228
|
+
glow={glow}
|
|
229
|
+
display={displayLabel(items, current)}
|
|
230
|
+
labelId={label === undefined ? undefined : labelId}
|
|
231
|
+
helperId={helperText === undefined ? undefined : helperId}
|
|
232
|
+
onToggle={() => setOpenState(!open)}
|
|
233
|
+
onKey={handleKey}
|
|
234
|
+
/>
|
|
235
|
+
{open ? (
|
|
236
|
+
<SelectMenu items={items} value={current} testIdFor={ids.option} onPick={pick} />
|
|
237
|
+
) : null}
|
|
238
|
+
</View>
|
|
239
|
+
{helperText === undefined ? null : (
|
|
240
|
+
<RNText id={helperId} style={helperStyle(theme, inputVariantFor(variant), selectInputSize(size), state)}>
|
|
241
|
+
{helperText}
|
|
242
|
+
</RNText>
|
|
243
|
+
)}
|
|
244
|
+
</View>
|
|
245
|
+
);
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
Select.displayName = 'Select';
|
|
249
|
+
|
|
250
|
+
const styles = StyleSheet.create({
|
|
251
|
+
root: {
|
|
252
|
+
position: 'relative',
|
|
253
|
+
},
|
|
254
|
+
anchor: {
|
|
255
|
+
position: 'relative',
|
|
256
|
+
},
|
|
257
|
+
fullWidth: {
|
|
258
|
+
alignSelf: 'stretch',
|
|
259
|
+
width: '100%',
|
|
260
|
+
},
|
|
261
|
+
auto: {
|
|
262
|
+
alignSelf: 'flex-start',
|
|
263
|
+
},
|
|
264
|
+
});
|