velo-text 1.0.0-beta.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 (490) hide show
  1. package/CHANGELOG.md +70 -0
  2. package/LICENSE +21 -0
  3. package/README.md +122 -0
  4. package/dist/adapters/backend/index.d.ts +4 -0
  5. package/dist/adapters/backend/index.d.ts.map +1 -0
  6. package/dist/adapters/backend/index.js +3 -0
  7. package/dist/adapters/backend/index.js.map +1 -0
  8. package/dist/adapters/backend/pdf-http.d.ts +48 -0
  9. package/dist/adapters/backend/pdf-http.d.ts.map +1 -0
  10. package/dist/adapters/backend/pdf-http.js +117 -0
  11. package/dist/adapters/backend/pdf-http.js.map +1 -0
  12. package/dist/adapters/backend/sinks.d.ts +7 -0
  13. package/dist/adapters/backend/sinks.d.ts.map +1 -0
  14. package/dist/adapters/backend/sinks.js +43 -0
  15. package/dist/adapters/backend/sinks.js.map +1 -0
  16. package/dist/adapters/browser/index.d.ts +11 -0
  17. package/dist/adapters/browser/index.d.ts.map +1 -0
  18. package/dist/adapters/browser/index.js +51 -0
  19. package/dist/adapters/browser/index.js.map +1 -0
  20. package/dist/adapters/postgres-contract/index.d.ts +45 -0
  21. package/dist/adapters/postgres-contract/index.d.ts.map +1 -0
  22. package/dist/adapters/postgres-contract/index.js +108 -0
  23. package/dist/adapters/postgres-contract/index.js.map +1 -0
  24. package/dist/adapters/s3-compatible/index.d.ts +46 -0
  25. package/dist/adapters/s3-compatible/index.d.ts.map +1 -0
  26. package/dist/adapters/s3-compatible/index.js +106 -0
  27. package/dist/adapters/s3-compatible/index.js.map +1 -0
  28. package/dist/adapters/vanilla.d.ts +5 -0
  29. package/dist/adapters/vanilla.d.ts.map +1 -0
  30. package/dist/adapters/vanilla.js +6 -0
  31. package/dist/adapters/vanilla.js.map +1 -0
  32. package/dist/assets/dimensions/index.d.ts +12 -0
  33. package/dist/assets/dimensions/index.d.ts.map +1 -0
  34. package/dist/assets/dimensions/index.js +46 -0
  35. package/dist/assets/dimensions/index.js.map +1 -0
  36. package/dist/assets/hashing/index.d.ts +7 -0
  37. package/dist/assets/hashing/index.d.ts.map +1 -0
  38. package/dist/assets/hashing/index.js +21 -0
  39. package/dist/assets/hashing/index.js.map +1 -0
  40. package/dist/assets/icons/index.d.ts +25 -0
  41. package/dist/assets/icons/index.d.ts.map +1 -0
  42. package/dist/assets/icons/index.js +107 -0
  43. package/dist/assets/icons/index.js.map +1 -0
  44. package/dist/assets/png/placeholder.d.ts +4 -0
  45. package/dist/assets/png/placeholder.d.ts.map +1 -0
  46. package/dist/assets/png/placeholder.js +13 -0
  47. package/dist/assets/png/placeholder.js.map +1 -0
  48. package/dist/assets/sniff/index.d.ts +13 -0
  49. package/dist/assets/sniff/index.d.ts.map +1 -0
  50. package/dist/assets/sniff/index.js +41 -0
  51. package/dist/assets/sniff/index.js.map +1 -0
  52. package/dist/assets/store/index.d.ts +56 -0
  53. package/dist/assets/store/index.d.ts.map +1 -0
  54. package/dist/assets/store/index.js +102 -0
  55. package/dist/assets/store/index.js.map +1 -0
  56. package/dist/assets/svg/index.d.ts +7 -0
  57. package/dist/assets/svg/index.d.ts.map +1 -0
  58. package/dist/assets/svg/index.js +82 -0
  59. package/dist/assets/svg/index.js.map +1 -0
  60. package/dist/core/equation/html.d.ts +3 -0
  61. package/dist/core/equation/html.d.ts.map +1 -0
  62. package/dist/core/equation/html.js +138 -0
  63. package/dist/core/equation/html.js.map +1 -0
  64. package/dist/core/equation/index.d.ts +19 -0
  65. package/dist/core/equation/index.d.ts.map +1 -0
  66. package/dist/core/equation/index.js +107 -0
  67. package/dist/core/equation/index.js.map +1 -0
  68. package/dist/core/events/index.d.ts +13 -0
  69. package/dist/core/events/index.d.ts.map +1 -0
  70. package/dist/core/events/index.js +18 -0
  71. package/dist/core/events/index.js.map +1 -0
  72. package/dist/core/history/history.d.ts +29 -0
  73. package/dist/core/history/history.d.ts.map +1 -0
  74. package/dist/core/history/history.js +55 -0
  75. package/dist/core/history/history.js.map +1 -0
  76. package/dist/core/history/index.d.ts +2 -0
  77. package/dist/core/history/index.d.ts.map +1 -0
  78. package/dist/core/history/index.js +2 -0
  79. package/dist/core/history/index.js.map +1 -0
  80. package/dist/core/model/block.d.ts +121 -0
  81. package/dist/core/model/block.d.ts.map +1 -0
  82. package/dist/core/model/block.js +2 -0
  83. package/dist/core/model/block.js.map +1 -0
  84. package/dist/core/model/document.d.ts +70 -0
  85. package/dist/core/model/document.d.ts.map +1 -0
  86. package/dist/core/model/document.js +2 -0
  87. package/dist/core/model/document.js.map +1 -0
  88. package/dist/core/model/factories.d.ts +35 -0
  89. package/dist/core/model/factories.d.ts.map +1 -0
  90. package/dist/core/model/factories.js +115 -0
  91. package/dist/core/model/factories.js.map +1 -0
  92. package/dist/core/model/index.d.ts +4 -0
  93. package/dist/core/model/index.d.ts.map +1 -0
  94. package/dist/core/model/index.js +4 -0
  95. package/dist/core/model/index.js.map +1 -0
  96. package/dist/core/model/inline.d.ts +43 -0
  97. package/dist/core/model/inline.d.ts.map +1 -0
  98. package/dist/core/model/inline.js +2 -0
  99. package/dist/core/model/inline.js.map +1 -0
  100. package/dist/core/model/primitives.d.ts +36 -0
  101. package/dist/core/model/primitives.d.ts.map +1 -0
  102. package/dist/core/model/primitives.js +3 -0
  103. package/dist/core/model/primitives.js.map +1 -0
  104. package/dist/core/model/table-look.d.ts +12 -0
  105. package/dist/core/model/table-look.d.ts.map +1 -0
  106. package/dist/core/model/table-look.js +99 -0
  107. package/dist/core/model/table-look.js.map +1 -0
  108. package/dist/core/model/types.d.ts +5 -0
  109. package/dist/core/model/types.d.ts.map +1 -0
  110. package/dist/core/model/types.js +5 -0
  111. package/dist/core/model/types.js.map +1 -0
  112. package/dist/core/normalize/index.d.ts +2 -0
  113. package/dist/core/normalize/index.d.ts.map +1 -0
  114. package/dist/core/normalize/index.js +2 -0
  115. package/dist/core/normalize/index.js.map +1 -0
  116. package/dist/core/normalize/normalize.d.ts +8 -0
  117. package/dist/core/normalize/normalize.d.ts.map +1 -0
  118. package/dist/core/normalize/normalize.js +145 -0
  119. package/dist/core/normalize/normalize.js.map +1 -0
  120. package/dist/core/operations/index.d.ts +2 -0
  121. package/dist/core/operations/index.d.ts.map +1 -0
  122. package/dist/core/operations/index.js +2 -0
  123. package/dist/core/operations/index.js.map +1 -0
  124. package/dist/core/operations/operations.d.ts +53 -0
  125. package/dist/core/operations/operations.d.ts.map +1 -0
  126. package/dist/core/operations/operations.js +92 -0
  127. package/dist/core/operations/operations.js.map +1 -0
  128. package/dist/core/plugin/index.d.ts +84 -0
  129. package/dist/core/plugin/index.d.ts.map +1 -0
  130. package/dist/core/plugin/index.js +137 -0
  131. package/dist/core/plugin/index.js.map +1 -0
  132. package/dist/core/schema/canonical.d.ts +6 -0
  133. package/dist/core/schema/canonical.d.ts.map +1 -0
  134. package/dist/core/schema/canonical.js +42 -0
  135. package/dist/core/schema/canonical.js.map +1 -0
  136. package/dist/core/schema/index.d.ts +3 -0
  137. package/dist/core/schema/index.d.ts.map +1 -0
  138. package/dist/core/schema/index.js +3 -0
  139. package/dist/core/schema/index.js.map +1 -0
  140. package/dist/core/schema/validator.d.ts +23 -0
  141. package/dist/core/schema/validator.d.ts.map +1 -0
  142. package/dist/core/schema/validator.js +276 -0
  143. package/dist/core/schema/validator.js.map +1 -0
  144. package/dist/core/selection/index.d.ts +2 -0
  145. package/dist/core/selection/index.d.ts.map +1 -0
  146. package/dist/core/selection/index.js +2 -0
  147. package/dist/core/selection/index.js.map +1 -0
  148. package/dist/core/selection/selection.d.ts +12 -0
  149. package/dist/core/selection/selection.d.ts.map +1 -0
  150. package/dist/core/selection/selection.js +38 -0
  151. package/dist/core/selection/selection.js.map +1 -0
  152. package/dist/editor-web/accessibility/index.d.ts +40 -0
  153. package/dist/editor-web/accessibility/index.d.ts.map +1 -0
  154. package/dist/editor-web/accessibility/index.js +170 -0
  155. package/dist/editor-web/accessibility/index.js.map +1 -0
  156. package/dist/editor-web/clipboard/index.d.ts +52 -0
  157. package/dist/editor-web/clipboard/index.d.ts.map +1 -0
  158. package/dist/editor-web/clipboard/index.js +154 -0
  159. package/dist/editor-web/clipboard/index.js.map +1 -0
  160. package/dist/editor-web/controller/column-presets.d.ts +9 -0
  161. package/dist/editor-web/controller/column-presets.d.ts.map +1 -0
  162. package/dist/editor-web/controller/column-presets.js +11 -0
  163. package/dist/editor-web/controller/column-presets.js.map +1 -0
  164. package/dist/editor-web/controller/column-resize.d.ts +6 -0
  165. package/dist/editor-web/controller/column-resize.d.ts.map +1 -0
  166. package/dist/editor-web/controller/column-resize.js +119 -0
  167. package/dist/editor-web/controller/column-resize.js.map +1 -0
  168. package/dist/editor-web/controller/columns-ui.d.ts +5 -0
  169. package/dist/editor-web/controller/columns-ui.d.ts.map +1 -0
  170. package/dist/editor-web/controller/columns-ui.js +107 -0
  171. package/dist/editor-web/controller/columns-ui.js.map +1 -0
  172. package/dist/editor-web/controller/commands.d.ts +27 -0
  173. package/dist/editor-web/controller/commands.d.ts.map +1 -0
  174. package/dist/editor-web/controller/commands.js +198 -0
  175. package/dist/editor-web/controller/commands.js.map +1 -0
  176. package/dist/editor-web/controller/format-commands.d.ts +12 -0
  177. package/dist/editor-web/controller/format-commands.d.ts.map +1 -0
  178. package/dist/editor-web/controller/format-commands.js +77 -0
  179. package/dist/editor-web/controller/format-commands.js.map +1 -0
  180. package/dist/editor-web/controller/handles.d.ts +7 -0
  181. package/dist/editor-web/controller/handles.d.ts.map +1 -0
  182. package/dist/editor-web/controller/handles.js +205 -0
  183. package/dist/editor-web/controller/handles.js.map +1 -0
  184. package/dist/editor-web/controller/host.d.ts +8 -0
  185. package/dist/editor-web/controller/host.d.ts.map +1 -0
  186. package/dist/editor-web/controller/host.js +48 -0
  187. package/dist/editor-web/controller/host.js.map +1 -0
  188. package/dist/editor-web/controller/image-resize.d.ts +9 -0
  189. package/dist/editor-web/controller/image-resize.d.ts.map +1 -0
  190. package/dist/editor-web/controller/image-resize.js +163 -0
  191. package/dist/editor-web/controller/image-resize.js.map +1 -0
  192. package/dist/editor-web/controller/index.d.ts +6 -0
  193. package/dist/editor-web/controller/index.d.ts.map +1 -0
  194. package/dist/editor-web/controller/index.js +190 -0
  195. package/dist/editor-web/controller/index.js.map +1 -0
  196. package/dist/editor-web/controller/nesting.d.ts +27 -0
  197. package/dist/editor-web/controller/nesting.d.ts.map +1 -0
  198. package/dist/editor-web/controller/nesting.js +218 -0
  199. package/dist/editor-web/controller/nesting.js.map +1 -0
  200. package/dist/editor-web/controller/place-overlay.d.ts +6 -0
  201. package/dist/editor-web/controller/place-overlay.d.ts.map +1 -0
  202. package/dist/editor-web/controller/place-overlay.js +55 -0
  203. package/dist/editor-web/controller/place-overlay.js.map +1 -0
  204. package/dist/editor-web/controller/size-picker.d.ts +28 -0
  205. package/dist/editor-web/controller/size-picker.d.ts.map +1 -0
  206. package/dist/editor-web/controller/size-picker.js +177 -0
  207. package/dist/editor-web/controller/size-picker.js.map +1 -0
  208. package/dist/editor-web/controller/table-resize.d.ts +14 -0
  209. package/dist/editor-web/controller/table-resize.d.ts.map +1 -0
  210. package/dist/editor-web/controller/table-resize.js +178 -0
  211. package/dist/editor-web/controller/table-resize.js.map +1 -0
  212. package/dist/editor-web/controller/table-ui.d.ts +5 -0
  213. package/dist/editor-web/controller/table-ui.d.ts.map +1 -0
  214. package/dist/editor-web/controller/table-ui.js +214 -0
  215. package/dist/editor-web/controller/table-ui.js.map +1 -0
  216. package/dist/editor-web/controller/types.d.ts +95 -0
  217. package/dist/editor-web/controller/types.d.ts.map +1 -0
  218. package/dist/editor-web/controller/types.js +4 -0
  219. package/dist/editor-web/controller/types.js.map +1 -0
  220. package/dist/editor-web/controller/variable-ui.d.ts +5 -0
  221. package/dist/editor-web/controller/variable-ui.d.ts.map +1 -0
  222. package/dist/editor-web/controller/variable-ui.js +75 -0
  223. package/dist/editor-web/controller/variable-ui.js.map +1 -0
  224. package/dist/editor-web/images/index.d.ts +9 -0
  225. package/dist/editor-web/images/index.d.ts.map +1 -0
  226. package/dist/editor-web/images/index.js +18 -0
  227. package/dist/editor-web/images/index.js.map +1 -0
  228. package/dist/editor-web/index.d.ts +10 -0
  229. package/dist/editor-web/index.d.ts.map +1 -0
  230. package/dist/editor-web/index.js +10 -0
  231. package/dist/editor-web/index.js.map +1 -0
  232. package/dist/editor-web/input/index.d.ts +75 -0
  233. package/dist/editor-web/input/index.d.ts.map +1 -0
  234. package/dist/editor-web/input/index.js +151 -0
  235. package/dist/editor-web/input/index.js.map +1 -0
  236. package/dist/editor-web/tables/index.d.ts +47 -0
  237. package/dist/editor-web/tables/index.d.ts.map +1 -0
  238. package/dist/editor-web/tables/index.js +159 -0
  239. package/dist/editor-web/tables/index.js.map +1 -0
  240. package/dist/editor-web/toolbar/index.d.ts +17 -0
  241. package/dist/editor-web/toolbar/index.d.ts.map +1 -0
  242. package/dist/editor-web/toolbar/index.js +36 -0
  243. package/dist/editor-web/toolbar/index.js.map +1 -0
  244. package/dist/editor-web/ux/attach.d.ts +21 -0
  245. package/dist/editor-web/ux/attach.d.ts.map +1 -0
  246. package/dist/editor-web/ux/attach.js +61 -0
  247. package/dist/editor-web/ux/attach.js.map +1 -0
  248. package/dist/editor-web/ux/command-palette.d.ts +11 -0
  249. package/dist/editor-web/ux/command-palette.d.ts.map +1 -0
  250. package/dist/editor-web/ux/command-palette.js +135 -0
  251. package/dist/editor-web/ux/command-palette.js.map +1 -0
  252. package/dist/editor-web/ux/equation-editor.d.ts +11 -0
  253. package/dist/editor-web/ux/equation-editor.d.ts.map +1 -0
  254. package/dist/editor-web/ux/equation-editor.js +130 -0
  255. package/dist/editor-web/ux/equation-editor.js.map +1 -0
  256. package/dist/editor-web/ux/equation-palette.d.ts +11 -0
  257. package/dist/editor-web/ux/equation-palette.d.ts.map +1 -0
  258. package/dist/editor-web/ux/equation-palette.js +90 -0
  259. package/dist/editor-web/ux/equation-palette.js.map +1 -0
  260. package/dist/editor-web/ux/find-replace.d.ts +6 -0
  261. package/dist/editor-web/ux/find-replace.d.ts.map +1 -0
  262. package/dist/editor-web/ux/find-replace.js +125 -0
  263. package/dist/editor-web/ux/find-replace.js.map +1 -0
  264. package/dist/editor-web/ux/find-text.d.ts +10 -0
  265. package/dist/editor-web/ux/find-text.d.ts.map +1 -0
  266. package/dist/editor-web/ux/find-text.js +101 -0
  267. package/dist/editor-web/ux/find-text.js.map +1 -0
  268. package/dist/editor-web/ux/image-drop.d.ts +7 -0
  269. package/dist/editor-web/ux/image-drop.d.ts.map +1 -0
  270. package/dist/editor-web/ux/image-drop.js +198 -0
  271. package/dist/editor-web/ux/image-drop.js.map +1 -0
  272. package/dist/editor-web/ux/link-ui.d.ts +6 -0
  273. package/dist/editor-web/ux/link-ui.d.ts.map +1 -0
  274. package/dist/editor-web/ux/link-ui.js +50 -0
  275. package/dist/editor-web/ux/link-ui.js.map +1 -0
  276. package/dist/editor-web/ux/outline.d.ts +9 -0
  277. package/dist/editor-web/ux/outline.d.ts.map +1 -0
  278. package/dist/editor-web/ux/outline.js +48 -0
  279. package/dist/editor-web/ux/outline.js.map +1 -0
  280. package/dist/editor-web/ux/page-preview.d.ts +6 -0
  281. package/dist/editor-web/ux/page-preview.d.ts.map +1 -0
  282. package/dist/editor-web/ux/page-preview.js +90 -0
  283. package/dist/editor-web/ux/page-preview.js.map +1 -0
  284. package/dist/editor-web/ux/selection-bubble.d.ts +6 -0
  285. package/dist/editor-web/ux/selection-bubble.d.ts.map +1 -0
  286. package/dist/editor-web/ux/selection-bubble.js +79 -0
  287. package/dist/editor-web/ux/selection-bubble.js.map +1 -0
  288. package/dist/editor-web/ux/shortcuts-sheet.d.ts +6 -0
  289. package/dist/editor-web/ux/shortcuts-sheet.d.ts.map +1 -0
  290. package/dist/editor-web/ux/shortcuts-sheet.js +58 -0
  291. package/dist/editor-web/ux/shortcuts-sheet.js.map +1 -0
  292. package/dist/editor-web/view/index.d.ts +3 -0
  293. package/dist/editor-web/view/index.d.ts.map +1 -0
  294. package/dist/editor-web/view/index.js +3 -0
  295. package/dist/editor-web/view/index.js.map +1 -0
  296. package/dist/editor-web/view/parse-inlines.d.ts +15 -0
  297. package/dist/editor-web/view/parse-inlines.d.ts.map +1 -0
  298. package/dist/editor-web/view/parse-inlines.js +107 -0
  299. package/dist/editor-web/view/parse-inlines.js.map +1 -0
  300. package/dist/editor-web/view/parse.d.ts +8 -0
  301. package/dist/editor-web/view/parse.d.ts.map +1 -0
  302. package/dist/editor-web/view/parse.js +238 -0
  303. package/dist/editor-web/view/parse.js.map +1 -0
  304. package/dist/editor-web/view/reconcile.d.ts +26 -0
  305. package/dist/editor-web/view/reconcile.d.ts.map +1 -0
  306. package/dist/editor-web/view/reconcile.js +142 -0
  307. package/dist/editor-web/view/reconcile.js.map +1 -0
  308. package/dist/editor-web/view/render.d.ts +14 -0
  309. package/dist/editor-web/view/render.d.ts.map +1 -0
  310. package/dist/editor-web/view/render.js +162 -0
  311. package/dist/editor-web/view/render.js.map +1 -0
  312. package/dist/export/docx/document-xml.d.ts +3 -0
  313. package/dist/export/docx/document-xml.d.ts.map +1 -0
  314. package/dist/export/docx/document-xml.js +218 -0
  315. package/dist/export/docx/document-xml.js.map +1 -0
  316. package/dist/export/docx/package-parts.d.ts +9 -0
  317. package/dist/export/docx/package-parts.d.ts.map +1 -0
  318. package/dist/export/docx/package-parts.js +91 -0
  319. package/dist/export/docx/package-parts.js.map +1 -0
  320. package/dist/export/docx/writer.d.ts +17 -0
  321. package/dist/export/docx/writer.d.ts.map +1 -0
  322. package/dist/export/docx/writer.js +48 -0
  323. package/dist/export/docx/writer.js.map +1 -0
  324. package/dist/export/images/downsample.d.ts +19 -0
  325. package/dist/export/images/downsample.d.ts.map +1 -0
  326. package/dist/export/images/downsample.js +64 -0
  327. package/dist/export/images/downsample.js.map +1 -0
  328. package/dist/export/images/png-encode.d.ts +4 -0
  329. package/dist/export/images/png-encode.d.ts.map +1 -0
  330. package/dist/export/images/png-encode.js +86 -0
  331. package/dist/export/images/png-encode.js.map +1 -0
  332. package/dist/export/images/prepare.d.ts +22 -0
  333. package/dist/export/images/prepare.d.ts.map +1 -0
  334. package/dist/export/images/prepare.js +29 -0
  335. package/dist/export/images/prepare.js.map +1 -0
  336. package/dist/export/images/rasterize.d.ts +7 -0
  337. package/dist/export/images/rasterize.d.ts.map +1 -0
  338. package/dist/export/images/rasterize.js +62 -0
  339. package/dist/export/images/rasterize.js.map +1 -0
  340. package/dist/export/index.d.ts +45 -0
  341. package/dist/export/index.d.ts.map +1 -0
  342. package/dist/export/index.js +52 -0
  343. package/dist/export/index.js.map +1 -0
  344. package/dist/export/layout/index.d.ts +23 -0
  345. package/dist/export/layout/index.d.ts.map +1 -0
  346. package/dist/export/layout/index.js +18 -0
  347. package/dist/export/layout/index.js.map +1 -0
  348. package/dist/export/layout/layout-blocks.d.ts +5 -0
  349. package/dist/export/layout/layout-blocks.d.ts.map +1 -0
  350. package/dist/export/layout/layout-blocks.js +91 -0
  351. package/dist/export/layout/layout-blocks.js.map +1 -0
  352. package/dist/export/layout/layout-flow.d.ts +25 -0
  353. package/dist/export/layout/layout-flow.d.ts.map +1 -0
  354. package/dist/export/layout/layout-flow.js +23 -0
  355. package/dist/export/layout/layout-flow.js.map +1 -0
  356. package/dist/export/layout/layout-structured.d.ts +4 -0
  357. package/dist/export/layout/layout-structured.d.ts.map +1 -0
  358. package/dist/export/layout/layout-structured.js +153 -0
  359. package/dist/export/layout/layout-structured.js.map +1 -0
  360. package/dist/export/layout/layout-types.d.ts +35 -0
  361. package/dist/export/layout/layout-types.d.ts.map +1 -0
  362. package/dist/export/layout/layout-types.js +2 -0
  363. package/dist/export/layout/layout-types.js.map +1 -0
  364. package/dist/export/layout/pagination.d.ts +9 -0
  365. package/dist/export/layout/pagination.d.ts.map +1 -0
  366. package/dist/export/layout/pagination.js +38 -0
  367. package/dist/export/layout/pagination.js.map +1 -0
  368. package/dist/export/layout/text.d.ts +47 -0
  369. package/dist/export/layout/text.d.ts.map +1 -0
  370. package/dist/export/layout/text.js +119 -0
  371. package/dist/export/layout/text.js.map +1 -0
  372. package/dist/export/layout/units.d.ts +30 -0
  373. package/dist/export/layout/units.d.ts.map +1 -0
  374. package/dist/export/layout/units.js +55 -0
  375. package/dist/export/layout/units.js.map +1 -0
  376. package/dist/export/odt/writer.d.ts +24 -0
  377. package/dist/export/odt/writer.d.ts.map +1 -0
  378. package/dist/export/odt/writer.js +258 -0
  379. package/dist/export/odt/writer.js.map +1 -0
  380. package/dist/export/pdf/assemble.d.ts +9 -0
  381. package/dist/export/pdf/assemble.d.ts.map +1 -0
  382. package/dist/export/pdf/assemble.js +105 -0
  383. package/dist/export/pdf/assemble.js.map +1 -0
  384. package/dist/export/pdf/diagnostics.d.ts +11 -0
  385. package/dist/export/pdf/diagnostics.d.ts.map +1 -0
  386. package/dist/export/pdf/diagnostics.js +88 -0
  387. package/dist/export/pdf/diagnostics.js.map +1 -0
  388. package/dist/export/pdf/equation.d.ts +55 -0
  389. package/dist/export/pdf/equation.d.ts.map +1 -0
  390. package/dist/export/pdf/equation.js +301 -0
  391. package/dist/export/pdf/equation.js.map +1 -0
  392. package/dist/export/pdf/export-pdf.d.ts +33 -0
  393. package/dist/export/pdf/export-pdf.d.ts.map +1 -0
  394. package/dist/export/pdf/export-pdf.js +54 -0
  395. package/dist/export/pdf/export-pdf.js.map +1 -0
  396. package/dist/export/pdf/fonts.d.ts +7 -0
  397. package/dist/export/pdf/fonts.d.ts.map +1 -0
  398. package/dist/export/pdf/fonts.js +15 -0
  399. package/dist/export/pdf/fonts.js.map +1 -0
  400. package/dist/export/pdf/image.d.ts +27 -0
  401. package/dist/export/pdf/image.d.ts.map +1 -0
  402. package/dist/export/pdf/image.js +271 -0
  403. package/dist/export/pdf/image.js.map +1 -0
  404. package/dist/export/pdf/layout-pages.d.ts +9 -0
  405. package/dist/export/pdf/layout-pages.d.ts.map +1 -0
  406. package/dist/export/pdf/layout-pages.js +174 -0
  407. package/dist/export/pdf/layout-pages.js.map +1 -0
  408. package/dist/export/pdf/layout-table.d.ts +29 -0
  409. package/dist/export/pdf/layout-table.d.ts.map +1 -0
  410. package/dist/export/pdf/layout-table.js +216 -0
  411. package/dist/export/pdf/layout-table.js.map +1 -0
  412. package/dist/export/pdf/page-metrics.d.ts +11 -0
  413. package/dist/export/pdf/page-metrics.d.ts.map +1 -0
  414. package/dist/export/pdf/page-metrics.js +14 -0
  415. package/dist/export/pdf/page-metrics.js.map +1 -0
  416. package/dist/export/pdf/pdf-model.d.ts +36 -0
  417. package/dist/export/pdf/pdf-model.d.ts.map +1 -0
  418. package/dist/export/pdf/pdf-model.js +4 -0
  419. package/dist/export/pdf/pdf-model.js.map +1 -0
  420. package/dist/export/pdf/stream.d.ts +6 -0
  421. package/dist/export/pdf/stream.d.ts.map +1 -0
  422. package/dist/export/pdf/stream.js +213 -0
  423. package/dist/export/pdf/stream.js.map +1 -0
  424. package/dist/export/pdf/writer.d.ts +26 -0
  425. package/dist/export/pdf/writer.d.ts.map +1 -0
  426. package/dist/export/pdf/writer.js +31 -0
  427. package/dist/export/pdf/writer.js.map +1 -0
  428. package/dist/export/validate.d.ts +29 -0
  429. package/dist/export/validate.d.ts.map +1 -0
  430. package/dist/export/validate.js +127 -0
  431. package/dist/export/validate.js.map +1 -0
  432. package/dist/export/xml/writer.d.ts +19 -0
  433. package/dist/export/xml/writer.d.ts.map +1 -0
  434. package/dist/export/xml/writer.js +57 -0
  435. package/dist/export/xml/writer.js.map +1 -0
  436. package/dist/export/zip/crc32.d.ts +2 -0
  437. package/dist/export/zip/crc32.d.ts.map +1 -0
  438. package/dist/export/zip/crc32.js +20 -0
  439. package/dist/export/zip/crc32.js.map +1 -0
  440. package/dist/export/zip/deflate.d.ts +15 -0
  441. package/dist/export/zip/deflate.d.ts.map +1 -0
  442. package/dist/export/zip/deflate.js +28 -0
  443. package/dist/export/zip/deflate.js.map +1 -0
  444. package/dist/export/zip/index.d.ts +3 -0
  445. package/dist/export/zip/index.d.ts.map +1 -0
  446. package/dist/export/zip/index.js +3 -0
  447. package/dist/export/zip/index.js.map +1 -0
  448. package/dist/export/zip/zipWriter.d.ts +23 -0
  449. package/dist/export/zip/zipWriter.d.ts.map +1 -0
  450. package/dist/export/zip/zipWriter.js +123 -0
  451. package/dist/export/zip/zipWriter.js.map +1 -0
  452. package/dist/public-api/index.d.ts +46 -0
  453. package/dist/public-api/index.d.ts.map +1 -0
  454. package/dist/public-api/index.js +40 -0
  455. package/dist/public-api/index.js.map +1 -0
  456. package/dist/template/diagnostics/index.d.ts +8 -0
  457. package/dist/template/diagnostics/index.d.ts.map +1 -0
  458. package/dist/template/diagnostics/index.js +4 -0
  459. package/dist/template/diagnostics/index.js.map +1 -0
  460. package/dist/template/formatter/index.d.ts +9 -0
  461. package/dist/template/formatter/index.d.ts.map +1 -0
  462. package/dist/template/formatter/index.js +27 -0
  463. package/dist/template/formatter/index.js.map +1 -0
  464. package/dist/template/index.d.ts +3 -0
  465. package/dist/template/index.d.ts.map +1 -0
  466. package/dist/template/index.js +3 -0
  467. package/dist/template/index.js.map +1 -0
  468. package/dist/template/parser/parser.d.ts +42 -0
  469. package/dist/template/parser/parser.d.ts.map +1 -0
  470. package/dist/template/parser/parser.js +135 -0
  471. package/dist/template/parser/parser.js.map +1 -0
  472. package/dist/template/resolver/format.d.ts +11 -0
  473. package/dist/template/resolver/format.d.ts.map +1 -0
  474. package/dist/template/resolver/format.js +80 -0
  475. package/dist/template/resolver/format.js.map +1 -0
  476. package/dist/template/resolver/resolver.d.ts +31 -0
  477. package/dist/template/resolver/resolver.d.ts.map +1 -0
  478. package/dist/template/resolver/resolver.js +218 -0
  479. package/dist/template/resolver/resolver.js.map +1 -0
  480. package/dist/theme/index.d.ts +26 -0
  481. package/dist/theme/index.d.ts.map +1 -0
  482. package/dist/theme/index.js +87 -0
  483. package/dist/theme/index.js.map +1 -0
  484. package/package.json +110 -0
  485. package/schemas/portable-doc-v1.json +250 -0
  486. package/themes/base.css +71 -0
  487. package/themes/components.css +135 -0
  488. package/themes/editor-chrome.css +174 -0
  489. package/themes/editor-columns.css +121 -0
  490. package/themes/editor-overlays.css +464 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/assets/sniff/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,YAAY,GAAG,YAAY,GAAG,eAAe,CAAC;AAEpF,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,SAAS,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,WAAW,CAgC5E;AAED,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,EAAE,IAAI,SAAS,CAE9D"}
@@ -0,0 +1,41 @@
1
+ export function sniffImage(bytes, declared) {
2
+ if (bytes.length < 4)
3
+ return { mediaType: null, valid: false, reason: "too-short" };
4
+ // PNG: 89 50 4E 47
5
+ if (bytes[0] === 0x89 && bytes[1] === 0x50 && bytes[2] === 0x4e && bytes[3] === 0x47) {
6
+ const mediaType = "image/png";
7
+ if (declared && declared !== mediaType)
8
+ return { mediaType, valid: false, reason: "mime-mismatch" };
9
+ return { mediaType, valid: true };
10
+ }
11
+ // JPEG: FF D8 FF
12
+ if (bytes[0] === 0xff && bytes[1] === 0xd8 && bytes[2] === 0xff) {
13
+ const mediaType = "image/jpeg";
14
+ if (declared && declared !== mediaType && declared !== "image/jpg")
15
+ return { mediaType, valid: false, reason: "mime-mismatch" };
16
+ return { mediaType, valid: true };
17
+ }
18
+ // WebP: RIFF....WEBP
19
+ if (bytes[0] === 0x52 && bytes[1] === 0x49 && bytes[2] === 0x46 && bytes[3] === 0x46) {
20
+ const header = new TextDecoder().decode(bytes.slice(8, 12));
21
+ if (header === "WEBP") {
22
+ const mediaType = "image/webp";
23
+ if (declared && declared !== mediaType)
24
+ return { mediaType, valid: false, reason: "mime-mismatch" };
25
+ return { mediaType, valid: true };
26
+ }
27
+ }
28
+ // SVG: empieza con <svg o <?xml
29
+ const head = new TextDecoder().decode(bytes.slice(0, 200)).trimStart();
30
+ if (head.startsWith("<svg") || head.startsWith("<?xml")) {
31
+ const mediaType = "image/svg+xml";
32
+ if (declared && declared !== mediaType)
33
+ return { mediaType, valid: false, reason: "mime-mismatch" };
34
+ return { mediaType, valid: true };
35
+ }
36
+ return { mediaType: null, valid: false, reason: "unknown-format" };
37
+ }
38
+ export function isAllowedMediaType(mt) {
39
+ return ["image/png", "image/jpeg", "image/webp", "image/svg+xml"].includes(mt);
40
+ }
41
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/assets/sniff/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Asset store — Phase 5.2 / 5.2.3
3
+ * Interface create/put/confirm/get/delete with idempotent retries, cancellation support,
4
+ * transactional references, dedupe by sha256 per tenant, deferred GC and audit.
5
+ */
6
+ import type { AssetRef } from "../../core/model/types.js";
7
+ export interface AssetRecord extends AssetRef {
8
+ tenantId: string;
9
+ status: "pending" | "confirmed" | "orphaned" | "deleted";
10
+ createdAt: string;
11
+ confirmedAt?: string;
12
+ }
13
+ export interface CreateIntent {
14
+ tenantId: string;
15
+ sha256: string;
16
+ byteLength: number;
17
+ mediaType: AssetRef["mediaType"];
18
+ fileName: string;
19
+ }
20
+ export interface AssetStore {
21
+ /** Create an upload intent — returns existing asset if deduped */
22
+ createIntent(intent: CreateIntent): Promise<{
23
+ asset: AssetRecord;
24
+ isDuplicate: boolean;
25
+ uploadUrl?: string;
26
+ }>;
27
+ /** Confirm after PUT to storage */
28
+ confirm(assetId: string, tenantId: string): Promise<AssetRecord>;
29
+ /** Get asset by id */
30
+ get(assetId: string, tenantId: string): Promise<AssetRecord | null>;
31
+ /** Get by sha256 (dedupe lookup) */
32
+ getByHash(sha256: string, tenantId: string): Promise<AssetRecord | null>;
33
+ /** Add reference from document to asset (transactional) */
34
+ addReference(documentId: string, assetId: string, tenantId: string): Promise<void>;
35
+ /** Remove reference */
36
+ removeReference(documentId: string, assetId: string, tenantId: string): Promise<void>;
37
+ /** Garbage collect orphaned assets older than threshold */
38
+ gc(olderThanMs?: number): Promise<string[]>;
39
+ /** List assets for tenant with keyset pagination */
40
+ list(tenantId: string, opts?: {
41
+ limit?: number;
42
+ cursor?: string;
43
+ }): Promise<{
44
+ assets: AssetRecord[];
45
+ nextCursor?: string;
46
+ }>;
47
+ }
48
+ /**
49
+ * In-memory implementation — deterministic, suitable for tests and as reference for PG implementation.
50
+ * Dedupe is per-tenant by sha256 (unique constraint in PG: UNIQUE(tenant_id, sha256)).
51
+ */
52
+ export declare function createInMemoryAssetStore(): AssetStore & {
53
+ storage: Map<string, AssetRecord>;
54
+ refs: Map<string, Set<string>>;
55
+ };
56
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/assets/store/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAE1D,MAAM,WAAW,WAAY,SAAQ,QAAQ;IAC3C,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,CAAC;IACzD,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC;IACjC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,kEAAkE;IAClE,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,WAAW,CAAC;QAAC,WAAW,EAAE,OAAO,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9G,mCAAmC;IACnC,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;IACjE,sBAAsB;IACtB,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACpE,oCAAoC;IACpC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACzE,2DAA2D;IAC3D,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnF,uBAAuB;IACvB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtF,2DAA2D;IAC3D,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5C,oDAAoD;IACpD,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,WAAW,EAAE,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC7H;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,UAAU,GAAG;IAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAAC,IAAI,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAA;CAAE,CAuF7H"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * In-memory implementation — deterministic, suitable for tests and as reference for PG implementation.
3
+ * Dedupe is per-tenant by sha256 (unique constraint in PG: UNIQUE(tenant_id, sha256)).
4
+ */
5
+ export function createInMemoryAssetStore() {
6
+ const assets = new Map(); // key: tenantId:assetId
7
+ const byHash = new Map(); // key: tenantId:sha256
8
+ const refs = new Map(); // key: documentId -> Set<assetId>
9
+ const key = (tenantId, assetId) => `${tenantId}:${assetId}`;
10
+ const hashKey = (tenantId, sha256) => `${tenantId}:${sha256}`;
11
+ return {
12
+ storage: assets,
13
+ refs,
14
+ async createIntent(intent) {
15
+ const existing = byHash.get(hashKey(intent.tenantId, intent.sha256));
16
+ if (existing)
17
+ return { asset: existing, isDuplicate: true };
18
+ const id = `ast_${Math.random().toString(36).slice(2, 10)}_${Date.now().toString(36)}`;
19
+ const now = new Date().toISOString();
20
+ const rec = {
21
+ id,
22
+ kind: "image",
23
+ mediaType: intent.mediaType,
24
+ storageKey: `tenants/${intent.tenantId}/assets/${id}`,
25
+ sha256: intent.sha256,
26
+ byteLength: intent.byteLength,
27
+ alt: intent.fileName,
28
+ tenantId: intent.tenantId,
29
+ status: "pending",
30
+ createdAt: now,
31
+ };
32
+ assets.set(key(intent.tenantId, id), rec);
33
+ byHash.set(hashKey(intent.tenantId, intent.sha256), rec);
34
+ return { asset: rec, isDuplicate: false, uploadUrl: `https://storage.example/upload/${id}` };
35
+ },
36
+ async confirm(assetId, tenantId) {
37
+ const rec = assets.get(key(tenantId, assetId));
38
+ if (!rec)
39
+ throw new Error("asset not found");
40
+ rec.status = "confirmed";
41
+ rec.confirmedAt = new Date().toISOString();
42
+ return rec;
43
+ },
44
+ async get(assetId, tenantId) {
45
+ return assets.get(key(tenantId, assetId)) ?? null;
46
+ },
47
+ async getByHash(sha256, tenantId) {
48
+ return byHash.get(hashKey(tenantId, sha256)) ?? null;
49
+ },
50
+ async addReference(documentId, assetId, tenantId) {
51
+ const rec = assets.get(key(tenantId, assetId));
52
+ if (!rec)
53
+ throw new Error("asset not found");
54
+ if (!refs.has(documentId))
55
+ refs.set(documentId, new Set());
56
+ refs.get(documentId).add(assetId);
57
+ },
58
+ async removeReference(documentId, assetId) {
59
+ refs.get(documentId)?.delete(assetId);
60
+ // Mark orphaned if no remaining refs across all docs
61
+ let stillReferenced = false;
62
+ for (const set of refs.values())
63
+ if (set.has(assetId))
64
+ stillReferenced = true;
65
+ if (!stillReferenced) {
66
+ // Find asset record to mark orphaned
67
+ for (const rec of assets.values())
68
+ if (rec.id === assetId)
69
+ rec.status = "orphaned";
70
+ }
71
+ },
72
+ async gc(olderThanMs = 24 * 60 * 60 * 1000) {
73
+ const cut = Date.now() - olderThanMs;
74
+ const deleted = [];
75
+ for (const [k, rec] of assets.entries()) {
76
+ if (rec.status === "orphaned" && new Date(rec.createdAt).getTime() < cut) {
77
+ assets.delete(k);
78
+ byHash.delete(hashKey(rec.tenantId, rec.sha256));
79
+ deleted.push(rec.id);
80
+ // Remove from refs
81
+ for (const set of refs.values())
82
+ set.delete(rec.id);
83
+ }
84
+ }
85
+ return deleted;
86
+ },
87
+ async list(tenantId, opts = {}) {
88
+ const limit = opts.limit ?? 20;
89
+ const all = [...assets.values()].filter((a) => a.tenantId === tenantId).sort((a, b) => a.createdAt.localeCompare(b.createdAt));
90
+ let start = 0;
91
+ if (opts.cursor) {
92
+ const idx = all.findIndex((a) => a.id === opts.cursor);
93
+ if (idx !== -1)
94
+ start = idx + 1;
95
+ }
96
+ const sliced = all.slice(start, start + limit);
97
+ const nextCursor = all.length > start + limit ? sliced[sliced.length - 1].id : undefined;
98
+ return { assets: sliced, nextCursor };
99
+ },
100
+ };
101
+ }
102
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/assets/store/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export interface SanitizeResult {
2
+ sanitized: string;
3
+ removed: string[];
4
+ valid: boolean;
5
+ }
6
+ export declare function sanitizeSvg(svgText: string): SanitizeResult;
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/assets/svg/index.ts"],"names":[],"mappings":"AAoDA,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,cAAc,CA6B3D"}
@@ -0,0 +1,82 @@
1
+ /**
2
+ * SVG sanitization — Phase 5.1.3
3
+ * Safe internal XML parser, element/attribute allowlist, no scripts/events/network.
4
+ */
5
+ const ALLOWED_ELEMENTS = new Set([
6
+ "svg",
7
+ "g",
8
+ "path",
9
+ "rect",
10
+ "circle",
11
+ "ellipse",
12
+ "line",
13
+ "polyline",
14
+ "polygon",
15
+ "text",
16
+ "tspan",
17
+ "defs",
18
+ "use",
19
+ "clipPath",
20
+ "mask",
21
+ "linearGradient",
22
+ "radialGradient",
23
+ "stop",
24
+ ]);
25
+ const ALLOWED_ATTRS = new Set([
26
+ "width",
27
+ "height",
28
+ "viewBox",
29
+ "xmlns",
30
+ "d",
31
+ "x",
32
+ "y",
33
+ "cx",
34
+ "cy",
35
+ "r",
36
+ "rx",
37
+ "ry",
38
+ "fill",
39
+ "stroke",
40
+ "stroke-width",
41
+ "transform",
42
+ "opacity",
43
+ "id",
44
+ "class",
45
+ "offset",
46
+ "stop-color",
47
+ "stop-opacity",
48
+ ]);
49
+ const FORBIDDEN_ATTRS_PREFIX = ["on", "href", "xlink:href"];
50
+ export function sanitizeSvg(svgText) {
51
+ const removed = [];
52
+ // Fast rejection: scripts, foreignObject, event handlers, external URLs
53
+ if (/<script/i.test(svgText))
54
+ removed.push("script");
55
+ if (/<foreignObject/i.test(svgText))
56
+ removed.push("foreignObject");
57
+ if (/javascript:/i.test(svgText))
58
+ removed.push("javascript-url");
59
+ if (/\bon\w+\s*=/i.test(svgText))
60
+ removed.push("event-handler");
61
+ // Very simple parser: flag non-allowlisted elements
62
+ const tagRe = /<\/?([a-zA-Z0-9:]+)[^>]*>/g;
63
+ let m;
64
+ while ((m = tagRe.exec(svgText)) !== null) {
65
+ const tag = m[1].toLowerCase();
66
+ const base = tag.split(":").pop();
67
+ if (!ALLOWED_ELEMENTS.has(base) && !base.startsWith("svg")) {
68
+ // permitir svg root
69
+ if (base !== "svg" && !removed.includes(`element:${base}`))
70
+ removed.push(`element:${base}`);
71
+ }
72
+ }
73
+ // Attribute filtering: remove dangerous attributes
74
+ let sanitized = svgText
75
+ .replace(/<script[\s\S]*?<\/script>/gi, "")
76
+ .replace(/<foreignObject[\s\S]*?<\/foreignObject>/gi, "")
77
+ .replace(/\s+on\w+\s*=\s*("[^"]*"|'[^']*'|[^\s>]+)/gi, "");
78
+ // Valid if script/event was removed and output differs; critical elements keep invalid flag (simplified)
79
+ const valid = !removed.includes("script") || sanitized !== svgText;
80
+ return { sanitized, removed, valid: removed.length === 0 || valid };
81
+ }
82
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/assets/svg/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IAC/B,KAAK;IACL,GAAG;IACH,MAAM;IACN,MAAM;IACN,QAAQ;IACR,SAAS;IACT,MAAM;IACN,UAAU;IACV,SAAS;IACT,MAAM;IACN,OAAO;IACP,MAAM;IACN,KAAK;IACL,UAAU;IACV,MAAM;IACN,gBAAgB;IAChB,gBAAgB;IAChB,MAAM;CACP,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IAC5B,OAAO;IACP,QAAQ;IACR,SAAS;IACT,OAAO;IACP,GAAG;IACH,GAAG;IACH,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,GAAG;IACH,IAAI;IACJ,IAAI;IACJ,MAAM;IACN,QAAQ;IACR,cAAc;IACd,WAAW;IACX,SAAS;IACT,IAAI;IACJ,OAAO;IACP,QAAQ;IACR,YAAY;IACZ,cAAc;CACf,CAAC,CAAC;AAEH,MAAM,sBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;AAQ5D,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,wEAAwE;IACxE,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACrD,IAAI,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACnE,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IACjE,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAEhE,oDAAoD;IACpD,MAAM,KAAK,GAAG,4BAA4B,CAAC;IAC3C,IAAI,CAAyB,CAAC;IAC9B,OAAO,CAAC,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,CAAC;QAChC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAG,CAAC;QACnC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3D,oBAAoB;YACpB,IAAI,IAAI,KAAK,KAAK,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,IAAI,EAAE,CAAC;gBAAE,OAAO,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;QAC9F,CAAC;IACH,CAAC;IAED,mDAAmD;IACnD,IAAI,SAAS,GAAG,OAAO;SACpB,OAAO,CAAC,6BAA6B,EAAE,EAAE,CAAC;SAC1C,OAAO,CAAC,2CAA2C,EAAE,EAAE,CAAC;SACxD,OAAO,CAAC,4CAA4C,EAAE,EAAE,CAAC,CAAC;IAE7D,yGAAyG;IACzG,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,SAAS,KAAK,OAAO,CAAC;IACnE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,EAAE,CAAC;AACtE,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** Recursive LaTeX → HTML for the v1 subset (nested \frac / \sqrt / ^ / _). */
2
+ export declare function latexToHtml(latex: string): string;
3
+ //# sourceMappingURL=html.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../../src/core/equation/html.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAgI/E,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEjD"}
@@ -0,0 +1,138 @@
1
+ /** Recursive LaTeX → HTML for the v1 subset (nested \frac / \sqrt / ^ / _). */
2
+ const GREEK = {
3
+ alpha: "α", beta: "β", gamma: "γ", delta: "δ", epsilon: "ε", zeta: "ζ", eta: "η",
4
+ theta: "θ", iota: "ι", kappa: "κ", lambda: "λ", mu: "μ", nu: "ν", xi: "ξ", omicron: "ο",
5
+ pi: "π", rho: "ρ", sigma: "σ", tau: "τ", upsilon: "υ", phi: "φ", chi: "χ", psi: "ψ", omega: "ω",
6
+ Gamma: "Γ", Delta: "Δ", Theta: "Θ", Lambda: "Λ", Xi: "Ξ", Pi: "Π", Sigma: "Σ", Phi: "Φ", Psi: "Ψ", Omega: "Ω",
7
+ infty: "∞",
8
+ };
9
+ const OPS = {
10
+ iiint: "∭", iint: "∬", oint: "∮", int: "∫", sum: "∑", prod: "∏",
11
+ Leftrightarrow: "⇔", Rightarrow: "⇒", Leftarrow: "⇐",
12
+ leftrightarrow: "↔", rightarrow: "→", leftarrow: "←", mapsto: "↦",
13
+ uparrow: "↑", downarrow: "↓", to: "→",
14
+ otimes: "⊗", oplus: "⊕", times: "×", cdot: "·", circ: "∘",
15
+ div: "÷", pm: "±", mp: "∓", partial: "∂", nabla: "∇",
16
+ approx: "≈", neq: "≠", leq: "≤", geq: "≥", equiv: "≡", propto: "∝",
17
+ notin: "∉", emptyset: "∅", subset: "⊂", supset: "⊃",
18
+ cup: "∪", cap: "∩", forall: "∀", exists: "∃", in: "∈",
19
+ lfloor: "⌊", rfloor: "⌋", lceil: "⌈", rceil: "⌉",
20
+ sin: "sin", cos: "cos", tan: "tan", log: "log", ln: "ln",
21
+ exp: "exp", lim: "lim", max: "max", min: "min", det: "det",
22
+ };
23
+ function escapeHtml(s) {
24
+ return s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;");
25
+ }
26
+ function takeGroup(src, i) {
27
+ while (src[i] === " ")
28
+ i++;
29
+ if (src[i] !== "{") {
30
+ if (src[i] === "\\") {
31
+ let j = i + 1;
32
+ while (j < src.length && /[a-zA-Z]/.test(src[j]))
33
+ j++;
34
+ if (j === i + 1 && j < src.length)
35
+ j++;
36
+ return { inner: src.slice(i, j), next: j };
37
+ }
38
+ return { inner: src[i] ?? "", next: i + 1 };
39
+ }
40
+ let depth = 0;
41
+ for (let j = i; j < src.length; j++) {
42
+ if (src[j] === "\\" && (src[j + 1] === "{" || src[j + 1] === "}")) {
43
+ j++;
44
+ continue;
45
+ }
46
+ if (src[j] === "{")
47
+ depth++;
48
+ else if (src[j] === "}") {
49
+ depth--;
50
+ if (depth === 0)
51
+ return { inner: src.slice(i + 1, j), next: j + 1 };
52
+ }
53
+ }
54
+ return { inner: src.slice(i + 1), next: src.length };
55
+ }
56
+ function convert(src) {
57
+ let i = 0;
58
+ let out = "";
59
+ while (i < src.length) {
60
+ const c = src[i];
61
+ if (c === "{") {
62
+ const g = takeGroup(src, i);
63
+ out += convert(g.inner);
64
+ i = g.next;
65
+ continue;
66
+ }
67
+ if (c === "}") {
68
+ i++;
69
+ continue;
70
+ }
71
+ if (c === "^" || c === "_") {
72
+ const tag = c === "^" ? "sup" : "sub";
73
+ i++;
74
+ const g = takeGroup(src, i);
75
+ out += `<${tag}>${convert(g.inner)}</${tag}>`;
76
+ i = g.next;
77
+ continue;
78
+ }
79
+ if (c === "\\") {
80
+ const n = src[i + 1];
81
+ if (n && !/[a-zA-Z]/.test(n)) {
82
+ i += 2;
83
+ if (n === "\\")
84
+ out += "<br>";
85
+ else if (n === "{" || n === "}" || n === "_" || n === "%")
86
+ out += escapeHtml(n);
87
+ else if (n === ",")
88
+ out += "\u2009";
89
+ else
90
+ out += escapeHtml(n);
91
+ continue;
92
+ }
93
+ let j = i + 1;
94
+ while (j < src.length && /[a-zA-Z]/.test(src[j]))
95
+ j++;
96
+ const name = src.slice(i + 1, j);
97
+ i = j;
98
+ while (src[i] === " ")
99
+ i++;
100
+ if (name === "frac") {
101
+ const a = takeGroup(src, i);
102
+ const b = takeGroup(src, a.next);
103
+ out += `<span class="pde-frac"><span class="pde-frac-num">${convert(a.inner)}</span><span class="pde-frac-den">${convert(b.inner)}</span></span>`;
104
+ i = b.next;
105
+ continue;
106
+ }
107
+ if (name === "sqrt") {
108
+ const a = takeGroup(src, i);
109
+ out += `<span class="pde-sqrt"><svg class="pde-sqrt-sym" viewBox="0 0 12 18" preserveAspectRatio="none" aria-hidden="true"><path d="M1 9 L3.2 16.5 L8 1.2 H12" fill="none" stroke="currentColor" stroke-width="1.35" stroke-linejoin="round" stroke-linecap="square"/></svg><span class="pde-sqrt-inner">${convert(a.inner)}</span></span>`;
110
+ i = a.next;
111
+ continue;
112
+ }
113
+ if (name === "left" || name === "right")
114
+ continue;
115
+ if (name === "begin" || name === "end") {
116
+ const g = takeGroup(src, i);
117
+ i = g.next;
118
+ continue;
119
+ }
120
+ if (name === "hat" || name === "bar" || name === "vec" || name === "tilde") {
121
+ const g = takeGroup(src, i);
122
+ const mark = name === "hat" ? "̂" : name === "bar" ? "̄" : name === "vec" ? "⃗" : "̃";
123
+ out += `${convert(g.inner)}${mark}`;
124
+ i = g.next;
125
+ continue;
126
+ }
127
+ out += GREEK[name] ?? OPS[name] ?? escapeHtml(`\\${name}`);
128
+ continue;
129
+ }
130
+ out += c === " " ? " " : escapeHtml(c);
131
+ i++;
132
+ }
133
+ return out;
134
+ }
135
+ export function latexToHtml(latex) {
136
+ return convert(latex);
137
+ }
138
+ //# sourceMappingURL=html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.js","sourceRoot":"","sources":["../../../src/core/equation/html.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * LaTeX equation helper — simple subset for v1
3
+ * Roadmap 2.1: "Ecuacciones latex sencillas" (corrected to "Ecuaciones LaTeX sencillas").
4
+ * Provides validation, sanitization and lightweight HTML rendering without external dependencies.
5
+ * Complex macros (\def, \input, etc.) are rejected by the validator.
6
+ */
7
+ export declare const MAX_LATEX_LENGTH = 2000;
8
+ export interface LatexValidationResult {
9
+ valid: boolean;
10
+ errors: Array<{
11
+ code: string;
12
+ message: string;
13
+ }>;
14
+ }
15
+ export declare function validateLatex(latex: string): LatexValidationResult;
16
+ export { latexToHtml } from "./html.js";
17
+ export declare function latexToPlainText(latex: string): string;
18
+ export declare const equationCss = "\n.pde-equation {\n font-family: \"Cambria Math\", \"Latin Modern Math\", \"STIX Two Math\", serif;\n display: inline-block;\n vertical-align: middle;\n background: var(--pde-color-surface, #f7f8fa);\n border: 1px solid var(--pde-color-border, #d8dce3);\n border-radius: var(--pde-radius-sm, 4px);\n padding: 1px 6px;\n margin: 4px;\n white-space: nowrap;\n color: var(--pde-color-text, #17191c);\n}\n.pde-equation sup {\n font-size: 0.72em;\n vertical-align: super;\n line-height: 0;\n}\n.pde-equation sub {\n font-size: 0.72em;\n vertical-align: sub;\n line-height: 0;\n}\n.pde-equation--block {\n display: block;\n text-align: center;\n margin: 12px auto;\n padding: 8px 12px;\n max-width: 90%;\n white-space: normal;\n}\n.pde-frac { display: inline-block; vertical-align: middle; text-align: center; margin: 0 2px; line-height: 1.15; }\n.pde-frac-num { display: block; border-bottom: 1.5px solid currentColor; padding: 0 5px 1px; }\n.pde-frac-den { display: block; padding: 1px 5px 0; }\n.pde-sqrt { display: inline-flex; align-items: stretch; vertical-align: middle; }\n.pde-sqrt-sym { width: 0.62em; min-height: 1.05em; flex-shrink: 0; display: block; overflow: visible; }\n.pde-sqrt-inner { border-top: 1.35px solid currentColor; padding: 0.08em 0.28em 0.06em 0.04em; margin-left: -1px; line-height: 1.2; }\n";
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/core/equation/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,gBAAgB,OAAO,CAAC;AAiCrC,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAClD;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,qBAAqB,CAuBlE;AAED,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,eAAO,MAAM,WAAW,8zCAqCvB,CAAC"}
@@ -0,0 +1,107 @@
1
+ /**
2
+ * LaTeX equation helper — simple subset for v1
3
+ * Roadmap 2.1: "Ecuacciones latex sencillas" (corrected to "Ecuaciones LaTeX sencillas").
4
+ * Provides validation, sanitization and lightweight HTML rendering without external dependencies.
5
+ * Complex macros (\def, \input, etc.) are rejected by the validator.
6
+ */
7
+ export const MAX_LATEX_LENGTH = 2000;
8
+ const FORBIDDEN_COMMANDS = new Set(["\\input", "\\write", "\\def", "\\include", "\\catcode", "\\openout", "\\immediate", "\\loop", "\\repeat"]);
9
+ const ALLOWED_SIMPLE_COMMANDS = new Set([
10
+ "\\frac",
11
+ "\\sqrt",
12
+ "\\sum",
13
+ "\\int",
14
+ "\\alpha",
15
+ "\\beta",
16
+ "\\gamma",
17
+ "\\delta",
18
+ "\\epsilon",
19
+ "\\pi",
20
+ "\\theta",
21
+ "\\lambda",
22
+ "\\mu",
23
+ "\\sigma",
24
+ "\\omega",
25
+ "\\cdot",
26
+ "\\times",
27
+ "\\div",
28
+ "\\pm",
29
+ "\\leq",
30
+ "\\geq",
31
+ "\\neq",
32
+ "\\infty",
33
+ "\\rightarrow",
34
+ "\\left",
35
+ "\\right",
36
+ ]);
37
+ export function validateLatex(latex) {
38
+ const errors = [];
39
+ if (!latex || !latex.trim())
40
+ errors.push({ code: "required", message: "latex required" });
41
+ if (latex.length > MAX_LATEX_LENGTH)
42
+ errors.push({ code: "too-long", message: `max ${MAX_LATEX_LENGTH} chars` });
43
+ for (const forb of FORBIDDEN_COMMANDS) {
44
+ if (latex.includes(forb))
45
+ errors.push({ code: "forbidden-command", message: `forbidden ${forb}` });
46
+ }
47
+ // Balanced braces check
48
+ let depth = 0;
49
+ for (const ch of latex) {
50
+ if (ch === "{")
51
+ depth++;
52
+ if (ch === "}") {
53
+ depth--;
54
+ if (depth < 0) {
55
+ errors.push({ code: "unbalanced-braces", message: "unbalanced braces" });
56
+ break;
57
+ }
58
+ }
59
+ }
60
+ if (depth !== 0 && !errors.some((e) => e.code === "unbalanced-braces")) {
61
+ errors.push({ code: "unbalanced-braces", message: "unbalanced braces" });
62
+ }
63
+ return { valid: errors.length === 0, errors };
64
+ }
65
+ export { latexToHtml } from "./html.js";
66
+ export function latexToPlainText(latex) {
67
+ return `$${latex}$`;
68
+ }
69
+ export const equationCss = `
70
+ .pde-equation {
71
+ font-family: "Cambria Math", "Latin Modern Math", "STIX Two Math", serif;
72
+ display: inline-block;
73
+ vertical-align: middle;
74
+ background: var(--pde-color-surface, #f7f8fa);
75
+ border: 1px solid var(--pde-color-border, #d8dce3);
76
+ border-radius: var(--pde-radius-sm, 4px);
77
+ padding: 1px 6px;
78
+ margin: 4px;
79
+ white-space: nowrap;
80
+ color: var(--pde-color-text, #17191c);
81
+ }
82
+ .pde-equation sup {
83
+ font-size: 0.72em;
84
+ vertical-align: super;
85
+ line-height: 0;
86
+ }
87
+ .pde-equation sub {
88
+ font-size: 0.72em;
89
+ vertical-align: sub;
90
+ line-height: 0;
91
+ }
92
+ .pde-equation--block {
93
+ display: block;
94
+ text-align: center;
95
+ margin: 12px auto;
96
+ padding: 8px 12px;
97
+ max-width: 90%;
98
+ white-space: normal;
99
+ }
100
+ .pde-frac { display: inline-block; vertical-align: middle; text-align: center; margin: 0 2px; line-height: 1.15; }
101
+ .pde-frac-num { display: block; border-bottom: 1.5px solid currentColor; padding: 0 5px 1px; }
102
+ .pde-frac-den { display: block; padding: 1px 5px 0; }
103
+ .pde-sqrt { display: inline-flex; align-items: stretch; vertical-align: middle; }
104
+ .pde-sqrt-sym { width: 0.62em; min-height: 1.05em; flex-shrink: 0; display: block; overflow: visible; }
105
+ .pde-sqrt-inner { border-top: 1.35px solid currentColor; padding: 0.08em 0.28em 0.06em 0.04em; margin-left: -1px; line-height: 1.2; }
106
+ `;
107
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/equation/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC;AAErC,MAAM,kBAAkB,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;AAEhJ,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC;IACtC,QAAQ;IACR,QAAQ;IACR,OAAO;IACP,OAAO;IACP,SAAS;IACT,QAAQ;IACR,SAAS;IACT,SAAS;IACT,WAAW;IACX,MAAM;IACN,SAAS;IACT,UAAU;IACV,MAAM;IACN,SAAS;IACT,SAAS;IACT,QAAQ;IACR,SAAS;IACT,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,SAAS;IACT,cAAc;IACd,QAAQ;IACR,SAAS;CACV,CAAC,CAAC;AAOH,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,MAAM,MAAM,GAAoC,EAAE,CAAC;IACnD,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;IAC1F,IAAI,KAAK,CAAC,MAAM,GAAG,gBAAgB;QAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,gBAAgB,QAAQ,EAAE,CAAC,CAAC;IACjH,KAAK,MAAM,IAAI,IAAI,kBAAkB,EAAE,CAAC;QACtC,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,aAAa,IAAI,EAAE,EAAE,CAAC,CAAC;IACrG,CAAC;IACD,wBAAwB;IACxB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,EAAE,IAAI,KAAK,EAAE,CAAC;QACvB,IAAI,EAAE,KAAK,GAAG;YAAE,KAAK,EAAE,CAAC;QACxB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,KAAK,EAAE,CAAC;YACR,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;gBACd,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;gBACzE,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,mBAAmB,CAAC,EAAE,CAAC;QACvE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC;AAED,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,OAAO,IAAI,KAAK,GAAG,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqC1B,CAAC"}
@@ -0,0 +1,13 @@
1
+ export type DocEventType = "beforeChange" | "afterChange" | "selectionChange" | "validate";
2
+ export interface DocEvent<T = unknown> {
3
+ type: DocEventType;
4
+ payload: T;
5
+ timestamp: string;
6
+ }
7
+ export type EventHandler<T = unknown> = (e: DocEvent<T>) => void;
8
+ export declare class EventEmitter {
9
+ private handlers;
10
+ on<T>(type: DocEventType, handler: EventHandler<T>): () => void;
11
+ emit<T>(type: DocEventType, payload: T): void;
12
+ }
13
+ //# sourceMappingURL=index.d.ts.map