@ryuzaki13/react-foundation-ui 1.0.1 → 1.0.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.d.ts +3 -0
- package/dist/advanced-search/index.d.ts.map +1 -0
- package/dist/advanced-search/index.js +361 -0
- package/dist/advanced-search/index.js.map +1 -0
- package/dist/advanced-search/lib/index.d.ts +2 -0
- package/dist/advanced-search/lib/index.d.ts.map +1 -0
- package/dist/advanced-search/lib/searchParts.d.ts +3 -0
- package/dist/advanced-search/lib/searchParts.d.ts.map +1 -0
- package/dist/advanced-search/model/index.d.ts +5 -0
- package/dist/advanced-search/model/index.d.ts.map +1 -0
- package/dist/advanced-search/model/types.d.ts +55 -0
- package/dist/advanced-search/model/types.d.ts.map +1 -0
- package/dist/advanced-search/model/useAdvancedSearch.d.ts +11 -0
- package/dist/advanced-search/model/useAdvancedSearch.d.ts.map +1 -0
- package/dist/advanced-search/model/useAdvancedSearchInitialSelected.d.ts +6 -0
- package/dist/advanced-search/model/useAdvancedSearchInitialSelected.d.ts.map +1 -0
- package/dist/advanced-search/model/useAdvancedSearchSelection.d.ts +13 -0
- package/dist/advanced-search/model/useAdvancedSearchSelection.d.ts.map +1 -0
- package/dist/advanced-search/ui/AdvancedSearchModal.d.ts +13 -0
- package/dist/advanced-search/ui/AdvancedSearchModal.d.ts.map +1 -0
- package/dist/advanced-search/ui/AdvancedSearchSelect.d.ts +8 -0
- package/dist/advanced-search/ui/AdvancedSearchSelect.d.ts.map +1 -0
- package/dist/advanced-search/ui/AdvancedSearchSelectUI.d.ts +9 -0
- package/dist/advanced-search/ui/AdvancedSearchSelectUI.d.ts.map +1 -0
- package/dist/advanced-search/ui/index.d.ts +2 -0
- package/dist/advanced-search/ui/index.d.ts.map +1 -0
- package/dist/badge/index.js +1 -1
- package/dist/badge/stories/Badge.stories.js +22 -22
- package/dist/base-table/index.js +2 -2
- package/dist/button/index.js +7 -7
- package/dist/button/stories/Button.stories.js +1 -1
- package/dist/check-box/index.js +1 -1
- package/dist/check-box/stories/CheckBox.stories.js +25 -25
- package/dist/chunks/{BadgeList-6qL9oNAp.js → BadgeList-DYgun2rf.js} +16 -16
- package/dist/chunks/{BadgeList-6qL9oNAp.js.map → BadgeList-DYgun2rf.js.map} +1 -1
- package/dist/chunks/{Button-BZ_b-Kin.js → Button-CCWuggdA.js} +16 -16
- package/dist/chunks/{Button-BZ_b-Kin.js.map → Button-CCWuggdA.js.map} +1 -1
- package/dist/chunks/CalendarView-DjeTJkTT.js +435 -0
- package/dist/chunks/{CalendarView-DjShdvRD.js.map → CalendarView-DjeTJkTT.js.map} +1 -1
- package/dist/chunks/CheckBox-BowNqqd3.js +48 -0
- package/dist/chunks/{CheckBox-CulnjNvJ.js.map → CheckBox-BowNqqd3.js.map} +1 -1
- package/dist/chunks/{DateInput-LSSvObtg.js → DateInput--tfofQ2x.js} +68 -68
- package/dist/chunks/{DateInput-LSSvObtg.js.map → DateInput--tfofQ2x.js.map} +1 -1
- package/dist/chunks/{DateRangePresetSelect-CyzGMvVp.js → DateRangePresetSelect-UgsfaOeM.js} +22 -22
- package/dist/chunks/{DateRangePresetSelect-CyzGMvVp.js.map → DateRangePresetSelect-UgsfaOeM.js.map} +1 -1
- package/dist/chunks/Detail-DHDMsg8q.js +80 -0
- package/dist/chunks/{Detail-DKolHye4.js.map → Detail-DHDMsg8q.js.map} +1 -1
- package/dist/chunks/{Dialog-BPS4BeWZ.js → Dialog-CFIvGxER.js} +8 -8
- package/dist/chunks/{Dialog-BPS4BeWZ.js.map → Dialog-CFIvGxER.js.map} +1 -1
- package/dist/chunks/DisclosureGroup-CfRTkl6Z.js +49 -0
- package/dist/chunks/{DisclosureGroup-Plk2M_Vl.js.map → DisclosureGroup-CfRTkl6Z.js.map} +1 -1
- package/dist/chunks/{DropZone-DPGTpHI6.js → DropZone-kJfbZU5g.js} +22 -22
- package/dist/chunks/{DropZone-DPGTpHI6.js.map → DropZone-kJfbZU5g.js.map} +1 -1
- package/dist/chunks/{DropdownMenu-Ds-trH4M.js → DropdownMenu-DQeR3y7M.js} +138 -138
- package/dist/chunks/{DropdownMenu-Ds-trH4M.js.map → DropdownMenu-DQeR3y7M.js.map} +1 -1
- package/dist/chunks/{Flex-DbBdq336.js → Flex-DUYSL5TE.js} +16 -16
- package/dist/chunks/{Flex-DbBdq336.js.map → Flex-DUYSL5TE.js.map} +1 -1
- package/dist/chunks/Input-BmjlpA09.js +227 -0
- package/dist/chunks/{Input-Wrew1puH.js.map → Input-BmjlpA09.js.map} +1 -1
- package/dist/chunks/{InputDateTime-2PCX8an8.js → InputDateTime-CxfAFe2L.js} +56 -56
- package/dist/chunks/{InputDateTime-2PCX8an8.js.map → InputDateTime-CxfAFe2L.js.map} +1 -1
- package/dist/chunks/{InputFile-Ca-bRo93.js → InputFile-CyZu__B_.js} +17 -17
- package/dist/chunks/{InputFile-Ca-bRo93.js.map → InputFile-CyZu__B_.js.map} +1 -1
- package/dist/chunks/{InputFiles-pI9rQXOI.js → InputFiles-CrTJV27R.js} +31 -31
- package/dist/chunks/{InputFiles-pI9rQXOI.js.map → InputFiles-CrTJV27R.js.map} +1 -1
- package/dist/chunks/{InputImage-B522AQzl.js → InputImage-Cw8rPYQu.js} +18 -18
- package/dist/chunks/{InputImage-B522AQzl.js.map → InputImage-Cw8rPYQu.js.map} +1 -1
- package/dist/chunks/{LabeledExpandableActionPanel-CWmOSWeS.js → LabeledExpandableActionPanel-D3kUvmFH.js} +26 -26
- package/dist/chunks/{LabeledExpandableActionPanel-CWmOSWeS.js.map → LabeledExpandableActionPanel-D3kUvmFH.js.map} +1 -1
- package/dist/chunks/Listbox-BZlp5qHz.js +81 -0
- package/dist/chunks/{Listbox-B6F_IKQv.js.map → Listbox-BZlp5qHz.js.map} +1 -1
- package/dist/chunks/{MultiSelect-CUXA8gx-.js → MultiSelect-D1XYuwH1.js} +113 -113
- package/dist/chunks/{MultiSelect-CUXA8gx-.js.map → MultiSelect-D1XYuwH1.js.map} +1 -1
- package/dist/chunks/{NotificationsHost-Bnq7xFKO.js → NotificationsHost-_icJx4xR.js} +44 -44
- package/dist/chunks/{NotificationsHost-Bnq7xFKO.js.map → NotificationsHost-_icJx4xR.js.map} +1 -1
- package/dist/chunks/{PresetRangeDateInput-B_8jsilZ.js → PresetRangeDateInput-CapirptQ.js} +11 -11
- package/dist/chunks/{PresetRangeDateInput-B_8jsilZ.js.map → PresetRangeDateInput-CapirptQ.js.map} +1 -1
- package/dist/chunks/RadioButton-D0uA0rX_.js +48 -0
- package/dist/chunks/{RadioButton-D5vPW4Yr.js.map → RadioButton-D0uA0rX_.js.map} +1 -1
- package/dist/chunks/RadioGroup-B9XjkcOy.js +121 -0
- package/dist/chunks/{RadioGroup-BAhN1d1X.js.map → RadioGroup-B9XjkcOy.js.map} +1 -1
- package/dist/chunks/{Select-CoAYWNOn.js → Select-CXeVjVKA.js} +11 -11
- package/dist/chunks/{Select-CoAYWNOn.js.map → Select-CXeVjVKA.js.map} +1 -1
- package/dist/chunks/{SerializableSelect-awBOWKTj.js → SerializableSelect-DkYeJtAO.js} +2 -2
- package/dist/chunks/{SerializableSelect-awBOWKTj.js.map → SerializableSelect-DkYeJtAO.js.map} +1 -1
- package/dist/chunks/{SingleDateTimeInput-o44Vlwdk.js → SingleDateTimeInput-BmeuVGQT.js} +78 -78
- package/dist/chunks/{SingleDateTimeInput-o44Vlwdk.js.map → SingleDateTimeInput-BmeuVGQT.js.map} +1 -1
- package/dist/chunks/{Splitter-NjNFuEq4.js → Splitter-BFkVGVRb.js} +32 -32
- package/dist/chunks/{Splitter-NjNFuEq4.js.map → Splitter-BFkVGVRb.js.map} +1 -1
- package/dist/chunks/StateSelect-1jH3uLz9.js +78 -0
- package/dist/chunks/{StateSelect-abZq176J.js.map → StateSelect-1jH3uLz9.js.map} +1 -1
- package/dist/chunks/{Switch-DHMnZVmN.js → Switch-B57Qmy1z.js} +19 -19
- package/dist/chunks/{Switch-DHMnZVmN.js.map → Switch-B57Qmy1z.js.map} +1 -1
- package/dist/chunks/{TextEditorLexicalClient-Dt4eaPA3.js → TextEditorLexicalClient-CovUSRag.js} +204 -204
- package/dist/chunks/{TextEditorLexicalClient-Dt4eaPA3.js.map → TextEditorLexicalClient-CovUSRag.js.map} +1 -1
- package/dist/chunks/{Textarea-DOVrPH4I.js → Textarea-C9UdUueF.js} +2 -2
- package/dist/chunks/{Textarea-DOVrPH4I.js.map → Textarea-C9UdUueF.js.map} +1 -1
- package/dist/chunks/{TimePanel-_kF2RtHk.js → TimePanel-b4saqoUY.js} +27 -27
- package/dist/chunks/{TimePanel-_kF2RtHk.js.map → TimePanel-b4saqoUY.js.map} +1 -1
- package/dist/chunks/{Toggle-C_fE-bkM.js → Toggle-DVqOQXmt.js} +18 -18
- package/dist/chunks/{Toggle-C_fE-bkM.js.map → Toggle-DVqOQXmt.js.map} +1 -1
- package/dist/chunks/{TreeMultiSelect-C76RYavo.js → TreeMultiSelect-CfQhlfnC.js} +6 -6
- package/dist/chunks/{TreeMultiSelect-C76RYavo.js.map → TreeMultiSelect-CfQhlfnC.js.map} +1 -1
- package/dist/chunks/{TreePickerBase-qNHIWbYL.js → TreePickerBase-BBUOWsSu.js} +49 -49
- package/dist/chunks/{TreePickerBase-qNHIWbYL.js.map → TreePickerBase-BBUOWsSu.js.map} +1 -1
- package/dist/chunks/{TreeSelect-LEhNdPCX.js → TreeSelect-2wUXs90E.js} +6 -6
- package/dist/chunks/{TreeSelect-LEhNdPCX.js.map → TreeSelect-2wUXs90E.js.map} +1 -1
- package/dist/chunks/base-table-CoQlKABk.js +514 -0
- package/dist/chunks/{base-table-ij2guVMB.js.map → base-table-CoQlKABk.js.map} +1 -1
- package/dist/chunks/{floating-arrow-CdRV69sg.js → floating-arrow-BE-z4QkE.js} +7 -7
- package/dist/chunks/{floating-arrow-CdRV69sg.js.map → floating-arrow-BE-z4QkE.js.map} +1 -1
- package/dist/chunks/input-search-Dw4rnJBq.js +30 -0
- package/dist/chunks/input-search-Dw4rnJBq.js.map +1 -0
- package/dist/chunks/{layout-picker-CzZ8Xzkk.js → layout-picker-MWaImn3L.js} +34 -34
- package/dist/chunks/{layout-picker-CzZ8Xzkk.js.map → layout-picker-MWaImn3L.js.map} +1 -1
- package/dist/chunks/{misc-Bj0y3ERC.js → misc-DoqZBMof.js} +110 -110
- package/dist/chunks/{misc-Bj0y3ERC.js.map → misc-DoqZBMof.js.map} +1 -1
- package/dist/chunks/{modal-B4ivQb2h.js → modal-ByNRME3b.js} +42 -42
- package/dist/chunks/{modal-B4ivQb2h.js.map → modal-ByNRME3b.js.map} +1 -1
- package/dist/chunks/multi-select-BzYIviCU.js +1305 -0
- package/dist/chunks/multi-select-BzYIviCU.js.map +1 -0
- package/dist/chunks/{picker-gIUs0nE_.js → picker-Dg55Ss-B.js} +74 -74
- package/dist/chunks/{picker-gIUs0nE_.js.map → picker-Dg55Ss-B.js.map} +1 -1
- package/dist/chunks/{popover-C79P5bm2.js → popover-xJJqy1v6.js} +52 -52
- package/dist/chunks/{popover-C79P5bm2.js.map → popover-xJJqy1v6.js.map} +1 -1
- package/dist/chunks/{separator-CIqnk2z9.js → separator-B72Aq-6a.js} +2 -2
- package/dist/chunks/{separator-CIqnk2z9.js.map → separator-B72Aq-6a.js.map} +1 -1
- package/dist/chunks/{slider-CigVo4Ju.js → slider-CFKsfxFp.js} +83 -83
- package/dist/chunks/{slider-CigVo4Ju.js.map → slider-CFKsfxFp.js.map} +1 -1
- package/dist/chunks/sortable-DcTIAbjD.js +185 -0
- package/dist/chunks/{sortable-BZqnZ_LA.js.map → sortable-DcTIAbjD.js.map} +1 -1
- package/dist/chunks/{table-CK-CM2zD.js → table-Dc3AqMzP.js} +21 -21
- package/dist/chunks/{table-CK-CM2zD.js.map → table-Dc3AqMzP.js.map} +1 -1
- package/dist/chunks/{table-column-interactions-DPyJDD7P.js → table-column-interactions-6RGjmiI5.js} +24 -24
- package/dist/chunks/{table-column-interactions-DPyJDD7P.js.map → table-column-interactions-6RGjmiI5.js.map} +1 -1
- package/dist/chunks/{tabs-D5ikIIng.js → tabs-DlnVVMJl.js} +96 -96
- package/dist/chunks/{tabs-D5ikIIng.js.map → tabs-DlnVVMJl.js.map} +1 -1
- package/dist/chunks/{toolbar-C-Ziw_Uh.js → toolbar-BCZNdRXM.js} +2 -2
- package/dist/chunks/{toolbar-C-Ziw_Uh.js.map → toolbar-BCZNdRXM.js.map} +1 -1
- package/dist/chunks/{wheel-picker-DUHGy7wE.js → wheel-picker-FS58cRsQ.js} +23 -23
- package/dist/chunks/{wheel-picker-DUHGy7wE.js.map → wheel-picker-FS58cRsQ.js.map} +1 -1
- package/dist/context-menu/index.js +1 -1
- package/dist/context-menu/stories/ContextMenu.stories.js +45 -45
- package/dist/date-input/index.js +2 -2
- package/dist/date-input/stories/DateInput.stories.js +2 -2
- package/dist/date-range-preset-select/index.js +1 -1
- package/dist/date-range-preset-select/stories/DateRangePresetSelect.stories.js +8 -8
- package/dist/date-time-input/index.js +1 -1
- package/dist/date-time-input/stories/SingleDateTimeInput.stories.js +38 -38
- package/dist/date-time-input/stories/TimePanel.stories.js +9 -9
- package/dist/detail/index.js +1 -1
- package/dist/detail/stories/Detail.stories.js +1 -1
- package/dist/dialog/index.js +1 -1
- package/dist/dialog/stories/Dialog.stories.js +16 -16
- package/dist/disclosure/index.js +1 -1
- package/dist/disclosure/stories/Disclosure.stories.js +1 -1
- package/dist/drop-zone/index.js +1 -1
- package/dist/drop-zone/stories/DropZone.stories.js +14 -14
- package/dist/errors/index.js +47 -47
- package/dist/expandable-action-panel/index.js +1 -1
- package/dist/expandable-action-panel/stories/ExpandableActionPanel.stories.js +28 -28
- package/dist/flex/index.js +2 -2
- package/dist/flex/stories/Flex.stories.js +2 -2
- package/dist/floating-arrow/index.js +1 -1
- package/dist/fullscreen-portal/index.js +6 -6
- package/dist/grid/stories/Grid.stories.js +1 -1
- package/dist/image/index.js +123 -123
- package/dist/input/index.js +1 -1
- package/dist/input/stories/Input.stories.js +11 -11
- package/dist/input-date-time/index.js +1 -1
- package/dist/input-date-time/stories/InputDateTime.stories.js +11 -11
- package/dist/input-file/index.js +1 -1
- package/dist/input-file/stories/InputFile.stories.js +9 -9
- package/dist/input-files/index.js +1 -1
- package/dist/input-files/stories/InputFiles.stories.js +9 -9
- package/dist/input-image/index.js +1 -1
- package/dist/input-image/stories/InputImage.stories.js +15 -15
- package/dist/input-search/index.js +2 -30
- package/dist/layout-picker/index.js +1 -1
- package/dist/layout-picker/stories/LayoutPicker.stories.js +52 -52
- package/dist/list/index.js +27 -27
- package/dist/listbox/index.js +1 -1
- package/dist/listbox/stories/Listbox.stories.js +19 -19
- package/dist/misc/index.js +1 -1
- package/dist/modal/ModalManagerProvider.d.ts.map +1 -1
- package/dist/modal/index.js +1 -1
- package/dist/modal/stories/Modal.stories.js +55 -55
- package/dist/modal/types.d.ts +1 -0
- package/dist/modal/types.d.ts.map +1 -1
- package/dist/multi-select/index.js +3 -1141
- package/dist/multi-select/ui/stories/MultiSelect.stories.js +17 -17
- package/dist/notifications/index.js +1 -1
- package/dist/notifications/ui/stories/NotificationsHost.stories.js +59 -59
- package/dist/period-select/index.js +20 -20
- package/dist/period-select/stories/PeriodSelect.stories.js +17 -17
- package/dist/picker/index.js +1 -1
- package/dist/popover/index.js +1 -1
- package/dist/popover/stories/Popover.stories.js +16 -16
- package/dist/preset-range-date-input/index.js +1 -1
- package/dist/preset-range-date-input/ui/stories/PresetRangeDateInput.stories.js +9 -9
- package/dist/preset-select/index.js +1 -1
- package/dist/radio-button/index.js +1 -1
- package/dist/radio-button/stories/RadioButton.stories.js +11 -11
- package/dist/radio-group/index.js +1 -1
- package/dist/radio-group/stories/RadioGroup.stories.js +21 -21
- package/dist/select/index.js +2 -2
- package/dist/select/stories/Select.stories.js +23 -23
- package/dist/select/stories/SerializableSelect.stories.js +22 -22
- package/dist/separator/index.js +1 -1
- package/dist/simple-table/index.js +5 -5
- package/dist/slider/index.js +1 -1
- package/dist/slider/stories/Slider.stories.js +32 -32
- package/dist/slider/stories/SliderInput.stories.js +39 -39
- package/dist/sortable/index.js +1 -1
- package/dist/sortable/stories/Sortable.stories.js +23 -23
- package/dist/splitter/index.js +1 -1
- package/dist/splitter/stories/Splitter.stories.js +1 -1
- package/dist/state-select/index.js +1 -1
- package/dist/state-select/stories/StateSelect.stories.js +23 -23
- package/dist/styles.css +1 -1
- package/dist/switch/index.js +1 -1
- package/dist/switch/stories/Switch.stories.js +11 -11
- package/dist/table/index.js +1 -1
- package/dist/table-column-interactions/index.js +1 -1
- package/dist/table-sorting/index.js +1 -1
- package/dist/tabs/index.js +1 -1
- package/dist/tabs/stories/Tabs.stories.js +39 -39
- package/dist/text/index.js +20 -20
- package/dist/text-editor/index.js +3 -3
- package/dist/text-editor/toolbar/index.js +1 -1
- package/dist/textarea/index.js +1 -1
- package/dist/textarea/stories/Textarea.stories.js +8 -8
- package/dist/three-scene/index.js +7 -7
- package/dist/toggle/index.js +1 -1
- package/dist/toggle/stories/Toggle.stories.js +7 -7
- package/dist/toolbar/index.js +16 -16
- package/dist/tree/index.js +24 -24
- package/dist/tree-select/index.js +2 -2
- package/dist/tree-select/stories/TreeMultiSelect.stories.js +9 -9
- package/dist/tree-select/stories/TreeSelect.stories.js +9 -9
- package/dist/tree-table/index.js +32 -32
- package/dist/wheel-picker/index.js +1 -1
- package/package.json +11 -1
- package/dist/chunks/CalendarView-DjShdvRD.js +0 -435
- package/dist/chunks/CheckBox-CulnjNvJ.js +0 -48
- package/dist/chunks/Detail-DKolHye4.js +0 -80
- package/dist/chunks/DisclosureGroup-Plk2M_Vl.js +0 -49
- package/dist/chunks/Input-Wrew1puH.js +0 -227
- package/dist/chunks/Listbox-B6F_IKQv.js +0 -81
- package/dist/chunks/RadioButton-D5vPW4Yr.js +0 -48
- package/dist/chunks/RadioGroup-BAhN1d1X.js +0 -121
- package/dist/chunks/StateSelect-abZq176J.js +0 -78
- package/dist/chunks/base-table-ij2guVMB.js +0 -514
- package/dist/chunks/sortable-BZqnZ_LA.js +0 -185
- package/dist/input-search/index.js.map +0 -1
- package/dist/multi-select/index.js.map +0 -1
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { t as e } from "./ui.module-BisoTevy.js";
|
|
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
|
+
import { cn as c, getRovingFocusTargetIndex as l, handleKeyboardActivation as u } from "@ryuzaki13/react-foundation-lib/utils";
|
|
4
|
+
import { jsx as d, jsxs as f } from "react/jsx-runtime";
|
|
5
|
+
var p = {
|
|
6
|
+
radioGroup: "nINbA6",
|
|
7
|
+
noWrap: "GL-UWx",
|
|
8
|
+
horizontal: "_6PeF-i",
|
|
9
|
+
vertical: "_5wP4aR",
|
|
10
|
+
radioItem: "S3MnZI",
|
|
11
|
+
checked: "KHJ0ja"
|
|
12
|
+
}, m = t(null);
|
|
13
|
+
function h({ value: t, onChange: r, label: a, description: l, disabled: u, className: h, noWrap: g, orientation: _ = "horizontal", "aria-label": v, children: y }) {
|
|
14
|
+
let b = i(), x = a ? `${b}-label` : void 0, S = l ? `${b}-description` : void 0, [C, w] = s([]), T = n((e) => r?.(e), [r]), E = n((e) => (w((t) => t.includes(e) ? t : [...t, e]), () => {
|
|
15
|
+
w((t) => t.filter((t) => t !== e));
|
|
16
|
+
}), []), D = o(() => ({
|
|
17
|
+
value: t,
|
|
18
|
+
onChange: T,
|
|
19
|
+
disabled: u,
|
|
20
|
+
orientation: _,
|
|
21
|
+
groupId: b,
|
|
22
|
+
labelId: x,
|
|
23
|
+
descriptionId: S,
|
|
24
|
+
firstOptionId: C[0],
|
|
25
|
+
registerOption: E
|
|
26
|
+
}), [
|
|
27
|
+
S,
|
|
28
|
+
u,
|
|
29
|
+
b,
|
|
30
|
+
T,
|
|
31
|
+
x,
|
|
32
|
+
_,
|
|
33
|
+
E,
|
|
34
|
+
C,
|
|
35
|
+
t
|
|
36
|
+
]);
|
|
37
|
+
return /* @__PURE__ */ f("div", {
|
|
38
|
+
className: c(e.uiElement, u && e.disabled, h),
|
|
39
|
+
children: [
|
|
40
|
+
a && /* @__PURE__ */ d("div", {
|
|
41
|
+
id: x,
|
|
42
|
+
className: e.uiLabel,
|
|
43
|
+
children: a
|
|
44
|
+
}),
|
|
45
|
+
l && /* @__PURE__ */ d("div", {
|
|
46
|
+
id: S,
|
|
47
|
+
className: e.uiDescription,
|
|
48
|
+
children: l
|
|
49
|
+
}),
|
|
50
|
+
/* @__PURE__ */ d(m.Provider, {
|
|
51
|
+
value: D,
|
|
52
|
+
children: /* @__PURE__ */ d("div", {
|
|
53
|
+
role: "radiogroup",
|
|
54
|
+
"aria-labelledby": x,
|
|
55
|
+
"aria-label": x ? void 0 : v,
|
|
56
|
+
"aria-describedby": S,
|
|
57
|
+
"aria-disabled": u || void 0,
|
|
58
|
+
"data-disabled": u || void 0,
|
|
59
|
+
className: c(e.uiInputControl, p.radioGroup, g && p.noWrap, p[_]),
|
|
60
|
+
children: y
|
|
61
|
+
})
|
|
62
|
+
})
|
|
63
|
+
]
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
function g({ value: e, label: t, description: n, className: o }) {
|
|
67
|
+
let s = r(m), h = i(), g = s?.registerOption;
|
|
68
|
+
if (a(() => {
|
|
69
|
+
if (g) return g(h);
|
|
70
|
+
}, [g, h]), !s) return /* @__PURE__ */ f("div", {
|
|
71
|
+
className: c(p.radioItem, o),
|
|
72
|
+
children: [/* @__PURE__ */ d("p", {
|
|
73
|
+
className: "textNoWrap",
|
|
74
|
+
children: t
|
|
75
|
+
}), n && /* @__PURE__ */ d("div", {
|
|
76
|
+
className: "fontSizeSm content2",
|
|
77
|
+
children: n
|
|
78
|
+
})]
|
|
79
|
+
});
|
|
80
|
+
let _ = Object.is(s.value, e), v = s.disabled === !0, y = s.value === void 0 && s.firstOptionId === h, b = () => {
|
|
81
|
+
v || _ || s.onChange?.(e);
|
|
82
|
+
};
|
|
83
|
+
return /* @__PURE__ */ f("button", {
|
|
84
|
+
id: `${s.groupId}-option-${h}`,
|
|
85
|
+
type: "button",
|
|
86
|
+
role: "radio",
|
|
87
|
+
"aria-checked": _,
|
|
88
|
+
disabled: v,
|
|
89
|
+
tabIndex: _ || y ? 0 : -1,
|
|
90
|
+
className: c(p.radioItem, _ && p.checked, o),
|
|
91
|
+
"data-ui": "radio-option",
|
|
92
|
+
"data-action": "select-radio-option",
|
|
93
|
+
onClick: b,
|
|
94
|
+
onKeyDown: (e) => {
|
|
95
|
+
if (v || u(e, b)) return;
|
|
96
|
+
let t = e.currentTarget, n = t.closest("[role=\"radiogroup\"]"), r = Array.from(n?.querySelectorAll("[role=\"radio\"]:not([disabled])") ?? []);
|
|
97
|
+
if (!r.length) return;
|
|
98
|
+
let i = r.indexOf(t);
|
|
99
|
+
if (i === -1) return;
|
|
100
|
+
let a = l({
|
|
101
|
+
currentIndex: i,
|
|
102
|
+
itemCount: r.length,
|
|
103
|
+
key: e.key,
|
|
104
|
+
orientation: s.orientation
|
|
105
|
+
});
|
|
106
|
+
a !== null && (e.preventDefault(), r[a]?.focus(), r[a]?.click());
|
|
107
|
+
},
|
|
108
|
+
children: [/* @__PURE__ */ d("p", {
|
|
109
|
+
className: "textNoWrap",
|
|
110
|
+
children: t
|
|
111
|
+
}), n && /* @__PURE__ */ d("div", {
|
|
112
|
+
className: "fontSizeSm content2",
|
|
113
|
+
children: n
|
|
114
|
+
})]
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
h.Option = g;
|
|
118
|
+
//#endregion
|
|
119
|
+
export { h as n, g as t };
|
|
120
|
+
|
|
121
|
+
//# sourceMappingURL=RadioGroup-B9XjkcOy.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RadioGroup-
|
|
1
|
+
{"version":3,"file":"RadioGroup-B9XjkcOy.js","names":[],"sources":["../../src/radio-group/RadioGroup.module.scss","../../src/radio-group/RadioGroup.tsx"],"sourcesContent":[".radioGroup {\n\tdisplay: flex;\n\talign-content: flex-start;\n\tflex-wrap: wrap;\n\t// min-height: var(--control-height);\n\theight: auto;\n\n\t&.noWrap {\n\t\tflex-wrap: nowrap;\n\t}\n\n\t&.horizontal {\n\t\tflex-direction: row;\n\t}\n\n\t&.vertical {\n\t\tflex-direction: column;\n\t\talign-content: stretch;\n\t}\n}\n\n.radioItem {\n\tdisplay: block;\n\tflex: 1 0 0;\n\tcolor: var(--content-2);\n\tborder-radius: var(--radius-xs);\n\tpadding: 0 var(--space-md);\n\tmargin: var(--border-width);\n\t// baseInputControl = --control-height, + borderTop/Bottom + transparentLineTop/Bottom\n\tmin-height: calc(var(--control-height) - calc(var(--border-width) * 4));\n\n\tcursor: pointer;\n\n\t&:hover {\n\t\tcolor: var(--content-accent);\n\t\t// background-color: var(--surface-1);\n\t}\n\n\t&.checked {\n\t\tcolor: var(--status-neutral-on-fill);\n\t\tbackground-color: var(--status-neutral-fill);\n\t\t// border-color: var(--border-0);\n\t}\n\n\t&:disabled {\n\t\topacity: var(--disabled-opacity);\n\t}\n}\n","import React, { createContext, KeyboardEvent, ReactNode, useCallback, useContext, useId, useLayoutEffect, useMemo, useState } from \"react\";\n\nimport { cn, getRovingFocusTargetIndex, handleKeyboardActivation } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport uiStyles from \"../ui.module.scss\";\n\nimport styles from \"./RadioGroup.module.scss\";\n\ninterface RadioGroupContextValue {\n\tvalue?: unknown;\n\tonChange?: (value: unknown) => void;\n\tdisabled?: boolean;\n\torientation: \"vertical\" | \"horizontal\";\n\tgroupId: string;\n\tlabelId?: string;\n\tdescriptionId?: string;\n\tfirstOptionId?: string;\n\tregisterOption: (optionId: string) => () => void;\n}\n\nconst RadioGroupContext = createContext<RadioGroupContextValue | null>(null);\n\ninterface RadioGroupProps<T> {\n\tvalue?: T;\n\tonChange?: (value: T) => void;\n\tlabel?: string;\n\tdescription?: string;\n\tdisabled?: boolean;\n\tclassName?: string;\n\tnoWrap?: true;\n\torientation?: \"vertical\" | \"horizontal\";\n\t\"aria-label\"?: string;\n\tchildren: React.ReactNode;\n}\n\n/**\n * Группа радиокнопок с общим состоянием выбранного значения. Обеспечивает единый API выбора и контекст для дочерних опций.\n */\nexport function RadioGroup<T>({\n\tvalue,\n\tonChange,\n\tlabel,\n\tdescription,\n\tdisabled,\n\tclassName,\n\tnoWrap,\n\torientation = \"horizontal\",\n\t\"aria-label\": ariaLabel,\n\tchildren\n}: RadioGroupProps<T>) {\n\tconst groupId = useId();\n\tconst labelId = label ? `${groupId}-label` : undefined;\n\tconst descriptionId = description ? `${groupId}-description` : undefined;\n\tconst [registeredOptionIds, setRegisteredOptionIds] = useState<string[]>([]);\n\tconst handleChange = useCallback((nextValue: unknown) => onChange?.(nextValue as T), [onChange]);\n\n\t/**\n\t * Хранит порядок опций внутри группы, чтобы при отсутствии выбранного значения\n\t * оставлять ровно один tab stop на первой доступной радиокнопке.\n\t */\n\tconst registerOption = useCallback((optionId: string) => {\n\t\tsetRegisteredOptionIds((currentIds) => (currentIds.includes(optionId) ? currentIds : [...currentIds, optionId]));\n\n\t\treturn () => {\n\t\t\tsetRegisteredOptionIds((currentIds) => currentIds.filter((currentId) => currentId !== optionId));\n\t\t};\n\t}, []);\n\n\tconst contextValue = useMemo(\n\t\t() => ({\n\t\t\tvalue,\n\t\t\tonChange: handleChange,\n\t\t\tdisabled,\n\t\t\torientation,\n\t\t\tgroupId,\n\t\t\tlabelId,\n\t\t\tdescriptionId,\n\t\t\tfirstOptionId: registeredOptionIds[0],\n\t\t\tregisterOption\n\t\t}),\n\t\t[descriptionId, disabled, groupId, handleChange, labelId, orientation, registerOption, registeredOptionIds, value]\n\t);\n\n\treturn (\n\t\t<div className={cn(uiStyles.uiElement, disabled && uiStyles.disabled, className)}>\n\t\t\t{label && (\n\t\t\t\t<div id={labelId} className={uiStyles.uiLabel}>\n\t\t\t\t\t{label}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t\t{description && (\n\t\t\t\t<div id={descriptionId} className={uiStyles.uiDescription}>\n\t\t\t\t\t{description}\n\t\t\t\t</div>\n\t\t\t)}\n\n\t\t\t<RadioGroupContext.Provider value={contextValue}>\n\t\t\t\t<div\n\t\t\t\t\trole=\"radiogroup\"\n\t\t\t\t\taria-labelledby={labelId}\n\t\t\t\t\taria-label={labelId ? undefined : ariaLabel}\n\t\t\t\t\taria-describedby={descriptionId}\n\t\t\t\t\taria-disabled={disabled || undefined}\n\t\t\t\t\tdata-disabled={disabled || undefined}\n\t\t\t\t\tclassName={cn(uiStyles.uiInputControl, styles.radioGroup, noWrap && styles.noWrap, styles[orientation])}>\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t</RadioGroupContext.Provider>\n\t\t</div>\n\t);\n}\n\ninterface OptionProps<T> {\n\tvalue: T;\n\tlabel: ReactNode;\n\tdescription?: ReactNode;\n\tclassName?: string;\n}\n\n/**\n * Опция внутри `RadioGroup`, представляющая одно выбираемое значение. Отрисовывает подпись, описание и состояние выбора.\n */\nexport function Option<T>({ value, label, description, className }: OptionProps<T>) {\n\tconst context = useContext(RadioGroupContext);\n\tconst optionId = useId();\n\tconst registerOption = context?.registerOption;\n\n\tuseLayoutEffect(() => {\n\t\tif (!registerOption) {\n\t\t\treturn;\n\t\t}\n\n\t\treturn registerOption(optionId);\n\t}, [registerOption, optionId]);\n\n\tif (!context) {\n\t\treturn (\n\t\t\t<div className={cn(styles.radioItem, className)}>\n\t\t\t\t<p className=\"textNoWrap\">{label}</p>\n\t\t\t\t{description && <div className=\"fontSizeSm content2\">{description}</div>}\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst isChecked = Object.is(context.value, value);\n\tconst isDisabled = context.disabled === true;\n\tconst isFallbackTabStop = context.value === undefined && context.firstOptionId === optionId;\n\n\tconst handleChange = () => {\n\t\tif (isDisabled || isChecked) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontext.onChange?.(value);\n\t};\n\n\t// TODO: логика переиспользуемая, надо вынести в хук\n\tconst handleKeyDown = (event: KeyboardEvent<HTMLButtonElement>) => {\n\t\tif (isDisabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (handleKeyboardActivation(event, handleChange)) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentTarget = event.currentTarget;\n\t\tconst groupElement = currentTarget.closest<HTMLElement>('[role=\"radiogroup\"]');\n\t\tconst radioItems = Array.from(groupElement?.querySelectorAll<HTMLButtonElement>('[role=\"radio\"]:not([disabled])') ?? []);\n\n\t\tif (!radioItems.length) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentIndex = radioItems.indexOf(currentTarget);\n\t\tif (currentIndex === -1) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst nextIndex = getRovingFocusTargetIndex({\n\t\t\tcurrentIndex,\n\t\t\titemCount: radioItems.length,\n\t\t\tkey: event.key,\n\t\t\torientation: context.orientation\n\t\t});\n\n\t\tif (nextIndex === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\t\tradioItems[nextIndex]?.focus();\n\t\tradioItems[nextIndex]?.click();\n\t};\n\n\treturn (\n\t\t<button\n\t\t\tid={`${context.groupId}-option-${optionId}`}\n\t\t\ttype=\"button\"\n\t\t\trole=\"radio\"\n\t\t\taria-checked={isChecked}\n\t\t\tdisabled={isDisabled}\n\t\t\ttabIndex={isChecked || isFallbackTabStop ? 0 : -1}\n\t\t\tclassName={cn(styles.radioItem, isChecked && styles.checked, className)}\n\t\t\tdata-ui=\"radio-option\"\n\t\t\tdata-action=\"select-radio-option\"\n\t\t\tonClick={handleChange}\n\t\t\tonKeyDown={handleKeyDown}>\n\t\t\t<p className=\"textNoWrap\">{label}</p>\n\t\t\t{description && <div className=\"fontSizeSm content2\">{description}</div>}\n\t\t</button>\n\t);\n}\n\nRadioGroup.Option = Option;\n"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { t as e } from "./ui.module-BisoTevy.js";
|
|
2
|
-
import { a as t, c as n, d as r, f as i, i as a, l as o, o as s, r as c, t as l, u } from "./picker-
|
|
3
|
-
import { cn as d } from "@ryuzaki13/react-foundation-lib/utils";
|
|
4
|
-
import { CheckIcon as ee, XIcon as f } from "lucide-react";
|
|
5
|
-
import { Fragment as p, jsx as m, jsxs as h } from "react/jsx-runtime";
|
|
2
|
+
import { a as t, c as n, d as r, f as i, i as a, l as o, o as s, r as c, t as l, u as ee } from "./picker-Dg55Ss-B.js";
|
|
6
3
|
import { useRef as te, useState as ne } from "react";
|
|
4
|
+
import { cn as u } from "@ryuzaki13/react-foundation-lib/utils";
|
|
5
|
+
import { CheckIcon as d, XIcon as f } from "lucide-react";
|
|
6
|
+
import { Fragment as p, jsx as m, jsxs as h } from "react/jsx-runtime";
|
|
7
7
|
//#region src/select/lib/getOptionSearchText.ts
|
|
8
8
|
function re({ option: e, getOptionLabel: t, getOptionCode: n }) {
|
|
9
9
|
return [s(t(e)), s(n?.(e))].filter((e) => !!e).join(" ").toLowerCase();
|
|
@@ -85,7 +85,7 @@ function v({ label: g, description: v, disabled: y, placeholder: b, size: ie, op
|
|
|
85
85
|
"aria-controls": L ? s : void 0,
|
|
86
86
|
"aria-autocomplete": A ? "list" : "none",
|
|
87
87
|
"aria-activedescendant": L ? K(s) : void 0,
|
|
88
|
-
inputClassName:
|
|
88
|
+
inputClassName: u(Q && _.inputWithOverlay, ce, "textOverflow"),
|
|
89
89
|
overlay: Q ? /* @__PURE__ */ m("div", {
|
|
90
90
|
className: _.valueOverlay,
|
|
91
91
|
children: Y
|
|
@@ -135,10 +135,10 @@ function v({ label: g, description: v, disabled: y, placeholder: b, size: ie, op
|
|
|
135
135
|
setFloating: xe,
|
|
136
136
|
getFloatingProps: ye,
|
|
137
137
|
onKeyDown: Oe,
|
|
138
|
-
className:
|
|
138
|
+
className: u(e.uiPopupOptions, le),
|
|
139
139
|
header: he,
|
|
140
140
|
children: /* @__PURE__ */ m("div", {
|
|
141
|
-
className:
|
|
141
|
+
className: u(ue, "h100 scrollable"),
|
|
142
142
|
children: q ? W.map((t, n) => {
|
|
143
143
|
let r = w(t), i = B !== void 0 && r === B, a = n === ge, o = D?.(t) ?? !1, c = {
|
|
144
144
|
active: a,
|
|
@@ -152,10 +152,10 @@ function v({ label: g, description: v, disabled: y, placeholder: b, size: ie, op
|
|
|
152
152
|
"aria-selected": i,
|
|
153
153
|
"aria-disabled": o || void 0,
|
|
154
154
|
"aria-label": ae?.(t),
|
|
155
|
-
className:
|
|
155
|
+
className: u(e.uiPopupOption, o && e.disabled, a && e.uiPopupOptionActive, i && e.selected, oe?.(t, c)),
|
|
156
156
|
onClick: () => Te(t),
|
|
157
157
|
children: O ? O(t, c) : /* @__PURE__ */ h(p, { children: [
|
|
158
|
-
m(i ?
|
|
158
|
+
m(i ? d : "span", { className: e.uiPopupOptionIcon }),
|
|
159
159
|
/* @__PURE__ */ m("div", {
|
|
160
160
|
className: e.uiOptionText,
|
|
161
161
|
children: T(t)
|
|
@@ -166,7 +166,7 @@ function v({ label: g, description: v, disabled: y, placeholder: b, size: ie, op
|
|
|
166
166
|
})
|
|
167
167
|
] })
|
|
168
168
|
}, r);
|
|
169
|
-
}) : /* @__PURE__ */ m(
|
|
169
|
+
}) : /* @__PURE__ */ m(ee, {
|
|
170
170
|
emptyState: j,
|
|
171
171
|
loadingState: M,
|
|
172
172
|
errorState: N
|
|
@@ -179,4 +179,4 @@ function v({ label: g, description: v, disabled: y, placeholder: b, size: ie, op
|
|
|
179
179
|
//#endregion
|
|
180
180
|
export { g as n, v as t };
|
|
181
181
|
|
|
182
|
-
//# sourceMappingURL=Select-
|
|
182
|
+
//# sourceMappingURL=Select-CXeVjVKA.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Select-CoAYWNOn.js","names":[],"sources":["../../src/select/lib/getOptionSearchText.ts","../../src/select/Select.module.scss","../../src/select/Select.tsx"],"sourcesContent":["import { ReactNode } from \"react\";\n\nimport { InputType } from \"@ryuzaki13/react-foundation-lib/types\";\n\nimport { extractPickerTextContent } from \"../../picker\";\n\nexport function getOptionSearchText<T extends InputType>({\n\toption,\n\tgetOptionLabel,\n\tgetOptionCode\n}: {\n\toption: T;\n\tgetOptionLabel: (option: T) => ReactNode;\n\tgetOptionCode?: (option: T) => ReactNode;\n}) {\n\treturn [extractPickerTextContent(getOptionLabel(option)), extractPickerTextContent(getOptionCode?.(option))]\n\t\t.filter((part): part is string => Boolean(part))\n\t\t.join(\" \")\n\t\t.toLowerCase();\n}\n\n/** Находит selected option по value и возвращает fallback, если значение еще не нормализовано. */\nexport function resolveSelectedOption<TOption extends { value: string }>(\n\toptions: readonly TOption[],\n\tvalue: string,\n\tfallback: TOption\n): TOption {\n\treturn options.find((option) => option.value === value) ?? fallback;\n}\n",".inputWithOverlay {\n\tcolor: transparent;\n\tcaret-color: transparent;\n}\n\n.valueOverlay {\n\tposition: absolute;\n\tinset: 0 calc(var(--control-height) + var(--space-xs)) 0 var(--space-md);\n\tdisplay: flex;\n\talign-items: center;\n\tpointer-events: none;\n\toverflow: hidden;\n}\n","import { ReactNode, useRef, useState } from \"react\";\n\nimport { Placement } from \"@floating-ui/react\";\nimport { InputType } from \"@ryuzaki13/react-foundation-lib/types\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { CheckIcon, XIcon } from \"lucide-react\";\n\nimport {\n\textractPickerTextContent,\n\tPickerField,\n\tPickerPopup,\n\tPickerStatus,\n\tPickerTriggerActions,\n\tPickerTriggerInput,\n\tusePickerDefaultFilter,\n\tusePickerFloatingListbox,\n\tusePickerQuery,\n\tusePickerTriggerController\n} from \"../picker\";\nimport { UiBaseProps } from \"../types\";\nimport uiStyles from \"../ui.module.scss\";\n\nimport { getOptionSearchText } from \"./lib\";\nimport styles from \"./Select.module.scss\";\n\nexport type SelectOptionKey = string | number;\n\nexport type SelectOptionState = {\n\tactive: boolean;\n\tselected: boolean;\n\tdisabled: boolean;\n};\n\nexport interface SelectProps<TOption extends InputType, TChangeValue extends TOption | undefined = TOption> extends UiBaseProps<\n\tTChangeValue,\n\tTOption | undefined\n> {\n\toptions: readonly TOption[];\n\tgetOptionKey: (option: TOption) => SelectOptionKey;\n\tgetOptionLabel: (option: TOption) => ReactNode;\n\tgetOptionCode?: (option: TOption) => ReactNode;\n\tgetOptionDisabled?: (option: TOption) => boolean;\n\tgetOptionAriaLabel?: (option: TOption) => string;\n\tgetOptionClassName?: (option: TOption, state: SelectOptionState) => string | undefined;\n\trenderOption?: (option: TOption, state: SelectOptionState) => ReactNode;\n\trenderValue?: (option: TOption) => ReactNode;\n\tclassName?: string;\n\tbuttonClassName?: string;\n\toptionsClassName?: string;\n\toptionsContentClassName?: string;\n\tsearchable?: boolean;\n\tquery?: string;\n\tdefaultQuery?: string;\n\tonQuery?: (value: string) => void;\n\tdefaultFilter?: boolean;\n\trenderPopupHeader?: ReactNode;\n\temptyState?: ReactNode;\n\tloadingState?: ReactNode;\n\terrorState?: ReactNode;\n\tplacement?: Placement;\n\tclearable?: boolean;\n}\n\n/**\n * Выпадающий список выбора значения из набора опций. Подходит для форм, фильтров и простых справочников.\n */\nexport function Select<TOption extends InputType, TChangeValue extends TOption | undefined = TOption>({\n\tlabel,\n\tdescription,\n\tdisabled,\n\tplaceholder,\n\tsize,\n\toptions,\n\tvalue,\n\tonChange,\n\tgetOptionKey,\n\tgetOptionLabel,\n\tgetOptionCode,\n\tgetOptionDisabled,\n\tgetOptionAriaLabel,\n\tgetOptionClassName,\n\trenderOption,\n\trenderValue,\n\tclassName,\n\tbuttonClassName,\n\toptionsClassName,\n\toptionsContentClassName,\n\tsearchable = false,\n\tdefaultFilter = true,\n\tquery,\n\tdefaultQuery,\n\tonQuery,\n\trenderPopupHeader,\n\temptyState,\n\tloadingState,\n\terrorState,\n\tplacement = \"bottom-start\",\n\tclearable = false\n}: SelectProps<TOption, TChangeValue>) {\n\tconst inputRef = useRef<HTMLInputElement | null>(null);\n\tconst [open, setOpen] = useState(false);\n\tconst triggerMode = searchable ? \"search-single\" : \"display\";\n\tconst selectedKey = value === undefined ? undefined : getOptionKey(value);\n\tconst selectedOption =\n\t\tselectedKey === undefined ? undefined : (options.find((option) => getOptionKey(option) === selectedKey) ?? value);\n\tconst { query: currentQuery, setQuery } = usePickerQuery({\n\t\topen,\n\t\tquery,\n\t\tdefaultQuery,\n\t\tonQuery,\n\t\ttriggerMode\n\t});\n\tconst visibleOptions = usePickerDefaultFilter({\n\t\toptions,\n\t\tquery: currentQuery,\n\t\tenabled: searchable && defaultFilter,\n\t\tgetSearchText: (option) =>\n\t\t\tgetOptionSearchText({\n\t\t\t\toption,\n\t\t\t\tgetOptionLabel,\n\t\t\t\tgetOptionCode\n\t\t\t})\n\t});\n\tconst selectedIndex = selectedKey === undefined ? -1 : visibleOptions.findIndex((option) => getOptionKey(option) === selectedKey);\n\tconst {\n\t\tactiveIndex,\n\t\tcontext,\n\t\tfloatingStyles,\n\t\tgetFloatingProps,\n\t\tsetReference,\n\t\tsetFloating,\n\t\tsetOptionRef,\n\t\tclose,\n\t\topenList,\n\t\ttoggleOpen,\n\t\tselectOption,\n\t\tselectActiveOption,\n\t\thandleReferenceKeyDown,\n\t\thandleFloatingKeyDown,\n\t\tgetOptionId,\n\t\tgetActiveOptionId\n\t} = usePickerFloatingListbox({\n\t\toptions: visibleOptions,\n\t\tselectedIndex,\n\t\topen,\n\t\tonOpenChange: setOpen,\n\t\tgetOptionDisabled,\n\t\tonSelect: (option) => onChange(option as TChangeValue),\n\t\tdisabled,\n\t\tplacement,\n\t\ttriggerMode\n\t});\n\n\tconst hasOptions = visibleOptions.length > 0;\n\tconst labelContent = selectedOption !== undefined ? getOptionLabel(selectedOption) : undefined;\n\tconst displayContent = selectedOption !== undefined ? (renderValue ? renderValue(selectedOption) : labelContent) : undefined;\n\tconst labelText = extractPickerTextContent(labelContent);\n\tconst codeText = selectedOption !== undefined ? extractPickerTextContent(getOptionCode?.(selectedOption)) : undefined;\n\tconst displayText =\n\t\textractPickerTextContent(displayContent) ?? labelText ?? codeText ?? (selectedKey !== undefined ? String(selectedKey) : \"\");\n\tconst showSearchValue = searchable && (open || currentQuery.length > 0);\n\tconst inputValue = showSearchValue ? currentQuery : selectedOption !== undefined ? displayText : \"\";\n\tconst showDisplayOverlay =\n\t\tselectedOption !== undefined &&\n\t\tdisplayContent !== undefined &&\n\t\textractPickerTextContent(displayContent) === undefined &&\n\t\t!showSearchValue;\n\tconst triggerController = usePickerTriggerController({\n\t\tmode: triggerMode,\n\t\topen,\n\t\tcurrentQuery,\n\t\thasDisplayValue: selectedOption !== undefined,\n\t\tinputRef,\n\t\tsetQuery,\n\t\topenList,\n\t\tclose,\n\t\ttoggleOpen\n\t});\n\tconst setInputNode = (node: HTMLInputElement | null) => {\n\t\tinputRef.current = node;\n\t};\n\tconst handleClear = () => {\n\t\tif (clearable) {\n\t\t\tonChange(undefined as TChangeValue);\n\t\t}\n\n\t\tsetQuery(\"\");\n\t\tclose();\n\t};\n\n\treturn (\n\t\t<PickerField\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tdisabled={disabled}\n\t\t\tplaceholder={placeholder}\n\t\t\tsize={size}\n\t\t\tclassName={className}>\n\t\t\t{({ controlId, labelId, describedBy }) => {\n\t\t\t\tconst listId = `${controlId}-listbox`;\n\n\t\t\t\treturn (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<PickerTriggerInput\n\t\t\t\t\t\t\tref={setInputNode}\n\t\t\t\t\t\t\trootRef={setReference}\n\t\t\t\t\t\t\tid={controlId}\n\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\treadOnly={!searchable}\n\t\t\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\t\t\tvalue={inputValue}\n\t\t\t\t\t\t\tplaceholder={selectedOption === undefined || showSearchValue ? placeholder : undefined}\n\t\t\t\t\t\t\taria-labelledby={labelId}\n\t\t\t\t\t\t\taria-describedby={describedBy}\n\t\t\t\t\t\t\taria-haspopup=\"listbox\"\n\t\t\t\t\t\t\taria-expanded={open}\n\t\t\t\t\t\t\taria-controls={open ? listId : undefined}\n\t\t\t\t\t\t\taria-autocomplete={searchable ? \"list\" : \"none\"}\n\t\t\t\t\t\t\taria-activedescendant={open ? getActiveOptionId(listId) : undefined}\n\t\t\t\t\t\t\tinputClassName={cn(showDisplayOverlay && styles.inputWithOverlay, buttonClassName, \"textOverflow\")}\n\t\t\t\t\t\t\toverlay={showDisplayOverlay ? <div className={styles.valueOverlay}>{displayContent}</div> : undefined}\n\t\t\t\t\t\t\tendAdornment={\n\t\t\t\t\t\t\t\t<PickerTriggerActions\n\t\t\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\tonToggleMouseDown={triggerController.handleToggleMouseDown}\n\t\t\t\t\t\t\t\t\tonToggleClick={triggerController.handleToggleClick}>\n\t\t\t\t\t\t\t\t\t{clearable && selectedOption !== undefined && !disabled ? (\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tclassName={uiStyles.uiClearButton}\n\t\t\t\t\t\t\t\t\t\t\tdata-ui=\"select-clear-button\"\n\t\t\t\t\t\t\t\t\t\t\tdata-action=\"clear-select\"\n\t\t\t\t\t\t\t\t\t\t\tonMouseDown={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t\thandleClear();\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\taria-label=\"Очистить выбор\">\n\t\t\t\t\t\t\t\t\t\t\t<XIcon />\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t</PickerTriggerActions>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tonChange={(event) => {\n\t\t\t\t\t\t\t\tif (!searchable) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerInputChange(event.target.value);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonClick={triggerController.handleTriggerClick}\n\t\t\t\t\t\t\tonFocus={(event) => {\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerFocus(event.currentTarget);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\t\t\thandleReferenceKeyDown(event);\n\n\t\t\t\t\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerKeyDown({\n\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\tonActivateWhenOpen: selectActiveOption,\n\t\t\t\t\t\t\t\t\tenableSpaceActivation: !searchable\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t<PickerPopup\n\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\tcontext={context}\n\t\t\t\t\t\t\tfloatingStyles={floatingStyles}\n\t\t\t\t\t\t\tlistId={listId}\n\t\t\t\t\t\t\tlabelId={labelId}\n\t\t\t\t\t\t\tdescriptionId={describedBy}\n\t\t\t\t\t\t\tactiveOptionId={hasOptions ? getActiveOptionId(listId) : undefined}\n\t\t\t\t\t\t\tsetFloating={setFloating}\n\t\t\t\t\t\t\tgetFloatingProps={getFloatingProps}\n\t\t\t\t\t\t\tonKeyDown={handleFloatingKeyDown}\n\t\t\t\t\t\t\tclassName={cn(uiStyles.uiPopupOptions, optionsClassName)}\n\t\t\t\t\t\t\theader={renderPopupHeader}>\n\t\t\t\t\t\t\t<div className={cn(optionsContentClassName, \"h100 scrollable\")}>\n\t\t\t\t\t\t\t\t{hasOptions ? (\n\t\t\t\t\t\t\t\t\tvisibleOptions.map((option, index) => {\n\t\t\t\t\t\t\t\t\t\tconst optionKey = getOptionKey(option);\n\t\t\t\t\t\t\t\t\t\tconst selected = selectedKey !== undefined && optionKey === selectedKey;\n\t\t\t\t\t\t\t\t\t\tconst active = index === activeIndex;\n\t\t\t\t\t\t\t\t\t\tconst optionDisabled = getOptionDisabled?.(option) ?? false;\n\t\t\t\t\t\t\t\t\t\tconst optionState = { active, selected, disabled: optionDisabled };\n\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\tkey={optionKey}\n\t\t\t\t\t\t\t\t\t\t\t\tid={getOptionId(listId, index)}\n\t\t\t\t\t\t\t\t\t\t\t\tref={(node) => setOptionRef(index, node)}\n\t\t\t\t\t\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-selected={selected}\n\t\t\t\t\t\t\t\t\t\t\t\taria-disabled={optionDisabled || undefined}\n\t\t\t\t\t\t\t\t\t\t\t\taria-label={getOptionAriaLabel?.(option)}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\tuiStyles.uiPopupOption,\n\t\t\t\t\t\t\t\t\t\t\t\t\toptionDisabled && uiStyles.disabled,\n\t\t\t\t\t\t\t\t\t\t\t\t\tactive && uiStyles.uiPopupOptionActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\tselected && uiStyles.selected,\n\t\t\t\t\t\t\t\t\t\t\t\t\tgetOptionClassName?.(option, optionState)\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => selectOption(option)}>\n\t\t\t\t\t\t\t\t\t\t\t\t{renderOption ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\trenderOption(option, optionState)\n\t\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{selected ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<CheckIcon className={uiStyles.uiPopupOptionIcon} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className={uiStyles.uiPopupOptionIcon} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className={uiStyles.uiOptionText}>{getOptionLabel(option)}</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{getOptionCode && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className={uiStyles.uiOptionCode}>{getOptionCode(option)}</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<PickerStatus emptyState={emptyState} loadingState={loadingState} errorState={errorState} />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</PickerPopup>\n\t\t\t\t\t</>\n\t\t\t\t);\n\t\t\t}}\n\t\t</PickerField>\n\t);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Select-CXeVjVKA.js","names":[],"sources":["../../src/select/lib/getOptionSearchText.ts","../../src/select/Select.module.scss","../../src/select/Select.tsx"],"sourcesContent":["import { ReactNode } from \"react\";\n\nimport { InputType } from \"@ryuzaki13/react-foundation-lib/types\";\n\nimport { extractPickerTextContent } from \"../../picker\";\n\nexport function getOptionSearchText<T extends InputType>({\n\toption,\n\tgetOptionLabel,\n\tgetOptionCode\n}: {\n\toption: T;\n\tgetOptionLabel: (option: T) => ReactNode;\n\tgetOptionCode?: (option: T) => ReactNode;\n}) {\n\treturn [extractPickerTextContent(getOptionLabel(option)), extractPickerTextContent(getOptionCode?.(option))]\n\t\t.filter((part): part is string => Boolean(part))\n\t\t.join(\" \")\n\t\t.toLowerCase();\n}\n\n/** Находит selected option по value и возвращает fallback, если значение еще не нормализовано. */\nexport function resolveSelectedOption<TOption extends { value: string }>(\n\toptions: readonly TOption[],\n\tvalue: string,\n\tfallback: TOption\n): TOption {\n\treturn options.find((option) => option.value === value) ?? fallback;\n}\n",".inputWithOverlay {\n\tcolor: transparent;\n\tcaret-color: transparent;\n}\n\n.valueOverlay {\n\tposition: absolute;\n\tinset: 0 calc(var(--control-height) + var(--space-xs)) 0 var(--space-md);\n\tdisplay: flex;\n\talign-items: center;\n\tpointer-events: none;\n\toverflow: hidden;\n}\n","import { ReactNode, useRef, useState } from \"react\";\n\nimport { Placement } from \"@floating-ui/react\";\nimport { InputType } from \"@ryuzaki13/react-foundation-lib/types\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { CheckIcon, XIcon } from \"lucide-react\";\n\nimport {\n\textractPickerTextContent,\n\tPickerField,\n\tPickerPopup,\n\tPickerStatus,\n\tPickerTriggerActions,\n\tPickerTriggerInput,\n\tusePickerDefaultFilter,\n\tusePickerFloatingListbox,\n\tusePickerQuery,\n\tusePickerTriggerController\n} from \"../picker\";\nimport { UiBaseProps } from \"../types\";\nimport uiStyles from \"../ui.module.scss\";\n\nimport { getOptionSearchText } from \"./lib\";\nimport styles from \"./Select.module.scss\";\n\nexport type SelectOptionKey = string | number;\n\nexport type SelectOptionState = {\n\tactive: boolean;\n\tselected: boolean;\n\tdisabled: boolean;\n};\n\nexport interface SelectProps<TOption extends InputType, TChangeValue extends TOption | undefined = TOption> extends UiBaseProps<\n\tTChangeValue,\n\tTOption | undefined\n> {\n\toptions: readonly TOption[];\n\tgetOptionKey: (option: TOption) => SelectOptionKey;\n\tgetOptionLabel: (option: TOption) => ReactNode;\n\tgetOptionCode?: (option: TOption) => ReactNode;\n\tgetOptionDisabled?: (option: TOption) => boolean;\n\tgetOptionAriaLabel?: (option: TOption) => string;\n\tgetOptionClassName?: (option: TOption, state: SelectOptionState) => string | undefined;\n\trenderOption?: (option: TOption, state: SelectOptionState) => ReactNode;\n\trenderValue?: (option: TOption) => ReactNode;\n\tclassName?: string;\n\tbuttonClassName?: string;\n\toptionsClassName?: string;\n\toptionsContentClassName?: string;\n\tsearchable?: boolean;\n\tquery?: string;\n\tdefaultQuery?: string;\n\tonQuery?: (value: string) => void;\n\tdefaultFilter?: boolean;\n\trenderPopupHeader?: ReactNode;\n\temptyState?: ReactNode;\n\tloadingState?: ReactNode;\n\terrorState?: ReactNode;\n\tplacement?: Placement;\n\tclearable?: boolean;\n}\n\n/**\n * Выпадающий список выбора значения из набора опций. Подходит для форм, фильтров и простых справочников.\n */\nexport function Select<TOption extends InputType, TChangeValue extends TOption | undefined = TOption>({\n\tlabel,\n\tdescription,\n\tdisabled,\n\tplaceholder,\n\tsize,\n\toptions,\n\tvalue,\n\tonChange,\n\tgetOptionKey,\n\tgetOptionLabel,\n\tgetOptionCode,\n\tgetOptionDisabled,\n\tgetOptionAriaLabel,\n\tgetOptionClassName,\n\trenderOption,\n\trenderValue,\n\tclassName,\n\tbuttonClassName,\n\toptionsClassName,\n\toptionsContentClassName,\n\tsearchable = false,\n\tdefaultFilter = true,\n\tquery,\n\tdefaultQuery,\n\tonQuery,\n\trenderPopupHeader,\n\temptyState,\n\tloadingState,\n\terrorState,\n\tplacement = \"bottom-start\",\n\tclearable = false\n}: SelectProps<TOption, TChangeValue>) {\n\tconst inputRef = useRef<HTMLInputElement | null>(null);\n\tconst [open, setOpen] = useState(false);\n\tconst triggerMode = searchable ? \"search-single\" : \"display\";\n\tconst selectedKey = value === undefined ? undefined : getOptionKey(value);\n\tconst selectedOption =\n\t\tselectedKey === undefined ? undefined : (options.find((option) => getOptionKey(option) === selectedKey) ?? value);\n\tconst { query: currentQuery, setQuery } = usePickerQuery({\n\t\topen,\n\t\tquery,\n\t\tdefaultQuery,\n\t\tonQuery,\n\t\ttriggerMode\n\t});\n\tconst visibleOptions = usePickerDefaultFilter({\n\t\toptions,\n\t\tquery: currentQuery,\n\t\tenabled: searchable && defaultFilter,\n\t\tgetSearchText: (option) =>\n\t\t\tgetOptionSearchText({\n\t\t\t\toption,\n\t\t\t\tgetOptionLabel,\n\t\t\t\tgetOptionCode\n\t\t\t})\n\t});\n\tconst selectedIndex = selectedKey === undefined ? -1 : visibleOptions.findIndex((option) => getOptionKey(option) === selectedKey);\n\tconst {\n\t\tactiveIndex,\n\t\tcontext,\n\t\tfloatingStyles,\n\t\tgetFloatingProps,\n\t\tsetReference,\n\t\tsetFloating,\n\t\tsetOptionRef,\n\t\tclose,\n\t\topenList,\n\t\ttoggleOpen,\n\t\tselectOption,\n\t\tselectActiveOption,\n\t\thandleReferenceKeyDown,\n\t\thandleFloatingKeyDown,\n\t\tgetOptionId,\n\t\tgetActiveOptionId\n\t} = usePickerFloatingListbox({\n\t\toptions: visibleOptions,\n\t\tselectedIndex,\n\t\topen,\n\t\tonOpenChange: setOpen,\n\t\tgetOptionDisabled,\n\t\tonSelect: (option) => onChange(option as TChangeValue),\n\t\tdisabled,\n\t\tplacement,\n\t\ttriggerMode\n\t});\n\n\tconst hasOptions = visibleOptions.length > 0;\n\tconst labelContent = selectedOption !== undefined ? getOptionLabel(selectedOption) : undefined;\n\tconst displayContent = selectedOption !== undefined ? (renderValue ? renderValue(selectedOption) : labelContent) : undefined;\n\tconst labelText = extractPickerTextContent(labelContent);\n\tconst codeText = selectedOption !== undefined ? extractPickerTextContent(getOptionCode?.(selectedOption)) : undefined;\n\tconst displayText =\n\t\textractPickerTextContent(displayContent) ?? labelText ?? codeText ?? (selectedKey !== undefined ? String(selectedKey) : \"\");\n\tconst showSearchValue = searchable && (open || currentQuery.length > 0);\n\tconst inputValue = showSearchValue ? currentQuery : selectedOption !== undefined ? displayText : \"\";\n\tconst showDisplayOverlay =\n\t\tselectedOption !== undefined &&\n\t\tdisplayContent !== undefined &&\n\t\textractPickerTextContent(displayContent) === undefined &&\n\t\t!showSearchValue;\n\tconst triggerController = usePickerTriggerController({\n\t\tmode: triggerMode,\n\t\topen,\n\t\tcurrentQuery,\n\t\thasDisplayValue: selectedOption !== undefined,\n\t\tinputRef,\n\t\tsetQuery,\n\t\topenList,\n\t\tclose,\n\t\ttoggleOpen\n\t});\n\tconst setInputNode = (node: HTMLInputElement | null) => {\n\t\tinputRef.current = node;\n\t};\n\tconst handleClear = () => {\n\t\tif (clearable) {\n\t\t\tonChange(undefined as TChangeValue);\n\t\t}\n\n\t\tsetQuery(\"\");\n\t\tclose();\n\t};\n\n\treturn (\n\t\t<PickerField\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tdisabled={disabled}\n\t\t\tplaceholder={placeholder}\n\t\t\tsize={size}\n\t\t\tclassName={className}>\n\t\t\t{({ controlId, labelId, describedBy }) => {\n\t\t\t\tconst listId = `${controlId}-listbox`;\n\n\t\t\t\treturn (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<PickerTriggerInput\n\t\t\t\t\t\t\tref={setInputNode}\n\t\t\t\t\t\t\trootRef={setReference}\n\t\t\t\t\t\t\tid={controlId}\n\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\treadOnly={!searchable}\n\t\t\t\t\t\t\tautoComplete=\"off\"\n\t\t\t\t\t\t\trole=\"combobox\"\n\t\t\t\t\t\t\tvalue={inputValue}\n\t\t\t\t\t\t\tplaceholder={selectedOption === undefined || showSearchValue ? placeholder : undefined}\n\t\t\t\t\t\t\taria-labelledby={labelId}\n\t\t\t\t\t\t\taria-describedby={describedBy}\n\t\t\t\t\t\t\taria-haspopup=\"listbox\"\n\t\t\t\t\t\t\taria-expanded={open}\n\t\t\t\t\t\t\taria-controls={open ? listId : undefined}\n\t\t\t\t\t\t\taria-autocomplete={searchable ? \"list\" : \"none\"}\n\t\t\t\t\t\t\taria-activedescendant={open ? getActiveOptionId(listId) : undefined}\n\t\t\t\t\t\t\tinputClassName={cn(showDisplayOverlay && styles.inputWithOverlay, buttonClassName, \"textOverflow\")}\n\t\t\t\t\t\t\toverlay={showDisplayOverlay ? <div className={styles.valueOverlay}>{displayContent}</div> : undefined}\n\t\t\t\t\t\t\tendAdornment={\n\t\t\t\t\t\t\t\t<PickerTriggerActions\n\t\t\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\tonToggleMouseDown={triggerController.handleToggleMouseDown}\n\t\t\t\t\t\t\t\t\tonToggleClick={triggerController.handleToggleClick}>\n\t\t\t\t\t\t\t\t\t{clearable && selectedOption !== undefined && !disabled ? (\n\t\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\t\tclassName={uiStyles.uiClearButton}\n\t\t\t\t\t\t\t\t\t\t\tdata-ui=\"select-clear-button\"\n\t\t\t\t\t\t\t\t\t\t\tdata-action=\"clear-select\"\n\t\t\t\t\t\t\t\t\t\t\tonMouseDown={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t\t\t\t\t\t\thandleClear();\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\taria-label=\"Очистить выбор\">\n\t\t\t\t\t\t\t\t\t\t\t<XIcon />\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t</PickerTriggerActions>\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tonChange={(event) => {\n\t\t\t\t\t\t\t\tif (!searchable) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerInputChange(event.target.value);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonClick={triggerController.handleTriggerClick}\n\t\t\t\t\t\t\tonFocus={(event) => {\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerFocus(event.currentTarget);\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\t\t\thandleReferenceKeyDown(event);\n\n\t\t\t\t\t\t\t\tif (event.defaultPrevented) {\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\ttriggerController.handleTriggerKeyDown({\n\t\t\t\t\t\t\t\t\tevent,\n\t\t\t\t\t\t\t\t\tonActivateWhenOpen: selectActiveOption,\n\t\t\t\t\t\t\t\t\tenableSpaceActivation: !searchable\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t<PickerPopup\n\t\t\t\t\t\t\topen={open}\n\t\t\t\t\t\t\tcontext={context}\n\t\t\t\t\t\t\tfloatingStyles={floatingStyles}\n\t\t\t\t\t\t\tlistId={listId}\n\t\t\t\t\t\t\tlabelId={labelId}\n\t\t\t\t\t\t\tdescriptionId={describedBy}\n\t\t\t\t\t\t\tactiveOptionId={hasOptions ? getActiveOptionId(listId) : undefined}\n\t\t\t\t\t\t\tsetFloating={setFloating}\n\t\t\t\t\t\t\tgetFloatingProps={getFloatingProps}\n\t\t\t\t\t\t\tonKeyDown={handleFloatingKeyDown}\n\t\t\t\t\t\t\tclassName={cn(uiStyles.uiPopupOptions, optionsClassName)}\n\t\t\t\t\t\t\theader={renderPopupHeader}>\n\t\t\t\t\t\t\t<div className={cn(optionsContentClassName, \"h100 scrollable\")}>\n\t\t\t\t\t\t\t\t{hasOptions ? (\n\t\t\t\t\t\t\t\t\tvisibleOptions.map((option, index) => {\n\t\t\t\t\t\t\t\t\t\tconst optionKey = getOptionKey(option);\n\t\t\t\t\t\t\t\t\t\tconst selected = selectedKey !== undefined && optionKey === selectedKey;\n\t\t\t\t\t\t\t\t\t\tconst active = index === activeIndex;\n\t\t\t\t\t\t\t\t\t\tconst optionDisabled = getOptionDisabled?.(option) ?? false;\n\t\t\t\t\t\t\t\t\t\tconst optionState = { active, selected, disabled: optionDisabled };\n\n\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\t\t\tkey={optionKey}\n\t\t\t\t\t\t\t\t\t\t\t\tid={getOptionId(listId, index)}\n\t\t\t\t\t\t\t\t\t\t\t\tref={(node) => setOptionRef(index, node)}\n\t\t\t\t\t\t\t\t\t\t\t\trole=\"option\"\n\t\t\t\t\t\t\t\t\t\t\t\taria-selected={selected}\n\t\t\t\t\t\t\t\t\t\t\t\taria-disabled={optionDisabled || undefined}\n\t\t\t\t\t\t\t\t\t\t\t\taria-label={getOptionAriaLabel?.(option)}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\tuiStyles.uiPopupOption,\n\t\t\t\t\t\t\t\t\t\t\t\t\toptionDisabled && uiStyles.disabled,\n\t\t\t\t\t\t\t\t\t\t\t\t\tactive && uiStyles.uiPopupOptionActive,\n\t\t\t\t\t\t\t\t\t\t\t\t\tselected && uiStyles.selected,\n\t\t\t\t\t\t\t\t\t\t\t\t\tgetOptionClassName?.(option, optionState)\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => selectOption(option)}>\n\t\t\t\t\t\t\t\t\t\t\t\t{renderOption ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\trenderOption(option, optionState)\n\t\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{selected ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<CheckIcon className={uiStyles.uiPopupOptionIcon} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span className={uiStyles.uiPopupOptionIcon} />\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className={uiStyles.uiOptionText}>{getOptionLabel(option)}</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{getOptionCode && (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<div className={uiStyles.uiOptionCode}>{getOptionCode(option)}</div>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<PickerStatus emptyState={emptyState} loadingState={loadingState} errorState={errorState} />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</PickerPopup>\n\t\t\t\t\t</>\n\t\t\t\t);\n\t\t\t}}\n\t\t</PickerField>\n\t);\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { t as e } from "./Select-
|
|
1
|
+
import { t as e } from "./Select-CXeVjVKA.js";
|
|
2
2
|
import { jsx as t } from "react/jsx-runtime";
|
|
3
3
|
//#region src/select/SerializableSelect.tsx
|
|
4
4
|
function n(e, t) {
|
|
@@ -30,4 +30,4 @@ function i({ label: i, description: a, disabled: o, placeholder: s, size: c, opt
|
|
|
30
30
|
//#endregion
|
|
31
31
|
export { i as t };
|
|
32
32
|
|
|
33
|
-
//# sourceMappingURL=SerializableSelect-
|
|
33
|
+
//# sourceMappingURL=SerializableSelect-DkYeJtAO.js.map
|
package/dist/chunks/{SerializableSelect-awBOWKTj.js.map → SerializableSelect-DkYeJtAO.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SerializableSelect-
|
|
1
|
+
{"version":3,"file":"SerializableSelect-DkYeJtAO.js","names":[],"sources":["../../src/select/SerializableSelect.tsx"],"sourcesContent":["import { Select } from \"./Select\";\n\nimport type { UiBaseProps } from \"../types\";\nimport type { SelectOptionKey } from \"./Select\";\n\ntype SerializableOptionRecord = Record<string, unknown>;\n\ntype SerializableOptionKeyField<TOption extends SerializableOptionRecord> = {\n\t[K in keyof TOption]: Extract<TOption[K], SelectOptionKey> extends never ? never : K;\n}[keyof TOption];\n\ntype SerializableOptionValue<TOption extends SerializableOptionRecord, TOptionKey extends SerializableOptionKeyField<TOption>> = Extract<\n\tTOption[TOptionKey],\n\tSelectOptionKey\n>;\n\nexport interface SerializableSelectProps<\n\tTOption extends SerializableOptionRecord,\n\tTOptionKey extends SerializableOptionKeyField<TOption>,\n\tTOptionLabel extends keyof TOption\n> extends Omit<UiBaseProps<SerializableOptionValue<TOption, TOptionKey> | undefined>, \"onChange\"> {\n\toptions: readonly TOption[];\n\tonChange: (value: SerializableOptionValue<TOption, TOptionKey> | undefined) => void;\n\toptionKey: TOptionKey;\n\toptionLabel: TOptionLabel;\n\trenderCode?: true;\n\tclassName?: string;\n\tclearable?: boolean;\n}\n\nfunction getSerializableOptionKey<TOption extends SerializableOptionRecord, TOptionKey extends SerializableOptionKeyField<TOption>>(\n\toption: TOption,\n\toptionKey: TOptionKey\n): Extract<TOption[TOptionKey], SelectOptionKey> {\n\treturn option[optionKey] as Extract<TOption[TOptionKey], SelectOptionKey>;\n}\n\nfunction getSerializableOptionLabel<\n\tTOption extends SerializableOptionRecord,\n\tTOptionKey extends SerializableOptionKeyField<TOption>,\n\tTOptionLabel extends keyof TOption\n>(option: TOption, optionLabel: TOptionLabel, optionKey: TOptionKey): string | number {\n\tconst label = option[optionLabel];\n\n\tif (typeof label === \"string\" || typeof label === \"number\") {\n\t\treturn label;\n\t}\n\n\tconst key = getSerializableOptionKey(option, optionKey);\n\treturn typeof key === \"string\" || typeof key === \"number\" ? key : String(key);\n}\n\nexport function SerializableSelect<\n\tTOption extends SerializableOptionRecord,\n\tTOptionKey extends SerializableOptionKeyField<TOption>,\n\tTOptionLabel extends keyof TOption\n>({\n\tlabel,\n\tdescription,\n\tdisabled,\n\tplaceholder,\n\tsize,\n\toptions,\n\tvalue,\n\tonChange,\n\toptionKey,\n\toptionLabel,\n\trenderCode,\n\tclassName,\n\tclearable\n}: SerializableSelectProps<TOption, TOptionKey, TOptionLabel>) {\n\tconst selectedOption =\n\t\tvalue === undefined ? undefined : options.find((option) => getSerializableOptionKey(option, optionKey) === value);\n\n\treturn (\n\t\t<Select<TOption, TOption | undefined>\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tdisabled={disabled}\n\t\t\tplaceholder={placeholder}\n\t\t\tsize={size}\n\t\t\toptions={options}\n\t\t\tvalue={selectedOption}\n\t\t\tonChange={(option) => onChange(option ? getSerializableOptionKey(option, optionKey) : undefined)}\n\t\t\tgetOptionKey={(option) => getSerializableOptionKey(option, optionKey)}\n\t\t\tgetOptionLabel={(option) => getSerializableOptionLabel(option, optionLabel, optionKey)}\n\t\t\tgetOptionCode={renderCode ? (option) => getSerializableOptionKey(option, optionKey) : undefined}\n\t\t\tclassName={className}\n\t\t\tclearable={clearable}\n\t\t/>\n\t);\n}\n"],"mappings":";;;AA8BA,SAAS,EACR,GACA,GACgD;CAChD,OAAO,EAAO;AACf;AAEA,SAAS,EAIP,GAAiB,GAA2B,GAAwC;CACrF,IAAM,IAAQ,EAAO;CAErB,IAAI,OAAO,KAAU,YAAY,OAAO,KAAU,UACjD,OAAO;CAGR,IAAM,IAAM,EAAyB,GAAQ,CAAS;CACtD,OAAO,OAAO,KAAQ,YAAY,OAAO,KAAQ,WAAW,IAAM,OAAO,CAAG;AAC7E;AAEA,SAAgB,EAId,EACD,UACA,gBACA,aACA,gBACA,SACA,YACA,UACA,aACA,cACA,gBACA,eACA,cACA,gBAC8D;CAI9D,OACC,kBAAC,GAAD;EACQ;EACM;EACH;EACG;EACP;EACG;EACT,OAVD,MAAU,KAAA,IAAY,KAAA,IAAY,EAAQ,MAAM,MAAW,EAAyB,GAAQ,CAAS,MAAM,CAAK;EAW/G,WAAW,MAAW,EAAS,IAAS,EAAyB,GAAQ,CAAS,IAAI,KAAA,CAAS;EAC/F,eAAe,MAAW,EAAyB,GAAQ,CAAS;EACpE,iBAAiB,MAAW,EAA2B,GAAQ,GAAa,CAAS;EACrF,eAAe,KAAc,MAAW,EAAyB,GAAQ,CAAS,IAAI,KAAA;EAC3E;EACA;CACX,CAAA;AAEH"}
|