kritzel-stencil 0.4.0 → 0.4.2

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 (86) hide show
  1. package/dist/cjs/index.cjs.js +2 -1
  2. package/dist/cjs/kritzel-active-users_47.cjs.entry.js +365 -80
  3. package/dist/cjs/loader.cjs.js +1 -1
  4. package/dist/cjs/{schema.constants-fuAsi56H.js → schema.constants-C8hqt--r.js} +274 -33
  5. package/dist/cjs/stencil.cjs.js +1 -1
  6. package/dist/collection/classes/core/workspace.class.js +1 -1
  7. package/dist/collection/classes/handlers/context-menu.handler.js +2 -3
  8. package/dist/collection/classes/managers/clipboard.manager.js +9 -3
  9. package/dist/collection/classes/objects/base-object.class.js +0 -1
  10. package/dist/collection/classes/objects/text.class.js +2 -1
  11. package/dist/collection/classes/registries/font-registry.class.js +161 -0
  12. package/dist/collection/classes/structures/object-map.structure.js +9 -0
  13. package/dist/collection/classes/tools/image-tool.class.js +19 -3
  14. package/dist/collection/classes/tools/text-tool.class.js +2 -0
  15. package/dist/collection/components/core/kritzel-awareness-cursors/kritzel-awareness-cursors.js +22 -7
  16. package/dist/collection/components/core/kritzel-editor/kritzel-editor.js +138 -9
  17. package/dist/collection/components/core/kritzel-engine/kritzel-engine.js +186 -25
  18. package/dist/collection/components/shared/kritzel-font-family/kritzel-font-family.js +31 -22
  19. package/dist/collection/components/ui/kritzel-controls/kritzel-controls.js +10 -11
  20. package/dist/collection/components/ui/kritzel-tool-config/kritzel-tool-config.js +40 -5
  21. package/dist/collection/configs/default-text-tool.config.js +2 -0
  22. package/dist/collection/constants/text-tool-fonts.constants.js +18 -0
  23. package/dist/collection/constants/version.js +1 -1
  24. package/dist/collection/helpers/image-file.helper.js +6 -0
  25. package/dist/collection/index.js +2 -0
  26. package/dist/collection/interfaces/font.interface.js +1 -0
  27. package/dist/components/index.js +1 -1
  28. package/dist/components/kritzel-awareness-cursors.js +1 -1
  29. package/dist/components/kritzel-controls.js +1 -1
  30. package/dist/components/kritzel-cursor-trail.js +1 -1
  31. package/dist/components/kritzel-editor.js +1 -1
  32. package/dist/components/kritzel-engine.js +1 -1
  33. package/dist/components/kritzel-font-family.js +1 -1
  34. package/dist/components/kritzel-settings.js +1 -1
  35. package/dist/components/kritzel-tool-config.js +1 -1
  36. package/dist/components/kritzel-workspace-manager.js +1 -1
  37. package/dist/components/p--Oazz-BP.js +9 -0
  38. package/dist/components/p-C38P-Vd0.js +1 -0
  39. package/dist/components/{p-zhjb97WN.js → p-C3UQ-Zrg.js} +1 -1
  40. package/dist/components/{p-9692OaI_.js → p-ClFprFvz.js} +1 -1
  41. package/dist/components/p-Cm33td2O.js +1 -0
  42. package/dist/components/{p-DhMlShij.js → p-DAwPPDMS.js} +1 -1
  43. package/dist/components/p-DJkKlUyZ.js +1 -0
  44. package/dist/components/p-JYj3Facr.js +1 -0
  45. package/dist/components/p-Ka7OWbnk.js +1 -0
  46. package/dist/components/p-djJSnjAX.js +1 -0
  47. package/dist/esm/index.js +2 -2
  48. package/dist/esm/kritzel-active-users_47.entry.js +365 -80
  49. package/dist/esm/loader.js +1 -1
  50. package/dist/esm/{schema.constants-Cv5-yM39.js → schema.constants-uC7_X6yr.js} +272 -34
  51. package/dist/esm/stencil.js +1 -1
  52. package/dist/stencil/index.esm.js +1 -1
  53. package/dist/stencil/p-b64c3584.entry.js +9 -0
  54. package/dist/stencil/p-uC7_X6yr.js +1 -0
  55. package/dist/stencil/stencil.esm.js +1 -1
  56. package/dist/types/classes/core/workspace.class.d.ts +1 -1
  57. package/dist/types/classes/managers/clipboard.manager.d.ts +1 -0
  58. package/dist/types/classes/objects/base-object.class.d.ts +0 -1
  59. package/dist/types/classes/registries/font-registry.class.d.ts +19 -0
  60. package/dist/types/classes/structures/object-map.structure.d.ts +2 -2
  61. package/dist/types/classes/tools/image-tool.class.d.ts +9 -2
  62. package/dist/types/classes/tools/text-tool.class.d.ts +3 -0
  63. package/dist/types/components/core/kritzel-awareness-cursors/kritzel-awareness-cursors.d.ts +2 -0
  64. package/dist/types/components/core/kritzel-editor/kritzel-editor.d.ts +22 -0
  65. package/dist/types/components/core/kritzel-engine/kritzel-engine.d.ts +17 -0
  66. package/dist/types/components/shared/kritzel-font-family/kritzel-font-family.d.ts +4 -0
  67. package/dist/types/components/ui/kritzel-tool-config/kritzel-tool-config.d.ts +1 -0
  68. package/dist/types/components.d.ts +20 -2
  69. package/dist/types/constants/text-tool-fonts.constants.d.ts +3 -0
  70. package/dist/types/constants/version.d.ts +1 -1
  71. package/dist/types/helpers/image-file.helper.d.ts +3 -0
  72. package/dist/types/index.d.ts +2 -0
  73. package/dist/types/interfaces/font.interface.d.ts +15 -0
  74. package/dist/types/interfaces/toolbar-control.interface.d.ts +2 -0
  75. package/package.json +1 -1
  76. package/dist/components/p-B4b6TDxp.js +0 -1
  77. package/dist/components/p-C2ocjA6D.js +0 -1
  78. package/dist/components/p-CwbZCXKh.js +0 -1
  79. package/dist/components/p-D2q_wTyG.js +0 -1
  80. package/dist/components/p-D8NvNMcU.js +0 -1
  81. package/dist/components/p-D8W6LE-c.js +0 -1
  82. package/dist/components/p-G9G9y5VE.js +0 -9
  83. package/dist/components/p-JhOYwUOj.js +0 -1
  84. package/dist/components/p-UEf2EN23.js +0 -1
  85. package/dist/stencil/p-2c489187.entry.js +0 -9
  86. package/dist/stencil/p-Cv5-yM39.js +0 -1
@@ -19,7 +19,7 @@ var patchBrowser = () => {
19
19
 
20
20
  patchBrowser().then(async (options) => {
21
21
  await appGlobals.globalScripts();
22
- return index.bootstrapLazy(JSON.parse("[[\"kritzel-active-users_47.cjs\",[[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-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],\"isSyncing\":[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-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-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-dialog\",{\"user\":[16],\"terms\":[16],\"isDialogOpen\":[32],\"open\":[64],\"close\":[64]}],[513,\"kritzel-share-dialog\",{\"isPublic\":[4,\"is-public\"],\"workspaceId\":[1,\"workspace-id\"],\"terms\":[16],\"isDialogOpen\":[32],\"internalIsPublic\":[32],\"copySuccess\":[32],\"qrCodeDataUrl\":[32],\"open\":[64],\"close\":[64]},null,{\"isPublic\":[{\"onIsPublicChange\":0}],\"workspaceId\":[{\"onWorkspaceIdChange\":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-current-user\",{\"user\":[16],\"avatarSize\":[2,\"avatar-size\"],\"terms\":[16]}],[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]}],[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-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]}],[769,\"kritzel-button\",{\"variant\":[1],\"disabled\":[4],\"type\":[1]}],[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-loading-overlay\",{\"visible\":[4],\"text\":[1]}],[513,\"kritzel-numeric-input\",{\"value\":[1026],\"min\":[2],\"max\":[2],\"step\":[2],\"label\":[1],\"placeholder\":[1],\"inputValue\":[32]},null,{\"value\":[{\"onValueChange\":0}]}],[513,\"kritzel-sync-indicator\",{\"visible\":[4],\"text\":[1]}],[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-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-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-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]}]]],[\"kritzel-brush-style.cjs\",[[513,\"kritzel-brush-style\",{\"type\":[1],\"brushOptions\":[16]}]]]]"), options);
22
+ return index.bootstrapLazy(JSON.parse("[[\"kritzel-active-users_47.cjs\",[[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],\"customFonts\":[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],\"normalizedControls\":[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],\"registerFonts\":[64],\"t\":[64]},[[0,\"dblclick\",\"onTouchStart\"]],{\"isEngineReady\":[{\"onIsEngineReady\":0}],\"isControlsReady\":[{\"onIsControlsReady\":0}],\"workspaces\":[{\"onWorkspacesChange\":0}],\"activeWorkspace\":[{\"onActiveWorkspaceChange\":0}],\"customFonts\":[{\"onCustomFontsChange\":0}],\"controls\":[{\"onControlsChange\":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-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],\"isSyncing\":[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-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-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-dialog\",{\"user\":[16],\"terms\":[16],\"isDialogOpen\":[32],\"open\":[64],\"close\":[64]}],[513,\"kritzel-share-dialog\",{\"isPublic\":[4,\"is-public\"],\"workspaceId\":[1,\"workspace-id\"],\"terms\":[16],\"isDialogOpen\":[32],\"internalIsPublic\":[32],\"copySuccess\":[32],\"qrCodeDataUrl\":[32],\"open\":[64],\"close\":[64]},null,{\"isPublic\":[{\"onIsPublicChange\":0}],\"workspaceId\":[{\"onWorkspaceIdChange\":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-current-user\",{\"user\":[16],\"avatarSize\":[2,\"avatar-size\"],\"terms\":[16]}],[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]}],[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-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]}],[769,\"kritzel-button\",{\"variant\":[1],\"disabled\":[4],\"type\":[1]}],[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-loading-overlay\",{\"visible\":[4],\"text\":[1]}],[513,\"kritzel-numeric-input\",{\"value\":[1026],\"min\":[2],\"max\":[2],\"step\":[2],\"label\":[1],\"placeholder\":[1],\"inputValue\":[32]},null,{\"value\":[{\"onValueChange\":0}]}],[513,\"kritzel-sync-indicator\",{\"visible\":[4],\"text\":[1]}],[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\"]},null,{\"fontOptions\":[{\"handleFontOptionsChange\":0}]}],[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-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-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-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]}]]],[\"kritzel-brush-style.cjs\",[[513,\"kritzel-brush-style\",{\"type\":[1],\"brushOptions\":[16]}]]]]"), options);
23
23
  });
24
24
 
25
25
  exports.setNonce = index.setNonce;
@@ -1,5 +1,5 @@
1
1
  /** Current version of the workspace export format */
2
- export const WORKSPACE_EXPORT_VERSION = '1.2.0';
2
+ export const WORKSPACE_EXPORT_VERSION = '1.3.0';
3
3
  /**
4
4
  * Represents a workspace in the Kritzel canvas.
5
5
  * A workspace is an isolated canvas area with its own set of objects and viewport state.
@@ -1,6 +1,5 @@
1
1
  import { KritzelSelectionGroup } from "../objects/selection-group.class";
2
2
  import { KritzelBaseHandler } from "./base.handler";
3
- import { KritzelSelectionTool } from "../tools/selection-tool.class";
4
3
  import { KritzelSelectionBox } from "../objects/selection-box.class";
5
4
  /**
6
5
  * Handles context menu interactions on the Kritzel canvas.
@@ -65,7 +64,7 @@ export class KritzelContextMenuHandler extends KritzelBaseHandler {
65
64
  * @returns void - This method does not return a value; it updates state and triggers a rerender.
66
65
  */
67
66
  handleContextMenu(event) {
68
- if (!(this._core.store.state.activeTool instanceof KritzelSelectionTool)) {
67
+ if (this._core.store.state.activeTool?.toolType !== 'selection') {
69
68
  return;
70
69
  }
71
70
  if (this._core.store.state.skipContextMenu) {
@@ -125,7 +124,7 @@ export class KritzelContextMenuHandler extends KritzelBaseHandler {
125
124
  */
126
125
  open(options) {
127
126
  const { x, y, objectId } = options;
128
- if (this._core.store.state.activeTool instanceof KritzelSelectionTool) {
127
+ if (this._core.store.state.activeTool?.toolType === 'selection') {
129
128
  const selectionTool = this._core.store.state.activeTool;
130
129
  selectionTool?.moveHandler?.cancelPendingDrag();
131
130
  }
@@ -9,6 +9,7 @@ import { KritzelNavigatorPasteIntentProvider } from "../providers/paste-intent/n
9
9
  import { KritzelIosPasteIntentProvider } from "../providers/paste-intent/ios-paste-intent.provider";
10
10
  import { CLIPBOARD_PAYLOAD_PREFIX } from "./clipboard.types";
11
11
  import imageCompression from "browser-image-compression";
12
+ import { KritzelImageFileHelper } from "../../helpers/image-file.helper";
12
13
  /**
13
14
  * Manages clipboard operations (copy/cut/paste) for a core instance.
14
15
  *
@@ -184,9 +185,8 @@ export class KritzelClipboardManager {
184
185
  const scale = this._core.store.state.scale;
185
186
  const offset = 25 / scale;
186
187
  const preparePromises = intent.files.map(async (file, index) => {
187
- // Use the default image compression size of 1200
188
- const compressed = await imageCompression(file, { maxWidthOrHeight: 1200 });
189
- return KritzelImage.fromBlob(this._core, compressed, {
188
+ const preparedFile = await this.prepareImageFile(file);
189
+ return KritzelImage.fromBlob(this._core, preparedFile, {
190
190
  translateX: index * offset,
191
191
  translateY: index * offset,
192
192
  });
@@ -198,6 +198,12 @@ export class KritzelClipboardManager {
198
198
  return null;
199
199
  }
200
200
  }
201
+ async prepareImageFile(file) {
202
+ if (KritzelImageFileHelper.isGifFile(file)) {
203
+ return file;
204
+ }
205
+ return imageCompression(file, { maxWidthOrHeight: 1200 });
206
+ }
201
207
  async materializePlainText(intent) {
202
208
  const textObject = KritzelText.create(this._core);
203
209
  const paragraphs = intent.text.split('\n').map(line => {
@@ -29,7 +29,6 @@ export class KritzelBaseObject {
29
29
  markedForRemoval = false;
30
30
  zIndex = 0;
31
31
  userId;
32
- /** Whether the object is currently visible on the canvas */
33
32
  isVisible = true;
34
33
  isSelected = false;
35
34
  isHovered = false;
@@ -10,6 +10,7 @@ import { keymap } from "prosemirror-keymap";
10
10
  import { baseKeymap } from "prosemirror-commands";
11
11
  import { KritzelColorHelper } from "../../helpers/color.helper";
12
12
  import { KritzelMathHelper } from "../../helpers/math.helper";
13
+ import { KritzelFontRegistry } from "../registries/font-registry.class";
13
14
  /**
14
15
  * Represents a text object on the canvas that supports rich text editing via ProseMirror.
15
16
  * Extends the base object class to inherit common object properties and behaviors.
@@ -146,7 +147,7 @@ export class KritzelText extends KritzelBaseObject {
146
147
  if (element === null || this.isInViewport() === false) {
147
148
  return;
148
149
  }
149
- element.style.fontFamily = this.fontFamily;
150
+ element.style.fontFamily = KritzelFontRegistry.resolveCssFontFamily(this.fontFamily);
150
151
  element.style.fontSize = `${this.fontSize}pt`;
151
152
  element.style.color = KritzelColorHelper.resolveThemeColor(this.fontColor);
152
153
  if (this.isMounted && this.elementRef === element && this.editor.dom.parentElement === element) {
@@ -0,0 +1,161 @@
1
+ const KRITZEL_FONT_REGISTRY_KEY = '__kritzelFontRegistry__';
2
+ const KRITZEL_FONT_REGISTRY_EVENT = 'kritzel-font-registry-change';
3
+ const getGlobalRegistryStore = () => {
4
+ const globalScope = globalThis;
5
+ const existing = globalScope[KRITZEL_FONT_REGISTRY_KEY];
6
+ if (existing) {
7
+ return existing;
8
+ }
9
+ const created = {
10
+ fonts: new Map(),
11
+ };
12
+ globalScope[KRITZEL_FONT_REGISTRY_KEY] = created;
13
+ return created;
14
+ };
15
+ const normalizeFontRegistration = (key, registration) => {
16
+ if (typeof registration === 'string') {
17
+ return {
18
+ key,
19
+ family: registration,
20
+ label: registration,
21
+ cssFontFamily: registration,
22
+ };
23
+ }
24
+ return {
25
+ key,
26
+ family: registration.family,
27
+ label: registration.label ?? registration.family,
28
+ cssFontFamily: registration.cssFontFamily ?? registration.family,
29
+ source: registration.source,
30
+ };
31
+ };
32
+ const normalizeKey = (value) => value.trim().toLocaleLowerCase();
33
+ const normalizeFamily = (value) => value.trim().toLocaleLowerCase();
34
+ export class KritzelFontRegistry {
35
+ static get _fonts() {
36
+ return getGlobalRegistryStore().fonts;
37
+ }
38
+ static getFontFaceSet() {
39
+ if (typeof document === 'undefined' || !document.fonts) {
40
+ return null;
41
+ }
42
+ return document.fonts;
43
+ }
44
+ static toCssFontFace(fontFamily) {
45
+ return fontFamily.includes(' ')
46
+ ? `"${fontFamily.replaceAll('"', '\\"')}"`
47
+ : fontFamily;
48
+ }
49
+ static getRegisteredFontFamilies(fonts) {
50
+ return [...new Set(Object.values(fonts)
51
+ .map(registration => (typeof registration === 'string' ? registration : registration.family))
52
+ .map(family => family.trim())
53
+ .filter(Boolean))];
54
+ }
55
+ static register(key, registration) {
56
+ const normalized = normalizeFontRegistration(key, registration);
57
+ if (this._fonts.has(key)) {
58
+ console.warn(`[FontRegistry] Font "${key}" is already registered. It will be overwritten.`);
59
+ }
60
+ this._fonts.set(key, normalized);
61
+ this.emitChange();
62
+ }
63
+ static registerFonts(fonts) {
64
+ for (const [key, registration] of Object.entries(fonts)) {
65
+ this.register(key, registration);
66
+ }
67
+ }
68
+ static injectFontStylesheets(fonts) {
69
+ if (typeof document === 'undefined') {
70
+ return Promise.resolve([]);
71
+ }
72
+ const loadPromises = [];
73
+ for (const [key, registration] of Object.entries(fonts)) {
74
+ if (typeof registration === 'string' || !registration.source) {
75
+ continue;
76
+ }
77
+ const sourceUrl = registration.source;
78
+ const linkId = `kritzel-font-stylesheet-${key}`;
79
+ if (document.getElementById(linkId)) {
80
+ continue;
81
+ }
82
+ const link = document.createElement('link');
83
+ link.id = linkId;
84
+ link.rel = 'stylesheet';
85
+ link.href = sourceUrl;
86
+ const promise = new Promise((resolve) => {
87
+ link.onload = () => resolve();
88
+ link.onerror = () => {
89
+ console.warn(`[FontRegistry] Failed to load stylesheet for font "${key}": ${sourceUrl}`);
90
+ resolve(); // Resolve anyway so we don't hang startup on external failures
91
+ };
92
+ });
93
+ document.head.appendChild(link);
94
+ loadPromises.push(promise);
95
+ }
96
+ return Promise.all(loadPromises);
97
+ }
98
+ static async waitForFonts(fonts) {
99
+ await this.injectFontStylesheets(fonts);
100
+ const fontFaceSet = this.getFontFaceSet();
101
+ const registeredFontFamilies = this.getRegisteredFontFamilies(fonts);
102
+ if (!fontFaceSet || registeredFontFamilies.length === 0) {
103
+ return;
104
+ }
105
+ await Promise.allSettled(registeredFontFamilies.map(fontFamily => fontFaceSet.load(`1em ${this.toCssFontFace(fontFamily)}`)));
106
+ await fontFaceSet.ready;
107
+ }
108
+ static get(key) {
109
+ return this._fonts.get(key);
110
+ }
111
+ static has(key) {
112
+ return this._fonts.has(key);
113
+ }
114
+ static unregister(key) {
115
+ const deleted = this._fonts.delete(key);
116
+ if (deleted) {
117
+ this.emitChange();
118
+ }
119
+ return deleted;
120
+ }
121
+ static list() {
122
+ return [...this._fonts.values()];
123
+ }
124
+ static resolveCssFontFamily(fontFamily) {
125
+ const normalizedFamily = normalizeFamily(fontFamily);
126
+ const match = this.list().find(font => {
127
+ if (normalizeFamily(font.family) === normalizedFamily) {
128
+ return true;
129
+ }
130
+ return normalizeKey(font.key) === normalizedFamily;
131
+ });
132
+ return match?.cssFontFamily ?? fontFamily;
133
+ }
134
+ static toRegisteredFont(registration) {
135
+ if (typeof registration === 'string') {
136
+ return {
137
+ key: registration,
138
+ family: registration,
139
+ label: registration,
140
+ cssFontFamily: registration,
141
+ };
142
+ }
143
+ return {
144
+ key: registration.family,
145
+ family: registration.family,
146
+ label: registration.label ?? registration.family,
147
+ cssFontFamily: registration.cssFontFamily ?? registration.family,
148
+ source: registration.source,
149
+ };
150
+ }
151
+ static emitChange() {
152
+ const eventTarget = globalThis;
153
+ if (typeof eventTarget.dispatchEvent !== 'function' || typeof CustomEvent === 'undefined') {
154
+ return;
155
+ }
156
+ eventTarget.dispatchEvent(new CustomEvent(KRITZEL_FONT_REGISTRY_EVENT));
157
+ }
158
+ static get changeEventName() {
159
+ return KRITZEL_FONT_REGISTRY_EVENT;
160
+ }
161
+ }
@@ -200,6 +200,9 @@ export class KritzelObjectMap {
200
200
  */
201
201
  onAwarenessChange(callback) {
202
202
  this._awarenessChangeCallbacks.push(callback);
203
+ return () => {
204
+ this._awarenessChangeCallbacks = this._awarenessChangeCallbacks.filter(existingCallback => existingCallback !== callback);
205
+ };
203
206
  }
204
207
  /**
205
208
  * Registers a callback to be invoked when remote object changes are received.
@@ -208,6 +211,9 @@ export class KritzelObjectMap {
208
211
  */
209
212
  onObjectsChange(callback) {
210
213
  this._objectsChangeCallbacks.push(callback);
214
+ return () => {
215
+ this._objectsChangeCallbacks = this._objectsChangeCallbacks.filter(existingCallback => existingCallback !== callback);
216
+ };
211
217
  }
212
218
  /**
213
219
  * Returns the Yjs UndoManager instance for managing undo/redo operations.
@@ -404,6 +410,9 @@ export class KritzelObjectMap {
404
410
  callback(states);
405
411
  }
406
412
  }, delayMs);
413
+ if (typeof this._awarenessEmitTimeout.unref === 'function') {
414
+ this._awarenessEmitTimeout.unref();
415
+ }
407
416
  }
408
417
  };
409
418
  this._awareness.on('change', this._awarenessChangeHandler);
@@ -1,12 +1,14 @@
1
1
  import { KritzelImage } from "../objects/image.class";
2
2
  import { KritzelBaseTool } from "./base-tool.class";
3
3
  import imageCompression from "browser-image-compression";
4
+ import { KritzelImageFileHelper } from "../../helpers/image-file.helper";
4
5
  /**
5
6
  * Image tool for importing and placing images on the canvas.
6
7
  *
7
8
  * Flow:
8
9
  * 1. User picks a file.
9
- * 2. Image is compressed via `browser-image-compression` (bandwidth win).
10
+ * 2. Static images are compressed via `browser-image-compression` (bandwidth win).
11
+ * GIF files retain their original bytes so animation is preserved.
10
12
  * 3. Intrinsic dimensions are measured from a temporary object URL.
11
13
  * 4. Bytes are uploaded through the asset resolver (write-through:
12
14
  * local IndexedDB immediately, remote providers in the background).
@@ -64,7 +66,7 @@ export class KritzelImageTool extends KritzelBaseTool {
64
66
  }
65
67
  /**
66
68
  * Handles the file selection event from the file input.
67
- * Compresses each selected image and places them as a batch on the canvas.
69
+ * Compresses each selected image if necessaryand places them as a batch on the canvas.
68
70
  * Resets the file input value after processing.
69
71
  * @param event - The change event from the file input element
70
72
  */
@@ -79,7 +81,10 @@ export class KritzelImageTool extends KritzelBaseTool {
79
81
  }
80
82
  return;
81
83
  }
82
- const prepared = files.map(file => imageCompression(file, { maxWidthOrHeight: this.maxCompressionSize }).then(compressedFile => KritzelImage.fromBlob(this._core, compressedFile)));
84
+ const prepared = files.map(async (file) => {
85
+ const preparedFile = await this.prepareImageFile(file);
86
+ return KritzelImage.fromBlob(this._core, preparedFile);
87
+ });
83
88
  Promise.allSettled(prepared)
84
89
  .then(results => {
85
90
  const images = [];
@@ -101,6 +106,17 @@ export class KritzelImageTool extends KritzelBaseTool {
101
106
  input.value = '';
102
107
  }
103
108
  }
109
+ /**
110
+ * Prepares an image file for insertion by compressing it if necessary.
111
+ * @param file
112
+ * @returns
113
+ */
114
+ async prepareImageFile(file) {
115
+ if (KritzelImageFileHelper.isGifFile(file)) {
116
+ return file;
117
+ }
118
+ return imageCompression(file, { maxWidthOrHeight: this.maxCompressionSize });
119
+ }
104
120
  /**
105
121
  * Adds a batch of prepared images to the canvas store and switches
106
122
  * to the selection tool. The first image is centered in the viewport;
@@ -55,6 +55,8 @@ export class KritzelTextTool extends KritzelBaseTool {
55
55
  palette = [...DEFAULT_COLOR_PALETTE];
56
56
  /** Available font size presets for the text tool */
57
57
  sizes = [...DEFAULT_FONT_SIZES];
58
+ /** Optional custom font options supplied through tool config. */
59
+ availableFonts;
58
60
  /**
59
61
  * Creates a new instance of KritzelTextTool.
60
62
  * @param core - The KritzelCore instance that provides access to application state and functionality
@@ -12,23 +12,38 @@ export class KritzelAwarenessCursors {
12
12
  objectVersion = 0;
13
13
  cleanupIntervalId;
14
14
  objectChangeRafId = null;
15
+ removeAwarenessChangeListener;
16
+ removeObjectsChangeListener;
15
17
  componentDidLoad() {
16
- this.core.store.objects?.onAwarenessChange(states => {
18
+ this.removeAwarenessChangeListener = this.core.store.objects?.onAwarenessChange(states => {
17
19
  this.handleAwarenessChange(states);
18
20
  });
19
- this.core.store.objects?.onObjectsChange(() => {
21
+ this.removeObjectsChangeListener = this.core.store.objects?.onObjectsChange(() => {
20
22
  this.handleRemoteObjectChange();
21
23
  });
22
24
  this.cleanupIntervalId = setInterval(() => {
23
25
  this.cleanupStaleCursors();
24
26
  }, CLEANUP_INTERVAL_MS);
27
+ if (this.cleanupIntervalId && typeof this.cleanupIntervalId.unref === 'function') {
28
+ this.cleanupIntervalId.unref();
29
+ }
25
30
  }
26
31
  disconnectedCallback() {
27
- if (this.cleanupIntervalId) {
28
- clearInterval(this.cleanupIntervalId);
32
+ if (this.removeAwarenessChangeListener) {
33
+ this.removeAwarenessChangeListener();
34
+ this.removeAwarenessChangeListener = undefined;
35
+ }
36
+ if (this.removeObjectsChangeListener) {
37
+ this.removeObjectsChangeListener();
38
+ this.removeObjectsChangeListener = undefined;
29
39
  }
30
- if (this.objectChangeRafId !== null) {
31
- cancelAnimationFrame(this.objectChangeRafId);
40
+ if (this.cleanupIntervalId && typeof globalThis.clearInterval === 'function') {
41
+ globalThis.clearInterval(this.cleanupIntervalId);
42
+ this.cleanupIntervalId = undefined;
43
+ }
44
+ if (this.objectChangeRafId !== null && typeof globalThis.cancelAnimationFrame === 'function') {
45
+ globalThis.cancelAnimationFrame(this.objectChangeRafId);
46
+ this.objectChangeRafId = null;
32
47
  }
33
48
  }
34
49
  handleAwarenessChange(states) {
@@ -195,7 +210,7 @@ export class KritzelAwarenessCursors {
195
210
  void _ty;
196
211
  void this.objectVersion;
197
212
  const cursors = Array.from(this.remoteCursors.values());
198
- return (h(Host, { key: '5c695e3c5a012767b31bb1b756ef03e2a174f46e' }, cursors.map(remoteCursor => {
213
+ return (h(Host, { key: '9be6694250bafe011be27301d1c7a53fc7957657' }, cursors.map(remoteCursor => {
199
214
  if (!remoteCursor.cursor)
200
215
  return null;
201
216
  // When a remote user is actively drawing, derive cursor position from