@kritzel/engine 0.4.31 → 0.4.33

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 (84) hide show
  1. package/LICENSE.md +49 -49
  2. package/dist/cjs/{engine.constants-CakmdKMW.js → engine.constants-VyFrUl1W.js} +627 -129
  3. package/dist/cjs/{index-BbbWU2aN.js → index-BP5Iy6FQ.js} +27 -9
  4. package/dist/cjs/index.cjs.js +4 -2
  5. package/dist/cjs/kritzel-awareness-cursors_5.cjs.entry.js +257 -113
  6. package/dist/cjs/loader.cjs.js +2 -2
  7. package/dist/cjs/stencil.cjs.js +3 -3
  8. package/dist/collection/classes/core/core.class.js +40 -32
  9. package/dist/collection/classes/core/reviver.class.js +4 -0
  10. package/dist/collection/classes/core/store.class.js +10 -3
  11. package/dist/collection/classes/managers/cursor.manager.js +10 -5
  12. package/dist/collection/classes/objects/dynamic-object.class.js +18 -5
  13. package/dist/collection/classes/objects/iframe.class.js +447 -0
  14. package/dist/collection/classes/registries/icon-registry.class.js +100 -67
  15. package/dist/collection/classes/tools/selection-tool.class.js +3 -3
  16. package/dist/collection/collection-manifest.json +4 -2
  17. package/dist/collection/components/kritzel-awareness-cursors/kritzel-awareness-cursors.css +115 -115
  18. package/dist/collection/components/kritzel-awareness-cursors/kritzel-awareness-cursors.js +1 -1
  19. package/dist/collection/components/kritzel-cursor-trail/kritzel-cursor-trail.css +10 -10
  20. package/dist/collection/components/kritzel-cursor-trail/kritzel-cursor-trail.js +1 -1
  21. package/dist/collection/components/kritzel-engine/kritzel-engine.css +80 -80
  22. package/dist/collection/components/kritzel-engine/kritzel-engine.js +196 -44
  23. package/dist/collection/components/kritzel-icon/kritzel-icon.css +18 -18
  24. package/dist/collection/components/kritzel-icon/kritzel-icon.js +25 -4
  25. package/dist/collection/components/kritzel-watermark/kritzel-watermark.css +29 -29
  26. package/dist/collection/components/kritzel-watermark/kritzel-watermark.js +2 -2
  27. package/dist/collection/constants/version.js +1 -1
  28. package/dist/collection/helpers/cursor.helper.js +8 -8
  29. package/dist/collection/helpers/object.helper.js +13 -0
  30. package/dist/collection/helpers/svg-export.helper.js +55 -41
  31. package/dist/collection/helpers/wheel.helper.js +1 -7
  32. package/dist/collection/index.js +3 -0
  33. package/dist/collection/interfaces/embedded-object.interface.js +1 -0
  34. package/dist/collection/themes/dark-theme.js +1 -5
  35. package/dist/collection/themes/light-theme.js +1 -6
  36. package/dist/components/index.js +7 -7
  37. package/dist/components/kritzel-awareness-cursors.js +1 -1
  38. package/dist/components/kritzel-cursor-trail.js +1 -1
  39. package/dist/components/kritzel-engine.js +755 -161
  40. package/dist/components/kritzel-icon.js +1 -1
  41. package/dist/components/kritzel-watermark.js +1 -1
  42. package/dist/components/{p-B2Htv9ou.js → p-BHVbfJrf.js} +3 -3
  43. package/dist/components/{p-YP8wAcF4.js → p-BTU9qcSW.js} +2 -2
  44. package/dist/components/{p-CfSx6HU_.js → p-BWfRbEIq.js} +16 -4
  45. package/dist/components/p-NAEiq8CK.js +214 -0
  46. package/dist/components/{p-BvRGQvVI.js → p-k0LxV9Bg.js} +18 -14
  47. package/dist/esm/{engine.constants-Bl5-pbq-.js → engine.constants-BHTr2qPx.js} +626 -130
  48. package/dist/esm/{index-BU9Mv7y0.js → index-C8PnHbLt.js} +27 -10
  49. package/dist/esm/index.js +3 -3
  50. package/dist/esm/kritzel-awareness-cursors_5.entry.js +257 -113
  51. package/dist/esm/loader.js +3 -3
  52. package/dist/esm/stencil.js +4 -4
  53. package/dist/stencil/index.esm.js +3 -3
  54. package/dist/stencil/{p-f0a8b7af.entry.js → p-40097a38.entry.js} +257 -113
  55. package/dist/stencil/{p-Bl5-pbq-.js → p-BHTr2qPx.js} +626 -130
  56. package/dist/stencil/{p-BU9Mv7y0.js → p-C8PnHbLt.js} +27 -10
  57. package/dist/stencil/stencil.esm.js +4 -4
  58. package/dist/types/classes/core/store.class.d.ts +3 -2
  59. package/dist/types/classes/objects/dynamic-object.class.d.ts +4 -2
  60. package/dist/types/classes/objects/iframe.class.d.ts +76 -0
  61. package/dist/types/classes/registries/icon-registry.class.d.ts +75 -6
  62. package/dist/types/components/kritzel-engine/kritzel-engine.d.ts +14 -1
  63. package/dist/types/components/kritzel-icon/kritzel-icon.d.ts +5 -1
  64. package/dist/types/components.d.ts +26 -8
  65. package/dist/types/constants/version.d.ts +1 -1
  66. package/dist/types/helpers/cursor.helper.d.ts +2 -1
  67. package/dist/types/helpers/object.helper.d.ts +2 -0
  68. package/dist/types/helpers/svg-export.helper.d.ts +1 -0
  69. package/dist/types/helpers/wheel.helper.d.ts +2 -2
  70. package/dist/types/index.d.ts +3 -0
  71. package/dist/types/interfaces/context-menu-item.interface.d.ts +2 -1
  72. package/dist/types/interfaces/dynamic-object-renderer.interface.d.ts +7 -0
  73. package/dist/types/interfaces/embedded-object.interface.d.ts +9 -0
  74. package/dist/types/interfaces/engine-state.interface.d.ts +3 -2
  75. package/dist/types/interfaces/login-config.interface.d.ts +2 -1
  76. package/dist/types/interfaces/master-detail.interface.d.ts +2 -1
  77. package/dist/types/interfaces/menu-item.interface.d.ts +2 -1
  78. package/dist/types/interfaces/theme.interface.d.ts +6 -7
  79. package/dist/types/interfaces/tool.interface.d.ts +9 -0
  80. package/dist/types/interfaces/toolbar-item.interface.d.ts +3 -2
  81. package/dist/types/stencil-public-runtime.d.ts +61 -55
  82. package/package.json +3 -1
  83. package/readme.md +10 -10
  84. package/dist/components/p-fx6msYHJ.js +0 -167
@@ -2,7 +2,7 @@ const NAMESPACE = 'stencil';
2
2
  const BUILD = /* stencil */ { hotModuleReplacement: false, hydratedSelectorName: "hydrated", lazyLoad: true, propChangeCallback: true, state: true, updatable: true};
3
3
 
4
4
  /*
5
- Stencil Client Platform v4.44.2 | MIT Licensed | https://stenciljs.com
5
+ Stencil Client Platform v4.45.1 | MIT Licensed | https://stenciljs.com
6
6
  */
7
7
 
8
8
 
@@ -835,7 +835,7 @@ var updateChildren = (parentElm, oldCh, newVNode2, newCh, isInitialRender = fals
835
835
  if (idxInOld >= 0) {
836
836
  elmToMove = oldCh[idxInOld];
837
837
  if (elmToMove.$tag$ !== newStartVnode.$tag$) {
838
- node = createElm(oldCh && oldCh[newStartIdx], newVNode2, idxInOld);
838
+ node = createElm(oldCh && oldCh[newStartIdx], newVNode2, newStartIdx);
839
839
  } else {
840
840
  patch(elmToMove, newStartVnode, isInitialRender);
841
841
  oldCh[idxInOld] = void 0;
@@ -1114,6 +1114,17 @@ var postUpdateComponent = (hostRef) => {
1114
1114
  hostRef.$flags$ &= -517;
1115
1115
  }
1116
1116
  };
1117
+ var forceUpdate = (ref) => {
1118
+ var _a;
1119
+ {
1120
+ const hostRef = getHostRef(ref);
1121
+ const isConnected = (_a = hostRef == null ? void 0 : hostRef.$hostElement$) == null ? void 0 : _a.isConnected;
1122
+ if (isConnected && (hostRef.$flags$ & (2 /* hasRendered */ | 16 /* isQueuedForUpdate */)) === 2 /* hasRendered */) {
1123
+ scheduleUpdate(hostRef, false);
1124
+ }
1125
+ return isConnected;
1126
+ }
1127
+ };
1117
1128
  var appDidLoad = (who) => {
1118
1129
  nextTick(() => emitEvent(win, "appload", { detail: { namespace: NAMESPACE } }));
1119
1130
  };
@@ -1259,21 +1270,26 @@ var proxyComponent = (Cstr, cmpMeta, flags) => {
1259
1270
  }
1260
1271
  return;
1261
1272
  }
1262
- const setterSetVal = () => {
1273
+ const parsedValue = parsePropertyValue(
1274
+ newValue,
1275
+ memberFlags);
1276
+ const setterSetVal = (val) => {
1263
1277
  const currentValue = ref.$lazyInstance$[memberName];
1264
1278
  if (!ref.$instanceValues$.get(memberName) && currentValue) {
1265
1279
  ref.$instanceValues$.set(memberName, currentValue);
1266
1280
  }
1267
- ref.$lazyInstance$[memberName] = parsePropertyValue(
1268
- newValue,
1269
- memberFlags);
1281
+ ref.$lazyInstance$[memberName] = val;
1270
1282
  setValue(this, memberName, ref.$lazyInstance$[memberName], cmpMeta);
1271
1283
  };
1272
1284
  if (ref.$lazyInstance$) {
1273
- setterSetVal();
1285
+ setterSetVal(parsedValue);
1274
1286
  } else {
1287
+ ref.$instanceValues$.set(memberName, parsedValue);
1275
1288
  ref.$fetchedCbList$.push(() => {
1276
- setterSetVal();
1289
+ const pendingValue = ref.$instanceValues$.get(memberName);
1290
+ if (ref.$lazyInstance$[memberName] !== pendingValue) {
1291
+ setterSetVal(pendingValue);
1292
+ }
1277
1293
  });
1278
1294
  }
1279
1295
  }
@@ -1327,8 +1343,9 @@ var proxyComponent = (Cstr, cmpMeta, flags) => {
1327
1343
  if (isBooleanTarget) {
1328
1344
  newValue = newValue === null || newValue === "false" ? false : true;
1329
1345
  }
1346
+ const currentValue = propMemberFlags & 4096 /* Setter */ ? hostRef.$instanceValues$.get(propName) : this[propName];
1330
1347
  const propDesc = Object.getOwnPropertyDescriptor(prototype, propName);
1331
- if (!isSpuriousBooleanRemoval && newValue != this[propName] && (!propDesc.get || !!propDesc.set)) {
1348
+ if (!isSpuriousBooleanRemoval && newValue != currentValue && (!propDesc.get || !!propDesc.set)) {
1332
1349
  this[propName] = newValue;
1333
1350
  }
1334
1351
  });
@@ -1699,4 +1716,4 @@ function transformTag(tag) {
1699
1716
  return tag;
1700
1717
  }
1701
1718
 
1702
- export { Host as H, bootstrapLazy as b, createEvent as c, getElement as g, h, promiseResolve as p, registerInstance as r, setNonce as s };
1719
+ export { Host as H, bootstrapLazy as b, createEvent as c, forceUpdate as f, getElement as g, h, promiseResolve as p, registerInstance as r, setNonce as s };
@@ -1,9 +1,9 @@
1
- import { p as promiseResolve, b as bootstrapLazy } from './p-BU9Mv7y0.js';
2
- export { s as setNonce } from './p-BU9Mv7y0.js';
1
+ import { p as promiseResolve, b as bootstrapLazy } from './p-C8PnHbLt.js';
2
+ export { s as setNonce } from './p-C8PnHbLt.js';
3
3
  import { g as globalScripts } from './p-DQuL1Twl.js';
4
4
 
5
5
  /*
6
- Stencil Client Patch Browser v4.44.2 | MIT Licensed | https://stenciljs.com
6
+ Stencil Client Patch Browser v4.45.1 | MIT Licensed | https://stenciljs.com
7
7
  */
8
8
 
9
9
  var patchBrowser = () => {
@@ -17,5 +17,5 @@ var patchBrowser = () => {
17
17
 
18
18
  patchBrowser().then(async (options) => {
19
19
  await globalScripts();
20
- return bootstrapLazy([["p-f0a8b7af",[[513,"kritzel-engine",{"workspaces":[16],"editorId":[1,"editor-id"],"activeWorkspaceId":[1,"active-workspace-id"],"syncConfig":[16],"assetStorageConfig":[16],"user":[16],"globalContextMenuItems":[16],"objectContextMenuItems":[16],"scaleMax":[1026,"scale-max"],"scaleMin":[1026,"scale-min"],"cursorTarget":[16],"lockDrawingScale":[4,"lock-drawing-scale"],"theme":[1],"licenseKey":[1,"license-key"],"themes":[16],"locale":[1],"locales":[16],"fallbackLocale":[1,"fallback-locale"],"viewportBoundaryLeft":[2,"viewport-boundary-left"],"viewportBoundaryRight":[2,"viewport-boundary-right"],"viewportBoundaryTop":[2,"viewport-boundary-top"],"viewportBoundaryBottom":[2,"viewport-boundary-bottom"],"debugInfo":[16],"isPanningEnabled":[4,"is-panning-enabled"],"isZoomingEnabled":[4,"is-zooming-enabled"],"forceUpdate":[32],"triggerSelectionChange":[64],"beginSceneBootstrap":[64],"endSceneBootstrap":[64],"registerTool":[64],"changeActiveTool":[64],"disable":[64],"enable":[64],"delete":[64],"copy":[64],"cut":[64],"paste":[64],"bringForward":[64],"sendBackward":[64],"bringToFront":[64],"sendToBack":[64],"alignObjects":[64],"group":[64],"ungroup":[64],"undo":[64],"redo":[64],"hideContextMenu":[64],"openContextMenu":[64],"getObjectById":[64],"getAllObjects":[64],"findObjects":[64],"getObjectsTotalCount":[64],"addObject":[64],"addObjects":[64],"updateObject":[64],"removeObject":[64],"removeObjects":[64],"getSelectedObjects":[64],"getDisplayableShortcuts":[64],"selectObjects":[64],"selectAllObjectsInViewport":[64],"clearSelection":[64],"centerObjectInViewport":[64],"panToObject":[64],"backToContent":[64],"centerAllObjects":[64],"centerObjects":[64],"setViewport":[64],"panTo":[64],"zoomTo":[64],"zoomIn":[64],"zoomOut":[64],"getViewport":[64],"screenToWorld":[64],"worldToScreen":[64],"getObjectsInViewport":[64],"getScreenshot":[64],"exportViewportAsPng":[64],"exportViewportAsSvg":[64],"getSelectedObjectSupportedExportFormats":[64],"canExportSelectedObjectAs":[64],"exportSelectedObject":[64],"exportAsJson":[64],"importFromJson":[64],"loadObjectsFromJson":[64],"downloadAsJson":[64],"importFromFile":[64],"cancelImportFromFile":[64],"setActiveWorkspace":[64],"createWorkspace":[64],"updateWorkspace":[64],"deleteWorkspace":[64],"getWorkspaces":[64],"getActiveWorkspace":[64],"getIsPublic":[64],"loadSharedWorkspace":[64],"reinitSync":[64],"saveSettings":[64],"loadSettings":[64],"registerLocales":[64],"configureLocales":[64],"setLocale":[64],"getLocale":[64],"getAvailableLocales":[64],"getAvailableLocaleOptions":[64],"t":[64],"getResolvedTerms":[64]},[[1,"wheel","handleWheel"],[0,"pointerdown","handlePointerDown"],[0,"pointermove","handlePointerMove"],[0,"pointerup","handlePointerUp"],[0,"pointercancel","handlePointerCancel"],[1,"pointerleave","handlePointerLeave"],[1,"longpress","handleLongPress"],[0,"contextmenu","handleContextMenu"],[9,"resize","handleResize"],[8,"keydown","handleKeyDown"],[8,"keyup","handleKeyUp"],[8,"copy","handleCopy"],[8,"cut","handleCut"],[8,"paste","handlePaste"],[4,"dblclick","preventDoubleTapZoomOnTouchDevices"]],{"workspaces":[{"onWorkspacesPropChange":0}],"activeWorkspaceId":[{"onActiveWorkspaceIdChange":0}],"syncConfig":[{"onSyncConfigChange":0}],"assetStorageConfig":[{"onAssetStorageConfigChange":0}],"user":[{"onUserChange":0}],"globalContextMenuItems":[{"onGlobalContextMenuItemsChange":0}],"objectContextMenuItems":[{"onObjectContextMenuItemsChange":0}],"scaleMax":[{"validateScaleMax":0}],"scaleMin":[{"validateScaleMin":0}],"cursorTarget":[{"onCursorTargetChange":0}],"lockDrawingScale":[{"onLockDrawingScaleChange":0}],"theme":[{"onThemeChange":0}],"licenseKey":[{"onLicenseKeyChange":0}],"themes":[{"onThemesChange":0}],"locale":[{"onLocaleChange":0}],"locales":[{"onLocalesChange":0}],"fallbackLocale":[{"onFallbackLocaleChange":0}],"viewportBoundaryLeft":[{"onViewportBoundaryLeftChange":0}],"viewportBoundaryRight":[{"onViewportBoundaryRightChange":0}],"viewportBoundaryTop":[{"onViewportBoundaryTopChange":0}],"viewportBoundaryBottom":[{"onViewportBoundaryBottomChange":0}],"debugInfo":[{"onDebugInfoChange":0}]}],[513,"kritzel-awareness-cursors",{"core":[16],"showEdgeIndicators":[4,"show-edge-indicators"],"edgeIndicatorPadding":[2,"edge-indicator-padding"],"remoteCursors":[32],"objectVersion":[32]}],[513,"kritzel-cursor-trail",{"core":[16],"cursorTrailPoints":[32],"isLeftButtonDown":[32]},[[9,"pointerdown","handleMouseDown"],[9,"pointermove","handlePointerMove"],[9,"pointerup","handlePointerUp"]]],[513,"kritzel-icon",{"name":[1],"label":[1],"size":[2]}],[513,"kritzel-watermark",{"core":[16],"label":[1]}]]]], options);
20
+ return bootstrapLazy([["p-40097a38",[[513,"kritzel-engine",{"workspaces":[16],"editorId":[1,"editor-id"],"activeWorkspaceId":[1,"active-workspace-id"],"syncConfig":[16],"assetStorageConfig":[16],"user":[16],"tools":[16],"globalContextMenuItems":[16],"objectContextMenuItems":[16],"scaleMax":[1026,"scale-max"],"scaleMin":[1026,"scale-min"],"cursorTarget":[16],"lockDrawingScale":[4,"lock-drawing-scale"],"theme":[1],"licenseKey":[1,"license-key"],"themes":[16],"locale":[1],"locales":[16],"fallbackLocale":[1,"fallback-locale"],"viewportBoundaryLeft":[2,"viewport-boundary-left"],"viewportBoundaryRight":[2,"viewport-boundary-right"],"viewportBoundaryTop":[2,"viewport-boundary-top"],"viewportBoundaryBottom":[2,"viewport-boundary-bottom"],"debugInfo":[16],"isPanningEnabled":[4,"is-panning-enabled"],"isZoomingEnabled":[4,"is-zooming-enabled"],"forceUpdate":[32],"triggerSelectionChange":[64],"beginSceneBootstrap":[64],"endSceneBootstrap":[64],"registerTool":[64],"setActiveTool":[64],"disable":[64],"enable":[64],"delete":[64],"copy":[64],"cut":[64],"paste":[64],"bringForward":[64],"sendBackward":[64],"bringToFront":[64],"sendToBack":[64],"alignObjects":[64],"group":[64],"ungroup":[64],"undo":[64],"redo":[64],"hideContextMenu":[64],"openContextMenu":[64],"getObjectById":[64],"getAllObjects":[64],"findObjects":[64],"getObjectsTotalCount":[64],"addObject":[64],"addObjects":[64],"updateObject":[64],"removeObject":[64],"removeObjects":[64],"getSelectedObjects":[64],"getDisplayableShortcuts":[64],"selectObjects":[64],"selectAllObjectsInViewport":[64],"clearSelection":[64],"centerObjectInViewport":[64],"panToObject":[64],"backToContent":[64],"centerAllObjects":[64],"centerObjects":[64],"setViewport":[64],"panTo":[64],"zoomTo":[64],"zoomIn":[64],"zoomOut":[64],"getViewport":[64],"screenToWorld":[64],"worldToScreen":[64],"getObjectsInViewport":[64],"getScreenshot":[64],"exportViewportAsPng":[64],"exportViewportAsSvg":[64],"getSelectedObjectSupportedExportFormats":[64],"canExportSelectedObjectAs":[64],"exportSelectedObject":[64],"exportAsJson":[64],"importFromJson":[64],"loadObjectsFromJson":[64],"downloadAsJson":[64],"importFromFile":[64],"cancelImportFromFile":[64],"setActiveWorkspace":[64],"createWorkspace":[64],"updateWorkspace":[64],"deleteWorkspace":[64],"getWorkspaces":[64],"getActiveWorkspace":[64],"getIsPublic":[64],"loadSharedWorkspace":[64],"reinitSync":[64],"saveSettings":[64],"loadSettings":[64],"registerLocales":[64],"configureLocales":[64],"setLocale":[64],"getLocale":[64],"getAvailableLocales":[64],"getAvailableLocaleOptions":[64],"t":[64],"getResolvedTerms":[64],"getTool":[64]},[[1,"wheel","handleWheel"],[0,"pointerdown","handlePointerDown"],[0,"pointermove","handlePointerMove"],[0,"pointerup","handlePointerUp"],[0,"pointercancel","handlePointerCancel"],[1,"pointerleave","handlePointerLeave"],[1,"longpress","handleLongPress"],[0,"contextmenu","handleContextMenu"],[9,"resize","handleResize"],[8,"keydown","handleKeyDown"],[8,"keyup","handleKeyUp"],[8,"copy","handleCopy"],[8,"cut","handleCut"],[8,"paste","handlePaste"],[4,"dblclick","preventDoubleTapZoomOnTouchDevices"]],{"workspaces":[{"onWorkspacesPropChange":0}],"activeWorkspaceId":[{"onActiveWorkspaceIdChange":0}],"syncConfig":[{"onSyncConfigChange":0}],"assetStorageConfig":[{"onAssetStorageConfigChange":0}],"user":[{"onUserChange":0}],"tools":[{"onToolsChange":0}],"globalContextMenuItems":[{"onGlobalContextMenuItemsChange":0}],"objectContextMenuItems":[{"onObjectContextMenuItemsChange":0}],"scaleMax":[{"validateScaleMax":0}],"scaleMin":[{"validateScaleMin":0}],"cursorTarget":[{"onCursorTargetChange":0}],"lockDrawingScale":[{"onLockDrawingScaleChange":0}],"theme":[{"onThemeChange":0}],"licenseKey":[{"onLicenseKeyChange":0}],"themes":[{"onThemesChange":0}],"locale":[{"onLocaleChange":0}],"locales":[{"onLocalesChange":0}],"fallbackLocale":[{"onFallbackLocaleChange":0}],"viewportBoundaryLeft":[{"onViewportBoundaryLeftChange":0}],"viewportBoundaryRight":[{"onViewportBoundaryRightChange":0}],"viewportBoundaryTop":[{"onViewportBoundaryTopChange":0}],"viewportBoundaryBottom":[{"onViewportBoundaryBottomChange":0}],"debugInfo":[{"onDebugInfoChange":0}]}],[513,"kritzel-awareness-cursors",{"core":[16],"showEdgeIndicators":[4,"show-edge-indicators"],"edgeIndicatorPadding":[2,"edge-indicator-padding"],"remoteCursors":[32],"objectVersion":[32]}],[513,"kritzel-cursor-trail",{"core":[16],"cursorTrailPoints":[32],"isLeftButtonDown":[32]},[[9,"pointerdown","handleMouseDown"],[9,"pointermove","handlePointerMove"],[9,"pointerup","handlePointerUp"]]],[513,"kritzel-icon",{"name":[1],"label":[1],"size":[2]}],[513,"kritzel-watermark",{"core":[16],"label":[1]}]]]], options);
21
21
  });
@@ -5,7 +5,7 @@ import { KritzelText } from '../objects/text.class';
5
5
  import { KritzelShape } from '../objects/shape.class';
6
6
  import { KritzelPath } from '../objects/path.class';
7
7
  import { KritzelLine } from '../objects/line.class';
8
- import { KritzelDynamicObject } from '../objects/dynamic-object.class';
8
+ import { KritzelEmbeddedObject } from '../../interfaces/embedded-object.interface';
9
9
  import { StateChangeListener, StatePropertyKey } from '../../types/state.types';
10
10
  import { KritzelObjectMap } from '../structures/object-map.structure';
11
11
  import { KritzelBaseObject } from '../objects/base-object.class';
@@ -135,7 +135,8 @@ export declare class KritzelStore {
135
135
  * Gets the currently selected dynamic object whose focused descendant is an input-like element.
136
136
  * @returns The interactive dynamic object with focused input-like content, or null if none matches
137
137
  */
138
- get activeInteractiveDynamicObject(): KritzelDynamicObject | null;
138
+ get activeInteractiveEmbeddedObject(): KritzelEmbeddedObject | null;
139
+ get activeInteractiveDynamicObject(): KritzelEmbeddedObject | null;
139
140
  /**
140
141
  * Gets the path currently being drawn (not yet completed).
141
142
  * @returns The incomplete path object, or null if no path is being drawn
@@ -1,5 +1,6 @@
1
1
  import { KritzelCore } from '../core/core.class';
2
2
  import { KritzelBaseObject } from './base-object.class';
3
+ import { KritzelEmbeddedObject } from '../../interfaces/embedded-object.interface';
3
4
  /**
4
5
  * Configuration options for creating a KritzelDynamicObject instance.
5
6
  */
@@ -19,7 +20,7 @@ export interface KritzelDynamicObjectConfig {
19
20
  * Extends KritzelBaseObject to inherit common object functionality like positioning,
20
21
  * scaling, and lifecycle management.
21
22
  */
22
- export declare class KritzelDynamicObject extends KritzelBaseObject<HTMLElement> {
23
+ export declare class KritzelDynamicObject extends KritzelBaseObject<HTMLElement> implements KritzelEmbeddedObject {
23
24
  __class__: string;
24
25
  /** The HTML element to be rendered on the canvas. */
25
26
  element: HTMLElement;
@@ -80,7 +81,7 @@ export declare class KritzelDynamicObject extends KritzelBaseObject<HTMLElement>
80
81
  * currently owns focus.
81
82
  */
82
83
  hasFocusedInputElement(): boolean;
83
- private getFocusHosts;
84
+ getEmbeddedContentRoots(): HTMLElement[];
84
85
  /**
85
86
  * Returns true when the given host (or, via the flat tree, one of its shadow descendants)
86
87
  * currently contains a focused input-like element.
@@ -137,6 +138,7 @@ export declare class KritzelDynamicObject extends KritzelBaseObject<HTMLElement>
137
138
  * @returns A serializable object with htmlString and dimension snapshots
138
139
  */
139
140
  serialize(): any;
141
+ private serializeRendererData;
140
142
  /**
141
143
  * Deserializes the dynamic object from a plain object.
142
144
  * Reconstructs the element from stored HTML string with fallback to placeholder.
@@ -0,0 +1,76 @@
1
+ import { KritzelEmbeddedObject } from '../../interfaces/embedded-object.interface';
2
+ import { KritzelCore } from '../core/core.class';
3
+ import { KritzelBaseObject } from './base-object.class';
4
+ export interface KritzelIframeContent {
5
+ html: string;
6
+ css: string;
7
+ script: string;
8
+ }
9
+ export interface KritzelIframeObjectConfig extends Partial<KritzelIframeContent> {
10
+ content?: Partial<KritzelIframeContent>;
11
+ loadingContent?: Partial<KritzelIframeContent>;
12
+ isLoading?: boolean;
13
+ state?: Record<string, unknown>;
14
+ title?: string;
15
+ sandbox?: string[];
16
+ translateX?: number;
17
+ translateY?: number;
18
+ rotation?: number;
19
+ scale?: number;
20
+ width?: number;
21
+ height?: number;
22
+ borderRadius?: number | string;
23
+ boxShadow?: string;
24
+ }
25
+ export interface KritzelIframeObjectLifecycleContext {
26
+ object: KritzelIframeObject;
27
+ iframe: HTMLIFrameElement | null;
28
+ state: Record<string, unknown>;
29
+ }
30
+ export declare class KritzelIframeObject extends KritzelBaseObject<HTMLIFrameElement> implements KritzelEmbeddedObject {
31
+ __class__: string;
32
+ content: KritzelIframeContent;
33
+ loadingContent?: KritzelIframeContent;
34
+ isLoading: boolean;
35
+ state: Record<string, unknown>;
36
+ title: string;
37
+ sandbox: string[];
38
+ borderRadius?: number | string;
39
+ boxShadow?: string;
40
+ get html(): string;
41
+ set html(value: string);
42
+ get css(): string;
43
+ set css(value: string);
44
+ get script(): string;
45
+ set script(value: string);
46
+ private messageListener;
47
+ constructor(config?: KritzelIframeObjectConfig);
48
+ static create(core: KritzelCore, config?: KritzelIframeObjectConfig): KritzelIframeObject;
49
+ get sandboxAttribute(): string;
50
+ mount(iframe: HTMLIFrameElement): void;
51
+ unmount(): void;
52
+ setContent(content: Partial<KritzelIframeContent>): void;
53
+ setLoadingContent(content: Partial<KritzelIframeContent>): void;
54
+ setLoading(isLoading: boolean): void;
55
+ getActiveContent(): KritzelIframeContent;
56
+ setState(state: Record<string, unknown>): void;
57
+ setIsInteractive(isInteractive: boolean): void;
58
+ hasFocusedInputElement(): boolean;
59
+ getEmbeddedContentRoots(): HTMLElement[];
60
+ protected onMount(_context: KritzelIframeObjectLifecycleContext): void;
61
+ protected onSerialize(context: KritzelIframeObjectLifecycleContext): Record<string, unknown>;
62
+ protected onUnmount(context: KritzelIframeObjectLifecycleContext): Record<string, unknown> | undefined;
63
+ serialize(): Record<string, unknown>;
64
+ deserialize<T>(object: Record<string, unknown>): T;
65
+ copy(): KritzelIframeObject;
66
+ clone(): KritzelIframeObject;
67
+ adoptTransientStateFrom(previous: KritzelBaseObject<any>): void;
68
+ private createLifecycleContext;
69
+ private normalizeSandbox;
70
+ private createSourceDocument;
71
+ private handleMessage;
72
+ private dispatchPointerMessage;
73
+ private dispatchContextMenuMessage;
74
+ private refreshDocument;
75
+ private persistUpdate;
76
+ }
@@ -4,7 +4,9 @@
4
4
  */
5
5
  export declare class KritzelIconRegistry {
6
6
  /** Internal storage for registered icons, mapping icon names to their SVG content. */
7
- private static registry;
7
+ private static get registry();
8
+ private static get listeners();
9
+ static subscribe(listener: (name: string) => void): () => void;
8
10
  /**
9
11
  * Registers a single icon with the given name and SVG content.
10
12
  * If an icon with the same name already exists, it will be overwritten and a warning will be logged.
@@ -19,21 +21,88 @@ export declare class KritzelIconRegistry {
19
21
  * @param name - The unique identifier of the icon to retrieve.
20
22
  * @returns The SVG markup string if the icon exists, or `undefined` if not found.
21
23
  */
22
- static get(name: string): string | undefined;
24
+ static get(name: KritzelIconName): string | undefined;
23
25
  /**
24
26
  * Registers multiple icons at once from an object mapping names to SVG content.
25
27
  * This is a convenience method for bulk registration.
26
28
  *
27
29
  * @param icons - An object where keys are icon names and values are SVG markup strings.
28
30
  */
29
- static registerIcons(icons: {
30
- [key: string]: string;
31
- }): void;
31
+ static registerIcons(icons: KritzelSvgIconMap): void;
32
32
  /**
33
33
  * Checks whether an icon with the given name is registered.
34
34
  *
35
35
  * @param name - The unique identifier of the icon to check.
36
36
  * @returns `true` if the icon exists in the registry, `false` otherwise.
37
37
  */
38
- static has(name: string): boolean;
38
+ static has(name: KritzelIconName): boolean;
39
39
  }
40
+ export declare const defaultIcons: {
41
+ cursor: string;
42
+ pen: string;
43
+ arrow: string;
44
+ arrowUpFromDot: string;
45
+ arrowDownFromDot: string;
46
+ highlighter: string;
47
+ eraser: string;
48
+ type: string;
49
+ shapes: string;
50
+ shapeRectangle: string;
51
+ shapeEllipse: string;
52
+ shapeTriangle: string;
53
+ image: string;
54
+ imageOff: string;
55
+ chevronDown: string;
56
+ chevronUp: string;
57
+ chevronLeft: string;
58
+ chevronRight: string;
59
+ chevronsLeft: string;
60
+ copy: string;
61
+ paste: string;
62
+ cut: string;
63
+ delete: string;
64
+ bringToFront: string;
65
+ sendToBack: string;
66
+ selectAll: string;
67
+ download: string;
68
+ upload: string;
69
+ undo: string;
70
+ redo: string;
71
+ plus: string;
72
+ minus: string;
73
+ ellipsisVertical: string;
74
+ x: string;
75
+ check: string;
76
+ group: string;
77
+ ungroup: string;
78
+ moveVertical: string;
79
+ hand: string;
80
+ handGrab: string;
81
+ mousePointer: string;
82
+ pointer: string;
83
+ settings: string;
84
+ share: string;
85
+ palette: string;
86
+ command: string;
87
+ info: string;
88
+ ordering: string;
89
+ layoutTemplate: string;
90
+ align: string;
91
+ alignStartHorizontal: string;
92
+ alignCenterHorizontal: string;
93
+ alignEndHorizontal: string;
94
+ alignStartVertical: string;
95
+ alignCenterVertical: string;
96
+ alignEndVertical: string;
97
+ viewport: string;
98
+ logOut: string;
99
+ usersRound: string;
100
+ google: string;
101
+ facebook: string;
102
+ github: string;
103
+ braces: string;
104
+ heart: string;
105
+ };
106
+ export type KritzelDefaultIconName = keyof typeof defaultIcons;
107
+ export type KritzelIconName = KritzelDefaultIconName | (string & NonNullable<unknown>);
108
+ export type KritzelSvgIconMap = Partial<Record<KritzelDefaultIconName, string>> & Record<string, string>;
@@ -24,6 +24,7 @@ import { IKritzelUser } from '../../interfaces/user.interface';
24
24
  import { KritzelNotification } from '../../interfaces/notification.interface';
25
25
  import { KritzelContextMenuState } from '../../interfaces/context-menu-state.interface';
26
26
  import { KritzelObjectExportFormat } from '../../interfaces/object-export.interface';
27
+ import { KritzelToolDefinition } from '../../interfaces/tool.interface';
27
28
  export declare class KritzelEngine {
28
29
  host: HTMLElement;
29
30
  private activeImportFileInput?;
@@ -53,6 +54,9 @@ export declare class KritzelEngine {
53
54
  /** The current user for awareness broadcasting (name, id, cursor position). */
54
55
  user?: IKritzelUser;
55
56
  onUserChange(newValue: IKritzelUser | undefined): void;
57
+ /** Tool definitions to register with this engine instance. */
58
+ tools: KritzelToolDefinition[];
59
+ onToolsChange(): void;
56
60
  /** Context menu items shown when right-clicking the canvas background. */
57
61
  globalContextMenuItems?: ContextMenuItem[];
58
62
  onGlobalContextMenuItemsChange(newValue: ContextMenuItem[] | undefined): void;
@@ -190,7 +194,7 @@ export declare class KritzelEngine {
190
194
  * Switches the active drawing tool by its registered name.
191
195
  * @param toolName - The name the tool was registered with (e.g., 'brush', 'eraser').
192
196
  */
193
- changeActiveTool(toolName: string): Promise<void>;
197
+ setActiveTool(toolName: string): Promise<void>;
194
198
  /** Disables all user interaction with the engine (pointer, keyboard, etc.). */
195
199
  disable(): Promise<void>;
196
200
  /** Re-enables user interaction after a call to `disable()`. */
@@ -618,9 +622,13 @@ export declare class KritzelEngine {
618
622
  private _stateChangeListenersRegistered;
619
623
  private _workspaceInitializationPromise;
620
624
  private _workspaceInitializationTargetKey;
625
+ private _workspacePropReconciliationPromise;
621
626
  private _syncInitPromise;
627
+ private _toolsInitPromise;
628
+ private _toolsRevision;
622
629
  private _syncConfigRevision;
623
630
  private _assetStorageConfigRevision;
631
+ private _workspacesRevision;
624
632
  private _hasLoggedUnlicensedWelcomeBanner;
625
633
  private _previousVisibleDynamicObjects;
626
634
  private _revealedImageKeys;
@@ -628,6 +636,9 @@ export declare class KritzelEngine {
628
636
  private _sceneBootstrapTransitionEnabled;
629
637
  private _sceneBootstrapTransitionTimer;
630
638
  private readonly _defaultUndoState;
639
+ /** Returns a tool registered in this engine instance. */
640
+ getTool(toolName: string): Promise<KritzelBaseTool | null>;
641
+ private registerConfiguredTools;
631
642
  private setLoadingState;
632
643
  private isNetworkAvailable;
633
644
  private emitContextMenuStateChange;
@@ -649,6 +660,8 @@ export declare class KritzelEngine {
649
660
  componentWillLoad(): void;
650
661
  componentDidLoad(): Promise<void>;
651
662
  private initializeSyncAndWorkspace;
663
+ private waitForSceneRender;
664
+ private waitForWorkspaceAndSceneReady;
652
665
  /**
653
666
  * Initializes the asset storage layer with the latest config. Mirrors
654
667
  * the in-flight replay logic of {@link doInitializeSyncAndWorkspace} for
@@ -1,6 +1,10 @@
1
+ import { KritzelIconName } from '../../classes/registries/icon-registry.class';
1
2
  export declare class KritzelIcon {
2
- name: string;
3
+ name: KritzelIconName;
3
4
  label?: string;
4
5
  size: number;
6
+ private unsubscribe?;
7
+ connectedCallback(): void;
8
+ disconnectedCallback(): void;
5
9
  render(): any;
6
10
  }
@@ -10,6 +10,7 @@ import { KritzelWorkspace } from "./classes/core/workspace.class";
10
10
  import { KritzelSyncConfig } from "./interfaces/sync-config.interface";
11
11
  import { KritzelAssetStorageConfig } from "./interfaces/asset-storage-config.interface";
12
12
  import { IKritzelUser } from "./interfaces/user.interface";
13
+ import { KritzelToolDefinition } from "./interfaces/tool.interface";
13
14
  import { ContextMenuItem } from "./interfaces/context-menu-item.interface";
14
15
  import { KritzelTheme, ThemeName } from "./interfaces/theme.interface";
15
16
  import { KritzelLocale, KritzelTermKey, KritzelTermVars, LocaleCode } from "./interfaces/localization.interface";
@@ -32,11 +33,13 @@ import { KritzelLine } from "./classes/objects/line.class";
32
33
  import { KritzelShortcut } from "./interfaces/shortcut.interface";
33
34
  import { KritzelObjectExportFormat } from "./interfaces/object-export.interface";
34
35
  import { KritzelSettingsConfig } from "./interfaces/settings.interface";
36
+ import { KritzelIconName } from "./classes/registries/icon-registry.class";
35
37
  export { KritzelCore } from "./classes/core/core.class";
36
38
  export { KritzelWorkspace } from "./classes/core/workspace.class";
37
39
  export { KritzelSyncConfig } from "./interfaces/sync-config.interface";
38
40
  export { KritzelAssetStorageConfig } from "./interfaces/asset-storage-config.interface";
39
41
  export { IKritzelUser } from "./interfaces/user.interface";
42
+ export { KritzelToolDefinition } from "./interfaces/tool.interface";
40
43
  export { ContextMenuItem } from "./interfaces/context-menu-item.interface";
41
44
  export { KritzelTheme, ThemeName } from "./interfaces/theme.interface";
42
45
  export { KritzelLocale, KritzelTermKey, KritzelTermVars, LocaleCode } from "./interfaces/localization.interface";
@@ -59,6 +62,7 @@ export { KritzelLine } from "./classes/objects/line.class";
59
62
  export { KritzelShortcut } from "./interfaces/shortcut.interface";
60
63
  export { KritzelObjectExportFormat } from "./interfaces/object-export.interface";
61
64
  export { KritzelSettingsConfig } from "./interfaces/settings.interface";
65
+ export { KritzelIconName } from "./classes/registries/icon-registry.class";
62
66
  export namespace Components {
63
67
  interface KritzelAwarenessCursors {
64
68
  "core": KritzelCore;
@@ -146,11 +150,6 @@ export namespace Components {
146
150
  * @returns `true` if objects were provided and the viewport was adjusted, `false` otherwise.
147
151
  */
148
152
  "centerObjects": (objects: KritzelBaseObject[], animate?: boolean) => Promise<boolean>;
149
- /**
150
- * Switches the active drawing tool by its registered name.
151
- * @param toolName - The name the tool was registered with (e.g., 'brush', 'eraser').
152
- */
153
- "changeActiveTool": (toolName: string) => Promise<void>;
154
153
  /**
155
154
  * Deselects all currently selected objects.
156
155
  */
@@ -302,6 +301,10 @@ export namespace Components {
302
301
  * Returns the currently selected objects. Returns an empty array if nothing is selected.
303
302
  */
304
303
  "getSelectedObjects": () => Promise<KritzelBaseObject<any>[]>;
304
+ /**
305
+ * Returns a tool registered in this engine instance.
306
+ */
307
+ "getTool": (toolName: string) => Promise<KritzelBaseTool | null>;
305
308
  /**
306
309
  * Returns the current viewport state including position, scale, and dimensions.
307
310
  * @returns The current viewport state.
@@ -481,6 +484,11 @@ export namespace Components {
481
484
  * @param object - The object to move. If omitted, applies to the current selection.
482
485
  */
483
486
  "sendToBack": (object?: KritzelBaseObject<any>) => Promise<void>;
487
+ /**
488
+ * Switches the active drawing tool by its registered name.
489
+ * @param toolName - The name the tool was registered with (e.g., 'brush', 'eraser').
490
+ */
491
+ "setActiveTool": (toolName: string) => Promise<void>;
484
492
  /**
485
493
  * Switches the active workspace in the engine by ID.
486
494
  * @param id - The unique ID of the workspace to activate
@@ -517,6 +525,11 @@ export namespace Components {
517
525
  * An array of available themes for the editor.
518
526
  */
519
527
  "themes"?: KritzelTheme[];
528
+ /**
529
+ * Tool definitions to register with this engine instance.
530
+ * @default []
531
+ */
532
+ "tools": KritzelToolDefinition[];
520
533
  /**
521
534
  * Manually triggers the `objectsSelectionChange` event.
522
535
  */
@@ -598,7 +611,7 @@ export namespace Components {
598
611
  }
599
612
  interface KritzelIcon {
600
613
  "label"?: string;
601
- "name": string;
614
+ "name": KritzelIconName;
602
615
  /**
603
616
  * @default 24
604
617
  */
@@ -867,6 +880,11 @@ declare namespace LocalJSX {
867
880
  * An array of available themes for the editor.
868
881
  */
869
882
  "themes"?: KritzelTheme[];
883
+ /**
884
+ * Tool definitions to register with this engine instance.
885
+ * @default []
886
+ */
887
+ "tools"?: KritzelToolDefinition[];
870
888
  /**
871
889
  * The current user for awareness broadcasting (name, id, cursor position).
872
890
  */
@@ -898,7 +916,7 @@ declare namespace LocalJSX {
898
916
  }
899
917
  interface KritzelIcon {
900
918
  "label"?: string;
901
- "name"?: string;
919
+ "name"?: KritzelIconName;
902
920
  /**
903
921
  * @default 24
904
922
  */
@@ -944,7 +962,7 @@ declare namespace LocalJSX {
944
962
  "isZoomingEnabled": boolean;
945
963
  }
946
964
  interface KritzelIconAttributes {
947
- "name": string;
965
+ "name": KritzelIconName;
948
966
  "label": string;
949
967
  "size": number;
950
968
  }
@@ -3,4 +3,4 @@
3
3
  * This file is auto-generated by the version bump scripts.
4
4
  * Do not modify manually.
5
5
  */
6
- export declare const KRITZEL_VERSION = "0.4.31";
6
+ export declare const KRITZEL_VERSION = "0.4.33";
@@ -1,3 +1,4 @@
1
+ import { KritzelIconName } from '../classes/registries/icon-registry.class';
1
2
  export declare class KritzelCursorHelper {
2
3
  private static _pointerCursor;
3
4
  /**
@@ -10,7 +11,7 @@ export declare class KritzelCursorHelper {
10
11
  * The icon is retrieved from the KritzelIconRegistry.
11
12
  */
12
13
  static getCursor(options: {
13
- iconName: string;
14
+ iconName: KritzelIconName | 'default';
14
15
  rotation?: number;
15
16
  color?: string;
16
17
  size?: number;
@@ -1,7 +1,9 @@
1
+ import { KritzelEmbeddedObject } from '../interfaces/embedded-object.interface';
1
2
  export declare class ObjectHelper {
2
3
  static generateUUID(length?: number): string;
3
4
  static isEmpty(obj: any): boolean;
4
5
  static isClass<T>(object: unknown, className: string): object is T;
6
+ static isKritzelEmbeddedObject(object: unknown): object is KritzelEmbeddedObject;
5
7
  static isKritzelExportable(object: unknown): object is {
6
8
  getSupportedExportFormats(): string[];
7
9
  exportAs(format: string, context: unknown): Promise<string | null>;
@@ -171,6 +171,7 @@ export declare class KritzelSvgExportHelper {
171
171
  * @returns SVG element string
172
172
  */
173
173
  private static dynamicObjectToSvg;
174
+ private static iframeObjectToSvg;
174
175
  /**
175
176
  * Converts a KritzelGroup to SVG by recursively converting children.
176
177
  * @param group - The group object
@@ -1,6 +1,6 @@
1
- import { KritzelDynamicObject } from '../classes/objects/dynamic-object.class';
1
+ import { KritzelEmbeddedObject } from '../interfaces/embedded-object.interface';
2
2
  export declare class KritzelWheelHelper {
3
- static shouldKeepWheelInDynamicObject(ev: WheelEvent, dynamicObject: KritzelDynamicObject): boolean;
3
+ static shouldKeepWheelInDynamicObject(ev: WheelEvent, dynamicObject: KritzelEmbeddedObject): boolean;
4
4
  private static getScrollableContainerFromEventPath;
5
5
  private static isScrollableElement;
6
6
  private static canElementConsumeWheel;
@@ -17,6 +17,7 @@ export * from './classes/objects/line.class';
17
17
  export * from './classes/objects/group.class';
18
18
  export * from './classes/objects/shape.class';
19
19
  export * from './classes/objects/dynamic-object.class';
20
+ export * from './classes/objects/iframe.class';
20
21
  export * from './classes/objects/selection-group.class';
21
22
  export * from './classes/objects/selection-box.class';
22
23
  export * from './classes/tools/base-tool.class';
@@ -53,10 +54,12 @@ export * from './classes/registries/dynamic-object-renderer.registry';
53
54
  export * from './classes/registries/font-registry.class';
54
55
  export * from './classes/registries/icon-registry.class';
55
56
  export * from './interfaces/toolbar-item.interface';
57
+ export * from './interfaces/tool.interface';
56
58
  export * from './interfaces/menu-item.interface';
57
59
  export * from './interfaces/object-export.interface';
58
60
  export * from './interfaces/object-change-event.interface';
59
61
  export * from './interfaces/dynamic-object-renderer.interface';
62
+ export * from './interfaces/embedded-object.interface';
60
63
  export * from './interfaces/sync-provider.interface';
61
64
  export * from './interfaces/sync-config.interface';
62
65
  export * from './interfaces/asset.interface';
@@ -1,4 +1,5 @@
1
1
  import { KritzelBaseObject } from "../classes/objects/base-object.class";
2
+ import { KritzelIconName } from "../classes/registries/icon-registry.class";
2
3
  import { KritzelTermKey } from "./localization.interface";
3
4
  export interface ContextMenuItem {
4
5
  /**
@@ -11,7 +12,7 @@ export interface ContextMenuItem {
11
12
  x: number;
12
13
  y: number;
13
14
  }, objects: KritzelBaseObject[]) => void;
14
- icon?: string;
15
+ icon?: KritzelIconName;
15
16
  group?: string;
16
17
  children?: ContextMenuItem[];
17
18
  isVisible?: boolean | ((menu: {
@@ -29,6 +29,13 @@ export interface KritzelDynamicObjectRenderer {
29
29
  * @param changedProperties - Array of property names that changed
30
30
  */
31
31
  onUpdate?(context: KritzelDynamicObjectRenderContext, changedProperties: string[]): void;
32
+ /**
33
+ * Called when the object is serialized, including clipboard copy and workspace export.
34
+ * Return JSON-safe state that can recreate behavior when the object is revived.
35
+ * @param context - Render context with object, mounted container when available, and current data
36
+ * @returns Serializable renderer data to persist on the object
37
+ */
38
+ onSerialize?(context: KritzelDynamicObjectRenderContext): unknown;
32
39
  /**
33
40
  * Called when the object leaves the viewport, is deleted, or workspace is unloaded.
34
41
  * Renderer must clean up event listeners, timers, framework instances, and remove DOM.