@jackuait/blok 0.10.0-beta.5 → 0.10.0-beta.7
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/codemod/migrate-editorjs-to-blok.js +0 -2
- package/codemod/test.js +0 -6
- package/dist/blok.mjs +3 -3
- package/dist/chunks/_basePickBy-BHRNO12X.mjs +410 -0
- package/dist/chunks/_baseUniq-DtFPDBML.mjs +1045 -0
- package/dist/chunks/_getTag-ozrhqxk_.mjs +26 -0
- package/dist/chunks/arc-BEqJP9HX.mjs +80 -0
- package/dist/chunks/architecture-YZFGNWBL-Bcu-90pi.mjs +3 -0
- package/dist/chunks/architectureDiagram-Q4EWVU46-BMno5LCn.mjs +4066 -0
- package/dist/chunks/array-Cyf-61SV.mjs +6 -0
- package/dist/chunks/blockDiagram-DXYQGD6D-DlP_cPth.mjs +3259 -0
- package/dist/chunks/{blok-DH-WEcA8.mjs → blok-CiLRmoHI.mjs} +2030 -1996
- package/dist/chunks/c4Diagram-AHTNJAMY-BbVV8EXj.mjs +2956 -0
- package/dist/chunks/channel-DPcniO2B.mjs +5 -0
- package/dist/chunks/chunk-2KRD3SAO-CazES4VS.mjs +20 -0
- package/dist/chunks/chunk-336JU56O-heO72r_k.mjs +49 -0
- package/dist/chunks/chunk-426QAEUC-CmCcml1z.mjs +13 -0
- package/dist/chunks/chunk-4BX2VUAB-B10DxOza.mjs +19 -0
- package/dist/chunks/chunk-4TB4RGXK-B0snhZOU.mjs +3250 -0
- package/dist/chunks/chunk-55IACEB6-CGkn5ABd.mjs +8 -0
- package/dist/chunks/chunk-5FUZZQ4R-USdumo_u.mjs +3786 -0
- package/dist/chunks/chunk-5PVQY5BW-CxUGVzQL.mjs +1692 -0
- package/dist/chunks/chunk-67CJDMHE-Bvw55oRa.mjs +20 -0
- package/dist/chunks/chunk-7N4EOEYR-Bs2qDy88.mjs +29 -0
- package/dist/chunks/chunk-AA7GKIK3-Bss0LgrN.mjs +24 -0
- package/dist/chunks/chunk-BSJP7CBP-CpUW7gi5.mjs +83 -0
- package/dist/chunks/chunk-CIAEETIT-DlRbLLf3.mjs +20 -0
- package/dist/chunks/chunk-D6kmoKXy.mjs +20 -0
- package/dist/chunks/chunk-EDXVE4YY-DEcX4XWm.mjs +26 -0
- package/dist/chunks/chunk-ENJZ2VHE-B4THRZkR.mjs +566 -0
- package/dist/chunks/chunk-FMBD7UC4-CF6BKEiV.mjs +5 -0
- package/dist/chunks/chunk-FOC6F5B3--xuza7Yn.mjs +20 -0
- package/dist/chunks/chunk-ICPOFSXX-BMja8cuy.mjs +3290 -0
- package/dist/chunks/chunk-K5T4RW27-CHEqGHFS.mjs +16370 -0
- package/dist/chunks/chunk-KGLVRYIC-DHYYpR8v.mjs +20 -0
- package/dist/chunks/chunk-LIHQZDEY-AvbOvyLE.mjs +55 -0
- package/dist/chunks/chunk-ORNJ4GCN-38fbR5OS.mjs +25 -0
- package/dist/chunks/chunk-OYMX7WX6-BiqlATPA.mjs +2038 -0
- package/dist/chunks/chunk-QZHKN3VN-DitZIvj8.mjs +12 -0
- package/dist/chunks/chunk-U2HBQHQK-DJytnHmZ.mjs +1875 -0
- package/dist/chunks/chunk-X2U36JSP-DlOifw1K.mjs +68 -0
- package/dist/chunks/chunk-XPW4576I-s4fsi4XO.mjs +1146 -0
- package/dist/chunks/chunk-YZCP3GAM-Ch258bXC.mjs +60 -0
- package/dist/chunks/chunk-ZZ45TVLE-DWziaKxP.mjs +33 -0
- package/dist/chunks/classDiagram-6PBFFD2Q-BOkAe08u.mjs +30 -0
- package/dist/chunks/classDiagram-v2-HSJHXN6E-DeKatSvh.mjs +30 -0
- package/dist/chunks/clone-CJCz7VRp.mjs +8 -0
- package/dist/chunks/{constants-Ccno9NZS.mjs → constants-DFS8l39Y.mjs} +525 -552
- package/dist/chunks/cose-bilkent-S5V4N54A-CzLGVqvr.mjs +2246 -0
- package/dist/chunks/cytoscape.esm-D0iglm-M.mjs +18108 -0
- package/dist/chunks/dagre-KV5264BT-XbHSjleO.mjs +298 -0
- package/dist/chunks/dagre-XY8CZ1sg.mjs +1536 -0
- package/dist/chunks/default-DIfXCS2E.mjs +4 -0
- package/dist/chunks/defaultLocale-DFhS1600.mjs +201 -0
- package/dist/chunks/diagram-5BDNPKRD-CM7c3UTI.mjs +112 -0
- package/dist/chunks/diagram-G4DWMVQ6-Bhg4ps6b.mjs +546 -0
- package/dist/chunks/diagram-MMDJMWI5-C-UCVaxB.mjs +234 -0
- package/dist/chunks/diagram-TYMM5635-BOHSujSD.mjs +144 -0
- package/dist/chunks/dist-DHsXIYdd.mjs +59 -0
- package/dist/chunks/erDiagram-SMLLAGMA-CwKxXFMB.mjs +1712 -0
- package/dist/chunks/flowDiagram-DWJPFMVM-rQJKfyuO.mjs +4175 -0
- package/dist/chunks/ganttDiagram-T4ZO3ILL-DfaZirLX.mjs +3083 -0
- package/dist/chunks/gitGraph-7Q5UKJZL-BKG8cHGz.mjs +3 -0
- package/dist/chunks/gitGraphDiagram-UUTBAWPF-CRa-ymsI.mjs +792 -0
- package/dist/chunks/graphlib-CuDElSdG.mjs +223 -0
- package/dist/chunks/{i18next-G6FKbZqA.mjs → i18next-BBGW2sDE.mjs} +1 -1
- package/dist/chunks/{i18next-loader-CwNimni3.mjs → i18next-loader-CasQQb5s.mjs} +2 -2
- package/dist/chunks/info-OMHHGYJF-FKqYyUn9.mjs +3 -0
- package/dist/chunks/infoDiagram-42DDH7IO-CvyJU2nE.mjs +29 -0
- package/dist/chunks/init-JlKGZtuT.mjs +15 -0
- package/dist/chunks/ishikawaDiagram-UXIWVN3A-CIpbw1BK.mjs +719 -0
- package/dist/chunks/journeyDiagram-VCZTEJTY-H96UcUK9.mjs +885 -0
- package/dist/chunks/kanban-definition-6JOO6SKY-BYZT3srA.mjs +980 -0
- package/dist/chunks/katex-JyOgX6MW.mjs +22026 -0
- package/dist/chunks/{lightweight-i18n-DWCdzAw0.mjs → lightweight-i18n-Cvv8CWh4.mjs} +29 -18
- package/dist/chunks/line-B9xUUA7k.mjs +34 -0
- package/dist/chunks/linear-Dj-1yA_B.mjs +289 -0
- package/dist/chunks/mdast-util-math-CHYUxOHk.mjs +151 -0
- package/dist/chunks/mermaid-parser.core-D6OPAUtM.mjs +57 -0
- package/dist/chunks/mermaid.core-BPN9ZHKQ.mjs +989 -0
- package/dist/{messages-B-4fku2H2.mjs → chunks/messages--YKhFEDE.mjs} +30 -19
- package/dist/{messages-BCG_evLg.mjs → chunks/messages-0Uwu1AMJ2.mjs} +28 -17
- package/dist/{messages-CdlsTFB1.mjs → chunks/messages-1__0Ph4Q.mjs} +28 -17
- package/dist/chunks/{messages-wLSVQbsA2.mjs → messages-4sm9Pb0C.mjs} +28 -17
- package/dist/chunks/{messages-R2W_rGOo2.mjs → messages-4uxjtzKW.mjs} +28 -17
- package/dist/chunks/{messages-Dm4YVlrm.mjs → messages-B-SwLgkQ.mjs} +30 -19
- package/dist/{messages--S8_taOd2.mjs → chunks/messages-B1ylBxXQ.mjs} +28 -17
- package/dist/chunks/{messages-B7MIRzCa2.mjs → messages-B5m3dhKc.mjs} +28 -17
- package/dist/chunks/{messages-Dplnp19q.mjs → messages-B6n2zDtv.mjs} +29 -18
- package/dist/chunks/{messages-DD7BI6BK.mjs → messages-BC9w4zAT.mjs} +28 -17
- package/dist/chunks/{messages-BrFl5773.mjs → messages-BOj-7N3p.mjs} +28 -17
- package/dist/chunks/{messages-BbdNugdi.mjs → messages-BRYHTS18.mjs} +28 -17
- package/dist/chunks/{messages-JQKFJo7C.mjs → messages-BSBbVjor.mjs} +35 -24
- package/dist/{messages-CBzd_x7H.mjs → chunks/messages-BUUkmUGc.mjs} +28 -17
- package/dist/{messages-CjmSrt1D.mjs → chunks/messages-Bb3YEV2P.mjs} +33 -22
- package/dist/{messages-BvgXeMSL2.mjs → chunks/messages-Be_6YLzJ.mjs} +29 -18
- package/dist/{messages-pgPcitDH.mjs → chunks/messages-BevRhv5d.mjs} +28 -17
- package/dist/chunks/{messages-BW_7lfqG2.mjs → messages-Bhqr7Im2.mjs} +28 -17
- package/dist/chunks/{messages-LxumrNue2.mjs → messages-BpJFjSKa.mjs} +29 -18
- package/dist/{messages-xEI8gEDK.mjs → chunks/messages-BqYlq_Bn.mjs} +28 -17
- package/dist/{messages-CBdQ3XP9.mjs → chunks/messages-BtAwCUfD.mjs} +28 -17
- package/dist/{messages-D3cAcyzj.mjs → chunks/messages-Bthbp65G.mjs} +29 -18
- package/dist/{messages-CYX48nfg.mjs → chunks/messages-BvHMZ8Pi2.mjs} +28 -17
- package/dist/{messages-Dddxv8-f2.mjs → chunks/messages-Bw1BE9jW.mjs} +28 -17
- package/dist/chunks/{messages-d0Ky6QjR.mjs → messages-Bx6Wt285.mjs} +28 -17
- package/dist/chunks/{messages-BPog17132.mjs → messages-BzslJRYv.mjs} +29 -18
- package/dist/{messages-hTpeKUaW.mjs → chunks/messages-C02M0Tpw.mjs} +28 -17
- package/dist/chunks/{messages-C-b6tPad2.mjs → messages-C1u3E9qg.mjs} +28 -17
- package/dist/{messages-BJ7BuFZi.mjs → chunks/messages-C68WgSKk.mjs} +29 -18
- package/dist/chunks/{messages-Bpda_3PM2.mjs → messages-C8w8JCP0.mjs} +30 -19
- package/dist/chunks/{messages-CmrMwBv3.mjs → messages-CFOZdSk4.mjs} +28 -17
- package/dist/{messages-DVQNjdPk.mjs → chunks/messages-CGOY79lr.mjs} +28 -17
- package/dist/chunks/{messages-DAVsuDWh2.mjs → messages-CGaSMZPu.mjs} +28 -17
- package/dist/{messages-DtrSrdfE2.mjs → chunks/messages-CJJgQ0BH.mjs} +28 -17
- package/dist/{messages-CgzbJ8_l2.mjs → chunks/messages-CTD6rtQj2.mjs} +28 -17
- package/dist/chunks/{messages-p4byLfvR.mjs → messages-CZymJML9.mjs} +32 -21
- package/dist/{messages-CqkRG9mH.mjs → chunks/messages-CfeFJbiv.mjs} +32 -21
- package/dist/{messages-DjJQoYvP2.mjs → chunks/messages-Cgatzu_z.mjs} +30 -19
- package/dist/{messages-CM5fsPo02.mjs → chunks/messages-Ch2zBI602.mjs} +28 -17
- package/dist/chunks/{messages-CyNsByCY.mjs → messages-CiAHsUfO.mjs} +28 -17
- package/dist/{messages-BXI3qIos.mjs → chunks/messages-Cuzq-tNW.mjs} +28 -17
- package/dist/chunks/{messages-FHrCEJmY2.mjs → messages-Cw4qiMwb.mjs} +28 -17
- package/dist/chunks/{messages-xfjdrZmx.mjs → messages-Cyh-mz40.mjs} +28 -17
- package/dist/{messages-Bo_FUvVH.mjs → chunks/messages-D-I2QO8H.mjs} +28 -17
- package/dist/chunks/{messages-Ct7AMBS82.mjs → messages-D0D2gruy.mjs} +28 -17
- package/dist/chunks/{messages-CrMfiGu5.mjs → messages-D1BKxfLD.mjs} +29 -18
- package/dist/chunks/{messages-CmXADeab2.mjs → messages-D4eDs6R_.mjs} +28 -17
- package/dist/chunks/{messages-ClRHDxzh.mjs → messages-D9Xr-hES.mjs} +28 -17
- package/dist/{messages-tsHpMdDT2.mjs → chunks/messages-D9eJPHia.mjs} +30 -19
- package/dist/{messages-DUBHHfEt.mjs → chunks/messages-DBFWSzKY2.mjs} +28 -17
- package/dist/{messages-i4S6q64n2.mjs → chunks/messages-DC0wu2S7.mjs} +28 -17
- package/dist/chunks/{messages-BnznaKEP2.mjs → messages-DF9o19rG.mjs} +28 -17
- package/dist/{messages-DA-o8X3A.mjs → chunks/messages-DFS_n986.mjs} +51 -40
- package/dist/{messages-BGsDZTQp2.mjs → chunks/messages-DGS4H30T.mjs} +28 -17
- package/dist/chunks/{messages-Cdx4QMR1.mjs → messages-DKjddpzJ.mjs} +30 -19
- package/dist/chunks/{messages-B3s2vra72.mjs → messages-DMvTdUXC.mjs} +30 -19
- package/dist/{messages-Dcyrzdxa2.mjs → chunks/messages-DQUX-QYI2.mjs} +28 -17
- package/dist/chunks/{messages-BS1nOvZ-.mjs → messages-DUigq8FO2.mjs} +28 -17
- package/dist/{messages-BKjqW08U.mjs → chunks/messages-DY0FJdpH.mjs} +28 -17
- package/dist/{messages-BBvDbp62.mjs → chunks/messages-DfVXiqt-2.mjs} +28 -17
- package/dist/chunks/{messages-DHCVA7XQ.mjs → messages-DgZc9TJw.mjs} +28 -17
- package/dist/chunks/{messages-1Raf1IK82.mjs → messages-QD4BCUDP.mjs} +28 -17
- package/dist/{messages-JhoVMjfX2.mjs → chunks/messages-USmweex9.mjs} +28 -17
- package/dist/chunks/{messages-DBpXyvRe2.mjs → messages-a1JTi0Qm.mjs} +31 -20
- package/dist/chunks/{messages-D5IgUbBD2.mjs → messages-jcgCHPRn.mjs} +28 -17
- package/dist/chunks/{messages-Dfpi8pDY.mjs → messages-tnnqHpbd.mjs} +29 -18
- package/dist/{messages-DZEcrbmH.mjs → chunks/messages-vzWKPLJO.mjs} +28 -17
- package/dist/chunks/micromark-extension-math-Cz_ZZ_0Y.mjs +169 -0
- package/dist/chunks/micromark-factory-space-WwmyBO_J.mjs +36 -0
- package/dist/chunks/mindmap-definition-QFDTVHPH-BswFuNN6.mjs +1013 -0
- package/dist/chunks/{notifier-Butv4Dvo.mjs → notifier-B1zCi9G1.mjs} +1 -1
- package/dist/chunks/{objectSpread2-BY4mgzrQ.mjs → objectSpread2-CWwMYL_U.mjs} +1 -1
- package/dist/chunks/ordinal-D1_lEgAO.mjs +65 -0
- package/dist/chunks/packet-4T2RLAQJ-DTUW2U0C.mjs +3 -0
- package/dist/chunks/path-6nYPAvNb.mjs +85 -0
- package/dist/chunks/pie-ZZUOXDRM-D-umqvEM.mjs +3 -0
- package/dist/chunks/pieDiagram-DEJITSTG-1WJgvK1w.mjs +179 -0
- package/dist/chunks/quadrantDiagram-34T5L4WZ-B_YH8QGl.mjs +1960 -0
- package/dist/chunks/radar-PYXPWWZC-DkQelf08.mjs +3 -0
- package/dist/chunks/requirementDiagram-MS252O5E-DRl0YJRI.mjs +2224 -0
- package/dist/chunks/rough.esm-CSWJruu5.mjs +1353 -0
- package/dist/chunks/sankeyDiagram-XADWPNL6-B-8IrknH.mjs +909 -0
- package/dist/chunks/sequenceDiagram-FGHM5R23-DTLb8qmO.mjs +4181 -0
- package/dist/chunks/src-CRgEHLPW.mjs +2149 -0
- package/dist/chunks/stateDiagram-FHFEXIEX-B0JFjLFy.mjs +218 -0
- package/dist/chunks/stateDiagram-v2-QKLJ7IA2-Co9CUU_z.mjs +28 -0
- package/dist/chunks/timeline-definition-GMOUNBTQ-CS9KTh-Q.mjs +1084 -0
- package/dist/chunks/{tools-C2_IVsQY.mjs → tools-CSYsrnud.mjs} +2846 -3098
- package/dist/chunks/treeView-SZITEDCU-DOOoyNP9.mjs +3 -0
- package/dist/chunks/treemap-W4RFUUIX-CsOoUA-u.mjs +3 -0
- package/dist/chunks/vennDiagram-DHZGUBPP-0BNu5Wna.mjs +1876 -0
- package/dist/chunks/wardley-RL74JXVD-CCzZcmEk.mjs +3 -0
- package/dist/chunks/wardleyDiagram-NUSXRM2D-Ca9XByNH.mjs +594 -0
- package/dist/chunks/xychartDiagram-5P7HB3ND-C8AyKUAE.mjs +2017 -0
- package/dist/cli.mjs +1 -1
- package/dist/full.mjs +14 -14
- package/dist/locales.mjs +95 -84
- package/dist/markdown.mjs +3962 -0
- package/dist/{chunks/messages-6mikOS4D2.mjs → messages-5jvKxQNu2.mjs} +28 -17
- package/dist/{messages-BAcH6PtT2.mjs → messages-7QD-X6XT2.mjs} +28 -17
- package/dist/{messages-DbxbxUiK2.mjs → messages-96iaAUds2.mjs} +29 -18
- package/dist/{messages-CVcQD-9u.mjs → messages-B19o-Teb.mjs} +30 -19
- package/dist/{messages-Ccd587Yn.mjs → messages-B1ZUQagA.mjs} +28 -17
- package/dist/{messages-upqrRZQH2.mjs → messages-B7ieAJBd2.mjs} +28 -17
- package/dist/{chunks/messages-Csvm4mtA.mjs → messages-BECMxmfX.mjs} +28 -17
- package/dist/{chunks/messages-DA7Zk-Cy.mjs → messages-BIHc0KHY.mjs} +29 -18
- package/dist/{chunks/messages-BdnSVKOw.mjs → messages-BIoeoik5.mjs} +28 -17
- package/dist/{chunks/messages-DQ5AyNCU.mjs → messages-BJeGJksD.mjs} +28 -17
- package/dist/{messages-C5XPUD9T2.mjs → messages-BRZX964b2.mjs} +29 -18
- package/dist/{messages-Dkg99bfr2.mjs → messages-BTQPpoM42.mjs} +31 -20
- package/dist/{messages-fLi0P2dP.mjs → messages-BYNcD6uR.mjs} +28 -17
- package/dist/{messages-BvgTQLf72.mjs → messages-BYmmMDrN2.mjs} +28 -17
- package/dist/{chunks/messages-CgRvtOEY.mjs → messages-BbYq1pk-.mjs} +28 -17
- package/dist/{chunks/messages-DUDgFEEe2.mjs → messages-BiUGXvYr2.mjs} +28 -17
- package/dist/{chunks/messages-DJkIeapn.mjs → messages-BiiongNz2.mjs} +28 -17
- package/dist/{messages-BBq0M604.mjs → messages-Bm0Feca1.mjs} +32 -21
- package/dist/{messages-eTourT12.mjs → messages-BmAn22OX.mjs} +28 -17
- package/dist/{messages-C6Y4Jv2N.mjs → messages-Bq3F2Tp_.mjs} +28 -17
- package/dist/{messages-DIRha_gg2.mjs → messages-BsycN_JI2.mjs} +28 -17
- package/dist/{chunks/messages-CljStrYi.mjs → messages-BwHs4cm1.mjs} +32 -21
- package/dist/{chunks/messages-Cs9XBt4T.mjs → messages-CJTy6JZt.mjs} +28 -17
- package/dist/{messages-BokEflKa.mjs → messages-CR_L_UtK.mjs} +28 -17
- package/dist/{chunks/messages-ZJ0b1C3a.mjs → messages-CSUHBs4c2.mjs} +28 -17
- package/dist/{messages-BcFQFcJ92.mjs → messages-CWIXvnDf2.mjs} +28 -17
- package/dist/{messages-DnatBKPm.mjs → messages-CcF4y-E4.mjs} +28 -17
- package/dist/{messages-BywbKcPC.mjs → messages-Ce6KVEbT.mjs} +29 -18
- package/dist/{messages-DOTJ2NvJ.mjs → messages-Ci0KqX-J.mjs} +35 -24
- package/dist/{messages-BtxaN-xx.mjs → messages-CjbnogEC.mjs} +28 -17
- package/dist/{messages-BSe3QDnQ.mjs → messages-CmB406HW.mjs} +30 -19
- package/dist/{messages-BVKZK-3t.mjs → messages-CqXtJTpU.mjs} +28 -17
- package/dist/{chunks/messages-DJA6fb_P2.mjs → messages-D0aw5_0k2.mjs} +30 -19
- package/dist/{chunks/messages-DPykxECP2.mjs → messages-D8FQWulF2.mjs} +28 -17
- package/dist/{chunks/messages-CpzO7KRA.mjs → messages-DBiVgUs2.mjs} +29 -18
- package/dist/{chunks/messages-B0ffBqzr.mjs → messages-DIJlIqlQ2.mjs} +28 -17
- package/dist/{chunks/messages-BaPZuLjN.mjs → messages-DLX_iBDJ.mjs} +28 -17
- package/dist/{chunks/messages-CvfKofOP.mjs → messages-DLlc9QPw.mjs} +28 -17
- package/dist/{chunks/messages-Czny5pPT2.mjs → messages-DMr62KiO2.mjs} +28 -17
- package/dist/{chunks/messages-IDEUsFhQ2.mjs → messages-DPA-mMWC2.mjs} +29 -18
- package/dist/{messages-BCuTVHBV.mjs → messages-DTh9a8mR.mjs} +28 -17
- package/dist/{chunks/messages-DT7fRpCy.mjs → messages-DY4IqlhY.mjs} +28 -17
- package/dist/{chunks/messages-BgVEGd4c.mjs → messages-DYTTu0O12.mjs} +28 -17
- package/dist/{messages-Bk984gRE2.mjs → messages-DbySKTKt2.mjs} +30 -19
- package/dist/{chunks/messages-ID1PHnMv.mjs → messages-Ddnj2iTG2.mjs} +28 -17
- package/dist/{messages-BmNaAyKS.mjs → messages-DkLU_rWm.mjs} +28 -17
- package/dist/{messages-C6OJvnJg2.mjs → messages-Dl3Sv6Rq2.mjs} +29 -18
- package/dist/{chunks/messages-C1OqT_nL.mjs → messages-Dl5Y2-Ia.mjs} +51 -40
- package/dist/{chunks/messages-Cqc-6rfh2.mjs → messages-DnG0ef8t2.mjs} +30 -19
- package/dist/{chunks/messages-BkCjgGxc.mjs → messages-DnGJD4TL.mjs} +28 -17
- package/dist/{messages-Bio7KYsr2.mjs → messages-Dnp9N6RU2.mjs} +28 -17
- package/dist/{chunks/messages-Df87zXXG.mjs → messages-Dvn35ksS.mjs} +28 -17
- package/dist/{messages-CHJ5SOZI.mjs → messages-Dw__BcTj.mjs} +28 -17
- package/dist/{chunks/messages-DC7TX-YT.mjs → messages-Dy-Y_nEI.mjs} +28 -17
- package/dist/{messages-DV9e1DW7.mjs → messages-E_ZuzGDt.mjs} +28 -17
- package/dist/{messages-DD5pW0zJ.mjs → messages-F2xRoY1w.mjs} +28 -17
- package/dist/{chunks/messages-BgsPQXfP.mjs → messages-Smt4GBbj.mjs} +33 -22
- package/dist/{messages-DJT4Bt_02.mjs → messages-aMXpHt5X2.mjs} +28 -17
- package/dist/{chunks/messages-B2pW6jO_.mjs → messages-aWZH50vu2.mjs} +30 -19
- package/dist/{chunks/messages-u2yxkNTE2.mjs → messages-dv19AkyJ.mjs} +28 -17
- package/dist/{messages-DJKLtW7u.mjs → messages-hWwSRF-2.mjs} +28 -17
- package/dist/{messages-tK67CBqn.mjs → messages-j7o5rT9s.mjs} +28 -17
- package/dist/{messages-DqyqEw1_.mjs → messages-nUVjeh7K.mjs} +29 -18
- package/dist/{chunks/messages-DSjXen8E.mjs → messages-nlhESX9t.mjs} +28 -17
- package/dist/{messages-C30Vz-UZ2.mjs → messages-rk-A1Wa42.mjs} +30 -19
- package/dist/{chunks/messages-DR09nkcZ.mjs → messages-xh2eOLvs.mjs} +28 -17
- package/dist/{chunks/messages-C11byid72.mjs → messages-ynAe7ewZ.mjs} +28 -17
- package/dist/react.mjs +3 -3
- package/dist/tools.mjs +3 -3
- package/dist/vendor.LICENSE.txt +4609 -212
- package/package.json +21 -3
- package/src/components/blocks.ts +26 -1
- package/src/components/constants/data-attributes.ts +0 -2
- package/src/components/i18n/locales/am/messages.json +28 -17
- package/src/components/i18n/locales/ar/messages.json +28 -17
- package/src/components/i18n/locales/az/messages.json +28 -17
- package/src/components/i18n/locales/bg/messages.json +28 -17
- package/src/components/i18n/locales/bn/messages.json +28 -17
- package/src/components/i18n/locales/bs/messages.json +30 -19
- package/src/components/i18n/locales/cs/messages.json +32 -21
- package/src/components/i18n/locales/da/messages.json +35 -24
- package/src/components/i18n/locales/de/messages.json +33 -22
- package/src/components/i18n/locales/dv/messages.json +28 -17
- package/src/components/i18n/locales/el/messages.json +28 -17
- package/src/components/i18n/locales/en/messages.json +28 -17
- package/src/components/i18n/locales/es/messages.json +29 -18
- package/src/components/i18n/locales/et/messages.json +32 -21
- package/src/components/i18n/locales/fa/messages.json +28 -17
- package/src/components/i18n/locales/fi/messages.json +28 -17
- package/src/components/i18n/locales/fil/messages.json +51 -40
- package/src/components/i18n/locales/fr/messages.json +29 -18
- package/src/components/i18n/locales/gu/messages.json +28 -17
- package/src/components/i18n/locales/he/messages.json +28 -17
- package/src/components/i18n/locales/hi/messages.json +28 -17
- package/src/components/i18n/locales/hr/messages.json +30 -19
- package/src/components/i18n/locales/hu/messages.json +29 -18
- package/src/components/i18n/locales/hy/messages.json +28 -17
- package/src/components/i18n/locales/id/messages.json +28 -17
- package/src/components/i18n/locales/it/messages.json +29 -18
- package/src/components/i18n/locales/ja/messages.json +28 -17
- package/src/components/i18n/locales/ka/messages.json +28 -17
- package/src/components/i18n/locales/km/messages.json +28 -17
- package/src/components/i18n/locales/kn/messages.json +28 -17
- package/src/components/i18n/locales/ko/messages.json +28 -17
- package/src/components/i18n/locales/ku/messages.json +28 -17
- package/src/components/i18n/locales/lo/messages.json +28 -17
- package/src/components/i18n/locales/lt/messages.json +28 -17
- package/src/components/i18n/locales/lv/messages.json +28 -17
- package/src/components/i18n/locales/mk/messages.json +28 -17
- package/src/components/i18n/locales/ml/messages.json +28 -17
- package/src/components/i18n/locales/mn/messages.json +28 -17
- package/src/components/i18n/locales/mr/messages.json +28 -17
- package/src/components/i18n/locales/ms/messages.json +30 -19
- package/src/components/i18n/locales/my/messages.json +28 -17
- package/src/components/i18n/locales/ne/messages.json +28 -17
- package/src/components/i18n/locales/nl/messages.json +30 -19
- package/src/components/i18n/locales/no/messages.json +31 -20
- package/src/components/i18n/locales/pa/messages.json +28 -17
- package/src/components/i18n/locales/pl/messages.json +29 -18
- package/src/components/i18n/locales/ps/messages.json +28 -17
- package/src/components/i18n/locales/pt/messages.json +29 -18
- package/src/components/i18n/locales/ro/messages.json +29 -18
- package/src/components/i18n/locales/ru/messages.json +28 -17
- package/src/components/i18n/locales/sd/messages.json +28 -17
- package/src/components/i18n/locales/si/messages.json +28 -17
- package/src/components/i18n/locales/sk/messages.json +30 -19
- package/src/components/i18n/locales/sl/messages.json +30 -19
- package/src/components/i18n/locales/sq/messages.json +29 -18
- package/src/components/i18n/locales/sr/messages.json +28 -17
- package/src/components/i18n/locales/sv/messages.json +30 -19
- package/src/components/i18n/locales/sw/messages.json +28 -17
- package/src/components/i18n/locales/ta/messages.json +28 -17
- package/src/components/i18n/locales/te/messages.json +28 -17
- package/src/components/i18n/locales/th/messages.json +28 -17
- package/src/components/i18n/locales/tr/messages.json +28 -17
- package/src/components/i18n/locales/ug/messages.json +28 -17
- package/src/components/i18n/locales/uk/messages.json +28 -17
- package/src/components/i18n/locales/ur/messages.json +28 -17
- package/src/components/i18n/locales/vi/messages.json +28 -17
- package/src/components/i18n/locales/yi/messages.json +28 -17
- package/src/components/i18n/locales/zh/messages.json +28 -17
- package/src/components/icons/index.ts +59 -47
- package/src/components/inline-tools/inline-tool-code.ts +399 -0
- package/src/components/modules/api/blocks.ts +17 -0
- package/src/components/modules/api/tools.ts +0 -19
- package/src/components/modules/blockEvents/composers/blockSelectionKeys.ts +20 -3
- package/src/components/modules/blockEvents/composers/keyboardNavigation.ts +5 -5
- package/src/components/modules/blockManager/blockManager.ts +0 -11
- package/src/components/modules/blockManager/event-binder.ts +1 -12
- package/src/components/modules/paste/handlers/html-handler.ts +13 -10
- package/src/components/modules/paste/handlers/index.ts +1 -0
- package/src/components/modules/paste/index.ts +6 -0
- package/src/components/modules/themeManager.ts +1 -3
- package/src/components/modules/toolbar/blockSettings.ts +1 -0
- package/src/components/modules/toolbar/inline/index.ts +3 -0
- package/src/components/modules/ui.ts +0 -13
- package/src/components/modules/uiControllers/controllers/keyboard.ts +0 -29
- package/src/components/modules/uiControllers/controllers/selection.ts +2 -14
- package/src/components/ui/toolbox.ts +1 -0
- package/src/components/utils/popover/popover-position.ts +2 -4
- package/src/markdown/index.ts +63 -0
- package/src/markdown/markdown-handler.ts +110 -0
- package/src/markdown/mdast-to-blocks.ts +418 -0
- package/src/markdown/phrasing-to-html.ts +60 -0
- package/src/markdown/types.ts +42 -0
- package/src/stories/EditorModes.stories.ts +0 -60
- package/src/styles/main.css +39 -1140
- package/src/tools/callout/emoji-picker/index.ts +3 -2
- package/src/tools/callout/index.ts +24 -0
- package/src/tools/code/code-keyboard.ts +142 -0
- package/src/tools/code/constants.ts +96 -0
- package/src/tools/code/dom-builder.ts +181 -0
- package/src/tools/code/highlight-applier.ts +229 -0
- package/src/tools/code/index.ts +462 -0
- package/src/tools/code/katex-loader.ts +50 -0
- package/src/tools/code/language-picker.ts +241 -0
- package/src/tools/code/mermaid-loader.ts +45 -0
- package/src/tools/code/shiki-loader.ts +135 -0
- package/src/tools/divider/index.ts +9 -1
- package/src/tools/index.ts +4 -2
- package/src/tools/list/block-operations.ts +3 -1
- package/src/tools/list/depth-validator.ts +4 -7
- package/src/tools/list/dom-builder.ts +5 -3
- package/src/tools/list/index.ts +21 -3
- package/src/tools/list/list-helpers.ts +9 -2
- package/src/tools/list/list-keyboard.ts +56 -14
- package/src/tools/list/list-lifecycle.ts +3 -1
- package/src/tools/list/marker-calculator.ts +37 -0
- package/src/tools/list/ordered-marker-manager.ts +4 -2
- package/src/tools/table/core/table-commands.ts +16 -0
- package/src/tools/table/core/table-controller.ts +29 -0
- package/src/tools/table/core/table-events.ts +17 -0
- package/src/tools/table/index.ts +196 -13
- package/src/tools/table/table-cell-blocks.ts +9 -6
- package/src/tools/table/table-cell-clipboard.ts +7 -2
- package/src/tools/table/table-cell-placement-picker.ts +133 -0
- package/src/tools/table/table-cell-selection.ts +174 -19
- package/src/tools/table/table-core.ts +321 -113
- package/src/tools/table/table-map.ts +279 -0
- package/src/tools/table/table-model.ts +901 -1
- package/src/tools/table/table-operations.ts +78 -44
- package/src/tools/table/table-resize.ts +19 -17
- package/src/tools/table/table-row-col-drag.ts +24 -10
- package/src/tools/table/types.ts +24 -2
- package/types/api/tools.d.ts +0 -18
- package/types/data-attributes.d.ts +0 -1
- package/types/index.d.ts +0 -16
- package/types/markdown.d.ts +2 -0
- package/types/tools/code.d.ts +13 -0
- package/src/tools/database/database-backend-sync.ts +0 -101
- package/src/tools/database/database-board-view.ts +0 -301
- package/src/tools/database/database-card-drag.ts +0 -306
- package/src/tools/database/database-card-drawer.ts +0 -546
- package/src/tools/database/database-column-controls.ts +0 -46
- package/src/tools/database/database-column-drag.ts +0 -262
- package/src/tools/database/database-keyboard.ts +0 -35
- package/src/tools/database/database-list-row-drag.ts +0 -245
- package/src/tools/database/database-list-view.ts +0 -333
- package/src/tools/database/database-model.ts +0 -246
- package/src/tools/database/database-property-type-popover.ts +0 -108
- package/src/tools/database/database-tab-bar.ts +0 -532
- package/src/tools/database/database-view-popover.ts +0 -109
- package/src/tools/database/database-view-renderer.ts +0 -25
- package/src/tools/database/index.ts +0 -948
- package/src/tools/database/types.ts +0 -144
- package/types/tools/database.d.ts +0 -145
- /package/dist/chunks/{am-CHDDMHkd.mjs → am-rVzV1W41.mjs} +0 -0
- /package/dist/chunks/{ar-DoqfNqut.mjs → ar-C710lkoH.mjs} +0 -0
- /package/dist/chunks/{az-C34P9iEa.mjs → az-BOp1pgua.mjs} +0 -0
- /package/dist/chunks/{bg-jroXLY8Y.mjs → bg-CL9p09ZD.mjs} +0 -0
- /package/dist/chunks/{bn-BRI-WqxY.mjs → bn-CNmSeyAy.mjs} +0 -0
- /package/dist/chunks/{bs-CCGUpNHu.mjs → bs-BRzMGqzk.mjs} +0 -0
- /package/dist/chunks/{cs-D5qZOGuc.mjs → cs-BYPBLmnF.mjs} +0 -0
- /package/dist/chunks/{da-DrJ7W37K.mjs → da-CBC_LR1c.mjs} +0 -0
- /package/dist/chunks/{de-BW6-kp2c.mjs → de-DxRFMoAj.mjs} +0 -0
- /package/dist/chunks/{el-C-Vc_Otu.mjs → el-Bk6YbySf.mjs} +0 -0
- /package/dist/chunks/{es-B6fI5K9i.mjs → es-DpT3FCMR.mjs} +0 -0
- /package/dist/chunks/{et-BhVlZ-Yz.mjs → et-DE9Dr_g9.mjs} +0 -0
- /package/dist/chunks/{fa-D55Ijdqa.mjs → fa-Banj1QUE.mjs} +0 -0
- /package/dist/chunks/{fi-jNLjhKUQ.mjs → fi-DfN3M5ER.mjs} +0 -0
- /package/dist/chunks/{fil-DYd0T5aX.mjs → fil-DbCsRS1d.mjs} +0 -0
- /package/dist/chunks/{fr-yxy5xWw_.mjs → fr-D1clKhgt.mjs} +0 -0
- /package/dist/chunks/{gu-CcY_LJe7.mjs → gu-1CsZyRwT.mjs} +0 -0
- /package/dist/chunks/{he-DL9s7wNw.mjs → he-qQdnL6eK.mjs} +0 -0
- /package/dist/chunks/{hi-C8eGXgw5.mjs → hi-DxM0Nff1.mjs} +0 -0
- /package/dist/chunks/{hr-DLpybOhU.mjs → hr-Onldyi-u.mjs} +0 -0
- /package/dist/chunks/{hu-BkT0gT00.mjs → hu-CAn3pBuY.mjs} +0 -0
- /package/dist/chunks/{hy-CVFDCp2S.mjs → hy-D43q7NxE.mjs} +0 -0
- /package/dist/chunks/{id-0P4W9Az0.mjs → id-Xrw5Dd0Y.mjs} +0 -0
- /package/dist/chunks/{it-mLY6_uoW.mjs → it-CA9ZDMSc.mjs} +0 -0
- /package/dist/chunks/{ja-7RkeRNWG.mjs → ja-D0J6WRFh.mjs} +0 -0
- /package/dist/chunks/{ka-C7Lx-Qsh.mjs → ka-BZL7xDuY.mjs} +0 -0
- /package/dist/chunks/{km-Q8udaraH.mjs → km-BimgQZVU.mjs} +0 -0
- /package/dist/chunks/{kn-BiETM-iq.mjs → kn-C2n2cPHK.mjs} +0 -0
- /package/dist/chunks/{ko-tiB80pF1.mjs → ko-n4Cn93D3.mjs} +0 -0
- /package/dist/chunks/{ku-CY-OABkR.mjs → ku-BYZCgT44.mjs} +0 -0
- /package/dist/chunks/{lo-CTBhEnyk.mjs → lo-DVXiAE4N.mjs} +0 -0
- /package/dist/chunks/{lt-BHKHEtqK.mjs → lt-B9KlQFnY.mjs} +0 -0
- /package/dist/chunks/{lv-DWxgtfUg.mjs → lv-BINeOdyx.mjs} +0 -0
- /package/dist/chunks/{mk-BjookGdx.mjs → mk-_-QrPrLN.mjs} +0 -0
- /package/dist/chunks/{ml-L-NnZcp9.mjs → ml-KvJSC1KT.mjs} +0 -0
- /package/dist/chunks/{mn-OMWi7Hl_.mjs → mn-CjFjWnRG.mjs} +0 -0
- /package/dist/chunks/{mr-B6JPzITo.mjs → mr-DqAZ7FRX.mjs} +0 -0
- /package/dist/chunks/{ms-CG3S-sPB.mjs → ms-BZcV4UG_.mjs} +0 -0
- /package/dist/chunks/{my-BLAmGfhT.mjs → my-97SC9jYN.mjs} +0 -0
- /package/dist/chunks/{native-BPcABu9z.mjs → native-CzYG0YgY.mjs} +0 -0
- /package/dist/chunks/{ne-D1JHLfYw.mjs → ne-Bs-M2TyF.mjs} +0 -0
- /package/dist/chunks/{nl-Ca7Q8FnY.mjs → nl-2ZwQilo-.mjs} +0 -0
- /package/dist/chunks/{no-Coxcohcz.mjs → no-fOQTpFq1.mjs} +0 -0
- /package/dist/chunks/{pa-CCaXqpaI.mjs → pa-DLOqkMi0.mjs} +0 -0
- /package/dist/chunks/{pl-Cl_fAZ84.mjs → pl-FYs9QrXU.mjs} +0 -0
- /package/dist/chunks/{ps-WD5qGAWy.mjs → ps-CTXe6pSe.mjs} +0 -0
- /package/dist/chunks/{pt-C4zvLfvq.mjs → pt-B1X4x7d1.mjs} +0 -0
- /package/dist/chunks/{ro-DbefHcmM.mjs → ro-Bf7S2FaR.mjs} +0 -0
- /package/dist/chunks/{ru-uU1J14jd.mjs → ru-B8lqnu_j.mjs} +0 -0
- /package/dist/chunks/{sd-DKu368Ip.mjs → sd-CHRYJm2r.mjs} +0 -0
- /package/dist/chunks/{si-BsJCiPkZ.mjs → si-CI0Hs6vH.mjs} +0 -0
- /package/dist/chunks/{sk-CD-a3SN6.mjs → sk-Bdvq1Kb_.mjs} +0 -0
- /package/dist/chunks/{sl-CXhrPJe_.mjs → sl-B_qiFTV5.mjs} +0 -0
- /package/dist/chunks/{sq-CTctCoFQ.mjs → sq-E0j1hysP.mjs} +0 -0
- /package/dist/chunks/{sr-BZkhBwXj.mjs → sr-VPpVNTZw.mjs} +0 -0
- /package/dist/chunks/{sv-NmRZb_xi.mjs → sv-gKmDSR3d.mjs} +0 -0
- /package/dist/chunks/{sw-Be5ik3H6.mjs → sw-zeFLiO23.mjs} +0 -0
- /package/dist/chunks/{ta-DsXh6neL.mjs → ta-Ci-j89hR.mjs} +0 -0
- /package/dist/chunks/{te-CwpCbM8M.mjs → te-qyMI0M7a.mjs} +0 -0
- /package/dist/chunks/{th-CcZ15OLk.mjs → th-DPxHtpdb.mjs} +0 -0
- /package/dist/chunks/{tr-q3bTgvhW.mjs → tr-CRV6GS-G.mjs} +0 -0
- /package/dist/chunks/{tw-DmW6-pCY.mjs → tw-CqxBf-1Y.mjs} +0 -0
- /package/dist/chunks/{ug-919EhLsL.mjs → ug-DW0YFpo5.mjs} +0 -0
- /package/dist/chunks/{uk-aNMEzd0Y.mjs → uk-ssteuphK.mjs} +0 -0
- /package/dist/chunks/{ur-BwQI77sh.mjs → ur-qhY3-jY7.mjs} +0 -0
- /package/dist/chunks/{vi-Dxq806-F.mjs → vi-CHriMMC8.mjs} +0 -0
- /package/dist/chunks/{zh-BcHuy1Ti.mjs → zh-BJktawVN.mjs} +0 -0
|
@@ -32,7 +32,10 @@ export interface KeyboardContext {
|
|
|
32
32
|
/**
|
|
33
33
|
* Handle Enter key - split content or exit list
|
|
34
34
|
*/
|
|
35
|
-
export const handleEnter = async (
|
|
35
|
+
export const handleEnter = async (
|
|
36
|
+
context: KeyboardContext,
|
|
37
|
+
depthValidator?: ListDepthValidator
|
|
38
|
+
): Promise<void> => {
|
|
36
39
|
const { api, blockId, data, element, getContentElement } = context;
|
|
37
40
|
|
|
38
41
|
const selection = window.getSelection();
|
|
@@ -45,7 +48,7 @@ export const handleEnter = async (context: KeyboardContext): Promise<void> => {
|
|
|
45
48
|
|
|
46
49
|
// If current item is empty, handle based on depth
|
|
47
50
|
if (currentContent === '' || currentContent === '<br>') {
|
|
48
|
-
await exitListOrOutdent(context);
|
|
51
|
+
await exitListOrOutdent(context, depthValidator);
|
|
49
52
|
return;
|
|
50
53
|
}
|
|
51
54
|
|
|
@@ -98,13 +101,16 @@ export const handleEnter = async (context: KeyboardContext): Promise<void> => {
|
|
|
98
101
|
/**
|
|
99
102
|
* Exit list or outdent when pressing Enter on empty item
|
|
100
103
|
*/
|
|
101
|
-
const exitListOrOutdent = async (
|
|
104
|
+
const exitListOrOutdent = async (
|
|
105
|
+
context: KeyboardContext,
|
|
106
|
+
depthValidator?: ListDepthValidator
|
|
107
|
+
): Promise<void> => {
|
|
102
108
|
const { api, blockId, getDepth } = context;
|
|
103
109
|
const currentDepth = getDepth();
|
|
104
110
|
|
|
105
111
|
// If nested, outdent instead of exiting
|
|
106
112
|
if (currentDepth > 0) {
|
|
107
|
-
await handleOutdent(context);
|
|
113
|
+
await handleOutdent(context, depthValidator);
|
|
108
114
|
return;
|
|
109
115
|
}
|
|
110
116
|
|
|
@@ -193,16 +199,11 @@ export const handleIndent = async(
|
|
|
193
199
|
const { api, blockId, data, syncContentFromDOM, getDepth } = context;
|
|
194
200
|
|
|
195
201
|
const currentBlockIndex = api.blocks.getCurrentBlockIndex();
|
|
196
|
-
if (currentBlockIndex === 0) return;
|
|
197
|
-
|
|
198
|
-
const previousBlock = api.blocks.getBlockByIndex(currentBlockIndex - 1);
|
|
199
|
-
if (!previousBlock || previousBlock.name !== TOOL_NAME) return;
|
|
200
|
-
|
|
201
202
|
const currentDepth = getDepth();
|
|
202
|
-
const
|
|
203
|
+
const maxAllowedDepth = depthValidator.getMaxAllowedDepth(currentBlockIndex);
|
|
203
204
|
|
|
204
|
-
// Can only indent
|
|
205
|
-
if (currentDepth
|
|
205
|
+
// Can only indent if current depth is below the maximum
|
|
206
|
+
if (currentDepth >= maxAllowedDepth) return;
|
|
206
207
|
|
|
207
208
|
// Sync current content before updating
|
|
208
209
|
syncContentFromDOM();
|
|
@@ -222,9 +223,45 @@ export const handleIndent = async(
|
|
|
222
223
|
};
|
|
223
224
|
|
|
224
225
|
/**
|
|
225
|
-
*
|
|
226
|
+
* Reduce depth by 1 for all descendant list items following the given block.
|
|
227
|
+
* Stops at non-list blocks or blocks with depth <= the parent's original depth.
|
|
226
228
|
*/
|
|
227
|
-
|
|
229
|
+
const cascadeDepthReduction = async (
|
|
230
|
+
api: API,
|
|
231
|
+
blockId: string | undefined,
|
|
232
|
+
parentOriginalDepth: number,
|
|
233
|
+
depthValidator: ListDepthValidator
|
|
234
|
+
): Promise<void> => {
|
|
235
|
+
const startIndex = blockId
|
|
236
|
+
? api.blocks.getBlockIndex(blockId) ?? api.blocks.getCurrentBlockIndex()
|
|
237
|
+
: api.blocks.getCurrentBlockIndex();
|
|
238
|
+
const blocksCount = api.blocks.getBlocksCount();
|
|
239
|
+
|
|
240
|
+
const processDescendant = async (index: number): Promise<void> => {
|
|
241
|
+
if (index >= blocksCount) return;
|
|
242
|
+
|
|
243
|
+
const block = api.blocks.getBlockByIndex(index);
|
|
244
|
+
|
|
245
|
+
if (!block || block.name !== TOOL_NAME) return;
|
|
246
|
+
|
|
247
|
+
const blockDepth = depthValidator.getBlockDepth(block);
|
|
248
|
+
|
|
249
|
+
if (blockDepth <= parentOriginalDepth) return;
|
|
250
|
+
|
|
251
|
+
await api.blocks.update(block.id, { depth: blockDepth - 1 });
|
|
252
|
+
await processDescendant(index + 1);
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
await processDescendant(startIndex + 1);
|
|
256
|
+
};
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Handle Shift+Tab key - outdent the list item and cascade to descendants
|
|
260
|
+
*/
|
|
261
|
+
export const handleOutdent = async(
|
|
262
|
+
context: KeyboardContext,
|
|
263
|
+
depthValidator?: ListDepthValidator
|
|
264
|
+
): Promise<void> => {
|
|
228
265
|
const { api, blockId, data, syncContentFromDOM, getDepth } = context;
|
|
229
266
|
|
|
230
267
|
const currentDepth = getDepth();
|
|
@@ -245,6 +282,11 @@ export const handleOutdent = async(context: KeyboardContext): Promise<void> => {
|
|
|
245
282
|
depth: newDepth,
|
|
246
283
|
});
|
|
247
284
|
|
|
285
|
+
// Cascade depth reduction to descendant list items
|
|
286
|
+
if (depthValidator) {
|
|
287
|
+
await cascadeDepthReduction(api, blockId, currentDepth, depthValidator);
|
|
288
|
+
}
|
|
289
|
+
|
|
248
290
|
// Restore focus to the updated block after DOM has been updated
|
|
249
291
|
setCaretToBlockContent(api, updatedBlock);
|
|
250
292
|
};
|
|
@@ -16,6 +16,7 @@ export interface RenderContext {
|
|
|
16
16
|
placeholder: string;
|
|
17
17
|
itemColor: string | undefined;
|
|
18
18
|
itemSize: string | undefined;
|
|
19
|
+
markerDepth?: number;
|
|
19
20
|
setupItemPlaceholder: (element: HTMLElement) => void;
|
|
20
21
|
onCheckboxChange: (checked: boolean, content: HTMLElement | null) => void;
|
|
21
22
|
keydownHandler: ((event: KeyboardEvent) => void) | undefined;
|
|
@@ -25,7 +26,7 @@ export interface RenderContext {
|
|
|
25
26
|
* Render the list item
|
|
26
27
|
*/
|
|
27
28
|
export const renderListItem = (context: RenderContext): HTMLElement => {
|
|
28
|
-
const { data, readOnly, placeholder, itemColor, itemSize, setupItemPlaceholder, onCheckboxChange, keydownHandler } = context;
|
|
29
|
+
const { data, readOnly, placeholder, itemColor, itemSize, markerDepth, setupItemPlaceholder, onCheckboxChange, keydownHandler } = context;
|
|
29
30
|
|
|
30
31
|
const result = buildListItem({
|
|
31
32
|
data,
|
|
@@ -33,6 +34,7 @@ export const renderListItem = (context: RenderContext): HTMLElement => {
|
|
|
33
34
|
placeholder,
|
|
34
35
|
itemColor,
|
|
35
36
|
itemSize,
|
|
37
|
+
markerDepth,
|
|
36
38
|
keydownHandler,
|
|
37
39
|
});
|
|
38
40
|
|
|
@@ -191,6 +191,43 @@ export class ListMarkerCalculator {
|
|
|
191
191
|
return this.findFirstItemIndex(index - 1, targetDepth, remainingCount - 1, targetStyle);
|
|
192
192
|
}
|
|
193
193
|
|
|
194
|
+
/**
|
|
195
|
+
* Get the base depth of the contiguous list run containing the block at blockIndex.
|
|
196
|
+
* Walks backward until a non-list block or the start of the editor is reached,
|
|
197
|
+
* then returns the depth of the first list item in that run.
|
|
198
|
+
*
|
|
199
|
+
* @param blockIndex - The block index to look up
|
|
200
|
+
* @returns The depth of the first list item in the run
|
|
201
|
+
*/
|
|
202
|
+
getGroupBaseDepth(blockIndex: number): number {
|
|
203
|
+
const findFirstListIndex = (index: number): number => {
|
|
204
|
+
if (index <= 0) {
|
|
205
|
+
return 0;
|
|
206
|
+
}
|
|
207
|
+
const prevBlock = this.blocks.getBlockByIndex(index - 1);
|
|
208
|
+
if (!prevBlock || prevBlock.name !== TOOL_NAME) {
|
|
209
|
+
return index;
|
|
210
|
+
}
|
|
211
|
+
return findFirstListIndex(index - 1);
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
const firstListIndex = findFirstListIndex(blockIndex);
|
|
215
|
+
const firstBlock = this.blocks.getBlockByIndex(firstListIndex);
|
|
216
|
+
return this.getBlockDepth(firstBlock);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Get the visual depth for marker display.
|
|
221
|
+
* Returns the depth relative to the list group's base, clamped to >= 0.
|
|
222
|
+
*
|
|
223
|
+
* @param blockIndex - The block index
|
|
224
|
+
* @param actualDepth - The block's actual depth
|
|
225
|
+
* @returns The visual depth for marker formatting
|
|
226
|
+
*/
|
|
227
|
+
getVisualDepth(blockIndex: number, actualDepth: number): number {
|
|
228
|
+
return Math.max(0, actualDepth - this.getGroupBaseDepth(blockIndex));
|
|
229
|
+
}
|
|
230
|
+
|
|
194
231
|
/**
|
|
195
232
|
* Get the depth of a block by reading from its DOM.
|
|
196
233
|
*/
|
|
@@ -77,7 +77,8 @@ export class OrderedMarkerManager {
|
|
|
77
77
|
: startValue;
|
|
78
78
|
|
|
79
79
|
const actualNumber = actualStartValue + siblingIndex;
|
|
80
|
-
const
|
|
80
|
+
const visualDepth = this.markerCalculator.getVisualDepth(blockIndex, blockDepth);
|
|
81
|
+
const markerText = this.markerCalculator.formatNumber(actualNumber, visualDepth);
|
|
81
82
|
|
|
82
83
|
marker.textContent = markerText;
|
|
83
84
|
}
|
|
@@ -241,7 +242,8 @@ export class OrderedMarkerManager {
|
|
|
241
242
|
: startValue;
|
|
242
243
|
|
|
243
244
|
const actualNumber = actualStartValue + siblingIndex;
|
|
244
|
-
const
|
|
245
|
+
const visualDepth = this.markerCalculator.getVisualDepth(blockIndex, blockDepth);
|
|
246
|
+
const markerText = this.markerCalculator.formatNumber(actualNumber, visualDepth);
|
|
245
247
|
|
|
246
248
|
marker.textContent = markerText;
|
|
247
249
|
}
|
|
@@ -77,6 +77,20 @@ export interface SetColWidthsCommand {
|
|
|
77
77
|
readonly widths: readonly number[] | undefined;
|
|
78
78
|
}
|
|
79
79
|
|
|
80
|
+
export interface MergeCellsCommand {
|
|
81
|
+
readonly type: 'merge-cells';
|
|
82
|
+
readonly minRow: number;
|
|
83
|
+
readonly maxRow: number;
|
|
84
|
+
readonly minCol: number;
|
|
85
|
+
readonly maxCol: number;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export interface SplitCellCommand {
|
|
89
|
+
readonly type: 'split-cell';
|
|
90
|
+
readonly row: number;
|
|
91
|
+
readonly col: number;
|
|
92
|
+
}
|
|
93
|
+
|
|
80
94
|
export interface ReplaceAllCommand {
|
|
81
95
|
readonly type: 'replace-all';
|
|
82
96
|
readonly data: TableData;
|
|
@@ -96,4 +110,6 @@ export type TableCommand =
|
|
|
96
110
|
| RemoveBlockFromCellCommand
|
|
97
111
|
| SetCellBlocksCommand
|
|
98
112
|
| SetColWidthsCommand
|
|
113
|
+
| MergeCellsCommand
|
|
114
|
+
| SplitCellCommand
|
|
99
115
|
| ReplaceAllCommand;
|
|
@@ -83,6 +83,12 @@ export class TableController {
|
|
|
83
83
|
case 'set-col-widths':
|
|
84
84
|
return this.handleSetColWidths(command.widths ? [...command.widths] : undefined);
|
|
85
85
|
|
|
86
|
+
case 'merge-cells':
|
|
87
|
+
return this.handleMergeCells(command.minRow, command.maxRow, command.minCol, command.maxCol);
|
|
88
|
+
|
|
89
|
+
case 'split-cell':
|
|
90
|
+
return this.handleSplitCell(command.row, command.col);
|
|
91
|
+
|
|
86
92
|
case 'replace-all':
|
|
87
93
|
return this.handleReplaceAll(command.data);
|
|
88
94
|
}
|
|
@@ -223,6 +229,29 @@ export class TableController {
|
|
|
223
229
|
};
|
|
224
230
|
}
|
|
225
231
|
|
|
232
|
+
private handleMergeCells(minRow: number, maxRow: number, minCol: number, maxCol: number): TableDomainEvent {
|
|
233
|
+
const result = this.model.mergeCells({ minRow, maxRow, minCol, maxCol });
|
|
234
|
+
|
|
235
|
+
return {
|
|
236
|
+
type: 'cells-merged',
|
|
237
|
+
minRow,
|
|
238
|
+
maxRow,
|
|
239
|
+
minCol,
|
|
240
|
+
maxCol,
|
|
241
|
+
blocksToRelocate: result.blocksToRelocate,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
private handleSplitCell(row: number, col: number): TableDomainEvent {
|
|
246
|
+
this.model.splitCell(row, col);
|
|
247
|
+
|
|
248
|
+
return {
|
|
249
|
+
type: 'cell-split',
|
|
250
|
+
row,
|
|
251
|
+
col,
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
|
|
226
255
|
private handleReplaceAll(data: TableData): TableDomainEvent {
|
|
227
256
|
this.model.replaceAll(data);
|
|
228
257
|
|
|
@@ -81,6 +81,21 @@ export interface ColWidthsChangedEvent {
|
|
|
81
81
|
readonly widths: readonly number[] | undefined;
|
|
82
82
|
}
|
|
83
83
|
|
|
84
|
+
export interface CellsMergedEvent {
|
|
85
|
+
readonly type: 'cells-merged';
|
|
86
|
+
readonly minRow: number;
|
|
87
|
+
readonly maxRow: number;
|
|
88
|
+
readonly minCol: number;
|
|
89
|
+
readonly maxCol: number;
|
|
90
|
+
readonly blocksToRelocate: readonly string[];
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export interface CellSplitEvent {
|
|
94
|
+
readonly type: 'cell-split';
|
|
95
|
+
readonly row: number;
|
|
96
|
+
readonly col: number;
|
|
97
|
+
}
|
|
98
|
+
|
|
84
99
|
export interface ModelReplacedEvent {
|
|
85
100
|
readonly type: 'model-replaced';
|
|
86
101
|
}
|
|
@@ -99,4 +114,6 @@ export type TableDomainEvent =
|
|
|
99
114
|
| BlockRemovedFromCellEvent
|
|
100
115
|
| CellBlocksSetEvent
|
|
101
116
|
| ColWidthsChangedEvent
|
|
117
|
+
| CellsMergedEvent
|
|
118
|
+
| CellSplitEvent
|
|
102
119
|
| ModelReplacedEvent;
|
package/src/tools/table/index.ts
CHANGED
|
@@ -25,9 +25,10 @@ import {
|
|
|
25
25
|
} from './table-cell-clipboard';
|
|
26
26
|
import type { CellColorMode } from './table-cell-color-picker';
|
|
27
27
|
import { TableCellSelection } from './table-cell-selection';
|
|
28
|
-
import { TableGrid, ROW_ATTR, CELL_ATTR } from './table-core';
|
|
28
|
+
import { TableGrid, ROW_ATTR, CELL_ATTR, CELL_ROW_ATTR, CELL_COL_ATTR } from './table-core';
|
|
29
29
|
import {
|
|
30
30
|
applyCellColors,
|
|
31
|
+
applyCellPlacements,
|
|
31
32
|
applyPixelWidths,
|
|
32
33
|
computeHalfAvgWidth,
|
|
33
34
|
computeInitialColWidth,
|
|
@@ -54,7 +55,7 @@ import { TableRowColControls } from './table-row-col-controls';
|
|
|
54
55
|
import type { RowColAction } from './table-row-col-controls';
|
|
55
56
|
import { registerAdditionalRestrictedTools } from './table-restrictions';
|
|
56
57
|
import { TableScrollHaze } from './table-scroll-haze';
|
|
57
|
-
import type { ClipboardBlockData, LegacyCellContent, TableCellsClipboard, TableData, TableConfig } from './types';
|
|
58
|
+
import type { CellPlacement, ClipboardBlockData, LegacyCellContent, TableCellsClipboard, TableData, TableConfig } from './types';
|
|
58
59
|
|
|
59
60
|
const DEFAULT_ROWS = 3;
|
|
60
61
|
const DEFAULT_COLS = 3;
|
|
@@ -200,6 +201,120 @@ export class Table implements BlockTool {
|
|
|
200
201
|
this.scrollHaze = null;
|
|
201
202
|
}
|
|
202
203
|
|
|
204
|
+
/**
|
|
205
|
+
* Rebuild the <tbody> from the current model state.
|
|
206
|
+
* Generates a new table via createGridFromModel (with correct colspan/rowspan),
|
|
207
|
+
* transplants existing block holders into the new cells, and swaps the tbody.
|
|
208
|
+
*/
|
|
209
|
+
private rebuildTableBody(): void {
|
|
210
|
+
const gridEl = this.gridElement;
|
|
211
|
+
|
|
212
|
+
if (!gridEl) {
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
const oldTbody = gridEl.querySelector('tbody');
|
|
217
|
+
|
|
218
|
+
if (!oldTbody) {
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// Collect all existing block holders by ID before replacing tbody
|
|
223
|
+
const blockHolders = new Map<string, HTMLElement>();
|
|
224
|
+
|
|
225
|
+
oldTbody.querySelectorAll('[data-blok-id]').forEach(el => {
|
|
226
|
+
const id = el.getAttribute('data-blok-id');
|
|
227
|
+
|
|
228
|
+
if (id) {
|
|
229
|
+
blockHolders.set(id, el as HTMLElement);
|
|
230
|
+
}
|
|
231
|
+
});
|
|
232
|
+
|
|
233
|
+
// Build new table from model (has correct colspan/rowspan structure)
|
|
234
|
+
const newTable = this.grid.createGridFromModel(this.model);
|
|
235
|
+
const newTbody = newTable.querySelector('tbody');
|
|
236
|
+
|
|
237
|
+
if (!newTbody) {
|
|
238
|
+
return;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
// Move block holders from old cells to new cells
|
|
242
|
+
const content = this.model.snapshot().content;
|
|
243
|
+
|
|
244
|
+
this.mountBlockHoldersInNewTbody(content, newTbody, blockHolders);
|
|
245
|
+
|
|
246
|
+
// Replace old tbody with new
|
|
247
|
+
oldTbody.replaceWith(newTbody);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Mount block holders into the new tbody cells based on model content.
|
|
252
|
+
* Extracted to keep rebuildTableBody under nesting depth limit.
|
|
253
|
+
*/
|
|
254
|
+
private mountBlockHoldersInNewTbody(
|
|
255
|
+
content: TableData['content'],
|
|
256
|
+
newTbody: Element,
|
|
257
|
+
blockHolders: Map<string, HTMLElement>
|
|
258
|
+
): void {
|
|
259
|
+
content.forEach((rowData, r) => {
|
|
260
|
+
rowData.forEach((cellContent, c) => {
|
|
261
|
+
if (typeof cellContent === 'string') {
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
if (cellContent.mergedInto) {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
const newCell = newTbody.querySelector(
|
|
270
|
+
`[${CELL_ROW_ATTR}="${r}"][${CELL_COL_ATTR}="${c}"]`
|
|
271
|
+
);
|
|
272
|
+
|
|
273
|
+
if (!newCell) {
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
const container = newCell.querySelector(`[${CELL_BLOCKS_ATTR}]`);
|
|
278
|
+
|
|
279
|
+
if (!container) {
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
cellContent.blocks.forEach(blockId => {
|
|
284
|
+
const holder = blockHolders.get(blockId);
|
|
285
|
+
|
|
286
|
+
if (holder) {
|
|
287
|
+
container.appendChild(holder);
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Check if the model's content contains any merged cells.
|
|
296
|
+
*/
|
|
297
|
+
private modelHasMerges(): boolean {
|
|
298
|
+
const snapshot = this.model.snapshot();
|
|
299
|
+
|
|
300
|
+
return snapshot.content.some(row =>
|
|
301
|
+
row.some(cell =>
|
|
302
|
+
typeof cell !== 'string' && ((cell.colspan ?? 1) > 1 || (cell.rowspan ?? 1) > 1)
|
|
303
|
+
)
|
|
304
|
+
);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
/**
|
|
308
|
+
* Create a flat grid (no merge handling) using createGrid.
|
|
309
|
+
* Extracted from render() to keep it readable.
|
|
310
|
+
*/
|
|
311
|
+
private createFlatGrid(): HTMLTableElement {
|
|
312
|
+
const rows = this.initialContent?.length || this.config.rows || DEFAULT_ROWS;
|
|
313
|
+
const cols = this.initialContent?.reduce((max, row) => Math.max(max, row?.length ?? 0), 0) || this.config.cols || DEFAULT_COLS;
|
|
314
|
+
|
|
315
|
+
return this.grid.createGrid(rows, cols, this.model.colWidths);
|
|
316
|
+
}
|
|
317
|
+
|
|
203
318
|
/**
|
|
204
319
|
* Initialize all visual subsystems on a grid element.
|
|
205
320
|
* Shared by rendered(), setData(), and onPaste() to ensure consistent
|
|
@@ -234,7 +349,7 @@ export class Table implements BlockTool {
|
|
|
234
349
|
|
|
235
350
|
public static get pasteConfig(): PasteConfig {
|
|
236
351
|
return {
|
|
237
|
-
tags: ['TABLE', 'TR',
|
|
352
|
+
tags: ['TABLE', 'TR', { TH: { style: true } }, { TD: { style: true } }],
|
|
238
353
|
};
|
|
239
354
|
}
|
|
240
355
|
|
|
@@ -260,7 +375,7 @@ export class Table implements BlockTool {
|
|
|
260
375
|
|
|
261
376
|
return style.length > 0 ? { style: true } : {};
|
|
262
377
|
},
|
|
263
|
-
a: { href: true },
|
|
378
|
+
a: { href: true, target: '_blank', rel: 'nofollow' },
|
|
264
379
|
input: { type: true, checked: true },
|
|
265
380
|
},
|
|
266
381
|
};
|
|
@@ -309,12 +424,14 @@ export class Table implements BlockTool {
|
|
|
309
424
|
|
|
310
425
|
this.isNewTable = (this.initialContent?.length ?? 0) === 0;
|
|
311
426
|
|
|
312
|
-
const
|
|
313
|
-
const
|
|
427
|
+
const hasContent = (this.initialContent?.length ?? 0) > 0;
|
|
428
|
+
const hasMerges = hasContent && this.modelHasMerges();
|
|
314
429
|
|
|
315
|
-
const gridEl =
|
|
430
|
+
const gridEl = hasMerges
|
|
431
|
+
? this.grid.createGridFromModel(this.model)
|
|
432
|
+
: this.createFlatGrid();
|
|
316
433
|
|
|
317
|
-
if (
|
|
434
|
+
if (hasContent && !hasMerges) {
|
|
318
435
|
this.grid.fillGrid(gridEl, this.initialContent ?? []);
|
|
319
436
|
}
|
|
320
437
|
|
|
@@ -388,7 +505,9 @@ export class Table implements BlockTool {
|
|
|
388
505
|
|
|
389
506
|
if (this.readOnly) {
|
|
390
507
|
mountCellBlocksReadOnly(gridEl, content, this.api, this.blockId ?? '');
|
|
391
|
-
|
|
508
|
+
const snap = this.model.snapshot();
|
|
509
|
+
applyCellColors(gridEl, snap.content);
|
|
510
|
+
applyCellPlacements(gridEl, snap.content);
|
|
392
511
|
this.initScrollHaze();
|
|
393
512
|
|
|
394
513
|
return;
|
|
@@ -430,7 +549,9 @@ export class Table implements BlockTool {
|
|
|
430
549
|
}
|
|
431
550
|
|
|
432
551
|
this.initSubsystems(gridEl);
|
|
433
|
-
|
|
552
|
+
const snapInit = this.model.snapshot();
|
|
553
|
+
applyCellColors(gridEl, snapInit.content);
|
|
554
|
+
applyCellPlacements(gridEl, snapInit.content);
|
|
434
555
|
|
|
435
556
|
if (this.isNewTable) {
|
|
436
557
|
this.cellSelection?.selectRange({ minRow: 0, maxRow: 0, minCol: 0, maxCol: 0 });
|
|
@@ -541,7 +662,9 @@ export class Table implements BlockTool {
|
|
|
541
662
|
}
|
|
542
663
|
|
|
543
664
|
if (this.readOnly) {
|
|
544
|
-
|
|
665
|
+
const snapRO = this.model.snapshot();
|
|
666
|
+
applyCellColors(gridEl, snapRO.content);
|
|
667
|
+
applyCellPlacements(gridEl, snapRO.content);
|
|
545
668
|
|
|
546
669
|
return;
|
|
547
670
|
}
|
|
@@ -602,7 +725,9 @@ export class Table implements BlockTool {
|
|
|
602
725
|
this.rowColControls.restoreVisibleGrips(savedGripIndices.col, savedGripIndices.row);
|
|
603
726
|
}
|
|
604
727
|
|
|
605
|
-
|
|
728
|
+
const snapSet = this.model.snapshot();
|
|
729
|
+
applyCellColors(gridEl, snapSet.content);
|
|
730
|
+
applyCellPlacements(gridEl, snapSet.content);
|
|
606
731
|
}
|
|
607
732
|
|
|
608
733
|
public onPaste(event: HTMLPasteEvent): void {
|
|
@@ -695,7 +820,9 @@ export class Table implements BlockTool {
|
|
|
695
820
|
}, true);
|
|
696
821
|
|
|
697
822
|
this.initSubsystems(gridEl);
|
|
698
|
-
|
|
823
|
+
const snapPaste = this.model.snapshot();
|
|
824
|
+
applyCellColors(gridEl, snapPaste.content);
|
|
825
|
+
applyCellPlacements(gridEl, snapPaste.content);
|
|
699
826
|
}
|
|
700
827
|
}
|
|
701
828
|
|
|
@@ -1183,6 +1310,38 @@ export class Table implements BlockTool {
|
|
|
1183
1310
|
});
|
|
1184
1311
|
}
|
|
1185
1312
|
|
|
1313
|
+
private handleCellPlacementChange(cells: HTMLElement[], placement: CellPlacement): void {
|
|
1314
|
+
const gridEl = this.gridElement;
|
|
1315
|
+
|
|
1316
|
+
if (!gridEl) {
|
|
1317
|
+
return;
|
|
1318
|
+
}
|
|
1319
|
+
|
|
1320
|
+
this.runTransactedStructuralOp(() => {
|
|
1321
|
+
for (const cell of cells) {
|
|
1322
|
+
const coord = getCellPosition(gridEl, cell);
|
|
1323
|
+
|
|
1324
|
+
if (!coord) {
|
|
1325
|
+
continue;
|
|
1326
|
+
}
|
|
1327
|
+
|
|
1328
|
+
this.model.setCellPlacement(coord.row, coord.col, placement === 'top-left' ? undefined : placement);
|
|
1329
|
+
|
|
1330
|
+
const blocksContainer = cell.querySelector<HTMLElement>(`[${CELL_BLOCKS_ATTR}]`);
|
|
1331
|
+
|
|
1332
|
+
if (!blocksContainer) {
|
|
1333
|
+
continue;
|
|
1334
|
+
}
|
|
1335
|
+
|
|
1336
|
+
if (placement === 'top-left') {
|
|
1337
|
+
blocksContainer.removeAttribute('data-blok-cell-placement');
|
|
1338
|
+
} else {
|
|
1339
|
+
blocksContainer.setAttribute('data-blok-cell-placement', placement);
|
|
1340
|
+
}
|
|
1341
|
+
}
|
|
1342
|
+
});
|
|
1343
|
+
}
|
|
1344
|
+
|
|
1186
1345
|
private collectCellBlockData(
|
|
1187
1346
|
cells: HTMLElement[],
|
|
1188
1347
|
): Array<{ row: number; col: number; blocks: ClipboardBlockData[]; color?: string; textColor?: string }> {
|
|
@@ -1333,6 +1492,30 @@ export class Table implements BlockTool {
|
|
|
1333
1492
|
onColorChange: (cells, color, mode) => {
|
|
1334
1493
|
this.handleCellColorChange(cells, color, mode);
|
|
1335
1494
|
},
|
|
1495
|
+
onPlacementChange: (cells, placement) => {
|
|
1496
|
+
this.handleCellPlacementChange(cells, placement);
|
|
1497
|
+
},
|
|
1498
|
+
getCellPlacement: (row, col) => {
|
|
1499
|
+
return this.model.getCellPlacement(row, col);
|
|
1500
|
+
},
|
|
1501
|
+
canMergeCells: (range) => {
|
|
1502
|
+
return this.model.canMergeCells(range);
|
|
1503
|
+
},
|
|
1504
|
+
onMergeCells: (range) => {
|
|
1505
|
+
this.runTransactedStructuralOp(() => {
|
|
1506
|
+
this.model.mergeCells(range);
|
|
1507
|
+
this.rebuildTableBody();
|
|
1508
|
+
});
|
|
1509
|
+
},
|
|
1510
|
+
isMergedCell: (row, col) => {
|
|
1511
|
+
return this.model.isMergedCell(row, col);
|
|
1512
|
+
},
|
|
1513
|
+
onSplitCell: (row, col) => {
|
|
1514
|
+
this.runTransactedStructuralOp(() => {
|
|
1515
|
+
this.model.splitCell(row, col);
|
|
1516
|
+
this.rebuildTableBody();
|
|
1517
|
+
});
|
|
1518
|
+
},
|
|
1336
1519
|
});
|
|
1337
1520
|
}
|
|
1338
1521
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { API } from '../../../types';
|
|
2
2
|
|
|
3
|
-
import { CELL_ATTR, ROW_ATTR } from './table-core';
|
|
3
|
+
import { CELL_ATTR, ROW_ATTR, CELL_COL_ATTR } from './table-core';
|
|
4
4
|
import type { TableModel } from './table-model';
|
|
5
5
|
import type { LegacyCellContent, CellContent } from './types';
|
|
6
6
|
import { isCellWithBlocks } from './types';
|
|
@@ -330,6 +330,12 @@ export class TableCellBlocks {
|
|
|
330
330
|
* Get the number of columns in the table (based on first row)
|
|
331
331
|
*/
|
|
332
332
|
private getColumnCount(): number {
|
|
333
|
+
const colgroup = this.gridElement.querySelector('colgroup');
|
|
334
|
+
|
|
335
|
+
if (colgroup) {
|
|
336
|
+
return colgroup.querySelectorAll('col').length;
|
|
337
|
+
}
|
|
338
|
+
|
|
333
339
|
const firstRow = this.gridElement.querySelector('[data-blok-table-row]');
|
|
334
340
|
|
|
335
341
|
return firstRow?.querySelectorAll('[data-blok-table-cell]').length ?? 0;
|
|
@@ -346,9 +352,7 @@ export class TableCellBlocks {
|
|
|
346
352
|
return null;
|
|
347
353
|
}
|
|
348
354
|
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
return (cells[col] as HTMLElement | undefined) ?? null;
|
|
355
|
+
return rowEl.querySelector<HTMLElement>(`[${CELL_COL_ATTR}="${col}"]`) ?? null;
|
|
352
356
|
}
|
|
353
357
|
|
|
354
358
|
/**
|
|
@@ -368,11 +372,10 @@ export class TableCellBlocks {
|
|
|
368
372
|
return;
|
|
369
373
|
}
|
|
370
374
|
|
|
371
|
-
const cells = row.querySelectorAll(`[${CELL_ATTR}]`);
|
|
372
375
|
const normalizedRow: CellContent[] = [];
|
|
373
376
|
|
|
374
377
|
rowData.forEach((cellContent, colIndex) => {
|
|
375
|
-
const cell =
|
|
378
|
+
const cell = row.querySelector<HTMLElement>(`[${CELL_COL_ATTR}="${colIndex}"]`);
|
|
376
379
|
|
|
377
380
|
if (!cell) {
|
|
378
381
|
return;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { SanitizerConfig } from '../../../types/configs/sanitizer-config';
|
|
2
|
-
import type { ClipboardBlockData, TableCellsClipboard } from './types';
|
|
2
|
+
import type { CellPlacement, ClipboardBlockData, TableCellsClipboard } from './types';
|
|
3
3
|
import { mapToNearestPresetColor } from '../../components/utils/color-mapping';
|
|
4
4
|
import { clean } from '../../components/utils/sanitizer';
|
|
5
5
|
|
|
@@ -33,6 +33,7 @@ interface CellEntry {
|
|
|
33
33
|
blocks: ClipboardBlockData[];
|
|
34
34
|
color?: string;
|
|
35
35
|
textColor?: string;
|
|
36
|
+
placement?: CellPlacement;
|
|
36
37
|
}
|
|
37
38
|
|
|
38
39
|
/**
|
|
@@ -73,6 +74,10 @@ export function serializeCellsToClipboard(entries: CellEntry[]): TableCellsClipb
|
|
|
73
74
|
if (entry.textColor !== undefined) {
|
|
74
75
|
cells[r][c].textColor = entry.textColor;
|
|
75
76
|
}
|
|
77
|
+
|
|
78
|
+
if (entry.placement !== undefined) {
|
|
79
|
+
cells[r][c].placement = entry.placement;
|
|
80
|
+
}
|
|
76
81
|
}
|
|
77
82
|
|
|
78
83
|
return { rows, cols, cells };
|
|
@@ -185,7 +190,7 @@ const CELL_SANITIZE_CONFIG: SanitizerConfig = {
|
|
|
185
190
|
i: true,
|
|
186
191
|
em: true,
|
|
187
192
|
br: true,
|
|
188
|
-
a: { href: true },
|
|
193
|
+
a: { href: true, target: '_blank', rel: 'nofollow' },
|
|
189
194
|
mark: (node: Element): { [attr: string]: boolean | string } => {
|
|
190
195
|
const el = node as HTMLElement;
|
|
191
196
|
const style = el.style;
|