canvas-can-do 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/README.md +101 -0
  2. package/dist/canvas-can-do.css +1 -0
  3. package/dist/types/PointerController.d.ts +47 -0
  4. package/dist/types/PointerController.d.ts.map +1 -0
  5. package/dist/types/core/history/HistoryManager.d.ts +45 -0
  6. package/dist/types/core/history/HistoryManager.d.ts.map +1 -0
  7. package/dist/types/core/layers/LayerHierarchy.d.ts +23 -0
  8. package/dist/types/core/layers/LayerHierarchy.d.ts.map +1 -0
  9. package/dist/types/core/math/Vec2.d.ts +6 -0
  10. package/dist/types/core/math/Vec2.d.ts.map +1 -0
  11. package/dist/types/core/nodes/BaseNode.d.ts +78 -0
  12. package/dist/types/core/nodes/BaseNode.d.ts.map +1 -0
  13. package/dist/types/core/nodes/CircleNode.d.ts +26 -0
  14. package/dist/types/core/nodes/CircleNode.d.ts.map +1 -0
  15. package/dist/types/core/nodes/EllipseNode.d.ts +26 -0
  16. package/dist/types/core/nodes/EllipseNode.d.ts.map +1 -0
  17. package/dist/types/core/nodes/GroupNode.d.ts +25 -0
  18. package/dist/types/core/nodes/GroupNode.d.ts.map +1 -0
  19. package/dist/types/core/nodes/ImageNode.d.ts +54 -0
  20. package/dist/types/core/nodes/ImageNode.d.ts.map +1 -0
  21. package/dist/types/core/nodes/LineNode.d.ts +34 -0
  22. package/dist/types/core/nodes/LineNode.d.ts.map +1 -0
  23. package/dist/types/core/nodes/RectangleNode.d.ts +29 -0
  24. package/dist/types/core/nodes/RectangleNode.d.ts.map +1 -0
  25. package/dist/types/core/nodes/StarNode.d.ts +31 -0
  26. package/dist/types/core/nodes/StarNode.d.ts.map +1 -0
  27. package/dist/types/core/nodes/TextNode.d.ts +27 -0
  28. package/dist/types/core/nodes/TextNode.d.ts.map +1 -0
  29. package/dist/types/core/nodes/index.d.ts +10 -0
  30. package/dist/types/core/nodes/index.d.ts.map +1 -0
  31. package/dist/types/core/nodes/preview/PreviewBase.d.ts +33 -0
  32. package/dist/types/core/nodes/preview/PreviewBase.d.ts.map +1 -0
  33. package/dist/types/core/nodes/preview/PreviewEllipse.d.ts +8 -0
  34. package/dist/types/core/nodes/preview/PreviewEllipse.d.ts.map +1 -0
  35. package/dist/types/core/nodes/preview/PreviewLine.d.ts +8 -0
  36. package/dist/types/core/nodes/preview/PreviewLine.d.ts.map +1 -0
  37. package/dist/types/core/nodes/preview/PreviewRect.d.ts +8 -0
  38. package/dist/types/core/nodes/preview/PreviewRect.d.ts.map +1 -0
  39. package/dist/types/core/nodes/preview/PreviewStar.d.ts +6 -0
  40. package/dist/types/core/nodes/preview/PreviewStar.d.ts.map +1 -0
  41. package/dist/types/core/nodes/preview/types.d.ts +5 -0
  42. package/dist/types/core/nodes/preview/types.d.ts.map +1 -0
  43. package/dist/types/core/selection/LineTransformController.d.ts +12 -0
  44. package/dist/types/core/selection/LineTransformController.d.ts.map +1 -0
  45. package/dist/types/core/selection/SelectionManager.d.ts +39 -0
  46. package/dist/types/core/selection/SelectionManager.d.ts.map +1 -0
  47. package/dist/types/core/selection/TransformController.d.ts +14 -0
  48. package/dist/types/core/selection/TransformController.d.ts.map +1 -0
  49. package/dist/types/core/ui/RulerOverlay.d.ts +18 -0
  50. package/dist/types/core/ui/RulerOverlay.d.ts.map +1 -0
  51. package/dist/types/demo/main.d.ts +2 -0
  52. package/dist/types/demo/main.d.ts.map +1 -0
  53. package/dist/types/events.d.ts +15 -0
  54. package/dist/types/events.d.ts.map +1 -0
  55. package/dist/types/index.d.ts +85 -0
  56. package/dist/types/index.d.ts.map +1 -0
  57. package/package.json +6 -5
  58. package/dist/ccd.css +0 -87
package/README.md ADDED
@@ -0,0 +1,101 @@
1
+ # Canvas Can Do
2
+
3
+ Transform-based vector graphics editor engine for the web (PixiJS).
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install canvas-can-do pixi.js
9
+ ```
10
+
11
+ ## Quick Start
12
+
13
+ ```ts
14
+ import { CCDApp } from 'canvas-can-do';
15
+
16
+ const app = new CCDApp();
17
+ await app.init(document.getElementById('editor')!);
18
+
19
+ app.useTool('select');
20
+ ```
21
+
22
+ ## Key Features
23
+
24
+ - Shapes: rectangle, ellipse, line, star, text, image
25
+ - Transform tools: move, resize, rotate, multi-select
26
+ - Shift to constrain resize ratio
27
+ - Undo/redo (Ctrl/Cmd+Z, Ctrl/Cmd+Shift+Z, Ctrl/Cmd+Y)
28
+ - Export: PNG/JPG/SVG (all objects or selection)
29
+ - Save/Load: JSON with embedded image data URLs
30
+ - Rulers with pan/zoom indicators
31
+
32
+ ## API Highlights
33
+
34
+ ```ts
35
+ // Tools
36
+ app.useTool('rectangle');
37
+
38
+ // Export raster (PNG/JPG)
39
+ const png = await app.exportRaster({ type: 'png', scope: 'all' });
40
+
41
+ // Export SVG (embed images)
42
+ const svg = await app.exportSVG({
43
+ scope: 'selection',
44
+ imageEmbed: 'display', // 'original' | 'display' | 'max'
45
+ imageMaxEdge: 2048,
46
+ });
47
+
48
+ // Save/Load JSON (embedded images)
49
+ const doc = await app.exportJSON();
50
+ if (doc) await app.importJSON(doc);
51
+
52
+ // Access Pixi Application
53
+ const pixiApp = app.getPixiApp();
54
+ ```
55
+
56
+ ## Export Options
57
+
58
+ ```ts
59
+ // Raster
60
+ exportRaster({
61
+ type: 'png' | 'jpg',
62
+ scope: 'all' | 'selection',
63
+ quality?: number, // for JPG
64
+ padding?: number, // extra pixels around bounds
65
+ background?: string, // e.g. '#ffffff'
66
+ });
67
+
68
+ // SVG
69
+ exportSVG({
70
+ scope: 'all' | 'selection',
71
+ padding?: number,
72
+ background?: string,
73
+ imageEmbed?: 'original' | 'display' | 'max',
74
+ imageMaxEdge?: number,
75
+ });
76
+ ```
77
+
78
+ ## Events
79
+
80
+ ```ts
81
+ editor.addEventListener('tool:changed', (e) => {
82
+ console.log(e.detail.tool);
83
+ });
84
+
85
+ editor.addEventListener('layer:changed', (e) => {
86
+ console.log(e.detail.hierarchy);
87
+ });
88
+
89
+ editor.addEventListener('viewport:changed', (e) => {
90
+ console.log(e.detail); // { x, y, zoom, source }
91
+ });
92
+ ```
93
+
94
+ ## Notes
95
+
96
+ - Image sources are stored as **data URLs** for portability.
97
+ - Importing JSON resets pan/zoom to defaults.
98
+
99
+ ## License
100
+
101
+ MIT
@@ -0,0 +1 @@
1
+ .ccd-host,.ccd-cursor-default{cursor:default}.ccd-cursor-crosshair{cursor:crosshair}.ccd-cursor-text{cursor:text}.ccd-cursor-move{cursor:move}.ccd-cursor-grab{cursor:grab}.ccd-cursor-grabbing{cursor:grabbing}.ccd-cursor-resize-n{cursor:n-resize}.ccd-cursor-resize-s{cursor:s-resize}.ccd-cursor-resize-e{cursor:e-resize}.ccd-cursor-resize-w{cursor:w-resize}.ccd-cursor-resize-nw{cursor:nw-resize}.ccd-cursor-resize-ne{cursor:ne-resize}.ccd-cursor-resize-sw{cursor:sw-resize}.ccd-cursor-resize-se{cursor:se-resize}.ccd-cursor-rotate{cursor:alias}.ccd-cursor-zoom-in{cursor:zoom-in}.ccd-cursor-zoom-out{cursor:zoom-out}.ccd-cursor-not-allowed{cursor:not-allowed}.ccd-cursor-precision{cursor:cell}
@@ -0,0 +1,47 @@
1
+ import { BaseNode } from './core/nodes/BaseNode';
2
+ import type { ToolName } from './index';
3
+ import { Container } from 'pixi.js';
4
+ import { Application } from 'pixi.js';
5
+ export declare class PointerController {
6
+ private preview;
7
+ private activeTool;
8
+ private previewLayer;
9
+ private objectLayer;
10
+ private selectionManager;
11
+ private clipboard;
12
+ private onLayerChanged;
13
+ private isPanning;
14
+ private lastPan?;
15
+ private app?;
16
+ private world?;
17
+ private eventTarget;
18
+ private activeTextInput?;
19
+ private onHistoryCapture?;
20
+ constructor(previewLayer: Container, objectLayer: Container, toolsLayer: Container, onLayerChanged: () => void, app?: Application, world?: Container, onHistoryCapture?: () => void | Promise<void>);
21
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
22
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions): void;
23
+ dispatchEvent(event: Event): boolean;
24
+ clearSelection(): void;
25
+ getSelectedNodes(): BaseNode[];
26
+ getSelectionBounds(): {
27
+ x: number;
28
+ y: number;
29
+ width: number;
30
+ height: number;
31
+ } | null;
32
+ handleKeyDown(e: KeyboardEvent): void;
33
+ private cloneNode;
34
+ handleKeyUp(e: KeyboardEvent): void;
35
+ setTool(tool: ToolName): void;
36
+ onPointerDown(e: PointerEvent): void;
37
+ onDoubleClick(e: MouseEvent): void;
38
+ onPointerMove(e: PointerEvent): void;
39
+ onPointerUp(e: PointerEvent): void;
40
+ cancel(): void;
41
+ private setCursor;
42
+ private toGlobalPoint;
43
+ private toWorldPoint;
44
+ private findHitObject;
45
+ private beginTextEdit;
46
+ }
47
+ //# sourceMappingURL=PointerController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PointerController.d.ts","sourceRoot":"","sources":["../../src/PointerController.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACxC,OAAO,EAAE,SAAS,EAAS,MAAM,SAAS,CAAC;AAM3C,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,UAAU,CAAsB;IAGxC,OAAO,CAAC,YAAY,CAAY;IAGhC,OAAO,CAAC,WAAW,CAAY;IAE/B,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,cAAc,CAAa;IACnC,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAC,CAAQ;IACxB,OAAO,CAAC,GAAG,CAAC,CAAc;IAC1B,OAAO,CAAC,KAAK,CAAC,CAAY;IAC1B,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,eAAe,CAAC,CAAmB;IAC3C,OAAO,CAAC,gBAAgB,CAAC,CAA6B;gBAGpD,YAAY,EAAE,SAAS,EACvB,WAAW,EAAE,SAAS,EACtB,UAAU,EAAE,SAAS,EACrB,cAAc,EAAE,MAAM,IAAI,EAC1B,GAAG,CAAC,EAAE,WAAW,EACjB,KAAK,CAAC,EAAE,SAAS,EACjB,gBAAgB,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAc/C,gBAAgB,CACd,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,kCAAkC,EAC5C,OAAO,CAAC,EAAE,OAAO,GAAG,uBAAuB;IAK7C,mBAAmB,CACjB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,kCAAkC,EAC5C,OAAO,CAAC,EAAE,OAAO,GAAG,oBAAoB;IAK1C,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAIpC,cAAc;IAId,gBAAgB;IAIhB,kBAAkB;;;;;;IAKlB,aAAa,CAAC,CAAC,EAAE,aAAa;IAyH9B,OAAO,CAAC,SAAS;IAQjB,WAAW,CAAC,CAAC,EAAE,aAAa;IAoB5B,OAAO,CAAC,IAAI,EAAE,QAAQ;IA0BtB,aAAa,CAAC,CAAC,EAAE,YAAY;IAsC7B,aAAa,CAAC,CAAC,EAAE,UAAU;IAW3B,aAAa,CAAC,CAAC,EAAE,YAAY;IA2D7B,WAAW,CAAC,CAAC,EAAE,YAAY;IAoI3B,MAAM;IAQN,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,aAAa;IAOrB,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,aAAa;IAsCrB,OAAO,CAAC,aAAa;CAqEtB"}
@@ -0,0 +1,45 @@
1
+ import type { Container } from 'pixi.js';
2
+ import { BaseNode } from '../nodes/BaseNode';
3
+ import type { Style } from '../nodes/BaseNode';
4
+ export type SerializedNode = {
5
+ id: string;
6
+ type: BaseNode['type'];
7
+ name: string;
8
+ visible: boolean;
9
+ locked: boolean;
10
+ x: number;
11
+ y: number;
12
+ rotation: number;
13
+ scale: {
14
+ x: number;
15
+ y: number;
16
+ };
17
+ style: Style;
18
+ width?: number;
19
+ height?: number;
20
+ data?: Record<string, any>;
21
+ children?: SerializedNode[];
22
+ };
23
+ export type SceneDocument = {
24
+ version: 1;
25
+ nodes: SerializedNode[];
26
+ };
27
+ export declare class HistoryManager {
28
+ private undoStack;
29
+ private redoStack;
30
+ private lastSnapshotKey;
31
+ private objectLayer;
32
+ constructor(objectLayer: Container);
33
+ capture(): Promise<void>;
34
+ undo(): Promise<void>;
35
+ redo(): Promise<void>;
36
+ private serializeScene;
37
+ exportDocument(): Promise<SceneDocument>;
38
+ importDocument(doc: SceneDocument): Promise<void>;
39
+ hasContent(): boolean;
40
+ clearDocument(): Promise<void>;
41
+ private serializeNode;
42
+ private restore;
43
+ private deserializeNode;
44
+ }
45
+ //# sourceMappingURL=HistoryManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HistoryManager.d.ts","sourceRoot":"","sources":["../../../../src/core/history/HistoryManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAU/C,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChC,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;CAC7B,CAAC;AAMF,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,CAAC,CAAC;IACX,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB,CAAC;AAEF,qBAAa,cAAc;IACzB,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,eAAe,CAAM;IAE7B,OAAO,CAAC,WAAW,CAAY;gBAEnB,WAAW,EAAE,SAAS;IAI5B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IASxB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQrB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAQb,cAAc;IAOtB,cAAc,IAAI,OAAO,CAAC,aAAa,CAAC;IAKxC,cAAc,CAAC,GAAG,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IAWvD,UAAU,IAAI,OAAO;IAIf,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAQpC,OAAO,CAAC,aAAa;YAyEP,OAAO;YAUP,eAAe;CAoI9B"}
@@ -0,0 +1,23 @@
1
+ import { Container } from 'pixi.js';
2
+ export interface LayerNode {
3
+ id: string;
4
+ type: string;
5
+ name: string;
6
+ visible: boolean;
7
+ locked: boolean;
8
+ children?: LayerNode[];
9
+ }
10
+ export declare class LayerHierarchy {
11
+ private static generateLayerName;
12
+ static getHierarchy(container: Container): LayerNode;
13
+ }
14
+ export type LayerHierarchyChangedEvent = CustomEvent<{
15
+ hierarchy: LayerNode;
16
+ selectedIds?: string[];
17
+ }>;
18
+ declare global {
19
+ interface WindowEventMap {
20
+ 'layer:changed': LayerHierarchyChangedEvent;
21
+ }
22
+ }
23
+ //# sourceMappingURL=LayerHierarchy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LayerHierarchy.d.ts","sourceRoot":"","sources":["../../../../src/core/layers/LayerHierarchy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAIpC,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC;CACxB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAahC,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,SAAS,GAAG,SAAS;CAsCrD;AAGD,MAAM,MAAM,0BAA0B,GAAG,WAAW,CAAC;IACnD,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB,CAAC,CAAC;AAEH,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,cAAc;QACtB,eAAe,EAAE,0BAA0B,CAAC;KAC7C;CACF"}
@@ -0,0 +1,6 @@
1
+ export interface Vec2 {
2
+ x: number;
3
+ y: number;
4
+ }
5
+ export declare function vec2(x?: number, y?: number): Vec2;
6
+ //# sourceMappingURL=Vec2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Vec2.d.ts","sourceRoot":"","sources":["../../../../src/core/math/Vec2.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,IAAI;IACnB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX;AAED,wBAAgB,IAAI,CAAC,CAAC,SAAI,EAAE,CAAC,SAAI,GAAG,IAAI,CAEvC"}
@@ -0,0 +1,78 @@
1
+ import { Container } from 'pixi.js';
2
+ import type { TextStyleFontWeight } from 'pixi.js';
3
+ export type NodeType = 'rectangle' | 'circle' | 'text' | 'line' | 'ellipse' | 'star' | 'image' | 'group';
4
+ export type PropertyType = 'string' | 'int' | 'float' | 'color' | 'boolean';
5
+ export interface NodePropertyDescriptor {
6
+ name: string;
7
+ key: string;
8
+ type: PropertyType;
9
+ value: string | number | boolean | null;
10
+ desc?: string;
11
+ min?: number;
12
+ max?: number;
13
+ step?: number;
14
+ }
15
+ export interface InspectableNode {
16
+ id: string;
17
+ type: NodeType;
18
+ name: string;
19
+ props: NodePropertyDescriptor[];
20
+ }
21
+ export type PropertiesChangedEvent = CustomEvent<{
22
+ nodes: InspectableNode[];
23
+ }>;
24
+ export interface Style {
25
+ fill?: string;
26
+ stroke?: string;
27
+ strokeWidth?: number;
28
+ opacity?: number;
29
+ fontSize?: number;
30
+ fontFamily?: string;
31
+ fontWeight?: TextStyleFontWeight;
32
+ fontStyle?: 'normal' | 'italic' | 'oblique';
33
+ }
34
+ export declare class BaseNode extends Container {
35
+ readonly id: string;
36
+ readonly type: NodeType;
37
+ name: string;
38
+ style: Style;
39
+ locked: boolean;
40
+ protected _width: number;
41
+ protected _height: number;
42
+ constructor(options: {
43
+ id?: string;
44
+ type: NodeType;
45
+ name?: string;
46
+ x?: number;
47
+ y?: number;
48
+ rotation?: number;
49
+ scale?: number | {
50
+ x: number;
51
+ y: number;
52
+ };
53
+ style?: Style;
54
+ visible?: boolean;
55
+ locked?: boolean;
56
+ });
57
+ protected defaultNameForType(type: NodeType): string;
58
+ get width(): number;
59
+ set width(value: number);
60
+ get height(): number;
61
+ set height(value: number);
62
+ setPosition(x: number, y: number): this;
63
+ setScale(sx: number, sy?: number): this;
64
+ setRotation(rad: number): this;
65
+ setPivot(x: number, y: number): this;
66
+ translate(x: number, y: number): this;
67
+ resetTransform(): this;
68
+ clone(_offsetX?: number, _offsetY?: number): BaseNode;
69
+ protected toColorString(color: string | number | undefined): string | null;
70
+ getProps(): NodePropertyDescriptor[];
71
+ getInspectable(): InspectableNode;
72
+ }
73
+ declare global {
74
+ interface WindowEventMap {
75
+ 'properties:changed': PropertiesChangedEvent;
76
+ }
77
+ }
78
+ //# sourceMappingURL=BaseNode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseNode.d.ts","sourceRoot":"","sources":["../../../../src/core/nodes/BaseNode.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ import { Graphics } from 'pixi.js';
2
+ import { BaseNode } from './BaseNode';
3
+ import type { Style, NodePropertyDescriptor } from './BaseNode';
4
+ export declare class CircleNode extends BaseNode {
5
+ readonly type: "circle";
6
+ radius: number;
7
+ protected graphics: Graphics;
8
+ constructor(options: {
9
+ id?: string;
10
+ radius: number;
11
+ x?: number;
12
+ y?: number;
13
+ rotation?: number;
14
+ scale?: number | {
15
+ x: number;
16
+ y: number;
17
+ };
18
+ style?: Style;
19
+ visible?: boolean;
20
+ locked?: boolean;
21
+ });
22
+ protected redraw(): void;
23
+ setStyle(style: Partial<Style>): this;
24
+ getProps(): NodePropertyDescriptor[];
25
+ }
26
+ //# sourceMappingURL=CircleNode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CircleNode.d.ts","sourceRoot":"","sources":["../../../../src/core/nodes/CircleNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEhE,qBAAa,UAAW,SAAQ,QAAQ;IACtC,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC;gBAEjB,OAAO,EAAE;QACnB,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,CAAC,CAAC,EAAE,MAAM,CAAC;QACX,CAAC,CAAC,EAAE,MAAM,CAAC;QACX,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,GAAG;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAC1C,KAAK,CAAC,EAAE,KAAK,CAAC;QACd,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB;IAuBD,SAAS,CAAC,MAAM,IAAI,IAAI;IA8BxB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI;IAMrC,QAAQ,IAAI,sBAAsB,EAAE;CAarC"}
@@ -0,0 +1,26 @@
1
+ import { Graphics } from 'pixi.js';
2
+ import { BaseNode } from './BaseNode';
3
+ import type { Style } from './BaseNode';
4
+ export declare class EllipseNode extends BaseNode {
5
+ readonly type: "ellipse";
6
+ protected graphics: Graphics;
7
+ constructor(options: {
8
+ id?: string;
9
+ width: number;
10
+ height: number;
11
+ x?: number;
12
+ y?: number;
13
+ rotation?: number;
14
+ scale?: number | {
15
+ x: number;
16
+ y: number;
17
+ };
18
+ style?: Style;
19
+ visible?: boolean;
20
+ locked?: boolean;
21
+ });
22
+ protected redraw(): void;
23
+ setStyle(style: Partial<Style>): this;
24
+ clone(offsetX?: number, offsetY?: number): EllipseNode;
25
+ }
26
+ //# sourceMappingURL=EllipseNode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EllipseNode.d.ts","sourceRoot":"","sources":["../../../../src/core/nodes/EllipseNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,qBAAa,WAAY,SAAQ,QAAQ;IACvC,QAAQ,CAAC,IAAI,EAAG,SAAS,CAAU;IACnC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC;gBAEjB,OAAO,EAAE;QACnB,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,CAAC,CAAC,EAAE,MAAM,CAAC;QACX,CAAC,CAAC,EAAE,MAAM,CAAC;QACX,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,GAAG;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAC1C,KAAK,CAAC,EAAE,KAAK,CAAC;QACd,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB;IAsBD,SAAS,CAAC,MAAM,IAAI,IAAI;IA8BxB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI;IAMrC,KAAK,CAAC,OAAO,SAAI,EAAE,OAAO,SAAI,GAAG,WAAW;CAa7C"}
@@ -0,0 +1,25 @@
1
+ import { BaseNode } from './BaseNode';
2
+ import type { Style } from './BaseNode';
3
+ export declare class GroupNode extends BaseNode {
4
+ readonly type: "group";
5
+ constructor(options: {
6
+ id?: string;
7
+ children: BaseNode[];
8
+ x?: number;
9
+ y?: number;
10
+ rotation?: number;
11
+ scale?: number | {
12
+ x: number;
13
+ y: number;
14
+ };
15
+ style?: Style;
16
+ visible?: boolean;
17
+ locked?: boolean;
18
+ });
19
+ get width(): number;
20
+ get height(): number;
21
+ set width(value: number);
22
+ set height(value: number);
23
+ clone(offsetX?: number, offsetY?: number): GroupNode;
24
+ }
25
+ //# sourceMappingURL=GroupNode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GroupNode.d.ts","sourceRoot":"","sources":["../../../../src/core/nodes/GroupNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC,qBAAa,SAAU,SAAQ,QAAQ;IACrC,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;gBAErB,OAAO,EAAE;QACnB,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,QAAQ,EAAE,CAAC;QACrB,CAAC,CAAC,EAAE,MAAM,CAAC;QACX,CAAC,CAAC,EAAE,MAAM,CAAC;QACX,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,GAAG;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAC1C,KAAK,CAAC,EAAE,KAAK,CAAC;QACd,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB;IAyBD,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAGD,IAAI,KAAK,CAAC,KAAK,EAAE,MAAM,EAItB;IAED,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,EAIvB;IAED,KAAK,CAAC,OAAO,SAAI,EAAE,OAAO,SAAI,GAAG,SAAS;CAgB3C"}
@@ -0,0 +1,54 @@
1
+ import { Sprite, Texture } from 'pixi.js';
2
+ import { BaseNode } from './BaseNode';
3
+ import type { Style, NodePropertyDescriptor } from './BaseNode';
4
+ export type ImageSource = string | File | Blob;
5
+ export declare class ImageNode extends BaseNode {
6
+ readonly type: "image";
7
+ protected sprite: Sprite;
8
+ source?: ImageSource;
9
+ constructor(options: {
10
+ id?: string;
11
+ texture: Texture;
12
+ source?: ImageSource;
13
+ width?: number;
14
+ height?: number;
15
+ x?: number;
16
+ y?: number;
17
+ rotation?: number;
18
+ scale?: number | {
19
+ x: number;
20
+ y: number;
21
+ };
22
+ style?: Style;
23
+ visible?: boolean;
24
+ locked?: boolean;
25
+ });
26
+ static fromSource(options: {
27
+ source: ImageSource;
28
+ x?: number;
29
+ y?: number;
30
+ width?: number;
31
+ height?: number;
32
+ rotation?: number;
33
+ scale?: number | {
34
+ x: number;
35
+ y: number;
36
+ };
37
+ style?: Style;
38
+ visible?: boolean;
39
+ locked?: boolean;
40
+ }): Promise<ImageNode>;
41
+ private static prepareSource;
42
+ private static toDataUrl;
43
+ private static blobToDataUrl;
44
+ private static loadImage;
45
+ protected redraw(): void;
46
+ get width(): number;
47
+ set width(value: number);
48
+ get height(): number;
49
+ set height(value: number);
50
+ setStyle(style: Partial<Style>): this;
51
+ getProps(): NodePropertyDescriptor[];
52
+ clone(offsetX?: number, offsetY?: number): ImageNode;
53
+ }
54
+ //# sourceMappingURL=ImageNode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageNode.d.ts","sourceRoot":"","sources":["../../../../src/core/nodes/ImageNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEhE,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;AAE/C,qBAAa,SAAU,SAAQ,QAAQ;IACrC,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;IACjC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;IACzB,MAAM,CAAC,EAAE,WAAW,CAAC;gBAET,OAAO,EAAE;QACnB,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,OAAO,EAAE,OAAO,CAAC;QACjB,MAAM,CAAC,EAAE,WAAW,CAAC;QACrB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,CAAC,CAAC,EAAE,MAAM,CAAC;QACX,CAAC,CAAC,EAAE,MAAM,CAAC;QACX,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,GAAG;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAC1C,KAAK,CAAC,EAAE,KAAK,CAAC;QACd,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB;WA6BY,UAAU,CAAC,OAAO,EAAE;QAC/B,MAAM,EAAE,WAAW,CAAC;QACpB,CAAC,CAAC,EAAE,MAAM,CAAC;QACX,CAAC,CAAC,EAAE,MAAM,CAAC;QACX,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,GAAG;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAC1C,KAAK,CAAC,EAAE,KAAK,CAAC;QACd,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB,GAAG,OAAO,CAAC,SAAS,CAAC;mBAkBD,aAAa;mBAOb,SAAS;IAW9B,OAAO,CAAC,MAAM,CAAC,aAAa;IAS5B,OAAO,CAAC,MAAM,CAAC,SAAS;IAUxB,SAAS,CAAC,MAAM,IAAI,IAAI;IAKxB,IAAI,KAAK,IAAI,MAAM,CAElB;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,MAAM,EAGtB;IAED,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,EAGvB;IAED,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI;IAKrC,QAAQ,IAAI,sBAAsB,EAAE;IAapC,KAAK,CAAC,OAAO,SAAI,EAAE,OAAO,SAAI,GAAG,SAAS;CAe3C"}
@@ -0,0 +1,34 @@
1
+ import { Graphics } from 'pixi.js';
2
+ import { BaseNode } from './BaseNode';
3
+ import type { Style, NodePropertyDescriptor } from './BaseNode';
4
+ export declare class LineNode extends BaseNode {
5
+ readonly type: "line";
6
+ protected graphics: Graphics;
7
+ startX: number;
8
+ startY: number;
9
+ endX: number;
10
+ endY: number;
11
+ constructor(options: {
12
+ id?: string;
13
+ startX: number;
14
+ startY: number;
15
+ endX: number;
16
+ endY: number;
17
+ x?: number;
18
+ y?: number;
19
+ rotation?: number;
20
+ scale?: number | {
21
+ x: number;
22
+ y: number;
23
+ };
24
+ style?: Style;
25
+ visible?: boolean;
26
+ locked?: boolean;
27
+ });
28
+ protected redraw(): void;
29
+ setStyle(style: Partial<Style>): this;
30
+ refresh(): void;
31
+ getProps(): NodePropertyDescriptor[];
32
+ clone(offsetX?: number, offsetY?: number): LineNode;
33
+ }
34
+ //# sourceMappingURL=LineNode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LineNode.d.ts","sourceRoot":"","sources":["../../../../src/core/nodes/LineNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEhE,qBAAa,QAAS,SAAQ,QAAQ;IACpC,QAAQ,CAAC,IAAI,EAAG,MAAM,CAAU;IAChC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;gBAED,OAAO,EAAE;QACnB,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,CAAC,CAAC,EAAE,MAAM,CAAC;QACX,CAAC,CAAC,EAAE,MAAM,CAAC;QACX,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,GAAG;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAC1C,KAAK,CAAC,EAAE,KAAK,CAAC;QACd,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB;IAgCD,SAAS,CAAC,MAAM,IAAI,IAAI;IA0BxB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI;IAOrC,OAAO,IAAI,IAAI;IAIf,QAAQ,IAAI,sBAAsB,EAAE;IAcpC,KAAK,CAAC,OAAO,SAAI,EAAE,OAAO,SAAI,GAAG,QAAQ;CAiB1C"}
@@ -0,0 +1,29 @@
1
+ import { Graphics } from 'pixi.js';
2
+ import { BaseNode } from './BaseNode';
3
+ import type { Style, NodePropertyDescriptor } from './BaseNode';
4
+ export declare class RectangleNode extends BaseNode {
5
+ readonly type: "rectangle";
6
+ cornerRadius?: number;
7
+ protected graphics: Graphics;
8
+ constructor(options: {
9
+ id?: string;
10
+ width: number;
11
+ height: number;
12
+ cornerRadius?: number;
13
+ x?: number;
14
+ y?: number;
15
+ rotation?: number;
16
+ scale?: number | {
17
+ x: number;
18
+ y: number;
19
+ };
20
+ style?: Style;
21
+ visible?: boolean;
22
+ locked?: boolean;
23
+ });
24
+ protected redraw(): void;
25
+ setStyle(style: Partial<Style>): this;
26
+ getProps(): NodePropertyDescriptor[];
27
+ clone(offsetX?: number, offsetY?: number): RectangleNode;
28
+ }
29
+ //# sourceMappingURL=RectangleNode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RectangleNode.d.ts","sourceRoot":"","sources":["../../../../src/core/nodes/RectangleNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEhE,qBAAa,aAAc,SAAQ,QAAQ;IACzC,QAAQ,CAAC,IAAI,EAAG,WAAW,CAAU;IACrC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC;gBAEjB,OAAO,EAAE;QACnB,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,KAAK,EAAE,MAAM,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,CAAC,CAAC,EAAE,MAAM,CAAC;QACX,CAAC,CAAC,EAAE,MAAM,CAAC;QACX,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,GAAG;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAC1C,KAAK,CAAC,EAAE,KAAK,CAAC;QACd,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB;IAuBD,SAAS,CAAC,MAAM,IAAI,IAAI;IAqCxB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI;IAMrC,QAAQ,IAAI,sBAAsB,EAAE;IAcpC,KAAK,CAAC,OAAO,SAAI,EAAE,OAAO,SAAI,GAAG,aAAa;CAc/C"}
@@ -0,0 +1,31 @@
1
+ import { Graphics } from 'pixi.js';
2
+ import { BaseNode } from './BaseNode';
3
+ import type { Style, NodePropertyDescriptor } from './BaseNode';
4
+ export declare class StarNode extends BaseNode {
5
+ readonly type: "star";
6
+ protected graphics: Graphics;
7
+ points: number;
8
+ innerRadius: number;
9
+ outerRadius: number;
10
+ constructor(options: {
11
+ id?: string;
12
+ points: number;
13
+ innerRadius: number;
14
+ outerRadius: number;
15
+ x?: number;
16
+ y?: number;
17
+ rotation?: number;
18
+ scale?: number | {
19
+ x: number;
20
+ y: number;
21
+ };
22
+ style?: Style;
23
+ visible?: boolean;
24
+ locked?: boolean;
25
+ });
26
+ protected redraw(): void;
27
+ setStyle(style: Partial<Style>): this;
28
+ getProps(): NodePropertyDescriptor[];
29
+ clone(offsetX?: number, offsetY?: number): StarNode;
30
+ }
31
+ //# sourceMappingURL=StarNode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StarNode.d.ts","sourceRoot":"","sources":["../../../../src/core/nodes/StarNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEhE,qBAAa,QAAS,SAAQ,QAAQ;IACpC,QAAQ,CAAC,IAAI,EAAG,MAAM,CAAU;IAChC,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;gBAER,OAAO,EAAE;QACnB,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,CAAC,CAAC,EAAE,MAAM,CAAC;QACX,CAAC,CAAC,EAAE,MAAM,CAAC;QACX,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,GAAG;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAC1C,KAAK,CAAC,EAAE,KAAK,CAAC;QACd,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB;IA2BD,SAAS,CAAC,MAAM,IAAI,IAAI;IAsDxB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI;IAMrC,QAAQ,IAAI,sBAAsB,EAAE;IA+BpC,KAAK,CAAC,OAAO,SAAI,EAAE,OAAO,SAAI,GAAG,QAAQ;CAc1C"}
@@ -0,0 +1,27 @@
1
+ import { Text } from 'pixi.js';
2
+ import { BaseNode } from './BaseNode';
3
+ import type { Style, NodePropertyDescriptor } from './BaseNode';
4
+ export declare class TextNode extends BaseNode {
5
+ readonly type: "text";
6
+ protected textSprite: Text;
7
+ text: string;
8
+ constructor(options: {
9
+ id?: string;
10
+ text: string;
11
+ x?: number;
12
+ y?: number;
13
+ rotation?: number;
14
+ scale?: number | {
15
+ x: number;
16
+ y: number;
17
+ };
18
+ style?: Style;
19
+ visible?: boolean;
20
+ locked?: boolean;
21
+ });
22
+ setText(text: string): this;
23
+ setStyle(style: Partial<Style>): this;
24
+ getProps(): NodePropertyDescriptor[];
25
+ clone(offsetX?: number, offsetY?: number): TextNode;
26
+ }
27
+ //# sourceMappingURL=TextNode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextNode.d.ts","sourceRoot":"","sources":["../../../../src/core/nodes/TextNode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,KAAK,EAAE,KAAK,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAEhE,qBAAa,QAAS,SAAQ,QAAQ;IACpC,QAAQ,CAAC,IAAI,EAAG,MAAM,CAAU;IAChC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC;IAC3B,IAAI,EAAE,MAAM,CAAC;gBAED,OAAO,EAAE;QACnB,EAAE,CAAC,EAAE,MAAM,CAAC;QACZ,IAAI,EAAE,MAAM,CAAC;QACb,CAAC,CAAC,EAAE,MAAM,CAAC;QACX,CAAC,CAAC,EAAE,MAAM,CAAC;QACX,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,GAAG;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAC1C,KAAK,CAAC,EAAE,KAAK,CAAC;QACd,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB;IAuCD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQ3B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI;IAuBrC,QAAQ,IAAI,sBAAsB,EAAE;IA0CpC,KAAK,CAAC,OAAO,SAAI,EAAE,OAAO,SAAI,GAAG,QAAQ;CAY1C"}
@@ -0,0 +1,10 @@
1
+ export * from './BaseNode';
2
+ export * from './RectangleNode';
3
+ export * from './CircleNode';
4
+ export * from './TextNode';
5
+ export * from './ImageNode';
6
+ export * from './LineNode';
7
+ export * from './EllipseNode';
8
+ export * from './StarNode';
9
+ export type { NodePropertyDescriptor, InspectableNode, PropertyType, PropertiesChangedEvent } from './BaseNode';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/core/nodes/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,YAAY,EAAE,sBAAsB,EAAE,eAAe,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { Graphics, Container } from 'pixi.js';
2
+ type Point = {
3
+ x: number;
4
+ y: number;
5
+ };
6
+ export declare abstract class PreviewBase {
7
+ protected g: Graphics;
8
+ protected active: boolean;
9
+ start: Point;
10
+ last: Point;
11
+ protected previewLayer: Container;
12
+ constructor(previewLayer: Container);
13
+ begin(start: Point): void;
14
+ update(curr: Point): void;
15
+ end(): {
16
+ x: number;
17
+ y: number;
18
+ w: number;
19
+ h: number;
20
+ } | null;
21
+ cancel(): void;
22
+ get graphics(): Graphics;
23
+ protected abstract redraw(start: Point, end: Point): void;
24
+ protected getRect(): {
25
+ x: number;
26
+ y: number;
27
+ w: number;
28
+ h: number;
29
+ };
30
+ protected clear(): void;
31
+ }
32
+ export {};
33
+ //# sourceMappingURL=PreviewBase.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PreviewBase.d.ts","sourceRoot":"","sources":["../../../../../src/core/nodes/preview/PreviewBase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAE9C,KAAK,KAAK,GAAG;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtC,8BAAsB,WAAW;IAC/B,SAAS,CAAC,CAAC,WAAkB;IAC7B,SAAS,CAAC,MAAM,UAAS;IACzB,KAAK,EAAE,KAAK,CAAkB;IAC9B,IAAI,EAAE,KAAK,CAAkB;IAC7B,SAAS,CAAC,YAAY,EAAE,SAAS,CAAC;gBAEtB,YAAY,EAAE,SAAS;IAInC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAQzB,MAAM,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI;IAMzB,GAAG,IAAI;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAO5D,MAAM,IAAI,IAAI;IAMd,IAAI,QAAQ,aAEX;IAED,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,GAAG,IAAI;IAEzD,SAAS,CAAC,OAAO;;;;;;IAQjB,SAAS,CAAC,KAAK,IAAI,IAAI;CAMxB"}
@@ -0,0 +1,8 @@
1
+ import { PreviewBase } from './PreviewBase';
2
+ import type { Point } from './types';
3
+ export declare class PreviewEllipse extends PreviewBase {
4
+ private shiftKey;
5
+ setShiftKey(pressed: boolean): void;
6
+ protected redraw(a: Point, b: Point): void;
7
+ }
8
+ //# sourceMappingURL=PreviewEllipse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PreviewEllipse.d.ts","sourceRoot":"","sources":["../../../../../src/core/nodes/preview/PreviewEllipse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAErC,qBAAa,cAAe,SAAQ,WAAW;IAC7C,OAAO,CAAC,QAAQ,CAAS;IAEzB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAOnC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,GAAG,IAAI;CA4B3C"}
@@ -0,0 +1,8 @@
1
+ import { PreviewBase } from './PreviewBase';
2
+ import type { Point } from './types';
3
+ export declare class PreviewLine extends PreviewBase {
4
+ private shiftKey;
5
+ setShiftKey(pressed: boolean): void;
6
+ protected redraw(a: Point, b: Point): void;
7
+ }
8
+ //# sourceMappingURL=PreviewLine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PreviewLine.d.ts","sourceRoot":"","sources":["../../../../../src/core/nodes/preview/PreviewLine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAErC,qBAAa,WAAY,SAAQ,WAAW;IAC1C,OAAO,CAAC,QAAQ,CAAS;IAEzB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAOnC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,GAAG,IAAI;CAsB3C"}
@@ -0,0 +1,8 @@
1
+ import { PreviewBase } from './PreviewBase';
2
+ import type { Point } from './types';
3
+ export declare class PreviewRect extends PreviewBase {
4
+ private shiftKey;
5
+ setShiftKey(pressed: boolean): void;
6
+ protected redraw(a: Point, b: Point): void;
7
+ }
8
+ //# sourceMappingURL=PreviewRect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PreviewRect.d.ts","sourceRoot":"","sources":["../../../../../src/core/nodes/preview/PreviewRect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAErC,qBAAa,WAAY,SAAQ,WAAW;IAC1C,OAAO,CAAC,QAAQ,CAAS;IAEzB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAOnC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,GAAG,IAAI;CAyB3C"}
@@ -0,0 +1,6 @@
1
+ import { PreviewBase } from './PreviewBase';
2
+ import type { Point } from './types';
3
+ export declare class PreviewStar extends PreviewBase {
4
+ protected redraw(_start: Point, _end: Point): void;
5
+ }
6
+ //# sourceMappingURL=PreviewStar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PreviewStar.d.ts","sourceRoot":"","sources":["../../../../../src/core/nodes/preview/PreviewStar.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAErC,qBAAa,WAAY,SAAQ,WAAW;IAC1C,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI;CA2BnD"}
@@ -0,0 +1,5 @@
1
+ export type Point = {
2
+ x: number;
3
+ y: number;
4
+ };
5
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../../src/core/nodes/preview/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,KAAK,GAAG;IAClB,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;CACX,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { Point } from 'pixi.js';
2
+ import type { LineNode } from '../nodes/LineNode';
3
+ export declare class LineTransformController {
4
+ private activeNode;
5
+ private startPoint;
6
+ private activeHandle;
7
+ private startState;
8
+ startTransform(node: LineNode, point: Point, handle: 'start' | 'end' | 'move'): void;
9
+ updateTransform(point: Point): void;
10
+ endTransform(): void;
11
+ }
12
+ //# sourceMappingURL=LineTransformController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LineTransformController.d.ts","sourceRoot":"","sources":["../../../../src/core/selection/LineTransformController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,qBAAa,uBAAuB;IAClC,OAAO,CAAC,UAAU,CAAyB;IAC3C,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,YAAY,CAAyC;IAC7D,OAAO,CAAC,UAAU,CAOF;IAEhB,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,GAAG,KAAK,GAAG,MAAM;IAc7E,eAAe,CAAC,KAAK,EAAE,KAAK;IA0C5B,YAAY;CAMb"}
@@ -0,0 +1,39 @@
1
+ import { Container, Point } from 'pixi.js';
2
+ import type { BaseNode } from '../nodes/BaseNode';
3
+ import { GroupNode } from '../nodes/GroupNode';
4
+ export declare class SelectionManager {
5
+ private selectedNodes;
6
+ private isMultiSelect;
7
+ private selectionGraphics;
8
+ private transformController;
9
+ private lineTransformController;
10
+ private shiftKey;
11
+ constructor(toolsLayer: Container);
12
+ startTransform(point: Point, handle?: string): void;
13
+ updateTransform(point: Point): void;
14
+ endTransform(): void;
15
+ hitTestHandle(point: Point): string | null;
16
+ setMultiSelect(enabled: boolean): void;
17
+ setShiftKey(enabled: boolean): void;
18
+ select(node: BaseNode | null): void;
19
+ createGroup(): GroupNode | undefined;
20
+ ungroupSelected(): BaseNode[];
21
+ getSelectionBounds(): {
22
+ x: number;
23
+ y: number;
24
+ width: number;
25
+ height: number;
26
+ };
27
+ private normalizeNodeScale;
28
+ isSelected(node: BaseNode): boolean;
29
+ getSelectedNodes(): BaseNode[];
30
+ reorderSelected(container: Container, direction: -1 | 1): boolean;
31
+ deleteSelected(container: Container): BaseNode[];
32
+ clear(): void;
33
+ nudgeSelected(dx: number, dy: number): boolean;
34
+ private updateSelectionVisuals;
35
+ private getWorldScale;
36
+ private dispatchLayerChanged;
37
+ private dispatchPropertiesChanged;
38
+ }
39
+ //# sourceMappingURL=SelectionManager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectionManager.d.ts","sourceRoot":"","sources":["../../../../src/core/selection/SelectionManager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAY,KAAK,EAAE,MAAM,SAAS,CAAC;AACrD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAIlD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAI/C,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,aAAa,CAA4B;IACjD,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,iBAAiB,CAAW;IACpC,OAAO,CAAC,mBAAmB,CAAsB;IACjD,OAAO,CAAC,uBAAuB,CAA0B;IACzD,OAAO,CAAC,QAAQ,CAAS;gBAEb,UAAU,EAAE,SAAS;IAQjC,cAAc,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,MAAM;IAc5C,eAAe,CAAC,KAAK,EAAE,KAAK;IAY5B,YAAY;IAYZ,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,IAAI;IAmG1C,cAAc,CAAC,OAAO,EAAE,OAAO;IAI/B,WAAW,CAAC,OAAO,EAAE,OAAO;IAI5B,MAAM,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAmB5B,WAAW;IAmDX,eAAe,IAAI,QAAQ,EAAE;IAoD7B,kBAAkB;;;;;;IAsBlB,OAAO,CAAC,kBAAkB;IAS1B,UAAU,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO;IAInC,gBAAgB,IAAI,QAAQ,EAAE;IAI9B,eAAe,CAAC,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO;IAejE,cAAc,CAAC,SAAS,EAAE,SAAS,GAAG,QAAQ,EAAE;IAYhD,KAAK;IAOL,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO;IAY9C,OAAO,CAAC,sBAAsB;IAgH9B,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,oBAAoB;IAa5B,OAAO,CAAC,yBAAyB;CAUlC"}
@@ -0,0 +1,14 @@
1
+ import { Point } from 'pixi.js';
2
+ import type { BaseNode } from '../nodes/BaseNode';
3
+ export declare class TransformController {
4
+ private mode;
5
+ private startPoint;
6
+ private startState;
7
+ private activeNode;
8
+ private activeHandle;
9
+ constructor();
10
+ startTransform(node: BaseNode, point: Point, handle?: string): void;
11
+ updateTransform(point: Point, constrainRatio?: boolean): void;
12
+ endTransform(): void;
13
+ }
14
+ //# sourceMappingURL=TransformController.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TransformController.d.ts","sourceRoot":"","sources":["../../../../src/core/selection/TransformController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAIlD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,IAAI,CAAyB;IACrC,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,UAAU,CAMF;IAChB,OAAO,CAAC,UAAU,CAAyB;IAC3C,OAAO,CAAC,YAAY,CAAuB;;IAI3C,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,CAAC,EAAE,MAAM;IAwB5D,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,cAAc,UAAQ;IAiIpD,YAAY;CAOb"}
@@ -0,0 +1,18 @@
1
+ import { Container } from 'pixi.js';
2
+ export declare class RulerOverlay {
3
+ private root;
4
+ private g;
5
+ private labels;
6
+ private uiLayer;
7
+ private getViewport;
8
+ constructor(uiLayer: Container, getViewport: () => {
9
+ width: number;
10
+ height: number;
11
+ scale: number;
12
+ x: number;
13
+ y: number;
14
+ });
15
+ update(): void;
16
+ private getNiceStep;
17
+ }
18
+ //# sourceMappingURL=RulerOverlay.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RulerOverlay.d.ts","sourceRoot":"","sources":["../../../../src/core/ui/RulerOverlay.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAkB,MAAM,SAAS,CAAC;AAEpD,qBAAa,YAAY;IACvB,OAAO,CAAC,IAAI,CAAY;IACxB,OAAO,CAAC,CAAC,CAAW;IACpB,OAAO,CAAC,MAAM,CAAY;IAC1B,OAAO,CAAC,OAAO,CAAY;IAC3B,OAAO,CAAC,WAAW,CAA+E;gBAGhG,OAAO,EAAE,SAAS,EAClB,WAAW,EAAE,MAAM;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE;IAY3F,MAAM;IA0EN,OAAO,CAAC,WAAW;CAQpB"}
@@ -0,0 +1,2 @@
1
+ import './style.css';
2
+ //# sourceMappingURL=main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../../../src/demo/main.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { BaseNode } from './core/nodes/BaseNode';
2
+ import type { ToolName } from './index';
3
+ export type ShapeCreatedEvent = CustomEvent<{
4
+ shape: BaseNode;
5
+ }>;
6
+ export type ToolChangedEvent = CustomEvent<{
7
+ tool: ToolName;
8
+ }>;
9
+ declare global {
10
+ interface WindowEventMap {
11
+ 'shape:created': ShapeCreatedEvent;
12
+ 'tool:changed': ToolChangedEvent;
13
+ }
14
+ }
15
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC,MAAM,MAAM,iBAAiB,GAAG,WAAW,CAAC;IAC1C,KAAK,EAAE,QAAQ,CAAC;CACjB,CAAC,CAAC;AAEH,MAAM,MAAM,gBAAgB,GAAG,WAAW,CAAC;IACzC,IAAI,EAAE,QAAQ,CAAC;CAChB,CAAC,CAAC;AAEH,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,cAAc;QACtB,eAAe,EAAE,iBAAiB,CAAC;QACnC,cAAc,EAAE,gBAAgB,CAAC;KAClC;CACF"}
@@ -0,0 +1,85 @@
1
+ import './ccd.css';
2
+ import { Application, Container } from 'pixi.js';
3
+ import { PointerController } from './PointerController';
4
+ import { HistoryManager } from './core/history/HistoryManager';
5
+ import type { SceneDocument } from './core/history/HistoryManager';
6
+ export declare const version = "0.0.0";
7
+ export type ToolName = 'select' | 'rectangle' | 'circle' | 'text' | 'line' | 'ellipse' | 'star' | 'pan';
8
+ export interface NodePropUpdate {
9
+ id: string;
10
+ props: Record<string, string | number | boolean | null>;
11
+ }
12
+ export declare const TOOL_CURSOR: Record<ToolName, string | null>;
13
+ export declare class CCDApp {
14
+ app: Application<import("pixi.js").Renderer>;
15
+ world: Container<import("pixi.js").ContainerChild>;
16
+ objectLayer: Container<import("pixi.js").ContainerChild>;
17
+ previewLayer: Container<import("pixi.js").ContainerChild>;
18
+ toolsLayer: Container<import("pixi.js").ContainerChild>;
19
+ helperLayer: Container<import("pixi.js").ContainerChild>;
20
+ uiLayer: Container<import("pixi.js").ContainerChild>;
21
+ host?: HTMLElement;
22
+ pointerController?: PointerController;
23
+ history?: HistoryManager;
24
+ private ruler?;
25
+ activeTool: ToolName;
26
+ init(host: HTMLElement): Promise<void>;
27
+ initPointerController(): void;
28
+ private handleZoomKeys;
29
+ private handleUndoRedoKeys;
30
+ setZoom(newScale: number): void;
31
+ private handleDrop;
32
+ private handlePaste;
33
+ private addImageFromSource;
34
+ private getWorldPointFromClient;
35
+ exportRaster(options: {
36
+ type: 'png' | 'jpg';
37
+ scope: 'all' | 'selection';
38
+ quality?: number;
39
+ padding?: number;
40
+ background?: string;
41
+ }): Promise<string | null>;
42
+ exportSVG(options: {
43
+ scope: 'all' | 'selection';
44
+ padding?: number;
45
+ imageEmbed?: 'original' | 'display' | 'max';
46
+ imageMaxEdge?: number;
47
+ background?: string;
48
+ }): Promise<string | null>;
49
+ private getExportBounds;
50
+ private getBoundsFromNodes;
51
+ private getRootNodes;
52
+ private getAllBaseNodes;
53
+ private applySelectionVisibility;
54
+ private toColorNumber;
55
+ private nodeToSvg;
56
+ private starPointsToSvg;
57
+ private styleToSvg;
58
+ private escapeXml;
59
+ private resolveImageDataUrl;
60
+ private loadImage;
61
+ private toDataUrl;
62
+ private isEditingText;
63
+ undo(): Promise<void>;
64
+ redo(): Promise<void>;
65
+ exportJSON(): Promise<SceneDocument | null>;
66
+ importJSON(doc: SceneDocument): Promise<void>;
67
+ hasDocumentContent(): boolean;
68
+ clearDocument(): Promise<void>;
69
+ setCursor(name: string | null): void;
70
+ resetCursor(): void;
71
+ useTool(toolName: ToolName): void;
72
+ dispatchLayerHierarchyChanged(): void;
73
+ /**
74
+ * Apply property updates to one or more nodes by id.
75
+ * Pass the ids/props you received from `layer:changed` or `properties:changed`.
76
+ */
77
+ applyNodeProperties(update: NodePropUpdate | NodePropUpdate[]): void;
78
+ private applyStyle;
79
+ private findNodeById;
80
+ private dispatchOnHost;
81
+ destroy(): void;
82
+ getLayerHierarchy(): import("./core/layers/LayerHierarchy").LayerNode;
83
+ getPixiApp(): Application<import("pixi.js").Renderer>;
84
+ }
85
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,25 +1,26 @@
1
1
  {
2
2
  "name": "canvas-can-do",
3
3
  "private": false,
4
- "version": "0.1.0",
4
+ "version": "0.1.2",
5
5
  "description": "Transform-based vector graphics editor engine for the web.",
6
6
  "type": "module",
7
7
  "main": "./dist/canvas-can-do.umd.cjs",
8
8
  "module": "./dist/canvas-can-do.js",
9
- "types": "./dist/index.d.ts",
9
+ "types": "./dist/types/index.d.ts",
10
10
  "exports": {
11
11
  ".": {
12
- "types": "./dist/index.d.ts",
12
+ "types": "./dist/types/index.d.ts",
13
13
  "import": "./dist/canvas-can-do.js",
14
14
  "require": "./dist/canvas-can-do.umd.cjs"
15
- }
15
+ },
16
+ "./style.css": "./dist/style.css"
16
17
  },
17
18
  "files": [
18
19
  "dist"
19
20
  ],
20
21
  "scripts": {
21
22
  "dev": "vite",
22
- "build": "tsc -p tsconfig.build.json && vite build",
23
+ "build": "vite build && tsc -p tsconfig.build.json",
23
24
  "preview": "vite preview"
24
25
  },
25
26
  "devDependencies": {
package/dist/ccd.css DELETED
@@ -1,87 +0,0 @@
1
- /* base */
2
- .ccd-host {
3
- cursor: default;
4
- }
5
-
6
- /* tools */
7
- .ccd-cursor-default {
8
- cursor: default;
9
- }
10
-
11
- .ccd-cursor-crosshair {
12
- cursor: crosshair;
13
- }
14
-
15
- .ccd-cursor-text {
16
- cursor: text;
17
- }
18
-
19
- .ccd-cursor-move {
20
- cursor: move;
21
- }
22
-
23
- .ccd-cursor-grab {
24
- cursor: grab;
25
- }
26
-
27
- .ccd-cursor-grabbing {
28
- cursor: grabbing;
29
- }
30
-
31
- /* resize — edges */
32
- .ccd-cursor-resize-n {
33
- cursor: n-resize;
34
- }
35
-
36
- .ccd-cursor-resize-s {
37
- cursor: s-resize;
38
- }
39
-
40
- .ccd-cursor-resize-e {
41
- cursor: e-resize;
42
- }
43
-
44
- .ccd-cursor-resize-w {
45
- cursor: w-resize;
46
- }
47
-
48
- /* resize — corners */
49
- .ccd-cursor-resize-nw {
50
- cursor: nw-resize;
51
- }
52
-
53
- .ccd-cursor-resize-ne {
54
- cursor: ne-resize;
55
- }
56
-
57
- .ccd-cursor-resize-sw {
58
- cursor: sw-resize;
59
- }
60
-
61
- .ccd-cursor-resize-se {
62
- cursor: se-resize;
63
- }
64
-
65
- /* rotate */
66
- .ccd-cursor-rotate {
67
- cursor: alias; /* placeholder, custom cursor มักใช้แทน */
68
- }
69
-
70
- /* zoom / view */
71
- .ccd-cursor-zoom-in {
72
- cursor: zoom-in;
73
- }
74
-
75
- .ccd-cursor-zoom-out {
76
- cursor: zoom-out;
77
- }
78
-
79
- /* disabled / locked */
80
- .ccd-cursor-not-allowed {
81
- cursor: not-allowed;
82
- }
83
-
84
- /* precision */
85
- .ccd-cursor-precision {
86
- cursor: cell;
87
- }