@ryuzaki13/react-foundation-ui 3.0.0 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/table-editor/index.js +20 -17
- package/dist/table-editor/index.js.map +1 -1
- package/dist/table-editor/ui/TableEditorGrid.d.ts.map +1 -1
- package/package.json +1 -1
- package/storybook-static/assets/{Badge-DLpkFLAr.js → Badge-CPJUZBAx.js} +1 -1
- package/storybook-static/assets/{Badge.stories-DwwZ0O7j.js → Badge.stories-BV9Ob_Oc.js} +1 -1
- package/storybook-static/assets/{BadgeList-C0bhovUR.js → BadgeList-CtdWGEn6.js} +1 -1
- package/storybook-static/assets/{BarcodeScannerDialog.stories-DYXaW4Vw.js → BarcodeScannerDialog.stories-B_wBhs1h.js} +1 -1
- package/storybook-static/assets/{Button-PAj4mH8o.js → Button-BO03YvyD.js} +1 -1
- package/storybook-static/assets/{Button-B1nvnaMI.js → Button-DJgPWpef.js} +1 -1
- package/storybook-static/assets/{Button.stories-CNvWyh5M.js → Button.stories-DhqncZmo.js} +1 -1
- package/storybook-static/assets/{CalendarView-WUXapLvN.js → CalendarView-Ctgt0vSh.js} +1 -1
- package/storybook-static/assets/{CheckBox-B9f_n0Nh.js → CheckBox-BOIYiJm5.js} +1 -1
- package/storybook-static/assets/{CheckBox-C3r_FdXc.js → CheckBox-x4MtRKCD.js} +1 -1
- package/storybook-static/assets/{CheckBox.stories-B5CFQBFx.js → CheckBox.stories-B-YhjVpn.js} +1 -1
- package/storybook-static/assets/{Color-6AOWCN3U-tYUAsbHo.js → Color-6AOWCN3U-D2hSJGdc.js} +1 -1
- package/storybook-static/assets/{ContextMenu-PIvPPvq1.js → ContextMenu--tEb29lb.js} +1 -1
- package/storybook-static/assets/{ContextMenu-C-T3O2d9.js → ContextMenu-ConDIkSx.js} +1 -1
- package/storybook-static/assets/{ContextMenu.stories-Bmy_0Oug.js → ContextMenu.stories-DdZB2dQb.js} +1 -1
- package/storybook-static/assets/{CustomOptionButton-D_qTIop3.js → CustomOptionButton-D9_PjL0f.js} +1 -1
- package/storybook-static/assets/{DateInput-B7GZSkR3.js → DateInput-D1XJQ-6l.js} +1 -1
- package/storybook-static/assets/{DateInput-C-goSdP-.js → DateInput-Dh0ZTlaK.js} +1 -1
- package/storybook-static/assets/{DateInput.stories-CeAMz_x1.js → DateInput.stories-YIy6ns7j.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-BZ9U_l_x.js → DateRangePresetSelect-CfCtwULa.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect-BmjgWIxM.js → DateRangePresetSelect-Xy9xMJwE.js} +1 -1
- package/storybook-static/assets/{DateRangePresetSelect.stories-5UGP9HcH.js → DateRangePresetSelect.stories-Cp8bCPPr.js} +1 -1
- package/storybook-static/assets/{Detail-C6duvCft.js → Detail-V4a7PEQy.js} +1 -1
- package/storybook-static/assets/{Detail.stories-DQZciNeZ.js → Detail.stories-CaltBUzP.js} +1 -1
- package/storybook-static/assets/{Dialog-Bx4-acbv.js → Dialog-CwIJrdeS.js} +1 -1
- package/storybook-static/assets/{Dialog-87D5Shqd.js → Dialog-TBOx7xuG.js} +1 -1
- package/storybook-static/assets/{Dialog.stories-BgOQABzP.js → Dialog.stories-BWXw_XOW.js} +1 -1
- package/storybook-static/assets/{Disclosure-ZctFZjdw.js → Disclosure-ptHsbm71.js} +1 -1
- package/storybook-static/assets/{Disclosure.stories-BioI8Dpv.js → Disclosure.stories-CG2LclkF.js} +1 -1
- package/storybook-static/assets/{DisclosureGroup-Cn2EEocA.js → DisclosureGroup-CseVXRGI.js} +1 -1
- package/storybook-static/assets/{DocsRenderer-JROSPFPF-CoppGUHs.js → DocsRenderer-JROSPFPF-Cz6wf1E5.js} +1 -1
- package/storybook-static/assets/{DropZone-68BioqBN.js → DropZone-CRai68J2.js} +1 -1
- package/storybook-static/assets/{DropZone-BpInQyuE.js → DropZone-D_zss6IH.js} +1 -1
- package/storybook-static/assets/{DropZone.stories-DhVyaedf.js → DropZone.stories-DieoYknx.js} +1 -1
- package/storybook-static/assets/{DropdownMenu-Dw-i5abQ.js → DropdownMenu-BojaSt_0.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel-Bb7Eo_iW.js → ExpandableActionPanel-BiS2kSkL.js} +1 -1
- package/storybook-static/assets/{ExpandableActionPanel.stories-B0XABlVT.js → ExpandableActionPanel.stories-CMaKcNjZ.js} +1 -1
- package/storybook-static/assets/{Flex-CG5yKEBH.js → Flex-4xyVvQjb.js} +1 -1
- package/storybook-static/assets/{Flex.stories-Cfx4TAqp.js → Flex.stories-C3tQavbS.js} +1 -1
- package/storybook-static/assets/{FloatingPopover-B8zZ8eYf.js → FloatingPopover-D-hgsDWB.js} +1 -1
- package/storybook-static/assets/{FormattedTableCell-BzBZlmxd.js → FormattedTableCell-BIx_wHxt.js} +1 -1
- package/storybook-static/assets/{Grid-3MdRiyY4.js → Grid-D_tQSQsa.js} +1 -1
- package/storybook-static/assets/{Grid.stories-DUfosHcu.js → Grid.stories-rm-LBWqc.js} +1 -1
- package/storybook-static/assets/{ImageCropper.stories-DBLj9S4C.js → ImageCropper.stories-TWj6EUhv.js} +1 -1
- package/storybook-static/assets/{ImageRenderer-bZHWE6lq.js → ImageRenderer-fJY5cwIZ.js} +1 -1
- package/storybook-static/assets/{ImageRenderer.stories-BU2tt9QR.js → ImageRenderer.stories-COWaXJSu.js} +1 -1
- package/storybook-static/assets/{ImageView.stories-t_ree_kB.js → ImageView.stories-CarFyXxF.js} +1 -1
- package/storybook-static/assets/{ImageViewer.stories-kodL93QT.js → ImageViewer.stories-WwLkgsZl.js} +2 -2
- package/storybook-static/assets/{ImageViewerRuntime-Dkw7fwZ1.js → ImageViewerRuntime-Dg1heG9I.js} +1 -1
- package/storybook-static/assets/{Input-Ckb0G4jj.js → Input-BqipFubD.js} +1 -1
- package/storybook-static/assets/{Input-C-Q_V0Uc.js → Input-CRMRR0du.js} +1 -1
- package/storybook-static/assets/{Input.stories-BZITY0Np.js → Input.stories-BZBQd_Yo.js} +1 -1
- package/storybook-static/assets/{InputDateTime-DF-R-IPb.js → InputDateTime-BKzFQcD2.js} +1 -1
- package/storybook-static/assets/{InputDateTime.stories-2ELFc29n.js → InputDateTime.stories-B3dXU0or.js} +1 -1
- package/storybook-static/assets/{InputFile-3Sn8IwRI.js → InputFile-C3iCB2fV.js} +1 -1
- package/storybook-static/assets/{InputFile-Xo-rxvud.js → InputFile-Dl4khE53.js} +1 -1
- package/storybook-static/assets/{InputFile.stories-B4EHuTtj.js → InputFile.stories-DYqlThPW.js} +1 -1
- package/storybook-static/assets/{InputFiles-CRFuoEBd.js → InputFiles-CWyvWdT6.js} +1 -1
- package/storybook-static/assets/{InputFiles-DzdnkOiD.js → InputFiles-fSWRgPQt.js} +1 -1
- package/storybook-static/assets/{InputFiles.stories-BRCSXgg-.js → InputFiles.stories-wwrSxxCj.js} +1 -1
- package/storybook-static/assets/{InputFilesList-CvL4pjsZ.js → InputFilesList-dPZoA3cU.js} +1 -1
- package/storybook-static/assets/{InputImage-B1v_PWfN.js → InputImage-DbK6OW82.js} +1 -1
- package/storybook-static/assets/{InputImage-qAzSyHzj.js → InputImage-hI2j2ETf.js} +1 -1
- package/storybook-static/assets/{InputImage.stories-4NLpODaa.js → InputImage.stories-BmjAuHh6.js} +1 -1
- package/storybook-static/assets/{InteractiveComponents-Bdy-KTOF.js → InteractiveComponents-CP9rMbrV.js} +1 -1
- package/storybook-static/assets/{InteractiveComponents.stories-C_ZAVn0R.js → InteractiveComponents.stories-DWGP7kN9.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-8wwVLPom.js → LayoutPicker-B6l0KM01.js} +1 -1
- package/storybook-static/assets/{LayoutPicker-B4eblsaF.js → LayoutPicker-BqPt4z1o.js} +1 -1
- package/storybook-static/assets/{LayoutPicker.stories-BkA-VmHP.js → LayoutPicker.stories-CobjDPnt.js} +1 -1
- package/storybook-static/assets/{Listbox-CyH7MftX.js → Listbox-D8wHXixj.js} +1 -1
- package/storybook-static/assets/{Listbox-ChaW3JrO.js → Listbox-VYmcGjMI.js} +1 -1
- package/storybook-static/assets/{Listbox.stories-_31FVhoW.js → Listbox.stories-DwGQUQ0i.js} +1 -1
- package/storybook-static/assets/{Modal-DGR9lZ4E.js → Modal-J__v8Hop.js} +1 -1
- package/storybook-static/assets/{Modal-CaGOliEb.js → Modal-gdYxFkXo.js} +1 -1
- package/storybook-static/assets/{Modal.stories-C1yvEVNj.js → Modal.stories-DIs97N2U.js} +1 -1
- package/storybook-static/assets/{ModalManagerProvider-BrPY3nRM.js → ModalManagerProvider-LwIYImtY.js} +1 -1
- package/storybook-static/assets/{MultiSelect-D4S4B3va.js → MultiSelect-DoJsmrgD.js} +1 -1
- package/storybook-static/assets/{MultiSelect-D-O71OBm.js → MultiSelect-DxLtgKfo.js} +1 -1
- package/storybook-static/assets/{MultiSelect.stories-B0QY0_Ru.js → MultiSelect.stories-gbsa3dqJ.js} +1 -1
- package/storybook-static/assets/{NoData-B6xgAMXh.js → NoData-o_sLpPoU.js} +1 -1
- package/storybook-static/assets/{NotificationsHost-DJ3Y-Bov.js → NotificationsHost-BMBxunA0.js} +1 -1
- package/storybook-static/assets/{NotificationsHost.stories-B2ULIi8d.js → NotificationsHost.stories-BzoCtqMU.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect-0SfdyLn9.js → ODataMultiSelect-CcbmxqpZ.js} +1 -1
- package/storybook-static/assets/{ODataMultiSelect.stories-BLq2Lzuq.js → ODataMultiSelect.stories-zw67beZc.js} +1 -1
- package/storybook-static/assets/{ODataSelect-CkdBSdJ6.js → ODataSelect-CXW8j-z7.js} +1 -1
- package/storybook-static/assets/{ODataSelect.stories-OLMZHd_q.js → ODataSelect.stories-TQM6_DYK.js} +1 -1
- package/storybook-static/assets/{ODataTreeMultiSelect-DMLCMhQn.js → ODataTreeMultiSelect-DGF8-pWk.js} +1 -1
- package/storybook-static/assets/{ODataTreeMultiSelect.stories-aY5Q0IHe.js → ODataTreeMultiSelect.stories-Dd_0ra7b.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect-ME1K7NL2.js → ODataTreeSelect-VuBknyZd.js} +1 -1
- package/storybook-static/assets/{ODataTreeSelect.stories-C7UPHKEr.js → ODataTreeSelect.stories-BtzFf_u0.js} +1 -1
- package/storybook-static/assets/{OneStepScroller-RRsghqzx.js → OneStepScroller-DZNxJvgJ.js} +1 -1
- package/storybook-static/assets/{Option-CcZ3aKLZ.js → Option-B4DvYPy2.js} +1 -1
- package/storybook-static/assets/{OptionButton-B-RTb3Ua.js → OptionButton-C4VuB9n6.js} +1 -1
- package/storybook-static/assets/{PeriodSelect-CUUixF0M.js → PeriodSelect-B8ox22dv.js} +1 -1
- package/storybook-static/assets/{PeriodSelect-B-89h-o8.js → PeriodSelect-DSxwgwCW.js} +1 -1
- package/storybook-static/assets/{PeriodSelect.stories-CU1V-pP4.js → PeriodSelect.stories-CjTMQdsC.js} +1 -1
- package/storybook-static/assets/{PickerField-DykK8Xgu.js → PickerField-CIzr66S8.js} +1 -1
- package/storybook-static/assets/{PickerTriggerActions-C2qYXlH1.js → PickerTriggerActions-jZXgVj2i.js} +1 -1
- package/storybook-static/assets/{Popover-D_MNKdnD.js → Popover-BpC72C2z.js} +1 -1
- package/storybook-static/assets/{Popover-Bg-XuklM.js → Popover-CtpYUZz7.js} +1 -1
- package/storybook-static/assets/{Popover.stories-D2Asjc6d.js → Popover.stories-BujYLT_N.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-B1KqD3aB.js → PresetRangeDateInput-C6Y1OPu2.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput-CYXkpgts.js → PresetRangeDateInput-v5tpwKOr.js} +1 -1
- package/storybook-static/assets/{PresetRangeDateInput.stories-CTML1dIg.js → PresetRangeDateInput.stories-DXJi-hz8.js} +1 -1
- package/storybook-static/assets/{PresetSelect-4PvR0s4U.js → PresetSelect-gK2K5zkH.js} +1 -1
- package/storybook-static/assets/{README-B5vVbHbw.js → README-35Rz4zJn.js} +1 -1
- package/storybook-static/assets/{README-Ib9AxEso.js → README-76skvum6.js} +1 -1
- package/storybook-static/assets/{README-BcReoeGQ.js → README-9FkDpJNL.js} +1 -1
- package/storybook-static/assets/{README-Diow36TX.js → README-BARPT1_b.js} +1 -1
- package/storybook-static/assets/{README-tetbJraG.js → README-BC0N2gII.js} +1 -1
- package/storybook-static/assets/{README-DpxWpc-I.js → README-BEvGMEjK.js} +1 -1
- package/storybook-static/assets/{README-B3Q9ZlQz.js → README-BFt1rK1m.js} +1 -1
- package/storybook-static/assets/{README-bU5ZgdrN.js → README-BJ9k0Np6.js} +1 -1
- package/storybook-static/assets/{README-Dqpnap9b.js → README-BN7MT2Ap.js} +1 -1
- package/storybook-static/assets/{README-Dtb7kJXX.js → README-BNb4F90Z.js} +1 -1
- package/storybook-static/assets/{README-DecmlELk.js → README-BNk4sKbP.js} +1 -1
- package/storybook-static/assets/{README-BSSrY3Ri.js → README-BPeCkxf5.js} +1 -1
- package/storybook-static/assets/{README-BNUdkNxv.js → README-BUvT1PC3.js} +1 -1
- package/storybook-static/assets/{README-BpSdRy6R.js → README-BWp5_vwI.js} +1 -1
- package/storybook-static/assets/{README-VY7CL7vi.js → README-BeUl88Dw.js} +1 -1
- package/storybook-static/assets/{README-Bt44WdOn.js → README-BkP5HRKY.js} +1 -1
- package/storybook-static/assets/{README-DlE5gepf.js → README-BovclOxj.js} +1 -1
- package/storybook-static/assets/{README-44qHXI_X.js → README-BsO3rGAo.js} +1 -1
- package/storybook-static/assets/{README-Dl_id19k.js → README-ByB4pX-h.js} +1 -1
- package/storybook-static/assets/{README-BdgUDdVT.js → README-C0ZKA9b-.js} +1 -1
- package/storybook-static/assets/{README-CoJlt7mW.js → README-C7xESdeZ.js} +1 -1
- package/storybook-static/assets/{README-kpAlQZLM.js → README-C9WDex0g.js} +1 -1
- package/storybook-static/assets/{README-Co-LXT0Y.js → README-CEg7RhiN.js} +1 -1
- package/storybook-static/assets/{README-COnopkzM.js → README-CGVpfLua.js} +1 -1
- package/storybook-static/assets/{README-CUEwtG21.js → README-CHLqXECy.js} +1 -1
- package/storybook-static/assets/{README-vUJFU3Tw.js → README-CJazQDMs.js} +1 -1
- package/storybook-static/assets/{README-NCp7adRE.js → README-CV2hDek-.js} +1 -1
- package/storybook-static/assets/{README-BKGcgtnD.js → README-CYI_EOl0.js} +1 -1
- package/storybook-static/assets/{README-CE0sa_3S.js → README-Cgz1iUWg.js} +1 -1
- package/storybook-static/assets/{README-l0W43XHl.js → README-Cm8APMxg.js} +1 -1
- package/storybook-static/assets/{README-CVEiXGCU.js → README-CrMVq7Lw.js} +1 -1
- package/storybook-static/assets/{README-ypHLhhny.js → README-DFnpGGTR.js} +1 -1
- package/storybook-static/assets/{README-BZbDJrol.js → README-DKn16Q4N.js} +1 -1
- package/storybook-static/assets/{README-Ve2RJTbZ.js → README-DOgmLyjE.js} +1 -1
- package/storybook-static/assets/{README-BVOzG1wf.js → README-DTSAWBmg.js} +1 -1
- package/storybook-static/assets/{README-CWxf5v2C.js → README-DUr25qzJ.js} +1 -1
- package/storybook-static/assets/{README--I7LDhOP.js → README-DWdFUqVy.js} +1 -1
- package/storybook-static/assets/{README-Bta2DZoW.js → README-Daf_hy33.js} +1 -1
- package/storybook-static/assets/{README-BrduLUi1.js → README-Dd4omKy5.js} +1 -1
- package/storybook-static/assets/{README-SHZwgJhZ.js → README-DgvV1tz2.js} +1 -1
- package/storybook-static/assets/{README-Bwa8ai1X.js → README-Dj-J1DiV.js} +1 -1
- package/storybook-static/assets/{README-BJsszjH8.js → README-DjHS3LyZ.js} +1 -1
- package/storybook-static/assets/{README-1Ks0ldtQ.js → README-DjuBYSZf.js} +1 -1
- package/storybook-static/assets/{README-DrSuJ2Ll.js → README-DtFIYO3L.js} +1 -1
- package/storybook-static/assets/{README-DFiFAUAq.js → README-DwIqFkLN.js} +1 -1
- package/storybook-static/assets/{README-DMCaXjMn.js → README-PVmZhf60.js} +1 -1
- package/storybook-static/assets/{README-CnE5ZG98.js → README-SLh2SkXm.js} +1 -1
- package/storybook-static/assets/{README-C5Cq8Lo7.js → README-Uy_ptFqX.js} +1 -1
- package/storybook-static/assets/{README-B5MLKvrO.js → README-ZeIvwrze.js} +1 -1
- package/storybook-static/assets/{README-C1TqCBPf.js → README-fC8saBR0.js} +1 -1
- package/storybook-static/assets/{README-BK-2_7T4.js → README-p3wyWaCG.js} +1 -1
- package/storybook-static/assets/{README-CjbqfpYX.js → README-tSD_oNwO.js} +1 -1
- package/storybook-static/assets/{README-vjP8Z9fC.js → README-tWeRF96t.js} +1 -1
- package/storybook-static/assets/{RadioButton-ByRN6fXm.js → RadioButton-D-hGkjCE.js} +1 -1
- package/storybook-static/assets/{RadioButton-DRIJvobR.js → RadioButton-SQQ0XZh_.js} +1 -1
- package/storybook-static/assets/{RadioButton.stories-C6lOZsje.js → RadioButton.stories-y_RgH92I.js} +1 -1
- package/storybook-static/assets/{RadioGroup-Dskh-JZM.js → RadioGroup-BbZbR0Nd.js} +1 -1
- package/storybook-static/assets/{RadioGroup-5P3FMqFW.js → RadioGroup-c4001gHC.js} +1 -1
- package/storybook-static/assets/{RadioGroup.stories-BDbOjwVa.js → RadioGroup.stories-VUC3P22Z.js} +1 -1
- package/storybook-static/assets/{Scrollable-Cat0ixOK.js → Scrollable-BCbWuy4A.js} +1 -1
- package/storybook-static/assets/{Select-BiIixkSk.js → Select-B9E7ahIl.js} +1 -1
- package/storybook-static/assets/{Select-ImY9WR7I.js → Select-CJ33Sv-J.js} +1 -1
- package/storybook-static/assets/{Select.stories-DR8qQrXW.js → Select.stories-BcAnEbEn.js} +1 -1
- package/storybook-static/assets/{SerializableSelect-C2swvXju.js → SerializableSelect-BPS2hfyJ.js} +1 -1
- package/storybook-static/assets/{SerializableSelect.stories-CvoyFECC.js → SerializableSelect.stories-CM1ncPEp.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput-CjixqW_K.js → SingleDateTimeInput-BHYCHJQE.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput-hV5Om2LV.js → SingleDateTimeInput-gTTeUwQu.js} +1 -1
- package/storybook-static/assets/{SingleDateTimeInput.stories-CPDP-M6P.js → SingleDateTimeInput.stories-CbmsCFpW.js} +1 -1
- package/storybook-static/assets/{Slider-FbV_mr1Y.js → Slider-CGKqjm7X.js} +1 -1
- package/storybook-static/assets/{Slider-PcbxPCWE.js → Slider-RBZi0g2K.js} +1 -1
- package/storybook-static/assets/{Slider.stories-CH9grPep.js → Slider.stories-PSyMsLLp.js} +1 -1
- package/storybook-static/assets/{SliderInput-DPYcLCwD.js → SliderInput-CznPoK1l.js} +1 -1
- package/storybook-static/assets/{SliderInput-iqnLqNiU.js → SliderInput-Df9TmEKF.js} +1 -1
- package/storybook-static/assets/{SliderInput.stories-qVDa0KhJ.js → SliderInput.stories-BQiRt7bg.js} +1 -1
- package/storybook-static/assets/{Sortable-DzJSN0MG.js → Sortable-D42YEoo9.js} +1 -1
- package/storybook-static/assets/{Sortable.stories-BaQ2T15L.js → Sortable.stories-DkJeEE-A.js} +1 -1
- package/storybook-static/assets/{Splitter-Ka7c1ZDV.js → Splitter-DlRtVvJG.js} +1 -1
- package/storybook-static/assets/{Splitter.stories-BbjjUT39.js → Splitter.stories-CWV7Ofeq.js} +1 -1
- package/storybook-static/assets/{StateSelect-CfyyDUiq.js → StateSelect-Cx2e1djS.js} +1 -1
- package/storybook-static/assets/{StateSelect-DSzDU5Jy.js → StateSelect-DSmcFkB_.js} +1 -1
- package/storybook-static/assets/{StateSelect.stories-0c32Rlr2.js → StateSelect.stories-DE36S04p.js} +1 -1
- package/storybook-static/assets/{StatusIndicator-CcCdDffH.js → StatusIndicator-5q4RVrlX.js} +1 -1
- package/storybook-static/assets/{StatusIndicator.stories-Bazi6rxF.js → StatusIndicator.stories-ChoX8YBt.js} +1 -1
- package/storybook-static/assets/{StringToggle.stories-Bl6HAr4o.js → StringToggle.stories-C3yjPy-u.js} +1 -1
- package/storybook-static/assets/{Switch-Vl7s55bO.js → Switch-AbpldWAB.js} +1 -1
- package/storybook-static/assets/{Switch-BqAkQzIJ.js → Switch-BVC4Fwd3.js} +1 -1
- package/storybook-static/assets/{Switch.stories-Cq2n8Vr4.js → Switch.stories-FPuGI2wa.js} +1 -1
- package/storybook-static/assets/{Table-BgxoZKJs.js → Table-Supenh30.js} +1 -1
- package/storybook-static/assets/{Table.stories-DxnnXMZX.js → Table.stories-DF5hgk3V.js} +1 -1
- package/storybook-static/assets/{TableEditor.stories-D5Ke41-O.js → TableEditor.stories-CNBIQyHL.js} +1 -1
- package/storybook-static/assets/{Tabs-BPJG7wBI.js → Tabs-C039OI9y.js} +1 -1
- package/storybook-static/assets/{Tabs.stories-cQ4RTo0w.js → Tabs.stories-B49PmfdF.js} +1 -1
- package/storybook-static/assets/{TabsBox-CGgEovb9.js → TabsBox-C3l5eozp.js} +1 -1
- package/storybook-static/assets/{TagInput-CGHC-7Rv.js → TagInput-CwyrBnFS.js} +1 -1
- package/storybook-static/assets/{TagInput.stories-BSy_dJ5n.js → TagInput.stories-coxQ7Em9.js} +1 -1
- package/storybook-static/assets/{Text-D5fn4NbN.js → Text-Ci8EVxdT.js} +1 -1
- package/storybook-static/assets/{Textarea-pXxz-925.js → Textarea-BcSflD0g.js} +1 -1
- package/storybook-static/assets/{Textarea-CbWAz4J8.js → Textarea-CK323Zvt.js} +1 -1
- package/storybook-static/assets/{Textarea.stories-BkPejDdf.js → Textarea.stories-DksBPbfd.js} +1 -1
- package/storybook-static/assets/{TimePanel-BJulRHL2.js → TimePanel-rc26nbZr.js} +1 -1
- package/storybook-static/assets/{TimePanel.stories-CJmuKdfu.js → TimePanel.stories-CX33HFgH.js} +1 -1
- package/storybook-static/assets/{Toggle-B2S8eW_z.js → Toggle-BJ6a2rYs.js} +1 -1
- package/storybook-static/assets/{Toggle-DjqQBHtJ.js → Toggle-Dj9mjhm6.js} +1 -1
- package/storybook-static/assets/{Toggle.stories-7KRSUGU9.js → Toggle.stories-D2U9YqcP.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-B7Dd0sH5.js → TreeMultiSelect-0bsShZqq.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect-DfvInPvn.js → TreeMultiSelect-cRTpzovV.js} +1 -1
- package/storybook-static/assets/{TreeMultiSelect.stories-DrokeiS6.js → TreeMultiSelect.stories-BGX0KlJq.js} +1 -1
- package/storybook-static/assets/{TreePickerBase-CN9UeNWV.js → TreePickerBase-BWuxoc3q.js} +1 -1
- package/storybook-static/assets/{TreeSelect-D3s-_McF.js → TreeSelect-BJ9bYsyd.js} +1 -1
- package/storybook-static/assets/{TreeSelect-DPX2Q1Sv.js → TreeSelect-K8QcuBmM.js} +1 -1
- package/storybook-static/assets/{TreeSelect.stories-DvUGVU34.js → TreeSelect.stories-DGVst2IK.js} +1 -1
- package/storybook-static/assets/{TreeTable-By3223dp.js → TreeTable-BqgD-2_7.js} +1 -1
- package/storybook-static/assets/{TreeTable.stories-DKAKV_e2.js → TreeTable.stories-BcXMrgLT.js} +1 -1
- package/storybook-static/assets/{blocks-C4R1QC9R.js → blocks-COtaqhG7.js} +3 -3
- package/storybook-static/assets/{check-DkXl--jW.js → check-ATe9qlhZ.js} +1 -1
- package/storybook-static/assets/{chevron-down-DnX0I3Pg.js → chevron-down-C8rhgH0F.js} +1 -1
- package/storybook-static/assets/{chevron-left-18ya0d2d.js → chevron-left-BREifQyg.js} +1 -1
- package/storybook-static/assets/{chevron-right-DilGYzJ6.js → chevron-right-2G3N5a4T.js} +1 -1
- package/storybook-static/assets/{chunk-W22LQPXL-WTP7vHyr.js → chunk-W22LQPXL-CseeqzDY.js} +1 -1
- package/storybook-static/assets/{circle-alert-DVNv_dVS.js → circle-alert-BA5kPpt-.js} +1 -1
- package/storybook-static/assets/{circle-check-vIdCi5Zq.js → circle-check-Cs9mMZi_.js} +1 -1
- package/storybook-static/assets/{components-BtEbmBZQ.js → components-C3kWCR3K.js} +3 -3
- package/storybook-static/assets/{contextMenu-1dx6rzYN.js → contextMenu-BoM0Rrc0.js} +1 -1
- package/storybook-static/assets/{download-37V1rEcU.js → download-LnWJpQGc.js} +1 -1
- package/storybook-static/assets/{floating-ui.react-DT-xu5am.js → floating-ui.react-5ooru93I.js} +1 -1
- package/storybook-static/assets/{foundationApi-FaYaPMaR.js → foundationApi-BBE0Q757.js} +1 -1
- package/storybook-static/assets/{foundationLib-DLCLUXOF.js → foundationLib-B08SbcPW.js} +1 -1
- package/storybook-static/assets/{hooks-BuU9-pEZ.js → hooks-C0EM5QXj.js} +1 -1
- package/storybook-static/assets/iframe-B5Pyh1le.js +1 -0
- package/storybook-static/assets/{iframe-0M2vpakb.js → iframe-Dyg5pyjI.js} +3 -3
- package/storybook-static/assets/{info-2PUHH67D.js → info-CwIwVUF0.js} +1 -1
- package/storybook-static/assets/{odata-DIkxH78d.js → odata-DhMoO1-z.js} +1 -1
- package/storybook-static/assets/{odataStoryFixtures-BDQiSxyk.js → odataStoryFixtures-gWL6AhyF.js} +1 -1
- package/storybook-static/assets/{react-CfjIdTfH.js → react-DKmCseal.js} +1 -1
- package/storybook-static/assets/{refresh-cw-CHFG8NIc.js → refresh-cw-cEegR14X.js} +1 -1
- package/storybook-static/assets/{settings-2-CYde2-4U.js → settings-2-fhEteCrb.js} +1 -1
- package/storybook-static/assets/{sortable-Cy9ZqA3f.js → sortable-Dn0xMPIF.js} +1 -1
- package/storybook-static/assets/{syntaxhighlighter-QEQV7K2Y-C2U-3XXV.js → syntaxhighlighter-QEQV7K2Y-BSkd404o.js} +1 -1
- package/storybook-static/assets/{trash-2-7-oMZEr8.js → trash-2-DAG4_F6W.js} +1 -1
- package/storybook-static/assets/{triangle-alert-BSmuthen.js → triangle-alert-5OwD01Sy.js} +1 -1
- package/storybook-static/assets/{useODataSelectBase-C3B3Xw87.js → useODataSelectBase-BKD8wc02.js} +1 -1
- package/storybook-static/assets/{useODataTreeData-deUW5mSv.js → useODataTreeData-VIqPm8lR.js} +1 -1
- package/storybook-static/assets/{usePickerQuery-DdE3I7AV.js → usePickerQuery-qXXh72-v.js} +1 -1
- package/storybook-static/assets/{usePickerTriggerController-ZRvj4FHy.js → usePickerTriggerController-DbTYgg-I.js} +1 -1
- package/storybook-static/assets/{x-NXcyLtyX.js → x-sWfOdOu5.js} +1 -1
- package/storybook-static/iframe.html +2 -2
- package/storybook-static/project.json +1 -1
- package/storybook-static/assets/iframe-BMXB4CtM.js +0 -1
|
@@ -65,26 +65,26 @@ function k({ editor: e, extendSelection: t, disabled: n, renderCell: r, getCellT
|
|
|
65
65
|
"data-header": a.index < p.headerRowCount || void 0,
|
|
66
66
|
children: a.getAllCells().map((o, s) => {
|
|
67
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,
|
|
68
|
+
let l = a.index >= m.row && a.index < m.row + m.rowSpan && s >= m.column && s < m.column + m.columnSpan, f = {
|
|
69
69
|
row: a.index,
|
|
70
70
|
column: s
|
|
71
|
-
},
|
|
72
|
-
return /* @__PURE__ */
|
|
71
|
+
}, g = a.original.cells[s], _ = a.index < p.headerRowCount ? "th" : "td";
|
|
72
|
+
return /* @__PURE__ */ d(_, {
|
|
73
73
|
role: a.index < p.headerRowCount ? "columnheader" : "gridcell",
|
|
74
74
|
ref: (e) => {
|
|
75
|
-
e ? c.current.set(
|
|
75
|
+
e ? c.current.set(g.id, e) : c.current.delete(g.id);
|
|
76
76
|
},
|
|
77
77
|
rowSpan: o.getRowSpan(),
|
|
78
78
|
colSpan: o.getColSpan(),
|
|
79
79
|
"aria-colindex": s + 1,
|
|
80
|
-
"aria-label": `Строка ${a.index + 1}, столбец ${s + 1}: ${i(
|
|
80
|
+
"aria-label": `Строка ${a.index + 1}, столбец ${s + 1}: ${i(g) || "Пустая ячейка"}`,
|
|
81
81
|
"aria-selected": l,
|
|
82
82
|
tabIndex: !n && h.row === a.index && h.column === s ? 0 : -1,
|
|
83
83
|
onClick: (r) => {
|
|
84
|
-
n || e.select(
|
|
84
|
+
n || e.select(f, t || r.shiftKey);
|
|
85
85
|
},
|
|
86
86
|
onPointerEnter: (t) => {
|
|
87
|
-
!n && t.pointerType === "mouse" && t.buttons === 1 && e.select(
|
|
87
|
+
!n && t.pointerType === "mouse" && t.buttons === 1 && e.select(f, !0);
|
|
88
88
|
},
|
|
89
89
|
onKeyDown: (t) => {
|
|
90
90
|
if (n || t.altKey || t.ctrlKey || t.metaKey) return;
|
|
@@ -92,42 +92,42 @@ function k({ editor: e, extendSelection: t, disabled: n, renderCell: r, getCellT
|
|
|
92
92
|
switch (t.key) {
|
|
93
93
|
case "ArrowRight":
|
|
94
94
|
r = {
|
|
95
|
-
...
|
|
95
|
+
...f,
|
|
96
96
|
column: s + o.getColSpan()
|
|
97
97
|
};
|
|
98
98
|
break;
|
|
99
99
|
case "ArrowLeft":
|
|
100
100
|
r = {
|
|
101
|
-
...
|
|
101
|
+
...f,
|
|
102
102
|
column: s - 1
|
|
103
103
|
};
|
|
104
104
|
break;
|
|
105
105
|
case "ArrowDown":
|
|
106
106
|
r = {
|
|
107
|
-
...
|
|
107
|
+
...f,
|
|
108
108
|
row: a.index + o.getRowSpan()
|
|
109
109
|
};
|
|
110
110
|
break;
|
|
111
111
|
case "ArrowUp":
|
|
112
112
|
r = {
|
|
113
|
-
...
|
|
113
|
+
...f,
|
|
114
114
|
row: a.index - 1
|
|
115
115
|
};
|
|
116
116
|
break;
|
|
117
117
|
case "Home":
|
|
118
118
|
r = {
|
|
119
|
-
...
|
|
119
|
+
...f,
|
|
120
120
|
column: 0
|
|
121
121
|
};
|
|
122
122
|
break;
|
|
123
123
|
case "End":
|
|
124
124
|
r = {
|
|
125
|
-
...
|
|
125
|
+
...f,
|
|
126
126
|
column: p.columns.length - 1
|
|
127
127
|
};
|
|
128
128
|
break;
|
|
129
129
|
case " ":
|
|
130
|
-
t.preventDefault(), e.select(
|
|
130
|
+
t.preventDefault(), e.select(f, t.shiftKey);
|
|
131
131
|
return;
|
|
132
132
|
default: return;
|
|
133
133
|
}
|
|
@@ -135,11 +135,14 @@ function k({ editor: e, extendSelection: t, disabled: n, renderCell: r, getCellT
|
|
|
135
135
|
let i = y(p, r);
|
|
136
136
|
e.select(r, t.shiftKey), c.current.get(p.rows[i.row].cells[i.column].id)?.focus();
|
|
137
137
|
},
|
|
138
|
-
children: /* @__PURE__ */ u("
|
|
138
|
+
children: [a.index < p.headerRowCount ? /* @__PURE__ */ u("span", {
|
|
139
|
+
className: "visuallyHidden",
|
|
140
|
+
children: i(g) || "Пустой заголовок"
|
|
141
|
+
}) : null, /* @__PURE__ */ u("div", {
|
|
139
142
|
inert: !0,
|
|
140
143
|
className: E.cellContent,
|
|
141
|
-
children: r(
|
|
142
|
-
})
|
|
144
|
+
children: r(g)
|
|
145
|
+
})]
|
|
143
146
|
}, o.id);
|
|
144
147
|
})
|
|
145
148
|
}, a.id)) })]
|
|
@@ -1 +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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"}
|
|
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{row.index < document.headerRowCount ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<span className=\"visuallyHidden\">{getCellText(original) || \"Пустой заголовок\"}</span>\n\t\t\t\t\t\t\t\t\t\t\t) : null}\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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"}
|
|
@@ -1 +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,+
|
|
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,+BAoHzH"}
|
package/package.json
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{n as t}from"./iframe-Dyg5pyjI.js";import{i as n,r}from"./react-Bl2r1tuC.js";import{a as i,d as a,f as o,l as s,m as c,n as l,p as u,r as d,u as f}from"./blocks-COtaqhG7.js";import{a as p,i as m,n as h,o as g,r as _,s as v,t as y}from"./Badge.stories-BV9Ob_Oc.js";function b(e){let t={code:`code`,h2:`h2`,h3:`h3`,li:`li`,p:`p`,pre:`pre`,ul:`ul`,...n(),...e.components};return(0,S.jsxs)(S.Fragment,{children:[(0,S.jsx)(s,{of:h,parameters:{atomicCanvas:!0,layout:`padded`,docs:{toc:!0}}}),`
|
|
2
2
|
`,(0,S.jsx)(u,{children:`Badge`}),`
|
|
3
3
|
`,(0,S.jsx)(o,{children:`Компактная текстовая метка для статусов, категорий, фильтров и коротких служебных пометок`}),`
|
|
4
4
|
`,(0,S.jsx)(t.p,{children:`Badge подходит для коротких подписей, которые должны быстро читаться и не перегружать интерфейс:`}),`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e,r as t}from"./rolldown-runtime-DkW27tQK.js";import{t as n}from"./react-BZJXY1be.js";import{n as r}from"./iframe-
|
|
1
|
+
import{n as e,r as t}from"./rolldown-runtime-DkW27tQK.js";import{t as n}from"./react-BZJXY1be.js";import{n as r}from"./iframe-Dyg5pyjI.js";import{i,n as a,r as o,t as s}from"./BadgeList-CtdWGEn6.js";var c=t({Appearances:()=>h,Basic:()=>p,RemovableList:()=>_,Sizes:()=>g,Tones:()=>m,__namedExportsOrder:()=>v,default:()=>f}),l,u,d,f,p,m,h,g,_,v;function y(){return(y=e((()=>{l=n(),i(),a(),u=r(),{useArgs:d}=__STORYBOOK_MODULE_PREVIEW_API__,f={title:`UI/Badge`,component:o,args:{children:`Новый`,size:`md`,tone:`info`,appearance:`solid`},parameters:{atomicCanvas:!0,layout:`padded`},argTypes:{children:{description:`Текст внутри бейджа.`,control:`text`},size:{description:`Размер бейджа.`,control:`inline-radio`,options:[`xs`,`sm`,`md`,`lg`,`xl`]},tone:{description:`Цветовой тон бейджа.`,control:`inline-radio`,options:[`neutral`,`accent`,`brand`,`success`,`warning`,`error`,`info`]},appearance:{description:`Форма бейджа.`,control:`inline-radio`,options:[`solid`,`outline`,`ghost`,`transparent`]},onRemove:{description:`Показывает кнопку удаления и вызывает обработчик по клику.`,control:!1}}},p={render:function(){let[e]=d();return(0,u.jsx)(o,{...e})}},m={render:()=>(0,u.jsxs)(s,{children:[(0,u.jsx)(o,{tone:`neutral`,appearance:`outline`,children:`Neutral`}),(0,u.jsx)(o,{tone:`accent`,appearance:`solid`,children:`Акцент`}),(0,u.jsx)(o,{tone:`brand`,appearance:`solid`,children:`Бренд`}),(0,u.jsx)(o,{tone:`success`,appearance:`solid`,children:`Успешно`}),(0,u.jsx)(o,{tone:`warning`,appearance:`solid`,children:`Внимание`}),(0,u.jsx)(o,{tone:`error`,appearance:`solid`,children:`Ошибка`}),(0,u.jsx)(o,{tone:`info`,appearance:`solid`,children:`Информация`})]})},h={render:()=>(0,u.jsxs)(s,{children:[(0,u.jsx)(o,{tone:`neutral`,appearance:`solid`,children:`Solid`}),(0,u.jsx)(o,{tone:`neutral`,appearance:`outline`,children:`Outline`}),(0,u.jsx)(o,{tone:`info`,appearance:`ghost`,children:`Ghost`}),(0,u.jsx)(o,{tone:`warning`,appearance:`transparent`,children:`Transparent`})]})},g={render:()=>(0,u.jsxs)(s,{children:[(0,u.jsx)(o,{size:`xs`,children:`Extra Small`}),(0,u.jsx)(o,{size:`sm`,children:`Small`}),(0,u.jsx)(o,{size:`md`,children:`Medium`}),(0,u.jsx)(o,{size:`lg`,children:`Large`}),(0,u.jsx)(o,{size:`xl`,children:`Extra Large`})]})},_={render:()=>{let[e,t]=(0,l.useState)([`Фильтр A`,`Фильтр B`,`Фильтр C`]);return(0,u.jsx)(s,{children:e.map(e=>(0,u.jsx)(o,{tone:`info`,appearance:`outline`,onRemove:()=>t(t=>t.filter(t=>t!==e)),children:e},e))})}},p.parameters={...p.parameters,docs:{...p.parameters?.docs,source:{originalSource:`{
|
|
2
2
|
render: function Render() {
|
|
3
3
|
const [args] = useArgs<BadgeStoryArgs>();
|
|
4
4
|
return <Badge {...args} />;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{t}from"./react-BZJXY1be.js";import{n,t as r}from"./x-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-DkW27tQK.js";import{t}from"./react-BZJXY1be.js";import{n,t as r}from"./x-sWfOdOu5.js";import{n as i}from"./iframe-Dyg5pyjI.js";import{a,i as o}from"./utils-tg3ibbzi.js";import{c as s,i as c}from"./array-D-_yMMUK-DnJ_b27D.js";import{n as l,t as u}from"./FloatingPopover-D-hgsDWB.js";import{a as d,i as f,r as p,t as m}from"./uiClasses-e9OQfdw2.js";import{n as h,t as g}from"./FlexContainer-BWyPlTMB.js";function _({maxChar:e,placement:t=`left`,closeDelay:n=0,maxWidth:r,children:i,block:a,state:o,textWrap:c,textWrapProps:l}){let d=s(i);if(!d.length||e&&d.length<e)return(0,v.jsx)(`span`,{children:d});let f=c??`div`,p={style:{display:a?`block`:`inline-block`,width:e?`${e-3}ch`:`auto`},className:`textOverflow`},m={...l,...p,style:{...l?.style,...p.style},className:[l?.className,p.className].filter(Boolean).join(` `)};return(0,v.jsx)(u,{state:o,placement:t,openOnHover:!0,content:d,closeDelay:n,maxWidth:r,children:(0,v.jsx)(f,{...m,children:d})})}var v;function y(){return(y=e((()=>{c(),l(),v=i(),_.__docgenInfo={description:``,methods:[],displayName:`TextOverflow`,props:{children:{required:!0,tsType:{name:`string`},description:``},maxChar:{required:!1,tsType:{name:`number`},description:``},maxWidth:{required:!1,tsType:{name:`number`},description:`Максимальная ширина тултипа в em.`},placement:{required:!1,tsType:{name:`Placement`},description:``,defaultValue:{value:`"left"`,computed:!1}},closeDelay:{required:!1,tsType:{name:`number`},description:``,defaultValue:{value:`0`,computed:!1}},block:{required:!1,tsType:{name:`literal`,value:`true`},description:`Для работы text-overflow элемент обязан быть блочным или inline-block.
|
|
2
2
|
Если в качестве обёртки передается инлайновый компонент, то он будет
|
|
3
3
|
перезаписан через стили на display: block или inline-block в зависимости
|
|
4
4
|
от установки данного пропса.`},state:{required:!1,tsType:{name:`union`,raw:`"information" | "error" | "warning" | "success" | "negative"`,elements:[{name:`literal`,value:`"information"`},{name:`literal`,value:`"error"`},{name:`literal`,value:`"warning"`},{name:`literal`,value:`"success"`},{name:`literal`,value:`"negative"`}]},description:``},textWrap:{required:!1,tsType:{name:`T`},description:``},textWrapProps:{required:!1,tsType:{name:`Omit`,elements:[{name:`ComponentProps`,elements:[{name:`T`}],raw:`ComponentProps<T>`},{name:`literal`,value:`"children"`}],raw:`Omit<ComponentProps<T>, "children">`},description:``}}}})))()}var b,x,S,C,w,T,E,D,O,k;function A(){return(A=e((()=>{b=`qBtmnH`,x=`p-HsHY`,S=`u9tQAE`,C=`FRScRz`,w=`W13uQO`,T=`_3IRcM9`,E=`R3ybI7`,D=`DdWAaC`,O=`_5cXBQF`,k={badge:b,passive:x,sizeXs:S,sizeSm:C,sizeMd:w,sizeLg:T,sizeXl:E,content:D,removeButton:O}})))()}function j({children:e,size:t=`sm`,tone:n,appearance:i,className:o,onRemove:s}){let c=n??`neutral`,l=d({tone:n,appearance:i,fallbackTone:c,fallbackAppearance:c===`neutral`?`outline`:`solid`});return(0,M.jsxs)(`div`,{className:a(k.badge,N[t],p(l.tone),m(l.appearance),!s&&k.passive,o),children:[(0,M.jsx)(_,{maxChar:25,placement:`top`,block:!0,textWrapProps:{className:k.content},children:String(e)}),s&&(0,M.jsx)(`button`,{type:`button`,onClick:s,className:k.removeButton,"aria-label":`Удалить бейдж`,"data-ui":`badge-remove-button`,"data-action":`remove-badge`,children:(0,M.jsx)(r,{})})]})}var M,N;function P(){return(P=e((()=>{o(),n(),y(),f(),A(),M=i(),N={xs:k.sizeXs,sm:k.sizeSm,md:k.sizeMd,lg:k.sizeLg,xl:k.sizeXl},j.__docgenInfo={description:`Компактный индикатор для статусов, категорий и коротких служебных меток.`,methods:[],displayName:`Badge`,props:{children:{required:!0,tsType:{name:`union`,raw:`string | number`,elements:[{name:`string`},{name:`number`}]},description:``},size:{required:!1,tsType:{name:`union`,raw:`"xs" | "sm" | "md" | "lg" | "xl"`,elements:[{name:`literal`,value:`"xs"`},{name:`literal`,value:`"sm"`},{name:`literal`,value:`"md"`},{name:`literal`,value:`"lg"`},{name:`literal`,value:`"xl"`}]},description:``,defaultValue:{value:`"sm"`,computed:!1}},tone:{required:!1,tsType:{name:`union`,raw:`"accent" | "neutral" | "brand" | "error" | "warning" | "success" | "info"`,elements:[{name:`literal`,value:`"accent"`},{name:`literal`,value:`"neutral"`},{name:`literal`,value:`"brand"`},{name:`literal`,value:`"error"`},{name:`literal`,value:`"warning"`},{name:`literal`,value:`"success"`},{name:`literal`,value:`"info"`}]},description:``},appearance:{required:!1,tsType:{name:`union`,raw:`"solid" | "outline" | "ghost" | "transparent"`,elements:[{name:`literal`,value:`"solid"`},{name:`literal`,value:`"outline"`},{name:`literal`,value:`"ghost"`},{name:`literal`,value:`"transparent"`}]},description:``},className:{required:!1,tsType:{name:`string`},description:``},onRemove:{required:!1,tsType:{name:`signature`,type:`function`,raw:`() => void`,signature:{arguments:[],return:{name:`void`}}},description:``}}}})))()}function F({children:e}){return(0,L.jsx)(g,{inline:!0,wrap:!0,gap:`sm`,align:`baseline`,children:I.Children.map(e,(e,t)=>(0,L.jsx)(I.Fragment,{children:e},t))})}var I,L;function R(){return(R=e((()=>{I=t(),h(),L=i(),F.__docgenInfo={description:"Контейнер для группы `Badge`, который выстраивает элементы в единый список с предсказуемыми отступами. Используется для компактного вывода набора меток или фильтров.",methods:[],displayName:`BadgeList`,props:{children:{required:!0,tsType:{name:`Array`,elements:[{name:`ReactElement`,elements:[{name:`union`,raw:`typeof Badge | null | undefined | false`,elements:[{name:`Badge`},{name:`null`},{name:`undefined`},{name:`literal`,value:`false`}]}],raw:`ReactElement<typeof Badge | null | undefined | false>`}],raw:`ReactElement<typeof Badge | null | undefined | false>[]`},description:``}}}})))()}export{P as i,R as n,j as r,F as t};
|