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.
- package/dist/kritzel-react/lib/components/stencil-generated/components.js +122 -0
- package/dist/kritzel-react/lib/index.js +2 -0
- package/dist/kritzel-stencil/src/classes/core/core.class.js +797 -0
- package/dist/kritzel-stencil/src/classes/core/reviver.class.js +97 -0
- package/dist/kritzel-stencil/src/classes/core/store.class.js +153 -0
- package/dist/kritzel-stencil/src/classes/core/viewport.class.js +311 -0
- package/dist/kritzel-stencil/src/classes/core/workspace.class.js +34 -0
- package/dist/kritzel-stencil/src/classes/handlers/base.handler.js +6 -0
- package/dist/kritzel-stencil/src/classes/handlers/context-menu.handler.js +63 -0
- package/dist/kritzel-stencil/src/classes/handlers/hover.handler.js +18 -0
- package/dist/kritzel-stencil/src/classes/handlers/key.handler.js +76 -0
- package/dist/kritzel-stencil/src/classes/handlers/line-handle.handler.js +382 -0
- package/dist/kritzel-stencil/src/classes/handlers/move.handler.js +213 -0
- package/dist/kritzel-stencil/src/classes/handlers/resize.handler.js +205 -0
- package/dist/kritzel-stencil/src/classes/handlers/rotation.handler.js +117 -0
- package/dist/kritzel-stencil/src/classes/handlers/selection.handler.js +313 -0
- package/dist/kritzel-stencil/src/classes/managers/anchor.manager.js +1056 -0
- package/dist/kritzel-stencil/src/classes/managers/cursor.manager.js +117 -0
- package/dist/kritzel-stencil/src/classes/managers/theme.manager.js +103 -0
- package/dist/kritzel-stencil/src/classes/objects/base-object.class.js +249 -0
- package/dist/kritzel-stencil/src/classes/objects/custom-element.class.js +60 -0
- package/dist/kritzel-stencil/src/classes/objects/group.class.js +407 -0
- package/dist/kritzel-stencil/src/classes/objects/image.class.js +55 -0
- package/dist/kritzel-stencil/src/classes/objects/line.class.js +608 -0
- package/dist/kritzel-stencil/src/classes/objects/path.class.js +401 -0
- package/dist/kritzel-stencil/src/classes/objects/selection-box.class.js +21 -0
- package/dist/kritzel-stencil/src/classes/objects/selection-group.class.js +409 -0
- package/dist/kritzel-stencil/src/classes/objects/shape.class.js +412 -0
- package/dist/kritzel-stencil/src/classes/objects/text.class.js +292 -0
- package/dist/kritzel-stencil/src/classes/providers/broadcast-sync-provider.class.js +101 -0
- package/dist/kritzel-stencil/src/classes/providers/hocuspocus-sync-provider.class.js +241 -0
- package/dist/kritzel-stencil/src/classes/providers/indexeddb-sync-provider.class.js +43 -0
- package/dist/kritzel-stencil/src/classes/providers/websocket-sync-provider.class.js +98 -0
- package/dist/kritzel-stencil/src/classes/registries/icon-registry.class.js +66 -0
- package/dist/kritzel-stencil/src/classes/registries/tool.registry.js +21 -0
- package/dist/kritzel-stencil/src/classes/structures/app-state-map.structure.js +212 -0
- package/dist/kritzel-stencil/src/classes/structures/object-map.structure.js +414 -0
- package/dist/kritzel-stencil/src/classes/structures/quadtree.structure.js +151 -0
- package/dist/kritzel-stencil/src/classes/tools/base-tool.class.js +36 -0
- package/dist/kritzel-stencil/src/classes/tools/brush-tool.class.js +161 -0
- package/dist/kritzel-stencil/src/classes/tools/eraser-tool.class.js +85 -0
- package/dist/kritzel-stencil/src/classes/tools/image-tool.class.js +83 -0
- package/dist/kritzel-stencil/src/classes/tools/line-tool.class.js +187 -0
- package/dist/kritzel-stencil/src/classes/tools/selection-tool.class.js +429 -0
- package/dist/kritzel-stencil/src/classes/tools/shape-tool.class.js +196 -0
- package/dist/kritzel-stencil/src/classes/tools/text-tool.class.js +100 -0
- package/dist/kritzel-stencil/src/components/core/kritzel-engine/kritzel-engine.js +1343 -0
- package/dist/kritzel-stencil/src/components/shared/kritzel-brush-style/kritzel-brush-style.js +46 -0
- package/dist/kritzel-stencil/src/components/shared/kritzel-dropdown/kritzel-dropdown.js +312 -0
- package/dist/kritzel-stencil/src/components/shared/kritzel-font-family/kritzel-font-family.js +60 -0
- package/dist/kritzel-stencil/src/components/shared/kritzel-line-endings/kritzel-line-endings.js +105 -0
- package/dist/kritzel-stencil/src/components/shared/kritzel-shape-fill/kritzel-shape-fill.js +53 -0
- package/dist/kritzel-stencil/src/components/ui/kritzel-context-menu/kritzel-context-menu.js +137 -0
- package/dist/kritzel-stencil/src/configs/default-brush-tool.config.js +9 -0
- package/dist/kritzel-stencil/src/configs/default-engine-config.js +63 -0
- package/dist/kritzel-stencil/src/configs/default-line-tool.config.js +9 -0
- package/dist/kritzel-stencil/src/configs/default-sync.config.js +9 -0
- package/dist/kritzel-stencil/src/configs/default-text-tool.config.js +7 -0
- package/dist/kritzel-stencil/src/constants/color-palette.constants.js +37 -0
- package/dist/kritzel-stencil/src/constants/engine.constants.js +2 -0
- package/dist/kritzel-stencil/src/enums/event-button.enum.js +6 -0
- package/dist/kritzel-stencil/src/enums/handle-type.enum.js +7 -0
- package/dist/kritzel-stencil/src/enums/shape-type.enum.js +6 -0
- package/dist/kritzel-stencil/src/helpers/class.helper.js +5 -0
- package/dist/kritzel-stencil/src/helpers/color.helper.js +106 -0
- package/dist/kritzel-stencil/src/helpers/cursor.helper.js +57 -0
- package/dist/kritzel-stencil/src/helpers/devices.helper.js +28 -0
- package/dist/kritzel-stencil/src/helpers/event.helper.js +58 -0
- package/dist/kritzel-stencil/src/helpers/geometry.helper.js +149 -0
- package/dist/kritzel-stencil/src/helpers/keyboard.helper.js +51 -0
- package/dist/kritzel-stencil/src/helpers/math.helper.js +5 -0
- package/dist/kritzel-stencil/src/helpers/object.helper.js +11 -0
- package/dist/kritzel-stencil/src/helpers/theme.helper.js +69 -0
- package/dist/kritzel-stencil/src/index.js +41 -0
- package/dist/kritzel-stencil/src/interfaces/anchor.interface.js +1 -0
- package/dist/kritzel-stencil/src/interfaces/arrow-head.interface.js +1 -0
- package/dist/kritzel-stencil/src/interfaces/bounding-box.interface.js +1 -0
- package/dist/kritzel-stencil/src/interfaces/clonable.interface.js +1 -0
- package/dist/kritzel-stencil/src/interfaces/context-menu-item.interface.js +1 -0
- package/dist/kritzel-stencil/src/interfaces/debug-info.interface.js +1 -0
- package/dist/kritzel-stencil/src/interfaces/dialog.interface.js +1 -0
- package/dist/kritzel-stencil/src/interfaces/displayable-shortcut.interface.js +1 -0
- package/dist/kritzel-stencil/src/interfaces/engine-state.interface.js +1 -0
- package/dist/kritzel-stencil/src/interfaces/line-options.interface.js +1 -0
- package/dist/kritzel-stencil/src/interfaces/master-detail.interface.js +1 -0
- package/dist/kritzel-stencil/src/interfaces/menu-item.interface.js +1 -0
- package/dist/kritzel-stencil/src/interfaces/object.interface.js +1 -0
- package/dist/kritzel-stencil/src/interfaces/path-options.interface.js +1 -0
- package/dist/kritzel-stencil/src/interfaces/point.interface.js +1 -0
- package/dist/kritzel-stencil/src/interfaces/polygon.interface.js +1 -0
- package/dist/kritzel-stencil/src/interfaces/serializable.interface.js +1 -0
- package/dist/kritzel-stencil/src/interfaces/settings.interface.js +1 -0
- package/dist/kritzel-stencil/src/interfaces/shortcut.interface.js +1 -0
- package/dist/kritzel-stencil/src/interfaces/sync-config.interface.js +1 -0
- package/dist/kritzel-stencil/src/interfaces/sync-provider.interface.js +1 -0
- package/dist/kritzel-stencil/src/interfaces/theme.interface.js +1 -0
- package/dist/kritzel-stencil/src/interfaces/tool-config.interface.js +1 -0
- package/dist/kritzel-stencil/src/interfaces/tool.interface.js +1 -0
- package/dist/kritzel-stencil/src/interfaces/toolbar-control.interface.js +1 -0
- package/dist/kritzel-stencil/src/interfaces/undo-state.interface.js +1 -0
- package/dist/kritzel-stencil/src/themes/dark-theme.js +198 -0
- package/dist/kritzel-stencil/src/themes/light-theme.js +199 -0
- package/dist/kritzel-stencil/src/types/shortcut.type.js +1 -0
- package/dist/kritzel-stencil/src/types/state.types.js +1 -0
- package/dist/types/kritzel-react/lib/components/stencil-generated/components.d.ts +74 -0
- package/dist/types/kritzel-react/lib/index.d.ts +2 -0
- package/dist/types/kritzel-stencil/src/classes/core/core.class.d.ts +101 -0
- package/dist/types/kritzel-stencil/src/classes/core/reviver.class.d.ts +6 -0
- package/dist/types/kritzel-stencil/src/classes/core/store.class.d.ts +53 -0
- package/dist/types/kritzel-stencil/src/classes/core/viewport.class.d.ts +48 -0
- package/dist/types/kritzel-stencil/src/classes/core/workspace.class.d.ts +24 -0
- package/dist/types/kritzel-stencil/src/classes/handlers/base.handler.d.ts +5 -0
- package/dist/types/kritzel-stencil/src/classes/handlers/context-menu.handler.d.ts +8 -0
- package/dist/types/kritzel-stencil/src/classes/handlers/hover.handler.d.ts +6 -0
- package/dist/types/kritzel-stencil/src/classes/handlers/key.handler.d.ts +11 -0
- package/dist/types/kritzel-stencil/src/classes/handlers/line-handle.handler.d.ts +34 -0
- package/dist/types/kritzel-stencil/src/classes/handlers/move.handler.d.ts +29 -0
- package/dist/types/kritzel-stencil/src/classes/handlers/resize.handler.d.ts +24 -0
- package/dist/types/kritzel-stencil/src/classes/handlers/rotation.handler.d.ts +12 -0
- package/dist/types/kritzel-stencil/src/classes/handlers/selection.handler.d.ts +27 -0
- package/dist/types/kritzel-stencil/src/classes/managers/anchor.manager.d.ts +180 -0
- package/dist/types/kritzel-stencil/src/classes/managers/cursor.manager.d.ts +43 -0
- package/dist/types/kritzel-stencil/src/classes/managers/theme.manager.d.ts +56 -0
- package/dist/types/kritzel-stencil/src/classes/objects/base-object.class.d.ts +76 -0
- package/dist/types/kritzel-stencil/src/classes/objects/custom-element.class.d.ts +26 -0
- package/dist/types/kritzel-stencil/src/classes/objects/group.class.d.ts +97 -0
- package/dist/types/kritzel-stencil/src/classes/objects/image.class.d.ts +17 -0
- package/dist/types/kritzel-stencil/src/classes/objects/line.class.d.ts +101 -0
- package/dist/types/kritzel-stencil/src/classes/objects/path.class.d.ts +62 -0
- package/dist/types/kritzel-stencil/src/classes/objects/selection-box.class.d.ts +6 -0
- package/dist/types/kritzel-stencil/src/classes/objects/selection-group.class.d.ts +67 -0
- package/dist/types/kritzel-stencil/src/classes/objects/shape.class.d.ts +124 -0
- package/dist/types/kritzel-stencil/src/classes/objects/text.class.d.ts +56 -0
- package/dist/types/kritzel-stencil/src/classes/providers/broadcast-sync-provider.class.d.ts +18 -0
- package/dist/types/kritzel-stencil/src/classes/providers/hocuspocus-sync-provider.class.d.ts +120 -0
- package/dist/types/kritzel-stencil/src/classes/providers/indexeddb-sync-provider.class.d.ts +22 -0
- package/dist/types/kritzel-stencil/src/classes/providers/websocket-sync-provider.class.d.ts +52 -0
- package/dist/types/kritzel-stencil/src/classes/registries/icon-registry.class.d.ts +9 -0
- package/dist/types/kritzel-stencil/src/classes/registries/tool.registry.d.ts +8 -0
- package/dist/types/kritzel-stencil/src/classes/structures/app-state-map.structure.d.ts +31 -0
- package/dist/types/kritzel-stencil/src/classes/structures/object-map.structure.d.ts +63 -0
- package/dist/types/kritzel-stencil/src/classes/structures/quadtree.structure.d.ts +36 -0
- package/dist/types/kritzel-stencil/src/classes/tools/base-tool.class.d.ts +20 -0
- package/dist/types/kritzel-stencil/src/classes/tools/brush-tool.class.d.ts +14 -0
- package/dist/types/kritzel-stencil/src/classes/tools/eraser-tool.class.d.ts +9 -0
- package/dist/types/kritzel-stencil/src/classes/tools/image-tool.class.d.ts +15 -0
- package/dist/types/kritzel-stencil/src/classes/tools/line-tool.class.d.ts +19 -0
- package/dist/types/kritzel-stencil/src/classes/tools/selection-tool.class.d.ts +54 -0
- package/dist/types/kritzel-stencil/src/classes/tools/shape-tool.class.d.ts +39 -0
- package/dist/types/kritzel-stencil/src/classes/tools/text-tool.class.d.ts +13 -0
- package/dist/types/kritzel-stencil/src/components/core/kritzel-engine/kritzel-engine.d.ts +111 -0
- package/dist/types/kritzel-stencil/src/components/shared/kritzel-brush-style/kritzel-brush-style.d.ts +11 -0
- package/dist/types/kritzel-stencil/src/components/shared/kritzel-dropdown/kritzel-dropdown.d.ts +46 -0
- package/dist/types/kritzel-stencil/src/components/shared/kritzel-font-family/kritzel-font-family.d.ts +13 -0
- package/dist/types/kritzel-stencil/src/components/shared/kritzel-line-endings/kritzel-line-endings.d.ts +21 -0
- package/dist/types/kritzel-stencil/src/components/shared/kritzel-shape-fill/kritzel-shape-fill.d.ts +10 -0
- package/dist/types/kritzel-stencil/src/components/ui/kritzel-context-menu/kritzel-context-menu.d.ts +21 -0
- package/dist/types/kritzel-stencil/src/configs/default-brush-tool.config.d.ts +2 -0
- package/dist/types/kritzel-stencil/src/configs/default-engine-config.d.ts +2 -0
- package/dist/types/kritzel-stencil/src/configs/default-line-tool.config.d.ts +2 -0
- package/dist/types/kritzel-stencil/src/configs/default-sync.config.d.ts +5 -0
- package/dist/types/kritzel-stencil/src/configs/default-text-tool.config.d.ts +2 -0
- package/dist/types/kritzel-stencil/src/constants/color-palette.constants.d.ts +29 -0
- package/dist/types/kritzel-stencil/src/constants/engine.constants.d.ts +2 -0
- package/dist/types/kritzel-stencil/src/enums/event-button.enum.d.ts +5 -0
- package/dist/types/kritzel-stencil/src/enums/handle-type.enum.d.ts +6 -0
- package/dist/types/kritzel-stencil/src/enums/shape-type.enum.d.ts +5 -0
- package/dist/types/kritzel-stencil/src/helpers/class.helper.d.ts +3 -0
- package/dist/types/kritzel-stencil/src/helpers/color.helper.d.ts +33 -0
- package/dist/types/kritzel-stencil/src/helpers/cursor.helper.d.ts +22 -0
- package/dist/types/kritzel-stencil/src/helpers/devices.helper.d.ts +8 -0
- package/dist/types/kritzel-stencil/src/helpers/event.helper.d.ts +6 -0
- package/dist/types/kritzel-stencil/src/helpers/geometry.helper.d.ts +38 -0
- package/dist/types/kritzel-stencil/src/helpers/keyboard.helper.d.ts +6 -0
- package/dist/types/kritzel-stencil/src/helpers/math.helper.d.ts +3 -0
- package/dist/types/kritzel-stencil/src/helpers/object.helper.d.ts +4 -0
- package/dist/types/kritzel-stencil/src/helpers/theme.helper.d.ts +41 -0
- package/dist/types/kritzel-stencil/src/index.d.ts +42 -0
- package/dist/types/kritzel-stencil/src/interfaces/anchor.interface.d.ts +137 -0
- package/dist/types/kritzel-stencil/src/interfaces/arrow-head.interface.d.ts +27 -0
- package/dist/types/kritzel-stencil/src/interfaces/bounding-box.interface.d.ts +8 -0
- package/dist/types/kritzel-stencil/src/interfaces/clonable.interface.d.ts +3 -0
- package/dist/types/kritzel-stencil/src/interfaces/context-menu-item.interface.d.ts +17 -0
- package/dist/types/kritzel-stencil/src/interfaces/debug-info.interface.d.ts +4 -0
- package/dist/types/kritzel-stencil/src/interfaces/dialog.interface.d.ts +4 -0
- package/dist/types/kritzel-stencil/src/interfaces/displayable-shortcut.interface.d.ts +5 -0
- package/dist/types/kritzel-stencil/src/interfaces/engine-state.interface.d.ts +73 -0
- package/dist/types/kritzel-stencil/src/interfaces/line-options.interface.d.ts +23 -0
- package/dist/types/kritzel-stencil/src/interfaces/master-detail.interface.d.ts +14 -0
- package/dist/types/kritzel-stencil/src/interfaces/menu-item.interface.d.ts +24 -0
- package/dist/types/kritzel-stencil/src/interfaces/object.interface.d.ts +53 -0
- package/dist/types/kritzel-stencil/src/interfaces/path-options.interface.d.ts +11 -0
- package/dist/types/kritzel-stencil/src/interfaces/point.interface.d.ts +4 -0
- package/dist/types/kritzel-stencil/src/interfaces/polygon.interface.d.ts +7 -0
- package/dist/types/kritzel-stencil/src/interfaces/serializable.interface.d.ts +5 -0
- package/dist/types/kritzel-stencil/src/interfaces/settings.interface.d.ts +11 -0
- package/dist/types/kritzel-stencil/src/interfaces/shortcut.interface.d.ts +10 -0
- package/dist/types/kritzel-stencil/src/interfaces/sync-config.interface.d.ts +22 -0
- package/dist/types/kritzel-stencil/src/interfaces/sync-provider.interface.d.ts +29 -0
- package/dist/types/kritzel-stencil/src/interfaces/theme.interface.d.ts +330 -0
- package/dist/types/kritzel-stencil/src/interfaces/tool-config.interface.d.ts +26 -0
- package/dist/types/kritzel-stencil/src/interfaces/tool.interface.d.ts +7 -0
- package/dist/types/kritzel-stencil/src/interfaces/toolbar-control.interface.d.ts +58 -0
- package/dist/types/kritzel-stencil/src/interfaces/undo-state.interface.d.ts +6 -0
- package/dist/types/kritzel-stencil/src/themes/dark-theme.d.ts +5 -0
- package/dist/types/kritzel-stencil/src/themes/light-theme.d.ts +5 -0
- package/dist/types/kritzel-stencil/src/types/shortcut.type.d.ts +1 -0
- package/dist/types/kritzel-stencil/src/types/state.types.d.ts +3 -0
- 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,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,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,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,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
|
+
}
|