@jackuait/blok 0.16.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (537) hide show
  1. package/dist/blok.cjs +1 -1
  2. package/dist/blok.iife.js +4 -4
  3. package/dist/blok.mjs +2 -2
  4. package/dist/blok.umd.js +4 -4
  5. package/dist/chunks/{blok-BTpZKZQ5.cjs → blok-BPd65xOj.cjs} +11 -11
  6. package/dist/chunks/{blok-RLzqfwql.mjs → blok-D4ApwnD7.mjs} +776 -780
  7. package/dist/chunks/constants-C3wBsvmH.cjs +606 -0
  8. package/dist/chunks/{constants-BUNgcIvY.mjs → constants-DObdf8NU.mjs} +274 -274
  9. package/dist/chunks/{i18next-loader-BH_a6G9t.mjs → i18next-loader-BMhspWFn.mjs} +1 -1
  10. package/dist/chunks/{i18next-loader-BID4jAFG.cjs → i18next-loader-CNLosgId.cjs} +1 -1
  11. package/dist/chunks/{lightweight-i18n-Clk37huC.cjs → lightweight-i18n-ByswFbdt.cjs} +1 -1
  12. package/dist/chunks/{lightweight-i18n-B0VO8Rft.mjs → lightweight-i18n-Ck1HlVxq.mjs} +32 -0
  13. package/dist/{messages-MYWse7vx2.mjs → chunks/messages--uPFKcl3.mjs} +41 -9
  14. package/dist/{messages-gmq1abXg.mjs → chunks/messages-0ZOxg81Y.mjs} +43 -11
  15. package/dist/{messages-BSvuvR6i.mjs → chunks/messages-1H2SY5H1.mjs} +54 -22
  16. package/dist/chunks/messages-1bAMgAsO.cjs +1 -0
  17. package/dist/chunks/messages-3B44ZmLZ.cjs +1 -0
  18. package/dist/chunks/messages-3iZ6jJ6e.cjs +1 -0
  19. package/dist/chunks/messages-5Rp1xyL4.cjs +1 -0
  20. package/dist/chunks/messages-5Vbzn-DL2.cjs +1 -0
  21. package/dist/{messages-K1RIXLxa.mjs → chunks/messages-61uWTg1y.mjs} +37 -5
  22. package/dist/chunks/messages-6lqZ4lhc2.cjs +1 -0
  23. package/dist/chunks/messages-795D2ldP2.cjs +1 -0
  24. package/dist/chunks/messages-79WWudxY.cjs +1 -0
  25. package/dist/chunks/messages-8uD5ctYP.cjs +1 -0
  26. package/dist/{messages-DL1HdFqf.mjs → chunks/messages-9gvi5jul.mjs} +38 -6
  27. package/dist/chunks/messages-B0o3rVBB.cjs +1 -0
  28. package/dist/chunks/messages-B1h0nDQW.cjs +1 -0
  29. package/dist/chunks/messages-B37vUkBi.cjs +1 -0
  30. package/dist/{messages-C0RxvQ_B2.mjs → chunks/messages-B4BvJtlu.mjs} +53 -21
  31. package/dist/{messages-m_U7v4rD.mjs → chunks/messages-BChCPw99.mjs} +45 -13
  32. package/dist/chunks/messages-BDs_gdD_.cjs +1 -0
  33. package/dist/chunks/messages-BE6rW2R-.cjs +1 -0
  34. package/dist/{messages-ZAVymtrA2.mjs → chunks/messages-BFGgLdIA2.mjs} +40 -8
  35. package/dist/chunks/{messages-Ci-rkkgx.mjs → messages-BFcq7wsx.mjs} +39 -7
  36. package/dist/{messages-ilnnXk3p.mjs → chunks/messages-BGaAuDRS.mjs} +41 -9
  37. package/dist/chunks/messages-BGoJHXUk2.cjs +1 -0
  38. package/dist/{messages-xSBQ46qE2.mjs → chunks/messages-BIHeeP7X2.mjs} +53 -21
  39. package/dist/chunks/{messages-8FnVkNsk2.mjs → messages-BIQ2VT8X2.mjs} +48 -16
  40. package/dist/{messages-DCwlxqBz.mjs → chunks/messages-BK32XCpH.mjs} +58 -26
  41. package/dist/{messages-BnpaaUnF2.mjs → chunks/messages-BKSDnjOs.mjs} +40 -8
  42. package/dist/chunks/{messages-7nxAnzdE2.mjs → messages-BMNmXaC8.mjs} +43 -11
  43. package/dist/{messages-BlkFLGrN.mjs → chunks/messages-BNuGVAEy.mjs} +40 -8
  44. package/dist/{messages-CI7MWoEP2.mjs → chunks/messages-BQEh67Mi2.mjs} +53 -21
  45. package/dist/chunks/messages-BQOx3XGd.cjs +1 -0
  46. package/dist/chunks/{messages-CIqhI4HT.mjs → messages-BQUzqXIO.mjs} +46 -14
  47. package/dist/{messages-BqjusG9f.mjs → chunks/messages-BTKPcoLu.mjs} +49 -17
  48. package/dist/chunks/messages-BXgTHDIw.cjs +1 -0
  49. package/dist/chunks/messages-BXvKhyQH.cjs +1 -0
  50. package/dist/chunks/messages-BYW-U0iT.cjs +1 -0
  51. package/dist/chunks/messages-B_lkWkPQ.cjs +1 -0
  52. package/dist/{messages-CaJp3hwf2.mjs → chunks/messages-BaWaLwcn2.mjs} +42 -10
  53. package/dist/chunks/messages-BeTQxvmX2.cjs +1 -0
  54. package/dist/chunks/messages-BfWGa4V82.cjs +1 -0
  55. package/dist/chunks/{messages-B19gfehr.mjs → messages-Bgzyr5Lh.mjs} +48 -16
  56. package/dist/chunks/messages-BjFB8sow.cjs +1 -0
  57. package/dist/chunks/messages-Bjmg_8lv2.cjs +1 -0
  58. package/dist/chunks/messages-BlOVJtaj.cjs +1 -0
  59. package/dist/{messages-DQiZK84h.mjs → chunks/messages-BnW_Fwro.mjs} +57 -25
  60. package/dist/chunks/messages-Bpvja9xW2.cjs +1 -0
  61. package/dist/chunks/messages-BtMQ6v_L.cjs +1 -0
  62. package/dist/chunks/messages-BvChjyuU2.cjs +1 -0
  63. package/dist/{messages-Ca6_kMBT2.mjs → chunks/messages-Bvge__AJ2.mjs} +45 -13
  64. package/dist/chunks/{messages-BSHC8Ohs.mjs → messages-BwxzN2q3.mjs} +43 -11
  65. package/dist/chunks/{messages-C81EnNxX.mjs → messages-Byntrl2c.mjs} +41 -9
  66. package/dist/chunks/{messages-CXbHVq05.mjs → messages-C3B8l3Hy.mjs} +49 -17
  67. package/dist/chunks/messages-C3fAHxfE2.cjs +1 -0
  68. package/dist/chunks/{messages-qjFVR3AK.mjs → messages-C56BTPcC.mjs} +38 -6
  69. package/dist/{messages-B3YNVBd1.mjs → chunks/messages-C6vijVZv2.mjs} +37 -5
  70. package/dist/{messages-C-_8o7te.mjs → chunks/messages-C79Ef9MU.mjs} +43 -11
  71. package/dist/{messages-D5u6vlu6.mjs → chunks/messages-C93gDUHr.mjs} +39 -7
  72. package/dist/chunks/messages-CAix8jdZ.cjs +1 -0
  73. package/dist/{messages-BqKW-hlt2.mjs → chunks/messages-CEUDK26P2.mjs} +42 -10
  74. package/dist/chunks/messages-CEZ528TO2.cjs +1 -0
  75. package/dist/chunks/{messages-DRKzAu-g.mjs → messages-CHx6m_Bo.mjs} +45 -13
  76. package/dist/chunks/messages-CKiWXTe1.cjs +1 -0
  77. package/dist/chunks/{messages-bJ7cOoA_.mjs → messages-CMFcaa9C.mjs} +46 -14
  78. package/dist/chunks/messages-CO4J7Nns.cjs +1 -0
  79. package/dist/chunks/messages-COTP4ZJ_2.cjs +1 -0
  80. package/dist/chunks/{messages-QeD4YPxL.mjs → messages-CV3U2Vsm.mjs} +41 -9
  81. package/dist/{messages--RL8UOhV.mjs → chunks/messages-CYOersvL.mjs} +48 -16
  82. package/dist/{messages-DZtr9UPl2.mjs → chunks/messages-C_s-wv1r2.mjs} +41 -9
  83. package/dist/{messages-CFSBN-tg.mjs → chunks/messages-CbdaJSfC2.mjs} +40 -8
  84. package/dist/chunks/{messages-DTKpwQ9o.mjs → messages-Ccng4hJ2.mjs} +44 -12
  85. package/dist/chunks/messages-Cgph4q9d.cjs +1 -0
  86. package/dist/chunks/messages-Cp7wFDrY2.cjs +1 -0
  87. package/dist/chunks/messages-CpZneXUI.cjs +1 -0
  88. package/dist/chunks/messages-CpbireNX.cjs +1 -0
  89. package/dist/{messages-BIUXljax.mjs → chunks/messages-CpcZgGYg.mjs} +41 -9
  90. package/dist/chunks/{messages-Bxz0TVBv2.mjs → messages-CqhQuuRo2.mjs} +93 -61
  91. package/dist/chunks/{messages-BVV2uB2V2.mjs → messages-CrFIbrXr2.mjs} +40 -8
  92. package/dist/chunks/messages-CrwZs1Gq.cjs +1 -0
  93. package/dist/{messages-7EaFUksm.mjs → chunks/messages-D0_Mxuh62.mjs} +40 -8
  94. package/dist/{messages-BrycA2Yd.mjs → chunks/messages-D1q601Wg.mjs} +37 -5
  95. package/dist/{messages-CRuD2YBl2.mjs → chunks/messages-D3kC7iDa2.mjs} +38 -6
  96. package/dist/{messages-CasKwW-A.mjs → chunks/messages-D4UnR6e52.mjs} +38 -6
  97. package/dist/chunks/messages-D5CeQW1e2.cjs +1 -0
  98. package/dist/chunks/messages-D8UH8jc6.cjs +1 -0
  99. package/dist/chunks/messages-DAmOTPVW2.cjs +1 -0
  100. package/dist/chunks/{messages-ZjheBuhT2.mjs → messages-DBPkzBZO2.mjs} +47 -15
  101. package/dist/chunks/messages-DEduQerF.cjs +1 -0
  102. package/dist/chunks/{messages-c1uiUe552.mjs → messages-DFA5OVrs2.mjs} +45 -13
  103. package/dist/chunks/messages-DHah-frn.cjs +1 -0
  104. package/dist/chunks/messages-DI1ZLPxM.cjs +1 -0
  105. package/dist/chunks/{messages-DsWiXnOy2.mjs → messages-DKJ5CX9h2.mjs} +45 -13
  106. package/dist/chunks/messages-DKjhx7Y3.cjs +1 -0
  107. package/dist/chunks/{messages-CO9-5XrF2.mjs → messages-DR5DyRRY2.mjs} +45 -13
  108. package/dist/{messages-BKrK8Axl.mjs → chunks/messages-DWjHAdb3.mjs} +44 -12
  109. package/dist/chunks/{messages-Hsn-3QW0.mjs → messages-DYsO5SIA.mjs} +50 -18
  110. package/dist/{messages-BaYuAoTP2.mjs → chunks/messages-DZwozMZD2.mjs} +66 -34
  111. package/dist/chunks/{messages-BrpXuY-6.mjs → messages-Db_L5RNl.mjs} +43 -11
  112. package/dist/chunks/messages-DeXUZcFn2.cjs +1 -0
  113. package/dist/chunks/messages-Dgp7Wk4H.cjs +1 -0
  114. package/dist/chunks/messages-DhnCZQEY.cjs +1 -0
  115. package/dist/chunks/messages-DjU1jbKf.cjs +1 -0
  116. package/dist/{messages-B9s898dI.mjs → chunks/messages-DkqiXPS7.mjs} +43 -11
  117. package/dist/chunks/messages-Dl6VC9Q9.cjs +1 -0
  118. package/dist/chunks/messages-Dlc1DdZ22.cjs +1 -0
  119. package/dist/chunks/{messages-DOCzIldx.mjs → messages-Dna-8bQq.mjs} +43 -11
  120. package/dist/chunks/{messages-D3exVYZD.mjs → messages-DtTgOx9a.mjs} +57 -25
  121. package/dist/{messages-eNnPQjam2.mjs → chunks/messages-Duj8jpve2.mjs} +61 -29
  122. package/dist/chunks/messages-DvxZjb5g2.cjs +1 -0
  123. package/dist/chunks/messages-Dz8AmvFq.cjs +1 -0
  124. package/dist/chunks/messages-DzarYc1J2.cjs +1 -0
  125. package/dist/{messages-B6p4UUC-.mjs → chunks/messages-FIgYAomz2.mjs} +45 -13
  126. package/dist/chunks/messages-FM0KHIkQ2.cjs +1 -0
  127. package/dist/chunks/messages-JsmKjXPZ.cjs +1 -0
  128. package/dist/chunks/{messages-CO6ZReE7.mjs → messages-LW9Kd-vn.mjs} +40 -8
  129. package/dist/chunks/{messages-CC4xe9xv.mjs → messages-R2RH1RLt.mjs} +52 -20
  130. package/dist/chunks/messages-RWVOHsZu.cjs +1 -0
  131. package/dist/{messages-DJMSsPuS.mjs → chunks/messages-X90YfYzG2.mjs} +37 -5
  132. package/dist/chunks/messages-YhmR1nl02.cjs +1 -0
  133. package/dist/chunks/messages-Ywb6VdfO2.cjs +1 -0
  134. package/dist/{messages-mcif9RnD.mjs → chunks/messages-ZPOc6IQC.mjs} +37 -5
  135. package/dist/chunks/messages-_ECIn1VC2.cjs +1 -0
  136. package/dist/chunks/messages-cYjlWqco.cjs +1 -0
  137. package/dist/chunks/{messages-BRWkudTR.mjs → messages-dp4NwDVM.mjs} +44 -12
  138. package/dist/{messages-BGIle7Xo.mjs → chunks/messages-hhT3Vii-.mjs} +46 -14
  139. package/dist/chunks/messages-iwzDjgrP.cjs +1 -0
  140. package/dist/chunks/{messages-Dly-_TB6.mjs → messages-k4Do3gkF.mjs} +54 -22
  141. package/dist/chunks/messages-l0nKmGOV.cjs +1 -0
  142. package/dist/chunks/messages-l7DqwqOu2.cjs +1 -0
  143. package/dist/{messages-wB8V2U2i2.mjs → chunks/messages-oLqnmqJf2.mjs} +38 -6
  144. package/dist/chunks/messages-sLVwrcar.cjs +1 -0
  145. package/dist/chunks/{messages-BoN_Bitl2.mjs → messages-yGQn67fw2.mjs} +48 -16
  146. package/dist/chunks/messages-zkunMjZf2.cjs +1 -0
  147. package/dist/chunks/{tools-ChneUeSu.mjs → tools-CM6aPuR4.mjs} +3542 -2301
  148. package/dist/chunks/tools-kfoXLTzY.cjs +208 -0
  149. package/dist/chunks/webm-muxer-CC98PYSV.cjs +5 -0
  150. package/dist/chunks/webm-muxer-CUUz719e.mjs +864 -0
  151. package/dist/full.cjs +1 -1
  152. package/dist/full.mjs +13 -13
  153. package/dist/locales.mjs +99 -67
  154. package/dist/{chunks/messages-DPV70Ys22.mjs → messages-1ZSVxDYN2.mjs} +42 -10
  155. package/dist/{messages-BY5WK3mB.mjs → messages-AK_9q2yu.mjs} +46 -14
  156. package/dist/{chunks/messages-BRN9bO60.mjs → messages-B0Gc0lBw.mjs} +37 -5
  157. package/dist/{messages-BTp7xsAK2.mjs → messages-B5THTOwb2.mjs} +45 -13
  158. package/dist/{messages-h1l_y01e.mjs → messages-B5xy5hCa.mjs} +43 -11
  159. package/dist/{messages-CSVzRRdj.mjs → messages-B6J8l1aF.mjs} +38 -6
  160. package/dist/{chunks/messages-R08pGvHm.mjs → messages-B7E1zFAv.mjs} +49 -17
  161. package/dist/{messages-D9CbvVgb.mjs → messages-B87GXoqt.mjs} +41 -9
  162. package/dist/{chunks/messages-D21eomvf.mjs → messages-B95smO_C.mjs} +41 -9
  163. package/dist/{messages-DO99T6qk2.mjs → messages-B9h-mKVO2.mjs} +57 -25
  164. package/dist/{chunks/messages-B9kHL94V.mjs → messages-BBb_hXxm.mjs} +43 -11
  165. package/dist/{messages-8wZYXCg7.mjs → messages-BDJfFuXR.mjs} +43 -11
  166. package/dist/{chunks/messages-DeK_vGCd2.mjs → messages-BH5AKf_i2.mjs} +53 -21
  167. package/dist/{chunks/messages-BrLLU_Dm.mjs → messages-BLslMhf-.mjs} +38 -6
  168. package/dist/{chunks/messages-C3qdarW42.mjs → messages-BPsdJnwT.mjs} +45 -13
  169. package/dist/{messages-CrcHeqGR.mjs → messages-BTrok9K8.mjs} +44 -12
  170. package/dist/{chunks/messages-D9MUpOtw2.mjs → messages-BctWdAZP2.mjs} +45 -13
  171. package/dist/{chunks/messages-DefTqLH32.mjs → messages-BhGHyHKC2.mjs} +53 -21
  172. package/dist/{messages-DA5IipN52.mjs → messages-BlInN8XP2.mjs} +48 -16
  173. package/dist/{chunks/messages-DPX9kFey.mjs → messages-Bn19MGza.mjs} +45 -13
  174. package/dist/{messages-CNzktVoM2.mjs → messages-BqFRlEJE2.mjs} +43 -11
  175. package/dist/{chunks/messages-DN6pprFJ2.mjs → messages-Bt5Sbl952.mjs} +66 -34
  176. package/dist/{chunks/messages-7bt8ujXQ.mjs → messages-Bumbqs6s.mjs} +37 -5
  177. package/dist/{chunks/messages-DcgNt1Bg2.mjs → messages-BvwVDbII.mjs} +40 -8
  178. package/dist/{chunks/messages-M1tLUpjT.mjs → messages-Bwese2OQ.mjs} +43 -11
  179. package/dist/{messages-DPiPd88g.mjs → messages-Bx5KWmyJ.mjs} +39 -7
  180. package/dist/{messages-BIRq0EVo.mjs → messages-ByntluqZ.mjs} +48 -16
  181. package/dist/{chunks/messages-JiQBxj4o2.mjs → messages-C-8BMvSp2.mjs} +42 -10
  182. package/dist/{messages-DGz70LLg2.mjs → messages-C-ytN6Dz2.mjs} +45 -13
  183. package/dist/{messages-Cu5AHbR-2.mjs → messages-C8QB980F2.mjs} +43 -11
  184. package/dist/{chunks/messages-BLtZ2DXE.mjs → messages-CCdDP2DE.mjs} +39 -7
  185. package/dist/{messages-CwavcZov.mjs → messages-CCgDqF-e.mjs} +47 -15
  186. package/dist/{messages-CN5mXtal2.mjs → messages-CLkbvdRh2.mjs} +49 -17
  187. package/dist/{messages-DlC9tgiV.mjs → messages-CQ6A0zI9.mjs} +93 -61
  188. package/dist/{chunks/messages-BakdNtus2.mjs → messages-CQnz6pXD2.mjs} +38 -6
  189. package/dist/{chunks/messages-R3IlcPVE2.mjs → messages-CQotju8u2.mjs} +41 -9
  190. package/dist/{chunks/messages-CHmoIrso.mjs → messages-CRL2ecWR.mjs} +37 -5
  191. package/dist/{chunks/messages-36KiD2Bx2.mjs → messages-CRhhyqEy2.mjs} +40 -8
  192. package/dist/{messages-BGfVV77O.mjs → messages-CSf1g9n_.mjs} +48 -16
  193. package/dist/{chunks/messages-C3ueCeDy.mjs → messages-CYuTyoK6.mjs} +54 -22
  194. package/dist/{messages-BUfHXzRi2.mjs → messages-Co2GV7rA2.mjs} +45 -13
  195. package/dist/{chunks/messages-Dk_PadZz.mjs → messages-CqtZ_gtb.mjs} +40 -8
  196. package/dist/{chunks/messages-CH_Aqn-k.mjs → messages-CxK_Vgra.mjs} +41 -9
  197. package/dist/{chunks/messages-VFdnkrDm2.mjs → messages-D08TSj5Q.mjs} +37 -5
  198. package/dist/{chunks/messages-8Qzw6Xju.mjs → messages-DFDw0nkI.mjs} +57 -25
  199. package/dist/{messages-DJRg4kFv2.mjs → messages-DKoeDmZV2.mjs} +45 -13
  200. package/dist/{chunks/messages-D33lcfdb.mjs → messages-DLKTwtBI.mjs} +43 -11
  201. package/dist/{messages-CMG59Rb62.mjs → messages-DQaDNQat2.mjs} +46 -14
  202. package/dist/{chunks/messages-Bh8al9kl.mjs → messages-DZlYqaxx.mjs} +58 -26
  203. package/dist/{chunks/messages-CnvK1Abd2.mjs → messages-D_ql7LL-2.mjs} +61 -29
  204. package/dist/{chunks/messages-CXzyyhBC.mjs → messages-Da09byG42.mjs} +41 -9
  205. package/dist/{chunks/messages-DN9_Nlre2.mjs → messages-DaKjx7Gh.mjs} +38 -6
  206. package/dist/{messages-Bgf1E-Vj.mjs → messages-Dc1aAz5V.mjs} +50 -18
  207. package/dist/{chunks/messages-t_RiQ_y02.mjs → messages-DlxBkSUv.mjs} +40 -8
  208. package/dist/{messages-CdLOD2b_2.mjs → messages-DoahmNMI2.mjs} +54 -22
  209. package/dist/{chunks/messages-hT-pjCQL.mjs → messages-DpbHfnge.mjs} +46 -14
  210. package/dist/{messages-DCqRZ9Pw.mjs → messages-DrjZz7u9.mjs} +41 -9
  211. package/dist/{chunks/messages-DiUTxAEQ.mjs → messages-DrwEVbKk2.mjs} +53 -21
  212. package/dist/{chunks/messages-3H-mU8nV.mjs → messages-DvIPbDsq.mjs} +44 -12
  213. package/dist/{chunks/messages-vQ8eiHPr2.mjs → messages-Dy3mYP_n.mjs} +37 -5
  214. package/dist/{chunks/messages-B2hS--KC.mjs → messages-STUXoPH72.mjs} +40 -8
  215. package/dist/{messages-BfFFrhbd.mjs → messages-Vfl9lWod.mjs} +44 -12
  216. package/dist/{messages-B-9u3fLG.mjs → messages-YPF71WjJ.mjs} +52 -20
  217. package/dist/{messages-CpqGtSQ9.mjs → messages-aPBlKHzr.mjs} +40 -8
  218. package/dist/{chunks/messages-BoGOF3jH.mjs → messages-bCZW7LiC.mjs} +48 -16
  219. package/dist/{chunks/messages-DqcQoY-I2.mjs → messages-kjO2WeG-2.mjs} +38 -6
  220. package/dist/{messages-DRdzJFUx2.mjs → messages-un7M6YZC2.mjs} +40 -8
  221. package/dist/react.cjs +1 -1
  222. package/dist/react.mjs +1 -1
  223. package/dist/tools.cjs +1 -1
  224. package/dist/tools.mjs +3 -3
  225. package/dist/vendor.LICENSE.txt +35 -0
  226. package/package.json +2 -1
  227. package/src/components/i18n/locales/am/messages.json +48 -17
  228. package/src/components/i18n/locales/ar/messages.json +38 -7
  229. package/src/components/i18n/locales/az/messages.json +47 -16
  230. package/src/components/i18n/locales/bg/messages.json +43 -12
  231. package/src/components/i18n/locales/bn/messages.json +53 -22
  232. package/src/components/i18n/locales/bs/messages.json +42 -11
  233. package/src/components/i18n/locales/cs/messages.json +45 -14
  234. package/src/components/i18n/locales/da/messages.json +42 -11
  235. package/src/components/i18n/locales/de/messages.json +44 -13
  236. package/src/components/i18n/locales/dv/messages.json +51 -20
  237. package/src/components/i18n/locales/el/messages.json +40 -9
  238. package/src/components/i18n/locales/en/messages.json +32 -0
  239. package/src/components/i18n/locales/es/messages.json +42 -11
  240. package/src/components/i18n/locales/et/messages.json +42 -11
  241. package/src/components/i18n/locales/fa/messages.json +40 -9
  242. package/src/components/i18n/locales/fi/messages.json +38 -7
  243. package/src/components/i18n/locales/fil/messages.json +45 -14
  244. package/src/components/i18n/locales/fr/messages.json +37 -6
  245. package/src/components/i18n/locales/gu/messages.json +40 -9
  246. package/src/components/i18n/locales/he/messages.json +43 -12
  247. package/src/components/i18n/locales/hi/messages.json +42 -11
  248. package/src/components/i18n/locales/hr/messages.json +49 -18
  249. package/src/components/i18n/locales/hu/messages.json +56 -25
  250. package/src/components/i18n/locales/hy/messages.json +43 -12
  251. package/src/components/i18n/locales/id/messages.json +47 -16
  252. package/src/components/i18n/locales/it/messages.json +36 -5
  253. package/src/components/i18n/locales/ja/messages.json +36 -5
  254. package/src/components/i18n/locales/ka/messages.json +39 -8
  255. package/src/components/i18n/locales/km/messages.json +46 -15
  256. package/src/components/i18n/locales/kn/messages.json +39 -8
  257. package/src/components/i18n/locales/ko/messages.json +39 -8
  258. package/src/components/i18n/locales/ku/messages.json +93 -62
  259. package/src/components/i18n/locales/lo/messages.json +37 -6
  260. package/src/components/i18n/locales/lt/messages.json +47 -16
  261. package/src/components/i18n/locales/lv/messages.json +36 -5
  262. package/src/components/i18n/locales/mk/messages.json +44 -13
  263. package/src/components/i18n/locales/ml/messages.json +36 -5
  264. package/src/components/i18n/locales/mn/messages.json +60 -29
  265. package/src/components/i18n/locales/mr/messages.json +40 -9
  266. package/src/components/i18n/locales/ms/messages.json +41 -10
  267. package/src/components/i18n/locales/my/messages.json +44 -13
  268. package/src/components/i18n/locales/ne/messages.json +44 -13
  269. package/src/components/i18n/locales/nl/messages.json +39 -8
  270. package/src/components/i18n/locales/no/messages.json +37 -6
  271. package/src/components/i18n/locales/pa/messages.json +65 -34
  272. package/src/components/i18n/locales/pl/messages.json +37 -6
  273. package/src/components/i18n/locales/ps/messages.json +52 -21
  274. package/src/components/i18n/locales/pt/messages.json +44 -13
  275. package/src/components/i18n/locales/ro/messages.json +44 -13
  276. package/src/components/i18n/locales/ru/messages.json +41 -10
  277. package/src/components/i18n/locales/sd/messages.json +52 -21
  278. package/src/components/i18n/locales/si/messages.json +47 -16
  279. package/src/components/i18n/locales/sk/messages.json +42 -11
  280. package/src/components/i18n/locales/sl/messages.json +44 -13
  281. package/src/components/i18n/locales/sq/messages.json +52 -21
  282. package/src/components/i18n/locales/sr/messages.json +56 -25
  283. package/src/components/i18n/locales/sv/messages.json +39 -8
  284. package/src/components/i18n/locales/sw/messages.json +48 -17
  285. package/src/components/i18n/locales/ta/messages.json +42 -11
  286. package/src/components/i18n/locales/te/messages.json +45 -14
  287. package/src/components/i18n/locales/th/messages.json +40 -9
  288. package/src/components/i18n/locales/tr/messages.json +39 -8
  289. package/src/components/i18n/locales/ug/messages.json +53 -22
  290. package/src/components/i18n/locales/uk/messages.json +40 -9
  291. package/src/components/i18n/locales/ur/messages.json +36 -5
  292. package/src/components/i18n/locales/vi/messages.json +37 -6
  293. package/src/components/i18n/locales/yi/messages.json +57 -26
  294. package/src/components/i18n/locales/zh/messages.json +39 -8
  295. package/src/components/icons/index.ts +106 -0
  296. package/src/components/modules/paste/handlers/pattern-handler.ts +4 -7
  297. package/src/components/utils/format-bytes.ts +15 -0
  298. package/src/components/utils/max-size.ts +36 -0
  299. package/src/components/utils/media-empty-state.ts +1 -11
  300. package/src/components/utils/upload-error-message.ts +43 -0
  301. package/src/styles/colors.css +31 -0
  302. package/src/styles/embed.css +4 -48
  303. package/src/styles/keyframes.css +8 -0
  304. package/src/styles/main.css +2 -0
  305. package/src/styles/resize-cue.css +26 -0
  306. package/src/styles/video.css +1221 -0
  307. package/src/tools/file/constants.ts +3 -0
  308. package/src/tools/file/index.ts +75 -4
  309. package/src/tools/file/uploader.ts +5 -2
  310. package/src/tools/image/constants.ts +1 -1
  311. package/src/tools/image/converted-uploader.ts +30 -0
  312. package/src/tools/image/gif-to-webm.ts +170 -0
  313. package/src/tools/image/index.ts +125 -3
  314. package/src/tools/image/resizer.ts +39 -6
  315. package/src/tools/image/uploader.ts +2 -1
  316. package/src/tools/image/uploading-state.ts +2 -1
  317. package/src/tools/index.ts +2 -0
  318. package/src/tools/link/embed/index.ts +61 -11
  319. package/src/tools/link/embed/overlay.ts +12 -95
  320. package/src/tools/table/index.ts +37 -1
  321. package/src/tools/table/table-cell-blocks.ts +65 -0
  322. package/src/tools/table/table-operations.ts +51 -2
  323. package/src/tools/table/table-row-col-action-handler.ts +25 -2
  324. package/src/tools/table/table-subsystems.ts +6 -1
  325. package/src/tools/video/constants.ts +22 -0
  326. package/src/tools/video/controls.ts +1448 -0
  327. package/src/tools/video/empty-state.ts +45 -0
  328. package/src/tools/video/i18n.ts +13 -0
  329. package/src/tools/video/index.ts +521 -0
  330. package/src/tools/video/ui.ts +83 -0
  331. package/src/tools/video/uploader.ts +75 -0
  332. package/types/configs/blok-config.d.ts +2 -9
  333. package/types/tools/file.d.ts +9 -3
  334. package/types/tools/image.d.ts +11 -2
  335. package/types/tools/max-size.d.ts +12 -0
  336. package/types/tools/video.d.ts +72 -0
  337. package/dist/chunks/constants-B1fDH6ZT.cjs +0 -539
  338. package/dist/chunks/messages--XZLcuUK.cjs +0 -1
  339. package/dist/chunks/messages-6adLi-J9.cjs +0 -1
  340. package/dist/chunks/messages-9xZnfk_-.cjs +0 -1
  341. package/dist/chunks/messages-B-7wgQm5.cjs +0 -1
  342. package/dist/chunks/messages-B4-kmmK72.cjs +0 -1
  343. package/dist/chunks/messages-BBh7sF4o.cjs +0 -1
  344. package/dist/chunks/messages-BIhN9JOT.cjs +0 -1
  345. package/dist/chunks/messages-BJU_3KpD.cjs +0 -1
  346. package/dist/chunks/messages-BNfoWRc02.cjs +0 -1
  347. package/dist/chunks/messages-BOrASwT4.cjs +0 -1
  348. package/dist/chunks/messages-BPWs2ZiL.cjs +0 -1
  349. package/dist/chunks/messages-BR6HUjXI.cjs +0 -1
  350. package/dist/chunks/messages-BWZYYHHF.cjs +0 -1
  351. package/dist/chunks/messages-BY3nxQWj.cjs +0 -1
  352. package/dist/chunks/messages-BYpAVGd12.cjs +0 -1
  353. package/dist/chunks/messages-BZzpf1UP.cjs +0 -1
  354. package/dist/chunks/messages-B_12_UjB.cjs +0 -1
  355. package/dist/chunks/messages-BaZ-Dtr92.cjs +0 -1
  356. package/dist/chunks/messages-BeaFn5UT.cjs +0 -1
  357. package/dist/chunks/messages-BgosUxKq2.cjs +0 -1
  358. package/dist/chunks/messages-BgrhLzFS.cjs +0 -1
  359. package/dist/chunks/messages-BmP5kV232.cjs +0 -1
  360. package/dist/chunks/messages-Bnp8vNJz.cjs +0 -1
  361. package/dist/chunks/messages-BpkV__T7.cjs +0 -1
  362. package/dist/chunks/messages-BqYqYBH02.cjs +0 -1
  363. package/dist/chunks/messages-Bv7MXv7R.cjs +0 -1
  364. package/dist/chunks/messages-Byi8D3Hp.cjs +0 -1
  365. package/dist/chunks/messages-C2tGk63O2.cjs +0 -1
  366. package/dist/chunks/messages-C8lWOU7O.cjs +0 -1
  367. package/dist/chunks/messages-C9Usx2VK.cjs +0 -1
  368. package/dist/chunks/messages-C9vxfOaB2.cjs +0 -1
  369. package/dist/chunks/messages-CBqID_rf2.cjs +0 -1
  370. package/dist/chunks/messages-CKaebA4N2.cjs +0 -1
  371. package/dist/chunks/messages-CNuuKnxY.cjs +0 -1
  372. package/dist/chunks/messages-CS1dVWiH2.cjs +0 -1
  373. package/dist/chunks/messages-CSHcjK_N2.cjs +0 -1
  374. package/dist/chunks/messages-CSWjZBVp2.cjs +0 -1
  375. package/dist/chunks/messages-CVi9dbMY2.cjs +0 -1
  376. package/dist/chunks/messages-CXkEnOpM2.cjs +0 -1
  377. package/dist/chunks/messages-Ch4PcGQ42.cjs +0 -1
  378. package/dist/chunks/messages-Cj12Zgsk.cjs +0 -1
  379. package/dist/chunks/messages-CjFn_dGR2.cjs +0 -1
  380. package/dist/chunks/messages-CnFZ_js2.cjs +0 -1
  381. package/dist/chunks/messages-CstdYlPl.cjs +0 -1
  382. package/dist/chunks/messages-CzEXG3wA2.cjs +0 -1
  383. package/dist/chunks/messages-CzW0fnvJ2.cjs +0 -1
  384. package/dist/chunks/messages-D2BWvpXy.cjs +0 -1
  385. package/dist/chunks/messages-D2jPVYje2.cjs +0 -1
  386. package/dist/chunks/messages-D8DMxR-v2.cjs +0 -1
  387. package/dist/chunks/messages-DAF4iFuz.cjs +0 -1
  388. package/dist/chunks/messages-DJpBxc3X.cjs +0 -1
  389. package/dist/chunks/messages-DJqLD3KO.cjs +0 -1
  390. package/dist/chunks/messages-DSFJ_vqv.cjs +0 -1
  391. package/dist/chunks/messages-DW0CLNsD.cjs +0 -1
  392. package/dist/chunks/messages-DZFhIff62.cjs +0 -1
  393. package/dist/chunks/messages-Dd56p0Kf.cjs +0 -1
  394. package/dist/chunks/messages-DigHfTmz.cjs +0 -1
  395. package/dist/chunks/messages-DkuidYgG.cjs +0 -1
  396. package/dist/chunks/messages-DoZqsswJ.cjs +0 -1
  397. package/dist/chunks/messages-DvmpvSeR.cjs +0 -1
  398. package/dist/chunks/messages-Dvurigo8.cjs +0 -1
  399. package/dist/chunks/messages-Dx16KgRk2.cjs +0 -1
  400. package/dist/chunks/messages-EjezcPS22.cjs +0 -1
  401. package/dist/chunks/messages-EsgioDiN.cjs +0 -1
  402. package/dist/chunks/messages-cDH-bKpE.cjs +0 -1
  403. package/dist/chunks/messages-lhqD_WQA.cjs +0 -1
  404. package/dist/chunks/messages-xndoTJ282.cjs +0 -1
  405. package/dist/chunks/tools-I_BZLnbG.cjs +0 -208
  406. /package/dist/chunks/{am-B37aLxvu.cjs → am-BA02TqF9.cjs} +0 -0
  407. /package/dist/chunks/{am-D7yfVqJS.mjs → am-C9_6r8HY.mjs} +0 -0
  408. /package/dist/chunks/{ar-D00SixXA.mjs → ar-BM96nSXF.mjs} +0 -0
  409. /package/dist/chunks/{ar-ySo_KDqd.cjs → ar-CB4IsGCa.cjs} +0 -0
  410. /package/dist/chunks/{az-BmIwKcoq.mjs → az-DnZSY5ok.mjs} +0 -0
  411. /package/dist/chunks/{az-nCoWuGBd.cjs → az-FykE_aDi.cjs} +0 -0
  412. /package/dist/chunks/{bg-BTZaB21W.mjs → bg-BplUvPeX.mjs} +0 -0
  413. /package/dist/chunks/{bg-BKB8_J3v.cjs → bg-D6r90gqH.cjs} +0 -0
  414. /package/dist/chunks/{bn-BQiBKtpR.cjs → bn-B7w2dbK4.cjs} +0 -0
  415. /package/dist/chunks/{bn-BVpf0XL6.mjs → bn-CdP9lnfr.mjs} +0 -0
  416. /package/dist/chunks/{bs-BSz4cPth.mjs → bs-BtX-qLsk.mjs} +0 -0
  417. /package/dist/chunks/{bs-D_lekdEb.cjs → bs-DztHHorM.cjs} +0 -0
  418. /package/dist/chunks/{cs-Dv8Jg_Fa.cjs → cs-CLMsCdIt.cjs} +0 -0
  419. /package/dist/chunks/{cs-p5s4GudH.mjs → cs-NcDYS-aU.mjs} +0 -0
  420. /package/dist/chunks/{da-BqJa8BMd.mjs → da-ANg6gK3-.mjs} +0 -0
  421. /package/dist/chunks/{da-D33rjz-t.cjs → da-sJ7EsHcO.cjs} +0 -0
  422. /package/dist/chunks/{de-BDDktkfI.mjs → de-CTxvRxuE.mjs} +0 -0
  423. /package/dist/chunks/{de-I8YFq0Ej.cjs → de-CxMqLKhy.cjs} +0 -0
  424. /package/dist/chunks/{el-BInM0nQo.cjs → el-Bg6QXLt5.cjs} +0 -0
  425. /package/dist/chunks/{el-R63G08P0.mjs → el-CgOoJaXB.mjs} +0 -0
  426. /package/dist/chunks/{es-Cj_AHhb9.cjs → es-7zUbslPJ.cjs} +0 -0
  427. /package/dist/chunks/{es-BleH_dHg.mjs → es-D5YDFRu-.mjs} +0 -0
  428. /package/dist/chunks/{et-BuISCVFl.mjs → et-57a7ees8.mjs} +0 -0
  429. /package/dist/chunks/{et-BkMzN_qG.cjs → et-D_rhRdDD.cjs} +0 -0
  430. /package/dist/chunks/{fa-CI9f3My0.mjs → fa-Dp_BXnBP.mjs} +0 -0
  431. /package/dist/chunks/{fa-C3VQIfEJ.cjs → fa-JBr2zsfI.cjs} +0 -0
  432. /package/dist/chunks/{fi-p8xxtchQ.cjs → fi-DjbYN6MA.cjs} +0 -0
  433. /package/dist/chunks/{fi-C0_Jyps9.mjs → fi-at45xjOS.mjs} +0 -0
  434. /package/dist/chunks/{fil-BZsJ4YZG.mjs → fil-D_HT2vGt.mjs} +0 -0
  435. /package/dist/chunks/{fil-DC8VTmfd.cjs → fil-dcVBIQoi.cjs} +0 -0
  436. /package/dist/chunks/{fr-BjeioA2N.mjs → fr-ByR9PLTE.mjs} +0 -0
  437. /package/dist/chunks/{fr-Cbstr5ii.cjs → fr-Ch4zj1rM.cjs} +0 -0
  438. /package/dist/chunks/{gu-DpPoUPem.cjs → gu-CoLW5Saq.cjs} +0 -0
  439. /package/dist/chunks/{gu-CNi9WnhQ.mjs → gu-CvfPvH3Y.mjs} +0 -0
  440. /package/dist/chunks/{he-Rlv-PVKK.cjs → he-2wS2DK0D.cjs} +0 -0
  441. /package/dist/chunks/{he-bU_Id5XQ.mjs → he-Bmqypvkq.mjs} +0 -0
  442. /package/dist/chunks/{hi-CYYjJgoQ.mjs → hi-DbcN0x64.mjs} +0 -0
  443. /package/dist/chunks/{hi-CfLaLKZL.cjs → hi-f4gshON3.cjs} +0 -0
  444. /package/dist/chunks/{hr-CerKCstu.mjs → hr-D5mydeyn.mjs} +0 -0
  445. /package/dist/chunks/{hr-B6eFd_4M.cjs → hr-DMExeWwd.cjs} +0 -0
  446. /package/dist/chunks/{hu-DQcisouf.cjs → hu-COmlHkse.cjs} +0 -0
  447. /package/dist/chunks/{hu-DNYoHMic.mjs → hu-DVCPn8un.mjs} +0 -0
  448. /package/dist/chunks/{hy-x9QOWTT6.cjs → hy-BoBSSiJc.cjs} +0 -0
  449. /package/dist/chunks/{hy-N0XBqVv_.mjs → hy-CP6oqcK_.mjs} +0 -0
  450. /package/dist/chunks/{id-dmUIQB07.mjs → id-COwan-Bb.mjs} +0 -0
  451. /package/dist/chunks/{id-G7ASv812.cjs → id-Dk2AQ6-R.cjs} +0 -0
  452. /package/dist/chunks/{it-DXDwm7Aj.cjs → it-BCmU3zOg.cjs} +0 -0
  453. /package/dist/chunks/{it-G9Rg2LaN.mjs → it-DJqN-zLs.mjs} +0 -0
  454. /package/dist/chunks/{ja-C1Nou_k5.mjs → ja-CvoLNAXS.mjs} +0 -0
  455. /package/dist/chunks/{ja-DHMurrnk.cjs → ja-DcMqJvnV.cjs} +0 -0
  456. /package/dist/chunks/{ka-P0_q1_oW.cjs → ka-BdyjQFkv.cjs} +0 -0
  457. /package/dist/chunks/{ka-9rtmTdhq.mjs → ka-BsqbDXqr.mjs} +0 -0
  458. /package/dist/chunks/{km-DedsOdPY.cjs → km-BShH0mB9.cjs} +0 -0
  459. /package/dist/chunks/{km-T8J0lGcC.mjs → km-C9FxSKv0.mjs} +0 -0
  460. /package/dist/chunks/{kn-CMb5Cv2d.mjs → kn-BKTm-E-A.mjs} +0 -0
  461. /package/dist/chunks/{kn-CAGP6H3x.cjs → kn-bNx6e6NK.cjs} +0 -0
  462. /package/dist/chunks/{ko-DulVmkjC.mjs → ko-BLEDr4t_.mjs} +0 -0
  463. /package/dist/chunks/{ko-3D0kPtnu.cjs → ko-LmGjEODJ.cjs} +0 -0
  464. /package/dist/chunks/{ku-BYzD3GnU.cjs → ku-BekLwcHQ.cjs} +0 -0
  465. /package/dist/chunks/{ku-C5mlSVfC.mjs → ku-DGpIv9vX.mjs} +0 -0
  466. /package/dist/chunks/{lo-Cw2hfj84.mjs → lo-C3wsS73b.mjs} +0 -0
  467. /package/dist/chunks/{lo-D9ixPNJD.cjs → lo-YgZPFD63.cjs} +0 -0
  468. /package/dist/chunks/{lt-CzfEJdVd.cjs → lt-CIvBJk2h.cjs} +0 -0
  469. /package/dist/chunks/{lt-Ceg9NAdI.mjs → lt-DWWjfR4Z.mjs} +0 -0
  470. /package/dist/chunks/{lv-DWyBbTHI.cjs → lv-B6Djmvjl.cjs} +0 -0
  471. /package/dist/chunks/{lv-3CXzQoic.mjs → lv-D4nb-9oK.mjs} +0 -0
  472. /package/dist/chunks/{mk-CEbNT0Oe.mjs → mk-BPUvDORf.mjs} +0 -0
  473. /package/dist/chunks/{mk-Anl5AUSU.cjs → mk-Ck56Emvp.cjs} +0 -0
  474. /package/dist/chunks/{ml-B1QmnbTX.cjs → ml-DsibsgSA.cjs} +0 -0
  475. /package/dist/chunks/{ml-DaF_zn1h.mjs → ml-qo0n1JHs.mjs} +0 -0
  476. /package/dist/chunks/{mn-DLpgZmIl.mjs → mn-BAQnLAOv.mjs} +0 -0
  477. /package/dist/chunks/{mn-DM3AWPQI.cjs → mn-Db0fVNYE.cjs} +0 -0
  478. /package/dist/chunks/{mr-CPCMiBsx.cjs → mr-BTz5VL4u.cjs} +0 -0
  479. /package/dist/chunks/{mr-C-d3CWSD.mjs → mr-CFEPrQYy.mjs} +0 -0
  480. /package/dist/chunks/{ms-D3Zil5Dz.mjs → ms-C9p2_6EB.mjs} +0 -0
  481. /package/dist/chunks/{ms-BKg5zJ6g.cjs → ms-ItzWfmiu.cjs} +0 -0
  482. /package/dist/chunks/{my-HzQdQq6H.mjs → my-BQhcHK_d.mjs} +0 -0
  483. /package/dist/chunks/{my-BhrbZPAE.cjs → my-Bq1EPoFX.cjs} +0 -0
  484. /package/dist/chunks/{ne-Dw6kUPkS.mjs → ne-Cf4GpHyI.mjs} +0 -0
  485. /package/dist/chunks/{ne-BsEUv3Vp.cjs → ne-Mog3kAWt.cjs} +0 -0
  486. /package/dist/chunks/{nl-D8QQ6wmJ.mjs → nl-7DE7AKK5.mjs} +0 -0
  487. /package/dist/chunks/{nl-C1jFx32v.cjs → nl-Do9Y1u3F.cjs} +0 -0
  488. /package/dist/chunks/{no-BWEOGeAo.cjs → no-DNuo9wW6.cjs} +0 -0
  489. /package/dist/chunks/{no-Rg2uuKdV.mjs → no-J4jj2fW7.mjs} +0 -0
  490. /package/dist/chunks/{notifier-CEnelp-K.mjs → notifier-BDNwSr07.mjs} +0 -0
  491. /package/dist/chunks/{notifier-BOB8o7IG.cjs → notifier-BW5H3Ctc.cjs} +0 -0
  492. /package/dist/chunks/{pa-BitCteAA.cjs → pa-BVCDv2EV.cjs} +0 -0
  493. /package/dist/chunks/{pa-BSwIZvA0.mjs → pa-DMuUOUxa.mjs} +0 -0
  494. /package/dist/chunks/{pl-CbCrHaA6.cjs → pl-Ct8v4d8V.cjs} +0 -0
  495. /package/dist/chunks/{pl-FhXomIGp.mjs → pl-DIZm5XzV.mjs} +0 -0
  496. /package/dist/chunks/{ps-4sPZuv3g.cjs → ps-DT4DAHOy.cjs} +0 -0
  497. /package/dist/chunks/{ps-BoBtbrB6.mjs → ps-X3--6pS3.mjs} +0 -0
  498. /package/dist/chunks/{pt-BYA5NOw_.mjs → pt-BMT2BIpj.mjs} +0 -0
  499. /package/dist/chunks/{pt-CSzjho-V.cjs → pt-Dwe6Dinw.cjs} +0 -0
  500. /package/dist/chunks/{ro-C9tN3AFF.cjs → ro-CoHEUo3b.cjs} +0 -0
  501. /package/dist/chunks/{ro-mtobtMpD.mjs → ro-Ndh2J4Fv.mjs} +0 -0
  502. /package/dist/chunks/{ru-B791LPq3.mjs → ru-DEoON4H0.mjs} +0 -0
  503. /package/dist/chunks/{ru-BYPO5wNO.cjs → ru-Pmgo28Kt.cjs} +0 -0
  504. /package/dist/chunks/{sd-C8ngG92I.mjs → sd-B46KwBlt.mjs} +0 -0
  505. /package/dist/chunks/{sd-BWuglgs_.cjs → sd-DxSmw84d.cjs} +0 -0
  506. /package/dist/chunks/{si-C_q8DxVt.mjs → si-CEX6-_X4.mjs} +0 -0
  507. /package/dist/chunks/{si-IX2P_DGB.cjs → si-attpuQg-.cjs} +0 -0
  508. /package/dist/chunks/{sk-HJJlM9uq.mjs → sk-Crsvi9aQ.mjs} +0 -0
  509. /package/dist/chunks/{sk-CxtyIOlr.cjs → sk-CvkpO0ti.cjs} +0 -0
  510. /package/dist/chunks/{sl-CPjYG80u.cjs → sl-BT19lhkA.cjs} +0 -0
  511. /package/dist/chunks/{sl-kB1f5rPn.mjs → sl-Cqe1IKhE.mjs} +0 -0
  512. /package/dist/chunks/{sq-CD0W0D6z.mjs → sq-BOQb1hx9.mjs} +0 -0
  513. /package/dist/chunks/{sq-Do6UyHn9.cjs → sq-rY2-arjV.cjs} +0 -0
  514. /package/dist/chunks/{sr-lLJu9TsT.mjs → sr-WVqhi-MV.mjs} +0 -0
  515. /package/dist/chunks/{sr-BcyT-MWS.cjs → sr-jnkxoHkR.cjs} +0 -0
  516. /package/dist/chunks/{sv-Bsz7ersx.cjs → sv-BiWSYdw7.cjs} +0 -0
  517. /package/dist/chunks/{sv-C3GL-a0k.mjs → sv-cjssSK3x.mjs} +0 -0
  518. /package/dist/chunks/{sw-D6-DZ14-.mjs → sw-BNNAgQNn.mjs} +0 -0
  519. /package/dist/chunks/{sw-CUElHZxL.cjs → sw-DFyk62c4.cjs} +0 -0
  520. /package/dist/chunks/{ta-D0DQba-y.cjs → ta-DowDx1bh.cjs} +0 -0
  521. /package/dist/chunks/{ta-BZy78kBk.mjs → ta-jg4mBsL9.mjs} +0 -0
  522. /package/dist/chunks/{te-vigCVKdg.mjs → te-BiLupA2T.mjs} +0 -0
  523. /package/dist/chunks/{te-DPMvJyXg.cjs → te-G0buJU1V.cjs} +0 -0
  524. /package/dist/chunks/{th-DtcrIt9J.cjs → th-DsjA6OWh.cjs} +0 -0
  525. /package/dist/chunks/{th-CGc0RLWB.mjs → th-Dtb_u833.mjs} +0 -0
  526. /package/dist/chunks/{tr-Cgkf5aJo.mjs → tr-01MbT9-l.mjs} +0 -0
  527. /package/dist/chunks/{tr-BrEFaVNA.cjs → tr-DN1xdxQn.cjs} +0 -0
  528. /package/dist/chunks/{ug-BVK7qBs4.mjs → ug-BFlA2VRZ.mjs} +0 -0
  529. /package/dist/chunks/{ug-CqZXfhXi.cjs → ug-DEJ9cNGH.cjs} +0 -0
  530. /package/dist/chunks/{uk-DgReWEge.cjs → uk-Bv6aB1Nd.cjs} +0 -0
  531. /package/dist/chunks/{uk-CSPaCalw.mjs → uk-DY7rBPyo.mjs} +0 -0
  532. /package/dist/chunks/{ur-ByrwJnY1.cjs → ur-C3CFfx9s.cjs} +0 -0
  533. /package/dist/chunks/{ur-VpFFsATs.mjs → ur-DHfULZeF.mjs} +0 -0
  534. /package/dist/chunks/{vi-CWQtvATS.mjs → vi-BFuaq2Tk.mjs} +0 -0
  535. /package/dist/chunks/{vi-lUD3w7gP.cjs → vi-DQrrRkmq.cjs} +0 -0
  536. /package/dist/chunks/{zh-fSp1qOne.cjs → zh-5rdSdLkR.cjs} +0 -0
  537. /package/dist/chunks/{zh-akJj2cdF.mjs → zh-BGpl7x7W.mjs} +0 -0
@@ -5,6 +5,7 @@ import { tr } from './i18n';
5
5
  export interface UploadingStateOptions {
6
6
  fileName: string;
7
7
  sizeLabel?: string;
8
+ statusLabel?: string;
8
9
  onCancel?(): void;
9
10
  i18n?: I18nInstance;
10
11
  }
@@ -33,7 +34,7 @@ export function renderUploadingState(opts: UploadingStateOptions): UploadingStat
33
34
 
34
35
  const label = document.createElement('span');
35
36
  label.className = 'blok-image-uploading__label';
36
- label.textContent = tr(opts.i18n, 'tools.image.uploadingLabel');
37
+ label.textContent = opts.statusLabel ?? tr(opts.i18n, 'tools.image.uploadingLabel');
37
38
 
38
39
  const name = document.createElement('span');
39
40
  name.className = 'blok-image-uploading__filename';
@@ -33,6 +33,7 @@ export { Quote } from './quote';
33
33
  export { CodeTool as Code } from './code';
34
34
  export { ImageTool as Image } from './image';
35
35
  export { FileTool as File } from './file';
36
+ export { VideoTool as Video } from './video';
36
37
  export { ColumnList } from './column-list';
37
38
  export { Column } from './column';
38
39
  export { Columns } from './columns';
@@ -65,6 +66,7 @@ export const defaultBlockTools = {
65
66
  code: { inlineToolbar: false },
66
67
  image: {},
67
68
  file: {},
69
+ video: {},
68
70
  column_list: {},
69
71
  column: {},
70
72
  embed: {},
@@ -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
 
@@ -0,0 +1,22 @@
1
+ export const DEFAULT_MIME_TYPES = [
2
+ 'video/mp4',
3
+ 'video/webm',
4
+ 'video/ogg',
5
+ ] as const;
6
+
7
+ export const DEFAULT_MAX_SIZE = 100 * 1024 * 1024; // 100 MiB
8
+
9
+ export const DEFAULT_CAPTION_PLACEHOLDER = 'Write a caption…';
10
+
11
+ export const MIN_WIDTH_PERCENT = 10;
12
+ export const MAX_WIDTH_PERCENT = 100;
13
+
14
+ /**
15
+ * Hard floor for the player's pixel width. Below this the inline controls
16
+ * (volume slider, timecode, scrubber, view-mode buttons) crush together, so the
17
+ * resize handle clamps here instead of the global 10% percent floor.
18
+ */
19
+ export const MIN_WIDTH_PX = 440;
20
+
21
+ /** Direct links to a playable video file. */
22
+ export const URL_PATTERN = /^https?:\/\/\S+\.(mp4|webm|ogg|mov|m4v)(\?\S*)?$/i;