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,137 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
8
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
9
+ return new (P || (P = Promise))(function (resolve, reject) {
10
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
11
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
12
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
13
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
14
+ });
15
+ };
16
+ import { Component, Host, Prop, Event, State, Watch, Listen, Element } from '@stencil/core';
17
+ const VIEWPORT_PADDING = 8;
18
+ let KritzelContextMenu = class KritzelContextMenu {
19
+ constructor() {
20
+ this.processedItems = [];
21
+ }
22
+ onItemsChanged() {
23
+ this.updateMenuItems();
24
+ }
25
+ handleOutsideClick(event) {
26
+ const path = event.composedPath();
27
+ if (!path.includes(this.host)) {
28
+ this.close.emit();
29
+ }
30
+ }
31
+ componentWillLoad() {
32
+ this.updateMenuItems();
33
+ }
34
+ componentDidLoad() {
35
+ this.adjustPositionToViewport();
36
+ }
37
+ componentDidUpdate() {
38
+ this.adjustPositionToViewport();
39
+ }
40
+ adjustPositionToViewport() {
41
+ const rect = this.host.getBoundingClientRect();
42
+ const viewportWidth = window.innerWidth;
43
+ const viewportHeight = window.innerHeight;
44
+ const currentLeft = parseFloat(this.host.style.left) || 0;
45
+ const currentTop = parseFloat(this.host.style.top) || 0;
46
+ let newLeft = currentLeft;
47
+ let newTop = currentTop;
48
+ // Check if menu extends beyond right edge
49
+ if (rect.right > viewportWidth - VIEWPORT_PADDING) {
50
+ newLeft = viewportWidth - rect.width - VIEWPORT_PADDING;
51
+ }
52
+ // Check if menu extends beyond bottom edge
53
+ if (rect.bottom > viewportHeight - VIEWPORT_PADDING) {
54
+ newTop = viewportHeight - rect.height - VIEWPORT_PADDING;
55
+ }
56
+ // Ensure menu doesn't go beyond left edge
57
+ if (newLeft < VIEWPORT_PADDING) {
58
+ newLeft = VIEWPORT_PADDING;
59
+ }
60
+ // Ensure menu doesn't go beyond top edge
61
+ if (newTop < VIEWPORT_PADDING) {
62
+ newTop = VIEWPORT_PADDING;
63
+ }
64
+ // Only update if position changed to avoid infinite loops
65
+ if (newLeft !== currentLeft || newTop !== currentTop) {
66
+ this.host.style.left = `${newLeft}px`;
67
+ this.host.style.top = `${newTop}px`;
68
+ }
69
+ }
70
+ handleItemClick(item, isDisabled) {
71
+ if (!isDisabled) {
72
+ this.actionSelected.emit(item);
73
+ }
74
+ }
75
+ updateMenuItems() {
76
+ return __awaiter(this, void 0, void 0, function* () {
77
+ const processed = [];
78
+ for (const item of this.items) {
79
+ const isVisible = yield this.evaluateProperty(item.visible, true);
80
+ if (isVisible) {
81
+ const isDisabled = yield this.evaluateProperty(item.disabled, false);
82
+ processed.push({ item, isDisabled });
83
+ }
84
+ }
85
+ this.processedItems = processed;
86
+ });
87
+ }
88
+ evaluateProperty(value, defaultValue) {
89
+ return __awaiter(this, void 0, void 0, function* () {
90
+ if (typeof value === 'boolean') {
91
+ return value;
92
+ }
93
+ if (typeof value === 'function') {
94
+ return yield Promise.resolve(value(null, this.objects));
95
+ }
96
+ return defaultValue;
97
+ });
98
+ }
99
+ render() {
100
+ return (React.createElement(Host, null,
101
+ React.createElement("div", { class: "menu-container" }, this.processedItems.map(({ item, isDisabled }, index) => (React.createElement("button", { key: `${item.label}-${index}`, class: { 'menu-item': true, 'disabled': isDisabled }, onClick: () => this.handleItemClick(item, isDisabled), disabled: isDisabled },
102
+ item.icon && React.createElement("kritzel-icon", { name: item.icon, size: 16 }),
103
+ React.createElement("span", { class: "label" }, item.label)))))));
104
+ }
105
+ };
106
+ __decorate([
107
+ Element()
108
+ ], KritzelContextMenu.prototype, "host", void 0);
109
+ __decorate([
110
+ Prop()
111
+ ], KritzelContextMenu.prototype, "items", void 0);
112
+ __decorate([
113
+ Watch('items')
114
+ ], KritzelContextMenu.prototype, "onItemsChanged", null);
115
+ __decorate([
116
+ Prop()
117
+ ], KritzelContextMenu.prototype, "objects", void 0);
118
+ __decorate([
119
+ Event()
120
+ ], KritzelContextMenu.prototype, "actionSelected", void 0);
121
+ __decorate([
122
+ Event()
123
+ ], KritzelContextMenu.prototype, "close", void 0);
124
+ __decorate([
125
+ State()
126
+ ], KritzelContextMenu.prototype, "processedItems", void 0);
127
+ __decorate([
128
+ Listen('pointerdown', { target: 'window' })
129
+ ], KritzelContextMenu.prototype, "handleOutsideClick", null);
130
+ KritzelContextMenu = __decorate([
131
+ Component({
132
+ tag: 'kritzel-context-menu',
133
+ styleUrl: 'kritzel-context-menu.css',
134
+ shadow: true,
135
+ })
136
+ ], KritzelContextMenu);
137
+ export { KritzelContextMenu };
@@ -0,0 +1,9 @@
1
+ import { DEFAULT_COLOR_PALETTE } from '../constants/color-palette.constants';
2
+ export const DEFAULT_BRUSH_CONFIG = {
3
+ type: 'pen',
4
+ color: DEFAULT_COLOR_PALETTE[0],
5
+ size: 16,
6
+ palettes: {
7
+ pen: [...DEFAULT_COLOR_PALETTE],
8
+ },
9
+ };
@@ -0,0 +1,63 @@
1
+ export const DEFAULT_ENGINE_CONFIG = {
2
+ activeWorkspace: null,
3
+ activeTool: null,
4
+ copiedObjects: null,
5
+ objects: null,
6
+ snapCandidate: null,
7
+ resizeHandleType: null,
8
+ lineHandleType: null,
9
+ hasViewportChanged: false,
10
+ hasObjectsChanged: false,
11
+ isReady: false,
12
+ isEnabled: true,
13
+ isScaling: false,
14
+ isPanning: false,
15
+ isSelecting: false,
16
+ isResizing: false,
17
+ isResizeHandleHovered: false,
18
+ isResizeHandleSelected: false,
19
+ isRotating: false,
20
+ isRotationHandleHovered: false,
21
+ isRotationHandleSelected: false,
22
+ isLineHandleSelected: false,
23
+ isLineHandleDragging: false,
24
+ isDragging: false,
25
+ isDrawing: false,
26
+ isErasing: false,
27
+ isWriting: false,
28
+ isCtrlKeyPressed: false,
29
+ isContextMenuVisible: false,
30
+ contextMenuItems: [],
31
+ contextMenuX: 0,
32
+ contextMenuY: 0,
33
+ skipContextMenu: false,
34
+ debugInfo: {
35
+ showObjectInfo: false,
36
+ showViewportInfo: false
37
+ },
38
+ host: null,
39
+ pointerX: 0,
40
+ pointerY: 0,
41
+ scale: 1,
42
+ scaleMax: 1,
43
+ scaleMin: 1,
44
+ startX: 0,
45
+ startY: 0,
46
+ translateX: 0,
47
+ translateXMax: 400,
48
+ translateXMin: 0,
49
+ translateY: 0,
50
+ translateYMax: 400,
51
+ translateYMin: 0,
52
+ viewportWidth: 0,
53
+ viewportHeight: 0,
54
+ longTouchTimeout: null,
55
+ longTouchDelay: 300,
56
+ pointers: new Map(),
57
+ workspaces: [],
58
+ cursor: {
59
+ icon: 'default',
60
+ iconActive: 'default'
61
+ },
62
+ lockDrawingScale: true
63
+ };
@@ -0,0 +1,9 @@
1
+ import { DEFAULT_COLOR_PALETTE } from '../constants/color-palette.constants';
2
+ export const DEFAULT_LINE_TOOL_CONFIG = {
3
+ color: DEFAULT_COLOR_PALETTE[0],
4
+ size: 4,
5
+ palette: [...DEFAULT_COLOR_PALETTE],
6
+ arrows: {
7
+ end: { enabled: true, style: 'triangle' },
8
+ },
9
+ };
@@ -0,0 +1,9 @@
1
+ import { IndexedDBSyncProvider } from '../classes/providers/indexeddb-sync-provider.class';
2
+ /**
3
+ * Default sync configuration - IndexedDB + BroadcastChannel
4
+ */
5
+ export const DEFAULT_SYNC_CONFIG = {
6
+ providers: [
7
+ IndexedDBSyncProvider
8
+ ],
9
+ };
@@ -0,0 +1,7 @@
1
+ import { DEFAULT_COLOR_PALETTE } from "../constants/color-palette.constants";
2
+ export const DEFAULT_TEXT_CONFIG = {
3
+ color: DEFAULT_COLOR_PALETTE[0],
4
+ size: 8,
5
+ fontFamily: 'Arial',
6
+ palette: [...DEFAULT_COLOR_PALETTE],
7
+ };
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Helper function to resolve a color value for a specific theme
3
+ */
4
+ export function resolveColor(color, theme) {
5
+ return color[theme];
6
+ }
7
+ /**
8
+ * Default color palette shared across all tool configurations.
9
+ * This ensures consistency in color options throughout the application.
10
+ * All colors support theme-specific variations.
11
+ */
12
+ export const DEFAULT_COLOR_PALETTE = [
13
+ { light: '#000000', dark: '#ffffff', label: 'Primary' },
14
+ { light: '#ff5252', dark: '#ff5252' },
15
+ { light: '#ffbc00', dark: '#ffbc00' },
16
+ { light: '#00c853', dark: '#00c853' },
17
+ { light: '#0000FF', dark: '#0000FF' },
18
+ { light: '#d500f9', dark: '#d500f9' },
19
+ { light: '#fafafa', dark: '#212121', label: 'Background' },
20
+ { light: '#a52714', dark: '#a52714' },
21
+ { light: '#ee8100', dark: '#ee8100' },
22
+ { light: '#558b2f', dark: '#558b2f' },
23
+ { light: '#01579b', dark: '#01579b' },
24
+ { light: '#8e24aa', dark: '#8e24aa' },
25
+ { light: '#90a4ae', dark: '#607d8b', label: 'Neutral' },
26
+ { light: '#ff4081', dark: '#ff4081' },
27
+ { light: '#ff6e40', dark: '#ff6e40' },
28
+ { light: '#aeea00', dark: '#aeea00' },
29
+ { light: '#304ffe', dark: '#304ffe' },
30
+ { light: '#7c4dff', dark: '#7c4dff' },
31
+ { light: '#cfd8dc', dark: '#455a64' },
32
+ { light: '#f8bbd0', dark: '#ec407a' },
33
+ { light: '#ffccbc', dark: '#ff7043' },
34
+ { light: '#f0f4c3', dark: '#c0ca33' },
35
+ { light: '#9fa8da', dark: '#5c6bc0' },
36
+ { light: '#d1c4e9', dark: '#9575cd' },
37
+ ];
@@ -0,0 +1,2 @@
1
+ export const ABSOLUTE_SCALE_MAX = 1000;
2
+ export const ABSOLUTE_SCALE_MIN = 0.0001;
@@ -0,0 +1,6 @@
1
+ export var KritzelMouseButton;
2
+ (function (KritzelMouseButton) {
3
+ KritzelMouseButton[KritzelMouseButton["Left"] = 0] = "Left";
4
+ KritzelMouseButton[KritzelMouseButton["Middle"] = 1] = "Middle";
5
+ KritzelMouseButton[KritzelMouseButton["Right"] = 2] = "Right";
6
+ })(KritzelMouseButton || (KritzelMouseButton = {}));
@@ -0,0 +1,7 @@
1
+ export var KritzelHandleType;
2
+ (function (KritzelHandleType) {
3
+ KritzelHandleType["TopLeft"] = "top-left";
4
+ KritzelHandleType["TopRight"] = "top-right";
5
+ KritzelHandleType["BottomLeft"] = "bottom-left";
6
+ KritzelHandleType["BottomRight"] = "bottom-right";
7
+ })(KritzelHandleType || (KritzelHandleType = {}));
@@ -0,0 +1,6 @@
1
+ export var ShapeType;
2
+ (function (ShapeType) {
3
+ ShapeType["Rectangle"] = "rectangle";
4
+ ShapeType["Ellipse"] = "ellipse";
5
+ ShapeType["Triangle"] = "triangle";
6
+ })(ShapeType || (ShapeType = {}));
@@ -0,0 +1,5 @@
1
+ export class KritzelClassHelper {
2
+ static isInstanceOf(object, className) {
3
+ return !!object && object.__class__ === className;
4
+ }
5
+ }
@@ -0,0 +1,106 @@
1
+ import { resolveColor } from '../constants/color-palette.constants';
2
+ import { KritzelThemeManager } from '../classes/managers/theme.manager';
3
+ export class KritzelColorHelper {
4
+ /**
5
+ * Resolves a color value based on the current theme.
6
+ * Handles both simple string colors and theme-aware color objects.
7
+ * @param color - The color to resolve (string or ThemeAwareColor)
8
+ * @param theme - Optional theme to use. If not provided, uses current theme from ThemeManager
9
+ * @returns The resolved hex color string, or empty string if color is undefined
10
+ */
11
+ static resolveThemeColor(color, theme) {
12
+ if (!color) {
13
+ return '';
14
+ }
15
+ const currentTheme = theme !== null && theme !== void 0 ? theme : KritzelThemeManager.getStoredTheme();
16
+ return resolveColor(color, currentTheme);
17
+ }
18
+ /**
19
+ * Applies opacity to a theme-aware color and returns an rgba string.
20
+ * @param color - The theme-aware color object
21
+ * @param opacity - The opacity value between 0 and 1
22
+ * @param theme - Optional theme to use. If not provided, uses current theme from ThemeManager
23
+ * @returns The color as an rgba string, or the resolved hex if opacity is 1
24
+ */
25
+ static applyOpacity(color, opacity, theme) {
26
+ const hexColor = this.resolveThemeColor(color, theme);
27
+ if (!hexColor || opacity >= 1)
28
+ return hexColor;
29
+ const sanitizedHex = hexColor.startsWith('#') ? hexColor.slice(1) : hexColor;
30
+ let r, g, b;
31
+ if (sanitizedHex.length === 3) {
32
+ r = parseInt(sanitizedHex[0] + sanitizedHex[0], 16);
33
+ g = parseInt(sanitizedHex[1] + sanitizedHex[1], 16);
34
+ b = parseInt(sanitizedHex[2] + sanitizedHex[2], 16);
35
+ }
36
+ else if (sanitizedHex.length === 6) {
37
+ r = parseInt(sanitizedHex.substring(0, 2), 16);
38
+ g = parseInt(sanitizedHex.substring(2, 4), 16);
39
+ b = parseInt(sanitizedHex.substring(4, 6), 16);
40
+ }
41
+ else {
42
+ return hexColor;
43
+ }
44
+ if (isNaN(r) || isNaN(g) || isNaN(b)) {
45
+ return hexColor;
46
+ }
47
+ return `rgba(${r}, ${g}, ${b}, ${opacity})`;
48
+ }
49
+ /**
50
+ * Determines the appropriate contrast color (black or white) based on the luminance of the given hex color.
51
+ * Uses the relative luminance formula: 0.299*R + 0.587*G + 0.114*B
52
+ * @param hexColor - The hex color string (with or without #)
53
+ * @returns '#000000' for light backgrounds, '#ffffff' for dark backgrounds
54
+ */
55
+ static getContrastColor(hexColor) {
56
+ const sanitizedHex = hexColor.startsWith('#') ? hexColor.slice(1) : hexColor;
57
+ let r, g, b;
58
+ if (sanitizedHex.length === 3) {
59
+ r = parseInt(sanitizedHex[0] + sanitizedHex[0], 16);
60
+ g = parseInt(sanitizedHex[1] + sanitizedHex[1], 16);
61
+ b = parseInt(sanitizedHex[2] + sanitizedHex[2], 16);
62
+ }
63
+ else if (sanitizedHex.length === 6) {
64
+ r = parseInt(sanitizedHex.substring(0, 2), 16);
65
+ g = parseInt(sanitizedHex.substring(2, 4), 16);
66
+ b = parseInt(sanitizedHex.substring(4, 6), 16);
67
+ }
68
+ else {
69
+ // Default to black for invalid colors
70
+ return '#000000';
71
+ }
72
+ if (isNaN(r) || isNaN(g) || isNaN(b)) {
73
+ return '#000000';
74
+ }
75
+ // Calculate relative luminance
76
+ const luminance = 0.299 * r + 0.587 * g + 0.114 * b;
77
+ // Use threshold of 150 (midpoint) for balanced contrast
78
+ return luminance > 150 ? '#000000' : '#ffffff';
79
+ }
80
+ /**
81
+ * Determines the appropriate text color for both light and dark themes based on the fill color.
82
+ * Returns default theme-appropriate colors if the fill is transparent.
83
+ * @param fillColor - The theme-aware fill color
84
+ * @returns A theme-aware color object with appropriate text colors for both themes
85
+ */
86
+ static determineTextColor(fillColor) {
87
+ // Check if fillColor is transparent for both themes
88
+ const isTransparentLight = fillColor.light === 'transparent';
89
+ const isTransparentDark = fillColor.dark === 'transparent';
90
+ if (isTransparentLight && isTransparentDark) {
91
+ // Return default theme-appropriate colors for transparent fills
92
+ return { light: '#000000', dark: '#ffffff' };
93
+ }
94
+ // Determine text color for each theme based on fill brightness
95
+ const lightThemeTextColor = isTransparentLight
96
+ ? '#000000'
97
+ : this.getContrastColor(fillColor.light);
98
+ const darkThemeTextColor = isTransparentDark
99
+ ? '#ffffff'
100
+ : this.getContrastColor(fillColor.dark);
101
+ return {
102
+ light: lightThemeTextColor,
103
+ dark: darkThemeTextColor,
104
+ };
105
+ }
106
+ }
@@ -0,0 +1,57 @@
1
+ import { KritzelIconRegistry } from '../classes/registries/icon-registry.class';
2
+ export class KritzelCursorHelper {
3
+ /**
4
+ * Returns the custom pointer cursor CSS value.
5
+ * This can be used instead of `cursor: pointer` for consistent styling.
6
+ */
7
+ static getPointerCursor() {
8
+ if (!this._pointerCursor) {
9
+ this._pointerCursor = this.getCursor({ iconName: 'pointer' });
10
+ }
11
+ return this._pointerCursor;
12
+ }
13
+ /**
14
+ * Returns a custom cursor CSS value with support for rotation.
15
+ * The icon is retrieved from the KritzelIconRegistry.
16
+ */
17
+ static getCursor(options) {
18
+ const iconName = options.iconName === 'default' ? 'mouse-pointer' : options.iconName;
19
+ const iconSvg = KritzelIconRegistry.get(iconName);
20
+ if (!iconSvg) {
21
+ console.warn(`Icon "${iconName}" not found in registry.`);
22
+ return 'auto';
23
+ }
24
+ const size = options.size || 24;
25
+ const rotation = options.rotation || 0;
26
+ const color = options.color || 'black';
27
+ // Default cursor (mouse-pointer) has hotspot at (4, 4), others at center
28
+ const hotspot = options.hotspot || (options.iconName === 'default' ? { x: 4, y: 4 } : { x: size / 2, y: size / 2 });
29
+ // Modify the SVG string to set size and color
30
+ // We replace width and height to match the requested size
31
+ // We replace currentColor with the requested color
32
+ let content = iconSvg
33
+ .replace(/width="\d+"/, `width="${size}"`)
34
+ .replace(/height="\d+"/, `height="${size}"`)
35
+ .replace(/currentColor/g, color);
36
+ // Create the SVG string
37
+ // We rotate around the center of the SVG canvas
38
+ const center = size / 2;
39
+ // We use a group to apply the rotation
40
+ const svg = `
41
+ <svg xmlns="http://www.w3.org/2000/svg" width="${size}" height="${size}" viewBox="0 0 ${size} ${size}">
42
+ <g transform="rotate(${rotation} ${center} ${center})">
43
+ ${content}
44
+ </g>
45
+ </svg>
46
+ `;
47
+ // Encode the SVG for use in a data URI
48
+ // We need to be careful with encoding to ensure it works across browsers
49
+ const encodedSvg = encodeURIComponent(svg.replace(/\s+/g, ' ').trim())
50
+ .replace(/'/g, '%27')
51
+ .replace(/"/g, '%22');
52
+ const dataUri = `data:image/svg+xml;charset=utf-8,${encodedSvg}`;
53
+ // Return the cursor style string
54
+ return `url('${dataUri}') ${hotspot.x} ${hotspot.y}, auto`;
55
+ }
56
+ }
57
+ KritzelCursorHelper._pointerCursor = null;
@@ -0,0 +1,28 @@
1
+ export class KritzelDevicesHelper {
2
+ static isTouchDevice() {
3
+ return window.matchMedia('(any-pointer: coarse)').matches;
4
+ }
5
+ static isAndroid() {
6
+ return /android/i.test(navigator.userAgent);
7
+ }
8
+ static isIOS() {
9
+ return /iPad|iPhone|iPod/.test(navigator.userAgent);
10
+ }
11
+ static detectOS() {
12
+ if (this.isIOS()) {
13
+ return 'iOS';
14
+ }
15
+ else if (this.isAndroid()) {
16
+ return 'Android';
17
+ }
18
+ else {
19
+ return 'Other';
20
+ }
21
+ }
22
+ static isMobile() {
23
+ return this.isIOS() || this.isAndroid();
24
+ }
25
+ static isFirefox() {
26
+ return /firefox/i.test(navigator.userAgent);
27
+ }
28
+ }
@@ -0,0 +1,58 @@
1
+ import { KritzelMouseButton } from '../enums/event-button.enum';
2
+ export class KritzelEventHelper {
3
+ static isRightClick(ev) {
4
+ return ev.button === KritzelMouseButton.Right;
5
+ }
6
+ static isLeftClick(ev) {
7
+ return ev.button === KritzelMouseButton.Left;
8
+ }
9
+ static isPointerEventOnContextMenu(event) {
10
+ const path = event.composedPath();
11
+ const contextMenu = path.find(element => element.classList && element.classList.contains('context-menu'));
12
+ return !!contextMenu;
13
+ }
14
+ static onLongPress(event, onSuccess, onCancel) {
15
+ if (event.pointerType !== 'touch') {
16
+ onCancel === null || onCancel === void 0 ? void 0 : onCancel();
17
+ return () => { };
18
+ }
19
+ const startX = event.clientX;
20
+ const startY = event.clientY;
21
+ const target = event.target;
22
+ if (!target) {
23
+ onCancel === null || onCancel === void 0 ? void 0 : onCancel();
24
+ return () => { };
25
+ }
26
+ const longPressTimeout = 400;
27
+ const moveThreshold = 10;
28
+ const timer = setTimeout(() => {
29
+ removeListeners();
30
+ onSuccess(event);
31
+ }, longPressTimeout);
32
+ const cancel = () => {
33
+ clearTimeout(timer);
34
+ removeListeners();
35
+ onCancel === null || onCancel === void 0 ? void 0 : onCancel();
36
+ };
37
+ const onPointerMove = (e) => {
38
+ if (Math.abs(e.clientX - startX) > moveThreshold || Math.abs(e.clientY - startY) > moveThreshold) {
39
+ cancel();
40
+ }
41
+ };
42
+ const onPointerUp = () => {
43
+ cancel();
44
+ };
45
+ const onPointerCancel = () => {
46
+ cancel();
47
+ };
48
+ const removeListeners = () => {
49
+ target.removeEventListener('pointermove', onPointerMove);
50
+ target.removeEventListener('pointerup', onPointerUp);
51
+ target.removeEventListener('pointercancel', onPointerCancel);
52
+ };
53
+ target.addEventListener('pointermove', onPointerMove, { passive: true });
54
+ target.addEventListener('pointerup', onPointerUp, { once: true });
55
+ target.addEventListener('pointercancel', onPointerCancel, { once: true });
56
+ return cancel;
57
+ }
58
+ }