kritzel-react 0.1.30 → 0.1.32

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 (209) hide show
  1. package/dist/kritzel-react/lib/components/stencil-generated/components.js +122 -0
  2. package/dist/kritzel-react/lib/index.js +2 -0
  3. package/dist/kritzel-stencil/src/classes/core/core.class.js +797 -0
  4. package/dist/kritzel-stencil/src/classes/core/reviver.class.js +97 -0
  5. package/dist/kritzel-stencil/src/classes/core/store.class.js +153 -0
  6. package/dist/kritzel-stencil/src/classes/core/viewport.class.js +311 -0
  7. package/dist/kritzel-stencil/src/classes/core/workspace.class.js +34 -0
  8. package/dist/kritzel-stencil/src/classes/handlers/base.handler.js +6 -0
  9. package/dist/kritzel-stencil/src/classes/handlers/context-menu.handler.js +63 -0
  10. package/dist/kritzel-stencil/src/classes/handlers/hover.handler.js +18 -0
  11. package/dist/kritzel-stencil/src/classes/handlers/key.handler.js +76 -0
  12. package/dist/kritzel-stencil/src/classes/handlers/line-handle.handler.js +382 -0
  13. package/dist/kritzel-stencil/src/classes/handlers/move.handler.js +213 -0
  14. package/dist/kritzel-stencil/src/classes/handlers/resize.handler.js +205 -0
  15. package/dist/kritzel-stencil/src/classes/handlers/rotation.handler.js +117 -0
  16. package/dist/kritzel-stencil/src/classes/handlers/selection.handler.js +313 -0
  17. package/dist/kritzel-stencil/src/classes/managers/anchor.manager.js +1056 -0
  18. package/dist/kritzel-stencil/src/classes/managers/cursor.manager.js +117 -0
  19. package/dist/kritzel-stencil/src/classes/managers/theme.manager.js +103 -0
  20. package/dist/kritzel-stencil/src/classes/objects/base-object.class.js +249 -0
  21. package/dist/kritzel-stencil/src/classes/objects/custom-element.class.js +60 -0
  22. package/dist/kritzel-stencil/src/classes/objects/group.class.js +407 -0
  23. package/dist/kritzel-stencil/src/classes/objects/image.class.js +55 -0
  24. package/dist/kritzel-stencil/src/classes/objects/line.class.js +608 -0
  25. package/dist/kritzel-stencil/src/classes/objects/path.class.js +401 -0
  26. package/dist/kritzel-stencil/src/classes/objects/selection-box.class.js +21 -0
  27. package/dist/kritzel-stencil/src/classes/objects/selection-group.class.js +409 -0
  28. package/dist/kritzel-stencil/src/classes/objects/shape.class.js +412 -0
  29. package/dist/kritzel-stencil/src/classes/objects/text.class.js +292 -0
  30. package/dist/kritzel-stencil/src/classes/providers/broadcast-sync-provider.class.js +101 -0
  31. package/dist/kritzel-stencil/src/classes/providers/hocuspocus-sync-provider.class.js +241 -0
  32. package/dist/kritzel-stencil/src/classes/providers/indexeddb-sync-provider.class.js +43 -0
  33. package/dist/kritzel-stencil/src/classes/providers/websocket-sync-provider.class.js +98 -0
  34. package/dist/kritzel-stencil/src/classes/registries/icon-registry.class.js +66 -0
  35. package/dist/kritzel-stencil/src/classes/registries/tool.registry.js +21 -0
  36. package/dist/kritzel-stencil/src/classes/structures/app-state-map.structure.js +212 -0
  37. package/dist/kritzel-stencil/src/classes/structures/object-map.structure.js +414 -0
  38. package/dist/kritzel-stencil/src/classes/structures/quadtree.structure.js +151 -0
  39. package/dist/kritzel-stencil/src/classes/tools/base-tool.class.js +36 -0
  40. package/dist/kritzel-stencil/src/classes/tools/brush-tool.class.js +161 -0
  41. package/dist/kritzel-stencil/src/classes/tools/eraser-tool.class.js +85 -0
  42. package/dist/kritzel-stencil/src/classes/tools/image-tool.class.js +83 -0
  43. package/dist/kritzel-stencil/src/classes/tools/line-tool.class.js +187 -0
  44. package/dist/kritzel-stencil/src/classes/tools/selection-tool.class.js +429 -0
  45. package/dist/kritzel-stencil/src/classes/tools/shape-tool.class.js +196 -0
  46. package/dist/kritzel-stencil/src/classes/tools/text-tool.class.js +100 -0
  47. package/dist/kritzel-stencil/src/components/core/kritzel-engine/kritzel-engine.js +1343 -0
  48. package/dist/kritzel-stencil/src/components/shared/kritzel-brush-style/kritzel-brush-style.js +46 -0
  49. package/dist/kritzel-stencil/src/components/shared/kritzel-dropdown/kritzel-dropdown.js +312 -0
  50. package/dist/kritzel-stencil/src/components/shared/kritzel-font-family/kritzel-font-family.js +60 -0
  51. package/dist/kritzel-stencil/src/components/shared/kritzel-line-endings/kritzel-line-endings.js +105 -0
  52. package/dist/kritzel-stencil/src/components/shared/kritzel-shape-fill/kritzel-shape-fill.js +53 -0
  53. package/dist/kritzel-stencil/src/components/ui/kritzel-context-menu/kritzel-context-menu.js +137 -0
  54. package/dist/kritzel-stencil/src/configs/default-brush-tool.config.js +9 -0
  55. package/dist/kritzel-stencil/src/configs/default-engine-config.js +63 -0
  56. package/dist/kritzel-stencil/src/configs/default-line-tool.config.js +9 -0
  57. package/dist/kritzel-stencil/src/configs/default-sync.config.js +9 -0
  58. package/dist/kritzel-stencil/src/configs/default-text-tool.config.js +7 -0
  59. package/dist/kritzel-stencil/src/constants/color-palette.constants.js +37 -0
  60. package/dist/kritzel-stencil/src/constants/engine.constants.js +2 -0
  61. package/dist/kritzel-stencil/src/enums/event-button.enum.js +6 -0
  62. package/dist/kritzel-stencil/src/enums/handle-type.enum.js +7 -0
  63. package/dist/kritzel-stencil/src/enums/shape-type.enum.js +6 -0
  64. package/dist/kritzel-stencil/src/helpers/class.helper.js +5 -0
  65. package/dist/kritzel-stencil/src/helpers/color.helper.js +106 -0
  66. package/dist/kritzel-stencil/src/helpers/cursor.helper.js +57 -0
  67. package/dist/kritzel-stencil/src/helpers/devices.helper.js +28 -0
  68. package/dist/kritzel-stencil/src/helpers/event.helper.js +58 -0
  69. package/dist/kritzel-stencil/src/helpers/geometry.helper.js +149 -0
  70. package/dist/kritzel-stencil/src/helpers/keyboard.helper.js +51 -0
  71. package/dist/kritzel-stencil/src/helpers/math.helper.js +5 -0
  72. package/dist/kritzel-stencil/src/helpers/object.helper.js +11 -0
  73. package/dist/kritzel-stencil/src/helpers/theme.helper.js +69 -0
  74. package/dist/kritzel-stencil/src/index.js +41 -0
  75. package/dist/kritzel-stencil/src/interfaces/anchor.interface.js +1 -0
  76. package/dist/kritzel-stencil/src/interfaces/arrow-head.interface.js +1 -0
  77. package/dist/kritzel-stencil/src/interfaces/bounding-box.interface.js +1 -0
  78. package/dist/kritzel-stencil/src/interfaces/clonable.interface.js +1 -0
  79. package/dist/kritzel-stencil/src/interfaces/context-menu-item.interface.js +1 -0
  80. package/dist/kritzel-stencil/src/interfaces/debug-info.interface.js +1 -0
  81. package/dist/kritzel-stencil/src/interfaces/dialog.interface.js +1 -0
  82. package/dist/kritzel-stencil/src/interfaces/displayable-shortcut.interface.js +1 -0
  83. package/dist/kritzel-stencil/src/interfaces/engine-state.interface.js +1 -0
  84. package/dist/kritzel-stencil/src/interfaces/line-options.interface.js +1 -0
  85. package/dist/kritzel-stencil/src/interfaces/master-detail.interface.js +1 -0
  86. package/dist/kritzel-stencil/src/interfaces/menu-item.interface.js +1 -0
  87. package/dist/kritzel-stencil/src/interfaces/object.interface.js +1 -0
  88. package/dist/kritzel-stencil/src/interfaces/path-options.interface.js +1 -0
  89. package/dist/kritzel-stencil/src/interfaces/point.interface.js +1 -0
  90. package/dist/kritzel-stencil/src/interfaces/polygon.interface.js +1 -0
  91. package/dist/kritzel-stencil/src/interfaces/serializable.interface.js +1 -0
  92. package/dist/kritzel-stencil/src/interfaces/settings.interface.js +1 -0
  93. package/dist/kritzel-stencil/src/interfaces/shortcut.interface.js +1 -0
  94. package/dist/kritzel-stencil/src/interfaces/sync-config.interface.js +1 -0
  95. package/dist/kritzel-stencil/src/interfaces/sync-provider.interface.js +1 -0
  96. package/dist/kritzel-stencil/src/interfaces/theme.interface.js +1 -0
  97. package/dist/kritzel-stencil/src/interfaces/tool-config.interface.js +1 -0
  98. package/dist/kritzel-stencil/src/interfaces/tool.interface.js +1 -0
  99. package/dist/kritzel-stencil/src/interfaces/toolbar-control.interface.js +1 -0
  100. package/dist/kritzel-stencil/src/interfaces/undo-state.interface.js +1 -0
  101. package/dist/kritzel-stencil/src/themes/dark-theme.js +198 -0
  102. package/dist/kritzel-stencil/src/themes/light-theme.js +199 -0
  103. package/dist/kritzel-stencil/src/types/shortcut.type.js +1 -0
  104. package/dist/kritzel-stencil/src/types/state.types.js +1 -0
  105. package/dist/types/kritzel-react/lib/components/stencil-generated/components.d.ts +74 -0
  106. package/dist/types/kritzel-react/lib/index.d.ts +2 -0
  107. package/dist/types/kritzel-stencil/src/classes/core/core.class.d.ts +101 -0
  108. package/dist/types/kritzel-stencil/src/classes/core/reviver.class.d.ts +6 -0
  109. package/dist/types/kritzel-stencil/src/classes/core/store.class.d.ts +53 -0
  110. package/dist/types/kritzel-stencil/src/classes/core/viewport.class.d.ts +48 -0
  111. package/dist/types/kritzel-stencil/src/classes/core/workspace.class.d.ts +24 -0
  112. package/dist/types/kritzel-stencil/src/classes/handlers/base.handler.d.ts +5 -0
  113. package/dist/types/kritzel-stencil/src/classes/handlers/context-menu.handler.d.ts +8 -0
  114. package/dist/types/kritzel-stencil/src/classes/handlers/hover.handler.d.ts +6 -0
  115. package/dist/types/kritzel-stencil/src/classes/handlers/key.handler.d.ts +11 -0
  116. package/dist/types/kritzel-stencil/src/classes/handlers/line-handle.handler.d.ts +34 -0
  117. package/dist/types/kritzel-stencil/src/classes/handlers/move.handler.d.ts +29 -0
  118. package/dist/types/kritzel-stencil/src/classes/handlers/resize.handler.d.ts +24 -0
  119. package/dist/types/kritzel-stencil/src/classes/handlers/rotation.handler.d.ts +12 -0
  120. package/dist/types/kritzel-stencil/src/classes/handlers/selection.handler.d.ts +27 -0
  121. package/dist/types/kritzel-stencil/src/classes/managers/anchor.manager.d.ts +180 -0
  122. package/dist/types/kritzel-stencil/src/classes/managers/cursor.manager.d.ts +43 -0
  123. package/dist/types/kritzel-stencil/src/classes/managers/theme.manager.d.ts +56 -0
  124. package/dist/types/kritzel-stencil/src/classes/objects/base-object.class.d.ts +76 -0
  125. package/dist/types/kritzel-stencil/src/classes/objects/custom-element.class.d.ts +26 -0
  126. package/dist/types/kritzel-stencil/src/classes/objects/group.class.d.ts +97 -0
  127. package/dist/types/kritzel-stencil/src/classes/objects/image.class.d.ts +17 -0
  128. package/dist/types/kritzel-stencil/src/classes/objects/line.class.d.ts +101 -0
  129. package/dist/types/kritzel-stencil/src/classes/objects/path.class.d.ts +62 -0
  130. package/dist/types/kritzel-stencil/src/classes/objects/selection-box.class.d.ts +6 -0
  131. package/dist/types/kritzel-stencil/src/classes/objects/selection-group.class.d.ts +67 -0
  132. package/dist/types/kritzel-stencil/src/classes/objects/shape.class.d.ts +124 -0
  133. package/dist/types/kritzel-stencil/src/classes/objects/text.class.d.ts +56 -0
  134. package/dist/types/kritzel-stencil/src/classes/providers/broadcast-sync-provider.class.d.ts +18 -0
  135. package/dist/types/kritzel-stencil/src/classes/providers/hocuspocus-sync-provider.class.d.ts +120 -0
  136. package/dist/types/kritzel-stencil/src/classes/providers/indexeddb-sync-provider.class.d.ts +22 -0
  137. package/dist/types/kritzel-stencil/src/classes/providers/websocket-sync-provider.class.d.ts +52 -0
  138. package/dist/types/kritzel-stencil/src/classes/registries/icon-registry.class.d.ts +9 -0
  139. package/dist/types/kritzel-stencil/src/classes/registries/tool.registry.d.ts +8 -0
  140. package/dist/types/kritzel-stencil/src/classes/structures/app-state-map.structure.d.ts +31 -0
  141. package/dist/types/kritzel-stencil/src/classes/structures/object-map.structure.d.ts +63 -0
  142. package/dist/types/kritzel-stencil/src/classes/structures/quadtree.structure.d.ts +36 -0
  143. package/dist/types/kritzel-stencil/src/classes/tools/base-tool.class.d.ts +20 -0
  144. package/dist/types/kritzel-stencil/src/classes/tools/brush-tool.class.d.ts +14 -0
  145. package/dist/types/kritzel-stencil/src/classes/tools/eraser-tool.class.d.ts +9 -0
  146. package/dist/types/kritzel-stencil/src/classes/tools/image-tool.class.d.ts +15 -0
  147. package/dist/types/kritzel-stencil/src/classes/tools/line-tool.class.d.ts +19 -0
  148. package/dist/types/kritzel-stencil/src/classes/tools/selection-tool.class.d.ts +54 -0
  149. package/dist/types/kritzel-stencil/src/classes/tools/shape-tool.class.d.ts +39 -0
  150. package/dist/types/kritzel-stencil/src/classes/tools/text-tool.class.d.ts +13 -0
  151. package/dist/types/kritzel-stencil/src/components/core/kritzel-engine/kritzel-engine.d.ts +111 -0
  152. package/dist/types/kritzel-stencil/src/components/shared/kritzel-brush-style/kritzel-brush-style.d.ts +11 -0
  153. package/dist/types/kritzel-stencil/src/components/shared/kritzel-dropdown/kritzel-dropdown.d.ts +46 -0
  154. package/dist/types/kritzel-stencil/src/components/shared/kritzel-font-family/kritzel-font-family.d.ts +13 -0
  155. package/dist/types/kritzel-stencil/src/components/shared/kritzel-line-endings/kritzel-line-endings.d.ts +21 -0
  156. package/dist/types/kritzel-stencil/src/components/shared/kritzel-shape-fill/kritzel-shape-fill.d.ts +10 -0
  157. package/dist/types/kritzel-stencil/src/components/ui/kritzel-context-menu/kritzel-context-menu.d.ts +21 -0
  158. package/dist/types/kritzel-stencil/src/configs/default-brush-tool.config.d.ts +2 -0
  159. package/dist/types/kritzel-stencil/src/configs/default-engine-config.d.ts +2 -0
  160. package/dist/types/kritzel-stencil/src/configs/default-line-tool.config.d.ts +2 -0
  161. package/dist/types/kritzel-stencil/src/configs/default-sync.config.d.ts +5 -0
  162. package/dist/types/kritzel-stencil/src/configs/default-text-tool.config.d.ts +2 -0
  163. package/dist/types/kritzel-stencil/src/constants/color-palette.constants.d.ts +29 -0
  164. package/dist/types/kritzel-stencil/src/constants/engine.constants.d.ts +2 -0
  165. package/dist/types/kritzel-stencil/src/enums/event-button.enum.d.ts +5 -0
  166. package/dist/types/kritzel-stencil/src/enums/handle-type.enum.d.ts +6 -0
  167. package/dist/types/kritzel-stencil/src/enums/shape-type.enum.d.ts +5 -0
  168. package/dist/types/kritzel-stencil/src/helpers/class.helper.d.ts +3 -0
  169. package/dist/types/kritzel-stencil/src/helpers/color.helper.d.ts +33 -0
  170. package/dist/types/kritzel-stencil/src/helpers/cursor.helper.d.ts +22 -0
  171. package/dist/types/kritzel-stencil/src/helpers/devices.helper.d.ts +8 -0
  172. package/dist/types/kritzel-stencil/src/helpers/event.helper.d.ts +6 -0
  173. package/dist/types/kritzel-stencil/src/helpers/geometry.helper.d.ts +38 -0
  174. package/dist/types/kritzel-stencil/src/helpers/keyboard.helper.d.ts +6 -0
  175. package/dist/types/kritzel-stencil/src/helpers/math.helper.d.ts +3 -0
  176. package/dist/types/kritzel-stencil/src/helpers/object.helper.d.ts +4 -0
  177. package/dist/types/kritzel-stencil/src/helpers/theme.helper.d.ts +41 -0
  178. package/dist/types/kritzel-stencil/src/index.d.ts +42 -0
  179. package/dist/types/kritzel-stencil/src/interfaces/anchor.interface.d.ts +137 -0
  180. package/dist/types/kritzel-stencil/src/interfaces/arrow-head.interface.d.ts +27 -0
  181. package/dist/types/kritzel-stencil/src/interfaces/bounding-box.interface.d.ts +8 -0
  182. package/dist/types/kritzel-stencil/src/interfaces/clonable.interface.d.ts +3 -0
  183. package/dist/types/kritzel-stencil/src/interfaces/context-menu-item.interface.d.ts +17 -0
  184. package/dist/types/kritzel-stencil/src/interfaces/debug-info.interface.d.ts +4 -0
  185. package/dist/types/kritzel-stencil/src/interfaces/dialog.interface.d.ts +4 -0
  186. package/dist/types/kritzel-stencil/src/interfaces/displayable-shortcut.interface.d.ts +5 -0
  187. package/dist/types/kritzel-stencil/src/interfaces/engine-state.interface.d.ts +73 -0
  188. package/dist/types/kritzel-stencil/src/interfaces/line-options.interface.d.ts +23 -0
  189. package/dist/types/kritzel-stencil/src/interfaces/master-detail.interface.d.ts +14 -0
  190. package/dist/types/kritzel-stencil/src/interfaces/menu-item.interface.d.ts +24 -0
  191. package/dist/types/kritzel-stencil/src/interfaces/object.interface.d.ts +53 -0
  192. package/dist/types/kritzel-stencil/src/interfaces/path-options.interface.d.ts +11 -0
  193. package/dist/types/kritzel-stencil/src/interfaces/point.interface.d.ts +4 -0
  194. package/dist/types/kritzel-stencil/src/interfaces/polygon.interface.d.ts +7 -0
  195. package/dist/types/kritzel-stencil/src/interfaces/serializable.interface.d.ts +5 -0
  196. package/dist/types/kritzel-stencil/src/interfaces/settings.interface.d.ts +11 -0
  197. package/dist/types/kritzel-stencil/src/interfaces/shortcut.interface.d.ts +10 -0
  198. package/dist/types/kritzel-stencil/src/interfaces/sync-config.interface.d.ts +22 -0
  199. package/dist/types/kritzel-stencil/src/interfaces/sync-provider.interface.d.ts +29 -0
  200. package/dist/types/kritzel-stencil/src/interfaces/theme.interface.d.ts +330 -0
  201. package/dist/types/kritzel-stencil/src/interfaces/tool-config.interface.d.ts +26 -0
  202. package/dist/types/kritzel-stencil/src/interfaces/tool.interface.d.ts +7 -0
  203. package/dist/types/kritzel-stencil/src/interfaces/toolbar-control.interface.d.ts +58 -0
  204. package/dist/types/kritzel-stencil/src/interfaces/undo-state.interface.d.ts +6 -0
  205. package/dist/types/kritzel-stencil/src/themes/dark-theme.d.ts +5 -0
  206. package/dist/types/kritzel-stencil/src/themes/light-theme.d.ts +5 -0
  207. package/dist/types/kritzel-stencil/src/types/shortcut.type.d.ts +1 -0
  208. package/dist/types/kritzel-stencil/src/types/state.types.d.ts +3 -0
  209. package/package.json +2 -2
@@ -0,0 +1,117 @@
1
+ import { KritzelCursorHelper } from '../../helpers/cursor.helper';
2
+ /**
3
+ * Manages cursor state and updates across the application.
4
+ * Handles cursor changes based on handle hovers, tool states, and interactions.
5
+ */
6
+ export class KritzelCursorManager {
7
+ constructor(core) {
8
+ this._targetElement = null;
9
+ this._shadowRoot = null;
10
+ this._core = core;
11
+ }
12
+ /**
13
+ * Sets the target element where cursor styles will be applied.
14
+ * Also sets the pointer cursor CSS variable for child components.
15
+ */
16
+ setTargetElement(element) {
17
+ // Reset cursor on old target
18
+ if (this._targetElement) {
19
+ this._targetElement.style.cursor = '';
20
+ this._targetElement.style.removeProperty('--kritzel-global-pointer-cursor');
21
+ }
22
+ this._targetElement = element;
23
+ // Set the pointer cursor CSS variable for child components to use
24
+ if (this._targetElement) {
25
+ this._targetElement.style.setProperty('--kritzel-global-pointer-cursor', KritzelCursorHelper.getPointerCursor());
26
+ }
27
+ }
28
+ /**
29
+ * Gets the current cursor target element.
30
+ */
31
+ getTargetElement() {
32
+ return this._targetElement;
33
+ }
34
+ /**
35
+ * Sets the shadow root for element detection.
36
+ */
37
+ setShadowRoot(shadowRoot) {
38
+ this._shadowRoot = shadowRoot;
39
+ }
40
+ /**
41
+ * Resets cursor to default state.
42
+ * Should be called when all pointers are released.
43
+ */
44
+ resetToDefault() {
45
+ this._core.store.state.cursor = { icon: 'default', iconActive: 'default' };
46
+ }
47
+ /**
48
+ * Detects handle hover states using elementsFromPoint() to work with overlapped elements.
49
+ * This approach finds all elements at the pointer position instead of relying on pointerenter/pointerleave.
50
+ */
51
+ updateHoverState(ev) {
52
+ var _a;
53
+ if (this._core.store.isPointerDown)
54
+ return;
55
+ if (!this._shadowRoot)
56
+ return;
57
+ const elementsAtPoint = this._shadowRoot.elementsFromPoint(ev.clientX, ev.clientY);
58
+ if (!elementsAtPoint || elementsAtPoint.length === 0)
59
+ return;
60
+ // Check for resize handle overlays (selection group)
61
+ const resizeHandleOverlay = elementsAtPoint.find(el => el.classList.contains('resize-handle-overlay'));
62
+ if (resizeHandleOverlay) {
63
+ const selectionGroup = this._core.store.selectionGroup;
64
+ const rotationDegrees = (_a = selectionGroup === null || selectionGroup === void 0 ? void 0 : selectionGroup.rotationDegrees) !== null && _a !== void 0 ? _a : 0;
65
+ // Determine rotation offset based on handle position
66
+ const isTopLeft = resizeHandleOverlay.classList.contains('top-left');
67
+ const isBottomRight = resizeHandleOverlay.classList.contains('bottom-right');
68
+ const rotationOffset = (isTopLeft || isBottomRight) ? -45 : 45;
69
+ this._core.store.state.cursor = { icon: 'move-vertical', rotation: rotationDegrees + rotationOffset };
70
+ return;
71
+ }
72
+ // Check for rotation handle overlay
73
+ const rotationHandleOverlay = elementsAtPoint.find(el => el.classList.contains('rotation-handle-overlay'));
74
+ if (rotationHandleOverlay) {
75
+ this._core.store.state.cursor = { icon: 'hand', iconActive: 'hand-grab' };
76
+ return;
77
+ }
78
+ // Check for line handle overlays (selection line)
79
+ const lineHandleOverlay = elementsAtPoint.find(el => el.classList.contains('selection-line-handle-overlay'));
80
+ if (lineHandleOverlay) {
81
+ this._core.store.state.cursor = { icon: 'hand', iconActive: 'hand-grab' };
82
+ return;
83
+ }
84
+ // Reset cursor if not hovering any handle
85
+ this._core.store.state.cursor = { icon: 'default', iconActive: 'default' };
86
+ }
87
+ /**
88
+ * Applies the current cursor state to the target element.
89
+ * Should be called in the render loop.
90
+ */
91
+ applyCursor() {
92
+ var _a, _b, _c, _d;
93
+ const state = this._core.store.state;
94
+ const isPointerDown = this._core.store.isPointerDown;
95
+ const icon = (_a = state.cursor) === null || _a === void 0 ? void 0 : _a.icon;
96
+ const iconActive = (_c = (_b = state.cursor) === null || _b === void 0 ? void 0 : _b.iconActive) !== null && _c !== void 0 ? _c : icon;
97
+ const rotation = (_d = state.cursor) === null || _d === void 0 ? void 0 : _d.rotation;
98
+ const cursor = KritzelCursorHelper.getCursor({
99
+ iconName: isPointerDown ? iconActive : icon,
100
+ rotation: rotation,
101
+ });
102
+ if (this._targetElement) {
103
+ this._targetElement.style.cursor = cursor;
104
+ }
105
+ }
106
+ /**
107
+ * Cleans up cursor state when the component is disconnected.
108
+ */
109
+ cleanup() {
110
+ if (this._targetElement) {
111
+ this._targetElement.style.cursor = '';
112
+ this._targetElement.style.removeProperty('--kritzel-pointer-cursor');
113
+ }
114
+ this._targetElement = null;
115
+ this._shadowRoot = null;
116
+ }
117
+ }
@@ -0,0 +1,103 @@
1
+ import { lightTheme } from '../../themes/light-theme';
2
+ import { darkTheme } from '../../themes/dark-theme';
3
+ import { ThemeHelper } from '../../helpers/theme.helper';
4
+ const THEME_STORAGE_KEY = 'kritzel-theme';
5
+ const DEFAULT_THEME = 'light';
6
+ /**
7
+ * Manages theme state and application across the Kritzel editor.
8
+ * Handles theme persistence, retrieval, and CSS variable application.
9
+ */
10
+ export class KritzelThemeManager {
11
+ constructor(core) {
12
+ this._currentTheme = DEFAULT_THEME;
13
+ this._targetElement = null;
14
+ this._core = core;
15
+ this._currentTheme = KritzelThemeManager.getStoredTheme();
16
+ void this._core;
17
+ }
18
+ /**
19
+ * Gets the current active theme name.
20
+ */
21
+ get currentTheme() {
22
+ return this._currentTheme;
23
+ }
24
+ /**
25
+ * Sets the target element where theme CSS variables will be applied.
26
+ */
27
+ setTargetElement(element) {
28
+ this._targetElement = element;
29
+ if (this._targetElement) {
30
+ this.applyTheme(this._currentTheme);
31
+ }
32
+ }
33
+ /**
34
+ * Gets the current target element.
35
+ */
36
+ getTargetElement() {
37
+ return this._targetElement;
38
+ }
39
+ /**
40
+ * Gets the theme object by name.
41
+ */
42
+ getThemeByName(themeName) {
43
+ return themeName === 'dark' ? darkTheme : lightTheme;
44
+ }
45
+ /**
46
+ * Gets the stored theme name from localStorage.
47
+ * Can be called statically without a manager instance.
48
+ * @returns The stored theme name, or 'light' as default
49
+ */
50
+ static getStoredTheme() {
51
+ if (typeof localStorage === 'undefined') {
52
+ return DEFAULT_THEME;
53
+ }
54
+ const stored = localStorage.getItem(THEME_STORAGE_KEY);
55
+ if (stored === 'dark' || stored === 'light') {
56
+ return stored;
57
+ }
58
+ return DEFAULT_THEME;
59
+ }
60
+ /**
61
+ * Saves the theme name to localStorage.
62
+ */
63
+ saveTheme(themeName) {
64
+ if (typeof localStorage === 'undefined') {
65
+ return;
66
+ }
67
+ localStorage.setItem(THEME_STORAGE_KEY, themeName);
68
+ }
69
+ /**
70
+ * Sets the current theme, saves it to storage, and applies it to the target element.
71
+ */
72
+ setTheme(themeName) {
73
+ this._currentTheme = themeName;
74
+ this.saveTheme(themeName);
75
+ if (this._targetElement) {
76
+ this.applyTheme(themeName);
77
+ }
78
+ }
79
+ /**
80
+ * Checks if the current theme is dark.
81
+ */
82
+ isDarkTheme() {
83
+ return this._currentTheme === 'dark';
84
+ }
85
+ /**
86
+ * Applies a theme to the target element by setting CSS custom properties.
87
+ * Uses the generic theme utility to automatically derive CSS variable names
88
+ * from the theme interface structure.
89
+ */
90
+ applyTheme(themeName) {
91
+ if (!this._targetElement) {
92
+ return;
93
+ }
94
+ const theme = this.getThemeByName(themeName);
95
+ ThemeHelper.applyThemeToElement(this._targetElement, theme);
96
+ }
97
+ /**
98
+ * Cleans up theme manager state.
99
+ */
100
+ cleanup() {
101
+ this._targetElement = null;
102
+ }
103
+ }
@@ -0,0 +1,249 @@
1
+ var __rest = (this && this.__rest) || function (s, e) {
2
+ var t = {};
3
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
+ t[p] = s[p];
5
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
+ t[p[i]] = s[p[i]];
9
+ }
10
+ return t;
11
+ };
12
+ import { ObjectHelper } from '../../helpers/object.helper';
13
+ import { KritzelGeometryHelper } from '../../helpers/geometry.helper';
14
+ export class KritzelBaseObject {
15
+ get totalWidth() {
16
+ return this.width + this.padding * 2;
17
+ }
18
+ get totalHeight() {
19
+ return this.height + this.padding * 2;
20
+ }
21
+ set elementRef(element) {
22
+ this._elementRef = element;
23
+ }
24
+ get elementRef() {
25
+ return this._elementRef;
26
+ }
27
+ get boundingBox() {
28
+ return {
29
+ x: this.translateX,
30
+ y: this.translateY,
31
+ z: this.scale,
32
+ width: this.totalWidth / this.scale,
33
+ height: this.totalHeight / this.scale,
34
+ };
35
+ }
36
+ get rotatedBoundingBox() {
37
+ const polygon = this.rotatedPolygon;
38
+ const xValues = [polygon.topLeft.x, polygon.topRight.x, polygon.bottomRight.x, polygon.bottomLeft.x];
39
+ const yValues = [polygon.topLeft.y, polygon.topRight.y, polygon.bottomRight.y, polygon.bottomLeft.y];
40
+ const minX = Math.min(...xValues);
41
+ const maxX = Math.max(...xValues);
42
+ const minY = Math.min(...yValues);
43
+ const maxY = Math.max(...yValues);
44
+ return {
45
+ x: minX,
46
+ y: minY,
47
+ z: this.scale,
48
+ width: maxX - minX,
49
+ height: maxY - minY,
50
+ };
51
+ }
52
+ get rotatedPolygon() {
53
+ const cx = this.translateX + this.totalWidth / 2 / this.scale;
54
+ const cy = this.translateY + this.totalHeight / 2 / this.scale;
55
+ const angle = this.rotation;
56
+ // Optimization: Precomputes cos/sin once
57
+ const cos = Math.cos(angle);
58
+ const sin = Math.sin(angle);
59
+ const adjustedWidth = this.totalWidth / this.scale;
60
+ const adjustedHeight = this.totalHeight / this.scale;
61
+ const x1 = this.translateX;
62
+ const y1 = this.translateY;
63
+ const x2 = x1 + adjustedWidth;
64
+ const y2 = y1 + adjustedHeight;
65
+ // Helper to rotate a point around center
66
+ const rotate = (x, y) => ({
67
+ x: cos * (x - cx) - sin * (y - cy) + cx,
68
+ y: sin * (x - cx) + cos * (y - cy) + cy,
69
+ });
70
+ return {
71
+ topLeft: rotate(x1, y1),
72
+ topRight: rotate(x2, y1),
73
+ bottomRight: rotate(x2, y2),
74
+ bottomLeft: rotate(x1, y2),
75
+ };
76
+ }
77
+ get minXRotated() {
78
+ const corners = [this.rotatedPolygon.topLeft.x, this.rotatedPolygon.topRight.x, this.rotatedPolygon.bottomRight.x, this.rotatedPolygon.bottomLeft.x];
79
+ return Math.min(...corners);
80
+ }
81
+ get minYRotated() {
82
+ const corners = [this.rotatedPolygon.topLeft.y, this.rotatedPolygon.topRight.y, this.rotatedPolygon.bottomRight.y, this.rotatedPolygon.bottomLeft.y];
83
+ return Math.min(...corners);
84
+ }
85
+ get maxXRotated() {
86
+ const corners = [this.rotatedPolygon.topLeft.x, this.rotatedPolygon.topRight.x, this.rotatedPolygon.bottomRight.x, this.rotatedPolygon.bottomLeft.x];
87
+ return Math.max(...corners);
88
+ }
89
+ get maxYRotated() {
90
+ const corners = [this.rotatedPolygon.topLeft.y, this.rotatedPolygon.topRight.y, this.rotatedPolygon.bottomRight.y, this.rotatedPolygon.bottomLeft.y];
91
+ return Math.max(...corners);
92
+ }
93
+ get transformationMatrix() {
94
+ const scale = 1 / this.scale;
95
+ const translateX = this.translateX;
96
+ const translateY = this.translateY;
97
+ return `matrix(${scale}, 0, 0, ${scale}, ${translateX}, ${translateY})`;
98
+ }
99
+ get rotationDegrees() {
100
+ return this.rotation * (180 / Math.PI);
101
+ }
102
+ get centerX() {
103
+ return this.translateX + this.totalWidth / 2 / this.scale;
104
+ }
105
+ get centerY() {
106
+ return this.translateY + this.totalHeight / 2 / this.scale;
107
+ }
108
+ constructor() {
109
+ this.__class__ = 'KritzelBaseObject';
110
+ this.borderWidth = 0;
111
+ this.opacity = 1;
112
+ this.padding = 0;
113
+ this.resizing = false;
114
+ this.rotation = 0;
115
+ this.markedForRemoval = false;
116
+ this.zIndex = 0;
117
+ this.isVisible = true;
118
+ this.isSelected = false;
119
+ this.isHovered = false;
120
+ this.isMounted = false;
121
+ this.isEditable = false;
122
+ this.isInteractive = false;
123
+ this.isDebugInfoVisible = false;
124
+ this.id = this.generateId();
125
+ }
126
+ static create(core) {
127
+ const object = new KritzelBaseObject();
128
+ object._core = core;
129
+ object.zIndex = core.store.currentZIndex;
130
+ object.workspaceId = core.store.state.activeWorkspace.id;
131
+ return object;
132
+ }
133
+ mount(element) {
134
+ if (this.isMounted) {
135
+ return;
136
+ }
137
+ this.elementRef = element;
138
+ this.isMounted = true;
139
+ }
140
+ generateId() {
141
+ return ObjectHelper.generateUUID();
142
+ }
143
+ isInViewport() {
144
+ const viewportScale = this._core.store.state.scale;
145
+ const scaledWidth = this.boundingBox.width * viewportScale;
146
+ const scaledHeight = this.boundingBox.height * viewportScale;
147
+ if (scaledWidth * scaledHeight < 0.5) {
148
+ return false;
149
+ }
150
+ const viewportBounds = {
151
+ x: -this._core.store.state.translateX / this._core.store.state.scale,
152
+ y: -this._core.store.state.translateY / this._core.store.state.scale,
153
+ z: this._core.store.state.scale,
154
+ width: this._core.store.state.viewportWidth / this._core.store.state.scale,
155
+ height: this._core.store.state.viewportHeight / this._core.store.state.scale,
156
+ };
157
+ return (this.rotatedBoundingBox.x < viewportBounds.x + viewportBounds.width &&
158
+ this.rotatedBoundingBox.x + this.rotatedBoundingBox.width > viewportBounds.x &&
159
+ this.rotatedBoundingBox.y < viewportBounds.y + viewportBounds.height &&
160
+ this.rotatedBoundingBox.y + this.rotatedBoundingBox.height > viewportBounds.y);
161
+ }
162
+ centerInViewport() {
163
+ const { viewportWidth, viewportHeight, translateX: viewportTranslateX, translateY: viewportTranslateY, scale: viewportScale } = this._core.store.state;
164
+ const { x, y, width, height } = this.rotatedBoundingBox;
165
+ const objectCenterX = x + width / 2;
166
+ const objectCenterY = y + height / 2;
167
+ const targetCenterX = (viewportWidth / 2 - viewportTranslateX) / viewportScale;
168
+ const targetCenterY = (viewportHeight / 2 - viewportTranslateY) / viewportScale;
169
+ const deltaX = targetCenterX - objectCenterX;
170
+ const deltaY = targetCenterY - objectCenterY;
171
+ this.updatePosition(this.translateX + deltaX, this.translateY + deltaY);
172
+ }
173
+ update() {
174
+ this._core.store.state.objects.update(this);
175
+ }
176
+ move(startX, startY, endX, endY) {
177
+ const deltaX = (startX - endX) / this._core.store.state.scale;
178
+ const deltaY = (startY - endY) / this._core.store.state.scale;
179
+ this.translateX += deltaX;
180
+ this.translateY += deltaY;
181
+ this._core.store.state.objects.update(this);
182
+ }
183
+ resize(x, y, width, height) {
184
+ if (width <= 1 || height <= 1) {
185
+ return;
186
+ }
187
+ this.width = width;
188
+ this.height = height;
189
+ this.translateX = x;
190
+ this.translateY = y;
191
+ this._core.store.state.objects.update(this);
192
+ // Update any lines that are anchored to this object (after position is updated)
193
+ this._core.anchorManager.updateAnchorsForObject(this.id);
194
+ }
195
+ rotate(value) {
196
+ this.rotation = value;
197
+ this._core.store.state.objects.update(this);
198
+ }
199
+ clone() {
200
+ const clone = Object.create(Object.getPrototypeOf(this));
201
+ Object.assign(clone, this);
202
+ clone.id = this.id;
203
+ return clone;
204
+ }
205
+ copy() {
206
+ const copiedObject = Object.create(Object.getPrototypeOf(this));
207
+ Object.assign(copiedObject, this);
208
+ copiedObject.id = this.generateId();
209
+ copiedObject.isMounted = false;
210
+ return copiedObject;
211
+ }
212
+ serialize() {
213
+ const _a = this, { _core, _elementRef, element, totalWidth, totalHeight } = _a, remainingProps = __rest(_a, ["_core", "_elementRef", "element", "totalWidth", "totalHeight"]);
214
+ const clonedProps = structuredClone(remainingProps);
215
+ if (element && typeof element === 'object' && 'nodeType' in element && element.nodeType === 1) {
216
+ clonedProps.element = element.cloneNode(true);
217
+ }
218
+ return clonedProps;
219
+ }
220
+ deserialize(object) {
221
+ Object.assign(this, object);
222
+ return this;
223
+ }
224
+ isClass(className) {
225
+ return this.__class__ === className;
226
+ }
227
+ edit(_event) {
228
+ // This method can be overridden by subclasses to handle edit actions.
229
+ }
230
+ /**
231
+ * Called after properties are updated via updateObject.
232
+ * Override in subclasses to perform custom logic when specific properties change.
233
+ */
234
+ onAfterUpdate(_changedProperties) {
235
+ // Default implementation does nothing
236
+ }
237
+ hitTest(_x, _y) {
238
+ return true; // Default implementation, can be overridden by subclasses
239
+ }
240
+ hitTestPolygon(polygon) {
241
+ const objectPolygon = this.rotatedPolygon;
242
+ return KritzelGeometryHelper.doPolygonsIntersect(objectPolygon, polygon);
243
+ }
244
+ updatePosition(x, y) {
245
+ this.translateX = x;
246
+ this.translateY = y;
247
+ this._core.store.state.objects.update(this);
248
+ }
249
+ }
@@ -0,0 +1,60 @@
1
+ import { KritzelBaseObject } from './base-object.class';
2
+ export class KritzelCustomElement extends KritzelBaseObject {
3
+ constructor(config) {
4
+ super();
5
+ this.__class__ = 'KritzelCustomElement';
6
+ this.isInteractive = true;
7
+ if (config) {
8
+ this.translateX = config.translateX || 0;
9
+ this.translateY = config.translateY || 0;
10
+ this.scale = config.scale || 1;
11
+ this.element = config.element;
12
+ this.height = config.height || 0;
13
+ this.width = config.width || 0;
14
+ }
15
+ }
16
+ static create(core, config) {
17
+ const object = new KritzelCustomElement(config);
18
+ object._core = core;
19
+ object.id = object.generateId();
20
+ object.workspaceId = core.store.state.activeWorkspace.id;
21
+ return object;
22
+ }
23
+ mount(element) {
24
+ if (element === null) {
25
+ return;
26
+ }
27
+ // If already mounted to the same element and content is still attached, skip
28
+ if (this.isMounted && this.elementRef === element && this.element.parentElement === element) {
29
+ return;
30
+ }
31
+ this.elementRef = element;
32
+ this.isMounted = true;
33
+ // Clear existing content and append the element
34
+ this.elementRef.innerHTML = '';
35
+ this.elementRef.appendChild(this.element);
36
+ }
37
+ resize(x, y, width, height) {
38
+ if (width <= 1 || height <= 1) {
39
+ return;
40
+ }
41
+ this.width = width;
42
+ this.height = height;
43
+ this.translateX = x;
44
+ this.translateY = y;
45
+ if (this.element) {
46
+ this.element.style.width = `${width}px`;
47
+ this.element.style.height = `${height}px`;
48
+ }
49
+ // Update to sync changes to y.js and propagate to other tabs
50
+ this._core.store.state.objects.update(this);
51
+ }
52
+ copy() {
53
+ const copiedObject = Object.create(Object.getPrototypeOf(this));
54
+ Object.assign(copiedObject, this);
55
+ copiedObject.id = this.generateId();
56
+ copiedObject.isMounted = false;
57
+ copiedObject.element = this.element.cloneNode(true);
58
+ return copiedObject;
59
+ }
60
+ }