@ryuzaki13/react-foundation-ui 1.0.15 → 1.0.17

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.
Files changed (263) hide show
  1. package/dist/advanced-search/index.js +7 -7
  2. package/dist/badge/index.js +1 -1
  3. package/dist/base-table/index.js +1 -1
  4. package/dist/chunks/{TextEditorLexicalClient-jQ7V9jFm.js → TextEditorLexicalClient-B1kQnKrU.js} +3 -3
  5. package/dist/chunks/{TextEditorLexicalClient-jQ7V9jFm.js.map → TextEditorLexicalClient-B1kQnKrU.js.map} +1 -1
  6. package/dist/chunks/{badge-BfbLPk0z.js → badge-Cri0-kVK.js} +2 -2
  7. package/dist/chunks/{badge-BfbLPk0z.js.map → badge-Cri0-kVK.js.map} +1 -1
  8. package/dist/chunks/{base-table-CiYSRI_J.js → base-table-DghNJ6ss.js} +3 -3
  9. package/dist/chunks/{base-table-CiYSRI_J.js.map → base-table-DghNJ6ss.js.map} +1 -1
  10. package/dist/chunks/{flex-CPO6xlPR.js → flex-DYZ0IbU6.js} +76 -14
  11. package/dist/chunks/flex-DYZ0IbU6.js.map +1 -0
  12. package/dist/chunks/{grid-ByIIytjh.js → grid-dI94AAbi.js} +63 -45
  13. package/dist/chunks/grid-dI94AAbi.js.map +1 -0
  14. package/dist/chunks/{misc-1PxS8OWD.js → misc-ClXJygTj.js} +2 -2
  15. package/dist/chunks/{misc-1PxS8OWD.js.map → misc-ClXJygTj.js.map} +1 -1
  16. package/dist/chunks/{modal-4vYSSbAa.js → modal-QGp5CjB9.js} +4 -4
  17. package/dist/chunks/{modal-4vYSSbAa.js.map → modal-QGp5CjB9.js.map} +1 -1
  18. package/dist/chunks/{multi-select-r0ekR6Bh.js → multi-select-DkfdFYm4.js} +2 -2
  19. package/dist/chunks/{multi-select-r0ekR6Bh.js.map → multi-select-DkfdFYm4.js.map} +1 -1
  20. package/dist/chunks/{table-BR2VqeEg.js → table-tBQ_FOs3.js} +2 -2
  21. package/dist/chunks/{table-BR2VqeEg.js.map → table-tBQ_FOs3.js.map} +1 -1
  22. package/dist/errors/index.js +1 -1
  23. package/dist/expandable-action-panel/index.js +1 -1
  24. package/dist/flex/FlexCenter.d.ts +4 -5
  25. package/dist/flex/FlexCenter.d.ts.map +1 -1
  26. package/dist/flex/FlexContainer.d.ts.map +1 -1
  27. package/dist/flex/FlexItem.d.ts.map +1 -1
  28. package/dist/flex/FlexSpacer.d.ts +3 -2
  29. package/dist/flex/FlexSpacer.d.ts.map +1 -1
  30. package/dist/flex/index.js +1 -1
  31. package/dist/flex/types.d.ts +5 -3
  32. package/dist/flex/types.d.ts.map +1 -1
  33. package/dist/flex/useFlexClasses.d.ts +4 -4
  34. package/dist/flex/useFlexClasses.d.ts.map +1 -1
  35. package/dist/grid/GridContainer.d.ts.map +1 -1
  36. package/dist/grid/index.js +1 -1
  37. package/dist/grid/types.d.ts +5 -3
  38. package/dist/grid/types.d.ts.map +1 -1
  39. package/dist/grid/useGridClasses.d.ts +3 -3
  40. package/dist/grid/useGridClasses.d.ts.map +1 -1
  41. package/dist/image/index.d.ts +14 -5
  42. package/dist/image/index.d.ts.map +1 -1
  43. package/dist/image/index.js +258 -254
  44. package/dist/image/index.js.map +1 -1
  45. package/dist/image/lib/buildImageSources.d.ts +4 -0
  46. package/dist/image/lib/buildImageSources.d.ts.map +1 -0
  47. package/dist/image/lib/buildImageSrcSet.d.ts +4 -0
  48. package/dist/image/lib/buildImageSrcSet.d.ts.map +1 -0
  49. package/dist/image/lib/getImageCropPreviewStyle.d.ts +9 -0
  50. package/dist/image/lib/getImageCropPreviewStyle.d.ts.map +1 -0
  51. package/dist/image/lib/getImageSelectionKey.d.ts +4 -0
  52. package/dist/image/lib/getImageSelectionKey.d.ts.map +1 -0
  53. package/dist/image/model/imageCropTypes.d.ts +35 -0
  54. package/dist/image/model/imageCropTypes.d.ts.map +1 -0
  55. package/dist/image/model/imageSelectionTypes.d.ts +53 -0
  56. package/dist/image/model/imageSelectionTypes.d.ts.map +1 -0
  57. package/dist/image/model/imageTypes.d.ts +41 -0
  58. package/dist/image/model/imageTypes.d.ts.map +1 -0
  59. package/dist/image/model/useImageSelectionState.d.ts +7 -0
  60. package/dist/image/model/useImageSelectionState.d.ts.map +1 -0
  61. package/dist/image/ui/ImageCropper.d.ts +6 -12
  62. package/dist/image/ui/ImageCropper.d.ts.map +1 -1
  63. package/dist/image/ui/ImagePlaceholder.d.ts +1 -2
  64. package/dist/image/ui/ImagePlaceholder.d.ts.map +1 -1
  65. package/dist/image/ui/ImageRenderer.d.ts +8 -7
  66. package/dist/image/ui/ImageRenderer.d.ts.map +1 -1
  67. package/dist/image/ui/ImageSelectionFields.d.ts +8 -0
  68. package/dist/image/ui/ImageSelectionFields.d.ts.map +1 -0
  69. package/dist/image/ui/ImageSelectionModal.d.ts +4 -0
  70. package/dist/image/ui/ImageSelectionModal.d.ts.map +1 -0
  71. package/dist/image/ui/ImageSelectionPanel.d.ts +4 -0
  72. package/dist/image/ui/ImageSelectionPanel.d.ts.map +1 -0
  73. package/dist/image/ui/ImageView.d.ts +8 -35
  74. package/dist/image/ui/ImageView.d.ts.map +1 -1
  75. package/dist/list/index.js +2 -2
  76. package/dist/misc/index.js +1 -1
  77. package/dist/modal/index.js +1 -1
  78. package/dist/multi-select/index.js +1 -1
  79. package/dist/notifications/index.js +1 -1
  80. package/dist/preset-range-date-input/index.js +1 -1
  81. package/dist/simple-table/index.js +1 -1
  82. package/dist/table/index.js +1 -1
  83. package/dist/tabs/index.js +1 -1
  84. package/dist/text-editor/index.js +2 -2
  85. package/dist/toolbar/index.js +2 -2
  86. package/dist/tree-table/index.js +1 -1
  87. package/package.json +1 -1
  88. package/storybook-static/assets/{Badge-BJuMBcdz.js → Badge-DhbMuuXm.js} +1 -1
  89. package/storybook-static/assets/{Badge.stories-IgBcw1Cf.js → Badge.stories-Cn2OwyNl.js} +1 -1
  90. package/storybook-static/assets/{Button-B_GEc_r4.js → Button-BCO6drLh.js} +1 -1
  91. package/storybook-static/assets/{Button-DRBTSyRM.js → Button-CK0YS5UI.js} +1 -1
  92. package/storybook-static/assets/{Button.stories-Di4OQvY8.js → Button.stories-PvBecpMR.js} +1 -1
  93. package/storybook-static/assets/{CheckBox-WHmt7FbU.js → CheckBox-CH7PEkzn.js} +1 -1
  94. package/storybook-static/assets/{CheckBox-57qzcUkX.js → CheckBox-DgMj1d8n.js} +1 -1
  95. package/storybook-static/assets/{CheckBox.stories-BItLovUs.js → CheckBox.stories-D6ItCkPg.js} +1 -1
  96. package/storybook-static/assets/{Color-KMSTOMOX-CWP56kfm.js → Color-KMSTOMOX-GfidB0cg.js} +1 -1
  97. package/storybook-static/assets/{ContextMenu-DKl_ZfMI.js → ContextMenu-D3lrcJcF.js} +1 -1
  98. package/storybook-static/assets/{ContextMenu.stories-D-Xnld63.js → ContextMenu.stories-eH4W7mHM.js} +1 -1
  99. package/storybook-static/assets/{DateInput-BSyYH-et.js → DateInput-B1DsTxcV.js} +1 -1
  100. package/storybook-static/assets/{DateInput-B2X74zQf.js → DateInput-BlmssZge.js} +1 -1
  101. package/storybook-static/assets/{DateInput.stories-Dwk-9ZjA.js → DateInput.stories-CXftqoBw.js} +1 -1
  102. package/storybook-static/assets/{DateRangePresetSelect-CPeX_HRn.js → DateRangePresetSelect-CL0hlHRZ.js} +1 -1
  103. package/storybook-static/assets/{DateRangePresetSelect-DTSWmoT_.js → DateRangePresetSelect-DIrJMADf.js} +1 -1
  104. package/storybook-static/assets/{DateRangePresetSelect.stories-CGNvBg03.js → DateRangePresetSelect.stories-DcSm9soa.js} +1 -1
  105. package/storybook-static/assets/{Detail-BQwyVo2M.js → Detail-CoabkYcs.js} +1 -1
  106. package/storybook-static/assets/{Detail.stories-x4juDK19.js → Detail.stories-DQYXxRp4.js} +1 -1
  107. package/storybook-static/assets/{Dialog-CH9J4tmL.js → Dialog-BMqJ2cWE.js} +1 -1
  108. package/storybook-static/assets/{Dialog.stories-Cp3J86ce.js → Dialog.stories-UMGlcMlF.js} +1 -1
  109. package/storybook-static/assets/{Disclosure-B7i9P4YG.js → Disclosure-KB4xjsXl.js} +1 -1
  110. package/storybook-static/assets/{Disclosure.stories-DzZ5RLXm.js → Disclosure.stories-BebcX5Iz.js} +1 -1
  111. package/storybook-static/assets/{DocsRenderer-JROSPFPF-D61SC7UY.js → DocsRenderer-JROSPFPF-DuKHOivk.js} +2 -2
  112. package/storybook-static/assets/{DropZone-MiBUScxG.js → DropZone-nfS8G3Hn.js} +1 -1
  113. package/storybook-static/assets/{DropZone.stories-C2qhbfNj.js → DropZone.stories-CfXfUPEJ.js} +1 -1
  114. package/storybook-static/assets/{DropdownMenu-X7PLdfVp.js → DropdownMenu-DnrqkJwd.js} +1 -1
  115. package/storybook-static/assets/{ExpandableActionPanel.stories-Ca2AoCI0.js → ExpandableActionPanel.stories-BoiZuwQW.js} +1 -1
  116. package/storybook-static/assets/{Flex-BaD8FRom.js → Flex-CTKFA_mG.js} +1 -1
  117. package/storybook-static/assets/Flex-Cmb3839O.js +3 -0
  118. package/storybook-static/assets/{Flex.stories-F8YaKEO0.js → Flex.stories-CP95d38j.js} +1 -1
  119. package/storybook-static/assets/{Grid-BewDzBtv.js → Grid-DNKooHvc.js} +3 -3
  120. package/storybook-static/assets/{Grid-ZTR_R-m1.js → Grid-Xy7dV3bL.js} +1 -1
  121. package/storybook-static/assets/{Grid.stories-Cu78z_oE.js → Grid.stories-CzW_QizU.js} +1 -1
  122. package/storybook-static/assets/ImageCropper.stories-BTXQ94Gl.js +115 -0
  123. package/storybook-static/assets/ImageRenderer-BoaYYmBZ.js +2 -0
  124. package/storybook-static/assets/ImageRenderer.stories-BbzcY9qz.js +22 -0
  125. package/storybook-static/assets/ImageView.stories-BxeA_KDn.js +9 -0
  126. package/storybook-static/assets/{Input-D6z--4tm.js → Input-23s-lKOn.js} +1 -1
  127. package/storybook-static/assets/{Input-DjRjmBbJ.js → Input-E_LkqP6a.js} +1 -1
  128. package/storybook-static/assets/{Input.stories-CBkJ60Z3.js → Input.stories-uG22uEFU.js} +1 -1
  129. package/storybook-static/assets/{InputDateTime-B2V4I801.js → InputDateTime-zIw8NrCi.js} +1 -1
  130. package/storybook-static/assets/{InputDateTime.stories-gepL7zcB.js → InputDateTime.stories-CRyGwLn7.js} +1 -1
  131. package/storybook-static/assets/{InputFile-B_rtgdVs.js → InputFile-Dt4Qf9UO.js} +1 -1
  132. package/storybook-static/assets/{InputFile.stories-CVD-PTav.js → InputFile.stories-CVHdaQXL.js} +1 -1
  133. package/storybook-static/assets/{InputFiles-CFlxBgsw.js → InputFiles-BqrOxvD8.js} +1 -1
  134. package/storybook-static/assets/{InputFiles-Cy_fvMYT.js → InputFiles-Bwk_tH4A.js} +1 -1
  135. package/storybook-static/assets/{InputFiles.stories-DIbO_ACP.js → InputFiles.stories-eNwGWGc6.js} +1 -1
  136. package/storybook-static/assets/{InputImage-BWbT8pGH.js → InputImage-DpX3d6wQ.js} +1 -1
  137. package/storybook-static/assets/{InputImage.stories-SyFATair.js → InputImage.stories-DBYvsQrj.js} +1 -1
  138. package/storybook-static/assets/{LayoutPicker-0dJNS0bb.js → LayoutPicker-CfSu2g4Z.js} +1 -1
  139. package/storybook-static/assets/{LayoutPicker.stories-BUohHOWt.js → LayoutPicker.stories-D1lUyF06.js} +1 -1
  140. package/storybook-static/assets/{Listbox-Cn1Z-r2n.js → Listbox-uDkRdf67.js} +1 -1
  141. package/storybook-static/assets/{Listbox.stories-c1NSeGUa.js → Listbox.stories-6yyYujhd.js} +1 -1
  142. package/storybook-static/assets/{Modal-Db2Ne_PP.js → Modal-J42YPjEH.js} +1 -1
  143. package/storybook-static/assets/{Modal.stories-CZum1nVD.js → Modal.stories-Nmp6akCZ.js} +1 -1
  144. package/storybook-static/assets/{MultiSelect-D-r3_Bry.js → MultiSelect-BJGmqmIo.js} +1 -1
  145. package/storybook-static/assets/{MultiSelect-CkHso-Za.js → MultiSelect-UF351F4G.js} +1 -1
  146. package/storybook-static/assets/{MultiSelect.stories-CjNtbPvc.js → MultiSelect.stories-DkzP-YMA.js} +1 -1
  147. package/storybook-static/assets/{NotificationsHost-DcsexLl8.js → NotificationsHost-C7ZbgRdj.js} +1 -1
  148. package/storybook-static/assets/{NotificationsHost.stories-DxB9wp4P.js → NotificationsHost.stories-DtE5nY4I.js} +1 -1
  149. package/storybook-static/assets/{ODataMultiSelect-BB6pa_2a.js → ODataMultiSelect-A28BQBXe.js} +1 -1
  150. package/storybook-static/assets/{ODataMultiSelect.stories-D4108lSt.js → ODataMultiSelect.stories-CleaUAky.js} +1 -1
  151. package/storybook-static/assets/{ODataSelect-BcrPaLAR.js → ODataSelect-CgPTwZze.js} +1 -1
  152. package/storybook-static/assets/{ODataSelect-BppTAIqx.js → ODataSelect-CidLsWhU.js} +1 -1
  153. package/storybook-static/assets/{ODataSelect.stories-DteYVpiQ.js → ODataSelect.stories-CnjZKsYR.js} +1 -1
  154. package/storybook-static/assets/{ODataTreeMultiSelect-CVjcPuI1.js → ODataTreeMultiSelect-BcXe8UV0.js} +1 -1
  155. package/storybook-static/assets/{ODataTreeMultiSelect.stories-C6xU81uc.js → ODataTreeMultiSelect.stories-Cy6URpNZ.js} +1 -1
  156. package/storybook-static/assets/{ODataTreeSelect-BRHxD-vG.js → ODataTreeSelect-B79mkiqm.js} +1 -1
  157. package/storybook-static/assets/{ODataTreeSelect.stories-CyqwAaqI.js → ODataTreeSelect.stories-BmS9Kslk.js} +1 -1
  158. package/storybook-static/assets/{PeriodSelect-oi5rAN2N.js → PeriodSelect-Dvd_n0px.js} +1 -1
  159. package/storybook-static/assets/{PeriodSelect.stories-C7UftRku.js → PeriodSelect.stories-DeB7vL4v.js} +1 -1
  160. package/storybook-static/assets/{Popover-DFJPXALP.js → Popover-CF6lPz2I.js} +1 -1
  161. package/storybook-static/assets/{Popover.stories-DTNaGax4.js → Popover.stories-CxldfZVc.js} +1 -1
  162. package/storybook-static/assets/{PresetRangeDateInput-Cm4EbMNS.js → PresetRangeDateInput-CMkWDbAV.js} +1 -1
  163. package/storybook-static/assets/{PresetRangeDateInput.stories-Y5uojvsz.js → PresetRangeDateInput.stories-CNYGpwHh.js} +1 -1
  164. package/storybook-static/assets/{RadioButton-B1xWc03x.js → RadioButton-BhV-iR7A.js} +1 -1
  165. package/storybook-static/assets/{RadioButton.stories-CFZrSdeX.js → RadioButton.stories-BBGp713e.js} +1 -1
  166. package/storybook-static/assets/{RadioGroup-dt4vRt66.js → RadioGroup-CFQmZbmE.js} +1 -1
  167. package/storybook-static/assets/{RadioGroup-CRnLGdRq.js → RadioGroup-_xQT2nsR.js} +1 -1
  168. package/storybook-static/assets/{RadioGroup.stories-Cq8jrT3o.js → RadioGroup.stories-B20ktIVa.js} +1 -1
  169. package/storybook-static/assets/{Select-CWfg857u.js → Select-CXqDj36V.js} +1 -1
  170. package/storybook-static/assets/{Select-COzu9R1S.js → Select-jIsVhwD3.js} +1 -1
  171. package/storybook-static/assets/{Select.stories-ajlw6UD7.js → Select.stories-C0VB6D4d.js} +1 -1
  172. package/storybook-static/assets/{SelectOptionContent-5fpSAPpp.js → SelectOptionContent-COxwEiax.js} +1 -1
  173. package/storybook-static/assets/{SerializableSelect-D7k-0rpL.js → SerializableSelect-BPHsbeTD.js} +1 -1
  174. package/storybook-static/assets/{SerializableSelect-CtF_5hDV.js → SerializableSelect-J1rOw5PY.js} +1 -1
  175. package/storybook-static/assets/{SerializableSelect.stories-DXink3F3.js → SerializableSelect.stories-DsPARybj.js} +1 -1
  176. package/storybook-static/assets/{SingleDateTimeInput-CiZs4GCq.js → SingleDateTimeInput-BpQ4pLpY.js} +1 -1
  177. package/storybook-static/assets/{SingleDateTimeInput.stories-5QJlrw4f.js → SingleDateTimeInput.stories-iX__aO9q.js} +1 -1
  178. package/storybook-static/assets/{Slider-CxK-n_Qh.js → Slider-DBT0NGzG.js} +1 -1
  179. package/storybook-static/assets/{Slider.stories-B0tho-fR.js → Slider.stories-B2eK8XJA.js} +1 -1
  180. package/storybook-static/assets/{SliderInput-ZN9vpT2S.js → SliderInput-ChSw_jKg.js} +1 -1
  181. package/storybook-static/assets/{SliderInput.stories-B9oU6kyp.js → SliderInput.stories-Ydlqkpul.js} +1 -1
  182. package/storybook-static/assets/{Sortable-Cyr7iTZO.js → Sortable-BNdP7m0c.js} +1 -1
  183. package/storybook-static/assets/{Sortable.stories-BhF3AZgC.js → Sortable.stories-DN3EmT5j.js} +1 -1
  184. package/storybook-static/assets/{Splitter-peLMiwre.js → Splitter-CcmZ1RhL.js} +1 -1
  185. package/storybook-static/assets/{Splitter.stories-nr3eJ5GM.js → Splitter.stories-8_bdaQBx.js} +1 -1
  186. package/storybook-static/assets/{StateSelect-B_fxrXNN.js → StateSelect-b7_i5AYO.js} +1 -1
  187. package/storybook-static/assets/{StateSelect.stories-CDdWdRLe.js → StateSelect.stories-8HzaiOPq.js} +1 -1
  188. package/storybook-static/assets/{Switch-DM50QWxA.js → Switch-B6iIA_Sa.js} +1 -1
  189. package/storybook-static/assets/{Switch.stories-D5LjDVPS.js → Switch.stories-C0C1FC4S.js} +1 -1
  190. package/storybook-static/assets/{Table-5aluIGdo.js → Table-ClcldA-z.js} +1 -1
  191. package/storybook-static/assets/{Table.stories-DGKBAzL2.js → Table.stories-BiJfbbFS.js} +1 -1
  192. package/storybook-static/assets/{Tabs-CO7DsnUr.js → Tabs-SS9HB-vC.js} +1 -1
  193. package/storybook-static/assets/{Tabs.stories-DTgCMxUb.js → Tabs.stories-BRcexZE0.js} +1 -1
  194. package/storybook-static/assets/{Textarea-DSvLZptc.js → Textarea-DMbVI72I.js} +1 -1
  195. package/storybook-static/assets/{Textarea.stories-kqd0YbmQ.js → Textarea.stories-DSgmFgdA.js} +1 -1
  196. package/storybook-static/assets/{TimePanel-DDaX01do.js → TimePanel-AqEGPwAi.js} +1 -1
  197. package/storybook-static/assets/{TimePanel.stories-CerMQLRf.js → TimePanel.stories-C7GxLG8Y.js} +1 -1
  198. package/storybook-static/assets/{Toggle-t1lVxQz6.js → Toggle-BGonS5_k.js} +1 -1
  199. package/storybook-static/assets/{Toggle.stories-CeJwV-Ek.js → Toggle.stories-fg1rL2w5.js} +1 -1
  200. package/storybook-static/assets/{TreeMultiSelect-Cqt4O9BU.js → TreeMultiSelect-cfKLgsPQ.js} +1 -1
  201. package/storybook-static/assets/{TreeMultiSelect-D6Au72K2.js → TreeMultiSelect-m1Jc0UmH.js} +1 -1
  202. package/storybook-static/assets/{TreeMultiSelect.stories-C_BIcIv6.js → TreeMultiSelect.stories-CcoijQYD.js} +1 -1
  203. package/storybook-static/assets/{TreePickerBase-DLVYUhCD.js → TreePickerBase-D8LeBNby.js} +1 -1
  204. package/storybook-static/assets/{TreeSelect-CIWXiLSp.js → TreeSelect-CLrdAJA-.js} +1 -1
  205. package/storybook-static/assets/{TreeSelect-CgDLk4ka.js → TreeSelect-CYJ5zvKm.js} +1 -1
  206. package/storybook-static/assets/{TreeSelect.stories-DJJQpAG-.js → TreeSelect.stories-C_uly8NB.js} +1 -1
  207. package/storybook-static/assets/{TreeTable-6VwdbiOA.js → TreeTable-CPTxegC1.js} +1 -1
  208. package/storybook-static/assets/{TreeTable.stories-CexcAFDG.js → TreeTable.stories-BjUwwZjp.js} +1 -1
  209. package/storybook-static/assets/{WithTooltip-7X4HQR7L-CceOi7V4.js → WithTooltip-7X4HQR7L-CUFIZPaf.js} +1 -1
  210. package/storybook-static/assets/{base-table-C0Zyxki6.js → base-table-cOtSkLXv.js} +1 -1
  211. package/storybook-static/assets/{blocks-CcO3Y_Rh.js → blocks-Ca82jrBU.js} +6 -6
  212. package/storybook-static/assets/{button-0yIdCp_-.js → button-BFuY_BqY.js} +1 -1
  213. package/storybook-static/assets/{check-box-vfk8jzFK.js → check-box-CmlDA0Xq.js} +1 -1
  214. package/storybook-static/assets/{chunk-3LY4VQVK-CZm0s4iL.js → chunk-3LY4VQVK-CDA9ib8M.js} +1 -1
  215. package/storybook-static/assets/{chunk-LITCR56V-C1XleE0V.js → chunk-LITCR56V-Mcli8zWg.js} +1 -1
  216. package/storybook-static/assets/{contextMenu-DJTYsh3u.js → contextMenu-BJxw-pJj.js} +1 -1
  217. package/storybook-static/assets/{error-7f4bI5b8.js → error-BwxipWa_.js} +1 -1
  218. package/storybook-static/assets/flex-BPTt9N_D.js +1 -0
  219. package/storybook-static/assets/{floating-ui.react-C-t718F2.js → floating-ui.react-CA8LXveu.js} +1 -1
  220. package/storybook-static/assets/formatter-L2YTDE3Q-CiF3j9Xe.js +1 -0
  221. package/storybook-static/assets/{formatters-c68ZHiVV.js → formatters-BSZSiQe7.js} +1 -1
  222. package/storybook-static/assets/grid-C5nOHfpH.js +1 -0
  223. package/storybook-static/assets/{hooks-Cia2yw95.js → hooks-rW6LwSJF.js} +1 -1
  224. package/storybook-static/assets/{iframe-B1ZJmGrq.js → iframe-DBBiRbws.js} +4 -4
  225. package/storybook-static/assets/{input-Bfb8MLis.js → input-DQGrA_Iz.js} +1 -1
  226. package/storybook-static/assets/{lucide-react-Cw6QPvVA.js → lucide-react-DbhedXaa.js} +1 -1
  227. package/storybook-static/assets/{mdx-react-shim-BGEl8pi6.js → mdx-react-shim-B-pYVQSG.js} +1 -1
  228. package/storybook-static/assets/{media-DsA0K_ZS.js → media-D2fdlN5C.js} +1 -1
  229. package/storybook-static/assets/{misc-zL4hFipW.js → misc-B5Fq527b.js} +1 -1
  230. package/storybook-static/assets/{notifications-BYXcjAgk.js → notifications-CdinTHBe.js} +1 -1
  231. package/storybook-static/assets/{odata-CZ14RE2x.js → odata-CpEOYNKi.js} +1 -1
  232. package/storybook-static/assets/odata-service-C0Syx7b6.js +1 -0
  233. package/storybook-static/assets/{odataStoryFixtures-Cv8XAuzz.js → odataStoryFixtures-dUEdLQNZ.js} +1 -1
  234. package/storybook-static/assets/{picker-DBhG__oJ.js → picker-Cuzrli2L.js} +1 -1
  235. package/storybook-static/assets/{popover-CahYWIfo.js → popover-BiSsB8FW.js} +1 -1
  236. package/storybook-static/assets/{preset-select-C5XCvtZE.js → preset-select-VPhuOafv.js} +1 -1
  237. package/storybook-static/assets/{react-18-BpKMg-Cr.js → react-18-Dj98SmrN.js} +1 -1
  238. package/storybook-static/assets/{react-DzMAKl9o.js → react-BuNie9Jj.js} +1 -1
  239. package/storybook-static/assets/{react-dom-BfFG7H_X.js → react-dom-H_XMZTBP.js} +1 -1
  240. package/storybook-static/assets/select-C0acjPk-.js +1 -0
  241. package/storybook-static/assets/{slider-CWiv9HFe.js → slider-DJkr9biy.js} +1 -1
  242. package/storybook-static/assets/{sortable-D_PcZ-1o.js → sortable-Wp4NkSxC.js} +1 -1
  243. package/storybook-static/assets/{syntaxhighlighter-RTCFPKCB-DatthS1s.js → syntaxhighlighter-RTCFPKCB-Bmk5Bc5f.js} +1 -1
  244. package/storybook-static/assets/{text-6oBGbhcX.js → text-TQB-LeS7.js} +1 -1
  245. package/storybook-static/assets/{theming-c9hibVvV.js → theming-BSLvozk8.js} +1 -1
  246. package/storybook-static/assets/ui-DaejdOMA.js +1 -0
  247. package/storybook-static/assets/{useODataSelectBase-BP43aYQp.js → useODataSelectBase-DTU8LMxW.js} +1 -1
  248. package/storybook-static/assets/{useODataTreeData-D-13yhFk.js → useODataTreeData-BIA97pbg.js} +1 -1
  249. package/storybook-static/assets/{utils-B7W0zPTP.js → utils-CJ9XKy2b.js} +1 -1
  250. package/storybook-static/iframe.html +1 -1
  251. package/storybook-static/index.json +1 -1
  252. package/storybook-static/project.json +1 -1
  253. package/dist/chunks/flex-CPO6xlPR.js.map +0 -1
  254. package/dist/chunks/grid-ByIIytjh.js.map +0 -1
  255. package/dist/image/ui/ImageSelection.d.ts +0 -40
  256. package/dist/image/ui/ImageSelection.d.ts.map +0 -1
  257. package/storybook-static/assets/Flex-CML6WrKV.js +0 -3
  258. package/storybook-static/assets/flex-fN9xAXRx.js +0 -1
  259. package/storybook-static/assets/formatter-L2YTDE3Q-BYPWeXB6.js +0 -1
  260. package/storybook-static/assets/grid-DnGlfdqF.js +0 -1
  261. package/storybook-static/assets/odata-service-FtP1kYQx.js +0 -1
  262. package/storybook-static/assets/select-C1fXLf5x.js +0 -1
  263. package/storybook-static/assets/ui-Cq8WdcMq.js +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"badge-BfbLPk0z.js","names":[],"sources":["../../src/badge/Badge.module.scss","../../src/badge/Badge.tsx","../../src/badge/BadgeList.tsx"],"sourcesContent":["@use \"@/styles/mixins\" as *;\n\n.badge {\n\t@include ui-static-surface;\n\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: var(--space-xs);\n\tmax-width: 100%;\n\tpadding: 0 var(--space-xs);\n\n\tfont-weight: 500;\n\tfont-variation-settings: \"wght\" 500;\n\tvertical-align: middle;\n}\n\n.passive {\n\tpointer-events: none;\n\tuser-select: none;\n}\n\n.sizeXs {\n\tfont-size: var(--font-size-xs);\n}\n\n.sizeSm {\n\tfont-size: var(--font-size-sm);\n}\n\n.sizeMd {\n\tfont-size: var(--font-size-md);\n}\n\n.sizeLg {\n\tfont-size: var(--font-size-lg);\n}\n\n.sizeXl {\n\tfont-size: var(--font-size-xl);\n}\n\n.content {\n\tmin-width: 0;\n}\n\n.removeButton {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tflex-shrink: 0;\n\twidth: 1.25em;\n\theight: 1.25em;\n\tpadding: 0;\n\tborder: none;\n\tborder-radius: var(--radius-xs);\n\tbackground: transparent;\n\tcolor: inherit;\n\ttransition:\n\t\tcolor var(--transition-fast) ease,\n\t\tbackground-color var(--transition-fast) ease,\n\t\tscale var(--transition-fast) ease;\n\n\t&:hover {\n\t\tbackground-color: var(--status-error-soft);\n\t\tcolor: var(--status-error-text);\n\t\tscale: 1.1;\n\t}\n\n\t&:focus-visible {\n\t\t@include focusVisible;\n\t}\n\n\tsvg {\n\t\tdisplay: block;\n\t}\n}\n","import { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { XIcon } from \"lucide-react\";\n\nimport { TextOverflow } from \"../text\";\nimport { getUiAppearanceClassName, getUiToneClassName, resolveUiScheme } from \"../uiClasses\";\n\nimport styles from \"./Badge.module.scss\";\n\nimport type { UiAppearance, UiSize, UiTone } from \"../types\";\n\ntype BadgeSize = UiSize;\ntype BadgeAppearance = UiAppearance;\n\ntype BadgeProps = {\n\tchildren: string | number;\n\tsize?: BadgeSize;\n\ttone?: UiTone;\n\tappearance?: BadgeAppearance;\n\tclassName?: string;\n\tonRemove?: () => void;\n};\n\nconst sizeClasses: Record<BadgeSize, string> = {\n\txs: styles.sizeXs,\n\tsm: styles.sizeSm,\n\tmd: styles.sizeMd,\n\tlg: styles.sizeLg,\n\txl: styles.sizeXl\n};\n\n/**\n * Компактный индикатор для статусов, категорий и коротких служебных меток.\n */\nexport function Badge({ children, size = \"sm\", tone, appearance, className, onRemove }: BadgeProps) {\n\tconst fallbackTone = tone ?? \"neutral\";\n\tconst fallbackAppearance = fallbackTone !== \"neutral\" ? \"solid\" : \"outline\";\n\tconst scheme = resolveUiScheme({\n\t\ttone,\n\t\tappearance,\n\t\tfallbackTone,\n\t\tfallbackAppearance\n\t});\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\tstyles.badge,\n\t\t\t\tsizeClasses[size],\n\t\t\t\tgetUiToneClassName(scheme.tone),\n\t\t\t\tgetUiAppearanceClassName(scheme.appearance),\n\t\t\t\t!onRemove && styles.passive,\n\t\t\t\tclassName\n\t\t\t)}>\n\t\t\t<TextOverflow maxChar={25} placement=\"top\" block textWrapProps={{ className: styles.content }}>\n\t\t\t\t{String(children)}\n\t\t\t</TextOverflow>\n\t\t\t{onRemove && (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={onRemove}\n\t\t\t\t\tclassName={styles.removeButton}\n\t\t\t\t\taria-label=\"Удалить бейдж\"\n\t\t\t\t\tdata-ui=\"badge-remove-button\"\n\t\t\t\t\tdata-action=\"remove-badge\">\n\t\t\t\t\t<XIcon />\n\t\t\t\t</button>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { Children, Fragment, ReactElement } from \"react\";\n\nimport { FlexContainer } from \"../flex\";\n\nimport { Badge } from \"./Badge\";\n\ninterface BadgeListProps {\n\tchildren: ReactElement<typeof Badge | null | undefined | false>[];\n}\n\n/**\n * Контейнер для группы `Badge`, который выстраивает элементы в единый список с предсказуемыми отступами. Используется для компактного вывода набора меток или фильтров.\n */\nexport function BadgeList({ children }: BadgeListProps) {\n\treturn (\n\t\t<FlexContainer inline wrap gap=\"sm\" align=\"baseline\">\n\t\t\t{Children.map(children, (badge, index) => (\n\t\t\t\t<Fragment key={index}>{badge}</Fragment>\n\t\t\t))}\n\t\t</FlexContainer>\n\t);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;GCsBM,IAAyC;CAC9C,IAAI,EAAO;CACX,IAAI,EAAO;CACX,IAAI,EAAO;CACX,IAAI,EAAO;CACX,IAAI,EAAO;AACZ;AAKA,SAAgB,EAAM,EAAE,aAAU,UAAO,MAAM,SAAM,eAAY,cAAW,eAAwB;CACnG,IAAM,IAAe,KAAQ,WAEvB,IAAS,EAAgB;EAC9B;EACA;EACA;EACA,oBAL0B,MAAiB,YAAsB,YAAV;CAMxD,CAAC;CAED,OACC,kBAAC,OAAD;EACC,WAAW,EACV,EAAO,OACP,EAAY,IACZ,EAAmB,EAAO,IAAI,GAC9B,EAAyB,EAAO,UAAU,GAC1C,CAAC,KAAY,EAAO,SACpB,CACD;YARD,CASC,kBAAC,GAAD;GAAc,SAAS;GAAI,WAAU;GAAM,OAAA;GAAM,eAAe,EAAE,WAAW,EAAO,QAAQ;aAC1F,OAAO,CAAQ;EACH,CAAA,GACb,KACA,kBAAC,UAAD;GACC,MAAK;GACL,SAAS;GACT,WAAW,EAAO;GAClB,cAAW;GACX,WAAQ;GACR,eAAY;aACZ,kBAAC,GAAD,CAAQ,CAAA;EACD,CAAA,CAEL;;AAEP;;;ACxDA,SAAgB,EAAU,EAAE,eAA4B;CACvD,OACC,kBAAC,GAAD;EAAe,QAAA;EAAO,MAAA;EAAK,KAAI;EAAK,OAAM;YACxC,EAAS,IAAI,IAAW,GAAO,MAC/B,kBAAC,GAAD,EAAA,UAAuB,EAAgB,GAAxB,CAAwB,CACvC;CACa,CAAA;AAEjB"}
1
+ {"version":3,"file":"badge-Cri0-kVK.js","names":[],"sources":["../../src/badge/Badge.module.scss","../../src/badge/Badge.tsx","../../src/badge/BadgeList.tsx"],"sourcesContent":["@use \"@/styles/mixins\" as *;\n\n.badge {\n\t@include ui-static-surface;\n\n\tdisplay: inline-flex;\n\talign-items: center;\n\tgap: var(--space-xs);\n\tmax-width: 100%;\n\tpadding: 0 var(--space-xs);\n\n\tfont-weight: 500;\n\tfont-variation-settings: \"wght\" 500;\n\tvertical-align: middle;\n}\n\n.passive {\n\tpointer-events: none;\n\tuser-select: none;\n}\n\n.sizeXs {\n\tfont-size: var(--font-size-xs);\n}\n\n.sizeSm {\n\tfont-size: var(--font-size-sm);\n}\n\n.sizeMd {\n\tfont-size: var(--font-size-md);\n}\n\n.sizeLg {\n\tfont-size: var(--font-size-lg);\n}\n\n.sizeXl {\n\tfont-size: var(--font-size-xl);\n}\n\n.content {\n\tmin-width: 0;\n}\n\n.removeButton {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tflex-shrink: 0;\n\twidth: 1.25em;\n\theight: 1.25em;\n\tpadding: 0;\n\tborder: none;\n\tborder-radius: var(--radius-xs);\n\tbackground: transparent;\n\tcolor: inherit;\n\ttransition:\n\t\tcolor var(--transition-fast) ease,\n\t\tbackground-color var(--transition-fast) ease,\n\t\tscale var(--transition-fast) ease;\n\n\t&:hover {\n\t\tbackground-color: var(--status-error-soft);\n\t\tcolor: var(--status-error-text);\n\t\tscale: 1.1;\n\t}\n\n\t&:focus-visible {\n\t\t@include focusVisible;\n\t}\n\n\tsvg {\n\t\tdisplay: block;\n\t}\n}\n","import { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\nimport { XIcon } from \"lucide-react\";\n\nimport { TextOverflow } from \"../text\";\nimport { getUiAppearanceClassName, getUiToneClassName, resolveUiScheme } from \"../uiClasses\";\n\nimport styles from \"./Badge.module.scss\";\n\nimport type { UiAppearance, UiSize, UiTone } from \"../types\";\n\ntype BadgeSize = UiSize;\ntype BadgeAppearance = UiAppearance;\n\ntype BadgeProps = {\n\tchildren: string | number;\n\tsize?: BadgeSize;\n\ttone?: UiTone;\n\tappearance?: BadgeAppearance;\n\tclassName?: string;\n\tonRemove?: () => void;\n};\n\nconst sizeClasses: Record<BadgeSize, string> = {\n\txs: styles.sizeXs,\n\tsm: styles.sizeSm,\n\tmd: styles.sizeMd,\n\tlg: styles.sizeLg,\n\txl: styles.sizeXl\n};\n\n/**\n * Компактный индикатор для статусов, категорий и коротких служебных меток.\n */\nexport function Badge({ children, size = \"sm\", tone, appearance, className, onRemove }: BadgeProps) {\n\tconst fallbackTone = tone ?? \"neutral\";\n\tconst fallbackAppearance = fallbackTone !== \"neutral\" ? \"solid\" : \"outline\";\n\tconst scheme = resolveUiScheme({\n\t\ttone,\n\t\tappearance,\n\t\tfallbackTone,\n\t\tfallbackAppearance\n\t});\n\n\treturn (\n\t\t<div\n\t\t\tclassName={cn(\n\t\t\t\tstyles.badge,\n\t\t\t\tsizeClasses[size],\n\t\t\t\tgetUiToneClassName(scheme.tone),\n\t\t\t\tgetUiAppearanceClassName(scheme.appearance),\n\t\t\t\t!onRemove && styles.passive,\n\t\t\t\tclassName\n\t\t\t)}>\n\t\t\t<TextOverflow maxChar={25} placement=\"top\" block textWrapProps={{ className: styles.content }}>\n\t\t\t\t{String(children)}\n\t\t\t</TextOverflow>\n\t\t\t{onRemove && (\n\t\t\t\t<button\n\t\t\t\t\ttype=\"button\"\n\t\t\t\t\tonClick={onRemove}\n\t\t\t\t\tclassName={styles.removeButton}\n\t\t\t\t\taria-label=\"Удалить бейдж\"\n\t\t\t\t\tdata-ui=\"badge-remove-button\"\n\t\t\t\t\tdata-action=\"remove-badge\">\n\t\t\t\t\t<XIcon />\n\t\t\t\t</button>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","import { Children, Fragment, ReactElement } from \"react\";\n\nimport { FlexContainer } from \"../flex\";\n\nimport { Badge } from \"./Badge\";\n\ninterface BadgeListProps {\n\tchildren: ReactElement<typeof Badge | null | undefined | false>[];\n}\n\n/**\n * Контейнер для группы `Badge`, который выстраивает элементы в единый список с предсказуемыми отступами. Используется для компактного вывода набора меток или фильтров.\n */\nexport function BadgeList({ children }: BadgeListProps) {\n\treturn (\n\t\t<FlexContainer inline wrap gap=\"sm\" align=\"baseline\">\n\t\t\t{Children.map(children, (badge, index) => (\n\t\t\t\t<Fragment key={index}>{badge}</Fragment>\n\t\t\t))}\n\t\t</FlexContainer>\n\t);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;GCsBM,IAAyC;CAC9C,IAAI,EAAO;CACX,IAAI,EAAO;CACX,IAAI,EAAO;CACX,IAAI,EAAO;CACX,IAAI,EAAO;AACZ;AAKA,SAAgB,EAAM,EAAE,aAAU,UAAO,MAAM,SAAM,eAAY,cAAW,eAAwB;CACnG,IAAM,IAAe,KAAQ,WAEvB,IAAS,EAAgB;EAC9B;EACA;EACA;EACA,oBAL0B,MAAiB,YAAsB,YAAV;CAMxD,CAAC;CAED,OACC,kBAAC,OAAD;EACC,WAAW,EACV,EAAO,OACP,EAAY,IACZ,EAAmB,EAAO,IAAI,GAC9B,EAAyB,EAAO,UAAU,GAC1C,CAAC,KAAY,EAAO,SACpB,CACD;YARD,CASC,kBAAC,GAAD;GAAc,SAAS;GAAI,WAAU;GAAM,OAAA;GAAM,eAAe,EAAE,WAAW,EAAO,QAAQ;aAC1F,OAAO,CAAQ;EACH,CAAA,GACb,KACA,kBAAC,UAAD;GACC,MAAK;GACL,SAAS;GACT,WAAW,EAAO;GAClB,cAAW;GACX,WAAQ;GACR,eAAY;aACZ,kBAAC,GAAD,CAAQ,CAAA;EACD,CAAA,CAEL;;AAEP;;;ACxDA,SAAgB,EAAU,EAAE,eAA4B;CACvD,OACC,kBAAC,GAAD;EAAe,QAAA;EAAO,MAAA;EAAK,KAAI;EAAK,OAAM;YACxC,EAAS,IAAI,IAAW,GAAO,MAC/B,kBAAC,GAAD,EAAA,UAAuB,EAAgB,GAAxB,CAAwB,CACvC;CACa,CAAA;AAEjB"}
@@ -1,5 +1,5 @@
1
- import { r as e } from "./grid-ByIIytjh.js";
2
- import { c as t, d as n, h as r, i } from "./misc-1PxS8OWD.js";
1
+ import { r as e } from "./grid-dI94AAbi.js";
2
+ import { c as t, d as n, h as r, i } from "./misc-ClXJygTj.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-CiYSRI_J.js.map
514
+ //# sourceMappingURL=base-table-DghNJ6ss.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"base-table-CiYSRI_J.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":";;;;;;;;;;;;;;;AA0CA,SAAgB,EAA4B,GAAsE;CACjH,OAAO;EACN,MAAM,MAAM,KACX,IAAI,KACF,GAAO,QAAQ,CAAC,EAAA,CAAG,QAAQ,MAAiC,OAAO,KAAa,YAAY,EAAS,KAAK,CAAC,CAAC,SAAS,CAAC,CACxH,CACD;EACA,OAAO,CAAC;CACT;AACD;AAKA,SAAgB,EACf,GACA,GACS;CACT,IAAM,IAAe,IAAe,EAAO;CAC3C,IAAI,OAAO,KAAiB,YAAY,OAAO,SAAS,CAAY,KAAK,IAAe,GACvF,OAAO,GAAG,KAAK,MAAM,CAAY,EAAE;CAKpC,IAAI,IAFS,EAAmB,EAAO,SAE3B,CAAA,EAAM,SAAS;CAM3B,OAJI,OAAO,KAAU,aACpB,IAAQ,KAAK,IAAI,GAAO,CAAC,IAGnB,EAAmB,CAAK;AAChC;AASA,SAAgB,EACf,GACA,GAC2B;CAC3B,IAAM,IAAiB,EAAM,kBAAkB,CAAC,CAAC,QAAQ,MAAW,EAAO,aAAa,CAAC,GACnF,IAAa,IAAI,IAAI,EAAe,KAAK,MAAW,CAAC,EAAO,IAAI,CAAM,CAAC,CAAC,GACxE,IAAmB,EAAe,KAAK,MAAW,EAAO,EAAE,GAC3D,IAAU,EAAwB,EAAY,cAAc,MAAM,CAAgB,GAClF,IAAW,EAAwB,EAAY,cAAc,OAAO,CAAgB,GACpF,oBAAY,IAAI,IAAI,CAAC,GAAG,GAAS,GAAG,CAAQ,CAAC,GAC7C,IAAsB,CAAC;CAE7B,KAAK,IAAM,KAAU,GACpB,AAAK,EAAU,IAAI,EAAO,EAAE,KAC3B,EAAU,KAAK,EAAO,EAAE;CAI1B,IAAM,IAAmB,EAAwB;EAChD,KAAK;EACL,OAAO,EAAY;CACpB,CAAC;CAED,OAAO,GAAsB;EAAC,GAAG;EAAS,GAAG;EAAkB,GAAG;CAAQ,GAAG,CAAU;AACxF;AAEA,SAAgB,EACf,GACA,GACqC;CACrC,IAAM,IAAU,EAA6B,GAAO,CAAW,GACzD,IAAa,IAAI,IAAI,EAAQ,KAAK,MAAW,CAAC,EAAO,IAAI,CAAM,CAAC,CAAC;CAEvE,OAAO,EAAuB;EAC7B,KAAK,EAAQ,KAAK,MAAW,EAAO,EAAE;EACtC,WAAW,MAAO;GACjB,IAAM,IAAS,EAAW,IAAI,CAAE;GAChC,OAAO,IAAS,EAA4B,GAAQ,EAAY,YAAY,IAAI;EACjF;CACD,CAAC,CAAC,CAAC,SAAS,MAAS;EACpB,IAAM,IAAS,EAAW,IAAI,EAAK,EAAE;EAErC,OAAO,IACJ,CACA;GACC,GAAG;GACH;EACD,CACD,IACC,CAAC;CACL,CAAC;AACF;AAOA,SAAgB,GACf,GACA,GACmC;CACnC,IAAM,IAAkC,CAAC,GACnC,IAA8B,CAAC;CAErC,KAAK,IAAM,KAAU,EAA6B,GAAO,CAAW,GAC/D,EAAO,YAAY,MAAM,WAE7B,EAAQ,EAAO,MAAM,EAAkB,CAAiB,GACxD,EAAkB,KAAK,EAA4B,GAAQ,EAAY,YAAY,CAAC;CAGrF,OAAO;AACR;AAKA,SAAS,EAAkB,GAAoC;CAS9D,OARI,EAAQ,WAAW,IACf,QAGJ,EAAQ,WAAW,IACf,EAAQ,KAGT,QAAQ,EAAQ,KAAK,KAAK,EAAE;AACpC;;;AC5IA,SAAgB,EAAqD,GAAmD;CACvH,IAAI,OAAO,EAAO,MAAO,YAAY,EAAO,GAAG,KAAK,GACnD,OAAO,EAAO;CAGf,IAAI,iBAAiB,KAAU,OAAO,EAAO,eAAgB,YAAY,EAAO,YAAY,KAAK,GAChG,OAAO,EAAO;AAIhB;AAKA,SAAgB,EAAuD,GAAwC;CAC9G,OAAO,UAAU,KAAU,EAAO,QAAQ;AAC3C;AAKA,SAAS,EACR,GACA,GACO;CACP,KAAK,IAAM,KAAU,GAAS;EAC7B,IAAI,aAAa,KAAU,MAAM,QAAQ,EAAO,OAAO,KAAK,EAAO,QAAQ,SAAS,GAAG;GACtF,EAAsB,EAAO,SAAoC,CAAO;GACxE;EACD;EAEA,EAAQ,CAAM;CACf;AACD;AAKA,SAAgB,EAAmD,GAAoE;CACtI,IAAM,IAAuE,CAAC,GACxE,oBAAsB,IAAI,IAAY;CAyB5C,OAvBA,EAAsB,IAAU,MAAW;EAC1C,IAAM,IAAW,EAA+B,CAAM;EACtD,IAAI,CAAC,GACJ;EAGD,AAAI,EAAiC,CAAM,KAC1C,EAAoB,IAAI,CAAQ;EAGjC,IAAM,IAAa,EAA6B,CAAM;EACjD,MAIL,EAAqB,KAAY;GAChC,GAAG;GACH,IAAI,EAAW,MAAM;GACrB,MAAM,EAAW,QAAQ;GACzB,MAAM,EAAW,QAAQ;EAC1B;CACD,CAAC,GAEM;EACN,mBAAmB,EAAuC,CAAoB;EAC9E;CACD;AACD;AAKA,SAAgB,EAAyB,GAI7B;CAKX,OAJI,EAAK,oBAAoB,IAAI,EAAK,QAAQ,IACtC,KAGD,EAAQ,EAAK,kBAAkB,EAAK;AAC5C;;;ACnFA,SAAS,EAAiB,GAAyB;CAClD,OAAO,KAAU,QAA+B,MAAU;AAC3D;AAEA,SAAS,EACR,GACA,GACgC;CAChC,OAAO,EAAK,KAAK,OAAS;EACzB;EACA,aAAa,EAAsB,CAAG;EACtC,gBAAgB,IAAI,IAAI,EAAI,gBAAgB,CAAC,CAAC,KAAK,MAAS,CAAC,EAAK,OAAO,IAAI,CAAI,CAAC,CAAC;CACpF,EAAE;AACH;AAQA,SAAgB,EAAsD,EACrE,SACA,YACA,iCAA8B,gBAC9B,uBACuE;CACvE,IAAM,IAAmB,EAAQ,QAAQ,MACpC,GAAkB,IAAI,EAAO,EAAE,IAC3B,KAGD,EAAmB,EAAO,SAAS,CAAC,EAAE,oBAAoB,EACjE;CAED,IAAI,EAAK,WAAW,KAAK,EAAiB,WAAW,GACpD,uBAAO,IAAI,IAAI;CAGhB,IAAM,IAAa,EAA2B,GAAM,CAAqB,GACnE,oBAAiB,IAAI,IAAiC;CAE5D,KAAK,IAAM,KAAU,GAAkB;EACtC,IAAI,IAAkB,IAClB,GACA,GAEE,KAAiB,MAA8B;GAChD,UAAoB,IAKxB;QADkB,IAAoB,KACrB,GAAG;KAGnB,AAFA,IAAkB,IAClB,IAAa,KAAA,GACb,IAAmB,KAAA;KACnB;IACD;IAEA,KAAK,IAAI,IAAQ,GAAiB,IAAQ,GAAmB,KAAS,GAAG;KACxE,IAAM,IAAS,EAAW,EAAM,EAAE,eAAe,IAAI,EAAO,EAAE,CAAC,EAAE;KACjE,AAAI,KACH,EAAe,IAAI,GAAQ;MAC1B,aAAa,IAAQ;MACrB,eAAe,IAAQ,IAAoB;KAC5C,CAAC;IAEH;IAIA,AAFA,IAAkB,IAClB,IAAa,KAAA,GACb,IAAmB,KAAA;GAdnB;EAeD;EAEA,KAAK,IAAI,IAAQ,GAAG,IAAQ,EAAW,QAAQ,KAAS,GAAG;GAC1D,IAAM,IAAa,EAAW,IACxB,IAAc,GAAY,eAAe,IAAI,EAAO,EAAE,GACtD,IAAe,GAAa,SAAS;GAE3C,IAAI,CAAC,KAAe,CAAC,EAAiB,CAAY,GAAG;IACpD,EAAc,CAAK;IACnB;GACD;GAEA,IAAI,MAAoB,IAAI;IAG3B,AAFA,IAAkB,GAClB,IAAa,GACb,IAAmB,GAAY;IAC/B;GACD;GAEA,CAAI,CAAC,OAAO,GAAG,GAAkB,GAAY,WAAW,KAAK,CAAC,OAAO,GAAG,GAAY,CAAY,OAC/F,EAAc,CAAK,GACnB,IAAkB,GAClB,IAAa,GACb,IAAmB,GAAY;EAEjC;EAEA,EAAc,EAAW,MAAM;CAChC;CAEA,OAAO;AACR;;;ACjGA,SAAgB,EAAoB,EACnC,gBACA,uBACA,0BACsD;CACtD,IAAM,CAAC,GAAyB,KAA8B,EAA4C,KAAA,CAAS,GAC7G,IAAsB,QACrB,EAA0B,KAAe,KAA2B,CAAkB,GAC5F;EAAC;EAAa;EAAoB;CAAuB,CAC1D;CAeA,OAAO;EACN,aAAa;EACb,qBAf+B,GAC9B,MAAuC;GACvC,IAAM,IAAkB,EAA0B,EAAiB,GAAS,CAAmB,CAAC;GAMhG,AAJI,MAAgB,KAAA,KACnB,EAA2B,CAAe,GAG3C,IAAsB,CAAe;EACtC,GACA;GAAC;GAAa;GAAqB;EAAmB,CAKjC;CACtB;AACD;;;AC3BA,SAAgB,EAAsB,EACrC,kBACA,yBACA,4BAC0D;CAC1D,IAAM,CAAC,GAA2B,KAAgC,EAA8C,KAAA,CAAS,GACnH,IAAwB,QACvB,EAA4B,KAAiB,KAA6B,CAAoB,GACpG;EAAC;EAAe;EAAsB;CAAyB,CAChE;CAkBA,OAAO;EACN,eAAe;EACf,uBAlBiC,GAChC,MAAyC;GAEzC,IAAM,IAAmD,EACxD,MAFyB,EAA4B,EAAiB,GAAS,CAAqB,CAE9F,CAAA,CAAkB,KACzB;GAMA,AAJI,MAAkB,KAAA,KACrB,EAA6B,CAAuB,GAGrD,IAAwB,CAAuB;EAChD,GACA;GAAC;GAAe;GAAuB;EAAqB,CAKrC;CACxB;AACD;;;AC5BA,SAAgB,EAAqB,EACpC,iBACA,wBACA,yBACA,2BACwD;CACxD,IAAM,CAAC,GAA0B,KAA+B,EAA6C,KAAA,CAAS,GAChH,IAAuB,QACtB,EAA2B,KAAgB,KAA4B,GAAqB,CAAoB,GACtH;EAAC;EAAsB;EAAc;EAAqB;CAAwB,CACnF;CAeA,OAAO;EACN,cAAc;EACd,sBAfgC,GAC/B,MAAwC;GACxC,IAAM,IAAmB,EAA2B,EAAiB,GAAS,CAAoB,GAAG,CAAoB;GAMzH,AAJI,MAAiB,KAAA,KACpB,EAA4B,CAAgB,GAG7C,IAAuB,CAAgB;EACxC,GACA;GAAC;GAAsB;GAAc;GAAsB;EAAoB,CAKzD;CACvB;AACD;;;AC9BA,SAAgB,EAAyB,EACxC,qBACA,4BACA,+BACgE;CAChE,IAAM,CAAC,GAA8B,KAAmC,EAAsC,KAAA,CAAS,GACjH,IAA2B,QAC1B,KAAoB,KAAgC,KAA2B,CAAC,GACtF;EAAC;EAAkB;EAAyB;CAA4B,CACzE;CAeA,OAAO;EACN,kBAAkB;EAClB,0BAfoC,GACnC,MAAsC;GACtC,IAAM,IAAuB,EAAiB,GAAS,CAAwB;GAM/E,AAJI,MAAqB,KAAA,KACxB,EAAgC,CAAoB,GAGrD,IAA2B,CAAoB;EAChD,GACA;GAAC;GAAkB;GAA0B;EAAwB,CAK3C;CAC3B;AACD;;;;;;;;;;;;;;;;;;;;;;;;;AEhDA,SAAgB,EAA0C,EACzD,WACA,iBACA,SACA,qBACA,mBACA,yBACA,2BACA,yBACA,wBACA,mBACA,yBACmC;CACnC,OACC,kBAAC,GAAD;EACC,UAAU,EAAO,OAAO;EACxB,cAAc,CAAC,KAA0B;EACzC,mBAAmB,EAAO;EAC1B,WAAW,EAAG,EAAO,YAAY,KAAgB,EAAO,sBAAsB,KAAoB,EAAO,kBAAkB;EAC3H,OAAO,EAGN,GAAI,IAAe,EAAE,QAAK,IAAI,CAAC,EAChC;EACA,cACC,KAAwB,CAAC,EAAO,gBAC7B;GACA,UAAU,EAAO,OAAO;GACxB,UAAU;GACV,UAAU;GACV,SAAS;EACV,IACC,KAAA;aAEF,EAAE,cAAW,6BACd,kBAAC,OAAD;GACC,KAAK,KAA0B,CAAC,IAAiB,IAAsB,KAAA;GACvE,WAAW,EAAG,EAAO,mBAAmB,KAA0B,CAAC,KAAkB,EAAO,mBAAmB;GAC/G,GAAK,KAA0B,CAAC,IAAkB,KAAa,CAAC,IAAK,CAAC;aACrE,EAAoB,CAAM;EACvB,CAAA;CAEqB,CAAA;AAE9B;;;ACgCA,SAAS,EACR,GACA,GACS;CACT,IAAM,IAAU,EACd,eAAe,CAAC,CAChB,KAAK,MAAe,EAAgB,IAAI,EAAW,OAAO,EAAE,CAAC,CAAC,CAC9D,QAAQ,MAA2B,OAAO,KAAU,QAAQ;CAE9D,OAAO,EAAQ,SAAS,KAAK,IAAI,GAAG,CAAO;AAC5C;AAEA,SAAS,GACR,GACA,GAC6B;CAC7B,IAAM,IAAmB,EAAM,oBAAoB,GAC7C,IAAqB,EAAM,sBAAsB,GACjD,IAAoB,EAAM,qBAAqB,GAC/C,IAAmB,KAAK,IAAI,EAAiB,QAAQ,EAAmB,QAAQ,EAAkB,MAAM;CAE9G,OAAO,MAAM,KAAK,EAAE,QAAQ,EAAiB,IAAI,GAAG,MAO5C;EALN,GAAI,EAAiB,EAAM,EAAE,WAAW,CAAC;EACzC,GAAI,EAAmB,EAAM,EAAE,WAAW,CAAC;EAC3C,GAAI,EAAkB,EAAM,EAAE,WAAW,CAAC;CAGpC,CAAA,CACL,QAAQ,MACJ,EAAO,gBAAsB,KAE1B,EAAO,eAAe,CAAC,CAAC,MAAM,MAAe,EAAgB,IAAI,EAAW,OAAO,EAAE,CAAC,CAC7F,CAAC,CACD,MAAM,GAAM,MAAU,EAAwB,GAAM,CAAe,IAAI,EAAwB,GAAO,CAAe,CAAC,CACxH;AACF;AAOA,SAAS,EACR,GACA,GACA,GACsE;CAEtE,IAAM,IADc,EAAO,eACL,CAAA,CAAY,KAAK,MAAe,EAAW,OAAO,EAAE;CAU1E,OATqB,EAAc,SAAS,KAAK,EAAc,OAAO,MAAa,KAAY,CAAiB,IASzG;EACN,cAAc;EACd,MAAM,EAAkB,EAAc,OAAQ;EAC9C,kBAAkB,GAAQ,KAAsB,EAAc,SAAS,CAAkB;CAC1F,IAVQ;EACN,cAAc;EACd,kBAAkB;CACnB;AAQF;AAEA,SAAS,GAAgD,GAA6B,GAA6C;CAGlI,OAAO,EAAwB;EAC9B,KAHwB,EAAM,kBAAkB,CAAC,CAAC,KAAK,MAAW,EAAO,EAGpE;EACL,OAAO,EAAY;CACpB,CAAC;AACF;AAOA,SAAgB,EAAgC,EAC/C,UACA,gBACA,UACA,cACA,eACA,cACA,eAAY,QACZ,mBACA,mBAAgB,QAChB,kBACA,+BACA,kBACA,qBACA,oBACA,qBACA,kBACA,kBACA,sBACA,4BACA,0BAAuB,IACvB,4BAAyB,IACzB,yBACA,wBACyB;CACzB,IAAM,IAAe,EAA2B,GAAO,CAAW,GAC5D,IAAiB,QAAc,EAAa,KAAK,MAAW,EAAO,MAAM,GAAG,CAAC,CAAY,CAAC,GAC1F,IAAmB,QAAc,EAAa,KAAK,MAAW,EAAO,EAAE,GAAG,CAAC,CAAY,CAAC,GACxF,IAAyB,QAAc,IAAI,IAAI,EAAiB,KAAK,GAAU,MAAU,CAAC,GAAU,CAAK,CAAC,CAAC,GAAG,CAAC,CAAgB,CAAC,GAChI,IAAqB,QAAc,IAAI,IAAI,CAAgB,GAAG,CAAC,CAAgB,CAAC,GAChF,IAAU,GAAsB,EAAE,oBAAoB,EAAE,CAAC,GACzD,IAAsB,GAAyB,GAAO,CAAsB,GAC5E,IAAoB,GAA2B,GAAO,CAAW,GACjE,IAAqB,EAAe,QAAQ,MAAW,EAAO,YAAY,MAAM,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,IAChG,IAAsB,QAAc,EAAY,cAAc,QAAQ,CAAC,GAAG,CAAC,EAAY,cAAc,IAAI,CAAC,GAC1G,IAAwB,QAAc,IAAI,IAAI,CAAmB,GAAG,CAAC,CAAmB,CAAC,GACzF,IAAW,EAAM,YAAY,GAC7B,IAAW,EAAQ,GACnB,IAAU,EAAS,KAAK,SAAS,GACjC,KAAoB,GACxB,MACA,CAAC,GAAG,CAAK,CAAC,CAAC,MACT,GAAM,OACL,EAAuB,IAAI,EAAK,OAAO,EAAE,qBACzC,EAAuB,IAAI,EAAM,OAAO,EAAE,iBAC7C,GACD,CAAC,CAAsB,CACxB,GAEM,KAAqB,GACzB,GAAkB,MAAkB;EACpC,EAAM,iBAAiB,MAAY,GAAsB,GAAS,GAAU,GAAO,CAAoB,CAAC;CACzG,GACA,CAAC,GAAsB,CAAK,CAC7B,GAEM,KAAyB,GAC7B,MAAqB;EACrB,EAAM,iBAAiB,MAAY,GAAuB,GAAS,CAAQ,CAAC;CAC7E,GACA,CAAC,CAAK,CACP,GAEM,KAA4B,GAChC,MAAwB;EACxB,IAAM,IAAU,EAAyB;GACxC;GACA,OAAO;EACR,CAAC;EACD,IAAI,CAAC,GAAS;EAGd,IAAM,IAAY,GAAmC;GACpD,OAFoB,GAA0B,GAAO,CAE9C;GACP,WAAW;GACX,WAAW;GACX,UAAU,OAAO,EAAQ,QAAQ;GACjC,QAAQ,OAAO,EAAQ,MAAM;EAC9B,CAAC;EAEI,KAEL,EAAM,eAAe,CAAS;CAC/B,GACA;EAAC;EAAa;EAAqB;EAAO;CAAgB,CAC3D,GAEM,MAAuB,MAAmC;EAC/D,IAAI,EAAO,eAAe,OAAO;EAEjC,IAAM,IAAU,GAAW,EAAO,OAAO,UAAU,QAAQ,EAAO,WAAW,CAAC,GACxE,IAAO,IAA0B,CAAM;EAM7C,OAJK,IAKJ,kBAAC,GAAD,EAAA,UAAA,CACC,kBAAC,EAAY,SAAb,EAAA,UACC,kBAAC,OAAD;GAAK,WAAW,EAAO;GAA0B,UAAU;aACzD;EACG,CAAA,EACe,CAAA,GACrB,kBAAC,EAAY,SAAb,EAAA,UAAsB,EAA0B,CAAA,CACpC,EAAA,CAAA,IAXN;CAaT,GAKM,MAAkB,GAA6C,MAAoB;EAGpF,EAFgB,IAAmB,CAAG,KAAK,EAAQ,MAEnC,CAAC,KAAiB,EAA0B,EAAM,QAAQ,CAA0B,KAIxG,EAAc,CAAG;CAClB,GAKM,MAAoB,GAAgD,MAAoB;EAGzF,EAFgB,IAAmB,CAAG,KAAK,EAAQ,MAEnC,CAAC,KAAiB,EAA0B,EAAM,QAAQ,CAA0B,KAIxG,GAAyB,SAAa,EAAc,CAAG,CAAC;CACzD;CAEA,OACC,kBAAC,GAAD;EACC,cAAc,IAAW,aAAa;EACtC,WAAW,EAAG,4BAA4B,EAAO,MAAM,CAAS;EAChE,OAAO,EAAE,aAAU;YAHpB,CAIE,KAAY,kBAAC,MAAD;GAAI,WAAU;aAAkB;EAAU,CAAA,GAEvD,kBAAC,OAAD;GAAK,WAAU;aAAf,CACC,kBAAC,GAAD;IAAY,KAAK;IAAe,WAAU;cACzC,kBAAA,IAAA,EAAA,UAAA,CACC,kBAAC,SAAD;KAAO,WAAW,EAAG,EAAO,OAAO,CAAc;eAAjD;MACC,kBAAC,YAAD,EAAA,UACE,EAAa,KAAK,MAClB,kBAAC,OAAD,EAAqB,OAAO,EAAO,QAAQ,EAAE,OAAO,EAAO,MAAM,IAAI,KAAA,EAAY,GAAvE,EAAO,EAAgE,CACjF,EACQ,CAAA;MAEV,kBAAC,SAAD;OAAO,WAAW,EAAG,aAAa,EAAO,IAAI;iBAC3C,IACA,kBAAC,EAAS,MAAV;QACU;QACT,WAAW,CAAC,EAAwB;QACpC,WAAW;kBACX,kBAAC,EAAS,WAAV;SAAoB,aAAY;SAAoB,OAAO;SAAkB,QAAO;mBAClF,EAAoB,KAAK,GAAS,MAClC,kBAAC,MAAD;UAA6C,WAAW,EAAO;oBAC7D,EAAQ,KAAK,MAAW;WACxB,IAAM,EAAE,iBAAc,SAAM,wBAAqB,EAChD,GACA,GACA,CACD;WAMA,OACC,kBAAC,GAAD;YAES;YACM;YACR;YACY;YACF,gBAXjB,EAAO,iBACP,CAAC,EAAmB,IAAI,EAAO,OAAO,EAAE,KACxC,EAAsB,IAAI,EAAO,OAAO,EAAE;YAUnB;YACE;YACF;YACD;YACrB,gBAAgB;YAChB,oBAAoB;WACpB,GAZK,EAAO,EAYZ;UAEH,CAAC;SACE,GA7BK,gBAAgB,GA6BrB,CACJ;QACkB,CAAA;OACN,CAAA,IAEf,EAAoB,KAAK,GAAS,MACjC,kBAAC,MAAD;QAA6C,WAAW,EAAO;kBAC7D,EAAQ,KAAK,MAAW;SACxB,IAAM,EAAE,iBAAc,SAAM,wBAAqB,EAChD,GACA,GACA,CACD;SAEA,OACC,kBAAC,GAAD;UAES;UACM;UACR;UACY;UAClB,gBAAA;UACsB;UACE;UACF;UACD;UACrB,gBAAgB;UAChB,oBAAoB;SACpB,GAZK,EAAO,EAYZ;QAEH,CAAC;OACE,GAzBK,gBAAgB,GAyBrB,CACJ;MAEI,CAAA;MAEP,kBAAC,SAAD,EAAA,UAAA,CACE,EAAS,KAAK,KAAK,MAAQ;OAC3B,IAAM,IAAc,IAAmB,CAAG,KAAK,EAAQ;OAEvD,OACC,kBAAC,MAAD;QAEC,WAAW,EACV,EAAO,SACP,KAAe,EAAO,oBACtB,EAAI,cAAc,KAAK,EAAO,iBAC9B,IAAkB,CAAG,CACtB;QACA,iBAAe,MAAkB,SAA+B,KAAA,IAAtB,EAAI,cAAc;QAC5D,UAAU,IAAc,IAAI,KAAA;QAC5B,UAAU,MAAU,GAAe,GAAO,CAAG;QAC7C,YAAY,MAAU,GAAiB,GAAO,CAAG;kBAChD,GAAkB;SAClB,GAAG,EAAI,oBAAoB;SAC3B,GAAG,EAAI,sBAAsB;SAC7B,GAAG,EAAI,qBAAqB;QAC7B,CAAC,CAAC,CAAC,KAAK,MAAS;SAChB,IAAM,IAAa,EAAmB,EAAK,OAAO,SAAS,GACrD,IAAiB,GAAW,EAAK,OAAO,UAAU,MAAM,EAAK,WAAW,CAAC,GACzE,IAA6C;UAClD;UACA;UACA;UACA;SACD,GACM,IAAa,IAAgB,CAAU,GACvC,IAAe,EAAK,OAAO,YAAY,MAAM,QAC7C,IAAmB,EAAK,OAAO,OAAO,GAEtC,IAAgB;UACrB,GAAI,GAAY,QAAQ,EAAE,WAAW,EAAW,MAAM,IAAI,CAAC;UAC3D,GAAI,IAAe,EAAE,MAAM,EAAkB,EAAK,OAAO,OAAO,MAAM,IAAI,CAAC;UAC3E,GAAI,KAAe,CAAU,KAAK,CAAC;SACpC;SAEA,OACC,kBAAC,MAAD;UAEC,WAAW,EACV,EAAO,UACP,KAAgB,EAAO,oBACvB,KAAoB,EAAO,oBAC3B,GAAY,iBAAiB,EAAO,wBACpC,IAAmB,CAAU,CAC9B;UACA,OAAO;oBACN,GAAY,cACV,OACA,IACC,EAAkB,CAAU,IAC5B;SACD,GAdE,EAAK,EAcP;QAEN,CAAC;OACE,GArDE,EAAI,EAqDN;MAEN,CAAC,GAEA,KAAc,KACd,kBAAC,MAAD;OAAI,WAAW,EAAO;iBACrB,kBAAC,MAAD;QAAI,SAAS,KAAK,IAAI,EAAe,QAAQ,CAAC;QAAG,WAAW,EAAO;kBAClE,kBAAC,GAAD,CAAiB,CAAA;OACd,CAAA;MACD,CAAA,CAEC,EAAA,CAAA;KACD;QAEN,CACA,EAAA,CAAA;GACS,CAAA,GAEZ,kBAAC,OAAD;IAAK,WAAU;IAAkC,OAAO;KAAE,eAAe;KAAQ,QAAQ;IAAG;cAA5F,CACE,CAAC,KAAa,CAAC,KAAc,CAAC,KAAW,kBAAC,GAAD,EAAQ,WAAW,EAAO,OAAS,CAAA,GAC5E,KAAa,CAAC,KAAW,kBAAC,GAAD,EAAgB,WAAU,YAAa,CAAA,CAC7D;KACD;IACS;;AAEjB;;;;;;;;AEzcA,SAAgB,EAAmB,EAAE,iBAAc,WAAQ,UAAmC;CAC7F,IAAM,IAAU,EAA+B,IAAI,GAC7C,IAAY,EAAa,WAEzB,IADW,EAAa,WACN,EAAa,OAAO,KAAA,GACtC,IAAY,KAAa,EAAa,SAAS,OAAO,OAAO,EAAa,KAAK,IAAI,IACnF,IAAiB,EAA2B,EAAa,KAAK,GAC9D,IAAiB,MAAU,UAAU,aAAa,MAAU,WAAW,WAAW,cAClF,IAAY,MAAU,WAAW,WAAW,MAAU,UAAU,UAAU;CAqChF,OAnCA,QAAgB;EACf,IAAM,IAAU,EAAQ;EACxB,IAAI,CAAC,GACJ;EAGD,IAAM,UAAoB;GACzB,IAAI,CAAC,EAAa,mBAAmB,CAAC,GAAW;IAChD,EAAQ,gBAAgB,OAAO;IAC/B;GACD;GAGA,IADsB,EAAQ,cAAc,EAAQ,cAAc,GAC/C;IAClB,EAAQ,aAAa,SAAS,CAAS;IACvC;GACD;GAEA,EAAQ,gBAAgB,OAAO;EAChC;EAIA,IAFA,EAAY,GAER,OAAO,iBAAmB,KAC7B;EAGD,IAAM,IAAW,IAAI,eAAe,CAAW;EAG/C,OAFA,EAAS,QAAQ,CAAO,SAEX;GACZ,EAAS,WAAW;EACrB;CACD,GAAG,CAAC,EAAa,iBAAiB,CAAS,CAAC,GAG3C,kBAAC,OAAD;EAAK,WAAW,EAAG,EAAO,eAAe,CAAc;YACtD,kBAAC,OAAD;GAAK,WAAW,EAAO;GAAoB,OAAO,EAAE,kBAAe;aAAnE;IACE,EAAa,iBAAiB,SAAS,kBAAC,GAAD,EAAiB,OAAO,EAAO,CAAA,IAAI;IAE1E,IACA,kBAAC,QAAD;KAAM,KAAK;KAAS,WAAW,EAAG,gBAAgB,EAAO,kBAAkB;KAAG,OAAO,EAAE,aAAU;eAC/F;IACI,CAAA,IACH;IAEH,EAAa,iBAAiB,UAAU,kBAAC,GAAD,EAAiB,OAAO,EAAO,CAAA,IAAI;GACxE;;CACD,CAAA;AAEP"}
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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"}
@@ -88,11 +88,43 @@ var s = {
88
88
  "gap",
89
89
  "gapRow",
90
90
  "gapColumn"
91
- ], f = t(({ children: t, className: r = "", as: i, style: s, ...l }, u) => {
92
- let { activeBreakpoint: f } = o(), p = [c(n(() => a(l, f, d), [l, f])), r].filter(Boolean).join(" ");
91
+ ], f = t(({ children: t, className: r = "", as: i, style: s, inline: l, row: u, column: f, rowReverse: p, columnReverse: m, wrap: h, nowrap: g, wrapReverse: _, align: v, justify: y, alignContent: b, gap: x, gapRow: S, gapColumn: C, ...w }, T) => {
92
+ let { activeBreakpoint: E } = o(), D = [c(n(() => a({
93
+ inline: l,
94
+ row: u,
95
+ column: f,
96
+ rowReverse: p,
97
+ columnReverse: m,
98
+ wrap: h,
99
+ nowrap: g,
100
+ wrapReverse: _,
101
+ align: v,
102
+ justify: y,
103
+ alignContent: b,
104
+ gap: x,
105
+ gapRow: S,
106
+ gapColumn: C
107
+ }, E, d), [
108
+ E,
109
+ v,
110
+ b,
111
+ f,
112
+ m,
113
+ x,
114
+ C,
115
+ S,
116
+ l,
117
+ y,
118
+ g,
119
+ u,
120
+ p,
121
+ h,
122
+ _
123
+ ])), r].filter(Boolean).join(" ");
93
124
  return e(i || "div", {
94
- ref: u,
95
- className: p,
125
+ ...w,
126
+ ref: T,
127
+ className: D,
96
128
  style: s
97
129
  }, t);
98
130
  });
@@ -107,11 +139,29 @@ var p = [
107
139
  "basis",
108
140
  "alignSelf",
109
141
  "justifySelf"
110
- ], m = t(({ children: t, className: r = "", as: i, style: s, ...c }, u) => {
111
- let { activeBreakpoint: d } = o(), f = [l(n(() => a(c, d, p), [c, d])), r].filter(Boolean).join(" ");
142
+ ], m = t(({ children: t, className: r = "", as: i, style: s, flex0: c, flex1: u, grow: d, shrink: f, basis: m, alignSelf: h, justifySelf: g, ..._ }, v) => {
143
+ let { activeBreakpoint: y } = o(), b = [l(n(() => a({
144
+ flex0: c,
145
+ flex1: u,
146
+ grow: d,
147
+ shrink: f,
148
+ basis: m,
149
+ alignSelf: h,
150
+ justifySelf: g
151
+ }, y, p), [
152
+ y,
153
+ h,
154
+ m,
155
+ c,
156
+ u,
157
+ d,
158
+ g,
159
+ f
160
+ ])), r].filter(Boolean).join(" ");
112
161
  return e(i || "div", {
113
- ref: u,
114
- className: f,
162
+ ..._,
163
+ ref: v,
164
+ className: b,
115
165
  style: s
116
166
  }, t);
117
167
  });
@@ -131,12 +181,24 @@ var g = {
131
181
  Container: f,
132
182
  Item: m,
133
183
  Predefined: h
134
- }, _ = ({ className: e, minHeight: t, children: n }) => /* @__PURE__ */ i("div", {
135
- className: r("flexCenter h100", e),
136
- style: { minHeight: t },
137
- children: n
138
- }), v = () => /* @__PURE__ */ i(m, { flex1: !0 });
184
+ }, _ = ({ className: e, minHeight: t, children: n, style: a, ...o }) => {
185
+ let s = t === void 0 ? a : {
186
+ ...a,
187
+ minHeight: t
188
+ };
189
+ return /* @__PURE__ */ i("div", {
190
+ ...o,
191
+ className: r("flexCenter h100", e),
192
+ style: s,
193
+ children: n
194
+ });
195
+ }, v = t((e, t) => /* @__PURE__ */ i(m, {
196
+ ...e,
197
+ ref: t,
198
+ flex1: !0
199
+ }));
200
+ v.displayName = "FlexSpacer";
139
201
  //#endregion
140
202
  export { m as a, h as i, _ as n, f as o, g as r, v as t };
141
203
 
142
- //# sourceMappingURL=flex-CPO6xlPR.js.map
204
+ //# sourceMappingURL=flex-DYZ0IbU6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flex-DYZ0IbU6.js","names":[],"sources":["../../src/flex/Flex.module.scss","../../src/flex/useFlexClasses.ts","../../src/flex/FlexContainer.tsx","../../src/flex/FlexItem.tsx","../../src/flex/PredefinedFlex.tsx","../../src/flex/Flex.tsx","../../src/flex/FlexCenter.tsx","../../src/flex/FlexSpacer.tsx"],"sourcesContent":[".container {\n\tdisplay: flex;\n\n\t// Display variants\n\t&.inline {\n\t\tdisplay: inline-flex;\n\t\tvertical-align: middle;\n\t}\n\n\t// Direction\n\t&.row {\n\t\tflex-direction: row;\n\t}\n\t&.column {\n\t\tflex-direction: column;\n\t}\n\t&.rowReverse {\n\t\tflex-direction: row-reverse;\n\t}\n\t&.columnReverse {\n\t\tflex-direction: column-reverse;\n\t}\n\n\t// Wrap\n\t&.wrap {\n\t\tflex-wrap: wrap;\n\t}\n\t&.nowrap {\n\t\tflex-wrap: nowrap;\n\t}\n\t&.wrapReverse {\n\t\tflex-wrap: wrap-reverse;\n\t}\n\n\t// Align items\n\t&.alignStart {\n\t\talign-items: start;\n\t}\n\t&.alignCenter {\n\t\talign-items: center;\n\t}\n\t&.alignEnd {\n\t\talign-items: end;\n\t}\n\t&.alignStretch {\n\t\talign-items: stretch;\n\t}\n\t&.alignBaseline {\n\t\talign-items: baseline;\n\t}\n\n\t// Justify content\n\t&.justifyStart {\n\t\tjustify-content: start;\n\t}\n\t&.justifyCenter {\n\t\tjustify-content: center;\n\t}\n\t&.justifyEnd {\n\t\tjustify-content: end;\n\t}\n\t&.justifyStretch {\n\t\tjustify-content: stretch;\n\t}\n\t&.justifyBetween {\n\t\tjustify-content: space-between;\n\t}\n\t&.justifyAround {\n\t\tjustify-content: space-around;\n\t}\n\t&.justifyEvenly {\n\t\tjustify-content: space-evenly;\n\t}\n\n\t// Align content\n\t&.alignContentStart {\n\t\talign-content: start;\n\t}\n\t&.alignContentCenter {\n\t\talign-content: center;\n\t}\n\t&.alignContentEnd {\n\t\talign-content: end;\n\t}\n\t&.alignContentStretch {\n\t\talign-content: stretch;\n\t}\n\t&.alignContentBetween {\n\t\talign-content: space-between;\n\t}\n\t&.alignContentAround {\n\t\talign-content: space-around;\n\t}\n\t&.alignContentEvenly {\n\t\talign-content: space-evenly;\n\t}\n\n\t// Gap properties\n\t&.gapNone {\n\t\tgap: unset;\n\t}\n\n\t// Row gaps\n\t&.gapRowXs {\n\t\trow-gap: var(--space-xs);\n\t}\n\t&.gapRowSm {\n\t\trow-gap: var(--space-sm);\n\t}\n\t&.gapRowMd {\n\t\trow-gap: var(--space-md);\n\t}\n\t&.gapRowLg {\n\t\trow-gap: var(--space-lg);\n\t}\n\t&.gapRowXl {\n\t\trow-gap: var(--space-xl);\n\t}\n\n\t// Column gaps\n\t&.gapColumnXs {\n\t\tcolumn-gap: var(--space-xs);\n\t}\n\t&.gapColumnSm {\n\t\tcolumn-gap: var(--space-sm);\n\t}\n\t&.gapColumnMd {\n\t\tcolumn-gap: var(--space-md);\n\t}\n\t&.gapColumnLg {\n\t\tcolumn-gap: var(--space-lg);\n\t}\n\t&.gapColumnXl {\n\t\tcolumn-gap: var(--space-xl);\n\t}\n\n\t// Combined gaps\n\t&.gapXs {\n\t\trow-gap: var(--space-xs);\n\t\tcolumn-gap: var(--space-xs);\n\t}\n\t&.gapSm {\n\t\trow-gap: var(--space-sm);\n\t\tcolumn-gap: var(--space-sm);\n\t}\n\t&.gapMd {\n\t\trow-gap: var(--space-md);\n\t\tcolumn-gap: var(--space-md);\n\t}\n\t&.gapLg {\n\t\trow-gap: var(--space-lg);\n\t\tcolumn-gap: var(--space-lg);\n\t}\n\t&.gapXl {\n\t\trow-gap: var(--space-xl);\n\t\tcolumn-gap: var(--space-xl);\n\t}\n}\n\n.item {\n\t// Grow & Shrink with defaults (grow: 0, shrink: 1)\n\t&.grow {\n\t\tflex-grow: 1;\n\t}\n\t&.grow0 {\n\t\tflex-grow: 0;\n\t}\n\n\t&.shrink {\n\t\tflex-shrink: 1;\n\t}\n\t&.shrink0 {\n\t\tflex-shrink: 0;\n\t}\n\n\t// Basis\n\t&.basis0 {\n\t\tflex-basis: 0;\n\t}\n\t&.basisAuto {\n\t\tflex-basis: auto;\n\t}\n\n\t// Composite classes\n\t&.flex0 {\n\t\tflex-grow: 0;\n\t\tflex-shrink: 0;\n\t\tflex-basis: auto;\n\t}\n\n\t&.flex1 {\n\t\tflex-grow: 1;\n\t\tflex-shrink: 1;\n\t\tflex-basis: auto;\n\t}\n\n\t// Align self\n\t&.alignSelfStart {\n\t\talign-self: start;\n\t}\n\t&.alignSelfCenter {\n\t\talign-self: center;\n\t}\n\t&.alignSelfEnd {\n\t\talign-self: end;\n\t}\n\t&.alignSelfStretch {\n\t\talign-self: stretch;\n\t}\n\t&.alignSelfBaseline {\n\t\talign-self: baseline;\n\t}\n\n\t// Justify self\n\t&.justifySelfCenter {\n\t\tjustify-self: center;\n\t}\n\t&.justifySelfEnd {\n\t\tjustify-self: end;\n\t}\n\t&.justifySelfStretch {\n\t\tjustify-self: stretch;\n\t}\n}\n\n// Predefined compositions\n\n.center {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n.centerBetween {\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: space-between;\n}\n\n.columnCenter {\n\t@extend .center;\n\tflex-direction: column;\n\theight: 100%;\n}\n","import { useMemo } from \"react\";\n\nimport { ResolvedProps } from \"@ryuzaki13/react-foundation-lib/media\";\n\nimport styles from \"./Flex.module.scss\";\n\nimport type { FlexContainerLayoutProps, FlexItemLayoutProps } from \"./types\";\n\ntype ClassName = string | undefined | null | false;\n\nexport type ResolvedFlexContainerProps = ResolvedProps<FlexContainerLayoutProps>;\nexport type ResolvedFlexItemProps = ResolvedProps<FlexItemLayoutProps>;\n\nexport const useFlexContainerClasses = (props: ResolvedFlexContainerProps) => {\n\treturn useMemo(() => {\n\t\tconst classes: ClassName[] = [styles.container];\n\n\t\t// Display\n\t\tif (props.inline) classes.push(styles.inline);\n\n\t\t// Direction (mutually exclusive)\n\t\tif (props.row) classes.push(styles.row);\n\t\telse if (props.column) classes.push(styles.column);\n\t\telse if (props.rowReverse) classes.push(styles.rowReverse);\n\t\telse if (props.columnReverse) classes.push(styles.columnReverse);\n\n\t\t// Wrap (mutually exclusive)\n\t\tif (props.wrap) classes.push(styles.wrap);\n\t\telse if (props.nowrap) classes.push(styles.nowrap);\n\t\telse if (props.wrapReverse) classes.push(styles.wrapReverse);\n\n\t\t// Alignment\n\t\tif (props.align) classes.push(styles[`align${props.align.charAt(0).toUpperCase() + props.align.slice(1)}` as keyof typeof styles]);\n\n\t\t// Justify\n\t\tif (props.justify)\n\t\t\tclasses.push(styles[`justify${props.justify.charAt(0).toUpperCase() + props.justify.slice(1)}` as keyof typeof styles]);\n\n\t\t// Align content\n\t\tif (props.alignContent)\n\t\t\tclasses.push(\n\t\t\t\tstyles[`alignContent${props.alignContent.charAt(0).toUpperCase() + props.alignContent.slice(1)}` as keyof typeof styles]\n\t\t\t);\n\n\t\t// Gap properties\n\t\tif (props.gap === \"none\") classes.push(styles.gapNone);\n\t\telse if (props.gap) classes.push(styles[`gap${props.gap.charAt(0).toUpperCase() + props.gap.slice(1)}` as keyof typeof styles]);\n\n\t\tif (props.gapRow)\n\t\t\tclasses.push(styles[`gapRow${props.gapRow.charAt(0).toUpperCase() + props.gapRow.slice(1)}` as keyof typeof styles]);\n\t\tif (props.gapColumn)\n\t\t\tclasses.push(styles[`gapColumn${props.gapColumn.charAt(0).toUpperCase() + props.gapColumn.slice(1)}` as keyof typeof styles]);\n\n\t\treturn classes.filter(Boolean).join(\" \");\n\t}, [props]);\n};\n\nexport const useFlexItemClasses = (props: ResolvedFlexItemProps) => {\n\treturn useMemo(() => {\n\t\tconst classes: ClassName[] = [styles.item];\n\n\t\t// Composite classes (highest priority)\n\t\tif (props.flex0) classes.push(styles.flex0);\n\t\tif (props.flex1) classes.push(styles.flex1);\n\n\t\t// Individual properties (only if composite not used)\n\t\tif (!props.flex0 && !props.flex1) {\n\t\t\t// Grow (default: false = 0)\n\t\t\tif (props.grow) classes.push(styles.grow);\n\t\t\telse classes.push(styles.grow0);\n\n\t\t\t// Shrink (default: true = 1)\n\t\t\tif (props.shrink === false) classes.push(styles.shrink0);\n\t\t\telse classes.push(styles.shrink);\n\n\t\t\t// Basis\n\t\t\tif (props.basis === \"0\") classes.push(styles.basis0);\n\t\t\telse if (props.basis === \"auto\") classes.push(styles.basisAuto);\n\t\t}\n\n\t\t// Self alignment\n\t\tif (props.alignSelf)\n\t\t\tclasses.push(styles[`alignSelf${props.alignSelf.charAt(0).toUpperCase() + props.alignSelf.slice(1)}` as keyof typeof styles]);\n\n\t\t// Justify self\n\t\tif (props.justifySelf)\n\t\t\tclasses.push(\n\t\t\t\tstyles[`justifySelf${props.justifySelf.charAt(0).toUpperCase() + props.justifySelf.slice(1)}` as keyof typeof styles]\n\t\t\t);\n\n\t\treturn classes.filter(Boolean).join(\" \");\n\t}, [props]);\n};\n\nexport const useFlexPredefinedClasses = (variant: string) => {\n\treturn styles[variant as keyof typeof styles];\n};\n","import { createElement, forwardRef, useMemo } from \"react\";\n\nimport { resolveProps, useMatchMedia } from \"@ryuzaki13/react-foundation-lib/media\";\n\nimport { FlexContainerLayoutProps, FlexContainerProps } from \"./types\";\nimport { useFlexContainerClasses } from \"./useFlexClasses\";\n\nconst RESPONSIVE_KEYS = [\n\t\"inline\",\n\t\"row\",\n\t\"column\",\n\t\"rowReverse\",\n\t\"columnReverse\",\n\t\"wrap\",\n\t\"nowrap\",\n\t\"wrapReverse\",\n\t\"align\",\n\t\"justify\",\n\t\"alignContent\",\n\t\"gap\",\n\t\"gapRow\",\n\t\"gapColumn\"\n] as const satisfies readonly (keyof FlexContainerLayoutProps)[];\n\nexport const FlexContainer = forwardRef<HTMLElement, FlexContainerProps>(\n\t(\n\t\t{\n\t\t\tchildren,\n\t\t\tclassName = \"\",\n\t\t\tas,\n\t\t\tstyle,\n\t\t\tinline,\n\t\t\trow,\n\t\t\tcolumn,\n\t\t\trowReverse,\n\t\t\tcolumnReverse,\n\t\t\twrap,\n\t\t\tnowrap,\n\t\t\twrapReverse,\n\t\t\talign,\n\t\t\tjustify,\n\t\t\talignContent,\n\t\t\tgap,\n\t\t\tgapRow,\n\t\t\tgapColumn,\n\t\t\t...htmlProps\n\t\t},\n\t\tref\n\t) => {\n\t\tconst { activeBreakpoint } = useMatchMedia();\n\n\t\tconst resolvedProps = useMemo(\n\t\t\t() =>\n\t\t\t\tresolveProps(\n\t\t\t\t\t{\n\t\t\t\t\t\tinline,\n\t\t\t\t\t\trow,\n\t\t\t\t\t\tcolumn,\n\t\t\t\t\t\trowReverse,\n\t\t\t\t\t\tcolumnReverse,\n\t\t\t\t\t\twrap,\n\t\t\t\t\t\tnowrap,\n\t\t\t\t\t\twrapReverse,\n\t\t\t\t\t\talign,\n\t\t\t\t\t\tjustify,\n\t\t\t\t\t\talignContent,\n\t\t\t\t\t\tgap,\n\t\t\t\t\t\tgapRow,\n\t\t\t\t\t\tgapColumn\n\t\t\t\t\t},\n\t\t\t\t\tactiveBreakpoint,\n\t\t\t\t\tRESPONSIVE_KEYS\n\t\t\t\t),\n\t\t\t[\n\t\t\t\tactiveBreakpoint,\n\t\t\t\talign,\n\t\t\t\talignContent,\n\t\t\t\tcolumn,\n\t\t\t\tcolumnReverse,\n\t\t\t\tgap,\n\t\t\t\tgapColumn,\n\t\t\t\tgapRow,\n\t\t\t\tinline,\n\t\t\t\tjustify,\n\t\t\t\tnowrap,\n\t\t\t\trow,\n\t\t\t\trowReverse,\n\t\t\t\twrap,\n\t\t\t\twrapReverse\n\t\t\t]\n\t\t);\n\n\t\tconst flexClasses = useFlexContainerClasses(resolvedProps);\n\n\t\tconst finalClassName = [flexClasses, className].filter(Boolean).join(\" \");\n\t\tconst Component = as || \"div\";\n\n\t\treturn createElement(\n\t\t\tComponent,\n\n\t\t\t{\n\t\t\t\t...htmlProps,\n\t\t\t\tref,\n\t\t\t\tclassName: finalClassName,\n\t\t\t\tstyle\n\t\t\t},\n\t\t\tchildren\n\t\t);\n\t}\n);\n\nFlexContainer.displayName = \"FlexContainer\";\n","import { createElement, forwardRef, useMemo } from \"react\";\n\nimport { resolveProps, useMatchMedia } from \"@ryuzaki13/react-foundation-lib/media\";\n\nimport { FlexItemLayoutProps, FlexItemProps } from \"./types\";\nimport { useFlexItemClasses } from \"./useFlexClasses\";\n\nconst RESPONSIVE_KEYS = [\n\t\"flex0\",\n\t\"flex1\",\n\t\"grow\",\n\t\"shrink\",\n\t\"basis\",\n\t\"alignSelf\",\n\t\"justifySelf\"\n] as const satisfies readonly (keyof FlexItemLayoutProps)[];\n\nexport const FlexItem = forwardRef<HTMLElement, FlexItemProps>(\n\t({ children, className = \"\", as, style, flex0, flex1, grow, shrink, basis, alignSelf, justifySelf, ...htmlProps }, ref) => {\n\t\tconst { activeBreakpoint } = useMatchMedia();\n\n\t\tconst resolvedProps = useMemo(\n\t\t\t() => resolveProps({ flex0, flex1, grow, shrink, basis, alignSelf, justifySelf }, activeBreakpoint, RESPONSIVE_KEYS),\n\t\t\t[activeBreakpoint, alignSelf, basis, flex0, flex1, grow, justifySelf, shrink]\n\t\t);\n\n\t\tconst flexClasses = useFlexItemClasses(resolvedProps);\n\n\t\tconst finalClassName = [flexClasses, className].filter(Boolean).join(\" \");\n\t\tconst Component = as || \"div\";\n\n\t\treturn createElement(\n\t\t\tComponent,\n\n\t\t\t{\n\t\t\t\t...htmlProps,\n\t\t\t\tref,\n\t\t\t\tclassName: finalClassName,\n\t\t\t\tstyle\n\t\t\t},\n\t\t\tchildren\n\t\t);\n\t}\n);\n\nFlexItem.displayName = \"FlexItem\";\n","import { forwardRef } from \"react\";\n\nimport { FlexContainer } from \"./FlexContainer\";\nimport { PredefinedFlexProps } from \"./types\";\nimport { useFlexPredefinedClasses } from \"./useFlexClasses\";\n\nexport const PredefinedFlex = forwardRef<HTMLElement, PredefinedFlexProps>(({ variant, children, className = \"\", ...props }, ref) => {\n\tconst predefinedClass = useFlexPredefinedClasses(variant ?? \"\");\n\tconst finalClassName = [predefinedClass, className].filter(Boolean).join(\" \");\n\n\treturn (\n\t\t<FlexContainer ref={ref} className={finalClassName} {...props}>\n\t\t\t{children}\n\t\t</FlexContainer>\n\t);\n});\n\nPredefinedFlex.displayName = \"PredefinedFlex\";\n","import { FlexContainer } from \"./FlexContainer\";\nimport { FlexItem } from \"./FlexItem\";\nimport { PredefinedFlex } from \"./PredefinedFlex\";\n\nexport const Flex = {\n\tContainer: FlexContainer,\n\tItem: FlexItem,\n\tPredefined: PredefinedFlex\n};\n","import type { HTMLAttributes, ReactNode } from \"react\";\n\nimport { cn } from \"@ryuzaki13/react-foundation-lib/utils\";\n\nexport interface FlexCenterProps extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n\tchildren?: ReactNode;\n\tminHeight?: string | number;\n}\n\nexport const FlexCenter = ({ className, minHeight, children, style, ...htmlProps }: FlexCenterProps) => {\n\tconst finalStyle = minHeight === undefined ? style : { ...style, minHeight };\n\n\treturn (\n\t\t<div {...htmlProps} className={cn(\"flexCenter h100\", className)} style={finalStyle}>\n\t\t\t{children}\n\t\t</div>\n\t);\n};\n","import { forwardRef } from \"react\";\n\nimport { FlexItem } from \"./FlexItem\";\n\nimport type { FlexItemProps } from \"./types\";\n\nexport type FlexSpacerProps = Omit<FlexItemProps, \"children\" | \"flex1\">;\n\nexport const FlexSpacer = forwardRef<HTMLElement, FlexSpacerProps>((props, ref) => <FlexItem {...props} ref={ref} flex1 />);\n\nFlexSpacer.displayName = \"FlexSpacer\";\n"],"mappings":"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"}