kritzel-stencil 0.3.22 → 0.3.23

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 (104) hide show
  1. package/dist/cjs/index.cjs.js +3 -1
  2. package/dist/cjs/kritzel-active-users_45.cjs.entry.js +507 -288
  3. package/dist/cjs/{schema.constants-IBG5VW_J.js → schema.constants-Lr_zNkox.js} +713 -47
  4. package/dist/collection/classes/core/core.class.js +83 -5
  5. package/dist/collection/classes/core/store.class.js +9 -0
  6. package/dist/collection/classes/handlers/key.handler.js +1 -1
  7. package/dist/collection/classes/handlers/selection.handler.js +13 -9
  8. package/dist/collection/classes/objects/base-object.class.js +20 -8
  9. package/dist/collection/classes/objects/custom-element.class.js +330 -8
  10. package/dist/collection/classes/objects/image.class.js +0 -1
  11. package/dist/collection/classes/objects/selection-group.class.js +12 -0
  12. package/dist/collection/classes/providers/assets/asset-resolver.class.js +24 -14
  13. package/dist/collection/classes/providers/assets/indexeddb-asset-provider.class.js +0 -8
  14. package/dist/collection/classes/registries/custom-element-renderer.registry.js +52 -0
  15. package/dist/collection/classes/structures/app-state-map.structure.js +17 -3
  16. package/dist/collection/classes/structures/object-map.structure.js +17 -3
  17. package/dist/collection/classes/tools/selection-tool.class.js +34 -6
  18. package/dist/collection/components/core/kritzel-editor/kritzel-editor.js +9 -8
  19. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js +211 -78
  20. package/dist/collection/components/ui/kritzel-settings/kritzel-settings.js +2 -1
  21. package/dist/collection/configs/default-engine-config.js +3 -2
  22. package/dist/collection/constants/version.js +1 -1
  23. package/dist/collection/helpers/html.helper.js +52 -0
  24. package/dist/collection/helpers/object.helper.js +3 -0
  25. package/dist/collection/helpers/svg-export.helper.js +35 -0
  26. package/dist/collection/helpers/wheel.helper.js +113 -0
  27. package/dist/collection/index.js +3 -0
  28. package/dist/collection/interfaces/custom-element-renderer.interface.js +1 -0
  29. package/dist/components/index.js +1 -1
  30. package/dist/components/kritzel-awareness-cursors.js +1 -1
  31. package/dist/components/kritzel-controls.js +1 -1
  32. package/dist/components/kritzel-current-user-dialog.js +1 -1
  33. package/dist/components/kritzel-current-user.js +1 -1
  34. package/dist/components/kritzel-dialog.js +1 -1
  35. package/dist/components/kritzel-editor.js +1 -1
  36. package/dist/components/kritzel-engine.js +1 -1
  37. package/dist/components/kritzel-export.js +1 -1
  38. package/dist/components/kritzel-login-dialog.js +1 -1
  39. package/dist/components/kritzel-menu-item.js +1 -1
  40. package/dist/components/kritzel-menu.js +1 -1
  41. package/dist/components/kritzel-more-menu.js +1 -1
  42. package/dist/components/kritzel-portal.js +1 -1
  43. package/dist/components/kritzel-settings.js +1 -1
  44. package/dist/components/kritzel-share-dialog.js +1 -1
  45. package/dist/components/kritzel-split-button.js +1 -1
  46. package/dist/components/kritzel-tool-config.js +1 -1
  47. package/dist/components/kritzel-tooltip.js +1 -1
  48. package/dist/components/kritzel-workspace-manager.js +1 -1
  49. package/dist/components/{p-BwuemYET.js → p-B4WfPDj0.js} +1 -1
  50. package/dist/components/p-BNu3Akp5.js +1 -0
  51. package/dist/components/p-BYveczcb.js +1 -0
  52. package/dist/components/{p-D28ZylHn.js → p-BixEMVtW.js} +1 -1
  53. package/dist/components/{p-Ndib1Jb3.js → p-BntMEYss.js} +1 -1
  54. package/dist/components/p-C48bv_0f.js +9 -0
  55. package/dist/components/{p-BO1CnEOT.js → p-CPMpf9ku.js} +1 -1
  56. package/dist/components/{p-BhODnvMO.js → p-CZQz_mul.js} +1 -1
  57. package/dist/components/{p-COj8EVzL.js → p-Ckpa5tHF.js} +1 -1
  58. package/dist/components/{p-BPoDE87Q.js → p-DJ3KI725.js} +1 -1
  59. package/dist/components/{p-DRsD38Nl.js → p-DPlEzPKO.js} +1 -1
  60. package/dist/components/{p-C-RiEw9X.js → p-DSd5xTAH.js} +1 -1
  61. package/dist/components/{p-CbMLbDou.js → p-DTqMF94b.js} +1 -1
  62. package/dist/components/{p-CHrSFOSI.js → p-DX2nriaq.js} +1 -1
  63. package/dist/components/{p-BAN5dnHX.js → p-Dd-pMvlr.js} +1 -1
  64. package/dist/components/{p-C5TZjIE1.js → p-M9m9-OEY.js} +1 -1
  65. package/dist/components/p-WUdQqYnu.js +1 -0
  66. package/dist/components/{p-YFR180v-.js → p-XDNjFYRB.js} +1 -1
  67. package/dist/components/{p-CJEIUs0x.js → p-X_pyPCe8.js} +1 -1
  68. package/dist/components/{p-CpR9lc-o.js → p-meY80XnF.js} +1 -1
  69. package/dist/components/{p-6Ca7Eolf.js → p-y5T0_Wvi.js} +1 -1
  70. package/dist/esm/index.js +2 -2
  71. package/dist/esm/kritzel-active-users_45.entry.js +500 -281
  72. package/dist/esm/{schema.constants-D35cwCYd.js → schema.constants-DMPBDrZh.js} +711 -47
  73. package/dist/stencil/index.esm.js +1 -1
  74. package/dist/stencil/p-27d41f6f.entry.js +9 -0
  75. package/dist/stencil/p-DMPBDrZh.js +1 -0
  76. package/dist/stencil/stencil.esm.js +1 -1
  77. package/dist/types/classes/core/core.class.d.ts +15 -0
  78. package/dist/types/classes/core/store.class.d.ts +6 -0
  79. package/dist/types/classes/objects/base-object.class.d.ts +3 -2
  80. package/dist/types/classes/objects/custom-element.class.d.ts +87 -21
  81. package/dist/types/classes/objects/image.class.d.ts +0 -1
  82. package/dist/types/classes/objects/selection-group.class.d.ts +1 -0
  83. package/dist/types/classes/providers/assets/asset-resolver.class.d.ts +3 -0
  84. package/dist/types/classes/providers/assets/indexeddb-asset-provider.class.d.ts +0 -1
  85. package/dist/types/classes/registries/custom-element-renderer.registry.d.ts +32 -0
  86. package/dist/types/components/core/kritzel-engine/kritzel-engine.d.ts +7 -1
  87. package/dist/types/components.d.ts +2 -2
  88. package/dist/types/constants/version.d.ts +1 -1
  89. package/dist/types/helpers/html.helper.d.ts +2 -0
  90. package/dist/types/helpers/object.helper.d.ts +1 -0
  91. package/dist/types/helpers/svg-export.helper.d.ts +9 -0
  92. package/dist/types/helpers/wheel.helper.d.ts +9 -0
  93. package/dist/types/index.d.ts +3 -0
  94. package/dist/types/interfaces/asset-storage-config.interface.d.ts +0 -4
  95. package/dist/types/interfaces/custom-element-renderer.interface.d.ts +40 -0
  96. package/dist/types/interfaces/debug-info.interface.d.ts +1 -0
  97. package/dist/types/interfaces/object.interface.d.ts +0 -1
  98. package/package.json +1 -1
  99. package/dist/components/p-BML28BJR.js +0 -1
  100. package/dist/components/p-CVV-HzFR.js +0 -1
  101. package/dist/components/p-DWhWFDcC.js +0 -9
  102. package/dist/components/p-Dd_EODkk.js +0 -1
  103. package/dist/stencil/p-D35cwCYd.js +0 -1
  104. package/dist/stencil/p-fcbf7965.entry.js +0 -9
@@ -1 +1 @@
1
- import{p as e,b as o}from"./p-Dhio9uis.js";export{s as setNonce}from"./p-Dhio9uis.js";import{g as t}from"./p-DQuL1Twl.js";(()=>{const o=import.meta.url,t={};return""!==o&&(t.resourcesUrl=new URL(".",o).href),e(t)})().then((async e=>(await t(),o(JSON.parse('[["p-fcbf7965",[[512,"kritzel-editor",{"scaleMax":[1026,"scale-max"],"scaleMin":[1026,"scale-min"],"lockDrawingScale":[1028,"lock-drawing-scale"],"viewportBoundaryLeft":[1026,"viewport-boundary-left"],"viewportBoundaryRight":[1026,"viewport-boundary-right"],"viewportBoundaryTop":[1026,"viewport-boundary-top"],"viewportBoundaryBottom":[1026,"viewport-boundary-bottom"],"debugInfo":[1040],"user":[16],"activeUsers":[16],"controls":[16],"globalContextMenuItems":[16],"objectContextMenuItems":[16],"themes":[16],"theme":[1025],"licenseKey":[1,"license-key"],"locale":[1025],"locales":[16],"fallbackLocale":[1,"fallback-locale"],"customSvgIcons":[16],"isPanningEnabled":[1028,"is-panning-enabled"],"isZoomingEnabled":[1028,"is-zooming-enabled"],"isControlsVisible":[4,"is-controls-visible"],"isUtilityPanelVisible":[4,"is-utility-panel-visible"],"isWorkspaceManagerVisible":[4,"is-workspace-manager-visible"],"isMoreMenuVisible":[4,"is-more-menu-visible"],"isZoomPanelVisible":[4,"is-zoom-panel-visible"],"isObjectDistanceFadingActive":[4,"is-object-distance-fading-active"],"syncConfig":[16],"assetStorageConfig":[16],"cursorTarget":[16],"loginConfig":[16],"isLoading":[4,"is-loading"],"editorId":[1,"editor-id"],"activeWorkspaceId":[1,"active-workspace-id"],"isEngineReady":[32],"isControlsReady":[32],"isWorkspaceManagerReady":[32],"workspaces":[32],"activeWorkspace":[32],"isVirtualKeyboardOpen":[32],"undoState":[32],"isBackToContentButtonVisible":[32],"resolvedTerms":[32],"availableLocaleOptions":[32],"currentZoomPercent":[32],"shortcuts":[32],"currentIsPublic":[32],"isEditorVisible":[32],"activeNotification":[32],"isNotificationDismissing":[32],"getObjectById":[64],"addObject":[64],"addObjects":[64],"updateObject":[64],"removeObject":[64],"removeObjects":[64],"getSelectedObjects":[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],"createWorkspace":[64],"updateWorkspace":[64],"deleteWorkspace":[64],"getWorkspaces":[64],"getActiveWorkspace":[64],"loadSharedWorkspace":[64],"reinitSync":[64],"registerTool":[64],"changeActiveTool":[64],"changeActiveToolByName":[64],"disable":[64],"enable":[64],"copy":[64],"cut":[64],"paste":[64],"delete":[64],"bringForward":[64],"sendBackward":[64],"bringToFront":[64],"sendToBack":[64],"alignObjects":[64],"group":[64],"ungroup":[64],"undo":[64],"redo":[64],"getScreenshot":[64],"exportViewportAsPng":[64],"exportViewportAsSvg":[64],"exportSelectedObjectsAsPng":[64],"exportSelectedObjectsAsSvg":[64],"downloadAsJson":[64],"importFromFile":[64],"loadObjectsFromJson":[64],"getObjectsTotalCount":[64],"getAllObjects":[64],"findObjects":[64],"getObjectsInViewport":[64],"hideContextMenu":[64],"openContextMenu":[64],"triggerSelectionChange":[64],"getDisplayableShortcuts":[64],"triggerNotification":[64],"openLoginDialog":[64],"setLoginLoading":[64],"setLocale":[64],"getLocale":[64],"getAvailableLocales":[64],"registerLocales":[64],"t":[64]},[[0,"dblclick","onTouchStart"]],{"isEngineReady":[{"onIsEngineReady":0}],"isControlsReady":[{"onIsControlsReady":0}],"workspaces":[{"onWorkspacesChange":0}],"activeWorkspace":[{"onActiveWorkspaceChange":0}],"activeWorkspaceId":[{"onActiveWorkspaceIdChange":0}],"theme":[{"onCurrentThemeChange":0}],"themes":[{"onThemesChange":0}],"locale":[{"onLocaleChange":0}]}],[513,"kritzel-controls",{"visible":[4],"controls":[16],"activeControl":[1040],"isUtilityPanelVisible":[4,"is-utility-panel-visible"],"undoState":[16],"theme":[1],"terms":[16],"firstConfig":[32],"isTouchDevice":[32],"selectedSubOptions":[32],"canScrollLeft":[32],"canScrollRight":[32],"needsScrolling":[32],"displayValues":[32],"internalControls":[32],"closeTooltip":[64]},[[8,"keydown","handleKeyDown"]],{"controls":[{"onControlsChange":0}],"theme":[{"onThemeChange":0}]}],[513,"kritzel-settings",{"availableThemes":[16],"availableLocales":[16],"shortcuts":[16],"terms":[16],"settings":[16],"isDialogOpen":[32],"selectedCategoryId":[32],"scaleMin":[32],"scaleMax":[32],"lockDrawingScale":[32],"theme":[32],"locale":[32],"viewportBoundaryLeft":[32],"viewportBoundaryRight":[32],"viewportBoundaryTop":[32],"viewportBoundaryBottom":[32],"debugInfo":[32],"open":[64]},null,{"settings":[{"onSettingsPropChange":0}]}],[513,"kritzel-engine",{"workspace":[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"],"isObjectDistanceFadingActive":[4,"is-object-distance-fading-active"],"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"],"isLoading":[4,"is-loading"],"forceUpdate":[32],"triggerSelectionChange":[64],"registerTool":[64],"changeActiveTool":[64],"changeActiveToolByName":[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],"getSelectedObjectsAsSvgString":[64],"exportSelectedObjectsAsSvg":[64],"getSelectedObjectsAsPngDataUrl":[64],"exportSelectedObjectsAsPng":[64],"exportAsJson":[64],"importFromJson":[64],"loadObjectsFromJson":[64],"downloadAsJson":[64],"importFromFile":[64],"createWorkspace":[64],"updateWorkspace":[64],"deleteWorkspace":[64],"getWorkspaces":[64],"getActiveWorkspace":[64],"getIsPublic":[64],"loadSharedWorkspace":[64],"reinitSync":[64],"saveSettings":[64],"loadSettings":[64],"registerLocales":[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"]],{"workspace":[{"onWorkspaceChange":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}],"isObjectDistanceFadingActive":[{"onIsObjectDistanceFadingActiveChange":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}],"isLoading":[{"onIsLoadingChange":0}]}],[513,"kritzel-export",{"workspaceName":[1,"workspace-name"],"terms":[16],"isDialogOpen":[32],"previewUrl":[32],"isLoading":[32],"activeTab":[32],"exportFilename":[32],"viewportExportFormat":[32],"open":[64]}],[513,"kritzel-workspace-manager",{"visible":[4],"activeWorkspace":[1040],"workspaces":[16],"terms":[16],"childMenuAnchor":[32],"openChildMenuItem":[32],"newWorkspace":[32],"editingItemId":[32]},[[8,"wheel","handleWheel"]]],[513,"kritzel-more-menu",{"visible":[4],"items":[16],"icon":[1],"iconSize":[2,"icon-size"],"offsetY":[2,"offset-y"],"terms":[16],"menuAnchor":[32],"isTouchDevice":[32]}],[513,"kritzel-current-user",{"user":[16],"avatarSize":[2,"avatar-size"],"terms":[16]}],[513,"kritzel-share-dialog",{"isPublic":[4,"is-public"],"workspaceId":[1,"workspace-id"],"terms":[16],"isDialogOpen":[32],"internalIsPublic":[32],"copySuccess":[32],"open":[64],"close":[64]},null,{"isPublic":[{"onIsPublicChange":0}]}],[513,"kritzel-login-dialog",{"providers":[16],"dialogTitle":[1,"dialog-title"],"subtitle":[1],"isDialogOpen":[32],"loadingProvider":[32],"open":[64],"close":[64],"setLoading":[64]}],[513,"kritzel-active-users",{"users":[16],"avatarSize":[2,"avatar-size"],"maxVisible":[2,"max-visible"],"overlap":[2]}],[513,"kritzel-back-to-content",{"visible":[4],"text":[1]}],[513,"kritzel-notification-card",{"notification":[16],"showTimestamp":[4,"show-timestamp"],"locale":[1]}],[513,"kritzel-zoom-panel",{"visible":[4],"disabled":[4],"zoomPercent":[2,"zoom-percent"],"terms":[16]}],[769,"kritzel-button",{"variant":[1],"disabled":[4],"type":[1]}],[513,"kritzel-tool-config",{"tool":[1040],"isExpanded":[1028,"is-expanded"],"theme":[1],"engine":[16],"terms":[16],"config":[32],"palette":[32],"sizes":[32],"currentOpacity":[32],"updateTrigger":[32]},null,{"tool":[{"handleToolChange":0}],"theme":[{"onThemeChange":0}],"engine":[{"handleEngineChange":0}]}],[513,"kritzel-split-button",{"buttonIcon":[1,"button-icon"],"dropdownIcon":[1,"dropdown-icon"],"items":[16],"mainButtonDisabled":[4,"main-button-disabled"],"menuButtonDisabled":[4,"menu-button-disabled"],"isMenuOpen":[32],"isTouchDevice":[32],"anchorElement":[32],"menuScrollTop":[32],"open":[64],"focusMenu":[64]}],[513,"kritzel-current-user-dialog",{"user":[16],"terms":[16],"isDialogOpen":[32],"open":[64],"close":[64]}],[513,"kritzel-context-menu",{"items":[16],"objects":[16],"processedItems":[32],"openSubmenuPath":[32],"submenuPositions":[32]},[[9,"pointerdown","handleOutsideClick"]],{"items":[{"onItemsChanged":0}]}],[769,"kritzel-master-detail",{"items":[16],"selectedItemId":[1,"selected-item-id"],"focusedIndex":[32],"showMobileDetail":[32]},null,{"selectedItemId":[{"watchSelectedItemId":0}]}],[513,"kritzel-pill-tabs",{"tabs":[16],"value":[1025]}],[513,"kritzel-utility-panel",{"undoState":[16],"terms":[16]}],[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-input",{"value":[1025],"label":[1],"placeholder":[1],"suffix":[1],"type":[1],"disabled":[4],"inputValue":[32]},null,{"value":[{"onValueChange":0}]}],[513,"kritzel-numeric-input",{"value":[1026],"min":[2],"max":[2],"step":[2],"label":[1],"placeholder":[1],"inputValue":[32]},null,{"value":[{"onValueChange":0}]}],[769,"kritzel-tooltip",{"isVisible":[1028,"is-visible"],"anchorElement":[16],"triggerElement":[16],"offsetY":[2,"offset-y"],"positionX":[32],"positionY":[32],"open":[64],"close":[64],"toggle":[64],"focusContent":[64]},[[4,"click","handleOutsideClick"],[6,"pointerdown","handleOutsidePointerDown"],[4,"kritzelTooltipCloseAll","handleCloseAll"],[9,"resize","handleWindowResize"]],{"triggerElement":[{"handleTriggerElementChange":0}],"isVisible":[{"handleVisibilityChange":0}]}],[513,"kritzel-watermark",{"core":[16],"label":[1]}],[513,"kritzel-color-palette",{"colors":[16],"selectedColor":[1040],"isExpanded":[4,"is-expanded"],"isOpaque":[4,"is-opaque"],"opacity":[2],"theme":[1]}],[513,"kritzel-font-family",{"fontOptions":[16],"selectedFontFamily":[1025,"selected-font-family"]}],[513,"kritzel-font-size",{"sizes":[16],"selectedSize":[1026,"selected-size"],"fontFamily":[1,"font-family"]}],[513,"kritzel-stroke-size",{"sizes":[16],"selectedSize":[1026,"selected-size"]}],[513,"kritzel-line-endings",{"styles":[16],"value":[1040]}],[513,"kritzel-opacity-slider",{"value":[1026],"min":[2],"max":[2],"step":[2],"previewColor":[1,"preview-color"]}],[513,"kritzel-shape-fill",{"value":[1025]}],[513,"kritzel-slide-toggle",{"checked":[1028],"disabled":[4],"label":[1]}],[513,"kritzel-avatar",{"user":[16],"name":[1],"size":[2],"color":[1],"imageError":[32]},null,{"user":[{"userChanged":0}],"profileImageUrl":[{"profileImageUrlChanged":0}]}],[513,"kritzel-font",{"fontFamily":[1,"font-family"],"size":[2],"color":[1]}],[513,"kritzel-color",{"value":[1],"theme":[1],"size":[2]}],[513,"kritzel-menu",{"items":[16],"parent":[16],"selectedIndex":[32],"setScrollTop":[64],"setFocus":[64]}],[513,"kritzel-menu-item",{"item":[16],"parent":[16],"isDirty":[32]},null,{"item":[{"onItemChange":0}]}],[769,"kritzel-portal",{"anchor":[16],"offsetX":[2,"offset-x"],"offsetY":[2,"offset-y"],"autoFocus":[4,"auto-focus"]},[[8,"kritzel-dismiss-menus","handleDismissMenus"],[8,"click","handleOutsideClick"],[6,"pointerdown","handleOutsidePointerDown"],[8,"keydown","handleKeyDown"],[11,"resize","handleResize"],[11,"scroll","handleWindowScroll"]],{"anchor":[{"anchorChanged":0}]}],[769,"kritzel-dialog",{"isOpen":[516,"is-open"],"dialogTitle":[1,"dialog-title"],"closable":[4],"closeOnBackdrop":[4,"close-on-backdrop"],"closeOnEscape":[4,"close-on-escape"],"autoFocus":[4,"auto-focus"],"trapFocus":[4,"trap-focus"],"size":[1],"fullscreenOnMobile":[4,"fullscreen-on-mobile"],"contained":[516],"isAnimating":[32],"mobileLockedHeight":[32],"containerRect":[32],"containerBorderRadius":[32],"open":[64],"close":[64],"focusFirstElement":[64]},[[8,"keydown","handleKeyDown"],[9,"resize","handleWindowResize"],[8,"orientationchange","handleOrientationChange"]],{"isOpen":[{"handleIsOpenChange":0}]}],[769,"kritzel-dropdown",{"options":[16],"value":[1],"width":[1],"selectStyles":[16],"forceOpenDirection":[1,"force-open-direction"],"internalValue":[32],"hasSuffixContent":[32],"hasPrefixContent":[32],"isOpen":[32],"focusedIndex":[32],"openDirection":[32]},[[4,"click","handleDocumentClick"],[4,"keydown","handleDocumentKeydown"]],{"options":[{"optionsChanged":0}],"value":[{"externalValueChanged":0}]}],[513,"kritzel-icon",{"name":[1],"label":[1],"size":[2]}]]],["p-fb32cd8f",[[513,"kritzel-brush-style",{"type":[1],"brushOptions":[16]}]]]]'),e))));
1
+ import{p as e,b as o}from"./p-Dhio9uis.js";export{s as setNonce}from"./p-Dhio9uis.js";import{g as t}from"./p-DQuL1Twl.js";(()=>{const o=import.meta.url,t={};return""!==o&&(t.resourcesUrl=new URL(".",o).href),e(t)})().then((async e=>(await t(),o(JSON.parse('[["p-27d41f6f",[[512,"kritzel-editor",{"scaleMax":[1026,"scale-max"],"scaleMin":[1026,"scale-min"],"lockDrawingScale":[1028,"lock-drawing-scale"],"viewportBoundaryLeft":[1026,"viewport-boundary-left"],"viewportBoundaryRight":[1026,"viewport-boundary-right"],"viewportBoundaryTop":[1026,"viewport-boundary-top"],"viewportBoundaryBottom":[1026,"viewport-boundary-bottom"],"debugInfo":[1040],"user":[16],"activeUsers":[16],"controls":[16],"globalContextMenuItems":[16],"objectContextMenuItems":[16],"themes":[16],"theme":[1025],"licenseKey":[1,"license-key"],"locale":[1025],"locales":[16],"fallbackLocale":[1,"fallback-locale"],"customSvgIcons":[16],"isPanningEnabled":[1028,"is-panning-enabled"],"isZoomingEnabled":[1028,"is-zooming-enabled"],"isControlsVisible":[4,"is-controls-visible"],"isUtilityPanelVisible":[4,"is-utility-panel-visible"],"isWorkspaceManagerVisible":[4,"is-workspace-manager-visible"],"isMoreMenuVisible":[4,"is-more-menu-visible"],"isZoomPanelVisible":[4,"is-zoom-panel-visible"],"isObjectDistanceFadingActive":[4,"is-object-distance-fading-active"],"syncConfig":[16],"assetStorageConfig":[16],"cursorTarget":[16],"loginConfig":[16],"isLoading":[4,"is-loading"],"editorId":[1,"editor-id"],"activeWorkspaceId":[1,"active-workspace-id"],"isEngineReady":[32],"isControlsReady":[32],"isWorkspaceManagerReady":[32],"workspaces":[32],"activeWorkspace":[32],"isVirtualKeyboardOpen":[32],"undoState":[32],"isBackToContentButtonVisible":[32],"resolvedTerms":[32],"availableLocaleOptions":[32],"currentZoomPercent":[32],"shortcuts":[32],"currentIsPublic":[32],"isEditorVisible":[32],"activeNotification":[32],"isNotificationDismissing":[32],"getObjectById":[64],"addObject":[64],"addObjects":[64],"updateObject":[64],"removeObject":[64],"removeObjects":[64],"getSelectedObjects":[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],"createWorkspace":[64],"updateWorkspace":[64],"deleteWorkspace":[64],"getWorkspaces":[64],"getActiveWorkspace":[64],"loadSharedWorkspace":[64],"reinitSync":[64],"registerTool":[64],"changeActiveTool":[64],"changeActiveToolByName":[64],"disable":[64],"enable":[64],"copy":[64],"cut":[64],"paste":[64],"delete":[64],"bringForward":[64],"sendBackward":[64],"bringToFront":[64],"sendToBack":[64],"alignObjects":[64],"group":[64],"ungroup":[64],"undo":[64],"redo":[64],"getScreenshot":[64],"exportViewportAsPng":[64],"exportViewportAsSvg":[64],"exportSelectedObjectsAsPng":[64],"exportSelectedObjectsAsSvg":[64],"downloadAsJson":[64],"importFromFile":[64],"loadObjectsFromJson":[64],"getObjectsTotalCount":[64],"getAllObjects":[64],"findObjects":[64],"getObjectsInViewport":[64],"hideContextMenu":[64],"openContextMenu":[64],"triggerSelectionChange":[64],"getDisplayableShortcuts":[64],"triggerNotification":[64],"openLoginDialog":[64],"setLoginLoading":[64],"setLocale":[64],"getLocale":[64],"getAvailableLocales":[64],"registerLocales":[64],"t":[64]},[[0,"dblclick","onTouchStart"]],{"isEngineReady":[{"onIsEngineReady":0}],"isControlsReady":[{"onIsControlsReady":0}],"workspaces":[{"onWorkspacesChange":0}],"activeWorkspace":[{"onActiveWorkspaceChange":0}],"activeWorkspaceId":[{"onActiveWorkspaceIdChange":0}],"theme":[{"onCurrentThemeChange":0}],"themes":[{"onThemesChange":0}],"locale":[{"onLocaleChange":0}]}],[513,"kritzel-controls",{"visible":[4],"controls":[16],"activeControl":[1040],"isUtilityPanelVisible":[4,"is-utility-panel-visible"],"undoState":[16],"theme":[1],"terms":[16],"firstConfig":[32],"isTouchDevice":[32],"selectedSubOptions":[32],"canScrollLeft":[32],"canScrollRight":[32],"needsScrolling":[32],"displayValues":[32],"internalControls":[32],"closeTooltip":[64]},[[8,"keydown","handleKeyDown"]],{"controls":[{"onControlsChange":0}],"theme":[{"onThemeChange":0}]}],[513,"kritzel-settings",{"availableThemes":[16],"availableLocales":[16],"shortcuts":[16],"terms":[16],"settings":[16],"isDialogOpen":[32],"selectedCategoryId":[32],"scaleMin":[32],"scaleMax":[32],"lockDrawingScale":[32],"theme":[32],"locale":[32],"viewportBoundaryLeft":[32],"viewportBoundaryRight":[32],"viewportBoundaryTop":[32],"viewportBoundaryBottom":[32],"debugInfo":[32],"open":[64]},null,{"settings":[{"onSettingsPropChange":0}]}],[513,"kritzel-engine",{"workspace":[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"],"isObjectDistanceFadingActive":[4,"is-object-distance-fading-active"],"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"],"isLoading":[4,"is-loading"],"forceUpdate":[32],"triggerSelectionChange":[64],"registerTool":[64],"changeActiveTool":[64],"changeActiveToolByName":[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],"getSelectedObjectsAsSvgString":[64],"exportSelectedObjectsAsSvg":[64],"getSelectedObjectsAsPngDataUrl":[64],"exportSelectedObjectsAsPng":[64],"exportAsJson":[64],"importFromJson":[64],"loadObjectsFromJson":[64],"downloadAsJson":[64],"importFromFile":[64],"createWorkspace":[64],"updateWorkspace":[64],"deleteWorkspace":[64],"getWorkspaces":[64],"getActiveWorkspace":[64],"getIsPublic":[64],"loadSharedWorkspace":[64],"reinitSync":[64],"saveSettings":[64],"loadSettings":[64],"registerLocales":[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"]],{"workspace":[{"onWorkspaceChange":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}],"isObjectDistanceFadingActive":[{"onIsObjectDistanceFadingActiveChange":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}],"isLoading":[{"onIsLoadingChange":0}]}],[513,"kritzel-export",{"workspaceName":[1,"workspace-name"],"terms":[16],"isDialogOpen":[32],"previewUrl":[32],"isLoading":[32],"activeTab":[32],"exportFilename":[32],"viewportExportFormat":[32],"open":[64]}],[513,"kritzel-workspace-manager",{"visible":[4],"activeWorkspace":[1040],"workspaces":[16],"terms":[16],"childMenuAnchor":[32],"openChildMenuItem":[32],"newWorkspace":[32],"editingItemId":[32]},[[8,"wheel","handleWheel"]]],[513,"kritzel-more-menu",{"visible":[4],"items":[16],"icon":[1],"iconSize":[2,"icon-size"],"offsetY":[2,"offset-y"],"terms":[16],"menuAnchor":[32],"isTouchDevice":[32]}],[513,"kritzel-current-user",{"user":[16],"avatarSize":[2,"avatar-size"],"terms":[16]}],[513,"kritzel-share-dialog",{"isPublic":[4,"is-public"],"workspaceId":[1,"workspace-id"],"terms":[16],"isDialogOpen":[32],"internalIsPublic":[32],"copySuccess":[32],"open":[64],"close":[64]},null,{"isPublic":[{"onIsPublicChange":0}]}],[513,"kritzel-login-dialog",{"providers":[16],"dialogTitle":[1,"dialog-title"],"subtitle":[1],"isDialogOpen":[32],"loadingProvider":[32],"open":[64],"close":[64],"setLoading":[64]}],[513,"kritzel-active-users",{"users":[16],"avatarSize":[2,"avatar-size"],"maxVisible":[2,"max-visible"],"overlap":[2]}],[513,"kritzel-back-to-content",{"visible":[4],"text":[1]}],[513,"kritzel-notification-card",{"notification":[16],"showTimestamp":[4,"show-timestamp"],"locale":[1]}],[513,"kritzel-zoom-panel",{"visible":[4],"disabled":[4],"zoomPercent":[2,"zoom-percent"],"terms":[16]}],[769,"kritzel-button",{"variant":[1],"disabled":[4],"type":[1]}],[513,"kritzel-tool-config",{"tool":[1040],"isExpanded":[1028,"is-expanded"],"theme":[1],"engine":[16],"terms":[16],"config":[32],"palette":[32],"sizes":[32],"currentOpacity":[32],"updateTrigger":[32]},null,{"tool":[{"handleToolChange":0}],"theme":[{"onThemeChange":0}],"engine":[{"handleEngineChange":0}]}],[513,"kritzel-split-button",{"buttonIcon":[1,"button-icon"],"dropdownIcon":[1,"dropdown-icon"],"items":[16],"mainButtonDisabled":[4,"main-button-disabled"],"menuButtonDisabled":[4,"menu-button-disabled"],"isMenuOpen":[32],"isTouchDevice":[32],"anchorElement":[32],"menuScrollTop":[32],"open":[64],"focusMenu":[64]}],[513,"kritzel-current-user-dialog",{"user":[16],"terms":[16],"isDialogOpen":[32],"open":[64],"close":[64]}],[513,"kritzel-context-menu",{"items":[16],"objects":[16],"processedItems":[32],"openSubmenuPath":[32],"submenuPositions":[32]},[[9,"pointerdown","handleOutsideClick"]],{"items":[{"onItemsChanged":0}]}],[769,"kritzel-master-detail",{"items":[16],"selectedItemId":[1,"selected-item-id"],"focusedIndex":[32],"showMobileDetail":[32]},null,{"selectedItemId":[{"watchSelectedItemId":0}]}],[513,"kritzel-pill-tabs",{"tabs":[16],"value":[1025]}],[513,"kritzel-utility-panel",{"undoState":[16],"terms":[16]}],[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-input",{"value":[1025],"label":[1],"placeholder":[1],"suffix":[1],"type":[1],"disabled":[4],"inputValue":[32]},null,{"value":[{"onValueChange":0}]}],[513,"kritzel-numeric-input",{"value":[1026],"min":[2],"max":[2],"step":[2],"label":[1],"placeholder":[1],"inputValue":[32]},null,{"value":[{"onValueChange":0}]}],[769,"kritzel-tooltip",{"isVisible":[1028,"is-visible"],"anchorElement":[16],"triggerElement":[16],"offsetY":[2,"offset-y"],"positionX":[32],"positionY":[32],"open":[64],"close":[64],"toggle":[64],"focusContent":[64]},[[4,"click","handleOutsideClick"],[6,"pointerdown","handleOutsidePointerDown"],[4,"kritzelTooltipCloseAll","handleCloseAll"],[9,"resize","handleWindowResize"]],{"triggerElement":[{"handleTriggerElementChange":0}],"isVisible":[{"handleVisibilityChange":0}]}],[513,"kritzel-watermark",{"core":[16],"label":[1]}],[513,"kritzel-color-palette",{"colors":[16],"selectedColor":[1040],"isExpanded":[4,"is-expanded"],"isOpaque":[4,"is-opaque"],"opacity":[2],"theme":[1]}],[513,"kritzel-font-family",{"fontOptions":[16],"selectedFontFamily":[1025,"selected-font-family"]}],[513,"kritzel-font-size",{"sizes":[16],"selectedSize":[1026,"selected-size"],"fontFamily":[1,"font-family"]}],[513,"kritzel-stroke-size",{"sizes":[16],"selectedSize":[1026,"selected-size"]}],[513,"kritzel-line-endings",{"styles":[16],"value":[1040]}],[513,"kritzel-opacity-slider",{"value":[1026],"min":[2],"max":[2],"step":[2],"previewColor":[1,"preview-color"]}],[513,"kritzel-shape-fill",{"value":[1025]}],[513,"kritzel-slide-toggle",{"checked":[1028],"disabled":[4],"label":[1]}],[513,"kritzel-avatar",{"user":[16],"name":[1],"size":[2],"color":[1],"imageError":[32]},null,{"user":[{"userChanged":0}],"profileImageUrl":[{"profileImageUrlChanged":0}]}],[513,"kritzel-font",{"fontFamily":[1,"font-family"],"size":[2],"color":[1]}],[513,"kritzel-color",{"value":[1],"theme":[1],"size":[2]}],[513,"kritzel-menu",{"items":[16],"parent":[16],"selectedIndex":[32],"setScrollTop":[64],"setFocus":[64]}],[513,"kritzel-menu-item",{"item":[16],"parent":[16],"isDirty":[32]},null,{"item":[{"onItemChange":0}]}],[769,"kritzel-portal",{"anchor":[16],"offsetX":[2,"offset-x"],"offsetY":[2,"offset-y"],"autoFocus":[4,"auto-focus"]},[[8,"kritzel-dismiss-menus","handleDismissMenus"],[8,"click","handleOutsideClick"],[6,"pointerdown","handleOutsidePointerDown"],[8,"keydown","handleKeyDown"],[11,"resize","handleResize"],[11,"scroll","handleWindowScroll"]],{"anchor":[{"anchorChanged":0}]}],[769,"kritzel-dialog",{"isOpen":[516,"is-open"],"dialogTitle":[1,"dialog-title"],"closable":[4],"closeOnBackdrop":[4,"close-on-backdrop"],"closeOnEscape":[4,"close-on-escape"],"autoFocus":[4,"auto-focus"],"trapFocus":[4,"trap-focus"],"size":[1],"fullscreenOnMobile":[4,"fullscreen-on-mobile"],"contained":[516],"isAnimating":[32],"mobileLockedHeight":[32],"containerRect":[32],"containerBorderRadius":[32],"open":[64],"close":[64],"focusFirstElement":[64]},[[8,"keydown","handleKeyDown"],[9,"resize","handleWindowResize"],[8,"orientationchange","handleOrientationChange"]],{"isOpen":[{"handleIsOpenChange":0}]}],[769,"kritzel-dropdown",{"options":[16],"value":[1],"width":[1],"selectStyles":[16],"forceOpenDirection":[1,"force-open-direction"],"internalValue":[32],"hasSuffixContent":[32],"hasPrefixContent":[32],"isOpen":[32],"focusedIndex":[32],"openDirection":[32]},[[4,"click","handleDocumentClick"],[4,"keydown","handleDocumentKeydown"]],{"options":[{"optionsChanged":0}],"value":[{"externalValueChanged":0}]}],[513,"kritzel-icon",{"name":[1],"label":[1],"size":[2]}]]],["p-fb32cd8f",[[513,"kritzel-brush-style",{"type":[1],"brushOptions":[16]}]]]]'),e))));
@@ -302,6 +302,21 @@ export declare class KritzelCore {
302
302
  * @param selectionGroup - The selection group to add
303
303
  */
304
304
  addSelectionGroup(selectionGroup: KritzelSelectionGroup): void;
305
+ /**
306
+ * Returns whether the provided selection group belongs to the local user context.
307
+ * Local groups are either explicitly owned by the current user or have no user ID.
308
+ */
309
+ private isLocalSelectionGroup;
310
+ /**
311
+ * Applies deselection teardown side effects to a selection group before removal.
312
+ */
313
+ private teardownSelectionGroup;
314
+ /**
315
+ * Removes all local selection groups from the store, including orphaned groups
316
+ * that are no longer referenced by store.selectionGroup.
317
+ * @returns True when at least one local selection group was removed
318
+ */
319
+ private removeLocalSelectionGroups;
305
320
  /**
306
321
  * Removes the current selection group from the canvas.
307
322
  * Clears the cached reference and triggers the selection change event.
@@ -5,6 +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 { KritzelCustomElement } from '../objects/custom-element.class';
8
9
  import { StateChangeListener, StatePropertyKey } from '../../types/state.types';
9
10
  import { KritzelObjectMap } from '../structures/object-map.structure';
10
11
  import { KritzelBaseObject } from '../objects/base-object.class';
@@ -130,6 +131,11 @@ export declare class KritzelStore {
130
131
  * @returns The shape object in editing mode, or null if none
131
132
  */
132
133
  get activeShape(): KritzelShape | null;
134
+ /**
135
+ * Gets the currently selected custom element whose focused descendant is an input-like element.
136
+ * @returns The interactive custom element with focused input-like content, or null if none matches
137
+ */
138
+ get activeInteractiveCustomElement(): KritzelCustomElement | null;
133
139
  /**
134
140
  * Gets the path currently being drawn (not yet completed).
135
141
  * @returns The incomplete path object, or null if no path is being drawn
@@ -41,7 +41,8 @@ export declare class KritzelBaseObject<T extends Element = HTMLElement | SVGElem
41
41
  isMounted: boolean;
42
42
  isEditable: boolean;
43
43
  isInteractive: boolean;
44
- isDebugInfoVisible: boolean;
44
+ isResizable: boolean;
45
+ isRotatable: boolean;
45
46
  /**
46
47
  * Gets the total width of the object including padding.
47
48
  * @returns The width plus double the padding value
@@ -198,7 +199,7 @@ export declare class KritzelBaseObject<T extends Element = HTMLElement | SVGElem
198
199
  /**
199
200
  * Serializes the object to a plain JavaScript object for persistence.
200
201
  * Excludes internal references (_core, _elementRef) and computed properties.
201
- * DOM elements are cloned if present.
202
+ * Subclasses should override to handle domain-specific serialization (e.g., HTML elements).
202
203
  * @returns A serializable object containing all persistent properties
203
204
  */
204
205
  serialize(): any;
@@ -1,5 +1,16 @@
1
1
  import { KritzelCore } from '../core/core.class';
2
2
  import { KritzelBaseObject } from './base-object.class';
3
+ export interface KritzelCustomElementConfig {
4
+ element?: HTMLElement;
5
+ rendererKey?: string;
6
+ rendererData?: unknown;
7
+ translateX?: number;
8
+ translateY?: number;
9
+ rotation?: number;
10
+ scale?: number;
11
+ height?: number;
12
+ width?: number;
13
+ }
3
14
  /**
4
15
  * Represents a custom HTML element that can be placed and manipulated on the Kritzel canvas.
5
16
  * Extends KritzelBaseObject to inherit common object functionality like positioning,
@@ -9,8 +20,17 @@ export declare class KritzelCustomElement extends KritzelBaseObject<HTMLElement>
9
20
  __class__: string;
10
21
  /** The HTML element to be rendered on the canvas. */
11
22
  element: HTMLElement;
12
- /** Whether the element responds to user interactions. Defaults to true. */
13
- isInteractive: boolean;
23
+ /**
24
+ * Optional identifier for a registered renderer (e.g., 'angular-component', 'react-default').
25
+ * When set, mount() resolves the renderer from a global registry and delegates lifecycle.
26
+ * If null, falls back to DOM element mounting.
27
+ */
28
+ rendererKey: string | null;
29
+ /**
30
+ * Custom data payload for the renderer (e.g., Angular component inputs, React props, Vue data).
31
+ * Only meaningful when rendererKey is set. Captured on unmount and restored on rehydrate.
32
+ */
33
+ rendererData?: unknown;
14
34
  /**
15
35
  * Creates a new KritzelCustomElement instance.
16
36
  * @param config - Optional configuration object for the custom element.
@@ -21,15 +41,7 @@ export declare class KritzelCustomElement extends KritzelBaseObject<HTMLElement>
21
41
  * @param config.height - Initial height in pixels. Defaults to 0.
22
42
  * @param config.width - Initial width in pixels. Defaults to 0.
23
43
  */
24
- constructor(config?: {
25
- element: HTMLElement;
26
- translateX?: number;
27
- translateY?: number;
28
- rotation?: number;
29
- scale?: number;
30
- height?: number;
31
- width?: number;
32
- });
44
+ constructor(config?: KritzelCustomElementConfig);
33
45
  /**
34
46
  * Factory method to create a new KritzelCustomElement with proper core binding.
35
47
  * Generates a unique ID and assigns the element to the active workspace.
@@ -43,22 +55,62 @@ export declare class KritzelCustomElement extends KritzelBaseObject<HTMLElement>
43
55
  * @param config.width - Initial width in pixels.
44
56
  * @returns A new KritzelBaseObject instance bound to the core.
45
57
  */
46
- static create(core: KritzelCore, config?: {
47
- element: HTMLElement;
48
- translateX?: number;
49
- translateY?: number;
50
- rotation?: number;
51
- scale?: number;
52
- height?: number;
53
- width?: number;
54
- }): KritzelBaseObject<Element>;
58
+ static create(core: KritzelCore, config?: KritzelCustomElementConfig): KritzelBaseObject<Element>;
55
59
  /**
56
60
  * Mounts the custom element to a container element in the DOM.
57
- * Clears any existing content in the container and appends this element.
61
+ * If a renderer is registered for this.rendererKey, delegates to the renderer.
62
+ * Otherwise, uses the standard DOM element mounting fallback.
58
63
  * Skips mounting if already mounted to the same container with content attached.
59
64
  * @param element - The container HTML element to mount this custom element into.
60
65
  */
61
66
  mount(element: HTMLElement): void;
67
+ /**
68
+ * Updates interactivity state for embedded HTML content.
69
+ * When disabling interactivity, any focused descendant is blurred so
70
+ * keyboard input is released immediately.
71
+ */
72
+ setIsInteractive(isInteractive: boolean): void;
73
+ private applyInteractiveState;
74
+ private blurFocusedDescendant;
75
+ /**
76
+ * Returns true when a text-input-like element inside this custom element
77
+ * currently owns focus.
78
+ */
79
+ hasFocusedInputElement(): boolean;
80
+ private getFocusHosts;
81
+ /**
82
+ * Returns true when the given host (or, via the flat tree, one of its shadow descendants)
83
+ * currently contains a focused input-like element.
84
+ */
85
+ private hasFocusedInputDescendant;
86
+ /**
87
+ * Walks the `:focus` chain from a tree scope, descending into open shadow roots, and returns
88
+ * the focused element when it is input-like.
89
+ */
90
+ private findFocusedInputLikeElement;
91
+ private matchesFocus;
92
+ private isInputLikeElement;
93
+ private isNodeInsideHost;
94
+ private getDeepActiveElement;
95
+ /**
96
+ * Unmounts the custom element and performs cleanup.
97
+ * If a renderer is registered, delegates to renderer.onUnmount and captures returned state.
98
+ * Otherwise, simply removes from DOM.
99
+ * Called when object is deleted, viewport culled, or editor is unloading.
100
+ */
101
+ unmount(): void;
102
+ /**
103
+ * Returns whether the rendered content contains a scrollable element.
104
+ * Traverses light DOM, open shadow roots, and slotted content so nested
105
+ * framework components are detected as well.
106
+ */
107
+ isElementScrollable(): boolean;
108
+ /**
109
+ * Creates a placeholder element when HTML deserialization fails.
110
+ * Used as fallback to ensure element is always defined.
111
+ * @returns A div element with placeholder styling
112
+ */
113
+ private createPlaceholder;
62
114
  /**
63
115
  * Resizes and repositions the custom element on the canvas.
64
116
  * Updates both the internal state and the DOM element's inline styles.
@@ -76,4 +128,18 @@ export declare class KritzelCustomElement extends KritzelBaseObject<HTMLElement>
76
128
  * @returns A new KritzelCustomElement instance with copied properties and a cloned DOM element.
77
129
  */
78
130
  copy(): KritzelCustomElement;
131
+ /**
132
+ * Serializes the custom element to a plain JavaScript object for persistence.
133
+ * Stores HTML as a string (safe for JSON/Yjs) and captures dimension metadata.
134
+ * @returns A serializable object with htmlString and dimension snapshots
135
+ */
136
+ serialize(): any;
137
+ /**
138
+ * Deserializes the custom element from a plain object.
139
+ * Reconstructs the element from stored HTML string with fallback to placeholder.
140
+ * @template T - The expected return type
141
+ * @param object - The serialized object data to restore from
142
+ * @returns This instance cast to type T
143
+ */
144
+ deserialize<T>(object: any): T;
79
145
  }
@@ -39,7 +39,6 @@ export declare class KritzelImage extends KritzelBaseObject<HTMLImageElement> {
39
39
  maxWidth: number;
40
40
  maxHeight: number;
41
41
  maxCompressionSize: number;
42
- isDebugInfoVisible: boolean;
43
42
  /**
44
43
  * URL resolved from the asset storage layer (e.g. a `blob:` or https URL).
45
44
  * Not serialized into the Yjs document.
@@ -80,6 +80,7 @@ export declare class KritzelSelectionGroup extends KritzelBaseObject<HTMLElement
80
80
  * @returns Array of KritzelBaseObject instances corresponding to the stored IDs
81
81
  */
82
82
  get objects(): KritzelBaseObject<any>[];
83
+ private syncChildSelectionState;
83
84
  /**
84
85
  * Gets the number of objects in the selection group.
85
86
  * @returns The count of selected objects
@@ -60,6 +60,8 @@ export declare class KritzelAssetResolver {
60
60
  private _quiet;
61
61
  /** Dedupes concurrent resolves of the same id. */
62
62
  private _resolvePromises;
63
+ /** Enables or disables resolver diagnostic logging. */
64
+ setShowInfo(show: boolean): void;
63
65
  /**
64
66
  * Whether any remote provider is configured. Used by the engine to
65
67
  * decide whether to warn about a missing remote provider when Yjs is
@@ -135,4 +137,5 @@ export declare class KritzelAssetResolver {
135
137
  private getReadyPromise;
136
138
  private generateUuid;
137
139
  private dataUrlToBlob;
140
+ private canLogInfo;
138
141
  }
@@ -25,7 +25,6 @@ export declare class IndexedDBAssetProvider implements IAssetStorageProvider {
25
25
  readonly type = "local";
26
26
  readonly name = "IndexedDBAssetProvider";
27
27
  private _dbName;
28
- private _quiet;
29
28
  private _db;
30
29
  /** In-memory cache of id -> object URL to avoid re-creating blob URLs. */
31
30
  private _urlCache;
@@ -0,0 +1,32 @@
1
+ import { KritzelCustomElementRenderer } from "../../interfaces/custom-element-renderer.interface";
2
+ /**
3
+ * Global registry for custom element renderers.
4
+ * Allows wrapper frameworks (Angular, React, Vue) to register renderer implementations
5
+ * without coupling to core, and enables deterministic rehydration across reloads and
6
+ * clipboard paste operations.
7
+ *
8
+ * Renderer keys are opaque strings that must be stable (e.g., 'angular-todo', 'react-editor').
9
+ * When a custom element is deserialized with a rendererKey, the registry is consulted to
10
+ * resolve the renderer and mount with the persisted rendererData.
11
+ */
12
+ export declare class KritzelCustomElementRendererRegistry {
13
+ private static get _renderers();
14
+ /**
15
+ * Registers a renderer implementation for a given key.
16
+ * @param key - Stable identifier for this renderer (e.g., 'angular-my-component')
17
+ * @param renderer - Renderer implementation with mount/unmount/update handlers
18
+ */
19
+ static register(key: string, renderer: KritzelCustomElementRenderer): void;
20
+ /**
21
+ * Retrieves a registered renderer by key.
22
+ * @param key - Renderer identifier
23
+ * @returns The registered renderer, or undefined if not found
24
+ */
25
+ static get(key: string): KritzelCustomElementRenderer | undefined;
26
+ /**
27
+ * Unregisters a renderer by key.
28
+ * @param key - Renderer identifier to remove
29
+ * @returns True if the renderer was found and removed; false otherwise
30
+ */
31
+ static unregister(key: string): boolean;
32
+ }
@@ -149,6 +149,8 @@ export declare class KritzelEngine {
149
149
  handlePointerMove(ev: PointerEvent): void;
150
150
  handlePointerUp(ev: PointerEvent): void;
151
151
  handlePointerCancel(ev: PointerEvent): void;
152
+ private isEmbeddedCustomElementInteraction;
153
+ private isNativeInteractiveEmbeddedTarget;
152
154
  handlePointerLeave(): void;
153
155
  handleLongPress(ev: CustomEvent<PointerEvent>): void;
154
156
  handleContextMenu(ev: PointerEvent): void;
@@ -159,7 +161,7 @@ export declare class KritzelEngine {
159
161
  handleCut(ev: ClipboardEvent): void;
160
162
  handlePaste(ev: ClipboardEvent): void;
161
163
  /**
162
- * Determines if the engine should handle a keyboard/clipboard shortcut event.
164
+ * Determines if the engine should handle a keyboard/clipboard shortcut event.
163
165
  * Returns true only if:
164
166
  * - The event originates from within the engine component, OR
165
167
  * - The event target is not an interactive element that needs keyboard input
@@ -626,6 +628,8 @@ export declare class KritzelEngine {
626
628
  private _syncConfigRevision;
627
629
  private _assetStorageConfigRevision;
628
630
  private _isWorkspaceLoading;
631
+ private _hasLoggedUnlicensedWelcomeBanner;
632
+ private _previousVisibleCustomElements;
629
633
  private readonly _defaultUndoState;
630
634
  private readonly _objectDistanceFadeNearScale;
631
635
  private readonly _objectDistanceFadeFarScale;
@@ -648,6 +652,7 @@ export declare class KritzelEngine {
648
652
  * `assetStorageConfig` prop updates that arrive while init is running.
649
653
  */
650
654
  private initializeAssetStorage;
655
+ private logUnlicensedWelcomeBanner;
651
656
  private doInitializeSyncAndWorkspace;
652
657
  private resolveStartupWorkspace;
653
658
  private tryResolveActiveWorkspaceFromId;
@@ -669,5 +674,6 @@ export declare class KritzelEngine {
669
674
  private getCloseDistanceFadeMultiplier;
670
675
  private shouldApplyDistanceFade;
671
676
  private getObjectEffectiveOpacity;
677
+ private getSelectionHandleCapabilities;
672
678
  render(): any;
673
679
  }
@@ -383,7 +383,7 @@ export namespace Components {
383
383
  "customSvgIcons": Record<string, string>;
384
384
  "cut": () => Promise<void>;
385
385
  /**
386
- * @default { showViewportInfo: false, showObjectInfo: false, showSyncProviderInfo: true, showMigrationInfo: true, }
386
+ * @default { showViewportInfo: false, showObjectInfo: false, showSyncProviderInfo: true, showMigrationInfo: true, showAssetResolverInfo: false, }
387
387
  */
388
388
  "debugInfo": KritzelDebugInfo;
389
389
  "delete": () => Promise<void>;
@@ -2838,7 +2838,7 @@ declare namespace LocalJSX {
2838
2838
  */
2839
2839
  "customSvgIcons"?: Record<string, string>;
2840
2840
  /**
2841
- * @default { showViewportInfo: false, showObjectInfo: false, showSyncProviderInfo: true, showMigrationInfo: true, }
2841
+ * @default { showViewportInfo: false, showObjectInfo: false, showSyncProviderInfo: true, showMigrationInfo: true, showAssetResolverInfo: false, }
2842
2842
  */
2843
2843
  "debugInfo"?: KritzelDebugInfo;
2844
2844
  /**
@@ -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.3.22";
6
+ export declare const KRITZEL_VERSION = "0.3.23";
@@ -1,5 +1,7 @@
1
1
  export declare class KritzelHTMLHelper {
2
2
  static getNumericValueFromStyle(element: HTMLElement, property: string): number;
3
+ static isScrollableElement(element: Element): element is HTMLElement;
4
+ static findScrollableElement(root: Element | null | undefined): HTMLElement | null;
3
5
  static getScrollableParent(element: HTMLElement): HTMLElement | Window;
4
6
  static isElementInViewport(element: HTMLElement): boolean;
5
7
  static getFocusableElements(root: HTMLElement): HTMLElement[];
@@ -1,4 +1,5 @@
1
1
  export declare class ObjectHelper {
2
2
  static generateUUID(length?: number): string;
3
3
  static isEmpty(obj: any): boolean;
4
+ static isClass<T>(object: unknown, className: string): object is T;
4
5
  }
@@ -162,6 +162,15 @@ export declare class KritzelSvgExportHelper {
162
162
  * @returns SVG element string
163
163
  */
164
164
  private static imageToSvg;
165
+ /**
166
+ * Converts a KritzelCustomElement to SVG.
167
+ * SVG mode: embeds HTML in foreignObject (best-effort).
168
+ * PNG/raster mode: renders placeholder rect with warning.
169
+ * @param obj - The custom element object
170
+ * @param rasterSafeForCanvas - If true, render placeholder (for PNG export)
171
+ * @returns SVG element string
172
+ */
173
+ private static customElementToSvg;
165
174
  /**
166
175
  * Converts a KritzelGroup to SVG by recursively converting children.
167
176
  * @param group - The group object
@@ -0,0 +1,9 @@
1
+ import { KritzelCustomElement } from '../classes/objects/custom-element.class';
2
+ export declare class KritzelWheelHelper {
3
+ static shouldKeepWheelInCustomElement(ev: WheelEvent, customElement: KritzelCustomElement): boolean;
4
+ private static getScrollableContainerFromEventPath;
5
+ private static isScrollableElement;
6
+ private static canElementConsumeWheel;
7
+ private static canElementConsumeVerticalWheel;
8
+ private static canElementConsumeHorizontalWheel;
9
+ }
@@ -17,6 +17,7 @@ export * from './classes/objects/image.class';
17
17
  export * from './classes/objects/line.class';
18
18
  export * from './classes/objects/group.class';
19
19
  export * from './classes/objects/shape.class';
20
+ export * from './classes/objects/custom-element.class';
20
21
  export * from './classes/tools/base-tool.class';
21
22
  export * from './classes/tools/brush-tool.class';
22
23
  export * from './classes/tools/line-tool.class';
@@ -40,9 +41,11 @@ export * from './classes/managers/anchor.manager';
40
41
  export * from './classes/managers/theme.manager';
41
42
  export * from './classes/managers/localization.manager';
42
43
  export * from './classes/managers/license.manager';
44
+ export * from './classes/registries/custom-element-renderer.registry';
43
45
  export * from './interfaces/toolbar-control.interface';
44
46
  export * from './interfaces/menu-item.interface';
45
47
  export * from './interfaces/object-change-event.interface';
48
+ export * from './interfaces/custom-element-renderer.interface';
46
49
  export * from './interfaces/sync-provider.interface';
47
50
  export * from './interfaces/sync-config.interface';
48
51
  export * from './interfaces/asset.interface';
@@ -37,8 +37,4 @@ export interface KritzelAssetStorageConfig {
37
37
  * providers are written via a persistent background queue.
38
38
  */
39
39
  providers: AssetProviderConfig[];
40
- /**
41
- * Quiet mode - suppress console output (optional, defaults to false)
42
- */
43
- quiet?: boolean;
44
40
  }
@@ -0,0 +1,40 @@
1
+ import { KritzelCustomElement } from '../classes/objects/custom-element.class';
2
+ /**
3
+ * Context passed to a renderer when mounting, updating, or unmounting.
4
+ */
5
+ export interface KritzelCustomElementRenderContext {
6
+ /** The custom element object being rendered. */
7
+ object: KritzelCustomElement;
8
+ /** Container element to render into (mount) or receive lifecycle notifications (unmount). */
9
+ container: HTMLElement | null;
10
+ /** Custom data payload for the renderer (e.g., component props, state). */
11
+ data?: unknown;
12
+ }
13
+ /**
14
+ * Renderer implementation for custom elements on the canvas.
15
+ * Handles framework-specific mounting, updating, and cleanup.
16
+ */
17
+ export interface KritzelCustomElementRenderer {
18
+ /**
19
+ * Called when the custom element enters the viewport or is first added to canvas.
20
+ * Renderer is responsible for creating and appending DOM to context.container.
21
+ * @param context - Render context with object, container, and data
22
+ */
23
+ onMount(context: KritzelCustomElementRenderContext): void;
24
+ /**
25
+ * Called when object properties (position, size, rotation, etc.) change.
26
+ * Renderer can react to dimension/transform updates or data changes.
27
+ * Optional; default is no-op.
28
+ * @param context - Render context with updated object and data
29
+ * @param changedProperties - Array of property names that changed
30
+ */
31
+ onUpdate?(context: KritzelCustomElementRenderContext, changedProperties: string[]): void;
32
+ /**
33
+ * Called when the object leaves the viewport, is deleted, or workspace is unloaded.
34
+ * Renderer must clean up event listeners, timers, framework instances, and remove DOM.
35
+ * May optionally return updated data to capture back into object.rendererData.
36
+ * @param context - Render context with object and container
37
+ * @returns Optional updated data payload to persist
38
+ */
39
+ onUnmount(context: KritzelCustomElementRenderContext): unknown;
40
+ }
@@ -3,4 +3,5 @@ export interface KritzelDebugInfo {
3
3
  showObjectInfo: boolean;
4
4
  showSyncProviderInfo: boolean;
5
5
  showMigrationInfo: boolean;
6
+ showAssetResolverInfo: boolean;
6
7
  }
@@ -28,7 +28,6 @@ export interface KritzelObject<T = Element> {
28
28
  isMounted: boolean;
29
29
  isEditable: boolean;
30
30
  isInteractive: boolean;
31
- isDebugInfoVisible: boolean;
32
31
  set elementRef(element: T);
33
32
  get elementRef(): T;
34
33
  get boundingBox(): KritzelBoundingBox;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kritzel-stencil",
3
- "version": "0.3.22",
3
+ "version": "0.3.23",
4
4
  "homepage": "https://kritzel.io/",
5
5
  "description": "Kritzel helps you build infinite whiteboard experiences.",
6
6
  "keywords": [
@@ -1 +0,0 @@
1
- class t{static getNumericValueFromStyle(t,n){const e=window.getComputedStyle(t).getPropertyValue(n);return parseFloat(e)||0}static getScrollableParent(t){if(!t)return window;const n=t.parentNode?.host??t.parentElement;if(!n||"BODY"===n.tagName)return window;const e=window.getComputedStyle(n);return"auto"===e.overflow||"auto"===e.overflowY||"scroll"===e.overflow||"scroll"===e.overflowY?n:this.getScrollableParent(n)}static isElementInViewport(t){if(!t)return!1;const n=this.getScrollableParent(t),e=t.getBoundingClientRect();if(n===window){const t=window.innerHeight||document.documentElement.clientHeight,n=window.innerWidth||document.documentElement.clientWidth;return e.top>=0&&e.left>=0&&e.bottom<=t&&e.right<=n}const o=n.getBoundingClientRect();return e.top>=o.top&&e.left>=o.left&&e.bottom<=o.bottom&&e.right<=o.right}static getFocusableElements(t){if(!t)return[];const n=[],e=t=>{t instanceof HTMLElement&&t.matches('a[href], button:not([disabled]), input:not([disabled]), textarea:not([disabled]), select:not([disabled]), details, [tabindex]:not([tabindex="-1"])')&&!t.hasAttribute("disabled")&&(t=>{const n=window.getComputedStyle(t);return"none"!==n.display&&"hidden"!==n.visibility})(t)&&n.push(t),t.shadowRoot&&Array.from(t.shadowRoot.children).forEach(e),"SLOT"===t.tagName&&t.assignedElements({flatten:!0}).forEach(e),t.shadowRoot||Array.from(t.children).forEach(e)};return e(t),n}}export{t as K}