@ryuzaki13/react-foundation-ui 3.8.0 → 3.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/multi-select/index.js +5 -5
- package/dist/multi-select/index.js.map +1 -1
- package/dist/multi-select/lib/adaptLegacyMultiSelectContext.d.ts +4 -4
- package/dist/multi-select/lib/adaptLegacyMultiSelectContext.d.ts.map +1 -1
- package/dist/multi-select/lib/createMultiSelectOptionSections.d.ts +3 -3
- package/dist/multi-select/lib/createMultiSelectOptionSections.d.ts.map +1 -1
- package/dist/multi-select/lib/multiSelectSelection.d.ts +2 -2
- package/dist/multi-select/lib/multiSelectSelection.d.ts.map +1 -1
- package/dist/multi-select/ui/DeprecatedMultiSelect.d.ts +41 -0
- package/dist/multi-select/ui/DeprecatedMultiSelect.d.ts.map +1 -0
- package/dist/multi-select/ui/MultiSelect.d.ts +19 -28
- package/dist/multi-select/ui/MultiSelect.d.ts.map +1 -1
- package/dist/multi-select/ui/MultiSelectCore.d.ts +13 -0
- package/dist/multi-select/ui/MultiSelectCore.d.ts.map +1 -0
- package/dist/multi-select/ui/MultiSelectOptionList.d.ts +5 -5
- package/dist/multi-select/ui/MultiSelectOptionList.d.ts.map +1 -1
- package/dist/multi-select/ui/MultiSelectOptionRow.d.ts +4 -4
- package/dist/multi-select/ui/MultiSelectOptionRow.d.ts.map +1 -1
- package/dist/multi-select/ui/SerializableMultiSelect.d.ts.map +1 -1
- package/dist/multi-select/ui/index.d.ts +2 -2
- package/dist/multi-select/ui/index.d.ts.map +1 -1
- package/dist/multi-select/ui/legacyMultiSelectTypes.d.ts +4 -4
- package/dist/multi-select/ui/legacyMultiSelectTypes.d.ts.map +1 -1
- package/dist/multi-select/ui/{optionMultiSelectTypes.d.ts → multiSelectTypes.d.ts} +13 -13
- package/dist/multi-select/ui/multiSelectTypes.d.ts.map +1 -0
- package/package.json +1 -1
- package/storybook-static/assets/{Badge-uLn0juvN.js → Badge-EK9gQx9e.js} +1 -1
- package/storybook-static/assets/{Badge.stories-vAeQxF59.js → Badge.stories-CtgtZ5eo.js} +1 -1
- package/storybook-static/assets/{BadgeList-CY_L4VvY.js → BadgeList-C8Szc3WZ.js} +1 -1
- package/storybook-static/assets/{BarcodeScannerDialog.stories-C_M9fRVa.js → BarcodeScannerDialog.stories-BRpvqkgE.js} +1 -1
- package/storybook-static/assets/{Button-B9K2X1Qh.js → Button-CiBLpfB4.js} +1 -1
- package/storybook-static/assets/{Button-_CwdBR3k.js → Button-DaL6GfgY.js} +1 -1
- package/storybook-static/assets/{Button.stories-BOyxeyZ-.js → Button.stories-C7LxYTQb.js} +1 -1
- package/storybook-static/assets/{CalendarView-DI5Xyd8e.js → CalendarView-B5maPbIS.js} +1 -1
- package/storybook-static/assets/{CheckBox-ivX0kZSD.js → CheckBox-DXdhv4Lf.js} +1 -1
- package/storybook-static/assets/{CheckBox-CyH0yqmm.js → CheckBox-xWQASPSK.js} +1 -1
- package/storybook-static/assets/{CheckBox.stories-ISH4Prdw.js → CheckBox.stories-B0TljSQ3.js} +1 -1
- package/storybook-static/assets/{Color-6AOWCN3U-Tqykt5jy.js → Color-6AOWCN3U-CtC_yr9J.js} +1 -1
- package/storybook-static/assets/{ContextMenu-DwLCPnoN.js → ContextMenu-DMPKMqfn.js} +1 -1
- package/storybook-static/assets/{ContextMenu-PCdqGJxx.js → ContextMenu-Dz3oD_WF.js} +1 -1
- package/storybook-static/assets/{ContextMenu.stories-4FfiXmxn.js → ContextMenu.stories-D_ozImXJ.js} +1 -1
- package/storybook-static/assets/{DateInput-Bc1Wy65t.js → DateInput-CeLmydmh.js} +1 -1
- package/storybook-static/assets/{DateInput-L-Y80kKJ.js → DateInput-Dm9hU8oI.js} +1 -1
- package/storybook-static/assets/{DateInput.stories-JchxtVkw.js → DateInput.stories-B_IZPZqF.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-bU-gFcj2.js → DateRangePresetSelect-CH7Mmtrc.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-Cedah5Yp.js → DateRangePresetSelect-DTkAwI-o.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect.stories-DvEWNS_W.js → DateRangePresetSelect.stories-C6gIY87L.js} +1 -1
- package/storybook-static/assets/DeprecatedMultiSelect-CX5U1Wb1.js +1 -0
- package/storybook-static/assets/{MultiSelect-BSwE_oBc.js → DeprecatedMultiSelect-EaJ_mQ1Q.js} +14 -11
- package/storybook-static/assets/DeprecatedMultiSelect.stories-Bo6fL6Zr.js +55 -0
- package/storybook-static/assets/{Detail-CWlXU9CA.js → Detail-CCh7sDpc.js} +1 -1
- package/storybook-static/assets/{Detail.stories-OukjnklW.js → Detail.stories-RskA9Xs8.js} +1 -1
- package/storybook-static/assets/{Dialog-CkabwirS.js → Dialog-ChxYkiWk.js} +1 -1
- package/storybook-static/assets/{Dialog-rVSalesb.js → Dialog-DKMGI2PI.js} +1 -1
- package/storybook-static/assets/{Dialog.stories-BXQhdz__.js → Dialog.stories-CGdnARk7.js} +1 -1
- package/storybook-static/assets/{Disclosure-Dr8Lhnhy.js → Disclosure-CgnOdAzR.js} +1 -1
- package/storybook-static/assets/{Disclosure.stories-DZ3cPTHU.js → Disclosure.stories-DgfVdZ8V.js} +1 -1
- package/storybook-static/assets/{DisclosureGroup-CY6Yb_J_.js → DisclosureGroup-CjcLktuT.js} +1 -1
- package/storybook-static/assets/{DocsRenderer-JROSPFPF-DDBN-s9I.js → DocsRenderer-JROSPFPF-CiPiMqkv.js} +1 -1
- package/storybook-static/assets/{DropZone-DcKtndvt.js → DropZone-Cp8Wufyw.js} +1 -1
- package/storybook-static/assets/{DropZone-BGx1oE5x.js → DropZone-DQ73_0Pf.js} +1 -1
- package/storybook-static/assets/{DropZone.stories-CdroZ3KP.js → DropZone.stories-DP_hFMc_.js} +1 -1
- package/storybook-static/assets/{DropdownMenu-BCw6UYmi.js → DropdownMenu-DaXeJjTB.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel-DBeRCLiz.js → ExpandableActionPanel-D6BzMChs.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel.stories-Dk2b0dZ7.js → ExpandableActionPanel.stories-B5_ZvkZK.js} +1 -1
- package/storybook-static/assets/{Flex-BGCt2Ty4.js → Flex-CzSeUflw.js} +1 -1
- package/storybook-static/assets/{Flex.stories-TNfwUrEG.js → Flex.stories-4xln9Tx7.js} +1 -1
- package/storybook-static/assets/{FlexContainer-Cp7KpERB.js → FlexContainer-CUkvfdhf.js} +1 -1
- package/storybook-static/assets/{FlexItem-CgSxHUjW.js → FlexItem-DxLk1kGw.js} +1 -1
- package/storybook-static/assets/{FloatingPopover-DuSkz_S2.js → FloatingPopover-BN7M-D7P.js} +1 -1
- package/storybook-static/assets/{FormattedTableCell-DxTBvVfJ.js → FormattedTableCell-D-neZi6J.js} +1 -1
- package/storybook-static/assets/{Grid-QVmgVzoV.js → Grid-B8BNlV5p.js} +1 -1
- package/storybook-static/assets/{Grid-CJKjOeEG.js → Grid-Bbyr5bon.js} +1 -1
- package/storybook-static/assets/{Grid.stories-DPcBuL8b.js → Grid.stories-D-uV0QMB.js} +1 -1
- package/storybook-static/assets/{GridContainer-CotR1WQh.js → GridContainer-2Q2ODK51.js} +1 -1
- package/storybook-static/assets/{ImageCropper.stories-Cgu7OqIp.js → ImageCropper.stories-Dtt2FAGL.js} +1 -1
- package/storybook-static/assets/{ImageRenderer-BUC_GBJ2.js → ImageRenderer-BjtFa8z8.js} +1 -1
- package/storybook-static/assets/{ImageRenderer.stories-Dt493hYg.js → ImageRenderer.stories-BKcYCMTG.js} +1 -1
- package/storybook-static/assets/{ImageView.stories-BLn05DXS.js → ImageView.stories-BqgrUQOD.js} +1 -1
- package/storybook-static/assets/{ImageViewer.stories-C19infAQ.js → ImageViewer.stories-CW8xG4Dn.js} +2 -2
- package/storybook-static/assets/{ImageViewerRuntime-rN0RzFEB.js → ImageViewerRuntime-BouFP69S.js} +1 -1
- package/storybook-static/assets/{Input-CvT5iV9z.js → Input-DKfVkFor.js} +1 -1
- package/storybook-static/assets/{Input-cRia6EnE.js → Input-DSoJ1bPZ.js} +1 -1
- package/storybook-static/assets/{Input.stories-HLHRUjA7.js → Input.stories-DzI_GHu4.js} +1 -1
- package/storybook-static/assets/{InputDateTime-Cc1JktSi.js → InputDateTime-F_UMqLSE.js} +1 -1
- package/storybook-static/assets/{InputDateTime.stories-D53nmoks.js → InputDateTime.stories-BZofscBL.js} +1 -1
- package/storybook-static/assets/{InputFile-sJ25-ukA.js → InputFile-DgDsyDsY.js} +1 -1
- package/storybook-static/assets/{InputFile-BsC6k9CX.js → InputFile-Ducp25c4.js} +1 -1
- package/storybook-static/assets/{InputFile.stories-DB-782ch.js → InputFile.stories-DlaBCWWc.js} +1 -1
- package/storybook-static/assets/{InputFiles-CZIFzjW7.js → InputFiles-5sqxbwqq.js} +1 -1
- package/storybook-static/assets/{InputFiles-BSnj81Jt.js → InputFiles-E1Lv_1S-.js} +1 -1
- package/storybook-static/assets/{InputFiles.stories-CMayp1MA.js → InputFiles.stories-CMWGpeMF.js} +1 -1
- package/storybook-static/assets/{InputFilesList-Bm6PVcf-.js → InputFilesList-BhKPPY0s.js} +1 -1
- package/storybook-static/assets/{InputImage-BSO7ZMcf.js → InputImage-Bml_XdoH.js} +1 -1
- package/storybook-static/assets/{InputImage-B7qUyJja.js → InputImage-dJAnInGG.js} +1 -1
- package/storybook-static/assets/{InputImage.stories-DaJtPzZj.js → InputImage.stories-6DtkfR4R.js} +1 -1
- package/storybook-static/assets/{InteractiveComponents-iNV7x7WW.js → InteractiveComponents-4E2d9zH2.js} +3 -3
- package/storybook-static/assets/{InteractiveComponents.stories-D7I6ysOH.js → InteractiveComponents.stories-BU4phFyf.js} +2 -2
- package/storybook-static/assets/{LayoutPicker-DcAfPDfE.js → LayoutPicker-CowWslXH.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-_RIOJ_qN.js → LayoutPicker-VdWtkSuS.js} +1 -1
- package/storybook-static/assets/{LayoutPicker.stories-CIGzD6OV.js → LayoutPicker.stories-CixcTM0K.js} +1 -1
- package/storybook-static/assets/{Listbox-D6QEqJxm.js → Listbox-BMbMW6QU.js} +1 -1
- package/storybook-static/assets/{Listbox-DTJfHCCi.js → Listbox-Bdk5_SQj.js} +1 -1
- package/storybook-static/assets/{Listbox.stories-BHm9e3kt.js → Listbox.stories-CICddsFG.js} +1 -1
- package/storybook-static/assets/{Modal-soD4yzlp.js → Modal-BmtPDyvC.js} +1 -1
- package/storybook-static/assets/{Modal-CFo0PqWY.js → Modal-LszfoLT0.js} +1 -1
- package/storybook-static/assets/{Modal.stories-Cwmx-hgp.js → Modal.stories-COopXi-m.js} +1 -1
- package/storybook-static/assets/{ModalManagerProvider-BF08D_uQ.js → ModalManagerProvider-Dwy_KGoK.js} +1 -1
- package/storybook-static/assets/MultiSelect-D8OZAHlg.js +1 -0
- package/storybook-static/assets/{OptionMultiSelect-BtULWPnH.js → MultiSelect-D9E5MjIr.js} +9 -8
- package/storybook-static/assets/MultiSelect.stories-BNy8uqkv.js +64 -0
- package/storybook-static/assets/{OptionMultiSelectCore-D8cGuRYM.js → MultiSelectCore-Ds4jXHOk.js} +2 -2
- package/storybook-static/assets/{NoData-CWK82Q1i.js → NoData-D9Sjnk2c.js} +1 -1
- package/storybook-static/assets/{NotificationsHost-DmFTlzqz.js → NotificationsHost-D0Pk-Yqg.js} +1 -1
- package/storybook-static/assets/{NotificationsHost.stories-DGnDAG9L.js → NotificationsHost.stories-CEUX8dAF.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect-rXpV6DVc.js → ODataMultiSelect-BxNC8zss.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect.stories-BK7inW-H.js → ODataMultiSelect.stories-BLourbRQ.js} +1 -1
- package/storybook-static/assets/{ODataSelect-ChMv3gAt.js → ODataSelect-DvZjbRtG.js} +1 -1
- package/storybook-static/assets/{ODataSelect.stories-CWgCeuUZ.js → ODataSelect.stories-CswbeNTT.js} +1 -1
- package/storybook-static/assets/{ODataTreeMultiSelect--K1Cr5rs.js → ODataTreeMultiSelect-DagrfWBY.js} +1 -1
- package/storybook-static/assets/{ODataTreeMultiSelect.stories-DkqcOU54.js → ODataTreeMultiSelect.stories-TbWSFRbD.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect-CXPOA45d.js → ODataTreeSelect-BLNFg44u.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect.stories-Arr35qIR.js → ODataTreeSelect.stories-BKCm0DtZ.js} +1 -1
- package/storybook-static/assets/{OneStepScroller-DektyW3p.js → OneStepScroller-NyCOFbAV.js} +1 -1
- package/storybook-static/assets/{Option-DK4dHhT1.js → Option-B82YmTfK.js} +1 -1
- package/storybook-static/assets/{OptionButton-CsOv8dZ_.js → OptionButton-CmHVNPma.js} +1 -1
- package/storybook-static/assets/{OptionContent-DgSmB8T-.js → OptionContent-BG9-OWJw.js} +1 -1
- package/storybook-static/assets/{OptionContentContainer-ROUyLVX_.js → OptionContentContainer-CU1GwCic.js} +1 -1
- package/storybook-static/assets/{PeriodSelect-DrO6n1An.js → PeriodSelect-B9MQy6oj.js} +1 -1
- package/storybook-static/assets/{PeriodSelect-yuiZbhil.js → PeriodSelect-kOE0lDjL.js} +1 -1
- package/storybook-static/assets/{PeriodSelect.stories-BEicKdLp.js → PeriodSelect.stories-BTASzqE2.js} +1 -1
- package/storybook-static/assets/{PickerField-nBBELo78.js → PickerField--0kZhFr0.js} +1 -1
- package/storybook-static/assets/{PickerTriggerActions-CkKNIp3y.js → PickerTriggerActions-DAjE-u3Q.js} +1 -1
- package/storybook-static/assets/{Popover-CvpieQDS.js → Popover-7L-pHu2i.js} +1 -1
- package/storybook-static/assets/{Popover-Bf4a7PIe.js → Popover-BLuKIsin.js} +1 -1
- package/storybook-static/assets/{Popover.stories-CetSmVHK.js → Popover.stories-DqwCkB57.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-D1uKkeQM.js → PresetRangeDateInput-Ctf7L0HP.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-VqFGeOlz.js → PresetRangeDateInput-CuE_81Mt.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput.stories-Bv6H31A8.js → PresetRangeDateInput.stories-D9TMoYOB.js} +1 -1
- package/storybook-static/assets/{PresetSelect-Dxgbcd6v.js → PresetSelect-CN0IKu0a.js} +1 -1
- package/storybook-static/assets/{README-BWyLOpAH.js → README-0UO2pXtj.js} +1 -1
- package/storybook-static/assets/{README-LmLhlHwK.js → README-1kX985QJ.js} +1 -1
- package/storybook-static/assets/{README-CuNo3VAh.js → README-8-_hu7iJ.js} +1 -1
- package/storybook-static/assets/{README-BUZdjVfo.js → README-9pbSM7O_.js} +1 -1
- package/storybook-static/assets/{README-Brb2EJiv.js → README-B0DB8YYR.js} +1 -1
- package/storybook-static/assets/{README-DvAAUxal.js → README-B3aq-Sx4.js} +1 -1
- package/storybook-static/assets/{README-BnFo7A1M.js → README-BGVEAmni.js} +1 -1
- package/storybook-static/assets/{README-Ckx6r6jB.js → README-BGY4pbd2.js} +1 -1
- package/storybook-static/assets/{README-BMsZYhwk.js → README-BNAmw1CY.js} +1 -1
- package/storybook-static/assets/{README-BJHxnca5.js → README-BSU3d8yx.js} +1 -1
- package/storybook-static/assets/{README-DNHgCPLW.js → README-BTJcWR49.js} +1 -1
- package/storybook-static/assets/{README-DXPMTtIt.js → README-BbLROfhp.js} +1 -1
- package/storybook-static/assets/{README-B_YeFSgu.js → README-Bdl63lRm.js} +1 -1
- package/storybook-static/assets/{README-BHP_hy_l.js → README-BkkuU9ec.js} +1 -1
- package/storybook-static/assets/{README-Bwaf_RtF.js → README-BlUNAvHA.js} +1 -1
- package/storybook-static/assets/{README-CpP8uzpn.js → README-BmyhpBE4.js} +1 -1
- package/storybook-static/assets/{README-COZsAYb9.js → README-BnWc_1XT.js} +1 -1
- package/storybook-static/assets/{README-BylYDbD8.js → README-BoYFqkwC.js} +1 -1
- package/storybook-static/assets/{README-0TL8dXfy.js → README-BsZdSPmu.js} +1 -1
- package/storybook-static/assets/{README-z1sBBQYb.js → README-BsuQaM1w.js} +1 -1
- package/storybook-static/assets/{README-CqBnIIPG.js → README-BtB9H9nN.js} +1 -1
- package/storybook-static/assets/{README-mRw-97cE.js → README-BxhHDiwn.js} +1 -1
- package/storybook-static/assets/{README-B8hyGxl2.js → README-C2PTb-8t.js} +1 -1
- package/storybook-static/assets/{README-CPJ2Urdv.js → README-C63rWkBl.js} +1 -1
- package/storybook-static/assets/{README-Bv0lZXg9.js → README-C6zxVMFm.js} +1 -1
- package/storybook-static/assets/{README-Lwdz64Y5.js → README-CBreaBmO.js} +1 -1
- package/storybook-static/assets/{README-DYj0lPM6.js → README-CFweVjlA.js} +1 -1
- package/storybook-static/assets/{README-D-shrn-x.js → README-CQlYzU33.js} +1 -1
- package/storybook-static/assets/{README-BvbLyoA_.js → README-CTGa35Ko.js} +1 -1
- package/storybook-static/assets/{README-CeVuNRzY.js → README-CTjO8DPy.js} +1 -1
- package/storybook-static/assets/{README-u3-T1-M4.js → README-CVJoPV0y.js} +1 -1
- package/storybook-static/assets/{README-CLxQzsFZ.js → README-CfyDEk1-.js} +1 -1
- package/storybook-static/assets/{README-CVpcKWPZ.js → README-Cy3qBWwg.js} +1 -1
- package/storybook-static/assets/{README-zNoQ0KA3.js → README-CyKQxj4u.js} +1 -1
- package/storybook-static/assets/{README-CezbnFVJ.js → README-CzKv1E7w.js} +1 -1
- package/storybook-static/assets/{README-mq8MaRz_.js → README-D-yCn4_H.js} +1 -1
- package/storybook-static/assets/{README-ClPVK3xK.js → README-D2gE2Ldm.js} +1 -1
- package/storybook-static/assets/{README-CFU_RMXj.js → README-D5w1MRjv.js} +1 -1
- package/storybook-static/assets/{README-BJmN3u7D.js → README-D6pLREG_.js} +1 -1
- package/storybook-static/assets/{README-4rRBLeQ7.js → README-DA2Q8qus.js} +1 -1
- package/storybook-static/assets/{README-CPjmlBJs.js → README-DE0HxW6s.js} +1 -1
- package/storybook-static/assets/{README-DQnRX2Qb.js → README-DLep-Z9_.js} +1 -1
- package/storybook-static/assets/{README-JZYdxWRZ.js → README-DMuWFEvU.js} +1 -1
- package/storybook-static/assets/{README-T1F1XOUj.js → README-DaIVdhSy.js} +1 -1
- package/storybook-static/assets/{README-BNhuO-gy.js → README-DmwyVlUw.js} +1 -1
- package/storybook-static/assets/{README-DEbWVz3I.js → README-DzksXkTj.js} +1 -1
- package/storybook-static/assets/{README-DCH7J0KE.js → README-IapRnWcI.js} +1 -1
- package/storybook-static/assets/{README-B38eezDS.js → README-RmnKu3vw.js} +1 -1
- package/storybook-static/assets/{README-BHeLXCve.js → README-WH-bEvJ2.js} +1 -1
- package/storybook-static/assets/{README-C5QxSdGG.js → README-WztnWpwt.js} +1 -1
- package/storybook-static/assets/{README-blHl72M6.js → README-Xfa0qaGa.js} +1 -1
- package/storybook-static/assets/{README-DTEuMdnT.js → README-q8mu9DD1.js} +1 -1
- package/storybook-static/assets/{README-G45bqpi3.js → README-rCT7dLcC.js} +1 -1
- package/storybook-static/assets/{RadioButton-hwBOLm3O.js → RadioButton-ZsulWLed.js} +1 -1
- package/storybook-static/assets/{RadioButton-DGpnLExZ.js → RadioButton-dnLpCCML.js} +1 -1
- package/storybook-static/assets/{RadioButton.stories-BdhfL6cj.js → RadioButton.stories-CKipwhZp.js} +1 -1
- package/storybook-static/assets/{RadioGroup-CR66RuD6.js → RadioGroup-DEEYma_e.js} +1 -1
- package/storybook-static/assets/{RadioGroup-BZp-Y7i0.js → RadioGroup-u13QVsxA.js} +1 -1
- package/storybook-static/assets/{RadioGroup.stories-CyVY3MQs.js → RadioGroup.stories-DwwO3k93.js} +1 -1
- package/storybook-static/assets/{Scrollable-l-kJfzny.js → Scrollable-CUhjICar.js} +1 -1
- package/storybook-static/assets/{Scrollable-BdyVTGWU.js → Scrollable-Dxjen-sM.js} +1 -1
- package/storybook-static/assets/{Scrollable.stories-CDe3jWzB.js → Scrollable.stories-Cjcgg_Bc.js} +1 -1
- package/storybook-static/assets/{Select-wMvrcMy4.js → Select-COV2S25J.js} +1 -1
- package/storybook-static/assets/{Select-C1o9Tgm4.js → Select-DXRE65Ab.js} +1 -1
- package/storybook-static/assets/{Select.stories-CK3pQnzE.js → Select.stories-BJiP7tQH.js} +1 -1
- package/storybook-static/assets/{Separator-Bz1SbIE1.js → Separator-Bro2wWAu.js} +1 -1
- package/storybook-static/assets/{Separator-tJoZoT06.js → Separator-C28fV2R8.js} +1 -1
- package/storybook-static/assets/{Separator.stories-DdbjLc2p.js → Separator.stories-CNqUFK4v.js} +1 -1
- package/storybook-static/assets/{SerializableSelect-D2y7wrSs.js → SerializableSelect-d-m2CyxF.js} +1 -1
- package/storybook-static/assets/{SerializableSelect.stories-CsHAHPuI.js → SerializableSelect.stories-C8qJHCIJ.js} +1 -1
- package/storybook-static/assets/{ShimmerText-y0zDplGg.js → ShimmerText-DFlPCOpX.js} +1 -1
- package/storybook-static/assets/{ShimmerText.stories-BfGiPneX.js → ShimmerText.stories-wu2MXfaC.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput-_jTgXVdm.js → SingleDateTimeInput-BWOF4zyN.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput-B5pXlyuR.js → SingleDateTimeInput-Dcoe14K6.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput.stories-BeOx8XHz.js → SingleDateTimeInput.stories-Ck0OwzWi.js} +1 -1
- package/storybook-static/assets/{Slider-BHZZpZry.js → Slider-Dqr7gPar.js} +1 -1
- package/storybook-static/assets/{Slider-DlLlAkOo.js → Slider-DrpDDQaE.js} +1 -1
- package/storybook-static/assets/{Slider.stories-D3AMXdSf.js → Slider.stories-LKfnEkw4.js} +1 -1
- package/storybook-static/assets/{SliderInput-B_nKtEFR.js → SliderInput-BqyHw-PE.js} +1 -1
- package/storybook-static/assets/{SliderInput-DZ7-x9G-.js → SliderInput-MDuEi7Va.js} +1 -1
- package/storybook-static/assets/{SliderInput.stories-CupwFBr2.js → SliderInput.stories-DOwDFBuL.js} +1 -1
- package/storybook-static/assets/{Sortable-DQqEEJ_h.js → Sortable-iwVfz_Pp.js} +1 -1
- package/storybook-static/assets/{Sortable.stories-BIzq139o.js → Sortable.stories-B5Y6AaC5.js} +1 -1
- package/storybook-static/assets/{Splitter-CnbBNzjk.js → Splitter-ORF-Ncb1.js} +1 -1
- package/storybook-static/assets/{Splitter.stories-isfPJaLA.js → Splitter.stories-DQmiJCOW.js} +1 -1
- package/storybook-static/assets/{StateSelect-Ba01Hzid.js → StateSelect-Bb-xFYJr.js} +1 -1
- package/storybook-static/assets/{StateSelect-Bh9mu8Wx.js → StateSelect-Z_2ucbVB.js} +1 -1
- package/storybook-static/assets/{StateSelect.stories-CNe1cwYS.js → StateSelect.stories-4BgCeVtO.js} +1 -1
- package/storybook-static/assets/{StatusIndicator-uczF3UAh.js → StatusIndicator-JOpyf0X8.js} +1 -1
- package/storybook-static/assets/{StatusIndicator.stories-BWUH9ne2.js → StatusIndicator.stories-D3skmWV0.js} +1 -1
- package/storybook-static/assets/{StringToggle.stories-CNYMdULK.js → StringToggle.stories-WRtPfnkA.js} +1 -1
- package/storybook-static/assets/{Switch-DrAWdWBc.js → Switch-Bi6ldbAc.js} +1 -1
- package/storybook-static/assets/{Switch-axVFVLlk.js → Switch-Cml2InwJ.js} +1 -1
- package/storybook-static/assets/{Switch.stories-BIIkoLb6.js → Switch.stories-NXO81irA.js} +1 -1
- package/storybook-static/assets/{Table-DkshLxur.js → Table-CzzWl6jB.js} +1 -1
- package/storybook-static/assets/{Table.stories-DELoBGks.js → Table.stories-B6fUlbDF.js} +1 -1
- package/storybook-static/assets/{TableEditor.stories-glEEEgYH.js → TableEditor.stories-0X9buuFB.js} +1 -1
- package/storybook-static/assets/{Tabs-kyOZ5dm3.js → Tabs-Dc1vW6AD.js} +1 -1
- package/storybook-static/assets/{Tabs.stories-DMLyEGyu.js → Tabs.stories-CBVMbChq.js} +1 -1
- package/storybook-static/assets/{TabsBox-B08FfLUR.js → TabsBox-Dp_XwFIC.js} +1 -1
- package/storybook-static/assets/{TagInput-5EqCMO1Q.js → TagInput-CjIacwww.js} +1 -1
- package/storybook-static/assets/{TagInput.stories-8FOnpAnF.js → TagInput.stories-DTgqndkw.js} +1 -1
- package/storybook-static/assets/{Text-I4ck3fsu.js → Text-BZ-hxc1d.js} +1 -1
- package/storybook-static/assets/{Textarea-Cp3ATqQR.js → Textarea-BBHME6fw.js} +1 -1
- package/storybook-static/assets/{Textarea-BVXq2-cJ.js → Textarea-mfo7IAA2.js} +1 -1
- package/storybook-static/assets/{Textarea.stories-Do1b_cnC.js → Textarea.stories-AiHRDIfK.js} +1 -1
- package/storybook-static/assets/{TimePanel-C6O64BbD.js → TimePanel-CHRlMett.js} +1 -1
- package/storybook-static/assets/{TimePanel.stories-BYGDrk63.js → TimePanel.stories-ZfKuLFkK.js} +1 -1
- package/storybook-static/assets/{Toggle-haKh6Emn.js → Toggle-DsZR39by.js} +1 -1
- package/storybook-static/assets/{Toggle-l0bt4DX1.js → Toggle-d2cXgZGn.js} +1 -1
- package/storybook-static/assets/{Toggle.stories-CQnDWv6e.js → Toggle.stories-D-yiUzAX.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-BrFx88uE.js → TreeMultiSelect-DdJPRTnS.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-BzKXN_-p.js → TreeMultiSelect-dLo-KzWu.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect.stories-Dbg_4IBP.js → TreeMultiSelect.stories-CBZ8dhJM.js} +1 -1
- package/storybook-static/assets/{TreePickerBase-DiRNy79I.js → TreePickerBase-CVgiS4iD.js} +1 -1
- package/storybook-static/assets/{TreeSelect-1L4YxMuF.js → TreeSelect-BKrsYQTN.js} +1 -1
- package/storybook-static/assets/{TreeSelect-Ryr5xwEV.js → TreeSelect-Dp52E_73.js} +1 -1
- package/storybook-static/assets/{TreeSelect.stories-bRJplz1I.js → TreeSelect.stories-B1wm8Xba.js} +1 -1
- package/storybook-static/assets/{TreeTable-B5H2S6d8.js → TreeTable-CPpQ6e43.js} +1 -1
- package/storybook-static/assets/{TreeTable.stories-DhKxOf9Y.js → TreeTable.stories-DCDLySGX.js} +1 -1
- package/storybook-static/assets/{blocks-k8_NQe3D.js → blocks-za-wOwFF.js} +3 -3
- package/storybook-static/assets/{check-DFoJ7qw2.js → check-BnCTqaAz.js} +1 -1
- package/storybook-static/assets/{chevron-down-BK3QcIgw.js → chevron-down-Vq8KbCfI.js} +1 -1
- package/storybook-static/assets/{chevron-left-BZXvWuac.js → chevron-left-DWH9v-JE.js} +1 -1
- package/storybook-static/assets/{chevron-right-Df49J0bT.js → chevron-right-GObYqCJe.js} +1 -1
- package/storybook-static/assets/{chunk-W22LQPXL-CdOhbWq8.js → chunk-W22LQPXL-DffsJI6Z.js} +1 -1
- package/storybook-static/assets/{circle-alert-B_NZODcU.js → circle-alert-DHzv4KpY.js} +1 -1
- package/storybook-static/assets/{circle-check-DU6WB2Tc.js → circle-check-DKd35XtT.js} +1 -1
- package/storybook-static/assets/{components-BTWZ08KE.js → components-Ds9xsAdN.js} +3 -3
- package/storybook-static/assets/{contextMenu-Dtfejk82.js → contextMenu-DxOBp2Sj.js} +1 -1
- package/storybook-static/assets/{download-CpgafCSO.js → download-BmBq6Np5.js} +1 -1
- package/storybook-static/assets/{floating-ui.react-6Ph0JA2E.js → floating-ui.react-Rf5ZEhEh.js} +1 -1
- package/storybook-static/assets/{foundationApi-DIqIwHWJ.js → foundationApi-C2D1ZAsU.js} +1 -1
- package/storybook-static/assets/{foundationLib-DRYm0u3O.js → foundationLib-BFg_qpNI.js} +1 -1
- package/storybook-static/assets/{hooks-B7AHsKh1.js → hooks-CgazONpd.js} +1 -1
- package/storybook-static/assets/{iframe-DmEkruYl.js → iframe--CGTMt9T.js} +4 -4
- package/storybook-static/assets/iframe-brnPa2qH.js +1 -0
- package/storybook-static/assets/{info-BzOoa08d.js → info-B6O6v4M3.js} +1 -1
- package/storybook-static/assets/{odata-DuCCq8G1.js → odata-BEDULcKk.js} +1 -1
- package/storybook-static/assets/{odataStoryFixtures-BuE6LYnL.js → odataStoryFixtures-DHVieZR4.js} +1 -1
- package/storybook-static/assets/{react-CQwrc_lN.js → react-Cp6q3rBu.js} +1 -1
- package/storybook-static/assets/{refresh-cw-BSc2Wznw.js → refresh-cw-B7iOgoek.js} +1 -1
- package/storybook-static/assets/{settings-2-DiZDqDHO.js → settings-2-DT9oEwF5.js} +1 -1
- package/storybook-static/assets/{sortable-DHBz0op6.js → sortable-Cp70acZd.js} +1 -1
- package/storybook-static/assets/{syntaxhighlighter-QEQV7K2Y-DbrECuyo.js → syntaxhighlighter-QEQV7K2Y-BBBKSXp2.js} +1 -1
- package/storybook-static/assets/{trash-2-Co1c8VKG.js → trash-2-Cj8Ikfyz.js} +1 -1
- package/storybook-static/assets/{triangle-alert-CIl3TL3P.js → triangle-alert-DFhuVxlv.js} +1 -1
- package/storybook-static/assets/{useODataSelectBase-F-y8dDqn.js → useODataSelectBase-Bm1bPs1s.js} +1 -1
- package/storybook-static/assets/{useODataTreeData-C1uROydE.js → useODataTreeData-BPDg66yj.js} +1 -1
- package/storybook-static/assets/{usePickerQuery-XIF3uyW2.js → usePickerQuery-B55wi-Qp.js} +1 -1
- package/storybook-static/assets/{usePickerTriggerController-DJ1RhgvB.js → usePickerTriggerController-Det5k_cM.js} +1 -1
- package/storybook-static/assets/{x-BGcGcGD5.js → x-BZlxy_R9.js} +1 -1
- package/storybook-static/iframe.html +2 -2
- package/storybook-static/index.json +1 -1
- package/storybook-static/project.json +1 -1
- package/dist/multi-select/ui/OptionMultiSelect.d.ts +0 -30
- package/dist/multi-select/ui/OptionMultiSelect.d.ts.map +0 -1
- package/dist/multi-select/ui/OptionMultiSelectCore.d.ts +0 -13
- package/dist/multi-select/ui/OptionMultiSelectCore.d.ts.map +0 -1
- package/dist/multi-select/ui/optionMultiSelectTypes.d.ts.map +0 -1
- package/storybook-static/assets/MultiSelect-DBNTc1dz.js +0 -3
- package/storybook-static/assets/MultiSelect.stories-CI3HUdj4.js +0 -55
- package/storybook-static/assets/OptionMultiSelect.stories-oNE7yvAx.js +0 -64
- package/storybook-static/assets/iframe-Bn7SuTNo.js +0 -1
- /package/storybook-static/assets/{OptionMultiSelectCore-SJBp1Ymv.css → MultiSelectCore-SJBp1Ymv.css} +0 -0
|
@@ -167,7 +167,7 @@ function ue({ isNoData: e, error: t, children: n }) {
|
|
|
167
167
|
}) }) : /* @__PURE__ */ x(b, { children: n });
|
|
168
168
|
}
|
|
169
169
|
//#endregion
|
|
170
|
-
//#region src/multi-select/ui/
|
|
170
|
+
//#region src/multi-select/ui/MultiSelectCore.tsx
|
|
171
171
|
function A({ ref: e, options: t, value: u, onChange: p, getOptionKey: m, getOptionLabel: h, getOptionCode: g, getOptionGroup: _, getOptionSearchText: v, label: C, description: ne, placeholder: re, size: D, query: ie, defaultQuery: ae, highlightQuery: se, onQuery: ce, defaultFilter: k = !0, onOpen: A, onClose: j, getOptionDisabled: M, disabled: N, error: P, isLoading: F, renderToken: I, renderToolbar: L, renderOption: de, preserveOptionArrayReference: R = !1 }) {
|
|
172
172
|
let fe = ee(null), [z, pe] = te(!1), B = "search-multi", V = T(() => E(u, R), [R, u]), me = T(() => new Set(V.map(m)), [V, m]), he = T(() => t.filter((e) => !me.has(m(e))), [
|
|
173
173
|
me,
|
|
@@ -422,7 +422,7 @@ function A({ ref: e, options: t, value: u, onChange: p, getOptionKey: m, getOpti
|
|
|
422
422
|
});
|
|
423
423
|
}
|
|
424
424
|
//#endregion
|
|
425
|
-
//#region src/multi-select/ui/
|
|
425
|
+
//#region src/multi-select/ui/DeprecatedMultiSelect.tsx
|
|
426
426
|
function j({ ref: e, codeKey: t, textKey: n, hideCode: r, items: i, value: a, onChange: o, getOptionDisabled: s, onClose: c, renderToken: l, renderToolbar: u, renderItem: d, ...f }) {
|
|
427
427
|
let p = T(() => a ?? [], [a]), m = T(() => ae([...p, ...i], t, n), [
|
|
428
428
|
t,
|
|
@@ -455,9 +455,9 @@ function j({ ref: e, codeKey: t, textKey: n, hideCode: r, items: i, value: a, on
|
|
|
455
455
|
})
|
|
456
456
|
});
|
|
457
457
|
}
|
|
458
|
-
j.displayName = "
|
|
458
|
+
j.displayName = "DeprecatedMultiSelect";
|
|
459
459
|
//#endregion
|
|
460
|
-
//#region src/multi-select/ui/
|
|
460
|
+
//#region src/multi-select/ui/MultiSelect.tsx
|
|
461
461
|
function M(e) {
|
|
462
462
|
return /* @__PURE__ */ x(A, { ...e });
|
|
463
463
|
}
|
|
@@ -591,6 +591,6 @@ function R({ label: e, description: t, disabled: n, placeholder: r, size: i, opt
|
|
|
591
591
|
});
|
|
592
592
|
}
|
|
593
593
|
//#endregion
|
|
594
|
-
export { j as MultiSelect, I as ODataDependentMultiSelect, F as ODataDependentSegmentMultiSelect, P as ODataMultiSelect,
|
|
594
|
+
export { j as DeprecatedMultiSelect, M as MultiSelect, I as ODataDependentMultiSelect, F as ODataDependentSegmentMultiSelect, P as ODataMultiSelect, R as SerializableMultiSelect };
|
|
595
595
|
|
|
596
596
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/multi-select/lib/materializeMultiSelectOptions.ts","../../src/multi-select/lib/adaptLegacyMultiSelectContext.ts","../../src/multi-select/lib/resolveLegacyMultiSelectTextKey.ts","../../src/multi-select/lib/multiSelectSelection.ts","../../src/multi-select/ui/MultiSelect.module.scss","../../src/multi-select/lib/createMultiSelectOptionSections.ts","../../src/multi-select/ui/MultiSelectOptionRow.tsx","../../src/multi-select/ui/MultiSelectOptionList.tsx","../../src/multi-select/ui/MultiSelectOptionSkeleton.tsx","../../src/multi-select/ui/MultiSelectOptionsWrapper.tsx","../../src/multi-select/ui/OptionMultiSelectCore.tsx","../../src/multi-select/ui/MultiSelect.tsx","../../src/multi-select/ui/OptionMultiSelect.tsx","../../src/multi-select/model/useODataMultiSelect.ts","../../src/multi-select/ui/ODataMultiSelect.tsx","../../src/multi-select/ui/ODataDependentSegmentMultiSelect.tsx","../../src/multi-select/ui/ODataDependentMultiSelect.tsx","../../src/multi-select/ui/SerializableMultiSelect.tsx"],"sourcesContent":["/**\n * Создаёт mutable-снимок readonly options. Сохранение ссылки включается только\n * legacy-адаптером, чей опубликованный callback-контракт исторически mutable.\n */\nexport function materializeMultiSelectOptions<TOption>(options: readonly TOption[], preserveArrayReference = false): TOption[] {\n\tif (preserveArrayReference && Array.isArray(options)) {\n\t\treturn options;\n\t}\n\n\treturn [...options];\n}\n","import { type CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata-service\";\n\nimport { type MultiSelectOptionDisableContext, type MultiSelectRenderContext } from \"../ui/legacyMultiSelectTypes\";\nimport { type OptionMultiSelectOptionDisableContext, type OptionMultiSelectRenderContext } from \"../ui/optionMultiSelectTypes\";\n\nimport { materializeMultiSelectOptions } from \"./materializeMultiSelectOptions\";\n\n/** Преобразует generic render-context в опубликованный legacy-контракт. */\nexport function adaptLegacyMultiSelectRenderContext(context: OptionMultiSelectRenderContext<CollectionItem>): MultiSelectRenderContext {\n\treturn {\n\t\tselectedItems: materializeMultiSelectOptions(context.selectedOptions, true),\n\t\tcommittedSelectedItems: materializeMultiSelectOptions(context.committedSelectedOptions, true),\n\t\tavailableItems: materializeMultiSelectOptions(context.availableOptions, true),\n\t\tquery: context.query,\n\t\topen: context.open,\n\t\tclearSelection: context.clearSelection,\n\t\tselectAll: context.selectAll,\n\t\tdeselectAll: context.deselectAll\n\t};\n}\n\n/** Преобразует generic disable-context без изменения identity выбранных элементов. */\nexport function adaptLegacyMultiSelectOptionDisableContext(\n\tcontext: OptionMultiSelectOptionDisableContext<CollectionItem>\n): MultiSelectOptionDisableContext {\n\treturn {\n\t\tselectedItems: materializeMultiSelectOptions(context.selectedOptions, true),\n\t\tcommittedSelectedItems: materializeMultiSelectOptions(context.committedSelectedOptions, true),\n\t\tselectedKeys: context.selectedKeys,\n\t\topen: context.open\n\t};\n}\n","import { type CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata-service\";\n\n/** Сохраняет исходное правило вывода textKey для legacy code/text API. */\nexport function resolveLegacyMultiSelectTextKey(items: readonly CollectionItem[], codeKey: string, textKey?: string) {\n\tif (textKey) {\n\t\treturn textKey;\n\t}\n\n\tconst sampleItem = items[0];\n\n\tif (!sampleItem) {\n\t\treturn codeKey;\n\t}\n\n\treturn Object.keys(sampleItem).find((key) => key !== codeKey) ?? codeKey;\n}\n","import { type OptionMultiSelectOptionKey } from \"../ui/optionMultiSelectTypes\";\n\n/** Сравнивает наборы выбора по identity опций, не связывая их с object reference. */\nexport function areMultiSelectSelectionsEqual<TOption>(\n\tleft: readonly TOption[],\n\tright: readonly TOption[],\n\tgetOptionKey: (option: TOption) => OptionMultiSelectOptionKey\n): boolean {\n\tif (left.length !== right.length) {\n\t\treturn false;\n\t}\n\n\tconst rightKeys = new Set(right.map(getOptionKey));\n\n\treturn left.every((option) => rightKeys.has(getOptionKey(option)));\n}\n","@use \"@/styles/mixins\" as *;\n\n.multiSelect {\n\t// Общий контейнер\n\tpadding: 0;\n}\n\n.optionCheckBox {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tflex-shrink: 0;\n\n\t--check-box-control-size: auto;\n\tpadding-left: var(--space-sm);\n}\n\n.optionActionCell {\n\tdisplay: flex;\n\talign-self: stretch;\n\tflex: 1 1 0;\n\tmin-width: 0;\n}\n","import { type OptionMultiSelectOptionGroup } from \"../ui/optionMultiSelectTypes\";\n\nexport type MultiSelectOptionEntry<TOption> = Readonly<{\n\toption: TOption;\n\tindex: number;\n}>;\n\nexport type MultiSelectOptionSection<TOption> = Readonly<{\n\tgroup: OptionMultiSelectOptionGroup | undefined;\n\tentries: readonly MultiSelectOptionEntry<TOption>[];\n}>;\n\n/**\n * Группирует только соседние опции и сохраняет их глобальные индексы. Благодаря\n * этому визуальные заголовки не попадают в active-index клавиатурной навигации.\n */\nexport function createMultiSelectOptionSections<TOption>(\n\tentries: readonly MultiSelectOptionEntry<TOption>[],\n\tgetOptionGroup: (option: TOption) => OptionMultiSelectOptionGroup | undefined\n): readonly MultiSelectOptionSection<TOption>[] {\n\tconst sections: Array<{\n\t\tgroup: OptionMultiSelectOptionGroup | undefined;\n\t\tentries: MultiSelectOptionEntry<TOption>[];\n\t}> = [];\n\n\tfor (const entry of entries) {\n\t\tconst group = getOptionGroup(entry.option);\n\t\tconst currentSection = sections.at(-1);\n\t\tconst belongsToCurrentSection = currentSection?.group?.key === group?.key;\n\n\t\tif (currentSection && belongsToCurrentSection) {\n\t\t\tcurrentSection.entries.push(entry);\n\t\t\tcontinue;\n\t\t}\n\n\t\tsections.push({ group, entries: [entry] });\n\t}\n\n\treturn sections;\n}\n","import { CheckBox } from \"../../check-box\";\nimport { Option, OptionButton } from \"../../option\";\n\nimport styles from \"./MultiSelect.module.scss\";\nimport {\n\ttype OptionMultiSelectOptionContent,\n\ttype OptionMultiSelectOptionKey,\n\ttype OptionMultiSelectOptionState\n} from \"./optionMultiSelectTypes\";\n\ntype MultiSelectOptionRowProps<TOption> = Readonly<{\n\toption: TOption;\n\tindex: number;\n\tlistId: string;\n\tactiveIndex: number;\n\tselectedKeys: ReadonlySet<OptionMultiSelectOptionKey>;\n\tquery: string;\n\thighlightQuery: string;\n\tgetOptionKey: (option: TOption) => OptionMultiSelectOptionKey;\n\tgetOptionDisabled?: (option: TOption) => boolean;\n\tgetOptionId: (listId: string, index: number) => string;\n\tsetOptionRef: (index: number, node: HTMLElement | null) => void;\n\ttoggleOption: (option: TOption) => void;\n\tselectOnlyOption: (option: TOption) => void;\n\trenderOption: (option: TOption, state: OptionMultiSelectOptionState) => OptionMultiSelectOptionContent;\n}>;\n\n/** Одна интерактивная строка grid: checkbox меняет draft, основная кнопка подтверждает только эту опцию. */\nexport function MultiSelectOptionRow<TOption>({\n\toption,\n\tindex,\n\tlistId,\n\tactiveIndex,\n\tselectedKeys,\n\tquery,\n\thighlightQuery,\n\tgetOptionKey,\n\tgetOptionDisabled,\n\tgetOptionId,\n\tsetOptionRef,\n\ttoggleOption,\n\tselectOnlyOption,\n\trenderOption\n}: MultiSelectOptionRowProps<TOption>) {\n\tconst active = index === activeIndex;\n\tconst optionKey = getOptionKey(option);\n\tconst selected = selectedKeys.has(optionKey);\n\tconst optionDisabled = getOptionDisabled?.(option) ?? false;\n\tconst content = renderOption(option, { selected, active, disabled: optionDisabled, query, highlightQuery });\n\n\treturn (\n\t\t<Option\n\t\t\tid={getOptionId(listId, index)}\n\t\t\tref={(node) => setOptionRef(index, node)}\n\t\t\trole=\"row\"\n\t\t\taria-selected={selected}\n\t\t\taria-disabled={optionDisabled || undefined}\n\t\t\tselected={selected}\n\t\t\tactive={active}\n\t\t\tdisabled={optionDisabled}>\n\t\t\t<div\n\t\t\t\trole=\"gridcell\"\n\t\t\t\tclassName={styles.optionCheckBox}\n\t\t\t\tonMouseDown={(event) => event.stopPropagation()}\n\t\t\t\tonClick={(event) => event.stopPropagation()}>\n\t\t\t\t<CheckBox\n\t\t\t\t\tvalue={selected}\n\t\t\t\t\tdisabled={optionDisabled}\n\t\t\t\t\taria-label={`${selected ? \"Убрать\" : \"Добавить\"} «${content.text}» ${selected ? \"из выбора\" : \"в выбор\"}`}\n\t\t\t\t\tonChange={() => toggleOption(option)}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div role=\"gridcell\" className={styles.optionActionCell}>\n\t\t\t\t<OptionButton\n\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\tdisabled={optionDisabled}\n\t\t\t\t\taria-label={`Выбрать только «${content.text}»`}\n\t\t\t\t\ttext={content.text}\n\t\t\t\t\tcode={content.code}\n\t\t\t\t\tsearchText={highlightQuery}\n\t\t\t\t\tonMouseDown={(event) => event.preventDefault()}\n\t\t\t\t\tonClick={() => selectOnlyOption(option)}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</Option>\n\t);\n}\n","import { Fragment } from \"react\";\n\nimport uiStyles from \"../../ui.module.scss\";\nimport { createMultiSelectOptionSections, type MultiSelectOptionEntry } from \"../lib/createMultiSelectOptionSections\";\n\nimport { MultiSelectOptionRow } from \"./MultiSelectOptionRow\";\nimport {\n\ttype OptionMultiSelectOptionContent,\n\ttype OptionMultiSelectOptionGroup,\n\ttype OptionMultiSelectOptionKey,\n\ttype OptionMultiSelectOptionState\n} from \"./optionMultiSelectTypes\";\n\ntype MultiSelectOptionListProps<TOption> = Readonly<{\n\tentries: readonly MultiSelectOptionEntry<TOption>[];\n\tsectionId: string;\n\tlistId: string;\n\tactiveIndex: number;\n\tselectedKeys: ReadonlySet<OptionMultiSelectOptionKey>;\n\tquery: string;\n\thighlightQuery: string;\n\tgetOptionKey: (option: TOption) => OptionMultiSelectOptionKey;\n\tgetOptionGroup?: (option: TOption) => OptionMultiSelectOptionGroup | undefined;\n\tgetOptionDisabled?: (option: TOption) => boolean;\n\tgetOptionId: (listId: string, index: number) => string;\n\tsetOptionRef: (index: number, node: HTMLElement | null) => void;\n\ttoggleOption: (option: TOption) => void;\n\tselectOnlyOption: (option: TOption) => void;\n\trenderOption: (option: TOption, state: OptionMultiSelectOptionState) => OptionMultiSelectOptionContent;\n}>;\n\n/** Рендерит одну selected/available-секцию, сохраняя global option indexes при группировке. */\nexport function MultiSelectOptionList<TOption>({ entries, sectionId, getOptionGroup, ...rowProps }: MultiSelectOptionListProps<TOption>) {\n\tconst sections = getOptionGroup ? createMultiSelectOptionSections(entries, getOptionGroup) : [{ group: undefined, entries }];\n\n\treturn sections.map((section, sectionIndex) => {\n\t\tconst rows = section.entries.map(({ option, index }) => (\n\t\t\t<MultiSelectOptionRow key={`${rowProps.getOptionKey(option)}-${index}`} option={option} index={index} {...rowProps} />\n\t\t));\n\n\t\tif (!section.group) {\n\t\t\treturn <Fragment key={`${sectionId}-ungrouped-${sectionIndex}`}>{rows}</Fragment>;\n\t\t}\n\n\t\tconst groupLabelId = `${sectionId}-group-${sectionIndex}`;\n\n\t\treturn (\n\t\t\t<div key={`${sectionId}-${section.group.key}-${sectionIndex}`} role=\"rowgroup\" aria-labelledby={groupLabelId}>\n\t\t\t\t<div id={groupLabelId} role=\"row\" className={uiStyles.uiPopupGroupLabel}>\n\t\t\t\t\t<div role=\"gridcell\">{section.group.label}</div>\n\t\t\t\t</div>\n\t\t\t\t{rows}\n\t\t\t</div>\n\t\t);\n\t});\n}\n","import { Text } from \"../../text\";\nimport uiStyles from \"../../ui.module.scss\";\n\ninterface MultiSelectOptionSkeletonProps {\n\ttext: string;\n\tisError?: boolean;\n}\n\n/**\n * Скелетон строки опции для `MultiSelect`. Используется во время загрузки или при отображении ошибок получения списка.\n */\nexport function MultiSelectOptionSkeleton({ text, isError }: MultiSelectOptionSkeletonProps) {\n\treturn (\n\t\t<div className={uiStyles.uiPopupOption}>\n\t\t\t<span className={uiStyles.uiPopupOptionIcon}></span>\n\t\t\t<Text color={isError ? \"error\" : \"primary\"}>{text}</Text>\n\t\t</div>\n\t);\n}\n","import { type PropsWithChildren } from \"react\";\n\nimport { PickerStatus } from \"../../picker\";\n\nimport { MultiSelectOptionSkeleton } from \"./MultiSelectOptionSkeleton\";\n\ntype MultiSelectOptionsWrapperProps = PropsWithChildren<{\n\tisNoData?: boolean;\n\terror?: string;\n}>;\n\n/** Выбирает одно доступное состояние тела popup, не меняя структуру самого grid. */\nexport function MultiSelectOptionsWrapper({ isNoData, error, children }: MultiSelectOptionsWrapperProps) {\n\tif (isNoData) {\n\t\treturn <PickerStatus emptyState={<MultiSelectOptionSkeleton text=\"Нет данных\" />} />;\n\t}\n\n\tif (error) {\n\t\treturn <PickerStatus errorState={<MultiSelectOptionSkeleton isError text=\"Ошибка загрузки\" />} />;\n\t}\n\n\treturn <>{children}</>;\n}\n","import { useCallback, useMemo, useRef, useState } from \"react\";\n\nimport {\n\textractPickerTextContent,\n\tPickerField,\n\tPickerPopup,\n\tPickerTrigger,\n\tusePickerDefaultFilter,\n\tusePickerFloatingListbox,\n\tusePickerQuery,\n\tusePickerSelectionLifecycle,\n\tusePickerTriggerController\n} from \"../../picker\";\nimport { Separator } from \"../../separator\";\nimport { formatMultiSelectOptionCount } from \"../lib/formatMultiSelectOptionCount\";\nimport { materializeMultiSelectOptions } from \"../lib/materializeMultiSelectOptions\";\nimport { areMultiSelectSelectionsEqual } from \"../lib/multiSelectSelection\";\n\nimport styles from \"./MultiSelect.module.scss\";\nimport { MultiSelectOptionList } from \"./MultiSelectOptionList\";\nimport { MultiSelectOptionsWrapper } from \"./MultiSelectOptionsWrapper\";\nimport { type OptionMultiSelectProps } from \"./OptionMultiSelect\";\nimport { type OptionMultiSelectOptionDisableContext } from \"./optionMultiSelectTypes\";\n\ntype OptionMultiSelectCoreProps<TOption> = OptionMultiSelectProps<TOption> &\n\tReadonly<{\n\t\t/** Сохраняет опубликованную ссылочную семантику только для legacy MultiSelect. */\n\t\tpreserveOptionArrayReference?: boolean;\n\t}>;\n\n/**\n * Единая generic-реализация множественного выбора. Публичные компоненты только\n * адаптируют свои контракты к этим selector-функциям, поэтому focus и a11y\n * поведение не расходятся между новым и legacy API.\n */\nexport function OptionMultiSelectCore<TOption>({\n\tref,\n\toptions,\n\tvalue,\n\tonChange,\n\tgetOptionKey,\n\tgetOptionLabel,\n\tgetOptionCode,\n\tgetOptionGroup,\n\tgetOptionSearchText,\n\tlabel,\n\tdescription,\n\tplaceholder,\n\tsize,\n\tquery,\n\tdefaultQuery,\n\thighlightQuery,\n\tonQuery,\n\tdefaultFilter = true,\n\tonOpen,\n\tonClose,\n\tgetOptionDisabled,\n\tdisabled,\n\terror,\n\tisLoading,\n\trenderToken,\n\trenderToolbar,\n\trenderOption,\n\tpreserveOptionArrayReference = false\n}: OptionMultiSelectCoreProps<TOption>) {\n\tconst inputRef = useRef<HTMLInputElement | null>(null);\n\tconst [open, setOpen] = useState(false);\n\tconst triggerMode = \"search-multi\";\n\tconst committedSelectedOptions = useMemo(\n\t\t() => materializeMultiSelectOptions(value, preserveOptionArrayReference),\n\t\t[preserveOptionArrayReference, value]\n\t);\n\tconst committedSelectedKeys = useMemo(\n\t\t() => new Set(committedSelectedOptions.map(getOptionKey)),\n\t\t[committedSelectedOptions, getOptionKey]\n\t);\n\tconst availableOptions = useMemo(\n\t\t() => options.filter((option) => !committedSelectedKeys.has(getOptionKey(option))),\n\t\t[committedSelectedKeys, getOptionKey, options]\n\t);\n\tconst {\n\t\tquery: currentQuery,\n\t\tsetQuery,\n\t\tresetQueryOnClose\n\t} = usePickerQuery({\n\t\tquery,\n\t\tdefaultQuery,\n\t\tonQuery,\n\t\ttriggerMode\n\t});\n\tconst handleOpenChange = (nextOpen: boolean) => {\n\t\tif (open && !nextOpen && resetQueryOnClose) {\n\t\t\tsetQuery(\"\");\n\t\t}\n\n\t\tsetOpen(nextOpen);\n\t};\n\tconst getSearchText = useCallback(\n\t\t(option: TOption) =>\n\t\t\tgetOptionSearchText?.(option) ??\n\t\t\t[getOptionLabel(option), getOptionCode?.(option), extractPickerTextContent(getOptionGroup?.(option)?.label)].filter(\n\t\t\t\t(part): part is string => Boolean(part)\n\t\t\t),\n\t\t[getOptionCode, getOptionGroup, getOptionLabel, getOptionSearchText]\n\t);\n\tconst filteredCommittedSelectedOptions = usePickerDefaultFilter({\n\t\toptions: committedSelectedOptions,\n\t\tquery: currentQuery,\n\t\tenabled: defaultFilter,\n\t\tgetSearchText\n\t});\n\tconst filteredAvailableOptions = usePickerDefaultFilter({\n\t\toptions: availableOptions,\n\t\tquery: currentQuery,\n\t\tenabled: defaultFilter,\n\t\tgetSearchText\n\t});\n\tconst visibleOptions = useMemo(\n\t\t() => [...filteredCommittedSelectedOptions, ...filteredAvailableOptions],\n\t\t[filteredAvailableOptions, filteredCommittedSelectedOptions]\n\t);\n\tconst selectedIndex = filteredCommittedSelectedOptions.length > 0 ? 0 : -1;\n\tconst compareSelections = useCallback(\n\t\t(left: TOption[], right: TOption[]) => areMultiSelectSelectionsEqual(left, right, getOptionKey),\n\t\t[getOptionKey]\n\t);\n\tconst {\n\t\tdraftValue: draftSelectedOptions,\n\t\tsetDraftValue: setDraftSelectedOptions,\n\t\tprepareOpen\n\t} = usePickerSelectionLifecycle({\n\t\tvalue: committedSelectedOptions,\n\t\topen,\n\t\tonCommit: onChange,\n\t\tonOpen,\n\t\tonClose,\n\t\tisEqual: compareSelections\n\t});\n\tconst selectedKeys = useMemo(() => new Set(draftSelectedOptions.map(getOptionKey)), [draftSelectedOptions, getOptionKey]);\n\tconst optionDisableContext = useMemo<OptionMultiSelectOptionDisableContext<TOption>>(\n\t\t() => ({\n\t\t\tselectedOptions: draftSelectedOptions,\n\t\t\tcommittedSelectedOptions,\n\t\t\tselectedKeys,\n\t\t\topen\n\t\t}),\n\t\t[committedSelectedOptions, draftSelectedOptions, open, selectedKeys]\n\t);\n\tconst isOptionDisabled = useCallback(\n\t\t(option: TOption) => getOptionDisabled?.(option, optionDisableContext) ?? false,\n\t\t[getOptionDisabled, optionDisableContext]\n\t);\n\tconst {\n\t\tactiveIndex,\n\t\tcontext,\n\t\tfloatingStyles,\n\t\tgetFloatingProps,\n\t\tsetReference,\n\t\tsetFloating,\n\t\tsetOptionRef,\n\t\tclose,\n\t\topenList,\n\t\ttoggleOpen,\n\t\thandleReferenceKeyDown,\n\t\thandleFloatingKeyDown,\n\t\tgetOptionId,\n\t\tgetActiveOptionId\n\t} = usePickerFloatingListbox({\n\t\toptions: visibleOptions,\n\t\tselectedIndex,\n\t\topen,\n\t\tonOpenChange: handleOpenChange,\n\t\tonSelect: undefined,\n\t\tdisabled,\n\t\tgetOptionDisabled: isOptionDisabled,\n\t\tcloseOnSelect: false,\n\t\tallowOpenWithoutOptions: true,\n\t\ttriggerMode\n\t});\n\n\tconst currentHighlightQuery = highlightQuery ?? currentQuery;\n\tconst toggleDraftSelection = (option: TOption) => {\n\t\tconst optionKey = getOptionKey(option);\n\n\t\tsetDraftSelectedOptions((currentOptions) => {\n\t\t\tconst isSelected = currentOptions.some((selectedOption) => getOptionKey(selectedOption) === optionKey);\n\n\t\t\tif (isSelected) {\n\t\t\t\treturn currentOptions.filter((selectedOption) => getOptionKey(selectedOption) !== optionKey);\n\t\t\t}\n\n\t\t\tif (isOptionDisabled(option)) {\n\t\t\t\treturn currentOptions;\n\t\t\t}\n\n\t\t\treturn [...currentOptions, option];\n\t\t});\n\t};\n\n\tconst setInputNode = useCallback(\n\t\t(node: HTMLInputElement | null) => {\n\t\t\tinputRef.current = node;\n\n\t\t\tif (typeof ref === \"function\") {\n\t\t\t\tref(node);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (ref) {\n\t\t\t\tref.current = node;\n\t\t\t}\n\t\t},\n\t\t[ref]\n\t);\n\n\tconst clearSelection = () => {\n\t\tsetDraftSelectedOptions([]);\n\n\t\tif (!open) {\n\t\t\tonChange([]);\n\t\t}\n\t};\n\n\tconst selectAll = () => {\n\t\tsetDraftSelectedOptions((currentOptions) => {\n\t\t\tconst nextOptions = [...currentOptions];\n\t\t\tconst nextSelectedKeys = new Set(currentOptions.map(getOptionKey));\n\n\t\t\tfor (const option of visibleOptions) {\n\t\t\t\tconst optionKey = getOptionKey(option);\n\n\t\t\t\tif (!nextSelectedKeys.has(optionKey) && !isOptionDisabled(option)) {\n\t\t\t\t\tnextSelectedKeys.add(optionKey);\n\t\t\t\t\tnextOptions.push(option);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn nextOptions;\n\t\t});\n\t};\n\n\tconst deselectAll = () => {\n\t\tsetDraftSelectedOptions([]);\n\t};\n\n\tconst selectOnlyOption = (option: TOption) => {\n\t\tif (isOptionDisabled(option)) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetDraftSelectedOptions([option]);\n\t\tclose();\n\t};\n\n\tconst currentSelectedOptions = open ? draftSelectedOptions : committedSelectedOptions;\n\tconst hasSelectedOptions = currentSelectedOptions.length > 0;\n\tconst renderContext = {\n\t\tselectedOptions: currentSelectedOptions,\n\t\tcommittedSelectedOptions,\n\t\tavailableOptions: filteredAvailableOptions,\n\t\tquery: currentQuery,\n\t\topen,\n\t\tclearSelection,\n\t\tselectAll,\n\t\tdeselectAll\n\t};\n\tconst defaultTokenNode =\n\t\tcurrentSelectedOptions.length > 1\n\t\t\t? formatMultiSelectOptionCount(currentSelectedOptions.length)\n\t\t\t: currentSelectedOptions.length === 1\n\t\t\t\t? getOptionLabel(currentSelectedOptions[0])\n\t\t\t\t: undefined;\n\tconst tokenNode = renderToken === undefined ? defaultTokenNode : typeof renderToken === \"function\" ? renderToken(renderContext) : null;\n\tconst toolbarNode = typeof renderToolbar === \"function\" ? renderToolbar(renderContext) : renderToolbar;\n\tconst renderDefaultOption = useCallback(\n\t\t(option: TOption) => ({ text: getOptionLabel(option), code: getOptionCode?.(option) }),\n\t\t[getOptionCode, getOptionLabel]\n\t);\n\tconst optionRenderer = renderOption ?? renderDefaultOption;\n\tconst selectedEntries = filteredCommittedSelectedOptions.map((option, index) => ({ option, index }));\n\tconst availableEntries = filteredAvailableOptions.map((option, index) => ({\n\t\toption,\n\t\tindex: index + selectedEntries.length\n\t}));\n\tconst isNoData = !isLoading && !error && visibleOptions.length === 0;\n\tconst triggerController = usePickerTriggerController({\n\t\tmode: triggerMode,\n\t\topen,\n\t\tcurrentQuery,\n\t\thasDisplayValue: false,\n\t\tinputRef,\n\t\tsetQuery,\n\t\topenList,\n\t\tclose,\n\t\ttoggleOpen,\n\t\tonBeforeOpen: () => {\n\t\t\tif (!open) {\n\t\t\t\tprepareOpen();\n\t\t\t}\n\t\t}\n\t});\n\n\treturn (\n\t\t<PickerField label={label} description={description} disabled={disabled} size={size} className={styles.multiSelect}>\n\t\t\t{({ controlId, labelId, describedBy }) => {\n\t\t\t\tconst listId = `${controlId}-grid`;\n\n\t\t\t\treturn (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<PickerTrigger\n\t\t\t\t\t\t\tref={setInputNode}\n\t\t\t\t\t\t\trootRef={setReference}\n\t\t\t\t\t\t\tid={controlId}\n\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\t\t\tisLoading={isLoading}\n\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\toptionCount={options.length}\n\t\t\t\t\t\t\tlabel={label}\n\t\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\t\tplaceholderFallback=\"Выберите значения\"\n\t\t\t\t\t\t\tvalue={currentQuery}\n\t\t\t\t\t\t\tselectedValue={tokenNode}\n\t\t\t\t\t\t\thasSelection={hasSelectedOptions}\n\t\t\t\t\t\t\tshowSelectedValue={hasSelectedOptions && currentQuery.length === 0}\n\t\t\t\t\t\t\tclearable\n\t\t\t\t\t\t\tonClear={clearSelection}\n\t\t\t\t\t\t\tclearAriaLabel=\"Очистить все\"\n\t\t\t\t\t\t\tonToggleMouseDown={triggerController.handleToggleMouseDown}\n\t\t\t\t\t\t\tonToggleClick={triggerController.handleToggleClick}\n\t\t\t\t\t\t\taria-labelledby={labelId}\n\t\t\t\t\t\t\taria-describedby={describedBy}\n\t\t\t\t\t\t\taria-haspopup=\"grid\"\n\t\t\t\t\t\t\taria-expanded={open}\n\t\t\t\t\t\t\taria-controls={open ? listId : undefined}\n\t\t\t\t\t\t\taria-autocomplete=\"list\"\n\t\t\t\t\t\t\taria-activedescendant={open ? getActiveOptionId(listId) : undefined}\n\t\t\t\t\t\t\trootClassName=\"flex alignItemsCenter\"\n\t\t\t\t\t\t\tonChange={(event) => {\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerInputChange(event.target.value);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonClick={triggerController.handleTriggerClick}\n\t\t\t\t\t\t\tonFocus={(event) => {\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerFocus(event.currentTarget);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\t\t\thandleReferenceKeyDown(event);\n\n\t\t\t\t\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (open && event.ctrlKey && event.key === \" \") {\n\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\tconst activeOption = visibleOptions[activeIndex];\n\t\t\t\t\t\t\t\t\tif (activeIndex >= 0 && activeIndex < visibleOptions.length) {\n\t\t\t\t\t\t\t\t\t\ttoggleDraftSelection(activeOption);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerKeyDown({\n\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\tonActivateWhenOpen: () => {\n\t\t\t\t\t\t\t\t\t\tconst activeOption = visibleOptions[activeIndex];\n\t\t\t\t\t\t\t\t\t\tif (activeIndex >= 0 && activeIndex < visibleOptions.length) {\n\t\t\t\t\t\t\t\t\t\t\tselectOnlyOption(activeOption);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tenableClosedArrowDownOpen: true,\n\t\t\t\t\t\t\t\t\tsuppressClosedArrowUp: true\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t<PickerPopup\n\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\tcontext={context}\n\t\t\t\t\t\t\tfloatingStyles={floatingStyles}\n\t\t\t\t\t\t\tlistId={listId}\n\t\t\t\t\t\t\tlabelId={labelId}\n\t\t\t\t\t\t\tdescriptionId={describedBy}\n\t\t\t\t\t\t\tactiveOptionId={open ? getActiveOptionId(listId) : undefined}\n\t\t\t\t\t\t\tariaMultiselectable\n\t\t\t\t\t\t\tpopupRole=\"grid\"\n\t\t\t\t\t\t\tsetFloating={setFloating}\n\t\t\t\t\t\t\tgetFloatingProps={getFloatingProps}\n\t\t\t\t\t\t\tonKeyDown={handleFloatingKeyDown}\n\t\t\t\t\t\t\tinitialFocus={-1}\n\t\t\t\t\t\t\treturnFocus={false}\n\t\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\t\ttoolbar={toolbarNode}\n\t\t\t\t\t\t\tselectionActions={\n\t\t\t\t\t\t\t\trenderToolbar === undefined ? { onSelectAll: selectAll, onDeselectAll: deselectAll } : undefined\n\t\t\t\t\t\t\t}>\n\t\t\t\t\t\t\t<MultiSelectOptionsWrapper isNoData={isNoData} error={error}>\n\t\t\t\t\t\t\t\t<div role=\"presentation\" className=\"scrollable overscroll h100\">\n\t\t\t\t\t\t\t\t\t<MultiSelectOptionList\n\t\t\t\t\t\t\t\t\t\tentries={selectedEntries}\n\t\t\t\t\t\t\t\t\t\tsectionId={`${listId}-selected`}\n\t\t\t\t\t\t\t\t\t\tlistId={listId}\n\t\t\t\t\t\t\t\t\t\tactiveIndex={activeIndex}\n\t\t\t\t\t\t\t\t\t\tselectedKeys={selectedKeys}\n\t\t\t\t\t\t\t\t\t\tquery={currentQuery}\n\t\t\t\t\t\t\t\t\t\thighlightQuery={currentHighlightQuery}\n\t\t\t\t\t\t\t\t\t\tgetOptionKey={getOptionKey}\n\t\t\t\t\t\t\t\t\t\tgetOptionGroup={getOptionGroup}\n\t\t\t\t\t\t\t\t\t\tgetOptionDisabled={isOptionDisabled}\n\t\t\t\t\t\t\t\t\t\tgetOptionId={getOptionId}\n\t\t\t\t\t\t\t\t\t\tsetOptionRef={setOptionRef}\n\t\t\t\t\t\t\t\t\t\ttoggleOption={toggleDraftSelection}\n\t\t\t\t\t\t\t\t\t\tselectOnlyOption={selectOnlyOption}\n\t\t\t\t\t\t\t\t\t\trenderOption={optionRenderer}\n\t\t\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t\t\t{selectedEntries.length > 0 && availableEntries.length > 0 && (\n\t\t\t\t\t\t\t\t\t\t<Separator aria-hidden=\"true\" className=\"marginBlockSm\" />\n\t\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t\t<MultiSelectOptionList\n\t\t\t\t\t\t\t\t\t\tentries={availableEntries}\n\t\t\t\t\t\t\t\t\t\tsectionId={`${listId}-available`}\n\t\t\t\t\t\t\t\t\t\tlistId={listId}\n\t\t\t\t\t\t\t\t\t\tactiveIndex={activeIndex}\n\t\t\t\t\t\t\t\t\t\tselectedKeys={selectedKeys}\n\t\t\t\t\t\t\t\t\t\tquery={currentQuery}\n\t\t\t\t\t\t\t\t\t\thighlightQuery={currentHighlightQuery}\n\t\t\t\t\t\t\t\t\t\tgetOptionKey={getOptionKey}\n\t\t\t\t\t\t\t\t\t\tgetOptionGroup={getOptionGroup}\n\t\t\t\t\t\t\t\t\t\tgetOptionDisabled={isOptionDisabled}\n\t\t\t\t\t\t\t\t\t\tgetOptionId={getOptionId}\n\t\t\t\t\t\t\t\t\t\tsetOptionRef={setOptionRef}\n\t\t\t\t\t\t\t\t\t\ttoggleOption={toggleDraftSelection}\n\t\t\t\t\t\t\t\t\t\tselectOnlyOption={selectOnlyOption}\n\t\t\t\t\t\t\t\t\t\trenderOption={optionRenderer}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</MultiSelectOptionsWrapper>\n\t\t\t\t\t\t</PickerPopup>\n\t\t\t\t\t</>\n\t\t\t\t);\n\t\t\t}}\n\t\t</PickerField>\n\t);\n}\n","import { type ReactNode, type Ref, useMemo } from \"react\";\n\nimport { type CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata-service\";\n\nimport { type UiBaseProps } from \"../../types\";\nimport { adaptLegacyMultiSelectOptionDisableContext, adaptLegacyMultiSelectRenderContext } from \"../lib/adaptLegacyMultiSelectContext\";\nimport { resolveLegacyMultiSelectTextKey } from \"../lib/resolveLegacyMultiSelectTextKey\";\n\nimport {\n\ttype MultiSelectItemState,\n\ttype MultiSelectOptionContent,\n\ttype MultiSelectOptionDisableContext,\n\ttype MultiSelectRenderContext\n} from \"./legacyMultiSelectTypes\";\nimport { OptionMultiSelectCore } from \"./OptionMultiSelectCore\";\n\ntype MultiSelectOptionalRenderer<TContext> = ((context: TContext) => ReactNode) | null | false;\n\ninterface MultiSelectRenderers {\n\trenderToken?: MultiSelectOptionalRenderer<MultiSelectRenderContext>;\n\trenderToolbar?: MultiSelectOptionalRenderer<MultiSelectRenderContext>;\n\trenderItem?: (item: CollectionItem, state: MultiSelectItemState) => MultiSelectOptionContent;\n}\n\nexport interface MultiSelectProps<TOption extends Record<string, string> = CollectionItem>\n\textends MultiSelectRenderers, UiBaseProps<TOption[]> {\n\tcodeKey: string;\n\ttextKey?: string;\n\thideCode?: boolean;\n\tquery?: string;\n\tdefaultQuery?: string;\n\thighlightQuery?: string;\n\tonQuery?: (value: string) => void;\n\tdefaultFilter?: boolean;\n\titems: TOption[];\n\tgetOptionDisabled?: (item: TOption, context: MultiSelectOptionDisableContext) => boolean;\n\tonOpen?: () => void;\n\tonClose?: (value: TOption[]) => void;\n\terror?: string;\n\tisLoading?: boolean;\n}\n\n/**\n * Совместимый адаптер исходного codeKey/textKey API. Новым typed-consumers следует\n * использовать `OptionMultiSelect`, а OData-обёртки продолжают работать через\n * опубликованный контракт без изменения selection semantics.\n */\nexport function MultiSelect({\n\tref,\n\tcodeKey,\n\ttextKey,\n\thideCode,\n\titems,\n\tvalue,\n\tonChange,\n\tgetOptionDisabled,\n\tonClose,\n\trenderToken,\n\trenderToolbar,\n\trenderItem,\n\t...props\n}: MultiSelectProps & { ref?: Ref<HTMLInputElement> }) {\n\tconst selectedItems = useMemo(() => value ?? [], [value]);\n\tconst resolvedTextKey = useMemo(\n\t\t() => resolveLegacyMultiSelectTextKey([...selectedItems, ...items], codeKey, textKey),\n\t\t[codeKey, items, selectedItems, textKey]\n\t);\n\tconst adaptedRenderToken =\n\t\ttypeof renderToken === \"function\"\n\t\t\t? (context: Parameters<typeof adaptLegacyMultiSelectRenderContext>[0]) =>\n\t\t\t\t\trenderToken(adaptLegacyMultiSelectRenderContext(context))\n\t\t\t: renderToken;\n\tconst adaptedRenderToolbar =\n\t\ttypeof renderToolbar === \"function\"\n\t\t\t? (context: Parameters<typeof adaptLegacyMultiSelectRenderContext>[0]) =>\n\t\t\t\t\trenderToolbar(adaptLegacyMultiSelectRenderContext(context))\n\t\t\t: renderToolbar;\n\n\treturn (\n\t\t<OptionMultiSelectCore\n\t\t\t{...props}\n\t\t\tref={ref}\n\t\t\tpreserveOptionArrayReference\n\t\t\toptions={items}\n\t\t\tvalue={selectedItems}\n\t\t\tonChange={onChange}\n\t\t\tgetOptionKey={(item) => item[codeKey]}\n\t\t\tgetOptionLabel={(item) => item[resolvedTextKey] ?? item[codeKey] ?? \"\"}\n\t\t\tgetOptionCode={hideCode ? undefined : (item) => item[codeKey] ?? \"\"}\n\t\t\tgetOptionSearchText={(item) => Array.from(new Set([item[resolvedTextKey], item[codeKey], ...Object.values(item)]))}\n\t\t\tgetOptionDisabled={\n\t\t\t\tgetOptionDisabled\n\t\t\t\t\t? (item, context) => getOptionDisabled(item, adaptLegacyMultiSelectOptionDisableContext(context))\n\t\t\t\t\t: undefined\n\t\t\t}\n\t\t\tonClose={onClose}\n\t\t\trenderToken={adaptedRenderToken}\n\t\t\trenderToolbar={adaptedRenderToolbar}\n\t\t\trenderOption={\n\t\t\t\trenderItem\n\t\t\t\t\t? (item, state) => renderItem(item, state)\n\t\t\t\t\t: (item) => ({\n\t\t\t\t\t\t\ttext: item[resolvedTextKey] ?? \"\",\n\t\t\t\t\t\t\tcode: hideCode ? undefined : (item[codeKey] ?? \"\")\n\t\t\t\t\t\t})\n\t\t\t}\n\t\t/>\n\t);\n}\n\nMultiSelect.displayName = \"MultiSelect\";\n\nexport {\n\ttype MultiSelectItemState,\n\ttype MultiSelectOptionContent,\n\ttype MultiSelectOptionDisableContext,\n\ttype MultiSelectRenderContext\n} from \"./legacyMultiSelectTypes\";\n","import { type Ref } from \"react\";\n\nimport { type UiBaseProps } from \"../../types\";\n\nimport { OptionMultiSelectCore } from \"./OptionMultiSelectCore\";\nimport {\n\ttype OptionMultiSelectOptionDisableContext,\n\ttype OptionMultiSelectOptionGroup,\n\ttype OptionMultiSelectOptionKey,\n\ttype OptionMultiSelectRenderers\n} from \"./optionMultiSelectTypes\";\n\n/**\n * Типобезопасный контракт множественного выбора. Опция остаётся в исходной\n * domain/view-model форме, а UI получает только необходимые selector-функции.\n */\nexport type OptionMultiSelectProps<TOption> = OptionMultiSelectRenderers<TOption> &\n\tOmit<UiBaseProps<TOption[], readonly TOption[]>, \"onChange\"> &\n\tReadonly<{\n\t\tref?: Ref<HTMLInputElement>;\n\t\toptions: readonly TOption[];\n\t\tonChange: (value: TOption[]) => void;\n\t\tgetOptionKey: (option: TOption) => OptionMultiSelectOptionKey;\n\t\tgetOptionLabel: (option: TOption) => string;\n\t\tgetOptionCode?: (option: TOption) => string | undefined;\n\t\tgetOptionGroup?: (option: TOption) => OptionMultiSelectOptionGroup | undefined;\n\t\tgetOptionSearchText?: (option: TOption) => string | readonly string[];\n\t\tgetOptionDisabled?: (option: TOption, context: OptionMultiSelectOptionDisableContext<TOption>) => boolean;\n\t\tquery?: string;\n\t\tdefaultQuery?: string;\n\t\thighlightQuery?: string;\n\t\tonQuery?: (value: string) => void;\n\t\tdefaultFilter?: boolean;\n\t\tonOpen?: () => void;\n\t\tonClose?: (value: TOption[]) => void;\n\t\terror?: string;\n\t\tisLoading?: boolean;\n\t}>;\n\n/** Множественный выбор для произвольной типизированной коллекции опций. */\nexport function OptionMultiSelect<TOption>(props: OptionMultiSelectProps<TOption>) {\n\treturn <OptionMultiSelectCore {...props} />;\n}\n","import { ODataCollectionModel, ODataSelectBaseProps } from \"@ryuzaki13/react-foundation-api/odata\";\nimport { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata-service\";\n\nimport { mapSelectedItemsToValues, useODataSelectBase } from \"../../select/model/useODataSelectBase\";\n\ninterface UseODataMultiSelectOptions extends Omit<ODataSelectBaseProps, \"model\"> {\n\tmodel: Required<ODataCollectionModel>;\n\tonChange: (keys: string[]) => void;\n}\n\nexport function useODataMultiSelect({ odata, segment, model, value, dependencies, onChange }: UseODataMultiSelectOptions) {\n\tconst odataModel = useODataSelectBase({\n\t\todata,\n\t\tsegment,\n\t\tmodel,\n\t\tvalue,\n\t\tdependencies\n\t});\n\n\tconst handleChange = (items: CollectionItem[]) => {\n\t\tonChange(mapSelectedItemsToValues(items, odataModel.selectionKey));\n\t};\n\n\treturn {\n\t\t...odataModel,\n\t\thandleChange\n\t};\n}\n","import { ODataSelectBaseProps, useODataCollectionModel } from \"@ryuzaki13/react-foundation-api/odata\";\n\nimport { UiBaseProps } from \"../../types\";\nimport { useODataMultiSelect } from \"../model/useODataMultiSelect\";\n\nimport { MultiSelect } from \"./MultiSelect\";\n\ntype ODataMultiSelectProps = ODataSelectBaseProps & Omit<UiBaseProps<string[]>, \"placeholder\"> & {};\n\nexport function ODataMultiSelect({\n\todata,\n\tsegment,\n\tmodel: initialModel,\n\tlabel,\n\tdescription,\n\tdisabled,\n\tvalue,\n\tdependencies,\n\tonChange,\n\tsize\n}: ODataMultiSelectProps) {\n\tconst model = useODataCollectionModel(initialModel);\n\tconst odataModel = useODataMultiSelect({\n\t\todata,\n\t\tsegment,\n\t\tmodel,\n\t\tvalue,\n\t\tdependencies,\n\t\tonChange\n\t});\n\n\treturn (\n\t\t<MultiSelect\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tsize={size}\n\t\t\tcodeKey={odataModel.codeKey}\n\t\t\ttextKey={odataModel.textKey}\n\t\t\thideCode={segment.hideCode ?? odata.hideCode}\n\t\t\titems={odataModel.filteredItems}\n\t\t\tvalue={odataModel.selectedItems}\n\t\t\tonChange={odataModel.handleChange}\n\t\t\tonQuery={odataModel.setQuery}\n\t\t\tquery={odataModel.query}\n\t\t\tdefaultFilter={false}\n\t\t\thighlightQuery={odataModel.debouncedQuery}\n\t\t\tisLoading={odataModel.isLoading}\n\t\t\tdisabled={disabled}\n\t\t\tplaceholder={odataModel.placeholder}\n\t\t\terror={odataModel.isError ? \"Ошибка загрузки\" : undefined}\n\t\t/>\n\t);\n}\n","import { useCallback } from \"react\";\n\nimport { useODataDependentSelection } from \"../../odata-dependent\";\n\nimport { ODataMultiSelect } from \"./ODataMultiSelect\";\n\nimport type { ODataDependentSegmentControlProps } from \"../../odata-dependent\";\n\nexport type ODataDependentSegmentMultiSelectProps = ODataDependentSegmentControlProps;\n\nexport function ODataDependentSegmentMultiSelect(props: ODataDependentSegmentMultiSelectProps) {\n\tconst { item, disabled, label, description, size, width = 15 } = props;\n\tconst selection = useODataDependentSelection(props);\n\tconst { updateSegment } = selection;\n\tconst widthStyle = `calc(${width}em + var(--width-add))`;\n\n\tconst handleSelectionChange = useCallback(\n\t\t(keys: string[]) => {\n\t\t\tupdateSegment(item.id, keys);\n\t\t},\n\t\t[item.id, updateSegment]\n\t);\n\n\treturn (\n\t\t<div style={{ maxWidth: widthStyle, minWidth: widthStyle }}>\n\t\t\t<ODataMultiSelect\n\t\t\t\todata={item.odata}\n\t\t\t\tsegment={item.segment}\n\t\t\t\tmodel={item.model}\n\t\t\t\tdependencies={selection.values}\n\t\t\t\tvalue={selection.values[item.id]}\n\t\t\t\tonChange={handleSelectionChange}\n\t\t\t\tdisabled={disabled || selection.isSegmentDisabled(item.id)}\n\t\t\t\tlabel={label}\n\t\t\t\tdescription={description}\n\t\t\t\tsize={size}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n","import { flattenODataDependentServices, type ODataDependentBaseProps } from \"@ryuzaki13/react-foundation-api/odata\";\n\nimport { useODataDependentSelection } from \"../../odata-dependent\";\n\nimport { ODataDependentSegmentMultiSelect } from \"./ODataDependentSegmentMultiSelect\";\n\nimport type { UseODataDependentSelectionOptions } from \"../../odata-dependent\";\n\nexport type ODataDependentMultiSelectProps = Omit<ODataDependentBaseProps, \"dependencies\" | \"value\"> &\n\tUseODataDependentSelectionOptions & {\n\t\t/**\n\t\t * Ширина одного элемента в `em` единицах.\n\t\t *\n\t\t * @default 15\n\t\t */\n\t\twidth?: number;\n\t};\n\nexport function ODataDependentMultiSelect(props: ODataDependentMultiSelectProps) {\n\tconst { width = 15, odata, segments, model, values, defaultValues, onChange, selectionMode, segmentOrder } = props;\n\tconst selection = useODataDependentSelection({ values, defaultValues, onChange });\n\tconst segmentSelectionProps =\n\t\tselectionMode === \"sequential\" ? { selectionMode: \"sequential\" as const, segmentOrder } : { selectionMode, segmentOrder };\n\tconst items = flattenODataDependentServices([\n\t\t{\n\t\t\todata,\n\t\t\tsegments,\n\t\t\tmodel\n\t\t}\n\t]);\n\n\treturn items.map((item) => (\n\t\t<ODataDependentSegmentMultiSelect\n\t\t\tkey={item.id}\n\t\t\titem={item}\n\t\t\tvalues={selection.values}\n\t\t\tonChange={selection.updateValues}\n\t\t\t{...segmentSelectionProps}\n\t\t\twidth={width}\n\t\t/>\n\t));\n}\n","import { MultiSelect } from \"./MultiSelect\";\n\nimport type { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata-service\";\nimport type { UiBaseProps } from \"../../types\";\n\ntype SerializableOptionRecord = Record<string, unknown>;\n\ntype SerializableOptionKeyField<TOption extends SerializableOptionRecord> = {\n\t[K in keyof TOption]: Extract<TOption[K], string> extends never ? never : K;\n}[keyof TOption];\n\nexport interface SerializableMultiSelectProps<\n\tTOption extends SerializableOptionRecord,\n\tTOptionKey extends SerializableOptionKeyField<TOption>,\n\tTOptionLabel extends keyof TOption\n> extends UiBaseProps<Extract<TOption[TOptionKey], string>[]> {\n\toptions: readonly TOption[];\n\toptionKey: TOptionKey;\n\toptionLabel: TOptionLabel;\n\trenderCode?: true;\n}\n\nfunction getSerializableOptionKey<TOption extends SerializableOptionRecord, TOptionKey extends SerializableOptionKeyField<TOption>>(\n\toption: TOption,\n\toptionKey: TOptionKey\n): Extract<TOption[TOptionKey], string> {\n\treturn option[optionKey] as Extract<TOption[TOptionKey], string>;\n}\n\nfunction getSerializableOptionLabel<\n\tTOption extends SerializableOptionRecord,\n\tTOptionKey extends SerializableOptionKeyField<TOption>,\n\tTOptionLabel extends keyof TOption\n>(option: TOption, optionLabel: TOptionLabel, optionKey: TOptionKey): string {\n\tconst label = option[optionLabel];\n\n\tif (typeof label === \"string\") {\n\t\treturn label;\n\t}\n\n\tconst key = getSerializableOptionKey(option, optionKey);\n\treturn typeof key === \"string\" ? key : String(key);\n}\n\nexport function SerializableMultiSelect<\n\tTOption extends SerializableOptionRecord,\n\tTOptionKey extends SerializableOptionKeyField<TOption>,\n\tTOptionLabel extends keyof TOption\n>({\n\tlabel,\n\tdescription,\n\tdisabled,\n\tplaceholder,\n\tsize,\n\toptions,\n\tvalue,\n\tonChange,\n\toptionKey,\n\toptionLabel,\n\trenderCode\n}: SerializableMultiSelectProps<TOption, TOptionKey, TOptionLabel>) {\n\t// Как будто можно не мемоизировать, нет смысла\n\tconst items = options.map<CollectionItem>((option) => ({\n\t\tkey: String(getSerializableOptionKey(option, optionKey)),\n\t\ttext: getSerializableOptionLabel(option, optionLabel, optionKey)\n\t}));\n\tconst selectedKeys = new Set((value ?? []).map((item) => String(item)));\n\tconst selectedItems = items.filter((item) => selectedKeys.has(item.key));\n\n\treturn (\n\t\t<MultiSelect\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tdisabled={disabled}\n\t\t\tplaceholder={placeholder}\n\t\t\tsize={size}\n\t\t\titems={items}\n\t\t\tcodeKey=\"key\"\n\t\t\ttextKey=\"text\"\n\t\t\thideCode={renderCode ? undefined : true}\n\t\t\tvalue={selectedItems}\n\t\t\tonChange={(nextItems) => onChange(nextItems.map((item) => item.key) as Extract<TOption[TOptionKey], string>[])}\n\t\t/>\n\t);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/multi-select/lib/materializeMultiSelectOptions.ts","../../src/multi-select/lib/adaptLegacyMultiSelectContext.ts","../../src/multi-select/lib/resolveLegacyMultiSelectTextKey.ts","../../src/multi-select/lib/multiSelectSelection.ts","../../src/multi-select/ui/MultiSelect.module.scss","../../src/multi-select/lib/createMultiSelectOptionSections.ts","../../src/multi-select/ui/MultiSelectOptionRow.tsx","../../src/multi-select/ui/MultiSelectOptionList.tsx","../../src/multi-select/ui/MultiSelectOptionSkeleton.tsx","../../src/multi-select/ui/MultiSelectOptionsWrapper.tsx","../../src/multi-select/ui/MultiSelectCore.tsx","../../src/multi-select/ui/DeprecatedMultiSelect.tsx","../../src/multi-select/ui/MultiSelect.tsx","../../src/multi-select/model/useODataMultiSelect.ts","../../src/multi-select/ui/ODataMultiSelect.tsx","../../src/multi-select/ui/ODataDependentSegmentMultiSelect.tsx","../../src/multi-select/ui/ODataDependentMultiSelect.tsx","../../src/multi-select/ui/SerializableMultiSelect.tsx"],"sourcesContent":["/**\n * Создаёт mutable-снимок readonly options. Сохранение ссылки включается только\n * legacy-адаптером, чей опубликованный callback-контракт исторически mutable.\n */\nexport function materializeMultiSelectOptions<TOption>(options: readonly TOption[], preserveArrayReference = false): TOption[] {\n\tif (preserveArrayReference && Array.isArray(options)) {\n\t\treturn options;\n\t}\n\n\treturn [...options];\n}\n","import { type CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata-service\";\n\nimport { type DeprecatedMultiSelectOptionDisableContext, type DeprecatedMultiSelectRenderContext } from \"../ui/legacyMultiSelectTypes\";\nimport {\n\ttype MultiSelectOptionDisableContext,\n\ttype MultiSelectRenderContext as GenericMultiSelectRenderContext\n} from \"../ui/multiSelectTypes\";\n\nimport { materializeMultiSelectOptions } from \"./materializeMultiSelectOptions\";\n\n/** Преобразует generic render-context в опубликованный legacy-контракт. */\nexport function adaptLegacyMultiSelectRenderContext(\n\tcontext: GenericMultiSelectRenderContext<CollectionItem>\n): DeprecatedMultiSelectRenderContext {\n\treturn {\n\t\tselectedItems: materializeMultiSelectOptions(context.selectedOptions, true),\n\t\tcommittedSelectedItems: materializeMultiSelectOptions(context.committedSelectedOptions, true),\n\t\tavailableItems: materializeMultiSelectOptions(context.availableOptions, true),\n\t\tquery: context.query,\n\t\topen: context.open,\n\t\tclearSelection: context.clearSelection,\n\t\tselectAll: context.selectAll,\n\t\tdeselectAll: context.deselectAll\n\t};\n}\n\n/** Преобразует generic disable-context без изменения identity выбранных элементов. */\nexport function adaptLegacyMultiSelectOptionDisableContext(\n\tcontext: MultiSelectOptionDisableContext<CollectionItem>\n): DeprecatedMultiSelectOptionDisableContext {\n\treturn {\n\t\tselectedItems: materializeMultiSelectOptions(context.selectedOptions, true),\n\t\tcommittedSelectedItems: materializeMultiSelectOptions(context.committedSelectedOptions, true),\n\t\tselectedKeys: context.selectedKeys,\n\t\topen: context.open\n\t};\n}\n","import { type CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata-service\";\n\n/** Сохраняет исходное правило вывода textKey для legacy code/text API. */\nexport function resolveLegacyMultiSelectTextKey(items: readonly CollectionItem[], codeKey: string, textKey?: string) {\n\tif (textKey) {\n\t\treturn textKey;\n\t}\n\n\tconst sampleItem = items[0];\n\n\tif (!sampleItem) {\n\t\treturn codeKey;\n\t}\n\n\treturn Object.keys(sampleItem).find((key) => key !== codeKey) ?? codeKey;\n}\n","import { type MultiSelectOptionKey } from \"../ui/multiSelectTypes\";\n\n/** Сравнивает наборы выбора по identity опций, не связывая их с object reference. */\nexport function areMultiSelectSelectionsEqual<TOption>(\n\tleft: readonly TOption[],\n\tright: readonly TOption[],\n\tgetOptionKey: (option: TOption) => MultiSelectOptionKey\n): boolean {\n\tif (left.length !== right.length) {\n\t\treturn false;\n\t}\n\n\tconst rightKeys = new Set(right.map(getOptionKey));\n\n\treturn left.every((option) => rightKeys.has(getOptionKey(option)));\n}\n","@use \"@/styles/mixins\" as *;\n\n.multiSelect {\n\t// Общий контейнер\n\tpadding: 0;\n}\n\n.optionCheckBox {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tflex-shrink: 0;\n\n\t--check-box-control-size: auto;\n\tpadding-left: var(--space-sm);\n}\n\n.optionActionCell {\n\tdisplay: flex;\n\talign-self: stretch;\n\tflex: 1 1 0;\n\tmin-width: 0;\n}\n","import { type MultiSelectOptionGroup } from \"../ui/multiSelectTypes\";\n\nexport type MultiSelectOptionEntry<TOption> = Readonly<{\n\toption: TOption;\n\tindex: number;\n}>;\n\nexport type MultiSelectOptionSection<TOption> = Readonly<{\n\tgroup: MultiSelectOptionGroup | undefined;\n\tentries: readonly MultiSelectOptionEntry<TOption>[];\n}>;\n\n/**\n * Группирует только соседние опции и сохраняет их глобальные индексы. Благодаря\n * этому визуальные заголовки не попадают в active-index клавиатурной навигации.\n */\nexport function createMultiSelectOptionSections<TOption>(\n\tentries: readonly MultiSelectOptionEntry<TOption>[],\n\tgetOptionGroup: (option: TOption) => MultiSelectOptionGroup | undefined\n): readonly MultiSelectOptionSection<TOption>[] {\n\tconst sections: Array<{\n\t\tgroup: MultiSelectOptionGroup | undefined;\n\t\tentries: MultiSelectOptionEntry<TOption>[];\n\t}> = [];\n\n\tfor (const entry of entries) {\n\t\tconst group = getOptionGroup(entry.option);\n\t\tconst currentSection = sections.at(-1);\n\t\tconst belongsToCurrentSection = currentSection?.group?.key === group?.key;\n\n\t\tif (currentSection && belongsToCurrentSection) {\n\t\t\tcurrentSection.entries.push(entry);\n\t\t\tcontinue;\n\t\t}\n\n\t\tsections.push({ group, entries: [entry] });\n\t}\n\n\treturn sections;\n}\n","import { CheckBox } from \"../../check-box\";\nimport { Option, OptionButton } from \"../../option\";\n\nimport styles from \"./MultiSelect.module.scss\";\nimport { type MultiSelectOptionContent, type MultiSelectOptionKey, type MultiSelectOptionState } from \"./multiSelectTypes\";\n\ntype MultiSelectOptionRowProps<TOption> = Readonly<{\n\toption: TOption;\n\tindex: number;\n\tlistId: string;\n\tactiveIndex: number;\n\tselectedKeys: ReadonlySet<MultiSelectOptionKey>;\n\tquery: string;\n\thighlightQuery: string;\n\tgetOptionKey: (option: TOption) => MultiSelectOptionKey;\n\tgetOptionDisabled?: (option: TOption) => boolean;\n\tgetOptionId: (listId: string, index: number) => string;\n\tsetOptionRef: (index: number, node: HTMLElement | null) => void;\n\ttoggleOption: (option: TOption) => void;\n\tselectOnlyOption: (option: TOption) => void;\n\trenderOption: (option: TOption, state: MultiSelectOptionState) => MultiSelectOptionContent;\n}>;\n\n/** Одна интерактивная строка grid: checkbox меняет draft, основная кнопка подтверждает только эту опцию. */\nexport function MultiSelectOptionRow<TOption>({\n\toption,\n\tindex,\n\tlistId,\n\tactiveIndex,\n\tselectedKeys,\n\tquery,\n\thighlightQuery,\n\tgetOptionKey,\n\tgetOptionDisabled,\n\tgetOptionId,\n\tsetOptionRef,\n\ttoggleOption,\n\tselectOnlyOption,\n\trenderOption\n}: MultiSelectOptionRowProps<TOption>) {\n\tconst active = index === activeIndex;\n\tconst optionKey = getOptionKey(option);\n\tconst selected = selectedKeys.has(optionKey);\n\tconst optionDisabled = getOptionDisabled?.(option) ?? false;\n\tconst content = renderOption(option, { selected, active, disabled: optionDisabled, query, highlightQuery });\n\n\treturn (\n\t\t<Option\n\t\t\tid={getOptionId(listId, index)}\n\t\t\tref={(node) => setOptionRef(index, node)}\n\t\t\trole=\"row\"\n\t\t\taria-selected={selected}\n\t\t\taria-disabled={optionDisabled || undefined}\n\t\t\tselected={selected}\n\t\t\tactive={active}\n\t\t\tdisabled={optionDisabled}>\n\t\t\t<div\n\t\t\t\trole=\"gridcell\"\n\t\t\t\tclassName={styles.optionCheckBox}\n\t\t\t\tonMouseDown={(event) => event.stopPropagation()}\n\t\t\t\tonClick={(event) => event.stopPropagation()}>\n\t\t\t\t<CheckBox\n\t\t\t\t\tvalue={selected}\n\t\t\t\t\tdisabled={optionDisabled}\n\t\t\t\t\taria-label={`${selected ? \"Убрать\" : \"Добавить\"} «${content.text}» ${selected ? \"из выбора\" : \"в выбор\"}`}\n\t\t\t\t\tonChange={() => toggleOption(option)}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t\t<div role=\"gridcell\" className={styles.optionActionCell}>\n\t\t\t\t<OptionButton\n\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\tdisabled={optionDisabled}\n\t\t\t\t\taria-label={`Выбрать только «${content.text}»`}\n\t\t\t\t\ttext={content.text}\n\t\t\t\t\tcode={content.code}\n\t\t\t\t\tsearchText={highlightQuery}\n\t\t\t\t\tonMouseDown={(event) => event.preventDefault()}\n\t\t\t\t\tonClick={() => selectOnlyOption(option)}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</Option>\n\t);\n}\n","import { Fragment } from \"react\";\n\nimport uiStyles from \"../../ui.module.scss\";\nimport { createMultiSelectOptionSections, type MultiSelectOptionEntry } from \"../lib/createMultiSelectOptionSections\";\n\nimport { MultiSelectOptionRow } from \"./MultiSelectOptionRow\";\nimport {\n\ttype MultiSelectOptionContent,\n\ttype MultiSelectOptionGroup,\n\ttype MultiSelectOptionKey,\n\ttype MultiSelectOptionState\n} from \"./multiSelectTypes\";\n\ntype MultiSelectOptionListProps<TOption> = Readonly<{\n\tentries: readonly MultiSelectOptionEntry<TOption>[];\n\tsectionId: string;\n\tlistId: string;\n\tactiveIndex: number;\n\tselectedKeys: ReadonlySet<MultiSelectOptionKey>;\n\tquery: string;\n\thighlightQuery: string;\n\tgetOptionKey: (option: TOption) => MultiSelectOptionKey;\n\tgetOptionGroup?: (option: TOption) => MultiSelectOptionGroup | undefined;\n\tgetOptionDisabled?: (option: TOption) => boolean;\n\tgetOptionId: (listId: string, index: number) => string;\n\tsetOptionRef: (index: number, node: HTMLElement | null) => void;\n\ttoggleOption: (option: TOption) => void;\n\tselectOnlyOption: (option: TOption) => void;\n\trenderOption: (option: TOption, state: MultiSelectOptionState) => MultiSelectOptionContent;\n}>;\n\n/** Рендерит одну selected/available-секцию, сохраняя global option indexes при группировке. */\nexport function MultiSelectOptionList<TOption>({ entries, sectionId, getOptionGroup, ...rowProps }: MultiSelectOptionListProps<TOption>) {\n\tconst sections = getOptionGroup ? createMultiSelectOptionSections(entries, getOptionGroup) : [{ group: undefined, entries }];\n\n\treturn sections.map((section, sectionIndex) => {\n\t\tconst rows = section.entries.map(({ option, index }) => (\n\t\t\t<MultiSelectOptionRow key={`${rowProps.getOptionKey(option)}-${index}`} option={option} index={index} {...rowProps} />\n\t\t));\n\n\t\tif (!section.group) {\n\t\t\treturn <Fragment key={`${sectionId}-ungrouped-${sectionIndex}`}>{rows}</Fragment>;\n\t\t}\n\n\t\tconst groupLabelId = `${sectionId}-group-${sectionIndex}`;\n\n\t\treturn (\n\t\t\t<div key={`${sectionId}-${section.group.key}-${sectionIndex}`} role=\"rowgroup\" aria-labelledby={groupLabelId}>\n\t\t\t\t<div id={groupLabelId} role=\"row\" className={uiStyles.uiPopupGroupLabel}>\n\t\t\t\t\t<div role=\"gridcell\">{section.group.label}</div>\n\t\t\t\t</div>\n\t\t\t\t{rows}\n\t\t\t</div>\n\t\t);\n\t});\n}\n","import { Text } from \"../../text\";\nimport uiStyles from \"../../ui.module.scss\";\n\ninterface MultiSelectOptionSkeletonProps {\n\ttext: string;\n\tisError?: boolean;\n}\n\n/**\n * Скелетон строки опции для `MultiSelect`. Используется во время загрузки или при отображении ошибок получения списка.\n */\nexport function MultiSelectOptionSkeleton({ text, isError }: MultiSelectOptionSkeletonProps) {\n\treturn (\n\t\t<div className={uiStyles.uiPopupOption}>\n\t\t\t<span className={uiStyles.uiPopupOptionIcon}></span>\n\t\t\t<Text color={isError ? \"error\" : \"primary\"}>{text}</Text>\n\t\t</div>\n\t);\n}\n","import { type PropsWithChildren } from \"react\";\n\nimport { PickerStatus } from \"../../picker\";\n\nimport { MultiSelectOptionSkeleton } from \"./MultiSelectOptionSkeleton\";\n\ntype MultiSelectOptionsWrapperProps = PropsWithChildren<{\n\tisNoData?: boolean;\n\terror?: string;\n}>;\n\n/** Выбирает одно доступное состояние тела popup, не меняя структуру самого grid. */\nexport function MultiSelectOptionsWrapper({ isNoData, error, children }: MultiSelectOptionsWrapperProps) {\n\tif (isNoData) {\n\t\treturn <PickerStatus emptyState={<MultiSelectOptionSkeleton text=\"Нет данных\" />} />;\n\t}\n\n\tif (error) {\n\t\treturn <PickerStatus errorState={<MultiSelectOptionSkeleton isError text=\"Ошибка загрузки\" />} />;\n\t}\n\n\treturn <>{children}</>;\n}\n","import { useCallback, useMemo, useRef, useState } from \"react\";\n\nimport {\n\textractPickerTextContent,\n\tPickerField,\n\tPickerPopup,\n\tPickerTrigger,\n\tusePickerDefaultFilter,\n\tusePickerFloatingListbox,\n\tusePickerQuery,\n\tusePickerSelectionLifecycle,\n\tusePickerTriggerController\n} from \"../../picker\";\nimport { Separator } from \"../../separator\";\nimport { formatMultiSelectOptionCount } from \"../lib/formatMultiSelectOptionCount\";\nimport { materializeMultiSelectOptions } from \"../lib/materializeMultiSelectOptions\";\nimport { areMultiSelectSelectionsEqual } from \"../lib/multiSelectSelection\";\n\nimport { type MultiSelectProps } from \"./MultiSelect\";\nimport styles from \"./MultiSelect.module.scss\";\nimport { MultiSelectOptionList } from \"./MultiSelectOptionList\";\nimport { MultiSelectOptionsWrapper } from \"./MultiSelectOptionsWrapper\";\nimport { type MultiSelectOptionDisableContext } from \"./multiSelectTypes\";\n\ntype MultiSelectCoreProps<TOption> = MultiSelectProps<TOption> &\n\tReadonly<{\n\t\t/** Сохраняет опубликованную ссылочную семантику только для legacy MultiSelect. */\n\t\tpreserveOptionArrayReference?: boolean;\n\t}>;\n\n/**\n * Единая generic-реализация множественного выбора. Публичные компоненты только\n * адаптируют свои контракты к этим selector-функциям, поэтому focus и a11y\n * поведение не расходятся между новым и legacy API.\n */\nexport function MultiSelectCore<TOption>({\n\tref,\n\toptions,\n\tvalue,\n\tonChange,\n\tgetOptionKey,\n\tgetOptionLabel,\n\tgetOptionCode,\n\tgetOptionGroup,\n\tgetOptionSearchText,\n\tlabel,\n\tdescription,\n\tplaceholder,\n\tsize,\n\tquery,\n\tdefaultQuery,\n\thighlightQuery,\n\tonQuery,\n\tdefaultFilter = true,\n\tonOpen,\n\tonClose,\n\tgetOptionDisabled,\n\tdisabled,\n\terror,\n\tisLoading,\n\trenderToken,\n\trenderToolbar,\n\trenderOption,\n\tpreserveOptionArrayReference = false\n}: MultiSelectCoreProps<TOption>) {\n\tconst inputRef = useRef<HTMLInputElement | null>(null);\n\tconst [open, setOpen] = useState(false);\n\tconst triggerMode = \"search-multi\";\n\tconst committedSelectedOptions = useMemo(\n\t\t() => materializeMultiSelectOptions(value, preserveOptionArrayReference),\n\t\t[preserveOptionArrayReference, value]\n\t);\n\tconst committedSelectedKeys = useMemo(\n\t\t() => new Set(committedSelectedOptions.map(getOptionKey)),\n\t\t[committedSelectedOptions, getOptionKey]\n\t);\n\tconst availableOptions = useMemo(\n\t\t() => options.filter((option) => !committedSelectedKeys.has(getOptionKey(option))),\n\t\t[committedSelectedKeys, getOptionKey, options]\n\t);\n\tconst {\n\t\tquery: currentQuery,\n\t\tsetQuery,\n\t\tresetQueryOnClose\n\t} = usePickerQuery({\n\t\tquery,\n\t\tdefaultQuery,\n\t\tonQuery,\n\t\ttriggerMode\n\t});\n\tconst handleOpenChange = (nextOpen: boolean) => {\n\t\tif (open && !nextOpen && resetQueryOnClose) {\n\t\t\tsetQuery(\"\");\n\t\t}\n\n\t\tsetOpen(nextOpen);\n\t};\n\tconst getSearchText = useCallback(\n\t\t(option: TOption) =>\n\t\t\tgetOptionSearchText?.(option) ??\n\t\t\t[getOptionLabel(option), getOptionCode?.(option), extractPickerTextContent(getOptionGroup?.(option)?.label)].filter(\n\t\t\t\t(part): part is string => Boolean(part)\n\t\t\t),\n\t\t[getOptionCode, getOptionGroup, getOptionLabel, getOptionSearchText]\n\t);\n\tconst filteredCommittedSelectedOptions = usePickerDefaultFilter({\n\t\toptions: committedSelectedOptions,\n\t\tquery: currentQuery,\n\t\tenabled: defaultFilter,\n\t\tgetSearchText\n\t});\n\tconst filteredAvailableOptions = usePickerDefaultFilter({\n\t\toptions: availableOptions,\n\t\tquery: currentQuery,\n\t\tenabled: defaultFilter,\n\t\tgetSearchText\n\t});\n\tconst visibleOptions = useMemo(\n\t\t() => [...filteredCommittedSelectedOptions, ...filteredAvailableOptions],\n\t\t[filteredAvailableOptions, filteredCommittedSelectedOptions]\n\t);\n\tconst selectedIndex = filteredCommittedSelectedOptions.length > 0 ? 0 : -1;\n\tconst compareSelections = useCallback(\n\t\t(left: TOption[], right: TOption[]) => areMultiSelectSelectionsEqual(left, right, getOptionKey),\n\t\t[getOptionKey]\n\t);\n\tconst {\n\t\tdraftValue: draftSelectedOptions,\n\t\tsetDraftValue: setDraftSelectedOptions,\n\t\tprepareOpen\n\t} = usePickerSelectionLifecycle({\n\t\tvalue: committedSelectedOptions,\n\t\topen,\n\t\tonCommit: onChange,\n\t\tonOpen,\n\t\tonClose,\n\t\tisEqual: compareSelections\n\t});\n\tconst selectedKeys = useMemo(() => new Set(draftSelectedOptions.map(getOptionKey)), [draftSelectedOptions, getOptionKey]);\n\tconst optionDisableContext = useMemo<MultiSelectOptionDisableContext<TOption>>(\n\t\t() => ({\n\t\t\tselectedOptions: draftSelectedOptions,\n\t\t\tcommittedSelectedOptions,\n\t\t\tselectedKeys,\n\t\t\topen\n\t\t}),\n\t\t[committedSelectedOptions, draftSelectedOptions, open, selectedKeys]\n\t);\n\tconst isOptionDisabled = useCallback(\n\t\t(option: TOption) => getOptionDisabled?.(option, optionDisableContext) ?? false,\n\t\t[getOptionDisabled, optionDisableContext]\n\t);\n\tconst {\n\t\tactiveIndex,\n\t\tcontext,\n\t\tfloatingStyles,\n\t\tgetFloatingProps,\n\t\tsetReference,\n\t\tsetFloating,\n\t\tsetOptionRef,\n\t\tclose,\n\t\topenList,\n\t\ttoggleOpen,\n\t\thandleReferenceKeyDown,\n\t\thandleFloatingKeyDown,\n\t\tgetOptionId,\n\t\tgetActiveOptionId\n\t} = usePickerFloatingListbox({\n\t\toptions: visibleOptions,\n\t\tselectedIndex,\n\t\topen,\n\t\tonOpenChange: handleOpenChange,\n\t\tonSelect: undefined,\n\t\tdisabled,\n\t\tgetOptionDisabled: isOptionDisabled,\n\t\tcloseOnSelect: false,\n\t\tallowOpenWithoutOptions: true,\n\t\ttriggerMode\n\t});\n\n\tconst currentHighlightQuery = highlightQuery ?? currentQuery;\n\tconst toggleDraftSelection = (option: TOption) => {\n\t\tconst optionKey = getOptionKey(option);\n\n\t\tsetDraftSelectedOptions((currentOptions) => {\n\t\t\tconst isSelected = currentOptions.some((selectedOption) => getOptionKey(selectedOption) === optionKey);\n\n\t\t\tif (isSelected) {\n\t\t\t\treturn currentOptions.filter((selectedOption) => getOptionKey(selectedOption) !== optionKey);\n\t\t\t}\n\n\t\t\tif (isOptionDisabled(option)) {\n\t\t\t\treturn currentOptions;\n\t\t\t}\n\n\t\t\treturn [...currentOptions, option];\n\t\t});\n\t};\n\n\tconst setInputNode = useCallback(\n\t\t(node: HTMLInputElement | null) => {\n\t\t\tinputRef.current = node;\n\n\t\t\tif (typeof ref === \"function\") {\n\t\t\t\tref(node);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (ref) {\n\t\t\t\tref.current = node;\n\t\t\t}\n\t\t},\n\t\t[ref]\n\t);\n\n\tconst clearSelection = () => {\n\t\tsetDraftSelectedOptions([]);\n\n\t\tif (!open) {\n\t\t\tonChange([]);\n\t\t}\n\t};\n\n\tconst selectAll = () => {\n\t\tsetDraftSelectedOptions((currentOptions) => {\n\t\t\tconst nextOptions = [...currentOptions];\n\t\t\tconst nextSelectedKeys = new Set(currentOptions.map(getOptionKey));\n\n\t\t\tfor (const option of visibleOptions) {\n\t\t\t\tconst optionKey = getOptionKey(option);\n\n\t\t\t\tif (!nextSelectedKeys.has(optionKey) && !isOptionDisabled(option)) {\n\t\t\t\t\tnextSelectedKeys.add(optionKey);\n\t\t\t\t\tnextOptions.push(option);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn nextOptions;\n\t\t});\n\t};\n\n\tconst deselectAll = () => {\n\t\tsetDraftSelectedOptions([]);\n\t};\n\n\tconst selectOnlyOption = (option: TOption) => {\n\t\tif (isOptionDisabled(option)) {\n\t\t\treturn;\n\t\t}\n\n\t\tsetDraftSelectedOptions([option]);\n\t\tclose();\n\t};\n\n\tconst currentSelectedOptions = open ? draftSelectedOptions : committedSelectedOptions;\n\tconst hasSelectedOptions = currentSelectedOptions.length > 0;\n\tconst renderContext = {\n\t\tselectedOptions: currentSelectedOptions,\n\t\tcommittedSelectedOptions,\n\t\tavailableOptions: filteredAvailableOptions,\n\t\tquery: currentQuery,\n\t\topen,\n\t\tclearSelection,\n\t\tselectAll,\n\t\tdeselectAll\n\t};\n\tconst defaultTokenNode =\n\t\tcurrentSelectedOptions.length > 1\n\t\t\t? formatMultiSelectOptionCount(currentSelectedOptions.length)\n\t\t\t: currentSelectedOptions.length === 1\n\t\t\t\t? getOptionLabel(currentSelectedOptions[0])\n\t\t\t\t: undefined;\n\tconst tokenNode = renderToken === undefined ? defaultTokenNode : typeof renderToken === \"function\" ? renderToken(renderContext) : null;\n\tconst toolbarNode = typeof renderToolbar === \"function\" ? renderToolbar(renderContext) : renderToolbar;\n\tconst renderDefaultOption = useCallback(\n\t\t(option: TOption) => ({ text: getOptionLabel(option), code: getOptionCode?.(option) }),\n\t\t[getOptionCode, getOptionLabel]\n\t);\n\tconst optionRenderer = renderOption ?? renderDefaultOption;\n\tconst selectedEntries = filteredCommittedSelectedOptions.map((option, index) => ({ option, index }));\n\tconst availableEntries = filteredAvailableOptions.map((option, index) => ({\n\t\toption,\n\t\tindex: index + selectedEntries.length\n\t}));\n\tconst isNoData = !isLoading && !error && visibleOptions.length === 0;\n\tconst triggerController = usePickerTriggerController({\n\t\tmode: triggerMode,\n\t\topen,\n\t\tcurrentQuery,\n\t\thasDisplayValue: false,\n\t\tinputRef,\n\t\tsetQuery,\n\t\topenList,\n\t\tclose,\n\t\ttoggleOpen,\n\t\tonBeforeOpen: () => {\n\t\t\tif (!open) {\n\t\t\t\tprepareOpen();\n\t\t\t}\n\t\t}\n\t});\n\n\treturn (\n\t\t<PickerField label={label} description={description} disabled={disabled} size={size} className={styles.multiSelect}>\n\t\t\t{({ controlId, labelId, describedBy }) => {\n\t\t\t\tconst listId = `${controlId}-grid`;\n\n\t\t\t\treturn (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<PickerTrigger\n\t\t\t\t\t\t\tref={setInputNode}\n\t\t\t\t\t\t\trootRef={setReference}\n\t\t\t\t\t\t\tid={controlId}\n\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\t\t\tisLoading={isLoading}\n\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\toptionCount={options.length}\n\t\t\t\t\t\t\tlabel={label}\n\t\t\t\t\t\t\tplaceholder={placeholder}\n\t\t\t\t\t\t\tplaceholderFallback=\"Выберите значения\"\n\t\t\t\t\t\t\tvalue={currentQuery}\n\t\t\t\t\t\t\tselectedValue={tokenNode}\n\t\t\t\t\t\t\thasSelection={hasSelectedOptions}\n\t\t\t\t\t\t\tshowSelectedValue={hasSelectedOptions && currentQuery.length === 0}\n\t\t\t\t\t\t\tclearable\n\t\t\t\t\t\t\tonClear={clearSelection}\n\t\t\t\t\t\t\tclearAriaLabel=\"Очистить все\"\n\t\t\t\t\t\t\tonToggleMouseDown={triggerController.handleToggleMouseDown}\n\t\t\t\t\t\t\tonToggleClick={triggerController.handleToggleClick}\n\t\t\t\t\t\t\taria-labelledby={labelId}\n\t\t\t\t\t\t\taria-describedby={describedBy}\n\t\t\t\t\t\t\taria-haspopup=\"grid\"\n\t\t\t\t\t\t\taria-expanded={open}\n\t\t\t\t\t\t\taria-controls={open ? listId : undefined}\n\t\t\t\t\t\t\taria-autocomplete=\"list\"\n\t\t\t\t\t\t\taria-activedescendant={open ? getActiveOptionId(listId) : undefined}\n\t\t\t\t\t\t\trootClassName=\"flex alignItemsCenter\"\n\t\t\t\t\t\t\tonChange={(event) => {\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerInputChange(event.target.value);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonClick={triggerController.handleTriggerClick}\n\t\t\t\t\t\t\tonFocus={(event) => {\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerFocus(event.currentTarget);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\t\t\thandleReferenceKeyDown(event);\n\n\t\t\t\t\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (open && event.ctrlKey && event.key === \" \") {\n\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\tconst activeOption = visibleOptions[activeIndex];\n\t\t\t\t\t\t\t\t\tif (activeIndex >= 0 && activeIndex < visibleOptions.length) {\n\t\t\t\t\t\t\t\t\t\ttoggleDraftSelection(activeOption);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerKeyDown({\n\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\tonActivateWhenOpen: () => {\n\t\t\t\t\t\t\t\t\t\tconst activeOption = visibleOptions[activeIndex];\n\t\t\t\t\t\t\t\t\t\tif (activeIndex >= 0 && activeIndex < visibleOptions.length) {\n\t\t\t\t\t\t\t\t\t\t\tselectOnlyOption(activeOption);\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\tenableClosedArrowDownOpen: true,\n\t\t\t\t\t\t\t\t\tsuppressClosedArrowUp: true\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t<PickerPopup\n\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\tcontext={context}\n\t\t\t\t\t\t\tfloatingStyles={floatingStyles}\n\t\t\t\t\t\t\tlistId={listId}\n\t\t\t\t\t\t\tlabelId={labelId}\n\t\t\t\t\t\t\tdescriptionId={describedBy}\n\t\t\t\t\t\t\tactiveOptionId={open ? getActiveOptionId(listId) : undefined}\n\t\t\t\t\t\t\tariaMultiselectable\n\t\t\t\t\t\t\tpopupRole=\"grid\"\n\t\t\t\t\t\t\tsetFloating={setFloating}\n\t\t\t\t\t\t\tgetFloatingProps={getFloatingProps}\n\t\t\t\t\t\t\tonKeyDown={handleFloatingKeyDown}\n\t\t\t\t\t\t\tinitialFocus={-1}\n\t\t\t\t\t\t\treturnFocus={false}\n\t\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\t\ttoolbar={toolbarNode}\n\t\t\t\t\t\t\tselectionActions={\n\t\t\t\t\t\t\t\trenderToolbar === undefined ? { onSelectAll: selectAll, onDeselectAll: deselectAll } : undefined\n\t\t\t\t\t\t\t}>\n\t\t\t\t\t\t\t<MultiSelectOptionsWrapper isNoData={isNoData} error={error}>\n\t\t\t\t\t\t\t\t<div role=\"presentation\" className=\"scrollable overscroll h100\">\n\t\t\t\t\t\t\t\t\t<MultiSelectOptionList\n\t\t\t\t\t\t\t\t\t\tentries={selectedEntries}\n\t\t\t\t\t\t\t\t\t\tsectionId={`${listId}-selected`}\n\t\t\t\t\t\t\t\t\t\tlistId={listId}\n\t\t\t\t\t\t\t\t\t\tactiveIndex={activeIndex}\n\t\t\t\t\t\t\t\t\t\tselectedKeys={selectedKeys}\n\t\t\t\t\t\t\t\t\t\tquery={currentQuery}\n\t\t\t\t\t\t\t\t\t\thighlightQuery={currentHighlightQuery}\n\t\t\t\t\t\t\t\t\t\tgetOptionKey={getOptionKey}\n\t\t\t\t\t\t\t\t\t\tgetOptionGroup={getOptionGroup}\n\t\t\t\t\t\t\t\t\t\tgetOptionDisabled={isOptionDisabled}\n\t\t\t\t\t\t\t\t\t\tgetOptionId={getOptionId}\n\t\t\t\t\t\t\t\t\t\tsetOptionRef={setOptionRef}\n\t\t\t\t\t\t\t\t\t\ttoggleOption={toggleDraftSelection}\n\t\t\t\t\t\t\t\t\t\tselectOnlyOption={selectOnlyOption}\n\t\t\t\t\t\t\t\t\t\trenderOption={optionRenderer}\n\t\t\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t\t\t{selectedEntries.length > 0 && availableEntries.length > 0 && (\n\t\t\t\t\t\t\t\t\t\t<Separator aria-hidden=\"true\" className=\"marginBlockSm\" />\n\t\t\t\t\t\t\t\t\t)}\n\n\t\t\t\t\t\t\t\t\t<MultiSelectOptionList\n\t\t\t\t\t\t\t\t\t\tentries={availableEntries}\n\t\t\t\t\t\t\t\t\t\tsectionId={`${listId}-available`}\n\t\t\t\t\t\t\t\t\t\tlistId={listId}\n\t\t\t\t\t\t\t\t\t\tactiveIndex={activeIndex}\n\t\t\t\t\t\t\t\t\t\tselectedKeys={selectedKeys}\n\t\t\t\t\t\t\t\t\t\tquery={currentQuery}\n\t\t\t\t\t\t\t\t\t\thighlightQuery={currentHighlightQuery}\n\t\t\t\t\t\t\t\t\t\tgetOptionKey={getOptionKey}\n\t\t\t\t\t\t\t\t\t\tgetOptionGroup={getOptionGroup}\n\t\t\t\t\t\t\t\t\t\tgetOptionDisabled={isOptionDisabled}\n\t\t\t\t\t\t\t\t\t\tgetOptionId={getOptionId}\n\t\t\t\t\t\t\t\t\t\tsetOptionRef={setOptionRef}\n\t\t\t\t\t\t\t\t\t\ttoggleOption={toggleDraftSelection}\n\t\t\t\t\t\t\t\t\t\tselectOnlyOption={selectOnlyOption}\n\t\t\t\t\t\t\t\t\t\trenderOption={optionRenderer}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</MultiSelectOptionsWrapper>\n\t\t\t\t\t\t</PickerPopup>\n\t\t\t\t\t</>\n\t\t\t\t);\n\t\t\t}}\n\t\t</PickerField>\n\t);\n}\n","import { type ReactNode, type Ref, useMemo } from \"react\";\n\nimport { type CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata-service\";\n\nimport { type UiBaseProps } from \"../../types\";\nimport { adaptLegacyMultiSelectOptionDisableContext, adaptLegacyMultiSelectRenderContext } from \"../lib/adaptLegacyMultiSelectContext\";\nimport { resolveLegacyMultiSelectTextKey } from \"../lib/resolveLegacyMultiSelectTextKey\";\n\nimport {\n\ttype DeprecatedMultiSelectItemState,\n\ttype DeprecatedMultiSelectOptionContent,\n\ttype DeprecatedMultiSelectOptionDisableContext,\n\ttype DeprecatedMultiSelectRenderContext\n} from \"./legacyMultiSelectTypes\";\nimport { MultiSelectCore } from \"./MultiSelectCore\";\n\ntype MultiSelectOptionalRenderer<TContext> = ((context: TContext) => ReactNode) | null | false;\n\ninterface MultiSelectRenderers {\n\trenderToken?: MultiSelectOptionalRenderer<DeprecatedMultiSelectRenderContext>;\n\trenderToolbar?: MultiSelectOptionalRenderer<DeprecatedMultiSelectRenderContext>;\n\trenderItem?: (item: CollectionItem, state: DeprecatedMultiSelectItemState) => DeprecatedMultiSelectOptionContent;\n}\n\n/** Контракт устаревшего codeKey/textKey-компонента. */\nexport interface DeprecatedMultiSelectProps<TOption extends Record<string, string> = CollectionItem>\n\textends MultiSelectRenderers, UiBaseProps<TOption[]> {\n\tref?: Ref<HTMLInputElement>;\n\tcodeKey: string;\n\ttextKey?: string;\n\thideCode?: boolean;\n\tquery?: string;\n\tdefaultQuery?: string;\n\thighlightQuery?: string;\n\tonQuery?: (value: string) => void;\n\tdefaultFilter?: boolean;\n\titems: TOption[];\n\tgetOptionDisabled?: (item: TOption, context: DeprecatedMultiSelectOptionDisableContext) => boolean;\n\tonOpen?: () => void;\n\tonClose?: (value: TOption[]) => void;\n\terror?: string;\n\tisLoading?: boolean;\n}\n\n/**\n * Устаревший адаптер OData-подобных `codeKey`/`textKey` коллекций. Компонент\n * сохраняет прежнюю OData-семантику, пока consumers переходят на selector API\n * канонического `MultiSelect`.\n *\n * @deprecated Используйте `MultiSelect` с selector-функциями.\n */\nexport function DeprecatedMultiSelect<TOption extends Record<string, string> = CollectionItem>({\n\tref,\n\tcodeKey,\n\ttextKey,\n\thideCode,\n\titems,\n\tvalue,\n\tonChange,\n\tgetOptionDisabled,\n\tonClose,\n\trenderToken,\n\trenderToolbar,\n\trenderItem,\n\t...props\n}: DeprecatedMultiSelectProps<TOption>) {\n\tconst selectedItems = useMemo(() => value ?? [], [value]);\n\tconst resolvedTextKey = useMemo(\n\t\t() => resolveLegacyMultiSelectTextKey([...selectedItems, ...items], codeKey, textKey),\n\t\t[codeKey, items, selectedItems, textKey]\n\t);\n\tconst adaptedRenderToken =\n\t\ttypeof renderToken === \"function\"\n\t\t\t? (context: Parameters<typeof adaptLegacyMultiSelectRenderContext>[0]) =>\n\t\t\t\t\trenderToken(adaptLegacyMultiSelectRenderContext(context))\n\t\t\t: renderToken;\n\tconst adaptedRenderToolbar =\n\t\ttypeof renderToolbar === \"function\"\n\t\t\t? (context: Parameters<typeof adaptLegacyMultiSelectRenderContext>[0]) =>\n\t\t\t\t\trenderToolbar(adaptLegacyMultiSelectRenderContext(context))\n\t\t\t: renderToolbar;\n\n\treturn (\n\t\t<MultiSelectCore\n\t\t\t{...props}\n\t\t\tref={ref}\n\t\t\tpreserveOptionArrayReference\n\t\t\toptions={items}\n\t\t\tvalue={selectedItems}\n\t\t\tonChange={onChange}\n\t\t\tgetOptionKey={(item) => item[codeKey]}\n\t\t\tgetOptionLabel={(item) => item[resolvedTextKey] ?? item[codeKey] ?? \"\"}\n\t\t\tgetOptionCode={hideCode ? undefined : (item) => item[codeKey] ?? \"\"}\n\t\t\tgetOptionSearchText={(item) => Array.from(new Set([item[resolvedTextKey], item[codeKey], ...Object.values(item)]))}\n\t\t\tgetOptionDisabled={\n\t\t\t\tgetOptionDisabled\n\t\t\t\t\t? (item, context) => getOptionDisabled(item, adaptLegacyMultiSelectOptionDisableContext(context))\n\t\t\t\t\t: undefined\n\t\t\t}\n\t\t\tonClose={onClose}\n\t\t\trenderToken={adaptedRenderToken}\n\t\t\trenderToolbar={adaptedRenderToolbar}\n\t\t\trenderOption={\n\t\t\t\trenderItem\n\t\t\t\t\t? (item, state) => renderItem(item, state)\n\t\t\t\t\t: (item) => ({\n\t\t\t\t\t\t\ttext: item[resolvedTextKey] ?? \"\",\n\t\t\t\t\t\t\tcode: hideCode ? undefined : (item[codeKey] ?? \"\")\n\t\t\t\t\t\t})\n\t\t\t}\n\t\t/>\n\t);\n}\n\nDeprecatedMultiSelect.displayName = \"DeprecatedMultiSelect\";\n\nexport {\n\ttype DeprecatedMultiSelectItemState,\n\ttype DeprecatedMultiSelectOptionContent,\n\ttype DeprecatedMultiSelectOptionDisableContext,\n\ttype DeprecatedMultiSelectRenderContext\n} from \"./legacyMultiSelectTypes\";\n","import { type Ref } from \"react\";\n\nimport { type UiBaseProps } from \"../../types\";\n\nimport { MultiSelectCore } from \"./MultiSelectCore\";\nimport {\n\ttype MultiSelectOptionDisableContext,\n\ttype MultiSelectOptionGroup,\n\ttype MultiSelectOptionKey,\n\ttype MultiSelectRenderers\n} from \"./multiSelectTypes\";\n\n/**\n * Типобезопасный контракт множественного выбора. Опция остаётся в исходной\n * domain/view-model форме, а UI получает только необходимые selector-функции.\n */\nexport type MultiSelectProps<TOption> = MultiSelectRenderers<TOption> &\n\tOmit<UiBaseProps<TOption[], readonly TOption[]>, \"onChange\"> &\n\tReadonly<{\n\t\tref?: Ref<HTMLInputElement>;\n\t\toptions: readonly TOption[];\n\t\tonChange: (value: TOption[]) => void;\n\t\tgetOptionKey: (option: TOption) => MultiSelectOptionKey;\n\t\tgetOptionLabel: (option: TOption) => string;\n\t\tgetOptionCode?: (option: TOption) => string | undefined;\n\t\tgetOptionGroup?: (option: TOption) => MultiSelectOptionGroup | undefined;\n\t\tgetOptionSearchText?: (option: TOption) => string | readonly string[];\n\t\tgetOptionDisabled?: (option: TOption, context: MultiSelectOptionDisableContext<TOption>) => boolean;\n\t\tquery?: string;\n\t\tdefaultQuery?: string;\n\t\thighlightQuery?: string;\n\t\tonQuery?: (value: string) => void;\n\t\tdefaultFilter?: boolean;\n\t\tonOpen?: () => void;\n\t\tonClose?: (value: TOption[]) => void;\n\t\terror?: string;\n\t\tisLoading?: boolean;\n\t}>;\n\n/** Множественный выбор для произвольной типизированной коллекции опций. */\nexport function MultiSelect<TOption>(props: MultiSelectProps<TOption>) {\n\treturn <MultiSelectCore {...props} />;\n}\n","import { ODataCollectionModel, ODataSelectBaseProps } from \"@ryuzaki13/react-foundation-api/odata\";\nimport { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata-service\";\n\nimport { mapSelectedItemsToValues, useODataSelectBase } from \"../../select/model/useODataSelectBase\";\n\ninterface UseODataMultiSelectOptions extends Omit<ODataSelectBaseProps, \"model\"> {\n\tmodel: Required<ODataCollectionModel>;\n\tonChange: (keys: string[]) => void;\n}\n\nexport function useODataMultiSelect({ odata, segment, model, value, dependencies, onChange }: UseODataMultiSelectOptions) {\n\tconst odataModel = useODataSelectBase({\n\t\todata,\n\t\tsegment,\n\t\tmodel,\n\t\tvalue,\n\t\tdependencies\n\t});\n\n\tconst handleChange = (items: CollectionItem[]) => {\n\t\tonChange(mapSelectedItemsToValues(items, odataModel.selectionKey));\n\t};\n\n\treturn {\n\t\t...odataModel,\n\t\thandleChange\n\t};\n}\n","import { ODataSelectBaseProps, useODataCollectionModel } from \"@ryuzaki13/react-foundation-api/odata\";\n\nimport { UiBaseProps } from \"../../types\";\nimport { useODataMultiSelect } from \"../model/useODataMultiSelect\";\n\nimport { DeprecatedMultiSelect } from \"./DeprecatedMultiSelect\";\n\ntype ODataMultiSelectProps = ODataSelectBaseProps & Omit<UiBaseProps<string[]>, \"placeholder\"> & {};\n\nexport function ODataMultiSelect({\n\todata,\n\tsegment,\n\tmodel: initialModel,\n\tlabel,\n\tdescription,\n\tdisabled,\n\tvalue,\n\tdependencies,\n\tonChange,\n\tsize\n}: ODataMultiSelectProps) {\n\tconst model = useODataCollectionModel(initialModel);\n\tconst odataModel = useODataMultiSelect({\n\t\todata,\n\t\tsegment,\n\t\tmodel,\n\t\tvalue,\n\t\tdependencies,\n\t\tonChange\n\t});\n\n\treturn (\n\t\t<DeprecatedMultiSelect\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tsize={size}\n\t\t\tcodeKey={odataModel.codeKey}\n\t\t\ttextKey={odataModel.textKey}\n\t\t\thideCode={segment.hideCode ?? odata.hideCode}\n\t\t\titems={odataModel.filteredItems}\n\t\t\tvalue={odataModel.selectedItems}\n\t\t\tonChange={odataModel.handleChange}\n\t\t\tonQuery={odataModel.setQuery}\n\t\t\tquery={odataModel.query}\n\t\t\tdefaultFilter={false}\n\t\t\thighlightQuery={odataModel.debouncedQuery}\n\t\t\tisLoading={odataModel.isLoading}\n\t\t\tdisabled={disabled}\n\t\t\tplaceholder={odataModel.placeholder}\n\t\t\terror={odataModel.isError ? \"Ошибка загрузки\" : undefined}\n\t\t/>\n\t);\n}\n","import { useCallback } from \"react\";\n\nimport { useODataDependentSelection } from \"../../odata-dependent\";\n\nimport { ODataMultiSelect } from \"./ODataMultiSelect\";\n\nimport type { ODataDependentSegmentControlProps } from \"../../odata-dependent\";\n\nexport type ODataDependentSegmentMultiSelectProps = ODataDependentSegmentControlProps;\n\nexport function ODataDependentSegmentMultiSelect(props: ODataDependentSegmentMultiSelectProps) {\n\tconst { item, disabled, label, description, size, width = 15 } = props;\n\tconst selection = useODataDependentSelection(props);\n\tconst { updateSegment } = selection;\n\tconst widthStyle = `calc(${width}em + var(--width-add))`;\n\n\tconst handleSelectionChange = useCallback(\n\t\t(keys: string[]) => {\n\t\t\tupdateSegment(item.id, keys);\n\t\t},\n\t\t[item.id, updateSegment]\n\t);\n\n\treturn (\n\t\t<div style={{ maxWidth: widthStyle, minWidth: widthStyle }}>\n\t\t\t<ODataMultiSelect\n\t\t\t\todata={item.odata}\n\t\t\t\tsegment={item.segment}\n\t\t\t\tmodel={item.model}\n\t\t\t\tdependencies={selection.values}\n\t\t\t\tvalue={selection.values[item.id]}\n\t\t\t\tonChange={handleSelectionChange}\n\t\t\t\tdisabled={disabled || selection.isSegmentDisabled(item.id)}\n\t\t\t\tlabel={label}\n\t\t\t\tdescription={description}\n\t\t\t\tsize={size}\n\t\t\t/>\n\t\t</div>\n\t);\n}\n","import { flattenODataDependentServices, type ODataDependentBaseProps } from \"@ryuzaki13/react-foundation-api/odata\";\n\nimport { useODataDependentSelection } from \"../../odata-dependent\";\n\nimport { ODataDependentSegmentMultiSelect } from \"./ODataDependentSegmentMultiSelect\";\n\nimport type { UseODataDependentSelectionOptions } from \"../../odata-dependent\";\n\nexport type ODataDependentMultiSelectProps = Omit<ODataDependentBaseProps, \"dependencies\" | \"value\"> &\n\tUseODataDependentSelectionOptions & {\n\t\t/**\n\t\t * Ширина одного элемента в `em` единицах.\n\t\t *\n\t\t * @default 15\n\t\t */\n\t\twidth?: number;\n\t};\n\nexport function ODataDependentMultiSelect(props: ODataDependentMultiSelectProps) {\n\tconst { width = 15, odata, segments, model, values, defaultValues, onChange, selectionMode, segmentOrder } = props;\n\tconst selection = useODataDependentSelection({ values, defaultValues, onChange });\n\tconst segmentSelectionProps =\n\t\tselectionMode === \"sequential\" ? { selectionMode: \"sequential\" as const, segmentOrder } : { selectionMode, segmentOrder };\n\tconst items = flattenODataDependentServices([\n\t\t{\n\t\t\todata,\n\t\t\tsegments,\n\t\t\tmodel\n\t\t}\n\t]);\n\n\treturn items.map((item) => (\n\t\t<ODataDependentSegmentMultiSelect\n\t\t\tkey={item.id}\n\t\t\titem={item}\n\t\t\tvalues={selection.values}\n\t\t\tonChange={selection.updateValues}\n\t\t\t{...segmentSelectionProps}\n\t\t\twidth={width}\n\t\t/>\n\t));\n}\n","import { DeprecatedMultiSelect } from \"./DeprecatedMultiSelect\";\n\nimport type { UiBaseProps } from \"../../types\";\nimport type { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata-service\";\n\ntype SerializableOptionRecord = Record<string, unknown>;\n\ntype SerializableOptionKeyField<TOption extends SerializableOptionRecord> = {\n\t[K in keyof TOption]: Extract<TOption[K], string> extends never ? never : K;\n}[keyof TOption];\n\nexport interface SerializableMultiSelectProps<\n\tTOption extends SerializableOptionRecord,\n\tTOptionKey extends SerializableOptionKeyField<TOption>,\n\tTOptionLabel extends keyof TOption\n> extends UiBaseProps<Extract<TOption[TOptionKey], string>[]> {\n\toptions: readonly TOption[];\n\toptionKey: TOptionKey;\n\toptionLabel: TOptionLabel;\n\trenderCode?: true;\n}\n\nfunction getSerializableOptionKey<TOption extends SerializableOptionRecord, TOptionKey extends SerializableOptionKeyField<TOption>>(\n\toption: TOption,\n\toptionKey: TOptionKey\n): Extract<TOption[TOptionKey], string> {\n\treturn option[optionKey] as Extract<TOption[TOptionKey], string>;\n}\n\nfunction getSerializableOptionLabel<\n\tTOption extends SerializableOptionRecord,\n\tTOptionKey extends SerializableOptionKeyField<TOption>,\n\tTOptionLabel extends keyof TOption\n>(option: TOption, optionLabel: TOptionLabel, optionKey: TOptionKey): string {\n\tconst label = option[optionLabel];\n\n\tif (typeof label === \"string\") {\n\t\treturn label;\n\t}\n\n\tconst key = getSerializableOptionKey(option, optionKey);\n\treturn typeof key === \"string\" ? key : String(key);\n}\n\nexport function SerializableMultiSelect<\n\tTOption extends SerializableOptionRecord,\n\tTOptionKey extends SerializableOptionKeyField<TOption>,\n\tTOptionLabel extends keyof TOption\n>({\n\tlabel,\n\tdescription,\n\tdisabled,\n\tplaceholder,\n\tsize,\n\toptions,\n\tvalue,\n\tonChange,\n\toptionKey,\n\toptionLabel,\n\trenderCode\n}: SerializableMultiSelectProps<TOption, TOptionKey, TOptionLabel>) {\n\t// Как будто можно не мемоизировать, нет смысла\n\tconst items = options.map<CollectionItem>((option) => ({\n\t\tkey: String(getSerializableOptionKey(option, optionKey)),\n\t\ttext: getSerializableOptionLabel(option, optionLabel, optionKey)\n\t}));\n\tconst selectedKeys = new Set((value ?? []).map((item) => String(item)));\n\tconst selectedItems = items.filter((item) => selectedKeys.has(item.key));\n\n\treturn (\n\t\t<DeprecatedMultiSelect\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tdisabled={disabled}\n\t\t\tplaceholder={placeholder}\n\t\t\tsize={size}\n\t\t\titems={items}\n\t\t\tcodeKey=\"key\"\n\t\t\ttextKey=\"text\"\n\t\t\thideCode={renderCode ? undefined : true}\n\t\t\tvalue={selectedItems}\n\t\t\tonChange={(nextItems) => onChange(nextItems.map((item) => item.key) as Extract<TOption[TOptionKey], string>[])}\n\t\t/>\n\t);\n}\n"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { type CollectionItem } from "@ryuzaki13/react-foundation-lib/odata-service";
|
|
2
|
-
import { type
|
|
3
|
-
import { type
|
|
2
|
+
import { type DeprecatedMultiSelectOptionDisableContext, type DeprecatedMultiSelectRenderContext } from "../ui/legacyMultiSelectTypes";
|
|
3
|
+
import { type MultiSelectOptionDisableContext, type MultiSelectRenderContext as GenericMultiSelectRenderContext } from "../ui/multiSelectTypes";
|
|
4
4
|
/** Преобразует generic render-context в опубликованный legacy-контракт. */
|
|
5
|
-
export declare function adaptLegacyMultiSelectRenderContext(context:
|
|
5
|
+
export declare function adaptLegacyMultiSelectRenderContext(context: GenericMultiSelectRenderContext<CollectionItem>): DeprecatedMultiSelectRenderContext;
|
|
6
6
|
/** Преобразует generic disable-context без изменения identity выбранных элементов. */
|
|
7
|
-
export declare function adaptLegacyMultiSelectOptionDisableContext(context:
|
|
7
|
+
export declare function adaptLegacyMultiSelectOptionDisableContext(context: MultiSelectOptionDisableContext<CollectionItem>): DeprecatedMultiSelectOptionDisableContext;
|
|
8
8
|
//# sourceMappingURL=adaptLegacyMultiSelectContext.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adaptLegacyMultiSelectContext.d.ts","sourceRoot":"","sources":["../../../src/multi-select/lib/adaptLegacyMultiSelectContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,+CAA+C,CAAC;AAEpF,OAAO,EAAE,KAAK
|
|
1
|
+
{"version":3,"file":"adaptLegacyMultiSelectContext.d.ts","sourceRoot":"","sources":["../../../src/multi-select/lib/adaptLegacyMultiSelectContext.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,+CAA+C,CAAC;AAEpF,OAAO,EAAE,KAAK,yCAAyC,EAAE,KAAK,kCAAkC,EAAE,MAAM,8BAA8B,CAAC;AACvI,OAAO,EACN,KAAK,+BAA+B,EACpC,KAAK,wBAAwB,IAAI,+BAA+B,EAChE,MAAM,wBAAwB,CAAC;AAIhC,2EAA2E;AAC3E,wBAAgB,mCAAmC,CAClD,OAAO,EAAE,+BAA+B,CAAC,cAAc,CAAC,GACtD,kCAAkC,CAWpC;AAED,sFAAsF;AACtF,wBAAgB,0CAA0C,CACzD,OAAO,EAAE,+BAA+B,CAAC,cAAc,CAAC,GACtD,yCAAyC,CAO3C"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type MultiSelectOptionGroup } from "../ui/multiSelectTypes";
|
|
2
2
|
export type MultiSelectOptionEntry<TOption> = Readonly<{
|
|
3
3
|
option: TOption;
|
|
4
4
|
index: number;
|
|
5
5
|
}>;
|
|
6
6
|
export type MultiSelectOptionSection<TOption> = Readonly<{
|
|
7
|
-
group:
|
|
7
|
+
group: MultiSelectOptionGroup | undefined;
|
|
8
8
|
entries: readonly MultiSelectOptionEntry<TOption>[];
|
|
9
9
|
}>;
|
|
10
10
|
/**
|
|
11
11
|
* Группирует только соседние опции и сохраняет их глобальные индексы. Благодаря
|
|
12
12
|
* этому визуальные заголовки не попадают в active-index клавиатурной навигации.
|
|
13
13
|
*/
|
|
14
|
-
export declare function createMultiSelectOptionSections<TOption>(entries: readonly MultiSelectOptionEntry<TOption>[], getOptionGroup: (option: TOption) =>
|
|
14
|
+
export declare function createMultiSelectOptionSections<TOption>(entries: readonly MultiSelectOptionEntry<TOption>[], getOptionGroup: (option: TOption) => MultiSelectOptionGroup | undefined): readonly MultiSelectOptionSection<TOption>[];
|
|
15
15
|
//# sourceMappingURL=createMultiSelectOptionSections.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createMultiSelectOptionSections.d.ts","sourceRoot":"","sources":["../../../src/multi-select/lib/createMultiSelectOptionSections.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"createMultiSelectOptionSections.d.ts","sourceRoot":"","sources":["../../../src/multi-select/lib/createMultiSelectOptionSections.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAErE,MAAM,MAAM,sBAAsB,CAAC,OAAO,IAAI,QAAQ,CAAC;IACtD,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACd,CAAC,CAAC;AAEH,MAAM,MAAM,wBAAwB,CAAC,OAAO,IAAI,QAAQ,CAAC;IACxD,KAAK,EAAE,sBAAsB,GAAG,SAAS,CAAC;IAC1C,OAAO,EAAE,SAAS,sBAAsB,CAAC,OAAO,CAAC,EAAE,CAAC;CACpD,CAAC,CAAC;AAEH;;;GAGG;AACH,wBAAgB,+BAA+B,CAAC,OAAO,EACtD,OAAO,EAAE,SAAS,sBAAsB,CAAC,OAAO,CAAC,EAAE,EACnD,cAAc,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,sBAAsB,GAAG,SAAS,GACrE,SAAS,wBAAwB,CAAC,OAAO,CAAC,EAAE,CAoB9C"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type MultiSelectOptionKey } from "../ui/multiSelectTypes";
|
|
2
2
|
/** Сравнивает наборы выбора по identity опций, не связывая их с object reference. */
|
|
3
|
-
export declare function areMultiSelectSelectionsEqual<TOption>(left: readonly TOption[], right: readonly TOption[], getOptionKey: (option: TOption) =>
|
|
3
|
+
export declare function areMultiSelectSelectionsEqual<TOption>(left: readonly TOption[], right: readonly TOption[], getOptionKey: (option: TOption) => MultiSelectOptionKey): boolean;
|
|
4
4
|
//# sourceMappingURL=multiSelectSelection.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"multiSelectSelection.d.ts","sourceRoot":"","sources":["../../../src/multi-select/lib/multiSelectSelection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"multiSelectSelection.d.ts","sourceRoot":"","sources":["../../../src/multi-select/lib/multiSelectSelection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEnE,qFAAqF;AACrF,wBAAgB,6BAA6B,CAAC,OAAO,EACpD,IAAI,EAAE,SAAS,OAAO,EAAE,EACxB,KAAK,EAAE,SAAS,OAAO,EAAE,EACzB,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,oBAAoB,GACrD,OAAO,CAQT"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { type ReactNode, type Ref } from "react";
|
|
2
|
+
import { type CollectionItem } from "@ryuzaki13/react-foundation-lib/odata-service";
|
|
3
|
+
import { type UiBaseProps } from "../../types";
|
|
4
|
+
import { type DeprecatedMultiSelectItemState, type DeprecatedMultiSelectOptionContent, type DeprecatedMultiSelectOptionDisableContext, type DeprecatedMultiSelectRenderContext } from "./legacyMultiSelectTypes";
|
|
5
|
+
type MultiSelectOptionalRenderer<TContext> = ((context: TContext) => ReactNode) | null | false;
|
|
6
|
+
interface MultiSelectRenderers {
|
|
7
|
+
renderToken?: MultiSelectOptionalRenderer<DeprecatedMultiSelectRenderContext>;
|
|
8
|
+
renderToolbar?: MultiSelectOptionalRenderer<DeprecatedMultiSelectRenderContext>;
|
|
9
|
+
renderItem?: (item: CollectionItem, state: DeprecatedMultiSelectItemState) => DeprecatedMultiSelectOptionContent;
|
|
10
|
+
}
|
|
11
|
+
/** Контракт устаревшего codeKey/textKey-компонента. */
|
|
12
|
+
export interface DeprecatedMultiSelectProps<TOption extends Record<string, string> = CollectionItem> extends MultiSelectRenderers, UiBaseProps<TOption[]> {
|
|
13
|
+
ref?: Ref<HTMLInputElement>;
|
|
14
|
+
codeKey: string;
|
|
15
|
+
textKey?: string;
|
|
16
|
+
hideCode?: boolean;
|
|
17
|
+
query?: string;
|
|
18
|
+
defaultQuery?: string;
|
|
19
|
+
highlightQuery?: string;
|
|
20
|
+
onQuery?: (value: string) => void;
|
|
21
|
+
defaultFilter?: boolean;
|
|
22
|
+
items: TOption[];
|
|
23
|
+
getOptionDisabled?: (item: TOption, context: DeprecatedMultiSelectOptionDisableContext) => boolean;
|
|
24
|
+
onOpen?: () => void;
|
|
25
|
+
onClose?: (value: TOption[]) => void;
|
|
26
|
+
error?: string;
|
|
27
|
+
isLoading?: boolean;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Устаревший адаптер OData-подобных `codeKey`/`textKey` коллекций. Компонент
|
|
31
|
+
* сохраняет прежнюю OData-семантику, пока consumers переходят на selector API
|
|
32
|
+
* канонического `MultiSelect`.
|
|
33
|
+
*
|
|
34
|
+
* @deprecated Используйте `MultiSelect` с selector-функциями.
|
|
35
|
+
*/
|
|
36
|
+
export declare function DeprecatedMultiSelect<TOption extends Record<string, string> = CollectionItem>({ ref, codeKey, textKey, hideCode, items, value, onChange, getOptionDisabled, onClose, renderToken, renderToolbar, renderItem, ...props }: DeprecatedMultiSelectProps<TOption>): import("react").JSX.Element;
|
|
37
|
+
export declare namespace DeprecatedMultiSelect {
|
|
38
|
+
var displayName: string;
|
|
39
|
+
}
|
|
40
|
+
export { type DeprecatedMultiSelectItemState, type DeprecatedMultiSelectOptionContent, type DeprecatedMultiSelectOptionDisableContext, type DeprecatedMultiSelectRenderContext } from "./legacyMultiSelectTypes";
|
|
41
|
+
//# sourceMappingURL=DeprecatedMultiSelect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeprecatedMultiSelect.d.ts","sourceRoot":"","sources":["../../../src/multi-select/ui/DeprecatedMultiSelect.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,GAAG,EAAW,MAAM,OAAO,CAAC;AAE1D,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,+CAA+C,CAAC;AAEpF,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAI/C,OAAO,EACN,KAAK,8BAA8B,EACnC,KAAK,kCAAkC,EACvC,KAAK,yCAAyC,EAC9C,KAAK,kCAAkC,EACvC,MAAM,0BAA0B,CAAC;AAGlC,KAAK,2BAA2B,CAAC,QAAQ,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,KAAK,SAAS,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC;AAE/F,UAAU,oBAAoB;IAC7B,WAAW,CAAC,EAAE,2BAA2B,CAAC,kCAAkC,CAAC,CAAC;IAC9E,aAAa,CAAC,EAAE,2BAA2B,CAAC,kCAAkC,CAAC,CAAC;IAChF,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,8BAA8B,KAAK,kCAAkC,CAAC;CACjH;AAED,uDAAuD;AACvD,MAAM,WAAW,0BAA0B,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,cAAc,CAClG,SAAQ,oBAAoB,EAAE,WAAW,CAAC,OAAO,EAAE,CAAC;IACpD,GAAG,CAAC,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,yCAAyC,KAAK,OAAO,CAAC;IACnG,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,cAAc,EAAE,EAC9F,GAAG,EACH,OAAO,EACP,OAAO,EACP,QAAQ,EACR,KAAK,EACL,KAAK,EACL,QAAQ,EACR,iBAAiB,EACjB,OAAO,EACP,WAAW,EACX,aAAa,EACb,UAAU,EACV,GAAG,KAAK,EACR,EAAE,0BAA0B,CAAC,OAAO,CAAC,+BA+CrC;yBA7De,qBAAqB;;;AAiErC,OAAO,EACN,KAAK,8BAA8B,EACnC,KAAK,kCAAkC,EACvC,KAAK,yCAAyC,EAC9C,KAAK,kCAAkC,EACvC,MAAM,0BAA0B,CAAC"}
|
|
@@ -1,39 +1,30 @@
|
|
|
1
|
-
import { type
|
|
2
|
-
import { type CollectionItem } from "@ryuzaki13/react-foundation-lib/odata-service";
|
|
1
|
+
import { type Ref } from "react";
|
|
3
2
|
import { type UiBaseProps } from "../../types";
|
|
4
|
-
import { type
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
3
|
+
import { type MultiSelectOptionDisableContext, type MultiSelectOptionGroup, type MultiSelectOptionKey, type MultiSelectRenderers } from "./multiSelectTypes";
|
|
4
|
+
/**
|
|
5
|
+
* Типобезопасный контракт множественного выбора. Опция остаётся в исходной
|
|
6
|
+
* domain/view-model форме, а UI получает только необходимые selector-функции.
|
|
7
|
+
*/
|
|
8
|
+
export type MultiSelectProps<TOption> = MultiSelectRenderers<TOption> & Omit<UiBaseProps<TOption[], readonly TOption[]>, "onChange"> & Readonly<{
|
|
9
|
+
ref?: Ref<HTMLInputElement>;
|
|
10
|
+
options: readonly TOption[];
|
|
11
|
+
onChange: (value: TOption[]) => void;
|
|
12
|
+
getOptionKey: (option: TOption) => MultiSelectOptionKey;
|
|
13
|
+
getOptionLabel: (option: TOption) => string;
|
|
14
|
+
getOptionCode?: (option: TOption) => string | undefined;
|
|
15
|
+
getOptionGroup?: (option: TOption) => MultiSelectOptionGroup | undefined;
|
|
16
|
+
getOptionSearchText?: (option: TOption) => string | readonly string[];
|
|
17
|
+
getOptionDisabled?: (option: TOption, context: MultiSelectOptionDisableContext<TOption>) => boolean;
|
|
15
18
|
query?: string;
|
|
16
19
|
defaultQuery?: string;
|
|
17
20
|
highlightQuery?: string;
|
|
18
21
|
onQuery?: (value: string) => void;
|
|
19
22
|
defaultFilter?: boolean;
|
|
20
|
-
items: TOption[];
|
|
21
|
-
getOptionDisabled?: (item: TOption, context: MultiSelectOptionDisableContext) => boolean;
|
|
22
23
|
onOpen?: () => void;
|
|
23
24
|
onClose?: (value: TOption[]) => void;
|
|
24
25
|
error?: string;
|
|
25
26
|
isLoading?: boolean;
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
|
|
29
|
-
* использовать `OptionMultiSelect`, а OData-обёртки продолжают работать через
|
|
30
|
-
* опубликованный контракт без изменения selection semantics.
|
|
31
|
-
*/
|
|
32
|
-
export declare function MultiSelect({ ref, codeKey, textKey, hideCode, items, value, onChange, getOptionDisabled, onClose, renderToken, renderToolbar, renderItem, ...props }: MultiSelectProps & {
|
|
33
|
-
ref?: Ref<HTMLInputElement>;
|
|
34
|
-
}): import("react").JSX.Element;
|
|
35
|
-
export declare namespace MultiSelect {
|
|
36
|
-
var displayName: string;
|
|
37
|
-
}
|
|
38
|
-
export { type MultiSelectItemState, type MultiSelectOptionContent, type MultiSelectOptionDisableContext, type MultiSelectRenderContext } from "./legacyMultiSelectTypes";
|
|
27
|
+
}>;
|
|
28
|
+
/** Множественный выбор для произвольной типизированной коллекции опций. */
|
|
29
|
+
export declare function MultiSelect<TOption>(props: MultiSelectProps<TOption>): import("react").JSX.Element;
|
|
39
30
|
//# sourceMappingURL=MultiSelect.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultiSelect.d.ts","sourceRoot":"","sources":["../../../src/multi-select/ui/MultiSelect.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"MultiSelect.d.ts","sourceRoot":"","sources":["../../../src/multi-select/ui/MultiSelect.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AAEjC,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAG/C,OAAO,EACN,KAAK,+BAA+B,EACpC,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EACzB,MAAM,oBAAoB,CAAC;AAE5B;;;GAGG;AACH,MAAM,MAAM,gBAAgB,CAAC,OAAO,IAAI,oBAAoB,CAAC,OAAO,CAAC,GACpE,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,EAAE,SAAS,OAAO,EAAE,CAAC,EAAE,UAAU,CAAC,GAC5D,QAAQ,CAAC;IACR,GAAG,CAAC,EAAE,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC5B,OAAO,EAAE,SAAS,OAAO,EAAE,CAAC;IAC5B,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACrC,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,oBAAoB,CAAC;IACxD,cAAc,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,MAAM,CAAC;IAC5C,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,MAAM,GAAG,SAAS,CAAC;IACxD,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,sBAAsB,GAAG,SAAS,CAAC;IACzE,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,MAAM,GAAG,SAAS,MAAM,EAAE,CAAC;IACtE,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,+BAA+B,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC;IACpG,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACrC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC,CAAC;AAEJ,2EAA2E;AAC3E,wBAAgB,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,gBAAgB,CAAC,OAAO,CAAC,+BAEpE"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type MultiSelectProps } from "./MultiSelect";
|
|
2
|
+
type MultiSelectCoreProps<TOption> = MultiSelectProps<TOption> & Readonly<{
|
|
3
|
+
/** Сохраняет опубликованную ссылочную семантику только для legacy MultiSelect. */
|
|
4
|
+
preserveOptionArrayReference?: boolean;
|
|
5
|
+
}>;
|
|
6
|
+
/**
|
|
7
|
+
* Единая generic-реализация множественного выбора. Публичные компоненты только
|
|
8
|
+
* адаптируют свои контракты к этим selector-функциям, поэтому focus и a11y
|
|
9
|
+
* поведение не расходятся между новым и legacy API.
|
|
10
|
+
*/
|
|
11
|
+
export declare function MultiSelectCore<TOption>({ ref, options, value, onChange, getOptionKey, getOptionLabel, getOptionCode, getOptionGroup, getOptionSearchText, label, description, placeholder, size, query, defaultQuery, highlightQuery, onQuery, defaultFilter, onOpen, onClose, getOptionDisabled, disabled, error, isLoading, renderToken, renderToolbar, renderOption, preserveOptionArrayReference }: MultiSelectCoreProps<TOption>): import("react").JSX.Element;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=MultiSelectCore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MultiSelectCore.d.ts","sourceRoot":"","sources":["../../../src/multi-select/ui/MultiSelectCore.tsx"],"names":[],"mappings":"AAkBA,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAMtD,KAAK,oBAAoB,CAAC,OAAO,IAAI,gBAAgB,CAAC,OAAO,CAAC,GAC7D,QAAQ,CAAC;IACR,kFAAkF;IAClF,4BAA4B,CAAC,EAAE,OAAO,CAAC;CACvC,CAAC,CAAC;AAEJ;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,EACxC,GAAG,EACH,OAAO,EACP,KAAK,EACL,QAAQ,EACR,YAAY,EACZ,cAAc,EACd,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,KAAK,EACL,WAAW,EACX,WAAW,EACX,IAAI,EACJ,KAAK,EACL,YAAY,EACZ,cAAc,EACd,OAAO,EACP,aAAoB,EACpB,MAAM,EACN,OAAO,EACP,iBAAiB,EACjB,QAAQ,EACR,KAAK,EACL,SAAS,EACT,WAAW,EACX,aAAa,EACb,YAAY,EACZ,4BAAoC,EACpC,EAAE,oBAAoB,CAAC,OAAO,CAAC,+BA8X/B"}
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
import { type MultiSelectOptionEntry } from "../lib/createMultiSelectOptionSections";
|
|
2
|
-
import { type
|
|
2
|
+
import { type MultiSelectOptionContent, type MultiSelectOptionGroup, type MultiSelectOptionKey, type MultiSelectOptionState } from "./multiSelectTypes";
|
|
3
3
|
type MultiSelectOptionListProps<TOption> = Readonly<{
|
|
4
4
|
entries: readonly MultiSelectOptionEntry<TOption>[];
|
|
5
5
|
sectionId: string;
|
|
6
6
|
listId: string;
|
|
7
7
|
activeIndex: number;
|
|
8
|
-
selectedKeys: ReadonlySet<
|
|
8
|
+
selectedKeys: ReadonlySet<MultiSelectOptionKey>;
|
|
9
9
|
query: string;
|
|
10
10
|
highlightQuery: string;
|
|
11
|
-
getOptionKey: (option: TOption) =>
|
|
12
|
-
getOptionGroup?: (option: TOption) =>
|
|
11
|
+
getOptionKey: (option: TOption) => MultiSelectOptionKey;
|
|
12
|
+
getOptionGroup?: (option: TOption) => MultiSelectOptionGroup | undefined;
|
|
13
13
|
getOptionDisabled?: (option: TOption) => boolean;
|
|
14
14
|
getOptionId: (listId: string, index: number) => string;
|
|
15
15
|
setOptionRef: (index: number, node: HTMLElement | null) => void;
|
|
16
16
|
toggleOption: (option: TOption) => void;
|
|
17
17
|
selectOnlyOption: (option: TOption) => void;
|
|
18
|
-
renderOption: (option: TOption, state:
|
|
18
|
+
renderOption: (option: TOption, state: MultiSelectOptionState) => MultiSelectOptionContent;
|
|
19
19
|
}>;
|
|
20
20
|
/** Рендерит одну selected/available-секцию, сохраняя global option indexes при группировке. */
|
|
21
21
|
export declare function MultiSelectOptionList<TOption>({ entries, sectionId, getOptionGroup, ...rowProps }: MultiSelectOptionListProps<TOption>): import("react").JSX.Element[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultiSelectOptionList.d.ts","sourceRoot":"","sources":["../../../src/multi-select/ui/MultiSelectOptionList.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAmC,KAAK,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAGtH,OAAO,EACN,KAAK,
|
|
1
|
+
{"version":3,"file":"MultiSelectOptionList.d.ts","sourceRoot":"","sources":["../../../src/multi-select/ui/MultiSelectOptionList.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAmC,KAAK,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AAGtH,OAAO,EACN,KAAK,wBAAwB,EAC7B,KAAK,sBAAsB,EAC3B,KAAK,oBAAoB,EACzB,KAAK,sBAAsB,EAC3B,MAAM,oBAAoB,CAAC;AAE5B,KAAK,0BAA0B,CAAC,OAAO,IAAI,QAAQ,CAAC;IACnD,OAAO,EAAE,SAAS,sBAAsB,CAAC,OAAO,CAAC,EAAE,CAAC;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,WAAW,CAAC,oBAAoB,CAAC,CAAC;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,oBAAoB,CAAC;IACxD,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,sBAAsB,GAAG,SAAS,CAAC;IACzE,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC;IACjD,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACvD,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IAChE,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,gBAAgB,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,sBAAsB,KAAK,wBAAwB,CAAC;CAC3F,CAAC,CAAC;AAEH,+FAA+F;AAC/F,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,GAAG,QAAQ,EAAE,EAAE,0BAA0B,CAAC,OAAO,CAAC,iCAuBtI"}
|
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type MultiSelectOptionContent, type MultiSelectOptionKey, type MultiSelectOptionState } from "./multiSelectTypes";
|
|
2
2
|
type MultiSelectOptionRowProps<TOption> = Readonly<{
|
|
3
3
|
option: TOption;
|
|
4
4
|
index: number;
|
|
5
5
|
listId: string;
|
|
6
6
|
activeIndex: number;
|
|
7
|
-
selectedKeys: ReadonlySet<
|
|
7
|
+
selectedKeys: ReadonlySet<MultiSelectOptionKey>;
|
|
8
8
|
query: string;
|
|
9
9
|
highlightQuery: string;
|
|
10
|
-
getOptionKey: (option: TOption) =>
|
|
10
|
+
getOptionKey: (option: TOption) => MultiSelectOptionKey;
|
|
11
11
|
getOptionDisabled?: (option: TOption) => boolean;
|
|
12
12
|
getOptionId: (listId: string, index: number) => string;
|
|
13
13
|
setOptionRef: (index: number, node: HTMLElement | null) => void;
|
|
14
14
|
toggleOption: (option: TOption) => void;
|
|
15
15
|
selectOnlyOption: (option: TOption) => void;
|
|
16
|
-
renderOption: (option: TOption, state:
|
|
16
|
+
renderOption: (option: TOption, state: MultiSelectOptionState) => MultiSelectOptionContent;
|
|
17
17
|
}>;
|
|
18
18
|
/** Одна интерактивная строка grid: checkbox меняет draft, основная кнопка подтверждает только эту опцию. */
|
|
19
19
|
export declare function MultiSelectOptionRow<TOption>({ option, index, listId, activeIndex, selectedKeys, query, highlightQuery, getOptionKey, getOptionDisabled, getOptionId, setOptionRef, toggleOption, selectOnlyOption, renderOption }: MultiSelectOptionRowProps<TOption>): import("react").JSX.Element;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MultiSelectOptionRow.d.ts","sourceRoot":"","sources":["../../../src/multi-select/ui/MultiSelectOptionRow.tsx"],"names":[],"mappings":"AAIA,OAAO,
|
|
1
|
+
{"version":3,"file":"MultiSelectOptionRow.d.ts","sourceRoot":"","sources":["../../../src/multi-select/ui/MultiSelectOptionRow.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,wBAAwB,EAAE,KAAK,oBAAoB,EAAE,KAAK,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAE3H,KAAK,yBAAyB,CAAC,OAAO,IAAI,QAAQ,CAAC;IAClD,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,WAAW,CAAC,oBAAoB,CAAC,CAAC;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,oBAAoB,CAAC;IACxD,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC;IACjD,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;IACvD,YAAY,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IAChE,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,gBAAgB,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAC5C,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,sBAAsB,KAAK,wBAAwB,CAAC;CAC3F,CAAC,CAAC;AAEH,4GAA4G;AAC5G,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,EAC7C,MAAM,EACN,KAAK,EACL,MAAM,EACN,WAAW,EACX,YAAY,EACZ,KAAK,EACL,cAAc,EACd,YAAY,EACZ,iBAAiB,EACjB,WAAW,EACX,YAAY,EACZ,YAAY,EACZ,gBAAgB,EAChB,YAAY,EACZ,EAAE,yBAAyB,CAAC,OAAO,CAAC,+BA2CpC"}
|