@ryuzaki13/react-foundation-ui 3.1.10 → 3.2.0
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/notifications/index.js.map +1 -1
- package/dist/splitter/Splitter.d.ts +3 -1
- package/dist/splitter/Splitter.d.ts.map +1 -1
- package/dist/splitter/index.js +51 -48
- package/dist/splitter/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
- package/storybook-static/assets/{Badge-B8T_GUd3.js → Badge-B1TTGHWx.js} +1 -1
- package/storybook-static/assets/{Badge.stories-BCUVI3a0.js → Badge.stories-m0BYb22G.js} +1 -1
- package/storybook-static/assets/{BadgeList-rhsndhf8.js → BadgeList-slD8D0kC.js} +1 -1
- package/storybook-static/assets/{BarcodeScannerDialog.stories-DaK9d-3n.js → BarcodeScannerDialog.stories-upAfBzGS.js} +1 -1
- package/storybook-static/assets/{Button-Dsvj4KAG.js → Button-mtVz4t8e.js} +1 -1
- package/storybook-static/assets/{Button-BUji6doJ.js → Button-wEcm3PeA.js} +1 -1
- package/storybook-static/assets/{Button.stories-5CBek73j.js → Button.stories-80YoPts7.js} +1 -1
- package/storybook-static/assets/{CalendarView-BShIq2Xl.js → CalendarView-CciHYZbO.js} +1 -1
- package/storybook-static/assets/{CheckBox-BLimqJJZ.js → CheckBox-4LmQO_eu.js} +1 -1
- package/storybook-static/assets/{CheckBox-oh28Qn5L.js → CheckBox-Cuizrqhy.js} +1 -1
- package/storybook-static/assets/{CheckBox.stories-CXUriB_0.js → CheckBox.stories-BVlzOlCH.js} +1 -1
- package/storybook-static/assets/{Color-6AOWCN3U-VhXbFFWt.js → Color-6AOWCN3U-p_cf8_j5.js} +1 -1
- package/storybook-static/assets/{ContextMenu-BxLGgADB.js → ContextMenu-CnlaWMhJ.js} +1 -1
- package/storybook-static/assets/{ContextMenu-CH2QUVTV.js → ContextMenu-Qi9jyPRQ.js} +1 -1
- package/storybook-static/assets/{ContextMenu.stories-DUuZJs1J.js → ContextMenu.stories-8u4LM_VP.js} +1 -1
- package/storybook-static/assets/{CustomOptionButton-Cy3ecbRv.js → CustomOptionButton-Be9f_V0i.js} +1 -1
- package/storybook-static/assets/{DateInput-BIsh52PH.js → DateInput-BAa-CGeP.js} +1 -1
- package/storybook-static/assets/{DateInput-BLCtrvtl.js → DateInput-CB1YwIXG.js} +1 -1
- package/storybook-static/assets/{DateInput.stories-DpINGGH6.js → DateInput.stories-D2TdFkNU.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-D0L7V-gK.js → DateRangePresetSelect-C__hQdoH.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-ZrrJbm5g.js → DateRangePresetSelect-DjRdo1nJ.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect.stories-05xtA98c.js → DateRangePresetSelect.stories-Cfd8knqx.js} +1 -1
- package/storybook-static/assets/{Detail-Bevlqwtd.js → Detail-D_eCEfW5.js} +1 -1
- package/storybook-static/assets/{Detail.stories-BzfpyIgk.js → Detail.stories-BaBaaNck.js} +1 -1
- package/storybook-static/assets/{Dialog-D-E7ysbf.js → Dialog-CBBa80xk.js} +1 -1
- package/storybook-static/assets/{Dialog-3eSm-j_0.js → Dialog-CoHzabh8.js} +1 -1
- package/storybook-static/assets/{Dialog.stories-CE3y0W8s.js → Dialog.stories-8LPXtaFM.js} +1 -1
- package/storybook-static/assets/{Disclosure-CK3jzG4E.js → Disclosure-BE4gJXEI.js} +1 -1
- package/storybook-static/assets/{Disclosure.stories-DdhtA6SG.js → Disclosure.stories-pV92k8Dz.js} +1 -1
- package/storybook-static/assets/{DisclosureGroup-DRlWkwYi.js → DisclosureGroup-B81hAh7v.js} +1 -1
- package/storybook-static/assets/{DocsRenderer-JROSPFPF-D9Q0E_vf.js → DocsRenderer-JROSPFPF-DWm72idc.js} +1 -1
- package/storybook-static/assets/{DropZone-B2dZiVu3.js → DropZone-1RJBvaFC.js} +1 -1
- package/storybook-static/assets/{DropZone-CR8PK3Rp.js → DropZone-DZRf8WwR.js} +1 -1
- package/storybook-static/assets/{DropZone.stories-CataGZLZ.js → DropZone.stories-D1XK6U6E.js} +1 -1
- package/storybook-static/assets/{DropdownMenu-DAnsQ9PI.js → DropdownMenu-BSRQUQ4l.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel-DuZ6NLWa.js → ExpandableActionPanel-DgeVn8wz.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel.stories-bKvag1gO.js → ExpandableActionPanel.stories-C9Rhq3ki.js} +1 -1
- package/storybook-static/assets/{Flex-DFcgFGJZ.js → Flex-DaZWQHPt.js} +1 -1
- package/storybook-static/assets/{Flex.stories-cOAzXtsN.js → Flex.stories-Bs__SjCv.js} +1 -1
- package/storybook-static/assets/{FloatingPopover-CwPP05Qm.js → FloatingPopover-Z028tMRL.js} +1 -1
- package/storybook-static/assets/{FormattedTableCell-XPNUhRyJ.js → FormattedTableCell-BQg_ZMEh.js} +1 -1
- package/storybook-static/assets/{Grid-DdKkwBkV.js → Grid-CnX_bhEG.js} +1 -1
- package/storybook-static/assets/{Grid.stories-Cr9eY2C6.js → Grid.stories-B7jXD20g.js} +1 -1
- package/storybook-static/assets/{ImageCropper.stories-Def1mCol.js → ImageCropper.stories-1DjfXXxs.js} +1 -1
- package/storybook-static/assets/{ImageRenderer-DysRIhjH.js → ImageRenderer-DI9hvpAc.js} +1 -1
- package/storybook-static/assets/{ImageRenderer.stories-BFe5UBD3.js → ImageRenderer.stories-B27u6j14.js} +1 -1
- package/storybook-static/assets/{ImageView.stories-DGjHFUCW.js → ImageView.stories-BM0aNseh.js} +1 -1
- package/storybook-static/assets/{ImageViewer.stories-Dk1I5YGg.js → ImageViewer.stories-C5wouJNn.js} +2 -2
- package/storybook-static/assets/{ImageViewerRuntime-BKfV4NV9.js → ImageViewerRuntime-CW0NRJa4.js} +1 -1
- package/storybook-static/assets/{Input-DtcFWWds.js → Input-C2bvv3jL.js} +1 -1
- package/storybook-static/assets/{Input-BFXAe1as.js → Input-C7XSD_dt.js} +1 -1
- package/storybook-static/assets/{Input.stories-CpwoNxxv.js → Input.stories-BbuxMsTz.js} +1 -1
- package/storybook-static/assets/{InputDateTime-BMEvNqbt.js → InputDateTime-2nXK3nym.js} +1 -1
- package/storybook-static/assets/{InputDateTime.stories-ByxnS0JK.js → InputDateTime.stories-BbNtupBI.js} +1 -1
- package/storybook-static/assets/{InputFile-wHj1G0K_.js → InputFile-BEkTqx8y.js} +1 -1
- package/storybook-static/assets/{InputFile-DCaDNfR3.js → InputFile-COZCRhFO.js} +1 -1
- package/storybook-static/assets/{InputFile.stories-O0HClDo5.js → InputFile.stories-Cu8n9jPc.js} +1 -1
- package/storybook-static/assets/{InputFiles-CSEhHMIe.js → InputFiles-D4UX-p-O.js} +1 -1
- package/storybook-static/assets/{InputFiles-D35RELcQ.js → InputFiles-Fqt7W6Sx.js} +1 -1
- package/storybook-static/assets/{InputFiles.stories-BM5huMud.js → InputFiles.stories-AQFSxEo-.js} +1 -1
- package/storybook-static/assets/{InputFilesList-CMP06qCR.js → InputFilesList-Dl9kpcb-.js} +1 -1
- package/storybook-static/assets/{InputImage-DR3lem4d.js → InputImage-By2cPpXy.js} +1 -1
- package/storybook-static/assets/{InputImage-9V40RTa1.js → InputImage-OFDcbwsC.js} +1 -1
- package/storybook-static/assets/{InputImage.stories-3p4wIsx2.js → InputImage.stories-CSnV2rMp.js} +1 -1
- package/storybook-static/assets/{InteractiveComponents-UCdkYhm_.js → InteractiveComponents-K3FQ5oIY.js} +1 -1
- package/storybook-static/assets/{InteractiveComponents.stories-DHAyWLQS.js → InteractiveComponents.stories-B31U1CpF.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-BgT7G4ma.js → LayoutPicker-Cmw9sDIb.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-Cny9sdje.js → LayoutPicker-RN42vmef.js} +1 -1
- package/storybook-static/assets/{LayoutPicker.stories-BffVzFE3.js → LayoutPicker.stories-C5nHgi9s.js} +1 -1
- package/storybook-static/assets/{Listbox-e1H0ycNL.js → Listbox-DlD8gsbi.js} +1 -1
- package/storybook-static/assets/{Listbox-DbjOtbHJ.js → Listbox-apRjZaS-.js} +1 -1
- package/storybook-static/assets/{Listbox.stories-C-7M0NPc.js → Listbox.stories-Ccfez6pD.js} +1 -1
- package/storybook-static/assets/{Modal-B9h3Ej1x.js → Modal-C7tZEU45.js} +1 -1
- package/storybook-static/assets/{Modal-Fg7rShcN.js → Modal-DsUFnBz_.js} +1 -1
- package/storybook-static/assets/{Modal.stories-g7SyoFva.js → Modal.stories-C7z4-Upz.js} +1 -1
- package/storybook-static/assets/{ModalManagerProvider-B40clYpj.js → ModalManagerProvider-CFSyB9oN.js} +1 -1
- package/storybook-static/assets/{MultiSelect-C3GrIqyw.js → MultiSelect-GKFkNsBv.js} +1 -1
- package/storybook-static/assets/{MultiSelect-D2rVfYvj.js → MultiSelect-hG56GrpU.js} +1 -1
- package/storybook-static/assets/{MultiSelect.stories-CK2MGpy3.js → MultiSelect.stories-DDy2bmb6.js} +1 -1
- package/storybook-static/assets/{NoData-B09YwDXB.js → NoData-BMwLVlW7.js} +1 -1
- package/storybook-static/assets/{NotificationsHost-BIyd1XQ0.css → NotificationsHost-DCKHZfJv.css} +1 -1
- package/storybook-static/assets/{NotificationsHost-3CgfRj3q.js → NotificationsHost-svZxowAr.js} +1 -1
- package/storybook-static/assets/{NotificationsHost.stories-BK0dMEEz.js → NotificationsHost.stories-jyHqSHpV.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect-Dl5xqk1Z.js → ODataMultiSelect-CDZl1LYK.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect.stories-Tn93axED.js → ODataMultiSelect.stories-BRV8hqOa.js} +1 -1
- package/storybook-static/assets/{ODataSelect-YCj9sEMa.js → ODataSelect-CH_KEIgG.js} +1 -1
- package/storybook-static/assets/{ODataSelect.stories-D6tp-kS4.js → ODataSelect.stories-CdJ4ueMz.js} +1 -1
- package/storybook-static/assets/{ODataTreeMultiSelect-DoaU-tJA.js → ODataTreeMultiSelect-DoDprp2D.js} +1 -1
- package/storybook-static/assets/{ODataTreeMultiSelect.stories-925q4w82.js → ODataTreeMultiSelect.stories-BBa6dAWY.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect-CU_VbP21.js → ODataTreeSelect-jBq76QJv.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect.stories-qoy6w0vz.js → ODataTreeSelect.stories-B0kASy4Q.js} +1 -1
- package/storybook-static/assets/{OneStepScroller-By9e1XzD.js → OneStepScroller-DgK5zRf5.js} +1 -1
- package/storybook-static/assets/{Option-Dvw-iDfN.js → Option-C0S3Jhd2.js} +1 -1
- package/storybook-static/assets/{OptionButton-DbVcZv-4.js → OptionButton-Bw4h_7Fd.js} +1 -1
- package/storybook-static/assets/{PeriodSelect-COcQwYAW.js → PeriodSelect-BUZlKThq.js} +1 -1
- package/storybook-static/assets/{PeriodSelect-Kyfe-W7E.js → PeriodSelect-iAqhhTCd.js} +1 -1
- package/storybook-static/assets/{PeriodSelect.stories-fa-l7xQY.js → PeriodSelect.stories-Cqu2cvpS.js} +1 -1
- package/storybook-static/assets/{PickerField-WQW5TWKe.js → PickerField-kCraJolS.js} +1 -1
- package/storybook-static/assets/{PickerTriggerActions-CbMHBgQK.js → PickerTriggerActions-DCrbv85j.js} +1 -1
- package/storybook-static/assets/{Popover-DTdPapkC.js → Popover-CAobkmJT.js} +1 -1
- package/storybook-static/assets/{Popover-COez4SIj.js → Popover-D2M0JiO7.js} +1 -1
- package/storybook-static/assets/{Popover.stories-sjJR8CnE.js → Popover.stories-BWrN-v1w.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-C62eAz7l.js → PresetRangeDateInput-BrsrppQR.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-6me4uHFs.js → PresetRangeDateInput-BskW--2E.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput.stories-Br_yU3Ng.js → PresetRangeDateInput.stories-B4cQ8O68.js} +1 -1
- package/storybook-static/assets/{PresetSelect-275H0H89.js → PresetSelect-DEOf0a4I.js} +1 -1
- package/storybook-static/assets/{README-BLmp5AK-.js → README-77pVTGG0.js} +1 -1
- package/storybook-static/assets/{README-AHTxoXqN.js → README-BDZ-UeI_.js} +1 -1
- package/storybook-static/assets/{README-FG3lkpPM.js → README-BRy5W4qi.js} +1 -1
- package/storybook-static/assets/{README-VJSXs98c.js → README-BVm2h5gQ.js} +1 -1
- package/storybook-static/assets/{README-D9l_g7Ge.js → README-BWG_J-15.js} +1 -1
- package/storybook-static/assets/{README-Bqk40Jsg.js → README-BZkpUcN4.js} +1 -1
- package/storybook-static/assets/{README-fm14rgWm.js → README-BbqX48ZX.js} +1 -1
- package/storybook-static/assets/{README-D8lcDR8i.js → README-Bczkeo4S.js} +1 -1
- package/storybook-static/assets/{README-BAGUKb72.js → README-BedW-6Qh.js} +1 -1
- package/storybook-static/assets/{README-BkfmHxkT.js → README-BkqBbuZP.js} +1 -1
- package/storybook-static/assets/{README-DjFkip3F.js → README-BlP3CzTg.js} +1 -1
- package/storybook-static/assets/{README-U5P_Qfha.js → README-C04l6A_V.js} +1 -1
- package/storybook-static/assets/{README-BnvGRF97.js → README-C2j_R02h.js} +1 -1
- package/storybook-static/assets/{README-DcroN207.js → README-C5ESwpCt.js} +1 -1
- package/storybook-static/assets/{README-ByXJBBLe.js → README-CJ-L25gm.js} +1 -1
- package/storybook-static/assets/{README-z2a0BFB7.js → README-CKYbHRQu.js} +1 -1
- package/storybook-static/assets/{README-CEZwcqKJ.js → README-CLKKSnvI.js} +1 -1
- package/storybook-static/assets/{README-xj8ZcFN_.js → README-CPB57-BD.js} +1 -1
- package/storybook-static/assets/{README-CXCoAa_s.js → README-CPE-B9NJ.js} +1 -1
- package/storybook-static/assets/{README-BU4GvwDx.js → README-CRfW_mwG.js} +1 -1
- package/storybook-static/assets/{README-KGbjINS-.js → README-CUXxO9Db.js} +1 -1
- package/storybook-static/assets/{README-CYPmjRFc.js → README-CXhg-Avp.js} +1 -1
- package/storybook-static/assets/{README-Cl2JDJwR.js → README-CZdf7Jyj.js} +1 -1
- package/storybook-static/assets/{README-vIOuZztv.js → README-CcYawVkC.js} +1 -1
- package/storybook-static/assets/{README-D_dhjAuM.js → README-CdRI75Jm.js} +1 -1
- package/storybook-static/assets/{README-CG4bzKEk.js → README-ChM2WYvT.js} +1 -1
- package/storybook-static/assets/{README-8e7hAORz.js → README-CjDR0DCT.js} +1 -1
- package/storybook-static/assets/{README-HxNdhw30.js → README-Cr5pvD2a.js} +1 -1
- package/storybook-static/assets/{README-DpHCAH8n.js → README-CrSfz44u.js} +1 -1
- package/storybook-static/assets/{README-DE1MFGI5.js → README-CtBT6KJo.js} +1 -1
- package/storybook-static/assets/{README-cwxz4vxf.js → README-CwOlh0x_.js} +1 -1
- package/storybook-static/assets/{README-Bq9V0yp2.js → README-D5Wgm_6F.js} +1 -1
- package/storybook-static/assets/{README-DBk7lXZ4.js → README-DEB7jN2G.js} +1 -1
- package/storybook-static/assets/{README-CzIxocJp.js → README-DEYu86HB.js} +1 -1
- package/storybook-static/assets/{README-B2jjZz8T.js → README-DGnQ3O8r.js} +1 -1
- package/storybook-static/assets/{README-qVVMp3YT.js → README-DL8HYHzC.js} +1 -1
- package/storybook-static/assets/{README-BhuXobjb.js → README-DOju-G9e.js} +1 -1
- package/storybook-static/assets/{README-DIkHdayR.js → README-DOpYTKui.js} +1 -1
- package/storybook-static/assets/{README-DE12CWEl.js → README-DYHYOkUz.js} +1 -1
- package/storybook-static/assets/{README-7Rys0Xvj.js → README-Dh4uSHUd.js} +1 -1
- package/storybook-static/assets/{README-zJ9ztIBo.js → README-DjPRryHg.js} +1 -1
- package/storybook-static/assets/{README-Dq0t0Bd5.js → README-DzhqH1NW.js} +1 -1
- package/storybook-static/assets/{README-8mn3k45N.js → README-DzzON1ye.js} +1 -1
- package/storybook-static/assets/{README-CmdvX3sa.js → README-FC7XUYVa.js} +1 -1
- package/storybook-static/assets/{README-D_REgwe1.js → README-HfXKFrXY.js} +1 -1
- package/storybook-static/assets/{README-DKUA63di.js → README-PYQ__oB1.js} +1 -1
- package/storybook-static/assets/{README-bbZ6UPPN.js → README-UBWohyzP.js} +1 -1
- package/storybook-static/assets/{README-DJJxMwuW.js → README-Weoeni8A.js} +1 -1
- package/storybook-static/assets/{README-CbDOXh9j.js → README-eoM28QGj.js} +1 -1
- package/storybook-static/assets/{README-xT039tr2.js → README-h_Ia4l0F.js} +1 -1
- package/storybook-static/assets/{README-wHZbSx37.js → README-pJNBrsHp.js} +1 -1
- package/storybook-static/assets/{README-Dbx7rzTN.js → README-tEKPrWDG.js} +1 -1
- package/storybook-static/assets/{README-CVjqkzkt.js → README-tneYNBR2.js} +1 -1
- package/storybook-static/assets/{RadioButton-6-l_LibF.js → RadioButton-C_7MrkSd.js} +1 -1
- package/storybook-static/assets/{RadioButton-Lsam9r1S.js → RadioButton-zjLDV_vA.js} +1 -1
- package/storybook-static/assets/{RadioButton.stories-xHJqsjQv.js → RadioButton.stories-C81aMJWs.js} +1 -1
- package/storybook-static/assets/{RadioGroup-DzyyTDRs.js → RadioGroup-BmMpfAxw.js} +1 -1
- package/storybook-static/assets/{RadioGroup-CNUN9IEh.js → RadioGroup-G1nrB231.js} +1 -1
- package/storybook-static/assets/{RadioGroup.stories-CYjc1cbD.js → RadioGroup.stories-U8Q6ChKN.js} +1 -1
- package/storybook-static/assets/{Scrollable-Afl8grrC.js → Scrollable-7F5dqi9H.js} +1 -1
- package/storybook-static/assets/{Select-CA3QxZeD.js → Select-CEfw0HMD.js} +1 -1
- package/storybook-static/assets/{Select-UEy62gYi.js → Select-Cr6CgIIx.js} +1 -1
- package/storybook-static/assets/{Select.stories-BmJI6nHh.js → Select.stories-DgA0I8m1.js} +1 -1
- package/storybook-static/assets/{SerializableSelect-RckIAJAT.js → SerializableSelect-CQyHtiSK.js} +1 -1
- package/storybook-static/assets/{SerializableSelect.stories-C9M-vuD3.js → SerializableSelect.stories-Dj0qXUbg.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput-Dp42qzob.js → SingleDateTimeInput-C96e9Bnk.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput-Cg9m7yA1.js → SingleDateTimeInput-k6cU5HTO.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput.stories-BgixhBI_.js → SingleDateTimeInput.stories-DW1owBoF.js} +1 -1
- package/storybook-static/assets/{Slider-DgIgYtB4.js → Slider-B1T2FRiM.js} +1 -1
- package/storybook-static/assets/{Slider-B2geo_Fd.js → Slider-Bq2uMF2q.js} +1 -1
- package/storybook-static/assets/{Slider.stories-C-YvP972.js → Slider.stories-VjnPqsrP.js} +1 -1
- package/storybook-static/assets/{SliderInput-DOnJtm2g.js → SliderInput-BeAfEJOt.js} +1 -1
- package/storybook-static/assets/{SliderInput-C1QgoO1J.js → SliderInput-DJpNIGZl.js} +1 -1
- package/storybook-static/assets/{SliderInput.stories-CJey90DY.js → SliderInput.stories-DBlgmZyR.js} +1 -1
- package/storybook-static/assets/{Sortable-DDBO_hqj.js → Sortable-4hmW6aYf.js} +1 -1
- package/storybook-static/assets/{Sortable.stories-xMPLknxy.js → Sortable.stories-BQ8KVECH.js} +1 -1
- package/storybook-static/assets/{Splitter-bD4p-3Fx.js → Splitter-08NDE539.js} +2 -1
- package/storybook-static/assets/Splitter.stories-DOVSidH9.js +39 -0
- package/storybook-static/assets/{StateSelect-D7RurgM4.js → StateSelect-CIbsxjVP.js} +1 -1
- package/storybook-static/assets/{StateSelect-CJisZ75P.js → StateSelect-DNu5sYFr.js} +1 -1
- package/storybook-static/assets/{StateSelect.stories-Cu3R4a5p.js → StateSelect.stories-BrgfGby7.js} +1 -1
- package/storybook-static/assets/{StatusIndicator-7ACyA6qA.js → StatusIndicator-BAJHtEXU.js} +1 -1
- package/storybook-static/assets/{StatusIndicator.stories-D_hqufXI.js → StatusIndicator.stories-ELJXgKGF.js} +1 -1
- package/storybook-static/assets/{StringToggle.stories-CTppQnWk.js → StringToggle.stories-Bp4AH2PM.js} +1 -1
- package/storybook-static/assets/{Switch-BSVo5kAt.js → Switch-CEMTONNK.js} +1 -1
- package/storybook-static/assets/{Switch-Bl_9IGx4.js → Switch-Dp2mfJMY.js} +1 -1
- package/storybook-static/assets/{Switch.stories-CBT__YqC.js → Switch.stories-CxSCdM1U.js} +1 -1
- package/storybook-static/assets/{Table-BJGoRvj5.js → Table-DFenIYxk.js} +1 -1
- package/storybook-static/assets/{Table.stories-BOwsxbtY.js → Table.stories-D4hfPD50.js} +1 -1
- package/storybook-static/assets/{TableEditor.stories-BeDbhMh1.js → TableEditor.stories-FUN04jRt.js} +1 -1
- package/storybook-static/assets/{Tabs-CXHaeEqC.js → Tabs-DQITegdm.js} +1 -1
- package/storybook-static/assets/{Tabs.stories-CMpmgyRO.js → Tabs.stories-iOhYWtXS.js} +1 -1
- package/storybook-static/assets/{TabsBox-Bj5o7Ys2.js → TabsBox-Cu2hSQ0_.js} +1 -1
- package/storybook-static/assets/{TagInput-rFG9obaw.js → TagInput-BSHH7VHG.js} +1 -1
- package/storybook-static/assets/{TagInput.stories-BnTVzVqp.js → TagInput.stories-CMvjjSGz.js} +1 -1
- package/storybook-static/assets/{Text-DfsWX_x6.js → Text-BSnmJ5Rc.js} +1 -1
- package/storybook-static/assets/{Textarea-DIl-A4Pp.js → Textarea-BURqjbfm.js} +1 -1
- package/storybook-static/assets/{Textarea-f6RslxP3.js → Textarea-DCko2hh9.js} +1 -1
- package/storybook-static/assets/{Textarea.stories-BMqL3Qdx.js → Textarea.stories-D9bD-zxp.js} +1 -1
- package/storybook-static/assets/{TimePanel-rC3jFZLs.js → TimePanel-ZM6IEZ23.js} +1 -1
- package/storybook-static/assets/{TimePanel.stories-BmTNiii6.js → TimePanel.stories-BPFzdjrk.js} +1 -1
- package/storybook-static/assets/{Toggle-8rFndl2i.js → Toggle-BGYpWyl-.js} +1 -1
- package/storybook-static/assets/{Toggle-BrmolSoJ.js → Toggle-Co-9WIQM.js} +1 -1
- package/storybook-static/assets/{Toggle.stories-mHhmqXT8.js → Toggle.stories-DH28lc09.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-DJNnzIpX.js → TreeMultiSelect-BiNv5d9H.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-BVAnElHq.js → TreeMultiSelect-DbqIa68V.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect.stories-aL7q0jgU.js → TreeMultiSelect.stories-CBbmYs0g.js} +1 -1
- package/storybook-static/assets/{TreePickerBase-D_-u930P.js → TreePickerBase-DtDat39S.js} +1 -1
- package/storybook-static/assets/{TreeSelect-nhpQUhZK.js → TreeSelect-BWHuf3sH.js} +1 -1
- package/storybook-static/assets/{TreeSelect-CfG80lYO.js → TreeSelect-tQtWX3eZ.js} +1 -1
- package/storybook-static/assets/{TreeSelect.stories-D791KJfH.js → TreeSelect.stories-BFefku3r.js} +1 -1
- package/storybook-static/assets/{TreeTable-BZcyJY3B.js → TreeTable-ZOKoR3S8.js} +1 -1
- package/storybook-static/assets/{TreeTable.stories-YYiqgvEq.js → TreeTable.stories-jWFBqYVA.js} +1 -1
- package/storybook-static/assets/{blocks-lxxDAhrL.js → blocks-CkyPJxFn.js} +3 -3
- package/storybook-static/assets/{check-B0scNMTY.js → check-DuSyNDf0.js} +1 -1
- package/storybook-static/assets/{chevron-down-B7tmrwag.js → chevron-down-T_Hptvkv.js} +1 -1
- package/storybook-static/assets/{chevron-left-OXil6ftq.js → chevron-left-BcH0yrC3.js} +1 -1
- package/storybook-static/assets/{chevron-right-BYE3SqR7.js → chevron-right-Dk1ulWkk.js} +1 -1
- package/storybook-static/assets/{chunk-W22LQPXL-Ds_n2qcj.js → chunk-W22LQPXL-CdmMdLH3.js} +1 -1
- package/storybook-static/assets/{circle-alert-BKfsUJm3.js → circle-alert-CiZtyFLl.js} +1 -1
- package/storybook-static/assets/{circle-check-BecGvbHE.js → circle-check-N8FNJhb5.js} +1 -1
- package/storybook-static/assets/{components-DcivUbsT.js → components-BuQ4azTo.js} +3 -3
- package/storybook-static/assets/{contextMenu-vgpsabAU.js → contextMenu-ChdzMmup.js} +1 -1
- package/storybook-static/assets/{download-h7VrZA9l.js → download-CEAUuG15.js} +1 -1
- package/storybook-static/assets/{floating-ui.react-6Kxlwyug.js → floating-ui.react-DO4IuDDt.js} +1 -1
- package/storybook-static/assets/{foundationApi-B--Yjp6p.js → foundationApi-D4_39zNT.js} +1 -1
- package/storybook-static/assets/{foundationLib-BmTCjIFu.js → foundationLib-D36HDBKZ.js} +1 -1
- package/storybook-static/assets/{hooks-BtPq0Zm_.js → hooks-DaCAWteV.js} +1 -1
- package/storybook-static/assets/{iframe-fj7stVsl.js → iframe-C3wMnNgT.js} +3 -3
- package/storybook-static/assets/iframe-VKLQYnIk.js +1 -0
- package/storybook-static/assets/{info-Dv9WaTsz.js → info-CgD0dwe7.js} +1 -1
- package/storybook-static/assets/{odata-DNfOcaBc.js → odata-DuWK9X6F.js} +1 -1
- package/storybook-static/assets/{odataStoryFixtures-vIhpk8HL.js → odataStoryFixtures-BlYK5gCH.js} +1 -1
- package/storybook-static/assets/{react-3IZ-AxEQ.js → react-6aa8UN0d.js} +1 -1
- package/storybook-static/assets/{refresh-cw-Bk7hhiPK.js → refresh-cw-C-kY50XM.js} +1 -1
- package/storybook-static/assets/{settings-2-C4SVcEFw.js → settings-2-Lw5jPpcm.js} +1 -1
- package/storybook-static/assets/{sortable-DC-jRGyW.js → sortable-BMxBXOba.js} +1 -1
- package/storybook-static/assets/{syntaxhighlighter-QEQV7K2Y-d59JKAVY.js → syntaxhighlighter-QEQV7K2Y-C6nhsm5S.js} +1 -1
- package/storybook-static/assets/{trash-2-BTmh7oxs.js → trash-2-DDRTzebt.js} +1 -1
- package/storybook-static/assets/{triangle-alert-XfAmMaQ8.js → triangle-alert--SWMyXwt.js} +1 -1
- package/storybook-static/assets/{useODataSelectBase-DZiVpwgH.js → useODataSelectBase-B_3Zl3-d.js} +1 -1
- package/storybook-static/assets/{useODataTreeData-D2Z6_Lkd.js → useODataTreeData-D5U-f8-Y.js} +1 -1
- package/storybook-static/assets/{usePickerQuery-Bj_EX3VH.js → usePickerQuery-BQ85tBVK.js} +1 -1
- package/storybook-static/assets/{usePickerTriggerController-v3hTkFED.js → usePickerTriggerController-DUaswv5t.js} +1 -1
- package/storybook-static/assets/{x-BXJ84ZOC.js → x-B4c2IwTW.js} +1 -1
- package/storybook-static/iframe.html +2 -2
- package/storybook-static/project.json +1 -1
- package/storybook-static/assets/Splitter.stories-D_IpnFJV.js +0 -39
- package/storybook-static/assets/iframe-NDI_oDFH.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/notifications/model/NotificationsProvider.tsx","../../src/notifications/ui/Notification.module.scss","../../src/notifications/ui/NotificationsHost.tsx"],"sourcesContent":["/* eslint-disable react-refresh/only-export-components */\nimport { createContext, PropsWithChildren, useContext, useEffect, useMemo } from \"react\";\n\nimport { createMissingContextError } from \"@ryuzaki13/react-foundation-lib/error\";\nimport {\n\tbindNotifications,\n\tcreateNotificationsStore,\n\tNotificationId,\n\tNotificationPushInput,\n\tNotificationsStoreApi,\n\tNotificationType\n} from \"@ryuzaki13/react-foundation-lib/notifications\";\nimport { useStore } from \"zustand\";\n\nconst NotificationsContext = createContext<NotificationsStoreApi | null>(null);\n\n/**\n * Провайдер уведомлений приложения. Хранит состояние списка уведомлений и предоставляет хуки доступа к нему.\n */\nexport function NotificationsProvider({ children }: PropsWithChildren) {\n\tconst store = useMemo(() => createNotificationsStore(), []);\n\n\tuseEffect(() => {\n\t\treturn bindNotifications(store);\n\t}, [store]);\n\n\treturn <NotificationsContext.Provider value={store}>{children}</NotificationsContext.Provider>;\n}\n\nfunction useNotificationApi() {\n\tconst ctx = useContext(NotificationsContext);\n\tif (!ctx) {\n\t\tthrow createMissingContextError({\n\t\t\thookName: \"useNotificationApi\",\n\t\t\tproviderName: \"NotificationsProvider\"\n\t\t});\n\t}\n\treturn ctx;\n}\n\nexport function useNotifications() {\n\tconst api = useNotificationApi();\n\treturn useStore(api, (s) => s.items);\n}\n\nexport function useNotify() {\n\tconst api = useNotificationApi();\n\tconst actions = useStore(api, (s) => s.actions);\n\n\tconst mk = (type: NotificationType) => (message: string, opts?: Omit<NotificationPushInput, \"type\" | \"message\">) =>\n\t\tactions.push({ type, message, ...opts });\n\n\treturn {\n\t\t...actions,\n\t\tsuccess: mk(\"success\"),\n\t\tinfo: mk(\"info\"),\n\t\twarning: mk(\"warning\"),\n\t\terror: mk(\"error\")\n\t};\n}\n\nexport function useNotificationById(id: NotificationId) {\n\tconst api = useNotificationApi();\n\treturn useStore(api, (s) => s.items.find((n) => n.id === id));\n}\n","@use \"@/styles/mixins\" as *;\n@use \"@/styles/tone-derived\" as toneDerived;\n\n.container {\n\tposition: fixed;\n\tz-index: var(--z-notify);\n\tbottom: 0;\n\tleft: 0;\n\tdisplay: grid;\n\tgap: var(--space-sm);\n\tpadding: var(--space-lg);\n\twidth: min(28em, calc(100dvw - var(--space-lg) * 2));\n\tpointer-events: none;\n}\n\n.card {\n\t--notify-accent: var(--border-1);\n\t--notify-accent-surface: var(--surface-1);\n\t--notify-accent-text: var(--accent-text);\n\n\tposition: relative;\n\toverflow: hidden;\n\tpointer-events: auto;\n\twidth: 100%;\n\tpadding: var(--space-md);\n\t// border: var(--border);\n\tborder-left: 0.3125em solid var(--notify-accent);\n\tborder-radius: var(--radius-md);\n\tbackground: linear-gradient(37deg, var(--notify-accent-surface), var(--surface-0));\n\tcolor: var(--content-0);\n\tbox-shadow: var(--shadow-md);\n}\n\n.info {\n\t--notify-accent: var(--info-border);\n\t@include toneDerived.tone-soft-declaration(\"--notify-accent-surface\", \"info\");\n\t--notify-accent-text: var(--info-text);\n}\n\n.success {\n\t--notify-accent: var(--success-border);\n\t@include toneDerived.tone-soft-declaration(\"--notify-accent-surface\", \"success\");\n\t--notify-accent-text: var(--success-text);\n}\n\n.warning {\n\t--notify-accent: var(--warning-border);\n\t@include toneDerived.tone-soft-declaration(\"--notify-accent-surface\", \"warning\");\n\t--notify-accent-text: var(--warning-text);\n}\n\n.error {\n\t--notify-accent: var(--error-border);\n\t@include toneDerived.tone-soft-declaration(\"--notify-accent-surface\", \"error\");\n\t--notify-accent-text: var(--error-text);\n}\n\n.header,\n.content,\n.copy {\n\tmin-width: 0;\n}\n\n.content {\n\tmin-width: 0;\n\tflex: 1;\n}\n\n.icon {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tflex-shrink: 0;\n\twidth: var(--control-height);\n\theight: var(--control-height);\n\tborder-radius: 50%;\n\tbackground-color: var(--notify-accent-surface);\n\tcolor: var(--notify-accent-text);\n\tborder: var(--border-width) solid color-mix(in srgb, var(--notify-accent) 22%, transparent);\n\n\tsvg {\n\t\twidth: 1.125em;\n\t\theight: 1.125em;\n\t}\n}\n\n.kicker {\n\tmargin-bottom: var(--space-xs);\n\tcolor: var(--notify-accent-text);\n\tfont-size: var(--font-size-xs);\n\tfont-weight: 600;\n\tfont-variation-settings: \"wght\" 600;\n\tletter-spacing: 0.04em;\n\ttext-transform: uppercase;\n}\n\n.title {\n\tcolor: var(--notify-accent-text);\n\tfont-weight: 600;\n\tfont-variation-settings: \"wght\" 600;\n}\n\n.message {\n\tmargin-top: var(--space-xs);\n\tcolor: var(--content-0);\n\twhite-space: pre-wrap;\n\tword-break: break-word;\n}\n\n.actions {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: var(--space-xs);\n\tmargin-top: var(--space-sm);\n}\n\n@include mobile {\n\t.container {\n\t\tpadding: var(--space-md);\n\t\twidth: min(100dvw, calc(100dvw - var(--space-md) * 2));\n\t}\n}\n","import { NotificationType } from \"@ryuzaki13/react-foundation-lib/notifications\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { AlertCircleIcon, CheckCircle2Icon, InfoIcon, TriangleAlertIcon, XIcon } from \"lucide-react\";\n\nimport { Button } from \"../../button\";\nimport { FlexContainer } from \"../../flex\";\nimport { useNotifications, useNotify } from \"../model/NotificationsProvider\";\n\nimport styles from \"./Notification.module.scss\";\n\nconst notificationConfig: Record<\n\tNotificationType,\n\t{\n\t\ttitle: string;\n\t\tIcon: typeof InfoIcon;\n\t}\n> = {\n\tinfo: {\n\t\ttitle: \"Информация\",\n\t\tIcon: InfoIcon\n\t},\n\tsuccess: {\n\t\ttitle: \"Успешно\",\n\t\tIcon: CheckCircle2Icon\n\t},\n\twarning: {\n\t\ttitle: \"Предупреждение\",\n\t\tIcon: TriangleAlertIcon\n\t},\n\terror: {\n\t\ttitle: \"Ошибка\",\n\t\tIcon: AlertCircleIcon\n\t}\n};\n\n/**\n * Хост для визуального отображения очереди уведомлений.\n * Обычно монтируется один раз на уровне приложения рядом с провайдером уведомлений.\n */\nexport function NotificationsHost() {\n\tconst items = useNotifications();\n\tconst { dismiss } = useNotify();\n\n\treturn (\n\t\t<div className={styles.container} aria-label=\"Область уведомлений\" aria-live=\"polite\" aria-relevant=\"additions text\">\n\t\t\t{items.map((notification) => {\n\t\t\t\tconst config = notificationConfig[notification.type];\n\t\t\t\tconst title = notification.title ?? config.title;\n\t\t\t\tconst Icon = config.Icon;\n\n\t\t\t\treturn (\n\t\t\t\t\t<article\n\t\t\t\t\t\tkey={notification.id}\n\t\t\t\t\t\trole={notification.type === \"error\" ? \"alert\" : \"status\"}\n\t\t\t\t\t\taria-atomic=\"true\"\n\t\t\t\t\t\tclassName={cn(styles.card, styles[notification.type])}>\n\t\t\t\t\t\t<FlexContainer align=\"start\" justify=\"between\" gap=\"sm\" className={styles.header}>\n\t\t\t\t\t\t\t<FlexContainer align=\"start\" gap=\"sm\" className={styles.content}>\n\t\t\t\t\t\t\t\t<span className={styles.icon} aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t<Icon />\n\t\t\t\t\t\t\t\t</span>\n\n\t\t\t\t\t\t\t\t<div className={styles.copy}>\n\t\t\t\t\t\t\t\t\t<div className={styles.kicker}>{config.title}</div>\n\t\t\t\t\t\t\t\t\t{notification.title ? <div className={styles.title}>{title}</div> : null}\n\t\t\t\t\t\t\t\t\t<div className={styles.message}>{notification.message}</div>\n\n\t\t\t\t\t\t\t\t\t{notification.actions?.length ? (\n\t\t\t\t\t\t\t\t\t\t<div className={styles.actions}>\n\t\t\t\t\t\t\t\t\t\t\t{notification.actions.map((action) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={action.label}\n\t\t\t\t\t\t\t\t\t\t\t\t\ttone={action.tone ?? notification.type}\n\t\t\t\t\t\t\t\t\t\t\t\t\tappearance=\"outline\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tdata-ui=\"notification-action-button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tdata-action=\"notification-action\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => void action.onClick()}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{action.label}\n\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</FlexContainer>\n\n\t\t\t\t\t\t\t{notification.dismissible !== false ? (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\ticon={<XIcon />}\n\t\t\t\t\t\t\t\t\tappearance=\"ghost\"\n\t\t\t\t\t\t\t\t\ttone={notification.type}\n\t\t\t\t\t\t\t\t\tonClick={() => dismiss(notification.id)}\n\t\t\t\t\t\t\t\t\taria-label=\"Закрыть уведомление\"\n\t\t\t\t\t\t\t\t\tdata-ui=\"notification-dismiss-button\"\n\t\t\t\t\t\t\t\t\tdata-action=\"dismiss-notification\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</FlexContainer>\n\t\t\t\t\t</article>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/notifications/model/NotificationsProvider.tsx","../../src/notifications/ui/Notification.module.scss","../../src/notifications/ui/NotificationsHost.tsx"],"sourcesContent":["/* eslint-disable react-refresh/only-export-components */\nimport { createContext, PropsWithChildren, useContext, useEffect, useMemo } from \"react\";\n\nimport { createMissingContextError } from \"@ryuzaki13/react-foundation-lib/error\";\nimport {\n\tbindNotifications,\n\tcreateNotificationsStore,\n\tNotificationId,\n\tNotificationPushInput,\n\tNotificationsStoreApi,\n\tNotificationType\n} from \"@ryuzaki13/react-foundation-lib/notifications\";\nimport { useStore } from \"zustand\";\n\nconst NotificationsContext = createContext<NotificationsStoreApi | null>(null);\n\n/**\n * Провайдер уведомлений приложения. Хранит состояние списка уведомлений и предоставляет хуки доступа к нему.\n */\nexport function NotificationsProvider({ children }: PropsWithChildren) {\n\tconst store = useMemo(() => createNotificationsStore(), []);\n\n\tuseEffect(() => {\n\t\treturn bindNotifications(store);\n\t}, [store]);\n\n\treturn <NotificationsContext.Provider value={store}>{children}</NotificationsContext.Provider>;\n}\n\nfunction useNotificationApi() {\n\tconst ctx = useContext(NotificationsContext);\n\tif (!ctx) {\n\t\tthrow createMissingContextError({\n\t\t\thookName: \"useNotificationApi\",\n\t\t\tproviderName: \"NotificationsProvider\"\n\t\t});\n\t}\n\treturn ctx;\n}\n\nexport function useNotifications() {\n\tconst api = useNotificationApi();\n\treturn useStore(api, (s) => s.items);\n}\n\nexport function useNotify() {\n\tconst api = useNotificationApi();\n\tconst actions = useStore(api, (s) => s.actions);\n\n\tconst mk = (type: NotificationType) => (message: string, opts?: Omit<NotificationPushInput, \"type\" | \"message\">) =>\n\t\tactions.push({ type, message, ...opts });\n\n\treturn {\n\t\t...actions,\n\t\tsuccess: mk(\"success\"),\n\t\tinfo: mk(\"info\"),\n\t\twarning: mk(\"warning\"),\n\t\terror: mk(\"error\")\n\t};\n}\n\nexport function useNotificationById(id: NotificationId) {\n\tconst api = useNotificationApi();\n\treturn useStore(api, (s) => s.items.find((n) => n.id === id));\n}\n","@use \"@/styles/mixins\" as *;\n@use \"@/styles/tone-derived\" as toneDerived;\n\n.container {\n\tposition: fixed;\n\tz-index: var(--z-notify);\n\tbottom: 0;\n\tleft: 0;\n\tdisplay: grid;\n\tgap: var(--space-sm);\n\tpadding: var(--space-lg);\n\twidth: min(28em, calc(100dvw - var(--space-lg) * 2));\n\tpointer-events: none;\n}\n\n.card {\n\t--notify-accent: var(--border-1);\n\t--notify-accent-surface: var(--surface-1);\n\t--notify-accent-text: var(--accent-text);\n\n\tposition: relative;\n\toverflow: hidden;\n\tpointer-events: auto;\n\twidth: 100%;\n\tpadding: var(--space-md);\n\t// border: var(--border);\n\tborder-left: 0.3125em solid var(--notify-accent);\n\tborder-radius: var(--radius-md);\n\tbackground: linear-gradient(37deg, var(--notify-accent-surface), var(--surface-0));\n\tcolor: var(--content-0);\n\tbox-shadow: var(--shadow-md);\n}\n\n.info {\n\t--notify-accent: var(--info-border);\n\t@include toneDerived.tone-soft-declaration(\"--notify-accent-surface\", \"info\");\n\t--notify-accent-text: var(--info-text);\n}\n\n.success {\n\t--notify-accent: var(--success-border);\n\t@include toneDerived.tone-soft-declaration(\"--notify-accent-surface\", \"success\");\n\t--notify-accent-text: var(--success-text);\n}\n\n.warning {\n\t--notify-accent: var(--warning-border);\n\t@include toneDerived.tone-soft-declaration(\"--notify-accent-surface\", \"warning\");\n\t--notify-accent-text: var(--warning-text);\n}\n\n.error {\n\t--notify-accent: var(--error-border);\n\t@include toneDerived.tone-soft-declaration(\"--notify-accent-surface\", \"error\");\n\t--notify-accent-text: var(--error-text);\n}\n\n.header,\n.content,\n.copy {\n\tmin-width: 0;\n}\n\n.content {\n\tmin-width: 0;\n\tflex: 1;\n}\n\n.icon {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tflex-shrink: 0;\n\twidth: var(--control-height);\n\theight: var(--control-height);\n\tborder-radius: 50%;\n\tbackground-color: var(--notify-accent-surface);\n\tcolor: var(--notify-accent-text);\n\tborder: var(--border-width) solid color-mix(in srgb, var(--notify-accent) 22%, transparent);\n\n\tsvg {\n\t\twidth: 1.125em;\n\t\theight: 1.125em;\n\t}\n}\n\n.kicker {\n\tmargin-bottom: var(--space-xs);\n\tcolor: var(--notify-accent-text);\n\tfont-size: var(--font-size-xs);\n\tfont-weight: 600;\n\tfont-variation-settings: \"wght\" 600;\n\tletter-spacing: 0.04em;\n\ttext-transform: uppercase;\n}\n\n.title {\n\tcolor: var(--notify-accent-text);\n\tfont-weight: 600;\n\tfont-variation-settings: \"wght\" 600;\n}\n\n.message {\n\tmargin-top: var(--space-xs);\n\tcolor: var(--content-0);\n\twhite-space: pre-wrap;\n\tword-break: break-word;\n}\n\n.actions {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tgap: var(--space-xs);\n\tmargin-top: var(--space-sm);\n}\n\n@include mobile {\n\t.container {\n\t\tpadding: var(--space-md);\n\t\t// Контейнер занимает viewport целиком, а padding задаёт карточкам симметричные отступы от его краёв.\n\t\twidth: 100dvw;\n\t}\n}\n","import { NotificationType } from \"@ryuzaki13/react-foundation-lib/notifications\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { AlertCircleIcon, CheckCircle2Icon, InfoIcon, TriangleAlertIcon, XIcon } from \"lucide-react\";\n\nimport { Button } from \"../../button\";\nimport { FlexContainer } from \"../../flex\";\nimport { useNotifications, useNotify } from \"../model/NotificationsProvider\";\n\nimport styles from \"./Notification.module.scss\";\n\nconst notificationConfig: Record<\n\tNotificationType,\n\t{\n\t\ttitle: string;\n\t\tIcon: typeof InfoIcon;\n\t}\n> = {\n\tinfo: {\n\t\ttitle: \"Информация\",\n\t\tIcon: InfoIcon\n\t},\n\tsuccess: {\n\t\ttitle: \"Успешно\",\n\t\tIcon: CheckCircle2Icon\n\t},\n\twarning: {\n\t\ttitle: \"Предупреждение\",\n\t\tIcon: TriangleAlertIcon\n\t},\n\terror: {\n\t\ttitle: \"Ошибка\",\n\t\tIcon: AlertCircleIcon\n\t}\n};\n\n/**\n * Хост для визуального отображения очереди уведомлений.\n * Обычно монтируется один раз на уровне приложения рядом с провайдером уведомлений.\n */\nexport function NotificationsHost() {\n\tconst items = useNotifications();\n\tconst { dismiss } = useNotify();\n\n\treturn (\n\t\t<div className={styles.container} aria-label=\"Область уведомлений\" aria-live=\"polite\" aria-relevant=\"additions text\">\n\t\t\t{items.map((notification) => {\n\t\t\t\tconst config = notificationConfig[notification.type];\n\t\t\t\tconst title = notification.title ?? config.title;\n\t\t\t\tconst Icon = config.Icon;\n\n\t\t\t\treturn (\n\t\t\t\t\t<article\n\t\t\t\t\t\tkey={notification.id}\n\t\t\t\t\t\trole={notification.type === \"error\" ? \"alert\" : \"status\"}\n\t\t\t\t\t\taria-atomic=\"true\"\n\t\t\t\t\t\tclassName={cn(styles.card, styles[notification.type])}>\n\t\t\t\t\t\t<FlexContainer align=\"start\" justify=\"between\" gap=\"sm\" className={styles.header}>\n\t\t\t\t\t\t\t<FlexContainer align=\"start\" gap=\"sm\" className={styles.content}>\n\t\t\t\t\t\t\t\t<span className={styles.icon} aria-hidden=\"true\">\n\t\t\t\t\t\t\t\t\t<Icon />\n\t\t\t\t\t\t\t\t</span>\n\n\t\t\t\t\t\t\t\t<div className={styles.copy}>\n\t\t\t\t\t\t\t\t\t<div className={styles.kicker}>{config.title}</div>\n\t\t\t\t\t\t\t\t\t{notification.title ? <div className={styles.title}>{title}</div> : null}\n\t\t\t\t\t\t\t\t\t<div className={styles.message}>{notification.message}</div>\n\n\t\t\t\t\t\t\t\t\t{notification.actions?.length ? (\n\t\t\t\t\t\t\t\t\t\t<div className={styles.actions}>\n\t\t\t\t\t\t\t\t\t\t\t{notification.actions.map((action) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\t\t\t\t\tkey={action.label}\n\t\t\t\t\t\t\t\t\t\t\t\t\ttone={action.tone ?? notification.type}\n\t\t\t\t\t\t\t\t\t\t\t\t\tappearance=\"outline\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tdata-ui=\"notification-action-button\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tdata-action=\"notification-action\"\n\t\t\t\t\t\t\t\t\t\t\t\t\tonClick={() => void action.onClick()}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{action.label}\n\t\t\t\t\t\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t</FlexContainer>\n\n\t\t\t\t\t\t\t{notification.dismissible !== false ? (\n\t\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\t\ticon={<XIcon />}\n\t\t\t\t\t\t\t\t\tappearance=\"ghost\"\n\t\t\t\t\t\t\t\t\ttone={notification.type}\n\t\t\t\t\t\t\t\t\tonClick={() => dismiss(notification.id)}\n\t\t\t\t\t\t\t\t\taria-label=\"Закрыть уведомление\"\n\t\t\t\t\t\t\t\t\tdata-ui=\"notification-dismiss-button\"\n\t\t\t\t\t\t\t\t\tdata-action=\"dismiss-notification\"\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t) : null}\n\t\t\t\t\t\t</FlexContainer>\n\t\t\t\t\t</article>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n}\n"],"mappings":"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"}
|
|
@@ -6,9 +6,11 @@ export type SplitterProps = PropsWithChildren<{
|
|
|
6
6
|
initial?: number;
|
|
7
7
|
min?: number;
|
|
8
8
|
max?: number;
|
|
9
|
+
/** Сообщает итоговую долю первой панели после завершения drag или шага с клавиатуры. */
|
|
10
|
+
onChange?: (ratio: number) => void;
|
|
9
11
|
className?: string;
|
|
10
12
|
collapsedPane?: SplitterPane | null;
|
|
11
13
|
}>;
|
|
12
|
-
export declare function Splitter({ direction, initial, min, max, className, collapsedPane, children }: SplitterProps): string | number | bigint | Iterable<ReactNode> | Promise<string | number | bigint | boolean | import("react").ReactPortal | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | import("react").JSX.Element;
|
|
14
|
+
export declare function Splitter({ direction, initial, min, max, onChange, className, collapsedPane, children }: SplitterProps): string | number | bigint | Iterable<ReactNode> | Promise<string | number | bigint | boolean | import("react").ReactPortal | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | import("react").JSX.Element;
|
|
13
15
|
export {};
|
|
14
16
|
//# sourceMappingURL=Splitter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Splitter.d.ts","sourceRoot":"","sources":["../../src/splitter/Splitter.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,iBAAiB,EAEtB,KAAK,SAAS,EAQd,MAAM,OAAO,CAAC;AAMf,KAAK,iBAAiB,GAAG,UAAU,GAAG,YAAY,CAAC;AACnD,KAAK,YAAY,GAAG,OAAO,GAAG,KAAK,CAAC;AAEpC,MAAM,MAAM,aAAa,GAAG,iBAAiB,CAAC;IAC7C,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;CACpC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"Splitter.d.ts","sourceRoot":"","sources":["../../src/splitter/Splitter.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,iBAAiB,EAEtB,KAAK,SAAS,EAQd,MAAM,OAAO,CAAC;AAMf,KAAK,iBAAiB,GAAG,UAAU,GAAG,YAAY,CAAC;AACnD,KAAK,YAAY,GAAG,OAAO,GAAG,KAAK,CAAC;AAEpC,MAAM,MAAM,aAAa,GAAG,iBAAiB,CAAC;IAC7C,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,wFAAwF;IACxF,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,YAAY,GAAG,IAAI,CAAC;CACpC,CAAC,CAAC;AAmSH,wBAAgB,QAAQ,CAAC,EACxB,SAAsB,EACtB,OAAyB,EACzB,GAAiB,EACjB,GAAiB,EACjB,QAAQ,EACR,SAAS,EACT,aAAoB,EACpB,QAAQ,EACR,EAAE,aAAa,kSASf"}
|
package/dist/splitter/index.js
CHANGED
|
@@ -39,75 +39,77 @@ function y(e, t) {
|
|
|
39
39
|
function b(e, t) {
|
|
40
40
|
return t === "start" ? 0 : t === "end" ? 1 : e;
|
|
41
41
|
}
|
|
42
|
-
function x({ direction: e, initial: o, min: s, max: c,
|
|
43
|
-
let [
|
|
44
|
-
|
|
45
|
-
}, [
|
|
46
|
-
if (
|
|
47
|
-
let e =
|
|
48
|
-
return
|
|
49
|
-
},
|
|
50
|
-
|
|
51
|
-
|
|
42
|
+
function x({ direction: e, initial: o, min: s, max: c, onChange: l, collapsedPane: u }) {
|
|
43
|
+
let [d, p] = g(s, c), x = i(null), S = i(null), C = i(null), w = i(null), T = i(null), E = i(null), D = i(0), O = i(m(h(o, f), d, p)), k = i(o), [A, j] = a(() => m(h(o, f), d, p)), M = i(A), N = t((e) => {
|
|
44
|
+
M.current = e, S.current?.style.setProperty("flex-basis", `${b(e, u) * 100}%`), C.current?.setAttribute("aria-valuenow", `${Math.round(e * 100)}`);
|
|
45
|
+
}, [u]), P = () => {
|
|
46
|
+
if (E.current !== null && (cancelAnimationFrame(E.current), E.current = null), T.current === null) return M.current;
|
|
47
|
+
let e = T.current;
|
|
48
|
+
return T.current = null, N(e), e;
|
|
49
|
+
}, F = (e) => {
|
|
50
|
+
T.current = e, E.current === null && (E.current = requestAnimationFrame(() => {
|
|
51
|
+
E.current = null, T.current !== null && N(T.current);
|
|
52
52
|
}));
|
|
53
|
-
},
|
|
54
|
-
|
|
55
|
-
},
|
|
56
|
-
|
|
53
|
+
}, I = () => {
|
|
54
|
+
w.current?.(), w.current = null;
|
|
55
|
+
}, L = (e, t = M.current) => {
|
|
56
|
+
P();
|
|
57
|
+
let n = m(e, d, p);
|
|
58
|
+
j(n), n !== t && l?.(n);
|
|
57
59
|
};
|
|
58
60
|
return r(() => {
|
|
59
|
-
|
|
60
|
-
}, [
|
|
61
|
-
|
|
62
|
-
let t =
|
|
63
|
-
return
|
|
61
|
+
N(A);
|
|
62
|
+
}, [N, A]), n(() => {
|
|
63
|
+
j((e) => {
|
|
64
|
+
let t = k.current !== o;
|
|
65
|
+
return k.current = o, m(t ? h(o, f) : e, d, p);
|
|
64
66
|
});
|
|
65
67
|
}, [
|
|
66
68
|
o,
|
|
67
|
-
|
|
68
|
-
|
|
69
|
+
d,
|
|
70
|
+
p
|
|
69
71
|
]), n(() => () => {
|
|
70
|
-
|
|
72
|
+
I(), E.current !== null && cancelAnimationFrame(E.current);
|
|
71
73
|
}, []), {
|
|
72
|
-
containerRef:
|
|
73
|
-
topLeftRef:
|
|
74
|
-
separatorRef:
|
|
75
|
-
ratio:
|
|
76
|
-
minRatio:
|
|
77
|
-
maxRatio:
|
|
74
|
+
containerRef: x,
|
|
75
|
+
topLeftRef: S,
|
|
76
|
+
separatorRef: C,
|
|
77
|
+
ratio: A,
|
|
78
|
+
minRatio: d,
|
|
79
|
+
maxRatio: p,
|
|
78
80
|
handleSeparatorPointerDown: (t) => {
|
|
79
81
|
if (t.button !== 0) return;
|
|
80
82
|
t.preventDefault();
|
|
81
|
-
let n =
|
|
83
|
+
let n = x.current;
|
|
82
84
|
if (!n) return;
|
|
83
|
-
|
|
85
|
+
I();
|
|
84
86
|
try {
|
|
85
87
|
t.currentTarget.setPointerCapture?.(t.pointerId);
|
|
86
88
|
} catch {}
|
|
87
|
-
|
|
89
|
+
D.current = _(e, t), O.current = M.current;
|
|
88
90
|
let r = (t) => {
|
|
89
91
|
let r = v(e, n.getBoundingClientRect());
|
|
90
92
|
if (r <= 0) return;
|
|
91
|
-
let i = _(e, t) -
|
|
92
|
-
|
|
93
|
+
let i = _(e, t) - D.current, a = m(O.current + i / r, d, p);
|
|
94
|
+
F(a);
|
|
93
95
|
}, i = () => {
|
|
94
|
-
|
|
96
|
+
I(), L(P(), O.current);
|
|
95
97
|
};
|
|
96
|
-
|
|
98
|
+
w.current = () => {
|
|
97
99
|
document.removeEventListener("pointermove", r), document.removeEventListener("pointerup", i), document.removeEventListener("pointercancel", i);
|
|
98
100
|
}, document.addEventListener("pointermove", r), document.addEventListener("pointerup", i), document.addEventListener("pointercancel", i);
|
|
99
101
|
},
|
|
100
102
|
handleSeparatorKeyDown: (t) => {
|
|
101
103
|
let n = y(e, t.key);
|
|
102
104
|
if (n !== null) {
|
|
103
|
-
t.preventDefault(),
|
|
105
|
+
t.preventDefault(), L(M.current + n);
|
|
104
106
|
return;
|
|
105
107
|
}
|
|
106
108
|
if (t.key === "Home") {
|
|
107
|
-
t.preventDefault(),
|
|
109
|
+
t.preventDefault(), L(d);
|
|
108
110
|
return;
|
|
109
111
|
}
|
|
110
|
-
t.key === "End" && (t.preventDefault(),
|
|
112
|
+
t.key === "End" && (t.preventDefault(), L(p));
|
|
111
113
|
}
|
|
112
114
|
};
|
|
113
115
|
}
|
|
@@ -145,22 +147,23 @@ function S({ className: e, direction: t, left: n, right: r, collapsedPane: i, lo
|
|
|
145
147
|
]
|
|
146
148
|
});
|
|
147
149
|
}
|
|
148
|
-
function C({ direction: t = "vertical", initial: n = f, min: r = u, max: i = d,
|
|
149
|
-
let [
|
|
150
|
+
function C({ direction: t = "vertical", initial: n = f, min: r = u, max: i = d, onChange: a, className: o, collapsedPane: c = null, children: l }) {
|
|
151
|
+
let [p, m] = e.toArray(l), h = x({
|
|
150
152
|
direction: t,
|
|
151
153
|
initial: n,
|
|
152
154
|
min: r,
|
|
153
155
|
max: i,
|
|
154
|
-
|
|
156
|
+
onChange: a,
|
|
157
|
+
collapsedPane: c
|
|
155
158
|
});
|
|
156
|
-
return
|
|
157
|
-
className:
|
|
159
|
+
return m ? /* @__PURE__ */ s(S, {
|
|
160
|
+
className: o,
|
|
158
161
|
direction: t,
|
|
159
|
-
left:
|
|
160
|
-
right:
|
|
161
|
-
collapsedPane:
|
|
162
|
-
logic:
|
|
163
|
-
}) :
|
|
162
|
+
left: p,
|
|
163
|
+
right: m,
|
|
164
|
+
collapsedPane: c,
|
|
165
|
+
logic: h
|
|
166
|
+
}) : p;
|
|
164
167
|
}
|
|
165
168
|
//#endregion
|
|
166
169
|
export { C as Splitter };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../src/splitter/Splitter.module.scss","../../src/splitter/Splitter.tsx"],"sourcesContent":[".splitter {\n\tdisplay: flex;\n\twidth: 100%;\n\theight: 100%;\n\toverflow: hidden;\n\n\t&.vertical {\n\t\tflex-direction: row;\n\n\t\t.separator {\n\t\t\tcursor: col-resize;\n\n\t\t\tborder-left: var(--border);\n\t\t\tborder-right: var(--border);\n\n\t\t\tmargin-inline: var(--space-md);\n\t\t}\n\t}\n\n\t&.horizontal {\n\t\tflex-direction: column;\n\n\t\t.separator {\n\t\t\tcursor: row-resize;\n\n\t\t\t// border-top: var(--border);\n\t\t\t// border-bottom: var(--border);\n\n\t\t\tmargin-block: var(--space-md);\n\t\t}\n\t}\n}\n\n.topLeft {\n\tflex-grow: 0;\n\tflex-shrink: 0;\n}\n\n.bottomRight {\n\tflex-grow: 1;\n}\n\n.topLeft,\n.bottomRight {\n\tmin-width: 0;\n\tmin-height: 0;\n\toverflow: auto;\n}\n\n.separator {\n\tflex-basis: var(--space-sm);\n\tflex-grow: 0;\n\tflex-shrink: 0;\n\n\tborder-radius: var(--radius-sm);\n\tborder: var(--border);\n\tbackground-color: var(--border-0);\n\n\tuser-select: none;\n\ttouch-action: none;\n\tposition: relative;\n\n\t&:hover {\n\t\tborder-color: var(--border-1);\n\t\tbackground-color: var(--border-1);\n\t}\n\t&:active {\n\t\tborder-color: var(--border-2);\n\t\tbackground-color: var(--border-2);\n\t}\n}\n","import {\n\tChildren,\n\ttype PropsWithChildren,\n\ttype KeyboardEvent as ReactKeyboardEvent,\n\ttype ReactNode,\n\ttype PointerEvent as ReactPointerEvent,\n\ttype RefObject,\n\tuseCallback,\n\tuseEffect,\n\tuseLayoutEffect,\n\tuseRef,\n\tuseState\n} from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport styles from \"./Splitter.module.scss\";\n\ntype SplitterDirection = \"vertical\" | \"horizontal\";\ntype SplitterPane = \"start\" | \"end\";\n\nexport type SplitterProps = PropsWithChildren<{\n\tdirection?: SplitterDirection;\n\tinitial?: number; // от 0 до 1\n\tmin?: number; // минимальная доля первой панели\n\tmax?: number; // максимальная доля первой панели\n\tclassName?: string;\n\tcollapsedPane?: SplitterPane | null;\n}>;\n\ntype SplitterLogicParams = {\n\tdirection: SplitterDirection;\n\tinitial: number;\n\tmin: number;\n\tmax: number;\n\tcollapsedPane: SplitterPane | null;\n};\n\ntype SplitterLogic = {\n\tcontainerRef: RefObject<HTMLDivElement | null>;\n\ttopLeftRef: RefObject<HTMLDivElement | null>;\n\tseparatorRef: RefObject<HTMLDivElement | null>;\n\tratio: number;\n\tminRatio: number;\n\tmaxRatio: number;\n\thandleSeparatorPointerDown: (event: ReactPointerEvent<HTMLDivElement>) => void;\n\thandleSeparatorKeyDown: (event: ReactKeyboardEvent<HTMLDivElement>) => void;\n};\n\ntype SplitterViewProps = {\n\tclassName?: string;\n\tdirection: SplitterDirection;\n\tleft: ReactNode;\n\tright: ReactNode;\n\tcollapsedPane: SplitterPane | null;\n\tlogic: SplitterLogic;\n};\n\nconst DEFAULT_MIN = 0.1;\nconst DEFAULT_MAX = 0.9;\nconst DEFAULT_INITIAL = 0.7;\nconst KEYBOARD_STEP = 0.02;\n\nfunction clampRatio(value: number, min: number, max: number) {\n\treturn Math.min(max, Math.max(min, value));\n}\n\nfunction normalizeRatioValue(value: number, fallback: number) {\n\tif (!Number.isFinite(value)) return fallback;\n\n\treturn clampRatio(value, 0, 1);\n}\n\nfunction normalizeBounds(min: number, max: number) {\n\tconst safeMin = normalizeRatioValue(min, DEFAULT_MIN);\n\tconst safeMax = normalizeRatioValue(max, DEFAULT_MAX);\n\n\tif (safeMin <= safeMax) return [safeMin, safeMax] as const;\n\n\treturn [safeMax, safeMin] as const;\n}\n\nfunction getPointerCoordinate(direction: SplitterDirection, event: PointerEvent | ReactPointerEvent<HTMLDivElement>) {\n\treturn direction === \"vertical\" ? event.clientX : event.clientY;\n}\n\nfunction getContainerDimension(direction: SplitterDirection, rect: DOMRect) {\n\treturn direction === \"vertical\" ? rect.width : rect.height;\n}\n\nfunction getKeyboardDelta(direction: SplitterDirection, key: string) {\n\tif (direction === \"vertical\") {\n\t\tif (key === \"ArrowLeft\") return -KEYBOARD_STEP;\n\t\tif (key === \"ArrowRight\") return KEYBOARD_STEP;\n\t}\n\n\tif (direction === \"horizontal\") {\n\t\tif (key === \"ArrowUp\") return -KEYBOARD_STEP;\n\t\tif (key === \"ArrowDown\") return KEYBOARD_STEP;\n\t}\n\n\treturn null;\n}\n\nfunction resolveTopLeftBasis(ratio: number, collapsedPane: SplitterPane | null) {\n\tif (collapsedPane === \"start\") return 0;\n\tif (collapsedPane === \"end\") return 1;\n\n\treturn ratio;\n}\n\nfunction useSplitterLogic({ direction, initial, min, max, collapsedPane }: SplitterLogicParams): SplitterLogic {\n\tconst [minRatio, maxRatio] = normalizeBounds(min, max);\n\n\tconst containerRef = useRef<HTMLDivElement | null>(null);\n\tconst topLeftRef = useRef<HTMLDivElement | null>(null);\n\tconst separatorRef = useRef<HTMLDivElement | null>(null);\n\tconst cleanupDragRef = useRef<(() => void) | null>(null);\n\tconst pendingRatioRef = useRef<number | null>(null);\n\tconst frameRef = useRef<number | null>(null);\n\tconst startPosRef = useRef(0);\n\tconst startRatioRef = useRef(clampRatio(normalizeRatioValue(initial, DEFAULT_INITIAL), minRatio, maxRatio));\n\tconst previousInitialRef = useRef(initial);\n\n\tconst [ratio, setRatio] = useState(() => clampRatio(normalizeRatioValue(initial, DEFAULT_INITIAL), minRatio, maxRatio));\n\tconst ratioRef = useRef(ratio);\n\n\tconst applyRatio = useCallback(\n\t\t(nextRatio: number) => {\n\t\t\tratioRef.current = nextRatio;\n\t\t\ttopLeftRef.current?.style.setProperty(\"flex-basis\", `${resolveTopLeftBasis(nextRatio, collapsedPane) * 100}%`);\n\t\t\tseparatorRef.current?.setAttribute(\"aria-valuenow\", `${Math.round(nextRatio * 100)}`);\n\t\t},\n\t\t[collapsedPane]\n\t);\n\n\tconst flushPendingRatio = () => {\n\t\tif (frameRef.current !== null) {\n\t\t\tcancelAnimationFrame(frameRef.current);\n\t\t\tframeRef.current = null;\n\t\t}\n\n\t\tif (pendingRatioRef.current === null) return ratioRef.current;\n\n\t\tconst nextRatio = pendingRatioRef.current;\n\t\tpendingRatioRef.current = null;\n\t\tapplyRatio(nextRatio);\n\n\t\treturn nextRatio;\n\t};\n\n\tconst scheduleRatioUpdate = (nextRatio: number) => {\n\t\tpendingRatioRef.current = nextRatio;\n\n\t\tif (frameRef.current !== null) return;\n\n\t\tframeRef.current = requestAnimationFrame(() => {\n\t\t\tframeRef.current = null;\n\n\t\t\tif (pendingRatioRef.current === null) return;\n\n\t\t\tapplyRatio(pendingRatioRef.current);\n\t\t});\n\t};\n\n\tconst stopDragging = () => {\n\t\tcleanupDragRef.current?.();\n\t\tcleanupDragRef.current = null;\n\t};\n\n\tconst commitRatio = (nextRatio: number) => {\n\t\tflushPendingRatio();\n\t\tsetRatio(clampRatio(nextRatio, minRatio, maxRatio));\n\t};\n\n\tconst handleSeparatorPointerDown = (event: ReactPointerEvent<HTMLDivElement>) => {\n\t\tif (event.button !== 0) return;\n\n\t\tevent.preventDefault();\n\n\t\tconst container = containerRef.current;\n\t\tif (!container) return;\n\n\t\tstopDragging();\n\n\t\ttry {\n\t\t\tevent.currentTarget.setPointerCapture?.(event.pointerId);\n\t\t} catch {\n\t\t\t// Игнорировать, если браузер не поддерживает pointer capture.\n\t\t}\n\n\t\tstartPosRef.current = getPointerCoordinate(direction, event);\n\t\tstartRatioRef.current = ratioRef.current;\n\n\t\tconst handlePointerMove = (moveEvent: PointerEvent) => {\n\t\t\tconst rect = container.getBoundingClientRect();\n\t\t\tconst dimension = getContainerDimension(direction, rect);\n\t\t\tif (dimension <= 0) return;\n\n\t\t\tconst delta = getPointerCoordinate(direction, moveEvent) - startPosRef.current;\n\t\t\tconst nextRatio = clampRatio(startRatioRef.current + delta / dimension, minRatio, maxRatio);\n\n\t\t\tscheduleRatioUpdate(nextRatio);\n\t\t};\n\n\t\tconst handlePointerUp = () => {\n\t\t\tstopDragging();\n\t\t\tsetRatio(flushPendingRatio());\n\t\t};\n\n\t\tcleanupDragRef.current = () => {\n\t\t\tdocument.removeEventListener(\"pointermove\", handlePointerMove);\n\t\t\tdocument.removeEventListener(\"pointerup\", handlePointerUp);\n\t\t\tdocument.removeEventListener(\"pointercancel\", handlePointerUp);\n\t\t};\n\n\t\tdocument.addEventListener(\"pointermove\", handlePointerMove);\n\t\tdocument.addEventListener(\"pointerup\", handlePointerUp);\n\t\tdocument.addEventListener(\"pointercancel\", handlePointerUp);\n\t};\n\n\tconst handleSeparatorKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n\t\tconst keyboardDelta = getKeyboardDelta(direction, event.key);\n\n\t\tif (keyboardDelta !== null) {\n\t\t\tevent.preventDefault();\n\t\t\tcommitRatio(ratioRef.current + keyboardDelta);\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === \"Home\") {\n\t\t\tevent.preventDefault();\n\t\t\tcommitRatio(minRatio);\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === \"End\") {\n\t\t\tevent.preventDefault();\n\t\t\tcommitRatio(maxRatio);\n\t\t}\n\t};\n\n\tuseLayoutEffect(() => {\n\t\tapplyRatio(ratio);\n\t}, [applyRatio, ratio]);\n\n\tuseEffect(() => {\n\t\tsetRatio((currentRatio) => {\n\t\t\tconst initialChanged = previousInitialRef.current !== initial;\n\t\t\tpreviousInitialRef.current = initial;\n\n\t\t\tif (initialChanged) {\n\t\t\t\treturn clampRatio(normalizeRatioValue(initial, DEFAULT_INITIAL), minRatio, maxRatio);\n\t\t\t}\n\n\t\t\treturn clampRatio(currentRatio, minRatio, maxRatio);\n\t\t});\n\t}, [initial, minRatio, maxRatio]);\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tstopDragging();\n\n\t\t\tif (frameRef.current !== null) {\n\t\t\t\tcancelAnimationFrame(frameRef.current);\n\t\t\t}\n\t\t};\n\t}, []);\n\n\treturn {\n\t\tcontainerRef,\n\t\ttopLeftRef,\n\t\tseparatorRef,\n\t\tratio,\n\t\tminRatio,\n\t\tmaxRatio,\n\t\thandleSeparatorPointerDown,\n\t\thandleSeparatorKeyDown\n\t};\n}\n\nfunction SplitterView({ className, direction, left, right, collapsedPane, logic }: SplitterViewProps) {\n\tconst { containerRef, topLeftRef, separatorRef, ratio, minRatio, maxRatio, handleSeparatorPointerDown, handleSeparatorKeyDown } = logic;\n\tconst topLeftBasis = resolveTopLeftBasis(ratio, collapsedPane);\n\tconst isStartPaneCollapsed = collapsedPane === \"start\";\n\tconst isEndPaneCollapsed = collapsedPane === \"end\";\n\tconst isSeparatorVisible = collapsedPane === null;\n\n\treturn (\n\t\t<div ref={containerRef} className={cn(styles.splitter, styles[direction], className)}>\n\t\t\t<div ref={topLeftRef} className={styles.topLeft} style={{ flexBasis: `${topLeftBasis * 100}%` }} hidden={isStartPaneCollapsed}>\n\t\t\t\t{left}\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tref={separatorRef}\n\t\t\t\thidden={!isSeparatorVisible}\n\t\t\t\trole=\"separator\"\n\t\t\t\taria-orientation={direction === \"vertical\" ? \"vertical\" : \"horizontal\"}\n\t\t\t\taria-valuemin={Math.round(minRatio * 100)}\n\t\t\t\taria-valuemax={Math.round(maxRatio * 100)}\n\t\t\t\taria-valuenow={Math.round(ratio * 100)}\n\t\t\t\ttabIndex={isSeparatorVisible ? 0 : -1}\n\t\t\t\tonPointerDown={handleSeparatorPointerDown}\n\t\t\t\tonKeyDown={handleSeparatorKeyDown}\n\t\t\t\tclassName={styles.separator}></div>\n\n\t\t\t<div className={styles.bottomRight} hidden={isEndPaneCollapsed}>\n\t\t\t\t{right}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nexport function Splitter({\n\tdirection = \"vertical\",\n\tinitial = DEFAULT_INITIAL,\n\tmin = DEFAULT_MIN,\n\tmax = DEFAULT_MAX,\n\tclassName,\n\tcollapsedPane = null,\n\tchildren\n}: SplitterProps) {\n\tconst [left, right] = Children.toArray(children);\n\tconst logic = useSplitterLogic({ direction, initial, min, max, collapsedPane });\n\n\tif (!right) return left;\n\n\treturn (\n\t\t<SplitterView className={className} direction={direction} left={left} right={right} collapsedPane={collapsedPane} logic={logic} />\n\t);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/splitter/Splitter.module.scss","../../src/splitter/Splitter.tsx"],"sourcesContent":[".splitter {\n\tdisplay: flex;\n\twidth: 100%;\n\theight: 100%;\n\toverflow: hidden;\n\n\t&.vertical {\n\t\tflex-direction: row;\n\n\t\t.separator {\n\t\t\tcursor: col-resize;\n\n\t\t\tborder-left: var(--border);\n\t\t\tborder-right: var(--border);\n\n\t\t\tmargin-inline: var(--space-md);\n\t\t}\n\t}\n\n\t&.horizontal {\n\t\tflex-direction: column;\n\n\t\t.separator {\n\t\t\tcursor: row-resize;\n\n\t\t\t// border-top: var(--border);\n\t\t\t// border-bottom: var(--border);\n\n\t\t\tmargin-block: var(--space-md);\n\t\t}\n\t}\n}\n\n.topLeft {\n\tflex-grow: 0;\n\tflex-shrink: 0;\n}\n\n.bottomRight {\n\tflex-grow: 1;\n}\n\n.topLeft,\n.bottomRight {\n\tmin-width: 0;\n\tmin-height: 0;\n\toverflow: auto;\n}\n\n.separator {\n\tflex-basis: var(--space-sm);\n\tflex-grow: 0;\n\tflex-shrink: 0;\n\n\tborder-radius: var(--radius-sm);\n\tborder: var(--border);\n\tbackground-color: var(--border-0);\n\n\tuser-select: none;\n\ttouch-action: none;\n\tposition: relative;\n\n\t&:hover {\n\t\tborder-color: var(--border-1);\n\t\tbackground-color: var(--border-1);\n\t}\n\t&:active {\n\t\tborder-color: var(--border-2);\n\t\tbackground-color: var(--border-2);\n\t}\n}\n","import {\n\tChildren,\n\ttype PropsWithChildren,\n\ttype KeyboardEvent as ReactKeyboardEvent,\n\ttype ReactNode,\n\ttype PointerEvent as ReactPointerEvent,\n\ttype RefObject,\n\tuseCallback,\n\tuseEffect,\n\tuseLayoutEffect,\n\tuseRef,\n\tuseState\n} from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport styles from \"./Splitter.module.scss\";\n\ntype SplitterDirection = \"vertical\" | \"horizontal\";\ntype SplitterPane = \"start\" | \"end\";\n\nexport type SplitterProps = PropsWithChildren<{\n\tdirection?: SplitterDirection;\n\tinitial?: number; // от 0 до 1\n\tmin?: number; // минимальная доля первой панели\n\tmax?: number; // максимальная доля первой панели\n\t/** Сообщает итоговую долю первой панели после завершения drag или шага с клавиатуры. */\n\tonChange?: (ratio: number) => void;\n\tclassName?: string;\n\tcollapsedPane?: SplitterPane | null;\n}>;\n\ntype SplitterLogicParams = {\n\tdirection: SplitterDirection;\n\tinitial: number;\n\tmin: number;\n\tmax: number;\n\tonChange?: (ratio: number) => void;\n\tcollapsedPane: SplitterPane | null;\n};\n\ntype SplitterLogic = {\n\tcontainerRef: RefObject<HTMLDivElement | null>;\n\ttopLeftRef: RefObject<HTMLDivElement | null>;\n\tseparatorRef: RefObject<HTMLDivElement | null>;\n\tratio: number;\n\tminRatio: number;\n\tmaxRatio: number;\n\thandleSeparatorPointerDown: (event: ReactPointerEvent<HTMLDivElement>) => void;\n\thandleSeparatorKeyDown: (event: ReactKeyboardEvent<HTMLDivElement>) => void;\n};\n\ntype SplitterViewProps = {\n\tclassName?: string;\n\tdirection: SplitterDirection;\n\tleft: ReactNode;\n\tright: ReactNode;\n\tcollapsedPane: SplitterPane | null;\n\tlogic: SplitterLogic;\n};\n\nconst DEFAULT_MIN = 0.1;\nconst DEFAULT_MAX = 0.9;\nconst DEFAULT_INITIAL = 0.7;\nconst KEYBOARD_STEP = 0.02;\n\nfunction clampRatio(value: number, min: number, max: number) {\n\treturn Math.min(max, Math.max(min, value));\n}\n\nfunction normalizeRatioValue(value: number, fallback: number) {\n\tif (!Number.isFinite(value)) return fallback;\n\n\treturn clampRatio(value, 0, 1);\n}\n\nfunction normalizeBounds(min: number, max: number) {\n\tconst safeMin = normalizeRatioValue(min, DEFAULT_MIN);\n\tconst safeMax = normalizeRatioValue(max, DEFAULT_MAX);\n\n\tif (safeMin <= safeMax) return [safeMin, safeMax] as const;\n\n\treturn [safeMax, safeMin] as const;\n}\n\nfunction getPointerCoordinate(direction: SplitterDirection, event: PointerEvent | ReactPointerEvent<HTMLDivElement>) {\n\treturn direction === \"vertical\" ? event.clientX : event.clientY;\n}\n\nfunction getContainerDimension(direction: SplitterDirection, rect: DOMRect) {\n\treturn direction === \"vertical\" ? rect.width : rect.height;\n}\n\nfunction getKeyboardDelta(direction: SplitterDirection, key: string) {\n\tif (direction === \"vertical\") {\n\t\tif (key === \"ArrowLeft\") return -KEYBOARD_STEP;\n\t\tif (key === \"ArrowRight\") return KEYBOARD_STEP;\n\t}\n\n\tif (direction === \"horizontal\") {\n\t\tif (key === \"ArrowUp\") return -KEYBOARD_STEP;\n\t\tif (key === \"ArrowDown\") return KEYBOARD_STEP;\n\t}\n\n\treturn null;\n}\n\nfunction resolveTopLeftBasis(ratio: number, collapsedPane: SplitterPane | null) {\n\tif (collapsedPane === \"start\") return 0;\n\tif (collapsedPane === \"end\") return 1;\n\n\treturn ratio;\n}\n\nfunction useSplitterLogic({ direction, initial, min, max, onChange, collapsedPane }: SplitterLogicParams): SplitterLogic {\n\tconst [minRatio, maxRatio] = normalizeBounds(min, max);\n\n\tconst containerRef = useRef<HTMLDivElement | null>(null);\n\tconst topLeftRef = useRef<HTMLDivElement | null>(null);\n\tconst separatorRef = useRef<HTMLDivElement | null>(null);\n\tconst cleanupDragRef = useRef<(() => void) | null>(null);\n\tconst pendingRatioRef = useRef<number | null>(null);\n\tconst frameRef = useRef<number | null>(null);\n\tconst startPosRef = useRef(0);\n\tconst startRatioRef = useRef(clampRatio(normalizeRatioValue(initial, DEFAULT_INITIAL), minRatio, maxRatio));\n\tconst previousInitialRef = useRef(initial);\n\n\tconst [ratio, setRatio] = useState(() => clampRatio(normalizeRatioValue(initial, DEFAULT_INITIAL), minRatio, maxRatio));\n\tconst ratioRef = useRef(ratio);\n\n\tconst applyRatio = useCallback(\n\t\t(nextRatio: number) => {\n\t\t\tratioRef.current = nextRatio;\n\t\t\ttopLeftRef.current?.style.setProperty(\"flex-basis\", `${resolveTopLeftBasis(nextRatio, collapsedPane) * 100}%`);\n\t\t\tseparatorRef.current?.setAttribute(\"aria-valuenow\", `${Math.round(nextRatio * 100)}`);\n\t\t},\n\t\t[collapsedPane]\n\t);\n\n\tconst flushPendingRatio = () => {\n\t\tif (frameRef.current !== null) {\n\t\t\tcancelAnimationFrame(frameRef.current);\n\t\t\tframeRef.current = null;\n\t\t}\n\n\t\tif (pendingRatioRef.current === null) return ratioRef.current;\n\n\t\tconst nextRatio = pendingRatioRef.current;\n\t\tpendingRatioRef.current = null;\n\t\tapplyRatio(nextRatio);\n\n\t\treturn nextRatio;\n\t};\n\n\tconst scheduleRatioUpdate = (nextRatio: number) => {\n\t\tpendingRatioRef.current = nextRatio;\n\n\t\tif (frameRef.current !== null) return;\n\n\t\tframeRef.current = requestAnimationFrame(() => {\n\t\t\tframeRef.current = null;\n\n\t\t\tif (pendingRatioRef.current === null) return;\n\n\t\t\tapplyRatio(pendingRatioRef.current);\n\t\t});\n\t};\n\n\tconst stopDragging = () => {\n\t\tcleanupDragRef.current?.();\n\t\tcleanupDragRef.current = null;\n\t};\n\n\tconst commitRatio = (nextRatio: number, previousRatio = ratioRef.current) => {\n\t\tflushPendingRatio();\n\t\tconst committedRatio = clampRatio(nextRatio, minRatio, maxRatio);\n\t\tsetRatio(committedRatio);\n\t\tif (committedRatio !== previousRatio) onChange?.(committedRatio);\n\t};\n\n\tconst handleSeparatorPointerDown = (event: ReactPointerEvent<HTMLDivElement>) => {\n\t\tif (event.button !== 0) return;\n\n\t\tevent.preventDefault();\n\n\t\tconst container = containerRef.current;\n\t\tif (!container) return;\n\n\t\tstopDragging();\n\n\t\ttry {\n\t\t\tevent.currentTarget.setPointerCapture?.(event.pointerId);\n\t\t} catch {\n\t\t\t// Игнорировать, если браузер не поддерживает pointer capture.\n\t\t}\n\n\t\tstartPosRef.current = getPointerCoordinate(direction, event);\n\t\tstartRatioRef.current = ratioRef.current;\n\n\t\tconst handlePointerMove = (moveEvent: PointerEvent) => {\n\t\t\tconst rect = container.getBoundingClientRect();\n\t\t\tconst dimension = getContainerDimension(direction, rect);\n\t\t\tif (dimension <= 0) return;\n\n\t\t\tconst delta = getPointerCoordinate(direction, moveEvent) - startPosRef.current;\n\t\t\tconst nextRatio = clampRatio(startRatioRef.current + delta / dimension, minRatio, maxRatio);\n\n\t\t\tscheduleRatioUpdate(nextRatio);\n\t\t};\n\n\t\tconst handlePointerUp = () => {\n\t\t\tstopDragging();\n\t\t\tcommitRatio(flushPendingRatio(), startRatioRef.current);\n\t\t};\n\n\t\tcleanupDragRef.current = () => {\n\t\t\tdocument.removeEventListener(\"pointermove\", handlePointerMove);\n\t\t\tdocument.removeEventListener(\"pointerup\", handlePointerUp);\n\t\t\tdocument.removeEventListener(\"pointercancel\", handlePointerUp);\n\t\t};\n\n\t\tdocument.addEventListener(\"pointermove\", handlePointerMove);\n\t\tdocument.addEventListener(\"pointerup\", handlePointerUp);\n\t\tdocument.addEventListener(\"pointercancel\", handlePointerUp);\n\t};\n\n\tconst handleSeparatorKeyDown = (event: ReactKeyboardEvent<HTMLDivElement>) => {\n\t\tconst keyboardDelta = getKeyboardDelta(direction, event.key);\n\n\t\tif (keyboardDelta !== null) {\n\t\t\tevent.preventDefault();\n\t\t\tcommitRatio(ratioRef.current + keyboardDelta);\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === \"Home\") {\n\t\t\tevent.preventDefault();\n\t\t\tcommitRatio(minRatio);\n\n\t\t\treturn;\n\t\t}\n\n\t\tif (event.key === \"End\") {\n\t\t\tevent.preventDefault();\n\t\t\tcommitRatio(maxRatio);\n\t\t}\n\t};\n\n\tuseLayoutEffect(() => {\n\t\tapplyRatio(ratio);\n\t}, [applyRatio, ratio]);\n\n\tuseEffect(() => {\n\t\tsetRatio((currentRatio) => {\n\t\t\tconst initialChanged = previousInitialRef.current !== initial;\n\t\t\tpreviousInitialRef.current = initial;\n\n\t\t\tif (initialChanged) {\n\t\t\t\treturn clampRatio(normalizeRatioValue(initial, DEFAULT_INITIAL), minRatio, maxRatio);\n\t\t\t}\n\n\t\t\treturn clampRatio(currentRatio, minRatio, maxRatio);\n\t\t});\n\t}, [initial, minRatio, maxRatio]);\n\n\tuseEffect(() => {\n\t\treturn () => {\n\t\t\tstopDragging();\n\n\t\t\tif (frameRef.current !== null) {\n\t\t\t\tcancelAnimationFrame(frameRef.current);\n\t\t\t}\n\t\t};\n\t}, []);\n\n\treturn {\n\t\tcontainerRef,\n\t\ttopLeftRef,\n\t\tseparatorRef,\n\t\tratio,\n\t\tminRatio,\n\t\tmaxRatio,\n\t\thandleSeparatorPointerDown,\n\t\thandleSeparatorKeyDown\n\t};\n}\n\nfunction SplitterView({ className, direction, left, right, collapsedPane, logic }: SplitterViewProps) {\n\tconst { containerRef, topLeftRef, separatorRef, ratio, minRatio, maxRatio, handleSeparatorPointerDown, handleSeparatorKeyDown } = logic;\n\tconst topLeftBasis = resolveTopLeftBasis(ratio, collapsedPane);\n\tconst isStartPaneCollapsed = collapsedPane === \"start\";\n\tconst isEndPaneCollapsed = collapsedPane === \"end\";\n\tconst isSeparatorVisible = collapsedPane === null;\n\n\treturn (\n\t\t<div ref={containerRef} className={cn(styles.splitter, styles[direction], className)}>\n\t\t\t<div ref={topLeftRef} className={styles.topLeft} style={{ flexBasis: `${topLeftBasis * 100}%` }} hidden={isStartPaneCollapsed}>\n\t\t\t\t{left}\n\t\t\t</div>\n\n\t\t\t<div\n\t\t\t\tref={separatorRef}\n\t\t\t\thidden={!isSeparatorVisible}\n\t\t\t\trole=\"separator\"\n\t\t\t\taria-orientation={direction === \"vertical\" ? \"vertical\" : \"horizontal\"}\n\t\t\t\taria-valuemin={Math.round(minRatio * 100)}\n\t\t\t\taria-valuemax={Math.round(maxRatio * 100)}\n\t\t\t\taria-valuenow={Math.round(ratio * 100)}\n\t\t\t\ttabIndex={isSeparatorVisible ? 0 : -1}\n\t\t\t\tonPointerDown={handleSeparatorPointerDown}\n\t\t\t\tonKeyDown={handleSeparatorKeyDown}\n\t\t\t\tclassName={styles.separator}></div>\n\n\t\t\t<div className={styles.bottomRight} hidden={isEndPaneCollapsed}>\n\t\t\t\t{right}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\nexport function Splitter({\n\tdirection = \"vertical\",\n\tinitial = DEFAULT_INITIAL,\n\tmin = DEFAULT_MIN,\n\tmax = DEFAULT_MAX,\n\tonChange,\n\tclassName,\n\tcollapsedPane = null,\n\tchildren\n}: SplitterProps) {\n\tconst [left, right] = Children.toArray(children);\n\tconst logic = useSplitterLogic({ direction, initial, min, max, onChange, collapsedPane });\n\n\tif (!right) return left;\n\n\treturn (\n\t\t<SplitterView className={className} direction={direction} left={left} right={right} collapsedPane={collapsedPane} logic={logic} />\n\t);\n}\n"],"mappings":"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"}
|