@persona/design-system 0.10.10 → 0.10.12
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/CHANGELOG.md +48 -0
- package/dist/AdvancedFilterRuleRow.d.mts +5 -2
- package/dist/AdvancedFilterRulesPopover.d.mts +6 -2
- package/dist/ArrayValueControl.d.mts +1 -1
- package/dist/{Badge-BCdsVKuj.mjs → Badge-B2AJMf3d.mjs} +2 -2
- package/dist/{Badge-BCdsVKuj.mjs.map → Badge-B2AJMf3d.mjs.map} +1 -1
- package/dist/BooleanValueControl.d.mts +1 -1
- package/dist/{Breadcrumbs-CMf3Uvow.mjs → Breadcrumbs-DRs9eo1o.mjs} +5 -5
- package/dist/Breadcrumbs-DRs9eo1o.mjs.map +1 -0
- package/dist/{CardV2-CrV6eEQb.mjs → CardV2-DO-8COfu.mjs} +11 -8
- package/dist/CardV2-DO-8COfu.mjs.map +1 -0
- package/dist/ChartFrame.d.mts +61 -0
- package/dist/ChartLegend.d.mts +60 -0
- package/dist/ChartPopover.d.mts +155 -0
- package/dist/{Checkbox-Dr4LMKHV.mjs → Checkbox-BAh-wF_F.mjs} +5 -5
- package/dist/Checkbox-BAh-wF_F.mjs.map +1 -0
- package/dist/{CheckboxGroupField-Bpu2j6G2.d.mts → CheckboxGroupField-XSVAmESI.d.mts} +2 -2
- package/dist/CheckboxGroupField.d.mts +1 -1
- package/dist/ChoicesValueControl.d.mts +1 -1
- package/dist/{Combobox-Gb_j1dg6.mjs → Combobox-BNjYEAmv.mjs} +313 -138
- package/dist/Combobox-BNjYEAmv.mjs.map +1 -0
- package/dist/Combobox-DbcSss15.d.mts +12 -0
- package/dist/Combobox.d.mts +3 -3
- package/dist/{ComboboxBase-BPXqJHaQ.d.mts → ComboboxBase-CrFweFGi.d.mts} +61 -21
- package/dist/ComboboxBase.d.mts +2 -2
- package/dist/{ComboboxMultiSelect-BwkkSymj.d.mts → ComboboxMultiSelect-Cp5GBGQj.d.mts} +10 -6
- package/dist/ComboboxMultiSelect.d.mts +2 -2
- package/dist/{ComboboxSingleSelect-CdNNJNkp.d.mts → ComboboxSingleSelect-u7fK3Yvy.d.mts} +8 -6
- package/dist/ComboboxSingleSelect.d.mts +2 -2
- package/dist/{DataTable-BE9inUi-.d.mts → DataTable-C1mdfmQa.d.mts} +17 -7
- package/dist/{DataTable-CIZJ1vO8.mjs → DataTable-DdSY9mzT.mjs} +36 -23
- package/dist/DataTable-DdSY9mzT.mjs.map +1 -0
- package/dist/DataTable.d.mts +1 -1
- package/dist/{DatePicker-C9redLBr.mjs → DatePicker-DiilpYQg.mjs} +5 -5
- package/dist/{DatePicker-C9redLBr.mjs.map → DatePicker-DiilpYQg.mjs.map} +1 -1
- package/dist/DateRangeValueControl.d.mts +1 -1
- package/dist/DateValueControl.d.mts +1 -1
- package/dist/{DropdownButton-DpLG-cIj.mjs → DropdownButton-BxZ5hn0X.mjs} +3 -3
- package/dist/{DropdownButton-DpLG-cIj.mjs.map → DropdownButton-BxZ5hn0X.mjs.map} +1 -1
- package/dist/DropdownButton.d.mts +1 -1
- package/dist/{DropdownMenu-B6D4stkF.d.mts → DropdownMenu-CQR0U-zM.d.mts} +2 -2
- package/dist/{DropdownMenu-c8XK2Lr4.mjs → DropdownMenu-Ip75l4Th.mjs} +21 -2
- package/dist/DropdownMenu-Ip75l4Th.mjs.map +1 -0
- package/dist/DropdownMenu.d.mts +1 -1
- package/dist/{FieldRegistry-C2NVPhMO.d.mts → FieldRegistry-CJwGpUVK.d.mts} +2 -2
- package/dist/FieldRegistry.d.mts +1 -1
- package/dist/{FilterBar-BE_gBM0H.d.mts → FilterBar-CA4mDAXK.d.mts} +13 -5
- package/dist/FilterBar.d.mts +1 -1
- package/dist/FilterPickerMenu.d.mts +2 -2
- package/dist/FilterPill.d.mts +1 -1
- package/dist/FilterPopover.d.mts +1 -1
- package/dist/FloatValueControl.d.mts +3 -2
- package/dist/{FloatingToolbar-DLRaE0o7.mjs → FloatingToolbar-BA8Fqmrz.mjs} +35 -38
- package/dist/FloatingToolbar-BA8Fqmrz.mjs.map +1 -0
- package/dist/{FormControl-BztNXLn6.mjs → FormControl-BoKGiWdQ.mjs} +2 -2
- package/dist/{FormControl-BztNXLn6.mjs.map → FormControl-BoKGiWdQ.mjs.map} +1 -1
- package/dist/{FormField-Cf1VMvoa.mjs → FormField-yYJFkJ6R.mjs} +13 -13
- package/dist/{FormField-Cf1VMvoa.mjs.map → FormField-yYJFkJ6R.mjs.map} +1 -1
- package/dist/{HoverCopyableField-XHC_n9tp.mjs → HoverCopyableField-X2XfKTTh.mjs} +10 -5
- package/dist/HoverCopyableField-X2XfKTTh.mjs.map +1 -0
- package/dist/{IconButton-DxHB2g80.mjs → IconButton-Bj1fry_K.mjs} +4 -3
- package/dist/IconButton-Bj1fry_K.mjs.map +1 -0
- package/dist/IndexTableLayout.d.mts +11 -3
- package/dist/InlineCombobox.d.mts +1 -1
- package/dist/InlineInput.d.mts +1 -1
- package/dist/{Input-RHXujO9u.mjs → Input-DcbzPaax.mjs} +2 -2
- package/dist/{Input-RHXujO9u.mjs.map → Input-DcbzPaax.mjs.map} +1 -1
- package/dist/IntegerValueControl.d.mts +3 -2
- package/dist/{Link-D_kCyLYX.mjs → Link-B29ZMN6m.mjs} +3 -3
- package/dist/Link-B29ZMN6m.mjs.map +1 -0
- package/dist/{ListBox-BZp6exb8.mjs → ListBox-4rTgr3IJ.mjs} +6 -6
- package/dist/{ListBox-BZp6exb8.mjs.map → ListBox-4rTgr3IJ.mjs.map} +1 -1
- package/dist/{ListBox-DpFcM-dM.d.mts → ListBox-ZDaitaXR.d.mts} +2 -2
- package/dist/ListBox.d.mts +1 -1
- package/dist/{ListBoxField-DL6Zk8TU.d.mts → ListBoxField-CGvVWKyL.d.mts} +4 -4
- package/dist/ListBoxField.d.mts +1 -1
- package/dist/{LoadingShimmer-oPIv2ESr.mjs → LoadingShimmer-BVVdBeN-.mjs} +18 -20
- package/dist/LoadingShimmer-BVVdBeN-.mjs.map +1 -0
- package/dist/{LogicRow-BakOUtzx.d.mts → LogicRow-Bzp5o1sL.d.mts} +2 -2
- package/dist/LogicRow.d.mts +1 -1
- package/dist/{Menu-D6OrKCTC.d.mts → Menu-DviYNrFd.d.mts} +2 -2
- package/dist/Menu.d.mts +1 -1
- package/dist/{Modal-De5_bPJ_.mjs → Modal-CiPFqr0L.mjs} +52 -23
- package/dist/{Modal-De5_bPJ_.mjs.map → Modal-CiPFqr0L.mjs.map} +1 -1
- package/dist/{PageHeader-7_Hf6rHl.mjs → PageHeader-6KvtGED-.mjs} +2 -2
- package/dist/{PageHeader-7_Hf6rHl.mjs.map → PageHeader-6KvtGED-.mjs.map} +1 -1
- package/dist/{PageLayout-DjtGrvJa.mjs → PageLayout-CPiVnS_r.mjs} +3 -1
- package/dist/PageLayout-CPiVnS_r.mjs.map +1 -0
- package/dist/{Pagination-DMH2IaV0.mjs → Pagination-CqFvnlXc.mjs} +4 -4
- package/dist/{Pagination-DMH2IaV0.mjs.map → Pagination-CqFvnlXc.mjs.map} +1 -1
- package/dist/{Pii-24D_nSRQ.mjs → Pii-jSYND7Cn.mjs} +2 -2
- package/dist/{Pii-24D_nSRQ.mjs.map → Pii-jSYND7Cn.mjs.map} +1 -1
- package/dist/{PillShell-B7Bm-dsE.d.mts → PillShell-Bkyu5FXB.d.mts} +2 -2
- package/dist/PillShell.d.mts +1 -1
- package/dist/{Popover-DordjYNM.mjs → Popover-CVX-dfYb.mjs} +48 -18
- package/dist/Popover-CVX-dfYb.mjs.map +1 -0
- package/dist/{Radio-BlEtetrr.mjs → Radio-B1H_S-Qj.mjs} +2 -2
- package/dist/Radio-B1H_S-Qj.mjs.map +1 -0
- package/dist/{RadioGroup-CMrXmmn4.mjs → RadioGroup-7hdcVhsp.mjs} +2 -2
- package/dist/{RadioGroup-CMrXmmn4.mjs.map → RadioGroup-7hdcVhsp.mjs.map} +1 -1
- package/dist/RuleEditorFields.d.mts +2 -2
- package/dist/RulesPill.d.mts +1 -1
- package/dist/{SegmentedControl-D_DA-MU1.mjs → SegmentedControl-BNOJ1FYQ.mjs} +5 -2
- package/dist/SegmentedControl-BNOJ1FYQ.mjs.map +1 -0
- package/dist/{Select-DOlw_LPR.mjs → Select-DbWEgH5c.mjs} +5 -3
- package/dist/Select-DbWEgH5c.mjs.map +1 -0
- package/dist/{Select-CR9TjFfo.d.mts → Select-DsVeAyZy.d.mts} +2 -2
- package/dist/Select.d.mts +1 -1
- package/dist/SmartTextInputField.d.mts +2 -2
- package/dist/{Spinner-CXb-KUs1.mjs → Spinner-k9ZiOdTr.mjs} +1 -1
- package/dist/{Spinner-CXb-KUs1.mjs.map → Spinner-k9ZiOdTr.mjs.map} +1 -1
- package/dist/{Sticker-C1_6I08u.mjs → Sticker-4VdGEFAu.mjs} +2 -2
- package/dist/{Sticker-C1_6I08u.mjs.map → Sticker-4VdGEFAu.mjs.map} +1 -1
- package/dist/StringValueControl.d.mts +2 -1
- package/dist/{TabBar-BCFO38E0.mjs → TabBar-d4sdknti.mjs} +5 -5
- package/dist/TabBar-d4sdknti.mjs.map +1 -0
- package/dist/{Table-DPi4Dt5H.mjs → Table-9mNn8Q-d.mjs} +14 -6
- package/dist/Table-9mNn8Q-d.mjs.map +1 -0
- package/dist/{TableBox-DNQsgQ8x.mjs → TableBox-D9NA-s9l.mjs} +16 -12
- package/dist/TableBox-D9NA-s9l.mjs.map +1 -0
- package/dist/TableBox.d.mts +1 -1
- package/dist/{TableBoxCell-CsRt_5gP.d.mts → TableBoxCell-CQOL30et.d.mts} +4 -4
- package/dist/TableBoxCell.d.mts +1 -1
- package/dist/{TableBoxField-Db0Vjo6Z.d.mts → TableBoxField-z0GIFeQw.d.mts} +5 -5
- package/dist/TableBoxField.d.mts +1 -1
- package/dist/{TableBoxRow-exMlZyc4.d.mts → TableBoxRow-tb9-KMr9.d.mts} +2 -2
- package/dist/TableBoxRow.d.mts +1 -1
- package/dist/{TableBoxRowActions-UO9YN34k.d.mts → TableBoxRowActions-BZwulsFP.d.mts} +2 -2
- package/dist/TableBoxRowActions.d.mts +1 -1
- package/dist/{TableControls-BrP_BqnF.mjs → TableControls-BXykbUBf.mjs} +126 -40
- package/dist/TableControls-BXykbUBf.mjs.map +1 -0
- package/dist/{TableControls-Clo_0Mty.d.mts → TableControls-DE6eHq8h.d.mts} +4 -4
- package/dist/TableControls.d.mts +1 -1
- package/dist/{TableControlsContext-BNd6z9mD.d.mts → TableControlsContext-C2_2EuMh.d.mts} +2 -2
- package/dist/TableControlsContext.d.mts +1 -1
- package/dist/{TableViewConfigurationDropdown-Cp7ausV_.d.mts → TableViewConfigurationDropdown-DE9HFXYY.d.mts} +2 -2
- package/dist/TableViewConfigurationDropdown.d.mts +1 -1
- package/dist/{TechnicalSticker-Cq5jzYKQ.mjs → TechnicalSticker-DtV7Gawf.mjs} +5 -3
- package/dist/TechnicalSticker-DtV7Gawf.mjs.map +1 -0
- package/dist/{TextArea-Dro-HH8O.mjs → TextArea-CQ1YNi2b.mjs} +4 -5
- package/dist/TextArea-CQ1YNi2b.mjs.map +1 -0
- package/dist/{Toggle-D9MzTIZs.mjs → Toggle-CzHoIR-n.mjs} +8 -4
- package/dist/Toggle-CzHoIR-n.mjs.map +1 -0
- package/dist/{Tooltip-YViXzMdm.mjs → Tooltip-CVBxc1yf.mjs} +17 -4
- package/dist/Tooltip-CVBxc1yf.mjs.map +1 -0
- package/dist/chartColors.d.mts +92 -0
- package/dist/chartFrameLayout.d.mts +46 -0
- package/dist/{clientFilterUtils-CGHYF5NE.d.mts → clientFilterUtils-2TBUC31K.d.mts} +2 -2
- package/dist/clientFilterUtils.d.mts +1 -1
- package/dist/components/Accordion/index.mjs +22 -13
- package/dist/components/Accordion/index.mjs.map +1 -1
- package/dist/components/Attribute/index.mjs +6 -4
- package/dist/components/Attribute/index.mjs.map +1 -1
- package/dist/components/Badge/index.mjs +1 -1
- package/dist/components/Banner/index.mjs +1 -1
- package/dist/components/BottomPanel/index.mjs +7 -5
- package/dist/components/BottomPanel/index.mjs.map +1 -1
- package/dist/components/Breadcrumbs/index.mjs +1 -1
- package/dist/components/Button/index.mjs +1 -1
- package/dist/components/ButtonGroup/index.mjs +1 -1
- package/dist/components/CardV2/index.mjs +1 -1
- package/dist/components/Chart/index.d.mts +9 -0
- package/dist/components/Chart/index.mjs +680 -0
- package/dist/components/Chart/index.mjs.map +1 -0
- package/dist/components/Checkbox/index.mjs +1 -1
- package/dist/components/CodeHighlight/index.mjs +1 -1
- package/dist/components/Combobox/index.d.mts +5 -3
- package/dist/components/Combobox/index.mjs +1 -1
- package/dist/components/DataTable/TableControls/index.d.mts +19 -19
- package/dist/components/DataTable/TableControls/index.mjs +2 -2
- package/dist/components/DataTable/index.d.mts +5 -5
- package/dist/components/DataTable/index.mjs +1 -1
- package/dist/components/DataTable/types.d.mts +1 -1
- package/dist/components/DatePicker/index.mjs +1 -1
- package/dist/components/DropdownButton/index.mjs +1 -1
- package/dist/components/DropdownMenu/index.d.mts +1 -1
- package/dist/components/DropdownMenu/index.mjs +1 -1
- package/dist/components/FloatingPanel/index.mjs +16 -14
- package/dist/components/FloatingPanel/index.mjs.map +1 -1
- package/dist/components/FloatingToolbar/index.mjs +1 -1
- package/dist/components/FormControl/index.mjs +1 -1
- package/dist/components/FormField/index.d.mts +4 -4
- package/dist/components/FormField/index.mjs +1 -1
- package/dist/components/HoverCopyableField/index.mjs +1 -1
- package/dist/components/ImageTile/index.mjs +7 -7
- package/dist/components/ImageTile/index.mjs.map +1 -1
- package/dist/components/Input/index.mjs +1 -1
- package/dist/components/Link/index.mjs +1 -1
- package/dist/components/ListBox/index.d.mts +3 -3
- package/dist/components/ListBox/index.mjs +1 -1
- package/dist/components/LoadingShimmer/index.mjs +1 -1
- package/dist/components/MaskedInput/index.mjs +1 -1
- package/dist/components/Menu/index.d.mts +1 -1
- package/dist/components/Modal/index.mjs +1 -1
- package/dist/components/PageHeader/index.mjs +1 -1
- package/dist/components/Pagination/index.mjs +1 -1
- package/dist/components/Pii/index.mjs +1 -1
- package/dist/components/Popover/index.mjs +1 -1
- package/dist/components/ProgressBar/index.mjs +20 -3
- package/dist/components/ProgressBar/index.mjs.map +1 -1
- package/dist/components/Radio/index.mjs +1 -1
- package/dist/components/RadioGroup/index.mjs +1 -1
- package/dist/components/RichTextEditor/index.mjs +5 -5
- package/dist/components/RightPanel/index.mjs +28 -13
- package/dist/components/RightPanel/index.mjs.map +1 -1
- package/dist/components/SegmentedControl/index.mjs +1 -1
- package/dist/components/Select/index.d.mts +1 -1
- package/dist/components/Select/index.mjs +1 -1
- package/dist/components/SelectionCard/index.mjs +2 -2
- package/dist/components/Slider/index.mjs +3 -2
- package/dist/components/Slider/index.mjs.map +1 -1
- package/dist/components/SmartTextInput/index.mjs +9 -78
- package/dist/components/SmartTextInput/index.mjs.map +1 -1
- package/dist/{safe-parse.d.mts → components/SmartTextInput/parser/safe-parse.d.mts} +1 -1
- package/dist/components/SmartTextInput/parser/safe-parse.mjs +30 -0
- package/dist/components/SmartTextInput/parser/safe-parse.mjs.map +1 -0
- package/dist/{tree.d.mts → components/SmartTextInput/parser/tree.d.mts} +1 -1
- package/dist/components/SmartTextInput/parser/tree.mjs +42 -0
- package/dist/components/SmartTextInput/parser/tree.mjs.map +1 -0
- package/dist/components/Spinner/index.mjs +1 -1
- package/dist/components/Sticker/index.mjs +1 -1
- package/dist/components/SwatchPicker/index.mjs +2 -1
- package/dist/components/SwatchPicker/index.mjs.map +1 -1
- package/dist/components/TabBar/index.mjs +1 -1
- package/dist/components/Table/index.mjs +1 -1
- package/dist/components/TableBox/index.d.mts +1 -1
- package/dist/components/TableBox/index.mjs +1 -1
- package/dist/components/TechnicalSticker/index.mjs +1 -1
- package/dist/components/TextArea/index.mjs +1 -1
- package/dist/components/Tile/index.mjs +2 -2
- package/dist/components/Toast/index.mjs +16 -10
- package/dist/components/Toast/index.mjs.map +1 -1
- package/dist/components/Toggle/index.mjs +1 -1
- package/dist/components/Tooltip/index.mjs +1 -1
- package/dist/components/VersionHistory/index.mjs +5 -5
- package/dist/compound-expression.d.mts +1 -1
- package/dist/{date-range-rule-value-ASr06ClE.d.mts → date-range-rule-value-DyLlMtjr.d.mts} +2 -2
- package/dist/date-range-rule-value.d.mts +1 -1
- package/dist/display.d.mts +1 -1
- package/dist/duration-token.d.mts +11 -0
- package/dist/exit-motion.d.mts +7 -0
- package/dist/fieldPickerOptions.d.mts +2 -2
- package/dist/{filter-size-context-CmFyIPCm.d.mts → filter-size-context-DVnjmuhk.d.mts} +2 -2
- package/dist/filter-size-context.d.mts +1 -1
- package/dist/{filters-DTBc0mE7.d.mts → filters-DW7pqWv3.d.mts} +2 -2
- package/dist/filters.d.mts +1 -1
- package/dist/{helpers-CBJ2AqGZ.d.mts → helpers-BTD2kXLs.d.mts} +2 -2
- package/dist/helpers.d.mts +1 -1
- package/dist/{index-OkdnW-u5.d.mts → index-B4tE0RxY.d.mts} +3 -3
- package/dist/{index-kIon1vPp.d.mts → index-DTM_t7OG.d.mts} +2 -2
- package/dist/index4.d.mts +3 -3
- package/dist/index5.d.mts +1 -1
- package/dist/index6.d.mts +14 -14
- package/dist/{inputFields-DpHeZiFX.d.mts → inputFields-DnBb3NhK.d.mts} +4 -4
- package/dist/inputFields.d.mts +1 -1
- package/dist/lib/TruncatedTextWithTooltip.mjs +1 -1
- package/dist/lib/useCloseFocus.d.mts +45 -0
- package/dist/lib/useCloseFocus.mjs +123 -0
- package/dist/lib/useCloseFocus.mjs.map +1 -0
- package/dist/lib/useModalInsetRight.d.mts +4 -3
- package/dist/lib/useModalInsetRight.mjs +7 -5
- package/dist/lib/useModalInsetRight.mjs.map +1 -1
- package/dist/lint/THIRD_PARTY_NOTICES.md +30 -0
- package/dist/lint/index.mjs +696 -11
- package/dist/lint/index.mjs.map +1 -1
- package/dist/lint/recommended.json +7 -1
- package/dist/mixins/hoverable.mjs +1 -1
- package/dist/mixins/hoverable.mjs.map +1 -1
- package/dist/mixins/input.mjs +1 -0
- package/dist/mixins/input.mjs.map +1 -1
- package/dist/mixins/menuItem.mjs +2 -0
- package/dist/mixins/menuItem.mjs.map +1 -1
- package/dist/mixins/motion.d.mts +28 -0
- package/dist/mixins/motion.mjs +66 -0
- package/dist/mixins/motion.mjs.map +1 -0
- package/dist/motion-origin.d.mts +7 -0
- package/dist/motion.d.mts +63 -0
- package/dist/no-layout-motion.d.mts +7 -0
- package/dist/no-transition-all.d.mts +7 -0
- package/dist/{operators-BHxKZcpD.d.mts → operators-B8_k3r69.d.mts} +10 -3
- package/dist/operators.d.mts +2 -2
- package/dist/overlay-motion.d.mts +7 -0
- package/dist/patterns/CardGrouping/index.mjs +6 -6
- package/dist/patterns/CardGrouping/index.mjs.map +1 -1
- package/dist/patterns/IndexTableLayout/index.mjs +23 -16
- package/dist/patterns/IndexTableLayout/index.mjs.map +1 -1
- package/dist/patterns/LayoutLoadingShimmer/index.mjs +4 -4
- package/dist/patterns/LayoutLoadingSpinner/index.mjs +3 -1
- package/dist/patterns/LayoutLoadingSpinner/index.mjs.map +1 -1
- package/dist/patterns/PageLayout/index.mjs +1 -1
- package/dist/patterns/WizardModal/index.mjs +2 -2
- package/dist/relative-date-label.d.mts +1 -1
- package/dist/{types-DLnCkvTt.d.mts → types-BJqmRXFV.d.mts} +15 -1
- package/dist/{types-CqcbWyUY.d.mts → types-BOsCi-kZ.d.mts} +8 -2
- package/dist/{types-BiqzeNsa.d.mts → types-Dws2XDz2.d.mts} +2 -2
- package/dist/{types-BEdERA4v.d.mts → types-NO2GRlM-.d.mts} +2 -2
- package/dist/types4.d.mts +1 -1
- package/dist/types5.d.mts +1 -1
- package/dist/types6.d.mts +1 -1
- package/dist/{url-state-CXUuK3_r.d.mts → url-state-CXPmXzIZ.d.mts} +2 -2
- package/dist/url-state.d.mts +1 -1
- package/dist/useChartColors.d.mts +30 -0
- package/dist/useChartSeriesVisibility.d.mts +22 -0
- package/dist/useChartStyles.d.mts +108 -0
- package/dist/useColumnConfiguration.d.mts +2 -2
- package/dist/useComboboxFooterAction.d.mts +1 -1
- package/dist/{useFilterStateV2-DBpbxAEC.d.mts → useFilterStateV2-DiTS9DTg.d.mts} +3 -3
- package/dist/useFilterStateV2.d.mts +1 -1
- package/dist/{useTableColumns-Xd14vx_h.d.mts → useTableColumns-tITjHasE.d.mts} +2 -2
- package/dist/useTableColumns.d.mts +1 -1
- package/dist/useTruncation.d.mts +1 -1
- package/dist/useValueControlError.d.mts +26 -0
- package/dist/utils.d.mts +1 -1
- package/dist/{validation-Tgg3AhuP.d.mts → validation-BDQdQ1cY.d.mts} +3 -3
- package/dist/validation.d.mts +1 -1
- package/dist/{value-control-resolver-XQbGCdsP.d.mts → value-control-resolver-BFJZEWDn.d.mts} +9 -3
- package/dist/value-control-resolver.d.mts +1 -1
- package/dist/value-labels.d.mts +12 -0
- package/dist/variables/keyframes.d.mts +2 -1
- package/dist/variables/keyframes.mjs +9 -1
- package/dist/variables/keyframes.mjs.map +1 -1
- package/dist/variables/transitions.d.mts +31 -1
- package/dist/variables/transitions.mjs +50 -1
- package/dist/variables/transitions.mjs.map +1 -1
- package/llms.txt +2 -1
- package/package.json +20 -4
- package/skills/new-screen/SKILL.md +33 -0
- package/skills/ui-authoring/COMPONENTS.md +19 -1
- package/skills/ui-authoring/PATTERNS.md +57 -36
- package/skills/ui-authoring/STANDARD.md +78 -4
- package/skills/ui-authoring/TOKENS.md +27 -24
- package/dist/Breadcrumbs-CMf3Uvow.mjs.map +0 -1
- package/dist/CardV2-CrV6eEQb.mjs.map +0 -1
- package/dist/Checkbox-Dr4LMKHV.mjs.map +0 -1
- package/dist/Combobox-CIKqTYZt.d.mts +0 -11
- package/dist/Combobox-Gb_j1dg6.mjs.map +0 -1
- package/dist/DataTable-CIZJ1vO8.mjs.map +0 -1
- package/dist/DropdownMenu-c8XK2Lr4.mjs.map +0 -1
- package/dist/FloatingToolbar-DLRaE0o7.mjs.map +0 -1
- package/dist/HoverCopyableField-XHC_n9tp.mjs.map +0 -1
- package/dist/IconButton-DxHB2g80.mjs.map +0 -1
- package/dist/Link-D_kCyLYX.mjs.map +0 -1
- package/dist/LoadingShimmer-oPIv2ESr.mjs.map +0 -1
- package/dist/PageLayout-DjtGrvJa.mjs.map +0 -1
- package/dist/Popover-DordjYNM.mjs.map +0 -1
- package/dist/Radio-BlEtetrr.mjs.map +0 -1
- package/dist/SegmentedControl-D_DA-MU1.mjs.map +0 -1
- package/dist/Select-DOlw_LPR.mjs.map +0 -1
- package/dist/TabBar-BCFO38E0.mjs.map +0 -1
- package/dist/Table-DPi4Dt5H.mjs.map +0 -1
- package/dist/TableBox-DNQsgQ8x.mjs.map +0 -1
- package/dist/TableControls-BrP_BqnF.mjs.map +0 -1
- package/dist/TechnicalSticker-Cq5jzYKQ.mjs.map +0 -1
- package/dist/TextArea-Dro-HH8O.mjs.map +0 -1
- package/dist/Toggle-D9MzTIZs.mjs.map +0 -1
- package/dist/Tooltip-YViXzMdm.mjs.map +0 -1
|
@@ -1,20 +1,21 @@
|
|
|
1
1
|
import { a as styled, r as css } from "./styledComponentsInterop-Cs5CCPRy.mjs";
|
|
2
2
|
import { semanticColor } from "./lib/semanticColor.mjs";
|
|
3
3
|
import { i as Paragraph } from "./Text-D0vEReED.mjs";
|
|
4
|
+
import { a as Tooltip } from "./Tooltip-CVBxc1yf.mjs";
|
|
4
5
|
import { isDisabled, isHovered, isNotDisabled } from "./lib/pseudoClass.mjs";
|
|
5
6
|
import { useOutsideClick } from "./lib/useOutsideClick.mjs";
|
|
6
7
|
import { Z_INDICES } from "./lib/zindex.mjs";
|
|
7
8
|
import { focusStyle } from "./mixins/focus.mjs";
|
|
8
9
|
import { semanticScrollbar } from "./mixins/scrollbar.mjs";
|
|
9
10
|
import { n as Stack } from "./Stack-Bzom2BTR.mjs";
|
|
10
|
-
import { n as Button } from "./IconButton-
|
|
11
|
-
import { n as Sticker } from "./Sticker-
|
|
11
|
+
import { n as Button } from "./IconButton-Bj1fry_K.mjs";
|
|
12
|
+
import { n as Sticker } from "./Sticker-4VdGEFAu.mjs";
|
|
12
13
|
import { n as useFormField } from "./useFormField-pOVkb5BK.mjs";
|
|
13
|
-
import { r as InputGroup } from "./Input-
|
|
14
|
+
import { r as InputGroup } from "./Input-DcbzPaax.mjs";
|
|
14
15
|
import Input_default from "./components/Input/index.mjs";
|
|
15
16
|
import { c as MenuList, n as IconContainer, o as MenuHeading, s as MenuItem, t as FloatingCard } from "./Menu-BVn1jh46.mjs";
|
|
16
|
-
import { t as Checkbox } from "./Checkbox-
|
|
17
|
-
import { t as Spinner } from "./Spinner-
|
|
17
|
+
import { t as Checkbox } from "./Checkbox-BAh-wF_F.mjs";
|
|
18
|
+
import { t as Spinner } from "./Spinner-k9ZiOdTr.mjs";
|
|
18
19
|
import { Fragment, cloneElement, forwardRef, isValidElement, useCallback, useEffect, useImperativeHandle, useLayoutEffect, useMemo, useRef, useState } from "react";
|
|
19
20
|
import { Color, Spacing, Typography } from "@persona/design-tokens";
|
|
20
21
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -28,6 +29,35 @@ function isOptionGroup(item) {
|
|
|
28
29
|
return "options" in item && Array.isArray(item.options);
|
|
29
30
|
}
|
|
30
31
|
/**
|
|
32
|
+
* Moves disabled options after the enabled ones, keeping each run in its original order. A section
|
|
33
|
+
* header (inline group) is a boundary, so an option never leaves its section. Nested-group rows
|
|
34
|
+
* count as enabled. Recurses into every group.
|
|
35
|
+
*/
|
|
36
|
+
function sortDisabledOptionsLast(items, isDisabled) {
|
|
37
|
+
const sorted = [];
|
|
38
|
+
let enabled = [];
|
|
39
|
+
let disabled = [];
|
|
40
|
+
const flush = () => {
|
|
41
|
+
sorted.push(...enabled, ...disabled);
|
|
42
|
+
enabled = [];
|
|
43
|
+
disabled = [];
|
|
44
|
+
};
|
|
45
|
+
for (const item of items) if (isOptionGroup(item)) {
|
|
46
|
+
const group = {
|
|
47
|
+
...item,
|
|
48
|
+
options: sortDisabledOptionsLast(item.options, isDisabled)
|
|
49
|
+
};
|
|
50
|
+
if (item.nested) enabled.push(group);
|
|
51
|
+
else {
|
|
52
|
+
flush();
|
|
53
|
+
sorted.push(group);
|
|
54
|
+
}
|
|
55
|
+
} else if (isDisabled(item)) disabled.push(item);
|
|
56
|
+
else enabled.push(item);
|
|
57
|
+
flush();
|
|
58
|
+
return sorted;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
31
61
|
* Flatten the visible leaves at the current navigation level. Inline
|
|
32
62
|
* (non-nested) groups are walked through transparently — their leaves
|
|
33
63
|
* surface at this level. Nested groups are skipped along with their
|
|
@@ -86,9 +116,7 @@ function findNestedGroupByLabel(items, label) {
|
|
|
86
116
|
* nested groups).
|
|
87
117
|
*
|
|
88
118
|
* - Empty `path` returns the original top-level items unchanged.
|
|
89
|
-
* - If
|
|
90
|
-
* state after the registry changes), returns an empty list so the
|
|
91
|
-
* consumer can fall back to the root view.
|
|
119
|
+
* - If a step no longer resolves to a nested group, returns an empty list.
|
|
92
120
|
*/
|
|
93
121
|
function getOptionsAtPath(options, path) {
|
|
94
122
|
let scope = options;
|
|
@@ -142,29 +170,107 @@ function getNavigableItemsAtLevel(items) {
|
|
|
142
170
|
});
|
|
143
171
|
return out;
|
|
144
172
|
}
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
173
|
+
function filterComboboxOptions(options, inputValue) {
|
|
174
|
+
const flatOptions = flattenOptions(options);
|
|
175
|
+
const fuse = new Fuse(flatOptions, {
|
|
176
|
+
shouldSort: false,
|
|
177
|
+
threshold: 0,
|
|
178
|
+
ignoreLocation: true,
|
|
179
|
+
minMatchCharLength: 1,
|
|
180
|
+
keys: [
|
|
181
|
+
"label",
|
|
182
|
+
"description",
|
|
183
|
+
"keywords"
|
|
184
|
+
]
|
|
185
|
+
});
|
|
186
|
+
return inputValue === "" ? flatOptions : Array.from(new Set(fuse.search(inputValue).map(({ item }) => item)).values());
|
|
187
|
+
}
|
|
188
|
+
/** All server-specific behavior lives here; client event/filtering behavior passes through. */
|
|
189
|
+
function useComboboxServerMode(props, values, clientOptions = props.options, selectAll = false) {
|
|
190
|
+
const server = props.filterMode === "server";
|
|
191
|
+
const options = useMemo(() => server ? flattenLeafOptions(props.options).map(({ option }) => option) : clientOptions, [
|
|
192
|
+
server,
|
|
193
|
+
props.options,
|
|
194
|
+
clientOptions
|
|
195
|
+
]);
|
|
196
|
+
const selectedItems = useMemo(() => {
|
|
197
|
+
if (!server) return flattenLeafOptions(options).map(({ option }) => option).filter((option) => values.includes(option.value));
|
|
198
|
+
const byValue = /* @__PURE__ */ new Map();
|
|
199
|
+
if (props.filterMode === "server") props.selectedOptions?.forEach((option) => byValue.set(option.value, option));
|
|
200
|
+
flattenLeafOptions(options).forEach(({ option }) => byValue.set(option.value, option));
|
|
201
|
+
return values.flatMap((value) => {
|
|
202
|
+
const option = byValue.get(value) ?? (server ? {
|
|
203
|
+
value,
|
|
204
|
+
label: String(value)
|
|
205
|
+
} : void 0);
|
|
206
|
+
return option ? [option] : [];
|
|
165
207
|
});
|
|
166
|
-
|
|
167
|
-
|
|
208
|
+
}, [
|
|
209
|
+
options,
|
|
210
|
+
server,
|
|
211
|
+
props.filterMode,
|
|
212
|
+
props.selectedOptions,
|
|
213
|
+
values
|
|
214
|
+
]);
|
|
215
|
+
const itemToKey = useCallback((item) => item?.value, []);
|
|
216
|
+
const filterOptions = useCallback((source, inputValue) => server ? flattenOptions(source) : filterComboboxOptions(source, inputValue), [server]);
|
|
217
|
+
const scrollRef = useRef(null);
|
|
218
|
+
const scrollState = useRef({
|
|
219
|
+
open: false,
|
|
220
|
+
rowHeight: 32
|
|
221
|
+
});
|
|
222
|
+
scrollState.current.rowHeight = props.size === "sm" ? 24 : 32;
|
|
223
|
+
scrollState.current.callback = props.filterMode === "server" ? props.onScrollEnd : void 0;
|
|
224
|
+
const checkScrollEnd = useCallback((shortOnly = false) => {
|
|
225
|
+
const list = scrollRef.current;
|
|
226
|
+
if (!scrollState.current.open || !list || list.clientHeight <= 0) return;
|
|
227
|
+
if (shortOnly ? list.scrollHeight <= list.clientHeight : list.scrollHeight - list.scrollTop - list.clientHeight <= scrollState.current.rowHeight) scrollState.current.callback?.();
|
|
228
|
+
}, []);
|
|
229
|
+
const onMenuOpenChange = useCallback((open) => {
|
|
230
|
+
if (scrollState.current.open === open) return;
|
|
231
|
+
scrollState.current.open = open;
|
|
232
|
+
if (open) checkScrollEnd(true);
|
|
233
|
+
}, [checkScrollEnd]);
|
|
234
|
+
useEffect(() => checkScrollEnd(true), [checkScrollEnd, options.length]);
|
|
235
|
+
const getQueryInputProps = (inputProps, isOpen = true, onQueryEdit) => {
|
|
236
|
+
if (props.filterMode !== "server") return inputProps;
|
|
237
|
+
return {
|
|
238
|
+
...inputProps,
|
|
239
|
+
value: isOpen ? props.query : inputProps.value,
|
|
240
|
+
onKeyDown: (event) => {
|
|
241
|
+
if (!isOpen && !event.nativeEvent.isComposing && (event.key.length === 1 && !event.metaKey && !event.ctrlKey && !event.altKey || event.key === "Backspace" || event.key === "Delete" || event.key === "Process" || event.key === "Unidentified" || event.key === "Dead")) event.currentTarget.select();
|
|
242
|
+
inputProps.onKeyDown?.(event);
|
|
243
|
+
},
|
|
244
|
+
onPaste: (event) => {
|
|
245
|
+
if (!isOpen) event.currentTarget.select();
|
|
246
|
+
inputProps.onPaste?.(event);
|
|
247
|
+
},
|
|
248
|
+
onChange: (event) => {
|
|
249
|
+
const nextInput = event.currentTarget.value;
|
|
250
|
+
inputProps.onChange?.(event);
|
|
251
|
+
onQueryEdit?.();
|
|
252
|
+
props.onQueryChange(nextInput);
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
};
|
|
256
|
+
return {
|
|
257
|
+
options,
|
|
258
|
+
selectedItems,
|
|
259
|
+
scrollRef,
|
|
260
|
+
onMenuOpenChange,
|
|
261
|
+
onScroll: server ? () => checkScrollEnd() : void 0,
|
|
262
|
+
loadingMore: props.filterMode === "server" && props.isLoadingMore ? /* @__PURE__ */ jsx(LoadingMoreRow, { children: /* @__PURE__ */ jsx(Spinner, {
|
|
263
|
+
size: "sm",
|
|
264
|
+
srText: "Loading more options"
|
|
265
|
+
}) }) : null,
|
|
266
|
+
itemToKey,
|
|
267
|
+
filterOptions,
|
|
268
|
+
getQueryInputProps,
|
|
269
|
+
query: props.filterMode === "server" ? props.query : void 0,
|
|
270
|
+
onInputChange: server ? void 0 : props.onInputChange,
|
|
271
|
+
selectAll: !server && selectAll,
|
|
272
|
+
preserveOptionOrder: server
|
|
273
|
+
};
|
|
168
274
|
}
|
|
169
275
|
function buildVirtualRows(options, filteredOptions, indexRealToIndexVirtual) {
|
|
170
276
|
const rows = [];
|
|
@@ -392,6 +498,10 @@ const LoadingContainer = styled.div`
|
|
|
392
498
|
min-height: 136px;
|
|
393
499
|
padding: ${Spacing[3]};
|
|
394
500
|
`;
|
|
501
|
+
const LoadingMoreRow = styled(LoadingContainer)`
|
|
502
|
+
min-height: 0;
|
|
503
|
+
padding: ${Spacing[2]};
|
|
504
|
+
`;
|
|
395
505
|
const FooterActionContainer = styled.div`
|
|
396
506
|
flex-shrink: 0;
|
|
397
507
|
padding-top: ${Spacing[1]};
|
|
@@ -768,8 +878,14 @@ const CheckboxLabel = styled.span`
|
|
|
768
878
|
position: relative;
|
|
769
879
|
bottom: -1px;
|
|
770
880
|
`;
|
|
771
|
-
function ComboboxMultiSelectComponent(
|
|
772
|
-
const
|
|
881
|
+
function ComboboxMultiSelectComponent(componentProps, ref) {
|
|
882
|
+
const { size = "md", options: rawOptions, isOptionsLoading, filterMode: _filterMode, selectedOptions: _selectedOptions, query: _query, onQueryChange: _onQueryChange, onScrollEnd: _onScrollEnd, isLoadingMore: _isLoadingMore, values = [], onValuesChange, searchPlaceholder = "Search...", onInputChange: _onInputChange, placeholder = "Select an option...", emptyStateMessage = "No options found", disabled = false, hasWarning, hasError, required, id, labelId, "aria-label": ariaLabel, onOpenChange, truncate = false, selectAll: requestedSelectAll = false, stableOptionOrder = false, portal = false, portalContainerRef: externalPortalContainerRef, trigger, embedded = false, virtualize = false, footerAction, ...props } = {
|
|
883
|
+
onScrollEnd: void 0,
|
|
884
|
+
isLoadingMore: void 0,
|
|
885
|
+
...componentProps
|
|
886
|
+
};
|
|
887
|
+
const mode = useComboboxServerMode(componentProps, values, useMemo(() => containsNestedGroup(rawOptions) ? inlineNestedGroups(rawOptions) : rawOptions, [rawOptions]), requestedSelectAll);
|
|
888
|
+
const { options, selectedItems, selectAll } = mode;
|
|
773
889
|
const field = useFormField({
|
|
774
890
|
hasWarning,
|
|
775
891
|
hasError,
|
|
@@ -782,7 +898,7 @@ function ComboboxMultiSelectComponent({ size = "md", options: rawOptions, isOpti
|
|
|
782
898
|
const comboboxInputRef = useRef(null);
|
|
783
899
|
const caretButtonRef = useRef(null);
|
|
784
900
|
const comboboxContainerRef = useRef(null);
|
|
785
|
-
const scrollableListRef =
|
|
901
|
+
const scrollableListRef = mode.scrollRef;
|
|
786
902
|
const selectedItemsContainerRef = useRef(null);
|
|
787
903
|
const measurementStickerRefs = useRef([]);
|
|
788
904
|
const measurementTruncatorRef = useRef(null);
|
|
@@ -790,8 +906,7 @@ function ComboboxMultiSelectComponent({ size = "md", options: rawOptions, isOpti
|
|
|
790
906
|
setEmbeddedOpen(embedded);
|
|
791
907
|
}, [embedded]);
|
|
792
908
|
const portalContainerRef = externalPortalContainerRef || comboboxContainerRef;
|
|
793
|
-
const
|
|
794
|
-
const selectedItems = flatOptions.filter((option) => values.includes(option.value));
|
|
909
|
+
const preserveOptionOrder = stableOptionOrder || mode.preserveOptionOrder;
|
|
795
910
|
useEffect(() => {
|
|
796
911
|
measurementStickerRefs.current = measurementStickerRefs.current.slice(0, selectedItems.length);
|
|
797
912
|
}, [selectedItems.length]);
|
|
@@ -802,10 +917,14 @@ function ComboboxMultiSelectComponent({ size = "md", options: rawOptions, isOpti
|
|
|
802
917
|
if (searchInputRef.current) searchInputRef.current.focus();
|
|
803
918
|
}
|
|
804
919
|
}), []);
|
|
805
|
-
const filteredOptions =
|
|
920
|
+
const filteredOptions = useMemo(() => mode.filterOptions(options, inputValue), [
|
|
921
|
+
mode.filterOptions,
|
|
922
|
+
options,
|
|
923
|
+
inputValue
|
|
924
|
+
]);
|
|
806
925
|
const isGrouped = useMemo(() => options.some(isOptionGroup), [options]);
|
|
807
926
|
const optionsWithSelectedFirstInGroups = useMemo(() => {
|
|
808
|
-
if (!isGrouped || values.length === 0 ||
|
|
927
|
+
if (!isGrouped || values.length === 0 || preserveOptionOrder) return options;
|
|
809
928
|
return options.map((item) => {
|
|
810
929
|
if (isOptionGroup(item)) {
|
|
811
930
|
const groupLeaves = flattenOptions(item.options);
|
|
@@ -824,7 +943,7 @@ function ComboboxMultiSelectComponent({ size = "md", options: rawOptions, isOpti
|
|
|
824
943
|
options,
|
|
825
944
|
isGrouped,
|
|
826
945
|
values,
|
|
827
|
-
|
|
946
|
+
preserveOptionOrder
|
|
828
947
|
]);
|
|
829
948
|
const navigableItems = useMemo(() => {
|
|
830
949
|
const items = [];
|
|
@@ -838,7 +957,7 @@ function ComboboxMultiSelectComponent({ size = "md", options: rawOptions, isOpti
|
|
|
838
957
|
} else if (filteredOptions.some((f) => f.value === item.value)) items.push(item);
|
|
839
958
|
return items;
|
|
840
959
|
}
|
|
841
|
-
const orderedFiltered = !isGrouped && values.length > 0 && !
|
|
960
|
+
const orderedFiltered = !isGrouped && values.length > 0 && !preserveOptionOrder ? filteredOptions.toSorted((a, b) => {
|
|
842
961
|
const aSelected = values.includes(a.value);
|
|
843
962
|
if (aSelected === values.includes(b.value)) return 0;
|
|
844
963
|
return aSelected ? -1 : 1;
|
|
@@ -855,7 +974,7 @@ function ComboboxMultiSelectComponent({ size = "md", options: rawOptions, isOpti
|
|
|
855
974
|
isGrouped,
|
|
856
975
|
values,
|
|
857
976
|
optionsWithSelectedFirstInGroups,
|
|
858
|
-
|
|
977
|
+
preserveOptionOrder
|
|
859
978
|
]);
|
|
860
979
|
const optionsToRender = useMemo(() => {
|
|
861
980
|
if (!isGrouped && values.length > 0) return navigableItems;
|
|
@@ -895,6 +1014,7 @@ function ComboboxMultiSelectComponent({ size = "md", options: rawOptions, isOpti
|
|
|
895
1014
|
const getOptionId = useCallback((index) => `${field.inputId}-option-${index}`, [field.inputId]);
|
|
896
1015
|
const { addSelectedItem, getSelectedItemProps, getDropdownProps, removeSelectedItem, reset, setSelectedItems } = useMultipleSelection({
|
|
897
1016
|
selectedItems,
|
|
1017
|
+
itemToKey: mode.itemToKey,
|
|
898
1018
|
onStateChange: ({ selectedItems: newSelectedItems, type }) => {
|
|
899
1019
|
switch (type) {
|
|
900
1020
|
case useMultipleSelection.stateChangeTypes.SelectedItemKeyDownBackspace:
|
|
@@ -949,6 +1069,7 @@ function ComboboxMultiSelectComponent({ size = "md", options: rawOptions, isOpti
|
|
|
949
1069
|
const { isOpen, getToggleButtonProps, getMenuProps, getInputProps, getItemProps, highlightedIndex, setHighlightedIndex, closeMenu, openMenu } = useCombobox({
|
|
950
1070
|
items: navigableItems,
|
|
951
1071
|
itemToString,
|
|
1072
|
+
itemToKey: mode.itemToKey,
|
|
952
1073
|
getItemId: getOptionId,
|
|
953
1074
|
isOpen: embedded ? embeddedOpen : void 0,
|
|
954
1075
|
selectedItem: null,
|
|
@@ -967,7 +1088,7 @@ function ComboboxMultiSelectComponent({ size = "md", options: rawOptions, isOpti
|
|
|
967
1088
|
switch (type) {
|
|
968
1089
|
case useCombobox.stateChangeTypes.InputChange:
|
|
969
1090
|
setInputValue(newInputValue || "");
|
|
970
|
-
onInputChange?.(newInputValue || "");
|
|
1091
|
+
mode.onInputChange?.(newInputValue || "");
|
|
971
1092
|
break;
|
|
972
1093
|
case useCombobox.stateChangeTypes.InputKeyDownEnter:
|
|
973
1094
|
case useCombobox.stateChangeTypes.ItemClick:
|
|
@@ -1083,7 +1204,7 @@ function ComboboxMultiSelectComponent({ size = "md", options: rawOptions, isOpti
|
|
|
1083
1204
|
isOptionsLoading,
|
|
1084
1205
|
itemCount: navigableItems.length,
|
|
1085
1206
|
isMenuOpen,
|
|
1086
|
-
inputValue,
|
|
1207
|
+
inputValue: mode.query ?? inputValue,
|
|
1087
1208
|
highlightedIndex,
|
|
1088
1209
|
setHighlightedIndex,
|
|
1089
1210
|
inputId: field.inputId
|
|
@@ -1093,8 +1214,13 @@ function ComboboxMultiSelectComponent({ size = "md", options: rawOptions, isOpti
|
|
|
1093
1214
|
}, [isMenuOpen, openMenu]);
|
|
1094
1215
|
const dropdownPosition = useDropdownPosition(portalContainerRef, isMenuOpen, embedded ? false : portal);
|
|
1095
1216
|
useEffect(() => {
|
|
1217
|
+
mode.onMenuOpenChange(isMenuOpen);
|
|
1096
1218
|
onOpenChange?.(isMenuOpen);
|
|
1097
|
-
}, [
|
|
1219
|
+
}, [
|
|
1220
|
+
isMenuOpen,
|
|
1221
|
+
onOpenChange,
|
|
1222
|
+
mode.onMenuOpenChange
|
|
1223
|
+
]);
|
|
1098
1224
|
useEffect(() => {
|
|
1099
1225
|
if (isMenuOpen && navigableItems.length > 0 && !isFooterHighlighted) {
|
|
1100
1226
|
if (highlightedIndex === -1 || highlightedIndex >= navigableItems.length) setHighlightedIndex(0);
|
|
@@ -1179,8 +1305,9 @@ function ComboboxMultiSelectComponent({ size = "md", options: rawOptions, isOpti
|
|
|
1179
1305
|
const handleSearchInputBlur = useCallback((e) => {
|
|
1180
1306
|
if (!isMenuOpen) return;
|
|
1181
1307
|
const relatedTarget = e.relatedTarget;
|
|
1182
|
-
|
|
1183
|
-
|
|
1308
|
+
if (!(relatedTarget != null && (Boolean(comboboxContainerRef.current?.contains(relatedTarget)) || Boolean(relatedTarget.closest("#combobox-dropdown-portal-wrapper"))))) {
|
|
1309
|
+
if (!embedded) closeMenu();
|
|
1310
|
+
}
|
|
1184
1311
|
}, [
|
|
1185
1312
|
embedded,
|
|
1186
1313
|
isMenuOpen,
|
|
@@ -1227,7 +1354,7 @@ function ComboboxMultiSelectComponent({ size = "md", options: rawOptions, isOpti
|
|
|
1227
1354
|
return /* @__PURE__ */ jsx("div", {
|
|
1228
1355
|
ref: (el) => measurementStickerRefs.current[index] = el,
|
|
1229
1356
|
children: /* @__PURE__ */ jsx(Sticker, {
|
|
1230
|
-
variant:
|
|
1357
|
+
variant: item?.labelStickerVariant || "grey",
|
|
1231
1358
|
disabled: field.disabled,
|
|
1232
1359
|
children: item.label
|
|
1233
1360
|
})
|
|
@@ -1250,7 +1377,7 @@ function ComboboxMultiSelectComponent({ size = "md", options: rawOptions, isOpti
|
|
|
1250
1377
|
selectedItem: item,
|
|
1251
1378
|
index
|
|
1252
1379
|
});
|
|
1253
|
-
const stickerVariant =
|
|
1380
|
+
const stickerVariant = item?.labelStickerVariant || "grey";
|
|
1254
1381
|
return /* @__PURE__ */ jsx(TruncatedSticker, {
|
|
1255
1382
|
...stickerProps,
|
|
1256
1383
|
variant: stickerVariant,
|
|
@@ -1267,7 +1394,7 @@ function ComboboxMultiSelectComponent({ size = "md", options: rawOptions, isOpti
|
|
|
1267
1394
|
selectedItem: item,
|
|
1268
1395
|
index
|
|
1269
1396
|
});
|
|
1270
|
-
const stickerVariant =
|
|
1397
|
+
const stickerVariant = item?.labelStickerVariant || "grey";
|
|
1271
1398
|
return /* @__PURE__ */ jsx(Sticker, {
|
|
1272
1399
|
...stickerProps,
|
|
1273
1400
|
variant: stickerVariant,
|
|
@@ -1315,14 +1442,16 @@ function ComboboxMultiSelectComponent({ size = "md", options: rawOptions, isOpti
|
|
|
1315
1442
|
leftIcon: embedded ? void 0 : /* @__PURE__ */ jsx(SearchIcon, {}),
|
|
1316
1443
|
size,
|
|
1317
1444
|
children: /* @__PURE__ */ jsx(SearchInput, {
|
|
1318
|
-
...
|
|
1445
|
+
...mode.getQueryInputProps({
|
|
1446
|
+
...searchInputDownshiftProps,
|
|
1447
|
+
value: inputValue,
|
|
1448
|
+
onChange: (event) => {
|
|
1449
|
+
setInputValue(event.target.value);
|
|
1450
|
+
mode.onInputChange?.(event.target.value);
|
|
1451
|
+
}
|
|
1452
|
+
}, true, () => setHighlightedIndex(0)),
|
|
1319
1453
|
$embedded: embedded,
|
|
1320
1454
|
placeholder: searchPlaceholder,
|
|
1321
|
-
value: inputValue,
|
|
1322
|
-
onChange: (e) => {
|
|
1323
|
-
setInputValue(e.target.value);
|
|
1324
|
-
onInputChange?.(e.target.value);
|
|
1325
|
-
},
|
|
1326
1455
|
onKeyDown: handleSearchInputKeyDown,
|
|
1327
1456
|
onBlur: handleSearchInputBlur,
|
|
1328
1457
|
disabled: field.disabled,
|
|
@@ -1335,23 +1464,28 @@ function ComboboxMultiSelectComponent({ size = "md", options: rawOptions, isOpti
|
|
|
1335
1464
|
$embedded: embedded,
|
|
1336
1465
|
tabIndex: -1,
|
|
1337
1466
|
ref: scrollableListRef,
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1467
|
+
onScroll: mode.onScroll,
|
|
1468
|
+
children: isMenuOpen && /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
1469
|
+
isOptionsLoading ? /* @__PURE__ */ jsx(LoadingContainer, { children: /* @__PURE__ */ jsx(Spinner, { size: "md" }) }) : navigableItems.length > 0 ? renderOptionsWithGroups({
|
|
1470
|
+
options: optionsToRender,
|
|
1471
|
+
filteredOptions: navigableItems,
|
|
1472
|
+
renderOption,
|
|
1473
|
+
virtualizer: virtualize ? virtualizer : void 0,
|
|
1474
|
+
virtualRows: virtualize ? virtualRows : void 0
|
|
1475
|
+
}) : /* @__PURE__ */ jsx(EmptyState, {
|
|
1476
|
+
role: "status",
|
|
1477
|
+
"aria-live": "polite",
|
|
1478
|
+
size,
|
|
1479
|
+
children: emptyStateMessage
|
|
1480
|
+
}),
|
|
1481
|
+
mode.loadingMore,
|
|
1482
|
+
showFooterAction && footerAction && /* @__PURE__ */ jsx(FooterActionRow, {
|
|
1483
|
+
action: footerAction,
|
|
1484
|
+
size,
|
|
1485
|
+
id: footerActionId,
|
|
1486
|
+
isHighlighted: isFooterHighlighted
|
|
1487
|
+
})
|
|
1488
|
+
] })
|
|
1355
1489
|
})]
|
|
1356
1490
|
})
|
|
1357
1491
|
})]
|
|
@@ -1375,7 +1509,37 @@ const StyledMenuItem = styled(MenuItem)`
|
|
|
1375
1509
|
min-width: 0;
|
|
1376
1510
|
box-sizing: border-box;
|
|
1377
1511
|
}
|
|
1512
|
+
|
|
1513
|
+
/* MenuItem drops pointer events when disabled; keep them so the reason tooltip opens on hover.
|
|
1514
|
+
\`stateReducer\` refuses a click on a disabled option, so it still can't be picked. */
|
|
1515
|
+
&[aria-disabled='true'] {
|
|
1516
|
+
pointer-events: auto;
|
|
1517
|
+
}
|
|
1378
1518
|
`;
|
|
1519
|
+
/** Room the reason tooltip needs beside its row: its 250px max width, 8px offset and 8px margin. */
|
|
1520
|
+
const REASON_TOOLTIP_SPACE = 266;
|
|
1521
|
+
/**
|
|
1522
|
+
* A disabled option's reason, shown on hover. It opens to the right of the row, or above it when
|
|
1523
|
+
* the row reaches too close to the right edge of the screen (an embedded or narrow menu).
|
|
1524
|
+
*/
|
|
1525
|
+
function DisabledReasonTooltip({ reason, children }) {
|
|
1526
|
+
const [side, setSide] = useState("right");
|
|
1527
|
+
return /* @__PURE__ */ jsx(Tooltip, {
|
|
1528
|
+
trigger: children,
|
|
1529
|
+
triggerProps: { onPointerEnter: (event) => {
|
|
1530
|
+
const { right } = event.currentTarget.getBoundingClientRect();
|
|
1531
|
+
setSide(window.innerWidth - right >= REASON_TOOLTIP_SPACE ? "right" : "top");
|
|
1532
|
+
} },
|
|
1533
|
+
side,
|
|
1534
|
+
align: side === "top" ? "start" : "center",
|
|
1535
|
+
collisionPadding: 8,
|
|
1536
|
+
hideWhenDetached: true,
|
|
1537
|
+
size: "sm",
|
|
1538
|
+
zIndex: Z_INDICES.modalDropdownTooltip,
|
|
1539
|
+
interactive: false,
|
|
1540
|
+
children: reason
|
|
1541
|
+
});
|
|
1542
|
+
}
|
|
1379
1543
|
const ParentMenuItem = styled(MenuItem)`
|
|
1380
1544
|
${IconContainer} {
|
|
1381
1545
|
margin-right: 0;
|
|
@@ -1425,7 +1589,15 @@ const StickerComboboxInput = styled(ComboboxInput)`
|
|
|
1425
1589
|
color: transparent;
|
|
1426
1590
|
caret-color: transparent;
|
|
1427
1591
|
`;
|
|
1428
|
-
function ComboboxSingleSelectComponent(
|
|
1592
|
+
function ComboboxSingleSelectComponent(componentProps, ref) {
|
|
1593
|
+
const { size = "md", options: optionsProp, isOptionsLoading, filterMode: _filterMode, selectedOptions: _selectedOptions, query: _query, onQueryChange: _onQueryChange, onScrollEnd: _onScrollEnd, isLoadingMore: _isLoadingMore, value, onChange, optionDisabledReason, onInputChange: _onInputChange, placeholder = "Select an option...", emptyStateMessage = "No options found", disabled = false, hasWarning, hasError, required, id, labelId, "aria-label": ariaLabel, onOpenChange, portal = false, portalContainerRef: externalPortalContainerRef, trigger, embedded = false, footerAction, ...props } = {
|
|
1594
|
+
onScrollEnd: void 0,
|
|
1595
|
+
isLoadingMore: void 0,
|
|
1596
|
+
...componentProps
|
|
1597
|
+
};
|
|
1598
|
+
const clientOptions = useMemo(() => optionDisabledReason == null ? optionsProp : sortDisabledOptionsLast(optionsProp, (option) => optionDisabledReason(option) != null), [optionsProp, optionDisabledReason]);
|
|
1599
|
+
const mode = useComboboxServerMode(componentProps, useMemo(() => value == null ? [] : [value], [value]), clientOptions);
|
|
1600
|
+
const options = mode.options;
|
|
1429
1601
|
const field = useFormField({
|
|
1430
1602
|
hasWarning,
|
|
1431
1603
|
hasError,
|
|
@@ -1437,7 +1609,6 @@ function ComboboxSingleSelectComponent({ size = "md", options, isOptionsLoading,
|
|
|
1437
1609
|
const [navigationPath, setNavigationPath] = useState([]);
|
|
1438
1610
|
const comboboxInputRef = useRef(null);
|
|
1439
1611
|
const internalContainerRef = useRef(null);
|
|
1440
|
-
const pendingDescentRef = useRef(null);
|
|
1441
1612
|
const committedLabelRef = useRef(null);
|
|
1442
1613
|
const lastValueRef = useRef(value);
|
|
1443
1614
|
useEffect(() => {
|
|
@@ -1487,7 +1658,11 @@ function ComboboxSingleSelectComponent({ size = "md", options, isOptionsLoading,
|
|
|
1487
1658
|
hasNestedGroups
|
|
1488
1659
|
]);
|
|
1489
1660
|
const renderSource = isSearching ? hasNestedGroups ? searchableLeaves : options : nestedOptions;
|
|
1490
|
-
const standardFilteredOptions =
|
|
1661
|
+
const standardFilteredOptions = useMemo(() => mode.filterOptions(renderSource, inputValue), [
|
|
1662
|
+
mode.filterOptions,
|
|
1663
|
+
renderSource,
|
|
1664
|
+
inputValue
|
|
1665
|
+
]);
|
|
1491
1666
|
const filteredOptions = useMemo(() => {
|
|
1492
1667
|
if (!isSearching || !hasNestedGroups || searchableLeafFuse == null) return standardFilteredOptions;
|
|
1493
1668
|
if (inputValue === "") return searchableLeaves;
|
|
@@ -1513,9 +1688,7 @@ function ComboboxSingleSelectComponent({ size = "md", options, isOptionsLoading,
|
|
|
1513
1688
|
navigableItems
|
|
1514
1689
|
]);
|
|
1515
1690
|
const downshiftNodes = useMemo(() => new Set(downshiftItems.map((item) => item.kind === "group" ? item.group : item.option)), [downshiftItems]);
|
|
1516
|
-
const
|
|
1517
|
-
const flatOptionsForFallback = useMemo(() => flattenOptions(options), [options]);
|
|
1518
|
-
const selectedOption = allLeaves.find(({ option }) => option.value === value)?.option ?? flatOptionsForFallback.find((option) => option.value === value) ?? null;
|
|
1691
|
+
const selectedOption = mode.selectedItems[0] ?? null;
|
|
1519
1692
|
const selectedNavigableItem = useMemo(() => selectedOption ? {
|
|
1520
1693
|
kind: "leaf",
|
|
1521
1694
|
option: selectedOption
|
|
@@ -1528,30 +1701,26 @@ function ComboboxSingleSelectComponent({ size = "md", options, isOptionsLoading,
|
|
|
1528
1701
|
setNavigationPath((prev) => prev.length > 0 ? prev.slice(0, -1) : prev);
|
|
1529
1702
|
setInputValue("");
|
|
1530
1703
|
}, []);
|
|
1531
|
-
const handleDescend = useCallback((groupLabel) => {
|
|
1532
|
-
setNavigationPath((prev) => [...prev, groupLabel]);
|
|
1533
|
-
setInputValue("");
|
|
1534
|
-
}, []);
|
|
1535
1704
|
const isItemDisabled = useCallback((item) => item?.kind === "leaf" && optionDisabledReason?.(item.option) != null, [optionDisabledReason]);
|
|
1536
1705
|
const { isOpen, getToggleButtonProps, getMenuProps, getInputProps, getItemProps, highlightedIndex, setHighlightedIndex, openMenu } = useCombobox({
|
|
1537
1706
|
items: downshiftItems,
|
|
1538
1707
|
itemToString,
|
|
1539
|
-
|
|
1708
|
+
itemToKey: (item) => item?.kind === "leaf" ? mode.itemToKey(item.option) : item?.group.label,
|
|
1540
1709
|
isOpen: embedded ? isDropdownOpen : void 0,
|
|
1541
1710
|
selectedItem: isDropdownOpen ? null : selectedNavigableItem,
|
|
1542
|
-
inputValue,
|
|
1711
|
+
inputValue: isDropdownOpen ? mode.query ?? inputValue : inputValue,
|
|
1543
1712
|
onInputValueChange({ inputValue: newInputValue, type }) {
|
|
1544
1713
|
if (type === useCombobox.stateChangeTypes.ControlledPropUpdatedSelectedItem && isDropdownOpen && !embedded) return;
|
|
1545
|
-
const isUserEdit = type === useCombobox.stateChangeTypes.InputChange || type === useCombobox.stateChangeTypes.InputKeyDownEscape;
|
|
1714
|
+
const isUserEdit = type === useCombobox.stateChangeTypes.InputChange && (mode.query === void 0 || !isDropdownOpen) || type === useCombobox.stateChangeTypes.InputKeyDownEscape;
|
|
1546
1715
|
if (newInputValue === "" && isUserEdit && !embedded && trigger == null) onChange?.(null);
|
|
1547
1716
|
setInputValue(newInputValue || "");
|
|
1548
|
-
onInputChange?.(newInputValue || "");
|
|
1717
|
+
mode.onInputChange?.(newInputValue || "");
|
|
1549
1718
|
},
|
|
1550
1719
|
onIsOpenChange({ isOpen: newIsOpen }) {
|
|
1551
1720
|
if (embedded) return;
|
|
1552
1721
|
setIsDropdownOpen(newIsOpen);
|
|
1553
1722
|
if (newIsOpen) {
|
|
1554
|
-
if (selectedOption || committedLabelRef.current != null
|
|
1723
|
+
if (selectedOption || committedLabelRef.current != null) setInputValue("");
|
|
1555
1724
|
} else setInputValue(committedLabelRef.current ?? selectedOption?.label ?? "");
|
|
1556
1725
|
},
|
|
1557
1726
|
onSelectedItemChange: ({ selectedItem: newSelectedItem }) => {
|
|
@@ -1577,27 +1746,22 @@ function ComboboxSingleSelectComponent({ size = "md", options, isOptionsLoading,
|
|
|
1577
1746
|
case useCombobox.stateChangeTypes.InputKeyDownEnter: {
|
|
1578
1747
|
const candidate = changes.selectedItem;
|
|
1579
1748
|
if (candidate?.kind === "leaf" && optionDisabledReason?.(candidate.option) != null) return state;
|
|
1580
|
-
if (candidate && candidate.kind === "group") {
|
|
1581
|
-
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
isOpen: true
|
|
1586
|
-
};
|
|
1587
|
-
}
|
|
1749
|
+
if (candidate && candidate.kind === "group") return {
|
|
1750
|
+
...changes,
|
|
1751
|
+
selectedItem: state.selectedItem,
|
|
1752
|
+
isOpen: true
|
|
1753
|
+
};
|
|
1588
1754
|
return changes;
|
|
1589
1755
|
}
|
|
1590
1756
|
default: return changes;
|
|
1591
1757
|
}
|
|
1592
1758
|
}
|
|
1593
1759
|
});
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
}
|
|
1600
|
-
});
|
|
1760
|
+
const handleDescend = useCallback((groupLabel) => {
|
|
1761
|
+
setNavigationPath((prev) => [...prev, groupLabel]);
|
|
1762
|
+
setInputValue("");
|
|
1763
|
+
setHighlightedIndex(-1);
|
|
1764
|
+
}, [setHighlightedIndex]);
|
|
1601
1765
|
useEffect(() => {
|
|
1602
1766
|
if (!isOpen && !embedded && navigationPath.length > 0) setNavigationPath([]);
|
|
1603
1767
|
}, [
|
|
@@ -1616,7 +1780,8 @@ function ComboboxSingleSelectComponent({ size = "md", options, isOptionsLoading,
|
|
|
1616
1780
|
option
|
|
1617
1781
|
},
|
|
1618
1782
|
index: currentIndex,
|
|
1619
|
-
"aria-selected": isSelected
|
|
1783
|
+
"aria-selected": isSelected,
|
|
1784
|
+
"aria-disabled": disabledReason != null ? true : void 0
|
|
1620
1785
|
});
|
|
1621
1786
|
const labelContent = option.labelStickerVariant ? /* @__PURE__ */ jsx(Sticker, {
|
|
1622
1787
|
variant: option.labelStickerVariant,
|
|
@@ -1629,7 +1794,8 @@ function ComboboxSingleSelectComponent({ size = "md", options, isOptionsLoading,
|
|
|
1629
1794
|
title: option.description,
|
|
1630
1795
|
children: option.description
|
|
1631
1796
|
})] });
|
|
1632
|
-
|
|
1797
|
+
const key = `leaf-${String(option.value)}-${currentIndex}`;
|
|
1798
|
+
const item = /* @__PURE__ */ jsxs(StyledMenuItem, {
|
|
1633
1799
|
...itemProps,
|
|
1634
1800
|
disabled: disabledReason != null,
|
|
1635
1801
|
"aria-describedby": disabledReason != null ? descriptionId : void 0,
|
|
@@ -1637,11 +1803,16 @@ function ComboboxSingleSelectComponent({ size = "md", options, isOptionsLoading,
|
|
|
1637
1803
|
selected: isSelected,
|
|
1638
1804
|
size,
|
|
1639
1805
|
tabIndex: -1,
|
|
1640
|
-
children: [labelContent, disabledReason != null && /* @__PURE__ */ jsx(
|
|
1806
|
+
children: [labelContent, disabledReason != null && /* @__PURE__ */ jsx("span", {
|
|
1641
1807
|
id: descriptionId,
|
|
1808
|
+
hidden: true,
|
|
1642
1809
|
children: disabledReason
|
|
1643
1810
|
})]
|
|
1644
|
-
},
|
|
1811
|
+
}, key);
|
|
1812
|
+
return disabledReason == null ? item : /* @__PURE__ */ jsx(DisabledReasonTooltip, {
|
|
1813
|
+
reason: disabledReason,
|
|
1814
|
+
children: item
|
|
1815
|
+
}, key);
|
|
1645
1816
|
}, [
|
|
1646
1817
|
highlightedIndex,
|
|
1647
1818
|
selectedOption,
|
|
@@ -1660,6 +1831,7 @@ function ComboboxSingleSelectComponent({ size = "md", options, isOptionsLoading,
|
|
|
1660
1831
|
},
|
|
1661
1832
|
index: currentIndex
|
|
1662
1833
|
}),
|
|
1834
|
+
onClick: () => handleDescend(group.label),
|
|
1663
1835
|
"aria-haspopup": "menu",
|
|
1664
1836
|
focused: isHighlighted,
|
|
1665
1837
|
prefixIcon: group.prefixIcon,
|
|
@@ -1681,7 +1853,8 @@ function ComboboxSingleSelectComponent({ size = "md", options, isOptionsLoading,
|
|
|
1681
1853
|
}, [
|
|
1682
1854
|
highlightedIndex,
|
|
1683
1855
|
getItemProps,
|
|
1684
|
-
size
|
|
1856
|
+
size,
|
|
1857
|
+
handleDescend
|
|
1685
1858
|
]);
|
|
1686
1859
|
const renderNestedLevel = useCallback((items) => {
|
|
1687
1860
|
let navIndex = -1;
|
|
@@ -1716,27 +1889,14 @@ function ComboboxSingleSelectComponent({ size = "md", options, isOptionsLoading,
|
|
|
1716
1889
|
if (embedded && isMenuOpen && comboboxInputRef.current) comboboxInputRef.current.focus({ preventScroll: true });
|
|
1717
1890
|
}, [embedded, isMenuOpen]);
|
|
1718
1891
|
const dropdownPosition = useDropdownPosition(portalContainerRef, isMenuOpen, embedded ? false : portal);
|
|
1719
|
-
const
|
|
1720
|
-
let firstNavigableIndex = -1;
|
|
1721
|
-
let lastNavigableIndex = -1;
|
|
1722
|
-
downshiftItems.forEach((item, index) => {
|
|
1723
|
-
if (isItemDisabled(item)) return;
|
|
1724
|
-
if (firstNavigableIndex === -1) firstNavigableIndex = index;
|
|
1725
|
-
lastNavigableIndex = index;
|
|
1726
|
-
});
|
|
1727
|
-
return {
|
|
1728
|
-
firstNavigableIndex,
|
|
1729
|
-
lastNavigableIndex
|
|
1730
|
-
};
|
|
1731
|
-
}, [downshiftItems, isItemDisabled]);
|
|
1892
|
+
const firstEnabledIndex = useMemo(() => downshiftItems.findIndex((item) => !isItemDisabled(item)), [downshiftItems, isItemDisabled]);
|
|
1732
1893
|
const { isFooterHighlighted, footerActionId, showFooterAction, handleFooterKeyDown } = useComboboxFooterAction({
|
|
1733
1894
|
footerAction,
|
|
1734
1895
|
isOptionsLoading,
|
|
1735
1896
|
itemCount: downshiftItems.length,
|
|
1736
|
-
firstNavigableIndex,
|
|
1737
|
-
lastNavigableIndex,
|
|
1897
|
+
firstNavigableIndex: downshiftItems.length > 0 ? 0 : -1,
|
|
1738
1898
|
isMenuOpen,
|
|
1739
|
-
inputValue,
|
|
1899
|
+
inputValue: mode.query ?? inputValue,
|
|
1740
1900
|
highlightedIndex,
|
|
1741
1901
|
setHighlightedIndex,
|
|
1742
1902
|
inputId: field.inputId
|
|
@@ -1749,14 +1909,13 @@ function ComboboxSingleSelectComponent({ size = "md", options, isOptionsLoading,
|
|
|
1749
1909
|
if (!isMenuOpen) return;
|
|
1750
1910
|
if (handleFooterKeyDown(event)) return;
|
|
1751
1911
|
if (isSearching) return;
|
|
1752
|
-
if (event.key === "Enter"
|
|
1753
|
-
event.stopPropagation();
|
|
1754
|
-
return;
|
|
1755
|
-
}
|
|
1756
|
-
if (event.key === "ArrowRight") {
|
|
1912
|
+
if (event.key === "Enter" || event.key === "ArrowRight") {
|
|
1757
1913
|
const highlighted = downshiftItems[highlightedIndex];
|
|
1758
|
-
if (highlighted
|
|
1914
|
+
if (highlighted?.kind === "group") {
|
|
1759
1915
|
event.preventDefault();
|
|
1916
|
+
if (event.key === "Enter") event.stopPropagation();
|
|
1917
|
+
const nativeEvent = event.nativeEvent;
|
|
1918
|
+
nativeEvent.preventDownshiftDefault = true;
|
|
1760
1919
|
handleDescend(highlighted.group.label);
|
|
1761
1920
|
}
|
|
1762
1921
|
return;
|
|
@@ -1780,8 +1939,13 @@ function ComboboxSingleSelectComponent({ size = "md", options, isOptionsLoading,
|
|
|
1780
1939
|
handleAscend
|
|
1781
1940
|
]);
|
|
1782
1941
|
useEffect(() => {
|
|
1942
|
+
mode.onMenuOpenChange(isMenuOpen);
|
|
1783
1943
|
onOpenChange?.(isMenuOpen);
|
|
1784
|
-
}, [
|
|
1944
|
+
}, [
|
|
1945
|
+
isMenuOpen,
|
|
1946
|
+
onOpenChange,
|
|
1947
|
+
mode.onMenuOpenChange
|
|
1948
|
+
]);
|
|
1785
1949
|
useEffect(() => {
|
|
1786
1950
|
if (!embedded && !isMenuOpen) setInputValue(committedLabelRef.current ?? selectedOption?.label ?? "");
|
|
1787
1951
|
}, [
|
|
@@ -1789,19 +1953,23 @@ function ComboboxSingleSelectComponent({ size = "md", options, isOptionsLoading,
|
|
|
1789
1953
|
selectedOption,
|
|
1790
1954
|
isMenuOpen
|
|
1791
1955
|
]);
|
|
1956
|
+
const levelKey = JSON.stringify([navigationPath, mode.query ?? inputValue]);
|
|
1957
|
+
const levelKeyRef = useRef(levelKey);
|
|
1792
1958
|
useEffect(() => {
|
|
1793
|
-
|
|
1959
|
+
const levelChanged = levelKeyRef.current !== levelKey;
|
|
1960
|
+
levelKeyRef.current = levelKey;
|
|
1961
|
+
if (!isMenuOpen || isFooterHighlighted || firstEnabledIndex === -1) return;
|
|
1794
1962
|
const highlighted = downshiftItems[highlightedIndex];
|
|
1795
|
-
if (highlighted
|
|
1796
|
-
if (highlightedIndex !== firstNavigableIndex) setHighlightedIndex(firstNavigableIndex);
|
|
1963
|
+
if (highlighted == null || levelChanged && isItemDisabled(highlighted)) setHighlightedIndex(firstEnabledIndex);
|
|
1797
1964
|
}, [
|
|
1798
1965
|
downshiftItems,
|
|
1799
1966
|
isMenuOpen,
|
|
1800
1967
|
highlightedIndex,
|
|
1801
1968
|
isFooterHighlighted,
|
|
1802
1969
|
setHighlightedIndex,
|
|
1970
|
+
firstEnabledIndex,
|
|
1803
1971
|
isItemDisabled,
|
|
1804
|
-
|
|
1972
|
+
levelKey
|
|
1805
1973
|
]);
|
|
1806
1974
|
const displayValue = isMenuOpen ? inputValue : committedLabelRef.current ?? selectedOption?.label ?? "";
|
|
1807
1975
|
const hasSticker = !isMenuOpen && selectedOption?.labelStickerVariant;
|
|
@@ -1853,12 +2021,14 @@ function ComboboxSingleSelectComponent({ size = "md", options, isOptionsLoading,
|
|
|
1853
2021
|
children: selectedOption.label
|
|
1854
2022
|
}),
|
|
1855
2023
|
/* @__PURE__ */ jsx(InputComponent, {
|
|
1856
|
-
...
|
|
2024
|
+
...mode.getQueryInputProps({
|
|
2025
|
+
...mainInputProps,
|
|
2026
|
+
value: displayValue
|
|
2027
|
+
}, isMenuOpen),
|
|
1857
2028
|
size,
|
|
1858
2029
|
$isOpen: isMenuOpen,
|
|
1859
2030
|
hasWarning: field.hasWarning,
|
|
1860
2031
|
hasError: field.hasError,
|
|
1861
|
-
value: displayValue,
|
|
1862
2032
|
$selectedItemStyle: selectedOption?.PLEASE_DO_NOT_USE_labelFontStyle
|
|
1863
2033
|
}),
|
|
1864
2034
|
/* @__PURE__ */ jsx(CaretButton, {
|
|
@@ -1887,17 +2057,21 @@ function ComboboxSingleSelectComponent({ size = "md", options, isOptionsLoading,
|
|
|
1887
2057
|
size,
|
|
1888
2058
|
children: /* @__PURE__ */ jsx(SearchInput, {
|
|
1889
2059
|
$embedded: embedded,
|
|
1890
|
-
...
|
|
2060
|
+
...mode.getQueryInputProps({
|
|
2061
|
+
...searchInputProps,
|
|
2062
|
+
value: inputValue
|
|
2063
|
+
}),
|
|
1891
2064
|
size,
|
|
1892
2065
|
hasWarning: field.hasWarning,
|
|
1893
2066
|
hasError: field.hasError,
|
|
1894
|
-
value: inputValue,
|
|
1895
2067
|
autoComplete: "off"
|
|
1896
2068
|
})
|
|
1897
2069
|
})
|
|
1898
2070
|
}), /* @__PURE__ */ jsx(SingleSelectScrollableMenuList, {
|
|
1899
2071
|
$embedded: embedded,
|
|
1900
2072
|
tabIndex: -1,
|
|
2073
|
+
ref: mode.scrollRef,
|
|
2074
|
+
onScroll: mode.onScroll,
|
|
1901
2075
|
children: isMenuOpen && /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
1902
2076
|
showBackRow && /* @__PURE__ */ jsxs(BackRow, {
|
|
1903
2077
|
type: "button",
|
|
@@ -1926,6 +2100,7 @@ function ComboboxSingleSelectComponent({ size = "md", options, isOptionsLoading,
|
|
|
1926
2100
|
size,
|
|
1927
2101
|
children: emptyStateMessage
|
|
1928
2102
|
}),
|
|
2103
|
+
mode.loadingMore,
|
|
1929
2104
|
showFooterAction && footerAction && /* @__PURE__ */ jsx(FooterActionRow, {
|
|
1930
2105
|
action: footerAction,
|
|
1931
2106
|
size,
|
|
@@ -1955,4 +2130,4 @@ const Combobox = forwardRef(ComboboxComponent);
|
|
|
1955
2130
|
//#endregion
|
|
1956
2131
|
export { CaretButton as n, flattenOptions as r, Combobox as t };
|
|
1957
2132
|
|
|
1958
|
-
//# sourceMappingURL=Combobox-
|
|
2133
|
+
//# sourceMappingURL=Combobox-BNjYEAmv.mjs.map
|