@kritzel/engine 0.4.31

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 (373) hide show
  1. package/LICENSE.md +50 -0
  2. package/dist/cjs/app-globals-V2Kpy_OQ.js +5 -0
  3. package/dist/cjs/engine.constants-CakmdKMW.js +28206 -0
  4. package/dist/cjs/index-BbbWU2aN.js +1742 -0
  5. package/dist/cjs/index.cjs.js +4232 -0
  6. package/dist/cjs/kritzel-awareness-cursors_5.cjs.entry.js +28004 -0
  7. package/dist/cjs/loader.cjs.js +13 -0
  8. package/dist/cjs/stencil.cjs.js +25 -0
  9. package/dist/collection/classes/core/core.class.js +1389 -0
  10. package/dist/collection/classes/core/reviver.class.js +124 -0
  11. package/dist/collection/classes/core/store.class.js +337 -0
  12. package/dist/collection/classes/core/viewport.class.js +794 -0
  13. package/dist/collection/classes/core/workspace.class.js +112 -0
  14. package/dist/collection/classes/handlers/base.handler.js +20 -0
  15. package/dist/collection/classes/handlers/context-menu.handler.js +170 -0
  16. package/dist/collection/classes/handlers/hover.handler.js +35 -0
  17. package/dist/collection/classes/handlers/key.handler.js +162 -0
  18. package/dist/collection/classes/handlers/line-handle.handler.js +475 -0
  19. package/dist/collection/classes/handlers/move.handler.js +295 -0
  20. package/dist/collection/classes/handlers/resize.handler.js +327 -0
  21. package/dist/collection/classes/handlers/rotation.handler.js +174 -0
  22. package/dist/collection/classes/handlers/selection.handler.js +526 -0
  23. package/dist/collection/classes/managers/anchor.manager.js +1476 -0
  24. package/dist/collection/classes/managers/browser-permission.manager.js +64 -0
  25. package/dist/collection/classes/managers/clipboard.manager.js +346 -0
  26. package/dist/collection/classes/managers/clipboard.types.js +1 -0
  27. package/dist/collection/classes/managers/cursor.manager.js +139 -0
  28. package/dist/collection/classes/managers/license.manager.js +341 -0
  29. package/dist/collection/classes/managers/localization.manager.js +227 -0
  30. package/dist/collection/classes/managers/theme.manager.js +206 -0
  31. package/dist/collection/classes/objects/base-object.class.js +462 -0
  32. package/dist/collection/classes/objects/dynamic-object.class.js +437 -0
  33. package/dist/collection/classes/objects/group.class.js +590 -0
  34. package/dist/collection/classes/objects/image.class.js +500 -0
  35. package/dist/collection/classes/objects/line.class.js +789 -0
  36. package/dist/collection/classes/objects/path.class.js +578 -0
  37. package/dist/collection/classes/objects/selection-box.class.js +32 -0
  38. package/dist/collection/classes/objects/selection-group.class.js +752 -0
  39. package/dist/collection/classes/objects/shape.class.js +628 -0
  40. package/dist/collection/classes/objects/text.class.js +461 -0
  41. package/dist/collection/classes/providers/assets/asset-resolver.class.js +536 -0
  42. package/dist/collection/classes/providers/assets/http-asset-provider.class.js +111 -0
  43. package/dist/collection/classes/providers/assets/indexeddb-asset-provider.class.js +241 -0
  44. package/dist/collection/classes/providers/assets/presigned-asset-provider.class.js +86 -0
  45. package/dist/collection/classes/providers/paste-intent/event-paste-intent.provider.js +48 -0
  46. package/dist/collection/classes/providers/paste-intent/ios-paste-intent.provider.js +16 -0
  47. package/dist/collection/classes/providers/paste-intent/navigator-paste-intent.provider.js +86 -0
  48. package/dist/collection/classes/providers/sync/broadcast-sync-provider.class.js +100 -0
  49. package/dist/collection/classes/providers/sync/hocuspocus-sync-provider.class.js +333 -0
  50. package/dist/collection/classes/providers/sync/in-memory-sync-provider.class.js +69 -0
  51. package/dist/collection/classes/providers/sync/indexeddb-sync-provider.class.js +39 -0
  52. package/dist/collection/classes/providers/sync/websocket-sync-provider.class.js +110 -0
  53. package/dist/collection/classes/registries/dynamic-object-renderer.registry.js +52 -0
  54. package/dist/collection/classes/registries/font-registry.class.js +161 -0
  55. package/dist/collection/classes/registries/icon-registry.class.js +118 -0
  56. package/dist/collection/classes/registries/paste-intent-provider.registry.js +26 -0
  57. package/dist/collection/classes/registries/tool.registry.js +69 -0
  58. package/dist/collection/classes/structures/app-state-map.structure.js +461 -0
  59. package/dist/collection/classes/structures/object-map.structure.js +1103 -0
  60. package/dist/collection/classes/structures/quadtree.structure.js +251 -0
  61. package/dist/collection/classes/tools/base-tool.class.js +88 -0
  62. package/dist/collection/classes/tools/brush-tool.class.js +236 -0
  63. package/dist/collection/classes/tools/eraser-tool.class.js +133 -0
  64. package/dist/collection/classes/tools/image-tool.class.js +152 -0
  65. package/dist/collection/classes/tools/line-tool.class.js +249 -0
  66. package/dist/collection/classes/tools/selection-tool.class.js +611 -0
  67. package/dist/collection/classes/tools/shape-tool.class.js +251 -0
  68. package/dist/collection/classes/tools/text-tool.class.js +179 -0
  69. package/dist/collection/collection-manifest.json +17 -0
  70. package/dist/collection/components/kritzel-awareness-cursors/kritzel-awareness-cursors.css +115 -0
  71. package/dist/collection/components/kritzel-awareness-cursors/kritzel-awareness-cursors.js +380 -0
  72. package/dist/collection/components/kritzel-cursor-trail/kritzel-cursor-trail.css +10 -0
  73. package/dist/collection/components/kritzel-cursor-trail/kritzel-cursor-trail.js +153 -0
  74. package/dist/collection/components/kritzel-engine/kritzel-engine.css +81 -0
  75. package/dist/collection/components/kritzel-engine/kritzel-engine.js +6345 -0
  76. package/dist/collection/components/kritzel-icon/kritzel-icon.css +18 -0
  77. package/dist/collection/components/kritzel-icon/kritzel-icon.js +93 -0
  78. package/dist/collection/components/kritzel-watermark/kritzel-watermark.css +29 -0
  79. package/dist/collection/components/kritzel-watermark/kritzel-watermark.js +83 -0
  80. package/dist/collection/configs/default-asset-storage.config.js +9 -0
  81. package/dist/collection/configs/default-brush-tool.config.js +9 -0
  82. package/dist/collection/configs/default-engine-config.js +73 -0
  83. package/dist/collection/configs/default-line-tool.config.js +12 -0
  84. package/dist/collection/configs/default-shape-tool.config.js +15 -0
  85. package/dist/collection/configs/default-sync.config.js +6 -0
  86. package/dist/collection/configs/default-text-tool.config.js +12 -0
  87. package/dist/collection/constants/color-palette.constants.js +40 -0
  88. package/dist/collection/constants/core.constants.js +1 -0
  89. package/dist/collection/constants/engine.constants.js +4 -0
  90. package/dist/collection/constants/license.constants.js +25 -0
  91. package/dist/collection/constants/schema.constants.js +4 -0
  92. package/dist/collection/constants/storage.constants.js +1 -0
  93. package/dist/collection/constants/stroke-size.constants.js +2 -0
  94. package/dist/collection/constants/text-tool-fonts.constants.js +18 -0
  95. package/dist/collection/constants/version.js +6 -0
  96. package/dist/collection/enums/alignment.enum.js +9 -0
  97. package/dist/collection/enums/event-button.enum.js +6 -0
  98. package/dist/collection/enums/handle-type.enum.js +7 -0
  99. package/dist/collection/enums/shape-type.enum.js +6 -0
  100. package/dist/collection/events/active-workspace-change.event.js +1 -0
  101. package/dist/collection/events/editor-is-ready.event.js +1 -0
  102. package/dist/collection/events/login.event.js +1 -0
  103. package/dist/collection/helpers/alignment.helper.js +73 -0
  104. package/dist/collection/helpers/class.helper.js +5 -0
  105. package/dist/collection/helpers/color.helper.js +106 -0
  106. package/dist/collection/helpers/cursor.helper.js +57 -0
  107. package/dist/collection/helpers/devices.helper.js +28 -0
  108. package/dist/collection/helpers/event.helper.js +58 -0
  109. package/dist/collection/helpers/geometry.helper.js +149 -0
  110. package/dist/collection/helpers/html.helper.js +116 -0
  111. package/dist/collection/helpers/image-file.helper.js +6 -0
  112. package/dist/collection/helpers/keyboard.helper.js +55 -0
  113. package/dist/collection/helpers/localization.helper.js +25 -0
  114. package/dist/collection/helpers/math.helper.js +8 -0
  115. package/dist/collection/helpers/migration.helper.js +45 -0
  116. package/dist/collection/helpers/object.helper.js +29 -0
  117. package/dist/collection/helpers/svg-export.helper.js +655 -0
  118. package/dist/collection/helpers/theme.helper.js +77 -0
  119. package/dist/collection/helpers/tool-config.helper.js +63 -0
  120. package/dist/collection/helpers/wheel.helper.js +113 -0
  121. package/dist/collection/index.js +107 -0
  122. package/dist/collection/interfaces/anchor.interface.js +1 -0
  123. package/dist/collection/interfaces/arrow-head.interface.js +1 -0
  124. package/dist/collection/interfaces/asset-provider.interface.js +1 -0
  125. package/dist/collection/interfaces/asset-storage-config.interface.js +1 -0
  126. package/dist/collection/interfaces/asset.interface.js +1 -0
  127. package/dist/collection/interfaces/bounding-box.interface.js +1 -0
  128. package/dist/collection/interfaces/clonable.interface.js +1 -0
  129. package/dist/collection/interfaces/context-menu-item.interface.js +1 -0
  130. package/dist/collection/interfaces/context-menu-state.interface.js +1 -0
  131. package/dist/collection/interfaces/debug-info.interface.js +1 -0
  132. package/dist/collection/interfaces/dialog.interface.js +1 -0
  133. package/dist/collection/interfaces/document-metadata.interface.js +1 -0
  134. package/dist/collection/interfaces/dynamic-object-renderer.interface.js +1 -0
  135. package/dist/collection/interfaces/engine-state.interface.js +1 -0
  136. package/dist/collection/interfaces/font.interface.js +1 -0
  137. package/dist/collection/interfaces/localization.interface.js +1 -0
  138. package/dist/collection/interfaces/login-config.interface.js +1 -0
  139. package/dist/collection/interfaces/master-detail.interface.js +1 -0
  140. package/dist/collection/interfaces/menu-item.interface.js +1 -0
  141. package/dist/collection/interfaces/migration.interface.js +1 -0
  142. package/dist/collection/interfaces/notification.interface.js +1 -0
  143. package/dist/collection/interfaces/object-change-event.interface.js +1 -0
  144. package/dist/collection/interfaces/object-export.interface.js +1 -0
  145. package/dist/collection/interfaces/object.interface.js +1 -0
  146. package/dist/collection/interfaces/paste-intent-provider.interface.js +1 -0
  147. package/dist/collection/interfaces/point.interface.js +1 -0
  148. package/dist/collection/interfaces/polygon.interface.js +1 -0
  149. package/dist/collection/interfaces/remote-cursor.interface.js +1 -0
  150. package/dist/collection/interfaces/selection-state.interface.js +1 -0
  151. package/dist/collection/interfaces/serializable.interface.js +1 -0
  152. package/dist/collection/interfaces/settings.interface.js +1 -0
  153. package/dist/collection/interfaces/share.interface.js +1 -0
  154. package/dist/collection/interfaces/shortcut.interface.js +1 -0
  155. package/dist/collection/interfaces/sync-config.interface.js +21 -0
  156. package/dist/collection/interfaces/sync-provider.interface.js +1 -0
  157. package/dist/collection/interfaces/theme.interface.js +1 -0
  158. package/dist/collection/interfaces/tool-config.interface.js +1 -0
  159. package/dist/collection/interfaces/tool-type.interface.js +1 -0
  160. package/dist/collection/interfaces/tool.interface.js +1 -0
  161. package/dist/collection/interfaces/toolbar-item.interface.js +1 -0
  162. package/dist/collection/interfaces/undo-state.interface.js +1 -0
  163. package/dist/collection/interfaces/user.interface.js +1 -0
  164. package/dist/collection/interfaces/viewport-state.interface.js +1 -0
  165. package/dist/collection/locales/de-locale.js +119 -0
  166. package/dist/collection/locales/en-locale.js +120 -0
  167. package/dist/collection/locales/fr-locale.js +119 -0
  168. package/dist/collection/migrations/app-state.migrations.js +47 -0
  169. package/dist/collection/migrations/workspace.migrations.js +67 -0
  170. package/dist/collection/themes/dark-theme.js +340 -0
  171. package/dist/collection/themes/light-theme.js +346 -0
  172. package/dist/collection/types/deep-readonly.type.js +1 -0
  173. package/dist/collection/types/state.types.js +1 -0
  174. package/dist/components/index.d.ts +47 -0
  175. package/dist/components/index.js +4143 -0
  176. package/dist/components/kritzel-awareness-cursors.d.ts +11 -0
  177. package/dist/components/kritzel-awareness-cursors.js +6 -0
  178. package/dist/components/kritzel-cursor-trail.d.ts +11 -0
  179. package/dist/components/kritzel-cursor-trail.js +6 -0
  180. package/dist/components/kritzel-engine.d.ts +11 -0
  181. package/dist/components/kritzel-engine.js +52641 -0
  182. package/dist/components/kritzel-icon.d.ts +11 -0
  183. package/dist/components/kritzel-icon.js +6 -0
  184. package/dist/components/kritzel-watermark.d.ts +11 -0
  185. package/dist/components/kritzel-watermark.js +6 -0
  186. package/dist/components/p-B2Htv9ou.js +49 -0
  187. package/dist/components/p-BvRGQvVI.js +3456 -0
  188. package/dist/components/p-CfSx6HU_.js +1469 -0
  189. package/dist/components/p-YP8wAcF4.js +122 -0
  190. package/dist/components/p-fx6msYHJ.js +167 -0
  191. package/dist/esm/app-globals-DQuL1Twl.js +3 -0
  192. package/dist/esm/engine.constants-Bl5-pbq-.js +28143 -0
  193. package/dist/esm/index-BU9Mv7y0.js +1715 -0
  194. package/dist/esm/index.js +4134 -0
  195. package/dist/esm/kritzel-awareness-cursors_5.entry.js +27978 -0
  196. package/dist/esm/loader.js +11 -0
  197. package/dist/esm/stencil.js +21 -0
  198. package/dist/index.cjs.js +1 -0
  199. package/dist/index.js +1 -0
  200. package/dist/stencil/index.esm.js +4134 -0
  201. package/dist/stencil/p-BU9Mv7y0.js +1702 -0
  202. package/dist/stencil/p-Bl5-pbq-.js +28143 -0
  203. package/dist/stencil/p-DQuL1Twl.js +3 -0
  204. package/dist/stencil/p-f0a8b7af.entry.js +27978 -0
  205. package/dist/stencil/stencil.esm.js +21 -0
  206. package/dist/types/classes/core/core.class.d.ts +532 -0
  207. package/dist/types/classes/core/reviver.class.d.ts +32 -0
  208. package/dist/types/classes/core/store.class.d.ts +198 -0
  209. package/dist/types/classes/core/viewport.class.d.ts +256 -0
  210. package/dist/types/classes/core/workspace.class.d.ts +95 -0
  211. package/dist/types/classes/handlers/base.handler.d.ts +18 -0
  212. package/dist/types/classes/handlers/context-menu.handler.d.ts +67 -0
  213. package/dist/types/classes/handlers/hover.handler.d.ts +23 -0
  214. package/dist/types/classes/handlers/key.handler.d.ts +44 -0
  215. package/dist/types/classes/handlers/line-handle.handler.d.ts +115 -0
  216. package/dist/types/classes/handlers/move.handler.d.ts +94 -0
  217. package/dist/types/classes/handlers/resize.handler.d.ts +95 -0
  218. package/dist/types/classes/handlers/rotation.handler.d.ts +50 -0
  219. package/dist/types/classes/handlers/selection.handler.d.ts +153 -0
  220. package/dist/types/classes/managers/anchor.manager.d.ts +513 -0
  221. package/dist/types/classes/managers/browser-permission.manager.d.ts +41 -0
  222. package/dist/types/classes/managers/clipboard.manager.d.ts +71 -0
  223. package/dist/types/classes/managers/clipboard.types.d.ts +23 -0
  224. package/dist/types/classes/managers/cursor.manager.d.ts +66 -0
  225. package/dist/types/classes/managers/license.manager.d.ts +147 -0
  226. package/dist/types/classes/managers/localization.manager.d.ts +145 -0
  227. package/dist/types/classes/managers/theme.manager.d.ts +112 -0
  228. package/dist/types/classes/objects/base-object.class.d.ts +266 -0
  229. package/dist/types/classes/objects/dynamic-object.class.d.ts +148 -0
  230. package/dist/types/classes/objects/group.class.d.ts +231 -0
  231. package/dist/types/classes/objects/image.class.d.ts +246 -0
  232. package/dist/types/classes/objects/line.class.d.ts +285 -0
  233. package/dist/types/classes/objects/path.class.d.ts +220 -0
  234. package/dist/types/classes/objects/selection-box.class.d.ts +19 -0
  235. package/dist/types/classes/objects/selection-group.class.d.ts +267 -0
  236. package/dist/types/classes/objects/shape.class.d.ts +322 -0
  237. package/dist/types/classes/objects/text.class.d.ts +197 -0
  238. package/dist/types/classes/providers/assets/asset-resolver.class.d.ts +141 -0
  239. package/dist/types/classes/providers/assets/http-asset-provider.class.d.ts +79 -0
  240. package/dist/types/classes/providers/assets/indexeddb-asset-provider.class.d.ts +69 -0
  241. package/dist/types/classes/providers/assets/presigned-asset-provider.class.d.ts +69 -0
  242. package/dist/types/classes/providers/paste-intent/event-paste-intent.provider.d.ts +8 -0
  243. package/dist/types/classes/providers/paste-intent/ios-paste-intent.provider.d.ts +6 -0
  244. package/dist/types/classes/providers/paste-intent/navigator-paste-intent.provider.d.ts +9 -0
  245. package/dist/types/classes/providers/sync/broadcast-sync-provider.class.d.ts +23 -0
  246. package/dist/types/classes/providers/sync/hocuspocus-sync-provider.class.d.ts +163 -0
  247. package/dist/types/classes/providers/sync/in-memory-sync-provider.class.d.ts +39 -0
  248. package/dist/types/classes/providers/sync/indexeddb-sync-provider.class.d.ts +25 -0
  249. package/dist/types/classes/providers/sync/websocket-sync-provider.class.d.ts +63 -0
  250. package/dist/types/classes/registries/dynamic-object-renderer.registry.d.ts +32 -0
  251. package/dist/types/classes/registries/font-registry.class.d.ts +19 -0
  252. package/dist/types/classes/registries/icon-registry.class.d.ts +39 -0
  253. package/dist/types/classes/registries/paste-intent-provider.registry.d.ts +10 -0
  254. package/dist/types/classes/registries/tool.registry.d.ts +53 -0
  255. package/dist/types/classes/structures/app-state-map.structure.d.ts +171 -0
  256. package/dist/types/classes/structures/object-map.structure.d.ts +403 -0
  257. package/dist/types/classes/structures/quadtree.structure.d.ts +128 -0
  258. package/dist/types/classes/tools/base-tool.class.d.ts +72 -0
  259. package/dist/types/classes/tools/brush-tool.class.d.ts +68 -0
  260. package/dist/types/classes/tools/eraser-tool.class.d.ts +38 -0
  261. package/dist/types/classes/tools/image-tool.class.d.ts +74 -0
  262. package/dist/types/classes/tools/line-tool.class.d.ts +63 -0
  263. package/dist/types/classes/tools/selection-tool.class.d.ts +188 -0
  264. package/dist/types/classes/tools/shape-tool.class.d.ts +90 -0
  265. package/dist/types/classes/tools/text-tool.class.d.ts +66 -0
  266. package/dist/types/components/kritzel-awareness-cursors/kritzel-awareness-cursors.d.ts +29 -0
  267. package/dist/types/components/kritzel-cursor-trail/kritzel-cursor-trail.d.ts +19 -0
  268. package/dist/types/components/kritzel-engine/kritzel-engine.d.ts +695 -0
  269. package/dist/types/components/kritzel-icon/kritzel-icon.d.ts +6 -0
  270. package/dist/types/components/kritzel-watermark/kritzel-watermark.d.ts +20 -0
  271. package/dist/types/components.d.ts +981 -0
  272. package/dist/types/configs/default-asset-storage.config.d.ts +8 -0
  273. package/dist/types/configs/default-brush-tool.config.d.ts +2 -0
  274. package/dist/types/configs/default-engine-config.d.ts +2 -0
  275. package/dist/types/configs/default-line-tool.config.d.ts +2 -0
  276. package/dist/types/configs/default-shape-tool.config.d.ts +2 -0
  277. package/dist/types/configs/default-sync.config.d.ts +5 -0
  278. package/dist/types/configs/default-text-tool.config.d.ts +2 -0
  279. package/dist/types/constants/color-palette.constants.d.ts +31 -0
  280. package/dist/types/constants/core.constants.d.ts +0 -0
  281. package/dist/types/constants/engine.constants.d.ts +4 -0
  282. package/dist/types/constants/license.constants.d.ts +25 -0
  283. package/dist/types/constants/schema.constants.d.ts +4 -0
  284. package/dist/types/constants/storage.constants.d.ts +1 -0
  285. package/dist/types/constants/stroke-size.constants.d.ts +2 -0
  286. package/dist/types/constants/text-tool-fonts.constants.d.ts +3 -0
  287. package/dist/types/constants/version.d.ts +6 -0
  288. package/dist/types/enums/alignment.enum.d.ts +8 -0
  289. package/dist/types/enums/event-button.enum.d.ts +5 -0
  290. package/dist/types/enums/handle-type.enum.d.ts +6 -0
  291. package/dist/types/enums/shape-type.enum.d.ts +5 -0
  292. package/dist/types/events/active-workspace-change.event.d.ts +7 -0
  293. package/dist/types/events/editor-is-ready.event.d.ts +18 -0
  294. package/dist/types/events/login.event.d.ts +3 -0
  295. package/dist/types/helpers/alignment.helper.d.ts +21 -0
  296. package/dist/types/helpers/class.helper.d.ts +3 -0
  297. package/dist/types/helpers/color.helper.d.ts +34 -0
  298. package/dist/types/helpers/cursor.helper.d.ts +22 -0
  299. package/dist/types/helpers/devices.helper.d.ts +8 -0
  300. package/dist/types/helpers/event.helper.d.ts +6 -0
  301. package/dist/types/helpers/geometry.helper.d.ts +38 -0
  302. package/dist/types/helpers/html.helper.d.ts +8 -0
  303. package/dist/types/helpers/image-file.helper.d.ts +3 -0
  304. package/dist/types/helpers/keyboard.helper.d.ts +6 -0
  305. package/dist/types/helpers/localization.helper.d.ts +18 -0
  306. package/dist/types/helpers/math.helper.d.ts +4 -0
  307. package/dist/types/helpers/migration.helper.d.ts +30 -0
  308. package/dist/types/helpers/object.helper.d.ts +9 -0
  309. package/dist/types/helpers/svg-export.helper.d.ts +231 -0
  310. package/dist/types/helpers/theme.helper.d.ts +42 -0
  311. package/dist/types/helpers/tool-config.helper.d.ts +4 -0
  312. package/dist/types/helpers/wheel.helper.d.ts +9 -0
  313. package/dist/types/index.d.ts +109 -0
  314. package/dist/types/interfaces/anchor.interface.d.ts +147 -0
  315. package/dist/types/interfaces/arrow-head.interface.d.ts +27 -0
  316. package/dist/types/interfaces/asset-provider.interface.d.ts +88 -0
  317. package/dist/types/interfaces/asset-storage-config.interface.d.ts +40 -0
  318. package/dist/types/interfaces/asset.interface.d.ts +43 -0
  319. package/dist/types/interfaces/bounding-box.interface.d.ts +8 -0
  320. package/dist/types/interfaces/clonable.interface.d.ts +3 -0
  321. package/dist/types/interfaces/context-menu-item.interface.d.ts +25 -0
  322. package/dist/types/interfaces/context-menu-state.interface.d.ts +16 -0
  323. package/dist/types/interfaces/debug-info.interface.d.ts +7 -0
  324. package/dist/types/interfaces/dialog.interface.d.ts +4 -0
  325. package/dist/types/interfaces/document-metadata.interface.d.ts +6 -0
  326. package/dist/types/interfaces/dynamic-object-renderer.interface.d.ts +40 -0
  327. package/dist/types/interfaces/engine-state.interface.d.ts +82 -0
  328. package/dist/types/interfaces/font.interface.d.ts +15 -0
  329. package/dist/types/interfaces/localization.interface.d.ts +143 -0
  330. package/dist/types/interfaces/login-config.interface.d.ts +24 -0
  331. package/dist/types/interfaces/master-detail.interface.d.ts +14 -0
  332. package/dist/types/interfaces/menu-item.interface.d.ts +27 -0
  333. package/dist/types/interfaces/migration.interface.d.ts +16 -0
  334. package/dist/types/interfaces/notification.interface.d.ts +10 -0
  335. package/dist/types/interfaces/object-change-event.interface.d.ts +31 -0
  336. package/dist/types/interfaces/object-export.interface.d.ts +20 -0
  337. package/dist/types/interfaces/object.interface.d.ts +53 -0
  338. package/dist/types/interfaces/paste-intent-provider.interface.d.ts +10 -0
  339. package/dist/types/interfaces/point.interface.d.ts +4 -0
  340. package/dist/types/interfaces/polygon.interface.d.ts +7 -0
  341. package/dist/types/interfaces/remote-cursor.interface.d.ts +18 -0
  342. package/dist/types/interfaces/selection-state.interface.d.ts +7 -0
  343. package/dist/types/interfaces/serializable.interface.d.ts +5 -0
  344. package/dist/types/interfaces/settings.interface.d.ts +25 -0
  345. package/dist/types/interfaces/share.interface.d.ts +9 -0
  346. package/dist/types/interfaces/shortcut.interface.d.ts +10 -0
  347. package/dist/types/interfaces/sync-config.interface.d.ts +41 -0
  348. package/dist/types/interfaces/sync-provider.interface.d.ts +66 -0
  349. package/dist/types/interfaces/theme.interface.d.ts +553 -0
  350. package/dist/types/interfaces/tool-config.interface.d.ts +24 -0
  351. package/dist/types/interfaces/tool-type.interface.d.ts +1 -0
  352. package/dist/types/interfaces/tool.interface.d.ts +8 -0
  353. package/dist/types/interfaces/toolbar-item.interface.d.ts +66 -0
  354. package/dist/types/interfaces/undo-state.interface.d.ts +6 -0
  355. package/dist/types/interfaces/user.interface.d.ts +22 -0
  356. package/dist/types/interfaces/viewport-state.interface.d.ts +7 -0
  357. package/dist/types/locales/de-locale.d.ts +5 -0
  358. package/dist/types/locales/en-locale.d.ts +6 -0
  359. package/dist/types/locales/fr-locale.d.ts +5 -0
  360. package/dist/types/migrations/app-state.migrations.d.ts +11 -0
  361. package/dist/types/migrations/workspace.migrations.d.ts +11 -0
  362. package/dist/types/stencil-public-runtime.d.ts +1873 -0
  363. package/dist/types/themes/dark-theme.d.ts +5 -0
  364. package/dist/types/themes/light-theme.d.ts +5 -0
  365. package/dist/types/types/deep-readonly.type.d.ts +7 -0
  366. package/dist/types/types/state.types.d.ts +3 -0
  367. package/loader/cdn.js +1 -0
  368. package/loader/index.cjs.js +1 -0
  369. package/loader/index.d.ts +24 -0
  370. package/loader/index.es2017.js +1 -0
  371. package/loader/index.js +2 -0
  372. package/package.json +101 -0
  373. package/readme.md +11 -0
@@ -0,0 +1,241 @@
1
+ /** Default database name used by IndexedDBAssetProvider. */
2
+ const DEFAULT_DB_NAME = 'kritzel-assets';
3
+ /** Object store holding the binary payloads. */
4
+ const BLOB_STORE = 'blobs';
5
+ /** Object store holding the asset metadata. */
6
+ const META_STORE = 'metadata';
7
+ /** Database schema version. Increment when changing store layout. */
8
+ const DB_VERSION = 1;
9
+ /**
10
+ * Local-only asset storage provider backed by IndexedDB.
11
+ *
12
+ * Stores asset blobs and metadata in a dedicated database (separate from
13
+ * the Yjs IndexedDB sync provider). Resolved URLs are `blob:` object URLs
14
+ * created on demand and cached to avoid redundant allocations.
15
+ *
16
+ * This provider is always-safe to include in an asset storage config; it
17
+ * doubles as an offline cache when combined with a remote provider.
18
+ */
19
+ export class IndexedDBAssetProvider {
20
+ type = 'local';
21
+ name = 'IndexedDBAssetProvider';
22
+ _dbName;
23
+ _db = null;
24
+ /** In-memory cache of id -> object URL to avoid re-creating blob URLs. */
25
+ _urlCache = new Map();
26
+ /** In-memory known-present ids to let `canResolve` answer synchronously. */
27
+ _knownIds = new Set();
28
+ constructor(options) {
29
+ this._dbName = options?.dbName ?? DEFAULT_DB_NAME;
30
+ }
31
+ /**
32
+ * Factory helper enabling use as `IndexedDBAssetProvider.with({ dbName: '...' })`
33
+ * inside a `KritzelAssetStorageConfig.providers` array.
34
+ */
35
+ static with(options) {
36
+ return { create: () => new IndexedDBAssetProvider(options) };
37
+ }
38
+ async init() {
39
+ if (this._db)
40
+ return;
41
+ this._db = await this.openDatabase();
42
+ // Warm up the known-ids cache so canResolve can answer synchronously.
43
+ await this.loadKnownIds();
44
+ }
45
+ destroy() {
46
+ for (const url of this._urlCache.values()) {
47
+ try {
48
+ URL.revokeObjectURL(url);
49
+ }
50
+ catch {
51
+ /* ignore */
52
+ }
53
+ }
54
+ this._urlCache.clear();
55
+ this._knownIds.clear();
56
+ if (this._db) {
57
+ this._db.close();
58
+ this._db = null;
59
+ }
60
+ }
61
+ canResolve(id) {
62
+ return this._knownIds.has(id);
63
+ }
64
+ async put(blob, metadata) {
65
+ const db = await this.ensureDb();
66
+ const id = metadata.id ?? this.generateUuid();
67
+ const asset = {
68
+ id,
69
+ kind: metadata.kind ?? 'file',
70
+ mimeType: metadata.mimeType,
71
+ size: blob.size,
72
+ createdAt: Date.now(),
73
+ width: metadata.width,
74
+ height: metadata.height,
75
+ durationMs: metadata.durationMs,
76
+ originalFilename: metadata.originalFilename,
77
+ };
78
+ await new Promise((resolve, reject) => {
79
+ const tx = db.transaction([BLOB_STORE, META_STORE], 'readwrite');
80
+ tx.oncomplete = () => resolve();
81
+ tx.onerror = () => reject(tx.error);
82
+ tx.onabort = () => reject(tx.error);
83
+ tx.objectStore(BLOB_STORE).put(blob, id);
84
+ tx.objectStore(META_STORE).put(asset, id);
85
+ });
86
+ this._knownIds.add(id);
87
+ return asset;
88
+ }
89
+ async resolve(id) {
90
+ const cached = this._urlCache.get(id);
91
+ if (cached)
92
+ return cached;
93
+ const blob = await this.fetch(id);
94
+ const url = URL.createObjectURL(blob);
95
+ this._urlCache.set(id, url);
96
+ return url;
97
+ }
98
+ async fetch(id) {
99
+ const db = await this.ensureDb();
100
+ const blob = await new Promise((resolve, reject) => {
101
+ const tx = db.transaction(BLOB_STORE, 'readonly');
102
+ const req = tx.objectStore(BLOB_STORE).get(id);
103
+ req.onsuccess = () => resolve(req.result);
104
+ req.onerror = () => reject(req.error);
105
+ });
106
+ if (!blob) {
107
+ throw new Error(`[IndexedDBAssetProvider] Asset ${id} not found`);
108
+ }
109
+ this._knownIds.add(id);
110
+ return blob;
111
+ }
112
+ async delete(id) {
113
+ const db = await this.ensureDb();
114
+ await new Promise((resolve, reject) => {
115
+ const tx = db.transaction([BLOB_STORE, META_STORE], 'readwrite');
116
+ tx.oncomplete = () => resolve();
117
+ tx.onerror = () => reject(tx.error);
118
+ tx.objectStore(BLOB_STORE).delete(id);
119
+ tx.objectStore(META_STORE).delete(id);
120
+ });
121
+ const url = this._urlCache.get(id);
122
+ if (url) {
123
+ try {
124
+ URL.revokeObjectURL(url);
125
+ }
126
+ catch {
127
+ /* ignore */
128
+ }
129
+ this._urlCache.delete(id);
130
+ }
131
+ this._knownIds.delete(id);
132
+ }
133
+ /**
134
+ * Returns the metadata record for a stored asset, or `undefined` when
135
+ * the asset is not present locally.
136
+ */
137
+ async getMetadata(id) {
138
+ const db = await this.ensureDb();
139
+ return new Promise((resolve, reject) => {
140
+ const tx = db.transaction(META_STORE, 'readonly');
141
+ const req = tx.objectStore(META_STORE).get(id);
142
+ req.onsuccess = () => resolve(req.result);
143
+ req.onerror = () => reject(req.error);
144
+ });
145
+ }
146
+ /**
147
+ * Returns every stored asset that still has one or more remote
148
+ * providers marked as pending. Used by the resolver on init to
149
+ * re-enqueue uploads that were interrupted (e.g. the user reloaded
150
+ * the tab while a background upload was retrying).
151
+ */
152
+ async listAssetsWithPendingRemotes() {
153
+ const db = await this.ensureDb();
154
+ return new Promise((resolve, reject) => {
155
+ const tx = db.transaction(META_STORE, 'readonly');
156
+ const req = tx.objectStore(META_STORE).getAll();
157
+ req.onsuccess = () => {
158
+ const all = req.result ?? [];
159
+ resolve(all.filter(a => Array.isArray(a.pendingRemotes) && a.pendingRemotes.length > 0));
160
+ };
161
+ req.onerror = () => reject(req.error);
162
+ });
163
+ }
164
+ /**
165
+ * Replaces the `pendingRemotes` list on an asset's metadata record.
166
+ * Passing an empty array clears the pending flag entirely.
167
+ */
168
+ async setPendingRemotes(id, providerNames) {
169
+ const db = await this.ensureDb();
170
+ await new Promise((resolve, reject) => {
171
+ const tx = db.transaction(META_STORE, 'readwrite');
172
+ tx.oncomplete = () => resolve();
173
+ tx.onerror = () => reject(tx.error);
174
+ const store = tx.objectStore(META_STORE);
175
+ const req = store.get(id);
176
+ req.onsuccess = () => {
177
+ const existing = req.result;
178
+ if (!existing)
179
+ return; // Asset gone; nothing to update.
180
+ const updated = { ...existing };
181
+ if (providerNames.length > 0) {
182
+ updated.pendingRemotes = providerNames;
183
+ }
184
+ else {
185
+ delete updated.pendingRemotes;
186
+ }
187
+ store.put(updated, id);
188
+ };
189
+ });
190
+ }
191
+ async ensureDb() {
192
+ if (!this._db) {
193
+ await this.init();
194
+ }
195
+ return this._db;
196
+ }
197
+ openDatabase() {
198
+ return new Promise((resolve, reject) => {
199
+ const req = indexedDB.open(this._dbName, DB_VERSION);
200
+ req.onupgradeneeded = () => {
201
+ const db = req.result;
202
+ if (!db.objectStoreNames.contains(BLOB_STORE)) {
203
+ db.createObjectStore(BLOB_STORE);
204
+ }
205
+ if (!db.objectStoreNames.contains(META_STORE)) {
206
+ db.createObjectStore(META_STORE);
207
+ }
208
+ };
209
+ req.onsuccess = () => resolve(req.result);
210
+ req.onerror = () => reject(req.error);
211
+ });
212
+ }
213
+ async loadKnownIds() {
214
+ const db = this._db;
215
+ if (!db)
216
+ return;
217
+ await new Promise((resolve, reject) => {
218
+ const tx = db.transaction(META_STORE, 'readonly');
219
+ const req = tx.objectStore(META_STORE).getAllKeys();
220
+ req.onsuccess = () => {
221
+ for (const key of req.result) {
222
+ if (typeof key === 'string')
223
+ this._knownIds.add(key);
224
+ }
225
+ resolve();
226
+ };
227
+ req.onerror = () => reject(req.error);
228
+ });
229
+ }
230
+ generateUuid() {
231
+ if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {
232
+ return crypto.randomUUID();
233
+ }
234
+ // Fallback for environments without crypto.randomUUID (e.g. older jsdom).
235
+ const bytes = crypto.getRandomValues(new Uint8Array(16));
236
+ bytes[6] = (bytes[6] & 0x0f) | 0x40;
237
+ bytes[8] = (bytes[8] & 0x3f) | 0x80;
238
+ const hex = Array.from(bytes, b => b.toString(16).padStart(2, '0')).join('');
239
+ return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
240
+ }
241
+ }
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Remote asset storage provider for pre-signed URL uploads (S3, GCS, ...).
3
+ *
4
+ * All auth and URL signing is performed by the host application via the
5
+ * callbacks in {@link PresignedAssetProviderOptions}. The library simply
6
+ * PUTs/POSTs bytes to the provided URL.
7
+ */
8
+ export class PresignedAssetProvider {
9
+ type = 'remote';
10
+ name = 'PresignedAssetProvider';
11
+ _options;
12
+ constructor(options) {
13
+ this._options = options;
14
+ }
15
+ static with(options) {
16
+ return { create: () => new PresignedAssetProvider(options) };
17
+ }
18
+ async init() {
19
+ if (!this._options.quiet) {
20
+ console.info('PresignedAssetProvider initialized');
21
+ }
22
+ }
23
+ destroy() {
24
+ // No-op.
25
+ }
26
+ canResolve(_id) {
27
+ return true;
28
+ }
29
+ async put(blob, metadata) {
30
+ const descriptor = await this._options.getUploadDescriptor(metadata);
31
+ const method = descriptor.method ?? 'PUT';
32
+ const headers = { ...(descriptor.headers ?? {}) };
33
+ if (!headers['Content-Type'] && !headers['content-type']) {
34
+ headers['Content-Type'] = metadata.mimeType;
35
+ }
36
+ let body;
37
+ if (method === 'POST' && descriptor.fields) {
38
+ const form = new FormData();
39
+ for (const [key, value] of Object.entries(descriptor.fields)) {
40
+ form.append(key, value);
41
+ }
42
+ form.append('file', blob);
43
+ body = form;
44
+ // Browser sets multipart boundary; avoid forcing content-type.
45
+ delete headers['Content-Type'];
46
+ delete headers['content-type'];
47
+ }
48
+ else {
49
+ body = blob;
50
+ }
51
+ const res = await fetch(descriptor.url, { method, headers, body });
52
+ if (!res.ok) {
53
+ throw new Error(`[PresignedAssetProvider] Upload failed: ${res.status} ${res.statusText}`);
54
+ }
55
+ return {
56
+ id: descriptor.id,
57
+ kind: metadata.kind ?? 'file',
58
+ mimeType: metadata.mimeType,
59
+ size: blob.size,
60
+ createdAt: Date.now(),
61
+ width: metadata.width,
62
+ height: metadata.height,
63
+ durationMs: metadata.durationMs,
64
+ originalFilename: metadata.originalFilename,
65
+ };
66
+ }
67
+ async resolve(id) {
68
+ return this._options.getDownloadUrl(id);
69
+ }
70
+ async fetch(id) {
71
+ const url = await this._options.getDownloadUrl(id);
72
+ const res = await fetch(url);
73
+ if (!res.ok) {
74
+ throw new Error(`[PresignedAssetProvider] Failed to fetch asset ${id}: ${res.status} ${res.statusText}`);
75
+ }
76
+ return res.blob();
77
+ }
78
+ async delete(id) {
79
+ if (!this._options.deleteAsset)
80
+ return;
81
+ await this._options.deleteAsset(id);
82
+ if (!this._options.quiet) {
83
+ console.info(`PresignedAssetProvider: deleted asset ${id}`);
84
+ }
85
+ }
86
+ }
@@ -0,0 +1,48 @@
1
+ import { CLIPBOARD_PAYLOAD_PREFIX } from "../../managers/clipboard.types";
2
+ export class KritzelEventPasteIntentProvider {
3
+ canHandle(context) {
4
+ return !!context.event?.clipboardData;
5
+ }
6
+ async getPasteIntent(context) {
7
+ const data = context.event?.clipboardData;
8
+ if (!data) {
9
+ return { type: 'unknown' };
10
+ }
11
+ const imageFiles = Array.from(data.files ?? []).filter(file => file.type.startsWith('image/'));
12
+ if (imageFiles.length > 0) {
13
+ return { type: 'image_files', files: imageFiles };
14
+ }
15
+ if (data.types.includes('text/plain')) {
16
+ const textIntent = this.determineTextPasteIntent(data.getData('text/plain'));
17
+ if (textIntent) {
18
+ return textIntent;
19
+ }
20
+ }
21
+ return { type: 'unknown' };
22
+ }
23
+ parseClipboardPayload(text) {
24
+ if (!text || !text.startsWith(CLIPBOARD_PAYLOAD_PREFIX)) {
25
+ return null;
26
+ }
27
+ try {
28
+ const parsed = JSON.parse(text.slice(CLIPBOARD_PAYLOAD_PREFIX.length));
29
+ if (parsed?.version !== 1 || !Array.isArray(parsed.objects)) {
30
+ return null;
31
+ }
32
+ return parsed;
33
+ }
34
+ catch {
35
+ return null;
36
+ }
37
+ }
38
+ determineTextPasteIntent(text) {
39
+ const payload = this.parseClipboardPayload(text);
40
+ if (payload) {
41
+ return { type: 'kritzel_objects', payload };
42
+ }
43
+ if (text && text.trim().length > 0) {
44
+ return { type: 'plain_text', text };
45
+ }
46
+ return null;
47
+ }
48
+ }
@@ -0,0 +1,16 @@
1
+ import { KritzelDevicesHelper } from "../../../helpers/devices.helper";
2
+ export class KritzelIosPasteIntentProvider {
3
+ canHandle(context) {
4
+ return !context.event?.clipboardData && KritzelDevicesHelper.isIOS();
5
+ }
6
+ async getPasteIntent(context) {
7
+ // On iOS Safari, eventless programmatic clipboard reads are commonly unavailable
8
+ // (e.g. the context-menu paste calls engine.paste() without a native ClipboardEvent).
9
+ // Fall back to the in-memory session buffer so internal object copy/paste still works.
10
+ const payload = context.core.clipboardManager.sessionClipboardPayload;
11
+ if (payload) {
12
+ return { type: 'kritzel_objects', payload };
13
+ }
14
+ return { type: 'unknown' };
15
+ }
16
+ }
@@ -0,0 +1,86 @@
1
+ import { CLIPBOARD_PAYLOAD_PREFIX } from "../../managers/clipboard.types";
2
+ export class KritzelNavigatorPasteIntentProvider {
3
+ canHandle(context) {
4
+ return !context.event?.clipboardData && typeof navigator !== 'undefined' && !!navigator.clipboard;
5
+ }
6
+ async getPasteIntent(context) {
7
+ if (typeof navigator === 'undefined' || !navigator.clipboard) {
8
+ return { type: 'unknown' };
9
+ }
10
+ const { clipboard } = navigator;
11
+ const permissionState = await context.core.permissionManager.checkPermission('clipboard-read');
12
+ if (permissionState !== 'granted') {
13
+ const requestedState = await context.core.permissionManager.requestPermission('clipboard-read');
14
+ if (requestedState !== 'granted') {
15
+ return { type: 'unknown' };
16
+ }
17
+ }
18
+ if (clipboard.read) {
19
+ try {
20
+ const items = await clipboard.read();
21
+ const { imageFiles, text } = await this.processClipboardItems(items);
22
+ if (imageFiles.length > 0) {
23
+ return { type: 'image_files', files: imageFiles };
24
+ }
25
+ if (text !== null) {
26
+ const textIntent = this.determineTextPasteIntent(text);
27
+ if (textIntent) {
28
+ return textIntent;
29
+ }
30
+ }
31
+ }
32
+ catch {
33
+ // Fall back to readText below when read() is denied or unavailable at runtime.
34
+ }
35
+ }
36
+ if (clipboard.readText) {
37
+ const textIntent = this.determineTextPasteIntent(await clipboard.readText());
38
+ if (textIntent) {
39
+ return textIntent;
40
+ }
41
+ }
42
+ return { type: 'unknown' };
43
+ }
44
+ async processClipboardItems(items) {
45
+ const imageFiles = [];
46
+ let text = null;
47
+ await Promise.all(items.map(async (item) => {
48
+ const imageType = item.types.find(type => type.startsWith('image/'));
49
+ if (imageType) {
50
+ const blob = await item.getType(imageType);
51
+ imageFiles.push(new File([blob], 'pasted-image', { type: imageType }));
52
+ return;
53
+ }
54
+ if (text === null && item.types.includes('text/plain')) {
55
+ const blob = await item.getType('text/plain');
56
+ text = await blob.text();
57
+ }
58
+ }));
59
+ return { imageFiles, text };
60
+ }
61
+ parseClipboardPayload(text) {
62
+ if (!text || !text.startsWith(CLIPBOARD_PAYLOAD_PREFIX)) {
63
+ return null;
64
+ }
65
+ try {
66
+ const parsed = JSON.parse(text.slice(CLIPBOARD_PAYLOAD_PREFIX.length));
67
+ if (parsed?.version !== 1 || !Array.isArray(parsed.objects)) {
68
+ return null;
69
+ }
70
+ return parsed;
71
+ }
72
+ catch {
73
+ return null;
74
+ }
75
+ }
76
+ determineTextPasteIntent(text) {
77
+ const payload = this.parseClipboardPayload(text);
78
+ if (payload) {
79
+ return { type: 'kritzel_objects', payload };
80
+ }
81
+ if (text && text.trim().length > 0) {
82
+ return { type: 'plain_text', text };
83
+ }
84
+ return null;
85
+ }
86
+ }
@@ -0,0 +1,100 @@
1
+ import * as Y from "yjs";
2
+ import * as encoding from "lib0/encoding";
3
+ import * as decoding from "lib0/decoding";
4
+ /**
5
+ * BroadcastChannel sync provider for cross-tab synchronization
6
+ * This is a lightweight alternative to y-webrtc for browser-tab-only sync
7
+ */
8
+ export class BroadcastSyncProvider {
9
+ static type = 'local';
10
+ type = 'local';
11
+ doc;
12
+ channel;
13
+ _synced = false;
14
+ constructor(docName, doc, _options) {
15
+ this.doc = doc;
16
+ this.channel = new BroadcastChannel(docName);
17
+ // Handle incoming messages from other tabs
18
+ this.channel.onmessage = (event) => {
19
+ this.handleMessage(event.data);
20
+ };
21
+ // Listen to document updates and broadcast them
22
+ this.doc.on('update', this.handleDocUpdate);
23
+ // Send initial sync request
24
+ this.broadcastSync();
25
+ // Mark as synced after a short delay (to receive any pending updates)
26
+ setTimeout(() => {
27
+ this._synced = true;
28
+ }, 100);
29
+ if (!_options?.quiet) {
30
+ console.info(`BroadcastChannel Provider initialized: ${docName}`);
31
+ }
32
+ }
33
+ handleDocUpdate = (update, origin) => {
34
+ // Don't broadcast updates that came from other tabs (to prevent loops)
35
+ if (origin !== this) {
36
+ const encoder = encoding.createEncoder();
37
+ encoding.writeVarUint(encoder, 0); // Message type: sync update
38
+ encoding.writeVarUint8Array(encoder, update);
39
+ this.channel.postMessage(encoding.toUint8Array(encoder));
40
+ }
41
+ };
42
+ handleMessage(message) {
43
+ const decoder = decoding.createDecoder(new Uint8Array(message));
44
+ const messageType = decoding.readVarUint(decoder);
45
+ switch (messageType) {
46
+ case 0: // Sync update
47
+ const update = decoding.readVarUint8Array(decoder);
48
+ Y.applyUpdate(this.doc, update, this);
49
+ break;
50
+ case 1: // Sync request
51
+ this.broadcastSync();
52
+ break;
53
+ case 2: // Sync response
54
+ const stateVector = decoding.readVarUint8Array(decoder);
55
+ const updateResponse = Y.encodeStateAsUpdate(this.doc, stateVector);
56
+ if (updateResponse.length > 0) {
57
+ const encoder = encoding.createEncoder();
58
+ encoding.writeVarUint(encoder, 0); // Send as regular update
59
+ encoding.writeVarUint8Array(encoder, updateResponse);
60
+ this.channel.postMessage(encoding.toUint8Array(encoder));
61
+ }
62
+ break;
63
+ }
64
+ }
65
+ broadcastSync() {
66
+ // Broadcast our current state vector to request missing updates
67
+ const encoder = encoding.createEncoder();
68
+ encoding.writeVarUint(encoder, 2); // Message type: sync response
69
+ encoding.writeVarUint8Array(encoder, Y.encodeStateVector(this.doc));
70
+ this.channel.postMessage(encoding.toUint8Array(encoder));
71
+ }
72
+ async connect() {
73
+ // Wait for initial sync to complete
74
+ if (this._synced) {
75
+ return;
76
+ }
77
+ return new Promise((resolve) => {
78
+ const checkSync = () => {
79
+ if (this._synced) {
80
+ resolve();
81
+ }
82
+ else {
83
+ setTimeout(checkSync, 50);
84
+ }
85
+ };
86
+ checkSync();
87
+ });
88
+ }
89
+ disconnect() {
90
+ // BroadcastChannel doesn't have explicit disconnect
91
+ }
92
+ async reconnect() {
93
+ this.disconnect();
94
+ return this.connect();
95
+ }
96
+ destroy() {
97
+ this.doc.off('update', this.handleDocUpdate);
98
+ this.channel.close();
99
+ }
100
+ }