@pascal-app/editor 0.4.0

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 (165) hide show
  1. package/package.json +62 -0
  2. package/src/components/editor/custom-camera-controls.tsx +387 -0
  3. package/src/components/editor/editor-layout-v2.tsx +220 -0
  4. package/src/components/editor/export-manager.tsx +78 -0
  5. package/src/components/editor/first-person-controls.tsx +249 -0
  6. package/src/components/editor/floating-action-menu.tsx +231 -0
  7. package/src/components/editor/floorplan-panel.tsx +9609 -0
  8. package/src/components/editor/grid.tsx +161 -0
  9. package/src/components/editor/index.tsx +928 -0
  10. package/src/components/editor/node-action-menu.tsx +66 -0
  11. package/src/components/editor/preset-thumbnail-generator.tsx +125 -0
  12. package/src/components/editor/selection-manager.tsx +897 -0
  13. package/src/components/editor/site-edge-labels.tsx +90 -0
  14. package/src/components/editor/thumbnail-generator.tsx +166 -0
  15. package/src/components/editor/wall-measurement-label.tsx +258 -0
  16. package/src/components/feedback-dialog.tsx +265 -0
  17. package/src/components/pascal-radio.tsx +280 -0
  18. package/src/components/preview-button.tsx +16 -0
  19. package/src/components/systems/ceiling/ceiling-system.tsx +77 -0
  20. package/src/components/systems/roof/roof-edit-system.tsx +69 -0
  21. package/src/components/systems/stair/stair-edit-system.tsx +69 -0
  22. package/src/components/systems/zone/zone-label-editor-system.tsx +320 -0
  23. package/src/components/systems/zone/zone-system.tsx +87 -0
  24. package/src/components/tools/ceiling/ceiling-boundary-editor.tsx +42 -0
  25. package/src/components/tools/ceiling/ceiling-hole-editor.tsx +47 -0
  26. package/src/components/tools/ceiling/ceiling-tool.tsx +465 -0
  27. package/src/components/tools/door/door-math.ts +110 -0
  28. package/src/components/tools/door/door-tool.tsx +293 -0
  29. package/src/components/tools/door/move-door-tool.tsx +373 -0
  30. package/src/components/tools/item/item-tool.tsx +26 -0
  31. package/src/components/tools/item/move-tool.tsx +90 -0
  32. package/src/components/tools/item/placement-math.ts +85 -0
  33. package/src/components/tools/item/placement-strategies.ts +556 -0
  34. package/src/components/tools/item/placement-types.ts +117 -0
  35. package/src/components/tools/item/use-draft-node.ts +227 -0
  36. package/src/components/tools/item/use-placement-coordinator.tsx +877 -0
  37. package/src/components/tools/roof/move-roof-tool.tsx +288 -0
  38. package/src/components/tools/roof/roof-tool.tsx +318 -0
  39. package/src/components/tools/select/box-select-tool.tsx +626 -0
  40. package/src/components/tools/shared/cursor-sphere.tsx +119 -0
  41. package/src/components/tools/shared/polygon-editor.tsx +361 -0
  42. package/src/components/tools/site/site-boundary-editor.tsx +42 -0
  43. package/src/components/tools/slab/slab-boundary-editor.tsx +42 -0
  44. package/src/components/tools/slab/slab-hole-editor.tsx +47 -0
  45. package/src/components/tools/slab/slab-tool.tsx +322 -0
  46. package/src/components/tools/stair/stair-defaults.ts +7 -0
  47. package/src/components/tools/stair/stair-tool.tsx +194 -0
  48. package/src/components/tools/tool-manager.tsx +120 -0
  49. package/src/components/tools/wall/wall-drafting.ts +140 -0
  50. package/src/components/tools/wall/wall-tool.tsx +210 -0
  51. package/src/components/tools/window/move-window-tool.tsx +410 -0
  52. package/src/components/tools/window/window-math.ts +117 -0
  53. package/src/components/tools/window/window-tool.tsx +303 -0
  54. package/src/components/tools/zone/zone-boundary-editor.tsx +39 -0
  55. package/src/components/tools/zone/zone-tool.tsx +364 -0
  56. package/src/components/ui/action-menu/action-button.tsx +59 -0
  57. package/src/components/ui/action-menu/camera-actions.tsx +74 -0
  58. package/src/components/ui/action-menu/control-modes.tsx +240 -0
  59. package/src/components/ui/action-menu/furnish-tools.tsx +102 -0
  60. package/src/components/ui/action-menu/index.tsx +152 -0
  61. package/src/components/ui/action-menu/structure-tools.tsx +100 -0
  62. package/src/components/ui/action-menu/view-toggles.tsx +397 -0
  63. package/src/components/ui/command-palette/editor-commands.tsx +396 -0
  64. package/src/components/ui/command-palette/index.tsx +730 -0
  65. package/src/components/ui/controls/action-button.tsx +33 -0
  66. package/src/components/ui/controls/material-picker.tsx +194 -0
  67. package/src/components/ui/controls/metric-control.tsx +262 -0
  68. package/src/components/ui/controls/panel-section.tsx +65 -0
  69. package/src/components/ui/controls/segmented-control.tsx +45 -0
  70. package/src/components/ui/controls/slider-control.tsx +245 -0
  71. package/src/components/ui/controls/toggle-control.tsx +38 -0
  72. package/src/components/ui/floating-level-selector.tsx +355 -0
  73. package/src/components/ui/helpers/ceiling-helper.tsx +20 -0
  74. package/src/components/ui/helpers/helper-manager.tsx +33 -0
  75. package/src/components/ui/helpers/item-helper.tsx +40 -0
  76. package/src/components/ui/helpers/roof-helper.tsx +16 -0
  77. package/src/components/ui/helpers/slab-helper.tsx +20 -0
  78. package/src/components/ui/helpers/wall-helper.tsx +20 -0
  79. package/src/components/ui/item-catalog/catalog-items.tsx +1580 -0
  80. package/src/components/ui/item-catalog/item-catalog.tsx +219 -0
  81. package/src/components/ui/panels/ceiling-panel.tsx +230 -0
  82. package/src/components/ui/panels/collections/collections-popover.tsx +356 -0
  83. package/src/components/ui/panels/door-panel.tsx +600 -0
  84. package/src/components/ui/panels/item-panel.tsx +306 -0
  85. package/src/components/ui/panels/panel-manager.tsx +59 -0
  86. package/src/components/ui/panels/panel-wrapper.tsx +80 -0
  87. package/src/components/ui/panels/presets/presets-popover.tsx +511 -0
  88. package/src/components/ui/panels/reference-panel.tsx +177 -0
  89. package/src/components/ui/panels/roof-panel.tsx +262 -0
  90. package/src/components/ui/panels/roof-segment-panel.tsx +326 -0
  91. package/src/components/ui/panels/slab-panel.tsx +228 -0
  92. package/src/components/ui/panels/stair-panel.tsx +304 -0
  93. package/src/components/ui/panels/stair-segment-panel.tsx +339 -0
  94. package/src/components/ui/panels/wall-panel.tsx +123 -0
  95. package/src/components/ui/panels/window-panel.tsx +441 -0
  96. package/src/components/ui/primitives/button.tsx +69 -0
  97. package/src/components/ui/primitives/card.tsx +75 -0
  98. package/src/components/ui/primitives/color-dot.tsx +61 -0
  99. package/src/components/ui/primitives/context-menu.tsx +227 -0
  100. package/src/components/ui/primitives/dialog.tsx +129 -0
  101. package/src/components/ui/primitives/dropdown-menu.tsx +228 -0
  102. package/src/components/ui/primitives/error-boundary.tsx +52 -0
  103. package/src/components/ui/primitives/input.tsx +21 -0
  104. package/src/components/ui/primitives/number-input.tsx +187 -0
  105. package/src/components/ui/primitives/opacity-control.tsx +79 -0
  106. package/src/components/ui/primitives/popover.tsx +42 -0
  107. package/src/components/ui/primitives/separator.tsx +28 -0
  108. package/src/components/ui/primitives/sheet.tsx +130 -0
  109. package/src/components/ui/primitives/shortcut-token.tsx +64 -0
  110. package/src/components/ui/primitives/sidebar.tsx +855 -0
  111. package/src/components/ui/primitives/skeleton.tsx +13 -0
  112. package/src/components/ui/primitives/slider.tsx +58 -0
  113. package/src/components/ui/primitives/switch.tsx +29 -0
  114. package/src/components/ui/primitives/tooltip.tsx +57 -0
  115. package/src/components/ui/scene-loader.tsx +40 -0
  116. package/src/components/ui/sidebar/app-sidebar.tsx +103 -0
  117. package/src/components/ui/sidebar/icon-rail.tsx +147 -0
  118. package/src/components/ui/sidebar/panels/settings-panel/audio-settings-dialog.tsx +100 -0
  119. package/src/components/ui/sidebar/panels/settings-panel/index.tsx +438 -0
  120. package/src/components/ui/sidebar/panels/settings-panel/keyboard-shortcuts-dialog.tsx +188 -0
  121. package/src/components/ui/sidebar/panels/site-panel/building-tree-node.tsx +80 -0
  122. package/src/components/ui/sidebar/panels/site-panel/ceiling-tree-node.tsx +126 -0
  123. package/src/components/ui/sidebar/panels/site-panel/door-tree-node.tsx +64 -0
  124. package/src/components/ui/sidebar/panels/site-panel/index.tsx +1543 -0
  125. package/src/components/ui/sidebar/panels/site-panel/inline-rename-input.tsx +98 -0
  126. package/src/components/ui/sidebar/panels/site-panel/item-tree-node.tsx +117 -0
  127. package/src/components/ui/sidebar/panels/site-panel/level-tree-node.tsx +65 -0
  128. package/src/components/ui/sidebar/panels/site-panel/roof-tree-node.tsx +214 -0
  129. package/src/components/ui/sidebar/panels/site-panel/slab-tree-node.tsx +96 -0
  130. package/src/components/ui/sidebar/panels/site-panel/stair-tree-node.tsx +216 -0
  131. package/src/components/ui/sidebar/panels/site-panel/tree-node-actions.tsx +115 -0
  132. package/src/components/ui/sidebar/panels/site-panel/tree-node-drag.tsx +342 -0
  133. package/src/components/ui/sidebar/panels/site-panel/tree-node.tsx +271 -0
  134. package/src/components/ui/sidebar/panels/site-panel/wall-tree-node.tsx +106 -0
  135. package/src/components/ui/sidebar/panels/site-panel/window-tree-node.tsx +64 -0
  136. package/src/components/ui/sidebar/panels/site-panel/zone-tree-node.tsx +87 -0
  137. package/src/components/ui/sidebar/panels/zone-panel/index.tsx +167 -0
  138. package/src/components/ui/sidebar/tab-bar.tsx +39 -0
  139. package/src/components/ui/slider-demo.tsx +36 -0
  140. package/src/components/ui/slider.tsx +81 -0
  141. package/src/components/ui/viewer-toolbar.tsx +342 -0
  142. package/src/components/viewer-overlay.tsx +499 -0
  143. package/src/components/viewer-zone-system.tsx +48 -0
  144. package/src/contexts/presets-context.tsx +121 -0
  145. package/src/hooks/use-auto-save.ts +194 -0
  146. package/src/hooks/use-contextual-tools.ts +52 -0
  147. package/src/hooks/use-grid-events.ts +106 -0
  148. package/src/hooks/use-keyboard.ts +214 -0
  149. package/src/hooks/use-mobile.ts +19 -0
  150. package/src/hooks/use-reduced-motion.ts +20 -0
  151. package/src/index.tsx +33 -0
  152. package/src/lib/constants.ts +3 -0
  153. package/src/lib/level-selection.ts +31 -0
  154. package/src/lib/scene.ts +394 -0
  155. package/src/lib/sfx/index.ts +2 -0
  156. package/src/lib/sfx-bus.ts +49 -0
  157. package/src/lib/sfx-player.ts +60 -0
  158. package/src/lib/utils.ts +43 -0
  159. package/src/store/use-audio.tsx +45 -0
  160. package/src/store/use-command-registry.ts +36 -0
  161. package/src/store/use-editor.tsx +522 -0
  162. package/src/store/use-palette-view-registry.ts +45 -0
  163. package/src/store/use-upload.ts +90 -0
  164. package/src/three-types.ts +3 -0
  165. package/tsconfig.json +9 -0
@@ -0,0 +1,1580 @@
1
+ import type { AssetInput } from '@pascal-app/core'
2
+ export const CATALOG_ITEMS: AssetInput[] = [
3
+ {
4
+ id: 'tesla',
5
+ category: 'outdoor',
6
+ tags: ['floor', 'garage'],
7
+ name: 'Tesla',
8
+ thumbnail: '/items/tesla/thumbnail.webp',
9
+ src: '/items/tesla/model.glb',
10
+ scale: [1, 1, 1],
11
+ offset: [0, 0, 0],
12
+ rotation: [0, 0, 0],
13
+ dimensions: [2, 1.7, 5],
14
+ },
15
+ {
16
+ id: 'ev-wall-charger',
17
+ category: 'appliance',
18
+ tags: ['wall', 'garage'],
19
+ name: 'Ev-wall-charger',
20
+ thumbnail: '/items/ev-wall-charger/thumbnail.webp',
21
+ src: '/items/ev-wall-charger/model.glb',
22
+ scale: [1, 1, 1],
23
+ offset: [-0.07, 0.4, 0.15],
24
+ rotation: [0, 0, 0],
25
+ dimensions: [0.5, 0.8, 0.5],
26
+ attachTo: 'wall',
27
+ },
28
+ {
29
+ id: 'pillar',
30
+ category: 'outdoor',
31
+ tags: ['structure', 'fencing'],
32
+ name: 'Pillar',
33
+ thumbnail: '/items/pillar/thumbnail.webp',
34
+ src: '/items/pillar/model.glb',
35
+ scale: [1, 1, 1],
36
+ offset: [0, 0, 0],
37
+ rotation: [0, 0, 0],
38
+ dimensions: [0.5, 1.3, 0.5],
39
+ },
40
+
41
+ {
42
+ id: 'high-fence',
43
+ category: 'outdoor',
44
+ tags: ['fencing'],
45
+ name: 'High Fence',
46
+ thumbnail: '/items/high-fence/thumbnail.webp',
47
+ src: '/items/high-fence/model.glb',
48
+ scale: [1, 1, 1],
49
+ offset: [0, 0.01, 0],
50
+ rotation: [0, 0, 0],
51
+ dimensions: [4, 4.1, 0.5],
52
+ },
53
+
54
+ {
55
+ id: 'medium-fence',
56
+ category: 'outdoor',
57
+ tags: ['fencing'],
58
+ name: 'Medium Fence',
59
+ thumbnail: '/items/medium-fence/thumbnail.webp',
60
+ src: '/items/medium-fence/model.glb',
61
+ scale: [0.49, 0.49, 0.49],
62
+ offset: [0, 0.01, 0],
63
+ rotation: [0, 0, 0],
64
+ dimensions: [2, 2, 0.5],
65
+ },
66
+
67
+ {
68
+ id: 'low-fence',
69
+ category: 'outdoor',
70
+ tags: ['fencing'],
71
+ name: 'Low Fence',
72
+ thumbnail: '/items/low-fence/thumbnail.webp',
73
+ src: '/items/low-fence/model.glb',
74
+ scale: [1, 1, 1],
75
+ offset: [0, 0.01, 0],
76
+ rotation: [0, 0, 0],
77
+ dimensions: [2, 0.8, 0.5],
78
+ },
79
+
80
+ {
81
+ id: 'bush',
82
+ category: 'outdoor',
83
+ tags: ['vegetation'],
84
+ name: 'Bush',
85
+ thumbnail: '/items/bush/thumbnail.webp',
86
+ src: '/items/bush/model.glb',
87
+ scale: [0.96, 0.96, 0.96],
88
+ offset: [-0.14, 0.01, -0.13],
89
+ rotation: [0, 0, 0],
90
+ dimensions: [3, 1.1, 1],
91
+ },
92
+
93
+ {
94
+ id: 'fir-tree',
95
+ category: 'outdoor',
96
+ tags: ['vegetation'],
97
+ name: 'Fir',
98
+ thumbnail: '/items/fir-tree/thumbnail.webp',
99
+ src: '/items/fir-tree/model.glb',
100
+ scale: [1, 1, 1],
101
+ offset: [-0.01, 0.05, -0.07],
102
+ rotation: [0, 0, 0],
103
+ dimensions: [0.5, 3, 0.5],
104
+ },
105
+
106
+ {
107
+ id: 'tree',
108
+ category: 'outdoor',
109
+ tags: ['vegetation'],
110
+ name: 'Tree',
111
+ thumbnail: '/items/tree/thumbnail.webp',
112
+ src: '/items/tree/model.glb',
113
+ scale: [0.65, 0.65, 0.65],
114
+ offset: [-0.02, 0.17, -0.04],
115
+ rotation: [0, 0, 0],
116
+ dimensions: [1, 5, 1],
117
+ },
118
+
119
+ {
120
+ id: 'palm',
121
+ category: 'outdoor',
122
+ tags: ['vegetation'],
123
+ name: 'Palm',
124
+ thumbnail: '/items/palm/thumbnail.webp',
125
+ src: '/items/palm/model.glb',
126
+ scale: [0.37, 0.37, 0.37],
127
+ offset: [0, 0, 0.02],
128
+ rotation: [0, 0, 0],
129
+ dimensions: [1, 4.5, 1],
130
+ },
131
+
132
+ {
133
+ id: 'patio-umbrella',
134
+ category: 'outdoor',
135
+ tags: ['leisure', 'floor'],
136
+ name: 'Patio Umbrella',
137
+ thumbnail: '/items/patio-umbrella/thumbnail.webp',
138
+ src: '/items/patio-umbrella/model.glb',
139
+ scale: [1, 1, 1],
140
+ offset: [0, 0, 0],
141
+ rotation: [0, 0, 0],
142
+ dimensions: [0.5, 3.7, 0.5],
143
+ },
144
+
145
+ {
146
+ id: 'sunbed',
147
+ category: 'outdoor',
148
+ tags: ['leisure', 'seating', 'floor'],
149
+ name: 'Sunbed',
150
+ thumbnail: '/items/sunbed/thumbnail.webp',
151
+ src: '/items/sunbed/model.glb',
152
+ scale: [1, 1, 1],
153
+ offset: [0, 0.04, 0],
154
+ rotation: [0, 0, 0],
155
+ dimensions: [1, 1.2, 1.5],
156
+ },
157
+
158
+ {
159
+ id: 'window-double',
160
+ category: 'window',
161
+ tags: ['wall'],
162
+ name: 'Double Window',
163
+ thumbnail: '/items/window-double/thumbnail.webp',
164
+ src: '/items/window-double/model.glb',
165
+ scale: [0.81, 0.81, 0.81],
166
+ offset: [0, -0.32, 0],
167
+ rotation: [0, 3.14, 0],
168
+ dimensions: [1.5, 1.5, 0.5],
169
+ attachTo: 'wall',
170
+ },
171
+
172
+ {
173
+ id: 'window-simple',
174
+ category: 'window',
175
+ tags: ['wall'],
176
+ name: 'Simple Window',
177
+ thumbnail: '/items/window-simple/thumbnail.webp',
178
+ src: '/items/window-simple/model.glb',
179
+ scale: [1, 1, 1],
180
+ offset: [1.06, -0.21, 0.05],
181
+ rotation: [0, 3.14, 0],
182
+ dimensions: [1.5, 2, 0.5],
183
+ attachTo: 'wall',
184
+ },
185
+
186
+ {
187
+ id: 'window-rectangle',
188
+ category: 'window',
189
+ tags: ['wall'],
190
+ name: 'Rectangle Window',
191
+ thumbnail: '/items/window-rectangle/thumbnail.webp',
192
+ src: '/items/window-rectangle/model.glb',
193
+ scale: [0.81, 0.81, 0.81],
194
+ offset: [-1.41, -0.28, 0.08],
195
+ rotation: [0, 3.14, 0],
196
+ dimensions: [2.5, 1.5, 0.5],
197
+ attachTo: 'wall',
198
+ },
199
+
200
+ {
201
+ id: 'door-bar',
202
+ category: 'door',
203
+ tags: ['wall'],
204
+ name: 'Door with bar',
205
+ thumbnail: '/items/door-bar/thumbnail.webp',
206
+ src: '/items/door-bar/model.glb',
207
+ scale: [1, 1, 1],
208
+ offset: [-0.48, 0, 0],
209
+ rotation: [0, 0, 0],
210
+ dimensions: [1.5, 2.5, 0.5],
211
+ attachTo: 'wall',
212
+ },
213
+
214
+ {
215
+ id: 'glass-door',
216
+ category: 'door',
217
+ tags: ['wall'],
218
+ name: 'Glass Door',
219
+ thumbnail: '/items/glass-door/thumbnail.webp',
220
+ src: '/items/glass-door/model.glb',
221
+ scale: [0.9, 0.9, 0.9],
222
+ offset: [-0.52, 0, 0],
223
+ rotation: [0, 0, 0],
224
+ dimensions: [1.5, 2.5, 0.4],
225
+ attachTo: 'wall',
226
+ },
227
+
228
+ {
229
+ id: 'door',
230
+ category: 'door',
231
+ tags: ['wall'],
232
+ name: 'Door',
233
+ thumbnail: '/items/door/thumbnail.webp',
234
+ src: '/items/door/model.glb',
235
+ scale: [0.79, 0.79, 0.79],
236
+ offset: [-0.43, 0, 0],
237
+ rotation: [0, 0, 0],
238
+ dimensions: [1.5, 2, 0.4],
239
+ attachTo: 'wall',
240
+ },
241
+
242
+ {
243
+ id: 'parking-spot',
244
+ category: 'outdoor',
245
+ tags: ['leisure', 'floor'],
246
+ name: 'Parking Spot',
247
+ thumbnail: '/items/parking-spot/thumbnail.webp',
248
+ src: '/items/parking-spot/model.glb',
249
+ scale: [0.9, 1, 0.78],
250
+ offset: [0, 0, 0.01],
251
+ rotation: [0, 0, 0],
252
+ dimensions: [5, 1, 2.5],
253
+ },
254
+
255
+ {
256
+ id: 'outdoor-playhouse',
257
+ category: 'outdoor',
258
+ tags: ['leisure', 'kids', 'floor'],
259
+ name: 'Outdoor Playhouse',
260
+ thumbnail: '/items/outdoor-playhouse/thumbnail.webp',
261
+ src: '/items/outdoor-playhouse/model.glb',
262
+ scale: [1, 1, 1],
263
+ offset: [0, 0, 0],
264
+ rotation: [0, 0, 0],
265
+ dimensions: [0.5, 0.5, 1],
266
+ },
267
+
268
+ {
269
+ id: 'skate',
270
+ category: 'outdoor',
271
+ tags: ['leisure', 'kids', 'floor'],
272
+ name: 'Skate',
273
+ thumbnail: '/items/skate/thumbnail.webp',
274
+ src: '/items/skate/model.glb',
275
+ scale: [1, 1, 1],
276
+ offset: [0, 0, 0],
277
+ rotation: [0, 0, 0],
278
+ dimensions: [1, 0.2, 0.5],
279
+ },
280
+
281
+ {
282
+ id: 'scooter',
283
+ category: 'outdoor',
284
+ tags: ['leisure', 'kids', 'floor'],
285
+ name: 'Scooter',
286
+ thumbnail: '/items/scooter/thumbnail.webp',
287
+ src: '/items/scooter/model.glb',
288
+ scale: [1, 1, 1],
289
+ offset: [0.11, 0, 0.17],
290
+ rotation: [0, 0, 0],
291
+ dimensions: [1, 0.9, 0.5],
292
+ },
293
+
294
+ {
295
+ id: 'basket-hoop',
296
+ category: 'outdoor',
297
+ tags: ['leisure', 'sports', 'floor'],
298
+ name: 'Basket Hoop',
299
+ thumbnail: '/items/basket-hoop/thumbnail.webp',
300
+ src: '/items/basket-hoop/model.glb',
301
+ scale: [1, 1, 1],
302
+ offset: [0, 0, 0],
303
+ rotation: [0, 0, 0],
304
+ dimensions: [1, 1.8, 1],
305
+ },
306
+
307
+ {
308
+ id: 'ball',
309
+ category: 'outdoor',
310
+ tags: ['leisure', 'sports', 'floor'],
311
+ name: 'Ball',
312
+ thumbnail: '/items/ball/thumbnail.webp',
313
+ src: '/items/ball/model.glb',
314
+ scale: [1, 1, 1],
315
+ offset: [0, 0.12, 0],
316
+ rotation: [0, 0, 0],
317
+ dimensions: [0.5, 0.3, 0.5],
318
+ },
319
+
320
+ {
321
+ id: 'wine-bottle',
322
+ category: 'kitchen',
323
+ tags: ['countertop', 'decor'],
324
+ name: 'Wine Bottle',
325
+ thumbnail: '/items/wine-bottle/thumbnail.webp',
326
+ src: '/items/wine-bottle/model.glb',
327
+ scale: [1, 1, 1],
328
+ offset: [-0.05, 0, 0.01],
329
+ rotation: [0, 0, 0],
330
+ dimensions: [0.5, 0.4, 0.5],
331
+ },
332
+
333
+ {
334
+ id: 'fruits',
335
+ category: 'kitchen',
336
+ tags: ['countertop', 'decor'],
337
+ name: 'Fruits',
338
+ thumbnail: '/items/fruits/thumbnail.webp',
339
+ src: '/items/fruits/model.glb',
340
+ scale: [1, 1, 1],
341
+ offset: [0, 0, 0],
342
+ rotation: [0, 0, 0],
343
+ dimensions: [0.5, 0.3, 0.5],
344
+ },
345
+
346
+ {
347
+ id: 'cutting-board',
348
+ category: 'kitchen',
349
+ tags: ['countertop'],
350
+ name: 'Cutting Board',
351
+ thumbnail: '/items/cutting-board/thumbnail.webp',
352
+ src: '/items/cutting-board/model.glb',
353
+ scale: [1, 1, 1],
354
+ offset: [0, 0, 0],
355
+ rotation: [0, 0, 0],
356
+ dimensions: [0.5, 0.1, 0.5],
357
+ },
358
+
359
+ {
360
+ id: 'frying-pan',
361
+ category: 'kitchen',
362
+ tags: ['countertop'],
363
+ name: 'Frying Pan',
364
+ thumbnail: '/items/frying-pan/thumbnail.webp',
365
+ src: '/items/frying-pan/model.glb',
366
+ scale: [1, 1, 1],
367
+ offset: [0, 0, 0],
368
+ rotation: [0, 0, 0],
369
+ dimensions: [0.5, 0.1, 1],
370
+ },
371
+
372
+ {
373
+ id: 'kitchen-utensils',
374
+ category: 'kitchen',
375
+ tags: ['countertop'],
376
+ name: 'Kitchen Utensils',
377
+ thumbnail: '/items/kitchen-utensils/thumbnail.webp',
378
+ src: '/items/kitchen-utensils/model.glb',
379
+ scale: [1, 1, 1],
380
+ offset: [0, 0, 0],
381
+ rotation: [0, 0, 0],
382
+ dimensions: [0.5, 0.5, 0.5],
383
+ },
384
+
385
+ {
386
+ id: 'microwave',
387
+ category: 'kitchen',
388
+ tags: ['countertop', 'electronics'],
389
+ name: 'Microwave',
390
+ thumbnail: '/items/microwave/thumbnail.webp',
391
+ src: '/items/microwave/model.glb',
392
+ scale: [1, 1, 1],
393
+ offset: [0, 0, -0.03],
394
+ rotation: [0, 0, 0],
395
+ dimensions: [1, 0.3, 0.5],
396
+ },
397
+
398
+ {
399
+ id: 'stove',
400
+ category: 'kitchen',
401
+ tags: ['floor', 'large'],
402
+ name: 'Stove',
403
+ thumbnail: '/items/stove/thumbnail.webp',
404
+ src: '/items/stove/model.glb',
405
+ scale: [1, 1, 1],
406
+ offset: [0, 0, -0.05],
407
+ rotation: [0, 0, 0],
408
+ dimensions: [1, 1, 1],
409
+ },
410
+
411
+ {
412
+ id: 'fridge',
413
+ category: 'kitchen',
414
+ tags: ['floor', 'large'],
415
+ name: 'Fridge',
416
+ thumbnail: '/items/fridge/thumbnail.webp',
417
+ src: '/items/fridge/model.glb',
418
+ scale: [1, 1, 1],
419
+ offset: [0.01, 0, -0.05],
420
+ rotation: [0, 0, 0],
421
+ dimensions: [1, 2, 1],
422
+ },
423
+
424
+ {
425
+ id: 'hood',
426
+ category: 'kitchen',
427
+ tags: ['wall'],
428
+ name: 'Hood',
429
+ thumbnail: '/items/hood/thumbnail.webp',
430
+ src: '/items/hood/model.glb',
431
+ scale: [1, 1, 1],
432
+ offset: [0, 0.52, 0.01],
433
+ rotation: [0, 0, 0],
434
+ dimensions: [1.5, 1, 1.1],
435
+ attachTo: 'wall-side',
436
+ },
437
+
438
+ {
439
+ id: 'kitchen-shelf',
440
+ category: 'kitchen',
441
+ tags: ['wall', 'storage'],
442
+ name: 'Kitchen Shelf',
443
+ thumbnail: '/items/kitchen-shelf/thumbnail.webp',
444
+ src: '/items/kitchen-shelf/model.glb',
445
+ scale: [1, 1, 1],
446
+ offset: [0, 0.52, 0.01],
447
+ rotation: [0, 0, 0],
448
+ dimensions: [2.5, 1, 1.1],
449
+ attachTo: 'wall-side',
450
+ },
451
+
452
+ {
453
+ id: 'kitchen-counter',
454
+ category: 'kitchen',
455
+ tags: ['floor', 'large', 'storage'],
456
+ name: 'Kitchen Counter',
457
+ thumbnail: '/items/kitchen-counter/thumbnail.webp',
458
+ src: '/items/kitchen-counter/model.glb',
459
+ scale: [1, 1, 1],
460
+ offset: [0, 0, 0],
461
+ rotation: [0, 0, 0],
462
+ dimensions: [2, 0.8, 1],
463
+ surface: {
464
+ height: 0.75,
465
+ },
466
+ },
467
+
468
+ {
469
+ id: 'kitchen-cabinet',
470
+ category: 'kitchen',
471
+ tags: ['floor', 'large', 'storage'],
472
+ name: 'Kitchen Cabinet',
473
+ thumbnail: '/items/kitchen-cabinet/thumbnail.webp',
474
+ src: '/items/kitchen-cabinet/model.glb',
475
+ scale: [1, 1, 1],
476
+ offset: [0, 0, 0],
477
+ rotation: [0, 0, 0],
478
+ dimensions: [2, 1.1, 1],
479
+ surface: {
480
+ height: 1.1,
481
+ },
482
+ },
483
+
484
+ {
485
+ id: 'kitchen',
486
+ category: 'kitchen',
487
+ tags: ['floor', 'large'],
488
+ name: 'Kitchen',
489
+ thumbnail: '/items/kitchen/thumbnail.webp',
490
+ src: '/items/kitchen/model.glb',
491
+ scale: [1, 1, 1],
492
+ offset: [0, 0, 0],
493
+ rotation: [0, 0, 0],
494
+ dimensions: [2.5, 1.1, 1],
495
+ },
496
+
497
+ {
498
+ id: 'toilet-paper',
499
+ category: 'bathroom',
500
+ tags: ['wall', 'decor'],
501
+ name: 'Toilet Paper',
502
+ thumbnail: '/items/toilet-paper/thumbnail.webp',
503
+ src: '/items/toilet-paper/model.glb',
504
+ scale: [1, 1, 1],
505
+ offset: [0, 0.19, 0.12],
506
+ rotation: [0, 0, 0],
507
+ dimensions: [0.5, 0.5, 0.5],
508
+ attachTo: 'wall-side',
509
+ },
510
+
511
+ {
512
+ id: 'shower-rug',
513
+ category: 'bathroom',
514
+ tags: ['floor', 'decor'],
515
+ name: 'Shower Rug',
516
+ thumbnail: '/items/shower-rug/thumbnail.webp',
517
+ src: '/items/shower-rug/model.glb',
518
+ scale: [1, 1, 1],
519
+ offset: [0, 0, 0],
520
+ rotation: [0, 0, 0],
521
+ dimensions: [1, 0.1, 0.5],
522
+ },
523
+
524
+ {
525
+ id: 'laundry-bag',
526
+ category: 'bathroom',
527
+ tags: ['floor'],
528
+ name: 'Laundry Bag',
529
+ thumbnail: '/items/laundry-bag/thumbnail.webp',
530
+ src: '/items/laundry-bag/model.glb',
531
+ scale: [1, 1, 1],
532
+ offset: [0, 0, 0],
533
+ rotation: [0, 0, 0],
534
+ dimensions: [0.5, 0.8, 0.5],
535
+ },
536
+
537
+ {
538
+ id: 'drying-rack',
539
+ category: 'bathroom',
540
+ tags: ['floor'],
541
+ name: 'Drying Rack',
542
+ thumbnail: '/items/drying-rack/thumbnail.webp',
543
+ src: '/items/drying-rack/model.glb',
544
+ scale: [1, 1, 1],
545
+ offset: [0, 0, 0],
546
+ rotation: [0, 0, 0],
547
+ dimensions: [2, 1.1, 1],
548
+ },
549
+
550
+ {
551
+ id: 'washing-machine',
552
+ category: 'bathroom',
553
+ tags: ['floor', 'large', 'electronics'],
554
+ name: 'Washing Machine',
555
+ thumbnail: '/items/washing-machine/thumbnail.webp',
556
+ src: '/items/washing-machine/model.glb',
557
+ scale: [1, 1, 1],
558
+ offset: [0, 0, 0],
559
+ rotation: [0, 0, 0],
560
+ dimensions: [1, 1, 1],
561
+ },
562
+
563
+ {
564
+ id: 'toilet',
565
+ category: 'bathroom',
566
+ tags: ['floor', 'large'],
567
+ name: 'Toilet',
568
+ thumbnail: '/items/toilet/thumbnail.webp',
569
+ src: '/items/toilet/model.glb',
570
+ scale: [1, 1, 1],
571
+ offset: [0, 0, -0.23],
572
+ rotation: [0, 0, 0],
573
+ dimensions: [1, 0.9, 1],
574
+ },
575
+
576
+ {
577
+ id: 'shower-square',
578
+ category: 'bathroom',
579
+ tags: ['floor', 'large'],
580
+ name: 'Squared Shower',
581
+ thumbnail: '/items/shower-square/thumbnail.webp',
582
+ src: '/items/shower-square/model.glb',
583
+ scale: [1, 1, 1],
584
+ offset: [0.41, 0, -0.42],
585
+ rotation: [0, 0, 0],
586
+ dimensions: [1, 2, 1],
587
+ },
588
+
589
+ {
590
+ id: 'shower-angle',
591
+ category: 'bathroom',
592
+ tags: ['floor', 'large'],
593
+ name: 'Angle Shower',
594
+ thumbnail: '/items/shower-angle/thumbnail.webp',
595
+ src: '/items/shower-angle/model.glb',
596
+ scale: [1, 1, 1],
597
+ offset: [0.41, 0, -0.42],
598
+ rotation: [0, 0, 0],
599
+ dimensions: [1, 2, 1],
600
+ },
601
+
602
+ {
603
+ id: 'bathtub',
604
+ category: 'bathroom',
605
+ tags: ['floor', 'large'],
606
+ name: 'Bathtub',
607
+ thumbnail: '/items/bathtub/thumbnail.webp',
608
+ src: '/items/bathtub/model.glb',
609
+ scale: [1, 1, 1],
610
+ offset: [0, 0, 0.01],
611
+ rotation: [0, 0, 0],
612
+ dimensions: [2.5, 0.8, 1.5],
613
+ },
614
+
615
+ {
616
+ id: 'bathroom-sink',
617
+ category: 'bathroom',
618
+ tags: ['floor', 'large'],
619
+ name: 'Bathroom Sink',
620
+ thumbnail: '/items/bathroom-sink/thumbnail.webp',
621
+ src: '/items/bathroom-sink/model.glb',
622
+ scale: [1, 1, 1],
623
+ offset: [0.11, 0, 0.02],
624
+ rotation: [0, 0, 0],
625
+ dimensions: [2, 1, 1.5],
626
+ },
627
+
628
+ {
629
+ id: 'ceiling-fan',
630
+ category: 'appliance',
631
+ tags: ['ceiling', 'climate'],
632
+ name: 'Ceiling fan',
633
+ thumbnail: '/items/ceiling-fan/thumbnail.webp',
634
+ src: '/items/ceiling-fan/model.glb',
635
+ scale: [1, 1, 1],
636
+ offset: [-0.12, 0.49, 0],
637
+ rotation: [0, 0, 0],
638
+ dimensions: [1, 0.5, 1.5],
639
+ attachTo: 'ceiling',
640
+ interactive: {
641
+ effects: [
642
+ {
643
+ kind: 'animation',
644
+ clips: {
645
+ on: 'On',
646
+ },
647
+ },
648
+ ],
649
+ controls: [
650
+ {
651
+ kind: 'toggle',
652
+ },
653
+ ],
654
+ },
655
+ },
656
+
657
+ {
658
+ id: 'electric-panel',
659
+ category: 'appliance',
660
+ tags: ['wall', 'electrical'],
661
+ name: 'Electric Panel',
662
+ thumbnail: '/items/electric-panel/thumbnail.webp',
663
+ src: '/items/electric-panel/model.glb',
664
+ scale: [0.61, 0.74, 0.7],
665
+ offset: [0, 0, 0.06],
666
+ rotation: [0, 0, 0],
667
+ dimensions: [0.5, 1, 0.3],
668
+ attachTo: 'wall-side',
669
+ },
670
+
671
+ {
672
+ id: 'sprinkler',
673
+ category: 'appliance',
674
+ tags: ['ceiling', 'safety'],
675
+ name: 'Sprinkler',
676
+ thumbnail: '/items/sprinkler/thumbnail.webp',
677
+ src: '/items/sprinkler/model.glb',
678
+ scale: [1, 1, 1],
679
+ offset: [0, 0.45, 0],
680
+ rotation: [0, 0, 0],
681
+ dimensions: [0.5, 0.5, 0.5],
682
+ attachTo: 'ceiling',
683
+ },
684
+
685
+ {
686
+ id: 'smoke-detector',
687
+ category: 'appliance',
688
+ tags: ['ceiling', 'safety'],
689
+ name: 'Smoke Detector',
690
+ thumbnail: '/items/smoke-detector/thumbnail.webp',
691
+ src: '/items/smoke-detector/model.glb',
692
+ scale: [1, 1, 1],
693
+ offset: [0, 0.49, 0],
694
+ rotation: [Math.PI, 0, 0],
695
+ dimensions: [0.5, 0.5, 0.5],
696
+ attachTo: 'ceiling',
697
+ },
698
+
699
+ {
700
+ id: 'fire-detector',
701
+ category: 'appliance',
702
+ tags: ['wall', 'safety'],
703
+ name: 'Fire Detector',
704
+ thumbnail: '/items/fire-detector/thumbnail.webp',
705
+ src: '/items/fire-detector/model.glb',
706
+ scale: [0.9, 1.4, 0.7],
707
+ offset: [0.02, 0.05, 0],
708
+ rotation: [0, 0, 0],
709
+ dimensions: [0.5, 0.5, 0.3],
710
+ attachTo: 'wall',
711
+ },
712
+
713
+ {
714
+ id: 'exit-sign',
715
+ category: 'appliance',
716
+ tags: ['wall', 'safety'],
717
+ name: 'Exit Sign',
718
+ thumbnail: '/items/exit-sign/thumbnail.webp',
719
+ src: '/items/exit-sign/model.glb',
720
+ scale: [0.6, 0.5, 0.7],
721
+ offset: [0, 0.04, 0.05],
722
+ rotation: [0, 0, 0],
723
+ dimensions: [1, 0.5, 0.3],
724
+ attachTo: 'wall-side',
725
+ },
726
+
727
+ {
728
+ id: 'hydrant',
729
+ category: 'appliance',
730
+ tags: ['floor', 'safety'],
731
+ name: 'Hydrant',
732
+ thumbnail: '/items/hydrant/thumbnail.webp',
733
+ src: '/items/hydrant/model.glb',
734
+ scale: [1, 1, 1],
735
+ offset: [0, 0, 0],
736
+ rotation: [0, 0, 0],
737
+ dimensions: [1, 0.9, 1],
738
+ },
739
+
740
+ {
741
+ id: 'alarm-keypad',
742
+ category: 'appliance',
743
+ tags: ['wall', 'safety', 'electrical'],
744
+ name: 'Alarm Keypad',
745
+ thumbnail: '/items/alarm-keypad/thumbnail.webp',
746
+ src: '/items/alarm-keypad/model.glb',
747
+ scale: [1, 1, 1],
748
+ offset: [0, 0, 0],
749
+ rotation: [0, 0, 0],
750
+ dimensions: [0.5, 0.1, 0.5],
751
+ },
752
+
753
+ {
754
+ id: 'thermostat',
755
+ category: 'appliance',
756
+ tags: ['wall', 'climate', 'electrical'],
757
+ name: 'Thermostat',
758
+ thumbnail: '/items/thermostat/thumbnail.webp',
759
+ src: '/items/thermostat/model.glb',
760
+ scale: [2.08, 2.1, 2.59],
761
+ offset: [0, 0, 0.01],
762
+ rotation: [0, 0, 0],
763
+ dimensions: [0.5, 0.5, 0.1],
764
+ attachTo: 'wall-side',
765
+ },
766
+
767
+ {
768
+ id: 'air-conditioning',
769
+ category: 'appliance',
770
+ tags: ['wall', 'climate'],
771
+ name: 'Air Conditioning',
772
+ thumbnail: '/items/air-conditioning/thumbnail.webp',
773
+ src: '/items/air-conditioning/model.glb',
774
+ scale: [1, 1, 1],
775
+ offset: [0, 0.37, 0.21],
776
+ rotation: [0, 0, 0],
777
+ dimensions: [2, 1, 0.9],
778
+ attachTo: 'wall-side',
779
+ },
780
+
781
+ {
782
+ id: 'ac-block',
783
+ category: 'appliance',
784
+ tags: ['floor', 'climate'],
785
+ name: 'AC block',
786
+ thumbnail: '/items/ac-block/thumbnail.webp',
787
+ src: '/items/ac-block/model.glb',
788
+ scale: [0.79, 0.79, 0.79],
789
+ offset: [0, 0, 0],
790
+ rotation: [0, 0, 0],
791
+ dimensions: [1.1, 1, 1.1],
792
+ },
793
+
794
+ {
795
+ id: 'toaster',
796
+ category: 'appliance',
797
+ tags: ['countertop', 'electronics'],
798
+ name: 'Toaster',
799
+ thumbnail: '/items/toaster/thumbnail.webp',
800
+ src: '/items/toaster/model.glb',
801
+ scale: [1, 1, 1],
802
+ offset: [0, 0, 0],
803
+ rotation: [0, 0, 0],
804
+ dimensions: [0.5, 0.3, 0.5],
805
+ },
806
+
807
+ {
808
+ id: 'sewing-machine',
809
+ category: 'appliance',
810
+ tags: ['countertop', 'electronics'],
811
+ name: 'Sewing Machine',
812
+ thumbnail: '/items/sewing-machine/thumbnail.webp',
813
+ src: '/items/sewing-machine/model.glb',
814
+ scale: [1, 1, 1],
815
+ offset: [0, 0, 0],
816
+ rotation: [0, 0, 0],
817
+ dimensions: [1, 0.7, 0.5],
818
+ },
819
+
820
+ {
821
+ id: 'kettle',
822
+ category: 'appliance',
823
+ tags: ['countertop', 'electronics'],
824
+ name: 'Kettle',
825
+ thumbnail: '/items/kettle/thumbnail.webp',
826
+ src: '/items/kettle/model.glb',
827
+ scale: [1, 1, 1],
828
+ offset: [0, 0, 0],
829
+ rotation: [0, 0, 0],
830
+ dimensions: [0.5, 0.3, 0.5],
831
+ },
832
+
833
+ {
834
+ id: 'iron',
835
+ category: 'appliance',
836
+ tags: ['countertop', 'electronics'],
837
+ name: 'Iron',
838
+ thumbnail: '/items/iron/thumbnail.webp',
839
+ src: '/items/iron/model.glb',
840
+ scale: [1, 1, 1],
841
+ offset: [0, 0, 0],
842
+ rotation: [0, 0, 0],
843
+ dimensions: [0.5, 0.3, 0.5],
844
+ },
845
+
846
+ {
847
+ id: 'coffee-machine',
848
+ category: 'appliance',
849
+ tags: ['countertop', 'electronics'],
850
+ name: 'Coffee Machine',
851
+ thumbnail: '/items/coffee-machine/thumbnail.webp',
852
+ src: '/items/coffee-machine/model.glb',
853
+ scale: [1, 1, 1],
854
+ offset: [0, 0, -0.03],
855
+ rotation: [0, 0, 0],
856
+ dimensions: [0.5, 0.3, 0.5],
857
+ },
858
+
859
+ {
860
+ id: 'television',
861
+ category: 'appliance',
862
+ tags: ['floor', 'electronics'],
863
+ name: 'Television',
864
+ thumbnail: '/items/television/thumbnail.webp',
865
+ src: '/items/television/model.glb',
866
+ scale: [1, 1, 1],
867
+ offset: [0, 0, 0],
868
+ rotation: [0, 0, 0],
869
+ dimensions: [2, 1.1, 0.5],
870
+ },
871
+
872
+ {
873
+ id: 'computer',
874
+ category: 'appliance',
875
+ tags: ['countertop', 'electronics'],
876
+ name: 'Computer',
877
+ thumbnail: '/items/computer/thumbnail.webp',
878
+ src: '/items/computer/model.glb',
879
+ scale: [1, 1, 1],
880
+ offset: [0.01, 0, 0],
881
+ rotation: [0, 0, 0],
882
+ dimensions: [1, 0.5, 0.5],
883
+ },
884
+
885
+ {
886
+ id: 'stereo-speaker',
887
+ category: 'appliance',
888
+ tags: ['floor', 'electronics'],
889
+ name: 'Stereo Speaker',
890
+ thumbnail: '/items/stereo-speaker/thumbnail.webp',
891
+ src: '/items/stereo-speaker/model.glb',
892
+ scale: [1, 1, 1],
893
+ offset: [0.02, 0, -0.01],
894
+ rotation: [0, 0, 0],
895
+ dimensions: [0.5, 1.1, 0.5],
896
+ },
897
+
898
+ {
899
+ id: 'threadmill',
900
+ category: 'furniture',
901
+ tags: ['floor', 'fitness'],
902
+ name: 'Threadmill',
903
+ thumbnail: '/items/threadmill/thumbnail.webp',
904
+ src: '/items/threadmill/model.glb',
905
+ scale: [1, 1, 1],
906
+ offset: [0, 0, 0],
907
+ rotation: [0, 0, 0],
908
+ dimensions: [2.5, 1.5, 1],
909
+ },
910
+
911
+ {
912
+ id: 'barbell-stand',
913
+ category: 'furniture',
914
+ tags: ['floor', 'fitness'],
915
+ name: 'Barbell Stand',
916
+ thumbnail: '/items/barbell-stand/thumbnail.webp',
917
+ src: '/items/barbell-stand/model.glb',
918
+ scale: [1, 1, 1],
919
+ offset: [0, 0, 0],
920
+ rotation: [0, 0, 0],
921
+ dimensions: [1.5, 1.3, 2],
922
+ },
923
+
924
+ {
925
+ id: 'barbell',
926
+ category: 'furniture',
927
+ tags: ['floor', 'fitness'],
928
+ name: 'Barbell',
929
+ thumbnail: '/items/barbell/thumbnail.webp',
930
+ src: '/items/barbell/model.glb',
931
+ scale: [1, 1, 1],
932
+ offset: [0, 0, 0],
933
+ rotation: [0, 0, 0],
934
+ dimensions: [0.5, 0.4, 2],
935
+ },
936
+
937
+ {
938
+ id: 'toy',
939
+ category: 'furniture',
940
+ tags: ['floor', 'kids', 'decor'],
941
+ name: 'Toy',
942
+ thumbnail: '/items/toy/thumbnail.webp',
943
+ src: '/items/toy/model.glb',
944
+ scale: [1, 1, 1],
945
+ offset: [0, 0, 0],
946
+ rotation: [0, 0, 0],
947
+ dimensions: [0.5, 0.5, 0.5],
948
+ },
949
+
950
+ {
951
+ id: 'car-toy',
952
+ category: 'furniture',
953
+ tags: ['floor', 'kids', 'decor'],
954
+ name: 'Car Toy',
955
+ thumbnail: '/items/car-toy/thumbnail.webp',
956
+ src: '/items/car-toy/model.glb',
957
+ scale: [1, 1, 1],
958
+ offset: [0, 0, 0],
959
+ rotation: [0, 0, 0],
960
+ dimensions: [0.5, 0.4, 1],
961
+ },
962
+
963
+ {
964
+ id: 'easel',
965
+ category: 'furniture',
966
+ tags: ['floor', 'decor'],
967
+ name: 'Easel',
968
+ thumbnail: '/items/easel/thumbnail.webp',
969
+ src: '/items/easel/model.glb',
970
+ scale: [1, 1, 1],
971
+ offset: [0, 0, 0],
972
+ rotation: [0, 0, 0],
973
+ dimensions: [1.5, 2.3, 1],
974
+ },
975
+
976
+ {
977
+ id: 'pool-table',
978
+ category: 'furniture',
979
+ tags: ['floor', 'leisure'],
980
+ name: 'Pool table',
981
+ thumbnail: '/items/pool-table/thumbnail.webp',
982
+ src: '/items/pool-table/model.glb',
983
+ scale: [1, 1, 1],
984
+ offset: [0, 0, 0],
985
+ rotation: [0, 0, 0],
986
+ dimensions: [2.5, 1, 4],
987
+ },
988
+
989
+ {
990
+ id: 'guitar',
991
+ category: 'furniture',
992
+ tags: ['floor', 'decor'],
993
+ name: 'Guitar',
994
+ thumbnail: '/items/guitar/thumbnail.webp',
995
+ src: '/items/guitar/model.glb',
996
+ scale: [1, 1, 1],
997
+ offset: [0, 0.32, 0],
998
+ rotation: [0, 0, 0],
999
+ dimensions: [0.5, 1.2, 0.5],
1000
+ },
1001
+
1002
+ {
1003
+ id: 'piano',
1004
+ category: 'furniture',
1005
+ tags: ['floor', 'decor'],
1006
+ name: 'Piano',
1007
+ thumbnail: '/items/piano/thumbnail.webp',
1008
+ src: '/items/piano/model.glb',
1009
+ scale: [1, 1, 1],
1010
+ offset: [0, 0, 0],
1011
+ rotation: [0, 0, 0],
1012
+ dimensions: [2, 1.5, 1],
1013
+ },
1014
+
1015
+ {
1016
+ id: 'round-carpet',
1017
+ category: 'furniture',
1018
+ tags: ['floor', 'decor'],
1019
+ name: 'Round Carpet',
1020
+ thumbnail: '/items/round-carpet/thumbnail.webp',
1021
+ src: '/items/round-carpet/model.glb',
1022
+ scale: [1, 1, 1],
1023
+ offset: [0, 0, 0],
1024
+ rotation: [0, 0, 0],
1025
+ dimensions: [2.5, 0.1, 2.5],
1026
+ },
1027
+
1028
+ {
1029
+ id: 'rectangular-carpet',
1030
+ category: 'furniture',
1031
+ tags: ['floor', 'decor'],
1032
+ name: 'Rectangular Carpet',
1033
+ thumbnail: '/items/rectangular-carpet/thumbnail.webp',
1034
+ src: '/items/rectangular-carpet/model.glb',
1035
+ scale: [1, 1, 1],
1036
+ offset: [0, 0, 0],
1037
+ rotation: [0, 0, 0],
1038
+ dimensions: [3, 0.1, 2],
1039
+ },
1040
+
1041
+ {
1042
+ id: 'cactus',
1043
+ category: 'furniture',
1044
+ tags: ['floor', 'decor', 'vegetation'],
1045
+ name: 'Cactus',
1046
+ thumbnail: '/items/cactus/thumbnail.webp',
1047
+ src: '/items/cactus/model.glb',
1048
+ scale: [1, 1, 1],
1049
+ offset: [0, 0, 0],
1050
+ rotation: [0, 0, 0],
1051
+ dimensions: [0.5, 0.4, 0.5],
1052
+ },
1053
+
1054
+ {
1055
+ id: 'small-indoor-plant',
1056
+ category: 'furniture',
1057
+ tags: ['countertop', 'decor', 'vegetation'],
1058
+ name: 'Small Plant',
1059
+ thumbnail: '/items/small-indoor-plant/thumbnail.webp',
1060
+ src: '/items/small-indoor-plant/model.glb',
1061
+ scale: [1, 1, 1],
1062
+ offset: [-0.01, 0, 0.01],
1063
+ rotation: [0, 0, 0],
1064
+ dimensions: [0.5, 0.7, 0.5],
1065
+ },
1066
+
1067
+ {
1068
+ id: 'indoor-plant',
1069
+ category: 'furniture',
1070
+ tags: ['floor', 'decor', 'vegetation'],
1071
+ name: 'Indoor Plant',
1072
+ thumbnail: '/items/indoor-plant/thumbnail.webp',
1073
+ src: '/items/indoor-plant/model.glb',
1074
+ scale: [1, 1, 1],
1075
+ offset: [-0.05, 0, 0.07],
1076
+ rotation: [0, 0, 0],
1077
+ dimensions: [1, 1.7, 1],
1078
+ },
1079
+
1080
+ {
1081
+ id: 'ironing-board',
1082
+ category: 'furniture',
1083
+ tags: ['floor'],
1084
+ name: 'Ironing Board',
1085
+ thumbnail: '/items/ironing-board/thumbnail.webp',
1086
+ src: '/items/ironing-board/model.glb',
1087
+ scale: [1, 1, 1],
1088
+ offset: [0, 0, 0],
1089
+ rotation: [0, 0, 0],
1090
+ dimensions: [1.5, 1, 1],
1091
+ },
1092
+
1093
+ {
1094
+ id: 'coat-rack',
1095
+ category: 'furniture',
1096
+ tags: ['floor', 'storage'],
1097
+ name: 'Coat Rack',
1098
+ thumbnail: '/items/coat-rack/thumbnail.webp',
1099
+ src: '/items/coat-rack/model.glb',
1100
+ scale: [1, 1, 1],
1101
+ offset: [0, 0, 0],
1102
+ rotation: [0, 0, 0],
1103
+ dimensions: [0.5, 1.8, 0.5],
1104
+ },
1105
+
1106
+ {
1107
+ id: 'trash-bin',
1108
+ category: 'furniture',
1109
+ tags: ['floor'],
1110
+ name: 'Trash Bin',
1111
+ thumbnail: '/items/trash-bin/thumbnail.webp',
1112
+ src: '/items/trash-bin/model.glb',
1113
+ scale: [1, 1, 1],
1114
+ offset: [0, 0, 0],
1115
+ rotation: [0, 0, 0],
1116
+ dimensions: [0.5, 0.6, 0.5],
1117
+ },
1118
+
1119
+ {
1120
+ id: 'round-mirror',
1121
+ category: 'furniture',
1122
+ tags: ['wall', 'decor'],
1123
+ name: 'Rounded Mirror',
1124
+ thumbnail: '/items/round-mirror/thumbnail.webp',
1125
+ src: '/items/round-mirror/model.glb',
1126
+ scale: [1, 1, 1],
1127
+ offset: [0, 0.32, 0],
1128
+ rotation: [0, 0, 0],
1129
+ dimensions: [1, 1, 0.1],
1130
+ attachTo: 'wall-side',
1131
+ },
1132
+
1133
+ {
1134
+ id: 'picture',
1135
+ category: 'furniture',
1136
+ tags: ['wall', 'decor'],
1137
+ name: 'Picture',
1138
+ thumbnail: '/items/picture/thumbnail.webp',
1139
+ src: '/items/picture/model.glb',
1140
+ scale: [1, 1, 1],
1141
+ offset: [0.02, 0.45, 0.01],
1142
+ rotation: [0, 0, 0],
1143
+ dimensions: [2, 1, 0.2],
1144
+ attachTo: 'wall-side',
1145
+ },
1146
+
1147
+ {
1148
+ id: 'books',
1149
+ category: 'furniture',
1150
+ tags: ['countertop', 'decor'],
1151
+ name: 'Books',
1152
+ thumbnail: '/items/books/thumbnail.webp',
1153
+ src: '/items/books/model.glb',
1154
+ scale: [1, 1, 1],
1155
+ offset: [-0.08, 0, 0.02],
1156
+ rotation: [0, 0, 0],
1157
+ dimensions: [0.5, 0.3, 0.5],
1158
+ },
1159
+
1160
+ {
1161
+ id: 'column',
1162
+ category: 'furniture',
1163
+ tags: ['floor', 'structure'],
1164
+ name: 'Column',
1165
+ thumbnail: '/items/column/thumbnail.webp',
1166
+ src: '/items/column/model.glb',
1167
+ scale: [1, 1, 1],
1168
+ offset: [0, 1.26, 0],
1169
+ rotation: [0, 0, 0],
1170
+ dimensions: [0.5, 2.6, 0.5],
1171
+ },
1172
+
1173
+ {
1174
+ id: 'stairs',
1175
+ category: 'furniture',
1176
+ tags: ['floor', 'structure'],
1177
+ name: 'Stairs',
1178
+ thumbnail: '/items/stairs/thumbnail.webp',
1179
+ src: '/items/stairs/model.glb',
1180
+ scale: [0.61, 0.61, 0.61],
1181
+ offset: [0, 0.03, 1.8],
1182
+ rotation: [0, 0, 0],
1183
+ dimensions: [1.5, 2.5, 3.5],
1184
+ },
1185
+
1186
+ // {
1187
+ // id: "suspended-fireplace",
1188
+ // category: "furniture",
1189
+ // tags: ["ceiling", "decor"],
1190
+ // name: "Suspended Fireplace",
1191
+ // thumbnail: "/items/suspended-fireplace/thumbnail.webp",
1192
+ // src: "/items/suspended-fireplace/model.glb",
1193
+ // scale: [1, 1, 1],
1194
+ // offset: [0, 0.45, 0],
1195
+ // rotation: [0, 0, 0],
1196
+ // dimensions: [0.5, 0.5, 0.5],
1197
+ // attachTo: "ceiling",
1198
+ // },
1199
+
1200
+ {
1201
+ id: 'tv-stand',
1202
+ category: 'furniture',
1203
+ tags: ['floor', 'storage'],
1204
+ name: 'TV Stand',
1205
+ thumbnail: '/items/tv-stand/thumbnail.webp',
1206
+ src: '/items/tv-stand/model.glb',
1207
+ scale: [1, 1, 1],
1208
+ offset: [0, 0.21, 0],
1209
+ rotation: [0, 0, 0],
1210
+ dimensions: [2, 0.4, 0.5],
1211
+ surface: {
1212
+ height: 0.36,
1213
+ },
1214
+ },
1215
+
1216
+ {
1217
+ id: 'shelf',
1218
+ category: 'furniture',
1219
+ tags: ['wall', 'storage'],
1220
+ name: 'Shelf',
1221
+ thumbnail: '/items/shelf/thumbnail.webp',
1222
+ src: '/items/shelf/model.glb',
1223
+ scale: [1, 1, 1],
1224
+ offset: [0, 0.1, 0.01],
1225
+ rotation: [0, 0, 0],
1226
+ dimensions: [1, 0.5, 0.7],
1227
+ attachTo: 'wall-side',
1228
+ surface: {
1229
+ height: 0.12,
1230
+ },
1231
+ },
1232
+
1233
+ {
1234
+ id: 'bookshelf',
1235
+ category: 'furniture',
1236
+ tags: ['floor', 'storage'],
1237
+ name: 'Bookshelf',
1238
+ thumbnail: '/items/bookshelf/thumbnail.webp',
1239
+ src: '/items/bookshelf/model.glb',
1240
+ scale: [1, 1, 1],
1241
+ offset: [0, 0, 0],
1242
+ rotation: [0, 0, 0],
1243
+ dimensions: [1, 2, 0.5],
1244
+ },
1245
+
1246
+ {
1247
+ id: 'ceiling-lamp',
1248
+ category: 'furniture',
1249
+ tags: ['ceiling', 'lighting'],
1250
+ name: 'Ceiling Lamp',
1251
+ thumbnail: '/items/ceiling-lamp/thumbnail.webp',
1252
+ src: '/items/ceiling-lamp/model.glb',
1253
+ scale: [1, 1, 1],
1254
+ offset: [0, 0.98, 0],
1255
+ rotation: [0, 0, 0],
1256
+ dimensions: [1, 1, 1],
1257
+ attachTo: 'ceiling',
1258
+ interactive: {
1259
+ controls: [
1260
+ {
1261
+ kind: 'toggle',
1262
+ },
1263
+ {
1264
+ kind: 'slider',
1265
+ label: 'Intensity',
1266
+ min: 0,
1267
+ max: 100,
1268
+ unit: '%',
1269
+ displayMode: 'dial',
1270
+ default: 100,
1271
+ },
1272
+ ],
1273
+ effects: [
1274
+ {
1275
+ kind: 'light',
1276
+ intensityRange: [0, 2],
1277
+ color: '#ffffff',
1278
+ offset: [0, -0.5, 0],
1279
+ },
1280
+ ],
1281
+ },
1282
+ },
1283
+ {
1284
+ id: 'recessed-light',
1285
+ category: 'furniture',
1286
+ tags: ['ceiling', 'lighting'],
1287
+ name: 'Recessed Light',
1288
+ thumbnail: '/items/recessed-light/thumbnail.webp',
1289
+ src: '/items/recessed-light/model.glb',
1290
+ scale: [1, 1, 1],
1291
+ offset: [0, 0.094, 0],
1292
+ rotation: [0, 0, 0],
1293
+ dimensions: [0.5, 0.1, 0.5],
1294
+ attachTo: 'ceiling',
1295
+ interactive: {
1296
+ controls: [
1297
+ {
1298
+ kind: 'toggle',
1299
+ },
1300
+ {
1301
+ kind: 'slider',
1302
+ label: 'Intensity',
1303
+ min: 0,
1304
+ max: 100,
1305
+ unit: '%',
1306
+ displayMode: 'dial',
1307
+ default: 100,
1308
+ },
1309
+ ],
1310
+ effects: [
1311
+ {
1312
+ kind: 'light',
1313
+ intensityRange: [0, 2],
1314
+ color: '#ffffff',
1315
+ offset: [0, -0.1, 0],
1316
+ },
1317
+ ],
1318
+ },
1319
+ },
1320
+
1321
+ {
1322
+ id: 'floor-lamp',
1323
+ category: 'furniture',
1324
+ tags: ['floor', 'lighting'],
1325
+ name: 'Floor Lamp',
1326
+ thumbnail: '/items/floor-lamp/thumbnail.webp',
1327
+ src: '/items/floor-lamp/model.glb',
1328
+ scale: [1, 1, 1],
1329
+ offset: [0.04, 0, 0.02],
1330
+ rotation: [0, 0, 0],
1331
+ dimensions: [1, 1.9, 1],
1332
+ interactive: {
1333
+ controls: [
1334
+ {
1335
+ kind: 'toggle',
1336
+ },
1337
+ {
1338
+ kind: 'slider',
1339
+ label: 'Intensity',
1340
+ min: 0,
1341
+ max: 100,
1342
+ unit: '%',
1343
+ displayMode: 'dial',
1344
+ default: 100,
1345
+ },
1346
+ ],
1347
+ effects: [
1348
+ {
1349
+ kind: 'light',
1350
+ intensityRange: [0, 2],
1351
+ color: '#ffffff',
1352
+ offset: [0, 1.4, 0],
1353
+ },
1354
+ ],
1355
+ },
1356
+ },
1357
+
1358
+ {
1359
+ id: 'table-lamp',
1360
+ category: 'furniture',
1361
+ tags: ['countertop', 'lighting'],
1362
+ name: 'Table Lamp',
1363
+ thumbnail: '/items/table-lamp/thumbnail.webp',
1364
+ src: '/items/table-lamp/model.glb',
1365
+ scale: [1, 1, 1],
1366
+ offset: [0, 0, 0],
1367
+ rotation: [0, 0, 0],
1368
+ dimensions: [0.5, 0.8, 1],
1369
+ },
1370
+
1371
+ {
1372
+ id: 'closet',
1373
+ category: 'furniture',
1374
+ tags: ['floor', 'storage', 'bedroom'],
1375
+ name: 'Closet',
1376
+ thumbnail: '/items/closet/thumbnail.webp',
1377
+ src: '/items/closet/model.glb',
1378
+ scale: [1, 1, 1],
1379
+ offset: [0, 0, -0.01],
1380
+ rotation: [0, 0, 0],
1381
+ dimensions: [2, 2.5, 1],
1382
+ },
1383
+
1384
+ {
1385
+ id: 'dresser',
1386
+ category: 'furniture',
1387
+ tags: ['floor', 'storage', 'bedroom'],
1388
+ name: 'Dresser',
1389
+ thumbnail: '/items/dresser/thumbnail.webp',
1390
+ src: '/items/dresser/model.glb',
1391
+ scale: [1, 1, 1],
1392
+ offset: [0, 0, 0],
1393
+ rotation: [0, 0, 0],
1394
+ dimensions: [1.5, 0.8, 1],
1395
+ surface: {
1396
+ height: 0.8,
1397
+ },
1398
+ },
1399
+
1400
+ {
1401
+ id: 'bunkbed',
1402
+ category: 'furniture',
1403
+ tags: ['floor', 'bedroom'],
1404
+ name: 'Bunkbed',
1405
+ thumbnail: '/items/bunkbed/thumbnail.webp',
1406
+ src: '/items/bunkbed/model.glb',
1407
+ scale: [1, 1, 1],
1408
+ offset: [0, 0, -0.09],
1409
+ rotation: [0, 0, 0],
1410
+ dimensions: [2, 1.6, 1.5],
1411
+ },
1412
+
1413
+ {
1414
+ id: 'double-bed',
1415
+ category: 'furniture',
1416
+ tags: ['floor', 'bedroom'],
1417
+ name: 'Double Bed',
1418
+ thumbnail: '/items/double-bed/thumbnail.webp',
1419
+ src: '/items/double-bed/model.glb',
1420
+ scale: [1, 1, 1],
1421
+ offset: [0, 0, -0.03],
1422
+ rotation: [0, 0, 0],
1423
+ dimensions: [2, 0.8, 2.5],
1424
+ },
1425
+
1426
+ {
1427
+ id: 'single-bed',
1428
+ category: 'furniture',
1429
+ tags: ['floor', 'bedroom'],
1430
+ name: 'Single Bed',
1431
+ thumbnail: '/items/single-bed/thumbnail.webp',
1432
+ src: '/items/single-bed/model.glb',
1433
+ scale: [1, 1, 1],
1434
+ offset: [0, 0, 0],
1435
+ rotation: [0, 0, 0],
1436
+ dimensions: [1.5, 0.7, 2.5],
1437
+ },
1438
+
1439
+ {
1440
+ id: 'sofa',
1441
+ category: 'furniture',
1442
+ tags: ['floor', 'seating'],
1443
+ name: 'Sofa',
1444
+ thumbnail: '/items/sofa/thumbnail.webp',
1445
+ src: '/items/sofa/model.glb',
1446
+ scale: [1, 1, 1],
1447
+ offset: [0, 0, 0.04],
1448
+ rotation: [0, 0, 0],
1449
+ dimensions: [2.5, 0.8, 1.5],
1450
+ },
1451
+
1452
+ {
1453
+ id: 'lounge-chair',
1454
+ category: 'furniture',
1455
+ tags: ['floor', 'seating'],
1456
+ name: 'Lounge Chair',
1457
+ thumbnail: '/items/lounge-chair/thumbnail.webp',
1458
+ src: '/items/lounge-chair/model.glb',
1459
+ scale: [1, 1, 1],
1460
+ offset: [0, 0, 0.09],
1461
+ rotation: [0, 0, 0],
1462
+ dimensions: [1, 1.1, 1.5],
1463
+ },
1464
+
1465
+ {
1466
+ id: 'stool',
1467
+ category: 'furniture',
1468
+ tags: ['floor', 'seating'],
1469
+ name: 'Stool',
1470
+ thumbnail: '/items/stool/thumbnail.webp',
1471
+ src: '/items/stool/model.glb',
1472
+ scale: [1, 1, 1],
1473
+ offset: [0, 0, 0],
1474
+ rotation: [0, 0, 0],
1475
+ dimensions: [1, 1.2, 1],
1476
+ },
1477
+
1478
+ {
1479
+ id: 'dining-chair',
1480
+ category: 'furniture',
1481
+ tags: ['floor', 'seating'],
1482
+ name: 'Dining Chair',
1483
+ thumbnail: '/items/dining-chair/thumbnail.webp',
1484
+ src: '/items/dining-chair/model.glb',
1485
+ scale: [1, 1, 1],
1486
+ offset: [0, 0, 0],
1487
+ rotation: [0, 0, 0],
1488
+ dimensions: [0.5, 1, 0.5],
1489
+ },
1490
+
1491
+ {
1492
+ id: 'office-chair',
1493
+ category: 'furniture',
1494
+ tags: ['floor', 'seating'],
1495
+ name: 'Office Chair',
1496
+ thumbnail: '/items/office-chair/thumbnail.webp',
1497
+ src: '/items/office-chair/model.glb',
1498
+ scale: [1, 1, 1],
1499
+ offset: [0.01, 0, 0.03],
1500
+ rotation: [0, 0, 0],
1501
+ dimensions: [1, 1.2, 1],
1502
+ },
1503
+
1504
+ {
1505
+ id: 'livingroom-chair',
1506
+ category: 'furniture',
1507
+ tags: ['floor', 'seating'],
1508
+ name: 'Livingroom Chair',
1509
+ thumbnail: '/items/livingroom-chair/thumbnail.webp',
1510
+ src: '/items/livingroom-chair/model.glb',
1511
+ scale: [1, 1, 1],
1512
+ offset: [0.01, 0, 0],
1513
+ rotation: [0, 0, 0],
1514
+ dimensions: [1.5, 0.8, 1.5],
1515
+ },
1516
+
1517
+ {
1518
+ id: 'bedside-table',
1519
+ category: 'furniture',
1520
+ tags: ['floor', 'bedroom'],
1521
+ name: 'Bedside Table',
1522
+ thumbnail: '/items/bedside-table/thumbnail.webp',
1523
+ src: '/items/bedside-table/model.glb',
1524
+ scale: [1, 1, 1],
1525
+ offset: [0, 0, -0.01],
1526
+ rotation: [0, 0, 0],
1527
+ dimensions: [0.5, 0.5, 0.5],
1528
+ surface: {
1529
+ height: 0.5,
1530
+ },
1531
+ },
1532
+
1533
+ {
1534
+ id: 'coffee-table',
1535
+ category: 'furniture',
1536
+ tags: ['floor', 'table'],
1537
+ name: 'Coffee Table',
1538
+ thumbnail: '/items/coffee-table/thumbnail.webp',
1539
+ src: '/items/coffee-table/model.glb',
1540
+ scale: [1, 1, 1],
1541
+ offset: [0, 0, 0],
1542
+ rotation: [0, 0, 0],
1543
+ dimensions: [2, 0.4, 1.5],
1544
+ surface: {
1545
+ height: 0.3,
1546
+ },
1547
+ },
1548
+
1549
+ {
1550
+ id: 'office-table',
1551
+ category: 'furniture',
1552
+ tags: ['floor', 'table'],
1553
+ name: 'Office Table',
1554
+ thumbnail: '/items/office-table/thumbnail.webp',
1555
+ src: '/items/office-table/model.glb',
1556
+ scale: [1, 1, 1],
1557
+ offset: [0, 0, 0],
1558
+ rotation: [0, 0, 0],
1559
+ dimensions: [2, 0.8, 1],
1560
+ surface: {
1561
+ height: 0.75,
1562
+ },
1563
+ },
1564
+
1565
+ {
1566
+ id: 'dining-table',
1567
+ category: 'furniture',
1568
+ tags: ['floor', 'table'],
1569
+ name: 'Dining Table',
1570
+ thumbnail: '/items/dining-table/thumbnail.webp',
1571
+ src: '/items/dining-table/model.glb',
1572
+ scale: [1, 1, 1],
1573
+ offset: [0, 0, -0.01],
1574
+ rotation: [0, 0, 0],
1575
+ dimensions: [2.5, 0.8, 1],
1576
+ surface: {
1577
+ height: 0.8,
1578
+ },
1579
+ },
1580
+ ]