@ryuzaki13/react-foundation-ui 0.1.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/badge/Badge.d.ts.map +1 -1
- package/dist/badge/index.js +1 -1
- package/dist/badge/stories/Badge.stories.js +1 -1
- package/dist/base-table/index.js +1 -1
- package/dist/base-table/lib/columnPinning.d.ts.map +1 -1
- package/dist/base-table/model/useTableColumnOrder.d.ts +1 -1
- package/dist/base-table/model/useTableColumnOrder.d.ts.map +1 -1
- package/dist/base-table/model/useTableColumnSizing.d.ts +1 -1
- package/dist/base-table/model/useTableColumnSizing.d.ts.map +1 -1
- package/dist/base-table/ui/BaseTable.d.ts +2 -2
- package/dist/base-table/ui/BaseTable.d.ts.map +1 -1
- package/dist/base-table/ui/BaseTableHeaderCell.d.ts.map +1 -1
- package/dist/base-table/ui/FormattedTableCell.d.ts.map +1 -1
- package/dist/check-box/CheckBox.d.ts.map +1 -1
- package/dist/check-box/index.js +1 -1
- package/dist/check-box/stories/CheckBox.stories.js +1 -1
- package/dist/chunks/{BadgeList-DHW_Ktr3.js → BadgeList-6qL9oNAp.js} +5 -5
- package/dist/chunks/BadgeList-6qL9oNAp.js.map +1 -0
- package/dist/chunks/{CalendarView-B75faWIU.js → CalendarView-DjShdvRD.js} +42 -42
- package/dist/chunks/{CalendarView-B75faWIU.js.map → CalendarView-DjShdvRD.js.map} +1 -1
- package/dist/chunks/{CheckBox-Cck5w1Ud.js → CheckBox-CulnjNvJ.js} +9 -9
- package/dist/chunks/CheckBox-CulnjNvJ.js.map +1 -0
- package/dist/chunks/{DateInput-CINDYueM.js → DateInput-LSSvObtg.js} +3 -3
- package/dist/chunks/DateInput-LSSvObtg.js.map +1 -0
- package/dist/chunks/Dialog-BPS4BeWZ.js.map +1 -1
- package/dist/chunks/{DisclosureGroup-0BtaXO54.js → DisclosureGroup-Plk2M_Vl.js} +9 -9
- package/dist/chunks/DisclosureGroup-Plk2M_Vl.js.map +1 -0
- package/dist/chunks/{DropZone-hf7Em__0.js → DropZone-DPGTpHI6.js} +7 -7
- package/dist/chunks/DropZone-DPGTpHI6.js.map +1 -0
- package/dist/chunks/DropdownMenu-Ds-trH4M.js.map +1 -1
- package/dist/chunks/Flex-DbBdq336.js.map +1 -1
- package/dist/chunks/Grid-ByIIytjh.js.map +1 -1
- package/dist/chunks/{Input-Ce2HXBUc.js → Input-Wrew1puH.js} +30 -30
- package/dist/chunks/Input-Wrew1puH.js.map +1 -0
- package/dist/chunks/{InputDateTime-DPtY_4Od.js → InputDateTime-2PCX8an8.js} +2 -2
- package/dist/chunks/{InputDateTime-DPtY_4Od.js.map → InputDateTime-2PCX8an8.js.map} +1 -1
- package/dist/chunks/{InputFile-ga5yJmdZ.js → InputFile-Ca-bRo93.js} +2 -2
- package/dist/chunks/InputFile-Ca-bRo93.js.map +1 -0
- package/dist/chunks/{InputFiles-Or2Nvfgk.js → InputFiles-pI9rQXOI.js} +22 -22
- package/dist/chunks/InputFiles-pI9rQXOI.js.map +1 -0
- package/dist/chunks/{InputImage-BeA5WJz1.js → InputImage-B522AQzl.js} +2 -2
- package/dist/chunks/{InputImage-BeA5WJz1.js.map → InputImage-B522AQzl.js.map} +1 -1
- package/dist/chunks/{LabeledExpandableActionPanel-Bx-DWmYz.js → LabeledExpandableActionPanel-CWmOSWeS.js} +12 -12
- package/dist/chunks/LabeledExpandableActionPanel-CWmOSWeS.js.map +1 -0
- package/dist/chunks/{Listbox-CY1wQOCP.js → Listbox-B6F_IKQv.js} +22 -22
- package/dist/chunks/Listbox-B6F_IKQv.js.map +1 -0
- package/dist/chunks/{MultiSelect-CBqTylqO.js → MultiSelect-CUXA8gx-.js} +12 -12
- package/dist/chunks/{MultiSelect-CBqTylqO.js.map → MultiSelect-CUXA8gx-.js.map} +1 -1
- package/dist/chunks/{NotificationsHost-BQc-zOr2.js → NotificationsHost-Bnq7xFKO.js} +24 -24
- package/dist/chunks/NotificationsHost-Bnq7xFKO.js.map +1 -0
- package/dist/chunks/{PresetRangeDateInput-YBQm_4Fb.js → PresetRangeDateInput-B_8jsilZ.js} +2 -2
- package/dist/chunks/{PresetRangeDateInput-YBQm_4Fb.js.map → PresetRangeDateInput-B_8jsilZ.js.map} +1 -1
- package/dist/chunks/{RadioButton-DJp31HFR.js → RadioButton-D5vPW4Yr.js} +8 -8
- package/dist/chunks/RadioButton-D5vPW4Yr.js.map +1 -0
- package/dist/chunks/{Select-B7k_8_Lf.js → Select-CoAYWNOn.js} +10 -10
- package/dist/chunks/Select-CoAYWNOn.js.map +1 -0
- package/dist/chunks/{SerializableSelect-53uNCqdE.js → SerializableSelect-awBOWKTj.js} +2 -2
- package/dist/chunks/{SerializableSelect-53uNCqdE.js.map → SerializableSelect-awBOWKTj.js.map} +1 -1
- package/dist/chunks/{SingleDateTimeInput-CwvIbwje.js → SingleDateTimeInput-o44Vlwdk.js} +19 -19
- package/dist/chunks/SingleDateTimeInput-o44Vlwdk.js.map +1 -0
- package/dist/chunks/{StateSelect-D0wuUdT9.js → StateSelect-abZq176J.js} +2 -2
- package/dist/chunks/{StateSelect-D0wuUdT9.js.map → StateSelect-abZq176J.js.map} +1 -1
- package/dist/chunks/{Switch-B476FBUD.js → Switch-DHMnZVmN.js} +9 -9
- package/dist/chunks/Switch-DHMnZVmN.js.map +1 -0
- package/dist/chunks/{TextEditorLexicalClient-DcixYuo4.js → TextEditorLexicalClient-Dt4eaPA3.js} +4 -4
- package/dist/chunks/{TextEditorLexicalClient-DcixYuo4.js.map → TextEditorLexicalClient-Dt4eaPA3.js.map} +1 -1
- package/dist/chunks/{Textarea-DeJJjjkI.js → Textarea-DOVrPH4I.js} +2 -2
- package/dist/chunks/{Textarea-DeJJjjkI.js.map → Textarea-DOVrPH4I.js.map} +1 -1
- package/dist/chunks/TimePanel-_kF2RtHk.js.map +1 -1
- package/dist/chunks/{TreeMultiSelect-DRYNx7u5.js → TreeMultiSelect-C76RYavo.js} +2 -2
- package/dist/chunks/{TreeMultiSelect-DRYNx7u5.js.map → TreeMultiSelect-C76RYavo.js.map} +1 -1
- package/dist/chunks/{TreePickerBase-DYzTsSBQ.js → TreePickerBase-qNHIWbYL.js} +155 -155
- package/dist/chunks/TreePickerBase-qNHIWbYL.js.map +1 -0
- package/dist/chunks/{TreeSelect-DGLDu6qc.js → TreeSelect-LEhNdPCX.js} +2 -2
- package/dist/chunks/{TreeSelect-DGLDu6qc.js.map → TreeSelect-LEhNdPCX.js.map} +1 -1
- package/dist/chunks/{base-table-DVje02Zi.js → base-table-ij2guVMB.js} +3 -3
- package/dist/chunks/base-table-ij2guVMB.js.map +1 -0
- package/dist/chunks/{layout-picker-BA9vA8JI.js → layout-picker-CzZ8Xzkk.js} +9 -9
- package/dist/chunks/layout-picker-CzZ8Xzkk.js.map +1 -0
- package/dist/chunks/{misc-DrmMj8GO.js → misc-Bj0y3ERC.js} +54 -54
- package/dist/chunks/misc-Bj0y3ERC.js.map +1 -0
- package/dist/chunks/{modal-DqVcZws_.js → modal-B4ivQb2h.js} +10 -10
- package/dist/chunks/modal-B4ivQb2h.js.map +1 -0
- package/dist/chunks/{picker-Cj4RnJh6.js → picker-gIUs0nE_.js} +13 -13
- package/dist/chunks/picker-gIUs0nE_.js.map +1 -0
- package/dist/chunks/popover-C79P5bm2.js.map +1 -1
- package/dist/chunks/{slider-34wxzKkG.js → slider-CigVo4Ju.js} +3 -3
- package/dist/chunks/slider-CigVo4Ju.js.map +1 -0
- package/dist/chunks/{sortable-CwDHC3CA.js → sortable-BZqnZ_LA.js} +10 -10
- package/dist/chunks/sortable-BZqnZ_LA.js.map +1 -0
- package/dist/chunks/{table-BYA0hCj7.js → table-CK-CM2zD.js} +2 -2
- package/dist/chunks/table-CK-CM2zD.js.map +1 -0
- package/dist/chunks/table-column-interactions-DPyJDD7P.js.map +1 -1
- package/dist/chunks/{tabs-CjU2KCgs.js → tabs-D5ikIIng.js} +2 -2
- package/dist/chunks/{tabs-CjU2KCgs.js.map → tabs-D5ikIIng.js.map} +1 -1
- package/dist/chunks/ui.module-BisoTevy.js.map +1 -1
- package/dist/context-menu/components/MenuContent.d.ts.map +1 -1
- package/dist/context-menu/components/MenuContext.d.ts.map +1 -1
- package/dist/context-menu/components/MenuRoot.d.ts.map +1 -1
- package/dist/context-menu/components/RadialMenuContent.d.ts.map +1 -1
- package/dist/date-input/index.js +2 -2
- package/dist/date-input/lib/types.d.ts.map +1 -1
- package/dist/date-input/stories/DateInput.stories.js +2 -2
- package/dist/date-input/ui/CalendarView.d.ts.map +1 -1
- package/dist/date-input/ui/DateInput.d.ts.map +1 -1
- package/dist/date-range-preset-select/stories/DateRangePresetSelect.stories.js +1 -1
- package/dist/date-time-input/index.js +1 -1
- package/dist/date-time-input/lib/dateTimeValue.d.ts.map +1 -1
- package/dist/date-time-input/stories/SingleDateTimeInput.stories.js +1 -1
- package/dist/date-time-input/ui/SingleDateTimeInput.d.ts.map +1 -1
- package/dist/dialog/Dialog.d.ts.map +1 -1
- package/dist/disclosure/Disclosure.d.ts.map +1 -1
- package/dist/disclosure/index.js +1 -1
- package/dist/disclosure/stories/Disclosure.stories.js +1 -1
- package/dist/drop-zone/DropZone.d.ts.map +1 -1
- package/dist/drop-zone/index.js +1 -1
- package/dist/drop-zone/stories/DropZone.stories.d.ts.map +1 -1
- package/dist/drop-zone/stories/DropZone.stories.js +1 -1
- package/dist/drop-zone/stories/DropZone.stories.js.map +1 -1
- package/dist/errors/ErrorDisplay.d.ts.map +1 -1
- package/dist/errors/index.js.map +1 -1
- package/dist/expandable-action-panel/ExpandableActionPanel.d.ts.map +1 -1
- package/dist/expandable-action-panel/index.js +1 -1
- package/dist/expandable-action-panel/stories/ExpandableActionPanel.stories.js +4 -4
- package/dist/image/index.js +3 -3
- package/dist/image/index.js.map +1 -1
- package/dist/image/ui/ImageSelection.d.ts.map +1 -1
- package/dist/input/Input.d.ts.map +1 -1
- package/dist/input/index.js +1 -1
- package/dist/input/stories/Input.stories.js +1 -1
- package/dist/input-date-time/index.js +1 -1
- package/dist/input-date-time/stories/InputDateTime.stories.js +1 -1
- package/dist/input-file/InputFile.d.ts.map +1 -1
- package/dist/input-file/index.js +1 -1
- package/dist/input-file/stories/InputFile.stories.d.ts.map +1 -1
- package/dist/input-file/stories/InputFile.stories.js +1 -1
- package/dist/input-file/stories/InputFile.stories.js.map +1 -1
- package/dist/input-files/InputFilesList.d.ts.map +1 -1
- package/dist/input-files/index.js +1 -1
- package/dist/input-files/stories/InputFiles.stories.d.ts +1 -1
- package/dist/input-files/stories/InputFiles.stories.d.ts.map +1 -1
- package/dist/input-files/stories/InputFiles.stories.js +1 -1
- package/dist/input-files/stories/InputFiles.stories.js.map +1 -1
- package/dist/input-image/index.js +1 -1
- package/dist/input-image/stories/InputImage.stories.d.ts.map +1 -1
- package/dist/input-image/stories/InputImage.stories.js +1 -1
- package/dist/input-image/stories/InputImage.stories.js.map +1 -1
- package/dist/input-search/index.js +1 -1
- package/dist/layout-picker/index.js +1 -1
- package/dist/layout-picker/stories/LayoutPicker.stories.js +1 -1
- package/dist/layout-picker/ui/LayoutPicker.d.ts.map +1 -1
- package/dist/list/List.d.ts.map +1 -1
- package/dist/list/index.js +5 -5
- package/dist/list/index.js.map +1 -1
- package/dist/listbox/Listbox.d.ts.map +1 -1
- package/dist/listbox/index.js +1 -1
- package/dist/listbox/stories/Listbox.stories.js +1 -1
- package/dist/misc/CopyTextWrapper.d.ts.map +1 -1
- package/dist/misc/OneStepScroller.d.ts.map +1 -1
- package/dist/misc/StateIcon.d.ts.map +1 -1
- package/dist/misc/index.js +1 -1
- package/dist/modal/Modal.d.ts +5 -1
- package/dist/modal/Modal.d.ts.map +1 -1
- package/dist/modal/index.js +1 -1
- package/dist/modal/stories/Modal.stories.js +2 -2
- package/dist/multi-select/index.js +1130 -24
- package/dist/multi-select/index.js.map +1 -1
- package/dist/multi-select/model/useODataMultiSelect.d.ts +23 -0
- package/dist/multi-select/model/useODataMultiSelect.d.ts.map +1 -0
- package/dist/multi-select/ui/MultiSelect.d.ts +1 -1
- package/dist/multi-select/ui/MultiSelect.d.ts.map +1 -1
- package/dist/multi-select/ui/ODataDependentMultiSelect.d.ts +20 -0
- package/dist/multi-select/ui/ODataDependentMultiSelect.d.ts.map +1 -0
- package/dist/multi-select/ui/ODataDependentSegmentMultiSelect.d.ts +21 -0
- package/dist/multi-select/ui/ODataDependentSegmentMultiSelect.d.ts.map +1 -0
- package/dist/multi-select/ui/ODataMultiSelect.d.ts +7 -0
- package/dist/multi-select/ui/ODataMultiSelect.d.ts.map +1 -0
- package/dist/multi-select/ui/SerializableMultiSelect.d.ts.map +1 -1
- package/dist/multi-select/ui/index.d.ts +3 -0
- package/dist/multi-select/ui/index.d.ts.map +1 -1
- package/dist/multi-select/ui/stories/MultiSelect.stories.js +1 -1
- package/dist/multi-select/ui/stories/ODataMultiSelect.stories.d.ts +44 -0
- package/dist/multi-select/ui/stories/ODataMultiSelect.stories.d.ts.map +1 -0
- package/dist/notifications/index.js +1 -1
- package/dist/notifications/model/NotificationsProvider.d.ts.map +1 -1
- package/dist/notifications/ui/NotificationsHost.d.ts.map +1 -1
- package/dist/notifications/ui/stories/NotificationsHost.stories.js +1 -1
- package/dist/period-select/PeriodSelect.d.ts +1 -1
- package/dist/period-select/PeriodSelect.d.ts.map +1 -1
- package/dist/period-select/index.js.map +1 -1
- package/dist/period-select/lib/periodSelect.d.ts.map +1 -1
- package/dist/period-select/stories/PeriodSelect.stories.d.ts.map +1 -1
- package/dist/period-select/stories/PeriodSelect.stories.js +1 -1
- package/dist/period-select/stories/PeriodSelect.stories.js.map +1 -1
- package/dist/picker/PickerPopup.d.ts.map +1 -1
- package/dist/picker/PickerTriggerActions.d.ts.map +1 -1
- package/dist/picker/index.js +1 -1
- package/dist/picker/model/usePickerFloatingListbox.d.ts.map +1 -1
- package/dist/popover/FloatingPopover.d.ts.map +1 -1
- package/dist/popover/components/PopoverContent.d.ts.map +1 -1
- package/dist/popover/components/PopoverContext.d.ts.map +1 -1
- package/dist/popover/stories/Popover.stories.js +1 -1
- package/dist/preset-range-date-input/index.js +1 -1
- package/dist/preset-range-date-input/ui/stories/PresetRangeDateInput.stories.js +1 -1
- package/dist/preset-select/index.js +1 -1
- package/dist/radio-button/RadioButton.d.ts.map +1 -1
- package/dist/radio-button/index.js +1 -1
- package/dist/radio-button/stories/RadioButton.stories.js +1 -1
- package/dist/select/ODataSelect.d.ts +9 -0
- package/dist/select/ODataSelect.d.ts.map +1 -0
- package/dist/select/Select.d.ts.map +1 -1
- package/dist/select/index.js +2 -2
- package/dist/select/model/useODataSelect.d.ts +25 -0
- package/dist/select/model/useODataSelect.d.ts.map +1 -0
- package/dist/select/model/useODataSelectBase.d.ts +24 -0
- package/dist/select/model/useODataSelectBase.d.ts.map +1 -0
- package/dist/select/stories/ODataSelect.stories.d.ts +46 -0
- package/dist/select/stories/ODataSelect.stories.d.ts.map +1 -0
- package/dist/select/stories/Select.stories.js +1 -1
- package/dist/select/stories/SerializableSelect.stories.js +1 -1
- package/dist/select/stories/odataStoryCollection.d.ts +2 -0
- package/dist/select/stories/odataStoryCollection.d.ts.map +1 -0
- package/dist/select/stories/odataStoryFixtures.d.ts +35 -0
- package/dist/select/stories/odataStoryFixtures.d.ts.map +1 -0
- package/dist/simple-table/index.js +1 -1
- package/dist/simple-table/index.js.map +1 -1
- package/dist/slider/Slider.d.ts.map +1 -1
- package/dist/slider/index.js +1 -1
- package/dist/slider/stories/Slider.stories.js +1 -1
- package/dist/slider/stories/SliderInput.stories.js +1 -1
- package/dist/sortable/Sortable.d.ts.map +1 -1
- package/dist/sortable/SortableDragHandle.d.ts.map +1 -1
- package/dist/sortable/index.js +1 -1
- package/dist/sortable/stories/Sortable.stories.js +1 -1
- package/dist/state-select/index.js +1 -1
- package/dist/state-select/stories/StateSelect.stories.d.ts.map +1 -1
- package/dist/state-select/stories/StateSelect.stories.js +1 -1
- package/dist/state-select/stories/StateSelect.stories.js.map +1 -1
- package/dist/switch/Switch.d.ts.map +1 -1
- package/dist/switch/index.js +1 -1
- package/dist/switch/stories/Switch.stories.js +1 -1
- package/dist/table/Table.d.ts +1 -1
- package/dist/table/Table.d.ts.map +1 -1
- package/dist/table/index.js +1 -1
- package/dist/table/stories/Table.stories.d.ts +155 -0
- package/dist/table/stories/Table.stories.d.ts.map +1 -0
- package/dist/table-column-interactions/TableHeaderInteractionCell.d.ts.map +1 -1
- package/dist/tabs/index.js +1 -1
- package/dist/tabs/stories/Tabs.stories.d.ts.map +1 -1
- package/dist/tabs/stories/Tabs.stories.js +2 -2
- package/dist/tabs/stories/Tabs.stories.js.map +1 -1
- package/dist/text/TextOverflow.d.ts.map +1 -1
- package/dist/text/index.js.map +1 -1
- package/dist/text-editor/TextEditorLexicalClient.d.ts.map +1 -1
- package/dist/text-editor/index.js +2 -2
- package/dist/textarea/index.js +1 -1
- package/dist/textarea/stories/Textarea.stories.js +1 -1
- package/dist/tree-select/ODataTreeMultiSelect.d.ts +12 -0
- package/dist/tree-select/ODataTreeMultiSelect.d.ts.map +1 -0
- package/dist/tree-select/ODataTreeSelect.d.ts +13 -0
- package/dist/tree-select/ODataTreeSelect.d.ts.map +1 -0
- package/dist/tree-select/TreeNodeContent.d.ts.map +1 -1
- package/dist/tree-select/TreePickerBase.d.ts.map +1 -1
- package/dist/tree-select/index.js +2 -2
- package/dist/tree-select/model/buildODataTreeNodes.d.ts +12 -0
- package/dist/tree-select/model/buildODataTreeNodes.d.ts.map +1 -0
- package/dist/tree-select/model/resolveOrderedTreeSegmentItems.d.ts +4 -0
- package/dist/tree-select/model/resolveOrderedTreeSegmentItems.d.ts.map +1 -0
- package/dist/tree-select/model/useODataTreeData.d.ts +11 -0
- package/dist/tree-select/model/useODataTreeData.d.ts.map +1 -0
- package/dist/tree-select/stories/ODataTreeMultiSelect.stories.d.ts +55 -0
- package/dist/tree-select/stories/ODataTreeMultiSelect.stories.d.ts.map +1 -0
- package/dist/tree-select/stories/ODataTreeSelect.stories.d.ts +54 -0
- package/dist/tree-select/stories/ODataTreeSelect.stories.d.ts.map +1 -0
- package/dist/tree-select/stories/TreeMultiSelect.stories.js +1 -1
- package/dist/tree-select/stories/TreeSelect.stories.js +1 -1
- package/dist/tree-table/TreeTable.d.ts +1 -1
- package/dist/tree-table/TreeTable.d.ts.map +1 -1
- package/dist/tree-table/index.js +2 -2
- package/dist/tree-table/index.js.map +1 -1
- package/dist/tree-table/stories/TreeTable.stories.d.ts +158 -0
- package/dist/tree-table/stories/TreeTable.stories.d.ts.map +1 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +0 -0
- package/package.json +15 -7
- package/dist/chunks/BadgeList-DHW_Ktr3.js.map +0 -1
- package/dist/chunks/CheckBox-Cck5w1Ud.js.map +0 -1
- package/dist/chunks/DateInput-CINDYueM.js.map +0 -1
- package/dist/chunks/DisclosureGroup-0BtaXO54.js.map +0 -1
- package/dist/chunks/DropZone-hf7Em__0.js.map +0 -1
- package/dist/chunks/Input-Ce2HXBUc.js.map +0 -1
- package/dist/chunks/InputFile-ga5yJmdZ.js.map +0 -1
- package/dist/chunks/InputFiles-Or2Nvfgk.js.map +0 -1
- package/dist/chunks/LabeledExpandableActionPanel-Bx-DWmYz.js.map +0 -1
- package/dist/chunks/Listbox-CY1wQOCP.js.map +0 -1
- package/dist/chunks/NotificationsHost-BQc-zOr2.js.map +0 -1
- package/dist/chunks/RadioButton-DJp31HFR.js.map +0 -1
- package/dist/chunks/Select-B7k_8_Lf.js.map +0 -1
- package/dist/chunks/SingleDateTimeInput-CwvIbwje.js.map +0 -1
- package/dist/chunks/Switch-B476FBUD.js.map +0 -1
- package/dist/chunks/TreePickerBase-DYzTsSBQ.js.map +0 -1
- package/dist/chunks/base-table-DVje02Zi.js.map +0 -1
- package/dist/chunks/layout-picker-BA9vA8JI.js.map +0 -1
- package/dist/chunks/misc-DrmMj8GO.js.map +0 -1
- package/dist/chunks/modal-DqVcZws_.js.map +0 -1
- package/dist/chunks/picker-Cj4RnJh6.js.map +0 -1
- package/dist/chunks/slider-34wxzKkG.js.map +0 -1
- package/dist/chunks/sortable-CwDHC3CA.js.map +0 -1
- package/dist/chunks/table-BYA0hCj7.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"misc-Bj0y3ERC.js","names":[],"sources":["../../src/misc/AnimatedLogo.tsx","../../src/misc/CopyTextWrapper.tsx","../../src/misc/IconWrapper.module.scss","../../src/misc/IconWrapper.tsx","../../src/misc/LoadingMessage.module.scss","../../src/misc/Message.tsx","../../src/misc/LoadingMessage.tsx","../../src/misc/LazyDynamicComponent.tsx","../../src/misc/SkeletonLine.tsx","../../src/misc/LazyValue.tsx","../../src/misc/NoData.tsx","../../src/misc/Notice.tsx","../../src/misc/OneStepScroller.module.scss","../../src/misc/OneStepScroller.tsx","../../src/misc/Scrollable.tsx","../../src/misc/State.module.scss","../../src/misc/StateIcon.tsx","../../src/misc/StateWrapper.tsx"],"sourcesContent":["export function AnimatedLogo() {\n\treturn (\n\t\t<div className=\"logoAnimated\">\n\t\t\t<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"588\" height=\"696\" viewBox=\"0 0 588 696\" role=\"img\" aria-label=\"Загрузка\">\n\t\t\t\t<path className=\"logoSegment logoOutline logoS1\" d=\"M15,15v225.37l136.14-.23c44.13-.07,79.86-35.87,79.86-80V15H15Z\" />\n\t\t\t\t<path className=\"logoSegment logoOutline logoS2\" d=\"M15,285v396s216,0,216,0v-316c0-44.18-35.82-80-80-80H15Z\" />\n\t\t\t\t<path className=\"logoSegment logoOutline logoS3\" d=\"M276,15h297s0,225,0,225h-217c-44.18,0-80-35.82-80-80V15Z\" />\n\t\t\t\t<path\n\t\t\t\t\tclassName=\"logoSegment logoFill logoS4\"\n\t\t\t\t\td=\"M573,285v108h-169c-11.05,0-20,8.95-20,20v268h-108v-316c0-44.18,35.82-80,80-80h217Z\"\n\t\t\t\t/>\n\t\t\t</svg>\n\t\t</div>\n\t);\n}\n","import { Placement } from \"@floating-ui/react\";\nimport { useCopyElementTextWithFeedback } from \"@ryuzaki13/react-foundation-lib/copy\";\nimport { CheckCheckIcon, CopyIcon } from \"lucide-react\";\n\nimport { FloatingPopover } from \"../popover\";\n\ninterface CopyTextWrapperProps {\n\tchildren: React.ReactNode;\n\tposition?: Placement;\n\tshowOnHover?: boolean;\n\tclassName?: string;\n}\n\nexport const CopyTextWrapper: React.FC<CopyTextWrapperProps> = ({ children, position = \"top\", showOnHover = true, className }) => {\n\tconst { containerRef, copyElementText, isCopied } = useCopyElementTextWithFeedback<HTMLSpanElement>();\n\n\treturn (\n\t\t<span ref={containerRef} className={className}>\n\t\t\t{children}\n\t\t\t<FloatingPopover openOnHover={showOnHover} placement={position} content={isCopied ? \"Скопировано!\" : \"Копировать текст\"}>\n\t\t\t\t<button onClick={copyElementText} aria-label={isCopied ? \"Скопировано!\" : \"Копировать текст\"}>\n\t\t\t\t\t{isCopied ? <CheckCheckIcon className=\"block statusSuccess\" /> : <CopyIcon className=\"block statusInfo\" />}\n\t\t\t\t</button>\n\t\t\t</FloatingPopover>\n\t\t</span>\n\t);\n};\n",".wrapper {\n\twidth: var(--control-height);\n\theight: var(--control-height);\n\tmargin: auto;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n","import { ReactNode } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport styles from \"./IconWrapper.module.scss\";\n\ninterface IconWrapperProps {\n\tchildren: ReactNode;\n\tclassName?: string;\n}\n\nexport function IconWrapper({ className, children }: IconWrapperProps) {\n\treturn <div className={cn(styles.wrapper, className)}>{children}</div>;\n}\n",".componentLoader {\n\tmin-height: 10em;\n}\n","import { PropsWithChildren } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { FlexCenter } from \"../flex\";\nimport { Text, TextColor } from \"../text\";\n\ninterface MessageProps extends PropsWithChildren {\n\tclassName?: string;\n\tcolor?: TextColor;\n\tminHeight?: string | number;\n\tuppercase?: boolean;\n}\n\nexport const Message: React.FC<MessageProps> = ({ className, children, color = \"muted\", minHeight, uppercase = true }) => (\n\t<FlexCenter className={cn(\"paddingMd textCenter\", className)} minHeight={minHeight}>\n\t\t<Text as=\"div\" weight=\"bold\" color={color} uppercase={uppercase}>\n\t\t\t{children}\n\t\t</Text>\n\t</FlexCenter>\n);\n","import { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { AnimatedLogo } from \"./AnimatedLogo\";\nimport styles from \"./LoadingMessage.module.scss\";\nimport { Message } from \"./Message\";\n\ninterface LoadingMessageProps {\n\tclassName?: string;\n\ttext?: string;\n\twithLogo?: boolean;\n}\n\nexport function LoadingMessage({ className, text, withLogo }: LoadingMessageProps) {\n\treturn (\n\t\t<Message className={cn(styles.componentLoader, withLogo ? \"\" : \"skeletonLine\", className)}>\n\t\t\t{withLogo && <AnimatedLogo />}\n\n\t\t\t{text || \"Загрузка...\"}\n\t\t</Message>\n\t);\n}\n","import { Suspense, useSyncExternalStore, type ComponentType, type ReactNode } from \"react\";\n\nimport { useLazyComponent } from \"@ryuzaki13/react-foundation-lib/hooks\";\n\nimport { LoadingMessage } from \"./LoadingMessage\";\n\ntype LazyDynamicComponentProps<T extends object> = {\n\timportFunc: () => Promise<Record<string, ComponentType<T>> | null>;\n\tcomponentName: string;\n\tcacheKey?: string;\n\tclientOnly?: boolean;\n\tfallback?: ReactNode;\n\tprops?: T;\n};\n\nconst subscribeClientOnlyMount = (onStoreChange: () => void) => {\n\tonStoreChange();\n\n\treturn () => undefined;\n};\n\nconst getClientSnapshot = () => true;\nconst getServerSnapshot = () => false;\n\n/**\n * Компонент ленивой загрузки динамически импортируемого React-компонента. Позволяет отложить загрузку тяжелых частей интерфейса до момента использования.\n */\nexport function LazyDynamicComponent<T extends object>({\n\tfallback,\n\timportFunc,\n\tcomponentName,\n\tclientOnly = false,\n\tcacheKey,\n\tprops\n}: LazyDynamicComponentProps<T>) {\n\tconst Component = useLazyComponent(importFunc, componentName, cacheKey);\n\tconst isClient = useSyncExternalStore(subscribeClientOnlyMount, getClientSnapshot, getServerSnapshot);\n\n\tconst fallbackNode = fallback ?? <LoadingMessage text=\"Ожидание компонента...\" />;\n\n\t// Client-only режим нужен для браузерных модулей, которые нельзя даже пытаться импортировать во время SSR.\n\tif (clientOnly && !isClient) return fallbackNode;\n\n\treturn (\n\t\t<Suspense fallback={fallbackNode}>\n\t\t\t{/* eslint-disable-next-line react-hooks/static-components */}\n\t\t\t<Component {...(props ?? ({} as T))} />\n\t\t</Suspense>\n\t);\n}\n","import React from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { PolymorphicComponent, PolymorphicComponentBaseProps } from \"../polymorphic\";\n\ntype SkeletonLineOwnProps<E extends React.ElementType = React.ElementType> = PolymorphicComponentBaseProps<E> & {\n\tclassName?: string;\n};\n\ntype SkeletonLineProps<E extends React.ElementType> = SkeletonLineOwnProps<E> &\n\tOmit<React.ComponentPropsWithRef<E>, keyof SkeletonLineOwnProps>;\n\nexport const SkeletonLine = <E extends React.ElementType>({ as, className, ...props }: SkeletonLineProps<E>) => {\n\tconst Component = as || \"div\";\n\n\treturn (\n\t\t<PolymorphicComponent\n\t\t\tas={Component as React.ElementType}\n\t\t\tclassName={cn(\"skeletonLine colorTransparent radiusSm\", className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n};\n","import React from \"react\";\n\nimport { SkeletonLine } from \"./SkeletonLine\";\n\ninterface LazyValueProps {\n\tvalue: React.ReactNode;\n\tisLoading?: boolean;\n}\n\nexport function LazyValue({ value, isLoading }: LazyValueProps) {\n\treturn isLoading ? <SkeletonLine>Загрузка...</SkeletonLine> : (value ?? \"-\");\n}\n","import { Message } from \"./Message\";\n\ninterface NoDataProps {\n\tclassName?: string;\n\ttext?: string;\n\tminHeight?: string | number;\n}\n\nexport const NoData = ({ className, text, minHeight = \"5em\" }: NoDataProps) => {\n\treturn (\n\t\t<Message className={className} color=\"muted\" minHeight={minHeight}>\n\t\t\t{text || \"Нет данных\"}\n\t\t</Message>\n\t);\n};\n","import { PropsWithChildren } from \"react\";\n\nimport { Message } from \"./Message\";\n\ninterface NoticeProps extends PropsWithChildren {\n\tisError?: boolean;\n\tclassName?: string;\n}\n\nexport const Notice: React.FC<NoticeProps> = ({ className, isError, children }) => (\n\t<Message className={className} color={isError ? \"error\" : \"secondary\"}>\n\t\t{children}\n\t</Message>\n);\n",".oneStepScroller {\n\toverflow: hidden;\n\tdisplay: flex;\n\talign-items: center;\n\tgap: var(--space-xs);\n\tmin-width: 0;\n}\n\n.ossViewport {\n\toverflow: hidden;\n\toutline: none;\n\tmin-width: 0;\n\tflex: 1 1 auto;\n}\n\n.ossScroller {\n\tdisplay: flex;\n\tflex-wrap: nowrap;\n\tgap: var(--space-sm);\n\talign-items: end;\n\toverflow-x: auto;\n\toverflow-y: hidden;\n\tscroll-behavior: smooth;\n\t-webkit-overflow-scrolling: touch;\n\tscrollbar-width: none; /* firefox */\n\n\t::-webkit-scrollbar {\n\t\theight: 0;\n\t}\n}\n\n.ossButton {\n\t// position: absolute;\n\ttop: 0;\n\tz-index: 10;\n\twidth: var(--control-height);\n\theight: 100%;\n\tflex: 0 0 var(--control-height);\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\t// border: var(--border);\n\tborder-radius: var(--radius-sm);\n\tcolor: var(--content-2);\n\t// background-color: var(--surface-0);\n\t// opacity: 0.75;\n\n\ttransition-property: opacity, color;\n\ttransition-duration: var(--transition-fast);\n\n\t&:hover {\n\t\topacity: 1;\n\t\tcolor: var(--content-0);\n\t}\n\n\t&:disabled {\n\t\topacity: 0.5;\n\t\tpointer-events: none;\n\t}\n\n\t// &.prev {\n\t// \tleft: 0;\n\t// }\n\n\t// &.next {\n\t// \tright: 0;\n\t// }\n}\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { ChevronLeftIcon, ChevronRightIcon } from \"lucide-react\";\n\nimport styles from \"./OneStepScroller.module.scss\";\n\ninterface OneStepScrollerProps {\n\tchildren: React.ReactNode;\n\tclassName?: string;\n\t/**\n\t * CSS-селектор элементов, которые считаются \"шагами\" скролла.\n\t * По умолчанию используются прямые потомки скроллера.\n\t */\n\titemSelector?: string;\n\t/**\n\t * Дополнительный внутренний отступ (px) при прокрутке к фокусируемому элементу.\n\t */\n\tscrollPadding?: number;\n\t/**\n\t * Плавная прокрутка для кнопок и авто-доводки до видимости.\n\t */\n\tsmooth?: boolean;\n}\n\nconst EDGE_EPSILON_PX = 1;\n\nfunction maxScrollLeft(scroller: HTMLElement) {\n\treturn Math.max(0, scroller.scrollWidth - scroller.clientWidth);\n}\n\n/**\n * Горизонтальный скроллер \"по одному элементу\".\n *\n * Ожидает элементы фиксированной ширины (или близкой к фиксированной),\n * чтобы шаг скролла соответствовал ширине одного элемента.\n */\nexport const OneStepScroller: React.FC<OneStepScrollerProps> = ({\n\tchildren,\n\tclassName,\n\titemSelector,\n\tscrollPadding = 6,\n\tsmooth = true\n}) => {\n\tconst scrollerRef = useRef<HTMLDivElement | null>(null);\n\tconst rafIdRef = useRef<number | null>(null);\n\n\tconst [canScrollPrev, setCanScrollPrev] = useState(false);\n\tconst [canScrollNext, setCanScrollNext] = useState(false);\n\n\t/**\n\t * Получить список элементов-\"шагов\".\n\t *\n\t * Оптимизация: для дефолтного поведения используем `children` DOM-узла,\n\t * чтобы не выполнять `querySelectorAll` на каждый вызов.\n\t */\n\tconst getItems = useCallback((): HTMLElement[] => {\n\t\tconst scroller = scrollerRef.current;\n\t\tif (!scroller) return [];\n\n\t\tif (!itemSelector) {\n\t\t\treturn Array.from(scroller.children).filter((node): node is HTMLElement => node instanceof HTMLElement);\n\t\t}\n\n\t\treturn Array.from(scroller.querySelectorAll<HTMLElement>(itemSelector));\n\t}, [itemSelector]);\n\n\t/**\n\t * Найти \"элемент шага\" для произвольного target внутри скроллера.\n\t */\n\tconst findItemForTarget = useCallback(\n\t\t(target: HTMLElement): HTMLElement | null => {\n\t\t\tconst scroller = scrollerRef.current;\n\t\t\tif (!scroller) return null;\n\n\t\t\tif (itemSelector) {\n\t\t\t\tconst item = target.closest<HTMLElement>(itemSelector);\n\t\t\t\tif (item && scroller.contains(item)) return item;\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tlet node: HTMLElement | null = target;\n\t\t\twhile (node && node.parentElement && node.parentElement !== scroller) {\n\t\t\t\tnode = node.parentElement;\n\t\t\t}\n\n\t\t\tif (node && node.parentElement === scroller) return node;\n\t\t\treturn null;\n\t\t},\n\t\t[itemSelector]\n\t);\n\n\t/**\n\t * Обновить состояние кнопок \"назад/вперед\".\n\t * Состояние меняется только при реальном отличии, чтобы не триггерить\n\t * лишние перерисовки на каждом событии scroll.\n\t */\n\tconst updateScrollButtons = useCallback(() => {\n\t\tconst scroller = scrollerRef.current;\n\t\tif (!scroller) {\n\t\t\tsetCanScrollPrev(false);\n\t\t\tsetCanScrollNext(false);\n\t\t\treturn;\n\t\t}\n\n\t\tconst maxScrollLeft = Math.max(0, scroller.scrollWidth - scroller.clientWidth);\n\t\tconst current = Math.max(0, Math.min(scroller.scrollLeft, maxScrollLeft));\n\n\t\tconst nextCanScrollPrev = current > EDGE_EPSILON_PX;\n\t\tconst nextCanScrollNext = current < maxScrollLeft - EDGE_EPSILON_PX;\n\n\t\tsetCanScrollPrev((prev) => (prev === nextCanScrollPrev ? prev : nextCanScrollPrev));\n\t\tsetCanScrollNext((prev) => (prev === nextCanScrollNext ? prev : nextCanScrollNext));\n\t}, []);\n\n\t/**\n\t * Запланировать обновление кнопок в следующий animation frame.\n\t * Это снижает частоту вычислений при интенсивном scroll/resize.\n\t */\n\tconst scheduleUpdateScrollButtons = useCallback(() => {\n\t\tif (rafIdRef.current !== null) return;\n\n\t\trafIdRef.current = requestAnimationFrame(() => {\n\t\t\trafIdRef.current = null;\n\t\t\tupdateScrollButtons();\n\t\t});\n\t}, [updateScrollButtons]);\n\n\t/**\n\t * Прокрутка на N элементов (N может быть отрицательным).\n\t */\n\tconst scrollByItems = useCallback(\n\t\t(count: number) => {\n\t\t\tconst scroller = scrollerRef.current;\n\t\t\tif (!scroller) return;\n\n\t\t\tconst firstItem = getItems()[0];\n\t\t\tif (!firstItem) return;\n\n\t\t\tconst step = firstItem.getBoundingClientRect().width;\n\t\t\tif (!step) return;\n\n\t\t\tconst delta = Math.round(count * step);\n\t\t\tconst maxScrollLeft = Math.max(0, scroller.scrollWidth - scroller.clientWidth);\n\t\t\tconst target = Math.max(0, Math.min(scroller.scrollLeft + delta, maxScrollLeft));\n\n\t\t\tscroller.scrollTo({\n\t\t\t\tleft: target,\n\t\t\t\tbehavior: smooth ? \"smooth\" : \"auto\"\n\t\t\t});\n\t\t},\n\t\t[getItems, smooth]\n\t);\n\n\t/**\n\t * Гарантировать полную видимость элемента в пределах viewport скроллера.\n\t */\n\tconst ensureFullyVisible = useCallback(\n\t\t(el: HTMLElement) => {\n\t\t\tconst scroller = scrollerRef.current;\n\t\t\tif (!scroller) return;\n\n\t\t\tconst scrollerRect = scroller.getBoundingClientRect();\n\t\t\tconst elementRect = el.getBoundingClientRect();\n\n\t\t\tconst elementLeft = elementRect.left - scrollerRect.left + scroller.scrollLeft;\n\t\t\tconst elementRight = elementLeft + elementRect.width;\n\n\t\t\tconst visibleLeft = scroller.scrollLeft;\n\t\t\tconst visibleRight = scroller.scrollLeft + scroller.clientWidth;\n\n\t\t\tif (elementLeft >= visibleLeft + EDGE_EPSILON_PX && elementRight <= visibleRight - EDGE_EPSILON_PX) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet targetScrollLeft = scroller.scrollLeft;\n\t\t\tif (elementLeft < visibleLeft) {\n\t\t\t\ttargetScrollLeft = Math.max(0, elementLeft - scrollPadding);\n\t\t\t} else if (elementRight > visibleRight) {\n\t\t\t\ttargetScrollLeft = Math.min(maxScrollLeft(scroller), elementRight - scroller.clientWidth + scrollPadding);\n\t\t\t}\n\n\t\t\tscroller.scrollTo({\n\t\t\t\tleft: Math.round(targetScrollLeft),\n\t\t\t\tbehavior: smooth ? \"smooth\" : \"auto\"\n\t\t\t});\n\t\t},\n\t\t[scrollPadding, smooth]\n\t);\n\n\tuseEffect(() => {\n\t\tconst scroller = scrollerRef.current;\n\t\tif (!scroller) return;\n\n\t\tconst handleFocusIn = (event: FocusEvent) => {\n\t\t\tconst target = event.target;\n\t\t\tif (!(target instanceof HTMLElement)) return;\n\n\t\t\tconst item = findItemForTarget(target);\n\t\t\tif (item) ensureFullyVisible(item);\n\t\t};\n\n\t\tscroller.addEventListener(\"focusin\", handleFocusIn);\n\t\treturn () => scroller.removeEventListener(\"focusin\", handleFocusIn);\n\t}, [ensureFullyVisible, findItemForTarget]);\n\n\t/**\n\t * Наблюдаем только за размером скроллера и изменением его DOM-структуры.\n\t * Это дешевле, чем подписка ResizeObserver на каждый элемент + IntersectionObserver.\n\t */\n\tuseEffect(() => {\n\t\tconst scroller = scrollerRef.current;\n\t\tif (!scroller) return;\n\n\t\tconst onScroll = () => scheduleUpdateScrollButtons();\n\t\tscroller.addEventListener(\"scroll\", onScroll, { passive: true });\n\n\t\tlet resizeObserver: ResizeObserver | null = null;\n\t\tif (typeof ResizeObserver !== \"undefined\") {\n\t\t\tresizeObserver = new ResizeObserver(scheduleUpdateScrollButtons);\n\t\t\tresizeObserver.observe(scroller);\n\t\t}\n\n\t\tlet mutationObserver: MutationObserver | null = null;\n\t\tif (typeof MutationObserver !== \"undefined\") {\n\t\t\tmutationObserver = new MutationObserver(scheduleUpdateScrollButtons);\n\t\t\tmutationObserver.observe(scroller, {\n\t\t\t\tchildList: true,\n\t\t\t\tsubtree: false\n\t\t\t});\n\t\t}\n\n\t\tscheduleUpdateScrollButtons();\n\n\t\treturn () => {\n\t\t\tscroller.removeEventListener(\"scroll\", onScroll);\n\t\t\tresizeObserver?.disconnect();\n\t\t\tmutationObserver?.disconnect();\n\n\t\t\tif (rafIdRef.current !== null) {\n\t\t\t\tcancelAnimationFrame(rafIdRef.current);\n\t\t\t\trafIdRef.current = null;\n\t\t\t}\n\t\t};\n\t}, [scheduleUpdateScrollButtons]);\n\n\t/**\n\t * При изменении children просим пересчитать видимость кнопок.\n\t */\n\tuseEffect(() => {\n\t\tscheduleUpdateScrollButtons();\n\t}, [children, scheduleUpdateScrollButtons]);\n\n\tconst handlePrev = () => scrollByItems(-1);\n\tconst handleNext = () => scrollByItems(1);\n\n\t/**\n\t * Клавиатурная доступность: стрелки влево/вправо двигают на один шаг.\n\t */\n\tconst onWrapperKeyDown = (e: React.KeyboardEvent) => {\n\t\tif (e.key === \"ArrowLeft\") {\n\t\t\te.preventDefault();\n\t\t\thandlePrev();\n\t\t} else if (e.key === \"ArrowRight\") {\n\t\t\te.preventDefault();\n\t\t\thandleNext();\n\t\t}\n\t};\n\n\tconst hasScroll = canScrollPrev || canScrollNext;\n\n\treturn (\n\t\t<div className={cn(styles.oneStepScroller, className)} style={{ position: \"relative\" }}>\n\t\t\t{hasScroll && (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\taria-label=\"Прокрутить шаг влево\"\n\t\t\t\t\tclassName={styles.ossButton}\n\t\t\t\t\tonClick={handlePrev}\n\t\t\t\t\tdisabled={!canScrollPrev}>\n\t\t\t\t\t<ChevronLeftIcon />\n\t\t\t\t</button>\n\t\t\t)}\n\n\t\t\t<div className={styles.ossViewport} onKeyDown={onWrapperKeyDown} role=\"group\" aria-label=\"Элементы прокрутки\">\n\t\t\t\t<div className={styles.ossScroller} ref={scrollerRef} aria-live=\"polite\">\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t</div>\n\n\t\t\t{hasScroll && (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\taria-label=\"Прокрутить шаг вправо\"\n\t\t\t\t\tclassName={styles.ossButton}\n\t\t\t\t\tonClick={handleNext}\n\t\t\t\t\tdisabled={!canScrollNext}>\n\t\t\t\t\t<ChevronRightIcon />\n\t\t\t\t</button>\n\t\t\t)}\n\t\t</div>\n\t);\n};\n","import { forwardRef, PropsWithChildren } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\ninterface ScrollableProps extends PropsWithChildren {\n\tclassName?: string;\n\theight?: string | number;\n\tstable?: boolean;\n\toverscroll?: boolean;\n}\n\nexport const Scrollable = forwardRef<HTMLDivElement, ScrollableProps>(({ children, height, stable, overscroll, className }, ref) => {\n\treturn (\n\t\t<div ref={ref} className={cn(\"scrollable\", stable && \"stable\", overscroll && \"overscroll\", className)} style={{ height }}>\n\t\t\t{children}\n\t\t</div>\n\t);\n});\n\ninterface ScrollableBlockProps extends ScrollableProps {\n\tblockClassName?: string;\n}\n\nexport const ScrollableBlock = forwardRef<HTMLDivElement, ScrollableBlockProps>(({ blockClassName, ...props }, ref) => {\n\treturn (\n\t\t<div className={cn(blockClassName, \"overflowHidden w100 h100\")}>\n\t\t\t<Scrollable ref={ref} {...props} />\n\t\t</div>\n\t);\n});\n",".stateWrapper {\n\ttext-decoration: none;\n\tcolor: inherit;\n\tdisplay: block;\n\n\t// border: var(--border-width) solid var(--state-border-color, transparent);\n\tborder-left-style: solid;\n\tborder-left-color: var(--state-border-color, transparent);\n\tborder-left-width: 0.0625em; // 1px\n\tpadding-left: 0.25em; // 4px + 1px border\n\n\t&.status {\n\t\tborder-left-width: 0.3125em; // 5px\n\t\tpadding-left: 0;\n\n\t\t&.information {\n\t\t\tborder-left-color: var(--status-info-fill);\n\t\t}\n\n\t\t&.success {\n\t\t\tborder-left-color: var(--status-success-fill);\n\t\t}\n\n\t\t&.warning {\n\t\t\tborder-left-color: var(--status-warning-fill);\n\t\t}\n\n\t\t&.error {\n\t\t\tborder-left-color: var(--status-error-fill);\n\t\t}\n\t}\n}\n\n.state {\n\t&.information {\n\t\tcolor: var(--status-info-text);\n\n\t\tfill: var(--status-info-fill);\n\t\tstroke: var(--status-info-on-fill);\n\t}\n\n\t&.success {\n\t\tcolor: var(--status-success-text);\n\n\t\tfill: var(--status-success-fill);\n\t\tstroke: var(--status-success-on-fill);\n\t}\n\n\t&.warning {\n\t\tcolor: var(--status-warning-text);\n\n\t\tfill: var(--status-warning-fill);\n\t\tstroke: var(--status-warning-on-fill);\n\t\tstroke-width: 2px;\n\t}\n\n\t&.error {\n\t\tcolor: var(--status-error-text);\n\n\t\tfill: var(--status-error-fill);\n\t\tstroke: var(--status-error-on-fill);\n\t}\n}\n","import React from \"react\";\n\nimport { State } from \"@ryuzaki13/react-foundation-lib/types\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { CircleAlertIcon, CircleCheckIcon, CircleXIcon, InfoIcon } from \"lucide-react\";\n\nimport styles from \"./State.module.scss\";\n\ninterface StateIconProps {\n\tstate: State;\n\ttext: string;\n\tclassName?: string;\n}\n\nexport const StateIcon: React.FC<StateIconProps> = ({ state = \"none\", text, className }) => {\n\tconst renderIcon = () => {\n\t\tswitch (state) {\n\t\t\tcase \"error\":\n\t\t\t\treturn <ErrorIcon />;\n\t\t\tcase \"warning\":\n\t\t\t\treturn <WarningIcon />;\n\t\t\tcase \"success\":\n\t\t\t\treturn <SuccessIcon />;\n\t\t\tcase \"information\":\n\t\t\t\treturn <InformationIcon />;\n\t\t\tdefault:\n\t\t\t\treturn null;\n\t\t}\n\t};\n\n\treturn (\n\t\t<div className={cn(\"flexCenter gapSm\", className)}>\n\t\t\t{renderIcon()}\n\t\t\t{text}\n\t\t</div>\n\t);\n};\n\ninterface RenderStateIconProps {\n\tstate?: State;\n}\n\nexport const RenderStateIcon: React.FC<RenderStateIconProps> = ({ state }) => {\n\tswitch (state) {\n\t\tcase \"error\":\n\t\t\treturn <ErrorIcon />;\n\t\tcase \"warning\":\n\t\t\treturn <WarningIcon />;\n\t\tcase \"success\":\n\t\t\treturn <SuccessIcon />;\n\t\tcase \"information\":\n\t\t\treturn <InformationIcon />;\n\t\tdefault:\n\t\t\treturn null;\n\t}\n};\n\nexport const ErrorIcon = () => {\n\treturn <CircleXIcon className={cn(styles.state, styles.error)} />;\n};\nexport const WarningIcon = () => {\n\treturn <CircleAlertIcon className={cn(styles.state, styles.warning)} />;\n};\nexport const SuccessIcon = () => {\n\treturn <CircleCheckIcon className={cn(styles.state, styles.success)} />;\n};\nexport const InformationIcon = () => {\n\treturn <InfoIcon className={cn(styles.state, styles.information)} />;\n};\n","import React from \"react\";\n\nimport { State } from \"@ryuzaki13/react-foundation-lib/types\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { PolymorphicComponent, PolymorphicComponentBaseProps } from \"../polymorphic\";\n\nimport styles from \"./State.module.scss\";\n\ntype StateWrapperOwnProps<E extends React.ElementType = React.ElementType> = PolymorphicComponentBaseProps<E> & {\n\tstate?: State;\n\tclassName?: string;\n};\n\ntype StateWrapperProps<E extends React.ElementType> = StateWrapperOwnProps<E> &\n\tOmit<React.ComponentPropsWithRef<E>, keyof StateWrapperOwnProps>;\n\nexport function StateWrapper<E extends React.ElementType>({ as, state, className, ...props }: StateWrapperProps<E>) {\n\tconst status = state?.toLowerCase() ?? \"none\";\n\tconst statusClass = styles[status as keyof typeof styles];\n\tconst isStatused = status && status !== \"none\";\n\n\tconst Component = as || \"div\";\n\n\treturn (\n\t\t<PolymorphicComponent\n\t\t\tas={Component as React.ElementType}\n\t\t\tclassName={cn(styles.stateWrapper, isStatused && styles.status, statusClass, className)}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { i as e } from "./Flex-DbBdq336.js";
|
|
2
2
|
import { r as t } from "./Grid-ByIIytjh.js";
|
|
3
|
-
import { c as n } from "./misc-
|
|
3
|
+
import { c as n } from "./misc-Bj0y3ERC.js";
|
|
4
4
|
import { t as r } from "./Button-BZ_b-Kin.js";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
5
|
+
import { cn as i } from "@ryuzaki13/react-foundation-lib/utils";
|
|
6
|
+
import { X as a } from "lucide-react";
|
|
7
7
|
import { Fragment as o, jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
8
8
|
import { Children as l, createContext as u, useCallback as d, useContext as f, useEffect as p, useEffectEvent as m, useId as h, useRef as g, useState as _ } from "react";
|
|
9
9
|
import { getOrCreatePortalRoot as v, useEscapeDismiss as y, useFocusTrap as b } from "@ryuzaki13/react-foundation-lib/dom";
|
|
@@ -26,12 +26,12 @@ var S = {
|
|
|
26
26
|
closeModal: () => {},
|
|
27
27
|
isTopModal: () => !1
|
|
28
28
|
}), w = () => f(C), T = ({ children: e, className: t }) => /* @__PURE__ */ s("div", {
|
|
29
|
-
className:
|
|
29
|
+
className: i("surface2 paddingMd borderBottom", t),
|
|
30
30
|
children: e
|
|
31
31
|
});
|
|
32
32
|
T.displayName = "Modal.Toolbar";
|
|
33
33
|
var E = ({ children: e, className: t, scrollable: r }) => /* @__PURE__ */ s("div", {
|
|
34
|
-
className:
|
|
34
|
+
className: i("paddingMd h100 overflowHidden", t),
|
|
35
35
|
children: r ? /* @__PURE__ */ s(n, {
|
|
36
36
|
className: "h100",
|
|
37
37
|
children: e
|
|
@@ -39,7 +39,7 @@ var E = ({ children: e, className: t, scrollable: r }) => /* @__PURE__ */ s("div
|
|
|
39
39
|
});
|
|
40
40
|
E.displayName = "Modal.Content";
|
|
41
41
|
var D = ({ children: t, className: n }) => /* @__PURE__ */ s("div", {
|
|
42
|
-
className:
|
|
42
|
+
className: i("surface2 borderTop paddingMd", n),
|
|
43
43
|
children: /* @__PURE__ */ s(e, {
|
|
44
44
|
gap: "sm",
|
|
45
45
|
align: "center",
|
|
@@ -81,20 +81,20 @@ var O = ({ isOpen: e, title: n, size: u = "sm", height: d, onClose: f, children:
|
|
|
81
81
|
}
|
|
82
82
|
return x(/* @__PURE__ */ s(o, { children: /* @__PURE__ */ c("div", {
|
|
83
83
|
ref: R,
|
|
84
|
-
className:
|
|
84
|
+
className: i(S.modal, S[u]),
|
|
85
85
|
style: { height: d },
|
|
86
86
|
role: "dialog",
|
|
87
87
|
"aria-modal": "true",
|
|
88
88
|
"aria-labelledby": O,
|
|
89
89
|
"aria-describedby": `${O}-content`,
|
|
90
90
|
children: [/* @__PURE__ */ c("div", {
|
|
91
|
-
className:
|
|
91
|
+
className: i(S.header, B ? "" : "borderBottom"),
|
|
92
92
|
children: [/* @__PURE__ */ s("h3", {
|
|
93
93
|
className: S.headerText,
|
|
94
94
|
id: O,
|
|
95
95
|
children: n
|
|
96
96
|
}), /* @__PURE__ */ s(r, {
|
|
97
|
-
icon: /* @__PURE__ */ s(
|
|
97
|
+
icon: /* @__PURE__ */ s(a, {}),
|
|
98
98
|
className: S.headerButton,
|
|
99
99
|
variant: "ghost",
|
|
100
100
|
autoFocus: !0,
|
|
@@ -150,4 +150,4 @@ function k({ children: e }) {
|
|
|
150
150
|
//#endregion
|
|
151
151
|
export { T as a, D as i, O as n, C as o, E as r, w as s, k as t };
|
|
152
152
|
|
|
153
|
-
//# sourceMappingURL=modal-
|
|
153
|
+
//# sourceMappingURL=modal-B4ivQb2h.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modal-B4ivQb2h.js","names":[],"sources":["../../src/modal/Modal.module.scss","../../src/modal/useModalManager.ts","../../src/modal/Modal.tsx","../../src/modal/ModalManagerProvider.tsx"],"sourcesContent":["@use \"@/styles/mixins\" as *;\n\n.modal {\n\tdisplay: grid;\n\tgrid-auto-rows: auto 1fr;\n\n\tposition: fixed;\n\tinset: 0;\n\tmargin: auto;\n\tz-index: var(--z-modal);\n\twidth: 90%;\n\theight: fit-content;\n\tmax-height: calc(100dvh - var(--space-lg));\n\tborder: var(--border);\n\tborder-radius: var(--radius-md);\n\tbackground-color: var(--surface-1);\n\tbox-shadow: var(--shadow-lg);\n\n\t&:not(:last-child) {\n\t\tpointer-events: none;\n\t\tfilter: grayscale(0.5) opacity(0.75);\n\t\t// opacity: 0.5;\n\t}\n\n\t&.sm {\n\t\tmax-width: min(30em, 93dvw);\n\t}\n\n\t&.md {\n\t\tmax-width: min(50em, 93dvw);\n\t}\n\n\t&.lg {\n\t\tmax-width: min(70em, 93dvw);\n\t}\n\n\t&.xl {\n\t\tmax-width: min(80em, 93dvw);\n\t}\n\n\t&.xxl {\n\t\twidth: 93dvw;\n\t\theight: 90dvh;\n\t\tmax-width: none;\n\t\tmax-height: none;\n\t}\n\n\t&.inside {\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tmax-width: none;\n\t\tmax-height: none;\n\n\t\t.header,\n\t\t.body {\n\t\t\tborder-radius: 0;\n\t\t}\n\t}\n}\n\n.header {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tbackground-color: var(--surface-2);\n\tborder-top-left-radius: var(--radius-md);\n\tborder-top-right-radius: var(--radius-md);\n}\n\n.headerText {\n\tmargin: 0;\n\tpadding-inline: var(--space-md);\n\tfont-size: var(--font-size-md);\n\tfont-variation-settings: \"wght\" 600;\n}\n\n.headerButton {\n\tmargin-block: var(--space-xs);\n\tmargin-inline: var(--space-sm);\n\tflex: 0;\n}\n\n.body {\n\toverflow: hidden;\n\tborder-bottom-left-radius: var(--radius-md);\n\tborder-bottom-right-radius: var(--radius-md);\n}\n","import { createContext, useContext } from \"react\";\n\nexport const ModalManagerContext = createContext<{\n\tmodals: string[];\n\topenModal: (id: string) => void;\n\tcloseModal: (id: string) => void;\n\tisTopModal: (id: string) => boolean;\n}>({\n\tmodals: [],\n\topenModal: () => {},\n\tcloseModal: () => {},\n\tisTopModal: () => false\n});\n\nexport const useModalManager = () => useContext(ModalManagerContext);\n","import React, { Children, useEffect, useEffectEvent, useId, useState } from \"react\";\n\nimport { getOrCreatePortalRoot, useEscapeDismiss, useFocusTrap } from \"@ryuzaki13/react-foundation-lib/dom\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { X } from \"lucide-react\";\nimport { createPortal } from \"react-dom\";\n\nimport { Button } from \"../button\";\nimport { FlexContainer } from \"../flex\";\nimport { GridContainer } from \"../grid\";\nimport { Scrollable } from \"../misc\";\n\nimport styles from \"./Modal.module.scss\";\nimport { ModalSize } from \"./types\";\nimport { useModalManager } from \"./useModalManager\";\n\n// Подкомпоненты\nexport interface ModalCompositionProps {\n\tchildren: React.ReactNode;\n\tclassName?: string;\n}\n\nexport const ModalToolbar: React.FC<ModalCompositionProps> = ({ children, className }) => {\n\treturn <div className={cn(\"surface2 paddingMd borderBottom\", className)}>{children}</div>;\n};\nModalToolbar.displayName = \"Modal.Toolbar\";\n\nexport const ModalContent: React.FC<ModalCompositionProps & { scrollable?: boolean }> = ({ children, className, scrollable }) => {\n\treturn (\n\t\t<div className={cn(\"paddingMd h100 overflowHidden\", className)}>\n\t\t\t{scrollable ? <Scrollable className=\"h100\">{children}</Scrollable> : children}\n\t\t</div>\n\t);\n};\nModalContent.displayName = \"Modal.Content\";\n\nexport const ModalFooter: React.FC<ModalCompositionProps> = ({ children, className }) => {\n\treturn (\n\t\t<div className={cn(\"surface2 borderTop paddingMd\", className)}>\n\t\t\t<FlexContainer gap=\"sm\" align=\"center\" justify=\"end\">\n\t\t\t\t{children}\n\t\t\t</FlexContainer>\n\t\t</div>\n\t);\n};\nModalFooter.displayName = \"Modal.Footer\";\n\ntype ToolbarElement = React.ReactElement<ModalCompositionProps, typeof ModalToolbar>;\ntype ContentElement = React.ReactElement<ModalCompositionProps, typeof ModalContent>;\ntype FooterElement = React.ReactElement<ModalCompositionProps, typeof ModalFooter>;\n\ntype ModalChildren =\n\t[ToolbarElement, ContentElement, FooterElement] | [ToolbarElement, ContentElement] | [ContentElement, FooterElement] | ContentElement;\n\nexport interface ModalProps {\n\t/** Открыто ли модальное окно */\n\tisOpen?: boolean;\n\t/** Заголовок */\n\ttitle?: string;\n\t/** Размер модального окна */\n\tsize?: keyof typeof ModalSize;\n\theight?: string;\n\t/** Обработчик закрытия */\n\tonClose: () => void;\n\tchildren: ModalChildren;\n}\n\nexport const Modal: React.FC<ModalProps> = ({ isOpen, title, size = \"sm\", height, onClose, children }) => {\n\tconst modalId = useId();\n\tconst titleId = useId();\n\n\tconst { modals, openModal, closeModal, isTopModal } = useModalManager();\n\tconst [isMounted, setIsMounted] = useState(false);\n\tconst mountModal = useEffectEvent(() => setIsMounted(true));\n\tconst unmountModal = useEffectEvent(() => setIsMounted(false));\n\n\t/**\n\t * Если provider менеджера не подключен, считаем одиночную модалку активной,\n\t * иначе логика Escape/focus trap никогда не включится.\n\t */\n\tconst isActive = isOpen && (modals.length === 0 || isTopModal(modalId));\n\n\tconst modalRef = useFocusTrap(isOpen || false);\n\n\tuseEscapeDismiss({\n\t\tactive: isActive || false,\n\t\tonDismiss: onClose,\n\t\tcontainerRef: modalRef\n\t});\n\n\tuseEffect(() => {\n\t\tif (isOpen) {\n\t\t\topenModal(modalId);\n\t\t\tmountModal();\n\t\t}\n\n\t\treturn () => {\n\t\t\tcloseModal(modalId);\n\t\t\tunmountModal();\n\t\t};\n\t}, [closeModal, isOpen, modalId, openModal]);\n\n\tif (!isMounted) return null;\n\n\tconst modalRoot = getOrCreatePortalRoot(\"modal-root\");\n\n\tif (!modalRoot) {\n\t\treturn null;\n\t}\n\n\tlet toolbar: React.ReactNode = null;\n\tlet content: React.ReactNode = null;\n\tlet footer: React.ReactNode = null;\n\n\tconst childArray = Children.toArray(children) as (ToolbarElement | ContentElement | FooterElement)[];\n\n\tfor (const child of childArray) {\n\t\tconst typeName = child.type.displayName;\n\n\t\tswitch (typeName) {\n\t\t\tcase ModalToolbar.displayName:\n\t\t\t\tif (toolbar) throw new Error(\"Modal: duplicate <Toolbar> found\");\n\t\t\t\ttoolbar = child; //.props.children;\n\t\t\t\tbreak;\n\t\t\tcase ModalFooter.displayName:\n\t\t\t\tif (footer) throw new Error(\"Modal: duplicate <Footer> found\");\n\t\t\t\tfooter = child; //props.children;\n\t\t\t\tbreak;\n\t\t\tcase ModalContent.displayName:\n\t\t\t\tif (content) throw new Error(\"Modal: duplicate <Content> found\");\n\t\t\t\tcontent = child; //.props.children;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn createPortal(\n\t\t<>\n\t\t\t<div\n\t\t\t\tref={modalRef}\n\t\t\t\tclassName={cn(styles.modal, styles[size])}\n\t\t\t\tstyle={{ height }}\n\t\t\t\trole=\"dialog\"\n\t\t\t\taria-modal=\"true\"\n\t\t\t\taria-labelledby={titleId}\n\t\t\t\taria-describedby={`${titleId}-content`}>\n\t\t\t\t<div className={cn(styles.header, toolbar ? \"\" : \"borderBottom\")}>\n\t\t\t\t\t<h3 className={styles.headerText} id={titleId}>\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</h3>\n\t\t\t\t\t<Button\n\t\t\t\t\t\ticon={<X />}\n\t\t\t\t\t\tclassName={styles.headerButton}\n\t\t\t\t\t\tvariant={\"ghost\"}\n\t\t\t\t\t\tautoFocus={true}\n\t\t\t\t\t\taria-label={\"Закрыть модальное окно\"}\n\t\t\t\t\t\tonClick={onClose}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\n\t\t\t\t<GridContainer\n\t\t\t\t\tid={`${titleId}-content`}\n\t\t\t\t\ttemplateRows={`${toolbar ? \"auto\" : \"\"} 1fr ${footer ? \"auto\" : \"\"}`.trim()}\n\t\t\t\t\t// gap=\"md\"\n\t\t\t\t\tclassName={styles.body}>\n\t\t\t\t\t{toolbar}\n\t\t\t\t\t{content}\n\t\t\t\t\t{footer}\n\t\t\t\t</GridContainer>\n\t\t\t</div>\n\t\t</>,\n\t\tmodalRoot\n\t);\n};\n","// ModalManagerContext.tsx\nimport React, { useCallback, useEffect, useRef, useState } from \"react\";\n\nimport { ModalManagerContext } from \"./useModalManager\";\n\n/**\n * Провайдер для централизованного управления стеком модальных окон. Дает вложенным компонентам доступ к открытию и закрытию модалок через контекст.\n */\nexport function ModalManagerProvider({ children }: { children: React.ReactNode }) {\n\tconst [modals, setModals] = useState<string[]>([]);\n\tconst prevModalsLength = useRef(0);\n\n\tconst openModal = useCallback((id: string) => {\n\t\tsetModals((prev) => [...prev, id]);\n\t}, []);\n\n\tconst closeModal = useCallback((id: string) => {\n\t\tsetModals((prev) => prev.filter((mid) => mid !== id));\n\t}, []);\n\n\tconst isTopModal = useCallback(\n\t\t(id: string) => {\n\t\t\treturn modals[modals.length - 1] === id;\n\t\t},\n\t\t[modals]\n\t);\n\n\tuseEffect(() => {\n\t\tconst wasEmpty = prevModalsLength.current === 0;\n\t\tconst isNowEmpty = modals.length === 0;\n\n\t\tif (wasEmpty && modals.length > 0) {\n\t\t\t// первая модалка открыта — ставим стили\n\t\t\tconst scrollY = window.scrollY;\n\t\t\t// const scrollbarWidth = window.innerWidth - document.documentElement.clientWidth;\n\t\t\tconst appRoot = document.querySelector(\"#app-root\");\n\n\t\t\tdocument.body.style.position = \"fixed\";\n\t\t\tdocument.body.style.top = `-${scrollY}px`;\n\t\t\tdocument.body.style.width = \"100%\";\n\t\t\t// document.body.style.paddingRight = `${scrollbarWidth}px`;\n\t\t\tappRoot?.setAttribute(\"inert\", \"true\");\n\n\t\t\tprevModalsLength.current = modals.length;\n\t\t\treturn;\n\t\t}\n\n\t\tif (!wasEmpty && isNowEmpty) {\n\t\t\t// последняя модалка закрыта — снимаем стили\n\t\t\tconst appRoot = document.querySelector(\"#app-root\");\n\t\t\tconst scrollY = parseInt(document.body.style.top || \"0\") * -1;\n\n\t\t\tdocument.body.style.position = \"\";\n\t\t\tdocument.body.style.top = \"\";\n\t\t\tdocument.body.style.width = \"\";\n\t\t\t// document.body.style.paddingRight = \"\";\n\n\t\t\tappRoot?.removeAttribute(\"inert\");\n\n\t\t\twindow.scrollTo({ top: scrollY, left: 0, behavior: \"instant\" });\n\t\t}\n\n\t\tprevModalsLength.current = modals.length;\n\t}, [modals.length]);\n\n\treturn <ModalManagerContext.Provider value={{ modals, openModal, closeModal, isTopModal }}>{children}</ModalManagerContext.Provider>;\n}\n"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { t as e } from "./ui.module-BisoTevy.js";
|
|
2
|
-
import { c as t, o as n, r } from "./Input-
|
|
2
|
+
import { c as t, o as n, r } from "./Input-Wrew1puH.js";
|
|
3
3
|
import { t as i } from "./separator-CIqnk2z9.js";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
4
|
+
import { cn as a } from "@ryuzaki13/react-foundation-lib/utils";
|
|
5
|
+
import { ChevronDownIcon as o } from "lucide-react";
|
|
6
6
|
import { jsx as s, jsxs as c } from "react/jsx-runtime";
|
|
7
7
|
import { forwardRef as l, useEffect as u, useEffectEvent as d, useMemo as f, useRef as p, useState as m } from "react";
|
|
8
8
|
import { normalizeTextToLower as h } from "@ryuzaki13/react-foundation-lib/formatters";
|
|
@@ -49,7 +49,7 @@ var S = {
|
|
|
49
49
|
function C(e) {
|
|
50
50
|
e.stopPropagation();
|
|
51
51
|
}
|
|
52
|
-
function w({ open: e, context: t, floatingStyles: n, listId: r, labelId:
|
|
52
|
+
function w({ open: e, context: t, floatingStyles: n, listId: r, labelId: o, descriptionId: l, activeOptionId: u, setFloating: d, getFloatingProps: f, onKeyDown: p, initialFocus: m = -1, returnFocus: h = !1, tabIndex: v = 0, className: x, layoutClassName: w, headerClassName: T, bodyClassName: E, header: D, children: O }) {
|
|
53
53
|
return /* @__PURE__ */ s(y, { children: e && /* @__PURE__ */ s(_, { children: /* @__PURE__ */ s(g, {
|
|
54
54
|
context: t,
|
|
55
55
|
modal: !1,
|
|
@@ -73,7 +73,7 @@ function w({ open: e, context: t, floatingStyles: n, listId: r, labelId: a, desc
|
|
|
73
73
|
...f({
|
|
74
74
|
id: r,
|
|
75
75
|
tabIndex: v,
|
|
76
|
-
"aria-labelledby":
|
|
76
|
+
"aria-labelledby": o,
|
|
77
77
|
"aria-describedby": l,
|
|
78
78
|
"aria-activedescendant": u,
|
|
79
79
|
onMouseDown: C,
|
|
@@ -81,12 +81,12 @@ function w({ open: e, context: t, floatingStyles: n, listId: r, labelId: a, desc
|
|
|
81
81
|
className: x
|
|
82
82
|
}),
|
|
83
83
|
children: /* @__PURE__ */ c("div", {
|
|
84
|
-
className:
|
|
84
|
+
className: a(S.popupLayout, w),
|
|
85
85
|
children: [D ? /* @__PURE__ */ c("div", {
|
|
86
86
|
className: T,
|
|
87
87
|
children: [D, /* @__PURE__ */ s(i, { className: "marginBlockSm" })]
|
|
88
88
|
}) : /* @__PURE__ */ s("div", {}), /* @__PURE__ */ s("div", {
|
|
89
|
-
className:
|
|
89
|
+
className: a(S.popupBody, E),
|
|
90
90
|
children: O
|
|
91
91
|
})]
|
|
92
92
|
})
|
|
@@ -98,7 +98,7 @@ function w({ open: e, context: t, floatingStyles: n, listId: r, labelId: a, desc
|
|
|
98
98
|
function T({ emptyState: t, loadingState: n, errorState: r }) {
|
|
99
99
|
let i = r ?? n ?? t;
|
|
100
100
|
return i == null ? null : /* @__PURE__ */ s("div", {
|
|
101
|
-
className:
|
|
101
|
+
className: a(e.uiPopupOption, S.status, r !== void 0 && S.statusError),
|
|
102
102
|
"aria-disabled": !0,
|
|
103
103
|
children: i
|
|
104
104
|
});
|
|
@@ -118,22 +118,22 @@ function E({ open: t, disabled: n, children: r, onToggleMouseDown: i, onToggleCl
|
|
|
118
118
|
className: e.uiToggleButton,
|
|
119
119
|
onMouseDown: i,
|
|
120
120
|
onClick: l,
|
|
121
|
-
children: /* @__PURE__ */ s(
|
|
121
|
+
children: /* @__PURE__ */ s(o, { className: a(e.uiToggleIcon, t && e.uiToggleIconOpen) })
|
|
122
122
|
})
|
|
123
123
|
]
|
|
124
124
|
});
|
|
125
125
|
}
|
|
126
126
|
//#endregion
|
|
127
127
|
//#region src/picker/PickerTriggerInput.tsx
|
|
128
|
-
var D = l(({ rootRef: t, endAdornment: n, overlay: i, rootClassName:
|
|
128
|
+
var D = l(({ rootRef: t, endAdornment: n, overlay: i, rootClassName: o, inputClassName: l, ...u }, d) => /* @__PURE__ */ c("div", {
|
|
129
129
|
ref: t,
|
|
130
|
-
className:
|
|
130
|
+
className: a(e.uiInputContainer, S.triggerContainer, o),
|
|
131
131
|
children: [/* @__PURE__ */ s(r, {
|
|
132
132
|
endAdornment: n,
|
|
133
133
|
children: ({ controlClassName: t }) => /* @__PURE__ */ s("input", {
|
|
134
134
|
...u,
|
|
135
135
|
ref: d,
|
|
136
|
-
className:
|
|
136
|
+
className: a(e.uiInputWithToggle, t, l)
|
|
137
137
|
})
|
|
138
138
|
}), i]
|
|
139
139
|
}));
|
|
@@ -315,4 +315,4 @@ function I({ mode: e, open: t, currentQuery: n, hasDisplayValue: r, inputRef: i,
|
|
|
315
315
|
//#endregion
|
|
316
316
|
export { j as a, D as c, w as d, x as f, M as i, E as l, P as n, k as o, N as r, O as s, I as t, T as u };
|
|
317
317
|
|
|
318
|
-
//# sourceMappingURL=picker-
|
|
318
|
+
//# sourceMappingURL=picker-gIUs0nE_.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"picker-gIUs0nE_.js","names":[],"sources":["../../src/picker/PickerField.tsx","../../src/picker/Picker.module.scss","../../src/picker/PickerPopup.tsx","../../src/picker/PickerStatus.tsx","../../src/picker/PickerTriggerActions.tsx","../../src/picker/PickerTriggerInput.tsx","../../src/picker/model/createPickerTriggerPolicy.ts","../../src/picker/model/extractPickerTextContent.ts","../../src/picker/model/usePickerDefaultFilter.ts","../../src/picker/model/usePickerFloatingListbox.ts","../../src/picker/model/usePickerQuery.ts","../../src/picker/model/usePickerSelectionLifecycle.ts","../../src/picker/model/usePickerTriggerController.ts"],"sourcesContent":["import { InputType } from \"@ryuzaki13/react-foundation-lib/types\";\n\nimport { InputUI } from \"../input\";\nimport { useInputFieldIds } from \"../input/lib/useInputFieldIds\";\n\nimport { PickerFieldProps } from \"./types\";\n\nexport function PickerField<TValue extends InputType>({\n\tid,\n\tlabel,\n\tdescription,\n\tdisabled,\n\tsize,\n\tclassName,\n\terror,\n\tchildren\n}: PickerFieldProps<TValue>) {\n\tconst { controlId, labelId, descriptionId, errorId, describedBy } = useInputFieldIds({\n\t\tid,\n\t\thasLabel: label !== undefined && label !== null,\n\t\thasDescription: !!description,\n\t\thasError: !!error\n\t});\n\n\treturn (\n\t\t<InputUI\n\t\t\tlabel={label}\n\t\t\tdescription={description}\n\t\t\tdisabled={disabled}\n\t\t\tsize={size}\n\t\t\tclassName={className}\n\t\t\terror={error}\n\t\t\tcontrolId={controlId}\n\t\t\tlabelId={labelId}\n\t\t\tdescriptionId={descriptionId}\n\t\t\terrorId={errorId}>\n\t\t\t{children({ controlId, labelId, descriptionId, errorId, describedBy })}\n\t\t</InputUI>\n\t);\n}\n",".popupLayout {\n\tdisplay: grid;\n\tgrid-template-rows: auto 1fr;\n\tmin-height: 0;\n\tmax-height: 75vh;\n\toverflow: hidden;\n\n\tflex: 1 1 auto;\n}\n\n.popupBody {\n\tmin-height: 0;\n}\n\n.status {\n\tpadding: var(--space-xs) var(--space-sm);\n\tcolor: var(--content-2);\n}\n\n.statusError {\n\tcolor: var(--status-error-text);\n}\n\n.triggerContainer {\n\tposition: relative;\n}\n","import { type CSSProperties, type KeyboardEvent, type MouseEvent, type ReactNode } from \"react\";\n\nimport { FloatingContext, FloatingFocusManager, FloatingPortal } from \"@floating-ui/react\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { AnimatePresence, motion } from \"motion/react\";\n\nimport { Separator } from \"../separator\";\n\nimport styles from \"./Picker.module.scss\";\n\ninterface PickerPopupProps {\n\topen: boolean;\n\tcontext: FloatingContext;\n\tfloatingStyles: CSSProperties;\n\tlistId: string;\n\tlabelId?: string;\n\tdescriptionId?: string;\n\tactiveOptionId?: string;\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\tlayoutClassName?: string;\n\theaderClassName?: string;\n\tbodyClassName?: string;\n\theader?: ReactNode;\n\tchildren: ReactNode;\n}\n\nfunction stopNestedFloatingMouseDown(event: MouseEvent<HTMLElement>): void {\n\tevent.stopPropagation();\n}\n\nexport function PickerPopup({\n\topen,\n\tcontext,\n\tfloatingStyles,\n\tlistId,\n\tlabelId,\n\tdescriptionId,\n\tactiveOptionId,\n\tsetFloating,\n\tgetFloatingProps,\n\tonKeyDown,\n\tinitialFocus = -1,\n\treturnFocus = false,\n\ttabIndex = 0,\n\tclassName,\n\tlayoutClassName,\n\theaderClassName,\n\tbodyClassName,\n\theader,\n\tchildren\n}: PickerPopupProps) {\n\treturn (\n\t\t<AnimatePresence>\n\t\t\t{open && (\n\t\t\t\t<FloatingPortal>\n\t\t\t\t\t<FloatingFocusManager context={context} modal={false} initialFocus={initialFocus} returnFocus={returnFocus}>\n\t\t\t\t\t\t<motion.div\n\t\t\t\t\t\t\tref={setFloating}\n\t\t\t\t\t\t\tstyle={floatingStyles}\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\ttabIndex,\n\t\t\t\t\t\t\t\t\"aria-labelledby\": labelId,\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\tonMouseDown: stopNestedFloatingMouseDown,\n\t\t\t\t\t\t\t\tonKeyDown,\n\t\t\t\t\t\t\t\tclassName\n\t\t\t\t\t\t\t})}>\n\t\t\t\t\t\t\t<div className={cn(styles.popupLayout, layoutClassName)}>\n\t\t\t\t\t\t\t\t{header ? (\n\t\t\t\t\t\t\t\t\t<div className={headerClassName}>\n\t\t\t\t\t\t\t\t\t\t{header}\n\t\t\t\t\t\t\t\t\t\t<Separator className=\"marginBlockSm\" />\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t<div />\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t<div className={cn(styles.popupBody, bodyClassName)}>{children}</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</motion.div>\n\t\t\t\t\t</FloatingFocusManager>\n\t\t\t\t</FloatingPortal>\n\t\t\t)}\n\t\t</AnimatePresence>\n\t);\n}\n","import { ReactNode } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport uiStyles from \"../ui.module.scss\";\n\nimport styles from \"./Picker.module.scss\";\n\ninterface PickerStatusProps {\n\temptyState?: ReactNode;\n\tloadingState?: ReactNode;\n\terrorState?: ReactNode;\n}\n\nexport function PickerStatus({ emptyState, loadingState, errorState }: PickerStatusProps) {\n\tconst content = errorState ?? loadingState ?? emptyState;\n\n\tif (content === undefined || content === null) {\n\t\treturn null;\n\t}\n\n\treturn (\n\t\t<div className={cn(uiStyles.uiPopupOption, styles.status, errorState !== undefined && styles.statusError)} aria-disabled={true}>\n\t\t\t{content}\n\t\t</div>\n\t);\n}\n","import { MouseEvent, ReactNode } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { ChevronDownIcon } from \"lucide-react\";\n\nimport uiStyles from \"../ui.module.scss\";\n\ninterface PickerTriggerActionsProps {\n\topen: boolean;\n\tdisabled?: boolean;\n\tchildren?: ReactNode;\n\tonToggleMouseDown?: (event: MouseEvent<HTMLButtonElement>) => void;\n\tonToggleClick: () => void;\n\topenAriaLabel?: string;\n\tcloseAriaLabel?: string;\n}\n\nexport function PickerTriggerActions({\n\topen,\n\tdisabled,\n\tchildren,\n\tonToggleMouseDown,\n\tonToggleClick,\n\topenAriaLabel = \"Открыть список\",\n\tcloseAriaLabel = \"Закрыть список\"\n}: PickerTriggerActionsProps) {\n\treturn (\n\t\t<div className={uiStyles.uiToggleButtonContainer} data-disabled={disabled || undefined}>\n\t\t\t{children}\n\n\t\t\t<div className={uiStyles.uiButtonSeparator} />\n\n\t\t\t<button\n\t\t\t\ttype=\"button\"\n\t\t\t\taria-label={open ? closeAriaLabel : openAriaLabel}\n\t\t\t\tclassName={uiStyles.uiToggleButton}\n\t\t\t\tonMouseDown={onToggleMouseDown}\n\t\t\t\tonClick={onToggleClick}>\n\t\t\t\t<ChevronDownIcon className={cn(uiStyles.uiToggleIcon, open && uiStyles.uiToggleIconOpen)} />\n\t\t\t</button>\n\t\t</div>\n\t);\n}\n","import { ComponentPropsWithoutRef, forwardRef, ReactNode } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { InputControl } from \"../input\";\nimport uiStyles from \"../ui.module.scss\";\n\nimport styles from \"./Picker.module.scss\";\n\ninterface PickerTriggerInputProps extends Omit<ComponentPropsWithoutRef<\"input\">, \"size\"> {\n\trootRef?: (node: HTMLDivElement | null) => void;\n\tendAdornment?: ReactNode;\n\toverlay?: ReactNode;\n\trootClassName?: string;\n\tinputClassName?: string;\n}\n\nexport const PickerTriggerInput = forwardRef<HTMLInputElement, PickerTriggerInputProps>(\n\t({ rootRef, endAdornment, overlay, rootClassName, inputClassName, ...props }, ref) => {\n\t\treturn (\n\t\t\t<div ref={rootRef} className={cn(uiStyles.uiInputContainer, styles.triggerContainer, rootClassName)}>\n\t\t\t\t<InputControl endAdornment={endAdornment}>\n\t\t\t\t\t{({ controlClassName }) => (\n\t\t\t\t\t\t<input {...props} ref={ref} className={cn(uiStyles.uiInputWithToggle, controlClassName, inputClassName)} />\n\t\t\t\t\t)}\n\t\t\t\t</InputControl>\n\t\t\t\t{overlay}\n\t\t\t</div>\n\t\t);\n\t}\n);\n\nPickerTriggerInput.displayName = \"PickerTriggerInput\";\n","export type PickerTriggerMode = \"display\" | \"search-single\" | \"search-multi\";\n\ninterface PickerTriggerTextFocusParams {\n\topen: boolean;\n\tcurrentQuery: string;\n\thasDisplayValue: boolean;\n}\n\nexport interface PickerTriggerPolicy {\n\tfocusFloatingOnOpen: boolean;\n\trestoreFocusOnClose: boolean;\n\tresetQueryOnClose: boolean;\n\tshouldOpenOnTriggerClick: (open: boolean) => boolean;\n\tshouldOpenOnInputChange: (open: boolean) => boolean;\n\tshouldFocusReferenceOnToggle: (open: boolean) => boolean;\n\tshouldSelectTriggerTextOnFocus: (params: PickerTriggerTextFocusParams) => boolean;\n}\n\n/**\n * Единая политика поведения trigger-input для picker-компонентов.\n * Нормализует различия между display-режимом, single-search и multi-search.\n */\nexport function createPickerTriggerPolicy(mode: PickerTriggerMode): PickerTriggerPolicy {\n\tswitch (mode) {\n\t\tcase \"search-single\":\n\t\t\treturn {\n\t\t\t\tfocusFloatingOnOpen: false,\n\t\t\t\trestoreFocusOnClose: false,\n\t\t\t\tresetQueryOnClose: true,\n\t\t\t\tshouldOpenOnTriggerClick: () => false,\n\t\t\t\tshouldOpenOnInputChange: (open) => !open,\n\t\t\t\tshouldFocusReferenceOnToggle: (open) => !open,\n\t\t\t\tshouldSelectTriggerTextOnFocus: ({ open, currentQuery, hasDisplayValue }) =>\n\t\t\t\t\t!open && currentQuery.length === 0 && hasDisplayValue\n\t\t\t};\n\t\tcase \"search-multi\":\n\t\t\treturn {\n\t\t\t\tfocusFloatingOnOpen: false,\n\t\t\t\trestoreFocusOnClose: false,\n\t\t\t\tresetQueryOnClose: true,\n\t\t\t\tshouldOpenOnTriggerClick: () => false,\n\t\t\t\tshouldOpenOnInputChange: (open) => !open,\n\t\t\t\tshouldFocusReferenceOnToggle: (open) => !open,\n\t\t\t\tshouldSelectTriggerTextOnFocus: () => false\n\t\t\t};\n\t\tcase \"display\":\n\t\tdefault:\n\t\t\treturn {\n\t\t\t\tfocusFloatingOnOpen: true,\n\t\t\t\trestoreFocusOnClose: true,\n\t\t\t\tresetQueryOnClose: false,\n\t\t\t\tshouldOpenOnTriggerClick: (open) => !open,\n\t\t\t\tshouldOpenOnInputChange: () => false,\n\t\t\t\tshouldFocusReferenceOnToggle: () => false,\n\t\t\t\tshouldSelectTriggerTextOnFocus: () => false\n\t\t\t};\n\t}\n}\n","import { ReactNode } from \"react\";\n\nexport function extractPickerTextContent(node: ReactNode): string | undefined {\n\tif (typeof node === \"string\" || typeof node === \"number\") {\n\t\treturn String(node);\n\t}\n\n\tif (Array.isArray(node)) {\n\t\tconst values = node.map(extractPickerTextContent).filter((value): value is string => Boolean(value));\n\t\treturn values.length ? values.join(\" \") : undefined;\n\t}\n\n\treturn undefined;\n}\n","import { useMemo } from \"react\";\n\nimport { normalizeTextToLower } from \"@ryuzaki13/react-foundation-lib/formatters\";\n\ninterface UsePickerDefaultFilterOptions<T> {\n\toptions: readonly T[];\n\tquery: string;\n\tenabled?: boolean;\n\tgetSearchText: (option: T) => unknown;\n}\n\nfunction normalizeSearchText(value: unknown) {\n\tconst parts = Array.isArray(value) ? value : [value];\n\n\treturn normalizeTextToLower(parts.filter(Boolean).join(\" \"));\n}\n\nexport function usePickerDefaultFilter<T>({ options, query, enabled = true, getSearchText }: UsePickerDefaultFilterOptions<T>) {\n\tconst normalizedQuery = normalizeTextToLower(query);\n\n\treturn useMemo(() => {\n\t\tif (!enabled || !normalizedQuery) {\n\t\t\treturn [...options];\n\t\t}\n\n\t\treturn options.filter((option) => normalizeSearchText(getSearchText(option)).includes(normalizedQuery));\n\t}, [enabled, getSearchText, normalizedQuery, options]);\n}\n","import { Placement } from \"@floating-ui/react\";\nimport { useFloatingListbox } 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\tcloseOnSelect?: boolean;\n\tfocusFloatingOnOpen?: boolean;\n\tallowOpenWithoutOptions?: boolean;\n\trestoreFocusOnClose?: boolean;\n\ttriggerMode?: PickerTriggerMode;\n}\n\n/**\n * Единая точка входа для popup/listbox поведения во всех picker-компонентах.\n */\nexport function usePickerFloatingListbox<T>(params: UsePickerFloatingListboxParams<T>) {\n\tconst triggerPolicy = params.triggerMode ? createPickerTriggerPolicy(params.triggerMode) : undefined;\n\n\treturn useFloatingListbox({\n\t\t...params,\n\t\tfocusFloatingOnOpen: params.focusFloatingOnOpen ?? triggerPolicy?.focusFloatingOnOpen,\n\t\trestoreFocusOnClose: params.restoreFocusOnClose ?? triggerPolicy?.restoreFocusOnClose\n\t});\n}\n","import { useEffect, useEffectEvent, useRef, useState } from \"react\";\n\nimport { PickerTriggerMode, createPickerTriggerPolicy } from \"./createPickerTriggerPolicy\";\n\ninterface UsePickerQueryOptions {\n\topen: boolean;\n\tquery?: string;\n\tdefaultQuery?: string;\n\tonQuery?: (value: string) => void;\n\tresetOnClose?: boolean;\n\ttriggerMode?: PickerTriggerMode;\n}\n\nexport function usePickerQuery({ open, query, defaultQuery, onQuery, resetOnClose, triggerMode }: UsePickerQueryOptions) {\n\tconst previousOpenRef = useRef(false);\n\tconst isControlled = query !== undefined;\n\tconst [internalQuery, setInternalQuery] = useState(defaultQuery ?? \"\");\n\tconst currentQuery = isControlled ? (query ?? \"\") : internalQuery;\n\tconst syncResetInternalQuery = useEffectEvent(() => setInternalQuery(\"\"));\n\tconst resolvedResetOnClose = resetOnClose ?? (triggerMode ? createPickerTriggerPolicy(triggerMode).resetQueryOnClose : true);\n\n\tuseEffect(() => {\n\t\tif (previousOpenRef.current && !open && resolvedResetOnClose) {\n\t\t\tif (!isControlled) {\n\t\t\t\tsyncResetInternalQuery();\n\t\t\t}\n\n\t\t\tonQuery?.(\"\");\n\t\t}\n\n\t\tpreviousOpenRef.current = open;\n\t}, [isControlled, onQuery, open, resolvedResetOnClose]);\n\n\tconst setQuery = (nextValue: string) => {\n\t\tif (!isControlled) {\n\t\t\tsetInternalQuery(nextValue);\n\t\t}\n\n\t\tonQuery?.(nextValue);\n\t};\n\n\treturn {\n\t\tquery: currentQuery,\n\t\tsetQuery,\n\t\tclearQuery: () => setQuery(\"\")\n\t};\n}\n","import { useEffect, useEffectEvent, useRef, useState } from \"react\";\n\ninterface UsePickerSelectionLifecycleOptions<TValue> {\n\tvalue: TValue;\n\topen: boolean;\n\tonCommit: (value: TValue) => void;\n\tonOpen?: () => void;\n\tonClose?: (value: TValue) => void;\n\tisEqual: (left: TValue, right: TValue) => boolean;\n}\n\n/**\n * Общий жизненный цикл чернового выбора для picker-компонентов,\n * где изменения подтверждаются при закрытии popup.\n */\nexport function usePickerSelectionLifecycle<TValue>({\n\tvalue,\n\topen,\n\tonCommit,\n\tonOpen,\n\tonClose,\n\tisEqual\n}: UsePickerSelectionLifecycleOptions<TValue>) {\n\tconst previousOpenRef = useRef(false);\n\tconst [draftValue, setDraftValue] = useState(value);\n\tconst syncDraftValue = useEffectEvent((value: TValue) => setDraftValue(value));\n\n\tuseEffect(() => {\n\t\tif (!open) {\n\t\t\tsyncDraftValue(value);\n\t\t}\n\t}, [open, value]);\n\n\tuseEffect(() => {\n\t\tif (previousOpenRef.current && !open) {\n\t\t\tif (!isEqual(draftValue, value)) {\n\t\t\t\tonCommit(draftValue);\n\t\t\t}\n\n\t\t\tonClose?.(draftValue);\n\t\t}\n\n\t\tpreviousOpenRef.current = open;\n\t}, [draftValue, isEqual, onClose, onCommit, open, value]);\n\n\tconst prepareOpen = () => {\n\t\tsetDraftValue(value);\n\t\tonOpen?.();\n\t};\n\n\treturn {\n\t\tdraftValue,\n\t\tsetDraftValue,\n\t\tprepareOpen\n\t};\n}\n","import { MouseEvent, RefObject } from \"react\";\n\nimport { PickerTriggerMode, createPickerTriggerPolicy } from \"./createPickerTriggerPolicy\";\n\ninterface UsePickerTriggerControllerOptions {\n\tmode: PickerTriggerMode;\n\topen: boolean;\n\tcurrentQuery: string;\n\thasDisplayValue: boolean;\n\tinputRef: RefObject<HTMLInputElement | null>;\n\tsetQuery?: (value: string) => void;\n\topenList?: () => void;\n\tclose?: () => void;\n\ttoggleOpen?: () => void;\n\tonBeforeOpen?: () => void;\n}\n\ninterface HandleTriggerKeyDownOptions {\n\tevent: React.KeyboardEvent<HTMLElement>;\n\tonActivateWhenOpen?: () => void;\n\tenableSpaceActivation?: boolean;\n\tenableClosedArrowDownOpen?: boolean;\n\tsuppressClosedArrowUp?: boolean;\n}\n\nfunction focusInput(inputRef: RefObject<HTMLInputElement | null>) {\n\trequestAnimationFrame(() => {\n\t\tinputRef.current?.focus();\n\t});\n}\n\n/**\n * Единый контроллер пользовательских действий на trigger-input.\n * Держит поведение display/search-single/search-multi в одном месте.\n */\nexport function usePickerTriggerController({\n\tmode,\n\topen,\n\tcurrentQuery,\n\thasDisplayValue,\n\tinputRef,\n\tsetQuery,\n\topenList,\n\tclose,\n\ttoggleOpen,\n\tonBeforeOpen\n}: UsePickerTriggerControllerOptions) {\n\tconst policy = createPickerTriggerPolicy(mode);\n\n\tconst openTrigger = () => {\n\t\tonBeforeOpen?.();\n\n\t\tif (openList) {\n\t\t\topenList();\n\t\t\treturn;\n\t\t}\n\n\t\ttoggleOpen?.();\n\t};\n\n\tconst closeTrigger = () => {\n\t\tif (close) {\n\t\t\tclose();\n\t\t\treturn;\n\t\t}\n\n\t\ttoggleOpen?.();\n\t};\n\n\tconst toggleTrigger = () => {\n\t\tif (open) {\n\t\t\tcloseTrigger();\n\t\t} else {\n\t\t\topenTrigger();\n\t\t}\n\n\t\tif (policy.shouldFocusReferenceOnToggle(open)) {\n\t\t\tfocusInput(inputRef);\n\t\t}\n\t};\n\n\treturn {\n\t\tpolicy,\n\t\thandleTriggerInputChange: (nextValue: string) => {\n\t\t\tsetQuery?.(nextValue);\n\n\t\t\tif (policy.shouldOpenOnInputChange(open)) {\n\t\t\t\topenTrigger();\n\t\t\t}\n\t\t},\n\t\thandleTriggerClick: () => {\n\t\t\tif (policy.shouldOpenOnTriggerClick(open)) {\n\t\t\t\topenTrigger();\n\t\t\t}\n\t\t},\n\t\thandleTriggerFocus: (input: HTMLInputElement) => {\n\t\t\tif (\n\t\t\t\tpolicy.shouldSelectTriggerTextOnFocus({\n\t\t\t\t\topen,\n\t\t\t\t\tcurrentQuery,\n\t\t\t\t\thasDisplayValue\n\t\t\t\t})\n\t\t\t) {\n\t\t\t\trequestAnimationFrame(() => {\n\t\t\t\t\tinput.select();\n\t\t\t\t});\n\t\t\t}\n\t\t},\n\t\thandleToggleMouseDown: (event: MouseEvent<HTMLButtonElement>) => {\n\t\t\tevent.preventDefault();\n\t\t},\n\t\thandleToggleClick: () => {\n\t\t\ttoggleTrigger();\n\t\t},\n\t\thandleTriggerKeyDown: ({\n\t\t\tevent,\n\t\t\tonActivateWhenOpen,\n\t\t\tenableSpaceActivation = false,\n\t\t\tenableClosedArrowDownOpen = false,\n\t\t\tsuppressClosedArrowUp = false\n\t\t}: HandleTriggerKeyDownOptions) => {\n\t\t\tif (!open && suppressClosedArrowUp && event.key === \"ArrowUp\") {\n\t\t\t\tevent.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!open && enableClosedArrowDownOpen && event.key === \"ArrowDown\") {\n\t\t\t\tevent.preventDefault();\n\t\t\t\ttoggleTrigger();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (event.key === \"Enter\") {\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\tif (open) {\n\t\t\t\t\tonActivateWhenOpen?.();\n\t\t\t\t} else {\n\t\t\t\t\ttoggleTrigger();\n\t\t\t\t}\n\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (enableSpaceActivation && event.key === \" \") {\n\t\t\t\tevent.preventDefault();\n\n\t\t\t\tif (open) {\n\t\t\t\t\tonActivateWhenOpen?.();\n\t\t\t\t} else {\n\t\t\t\t\ttoggleTrigger();\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\ttoggleTrigger\n\t};\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"popover-C79P5bm2.js","names":[],"sources":["../../src/popover/components/Popover.module.scss","../../src/popover/components/PopoverContext.tsx","../../src/popover/components/PopoverContent.tsx","../../src/popover/components/PopoverTrigger.tsx","../../src/popover/components/Popover.tsx","../../src/popover/Popover.module.scss","../../src/popover/FloatingPopover.tsx","../../src/popover/FloatingTooltip.tsx"],"sourcesContent":[".popover {\n\tpadding: var(--space-sm);\n\t// background-image: radial-gradient(var(--surface-0) 50%, var(--surface-1) 100%);\n\n\tborder: var(--border-width) solid var(--border-1);\n\tborder-radius: var(--radius-sm);\n\tcolor: var(--content-0);\n\n\tfilter: drop-shadow(var(--shadow-md));\n\n\tz-index: var(--z-popover);\n\n\t&.primary {\n\t\tbackground-color: var(--surface-0);\n\t}\n\n\t&.secondary {\n\t\tbackground-color: var(--surface-1);\n\t}\n}\n","import React, { createContext, useContext } from \"react\";\n\nimport { Placement, useFloating } from \"@floating-ui/react\";\n\nimport { createMissingContextError } from \"@ryuzaki13/react-foundation-lib/error\";\n\ninterface PopoverContextValue {\n\topen: boolean;\n\tsetOpen: React.Dispatch<React.SetStateAction<boolean>>;\n\trefs: ReturnType<typeof useFloating>[\"refs\"];\n\tfloatingStyles: React.CSSProperties;\n\tplacement: Placement;\n\tmiddlewareData: ReturnType<typeof useFloating>[\"middlewareData\"];\n\tarrowRef: React.RefObject<HTMLDivElement | null>;\n}\n\nexport const PopoverContext = createContext<PopoverContextValue | null>(null);\n\nexport function usePopoverContext() {\n\tconst context = useContext(PopoverContext);\n\tif (!context) {\n\t\tthrow createMissingContextError({\n\t\t\thookName: \"usePopoverContext\",\n\t\t\tproviderName: \"Popover\"\n\t\t});\n\t}\n\treturn context;\n}\n","import React, { useCallback, useRef } from \"react\";\n\nimport { FloatingPortal } from \"@floating-ui/react\";\n\nimport { useClickOutside, useEscapeDismiss, useOverlayFocus } from \"@ryuzaki13/react-foundation-lib/dom\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { TooltipArrow } from \"../../floating-arrow\";\n\nimport styles from \"./Popover.module.scss\";\nimport { usePopoverContext } from \"./PopoverContext\";\n\nexport interface PopoverContentProps {\n\tchildren: React.ReactNode | ((ctx: { setClose: () => void }) => React.ReactNode);\n\tonClose?: () => void;\n\tcloseOnOutside?: boolean;\n\tcloseOnEscape?: boolean;\n\tdisableOutsideClick?: boolean;\n\tbackground?: \"primary\" | \"secondary\";\n}\n\n/**\n * Содержимое Popover, отображаемое в портале.\n */\nexport const PopoverContent: React.FC<PopoverContentProps> = ({\n\tchildren,\n\tonClose,\n\tcloseOnOutside = true,\n\tcloseOnEscape = true,\n\tdisableOutsideClick = false,\n\tbackground = \"secondary\"\n}) => {\n\tconst { open, setOpen, refs, floatingStyles, middlewareData, placement, arrowRef } = usePopoverContext();\n\tconst floatingElementRef = useRef<HTMLDivElement | null>(null);\n\tconst setFloating = useCallback(\n\t\t(node: HTMLDivElement | null) => {\n\t\t\tfloatingElementRef.current = node;\n\t\t\trefs.setFloating(node);\n\t\t},\n\t\t[refs]\n\t);\n\n\tconst floatingRef = useOverlayFocus<HTMLDivElement>({\n\t\tactive: open,\n\t\tinitialFocus: \"container\",\n\t\trestoreFocus: true,\n\t\tcontainerRef: floatingElementRef\n\t});\n\n\tconst setClose = useCallback(() => {\n\t\tif (!open) return;\n\t\tsetOpen(false);\n\t\tonClose?.();\n\t}, [setOpen, onClose, open]);\n\n\tuseEscapeDismiss({\n\t\tactive: open,\n\t\tenabled: closeOnEscape,\n\t\tonDismiss: setClose,\n\t\tcontainerRef: floatingRef as React.RefObject<HTMLElement | null>\n\t});\n\n\tconst outsideClose = useCallback(() => {\n\t\tif (!open || disableOutsideClick) return;\n\t\tif (closeOnOutside) setClose();\n\t}, [open, disableOutsideClick, closeOnOutside, setClose]);\n\n\tuseClickOutside([refs.floating as React.RefObject<HTMLElement>, refs.reference as React.RefObject<HTMLElement>], outsideClose);\n\n\tif (!open) return null;\n\n\treturn (\n\t\t<FloatingPortal>\n\t\t\t<div\n\t\t\t\tref={setFloating}\n\t\t\t\tstyle={floatingStyles}\n\t\t\t\tclassName={cn(styles.popover, styles[background])}\n\t\t\t\trole=\"dialog\"\n\t\t\t\taria-modal=\"true\"\n\t\t\t\ttabIndex={-1}>\n\t\t\t\t{typeof children === \"function\" ? children({ setClose }) : children}\n\t\t\t\t<TooltipArrow ref={arrowRef} placement={placement} middlewareData={middlewareData} />\n\t\t\t</div>\n\t\t</FloatingPortal>\n\t);\n};\n","import React, { cloneElement, useCallback } from \"react\";\n\nimport { usePopoverContext } from \"./PopoverContext\";\n\nexport interface PopoverTriggerProps {\n\tpassive?: true;\n\tchildren: React.ReactElement<React.HTMLAttributes<Element> & { ref?: React.Ref<Element> }>;\n}\n\nexport const PopoverTrigger: React.FC<PopoverTriggerProps> = ({ passive, children }) => {\n\tconst { open, setOpen, refs } = usePopoverContext();\n\n\tconst handleClick = useCallback(\n\t\t(e: React.MouseEvent) => {\n\t\t\tif (children.props.onClick) {\n\t\t\t\tchildren.props.onClick(e);\n\t\t\t}\n\t\t\tif (e.defaultPrevented) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\n\t\t\tif (passive) return;\n\n\t\t\tsetOpen((v) => !v);\n\t\t},\n\t\t[children, setOpen, passive]\n\t);\n\n\treturn cloneElement(children as React.JSX.Element, {\n\t\tref: refs.setReference,\n\t\t\"aria-expanded\": open,\n\t\tonClick: handleClick\n\t});\n};\n","/* eslint-disable react-refresh/only-export-components */\nimport React, { useCallback, useRef, useState } from \"react\";\n\nimport { arrow, autoUpdate, flip, offset, Placement, shift, useFloating } from \"@floating-ui/react\";\n\nimport { PopoverContent } from \"./PopoverContent\";\nimport { PopoverContext } from \"./PopoverContext\";\nimport { PopoverTrigger } from \"./PopoverTrigger\";\n\nexport interface PopoverProps {\n\tchildren: React.ReactNode;\n\tplacement?: Placement;\n\topen?: boolean;\n\tdefaultOpen?: boolean;\n\tonOpenChange?: (open: boolean) => void;\n}\n\n/**\n * Контролируемый Popover.\n * Используется в связке с Popover.Trigger и Popover.Content.\n */\nconst PopoverRoot: React.FC<PopoverProps> = ({ children, open: controlledOpen, defaultOpen, onOpenChange, placement = \"bottom\" }) => {\n\tconst [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen ?? false);\n\n\tconst isControlled = controlledOpen !== undefined;\n\tconst open = isControlled ? controlledOpen : uncontrolledOpen;\n\tconst setOpen = useCallback<React.Dispatch<React.SetStateAction<boolean>>>(\n\t\t(value) => {\n\t\t\tconst next = typeof value === \"function\" ? value(open) : value;\n\t\t\tif (!isControlled) setUncontrolledOpen(next);\n\t\t\tonOpenChange?.(next);\n\t\t},\n\t\t[isControlled, onOpenChange, open]\n\t);\n\n\tconst arrowRef = useRef<HTMLDivElement | null>(null);\n\n\tconst {\n\t\trefs,\n\t\tfloatingStyles,\n\t\tmiddlewareData,\n\t\tplacement: actualPlacement\n\t} = useFloating({\n\t\topen,\n\t\tonOpenChange: setOpen,\n\t\tplacement,\n\t\t// eslint-disable-next-line react-hooks/refs\n\t\tmiddleware: [offset(8), flip(), shift({ padding: 16 }), arrow({ element: arrowRef.current })],\n\t\twhileElementsMounted: autoUpdate\n\t});\n\n\treturn (\n\t\t<PopoverContext.Provider value={{ open, setOpen, refs, floatingStyles, placement: actualPlacement, middlewareData, arrowRef }}>\n\t\t\t{children}\n\t\t</PopoverContext.Provider>\n\t);\n};\n\n/**\n * Композиционное API:\n * <Popover>\n * <Popover.Trigger />\n * <Popover.Content />\n * </Popover>\n */\nexport const Popover = Object.assign(PopoverRoot, {\n\tTrigger: PopoverTrigger,\n\tContent: PopoverContent\n});\n",".tooltipPanel {\n\tpadding: var(--space-sm);\n\t// background-image: radial-gradient(var(--surface-0) 50%, var(--surface-1) 100%);\n\tbackground-color: var(--surface-1);\n\tborder: var(--border-width) solid var(--border-1);\n\tborder-radius: var(--radius-sm);\n\tcolor: var(--content-0);\n\n\tfilter: drop-shadow(var(--shadow-sm));\n\n\t&.negative {\n\t\t--border-1: var(--content-0);\n\n\t\tbackground-color: var(--content-0);\n\t\tborder-color: var(--border-1);\n\t\tcolor: var(--surface-1);\n\t}\n\n\t&.information {\n\t\t--border-1: var(--status-info-text);\n\n\t\tbackground-color: var(--status-info-text);\n\t\tborder-color: var(--status-info-text);\n\t\tcolor: var(--status-info-on-fill);\n\t}\n\n\t&.error {\n\t\t--border-1: var(--status-error-text);\n\n\t\tbackground-color: var(--status-error-text);\n\t\tborder-color: var(--status-error-text);\n\t\tcolor: var(--status-error-on-fill);\n\t}\n\n\t&.warning {\n\t\t--border-1: var(--status-warning-text);\n\n\t\tbackground-color: var(--status-warning-text);\n\t\tborder-color: var(--status-warning-text);\n\t\tcolor: var(--status-warning-on-fill);\n\t}\n\n\t&.success {\n\t\t--border-1: var(--status-success-text);\n\n\t\tbackground-color: var(--status-success-text);\n\t\tborder-color: var(--status-success-text);\n\t\tcolor: var(--status-success-on-fill);\n\t}\n}\n\n.tooltip {\n\tz-index: var(--z-tooltip);\n\tpointer-events: none;\n\n\ttext-align: initial;\n\tfont-size: var(--font-size-sm);\n\tfont-style: normal;\n\tfont-weight: 500;\n\tfont-variation-settings: \"wght\" 500;\n\tline-height: var(--line-height);\n\n\t@extend .tooltipPanel;\n}\n","/* eslint-disable react-hooks/refs */\nimport React, { useRef, useState } from \"react\";\n\nimport {\n\tarrow,\n\tautoUpdate,\n\tflip,\n\toffset,\n\tPlacement,\n\tshift,\n\tuseDismiss,\n\tuseFloating,\n\tuseHover,\n\tuseInteractions,\n\tuseRole\n} from \"@floating-ui/react\";\nimport { createPortal } from \"react-dom\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { FloatingArrow } from \"../floating-arrow/FloatingArrow\";\n\nimport styles from \"./Popover.module.scss\";\n\ninterface FloatingPopoverProps {\n\tcontent: React.ReactNode;\n\tchildren: React.ReactNode;\n\topenOnHover?: boolean;\n\tplacement?: Placement;\n\topenDelay?: number;\n\tcloseDelay?: number;\n\tmaxWidth?: number;\n\tstate?: \"information\" | \"error\" | \"warning\" | \"success\" | \"negative\";\n\ttooltip?: true;\n}\n\nexport const FloatingPopover: React.FC<FloatingPopoverProps> = ({\n\tcontent,\n\tchildren,\n\topenOnHover = true,\n\tplacement = \"bottom\",\n\topenDelay = 200,\n\tcloseDelay = 100,\n\tmaxWidth,\n\tstate,\n\ttooltip\n}) => {\n\tconst [open, setOpen] = useState(false);\n\tconst arrowRef = useRef<HTMLDivElement>(null);\n\n\tconst {\n\t\trefs,\n\t\tfloatingStyles,\n\t\tmiddlewareData,\n\t\tcontext,\n\t\tplacement: computedPlacement\n\t} = useFloating({\n\t\topen,\n\t\tonOpenChange: setOpen,\n\t\tplacement,\n\t\tmiddleware: [\n\t\t\toffset(8),\n\t\t\tflip({ fallbackAxisSideDirection: \"end\", fallbackPlacements: [\"top\", \"right\", \"bottom\"] }),\n\t\t\tshift({ padding: 16 }),\n\t\t\tarrow({ element: arrowRef, padding: 8 })\n\t\t],\n\t\twhileElementsMounted: autoUpdate\n\t});\n\n\tconst hover = useHover(context, {\n\t\tenabled: openOnHover,\n\t\tmove: false,\n\t\tdelay: {\n\t\t\topen: openDelay,\n\t\t\tclose: closeDelay\n\t\t}\n\t});\n\tconst dismiss = useDismiss(context);\n\tconst role = useRole(context);\n\n\tconst { getReferenceProps, getFloatingProps } = useInteractions([hover, dismiss, role]);\n\n\treturn (\n\t\t<>\n\t\t\t<span ref={refs.setReference} {...getReferenceProps()} style={{ lineHeight: 1 }}>\n\t\t\t\t{children}\n\t\t\t</span>\n\n\t\t\t{open &&\n\t\t\t\tcreatePortal(\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={refs.setFloating}\n\t\t\t\t\t\tstyle={{ ...floatingStyles, zIndex: \"var(--z-tooltip)\", maxWidth: maxWidth ? `${maxWidth}em` : undefined }}\n\t\t\t\t\t\t{...getFloatingProps()}\n\t\t\t\t\t\trole=\"tooltip\"\n\t\t\t\t\t\tclassName={cn(styles.tooltipPanel, tooltip && styles.tooltip, state && styles[state])}>\n\t\t\t\t\t\t{content}\n\n\t\t\t\t\t\t<FloatingArrow ref={arrowRef} placement={computedPlacement} middlewareData={middlewareData} />\n\t\t\t\t\t</div>,\n\t\t\t\t\tdocument.body\n\t\t\t\t)}\n\t\t</>\n\t);\n};\n","import React, { useEffect, useRef } from \"react\";\n\nimport { arrow, flip, offset, shift, useFloating } from \"@floating-ui/react\";\n\nimport { FloatingArrow } from \"../floating-arrow/FloatingArrow\";\n\nimport styles from \"./Popover.module.scss\";\n\nexport const FloatingTooltip: React.FC<{\n\tx: number;\n\ty: number;\n\tchildren: React.ReactNode;\n}> = ({ x, y, children }) => {\n\tconst arrowRef = useRef<HTMLDivElement | null>(null);\n\n\tconst {\n\t\trefs,\n\t\tfloatingStyles,\n\t\tmiddlewareData,\n\t\tplacement: computedPlacement\n\t} = useFloating({\n\t\tstrategy: \"absolute\",\n\t\tplacement: \"top\",\n\t\t// eslint-disable-next-line react-hooks/refs\n\t\tmiddleware: [offset(6), flip(), shift({ padding: 16 }), arrow({ element: arrowRef })]\n\t});\n\n\tuseEffect(() => {\n\t\tif (refs.setReference) {\n\t\t\trefs.setReference({\n\t\t\t\tgetBoundingClientRect: () =>\n\t\t\t\t\t({\n\t\t\t\t\t\tx,\n\t\t\t\t\t\ty,\n\t\t\t\t\t\twidth: 0,\n\t\t\t\t\t\theight: 0,\n\t\t\t\t\t\ttop: y,\n\t\t\t\t\t\tleft: x,\n\t\t\t\t\t\tbottom: y,\n\t\t\t\t\t\tright: x,\n\t\t\t\t\t\ttoJSON: () => {}\n\t\t\t\t\t}) as DOMRect\n\t\t\t});\n\t\t}\n\t}, [x, y, refs]);\n\n\treturn (\n\t\t<div ref={refs.setFloating} style={{ ...floatingStyles, position: \"absolute\", pointerEvents: \"none\" }} className={styles.tooltip}>\n\t\t\t{children}\n\n\t\t\t<FloatingArrow ref={arrowRef} placement={computedPlacement} middlewareData={middlewareData} />\n\t\t</div>\n\t);\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"popover-C79P5bm2.js","names":[],"sources":["../../src/popover/components/Popover.module.scss","../../src/popover/components/PopoverContext.tsx","../../src/popover/components/PopoverContent.tsx","../../src/popover/components/PopoverTrigger.tsx","../../src/popover/components/Popover.tsx","../../src/popover/Popover.module.scss","../../src/popover/FloatingPopover.tsx","../../src/popover/FloatingTooltip.tsx"],"sourcesContent":[".popover {\n\tpadding: var(--space-sm);\n\t// background-image: radial-gradient(var(--surface-0) 50%, var(--surface-1) 100%);\n\n\tborder: var(--border-width) solid var(--border-1);\n\tborder-radius: var(--radius-sm);\n\tcolor: var(--content-0);\n\n\tfilter: drop-shadow(var(--shadow-md));\n\n\tz-index: var(--z-popover);\n\n\t&.primary {\n\t\tbackground-color: var(--surface-0);\n\t}\n\n\t&.secondary {\n\t\tbackground-color: var(--surface-1);\n\t}\n}\n","import React, { createContext, useContext } from \"react\";\n\nimport { Placement, useFloating } from \"@floating-ui/react\";\nimport { createMissingContextError } from \"@ryuzaki13/react-foundation-lib/error\";\n\ninterface PopoverContextValue {\n\topen: boolean;\n\tsetOpen: React.Dispatch<React.SetStateAction<boolean>>;\n\trefs: ReturnType<typeof useFloating>[\"refs\"];\n\tfloatingStyles: React.CSSProperties;\n\tplacement: Placement;\n\tmiddlewareData: ReturnType<typeof useFloating>[\"middlewareData\"];\n\tarrowRef: React.RefObject<HTMLDivElement | null>;\n}\n\nexport const PopoverContext = createContext<PopoverContextValue | null>(null);\n\nexport function usePopoverContext() {\n\tconst context = useContext(PopoverContext);\n\tif (!context) {\n\t\tthrow createMissingContextError({\n\t\t\thookName: \"usePopoverContext\",\n\t\t\tproviderName: \"Popover\"\n\t\t});\n\t}\n\treturn context;\n}\n","import React, { useCallback, useRef } from \"react\";\n\nimport { FloatingPortal } from \"@floating-ui/react\";\nimport { useClickOutside, useEscapeDismiss, useOverlayFocus } from \"@ryuzaki13/react-foundation-lib/dom\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { TooltipArrow } from \"../../floating-arrow\";\n\nimport styles from \"./Popover.module.scss\";\nimport { usePopoverContext } from \"./PopoverContext\";\n\nexport interface PopoverContentProps {\n\tchildren: React.ReactNode | ((ctx: { setClose: () => void }) => React.ReactNode);\n\tonClose?: () => void;\n\tcloseOnOutside?: boolean;\n\tcloseOnEscape?: boolean;\n\tdisableOutsideClick?: boolean;\n\tbackground?: \"primary\" | \"secondary\";\n}\n\n/**\n * Содержимое Popover, отображаемое в портале.\n */\nexport const PopoverContent: React.FC<PopoverContentProps> = ({\n\tchildren,\n\tonClose,\n\tcloseOnOutside = true,\n\tcloseOnEscape = true,\n\tdisableOutsideClick = false,\n\tbackground = \"secondary\"\n}) => {\n\tconst { open, setOpen, refs, floatingStyles, middlewareData, placement, arrowRef } = usePopoverContext();\n\tconst floatingElementRef = useRef<HTMLDivElement | null>(null);\n\tconst setFloating = useCallback(\n\t\t(node: HTMLDivElement | null) => {\n\t\t\tfloatingElementRef.current = node;\n\t\t\trefs.setFloating(node);\n\t\t},\n\t\t[refs]\n\t);\n\n\tconst floatingRef = useOverlayFocus<HTMLDivElement>({\n\t\tactive: open,\n\t\tinitialFocus: \"container\",\n\t\trestoreFocus: true,\n\t\tcontainerRef: floatingElementRef\n\t});\n\n\tconst setClose = useCallback(() => {\n\t\tif (!open) return;\n\t\tsetOpen(false);\n\t\tonClose?.();\n\t}, [setOpen, onClose, open]);\n\n\tuseEscapeDismiss({\n\t\tactive: open,\n\t\tenabled: closeOnEscape,\n\t\tonDismiss: setClose,\n\t\tcontainerRef: floatingRef as React.RefObject<HTMLElement | null>\n\t});\n\n\tconst outsideClose = useCallback(() => {\n\t\tif (!open || disableOutsideClick) return;\n\t\tif (closeOnOutside) setClose();\n\t}, [open, disableOutsideClick, closeOnOutside, setClose]);\n\n\tuseClickOutside([refs.floating as React.RefObject<HTMLElement>, refs.reference as React.RefObject<HTMLElement>], outsideClose);\n\n\tif (!open) return null;\n\n\treturn (\n\t\t<FloatingPortal>\n\t\t\t<div\n\t\t\t\tref={setFloating}\n\t\t\t\tstyle={floatingStyles}\n\t\t\t\tclassName={cn(styles.popover, styles[background])}\n\t\t\t\trole=\"dialog\"\n\t\t\t\taria-modal=\"true\"\n\t\t\t\ttabIndex={-1}>\n\t\t\t\t{typeof children === \"function\" ? children({ setClose }) : children}\n\t\t\t\t<TooltipArrow ref={arrowRef} placement={placement} middlewareData={middlewareData} />\n\t\t\t</div>\n\t\t</FloatingPortal>\n\t);\n};\n","import React, { cloneElement, useCallback } from \"react\";\n\nimport { usePopoverContext } from \"./PopoverContext\";\n\nexport interface PopoverTriggerProps {\n\tpassive?: true;\n\tchildren: React.ReactElement<React.HTMLAttributes<Element> & { ref?: React.Ref<Element> }>;\n}\n\nexport const PopoverTrigger: React.FC<PopoverTriggerProps> = ({ passive, children }) => {\n\tconst { open, setOpen, refs } = usePopoverContext();\n\n\tconst handleClick = useCallback(\n\t\t(e: React.MouseEvent) => {\n\t\t\tif (children.props.onClick) {\n\t\t\t\tchildren.props.onClick(e);\n\t\t\t}\n\t\t\tif (e.defaultPrevented) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\te.preventDefault();\n\t\t\te.stopPropagation();\n\n\t\t\tif (passive) return;\n\n\t\t\tsetOpen((v) => !v);\n\t\t},\n\t\t[children, setOpen, passive]\n\t);\n\n\treturn cloneElement(children as React.JSX.Element, {\n\t\tref: refs.setReference,\n\t\t\"aria-expanded\": open,\n\t\tonClick: handleClick\n\t});\n};\n","/* eslint-disable react-refresh/only-export-components */\nimport React, { useCallback, useRef, useState } from \"react\";\n\nimport { arrow, autoUpdate, flip, offset, Placement, shift, useFloating } from \"@floating-ui/react\";\n\nimport { PopoverContent } from \"./PopoverContent\";\nimport { PopoverContext } from \"./PopoverContext\";\nimport { PopoverTrigger } from \"./PopoverTrigger\";\n\nexport interface PopoverProps {\n\tchildren: React.ReactNode;\n\tplacement?: Placement;\n\topen?: boolean;\n\tdefaultOpen?: boolean;\n\tonOpenChange?: (open: boolean) => void;\n}\n\n/**\n * Контролируемый Popover.\n * Используется в связке с Popover.Trigger и Popover.Content.\n */\nconst PopoverRoot: React.FC<PopoverProps> = ({ children, open: controlledOpen, defaultOpen, onOpenChange, placement = \"bottom\" }) => {\n\tconst [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen ?? false);\n\n\tconst isControlled = controlledOpen !== undefined;\n\tconst open = isControlled ? controlledOpen : uncontrolledOpen;\n\tconst setOpen = useCallback<React.Dispatch<React.SetStateAction<boolean>>>(\n\t\t(value) => {\n\t\t\tconst next = typeof value === \"function\" ? value(open) : value;\n\t\t\tif (!isControlled) setUncontrolledOpen(next);\n\t\t\tonOpenChange?.(next);\n\t\t},\n\t\t[isControlled, onOpenChange, open]\n\t);\n\n\tconst arrowRef = useRef<HTMLDivElement | null>(null);\n\n\tconst {\n\t\trefs,\n\t\tfloatingStyles,\n\t\tmiddlewareData,\n\t\tplacement: actualPlacement\n\t} = useFloating({\n\t\topen,\n\t\tonOpenChange: setOpen,\n\t\tplacement,\n\t\t// eslint-disable-next-line react-hooks/refs\n\t\tmiddleware: [offset(8), flip(), shift({ padding: 16 }), arrow({ element: arrowRef.current })],\n\t\twhileElementsMounted: autoUpdate\n\t});\n\n\treturn (\n\t\t<PopoverContext.Provider value={{ open, setOpen, refs, floatingStyles, placement: actualPlacement, middlewareData, arrowRef }}>\n\t\t\t{children}\n\t\t</PopoverContext.Provider>\n\t);\n};\n\n/**\n * Композиционное API:\n * <Popover>\n * <Popover.Trigger />\n * <Popover.Content />\n * </Popover>\n */\nexport const Popover = Object.assign(PopoverRoot, {\n\tTrigger: PopoverTrigger,\n\tContent: PopoverContent\n});\n",".tooltipPanel {\n\tpadding: var(--space-sm);\n\t// background-image: radial-gradient(var(--surface-0) 50%, var(--surface-1) 100%);\n\tbackground-color: var(--surface-1);\n\tborder: var(--border-width) solid var(--border-1);\n\tborder-radius: var(--radius-sm);\n\tcolor: var(--content-0);\n\n\tfilter: drop-shadow(var(--shadow-sm));\n\n\t&.negative {\n\t\t--border-1: var(--content-0);\n\n\t\tbackground-color: var(--content-0);\n\t\tborder-color: var(--border-1);\n\t\tcolor: var(--surface-1);\n\t}\n\n\t&.information {\n\t\t--border-1: var(--status-info-text);\n\n\t\tbackground-color: var(--status-info-text);\n\t\tborder-color: var(--status-info-text);\n\t\tcolor: var(--status-info-on-fill);\n\t}\n\n\t&.error {\n\t\t--border-1: var(--status-error-text);\n\n\t\tbackground-color: var(--status-error-text);\n\t\tborder-color: var(--status-error-text);\n\t\tcolor: var(--status-error-on-fill);\n\t}\n\n\t&.warning {\n\t\t--border-1: var(--status-warning-text);\n\n\t\tbackground-color: var(--status-warning-text);\n\t\tborder-color: var(--status-warning-text);\n\t\tcolor: var(--status-warning-on-fill);\n\t}\n\n\t&.success {\n\t\t--border-1: var(--status-success-text);\n\n\t\tbackground-color: var(--status-success-text);\n\t\tborder-color: var(--status-success-text);\n\t\tcolor: var(--status-success-on-fill);\n\t}\n}\n\n.tooltip {\n\tz-index: var(--z-tooltip);\n\tpointer-events: none;\n\n\ttext-align: initial;\n\tfont-size: var(--font-size-sm);\n\tfont-style: normal;\n\tfont-weight: 500;\n\tfont-variation-settings: \"wght\" 500;\n\tline-height: var(--line-height);\n\n\t@extend .tooltipPanel;\n}\n","/* eslint-disable react-hooks/refs */\nimport React, { useRef, useState } from \"react\";\n\nimport {\n\tarrow,\n\tautoUpdate,\n\tflip,\n\toffset,\n\tPlacement,\n\tshift,\n\tuseDismiss,\n\tuseFloating,\n\tuseHover,\n\tuseInteractions,\n\tuseRole\n} from \"@floating-ui/react\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { createPortal } from \"react-dom\";\n\nimport { FloatingArrow } from \"../floating-arrow/FloatingArrow\";\n\nimport styles from \"./Popover.module.scss\";\n\ninterface FloatingPopoverProps {\n\tcontent: React.ReactNode;\n\tchildren: React.ReactNode;\n\topenOnHover?: boolean;\n\tplacement?: Placement;\n\topenDelay?: number;\n\tcloseDelay?: number;\n\tmaxWidth?: number;\n\tstate?: \"information\" | \"error\" | \"warning\" | \"success\" | \"negative\";\n\ttooltip?: true;\n}\n\nexport const FloatingPopover: React.FC<FloatingPopoverProps> = ({\n\tcontent,\n\tchildren,\n\topenOnHover = true,\n\tplacement = \"bottom\",\n\topenDelay = 200,\n\tcloseDelay = 100,\n\tmaxWidth,\n\tstate,\n\ttooltip\n}) => {\n\tconst [open, setOpen] = useState(false);\n\tconst arrowRef = useRef<HTMLDivElement>(null);\n\n\tconst {\n\t\trefs,\n\t\tfloatingStyles,\n\t\tmiddlewareData,\n\t\tcontext,\n\t\tplacement: computedPlacement\n\t} = useFloating({\n\t\topen,\n\t\tonOpenChange: setOpen,\n\t\tplacement,\n\t\tmiddleware: [\n\t\t\toffset(8),\n\t\t\tflip({ fallbackAxisSideDirection: \"end\", fallbackPlacements: [\"top\", \"right\", \"bottom\"] }),\n\t\t\tshift({ padding: 16 }),\n\t\t\tarrow({ element: arrowRef, padding: 8 })\n\t\t],\n\t\twhileElementsMounted: autoUpdate\n\t});\n\n\tconst hover = useHover(context, {\n\t\tenabled: openOnHover,\n\t\tmove: false,\n\t\tdelay: {\n\t\t\topen: openDelay,\n\t\t\tclose: closeDelay\n\t\t}\n\t});\n\tconst dismiss = useDismiss(context);\n\tconst role = useRole(context);\n\n\tconst { getReferenceProps, getFloatingProps } = useInteractions([hover, dismiss, role]);\n\n\treturn (\n\t\t<>\n\t\t\t<span ref={refs.setReference} {...getReferenceProps()} style={{ lineHeight: 1 }}>\n\t\t\t\t{children}\n\t\t\t</span>\n\n\t\t\t{open &&\n\t\t\t\tcreatePortal(\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={refs.setFloating}\n\t\t\t\t\t\tstyle={{ ...floatingStyles, zIndex: \"var(--z-tooltip)\", maxWidth: maxWidth ? `${maxWidth}em` : undefined }}\n\t\t\t\t\t\t{...getFloatingProps()}\n\t\t\t\t\t\trole=\"tooltip\"\n\t\t\t\t\t\tclassName={cn(styles.tooltipPanel, tooltip && styles.tooltip, state && styles[state])}>\n\t\t\t\t\t\t{content}\n\n\t\t\t\t\t\t<FloatingArrow ref={arrowRef} placement={computedPlacement} middlewareData={middlewareData} />\n\t\t\t\t\t</div>,\n\t\t\t\t\tdocument.body\n\t\t\t\t)}\n\t\t</>\n\t);\n};\n","import React, { useEffect, useRef } from \"react\";\n\nimport { arrow, flip, offset, shift, useFloating } from \"@floating-ui/react\";\n\nimport { FloatingArrow } from \"../floating-arrow/FloatingArrow\";\n\nimport styles from \"./Popover.module.scss\";\n\nexport const FloatingTooltip: React.FC<{\n\tx: number;\n\ty: number;\n\tchildren: React.ReactNode;\n}> = ({ x, y, children }) => {\n\tconst arrowRef = useRef<HTMLDivElement | null>(null);\n\n\tconst {\n\t\trefs,\n\t\tfloatingStyles,\n\t\tmiddlewareData,\n\t\tplacement: computedPlacement\n\t} = useFloating({\n\t\tstrategy: \"absolute\",\n\t\tplacement: \"top\",\n\t\t// eslint-disable-next-line react-hooks/refs\n\t\tmiddleware: [offset(6), flip(), shift({ padding: 16 }), arrow({ element: arrowRef })]\n\t});\n\n\tuseEffect(() => {\n\t\tif (refs.setReference) {\n\t\t\trefs.setReference({\n\t\t\t\tgetBoundingClientRect: () =>\n\t\t\t\t\t({\n\t\t\t\t\t\tx,\n\t\t\t\t\t\ty,\n\t\t\t\t\t\twidth: 0,\n\t\t\t\t\t\theight: 0,\n\t\t\t\t\t\ttop: y,\n\t\t\t\t\t\tleft: x,\n\t\t\t\t\t\tbottom: y,\n\t\t\t\t\t\tright: x,\n\t\t\t\t\t\ttoJSON: () => {}\n\t\t\t\t\t}) as DOMRect\n\t\t\t});\n\t\t}\n\t}, [x, y, refs]);\n\n\treturn (\n\t\t<div ref={refs.setFloating} style={{ ...floatingStyles, position: \"absolute\", pointerEvents: \"none\" }} className={styles.tooltip}>\n\t\t\t{children}\n\n\t\t\t<FloatingArrow ref={arrowRef} placement={computedPlacement} middlewareData={middlewareData} />\n\t\t</div>\n\t);\n};\n"],"mappings":";;;;;;;;;;;;GCea,IAAiB,EAA0C,IAAI;AAE5E,SAAgB,IAAoB;CACnC,IAAM,IAAU,EAAW,CAAc;CACzC,IAAI,CAAC,GACJ,MAAM,EAA0B;EAC/B,UAAU;EACV,cAAc;CACf,CAAC;CAEF,OAAO;AACR;;;ACHA,IAAa,KAAiD,EAC7D,aACA,YACA,oBAAiB,IACjB,mBAAgB,IAChB,yBAAsB,IACtB,gBAAa,kBACR;CACL,IAAM,EAAE,SAAM,YAAS,SAAM,mBAAgB,mBAAgB,cAAW,gBAAa,EAAkB,GACjG,IAAqB,EAA8B,IAAI,GACvD,IAAc,GAClB,MAAgC;EAEhC,AADA,EAAmB,UAAU,GAC7B,EAAK,YAAY,CAAI;CACtB,GACA,CAAC,CAAI,CACN,GAEM,IAAc,EAAgC;EACnD,QAAQ;EACR,cAAc;EACd,cAAc;EACd,cAAc;CACf,CAAC,GAEK,IAAW,QAAkB;EAC7B,MACL,EAAQ,EAAK,GACb,IAAU;CACX,GAAG;EAAC;EAAS;EAAS;CAAI,CAAC;CAE3B,EAAiB;EAChB,QAAQ;EACR,SAAS;EACT,WAAW;EACX,cAAc;CACf,CAAC;CAED,IAAM,IAAe,QAAkB;EAClC,CAAC,KAAQ,KACT,KAAgB,EAAS;CAC9B,GAAG;EAAC;EAAM;EAAqB;EAAgB;CAAQ,CAAC;CAMxD,OAJA,EAAgB,CAAC,EAAK,UAA0C,EAAK,SAAyC,GAAG,CAAY,GAExH,IAGJ,kBAAC,GAAD,EAAA,UACC,kBAAC,OAAD;EACC,KAAK;EACL,OAAO;EACP,WAAW,EAAG,EAAO,SAAS,EAAO,EAAW;EAChD,MAAK;EACL,cAAW;EACX,UAAU;YANX,CAOE,OAAO,KAAa,aAAa,EAAS,EAAE,YAAS,CAAC,IAAI,GAC3D,kBAAC,GAAD;GAAc,KAAK;GAAqB;GAA2B;EAAiB,CAAA,CAChF;IACU,CAAA,IAdC;AAgBnB,GC3Ea,KAAiD,EAAE,YAAS,kBAAe;CACvF,IAAM,EAAE,SAAM,YAAS,YAAS,EAAkB,GAE5C,IAAc,GAClB,MAAwB;EACxB,AAAI,EAAS,MAAM,WAClB,EAAS,MAAM,QAAQ,CAAC,GAErB,GAAE,qBAGN,EAAE,eAAe,GACjB,EAAE,gBAAgB,GAEd,MAEJ,GAAS,MAAM,CAAC,CAAC;CAClB,GACA;EAAC;EAAU;EAAS;CAAO,CAC5B;CAEA,OAAO,EAAa,GAA+B;EAClD,KAAK,EAAK;EACV,iBAAiB;EACjB,SAAS;CACV,CAAC;AACF,GC8Ba,IAAU,OAAO,QA5Ce,EAAE,aAAU,MAAM,GAAgB,gBAAa,iBAAc,eAAY,eAAe;CACpI,IAAM,CAAC,GAAkB,KAAuB,EAAS,KAAe,EAAK,GAEvE,IAAe,MAAmB,KAAA,GAClC,IAAO,IAAe,IAAiB,GACvC,IAAU,GACd,MAAU;EACV,IAAM,IAAO,OAAO,KAAU,aAAa,EAAM,CAAI,IAAI;EAEzD,AADK,KAAc,EAAoB,CAAI,GAC3C,IAAe,CAAI;CACpB,GACA;EAAC;EAAc;EAAc;CAAI,CAClC,GAEM,IAAW,EAA8B,IAAI,GAE7C,EACL,SACA,mBACA,mBACA,WAAW,MACR,EAAY;EACf;EACA,cAAc;EACd;EAEA,YAAY;GAAC,EAAO,CAAC;GAAG,EAAK;GAAG,EAAM,EAAE,SAAS,GAAG,CAAC;GAAG,EAAM,EAAE,SAAS,EAAS,QAAQ,CAAC;EAAC;EAC5F,sBAAsB;CACvB,CAAC;CAED,OACC,kBAAC,EAAe,UAAhB;EAAyB,OAAO;GAAE;GAAM;GAAS;GAAM;GAAgB,WAAW;GAAiB;GAAgB;EAAS;EAC1H;CACuB,CAAA;AAE3B,GASkD;CACjD,SAAS;CACT,SAAS;AACV,CAAC;;;;;;;;GEjCY,KAAmD,EAC/D,YACA,aACA,iBAAc,IACd,eAAY,UACZ,eAAY,KACZ,gBAAa,KACb,aACA,UACA,iBACK;CACL,IAAM,CAAC,GAAM,KAAW,EAAS,EAAK,GAChC,IAAW,EAAuB,IAAI,GAEtC,EACL,SACA,mBACA,mBACA,YACA,WAAW,MACR,EAAY;EACf;EACA,cAAc;EACd;EACA,YAAY;GACX,EAAO,CAAC;GACR,EAAK;IAAE,2BAA2B;IAAO,oBAAoB;KAAC;KAAO;KAAS;IAAQ;GAAE,CAAC;GACzF,EAAM,EAAE,SAAS,GAAG,CAAC;GACrB,EAAM;IAAE,SAAS;IAAU,SAAS;GAAE,CAAC;EACxC;EACA,sBAAsB;CACvB,CAAC,GAaK,EAAE,sBAAmB,wBAAqB,EAAgB;EAXlD,EAAS,GAAS;GAC/B,SAAS;GACT,MAAM;GACN,OAAO;IACN,MAAM;IACN,OAAO;GACR;EACD,CAIiE;EAHjD,EAAW,CAG6C;EAF3D,EAAQ,CAE4D;CAAI,CAAC;CAEtF,OACC,kBAAA,GAAA,EAAA,UAAA,CACC,kBAAC,QAAD;EAAM,KAAK,EAAK;EAAc,GAAI,EAAkB;EAAG,OAAO,EAAE,YAAY,EAAE;EAC5E;CACI,CAAA,GAEL,KACA,EACC,kBAAC,OAAD;EACC,KAAK,EAAK;EACV,OAAO;GAAE,GAAG;GAAgB,QAAQ;GAAoB,UAAU,IAAW,GAAG,EAAS,MAAM,KAAA;EAAU;EACzG,GAAI,EAAiB;EACrB,MAAK;EACL,WAAW,EAAG,EAAO,cAAc,KAAW,EAAO,SAAS,KAAS,EAAO,EAAM;YALrF,CAME,GAED,kBAAC,GAAD;GAAe,KAAK;GAAU,WAAW;GAAmC;EAAiB,CAAA,CACzF;KACL,SAAS,IACV,CACA,EAAA,CAAA;AAEJ,GC/Fa,KAIP,EAAE,MAAG,MAAG,kBAAe;CAC5B,IAAM,IAAW,EAA8B,IAAI,GAE7C,EACL,SACA,mBACA,mBACA,WAAW,MACR,EAAY;EACf,UAAU;EACV,WAAW;EAEX,YAAY;GAAC,EAAO,CAAC;GAAG,EAAK;GAAG,EAAM,EAAE,SAAS,GAAG,CAAC;GAAG,EAAM,EAAE,SAAS,EAAS,CAAC;EAAC;CACrF,CAAC;CAqBD,OAnBA,QAAgB;EACf,AAAI,EAAK,gBACR,EAAK,aAAa,EACjB,8BACE;GACA;GACA;GACA,OAAO;GACP,QAAQ;GACR,KAAK;GACL,MAAM;GACN,QAAQ;GACR,OAAO;GACP,cAAc,CAAC;EAChB,GACF,CAAC;CAEH,GAAG;EAAC;EAAG;EAAG;CAAI,CAAC,GAGd,kBAAC,OAAD;EAAK,KAAK,EAAK;EAAa,OAAO;GAAE,GAAG;GAAgB,UAAU;GAAY,eAAe;EAAO;EAAG,WAAW,EAAO;YAAzH,CACE,GAED,kBAAC,GAAD;GAAe,KAAK;GAAU,WAAW;GAAmC;EAAiB,CAAA,CACzF;;AAEP"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { n as e, r as t } from "./popover-C79P5bm2.js";
|
|
2
2
|
import { t as n } from "./ui.module-BisoTevy.js";
|
|
3
|
-
import { a as r, c as i, o as a, r as o } from "./Input-
|
|
4
|
-
import { l as s } from "./picker-
|
|
3
|
+
import { a as r, c as i, o as a, r as o } from "./Input-Wrew1puH.js";
|
|
4
|
+
import { l as s } from "./picker-gIUs0nE_.js";
|
|
5
5
|
import { cn as c } from "@ryuzaki13/react-foundation-lib/utils";
|
|
6
6
|
import { Fragment as l, jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
7
7
|
import { useCallback as f, useEffect as p, useEffectEvent as ee, useMemo as m, useRef as h, useState as g } from "react";
|
|
@@ -692,4 +692,4 @@ function ue(e, t) {
|
|
|
692
692
|
//#endregion
|
|
693
693
|
export { q as i, le as n, K as r, ce as t };
|
|
694
694
|
|
|
695
|
-
//# sourceMappingURL=slider-
|
|
695
|
+
//# sourceMappingURL=slider-CigVo4Ju.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slider-CigVo4Ju.js","names":[],"sources":["../../src/slider/lib/sliderMath.ts","../../src/slider/Slider.module.scss","../../src/slider/Slider.tsx","../../src/slider/SliderInput.tsx"],"sourcesContent":["import {\n\tfindClosestNumberScaleMark,\n\tfindClosestNumberScaleMarkByPercent,\n\tgetNumberScaleMarkPercent,\n\tprepareNumberScaleMarks,\n\tresolveNumberScaleBounds,\n\tsnapNumberScaleValue,\n\tsnapNumberScaleValueToStep,\n\tvalueToNumberScalePercent\n} from \"@ryuzaki13/react-foundation-lib/number-scale\";\nimport { resolveRangeOutputValue } from \"@ryuzaki13/react-foundation-lib/range-output\";\n\nimport { SliderFillRange, SliderMark, SliderMathOptions, SliderRangeMark, SliderRangeOutputValueFallback, SliderRangeValue } from \"./types\";\n\nexport function prepareSliderMarks<TMark extends SliderMark>(marks: readonly TMark[] | undefined, min: number, max: number): TMark[] {\n\treturn prepareNumberScaleMarks(marks, min, max);\n}\n\nexport function getSliderMarkPercent<TMark extends SliderMark>(mark: TMark, marks: readonly TMark[], options: SliderMathOptions<TMark>) {\n\tconst markIndex = marks.findIndex((item) => item.value === mark.value);\n\treturn getNumberScaleMarkPercent(Math.max(0, markIndex), marks, options.min, options.max, options.marksPosition);\n}\n\n/**\n * Возвращает визуальную позицию значения: по шкале min/max или по позиции ближайшей mark.\n */\nexport function valueToSliderVisualPercent<TMark extends SliderMark>(value: number, options: SliderMathOptions<TMark>) {\n\tconst { min, max } = resolveNumberScaleBounds(options.min, options.max);\n\tconst marks = prepareSliderMarks(options.marks, min, max);\n\n\tif (marks.length > 0) {\n\t\tconst exactMark = marks.find((mark) => mark.value === value);\n\t\tconst mark = exactMark ?? findClosestNumberScaleMark(value, marks);\n\n\t\tif (mark) {\n\t\t\treturn getSliderMarkPercent(mark, marks, { ...options, min, max, marks });\n\t\t}\n\t}\n\n\treturn valueToNumberScalePercent(value, min, max);\n}\n\n/**\n * Возвращает mark, который визуально ближе всего к pointer percent.\n */\nexport function getClosestSliderMarkByPercent<TMark extends SliderMark>(percent: number, options: SliderMathOptions<TMark>) {\n\tconst { min, max } = resolveNumberScaleBounds(options.min, options.max);\n\tconst marks = prepareSliderMarks(options.marks, min, max);\n\n\treturn findClosestNumberScaleMarkByPercent(percent, marks, min, max, options.marksPosition);\n}\n\nexport function snapSliderValue<TMark extends SliderMark>(value: number, options: SliderMathOptions<TMark>) {\n\treturn snapNumberScaleValue(value, options);\n}\n\nexport function normalizeSingleSliderValue(value: number | undefined, options: SliderMathOptions) {\n\tconst { min, max } = resolveNumberScaleBounds(options.min, options.max);\n\n\tif (value === undefined) {\n\t\treturn min;\n\t}\n\n\treturn snapSliderValue(value, { ...options, min, max });\n}\n\n/**\n * Возвращает публичное значение mark: `outputValue`, если оно задано, иначе координату `value`.\n */\nexport function getRangeMarkOutputValue(mark: SliderRangeMark | undefined): number | null | undefined {\n\tif (!mark) {\n\t\treturn undefined;\n\t}\n\n\tif (!Object.hasOwn(mark, \"outputValue\") || mark.outputValue === undefined) {\n\t\treturn mark.value;\n\t}\n\n\treturn mark.outputValue;\n}\n\n/**\n * Готовит range-значение к внешней сериализации, заменяя открытые границы на заданные подстановки.\n *\n * Функция не участвует во внутренней логике слайдера: `SliderRange` и `SliderRangeInput`\n * продолжают отдавать `null` через `onChange`, а потребитель явно применяет подстановку\n * рядом со своим обработчиком сохранения/отправки.\n */\nexport function resolveSliderRangeOutputValue(\n\tvalue: SliderRangeValue,\n\tfallback: SliderRangeOutputValueFallback | undefined\n): SliderRangeValue {\n\treturn resolveRangeOutputValue(value, fallback);\n}\n\nfunction findRangeMarkByOutputValue(\n\tvalue: number | null,\n\tmarks: readonly SliderRangeMark[],\n\tthumbIndex: number\n): SliderRangeMark | undefined {\n\tconst matchingMarks = marks.filter((mark) => getRangeMarkOutputValue(mark) === value);\n\n\tif (!matchingMarks.length) {\n\t\treturn undefined;\n\t}\n\n\tif (value === null) {\n\t\treturn thumbIndex === 0 ? matchingMarks[0] : matchingMarks[matchingMarks.length - 1];\n\t}\n\n\treturn matchingMarks[0];\n}\n\n/**\n * Ищет ближайшую mark по публичному output-значению, а не по координате шкалы.\n */\nfunction findClosestRangeMarkByOutputValue(\n\tvalue: number,\n\tmarks: readonly SliderRangeMark[],\n\tthumbIndex: number\n): SliderRangeMark | undefined {\n\tconst exactMark = findRangeMarkByOutputValue(value, marks, thumbIndex);\n\tif (exactMark) {\n\t\treturn exactMark;\n\t}\n\n\tlet nearestMark: SliderRangeMark | undefined;\n\tlet nearestDistance = Number.POSITIVE_INFINITY;\n\n\tfor (const mark of marks) {\n\t\tconst outputValue = getRangeMarkOutputValue(mark);\n\t\tif (typeof outputValue !== \"number\" || !Number.isFinite(outputValue)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst distance = Math.abs(value - outputValue);\n\t\tif (distance < nearestDistance) {\n\t\t\tnearestMark = mark;\n\t\t\tnearestDistance = distance;\n\t\t}\n\t}\n\n\treturn nearestMark;\n}\n\nfunction normalizeRangeEndpoint(\n\tvalue: number | null,\n\tfallbackVisualValue: number,\n\tthumbIndex: number,\n\toptions: SliderMathOptions<SliderRangeMark>\n) {\n\tif (value === null) {\n\t\treturn null;\n\t}\n\n\tconst { min, max } = resolveNumberScaleBounds(options.min, options.max);\n\tconst marks = prepareSliderMarks(options.marks, min, max);\n\tconst publicValue = Number.isFinite(value) ? value : fallbackVisualValue;\n\n\tif (marks.length > 0) {\n\t\tconst snappedMark = findClosestRangeMarkByOutputValue(publicValue, marks, thumbIndex);\n\t\tconst outputValue = getRangeMarkOutputValue(snappedMark);\n\n\t\treturn outputValue !== undefined ? outputValue : (snappedMark?.value ?? fallbackVisualValue);\n\t}\n\n\treturn snapNumberScaleValueToStep(publicValue, min, max, options.step);\n}\n\n/**\n * Нормализует публичное range-значение, сохраняя null как открытую границу.\n */\nexport function normalizeRangeSliderValue(\n\tvalue: SliderRangeValue | undefined,\n\toptions: SliderMathOptions<SliderRangeMark>\n): SliderRangeValue {\n\tconst { min, max } = resolveNumberScaleBounds(options.min, options.max);\n\n\tif (!value) {\n\t\treturn [null, null];\n\t}\n\n\tconst start = normalizeRangeEndpoint(value[0], min, 0, { ...options, min, max });\n\tconst end = normalizeRangeEndpoint(value[1], max, 1, { ...options, min, max });\n\n\tif (start !== null && end !== null && start > end) {\n\t\treturn [end, start];\n\t}\n\n\treturn [start, end];\n}\n\nfunction getRangeEndpointVisualValue(\n\tvalue: number | null,\n\tfallbackVisualValue: number,\n\tthumbIndex: number,\n\toptions: SliderMathOptions<SliderRangeMark>\n) {\n\tif (value === null) {\n\t\treturn fallbackVisualValue;\n\t}\n\n\tconst { min, max } = resolveNumberScaleBounds(options.min, options.max);\n\tconst marks = prepareSliderMarks(options.marks, min, max);\n\n\tif (marks.length > 0) {\n\t\tconst exactOutputMark = findRangeMarkByOutputValue(value, marks, thumbIndex);\n\t\tconst outputMark =\n\t\t\texactOutputMark ?? (typeof value === \"number\" ? findClosestRangeMarkByOutputValue(value, marks, thumbIndex) : undefined);\n\n\t\treturn outputMark?.value ?? fallbackVisualValue;\n\t}\n\n\treturn snapNumberScaleValueToStep(value, min, max, options.step);\n}\n\n/**\n * Переводит публичный range tuple в finite-позиции thumb, где null стоит на краю шкалы.\n */\nexport function getRangeSliderVisualValue(\n\tvalue: SliderRangeValue | undefined,\n\toptions: SliderMathOptions<SliderRangeMark>\n): [number, number] {\n\tconst { min, max } = resolveNumberScaleBounds(options.min, options.max);\n\tconst normalized = normalizeRangeSliderValue(value, { ...options, min, max });\n\tconst start = getRangeEndpointVisualValue(normalized[0], min, 0, { ...options, min, max });\n\tconst end = getRangeEndpointVisualValue(normalized[1], max, 1, { ...options, min, max });\n\n\treturn start <= end ? [start, end] : [end, start];\n}\n\n/**\n * Преобразует координату шкалы, выбранную pointer/keyboard, в публичное range-значение.\n */\nexport function visualValueToRangeEndpoint(value: number, options: SliderMathOptions<SliderRangeMark>) {\n\tconst { min, max } = resolveNumberScaleBounds(options.min, options.max);\n\tconst marks = prepareSliderMarks(options.marks, min, max);\n\n\tif (marks.length > 0) {\n\t\tconst mark = findClosestNumberScaleMark(value, marks);\n\t\tconst outputValue = getRangeMarkOutputValue(mark);\n\n\t\treturn outputValue !== undefined ? outputValue : (mark?.value ?? value);\n\t}\n\n\treturn snapNumberScaleValueToStep(value, min, max, options.step);\n}\n\nexport function getClosestSliderThumb(targetValue: number, value: readonly [number, number]) {\n\tconst [start, end] = value;\n\treturn Math.abs(targetValue - start) <= Math.abs(targetValue - end) ? 0 : 1;\n}\n\nexport function resolveSliderFillRange(value: number | readonly [number, number], options: SliderMathOptions): SliderFillRange {\n\tconst { min, max } = resolveNumberScaleBounds(options.min, options.max);\n\n\tif (Array.isArray(value)) {\n\t\treturn {\n\t\t\tstartPercent: valueToSliderVisualPercent(value[0], { ...options, min, max }),\n\t\t\tendPercent: valueToSliderVisualPercent(value[1], { ...options, min, max })\n\t\t};\n\t}\n\n\treturn {\n\t\tstartPercent: 0,\n\t\tendPercent: valueToSliderVisualPercent(value as number, { ...options, min, max })\n\t};\n}\n","@use \"@/styles/mixins\" as *;\n\n.slider {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: var(--space-sm);\n}\n\n.sliderCompact {\n\tgap: 0;\n}\n\n.trackShell {\n\tposition: relative;\n\tpadding-inline: calc((var(--control-height) - var(--space-xs)) / 2);\n}\n\n.track {\n\tposition: relative;\n\theight: var(--control-height);\n\tcursor: pointer;\n\ttouch-action: none;\n\tuser-select: none;\n}\n\n.rail,\n.fill {\n\tposition: absolute;\n\ttop: 50%;\n\ttransform: translateY(-50%);\n\theight: var(--space-xs);\n\tborder-radius: 999px;\n}\n\n.rail {\n\tleft: 0;\n\tright: 0;\n\tbackground-color: var(--surface-2);\n\tborder: var(--border);\n}\n\n.fill {\n\tbackground-color: var(--content-0);\n}\n\n.thumb {\n\tposition: absolute;\n\ttop: 50%;\n\ttransform: translate(-50%, -50%);\n\twidth: calc(var(--control-height) - var(--space-xs));\n\theight: calc(var(--control-height) - var(--space-xs));\n\tborder: var(--border);\n\tborder-radius: 50%;\n\tbackground-color: var(--surface-0);\n\tcolor: var(--content-0);\n\tbox-shadow: var(--shadow-sm);\n\tcursor: grab;\n\tz-index: 2;\n\ttransition:\n\t\ttransform var(--transition-fast) ease,\n\t\tborder-color var(--transition-fast) ease,\n\t\tbox-shadow var(--transition-fast) ease,\n\t\tbackground-color var(--transition-fast) ease;\n\n\t&:active,\n\t&:hover {\n\t\tborder-color: var(--border-1);\n\t}\n\n\t&:focus-visible {\n\t\t@include focusVisible;\n\t}\n\n\t&[data-dragging] {\n\t\tcursor: grabbing;\n\t\ttransform: translate(-50%, -50%) scale(1.04);\n\t\tbox-shadow: var(--shadow-md);\n\t}\n}\n\n.marks {\n\tposition: relative;\n\tmin-height: calc(var(--font-size-sm) + var(--space-md));\n\tmargin-inline: calc((var(--control-height) - var(--space-xs)) / 2);\n}\n\n.mark {\n\tposition: absolute;\n\ttop: 0;\n\ttransform: translateX(-50%);\n\tdisplay: inline-flex;\n\tflex-direction: column;\n\talign-items: center;\n\tgap: var(--space-xs);\n\tborder: none;\n\tbackground: transparent;\n\tpadding: 0;\n\tcolor: var(--content-2);\n\tcursor: pointer;\n\twhite-space: nowrap;\n\n\t&:focus-visible {\n\t\t@include focusVisible;\n\t\tborder-radius: var(--radius-sm);\n\t}\n\n\t&[data-active] {\n\t\tcolor: var(--content-0);\n\t}\n}\n\n.compactMark {\n\tposition: absolute;\n\ttop: 50%;\n\ttransform: translate(-50%, -50%);\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\twidth: var(--control-height);\n\theight: var(--control-height);\n\tborder: none;\n\tbackground: transparent;\n\tpadding: 0;\n\tcolor: var(--content-2);\n\tcursor: pointer;\n\tz-index: 1;\n\n\t&:focus-visible {\n\t\t@include focusVisible;\n\t\tborder-radius: var(--radius-sm);\n\t}\n\n\t&[data-active] {\n\t\tcolor: var(--content-0);\n\t}\n\n\t&:disabled {\n\t\tcursor: default;\n\t}\n}\n\n.markDot {\n\twidth: var(--space-sm);\n\theight: var(--space-sm);\n\tborder-radius: 50%;\n\tbackground-color: currentColor;\n\t// opacity: 0.55;\n}\n\n.markLabel {\n\tfont-size: var(--font-size-sm);\n}\n\n.popoverContent {\n\tmin-width: min(24em, calc(100vw - var(--space-xl)));\n}\n\n.rangeInputControl {\n\tgap: var(--space-xs);\n\tcursor: text;\n}\n\n.rangeSegmentInput {\n\tmin-width: 0;\n\twidth: 7ch;\n\tborder: none;\n\tbackground: transparent;\n\toutline: none;\n\tpadding: 0;\n\tmargin: 0;\n\tfont-family: var(--font-family-mono);\n\tcolor: inherit;\n\ttext-align: center;\n\tcaret-color: var(--content-0);\n\tfont-variant-numeric: tabular-nums;\n\n\t&::selection {\n\t\tbackground-color: var(--focus-ring);\n\t\tcolor: var(--surface-0);\n\t}\n\n\t&:disabled {\n\t\topacity: 0.25;\n\t}\n}\n\n.rangeSeparator {\n\tuser-select: none;\n\tcolor: var(--content-2);\n\tflex-shrink: 0;\n\n\t&[data-disabled] {\n\t\topacity: 0.25;\n\t}\n}\n","import React, { KeyboardEvent, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { offsetNumberScaleValue, percentToNumberScaleValue, resolveNumberScaleBounds } from \"@ryuzaki13/react-foundation-lib/number-scale\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { InputUI, useInputFieldIds } from \"../input\";\nimport { FloatingPopover } from \"../popover\";\nimport { UiBaseProps, UiSize } from \"../types\";\n\nimport {\n\tgetClosestSliderMarkByPercent,\n\tgetClosestSliderThumb,\n\tgetRangeSliderVisualValue,\n\tgetSliderMarkPercent,\n\tnormalizeRangeSliderValue,\n\tnormalizeSingleSliderValue,\n\tprepareSliderMarks,\n\tresolveSliderFillRange,\n\tvalueToSliderVisualPercent,\n\tvisualValueToRangeEndpoint,\n\ttype SliderMark,\n\ttype SliderMarksPosition,\n\ttype SliderRangeMark,\n\ttype SliderRangeValue\n} from \"./lib\";\nimport styles from \"./Slider.module.scss\";\n\ntype SliderMarksDisplay = \"compact\" | \"full\";\n\ninterface SliderCommonProps<TMark extends SliderMark> {\n\t/**\n\t * Минимальная координата шкалы. Marks вне этой границы отбрасываются.\n\t */\n\tmin: number;\n\t/**\n\t * Максимальная координата шкалы. Marks вне этой границы отбрасываются.\n\t */\n\tmax: number;\n\t/**\n\t * Шаг изменения, когда `marks` не заданы или после фильтрации не осталось валидных marks.\n\t */\n\tstep?: number;\n\t/**\n\t * Дискретные точки выбора. Если заданы, бегунок всегда ходит только по marks.\n\t */\n\tmarks?: readonly TMark[];\n\t/**\n\t * Способ визуального размещения marks и бегунка: по числовой координате `value` или равномерно по индексу.\n\t */\n\tmarksPosition?: SliderMarksPosition;\n\t/**\n\t * Внешний CSS-класс контейнера поля.\n\t */\n\tclassName?: string;\n\t/**\n\t * Текст внешней ошибки, отображается через общую `InputUI`-обёртку.\n\t */\n\terror?: string;\n\t/**\n\t * Вызывается после успешного изменения значения, чтобы потребитель мог сбросить внешнюю ошибку.\n\t */\n\tonClearError?: () => void;\n}\n\n/**\n * Single-value slider. Возвращает координату шкалы, потому что single marks не используют `outputValue`.\n */\nexport interface SliderProps extends Omit<UiBaseProps<number, number | undefined>, \"placeholder\">, SliderCommonProps<SliderMark> {}\n\n/**\n * Range slider. Возвращает бизнес-значения `SliderRangeMark.outputValue`, если они заданы, иначе координаты `value`.\n */\nexport interface SliderRangeProps\n\textends Omit<UiBaseProps<SliderRangeValue, SliderRangeValue | undefined>, \"placeholder\">, SliderCommonProps<SliderRangeMark> {}\n\ninterface SliderBaseCommonProps<TMark extends SliderMark> extends SliderCommonProps<TMark> {\n\t/**\n\t * Подпись поля в общей `InputUI`-обёртке.\n\t */\n\tlabel?: React.ReactNode;\n\t/**\n\t * Описание поля под подписью.\n\t */\n\tdescription?: string;\n\t/**\n\t * Блокирует pointer, keyboard и click-взаимодействие.\n\t */\n\tdisabled?: boolean;\n\t/**\n\t * Размер общей `InputUI`-обёртки.\n\t */\n\tsize?: UiSize;\n\t/**\n\t * Compact показывает только ticks/tooltip внутри высоты control, full добавляет строку labels для popover.\n\t */\n\tmarksDisplay?: SliderMarksDisplay;\n}\n\ninterface SliderBaseSingleProps extends SliderBaseCommonProps<SliderMark> {\n\tmode: \"single\";\n\tvalue: number | undefined;\n\tonChange: (value: number) => void;\n}\n\ninterface SliderBaseRangeProps extends SliderBaseCommonProps<SliderRangeMark> {\n\tmode: \"range\";\n\tvalue: SliderRangeValue | undefined;\n\tonChange: (value: SliderRangeValue) => void;\n}\n\nexport type SliderBaseProps = SliderBaseSingleProps | SliderBaseRangeProps;\n\nfunction resolveKeyboardOffset(eventKey: string) {\n\tif (eventKey === \"ArrowLeft\" || eventKey === \"ArrowDown\") {\n\t\treturn -1;\n\t}\n\n\tif (eventKey === \"ArrowRight\" || eventKey === \"ArrowUp\") {\n\t\treturn 1;\n\t}\n\n\tif (eventKey === \"PageDown\") {\n\t\treturn -10;\n\t}\n\n\tif (eventKey === \"PageUp\") {\n\t\treturn 10;\n\t}\n\n\treturn null;\n}\n\nfunction areRangeValuesEqual(left: SliderRangeValue | undefined, right: SliderRangeValue) {\n\treturn !!left && left[0] === right[0] && left[1] === right[1];\n}\n\nfunction formatRangeEndpoint(value: number | null, thumbIndex: number) {\n\tif (value === null) {\n\t\treturn thumbIndex === 0 ? \"-∞\" : \"∞\";\n\t}\n\n\treturn String(value);\n}\n\nfunction getMarkLabelByValue<TMark extends SliderMark>(value: number, marks: readonly TMark[]) {\n\treturn marks.find((mark) => mark.value === value)?.label ?? String(value);\n}\n\nfunction renderTooltipContent(content: React.ReactNode) {\n\treturn typeof content === \"string\" || typeof content === \"number\" ? <span className=\"textNoWrap\">{content}</span> : content;\n}\n\nexport function SliderBase(props: SliderBaseProps) {\n\tconst {\n\t\tmin: rawMin,\n\t\tmax: rawMax,\n\t\tstep,\n\t\tmarks,\n\t\tmarksPosition = \"value\",\n\t\tmarksDisplay = \"compact\",\n\t\tclassName,\n\t\terror,\n\t\tonClearError,\n\t\tlabel,\n\t\tdescription,\n\t\tdisabled,\n\t\tsize\n\t} = props;\n\tconst { min, max } = useMemo(() => resolveNumberScaleBounds(rawMin, rawMax), [rawMin, rawMax]);\n\tconst normalizedMarks = useMemo(() => prepareSliderMarks(marks, min, max), [marks, min, max]);\n\tconst sliderOptions = useMemo(\n\t\t() => ({\n\t\t\tmin,\n\t\t\tmax,\n\t\t\tstep,\n\t\t\tmarks: normalizedMarks,\n\t\t\tmarksPosition\n\t\t}),\n\t\t[min, max, step, normalizedMarks, marksPosition]\n\t);\n\n\tconst isRange = props.mode === \"range\";\n\tconst currentSingleValue = !isRange ? normalizeSingleSliderValue(props.value, sliderOptions) : undefined;\n\tconst currentRangeValue = isRange ? normalizeRangeSliderValue(props.value, sliderOptions) : undefined;\n\tconst visualRangeValue = isRange ? getRangeSliderVisualValue(props.value, sliderOptions) : undefined;\n\tconst thumbValues = isRange ? visualRangeValue! : [currentSingleValue!];\n\tconst fillRange = resolveSliderFillRange(isRange ? visualRangeValue! : currentSingleValue!, sliderOptions);\n\n\tconst trackRef = useRef<HTMLDivElement | null>(null);\n\tconst thumbRefs = useRef<Array<HTMLButtonElement | null>>([]);\n\tconst dragThumbIndexRef = useRef<number | null>(null);\n\tconst dragPointerIdRef = useRef<number | null>(null);\n\tconst [dragThumbIndex, setDragThumbIndex] = useState<number | null>(null);\n\n\tconst { controlId, labelId, descriptionId, errorId, describedBy } = useInputFieldIds({\n\t\thasLabel: label !== undefined && label !== null,\n\t\thasDescription: !!description,\n\t\thasError: !!error\n\t});\n\n\tconst emitSingleValue = (nextValue: number) => {\n\t\tif (disabled || props.mode !== \"single\") {\n\t\t\treturn;\n\t\t}\n\n\t\tif (props.value !== undefined && props.value === nextValue) {\n\t\t\treturn;\n\t\t}\n\n\t\tprops.onChange(nextValue);\n\t\tonClearError?.();\n\t};\n\n\tconst emitRangeValue = (nextValue: SliderRangeValue) => {\n\t\tif (disabled || props.mode !== \"range\") {\n\t\t\treturn;\n\t\t}\n\n\t\tif (areRangeValuesEqual(props.value, nextValue)) {\n\t\t\treturn;\n\t\t}\n\n\t\tprops.onChange(nextValue);\n\t\tonClearError?.();\n\t};\n\n\tconst applySliderValue = (rawValue: number, thumbIndex: number) => {\n\t\tif (disabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (props.mode === \"range\") {\n\t\t\tconst [startVisualValue, endVisualValue] = visualRangeValue!;\n\t\t\tconst [startValue, endValue] = currentRangeValue!;\n\t\t\tconst nextValue =\n\t\t\t\tthumbIndex === 0\n\t\t\t\t\t? normalizeRangeSliderValue(\n\t\t\t\t\t\t\t[visualValueToRangeEndpoint(Math.min(rawValue, endVisualValue), sliderOptions), endValue],\n\t\t\t\t\t\t\tsliderOptions\n\t\t\t\t\t\t)\n\t\t\t\t\t: normalizeRangeSliderValue(\n\t\t\t\t\t\t\t[startValue, visualValueToRangeEndpoint(Math.max(rawValue, startVisualValue), sliderOptions)],\n\t\t\t\t\t\t\tsliderOptions\n\t\t\t\t\t\t);\n\n\t\t\temitRangeValue(nextValue);\n\t\t\treturn;\n\t\t}\n\n\t\temitSingleValue(normalizeSingleSliderValue(rawValue, sliderOptions));\n\t};\n\n\tconst resolveValueFromPointer = (clientX: number) => {\n\t\tconst bounds = trackRef.current?.getBoundingClientRect();\n\t\tif (!bounds) {\n\t\t\treturn min;\n\t\t}\n\n\t\tconst percent = ((clientX - bounds.left) / bounds.width) * 100;\n\t\tconst closestMark = normalizedMarks.length > 0 ? getClosestSliderMarkByPercent(percent, sliderOptions) : undefined;\n\n\t\treturn closestMark?.value ?? percentToNumberScaleValue(percent, min, max);\n\t};\n\tconst applySliderValueRef = useRef(applySliderValue);\n\tconst resolveValueFromPointerRef = useRef(resolveValueFromPointer);\n\n\tuseEffect(() => {\n\t\tapplySliderValueRef.current = applySliderValue;\n\t\tresolveValueFromPointerRef.current = resolveValueFromPointer;\n\t});\n\n\tuseEffect(() => {\n\t\tconst onPointerUp = (event?: PointerEvent) => {\n\t\t\tif (dragPointerIdRef.current !== null && event && event.pointerId !== dragPointerIdRef.current) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tdragPointerIdRef.current = null;\n\t\t\tdragThumbIndexRef.current = null;\n\t\t\tsetDragThumbIndex(null);\n\t\t};\n\n\t\tconst onPointerMove = (event: PointerEvent) => {\n\t\t\tif (dragThumbIndexRef.current === null) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (dragPointerIdRef.current !== null && event.pointerId !== dragPointerIdRef.current) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tapplySliderValueRef.current(resolveValueFromPointerRef.current(event.clientX), dragThumbIndexRef.current);\n\t\t};\n\n\t\twindow.addEventListener(\"pointermove\", onPointerMove);\n\t\twindow.addEventListener(\"pointerup\", onPointerUp);\n\t\twindow.addEventListener(\"pointercancel\", onPointerUp);\n\n\t\treturn () => {\n\t\t\twindow.removeEventListener(\"pointermove\", onPointerMove);\n\t\t\twindow.removeEventListener(\"pointerup\", onPointerUp);\n\t\t\twindow.removeEventListener(\"pointercancel\", onPointerUp);\n\t\t};\n\t}, []);\n\n\tconst beginPointerDrag = (pointerId: number, thumbIndex: number) => {\n\t\tdragPointerIdRef.current = pointerId;\n\t\tdragThumbIndexRef.current = thumbIndex;\n\t\tsetDragThumbIndex(thumbIndex);\n\t\tthumbRefs.current[thumbIndex]?.focus();\n\t};\n\n\tconst handleTrackPointerDown = (event: React.PointerEvent<HTMLDivElement>) => {\n\t\tif (disabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\n\t\tconst rawValue = resolveValueFromPointer(event.clientX);\n\t\tconst thumbIndex = isRange ? getClosestSliderThumb(rawValue, visualRangeValue!) : 0;\n\n\t\tapplySliderValue(rawValue, thumbIndex);\n\t\tbeginPointerDrag(event.pointerId, thumbIndex);\n\t};\n\n\tconst handleThumbPointerDown = (thumbIndex: number) => (event: React.PointerEvent<HTMLButtonElement>) => {\n\t\tif (disabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\t\tevent.stopPropagation();\n\n\t\tbeginPointerDrag(event.pointerId, thumbIndex);\n\t};\n\n\tconst handleThumbKeyDown = (thumbIndex: number) => (event: KeyboardEvent<HTMLButtonElement>) => {\n\t\tif (disabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst lowerBound = isRange && thumbIndex === 1 ? visualRangeValue![0] : min;\n\t\tconst upperBound = isRange && thumbIndex === 0 ? visualRangeValue![1] : max;\n\t\tconst keyboardOffset = resolveKeyboardOffset(event.key);\n\n\t\tif (event.key === \"Home\") {\n\t\t\tevent.preventDefault();\n\t\t\tapplySliderValue(lowerBound, thumbIndex);\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === \"End\") {\n\t\t\tevent.preventDefault();\n\t\t\tapplySliderValue(upperBound, thumbIndex);\n\t\t\treturn;\n\t\t}\n\n\t\tif (keyboardOffset === null) {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\t\tconst baseValue = thumbValues[thumbIndex];\n\t\tconst nextValue = offsetNumberScaleValue(baseValue, keyboardOffset, sliderOptions, lowerBound, upperBound);\n\t\tapplySliderValue(nextValue, thumbIndex);\n\t};\n\n\tconst handleMarkSelect = (markValue: number) => {\n\t\tif (disabled) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst thumbIndex = isRange ? getClosestSliderThumb(markValue, visualRangeValue!) : 0;\n\t\tapplySliderValue(markValue, thumbIndex);\n\t\tthumbRefs.current[thumbIndex]?.focus();\n\t};\n\n\tconst getThumbValueText = (thumbValue: number, thumbIndex: number) => {\n\t\tif (isRange) {\n\t\t\tconst publicValue = currentRangeValue![thumbIndex];\n\t\t\tconst exactMark = normalizedMarks.find((mark) => mark.value === thumbValue);\n\n\t\t\treturn exactMark?.label ?? formatRangeEndpoint(publicValue, thumbIndex);\n\t\t}\n\n\t\treturn getMarkLabelByValue(thumbValue, normalizedMarks);\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\tclassName={className}\n\t\t\tsize={size}\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<div id={controlId} className={cn(styles.slider, marksDisplay === \"compact\" && styles.sliderCompact)}>\n\t\t\t\t<div className={styles.trackShell}>\n\t\t\t\t\t<div\n\t\t\t\t\t\tref={trackRef}\n\t\t\t\t\t\tdata-slot=\"track\"\n\t\t\t\t\t\tclassName={styles.track}\n\t\t\t\t\t\trole=\"presentation\"\n\t\t\t\t\t\tonPointerDown={handleTrackPointerDown}>\n\t\t\t\t\t\t<div className={styles.rail} />\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tdata-slot=\"fill\"\n\t\t\t\t\t\t\tclassName={styles.fill}\n\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\tleft: `${fillRange.startPercent}%`,\n\t\t\t\t\t\t\t\twidth: `${fillRange.endPercent - fillRange.startPercent}%`\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t/>\n\n\t\t\t\t\t\t{marksDisplay === \"compact\" &&\n\t\t\t\t\t\t\tnormalizedMarks.map((mark) => {\n\t\t\t\t\t\t\t\tconst markPercent = getSliderMarkPercent(mark, normalizedMarks, sliderOptions);\n\t\t\t\t\t\t\t\tconst isActive = isRange\n\t\t\t\t\t\t\t\t\t? mark.value >= visualRangeValue![0] && mark.value <= visualRangeValue![1]\n\t\t\t\t\t\t\t\t\t: mark.value <= currentSingleValue!;\n\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<FloatingPopover key={mark.value} tooltip placement=\"top\" content={renderTooltipContent(mark.label)}>\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\tdata-slot=\"mark\"\n\t\t\t\t\t\t\t\t\t\t\tdata-active={isActive ? \"\" : undefined}\n\t\t\t\t\t\t\t\t\t\t\tclassName={styles.compactMark}\n\t\t\t\t\t\t\t\t\t\t\tstyle={{ left: `${markPercent}%` }}\n\t\t\t\t\t\t\t\t\t\t\taria-label={mark.ariaLabel}\n\t\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\t\t\tonClick={() => handleMarkSelect(mark.value)}>\n\t\t\t\t\t\t\t\t\t\t\t<span className={styles.markDot} aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t\t\t</FloatingPopover>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})}\n\n\t\t\t\t\t\t{thumbValues.map((thumbValue, thumbIndex) => {\n\t\t\t\t\t\t\tconst thumbLabel = getThumbValueText(thumbValue, thumbIndex);\n\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<FloatingPopover\n\t\t\t\t\t\t\t\t\tkey={thumbIndex}\n\t\t\t\t\t\t\t\t\ttooltip\n\t\t\t\t\t\t\t\t\tplacement=\"top\"\n\t\t\t\t\t\t\t\t\tcontent={renderTooltipContent(thumbLabel)}\n\t\t\t\t\t\t\t\t\topenDelay={0}\n\t\t\t\t\t\t\t\t\tcloseDelay={100}>\n\t\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\t\tref={(node) => {\n\t\t\t\t\t\t\t\t\t\t\tthumbRefs.current[thumbIndex] = node;\n\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\t\trole=\"slider\"\n\t\t\t\t\t\t\t\t\t\tdata-slot=\"thumb\"\n\t\t\t\t\t\t\t\t\t\tdata-thumb-index={thumbIndex}\n\t\t\t\t\t\t\t\t\t\tdata-dragging={dragThumbIndex === thumbIndex ? \"\" : undefined}\n\t\t\t\t\t\t\t\t\t\tclassName={styles.thumb}\n\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\t\tstyle={{ left: `${valueToSliderVisualPercent(thumbValue, sliderOptions)}%` }}\n\t\t\t\t\t\t\t\t\t\taria-disabled={disabled || undefined}\n\t\t\t\t\t\t\t\t\t\taria-orientation=\"horizontal\"\n\t\t\t\t\t\t\t\t\t\taria-valuemin={isRange && thumbIndex === 1 ? visualRangeValue![0] : min}\n\t\t\t\t\t\t\t\t\t\taria-valuemax={isRange && thumbIndex === 0 ? visualRangeValue![1] : max}\n\t\t\t\t\t\t\t\t\t\taria-valuenow={thumbValue}\n\t\t\t\t\t\t\t\t\t\taria-valuetext={\n\t\t\t\t\t\t\t\t\t\t\ttypeof thumbLabel === \"string\" || typeof thumbLabel === \"number\"\n\t\t\t\t\t\t\t\t\t\t\t\t? String(thumbLabel)\n\t\t\t\t\t\t\t\t\t\t\t\t: undefined\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\taria-labelledby={labelId}\n\t\t\t\t\t\t\t\t\t\taria-describedby={describedBy}\n\t\t\t\t\t\t\t\t\t\taria-label={\n\t\t\t\t\t\t\t\t\t\t\tlabelId\n\t\t\t\t\t\t\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t\t\t\t\t\t\t: isRange\n\t\t\t\t\t\t\t\t\t\t\t\t\t? thumbIndex === 0\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: \"Максимальное значение\"\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}\n\t\t\t\t\t\t\t\t\t\tonPointerDown={handleThumbPointerDown(thumbIndex)}\n\t\t\t\t\t\t\t\t\t\tonKeyDown={handleThumbKeyDown(thumbIndex)}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</FloatingPopover>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t{marksDisplay === \"full\" && normalizedMarks.length > 0 && (\n\t\t\t\t\t<div className={styles.marks}>\n\t\t\t\t\t\t{normalizedMarks.map((mark) => {\n\t\t\t\t\t\t\tconst isActive = isRange\n\t\t\t\t\t\t\t\t? mark.value >= visualRangeValue![0] && mark.value <= visualRangeValue![1]\n\t\t\t\t\t\t\t\t: mark.value <= currentSingleValue!;\n\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<button\n\t\t\t\t\t\t\t\t\tkey={mark.value}\n\t\t\t\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\t\t\t\tdata-slot=\"mark\"\n\t\t\t\t\t\t\t\t\tdata-active={isActive ? \"\" : undefined}\n\t\t\t\t\t\t\t\t\tclassName={styles.mark}\n\t\t\t\t\t\t\t\t\tstyle={{ left: `${getSliderMarkPercent(mark, normalizedMarks, sliderOptions)}%` }}\n\t\t\t\t\t\t\t\t\taria-label={mark.ariaLabel}\n\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\tonClick={() => handleMarkSelect(mark.value)}>\n\t\t\t\t\t\t\t\t\t<span className={styles.markDot} aria-hidden=\"true\" />\n\t\t\t\t\t\t\t\t\t<span className={styles.markLabel}>{mark.label}</span>\n\t\t\t\t\t\t\t\t</button>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t})}\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t</InputUI>\n\t);\n}\n\nexport function Slider(props: SliderProps) {\n\treturn <SliderBase {...props} mode=\"single\" marksDisplay=\"compact\" />;\n}\n\nexport function SliderRange(props: SliderRangeProps) {\n\treturn <SliderBase {...props} mode=\"range\" marksDisplay=\"compact\" />;\n}\n","import { KeyboardEvent, useCallback, useEffect, useEffectEvent, useMemo, useState } from \"react\";\n\nimport { toFiniteNumber } from \"@ryuzaki13/react-foundation-lib/formatters\";\nimport { resolveNumberScaleBounds } from \"@ryuzaki13/react-foundation-lib/number-scale\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { InputControl, InputText, InputUI, useInputFieldIds } from \"../input\";\nimport { PickerTriggerActions } from \"../picker\";\nimport { Popover } from \"../popover\";\nimport { UiBaseProps } from \"../types\";\nimport uiStyles from \"../ui.module.scss\";\n\nimport {\n\tgetRangeMarkOutputValue,\n\tnormalizeRangeSliderValue,\n\tnormalizeSingleSliderValue,\n\tprepareSliderMarks,\n\ttype SliderMark,\n\ttype SliderMarksPosition,\n\ttype SliderRangeMark,\n\ttype SliderRangeValue\n} from \"./lib\";\nimport { SliderBase } from \"./Slider\";\nimport styles from \"./Slider.module.scss\";\n\ninterface SliderInputCommonProps {\n\t/**\n\t * Минимальная координата шкалы. Marks вне этой границы не участвуют в выборе.\n\t */\n\tmin: number;\n\t/**\n\t * Максимальная координата шкалы. Marks вне этой границы не участвуют в выборе.\n\t */\n\tmax: number;\n\t/**\n\t * Шаг ручного ввода и слайдера, если не заданы marks.\n\t */\n\tstep?: number;\n\t/**\n\t * Способ визуального размещения marks и бегунка в popover.\n\t */\n\tmarksPosition?: SliderMarksPosition;\n\t/**\n\t * Внешний CSS-класс общей обёртки поля.\n\t */\n\tclassName?: string;\n\t/**\n\t * Текст внешней ошибки.\n\t */\n\terror?: string;\n\t/**\n\t * Сбрасывает внешнюю ошибку после успешного commit или выбора в popover.\n\t */\n\tonClearError?: () => void;\n}\n\nexport interface SliderInputProps extends UiBaseProps<number, number | undefined>, SliderInputCommonProps {\n\t/**\n\t * Marks single-слайдера. Single-компонент отдаёт наружу `mark.value`.\n\t */\n\tmarks?: readonly SliderMark[];\n}\n\nexport interface SliderRangeInputProps extends UiBaseProps<SliderRangeValue, SliderRangeValue | undefined>, SliderInputCommonProps {\n\t/**\n\t * Marks range-слайдера. `value` задаёт координату на шкале, `outputValue` задаёт публичное значение для потребителя.\n\t */\n\tmarks?: readonly SliderRangeMark[];\n\t/**\n\t * Показывает вместо ручных сегментов готовый текст по выбранным marks.\n\t * Popover остаётся единственным способом изменить значение через слайдер, а потребитель получает изменение при закрытии popover.\n\t */\n\treadonlyValueText?: boolean;\n}\n\nfunction createSliderToggle({\n\topen,\n\tdisabled,\n\tsetOpen\n}: {\n\topen: boolean;\n\tdisabled?: boolean;\n\tsetOpen: (nextOpen: boolean | ((prev: boolean) => boolean)) => void;\n}) {\n\treturn (\n\t\t<Popover.Trigger passive>\n\t\t\t<div>\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\topenAriaLabel=\"Открыть слайдер\"\n\t\t\t\t\tcloseAriaLabel=\"Закрыть слайдер\"\n\t\t\t\t\tonToggleMouseDown={(event) => event.preventDefault()}\n\t\t\t\t\tonToggleClick={() => setOpen((prev) => !prev)}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</Popover.Trigger>\n\t);\n}\n\nfunction formatRangeDraft(\n\tvalue: SliderRangeValue | undefined,\n\toptions: {\n\t\tmin: number;\n\t\tmax: number;\n\t\tstep?: number;\n\t\tmarks?: readonly SliderRangeMark[];\n\t\tmarksPosition?: SliderMarksPosition;\n\t}\n) {\n\tconst normalized = normalizeRangeSliderValue(value, options);\n\n\treturn {\n\t\tstart: normalized[0] === null ? \"-∞\" : String(normalized[0]),\n\t\tend: normalized[1] === null ? \"∞\" : String(normalized[1])\n\t};\n}\n\nfunction parseRangeDraftSegment(value: string, infinityText: string) {\n\tconst trimmed = value.trim();\n\tif (trimmed === \"\" || trimmed === infinityText) {\n\t\treturn null;\n\t}\n\n\treturn toFiniteNumber(trimmed);\n}\n\nfunction getRangeMarkByOutputValue(value: number | null, marks: readonly SliderRangeMark[], endpoint: \"start\" | \"end\") {\n\tconst matchingMarks = marks.filter((mark) => getRangeMarkOutputValue(mark) === value);\n\n\tif (!matchingMarks.length) {\n\t\treturn undefined;\n\t}\n\n\treturn value === null && endpoint === \"end\" ? matchingMarks[matchingMarks.length - 1] : matchingMarks[0];\n}\n\nfunction getRangeMarkReadonlyLabel(mark: SliderRangeMark | undefined, value: number | null) {\n\tif (mark?.readonlyLabel?.trim()) {\n\t\treturn mark.readonlyLabel.trim();\n\t}\n\n\tif (typeof mark?.label === \"string\" || typeof mark?.label === \"number\") {\n\t\treturn String(mark.label);\n\t}\n\t// SHARE: lib/formatters/string.toSafeString\n\treturn value === null ? \"\" : String(value);\n}\n\nfunction getRangeEndpointLabel(value: number | null, marks: readonly SliderRangeMark[], endpoint: \"start\" | \"end\") {\n\tconst mark = getRangeMarkByOutputValue(value, marks, endpoint);\n\treturn getRangeMarkReadonlyLabel(mark, value);\n}\n\nfunction getRangeReadonlyText(value: SliderRangeValue, marks: readonly SliderRangeMark[], placeholder?: string) {\n\tconst [start, end] = value;\n\tconst isStartOpen = start === null;\n\tconst isEndOpen = end === null;\n\n\tif (isStartOpen && isEndOpen) {\n\t\treturn placeholder ?? \"\";\n\t}\n\n\tif (isStartOpen) {\n\t\treturn `Меньше ${getRangeEndpointLabel(end, marks, \"end\")}`;\n\t}\n\n\tif (isEndOpen) {\n\t\treturn `Больше ${getRangeEndpointLabel(start, marks, \"start\")}`;\n\t}\n\n\tif (start === end) {\n\t\treturn `Равно ${getRangeEndpointLabel(start, marks, \"start\")}`;\n\t}\n\n\treturn `От ${getRangeEndpointLabel(start, marks, \"start\")} до ${getRangeEndpointLabel(end, marks, \"end\")}`;\n}\n\nexport function SliderInput({\n\tvalue,\n\tonChange,\n\tmin: rawMin,\n\tmax: rawMax,\n\tstep,\n\tmarks,\n\tmarksPosition = \"value\",\n\tclassName,\n\terror,\n\tonClearError,\n\tlabel,\n\tdescription,\n\tplaceholder,\n\tdisabled,\n\tsize\n}: SliderInputProps) {\n\tconst { min, max } = useMemo(() => resolveNumberScaleBounds(rawMin, rawMax), [rawMin, rawMax]);\n\tconst normalizedMarks = useMemo(() => prepareSliderMarks(marks, min, max), [marks, min, max]);\n\tconst sliderOptions = useMemo(\n\t\t() => ({\n\t\t\tmin,\n\t\t\tmax,\n\t\t\tstep,\n\t\t\tmarks: normalizedMarks,\n\t\t\tmarksPosition\n\t\t}),\n\t\t[min, max, step, normalizedMarks, marksPosition]\n\t);\n\tconst normalizedValue = normalizeSingleSliderValue(value, sliderOptions);\n\n\tconst [open, setOpen] = useState(false);\n\tconst [draftValue, setDraftValue] = useState(String(normalizedValue));\n\n\tconst syncDraftValue = useEffectEvent((nextValue: string) => {\n\t\tsetDraftValue(nextValue);\n\t});\n\n\tuseEffect(() => {\n\t\tsyncDraftValue(String(normalizedValue));\n\t}, [normalizedValue]);\n\n\tconst commitDraftValue = useCallback(() => {\n\t\tif (disabled) {\n\t\t\tsetDraftValue(String(normalizedValue));\n\t\t\treturn;\n\t\t}\n\n\t\tconst parsedValue = toFiniteNumber(draftValue);\n\t\tif (parsedValue === undefined) {\n\t\t\tsetDraftValue(String(normalizedValue));\n\t\t\treturn;\n\t\t}\n\n\t\tconst nextValue = normalizeSingleSliderValue(parsedValue, sliderOptions);\n\t\tif (value !== nextValue) {\n\t\t\tonChange(nextValue);\n\t\t\tonClearError?.();\n\t\t}\n\n\t\tsetDraftValue(String(nextValue));\n\t}, [disabled, draftValue, normalizedValue, onChange, onClearError, sliderOptions, value]);\n\n\tconst handleDraftKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n\t\tif (event.key !== \"Enter\") {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\t\tcommitDraftValue();\n\t};\n\n\tconst handleSliderChange = (nextValue: number) => {\n\t\tonChange(nextValue);\n\t\tsetDraftValue(String(nextValue));\n\t\tonClearError?.();\n\t};\n\n\treturn (\n\t\t<Popover open={open} onOpenChange={setOpen}>\n\t\t\t<InputText\n\t\t\t\tlabel={label}\n\t\t\t\tdescription={description}\n\t\t\t\tplaceholder={placeholder}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tsize={size}\n\t\t\t\tclassName={className}\n\t\t\t\terror={error}\n\t\t\t\tvalue={draftValue}\n\t\t\t\tonChange={setDraftValue}\n\t\t\t\tonBlur={commitDraftValue}\n\t\t\t\tonKeyDown={handleDraftKeyDown}\n\t\t\t\tendAdornmentWidth=\"var(--control-height)\"\n\t\t\t\tendAdornment={createSliderToggle({ open, disabled, setOpen })}\n\t\t\t/>\n\n\t\t\t<Popover.Content background=\"primary\">\n\t\t\t\t<div className={styles.popoverContent}>\n\t\t\t\t\t<SliderBase\n\t\t\t\t\t\tmode=\"single\"\n\t\t\t\t\t\tmin={min}\n\t\t\t\t\t\tmax={max}\n\t\t\t\t\t\tstep={step}\n\t\t\t\t\t\tmarks={normalizedMarks}\n\t\t\t\t\t\tmarksPosition={marksPosition}\n\t\t\t\t\t\tmarksDisplay=\"full\"\n\t\t\t\t\t\tvalue={value}\n\t\t\t\t\t\tonChange={handleSliderChange}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</Popover.Content>\n\t\t</Popover>\n\t);\n}\n\nexport function SliderRangeInput({\n\tvalue,\n\tonChange,\n\tmin: rawMin,\n\tmax: rawMax,\n\tstep,\n\tmarks,\n\tmarksPosition = \"value\",\n\tclassName,\n\terror,\n\tonClearError,\n\tlabel,\n\tdescription,\n\treadonlyValueText,\n\tplaceholder,\n\tdisabled,\n\tsize\n}: SliderRangeInputProps) {\n\tconst { min, max } = useMemo(() => resolveNumberScaleBounds(rawMin, rawMax), [rawMin, rawMax]);\n\tconst normalizedMarks = useMemo(() => prepareSliderMarks(marks, min, max), [marks, min, max]);\n\tconst sliderOptions = useMemo(\n\t\t() => ({\n\t\t\tmin,\n\t\t\tmax,\n\t\t\tstep,\n\t\t\tmarks: normalizedMarks,\n\t\t\tmarksPosition\n\t\t}),\n\t\t[min, max, step, normalizedMarks, marksPosition]\n\t);\n\tconst normalizedValue = useMemo(() => normalizeRangeSliderValue(value, sliderOptions), [sliderOptions, value]);\n\tconst formattedValue = useMemo(() => formatRangeDraft(normalizedValue, sliderOptions), [normalizedValue, sliderOptions]);\n\n\tconst [open, setOpen] = useState(false);\n\tconst [draftStart, setDraftStart] = useState(formattedValue.start);\n\tconst [draftEnd, setDraftEnd] = useState(formattedValue.end);\n\tconst [popoverValue, setPopoverValue] = useState<SliderRangeValue>(normalizedValue);\n\n\tconst syncDraftValue = useEffectEvent((start: string, end: string) => {\n\t\tsetDraftStart(start);\n\t\tsetDraftEnd(end);\n\t});\n\n\tuseEffect(() => {\n\t\tif (open) {\n\t\t\treturn;\n\t\t}\n\n\t\tsyncDraftValue(formattedValue.start, formattedValue.end);\n\t}, [formattedValue.start, formattedValue.end, normalizedValue, open]);\n\n\tconst { controlId, labelId, descriptionId, errorId, describedBy } = useInputFieldIds({\n\t\thasLabel: label !== undefined && label !== null,\n\t\thasDescription: !!description,\n\t\thasError: !!error\n\t});\n\n\tconst rollbackDraftValue = useCallback(() => {\n\t\tsetDraftStart(formattedValue.start);\n\t\tsetDraftEnd(formattedValue.end);\n\t}, [formattedValue.end, formattedValue.start]);\n\n\tconst commitDraftValue = useCallback(() => {\n\t\tif (disabled) {\n\t\t\trollbackDraftValue();\n\t\t\treturn;\n\t\t}\n\n\t\tconst parsedStart = parseRangeDraftSegment(draftStart, \"-∞\");\n\t\tconst parsedEnd = parseRangeDraftSegment(draftEnd, \"∞\");\n\n\t\tif (parsedStart === undefined || parsedEnd === undefined) {\n\t\t\trollbackDraftValue();\n\t\t\treturn;\n\t\t}\n\n\t\tconst nextValue = normalizeRangeSliderValue([parsedStart, parsedEnd], sliderOptions);\n\t\tif (!areRangeDraftValuesEqual(normalizedValue, nextValue)) {\n\t\t\tonChange(nextValue);\n\t\t\tonClearError?.();\n\t\t}\n\n\t\tconst nextDraft = formatRangeDraft(nextValue, sliderOptions);\n\t\tsetDraftStart(nextDraft.start);\n\t\tsetDraftEnd(nextDraft.end);\n\t\tsetPopoverValue(nextValue);\n\t}, [disabled, draftEnd, draftStart, normalizedValue, onChange, onClearError, rollbackDraftValue, sliderOptions]);\n\n\tconst commitPopoverValue = useCallback(\n\t\t(nextValue: SliderRangeValue) => {\n\t\t\tconst normalizedNextValue = normalizeRangeSliderValue(nextValue, sliderOptions);\n\t\t\tif (!areRangeDraftValuesEqual(normalizedValue, normalizedNextValue)) {\n\t\t\t\tonChange(normalizedNextValue);\n\t\t\t\tonClearError?.();\n\t\t\t}\n\n\t\t\tconst nextDraft = formatRangeDraft(normalizedNextValue, sliderOptions);\n\t\t\tsetDraftStart(nextDraft.start);\n\t\t\tsetDraftEnd(nextDraft.end);\n\t\t\tsetPopoverValue(normalizedNextValue);\n\t\t},\n\t\t[normalizedValue, onChange, onClearError, sliderOptions]\n\t);\n\n\tconst handleOpenChange = (nextOpen: boolean) => {\n\t\tif (!open && nextOpen) {\n\t\t\tsetPopoverValue(normalizedValue);\n\t\t\tsetDraftStart(formattedValue.start);\n\t\t\tsetDraftEnd(formattedValue.end);\n\t\t}\n\n\t\tif (open && !nextOpen && !disabled) {\n\t\t\tcommitPopoverValue(popoverValue);\n\t\t}\n\n\t\tsetOpen(nextOpen);\n\t};\n\n\tconst handleDraftKeyDown = (event: KeyboardEvent<HTMLInputElement>) => {\n\t\tif (event.key !== \"Enter\") {\n\t\t\treturn;\n\t\t}\n\n\t\tevent.preventDefault();\n\t\tcommitDraftValue();\n\t};\n\n\tconst handleSliderChange = (nextValue: SliderRangeValue) => {\n\t\tconst normalizedNextValue = normalizeRangeSliderValue(nextValue, sliderOptions);\n\t\tsetPopoverValue(normalizedNextValue);\n\t\tconst nextDraft = formatRangeDraft(normalizedNextValue, sliderOptions);\n\t\tsetDraftStart(nextDraft.start);\n\t\tsetDraftEnd(nextDraft.end);\n\t};\n\tconst displayValue = open ? popoverValue : normalizedValue;\n\tconst readonlyTextValue = readonlyValueText ? getRangeReadonlyText(displayValue, normalizedMarks, placeholder) : undefined;\n\tconst setRangeOpen = (nextOpen: boolean | ((prev: boolean) => boolean)) => {\n\t\thandleOpenChange(typeof nextOpen === \"function\" ? nextOpen(open) : nextOpen);\n\t};\n\n\treturn (\n\t\t<Popover open={open} onOpenChange={handleOpenChange}>\n\t\t\t<InputUI\n\t\t\t\tlabel={label}\n\t\t\t\tdescription={description}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tclassName={className}\n\t\t\t\tsize={size}\n\t\t\t\terror={error}\n\t\t\t\tcontrolId={controlId}\n\t\t\t\tlabelId={labelId}\n\t\t\t\tdescriptionId={descriptionId}\n\t\t\t\terrorId={errorId}>\n\t\t\t\t<InputControl\n\t\t\t\t\tendAdornmentWidth=\"var(--control-height)\"\n\t\t\t\t\tendAdornment={createSliderToggle({ open, disabled, setOpen: setRangeOpen })}>\n\t\t\t\t\t{({ controlClassName }) => (\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tid={controlId}\n\t\t\t\t\t\t\tclassName={cn(uiStyles.uiInputControlFake, styles.rangeInputControl, controlClassName)}\n\t\t\t\t\t\t\tdata-invalid={error ? \"\" : undefined}\n\t\t\t\t\t\t\tdata-disabled={disabled || undefined}\n\t\t\t\t\t\t\trole=\"group\"\n\t\t\t\t\t\t\taria-invalid={!!error || undefined}\n\t\t\t\t\t\t\taria-label={typeof label === \"string\" ? label : \"Диапазон\"}\n\t\t\t\t\t\t\taria-labelledby={typeof label === \"string\" ? undefined : labelId}\n\t\t\t\t\t\t\taria-describedby={describedBy}>\n\t\t\t\t\t\t\t{readonlyValueText ? (\n\t\t\t\t\t\t\t\t<span className={cn(\"flexEllipsis\", !readonlyTextValue && uiStyles.uiPlaceholder)}>\n\t\t\t\t\t\t\t\t\t{readonlyTextValue || placeholder}\n\t\t\t\t\t\t\t\t</span>\n\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<input\n\t\t\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\t\t\tinputMode=\"decimal\"\n\t\t\t\t\t\t\t\t\t\tclassName={styles.rangeSegmentInput}\n\t\t\t\t\t\t\t\t\t\tvalue={draftStart}\n\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\t\taria-label=\"Начало диапазона\"\n\t\t\t\t\t\t\t\t\t\tonChange={(event) => setDraftStart(event.target.value)}\n\t\t\t\t\t\t\t\t\t\tonBlur={commitDraftValue}\n\t\t\t\t\t\t\t\t\t\tonKeyDown={handleDraftKeyDown}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t<span className={styles.rangeSeparator} data-disabled={disabled || undefined}>\n\t\t\t\t\t\t\t\t\t\t-\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t\t<input\n\t\t\t\t\t\t\t\t\t\ttype=\"text\"\n\t\t\t\t\t\t\t\t\t\tinputMode=\"decimal\"\n\t\t\t\t\t\t\t\t\t\tclassName={styles.rangeSegmentInput}\n\t\t\t\t\t\t\t\t\t\tvalue={draftEnd}\n\t\t\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\t\t\taria-label=\"Конец диапазона\"\n\t\t\t\t\t\t\t\t\t\tonChange={(event) => setDraftEnd(event.target.value)}\n\t\t\t\t\t\t\t\t\t\tonBlur={commitDraftValue}\n\t\t\t\t\t\t\t\t\t\tonKeyDown={handleDraftKeyDown}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</>\n\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</InputControl>\n\t\t\t</InputUI>\n\n\t\t\t<Popover.Content background=\"primary\">\n\t\t\t\t<div className={styles.popoverContent}>\n\t\t\t\t\t<SliderBase\n\t\t\t\t\t\tmode=\"range\"\n\t\t\t\t\t\tmin={min}\n\t\t\t\t\t\tmax={max}\n\t\t\t\t\t\tstep={step}\n\t\t\t\t\t\tmarks={normalizedMarks}\n\t\t\t\t\t\tmarksPosition={marksPosition}\n\t\t\t\t\t\tmarksDisplay=\"full\"\n\t\t\t\t\t\tvalue={popoverValue}\n\t\t\t\t\t\tonChange={handleSliderChange}\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</Popover.Content>\n\t\t</Popover>\n\t);\n}\n\nfunction areRangeDraftValuesEqual(left: SliderRangeValue, right: SliderRangeValue) {\n\treturn left[0] === right[0] && left[1] === right[1];\n}\n"],"mappings":"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"}
|