@ryuzaki13/react-foundation-ui 1.4.2 → 1.4.4
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/advanced-search/index.js +12 -11
- package/dist/advanced-search/index.js.map +1 -1
- package/dist/badge/index.js +1 -1
- package/dist/base-table/index.js +2 -2
- package/dist/button/index.js +1 -1
- package/dist/chunks/{CalendarView-KCkhCtK-.js → CalendarView-Z_XWk7aI.js} +8 -8
- package/dist/chunks/{CalendarView-KCkhCtK-.js.map → CalendarView-Z_XWk7aI.js.map} +1 -1
- package/dist/chunks/{ImageViewerRuntime-RN49by8Y.js → ImageViewerRuntime-BMs3BBkV.js} +4 -4
- package/dist/chunks/{ImageViewerRuntime-RN49by8Y.js.map → ImageViewerRuntime-BMs3BBkV.js.map} +1 -1
- package/dist/chunks/{TextEditorLexicalClient-CVTrglWP.js → TextEditorLexicalClient-CK8j3RA4.js} +16 -18
- package/dist/chunks/{TextEditorLexicalClient-CVTrglWP.js.map → TextEditorLexicalClient-CK8j3RA4.js.map} +1 -1
- package/dist/chunks/{badge-Cri0-kVK.js → badge-DwIUjH0a.js} +2 -2
- package/dist/chunks/{badge-Cri0-kVK.js.map → badge-DwIUjH0a.js.map} +1 -1
- package/dist/chunks/{base-table-D5IqsjQD.js → base-table-BFsVwXg3.js} +13 -12
- package/dist/chunks/{base-table-D5IqsjQD.js.map → base-table-BFsVwXg3.js.map} +1 -1
- package/dist/chunks/{button-CC0Jdx1j.js → button-BU2kRzwu.js} +2 -2
- package/dist/chunks/{button-CC0Jdx1j.js.map → button-BU2kRzwu.js.map} +1 -1
- package/dist/chunks/check-box-Dd3YFuxd.js.map +1 -1
- package/dist/chunks/{context-menu-DQeR3y7M.js → context-menu-C6RO7soI.js} +7 -2
- package/dist/chunks/{context-menu-DQeR3y7M.js.map → context-menu-C6RO7soI.js.map} +1 -1
- package/dist/chunks/{date-input-DBJisPRz.js → date-input-BzExUQnc.js} +5 -5
- package/dist/chunks/{date-input-DBJisPRz.js.map → date-input-BzExUQnc.js.map} +1 -1
- package/dist/chunks/{flex-DYZ0IbU6.js → flex-C7njxZ74.js} +10 -7
- package/dist/chunks/{flex-DYZ0IbU6.js.map → flex-C7njxZ74.js.map} +1 -1
- package/dist/chunks/floating-arrow-BE-z4QkE.js.map +1 -1
- package/dist/chunks/{input-BCJfUdK_.js → input-Bp6_Ucgr.js} +15 -15
- package/dist/chunks/{input-BCJfUdK_.js.map → input-Bp6_Ucgr.js.map} +1 -1
- package/dist/chunks/{input-files-Dcc5K-_1.js → input-files-D1JzSw_Y.js} +2 -2
- package/dist/chunks/{input-files-Dcc5K-_1.js.map → input-files-D1JzSw_Y.js.map} +1 -1
- package/dist/chunks/{input-search-B7HmrAM7.js → input-search-Bkhcinru.js} +2 -2
- package/dist/chunks/{input-search-B7HmrAM7.js.map → input-search-Bkhcinru.js.map} +1 -1
- package/dist/chunks/{misc-DIF5h9ba.js → misc-BYxxlJz6.js} +3 -3
- package/dist/chunks/{misc-DIF5h9ba.js.map → misc-BYxxlJz6.js.map} +1 -1
- package/dist/chunks/{modal-DXHX_sA-.js → modal-paexEF0j.js} +4 -5
- package/dist/chunks/{modal-DXHX_sA-.js.map → modal-paexEF0j.js.map} +1 -1
- package/dist/chunks/{multi-select-CWx12rgb.js → multi-select-COEkc8Qc.js} +4 -5
- package/dist/chunks/multi-select-COEkc8Qc.js.map +1 -0
- package/dist/chunks/{picker-BAQ9NeHe.js → picker-e6IsrMUG.js} +3 -3
- package/dist/chunks/{picker-BAQ9NeHe.js.map → picker-e6IsrMUG.js.map} +1 -1
- package/dist/chunks/{popover-xJJqy1v6.js → popover-CGU3MlsH.js} +14 -14
- package/dist/chunks/{popover-xJJqy1v6.js.map → popover-CGU3MlsH.js.map} +1 -1
- package/dist/chunks/radio-group-CM9Lg_nc.js.map +1 -1
- package/dist/chunks/{select-BPb-eL3O.js → select-BON0S9Dr.js} +115 -115
- package/dist/chunks/select-BON0S9Dr.js.map +1 -0
- package/dist/chunks/sortable-DcTIAbjD.js.map +1 -1
- package/dist/chunks/{table-xMAjqtcY.js → table-Dd5BcC0k.js} +3 -3
- package/dist/chunks/{table-xMAjqtcY.js.map → table-Dd5BcC0k.js.map} +1 -1
- package/dist/chunks/{table-column-interactions-BGd5Lwy9.js → table-column-interactions-DzEvVuXe.js} +8 -5
- package/dist/chunks/{table-column-interactions-BGd5Lwy9.js.map → table-column-interactions-DzEvVuXe.js.map} +1 -1
- package/dist/chunks/useODataSelectBase-CKe1AVMI.js.map +1 -1
- package/dist/chunks/wheel-picker-FS58cRsQ.js.map +1 -1
- package/dist/context-menu/index.js +1 -1
- package/dist/date-input/index.js +2 -2
- package/dist/date-time-input/index.js +4 -4
- package/dist/date-time-input/index.js.map +1 -1
- package/dist/detail/index.js.map +1 -1
- package/dist/dialog/index.js.map +1 -1
- package/dist/disclosure/index.js +1 -1
- package/dist/disclosure/index.js.map +1 -1
- package/dist/drop-zone/index.js +1 -1
- package/dist/drop-zone/index.js.map +1 -1
- package/dist/errors/index.js +1 -1
- package/dist/errors/index.js.map +1 -1
- package/dist/expandable-action-panel/index.js +2 -2
- package/dist/expandable-action-panel/index.js.map +1 -1
- package/dist/flex/index.js +1 -1
- package/dist/fullscreen-portal/index.js +3 -3
- package/dist/fullscreen-portal/index.js.map +1 -1
- package/dist/image/index.js +5 -5
- package/dist/image/index.js.map +1 -1
- package/dist/input/index.js +1 -1
- package/dist/input-date-time/index.js +1 -1
- package/dist/input-date-time/index.js.map +1 -1
- package/dist/input-file/index.js +1 -1
- package/dist/input-file/index.js.map +1 -1
- package/dist/input-files/index.js +1 -1
- package/dist/input-image/index.js +1 -1
- package/dist/input-image/index.js.map +1 -1
- package/dist/input-search/index.js +1 -1
- package/dist/layout-picker/index.js +3 -4
- package/dist/layout-picker/index.js.map +1 -1
- package/dist/layout-picker/ui/LayoutPicker.d.ts.map +1 -1
- package/dist/list/index.js +7 -7
- package/dist/list/index.js.map +1 -1
- package/dist/listbox/index.js.map +1 -1
- package/dist/misc/index.js +1 -1
- package/dist/modal/index.js +1 -1
- package/dist/multi-select/index.js +1 -1
- package/dist/multi-select/ui/MultiSelect.d.ts.map +1 -1
- package/dist/notifications/index.js +13 -11
- package/dist/notifications/index.js.map +1 -1
- package/dist/pages/index.js.map +1 -1
- package/dist/panel/index.js.map +1 -1
- package/dist/picker/index.js +1 -1
- package/dist/picker/types.d.ts +1 -1
- package/dist/picker/types.d.ts.map +1 -1
- package/dist/popover/index.js +1 -1
- package/dist/preset-range-date-input/index.js +2 -2
- package/dist/preset-range-date-input/index.js.map +1 -1
- package/dist/preset-select/index.js +1 -1
- package/dist/radio-button/index.js.map +1 -1
- package/dist/select/Select.d.ts.map +1 -1
- package/dist/select/index.js +1 -1
- package/dist/simple-table/index.js +1 -1
- package/dist/slider/index.js +27 -24
- package/dist/slider/index.js.map +1 -1
- package/dist/splitter/index.js.map +1 -1
- package/dist/state-select/index.js +12 -10
- package/dist/state-select/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/switch/index.js +1 -1
- package/dist/switch/index.js.map +1 -1
- package/dist/table/index.js +1 -1
- package/dist/table-column-interactions/index.js +1 -1
- package/dist/table-sorting/index.js +1 -1
- package/dist/table-sorting/index.js.map +1 -1
- package/dist/tabs/index.js +6 -6
- package/dist/tabs/index.js.map +1 -1
- package/dist/tag-input/index.js +1 -1
- package/dist/tag-input/index.js.map +1 -1
- package/dist/text/index.js +10 -8
- package/dist/text/index.js.map +1 -1
- package/dist/text-editor/index.js +2 -2
- package/dist/textarea/index.js +1 -1
- package/dist/textarea/index.js.map +1 -1
- package/dist/toggle/index.js.map +1 -1
- package/dist/toolbar/index.js +1 -2
- package/dist/toolbar/index.js.map +1 -1
- package/dist/tree/index.js.map +1 -1
- package/dist/tree-select/TreePickerBase.d.ts.map +1 -1
- package/dist/tree-select/index.js +134 -132
- package/dist/tree-select/index.js.map +1 -1
- package/dist/tree-table/index.js +2 -2
- package/dist/tree-table/index.js.map +1 -1
- package/package.json +52 -59
- package/storybook-static/assets/{Badge-SZ48u9qp.js → Badge-Bh73-APE.js} +11 -11
- package/storybook-static/assets/Badge.stories-gNFtCWnR.js +54 -0
- package/storybook-static/assets/{Button-CFCpYiPy.js → Button-O9QPAftp.js} +10 -10
- package/storybook-static/assets/Button-mjF9HSg0.js +12 -0
- package/storybook-static/assets/Button.stories-wkiE0c_a.js +75 -0
- package/storybook-static/assets/CalendarView-CqKlnF8k.js +1 -0
- package/storybook-static/assets/{DateInput-BfFTwd_P.css → CalendarView-DKvrkS40.css} +1 -1
- package/storybook-static/assets/{CheckBox-FoMSruZC.js → CheckBox-CB8fTQF0.js} +11 -11
- package/storybook-static/assets/CheckBox-Clpeg9q7.js +2 -0
- package/storybook-static/assets/CheckBox.module-BBzuj5He.js +1 -0
- package/storybook-static/assets/CheckBox.stories-pfWBxvOy.js +60 -0
- package/storybook-static/assets/Color-6AOWCN3U-CVvkiihj.js +1 -0
- package/storybook-static/assets/ContextMenu-Sv4wfyS3.js +1 -0
- package/storybook-static/assets/{ContextMenu-CU_1kOzV.js → ContextMenu-eGnlhRRu.js} +9 -9
- package/storybook-static/assets/ContextMenu.stories-CVw3hOvY.js +90 -0
- package/storybook-static/assets/DateInput-D8_Oleoy.js +1 -0
- package/storybook-static/assets/{DateInput-BeZ5esVE.js → DateInput-DQDplLib.js} +11 -11
- package/storybook-static/assets/DateInput-pmGiwdvw.css +1 -0
- package/storybook-static/assets/{DateInput.stories-Bkw2r8CD.js → DateInput.stories-BNpS4CND.js} +2 -2
- package/storybook-static/assets/DateRangePresetSelect-Bfx-d5qg.js +3 -0
- package/storybook-static/assets/{DateRangePresetSelect-C_mLvEoK.js → DateRangePresetSelect-DCBEf98i.js} +8 -8
- package/storybook-static/assets/DateRangePresetSelect.stories-PAV2jgQb.js +11 -0
- package/storybook-static/assets/{Detail-WzciiK9S.js → Detail-DvmdQCue.js} +11 -11
- package/storybook-static/assets/Detail.stories-CEm00aSN.js +44 -0
- package/storybook-static/assets/{Dialog-CwLsVxJY.js → Dialog-3I2Y7jD7.js} +9 -9
- package/storybook-static/assets/Dialog.stories-lcadmonM.js +31 -0
- package/storybook-static/assets/{Disclosure-BlRuGrk2.js → Disclosure-DUIQ37oh.js} +10 -10
- package/storybook-static/assets/Disclosure.stories-BeizaZWP.js +41 -0
- package/storybook-static/assets/DocsRenderer-JROSPFPF-DwPk6ai7.js +2 -0
- package/storybook-static/assets/{DropZone-Cr3nfCWA.js → DropZone-BGuCU5dq.js} +10 -10
- package/storybook-static/assets/DropZone.stories-B4J6OZ3T.js +44 -0
- package/storybook-static/assets/ExpandableActionPanel.stories-gCrqbhG6.js +20 -0
- package/storybook-static/assets/{Flex-C10912WS.js → Flex-CBwbh1yu.js} +18 -18
- package/storybook-static/assets/Flex.stories-cdk6vRZq.js +300 -0
- package/storybook-static/assets/FlexContainer-LmZIdhq2.js +1 -0
- package/storybook-static/assets/FlexItem-vkDYa5tA.js +3 -0
- package/storybook-static/assets/FloatingPopover-D4h-c24R.js +1 -0
- package/storybook-static/assets/FloatingPopover-DC84VrV3.css +1 -0
- package/storybook-static/assets/FormattedTableCell-CY3E21k8.css +1 -0
- package/storybook-static/assets/FormattedTableCell-Dh-kHTOC.js +18 -0
- package/storybook-static/assets/Grid-BCzygAqy.js +52 -0
- package/storybook-static/assets/{Grid-G88y3oB_.js → Grid-BkKqSMfk.js} +18 -18
- package/storybook-static/assets/{Grid.stories-BV7zL-6n.js → Grid.stories-828arrPi.js} +2 -2
- package/storybook-static/assets/{Grid-Bb0gH6CX.js → GridContainer-qDguE1HS.js} +2 -53
- package/storybook-static/assets/ImageCropper.stories-CrIWrKKR.js +115 -0
- package/storybook-static/assets/ImageRenderer-F3AaZx-K.js +2 -0
- package/storybook-static/assets/ImageRenderer.stories-l3PnRYxy.js +22 -0
- package/storybook-static/assets/ImageView.stories-C6uhkvCN.js +9 -0
- package/storybook-static/assets/{ImageViewer.stories-PlFXSB5n.js → ImageViewer.stories-BSPiv5lU.js} +5 -5
- package/storybook-static/assets/ImageViewerRuntime-BOpMGgz6.js +51 -0
- package/storybook-static/assets/Input-Co--DMHY.js +3 -0
- package/storybook-static/assets/{Input-pyUNDVtk.js → Input-D-ZrbHVw.js} +11 -11
- package/storybook-static/assets/Input.stories-vqPv6pLx.js +38 -0
- package/storybook-static/assets/{InputDateTime-CWk5KBwD.js → InputDateTime-DHBVbRii.js} +11 -11
- package/storybook-static/assets/InputDateTime.stories-BAvLMBuk.js +35 -0
- package/storybook-static/assets/{InputFile-BLQq7mY9.js → InputFile-B9TVOEZV.js} +10 -10
- package/storybook-static/assets/InputFile.stories-CypBLWFh.js +36 -0
- package/storybook-static/assets/{InputFiles-B6J4XBdP.js → InputFiles-CxZkOZFK.js} +10 -10
- package/storybook-static/assets/InputFiles.stories-BGwCp7OC.js +33 -0
- package/storybook-static/assets/InputFilesList-OEX4zGI3.js +1 -0
- package/storybook-static/assets/{InputImage--2PSB_E_.js → InputImage-31A6fxSf.js} +10 -10
- package/storybook-static/assets/InputImage.stories-CdpOudXI.js +51 -0
- package/storybook-static/assets/{LayoutPicker-RZDisgZ_.js → LayoutPicker-Dc55ovYM.js} +13 -13
- package/storybook-static/assets/LayoutPicker.stories-DXcn-WXQ.js +449 -0
- package/storybook-static/assets/{Listbox-xwfNjBpV.js → Listbox-DF8E6oMR.js} +10 -10
- package/storybook-static/assets/Listbox.stories-C98_9wX3.js +47 -0
- package/storybook-static/assets/{Modal-HJt_Y-a6.js → Modal-CXvDgktT.js} +12 -12
- package/storybook-static/assets/Modal.stories-DAC_QwN7.js +180 -0
- package/storybook-static/assets/MultiSelect-B-wX6JPo.js +2 -0
- package/storybook-static/assets/{MultiSelect-CvNsFdE4.js → MultiSelect-DN4foQlG.js} +11 -11
- package/storybook-static/assets/MultiSelect.stories-CgKNQmma.js +29 -0
- package/storybook-static/assets/MultiSelectToken-DDu5n78h.css +1 -0
- package/storybook-static/assets/MultiSelectToken-fjW8p4YG.js +1 -0
- package/storybook-static/assets/NoData-C7KqaHUh.css +1 -0
- package/storybook-static/assets/NoData-W7wK8oTW.js +1 -0
- package/storybook-static/assets/{NotificationsHost-DXCf3CQX.js → NotificationsHost-D1UoWmF8.js} +9 -9
- package/storybook-static/assets/NotificationsHost.stories-BWUuMmPl.js +25 -0
- package/storybook-static/assets/{ODataMultiSelect-CIJNiwGb.js → ODataMultiSelect-DE1V4el8.js} +15 -15
- package/storybook-static/assets/ODataMultiSelect.stories-Q1DUIL2W.js +73 -0
- package/storybook-static/assets/{ODataSelect-BDga9TUb.js → ODataSelect-CtoT2Wxx.js} +15 -15
- package/storybook-static/assets/ODataSelect.stories-DLi7Rwzk.js +73 -0
- package/storybook-static/assets/ODataTreeMultiSelect-DEZfgyPK.js +19 -0
- package/storybook-static/assets/ODataTreeMultiSelect.stories-H42q78xI.js +30 -0
- package/storybook-static/assets/ODataTreeSelect-BeylEiPN.js +17 -0
- package/storybook-static/assets/ODataTreeSelect.stories-MOILmtfY.js +24 -0
- package/storybook-static/assets/OneStepScroller-BSvYN6QP.js +5 -0
- package/storybook-static/assets/OneStepScroller-NRYd-egY.css +1 -0
- package/storybook-static/assets/{PeriodSelect-BJbjl62O.js → PeriodSelect-KQFGCxq6.js} +13 -13
- package/storybook-static/assets/PeriodSelect.stories-BIYx4_Yy.js +64 -0
- package/storybook-static/assets/PickerSelectionToolbar-Cvv8vTZm.js +2 -0
- package/storybook-static/assets/PickerTriggerActions-BBZmXagt.js +1 -0
- package/storybook-static/assets/{Popover-Dg2T0DoN.js → Popover-7YZIq8Fi.js} +11 -11
- package/storybook-static/assets/Popover-D6gSyjaW.js +2 -0
- package/storybook-static/assets/Popover-DGX7JNNK.css +1 -0
- package/storybook-static/assets/Popover.stories-DM69Ztws.js +69 -0
- package/storybook-static/assets/{PresetRangeDateInput-CNmTMNHF.js → PresetRangeDateInput-Ch6GapcJ.js} +8 -8
- package/storybook-static/assets/PresetRangeDateInput.stories-Cqd4eb0N.js +15 -0
- package/storybook-static/assets/PresetSelect-C8uIYhPJ.js +5 -0
- package/storybook-static/assets/{RadioButton-2rfUPkwC.js → RadioButton-BQjiyASl.js} +10 -10
- package/storybook-static/assets/RadioButton.stories-Cbho4i83.js +36 -0
- package/storybook-static/assets/RadioGroup-DNqu6WaC.js +1 -0
- package/storybook-static/assets/{RadioGroup-BduGGVKj.js → RadioGroup-vw4ObVj-.js} +10 -10
- package/storybook-static/assets/RadioGroup.stories-B-WQzZW_.js +42 -0
- package/storybook-static/assets/Scrollable-DrxMuH2M.js +1 -0
- package/storybook-static/assets/{Select-DnZ83aZs.js → Select-BxigZNtu.js} +13 -13
- package/storybook-static/assets/Select-X_O4M8Hi.js +12 -0
- package/storybook-static/assets/Select.stories-BpTrYJSr.js +46 -0
- package/storybook-static/assets/SelectOptionContent-RAmgWCOm.js +1 -0
- package/storybook-static/assets/{SerializableSelect-BiFhAxAJ.js → SerializableSelect-CA9wjk2m.js} +12 -12
- package/storybook-static/assets/SerializableSelect.stories-DXd4E-3U.js +46 -0
- package/storybook-static/assets/{SingleDateTimeInput-Bc-ifbML.js → SingleDateTimeInput-BeFLYUBF.js} +12 -12
- package/storybook-static/assets/SingleDateTimeInput.stories-B1aZ754N.js +78 -0
- package/storybook-static/assets/Slider-BYrHesOR.js +1 -0
- package/storybook-static/assets/{Slider-DfjBSsR3.js → Slider-BdWBkKp4.js} +15 -15
- package/storybook-static/assets/Slider.stories-CgmOhVBs.js +77 -0
- package/storybook-static/assets/{SliderInput-o9uCcVMP.js → SliderInput-QmF2VQWA.js} +16 -16
- package/storybook-static/assets/SliderInput.stories-MjSmhiOM.js +68 -0
- package/storybook-static/assets/{Sortable-B6Y9Q9Yn.js → Sortable-D5OTpesH.js} +13 -13
- package/storybook-static/assets/Sortable.stories-yz3c5EhY.js +141 -0
- package/storybook-static/assets/{Splitter-CfUVnAs7.js → Splitter-DVq6XBul.js} +11 -11
- package/storybook-static/assets/Splitter.stories-CopPw1_p.js +22 -0
- package/storybook-static/assets/{StateSelect-h0i4M4vO.js → StateSelect-ojwXeKmx.js} +10 -10
- package/storybook-static/assets/StateSelect.stories-D46m5HNn.js +47 -0
- package/storybook-static/assets/StringToggle.stories-ByYMmlXl.js +6 -0
- package/storybook-static/assets/{Switch-CPKaENqL.js → Switch-Dy4Pahkn.js} +10 -10
- package/storybook-static/assets/Switch.stories-EiAb5Z-D.js +26 -0
- package/storybook-static/assets/{Table-xV66crR1.js → Table-BO6Oa4JV.js} +22 -22
- package/storybook-static/assets/Table.stories--TpBKwmP.js +122 -0
- package/storybook-static/assets/{Tabs-v9YZeJoc.js → Tabs-7c93qVyH.js} +15 -15
- package/storybook-static/assets/Tabs.stories-DXZ0r2ix.js +58 -0
- package/storybook-static/assets/TagInput.stories-CoM8rXwa.js +18 -0
- package/storybook-static/assets/Text-BPlJUr3R.js +1 -0
- package/storybook-static/assets/{Textarea-CRThqX0z.js → Textarea-D3S4MkiX.js} +10 -10
- package/storybook-static/assets/Textarea.stories-47k8uHdB.js +27 -0
- package/storybook-static/assets/TimePanel-C2iZ9Qr6.js +1 -0
- package/storybook-static/assets/TimePanel.stories-JTjIv6z1.js +25 -0
- package/storybook-static/assets/{Toggle-CzopviU2.js → Toggle-CHmajZE5.js} +10 -10
- package/storybook-static/assets/Toggle-OlKw8qaK.js +1 -0
- package/storybook-static/assets/Toggle.stories-k4Z8qQVs.js +30 -0
- package/storybook-static/assets/TreeMultiSelect-BC_n1Wb-.js +1 -0
- package/storybook-static/assets/TreeMultiSelect-dOg0l7rk.js +19 -0
- package/storybook-static/assets/TreeMultiSelect.stories-CAzZRxn5.js +35 -0
- package/storybook-static/assets/TreePickerBase-ycYQYQgi.js +22 -0
- package/storybook-static/assets/TreeSelect-BrNyI_Qx.js +16 -0
- package/storybook-static/assets/TreeSelect-CDecTnag.js +1 -0
- package/storybook-static/assets/TreeSelect.stories-BUOw2Rwn.js +18 -0
- package/storybook-static/assets/{TreeTable-DbzoCcR5.js → TreeTable-BXw7lFBk.js} +22 -22
- package/storybook-static/assets/TreeTable.stories-z40pruPV.js +83 -0
- package/storybook-static/assets/WithTooltip-7X4HQR7L-Cakt_JaX.js +9 -0
- package/storybook-static/assets/array-BBSjoTRy-CIRmlF93.js +1 -0
- package/storybook-static/assets/{async-D27PcxoG.js → async-BLDV04P4.js} +3 -3
- package/storybook-static/assets/axe-Bq-2xuso.js +20 -0
- package/storybook-static/assets/blocks-BiaKjftm.js +48 -0
- package/storybook-static/assets/browserAndReact-DX4H5rjQ.js +105 -0
- package/storybook-static/assets/check-fB4gCKB_.js +1 -0
- package/storybook-static/assets/chevron-down-B9GH0QvB.js +1 -0
- package/storybook-static/assets/chevron-left-DjbyJeHO.js +1 -0
- package/storybook-static/assets/chevron-right-D29uf09I.js +1 -0
- package/storybook-static/assets/chunk-242VQQM5-BMWWiybC.js +1 -0
- package/storybook-static/assets/chunk-DRQKCCAG-CqE-Zrl9.js +1 -0
- package/storybook-static/assets/chunk-IMSF75WX-yvVUwIQZ.js +6 -0
- package/storybook-static/assets/chunk-KJHJLCBK-D-yQfkOi.js +1 -0
- package/storybook-static/assets/chunk-QQBDHPVZ-B98qboss.js +1 -0
- package/storybook-static/assets/chunk-W22LQPXL-CGkHFiZ0.js +18 -0
- package/storybook-static/assets/circle-alert-Dmd7-WNp.js +1 -0
- package/storybook-static/assets/circle-check-VtVMsaJJ.js +1 -0
- package/storybook-static/assets/components-CsfQDbHv.js +241 -0
- package/storybook-static/assets/contextMenu-CzdfaUsd.js +2 -0
- package/storybook-static/assets/date-segments-D3HouZ37.js +1 -0
- package/storybook-static/assets/dom-B3G_GtJw.js +1 -0
- package/storybook-static/assets/download-CyVhTbv6.js +1 -0
- package/storybook-static/assets/error-BZrNlEUO.js +1 -0
- package/storybook-static/assets/file-vPGnhPr-.js +1 -0
- package/storybook-static/assets/filesAndExcel-DlUnL-Uu.js +122 -0
- package/storybook-static/assets/floating-ui.react-DZ8IyUV4.js +1 -0
- package/storybook-static/assets/formatter-L2YTDE3Q-x0raBH34.js +1 -0
- package/storybook-static/assets/formatters--mhLir82-v41eaI4a.js +1 -0
- package/storybook-static/assets/formatters-BTz64vfu.js +291 -0
- package/storybook-static/assets/formatters-runtime-DVi3RdYb.js +384 -0
- package/storybook-static/assets/foundationLib-CFj4J-Pc.js +82 -0
- package/storybook-static/assets/hooks-Ch5aYb7R.js +5 -0
- package/storybook-static/assets/iframe-Cr7AcW_R.js +1 -0
- package/storybook-static/assets/iframe-DaN-XFub.js +1151 -0
- package/storybook-static/assets/info-Cirk1RKZ.js +1 -0
- package/storybook-static/assets/{matchers-JIUQ3HVY-BPS-eazD.js → matchers-JIUQ3HVY-DvR2XErZ.js} +3 -3
- package/storybook-static/assets/media-BycWpjAl.js +1 -0
- package/storybook-static/assets/odata-BtfB5Aje.js +1 -0
- package/storybook-static/assets/odata-service-DnPlNGpU-Bpd4Zh9L.js +3 -0
- package/storybook-static/assets/odataAndTables-TEZyQ-TZ.js +126 -0
- package/storybook-static/assets/{odataFetchFn-BVgXXKgx.js → odataFetchFn-DEKVPDzV.js} +3 -3
- package/storybook-static/assets/odataStoryFixtures-CDDaJZKW.js +25 -0
- package/storybook-static/assets/{persisted-D8qUQbts.js → persisted-BzLLmgUK.js} +3 -3
- package/storybook-static/assets/preload-helper-BHmFeTtP.js +1 -0
- package/storybook-static/assets/pureUtilities-Dw249t3R.js +69 -0
- package/storybook-static/assets/react-18-CgkwBzTo.js +9 -0
- package/storybook-static/assets/react-C21x__mS.js +1 -0
- package/storybook-static/assets/react-CvkUhHUq.js +1 -0
- package/storybook-static/assets/react-KzpmXJc9.js +9 -0
- package/storybook-static/assets/react-dom-2o2phaJG.js +1 -0
- package/storybook-static/assets/react-qN2cStNd.js +1 -0
- package/storybook-static/assets/refresh-cw-BN3JCsXv.js +1 -0
- package/storybook-static/assets/rolldown-runtime-C0FnF6B9.js +1 -0
- package/storybook-static/assets/runtimeAndState-CCVgv3ck.js +117 -0
- package/storybook-static/assets/settings-2-jtcbbWm5.js +1 -0
- package/storybook-static/assets/sortable-dNWaObUX.js +1 -0
- package/storybook-static/assets/syntaxhighlighter-T5IQBZDB-hYwVxXYm.js +6 -0
- package/storybook-static/assets/theming-mTWhffkp.js +39 -0
- package/storybook-static/assets/trash-2-DrVfT0z5.js +1 -0
- package/storybook-static/assets/treeStoryFixtures-Ci7STpiz.js +1 -0
- package/storybook-static/assets/triangle-alert-B1Q28Bq9.js +1 -0
- package/storybook-static/assets/ui.module-DoMIk8Oc.js +1 -0
- package/storybook-static/assets/uiClasses-CO3Cdv1E.js +1 -0
- package/storybook-static/assets/useFlexClasses-Gn9spXEB.js +1 -0
- package/storybook-static/assets/useODataSelectBase-DlbeGYUP.js +1 -0
- package/storybook-static/assets/useODataTreeData-CvsoLfiG.js +1 -0
- package/storybook-static/assets/usePickerDefaultFilter-DdxyE_i8.js +1 -0
- package/storybook-static/assets/usePickerQuery-6rDaPaB0.js +1 -0
- package/storybook-static/assets/usePickerTriggerController-BHBjSLtn.js +1 -0
- package/storybook-static/assets/utils-DUM89eIj.js +1 -0
- package/storybook-static/assets/x-Dh43gJN9.js +1 -0
- package/storybook-static/iframe.html +8 -3
- package/storybook-static/index.html +6 -0
- package/storybook-static/index.json +1 -1
- package/storybook-static/project.json +1 -1
- package/storybook-static/sb-addons/a11y-3/manager-bundle.js +3 -3
- package/storybook-static/sb-addons/chromatic-com-storybook-1/manager-bundle.js +17 -17
- package/storybook-static/sb-addons/docs-2/manager-bundle.js +16 -1
- package/storybook-static/sb-addons/storybook-core-server-presets-0/common-manager-bundle.js +85 -83
- package/storybook-static/sb-addons/vitest-4/manager-bundle.js +1 -1
- package/storybook-static/sb-manager/globals-runtime.js +9939 -7695
- package/storybook-static/sb-manager/runtime.js +16128 -15326
- package/storybook-static/vite-inject-mocker-entry.js +2 -2
- package/dist/chunks/multi-select-CWx12rgb.js.map +0 -1
- package/dist/chunks/select-BPb-eL3O.js.map +0 -1
- package/storybook-static/assets/Badge.stories-CzsgAfG9.js +0 -51
- package/storybook-static/assets/Button-MoWVKehO.js +0 -12
- package/storybook-static/assets/Button.stories-wwep4c2p.js +0 -75
- package/storybook-static/assets/CheckBox-DHvne_6w.js +0 -2
- package/storybook-static/assets/CheckBox.module-ezWPE2pa.js +0 -1
- package/storybook-static/assets/CheckBox.stories-C14Axs5p.js +0 -60
- package/storybook-static/assets/Color-KMSTOMOX-CmMBFN4-.js +0 -1
- package/storybook-static/assets/ContextMenu.stories-Dr-tkpqd.js +0 -90
- package/storybook-static/assets/DateInput-erobPRG_.js +0 -1
- package/storybook-static/assets/DateRangePresetSelect-Cg90Kc_w.js +0 -3
- package/storybook-static/assets/DateRangePresetSelect.stories-BVap0joC.js +0 -11
- package/storybook-static/assets/Detail.stories-CLdtvJ7q.js +0 -44
- package/storybook-static/assets/Dialog.stories-Dx0jZO19.js +0 -31
- package/storybook-static/assets/Disclosure.stories-DhUdeDK6.js +0 -41
- package/storybook-static/assets/DocsRenderer-JROSPFPF-Dd1n83Uq.js +0 -2
- package/storybook-static/assets/DropZone.stories-6yYrwQOe.js +0 -44
- package/storybook-static/assets/DropdownMenu-D_2LfViU.js +0 -1
- package/storybook-static/assets/ExpandableActionPanel.stories-DVOFSOlm.js +0 -20
- package/storybook-static/assets/Flex-V-qg6Ejw.js +0 -3
- package/storybook-static/assets/Flex.stories-BZv94LD8.js +0 -300
- package/storybook-static/assets/ImageCropper.stories-MLFZyJxZ.js +0 -115
- package/storybook-static/assets/ImageRenderer-DHhD7mUz.js +0 -2
- package/storybook-static/assets/ImageRenderer.stories-ChcPymk2.js +0 -22
- package/storybook-static/assets/ImageView.stories-DszVNgC8.js +0 -9
- package/storybook-static/assets/ImageViewerRuntime-D8wFAKx5.js +0 -51
- package/storybook-static/assets/Input-BGdz8TmT.js +0 -3
- package/storybook-static/assets/Input.stories-Ban0Gnck.js +0 -38
- package/storybook-static/assets/InputDateTime.stories-DgKVmf54.js +0 -35
- package/storybook-static/assets/InputFile.stories-VnRv_q2r.js +0 -36
- package/storybook-static/assets/InputFiles-Dn9afnyd.js +0 -1
- package/storybook-static/assets/InputFiles.stories-CLVn5Xfq.js +0 -33
- package/storybook-static/assets/InputImage.stories-D__QcSho.js +0 -51
- package/storybook-static/assets/LayoutPicker.stories-BCnR-zBu.js +0 -449
- package/storybook-static/assets/Listbox.stories-B0HctqVp.js +0 -47
- package/storybook-static/assets/Modal.stories-BE-VpK-a.js +0 -180
- package/storybook-static/assets/MultiSelect-BoIwmje6.css +0 -1
- package/storybook-static/assets/MultiSelect-CaCNRNIe.js +0 -2
- package/storybook-static/assets/MultiSelect.stories-CNkbVGsb.js +0 -29
- package/storybook-static/assets/NotificationsHost.stories-BgqvZzT3.js +0 -25
- package/storybook-static/assets/ODataMultiSelect-CMyI4yYs.js +0 -1
- package/storybook-static/assets/ODataMultiSelect.stories-DTGCC6np.js +0 -73
- package/storybook-static/assets/ODataSelect-CGplYBh_.js +0 -1
- package/storybook-static/assets/ODataSelect.stories-CsxqRAvn.js +0 -73
- package/storybook-static/assets/ODataTreeMultiSelect-4ZiAtFZk.js +0 -19
- package/storybook-static/assets/ODataTreeMultiSelect.stories-B29Od8BL.js +0 -30
- package/storybook-static/assets/ODataTreeSelect-yZy7MBsZ.js +0 -17
- package/storybook-static/assets/ODataTreeSelect.stories-H7eaj1Sz.js +0 -24
- package/storybook-static/assets/PeriodSelect.stories-6CEzS2_H.js +0 -64
- package/storybook-static/assets/Popover.stories-BNgWOHlJ.js +0 -69
- package/storybook-static/assets/PresetRangeDateInput.stories-6UPVDF62.js +0 -15
- package/storybook-static/assets/RadioButton.stories-DbdFfJqO.js +0 -36
- package/storybook-static/assets/RadioGroup-BA21indC.js +0 -1
- package/storybook-static/assets/RadioGroup.stories-Ce6x0WUN.js +0 -42
- package/storybook-static/assets/Select-DyO25wSA.js +0 -12
- package/storybook-static/assets/Select.stories-CQ8f9fY9.js +0 -46
- package/storybook-static/assets/SelectOptionContent-fC4HFG5Q.js +0 -1
- package/storybook-static/assets/SerializableSelect-ki4BThj7.js +0 -4
- package/storybook-static/assets/SerializableSelect.stories-BzXBkWPI.js +0 -43
- package/storybook-static/assets/SingleDateTimeInput.stories-CI2yrD-f.js +0 -78
- package/storybook-static/assets/Slider.stories-D3O3_tqE.js +0 -77
- package/storybook-static/assets/SliderInput.stories-D1puleZB.js +0 -67
- package/storybook-static/assets/Sortable.stories-BoaL4W6r.js +0 -141
- package/storybook-static/assets/Splitter.stories-DJpFzZVJ.js +0 -22
- package/storybook-static/assets/StateSelect.stories-Ch2Gzzmd.js +0 -47
- package/storybook-static/assets/StringToggle.stories-B8qIG0M3.js +0 -6
- package/storybook-static/assets/Switch.stories-BysIhUHa.js +0 -26
- package/storybook-static/assets/Table.stories-CBpgmq7b.js +0 -122
- package/storybook-static/assets/Tabs.stories-BPYZuvzR.js +0 -58
- package/storybook-static/assets/TagInput.stories-BwOEnVpz.js +0 -18
- package/storybook-static/assets/Textarea.stories-BSJGz7JF.js +0 -27
- package/storybook-static/assets/TimePanel-ClMfq_py.js +0 -1
- package/storybook-static/assets/TimePanel.stories-_FqWdmta.js +0 -25
- package/storybook-static/assets/Toggle-BFhzeK2e.js +0 -1
- package/storybook-static/assets/Toggle.stories-Dw5UkD_b.js +0 -30
- package/storybook-static/assets/TreeMultiSelect-CerqHY2K.js +0 -19
- package/storybook-static/assets/TreeMultiSelect-Dw7FI3ic.js +0 -1
- package/storybook-static/assets/TreeMultiSelect.stories-BTQKFbeP.js +0 -35
- package/storybook-static/assets/TreePickerBase-rJISGJBT.js +0 -22
- package/storybook-static/assets/TreeSelect-CQ1vj_c9.js +0 -16
- package/storybook-static/assets/TreeSelect-Cp_lX0-B.js +0 -1
- package/storybook-static/assets/TreeSelect.stories-D6Q02Phx.js +0 -18
- package/storybook-static/assets/TreeTable.stories-YfyhkqH9.js +0 -83
- package/storybook-static/assets/WithTooltip-7X4HQR7L-BSQyvCOM.js +0 -9
- package/storybook-static/assets/axe-GLfyhAYL.js +0 -20
- package/storybook-static/assets/base-table-BNO0lnTL.css +0 -1
- package/storybook-static/assets/base-table-Dy3fEhQe.js +0 -18
- package/storybook-static/assets/blocks-ixiC6_NZ.js +0 -285
- package/storybook-static/assets/button-DZpTIXz2.js +0 -1
- package/storybook-static/assets/check-box-DByHwJGx.js +0 -1
- package/storybook-static/assets/chunk-242VQQM5-Dtm7LRbQ.js +0 -1
- package/storybook-static/assets/chunk-3LY4VQVK-BohfESrT.js +0 -6
- package/storybook-static/assets/chunk-LITCR56V-XaMGADKk.js +0 -18
- package/storybook-static/assets/contextMenu-BbMrBF3b.js +0 -2
- package/storybook-static/assets/date-7kR6zFX5.js +0 -461
- package/storybook-static/assets/date-segments-CzU9k5bl.js +0 -1
- package/storybook-static/assets/error-BRUjWXbJ.js +0 -1
- package/storybook-static/assets/file-CI_sonB1.js +0 -291
- package/storybook-static/assets/file-hArYcyES.js +0 -1
- package/storybook-static/assets/flex-C--89Z3g.js +0 -1
- package/storybook-static/assets/floating-ui.react-DLXcGGFR.js +0 -1
- package/storybook-static/assets/formatter-L2YTDE3Q-DgyzUf7M.js +0 -1
- package/storybook-static/assets/formatters-BtIOYENB.js +0 -3
- package/storybook-static/assets/formulas-DRh9I2eS.js +0 -2
- package/storybook-static/assets/grid-DLxeTZJe.js +0 -1
- package/storybook-static/assets/hooks-DWeJq8G1.js +0 -5
- package/storybook-static/assets/iframe-BJGIOdSH.js +0 -1119
- package/storybook-static/assets/input-DXi75xv1.js +0 -1
- package/storybook-static/assets/mdx-react-shim-CmoAsjhK.js +0 -1
- package/storybook-static/assets/media-DWFaNgLM.js +0 -1
- package/storybook-static/assets/misc-BElIqBdV.css +0 -1
- package/storybook-static/assets/misc-DNZTbWc6.js +0 -5
- package/storybook-static/assets/notifications-DjtgzFqT.js +0 -1
- package/storybook-static/assets/number-Xkw1yPJo.js +0 -2
- package/storybook-static/assets/odata-C4Liwkjx.js +0 -1
- package/storybook-static/assets/odata-service-C2oJ-ZmZ.js +0 -1
- package/storybook-static/assets/odataStoryFixtures-eEGvvtmw.js +0 -25
- package/storybook-static/assets/picker-DsP4xCcJ.js +0 -2
- package/storybook-static/assets/popover-BiQHI7Wi.css +0 -1
- package/storybook-static/assets/popover-CuFTypCp.js +0 -2
- package/storybook-static/assets/preload-helper-B45gAKPr.js +0 -1
- package/storybook-static/assets/preset-select-SPNHA-mp.js +0 -5
- package/storybook-static/assets/pwa-B7uYfAPd.js +0 -640
- package/storybook-static/assets/queryClient-CA0puYc0.js +0 -567
- package/storybook-static/assets/react-18-CaNSmcD-.js +0 -9
- package/storybook-static/assets/react-3qMIUlAf.js +0 -9
- package/storybook-static/assets/react-dom-BC7xZNHy.js +0 -1
- package/storybook-static/assets/select-sUla5-3b.js +0 -1
- package/storybook-static/assets/slider--Yp_sa_W.js +0 -2
- package/storybook-static/assets/sortable-jALaQqYE.js +0 -1
- package/storybook-static/assets/syntaxhighlighter-RTCFPKCB-u_WDwfDn.js +0 -6
- package/storybook-static/assets/text-D5xgciF8.js +0 -4
- package/storybook-static/assets/theming-oB64gsjY.js +0 -39
- package/storybook-static/assets/treeStoryFixtures-Y_nnjz0_.js +0 -1
- package/storybook-static/assets/ui-DWDaBPQx.js +0 -1
- package/storybook-static/assets/ui.module-wFHXkJzp.js +0 -1
- package/storybook-static/assets/uiClasses-CaHp0EWd.js +0 -1
- package/storybook-static/assets/useODataSelectBase-DjlPxmxr.js +0 -1
- package/storybook-static/assets/useODataTreeData-1W6cbuec.js +0 -1
- package/storybook-static/assets/utils-DzbSigQl.js +0 -1
- package/storybook-static/assets/valueState-GnkKWBTr.js +0 -277
- /package/storybook-static/assets/{DropdownMenu-BgzIzwzM.css → ContextMenu-BgzIzwzM.css} +0 -0
- /package/storybook-static/assets/{Grid-K9R_IHaw.css → GridContainer-K9R_IHaw.css} +0 -0
- /package/storybook-static/assets/{InputFiles-ByK52qUe.css → InputFilesList-ByK52qUe.css} +0 -0
- /package/storybook-static/assets/{slider-DMDFRH6B.css → Slider-DMDFRH6B.css} +0 -0
- /package/storybook-static/assets/{Flex-IXK2se1Y.css → useFlexClasses-IXK2se1Y.css} +0 -0
- /package/storybook-static/assets/{picker-DzBkX15M.css → usePickerTriggerController-DzBkX15M.css} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Text as e } from "../text/index.js";
|
|
2
2
|
import { t } from "./ui.module-BisoTevy.js";
|
|
3
3
|
import { t as n } from "./check-box-Dd3YFuxd.js";
|
|
4
|
-
import { a as r, c as i, d as a, f as o, i as s, l as c, n as l, p as u, r as d, t as f, u as p } from "./picker-
|
|
4
|
+
import { a as r, c as i, d as a, f as o, i as s, l as c, n as l, p as u, r as d, t as f, u as p } from "./picker-e6IsrMUG.js";
|
|
5
5
|
import { t as ee } from "./separator-B72Aq-6a.js";
|
|
6
6
|
import { n as m, r as h, t as g } from "./useODataSelectBase-CKe1AVMI.js";
|
|
7
7
|
import { forwardRef as _, useCallback as te, useMemo as v, useRef as ne, useState as y } from "react";
|
|
@@ -267,7 +267,6 @@ var k = _(({ codeKey: e, textKey: n, hideCode: a, items: p, value: m, onChange:
|
|
|
267
267
|
label: g,
|
|
268
268
|
description: _,
|
|
269
269
|
disabled: j,
|
|
270
|
-
placeholder: b,
|
|
271
270
|
size: re,
|
|
272
271
|
className: C.multiSelect,
|
|
273
272
|
children: ({ controlId: n, labelId: r, describedBy: a }) => {
|
|
@@ -281,7 +280,7 @@ var k = _(({ codeKey: e, textKey: n, hideCode: a, items: p, value: m, onChange:
|
|
|
281
280
|
autoComplete: "off",
|
|
282
281
|
disabled: j,
|
|
283
282
|
value: V,
|
|
284
|
-
placeholder: Ke ? void 0 : b
|
|
283
|
+
placeholder: Ke ? void 0 : `${b} <${p.length}>`,
|
|
285
284
|
"aria-labelledby": r,
|
|
286
285
|
"aria-describedby": a,
|
|
287
286
|
"aria-haspopup": "listbox",
|
|
@@ -505,7 +504,7 @@ function F({ label: e, description: t, disabled: n, placeholder: r, size: i, opt
|
|
|
505
504
|
items: d,
|
|
506
505
|
codeKey: "key",
|
|
507
506
|
textKey: "text",
|
|
508
|
-
hideCode: u
|
|
507
|
+
hideCode: !u || void 0,
|
|
509
508
|
value: p,
|
|
510
509
|
onChange: (e) => s(e.map((e) => e.key))
|
|
511
510
|
});
|
|
@@ -513,4 +512,4 @@ function F({ label: e, description: t, disabled: n, placeholder: r, size: i, opt
|
|
|
513
512
|
//#endregion
|
|
514
513
|
export { k as a, A as i, M as n, w as o, j as r, F as t };
|
|
515
514
|
|
|
516
|
-
//# sourceMappingURL=multi-select-
|
|
515
|
+
//# sourceMappingURL=multi-select-COEkc8Qc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"multi-select-COEkc8Qc.js","names":[],"sources":["../../src/multi-select/ui/MultiSelectOption.tsx","../../src/multi-select/ui/MultiSelect.module.scss","../../src/multi-select/ui/MultiSelectToken.tsx","../../src/multi-select/ui/defaultRenderers.tsx","../../src/multi-select/ui/MultiSelectOptionSkeleton.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":["import { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata\";\n\nimport { SelectOptionContent } from \"../../select/SelectOptionContent\";\n\ninterface MultiSelectOptionProps {\n\titem: CollectionItem;\n\ttextKey: string;\n\tcodeKey?: string;\n\thighlight?: string;\n\tselected: boolean;\n}\n\n/**\n * Отдельная опция внутри `MultiSelect`. Отрисовывает состояние выбора и подсветку текста для найденных совпадений.\n */\nexport function MultiSelectOption({ item, textKey, codeKey, highlight }: MultiSelectOptionProps) {\n\treturn <SelectOptionContent label={item[textKey]} code={codeKey && item[codeKey]} highlight={highlight} />;\n}\n","@use \"@/styles/mixins\" as *;\n\n.multiSelect {\n\t// Общий контейнер\n\tpadding: 0;\n}\n\n.multiSelectTokens {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: flex-end;\n\n\theight: calc(100% - var(--space-sm));\n\twidth: calc(var(--base-width, 100%) - (var(--control-height) * 2) - var(--space-md));\n\n\tpointer-events: none;\n\t// overflow: hidden;\n\n\t&:empty {\n\t\tdisplay: none;\n\t}\n}\n\n.multiSelectToken {\n\t// font-size: var(--font-size-sm);\n\n\t// flex: 1 1 0%;\n\t// min-width: 0;\n\tmax-width: 100%;\n\n\toverflow: hidden;\n\twhite-space: nowrap;\n\tword-break: normal;\n\ttext-overflow: ellipsis;\n\n\tpointer-events: none;\n}\n","import styles from \"./MultiSelect.module.scss\";\n\ninterface MultiSelectTokenProps {\n\tvalue: string | undefined;\n}\n\n/**\n * Токен выбранного значения в `MultiSelect`. Показывает выбранный элемент и кнопку его удаления из текущего набора.\n */\nexport function MultiSelectToken({ value }: MultiSelectTokenProps) {\n\tif (!value) return null;\n\n\treturn (\n\t\t<div className={styles.multiSelectTokens}>\n\t\t\t<div className={styles.multiSelectToken}>{value}</div>\n\t\t</div>\n\t);\n}\n","import { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata\";\n\nimport { PickerSelectionToolbar } from \"../../picker\";\n\nimport { MultiSelectOption } from \"./MultiSelectOption\";\nimport { MultiSelectToken } from \"./MultiSelectToken\";\n\nimport type { MultiSelectItemState, MultiSelectRenderContext } from \"./MultiSelect\";\n\ninterface MultiSelectRendererConfig {\n\tcodeKey: string;\n\ttextKey?: string;\n\thideCode?: boolean;\n}\n\nexport function resolveMultiSelectTextKey(items: 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\nexport function getDefaultMultiSelectTokenValue(items: CollectionItem[], codeKey: string, textKey?: string) {\n\tif (items.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tif (items.length > 1) {\n\t\treturn `${items.length} элементов`;\n\t}\n\n\tconst resolvedTextKey = resolveMultiSelectTextKey(items, codeKey, textKey);\n\treturn items[0]?.[resolvedTextKey] ?? items[0]?.[codeKey];\n}\n\nexport function createDefaultMultiSelectTokenRenderer(config: MultiSelectRendererConfig) {\n\treturn function renderDefaultToken(context: MultiSelectRenderContext) {\n\t\treturn <MultiSelectToken value={getDefaultMultiSelectTokenValue(context.selectedItems, config.codeKey, config.textKey)} />;\n\t};\n}\n\nexport function renderDefaultMultiSelectToolbar(context: MultiSelectRenderContext) {\n\treturn <PickerSelectionToolbar onSelectAll={context.selectAll} onDeselectAll={context.deselectAll} />;\n}\n\nexport function createDefaultMultiSelectItemRenderer(config: MultiSelectRendererConfig) {\n\treturn function renderDefaultItem(item: CollectionItem, state: MultiSelectItemState) {\n\t\treturn (\n\t\t\t<MultiSelectOption\n\t\t\t\titem={item}\n\t\t\t\tselected={state.selected}\n\t\t\t\thighlight={state.highlightQuery}\n\t\t\t\ttextKey={resolveMultiSelectTextKey([item], config.codeKey, config.textKey)}\n\t\t\t\tcodeKey={config.hideCode ? undefined : config.codeKey}\n\t\t\t/>\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 React, { forwardRef, type PropsWithChildren, useCallback, useMemo, useRef, useState } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { XIcon } from \"lucide-react\";\n\nimport { CheckBox } from \"../../check-box\";\nimport {\n\tPickerField,\n\tPickerPopup,\n\tPickerStatus,\n\tPickerTriggerActions,\n\tPickerTriggerInput,\n\tusePickerDefaultFilter,\n\tusePickerFloatingListbox,\n\tusePickerQuery,\n\tusePickerSelectionLifecycle,\n\tusePickerTriggerController\n} from \"../../picker\";\nimport { Separator } from \"../../separator\";\nimport { type UiBaseProps } from \"../../types\";\nimport uiStyles from \"../../ui.module.scss\";\n\nimport {\n\tcreateDefaultMultiSelectItemRenderer,\n\tcreateDefaultMultiSelectTokenRenderer,\n\trenderDefaultMultiSelectToolbar,\n\tresolveMultiSelectTextKey\n} from \"./defaultRenderers\";\nimport styles from \"./MultiSelect.module.scss\";\nimport { MultiSelectOptionSkeleton } from \"./MultiSelectOptionSkeleton\";\n\nimport type { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata\";\n\ninterface MultiSelectOptionsProps extends PropsWithChildren {\n\tisNoData?: boolean;\n\tisLoading?: boolean;\n\terror?: string;\n}\n\nfunction MultiSelectOptionsWrapper({ isNoData, isLoading, error, children }: MultiSelectOptionsProps) {\n\tif (isNoData) return <PickerStatus emptyState={<MultiSelectOptionSkeleton text=\"Нет данных\" />} />;\n\tif (isLoading) return <PickerStatus loadingState={<MultiSelectOptionSkeleton text=\"Загрузка...\" />} />;\n\tif (error) return <PickerStatus errorState={<MultiSelectOptionSkeleton isError text=\"Ошибка загрузки\" />} />;\n\n\treturn <>{children}</>;\n}\n\nexport interface MultiSelectItemState {\n\tselected: boolean;\n\tactive: boolean;\n\tdisabled: boolean;\n\tquery: string;\n\thighlightQuery: string;\n}\n\nexport interface MultiSelectRenderContext {\n\tselectedItems: CollectionItem[];\n\tcommittedSelectedItems: CollectionItem[];\n\tavailableItems: CollectionItem[];\n\tquery: string;\n\topen: boolean;\n\tclearSelection: () => void;\n\tselectAll: () => void;\n\tdeselectAll: () => void;\n}\n\nexport interface MultiSelectOptionDisableContext {\n\tselectedItems: CollectionItem[];\n\tcommittedSelectedItems: CollectionItem[];\n\tselectedKeys: ReadonlySet<string>;\n\topen: boolean;\n}\n\ntype MultiSelectOptionalRenderer<TContext> = ((context: TContext) => React.ReactNode) | null | false;\n\ninterface MultiSelectRenderers {\n\trenderToken?: MultiSelectOptionalRenderer<MultiSelectRenderContext>;\n\trenderToolbar?: MultiSelectOptionalRenderer<MultiSelectRenderContext>;\n\trenderItem?: (item: CollectionItem, state: MultiSelectItemState) => React.ReactNode;\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\nconst fallback: CollectionItem[] = [];\n\nfunction getItemKey(item: CollectionItem, codeKey: string) {\n\treturn item[codeKey];\n}\n\nfunction getItemSearchParts(item: CollectionItem, codeKey: string, textKey: string) {\n\treturn Array.from(new Set([item[textKey], item[codeKey], ...Object.values(item)]));\n}\n\nfunction areSelectionsEqual(left: CollectionItem[], right: CollectionItem[], codeKey: string) {\n\tif (left.length !== right.length) {\n\t\treturn false;\n\t}\n\n\tconst rightKeys = new Set(right.map((item) => getItemKey(item, codeKey)));\n\n\treturn left.every((item) => rightKeys.has(getItemKey(item, codeKey)));\n}\n\ninterface MultiSelectOptionEntry {\n\titem: CollectionItem;\n\tindex: number;\n}\n\ninterface MultiSelectOptionGroupProps {\n\tentries: MultiSelectOptionEntry[];\n\tlistId: string;\n\tactiveIndex: number;\n\tselectedKeys: Set<string>;\n\tcodeKey: string;\n\tquery: string;\n\thighlightQuery: string;\n\tgetOptionDisabled?: (item: CollectionItem) => boolean;\n\tgetOptionId: (listId: string, index: number) => string;\n\tsetOptionRef: (index: number, node: HTMLElement | null) => void;\n\ttoggleOption: (item: CollectionItem) => void;\n\tselectOnlyOption: (item: CollectionItem) => void;\n\trenderItem: (item: CollectionItem, state: MultiSelectItemState) => React.ReactNode;\n}\n\nfunction MultiSelectOptionGroup({\n\tentries,\n\tlistId,\n\tactiveIndex,\n\tselectedKeys,\n\tcodeKey,\n\tquery,\n\thighlightQuery,\n\tgetOptionDisabled,\n\tgetOptionId,\n\tsetOptionRef,\n\ttoggleOption,\n\tselectOnlyOption,\n\trenderItem\n}: MultiSelectOptionGroupProps) {\n\treturn entries.map(({ item, index }) => {\n\t\tconst active = index === activeIndex;\n\t\tconst selected = selectedKeys.has(getItemKey(item, codeKey));\n\t\tconst optionDisabled = getOptionDisabled?.(item) ?? false;\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tkey={`${getItemKey(item, codeKey)}-${index}`}\n\t\t\t\tid={getOptionId(listId, index)}\n\t\t\t\tref={(node) => setOptionRef(index, node)}\n\t\t\t\trole=\"option\"\n\t\t\t\taria-selected={selected}\n\t\t\t\taria-disabled={optionDisabled || undefined}\n\t\t\t\tclassName={cn(\n\t\t\t\t\tuiStyles.uiSelectOption,\n\t\t\t\t\toptionDisabled && uiStyles.disabled,\n\t\t\t\t\tselected && uiStyles.selected,\n\t\t\t\t\tactive && uiStyles.uiPopupOptionActive\n\t\t\t\t)}\n\t\t\t\tonMouseDown={(event) => {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}}>\n\t\t\t\t<div\n\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t}}>\n\t\t\t\t\t<CheckBox\n\t\t\t\t\t\tvalue={selected}\n\t\t\t\t\t\tdisabled={optionDisabled}\n\t\t\t\t\t\tonChange={() => {\n\t\t\t\t\t\t\tif (!optionDisabled) {\n\t\t\t\t\t\t\t\ttoggleOption(item);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}}\n\t\t\t\t\t\tonMouseDown={(event) => {\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t\t<div\n\t\t\t\t\tclassName=\"overflowHidden\"\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tif (!optionDisabled) {\n\t\t\t\t\t\t\tselectOnlyOption(item);\n\t\t\t\t\t\t}\n\t\t\t\t\t}}>\n\t\t\t\t\t{renderItem(item, { selected, active, disabled: optionDisabled, query, highlightQuery })}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t});\n}\n\n/**\n * Поле множественного выбора с внутренним черновиком значений и подтверждением выбора при закрытии списка.\n * Подходит как для самостоятельного использования, так и как базовый слой для OData-оберток.\n */\nexport const MultiSelect = forwardRef<HTMLInputElement, MultiSelectProps>(\n\t(\n\t\t{\n\t\t\tcodeKey,\n\t\t\ttextKey,\n\t\t\thideCode,\n\t\t\titems,\n\t\t\tvalue,\n\t\t\tonChange,\n\t\t\tlabel,\n\t\t\tdescription,\n\t\t\tplaceholder,\n\t\t\tsize,\n\t\t\tquery,\n\t\t\tdefaultQuery,\n\t\t\thighlightQuery,\n\t\t\tonQuery,\n\t\t\tdefaultFilter = true,\n\t\t\tonOpen,\n\t\t\tonClose,\n\t\t\tgetOptionDisabled,\n\t\t\tdisabled,\n\t\t\terror,\n\t\t\tisLoading,\n\t\t\trenderToken,\n\t\t\trenderToolbar,\n\t\t\trenderItem\n\t\t},\n\t\tref\n\t) => {\n\t\tconst inputRef = useRef<HTMLInputElement | null>(null);\n\t\tconst [open, setOpen] = useState(false);\n\t\tconst triggerMode = \"search-multi\";\n\t\tconst committedSelectedItems = value ?? fallback;\n\t\tconst committedSelectedKeys = useMemo(\n\t\t\t() => new Set(committedSelectedItems.map((item) => getItemKey(item, codeKey))),\n\t\t\t[codeKey, committedSelectedItems]\n\t\t);\n\t\tconst availableItems = useMemo(\n\t\t\t() => items.filter((item) => !committedSelectedKeys.has(getItemKey(item, codeKey))),\n\t\t\t[codeKey, committedSelectedKeys, items]\n\t\t);\n\t\tconst resolvedTextKey = useMemo(\n\t\t\t() => resolveMultiSelectTextKey([...committedSelectedItems, ...items], codeKey, textKey),\n\t\t\t[codeKey, committedSelectedItems, items, textKey]\n\t\t);\n\t\tconst { query: currentQuery, setQuery } = usePickerQuery({\n\t\t\topen,\n\t\t\tquery,\n\t\t\tdefaultQuery,\n\t\t\tonQuery,\n\t\t\ttriggerMode\n\t\t});\n\t\tconst filteredCommittedSelectedItems = usePickerDefaultFilter({\n\t\t\toptions: committedSelectedItems,\n\t\t\tquery: currentQuery,\n\t\t\tenabled: defaultFilter,\n\t\t\tgetSearchText: (item) => getItemSearchParts(item, codeKey, resolvedTextKey)\n\t\t});\n\t\tconst filteredAvailableItems = usePickerDefaultFilter({\n\t\t\toptions: availableItems,\n\t\t\tquery: currentQuery,\n\t\t\tenabled: defaultFilter,\n\t\t\tgetSearchText: (item) => getItemSearchParts(item, codeKey, resolvedTextKey)\n\t\t});\n\t\tconst visibleOptions = useMemo(\n\t\t\t() => [...filteredCommittedSelectedItems, ...filteredAvailableItems],\n\t\t\t[filteredAvailableItems, filteredCommittedSelectedItems]\n\t\t);\n\t\tconst selectedIndex = filteredCommittedSelectedItems.length > 0 ? 0 : -1;\n\t\tconst {\n\t\t\tdraftValue: draftSelectedItems,\n\t\t\tsetDraftValue: setDraftSelectedItems,\n\t\t\tprepareOpen\n\t\t} = usePickerSelectionLifecycle({\n\t\t\tvalue: committedSelectedItems,\n\t\t\topen,\n\t\t\tonCommit: onChange,\n\t\t\tonOpen,\n\t\t\tonClose,\n\t\t\tisEqual: (left, right) => areSelectionsEqual(left, right, codeKey)\n\t\t});\n\t\tconst selectedKeys = useMemo(\n\t\t\t() => new Set(draftSelectedItems.map((item) => getItemKey(item, codeKey))),\n\t\t\t[codeKey, draftSelectedItems]\n\t\t);\n\t\tconst optionDisableContext = useMemo<MultiSelectOptionDisableContext>(\n\t\t\t() => ({\n\t\t\t\tselectedItems: draftSelectedItems,\n\t\t\t\tcommittedSelectedItems,\n\t\t\t\tselectedKeys,\n\t\t\t\topen\n\t\t\t}),\n\t\t\t[committedSelectedItems, draftSelectedItems, open, selectedKeys]\n\t\t);\n\t\tconst isOptionDisabled = useCallback(\n\t\t\t(item: CollectionItem) => getOptionDisabled?.(item, optionDisableContext) ?? false,\n\t\t\t[getOptionDisabled, optionDisableContext]\n\t\t);\n\t\tconst {\n\t\t\tactiveIndex,\n\t\t\tcontext,\n\t\t\tfloatingStyles,\n\t\t\tgetFloatingProps,\n\t\t\tsetReference,\n\t\t\tsetFloating,\n\t\t\tsetOptionRef,\n\t\t\tclose,\n\t\t\topenList,\n\t\t\ttoggleOpen,\n\t\t\tselectActiveOption,\n\t\t\thandleReferenceKeyDown,\n\t\t\thandleFloatingKeyDown,\n\t\t\tgetOptionId,\n\t\t\tgetActiveOptionId\n\t\t} = usePickerFloatingListbox({\n\t\t\toptions: visibleOptions,\n\t\t\tselectedIndex,\n\t\t\topen,\n\t\t\tonOpenChange: setOpen,\n\t\t\tonSelect: undefined,\n\t\t\tdisabled,\n\t\t\tgetOptionDisabled: isOptionDisabled,\n\t\t\tcloseOnSelect: false,\n\t\t\tallowOpenWithoutOptions: true,\n\t\t\ttriggerMode\n\t\t});\n\n\t\tconst currentHighlightQuery = highlightQuery ?? currentQuery;\n\t\tconst toggleDraftSelection = (item: CollectionItem) => {\n\t\t\tconst itemKey = getItemKey(item, codeKey);\n\n\t\t\tsetDraftSelectedItems((currentItems) => {\n\t\t\t\tconst isSelected = currentItems.some((selectedItem) => getItemKey(selectedItem, codeKey) === itemKey);\n\n\t\t\t\tif (isSelected) {\n\t\t\t\t\treturn currentItems.filter((selectedItem) => getItemKey(selectedItem, codeKey) !== itemKey);\n\t\t\t\t}\n\n\t\t\t\tif (isOptionDisabled(item)) {\n\t\t\t\t\treturn currentItems;\n\t\t\t\t}\n\n\t\t\t\treturn [...currentItems, item];\n\t\t\t});\n\t\t};\n\n\t\tconst setInputNode = (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\n\t\tconst clearSelection = () => {\n\t\t\tsetDraftSelectedItems([]);\n\n\t\t\tif (!open) {\n\t\t\t\tonChange([]);\n\t\t\t}\n\t\t};\n\n\t\tconst selectAll = () => {\n\t\t\tsetDraftSelectedItems((currentItems) => {\n\t\t\t\tconst nextItems = [...currentItems];\n\t\t\t\tconst selectedKeys = new Set(currentItems.map((item) => getItemKey(item, codeKey)));\n\n\t\t\t\tfor (const item of visibleOptions) {\n\t\t\t\t\tconst itemKey = getItemKey(item, codeKey);\n\n\t\t\t\t\tif (!selectedKeys.has(itemKey) && !isOptionDisabled(item)) {\n\t\t\t\t\t\tselectedKeys.add(itemKey);\n\t\t\t\t\t\tnextItems.push(item);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn nextItems;\n\t\t\t});\n\t\t};\n\n\t\tconst deselectAll = () => {\n\t\t\tsetDraftSelectedItems([]);\n\t\t};\n\n\t\tconst selectOnlyOption = (item: CollectionItem) => {\n\t\t\tif (isOptionDisabled(item)) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsetDraftSelectedItems([item]);\n\t\t\tclose();\n\t\t};\n\n\t\tconst currentSelectedItems = open ? draftSelectedItems : committedSelectedItems;\n\t\tconst hasSelectedItems = currentSelectedItems.length > 0;\n\t\tconst renderContext: MultiSelectRenderContext = {\n\t\t\tselectedItems: currentSelectedItems,\n\t\t\tcommittedSelectedItems,\n\t\t\tavailableItems: filteredAvailableItems,\n\t\t\tquery: currentQuery,\n\t\t\topen,\n\t\t\tclearSelection,\n\t\t\tselectAll,\n\t\t\tdeselectAll\n\t\t};\n\t\tconst tokenRenderer =\n\t\t\trenderToken === undefined ? createDefaultMultiSelectTokenRenderer({ codeKey, textKey: resolvedTextKey }) : renderToken;\n\t\tconst toolbarRenderer = renderToolbar === undefined ? renderDefaultMultiSelectToolbar : renderToolbar;\n\t\tconst itemRenderer =\n\t\t\trenderItem ??\n\t\t\tcreateDefaultMultiSelectItemRenderer({\n\t\t\t\tcodeKey,\n\t\t\t\ttextKey: resolvedTextKey,\n\t\t\t\thideCode\n\t\t\t});\n\t\tconst tokenNode = typeof tokenRenderer === \"function\" ? tokenRenderer(renderContext) : null;\n\t\tconst toolbarNode = typeof toolbarRenderer === \"function\" ? toolbarRenderer(renderContext) : null;\n\t\t// const hasToken = tokenNode !== null && tokenNode !== undefined;\n\t\tconst selectedEntries = filteredCommittedSelectedItems.map((item, index) => ({ item, index }));\n\t\tconst itemEntries = filteredAvailableItems.map((item, index) => ({ item, index: index + selectedEntries.length }));\n\t\tconst isNoData = !isLoading && !error && visibleOptions.length === 0;\n\t\tconst triggerController = usePickerTriggerController({\n\t\t\tmode: triggerMode,\n\t\t\topen,\n\t\t\tcurrentQuery,\n\t\t\thasDisplayValue: false,\n\t\t\tinputRef,\n\t\t\tsetQuery,\n\t\t\topenList,\n\t\t\tclose,\n\t\t\ttoggleOpen,\n\t\t\tonBeforeOpen: () => {\n\t\t\t\tif (!open) {\n\t\t\t\t\tprepareOpen();\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\treturn (\n\t\t\t<PickerField label={label} description={description} disabled={disabled} size={size} className={styles.multiSelect}>\n\t\t\t\t{({ controlId, labelId, describedBy }) => {\n\t\t\t\t\tconst listId = `${controlId}-listbox`;\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<PickerTriggerInput\n\t\t\t\t\t\t\t\tref={setInputNode}\n\t\t\t\t\t\t\t\trootRef={setReference}\n\t\t\t\t\t\t\t\tid={controlId}\n\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\tvalue={currentQuery}\n\t\t\t\t\t\t\t\tplaceholder={hasSelectedItems ? undefined : `${placeholder} <${items.length}>`}\n\t\t\t\t\t\t\t\taria-labelledby={labelId}\n\t\t\t\t\t\t\t\taria-describedby={describedBy}\n\t\t\t\t\t\t\t\taria-haspopup=\"listbox\"\n\t\t\t\t\t\t\t\taria-expanded={open}\n\t\t\t\t\t\t\t\taria-controls={open ? listId : undefined}\n\t\t\t\t\t\t\t\taria-autocomplete=\"list\"\n\t\t\t\t\t\t\t\taria-activedescendant={open ? getActiveOptionId(listId) : undefined}\n\t\t\t\t\t\t\t\trootClassName=\"flex alignItemsCenter\"\n\t\t\t\t\t\t\t\tendAdornment={\n\t\t\t\t\t\t\t\t\t<PickerTriggerActions\n\t\t\t\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\t\tonToggleMouseDown={triggerController.handleToggleMouseDown}\n\t\t\t\t\t\t\t\t\t\tonToggleClick={triggerController.handleToggleClick}>\n\t\t\t\t\t\t\t\t\t\t{tokenNode}\n\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tdisabled={!hasSelectedItems}\n\t\t\t\t\t\t\t\t\t\t\tclassName={uiStyles.uiClearButton}\n\t\t\t\t\t\t\t\t\t\t\tdata-ui=\"multi-select-clear-button\"\n\t\t\t\t\t\t\t\t\t\t\tdata-action=\"clear-multi-select\"\n\t\t\t\t\t\t\t\t\t\t\tonClick={clearSelection}\n\t\t\t\t\t\t\t\t\t\t\taria-label=\"Очистить все\">\n\t\t\t\t\t\t\t\t\t\t\t<XIcon />\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</PickerTriggerActions>\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tonChange={(event) => {\n\t\t\t\t\t\t\t\t\ttriggerController.handleTriggerInputChange(event.target.value);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonClick={triggerController.handleTriggerClick}\n\t\t\t\t\t\t\t\tonFocus={(event) => {\n\t\t\t\t\t\t\t\t\ttriggerController.handleTriggerFocus(event.currentTarget);\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\t\t\t\thandleReferenceKeyDown(event);\n\n\t\t\t\t\t\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\ttriggerController.handleTriggerKeyDown({\n\t\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\t\tonActivateWhenOpen: () => {\n\t\t\t\t\t\t\t\t\t\t\tif (activeIndex >= 0) {\n\t\t\t\t\t\t\t\t\t\t\t\tconst activeItem = visibleOptions[activeIndex];\n\t\t\t\t\t\t\t\t\t\t\t\tif (activeItem) {\n\t\t\t\t\t\t\t\t\t\t\t\t\ttoggleDraftSelection(activeItem);\n\t\t\t\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\tselectActiveOption();\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\tenableClosedArrowDownOpen: true,\n\t\t\t\t\t\t\t\t\t\tsuppressClosedArrowUp: true\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t<PickerPopup\n\t\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\t\tcontext={context}\n\t\t\t\t\t\t\t\tfloatingStyles={floatingStyles}\n\t\t\t\t\t\t\t\tlistId={listId}\n\t\t\t\t\t\t\t\tlabelId={labelId}\n\t\t\t\t\t\t\t\tdescriptionId={describedBy}\n\t\t\t\t\t\t\t\tactiveOptionId={open ? getActiveOptionId(listId) : undefined}\n\t\t\t\t\t\t\t\tsetFloating={setFloating}\n\t\t\t\t\t\t\t\tgetFloatingProps={getFloatingProps}\n\t\t\t\t\t\t\t\tonKeyDown={handleFloatingKeyDown}\n\t\t\t\t\t\t\t\tinitialFocus={-1}\n\t\t\t\t\t\t\t\treturnFocus={false}\n\t\t\t\t\t\t\t\ttabIndex={-1}\n\t\t\t\t\t\t\t\tclassName={uiStyles.uiPopupOptions}\n\t\t\t\t\t\t\t\theader={toolbarNode}>\n\t\t\t\t\t\t\t\t<MultiSelectOptionsWrapper isNoData={isNoData} isLoading={isLoading} error={error}>\n\t\t\t\t\t\t\t\t\t<div className=\"scrollable h100\">\n\t\t\t\t\t\t\t\t\t\t<MultiSelectOptionGroup\n\t\t\t\t\t\t\t\t\t\t\tentries={selectedEntries}\n\t\t\t\t\t\t\t\t\t\t\tlistId={listId}\n\t\t\t\t\t\t\t\t\t\t\tactiveIndex={activeIndex}\n\t\t\t\t\t\t\t\t\t\t\tselectedKeys={selectedKeys}\n\t\t\t\t\t\t\t\t\t\t\tcodeKey={codeKey}\n\t\t\t\t\t\t\t\t\t\t\tquery={currentQuery}\n\t\t\t\t\t\t\t\t\t\t\thighlightQuery={currentHighlightQuery}\n\t\t\t\t\t\t\t\t\t\t\tgetOptionDisabled={isOptionDisabled}\n\t\t\t\t\t\t\t\t\t\t\tgetOptionId={getOptionId}\n\t\t\t\t\t\t\t\t\t\t\tsetOptionRef={setOptionRef}\n\t\t\t\t\t\t\t\t\t\t\ttoggleOption={toggleDraftSelection}\n\t\t\t\t\t\t\t\t\t\t\tselectOnlyOption={selectOnlyOption}\n\t\t\t\t\t\t\t\t\t\t\trenderItem={itemRenderer}\n\t\t\t\t\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t\t\t\t\t{selectedEntries.length > 0 && availableItems.length > 0 && <Separator className=\"marginBlockSm\" />}\n\n\t\t\t\t\t\t\t\t\t\t<MultiSelectOptionGroup\n\t\t\t\t\t\t\t\t\t\t\tentries={itemEntries}\n\t\t\t\t\t\t\t\t\t\t\tlistId={listId}\n\t\t\t\t\t\t\t\t\t\t\tactiveIndex={activeIndex}\n\t\t\t\t\t\t\t\t\t\t\tselectedKeys={selectedKeys}\n\t\t\t\t\t\t\t\t\t\t\tcodeKey={codeKey}\n\t\t\t\t\t\t\t\t\t\t\tquery={currentQuery}\n\t\t\t\t\t\t\t\t\t\t\thighlightQuery={currentHighlightQuery}\n\t\t\t\t\t\t\t\t\t\t\tgetOptionDisabled={isOptionDisabled}\n\t\t\t\t\t\t\t\t\t\t\tgetOptionId={getOptionId}\n\t\t\t\t\t\t\t\t\t\t\tsetOptionRef={setOptionRef}\n\t\t\t\t\t\t\t\t\t\t\ttoggleOption={toggleDraftSelection}\n\t\t\t\t\t\t\t\t\t\t\tselectOnlyOption={selectOnlyOption}\n\t\t\t\t\t\t\t\t\t\t\trenderItem={itemRenderer}\n\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</MultiSelectOptionsWrapper>\n\t\t\t\t\t\t\t</PickerPopup>\n\t\t\t\t\t\t</>\n\t\t\t\t\t);\n\t\t\t\t}}\n\t\t\t</PickerField>\n\t\t);\n\t}\n);\n\nMultiSelect.displayName = \"MultiSelect\";\n","import { ODataCollectionModel, ODataSelectBaseProps } from \"@ryuzaki13/react-foundation-api/odata\";\nimport { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata\";\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 React from \"react\";\n\nimport { 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 const ODataMultiSelect: React.FC<ODataMultiSelectProps> = ({\n\todata,\n\tsegment,\n\tmodel: initialModel,\n\tlabel,\n\tdescription,\n\tdisabled,\n\tvalue,\n\tdependencies,\n\tonChange,\n\tsize\n}) => {\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\tdisabled={disabled || odataModel.isLoading}\n\t\t\tplaceholder={odataModel.placeholder}\n\t\t\terror={odataModel.isError ? \"Ошибка загрузки\" : undefined}\n\t\t/>\n\t);\n};\n","import { useCallback, useState } from \"react\";\n\nimport { ODataMultiSelect } from \"./ODataMultiSelect\";\n\nimport type { ODataDependentSegmentItem } from \"@ryuzaki13/react-foundation-api/odata\";\n\ninterface ODataDependentSegmentMultiSelectProps {\n\titem: ODataDependentSegmentItem;\n\t/**\n\t * Выбранные значения (управляемый компонент)\n\t */\n\tvalues?: Record<string, string[]>;\n\t/**\n\t * Обработчик изменения выбранных значений\n\t */\n\tonChange?: (selected: Record<string, string[]>) => void;\n\t/**\n\t * Ширина одного элемента в `em` единицах.\n\t *\n\t * @default 15\n\t */\n\twidth?: number;\n}\n\nexport const ODataDependentSegmentMultiSelect: React.FC<ODataDependentSegmentMultiSelectProps> = ({\n\titem,\n\tvalues,\n\tonChange,\n\twidth = 15\n}) => {\n\tconst [internalSelectedValues, setInternalSelectedValues] = useState<Record<string, string[]>>({});\n\tconst selectedValues = values ?? internalSelectedValues;\n\tconst widthStyle = `calc(${width}em + var(--width-add))`;\n\n\tconst handleSelectionChange = useCallback(\n\t\t(keys: string[]) => {\n\t\t\tconst nextSelectedValues = {\n\t\t\t\t...selectedValues,\n\t\t\t\t[item.id]: keys\n\t\t\t};\n\n\t\t\tif (!values) {\n\t\t\t\tsetInternalSelectedValues(nextSelectedValues);\n\t\t\t}\n\n\t\t\tonChange?.(nextSelectedValues);\n\t\t},\n\t\t[item.id, onChange, selectedValues, values]\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={selectedValues}\n\t\t\t\tvalue={selectedValues[item.id]}\n\t\t\t\tonChange={handleSelectionChange}\n\t\t\t/>\n\t\t</div>\n\t);\n};\n","import { useState } from \"react\";\n\nimport { flattenODataDependentServices, ODataDependentBaseProps } from \"@ryuzaki13/react-foundation-api/odata\";\n\nimport { ODataDependentSegmentMultiSelect } from \"./ODataDependentSegmentMultiSelect\";\n\ninterface ODataDependentMultiSelectProps extends ODataDependentBaseProps {\n\t/**\n\t * Выбранные значения (управляемый компонент)\n\t */\n\tvalues?: Record<string, string[]>;\n\n\t/**\n\t * Обработчик изменения выбранных значений\n\t */\n\tonChange?: (selected: Record<string, string[]>) => void;\n\n\t/**\n\t * Ширина одного элемента в `em` единицах.\n\t *\n\t * @default 15\n\t */\n\twidth?: number;\n}\n\nexport const ODataDependentMultiSelect: React.FC<ODataDependentMultiSelectProps> = ({\n\twidth = 15,\n\todata,\n\tsegments,\n\tmodel,\n\tvalues,\n\tonChange\n}) => {\n\tconst [internalSelectedValues, setInternalSelectedValues] = useState<Record<string, string[]>>({});\n\tconst selectedValues = values ?? internalSelectedValues;\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={selectedValues}\n\t\t\tonChange={(nextSelectedValues) => {\n\t\t\t\tif (!values) {\n\t\t\t\t\tsetInternalSelectedValues(nextSelectedValues);\n\t\t\t\t}\n\n\t\t\t\tonChange?.(nextSelectedValues);\n\t\t\t}}\n\t\t\twidth={width}\n\t\t/>\n\t));\n};\n","import { MultiSelect } from \"./MultiSelect\";\n\nimport type { UiBaseProps } from \"../../types\";\nimport type { CollectionItem } from \"@ryuzaki13/react-foundation-lib/odata\";\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,6 +1,6 @@
|
|
|
1
1
|
import { t as e } from "./ui.module-BisoTevy.js";
|
|
2
2
|
import { t } from "./grid-dI94AAbi.js";
|
|
3
|
-
import { i as n, l as r, s as i } from "./input-
|
|
3
|
+
import { i as n, l as r, s as i } from "./input-Bp6_Ucgr.js";
|
|
4
4
|
import { t as a } from "./separator-B72Aq-6a.js";
|
|
5
5
|
import { forwardRef as o, useEffect as s, useEffectEvent as c, useMemo as l, useRef as u, useState as d } from "react";
|
|
6
6
|
import { cn as f } from "@ryuzaki13/react-foundation-lib/utils";
|
|
@@ -239,7 +239,7 @@ function P(e) {
|
|
|
239
239
|
//#endregion
|
|
240
240
|
//#region src/picker/model/usePickerQuery.ts
|
|
241
241
|
function F({ open: e, query: t, defaultQuery: n, onQuery: r, resetOnClose: i, triggerMode: a }) {
|
|
242
|
-
let o = u(!1), l = t !== void 0, [f, p] = d(n ?? ""), m = l ? t ?? "" : f, h = c(() => p("")), g = i ?? (a
|
|
242
|
+
let o = u(!1), l = t !== void 0, [f, p] = d(n ?? ""), m = l ? t ?? "" : f, h = c(() => p("")), g = i ?? (!a || A(a).resetQueryOnClose);
|
|
243
243
|
s(() => {
|
|
244
244
|
o.current && !e && g && (l || h(), r?.("")), o.current = e;
|
|
245
245
|
}, [
|
|
@@ -347,4 +347,4 @@ function R({ mode: e, open: t, currentQuery: n, hasDisplayValue: r, inputRef: i,
|
|
|
347
347
|
//#endregion
|
|
348
348
|
export { N as a, k as c, E as d, T as f, P as i, O as l, I as n, j as o, S as p, F as r, A as s, R as t, D as u };
|
|
349
349
|
|
|
350
|
-
//# sourceMappingURL=picker-
|
|
350
|
+
//# sourceMappingURL=picker-e6IsrMUG.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"picker-BAQ9NeHe.js","names":[],"sources":["../../src/picker/PickerField.tsx","../../src/picker/Picker.module.scss","../../src/picker/PickerPopup.tsx","../../src/picker/PickerSelectionToolbar.tsx","../../src/picker/PickerStatus.tsx","../../src/picker/PickerTriggerActions.tsx","../../src/picker/PickerTriggerInput.tsx","../../src/picker/model/createPickerTriggerPolicy.ts","../../src/picker/model/extractPickerTextContent.ts","../../src/picker/model/usePickerDefaultFilter.ts","../../src/picker/model/usePickerFloatingListbox.ts","../../src/picker/model/usePickerQuery.ts","../../src/picker/model/usePickerSelectionLifecycle.ts","../../src/picker/model/usePickerTriggerController.ts"],"sourcesContent":["import { InputType } from \"@ryuzaki13/react-foundation-lib/types\";\n\nimport { InputUI } from \"../input\";\nimport { useInputFieldIds } from \"../input/lib/useInputFieldIds\";\n\nimport { PickerFieldProps } from \"./types\";\n\nexport function PickerField<TValue extends InputType>({\n\tid,\n\tlabel,\n\tdescription,\n\tdisabled,\n\tsize,\n\tclassName,\n\terror,\n\tchildren\n}: PickerFieldProps<TValue>) {\n\tconst { controlId, labelId, descriptionId, errorId, describedBy } = useInputFieldIds({\n\t\tid,\n\t\thasLabel: label !== undefined && label !== null,\n\t\thasDescription: !!description,\n\t\thasError: !!error\n\t});\n\n\treturn (\n\t\t<InputUI\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tdisabled={disabled}\n\t\t\tsize={size}\n\t\t\tclassName={className}\n\t\t\terror={error}\n\t\t\tcontrolId={controlId}\n\t\t\tlabelId={labelId}\n\t\t\tdescriptionId={descriptionId}\n\t\t\terrorId={errorId}>\n\t\t\t{children({ controlId, labelId, descriptionId, errorId, describedBy })}\n\t\t</InputUI>\n\t);\n}\n",".popupLayout {\n\tdisplay: grid;\n\tgrid-template-rows: auto 1fr;\n\tmin-height: 0;\n\tmax-height: 75vh;\n\toverflow: hidden;\n\n\tflex: 1 1 auto;\n}\n\n.popupBody {\n\tmin-height: 0;\n}\n\n.status {\n\tpadding: var(--space-xs) var(--space-sm);\n\tcolor: var(--content-2);\n}\n\n.statusError {\n\tcolor: var(--status-error-text);\n}\n\n.triggerContainer {\n\tposition: relative;\n}\n\n.selectionActionButton {\n\tpadding-block: var(--space-xs);\n\tborder-radius: var(--radius-sm);\n\n\t&:hover {\n\t\tbackground-color: var(--surface-2);\n\t}\n}\n","import { type CSSProperties, type KeyboardEvent, type MouseEvent, type ReactNode } from \"react\";\n\nimport { FloatingContext, FloatingFocusManager, FloatingPortal } from \"@floating-ui/react\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { AnimatePresence, motion } from \"motion/react\";\n\nimport { Separator } from \"../separator\";\n\nimport styles from \"./Picker.module.scss\";\n\ninterface PickerPopupProps {\n\topen: boolean;\n\tcontext: FloatingContext;\n\tfloatingStyles: CSSProperties;\n\tlistId: string;\n\tlabelId?: string;\n\tpopupAriaLabel?: string;\n\tdescriptionId?: string;\n\tactiveOptionId?: string;\n\tariaMultiselectable?: boolean;\n\tpopupRole?: \"listbox\" | \"dialog\";\n\tsetFloating: (node: HTMLElement | null) => void;\n\tgetFloatingProps: (userProps?: Record<string, unknown>) => Record<string, unknown>;\n\tonKeyDown: (event: KeyboardEvent<HTMLElement>) => void;\n\tinitialFocus?: number;\n\treturnFocus?: boolean;\n\ttabIndex?: number;\n\tclassName?: string;\n\tmaxWidth?: CSSProperties[\"maxWidth\"];\n\tlayoutClassName?: string;\n\theaderClassName?: string;\n\tbodyClassName?: string;\n\theader?: ReactNode;\n\tchildren: ReactNode;\n}\n\nfunction stopNestedFloatingMouseDown(event: MouseEvent<HTMLElement>): void {\n\tevent.stopPropagation();\n}\n\nexport function PickerPopup({\n\topen,\n\tcontext,\n\tfloatingStyles,\n\tlistId,\n\tlabelId,\n\tpopupAriaLabel,\n\tdescriptionId,\n\tactiveOptionId,\n\tariaMultiselectable,\n\tpopupRole = \"listbox\",\n\tsetFloating,\n\tgetFloatingProps,\n\tonKeyDown,\n\tinitialFocus = -1,\n\treturnFocus = false,\n\ttabIndex = 0,\n\tclassName,\n\tmaxWidth,\n\tlayoutClassName,\n\theaderClassName,\n\tbodyClassName,\n\theader,\n\tchildren\n}: PickerPopupProps) {\n\treturn (\n\t\t<AnimatePresence>\n\t\t\t{open && (\n\t\t\t\t<FloatingPortal>\n\t\t\t\t\t<FloatingFocusManager context={context} modal={false} initialFocus={initialFocus} returnFocus={returnFocus}>\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\tref={setFloating}\n\t\t\t\t\t\t\tstyle={{ ...floatingStyles, maxWidth }}\n\t\t\t\t\t\t\tinitial={{ opacity: 0, scale: 0.95 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1, scale: 1 }}\n\t\t\t\t\t\t\texit={{ opacity: 0, scale: 0.95 }}\n\t\t\t\t\t\t\t{...getFloatingProps({\n\t\t\t\t\t\t\t\tid: listId,\n\t\t\t\t\t\t\t\trole: popupRole,\n\t\t\t\t\t\t\t\ttabIndex,\n\t\t\t\t\t\t\t\t\"aria-labelledby\": labelId,\n\t\t\t\t\t\t\t\t\"aria-label\": labelId ? undefined : popupAriaLabel,\n\t\t\t\t\t\t\t\t\"aria-describedby\": descriptionId,\n\t\t\t\t\t\t\t\t\"aria-activedescendant\": activeOptionId,\n\t\t\t\t\t\t\t\t\"aria-multiselectable\": ariaMultiselectable || undefined,\n\t\t\t\t\t\t\t\tonMouseDown: stopNestedFloatingMouseDown,\n\t\t\t\t\t\t\t\tonKeyDown,\n\t\t\t\t\t\t\t\tclassName\n\t\t\t\t\t\t\t})}>\n\t\t\t\t\t\t\t<div className={cn(styles.popupLayout, layoutClassName)}>\n\t\t\t\t\t\t\t\t{header ? (\n\t\t\t\t\t\t\t\t\t<div className={headerClassName}>\n\t\t\t\t\t\t\t\t\t\t{header}\n\t\t\t\t\t\t\t\t\t\t<Separator className=\"marginBlockSm\" />\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<div />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t<div className={cn(styles.popupBody, bodyClassName)}>{children}</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t</FloatingFocusManager>\n\t\t\t\t</FloatingPortal>\n\t\t\t)}\n\t\t</AnimatePresence>\n\t);\n}\n","import { type Ref } from \"react\";\n\nimport { Grid } from \"../grid\";\n\nimport styles from \"./Picker.module.scss\";\n\ntype PickerSelectionToolbarProps = {\n\tonSelectAll: () => void;\n\tonDeselectAll: () => void;\n\tselectAllButtonRef?: Ref<HTMLButtonElement>;\n};\n\n/**\n * Общая панель массовых действий для picker-компонентов с множественным выбором.\n * Компонент не знает формат значения и делегирует изменение владельцу selection-модели.\n */\nexport function PickerSelectionToolbar({ onSelectAll, onDeselectAll, selectAllButtonRef }: PickerSelectionToolbarProps) {\n\treturn (\n\t\t<Grid.Container gap=\"xs\" templateColumns=\"1fr 1fr\">\n\t\t\t<button\n\t\t\t\tref={selectAllButtonRef}\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={styles.selectionActionButton}\n\t\t\t\tonClick={onSelectAll}\n\t\t\t\tdata-ui=\"picker-select-all\"\n\t\t\t\tdata-action=\"select-all\">\n\t\t\t\tВыбрать все\n\t\t\t</button>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={styles.selectionActionButton}\n\t\t\t\tonClick={onDeselectAll}\n\t\t\t\tdata-ui=\"picker-deselect-all\"\n\t\t\t\tdata-action=\"deselect-all\">\n\t\t\t\tСнять выбор\n\t\t\t</button>\n\t\t</Grid.Container>\n\t);\n}\n","import { ReactNode } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport uiStyles from \"../ui.module.scss\";\n\nimport styles from \"./Picker.module.scss\";\n\ninterface PickerStatusProps {\n\temptyState?: ReactNode;\n\tloadingState?: ReactNode;\n\terrorState?: ReactNode;\n}\n\nexport function PickerStatus({ emptyState, loadingState, errorState }: PickerStatusProps) {\n\tconst content = errorState ?? loadingState ?? emptyState;\n\n\tif (content === undefined || content === null) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<div className={cn(uiStyles.uiPopupOption, styles.status, errorState !== undefined && styles.statusError)} aria-disabled={true}>\n\t\t\t{content}\n\t\t</div>\n\t);\n}\n","import { MouseEvent, ReactNode } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { ChevronDownIcon } from \"lucide-react\";\n\nimport uiStyles from \"../ui.module.scss\";\n\ninterface PickerTriggerActionsProps {\n\topen: boolean;\n\tdisabled?: boolean;\n\tchildren?: ReactNode;\n\tonToggleMouseDown?: (event: MouseEvent<HTMLButtonElement>) => void;\n\tonToggleClick: () => void;\n\topenAriaLabel?: string;\n\tcloseAriaLabel?: string;\n}\n\nexport function PickerTriggerActions({\n\topen,\n\tdisabled,\n\tchildren,\n\tonToggleMouseDown,\n\tonToggleClick,\n\topenAriaLabel = \"Открыть список\",\n\tcloseAriaLabel = \"Закрыть список\"\n}: PickerTriggerActionsProps) {\n\treturn (\n\t\t<div className={uiStyles.uiToggleButtonContainer} data-disabled={disabled || undefined}>\n\t\t\t{children}\n\n\t\t\t<div className={uiStyles.uiButtonSeparator} />\n\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\taria-label={open ? closeAriaLabel : openAriaLabel}\n\t\t\t\tclassName={uiStyles.uiToggleButton}\n\t\t\t\tonMouseDown={onToggleMouseDown}\n\t\t\t\tonClick={onToggleClick}>\n\t\t\t\t<ChevronDownIcon className={cn(uiStyles.uiToggleIcon, open && uiStyles.uiToggleIconOpen)} />\n\t\t\t</button>\n\t\t</div>\n\t);\n}\n","import { ComponentPropsWithoutRef, forwardRef, ReactNode } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { InputControl } from \"../input\";\nimport uiStyles from \"../ui.module.scss\";\n\nimport styles from \"./Picker.module.scss\";\n\ninterface PickerTriggerInputProps extends Omit<ComponentPropsWithoutRef<\"input\">, \"size\"> {\n\trootRef?: (node: HTMLDivElement | null) => void;\n\tendAdornment?: ReactNode;\n\toverlay?: ReactNode;\n\trootClassName?: string;\n\tinputClassName?: string;\n}\n\nexport const PickerTriggerInput = forwardRef<HTMLInputElement, PickerTriggerInputProps>(\n\t({ rootRef, endAdornment, overlay, rootClassName, inputClassName, ...props }, ref) => {\n\t\treturn (\n\t\t\t<div ref={rootRef} className={cn(uiStyles.uiInputContainer, styles.triggerContainer, rootClassName)}>\n\t\t\t\t<InputControl endAdornment={endAdornment}>\n\t\t\t\t\t{({ controlClassName }) => (\n\t\t\t\t\t\t<input {...props} ref={ref} className={cn(uiStyles.uiInputWithToggle, controlClassName, inputClassName)} />\n\t\t\t\t\t)}\n\t\t\t\t</InputControl>\n\t\t\t\t{overlay}\n\t\t\t</div>\n\t\t);\n\t}\n);\n\nPickerTriggerInput.displayName = \"PickerTriggerInput\";\n","export type PickerTriggerMode = \"display\" | \"search-single\" | \"search-multi\";\n\ninterface PickerTriggerTextFocusParams {\n\topen: boolean;\n\tcurrentQuery: string;\n\thasDisplayValue: boolean;\n}\n\nexport interface PickerTriggerPolicy {\n\tfocusFloatingOnOpen: boolean;\n\trestoreFocusOnClose: boolean;\n\tresetQueryOnClose: boolean;\n\tshouldOpenOnTriggerClick: (open: boolean) => boolean;\n\tshouldOpenOnInputChange: (open: boolean) => boolean;\n\tshouldFocusReferenceOnToggle: (open: boolean) => boolean;\n\tshouldSelectTriggerTextOnFocus: (params: PickerTriggerTextFocusParams) => boolean;\n}\n\n/**\n * Единая политика поведения trigger-input для picker-компонентов.\n * Нормализует различия между display-режимом, single-search и multi-search.\n */\nexport function createPickerTriggerPolicy(mode: PickerTriggerMode): PickerTriggerPolicy {\n\tswitch (mode) {\n\t\tcase \"search-single\":\n\t\t\treturn {\n\t\t\t\tfocusFloatingOnOpen: false,\n\t\t\t\trestoreFocusOnClose: false,\n\t\t\t\tresetQueryOnClose: true,\n\t\t\t\tshouldOpenOnTriggerClick: () => false,\n\t\t\t\tshouldOpenOnInputChange: (open) => !open,\n\t\t\t\tshouldFocusReferenceOnToggle: (open) => !open,\n\t\t\t\tshouldSelectTriggerTextOnFocus: ({ open, currentQuery, hasDisplayValue }) =>\n\t\t\t\t\t!open && currentQuery.length === 0 && hasDisplayValue\n\t\t\t};\n\t\tcase \"search-multi\":\n\t\t\treturn {\n\t\t\t\tfocusFloatingOnOpen: false,\n\t\t\t\trestoreFocusOnClose: false,\n\t\t\t\tresetQueryOnClose: true,\n\t\t\t\tshouldOpenOnTriggerClick: () => false,\n\t\t\t\tshouldOpenOnInputChange: (open) => !open,\n\t\t\t\tshouldFocusReferenceOnToggle: (open) => !open,\n\t\t\t\tshouldSelectTriggerTextOnFocus: () => false\n\t\t\t};\n\t\tcase \"display\":\n\t\tdefault:\n\t\t\treturn {\n\t\t\t\tfocusFloatingOnOpen: true,\n\t\t\t\trestoreFocusOnClose: true,\n\t\t\t\tresetQueryOnClose: false,\n\t\t\t\tshouldOpenOnTriggerClick: (open) => !open,\n\t\t\t\tshouldOpenOnInputChange: () => false,\n\t\t\t\tshouldFocusReferenceOnToggle: () => false,\n\t\t\t\tshouldSelectTriggerTextOnFocus: () => false\n\t\t\t};\n\t}\n}\n","import { ReactNode } from \"react\";\n\nexport function extractPickerTextContent(node: ReactNode): string | undefined {\n\tif (typeof node === \"string\" || typeof node === \"number\") {\n\t\treturn String(node);\n\t}\n\n\tif (Array.isArray(node)) {\n\t\tconst values = node.map(extractPickerTextContent).filter((value): value is string => Boolean(value));\n\t\treturn values.length ? values.join(\" \") : undefined;\n\t}\n\n\treturn undefined;\n}\n","import { useMemo } from \"react\";\n\nimport { normalizeTextToLower } from \"@ryuzaki13/react-foundation-lib/formatters\";\n\ninterface UsePickerDefaultFilterOptions<T> {\n\toptions: readonly T[];\n\tquery: string;\n\tenabled?: boolean;\n\tgetSearchText: (option: T) => unknown;\n}\n\nfunction normalizeSearchText(value: unknown) {\n\tconst parts = Array.isArray(value) ? value : [value];\n\n\treturn normalizeTextToLower(parts.filter(Boolean).join(\" \"));\n}\n\nexport function usePickerDefaultFilter<T>({ options, query, enabled = true, getSearchText }: UsePickerDefaultFilterOptions<T>) {\n\tconst normalizedQuery = normalizeTextToLower(query);\n\n\treturn useMemo(() => {\n\t\tif (!enabled || !normalizedQuery) {\n\t\t\treturn [...options];\n\t\t}\n\n\t\treturn options.filter((option) => normalizeSearchText(getSearchText(option)).includes(normalizedQuery));\n\t}, [enabled, getSearchText, normalizedQuery, options]);\n}\n","import { Placement } from \"@floating-ui/react\";\nimport {\n\ttype FloatingListboxPlacementStrategy,\n\ttype FloatingListboxSizeResolver,\n\tuseFloatingListbox\n} from \"@ryuzaki13/react-foundation-lib/hooks\";\n\nimport { PickerTriggerMode, createPickerTriggerPolicy } from \"./createPickerTriggerPolicy\";\n\ninterface UsePickerFloatingListboxParams<T> {\n\toptions: readonly T[];\n\tselectedIndex: number;\n\topen?: boolean;\n\tonOpenChange?: (open: boolean) => void;\n\tgetOptionDisabled?: (option: T) => boolean;\n\tonSelect?: (option: T) => void;\n\tdisabled?: boolean;\n\tplacement?: Placement;\n\tplacementStrategy?: FloatingListboxPlacementStrategy;\n\tcloseOnSelect?: boolean;\n\tfocusFloatingOnOpen?: boolean;\n\tallowOpenWithoutOptions?: boolean;\n\trestoreFocusOnClose?: boolean;\n\ttriggerMode?: PickerTriggerMode;\n\tresolveFloatingSize?: FloatingListboxSizeResolver;\n}\n\n/**\n * Единая точка входа для popup/listbox поведения во всех picker-компонентах.\n */\nexport function usePickerFloatingListbox<T>(params: UsePickerFloatingListboxParams<T>) {\n\tconst triggerPolicy = params.triggerMode ? createPickerTriggerPolicy(params.triggerMode) : undefined;\n\n\treturn useFloatingListbox({\n\t\t...params,\n\t\tfocusFloatingOnOpen: params.focusFloatingOnOpen ?? triggerPolicy?.focusFloatingOnOpen,\n\t\trestoreFocusOnClose: params.restoreFocusOnClose ?? triggerPolicy?.restoreFocusOnClose\n\t});\n}\n","import { useEffect, useEffectEvent, useRef, useState } from \"react\";\n\nimport { PickerTriggerMode, createPickerTriggerPolicy } from \"./createPickerTriggerPolicy\";\n\ninterface UsePickerQueryOptions {\n\topen: boolean;\n\tquery?: string;\n\tdefaultQuery?: string;\n\tonQuery?: (value: string) => void;\n\tresetOnClose?: boolean;\n\ttriggerMode?: PickerTriggerMode;\n}\n\nexport function usePickerQuery({ open, query, defaultQuery, onQuery, resetOnClose, triggerMode }: UsePickerQueryOptions) {\n\tconst previousOpenRef = useRef(false);\n\tconst isControlled = query !== undefined;\n\tconst [internalQuery, setInternalQuery] = useState(defaultQuery ?? \"\");\n\tconst currentQuery = isControlled ? (query ?? \"\") : internalQuery;\n\tconst syncResetInternalQuery = useEffectEvent(() => setInternalQuery(\"\"));\n\tconst resolvedResetOnClose = resetOnClose ?? (triggerMode ? createPickerTriggerPolicy(triggerMode).resetQueryOnClose : true);\n\n\tuseEffect(() => {\n\t\tif (previousOpenRef.current && !open && resolvedResetOnClose) {\n\t\t\tif (!isControlled) {\n\t\t\t\tsyncResetInternalQuery();\n\t\t\t}\n\n\t\t\tonQuery?.(\"\");\n\t\t}\n\n\t\tpreviousOpenRef.current = open;\n\t}, [isControlled, onQuery, open, resolvedResetOnClose]);\n\n\tconst setQuery = (nextValue: string) => {\n\t\tif (!isControlled) {\n\t\t\tsetInternalQuery(nextValue);\n\t\t}\n\n\t\tonQuery?.(nextValue);\n\t};\n\n\treturn {\n\t\tquery: currentQuery,\n\t\tsetQuery,\n\t\tclearQuery: () => setQuery(\"\")\n\t};\n}\n","import { useEffect, useEffectEvent, useRef, useState } from \"react\";\n\ninterface UsePickerSelectionLifecycleOptions<TValue> {\n\tvalue: TValue;\n\topen: boolean;\n\tonCommit: (value: TValue) => void;\n\tonOpen?: () => void;\n\tonClose?: (value: TValue) => void;\n\tisEqual: (left: TValue, right: TValue) => boolean;\n}\n\n/**\n * Общий жизненный цикл чернового выбора для picker-компонентов,\n * где изменения подтверждаются при закрытии popup.\n */\nexport function usePickerSelectionLifecycle<TValue>({\n\tvalue,\n\topen,\n\tonCommit,\n\tonOpen,\n\tonClose,\n\tisEqual\n}: UsePickerSelectionLifecycleOptions<TValue>) {\n\tconst previousOpenRef = useRef(false);\n\tconst [draftValue, setDraftValue] = useState(value);\n\tconst syncDraftValue = useEffectEvent((value: TValue) => setDraftValue(value));\n\n\tuseEffect(() => {\n\t\tif (!open) {\n\t\t\tsyncDraftValue(value);\n\t\t}\n\t}, [open, value]);\n\n\tuseEffect(() => {\n\t\tif (previousOpenRef.current && !open) {\n\t\t\tif (!isEqual(draftValue, value)) {\n\t\t\t\tonCommit(draftValue);\n\t\t\t}\n\n\t\t\tonClose?.(draftValue);\n\t\t}\n\n\t\tpreviousOpenRef.current = open;\n\t}, [draftValue, isEqual, onClose, onCommit, open, value]);\n\n\tconst prepareOpen = () => {\n\t\tsetDraftValue(value);\n\t\tonOpen?.();\n\t};\n\n\treturn {\n\t\tdraftValue,\n\t\tsetDraftValue,\n\t\tprepareOpen\n\t};\n}\n","import { MouseEvent, RefObject } from \"react\";\n\nimport { PickerTriggerMode, createPickerTriggerPolicy } from \"./createPickerTriggerPolicy\";\n\ninterface UsePickerTriggerControllerOptions {\n\tmode: PickerTriggerMode;\n\topen: boolean;\n\tcurrentQuery: string;\n\thasDisplayValue: boolean;\n\tinputRef: RefObject<HTMLInputElement | null>;\n\tsetQuery?: (value: string) => void;\n\topenList?: () => void;\n\tclose?: () => void;\n\ttoggleOpen?: () => void;\n\tonBeforeOpen?: () => void;\n}\n\ninterface HandleTriggerKeyDownOptions {\n\tevent: React.KeyboardEvent<HTMLElement>;\n\tonActivateWhenOpen?: () => void;\n\tenableSpaceActivation?: boolean;\n\tenableClosedArrowDownOpen?: boolean;\n\tsuppressClosedArrowUp?: boolean;\n}\n\nfunction focusInput(inputRef: RefObject<HTMLInputElement | null>) {\n\trequestAnimationFrame(() => {\n\t\tinputRef.current?.focus();\n\t});\n}\n\n/**\n * Единый контроллер пользовательских действий на trigger-input.\n * Держит поведение display/search-single/search-multi в одном месте.\n */\nexport function usePickerTriggerController({\n\tmode,\n\topen,\n\tcurrentQuery,\n\thasDisplayValue,\n\tinputRef,\n\tsetQuery,\n\topenList,\n\tclose,\n\ttoggleOpen,\n\tonBeforeOpen\n}: UsePickerTriggerControllerOptions) {\n\tconst policy = createPickerTriggerPolicy(mode);\n\n\tconst openTrigger = () => {\n\t\tonBeforeOpen?.();\n\n\t\tif (openList) {\n\t\t\topenList();\n\t\t\treturn;\n\t\t}\n\n\t\ttoggleOpen?.();\n\t};\n\n\tconst closeTrigger = () => {\n\t\tif (close) {\n\t\t\tclose();\n\t\t\treturn;\n\t\t}\n\n\t\ttoggleOpen?.();\n\t};\n\n\tconst toggleTrigger = () => {\n\t\tif (open) {\n\t\t\tcloseTrigger();\n\t\t} else {\n\t\t\topenTrigger();\n\t\t}\n\n\t\tif (policy.shouldFocusReferenceOnToggle(open)) {\n\t\t\tfocusInput(inputRef);\n\t\t}\n\t};\n\n\treturn {\n\t\tpolicy,\n\t\thandleTriggerInputChange: (nextValue: string) => {\n\t\t\tsetQuery?.(nextValue);\n\n\t\t\tif (policy.shouldOpenOnInputChange(open)) {\n\t\t\t\topenTrigger();\n\t\t\t}\n\t\t},\n\t\thandleTriggerClick: () => {\n\t\t\tif (policy.shouldOpenOnTriggerClick(open)) {\n\t\t\t\topenTrigger();\n\t\t\t}\n\t\t},\n\t\thandleTriggerFocus: (input: HTMLInputElement) => {\n\t\t\tif (\n\t\t\t\tpolicy.shouldSelectTriggerTextOnFocus({\n\t\t\t\t\topen,\n\t\t\t\t\tcurrentQuery,\n\t\t\t\t\thasDisplayValue\n\t\t\t\t})\n\t\t\t) {\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tinput.select();\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\thandleToggleMouseDown: (event: MouseEvent<HTMLButtonElement>) => {\n\t\t\tevent.preventDefault();\n\t\t},\n\t\thandleToggleClick: () => {\n\t\t\ttoggleTrigger();\n\t\t},\n\t\thandleTriggerKeyDown: ({\n\t\t\tevent,\n\t\t\tonActivateWhenOpen,\n\t\t\tenableSpaceActivation = false,\n\t\t\tenableClosedArrowDownOpen = false,\n\t\t\tsuppressClosedArrowUp = false\n\t\t}: HandleTriggerKeyDownOptions) => {\n\t\t\tif (!open && suppressClosedArrowUp && event.key === \"ArrowUp\") {\n\t\t\t\tevent.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!open && enableClosedArrowDownOpen && event.key === \"ArrowDown\") {\n\t\t\t\tevent.preventDefault();\n\t\t\t\ttoggleTrigger();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (event.key === \"Enter\") {\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\tif (open) {\n\t\t\t\t\tonActivateWhenOpen?.();\n\t\t\t\t} else {\n\t\t\t\t\ttoggleTrigger();\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (enableSpaceActivation && event.key === \" \") {\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\tif (open) {\n\t\t\t\t\tonActivateWhenOpen?.();\n\t\t\t\t} else {\n\t\t\t\t\ttoggleTrigger();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\ttoggleTrigger\n\t};\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"picker-e6IsrMUG.js","names":[],"sources":["../../src/picker/PickerField.tsx","../../src/picker/Picker.module.scss","../../src/picker/PickerPopup.tsx","../../src/picker/PickerSelectionToolbar.tsx","../../src/picker/PickerStatus.tsx","../../src/picker/PickerTriggerActions.tsx","../../src/picker/PickerTriggerInput.tsx","../../src/picker/model/createPickerTriggerPolicy.ts","../../src/picker/model/extractPickerTextContent.ts","../../src/picker/model/usePickerDefaultFilter.ts","../../src/picker/model/usePickerFloatingListbox.ts","../../src/picker/model/usePickerQuery.ts","../../src/picker/model/usePickerSelectionLifecycle.ts","../../src/picker/model/usePickerTriggerController.ts"],"sourcesContent":["import { InputType } from \"@ryuzaki13/react-foundation-lib/types\";\n\nimport { InputUI } from \"../input\";\nimport { useInputFieldIds } from \"../input/lib/useInputFieldIds\";\n\nimport { PickerFieldProps } from \"./types\";\n\nexport function PickerField<TValue extends InputType>({\n\tid,\n\tlabel,\n\tdescription,\n\tdisabled,\n\tsize,\n\tclassName,\n\terror,\n\tchildren\n}: PickerFieldProps<TValue>) {\n\tconst { controlId, labelId, descriptionId, errorId, describedBy } = useInputFieldIds({\n\t\tid,\n\t\thasLabel: label !== undefined && label !== null,\n\t\thasDescription: !!description,\n\t\thasError: !!error\n\t});\n\n\treturn (\n\t\t<InputUI\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tdisabled={disabled}\n\t\t\tsize={size}\n\t\t\tclassName={className}\n\t\t\terror={error}\n\t\t\tcontrolId={controlId}\n\t\t\tlabelId={labelId}\n\t\t\tdescriptionId={descriptionId}\n\t\t\terrorId={errorId}>\n\t\t\t{children({ controlId, labelId, descriptionId, errorId, describedBy })}\n\t\t</InputUI>\n\t);\n}\n",".popupLayout {\n\tdisplay: grid;\n\tgrid-template-rows: auto 1fr;\n\tmin-height: 0;\n\tmax-height: 75vh;\n\toverflow: hidden;\n\n\tflex: 1 1 auto;\n}\n\n.popupBody {\n\tmin-height: 0;\n}\n\n.status {\n\tpadding: var(--space-xs) var(--space-sm);\n\tcolor: var(--content-2);\n}\n\n.statusError {\n\tcolor: var(--status-error-text);\n}\n\n.triggerContainer {\n\tposition: relative;\n}\n\n.selectionActionButton {\n\tpadding-block: var(--space-xs);\n\tborder-radius: var(--radius-sm);\n\n\t&:hover {\n\t\tbackground-color: var(--surface-2);\n\t}\n}\n","import { type CSSProperties, type KeyboardEvent, type MouseEvent, type ReactNode } from \"react\";\n\nimport { FloatingContext, FloatingFocusManager, FloatingPortal } from \"@floating-ui/react\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { AnimatePresence, motion } from \"motion/react\";\n\nimport { Separator } from \"../separator\";\n\nimport styles from \"./Picker.module.scss\";\n\ninterface PickerPopupProps {\n\topen: boolean;\n\tcontext: FloatingContext;\n\tfloatingStyles: CSSProperties;\n\tlistId: string;\n\tlabelId?: string;\n\tpopupAriaLabel?: string;\n\tdescriptionId?: string;\n\tactiveOptionId?: string;\n\tariaMultiselectable?: boolean;\n\tpopupRole?: \"listbox\" | \"dialog\";\n\tsetFloating: (node: HTMLElement | null) => void;\n\tgetFloatingProps: (userProps?: Record<string, unknown>) => Record<string, unknown>;\n\tonKeyDown: (event: KeyboardEvent<HTMLElement>) => void;\n\tinitialFocus?: number;\n\treturnFocus?: boolean;\n\ttabIndex?: number;\n\tclassName?: string;\n\tmaxWidth?: CSSProperties[\"maxWidth\"];\n\tlayoutClassName?: string;\n\theaderClassName?: string;\n\tbodyClassName?: string;\n\theader?: ReactNode;\n\tchildren: ReactNode;\n}\n\nfunction stopNestedFloatingMouseDown(event: MouseEvent<HTMLElement>): void {\n\tevent.stopPropagation();\n}\n\nexport function PickerPopup({\n\topen,\n\tcontext,\n\tfloatingStyles,\n\tlistId,\n\tlabelId,\n\tpopupAriaLabel,\n\tdescriptionId,\n\tactiveOptionId,\n\tariaMultiselectable,\n\tpopupRole = \"listbox\",\n\tsetFloating,\n\tgetFloatingProps,\n\tonKeyDown,\n\tinitialFocus = -1,\n\treturnFocus = false,\n\ttabIndex = 0,\n\tclassName,\n\tmaxWidth,\n\tlayoutClassName,\n\theaderClassName,\n\tbodyClassName,\n\theader,\n\tchildren\n}: PickerPopupProps) {\n\treturn (\n\t\t<AnimatePresence>\n\t\t\t{open && (\n\t\t\t\t<FloatingPortal>\n\t\t\t\t\t<FloatingFocusManager context={context} modal={false} initialFocus={initialFocus} returnFocus={returnFocus}>\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\tref={setFloating}\n\t\t\t\t\t\t\tstyle={{ ...floatingStyles, maxWidth }}\n\t\t\t\t\t\t\tinitial={{ opacity: 0, scale: 0.95 }}\n\t\t\t\t\t\t\tanimate={{ opacity: 1, scale: 1 }}\n\t\t\t\t\t\t\texit={{ opacity: 0, scale: 0.95 }}\n\t\t\t\t\t\t\t{...getFloatingProps({\n\t\t\t\t\t\t\t\tid: listId,\n\t\t\t\t\t\t\t\trole: popupRole,\n\t\t\t\t\t\t\t\ttabIndex,\n\t\t\t\t\t\t\t\t\"aria-labelledby\": labelId,\n\t\t\t\t\t\t\t\t\"aria-label\": labelId ? undefined : popupAriaLabel,\n\t\t\t\t\t\t\t\t\"aria-describedby\": descriptionId,\n\t\t\t\t\t\t\t\t\"aria-activedescendant\": activeOptionId,\n\t\t\t\t\t\t\t\t\"aria-multiselectable\": ariaMultiselectable || undefined,\n\t\t\t\t\t\t\t\tonMouseDown: stopNestedFloatingMouseDown,\n\t\t\t\t\t\t\t\tonKeyDown,\n\t\t\t\t\t\t\t\tclassName\n\t\t\t\t\t\t\t})}>\n\t\t\t\t\t\t\t<div className={cn(styles.popupLayout, layoutClassName)}>\n\t\t\t\t\t\t\t\t{header ? (\n\t\t\t\t\t\t\t\t\t<div className={headerClassName}>\n\t\t\t\t\t\t\t\t\t\t{header}\n\t\t\t\t\t\t\t\t\t\t<Separator className=\"marginBlockSm\" />\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<div />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t<div className={cn(styles.popupBody, bodyClassName)}>{children}</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t</FloatingFocusManager>\n\t\t\t\t</FloatingPortal>\n\t\t\t)}\n\t\t</AnimatePresence>\n\t);\n}\n","import { type Ref } from \"react\";\n\nimport { Grid } from \"../grid\";\n\nimport styles from \"./Picker.module.scss\";\n\ntype PickerSelectionToolbarProps = {\n\tonSelectAll: () => void;\n\tonDeselectAll: () => void;\n\tselectAllButtonRef?: Ref<HTMLButtonElement>;\n};\n\n/**\n * Общая панель массовых действий для picker-компонентов с множественным выбором.\n * Компонент не знает формат значения и делегирует изменение владельцу selection-модели.\n */\nexport function PickerSelectionToolbar({ onSelectAll, onDeselectAll, selectAllButtonRef }: PickerSelectionToolbarProps) {\n\treturn (\n\t\t<Grid.Container gap=\"xs\" templateColumns=\"1fr 1fr\">\n\t\t\t<button\n\t\t\t\tref={selectAllButtonRef}\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={styles.selectionActionButton}\n\t\t\t\tonClick={onSelectAll}\n\t\t\t\tdata-ui=\"picker-select-all\"\n\t\t\t\tdata-action=\"select-all\">\n\t\t\t\tВыбрать все\n\t\t\t</button>\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\tclassName={styles.selectionActionButton}\n\t\t\t\tonClick={onDeselectAll}\n\t\t\t\tdata-ui=\"picker-deselect-all\"\n\t\t\t\tdata-action=\"deselect-all\">\n\t\t\t\tСнять выбор\n\t\t\t</button>\n\t\t</Grid.Container>\n\t);\n}\n","import { ReactNode } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport uiStyles from \"../ui.module.scss\";\n\nimport styles from \"./Picker.module.scss\";\n\ninterface PickerStatusProps {\n\temptyState?: ReactNode;\n\tloadingState?: ReactNode;\n\terrorState?: ReactNode;\n}\n\nexport function PickerStatus({ emptyState, loadingState, errorState }: PickerStatusProps) {\n\tconst content = errorState ?? loadingState ?? emptyState;\n\n\tif (content === undefined || content === null) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<div className={cn(uiStyles.uiPopupOption, styles.status, errorState !== undefined && styles.statusError)} aria-disabled={true}>\n\t\t\t{content}\n\t\t</div>\n\t);\n}\n","import { MouseEvent, ReactNode } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { ChevronDownIcon } from \"lucide-react\";\n\nimport uiStyles from \"../ui.module.scss\";\n\ninterface PickerTriggerActionsProps {\n\topen: boolean;\n\tdisabled?: boolean;\n\tchildren?: ReactNode;\n\tonToggleMouseDown?: (event: MouseEvent<HTMLButtonElement>) => void;\n\tonToggleClick: () => void;\n\topenAriaLabel?: string;\n\tcloseAriaLabel?: string;\n}\n\nexport function PickerTriggerActions({\n\topen,\n\tdisabled,\n\tchildren,\n\tonToggleMouseDown,\n\tonToggleClick,\n\topenAriaLabel = \"Открыть список\",\n\tcloseAriaLabel = \"Закрыть список\"\n}: PickerTriggerActionsProps) {\n\treturn (\n\t\t<div className={uiStyles.uiToggleButtonContainer} data-disabled={disabled || undefined}>\n\t\t\t{children}\n\n\t\t\t<div className={uiStyles.uiButtonSeparator} />\n\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\taria-label={open ? closeAriaLabel : openAriaLabel}\n\t\t\t\tclassName={uiStyles.uiToggleButton}\n\t\t\t\tonMouseDown={onToggleMouseDown}\n\t\t\t\tonClick={onToggleClick}>\n\t\t\t\t<ChevronDownIcon className={cn(uiStyles.uiToggleIcon, open && uiStyles.uiToggleIconOpen)} />\n\t\t\t</button>\n\t\t</div>\n\t);\n}\n","import { ComponentPropsWithoutRef, forwardRef, ReactNode } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { InputControl } from \"../input\";\nimport uiStyles from \"../ui.module.scss\";\n\nimport styles from \"./Picker.module.scss\";\n\ninterface PickerTriggerInputProps extends Omit<ComponentPropsWithoutRef<\"input\">, \"size\"> {\n\trootRef?: (node: HTMLDivElement | null) => void;\n\tendAdornment?: ReactNode;\n\toverlay?: ReactNode;\n\trootClassName?: string;\n\tinputClassName?: string;\n}\n\nexport const PickerTriggerInput = forwardRef<HTMLInputElement, PickerTriggerInputProps>(\n\t({ rootRef, endAdornment, overlay, rootClassName, inputClassName, ...props }, ref) => {\n\t\treturn (\n\t\t\t<div ref={rootRef} className={cn(uiStyles.uiInputContainer, styles.triggerContainer, rootClassName)}>\n\t\t\t\t<InputControl endAdornment={endAdornment}>\n\t\t\t\t\t{({ controlClassName }) => (\n\t\t\t\t\t\t<input {...props} ref={ref} className={cn(uiStyles.uiInputWithToggle, controlClassName, inputClassName)} />\n\t\t\t\t\t)}\n\t\t\t\t</InputControl>\n\t\t\t\t{overlay}\n\t\t\t</div>\n\t\t);\n\t}\n);\n\nPickerTriggerInput.displayName = \"PickerTriggerInput\";\n","export type PickerTriggerMode = \"display\" | \"search-single\" | \"search-multi\";\n\ninterface PickerTriggerTextFocusParams {\n\topen: boolean;\n\tcurrentQuery: string;\n\thasDisplayValue: boolean;\n}\n\nexport interface PickerTriggerPolicy {\n\tfocusFloatingOnOpen: boolean;\n\trestoreFocusOnClose: boolean;\n\tresetQueryOnClose: boolean;\n\tshouldOpenOnTriggerClick: (open: boolean) => boolean;\n\tshouldOpenOnInputChange: (open: boolean) => boolean;\n\tshouldFocusReferenceOnToggle: (open: boolean) => boolean;\n\tshouldSelectTriggerTextOnFocus: (params: PickerTriggerTextFocusParams) => boolean;\n}\n\n/**\n * Единая политика поведения trigger-input для picker-компонентов.\n * Нормализует различия между display-режимом, single-search и multi-search.\n */\nexport function createPickerTriggerPolicy(mode: PickerTriggerMode): PickerTriggerPolicy {\n\tswitch (mode) {\n\t\tcase \"search-single\":\n\t\t\treturn {\n\t\t\t\tfocusFloatingOnOpen: false,\n\t\t\t\trestoreFocusOnClose: false,\n\t\t\t\tresetQueryOnClose: true,\n\t\t\t\tshouldOpenOnTriggerClick: () => false,\n\t\t\t\tshouldOpenOnInputChange: (open) => !open,\n\t\t\t\tshouldFocusReferenceOnToggle: (open) => !open,\n\t\t\t\tshouldSelectTriggerTextOnFocus: ({ open, currentQuery, hasDisplayValue }) =>\n\t\t\t\t\t!open && currentQuery.length === 0 && hasDisplayValue\n\t\t\t};\n\t\tcase \"search-multi\":\n\t\t\treturn {\n\t\t\t\tfocusFloatingOnOpen: false,\n\t\t\t\trestoreFocusOnClose: false,\n\t\t\t\tresetQueryOnClose: true,\n\t\t\t\tshouldOpenOnTriggerClick: () => false,\n\t\t\t\tshouldOpenOnInputChange: (open) => !open,\n\t\t\t\tshouldFocusReferenceOnToggle: (open) => !open,\n\t\t\t\tshouldSelectTriggerTextOnFocus: () => false\n\t\t\t};\n\t\tcase \"display\":\n\t\tdefault:\n\t\t\treturn {\n\t\t\t\tfocusFloatingOnOpen: true,\n\t\t\t\trestoreFocusOnClose: true,\n\t\t\t\tresetQueryOnClose: false,\n\t\t\t\tshouldOpenOnTriggerClick: (open) => !open,\n\t\t\t\tshouldOpenOnInputChange: () => false,\n\t\t\t\tshouldFocusReferenceOnToggle: () => false,\n\t\t\t\tshouldSelectTriggerTextOnFocus: () => false\n\t\t\t};\n\t}\n}\n","import { ReactNode } from \"react\";\n\nexport function extractPickerTextContent(node: ReactNode): string | undefined {\n\tif (typeof node === \"string\" || typeof node === \"number\") {\n\t\treturn String(node);\n\t}\n\n\tif (Array.isArray(node)) {\n\t\tconst values = node.map(extractPickerTextContent).filter((value): value is string => Boolean(value));\n\t\treturn values.length ? values.join(\" \") : undefined;\n\t}\n\n\treturn undefined;\n}\n","import { useMemo } from \"react\";\n\nimport { normalizeTextToLower } from \"@ryuzaki13/react-foundation-lib/formatters\";\n\ninterface UsePickerDefaultFilterOptions<T> {\n\toptions: readonly T[];\n\tquery: string;\n\tenabled?: boolean;\n\tgetSearchText: (option: T) => unknown;\n}\n\nfunction normalizeSearchText(value: unknown) {\n\tconst parts = Array.isArray(value) ? value : [value];\n\n\treturn normalizeTextToLower(parts.filter(Boolean).join(\" \"));\n}\n\nexport function usePickerDefaultFilter<T>({ options, query, enabled = true, getSearchText }: UsePickerDefaultFilterOptions<T>) {\n\tconst normalizedQuery = normalizeTextToLower(query);\n\n\treturn useMemo(() => {\n\t\tif (!enabled || !normalizedQuery) {\n\t\t\treturn [...options];\n\t\t}\n\n\t\treturn options.filter((option) => normalizeSearchText(getSearchText(option)).includes(normalizedQuery));\n\t}, [enabled, getSearchText, normalizedQuery, options]);\n}\n","import { Placement } from \"@floating-ui/react\";\nimport {\n\ttype FloatingListboxPlacementStrategy,\n\ttype FloatingListboxSizeResolver,\n\tuseFloatingListbox\n} from \"@ryuzaki13/react-foundation-lib/hooks\";\n\nimport { PickerTriggerMode, createPickerTriggerPolicy } from \"./createPickerTriggerPolicy\";\n\ninterface UsePickerFloatingListboxParams<T> {\n\toptions: readonly T[];\n\tselectedIndex: number;\n\topen?: boolean;\n\tonOpenChange?: (open: boolean) => void;\n\tgetOptionDisabled?: (option: T) => boolean;\n\tonSelect?: (option: T) => void;\n\tdisabled?: boolean;\n\tplacement?: Placement;\n\tplacementStrategy?: FloatingListboxPlacementStrategy;\n\tcloseOnSelect?: boolean;\n\tfocusFloatingOnOpen?: boolean;\n\tallowOpenWithoutOptions?: boolean;\n\trestoreFocusOnClose?: boolean;\n\ttriggerMode?: PickerTriggerMode;\n\tresolveFloatingSize?: FloatingListboxSizeResolver;\n}\n\n/**\n * Единая точка входа для popup/listbox поведения во всех picker-компонентах.\n */\nexport function usePickerFloatingListbox<T>(params: UsePickerFloatingListboxParams<T>) {\n\tconst triggerPolicy = params.triggerMode ? createPickerTriggerPolicy(params.triggerMode) : undefined;\n\n\treturn useFloatingListbox({\n\t\t...params,\n\t\tfocusFloatingOnOpen: params.focusFloatingOnOpen ?? triggerPolicy?.focusFloatingOnOpen,\n\t\trestoreFocusOnClose: params.restoreFocusOnClose ?? triggerPolicy?.restoreFocusOnClose\n\t});\n}\n","import { useEffect, useEffectEvent, useRef, useState } from \"react\";\n\nimport { PickerTriggerMode, createPickerTriggerPolicy } from \"./createPickerTriggerPolicy\";\n\ninterface UsePickerQueryOptions {\n\topen: boolean;\n\tquery?: string;\n\tdefaultQuery?: string;\n\tonQuery?: (value: string) => void;\n\tresetOnClose?: boolean;\n\ttriggerMode?: PickerTriggerMode;\n}\n\nexport function usePickerQuery({ open, query, defaultQuery, onQuery, resetOnClose, triggerMode }: UsePickerQueryOptions) {\n\tconst previousOpenRef = useRef(false);\n\tconst isControlled = query !== undefined;\n\tconst [internalQuery, setInternalQuery] = useState(defaultQuery ?? \"\");\n\tconst currentQuery = isControlled ? (query ?? \"\") : internalQuery;\n\tconst syncResetInternalQuery = useEffectEvent(() => setInternalQuery(\"\"));\n\tconst resolvedResetOnClose = resetOnClose ?? (triggerMode ? createPickerTriggerPolicy(triggerMode).resetQueryOnClose : true);\n\n\tuseEffect(() => {\n\t\tif (previousOpenRef.current && !open && resolvedResetOnClose) {\n\t\t\tif (!isControlled) {\n\t\t\t\tsyncResetInternalQuery();\n\t\t\t}\n\n\t\t\tonQuery?.(\"\");\n\t\t}\n\n\t\tpreviousOpenRef.current = open;\n\t}, [isControlled, onQuery, open, resolvedResetOnClose]);\n\n\tconst setQuery = (nextValue: string) => {\n\t\tif (!isControlled) {\n\t\t\tsetInternalQuery(nextValue);\n\t\t}\n\n\t\tonQuery?.(nextValue);\n\t};\n\n\treturn {\n\t\tquery: currentQuery,\n\t\tsetQuery,\n\t\tclearQuery: () => setQuery(\"\")\n\t};\n}\n","import { useEffect, useEffectEvent, useRef, useState } from \"react\";\n\ninterface UsePickerSelectionLifecycleOptions<TValue> {\n\tvalue: TValue;\n\topen: boolean;\n\tonCommit: (value: TValue) => void;\n\tonOpen?: () => void;\n\tonClose?: (value: TValue) => void;\n\tisEqual: (left: TValue, right: TValue) => boolean;\n}\n\n/**\n * Общий жизненный цикл чернового выбора для picker-компонентов,\n * где изменения подтверждаются при закрытии popup.\n */\nexport function usePickerSelectionLifecycle<TValue>({\n\tvalue,\n\topen,\n\tonCommit,\n\tonOpen,\n\tonClose,\n\tisEqual\n}: UsePickerSelectionLifecycleOptions<TValue>) {\n\tconst previousOpenRef = useRef(false);\n\tconst [draftValue, setDraftValue] = useState(value);\n\tconst syncDraftValue = useEffectEvent((value: TValue) => setDraftValue(value));\n\n\tuseEffect(() => {\n\t\tif (!open) {\n\t\t\tsyncDraftValue(value);\n\t\t}\n\t}, [open, value]);\n\n\tuseEffect(() => {\n\t\tif (previousOpenRef.current && !open) {\n\t\t\tif (!isEqual(draftValue, value)) {\n\t\t\t\tonCommit(draftValue);\n\t\t\t}\n\n\t\t\tonClose?.(draftValue);\n\t\t}\n\n\t\tpreviousOpenRef.current = open;\n\t}, [draftValue, isEqual, onClose, onCommit, open, value]);\n\n\tconst prepareOpen = () => {\n\t\tsetDraftValue(value);\n\t\tonOpen?.();\n\t};\n\n\treturn {\n\t\tdraftValue,\n\t\tsetDraftValue,\n\t\tprepareOpen\n\t};\n}\n","import { MouseEvent, RefObject } from \"react\";\n\nimport { PickerTriggerMode, createPickerTriggerPolicy } from \"./createPickerTriggerPolicy\";\n\ninterface UsePickerTriggerControllerOptions {\n\tmode: PickerTriggerMode;\n\topen: boolean;\n\tcurrentQuery: string;\n\thasDisplayValue: boolean;\n\tinputRef: RefObject<HTMLInputElement | null>;\n\tsetQuery?: (value: string) => void;\n\topenList?: () => void;\n\tclose?: () => void;\n\ttoggleOpen?: () => void;\n\tonBeforeOpen?: () => void;\n}\n\ninterface HandleTriggerKeyDownOptions {\n\tevent: React.KeyboardEvent<HTMLElement>;\n\tonActivateWhenOpen?: () => void;\n\tenableSpaceActivation?: boolean;\n\tenableClosedArrowDownOpen?: boolean;\n\tsuppressClosedArrowUp?: boolean;\n}\n\nfunction focusInput(inputRef: RefObject<HTMLInputElement | null>) {\n\trequestAnimationFrame(() => {\n\t\tinputRef.current?.focus();\n\t});\n}\n\n/**\n * Единый контроллер пользовательских действий на trigger-input.\n * Держит поведение display/search-single/search-multi в одном месте.\n */\nexport function usePickerTriggerController({\n\tmode,\n\topen,\n\tcurrentQuery,\n\thasDisplayValue,\n\tinputRef,\n\tsetQuery,\n\topenList,\n\tclose,\n\ttoggleOpen,\n\tonBeforeOpen\n}: UsePickerTriggerControllerOptions) {\n\tconst policy = createPickerTriggerPolicy(mode);\n\n\tconst openTrigger = () => {\n\t\tonBeforeOpen?.();\n\n\t\tif (openList) {\n\t\t\topenList();\n\t\t\treturn;\n\t\t}\n\n\t\ttoggleOpen?.();\n\t};\n\n\tconst closeTrigger = () => {\n\t\tif (close) {\n\t\t\tclose();\n\t\t\treturn;\n\t\t}\n\n\t\ttoggleOpen?.();\n\t};\n\n\tconst toggleTrigger = () => {\n\t\tif (open) {\n\t\t\tcloseTrigger();\n\t\t} else {\n\t\t\topenTrigger();\n\t\t}\n\n\t\tif (policy.shouldFocusReferenceOnToggle(open)) {\n\t\t\tfocusInput(inputRef);\n\t\t}\n\t};\n\n\treturn {\n\t\tpolicy,\n\t\thandleTriggerInputChange: (nextValue: string) => {\n\t\t\tsetQuery?.(nextValue);\n\n\t\t\tif (policy.shouldOpenOnInputChange(open)) {\n\t\t\t\topenTrigger();\n\t\t\t}\n\t\t},\n\t\thandleTriggerClick: () => {\n\t\t\tif (policy.shouldOpenOnTriggerClick(open)) {\n\t\t\t\topenTrigger();\n\t\t\t}\n\t\t},\n\t\thandleTriggerFocus: (input: HTMLInputElement) => {\n\t\t\tif (\n\t\t\t\tpolicy.shouldSelectTriggerTextOnFocus({\n\t\t\t\t\topen,\n\t\t\t\t\tcurrentQuery,\n\t\t\t\t\thasDisplayValue\n\t\t\t\t})\n\t\t\t) {\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tinput.select();\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\thandleToggleMouseDown: (event: MouseEvent<HTMLButtonElement>) => {\n\t\t\tevent.preventDefault();\n\t\t},\n\t\thandleToggleClick: () => {\n\t\t\ttoggleTrigger();\n\t\t},\n\t\thandleTriggerKeyDown: ({\n\t\t\tevent,\n\t\t\tonActivateWhenOpen,\n\t\t\tenableSpaceActivation = false,\n\t\t\tenableClosedArrowDownOpen = false,\n\t\t\tsuppressClosedArrowUp = false\n\t\t}: HandleTriggerKeyDownOptions) => {\n\t\t\tif (!open && suppressClosedArrowUp && event.key === \"ArrowUp\") {\n\t\t\t\tevent.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!open && enableClosedArrowDownOpen && event.key === \"ArrowDown\") {\n\t\t\t\tevent.preventDefault();\n\t\t\t\ttoggleTrigger();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (event.key === \"Enter\") {\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\tif (open) {\n\t\t\t\t\tonActivateWhenOpen?.();\n\t\t\t\t} else {\n\t\t\t\t\ttoggleTrigger();\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (enableSpaceActivation && event.key === \" \") {\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\tif (open) {\n\t\t\t\t\tonActivateWhenOpen?.();\n\t\t\t\t} else {\n\t\t\t\t\ttoggleTrigger();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\ttoggleTrigger\n\t};\n}\n"],"mappings":"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"}
|
|
@@ -141,21 +141,21 @@ var j = ({ children: t, onClose: n, closeOnOutside: i = !0, closeOnEscape: a = !
|
|
|
141
141
|
})
|
|
142
142
|
],
|
|
143
143
|
whileElementsMounted: m
|
|
144
|
-
}),
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
144
|
+
}), I = b(N, {
|
|
145
|
+
enabled: r,
|
|
146
|
+
move: !1,
|
|
147
|
+
delay: {
|
|
148
|
+
open: a,
|
|
149
|
+
close: f
|
|
150
|
+
}
|
|
151
|
+
}), L = v(N), R = S(N), { getReferenceProps: z, getFloatingProps: B } = x([
|
|
152
|
+
I,
|
|
153
|
+
L,
|
|
154
|
+
R
|
|
155
155
|
]);
|
|
156
156
|
return /* @__PURE__ */ d(l, { children: [/* @__PURE__ */ u("span", {
|
|
157
157
|
ref: A.setReference,
|
|
158
|
-
...
|
|
158
|
+
...z(),
|
|
159
159
|
style: { lineHeight: 1 },
|
|
160
160
|
children: n
|
|
161
161
|
}), E && D(/* @__PURE__ */ d("div", {
|
|
@@ -165,7 +165,7 @@ var j = ({ children: t, onClose: n, closeOnOutside: i = !0, closeOnEscape: a = !
|
|
|
165
165
|
zIndex: "var(--z-tooltip)",
|
|
166
166
|
maxWidth: C ? `${C}em` : void 0
|
|
167
167
|
},
|
|
168
|
-
...
|
|
168
|
+
...B(),
|
|
169
169
|
role: "tooltip",
|
|
170
170
|
className: c(P.tooltipPanel, T && P.tooltip, w && P[w]),
|
|
171
171
|
children: [t, /* @__PURE__ */ u(e, {
|
|
@@ -219,4 +219,4 @@ var j = ({ children: t, onClose: n, closeOnOutside: i = !0, closeOnEscape: a = !
|
|
|
219
219
|
//#endregion
|
|
220
220
|
export { j as a, M as i, F as n, A as o, N as r, I as t };
|
|
221
221
|
|
|
222
|
-
//# sourceMappingURL=popover-
|
|
222
|
+
//# sourceMappingURL=popover-CGU3MlsH.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"popover-xJJqy1v6.js","names":[],"sources":["../../src/popover/components/Popover.module.scss","../../src/popover/components/PopoverContext.tsx","../../src/popover/components/PopoverContent.tsx","../../src/popover/components/PopoverTrigger.tsx","../../src/popover/components/Popover.tsx","../../src/popover/Popover.module.scss","../../src/popover/FloatingPopover.tsx","../../src/popover/FloatingTooltip.tsx"],"sourcesContent":[".popover {\n\tpadding: var(--space-sm);\n\t// background-image: radial-gradient(var(--surface-0) 50%, var(--surface-1) 100%);\n\n\tborder: var(--border-width) solid var(--border-1);\n\tborder-radius: var(--radius-sm);\n\tcolor: var(--content-0);\n\n\tfilter: drop-shadow(var(--shadow-md));\n\n\tz-index: var(--z-popover);\n\n\t&.primary {\n\t\tbackground-color: var(--surface-0);\n\t}\n\n\t&.secondary {\n\t\tbackground-color: var(--surface-1);\n\t}\n}\n","import React, { createContext, useContext } from \"react\";\n\nimport { Placement, useFloating } from \"@floating-ui/react\";\nimport { createMissingContextError } from \"@ryuzaki13/react-foundation-lib/error\";\n\ninterface PopoverContextValue {\n\topen: boolean;\n\tsetOpen: React.Dispatch<React.SetStateAction<boolean>>;\n\trefs: ReturnType<typeof useFloating>[\"refs\"];\n\tfloatingStyles: React.CSSProperties;\n\tplacement: Placement;\n\tmiddlewareData: ReturnType<typeof useFloating>[\"middlewareData\"];\n\tarrowRef: React.RefObject<HTMLDivElement | null>;\n}\n\nexport const PopoverContext = createContext<PopoverContextValue | null>(null);\n\nexport function usePopoverContext() {\n\tconst context = useContext(PopoverContext);\n\tif (!context) {\n\t\tthrow createMissingContextError({\n\t\t\thookName: \"usePopoverContext\",\n\t\t\tproviderName: \"Popover\"\n\t\t});\n\t}\n\treturn context;\n}\n","import React, { useCallback, useRef } from \"react\";\n\nimport { FloatingPortal } from \"@floating-ui/react\";\nimport { useClickOutside, useEscapeDismiss, useOverlayFocus } from \"@ryuzaki13/react-foundation-lib/dom\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { TooltipArrow } from \"../../floating-arrow\";\n\nimport styles from \"./Popover.module.scss\";\nimport { usePopoverContext } from \"./PopoverContext\";\n\nexport interface PopoverContentProps {\n\tchildren: React.ReactNode | ((ctx: { setClose: () => void }) => React.ReactNode);\n\tonClose?: () => void;\n\tcloseOnOutside?: boolean;\n\tcloseOnEscape?: boolean;\n\tdisableOutsideClick?: boolean;\n\tbackground?: \"primary\" | \"secondary\";\n}\n\n/**\n * Содержимое Popover, отображаемое в портале.\n */\nexport const PopoverContent: React.FC<PopoverContentProps> = ({\n\tchildren,\n\tonClose,\n\tcloseOnOutside = true,\n\tcloseOnEscape = true,\n\tdisableOutsideClick = false,\n\tbackground = \"secondary\"\n}) => {\n\tconst { open, setOpen, refs, floatingStyles, middlewareData, placement, arrowRef } = usePopoverContext();\n\tconst floatingElementRef = useRef<HTMLDivElement | null>(null);\n\tconst setFloating = useCallback(\n\t\t(node: HTMLDivElement | null) => {\n\t\t\tfloatingElementRef.current = node;\n\t\t\trefs.setFloating(node);\n\t\t},\n\t\t[refs]\n\t);\n\n\tconst floatingRef = useOverlayFocus<HTMLDivElement>({\n\t\tactive: open,\n\t\tinitialFocus: \"container\",\n\t\trestoreFocus: true,\n\t\tcontainerRef: floatingElementRef\n\t});\n\n\tconst setClose = useCallback(() => {\n\t\tif (!open) return;\n\t\tsetOpen(false);\n\t\tonClose?.();\n\t}, [setOpen, onClose, open]);\n\n\tuseEscapeDismiss({\n\t\tactive: open,\n\t\tenabled: closeOnEscape,\n\t\tonDismiss: setClose,\n\t\tcontainerRef: floatingRef as React.RefObject<HTMLElement | null>\n\t});\n\n\tconst outsideClose = useCallback(() => {\n\t\tif (!open || disableOutsideClick) return;\n\t\tif (closeOnOutside) setClose();\n\t}, [open, disableOutsideClick, closeOnOutside, setClose]);\n\n\tuseClickOutside([refs.floating as React.RefObject<HTMLElement>, refs.reference as React.RefObject<HTMLElement>], outsideClose);\n\n\tif (!open) return null;\n\n\treturn (\n\t\t<FloatingPortal>\n\t\t\t<div\n\t\t\t\tref={setFloating}\n\t\t\t\tstyle={floatingStyles}\n\t\t\t\tclassName={cn(styles.popover, styles[background])}\n\t\t\t\trole=\"dialog\"\n\t\t\t\taria-modal=\"true\"\n\t\t\t\ttabIndex={-1}>\n\t\t\t\t{typeof children === \"function\" ? children({ setClose }) : children}\n\t\t\t\t<TooltipArrow ref={arrowRef} placement={placement} middlewareData={middlewareData} />\n\t\t\t</div>\n\t\t</FloatingPortal>\n\t);\n};\n","import React, { cloneElement, useCallback } from \"react\";\n\nimport { usePopoverContext } from \"./PopoverContext\";\n\nexport interface PopoverTriggerProps {\n\tpassive?: true;\n\tchildren: React.ReactElement<React.HTMLAttributes<Element> & { ref?: React.Ref<Element> }>;\n}\n\nexport const PopoverTrigger: React.FC<PopoverTriggerProps> = ({ passive, children }) => {\n\tconst { open, setOpen, refs } = usePopoverContext();\n\n\tconst handleClick = useCallback(\n\t\t(e: React.MouseEvent) => {\n\t\t\tif (children.props.onClick) {\n\t\t\t\tchildren.props.onClick(e);\n\t\t\t}\n\t\t\tif (e.defaultPrevented) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\n\t\t\tif (passive) return;\n\n\t\t\tsetOpen((v) => !v);\n\t\t},\n\t\t[children, setOpen, passive]\n\t);\n\n\treturn cloneElement(children as React.JSX.Element, {\n\t\tref: refs.setReference,\n\t\t\"aria-expanded\": open,\n\t\tonClick: handleClick\n\t});\n};\n","/* eslint-disable react-refresh/only-export-components */\nimport React, { useCallback, useRef, useState } from \"react\";\n\nimport { arrow, autoUpdate, flip, offset, Placement, shift, useFloating } from \"@floating-ui/react\";\n\nimport { PopoverContent } from \"./PopoverContent\";\nimport { PopoverContext } from \"./PopoverContext\";\nimport { PopoverTrigger } from \"./PopoverTrigger\";\n\nexport interface PopoverProps {\n\tchildren: React.ReactNode;\n\tplacement?: Placement;\n\topen?: boolean;\n\tdefaultOpen?: boolean;\n\tonOpenChange?: (open: boolean) => void;\n}\n\n/**\n * Контролируемый Popover.\n * Используется в связке с Popover.Trigger и Popover.Content.\n */\nconst PopoverRoot: React.FC<PopoverProps> = ({ children, open: controlledOpen, defaultOpen, onOpenChange, placement = \"bottom\" }) => {\n\tconst [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen ?? false);\n\n\tconst isControlled = controlledOpen !== undefined;\n\tconst open = isControlled ? controlledOpen : uncontrolledOpen;\n\tconst setOpen = useCallback<React.Dispatch<React.SetStateAction<boolean>>>(\n\t\t(value) => {\n\t\t\tconst next = typeof value === \"function\" ? value(open) : value;\n\t\t\tif (!isControlled) setUncontrolledOpen(next);\n\t\t\tonOpenChange?.(next);\n\t\t},\n\t\t[isControlled, onOpenChange, open]\n\t);\n\n\tconst arrowRef = useRef<HTMLDivElement | null>(null);\n\n\tconst {\n\t\trefs,\n\t\tfloatingStyles,\n\t\tmiddlewareData,\n\t\tplacement: actualPlacement\n\t} = useFloating({\n\t\topen,\n\t\tonOpenChange: setOpen,\n\t\tplacement,\n\t\t// eslint-disable-next-line react-hooks/refs\n\t\tmiddleware: [offset(8), flip(), shift({ padding: 16 }), arrow({ element: arrowRef.current })],\n\t\twhileElementsMounted: autoUpdate\n\t});\n\n\treturn (\n\t\t<PopoverContext.Provider value={{ open, setOpen, refs, floatingStyles, placement: actualPlacement, middlewareData, arrowRef }}>\n\t\t\t{children}\n\t\t</PopoverContext.Provider>\n\t);\n};\n\n/**\n * Композиционное API:\n * <Popover>\n * <Popover.Trigger />\n * <Popover.Content />\n * </Popover>\n */\nexport const Popover = Object.assign(PopoverRoot, {\n\tTrigger: PopoverTrigger,\n\tContent: PopoverContent\n});\n",".tooltipPanel {\n\tpadding: var(--space-sm);\n\t// background-image: radial-gradient(var(--surface-0) 50%, var(--surface-1) 100%);\n\tbackground-color: var(--surface-1);\n\tborder: var(--border-width) solid var(--border-1);\n\tborder-radius: var(--radius-sm);\n\tcolor: var(--content-0);\n\n\tfilter: drop-shadow(var(--shadow-sm));\n\n\t&.negative {\n\t\t--border-1: var(--content-0);\n\n\t\tbackground-color: var(--content-0);\n\t\tborder-color: var(--border-1);\n\t\tcolor: var(--surface-1);\n\t}\n\n\t&.information {\n\t\t--border-1: var(--status-info-text);\n\n\t\tbackground-color: var(--status-info-text);\n\t\tborder-color: var(--status-info-text);\n\t\tcolor: var(--status-info-on-fill);\n\t}\n\n\t&.error {\n\t\t--border-1: var(--status-error-text);\n\n\t\tbackground-color: var(--status-error-text);\n\t\tborder-color: var(--status-error-text);\n\t\tcolor: var(--status-error-on-fill);\n\t}\n\n\t&.warning {\n\t\t--border-1: var(--status-warning-text);\n\n\t\tbackground-color: var(--status-warning-text);\n\t\tborder-color: var(--status-warning-text);\n\t\tcolor: var(--status-warning-on-fill);\n\t}\n\n\t&.success {\n\t\t--border-1: var(--status-success-text);\n\n\t\tbackground-color: var(--status-success-text);\n\t\tborder-color: var(--status-success-text);\n\t\tcolor: var(--status-success-on-fill);\n\t}\n}\n\n.tooltip {\n\tz-index: var(--z-tooltip);\n\tpointer-events: none;\n\n\ttext-align: initial;\n\tfont-size: var(--font-size-sm);\n\tfont-style: normal;\n\tfont-weight: 500;\n\tfont-variation-settings: \"wght\" 500;\n\tline-height: var(--line-height);\n\n\t@extend .tooltipPanel;\n}\n","/* eslint-disable react-hooks/refs */\nimport React, { useRef, useState } from \"react\";\n\nimport {\n\tarrow,\n\tautoUpdate,\n\tflip,\n\toffset,\n\tPlacement,\n\tshift,\n\tuseDismiss,\n\tuseFloating,\n\tuseHover,\n\tuseInteractions,\n\tuseRole\n} from \"@floating-ui/react\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { createPortal } from \"react-dom\";\n\nimport { FloatingArrow } from \"../floating-arrow/FloatingArrow\";\n\nimport styles from \"./Popover.module.scss\";\n\ninterface FloatingPopoverProps {\n\tcontent: React.ReactNode;\n\tchildren: React.ReactNode;\n\topenOnHover?: boolean;\n\tplacement?: Placement;\n\topenDelay?: number;\n\tcloseDelay?: number;\n\tmaxWidth?: number;\n\tstate?: \"information\" | \"error\" | \"warning\" | \"success\" | \"negative\";\n\ttooltip?: true;\n}\n\nexport const FloatingPopover: React.FC<FloatingPopoverProps> = ({\n\tcontent,\n\tchildren,\n\topenOnHover = true,\n\tplacement = \"bottom\",\n\topenDelay = 200,\n\tcloseDelay = 100,\n\tmaxWidth,\n\tstate,\n\ttooltip\n}) => {\n\tconst [open, setOpen] = useState(false);\n\tconst arrowRef = useRef<HTMLDivElement>(null);\n\n\tconst {\n\t\trefs,\n\t\tfloatingStyles,\n\t\tmiddlewareData,\n\t\tcontext,\n\t\tplacement: computedPlacement\n\t} = useFloating({\n\t\topen,\n\t\tonOpenChange: setOpen,\n\t\tplacement,\n\t\tmiddleware: [\n\t\t\toffset(8),\n\t\t\tflip({ fallbackAxisSideDirection: \"end\", fallbackPlacements: [\"top\", \"right\", \"bottom\"] }),\n\t\t\tshift({ padding: 16 }),\n\t\t\tarrow({ element: arrowRef, padding: 8 })\n\t\t],\n\t\twhileElementsMounted: autoUpdate\n\t});\n\n\tconst hover = useHover(context, {\n\t\tenabled: openOnHover,\n\t\tmove: false,\n\t\tdelay: {\n\t\t\topen: openDelay,\n\t\t\tclose: closeDelay\n\t\t}\n\t});\n\tconst dismiss = useDismiss(context);\n\tconst role = useRole(context);\n\n\tconst { getReferenceProps, getFloatingProps } = useInteractions([hover, dismiss, role]);\n\n\treturn (\n\t\t<>\n\t\t\t<span ref={refs.setReference} {...getReferenceProps()} style={{ lineHeight: 1 }}>\n\t\t\t\t{children}\n\t\t\t</span>\n\n\t\t\t{open &&\n\t\t\t\tcreatePortal(\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={refs.setFloating}\n\t\t\t\t\t\tstyle={{ ...floatingStyles, zIndex: \"var(--z-tooltip)\", maxWidth: maxWidth ? `${maxWidth}em` : undefined }}\n\t\t\t\t\t\t{...getFloatingProps()}\n\t\t\t\t\t\trole=\"tooltip\"\n\t\t\t\t\t\tclassName={cn(styles.tooltipPanel, tooltip && styles.tooltip, state && styles[state])}>\n\t\t\t\t\t\t{content}\n\n\t\t\t\t\t\t<FloatingArrow ref={arrowRef} placement={computedPlacement} middlewareData={middlewareData} />\n\t\t\t\t\t</div>,\n\t\t\t\t\tdocument.body\n\t\t\t\t)}\n\t\t</>\n\t);\n};\n","import React, { useEffect, useRef } from \"react\";\n\nimport { arrow, flip, offset, shift, useFloating } from \"@floating-ui/react\";\n\nimport { FloatingArrow } from \"../floating-arrow/FloatingArrow\";\n\nimport styles from \"./Popover.module.scss\";\n\nexport const FloatingTooltip: React.FC<{\n\tx: number;\n\ty: number;\n\tchildren: React.ReactNode;\n}> = ({ x, y, children }) => {\n\tconst arrowRef = useRef<HTMLDivElement | null>(null);\n\n\tconst {\n\t\trefs,\n\t\tfloatingStyles,\n\t\tmiddlewareData,\n\t\tplacement: computedPlacement\n\t} = useFloating({\n\t\tstrategy: \"absolute\",\n\t\tplacement: \"top\",\n\t\t// eslint-disable-next-line react-hooks/refs\n\t\tmiddleware: [offset(6), flip(), shift({ padding: 16 }), arrow({ element: arrowRef })]\n\t});\n\n\tuseEffect(() => {\n\t\tif (refs.setReference) {\n\t\t\trefs.setReference({\n\t\t\t\tgetBoundingClientRect: () =>\n\t\t\t\t\t({\n\t\t\t\t\t\tx,\n\t\t\t\t\t\ty,\n\t\t\t\t\t\twidth: 0,\n\t\t\t\t\t\theight: 0,\n\t\t\t\t\t\ttop: y,\n\t\t\t\t\t\tleft: x,\n\t\t\t\t\t\tbottom: y,\n\t\t\t\t\t\tright: x,\n\t\t\t\t\t\ttoJSON: () => {}\n\t\t\t\t\t}) as DOMRect\n\t\t\t});\n\t\t}\n\t}, [x, y, refs]);\n\n\treturn (\n\t\t<div ref={refs.setFloating} style={{ ...floatingStyles, position: \"absolute\", pointerEvents: \"none\" }} className={styles.tooltip}>\n\t\t\t{children}\n\n\t\t\t<FloatingArrow ref={arrowRef} placement={computedPlacement} middlewareData={middlewareData} />\n\t\t</div>\n\t);\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"popover-CGU3MlsH.js","names":[],"sources":["../../src/popover/components/Popover.module.scss","../../src/popover/components/PopoverContext.tsx","../../src/popover/components/PopoverContent.tsx","../../src/popover/components/PopoverTrigger.tsx","../../src/popover/components/Popover.tsx","../../src/popover/Popover.module.scss","../../src/popover/FloatingPopover.tsx","../../src/popover/FloatingTooltip.tsx"],"sourcesContent":[".popover {\n\tpadding: var(--space-sm);\n\t// background-image: radial-gradient(var(--surface-0) 50%, var(--surface-1) 100%);\n\n\tborder: var(--border-width) solid var(--border-1);\n\tborder-radius: var(--radius-sm);\n\tcolor: var(--content-0);\n\n\tfilter: drop-shadow(var(--shadow-md));\n\n\tz-index: var(--z-popover);\n\n\t&.primary {\n\t\tbackground-color: var(--surface-0);\n\t}\n\n\t&.secondary {\n\t\tbackground-color: var(--surface-1);\n\t}\n}\n","import React, { createContext, useContext } from \"react\";\n\nimport { Placement, useFloating } from \"@floating-ui/react\";\nimport { createMissingContextError } from \"@ryuzaki13/react-foundation-lib/error\";\n\ninterface PopoverContextValue {\n\topen: boolean;\n\tsetOpen: React.Dispatch<React.SetStateAction<boolean>>;\n\trefs: ReturnType<typeof useFloating>[\"refs\"];\n\tfloatingStyles: React.CSSProperties;\n\tplacement: Placement;\n\tmiddlewareData: ReturnType<typeof useFloating>[\"middlewareData\"];\n\tarrowRef: React.RefObject<HTMLDivElement | null>;\n}\n\nexport const PopoverContext = createContext<PopoverContextValue | null>(null);\n\nexport function usePopoverContext() {\n\tconst context = useContext(PopoverContext);\n\tif (!context) {\n\t\tthrow createMissingContextError({\n\t\t\thookName: \"usePopoverContext\",\n\t\t\tproviderName: \"Popover\"\n\t\t});\n\t}\n\treturn context;\n}\n","import React, { useCallback, useRef } from \"react\";\n\nimport { FloatingPortal } from \"@floating-ui/react\";\nimport { useClickOutside, useEscapeDismiss, useOverlayFocus } from \"@ryuzaki13/react-foundation-lib/dom\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { TooltipArrow } from \"../../floating-arrow\";\n\nimport styles from \"./Popover.module.scss\";\nimport { usePopoverContext } from \"./PopoverContext\";\n\nexport interface PopoverContentProps {\n\tchildren: React.ReactNode | ((ctx: { setClose: () => void }) => React.ReactNode);\n\tonClose?: () => void;\n\tcloseOnOutside?: boolean;\n\tcloseOnEscape?: boolean;\n\tdisableOutsideClick?: boolean;\n\tbackground?: \"primary\" | \"secondary\";\n}\n\n/**\n * Содержимое Popover, отображаемое в портале.\n */\nexport const PopoverContent: React.FC<PopoverContentProps> = ({\n\tchildren,\n\tonClose,\n\tcloseOnOutside = true,\n\tcloseOnEscape = true,\n\tdisableOutsideClick = false,\n\tbackground = \"secondary\"\n}) => {\n\tconst { open, setOpen, refs, floatingStyles, middlewareData, placement, arrowRef } = usePopoverContext();\n\tconst floatingElementRef = useRef<HTMLDivElement | null>(null);\n\tconst setFloating = useCallback(\n\t\t(node: HTMLDivElement | null) => {\n\t\t\tfloatingElementRef.current = node;\n\t\t\trefs.setFloating(node);\n\t\t},\n\t\t[refs]\n\t);\n\n\tconst floatingRef = useOverlayFocus<HTMLDivElement>({\n\t\tactive: open,\n\t\tinitialFocus: \"container\",\n\t\trestoreFocus: true,\n\t\tcontainerRef: floatingElementRef\n\t});\n\n\tconst setClose = useCallback(() => {\n\t\tif (!open) return;\n\t\tsetOpen(false);\n\t\tonClose?.();\n\t}, [setOpen, onClose, open]);\n\n\tuseEscapeDismiss({\n\t\tactive: open,\n\t\tenabled: closeOnEscape,\n\t\tonDismiss: setClose,\n\t\tcontainerRef: floatingRef as React.RefObject<HTMLElement | null>\n\t});\n\n\tconst outsideClose = useCallback(() => {\n\t\tif (!open || disableOutsideClick) return;\n\t\tif (closeOnOutside) setClose();\n\t}, [open, disableOutsideClick, closeOnOutside, setClose]);\n\n\tuseClickOutside([refs.floating as React.RefObject<HTMLElement>, refs.reference as React.RefObject<HTMLElement>], outsideClose);\n\n\tif (!open) return null;\n\n\treturn (\n\t\t<FloatingPortal>\n\t\t\t<div\n\t\t\t\tref={setFloating}\n\t\t\t\tstyle={floatingStyles}\n\t\t\t\tclassName={cn(styles.popover, styles[background])}\n\t\t\t\trole=\"dialog\"\n\t\t\t\taria-modal=\"true\"\n\t\t\t\ttabIndex={-1}>\n\t\t\t\t{typeof children === \"function\" ? children({ setClose }) : children}\n\t\t\t\t<TooltipArrow ref={arrowRef} placement={placement} middlewareData={middlewareData} />\n\t\t\t</div>\n\t\t</FloatingPortal>\n\t);\n};\n","import React, { cloneElement, useCallback } from \"react\";\n\nimport { usePopoverContext } from \"./PopoverContext\";\n\nexport interface PopoverTriggerProps {\n\tpassive?: true;\n\tchildren: React.ReactElement<React.HTMLAttributes<Element> & { ref?: React.Ref<Element> }>;\n}\n\nexport const PopoverTrigger: React.FC<PopoverTriggerProps> = ({ passive, children }) => {\n\tconst { open, setOpen, refs } = usePopoverContext();\n\n\tconst handleClick = useCallback(\n\t\t(e: React.MouseEvent) => {\n\t\t\tif (children.props.onClick) {\n\t\t\t\tchildren.props.onClick(e);\n\t\t\t}\n\t\t\tif (e.defaultPrevented) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\n\t\t\tif (passive) return;\n\n\t\t\tsetOpen((v) => !v);\n\t\t},\n\t\t[children, setOpen, passive]\n\t);\n\n\treturn cloneElement(children as React.JSX.Element, {\n\t\tref: refs.setReference,\n\t\t\"aria-expanded\": open,\n\t\tonClick: handleClick\n\t});\n};\n","/* eslint-disable react-refresh/only-export-components */\nimport React, { useCallback, useRef, useState } from \"react\";\n\nimport { arrow, autoUpdate, flip, offset, Placement, shift, useFloating } from \"@floating-ui/react\";\n\nimport { PopoverContent } from \"./PopoverContent\";\nimport { PopoverContext } from \"./PopoverContext\";\nimport { PopoverTrigger } from \"./PopoverTrigger\";\n\nexport interface PopoverProps {\n\tchildren: React.ReactNode;\n\tplacement?: Placement;\n\topen?: boolean;\n\tdefaultOpen?: boolean;\n\tonOpenChange?: (open: boolean) => void;\n}\n\n/**\n * Контролируемый Popover.\n * Используется в связке с Popover.Trigger и Popover.Content.\n */\nconst PopoverRoot: React.FC<PopoverProps> = ({ children, open: controlledOpen, defaultOpen, onOpenChange, placement = \"bottom\" }) => {\n\tconst [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen ?? false);\n\n\tconst isControlled = controlledOpen !== undefined;\n\tconst open = isControlled ? controlledOpen : uncontrolledOpen;\n\tconst setOpen = useCallback<React.Dispatch<React.SetStateAction<boolean>>>(\n\t\t(value) => {\n\t\t\tconst next = typeof value === \"function\" ? value(open) : value;\n\t\t\tif (!isControlled) setUncontrolledOpen(next);\n\t\t\tonOpenChange?.(next);\n\t\t},\n\t\t[isControlled, onOpenChange, open]\n\t);\n\n\tconst arrowRef = useRef<HTMLDivElement | null>(null);\n\n\tconst {\n\t\trefs,\n\t\tfloatingStyles,\n\t\tmiddlewareData,\n\t\tplacement: actualPlacement\n\t} = useFloating({\n\t\topen,\n\t\tonOpenChange: setOpen,\n\t\tplacement,\n\t\t// eslint-disable-next-line react-hooks/refs\n\t\tmiddleware: [offset(8), flip(), shift({ padding: 16 }), arrow({ element: arrowRef.current })],\n\t\twhileElementsMounted: autoUpdate\n\t});\n\n\treturn (\n\t\t<PopoverContext.Provider value={{ open, setOpen, refs, floatingStyles, placement: actualPlacement, middlewareData, arrowRef }}>\n\t\t\t{children}\n\t\t</PopoverContext.Provider>\n\t);\n};\n\n/**\n * Композиционное API:\n * <Popover>\n * <Popover.Trigger />\n * <Popover.Content />\n * </Popover>\n */\nexport const Popover = Object.assign(PopoverRoot, {\n\tTrigger: PopoverTrigger,\n\tContent: PopoverContent\n});\n",".tooltipPanel {\n\tpadding: var(--space-sm);\n\t// background-image: radial-gradient(var(--surface-0) 50%, var(--surface-1) 100%);\n\tbackground-color: var(--surface-1);\n\tborder: var(--border-width) solid var(--border-1);\n\tborder-radius: var(--radius-sm);\n\tcolor: var(--content-0);\n\n\tfilter: drop-shadow(var(--shadow-sm));\n\n\t&.negative {\n\t\t--border-1: var(--content-0);\n\n\t\tbackground-color: var(--content-0);\n\t\tborder-color: var(--border-1);\n\t\tcolor: var(--surface-1);\n\t}\n\n\t&.information {\n\t\t--border-1: var(--status-info-text);\n\n\t\tbackground-color: var(--status-info-text);\n\t\tborder-color: var(--status-info-text);\n\t\tcolor: var(--status-info-on-fill);\n\t}\n\n\t&.error {\n\t\t--border-1: var(--status-error-text);\n\n\t\tbackground-color: var(--status-error-text);\n\t\tborder-color: var(--status-error-text);\n\t\tcolor: var(--status-error-on-fill);\n\t}\n\n\t&.warning {\n\t\t--border-1: var(--status-warning-text);\n\n\t\tbackground-color: var(--status-warning-text);\n\t\tborder-color: var(--status-warning-text);\n\t\tcolor: var(--status-warning-on-fill);\n\t}\n\n\t&.success {\n\t\t--border-1: var(--status-success-text);\n\n\t\tbackground-color: var(--status-success-text);\n\t\tborder-color: var(--status-success-text);\n\t\tcolor: var(--status-success-on-fill);\n\t}\n}\n\n.tooltip {\n\tz-index: var(--z-tooltip);\n\tpointer-events: none;\n\n\ttext-align: initial;\n\tfont-size: var(--font-size-sm);\n\tfont-style: normal;\n\tfont-weight: 500;\n\tfont-variation-settings: \"wght\" 500;\n\tline-height: var(--line-height);\n\n\t@extend .tooltipPanel;\n}\n","/* eslint-disable react-hooks/refs */\nimport React, { useRef, useState } from \"react\";\n\nimport {\n\tarrow,\n\tautoUpdate,\n\tflip,\n\toffset,\n\tPlacement,\n\tshift,\n\tuseDismiss,\n\tuseFloating,\n\tuseHover,\n\tuseInteractions,\n\tuseRole\n} from \"@floating-ui/react\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { createPortal } from \"react-dom\";\n\nimport { FloatingArrow } from \"../floating-arrow/FloatingArrow\";\n\nimport styles from \"./Popover.module.scss\";\n\ninterface FloatingPopoverProps {\n\tcontent: React.ReactNode;\n\tchildren: React.ReactNode;\n\topenOnHover?: boolean;\n\tplacement?: Placement;\n\topenDelay?: number;\n\tcloseDelay?: number;\n\tmaxWidth?: number;\n\tstate?: \"information\" | \"error\" | \"warning\" | \"success\" | \"negative\";\n\ttooltip?: true;\n}\n\nexport const FloatingPopover: React.FC<FloatingPopoverProps> = ({\n\tcontent,\n\tchildren,\n\topenOnHover = true,\n\tplacement = \"bottom\",\n\topenDelay = 200,\n\tcloseDelay = 100,\n\tmaxWidth,\n\tstate,\n\ttooltip\n}) => {\n\tconst [open, setOpen] = useState(false);\n\tconst arrowRef = useRef<HTMLDivElement>(null);\n\n\tconst {\n\t\trefs,\n\t\tfloatingStyles,\n\t\tmiddlewareData,\n\t\tcontext,\n\t\tplacement: computedPlacement\n\t} = useFloating({\n\t\topen,\n\t\tonOpenChange: setOpen,\n\t\tplacement,\n\t\tmiddleware: [\n\t\t\toffset(8),\n\t\t\tflip({ fallbackAxisSideDirection: \"end\", fallbackPlacements: [\"top\", \"right\", \"bottom\"] }),\n\t\t\tshift({ padding: 16 }),\n\t\t\tarrow({ element: arrowRef, padding: 8 })\n\t\t],\n\t\twhileElementsMounted: autoUpdate\n\t});\n\n\tconst hover = useHover(context, {\n\t\tenabled: openOnHover,\n\t\tmove: false,\n\t\tdelay: {\n\t\t\topen: openDelay,\n\t\t\tclose: closeDelay\n\t\t}\n\t});\n\tconst dismiss = useDismiss(context);\n\tconst role = useRole(context);\n\n\tconst { getReferenceProps, getFloatingProps } = useInteractions([hover, dismiss, role]);\n\n\treturn (\n\t\t<>\n\t\t\t<span ref={refs.setReference} {...getReferenceProps()} style={{ lineHeight: 1 }}>\n\t\t\t\t{children}\n\t\t\t</span>\n\n\t\t\t{open &&\n\t\t\t\tcreatePortal(\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={refs.setFloating}\n\t\t\t\t\t\tstyle={{ ...floatingStyles, zIndex: \"var(--z-tooltip)\", maxWidth: maxWidth ? `${maxWidth}em` : undefined }}\n\t\t\t\t\t\t{...getFloatingProps()}\n\t\t\t\t\t\trole=\"tooltip\"\n\t\t\t\t\t\tclassName={cn(styles.tooltipPanel, tooltip && styles.tooltip, state && styles[state])}>\n\t\t\t\t\t\t{content}\n\n\t\t\t\t\t\t<FloatingArrow ref={arrowRef} placement={computedPlacement} middlewareData={middlewareData} />\n\t\t\t\t\t</div>,\n\t\t\t\t\tdocument.body\n\t\t\t\t)}\n\t\t</>\n\t);\n};\n","import React, { useEffect, useRef } from \"react\";\n\nimport { arrow, flip, offset, shift, useFloating } from \"@floating-ui/react\";\n\nimport { FloatingArrow } from \"../floating-arrow/FloatingArrow\";\n\nimport styles from \"./Popover.module.scss\";\n\nexport const FloatingTooltip: React.FC<{\n\tx: number;\n\ty: number;\n\tchildren: React.ReactNode;\n}> = ({ x, y, children }) => {\n\tconst arrowRef = useRef<HTMLDivElement | null>(null);\n\n\tconst {\n\t\trefs,\n\t\tfloatingStyles,\n\t\tmiddlewareData,\n\t\tplacement: computedPlacement\n\t} = useFloating({\n\t\tstrategy: \"absolute\",\n\t\tplacement: \"top\",\n\t\t// eslint-disable-next-line react-hooks/refs\n\t\tmiddleware: [offset(6), flip(), shift({ padding: 16 }), arrow({ element: arrowRef })]\n\t});\n\n\tuseEffect(() => {\n\t\tif (refs.setReference) {\n\t\t\trefs.setReference({\n\t\t\t\tgetBoundingClientRect: () =>\n\t\t\t\t\t({\n\t\t\t\t\t\tx,\n\t\t\t\t\t\ty,\n\t\t\t\t\t\twidth: 0,\n\t\t\t\t\t\theight: 0,\n\t\t\t\t\t\ttop: y,\n\t\t\t\t\t\tleft: x,\n\t\t\t\t\t\tbottom: y,\n\t\t\t\t\t\tright: x,\n\t\t\t\t\t\ttoJSON: () => {}\n\t\t\t\t\t}) as DOMRect\n\t\t\t});\n\t\t}\n\t}, [x, y, refs]);\n\n\treturn (\n\t\t<div ref={refs.setFloating} style={{ ...floatingStyles, position: \"absolute\", pointerEvents: \"none\" }} className={styles.tooltip}>\n\t\t\t{children}\n\n\t\t\t<FloatingArrow ref={arrowRef} placement={computedPlacement} middlewareData={middlewareData} />\n\t\t</div>\n\t);\n};\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"radio-group-CM9Lg_nc.js","names":[],"sources":["../../src/radio-group/RadioGroup.module.scss","../../src/radio-group/RadioGroup.tsx"],"sourcesContent":[".radioGroup {\n\tdisplay: flex;\n\talign-content: flex-start;\n\tflex-wrap: wrap;\n\t// min-height: var(--control-height);\n\theight: auto;\n\n\t&.noWrap {\n\t\tflex-wrap: nowrap;\n\t}\n\n\t&.horizontal {\n\t\tflex-direction: row;\n\t}\n\n\t&.vertical {\n\t\tflex-direction: column;\n\t\talign-content: stretch;\n\t}\n}\n\n.radioItem {\n\tdisplay: grid;\n\talign-content: center;\n\tgap: var(--space-sm);\n\tflex: 1 0 0;\n\tcolor: var(--content-2);\n\tborder-radius: var(--radius-xs);\n\tpadding: 0 var(--space-md);\n\tmargin: var(--border-width);\n\t// baseInputControl = --control-height, + borderTop/Bottom + transparentLineTop/Bottom\n\tmin-height: calc(var(--control-height) - calc(var(--border-width) * 4));\n\n\tcursor: pointer;\n\n\t&:hover {\n\t\tcolor: var(--content-accent);\n\t\t// background-color: var(--surface-1);\n\t}\n\n\t&.checked {\n\t\tcolor: var(--status-info-on-fill);\n\t\tbackground-color: var(--status-info-fill);\n\t\t// border-color: var(--border-0);\n\t}\n\n\t&:disabled {\n\t\topacity: var(--disabled-opacity);\n\t}\n}\n","import React, { createContext, KeyboardEvent, ReactNode, useCallback, useContext, useId, useLayoutEffect, useMemo, useState } from \"react\";\n\nimport { cn, getRovingFocusTargetIndex, handleKeyboardActivation } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport uiStyles from \"../ui.module.scss\";\n\nimport styles from \"./RadioGroup.module.scss\";\n\ninterface RadioGroupContextValue {\n\tvalue?: unknown;\n\tonChange?: (value: unknown) => void;\n\tdisabled?: boolean;\n\torientation: \"vertical\" | \"horizontal\";\n\tgroupId: string;\n\tlabelId?: string;\n\tdescriptionId?: string;\n\tfirstOptionId?: string;\n\tregisterOption: (optionId: string) => () => void;\n}\n\nconst RadioGroupContext = createContext<RadioGroupContextValue | null>(null);\n\ninterface RadioGroupProps<T> {\n\tvalue?: T;\n\tonChange?: (value: T) => void;\n\tlabel?: string;\n\tdescription?: string;\n\tdisabled?: boolean;\n\tclassName?: string;\n\tnoWrap?: true;\n\torientation?: \"vertical\" | \"horizontal\";\n\t\"aria-label\"?: string;\n\tchildren: React.ReactNode;\n}\n\n/**\n * Группа радиокнопок с общим состоянием выбранного значения. Обеспечивает единый API выбора и контекст для дочерних опций.\n */\nexport function RadioGroup<T>({\n\tvalue,\n\tonChange,\n\tlabel,\n\tdescription,\n\tdisabled,\n\tclassName,\n\tnoWrap,\n\torientation = \"horizontal\",\n\t\"aria-label\": ariaLabel,\n\tchildren\n}: RadioGroupProps<T>) {\n\tconst groupId = useId();\n\tconst labelId = label ? `${groupId}-label` : undefined;\n\tconst descriptionId = description ? `${groupId}-description` : undefined;\n\tconst [registeredOptionIds, setRegisteredOptionIds] = useState<string[]>([]);\n\tconst handleChange = useCallback((nextValue: unknown) => onChange?.(nextValue as T), [onChange]);\n\n\t/**\n\t * Хранит порядок опций внутри группы, чтобы при отсутствии выбранного значения\n\t * оставлять ровно один tab stop на первой доступной радиокнопке.\n\t */\n\tconst registerOption = useCallback((optionId: string) => {\n\t\tsetRegisteredOptionIds((currentIds) => (currentIds.includes(optionId) ? currentIds : [...currentIds, optionId]));\n\n\t\treturn () => {\n\t\t\tsetRegisteredOptionIds((currentIds) => currentIds.filter((currentId) => currentId !== optionId));\n\t\t};\n\t}, []);\n\n\tconst contextValue = useMemo(\n\t\t() => ({\n\t\t\tvalue,\n\t\t\tonChange: handleChange,\n\t\t\tdisabled,\n\t\t\torientation,\n\t\t\tgroupId,\n\t\t\tlabelId,\n\t\t\tdescriptionId,\n\t\t\tfirstOptionId: registeredOptionIds[0],\n\t\t\tregisterOption\n\t\t}),\n\t\t[descriptionId, disabled, groupId, handleChange, labelId, orientation, registerOption, registeredOptionIds, value]\n\t);\n\n\treturn (\n\t\t<div className={cn(uiStyles.uiElement, disabled && uiStyles.disabled, className)}>\n\t\t\t{label && (\n\t\t\t\t<div id={labelId} className={uiStyles.uiLabel}>\n\t\t\t\t\t{label}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{description && (\n\t\t\t\t<div id={descriptionId} className={uiStyles.uiDescription}>\n\t\t\t\t\t{description}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<RadioGroupContext.Provider value={contextValue}>\n\t\t\t\t<div\n\t\t\t\t\trole=\"radiogroup\"\n\t\t\t\t\taria-labelledby={labelId}\n\t\t\t\t\taria-label={labelId ? undefined : ariaLabel}\n\t\t\t\t\taria-describedby={descriptionId}\n\t\t\t\t\taria-disabled={disabled || undefined}\n\t\t\t\t\tdata-disabled={disabled || undefined}\n\t\t\t\t\tclassName={cn(uiStyles.uiInputControl, styles.radioGroup, noWrap && styles.noWrap, styles[orientation])}>\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t</RadioGroupContext.Provider>\n\t\t</div>\n\t);\n}\n\ninterface OptionProps<T> {\n\tvalue: T;\n\tlabel: ReactNode;\n\tdescription?: ReactNode;\n\tclassName?: string;\n}\n\n/**\n * Опция внутри `RadioGroup`, представляющая одно выбираемое значение. Отрисовывает подпись, описание и состояние выбора.\n */\nexport function Option<T>({ value, label, description, className }: OptionProps<T>) {\n\tconst context = useContext(RadioGroupContext);\n\tconst optionId = useId();\n\tconst registerOption = context?.registerOption;\n\n\tuseLayoutEffect(() => {\n\t\tif (!registerOption) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn registerOption(optionId);\n\t}, [registerOption, optionId]);\n\n\tif (!context) {\n\t\treturn (\n\t\t\t<div className={cn(styles.radioItem, className)}>\n\t\t\t\t<p className=\"textNoWrap\">{label}</p>\n\t\t\t\t{description && <div className=\"fontSizeSm content2\">{description}</div>}\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst isChecked = Object.is(context.value, value);\n\tconst isDisabled = context.disabled === true;\n\tconst isFallbackTabStop = context.value === undefined && context.firstOptionId === optionId;\n\n\tconst handleChange = () => {\n\t\tif (isDisabled || isChecked) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontext.onChange?.(value);\n\t};\n\n\t// TODO: логика переиспользуемая, надо вынести в хук\n\tconst handleKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n\t\tif (isDisabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (handleKeyboardActivation(event, handleChange)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentTarget = event.currentTarget;\n\t\tconst groupElement = currentTarget.closest<HTMLElement>('[role=\"radiogroup\"]');\n\t\tconst radioItems = Array.from(groupElement?.querySelectorAll<HTMLButtonElement>('[role=\"radio\"]:not([disabled])') ?? []);\n\n\t\tif (!radioItems.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentIndex = radioItems.indexOf(currentTarget);\n\t\tif (currentIndex === -1) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst nextIndex = getRovingFocusTargetIndex({\n\t\t\tcurrentIndex,\n\t\t\titemCount: radioItems.length,\n\t\t\tkey: event.key,\n\t\t\torientation: context.orientation\n\t\t});\n\n\t\tif (nextIndex === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\t\tradioItems[nextIndex]?.focus();\n\t\tradioItems[nextIndex]?.click();\n\t};\n\n\treturn (\n\t\t<button\n\t\t\tid={`${context.groupId}-option-${optionId}`}\n\t\t\ttype=\"button\"\n\t\t\trole=\"radio\"\n\t\t\taria-checked={isChecked}\n\t\t\tdisabled={isDisabled}\n\t\t\ttabIndex={isChecked || isFallbackTabStop ? 0 : -1}\n\t\t\tclassName={cn(styles.radioItem, isChecked && styles.checked, className)}\n\t\t\tdata-ui=\"radio-option\"\n\t\t\tdata-action=\"select-radio-option\"\n\t\t\tonClick={handleChange}\n\t\t\tonKeyDown={handleKeyDown}>\n\t\t\t<span className=\"textNoWrap\">{label}</span>\n\t\t\t{description && <span className=\"fontSizeSm\">{description}</span>}\n\t\t</button>\n\t);\n}\n\nRadioGroup.Option = Option;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"radio-group-CM9Lg_nc.js","names":[],"sources":["../../src/radio-group/RadioGroup.module.scss","../../src/radio-group/RadioGroup.tsx"],"sourcesContent":[".radioGroup {\n\tdisplay: flex;\n\talign-content: flex-start;\n\tflex-wrap: wrap;\n\t// min-height: var(--control-height);\n\theight: auto;\n\n\t&.noWrap {\n\t\tflex-wrap: nowrap;\n\t}\n\n\t&.horizontal {\n\t\tflex-direction: row;\n\t}\n\n\t&.vertical {\n\t\tflex-direction: column;\n\t\talign-content: stretch;\n\t}\n}\n\n.radioItem {\n\tdisplay: grid;\n\talign-content: center;\n\tgap: var(--space-sm);\n\tflex: 1 0 0;\n\tcolor: var(--content-2);\n\tborder-radius: var(--radius-xs);\n\tpadding: 0 var(--space-md);\n\tmargin: var(--border-width);\n\t// baseInputControl = --control-height, + borderTop/Bottom + transparentLineTop/Bottom\n\tmin-height: calc(var(--control-height) - calc(var(--border-width) * 4));\n\n\tcursor: pointer;\n\n\t&:hover {\n\t\tcolor: var(--content-accent);\n\t\t// background-color: var(--surface-1);\n\t}\n\n\t&.checked {\n\t\tcolor: var(--status-info-on-fill);\n\t\tbackground-color: var(--status-info-fill);\n\t\t// border-color: var(--border-0);\n\t}\n\n\t&:disabled {\n\t\topacity: var(--disabled-opacity);\n\t}\n}\n","import React, { createContext, KeyboardEvent, ReactNode, useCallback, useContext, useId, useLayoutEffect, useMemo, useState } from \"react\";\n\nimport { cn, getRovingFocusTargetIndex, handleKeyboardActivation } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport uiStyles from \"../ui.module.scss\";\n\nimport styles from \"./RadioGroup.module.scss\";\n\ninterface RadioGroupContextValue {\n\tvalue?: unknown;\n\tonChange?: (value: unknown) => void;\n\tdisabled?: boolean;\n\torientation: \"vertical\" | \"horizontal\";\n\tgroupId: string;\n\tlabelId?: string;\n\tdescriptionId?: string;\n\tfirstOptionId?: string;\n\tregisterOption: (optionId: string) => () => void;\n}\n\nconst RadioGroupContext = createContext<RadioGroupContextValue | null>(null);\n\ninterface RadioGroupProps<T> {\n\tvalue?: T;\n\tonChange?: (value: T) => void;\n\tlabel?: string;\n\tdescription?: string;\n\tdisabled?: boolean;\n\tclassName?: string;\n\tnoWrap?: true;\n\torientation?: \"vertical\" | \"horizontal\";\n\t\"aria-label\"?: string;\n\tchildren: React.ReactNode;\n}\n\n/**\n * Группа радиокнопок с общим состоянием выбранного значения. Обеспечивает единый API выбора и контекст для дочерних опций.\n */\nexport function RadioGroup<T>({\n\tvalue,\n\tonChange,\n\tlabel,\n\tdescription,\n\tdisabled,\n\tclassName,\n\tnoWrap,\n\torientation = \"horizontal\",\n\t\"aria-label\": ariaLabel,\n\tchildren\n}: RadioGroupProps<T>) {\n\tconst groupId = useId();\n\tconst labelId = label ? `${groupId}-label` : undefined;\n\tconst descriptionId = description ? `${groupId}-description` : undefined;\n\tconst [registeredOptionIds, setRegisteredOptionIds] = useState<string[]>([]);\n\tconst handleChange = useCallback((nextValue: unknown) => onChange?.(nextValue as T), [onChange]);\n\n\t/**\n\t * Хранит порядок опций внутри группы, чтобы при отсутствии выбранного значения\n\t * оставлять ровно один tab stop на первой доступной радиокнопке.\n\t */\n\tconst registerOption = useCallback((optionId: string) => {\n\t\tsetRegisteredOptionIds((currentIds) => (currentIds.includes(optionId) ? currentIds : [...currentIds, optionId]));\n\n\t\treturn () => {\n\t\t\tsetRegisteredOptionIds((currentIds) => currentIds.filter((currentId) => currentId !== optionId));\n\t\t};\n\t}, []);\n\n\tconst contextValue = useMemo(\n\t\t() => ({\n\t\t\tvalue,\n\t\t\tonChange: handleChange,\n\t\t\tdisabled,\n\t\t\torientation,\n\t\t\tgroupId,\n\t\t\tlabelId,\n\t\t\tdescriptionId,\n\t\t\tfirstOptionId: registeredOptionIds[0],\n\t\t\tregisterOption\n\t\t}),\n\t\t[descriptionId, disabled, groupId, handleChange, labelId, orientation, registerOption, registeredOptionIds, value]\n\t);\n\n\treturn (\n\t\t<div className={cn(uiStyles.uiElement, disabled && uiStyles.disabled, className)}>\n\t\t\t{label && (\n\t\t\t\t<div id={labelId} className={uiStyles.uiLabel}>\n\t\t\t\t\t{label}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{description && (\n\t\t\t\t<div id={descriptionId} className={uiStyles.uiDescription}>\n\t\t\t\t\t{description}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<RadioGroupContext.Provider value={contextValue}>\n\t\t\t\t<div\n\t\t\t\t\trole=\"radiogroup\"\n\t\t\t\t\taria-labelledby={labelId}\n\t\t\t\t\taria-label={labelId ? undefined : ariaLabel}\n\t\t\t\t\taria-describedby={descriptionId}\n\t\t\t\t\taria-disabled={disabled || undefined}\n\t\t\t\t\tdata-disabled={disabled || undefined}\n\t\t\t\t\tclassName={cn(uiStyles.uiInputControl, styles.radioGroup, noWrap && styles.noWrap, styles[orientation])}>\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t</RadioGroupContext.Provider>\n\t\t</div>\n\t);\n}\n\ninterface OptionProps<T> {\n\tvalue: T;\n\tlabel: ReactNode;\n\tdescription?: ReactNode;\n\tclassName?: string;\n}\n\n/**\n * Опция внутри `RadioGroup`, представляющая одно выбираемое значение. Отрисовывает подпись, описание и состояние выбора.\n */\nexport function Option<T>({ value, label, description, className }: OptionProps<T>) {\n\tconst context = useContext(RadioGroupContext);\n\tconst optionId = useId();\n\tconst registerOption = context?.registerOption;\n\n\tuseLayoutEffect(() => {\n\t\tif (!registerOption) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn registerOption(optionId);\n\t}, [registerOption, optionId]);\n\n\tif (!context) {\n\t\treturn (\n\t\t\t<div className={cn(styles.radioItem, className)}>\n\t\t\t\t<p className=\"textNoWrap\">{label}</p>\n\t\t\t\t{description && <div className=\"fontSizeSm content2\">{description}</div>}\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst isChecked = Object.is(context.value, value);\n\tconst isDisabled = context.disabled === true;\n\tconst isFallbackTabStop = context.value === undefined && context.firstOptionId === optionId;\n\n\tconst handleChange = () => {\n\t\tif (isDisabled || isChecked) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontext.onChange?.(value);\n\t};\n\n\t// TODO: логика переиспользуемая, надо вынести в хук\n\tconst handleKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n\t\tif (isDisabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (handleKeyboardActivation(event, handleChange)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentTarget = event.currentTarget;\n\t\tconst groupElement = currentTarget.closest<HTMLElement>('[role=\"radiogroup\"]');\n\t\tconst radioItems = Array.from(groupElement?.querySelectorAll<HTMLButtonElement>('[role=\"radio\"]:not([disabled])') ?? []);\n\n\t\tif (!radioItems.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentIndex = radioItems.indexOf(currentTarget);\n\t\tif (currentIndex === -1) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst nextIndex = getRovingFocusTargetIndex({\n\t\t\tcurrentIndex,\n\t\t\titemCount: radioItems.length,\n\t\t\tkey: event.key,\n\t\t\torientation: context.orientation\n\t\t});\n\n\t\tif (nextIndex === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\t\tradioItems[nextIndex]?.focus();\n\t\tradioItems[nextIndex]?.click();\n\t};\n\n\treturn (\n\t\t<button\n\t\t\tid={`${context.groupId}-option-${optionId}`}\n\t\t\ttype=\"button\"\n\t\t\trole=\"radio\"\n\t\t\taria-checked={isChecked}\n\t\t\tdisabled={isDisabled}\n\t\t\ttabIndex={isChecked || isFallbackTabStop ? 0 : -1}\n\t\t\tclassName={cn(styles.radioItem, isChecked && styles.checked, className)}\n\t\t\tdata-ui=\"radio-option\"\n\t\t\tdata-action=\"select-radio-option\"\n\t\t\tonClick={handleChange}\n\t\t\tonKeyDown={handleKeyDown}>\n\t\t\t<span className=\"textNoWrap\">{label}</span>\n\t\t\t{description && <span className=\"fontSizeSm\">{description}</span>}\n\t\t</button>\n\t);\n}\n\nRadioGroup.Option = Option;\n"],"mappings":"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"}
|