@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
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { r as e } from "./grid-dI94AAbi.js";
|
|
2
|
-
import { c as t, d as n, h as r, i } from "./misc-
|
|
2
|
+
import { c as t, d as n, h as r, i } from "./misc-DIF5h9ba.js";
|
|
3
3
|
import { t as a } from "./table-column-interactions-6RGjmiI5.js";
|
|
4
4
|
import { n as o } from "./context-menu-DQeR3y7M.js";
|
|
5
5
|
import { s, t as c } from "./sortable-DcTIAbjD.js";
|
|
@@ -511,4 +511,4 @@ function Q({ displayValue: e, align: t = "left" }) {
|
|
|
511
511
|
//#endregion
|
|
512
512
|
export { U as a, L as c, R as d, M as f, A as g, k as h, W as i, F as l, j as m, X as n, H as o, le as p, G as r, V as s, Q as t, P as u };
|
|
513
513
|
|
|
514
|
-
//# sourceMappingURL=base-table-
|
|
514
|
+
//# sourceMappingURL=base-table-BXKFSgIk.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"base-table-DghNJ6ss.js","names":[],"sources":["../../src/base-table/lib/columnPinning.ts","../../src/base-table/lib/formatting.ts","../../src/base-table/lib/mergeDuplicates.ts","../../src/base-table/model/useTableColumnOrder.ts","../../src/base-table/model/useTableColumnPinning.ts","../../src/base-table/model/useTableColumnSizing.ts","../../src/base-table/model/useTableColumnVisibility.ts","../../src/base-table/ui/BaseTable.module.scss","../../src/base-table/ui/BaseTableHeaderCell.tsx","../../src/base-table/ui/BaseTable.tsx","../../src/base-table/ui/FormattedTableCell.module.scss","../../src/base-table/ui/FormattedTableCell.tsx"],"sourcesContent":["import { filterAndDeduplicateIds, pickExistingMapValues } from \"@ryuzaki13/react-foundation-lib/array\";\nimport {\n\tbuildTableColumnLayout,\n\tgetTableColumnMeta,\n\tresolveTableColumnOrder,\n\tresolveTableLength\n} from \"@ryuzaki13/react-foundation-lib/table\";\n\nimport type { Column, TableState, Table as TanStackTable } from \"@tanstack/react-table\";\n\nexport type BaseTableColumnLayoutItem<TData extends object> = {\n\tid: string;\n\tcolumn: Column<TData, unknown>;\n\twidth: string;\n};\n\n/**\n * Реактивный срез состояния колонок, от которого зависит физический layout BaseTable.\n *\n * TanStack table instance остаётся стабильным объектом, поэтому BaseTable получает\n * этот срез отдельным prop: React Compiler не должен кэшировать разметку колонок\n * поверх изменившихся order/sizing/pinning/visibility.\n */\nexport type BaseTableColumnState = Pick<TableState, \"columnOrder\" | \"columnPinning\" | \"columnSizing\" | \"columnVisibility\">;\n\n/**\n * Публичное состояние закрепления колонок для shared-таблиц.\n *\n * В первой итерации поддерживается только закрепление слева.\n */\nexport interface TableColumnPinningState {\n\t/**\n\t * Идентификаторы колонок, закреплённых слева, в порядке отображения.\n\t */\n\tleft?: string[];\n}\n\n/**\n * Нормализует публичное состояние закрепления к формату TanStack Table.\n *\n * Правая зона принудительно очищается, чтобы не открывать неподдерживаемый API.\n */\nexport function normalizeTableColumnPinning(state?: TableColumnPinningState): { left: string[]; right: string[] } {\n\treturn {\n\t\tleft: Array.from(\n\t\t\tnew Set(\n\t\t\t\t(state?.left ?? []).filter((columnId): columnId is string => typeof columnId === \"string\" && columnId.trim().length > 0)\n\t\t\t)\n\t\t),\n\t\tright: []\n\t};\n}\n\n/**\n * Возвращает ширину колонки в том же формате, что и colgroup базовой таблицы.\n */\nexport function resolveBaseTableColumnWidth<TData extends object>(\n\tcolumn: Column<TData, unknown>,\n\tcolumnSizing?: Readonly<Record<string, number>>\n): string {\n\tconst resizedWidth = columnSizing?.[column.id];\n\tif (typeof resizedWidth === \"number\" && Number.isFinite(resizedWidth) && resizedWidth > 0) {\n\t\treturn `${Math.floor(resizedWidth)}px`;\n\t}\n\n\tconst meta = getTableColumnMeta(column.columnDef);\n\n\tlet width = meta?.width ?? 4;\n\n\tif (typeof width === \"number\") {\n\t\twidth = Math.max(width, 4);\n\t}\n\n\treturn resolveTableLength(width);\n}\n\n/**\n * Собирает видимые leaf-колонки в фактическом порядке рендера: pinned-left -> center -> pinned-right.\n *\n * В отличие от отдельных TanStack getters, порядок явно строится из одного\n * источника `columnOrder`, поэтому `<colgroup>`, header и body получают один\n * и тот же layout после drag&drop.\n */\nexport function getOrderedVisibleLeafColumns<TData extends object>(\n\ttable: TanStackTable<TData>,\n\tcolumnState: BaseTableColumnState\n): Column<TData, unknown>[] {\n\tconst visibleColumns = table.getAllLeafColumns().filter((column) => column.getIsVisible());\n\tconst columnById = new Map(visibleColumns.map((column) => [column.id, column]));\n\tconst visibleColumnIds = visibleColumns.map((column) => column.id);\n\tconst leftIds = filterAndDeduplicateIds(columnState.columnPinning.left, visibleColumnIds);\n\tconst rightIds = filterAndDeduplicateIds(columnState.columnPinning.right, visibleColumnIds);\n\tconst pinnedIds = new Set([...leftIds, ...rightIds]);\n\tconst centerIds: string[] = [];\n\n\tfor (const column of visibleColumns) {\n\t\tif (!pinnedIds.has(column.id)) {\n\t\t\tcenterIds.push(column.id);\n\t\t}\n\t}\n\n\tconst orderedCenterIds = resolveTableColumnOrder({\n\t\tids: centerIds,\n\t\torder: columnState.columnOrder\n\t});\n\n\treturn pickExistingMapValues([...leftIds, ...orderedCenterIds, ...rightIds], columnById);\n}\n\nexport function buildBaseTableColumnLayout<TData extends object>(\n\ttable: TanStackTable<TData>,\n\tcolumnState: BaseTableColumnState\n): BaseTableColumnLayoutItem<TData>[] {\n\tconst columns = getOrderedVisibleLeafColumns(table, columnState);\n\tconst columnById = new Map(columns.map((column) => [column.id, column]));\n\n\treturn buildTableColumnLayout({\n\t\tids: columns.map((column) => column.id),\n\t\tgetWidth: (id) => {\n\t\t\tconst column = columnById.get(id);\n\t\t\treturn column ? resolveBaseTableColumnWidth(column, columnState.columnSizing) : \"0px\";\n\t\t}\n\t}).flatMap((item) => {\n\t\tconst column = columnById.get(item.id);\n\n\t\treturn column\n\t\t\t? [\n\t\t\t\t\t{\n\t\t\t\t\t\t...item,\n\t\t\t\t\t\tcolumn\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t: [];\n\t});\n}\n\n/**\n * Вычисляет sticky-offset для закреплённых слева колонок.\n *\n * Значения возвращаются как CSS-length, чтобы корректно суммировать `em`, `px` и `calc(...)`.\n */\nexport function getLeftPinnedColumnOffsets<TData extends object>(\n\ttable: TanStackTable<TData>,\n\tcolumnState: BaseTableColumnState\n): Readonly<Record<string, string>> {\n\tconst offsets: Record<string, string> = {};\n\tconst accumulatedWidths: string[] = [];\n\n\tfor (const column of getOrderedVisibleLeafColumns(table, columnState)) {\n\t\tif (column.getIsPinned() !== \"left\") continue;\n\n\t\toffsets[column.id] = combineCssLengths(accumulatedWidths);\n\t\taccumulatedWidths.push(resolveBaseTableColumnWidth(column, columnState.columnSizing));\n\t}\n\n\treturn offsets;\n}\n\n/**\n * Складывает CSS-length значения в безопасную строку `calc(...)`.\n */\nfunction combineCssLengths(lengths: readonly string[]): string {\n\tif (lengths.length === 0) {\n\t\treturn \"0px\";\n\t}\n\n\tif (lengths.length === 1) {\n\t\treturn lengths[0]!;\n\t}\n\n\treturn `calc(${lengths.join(\" + \")})`;\n}\n","import {\n\tcompileFormattersPipelineRuntimeFields,\n\ttype FormattersPipelineRuntimeField,\n\ttype FormattersPipelineRuntimeFields\n} from \"@ryuzaki13/react-foundation-lib/formatters\";\nimport { getTableColumnFormattingMeta, type TableColumnDef } from \"@ryuzaki13/react-foundation-lib/table\";\n\n/**\n * Снимок форматирующих данных, вычисленный из набора колонок.\n *\n * Используется и в `Table`, и в `TreeTable`, чтобы не дублировать\n * предкомпиляцию runtime и правила приоритета кастомного `cell`.\n */\nexport interface TableFormattingSnapshot {\n\t/**\n\t * Скомпилированный runtime по идентификаторам колонок.\n\t */\n\truntimeByColumnId: FormattersPipelineRuntimeFields<FormattersPipelineRuntimeField>;\n\t/**\n\t * Идентификаторы колонок с явным кастомным `cell`.\n\t */\n\tcustomCellColumnIds: Set<string>;\n}\n\n/**\n * Определяет стабильный идентификатор колонки для pipeline runtime.\n *\n * Порядок приоритета:\n * 1. `column.id`\n * 2. строковый `accessorKey`\n */\nexport function resolveTableFormattingColumnId<TData extends object>(column: TableColumnDef<TData>): string | undefined {\n\tif (typeof column.id === \"string\" && column.id.trim()) {\n\t\treturn column.id;\n\t}\n\n\tif (\"accessorKey\" in column && typeof column.accessorKey === \"string\" && column.accessorKey.trim()) {\n\t\treturn column.accessorKey;\n\t}\n\n\treturn undefined;\n}\n\n/**\n * Проверяет, задан ли у колонки явный кастомный `cell`.\n */\nexport function hasTableColumnCustomCellRenderer<TData extends object>(column: TableColumnDef<TData>): boolean {\n\treturn \"cell\" in column && column.cell != null;\n}\n\n/**\n * Обходит только leaf-колонки, пропуская group-узлы.\n */\nfunction visitLeafTableColumns<TData extends object>(\n\tcolumns: readonly TableColumnDef<TData>[],\n\tvisitor: (column: TableColumnDef<TData>) => void\n): void {\n\tfor (const column of columns) {\n\t\tif (\"columns\" in column && Array.isArray(column.columns) && column.columns.length > 0) {\n\t\t\tvisitLeafTableColumns(column.columns as TableColumnDef<TData>[], visitor);\n\t\t\tcontinue;\n\t\t}\n\n\t\tvisitor(column);\n\t}\n}\n\n/**\n * Собирает snapshot pipeline runtime по описанию колонок.\n */\nexport function buildTableFormattingSnapshot<TData extends object>(columns: readonly TableColumnDef<TData>[]): TableFormattingSnapshot {\n\tconst formattingByColumnId: Record<string, FormattersPipelineRuntimeField> = {};\n\tconst customCellColumnIds = new Set<string>();\n\n\tvisitLeafTableColumns(columns, (column) => {\n\t\tconst columnId = resolveTableFormattingColumnId(column);\n\t\tif (!columnId) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (hasTableColumnCustomCellRenderer(column)) {\n\t\t\tcustomCellColumnIds.add(columnId);\n\t\t}\n\n\t\tconst formatting = getTableColumnFormattingMeta(column);\n\t\tif (!formatting) {\n\t\t\treturn;\n\t\t}\n\n\t\tformattingByColumnId[columnId] = {\n\t\t\t...formatting,\n\t\t\tid: formatting.id ?? columnId,\n\t\t\trole: formatting.role ?? \"dimension\",\n\t\t\ttype: formatting.type ?? \"string\"\n\t\t};\n\t});\n\n\treturn {\n\t\truntimeByColumnId: compileFormattersPipelineRuntimeFields(formattingByColumnId),\n\t\tcustomCellColumnIds\n\t};\n}\n\n/**\n * Определяет, должен ли компонент использовать pipeline runtime для ячейки.\n */\nexport function shouldUseTableFormatting(args: {\n\tcolumnId: string;\n\truntimeByColumnId: FormattersPipelineRuntimeFields<FormattersPipelineRuntimeField>;\n\tcustomCellColumnIds: ReadonlySet<string>;\n}): boolean {\n\tif (args.customCellColumnIds.has(args.columnId)) {\n\t\treturn false;\n\t}\n\n\treturn Boolean(args.runtimeByColumnId[args.columnId]);\n}\n","import { getTableColumnMeta } from \"@ryuzaki13/react-foundation-lib/table\";\n\nimport type { Cell, Column, Row } from \"@tanstack/react-table\";\n\n/**\n * Layout-настройка body-ячейки базовой таблицы.\n */\nexport interface BaseTableCellLayout {\n\thideContent?: boolean;\n\tmergeWithNext?: boolean;\n}\n\n/**\n * Результат расчёта layout для body-ячейки по её `cell.id`.\n */\nexport type BaseTableCellLayoutById = ReadonlyMap<string, BaseTableCellLayout>;\n\n/**\n * Аргументы построения layout для display-only слияния дубликатов.\n */\nexport interface BuildBaseTableMergedCellsLayoutArgs<TData extends object> {\n\trows: readonly Row<TData>[];\n\tcolumns: readonly Column<TData, unknown>[];\n\tresolveRowBoundaryKey?: (row: Row<TData>) => unknown;\n\texcludeColumnIds?: ReadonlySet<string>;\n}\n\ntype VisibleRowCellLookup<TData extends object> = {\n\trow: Row<TData>;\n\tboundaryKey: unknown;\n\tcellByColumnId: ReadonlyMap<string, Cell<TData, unknown>>;\n};\n\nfunction isMergeableValue(value: unknown): boolean {\n\treturn value !== null && value !== undefined && value !== \"\";\n}\n\nfunction buildVisibleRowCellLookups<TData extends object>(\n\trows: readonly Row<TData>[],\n\tresolveRowBoundaryKey: (row: Row<TData>) => unknown\n): VisibleRowCellLookup<TData>[] {\n\treturn rows.map((row) => ({\n\t\trow,\n\t\tboundaryKey: resolveRowBoundaryKey(row),\n\t\tcellByColumnId: new Map(row.getVisibleCells().map((cell) => [cell.column.id, cell]))\n\t}));\n}\n\n/**\n * Строит layout display-only слияния для колонок с `meta.mergeDuplicates`.\n *\n * Слияние работает только для подряд идущих одинаковых raw-значений. Пустые\n * значения (`null`, `undefined`, `\"\"`) не объединяются.\n */\nexport function buildBaseTableMergedCellsLayout<TData extends object>({\n\trows,\n\tcolumns,\n\tresolveRowBoundaryKey = () => \"__all_rows__\",\n\texcludeColumnIds\n}: BuildBaseTableMergedCellsLayoutArgs<TData>): BaseTableCellLayoutById {\n\tconst mergeableColumns = columns.filter((column) => {\n\t\tif (excludeColumnIds?.has(column.id)) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn getTableColumnMeta(column.columnDef)?.mergeDuplicates === true;\n\t});\n\n\tif (rows.length === 0 || mergeableColumns.length === 0) {\n\t\treturn new Map();\n\t}\n\n\tconst rowLookups = buildVisibleRowCellLookups(rows, resolveRowBoundaryKey);\n\tconst layoutByCellId = new Map<string, BaseTableCellLayout>();\n\n\tfor (const column of mergeableColumns) {\n\t\tlet groupStartIndex = -1;\n\t\tlet groupValue: unknown = undefined;\n\t\tlet groupBoundaryKey: unknown = undefined;\n\n\t\tconst finalizeGroup = (endIndexExclusive: number) => {\n\t\t\tif (groupStartIndex === -1) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst groupSize = endIndexExclusive - groupStartIndex;\n\t\t\tif (groupSize <= 1) {\n\t\t\t\tgroupStartIndex = -1;\n\t\t\t\tgroupValue = undefined;\n\t\t\t\tgroupBoundaryKey = undefined;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor (let index = groupStartIndex; index < endIndexExclusive; index += 1) {\n\t\t\t\tconst cellId = rowLookups[index]?.cellByColumnId.get(column.id)?.id;\n\t\t\t\tif (cellId) {\n\t\t\t\t\tlayoutByCellId.set(cellId, {\n\t\t\t\t\t\thideContent: index > groupStartIndex,\n\t\t\t\t\t\tmergeWithNext: index < endIndexExclusive - 1\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tgroupStartIndex = -1;\n\t\t\tgroupValue = undefined;\n\t\t\tgroupBoundaryKey = undefined;\n\t\t};\n\n\t\tfor (let index = 0; index < rowLookups.length; index += 1) {\n\t\t\tconst currentRow = rowLookups[index];\n\t\t\tconst currentCell = currentRow?.cellByColumnId.get(column.id);\n\t\t\tconst currentValue = currentCell?.getValue();\n\n\t\t\tif (!currentCell || !isMergeableValue(currentValue)) {\n\t\t\t\tfinalizeGroup(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (groupStartIndex === -1) {\n\t\t\t\tgroupStartIndex = index;\n\t\t\t\tgroupValue = currentValue;\n\t\t\t\tgroupBoundaryKey = currentRow?.boundaryKey;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!Object.is(groupBoundaryKey, currentRow?.boundaryKey) || !Object.is(groupValue, currentValue)) {\n\t\t\t\tfinalizeGroup(index);\n\t\t\t\tgroupStartIndex = index;\n\t\t\t\tgroupValue = currentValue;\n\t\t\t\tgroupBoundaryKey = currentRow?.boundaryKey;\n\t\t\t}\n\t\t}\n\n\t\tfinalizeGroup(rowLookups.length);\n\t}\n\n\treturn layoutByCellId;\n}\n","import { useCallback, useMemo, useState } from \"react\";\n\nimport { normalizeTableColumnOrder, type TableColumnOrderState } from \"@ryuzaki13/react-foundation-lib/table\";\nimport { functionalUpdate, type ColumnOrderState, type Updater } from \"@tanstack/react-table\";\n\n/**\n * Аргументы управления порядком колонок таблицы.\n */\nexport interface UseTableColumnOrderArgs {\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 * Вызывается после изменения порядка колонок.\n\t */\n\tonColumnOrderChange?: (state: TableColumnOrderState) => void;\n}\n\n/**\n * Результат работы hook управления column order.\n */\nexport interface UseTableColumnOrderResult {\n\t/**\n\t * Актуальный order-state в формате TanStack Table.\n\t */\n\tcolumnOrder: ColumnOrderState;\n\t/**\n\t * Обработчик изменения order-state из TanStack Table.\n\t */\n\tonColumnOrderChange: (updater: Updater<ColumnOrderState>) => void;\n}\n\n/**\n * Инкапсулирует controlled/uncontrolled-паттерн для порядка колонок.\n */\nexport function useTableColumnOrder({\n\tcolumnOrder,\n\tdefaultColumnOrder,\n\tonColumnOrderChange\n}: UseTableColumnOrderArgs): UseTableColumnOrderResult {\n\tconst [uncontrolledColumnOrder, setUncontrolledColumnOrder] = useState<TableColumnOrderState | undefined>(undefined);\n\tconst resolvedColumnOrder = useMemo(\n\t\t() => normalizeTableColumnOrder(columnOrder ?? uncontrolledColumnOrder ?? defaultColumnOrder),\n\t\t[columnOrder, defaultColumnOrder, uncontrolledColumnOrder]\n\t);\n\n\tconst handleColumnOrderChange = useCallback(\n\t\t(updater: Updater<ColumnOrderState>) => {\n\t\t\tconst nextColumnOrder = normalizeTableColumnOrder(functionalUpdate(updater, resolvedColumnOrder));\n\n\t\t\tif (columnOrder === undefined) {\n\t\t\t\tsetUncontrolledColumnOrder(nextColumnOrder);\n\t\t\t}\n\n\t\t\tonColumnOrderChange?.(nextColumnOrder);\n\t\t},\n\t\t[columnOrder, onColumnOrderChange, resolvedColumnOrder]\n\t);\n\n\treturn {\n\t\tcolumnOrder: resolvedColumnOrder,\n\t\tonColumnOrderChange: handleColumnOrderChange\n\t};\n}\n","import { useCallback, useMemo, useState } from \"react\";\n\nimport { functionalUpdate, type ColumnPinningState, type Updater } from \"@tanstack/react-table\";\n\nimport { normalizeTableColumnPinning, type TableColumnPinningState } from \"../lib/columnPinning\";\n\n/**\n * Аргументы управления состоянием закрепления колонок.\n */\nexport interface UseTableColumnPinningArgs {\n\t/**\n\t * Внешнее controlled-состояние закрепления.\n\t */\n\tcolumnPinning?: TableColumnPinningState;\n\t/**\n\t * Стартовое uncontrolled-состояние закрепления.\n\t */\n\tdefaultColumnPinning?: TableColumnPinningState;\n\t/**\n\t * Вызывается после любого изменения left-pinning state.\n\t */\n\tonColumnPinningChange?: (state: TableColumnPinningState) => void;\n}\n\n/**\n * Результат работы hook управления column pinning.\n */\nexport interface UseTableColumnPinningResult {\n\t/**\n\t * Актуальный pinning-state в формате TanStack Table.\n\t */\n\tcolumnPinning: ColumnPinningState;\n\t/**\n\t * Обработчик изменения pinning-state из TanStack Table.\n\t */\n\tonColumnPinningChange: (updater: Updater<ColumnPinningState>) => void;\n}\n\n/**\n * Инкапсулирует controlled/uncontrolled-паттерн для left column pinning.\n */\nexport function useTableColumnPinning({\n\tcolumnPinning,\n\tdefaultColumnPinning,\n\tonColumnPinningChange\n}: UseTableColumnPinningArgs): UseTableColumnPinningResult {\n\tconst [uncontrolledColumnPinning, setUncontrolledColumnPinning] = useState<TableColumnPinningState | undefined>(undefined);\n\tconst resolvedColumnPinning = useMemo(\n\t\t() => normalizeTableColumnPinning(columnPinning ?? uncontrolledColumnPinning ?? defaultColumnPinning),\n\t\t[columnPinning, defaultColumnPinning, uncontrolledColumnPinning]\n\t);\n\n\tconst handleColumnPinningChange = useCallback(\n\t\t(updater: Updater<ColumnPinningState>) => {\n\t\t\tconst nextColumnPinning = normalizeTableColumnPinning(functionalUpdate(updater, resolvedColumnPinning));\n\t\t\tconst nextPublicColumnPinning: TableColumnPinningState = {\n\t\t\t\tleft: nextColumnPinning.left\n\t\t\t};\n\n\t\t\tif (columnPinning === undefined) {\n\t\t\t\tsetUncontrolledColumnPinning(nextPublicColumnPinning);\n\t\t\t}\n\n\t\t\tonColumnPinningChange?.(nextPublicColumnPinning);\n\t\t},\n\t\t[columnPinning, onColumnPinningChange, resolvedColumnPinning]\n\t);\n\n\treturn {\n\t\tcolumnPinning: resolvedColumnPinning,\n\t\tonColumnPinningChange: handleColumnPinningChange\n\t};\n}\n","import { useCallback, useMemo, useState } from \"react\";\n\nimport { normalizeTableColumnSizing, type TableColumnSizingState } from \"@ryuzaki13/react-foundation-lib/table\";\nimport { functionalUpdate, type ColumnSizingState, type Updater } from \"@tanstack/react-table\";\n\n/**\n * Аргументы управления шириной колонок таблицы.\n */\nexport interface UseTableColumnSizingArgs {\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 * Минимальная ширина колонки в px.\n\t */\n\tcolumnResizeMinWidth?: number;\n\t/**\n\t * Вызывается после изменения ширины колонок.\n\t */\n\tonColumnSizingChange?: (state: TableColumnSizingState) => void;\n}\n\n/**\n * Результат работы hook управления column sizing.\n */\nexport interface UseTableColumnSizingResult {\n\t/**\n\t * Актуальный sizing-state в формате TanStack Table.\n\t */\n\tcolumnSizing: ColumnSizingState;\n\t/**\n\t * Обработчик изменения sizing-state из TanStack Table.\n\t */\n\tonColumnSizingChange: (updater: Updater<ColumnSizingState>) => void;\n}\n\n/**\n * Инкапсулирует controlled/uncontrolled-паттерн для ширин колонок.\n */\nexport function useTableColumnSizing({\n\tcolumnSizing,\n\tdefaultColumnSizing,\n\tcolumnResizeMinWidth,\n\tonColumnSizingChange\n}: UseTableColumnSizingArgs): UseTableColumnSizingResult {\n\tconst [uncontrolledColumnSizing, setUncontrolledColumnSizing] = useState<TableColumnSizingState | undefined>(undefined);\n\tconst resolvedColumnSizing = useMemo(\n\t\t() => normalizeTableColumnSizing(columnSizing ?? uncontrolledColumnSizing ?? defaultColumnSizing, columnResizeMinWidth),\n\t\t[columnResizeMinWidth, columnSizing, defaultColumnSizing, uncontrolledColumnSizing]\n\t);\n\n\tconst handleColumnSizingChange = useCallback(\n\t\t(updater: Updater<ColumnSizingState>) => {\n\t\t\tconst nextColumnSizing = normalizeTableColumnSizing(functionalUpdate(updater, resolvedColumnSizing), columnResizeMinWidth);\n\n\t\t\tif (columnSizing === undefined) {\n\t\t\t\tsetUncontrolledColumnSizing(nextColumnSizing);\n\t\t\t}\n\n\t\t\tonColumnSizingChange?.(nextColumnSizing);\n\t\t},\n\t\t[columnResizeMinWidth, columnSizing, onColumnSizingChange, resolvedColumnSizing]\n\t);\n\n\treturn {\n\t\tcolumnSizing: resolvedColumnSizing,\n\t\tonColumnSizingChange: handleColumnSizingChange\n\t};\n}\n","import { useCallback, useMemo, useState } from \"react\";\n\nimport { functionalUpdate, type Updater, type VisibilityState } from \"@tanstack/react-table\";\n\n/**\n * Аргументы управления видимостью колонок таблицы.\n */\nexport interface UseTableColumnVisibilityArgs {\n\t/**\n\t * Внешнее controlled-состояние видимости колонок.\n\t */\n\tcolumnVisibility?: VisibilityState;\n\t/**\n\t * Стартовое uncontrolled-состояние видимости колонок.\n\t */\n\tdefaultColumnVisibility?: VisibilityState;\n\t/**\n\t * Вызывается после любого изменения visibility-state.\n\t */\n\tonColumnVisibilityChange?: (state: VisibilityState) => void;\n}\n\n/**\n * Результат работы hook управления видимостью колонок.\n */\nexport interface UseTableColumnVisibilityResult {\n\t/**\n\t * Актуальный visibility-state, который нужно передать в TanStack Table.\n\t */\n\tcolumnVisibility: VisibilityState;\n\t/**\n\t * Обработчик изменения visibility-state из TanStack Table.\n\t */\n\tonColumnVisibilityChange: (updater: Updater<VisibilityState>) => void;\n}\n\n/**\n * Инкапсулирует controlled/uncontrolled-паттерн для column visibility.\n *\n * Пока пользователь не изменял visibility локально, hook читает\n * `defaultColumnVisibility` напрямую, поэтому асинхронная metadata-инициализация\n * не требует синхронизации prop -> state через эффекты.\n */\nexport function useTableColumnVisibility({\n\tcolumnVisibility,\n\tdefaultColumnVisibility,\n\tonColumnVisibilityChange\n}: UseTableColumnVisibilityArgs): UseTableColumnVisibilityResult {\n\tconst [uncontrolledColumnVisibility, setUncontrolledColumnVisibility] = useState<VisibilityState | undefined>(undefined);\n\tconst resolvedColumnVisibility = useMemo(\n\t\t() => columnVisibility ?? uncontrolledColumnVisibility ?? defaultColumnVisibility ?? {},\n\t\t[columnVisibility, defaultColumnVisibility, uncontrolledColumnVisibility]\n\t);\n\n\tconst handleColumnVisibilityChange = useCallback(\n\t\t(updater: Updater<VisibilityState>) => {\n\t\t\tconst nextColumnVisibility = functionalUpdate(updater, resolvedColumnVisibility);\n\n\t\t\tif (columnVisibility === undefined) {\n\t\t\t\tsetUncontrolledColumnVisibility(nextColumnVisibility);\n\t\t\t}\n\n\t\t\tonColumnVisibilityChange?.(nextColumnVisibility);\n\t\t},\n\t\t[columnVisibility, onColumnVisibilityChange, resolvedColumnVisibility]\n\t);\n\n\treturn {\n\t\tcolumnVisibility: resolvedColumnVisibility,\n\t\tonColumnVisibilityChange: handleColumnVisibilityChange\n\t};\n}\n",".root,\n.headerContextMenuTrigger {\n\tmin-width: 0;\n}\n\n.table {\n\twidth: 100%;\n\tborder-collapse: separate;\n\tborder-spacing: 0;\n\ttable-layout: fixed;\n\tfont-variant-numeric: tabular-nums;\n\n\thyphens: auto;\n}\n\n.head {\n\tz-index: 10;\n}\n\n.pinnedLeftBoundary {\n\tbox-shadow: inset var(--focus-offset) 0 0 var(--border-0);\n}\n\n.headerRow {\n\tbackground-color: var(--surface-0);\n}\n\n.headerCell {\n\tposition: relative;\n\tpadding: var(--space-sm) var(--space-md);\n\tbackground-color: var(--surface-2);\n\tborder-bottom: var(--border);\n\tcolor: var(--content-0);\n\tvertical-align: middle;\n}\n\n.headerCellContent {\n\tmin-width: 0;\n}\n\n.headerCellDraggable {\n\tcursor: grab;\n\ttouch-action: none;\n\tuser-select: none;\n\n\t&:active {\n\t\tcursor: grabbing;\n\t}\n}\n\n.headerCellDragging {\n\topacity: 0.75;\n}\n\n.headerCellPinnedLeft {\n\tposition: sticky;\n\tz-index: 12;\n}\n\n.bodyRow {\n\ttransition: background-color var(--transition-fast) ease;\n}\n\n.bodyRowInteractive {\n\tcursor: pointer;\n\n\t&:hover .bodyCell,\n\t&:focus-visible .bodyCell {\n\t\tbackground-color: var(--surface-1);\n\t}\n}\n\n.bodyRowSelected {\n\t.bodyCell {\n\t\tbackground-color: var(--surface-1);\n\t}\n}\n\n.bodyCell {\n\tpadding: var(--space-sm) var(--space-md);\n\tbackground-color: var(--surface-0);\n\tborder-bottom: var(--border);\n\tvertical-align: middle;\n}\n\n.bodyCellPinnedLeft {\n\tposition: sticky;\n\tz-index: 2;\n}\n\n.bodyCellMergedWithNext {\n\tborder-bottom-color: transparent;\n}\n\n.feedbackCell {\n\tpadding: var(--space-md);\n\tbackground-color: var(--surface-0);\n}\n\n.fetchingRow .feedbackCell {\n\tborder-bottom: 0;\n}\n\n.noData {\n\tpointer-events: none;\n\tposition: absolute;\n\tinset: 0;\n\tz-index: 40;\n}\n","import { ReactNode } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { Header } from \"@tanstack/react-table\";\n\nimport { TableHeaderInteractionCell } from \"../../table-column-interactions\";\n\nimport styles from \"./BaseTable.module.scss\";\n\ninterface BaseTableHeaderCellProps<TData extends object> {\n\theader: Header<TData, unknown>;\n\tisPinnedLeft: boolean;\n\tleft?: string;\n\tisPinnedBoundary: boolean;\n\tisDragDisabled: boolean;\n\tenableColumnResizing: boolean;\n\tenableColumnReordering: boolean;\n\tcolumnResizeMinWidth: number | undefined;\n\trenderHeaderContent: (header: Header<TData, unknown>) => ReactNode;\n\tonResizeColumn: (columnId: string, width: number) => void;\n\tonResetColumnWidth: (columnId: string) => void;\n}\n\nexport function BaseTableHeaderCell<TData extends object>({\n\theader,\n\tisPinnedLeft,\n\tleft,\n\tisPinnedBoundary,\n\tisDragDisabled,\n\tenableColumnResizing,\n\tenableColumnReordering,\n\tcolumnResizeMinWidth,\n\trenderHeaderContent,\n\tonResizeColumn,\n\tonResetColumnWidth\n}: BaseTableHeaderCellProps<TData>) {\n\treturn (\n\t\t<TableHeaderInteractionCell\n\t\t\tcolumnId={header.column.id}\n\t\t\tdragDisabled={!enableColumnReordering || isDragDisabled}\n\t\t\tdraggingClassName={styles.headerCellDragging}\n\t\t\tclassName={cn(styles.headerCell, isPinnedLeft && styles.headerCellPinnedLeft, isPinnedBoundary && styles.pinnedLeftBoundary)}\n\t\t\tstyle={{\n\t\t\t\t// NOTE: заголовок всегда по левому краю\n\t\t\t\t// ...(meta?.align ? { textAlign: meta.align } : {}),\n\t\t\t\t...(isPinnedLeft ? { left } : {})\n\t\t\t}}\n\t\t\tresizeHandle={\n\t\t\t\tenableColumnResizing && !header.isPlaceholder\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tcolumnId: header.column.id,\n\t\t\t\t\t\t\tminWidth: columnResizeMinWidth,\n\t\t\t\t\t\t\tonResize: onResizeColumn,\n\t\t\t\t\t\t\tonReset: onResetColumnWidth\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined\n\t\t\t}>\n\t\t\t{({ listeners, setActivatorElement }) => (\n\t\t\t\t<div\n\t\t\t\t\tref={enableColumnReordering && !isDragDisabled ? setActivatorElement : undefined}\n\t\t\t\t\tclassName={cn(styles.headerCellContent, enableColumnReordering && !isDragDisabled && styles.headerCellDraggable)}\n\t\t\t\t\t{...(enableColumnReordering && !isDragDisabled ? (listeners ?? {}) : {})}>\n\t\t\t\t\t{renderHeaderContent(header)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</TableHeaderInteractionCell>\n\t);\n}\n","import {\n\tuseCallback,\n\tuseMemo,\n\ttype CSSProperties,\n\ttype KeyboardEvent as ReactKeyboardEvent,\n\ttype MouseEvent as ReactMouseEvent,\n\ttype ReactNode,\n\ttype Ref\n} from \"react\";\n\nimport { DragEndEvent } from \"@dnd-kit/core\";\nimport { restrictToHorizontalAxis } from \"@dnd-kit/modifiers\";\nimport { useDndSortableSensors } from \"@ryuzaki13/react-foundation-lib/hooks\";\nimport {\n\tgetTableColumnMeta,\n\tisTableInteractiveElement,\n\tpatchTableColumnWidth,\n\tremoveTableColumnWidth,\n\tresolveReorderedTableHeaderColumns,\n\tresolveTableColumnOrder,\n\ttype TableColumnMeta,\n\ttype TableSelectionMode\n} from \"@ryuzaki13/react-foundation-lib/table\";\nimport { cn, handleKeyboardActivation } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { flexRender, Header, type Cell, type Row, type Table as TanStackTable } from \"@tanstack/react-table\";\n\nimport { ContextMenu } from \"../../context-menu\";\nimport { GridContainer } from \"../../grid\";\nimport { LoadingMessage, NoData, Scrollable } from \"../../misc\";\nimport { getSortableReorderResult, Sortable } from \"../../sortable\";\nimport { BaseTableColumnState, buildBaseTableColumnLayout, getLeftPinnedColumnOffsets } from \"../lib/columnPinning\";\nimport { BaseTableCellLayout } from \"../lib/mergeDuplicates\";\n\nimport styles from \"./BaseTable.module.scss\";\nimport { BaseTableHeaderCell } from \"./BaseTableHeaderCell\";\n\nimport type { FormattersPipelineDisplayValue } from \"@ryuzaki13/react-foundation-lib/formatters\";\n\n/**\n * Аргументы кастомизации рендера ячейки базовой таблицы.\n */\nexport interface BaseTableCellRenderArgs<TData extends object> {\n\trow: Row<TData>;\n\tcell: Cell<TData, unknown>;\n\tdefaultContent: ReactNode;\n\t/**\n\t * Display-модель ячейки после общего formatting runtime.\n\t *\n\t * BaseTable сам не форматирует значения, поэтому поле заполняют адаптеры\n\t * `Table`/`TreeTable`. Слот может отсутствовать у низкоуровневых\n\t * потребителей BaseTable.\n\t */\n\tdisplayValue?: FormattersPipelineDisplayValue;\n\tcolumnMeta?: TableColumnMeta;\n}\n\n/**\n * Внутренний базовый рендерер таблицы.\n *\n * Не знает о плоских или древовидных данных и работает с уже подготовленным экземпляром TanStack Table.\n *\n * @NOTE: не для использования напрямую, это база для `Table` и `TreeTable`\n */\nexport interface BaseTableProps<TData extends object> {\n\ttable: TanStackTable<TData>;\n\tcolumnState: BaseTableColumnState;\n\ttitle?: string;\n\tisLoading?: boolean;\n\tisFetching?: boolean;\n\tclassName?: string;\n\tminHeight?: `${number}em` | `${number}%`;\n\ttableClassName?: string;\n\tselectionMode?: TableSelectionMode;\n\tscrollableRef?: Ref<HTMLDivElement>;\n\tinteractiveElementSelector?: string;\n\tonActivateRow?: (row: Row<TData>) => void;\n\tisRowInteractive?: (row: Row<TData>) => boolean;\n\tgetRowClassName?: (row: Row<TData>) => string | undefined;\n\tgetCellClassName?: (args: BaseTableCellRenderArgs<TData>) => string | undefined;\n\tgetCellStyle?: (args: BaseTableCellRenderArgs<TData>) => CSSProperties | undefined;\n\tgetCellLayout?: (args: BaseTableCellRenderArgs<TData>) => BaseTableCellLayout | undefined;\n\trenderCellContent?: (args: BaseTableCellRenderArgs<TData>) => ReactNode;\n\t/**\n\t * Общий слот контекстного меню заголовка.\n\t *\n\t * BaseTable намеренно не знает про сортировку, группировку или доменные\n\t * действия. Он только сохраняет единый доступный способ открыть меню для\n\t * `Table` и `TreeTable`, а содержимое передает потребитель.\n\t */\n\trenderHeaderContextMenu?: (header: Header<TData, unknown>) => ReactNode;\n\tenableColumnResizing?: boolean;\n\tenableColumnReordering?: boolean;\n\tcolumnResizeMinWidth?: number;\n\tafterTableContent?: ReactNode;\n}\n\n/**\n * Объединяет header groups из pinned/center/right зон в единый порядок рендера.\n */\nfunction resolveHeaderOrderIndex<TData extends object>(\n\theader: Header<TData, unknown>,\n\tcolumnIndexById: ReadonlyMap<string, number>\n): number {\n\tconst indexes = header\n\t\t.getLeafHeaders()\n\t\t.map((leafHeader) => columnIndexById.get(leafHeader.column.id))\n\t\t.filter((index): index is number => typeof index === \"number\");\n\n\treturn indexes.length ? Math.min(...indexes) : Number.MAX_SAFE_INTEGER;\n}\n\nfunction buildOrderedHeaderGroups<TData extends object>(\n\ttable: TanStackTable<TData>,\n\tcolumnIndexById: ReadonlyMap<string, number>\n): Header<TData, unknown>[][] {\n\tconst leftHeaderGroups = table.getLeftHeaderGroups();\n\tconst centerHeaderGroups = table.getCenterHeaderGroups();\n\tconst rightHeaderGroups = table.getRightHeaderGroups();\n\tconst headerGroupCount = Math.max(leftHeaderGroups.length, centerHeaderGroups.length, rightHeaderGroups.length);\n\n\treturn Array.from({ length: headerGroupCount }, (_, index) => {\n\t\tconst headers = [\n\t\t\t...(leftHeaderGroups[index]?.headers ?? []),\n\t\t\t...(centerHeaderGroups[index]?.headers ?? []),\n\t\t\t...(rightHeaderGroups[index]?.headers ?? [])\n\t\t];\n\n\t\treturn headers\n\t\t\t.filter((header) => {\n\t\t\t\tif (header.isPlaceholder) return true;\n\n\t\t\t\treturn header.getLeafHeaders().some((leafHeader) => columnIndexById.has(leafHeader.column.id));\n\t\t\t})\n\t\t\t.sort((left, right) => resolveHeaderOrderIndex(left, columnIndexById) - resolveHeaderOrderIndex(right, columnIndexById));\n\t});\n}\n\n/**\n * Проверяет, что весь header целиком относится к pinned-left зоне.\n *\n * Смешанные grouped headers намеренно не переводятся в sticky-режим в первой итерации.\n */\nfunction resolveHeaderPinnedLeftState<TData extends object>(\n\theader: Header<TData, unknown>,\n\tleftPinnedOffsets: Readonly<Record<string, string>>,\n\tlastPinnedColumnId: string | undefined\n): { isPinnedLeft: boolean; left?: string; isPinnedBoundary: boolean } {\n\tconst leafHeaders = header.getLeafHeaders();\n\tconst leafColumnIds = leafHeaders.map((leafHeader) => leafHeader.column.id);\n\tconst isPinnedLeft = leafColumnIds.length > 0 && leafColumnIds.every((columnId) => columnId in leftPinnedOffsets);\n\n\tif (!isPinnedLeft) {\n\t\treturn {\n\t\t\tisPinnedLeft: false,\n\t\t\tisPinnedBoundary: false\n\t\t};\n\t}\n\n\treturn {\n\t\tisPinnedLeft: true,\n\t\tleft: leftPinnedOffsets[leafColumnIds[0]!] ?? \"0px\",\n\t\tisPinnedBoundary: Boolean(lastPinnedColumnId && leafColumnIds.includes(lastPinnedColumnId))\n\t};\n}\n\nfunction getCurrentLeafColumnOrder<TData extends object>(table: TanStackTable<TData>, columnState: BaseTableColumnState): string[] {\n\tconst definedColumnIds = table.getAllLeafColumns().map((column) => column.id);\n\n\treturn resolveTableColumnOrder({\n\t\tids: definedColumnIds,\n\t\torder: columnState.columnOrder\n\t});\n}\n\n/**\n * Базовая таблица с общим UI-каркасом для Table и TreeTable.\n *\n * @NOTE: не для использования напрямую, это база для `Table` и `TreeTable`\n */\nexport function BaseTable<TData extends object>({\n\ttable,\n\tcolumnState,\n\ttitle,\n\tisLoading,\n\tisFetching,\n\tclassName,\n\tminHeight = \"15em\",\n\ttableClassName,\n\tselectionMode = \"none\",\n\tscrollableRef,\n\tinteractiveElementSelector,\n\tonActivateRow,\n\tisRowInteractive,\n\tgetRowClassName,\n\tgetCellClassName,\n\tgetCellStyle,\n\tgetCellLayout,\n\trenderCellContent,\n\trenderHeaderContextMenu,\n\tenableColumnResizing = false,\n\tenableColumnReordering = false,\n\tcolumnResizeMinWidth,\n\tafterTableContent\n}: BaseTableProps<TData>) {\n\tconst columnLayout = buildBaseTableColumnLayout(table, columnState);\n\tconst visibleColumns = useMemo(() => columnLayout.map((column) => column.column), [columnLayout]);\n\tconst visibleColumnIds = useMemo(() => columnLayout.map((column) => column.id), [columnLayout]);\n\tconst visibleColumnIndexById = useMemo(() => new Map(visibleColumnIds.map((columnId, index) => [columnId, index])), [visibleColumnIds]);\n\tconst visibleColumnIdSet = useMemo(() => new Set(visibleColumnIds), [visibleColumnIds]);\n\tconst sensors = useDndSortableSensors({ activationDistance: 8 });\n\tconst orderedHeaderGroups = buildOrderedHeaderGroups(table, visibleColumnIndexById);\n\tconst leftPinnedOffsets = getLeftPinnedColumnOffsets(table, columnState);\n\tconst lastPinnedColumnId = visibleColumns.filter((column) => column.getIsPinned() === \"left\").at(-1)?.id;\n\tconst pinnedLeftColumnIds = useMemo(() => columnState.columnPinning.left ?? [], [columnState.columnPinning.left]);\n\tconst pinnedLeftColumnIdSet = useMemo(() => new Set(pinnedLeftColumnIds), [pinnedLeftColumnIds]);\n\tconst rowModel = table.getRowModel();\n\tconst hasTitle = Boolean(title);\n\tconst hasRows = rowModel.rows.length > 0;\n\tconst orderVisibleCells = useCallback(\n\t\t(cells: readonly Cell<TData, unknown>[]) =>\n\t\t\t[...cells].sort(\n\t\t\t\t(left, right) =>\n\t\t\t\t\t(visibleColumnIndexById.get(left.column.id) ?? Number.MAX_SAFE_INTEGER) -\n\t\t\t\t\t(visibleColumnIndexById.get(right.column.id) ?? Number.MAX_SAFE_INTEGER)\n\t\t\t),\n\t\t[visibleColumnIndexById]\n\t);\n\n\tconst handleResizeColumn = useCallback(\n\t\t(columnId: string, width: number) => {\n\t\t\ttable.setColumnSizing((current) => patchTableColumnWidth(current, columnId, width, columnResizeMinWidth));\n\t\t},\n\t\t[columnResizeMinWidth, table]\n\t);\n\n\tconst handleResetColumnWidth = useCallback(\n\t\t(columnId: string) => {\n\t\t\ttable.setColumnSizing((current) => removeTableColumnWidth(current, columnId));\n\t\t},\n\t\t[table]\n\t);\n\n\tconst handleHeaderColumnDragEnd = useCallback(\n\t\t(event: DragEndEvent) => {\n\t\t\tconst reorder = getSortableReorderResult({\n\t\t\t\tevent,\n\t\t\t\titems: visibleColumnIds\n\t\t\t});\n\t\t\tif (!reorder) return;\n\n\t\t\tconst currentOrder = getCurrentLeafColumnOrder(table, columnState);\n\t\t\tconst nextOrder = resolveReorderedTableHeaderColumns({\n\t\t\t\torder: currentOrder,\n\t\t\t\theaderIds: visibleColumnIds,\n\t\t\t\tpinnedIds: pinnedLeftColumnIds,\n\t\t\t\tactiveId: String(reorder.activeId),\n\t\t\t\toverId: String(reorder.overId)\n\t\t\t});\n\n\t\t\tif (!nextOrder) return;\n\n\t\t\ttable.setColumnOrder(nextOrder);\n\t\t},\n\t\t[columnState, pinnedLeftColumnIds, table, visibleColumnIds]\n\t);\n\n\tconst renderHeaderContent = (header: Header<TData, unknown>) => {\n\t\tif (header.isPlaceholder) return null;\n\n\t\tconst content = flexRender(header.column.columnDef.header, header.getContext());\n\t\tconst menu = renderHeaderContextMenu?.(header);\n\n\t\tif (!menu) {\n\t\t\treturn content;\n\t\t}\n\n\t\treturn (\n\t\t\t<ContextMenu>\n\t\t\t\t<ContextMenu.Trigger>\n\t\t\t\t\t<div className={styles.headerContextMenuTrigger} tabIndex={0}>\n\t\t\t\t\t\t{content}\n\t\t\t\t\t</div>\n\t\t\t\t</ContextMenu.Trigger>\n\t\t\t\t<ContextMenu.Content>{menu}</ContextMenu.Content>\n\t\t\t</ContextMenu>\n\t\t);\n\t};\n\n\t/**\n\t * Обрабатывает клик по строке, не перехватывая вложенные интерактивные элементы.\n\t */\n\tconst handleRowClick = (event: ReactMouseEvent<HTMLTableRowElement>, row: Row<TData>) => {\n\t\tconst interactive = isRowInteractive?.(row) ?? Boolean(onActivateRow);\n\n\t\tif (!interactive || !onActivateRow || isTableInteractiveElement(event.target, interactiveElementSelector)) {\n\t\t\treturn;\n\t\t}\n\n\t\tonActivateRow(row);\n\t};\n\n\t/**\n\t * Дублирует активацию строки для клавиатуры.\n\t */\n\tconst handleRowKeyDown = (event: ReactKeyboardEvent<HTMLTableRowElement>, row: Row<TData>) => {\n\t\tconst interactive = isRowInteractive?.(row) ?? Boolean(onActivateRow);\n\n\t\tif (!interactive || !onActivateRow || isTableInteractiveElement(event.target, interactiveElementSelector)) {\n\t\t\treturn;\n\t\t}\n\n\t\thandleKeyboardActivation(event, () => onActivateRow(row));\n\t};\n\n\treturn (\n\t\t<GridContainer\n\t\t\ttemplateRows={hasTitle ? \"auto 1fr\" : \"1fr\"}\n\t\t\tclassName={cn(\"overflowHidden w100 h100\", styles.root, className)}\n\t\t\tstyle={{ minHeight }}>\n\t\t\t{hasTitle && <h3 className=\"marginBottomXs\">{title}</h3>}\n\n\t\t\t<div className=\"surface0 overflowHidden relative w100 h100\">\n\t\t\t\t<Scrollable ref={scrollableRef} className=\"w100 h100\">\n\t\t\t\t\t<>\n\t\t\t\t\t\t<table className={cn(styles.table, tableClassName)}>\n\t\t\t\t\t\t\t<colgroup>\n\t\t\t\t\t\t\t\t{columnLayout.map((column) => (\n\t\t\t\t\t\t\t\t\t<col key={column.id} style={column.width ? { width: column.width } : undefined} />\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</colgroup>\n\n\t\t\t\t\t\t\t<thead className={cn(\"stickyTop\", styles.head)}>\n\t\t\t\t\t\t\t\t{enableColumnReordering ? (\n\t\t\t\t\t\t\t\t\t<Sortable.Root\n\t\t\t\t\t\t\t\t\t\tsensors={sensors}\n\t\t\t\t\t\t\t\t\t\tmodifiers={[restrictToHorizontalAxis]}\n\t\t\t\t\t\t\t\t\t\tonDragEnd={handleHeaderColumnDragEnd}>\n\t\t\t\t\t\t\t\t\t\t<Sortable.Container containerId=\"base-table-header\" items={visibleColumnIds} layout=\"horizontal\">\n\t\t\t\t\t\t\t\t\t\t\t{orderedHeaderGroups.map((headers, headerGroupIndex) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<tr key={`header-group-${headerGroupIndex}`} className={styles.headerRow}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{headers.map((header) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst { isPinnedLeft, left, isPinnedBoundary } = resolveHeaderPinnedLeftState(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tleftPinnedOffsets,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tlastPinnedColumnId\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst isDragDisabled =\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\theader.isPlaceholder ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t!visibleColumnIdSet.has(header.column.id) ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpinnedLeftColumnIdSet.has(header.column.id);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<BaseTableHeaderCell\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={header.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\theader={header}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisPinnedLeft={isPinnedLeft}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tleft={left}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisPinnedBoundary={isPinnedBoundary}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisDragDisabled={isDragDisabled}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tenableColumnResizing={enableColumnResizing}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tenableColumnReordering={enableColumnReordering}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcolumnResizeMinWidth={columnResizeMinWidth}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\trenderHeaderContent={renderHeaderContent}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonResizeColumn={handleResizeColumn}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonResetColumnWidth={handleResetColumnWidth}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t</Sortable.Container>\n\t\t\t\t\t\t\t\t\t</Sortable.Root>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\torderedHeaderGroups.map((headers, headerGroupIndex) => (\n\t\t\t\t\t\t\t\t\t\t<tr key={`header-group-${headerGroupIndex}`} className={styles.headerRow}>\n\t\t\t\t\t\t\t\t\t\t\t{headers.map((header) => {\n\t\t\t\t\t\t\t\t\t\t\t\tconst { isPinnedLeft, left, isPinnedBoundary } = resolveHeaderPinnedLeftState(\n\t\t\t\t\t\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t\t\t\t\t\t\tleftPinnedOffsets,\n\t\t\t\t\t\t\t\t\t\t\t\t\tlastPinnedColumnId\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<BaseTableHeaderCell\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={header.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\theader={header}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tisPinnedLeft={isPinnedLeft}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tleft={left}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tisPinnedBoundary={isPinnedBoundary}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tisDragDisabled\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tenableColumnResizing={enableColumnResizing}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tenableColumnReordering={enableColumnReordering}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcolumnResizeMinWidth={columnResizeMinWidth}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\trenderHeaderContent={renderHeaderContent}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonResizeColumn={handleResizeColumn}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonResetColumnWidth={handleResetColumnWidth}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t))\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</thead>\n\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t{rowModel.rows.map((row) => {\n\t\t\t\t\t\t\t\t\tconst interactive = isRowInteractive?.(row) ?? Boolean(onActivateRow);\n\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<tr\n\t\t\t\t\t\t\t\t\t\t\tkey={row.id}\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\tstyles.bodyRow,\n\t\t\t\t\t\t\t\t\t\t\t\tinteractive && styles.bodyRowInteractive,\n\t\t\t\t\t\t\t\t\t\t\t\trow.getIsSelected() && styles.bodyRowSelected,\n\t\t\t\t\t\t\t\t\t\t\t\tgetRowClassName?.(row)\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\taria-selected={selectionMode !== \"none\" ? row.getIsSelected() : undefined}\n\t\t\t\t\t\t\t\t\t\t\ttabIndex={interactive ? 0 : undefined}\n\t\t\t\t\t\t\t\t\t\t\tonClick={(event) => handleRowClick(event, row)}\n\t\t\t\t\t\t\t\t\t\t\tonKeyDown={(event) => handleRowKeyDown(event, row)}>\n\t\t\t\t\t\t\t\t\t\t\t{orderVisibleCells([\n\t\t\t\t\t\t\t\t\t\t\t\t...row.getLeftVisibleCells(),\n\t\t\t\t\t\t\t\t\t\t\t\t...row.getCenterVisibleCells(),\n\t\t\t\t\t\t\t\t\t\t\t\t...row.getRightVisibleCells()\n\t\t\t\t\t\t\t\t\t\t\t]).map((cell) => {\n\t\t\t\t\t\t\t\t\t\t\t\tconst columnMeta = getTableColumnMeta(cell.column.columnDef);\n\t\t\t\t\t\t\t\t\t\t\t\tconst defaultContent = flexRender(cell.column.columnDef.cell, cell.getContext());\n\t\t\t\t\t\t\t\t\t\t\t\tconst renderArgs: BaseTableCellRenderArgs<TData> = {\n\t\t\t\t\t\t\t\t\t\t\t\t\trow,\n\t\t\t\t\t\t\t\t\t\t\t\t\tcell,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdefaultContent,\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolumnMeta\n\t\t\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\t\t\tconst cellLayout = getCellLayout?.(renderArgs);\n\t\t\t\t\t\t\t\t\t\t\t\tconst isPinnedLeft = cell.column.getIsPinned() === \"left\";\n\t\t\t\t\t\t\t\t\t\t\t\tconst isPinnedBoundary = cell.column.id === lastPinnedColumnId;\n\n\t\t\t\t\t\t\t\t\t\t\t\tconst resolvedStyle = {\n\t\t\t\t\t\t\t\t\t\t\t\t\t...(columnMeta?.align ? { textAlign: columnMeta.align } : {}),\n\t\t\t\t\t\t\t\t\t\t\t\t\t...(isPinnedLeft ? { left: leftPinnedOffsets[cell.column.id] ?? \"0px\" } : {}),\n\t\t\t\t\t\t\t\t\t\t\t\t\t...(getCellStyle?.(renderArgs) ?? {})\n\t\t\t\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<td\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={cell.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyles.bodyCell,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisPinnedLeft && styles.bodyCellPinnedLeft,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisPinnedBoundary && styles.pinnedLeftBoundary,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcellLayout?.mergeWithNext && styles.bodyCellMergedWithNext,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgetCellClassName?.(renderArgs)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={resolvedStyle}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{cellLayout?.hideContent\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? null\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: renderCellContent\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? renderCellContent(renderArgs)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: defaultContent}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t})}\n\n\t\t\t\t\t\t\t\t{isFetching && hasRows && (\n\t\t\t\t\t\t\t\t\t<tr className={styles.fetchingRow}>\n\t\t\t\t\t\t\t\t\t\t<td colSpan={Math.max(visibleColumns.length, 1)} className={styles.feedbackCell}>\n\t\t\t\t\t\t\t\t\t\t\t<LoadingMessage />\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\n\t\t\t\t\t\t{afterTableContent}\n\t\t\t\t\t</>\n\t\t\t\t</Scrollable>\n\n\t\t\t\t<div className=\"absolute inset0 border radiusSm\" style={{ pointerEvents: \"none\", zIndex: 20 }}>\n\t\t\t\t\t{!isLoading && !isFetching && !hasRows && <NoData className={styles.noData} />}\n\t\t\t\t\t{isLoading && !hasRows && <LoadingMessage className=\"h100 w100\" />}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</GridContainer>\n\t);\n}\n",".formattedCellValue {\n\twidth: 100%;\n\tmin-width: 0;\n}\n\n.formattedCell,\n.formattedCellInner {\n\t@extend .formattedCellValue;\n\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.formattedCellInner {\n\tgap: var(--space-xs);\n}\n","import { useEffect, useRef } from \"react\";\n\nimport { type FormattersPipelineDisplayValue, resolveValueStateClassName } from \"@ryuzaki13/react-foundation-lib/formatters\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { RenderStateIcon } from \"../../misc\";\n\nimport styles from \"./FormattedTableCell.module.scss\";\n\nimport type { TableColumnAlign } from \"@ryuzaki13/react-foundation-lib/table\";\n\n/**\n * Пропсы общего renderer форматированной ячейки.\n */\nexport interface FormattedTableCellProps {\n\t/**\n\t * Нормализованный display-result из formatting-runtime.\n\t */\n\tdisplayValue: FormattersPipelineDisplayValue;\n\t/**\n\t * Табличное выравнивание содержимого.\n\t */\n\talign?: TableColumnAlign;\n}\n\n/**\n * Общий renderer форматированной ячейки для `Table` и будущего `TreeTable`.\n *\n * Компонент отвечает только за UI-отрисовку уже вычисленного display-result:\n * runtime и бизнес-логика вычисления значения в него не входят.\n */\nexport function FormattedTableCell({ displayValue, align = \"left\" }: FormattedTableCellProps) {\n\tconst textRef = useRef<HTMLSpanElement | null>(null);\n\tconst showValue = displayValue.showValue;\n\tconst showIcon = displayValue.showIcon;\n\tconst icon = showIcon ? displayValue.icon : undefined;\n\tconst textValue = showValue && displayValue.value != null ? String(displayValue.value) : \"\";\n\tconst stateClassName = resolveValueStateClassName(displayValue.state);\n\tconst justifyContent = align === \"right\" ? \"flex-end\" : align === \"center\" ? \"center\" : \"flex-start\";\n\tconst textAlign = align === \"center\" ? \"center\" : align === \"right\" ? \"right\" : \"left\";\n\n\tuseEffect(() => {\n\t\tconst element = textRef.current;\n\t\tif (!element) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst updateTitle = () => {\n\t\t\tif (!displayValue.overflowTooltip || !textValue) {\n\t\t\t\telement.removeAttribute(\"title\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst isOverflowing = element.scrollWidth > element.clientWidth + 1;\n\t\t\tif (isOverflowing) {\n\t\t\t\telement.setAttribute(\"title\", textValue);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\telement.removeAttribute(\"title\");\n\t\t};\n\n\t\tupdateTitle();\n\n\t\tif (typeof ResizeObserver === \"undefined\") {\n\t\t\treturn;\n\t\t}\n\n\t\tconst observer = new ResizeObserver(updateTitle);\n\t\tobserver.observe(element);\n\n\t\treturn () => {\n\t\t\tobserver.disconnect();\n\t\t};\n\t}, [displayValue.overflowTooltip, textValue]);\n\n\treturn (\n\t\t<div className={cn(styles.formattedCell, stateClassName)}>\n\t\t\t<div className={styles.formattedCellInner} style={{ justifyContent }}>\n\t\t\t\t{displayValue.iconPosition === \"left\" ? <RenderStateIcon state={icon} /> : null}\n\n\t\t\t\t{showValue ? (\n\t\t\t\t\t<span ref={textRef} className={cn(\"textOverflow\", styles.formattedCellValue)} style={{ textAlign }}>\n\t\t\t\t\t\t{textValue}\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\n\t\t\t\t{displayValue.iconPosition === \"right\" ? <RenderStateIcon state={icon} /> : null}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"base-table-BXKFSgIk.js","names":[],"sources":["../../src/base-table/lib/columnPinning.ts","../../src/base-table/lib/formatting.ts","../../src/base-table/lib/mergeDuplicates.ts","../../src/base-table/model/useTableColumnOrder.ts","../../src/base-table/model/useTableColumnPinning.ts","../../src/base-table/model/useTableColumnSizing.ts","../../src/base-table/model/useTableColumnVisibility.ts","../../src/base-table/ui/BaseTable.module.scss","../../src/base-table/ui/BaseTableHeaderCell.tsx","../../src/base-table/ui/BaseTable.tsx","../../src/base-table/ui/FormattedTableCell.module.scss","../../src/base-table/ui/FormattedTableCell.tsx"],"sourcesContent":["import { filterAndDeduplicateIds, pickExistingMapValues } from \"@ryuzaki13/react-foundation-lib/array\";\nimport {\n\tbuildTableColumnLayout,\n\tgetTableColumnMeta,\n\tresolveTableColumnOrder,\n\tresolveTableLength\n} from \"@ryuzaki13/react-foundation-lib/table\";\n\nimport type { Column, TableState, Table as TanStackTable } from \"@tanstack/react-table\";\n\nexport type BaseTableColumnLayoutItem<TData extends object> = {\n\tid: string;\n\tcolumn: Column<TData, unknown>;\n\twidth: string;\n};\n\n/**\n * Реактивный срез состояния колонок, от которого зависит физический layout BaseTable.\n *\n * TanStack table instance остаётся стабильным объектом, поэтому BaseTable получает\n * этот срез отдельным prop: React Compiler не должен кэшировать разметку колонок\n * поверх изменившихся order/sizing/pinning/visibility.\n */\nexport type BaseTableColumnState = Pick<TableState, \"columnOrder\" | \"columnPinning\" | \"columnSizing\" | \"columnVisibility\">;\n\n/**\n * Публичное состояние закрепления колонок для shared-таблиц.\n *\n * В первой итерации поддерживается только закрепление слева.\n */\nexport interface TableColumnPinningState {\n\t/**\n\t * Идентификаторы колонок, закреплённых слева, в порядке отображения.\n\t */\n\tleft?: string[];\n}\n\n/**\n * Нормализует публичное состояние закрепления к формату TanStack Table.\n *\n * Правая зона принудительно очищается, чтобы не открывать неподдерживаемый API.\n */\nexport function normalizeTableColumnPinning(state?: TableColumnPinningState): { left: string[]; right: string[] } {\n\treturn {\n\t\tleft: Array.from(\n\t\t\tnew Set(\n\t\t\t\t(state?.left ?? []).filter((columnId): columnId is string => typeof columnId === \"string\" && columnId.trim().length > 0)\n\t\t\t)\n\t\t),\n\t\tright: []\n\t};\n}\n\n/**\n * Возвращает ширину колонки в том же формате, что и colgroup базовой таблицы.\n */\nexport function resolveBaseTableColumnWidth<TData extends object>(\n\tcolumn: Column<TData, unknown>,\n\tcolumnSizing?: Readonly<Record<string, number>>\n): string {\n\tconst resizedWidth = columnSizing?.[column.id];\n\tif (typeof resizedWidth === \"number\" && Number.isFinite(resizedWidth) && resizedWidth > 0) {\n\t\treturn `${Math.floor(resizedWidth)}px`;\n\t}\n\n\tconst meta = getTableColumnMeta(column.columnDef);\n\n\tlet width = meta?.width ?? 4;\n\n\tif (typeof width === \"number\") {\n\t\twidth = Math.max(width, 4);\n\t}\n\n\treturn resolveTableLength(width);\n}\n\n/**\n * Собирает видимые leaf-колонки в фактическом порядке рендера: pinned-left -> center -> pinned-right.\n *\n * В отличие от отдельных TanStack getters, порядок явно строится из одного\n * источника `columnOrder`, поэтому `<colgroup>`, header и body получают один\n * и тот же layout после drag&drop.\n */\nexport function getOrderedVisibleLeafColumns<TData extends object>(\n\ttable: TanStackTable<TData>,\n\tcolumnState: BaseTableColumnState\n): Column<TData, unknown>[] {\n\tconst visibleColumns = table.getAllLeafColumns().filter((column) => column.getIsVisible());\n\tconst columnById = new Map(visibleColumns.map((column) => [column.id, column]));\n\tconst visibleColumnIds = visibleColumns.map((column) => column.id);\n\tconst leftIds = filterAndDeduplicateIds(columnState.columnPinning.left, visibleColumnIds);\n\tconst rightIds = filterAndDeduplicateIds(columnState.columnPinning.right, visibleColumnIds);\n\tconst pinnedIds = new Set([...leftIds, ...rightIds]);\n\tconst centerIds: string[] = [];\n\n\tfor (const column of visibleColumns) {\n\t\tif (!pinnedIds.has(column.id)) {\n\t\t\tcenterIds.push(column.id);\n\t\t}\n\t}\n\n\tconst orderedCenterIds = resolveTableColumnOrder({\n\t\tids: centerIds,\n\t\torder: columnState.columnOrder\n\t});\n\n\treturn pickExistingMapValues([...leftIds, ...orderedCenterIds, ...rightIds], columnById);\n}\n\nexport function buildBaseTableColumnLayout<TData extends object>(\n\ttable: TanStackTable<TData>,\n\tcolumnState: BaseTableColumnState\n): BaseTableColumnLayoutItem<TData>[] {\n\tconst columns = getOrderedVisibleLeafColumns(table, columnState);\n\tconst columnById = new Map(columns.map((column) => [column.id, column]));\n\n\treturn buildTableColumnLayout({\n\t\tids: columns.map((column) => column.id),\n\t\tgetWidth: (id) => {\n\t\t\tconst column = columnById.get(id);\n\t\t\treturn column ? resolveBaseTableColumnWidth(column, columnState.columnSizing) : \"0px\";\n\t\t}\n\t}).flatMap((item) => {\n\t\tconst column = columnById.get(item.id);\n\n\t\treturn column\n\t\t\t? [\n\t\t\t\t\t{\n\t\t\t\t\t\t...item,\n\t\t\t\t\t\tcolumn\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t: [];\n\t});\n}\n\n/**\n * Вычисляет sticky-offset для закреплённых слева колонок.\n *\n * Значения возвращаются как CSS-length, чтобы корректно суммировать `em`, `px` и `calc(...)`.\n */\nexport function getLeftPinnedColumnOffsets<TData extends object>(\n\ttable: TanStackTable<TData>,\n\tcolumnState: BaseTableColumnState\n): Readonly<Record<string, string>> {\n\tconst offsets: Record<string, string> = {};\n\tconst accumulatedWidths: string[] = [];\n\n\tfor (const column of getOrderedVisibleLeafColumns(table, columnState)) {\n\t\tif (column.getIsPinned() !== \"left\") continue;\n\n\t\toffsets[column.id] = combineCssLengths(accumulatedWidths);\n\t\taccumulatedWidths.push(resolveBaseTableColumnWidth(column, columnState.columnSizing));\n\t}\n\n\treturn offsets;\n}\n\n/**\n * Складывает CSS-length значения в безопасную строку `calc(...)`.\n */\nfunction combineCssLengths(lengths: readonly string[]): string {\n\tif (lengths.length === 0) {\n\t\treturn \"0px\";\n\t}\n\n\tif (lengths.length === 1) {\n\t\treturn lengths[0]!;\n\t}\n\n\treturn `calc(${lengths.join(\" + \")})`;\n}\n","import {\n\tcompileFormattersPipelineRuntimeFields,\n\ttype FormattersPipelineRuntimeField,\n\ttype FormattersPipelineRuntimeFields\n} from \"@ryuzaki13/react-foundation-lib/formatters\";\nimport { getTableColumnFormattingMeta, type TableColumnDef } from \"@ryuzaki13/react-foundation-lib/table\";\n\n/**\n * Снимок форматирующих данных, вычисленный из набора колонок.\n *\n * Используется и в `Table`, и в `TreeTable`, чтобы не дублировать\n * предкомпиляцию runtime и правила приоритета кастомного `cell`.\n */\nexport interface TableFormattingSnapshot {\n\t/**\n\t * Скомпилированный runtime по идентификаторам колонок.\n\t */\n\truntimeByColumnId: FormattersPipelineRuntimeFields<FormattersPipelineRuntimeField>;\n\t/**\n\t * Идентификаторы колонок с явным кастомным `cell`.\n\t */\n\tcustomCellColumnIds: Set<string>;\n}\n\n/**\n * Определяет стабильный идентификатор колонки для pipeline runtime.\n *\n * Порядок приоритета:\n * 1. `column.id`\n * 2. строковый `accessorKey`\n */\nexport function resolveTableFormattingColumnId<TData extends object>(column: TableColumnDef<TData>): string | undefined {\n\tif (typeof column.id === \"string\" && column.id.trim()) {\n\t\treturn column.id;\n\t}\n\n\tif (\"accessorKey\" in column && typeof column.accessorKey === \"string\" && column.accessorKey.trim()) {\n\t\treturn column.accessorKey;\n\t}\n\n\treturn undefined;\n}\n\n/**\n * Проверяет, задан ли у колонки явный кастомный `cell`.\n */\nexport function hasTableColumnCustomCellRenderer<TData extends object>(column: TableColumnDef<TData>): boolean {\n\treturn \"cell\" in column && column.cell != null;\n}\n\n/**\n * Обходит только leaf-колонки, пропуская group-узлы.\n */\nfunction visitLeafTableColumns<TData extends object>(\n\tcolumns: readonly TableColumnDef<TData>[],\n\tvisitor: (column: TableColumnDef<TData>) => void\n): void {\n\tfor (const column of columns) {\n\t\tif (\"columns\" in column && Array.isArray(column.columns) && column.columns.length > 0) {\n\t\t\tvisitLeafTableColumns(column.columns as TableColumnDef<TData>[], visitor);\n\t\t\tcontinue;\n\t\t}\n\n\t\tvisitor(column);\n\t}\n}\n\n/**\n * Собирает snapshot pipeline runtime по описанию колонок.\n */\nexport function buildTableFormattingSnapshot<TData extends object>(columns: readonly TableColumnDef<TData>[]): TableFormattingSnapshot {\n\tconst formattingByColumnId: Record<string, FormattersPipelineRuntimeField> = {};\n\tconst customCellColumnIds = new Set<string>();\n\n\tvisitLeafTableColumns(columns, (column) => {\n\t\tconst columnId = resolveTableFormattingColumnId(column);\n\t\tif (!columnId) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (hasTableColumnCustomCellRenderer(column)) {\n\t\t\tcustomCellColumnIds.add(columnId);\n\t\t}\n\n\t\tconst formatting = getTableColumnFormattingMeta(column);\n\t\tif (!formatting) {\n\t\t\treturn;\n\t\t}\n\n\t\tformattingByColumnId[columnId] = {\n\t\t\t...formatting,\n\t\t\tid: formatting.id ?? columnId,\n\t\t\trole: formatting.role ?? \"dimension\",\n\t\t\ttype: formatting.type ?? \"string\"\n\t\t};\n\t});\n\n\treturn {\n\t\truntimeByColumnId: compileFormattersPipelineRuntimeFields(formattingByColumnId),\n\t\tcustomCellColumnIds\n\t};\n}\n\n/**\n * Определяет, должен ли компонент использовать pipeline runtime для ячейки.\n */\nexport function shouldUseTableFormatting(args: {\n\tcolumnId: string;\n\truntimeByColumnId: FormattersPipelineRuntimeFields<FormattersPipelineRuntimeField>;\n\tcustomCellColumnIds: ReadonlySet<string>;\n}): boolean {\n\tif (args.customCellColumnIds.has(args.columnId)) {\n\t\treturn false;\n\t}\n\n\treturn Boolean(args.runtimeByColumnId[args.columnId]);\n}\n","import { getTableColumnMeta } from \"@ryuzaki13/react-foundation-lib/table\";\n\nimport type { Cell, Column, Row } from \"@tanstack/react-table\";\n\n/**\n * Layout-настройка body-ячейки базовой таблицы.\n */\nexport interface BaseTableCellLayout {\n\thideContent?: boolean;\n\tmergeWithNext?: boolean;\n}\n\n/**\n * Результат расчёта layout для body-ячейки по её `cell.id`.\n */\nexport type BaseTableCellLayoutById = ReadonlyMap<string, BaseTableCellLayout>;\n\n/**\n * Аргументы построения layout для display-only слияния дубликатов.\n */\nexport interface BuildBaseTableMergedCellsLayoutArgs<TData extends object> {\n\trows: readonly Row<TData>[];\n\tcolumns: readonly Column<TData, unknown>[];\n\tresolveRowBoundaryKey?: (row: Row<TData>) => unknown;\n\texcludeColumnIds?: ReadonlySet<string>;\n}\n\ntype VisibleRowCellLookup<TData extends object> = {\n\trow: Row<TData>;\n\tboundaryKey: unknown;\n\tcellByColumnId: ReadonlyMap<string, Cell<TData, unknown>>;\n};\n\nfunction isMergeableValue(value: unknown): boolean {\n\treturn value !== null && value !== undefined && value !== \"\";\n}\n\nfunction buildVisibleRowCellLookups<TData extends object>(\n\trows: readonly Row<TData>[],\n\tresolveRowBoundaryKey: (row: Row<TData>) => unknown\n): VisibleRowCellLookup<TData>[] {\n\treturn rows.map((row) => ({\n\t\trow,\n\t\tboundaryKey: resolveRowBoundaryKey(row),\n\t\tcellByColumnId: new Map(row.getVisibleCells().map((cell) => [cell.column.id, cell]))\n\t}));\n}\n\n/**\n * Строит layout display-only слияния для колонок с `meta.mergeDuplicates`.\n *\n * Слияние работает только для подряд идущих одинаковых raw-значений. Пустые\n * значения (`null`, `undefined`, `\"\"`) не объединяются.\n */\nexport function buildBaseTableMergedCellsLayout<TData extends object>({\n\trows,\n\tcolumns,\n\tresolveRowBoundaryKey = () => \"__all_rows__\",\n\texcludeColumnIds\n}: BuildBaseTableMergedCellsLayoutArgs<TData>): BaseTableCellLayoutById {\n\tconst mergeableColumns = columns.filter((column) => {\n\t\tif (excludeColumnIds?.has(column.id)) {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn getTableColumnMeta(column.columnDef)?.mergeDuplicates === true;\n\t});\n\n\tif (rows.length === 0 || mergeableColumns.length === 0) {\n\t\treturn new Map();\n\t}\n\n\tconst rowLookups = buildVisibleRowCellLookups(rows, resolveRowBoundaryKey);\n\tconst layoutByCellId = new Map<string, BaseTableCellLayout>();\n\n\tfor (const column of mergeableColumns) {\n\t\tlet groupStartIndex = -1;\n\t\tlet groupValue: unknown = undefined;\n\t\tlet groupBoundaryKey: unknown = undefined;\n\n\t\tconst finalizeGroup = (endIndexExclusive: number) => {\n\t\t\tif (groupStartIndex === -1) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst groupSize = endIndexExclusive - groupStartIndex;\n\t\t\tif (groupSize <= 1) {\n\t\t\t\tgroupStartIndex = -1;\n\t\t\t\tgroupValue = undefined;\n\t\t\t\tgroupBoundaryKey = undefined;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tfor (let index = groupStartIndex; index < endIndexExclusive; index += 1) {\n\t\t\t\tconst cellId = rowLookups[index]?.cellByColumnId.get(column.id)?.id;\n\t\t\t\tif (cellId) {\n\t\t\t\t\tlayoutByCellId.set(cellId, {\n\t\t\t\t\t\thideContent: index > groupStartIndex,\n\t\t\t\t\t\tmergeWithNext: index < endIndexExclusive - 1\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tgroupStartIndex = -1;\n\t\t\tgroupValue = undefined;\n\t\t\tgroupBoundaryKey = undefined;\n\t\t};\n\n\t\tfor (let index = 0; index < rowLookups.length; index += 1) {\n\t\t\tconst currentRow = rowLookups[index];\n\t\t\tconst currentCell = currentRow?.cellByColumnId.get(column.id);\n\t\t\tconst currentValue = currentCell?.getValue();\n\n\t\t\tif (!currentCell || !isMergeableValue(currentValue)) {\n\t\t\t\tfinalizeGroup(index);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (groupStartIndex === -1) {\n\t\t\t\tgroupStartIndex = index;\n\t\t\t\tgroupValue = currentValue;\n\t\t\t\tgroupBoundaryKey = currentRow?.boundaryKey;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (!Object.is(groupBoundaryKey, currentRow?.boundaryKey) || !Object.is(groupValue, currentValue)) {\n\t\t\t\tfinalizeGroup(index);\n\t\t\t\tgroupStartIndex = index;\n\t\t\t\tgroupValue = currentValue;\n\t\t\t\tgroupBoundaryKey = currentRow?.boundaryKey;\n\t\t\t}\n\t\t}\n\n\t\tfinalizeGroup(rowLookups.length);\n\t}\n\n\treturn layoutByCellId;\n}\n","import { useCallback, useMemo, useState } from \"react\";\n\nimport { normalizeTableColumnOrder, type TableColumnOrderState } from \"@ryuzaki13/react-foundation-lib/table\";\nimport { functionalUpdate, type ColumnOrderState, type Updater } from \"@tanstack/react-table\";\n\n/**\n * Аргументы управления порядком колонок таблицы.\n */\nexport interface UseTableColumnOrderArgs {\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 * Вызывается после изменения порядка колонок.\n\t */\n\tonColumnOrderChange?: (state: TableColumnOrderState) => void;\n}\n\n/**\n * Результат работы hook управления column order.\n */\nexport interface UseTableColumnOrderResult {\n\t/**\n\t * Актуальный order-state в формате TanStack Table.\n\t */\n\tcolumnOrder: ColumnOrderState;\n\t/**\n\t * Обработчик изменения order-state из TanStack Table.\n\t */\n\tonColumnOrderChange: (updater: Updater<ColumnOrderState>) => void;\n}\n\n/**\n * Инкапсулирует controlled/uncontrolled-паттерн для порядка колонок.\n */\nexport function useTableColumnOrder({\n\tcolumnOrder,\n\tdefaultColumnOrder,\n\tonColumnOrderChange\n}: UseTableColumnOrderArgs): UseTableColumnOrderResult {\n\tconst [uncontrolledColumnOrder, setUncontrolledColumnOrder] = useState<TableColumnOrderState | undefined>(undefined);\n\tconst resolvedColumnOrder = useMemo(\n\t\t() => normalizeTableColumnOrder(columnOrder ?? uncontrolledColumnOrder ?? defaultColumnOrder),\n\t\t[columnOrder, defaultColumnOrder, uncontrolledColumnOrder]\n\t);\n\n\tconst handleColumnOrderChange = useCallback(\n\t\t(updater: Updater<ColumnOrderState>) => {\n\t\t\tconst nextColumnOrder = normalizeTableColumnOrder(functionalUpdate(updater, resolvedColumnOrder));\n\n\t\t\tif (columnOrder === undefined) {\n\t\t\t\tsetUncontrolledColumnOrder(nextColumnOrder);\n\t\t\t}\n\n\t\t\tonColumnOrderChange?.(nextColumnOrder);\n\t\t},\n\t\t[columnOrder, onColumnOrderChange, resolvedColumnOrder]\n\t);\n\n\treturn {\n\t\tcolumnOrder: resolvedColumnOrder,\n\t\tonColumnOrderChange: handleColumnOrderChange\n\t};\n}\n","import { useCallback, useMemo, useState } from \"react\";\n\nimport { functionalUpdate, type ColumnPinningState, type Updater } from \"@tanstack/react-table\";\n\nimport { normalizeTableColumnPinning, type TableColumnPinningState } from \"../lib/columnPinning\";\n\n/**\n * Аргументы управления состоянием закрепления колонок.\n */\nexport interface UseTableColumnPinningArgs {\n\t/**\n\t * Внешнее controlled-состояние закрепления.\n\t */\n\tcolumnPinning?: TableColumnPinningState;\n\t/**\n\t * Стартовое uncontrolled-состояние закрепления.\n\t */\n\tdefaultColumnPinning?: TableColumnPinningState;\n\t/**\n\t * Вызывается после любого изменения left-pinning state.\n\t */\n\tonColumnPinningChange?: (state: TableColumnPinningState) => void;\n}\n\n/**\n * Результат работы hook управления column pinning.\n */\nexport interface UseTableColumnPinningResult {\n\t/**\n\t * Актуальный pinning-state в формате TanStack Table.\n\t */\n\tcolumnPinning: ColumnPinningState;\n\t/**\n\t * Обработчик изменения pinning-state из TanStack Table.\n\t */\n\tonColumnPinningChange: (updater: Updater<ColumnPinningState>) => void;\n}\n\n/**\n * Инкапсулирует controlled/uncontrolled-паттерн для left column pinning.\n */\nexport function useTableColumnPinning({\n\tcolumnPinning,\n\tdefaultColumnPinning,\n\tonColumnPinningChange\n}: UseTableColumnPinningArgs): UseTableColumnPinningResult {\n\tconst [uncontrolledColumnPinning, setUncontrolledColumnPinning] = useState<TableColumnPinningState | undefined>(undefined);\n\tconst resolvedColumnPinning = useMemo(\n\t\t() => normalizeTableColumnPinning(columnPinning ?? uncontrolledColumnPinning ?? defaultColumnPinning),\n\t\t[columnPinning, defaultColumnPinning, uncontrolledColumnPinning]\n\t);\n\n\tconst handleColumnPinningChange = useCallback(\n\t\t(updater: Updater<ColumnPinningState>) => {\n\t\t\tconst nextColumnPinning = normalizeTableColumnPinning(functionalUpdate(updater, resolvedColumnPinning));\n\t\t\tconst nextPublicColumnPinning: TableColumnPinningState = {\n\t\t\t\tleft: nextColumnPinning.left\n\t\t\t};\n\n\t\t\tif (columnPinning === undefined) {\n\t\t\t\tsetUncontrolledColumnPinning(nextPublicColumnPinning);\n\t\t\t}\n\n\t\t\tonColumnPinningChange?.(nextPublicColumnPinning);\n\t\t},\n\t\t[columnPinning, onColumnPinningChange, resolvedColumnPinning]\n\t);\n\n\treturn {\n\t\tcolumnPinning: resolvedColumnPinning,\n\t\tonColumnPinningChange: handleColumnPinningChange\n\t};\n}\n","import { useCallback, useMemo, useState } from \"react\";\n\nimport { normalizeTableColumnSizing, type TableColumnSizingState } from \"@ryuzaki13/react-foundation-lib/table\";\nimport { functionalUpdate, type ColumnSizingState, type Updater } from \"@tanstack/react-table\";\n\n/**\n * Аргументы управления шириной колонок таблицы.\n */\nexport interface UseTableColumnSizingArgs {\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 * Минимальная ширина колонки в px.\n\t */\n\tcolumnResizeMinWidth?: number;\n\t/**\n\t * Вызывается после изменения ширины колонок.\n\t */\n\tonColumnSizingChange?: (state: TableColumnSizingState) => void;\n}\n\n/**\n * Результат работы hook управления column sizing.\n */\nexport interface UseTableColumnSizingResult {\n\t/**\n\t * Актуальный sizing-state в формате TanStack Table.\n\t */\n\tcolumnSizing: ColumnSizingState;\n\t/**\n\t * Обработчик изменения sizing-state из TanStack Table.\n\t */\n\tonColumnSizingChange: (updater: Updater<ColumnSizingState>) => void;\n}\n\n/**\n * Инкапсулирует controlled/uncontrolled-паттерн для ширин колонок.\n */\nexport function useTableColumnSizing({\n\tcolumnSizing,\n\tdefaultColumnSizing,\n\tcolumnResizeMinWidth,\n\tonColumnSizingChange\n}: UseTableColumnSizingArgs): UseTableColumnSizingResult {\n\tconst [uncontrolledColumnSizing, setUncontrolledColumnSizing] = useState<TableColumnSizingState | undefined>(undefined);\n\tconst resolvedColumnSizing = useMemo(\n\t\t() => normalizeTableColumnSizing(columnSizing ?? uncontrolledColumnSizing ?? defaultColumnSizing, columnResizeMinWidth),\n\t\t[columnResizeMinWidth, columnSizing, defaultColumnSizing, uncontrolledColumnSizing]\n\t);\n\n\tconst handleColumnSizingChange = useCallback(\n\t\t(updater: Updater<ColumnSizingState>) => {\n\t\t\tconst nextColumnSizing = normalizeTableColumnSizing(functionalUpdate(updater, resolvedColumnSizing), columnResizeMinWidth);\n\n\t\t\tif (columnSizing === undefined) {\n\t\t\t\tsetUncontrolledColumnSizing(nextColumnSizing);\n\t\t\t}\n\n\t\t\tonColumnSizingChange?.(nextColumnSizing);\n\t\t},\n\t\t[columnResizeMinWidth, columnSizing, onColumnSizingChange, resolvedColumnSizing]\n\t);\n\n\treturn {\n\t\tcolumnSizing: resolvedColumnSizing,\n\t\tonColumnSizingChange: handleColumnSizingChange\n\t};\n}\n","import { useCallback, useMemo, useState } from \"react\";\n\nimport { functionalUpdate, type Updater, type VisibilityState } from \"@tanstack/react-table\";\n\n/**\n * Аргументы управления видимостью колонок таблицы.\n */\nexport interface UseTableColumnVisibilityArgs {\n\t/**\n\t * Внешнее controlled-состояние видимости колонок.\n\t */\n\tcolumnVisibility?: VisibilityState;\n\t/**\n\t * Стартовое uncontrolled-состояние видимости колонок.\n\t */\n\tdefaultColumnVisibility?: VisibilityState;\n\t/**\n\t * Вызывается после любого изменения visibility-state.\n\t */\n\tonColumnVisibilityChange?: (state: VisibilityState) => void;\n}\n\n/**\n * Результат работы hook управления видимостью колонок.\n */\nexport interface UseTableColumnVisibilityResult {\n\t/**\n\t * Актуальный visibility-state, который нужно передать в TanStack Table.\n\t */\n\tcolumnVisibility: VisibilityState;\n\t/**\n\t * Обработчик изменения visibility-state из TanStack Table.\n\t */\n\tonColumnVisibilityChange: (updater: Updater<VisibilityState>) => void;\n}\n\n/**\n * Инкапсулирует controlled/uncontrolled-паттерн для column visibility.\n *\n * Пока пользователь не изменял visibility локально, hook читает\n * `defaultColumnVisibility` напрямую, поэтому асинхронная metadata-инициализация\n * не требует синхронизации prop -> state через эффекты.\n */\nexport function useTableColumnVisibility({\n\tcolumnVisibility,\n\tdefaultColumnVisibility,\n\tonColumnVisibilityChange\n}: UseTableColumnVisibilityArgs): UseTableColumnVisibilityResult {\n\tconst [uncontrolledColumnVisibility, setUncontrolledColumnVisibility] = useState<VisibilityState | undefined>(undefined);\n\tconst resolvedColumnVisibility = useMemo(\n\t\t() => columnVisibility ?? uncontrolledColumnVisibility ?? defaultColumnVisibility ?? {},\n\t\t[columnVisibility, defaultColumnVisibility, uncontrolledColumnVisibility]\n\t);\n\n\tconst handleColumnVisibilityChange = useCallback(\n\t\t(updater: Updater<VisibilityState>) => {\n\t\t\tconst nextColumnVisibility = functionalUpdate(updater, resolvedColumnVisibility);\n\n\t\t\tif (columnVisibility === undefined) {\n\t\t\t\tsetUncontrolledColumnVisibility(nextColumnVisibility);\n\t\t\t}\n\n\t\t\tonColumnVisibilityChange?.(nextColumnVisibility);\n\t\t},\n\t\t[columnVisibility, onColumnVisibilityChange, resolvedColumnVisibility]\n\t);\n\n\treturn {\n\t\tcolumnVisibility: resolvedColumnVisibility,\n\t\tonColumnVisibilityChange: handleColumnVisibilityChange\n\t};\n}\n",".root,\n.headerContextMenuTrigger {\n\tmin-width: 0;\n}\n\n.table {\n\twidth: 100%;\n\tborder-collapse: separate;\n\tborder-spacing: 0;\n\ttable-layout: fixed;\n\tfont-variant-numeric: tabular-nums;\n\n\thyphens: auto;\n}\n\n.head {\n\tz-index: 10;\n}\n\n.pinnedLeftBoundary {\n\tbox-shadow: inset var(--focus-offset) 0 0 var(--border-0);\n}\n\n.headerRow {\n\tbackground-color: var(--surface-0);\n}\n\n.headerCell {\n\tposition: relative;\n\tpadding: var(--space-sm) var(--space-md);\n\tbackground-color: var(--surface-2);\n\tborder-bottom: var(--border);\n\tcolor: var(--content-0);\n\tvertical-align: middle;\n}\n\n.headerCellContent {\n\tmin-width: 0;\n}\n\n.headerCellDraggable {\n\tcursor: grab;\n\ttouch-action: none;\n\tuser-select: none;\n\n\t&:active {\n\t\tcursor: grabbing;\n\t}\n}\n\n.headerCellDragging {\n\topacity: 0.75;\n}\n\n.headerCellPinnedLeft {\n\tposition: sticky;\n\tz-index: 12;\n}\n\n.bodyRow {\n\ttransition: background-color var(--transition-fast) ease;\n}\n\n.bodyRowInteractive {\n\tcursor: pointer;\n\n\t&:hover .bodyCell,\n\t&:focus-visible .bodyCell {\n\t\tbackground-color: var(--surface-1);\n\t}\n}\n\n.bodyRowSelected {\n\t.bodyCell {\n\t\tbackground-color: var(--surface-1);\n\t}\n}\n\n.bodyCell {\n\tpadding: var(--space-sm) var(--space-md);\n\tbackground-color: var(--surface-0);\n\tborder-bottom: var(--border);\n\tvertical-align: middle;\n}\n\n.bodyCellPinnedLeft {\n\tposition: sticky;\n\tz-index: 2;\n}\n\n.bodyCellMergedWithNext {\n\tborder-bottom-color: transparent;\n}\n\n.feedbackCell {\n\tpadding: var(--space-md);\n\tbackground-color: var(--surface-0);\n}\n\n.fetchingRow .feedbackCell {\n\tborder-bottom: 0;\n}\n\n.noData {\n\tpointer-events: none;\n\tposition: absolute;\n\tinset: 0;\n\tz-index: 40;\n}\n","import { ReactNode } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { Header } from \"@tanstack/react-table\";\n\nimport { TableHeaderInteractionCell } from \"../../table-column-interactions\";\n\nimport styles from \"./BaseTable.module.scss\";\n\ninterface BaseTableHeaderCellProps<TData extends object> {\n\theader: Header<TData, unknown>;\n\tisPinnedLeft: boolean;\n\tleft?: string;\n\tisPinnedBoundary: boolean;\n\tisDragDisabled: boolean;\n\tenableColumnResizing: boolean;\n\tenableColumnReordering: boolean;\n\tcolumnResizeMinWidth: number | undefined;\n\trenderHeaderContent: (header: Header<TData, unknown>) => ReactNode;\n\tonResizeColumn: (columnId: string, width: number) => void;\n\tonResetColumnWidth: (columnId: string) => void;\n}\n\nexport function BaseTableHeaderCell<TData extends object>({\n\theader,\n\tisPinnedLeft,\n\tleft,\n\tisPinnedBoundary,\n\tisDragDisabled,\n\tenableColumnResizing,\n\tenableColumnReordering,\n\tcolumnResizeMinWidth,\n\trenderHeaderContent,\n\tonResizeColumn,\n\tonResetColumnWidth\n}: BaseTableHeaderCellProps<TData>) {\n\treturn (\n\t\t<TableHeaderInteractionCell\n\t\t\tcolumnId={header.column.id}\n\t\t\tdragDisabled={!enableColumnReordering || isDragDisabled}\n\t\t\tdraggingClassName={styles.headerCellDragging}\n\t\t\tclassName={cn(styles.headerCell, isPinnedLeft && styles.headerCellPinnedLeft, isPinnedBoundary && styles.pinnedLeftBoundary)}\n\t\t\tstyle={{\n\t\t\t\t// NOTE: заголовок всегда по левому краю\n\t\t\t\t// ...(meta?.align ? { textAlign: meta.align } : {}),\n\t\t\t\t...(isPinnedLeft ? { left } : {})\n\t\t\t}}\n\t\t\tresizeHandle={\n\t\t\t\tenableColumnResizing && !header.isPlaceholder\n\t\t\t\t\t? {\n\t\t\t\t\t\t\tcolumnId: header.column.id,\n\t\t\t\t\t\t\tminWidth: columnResizeMinWidth,\n\t\t\t\t\t\t\tonResize: onResizeColumn,\n\t\t\t\t\t\t\tonReset: onResetColumnWidth\n\t\t\t\t\t\t}\n\t\t\t\t\t: undefined\n\t\t\t}>\n\t\t\t{({ listeners, setActivatorElement }) => (\n\t\t\t\t<div\n\t\t\t\t\tref={enableColumnReordering && !isDragDisabled ? setActivatorElement : undefined}\n\t\t\t\t\tclassName={cn(styles.headerCellContent, enableColumnReordering && !isDragDisabled && styles.headerCellDraggable)}\n\t\t\t\t\t{...(enableColumnReordering && !isDragDisabled ? (listeners ?? {}) : {})}>\n\t\t\t\t\t{renderHeaderContent(header)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</TableHeaderInteractionCell>\n\t);\n}\n","import {\n\tuseCallback,\n\tuseMemo,\n\ttype CSSProperties,\n\ttype KeyboardEvent as ReactKeyboardEvent,\n\ttype MouseEvent as ReactMouseEvent,\n\ttype ReactNode,\n\ttype Ref\n} from \"react\";\n\nimport { DragEndEvent } from \"@dnd-kit/core\";\nimport { restrictToHorizontalAxis } from \"@dnd-kit/modifiers\";\nimport { useDndSortableSensors } from \"@ryuzaki13/react-foundation-lib/hooks\";\nimport {\n\tgetTableColumnMeta,\n\tisTableInteractiveElement,\n\tpatchTableColumnWidth,\n\tremoveTableColumnWidth,\n\tresolveReorderedTableHeaderColumns,\n\tresolveTableColumnOrder,\n\ttype TableColumnMeta,\n\ttype TableSelectionMode\n} from \"@ryuzaki13/react-foundation-lib/table\";\nimport { cn, handleKeyboardActivation } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { flexRender, Header, type Cell, type Row, type Table as TanStackTable } from \"@tanstack/react-table\";\n\nimport { ContextMenu } from \"../../context-menu\";\nimport { GridContainer } from \"../../grid\";\nimport { LoadingMessage, NoData, Scrollable } from \"../../misc\";\nimport { getSortableReorderResult, Sortable } from \"../../sortable\";\nimport { BaseTableColumnState, buildBaseTableColumnLayout, getLeftPinnedColumnOffsets } from \"../lib/columnPinning\";\nimport { BaseTableCellLayout } from \"../lib/mergeDuplicates\";\n\nimport styles from \"./BaseTable.module.scss\";\nimport { BaseTableHeaderCell } from \"./BaseTableHeaderCell\";\n\nimport type { FormattersPipelineDisplayValue } from \"@ryuzaki13/react-foundation-lib/formatters\";\n\n/**\n * Аргументы кастомизации рендера ячейки базовой таблицы.\n */\nexport interface BaseTableCellRenderArgs<TData extends object> {\n\trow: Row<TData>;\n\tcell: Cell<TData, unknown>;\n\tdefaultContent: ReactNode;\n\t/**\n\t * Display-модель ячейки после общего formatting runtime.\n\t *\n\t * BaseTable сам не форматирует значения, поэтому поле заполняют адаптеры\n\t * `Table`/`TreeTable`. Слот может отсутствовать у низкоуровневых\n\t * потребителей BaseTable.\n\t */\n\tdisplayValue?: FormattersPipelineDisplayValue;\n\tcolumnMeta?: TableColumnMeta;\n}\n\n/**\n * Внутренний базовый рендерер таблицы.\n *\n * Не знает о плоских или древовидных данных и работает с уже подготовленным экземпляром TanStack Table.\n *\n * @NOTE: не для использования напрямую, это база для `Table` и `TreeTable`\n */\nexport interface BaseTableProps<TData extends object> {\n\ttable: TanStackTable<TData>;\n\tcolumnState: BaseTableColumnState;\n\ttitle?: string;\n\tisLoading?: boolean;\n\tisFetching?: boolean;\n\tclassName?: string;\n\tminHeight?: `${number}em` | `${number}%`;\n\ttableClassName?: string;\n\tselectionMode?: TableSelectionMode;\n\tscrollableRef?: Ref<HTMLDivElement>;\n\tinteractiveElementSelector?: string;\n\tonActivateRow?: (row: Row<TData>) => void;\n\tisRowInteractive?: (row: Row<TData>) => boolean;\n\tgetRowClassName?: (row: Row<TData>) => string | undefined;\n\tgetCellClassName?: (args: BaseTableCellRenderArgs<TData>) => string | undefined;\n\tgetCellStyle?: (args: BaseTableCellRenderArgs<TData>) => CSSProperties | undefined;\n\tgetCellLayout?: (args: BaseTableCellRenderArgs<TData>) => BaseTableCellLayout | undefined;\n\trenderCellContent?: (args: BaseTableCellRenderArgs<TData>) => ReactNode;\n\t/**\n\t * Общий слот контекстного меню заголовка.\n\t *\n\t * BaseTable намеренно не знает про сортировку, группировку или доменные\n\t * действия. Он только сохраняет единый доступный способ открыть меню для\n\t * `Table` и `TreeTable`, а содержимое передает потребитель.\n\t */\n\trenderHeaderContextMenu?: (header: Header<TData, unknown>) => ReactNode;\n\tenableColumnResizing?: boolean;\n\tenableColumnReordering?: boolean;\n\tcolumnResizeMinWidth?: number;\n\tafterTableContent?: ReactNode;\n}\n\n/**\n * Объединяет header groups из pinned/center/right зон в единый порядок рендера.\n */\nfunction resolveHeaderOrderIndex<TData extends object>(\n\theader: Header<TData, unknown>,\n\tcolumnIndexById: ReadonlyMap<string, number>\n): number {\n\tconst indexes = header\n\t\t.getLeafHeaders()\n\t\t.map((leafHeader) => columnIndexById.get(leafHeader.column.id))\n\t\t.filter((index): index is number => typeof index === \"number\");\n\n\treturn indexes.length ? Math.min(...indexes) : Number.MAX_SAFE_INTEGER;\n}\n\nfunction buildOrderedHeaderGroups<TData extends object>(\n\ttable: TanStackTable<TData>,\n\tcolumnIndexById: ReadonlyMap<string, number>\n): Header<TData, unknown>[][] {\n\tconst leftHeaderGroups = table.getLeftHeaderGroups();\n\tconst centerHeaderGroups = table.getCenterHeaderGroups();\n\tconst rightHeaderGroups = table.getRightHeaderGroups();\n\tconst headerGroupCount = Math.max(leftHeaderGroups.length, centerHeaderGroups.length, rightHeaderGroups.length);\n\n\treturn Array.from({ length: headerGroupCount }, (_, index) => {\n\t\tconst headers = [\n\t\t\t...(leftHeaderGroups[index]?.headers ?? []),\n\t\t\t...(centerHeaderGroups[index]?.headers ?? []),\n\t\t\t...(rightHeaderGroups[index]?.headers ?? [])\n\t\t];\n\n\t\treturn headers\n\t\t\t.filter((header) => {\n\t\t\t\tif (header.isPlaceholder) return true;\n\n\t\t\t\treturn header.getLeafHeaders().some((leafHeader) => columnIndexById.has(leafHeader.column.id));\n\t\t\t})\n\t\t\t.sort((left, right) => resolveHeaderOrderIndex(left, columnIndexById) - resolveHeaderOrderIndex(right, columnIndexById));\n\t});\n}\n\n/**\n * Проверяет, что весь header целиком относится к pinned-left зоне.\n *\n * Смешанные grouped headers намеренно не переводятся в sticky-режим в первой итерации.\n */\nfunction resolveHeaderPinnedLeftState<TData extends object>(\n\theader: Header<TData, unknown>,\n\tleftPinnedOffsets: Readonly<Record<string, string>>,\n\tlastPinnedColumnId: string | undefined\n): { isPinnedLeft: boolean; left?: string; isPinnedBoundary: boolean } {\n\tconst leafHeaders = header.getLeafHeaders();\n\tconst leafColumnIds = leafHeaders.map((leafHeader) => leafHeader.column.id);\n\tconst isPinnedLeft = leafColumnIds.length > 0 && leafColumnIds.every((columnId) => columnId in leftPinnedOffsets);\n\n\tif (!isPinnedLeft) {\n\t\treturn {\n\t\t\tisPinnedLeft: false,\n\t\t\tisPinnedBoundary: false\n\t\t};\n\t}\n\n\treturn {\n\t\tisPinnedLeft: true,\n\t\tleft: leftPinnedOffsets[leafColumnIds[0]!] ?? \"0px\",\n\t\tisPinnedBoundary: Boolean(lastPinnedColumnId && leafColumnIds.includes(lastPinnedColumnId))\n\t};\n}\n\nfunction getCurrentLeafColumnOrder<TData extends object>(table: TanStackTable<TData>, columnState: BaseTableColumnState): string[] {\n\tconst definedColumnIds = table.getAllLeafColumns().map((column) => column.id);\n\n\treturn resolveTableColumnOrder({\n\t\tids: definedColumnIds,\n\t\torder: columnState.columnOrder\n\t});\n}\n\n/**\n * Базовая таблица с общим UI-каркасом для Table и TreeTable.\n *\n * @NOTE: не для использования напрямую, это база для `Table` и `TreeTable`\n */\nexport function BaseTable<TData extends object>({\n\ttable,\n\tcolumnState,\n\ttitle,\n\tisLoading,\n\tisFetching,\n\tclassName,\n\tminHeight = \"15em\",\n\ttableClassName,\n\tselectionMode = \"none\",\n\tscrollableRef,\n\tinteractiveElementSelector,\n\tonActivateRow,\n\tisRowInteractive,\n\tgetRowClassName,\n\tgetCellClassName,\n\tgetCellStyle,\n\tgetCellLayout,\n\trenderCellContent,\n\trenderHeaderContextMenu,\n\tenableColumnResizing = false,\n\tenableColumnReordering = false,\n\tcolumnResizeMinWidth,\n\tafterTableContent\n}: BaseTableProps<TData>) {\n\tconst columnLayout = buildBaseTableColumnLayout(table, columnState);\n\tconst visibleColumns = useMemo(() => columnLayout.map((column) => column.column), [columnLayout]);\n\tconst visibleColumnIds = useMemo(() => columnLayout.map((column) => column.id), [columnLayout]);\n\tconst visibleColumnIndexById = useMemo(() => new Map(visibleColumnIds.map((columnId, index) => [columnId, index])), [visibleColumnIds]);\n\tconst visibleColumnIdSet = useMemo(() => new Set(visibleColumnIds), [visibleColumnIds]);\n\tconst sensors = useDndSortableSensors({ activationDistance: 8 });\n\tconst orderedHeaderGroups = buildOrderedHeaderGroups(table, visibleColumnIndexById);\n\tconst leftPinnedOffsets = getLeftPinnedColumnOffsets(table, columnState);\n\tconst lastPinnedColumnId = visibleColumns.filter((column) => column.getIsPinned() === \"left\").at(-1)?.id;\n\tconst pinnedLeftColumnIds = useMemo(() => columnState.columnPinning.left ?? [], [columnState.columnPinning.left]);\n\tconst pinnedLeftColumnIdSet = useMemo(() => new Set(pinnedLeftColumnIds), [pinnedLeftColumnIds]);\n\tconst rowModel = table.getRowModel();\n\tconst hasTitle = Boolean(title);\n\tconst hasRows = rowModel.rows.length > 0;\n\tconst orderVisibleCells = useCallback(\n\t\t(cells: readonly Cell<TData, unknown>[]) =>\n\t\t\t[...cells].sort(\n\t\t\t\t(left, right) =>\n\t\t\t\t\t(visibleColumnIndexById.get(left.column.id) ?? Number.MAX_SAFE_INTEGER) -\n\t\t\t\t\t(visibleColumnIndexById.get(right.column.id) ?? Number.MAX_SAFE_INTEGER)\n\t\t\t),\n\t\t[visibleColumnIndexById]\n\t);\n\n\tconst handleResizeColumn = useCallback(\n\t\t(columnId: string, width: number) => {\n\t\t\ttable.setColumnSizing((current) => patchTableColumnWidth(current, columnId, width, columnResizeMinWidth));\n\t\t},\n\t\t[columnResizeMinWidth, table]\n\t);\n\n\tconst handleResetColumnWidth = useCallback(\n\t\t(columnId: string) => {\n\t\t\ttable.setColumnSizing((current) => removeTableColumnWidth(current, columnId));\n\t\t},\n\t\t[table]\n\t);\n\n\tconst handleHeaderColumnDragEnd = useCallback(\n\t\t(event: DragEndEvent) => {\n\t\t\tconst reorder = getSortableReorderResult({\n\t\t\t\tevent,\n\t\t\t\titems: visibleColumnIds\n\t\t\t});\n\t\t\tif (!reorder) return;\n\n\t\t\tconst currentOrder = getCurrentLeafColumnOrder(table, columnState);\n\t\t\tconst nextOrder = resolveReorderedTableHeaderColumns({\n\t\t\t\torder: currentOrder,\n\t\t\t\theaderIds: visibleColumnIds,\n\t\t\t\tpinnedIds: pinnedLeftColumnIds,\n\t\t\t\tactiveId: String(reorder.activeId),\n\t\t\t\toverId: String(reorder.overId)\n\t\t\t});\n\n\t\t\tif (!nextOrder) return;\n\n\t\t\ttable.setColumnOrder(nextOrder);\n\t\t},\n\t\t[columnState, pinnedLeftColumnIds, table, visibleColumnIds]\n\t);\n\n\tconst renderHeaderContent = (header: Header<TData, unknown>) => {\n\t\tif (header.isPlaceholder) return null;\n\n\t\tconst content = flexRender(header.column.columnDef.header, header.getContext());\n\t\tconst menu = renderHeaderContextMenu?.(header);\n\n\t\tif (!menu) {\n\t\t\treturn content;\n\t\t}\n\n\t\treturn (\n\t\t\t<ContextMenu>\n\t\t\t\t<ContextMenu.Trigger>\n\t\t\t\t\t<div className={styles.headerContextMenuTrigger} tabIndex={0}>\n\t\t\t\t\t\t{content}\n\t\t\t\t\t</div>\n\t\t\t\t</ContextMenu.Trigger>\n\t\t\t\t<ContextMenu.Content>{menu}</ContextMenu.Content>\n\t\t\t</ContextMenu>\n\t\t);\n\t};\n\n\t/**\n\t * Обрабатывает клик по строке, не перехватывая вложенные интерактивные элементы.\n\t */\n\tconst handleRowClick = (event: ReactMouseEvent<HTMLTableRowElement>, row: Row<TData>) => {\n\t\tconst interactive = isRowInteractive?.(row) ?? Boolean(onActivateRow);\n\n\t\tif (!interactive || !onActivateRow || isTableInteractiveElement(event.target, interactiveElementSelector)) {\n\t\t\treturn;\n\t\t}\n\n\t\tonActivateRow(row);\n\t};\n\n\t/**\n\t * Дублирует активацию строки для клавиатуры.\n\t */\n\tconst handleRowKeyDown = (event: ReactKeyboardEvent<HTMLTableRowElement>, row: Row<TData>) => {\n\t\tconst interactive = isRowInteractive?.(row) ?? Boolean(onActivateRow);\n\n\t\tif (!interactive || !onActivateRow || isTableInteractiveElement(event.target, interactiveElementSelector)) {\n\t\t\treturn;\n\t\t}\n\n\t\thandleKeyboardActivation(event, () => onActivateRow(row));\n\t};\n\n\treturn (\n\t\t<GridContainer\n\t\t\ttemplateRows={hasTitle ? \"auto 1fr\" : \"1fr\"}\n\t\t\tclassName={cn(\"overflowHidden w100 h100\", styles.root, className)}\n\t\t\tstyle={{ minHeight }}>\n\t\t\t{hasTitle && <h3 className=\"marginBottomXs\">{title}</h3>}\n\n\t\t\t<div className=\"surface0 overflowHidden relative w100 h100\">\n\t\t\t\t<Scrollable ref={scrollableRef} className=\"w100 h100\">\n\t\t\t\t\t<>\n\t\t\t\t\t\t<table className={cn(styles.table, tableClassName)}>\n\t\t\t\t\t\t\t<colgroup>\n\t\t\t\t\t\t\t\t{columnLayout.map((column) => (\n\t\t\t\t\t\t\t\t\t<col key={column.id} style={column.width ? { width: column.width } : undefined} />\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</colgroup>\n\n\t\t\t\t\t\t\t<thead className={cn(\"stickyTop\", styles.head)}>\n\t\t\t\t\t\t\t\t{enableColumnReordering ? (\n\t\t\t\t\t\t\t\t\t<Sortable.Root\n\t\t\t\t\t\t\t\t\t\tsensors={sensors}\n\t\t\t\t\t\t\t\t\t\tmodifiers={[restrictToHorizontalAxis]}\n\t\t\t\t\t\t\t\t\t\tonDragEnd={handleHeaderColumnDragEnd}>\n\t\t\t\t\t\t\t\t\t\t<Sortable.Container containerId=\"base-table-header\" items={visibleColumnIds} layout=\"horizontal\">\n\t\t\t\t\t\t\t\t\t\t\t{orderedHeaderGroups.map((headers, headerGroupIndex) => (\n\t\t\t\t\t\t\t\t\t\t\t\t<tr key={`header-group-${headerGroupIndex}`} className={styles.headerRow}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t{headers.map((header) => {\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst { isPinnedLeft, left, isPinnedBoundary } = resolveHeaderPinnedLeftState(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tleftPinnedOffsets,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tlastPinnedColumnId\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tconst isDragDisabled =\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\theader.isPlaceholder ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t!visibleColumnIdSet.has(header.column.id) ||\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tpinnedLeftColumnIdSet.has(header.column.id);\n\n\t\t\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<BaseTableHeaderCell\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={header.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\theader={header}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisPinnedLeft={isPinnedLeft}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tleft={left}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisPinnedBoundary={isPinnedBoundary}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisDragDisabled={isDragDisabled}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tenableColumnResizing={enableColumnResizing}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tenableColumnReordering={enableColumnReordering}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcolumnResizeMinWidth={columnResizeMinWidth}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\trenderHeaderContent={renderHeaderContent}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonResizeColumn={handleResizeColumn}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tonResetColumnWidth={handleResetColumnWidth}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t\t</Sortable.Container>\n\t\t\t\t\t\t\t\t\t</Sortable.Root>\n\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\torderedHeaderGroups.map((headers, headerGroupIndex) => (\n\t\t\t\t\t\t\t\t\t\t<tr key={`header-group-${headerGroupIndex}`} className={styles.headerRow}>\n\t\t\t\t\t\t\t\t\t\t\t{headers.map((header) => {\n\t\t\t\t\t\t\t\t\t\t\t\tconst { isPinnedLeft, left, isPinnedBoundary } = resolveHeaderPinnedLeftState(\n\t\t\t\t\t\t\t\t\t\t\t\t\theader,\n\t\t\t\t\t\t\t\t\t\t\t\t\tleftPinnedOffsets,\n\t\t\t\t\t\t\t\t\t\t\t\t\tlastPinnedColumnId\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<BaseTableHeaderCell\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={header.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\theader={header}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tisPinnedLeft={isPinnedLeft}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tleft={left}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tisPinnedBoundary={isPinnedBoundary}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tisDragDisabled\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tenableColumnResizing={enableColumnResizing}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tenableColumnReordering={enableColumnReordering}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tcolumnResizeMinWidth={columnResizeMinWidth}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\trenderHeaderContent={renderHeaderContent}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonResizeColumn={handleResizeColumn}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tonResetColumnWidth={handleResetColumnWidth}\n\t\t\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t))\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</thead>\n\n\t\t\t\t\t\t\t<tbody>\n\t\t\t\t\t\t\t\t{rowModel.rows.map((row) => {\n\t\t\t\t\t\t\t\t\tconst interactive = isRowInteractive?.(row) ?? Boolean(onActivateRow);\n\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<tr\n\t\t\t\t\t\t\t\t\t\t\tkey={row.id}\n\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\tstyles.bodyRow,\n\t\t\t\t\t\t\t\t\t\t\t\tinteractive && styles.bodyRowInteractive,\n\t\t\t\t\t\t\t\t\t\t\t\trow.getIsSelected() && styles.bodyRowSelected,\n\t\t\t\t\t\t\t\t\t\t\t\tgetRowClassName?.(row)\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\taria-selected={selectionMode !== \"none\" ? row.getIsSelected() : undefined}\n\t\t\t\t\t\t\t\t\t\t\ttabIndex={interactive ? 0 : undefined}\n\t\t\t\t\t\t\t\t\t\t\tonClick={(event) => handleRowClick(event, row)}\n\t\t\t\t\t\t\t\t\t\t\tonKeyDown={(event) => handleRowKeyDown(event, row)}>\n\t\t\t\t\t\t\t\t\t\t\t{orderVisibleCells([\n\t\t\t\t\t\t\t\t\t\t\t\t...row.getLeftVisibleCells(),\n\t\t\t\t\t\t\t\t\t\t\t\t...row.getCenterVisibleCells(),\n\t\t\t\t\t\t\t\t\t\t\t\t...row.getRightVisibleCells()\n\t\t\t\t\t\t\t\t\t\t\t]).map((cell) => {\n\t\t\t\t\t\t\t\t\t\t\t\tconst columnMeta = getTableColumnMeta(cell.column.columnDef);\n\t\t\t\t\t\t\t\t\t\t\t\tconst defaultContent = flexRender(cell.column.columnDef.cell, cell.getContext());\n\t\t\t\t\t\t\t\t\t\t\t\tconst renderArgs: BaseTableCellRenderArgs<TData> = {\n\t\t\t\t\t\t\t\t\t\t\t\t\trow,\n\t\t\t\t\t\t\t\t\t\t\t\t\tcell,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdefaultContent,\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolumnMeta\n\t\t\t\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\t\t\t\tconst cellLayout = getCellLayout?.(renderArgs);\n\t\t\t\t\t\t\t\t\t\t\t\tconst isPinnedLeft = cell.column.getIsPinned() === \"left\";\n\t\t\t\t\t\t\t\t\t\t\t\tconst isPinnedBoundary = cell.column.id === lastPinnedColumnId;\n\n\t\t\t\t\t\t\t\t\t\t\t\tconst resolvedStyle = {\n\t\t\t\t\t\t\t\t\t\t\t\t\t...(columnMeta?.align ? { textAlign: columnMeta.align } : {}),\n\t\t\t\t\t\t\t\t\t\t\t\t\t...(isPinnedLeft ? { left: leftPinnedOffsets[cell.column.id] ?? \"0px\" } : {}),\n\t\t\t\t\t\t\t\t\t\t\t\t\t...(getCellStyle?.(renderArgs) ?? {})\n\t\t\t\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<td\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tkey={cell.id}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyles.bodyCell,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisPinnedLeft && styles.bodyCellPinnedLeft,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tisPinnedBoundary && styles.pinnedLeftBoundary,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcellLayout?.mergeWithNext && styles.bodyCellMergedWithNext,\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tgetCellClassName?.(renderArgs)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tstyle={resolvedStyle}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t{cellLayout?.hideContent\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? null\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: renderCellContent\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t? renderCellContent(renderArgs)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t: defaultContent}\n\t\t\t\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t\t})}\n\t\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t})}\n\n\t\t\t\t\t\t\t\t{isFetching && hasRows && (\n\t\t\t\t\t\t\t\t\t<tr className={styles.fetchingRow}>\n\t\t\t\t\t\t\t\t\t\t<td colSpan={Math.max(visibleColumns.length, 1)} className={styles.feedbackCell}>\n\t\t\t\t\t\t\t\t\t\t\t<LoadingMessage />\n\t\t\t\t\t\t\t\t\t\t</td>\n\t\t\t\t\t\t\t\t\t</tr>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</tbody>\n\t\t\t\t\t\t</table>\n\n\t\t\t\t\t\t{afterTableContent}\n\t\t\t\t\t</>\n\t\t\t\t</Scrollable>\n\n\t\t\t\t<div className=\"absolute inset0 border radiusSm\" style={{ pointerEvents: \"none\", zIndex: 20 }}>\n\t\t\t\t\t{!isLoading && !isFetching && !hasRows && <NoData className={styles.noData} />}\n\t\t\t\t\t{isLoading && !hasRows && <LoadingMessage className=\"h100 w100\" />}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</GridContainer>\n\t);\n}\n",".formattedCellValue {\n\twidth: 100%;\n\tmin-width: 0;\n}\n\n.formattedCell,\n.formattedCellInner {\n\t@extend .formattedCellValue;\n\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.formattedCellInner {\n\tgap: var(--space-xs);\n}\n","import { useEffect, useRef } from \"react\";\n\nimport { type FormattersPipelineDisplayValue, resolveValueStateClassName } from \"@ryuzaki13/react-foundation-lib/formatters\";\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nimport { RenderStateIcon } from \"../../misc\";\n\nimport styles from \"./FormattedTableCell.module.scss\";\n\nimport type { TableColumnAlign } from \"@ryuzaki13/react-foundation-lib/table\";\n\n/**\n * Пропсы общего renderer форматированной ячейки.\n */\nexport interface FormattedTableCellProps {\n\t/**\n\t * Нормализованный display-result из formatting-runtime.\n\t */\n\tdisplayValue: FormattersPipelineDisplayValue;\n\t/**\n\t * Табличное выравнивание содержимого.\n\t */\n\talign?: TableColumnAlign;\n}\n\n/**\n * Общий renderer форматированной ячейки для `Table` и будущего `TreeTable`.\n *\n * Компонент отвечает только за UI-отрисовку уже вычисленного display-result:\n * runtime и бизнес-логика вычисления значения в него не входят.\n */\nexport function FormattedTableCell({ displayValue, align = \"left\" }: FormattedTableCellProps) {\n\tconst textRef = useRef<HTMLSpanElement | null>(null);\n\tconst showValue = displayValue.showValue;\n\tconst showIcon = displayValue.showIcon;\n\tconst icon = showIcon ? displayValue.icon : undefined;\n\tconst textValue = showValue && displayValue.value != null ? String(displayValue.value) : \"\";\n\tconst stateClassName = resolveValueStateClassName(displayValue.state);\n\tconst justifyContent = align === \"right\" ? \"flex-end\" : align === \"center\" ? \"center\" : \"flex-start\";\n\tconst textAlign = align === \"center\" ? \"center\" : align === \"right\" ? \"right\" : \"left\";\n\n\tuseEffect(() => {\n\t\tconst element = textRef.current;\n\t\tif (!element) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst updateTitle = () => {\n\t\t\tif (!displayValue.overflowTooltip || !textValue) {\n\t\t\t\telement.removeAttribute(\"title\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst isOverflowing = element.scrollWidth > element.clientWidth + 1;\n\t\t\tif (isOverflowing) {\n\t\t\t\telement.setAttribute(\"title\", textValue);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\telement.removeAttribute(\"title\");\n\t\t};\n\n\t\tupdateTitle();\n\n\t\tif (typeof ResizeObserver === \"undefined\") {\n\t\t\treturn;\n\t\t}\n\n\t\tconst observer = new ResizeObserver(updateTitle);\n\t\tobserver.observe(element);\n\n\t\treturn () => {\n\t\t\tobserver.disconnect();\n\t\t};\n\t}, [displayValue.overflowTooltip, textValue]);\n\n\treturn (\n\t\t<div className={cn(styles.formattedCell, stateClassName)}>\n\t\t\t<div className={styles.formattedCellInner} style={{ justifyContent }}>\n\t\t\t\t{displayValue.iconPosition === \"left\" ? <RenderStateIcon state={icon} /> : null}\n\n\t\t\t\t{showValue ? (\n\t\t\t\t\t<span ref={textRef} className={cn(\"textOverflow\", styles.formattedCellValue)} style={{ textAlign }}>\n\t\t\t\t\t\t{textValue}\n\t\t\t\t\t</span>\n\t\t\t\t) : null}\n\n\t\t\t\t{displayValue.iconPosition === \"right\" ? <RenderStateIcon state={icon} /> : null}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n"],"mappings":"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"}
|