@ryuzaki13/react-foundation-ui 2.1.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.
- package/COLOR_TOKENS_MIGRATION.md +224 -0
- package/README.md +14 -18
- package/dist/advanced-search/index.js +8 -8
- package/dist/badge/index.js +1 -1
- package/dist/barcode-scanner/index.js +2 -2
- package/dist/base-table/index.js +1 -1
- package/dist/button/index.js +1 -1
- package/dist/check-box/index.js +1 -1
- package/dist/chunks/{CalendarView-Bhaov_XE.js → CalendarView-Dm55k0bN.js} +2 -2
- package/dist/chunks/CalendarView-Dm55k0bN.js.map +1 -0
- package/dist/chunks/ImageViewerRuntime-HGBWp9NM.js.map +1 -1
- package/dist/chunks/{TextEditorLexicalClient-CSXZQOYo.js → TextEditorLexicalClient-D46Zed55.js} +6 -6
- package/dist/chunks/TextEditorLexicalClient-D46Zed55.js.map +1 -0
- package/dist/chunks/{badge-DUI2ET6q.js → badge-6mXO9BWP.js} +2 -2
- package/dist/chunks/badge-6mXO9BWP.js.map +1 -0
- package/dist/chunks/{base-table-BqW1n7tv.js → base-table-BWvKfI2W.js} +2 -2
- package/dist/chunks/{base-table-BqW1n7tv.js.map → base-table-BWvKfI2W.js.map} +1 -1
- package/dist/chunks/{button-BaUlN-nt.js → button-DF21yxVp.js} +3 -3
- package/dist/chunks/{button-BaUlN-nt.js.map → button-DF21yxVp.js.map} +1 -1
- package/dist/chunks/{check-box-CC8CDnSR.js → check-box-CZyhzmR0.js} +3 -3
- package/dist/chunks/{check-box-CC8CDnSR.js.map → check-box-CZyhzmR0.js.map} +1 -1
- package/dist/chunks/{context-menu-Dj6MXgv6.js → context-menu-DgvXGCuI.js} +3 -3
- package/dist/chunks/context-menu-DgvXGCuI.js.map +1 -0
- package/dist/chunks/{date-input-DkLfO3Ng.js → date-input-BwLOiGXp.js} +5 -5
- package/dist/chunks/{date-input-DkLfO3Ng.js.map → date-input-BwLOiGXp.js.map} +1 -1
- package/dist/chunks/dialog-Dqq8ZN99.js +50 -0
- package/dist/chunks/dialog-Dqq8ZN99.js.map +1 -0
- package/dist/chunks/{input-D1jOxm0t.js → input-DSPKgiCK.js} +2 -2
- package/dist/chunks/input-DSPKgiCK.js.map +1 -0
- package/dist/chunks/{input-files-CDGpJaUm.js → input-files-tIS17-zX.js} +3 -3
- package/dist/chunks/input-files-tIS17-zX.js.map +1 -0
- package/dist/chunks/{input-search-Ci1ubGox.js → input-search-Cat4c7SM.js} +2 -2
- package/dist/chunks/{input-search-Ci1ubGox.js.map → input-search-Cat4c7SM.js.map} +1 -1
- package/dist/chunks/misc-DeGboAt-.js.map +1 -1
- package/dist/chunks/{modal-CbAwLHlM.js → modal-dplfAaER.js} +2 -2
- package/dist/chunks/{modal-CbAwLHlM.js.map → modal-dplfAaER.js.map} +1 -1
- package/dist/chunks/{multi-select-V7SLAduU.js → multi-select-BZ9N6Dal.js} +4 -4
- package/dist/chunks/{multi-select-V7SLAduU.js.map → multi-select-BZ9N6Dal.js.map} +1 -1
- package/dist/chunks/{picker-DZ4-1BvK.js → picker-lvm82d0A.js} +3 -3
- package/dist/chunks/picker-lvm82d0A.js.map +1 -0
- package/dist/chunks/popover-Bne-Ljbs.js.map +1 -1
- package/dist/chunks/{radio-group-DhpP7JSJ.js → radio-group-CRk_1ODZ.js} +2 -2
- package/dist/chunks/radio-group-CRk_1ODZ.js.map +1 -0
- package/dist/chunks/{select-B7cWlJxL.js → select-aTGupQan.js} +4 -4
- package/dist/chunks/{select-B7cWlJxL.js.map → select-aTGupQan.js.map} +1 -1
- package/dist/chunks/{table-DMLFUBlb.js → table-DxoSOvQK.js} +2 -2
- package/dist/chunks/table-DxoSOvQK.js.map +1 -0
- package/dist/chunks/{ui.module-BsDio9A3.js → ui.module-oRwY3Zli.js} +2 -1
- package/dist/chunks/ui.module-oRwY3Zli.js.map +1 -0
- package/dist/chunks/{uiClasses-BVwFzzsr.js → uiClasses-CQj47jkF.js} +11 -2
- package/dist/chunks/uiClasses-CQj47jkF.js.map +1 -0
- package/dist/chunks/wheel-picker-FS58cRsQ.js.map +1 -1
- package/dist/context-menu/index.js +1 -1
- package/dist/date-input/index.js +2 -2
- package/dist/date-time-input/index.js +3 -3
- package/dist/dialog/index.js +2 -50
- package/dist/disclosure/index.js +2 -2
- package/dist/disclosure/index.js.map +1 -1
- package/dist/drop-zone/index.js +1 -1
- package/dist/drop-zone/index.js.map +1 -1
- package/dist/errors/index.js +4 -4
- package/dist/errors/index.js.map +1 -1
- package/dist/expandable-action-panel/index.js +1 -1
- package/dist/image/index.js +5 -5
- package/dist/image/index.js.map +1 -1
- package/dist/input/index.js +1 -1
- package/dist/input-date-time/index.js +2 -2
- package/dist/input-file/index.js +2 -2
- package/dist/input-files/index.js +1 -1
- package/dist/input-image/index.js +2 -2
- package/dist/input-search/index.js +1 -1
- package/dist/layout-picker/index.js +1 -1
- package/dist/layout-picker/index.js.map +1 -1
- package/dist/listbox/index.js +1 -1
- package/dist/modal/index.js +1 -1
- package/dist/multi-select/index.js +1 -1
- package/dist/notifications/index.js +1 -1
- package/dist/notifications/index.js.map +1 -1
- package/dist/option/index.js +1 -1
- package/dist/picker/index.js +1 -1
- package/dist/preset-range-date-input/index.js +1 -1
- package/dist/preset-select/index.js +1 -1
- package/dist/radio-button/index.js +2 -2
- package/dist/radio-group/index.js +1 -1
- package/dist/select/index.js +1 -1
- package/dist/simple-table/index.js +1 -1
- package/dist/slider/index.js +3 -3
- package/dist/slider/index.js.map +1 -1
- package/dist/state-select/index.js +1 -1
- package/dist/status-indicator/StatusIndicator.d.ts.map +1 -1
- package/dist/status-indicator/index.js +2 -0
- package/dist/status-indicator/index.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/switch/index.js +1 -1
- package/dist/table/index.js +1 -1
- package/dist/table-editor/index.d.ts +3 -0
- package/dist/table-editor/index.d.ts.map +1 -0
- package/dist/table-editor/index.js +462 -0
- package/dist/table-editor/index.js.map +1 -0
- package/dist/table-editor/model/useTableEditor.d.ts +25 -0
- package/dist/table-editor/model/useTableEditor.d.ts.map +1 -0
- package/dist/table-editor/model/useTableEditorTable.d.ts +10 -0
- package/dist/table-editor/model/useTableEditorTable.d.ts.map +1 -0
- package/dist/table-editor/ui/TableEditor.d.ts +21 -0
- package/dist/table-editor/ui/TableEditor.d.ts.map +1 -0
- package/dist/table-editor/ui/TableEditorGrid.d.ts +14 -0
- package/dist/table-editor/ui/TableEditorGrid.d.ts.map +1 -0
- package/dist/table-editor/ui/TableEditorStructure.d.ts +10 -0
- package/dist/table-editor/ui/TableEditorStructure.d.ts.map +1 -0
- package/dist/table-editor/ui/TableEditorToolbar.d.ts +11 -0
- package/dist/table-editor/ui/TableEditorToolbar.d.ts.map +1 -0
- package/dist/table-sorting/index.js +1 -1
- package/dist/tabs/index.js +2 -2
- package/dist/tabs/index.js.map +1 -1
- package/dist/tag-input/index.js +2 -2
- package/dist/tag-input/index.js.map +1 -1
- package/dist/text-editor/index.js +1 -1
- package/dist/textarea/index.js +2 -2
- package/dist/toggle/index.js +1 -1
- package/dist/toggle/index.js.map +1 -1
- package/dist/tree-select/index.js +3 -3
- package/dist/tree-select/index.js.map +1 -1
- package/dist/tree-table/index.js +1 -1
- package/dist/tree-table/index.js.map +1 -1
- package/dist/types.d.ts +3 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/uiClasses.d.ts.map +1 -1
- package/package.json +8 -3
- package/src/styles/_border.scss +2 -2
- package/src/styles/_color.scss +8 -8
- package/src/styles/_components.scss +2 -2
- package/src/styles/_normalize.scss +4 -4
- package/src/styles/config/_index.scss +95 -182
- package/src/styles/mixins/_controls.scss +43 -26
- package/src/styles/mixins/_mixin.scss +0 -187
- package/src/styles/mixins/controls.test.ts +28 -6
- package/src/styles/themes/_interactive-surface.scss +12 -12
- package/src/styles/themes/_theme.scss +21 -157
- package/src/styles/themes/theme.test.ts +66 -48
- package/storybook-static/assets/{Badge-BXbiidny.js → Badge-DLpkFLAr.js} +8 -2
- package/storybook-static/assets/{Badge.stories-DCOkVsyk.js → Badge.stories-DwwZ0O7j.js} +7 -1
- package/storybook-static/assets/{BadgeList-DgUScGRc.js → BadgeList-C0bhovUR.js} +2 -2
- package/storybook-static/assets/{BadgeList-CD5894x5.css → BadgeList-DbjeNuw0.css} +1 -1
- package/storybook-static/assets/{BarcodeScannerDialog.stories-7Bv_TejN.js → BarcodeScannerDialog.stories-DYXaW4Vw.js} +1 -1
- package/storybook-static/assets/{Button-0UDcBhBt.js → Button-B1nvnaMI.js} +12 -2
- package/storybook-static/assets/{Button-BpQRrzrS.js → Button-PAj4mH8o.js} +4 -2
- package/storybook-static/assets/Button.stories-CNvWyh5M.js +106 -0
- package/storybook-static/assets/{CalendarView-B93LI4f_.js → CalendarView-WUXapLvN.js} +1 -1
- package/storybook-static/assets/CalendarView-dgpVDRJR.css +1 -0
- package/storybook-static/assets/{CheckBox-BaAouU5d.js → CheckBox-B9f_n0Nh.js} +2 -2
- package/storybook-static/assets/{CheckBox-CFusvDS8.js → CheckBox-C3r_FdXc.js} +1 -1
- package/storybook-static/assets/{CheckBox.stories-Bdr_GC0M.js → CheckBox.stories-B5CFQBFx.js} +1 -1
- package/storybook-static/assets/{Color-6AOWCN3U-B8A6Hc7V.js → Color-6AOWCN3U-tYUAsbHo.js} +1 -1
- package/storybook-static/assets/{ContextMenu-CvHpWBGV.js → ContextMenu-C-T3O2d9.js} +1 -1
- package/storybook-static/assets/{ContextMenu-BcNU89-b.js → ContextMenu-PIvPPvq1.js} +1 -1
- package/storybook-static/assets/ContextMenu-yhWq2uJ3.css +1 -0
- package/storybook-static/assets/{ContextMenu.stories-DQDlVNxB.js → ContextMenu.stories-Bmy_0Oug.js} +1 -1
- package/storybook-static/assets/{CustomOptionButton-DkGlBvWP.js → CustomOptionButton-D_qTIop3.js} +1 -1
- package/storybook-static/assets/{DateInput-NkrPSWMl.js → DateInput-B7GZSkR3.js} +1 -1
- package/storybook-static/assets/{DateInput-CWsb-NhT.js → DateInput-C-goSdP-.js} +1 -1
- package/storybook-static/assets/{DateInput.stories-Bvz465d-.js → DateInput.stories-CeAMz_x1.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-DC6_r8SQ.js → DateRangePresetSelect-BZ9U_l_x.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-DQlphKzc.js → DateRangePresetSelect-BmjgWIxM.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect.stories-DVfqPYN5.js → DateRangePresetSelect.stories-5UGP9HcH.js} +1 -1
- package/storybook-static/assets/{Detail-CXQYyd94.js → Detail-C6duvCft.js} +1 -1
- package/storybook-static/assets/{Detail.stories-BEXByYXt.js → Detail.stories-DQZciNeZ.js} +1 -1
- package/storybook-static/assets/{Dialog-CyYTYgbp.js → Dialog-87D5Shqd.js} +1 -1
- package/storybook-static/assets/{Dialog-B2UTbDCv.js → Dialog-Bx4-acbv.js} +1 -1
- package/storybook-static/assets/{Dialog.stories-BWluB4Ya.js → Dialog.stories-BgOQABzP.js} +1 -1
- package/storybook-static/assets/{Disclosure-Dv5XOsna.js → Disclosure-ZctFZjdw.js} +1 -1
- package/storybook-static/assets/{Disclosure.stories-BxK_fmJE.js → Disclosure.stories-BioI8Dpv.js} +1 -1
- package/storybook-static/assets/{DisclosureGroup-B2O8D8CG.js → DisclosureGroup-Cn2EEocA.js} +1 -1
- package/storybook-static/assets/DisclosureGroup-D_ldcGgp.css +1 -0
- package/storybook-static/assets/{DocsRenderer-JROSPFPF-7N0jH0Oi.js → DocsRenderer-JROSPFPF-CoppGUHs.js} +1 -1
- package/storybook-static/assets/{DropZone-DL34ooyF.js → DropZone-68BioqBN.js} +1 -1
- package/storybook-static/assets/{DropZone-ZlPjdEuO.js → DropZone-BpInQyuE.js} +1 -1
- package/storybook-static/assets/{DropZone-C7HIN5ml.css → DropZone-C4gPTIz0.css} +1 -1
- package/storybook-static/assets/{DropZone.stories-BT9JvF9d.js → DropZone.stories-DhVyaedf.js} +1 -1
- package/storybook-static/assets/{DropdownMenu-BhC5f2Qc.js → DropdownMenu-Dw-i5abQ.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel-C77qVHBP.js → ExpandableActionPanel-Bb7Eo_iW.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel.stories-D1MJEw6F.js → ExpandableActionPanel.stories-B0XABlVT.js} +1 -1
- package/storybook-static/assets/{Flex-BHt3-yoh.js → Flex-CG5yKEBH.js} +1 -1
- package/storybook-static/assets/{Flex.stories-M8QVGuVA.js → Flex.stories-Cfx4TAqp.js} +1 -1
- package/storybook-static/assets/{FloatingPopover-Dch6_6e0.js → FloatingPopover-B8zZ8eYf.js} +1 -1
- package/storybook-static/assets/FloatingPopover-Di16BZj-.css +1 -0
- package/storybook-static/assets/FormattedTableCell-BzBZlmxd.js +15 -0
- package/storybook-static/assets/FormattedTableCell-CTIL_ueu.css +1 -0
- package/storybook-static/assets/{Grid-CcyaioK_.js → Grid-3MdRiyY4.js} +1 -1
- package/storybook-static/assets/{Grid.stories-CTHcYkKa.js → Grid.stories-DUfosHcu.js} +1 -1
- package/storybook-static/assets/{ImageCropper.stories-B84lQIPy.js → ImageCropper.stories-DBLj9S4C.js} +1 -1
- package/storybook-static/assets/{ImageRenderer-kTsPC-b5.js → ImageRenderer-bZHWE6lq.js} +1 -1
- package/storybook-static/assets/{ImageRenderer.stories-pozsCEPL.js → ImageRenderer.stories-BU2tt9QR.js} +1 -1
- package/storybook-static/assets/{ImageView.stories-CNttofCE.js → ImageView.stories-t_ree_kB.js} +1 -1
- package/storybook-static/assets/{ImageViewer.stories-D_7oQpyX.js → ImageViewer.stories-kodL93QT.js} +2 -2
- package/storybook-static/assets/{ImageViewerRuntime-Dnc70fBS.js → ImageViewerRuntime-Dkw7fwZ1.js} +1 -1
- package/storybook-static/assets/ImageViewerRuntime-MxAd4mC-.css +1 -0
- package/storybook-static/assets/{Input-DvRmrrtj.js → Input-C-Q_V0Uc.js} +1 -1
- package/storybook-static/assets/{Input-CYgnggvb.css → Input-CIA3PkB4.css} +1 -1
- package/storybook-static/assets/{Input-BO9q-b1i.js → Input-Ckb0G4jj.js} +1 -1
- package/storybook-static/assets/{Input.stories-DeKdGxIC.js → Input.stories-BZITY0Np.js} +1 -1
- package/storybook-static/assets/{InputDateTime-hqRtizlN.js → InputDateTime-DF-R-IPb.js} +1 -1
- package/storybook-static/assets/{InputDateTime.stories-BpGhWbRp.js → InputDateTime.stories-2ELFc29n.js} +1 -1
- package/storybook-static/assets/{InputFile-CExDbGYJ.js → InputFile-3Sn8IwRI.js} +1 -1
- package/storybook-static/assets/{InputFile-CTDHdo2g.js → InputFile-Xo-rxvud.js} +1 -1
- package/storybook-static/assets/{InputFile.stories-BIinoG-U.js → InputFile.stories-B4EHuTtj.js} +1 -1
- package/storybook-static/assets/{InputFiles-Cvdn_5IV.js → InputFiles-CRFuoEBd.js} +1 -1
- package/storybook-static/assets/{InputFiles-BWeRuTCh.js → InputFiles-DzdnkOiD.js} +1 -1
- package/storybook-static/assets/{InputFiles.stories-J2bb48sN.js → InputFiles.stories-BRCSXgg-.js} +1 -1
- package/storybook-static/assets/{InputFilesList-ByK52qUe.css → InputFilesList-BbwB0oHE.css} +1 -1
- package/storybook-static/assets/{InputFilesList-DO6IJW98.js → InputFilesList-CvL4pjsZ.js} +1 -1
- package/storybook-static/assets/{InputImage-C7zaIkCa.js → InputImage-B1v_PWfN.js} +1 -1
- package/storybook-static/assets/{InputImage-BtsIbqEc.js → InputImage-qAzSyHzj.js} +1 -1
- package/storybook-static/assets/{InputImage.stories--ewdBKin.js → InputImage.stories-4NLpODaa.js} +1 -1
- package/storybook-static/assets/{InteractiveComponents-Cy9Y2J_q.js → InteractiveComponents-Bdy-KTOF.js} +1 -1
- package/storybook-static/assets/{InteractiveComponents.stories-CgC4nhd3.js → InteractiveComponents.stories-C_ZAVn0R.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-CfgWKTDC.js → LayoutPicker-8wwVLPom.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-DhJgMxdf.js → LayoutPicker-B4eblsaF.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-BY4-fUQa.css → LayoutPicker-DaPDA0_s.css} +1 -1
- package/storybook-static/assets/{LayoutPicker.stories-Bli7rQRh.js → LayoutPicker.stories-BkA-VmHP.js} +1 -1
- package/storybook-static/assets/{Listbox-bq5sSQnZ.js → Listbox-ChaW3JrO.js} +1 -1
- package/storybook-static/assets/{Listbox-_MNXWNW7.js → Listbox-CyH7MftX.js} +1 -1
- package/storybook-static/assets/{Listbox.stories-BP9mqHoo.js → Listbox.stories-_31FVhoW.js} +1 -1
- package/storybook-static/assets/{Modal-CNt7-iWI.js → Modal-CaGOliEb.js} +1 -1
- package/storybook-static/assets/{Modal-Dwqp7agw.js → Modal-DGR9lZ4E.js} +1 -1
- package/storybook-static/assets/{Modal.stories-D2Hj75pl.js → Modal.stories-C1yvEVNj.js} +1 -1
- package/storybook-static/assets/{ModalManagerProvider-BoCpnUex.js → ModalManagerProvider-BrPY3nRM.js} +1 -1
- package/storybook-static/assets/{MultiSelect-B1BckUGX.js → MultiSelect-D-O71OBm.js} +1 -1
- package/storybook-static/assets/{MultiSelect-CTfbXQVD.js → MultiSelect-D4S4B3va.js} +1 -1
- package/storybook-static/assets/{MultiSelect.stories-BdMJk22c.js → MultiSelect.stories-B0QY0_Ru.js} +1 -1
- package/storybook-static/assets/{NoData-CNK8-UBc.js → NoData-B6xgAMXh.js} +1 -1
- package/storybook-static/assets/NotificationsHost-BIyd1XQ0.css +1 -0
- package/storybook-static/assets/{NotificationsHost-Cczj_pFY.js → NotificationsHost-DJ3Y-Bov.js} +1 -1
- package/storybook-static/assets/{NotificationsHost.stories-BPB6hfSI.js → NotificationsHost.stories-B2ULIi8d.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect-CahWMsCQ.js → ODataMultiSelect-0SfdyLn9.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect.stories-Dnyu2-gz.js → ODataMultiSelect.stories-BLq2Lzuq.js} +1 -1
- package/storybook-static/assets/{ODataSelect-DxbjbdNx.js → ODataSelect-CkdBSdJ6.js} +1 -1
- package/storybook-static/assets/{ODataSelect.stories-DfK9yHK7.js → ODataSelect.stories-OLMZHd_q.js} +1 -1
- package/storybook-static/assets/{ODataTreeMultiSelect-DOgHyKon.js → ODataTreeMultiSelect-DMLCMhQn.js} +1 -1
- package/storybook-static/assets/{ODataTreeMultiSelect.stories-Dv0-ackb.js → ODataTreeMultiSelect.stories-aY5Q0IHe.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect-DIoygv27.js → ODataTreeSelect-ME1K7NL2.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect.stories-D4mZcW9Z.js → ODataTreeSelect.stories-C7UPHKEr.js} +1 -1
- package/storybook-static/assets/{OneStepScroller-DNTilSDM.js → OneStepScroller-RRsghqzx.js} +1 -1
- package/storybook-static/assets/{Option-qcKM13Ly.js → Option-CcZ3aKLZ.js} +1 -1
- package/storybook-static/assets/Option-DD2t6DLq.css +1 -0
- package/storybook-static/assets/{OptionButton-DrNo-DMV.js → OptionButton-B-RTb3Ua.js} +1 -1
- package/storybook-static/assets/{PeriodSelect-Dk-_iKeR.js → PeriodSelect-B-89h-o8.js} +1 -1
- package/storybook-static/assets/{PeriodSelect-DjzmUohy.js → PeriodSelect-CUUixF0M.js} +1 -1
- package/storybook-static/assets/{PeriodSelect.stories-d58Lz3DJ.js → PeriodSelect.stories-CU1V-pP4.js} +1 -1
- package/storybook-static/assets/{PickerField-Dv1S8Wit.js → PickerField-DykK8Xgu.js} +1 -1
- package/storybook-static/assets/{PickerTriggerActions-dbXPGPRy.js → PickerTriggerActions-C2qYXlH1.js} +1 -1
- package/storybook-static/assets/{Popover-tPH8grZD.js → Popover-Bg-XuklM.js} +1 -1
- package/storybook-static/assets/{Popover-DMrefrsO.js → Popover-D_MNKdnD.js} +1 -1
- package/storybook-static/assets/{Popover.stories-BGgMddUi.js → Popover.stories-D2Asjc6d.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-Bi01AT1-.js → PresetRangeDateInput-B1KqD3aB.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-Bi5D7AvA.js → PresetRangeDateInput-CYXkpgts.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput.stories-BK9PG5Us.js → PresetRangeDateInput.stories-CTML1dIg.js} +1 -1
- package/storybook-static/assets/{PresetSelect-Bo_urWXj.js → PresetSelect-4PvR0s4U.js} +1 -1
- package/storybook-static/assets/{README-CsYvQc-H.js → README--I7LDhOP.js} +1 -1
- package/storybook-static/assets/{README-DQzhOQJs.js → README-1Ks0ldtQ.js} +1 -1
- package/storybook-static/assets/{README-BCXhBI3h.js → README-44qHXI_X.js} +1 -1
- package/storybook-static/assets/{README-oTjX8jJr.js → README-B3Q9ZlQz.js} +1 -1
- package/storybook-static/assets/{README-C1EYYUCN.js → README-B5MLKvrO.js} +1 -1
- package/storybook-static/assets/{README-CvomZuv4.js → README-B5vVbHbw.js} +1 -1
- package/storybook-static/assets/{README-CiRdh2G1.js → README-BJsszjH8.js} +1 -1
- package/storybook-static/assets/{README-CAYUX5Nb.js → README-BK-2_7T4.js} +1 -1
- package/storybook-static/assets/{README-qyGL-RQj.js → README-BKGcgtnD.js} +1 -1
- package/storybook-static/assets/{README-DJeVd42x.js → README-BNUdkNxv.js} +1 -1
- package/storybook-static/assets/{README-CUw7AGFv.js → README-BSSrY3Ri.js} +1 -1
- package/storybook-static/assets/{README-Bccm-jZn.js → README-BVOzG1wf.js} +1 -1
- package/storybook-static/assets/{README-BatM3k6o.js → README-BZbDJrol.js} +1 -1
- package/storybook-static/assets/{README-BrnWLQ7I.js → README-BcReoeGQ.js} +1 -1
- package/storybook-static/assets/{README-C9LAWG5A.js → README-BdgUDdVT.js} +1 -1
- package/storybook-static/assets/{README-DnE0W6xN.js → README-BpSdRy6R.js} +1 -1
- package/storybook-static/assets/{README-CHOXjCGT.js → README-BrduLUi1.js} +1 -1
- package/storybook-static/assets/{README-WDknu02X.js → README-Bt44WdOn.js} +1 -1
- package/storybook-static/assets/{README-DXV0j4Y9.js → README-Bta2DZoW.js} +1 -1
- package/storybook-static/assets/{README-BbwNWG_A.js → README-Bwa8ai1X.js} +1 -1
- package/storybook-static/assets/{README-DRTv3qN5.js → README-C1TqCBPf.js} +1 -1
- package/storybook-static/assets/{README-B2NTIwVC.js → README-C5Cq8Lo7.js} +1 -1
- package/storybook-static/assets/{README-BOY9oCZ5.js → README-CE0sa_3S.js} +1 -1
- package/storybook-static/assets/{README-DENkRq75.js → README-COnopkzM.js} +1 -1
- package/storybook-static/assets/{README-BRxnSb_H.js → README-CUEwtG21.js} +1 -1
- package/storybook-static/assets/{README-DOqinQqt.js → README-CVEiXGCU.js} +1 -1
- package/storybook-static/assets/{README-CSkB_qWo.js → README-CWxf5v2C.js} +1 -1
- package/storybook-static/assets/{README-DNkooR8C.js → README-CjbqfpYX.js} +1 -1
- package/storybook-static/assets/{README-XlmyqVIs.js → README-CnE5ZG98.js} +1 -1
- package/storybook-static/assets/{README-CLfxQA5V.js → README-Co-LXT0Y.js} +1 -1
- package/storybook-static/assets/{README-BPDYLPfh.js → README-CoJlt7mW.js} +1 -1
- package/storybook-static/assets/{README-G5BEMzLO.js → README-DFiFAUAq.js} +1 -1
- package/storybook-static/assets/{README-cmKi-NfO.js → README-DMCaXjMn.js} +1 -1
- package/storybook-static/assets/{README-ChyNimpn.js → README-DecmlELk.js} +3 -3
- package/storybook-static/assets/{README-Bsm0nJfv.js → README-Diow36TX.js} +1 -1
- package/storybook-static/assets/{README-BO0pPMhH.js → README-DlE5gepf.js} +1 -1
- package/storybook-static/assets/{README-DLL_V1qq.js → README-Dl_id19k.js} +1 -1
- package/storybook-static/assets/{README-D7IkoGLE.js → README-DpxWpc-I.js} +1 -1
- package/storybook-static/assets/{README-DI6PuVn_.js → README-Dqpnap9b.js} +1 -1
- package/storybook-static/assets/{README-DSx__uJY.js → README-DrSuJ2Ll.js} +1 -1
- package/storybook-static/assets/{README-CIy0Pj6l.js → README-Dtb7kJXX.js} +1 -1
- package/storybook-static/assets/{README-CgvojwYv.js → README-Ib9AxEso.js} +1 -1
- package/storybook-static/assets/{README-5MsrC0tc.js → README-NCp7adRE.js} +1 -1
- package/storybook-static/assets/{README-CDXBNJlU.js → README-SHZwgJhZ.js} +1 -1
- package/storybook-static/assets/{README-Bzz8tDjY.js → README-VY7CL7vi.js} +1 -1
- package/storybook-static/assets/{README-BIYrg5Jw.js → README-Ve2RJTbZ.js} +1 -1
- package/storybook-static/assets/{README-BTCDTs4l.js → README-bU5ZgdrN.js} +1 -1
- package/storybook-static/assets/{README-DqTSHU_3.js → README-kpAlQZLM.js} +1 -1
- package/storybook-static/assets/{README-iy7SbqPS.js → README-l0W43XHl.js} +1 -1
- package/storybook-static/assets/{README-BxY8B5jC.js → README-tetbJraG.js} +1 -1
- package/storybook-static/assets/{README-DnjCb77l.js → README-vUJFU3Tw.js} +1 -1
- package/storybook-static/assets/{README-lyLRoc9A.js → README-vjP8Z9fC.js} +1 -1
- package/storybook-static/assets/{README-DCitesDJ.js → README-ypHLhhny.js} +1 -1
- package/storybook-static/assets/{RadioButton-C5lYvVIl.js → RadioButton-ByRN6fXm.js} +1 -1
- package/storybook-static/assets/{RadioButton-_-grgF60.js → RadioButton-DRIJvobR.js} +1 -1
- package/storybook-static/assets/{RadioButton.stories-BNifE29D.js → RadioButton.stories-C6lOZsje.js} +1 -1
- package/storybook-static/assets/{RadioGroup-DWfHyBaQ.js → RadioGroup-5P3FMqFW.js} +1 -1
- package/storybook-static/assets/{RadioGroup-BU95Hbl0.css → RadioGroup-DHnDIEgi.css} +1 -1
- package/storybook-static/assets/{RadioGroup-CmDrRqLi.js → RadioGroup-Dskh-JZM.js} +1 -1
- package/storybook-static/assets/{RadioGroup.stories-1PW9Krj9.js → RadioGroup.stories-BDbOjwVa.js} +1 -1
- package/storybook-static/assets/{Scrollable-CWkMU4wH.js → Scrollable-Cat0ixOK.js} +1 -1
- package/storybook-static/assets/{Select-BCGnO525.js → Select-BiIixkSk.js} +1 -1
- package/storybook-static/assets/{Select-DYtEG5uI.js → Select-ImY9WR7I.js} +1 -1
- package/storybook-static/assets/{Select.stories-CgldXYRU.js → Select.stories-DR8qQrXW.js} +1 -1
- package/storybook-static/assets/{SerializableSelect-MmvKHZiv.js → SerializableSelect-C2swvXju.js} +1 -1
- package/storybook-static/assets/{SerializableSelect.stories-Di0iM37P.js → SerializableSelect.stories-CvoyFECC.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput-Ds5YsLHg.js → SingleDateTimeInput-CjixqW_K.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput-Cz2Y7KEq.js → SingleDateTimeInput-hV5Om2LV.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput.stories-BnuERNSZ.js → SingleDateTimeInput.stories-CPDP-M6P.js} +1 -1
- package/storybook-static/assets/Slider-DxdPx1Pb.css +1 -0
- package/storybook-static/assets/{Slider-Csaz4BeY.js → Slider-FbV_mr1Y.js} +1 -1
- package/storybook-static/assets/{Slider-CiZ7R_NX.js → Slider-PcbxPCWE.js} +1 -1
- package/storybook-static/assets/{Slider.stories-7Heg0Pgz.js → Slider.stories-CH9grPep.js} +1 -1
- package/storybook-static/assets/{SliderInput-bTh2JTHG.js → SliderInput-DPYcLCwD.js} +1 -1
- package/storybook-static/assets/{SliderInput-qWpLFzxj.js → SliderInput-iqnLqNiU.js} +1 -1
- package/storybook-static/assets/{SliderInput.stories-DR_zyE-u.js → SliderInput.stories-qVDa0KhJ.js} +1 -1
- package/storybook-static/assets/{Sortable-P86Ancoa.js → Sortable-DzJSN0MG.js} +1 -1
- package/storybook-static/assets/{Sortable.stories-iiOkIM-G.js → Sortable.stories-BaQ2T15L.js} +1 -1
- package/storybook-static/assets/{Splitter-mG3bB-U4.js → Splitter-Ka7c1ZDV.js} +1 -1
- package/storybook-static/assets/{Splitter.stories-WhQOQVRq.js → Splitter.stories-BbjjUT39.js} +1 -1
- package/storybook-static/assets/{StateSelect-De2PQDzp.js → StateSelect-CfyyDUiq.js} +1 -1
- package/storybook-static/assets/{StateSelect-u1kaZwdD.js → StateSelect-DSzDU5Jy.js} +1 -1
- package/storybook-static/assets/{StateSelect.stories-BO-C9UTF.js → StateSelect.stories-0c32Rlr2.js} +1 -1
- package/storybook-static/assets/{StatusIndicator-BiTbPB5o.js → StatusIndicator-CcCdDffH.js} +1 -1
- package/storybook-static/assets/StatusIndicator-CpCGmnO7.css +1 -0
- package/storybook-static/assets/StatusIndicator.stories-Bazi6rxF.js +31 -0
- package/storybook-static/assets/{StringToggle.stories-CBt8bXzz.js → StringToggle.stories-Bl6HAr4o.js} +1 -1
- package/storybook-static/assets/{Switch-BRKFbtp4.js → Switch-BqAkQzIJ.js} +1 -1
- package/storybook-static/assets/{Switch-BC2KYLX2.js → Switch-Vl7s55bO.js} +1 -1
- package/storybook-static/assets/{Switch.stories-BAmX4W8J.js → Switch.stories-Cq2n8Vr4.js} +1 -1
- package/storybook-static/assets/{Table-D1OJnVmO.js → Table-BgxoZKJs.js} +1 -1
- package/storybook-static/assets/Table-j_3ID7Xq.css +1 -0
- package/storybook-static/assets/{Table.stories-C_JSdhJl.js → Table.stories-DxnnXMZX.js} +3 -3
- package/storybook-static/assets/TableEditor-CaZCZgKf.css +1 -0
- package/storybook-static/assets/TableEditor.stories-D5Ke41-O.js +61 -0
- package/storybook-static/assets/{Tabs-DiUKiz-h.js → Tabs-BPJG7wBI.js} +1 -1
- package/storybook-static/assets/{Tabs.stories-DGys1vSD.js → Tabs.stories-cQ4RTo0w.js} +1 -1
- package/storybook-static/assets/{TabsBox-D-bkJX9j.css → TabsBox-B3REnb6D.css} +1 -1
- package/storybook-static/assets/{TabsBox-D4yfPiDY.js → TabsBox-CGgEovb9.js} +1 -1
- package/storybook-static/assets/{TagInput-ZyC-89b3.js → TagInput-CGHC-7Rv.js} +1 -1
- package/storybook-static/assets/{TagInput-ChmW4s9O.css → TagInput-RJbbcfoR.css} +1 -1
- package/storybook-static/assets/{TagInput.stories-hVoLW5qr.js → TagInput.stories-BSy_dJ5n.js} +1 -1
- package/storybook-static/assets/{Text-CMJA_7QZ.js → Text-D5fn4NbN.js} +1 -1
- package/storybook-static/assets/{Textarea-Du012ObX.js → Textarea-CbWAz4J8.js} +1 -1
- package/storybook-static/assets/{Textarea-DjKw5r4e.js → Textarea-pXxz-925.js} +1 -1
- package/storybook-static/assets/{Textarea.stories-ShFda4o7.js → Textarea.stories-BkPejDdf.js} +1 -1
- package/storybook-static/assets/{TimePanel-Bfkpbjrx.js → TimePanel-BJulRHL2.js} +1 -1
- package/storybook-static/assets/{TimePanel-Bh98qsCo.css → TimePanel-D9_hb7w4.css} +1 -1
- package/storybook-static/assets/{TimePanel.stories-4pV3fQVB.js → TimePanel.stories-CJmuKdfu.js} +1 -1
- package/storybook-static/assets/{Toggle-CPohFihI.js → Toggle-B2S8eW_z.js} +1 -1
- package/storybook-static/assets/Toggle-ClE8Zovo.css +1 -0
- package/storybook-static/assets/{Toggle-ChC8G1Et.js → Toggle-DjqQBHtJ.js} +1 -1
- package/storybook-static/assets/{Toggle.stories-B3H1M8Ra.js → Toggle.stories-7KRSUGU9.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-CbNz09Jk.js → TreeMultiSelect-B7Dd0sH5.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-BpuHCHgJ.js → TreeMultiSelect-DfvInPvn.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect.stories-Cmt05HgT.js → TreeMultiSelect.stories-DrokeiS6.js} +1 -1
- package/storybook-static/assets/{TreePickerBase-DGvBAQiy.js → TreePickerBase-CN9UeNWV.js} +1 -1
- package/storybook-static/assets/{TreePickerBase-B6DED6Hz.css → TreePickerBase-CmFF9pWE.css} +1 -1
- package/storybook-static/assets/{TreeSelect-DvAlRur3.js → TreeSelect-D3s-_McF.js} +1 -1
- package/storybook-static/assets/{TreeSelect-C_GCYsA3.js → TreeSelect-DPX2Q1Sv.js} +1 -1
- package/storybook-static/assets/{TreeSelect.stories-Cch2A2z5.js → TreeSelect.stories-DvUGVU34.js} +1 -1
- package/storybook-static/assets/TreeTable-BvB3kj4h.css +1 -0
- package/storybook-static/assets/{TreeTable-CmVxMvld.js → TreeTable-By3223dp.js} +1 -1
- package/storybook-static/assets/{TreeTable.stories-B46N8o8E.js → TreeTable.stories-DKAKV_e2.js} +2 -2
- package/storybook-static/assets/{array-D-_yMMUK-DYqn1Ozn.js → array-D-_yMMUK-DnJ_b27D.js} +1 -1
- package/storybook-static/assets/{blocks-Bu5I-6jJ.js → blocks-C4R1QC9R.js} +3 -3
- package/storybook-static/assets/{check-BdRTIK6S.js → check-DkXl--jW.js} +1 -1
- package/storybook-static/assets/{chevron-down-EtmpBUf8.js → chevron-down-DnX0I3Pg.js} +1 -1
- package/storybook-static/assets/{chevron-left-CTLa8HIb.js → chevron-left-18ya0d2d.js} +1 -1
- package/storybook-static/assets/{chevron-right-D_c_Cvi0.js → chevron-right-DilGYzJ6.js} +1 -1
- package/storybook-static/assets/{chunk-W22LQPXL-B7ERYz6B.js → chunk-W22LQPXL-WTP7vHyr.js} +1 -1
- package/storybook-static/assets/{circle-alert-Dj1kZNNX.js → circle-alert-DVNv_dVS.js} +1 -1
- package/storybook-static/assets/{circle-check-B1w7Ls8y.js → circle-check-vIdCi5Zq.js} +1 -1
- package/storybook-static/assets/{components-DqRn1i2k.js → components-BtEbmBZQ.js} +3 -3
- package/storybook-static/assets/{contextMenu-ylNgC9hS.js → contextMenu-1dx6rzYN.js} +1 -1
- package/storybook-static/assets/{defaultRenderers-CyUQG_f-.js → defaultRenderers-UxEpV_2H.js} +1 -1
- package/storybook-static/assets/{download-dw_WzNlC.js → download-37V1rEcU.js} +1 -1
- package/storybook-static/assets/{floating-ui.react-C9sdi3nv.js → floating-ui.react-DT-xu5am.js} +1 -1
- package/storybook-static/assets/{formatters-DVE1YVNQ-CMsbb5-m.js → formatters-DVE1YVNQ-YIdRxgw-.js} +1 -1
- package/storybook-static/assets/{foundationApi-BJETphYp.js → foundationApi-FaYaPMaR.js} +1 -1
- package/storybook-static/assets/{foundationLib-DfRlYoD7.js → foundationLib-DLCLUXOF.js} +1 -1
- package/storybook-static/assets/{hooks-B-ZW7F36.js → hooks-BuU9-pEZ.js} +1 -1
- package/storybook-static/assets/{iframe-D0R9pFj7.js → iframe-0M2vpakb.js} +4 -4
- package/storybook-static/assets/iframe-BMXB4CtM.js +1 -0
- package/storybook-static/assets/iframe-BT_jngkf.css +1 -0
- package/storybook-static/assets/{info-B0qzF0Mr.js → info-2PUHH67D.js} +1 -1
- package/storybook-static/assets/odata-DIkxH78d.js +1 -0
- package/storybook-static/assets/odataStoryFixtures-BDQiSxyk.js +25 -0
- package/storybook-static/assets/{react-ClkCNz5L.js → react-CfjIdTfH.js} +1 -1
- package/storybook-static/assets/{refresh-cw-K68D1zRy.js → refresh-cw-CHFG8NIc.js} +1 -1
- package/storybook-static/assets/{settings-2-D0jFfhpt.js → settings-2-CYde2-4U.js} +1 -1
- package/storybook-static/assets/{sortable-fWu4d9fl.js → sortable-Cy9ZqA3f.js} +1 -1
- package/storybook-static/assets/{syntaxhighlighter-QEQV7K2Y-Cs3Bxe3I.js → syntaxhighlighter-QEQV7K2Y-C2U-3XXV.js} +1 -1
- package/storybook-static/assets/tableFeatures-Dx3U-F9E.js +1 -0
- package/storybook-static/assets/{trash-2-Bj60L0sq.js → trash-2-7-oMZEr8.js} +1 -1
- package/storybook-static/assets/{triangle-alert-CmzQ-r9i.js → triangle-alert-BSmuthen.js} +1 -1
- package/storybook-static/assets/ui-DSS1yTEO.css +1 -0
- package/storybook-static/assets/ui.module-SH8ehXul.js +1 -0
- package/storybook-static/assets/uiClasses-e9OQfdw2.js +1 -0
- package/storybook-static/assets/{useODataSelectBase-CC4MnYeK.js → useODataSelectBase-C3B3Xw87.js} +1 -1
- package/storybook-static/assets/{useODataTreeData-DsQmGQij.js → useODataTreeData-deUW5mSv.js} +1 -1
- package/storybook-static/assets/{usePickerDefaultFilter-BMBLqfz8.js → usePickerDefaultFilter-ien2ZY7g.js} +1 -1
- package/storybook-static/assets/{usePickerQuery-Qg7qGfmP.js → usePickerQuery-DdE3I7AV.js} +1 -1
- package/storybook-static/assets/{usePickerTriggerController-D-mhhmpS.js → usePickerTriggerController-ZRvj4FHy.js} +1 -1
- package/storybook-static/assets/useTable-CK68Q4S4.js +1 -0
- package/storybook-static/assets/{x-DU3Tpzms.js → x-NXcyLtyX.js} +1 -1
- package/storybook-static/iframe.html +3 -3
- package/storybook-static/index.json +1 -1
- package/storybook-static/project.json +1 -1
- package/dist/chunks/CalendarView-Bhaov_XE.js.map +0 -1
- package/dist/chunks/TextEditorLexicalClient-CSXZQOYo.js.map +0 -1
- package/dist/chunks/badge-DUI2ET6q.js.map +0 -1
- package/dist/chunks/context-menu-Dj6MXgv6.js.map +0 -1
- package/dist/chunks/input-D1jOxm0t.js.map +0 -1
- package/dist/chunks/input-files-CDGpJaUm.js.map +0 -1
- package/dist/chunks/picker-DZ4-1BvK.js.map +0 -1
- package/dist/chunks/radio-group-DhpP7JSJ.js.map +0 -1
- package/dist/chunks/table-DMLFUBlb.js.map +0 -1
- package/dist/chunks/ui.module-BsDio9A3.js.map +0 -1
- package/dist/chunks/uiClasses-BVwFzzsr.js.map +0 -1
- package/dist/dialog/index.js.map +0 -1
- package/storybook-static/assets/Button.stories-CLMnxj3w.js +0 -93
- package/storybook-static/assets/CalendarView-DKvrkS40.css +0 -1
- package/storybook-static/assets/ContextMenu-CFPrlO2u.css +0 -1
- package/storybook-static/assets/DisclosureGroup-CVFMwx22.css +0 -1
- package/storybook-static/assets/FloatingPopover-jwILx9b0.css +0 -1
- package/storybook-static/assets/FormattedTableCell-AZc2IHfK.css +0 -1
- package/storybook-static/assets/FormattedTableCell-CXyG4Yj2.js +0 -15
- package/storybook-static/assets/ImageViewerRuntime-CRmlrtpL.css +0 -1
- package/storybook-static/assets/NotificationsHost-D5Pvn4eu.css +0 -1
- package/storybook-static/assets/Option-DXh7BISz.css +0 -1
- package/storybook-static/assets/Slider-CK-W2ZTO.css +0 -1
- package/storybook-static/assets/StatusIndicator-CU9ICMrC.css +0 -1
- package/storybook-static/assets/StatusIndicator.stories-COaZnrFa.js +0 -31
- package/storybook-static/assets/Table-BGvRn9y0.css +0 -1
- package/storybook-static/assets/Toggle-fKG2dFY0.css +0 -1
- package/storybook-static/assets/TreeTable--ZoksUiw.css +0 -1
- package/storybook-static/assets/iframe-COgZ5GwG.js +0 -1
- package/storybook-static/assets/iframe-IhWQT6NX.css +0 -1
- package/storybook-static/assets/odata-tqjAk19x.js +0 -1
- package/storybook-static/assets/odataStoryFixtures-D2yHs_jK.js +0 -25
- package/storybook-static/assets/ui-C3BskXT9.css +0 -1
- package/storybook-static/assets/ui.module-31LPbZGK.js +0 -1
- package/storybook-static/assets/uiClasses-Bz6cvlDQ.js +0 -1
|
@@ -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"}
|