@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.
- package/LICENSE.md +49 -49
- package/dist/cjs/{engine.constants-CakmdKMW.js → engine.constants-VyFrUl1W.js} +627 -129
- package/dist/cjs/{index-BbbWU2aN.js → index-BP5Iy6FQ.js} +27 -9
- package/dist/cjs/index.cjs.js +4 -2
- package/dist/cjs/kritzel-awareness-cursors_5.cjs.entry.js +257 -113
- package/dist/cjs/loader.cjs.js +2 -2
- package/dist/cjs/stencil.cjs.js +3 -3
- package/dist/collection/classes/core/core.class.js +40 -32
- package/dist/collection/classes/core/reviver.class.js +4 -0
- package/dist/collection/classes/core/store.class.js +10 -3
- package/dist/collection/classes/managers/cursor.manager.js +10 -5
- package/dist/collection/classes/objects/dynamic-object.class.js +18 -5
- package/dist/collection/classes/objects/iframe.class.js +447 -0
- package/dist/collection/classes/registries/icon-registry.class.js +100 -67
- package/dist/collection/classes/tools/selection-tool.class.js +3 -3
- package/dist/collection/collection-manifest.json +4 -2
- package/dist/collection/components/kritzel-awareness-cursors/kritzel-awareness-cursors.css +115 -115
- package/dist/collection/components/kritzel-awareness-cursors/kritzel-awareness-cursors.js +1 -1
- package/dist/collection/components/kritzel-cursor-trail/kritzel-cursor-trail.css +10 -10
- package/dist/collection/components/kritzel-cursor-trail/kritzel-cursor-trail.js +1 -1
- package/dist/collection/components/kritzel-engine/kritzel-engine.css +80 -80
- package/dist/collection/components/kritzel-engine/kritzel-engine.js +196 -44
- package/dist/collection/components/kritzel-icon/kritzel-icon.css +18 -18
- package/dist/collection/components/kritzel-icon/kritzel-icon.js +25 -4
- package/dist/collection/components/kritzel-watermark/kritzel-watermark.css +29 -29
- package/dist/collection/components/kritzel-watermark/kritzel-watermark.js +2 -2
- package/dist/collection/constants/version.js +1 -1
- package/dist/collection/helpers/cursor.helper.js +8 -8
- package/dist/collection/helpers/object.helper.js +13 -0
- package/dist/collection/helpers/svg-export.helper.js +55 -41
- package/dist/collection/helpers/wheel.helper.js +1 -7
- package/dist/collection/index.js +3 -0
- package/dist/collection/interfaces/embedded-object.interface.js +1 -0
- package/dist/collection/themes/dark-theme.js +1 -5
- package/dist/collection/themes/light-theme.js +1 -6
- package/dist/components/index.js +7 -7
- package/dist/components/kritzel-awareness-cursors.js +1 -1
- package/dist/components/kritzel-cursor-trail.js +1 -1
- package/dist/components/kritzel-engine.js +755 -161
- package/dist/components/kritzel-icon.js +1 -1
- package/dist/components/kritzel-watermark.js +1 -1
- package/dist/components/{p-B2Htv9ou.js → p-BHVbfJrf.js} +3 -3
- package/dist/components/{p-YP8wAcF4.js → p-BTU9qcSW.js} +2 -2
- package/dist/components/{p-CfSx6HU_.js → p-BWfRbEIq.js} +16 -4
- package/dist/components/p-NAEiq8CK.js +214 -0
- package/dist/components/{p-BvRGQvVI.js → p-k0LxV9Bg.js} +18 -14
- package/dist/esm/{engine.constants-Bl5-pbq-.js → engine.constants-BHTr2qPx.js} +626 -130
- package/dist/esm/{index-BU9Mv7y0.js → index-C8PnHbLt.js} +27 -10
- package/dist/esm/index.js +3 -3
- package/dist/esm/kritzel-awareness-cursors_5.entry.js +257 -113
- package/dist/esm/loader.js +3 -3
- package/dist/esm/stencil.js +4 -4
- package/dist/stencil/index.esm.js +3 -3
- package/dist/stencil/{p-f0a8b7af.entry.js → p-40097a38.entry.js} +257 -113
- package/dist/stencil/{p-Bl5-pbq-.js → p-BHTr2qPx.js} +626 -130
- package/dist/stencil/{p-BU9Mv7y0.js → p-C8PnHbLt.js} +27 -10
- package/dist/stencil/stencil.esm.js +4 -4
- package/dist/types/classes/core/store.class.d.ts +3 -2
- package/dist/types/classes/objects/dynamic-object.class.d.ts +4 -2
- package/dist/types/classes/objects/iframe.class.d.ts +76 -0
- package/dist/types/classes/registries/icon-registry.class.d.ts +75 -6
- package/dist/types/components/kritzel-engine/kritzel-engine.d.ts +14 -1
- package/dist/types/components/kritzel-icon/kritzel-icon.d.ts +5 -1
- package/dist/types/components.d.ts +26 -8
- package/dist/types/constants/version.d.ts +1 -1
- package/dist/types/helpers/cursor.helper.d.ts +2 -1
- package/dist/types/helpers/object.helper.d.ts +2 -0
- package/dist/types/helpers/svg-export.helper.d.ts +1 -0
- package/dist/types/helpers/wheel.helper.d.ts +2 -2
- package/dist/types/index.d.ts +3 -0
- package/dist/types/interfaces/context-menu-item.interface.d.ts +2 -1
- package/dist/types/interfaces/dynamic-object-renderer.interface.d.ts +7 -0
- package/dist/types/interfaces/embedded-object.interface.d.ts +9 -0
- package/dist/types/interfaces/engine-state.interface.d.ts +3 -2
- package/dist/types/interfaces/login-config.interface.d.ts +2 -1
- package/dist/types/interfaces/master-detail.interface.d.ts +2 -1
- package/dist/types/interfaces/menu-item.interface.d.ts +2 -1
- package/dist/types/interfaces/theme.interface.d.ts +6 -7
- package/dist/types/interfaces/tool.interface.d.ts +9 -0
- package/dist/types/interfaces/toolbar-item.interface.d.ts +3 -2
- package/dist/types/stencil-public-runtime.d.ts +61 -55
- package/package.json +3 -1
- package/readme.md +10 -10
- package/dist/components/p-fx6msYHJ.js +0 -167
package/dist/cjs/loader.cjs.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var index = require('./index-
|
|
3
|
+
var index = require('./index-BP5Iy6FQ.js');
|
|
4
4
|
var appGlobals = require('./app-globals-V2Kpy_OQ.js');
|
|
5
5
|
|
|
6
6
|
const defineCustomElements = async (win, options) => {
|
|
7
7
|
if (typeof window === 'undefined') return undefined;
|
|
8
8
|
await appGlobals.globalScripts();
|
|
9
|
-
return index.bootstrapLazy([["kritzel-awareness-cursors_5.cjs",[[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],"
|
|
9
|
+
return index.bootstrapLazy([["kritzel-awareness-cursors_5.cjs",[[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);
|
|
10
10
|
};
|
|
11
11
|
|
|
12
12
|
exports.setNonce = index.setNonce;
|
package/dist/cjs/stencil.cjs.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var index = require('./index-
|
|
3
|
+
var index = require('./index-BP5Iy6FQ.js');
|
|
4
4
|
var appGlobals = require('./app-globals-V2Kpy_OQ.js');
|
|
5
5
|
|
|
6
6
|
var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
|
|
7
7
|
/*
|
|
8
|
-
Stencil Client Patch Browser v4.
|
|
8
|
+
Stencil Client Patch Browser v4.45.1 | MIT Licensed | https://stenciljs.com
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
11
|
var patchBrowser = () => {
|
|
@@ -19,7 +19,7 @@ var patchBrowser = () => {
|
|
|
19
19
|
|
|
20
20
|
patchBrowser().then(async (options) => {
|
|
21
21
|
await appGlobals.globalScripts();
|
|
22
|
-
return index.bootstrapLazy([["kritzel-awareness-cursors_5.cjs",[[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],"
|
|
22
|
+
return index.bootstrapLazy([["kritzel-awareness-cursors_5.cjs",[[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);
|
|
23
23
|
});
|
|
24
24
|
|
|
25
25
|
exports.setNonce = index.setNonce;
|
|
@@ -18,6 +18,7 @@ import { KritzelLicenseManager } from "../managers/license.manager";
|
|
|
18
18
|
import { KritzelBrowserPermissionManager } from "../managers/browser-permission.manager";
|
|
19
19
|
import { KritzelClipboardManager } from "../managers/clipboard.manager";
|
|
20
20
|
import { KritzelClassHelper } from "../../helpers/class.helper";
|
|
21
|
+
import { ObjectHelper } from "../../helpers/object.helper";
|
|
21
22
|
/**
|
|
22
23
|
* Central orchestrator class for the Kritzel canvas system.
|
|
23
24
|
* Manages workspaces, objects, selection, clipboard operations, and coordinates
|
|
@@ -357,7 +358,7 @@ export class KritzelCore {
|
|
|
357
358
|
this._store.state.translateY = viewportHeight / 2 - (viewport.centerWorldY ?? 0) * scale;
|
|
358
359
|
this._store.state.scale = scale;
|
|
359
360
|
await objectsMap.initialize(this, activeWorkspace.id, this._syncConfig);
|
|
360
|
-
this.seedWorkspaceObjects(activeWorkspace, objectsMap);
|
|
361
|
+
await this.seedWorkspaceObjects(activeWorkspace, objectsMap);
|
|
361
362
|
// Set local user in awareness after object map is initialized
|
|
362
363
|
if (this._user) {
|
|
363
364
|
objectsMap.setLocalUser(this._user);
|
|
@@ -371,15 +372,21 @@ export class KritzelCore {
|
|
|
371
372
|
this.engine.emitObjectsChange();
|
|
372
373
|
this.rerender();
|
|
373
374
|
}
|
|
374
|
-
seedWorkspaceObjects(workspace, objectsMap) {
|
|
375
|
+
async seedWorkspaceObjects(workspace, objectsMap) {
|
|
375
376
|
if (!workspace.objects?.length) {
|
|
376
377
|
return;
|
|
377
378
|
}
|
|
379
|
+
const pendingObjects = workspace.objects.filter(object => !objectsMap.findById(object.id));
|
|
380
|
+
// Mirrors engine.addObject()/addObjects(): image asset upload is async and must
|
|
381
|
+
// happen before the (synchronous) Yjs transaction that inserts the objects.
|
|
382
|
+
for (const object of pendingObjects) {
|
|
383
|
+
object._core = this;
|
|
384
|
+
if (KritzelClassHelper.isInstanceOf(object, 'KritzelImage')) {
|
|
385
|
+
await object.prepareForInsert();
|
|
386
|
+
}
|
|
387
|
+
}
|
|
378
388
|
objectsMap.transaction(() => {
|
|
379
|
-
for (const object of
|
|
380
|
-
if (objectsMap.findById(object.id)) {
|
|
381
|
-
continue;
|
|
382
|
-
}
|
|
389
|
+
for (const object of pendingObjects) {
|
|
383
390
|
this.prepareObjectForWorkspace(object, workspace.id, this._store.currentZIndex, this._store.state.scale);
|
|
384
391
|
objectsMap.insert(object);
|
|
385
392
|
}
|
|
@@ -418,16 +425,30 @@ export class KritzelCore {
|
|
|
418
425
|
* @param scaleFallback - Scale applied to objects that do not define one
|
|
419
426
|
* @returns The objects that were added, updated and removed
|
|
420
427
|
*/
|
|
421
|
-
reconcileWorkspaceObjects(objectsMap, workspaceId, desiredObjects, nextZIndex, scaleFallback) {
|
|
428
|
+
async reconcileWorkspaceObjects(objectsMap, workspaceId, desiredObjects, nextZIndex, scaleFallback) {
|
|
422
429
|
const existingObjects = objectsMap.allObjects().filter(o => !(o instanceof KritzelSelectionGroup) && !(o instanceof KritzelSelectionBox));
|
|
423
430
|
const existingById = new Map(existingObjects.map(object => [object.id, object]));
|
|
424
431
|
const desiredIds = new Set();
|
|
425
432
|
const diff = { added: [], updated: [], removed: [] };
|
|
433
|
+
// Assign IDs up front so the insert-vs-update lookup below is stable, and so the
|
|
434
|
+
// async image-prepare pass and the (synchronous) transaction agree on identity.
|
|
435
|
+
for (const object of desiredObjects) {
|
|
436
|
+
if (!object.id) {
|
|
437
|
+
object.id = object.generateId();
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
// Mirrors engine.addObject()/addObjects(): image asset upload is async and must
|
|
441
|
+
// happen before the (synchronous) Yjs transaction that inserts the objects.
|
|
442
|
+
for (const object of desiredObjects) {
|
|
443
|
+
const existingObject = existingById.get(object.id);
|
|
444
|
+
const isNewOrReplaced = !existingObject || existingObject !== object;
|
|
445
|
+
if (isNewOrReplaced && KritzelClassHelper.isInstanceOf(object, 'KritzelImage')) {
|
|
446
|
+
object._core = this;
|
|
447
|
+
await object.prepareForInsert();
|
|
448
|
+
}
|
|
449
|
+
}
|
|
426
450
|
objectsMap.transaction(() => {
|
|
427
451
|
for (const object of desiredObjects) {
|
|
428
|
-
if (!object.id) {
|
|
429
|
-
object.id = object.generateId();
|
|
430
|
-
}
|
|
431
452
|
desiredIds.add(object.id);
|
|
432
453
|
const existingObject = existingById.get(object.id);
|
|
433
454
|
if (!existingObject) {
|
|
@@ -465,7 +486,7 @@ export class KritzelCore {
|
|
|
465
486
|
* object set stays exactly what the caller declared.
|
|
466
487
|
*/
|
|
467
488
|
detachObject(object) {
|
|
468
|
-
if (
|
|
489
|
+
if (ObjectHelper.isKritzelEmbeddedObject(object)) {
|
|
469
490
|
object.unmount();
|
|
470
491
|
}
|
|
471
492
|
object.isMounted = false;
|
|
@@ -641,13 +662,13 @@ export class KritzelCore {
|
|
|
641
662
|
activeWorkspace.viewport = { centerWorldX, centerWorldY, scale };
|
|
642
663
|
}
|
|
643
664
|
}
|
|
644
|
-
applyObjectsToActiveWorkspace(workspace, desiredObjects) {
|
|
665
|
+
async applyObjectsToActiveWorkspace(workspace, desiredObjects) {
|
|
645
666
|
const objectsMap = this._store.objects;
|
|
646
667
|
if (!objectsMap) {
|
|
647
668
|
return null;
|
|
648
669
|
}
|
|
649
670
|
this.clearSelection();
|
|
650
|
-
const diff = this.reconcileWorkspaceObjects(objectsMap, workspace.id, desiredObjects, () => this._store.currentZIndex, this._store.state.scale);
|
|
671
|
+
const diff = await this.reconcileWorkspaceObjects(objectsMap, workspace.id, desiredObjects, () => this._store.currentZIndex, this._store.state.scale);
|
|
651
672
|
this._anchorManager.rebuildIndex();
|
|
652
673
|
this.rerender();
|
|
653
674
|
return diff;
|
|
@@ -666,7 +687,7 @@ export class KritzelCore {
|
|
|
666
687
|
try {
|
|
667
688
|
await objectsMap.initialize(this, workspace.id, this._syncConfig, { headless: true, workspaceName: workspace.name });
|
|
668
689
|
await objectsMap.whenNetworkSynced();
|
|
669
|
-
return this.reconcileWorkspaceObjects(objectsMap, workspace.id, desiredObjects, () => this.nextZIndexOf(objectsMap), this._store.state.scale);
|
|
690
|
+
return await this.reconcileWorkspaceObjects(objectsMap, workspace.id, desiredObjects, () => this.nextZIndexOf(objectsMap), this._store.state.scale);
|
|
670
691
|
}
|
|
671
692
|
finally {
|
|
672
693
|
objectsMap.destroy();
|
|
@@ -752,8 +773,7 @@ export class KritzelCore {
|
|
|
752
773
|
this.removeObject(child);
|
|
753
774
|
});
|
|
754
775
|
}
|
|
755
|
-
|
|
756
|
-
if (KritzelClassHelper.isInstanceOf(object, 'KritzelDynamicObject')) {
|
|
776
|
+
if (ObjectHelper.isKritzelEmbeddedObject(object)) {
|
|
757
777
|
object.unmount();
|
|
758
778
|
}
|
|
759
779
|
// Handle anchor cleanup
|
|
@@ -799,14 +819,8 @@ export class KritzelCore {
|
|
|
799
819
|
this.removeLocalSelectionGroups();
|
|
800
820
|
this.removeSelectionBox();
|
|
801
821
|
for (const object of selectionGroup.objects ?? []) {
|
|
802
|
-
if (
|
|
803
|
-
|
|
804
|
-
if (typeof dynamicObject.setIsInteractive === 'function') {
|
|
805
|
-
dynamicObject.setIsInteractive(true);
|
|
806
|
-
}
|
|
807
|
-
else {
|
|
808
|
-
dynamicObject.isInteractive = true;
|
|
809
|
-
}
|
|
822
|
+
if (ObjectHelper.isKritzelEmbeddedObject(object)) {
|
|
823
|
+
object.setIsInteractive(true);
|
|
810
824
|
}
|
|
811
825
|
}
|
|
812
826
|
this._store.objects.insert(selectionGroup);
|
|
@@ -827,14 +841,8 @@ export class KritzelCore {
|
|
|
827
841
|
teardownSelectionGroup(selectionGroup) {
|
|
828
842
|
selectionGroup.deselectAllChildren?.();
|
|
829
843
|
for (const object of selectionGroup.objects ?? []) {
|
|
830
|
-
if (
|
|
831
|
-
|
|
832
|
-
if (typeof dynamicObject.setIsInteractive === 'function') {
|
|
833
|
-
dynamicObject.setIsInteractive(false);
|
|
834
|
-
}
|
|
835
|
-
else {
|
|
836
|
-
dynamicObject.isInteractive = false;
|
|
837
|
-
}
|
|
844
|
+
if (ObjectHelper.isKritzelEmbeddedObject(object)) {
|
|
845
|
+
object.setIsInteractive(false);
|
|
838
846
|
}
|
|
839
847
|
}
|
|
840
848
|
}
|
|
@@ -13,6 +13,7 @@ import { KritzelSelectionTool } from "../tools/selection-tool.class";
|
|
|
13
13
|
import { KritzelTextTool } from "../tools/text-tool.class";
|
|
14
14
|
import { KritzelShapeTool } from "../tools/shape-tool.class";
|
|
15
15
|
import { KritzelDynamicObject } from "../objects/dynamic-object.class";
|
|
16
|
+
import { KritzelIframeObject } from "../objects/iframe.class";
|
|
16
17
|
import { KritzelWorkspace } from "./workspace.class";
|
|
17
18
|
/**
|
|
18
19
|
* Handles deserialization/revival of Kritzel objects from plain JavaScript objects.
|
|
@@ -76,6 +77,9 @@ export class KritzelReviver {
|
|
|
76
77
|
case 'KritzelDynamicObject':
|
|
77
78
|
revivedObj = KritzelDynamicObject.create(this._core).deserialize(obj);
|
|
78
79
|
break;
|
|
80
|
+
case 'KritzelIframeObject':
|
|
81
|
+
revivedObj = KritzelIframeObject.create(this._core).deserialize(obj);
|
|
82
|
+
break;
|
|
79
83
|
case 'KritzelSelectionGroup':
|
|
80
84
|
revivedObj = KritzelSelectionGroup.create(this._core).deserialize(obj);
|
|
81
85
|
break;
|
|
@@ -4,7 +4,7 @@ import { KritzelText } from "../objects/text.class";
|
|
|
4
4
|
import { KritzelShape } from "../objects/shape.class";
|
|
5
5
|
import { KritzelPath } from "../objects/path.class";
|
|
6
6
|
import { KritzelLine } from "../objects/line.class";
|
|
7
|
-
import {
|
|
7
|
+
import { ObjectHelper } from "../../helpers/object.helper";
|
|
8
8
|
import { KritzelObjectMap } from "../structures/object-map.structure";
|
|
9
9
|
/**
|
|
10
10
|
* Central state management store for the Kritzel engine.
|
|
@@ -227,9 +227,16 @@ export class KritzelStore {
|
|
|
227
227
|
* Gets the currently selected dynamic object whose focused descendant is an input-like element.
|
|
228
228
|
* @returns The interactive dynamic object with focused input-like content, or null if none matches
|
|
229
229
|
*/
|
|
230
|
+
get activeInteractiveEmbeddedObject() {
|
|
231
|
+
for (const object of this.selectedObjects) {
|
|
232
|
+
if (ObjectHelper.isKritzelEmbeddedObject(object) && object.hasFocusedInputElement()) {
|
|
233
|
+
return object;
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
230
238
|
get activeInteractiveDynamicObject() {
|
|
231
|
-
|
|
232
|
-
return interactiveDynamicObject ?? null;
|
|
239
|
+
return this.activeInteractiveEmbeddedObject;
|
|
233
240
|
}
|
|
234
241
|
/**
|
|
235
242
|
* Gets the path currently being drawn (not yet completed).
|
|
@@ -24,11 +24,13 @@ export class KritzelCursorManager {
|
|
|
24
24
|
// Reset cursor on old target
|
|
25
25
|
if (this._targetElement) {
|
|
26
26
|
this._targetElement.style.cursor = '';
|
|
27
|
+
this._targetElement.style.removeProperty('--kritzel-global-default-cursor');
|
|
27
28
|
this._targetElement.style.removeProperty('--kritzel-global-pointer-cursor');
|
|
28
29
|
}
|
|
29
30
|
this._targetElement = element;
|
|
30
31
|
// Set the pointer cursor CSS variable for child components to use
|
|
31
32
|
if (this._targetElement) {
|
|
33
|
+
this._targetElement.style.setProperty('--kritzel-global-default-cursor', KritzelCursorHelper.getCursor({ iconName: 'default' }));
|
|
32
34
|
this._targetElement.style.setProperty('--kritzel-global-pointer-cursor', KritzelCursorHelper.getPointerCursor());
|
|
33
35
|
}
|
|
34
36
|
}
|
|
@@ -73,8 +75,10 @@ export class KritzelCursorManager {
|
|
|
73
75
|
if (!this._shadowRoot)
|
|
74
76
|
return;
|
|
75
77
|
const elementsAtPoint = this._shadowRoot.elementsFromPoint(ev.clientX, ev.clientY);
|
|
76
|
-
if (!elementsAtPoint || elementsAtPoint.length === 0)
|
|
78
|
+
if (!elementsAtPoint || elementsAtPoint.length === 0) {
|
|
79
|
+
this.resetToDefault();
|
|
77
80
|
return;
|
|
81
|
+
}
|
|
78
82
|
// Check for resize handle overlays (selection group)
|
|
79
83
|
const resizeHandleOverlay = elementsAtPoint.find(el => el.classList.contains('resize-handle-overlay'));
|
|
80
84
|
if (resizeHandleOverlay) {
|
|
@@ -84,19 +88,19 @@ export class KritzelCursorManager {
|
|
|
84
88
|
const isTopLeft = resizeHandleOverlay.classList.contains('top-left');
|
|
85
89
|
const isBottomRight = resizeHandleOverlay.classList.contains('bottom-right');
|
|
86
90
|
const rotationOffset = (isTopLeft || isBottomRight) ? -45 : 45;
|
|
87
|
-
this._core.store.state.cursor = { icon: '
|
|
91
|
+
this._core.store.state.cursor = { icon: 'moveVertical', rotation: rotationDegrees + rotationOffset };
|
|
88
92
|
return;
|
|
89
93
|
}
|
|
90
94
|
// Check for rotation handle overlay
|
|
91
95
|
const rotationHandleOverlay = elementsAtPoint.find(el => el.classList.contains('rotation-handle-overlay'));
|
|
92
96
|
if (rotationHandleOverlay) {
|
|
93
|
-
this._core.store.state.cursor = { icon: 'hand', iconActive: '
|
|
97
|
+
this._core.store.state.cursor = { icon: 'hand', iconActive: 'handGrab' };
|
|
94
98
|
return;
|
|
95
99
|
}
|
|
96
100
|
// Check for line handle overlays (selection line)
|
|
97
101
|
const lineHandleOverlay = elementsAtPoint.find(el => el.classList.contains('selection-line-handle-overlay'));
|
|
98
102
|
if (lineHandleOverlay) {
|
|
99
|
-
this._core.store.state.cursor = { icon: 'hand', iconActive: '
|
|
103
|
+
this._core.store.state.cursor = { icon: 'hand', iconActive: 'handGrab' };
|
|
100
104
|
return;
|
|
101
105
|
}
|
|
102
106
|
// Reset cursor if not hovering any handle
|
|
@@ -131,7 +135,8 @@ export class KritzelCursorManager {
|
|
|
131
135
|
cleanup() {
|
|
132
136
|
if (this._targetElement) {
|
|
133
137
|
this._targetElement.style.cursor = '';
|
|
134
|
-
this._targetElement.style.removeProperty('--kritzel-
|
|
138
|
+
this._targetElement.style.removeProperty('--kritzel-global-default-cursor');
|
|
139
|
+
this._targetElement.style.removeProperty('--kritzel-global-pointer-cursor');
|
|
135
140
|
}
|
|
136
141
|
this._targetElement = null;
|
|
137
142
|
this._shadowRoot = null;
|
|
@@ -126,7 +126,7 @@ export class KritzelDynamicObject extends KritzelBaseObject {
|
|
|
126
126
|
}
|
|
127
127
|
applyInteractiveState() {
|
|
128
128
|
const pointerEvents = this.isInteractive ? 'auto' : 'none';
|
|
129
|
-
const contentCursor = this.isInteractive ? 'auto' : '';
|
|
129
|
+
const contentCursor = this.isInteractive ? 'var(--kritzel-global-default-cursor, auto)' : '';
|
|
130
130
|
if (this.element) {
|
|
131
131
|
this.element.style.pointerEvents = pointerEvents;
|
|
132
132
|
this.element.style.cursor = contentCursor;
|
|
@@ -162,7 +162,7 @@ export class KritzelDynamicObject extends KritzelBaseObject {
|
|
|
162
162
|
if (!this.isInteractive) {
|
|
163
163
|
return false;
|
|
164
164
|
}
|
|
165
|
-
const focusHosts = this.
|
|
165
|
+
const focusHosts = this.getEmbeddedContentRoots();
|
|
166
166
|
// Primary path: locate the focused input-like element by walking from each host through
|
|
167
167
|
// `:focus` (piercing open shadow roots). This works in real browsers even when the engine
|
|
168
168
|
// and editor are nested web components, because it never relies on the document-level
|
|
@@ -179,7 +179,7 @@ export class KritzelDynamicObject extends KritzelBaseObject {
|
|
|
179
179
|
}
|
|
180
180
|
return false;
|
|
181
181
|
}
|
|
182
|
-
|
|
182
|
+
getEmbeddedContentRoots() {
|
|
183
183
|
const hosts = [];
|
|
184
184
|
if (this.element) {
|
|
185
185
|
hosts.push(this.element);
|
|
@@ -392,11 +392,11 @@ export class KritzelDynamicObject extends KritzelBaseObject {
|
|
|
392
392
|
* @returns A serializable object with htmlString and dimension snapshots
|
|
393
393
|
*/
|
|
394
394
|
serialize() {
|
|
395
|
-
const { _core, _elementRef, element, totalWidth, totalHeight, isSelected, isHovered, isMounted, isInteractive, resizing, markedForRemoval, isVisible, ...props } = this;
|
|
395
|
+
const { _core, _elementRef, element, totalWidth, totalHeight, isSelected, isHovered, isMounted, isInteractive, resizing, markedForRemoval, isVisible, rendererData, ...props } = this;
|
|
396
396
|
const cloned = structuredClone(props);
|
|
397
397
|
// Include rendererKey and rendererData for lifecycle-driven rendering
|
|
398
398
|
cloned.rendererKey = this.rendererKey;
|
|
399
|
-
cloned.rendererData = this.
|
|
399
|
+
cloned.rendererData = this.serializeRendererData();
|
|
400
400
|
// Store HTML as string for fallback/compatibility when renderer is unavailable
|
|
401
401
|
cloned.htmlString = element ? element.outerHTML : '';
|
|
402
402
|
// Capture dimension snapshot at serialization time
|
|
@@ -404,6 +404,19 @@ export class KritzelDynamicObject extends KritzelBaseObject {
|
|
|
404
404
|
cloned.serializedHeight = this.height;
|
|
405
405
|
return cloned;
|
|
406
406
|
}
|
|
407
|
+
serializeRendererData() {
|
|
408
|
+
if (this.rendererKey) {
|
|
409
|
+
const renderer = KritzelDynamicObjectRendererRegistry.get(this.rendererKey);
|
|
410
|
+
if (renderer?.onSerialize) {
|
|
411
|
+
return structuredClone(renderer.onSerialize({
|
|
412
|
+
object: this,
|
|
413
|
+
container: this.isMounted && this.elementRef instanceof HTMLElement ? this.elementRef : null,
|
|
414
|
+
data: this.rendererData,
|
|
415
|
+
}));
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
return structuredClone(this.rendererData);
|
|
419
|
+
}
|
|
407
420
|
/**
|
|
408
421
|
* Deserializes the dynamic object from a plain object.
|
|
409
422
|
* Reconstructs the element from stored HTML string with fallback to placeholder.
|