@jackuait/blok 0.16.0 → 0.16.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.
Files changed (363) hide show
  1. package/dist/blok.cjs +1 -1
  2. package/dist/blok.iife.js +2 -2
  3. package/dist/blok.mjs +2 -2
  4. package/dist/blok.umd.js +2 -2
  5. package/dist/chunks/{blok-RLzqfwql.mjs → blok-D1e9swtF.mjs} +69 -69
  6. package/dist/chunks/{blok-BTpZKZQ5.cjs → blok-DEVVs3xk.cjs} +3 -3
  7. package/dist/chunks/{constants-B1fDH6ZT.cjs → constants-B2Lcd7Kk.cjs} +1 -1
  8. package/dist/chunks/{constants-BUNgcIvY.mjs → constants-DfGAwzgk.mjs} +1 -1
  9. package/dist/chunks/messages-04T5j1ww2.cjs +1 -0
  10. package/dist/chunks/messages-0OyEWZDW.cjs +1 -0
  11. package/dist/{messages-CpqGtSQ9.mjs → chunks/messages-14GzwdH92.mjs} +7 -7
  12. package/dist/chunks/messages-3iHkF7Vy.cjs +1 -0
  13. package/dist/chunks/messages-5tb-mSXS.cjs +1 -0
  14. package/dist/{messages-ilnnXk3p.mjs → chunks/messages-8vGF8iWb.mjs} +8 -8
  15. package/dist/chunks/messages-98gouyMa.cjs +1 -0
  16. package/dist/chunks/messages-B-3_M44j.cjs +1 -0
  17. package/dist/chunks/{messages-R3IlcPVE2.mjs → messages-B3xnntgx2.mjs} +8 -8
  18. package/dist/chunks/{messages-Dly-_TB6.mjs → messages-B5eo-pGw.mjs} +21 -21
  19. package/dist/chunks/{messages-3H-mU8nV.mjs → messages-B94JmzMj.mjs} +11 -11
  20. package/dist/chunks/messages-BAgSlZpS.cjs +1 -0
  21. package/dist/chunks/{messages-BoGOF3jH.mjs → messages-BClegbPD.mjs} +15 -15
  22. package/dist/chunks/messages-BDNdC6-X.cjs +1 -0
  23. package/dist/chunks/messages-BG1Tn41d.cjs +1 -0
  24. package/dist/{messages-MYWse7vx2.mjs → chunks/messages-BGoPxZ5n.mjs} +8 -8
  25. package/dist/chunks/{messages-JiQBxj4o2.mjs → messages-BHE1mg5A2.mjs} +9 -9
  26. package/dist/chunks/messages-BItPVbHx.cjs +1 -0
  27. package/dist/chunks/messages-BJ7clJXu2.cjs +1 -0
  28. package/dist/chunks/messages-BPYQEADI.cjs +1 -0
  29. package/dist/chunks/{messages-BRWkudTR.mjs → messages-BQKWm9xB.mjs} +11 -11
  30. package/dist/chunks/{messages-D9MUpOtw2.mjs → messages-BSstxb1m2.mjs} +12 -12
  31. package/dist/chunks/messages-BSxgqWqe.cjs +1 -0
  32. package/dist/chunks/messages-BSyXBvUi2.cjs +1 -0
  33. package/dist/chunks/messages-BVuodJIJ.cjs +1 -0
  34. package/dist/chunks/{messages-vQ8eiHPr2.mjs → messages-BXmg4Rer2.mjs} +4 -4
  35. package/dist/chunks/messages-BdjiMHzU2.cjs +1 -0
  36. package/dist/{messages-BUfHXzRi2.mjs → chunks/messages-Beh905t72.mjs} +12 -12
  37. package/dist/chunks/messages-BfYWRC3o.cjs +1 -0
  38. package/dist/{messages-wB8V2U2i2.mjs → chunks/messages-Bh3E53-f2.mjs} +5 -5
  39. package/dist/chunks/{messages-BSHC8Ohs.mjs → messages-BhTV7PCN.mjs} +10 -10
  40. package/dist/chunks/messages-Bi3snvmH2.cjs +1 -0
  41. package/dist/chunks/{messages-Bh8al9kl.mjs → messages-Bnm45Rmp.mjs} +25 -25
  42. package/dist/{messages-CaJp3hwf2.mjs → chunks/messages-Bq7pLz_h2.mjs} +9 -9
  43. package/dist/chunks/{messages-DsWiXnOy2.mjs → messages-BqM6l_JM2.mjs} +12 -12
  44. package/dist/chunks/messages-Br3ERe172.cjs +1 -0
  45. package/dist/chunks/messages-Bs9JOJDc.cjs +1 -0
  46. package/dist/chunks/messages-BtEDKVO7.cjs +1 -0
  47. package/dist/chunks/messages-BtevAuQS2.cjs +1 -0
  48. package/dist/chunks/messages-Bttb4o0k.cjs +1 -0
  49. package/dist/chunks/messages-BxRX_hY12.cjs +1 -0
  50. package/dist/{messages-BSvuvR6i.mjs → chunks/messages-BxhJFFrR.mjs} +21 -21
  51. package/dist/{messages-BIRq0EVo.mjs → chunks/messages-BzC8TVYC.mjs} +15 -15
  52. package/dist/chunks/{messages-hT-pjCQL.mjs → messages-Bz_fTG46.mjs} +13 -13
  53. package/dist/chunks/messages-C-N1XBvh2.cjs +1 -0
  54. package/dist/chunks/messages-C2-v6HdR.cjs +1 -0
  55. package/dist/chunks/{messages-CHmoIrso.mjs → messages-C4Wacagz.mjs} +4 -4
  56. package/dist/{messages-CI7MWoEP2.mjs → chunks/messages-C62iC79d2.mjs} +20 -20
  57. package/dist/chunks/messages-C6Xc3L-B2.cjs +1 -0
  58. package/dist/chunks/messages-CEquPedm.cjs +1 -0
  59. package/dist/chunks/{messages-t_RiQ_y02.mjs → messages-CEslBsO62.mjs} +7 -7
  60. package/dist/chunks/messages-CFo-pG-t2.cjs +1 -0
  61. package/dist/{messages-BrycA2Yd.mjs → chunks/messages-CHizzxUv.mjs} +4 -4
  62. package/dist/chunks/messages-CO_hj1x6.cjs +1 -0
  63. package/dist/chunks/{messages-qjFVR3AK.mjs → messages-CSc7Lh_3.mjs} +5 -5
  64. package/dist/chunks/messages-CT025FgD2.cjs +1 -0
  65. package/dist/chunks/messages-CUxk6xrQ.cjs +1 -0
  66. package/dist/chunks/messages-CVHSfosB.cjs +1 -0
  67. package/dist/chunks/messages-CXlSU8cQ2.cjs +1 -0
  68. package/dist/chunks/{messages-BrLLU_Dm.mjs → messages-CZ4Jcn6y.mjs} +5 -5
  69. package/dist/chunks/messages-CZQuqbNz2.cjs +1 -0
  70. package/dist/{messages-BGfVV77O.mjs → chunks/messages-CZfG1cmA2.mjs} +15 -15
  71. package/dist/chunks/{messages-BrpXuY-6.mjs → messages-Cc56SxY7.mjs} +10 -10
  72. package/dist/chunks/{messages-bJ7cOoA_.mjs → messages-CcvcAZOt.mjs} +13 -13
  73. package/dist/chunks/{messages-Bxz0TVBv2.mjs → messages-Cd-FaIr_2.mjs} +61 -61
  74. package/dist/{messages-Cu5AHbR-2.mjs → chunks/messages-CdOX6JHb2.mjs} +10 -10
  75. package/dist/{messages-DJRg4kFv2.mjs → chunks/messages-Ced9OY9X.mjs} +12 -12
  76. package/dist/chunks/messages-Cf5mu1AT.cjs +1 -0
  77. package/dist/chunks/messages-Cf8u0aln2.cjs +1 -0
  78. package/dist/chunks/messages-Cg6qicee.cjs +1 -0
  79. package/dist/chunks/messages-CgGwGZs22.cjs +1 -0
  80. package/dist/chunks/messages-Cgg1HHSo.cjs +1 -0
  81. package/dist/chunks/messages-Ck6jEhXV.cjs +1 -0
  82. package/dist/chunks/{messages-36KiD2Bx2.mjs → messages-CkRbSW3z2.mjs} +7 -7
  83. package/dist/chunks/messages-Ckej-nnJ.cjs +1 -0
  84. package/dist/{messages-Bgf1E-Vj.mjs → chunks/messages-Cn0B5LU1.mjs} +17 -17
  85. package/dist/chunks/{messages-Dk_PadZz.mjs → messages-CpC5Cv_s.mjs} +7 -7
  86. package/dist/chunks/messages-CpJW0LBR.cjs +1 -0
  87. package/dist/chunks/messages-Cx1kdFH_2.cjs +1 -0
  88. package/dist/chunks/{messages-DTKpwQ9o.mjs → messages-CxVi9cnz.mjs} +11 -11
  89. package/dist/{messages-CwavcZov.mjs → chunks/messages-Cx_kyYnf2.mjs} +14 -14
  90. package/dist/chunks/messages-Cz7AbEFm.cjs +1 -0
  91. package/dist/{messages-B9s898dI.mjs → chunks/messages-D1gz17wt.mjs} +10 -10
  92. package/dist/chunks/messages-D2nTfhRa2.cjs +1 -0
  93. package/dist/chunks/{messages-DOCzIldx.mjs → messages-D8qYNZ_T.mjs} +10 -10
  94. package/dist/chunks/messages-DB6z9ybS.cjs +1 -0
  95. package/dist/chunks/{messages-DefTqLH32.mjs → messages-DDnB1EFE2.mjs} +20 -20
  96. package/dist/chunks/{messages-BoN_Bitl2.mjs → messages-DFUn1PHK2.mjs} +15 -15
  97. package/dist/chunks/messages-DG8Lmqf52.cjs +1 -0
  98. package/dist/chunks/messages-DNYtMplL2.cjs +1 -0
  99. package/dist/chunks/messages-DOBcfgRF.cjs +1 -0
  100. package/dist/{messages-7EaFUksm.mjs → chunks/messages-DQb9YRoO2.mjs} +7 -7
  101. package/dist/chunks/messages-DWeyV2N3.cjs +1 -0
  102. package/dist/{messages-C0RxvQ_B2.mjs → chunks/messages-DaqNOQ8p.mjs} +20 -20
  103. package/dist/chunks/{messages-BRN9bO60.mjs → messages-De0Fkl0K.mjs} +4 -4
  104. package/dist/chunks/{messages-D3exVYZD.mjs → messages-DgSRzW-Y.mjs} +24 -24
  105. package/dist/{messages-CRuD2YBl2.mjs → chunks/messages-DjSuzS2m2.mjs} +5 -5
  106. package/dist/chunks/messages-DkINYHo4.cjs +1 -0
  107. package/dist/chunks/messages-Dml6u25s2.cjs +1 -0
  108. package/dist/chunks/{messages-CH_Aqn-k.mjs → messages-Dp5C7vWz.mjs} +8 -8
  109. package/dist/chunks/{messages-B2hS--KC.mjs → messages-Dp5SW9D-.mjs} +7 -7
  110. package/dist/chunks/messages-DsWTIuli2.cjs +1 -0
  111. package/dist/{messages-BqjusG9f.mjs → chunks/messages-DuOkV5T_.mjs} +16 -16
  112. package/dist/{messages-D9CbvVgb.mjs → chunks/messages-DubJ63UL.mjs} +8 -8
  113. package/dist/chunks/{messages-VFdnkrDm2.mjs → messages-DwAl9zoh2.mjs} +4 -4
  114. package/dist/{messages-CasKwW-A.mjs → chunks/messages-DwU7qOBO2.mjs} +5 -5
  115. package/dist/{messages-CN5mXtal2.mjs → chunks/messages-DyuKfskv.mjs} +16 -16
  116. package/dist/chunks/{messages-M1tLUpjT.mjs → messages-DzZZDveu.mjs} +10 -10
  117. package/dist/chunks/{messages-D33lcfdb.mjs → messages-EI0ZLMIG.mjs} +10 -10
  118. package/dist/{messages-BTp7xsAK2.mjs → chunks/messages-GXQbRrHa2.mjs} +12 -12
  119. package/dist/{messages-D5u6vlu6.mjs → chunks/messages-ID7kZQyc.mjs} +6 -6
  120. package/dist/chunks/messages-JLj0J5so.cjs +1 -0
  121. package/dist/{messages-B-9u3fLG.mjs → chunks/messages-LWyC-1ol.mjs} +19 -19
  122. package/dist/{messages-BaYuAoTP2.mjs → chunks/messages-M2lNlKhI2.mjs} +33 -33
  123. package/dist/chunks/{messages-C3qdarW42.mjs → messages-PtDEkfSR2.mjs} +12 -12
  124. package/dist/chunks/{messages-CO6ZReE7.mjs → messages-S_Bmo_Qc.mjs} +7 -7
  125. package/dist/chunks/messages-UoKgx7_8.cjs +1 -0
  126. package/dist/chunks/messages-Vbqmvxs1.cjs +1 -0
  127. package/dist/chunks/{messages-Ci-rkkgx.mjs → messages-Vdmc6CaN.mjs} +6 -6
  128. package/dist/chunks/messages-XM0y9kXy2.cjs +1 -0
  129. package/dist/{messages-BY5WK3mB.mjs → chunks/messages-dZdV8VYV.mjs} +13 -13
  130. package/dist/chunks/messages-f1NcMMTR2.cjs +1 -0
  131. package/dist/chunks/{messages-CnvK1Abd2.mjs → messages-h43rfIyt2.mjs} +28 -28
  132. package/dist/chunks/messages-jAgR8EPP.cjs +1 -0
  133. package/dist/chunks/{messages-QeD4YPxL.mjs → messages-m_zk_AR3.mjs} +8 -8
  134. package/dist/{messages-DQiZK84h.mjs → chunks/messages-n1T_9w-Z.mjs} +24 -24
  135. package/dist/chunks/messages-o3omNKfH.cjs +1 -0
  136. package/dist/chunks/messages-p-1X5oFM2.cjs +1 -0
  137. package/dist/chunks/messages-p5w1kuc5.cjs +1 -0
  138. package/dist/chunks/messages-poLdFEEs2.cjs +1 -0
  139. package/dist/chunks/messages-px_8gpHT.cjs +1 -0
  140. package/dist/chunks/messages-s9I-JHCa.cjs +1 -0
  141. package/dist/chunks/messages-vdupz5T0.cjs +1 -0
  142. package/dist/chunks/{messages-DPX9kFey.mjs → messages-xMrks-Gg.mjs} +12 -12
  143. package/dist/chunks/tools-DiTb45BS.cjs +208 -0
  144. package/dist/chunks/{tools-ChneUeSu.mjs → tools-vX3wCW3a.mjs} +1228 -1203
  145. package/dist/full.cjs +1 -1
  146. package/dist/full.mjs +3 -3
  147. package/dist/locales.mjs +67 -67
  148. package/dist/{chunks/messages-7bt8ujXQ.mjs → messages-2jeEK-EB.mjs} +4 -4
  149. package/dist/{messages-DJMSsPuS.mjs → messages-2pXizYBd.mjs} +4 -4
  150. package/dist/{chunks/messages-8FnVkNsk2.mjs → messages-6RcfJ59a.mjs} +15 -15
  151. package/dist/{messages-Ca6_kMBT2.mjs → messages-B0n-WDK72.mjs} +12 -12
  152. package/dist/{messages-DCwlxqBz.mjs → messages-B4cc5O5K.mjs} +25 -25
  153. package/dist/{chunks/messages-BVV2uB2V2.mjs → messages-B8BXCJBA.mjs} +7 -7
  154. package/dist/{chunks/messages-BakdNtus2.mjs → messages-BCGyLzFB2.mjs} +5 -5
  155. package/dist/{messages-BfFFrhbd.mjs → messages-BCeeFrNO.mjs} +11 -11
  156. package/dist/{chunks/messages-c1uiUe552.mjs → messages-BEnINcno2.mjs} +12 -12
  157. package/dist/{messages-DGz70LLg2.mjs → messages-BInBVzW42.mjs} +12 -12
  158. package/dist/{messages-CSVzRRdj.mjs → messages-BOEP2ly_.mjs} +5 -5
  159. package/dist/{messages-B3YNVBd1.mjs → messages-BWzRZ5Un.mjs} +4 -4
  160. package/dist/{chunks/messages-DN9_Nlre2.mjs → messages-BXgGBpmY.mjs} +5 -5
  161. package/dist/{messages-B6p4UUC-.mjs → messages-BXs-Zwhx.mjs} +12 -12
  162. package/dist/{messages-CdLOD2b_2.mjs → messages-BYyRYlTQ2.mjs} +21 -21
  163. package/dist/{messages-BKrK8Axl.mjs → messages-B_XoP1A3.mjs} +11 -11
  164. package/dist/{chunks/messages-D21eomvf.mjs → messages-BbFJ2r9p.mjs} +8 -8
  165. package/dist/{messages-h1l_y01e.mjs → messages-Bd2Q-tnQ.mjs} +10 -10
  166. package/dist/{chunks/messages-CXbHVq05.mjs → messages-BfGAGIg-2.mjs} +16 -16
  167. package/dist/{messages--RL8UOhV.mjs → messages-Bj8K6_bv.mjs} +15 -15
  168. package/dist/{messages-BnpaaUnF2.mjs → messages-BkNVOuvO2.mjs} +7 -7
  169. package/dist/{messages-gmq1abXg.mjs → messages-BmKhZE7I.mjs} +10 -10
  170. package/dist/{chunks/messages-DiUTxAEQ.mjs → messages-BrkXHD2D2.mjs} +20 -20
  171. package/dist/{chunks/messages-DcgNt1Bg2.mjs → messages-BytEaMMs.mjs} +7 -7
  172. package/dist/{chunks/messages-Hsn-3QW0.mjs → messages-C-XKbE2c.mjs} +17 -17
  173. package/dist/{chunks/messages-DeK_vGCd2.mjs → messages-C1d7I7f_2.mjs} +20 -20
  174. package/dist/{messages-BqKW-hlt2.mjs → messages-C2pz0mJs2.mjs} +9 -9
  175. package/dist/{messages-BIUXljax.mjs → messages-C5sc4wjR.mjs} +8 -8
  176. package/dist/{chunks/messages-DqcQoY-I2.mjs → messages-C9XTx39w2.mjs} +5 -5
  177. package/dist/{messages-BGIle7Xo.mjs → messages-CGZPFOEr.mjs} +13 -13
  178. package/dist/{chunks/messages-B9kHL94V.mjs → messages-CJsMZvUv.mjs} +10 -10
  179. package/dist/{messages-CrcHeqGR.mjs → messages-CS6vG53A.mjs} +11 -11
  180. package/dist/{chunks/messages-8Qzw6Xju.mjs → messages-CSVEbRhT.mjs} +24 -24
  181. package/dist/{chunks/messages-7nxAnzdE2.mjs → messages-CUsdyCrN2.mjs} +10 -10
  182. package/dist/{messages-DZtr9UPl2.mjs → messages-CWWIbebM2.mjs} +8 -8
  183. package/dist/{messages-DA5IipN52.mjs → messages-CWdh59uz2.mjs} +15 -15
  184. package/dist/{messages-xSBQ46qE2.mjs → messages-CX2ioEBc2.mjs} +20 -20
  185. package/dist/{messages-eNnPQjam2.mjs → messages-CdmaH2dA2.mjs} +28 -28
  186. package/dist/{messages-BlkFLGrN.mjs → messages-Cg3w36Bc.mjs} +7 -7
  187. package/dist/{chunks/messages-CO9-5XrF2.mjs → messages-ChivLKDg2.mjs} +12 -12
  188. package/dist/{chunks/messages-C3ueCeDy.mjs → messages-Ck7HWiG_.mjs} +21 -21
  189. package/dist/{chunks/messages-CXzyyhBC.mjs → messages-CoSj68Ef2.mjs} +8 -8
  190. package/dist/{messages-m_U7v4rD.mjs → messages-CsHwUgSZ.mjs} +12 -12
  191. package/dist/{chunks/messages-BLtZ2DXE.mjs → messages-CzabNeP5.mjs} +6 -6
  192. package/dist/{messages-DPiPd88g.mjs → messages-D1jUHOKr.mjs} +6 -6
  193. package/dist/{messages-ZAVymtrA2.mjs → messages-DFKu1WGX2.mjs} +7 -7
  194. package/dist/{messages-CNzktVoM2.mjs → messages-DGwIRpOH2.mjs} +10 -10
  195. package/dist/{chunks/messages-DN6pprFJ2.mjs → messages-DMH0zRig2.mjs} +33 -33
  196. package/dist/{chunks/messages-ZjheBuhT2.mjs → messages-DPZsygzY.mjs} +14 -14
  197. package/dist/{messages-DlC9tgiV.mjs → messages-DPzZM5FG.mjs} +61 -61
  198. package/dist/{messages-CFSBN-tg.mjs → messages-DSmNNjPb.mjs} +7 -7
  199. package/dist/{chunks/messages-CIqhI4HT.mjs → messages-DaoTSrJW.mjs} +13 -13
  200. package/dist/{messages-CMG59Rb62.mjs → messages-DfnSbN512.mjs} +13 -13
  201. package/dist/{messages-DRdzJFUx2.mjs → messages-DvSC5JGC2.mjs} +7 -7
  202. package/dist/{messages-DO99T6qk2.mjs → messages-Dw7P8bMa2.mjs} +24 -24
  203. package/dist/{chunks/messages-B19gfehr.mjs → messages-GUgmAfdB.mjs} +15 -15
  204. package/dist/{chunks/messages-CC4xe9xv.mjs → messages-Nbssq1-N.mjs} +19 -19
  205. package/dist/{chunks/messages-DRKzAu-g.mjs → messages-S8uz2_bw2.mjs} +12 -12
  206. package/dist/{messages-DCqRZ9Pw.mjs → messages-TfPmsrxh.mjs} +8 -8
  207. package/dist/{messages-DL1HdFqf.mjs → messages-Z8HMjhe9.mjs} +5 -5
  208. package/dist/{messages-K1RIXLxa.mjs → messages-eFz25q1T.mjs} +4 -4
  209. package/dist/{chunks/messages-C81EnNxX.mjs → messages-gJWgJtGo.mjs} +8 -8
  210. package/dist/{chunks/messages-DPV70Ys22.mjs → messages-iJKNW8hW2.mjs} +9 -9
  211. package/dist/{messages-8wZYXCg7.mjs → messages-kb2GSl-V.mjs} +10 -10
  212. package/dist/{messages-mcif9RnD.mjs → messages-qjir1Zx9.mjs} +4 -4
  213. package/dist/{chunks/messages-R08pGvHm.mjs → messages-tcfLP2b2.mjs} +16 -16
  214. package/dist/{messages-C-_8o7te.mjs → messages-zoHZbvbe.mjs} +10 -10
  215. package/dist/react.cjs +1 -1
  216. package/dist/react.mjs +1 -1
  217. package/dist/tools.cjs +1 -1
  218. package/dist/tools.mjs +2 -2
  219. package/package.json +1 -1
  220. package/src/components/i18n/locales/am/messages.json +16 -17
  221. package/src/components/i18n/locales/ar/messages.json +6 -7
  222. package/src/components/i18n/locales/az/messages.json +15 -16
  223. package/src/components/i18n/locales/bg/messages.json +11 -12
  224. package/src/components/i18n/locales/bn/messages.json +21 -22
  225. package/src/components/i18n/locales/bs/messages.json +10 -11
  226. package/src/components/i18n/locales/cs/messages.json +13 -14
  227. package/src/components/i18n/locales/da/messages.json +10 -11
  228. package/src/components/i18n/locales/de/messages.json +12 -13
  229. package/src/components/i18n/locales/dv/messages.json +19 -20
  230. package/src/components/i18n/locales/el/messages.json +8 -9
  231. package/src/components/i18n/locales/es/messages.json +10 -11
  232. package/src/components/i18n/locales/et/messages.json +10 -11
  233. package/src/components/i18n/locales/fa/messages.json +8 -9
  234. package/src/components/i18n/locales/fi/messages.json +6 -7
  235. package/src/components/i18n/locales/fil/messages.json +13 -14
  236. package/src/components/i18n/locales/fr/messages.json +5 -6
  237. package/src/components/i18n/locales/gu/messages.json +8 -9
  238. package/src/components/i18n/locales/he/messages.json +11 -12
  239. package/src/components/i18n/locales/hi/messages.json +10 -11
  240. package/src/components/i18n/locales/hr/messages.json +17 -18
  241. package/src/components/i18n/locales/hu/messages.json +24 -25
  242. package/src/components/i18n/locales/hy/messages.json +11 -12
  243. package/src/components/i18n/locales/id/messages.json +15 -16
  244. package/src/components/i18n/locales/it/messages.json +4 -5
  245. package/src/components/i18n/locales/ja/messages.json +4 -5
  246. package/src/components/i18n/locales/ka/messages.json +7 -8
  247. package/src/components/i18n/locales/km/messages.json +14 -15
  248. package/src/components/i18n/locales/kn/messages.json +7 -8
  249. package/src/components/i18n/locales/ko/messages.json +7 -8
  250. package/src/components/i18n/locales/ku/messages.json +61 -62
  251. package/src/components/i18n/locales/lo/messages.json +5 -6
  252. package/src/components/i18n/locales/lt/messages.json +15 -16
  253. package/src/components/i18n/locales/lv/messages.json +4 -5
  254. package/src/components/i18n/locales/mk/messages.json +12 -13
  255. package/src/components/i18n/locales/ml/messages.json +4 -5
  256. package/src/components/i18n/locales/mn/messages.json +28 -29
  257. package/src/components/i18n/locales/mr/messages.json +8 -9
  258. package/src/components/i18n/locales/ms/messages.json +9 -10
  259. package/src/components/i18n/locales/my/messages.json +12 -13
  260. package/src/components/i18n/locales/ne/messages.json +12 -13
  261. package/src/components/i18n/locales/nl/messages.json +7 -8
  262. package/src/components/i18n/locales/no/messages.json +5 -6
  263. package/src/components/i18n/locales/pa/messages.json +33 -34
  264. package/src/components/i18n/locales/pl/messages.json +5 -6
  265. package/src/components/i18n/locales/ps/messages.json +20 -21
  266. package/src/components/i18n/locales/pt/messages.json +12 -13
  267. package/src/components/i18n/locales/ro/messages.json +12 -13
  268. package/src/components/i18n/locales/ru/messages.json +9 -10
  269. package/src/components/i18n/locales/sd/messages.json +20 -21
  270. package/src/components/i18n/locales/si/messages.json +15 -16
  271. package/src/components/i18n/locales/sk/messages.json +10 -11
  272. package/src/components/i18n/locales/sl/messages.json +12 -13
  273. package/src/components/i18n/locales/sq/messages.json +20 -21
  274. package/src/components/i18n/locales/sr/messages.json +24 -25
  275. package/src/components/i18n/locales/sv/messages.json +7 -8
  276. package/src/components/i18n/locales/sw/messages.json +16 -17
  277. package/src/components/i18n/locales/ta/messages.json +10 -11
  278. package/src/components/i18n/locales/te/messages.json +13 -14
  279. package/src/components/i18n/locales/th/messages.json +8 -9
  280. package/src/components/i18n/locales/tr/messages.json +7 -8
  281. package/src/components/i18n/locales/ug/messages.json +21 -22
  282. package/src/components/i18n/locales/uk/messages.json +8 -9
  283. package/src/components/i18n/locales/ur/messages.json +4 -5
  284. package/src/components/i18n/locales/vi/messages.json +5 -6
  285. package/src/components/i18n/locales/yi/messages.json +25 -26
  286. package/src/components/i18n/locales/zh/messages.json +7 -8
  287. package/src/styles/embed.css +4 -48
  288. package/src/tools/file/index.ts +30 -0
  289. package/src/tools/link/embed/index.ts +61 -11
  290. package/src/tools/link/embed/overlay.ts +12 -95
  291. package/src/tools/table/index.ts +37 -1
  292. package/src/tools/table/table-cell-blocks.ts +65 -0
  293. package/src/tools/table/table-operations.ts +51 -2
  294. package/src/tools/table/table-row-col-action-handler.ts +25 -2
  295. package/src/tools/table/table-subsystems.ts +6 -1
  296. package/dist/chunks/messages--XZLcuUK.cjs +0 -1
  297. package/dist/chunks/messages-6adLi-J9.cjs +0 -1
  298. package/dist/chunks/messages-9xZnfk_-.cjs +0 -1
  299. package/dist/chunks/messages-B-7wgQm5.cjs +0 -1
  300. package/dist/chunks/messages-B4-kmmK72.cjs +0 -1
  301. package/dist/chunks/messages-BBh7sF4o.cjs +0 -1
  302. package/dist/chunks/messages-BIhN9JOT.cjs +0 -1
  303. package/dist/chunks/messages-BJU_3KpD.cjs +0 -1
  304. package/dist/chunks/messages-BNfoWRc02.cjs +0 -1
  305. package/dist/chunks/messages-BOrASwT4.cjs +0 -1
  306. package/dist/chunks/messages-BPWs2ZiL.cjs +0 -1
  307. package/dist/chunks/messages-BR6HUjXI.cjs +0 -1
  308. package/dist/chunks/messages-BWZYYHHF.cjs +0 -1
  309. package/dist/chunks/messages-BY3nxQWj.cjs +0 -1
  310. package/dist/chunks/messages-BYpAVGd12.cjs +0 -1
  311. package/dist/chunks/messages-BZzpf1UP.cjs +0 -1
  312. package/dist/chunks/messages-B_12_UjB.cjs +0 -1
  313. package/dist/chunks/messages-BaZ-Dtr92.cjs +0 -1
  314. package/dist/chunks/messages-BeaFn5UT.cjs +0 -1
  315. package/dist/chunks/messages-BgosUxKq2.cjs +0 -1
  316. package/dist/chunks/messages-BgrhLzFS.cjs +0 -1
  317. package/dist/chunks/messages-BmP5kV232.cjs +0 -1
  318. package/dist/chunks/messages-Bnp8vNJz.cjs +0 -1
  319. package/dist/chunks/messages-BpkV__T7.cjs +0 -1
  320. package/dist/chunks/messages-BqYqYBH02.cjs +0 -1
  321. package/dist/chunks/messages-Bv7MXv7R.cjs +0 -1
  322. package/dist/chunks/messages-Byi8D3Hp.cjs +0 -1
  323. package/dist/chunks/messages-C2tGk63O2.cjs +0 -1
  324. package/dist/chunks/messages-C8lWOU7O.cjs +0 -1
  325. package/dist/chunks/messages-C9Usx2VK.cjs +0 -1
  326. package/dist/chunks/messages-C9vxfOaB2.cjs +0 -1
  327. package/dist/chunks/messages-CBqID_rf2.cjs +0 -1
  328. package/dist/chunks/messages-CKaebA4N2.cjs +0 -1
  329. package/dist/chunks/messages-CNuuKnxY.cjs +0 -1
  330. package/dist/chunks/messages-CS1dVWiH2.cjs +0 -1
  331. package/dist/chunks/messages-CSHcjK_N2.cjs +0 -1
  332. package/dist/chunks/messages-CSWjZBVp2.cjs +0 -1
  333. package/dist/chunks/messages-CVi9dbMY2.cjs +0 -1
  334. package/dist/chunks/messages-CXkEnOpM2.cjs +0 -1
  335. package/dist/chunks/messages-Ch4PcGQ42.cjs +0 -1
  336. package/dist/chunks/messages-Cj12Zgsk.cjs +0 -1
  337. package/dist/chunks/messages-CjFn_dGR2.cjs +0 -1
  338. package/dist/chunks/messages-CnFZ_js2.cjs +0 -1
  339. package/dist/chunks/messages-CstdYlPl.cjs +0 -1
  340. package/dist/chunks/messages-CzEXG3wA2.cjs +0 -1
  341. package/dist/chunks/messages-CzW0fnvJ2.cjs +0 -1
  342. package/dist/chunks/messages-D2BWvpXy.cjs +0 -1
  343. package/dist/chunks/messages-D2jPVYje2.cjs +0 -1
  344. package/dist/chunks/messages-D8DMxR-v2.cjs +0 -1
  345. package/dist/chunks/messages-DAF4iFuz.cjs +0 -1
  346. package/dist/chunks/messages-DJpBxc3X.cjs +0 -1
  347. package/dist/chunks/messages-DJqLD3KO.cjs +0 -1
  348. package/dist/chunks/messages-DSFJ_vqv.cjs +0 -1
  349. package/dist/chunks/messages-DW0CLNsD.cjs +0 -1
  350. package/dist/chunks/messages-DZFhIff62.cjs +0 -1
  351. package/dist/chunks/messages-Dd56p0Kf.cjs +0 -1
  352. package/dist/chunks/messages-DigHfTmz.cjs +0 -1
  353. package/dist/chunks/messages-DkuidYgG.cjs +0 -1
  354. package/dist/chunks/messages-DoZqsswJ.cjs +0 -1
  355. package/dist/chunks/messages-DvmpvSeR.cjs +0 -1
  356. package/dist/chunks/messages-Dvurigo8.cjs +0 -1
  357. package/dist/chunks/messages-Dx16KgRk2.cjs +0 -1
  358. package/dist/chunks/messages-EjezcPS22.cjs +0 -1
  359. package/dist/chunks/messages-EsgioDiN.cjs +0 -1
  360. package/dist/chunks/messages-cDH-bKpE.cjs +0 -1
  361. package/dist/chunks/messages-lhqD_WQA.cjs +0 -1
  362. package/dist/chunks/messages-xndoTJ282.cjs +0 -1
  363. package/dist/chunks/tools-I_BZLnbG.cjs +0 -208
@@ -9,7 +9,8 @@ import type {
9
9
  PatternPasteEvent,
10
10
  ToolboxConfig,
11
11
  } from '../../../../types';
12
- import { IconGlobe, IconLinkCopy } from '../../../components/icons';
12
+ import type { MenuConfig } from '../../../../types/tools/menu-config';
13
+ import { IconCopy, IconGlobe, IconLinkCopy, IconReplace } from '../../../components/icons';
13
14
  import { attachResizeHandle, type ResizeEdge } from '../../image/resizer';
14
15
  import { renderEmbedOverlay, type EmbedAlignment } from './overlay';
15
16
  import { EMBED_SERVICES, matchEmbedService, isHttpUrl, type EmbedKind } from '../registry';
@@ -589,17 +590,72 @@ export class Embed implements BlockTool {
589
590
  }
590
591
 
591
592
  private buildOverlay(): HTMLElement {
592
- return renderEmbedOverlay({
593
+ const overlay = renderEmbedOverlay({
593
594
  alignment: this.data.alignment ?? 'center',
594
595
  captionVisible: this.isCaptionVisible(),
595
596
  source: this.data.source ?? '',
596
597
  i18n: this.api.i18n,
597
598
  onAlign: (next) => this.setAlignment(next),
598
599
  onToggleCaption: () => this.toggleCaption(),
599
- onCopyLink: () => this.copyLink(),
600
- onReplace: () => this.replaceSource(),
601
- onDelete: () => this.deleteBlock(),
602
600
  });
601
+
602
+ // The "more" button opens the shared block-tunes popover (same as the image
603
+ // block); embed-specific actions are contributed via renderSettings().
604
+ const moreBtn = overlay.querySelector<HTMLButtonElement>('[data-action="more"]');
605
+
606
+ moreBtn?.addEventListener('click', (event) => {
607
+ event.stopPropagation();
608
+ this.openBlockSettings(moreBtn);
609
+ });
610
+
611
+ return overlay;
612
+ }
613
+
614
+ public renderSettings(): MenuConfig {
615
+ const i18n = this.api.i18n;
616
+
617
+ return [
618
+ {
619
+ icon: IconReplace,
620
+ title: i18n.t('tools.embed.replace'),
621
+ name: 'embed-replace',
622
+ closeOnActivate: true,
623
+ onActivate: (): void => this.replaceSource(),
624
+ },
625
+ {
626
+ icon: IconCopy,
627
+ title: i18n.t('tools.image.copyUrl'),
628
+ name: 'embed-copy-url',
629
+ closeOnActivate: true,
630
+ onActivate: (): void => this.copyLink(),
631
+ },
632
+ ];
633
+ }
634
+
635
+ private openBlockSettings(trigger?: HTMLElement): void {
636
+ const toolbar = (this.api as unknown as {
637
+ toolbar?: {
638
+ toggleBlockSettings?: (
639
+ state: boolean,
640
+ trigger?: HTMLElement,
641
+ options?: { placeLeftOfAnchor?: boolean }
642
+ ) => void;
643
+ };
644
+ }).toolbar;
645
+
646
+ if (!toolbar?.toggleBlockSettings) {
647
+ return;
648
+ }
649
+ this.root?.setAttribute('data-settings-open', 'true');
650
+ trigger?.setAttribute('aria-expanded', 'true');
651
+ const onClosed = (): void => {
652
+ this.root?.removeAttribute('data-settings-open');
653
+ trigger?.setAttribute('aria-expanded', 'false');
654
+ this.api.events.off('block-settings-closed', onClosed);
655
+ };
656
+
657
+ this.api.events.on('block-settings-closed', onClosed);
658
+ toolbar.toggleBlockSettings(true, trigger, { placeLeftOfAnchor: false });
603
659
  }
604
660
 
605
661
  private replaceSource(): void {
@@ -716,10 +772,4 @@ export class Embed implements BlockTool {
716
772
 
717
773
  void clip?.writeText(this.data.source ?? '');
718
774
  }
719
-
720
- private deleteBlock(): void {
721
- const blocks = (this.api as unknown as { blocks?: { delete?: (id: string) => void } }).blocks;
722
-
723
- blocks?.delete?.(this.block.id);
724
- }
725
775
  }
@@ -3,11 +3,8 @@ import {
3
3
  IconImageAlignCenter,
4
4
  IconImageAlignLeft,
5
5
  IconImageAlignRight,
6
- IconLink,
7
6
  IconLinkExternal,
8
7
  IconMoreHorizontal,
9
- IconReplace,
10
- IconTrash,
11
8
  } from '../../../components/icons';
12
9
 
13
10
  export type EmbedAlignment = 'left' | 'center' | 'right';
@@ -24,9 +21,6 @@ export interface EmbedOverlayOptions {
24
21
  i18n: EmbedOverlayI18n;
25
22
  onAlign(next: EmbedAlignment): void;
26
23
  onToggleCaption(): void;
27
- onCopyLink(): void;
28
- onReplace(): void;
29
- onDelete(): void;
30
24
  }
31
25
 
32
26
  const ALIGN_ICON: Record<EmbedAlignment, string> = {
@@ -45,9 +39,9 @@ const ALIGN_ORDER: EmbedAlignment[] = ['left', 'center', 'right'];
45
39
 
46
40
  /**
47
41
  * Hover toolbar for an iframe embed — alignment, caption toggle, "open original"
48
- * and a "more" menu (replace / copy link / delete). Modeled on the image overlay but
49
- * scoped to the embed tool. Pure builder: it wires the provided callbacks and
50
- * manages only its own popover open/close state.
42
+ * and a "more" button. Modeled on the image overlay and scoped to the embed tool.
43
+ * Pure builder: it wires the provided callbacks. The "more" button only carries
44
+ * the trigger markup; the tool wires it to the shared block-tunes popover.
51
45
  */
52
46
  export function renderEmbedOverlay(opts: EmbedOverlayOptions): HTMLElement {
53
47
  const root = document.createElement('div');
@@ -66,7 +60,7 @@ export function renderEmbedOverlay(opts: EmbedOverlayOptions): HTMLElement {
66
60
  });
67
61
  appendOpenOriginal(root, opts);
68
62
  appendDivider(root);
69
- appendMoreMenu(root, opts);
63
+ appendMoreButton(root, opts);
70
64
 
71
65
  return root;
72
66
  }
@@ -133,62 +127,22 @@ function appendOpenOriginal(root: HTMLElement, opts: EmbedOverlayOptions): void
133
127
  root.appendChild(anchor);
134
128
  }
135
129
 
136
- function appendMoreMenu(root: HTMLElement, opts: EmbedOverlayOptions): void {
137
- const wrapper = document.createElement('div');
138
-
139
- wrapper.className = 'blok-embed-toolbar__more';
140
- wrapper.style.position = 'relative';
141
-
130
+ /**
131
+ * "More options" trigger. Carries only the markup — the embed tool attaches the
132
+ * click handler that opens the shared block-tunes popover, so the rich menu
133
+ * (search, sections, shortcuts, footer) is identical to the image block's.
134
+ */
135
+ function appendMoreButton(root: HTMLElement, opts: EmbedOverlayOptions): void {
142
136
  const trigger = document.createElement('button');
143
137
 
144
138
  trigger.type = 'button';
139
+ trigger.className = 'blok-embed-toolbar__btn';
145
140
  trigger.setAttribute('data-action', 'more');
146
141
  trigger.setAttribute('aria-label', opts.i18n.t('tools.image.moreOptions'));
147
142
  trigger.setAttribute('aria-haspopup', 'menu');
148
143
  trigger.setAttribute('aria-expanded', 'false');
149
144
  trigger.innerHTML = IconMoreHorizontal;
150
- wrapper.appendChild(trigger);
151
-
152
- const popover = document.createElement('div');
153
-
154
- popover.setAttribute('data-role', 'more-popover');
155
- popover.setAttribute('role', 'menu');
156
- popover.className = 'blok-embed-toolbar__more-popover';
157
- popover.hidden = true;
158
-
159
- const toggle = bindPopover(trigger, popover);
160
-
161
- appendMenuItem(popover, {
162
- action: 'replace',
163
- label: opts.i18n.t('tools.embed.replace'),
164
- icon: IconReplace,
165
- onClick: () => {
166
- toggle(false);
167
- opts.onReplace();
168
- },
169
- });
170
- appendMenuItem(popover, {
171
- action: 'copy-link',
172
- label: opts.i18n.t('tools.image.copyUrl'),
173
- icon: IconLink,
174
- onClick: () => {
175
- toggle(false);
176
- opts.onCopyLink();
177
- },
178
- });
179
- appendMenuItem(popover, {
180
- action: 'delete',
181
- label: opts.i18n.t('blockSettings.delete'),
182
- icon: IconTrash,
183
- danger: true,
184
- onClick: () => {
185
- toggle(false);
186
- opts.onDelete();
187
- },
188
- });
189
-
190
- wrapper.appendChild(popover);
191
- root.appendChild(wrapper);
145
+ root.appendChild(trigger);
192
146
  }
193
147
 
194
148
  interface IconButtonSpec {
@@ -217,43 +171,6 @@ function appendIconButton(parent: HTMLElement, spec: IconButtonSpec): void {
217
171
  parent.appendChild(btn);
218
172
  }
219
173
 
220
- interface MenuItemSpec {
221
- action: string;
222
- label: string;
223
- icon: string;
224
- danger?: boolean;
225
- onClick(): void;
226
- }
227
-
228
- function appendMenuItem(parent: HTMLElement, spec: MenuItemSpec): void {
229
- const btn = document.createElement('button');
230
-
231
- btn.type = 'button';
232
- btn.setAttribute('role', 'menuitem');
233
- btn.setAttribute('data-action', spec.action);
234
- btn.setAttribute('aria-label', spec.label);
235
- btn.className = spec.danger
236
- ? 'blok-embed-toolbar__menu-item is-danger'
237
- : 'blok-embed-toolbar__menu-item';
238
-
239
- const icon = document.createElement('span');
240
-
241
- icon.className = 'blok-embed-toolbar__menu-icon';
242
- icon.setAttribute('aria-hidden', 'true');
243
- icon.innerHTML = spec.icon;
244
-
245
- const text = document.createElement('span');
246
-
247
- text.textContent = spec.label;
248
-
249
- btn.append(icon, text);
250
- btn.addEventListener('click', (event) => {
251
- event.stopPropagation();
252
- spec.onClick();
253
- });
254
- parent.appendChild(btn);
255
- }
256
-
257
174
  function appendDivider(parent: HTMLElement): void {
258
175
  const divider = document.createElement('div');
259
176
 
@@ -30,6 +30,7 @@ import {
30
30
  normalizeTableData,
31
31
  populateNewCells,
32
32
  readPixelWidths,
33
+ rectangularizeContent,
33
34
  SCROLL_OVERFLOW_CLASSES,
34
35
  setupKeyboardNavigation,
35
36
  updateHeadingColumnStyles,
@@ -247,8 +248,43 @@ export class Table implements BlockTool {
247
248
 
248
249
  this.mountBlockHoldersInNewTbody(content, newTbody, blockHolders);
249
250
 
251
+ // Reconcile the <colgroup> when the column COUNT changed (delete-col /
252
+ // insert-col on a merged grid route through here). Only swapping <tbody>
253
+ // would leave a stale <col> count, so the rendered grid width and
254
+ // getColumnCount() would disagree with the model. Scoped to count changes
255
+ // so same-width rebuilds (merge/split) keep their existing <col> widths
256
+ // untouched (avoids resetting custom percent/pixel widths).
257
+ const oldColgroup = gridEl.querySelector('colgroup');
258
+ const newColgroup = newTable.querySelector('colgroup');
259
+
260
+ if (
261
+ oldColgroup
262
+ && newColgroup
263
+ && oldColgroup.querySelectorAll('col').length !== newColgroup.querySelectorAll('col').length
264
+ ) {
265
+ oldColgroup.replaceWith(newColgroup);
266
+ }
267
+
250
268
  // Replace old tbody with new
251
269
  oldTbody.replaceWith(newTbody);
270
+
271
+ // Editability backstop. splitCell empties the revealed cells (blocks: []),
272
+ // and mountBlockHoldersInNewTbody only re-mounts EXISTING holders — so a
273
+ // revealed (or merged-into-empty origin) cell would have no paragraph and
274
+ // be impossible to click into or type in. The initializeCells completeness
275
+ // sweep cannot cover this: it is skipped for merge tables and the split
276
+ // path never runs it. Mirror the read-only→edit fix by guaranteeing every
277
+ // rendered cell holds at least one editable block. Skipped in read-only
278
+ // (no editing surface) — merge/split are edit-only anyway. Wrapped in a
279
+ // structural op so the synthesized block-added events are deferred instead
280
+ // of being double-claimed by the cell mutation handler.
281
+ if (!this.readOnly) {
282
+ this.runTransactedStructuralOp(() => {
283
+ newTbody.querySelectorAll<HTMLElement>(`[${CELL_ATTR}]`).forEach(cell => {
284
+ this.cellBlocks?.ensureCellHasBlock(cell);
285
+ });
286
+ }, true);
287
+ }
252
288
  }
253
289
 
254
290
  /**
@@ -931,7 +967,7 @@ export class Table implements BlockTool {
931
967
  const hasThHeadings = rows[0]?.querySelector('th') !== null;
932
968
  const withHeadings = hasTheadHeadings || hasThHeadings;
933
969
 
934
- this.initialContent = tableContent;
970
+ this.initialContent = rectangularizeContent(tableContent);
935
971
  this.model.setWithHeadings(withHeadings);
936
972
  this.model.setWithHeadingColumn(false);
937
973
  this.model.setColWidths(undefined);
@@ -378,6 +378,10 @@ export class TableCellBlocks {
378
378
  ): CellContent[][] {
379
379
  const rowElements = this.gridElement.querySelectorAll(`[${ROW_ATTR}]`);
380
380
  const normalizedContent: CellContent[][] = [];
381
+ // Every (row, col) the model-driven loop below describes. The completeness
382
+ // sweep uses this to find rendered cells the model never covered — without
383
+ // depending on DOM/holder state, which varies across call sites and tests.
384
+ const visited = new Set<string>();
381
385
 
382
386
  content.forEach((rowData, rowIndex) => {
383
387
  const row = rowElements[rowIndex];
@@ -389,6 +393,8 @@ export class TableCellBlocks {
389
393
  const normalizedRow: CellContent[] = [];
390
394
 
391
395
  rowData.forEach((cellContent, colIndex) => {
396
+ visited.add(`${rowIndex}:${colIndex}`);
397
+
392
398
  // A merge-covered cell has no rendered <td> (createGridFromModel skips
393
399
  // spanned cells). Preserve its placeholder so the rebuilt model keeps
394
400
  // the merge structure and column count — otherwise loading a saved
@@ -481,6 +487,65 @@ export class TableCellBlocks {
481
487
  normalizedContent.push(normalizedRow);
482
488
  });
483
489
 
490
+ // ── Model==grid completeness sweep ──────────────────────────────────
491
+ // The loop above is driven by the STORED model, so it only touches cells
492
+ // the model actually describes. When the rendered grid is WIDER (ragged
493
+ // rows) or has columns the model never had (empty rows that make
494
+ // createFlatGrid fall back to DEFAULT_COLS), those extra DOM cells get no
495
+ // block → zero contenteditable target → impossible to click into or type.
496
+ // Walk every rendered cell and synthesize a paragraph for any still-empty,
497
+ // non-merge cell, recording it into the returned model so save/reload stays
498
+ // rectangular. This is the invariant enforcer that makes the non-editable
499
+ // cell bug impossible regardless of HOW the model and grid widths diverged
500
+ // — it backstops rectangularizeContent at the consuming layer and also
501
+ // covers any future code path that bypasses it.
502
+ //
503
+ // Skipped during a Yjs sync replay: fabricating blocks there orphans the
504
+ // blocks Yjs is about to restore via separate ops (regression:
505
+ // table-undo-redo-orphans). That path reconciles empty cells on its own.
506
+ //
507
+ // Skipped for merge tables: their rows are already full-width via mergedInto
508
+ // placeholders (so the bug cannot occur), and CELL_COL_ATTR is physical- vs
509
+ // logical-column ambiguous under merges — driving a model write off it would
510
+ // corrupt colspan/rowspan/mergedInto metadata.
511
+ if (!this.api.blocks.isSyncingFromYjs && !this.model.hasMerges()) {
512
+ rowElements.forEach((row, rowIndex) => {
513
+ const normalizedRow = normalizedContent[rowIndex] ?? (normalizedContent[rowIndex] = []);
514
+ const cellElements = row.querySelectorAll<HTMLElement>(`[${CELL_ATTR}]`);
515
+
516
+ cellElements.forEach(cell => {
517
+ const colIndex = Number(cell.getAttribute(CELL_COL_ATTR));
518
+
519
+ if (!Number.isInteger(colIndex) || visited.has(`${rowIndex}:${colIndex}`)) {
520
+ return;
521
+ }
522
+
523
+ const container = cell.querySelector<HTMLElement>(`[${CELL_BLOCKS_ATTR}]`);
524
+
525
+ // No container → merge-covered cell (no editable target by design).
526
+ if (!container) {
527
+ return;
528
+ }
529
+
530
+ const block = this.api.blocks.insert('paragraph', { text: '' }, {}, this.api.blocks.getBlocksCount(), false);
531
+
532
+ container.appendChild(block.holder);
533
+ this.api.blocks.setBlockParent(block.id, this.tableBlockId);
534
+ this.stripPlaceholders(container);
535
+
536
+ normalizedRow[colIndex] = { blocks: [block.id] };
537
+ });
538
+
539
+ // A covered/skipped column can leave an undefined hole between filled
540
+ // cells; rebuild the row dense so the persisted width matches the
541
+ // rendered grid and no index is left undefined.
542
+ normalizedContent[rowIndex] = Array.from(
543
+ { length: normalizedRow.length },
544
+ (_, col) => normalizedRow[col] ?? { blocks: [] }
545
+ );
546
+ });
547
+ }
548
+
484
549
  return normalizedContent;
485
550
  }
486
551
 
@@ -373,6 +373,54 @@ export const mountCellBlocksReadOnly = (
373
373
 
374
374
  // ─── Data normalization ─────────────────────────────────────────────
375
375
 
376
+ /**
377
+ * Pad ragged rows out to the widest row's column count with empty
378
+ * `{ blocks: [] }` cells, producing a rectangular grid.
379
+ *
380
+ * Older published articles (and HTML-pasted tables with rowspan/colspan) can
381
+ * store rows SHORTER than the widest row — e.g. a 3-column table whose later
382
+ * rows only carry 1–2 cells. The grid is rendered to the widest row's column
383
+ * count, so createGrid pads every short row out to full width in the DOM, but
384
+ * initializeCells() iterates the STORED row, never visiting the padded trailing
385
+ * cells. Those gap cells get no paragraph block → zero contenteditable target →
386
+ * the cell is impossible to click into or type in (observed live: KB table
387
+ * block DQfJHidzTi). Rectangularizing up front makes the whole edit pipeline
388
+ * (grid, model, initializeCells, save) see one rectangular grid so every cell
389
+ * is editable.
390
+ *
391
+ * Rows already at or above the max width (including merge tables, whose rows
392
+ * carry full-width mergedInto placeholders) are returned untouched.
393
+ */
394
+ export const rectangularizeContent = (
395
+ content: LegacyCellContent[][],
396
+ ): LegacyCellContent[][] => {
397
+ const maxCols = content.reduce((max, row) => Math.max(max, row?.length ?? 0), 0);
398
+
399
+ // A null/undefined row would crash initializeCells' `rowData.forEach`, so it
400
+ // counts as needing work even when it is not strictly shorter than maxCols
401
+ // (e.g. an all-null grid where maxCols === 0). Bailing only on length checks
402
+ // would let those rows slip through untouched.
403
+ if (!content.some(row => row == null || row.length < maxCols)) {
404
+ return content;
405
+ }
406
+
407
+ return content.map(row => {
408
+ const cells = row ?? [];
409
+
410
+ if (cells.length >= maxCols) {
411
+ return cells;
412
+ }
413
+
414
+ const padded = [...cells];
415
+
416
+ while (padded.length < maxCols) {
417
+ padded.push({ blocks: [] });
418
+ }
419
+
420
+ return padded;
421
+ });
422
+ };
423
+
376
424
  export const normalizeTableData = (
377
425
  data: TableData | Record<string, never>,
378
426
  config: { withHeadings?: boolean; stretched?: boolean },
@@ -389,7 +437,8 @@ export const normalizeTableData = (
389
437
  }
390
438
 
391
439
  const tableData = data as TableData;
392
- const cols = tableData.content?.[0]?.length;
440
+ const content = rectangularizeContent(tableData.content ?? []);
441
+ const cols = content[0]?.length;
393
442
  const colWidths = tableData.colWidths;
394
443
  const validWidths = colWidths
395
444
  && cols
@@ -402,7 +451,7 @@ export const normalizeTableData = (
402
451
  withHeadings: tableData.withHeadings ?? config.withHeadings ?? false,
403
452
  withHeadingColumn: tableData.withHeadingColumn ?? false,
404
453
  stretched: tableData.stretched ?? config.stretched ?? false,
405
- content: tableData.content ?? [],
454
+ content,
406
455
  colWidths: validWidths,
407
456
  initialColWidth: tableData.initialColWidth,
408
457
  };
@@ -36,6 +36,15 @@ interface ActionContext {
36
36
  data: ActionData;
37
37
  cellBlocks: TableCellBlocks | null;
38
38
  blocksToDelete?: string[];
39
+ /**
40
+ * Rebuild the whole <tbody> from the current model. Used for deletes on a
41
+ * merged grid: the physical-index DOM delete (grid.deleteRow/deleteColumn)
42
+ * cannot create a <td> for a cell the model PROMOTES out of a merge (a
43
+ * previously-covered cell becoming standalone), leaving it non-editable with
44
+ * an orphaned holder. Rebuilding from the post-delete model renders every
45
+ * revealed cell and runs the editability backstop.
46
+ */
47
+ rebuildTableBody?: () => void;
39
48
  }
40
49
 
41
50
  interface ActionResult {
@@ -140,7 +149,14 @@ const handleDeleteRow = (
140
149
  ctx: ActionContext,
141
150
  ): ActionResult => {
142
151
  ctx.cellBlocks?.deleteBlocks(ctx.blocksToDelete ?? []);
143
- ctx.grid.deleteRow(gridEl, index);
152
+
153
+ // On a merged grid the physical-index DOM delete can't render cells the model
154
+ // promotes out of a merge. Rebuild from the (already-updated) model instead.
155
+ if (ctx.data.hasMerges && ctx.rebuildTableBody) {
156
+ ctx.rebuildTableBody();
157
+ } else {
158
+ ctx.grid.deleteRow(gridEl, index);
159
+ }
144
160
 
145
161
  const newRowCount = ctx.grid.getRowCount(gridEl);
146
162
  const neighborRow = index < newRowCount ? index : index - 1;
@@ -160,7 +176,14 @@ const handleDeleteCol = (
160
176
  ctx: ActionContext,
161
177
  ): ActionResult => {
162
178
  ctx.cellBlocks?.deleteBlocks(ctx.blocksToDelete ?? []);
163
- ctx.grid.deleteColumn(gridEl, index);
179
+
180
+ // See handleDeleteRow: merged grids must rebuild from the model so promoted
181
+ // cells render with an editable target instead of vanishing.
182
+ if (ctx.data.hasMerges && ctx.rebuildTableBody) {
183
+ ctx.rebuildTableBody();
184
+ } else {
185
+ ctx.grid.deleteColumn(gridEl, index);
186
+ }
164
187
 
165
188
  const colWidths = syncColWidthsAfterDeleteColumn(ctx.data.colWidths, index);
166
189
 
@@ -522,6 +522,10 @@ export class TableSubsystems {
522
522
  // also transform widths — passing post-mutation widths would double-apply
523
523
  // the transformation.
524
524
  const colWidthsBeforeMutation = this.host.model.colWidths;
525
+ // Capture BEFORE the model mutation: deleting a merge-origin row/column
526
+ // can remove the last merge, so a post-mutation read would miss that the
527
+ // delete straddled a merge and the DOM needs a full rebuild.
528
+ const hasMergesBeforeMutation = this.host.model.hasMerges();
525
529
 
526
530
  // Sync model structural operation before DOM changes
527
531
  const { blocksToDelete } = this.syncModelForAction(action);
@@ -536,10 +540,11 @@ export class TableSubsystems {
536
540
  withHeadings: this.host.model.withHeadings,
537
541
  withHeadingColumn: this.host.model.withHeadingColumn,
538
542
  initialColWidth: this.host.model.initialColWidth,
539
- hasMerges: this.host.model.hasMerges(),
543
+ hasMerges: hasMergesBeforeMutation,
540
544
  },
541
545
  cellBlocks: this.host.cellBlocks,
542
546
  blocksToDelete,
547
+ rebuildTableBody: () => this.host.rebuildTableBody(),
543
548
  },
544
549
  );
545
550
 
@@ -1 +0,0 @@
1
- var e={"blockSettings.dragToMove":`拖动以移动`,"blockSettings.clickToOpenMenu":`点击打开菜单`,"blockSettings.clickOrShortcutToOpenMenu":`点击或 {shortcut} 打开菜单`,"blockSettings.menuShortcutMac":`⌘/`,"blockSettings.menuShortcutWin":`Ctrl+/`,"toolbox.addBelow":`添加内容块`,"toolbox.optionAddAbove":`⌥ 在上方添加`,"toolbox.ctrlAddAbove":`Ctrl 在上方添加`,"toolbox.typeToSearch":`输入以搜索`,"popover.search":`搜索`,"popover.nothingFound":`未找到结果`,"popover.convertTo":`转换为`,"toolNames.text":`文本`,"toolNames.heading":`标题`,"toolNames.link":`链接`,"toolNames.bold":`加粗`,"toolNames.italic":`斜体`,"toolNames.marker":`颜色`,"toolNames.bulletedList":`无序列表`,"toolNames.numberedList":`有序列表`,"toolNames.todoList":`清单`,"toolNames.toggleList":`折叠列表`,"toolNames.board":`看板`,"toolNames.database":`数据库`,"tools.link.addLink":`添加链接`,"tools.link.invalidLink":`链接无效`,"tools.marker.textColor":`文字`,"tools.marker.background":`背景`,"tools.marker.default":`默认`,"tools.colorPicker.defaultSwatchLabel":`{mode} {default}`,"tools.colorPicker.colorSwatchLabel":`{mode} {color}`,"tools.colorPicker.color.gray":`灰色`,"tools.colorPicker.color.brown":`棕色`,"tools.colorPicker.color.orange":`橙色`,"tools.colorPicker.color.yellow":`黄色`,"tools.colorPicker.color.green":`绿色`,"tools.colorPicker.color.blue":`蓝色`,"tools.colorPicker.color.purple":`紫色`,"tools.colorPicker.color.pink":`粉色`,"tools.colorPicker.color.red":`红色`,"tools.stub.error":`错误`,"tools.stub.blockCannotBeDisplayed":`无法显示此内容块`,"tools.header.heading1":`一级标题`,"tools.header.heading2":`二级标题`,"tools.header.heading3":`三级标题`,"tools.header.heading4":`四级标题`,"tools.header.heading5":`五级标题`,"tools.header.heading6":`六级标题`,"tools.header.toggleHeading":`折叠标题`,"tools.header.toggleHeading1":`折叠一级标题`,"tools.header.toggleHeading2":`折叠二级标题`,"tools.header.toggleHeading3":`折叠三级标题`,"tools.list.placeholder":`列表`,"tools.paragraph.placeholder":`输入内容或按 / 选择工具`,"tools.toggle.placeholder":`折叠`,"tools.toggle.bodyPlaceholder":`空的折叠块。点击或将块拖入其中。`,"tools.toggle.ariaLabelCollapse":`折叠`,"tools.toggle.ariaLabelExpand":`展开`,"blockSettings.delete":`删除`,"blockSettings.copyLink":`复制块链接`,"blockSettings.lastEdited":`上次编辑`,"blockSettings.lastEditedBy":`{name} 上次编辑`,"a11y.dragHandle":`拖动移动或点击打开菜单`,"a11y.dragHandleRole":`拖动控件`,"a11y.dragStarted":`正在拖动内容块`,"a11y.dragStartedMultiple":`正在拖动 {count} 个内容块`,"a11y.dropPosition":`将移动至第 {position} 位,共 {total} 个`,"a11y.dropCancelled":`已取消拖动`,"a11y.blockMoved":`内容块已移动至第 {position} 位,共 {total} 个`,"a11y.blocksMoved":`已移动 {count} 个内容块至第 {position} 位`,"a11y.blockDuplicated":`内容块已复制至第 {position} 位,共 {total} 个`,"a11y.blocksDuplicated":`已复制 {count} 个内容块,起始位置第 {position} 位`,"a11y.movedUp":`内容块已上移至第 {position} 位,共 {total} 个`,"a11y.movedDown":`内容块已下移至第 {position} 位,共 {total} 个`,"a11y.atTop":`内容块已在顶部,无法上移`,"a11y.atBottom":`内容块已在底部,无法下移`,"tools.table.title":`表格`,"tools.table.clearSelection":`清除`,"tools.table.copySelection":`复制`,"tools.table.cellColor":`颜色`,"tools.table.mergeCells":`合并单元格`,"tools.table.splitCell":`拆分单元格`,"tools.table.headerColumn":`标题列`,"tools.table.insertColumnLeft":`在左侧插入列`,"tools.table.insertColumnRight":`在右侧插入列`,"tools.table.deleteColumn":`删除`,"tools.table.headerRow":`标题行`,"tools.table.insertRowAbove":`在上方插入行`,"tools.table.insertRowBelow":`在下方插入行`,"tools.table.deleteRow":`删除`,"tools.table.clickToAddRow":`点击添加新行`,"tools.table.dragToAddRemoveRows":`拖动以添加或删除行`,"tools.table.clickToAddColumn":`点击添加新列`,"tools.table.dragToAddRemoveColumns":`拖动以添加或删除列`,"blockSettings.convertWithChildrenWarning":`此内容块包含 {count} 个嵌套块。转换后,这些嵌套块将被提升至顶层。是否继续?`,"toolNames.underline":`下划线`,"toolNames.strikethrough":`删除线`,"toolNames.callout":`标注`,"toolNames.divider":`分隔线`,"toolNames.quote":`引用`,"toolNames.columns":`分栏`,"tools.columns.col2":`2 列`,"tools.columns.col3":`3 列`,"tools.columns.col4":`4 列`,"tools.columns.col5":`5 列`,"tools.columns.resizeAriaLabel":`调整列宽`,"tools.columns.turnInto":`转换为列`,"searchTerms.columns":`分栏`,"searchTerms.layout":`布局`,"searchTerms.divider":`分割线`,"searchTerms.separator":`分隔符`,"searchTerms.delimiter":`定界符`,"searchTerms.splitter":`拆分线`,"searchTerms.paragraph":`段落`,"searchTerms.plain":`纯文本`,"searchTerms.title":`名称`,"searchTerms.header":`标头`,"searchTerms.heading":`标题`,"searchTerms.toggle":`折叠`,"searchTerms.collapsible":`可折叠`,"searchTerms.bullet":`项目符号`,"searchTerms.unordered":`无序`,"searchTerms.list":`列表`,"searchTerms.ordered":`有序`,"searchTerms.number":`编号`,"searchTerms.checkbox":`复选框`,"searchTerms.task":`任务`,"searchTerms.todo":`待办`,"searchTerms.check":`勾选`,"searchTerms.collapse":`收起`,"searchTerms.expand":`展开`,"searchTerms.accordion":`折叠面板`,"searchTerms.table":`表格`,"searchTerms.grid":`网格`,"searchTerms.spreadsheet":`电子表格`,"searchTerms.callout":`标注`,"searchTerms.note":`备注`,"searchTerms.info":`信息`,"searchTerms.warning":`警告`,"searchTerms.tip":`提示`,"searchTerms.alert":`提醒`,"searchTerms.quote":`引用`,"searchTerms.blockquote":`块引用`,"searchTerms.citation":`出处`,"tools.callout.placeholder":`标注`,"tools.callout.addEmoji":`添加表情`,"tools.callout.editIcon":`编辑图标`,"tools.callout.removeEmoji":`删除图标`,"tools.callout.filterEmojis":`搜索…`,"tools.callout.calloutEmojiCategory":`标注`,"tools.callout.noEmojisFound":`未找到表情符号`,"tools.callout.pickRandom":`随机`,"tools.callout.skinTone":`肤色`,"tools.callout.emojiCategoryPeople":`人物`,"tools.callout.emojiCategoryNature":`自然`,"tools.callout.emojiCategoryFood":`食物`,"tools.callout.emojiCategoryActivity":`活动`,"tools.callout.emojiCategoryTravel":`旅行`,"tools.callout.emojiCategoryObjects":`物品`,"tools.callout.emojiCategorySymbols":`符号`,"tools.callout.emojiCategoryFlags":`旗帜`,"tools.database.addCard":`添加卡片`,"tools.database.newPage":`新页面`,"tools.database.addColumn":`添加列`,"tools.database.cardTitlePlaceholder":`空白页面`,"tools.database.columnTitlePlaceholder":`列`,"tools.database.deleteCard":`删除卡片`,"tools.database.editCardTitle":`编辑标题`,"tools.database.cardMenuLabel":`卡片选项`,"tools.database.deleteColumn":`删除列`,"tools.database.emptyColumn":`没有卡片`,"tools.database.rowTitlePlaceholder":`空白页面`,"tools.database.addRow":`添加行`,"tools.database.newRow":`新行`,"tools.database.openRow":`打开行`,"tools.database.deleteRow":`删除行`,"tools.database.renameColumn":`重命名列`,"tools.callout.color":`颜色`,"tools.callout.colorDefault":`默认`,"tools.callout.colorGray":`灰色`,"tools.callout.colorBrown":`棕色`,"tools.callout.colorOrange":`橙色`,"tools.callout.colorYellow":`黄色`,"tools.callout.colorGreen":`绿色`,"tools.callout.colorTeal":`青色`,"tools.callout.colorBlue":`蓝色`,"tools.callout.colorPurple":`紫色`,"tools.callout.colorPink":`粉色`,"tools.callout.colorRed":`红色`,"tools.quote.size":`引用大小`,"tools.quote.placeholder":`引用`,"tools.quote.defaultSize":`默认`,"tools.quote.largeSize":`大`,"tools.code.codeTab":`代码`,"tools.code.previewTab":`预览`,"tools.code.sideBySide":`并排`,"tools.table.placement":`位置`,"tools.table.placementTopLeft":`左上`,"tools.table.placementTopCenter":`居中上`,"tools.table.placementTopRight":`右上`,"tools.table.placementMiddleLeft":`左中`,"tools.table.placementMiddleCenter":`居中`,"tools.table.placementMiddleRight":`右中`,"tools.table.placementBottomLeft":`左下`,"tools.table.placementBottomCenter":`居中下`,"tools.table.placementBottomRight":`右下`,"toolNames.code":`代码`,"toolNames.inlineCode":`代码`,"tools.code.placeholder":`编写代码…`,"tools.code.language":`语言`,"tools.code.copied":`已复制!`,"tools.code.copyCode":`复制代码`,"tools.code.wrapLines":`自动换行`,"tools.code.searchLanguage":`搜索语言...`,"tools.code.lineNumbers":`行号`,"searchTerms.code":`代码`,"searchTerms.snippet":`片段`,"searchTerms.program":`程序`,"searchTerms.pre":`预格式化`,"toolNames.image":`图片`,"blockSettings.blocksSelected":`{count} 个块`,"blockSettings.copyLinkSuccess":`链接已复制到剪贴板`,"blockSettings.copyLinkError":`无法复制块链接`,"popover.actions":`操作`,"tools.link.keepTyping":`继续输入以添加链接`,"tools.link.emailAddress":`电子邮件地址`,"tools.link.jumpToSection":`跳转到章节`,"tools.link.webLink":`链接到网页`,"tools.code.autoDetected":`自动`,"tools.code.plainText":`纯文本`,"tools.image.alignment":`对齐`,"tools.image.alignmentLeft":`左对齐`,"tools.image.alignmentCenter":`居中`,"tools.image.alignmentRight":`右对齐`,"tools.image.alignmentLeftAria":`左对齐`,"tools.image.alignmentCenterAria":`居中对齐`,"tools.image.alignmentRightAria":`右对齐`,"tools.image.size":`大小`,"tools.image.sizeSmall":`小`,"tools.image.sizeMedium":`中`,"tools.image.sizeLarge":`大`,"tools.image.sizeFull":`全宽`,"tools.image.caption":`说明`,"tools.image.toggleCaption":`显示/隐藏说明`,"tools.image.captionPlaceholder":`添加说明…`,"tools.image.replace":`替换图片`,"tools.image.crop":`裁剪`,"tools.image.viewFullscreen":`全屏查看`,"tools.image.exitFullscreen":`退出全屏`,"tools.image.downloadOriginal":`下载原图`,"tools.image.download":`下载`,"tools.image.copyUrl":`复制链接`,"tools.image.moreOptions":`更多选项`,"tools.image.uploading":`上传中…`,"tools.image.uploadingLabel":`上传中`,"tools.image.cancelUpload":`取消上传`,"tools.image.uploadProgress":`上传进度`,"tools.image.altEdit":`编辑替代文本`,"tools.image.altButton":`替代文本`,"tools.image.altDescription":`添加替代文本以描述此图片。这能让页面对视障或失明用户更易访问。`,"tools.image.altPlaceholder":`替代文本`,"tools.image.preview":`图片预览`,"tools.image.previewControls":`图片预览控件`,"tools.image.navigationControls":`图片导航`,"tools.image.previousImage":`上一张图片`,"tools.image.nextImage":`下一张图片`,"tools.image.zoomIn":`放大`,"tools.image.zoomOut":`缩小`,"tools.image.resetZoom":`重置缩放`,"tools.image.errorUploadFailed":`上传失败`,"tools.image.errorUploadFailedTitle":`上传失败`,"tools.image.errorSourceOffline":`来源可能已更改或离线。`,"tools.image.errorUnavailable":`图片不可用`,"tools.image.errorImageFailedToLoad":`无法加载图片`,"tools.image.errorDefaultTitle":`无法加载图片`,"tools.image.errorDefaultMessage":`URL 返回错误。请尝试其他来源或重新上传文件。`,"tools.image.errorRetry":`重试`,"tools.image.errorReplace":`替换`,"tools.image.emptyAddImage":`添加图片`,"tools.image.emptyUpload":`上传`,"tools.image.emptyLink":`链接`,"tools.image.emptyInsert":`插入`,"tools.image.emptyChooseFile":`选择文件`,"tools.image.emptyOrDropHere":`或将图片拖放到此处`,"tools.image.emptyDropToUpload":`拖放以上传`,"tools.image.emptyMaxSize":`最大 {size}`,"tools.image.emptyUrlPlaceholder":`粘贴图片 URL…`,"tools.image.emptyUrlAria":`图片 URL`,"tools.image.emptySourceAria":`图片来源`,"tools.image.cropAspectRatio":`宽高比`,"tools.image.cropRatioFree":`自由`,"tools.image.cropRatio1to1":`1:1`,"tools.image.cropRatio4to3":`4:3`,"tools.image.cropRatio16to9":`16:9`,"tools.image.cropRatioCircle":`圆形`,"tools.image.cropRatioOval":`椭圆`,"tools.image.cropReset":`重置`,"tools.image.cropCancel":`取消`,"tools.image.cropDone":`完成`,"tools.image.cropDialogLabel":`裁剪图片`,"tools.database.titlePlaceholder":`新数据库`,"tools.database.renameView":`重命名`,"tools.database.duplicateView":`复制`,"tools.database.deleteView":`删除`,"tools.database.addView":`添加视图`,"tools.database.viewTypeBoard":`看板`,"tools.database.viewTypeList":`列表`,"tools.database.viewTypeBoardDescription":`以列的形式查看任务`,"tools.database.viewTypeListDescription":`简洁的线性视图`,"tools.database.propertyTypeHeading":`属性类型`,"tools.database.propertyTypeText":`文本`,"tools.database.propertyTypeNumber":`数字`,"tools.database.propertyTypeSelect":`单选`,"tools.database.propertyTypeMultiSelect":`多选`,"tools.database.propertyTypeDate":`日期`,"tools.database.propertyTypeCheckbox":`复选框`,"tools.database.propertyTypeUrl":`URL`,"tools.database.listView":`列表视图`,"tools.database.kanbanBoard":`看板`,"tools.database.cardDetails":`卡片详情`,"tools.database.cardTitle":`卡片标题`,"tools.database.close":`关闭`,"tools.database.defaultTitleProperty":`标题`,"tools.database.defaultStatusProperty":`状态`,"tools.database.defaultStatusNotStarted":`未开始`,"tools.database.defaultStatusInProgress":`进行中`,"tools.database.defaultStatusDone":`已完成`,"tools.database.defaultViewBoard":`看板`,"toolNames.bookmark":`书签`,"toolNames.embed":`嵌入`,"tools.bookmark.empty":`粘贴链接以创建书签`,"tools.bookmark.loading":`正在加载链接预览`,"tools.bookmark.error":`无法加载链接预览`,"tools.embed.empty":`粘贴链接以嵌入`,"tools.embed.openOriginal":`打开原文`,"tools.embed.captionPlaceholder":`添加说明…`,"tools.embed.replace":`替换`,"tools.embed.urlPlaceholder":`粘贴要嵌入的链接…`,"tools.embed.urlSubmit":`嵌入链接`,"tools.embed.invalidUrl":`无法嵌入该链接`,"tools.linkPaste.plain":`保留为链接`,"tools.linkPaste.bookmark":`创建书签`,"tools.linkPaste.embed":`创建嵌入`,"tools.linkPaste.embedVideo":`嵌入 {provider} 视频`,"tools.linkPaste.embedAudio":`嵌入 {provider} 音频`,"tools.linkPaste.embedImage":`嵌入 {provider} 图片`,"tools.linkPaste.embedSocial":`嵌入 {provider} 帖子`,"tools.linkPaste.embedDocument":`嵌入 {provider} 文档`,"tools.linkPaste.embedTable":`嵌入 {provider} 表格`,"tools.linkPaste.embedForm":`嵌入 {provider} 表单`,"tools.linkPaste.embedCode":`嵌入 {provider} 代码`,"tools.linkPaste.embedDesign":`嵌入 {provider} 设计`,"tools.linkPaste.embedChart":`嵌入 {provider} 图表`,"tools.linkPaste.embedMap":`嵌入 {provider} 地图`,"tools.linkPaste.embedCalendar":`嵌入 {provider} 日历`,"tools.linkPaste.mention":`提及`,"toolNames.file":`文件`,"tools.file.emptyAddFile":`添加文件`,"tools.file.emptyUpload":`上传`,"tools.file.emptyLink":`链接`,"tools.file.emptyChooseFile":`选择文件`,"tools.file.emptyDropHint":`或将文件拖放到此处`,"tools.file.emptyDropToUpload":`拖放以上传`,"tools.file.emptySourceAria":`文件来源`,"tools.file.emptyUrlPlaceholder":`粘贴文件 URL…`,"tools.file.emptyUrlAria":`文件 URL`,"tools.file.emptyInsert":`插入`,"tools.file.uploading":`上传中…`,"tools.file.cancelUpload":`取消上传`,"tools.file.uploadProgress":`上传进度`,"tools.file.toggleCaption":`显示/隐藏说明`,"tools.file.captionPlaceholder":`添加说明…`,"tools.file.replace":`替换文件`,"tools.file.download":`下载`,"tools.file.copyUrl":`复制链接`,"tools.file.errorUploadFailed":`上传失败`,"tools.file.errorReplace":`替换`,"tools.file.preview":`预览`,"tools.file.previewClose":`关闭预览`,"tools.file.previewRaw":`源码`,"tools.file.previewRender":`渲染`,"tools.file.previewLoading":`正在加载预览…`,"tools.file.previewError":`无法加载预览`,"tools.file.previewDownload":`下载`,"tools.file.previewOpenInNewTab":`在新标签页中打开`};exports.default=e;
@@ -1 +0,0 @@
1
- var e={"blockSettings.dragToMove":`Prevucite za premještanje`,"blockSettings.clickToOpenMenu":`Kliknite za otvaranje menija`,"blockSettings.clickOrShortcutToOpenMenu":`Kliknite ili {shortcut} za otvaranje menija`,"blockSettings.menuShortcutMac":`⌘/`,"blockSettings.menuShortcutWin":`Ctrl+/`,"toolbox.addBelow":`Kliknite za dodavanje ispod`,"toolbox.optionAddAbove":`Option-klik za dodavanje iznad`,"toolbox.ctrlAddAbove":`Ctrl-klik za dodavanje iznad`,"toolbox.typeToSearch":`Ukucajte za pretragu`,"popover.search":`Pretraži`,"popover.nothingFound":`Ništa nije pronađeno`,"popover.convertTo":`Pretvori u`,"toolNames.text":`Tekst`,"toolNames.heading":`Naslov`,"toolNames.link":`Poveznica`,"toolNames.bold":`Podebljano`,"toolNames.italic":`Kurziv`,"toolNames.marker":`Boja`,"toolNames.bulletedList":`Lista s tačkama`,"toolNames.numberedList":`Numerirana lista`,"toolNames.todoList":`Lista zadataka`,"toolNames.toggleList":`Preklopna lista`,"tools.link.addLink":`Dodaj link`,"tools.link.invalidLink":`Nevažeći link`,"tools.marker.textColor":`Tekst`,"tools.marker.background":`Pozadina`,"tools.marker.default":`Podrazumijevano`,"tools.colorPicker.defaultSwatchLabel":`{mode} {default}`,"tools.colorPicker.colorSwatchLabel":`{mode} {color}`,"tools.colorPicker.color.gray":`Sivo`,"tools.colorPicker.color.brown":`Smeđe`,"tools.colorPicker.color.orange":`Narančasto`,"tools.colorPicker.color.yellow":`Žuto`,"tools.colorPicker.color.green":`Zeleno`,"tools.colorPicker.color.blue":`Plavo`,"tools.colorPicker.color.purple":`Ljubičasto`,"tools.colorPicker.color.pink":`Ružičasto`,"tools.colorPicker.color.red":`Crveno`,"tools.stub.error":`Greška`,"tools.stub.blockCannotBeDisplayed":`Ovaj blok se ne može prikazati`,"tools.header.heading1":`Naslov 1`,"tools.header.heading2":`Naslov 2`,"tools.header.heading3":`Naslov 3`,"tools.header.heading4":`Naslov 4`,"tools.header.heading5":`Naslov 5`,"tools.header.heading6":`Naslov 6`,"tools.header.toggleHeading":`Preklopni naslov`,"tools.header.toggleHeading1":`Preklopni naslov 1`,"tools.header.toggleHeading2":`Preklopni naslov 2`,"tools.header.toggleHeading3":`Preklopni naslov 3`,"tools.list.placeholder":`Lista`,"tools.paragraph.placeholder":`Napišite nešto ili pritisnite / za odabir`,"tools.toggle.placeholder":`Preklop`,"tools.toggle.bodyPlaceholder":`Prazan prekidač. Kliknite ili ispustite blokove unutra.`,"tools.toggle.ariaLabelCollapse":`Sažmi`,"tools.toggle.ariaLabelExpand":`Proširi`,"blockSettings.delete":`Obriši`,"blockSettings.copyLink":`Kopiraj link na blok`,"blockSettings.lastEdited":`Posljednja izmjena`,"blockSettings.lastEditedBy":`Posljednju izmjenu napravio/la {name}`,"a11y.dragHandle":`Prevucite za premještanje bloka ili kliknite za meni`,"a11y.dragHandleRole":`ručka za povlačenje`,"a11y.dragStarted":`Povlačenje bloka`,"a11y.dragStartedMultiple":`Povlačenje {count} blokova`,"a11y.dropPosition":`Bit će postavljeno na poziciju {position} od {total}`,"a11y.dropCancelled":`Povlačenje je otkazano`,"a11y.blockMoved":`Blok je premješten na poziciju {position} od {total}`,"a11y.blocksMoved":`{count} blokova je premješteno na poziciju {position}`,"a11y.blockDuplicated":`Blok je dupliran na poziciju {position} od {total}`,"a11y.blocksDuplicated":`{count} blokova je duplirano počevši od pozicije {position}`,"a11y.movedUp":`Blok je pomjeren gore na poziciju {position} od {total}`,"a11y.movedDown":`Blok je pomjeren dolje na poziciju {position} od {total}`,"a11y.atTop":`Blok je na vrhu, ne može se pomjeriti gore`,"a11y.atBottom":`Blok je na dnu, ne može se pomjeriti dolje`,"tools.table.title":`Tabela`,"tools.table.clearSelection":`Očisti`,"tools.table.copySelection":`Kopiraj`,"tools.table.cellColor":`Boja`,"tools.table.mergeCells":`Spoji ćelije`,"tools.table.splitCell":`Razdvoji ćeliju`,"tools.table.headerColumn":`Kolona zaglavlja`,"tools.table.insertColumnLeft":`Umetni kolonu lijevo`,"tools.table.insertColumnRight":`Umetni kolonu desno`,"tools.table.deleteColumn":`Obriši`,"tools.table.headerRow":`Red zaglavlja`,"tools.table.insertRowAbove":`Umetni red iznad`,"tools.table.insertRowBelow":`Umetni red ispod`,"tools.table.deleteRow":`Obriši`,"tools.table.clickToAddRow":`Kliknite za dodavanje novog reda`,"tools.table.dragToAddRemoveRows":`Prevucite za dodavanje ili uklanjanje redova`,"tools.table.clickToAddColumn":`Kliknite za dodavanje nove kolone`,"tools.table.dragToAddRemoveColumns":`Prevucite za dodavanje ili uklanjanje kolona`,"blockSettings.convertWithChildrenWarning":`Ovaj blok sadrži {count} ugniježđenih blokova. Konverzijom će biti premješteni na najviši nivo. Nastaviti?`,"toolNames.underline":`Podcrtano`,"toolNames.strikethrough":`Precrtano`,"toolNames.callout":`Isticanje`,"toolNames.database":`Baza podataka`,"toolNames.board":`Tabla`,"toolNames.divider":`Razdjelnik`,"toolNames.quote":`Citat`,"toolNames.columns":`Kolone`,"tools.columns.col2":`2 kolone`,"tools.columns.col3":`3 kolone`,"tools.columns.col4":`4 kolone`,"tools.columns.col5":`5 kolona`,"tools.columns.resizeAriaLabel":`Promijeni veličinu stupaca`,"tools.columns.turnInto":`Pretvori u stupce`,"searchTerms.columns":`kolone`,"searchTerms.layout":`raspored`,"searchTerms.divider":`razdjelnik`,"searchTerms.separator":`odjeljivač`,"searchTerms.delimiter":`graničnik`,"searchTerms.splitter":`razdvajač`,"searchTerms.paragraph":`paragraf`,"searchTerms.plain":`običan`,"searchTerms.title":`naziv`,"searchTerms.header":`zaglavlje`,"searchTerms.heading":`naslov`,"searchTerms.toggle":`preklop`,"searchTerms.collapsible":`sklopivo`,"searchTerms.bullet":`tačka`,"searchTerms.unordered":`neumerirana`,"searchTerms.list":`lista`,"searchTerms.ordered":`numerirana`,"searchTerms.number":`broj`,"searchTerms.checkbox":`potvrdni okvir`,"searchTerms.task":`zadatak`,"searchTerms.todo":`zadaci`,"searchTerms.check":`kvačica`,"searchTerms.collapse":`sažmi`,"searchTerms.expand":`proširi`,"searchTerms.accordion":`harmonika`,"searchTerms.table":`tabela`,"searchTerms.grid":`mreža`,"searchTerms.spreadsheet":`proračunska tablica`,"searchTerms.callout":`isticanje`,"searchTerms.note":`napomena`,"searchTerms.info":`informacija`,"searchTerms.warning":`upozorenje`,"searchTerms.tip":`savjet`,"searchTerms.alert":`obavještenje`,"searchTerms.quote":`citat`,"searchTerms.blockquote":`blok citat`,"searchTerms.citation":`navod`,"tools.callout.placeholder":`Isticanje`,"tools.callout.addEmoji":`Dodaj emoji`,"tools.callout.editIcon":`Uredi ikonu`,"tools.callout.removeEmoji":`Ukloni ikonu`,"tools.callout.filterEmojis":`Filtriraj…`,"tools.callout.calloutEmojiCategory":`Isticanje`,"tools.callout.noEmojisFound":`Nisu pronađeni emojiji`,"tools.callout.pickRandom":`Nasumično`,"tools.callout.skinTone":`Boja kože`,"tools.callout.emojiCategoryPeople":`Ljudi`,"tools.callout.emojiCategoryNature":`Priroda`,"tools.callout.emojiCategoryFood":`Hrana`,"tools.callout.emojiCategoryActivity":`Aktivnosti`,"tools.callout.emojiCategoryTravel":`Putovanja`,"tools.callout.emojiCategoryObjects":`Predmeti`,"tools.callout.emojiCategorySymbols":`Simboli`,"tools.callout.emojiCategoryFlags":`Zastave`,"tools.database.addColumn":`Dodaj kolonu`,"tools.database.renameColumn":`Preimenuj kolonu`,"tools.database.deleteColumn":`Obriši kolonu`,"tools.database.addCard":`Dodaj karticu`,"tools.database.newPage":`Nova stranica`,"tools.database.deleteCard":`Obriši karticu`,"tools.database.editCardTitle":`Uredi naslov`,"tools.database.cardMenuLabel":`Opcije kartice`,"tools.database.cardTitlePlaceholder":`Prazna stranica`,"tools.database.columnTitlePlaceholder":`Kolona`,"tools.database.emptyColumn":`Nema kartica`,"tools.database.rowTitlePlaceholder":`Prazna stranica`,"tools.database.addRow":`Dodaj red`,"tools.database.newRow":`Novi red`,"tools.database.openRow":`Otvori red`,"tools.database.deleteRow":`Obriši red`,"tools.callout.color":`Boja`,"tools.callout.colorDefault":`Podrazumijevano`,"tools.callout.colorGray":`Sivo`,"tools.callout.colorBrown":`Smeđe`,"tools.callout.colorOrange":`Narančasto`,"tools.callout.colorYellow":`Žuto`,"tools.callout.colorGreen":`Zeleno`,"tools.callout.colorTeal":`Tirkizna`,"tools.callout.colorBlue":`Plavo`,"tools.callout.colorPurple":`Ljubičasto`,"tools.callout.colorPink":`Ružičasto`,"tools.callout.colorRed":`Crveno`,"tools.quote.size":`Veličina citata`,"tools.quote.placeholder":`Citat`,"tools.quote.defaultSize":`Podrazumijevano`,"tools.quote.largeSize":`Veliko`,"tools.code.codeTab":`Kod`,"tools.code.previewTab":`Pregled`,"tools.code.sideBySide":`Uporedno`,"tools.table.placement":`Položaj`,"tools.table.placementTopLeft":`Gore lijevo`,"tools.table.placementTopCenter":`Gore sredina`,"tools.table.placementTopRight":`Gore desno`,"tools.table.placementMiddleLeft":`Sredina lijevo`,"tools.table.placementMiddleCenter":`Sredina`,"tools.table.placementMiddleRight":`Sredina desno`,"tools.table.placementBottomLeft":`Dolje lijevo`,"tools.table.placementBottomCenter":`Dolje sredina`,"tools.table.placementBottomRight":`Dolje desno`,"toolNames.code":`Kod`,"toolNames.inlineCode":`Kod`,"tools.code.placeholder":`Napišite kod…`,"tools.code.language":`Jezik`,"tools.code.copied":`Kopirano!`,"tools.code.copyCode":`Kopiraj kod`,"tools.code.wrapLines":`Prelom redova`,"tools.code.searchLanguage":`Pretraži jezik...`,"tools.code.lineNumbers":`Brojevi redova`,"searchTerms.code":`kod`,"searchTerms.snippet":`isječak`,"searchTerms.program":`programiranje`,"searchTerms.pre":`preformatiran`,"toolNames.image":`Slika`,"blockSettings.blocksSelected":`Blokova: {count}`,"blockSettings.copyLinkSuccess":`Link je kopiran`,"blockSettings.copyLinkError":`Link nije moguće kopirati`,"popover.actions":`Radnje`,"tools.link.keepTyping":`Nastavite pisati da dodate link`,"tools.link.emailAddress":`Email adresa`,"tools.link.jumpToSection":`Idi na odjeljak`,"tools.link.webLink":`Link ka web stranici`,"tools.code.autoDetected":`automatski`,"tools.code.plainText":`Običan tekst`,"tools.image.alignment":`Poravnanje`,"tools.image.alignmentLeft":`Lijevo`,"tools.image.alignmentCenter":`Centar`,"tools.image.alignmentRight":`Desno`,"tools.image.alignmentLeftAria":`Poravnaj lijevo`,"tools.image.alignmentCenterAria":`Poravnaj po sredini`,"tools.image.alignmentRightAria":`Poravnaj desno`,"tools.image.size":`Veličina`,"tools.image.sizeSmall":`Mala`,"tools.image.sizeMedium":`Srednja`,"tools.image.sizeLarge":`Velika`,"tools.image.sizeFull":`Puna širina`,"tools.image.caption":`Natpis`,"tools.image.toggleCaption":`Prikaži natpis`,"tools.image.captionPlaceholder":`Unesite natpis…`,"tools.image.replace":`Zamijeni sliku`,"tools.image.crop":`Isjeci`,"tools.image.viewFullscreen":`Cijeli ekran`,"tools.image.exitFullscreen":`Izađi iz cijelog ekrana`,"tools.image.downloadOriginal":`Preuzmi original`,"tools.image.download":`Preuzmi`,"tools.image.copyUrl":`Kopiraj URL`,"tools.image.moreOptions":`Više`,"tools.image.uploading":`Slanje…`,"tools.image.uploadingLabel":`Slanje`,"tools.image.cancelUpload":`Otkaži slanje`,"tools.image.uploadProgress":`Napredak slanja`,"tools.image.altEdit":`Uredi alternativni tekst`,"tools.image.altButton":`Alt`,"tools.image.altDescription":`Dodajte opis slike. Time stranicu činite pristupačnijom osobama oštećenog vida.`,"tools.image.altPlaceholder":`Alternativni tekst`,"tools.image.preview":`Pregled slike`,"tools.image.previewControls":`Kontrole pregleda`,"tools.image.navigationControls":`Navigacija slikama`,"tools.image.previousImage":`Prethodna slika`,"tools.image.nextImage":`Sljedeća slika`,"tools.image.zoomIn":`Uvećaj`,"tools.image.zoomOut":`Umanji`,"tools.image.resetZoom":`Resetuj uvećanje`,"tools.image.errorUploadFailed":`Slanje nije uspjelo`,"tools.image.errorUploadFailedTitle":`Otpremanje nije uspjelo`,"tools.image.errorSourceOffline":`Izvor je možda premješten ili nedostupan.`,"tools.image.errorUnavailable":`Slika nije dostupna`,"tools.image.errorImageFailedToLoad":`Slika se ne može učitati`,"tools.image.errorDefaultTitle":`Slika se ne može učitati`,"tools.image.errorDefaultMessage":`Server je vratio grešku. Pokušajte drugi izvor ili ponovo pošaljite datoteku.`,"tools.image.errorRetry":`Pokušaj ponovo`,"tools.image.errorReplace":`Zamijeni`,"tools.image.emptyAddImage":`Dodajte sliku`,"tools.image.emptyUpload":`Pošalji`,"tools.image.emptyLink":`Veza`,"tools.image.emptyInsert":`Umetni`,"tools.image.emptyChooseFile":`Odaberi datoteku`,"tools.image.emptyOrDropHere":`ili ispustite sliku ovdje`,"tools.image.emptyDropToUpload":`Ispustite za slanje`,"tools.image.emptyMaxSize":`do {size}`,"tools.image.emptyUrlPlaceholder":`Zalijepite URL slike…`,"tools.image.emptyUrlAria":`URL slike`,"tools.image.emptySourceAria":`Izvor slike`,"tools.image.cropAspectRatio":`Omjer stranica`,"tools.image.cropRatioFree":`Slobodno`,"tools.image.cropRatio1to1":`1:1`,"tools.image.cropRatio4to3":`4:3`,"tools.image.cropRatio16to9":`16:9`,"tools.image.cropRatioCircle":`Krug`,"tools.image.cropRatioOval":`Ovalno`,"tools.image.cropReset":`Resetuj`,"tools.image.cropCancel":`Otkaži`,"tools.image.cropDone":`Gotovo`,"tools.image.cropDialogLabel":`Isjeci sliku`,"tools.database.titlePlaceholder":`Nova baza podataka`,"tools.database.renameView":`Preimenuj`,"tools.database.duplicateView":`Dupliraj`,"tools.database.deleteView":`Obriši`,"tools.database.addView":`Dodaj prikaz`,"tools.database.viewTypeBoard":`Tabla`,"tools.database.viewTypeList":`Lista`,"tools.database.viewTypeBoardDescription":`Prikaži rad kao kolone`,"tools.database.viewTypeListDescription":`Jednostavan linearni prikaz`,"tools.database.propertyTypeHeading":`Tip svojstva`,"tools.database.propertyTypeText":`Tekst`,"tools.database.propertyTypeNumber":`Broj`,"tools.database.propertyTypeSelect":`Izbor`,"tools.database.propertyTypeMultiSelect":`Višestruki izbor`,"tools.database.propertyTypeDate":`Datum`,"tools.database.propertyTypeCheckbox":`Kvadratić`,"tools.database.propertyTypeUrl":`URL`,"tools.database.listView":`Lista`,"tools.database.kanbanBoard":`Kanban tabla`,"tools.database.cardDetails":`Kartica`,"tools.database.cardTitle":`Naslov kartice`,"tools.database.close":`Zatvori`,"tools.database.defaultTitleProperty":`Naslov`,"tools.database.defaultStatusProperty":`Stanje`,"tools.database.defaultStatusNotStarted":`Nije započeto`,"tools.database.defaultStatusInProgress":`U toku`,"tools.database.defaultStatusDone":`Gotovo`,"tools.database.defaultViewBoard":`Tabla`,"toolNames.bookmark":`Knjižna oznaka`,"toolNames.embed":`Ugradi`,"tools.bookmark.empty":`Zalijepite link da kreirate knjižnu oznaku`,"tools.bookmark.loading":`Učitavanje pregleda linka`,"tools.bookmark.error":`Pregled linka nije moguće učitati`,"tools.embed.empty":`Zalijepite link za ugradnju`,"tools.embed.openOriginal":`Otvori original`,"tools.embed.captionPlaceholder":`Unesite natpis…`,"tools.embed.replace":`Zamijeni`,"tools.embed.urlPlaceholder":`Zalijepite link za ugrađivanje…`,"tools.embed.urlSubmit":`Ugradi link`,"tools.embed.invalidUrl":`Ovaj link nije moguće ugraditi`,"tools.linkPaste.plain":`Zadrži kao link`,"tools.linkPaste.bookmark":`Kreiraj knjižnu oznaku`,"tools.linkPaste.embed":`Kreiraj ugradnju`,"tools.linkPaste.embedVideo":`Ugradi {provider} video`,"tools.linkPaste.embedAudio":`Ugradi {provider} audio`,"tools.linkPaste.embedImage":`Ugradi {provider} sliku`,"tools.linkPaste.embedSocial":`Ugradi {provider} objavu`,"tools.linkPaste.embedDocument":`Ugradi {provider} dokument`,"tools.linkPaste.embedTable":`Ugradi {provider} tabelu`,"tools.linkPaste.embedForm":`Ugradi {provider} obrazac`,"tools.linkPaste.embedCode":`Ugradi {provider} kod`,"tools.linkPaste.embedDesign":`Ugradi {provider} dizajn`,"tools.linkPaste.embedChart":`Ugradi {provider} grafikon`,"tools.linkPaste.embedMap":`Ugradi {provider} mapu`,"tools.linkPaste.embedCalendar":`Ugradi {provider} kalendar`,"tools.linkPaste.mention":`Spomeni`,"toolNames.file":`Datoteka`,"tools.file.emptyAddFile":`Dodajte datoteku`,"tools.file.emptyUpload":`Pošalji`,"tools.file.emptyLink":`Veza`,"tools.file.emptyChooseFile":`Odaberi datoteku`,"tools.file.emptyDropHint":`ili prevuci datoteku ovdje`,"tools.file.emptyDropToUpload":`Ispustite za slanje`,"tools.file.emptySourceAria":`Izvor datoteke`,"tools.file.emptyUrlPlaceholder":`Zalijepite URL datoteke…`,"tools.file.emptyUrlAria":`URL datoteke`,"tools.file.emptyInsert":`Umetni`,"tools.file.uploading":`Slanje…`,"tools.file.cancelUpload":`Otkaži slanje`,"tools.file.uploadProgress":`Napredak slanja`,"tools.file.toggleCaption":`Prikaži natpis`,"tools.file.captionPlaceholder":`Unesite natpis…`,"tools.file.replace":`Zamijeni datoteku`,"tools.file.download":`Preuzmi`,"tools.file.copyUrl":`Kopiraj URL`,"tools.file.errorUploadFailed":`Slanje nije uspjelo`,"tools.file.errorReplace":`Zamijeni`,"tools.file.preview":`Pregled`,"tools.file.previewClose":`Zatvori pregled`,"tools.file.previewRaw":`Izvor`,"tools.file.previewRender":`Prikaz`,"tools.file.previewLoading":`Učitavanje pregleda…`,"tools.file.previewError":`Pregled nije moguće učitati`,"tools.file.previewDownload":`Preuzmi`,"tools.file.previewOpenInNewTab":`Otvori u novoj kartici`};exports.default=e;