@ryuzaki13/react-foundation-ui 1.8.2 → 1.8.3
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 +8 -8
- package/dist/badge/index.js +1 -1
- package/dist/base-table/index.js +1 -1
- package/dist/button/index.js +1 -1
- package/dist/check-box/index.js +1 -1
- package/dist/chunks/{CalendarView-DGElHRTJ.js → CalendarView-BJx6akIp.js} +2 -2
- package/dist/chunks/{CalendarView-DGElHRTJ.js.map → CalendarView-BJx6akIp.js.map} +1 -1
- package/dist/chunks/CheckBox.module-C5SjPwSj.js.map +1 -1
- package/dist/chunks/{TextEditorLexicalClient-C6b5N8AO.js → TextEditorLexicalClient-Ca89d-Db.js} +6 -6
- package/dist/chunks/{TextEditorLexicalClient-C6b5N8AO.js.map → TextEditorLexicalClient-Ca89d-Db.js.map} +1 -1
- package/dist/chunks/{badge-DMM8cOHd.js → badge-DUI2ET6q.js} +2 -2
- package/dist/chunks/{badge-DMM8cOHd.js.map → badge-DUI2ET6q.js.map} +1 -1
- package/dist/chunks/{base-table-DNSYOO9t.js → base-table-CsnUiMTe.js} +2 -2
- package/dist/chunks/{base-table-DNSYOO9t.js.map → base-table-CsnUiMTe.js.map} +1 -1
- package/dist/chunks/{button-BsvHGWPc.js → button-C53OkqTg.js} +3 -3
- package/dist/chunks/{button-BsvHGWPc.js.map → button-C53OkqTg.js.map} +1 -1
- package/dist/chunks/{check-box-sfGjYczQ.js → check-box-CC8CDnSR.js} +3 -3
- package/dist/chunks/{check-box-sfGjYczQ.js.map → check-box-CC8CDnSR.js.map} +1 -1
- package/dist/chunks/context-menu-C8sA7xCN.js +525 -0
- package/dist/chunks/context-menu-C8sA7xCN.js.map +1 -0
- package/dist/chunks/{date-input-C4GcKul6.js → date-input-g6l1iDmf.js} +5 -5
- package/dist/chunks/{date-input-C4GcKul6.js.map → date-input-g6l1iDmf.js.map} +1 -1
- package/dist/chunks/defaultRenderers-Dbhg2hHc.js +38 -0
- package/dist/chunks/defaultRenderers-Dbhg2hHc.js.map +1 -0
- package/dist/chunks/{input-CCdBtl-C.js → input-d08WN5FV.js} +2 -2
- package/dist/chunks/{input-CCdBtl-C.js.map → input-d08WN5FV.js.map} +1 -1
- package/dist/chunks/{input-files-TXdXrSAs.js → input-files-_NdSQM_3.js} +3 -3
- package/dist/chunks/{input-files-TXdXrSAs.js.map → input-files-_NdSQM_3.js.map} +1 -1
- package/dist/chunks/{input-search-Ca8iqeK2.js → input-search-BjtTMoRu.js} +2 -2
- package/dist/chunks/{input-search-Ca8iqeK2.js.map → input-search-BjtTMoRu.js.map} +1 -1
- package/dist/chunks/{modal-DLRYn-Lr.js → modal-Bar-j5a4.js} +2 -2
- package/dist/chunks/{modal-DLRYn-Lr.js.map → modal-Bar-j5a4.js.map} +1 -1
- package/dist/chunks/multi-select-Cvjz9W07.js +466 -0
- package/dist/chunks/multi-select-Cvjz9W07.js.map +1 -0
- package/dist/chunks/picker-0I1yMKIY.js +435 -0
- package/dist/chunks/picker-0I1yMKIY.js.map +1 -0
- package/dist/chunks/{radio-group-BAeJjyZ5.js → radio-group-DhpP7JSJ.js} +2 -2
- package/dist/chunks/{radio-group-BAeJjyZ5.js.map → radio-group-DhpP7JSJ.js.map} +1 -1
- package/dist/chunks/select-CUQ91FIc.js +363 -0
- package/dist/chunks/select-CUQ91FIc.js.map +1 -0
- package/dist/chunks/{table-RO4dfMAj.js → table-z9kyd9U3.js} +2 -2
- package/dist/chunks/{table-RO4dfMAj.js.map → table-z9kyd9U3.js.map} +1 -1
- package/dist/chunks/{ui.module-DHVTOqZ0.js → ui.module-BsDio9A3.js} +4 -3
- package/dist/chunks/ui.module-BsDio9A3.js.map +1 -0
- package/dist/chunks/{uiClasses-UkaejTdf.js → uiClasses-BVwFzzsr.js} +2 -2
- package/dist/chunks/{uiClasses-UkaejTdf.js.map → uiClasses-BVwFzzsr.js.map} +1 -1
- package/dist/chunks/useODataSelectBase-DR4PrY1j.js +117 -0
- package/dist/chunks/useODataSelectBase-DR4PrY1j.js.map +1 -0
- package/dist/context-menu/components/ContextMenu.d.ts +2 -1
- package/dist/context-menu/components/ContextMenu.d.ts.map +1 -1
- package/dist/context-menu/components/DropdownMenu.d.ts +2 -1
- package/dist/context-menu/components/DropdownMenu.d.ts.map +1 -1
- package/dist/context-menu/components/MenuContent.d.ts.map +1 -1
- package/dist/context-menu/components/MenuItem.d.ts +6 -6
- package/dist/context-menu/components/MenuItem.d.ts.map +1 -1
- package/dist/context-menu/components/MenuRoot.d.ts +1 -1
- package/dist/context-menu/components/MenuRoot.d.ts.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 +3 -3
- package/dist/disclosure/index.js +2 -2
- package/dist/drop-zone/index.js +1 -1
- package/dist/expandable-action-panel/index.js +1 -1
- package/dist/image/index.js +4 -4
- package/dist/input/index.js +1 -1
- package/dist/input-date-time/index.js +2 -2
- package/dist/input-file/index.js +2 -2
- package/dist/input-files/index.js +1 -1
- package/dist/input-image/index.js +2 -2
- package/dist/input-search/index.js +1 -1
- package/dist/layout-picker/index.js +66 -68
- package/dist/layout-picker/index.js.map +1 -1
- package/dist/layout-picker/ui/LayoutPicker.d.ts.map +1 -1
- package/dist/listbox/Listbox.d.ts +1 -1
- package/dist/listbox/Listbox.d.ts.map +1 -1
- package/dist/listbox/index.js +71 -59
- package/dist/listbox/index.js.map +1 -1
- package/dist/modal/index.js +1 -1
- package/dist/multi-select/index.js +2 -2
- package/dist/multi-select/ui/MultiSelect.d.ts +11 -1
- package/dist/multi-select/ui/MultiSelect.d.ts.map +1 -1
- package/dist/multi-select/ui/defaultRenderers.d.ts +6 -4
- package/dist/multi-select/ui/defaultRenderers.d.ts.map +1 -1
- package/dist/multi-select/ui/index.d.ts +0 -1
- package/dist/multi-select/ui/index.d.ts.map +1 -1
- package/dist/notifications/index.js +1 -1
- package/dist/option/CustomOptionButton.d.ts +6 -0
- package/dist/option/CustomOptionButton.d.ts.map +1 -0
- package/dist/option/Option.d.ts +14 -0
- package/dist/option/Option.d.ts.map +1 -0
- package/dist/option/OptionButton.d.ts +8 -0
- package/dist/option/OptionButton.d.ts.map +1 -0
- package/dist/option/OptionCode.d.ts +6 -0
- package/dist/option/OptionCode.d.ts.map +1 -0
- package/dist/option/OptionContent.d.ts +19 -0
- package/dist/option/OptionContent.d.ts.map +1 -0
- package/dist/option/OptionHotkey.d.ts +6 -0
- package/dist/option/OptionHotkey.d.ts.map +1 -0
- package/dist/option/OptionIcon.d.ts +6 -0
- package/dist/option/OptionIcon.d.ts.map +1 -0
- package/dist/option/OptionLink.d.ts +8 -0
- package/dist/option/OptionLink.d.ts.map +1 -0
- package/dist/option/OptionText.d.ts +6 -0
- package/dist/option/OptionText.d.ts.map +1 -0
- package/dist/option/index.d.ts +10 -0
- package/dist/option/index.d.ts.map +1 -0
- package/dist/option/index.js +112 -0
- package/dist/option/index.js.map +1 -0
- package/dist/picker/PickerClearButton.d.ts +9 -0
- package/dist/picker/PickerClearButton.d.ts.map +1 -0
- package/dist/picker/PickerOptions.d.ts +22 -0
- package/dist/picker/PickerOptions.d.ts.map +1 -0
- package/dist/picker/PickerPlaceholder.d.ts +14 -0
- package/dist/picker/PickerPlaceholder.d.ts.map +1 -0
- package/dist/picker/PickerPopup.d.ts +4 -3
- package/dist/picker/PickerPopup.d.ts.map +1 -1
- package/dist/picker/PickerSelectedToken.d.ts +7 -0
- package/dist/picker/PickerSelectedToken.d.ts.map +1 -0
- package/dist/picker/PickerTrigger.d.ts +29 -0
- package/dist/picker/PickerTrigger.d.ts.map +1 -0
- package/dist/picker/PickerTriggerActions.d.ts.map +1 -1
- package/dist/picker/PickerTriggerInput.d.ts +1 -2
- package/dist/picker/PickerTriggerInput.d.ts.map +1 -1
- package/dist/picker/index.d.ts +5 -0
- package/dist/picker/index.d.ts.map +1 -1
- package/dist/picker/index.js +2 -2
- package/dist/picker/model/extractPickerTextContent.d.ts +1 -1
- package/dist/picker/model/extractPickerTextContent.d.ts.map +1 -1
- package/dist/preset-range-date-input/index.js +1 -1
- package/dist/preset-select/PresetSelect.d.ts +1 -1
- package/dist/preset-select/PresetSelect.d.ts.map +1 -1
- package/dist/preset-select/index.js +1 -1
- package/dist/preset-select/index.js.map +1 -1
- package/dist/radio-button/index.js +2 -2
- package/dist/radio-group/index.js +1 -1
- package/dist/select/Select.d.ts +4 -2
- package/dist/select/Select.d.ts.map +1 -1
- package/dist/select/SelectOptionGroup.d.ts +1 -1
- package/dist/select/SelectOptionGroup.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 +3 -3
- package/dist/state-select/StateSelect.d.ts +1 -1
- package/dist/state-select/StateSelect.d.ts.map +1 -1
- package/dist/state-select/index.js +1 -1
- package/dist/state-select/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/switch/index.js +1 -1
- package/dist/table/index.js +1 -1
- package/dist/table-sorting/index.js +1 -1
- package/dist/tabs/index.js +2 -2
- package/dist/tag-input/index.js +2 -2
- package/dist/text-editor/index.js +1 -1
- package/dist/textarea/index.js +2 -2
- package/dist/toggle/index.js +1 -1
- package/dist/tree-select/TreeMultiSelect.d.ts.map +1 -1
- package/dist/tree-select/TreeNodeContent.d.ts +2 -1
- package/dist/tree-select/TreeNodeContent.d.ts.map +1 -1
- package/dist/tree-select/TreePickerBase.d.ts +4 -1
- package/dist/tree-select/TreePickerBase.d.ts.map +1 -1
- package/dist/tree-select/index.js +322 -353
- package/dist/tree-select/index.js.map +1 -1
- package/dist/tree-table/index.js +1 -1
- package/package.json +5 -1
- package/src/styles/themes/_interactive-surface.scss +67 -0
- package/storybook-static/assets/{Badge-Dis0WdSI.js → Badge-Wsl03RiZ.js} +1 -1
- package/storybook-static/assets/{Badge.stories-DKUJOyg3.js → Badge.stories-C5FJ05zx.js} +1 -1
- package/storybook-static/assets/{BadgeList-C_ImRsat.js → BadgeList-DHcmb--r.js} +1 -1
- package/storybook-static/assets/{Button-BSsRzaxX.js → Button-9Vdg-8pF.js} +1 -1
- package/storybook-static/assets/{Button-DxGg9rB3.js → Button-CEzU6vMY.js} +1 -1
- package/storybook-static/assets/{Button.stories-fHvDvt2w.js → Button.stories-BfDF7T_l.js} +1 -1
- package/storybook-static/assets/{CalendarView-BFcwl9Vq.js → CalendarView-DCLQ6cmR.js} +1 -1
- package/storybook-static/assets/{CheckBox-CSbi2BEU.js → CheckBox-BJ3STl44.js} +1 -1
- package/storybook-static/assets/CheckBox-DWrG0yT0.css +1 -0
- package/storybook-static/assets/{CheckBox-SuVeN-FY.js → CheckBox-UlZDcbgz.js} +1 -1
- package/storybook-static/assets/{CheckBox.stories-C6PF0zG1.js → CheckBox.stories-Pt5RIIb4.js} +1 -1
- package/storybook-static/assets/{Color-6AOWCN3U-DX3p6XEG.js → Color-6AOWCN3U-3Ir6qwTW.js} +1 -1
- package/storybook-static/assets/ContextMenu-BrYtLHPB.css +1 -0
- package/storybook-static/assets/{ContextMenu-f0QZPgBQ.js → ContextMenu-CU7qp0QU.js} +1 -1
- package/storybook-static/assets/ContextMenu-teXimUtT.js +1 -0
- package/storybook-static/assets/ContextMenu.stories-BhkVXZCg.js +37 -0
- package/storybook-static/assets/CustomOptionButton-BWYYtI_M.js +1 -0
- package/storybook-static/assets/{DateInput-BmL4c3wO.js → DateInput-B0xrPmg8.js} +1 -1
- package/storybook-static/assets/{DateInput-C0K0JvWe.js → DateInput-CRNvZef4.js} +1 -1
- package/storybook-static/assets/{DateInput.stories-65WMYAML.js → DateInput.stories-CrMRn_FQ.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-DdpNa-Yj.js → DateRangePresetSelect-B96SINg3.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-DVAqXJt1.js → DateRangePresetSelect-BGdt7rCz.js} +1 -1
- package/storybook-static/assets/DateRangePresetSelect.stories-B20eqYGr.js +19 -0
- package/storybook-static/assets/{Detail-1rmVP04K.js → Detail-CUNNfYz6.js} +1 -1
- package/storybook-static/assets/{Detail.stories-CW2YXAPy.js → Detail.stories-DPp7roXv.js} +1 -1
- package/storybook-static/assets/{Dialog-DcdGv_Bv.js → Dialog-B7eTlIWU.js} +1 -1
- package/storybook-static/assets/{Dialog-CszRheXL.js → Dialog-DdONtJUb.js} +1 -1
- package/storybook-static/assets/{Dialog.stories-CN9vtGuI.js → Dialog.stories-CF6Q0tJ-.js} +1 -1
- package/storybook-static/assets/{Disclosure-DWeZZ2i8.js → Disclosure-BI4KMSDK.js} +1 -1
- package/storybook-static/assets/{Disclosure.stories-pZXR5BOM.js → Disclosure.stories-BaTneJlv.js} +1 -1
- package/storybook-static/assets/{DisclosureGroup-BWba17wI.js → DisclosureGroup-Dx2-SHha.js} +1 -1
- package/storybook-static/assets/{DocsRenderer-JROSPFPF-BYN3Mg4U.js → DocsRenderer-JROSPFPF-mMjwDILp.js} +1 -1
- package/storybook-static/assets/{DropZone-ByDIyQgI.js → DropZone-BizNinsQ.js} +1 -1
- package/storybook-static/assets/{DropZone-BCe20YiO.js → DropZone-D93x3skJ.js} +1 -1
- package/storybook-static/assets/{DropZone.stories-CLXe7D8H.js → DropZone.stories-Dn72HUME.js} +1 -1
- package/storybook-static/assets/{DropdownMenu-BD-pc32j.js → DropdownMenu-Bpjyamf_.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel-v-DZaEKX.js → ExpandableActionPanel-Q4xXTfPB.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel.stories-BhHYM4mJ.js → ExpandableActionPanel.stories-Dr40xqrz.js} +1 -1
- package/storybook-static/assets/{Flex-DukB58MF.js → Flex-Qj0CmbNT.js} +1 -1
- package/storybook-static/assets/{Flex.stories-DQmoW5jb.js → Flex.stories-CMB4ZAgy.js} +1 -1
- package/storybook-static/assets/{FloatingPopover-fnwAyZil.js → FloatingPopover-jH57LEGX.js} +1 -1
- package/storybook-static/assets/{FormattedTableCell-CK1yXePp.js → FormattedTableCell-vbqJ5gib.js} +1 -1
- package/storybook-static/assets/{Grid-BoLaxbR_.js → Grid-AZBb1w5n.js} +1 -1
- package/storybook-static/assets/{Grid.stories-CSuOTbao.js → Grid.stories-BaeYzAP-.js} +1 -1
- package/storybook-static/assets/{ImageCropper.stories-BRi_qlO4.js → ImageCropper.stories-Da9IaNLO.js} +1 -1
- package/storybook-static/assets/{ImageRenderer-BiV2g53B.js → ImageRenderer-CNFqjqvE.js} +1 -1
- package/storybook-static/assets/{ImageRenderer.stories-Da7QE7_Q.js → ImageRenderer.stories-8pPWqLHi.js} +1 -1
- package/storybook-static/assets/{ImageView.stories-DSFBxOa6.js → ImageView.stories-P0OBwcHv.js} +1 -1
- package/storybook-static/assets/{ImageViewer.stories-D2rcovap.js → ImageViewer.stories-A8gBQaCk.js} +2 -2
- package/storybook-static/assets/{ImageViewerRuntime-B2CS1UFL.js → ImageViewerRuntime-C2LHl9xa.js} +1 -1
- package/storybook-static/assets/{Input-BIy4zhlA.js → Input-LI8Ij2VV.js} +1 -1
- package/storybook-static/assets/{Input-CVs7SVMJ.js → Input-X5FLaExp.js} +1 -1
- package/storybook-static/assets/{Input.stories-BBXrateo.js → Input.stories-r4hSNMWI.js} +1 -1
- package/storybook-static/assets/{InputDateTime-VUiW2Znv.js → InputDateTime-B9IQGLxQ.js} +1 -1
- package/storybook-static/assets/{InputDateTime.stories-lqECZY7T.js → InputDateTime.stories-t-IFoW6A.js} +1 -1
- package/storybook-static/assets/{InputFile-DEeRFq2f.js → InputFile-YhjpMsir.js} +1 -1
- package/storybook-static/assets/{InputFile-D0aHVW1q.js → InputFile-yUYuRSfc.js} +1 -1
- package/storybook-static/assets/{InputFile.stories-9fBhIus4.js → InputFile.stories-DvMCOp6p.js} +1 -1
- package/storybook-static/assets/{InputFiles-DTy038xW.js → InputFiles-Dq9QZAWM.js} +1 -1
- package/storybook-static/assets/{InputFiles-C_KIqiN9.js → InputFiles-b6Ne7Ph9.js} +1 -1
- package/storybook-static/assets/{InputFiles.stories-CspkI6-Y.js → InputFiles.stories-Q7rdTg-e.js} +1 -1
- package/storybook-static/assets/{InputFilesList-BQdSFOI1.js → InputFilesList-u59R9lsq.js} +1 -1
- package/storybook-static/assets/{InputImage-VJaqApEh.js → InputImage-BTap4i1_.js} +1 -1
- package/storybook-static/assets/{InputImage-C0kyUtT0.js → InputImage-_b_bmfXz.js} +1 -1
- package/storybook-static/assets/{InputImage.stories-DKXeva5i.js → InputImage.stories-F08TWbxk.js} +1 -1
- package/storybook-static/assets/{InteractiveComponents-B8zzCcZ_.js → InteractiveComponents-CpJd5e3W.js} +1 -1
- package/storybook-static/assets/{InteractiveComponents.stories-DP0Jma43.js → InteractiveComponents.stories-CM9yNzcF.js} +1 -1
- package/storybook-static/assets/LayoutPicker-8Q1MpMYR.js +376 -0
- package/storybook-static/assets/LayoutPicker-BY4-fUQa.css +1 -0
- package/storybook-static/assets/{LayoutPicker-BpcPcCDz.js → LayoutPicker-vwoAIGrk.js} +1 -1
- package/storybook-static/assets/{LayoutPicker.stories-POpVHww7.js → LayoutPicker.stories-BW8B8i8S.js} +1 -1
- package/storybook-static/assets/{Listbox-gHitzePa.js → Listbox-Cf_DMAva.js} +1 -1
- package/storybook-static/assets/Listbox-D7r9R1Of.js +1 -0
- package/storybook-static/assets/{Listbox.stories-Dw3IdYZA.js → Listbox.stories-CxYyfkFU.js} +1 -1
- package/storybook-static/assets/{Modal-CY7qfD1u.js → Modal-BaprwyBJ.js} +1 -1
- package/storybook-static/assets/{Modal.stories-Boa7oW-a.js → Modal.stories-Rn_bgNdm.js} +1 -1
- package/storybook-static/assets/{ModalManagerProvider-GYXaQe-7.js → ModalManagerProvider-BoJChAx2.js} +1 -1
- package/storybook-static/assets/MultiSelect-CILXhKyj.js +2 -0
- package/storybook-static/assets/{MultiSelect-DToMWi-I.js → MultiSelect-CU7avopN.js} +1 -1
- package/storybook-static/assets/MultiSelect-DI_UD1B-.css +1 -0
- package/storybook-static/assets/{MultiSelect.stories-DLuXOl9Q.js → MultiSelect.stories-DFtFExi3.js} +1 -1
- package/storybook-static/assets/{NoData-Bzj7vNCz.js → NoData-u6T3MI60.js} +1 -1
- package/storybook-static/assets/{NotificationsHost-Bs93X8Nv.js → NotificationsHost-63IJh9Kr.js} +1 -1
- package/storybook-static/assets/{NotificationsHost.stories-DxVOVOf8.js → NotificationsHost.stories-CRKVOYWB.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect-Dh33YJP6.js → ODataMultiSelect-tfqbyVgv.js} +1 -1
- package/storybook-static/assets/ODataMultiSelect.stories-DuC1gg-Q.js +126 -0
- package/storybook-static/assets/{ODataSelect-lpN9sKth.js → ODataSelect-0ax3OIQy.js} +1 -1
- package/storybook-static/assets/ODataSelect.stories-aGZEvBIO.js +148 -0
- package/storybook-static/assets/{ODataTreeMultiSelect-DFY2FJBX.js → ODataTreeMultiSelect-C4ZN4DaL.js} +1 -1
- package/storybook-static/assets/ODataTreeMultiSelect.stories-BThoYYsE.js +74 -0
- package/storybook-static/assets/{ODataTreeSelect-DdniMRRE.js → ODataTreeSelect-DvrUSJsi.js} +1 -1
- package/storybook-static/assets/ODataTreeSelect.stories-B9582VZ6.js +46 -0
- package/storybook-static/assets/{OneStepScroller-CHvIHlYx.js → OneStepScroller-BoIh7KcH.js} +1 -1
- package/storybook-static/assets/Option-CJBK9i2B.css +1 -0
- package/storybook-static/assets/Option-DqmRqyOQ.js +10 -0
- package/storybook-static/assets/OptionButton-CQVIwI2y.js +1 -0
- package/storybook-static/assets/{PeriodSelect-BgAak8GG.js → PeriodSelect-CdTxjZC3.js} +1 -1
- package/storybook-static/assets/{PeriodSelect-T1qaj11S.js → PeriodSelect-Dw3EsMrL.js} +1 -1
- package/storybook-static/assets/{PeriodSelect.stories-DYEtD47p.js → PeriodSelect.stories-DYinImmY.js} +1 -1
- package/storybook-static/assets/PickerTriggerActions-B0z5qfFF.js +1 -0
- package/storybook-static/assets/{Popover-DQKHL6wc.js → Popover-0xwjVe6K.js} +1 -1
- package/storybook-static/assets/{Popover-BVP-wMdK.js → Popover-ijEoQcUp.js} +1 -1
- package/storybook-static/assets/{Popover.stories-Pt4-7Aof.js → Popover.stories-CMNjjwu5.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-DQ3rlCp5.js → PresetRangeDateInput-CdvdO4mf.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-C4_NegG_.js → PresetRangeDateInput-DysqM_NV.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput.stories-3AzmySZv.js → PresetRangeDateInput.stories-nVojLSRm.js} +1 -1
- package/storybook-static/assets/{PresetSelect-BTh53LoO.js → PresetSelect-mjBaMbt6.js} +1 -1
- package/storybook-static/assets/{RadioButton-Ci25eUL_.js → RadioButton-CVGKMhGV.js} +1 -1
- package/storybook-static/assets/{RadioButton-BfBSX73Y.js → RadioButton-jB744vXz.js} +1 -1
- package/storybook-static/assets/{RadioButton.stories-JVGXFlz8.js → RadioButton.stories-CJsU4D3L.js} +1 -1
- package/storybook-static/assets/{RadioGroup-CL7EHd6O.js → RadioGroup-BGF3aoOc.js} +1 -1
- package/storybook-static/assets/{RadioGroup-CW39hD_-.js → RadioGroup-DbqvBGw3.js} +1 -1
- package/storybook-static/assets/{RadioGroup.stories-MS9Jl6AT.js → RadioGroup.stories-Bkny6-9V.js} +1 -1
- package/storybook-static/assets/{Scrollable-Bo4197LC.js → Scrollable-DZp3ByoS.js} +1 -1
- package/storybook-static/assets/{Select-CxQqH8H5.js → Select-BJcT2K35.js} +1 -1
- package/storybook-static/assets/Select-CcuhYAW8.js +12 -0
- package/storybook-static/assets/{Select.stories-DfjNWXba.js → Select.stories-BowB7kdj.js} +1 -1
- package/storybook-static/assets/{SerializableSelect-BktENdyg.js → SerializableSelect-DRczsfxk.js} +1 -1
- package/storybook-static/assets/{SerializableSelect.stories-B8zxcu66.js → SerializableSelect.stories-BcYeXF_R.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput-DZBRm3dM.js → SingleDateTimeInput-HDsmYVP2.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput-DvpU1DkI.js → SingleDateTimeInput-pHA1ci5g.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput.stories-Bku5Zc05.js → SingleDateTimeInput.stories-KUrLpnh_.js} +1 -1
- package/storybook-static/assets/{Slider-BN2xXBOi.js → Slider-DaJGOEf-.js} +1 -1
- package/storybook-static/assets/{Slider-BJkB6IoW.js → Slider-XnQRU_In.js} +1 -1
- package/storybook-static/assets/{Slider.stories-CM3yNojO.js → Slider.stories-ByS4Bo7v.js} +1 -1
- package/storybook-static/assets/{SliderInput-CPX2bJK3.js → SliderInput-BjyCba0D.js} +1 -1
- package/storybook-static/assets/{SliderInput-2ZiuvbpQ.js → SliderInput-Dan5pyQh.js} +1 -1
- package/storybook-static/assets/{SliderInput.stories-dJX-tRtA.js → SliderInput.stories-d4F5pqct.js} +1 -1
- package/storybook-static/assets/{Sortable-Bkr-xnO4.js → Sortable-Bdzx4D0R.js} +1 -1
- package/storybook-static/assets/{Sortable.stories-BPEg99e5.js → Sortable.stories-BIhgYQ1m.js} +1 -1
- package/storybook-static/assets/{Splitter-D4en_f5n.js → Splitter-B3hepEkw.js} +1 -1
- package/storybook-static/assets/{Splitter.stories-Cynn_kHV.js → Splitter.stories-L6R3ImTr.js} +1 -1
- package/storybook-static/assets/{StateSelect-BgbwMGGc.js → StateSelect-C4oHSG2B.js} +1 -1
- package/storybook-static/assets/{StateSelect-PcH0VuO_.js → StateSelect-CylM2NVF.js} +3 -3
- package/storybook-static/assets/{StateSelect.stories-CShqVH9Y.js → StateSelect.stories-Djw_nuLJ.js} +1 -1
- package/storybook-static/assets/{StringToggle.stories-CypR3oB_.js → StringToggle.stories-pqZzNPRQ.js} +1 -1
- package/storybook-static/assets/{Switch-D-cSDh8j.js → Switch-BK5DQYpV.js} +1 -1
- package/storybook-static/assets/{Switch-BVN6TcVZ.js → Switch-BkHwzkeD.js} +1 -1
- package/storybook-static/assets/{Switch.stories-C0s7gvBf.js → Switch.stories-BG1MHajd.js} +1 -1
- package/storybook-static/assets/{Table-CwXJDDe6.js → Table-BQPiMPmF.js} +1 -1
- package/storybook-static/assets/{Table.stories-vqttnROX.js → Table.stories-b5gmGDu_.js} +1 -1
- package/storybook-static/assets/{Tabs-BRSEvQpk.js → Tabs-B13rDpZt.js} +1 -1
- package/storybook-static/assets/{Tabs.stories-R_7jiTQc.js → Tabs.stories-D0sg-2Nx.js} +1 -1
- package/storybook-static/assets/{TabsBox-CqSxAUdJ.js → TabsBox-DZwTlYNa.js} +1 -1
- package/storybook-static/assets/{TagInput-C3ahaF-B.js → TagInput-RYhIr0kM.js} +1 -1
- package/storybook-static/assets/{TagInput.stories-C3O2gBUY.js → TagInput.stories-7iTWdjmj.js} +1 -1
- package/storybook-static/assets/{Text-b8fMr5Hd.js → Text-5-YdhIB8.js} +1 -1
- package/storybook-static/assets/{Textarea-CCgxNL6F.js → Textarea-0L2M-xFG.js} +1 -1
- package/storybook-static/assets/{Textarea-BDL_MwcM.js → Textarea-pQp1ju2W.js} +1 -1
- package/storybook-static/assets/{Textarea.stories-kc_LXBix.js → Textarea.stories-pJFWbXcf.js} +1 -1
- package/storybook-static/assets/{TimePanel-BCotjEKQ.js → TimePanel-DlfW-4Rv.js} +1 -1
- package/storybook-static/assets/{TimePanel.stories-B8paqA-_.js → TimePanel.stories-DpXHb66k.js} +1 -1
- package/storybook-static/assets/{Toggle-CT4IyZPI.js → Toggle-CwgQ0NbP.js} +1 -1
- package/storybook-static/assets/{Toggle-CbsKNs_c.js → Toggle-Q04RQyAN.js} +1 -1
- package/storybook-static/assets/{Toggle.stories-YsQZk4DA.js → Toggle.stories-DOYwhorJ.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-DRLoUCXF.js → TreeMultiSelect--Z9jdUna.js} +1 -1
- package/storybook-static/assets/TreeMultiSelect-CcBXMmXH.js +1 -0
- package/storybook-static/assets/{TreeMultiSelect.stories-CV65ZVUo.js → TreeMultiSelect.stories-CSlNe1qA.js} +1 -1
- package/storybook-static/assets/TreePickerBase-B6DED6Hz.css +1 -0
- package/storybook-static/assets/TreePickerBase-BBHbtNFV.js +34 -0
- package/storybook-static/assets/{TreeSelect-FhEH7bMx.js → TreeSelect-BMcChauO.js} +1 -1
- package/storybook-static/assets/{TreeSelect-CsYGUC6s.js → TreeSelect-DMC-rviy.js} +1 -1
- package/storybook-static/assets/TreeSelect.stories-68LYkP9A.js +32 -0
- package/storybook-static/assets/{TreeTable-Bajr80HM.js → TreeTable-DNArfw0m.js} +1 -1
- package/storybook-static/assets/{TreeTable.stories-DDCGoB2u.js → TreeTable.stories-GybZTfJf.js} +1 -1
- package/storybook-static/assets/{async-CWrFMaux.js → async-BpUNPciD.js} +1 -1
- package/storybook-static/assets/{blocks-CrYcG0WD.js → blocks-CdL0FBl-.js} +3 -3
- package/storybook-static/assets/{browserAndReact-DSxaVMjM.js → browserAndReact-DJiCma8q.js} +1 -1
- package/storybook-static/assets/{check-Cnuffb78.js → check-Bff_8tRJ.js} +1 -1
- package/storybook-static/assets/{chevron-down-ChPfAmdy.js → chevron-down-D9beWxJi.js} +1 -1
- package/storybook-static/assets/{chevron-left-CEB5eAVk.js → chevron-left-0YewhZTT.js} +1 -1
- package/storybook-static/assets/{chevron-right-DHw2yjh1.js → chevron-right-_-7FrDV5.js} +1 -1
- package/storybook-static/assets/{chunk-W22LQPXL-i9Cm4c-p.js → chunk-W22LQPXL-O2d-a7Cd.js} +1 -1
- package/storybook-static/assets/{circle-alert-B0REyiCt.js → circle-alert-Ch96LToC.js} +1 -1
- package/storybook-static/assets/{circle-check-D6WZ24rj.js → circle-check-a4WDWsNJ.js} +1 -1
- package/storybook-static/assets/{components-BCe0UvQp.js → components-DdhcMCr2.js} +3 -3
- package/storybook-static/assets/{contextMenu-De66k1si.js → contextMenu-BGjkv4UB.js} +1 -1
- package/storybook-static/assets/defaultRenderers-V5HI39JH.js +1 -0
- package/storybook-static/assets/{download-C1DiezfA.js → download-CX1IvM3C.js} +1 -1
- package/storybook-static/assets/{filesAndExcel-BVMGH9OS.js → filesAndExcel-dK5pwBOD.js} +1 -1
- package/storybook-static/assets/{floating-ui.react-BswSORmJ.js → floating-ui.react-CxLdvcYS.js} +1 -1
- package/storybook-static/assets/{formatters-D27XMzPd.js → formatters-j9sx7DvH.js} +1 -1
- package/storybook-static/assets/{formatters-runtime-B_C8yQOS.js → formatters-runtime-CHMYu4ZC.js} +1 -1
- package/storybook-static/assets/{foundationLib-BmwSyi1e.js → foundationLib-C_06ZSSf.js} +1 -1
- package/storybook-static/assets/{hooks-CXlVTo5i.js → hooks-Bykafh9C.js} +1 -1
- package/storybook-static/assets/{iframe-Baz8D-0E.css → iframe-BIt4o49Q.css} +1 -1
- package/storybook-static/assets/{iframe-Bbj4T0X2.js → iframe-CIzkWNwp.js} +3 -3
- package/storybook-static/assets/iframe-sQ6b5u6U.js +1 -0
- package/storybook-static/assets/{info-D_YlGthq.js → info-DmoUv3Za.js} +1 -1
- package/storybook-static/assets/{odata-CDuIqs1a.js → odata-BOmzCjsk.js} +1 -1
- package/storybook-static/assets/{odataAndTables-D4R4KHZc.js → odataAndTables-CCmlxLmc.js} +1 -1
- package/storybook-static/assets/{odataFetchFn-Sw0FicJe.js → odataFetchFn-CTQe0sIR.js} +1 -1
- package/storybook-static/assets/{odataStoryFixtures-z1HaQHNb.js → odataStoryFixtures-BSZ-qA-M.js} +2 -2
- package/storybook-static/assets/{persisted-TRx901TV.js → persisted--WJ7KKPs.js} +1 -1
- package/storybook-static/assets/{pureUtilities-B8KVYaZx.js → pureUtilities-GyB4PF6P.js} +1 -1
- package/storybook-static/assets/{react-CTGFMmtV.js → react-BBjpR4Fr.js} +1 -1
- package/storybook-static/assets/{refresh-cw-BuhtDwqw.js → refresh-cw-Bc5fTdGR.js} +1 -1
- package/storybook-static/assets/{runtimeAndState-DDPlVhTs.js → runtimeAndState-B2HA42QC.js} +1 -1
- package/storybook-static/assets/{settings-2-DESCgIcH.js → settings-2-Cm9uvgs-.js} +1 -1
- package/storybook-static/assets/{sortable-BxGw7kip.js → sortable-U9GPAzJm.js} +1 -1
- package/storybook-static/assets/{syntaxhighlighter-T5IQBZDB-B0d7LXTh.js → syntaxhighlighter-T5IQBZDB-Do8Zvv4y.js} +1 -1
- package/storybook-static/assets/{trash-2-D0Ed43_3.js → trash-2-D6H0PpPX.js} +1 -1
- package/storybook-static/assets/{triangle-alert-CpgcfVSf.js → triangle-alert-5r13MQCo.js} +1 -1
- package/storybook-static/assets/{ui-BMhMvV6y.css → ui-CatTcSJL.css} +1 -1
- package/storybook-static/assets/ui.module-D4CuGr8r.js +1 -0
- package/storybook-static/assets/{uiClasses-DiXn3Hc-.js → uiClasses-CVGbL980.js} +1 -1
- package/storybook-static/assets/{useODataSelectBase-CFR7eJND.js → useODataSelectBase-bY7vnHqq.js} +1 -1
- package/storybook-static/assets/{useODataTreeData-DgEKknmd.js → useODataTreeData-Dsp1d8h5.js} +1 -1
- package/storybook-static/assets/usePickerQuery-BfayEntP.js +1 -0
- package/storybook-static/assets/usePickerTriggerController-B1Mub3-v.js +6 -0
- package/storybook-static/assets/{x-_GQ6nyHW.js → x-DpV1OV1-.js} +1 -1
- package/storybook-static/iframe.html +3 -3
- package/storybook-static/project.json +1 -1
- package/dist/chunks/context-menu-6nJkPmKV.js +0 -535
- package/dist/chunks/context-menu-6nJkPmKV.js.map +0 -1
- package/dist/chunks/multi-select-Clsst6DE.js +0 -538
- package/dist/chunks/multi-select-Clsst6DE.js.map +0 -1
- package/dist/chunks/picker-CrRdwdA5.js +0 -340
- package/dist/chunks/picker-CrRdwdA5.js.map +0 -1
- package/dist/chunks/select-B0xc6g81.js +0 -355
- package/dist/chunks/select-B0xc6g81.js.map +0 -1
- package/dist/chunks/ui.module-DHVTOqZ0.js.map +0 -1
- package/dist/chunks/useODataSelectBase-Bq36Wp1U.js +0 -141
- package/dist/chunks/useODataSelectBase-Bq36Wp1U.js.map +0 -1
- package/dist/multi-select/ui/MultiSelectOption.d.ts +0 -14
- package/dist/multi-select/ui/MultiSelectOption.d.ts.map +0 -1
- package/dist/multi-select/ui/MultiSelectToken.d.ts +0 -9
- package/dist/multi-select/ui/MultiSelectToken.d.ts.map +0 -1
- package/storybook-static/assets/CheckBox-BnO90VKX.css +0 -1
- package/storybook-static/assets/ContextMenu-BgzIzwzM.css +0 -1
- package/storybook-static/assets/ContextMenu-BhGu3QoC.js +0 -1
- package/storybook-static/assets/ContextMenu.stories-V9d5mjak.js +0 -37
- package/storybook-static/assets/DateRangePresetSelect.stories-BGgd7TOu.js +0 -19
- package/storybook-static/assets/LayoutPicker-DjUZ5y7M.js +0 -376
- package/storybook-static/assets/LayoutPicker-DudPIiwb.css +0 -1
- package/storybook-static/assets/Listbox-Cg1OczYK.js +0 -1
- package/storybook-static/assets/MultiSelect-D8qN-i5f.js +0 -2
- package/storybook-static/assets/ODataMultiSelect.stories-DUmFRMTU.js +0 -139
- package/storybook-static/assets/ODataSelect.stories-BkFs5uIY.js +0 -161
- package/storybook-static/assets/ODataTreeMultiSelect.stories-B_Izm4eH.js +0 -87
- package/storybook-static/assets/ODataTreeSelect.stories-DxNhuLVU.js +0 -55
- package/storybook-static/assets/PickerSelectionToolbar-DWtGYc4E.js +0 -2
- package/storybook-static/assets/PickerTriggerActions-BIH8_o_b.js +0 -1
- package/storybook-static/assets/Select-CO4ZHP9h.css +0 -1
- package/storybook-static/assets/Select-DBsWg0wv.js +0 -12
- package/storybook-static/assets/SelectOptionContent-Bie2pzia.js +0 -1
- package/storybook-static/assets/TreeMultiSelect-CmAa_Gin.js +0 -1
- package/storybook-static/assets/TreePickerBase-hyMFakp7.css +0 -1
- package/storybook-static/assets/TreePickerBase-rB-Q9Uwf.js +0 -24
- package/storybook-static/assets/TreeSelect.stories-Cw4IkrNG.js +0 -40
- package/storybook-static/assets/defaultRenderers-B7PDT-nL.css +0 -1
- package/storybook-static/assets/defaultRenderers-D0Z-7t0H.js +0 -1
- package/storybook-static/assets/iframe-DLZ4F2nx.js +0 -1
- package/storybook-static/assets/ui.module-CiLQZm_L.js +0 -1
- package/storybook-static/assets/usePickerQuery-Be3WSeUa.js +0 -1
- package/storybook-static/assets/usePickerTriggerController-BZZv-jDV.js +0 -1
- package/storybook-static/assets/usePickerTriggerController-DzBkX15M.css +0 -1
- /package/storybook-static/assets/{CheckBox.module-BNQm6HXI.js → CheckBox.module-CoYygdZx.js} +0 -0
|
@@ -0,0 +1,435 @@
|
|
|
1
|
+
import { t as e } from "./ui.module-BsDio9A3.js";
|
|
2
|
+
import { t } from "./grid-dI94AAbi.js";
|
|
3
|
+
import { a as n, c as r, d as i, i as a } from "./input-d08WN5FV.js";
|
|
4
|
+
import { t as o } from "./separator-B72Aq-6a.js";
|
|
5
|
+
import { forwardRef as s, isValidElement as c, useEffect as l, useMemo as u, useRef as d, useState as f } from "react";
|
|
6
|
+
import { cn as p } from "@ryuzaki13/react-foundation-lib/utils";
|
|
7
|
+
import { FloatingFocusManager as m, FloatingPortal as h } from "@floating-ui/react";
|
|
8
|
+
import { Fragment as g, jsx as _, jsxs as v } from "react/jsx-runtime";
|
|
9
|
+
import { ChevronDownIcon as y, XIcon as b } from "lucide-react";
|
|
10
|
+
import { useFloatingListbox as x } from "@ryuzaki13/react-foundation-lib/hooks";
|
|
11
|
+
import { normalizeTextToLower as S } from "@ryuzaki13/react-foundation-lib/formatters";
|
|
12
|
+
import { AnimatePresence as C, motion as w } from "motion/react";
|
|
13
|
+
//#region src/picker/PickerField.tsx
|
|
14
|
+
function T({ id: e, label: t, description: n, disabled: a, size: o, className: s, error: c, children: l }) {
|
|
15
|
+
let { controlId: u, labelId: d, descriptionId: f, errorId: p, describedBy: m } = i({
|
|
16
|
+
id: e,
|
|
17
|
+
hasLabel: t != null,
|
|
18
|
+
hasDescription: !!n,
|
|
19
|
+
hasError: !!c
|
|
20
|
+
});
|
|
21
|
+
return /* @__PURE__ */ _(r, {
|
|
22
|
+
label: t,
|
|
23
|
+
description: n,
|
|
24
|
+
disabled: a,
|
|
25
|
+
size: o,
|
|
26
|
+
className: s,
|
|
27
|
+
error: c,
|
|
28
|
+
controlId: u,
|
|
29
|
+
labelId: d,
|
|
30
|
+
descriptionId: f,
|
|
31
|
+
errorId: p,
|
|
32
|
+
children: l({
|
|
33
|
+
controlId: u,
|
|
34
|
+
labelId: d,
|
|
35
|
+
descriptionId: f,
|
|
36
|
+
errorId: p,
|
|
37
|
+
describedBy: m
|
|
38
|
+
})
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
//#endregion
|
|
42
|
+
//#region src/picker/PickerClearButton.tsx
|
|
43
|
+
function E({ disabled: t, ariaLabel: n = "Очистить выбор", onClear: r }) {
|
|
44
|
+
let i = (e) => {
|
|
45
|
+
e.preventDefault(), e.stopPropagation();
|
|
46
|
+
};
|
|
47
|
+
return /* @__PURE__ */ _("button", {
|
|
48
|
+
type: "button",
|
|
49
|
+
disabled: t,
|
|
50
|
+
className: e.uiClearButton,
|
|
51
|
+
"data-ui": "picker-clear-button",
|
|
52
|
+
"data-action": "clear-picker",
|
|
53
|
+
onMouseDown: i,
|
|
54
|
+
onClick: (e) => {
|
|
55
|
+
i(e), r();
|
|
56
|
+
},
|
|
57
|
+
"aria-label": n,
|
|
58
|
+
children: /* @__PURE__ */ _(b, {})
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
var D = {
|
|
62
|
+
options: "Fj-KxT",
|
|
63
|
+
popupPositioner: "_81qOBF",
|
|
64
|
+
optionsToolbar: "tCn0CX",
|
|
65
|
+
optionsBody: "pP2yXa",
|
|
66
|
+
status: "bupTWA",
|
|
67
|
+
statusError: "GkeyGF",
|
|
68
|
+
triggerContainer: "_8F667e",
|
|
69
|
+
triggerHasClear: "RMwzIX",
|
|
70
|
+
selectedToken: "wvU2oL",
|
|
71
|
+
selectionActionButton: "OGMk6I"
|
|
72
|
+
};
|
|
73
|
+
//#endregion
|
|
74
|
+
//#region src/picker/PickerSelectionToolbar.tsx
|
|
75
|
+
function O({ onSelectAll: e, onDeselectAll: n, selectAllButtonRef: r }) {
|
|
76
|
+
return /* @__PURE__ */ v(t.Container, {
|
|
77
|
+
gap: "xs",
|
|
78
|
+
templateColumns: "1fr 1fr",
|
|
79
|
+
children: [/* @__PURE__ */ _("button", {
|
|
80
|
+
ref: r,
|
|
81
|
+
type: "button",
|
|
82
|
+
className: D.selectionActionButton,
|
|
83
|
+
onClick: e,
|
|
84
|
+
"data-ui": "picker-select-all",
|
|
85
|
+
"data-action": "select-all",
|
|
86
|
+
children: "Выбрать все"
|
|
87
|
+
}), /* @__PURE__ */ _("button", {
|
|
88
|
+
type: "button",
|
|
89
|
+
className: D.selectionActionButton,
|
|
90
|
+
onClick: n,
|
|
91
|
+
"data-ui": "picker-deselect-all",
|
|
92
|
+
"data-action": "deselect-all",
|
|
93
|
+
children: "Снять выбор"
|
|
94
|
+
})]
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
//#endregion
|
|
98
|
+
//#region src/picker/PickerOptions.tsx
|
|
99
|
+
function k({ rootRef: e, children: t, toolbar: n, selectionActions: r, layoutClassName: i, bodyClassName: a, scrollable: s = !0, className: c, ...l }) {
|
|
100
|
+
let u = n === void 0 && r ? /* @__PURE__ */ _(O, { ...r }) : n || null;
|
|
101
|
+
return /* @__PURE__ */ v("div", {
|
|
102
|
+
...l,
|
|
103
|
+
ref: e,
|
|
104
|
+
className: p(D.options, i, c),
|
|
105
|
+
"data-ui": "picker-options",
|
|
106
|
+
"data-has-toolbar": u ? "true" : void 0,
|
|
107
|
+
children: [u ? /* @__PURE__ */ v("div", {
|
|
108
|
+
className: D.optionsToolbar,
|
|
109
|
+
children: [u, /* @__PURE__ */ _(o, {})]
|
|
110
|
+
}) : null, /* @__PURE__ */ _("div", {
|
|
111
|
+
className: p(D.optionsBody, s && "scrollable", a),
|
|
112
|
+
children: t
|
|
113
|
+
})]
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
//#endregion
|
|
117
|
+
//#region src/picker/model/extractPickerTextContent.ts
|
|
118
|
+
function A(e) {
|
|
119
|
+
if (typeof e == "string" || typeof e == "number") return String(e);
|
|
120
|
+
if (Array.isArray(e)) {
|
|
121
|
+
let t = e.map(A).filter((e) => !!e).map((e) => e.trim()).filter(Boolean);
|
|
122
|
+
return t.length ? t.join(" ") : void 0;
|
|
123
|
+
}
|
|
124
|
+
if (c(e)) return typeof e.props.searchText == "string" ? e.props.searchText : A(e.props.children);
|
|
125
|
+
}
|
|
126
|
+
//#endregion
|
|
127
|
+
//#region src/picker/PickerPlaceholder.ts
|
|
128
|
+
function j({ placeholder: e, label: t, optionCount: n, fallback: r = "Выберите значение" }) {
|
|
129
|
+
let i = A(t);
|
|
130
|
+
return `${e ?? i ?? r} <${n}>`;
|
|
131
|
+
}
|
|
132
|
+
//#endregion
|
|
133
|
+
//#region src/picker/PickerPopup.tsx
|
|
134
|
+
function M(e) {
|
|
135
|
+
e.stopPropagation();
|
|
136
|
+
}
|
|
137
|
+
function N({ open: e, context: t, floatingStyles: n, listId: r, labelId: i, popupAriaLabel: a, descriptionId: o, activeOptionId: s, ariaMultiselectable: c, popupRole: l = "listbox", setFloating: u, getFloatingProps: d, onKeyDown: f, initialFocus: p = -1, returnFocus: g = !1, tabIndex: v = 0, className: y, maxWidth: b, layoutClassName: x, bodyClassName: S, toolbar: T, selectionActions: E, children: O }) {
|
|
138
|
+
return /* @__PURE__ */ _(C, { children: e && /* @__PURE__ */ _(h, { children: /* @__PURE__ */ _(m, {
|
|
139
|
+
context: t,
|
|
140
|
+
modal: !1,
|
|
141
|
+
initialFocus: p,
|
|
142
|
+
returnFocus: g,
|
|
143
|
+
children: /* @__PURE__ */ _(w.div, {
|
|
144
|
+
ref: u,
|
|
145
|
+
style: {
|
|
146
|
+
...n,
|
|
147
|
+
maxWidth: b
|
|
148
|
+
},
|
|
149
|
+
initial: {
|
|
150
|
+
opacity: 0,
|
|
151
|
+
scale: .95
|
|
152
|
+
},
|
|
153
|
+
animate: {
|
|
154
|
+
opacity: 1,
|
|
155
|
+
scale: 1
|
|
156
|
+
},
|
|
157
|
+
exit: {
|
|
158
|
+
opacity: 0,
|
|
159
|
+
scale: .95
|
|
160
|
+
},
|
|
161
|
+
...d({
|
|
162
|
+
id: r,
|
|
163
|
+
role: l,
|
|
164
|
+
tabIndex: v,
|
|
165
|
+
"aria-labelledby": i,
|
|
166
|
+
"aria-label": i ? void 0 : a,
|
|
167
|
+
"aria-describedby": o,
|
|
168
|
+
"aria-activedescendant": s,
|
|
169
|
+
"aria-multiselectable": c || void 0,
|
|
170
|
+
onMouseDown: M,
|
|
171
|
+
onKeyDown: f,
|
|
172
|
+
className: D.popupPositioner
|
|
173
|
+
}),
|
|
174
|
+
children: /* @__PURE__ */ _(k, {
|
|
175
|
+
className: y,
|
|
176
|
+
layoutClassName: x,
|
|
177
|
+
bodyClassName: S,
|
|
178
|
+
toolbar: T,
|
|
179
|
+
selectionActions: E,
|
|
180
|
+
scrollable: !1,
|
|
181
|
+
children: O
|
|
182
|
+
})
|
|
183
|
+
})
|
|
184
|
+
}) }) });
|
|
185
|
+
}
|
|
186
|
+
//#endregion
|
|
187
|
+
//#region src/picker/PickerSelectedToken.tsx
|
|
188
|
+
function P({ children: e, className: t, ...n }) {
|
|
189
|
+
return /* @__PURE__ */ _("span", {
|
|
190
|
+
...n,
|
|
191
|
+
className: p(D.selectedToken, t),
|
|
192
|
+
"data-ui": "picker-selected-token",
|
|
193
|
+
children: e
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
//#endregion
|
|
197
|
+
//#region src/picker/PickerStatus.tsx
|
|
198
|
+
function F({ emptyState: t, errorState: n }) {
|
|
199
|
+
let r = n ?? t;
|
|
200
|
+
return r == null ? null : /* @__PURE__ */ _("div", {
|
|
201
|
+
className: p(e.uiPopupOption, D.status, n !== void 0 && D.statusError),
|
|
202
|
+
"aria-disabled": !0,
|
|
203
|
+
children: r
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
//#endregion
|
|
207
|
+
//#region src/picker/PickerTriggerActions.tsx
|
|
208
|
+
function I({ open: t, disabled: n, children: r, onToggleMouseDown: i, onToggleClick: a, openAriaLabel: o = "Открыть список", closeAriaLabel: s = "Закрыть список" }) {
|
|
209
|
+
return /* @__PURE__ */ v("div", {
|
|
210
|
+
className: e.uiToggleButtonContainer,
|
|
211
|
+
"data-disabled": n || void 0,
|
|
212
|
+
children: [
|
|
213
|
+
r,
|
|
214
|
+
/* @__PURE__ */ _("div", { className: e.uiButtonSeparator }),
|
|
215
|
+
/* @__PURE__ */ _("button", {
|
|
216
|
+
type: "button",
|
|
217
|
+
disabled: n,
|
|
218
|
+
"aria-label": t ? s : o,
|
|
219
|
+
className: e.uiToggleButton,
|
|
220
|
+
onMouseDown: i,
|
|
221
|
+
onClick: a,
|
|
222
|
+
children: /* @__PURE__ */ _(y, { className: p(e.uiToggleIcon, t && e.uiToggleIconOpen) })
|
|
223
|
+
})
|
|
224
|
+
]
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
//#endregion
|
|
228
|
+
//#region src/picker/PickerTriggerInput.tsx
|
|
229
|
+
var L = s(({ rootRef: t, endAdornment: r, overlay: i, rootClassName: o, inputClassName: s, isLoading: c, ...l }, u) => {
|
|
230
|
+
let d = i != null;
|
|
231
|
+
return /* @__PURE__ */ _("div", {
|
|
232
|
+
ref: t,
|
|
233
|
+
className: p(e.uiInputContainer, D.triggerContainer, o),
|
|
234
|
+
"data-has-overlay": d || void 0,
|
|
235
|
+
children: c ? /* @__PURE__ */ _(n, {}) : /* @__PURE__ */ v(g, { children: [/* @__PURE__ */ _(a, {
|
|
236
|
+
endAdornment: r,
|
|
237
|
+
children: ({ controlClassName: t }) => /* @__PURE__ */ _("input", {
|
|
238
|
+
...l,
|
|
239
|
+
ref: u,
|
|
240
|
+
className: p(e.uiInputWithToggle, t, s)
|
|
241
|
+
})
|
|
242
|
+
}), d ? i : null] })
|
|
243
|
+
});
|
|
244
|
+
});
|
|
245
|
+
L.displayName = "PickerTriggerInput";
|
|
246
|
+
//#endregion
|
|
247
|
+
//#region src/picker/PickerTrigger.tsx
|
|
248
|
+
function R({ ref: e, open: t, optionCount: n, placeholder: r, label: i, placeholderFallback: a, selectedValue: o, hasSelection: s, showSelectedValue: c = o != null, clearable: l = !1, onClear: u, clearAriaLabel: d, onToggleMouseDown: f, onToggleClick: p, openAriaLabel: m, closeAriaLabel: h, disabled: g, inputClassName: v, ...y }) {
|
|
249
|
+
let b = l && (s ?? o != null) && u !== void 0 && !g;
|
|
250
|
+
return /* @__PURE__ */ _(L, {
|
|
251
|
+
...y,
|
|
252
|
+
ref: e,
|
|
253
|
+
disabled: g,
|
|
254
|
+
placeholder: c ? void 0 : j({
|
|
255
|
+
placeholder: r,
|
|
256
|
+
label: i,
|
|
257
|
+
optionCount: n,
|
|
258
|
+
fallback: a
|
|
259
|
+
}),
|
|
260
|
+
inputClassName: v,
|
|
261
|
+
rootClassName: l ? D.triggerHasClear : void 0,
|
|
262
|
+
overlay: c ? /* @__PURE__ */ _(P, { children: o }) : void 0,
|
|
263
|
+
endAdornment: /* @__PURE__ */ _(I, {
|
|
264
|
+
open: t,
|
|
265
|
+
disabled: g,
|
|
266
|
+
onToggleMouseDown: f,
|
|
267
|
+
onToggleClick: p,
|
|
268
|
+
openAriaLabel: m,
|
|
269
|
+
closeAriaLabel: h,
|
|
270
|
+
children: b ? /* @__PURE__ */ _(E, {
|
|
271
|
+
ariaLabel: d,
|
|
272
|
+
onClear: u
|
|
273
|
+
}) : null
|
|
274
|
+
})
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
//#endregion
|
|
278
|
+
//#region src/picker/model/createPickerTriggerPolicy.ts
|
|
279
|
+
function z(e) {
|
|
280
|
+
switch (e) {
|
|
281
|
+
case "search-single": return {
|
|
282
|
+
focusFloatingOnOpen: !1,
|
|
283
|
+
restoreFocusOnClose: !1,
|
|
284
|
+
resetQueryOnClose: !0,
|
|
285
|
+
shouldOpenOnTriggerClick: () => !1,
|
|
286
|
+
shouldOpenOnInputChange: (e) => !e,
|
|
287
|
+
shouldFocusReferenceOnToggle: (e) => !e,
|
|
288
|
+
shouldSelectTriggerTextOnFocus: ({ open: e, currentQuery: t, hasDisplayValue: n }) => !e && t.length === 0 && n
|
|
289
|
+
};
|
|
290
|
+
case "search-multi": return {
|
|
291
|
+
focusFloatingOnOpen: !1,
|
|
292
|
+
restoreFocusOnClose: !1,
|
|
293
|
+
resetQueryOnClose: !0,
|
|
294
|
+
shouldOpenOnTriggerClick: () => !1,
|
|
295
|
+
shouldOpenOnInputChange: (e) => !e,
|
|
296
|
+
shouldFocusReferenceOnToggle: (e) => !e,
|
|
297
|
+
shouldSelectTriggerTextOnFocus: () => !1
|
|
298
|
+
};
|
|
299
|
+
default: return {
|
|
300
|
+
focusFloatingOnOpen: !0,
|
|
301
|
+
restoreFocusOnClose: !0,
|
|
302
|
+
resetQueryOnClose: !1,
|
|
303
|
+
shouldOpenOnTriggerClick: (e) => !e,
|
|
304
|
+
shouldOpenOnInputChange: () => !1,
|
|
305
|
+
shouldFocusReferenceOnToggle: () => !1,
|
|
306
|
+
shouldSelectTriggerTextOnFocus: () => !1
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
//#endregion
|
|
311
|
+
//#region src/picker/model/usePickerDefaultFilter.ts
|
|
312
|
+
function B(e) {
|
|
313
|
+
return S((Array.isArray(e) ? e : [e]).filter(Boolean).join(" "));
|
|
314
|
+
}
|
|
315
|
+
function V({ options: e, query: t, enabled: n = !0, getSearchText: r }) {
|
|
316
|
+
let i = S(t);
|
|
317
|
+
return u(() => !n || !i ? [...e] : e.filter((e) => B(r(e)).includes(i)), [
|
|
318
|
+
n,
|
|
319
|
+
r,
|
|
320
|
+
i,
|
|
321
|
+
e
|
|
322
|
+
]);
|
|
323
|
+
}
|
|
324
|
+
//#endregion
|
|
325
|
+
//#region src/picker/model/usePickerFloatingListbox.ts
|
|
326
|
+
function H(e) {
|
|
327
|
+
let t = e.triggerMode ? z(e.triggerMode) : void 0;
|
|
328
|
+
return x({
|
|
329
|
+
...e,
|
|
330
|
+
focusFloatingOnOpen: e.focusFloatingOnOpen ?? t?.focusFloatingOnOpen,
|
|
331
|
+
restoreFocusOnClose: e.restoreFocusOnClose ?? t?.restoreFocusOnClose
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
//#endregion
|
|
335
|
+
//#region src/picker/model/usePickerQuery.ts
|
|
336
|
+
function U({ query: e, defaultQuery: t, onQuery: n, resetOnClose: r, triggerMode: i }) {
|
|
337
|
+
let a = e !== void 0, [o, s] = f(t ?? ""), c = a ? e ?? "" : o, l = r ?? (!i || z(i).resetQueryOnClose), u = (e) => {
|
|
338
|
+
a || s(e), n?.(e);
|
|
339
|
+
};
|
|
340
|
+
return {
|
|
341
|
+
query: c,
|
|
342
|
+
setQuery: u,
|
|
343
|
+
clearQuery: () => u(""),
|
|
344
|
+
resetQueryOnClose: l
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
//#endregion
|
|
348
|
+
//#region src/picker/model/usePickerSelectionLifecycle.ts
|
|
349
|
+
function W({ value: e, open: t, onCommit: n, onOpen: r, onClose: i, isEqual: a }) {
|
|
350
|
+
let o = d(!1), [s, c] = f(e);
|
|
351
|
+
return l(() => {
|
|
352
|
+
o.current && !t && (a(s, e) || n(s), i?.(s)), o.current = t;
|
|
353
|
+
}, [
|
|
354
|
+
s,
|
|
355
|
+
a,
|
|
356
|
+
i,
|
|
357
|
+
n,
|
|
358
|
+
t,
|
|
359
|
+
e
|
|
360
|
+
]), {
|
|
361
|
+
draftValue: s,
|
|
362
|
+
setDraftValue: c,
|
|
363
|
+
prepareOpen: () => {
|
|
364
|
+
c(e), r?.();
|
|
365
|
+
}
|
|
366
|
+
};
|
|
367
|
+
}
|
|
368
|
+
//#endregion
|
|
369
|
+
//#region src/picker/model/usePickerTriggerController.ts
|
|
370
|
+
function G(e) {
|
|
371
|
+
requestAnimationFrame(() => {
|
|
372
|
+
e.current?.focus();
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
function K({ mode: e, open: t, currentQuery: n, hasDisplayValue: r, inputRef: i, setQuery: a, openList: o, close: s, toggleOpen: c, onBeforeOpen: l }) {
|
|
376
|
+
let u = z(e), d = () => {
|
|
377
|
+
if (l?.(), o) {
|
|
378
|
+
o();
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
c?.();
|
|
382
|
+
}, f = () => {
|
|
383
|
+
if (s) {
|
|
384
|
+
s();
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
c?.();
|
|
388
|
+
}, p = () => {
|
|
389
|
+
t ? f() : d(), u.shouldFocusReferenceOnToggle(t) && G(i);
|
|
390
|
+
};
|
|
391
|
+
return {
|
|
392
|
+
policy: u,
|
|
393
|
+
handleTriggerInputChange: (e) => {
|
|
394
|
+
a?.(e), u.shouldOpenOnInputChange(t) && d();
|
|
395
|
+
},
|
|
396
|
+
handleTriggerClick: () => {
|
|
397
|
+
u.shouldOpenOnTriggerClick(t) && d();
|
|
398
|
+
},
|
|
399
|
+
handleTriggerFocus: (e) => {
|
|
400
|
+
u.shouldSelectTriggerTextOnFocus({
|
|
401
|
+
open: t,
|
|
402
|
+
currentQuery: n,
|
|
403
|
+
hasDisplayValue: r
|
|
404
|
+
}) && requestAnimationFrame(() => {
|
|
405
|
+
e.select();
|
|
406
|
+
});
|
|
407
|
+
},
|
|
408
|
+
handleToggleMouseDown: (e) => {
|
|
409
|
+
e.preventDefault();
|
|
410
|
+
},
|
|
411
|
+
handleToggleClick: () => {
|
|
412
|
+
p();
|
|
413
|
+
},
|
|
414
|
+
handleTriggerKeyDown: ({ event: e, onActivateWhenOpen: n, enableSpaceActivation: r = !1, enableClosedArrowDownOpen: i = !1, suppressClosedArrowUp: a = !1 }) => {
|
|
415
|
+
if (!t && a && e.key === "ArrowUp") {
|
|
416
|
+
e.preventDefault();
|
|
417
|
+
return;
|
|
418
|
+
}
|
|
419
|
+
if (!t && i && e.key === "ArrowDown") {
|
|
420
|
+
e.preventDefault(), p();
|
|
421
|
+
return;
|
|
422
|
+
}
|
|
423
|
+
if (e.key === "Enter") {
|
|
424
|
+
e.preventDefault(), t ? n?.() : p();
|
|
425
|
+
return;
|
|
426
|
+
}
|
|
427
|
+
r && e.key === " " && (e.preventDefault(), t ? n?.() : p());
|
|
428
|
+
},
|
|
429
|
+
toggleTrigger: p
|
|
430
|
+
};
|
|
431
|
+
}
|
|
432
|
+
//#endregion
|
|
433
|
+
export { E as _, V as a, L as c, P as d, N as f, O as g, k as h, H as i, I as l, A as m, W as n, z as o, j as p, U as r, R as s, K as t, F as u, T as v };
|
|
434
|
+
|
|
435
|
+
//# sourceMappingURL=picker-0I1yMKIY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"picker-0I1yMKIY.js","names":[],"sources":["../../src/picker/PickerField.tsx","../../src/picker/PickerClearButton.tsx","../../src/picker/Picker.module.scss","../../src/picker/PickerSelectionToolbar.tsx","../../src/picker/PickerOptions.tsx","../../src/picker/model/extractPickerTextContent.ts","../../src/picker/PickerPlaceholder.ts","../../src/picker/PickerPopup.tsx","../../src/picker/PickerSelectedToken.tsx","../../src/picker/PickerStatus.tsx","../../src/picker/PickerTriggerActions.tsx","../../src/picker/PickerTriggerInput.tsx","../../src/picker/PickerTrigger.tsx","../../src/picker/model/createPickerTriggerPolicy.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","import { type MouseEvent } from \"react\";\n\nimport { XIcon } from \"lucide-react\";\n\nimport uiStyles from \"../ui.module.scss\";\n\ntype PickerClearButtonProps = {\n\tdisabled?: boolean;\n\tariaLabel?: string;\n\tonClear: () => void;\n};\n\n/** Единое действие очистки выбранного значения во всех clearable picker-компонентах. */\nexport function PickerClearButton({ disabled, ariaLabel = \"Очистить выбор\", onClear }: PickerClearButtonProps) {\n\tconst stopTriggerInteraction = (event: MouseEvent<HTMLButtonElement>) => {\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\t};\n\n\treturn (\n\t\t<button\n\t\t\ttype=\"button\"\n\t\t\tdisabled={disabled}\n\t\t\tclassName={uiStyles.uiClearButton}\n\t\t\tdata-ui=\"picker-clear-button\"\n\t\t\tdata-action=\"clear-picker\"\n\t\t\tonMouseDown={stopTriggerInteraction}\n\t\t\tonClick={(event) => {\n\t\t\t\tstopTriggerInteraction(event);\n\t\t\t\tonClear();\n\t\t\t}}\n\t\t\taria-label={ariaLabel}>\n\t\t\t<XIcon />\n\t\t</button>\n\t);\n}\n","@use \"@/styles/mixins\" as *;\n\n.options {\n\t--anchor-gap: var(--space-xs);\n\t--anchor-padding: var(--space-xs);\n\t--anchor-offset: 0;\n\t--input-width: min(100vw, var(--base-width, 15em));\n\n\tdisplay: grid;\n\tgrid-template-rows: minmax(0, 1fr);\n\twidth: 100%;\n\tmin-width: var(--input-width);\n\tmin-height: 0;\n\tmax-height: 75vh;\n\tpadding: var(--space-sm);\n\toverflow: hidden;\n\tbackground-color: var(--surface-0);\n\tborder: var(--border);\n\tborder-radius: var(--radius-sm);\n\tbox-shadow: var(--shadow-md);\n\ttransform-origin: top;\n\tz-index: var(--z-dropdown);\n\n\t&:empty {\n\t\tvisibility: hidden;\n\t}\n\n\t&[data-has-toolbar=\"true\"] {\n\t\tgrid-template-rows: auto minmax(0, 1fr);\n\t}\n}\n\n.popupPositioner {\n\tmin-width: 0;\n\tz-index: var(--z-dropdown);\n}\n\n.optionsToolbar {\n\tdisplay: grid;\n\tgap: var(--space-xs);\n\tpadding: var(--space-xs);\n}\n\n.optionsBody {\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\t&[data-has-overlay=\"true\"] input {\n\t\t--ui-color: transparent;\n\t\t--ui-color-hover: transparent;\n\t\t--ui-color-active: transparent;\n\n\t\tcolor: transparent;\n\t\tcaret-color: transparent;\n\t\t-webkit-text-fill-color: transparent;\n\t}\n}\n\n.triggerHasClear {\n\t--trigger-count: 2;\n}\n\n.selectedToken {\n\tposition: absolute;\n\tinset: 0 calc(var(--control-height) * var(--trigger-count, 1) + var(--space-sm)) 0 var(--space-sm);\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: flex-end;\n\tmin-width: 0;\n\toverflow: hidden;\n\twhite-space: nowrap;\n\ttext-overflow: ellipsis;\n\tpointer-events: none;\n}\n\n@include mobile {\n\t.options {\n\t\t--input-width: calc(100dvw - var(--space-xl));\n\t}\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 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 { type HTMLAttributes, type ReactNode, type Ref } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { Separator } from \"../separator\";\n\nimport styles from \"./Picker.module.scss\";\nimport { PickerSelectionToolbar } from \"./PickerSelectionToolbar\";\n\nexport type PickerSelectionActions = {\n\tonSelectAll: () => void;\n\tonDeselectAll: () => void;\n\tselectAllButtonRef?: Ref<HTMLButtonElement>;\n};\n\nexport interface PickerOptionsProps extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n\trootRef?: Ref<HTMLDivElement>;\n\tchildren: ReactNode;\n\ttoolbar?: ReactNode | false;\n\tselectionActions?: PickerSelectionActions;\n\tlayoutClassName?: string;\n\tbodyClassName?: string;\n\tscrollable?: boolean;\n}\n\n/**\n * Единая оболочка списка опций для picker, listbox и menu. Если переданы\n * selectionActions, но не передан toolbar, компонент показывает стандартные\n * действия выбора и снятия выбора.\n */\nexport function PickerOptions({\n\trootRef,\n\tchildren,\n\ttoolbar,\n\tselectionActions,\n\tlayoutClassName,\n\tbodyClassName,\n\tscrollable = true,\n\tclassName,\n\t...props\n}: PickerOptionsProps) {\n\tconst resolvedToolbar = toolbar === undefined && selectionActions ? <PickerSelectionToolbar {...selectionActions} /> : toolbar || null;\n\n\treturn (\n\t\t<div\n\t\t\t{...props}\n\t\t\tref={rootRef}\n\t\t\tclassName={cn(styles.options, layoutClassName, className)}\n\t\t\tdata-ui=\"picker-options\"\n\t\t\tdata-has-toolbar={resolvedToolbar ? \"true\" : undefined}>\n\t\t\t{resolvedToolbar ? (\n\t\t\t\t<div className={styles.optionsToolbar}>\n\t\t\t\t\t{resolvedToolbar}\n\t\t\t\t\t<Separator />\n\t\t\t\t</div>\n\t\t\t) : null}\n\t\t\t<div className={cn(styles.optionsBody, scrollable && \"scrollable\", bodyClassName)}>{children}</div>\n\t\t</div>\n\t);\n}\n","import { isValidElement, type 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\n\t\t\t.map(extractPickerTextContent)\n\t\t\t.filter((value): value is string => Boolean(value))\n\t\t\t.map((value) => value.trim())\n\t\t\t.filter(Boolean);\n\t\treturn values.length ? values.join(\" \") : undefined;\n\t}\n\n\tif (isValidElement<{ children?: ReactNode; searchText?: unknown }>(node)) {\n\t\tif (typeof node.props.searchText === \"string\") {\n\t\t\treturn node.props.searchText;\n\t\t}\n\n\t\treturn extractPickerTextContent(node.props.children);\n\t}\n\n\treturn undefined;\n}\n","import { type ReactNode } from \"react\";\n\nimport { extractPickerTextContent } from \"./model/extractPickerTextContent\";\n\ntype PickerPlaceholderParams = {\n\tplaceholder?: string;\n\tlabel?: ReactNode;\n\toptionCount: number;\n\tfallback?: string;\n};\n\n/**\n * Формирует единый текст placeholder для picker-компонентов и всегда показывает\n * актуальное количество доступных вариантов.\n */\nexport function getPickerPlaceholder({ placeholder, label, optionCount, fallback = \"Выберите значение\" }: PickerPlaceholderParams) {\n\tconst labelText = extractPickerTextContent(label);\n\tconst text = placeholder ?? labelText ?? fallback;\n\n\treturn `${text} <${optionCount}>`;\n}\n","import { type CSSProperties, type KeyboardEvent, type MouseEvent, type ReactNode } from \"react\";\n\nimport { FloatingContext, FloatingFocusManager, FloatingPortal } from \"@floating-ui/react\";\nimport { AnimatePresence, motion } from \"motion/react\";\n\nimport styles from \"./Picker.module.scss\";\nimport { PickerOptions, type PickerSelectionActions } from \"./PickerOptions\";\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\tbodyClassName?: string;\n\ttoolbar?: ReactNode | false;\n\tselectionActions?: PickerSelectionActions;\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\tbodyClassName,\n\ttoolbar,\n\tselectionActions,\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: styles.popupPositioner\n\t\t\t\t\t\t\t})}>\n\t\t\t\t\t\t\t<PickerOptions\n\t\t\t\t\t\t\t\tclassName={className}\n\t\t\t\t\t\t\t\tlayoutClassName={layoutClassName}\n\t\t\t\t\t\t\t\tbodyClassName={bodyClassName}\n\t\t\t\t\t\t\t\ttoolbar={toolbar}\n\t\t\t\t\t\t\t\tselectionActions={selectionActions}\n\t\t\t\t\t\t\t\tscrollable={false}>\n\t\t\t\t\t\t\t\t{children}\n\t\t\t\t\t\t\t</PickerOptions>\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 HTMLAttributes, type ReactNode } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport styles from \"./Picker.module.scss\";\n\nexport interface PickerSelectedTokenProps extends Omit<HTMLAttributes<HTMLSpanElement>, \"children\"> {\n\tchildren: ReactNode;\n}\n\n/** Единое визуальное представление выбранного значения внутри picker-trigger. */\nexport function PickerSelectedToken({ children, className, ...props }: PickerSelectedTokenProps) {\n\treturn (\n\t\t<span {...props} className={cn(styles.selectedToken, className)} data-ui=\"picker-selected-token\">\n\t\t\t{children}\n\t\t</span>\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\t// loadingState?: ReactNode;\n\terrorState?: ReactNode;\n}\n\nexport function PickerStatus({ emptyState, errorState }: PickerStatusProps) {\n\tconst content = errorState ?? 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\tdisabled={disabled}\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, InputLoadingFrame } from \"../input\";\nimport uiStyles from \"../ui.module.scss\";\n\nimport styles from \"./Picker.module.scss\";\n\nexport interface 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\tisLoading?: boolean;\n}\n\nexport const PickerTriggerInput = forwardRef<HTMLInputElement, PickerTriggerInputProps>(\n\t({ rootRef, endAdornment, overlay, rootClassName, inputClassName, isLoading, ...props }, ref) => {\n\t\tconst hasOverlay = overlay !== undefined && overlay !== null;\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={rootRef}\n\t\t\t\tclassName={cn(uiStyles.uiInputContainer, styles.triggerContainer, rootClassName)}\n\t\t\t\tdata-has-overlay={hasOverlay || undefined}>\n\t\t\t\t{isLoading ? (\n\t\t\t\t\t<InputLoadingFrame />\n\t\t\t\t) : (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<InputControl endAdornment={endAdornment}>\n\t\t\t\t\t\t\t{({ controlClassName }) => (\n\t\t\t\t\t\t\t\t<input {...props} ref={ref} className={cn(uiStyles.uiInputWithToggle, controlClassName, inputClassName)} />\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</InputControl>\n\t\t\t\t\t\t{hasOverlay ? overlay : null}\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t}\n);\n\nPickerTriggerInput.displayName = \"PickerTriggerInput\";\n","import { type ReactNode, type Ref } from \"react\";\n\nimport styles from \"./Picker.module.scss\";\nimport { PickerClearButton } from \"./PickerClearButton\";\nimport { getPickerPlaceholder } from \"./PickerPlaceholder\";\nimport { PickerSelectedToken } from \"./PickerSelectedToken\";\nimport { PickerTriggerActions } from \"./PickerTriggerActions\";\nimport { PickerTriggerInput, type PickerTriggerInputProps } from \"./PickerTriggerInput\";\n\nexport interface PickerTriggerProps extends Omit<PickerTriggerInputProps, \"placeholder\" | \"overlay\" | \"endAdornment\"> {\n\tref?: Ref<HTMLInputElement>;\n\topen: boolean;\n\toptionCount: number;\n\tplaceholder?: string;\n\tlabel?: ReactNode;\n\tplaceholderFallback?: string;\n\tselectedValue?: ReactNode;\n\thasSelection?: boolean;\n\tshowSelectedValue?: boolean;\n\tclearable?: boolean;\n\tonClear?: () => void;\n\tclearAriaLabel?: string;\n\tonToggleMouseDown?: PickerTriggerActionsProps[\"onToggleMouseDown\"];\n\tonToggleClick: PickerTriggerActionsProps[\"onToggleClick\"];\n\topenAriaLabel?: string;\n\tcloseAriaLabel?: string;\n}\n\ntype PickerTriggerActionsProps = Parameters<typeof PickerTriggerActions>[0];\n\n/**\n * Общая композиция picker-trigger: input, выбранное значение, очистка и кнопка\n * открытия. Владельцы picker-моделей передают только состояние и обработчики.\n */\nexport function PickerTrigger({\n\tref,\n\topen,\n\toptionCount,\n\tplaceholder,\n\tlabel,\n\tplaceholderFallback,\n\tselectedValue,\n\thasSelection,\n\tshowSelectedValue = selectedValue !== undefined && selectedValue !== null,\n\tclearable = false,\n\tonClear,\n\tclearAriaLabel,\n\tonToggleMouseDown,\n\tonToggleClick,\n\topenAriaLabel,\n\tcloseAriaLabel,\n\tdisabled,\n\tinputClassName,\n\t...inputProps\n}: PickerTriggerProps) {\n\tconst hasSelectedValue = hasSelection ?? (selectedValue !== undefined && selectedValue !== null);\n\tconst canClear = clearable && hasSelectedValue && onClear !== undefined && !disabled;\n\n\treturn (\n\t\t<PickerTriggerInput\n\t\t\t{...inputProps}\n\t\t\tref={ref}\n\t\t\tdisabled={disabled}\n\t\t\tplaceholder={\n\t\t\t\tshowSelectedValue ? undefined : getPickerPlaceholder({ placeholder, label, optionCount, fallback: placeholderFallback })\n\t\t\t}\n\t\t\tinputClassName={inputClassName}\n\t\t\trootClassName={clearable ? styles.triggerHasClear : undefined}\n\t\t\toverlay={showSelectedValue ? <PickerSelectedToken>{selectedValue}</PickerSelectedToken> : undefined}\n\t\t\tendAdornment={\n\t\t\t\t<PickerTriggerActions\n\t\t\t\t\topen={open}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonToggleMouseDown={onToggleMouseDown}\n\t\t\t\t\tonToggleClick={onToggleClick}\n\t\t\t\t\topenAriaLabel={openAriaLabel}\n\t\t\t\t\tcloseAriaLabel={closeAriaLabel}>\n\t\t\t\t\t{canClear ? <PickerClearButton ariaLabel={clearAriaLabel} onClear={onClear} /> : null}\n\t\t\t\t</PickerTriggerActions>\n\t\t\t}\n\t\t/>\n\t);\n}\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 { 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 { useState } from \"react\";\n\nimport { PickerTriggerMode, createPickerTriggerPolicy } from \"./createPickerTriggerPolicy\";\n\ninterface UsePickerQueryOptions {\n\tquery?: string;\n\tdefaultQuery?: string;\n\tonQuery?: (value: string) => void;\n\tresetOnClose?: boolean;\n\ttriggerMode?: PickerTriggerMode;\n}\n\n/**\n * Управляет controlled/uncontrolled query и возвращает policy закрытия владельцу open-state.\n * Сброс выполняется самим владельцем в событии close, поэтому hook не зеркалит lifecycle через effect.\n */\nexport function usePickerQuery({ query, defaultQuery, onQuery, resetOnClose, triggerMode }: UsePickerQueryOptions) {\n\tconst isControlled = query !== undefined;\n\tconst [internalQuery, setInternalQuery] = useState(defaultQuery ?? \"\");\n\tconst currentQuery = isControlled ? (query ?? \"\") : internalQuery;\n\tconst resolvedResetOnClose = resetOnClose ?? (triggerMode ? createPickerTriggerPolicy(triggerMode).resetQueryOnClose : true);\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\tresetQueryOnClose: resolvedResetOnClose\n\t};\n}\n","import { useEffect, 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\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,4 +1,4 @@
|
|
|
1
|
-
import { t as e } from "./ui.module-
|
|
1
|
+
import { t as e } from "./ui.module-BsDio9A3.js";
|
|
2
2
|
import { createContext as t, useCallback as n, useContext as r, useId as i, useLayoutEffect as a, useMemo as o, useState as s } from "react";
|
|
3
3
|
import { cn as c, getRovingFocusTargetIndex as l, handleKeyboardActivation as u } from "@ryuzaki13/react-foundation-lib/utils";
|
|
4
4
|
import { jsx as d, jsxs as f } from "react/jsx-runtime";
|
|
@@ -130,4 +130,4 @@ g.Option = _;
|
|
|
130
130
|
//#endregion
|
|
131
131
|
export { g as n, _ as t };
|
|
132
132
|
|
|
133
|
-
//# sourceMappingURL=radio-group-
|
|
133
|
+
//# sourceMappingURL=radio-group-DhpP7JSJ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"radio-group-BAeJjyZ5.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\tflex: 1 0 0%;\n\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--space-sm);\n\n\tcolor: var(--content-2);\n\t// border: var(--border-width) solid transparent;\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-1);\n\t\tbackground-color: var(--surface-2);\n\t\t// border-color: var(--border-1);\n\t}\n\n\t&.checked {\n\t\tcolor: var(--status-brand-on-fill);\n\t\tbackground-color: var(--status-brand-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\n.radioItemContent {\n\tflex: 1 0 0%;\n\n\tdisplay: grid;\n\talign-content: center;\n\tgap: var(--space-sm);\n}\n\n.radioItemIcon {\n\tflex: 0 0 0%;\n\n\tsvg {\n\t\twidth: 1em;\n\t\theight: 1em;\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\";\nimport { CheckCircleIcon } from \"lucide-react\";\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={styles.radioItemContent}>\n\t\t\t\t<span className=\"textNoWrap\">{label}</span>\n\t\t\t\t{description && <span className=\"fontSizeSm\">{description}</span>}\n\t\t\t</span>\n\t\t\t<span className={styles.radioItemIcon}>\n\t\t\t\t<CheckCircleIcon style={{ display: \"block\", visibility: isChecked ? \"visible\" : \"hidden\" }} />\n\t\t\t</span>\n\t\t</button>\n\t);\n}\n\nRadioGroup.Option = Option;\n"],"mappings":";;;;;;;;;;;;;;GCqBM,IAAoB,EAA6C,IAAI;AAkB3E,SAAgB,EAAc,EAC7B,UACA,aACA,UACA,gBACA,aACA,cACA,WACA,iBAAc,cACd,cAAc,GACd,eACsB;CACtB,IAAM,IAAU,EAAM,GAChB,IAAU,IAAQ,GAAG,EAAQ,UAAU,KAAA,GACvC,IAAgB,IAAc,GAAG,EAAQ,gBAAgB,KAAA,GACzD,CAAC,GAAqB,KAA0B,EAAmB,CAAC,CAAC,GACrE,IAAe,GAAa,MAAuB,IAAW,CAAc,GAAG,CAAC,CAAQ,CAAC,GAMzF,IAAiB,GAAa,OACnC,GAAwB,MAAgB,EAAW,SAAS,CAAQ,IAAI,IAAa,CAAC,GAAG,GAAY,CAAQ,CAAE,SAElG;EACZ,GAAwB,MAAe,EAAW,QAAQ,MAAc,MAAc,CAAQ,CAAC;CAChG,IACE,CAAC,CAAC,GAEC,IAAe,SACb;EACN;EACA,UAAU;EACV;EACA;EACA;EACA;EACA;EACA,eAAe,EAAoB;EACnC;CACD,IACA;EAAC;EAAe;EAAU;EAAS;EAAc;EAAS;EAAa;EAAgB;EAAqB;CAAK,CAClH;CAEA,OACC,kBAAC,OAAD;EAAK,WAAW,EAAG,EAAS,WAAW,KAAY,EAAS,UAAU,CAAS;EAA/E,UAAA;GACE,KACA,kBAAC,OAAD;IAAK,IAAI;IAAS,WAAW,EAAS;IACpC,UAAA;GACG,CAAA;GAEL,KACA,kBAAC,OAAD;IAAK,IAAI;IAAe,WAAW,EAAS;IAC1C,UAAA;GACG,CAAA;GAGN,kBAAC,EAAkB,UAAnB;IAA4B,OAAO;IAClC,UAAA,kBAAC,OAAD;KACC,MAAK;KACL,mBAAiB;KACjB,cAAY,IAAU,KAAA,IAAY;KAClC,oBAAkB;KAClB,iBAAe,KAAY,KAAA;KAC3B,iBAAe,KAAY,KAAA;KAC3B,WAAW,EAAG,EAAS,gBAAgB,EAAO,YAAY,KAAU,EAAO,QAAQ,EAAO,EAAY;KACrG;IACG,CAAA;GACsB,CAAA;EACxB;;AAEP;AAYA,SAAgB,EAAU,EAAE,UAAO,UAAO,gBAAa,gBAA6B;CACnF,IAAM,IAAU,EAAW,CAAiB,GACtC,IAAW,EAAM,GACjB,IAAiB,GAAS;CAUhC,IARA,QAAsB;EAChB,OAIL,OAAO,EAAe,CAAQ;CAC/B,GAAG,CAAC,GAAgB,CAAQ,CAAC,GAEzB,CAAC,GACJ,OACC,kBAAC,OAAD;EAAK,WAAW,EAAG,EAAO,WAAW,CAAS;EAA9C,UAAA,CACC,kBAAC,KAAD;GAAG,WAAU;GAAc,UAAA;EAAS,CAAA,GACnC,KAAe,kBAAC,OAAD;GAAK,WAAU;GAAuB,UAAA;EAAiB,CAAA,CACnE;;CAIP,IAAM,IAAY,OAAO,GAAG,EAAQ,OAAO,CAAK,GAC1C,IAAa,EAAQ,aAAa,IAClC,IAAoB,EAAQ,UAAU,KAAA,KAAa,EAAQ,kBAAkB,GAE7E,UAAqB;EACtB,KAAc,KAIlB,EAAQ,WAAW,CAAK;CACzB;CAyCA,OACC,kBAAC,UAAD;EACC,IAAI,GAAG,EAAQ,QAAQ,UAAU;EACjC,MAAK;EACL,MAAK;EACL,gBAAc;EACd,UAAU;EACV,UAAU,KAAa,IAAoB,IAAI;EAC/C,WAAW,EAAG,EAAO,WAAW,KAAa,EAAO,SAAS,CAAS;EACtE,WAAQ;EACR,eAAY;EACZ,SAAS;EACT,YAlDqB,MAA4C;GAKlE,IAJI,KAIA,EAAyB,GAAO,CAAY,GAC/C;GAGD,IAAM,IAAgB,EAAM,eACtB,IAAe,EAAc,QAAqB,uBAAqB,GACvE,IAAa,MAAM,KAAK,GAAc,iBAAoC,kCAAgC,KAAK,CAAC,CAAC;GAEvH,IAAI,CAAC,EAAW,QACf;GAGD,IAAM,IAAe,EAAW,QAAQ,CAAa;GACrD,IAAI,MAAiB,IACpB;GAGD,IAAM,IAAY,EAA0B;IAC3C;IACA,WAAW,EAAW;IACtB,KAAK,EAAM;IACX,aAAa,EAAQ;GACtB,CAAC;GAEG,MAAc,SAIlB,EAAM,eAAe,GACrB,EAAW,EAAU,EAAE,MAAM,GAC7B,EAAW,EAAU,EAAE,MAAM;EAC9B;EAGC,UAAA,CAYC,kBAAC,QAAD;GAAM,WAAW,EAAO;GAAxB,UAAA,CACC,kBAAC,QAAD;IAAM,WAAU;IAAc,UAAA;GAAY,CAAA,GACzC,KAAe,kBAAC,QAAD;IAAM,WAAU;IAAc,UAAA;GAAkB,CAAA,CAC3D;EACN,CAAA,GAAA,kBAAC,QAAD;GAAM,WAAW,EAAO;GACvB,UAAA,kBAAC,GAAD,EAAiB,OAAO;IAAE,SAAS;IAAS,YAAY,IAAY,YAAY;GAAS,EAAI,CAAA;EACxF,CAAA,CACC;;AAEV;AAEA,EAAW,SAAS"}
|
|
1
|
+
{"version":3,"file":"radio-group-DhpP7JSJ.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\tflex: 1 0 0%;\n\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--space-sm);\n\n\tcolor: var(--content-2);\n\t// border: var(--border-width) solid transparent;\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-1);\n\t\tbackground-color: var(--surface-2);\n\t\t// border-color: var(--border-1);\n\t}\n\n\t&.checked {\n\t\tcolor: var(--status-brand-on-fill);\n\t\tbackground-color: var(--status-brand-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\n.radioItemContent {\n\tflex: 1 0 0%;\n\n\tdisplay: grid;\n\talign-content: center;\n\tgap: var(--space-sm);\n}\n\n.radioItemIcon {\n\tflex: 0 0 0%;\n\n\tsvg {\n\t\twidth: 1em;\n\t\theight: 1em;\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\";\nimport { CheckCircleIcon } from \"lucide-react\";\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={styles.radioItemContent}>\n\t\t\t\t<span className=\"textNoWrap\">{label}</span>\n\t\t\t\t{description && <span className=\"fontSizeSm\">{description}</span>}\n\t\t\t</span>\n\t\t\t<span className={styles.radioItemIcon}>\n\t\t\t\t<CheckCircleIcon style={{ display: \"block\", visibility: isChecked ? \"visible\" : \"hidden\" }} />\n\t\t\t</span>\n\t\t</button>\n\t);\n}\n\nRadioGroup.Option = Option;\n"],"mappings":"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"}
|