@ryuzaki13/react-foundation-ui 2.2.0 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (286) hide show
  1. package/dist/chunks/dialog-Dqq8ZN99.js +50 -0
  2. package/dist/chunks/dialog-Dqq8ZN99.js.map +1 -0
  3. package/dist/dialog/index.js +2 -50
  4. package/dist/styles.css +1 -1
  5. package/dist/table-editor/index.d.ts +3 -0
  6. package/dist/table-editor/index.d.ts.map +1 -0
  7. package/dist/table-editor/index.js +462 -0
  8. package/dist/table-editor/index.js.map +1 -0
  9. package/dist/table-editor/model/useTableEditor.d.ts +25 -0
  10. package/dist/table-editor/model/useTableEditor.d.ts.map +1 -0
  11. package/dist/table-editor/model/useTableEditorTable.d.ts +10 -0
  12. package/dist/table-editor/model/useTableEditorTable.d.ts.map +1 -0
  13. package/dist/table-editor/ui/TableEditor.d.ts +21 -0
  14. package/dist/table-editor/ui/TableEditor.d.ts.map +1 -0
  15. package/dist/table-editor/ui/TableEditorGrid.d.ts +14 -0
  16. package/dist/table-editor/ui/TableEditorGrid.d.ts.map +1 -0
  17. package/dist/table-editor/ui/TableEditorStructure.d.ts +10 -0
  18. package/dist/table-editor/ui/TableEditorStructure.d.ts.map +1 -0
  19. package/dist/table-editor/ui/TableEditorToolbar.d.ts +11 -0
  20. package/dist/table-editor/ui/TableEditorToolbar.d.ts.map +1 -0
  21. package/package.json +7 -3
  22. package/storybook-static/assets/{Badge-S6BbyfeX.js → Badge-DLpkFLAr.js} +1 -1
  23. package/storybook-static/assets/{Badge.stories-mio0RhpX.js → Badge.stories-DwwZ0O7j.js} +1 -1
  24. package/storybook-static/assets/{BadgeList-rtyargPY.js → BadgeList-C0bhovUR.js} +1 -1
  25. package/storybook-static/assets/{BarcodeScannerDialog.stories-DRdXaVuW.js → BarcodeScannerDialog.stories-DYXaW4Vw.js} +1 -1
  26. package/storybook-static/assets/{Button-CNH5M6QU.js → Button-B1nvnaMI.js} +1 -1
  27. package/storybook-static/assets/{Button-EVzvXVPh.js → Button-PAj4mH8o.js} +1 -1
  28. package/storybook-static/assets/{Button.stories-VUvnWRnm.js → Button.stories-CNvWyh5M.js} +1 -1
  29. package/storybook-static/assets/{CalendarView-CfSvCqCr.js → CalendarView-WUXapLvN.js} +1 -1
  30. package/storybook-static/assets/{CheckBox-C3n5T66c.js → CheckBox-B9f_n0Nh.js} +1 -1
  31. package/storybook-static/assets/{CheckBox-Bynxp5UW.js → CheckBox-C3r_FdXc.js} +1 -1
  32. package/storybook-static/assets/{CheckBox.stories-BoF97wxK.js → CheckBox.stories-B5CFQBFx.js} +1 -1
  33. package/storybook-static/assets/{Color-6AOWCN3U-D-Jlgqzt.js → Color-6AOWCN3U-tYUAsbHo.js} +1 -1
  34. package/storybook-static/assets/{ContextMenu-DwwW3EyB.js → ContextMenu-C-T3O2d9.js} +1 -1
  35. package/storybook-static/assets/{ContextMenu-Dg65Ha7g.js → ContextMenu-PIvPPvq1.js} +1 -1
  36. package/storybook-static/assets/{ContextMenu.stories-D-jRdIZD.js → ContextMenu.stories-Bmy_0Oug.js} +1 -1
  37. package/storybook-static/assets/{CustomOptionButton-vfj1vLJM.js → CustomOptionButton-D_qTIop3.js} +1 -1
  38. package/storybook-static/assets/{DateInput-DJdh5B2X.js → DateInput-B7GZSkR3.js} +1 -1
  39. package/storybook-static/assets/{DateInput-BpuC_NWD.js → DateInput-C-goSdP-.js} +1 -1
  40. package/storybook-static/assets/{DateInput.stories-C9hB_vFy.js → DateInput.stories-CeAMz_x1.js} +1 -1
  41. package/storybook-static/assets/{DateRangePresetSelect-CDgQfOdZ.js → DateRangePresetSelect-BZ9U_l_x.js} +1 -1
  42. package/storybook-static/assets/{DateRangePresetSelect-DYPoeqC2.js → DateRangePresetSelect-BmjgWIxM.js} +1 -1
  43. package/storybook-static/assets/{DateRangePresetSelect.stories-Bx40H_O0.js → DateRangePresetSelect.stories-5UGP9HcH.js} +1 -1
  44. package/storybook-static/assets/{Detail-DWFfdNJH.js → Detail-C6duvCft.js} +1 -1
  45. package/storybook-static/assets/{Detail.stories-C9y_rsbc.js → Detail.stories-DQZciNeZ.js} +1 -1
  46. package/storybook-static/assets/{Dialog-D8GPZi6H.js → Dialog-87D5Shqd.js} +1 -1
  47. package/storybook-static/assets/{Dialog-XbR8HVsJ.js → Dialog-Bx4-acbv.js} +1 -1
  48. package/storybook-static/assets/{Dialog.stories-CoU_PusF.js → Dialog.stories-BgOQABzP.js} +1 -1
  49. package/storybook-static/assets/{Disclosure-DrGfFwQt.js → Disclosure-ZctFZjdw.js} +1 -1
  50. package/storybook-static/assets/{Disclosure.stories-CsR1_XK7.js → Disclosure.stories-BioI8Dpv.js} +1 -1
  51. package/storybook-static/assets/{DisclosureGroup-DvB5K7gZ.js → DisclosureGroup-Cn2EEocA.js} +1 -1
  52. package/storybook-static/assets/{DocsRenderer-JROSPFPF-B7AkTp2I.js → DocsRenderer-JROSPFPF-CoppGUHs.js} +1 -1
  53. package/storybook-static/assets/{DropZone-DesGY4BW.js → DropZone-68BioqBN.js} +1 -1
  54. package/storybook-static/assets/{DropZone-DZi2WVu9.js → DropZone-BpInQyuE.js} +1 -1
  55. package/storybook-static/assets/{DropZone.stories-KVDb6pHQ.js → DropZone.stories-DhVyaedf.js} +1 -1
  56. package/storybook-static/assets/{DropdownMenu-CRoQARS5.js → DropdownMenu-Dw-i5abQ.js} +1 -1
  57. package/storybook-static/assets/{ExpandableActionPanel-CWKJIcbQ.js → ExpandableActionPanel-Bb7Eo_iW.js} +1 -1
  58. package/storybook-static/assets/{ExpandableActionPanel.stories-D-MYdCJ4.js → ExpandableActionPanel.stories-B0XABlVT.js} +1 -1
  59. package/storybook-static/assets/{Flex-CMPSlVVy.js → Flex-CG5yKEBH.js} +1 -1
  60. package/storybook-static/assets/{Flex.stories-DQH0Q5EF.js → Flex.stories-Cfx4TAqp.js} +1 -1
  61. package/storybook-static/assets/{FloatingPopover-CBWu6Gxj.js → FloatingPopover-B8zZ8eYf.js} +1 -1
  62. package/storybook-static/assets/FormattedTableCell-BzBZlmxd.js +15 -0
  63. package/storybook-static/assets/{Grid-BlQE5E_9.js → Grid-3MdRiyY4.js} +1 -1
  64. package/storybook-static/assets/{Grid.stories-CwUCPClP.js → Grid.stories-DUfosHcu.js} +1 -1
  65. package/storybook-static/assets/{ImageCropper.stories-DjaRavSL.js → ImageCropper.stories-DBLj9S4C.js} +1 -1
  66. package/storybook-static/assets/{ImageRenderer-JGxgpvv2.js → ImageRenderer-bZHWE6lq.js} +1 -1
  67. package/storybook-static/assets/{ImageRenderer.stories-DwH6FgEc.js → ImageRenderer.stories-BU2tt9QR.js} +1 -1
  68. package/storybook-static/assets/{ImageView.stories-DgYPiNil.js → ImageView.stories-t_ree_kB.js} +1 -1
  69. package/storybook-static/assets/{ImageViewer.stories-_y7d3coa.js → ImageViewer.stories-kodL93QT.js} +2 -2
  70. package/storybook-static/assets/{ImageViewerRuntime-CA6JhQ31.js → ImageViewerRuntime-Dkw7fwZ1.js} +1 -1
  71. package/storybook-static/assets/{Input-CET6HfZH.js → Input-C-Q_V0Uc.js} +1 -1
  72. package/storybook-static/assets/{Input-95LKm7aK.js → Input-Ckb0G4jj.js} +1 -1
  73. package/storybook-static/assets/{Input.stories-BDTI2nIV.js → Input.stories-BZITY0Np.js} +1 -1
  74. package/storybook-static/assets/{InputDateTime-DsRJZVCO.js → InputDateTime-DF-R-IPb.js} +1 -1
  75. package/storybook-static/assets/{InputDateTime.stories-Dah3F9Fq.js → InputDateTime.stories-2ELFc29n.js} +1 -1
  76. package/storybook-static/assets/{InputFile-CF3DRyTX.js → InputFile-3Sn8IwRI.js} +1 -1
  77. package/storybook-static/assets/{InputFile-_65sKWXa.js → InputFile-Xo-rxvud.js} +1 -1
  78. package/storybook-static/assets/{InputFile.stories-B1PFNFPf.js → InputFile.stories-B4EHuTtj.js} +1 -1
  79. package/storybook-static/assets/{InputFiles-RV6K6GmT.js → InputFiles-CRFuoEBd.js} +1 -1
  80. package/storybook-static/assets/{InputFiles-CUYGDig8.js → InputFiles-DzdnkOiD.js} +1 -1
  81. package/storybook-static/assets/{InputFiles.stories-ZCzYnboY.js → InputFiles.stories-BRCSXgg-.js} +1 -1
  82. package/storybook-static/assets/{InputFilesList-Co__UO8B.js → InputFilesList-CvL4pjsZ.js} +1 -1
  83. package/storybook-static/assets/{InputImage-De56Jwx9.js → InputImage-B1v_PWfN.js} +1 -1
  84. package/storybook-static/assets/{InputImage-900lIdui.js → InputImage-qAzSyHzj.js} +1 -1
  85. package/storybook-static/assets/{InputImage.stories-B_R_kcCD.js → InputImage.stories-4NLpODaa.js} +1 -1
  86. package/storybook-static/assets/{InteractiveComponents-DGTx8enm.js → InteractiveComponents-Bdy-KTOF.js} +1 -1
  87. package/storybook-static/assets/{InteractiveComponents.stories-CDZsFUga.js → InteractiveComponents.stories-C_ZAVn0R.js} +1 -1
  88. package/storybook-static/assets/{LayoutPicker-CllhDO8J.js → LayoutPicker-8wwVLPom.js} +1 -1
  89. package/storybook-static/assets/{LayoutPicker-BMO8qfbL.js → LayoutPicker-B4eblsaF.js} +1 -1
  90. package/storybook-static/assets/{LayoutPicker.stories-F7K4tSxT.js → LayoutPicker.stories-BkA-VmHP.js} +1 -1
  91. package/storybook-static/assets/{Listbox-D_2t3NpM.js → Listbox-ChaW3JrO.js} +1 -1
  92. package/storybook-static/assets/{Listbox-0kjmvCe-.js → Listbox-CyH7MftX.js} +1 -1
  93. package/storybook-static/assets/{Listbox.stories-Cp1Eq7Bz.js → Listbox.stories-_31FVhoW.js} +1 -1
  94. package/storybook-static/assets/{Modal-vdSwQ6xw.js → Modal-CaGOliEb.js} +1 -1
  95. package/storybook-static/assets/{Modal-zf0JQ124.js → Modal-DGR9lZ4E.js} +1 -1
  96. package/storybook-static/assets/{Modal.stories-Cz47rY2B.js → Modal.stories-C1yvEVNj.js} +1 -1
  97. package/storybook-static/assets/{ModalManagerProvider-C_zd0fqC.js → ModalManagerProvider-BrPY3nRM.js} +1 -1
  98. package/storybook-static/assets/{MultiSelect-DE13Ak4N.js → MultiSelect-D-O71OBm.js} +1 -1
  99. package/storybook-static/assets/{MultiSelect-Bl3q6kCP.js → MultiSelect-D4S4B3va.js} +1 -1
  100. package/storybook-static/assets/{MultiSelect.stories-DG6LGTC9.js → MultiSelect.stories-B0QY0_Ru.js} +1 -1
  101. package/storybook-static/assets/{NoData-B4AGZs5Q.js → NoData-B6xgAMXh.js} +1 -1
  102. package/storybook-static/assets/{NotificationsHost-CFD2_BpZ.js → NotificationsHost-DJ3Y-Bov.js} +1 -1
  103. package/storybook-static/assets/{NotificationsHost.stories-CiSu7Vly.js → NotificationsHost.stories-B2ULIi8d.js} +1 -1
  104. package/storybook-static/assets/{ODataMultiSelect-PcZYhXlN.js → ODataMultiSelect-0SfdyLn9.js} +1 -1
  105. package/storybook-static/assets/{ODataMultiSelect.stories-xodpVftn.js → ODataMultiSelect.stories-BLq2Lzuq.js} +1 -1
  106. package/storybook-static/assets/{ODataSelect-BuuZhINP.js → ODataSelect-CkdBSdJ6.js} +1 -1
  107. package/storybook-static/assets/{ODataSelect.stories-nr7GqOTz.js → ODataSelect.stories-OLMZHd_q.js} +1 -1
  108. package/storybook-static/assets/{ODataTreeMultiSelect-BRNITq-6.js → ODataTreeMultiSelect-DMLCMhQn.js} +1 -1
  109. package/storybook-static/assets/{ODataTreeMultiSelect.stories-Baxtdxte.js → ODataTreeMultiSelect.stories-aY5Q0IHe.js} +1 -1
  110. package/storybook-static/assets/{ODataTreeSelect-BKcyKJr8.js → ODataTreeSelect-ME1K7NL2.js} +1 -1
  111. package/storybook-static/assets/{ODataTreeSelect.stories-n6LATF6z.js → ODataTreeSelect.stories-C7UPHKEr.js} +1 -1
  112. package/storybook-static/assets/{OneStepScroller-DXykOSPw.js → OneStepScroller-RRsghqzx.js} +1 -1
  113. package/storybook-static/assets/{Option-Cr3vYgCL.js → Option-CcZ3aKLZ.js} +1 -1
  114. package/storybook-static/assets/{OptionButton-v-MO3VgJ.js → OptionButton-B-RTb3Ua.js} +1 -1
  115. package/storybook-static/assets/{PeriodSelect-DQXZWIBX.js → PeriodSelect-B-89h-o8.js} +1 -1
  116. package/storybook-static/assets/{PeriodSelect-BQ9_EM63.js → PeriodSelect-CUUixF0M.js} +1 -1
  117. package/storybook-static/assets/{PeriodSelect.stories-S2ndHVEQ.js → PeriodSelect.stories-CU1V-pP4.js} +1 -1
  118. package/storybook-static/assets/{PickerField-BeAXSQmp.js → PickerField-DykK8Xgu.js} +1 -1
  119. package/storybook-static/assets/{PickerTriggerActions-D6BjZkrN.js → PickerTriggerActions-C2qYXlH1.js} +1 -1
  120. package/storybook-static/assets/{Popover-CTCfa72M.js → Popover-Bg-XuklM.js} +1 -1
  121. package/storybook-static/assets/{Popover-BAp50b4b.js → Popover-D_MNKdnD.js} +1 -1
  122. package/storybook-static/assets/{Popover.stories-CZIBppwE.js → Popover.stories-D2Asjc6d.js} +1 -1
  123. package/storybook-static/assets/{PresetRangeDateInput-EIlQEGr0.js → PresetRangeDateInput-B1KqD3aB.js} +1 -1
  124. package/storybook-static/assets/{PresetRangeDateInput-BLAAcq8Y.js → PresetRangeDateInput-CYXkpgts.js} +1 -1
  125. package/storybook-static/assets/{PresetRangeDateInput.stories-CShR-Eub.js → PresetRangeDateInput.stories-CTML1dIg.js} +1 -1
  126. package/storybook-static/assets/{PresetSelect-BcD8EsSb.js → PresetSelect-4PvR0s4U.js} +1 -1
  127. package/storybook-static/assets/{README-DsLoV4ax.js → README--I7LDhOP.js} +1 -1
  128. package/storybook-static/assets/{README-CuGPdc3G.js → README-1Ks0ldtQ.js} +1 -1
  129. package/storybook-static/assets/{README-DhZbllv1.js → README-44qHXI_X.js} +1 -1
  130. package/storybook-static/assets/{README-Dd3MCsf2.js → README-B3Q9ZlQz.js} +1 -1
  131. package/storybook-static/assets/{README-DLQvRDdd.js → README-B5MLKvrO.js} +1 -1
  132. package/storybook-static/assets/{README-DgFtCu8B.js → README-B5vVbHbw.js} +1 -1
  133. package/storybook-static/assets/{README-CLiuh-fF.js → README-BJsszjH8.js} +1 -1
  134. package/storybook-static/assets/{README-D9Og-Y7l.js → README-BK-2_7T4.js} +1 -1
  135. package/storybook-static/assets/{README-v3TOC_aE.js → README-BKGcgtnD.js} +1 -1
  136. package/storybook-static/assets/{README-CaECsCl2.js → README-BNUdkNxv.js} +1 -1
  137. package/storybook-static/assets/{README-DUfqdm0p.js → README-BSSrY3Ri.js} +1 -1
  138. package/storybook-static/assets/{README-B8qFKwiq.js → README-BVOzG1wf.js} +1 -1
  139. package/storybook-static/assets/{README-CMBk39py.js → README-BZbDJrol.js} +1 -1
  140. package/storybook-static/assets/{README-cuvbXAuG.js → README-BcReoeGQ.js} +1 -1
  141. package/storybook-static/assets/{README-BdBeQtXQ.js → README-BdgUDdVT.js} +1 -1
  142. package/storybook-static/assets/{README-BQHgBs-J.js → README-BpSdRy6R.js} +1 -1
  143. package/storybook-static/assets/{README-BBS739kV.js → README-BrduLUi1.js} +1 -1
  144. package/storybook-static/assets/{README-Bwv6SU5o.js → README-Bt44WdOn.js} +1 -1
  145. package/storybook-static/assets/{README-BkX7iDLJ.js → README-Bta2DZoW.js} +1 -1
  146. package/storybook-static/assets/{README-jHuA2mq2.js → README-Bwa8ai1X.js} +1 -1
  147. package/storybook-static/assets/{README-5i5ZfRuh.js → README-C1TqCBPf.js} +1 -1
  148. package/storybook-static/assets/{README-D7pP2Sxx.js → README-C5Cq8Lo7.js} +1 -1
  149. package/storybook-static/assets/{README-CWeupyTO.js → README-CE0sa_3S.js} +1 -1
  150. package/storybook-static/assets/{README-DwvyizD7.js → README-COnopkzM.js} +1 -1
  151. package/storybook-static/assets/{README-DehKWpx2.js → README-CUEwtG21.js} +1 -1
  152. package/storybook-static/assets/{README-wizqrRgs.js → README-CVEiXGCU.js} +1 -1
  153. package/storybook-static/assets/{README-BW1oyMu_.js → README-CWxf5v2C.js} +1 -1
  154. package/storybook-static/assets/{README-6iRo8dKK.js → README-CjbqfpYX.js} +1 -1
  155. package/storybook-static/assets/{README-Wd5wEw-J.js → README-CnE5ZG98.js} +1 -1
  156. package/storybook-static/assets/{README-BnTk0DyO.js → README-Co-LXT0Y.js} +1 -1
  157. package/storybook-static/assets/{README-Dn2AIjeS.js → README-CoJlt7mW.js} +1 -1
  158. package/storybook-static/assets/{README-6vpPfmdC.js → README-DFiFAUAq.js} +1 -1
  159. package/storybook-static/assets/{README-CLv4OeWw.js → README-DMCaXjMn.js} +1 -1
  160. package/storybook-static/assets/{README-ZZiicHm9.js → README-DecmlELk.js} +3 -3
  161. package/storybook-static/assets/{README-BDMWo0qS.js → README-Diow36TX.js} +1 -1
  162. package/storybook-static/assets/{README-DkCWpyid.js → README-DlE5gepf.js} +1 -1
  163. package/storybook-static/assets/{README-pvA4fK1E.js → README-Dl_id19k.js} +1 -1
  164. package/storybook-static/assets/{README-B2J2ATaW.js → README-DpxWpc-I.js} +1 -1
  165. package/storybook-static/assets/{README-DDtdZa9N.js → README-Dqpnap9b.js} +1 -1
  166. package/storybook-static/assets/{README-DwyqrR4I.js → README-DrSuJ2Ll.js} +1 -1
  167. package/storybook-static/assets/{README-CVX-4uJ_.js → README-Dtb7kJXX.js} +1 -1
  168. package/storybook-static/assets/{README-CZJvbdGv.js → README-Ib9AxEso.js} +1 -1
  169. package/storybook-static/assets/{README-bAu0Uk5O.js → README-NCp7adRE.js} +1 -1
  170. package/storybook-static/assets/{README-CQUlYRLa.js → README-SHZwgJhZ.js} +1 -1
  171. package/storybook-static/assets/{README-Cntj7my4.js → README-VY7CL7vi.js} +1 -1
  172. package/storybook-static/assets/{README-sEbspuLw.js → README-Ve2RJTbZ.js} +1 -1
  173. package/storybook-static/assets/{README-DoZCaKAx.js → README-bU5ZgdrN.js} +1 -1
  174. package/storybook-static/assets/{README-BIpHKVKI.js → README-kpAlQZLM.js} +1 -1
  175. package/storybook-static/assets/{README-BUlc8wGR.js → README-l0W43XHl.js} +1 -1
  176. package/storybook-static/assets/{README-N-Gy0UYM.js → README-tetbJraG.js} +1 -1
  177. package/storybook-static/assets/{README-DQpji8GH.js → README-vUJFU3Tw.js} +1 -1
  178. package/storybook-static/assets/{README-Dj9EXnja.js → README-vjP8Z9fC.js} +1 -1
  179. package/storybook-static/assets/{README-Y4OGhQbo.js → README-ypHLhhny.js} +1 -1
  180. package/storybook-static/assets/{RadioButton-Ca0kZdMV.js → RadioButton-ByRN6fXm.js} +1 -1
  181. package/storybook-static/assets/{RadioButton-BUPEsqwH.js → RadioButton-DRIJvobR.js} +1 -1
  182. package/storybook-static/assets/{RadioButton.stories-aBnizEak.js → RadioButton.stories-C6lOZsje.js} +1 -1
  183. package/storybook-static/assets/{RadioGroup-34jH28Sk.js → RadioGroup-5P3FMqFW.js} +1 -1
  184. package/storybook-static/assets/{RadioGroup-dq6CbxB6.js → RadioGroup-Dskh-JZM.js} +1 -1
  185. package/storybook-static/assets/{RadioGroup.stories--lDrmS8V.js → RadioGroup.stories-BDbOjwVa.js} +1 -1
  186. package/storybook-static/assets/{Scrollable-BJRiyp9q.js → Scrollable-Cat0ixOK.js} +1 -1
  187. package/storybook-static/assets/{Select-CwNDJSmq.js → Select-BiIixkSk.js} +1 -1
  188. package/storybook-static/assets/{Select-DmwCwS8a.js → Select-ImY9WR7I.js} +1 -1
  189. package/storybook-static/assets/{Select.stories-BXj7A2gM.js → Select.stories-DR8qQrXW.js} +1 -1
  190. package/storybook-static/assets/{SerializableSelect-IAtBSK9P.js → SerializableSelect-C2swvXju.js} +1 -1
  191. package/storybook-static/assets/{SerializableSelect.stories-D8F5WGtk.js → SerializableSelect.stories-CvoyFECC.js} +1 -1
  192. package/storybook-static/assets/{SingleDateTimeInput-CbyyGlmi.js → SingleDateTimeInput-CjixqW_K.js} +1 -1
  193. package/storybook-static/assets/{SingleDateTimeInput-oN2P3eYx.js → SingleDateTimeInput-hV5Om2LV.js} +1 -1
  194. package/storybook-static/assets/{SingleDateTimeInput.stories-BU_wyTmo.js → SingleDateTimeInput.stories-CPDP-M6P.js} +1 -1
  195. package/storybook-static/assets/{Slider-ClZTrtRk.js → Slider-FbV_mr1Y.js} +1 -1
  196. package/storybook-static/assets/{Slider-CDJhhSWj.js → Slider-PcbxPCWE.js} +1 -1
  197. package/storybook-static/assets/{Slider.stories-PfQf9es7.js → Slider.stories-CH9grPep.js} +1 -1
  198. package/storybook-static/assets/{SliderInput-C7TRql6-.js → SliderInput-DPYcLCwD.js} +1 -1
  199. package/storybook-static/assets/{SliderInput-BxFUjetO.js → SliderInput-iqnLqNiU.js} +1 -1
  200. package/storybook-static/assets/{SliderInput.stories-yX8DU5pZ.js → SliderInput.stories-qVDa0KhJ.js} +1 -1
  201. package/storybook-static/assets/{Sortable-D8cVwatT.js → Sortable-DzJSN0MG.js} +1 -1
  202. package/storybook-static/assets/{Sortable.stories-BI6_E5k7.js → Sortable.stories-BaQ2T15L.js} +1 -1
  203. package/storybook-static/assets/{Splitter-B958Wj4G.js → Splitter-Ka7c1ZDV.js} +1 -1
  204. package/storybook-static/assets/{Splitter.stories-Dl2YOk9H.js → Splitter.stories-BbjjUT39.js} +1 -1
  205. package/storybook-static/assets/{StateSelect-DbV1mGhQ.js → StateSelect-CfyyDUiq.js} +1 -1
  206. package/storybook-static/assets/{StateSelect-Cs9-kDRC.js → StateSelect-DSzDU5Jy.js} +1 -1
  207. package/storybook-static/assets/{StateSelect.stories-D6atguQ6.js → StateSelect.stories-0c32Rlr2.js} +1 -1
  208. package/storybook-static/assets/{StatusIndicator--Y-QdjQI.js → StatusIndicator-CcCdDffH.js} +1 -1
  209. package/storybook-static/assets/{StatusIndicator.stories-DxkpP6C1.js → StatusIndicator.stories-Bazi6rxF.js} +1 -1
  210. package/storybook-static/assets/{StringToggle.stories-C3mdK5Wx.js → StringToggle.stories-Bl6HAr4o.js} +1 -1
  211. package/storybook-static/assets/{Switch-OPzpWcJw.js → Switch-BqAkQzIJ.js} +1 -1
  212. package/storybook-static/assets/{Switch-BTFpnXV9.js → Switch-Vl7s55bO.js} +1 -1
  213. package/storybook-static/assets/{Switch.stories-C0rVHcRq.js → Switch.stories-Cq2n8Vr4.js} +1 -1
  214. package/storybook-static/assets/{Table-bWKgagHH.js → Table-BgxoZKJs.js} +1 -1
  215. package/storybook-static/assets/{Table.stories-DOuV4G3p.js → Table.stories-DxnnXMZX.js} +3 -3
  216. package/storybook-static/assets/TableEditor-CaZCZgKf.css +1 -0
  217. package/storybook-static/assets/TableEditor.stories-D5Ke41-O.js +61 -0
  218. package/storybook-static/assets/{Tabs-ae4daDEA.js → Tabs-BPJG7wBI.js} +1 -1
  219. package/storybook-static/assets/{Tabs.stories-Br4RCZKR.js → Tabs.stories-cQ4RTo0w.js} +1 -1
  220. package/storybook-static/assets/{TabsBox-X_7yoTw3.js → TabsBox-CGgEovb9.js} +1 -1
  221. package/storybook-static/assets/{TagInput-B2w5W05Z.js → TagInput-CGHC-7Rv.js} +1 -1
  222. package/storybook-static/assets/{TagInput.stories-Db9DaNpW.js → TagInput.stories-BSy_dJ5n.js} +1 -1
  223. package/storybook-static/assets/{Text-BT0cn3Bk.js → Text-D5fn4NbN.js} +1 -1
  224. package/storybook-static/assets/{Textarea-C_6iOQ3k.js → Textarea-CbWAz4J8.js} +1 -1
  225. package/storybook-static/assets/{Textarea-B9MNOgmF.js → Textarea-pXxz-925.js} +1 -1
  226. package/storybook-static/assets/{Textarea.stories-Ctjb3d47.js → Textarea.stories-BkPejDdf.js} +1 -1
  227. package/storybook-static/assets/{TimePanel-C5AucKln.js → TimePanel-BJulRHL2.js} +1 -1
  228. package/storybook-static/assets/{TimePanel.stories-CiQAJcB_.js → TimePanel.stories-CJmuKdfu.js} +1 -1
  229. package/storybook-static/assets/{Toggle-DxA-Q1KZ.js → Toggle-B2S8eW_z.js} +1 -1
  230. package/storybook-static/assets/{Toggle-q8hxq-LP.js → Toggle-DjqQBHtJ.js} +1 -1
  231. package/storybook-static/assets/{Toggle.stories-C6Jf_KTc.js → Toggle.stories-7KRSUGU9.js} +1 -1
  232. package/storybook-static/assets/{TreeMultiSelect-BfduPrgB.js → TreeMultiSelect-B7Dd0sH5.js} +1 -1
  233. package/storybook-static/assets/{TreeMultiSelect-BKF7COzn.js → TreeMultiSelect-DfvInPvn.js} +1 -1
  234. package/storybook-static/assets/{TreeMultiSelect.stories-C-uztFex.js → TreeMultiSelect.stories-DrokeiS6.js} +1 -1
  235. package/storybook-static/assets/{TreePickerBase-SVDNn9QY.js → TreePickerBase-CN9UeNWV.js} +1 -1
  236. package/storybook-static/assets/{TreeSelect-ClJGLBA8.js → TreeSelect-D3s-_McF.js} +1 -1
  237. package/storybook-static/assets/{TreeSelect-Bu9HRTvX.js → TreeSelect-DPX2Q1Sv.js} +1 -1
  238. package/storybook-static/assets/{TreeSelect.stories-C0TeLbpZ.js → TreeSelect.stories-DvUGVU34.js} +1 -1
  239. package/storybook-static/assets/{TreeTable-BXia_Imm.js → TreeTable-By3223dp.js} +1 -1
  240. package/storybook-static/assets/{TreeTable.stories-Cwo8yjNI.js → TreeTable.stories-DKAKV_e2.js} +2 -2
  241. package/storybook-static/assets/{array-D-_yMMUK-DYqn1Ozn.js → array-D-_yMMUK-DnJ_b27D.js} +1 -1
  242. package/storybook-static/assets/{blocks-BmNU_R5E.js → blocks-C4R1QC9R.js} +3 -3
  243. package/storybook-static/assets/{check-HCQdrq3c.js → check-DkXl--jW.js} +1 -1
  244. package/storybook-static/assets/{chevron-down-DHrZ_6vS.js → chevron-down-DnX0I3Pg.js} +1 -1
  245. package/storybook-static/assets/{chevron-left-CaIBhYcr.js → chevron-left-18ya0d2d.js} +1 -1
  246. package/storybook-static/assets/{chevron-right-BpmEWiwv.js → chevron-right-DilGYzJ6.js} +1 -1
  247. package/storybook-static/assets/{chunk-W22LQPXL-DSMfJqhe.js → chunk-W22LQPXL-WTP7vHyr.js} +1 -1
  248. package/storybook-static/assets/{circle-alert-DuupFIr9.js → circle-alert-DVNv_dVS.js} +1 -1
  249. package/storybook-static/assets/{circle-check-LYBfAR-E.js → circle-check-vIdCi5Zq.js} +1 -1
  250. package/storybook-static/assets/{components-CBnjb8pL.js → components-BtEbmBZQ.js} +3 -3
  251. package/storybook-static/assets/{contextMenu-BZ-iSJtD.js → contextMenu-1dx6rzYN.js} +1 -1
  252. package/storybook-static/assets/{defaultRenderers-CyUQG_f-.js → defaultRenderers-UxEpV_2H.js} +1 -1
  253. package/storybook-static/assets/{download-CsLGqkEl.js → download-37V1rEcU.js} +1 -1
  254. package/storybook-static/assets/{floating-ui.react-VNDOEKPt.js → floating-ui.react-DT-xu5am.js} +1 -1
  255. package/storybook-static/assets/{formatters-DVE1YVNQ-CMsbb5-m.js → formatters-DVE1YVNQ-YIdRxgw-.js} +1 -1
  256. package/storybook-static/assets/{foundationApi-BMy7_pDS.js → foundationApi-FaYaPMaR.js} +1 -1
  257. package/storybook-static/assets/{foundationLib-o95OqhXl.js → foundationLib-DLCLUXOF.js} +1 -1
  258. package/storybook-static/assets/{hooks-DMFMD13m.js → hooks-BuU9-pEZ.js} +1 -1
  259. package/storybook-static/assets/{iframe-BaXmcmyl.js → iframe-0M2vpakb.js} +4 -4
  260. package/storybook-static/assets/iframe-BMXB4CtM.js +1 -0
  261. package/storybook-static/assets/{info-ZuWgcD4m.js → info-2PUHH67D.js} +1 -1
  262. package/storybook-static/assets/odata-DIkxH78d.js +1 -0
  263. package/storybook-static/assets/odataStoryFixtures-BDQiSxyk.js +25 -0
  264. package/storybook-static/assets/{react-BnjGKE7V.js → react-CfjIdTfH.js} +1 -1
  265. package/storybook-static/assets/{refresh-cw-vj55o5c3.js → refresh-cw-CHFG8NIc.js} +1 -1
  266. package/storybook-static/assets/{settings-2-PPom9XND.js → settings-2-CYde2-4U.js} +1 -1
  267. package/storybook-static/assets/{sortable-CztGPJOI.js → sortable-Cy9ZqA3f.js} +1 -1
  268. package/storybook-static/assets/{syntaxhighlighter-QEQV7K2Y-uXmnHQP7.js → syntaxhighlighter-QEQV7K2Y-C2U-3XXV.js} +1 -1
  269. package/storybook-static/assets/tableFeatures-Dx3U-F9E.js +1 -0
  270. package/storybook-static/assets/{trash-2-DEnKoJjZ.js → trash-2-7-oMZEr8.js} +1 -1
  271. package/storybook-static/assets/{triangle-alert-D-oyPLJL.js → triangle-alert-BSmuthen.js} +1 -1
  272. package/storybook-static/assets/{useODataSelectBase-DxsvigTC.js → useODataSelectBase-C3B3Xw87.js} +1 -1
  273. package/storybook-static/assets/{useODataTreeData-Dzxb75-h.js → useODataTreeData-deUW5mSv.js} +1 -1
  274. package/storybook-static/assets/{usePickerDefaultFilter-BMBLqfz8.js → usePickerDefaultFilter-ien2ZY7g.js} +1 -1
  275. package/storybook-static/assets/{usePickerQuery-SCKPS_0f.js → usePickerQuery-DdE3I7AV.js} +1 -1
  276. package/storybook-static/assets/{usePickerTriggerController-DMA4hla_.js → usePickerTriggerController-ZRvj4FHy.js} +1 -1
  277. package/storybook-static/assets/useTable-CK68Q4S4.js +1 -0
  278. package/storybook-static/assets/{x-C5QCK6Ts.js → x-NXcyLtyX.js} +1 -1
  279. package/storybook-static/iframe.html +2 -2
  280. package/storybook-static/index.json +1 -1
  281. package/storybook-static/project.json +1 -1
  282. package/dist/dialog/index.js.map +0 -1
  283. package/storybook-static/assets/FormattedTableCell-CIp2ULPe.js +0 -15
  284. package/storybook-static/assets/iframe-D5qmKm51.js +0 -1
  285. package/storybook-static/assets/odata-Brls3R5b.js +0 -1
  286. package/storybook-static/assets/odataStoryFixtures-BmQo4rAJ.js +0 -25
@@ -0,0 +1,462 @@
1
+ import { n as e } from "../chunks/button-DF21yxVp.js";
2
+ import { n as t, o as n } from "../chunks/input-DSPKgiCK.js";
3
+ import { t as r } from "../chunks/check-box-CZyhzmR0.js";
4
+ import { t as i } from "../chunks/dialog-Dqq8ZN99.js";
5
+ import { useId as a, useMemo as o, useRef as s, useState as c } from "react";
6
+ import { Fragment as l, jsx as u, jsxs as d } from "react/jsx-runtime";
7
+ import { cellSpanningFeature as f, tableFeatures as p, useTable as m } from "@tanstack/react-table";
8
+ import { assertTableDocument as h, deleteTableDocumentAxisGroup as g, expandTableDocumentRange as _, getTableDocumentAxisGroups as v, getTableDocumentCellRange as y, insertTableDocumentAxis as b, mergeTableDocumentCells as x, moveTableDocumentAxisGroup as S, splitTableDocumentCell as C, updateTableDocumentCell as w } from "@ryuzaki13/react-foundation-lib/table-document";
9
+ import { uuidv4 as T } from "@ryuzaki13/react-foundation-lib/crypto";
10
+ var E = {
11
+ editor: "_6ftNrS",
12
+ toolbar: "tji4uW",
13
+ help: "nVFFYk",
14
+ scroll: "S7CdzG",
15
+ table: "emaqLv",
16
+ cellContent: "VLG992",
17
+ inspector: "Hr0ghz",
18
+ structure: "tuhyZe"
19
+ }, D = p({ cellSpanningFeature: f });
20
+ function O(e) {
21
+ let t = o(() => [...e.rows], [e]), n = o(() => e.columns.map((t, n) => ({
22
+ id: t.id,
23
+ accessorFn: (t, r) => {
24
+ let i = y(e, {
25
+ row: r,
26
+ column: n
27
+ });
28
+ return e.rows[i.row].cells[i.column].id;
29
+ },
30
+ spanRows: !0,
31
+ spanColumns: ({ row: t }) => {
32
+ let r = y(e, {
33
+ row: t.index,
34
+ column: n
35
+ });
36
+ return r.column === n ? r.columnSpan : 1;
37
+ }
38
+ })), [e]);
39
+ return m({
40
+ features: D,
41
+ data: t,
42
+ columns: n,
43
+ getRowId: (e) => e.id
44
+ });
45
+ }
46
+ //#endregion
47
+ //#region src/table-editor/ui/TableEditorGrid.tsx
48
+ function k({ editor: e, extendSelection: t, disabled: n, renderCell: r, getCellText: i }) {
49
+ let o = a(), c = s(/* @__PURE__ */ new Map()), f = O(e.document), { document: p, selection: m, focus: h } = e;
50
+ return /* @__PURE__ */ d(l, { children: [/* @__PURE__ */ u("p", {
51
+ id: o,
52
+ className: E.help,
53
+ children: "Стрелки — переход между ячейками. Shift + стрелки или Shift + щелчок — выделение диапазона. Содержимое выбранной ячейки редактируется под таблицей."
54
+ }), /* @__PURE__ */ u("div", {
55
+ className: E.scroll,
56
+ children: /* @__PURE__ */ d("table", {
57
+ role: "grid",
58
+ "aria-label": p.caption || "Редактор таблицы",
59
+ "aria-describedby": o,
60
+ "aria-multiselectable": "true",
61
+ "aria-disabled": n || void 0,
62
+ className: E.table,
63
+ children: [/* @__PURE__ */ u("colgroup", { children: p.columns.map((e) => /* @__PURE__ */ u("col", { style: { width: e.width ?? 180 } }, e.id)) }), /* @__PURE__ */ u("tbody", { children: f.getRowModel().rows.map((a) => /* @__PURE__ */ u("tr", {
64
+ "aria-rowindex": a.index + 1,
65
+ "data-header": a.index < p.headerRowCount || void 0,
66
+ children: a.getAllCells().map((o, s) => {
67
+ if (o.getIsCovered()) return null;
68
+ let l = a.index >= m.row && a.index < m.row + m.rowSpan && s >= m.column && s < m.column + m.columnSpan, d = {
69
+ row: a.index,
70
+ column: s
71
+ }, f = a.original.cells[s], g = a.index < p.headerRowCount ? "th" : "td";
72
+ return /* @__PURE__ */ u(g, {
73
+ role: a.index < p.headerRowCount ? "columnheader" : "gridcell",
74
+ ref: (e) => {
75
+ e ? c.current.set(f.id, e) : c.current.delete(f.id);
76
+ },
77
+ rowSpan: o.getRowSpan(),
78
+ colSpan: o.getColSpan(),
79
+ "aria-colindex": s + 1,
80
+ "aria-label": `Строка ${a.index + 1}, столбец ${s + 1}: ${i(f) || "Пустая ячейка"}`,
81
+ "aria-selected": l,
82
+ tabIndex: !n && h.row === a.index && h.column === s ? 0 : -1,
83
+ onClick: (r) => {
84
+ n || e.select(d, t || r.shiftKey);
85
+ },
86
+ onPointerEnter: (t) => {
87
+ !n && t.pointerType === "mouse" && t.buttons === 1 && e.select(d, !0);
88
+ },
89
+ onKeyDown: (t) => {
90
+ if (n || t.altKey || t.ctrlKey || t.metaKey) return;
91
+ let r;
92
+ switch (t.key) {
93
+ case "ArrowRight":
94
+ r = {
95
+ ...d,
96
+ column: s + o.getColSpan()
97
+ };
98
+ break;
99
+ case "ArrowLeft":
100
+ r = {
101
+ ...d,
102
+ column: s - 1
103
+ };
104
+ break;
105
+ case "ArrowDown":
106
+ r = {
107
+ ...d,
108
+ row: a.index + o.getRowSpan()
109
+ };
110
+ break;
111
+ case "ArrowUp":
112
+ r = {
113
+ ...d,
114
+ row: a.index - 1
115
+ };
116
+ break;
117
+ case "Home":
118
+ r = {
119
+ ...d,
120
+ column: 0
121
+ };
122
+ break;
123
+ case "End":
124
+ r = {
125
+ ...d,
126
+ column: p.columns.length - 1
127
+ };
128
+ break;
129
+ case " ":
130
+ t.preventDefault(), e.select(d, t.shiftKey);
131
+ return;
132
+ default: return;
133
+ }
134
+ if (t.preventDefault(), r.row < 0 || r.column < 0 || r.row >= p.rows.length || r.column >= p.columns.length) return;
135
+ let i = y(p, r);
136
+ e.select(r, t.shiftKey), c.current.get(p.rows[i.row].cells[i.column].id)?.focus();
137
+ },
138
+ children: /* @__PURE__ */ u("div", {
139
+ inert: !0,
140
+ className: E.cellContent,
141
+ children: r(f)
142
+ })
143
+ }, o.id);
144
+ })
145
+ }, a.id)) })]
146
+ })
147
+ })] });
148
+ }
149
+ //#endregion
150
+ //#region src/table-editor/ui/TableEditorStructure.tsx
151
+ function A({ editor: t, createEmptyValue: n, disabled: r }) {
152
+ let [a, o] = c(null), { document: s, focus: f } = t, p = a ? v(s, a).find((e) => f[a] >= e.start && f[a] < e.start + e.count) : null;
153
+ return /* @__PURE__ */ d(l, { children: [/* @__PURE__ */ d("details", {
154
+ className: E.structure,
155
+ children: [
156
+ /* @__PURE__ */ u("summary", { children: "Строки и столбцы" }),
157
+ ["row", "column"].map((i) => /* @__PURE__ */ d("div", {
158
+ className: E.toolbar,
159
+ role: "group",
160
+ "aria-label": i === "row" ? "Строки" : "Столбцы",
161
+ children: [
162
+ /* @__PURE__ */ u("strong", { children: i === "row" ? "Строка" : "Столбец" }),
163
+ [0, 1].map((a) => /* @__PURE__ */ d(e, {
164
+ disabled: r,
165
+ onClick: () => {
166
+ let e = Array.from({ length: i === "row" ? s.columns.length : s.rows.length }, () => ({
167
+ id: T(),
168
+ value: n()
169
+ })), r = T();
170
+ t.execute((t) => b(t, i, f[i] + a, r, e, f.row < s.headerRowCount ? "header" : "body"));
171
+ },
172
+ children: ["Вставить ", a ? "после" : "перед"]
173
+ }, a)),
174
+ [-1, 1].map((n) => /* @__PURE__ */ d(e, {
175
+ disabled: r,
176
+ onClick: () => t.execute((e) => S(e, i, f[i], n)),
177
+ children: ["Переместить ", i === "row" ? n === -1 ? "выше" : "ниже" : n === -1 ? "левее" : "правее"]
178
+ }, n)),
179
+ /* @__PURE__ */ d(e, {
180
+ tone: "error",
181
+ disabled: r,
182
+ onClick: () => o(i),
183
+ children: ["Удалить ", i === "row" ? "строку" : "столбец"]
184
+ })
185
+ ]
186
+ }, i)),
187
+ /* @__PURE__ */ u(e, {
188
+ disabled: r,
189
+ onClick: () => {
190
+ let e = s.columns.map(() => ({
191
+ id: T(),
192
+ value: n()
193
+ })), r = T();
194
+ t.execute((t) => b(t, "row", t.headerRowCount, r, e, "header"));
195
+ },
196
+ children: "Добавить строку заголовка"
197
+ })
198
+ ]
199
+ }), /* @__PURE__ */ u(i, {
200
+ open: !!a,
201
+ onClose: () => o(null),
202
+ title: "Удалить часть таблицы?",
203
+ description: `Будет удалено ${p?.count ?? 0} ${a === "row" ? "строк" : "столбцов"}, включая скрытое объединением содержимое. Объединённая группа удаляется целиком. До сохранения действие можно отменить.`,
204
+ children: /* @__PURE__ */ d("div", {
205
+ className: E.toolbar,
206
+ children: [/* @__PURE__ */ u(e, {
207
+ onClick: () => o(null),
208
+ children: "Не удалять"
209
+ }), /* @__PURE__ */ u(e, {
210
+ tone: "error",
211
+ disabled: r,
212
+ onClick: () => {
213
+ a && t.execute((e) => g(e, a, f[a])), o(null);
214
+ },
215
+ children: "Удалить группу"
216
+ })]
217
+ })
218
+ })] });
219
+ }
220
+ //#endregion
221
+ //#region src/table-editor/ui/TableEditorToolbar.tsx
222
+ function j({ editor: t, disabled: n, extendSelection: i, onExtendSelectionChange: a }) {
223
+ let { document: o, selection: s } = t, c = {
224
+ row: s.row + s.rowSpan - 1,
225
+ column: s.column + s.columnSpan - 1
226
+ }, l = s.rowSpan * s.columnSpan === 1, f = s.row < o.headerRowCount && c.row >= o.headerRowCount, p = o.merges.find((e) => e.row === s.row && e.column === s.column && e.rowSpan === s.rowSpan && e.columnSpan === s.columnSpan);
227
+ return /* @__PURE__ */ d("div", {
228
+ className: E.toolbar,
229
+ role: "group",
230
+ "aria-label": "История и объединение",
231
+ children: [
232
+ /* @__PURE__ */ u(e, {
233
+ disabled: n || !t.canUndo,
234
+ onClick: t.undo,
235
+ children: "Отменить"
236
+ }),
237
+ /* @__PURE__ */ u(e, {
238
+ disabled: n || !t.canRedo,
239
+ onClick: t.redo,
240
+ children: "Повторить"
241
+ }),
242
+ /* @__PURE__ */ u(e, {
243
+ disabled: n || l || f || !!p,
244
+ onClick: () => t.execute((e) => x(e, s, c)),
245
+ children: "Объединить ячейки"
246
+ }),
247
+ /* @__PURE__ */ u(e, {
248
+ disabled: n || !p,
249
+ onClick: () => t.execute((e) => C(e, s)),
250
+ children: "Разъединить ячейки"
251
+ }),
252
+ /* @__PURE__ */ u(r, {
253
+ label: "Выделять диапазон",
254
+ value: i,
255
+ disabled: n,
256
+ onChange: a
257
+ }),
258
+ /* @__PURE__ */ d("span", {
259
+ role: "status",
260
+ children: [
261
+ "Выделение: ",
262
+ s.rowSpan,
263
+ " × ",
264
+ s.columnSpan,
265
+ ". Шаг ",
266
+ t.historyPosition,
267
+ " из ",
268
+ t.historyLength - 1,
269
+ "."
270
+ ]
271
+ }),
272
+ f ? /* @__PURE__ */ u("p", { children: "Заголовок и основную часть нельзя объединить в одну ячейку." }) : null
273
+ ]
274
+ });
275
+ }
276
+ //#endregion
277
+ //#region src/table-editor/ui/TableEditor.tsx
278
+ function M({ editor: e, renderCell: i, getCellText: a, renderValueEditor: o, createEmptyValue: s, disabled: l = !1 }) {
279
+ let [f, p] = c(!1), { document: m, focus: h } = e, g = m.rows[h.row].cells[h.column];
280
+ return /* @__PURE__ */ d("section", {
281
+ className: E.editor,
282
+ "aria-label": "Конструктор таблицы",
283
+ children: [
284
+ /* @__PURE__ */ u(t, {
285
+ label: "Название таблицы",
286
+ value: m.caption,
287
+ disabled: l,
288
+ onChange: (t) => e.change({
289
+ ...m,
290
+ caption: t ?? ""
291
+ })
292
+ }),
293
+ /* @__PURE__ */ u(j, {
294
+ editor: e,
295
+ disabled: l,
296
+ extendSelection: f,
297
+ onExtendSelectionChange: p
298
+ }),
299
+ e.error ? /* @__PURE__ */ u("p", {
300
+ role: "alert",
301
+ children: e.error
302
+ }) : null,
303
+ /* @__PURE__ */ u(k, {
304
+ editor: e,
305
+ disabled: l,
306
+ renderCell: i,
307
+ getCellText: a,
308
+ extendSelection: f
309
+ }),
310
+ /* @__PURE__ */ d("div", {
311
+ className: E.inspector,
312
+ children: [
313
+ /* @__PURE__ */ d("strong", { children: [
314
+ "Ячейка: строка ",
315
+ h.row + 1,
316
+ ", столбец ",
317
+ h.column + 1
318
+ ] }),
319
+ o({
320
+ cell: g,
321
+ disabled: l,
322
+ onChange: (t) => e.change(w(m, h, t))
323
+ }),
324
+ e.selection.rowSpan * e.selection.columnSpan > 1 ? /* @__PURE__ */ u("p", { children: "При объединении показывается верхняя левая ячейка. Остальное содержимое сохранится и снова появится после разъединения." }) : null
325
+ ]
326
+ }),
327
+ /* @__PURE__ */ u(A, {
328
+ editor: e,
329
+ disabled: l,
330
+ createEmptyValue: s
331
+ }),
332
+ /* @__PURE__ */ d("div", {
333
+ className: E.toolbar,
334
+ children: [
335
+ /* @__PURE__ */ u(r, {
336
+ label: "Скрыть заголовки при публикации",
337
+ value: m.hideHeaders,
338
+ disabled: l,
339
+ onChange: (t) => e.change({
340
+ ...m,
341
+ hideHeaders: t
342
+ })
343
+ }),
344
+ /* @__PURE__ */ u(r, {
345
+ label: "Показывать номера строк",
346
+ value: m.showRowNumbers,
347
+ disabled: l,
348
+ onChange: (t) => e.change({
349
+ ...m,
350
+ showRowNumbers: t
351
+ })
352
+ }),
353
+ /* @__PURE__ */ u(n, {
354
+ label: "Ширина выбранного столбца, px",
355
+ value: m.columns[h.column].width ?? void 0,
356
+ min: 40,
357
+ max: 1600,
358
+ disabled: l,
359
+ onChange: (t) => {
360
+ t !== void 0 && (t < 40 || t > 1600) || e.change({
361
+ ...m,
362
+ columns: m.columns.map((e, n) => n === h.column ? {
363
+ ...e,
364
+ width: t ?? null
365
+ } : e)
366
+ });
367
+ }
368
+ })
369
+ ]
370
+ })
371
+ ]
372
+ });
373
+ }
374
+ //#endregion
375
+ //#region src/table-editor/model/useTableEditor.ts
376
+ function N(e) {
377
+ let [t, n] = c(() => (h(e), {
378
+ documents: [e],
379
+ index: 0,
380
+ anchor: {
381
+ row: 0,
382
+ column: 0
383
+ },
384
+ focus: {
385
+ row: 0,
386
+ column: 0
387
+ },
388
+ error: null
389
+ })), r = t.documents[t.index], i = (e, t = !1) => {
390
+ let i = y(r, e), a = {
391
+ row: i.row,
392
+ column: i.column
393
+ };
394
+ n((e) => ({
395
+ ...e,
396
+ anchor: t ? e.anchor : a,
397
+ focus: a,
398
+ error: null
399
+ }));
400
+ }, a = (e) => {
401
+ h(e), n((t) => {
402
+ if (t.documents[t.index] === e) return t;
403
+ let n = [...t.documents.slice(0, t.index + 1), e].slice(-101), r = {
404
+ row: Math.min(t.focus.row, e.rows.length - 1),
405
+ column: Math.min(t.focus.column, e.columns.length - 1)
406
+ }, i = y(e, r), a = {
407
+ row: i.row,
408
+ column: i.column
409
+ };
410
+ return {
411
+ documents: n,
412
+ index: n.length - 1,
413
+ anchor: a,
414
+ focus: a,
415
+ error: null
416
+ };
417
+ });
418
+ }, o = (e) => n((t) => {
419
+ let n = Math.max(0, Math.min(t.index + e, t.documents.length - 1));
420
+ return {
421
+ ...t,
422
+ index: n,
423
+ anchor: {
424
+ row: 0,
425
+ column: 0
426
+ },
427
+ focus: {
428
+ row: 0,
429
+ column: 0
430
+ },
431
+ error: null
432
+ };
433
+ });
434
+ return {
435
+ document: r,
436
+ selection: _(r, t.anchor, t.focus),
437
+ focus: t.focus,
438
+ canUndo: t.index > 0,
439
+ canRedo: t.index < t.documents.length - 1,
440
+ historyPosition: t.index,
441
+ historyLength: t.documents.length,
442
+ error: t.error,
443
+ select: i,
444
+ change: a,
445
+ undo: () => o(-1),
446
+ redo: () => o(1),
447
+ execute: (e) => {
448
+ try {
449
+ a(e(r));
450
+ } catch (e) {
451
+ n((t) => ({
452
+ ...t,
453
+ error: e instanceof Error ? e.message : "Не удалось изменить таблицу."
454
+ }));
455
+ }
456
+ }
457
+ };
458
+ }
459
+ //#endregion
460
+ export { M as TableEditor, N as useTableEditor };
461
+
462
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/table-editor/ui/TableEditor.module.scss","../../src/table-editor/model/useTableEditorTable.ts","../../src/table-editor/ui/TableEditorGrid.tsx","../../src/table-editor/ui/TableEditorStructure.tsx","../../src/table-editor/ui/TableEditorToolbar.tsx","../../src/table-editor/ui/TableEditor.tsx","../../src/table-editor/model/useTableEditor.ts"],"sourcesContent":[".editor {\n\tdisplay: grid;\n\tgap: var(--space-md);\n\tmin-width: 0;\n\tcolor: var(--content-0);\n}\n.toolbar {\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\talign-items: center;\n\tgap: var(--space-sm);\n}\n.help {\n\tmargin: 0;\n\tcolor: var(--content-1);\n}\n.scroll {\n\tmax-height: 34rem;\n\toverflow: auto;\n\tborder: var(--border);\n\tborder-radius: var(--radius-sm);\n}\n.table {\n\twidth: max-content;\n\tmin-width: 100%;\n\ttable-layout: fixed;\n\tborder-collapse: collapse;\n\n\ttd,\n\tth {\n\t\tpadding: var(--space-sm);\n\t\tmin-width: 6rem;\n\t\tborder: var(--border);\n\t\tvertical-align: top;\n\t\ttext-align: start;\n\t\tbackground: var(--surface-0);\n\t\tcursor: cell;\n\t\t&[aria-selected=\"true\"] {\n\t\t\tbackground: var(--surface-2);\n\t\t\tbox-shadow: inset 0 0 0 2px var(--content-1);\n\t\t}\n\t\t&:focus {\n\t\t\toutline: 3px solid var(--content-0);\n\t\t\toutline-offset: -3px;\n\t\t}\n\t}\n\ttr[data-header] th {\n\t\tfont-weight: 600;\n\t\t&:not([aria-selected=\"true\"]) {\n\t\t\tbackground: var(--surface-1);\n\t\t}\n\t}\n}\n.cellContent {\n\tmin-height: 2rem;\n\toverflow-wrap: anywhere;\n\tpointer-events: none;\n\tuser-select: none;\n}\n.inspector {\n\tdisplay: grid;\n\tgap: var(--space-sm);\n\tpadding: var(--space-md);\n\tborder: var(--border);\n\tbackground: var(--surface-1);\n}\n.structure {\n\tdisplay: grid;\n\tpadding: var(--space-sm);\n\tborder: var(--border);\n\tsummary {\n\t\tcursor: pointer;\n\t\tmargin-bottom: var(--space-sm);\n\t}\n\t.toolbar {\n\t\tmargin-bottom: var(--space-sm);\n\t}\n}\n","import { useMemo } from \"react\";\n\nimport { getTableDocumentCellRange, type TableDocument, type TableDocumentRow } from \"@ryuzaki13/react-foundation-lib/table-document\";\nimport { cellSpanningFeature, tableFeatures, useTable, type ColumnDef } from \"@tanstack/react-table\";\n\nconst features = tableFeatures({ cellSpanningFeature });\n\n/**\n * TanStack 9 получает стабильный anchor как accessor value: одинаковый текст\n * соседних ячеек сам по себе никогда не объединяет их. Порядок документа не\n * сортируется и не фильтруется; authored spans остаются authoritative.\n */\nexport function useTableEditorTable<T>(document: TableDocument<T>) {\n\t// Merge меняет accessor identity даже без изменения rows. Новый snapshot data\n\t// сбрасывает кэш значений TanStack и не оставляет устаревшие spans на экране.\n\tconst data = useMemo(() => [...document.rows], [document]);\n\tconst columns = useMemo<ColumnDef<typeof features, TableDocumentRow<T>>[]>(\n\t\t() =>\n\t\t\tdocument.columns.map((column, c) => ({\n\t\t\t\tid: column.id,\n\t\t\t\taccessorFn: (_row, r) => {\n\t\t\t\t\tconst range = getTableDocumentCellRange(document, { row: r, column: c });\n\t\t\t\t\treturn document.rows[range.row].cells[range.column].id;\n\t\t\t\t},\n\t\t\t\tspanRows: true,\n\t\t\t\tspanColumns: ({ row }) => {\n\t\t\t\t\tconst range = getTableDocumentCellRange(document, { row: row.index, column: c });\n\t\t\t\t\treturn range.column === c ? range.columnSpan : 1;\n\t\t\t\t}\n\t\t\t})),\n\t\t[document]\n\t);\n\treturn useTable({ features, data, columns, getRowId: (row) => row.id });\n}\n","import { useId, useRef, type ReactNode } from \"react\";\n\nimport {\n\tgetTableDocumentCellRange,\n\ttype TableDocumentCell,\n\ttype TableDocumentPosition\n} from \"@ryuzaki13/react-foundation-lib/table-document\";\n\nimport { type TableEditorController } from \"../model/useTableEditor\";\nimport { useTableEditorTable } from \"../model/useTableEditorTable\";\n\nimport styles from \"./TableEditor.module.scss\";\n\ntype TableEditorGridProps<T> = {\n\treadonly editor: TableEditorController<T>;\n\treadonly extendSelection: boolean;\n\treadonly disabled?: boolean;\n\treadonly renderCell: (cell: TableDocumentCell<T>) => ReactNode;\n\treadonly getCellText: (cell: TableDocumentCell<T>) => string;\n};\n\n/** Доступная сетка: roving tabindex, стрелки/Shift и выбор диапазона без drag-only действий. */\nexport function TableEditorGrid<T>({ editor, extendSelection, disabled, renderCell, getCellText }: TableEditorGridProps<T>) {\n\tconst helpId = useId();\n\tconst nodes = useRef(new Map<string, HTMLTableCellElement>());\n\tconst table = useTableEditorTable(editor.document);\n\tconst { document, selection, focus } = editor;\n\treturn (\n\t\t<>\n\t\t\t<p id={helpId} className={styles.help}>\n\t\t\t\tСтрелки — переход между ячейками. Shift + стрелки или Shift + щелчок — выделение диапазона. Содержимое выбранной ячейки\n\t\t\t\tредактируется под таблицей.\n\t\t\t</p>\n\t\t\t<div className={styles.scroll}>\n\t\t\t\t<table\n\t\t\t\t\trole=\"grid\"\n\t\t\t\t\taria-label={document.caption || \"Редактор таблицы\"}\n\t\t\t\t\taria-describedby={helpId}\n\t\t\t\t\taria-multiselectable=\"true\"\n\t\t\t\t\taria-disabled={disabled || undefined}\n\t\t\t\t\tclassName={styles.table}>\n\t\t\t\t\t<colgroup>\n\t\t\t\t\t\t{document.columns.map((column) => (\n\t\t\t\t\t\t\t<col key={column.id} style={{ width: column.width ?? 180 }} />\n\t\t\t\t\t\t))}\n\t\t\t\t\t</colgroup>\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t{table.getRowModel().rows.map((row) => (\n\t\t\t\t\t\t\t<tr key={row.id} aria-rowindex={row.index + 1} data-header={row.index < document.headerRowCount || undefined}>\n\t\t\t\t\t\t\t\t{row.getAllCells().map((cell, column) => {\n\t\t\t\t\t\t\t\t\tif (cell.getIsCovered()) return null;\n\t\t\t\t\t\t\t\t\tconst selected =\n\t\t\t\t\t\t\t\t\t\trow.index >= selection.row &&\n\t\t\t\t\t\t\t\t\t\trow.index < selection.row + selection.rowSpan &&\n\t\t\t\t\t\t\t\t\t\tcolumn >= selection.column &&\n\t\t\t\t\t\t\t\t\t\tcolumn < selection.column + selection.columnSpan;\n\t\t\t\t\t\t\t\t\tconst position = { row: row.index, column };\n\t\t\t\t\t\t\t\t\tconst original = row.original.cells[column];\n\t\t\t\t\t\t\t\t\tconst Cell = row.index < document.headerRowCount ? \"th\" : \"td\";\n\t\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t\t<Cell\n\t\t\t\t\t\t\t\t\t\t\tkey={cell.id}\n\t\t\t\t\t\t\t\t\t\t\trole={row.index < document.headerRowCount ? \"columnheader\" : \"gridcell\"}\n\t\t\t\t\t\t\t\t\t\t\tref={(node) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (node) nodes.current.set(original.id, node);\n\t\t\t\t\t\t\t\t\t\t\t\telse nodes.current.delete(original.id);\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\trowSpan={cell.getRowSpan()}\n\t\t\t\t\t\t\t\t\t\t\tcolSpan={cell.getColSpan()}\n\t\t\t\t\t\t\t\t\t\t\taria-colindex={column + 1}\n\t\t\t\t\t\t\t\t\t\t\taria-label={`Строка ${row.index + 1}, столбец ${column + 1}: ${getCellText(original) || \"Пустая ячейка\"}`}\n\t\t\t\t\t\t\t\t\t\t\taria-selected={selected}\n\t\t\t\t\t\t\t\t\t\t\ttabIndex={!disabled && focus.row === row.index && focus.column === column ? 0 : -1}\n\t\t\t\t\t\t\t\t\t\t\tonClick={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (!disabled) editor.select(position, extendSelection || event.shiftKey);\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\tonPointerEnter={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (!disabled && event.pointerType === \"mouse\" && event.buttons === 1)\n\t\t\t\t\t\t\t\t\t\t\t\t\teditor.select(position, true);\n\t\t\t\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t\t\t\t\tonKeyDown={(event) => {\n\t\t\t\t\t\t\t\t\t\t\t\tif (disabled || event.altKey || event.ctrlKey || event.metaKey) return;\n\t\t\t\t\t\t\t\t\t\t\t\tlet next: TableDocumentPosition;\n\t\t\t\t\t\t\t\t\t\t\t\tswitch (event.key) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase \"ArrowRight\":\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tnext = { ...position, column: column + cell.getColSpan() };\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase \"ArrowLeft\":\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tnext = { ...position, column: column - 1 };\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase \"ArrowDown\":\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tnext = { ...position, row: row.index + cell.getRowSpan() };\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase \"ArrowUp\":\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tnext = { ...position, row: row.index - 1 };\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase \"Home\":\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tnext = { ...position, column: 0 };\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase \"End\":\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tnext = { ...position, column: document.columns.length - 1 };\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t\t\t\tcase \" \":\n\t\t\t\t\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\t\t\teditor.select(position, event.shiftKey);\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\tdefault:\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}\n\t\t\t\t\t\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\t\t\t\t\t\tnext.row < 0 ||\n\t\t\t\t\t\t\t\t\t\t\t\t\tnext.column < 0 ||\n\t\t\t\t\t\t\t\t\t\t\t\t\tnext.row >= document.rows.length ||\n\t\t\t\t\t\t\t\t\t\t\t\t\tnext.column >= document.columns.length\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\t\treturn;\n\t\t\t\t\t\t\t\t\t\t\t\tconst range = getTableDocumentCellRange(document, next);\n\t\t\t\t\t\t\t\t\t\t\t\teditor.select(next, event.shiftKey);\n\t\t\t\t\t\t\t\t\t\t\t\tnodes.current.get(document.rows[range.row].cells[range.column].id)?.focus();\n\t\t\t\t\t\t\t\t\t\t\t}}>\n\t\t\t\t\t\t\t\t\t\t\t{/* Preview не должен создавать вложенные tab stops или открывать ссылки вместо выделения. */}\n\t\t\t\t\t\t\t\t\t\t\t<div inert className={styles.cellContent}>\n\t\t\t\t\t\t\t\t\t\t\t\t{renderCell(original)}\n\t\t\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t\t\t</Cell>\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</tr>\n\t\t\t\t\t\t))}\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t</div>\n\t\t</>\n\t);\n}\n","import { useState } from \"react\";\n\nimport { uuidv4 } from \"@ryuzaki13/react-foundation-lib/crypto\";\nimport {\n\tdeleteTableDocumentAxisGroup,\n\tgetTableDocumentAxisGroups,\n\tinsertTableDocumentAxis,\n\tmoveTableDocumentAxisGroup\n} from \"@ryuzaki13/react-foundation-lib/table-document\";\n\nimport { Button } from \"../../button\";\nimport { Dialog } from \"../../dialog\";\nimport { type TableEditorController } from \"../model/useTableEditor\";\n\nimport styles from \"./TableEditor.module.scss\";\n\ntype TableEditorStructureProps<T> = {\n\treadonly editor: TableEditorController<T>;\n\treadonly createEmptyValue: () => T;\n\treadonly disabled?: boolean;\n};\n\n/** Вставка и доступный reorder без обязательного drag; удаление подтверждает весь затронутый блок. */\nexport function TableEditorStructure<T>({ editor, createEmptyValue, disabled }: TableEditorStructureProps<T>) {\n\tconst [removing, setRemoving] = useState<\"row\" | \"column\" | null>(null);\n\tconst { document, focus } = editor;\n\tconst group = removing\n\t\t? getTableDocumentAxisGroups(document, removing).find(\n\t\t\t\t(item) => focus[removing] >= item.start && focus[removing] < item.start + item.count\n\t\t\t)\n\t\t: null;\n\treturn (\n\t\t<>\n\t\t\t<details className={styles.structure}>\n\t\t\t\t<summary>Строки и столбцы</summary>\n\t\t\t\t{([\"row\", \"column\"] as const).map((axis) => (\n\t\t\t\t\t<div key={axis} className={styles.toolbar} role=\"group\" aria-label={axis === \"row\" ? \"Строки\" : \"Столбцы\"}>\n\t\t\t\t\t\t<strong>{axis === \"row\" ? \"Строка\" : \"Столбец\"}</strong>\n\t\t\t\t\t\t{([0, 1] as const).map((offset) => (\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tkey={offset}\n\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\t\t\tconst cells = Array.from(\n\t\t\t\t\t\t\t\t\t\t{ length: axis === \"row\" ? document.columns.length : document.rows.length },\n\t\t\t\t\t\t\t\t\t\t() => ({ id: uuidv4(), value: createEmptyValue() })\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tconst id = uuidv4();\n\t\t\t\t\t\t\t\t\teditor.execute((current) =>\n\t\t\t\t\t\t\t\t\t\tinsertTableDocumentAxis(\n\t\t\t\t\t\t\t\t\t\t\tcurrent,\n\t\t\t\t\t\t\t\t\t\t\taxis,\n\t\t\t\t\t\t\t\t\t\t\tfocus[axis] + offset,\n\t\t\t\t\t\t\t\t\t\t\tid,\n\t\t\t\t\t\t\t\t\t\t\tcells,\n\t\t\t\t\t\t\t\t\t\t\tfocus.row < document.headerRowCount ? \"header\" : \"body\"\n\t\t\t\t\t\t\t\t\t\t)\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\tВставить {offset ? \"после\" : \"перед\"}\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t{([-1, 1] as const).map((direction) => (\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tkey={direction}\n\t\t\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\t\t\tonClick={() =>\n\t\t\t\t\t\t\t\t\teditor.execute((current) => moveTableDocumentAxisGroup(current, axis, focus[axis], direction))\n\t\t\t\t\t\t\t\t}>\n\t\t\t\t\t\t\t\tПереместить {axis === \"row\" ? (direction === -1 ? \"выше\" : \"ниже\") : direction === -1 ? \"левее\" : \"правее\"}\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t))}\n\t\t\t\t\t\t<Button tone=\"error\" disabled={disabled} onClick={() => setRemoving(axis)}>\n\t\t\t\t\t\t\tУдалить {axis === \"row\" ? \"строку\" : \"столбец\"}\n\t\t\t\t\t\t</Button>\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\t\t\t\t<Button\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\tconst cells = document.columns.map(() => ({ id: uuidv4(), value: createEmptyValue() }));\n\t\t\t\t\t\tconst id = uuidv4();\n\t\t\t\t\t\teditor.execute((current) => insertTableDocumentAxis(current, \"row\", current.headerRowCount, id, cells, \"header\"));\n\t\t\t\t\t}}>\n\t\t\t\t\tДобавить строку заголовка\n\t\t\t\t</Button>\n\t\t\t</details>\n\t\t\t<Dialog\n\t\t\t\topen={Boolean(removing)}\n\t\t\t\tonClose={() => setRemoving(null)}\n\t\t\t\ttitle=\"Удалить часть таблицы?\"\n\t\t\t\tdescription={`Будет удалено ${group?.count ?? 0} ${removing === \"row\" ? \"строк\" : \"столбцов\"}, включая скрытое объединением содержимое. Объединённая группа удаляется целиком. До сохранения действие можно отменить.`}>\n\t\t\t\t<div className={styles.toolbar}>\n\t\t\t\t\t<Button onClick={() => setRemoving(null)}>Не удалять</Button>\n\t\t\t\t\t<Button\n\t\t\t\t\t\ttone=\"error\"\n\t\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\t\tonClick={() => {\n\t\t\t\t\t\t\tif (removing) editor.execute((current) => deleteTableDocumentAxisGroup(current, removing, focus[removing]));\n\t\t\t\t\t\t\tsetRemoving(null);\n\t\t\t\t\t\t}}>\n\t\t\t\t\t\tУдалить группу\n\t\t\t\t\t</Button>\n\t\t\t\t</div>\n\t\t\t</Dialog>\n\t\t</>\n\t);\n}\n","import {\n\tmergeTableDocumentCells,\n\tsplitTableDocumentCell,\n\ttype TableDocumentPosition\n} from \"@ryuzaki13/react-foundation-lib/table-document\";\n\nimport { Button } from \"../../button\";\nimport { CheckBox } from \"../../check-box\";\nimport { type TableEditorController } from \"../model/useTableEditor\";\n\nimport styles from \"./TableEditor.module.scss\";\n\ntype TableEditorToolbarProps<T> = {\n\treadonly editor: TableEditorController<T>;\n\treadonly disabled?: boolean;\n\treadonly extendSelection: boolean;\n\treadonly onExtendSelectionChange: (value: boolean) => void;\n};\n\n/** Явные названия действий вместо скрытых режимов merge/split из legacy. */\nexport function TableEditorToolbar<T>({ editor, disabled, extendSelection, onExtendSelectionChange }: TableEditorToolbarProps<T>) {\n\tconst { document, selection } = editor;\n\tconst end: TableDocumentPosition = { row: selection.row + selection.rowSpan - 1, column: selection.column + selection.columnSpan - 1 };\n\tconst isSingle = selection.rowSpan * selection.columnSpan === 1;\n\tconst crossesHeader = selection.row < document.headerRowCount && end.row >= document.headerRowCount;\n\tconst merge = document.merges.find(\n\t\t(range) =>\n\t\t\trange.row === selection.row &&\n\t\t\trange.column === selection.column &&\n\t\t\trange.rowSpan === selection.rowSpan &&\n\t\t\trange.columnSpan === selection.columnSpan\n\t);\n\treturn (\n\t\t<div className={styles.toolbar} role=\"group\" aria-label=\"История и объединение\">\n\t\t\t<Button disabled={disabled || !editor.canUndo} onClick={editor.undo}>\n\t\t\t\tОтменить\n\t\t\t</Button>\n\t\t\t<Button disabled={disabled || !editor.canRedo} onClick={editor.redo}>\n\t\t\t\tПовторить\n\t\t\t</Button>\n\t\t\t<Button\n\t\t\t\tdisabled={disabled || isSingle || crossesHeader || Boolean(merge)}\n\t\t\t\tonClick={() => editor.execute((current) => mergeTableDocumentCells(current, selection, end))}>\n\t\t\t\tОбъединить ячейки\n\t\t\t</Button>\n\t\t\t<Button disabled={disabled || !merge} onClick={() => editor.execute((current) => splitTableDocumentCell(current, selection))}>\n\t\t\t\tРазъединить ячейки\n\t\t\t</Button>\n\t\t\t<CheckBox label=\"Выделять диапазон\" value={extendSelection} disabled={disabled} onChange={onExtendSelectionChange} />\n\t\t\t<span role=\"status\">\n\t\t\t\tВыделение: {selection.rowSpan} × {selection.columnSpan}. Шаг {editor.historyPosition} из {editor.historyLength - 1}.\n\t\t\t</span>\n\t\t\t{crossesHeader ? <p>Заголовок и основную часть нельзя объединить в одну ячейку.</p> : null}\n\t\t</div>\n\t);\n}\n","import { useState, type ReactNode } from \"react\";\n\nimport { updateTableDocumentCell, type TableDocumentCell } from \"@ryuzaki13/react-foundation-lib/table-document\";\n\nimport { CheckBox } from \"../../check-box\";\nimport { Input, InputNumber } from \"../../input\";\nimport { type TableEditorController } from \"../model/useTableEditor\";\n\nimport styles from \"./TableEditor.module.scss\";\nimport { TableEditorGrid } from \"./TableEditorGrid\";\nimport { TableEditorStructure } from \"./TableEditorStructure\";\nimport { TableEditorToolbar } from \"./TableEditorToolbar\";\n\n/** Host задаёт редактор содержимого: plain text, Lexical или ссылки на документы без KTK-зависимости пакета. */\nexport type TableEditorValueProps<T> = {\n\treadonly cell: TableDocumentCell<T>;\n\treadonly disabled: boolean;\n\treadonly onChange: (value: T) => void;\n};\nexport type TableEditorProps<T> = {\n\treadonly editor: TableEditorController<T>;\n\treadonly renderCell: (cell: TableDocumentCell<T>) => ReactNode;\n\t/** Доступное текстовое представление preview, в котором интерактивные ссылки отключены. */\n\treadonly getCellText: (cell: TableDocumentCell<T>) => string;\n\treadonly renderValueEditor: (props: TableEditorValueProps<T>) => ReactNode;\n\treadonly createEmptyValue: () => T;\n\treadonly disabled?: boolean;\n};\n\n/** Композиция редактора, не владеющая transport, server state или форматом содержимого ячеек. */\nexport function TableEditor<T>({\n\teditor,\n\trenderCell,\n\tgetCellText,\n\trenderValueEditor,\n\tcreateEmptyValue,\n\tdisabled = false\n}: TableEditorProps<T>) {\n\tconst [extendSelection, setExtendSelection] = useState(false);\n\tconst { document, focus } = editor;\n\tconst cell = document.rows[focus.row].cells[focus.column];\n\treturn (\n\t\t<section className={styles.editor} aria-label=\"Конструктор таблицы\">\n\t\t\t<Input\n\t\t\t\tlabel=\"Название таблицы\"\n\t\t\t\tvalue={document.caption}\n\t\t\t\tdisabled={disabled}\n\t\t\t\tonChange={(caption) => editor.change({ ...document, caption: caption ?? \"\" })}\n\t\t\t/>\n\t\t\t<TableEditorToolbar\n\t\t\t\teditor={editor}\n\t\t\t\tdisabled={disabled}\n\t\t\t\textendSelection={extendSelection}\n\t\t\t\tonExtendSelectionChange={setExtendSelection}\n\t\t\t/>\n\t\t\t{editor.error ? <p role=\"alert\">{editor.error}</p> : null}\n\t\t\t<TableEditorGrid\n\t\t\t\teditor={editor}\n\t\t\t\tdisabled={disabled}\n\t\t\t\trenderCell={renderCell}\n\t\t\t\tgetCellText={getCellText}\n\t\t\t\textendSelection={extendSelection}\n\t\t\t/>\n\t\t\t<div className={styles.inspector}>\n\t\t\t\t<strong>\n\t\t\t\t\tЯчейка: строка {focus.row + 1}, столбец {focus.column + 1}\n\t\t\t\t</strong>\n\t\t\t\t{renderValueEditor({ cell, disabled, onChange: (value) => editor.change(updateTableDocumentCell(document, focus, value)) })}\n\t\t\t\t{editor.selection.rowSpan * editor.selection.columnSpan > 1 ? (\n\t\t\t\t\t<p>\n\t\t\t\t\t\tПри объединении показывается верхняя левая ячейка. Остальное содержимое сохранится и снова появится после\n\t\t\t\t\t\tразъединения.\n\t\t\t\t\t</p>\n\t\t\t\t) : null}\n\t\t\t</div>\n\t\t\t<TableEditorStructure editor={editor} disabled={disabled} createEmptyValue={createEmptyValue} />\n\t\t\t<div className={styles.toolbar}>\n\t\t\t\t<CheckBox\n\t\t\t\t\tlabel=\"Скрыть заголовки при публикации\"\n\t\t\t\t\tvalue={document.hideHeaders}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonChange={(hideHeaders) => editor.change({ ...document, hideHeaders })}\n\t\t\t\t/>\n\t\t\t\t<CheckBox\n\t\t\t\t\tlabel=\"Показывать номера строк\"\n\t\t\t\t\tvalue={document.showRowNumbers}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonChange={(showRowNumbers) => editor.change({ ...document, showRowNumbers })}\n\t\t\t\t/>\n\t\t\t\t<InputNumber\n\t\t\t\t\tlabel=\"Ширина выбранного столбца, px\"\n\t\t\t\t\tvalue={document.columns[focus.column].width ?? undefined}\n\t\t\t\t\tmin={40}\n\t\t\t\t\tmax={1600}\n\t\t\t\t\tdisabled={disabled}\n\t\t\t\t\tonChange={(width) => {\n\t\t\t\t\t\tif (width !== undefined && (width < 40 || width > 1600)) return;\n\t\t\t\t\t\teditor.change({\n\t\t\t\t\t\t\t...document,\n\t\t\t\t\t\t\tcolumns: document.columns.map((column, c) =>\n\t\t\t\t\t\t\t\tc === focus.column ? { ...column, width: width ?? null } : column\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t});\n\t\t\t\t\t}}\n\t\t\t\t/>\n\t\t\t</div>\n\t\t</section>\n\t);\n}\n","import { useState } from \"react\";\n\nimport {\n\tassertTableDocument,\n\texpandTableDocumentRange,\n\tgetTableDocumentCellRange,\n\ttype TableDocument,\n\ttype TableDocumentPosition,\n\ttype TableDocumentRange\n} from \"@ryuzaki13/react-foundation-lib/table-document\";\n\n/** Локальный draft: серверные версии, сохранение и конфликты принадлежат host-приложению. */\nexport type TableEditorController<T> = {\n\treadonly document: TableDocument<T>;\n\treadonly selection: TableDocumentRange;\n\treadonly focus: TableDocumentPosition;\n\treadonly canUndo: boolean;\n\treadonly canRedo: boolean;\n\treadonly historyPosition: number;\n\treadonly historyLength: number;\n\treadonly error: string | null;\n\treadonly select: (position: TableDocumentPosition, extend?: boolean) => void;\n\treadonly change: (document: TableDocument<T>) => void;\n\treadonly execute: (command: (document: TableDocument<T>) => TableDocument<T>) => void;\n\treadonly undo: () => void;\n\treadonly redo: () => void;\n};\n\n/**\n * История хранит документы со структурным разделением, а не копии server cache.\n * Новый initialDocument применяется только при новом mount/key: refetch не\n * затирает ввод. Копировальный bounded-copy-stack не подходит — он дедуплицирует\n * элементы и не сохраняет ветку undo/redo. Здесь максимум 100 редакторских шагов.\n */\nexport function useTableEditor<T>(initialDocument: TableDocument<T>): TableEditorController<T> {\n\tconst [state, setState] = useState(() => {\n\t\tassertTableDocument(initialDocument);\n\t\treturn {\n\t\t\tdocuments: [initialDocument],\n\t\t\tindex: 0,\n\t\t\tanchor: { row: 0, column: 0 },\n\t\t\tfocus: { row: 0, column: 0 },\n\t\t\terror: null as string | null\n\t\t};\n\t});\n\tconst document = state.documents[state.index];\n\tconst select = (position: TableDocumentPosition, extend = false) => {\n\t\tconst range = getTableDocumentCellRange(document, position);\n\t\tconst focus = { row: range.row, column: range.column };\n\t\tsetState((current) => ({ ...current, anchor: extend ? current.anchor : focus, focus, error: null }));\n\t};\n\tconst change = (next: TableDocument<T>) => {\n\t\tassertTableDocument(next);\n\t\tsetState((current) => {\n\t\t\tif (current.documents[current.index] === next) return current;\n\t\t\tconst documents = [...current.documents.slice(0, current.index + 1), next].slice(-101);\n\t\t\tconst position = {\n\t\t\t\trow: Math.min(current.focus.row, next.rows.length - 1),\n\t\t\t\tcolumn: Math.min(current.focus.column, next.columns.length - 1)\n\t\t\t};\n\t\t\tconst range = getTableDocumentCellRange(next, position);\n\t\t\tconst focus = { row: range.row, column: range.column };\n\t\t\treturn { documents, index: documents.length - 1, anchor: focus, focus, error: null };\n\t\t});\n\t};\n\tconst travel = (direction: -1 | 1) =>\n\t\tsetState((current) => {\n\t\t\tconst index = Math.max(0, Math.min(current.index + direction, current.documents.length - 1));\n\t\t\treturn { ...current, index, anchor: { row: 0, column: 0 }, focus: { row: 0, column: 0 }, error: null };\n\t\t});\n\treturn {\n\t\tdocument,\n\t\tselection: expandTableDocumentRange(document, state.anchor, state.focus),\n\t\tfocus: state.focus,\n\t\tcanUndo: state.index > 0,\n\t\tcanRedo: state.index < state.documents.length - 1,\n\t\thistoryPosition: state.index,\n\t\thistoryLength: state.documents.length,\n\t\terror: state.error,\n\t\tselect,\n\t\tchange,\n\t\tundo: () => travel(-1),\n\t\tredo: () => travel(1),\n\t\texecute: (command) => {\n\t\t\ttry {\n\t\t\t\tchange(command(document));\n\t\t\t} catch (error) {\n\t\t\t\t// Геометрические предусловия отклоняют команду, сохраняя draft и историю.\n\t\t\t\tsetState((current) => ({ ...current, error: error instanceof Error ? error.message : \"Не удалось изменить таблицу.\" }));\n\t\t\t}\n\t\t}\n\t};\n}\n"],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { type TableDocument, type TableDocumentPosition, type TableDocumentRange } from "@ryuzaki13/react-foundation-lib/table-document";
2
+ /** Локальный draft: серверные версии, сохранение и конфликты принадлежат host-приложению. */
3
+ export type TableEditorController<T> = {
4
+ readonly document: TableDocument<T>;
5
+ readonly selection: TableDocumentRange;
6
+ readonly focus: TableDocumentPosition;
7
+ readonly canUndo: boolean;
8
+ readonly canRedo: boolean;
9
+ readonly historyPosition: number;
10
+ readonly historyLength: number;
11
+ readonly error: string | null;
12
+ readonly select: (position: TableDocumentPosition, extend?: boolean) => void;
13
+ readonly change: (document: TableDocument<T>) => void;
14
+ readonly execute: (command: (document: TableDocument<T>) => TableDocument<T>) => void;
15
+ readonly undo: () => void;
16
+ readonly redo: () => void;
17
+ };
18
+ /**
19
+ * История хранит документы со структурным разделением, а не копии server cache.
20
+ * Новый initialDocument применяется только при новом mount/key: refetch не
21
+ * затирает ввод. Копировальный bounded-copy-stack не подходит — он дедуплицирует
22
+ * элементы и не сохраняет ветку undo/redo. Здесь максимум 100 редакторских шагов.
23
+ */
24
+ export declare function useTableEditor<T>(initialDocument: TableDocument<T>): TableEditorController<T>;
25
+ //# sourceMappingURL=useTableEditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTableEditor.d.ts","sourceRoot":"","sources":["../../../src/table-editor/model/useTableEditor.ts"],"names":[],"mappings":"AAEA,OAAO,EAIN,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,EACvB,MAAM,gDAAgD,CAAC;AAExD,6FAA6F;AAC7F,MAAM,MAAM,qBAAqB,CAAC,CAAC,IAAI;IACtC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IACpC,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,qBAAqB,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,qBAAqB,EAAE,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7E,QAAQ,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IACtD,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IACtF,QAAQ,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,IAAI,CAAC;CAC1B,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,CA0D7F"}
@@ -0,0 +1,10 @@
1
+ import { type TableDocument, type TableDocumentRow } from "@ryuzaki13/react-foundation-lib/table-document";
2
+ /**
3
+ * TanStack 9 получает стабильный anchor как accessor value: одинаковый текст
4
+ * соседних ячеек сам по себе никогда не объединяет их. Порядок документа не
5
+ * сортируется и не фильтруется; authored spans остаются authoritative.
6
+ */
7
+ export declare function useTableEditorTable<T>(document: TableDocument<T>): import("@tanstack/react-table").ReactTable<{
8
+ cellSpanningFeature: import("@tanstack/table-core").TableFeature;
9
+ }, TableDocumentRow<T>, {}>;
10
+ //# sourceMappingURL=useTableEditorTable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTableEditorTable.d.ts","sourceRoot":"","sources":["../../../src/table-editor/model/useTableEditorTable.ts"],"names":[],"mappings":"AAEA,OAAO,EAA6B,KAAK,aAAa,EAAE,KAAK,gBAAgB,EAAE,MAAM,gDAAgD,CAAC;AAKtI;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC,CAAC;;4BAqBhE"}
@@ -0,0 +1,21 @@
1
+ import { type ReactNode } from "react";
2
+ import { type TableDocumentCell } from "@ryuzaki13/react-foundation-lib/table-document";
3
+ import { type TableEditorController } from "../model/useTableEditor";
4
+ /** Host задаёт редактор содержимого: plain text, Lexical или ссылки на документы без KTK-зависимости пакета. */
5
+ export type TableEditorValueProps<T> = {
6
+ readonly cell: TableDocumentCell<T>;
7
+ readonly disabled: boolean;
8
+ readonly onChange: (value: T) => void;
9
+ };
10
+ export type TableEditorProps<T> = {
11
+ readonly editor: TableEditorController<T>;
12
+ readonly renderCell: (cell: TableDocumentCell<T>) => ReactNode;
13
+ /** Доступное текстовое представление preview, в котором интерактивные ссылки отключены. */
14
+ readonly getCellText: (cell: TableDocumentCell<T>) => string;
15
+ readonly renderValueEditor: (props: TableEditorValueProps<T>) => ReactNode;
16
+ readonly createEmptyValue: () => T;
17
+ readonly disabled?: boolean;
18
+ };
19
+ /** Композиция редактора, не владеющая transport, server state или форматом содержимого ячеек. */
20
+ export declare function TableEditor<T>({ editor, renderCell, getCellText, renderValueEditor, createEmptyValue, disabled }: TableEditorProps<T>): import("react").JSX.Element;
21
+ //# sourceMappingURL=TableEditor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableEditor.d.ts","sourceRoot":"","sources":["../../../src/table-editor/ui/TableEditor.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEjD,OAAO,EAA2B,KAAK,iBAAiB,EAAE,MAAM,gDAAgD,CAAC;AAIjH,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAOrE,gHAAgH;AAChH,MAAM,MAAM,qBAAqB,CAAC,CAAC,IAAI;IACtC,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;CACtC,CAAC;AACF,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI;IACjC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC1C,QAAQ,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;IAC/D,2FAA2F;IAC3F,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC;IAC7D,QAAQ,CAAC,iBAAiB,EAAE,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;IAC3E,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,iGAAiG;AACjG,wBAAgB,WAAW,CAAC,CAAC,EAAE,EAC9B,MAAM,EACN,UAAU,EACV,WAAW,EACX,iBAAiB,EACjB,gBAAgB,EAChB,QAAgB,EAChB,EAAE,gBAAgB,CAAC,CAAC,CAAC,+BAuErB"}
@@ -0,0 +1,14 @@
1
+ import { type ReactNode } from "react";
2
+ import { type TableDocumentCell } from "@ryuzaki13/react-foundation-lib/table-document";
3
+ import { type TableEditorController } from "../model/useTableEditor";
4
+ type TableEditorGridProps<T> = {
5
+ readonly editor: TableEditorController<T>;
6
+ readonly extendSelection: boolean;
7
+ readonly disabled?: boolean;
8
+ readonly renderCell: (cell: TableDocumentCell<T>) => ReactNode;
9
+ readonly getCellText: (cell: TableDocumentCell<T>) => string;
10
+ };
11
+ /** Доступная сетка: roving tabindex, стрелки/Shift и выбор диапазона без drag-only действий. */
12
+ export declare function TableEditorGrid<T>({ editor, extendSelection, disabled, renderCell, getCellText }: TableEditorGridProps<T>): import("react").JSX.Element;
13
+ export {};
14
+ //# sourceMappingURL=TableEditorGrid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableEditorGrid.d.ts","sourceRoot":"","sources":["../../../src/table-editor/ui/TableEditorGrid.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAEtD,OAAO,EAEN,KAAK,iBAAiB,EAEtB,MAAM,gDAAgD,CAAC;AAExD,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAKrE,KAAK,oBAAoB,CAAC,CAAC,IAAI;IAC9B,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC1C,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;IAC/D,QAAQ,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC;CAC7D,CAAC;AAEF,gGAAgG;AAChG,wBAAgB,eAAe,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,eAAe,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,EAAE,oBAAoB,CAAC,CAAC,CAAC,+BAiHzH"}
@@ -0,0 +1,10 @@
1
+ import { type TableEditorController } from "../model/useTableEditor";
2
+ type TableEditorStructureProps<T> = {
3
+ readonly editor: TableEditorController<T>;
4
+ readonly createEmptyValue: () => T;
5
+ readonly disabled?: boolean;
6
+ };
7
+ /** Вставка и доступный reorder без обязательного drag; удаление подтверждает весь затронутый блок. */
8
+ export declare function TableEditorStructure<T>({ editor, createEmptyValue, disabled }: TableEditorStructureProps<T>): import("react").JSX.Element;
9
+ export {};
10
+ //# sourceMappingURL=TableEditorStructure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TableEditorStructure.d.ts","sourceRoot":"","sources":["../../../src/table-editor/ui/TableEditorStructure.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAIrE,KAAK,yBAAyB,CAAC,CAAC,IAAI;IACnC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAC1C,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC;AAEF,sGAAsG;AACtG,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,gBAAgB,EAAE,QAAQ,EAAE,EAAE,yBAAyB,CAAC,CAAC,CAAC,+BAoF3G"}