@ryuzaki13/react-foundation-ui 1.0.21 → 1.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/advanced-search/index.js +3 -3
- package/dist/base-table/index.js +1 -1
- package/dist/chunks/{TextEditorLexicalClient-B1kQnKrU.js → TextEditorLexicalClient-bDEyimUa.js} +2 -2
- package/dist/chunks/{TextEditorLexicalClient-B1kQnKrU.js.map → TextEditorLexicalClient-bDEyimUa.js.map} +1 -1
- package/dist/chunks/{base-table-DghNJ6ss.js → base-table-BXKFSgIk.js} +2 -2
- package/dist/chunks/{base-table-DghNJ6ss.js.map → base-table-BXKFSgIk.js.map} +1 -1
- package/dist/chunks/{misc-ClXJygTj.js → misc-DIF5h9ba.js} +71 -76
- package/dist/chunks/misc-DIF5h9ba.js.map +1 -0
- package/dist/chunks/{modal-QGp5CjB9.js → modal-Cll8YZ7b.js} +2 -2
- package/dist/chunks/{modal-QGp5CjB9.js.map → modal-Cll8YZ7b.js.map} +1 -1
- package/dist/chunks/{table-tBQ_FOs3.js → table-BdpMzhLH.js} +2 -2
- package/dist/chunks/{table-tBQ_FOs3.js.map → table-BdpMzhLH.js.map} +1 -1
- package/dist/expandable-action-panel/index.js +1 -1
- package/dist/image/index.js +1 -1
- package/dist/list/index.js +1 -1
- package/dist/misc/AnimatedLogo.d.ts +10 -1
- package/dist/misc/AnimatedLogo.d.ts.map +1 -1
- package/dist/misc/AnimatedLogoSegment.d.ts +12 -0
- package/dist/misc/AnimatedLogoSegment.d.ts.map +1 -0
- package/dist/misc/LoadingMessage.d.ts +6 -4
- package/dist/misc/LoadingMessage.d.ts.map +1 -1
- package/dist/misc/index.d.ts +1 -0
- package/dist/misc/index.d.ts.map +1 -1
- package/dist/misc/index.js +2 -2
- package/dist/modal/index.js +1 -1
- package/dist/simple-table/index.js +1 -1
- package/dist/styles.css +1 -1
- package/dist/table/index.js +1 -1
- package/dist/tabs/index.js +1 -1
- package/dist/text-editor/index.js +2 -2
- package/dist/tree-table/index.js +1 -1
- package/package.json +1 -1
- package/src/styles/_base.scss +0 -62
- package/storybook-static/assets/{Badge-Cg2dYSwP.js → Badge-CYlSA6Vw.js} +1 -1
- package/storybook-static/assets/{Badge.stories-BYlun-i3.js → Badge.stories-D6UyHEn4.js} +1 -1
- package/storybook-static/assets/{Button-DHUm4dn9.js → Button-D5iLUeQv.js} +1 -1
- package/storybook-static/assets/{Button-D4_1YUId.js → Button-aNoMm3xs.js} +1 -1
- package/storybook-static/assets/{Button.stories-DJVvYNle.js → Button.stories-CNsB_F01.js} +1 -1
- package/storybook-static/assets/{CheckBox-Cn0oEy-0.js → CheckBox-BCgKBJVJ.js} +1 -1
- package/storybook-static/assets/{CheckBox-BMCI3jcJ.js → CheckBox-KNAnK8-n.js} +1 -1
- package/storybook-static/assets/{CheckBox.stories-DNVyyKgk.js → CheckBox.stories-Dd7SzJDz.js} +1 -1
- package/storybook-static/assets/{Color-KMSTOMOX-CogEIqTq.js → Color-KMSTOMOX-CNiU2Elq.js} +1 -1
- package/storybook-static/assets/{ContextMenu-GtVpIKrx.js → ContextMenu-D3k_Tu0Z.js} +1 -1
- package/storybook-static/assets/{ContextMenu.stories-BxiJt6xb.js → ContextMenu.stories-C_i_uyc4.js} +1 -1
- package/storybook-static/assets/{DateInput-D_BjVnON.js → DateInput-BywQIAiH.js} +1 -1
- package/storybook-static/assets/{DateInput-JyFcSSzH.js → DateInput-DGG89ygc.js} +1 -1
- package/storybook-static/assets/{DateInput.stories-BXamFqSK.js → DateInput.stories-BaDGhCMe.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-CnBjzwP0.js → DateRangePresetSelect-BPyhIY3S.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-5HW0LlXM.js → DateRangePresetSelect-s_2StqMd.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect.stories-BzM9q06v.js → DateRangePresetSelect.stories-DF17STL9.js} +1 -1
- package/storybook-static/assets/{Detail-CVs0NkTq.js → Detail-BugMUTtW.js} +1 -1
- package/storybook-static/assets/{Detail.stories-BDUK-3CV.js → Detail.stories-DHkuMfR7.js} +1 -1
- package/storybook-static/assets/{Dialog-D05c6OL5.js → Dialog-DshCmYwr.js} +1 -1
- package/storybook-static/assets/{Dialog.stories-CK0kiLGo.js → Dialog.stories-BSi7akeW.js} +1 -1
- package/storybook-static/assets/{Disclosure-A8bS_6y5.js → Disclosure-CU-pegOS.js} +1 -1
- package/storybook-static/assets/{Disclosure.stories-mol8jRhI.js → Disclosure.stories-B4AVnYzF.js} +1 -1
- package/storybook-static/assets/{DocsRenderer-JROSPFPF-Dxrzjrhe.js → DocsRenderer-JROSPFPF-UspHN6Nr.js} +2 -2
- package/storybook-static/assets/{DropZone-CkNtivw_.js → DropZone-CHT2yTPB.js} +1 -1
- package/storybook-static/assets/{DropZone.stories-BCj0fFjw.js → DropZone.stories-CNO0o4Zg.js} +1 -1
- package/storybook-static/assets/{DropdownMenu-CG8U1WuI.js → DropdownMenu-BiC8osPQ.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel.stories-CRind3Wl.js → ExpandableActionPanel.stories-B7WYSnwP.js} +1 -1
- package/storybook-static/assets/{Flex-D1vaZnA1.js → Flex-BZTb6Ls6.js} +1 -1
- package/storybook-static/assets/{Flex-DSMWhdL8.js → Flex-BcPeLHNU.js} +1 -1
- package/storybook-static/assets/{Flex.stories-EJ-TT3O-.js → Flex.stories-uM7r49Jq.js} +1 -1
- package/storybook-static/assets/{Grid-DkHUHR2b.js → Grid-EHSb1euM.js} +1 -1
- package/storybook-static/assets/{Grid-BVrIwkQn.js → Grid-fJQh5Vul.js} +1 -1
- package/storybook-static/assets/{Grid.stories-Cb1KWhSo.js → Grid.stories-CqeiX_AH.js} +1 -1
- package/storybook-static/assets/{ImageCropper.stories-B_Ff5EhO.js → ImageCropper.stories-BZC2r8xr.js} +1 -1
- package/storybook-static/assets/{ImageRenderer-BeYmvtFu.js → ImageRenderer-Cnnx30sU.js} +1 -1
- package/storybook-static/assets/{ImageRenderer.stories-_U6PQ5s0.js → ImageRenderer.stories-BgBvkbZ-.js} +1 -1
- package/storybook-static/assets/{ImageView.stories-Bh17T4cZ.js → ImageView.stories-Bg85Aayj.js} +1 -1
- package/storybook-static/assets/{Input-UE0kbOUc.js → Input-Cq_1mpmx.js} +1 -1
- package/storybook-static/assets/{Input-DqkpneO3.js → Input-DrlKVI51.js} +1 -1
- package/storybook-static/assets/{Input.stories-CFEO0SLd.js → Input.stories-BHTzCeNd.js} +1 -1
- package/storybook-static/assets/{InputDateTime-RvoVvU9H.js → InputDateTime-Bwdn4dwr.js} +1 -1
- package/storybook-static/assets/{InputDateTime.stories-UCTcJOk4.js → InputDateTime.stories-DWZLY6-q.js} +1 -1
- package/storybook-static/assets/{InputFile-Cwb5Aung.js → InputFile-kjPD2D6b.js} +1 -1
- package/storybook-static/assets/{InputFile.stories-Ckuxi-zr.js → InputFile.stories-C9fMevjs.js} +1 -1
- package/storybook-static/assets/{InputFiles-C89x8KHV.js → InputFiles-1i_xo439.js} +1 -1
- package/storybook-static/assets/{InputFiles-C9B1dD_R.js → InputFiles-BPW2NUcJ.js} +1 -1
- package/storybook-static/assets/{InputFiles.stories-7gqx5B4Y.js → InputFiles.stories-DxdLOKbl.js} +1 -1
- package/storybook-static/assets/{InputImage-BXBIgcz5.js → InputImage-ClXtDHy9.js} +1 -1
- package/storybook-static/assets/{InputImage.stories-CcJ3kjDY.js → InputImage.stories-D3hw0C1x.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-hTNxtlTj.js → LayoutPicker-DmTnYW62.js} +1 -1
- package/storybook-static/assets/{LayoutPicker.stories-c8zR5DnT.js → LayoutPicker.stories-CZPA3-Ci.js} +1 -1
- package/storybook-static/assets/{Listbox-DUIb79f5.js → Listbox-DV98iUDZ.js} +1 -1
- package/storybook-static/assets/{Listbox.stories-CY3MwnZ5.js → Listbox.stories-BFHG7-fh.js} +1 -1
- package/storybook-static/assets/{Modal-CPseWXNJ.js → Modal-hL7CzAFH.js} +1 -1
- package/storybook-static/assets/{Modal.stories-Cxw2ZRgQ.js → Modal.stories-DKyOv2Vj.js} +1 -1
- package/storybook-static/assets/{MultiSelect-Bt3N0rgp.js → MultiSelect-D23pcECY.js} +1 -1
- package/storybook-static/assets/{MultiSelect-Bf5YxYfN.js → MultiSelect-hT_fw4sf.js} +1 -1
- package/storybook-static/assets/{MultiSelect.stories-ajKJ1wl2.js → MultiSelect.stories-B0gUdW3k.js} +1 -1
- package/storybook-static/assets/{NotificationsHost-DmAk6K6A.js → NotificationsHost-ClQwHzJ_.js} +1 -1
- package/storybook-static/assets/{NotificationsHost.stories-C3EicsDL.js → NotificationsHost.stories-BzPPbNiK.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect-BpSU_AG9.js → ODataMultiSelect-CCP1tbCi.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect.stories-CLEKhMDU.js → ODataMultiSelect.stories-CnlXtZKW.js} +1 -1
- package/storybook-static/assets/{ODataSelect-W-T83U4u.js → ODataSelect-BJstdz9E.js} +1 -1
- package/storybook-static/assets/{ODataSelect-naz-8rqO.js → ODataSelect-Du2-88av.js} +1 -1
- package/storybook-static/assets/{ODataSelect.stories-BlwRaCjm.js → ODataSelect.stories-BvAeuhiH.js} +1 -1
- package/storybook-static/assets/{ODataTreeMultiSelect-BF3VGPGC.js → ODataTreeMultiSelect-BCm7XhFB.js} +1 -1
- package/storybook-static/assets/{ODataTreeMultiSelect.stories-DXFNpGVh.js → ODataTreeMultiSelect.stories-DKT1FMOy.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect-KkeyBQOB.js → ODataTreeSelect-Bibf7s2z.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect.stories-B3LS8B-K.js → ODataTreeSelect.stories-CCeNqvIR.js} +1 -1
- package/storybook-static/assets/{PeriodSelect-sqbTEh2-.js → PeriodSelect-DLs8Hg0X.js} +1 -1
- package/storybook-static/assets/{PeriodSelect.stories-D0o5c-aW.js → PeriodSelect.stories-C_XS3c7e.js} +1 -1
- package/storybook-static/assets/{Popover-BeVnS58h.js → Popover-SXa3jBxm.js} +1 -1
- package/storybook-static/assets/{Popover.stories-Bx7wB6zP.js → Popover.stories-rR7JkQfu.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-DMJx6huf.js → PresetRangeDateInput-dfDuKD_z.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput.stories-CGHogk29.js → PresetRangeDateInput.stories-CmRecC0S.js} +1 -1
- package/storybook-static/assets/{RadioButton-DuYV7oLX.js → RadioButton-BivcuQIh.js} +1 -1
- package/storybook-static/assets/{RadioButton.stories-BzEefd1p.js → RadioButton.stories-Cio250wJ.js} +1 -1
- package/storybook-static/assets/{RadioGroup-C0ZMTtyS.js → RadioGroup-C0Wirtog.js} +1 -1
- package/storybook-static/assets/{RadioGroup-DIymc9Lq.js → RadioGroup-D8LzcclQ.js} +1 -1
- package/storybook-static/assets/{RadioGroup.stories-DJhjmjZ3.js → RadioGroup.stories-gYFTEm7L.js} +1 -1
- package/storybook-static/assets/{Select-DTrqfSb7.js → Select-B737vUeI.js} +1 -1
- package/storybook-static/assets/{Select-B_oN8tGy.js → Select-C5ObFms-.js} +1 -1
- package/storybook-static/assets/{Select.stories-CPQaxErx.js → Select.stories-1-tb5-TQ.js} +1 -1
- package/storybook-static/assets/{SelectOptionContent-CBu-Z8q9.js → SelectOptionContent-RA3YQEN1.js} +1 -1
- package/storybook-static/assets/{SerializableSelect-B8vNCKe6.js → SerializableSelect-CKOPEv90.js} +1 -1
- package/storybook-static/assets/{SerializableSelect-Cn6FnANb.js → SerializableSelect-D6p7Qkk_.js} +1 -1
- package/storybook-static/assets/{SerializableSelect.stories-B0gNlX9R.js → SerializableSelect.stories-C3l_ojuW.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput-HdoxMDg5.js → SingleDateTimeInput-C-EH5-4w.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput.stories-BWTJvkfh.js → SingleDateTimeInput.stories-WcN90RJQ.js} +1 -1
- package/storybook-static/assets/{Slider-B9zsG5_o.js → Slider-DgZ9jGV_.js} +1 -1
- package/storybook-static/assets/{Slider.stories-B4R-Ojy6.js → Slider.stories-BN6M0546.js} +1 -1
- package/storybook-static/assets/{SliderInput-ecY-t6ii.js → SliderInput-BDDf5ljP.js} +1 -1
- package/storybook-static/assets/{SliderInput.stories-Bq1WNiBu.js → SliderInput.stories-COR3rS29.js} +1 -1
- package/storybook-static/assets/{Sortable-BrcZpWjl.js → Sortable-DN7Kb-Q_.js} +1 -1
- package/storybook-static/assets/{Sortable.stories-C9APYJGM.js → Sortable.stories-zRM1Phps.js} +1 -1
- package/storybook-static/assets/{Splitter-zcD_78Cs.js → Splitter-Bk98rR7j.js} +1 -1
- package/storybook-static/assets/{Splitter.stories-Bh3dux3i.js → Splitter.stories-B9CZFmcK.js} +1 -1
- package/storybook-static/assets/{StateSelect--2hZlmsM.js → StateSelect-DFhsyVBP.js} +1 -1
- package/storybook-static/assets/{StateSelect.stories-Cel6i2fC.js → StateSelect.stories-BcUz8RNT.js} +1 -1
- package/storybook-static/assets/{Switch-QlyZfEqf.js → Switch-Cenm3lp0.js} +1 -1
- package/storybook-static/assets/{Switch.stories-BB3h3c5K.js → Switch.stories-Deck0xn9.js} +1 -1
- package/storybook-static/assets/{Table-qUmGsDT8.js → Table-D0mqxsmk.js} +1 -1
- package/storybook-static/assets/{Table.stories-CYPyFV0A.js → Table.stories-DJdDS-vt.js} +1 -1
- package/storybook-static/assets/{Tabs-CyloJDHY.js → Tabs-C_UydsUc.js} +1 -1
- package/storybook-static/assets/{Tabs.stories-DSl3G7Ze.js → Tabs.stories-DPN4f4ia.js} +1 -1
- package/storybook-static/assets/{Textarea-BwY6pr1A.js → Textarea-DR_6_kXC.js} +1 -1
- package/storybook-static/assets/{Textarea.stories-DNFuMzL8.js → Textarea.stories-BY6wMIfV.js} +1 -1
- package/storybook-static/assets/{TimePanel-DfD2qCKU.js → TimePanel-D30NeTN1.js} +1 -1
- package/storybook-static/assets/{TimePanel.stories-CtKmIrYQ.js → TimePanel.stories-DQebBAT1.js} +1 -1
- package/storybook-static/assets/{Toggle-9OU_0OxQ.js → Toggle-CiKKBdwN.js} +1 -1
- package/storybook-static/assets/{Toggle.stories-gX7GAhf5.js → Toggle.stories-DhcLhXi0.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-xleloE3L.js → TreeMultiSelect-BKhWTTud.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-D6FZp3ol.js → TreeMultiSelect-W7KfPR_Z.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect.stories-TNrQi3tC.js → TreeMultiSelect.stories-nXP3P2Os.js} +1 -1
- package/storybook-static/assets/{TreePickerBase-CKrFw1xA.js → TreePickerBase-BKBGeL6X.js} +1 -1
- package/storybook-static/assets/{TreeSelect-KbC_b2h7.js → TreeSelect-CkDg1wJA.js} +1 -1
- package/storybook-static/assets/{TreeSelect-DK87hY70.js → TreeSelect-CwcGtVsA.js} +1 -1
- package/storybook-static/assets/{TreeSelect.stories-Dv24g8uv.js → TreeSelect.stories-vOWRtovd.js} +1 -1
- package/storybook-static/assets/{TreeTable-DNyOKFIY.js → TreeTable-BiVd6vET.js} +1 -1
- package/storybook-static/assets/{TreeTable.stories-g84YOpcn.js → TreeTable.stories-CmH5jmwM.js} +1 -1
- package/storybook-static/assets/{WithTooltip-7X4HQR7L-DTYeAnYl.js → WithTooltip-7X4HQR7L-aLpVnFpb.js} +1 -1
- package/storybook-static/assets/{base-table-ChlvVz_l.js → base-table-BpVO9KT9.js} +1 -1
- package/storybook-static/assets/{blocks-nvFBZnmF.js → blocks-DoPnTsyg.js} +6 -6
- package/storybook-static/assets/{button-DxVxb_AQ.js → button-GO_OT5aH.js} +1 -1
- package/storybook-static/assets/{check-box-b5_2dw6S.js → check-box-DAQgEdFF.js} +1 -1
- package/storybook-static/assets/{chunk-3LY4VQVK-HxSHgfWj.js → chunk-3LY4VQVK-BONHkyBf.js} +1 -1
- package/storybook-static/assets/{chunk-LITCR56V-ojcamuDf.js → chunk-LITCR56V-BVF-KYVd.js} +1 -1
- package/storybook-static/assets/{contextMenu-BOr3FdXR.js → contextMenu-BN_nodeg.js} +1 -1
- package/storybook-static/assets/{error-gSnleOdo.js → error-B6AQmhXG.js} +1 -1
- package/storybook-static/assets/{flex-nhxot7pG.js → flex-DVKfO80p.js} +1 -1
- package/storybook-static/assets/{floating-ui.react-DBHno7PC.js → floating-ui.react-DGTgiAdH.js} +1 -1
- package/storybook-static/assets/formatter-L2YTDE3Q-DT96-80k.js +1 -0
- package/storybook-static/assets/{formatters-Cnj-VWHB.js → formatters-Dzo8Pnex.js} +1 -1
- package/storybook-static/assets/grid-BhEsHhF8.js +1 -0
- package/storybook-static/assets/{hooks-DOtYpswn.js → hooks-CpDSHDMN.js} +1 -1
- package/storybook-static/assets/{iframe-CELq1yHK.js → iframe-CTboIfoI.js} +3 -3
- package/storybook-static/assets/{input-Bq20EuR5.js → input-DD2xaJKI.js} +1 -1
- package/storybook-static/assets/{lucide-react-DaLrYAcN.js → lucide-react-gtfXEQZ7.js} +1 -1
- package/storybook-static/assets/{mdx-react-shim-BUeZ3JmE.js → mdx-react-shim-DOISS71W.js} +1 -1
- package/storybook-static/assets/{media-7gU-mKPx.js → media-xUSqwRJF.js} +1 -1
- package/storybook-static/assets/misc-D1Z0nw9S.js +5 -0
- package/storybook-static/assets/misc-D9dXokhF.css +1 -0
- package/storybook-static/assets/{notifications-GJTI8j3c.js → notifications-CWxiJcV-.js} +1 -1
- package/storybook-static/assets/{odata-gGnv74mq.js → odata-PGHrDwPA.js} +1 -1
- package/storybook-static/assets/odata-service-XyWC7XJb.js +1 -0
- package/storybook-static/assets/{odataStoryFixtures-D6PpTODP.js → odataStoryFixtures-B0ggeKvL.js} +1 -1
- package/storybook-static/assets/{picker-xfAX_wju.js → picker-DR1p3GaI.js} +1 -1
- package/storybook-static/assets/{popover-CIF-ZVaN.js → popover-D0spGyn8.js} +1 -1
- package/storybook-static/assets/{preset-select-CiuJ-Yp0.js → preset-select-DIVtd6Ma.js} +1 -1
- package/storybook-static/assets/{react-18-BRX9FbGe.js → react-18-BW39uoSY.js} +1 -1
- package/storybook-static/assets/{react-A5qSDxGl.js → react-D66xb1cV.js} +1 -1
- package/storybook-static/assets/{react-dom-BRUL6UMQ.js → react-dom-B8H6ZjRK.js} +1 -1
- package/storybook-static/assets/select-Dr2NjwXE.js +1 -0
- package/storybook-static/assets/{slider-PVNNrxhZ.js → slider-DBMU3Zyk.js} +1 -1
- package/storybook-static/assets/{sortable-DlbQfnOR.js → sortable-aygBVsVu.js} +1 -1
- package/storybook-static/assets/{syntaxhighlighter-RTCFPKCB-AHhtM7MH.js → syntaxhighlighter-RTCFPKCB-BmTfzeWy.js} +1 -1
- package/storybook-static/assets/{text-DyVJvCm8.js → text-BE5Uqo4p.js} +1 -1
- package/storybook-static/assets/{theming-ClhUCD3-.js → theming-A6fWw02F.js} +1 -1
- package/storybook-static/assets/ui-DW-Seccl.js +1 -0
- package/storybook-static/assets/{useODataSelectBase-BonuBTfa.js → useODataSelectBase-BivsfJ24.js} +1 -1
- package/storybook-static/assets/{useODataTreeData-DwO49vDk.js → useODataTreeData-DAop_xYb.js} +1 -1
- package/storybook-static/assets/{utils-V012ES4W.js → utils-BAfp5vsY.js} +1 -1
- package/storybook-static/iframe.html +1 -1
- package/storybook-static/project.json +1 -1
- package/dist/chunks/misc-ClXJygTj.js.map +0 -1
- package/storybook-static/assets/formatter-L2YTDE3Q-B5zfJybp.js +0 -1
- package/storybook-static/assets/grid-B-H7CtbE.js +0 -1
- package/storybook-static/assets/misc-BsWm_Gl7.js +0 -5
- package/storybook-static/assets/misc-CerLA5Xh.css +0 -1
- package/storybook-static/assets/odata-service-Bz6VElCd.js +0 -1
- package/storybook-static/assets/select-CbSahuRN.js +0 -1
- package/storybook-static/assets/ui-DvOsIS0A.js +0 -1
|
@@ -8,41 +8,36 @@ import { CheckCheckIcon as f, ChevronLeftIcon as p, ChevronRightIcon as m, Circl
|
|
|
8
8
|
import { jsx as b, jsxs as x } from "react/jsx-runtime";
|
|
9
9
|
import { useCopyElementTextWithFeedback as S } from "@ryuzaki13/react-foundation-lib/copy";
|
|
10
10
|
import { useLazyComponent as C } from "@ryuzaki13/react-foundation-lib/hooks";
|
|
11
|
+
var w = {
|
|
12
|
+
logo: "l9LG-r",
|
|
13
|
+
segment: "u4bkNy",
|
|
14
|
+
pulseSteps: "S-r8hY"
|
|
15
|
+
};
|
|
16
|
+
//#endregion
|
|
11
17
|
//#region src/misc/AnimatedLogo.tsx
|
|
12
|
-
function
|
|
18
|
+
function T({ children: e, className: t, ...n }) {
|
|
13
19
|
return /* @__PURE__ */ b("div", {
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}),
|
|
31
|
-
/* @__PURE__ */ b("path", {
|
|
32
|
-
className: "logoSegment logoOutline logoS3",
|
|
33
|
-
d: "M276,15h297s0,225,0,225h-217c-44.18,0-80-35.82-80-80V15Z"
|
|
34
|
-
}),
|
|
35
|
-
/* @__PURE__ */ b("path", {
|
|
36
|
-
className: "logoSegment logoFill logoS4",
|
|
37
|
-
d: "M573,285v108h-169c-11.05,0-20,8.95-20,20v268h-108v-316c0-44.18,35.82-80,80-80h217Z"
|
|
38
|
-
})
|
|
39
|
-
]
|
|
40
|
-
})
|
|
20
|
+
...n,
|
|
21
|
+
className: d(w.logo, t),
|
|
22
|
+
children: e
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
//#endregion
|
|
26
|
+
//#region src/misc/AnimatedLogoSegment.tsx
|
|
27
|
+
function E({ children: e, className: t, order: n, style: r, ...i }) {
|
|
28
|
+
return /* @__PURE__ */ b("g", {
|
|
29
|
+
...i,
|
|
30
|
+
className: d(w.segment, t),
|
|
31
|
+
style: {
|
|
32
|
+
...r,
|
|
33
|
+
animationDelay: `${n * 200}ms`
|
|
34
|
+
},
|
|
35
|
+
children: e
|
|
41
36
|
});
|
|
42
37
|
}
|
|
43
38
|
//#endregion
|
|
44
39
|
//#region src/misc/CopyTextWrapper.tsx
|
|
45
|
-
var
|
|
40
|
+
var D = ({ children: t, position: n = "top", showOnHover: r = !0, className: i }) => {
|
|
46
41
|
let { containerRef: a, copyElementText: o, isCopied: s } = S();
|
|
47
42
|
return /* @__PURE__ */ x("span", {
|
|
48
43
|
ref: a,
|
|
@@ -58,16 +53,16 @@ var T = ({ children: t, position: n = "top", showOnHover: r = !0, className: i }
|
|
|
58
53
|
})
|
|
59
54
|
})]
|
|
60
55
|
});
|
|
61
|
-
},
|
|
56
|
+
}, O = { wrapper: "_0wk7Sq" };
|
|
62
57
|
//#endregion
|
|
63
58
|
//#region src/misc/IconWrapper.tsx
|
|
64
|
-
function
|
|
59
|
+
function k({ className: e, children: t }) {
|
|
65
60
|
return /* @__PURE__ */ b("div", {
|
|
66
|
-
className: d(
|
|
61
|
+
className: d(O.wrapper, e),
|
|
67
62
|
children: t
|
|
68
63
|
});
|
|
69
64
|
}
|
|
70
|
-
var
|
|
65
|
+
var A = { componentLoader: "qgIKVo" }, j = ({ className: e, children: r, color: i = "muted", minHeight: a, uppercase: o = !0 }) => /* @__PURE__ */ b(n, {
|
|
71
66
|
className: d("paddingMd textCenter", e),
|
|
72
67
|
minHeight: a,
|
|
73
68
|
children: /* @__PURE__ */ b(t, {
|
|
@@ -80,17 +75,17 @@ var O = { componentLoader: "qgIKVo" }, k = ({ className: e, children: r, color:
|
|
|
80
75
|
});
|
|
81
76
|
//#endregion
|
|
82
77
|
//#region src/misc/LoadingMessage.tsx
|
|
83
|
-
function
|
|
84
|
-
return /* @__PURE__ */ x(
|
|
85
|
-
className: d(
|
|
86
|
-
children: [
|
|
78
|
+
function M({ className: e, logo: t, text: n }) {
|
|
79
|
+
return /* @__PURE__ */ x(j, {
|
|
80
|
+
className: d(A.componentLoader, t ? void 0 : "skeletonLine", e),
|
|
81
|
+
children: [t, n || "Загрузка..."]
|
|
87
82
|
});
|
|
88
83
|
}
|
|
89
84
|
//#endregion
|
|
90
85
|
//#region src/misc/LazyDynamicComponent.tsx
|
|
91
|
-
var
|
|
92
|
-
function
|
|
93
|
-
let s = C(t, n, a), c = u(
|
|
86
|
+
var N = (e) => (e(), () => void 0), P = () => !0, F = () => !1;
|
|
87
|
+
function I({ fallback: e, importFunc: t, componentName: n, clientOnly: r = !1, cacheKey: a, props: o }) {
|
|
88
|
+
let s = C(t, n, a), c = u(N, P, F), l = e ?? /* @__PURE__ */ b(M, { text: "Ожидание компонента..." });
|
|
94
89
|
return r && !c ? l : /* @__PURE__ */ b(i, {
|
|
95
90
|
fallback: l,
|
|
96
91
|
children: /* @__PURE__ */ b(s, { ...o ?? {} })
|
|
@@ -98,37 +93,37 @@ function P({ fallback: e, importFunc: t, componentName: n, clientOnly: r = !1, c
|
|
|
98
93
|
}
|
|
99
94
|
//#endregion
|
|
100
95
|
//#region src/misc/SkeletonLine.tsx
|
|
101
|
-
var
|
|
96
|
+
var L = ({ as: e, className: t, ...n }) => /* @__PURE__ */ b(r, {
|
|
102
97
|
as: e || "div",
|
|
103
98
|
className: d("skeletonLine colorTransparent radiusSm", t),
|
|
104
99
|
...n
|
|
105
100
|
});
|
|
106
101
|
//#endregion
|
|
107
102
|
//#region src/misc/LazyValue.tsx
|
|
108
|
-
function
|
|
109
|
-
return t ? /* @__PURE__ */ b(
|
|
103
|
+
function R({ value: e, isLoading: t }) {
|
|
104
|
+
return t ? /* @__PURE__ */ b(L, { children: "Загрузка..." }) : e ?? "-";
|
|
110
105
|
}
|
|
111
106
|
//#endregion
|
|
112
107
|
//#region src/misc/NoData.tsx
|
|
113
|
-
var
|
|
108
|
+
var z = ({ className: e, text: t, minHeight: n = "5em" }) => /* @__PURE__ */ b(j, {
|
|
114
109
|
className: e,
|
|
115
110
|
color: "muted",
|
|
116
111
|
minHeight: n,
|
|
117
112
|
children: t || "Нет данных"
|
|
118
|
-
}),
|
|
113
|
+
}), B = ({ className: e, isError: t, children: n }) => /* @__PURE__ */ b(j, {
|
|
119
114
|
className: e,
|
|
120
115
|
color: t ? "error" : "secondary",
|
|
121
116
|
children: n
|
|
122
|
-
}),
|
|
117
|
+
}), V = {
|
|
123
118
|
oneStepScroller: "_7xUQBN",
|
|
124
119
|
ossViewport: "AonLqg",
|
|
125
120
|
ossScroller: "j-5yFn",
|
|
126
121
|
ossButton: "pOIq63"
|
|
127
|
-
},
|
|
128
|
-
function
|
|
122
|
+
}, H = 1;
|
|
123
|
+
function U(e) {
|
|
129
124
|
return Math.max(0, e.scrollWidth - e.clientWidth);
|
|
130
125
|
}
|
|
131
|
-
var
|
|
126
|
+
var W = ({ children: e, className: t, itemSelector: n, scrollPadding: r = 6, smooth: i = !0 }) => {
|
|
132
127
|
let a = c(null), u = c(null), [f, h] = l(!1), [g, _] = l(!1), v = o(() => {
|
|
133
128
|
let e = a.current;
|
|
134
129
|
return e ? n ? Array.from(e.querySelectorAll(n)) : Array.from(e.children).filter((e) => e instanceof HTMLElement) : [];
|
|
@@ -148,7 +143,7 @@ var H = ({ children: e, className: t, itemSelector: n, scrollPadding: r = 6, smo
|
|
|
148
143
|
h(!1), _(!1);
|
|
149
144
|
return;
|
|
150
145
|
}
|
|
151
|
-
let t = Math.max(0, e.scrollWidth - e.clientWidth), n = Math.max(0, Math.min(e.scrollLeft, t)), r = n >
|
|
146
|
+
let t = Math.max(0, e.scrollWidth - e.clientWidth), n = Math.max(0, Math.min(e.scrollLeft, t)), r = n > H, i = n < t - H;
|
|
152
147
|
h((e) => e === r ? e : r), _((e) => e === i ? e : i);
|
|
153
148
|
}, []), C = o(() => {
|
|
154
149
|
u.current === null && (u.current = requestAnimationFrame(() => {
|
|
@@ -170,9 +165,9 @@ var H = ({ children: e, className: t, itemSelector: n, scrollPadding: r = 6, smo
|
|
|
170
165
|
let t = a.current;
|
|
171
166
|
if (!t) return;
|
|
172
167
|
let n = t.getBoundingClientRect(), o = e.getBoundingClientRect(), s = o.left - n.left + t.scrollLeft, c = s + o.width, l = t.scrollLeft, u = t.scrollLeft + t.clientWidth;
|
|
173
|
-
if (s >= l +
|
|
168
|
+
if (s >= l + H && c <= u - H) return;
|
|
174
169
|
let d = t.scrollLeft;
|
|
175
|
-
s < l ? d = Math.max(0, s - r) : c > u && (d = Math.min(
|
|
170
|
+
s < l ? d = Math.max(0, s - r) : c > u && (d = Math.min(U(t), c - t.clientWidth + r)), t.scrollTo({
|
|
176
171
|
left: Math.round(d),
|
|
177
172
|
behavior: i ? "smooth" : "auto"
|
|
178
173
|
});
|
|
@@ -208,24 +203,24 @@ var H = ({ children: e, className: t, itemSelector: n, scrollPadding: r = 6, smo
|
|
|
208
203
|
e.key === "ArrowLeft" ? (e.preventDefault(), E()) : e.key === "ArrowRight" && (e.preventDefault(), D());
|
|
209
204
|
}, k = f || g;
|
|
210
205
|
return /* @__PURE__ */ x("div", {
|
|
211
|
-
className: d(
|
|
206
|
+
className: d(V.oneStepScroller, t),
|
|
212
207
|
style: { position: "relative" },
|
|
213
208
|
children: [
|
|
214
209
|
k && /* @__PURE__ */ b("button", {
|
|
215
210
|
type: "button",
|
|
216
211
|
"aria-label": "Прокрутить шаг влево",
|
|
217
|
-
className:
|
|
212
|
+
className: V.ossButton,
|
|
218
213
|
onClick: E,
|
|
219
214
|
disabled: !f,
|
|
220
215
|
children: /* @__PURE__ */ b(p, {})
|
|
221
216
|
}),
|
|
222
217
|
/* @__PURE__ */ b("div", {
|
|
223
|
-
className:
|
|
218
|
+
className: V.ossViewport,
|
|
224
219
|
onKeyDown: O,
|
|
225
220
|
role: "group",
|
|
226
221
|
"aria-label": "Элементы прокрутки",
|
|
227
222
|
children: /* @__PURE__ */ b("div", {
|
|
228
|
-
className:
|
|
223
|
+
className: V.ossScroller,
|
|
229
224
|
ref: a,
|
|
230
225
|
"aria-live": "polite",
|
|
231
226
|
children: e
|
|
@@ -234,14 +229,14 @@ var H = ({ children: e, className: t, itemSelector: n, scrollPadding: r = 6, smo
|
|
|
234
229
|
k && /* @__PURE__ */ b("button", {
|
|
235
230
|
type: "button",
|
|
236
231
|
"aria-label": "Прокрутить шаг вправо",
|
|
237
|
-
className:
|
|
232
|
+
className: V.ossButton,
|
|
238
233
|
onClick: D,
|
|
239
234
|
disabled: !g,
|
|
240
235
|
children: /* @__PURE__ */ b(m, {})
|
|
241
236
|
})
|
|
242
237
|
]
|
|
243
238
|
});
|
|
244
|
-
},
|
|
239
|
+
}, G = a(({ children: e, height: t, stable: n, overscroll: r, className: i }, a) => /* @__PURE__ */ b("div", {
|
|
245
240
|
ref: a,
|
|
246
241
|
className: d("scrollable", n && "stable", r && "overscroll", i),
|
|
247
242
|
style: { height: t },
|
|
@@ -249,12 +244,12 @@ var H = ({ children: e, className: t, itemSelector: n, scrollPadding: r = 6, smo
|
|
|
249
244
|
}));
|
|
250
245
|
a(({ blockClassName: e, ...t }, n) => /* @__PURE__ */ b("div", {
|
|
251
246
|
className: d(e, "overflowHidden w100 h100"),
|
|
252
|
-
children: /* @__PURE__ */ b(
|
|
247
|
+
children: /* @__PURE__ */ b(G, {
|
|
253
248
|
ref: n,
|
|
254
249
|
...t
|
|
255
250
|
})
|
|
256
251
|
}));
|
|
257
|
-
var
|
|
252
|
+
var K = {
|
|
258
253
|
stateWrapper: "UMTbLD",
|
|
259
254
|
status: "cz57Fx",
|
|
260
255
|
information: "oPzAxu",
|
|
@@ -262,37 +257,37 @@ var W = {
|
|
|
262
257
|
warning: "_03z-1l",
|
|
263
258
|
error: "_0RqsqJ",
|
|
264
259
|
state: "mXkUoM"
|
|
265
|
-
},
|
|
260
|
+
}, q = ({ state: e = "none", text: t, className: n }) => /* @__PURE__ */ x("div", {
|
|
266
261
|
className: d("flexCenter gapSm", n),
|
|
267
262
|
children: [(() => {
|
|
268
263
|
switch (e) {
|
|
269
|
-
case "error": return /* @__PURE__ */ b(
|
|
270
|
-
case "warning": return /* @__PURE__ */ b(
|
|
271
|
-
case "success": return /* @__PURE__ */ b(
|
|
272
|
-
case "information": return /* @__PURE__ */ b(
|
|
264
|
+
case "error": return /* @__PURE__ */ b(Y, {});
|
|
265
|
+
case "warning": return /* @__PURE__ */ b(X, {});
|
|
266
|
+
case "success": return /* @__PURE__ */ b(Z, {});
|
|
267
|
+
case "information": return /* @__PURE__ */ b(Q, {});
|
|
273
268
|
default: return null;
|
|
274
269
|
}
|
|
275
270
|
})(), t]
|
|
276
|
-
}),
|
|
271
|
+
}), J = ({ state: e }) => {
|
|
277
272
|
switch (e) {
|
|
278
|
-
case "error": return /* @__PURE__ */ b(
|
|
279
|
-
case "warning": return /* @__PURE__ */ b(
|
|
280
|
-
case "success": return /* @__PURE__ */ b(
|
|
281
|
-
case "information": return /* @__PURE__ */ b(
|
|
273
|
+
case "error": return /* @__PURE__ */ b(Y, {});
|
|
274
|
+
case "warning": return /* @__PURE__ */ b(X, {});
|
|
275
|
+
case "success": return /* @__PURE__ */ b(Z, {});
|
|
276
|
+
case "information": return /* @__PURE__ */ b(Q, {});
|
|
282
277
|
default: return null;
|
|
283
278
|
}
|
|
284
|
-
},
|
|
279
|
+
}, Y = () => /* @__PURE__ */ b(_, { className: d(K.state, K.error) }), X = () => /* @__PURE__ */ b(h, { className: d(K.state, K.warning) }), Z = () => /* @__PURE__ */ b(g, { className: d(K.state, K.success) }), Q = () => /* @__PURE__ */ b(y, { className: d(K.state, K.information) });
|
|
285
280
|
//#endregion
|
|
286
281
|
//#region src/misc/StateWrapper.tsx
|
|
287
|
-
function
|
|
288
|
-
let a = t?.toLowerCase() ?? "none", o =
|
|
282
|
+
function $({ as: e, state: t, className: n, ...i }) {
|
|
283
|
+
let a = t?.toLowerCase() ?? "none", o = K[a], s = a && a !== "none";
|
|
289
284
|
return /* @__PURE__ */ b(r, {
|
|
290
285
|
as: e || "div",
|
|
291
|
-
className: d(
|
|
286
|
+
className: d(K.stateWrapper, s && K.status, o, n),
|
|
292
287
|
...i
|
|
293
288
|
});
|
|
294
289
|
}
|
|
295
290
|
//#endregion
|
|
296
|
-
export {
|
|
291
|
+
export { k as _, q as a, T as b, G as c, z as d, R as f, j as g, M as h, J as i, W as l, I as m, Y as n, Z as o, L as p, Q as r, X as s, $ as t, B as u, D as v, E as y };
|
|
297
292
|
|
|
298
|
-
//# sourceMappingURL=misc-
|
|
293
|
+
//# sourceMappingURL=misc-DIF5h9ba.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"misc-DIF5h9ba.js","names":[],"sources":["../../src/misc/AnimatedLogo.module.scss","../../src/misc/AnimatedLogo.tsx","../../src/misc/AnimatedLogoSegment.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":[".logo {\n\tmax-width: 10em;\n\tmargin: var(--space-md) auto;\n\n\tsvg {\n\t\tdisplay: block;\n\t\twidth: 100%;\n\t\theight: auto;\n\t}\n}\n\n.segment {\n\topacity: 0.22;\n\tanimation: pulseSteps 1.8s ease-in-out infinite;\n}\n\n@keyframes pulseSteps {\n\t0% {\n\t\topacity: 0.2;\n\t}\n\n\t35%,\n\t55% {\n\t\topacity: 1;\n\t}\n\n\t100% {\n\t\topacity: 0.2;\n\t}\n}\n\n@media (prefers-reduced-motion: reduce) {\n\t.segment {\n\t\tanimation: none;\n\t\topacity: 1;\n\t}\n}\n","import { type ComponentPropsWithoutRef, type ReactNode } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport styles from \"./AnimatedLogo.module.scss\";\n\ntype AnimatedLogoProps = Omit<ComponentPropsWithoutRef<\"div\">, \"children\"> & {\n\tchildren: ReactNode;\n};\n\n/**\n * Контейнер анимированного логотипа без брендовой SVG-разметки.\n * Host-проект передаёт собственный `svg`, а его визуальные части оборачивает в `AnimatedLogoSegment`.\n */\nexport function AnimatedLogo({ children, className, ...htmlProps }: AnimatedLogoProps) {\n\treturn (\n\t\t<div {...htmlProps} className={cn(styles.logo, className)}>\n\t\t\t{children}\n\t\t</div>\n\t);\n}\n","import { type ComponentPropsWithoutRef, type ReactNode } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport styles from \"./AnimatedLogo.module.scss\";\n\ntype AnimatedLogoSegmentProps = Omit<ComponentPropsWithoutRef<\"g\">, \"children\"> & {\n\tchildren: ReactNode;\n\torder: number;\n};\n\n/**\n * Анимирует одну смысловую часть host-логотипа и сдвигает её pulse относительно предыдущих частей.\n * `order` задаётся с нуля в визуальной последовательности сегментов и преобразуется в шаг задержки 200 мс.\n */\nexport function AnimatedLogoSegment({ children, className, order, style, ...svgGroupProps }: AnimatedLogoSegmentProps) {\n\treturn (\n\t\t<g {...svgGroupProps} className={cn(styles.segment, className)} style={{ ...style, animationDelay: `${order * 200}ms` }}>\n\t\t\t{children}\n\t\t</g>\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 { type ReactNode } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport styles from \"./LoadingMessage.module.scss\";\nimport { Message } from \"./Message\";\n\ntype LoadingMessageProps = {\n\tclassName?: string;\n\t/** Готовый брендовый знак, которым host-проект при необходимости дополняет сообщение о загрузке. */\n\tlogo?: ReactNode;\n\ttext?: string;\n};\n\nexport function LoadingMessage({ className, logo, text }: LoadingMessageProps) {\n\treturn (\n\t\t<Message className={cn(styles.componentLoader, logo ? undefined : \"skeletonLine\", className)}>\n\t\t\t{logo}\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,7 +1,7 @@
|
|
|
1
1
|
import { o as e } from "./flex-DYZ0IbU6.js";
|
|
2
2
|
import { n as t } from "./button-CC0Jdx1j.js";
|
|
3
3
|
import { r as n } from "./grid-dI94AAbi.js";
|
|
4
|
-
import { c as r } from "./misc-
|
|
4
|
+
import { c as r } from "./misc-DIF5h9ba.js";
|
|
5
5
|
import { Children as i, createContext as a, useCallback as o, useContext as s, useEffect as c, useEffectEvent as l, useId as u, useRef as d, useState as f } from "react";
|
|
6
6
|
import { cn as p } from "@ryuzaki13/react-foundation-lib/utils";
|
|
7
7
|
import { X as m } from "lucide-react";
|
|
@@ -150,4 +150,4 @@ function k({ children: e, compensateScrollbar: t = !1 }) {
|
|
|
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-Cll8YZ7b.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modal-QGp5CjB9.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\nexport interface ModalManagerProviderProps {\n\tchildren: React.ReactNode;\n\t/** Компенсирует исчезновение скроллбара правым padding у body. */\n\tcompensateScrollbar?: boolean;\n}\n\n/**\n * Провайдер для централизованного управления стеком модальных окон. Дает вложенным компонентам доступ к открытию и закрытию модалок через контекст.\n */\nexport function ModalManagerProvider({ children, compensateScrollbar = false }: ModalManagerProviderProps) {\n\tconst [modals, setModals] = useState<string[]>([]);\n\tconst prevModalsLength = useRef(0);\n\tconst scrollbarWidth = useRef(0);\n\tconst bodyPaddingRight = useRef(\"\");\n\tconst isScrollbarCompensated = useRef(false);\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\n\t\tif (wasEmpty && modals.length > 0) {\n\t\t\t// первая модалка открыта — ставим стили\n\t\t\tconst scrollY = window.scrollY;\n\t\t\tconst appRoot = document.querySelector(\"#app-root\");\n\t\t\tscrollbarWidth.current = Math.max(0, window.innerWidth - document.documentElement.clientWidth);\n\t\t\tbodyPaddingRight.current = document.body.style.paddingRight;\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\n\t\t\tif (compensateScrollbar) {\n\t\t\t\tdocument.body.style.paddingRight = `${scrollbarWidth.current}px`;\n\t\t\t\tisScrollbarCompensated.current = true;\n\t\t\t}\n\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 && modals.length > 0 && compensateScrollbar !== isScrollbarCompensated.current) {\n\t\t\tdocument.body.style.paddingRight = compensateScrollbar ? `${scrollbarWidth.current}px` : bodyPaddingRight.current;\n\t\t\tisScrollbarCompensated.current = compensateScrollbar;\n\t\t}\n\n\t\tif (!wasEmpty && modals.length === 0) {\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\n\t\t\tif (isScrollbarCompensated.current) {\n\t\t\t\tdocument.body.style.paddingRight = bodyPaddingRight.current;\n\t\t\t\tisScrollbarCompensated.current = false;\n\t\t\t}\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}, [compensateScrollbar, modals.length]);\n\n\treturn <ModalManagerContext.Provider value={{ modals, openModal, closeModal, isTopModal }}>{children}</ModalManagerContext.Provider>;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"modal-Cll8YZ7b.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\nexport interface ModalManagerProviderProps {\n\tchildren: React.ReactNode;\n\t/** Компенсирует исчезновение скроллбара правым padding у body. */\n\tcompensateScrollbar?: boolean;\n}\n\n/**\n * Провайдер для централизованного управления стеком модальных окон. Дает вложенным компонентам доступ к открытию и закрытию модалок через контекст.\n */\nexport function ModalManagerProvider({ children, compensateScrollbar = false }: ModalManagerProviderProps) {\n\tconst [modals, setModals] = useState<string[]>([]);\n\tconst prevModalsLength = useRef(0);\n\tconst scrollbarWidth = useRef(0);\n\tconst bodyPaddingRight = useRef(\"\");\n\tconst isScrollbarCompensated = useRef(false);\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\n\t\tif (wasEmpty && modals.length > 0) {\n\t\t\t// первая модалка открыта — ставим стили\n\t\t\tconst scrollY = window.scrollY;\n\t\t\tconst appRoot = document.querySelector(\"#app-root\");\n\t\t\tscrollbarWidth.current = Math.max(0, window.innerWidth - document.documentElement.clientWidth);\n\t\t\tbodyPaddingRight.current = document.body.style.paddingRight;\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\n\t\t\tif (compensateScrollbar) {\n\t\t\t\tdocument.body.style.paddingRight = `${scrollbarWidth.current}px`;\n\t\t\t\tisScrollbarCompensated.current = true;\n\t\t\t}\n\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 && modals.length > 0 && compensateScrollbar !== isScrollbarCompensated.current) {\n\t\t\tdocument.body.style.paddingRight = compensateScrollbar ? `${scrollbarWidth.current}px` : bodyPaddingRight.current;\n\t\t\tisScrollbarCompensated.current = compensateScrollbar;\n\t\t}\n\n\t\tif (!wasEmpty && modals.length === 0) {\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\n\t\t\tif (isScrollbarCompensated.current) {\n\t\t\t\tdocument.body.style.paddingRight = bodyPaddingRight.current;\n\t\t\t\tisScrollbarCompensated.current = false;\n\t\t\t}\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}, [compensateScrollbar, modals.length]);\n\n\treturn <ModalManagerContext.Provider value={{ modals, openModal, closeModal, isTopModal }}>{children}</ModalManagerContext.Provider>;\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as e, c as t, d as n, i as r, m as i, n as a, o as ee, r as te, s as ne, t as re } from "./base-table-
|
|
1
|
+
import { a as e, c as t, d as n, i as r, m as i, n as a, o as ee, r as te, s as ne, t as re } from "./base-table-BXKFSgIk.js";
|
|
2
2
|
import { useEffect as ie, useEffectEvent as ae, useMemo as o, useRef as s } from "react";
|
|
3
3
|
import { formatPipelineDisplayValue as c } from "@ryuzaki13/react-foundation-lib/formatters";
|
|
4
4
|
import { useTableRowSelection as l } from "@ryuzaki13/react-foundation-lib/table";
|
|
@@ -138,4 +138,4 @@ function m({ title: m, isLoading: h, isFetching: se, data: g, columns: _, select
|
|
|
138
138
|
//#endregion
|
|
139
139
|
export { m as t };
|
|
140
140
|
|
|
141
|
-
//# sourceMappingURL=table-
|
|
141
|
+
//# sourceMappingURL=table-BdpMzhLH.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table-tBQ_FOs3.js","names":[],"sources":["../../src/table/Table.module.scss","../../src/table/Table.tsx"],"sourcesContent":[".selectedIndicatorCell {\n\tbox-shadow: inset 0.1875rem 0 0 var(--content-accent);\n}\n\n.sentinel {\n\theight: 1px;\n}\n","/* eslint-disable react-hooks/incompatible-library */\nimport { useEffect, useEffectEvent, useMemo, useRef } from \"react\";\n\nimport { formatPipelineDisplayValue } from \"@ryuzaki13/react-foundation-lib/formatters\";\nimport { TableFormulaRowData } from \"@ryuzaki13/react-foundation-lib/formulas\";\nimport {\n\ttype TableColumnDef,\n\ttype TableColumnOrderState,\n\ttype TableColumnSizingState,\n\ttype TableSelectionMode,\n\tuseTableRowSelection\n} from \"@ryuzaki13/react-foundation-lib/table\";\nimport { getCoreRowModel, useReactTable, type Row, type VisibilityState } from \"@tanstack/react-table\";\n\nimport {\n\tBaseTable,\n\tbuildBaseTableMergedCellsLayout,\n\tbuildTableFormattingSnapshot,\n\tFormattedTableCell,\n\tgetOrderedVisibleLeafColumns,\n\tshouldUseTableFormatting,\n\tuseTableColumnOrder,\n\tuseTableColumnPinning,\n\tuseTableColumnSizing,\n\tuseTableColumnVisibility,\n\ttype BaseTableColumnState,\n\ttype BaseTableProps,\n\ttype TableColumnPinningState\n} from \"../base-table\";\n\nimport styles from \"./Table.module.scss\";\n\n/**\n * Возвращает индекс как строковый id, если внешний id не передан.\n */\nfunction defaultGetRowId<TData>(_row: TData, index: number): string {\n\treturn String(index);\n}\n\n/**\n * Пропсы компонента Table.\n *\n * Компонент предназначен для плоских данных и по API осознанно сближен с TreeTable.\n */\nexport interface TableProps<TData extends object> {\n\t/**\n\t * Необязательный заголовок над таблицей.\n\t */\n\ttitle?: string;\n\t/**\n\t * Признак первичной загрузки.\n\t */\n\tisLoading?: boolean;\n\t/**\n\t * Признак фоновой догрузки или обновления данных.\n\t */\n\tisFetching?: boolean;\n\t/**\n\t * Плоский источник строк.\n\t */\n\tdata: readonly TData[] | undefined | null;\n\t/**\n\t * Описание колонок таблицы.\n\t */\n\tcolumns: readonly TableColumnDef<TData>[];\n\t/**\n\t * Режим выбора строк.\n\t */\n\tselectionMode?: TableSelectionMode;\n\t/**\n\t * Внешний список выбранных строк.\n\t *\n\t * Если передан, таблица синхронизирует визуальное выделение с этим набором id.\n\t */\n\tselectedRowIds?: readonly string[];\n\t/**\n\t * Стабильный идентификатор строки.\n\t *\n\t * Если не задан, используется индекс строки.\n\t */\n\tgetRowId?: (row: TData, index: number) => string;\n\t/**\n\t * Дополнительный CSS-класс корневого контейнера.\n\t */\n\tclassName?: string;\n\tminHeight?: `${number}em` | `${number}%`;\n\t/**\n\t * Дополнительный CSS-класс тега `table`.\n\t */\n\ttableClassName?: string;\n\t/**\n\t * Внешнее controlled-состояние видимости колонок.\n\t */\n\tcolumnVisibility?: VisibilityState;\n\t/**\n\t * Стартовое uncontrolled-состояние видимости колонок.\n\t */\n\tdefaultColumnVisibility?: VisibilityState;\n\t/**\n\t * Внешнее controlled-состояние порядка колонок.\n\t */\n\tcolumnOrder?: readonly string[];\n\t/**\n\t * Стартовое uncontrolled-состояние порядка колонок.\n\t */\n\tdefaultColumnOrder?: readonly string[];\n\t/**\n\t * Внешнее controlled-состояние ширин колонок в px.\n\t */\n\tcolumnSizing?: TableColumnSizingState;\n\t/**\n\t * Стартовое uncontrolled-состояние ширин колонок в px.\n\t */\n\tdefaultColumnSizing?: TableColumnSizingState;\n\t/**\n\t * Внешнее controlled-состояние left-pinning для колонок.\n\t */\n\tcolumnPinning?: TableColumnPinningState;\n\t/**\n\t * Стартовое uncontrolled-состояние left-pinning для колонок.\n\t */\n\tdefaultColumnPinning?: TableColumnPinningState;\n\t/**\n\t * Включает изменение ширины колонок через header-handle.\n\t */\n\tenableColumnResizing?: boolean;\n\t/**\n\t * Включает изменение порядка колонок через drag&drop заголовков.\n\t */\n\tenableColumnReordering?: boolean;\n\t/**\n\t * Минимальная ширина колонки при resize в px.\n\t */\n\tcolumnResizeMinWidth?: number;\n\t/**\n\t * Вызывается после изменения видимости колонок.\n\t */\n\tonColumnVisibilityChange?: (state: VisibilityState) => void;\n\t/**\n\t * Вызывается после изменения порядка колонок.\n\t */\n\tonColumnOrderChange?: (state: TableColumnOrderState) => void;\n\t/**\n\t * Вызывается после изменения ширины колонок.\n\t */\n\tonColumnSizingChange?: (state: TableColumnSizingState) => void;\n\t/**\n\t * Вызывается после изменения left-pinning state.\n\t */\n\tonColumnPinningChange?: (state: TableColumnPinningState) => void;\n\t/**\n\t * Вызывается при активации строки кликом или клавиатурой.\n\t */\n\tonRowClick?: (row: TData) => void;\n\t/**\n\t * Вызывается после изменения выбранных строк.\n\t */\n\tonRowSelectionChange?: (rows: TData[]) => void;\n\t/**\n\t * Вызывается при достижении конца таблицы внутри scroll-контейнера.\n\t */\n\tonReachEnd?: () => void;\n\t/**\n\t * Позволяет запретить выбор отдельных строк.\n\t */\n\tgetRowCanSelect?: (row: TData) => boolean;\n\t/**\n\t * Позволяет добавить CSS-класс для конкретной строки.\n\t */\n\tgetRowClassName?: (row: TData) => string | undefined;\n\t/**\n\t * Контекстное меню заголовка колонки. Используется для общих runtime-действий\n\t * вроде server sorting без встраивания доменной логики в shared-таблицу.\n\t */\n\trenderHeaderContextMenu?: BaseTableProps<TData>[\"renderHeaderContextMenu\"];\n\t/**\n\t * Тонкая точка расширения содержимого ячейки поверх стандартного форматирования.\n\t *\n\t * В отличие от `column.cell`, этот слот не отключает общий formatting-runtime:\n\t * `defaultContent` уже содержит отформатированное значение, если оно применимо.\n\t */\n\trenderCellContent?: BaseTableProps<TData>[\"renderCellContent\"];\n}\n\n/**\n * Плоская таблица на базе TanStack Table как React-альтернатива `sap.m.Table`.\n */\nexport function Table<TData extends object>({\n\ttitle,\n\tisLoading,\n\tisFetching,\n\tdata,\n\tcolumns,\n\tselectionMode = \"none\",\n\tselectedRowIds,\n\tgetRowId,\n\tclassName,\n\tminHeight,\n\ttableClassName,\n\tcolumnVisibility,\n\tdefaultColumnVisibility,\n\tcolumnOrder,\n\tdefaultColumnOrder,\n\tcolumnSizing,\n\tdefaultColumnSizing,\n\tcolumnPinning,\n\tdefaultColumnPinning,\n\tenableColumnResizing = false,\n\tenableColumnReordering = false,\n\tcolumnResizeMinWidth,\n\tonColumnVisibilityChange,\n\tonColumnOrderChange,\n\tonColumnSizingChange,\n\tonColumnPinningChange,\n\tonRowClick,\n\tonRowSelectionChange,\n\tonReachEnd,\n\tgetRowCanSelect,\n\tgetRowClassName,\n\trenderHeaderContextMenu,\n\trenderCellContent\n}: TableProps<TData>) {\n\tconst tableData = useMemo(() => data ?? [], [data]);\n\tconst formattingSnapshot = useMemo(() => buildTableFormattingSnapshot(columns), [columns]);\n\tconst resolveRowId = getRowId ?? defaultGetRowId<TData>;\n\tconst rowById = useMemo(() => new Map(tableData.map((row, index) => [resolveRowId(row, index), row])), [resolveRowId, tableData]);\n\tconst availableRowIds = useMemo(() => Array.from(rowById.keys()), [rowById]);\n\tconst scrollableRef = useRef<HTMLDivElement | null>(null);\n\tconst sentinelRef = useRef<HTMLDivElement | null>(null);\n\n\tconst { rowSelection, activateRowSelection } = useTableRowSelection({\n\t\tavailableRowIds,\n\t\trowById,\n\t\tselectionMode,\n\t\tselectedRowIds,\n\t\tonRowSelectionChange\n\t});\n\tconst { columnVisibility: resolvedColumnVisibility, onColumnVisibilityChange: handleColumnVisibilityChange } = useTableColumnVisibility(\n\t\t{\n\t\t\tcolumnVisibility,\n\t\t\tdefaultColumnVisibility,\n\t\t\tonColumnVisibilityChange\n\t\t}\n\t);\n\tconst { columnOrder: resolvedColumnOrder, onColumnOrderChange: handleColumnOrderChange } = useTableColumnOrder({\n\t\tcolumnOrder,\n\t\tdefaultColumnOrder,\n\t\tonColumnOrderChange\n\t});\n\tconst { columnSizing: resolvedColumnSizing, onColumnSizingChange: handleColumnSizingChange } = useTableColumnSizing({\n\t\tcolumnSizing,\n\t\tdefaultColumnSizing,\n\t\tcolumnResizeMinWidth,\n\t\tonColumnSizingChange\n\t});\n\tconst { columnPinning: resolvedColumnPinning, onColumnPinningChange: handleColumnPinningChange } = useTableColumnPinning({\n\t\tcolumnPinning,\n\t\tdefaultColumnPinning,\n\t\tonColumnPinningChange\n\t});\n\tconst baseTableColumnState = useMemo<BaseTableColumnState>(\n\t\t() => ({\n\t\t\tcolumnOrder: resolvedColumnOrder,\n\t\t\tcolumnPinning: resolvedColumnPinning,\n\t\t\tcolumnSizing: resolvedColumnSizing,\n\t\t\tcolumnVisibility: resolvedColumnVisibility\n\t\t}),\n\t\t[resolvedColumnOrder, resolvedColumnPinning, resolvedColumnSizing, resolvedColumnVisibility]\n\t);\n\n\tconst emitReachEnd = useEffectEvent(() => {\n\t\tonReachEnd?.();\n\t});\n\n\tuseEffect(() => {\n\t\tif (!onReachEnd || !scrollableRef.current || !sentinelRef.current || isLoading) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst observer = new IntersectionObserver(\n\t\t\t(entries) => {\n\t\t\t\tconst entry = entries[0];\n\n\t\t\t\tif (entry?.isIntersecting) {\n\t\t\t\t\temitReachEnd();\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\troot: scrollableRef.current,\n\t\t\t\tthreshold: 0.1\n\t\t\t}\n\t\t);\n\n\t\tobserver.observe(sentinelRef.current);\n\n\t\treturn () => observer.disconnect();\n\t}, [isLoading, onReachEnd, tableData.length]);\n\n\tconst table = useReactTable<TData>({\n\t\tdata: tableData as TData[],\n\t\tcolumns: columns as TableColumnDef<TData>[],\n\t\tstate: {\n\t\t\tcolumnOrder: resolvedColumnOrder,\n\t\t\tcolumnPinning: resolvedColumnPinning,\n\t\t\tcolumnSizing: resolvedColumnSizing,\n\t\t\tcolumnVisibility: resolvedColumnVisibility,\n\t\t\trowSelection\n\t\t},\n\t\tonColumnOrderChange: handleColumnOrderChange,\n\t\tonColumnPinningChange: handleColumnPinningChange,\n\t\tonColumnSizingChange: handleColumnSizingChange,\n\t\tonColumnVisibilityChange: handleColumnVisibilityChange,\n\t\tgetRowId: (row, index) => resolveRowId(row, index),\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tenableMultiRowSelection: selectionMode === \"multi\",\n\t\tenableRowSelection: (row) => {\n\t\t\tif (selectionMode === \"none\") {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn getRowCanSelect ? getRowCanSelect(row.original) : true;\n\t\t}\n\t});\n\n\tconst visibleLeafColumns = getOrderedVisibleLeafColumns(table, baseTableColumnState);\n\tconst rowModelRows = table.getRowModel().rows;\n\tconst mergedCellLayout = useMemo(\n\t\t() =>\n\t\t\tbuildBaseTableMergedCellsLayout({\n\t\t\t\trows: rowModelRows,\n\t\t\t\tcolumns: visibleLeafColumns\n\t\t\t}),\n\t\t[rowModelRows, visibleLeafColumns]\n\t);\n\tconst leadingColumnId = visibleLeafColumns[0]?.id;\n\n\t/**\n\t * Активирует строку: обновляет выбор в соответствии с режимом и вызывает внешний callback.\n\t */\n\tconst activateRow = (row: Row<TData>) => {\n\t\tactivateRowSelection(row.id, row.getCanSelect());\n\t\tonRowClick?.(row.original);\n\t};\n\n\treturn (\n\t\t<BaseTable\n\t\t\ttable={table}\n\t\t\tcolumnState={baseTableColumnState}\n\t\t\ttitle={title}\n\t\t\tisLoading={isLoading}\n\t\t\tisFetching={isFetching}\n\t\t\tclassName={className}\n\t\t\tminHeight={minHeight}\n\t\t\ttableClassName={tableClassName}\n\t\t\tselectionMode={selectionMode}\n\t\t\tscrollableRef={scrollableRef}\n\t\t\tonActivateRow={selectionMode !== \"none\" || onRowClick ? activateRow : undefined}\n\t\t\tisRowInteractive={(row) => Boolean(onRowClick || (selectionMode !== \"none\" && row.getCanSelect()))}\n\t\t\tgetRowClassName={(row) => getRowClassName?.(row.original)}\n\t\t\tgetCellClassName={({ row, cell }) =>\n\t\t\t\tcell.column.id === leadingColumnId && row.getIsSelected() ? styles.selectedIndicatorCell : undefined\n\t\t\t}\n\t\t\tgetCellLayout={({ cell }) => mergedCellLayout.get(cell.id)}\n\t\t\trenderHeaderContextMenu={renderHeaderContextMenu}\n\t\t\tenableColumnResizing={enableColumnResizing}\n\t\t\tenableColumnReordering={enableColumnReordering}\n\t\t\tcolumnResizeMinWidth={columnResizeMinWidth}\n\t\t\trenderCellContent={(args) => {\n\t\t\t\tconst displayValue = formatPipelineDisplayValue({\n\t\t\t\t\tfield: formattingSnapshot.runtimeByColumnId[args.cell.column.id],\n\t\t\t\t\trawValue: args.cell.getValue(),\n\t\t\t\t\trowData: args.row.original as TableFormulaRowData,\n\t\t\t\t\trowKind: \"plain\"\n\t\t\t\t});\n\t\t\t\tconst defaultContent = !shouldUseTableFormatting({\n\t\t\t\t\tcolumnId: args.cell.column.id,\n\t\t\t\t\truntimeByColumnId: formattingSnapshot.runtimeByColumnId,\n\t\t\t\t\tcustomCellColumnIds: formattingSnapshot.customCellColumnIds\n\t\t\t\t}) ? (\n\t\t\t\t\targs.defaultContent\n\t\t\t\t) : (\n\t\t\t\t\t<FormattedTableCell displayValue={displayValue} align={args.columnMeta?.align} />\n\t\t\t\t);\n\n\t\t\t\tif (renderCellContent) {\n\t\t\t\t\treturn renderCellContent({\n\t\t\t\t\t\t...args,\n\t\t\t\t\t\tdefaultContent,\n\t\t\t\t\t\tdisplayValue\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn defaultContent;\n\t\t\t}}\n\t\t\tafterTableContent={onReachEnd ? <div ref={sentinelRef} className={styles.sentinel} aria-hidden=\"true\" /> : null}\n\t\t/>\n\t);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"table-BdpMzhLH.js","names":[],"sources":["../../src/table/Table.module.scss","../../src/table/Table.tsx"],"sourcesContent":[".selectedIndicatorCell {\n\tbox-shadow: inset 0.1875rem 0 0 var(--content-accent);\n}\n\n.sentinel {\n\theight: 1px;\n}\n","/* eslint-disable react-hooks/incompatible-library */\nimport { useEffect, useEffectEvent, useMemo, useRef } from \"react\";\n\nimport { formatPipelineDisplayValue } from \"@ryuzaki13/react-foundation-lib/formatters\";\nimport { TableFormulaRowData } from \"@ryuzaki13/react-foundation-lib/formulas\";\nimport {\n\ttype TableColumnDef,\n\ttype TableColumnOrderState,\n\ttype TableColumnSizingState,\n\ttype TableSelectionMode,\n\tuseTableRowSelection\n} from \"@ryuzaki13/react-foundation-lib/table\";\nimport { getCoreRowModel, useReactTable, type Row, type VisibilityState } from \"@tanstack/react-table\";\n\nimport {\n\tBaseTable,\n\tbuildBaseTableMergedCellsLayout,\n\tbuildTableFormattingSnapshot,\n\tFormattedTableCell,\n\tgetOrderedVisibleLeafColumns,\n\tshouldUseTableFormatting,\n\tuseTableColumnOrder,\n\tuseTableColumnPinning,\n\tuseTableColumnSizing,\n\tuseTableColumnVisibility,\n\ttype BaseTableColumnState,\n\ttype BaseTableProps,\n\ttype TableColumnPinningState\n} from \"../base-table\";\n\nimport styles from \"./Table.module.scss\";\n\n/**\n * Возвращает индекс как строковый id, если внешний id не передан.\n */\nfunction defaultGetRowId<TData>(_row: TData, index: number): string {\n\treturn String(index);\n}\n\n/**\n * Пропсы компонента Table.\n *\n * Компонент предназначен для плоских данных и по API осознанно сближен с TreeTable.\n */\nexport interface TableProps<TData extends object> {\n\t/**\n\t * Необязательный заголовок над таблицей.\n\t */\n\ttitle?: string;\n\t/**\n\t * Признак первичной загрузки.\n\t */\n\tisLoading?: boolean;\n\t/**\n\t * Признак фоновой догрузки или обновления данных.\n\t */\n\tisFetching?: boolean;\n\t/**\n\t * Плоский источник строк.\n\t */\n\tdata: readonly TData[] | undefined | null;\n\t/**\n\t * Описание колонок таблицы.\n\t */\n\tcolumns: readonly TableColumnDef<TData>[];\n\t/**\n\t * Режим выбора строк.\n\t */\n\tselectionMode?: TableSelectionMode;\n\t/**\n\t * Внешний список выбранных строк.\n\t *\n\t * Если передан, таблица синхронизирует визуальное выделение с этим набором id.\n\t */\n\tselectedRowIds?: readonly string[];\n\t/**\n\t * Стабильный идентификатор строки.\n\t *\n\t * Если не задан, используется индекс строки.\n\t */\n\tgetRowId?: (row: TData, index: number) => string;\n\t/**\n\t * Дополнительный CSS-класс корневого контейнера.\n\t */\n\tclassName?: string;\n\tminHeight?: `${number}em` | `${number}%`;\n\t/**\n\t * Дополнительный CSS-класс тега `table`.\n\t */\n\ttableClassName?: string;\n\t/**\n\t * Внешнее controlled-состояние видимости колонок.\n\t */\n\tcolumnVisibility?: VisibilityState;\n\t/**\n\t * Стартовое uncontrolled-состояние видимости колонок.\n\t */\n\tdefaultColumnVisibility?: VisibilityState;\n\t/**\n\t * Внешнее controlled-состояние порядка колонок.\n\t */\n\tcolumnOrder?: readonly string[];\n\t/**\n\t * Стартовое uncontrolled-состояние порядка колонок.\n\t */\n\tdefaultColumnOrder?: readonly string[];\n\t/**\n\t * Внешнее controlled-состояние ширин колонок в px.\n\t */\n\tcolumnSizing?: TableColumnSizingState;\n\t/**\n\t * Стартовое uncontrolled-состояние ширин колонок в px.\n\t */\n\tdefaultColumnSizing?: TableColumnSizingState;\n\t/**\n\t * Внешнее controlled-состояние left-pinning для колонок.\n\t */\n\tcolumnPinning?: TableColumnPinningState;\n\t/**\n\t * Стартовое uncontrolled-состояние left-pinning для колонок.\n\t */\n\tdefaultColumnPinning?: TableColumnPinningState;\n\t/**\n\t * Включает изменение ширины колонок через header-handle.\n\t */\n\tenableColumnResizing?: boolean;\n\t/**\n\t * Включает изменение порядка колонок через drag&drop заголовков.\n\t */\n\tenableColumnReordering?: boolean;\n\t/**\n\t * Минимальная ширина колонки при resize в px.\n\t */\n\tcolumnResizeMinWidth?: number;\n\t/**\n\t * Вызывается после изменения видимости колонок.\n\t */\n\tonColumnVisibilityChange?: (state: VisibilityState) => void;\n\t/**\n\t * Вызывается после изменения порядка колонок.\n\t */\n\tonColumnOrderChange?: (state: TableColumnOrderState) => void;\n\t/**\n\t * Вызывается после изменения ширины колонок.\n\t */\n\tonColumnSizingChange?: (state: TableColumnSizingState) => void;\n\t/**\n\t * Вызывается после изменения left-pinning state.\n\t */\n\tonColumnPinningChange?: (state: TableColumnPinningState) => void;\n\t/**\n\t * Вызывается при активации строки кликом или клавиатурой.\n\t */\n\tonRowClick?: (row: TData) => void;\n\t/**\n\t * Вызывается после изменения выбранных строк.\n\t */\n\tonRowSelectionChange?: (rows: TData[]) => void;\n\t/**\n\t * Вызывается при достижении конца таблицы внутри scroll-контейнера.\n\t */\n\tonReachEnd?: () => void;\n\t/**\n\t * Позволяет запретить выбор отдельных строк.\n\t */\n\tgetRowCanSelect?: (row: TData) => boolean;\n\t/**\n\t * Позволяет добавить CSS-класс для конкретной строки.\n\t */\n\tgetRowClassName?: (row: TData) => string | undefined;\n\t/**\n\t * Контекстное меню заголовка колонки. Используется для общих runtime-действий\n\t * вроде server sorting без встраивания доменной логики в shared-таблицу.\n\t */\n\trenderHeaderContextMenu?: BaseTableProps<TData>[\"renderHeaderContextMenu\"];\n\t/**\n\t * Тонкая точка расширения содержимого ячейки поверх стандартного форматирования.\n\t *\n\t * В отличие от `column.cell`, этот слот не отключает общий formatting-runtime:\n\t * `defaultContent` уже содержит отформатированное значение, если оно применимо.\n\t */\n\trenderCellContent?: BaseTableProps<TData>[\"renderCellContent\"];\n}\n\n/**\n * Плоская таблица на базе TanStack Table как React-альтернатива `sap.m.Table`.\n */\nexport function Table<TData extends object>({\n\ttitle,\n\tisLoading,\n\tisFetching,\n\tdata,\n\tcolumns,\n\tselectionMode = \"none\",\n\tselectedRowIds,\n\tgetRowId,\n\tclassName,\n\tminHeight,\n\ttableClassName,\n\tcolumnVisibility,\n\tdefaultColumnVisibility,\n\tcolumnOrder,\n\tdefaultColumnOrder,\n\tcolumnSizing,\n\tdefaultColumnSizing,\n\tcolumnPinning,\n\tdefaultColumnPinning,\n\tenableColumnResizing = false,\n\tenableColumnReordering = false,\n\tcolumnResizeMinWidth,\n\tonColumnVisibilityChange,\n\tonColumnOrderChange,\n\tonColumnSizingChange,\n\tonColumnPinningChange,\n\tonRowClick,\n\tonRowSelectionChange,\n\tonReachEnd,\n\tgetRowCanSelect,\n\tgetRowClassName,\n\trenderHeaderContextMenu,\n\trenderCellContent\n}: TableProps<TData>) {\n\tconst tableData = useMemo(() => data ?? [], [data]);\n\tconst formattingSnapshot = useMemo(() => buildTableFormattingSnapshot(columns), [columns]);\n\tconst resolveRowId = getRowId ?? defaultGetRowId<TData>;\n\tconst rowById = useMemo(() => new Map(tableData.map((row, index) => [resolveRowId(row, index), row])), [resolveRowId, tableData]);\n\tconst availableRowIds = useMemo(() => Array.from(rowById.keys()), [rowById]);\n\tconst scrollableRef = useRef<HTMLDivElement | null>(null);\n\tconst sentinelRef = useRef<HTMLDivElement | null>(null);\n\n\tconst { rowSelection, activateRowSelection } = useTableRowSelection({\n\t\tavailableRowIds,\n\t\trowById,\n\t\tselectionMode,\n\t\tselectedRowIds,\n\t\tonRowSelectionChange\n\t});\n\tconst { columnVisibility: resolvedColumnVisibility, onColumnVisibilityChange: handleColumnVisibilityChange } = useTableColumnVisibility(\n\t\t{\n\t\t\tcolumnVisibility,\n\t\t\tdefaultColumnVisibility,\n\t\t\tonColumnVisibilityChange\n\t\t}\n\t);\n\tconst { columnOrder: resolvedColumnOrder, onColumnOrderChange: handleColumnOrderChange } = useTableColumnOrder({\n\t\tcolumnOrder,\n\t\tdefaultColumnOrder,\n\t\tonColumnOrderChange\n\t});\n\tconst { columnSizing: resolvedColumnSizing, onColumnSizingChange: handleColumnSizingChange } = useTableColumnSizing({\n\t\tcolumnSizing,\n\t\tdefaultColumnSizing,\n\t\tcolumnResizeMinWidth,\n\t\tonColumnSizingChange\n\t});\n\tconst { columnPinning: resolvedColumnPinning, onColumnPinningChange: handleColumnPinningChange } = useTableColumnPinning({\n\t\tcolumnPinning,\n\t\tdefaultColumnPinning,\n\t\tonColumnPinningChange\n\t});\n\tconst baseTableColumnState = useMemo<BaseTableColumnState>(\n\t\t() => ({\n\t\t\tcolumnOrder: resolvedColumnOrder,\n\t\t\tcolumnPinning: resolvedColumnPinning,\n\t\t\tcolumnSizing: resolvedColumnSizing,\n\t\t\tcolumnVisibility: resolvedColumnVisibility\n\t\t}),\n\t\t[resolvedColumnOrder, resolvedColumnPinning, resolvedColumnSizing, resolvedColumnVisibility]\n\t);\n\n\tconst emitReachEnd = useEffectEvent(() => {\n\t\tonReachEnd?.();\n\t});\n\n\tuseEffect(() => {\n\t\tif (!onReachEnd || !scrollableRef.current || !sentinelRef.current || isLoading) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst observer = new IntersectionObserver(\n\t\t\t(entries) => {\n\t\t\t\tconst entry = entries[0];\n\n\t\t\t\tif (entry?.isIntersecting) {\n\t\t\t\t\temitReachEnd();\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\troot: scrollableRef.current,\n\t\t\t\tthreshold: 0.1\n\t\t\t}\n\t\t);\n\n\t\tobserver.observe(sentinelRef.current);\n\n\t\treturn () => observer.disconnect();\n\t}, [isLoading, onReachEnd, tableData.length]);\n\n\tconst table = useReactTable<TData>({\n\t\tdata: tableData as TData[],\n\t\tcolumns: columns as TableColumnDef<TData>[],\n\t\tstate: {\n\t\t\tcolumnOrder: resolvedColumnOrder,\n\t\t\tcolumnPinning: resolvedColumnPinning,\n\t\t\tcolumnSizing: resolvedColumnSizing,\n\t\t\tcolumnVisibility: resolvedColumnVisibility,\n\t\t\trowSelection\n\t\t},\n\t\tonColumnOrderChange: handleColumnOrderChange,\n\t\tonColumnPinningChange: handleColumnPinningChange,\n\t\tonColumnSizingChange: handleColumnSizingChange,\n\t\tonColumnVisibilityChange: handleColumnVisibilityChange,\n\t\tgetRowId: (row, index) => resolveRowId(row, index),\n\t\tgetCoreRowModel: getCoreRowModel(),\n\t\tenableMultiRowSelection: selectionMode === \"multi\",\n\t\tenableRowSelection: (row) => {\n\t\t\tif (selectionMode === \"none\") {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\treturn getRowCanSelect ? getRowCanSelect(row.original) : true;\n\t\t}\n\t});\n\n\tconst visibleLeafColumns = getOrderedVisibleLeafColumns(table, baseTableColumnState);\n\tconst rowModelRows = table.getRowModel().rows;\n\tconst mergedCellLayout = useMemo(\n\t\t() =>\n\t\t\tbuildBaseTableMergedCellsLayout({\n\t\t\t\trows: rowModelRows,\n\t\t\t\tcolumns: visibleLeafColumns\n\t\t\t}),\n\t\t[rowModelRows, visibleLeafColumns]\n\t);\n\tconst leadingColumnId = visibleLeafColumns[0]?.id;\n\n\t/**\n\t * Активирует строку: обновляет выбор в соответствии с режимом и вызывает внешний callback.\n\t */\n\tconst activateRow = (row: Row<TData>) => {\n\t\tactivateRowSelection(row.id, row.getCanSelect());\n\t\tonRowClick?.(row.original);\n\t};\n\n\treturn (\n\t\t<BaseTable\n\t\t\ttable={table}\n\t\t\tcolumnState={baseTableColumnState}\n\t\t\ttitle={title}\n\t\t\tisLoading={isLoading}\n\t\t\tisFetching={isFetching}\n\t\t\tclassName={className}\n\t\t\tminHeight={minHeight}\n\t\t\ttableClassName={tableClassName}\n\t\t\tselectionMode={selectionMode}\n\t\t\tscrollableRef={scrollableRef}\n\t\t\tonActivateRow={selectionMode !== \"none\" || onRowClick ? activateRow : undefined}\n\t\t\tisRowInteractive={(row) => Boolean(onRowClick || (selectionMode !== \"none\" && row.getCanSelect()))}\n\t\t\tgetRowClassName={(row) => getRowClassName?.(row.original)}\n\t\t\tgetCellClassName={({ row, cell }) =>\n\t\t\t\tcell.column.id === leadingColumnId && row.getIsSelected() ? styles.selectedIndicatorCell : undefined\n\t\t\t}\n\t\t\tgetCellLayout={({ cell }) => mergedCellLayout.get(cell.id)}\n\t\t\trenderHeaderContextMenu={renderHeaderContextMenu}\n\t\t\tenableColumnResizing={enableColumnResizing}\n\t\t\tenableColumnReordering={enableColumnReordering}\n\t\t\tcolumnResizeMinWidth={columnResizeMinWidth}\n\t\t\trenderCellContent={(args) => {\n\t\t\t\tconst displayValue = formatPipelineDisplayValue({\n\t\t\t\t\tfield: formattingSnapshot.runtimeByColumnId[args.cell.column.id],\n\t\t\t\t\trawValue: args.cell.getValue(),\n\t\t\t\t\trowData: args.row.original as TableFormulaRowData,\n\t\t\t\t\trowKind: \"plain\"\n\t\t\t\t});\n\t\t\t\tconst defaultContent = !shouldUseTableFormatting({\n\t\t\t\t\tcolumnId: args.cell.column.id,\n\t\t\t\t\truntimeByColumnId: formattingSnapshot.runtimeByColumnId,\n\t\t\t\t\tcustomCellColumnIds: formattingSnapshot.customCellColumnIds\n\t\t\t\t}) ? (\n\t\t\t\t\targs.defaultContent\n\t\t\t\t) : (\n\t\t\t\t\t<FormattedTableCell displayValue={displayValue} align={args.columnMeta?.align} />\n\t\t\t\t);\n\n\t\t\t\tif (renderCellContent) {\n\t\t\t\t\treturn renderCellContent({\n\t\t\t\t\t\t...args,\n\t\t\t\t\t\tdefaultContent,\n\t\t\t\t\t\tdisplayValue\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn defaultContent;\n\t\t\t}}\n\t\t\tafterTableContent={onReachEnd ? <div ref={sentinelRef} className={styles.sentinel} aria-hidden=\"true\" /> : null}\n\t\t/>\n\t);\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { n as e } from "../chunks/button-CC0Jdx1j.js";
|
|
2
|
-
import { l as t } from "../chunks/misc-
|
|
2
|
+
import { l as t } from "../chunks/misc-DIF5h9ba.js";
|
|
3
3
|
import { useCallback as n, useId as r, useState as i } from "react";
|
|
4
4
|
import { cn as a } from "@ryuzaki13/react-foundation-lib/utils";
|
|
5
5
|
import { ChevronsLeftIcon as o, ChevronsRightIcon as s } from "lucide-react";
|
package/dist/image/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { n as e } from "../chunks/button-CC0Jdx1j.js";
|
|
2
2
|
import { r as t } from "../chunks/grid-dI94AAbi.js";
|
|
3
3
|
import { o as n } from "../chunks/input-CZLUUggm.js";
|
|
4
|
-
import { i as r, n as i, r as a } from "../chunks/modal-
|
|
4
|
+
import { i as r, n as i, r as a } from "../chunks/modal-Cll8YZ7b.js";
|
|
5
5
|
import { t as o } from "../chunks/input-files-aB8iaqGk.js";
|
|
6
6
|
import { useCallback as s, useEffect as c, useMemo as l, useRef as u, useState as d } from "react";
|
|
7
7
|
import { Fragment as f, jsx as p, jsxs as m } from "react/jsx-runtime";
|
package/dist/list/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as e } from "../chunks/grid-dI94AAbi.js";
|
|
2
|
-
import { c as t, h as n } from "../chunks/misc-
|
|
2
|
+
import { c as t, h as n } from "../chunks/misc-DIF5h9ba.js";
|
|
3
3
|
import r, { Children as i, useMemo as a, useRef as o } from "react";
|
|
4
4
|
import { cn as s } from "@ryuzaki13/react-foundation-lib/utils";
|
|
5
5
|
import { jsx as c } from "react/jsx-runtime";
|
|
@@ -1,2 +1,11 @@
|
|
|
1
|
-
|
|
1
|
+
import { type ComponentPropsWithoutRef, type ReactNode } from "react";
|
|
2
|
+
type AnimatedLogoProps = Omit<ComponentPropsWithoutRef<"div">, "children"> & {
|
|
3
|
+
children: ReactNode;
|
|
4
|
+
};
|
|
5
|
+
/**
|
|
6
|
+
* Контейнер анимированного логотипа без брендовой SVG-разметки.
|
|
7
|
+
* Host-проект передаёт собственный `svg`, а его визуальные части оборачивает в `AnimatedLogoSegment`.
|
|
8
|
+
*/
|
|
9
|
+
export declare function AnimatedLogo({ children, className, ...htmlProps }: AnimatedLogoProps): import("react").JSX.Element;
|
|
10
|
+
export {};
|
|
2
11
|
//# sourceMappingURL=AnimatedLogo.d.ts.map
|