@pascal-app/core 0.1.3

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 (103) hide show
  1. package/dist/events/bus.d.ts +42 -0
  2. package/dist/events/bus.d.ts.map +1 -0
  3. package/dist/events/bus.js +13 -0
  4. package/dist/hooks/scene-registry/scene-registry.d.ts +18 -0
  5. package/dist/hooks/scene-registry/scene-registry.d.ts.map +1 -0
  6. package/dist/hooks/scene-registry/scene-registry.js +35 -0
  7. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts +90 -0
  8. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts.map +1 -0
  9. package/dist/hooks/spatial-grid/spatial-grid-manager.js +466 -0
  10. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +4 -0
  11. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -0
  12. package/dist/hooks/spatial-grid/spatial-grid-sync.js +115 -0
  13. package/dist/hooks/spatial-grid/spatial-grid.d.ts +23 -0
  14. package/dist/hooks/spatial-grid/spatial-grid.d.ts.map +1 -0
  15. package/dist/hooks/spatial-grid/spatial-grid.js +115 -0
  16. package/dist/hooks/spatial-grid/use-spatial-query.d.ts +16 -0
  17. package/dist/hooks/spatial-grid/use-spatial-query.d.ts.map +1 -0
  18. package/dist/hooks/spatial-grid/use-spatial-query.js +14 -0
  19. package/dist/hooks/spatial-grid/wall-spatial-grid.d.ts +47 -0
  20. package/dist/hooks/spatial-grid/wall-spatial-grid.d.ts.map +1 -0
  21. package/dist/hooks/spatial-grid/wall-spatial-grid.js +113 -0
  22. package/dist/index.d.ts +17 -0
  23. package/dist/index.d.ts.map +1 -0
  24. package/dist/index.js +22 -0
  25. package/dist/lib/asset-storage.d.ts +11 -0
  26. package/dist/lib/asset-storage.d.ts.map +1 -0
  27. package/dist/lib/asset-storage.js +48 -0
  28. package/dist/lib/space-detection.d.ts +34 -0
  29. package/dist/lib/space-detection.d.ts.map +1 -0
  30. package/dist/lib/space-detection.js +499 -0
  31. package/dist/schema/base.d.ts +30 -0
  32. package/dist/schema/base.d.ts.map +1 -0
  33. package/dist/schema/base.js +25 -0
  34. package/dist/schema/camera.d.ts +13 -0
  35. package/dist/schema/camera.d.ts.map +1 -0
  36. package/dist/schema/camera.js +9 -0
  37. package/dist/schema/index.d.ts +17 -0
  38. package/dist/schema/index.d.ts.map +1 -0
  39. package/dist/schema/index.js +18 -0
  40. package/dist/schema/nodes/building.d.ts +25 -0
  41. package/dist/schema/nodes/building.d.ts.map +1 -0
  42. package/dist/schema/nodes/building.js +16 -0
  43. package/dist/schema/nodes/ceiling.d.ts +25 -0
  44. package/dist/schema/nodes/ceiling.d.ts.map +1 -0
  45. package/dist/schema/nodes/ceiling.js +16 -0
  46. package/dist/schema/nodes/guide.d.ts +27 -0
  47. package/dist/schema/nodes/guide.d.ts.map +1 -0
  48. package/dist/schema/nodes/guide.js +11 -0
  49. package/dist/schema/nodes/item.d.ts +65 -0
  50. package/dist/schema/nodes/item.d.ts.map +1 -0
  51. package/dist/schema/nodes/item.js +38 -0
  52. package/dist/schema/nodes/level.d.ts +24 -0
  53. package/dist/schema/nodes/level.d.ts.map +1 -0
  54. package/dist/schema/nodes/level.js +21 -0
  55. package/dist/schema/nodes/roof.d.ts +28 -0
  56. package/dist/schema/nodes/roof.d.ts.map +1 -0
  57. package/dist/schema/nodes/roof.js +28 -0
  58. package/dist/schema/nodes/scan.d.ts +27 -0
  59. package/dist/schema/nodes/scan.d.ts.map +1 -0
  60. package/dist/schema/nodes/scan.js +11 -0
  61. package/dist/schema/nodes/site.d.ts +90 -0
  62. package/dist/schema/nodes/site.d.ts.map +1 -0
  63. package/dist/schema/nodes/site.js +39 -0
  64. package/dist/schema/nodes/slab.d.ts +24 -0
  65. package/dist/schema/nodes/slab.d.ts.map +1 -0
  66. package/dist/schema/nodes/slab.js +15 -0
  67. package/dist/schema/nodes/wall.d.ts +37 -0
  68. package/dist/schema/nodes/wall.d.ts.map +1 -0
  69. package/dist/schema/nodes/wall.js +30 -0
  70. package/dist/schema/nodes/zone.d.ts +24 -0
  71. package/dist/schema/nodes/zone.d.ts.map +1 -0
  72. package/dist/schema/nodes/zone.js +22 -0
  73. package/dist/schema/types.d.ts +339 -0
  74. package/dist/schema/types.d.ts.map +1 -0
  75. package/dist/schema/types.js +25 -0
  76. package/dist/store/actions/node-actions.d.ts +12 -0
  77. package/dist/store/actions/node-actions.d.ts.map +1 -0
  78. package/dist/store/actions/node-actions.js +121 -0
  79. package/dist/store/use-scene.d.ts +31 -0
  80. package/dist/store/use-scene.d.ts.map +1 -0
  81. package/dist/store/use-scene.js +127 -0
  82. package/dist/systems/ceiling/ceiling-system.d.ts +8 -0
  83. package/dist/systems/ceiling/ceiling-system.d.ts.map +1 -0
  84. package/dist/systems/ceiling/ceiling-system.js +65 -0
  85. package/dist/systems/item/item-system.d.ts +2 -0
  86. package/dist/systems/item/item-system.d.ts.map +1 -0
  87. package/dist/systems/item/item-system.js +43 -0
  88. package/dist/systems/roof/roof-system.d.ts +8 -0
  89. package/dist/systems/roof/roof-system.d.ts.map +1 -0
  90. package/dist/systems/roof/roof-system.js +254 -0
  91. package/dist/systems/slab/slab-system.d.ts +8 -0
  92. package/dist/systems/slab/slab-system.d.ts.map +1 -0
  93. package/dist/systems/slab/slab-system.js +117 -0
  94. package/dist/systems/wall/wall-mitering.d.ts +32 -0
  95. package/dist/systems/wall/wall-mitering.d.ts.map +1 -0
  96. package/dist/systems/wall/wall-mitering.js +214 -0
  97. package/dist/systems/wall/wall-system.d.ts +12 -0
  98. package/dist/systems/wall/wall-system.d.ts.map +1 -0
  99. package/dist/systems/wall/wall-system.js +286 -0
  100. package/dist/utils/types.d.ts +6 -0
  101. package/dist/utils/types.d.ts.map +1 -0
  102. package/dist/utils/types.js +7 -0
  103. package/package.json +58 -0
@@ -0,0 +1,22 @@
1
+ import dedent from 'dedent';
2
+ import { z } from 'zod';
3
+ import { BaseNode, nodeType, objectId } from '../base';
4
+ export const ZoneNode = BaseNode.extend({
5
+ id: objectId('zone'),
6
+ type: nodeType('zone'),
7
+ name: z.string(),
8
+ // Polygon boundary - array of [x, z] coordinates defining the zone
9
+ polygon: z.array(z.tuple([z.number(), z.number()])),
10
+ // Visual styling
11
+ color: z.string().default('#3b82f6'), // Default blue
12
+ metadata: z.json().optional().default({}),
13
+ }).describe(dedent `
14
+ Zone schema - a polygon zone attached to a level
15
+ - object: "zone"
16
+ - id: zone id
17
+ - levelId: level this zone is attached to
18
+ - name: zone name
19
+ - polygon: array of [x, z] points defining the zone boundary
20
+ - color: hex color for visual styling
21
+ - metadata: zone metadata (optional)
22
+ `);
@@ -0,0 +1,339 @@
1
+ import z from 'zod';
2
+ export declare const AnyNode: z.ZodDiscriminatedUnion<[z.ZodObject<{
3
+ object: z.ZodDefault<z.ZodLiteral<"node">>;
4
+ name: z.ZodOptional<z.ZodString>;
5
+ parentId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
6
+ visible: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
7
+ camera: z.ZodOptional<z.ZodObject<{
8
+ position: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
9
+ target: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
10
+ mode: z.ZodDefault<z.ZodEnum<{
11
+ perspective: "perspective";
12
+ orthographic: "orthographic";
13
+ }>>;
14
+ fov: z.ZodOptional<z.ZodNumber>;
15
+ zoom: z.ZodOptional<z.ZodNumber>;
16
+ }, z.core.$strip>>;
17
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
18
+ id: z.ZodDefault<z.ZodTemplateLiteral<`site_${string}`>>;
19
+ type: z.ZodDefault<z.ZodLiteral<"site">>;
20
+ polygon: z.ZodDefault<z.ZodOptional<z.ZodObject<{
21
+ type: z.ZodLiteral<"polygon">;
22
+ points: z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
23
+ }, z.core.$strip>>>;
24
+ children: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
25
+ object: z.ZodDefault<z.ZodLiteral<"node">>;
26
+ name: z.ZodOptional<z.ZodString>;
27
+ parentId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
28
+ visible: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
29
+ camera: z.ZodOptional<z.ZodObject<{
30
+ position: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
31
+ target: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
32
+ mode: z.ZodDefault<z.ZodEnum<{
33
+ perspective: "perspective";
34
+ orthographic: "orthographic";
35
+ }>>;
36
+ fov: z.ZodOptional<z.ZodNumber>;
37
+ zoom: z.ZodOptional<z.ZodNumber>;
38
+ }, z.core.$strip>>;
39
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
40
+ id: z.ZodDefault<z.ZodTemplateLiteral<`building_${string}`>>;
41
+ type: z.ZodDefault<z.ZodLiteral<"building">>;
42
+ children: z.ZodDefault<z.ZodArray<z.ZodDefault<z.ZodTemplateLiteral<`level_${string}`>>>>;
43
+ position: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
44
+ rotation: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
45
+ }, z.core.$strip>, z.ZodObject<{
46
+ object: z.ZodDefault<z.ZodLiteral<"node">>;
47
+ name: z.ZodOptional<z.ZodString>;
48
+ parentId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
49
+ visible: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
50
+ camera: z.ZodOptional<z.ZodObject<{
51
+ position: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
52
+ target: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
53
+ mode: z.ZodDefault<z.ZodEnum<{
54
+ perspective: "perspective";
55
+ orthographic: "orthographic";
56
+ }>>;
57
+ fov: z.ZodOptional<z.ZodNumber>;
58
+ zoom: z.ZodOptional<z.ZodNumber>;
59
+ }, z.core.$strip>>;
60
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
61
+ id: z.ZodDefault<z.ZodTemplateLiteral<`item_${string}`>>;
62
+ type: z.ZodDefault<z.ZodLiteral<"item">>;
63
+ position: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
64
+ rotation: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
65
+ side: z.ZodOptional<z.ZodEnum<{
66
+ front: "front";
67
+ back: "back";
68
+ }>>;
69
+ wallId: z.ZodOptional<z.ZodString>;
70
+ wallT: z.ZodOptional<z.ZodNumber>;
71
+ asset: z.ZodObject<{
72
+ id: z.ZodString;
73
+ category: z.ZodString;
74
+ name: z.ZodString;
75
+ thumbnail: z.ZodString;
76
+ src: z.ZodString;
77
+ dimensions: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
78
+ attachTo: z.ZodOptional<z.ZodEnum<{
79
+ wall: "wall";
80
+ "wall-side": "wall-side";
81
+ ceiling: "ceiling";
82
+ }>>;
83
+ offset: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
84
+ rotation: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
85
+ scale: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
86
+ }, z.core.$strip>;
87
+ }, z.core.$strip>], "type">>>;
88
+ }, z.core.$strip>, z.ZodObject<{
89
+ object: z.ZodDefault<z.ZodLiteral<"node">>;
90
+ name: z.ZodOptional<z.ZodString>;
91
+ parentId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
92
+ visible: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
93
+ camera: z.ZodOptional<z.ZodObject<{
94
+ position: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
95
+ target: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
96
+ mode: z.ZodDefault<z.ZodEnum<{
97
+ perspective: "perspective";
98
+ orthographic: "orthographic";
99
+ }>>;
100
+ fov: z.ZodOptional<z.ZodNumber>;
101
+ zoom: z.ZodOptional<z.ZodNumber>;
102
+ }, z.core.$strip>>;
103
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
104
+ id: z.ZodDefault<z.ZodTemplateLiteral<`building_${string}`>>;
105
+ type: z.ZodDefault<z.ZodLiteral<"building">>;
106
+ children: z.ZodDefault<z.ZodArray<z.ZodDefault<z.ZodTemplateLiteral<`level_${string}`>>>>;
107
+ position: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
108
+ rotation: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
109
+ }, z.core.$strip>, z.ZodObject<{
110
+ object: z.ZodDefault<z.ZodLiteral<"node">>;
111
+ name: z.ZodOptional<z.ZodString>;
112
+ parentId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
113
+ visible: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
114
+ camera: z.ZodOptional<z.ZodObject<{
115
+ position: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
116
+ target: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
117
+ mode: z.ZodDefault<z.ZodEnum<{
118
+ perspective: "perspective";
119
+ orthographic: "orthographic";
120
+ }>>;
121
+ fov: z.ZodOptional<z.ZodNumber>;
122
+ zoom: z.ZodOptional<z.ZodNumber>;
123
+ }, z.core.$strip>>;
124
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
125
+ id: z.ZodDefault<z.ZodTemplateLiteral<`level_${string}`>>;
126
+ type: z.ZodDefault<z.ZodLiteral<"level">>;
127
+ children: z.ZodDefault<z.ZodArray<z.ZodUnion<readonly [z.ZodDefault<z.ZodTemplateLiteral<`wall_${string}`>>, z.ZodDefault<z.ZodTemplateLiteral<`zone_${string}`>>, z.ZodDefault<z.ZodTemplateLiteral<`slab_${string}`>>, z.ZodDefault<z.ZodTemplateLiteral<`ceiling_${string}`>>, z.ZodDefault<z.ZodTemplateLiteral<`roof_${string}`>>, z.ZodDefault<z.ZodTemplateLiteral<`scan_${string}`>>, z.ZodDefault<z.ZodTemplateLiteral<`guide_${string}`>>]>>>;
128
+ level: z.ZodDefault<z.ZodNumber>;
129
+ }, z.core.$strip>, z.ZodObject<{
130
+ object: z.ZodDefault<z.ZodLiteral<"node">>;
131
+ name: z.ZodOptional<z.ZodString>;
132
+ parentId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
133
+ visible: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
134
+ camera: z.ZodOptional<z.ZodObject<{
135
+ position: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
136
+ target: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
137
+ mode: z.ZodDefault<z.ZodEnum<{
138
+ perspective: "perspective";
139
+ orthographic: "orthographic";
140
+ }>>;
141
+ fov: z.ZodOptional<z.ZodNumber>;
142
+ zoom: z.ZodOptional<z.ZodNumber>;
143
+ }, z.core.$strip>>;
144
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
145
+ id: z.ZodDefault<z.ZodTemplateLiteral<`wall_${string}`>>;
146
+ type: z.ZodDefault<z.ZodLiteral<"wall">>;
147
+ children: z.ZodDefault<z.ZodArray<z.ZodDefault<z.ZodTemplateLiteral<`item_${string}`>>>>;
148
+ thickness: z.ZodOptional<z.ZodNumber>;
149
+ height: z.ZodOptional<z.ZodNumber>;
150
+ start: z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>;
151
+ end: z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>;
152
+ frontSide: z.ZodDefault<z.ZodEnum<{
153
+ unknown: "unknown";
154
+ interior: "interior";
155
+ exterior: "exterior";
156
+ }>>;
157
+ backSide: z.ZodDefault<z.ZodEnum<{
158
+ unknown: "unknown";
159
+ interior: "interior";
160
+ exterior: "exterior";
161
+ }>>;
162
+ }, z.core.$strip>, z.ZodObject<{
163
+ object: z.ZodDefault<z.ZodLiteral<"node">>;
164
+ name: z.ZodOptional<z.ZodString>;
165
+ parentId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
166
+ visible: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
167
+ camera: z.ZodOptional<z.ZodObject<{
168
+ position: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
169
+ target: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
170
+ mode: z.ZodDefault<z.ZodEnum<{
171
+ perspective: "perspective";
172
+ orthographic: "orthographic";
173
+ }>>;
174
+ fov: z.ZodOptional<z.ZodNumber>;
175
+ zoom: z.ZodOptional<z.ZodNumber>;
176
+ }, z.core.$strip>>;
177
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
178
+ id: z.ZodDefault<z.ZodTemplateLiteral<`item_${string}`>>;
179
+ type: z.ZodDefault<z.ZodLiteral<"item">>;
180
+ position: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
181
+ rotation: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
182
+ side: z.ZodOptional<z.ZodEnum<{
183
+ front: "front";
184
+ back: "back";
185
+ }>>;
186
+ wallId: z.ZodOptional<z.ZodString>;
187
+ wallT: z.ZodOptional<z.ZodNumber>;
188
+ asset: z.ZodObject<{
189
+ id: z.ZodString;
190
+ category: z.ZodString;
191
+ name: z.ZodString;
192
+ thumbnail: z.ZodString;
193
+ src: z.ZodString;
194
+ dimensions: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
195
+ attachTo: z.ZodOptional<z.ZodEnum<{
196
+ wall: "wall";
197
+ "wall-side": "wall-side";
198
+ ceiling: "ceiling";
199
+ }>>;
200
+ offset: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
201
+ rotation: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
202
+ scale: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
203
+ }, z.core.$strip>;
204
+ }, z.core.$strip>, z.ZodObject<{
205
+ object: z.ZodDefault<z.ZodLiteral<"node">>;
206
+ parentId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
207
+ visible: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
208
+ camera: z.ZodOptional<z.ZodObject<{
209
+ position: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
210
+ target: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
211
+ mode: z.ZodDefault<z.ZodEnum<{
212
+ perspective: "perspective";
213
+ orthographic: "orthographic";
214
+ }>>;
215
+ fov: z.ZodOptional<z.ZodNumber>;
216
+ zoom: z.ZodOptional<z.ZodNumber>;
217
+ }, z.core.$strip>>;
218
+ id: z.ZodDefault<z.ZodTemplateLiteral<`zone_${string}`>>;
219
+ type: z.ZodDefault<z.ZodLiteral<"zone">>;
220
+ name: z.ZodString;
221
+ polygon: z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
222
+ color: z.ZodDefault<z.ZodString>;
223
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
224
+ }, z.core.$strip>, z.ZodObject<{
225
+ object: z.ZodDefault<z.ZodLiteral<"node">>;
226
+ name: z.ZodOptional<z.ZodString>;
227
+ parentId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
228
+ visible: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
229
+ camera: z.ZodOptional<z.ZodObject<{
230
+ position: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
231
+ target: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
232
+ mode: z.ZodDefault<z.ZodEnum<{
233
+ perspective: "perspective";
234
+ orthographic: "orthographic";
235
+ }>>;
236
+ fov: z.ZodOptional<z.ZodNumber>;
237
+ zoom: z.ZodOptional<z.ZodNumber>;
238
+ }, z.core.$strip>>;
239
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
240
+ id: z.ZodDefault<z.ZodTemplateLiteral<`slab_${string}`>>;
241
+ type: z.ZodDefault<z.ZodLiteral<"slab">>;
242
+ polygon: z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
243
+ elevation: z.ZodDefault<z.ZodNumber>;
244
+ }, z.core.$strip>, z.ZodObject<{
245
+ object: z.ZodDefault<z.ZodLiteral<"node">>;
246
+ name: z.ZodOptional<z.ZodString>;
247
+ parentId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
248
+ visible: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
249
+ camera: z.ZodOptional<z.ZodObject<{
250
+ position: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
251
+ target: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
252
+ mode: z.ZodDefault<z.ZodEnum<{
253
+ perspective: "perspective";
254
+ orthographic: "orthographic";
255
+ }>>;
256
+ fov: z.ZodOptional<z.ZodNumber>;
257
+ zoom: z.ZodOptional<z.ZodNumber>;
258
+ }, z.core.$strip>>;
259
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
260
+ id: z.ZodDefault<z.ZodTemplateLiteral<`ceiling_${string}`>>;
261
+ type: z.ZodDefault<z.ZodLiteral<"ceiling">>;
262
+ children: z.ZodDefault<z.ZodArray<z.ZodDefault<z.ZodTemplateLiteral<`item_${string}`>>>>;
263
+ polygon: z.ZodArray<z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>>;
264
+ height: z.ZodDefault<z.ZodNumber>;
265
+ }, z.core.$strip>, z.ZodObject<{
266
+ object: z.ZodDefault<z.ZodLiteral<"node">>;
267
+ name: z.ZodOptional<z.ZodString>;
268
+ parentId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
269
+ visible: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
270
+ camera: z.ZodOptional<z.ZodObject<{
271
+ position: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
272
+ target: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
273
+ mode: z.ZodDefault<z.ZodEnum<{
274
+ perspective: "perspective";
275
+ orthographic: "orthographic";
276
+ }>>;
277
+ fov: z.ZodOptional<z.ZodNumber>;
278
+ zoom: z.ZodOptional<z.ZodNumber>;
279
+ }, z.core.$strip>>;
280
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
281
+ id: z.ZodDefault<z.ZodTemplateLiteral<`roof_${string}`>>;
282
+ type: z.ZodDefault<z.ZodLiteral<"roof">>;
283
+ position: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
284
+ rotation: z.ZodDefault<z.ZodNumber>;
285
+ length: z.ZodDefault<z.ZodNumber>;
286
+ height: z.ZodDefault<z.ZodNumber>;
287
+ leftWidth: z.ZodDefault<z.ZodNumber>;
288
+ rightWidth: z.ZodDefault<z.ZodNumber>;
289
+ }, z.core.$strip>, z.ZodObject<{
290
+ object: z.ZodDefault<z.ZodLiteral<"node">>;
291
+ name: z.ZodOptional<z.ZodString>;
292
+ parentId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
293
+ visible: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
294
+ camera: z.ZodOptional<z.ZodObject<{
295
+ position: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
296
+ target: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
297
+ mode: z.ZodDefault<z.ZodEnum<{
298
+ perspective: "perspective";
299
+ orthographic: "orthographic";
300
+ }>>;
301
+ fov: z.ZodOptional<z.ZodNumber>;
302
+ zoom: z.ZodOptional<z.ZodNumber>;
303
+ }, z.core.$strip>>;
304
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
305
+ id: z.ZodDefault<z.ZodTemplateLiteral<`scan_${string}`>>;
306
+ type: z.ZodDefault<z.ZodLiteral<"scan">>;
307
+ url: z.ZodString;
308
+ position: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
309
+ rotation: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
310
+ scale: z.ZodDefault<z.ZodNumber>;
311
+ opacity: z.ZodDefault<z.ZodNumber>;
312
+ }, z.core.$strip>, z.ZodObject<{
313
+ object: z.ZodDefault<z.ZodLiteral<"node">>;
314
+ name: z.ZodOptional<z.ZodString>;
315
+ parentId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
316
+ visible: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
317
+ camera: z.ZodOptional<z.ZodObject<{
318
+ position: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
319
+ target: z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>;
320
+ mode: z.ZodDefault<z.ZodEnum<{
321
+ perspective: "perspective";
322
+ orthographic: "orthographic";
323
+ }>>;
324
+ fov: z.ZodOptional<z.ZodNumber>;
325
+ zoom: z.ZodOptional<z.ZodNumber>;
326
+ }, z.core.$strip>>;
327
+ metadata: z.ZodDefault<z.ZodOptional<z.ZodJSONSchema>>;
328
+ id: z.ZodDefault<z.ZodTemplateLiteral<`guide_${string}`>>;
329
+ type: z.ZodDefault<z.ZodLiteral<"guide">>;
330
+ url: z.ZodString;
331
+ position: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
332
+ rotation: z.ZodDefault<z.ZodTuple<[z.ZodNumber, z.ZodNumber, z.ZodNumber], null>>;
333
+ scale: z.ZodDefault<z.ZodNumber>;
334
+ opacity: z.ZodDefault<z.ZodNumber>;
335
+ }, z.core.$strip>], "type">;
336
+ export type AnyNode = z.infer<typeof AnyNode>;
337
+ export type AnyNodeType = AnyNode['type'];
338
+ export type AnyNodeId = AnyNode['id'];
339
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/schema/types.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAA;AAanB,eAAO,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2BAYlB,CAAA;AAEF,MAAM,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,OAAO,CAAC,CAAA;AAC7C,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAAA;AACzC,MAAM,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA"}
@@ -0,0 +1,25 @@
1
+ import z from 'zod';
2
+ import { BuildingNode } from './nodes/building';
3
+ import { CeilingNode } from './nodes/ceiling';
4
+ import { GuideNode } from './nodes/guide';
5
+ import { ItemNode } from './nodes/item';
6
+ import { LevelNode } from './nodes/level';
7
+ import { RoofNode } from './nodes/roof';
8
+ import { ScanNode } from './nodes/scan';
9
+ import { SiteNode } from './nodes/site';
10
+ import { SlabNode } from './nodes/slab';
11
+ import { WallNode } from './nodes/wall';
12
+ import { ZoneNode } from './nodes/zone';
13
+ export const AnyNode = z.discriminatedUnion('type', [
14
+ SiteNode,
15
+ BuildingNode,
16
+ LevelNode,
17
+ WallNode,
18
+ ItemNode,
19
+ ZoneNode,
20
+ SlabNode,
21
+ CeilingNode,
22
+ RoofNode,
23
+ ScanNode,
24
+ GuideNode,
25
+ ]);
@@ -0,0 +1,12 @@
1
+ import type { AnyNode, AnyNodeId } from '../../schema';
2
+ import type { SceneState } from '../use-scene';
3
+ export declare const createNodesAction: (set: (fn: (state: SceneState) => Partial<SceneState>) => void, get: () => SceneState, ops: {
4
+ node: AnyNode;
5
+ parentId?: AnyNodeId;
6
+ }[]) => void;
7
+ export declare const updateNodesAction: (set: (fn: (state: SceneState) => Partial<SceneState>) => void, get: () => SceneState, updates: {
8
+ id: AnyNodeId;
9
+ data: Partial<AnyNode>;
10
+ }[]) => void;
11
+ export declare const deleteNodesAction: (set: (fn: (state: SceneState) => Partial<SceneState>) => void, get: () => SceneState, ids: AnyNodeId[]) => void;
12
+ //# sourceMappingURL=node-actions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-actions.d.ts","sourceRoot":"","sources":["../../../src/store/actions/node-actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAI9C,eAAO,MAAM,iBAAiB,GAC5B,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,UAAU,CAAC,KAAK,IAAI,EAC7D,KAAK,MAAM,UAAU,EACrB,KAAK;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;CAAE,EAAE,SA2C/C,CAAA;AAED,eAAO,MAAM,iBAAiB,GAC5B,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,UAAU,CAAC,KAAK,IAAI,EAC7D,KAAK,MAAM,UAAU,EACrB,SAAS;IAAE,EAAE,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE,EAAE,SAoDrD,CAAA;AAED,eAAO,MAAM,iBAAiB,GAC5B,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,OAAO,CAAC,UAAU,CAAC,KAAK,IAAI,EAC7D,KAAK,MAAM,UAAU,EACrB,KAAK,SAAS,EAAE,SA2CjB,CAAA"}
@@ -0,0 +1,121 @@
1
+ export const createNodesAction = (set, get, ops) => {
2
+ set((state) => {
3
+ const nextNodes = { ...state.nodes };
4
+ const nextRootIds = [...state.rootNodeIds];
5
+ for (const { node, parentId } of ops) {
6
+ // 1. Assign parentId to the child (Safe because BaseNode has parentId)
7
+ const newNode = {
8
+ ...node,
9
+ parentId: parentId ?? null,
10
+ };
11
+ nextNodes[newNode.id] = newNode;
12
+ // 2. Update the Parent's children list
13
+ if (parentId && nextNodes[parentId]) {
14
+ const parent = nextNodes[parentId];
15
+ // Type Guard: Check if the parent node is a container that supports children
16
+ if ('children' in parent && Array.isArray(parent.children)) {
17
+ nextNodes[parentId] = {
18
+ ...parent,
19
+ // Use Set to prevent duplicate IDs if createNode is called twice
20
+ children: Array.from(new Set([...parent.children, newNode.id])), // We don't verify child types here
21
+ };
22
+ }
23
+ }
24
+ else if (!parentId) {
25
+ // 3. Handle Root nodes
26
+ if (!nextRootIds.includes(newNode.id)) {
27
+ nextRootIds.push(newNode.id);
28
+ }
29
+ }
30
+ }
31
+ return { nodes: nextNodes, rootNodeIds: nextRootIds };
32
+ });
33
+ // 4. System Sync
34
+ ops.forEach(({ node, parentId }) => {
35
+ get().markDirty(node.id);
36
+ if (parentId)
37
+ get().markDirty(parentId);
38
+ });
39
+ };
40
+ export const updateNodesAction = (set, get, updates) => {
41
+ const parentsToUpdate = new Set();
42
+ set((state) => {
43
+ const nextNodes = { ...state.nodes };
44
+ for (const { id, data } of updates) {
45
+ const currentNode = nextNodes[id];
46
+ if (!currentNode)
47
+ continue;
48
+ // Handle Reparenting Logic
49
+ if (data.parentId !== undefined && data.parentId !== currentNode.parentId) {
50
+ // 1. Remove from old parent
51
+ const oldParentId = currentNode.parentId;
52
+ if (oldParentId && nextNodes[oldParentId]) {
53
+ const oldParent = nextNodes[oldParentId];
54
+ nextNodes[oldParent.id] = {
55
+ ...oldParent,
56
+ children: oldParent.children.filter((childId) => childId !== id),
57
+ };
58
+ parentsToUpdate.add(oldParent.id);
59
+ }
60
+ // 2. Add to new parent
61
+ const newParentId = data.parentId;
62
+ if (newParentId && nextNodes[newParentId]) {
63
+ const newParent = nextNodes[newParentId];
64
+ nextNodes[newParent.id] = {
65
+ ...newParent,
66
+ children: Array.from(new Set([...newParent.children, id])),
67
+ };
68
+ parentsToUpdate.add(newParent.id);
69
+ }
70
+ }
71
+ // Apply the update
72
+ nextNodes[id] = { ...nextNodes[id], ...data };
73
+ }
74
+ return { nodes: nextNodes };
75
+ });
76
+ // Mark dirty after the next frame to ensure React renders complete
77
+ requestAnimationFrame(() => {
78
+ updates.forEach((u) => {
79
+ get().markDirty(u.id);
80
+ });
81
+ parentsToUpdate.forEach((pId) => {
82
+ get().markDirty(pId);
83
+ });
84
+ });
85
+ };
86
+ export const deleteNodesAction = (set, get, ids) => {
87
+ const parentsToMarkDirty = new Set();
88
+ set((state) => {
89
+ const nextNodes = { ...state.nodes };
90
+ let nextRootIds = [...state.rootNodeIds];
91
+ for (const id of ids) {
92
+ const node = nextNodes[id];
93
+ if (!node)
94
+ continue;
95
+ // 1. Remove reference from Parent
96
+ const parentId = node.parentId;
97
+ if (parentId && nextNodes[parentId]) {
98
+ const parent = nextNodes[parentId];
99
+ if (parent.children) {
100
+ nextNodes[parent.id] = {
101
+ ...parent,
102
+ children: parent.children.filter((cid) => cid !== id),
103
+ };
104
+ parentsToMarkDirty.add(parent.id);
105
+ }
106
+ }
107
+ // 2. Remove from Root list
108
+ nextRootIds = nextRootIds.filter((rid) => rid !== id);
109
+ // 3. Delete the node itself
110
+ delete nextNodes[id];
111
+ // Inside the deleteNodes loop
112
+ if ('children' in node && node.children.length > 0) {
113
+ // Recursively delete all children first
114
+ get().deleteNodes(node.children);
115
+ }
116
+ }
117
+ return { nodes: nextNodes, rootNodeIds: nextRootIds };
118
+ });
119
+ // Notify systems that the parent has changed (e.g. Wall needs to fill a window hole)
120
+ parentsToMarkDirty.forEach((pId) => get().markDirty(pId));
121
+ };
@@ -0,0 +1,31 @@
1
+ import type { TemporalState } from 'zundo';
2
+ import { type StoreApi, type UseBoundStore } from 'zustand';
3
+ import type { AnyNode, AnyNodeId } from '../schema/types';
4
+ export type SceneState = {
5
+ nodes: Record<AnyNodeId, AnyNode>;
6
+ rootNodeIds: AnyNodeId[];
7
+ dirtyNodes: Set<AnyNodeId>;
8
+ loadScene: () => void;
9
+ clearScene: () => void;
10
+ setScene: (nodes: Record<AnyNodeId, AnyNode>, rootNodeIds: AnyNodeId[]) => void;
11
+ markDirty: (id: AnyNodeId) => void;
12
+ clearDirty: (id: AnyNodeId) => void;
13
+ createNode: (node: AnyNode, parentId?: AnyNodeId) => void;
14
+ createNodes: (ops: {
15
+ node: AnyNode;
16
+ parentId?: AnyNodeId;
17
+ }[]) => void;
18
+ updateNode: (id: AnyNodeId, data: Partial<AnyNode>) => void;
19
+ updateNodes: (updates: {
20
+ id: AnyNodeId;
21
+ data: Partial<AnyNode>;
22
+ }[]) => void;
23
+ deleteNode: (id: AnyNodeId) => void;
24
+ deleteNodes: (ids: AnyNodeId[]) => void;
25
+ };
26
+ type UseSceneStore = UseBoundStore<StoreApi<SceneState>> & {
27
+ temporal: StoreApi<TemporalState<Pick<SceneState, 'nodes' | 'rootNodeIds'>>>;
28
+ };
29
+ declare const useScene: UseSceneStore;
30
+ export default useScene;
31
+ //# sourceMappingURL=use-scene.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-scene.d.ts","sourceRoot":"","sources":["../../src/store/use-scene.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAE1C,OAAO,EAAU,KAAK,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,SAAS,CAAA;AAInE,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAIzD,MAAM,MAAM,UAAU,GAAG;IAEvB,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IAGjC,WAAW,EAAE,SAAS,EAAE,CAAA;IAGxB,UAAU,EAAE,GAAG,CAAC,SAAS,CAAC,CAAA;IAG1B,SAAS,EAAE,MAAM,IAAI,CAAA;IACrB,UAAU,EAAE,MAAM,IAAI,CAAA;IACtB,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,IAAI,CAAA;IAE/E,SAAS,EAAE,CAAC,EAAE,EAAE,SAAS,KAAK,IAAI,CAAA;IAClC,UAAU,EAAE,CAAC,EAAE,EAAE,SAAS,KAAK,IAAI,CAAA;IAEnC,UAAU,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,KAAK,IAAI,CAAA;IACzD,WAAW,EAAE,CAAC,GAAG,EAAE;QAAE,IAAI,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,EAAE,SAAS,CAAA;KAAE,EAAE,KAAK,IAAI,CAAA;IAErE,UAAU,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,CAAA;IAC3D,WAAW,EAAE,CAAC,OAAO,EAAE;QAAE,EAAE,EAAE,SAAS,CAAC;QAAC,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE,EAAE,KAAK,IAAI,CAAA;IAE3E,UAAU,EAAE,CAAC,EAAE,EAAE,SAAS,KAAK,IAAI,CAAA;IACnC,WAAW,EAAE,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,IAAI,CAAA;CACxC,CAAA;AAID,KAAK,aAAa,GAAG,aAAa,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,GAAG;IACzD,QAAQ,EAAE,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,aAAa,CAAC,CAAC,CAAC,CAAA;CAC7E,CAAA;AAED,QAAA,MAAM,QAAQ,EAAE,aA0Hf,CAAA;AAED,eAAe,QAAQ,CAAA"}