@nice2dev/spatial-core 1.0.10

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 (82) hide show
  1. package/README.md +160 -0
  2. package/dist/bim/index.d.ts +366 -0
  3. package/dist/bim/index.d.ts.map +1 -0
  4. package/dist/bim/index.js +60 -0
  5. package/dist/bim/index.js.map +1 -0
  6. package/dist/cad/index.d.ts +329 -0
  7. package/dist/cad/index.d.ts.map +1 -0
  8. package/dist/cad/index.js +124 -0
  9. package/dist/cad/index.js.map +1 -0
  10. package/dist/ecad/index.d.ts +316 -0
  11. package/dist/ecad/index.d.ts.map +1 -0
  12. package/dist/ecad/index.js +11 -0
  13. package/dist/ecad/index.js.map +1 -0
  14. package/dist/export/index.d.ts +93 -0
  15. package/dist/export/index.d.ts.map +1 -0
  16. package/dist/export/index.js +522 -0
  17. package/dist/export/index.js.map +1 -0
  18. package/dist/floor-plan/index.d.ts +248 -0
  19. package/dist/floor-plan/index.d.ts.map +1 -0
  20. package/dist/floor-plan/index.js +228 -0
  21. package/dist/floor-plan/index.js.map +1 -0
  22. package/dist/grid/index.d.ts +160 -0
  23. package/dist/grid/index.d.ts.map +1 -0
  24. package/dist/grid/index.js +319 -0
  25. package/dist/grid/index.js.map +1 -0
  26. package/dist/import/import.worker.d.ts +28 -0
  27. package/dist/import/import.worker.d.ts.map +1 -0
  28. package/dist/import/import.worker.js +52 -0
  29. package/dist/import/import.worker.js.map +1 -0
  30. package/dist/import/index.d.ts +111 -0
  31. package/dist/import/index.d.ts.map +1 -0
  32. package/dist/import/index.js +1092 -0
  33. package/dist/import/index.js.map +1 -0
  34. package/dist/import/workerImport.d.ts +56 -0
  35. package/dist/import/workerImport.d.ts.map +1 -0
  36. package/dist/import/workerImport.js +207 -0
  37. package/dist/import/workerImport.js.map +1 -0
  38. package/dist/index.d.ts +29 -0
  39. package/dist/index.d.ts.map +1 -0
  40. package/dist/index.js +86 -0
  41. package/dist/index.js.map +1 -0
  42. package/dist/interior/index.d.ts +241 -0
  43. package/dist/interior/index.d.ts.map +1 -0
  44. package/dist/interior/index.js +101 -0
  45. package/dist/interior/index.js.map +1 -0
  46. package/dist/measurement/index.d.ts +186 -0
  47. package/dist/measurement/index.d.ts.map +1 -0
  48. package/dist/measurement/index.js +400 -0
  49. package/dist/measurement/index.js.map +1 -0
  50. package/dist/objects/index.d.ts +288 -0
  51. package/dist/objects/index.d.ts.map +1 -0
  52. package/dist/objects/index.js +463 -0
  53. package/dist/objects/index.js.map +1 -0
  54. package/dist/serialization/index.d.ts +421 -0
  55. package/dist/serialization/index.d.ts.map +1 -0
  56. package/dist/serialization/index.js +412 -0
  57. package/dist/serialization/index.js.map +1 -0
  58. package/dist/topology/index.d.ts +252 -0
  59. package/dist/topology/index.d.ts.map +1 -0
  60. package/dist/topology/index.js +525 -0
  61. package/dist/topology/index.js.map +1 -0
  62. package/dist/transitions/index.d.ts +141 -0
  63. package/dist/transitions/index.d.ts.map +1 -0
  64. package/dist/transitions/index.js +160 -0
  65. package/dist/transitions/index.js.map +1 -0
  66. package/dist/unified/index.d.ts +225 -0
  67. package/dist/unified/index.d.ts.map +1 -0
  68. package/dist/unified/index.js +474 -0
  69. package/dist/unified/index.js.map +1 -0
  70. package/dist/virtualization/QuadTree.d.ts +68 -0
  71. package/dist/virtualization/QuadTree.d.ts.map +1 -0
  72. package/dist/virtualization/QuadTree.js +228 -0
  73. package/dist/virtualization/QuadTree.js.map +1 -0
  74. package/dist/virtualization/ViewportCulling.d.ts +92 -0
  75. package/dist/virtualization/ViewportCulling.d.ts.map +1 -0
  76. package/dist/virtualization/ViewportCulling.js +123 -0
  77. package/dist/virtualization/ViewportCulling.js.map +1 -0
  78. package/dist/virtualization/index.d.ts +9 -0
  79. package/dist/virtualization/index.d.ts.map +1 -0
  80. package/dist/virtualization/index.js +9 -0
  81. package/dist/virtualization/index.js.map +1 -0
  82. package/package.json +64 -0
@@ -0,0 +1,141 @@
1
+ /**
2
+ * Editor Transitions — Seamless 2D↔3D switching, split view, shared undo.
3
+ *
4
+ * PRO-2.2 tasks:
5
+ * - Quick Switch Button state
6
+ * - Context Preservation (selection, viewport)
7
+ * - Split View Mode
8
+ * - Cross-Editor Undo
9
+ * - Linked Viewports
10
+ * - Annotation Transfer
11
+ * - Bookmark System
12
+ * - Comparison View
13
+ * - Timeline View
14
+ *
15
+ * @module @nice2dev/spatial-core/transitions
16
+ */
17
+ import type { Point2D, Point3D } from '../grid/index';
18
+ export type ActiveEditor = '2d' | '3d' | 'split';
19
+ export interface EditorTransitionState {
20
+ /** Currently active editor */
21
+ activeEditor: ActiveEditor;
22
+ /** Selected object IDs (preserved across switches) */
23
+ selectedIds: string[];
24
+ /** 2D viewport: center and zoom */
25
+ viewport2D: ViewportState2D;
26
+ /** 3D viewport: camera position and target */
27
+ viewport3D: ViewportState3D;
28
+ /** Whether viewports are linked */
29
+ viewportsLinked: boolean;
30
+ /** Split ratio (only relevant in split mode, 0-1) */
31
+ splitRatio: number;
32
+ /** Bookmarks */
33
+ bookmarks: ViewBookmark[];
34
+ }
35
+ export interface ViewportState2D {
36
+ center: Point2D;
37
+ zoom: number;
38
+ rotation: number;
39
+ }
40
+ export interface ViewportState3D {
41
+ cameraPosition: Point3D;
42
+ cameraTarget: Point3D;
43
+ /** Field of view (degrees) */
44
+ fov: number;
45
+ /** Is orthographic */
46
+ orthographic: boolean;
47
+ }
48
+ /**
49
+ * Prepare state for switching between 2D and 3D.
50
+ * Preserves selection and maps viewport position.
51
+ */
52
+ export declare function prepareSwitch(_from: ActiveEditor, to: ActiveEditor, state: EditorTransitionState): EditorTransitionState;
53
+ /** An undo action that spans both editors */
54
+ export interface CrossEditorAction {
55
+ id: string;
56
+ timestamp: number;
57
+ editor: '2d' | '3d' | 'unified';
58
+ description: string;
59
+ /** Data needed to undo */
60
+ undoData: unknown;
61
+ /** Data needed to redo */
62
+ redoData: unknown;
63
+ }
64
+ /** Unified undo stack for both editors */
65
+ export declare class CrossEditorUndoStack {
66
+ private undoStack;
67
+ private redoStack;
68
+ private maxSize;
69
+ constructor(maxSize?: number);
70
+ push(action: CrossEditorAction): void;
71
+ undo(): CrossEditorAction | undefined;
72
+ redo(): CrossEditorAction | undefined;
73
+ canUndo(): boolean;
74
+ canRedo(): boolean;
75
+ clear(): void;
76
+ getHistory(): CrossEditorAction[];
77
+ }
78
+ /**
79
+ * Convert a 2D viewport center to an approximate 3D camera pos.
80
+ * The 3D camera looks down at the plan from above.
81
+ */
82
+ export declare function viewport2Dto3D(v2d: ViewportState2D): ViewportState3D;
83
+ /**
84
+ * Convert a 3D camera to an approximate 2D viewport.
85
+ */
86
+ export declare function viewport3Dto2D(v3d: ViewportState3D): ViewportState2D;
87
+ export interface ViewBookmark {
88
+ id: string;
89
+ name: string;
90
+ editor: '2d' | '3d';
91
+ viewport2D?: ViewportState2D;
92
+ viewport3D?: ViewportState3D;
93
+ selectedIds?: string[];
94
+ createdAt: number;
95
+ }
96
+ export declare class BookmarkManager {
97
+ private bookmarks;
98
+ add(bookmark: ViewBookmark): void;
99
+ remove(id: string): void;
100
+ get(id: string): ViewBookmark | undefined;
101
+ getAll(): ViewBookmark[];
102
+ rename(id: string, name: string): void;
103
+ }
104
+ /** Comparison between two snapshots (e.g. two versions) */
105
+ export interface ComparisonSnapshot {
106
+ id: string;
107
+ label: string;
108
+ objectIds: string[];
109
+ /** Serialized state for the snapshot */
110
+ data: unknown;
111
+ timestamp: number;
112
+ }
113
+ export interface ComparisonDiff {
114
+ added: string[];
115
+ removed: string[];
116
+ modified: string[];
117
+ }
118
+ export declare function computeDiff(snapshotA: ComparisonSnapshot, snapshotB: ComparisonSnapshot): ComparisonDiff;
119
+ /** A single timeline entry representing a change */
120
+ export interface TimelineEntry {
121
+ id: string;
122
+ timestamp: number;
123
+ editor: '2d' | '3d';
124
+ description: string;
125
+ objectIds: string[];
126
+ /** Snapshot of the changed objects (for preview/restore) */
127
+ snapshot?: unknown;
128
+ }
129
+ /** Timeline for tracking changes over time */
130
+ export declare class ChangeTimeline {
131
+ private entries;
132
+ private maxEntries;
133
+ constructor(maxEntries?: number);
134
+ record(entry: TimelineEntry): void;
135
+ getAll(): TimelineEntry[];
136
+ getRange(from: number, to: number): TimelineEntry[];
137
+ getByObject(objectId: string): TimelineEntry[];
138
+ getByEditor(editor: '2d' | '3d'): TimelineEntry[];
139
+ clear(): void;
140
+ }
141
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/transitions/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,160 @@
1
+ /**
2
+ * Editor Transitions — Seamless 2D↔3D switching, split view, shared undo.
3
+ *
4
+ * PRO-2.2 tasks:
5
+ * - Quick Switch Button state
6
+ * - Context Preservation (selection, viewport)
7
+ * - Split View Mode
8
+ * - Cross-Editor Undo
9
+ * - Linked Viewports
10
+ * - Annotation Transfer
11
+ * - Bookmark System
12
+ * - Comparison View
13
+ * - Timeline View
14
+ *
15
+ * @module @nice2dev/spatial-core/transitions
16
+ */
17
+ /* ================================================================
18
+ QUICK SWITCH
19
+ ================================================================ */
20
+ /**
21
+ * Prepare state for switching between 2D and 3D.
22
+ * Preserves selection and maps viewport position.
23
+ */
24
+ export function prepareSwitch(_from, to, state) {
25
+ return {
26
+ ...state,
27
+ activeEditor: to,
28
+ // Selection preserved as-is
29
+ };
30
+ }
31
+ /** Unified undo stack for both editors */
32
+ export class CrossEditorUndoStack {
33
+ undoStack = [];
34
+ redoStack = [];
35
+ maxSize;
36
+ constructor(maxSize = 100) {
37
+ this.maxSize = maxSize;
38
+ }
39
+ push(action) {
40
+ this.undoStack.push(action);
41
+ if (this.undoStack.length > this.maxSize) {
42
+ this.undoStack.shift();
43
+ }
44
+ this.redoStack = []; // Clear redo on new action
45
+ }
46
+ undo() {
47
+ const action = this.undoStack.pop();
48
+ if (action) {
49
+ this.redoStack.push(action);
50
+ }
51
+ return action;
52
+ }
53
+ redo() {
54
+ const action = this.redoStack.pop();
55
+ if (action) {
56
+ this.undoStack.push(action);
57
+ }
58
+ return action;
59
+ }
60
+ canUndo() {
61
+ return this.undoStack.length > 0;
62
+ }
63
+ canRedo() {
64
+ return this.redoStack.length > 0;
65
+ }
66
+ clear() {
67
+ this.undoStack = [];
68
+ this.redoStack = [];
69
+ }
70
+ getHistory() {
71
+ return [...this.undoStack];
72
+ }
73
+ }
74
+ /* ================================================================
75
+ LINKED VIEWPORTS
76
+ ================================================================ */
77
+ /**
78
+ * Convert a 2D viewport center to an approximate 3D camera pos.
79
+ * The 3D camera looks down at the plan from above.
80
+ */
81
+ export function viewport2Dto3D(v2d) {
82
+ const height = 100 / v2d.zoom; // Higher zoom = closer camera
83
+ return {
84
+ cameraPosition: { x: v2d.center.x, y: height, z: v2d.center.y },
85
+ cameraTarget: { x: v2d.center.x, y: 0, z: v2d.center.y },
86
+ fov: 50,
87
+ orthographic: true,
88
+ };
89
+ }
90
+ /**
91
+ * Convert a 3D camera to an approximate 2D viewport.
92
+ */
93
+ export function viewport3Dto2D(v3d) {
94
+ const height = Math.max(1, v3d.cameraPosition.y);
95
+ return {
96
+ center: { x: v3d.cameraTarget.x, y: v3d.cameraTarget.z },
97
+ zoom: 100 / height,
98
+ rotation: 0,
99
+ };
100
+ }
101
+ export class BookmarkManager {
102
+ bookmarks = new Map();
103
+ add(bookmark) {
104
+ this.bookmarks.set(bookmark.id, bookmark);
105
+ }
106
+ remove(id) {
107
+ this.bookmarks.delete(id);
108
+ }
109
+ get(id) {
110
+ return this.bookmarks.get(id);
111
+ }
112
+ getAll() {
113
+ return Array.from(this.bookmarks.values()).sort((a, b) => a.createdAt - b.createdAt);
114
+ }
115
+ rename(id, name) {
116
+ const b = this.bookmarks.get(id);
117
+ if (b) {
118
+ b.name = name;
119
+ }
120
+ }
121
+ }
122
+ export function computeDiff(snapshotA, snapshotB) {
123
+ const setA = new Set(snapshotA.objectIds);
124
+ const setB = new Set(snapshotB.objectIds);
125
+ return {
126
+ added: snapshotB.objectIds.filter((id) => !setA.has(id)),
127
+ removed: snapshotA.objectIds.filter((id) => !setB.has(id)),
128
+ modified: snapshotA.objectIds.filter((id) => setB.has(id)),
129
+ };
130
+ }
131
+ /** Timeline for tracking changes over time */
132
+ export class ChangeTimeline {
133
+ entries = [];
134
+ maxEntries;
135
+ constructor(maxEntries = 500) {
136
+ this.maxEntries = maxEntries;
137
+ }
138
+ record(entry) {
139
+ this.entries.push(entry);
140
+ if (this.entries.length > this.maxEntries) {
141
+ this.entries.shift();
142
+ }
143
+ }
144
+ getAll() {
145
+ return [...this.entries];
146
+ }
147
+ getRange(from, to) {
148
+ return this.entries.filter((e) => e.timestamp >= from && e.timestamp <= to);
149
+ }
150
+ getByObject(objectId) {
151
+ return this.entries.filter((e) => e.objectIds.includes(objectId));
152
+ }
153
+ getByEditor(editor) {
154
+ return this.entries.filter((e) => e.editor === editor);
155
+ }
156
+ clear() {
157
+ this.entries = [];
158
+ }
159
+ }
160
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/transitions/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,225 @@
1
+ /**
2
+ * Shared 3D Object Model — bridges Spatial 2D and CAD 3D.
3
+ *
4
+ * PRO-2.1 tasks:
5
+ * - SpatialObject3D — shared type for both editors
6
+ * - 2D↔3D extrusion / projection utilities
7
+ * - Reference System — CAD objects as spatial references
8
+ * - Property Sync — bi-directional property binding
9
+ * - Material Library — shared materials/textures
10
+ * - Smart Snapping — snap to edges, vertices, centers
11
+ * - Grid Systems — ortho, isometric, hex
12
+ * - Layer Management — shared layers
13
+ * - Object Constraints — parent-child, alignment, distribution
14
+ *
15
+ * @module @nice2dev/spatial-core/unified
16
+ */
17
+ import type { Point2D, Point3D } from '../grid/index';
18
+ import type { SpatialObject, Transform2D, Transform3D } from '../objects/index';
19
+ /** SpatialObject3D extends the base SpatialObject with full 3D support. */
20
+ export interface SpatialObject3D extends Omit<SpatialObject, 'transform'> {
21
+ transform2D: Transform2D;
22
+ transform3D: Transform3D;
23
+ /** Whether the object originated in 2D or 3D */
24
+ origin: '2d' | '3d';
25
+ /** Linked object ID in the other editor (2D↔3D reference) */
26
+ linkedObjectId?: string;
27
+ /** Extrusion height (for 2D→3D) */
28
+ extrusionHeight?: number;
29
+ /** Projection axis for 3D→2D */
30
+ projectionAxis?: 'x' | 'y' | 'z';
31
+ /** Material assignment */
32
+ materialId?: string;
33
+ /** Constraints applied to this object */
34
+ constraints: ObjectConstraint[];
35
+ }
36
+ /** Options for 2D→3D extrusion */
37
+ export interface ExtrusionOptions {
38
+ height: number;
39
+ /** Taper factor: 0 = no taper, 1 = to a point */
40
+ taper?: number;
41
+ /** Twist in degrees along extrusion axis */
42
+ twist?: number;
43
+ /** Cap top and bottom */
44
+ cap?: boolean;
45
+ /** Material for extruded sides */
46
+ sideMaterialId?: string;
47
+ /** Material for top cap */
48
+ topMaterialId?: string;
49
+ }
50
+ /** Options for 3D→2D projection */
51
+ export interface ProjectionOptions {
52
+ /** Axis to project onto the 2D plane from */
53
+ axis: 'x' | 'y' | 'z';
54
+ /** Whether to include hidden lines */
55
+ hiddenLines?: boolean;
56
+ /** Scale factor */
57
+ scale?: number;
58
+ }
59
+ /** Extrude a 2D outline (polygon) into a 3D shape description. */
60
+ export declare function extrudeTo3D(outline: Point2D[], options: ExtrusionOptions): {
61
+ vertices: Point3D[];
62
+ faces: number[][];
63
+ height: number;
64
+ };
65
+ /** Project a 3D point cloud onto a 2D plane. */
66
+ export declare function projectTo2D(points: Point3D[], options: ProjectionOptions): Point2D[];
67
+ /** A reference link between a 2D and 3D object */
68
+ export interface ObjectReference {
69
+ id: string;
70
+ sourceId: string;
71
+ targetId: string;
72
+ sourceEditor: '2d' | '3d';
73
+ /** Sync mode: one-way or bidirectional */
74
+ syncMode: 'source-to-target' | 'target-to-source' | 'bidirectional';
75
+ /** Which properties to sync */
76
+ syncProperties: SyncProperty[];
77
+ }
78
+ export type SyncProperty = 'position' | 'rotation' | 'scale' | 'material' | 'visibility' | 'metadata' | 'name';
79
+ /** Reference registry for managing cross-editor links */
80
+ export declare class ReferenceRegistry {
81
+ private refs;
82
+ add(ref: ObjectReference): void;
83
+ remove(id: string): void;
84
+ getBySource(sourceId: string): ObjectReference[];
85
+ getByTarget(targetId: string): ObjectReference[];
86
+ getLinked(objectId: string): ObjectReference[];
87
+ getAll(): ObjectReference[];
88
+ }
89
+ /** Property change event used for bidirectional sync */
90
+ export interface PropertyChange {
91
+ objectId: string;
92
+ property: SyncProperty;
93
+ oldValue: unknown;
94
+ newValue: unknown;
95
+ timestamp: number;
96
+ }
97
+ /** Sync engine that keeps linked objects in sync */
98
+ export declare class PropertySyncEngine {
99
+ private registry;
100
+ private listeners;
101
+ constructor(registry: ReferenceRegistry);
102
+ /** Register a listener for propagated changes */
103
+ onSync(callback: (change: PropertyChange, targetId: string) => void): () => void;
104
+ /** Propagate a property change to linked objects */
105
+ propagate(change: PropertyChange): void;
106
+ }
107
+ /** Material definition */
108
+ export interface SpatialMaterial {
109
+ id: string;
110
+ name: string;
111
+ category: MaterialCategory;
112
+ /** Base color (hex) */
113
+ color: string;
114
+ /** Opacity (0-1) */
115
+ opacity: number;
116
+ /** Roughness (0-1, for PBR) */
117
+ roughness?: number;
118
+ /** Metalness (0-1, for PBR) */
119
+ metalness?: number;
120
+ /** Texture URL */
121
+ textureUrl?: string;
122
+ /** Normal map URL */
123
+ normalMapUrl?: string;
124
+ /** Repeat tiling */
125
+ tiling?: {
126
+ x: number;
127
+ y: number;
128
+ };
129
+ /** Tags for searching */
130
+ tags?: string[];
131
+ }
132
+ export type MaterialCategory = 'wood' | 'metal' | 'glass' | 'fabric' | 'stone' | 'concrete' | 'plastic' | 'ceramic' | 'paint' | 'wallpaper' | 'carpet' | 'natural' | 'composite' | 'custom';
133
+ /** Built-in material presets */
134
+ export declare const MATERIAL_PRESETS: SpatialMaterial[];
135
+ /** Material library — searchable collection of materials */
136
+ export declare class MaterialLibrary {
137
+ private materials;
138
+ constructor(presets?: SpatialMaterial[]);
139
+ add(material: SpatialMaterial): void;
140
+ get(id: string): SpatialMaterial | undefined;
141
+ remove(id: string): void;
142
+ getAll(): SpatialMaterial[];
143
+ getByCategory(category: MaterialCategory): SpatialMaterial[];
144
+ search(query: string): SpatialMaterial[];
145
+ }
146
+ /** Snap target definition */
147
+ export interface SnapTarget2D {
148
+ point: Point2D;
149
+ type: 'vertex' | 'edge-midpoint' | 'center' | 'grid' | 'intersection' | 'perpendicular';
150
+ sourceObjectId?: string;
151
+ }
152
+ /** Smart snap configuration */
153
+ export interface SmartSnapConfig {
154
+ enabled: boolean;
155
+ snapToVertices: boolean;
156
+ snapToEdgeMidpoints: boolean;
157
+ snapToCenters: boolean;
158
+ snapToGrid: boolean;
159
+ snapToIntersections: boolean;
160
+ snapToPerpendicular: boolean;
161
+ /** Snap radius in pixels */
162
+ snapRadius: number;
163
+ }
164
+ export declare const DEFAULT_SNAP_CONFIG: SmartSnapConfig;
165
+ /** Find the nearest snap target within radius */
166
+ export declare function findNearestSnap(cursor: Point2D, targets: SnapTarget2D[], radius: number): SnapTarget2D | null;
167
+ /** Grid type */
168
+ export type GridType = 'orthogonal' | 'isometric' | 'hex-flat' | 'hex-pointy';
169
+ /** Grid system configuration */
170
+ export interface GridSystemConfig {
171
+ type: GridType;
172
+ cellSize: number;
173
+ subdivisions: number;
174
+ visible: boolean;
175
+ snapToGrid: boolean;
176
+ color: string;
177
+ subColor: string;
178
+ }
179
+ export declare const DEFAULT_GRID_CONFIGS: Record<GridType, GridSystemConfig>;
180
+ /** Snap a point to the nearest grid position */
181
+ export declare function snapToGridSystem(point: Point2D, config: GridSystemConfig): Point2D;
182
+ /** Shared layer definition */
183
+ export interface SharedLayer {
184
+ id: string;
185
+ name: string;
186
+ visible: boolean;
187
+ locked: boolean;
188
+ opacity: number;
189
+ color: string;
190
+ zIndex: number;
191
+ /** Layer applies to 2D, 3D, or both */
192
+ scope: '2d' | '3d' | 'both';
193
+ }
194
+ /** Layer manager — shared between 2D and 3D editors */
195
+ export declare class LayerManager {
196
+ private layers;
197
+ constructor(defaults?: SharedLayer[]);
198
+ add(layer: SharedLayer): void;
199
+ get(id: string): SharedLayer | undefined;
200
+ remove(id: string): void;
201
+ getAll(): SharedLayer[];
202
+ getVisibleFor(scope: '2d' | '3d'): SharedLayer[];
203
+ setVisibility(id: string, visible: boolean): void;
204
+ setLocked(id: string, locked: boolean): void;
205
+ reorder(id: string, newZIndex: number): void;
206
+ }
207
+ /** Constraint types */
208
+ export type ConstraintType = 'parent-child' | 'align-horizontal' | 'align-vertical' | 'distribute-horizontal' | 'distribute-vertical' | 'distance' | 'angle' | 'parallel' | 'perpendicular' | 'equal-size' | 'mirror' | 'tangent';
209
+ /** Object constraint definition */
210
+ export interface ObjectConstraint {
211
+ id: string;
212
+ type: ConstraintType;
213
+ /** Objects involved */
214
+ objectIds: string[];
215
+ /** Constraint value (distance, angle, etc.) */
216
+ value?: number;
217
+ /** Whether the constraint is satisfied */
218
+ satisfied: boolean;
219
+ }
220
+ /** Evaluate alignment constraints for a set of objects */
221
+ export declare function evaluateConstraint(constraint: ObjectConstraint, getPosition: (id: string) => Point2D | undefined): {
222
+ satisfied: boolean;
223
+ error?: number;
224
+ };
225
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/unified/index.ts"],"names":[],"mappings":"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"}