@nice2dev/ui-3d 1.1.0 → 1.1.1

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 (206) hide show
  1. package/dist/cjs/collaborative/collaborativeScene.js +16 -8
  2. package/dist/cjs/collaborative/collaborativeScene.js.map +1 -1
  3. package/dist/cjs/core/i18n.js +3 -3
  4. package/dist/cjs/dance/DanceBridge.js +65 -30
  5. package/dist/cjs/dance/DanceBridge.js.map +1 -1
  6. package/dist/cjs/dance/DanceScoreEngine.js +37 -23
  7. package/dist/cjs/dance/DanceScoreEngine.js.map +1 -1
  8. package/dist/cjs/dance/PoseDetector.js +92 -49
  9. package/dist/cjs/dance/PoseDetector.js.map +1 -1
  10. package/dist/cjs/material/NiceMaterialEditor.js +134 -91
  11. package/dist/cjs/material/NiceMaterialEditor.js.map +1 -1
  12. package/dist/cjs/material/materialEditorUtils.js +86 -55
  13. package/dist/cjs/material/materialEditorUtils.js.map +1 -1
  14. package/dist/cjs/model/ModelEditor.js +16 -14
  15. package/dist/cjs/model/ModelEditor.js.map +1 -1
  16. package/dist/cjs/model/ModelEditorLeftPanel.js +21 -15
  17. package/dist/cjs/model/ModelEditorLeftPanel.js.map +1 -1
  18. package/dist/cjs/model/ModelEditorMenuBar.js +23 -10
  19. package/dist/cjs/model/ModelEditorMenuBar.js.map +1 -1
  20. package/dist/cjs/model/ModelEditorRightPanel.js +32 -27
  21. package/dist/cjs/model/ModelEditorRightPanel.js.map +1 -1
  22. package/dist/cjs/model/ModelEditorSubComponents.js +20 -20
  23. package/dist/cjs/model/ModelEditorSubComponents.js.map +1 -1
  24. package/dist/cjs/model/ModelEditorTimeline.js +12 -11
  25. package/dist/cjs/model/ModelEditorTimeline.js.map +1 -1
  26. package/dist/cjs/model/ModelEditorToolbar.js +5 -5
  27. package/dist/cjs/model/ModelEditorToolbar.js.map +1 -1
  28. package/dist/cjs/model/ModelEditorViewport.js +12 -8
  29. package/dist/cjs/model/ModelEditorViewport.js.map +1 -1
  30. package/dist/cjs/model/ModelViewer.js +16 -15
  31. package/dist/cjs/model/ModelViewer.js.map +1 -1
  32. package/dist/cjs/model/NiceArmatureEditor.js +53 -30
  33. package/dist/cjs/model/NiceArmatureEditor.js.map +1 -1
  34. package/dist/cjs/model/NiceMorphTargetEditor.js +51 -30
  35. package/dist/cjs/model/NiceMorphTargetEditor.js.map +1 -1
  36. package/dist/cjs/model/NiceOctree.js +62 -37
  37. package/dist/cjs/model/NiceOctree.js.map +1 -1
  38. package/dist/cjs/model/NicePhysicsSimulation.js +74 -36
  39. package/dist/cjs/model/NicePhysicsSimulation.js.map +1 -1
  40. package/dist/cjs/model/NiceProceduralGeometry.js +101 -31
  41. package/dist/cjs/model/NiceProceduralGeometry.js.map +1 -1
  42. package/dist/cjs/model/NiceTerrainEditor.js +88 -38
  43. package/dist/cjs/model/NiceTerrainEditor.js.map +1 -1
  44. package/dist/cjs/model/NiceWeightPainter.js +46 -24
  45. package/dist/cjs/model/NiceWeightPainter.js.map +1 -1
  46. package/dist/cjs/model/NiceXRPreview.js +89 -43
  47. package/dist/cjs/model/NiceXRPreview.js.map +1 -1
  48. package/dist/cjs/model/cadModeUtils.js +2 -2
  49. package/dist/cjs/model/cadModeUtils.js.map +1 -1
  50. package/dist/cjs/model/editorShortcuts.js +69 -35
  51. package/dist/cjs/model/editorShortcuts.js.map +1 -1
  52. package/dist/cjs/model/modelEditorTypes.js +56 -52
  53. package/dist/cjs/model/modelEditorTypes.js.map +1 -1
  54. package/dist/cjs/model/modelEditorUtils.js +356 -131
  55. package/dist/cjs/model/modelEditorUtils.js.map +1 -1
  56. package/dist/cjs/model/simsModeUtils.js +819 -74
  57. package/dist/cjs/model/simsModeUtils.js.map +1 -1
  58. package/dist/cjs/model/useModelEditor.js +501 -394
  59. package/dist/cjs/model/useModelEditor.js.map +1 -1
  60. package/dist/cjs/model/useModelViewer.js +117 -86
  61. package/dist/cjs/model/useModelViewer.js.map +1 -1
  62. package/dist/cjs/particle/NiceParticleEditor.js +126 -69
  63. package/dist/cjs/particle/NiceParticleEditor.js.map +1 -1
  64. package/dist/cjs/particle/particleEditorUtils.js +64 -27
  65. package/dist/cjs/particle/particleEditorUtils.js.map +1 -1
  66. package/dist/cjs/rendering/NiceCascadedShadows.js +35 -23
  67. package/dist/cjs/rendering/NiceCascadedShadows.js.map +1 -1
  68. package/dist/cjs/rendering/NiceRenderExport.js +26 -12
  69. package/dist/cjs/rendering/NiceRenderExport.js.map +1 -1
  70. package/dist/cjs/rendering/NiceSSAO.js +28 -23
  71. package/dist/cjs/rendering/NiceSSAO.js.map +1 -1
  72. package/dist/cjs/rendering/NiceSSR.js +22 -18
  73. package/dist/cjs/rendering/NiceSSR.js.map +1 -1
  74. package/dist/cjs/rendering/NiceWebGPURenderer.js +60 -37
  75. package/dist/cjs/rendering/NiceWebGPURenderer.js.map +1 -1
  76. package/dist/cjs/ui/dist/NiceErrorBoundary-D75yr_WE.js +572 -0
  77. package/dist/cjs/ui/dist/NiceErrorBoundary-D75yr_WE.js.map +1 -0
  78. package/dist/cjs/ui/dist/NiceForm-CKoJA6NG.js +4979 -0
  79. package/dist/cjs/ui/dist/NiceForm-CKoJA6NG.js.map +1 -0
  80. package/dist/cjs/ui/dist/NiceModal-1QX7NhyH.js +98 -0
  81. package/dist/cjs/ui/dist/NiceModal-1QX7NhyH.js.map +1 -0
  82. package/dist/cjs/ui/dist/NiceModuleLifecyclePanel-CMrPbSw9.js +5244 -0
  83. package/dist/cjs/ui/dist/NiceModuleLifecyclePanel-CMrPbSw9.js.map +1 -0
  84. package/dist/cjs/ui/dist/NicePagination-DbE-uOkl.js +174 -0
  85. package/dist/cjs/ui/dist/NicePagination-DbE-uOkl.js.map +1 -0
  86. package/dist/cjs/ui/dist/NicePinCodeInput-B8cI8zu8.js +10459 -0
  87. package/dist/cjs/ui/dist/NicePinCodeInput-B8cI8zu8.js.map +1 -0
  88. package/dist/cjs/ui/dist/NiceSavedQueryPanel-CZ5bYOe_.js +6313 -0
  89. package/dist/cjs/ui/dist/NiceSavedQueryPanel-CZ5bYOe_.js.map +1 -0
  90. package/dist/cjs/ui/dist/NiceTabs-DzLHzwuA.js +1639 -0
  91. package/dist/cjs/ui/dist/NiceTabs-DzLHzwuA.js.map +1 -0
  92. package/dist/cjs/ui/dist/NiceWindow-DeC83yfE.js +807 -0
  93. package/dist/cjs/ui/dist/NiceWindow-DeC83yfE.js.map +1 -0
  94. package/dist/cjs/ui/dist/charts-BAS21jkC.js +3833 -0
  95. package/dist/cjs/ui/dist/charts-BAS21jkC.js.map +1 -0
  96. package/dist/cjs/ui/dist/core-Da43q-pO.js +11683 -0
  97. package/dist/cjs/ui/dist/core-Da43q-pO.js.map +1 -0
  98. package/dist/cjs/ui/dist/index-pAuGTbuB.js +28876 -0
  99. package/dist/cjs/ui/dist/index-pAuGTbuB.js.map +1 -0
  100. package/dist/cjs/uv/NiceUVEditor.js +115 -86
  101. package/dist/cjs/uv/NiceUVEditor.js.map +1 -1
  102. package/dist/cjs/uv/uvEditorUtils.js +41 -23
  103. package/dist/cjs/uv/uvEditorUtils.js.map +1 -1
  104. package/dist/esm/collaborative/collaborativeScene.js +16 -8
  105. package/dist/esm/collaborative/collaborativeScene.js.map +1 -1
  106. package/dist/esm/dance/DanceBridge.js +55 -20
  107. package/dist/esm/dance/DanceBridge.js.map +1 -1
  108. package/dist/esm/dance/DanceScoreEngine.js +29 -15
  109. package/dist/esm/dance/DanceScoreEngine.js.map +1 -1
  110. package/dist/esm/dance/PoseDetector.js +73 -30
  111. package/dist/esm/dance/PoseDetector.js.map +1 -1
  112. package/dist/esm/material/NiceMaterialEditor.js +115 -72
  113. package/dist/esm/material/NiceMaterialEditor.js.map +1 -1
  114. package/dist/esm/material/materialEditorUtils.js +86 -55
  115. package/dist/esm/material/materialEditorUtils.js.map +1 -1
  116. package/dist/esm/model/ModelEditor.js +16 -14
  117. package/dist/esm/model/ModelEditor.js.map +1 -1
  118. package/dist/esm/model/ModelEditorLeftPanel.js +21 -15
  119. package/dist/esm/model/ModelEditorLeftPanel.js.map +1 -1
  120. package/dist/esm/model/ModelEditorMenuBar.js +23 -10
  121. package/dist/esm/model/ModelEditorMenuBar.js.map +1 -1
  122. package/dist/esm/model/ModelEditorRightPanel.js +32 -27
  123. package/dist/esm/model/ModelEditorRightPanel.js.map +1 -1
  124. package/dist/esm/model/ModelEditorSubComponents.js +17 -17
  125. package/dist/esm/model/ModelEditorSubComponents.js.map +1 -1
  126. package/dist/esm/model/ModelEditorTimeline.js +12 -11
  127. package/dist/esm/model/ModelEditorTimeline.js.map +1 -1
  128. package/dist/esm/model/ModelEditorToolbar.js +5 -5
  129. package/dist/esm/model/ModelEditorToolbar.js.map +1 -1
  130. package/dist/esm/model/ModelEditorViewport.js +12 -8
  131. package/dist/esm/model/ModelEditorViewport.js.map +1 -1
  132. package/dist/esm/model/ModelViewer.js +8 -7
  133. package/dist/esm/model/ModelViewer.js.map +1 -1
  134. package/dist/esm/model/NiceArmatureEditor.js +36 -13
  135. package/dist/esm/model/NiceArmatureEditor.js.map +1 -1
  136. package/dist/esm/model/NiceMorphTargetEditor.js +34 -13
  137. package/dist/esm/model/NiceMorphTargetEditor.js.map +1 -1
  138. package/dist/esm/model/NiceOctree.js +47 -22
  139. package/dist/esm/model/NiceOctree.js.map +1 -1
  140. package/dist/esm/model/NicePhysicsSimulation.js +51 -13
  141. package/dist/esm/model/NicePhysicsSimulation.js.map +1 -1
  142. package/dist/esm/model/NiceProceduralGeometry.js +94 -24
  143. package/dist/esm/model/NiceProceduralGeometry.js.map +1 -1
  144. package/dist/esm/model/NiceTerrainEditor.js +70 -20
  145. package/dist/esm/model/NiceTerrainEditor.js.map +1 -1
  146. package/dist/esm/model/NiceWeightPainter.js +33 -11
  147. package/dist/esm/model/NiceWeightPainter.js.map +1 -1
  148. package/dist/esm/model/NiceXRPreview.js +72 -26
  149. package/dist/esm/model/NiceXRPreview.js.map +1 -1
  150. package/dist/esm/model/cadModeUtils.js +2 -2
  151. package/dist/esm/model/cadModeUtils.js.map +1 -1
  152. package/dist/esm/model/editorShortcuts.js +69 -35
  153. package/dist/esm/model/editorShortcuts.js.map +1 -1
  154. package/dist/esm/model/modelEditorTypes.js +56 -52
  155. package/dist/esm/model/modelEditorTypes.js.map +1 -1
  156. package/dist/esm/model/modelEditorUtils.js +356 -131
  157. package/dist/esm/model/modelEditorUtils.js.map +1 -1
  158. package/dist/esm/model/simsModeUtils.js +819 -74
  159. package/dist/esm/model/simsModeUtils.js.map +1 -1
  160. package/dist/esm/model/useModelEditor.js +384 -277
  161. package/dist/esm/model/useModelEditor.js.map +1 -1
  162. package/dist/esm/model/useModelViewer.js +56 -25
  163. package/dist/esm/model/useModelViewer.js.map +1 -1
  164. package/dist/esm/particle/NiceParticleEditor.js +116 -59
  165. package/dist/esm/particle/NiceParticleEditor.js.map +1 -1
  166. package/dist/esm/particle/particleEditorUtils.js +64 -27
  167. package/dist/esm/particle/particleEditorUtils.js.map +1 -1
  168. package/dist/esm/rendering/NiceCascadedShadows.js +24 -12
  169. package/dist/esm/rendering/NiceCascadedShadows.js.map +1 -1
  170. package/dist/esm/rendering/NiceRenderExport.js +22 -8
  171. package/dist/esm/rendering/NiceRenderExport.js.map +1 -1
  172. package/dist/esm/rendering/NiceSSAO.js +11 -6
  173. package/dist/esm/rendering/NiceSSAO.js.map +1 -1
  174. package/dist/esm/rendering/NiceSSR.js +9 -5
  175. package/dist/esm/rendering/NiceSSR.js.map +1 -1
  176. package/dist/esm/rendering/NiceWebGPURenderer.js +40 -17
  177. package/dist/esm/rendering/NiceWebGPURenderer.js.map +1 -1
  178. package/dist/esm/ui/dist/NiceErrorBoundary-D75yr_WE.js +563 -0
  179. package/dist/esm/ui/dist/NiceErrorBoundary-D75yr_WE.js.map +1 -0
  180. package/dist/esm/ui/dist/NiceForm-CKoJA6NG.js +4960 -0
  181. package/dist/esm/ui/dist/NiceForm-CKoJA6NG.js.map +1 -0
  182. package/dist/esm/ui/dist/NiceModal-1QX7NhyH.js +96 -0
  183. package/dist/esm/ui/dist/NiceModal-1QX7NhyH.js.map +1 -0
  184. package/dist/esm/ui/dist/NiceModuleLifecyclePanel-CMrPbSw9.js +5201 -0
  185. package/dist/esm/ui/dist/NiceModuleLifecyclePanel-CMrPbSw9.js.map +1 -0
  186. package/dist/esm/ui/dist/NicePagination-DbE-uOkl.js +172 -0
  187. package/dist/esm/ui/dist/NicePagination-DbE-uOkl.js.map +1 -0
  188. package/dist/esm/ui/dist/NicePinCodeInput-B8cI8zu8.js +10408 -0
  189. package/dist/esm/ui/dist/NicePinCodeInput-B8cI8zu8.js.map +1 -0
  190. package/dist/esm/ui/dist/NiceSavedQueryPanel-CZ5bYOe_.js +6296 -0
  191. package/dist/esm/ui/dist/NiceSavedQueryPanel-CZ5bYOe_.js.map +1 -0
  192. package/dist/esm/ui/dist/NiceTabs-DzLHzwuA.js +1630 -0
  193. package/dist/esm/ui/dist/NiceTabs-DzLHzwuA.js.map +1 -0
  194. package/dist/esm/ui/dist/NiceWindow-DeC83yfE.js +796 -0
  195. package/dist/esm/ui/dist/NiceWindow-DeC83yfE.js.map +1 -0
  196. package/dist/esm/ui/dist/charts-BAS21jkC.js +3809 -0
  197. package/dist/esm/ui/dist/charts-BAS21jkC.js.map +1 -0
  198. package/dist/esm/ui/dist/core-Da43q-pO.js +11502 -0
  199. package/dist/esm/ui/dist/core-Da43q-pO.js.map +1 -0
  200. package/dist/esm/ui/dist/index-pAuGTbuB.js +28792 -0
  201. package/dist/esm/ui/dist/index-pAuGTbuB.js.map +1 -0
  202. package/dist/esm/uv/NiceUVEditor.js +91 -62
  203. package/dist/esm/uv/NiceUVEditor.js.map +1 -1
  204. package/dist/esm/uv/uvEditorUtils.js +41 -23
  205. package/dist/esm/uv/uvEditorUtils.js.map +1 -1
  206. package/package.json +2 -2
@@ -11,75 +11,803 @@ import * as THREE from 'three';
11
11
  ════════════════════════════════════════════════════════════════ */
12
12
  const FURNITURE_CATALOG = [
13
13
  // Seating
14
- { id: 'sofa-3seat', name: '3-Seat Sofa', category: 'seating', icon: '🛋️', width: 2.2, depth: 0.9, height: 0.85, color: '#8B7355', tags: ['living', 'comfort'], stackable: false, wallMounted: false, price: 599 },
15
- { id: 'sofa-2seat', name: 'Love Seat', category: 'seating', icon: '🛋️', width: 1.5, depth: 0.85, height: 0.82, color: '#A0522D', tags: ['living'], stackable: false, wallMounted: false, price: 399 },
16
- { id: 'armchair', name: 'Armchair', category: 'seating', icon: '💺', width: 0.85, depth: 0.85, height: 0.9, color: '#6B4423', tags: ['living', 'comfort'], stackable: false, wallMounted: false, price: 249 },
17
- { id: 'dining-chair', name: 'Dining Chair', category: 'seating', icon: '🪑', width: 0.45, depth: 0.45, height: 0.9, color: '#8B7355', tags: ['dining'], stackable: true, wallMounted: false, price: 79 },
18
- { id: 'office-chair', name: 'Office Chair', category: 'seating', icon: '🪑', width: 0.6, depth: 0.6, height: 1.1, color: '#333333', tags: ['office'], stackable: false, wallMounted: false, price: 199 },
19
- { id: 'bar-stool', name: 'Bar Stool', category: 'seating', icon: '🪑', width: 0.4, depth: 0.4, height: 0.75, color: '#696969', tags: ['kitchen', 'bar'], stackable: true, wallMounted: false, price: 89 },
20
- { id: 'bean-bag', name: 'Bean Bag', category: 'seating', icon: '🫧', width: 0.8, depth: 0.8, height: 0.7, color: '#FF6B6B', tags: ['casual'], stackable: false, wallMounted: false, price: 59 },
14
+ {
15
+ id: 'sofa-3seat',
16
+ name: '3-Seat Sofa',
17
+ category: 'seating',
18
+ icon: '🛋️',
19
+ width: 2.2,
20
+ depth: 0.9,
21
+ height: 0.85,
22
+ color: '#8B7355',
23
+ tags: ['living', 'comfort'],
24
+ stackable: false,
25
+ wallMounted: false,
26
+ price: 599,
27
+ },
28
+ {
29
+ id: 'sofa-2seat',
30
+ name: 'Love Seat',
31
+ category: 'seating',
32
+ icon: '🛋️',
33
+ width: 1.5,
34
+ depth: 0.85,
35
+ height: 0.82,
36
+ color: '#A0522D',
37
+ tags: ['living'],
38
+ stackable: false,
39
+ wallMounted: false,
40
+ price: 399,
41
+ },
42
+ {
43
+ id: 'armchair',
44
+ name: 'Armchair',
45
+ category: 'seating',
46
+ icon: '💺',
47
+ width: 0.85,
48
+ depth: 0.85,
49
+ height: 0.9,
50
+ color: '#6B4423',
51
+ tags: ['living', 'comfort'],
52
+ stackable: false,
53
+ wallMounted: false,
54
+ price: 249,
55
+ },
56
+ {
57
+ id: 'dining-chair',
58
+ name: 'Dining Chair',
59
+ category: 'seating',
60
+ icon: '🪑',
61
+ width: 0.45,
62
+ depth: 0.45,
63
+ height: 0.9,
64
+ color: '#8B7355',
65
+ tags: ['dining'],
66
+ stackable: true,
67
+ wallMounted: false,
68
+ price: 79,
69
+ },
70
+ {
71
+ id: 'office-chair',
72
+ name: 'Office Chair',
73
+ category: 'seating',
74
+ icon: '🪑',
75
+ width: 0.6,
76
+ depth: 0.6,
77
+ height: 1.1,
78
+ color: '#333333',
79
+ tags: ['office'],
80
+ stackable: false,
81
+ wallMounted: false,
82
+ price: 199,
83
+ },
84
+ {
85
+ id: 'bar-stool',
86
+ name: 'Bar Stool',
87
+ category: 'seating',
88
+ icon: '🪑',
89
+ width: 0.4,
90
+ depth: 0.4,
91
+ height: 0.75,
92
+ color: '#696969',
93
+ tags: ['kitchen', 'bar'],
94
+ stackable: true,
95
+ wallMounted: false,
96
+ price: 89,
97
+ },
98
+ {
99
+ id: 'bean-bag',
100
+ name: 'Bean Bag',
101
+ category: 'seating',
102
+ icon: '🫧',
103
+ width: 0.8,
104
+ depth: 0.8,
105
+ height: 0.7,
106
+ color: '#FF6B6B',
107
+ tags: ['casual'],
108
+ stackable: false,
109
+ wallMounted: false,
110
+ price: 59,
111
+ },
21
112
  // Tables
22
- { id: 'dining-table-6', name: 'Dining Table (6p)', category: 'tables', icon: '🪵', width: 1.8, depth: 0.9, height: 0.75, color: '#8B6914', tags: ['dining'], stackable: false, wallMounted: false, price: 499 },
23
- { id: 'dining-table-4', name: 'Dining Table (4p)', category: 'tables', icon: '🪵', width: 1.2, depth: 0.8, height: 0.75, color: '#A0522D', tags: ['dining'], stackable: false, wallMounted: false, price: 349 },
24
- { id: 'coffee-table', name: 'Coffee Table', category: 'tables', icon: '🪵', width: 1.2, depth: 0.6, height: 0.45, color: '#654321', tags: ['living'], stackable: false, wallMounted: false, price: 179 },
25
- { id: 'side-table', name: 'Side Table', category: 'tables', icon: '🪵', width: 0.5, depth: 0.5, height: 0.55, color: '#8B6914', tags: ['living', 'bedroom'], stackable: false, wallMounted: false, price: 99 },
26
- { id: 'desk', name: 'Office Desk', category: 'tables', icon: '🪵', width: 1.4, depth: 0.7, height: 0.75, color: '#696969', tags: ['office'], stackable: false, wallMounted: false, price: 299 },
27
- { id: 'console-table', name: 'Console Table', category: 'tables', icon: '🪵', width: 1.2, depth: 0.35, height: 0.8, color: '#B8860B', tags: ['hallway'], stackable: false, wallMounted: false, price: 199 },
113
+ {
114
+ id: 'dining-table-6',
115
+ name: 'Dining Table (6p)',
116
+ category: 'tables',
117
+ icon: '🪵',
118
+ width: 1.8,
119
+ depth: 0.9,
120
+ height: 0.75,
121
+ color: '#8B6914',
122
+ tags: ['dining'],
123
+ stackable: false,
124
+ wallMounted: false,
125
+ price: 499,
126
+ },
127
+ {
128
+ id: 'dining-table-4',
129
+ name: 'Dining Table (4p)',
130
+ category: 'tables',
131
+ icon: '🪵',
132
+ width: 1.2,
133
+ depth: 0.8,
134
+ height: 0.75,
135
+ color: '#A0522D',
136
+ tags: ['dining'],
137
+ stackable: false,
138
+ wallMounted: false,
139
+ price: 349,
140
+ },
141
+ {
142
+ id: 'coffee-table',
143
+ name: 'Coffee Table',
144
+ category: 'tables',
145
+ icon: '🪵',
146
+ width: 1.2,
147
+ depth: 0.6,
148
+ height: 0.45,
149
+ color: '#654321',
150
+ tags: ['living'],
151
+ stackable: false,
152
+ wallMounted: false,
153
+ price: 179,
154
+ },
155
+ {
156
+ id: 'side-table',
157
+ name: 'Side Table',
158
+ category: 'tables',
159
+ icon: '🪵',
160
+ width: 0.5,
161
+ depth: 0.5,
162
+ height: 0.55,
163
+ color: '#8B6914',
164
+ tags: ['living', 'bedroom'],
165
+ stackable: false,
166
+ wallMounted: false,
167
+ price: 99,
168
+ },
169
+ {
170
+ id: 'desk',
171
+ name: 'Office Desk',
172
+ category: 'tables',
173
+ icon: '🪵',
174
+ width: 1.4,
175
+ depth: 0.7,
176
+ height: 0.75,
177
+ color: '#696969',
178
+ tags: ['office'],
179
+ stackable: false,
180
+ wallMounted: false,
181
+ price: 299,
182
+ },
183
+ {
184
+ id: 'console-table',
185
+ name: 'Console Table',
186
+ category: 'tables',
187
+ icon: '🪵',
188
+ width: 1.2,
189
+ depth: 0.35,
190
+ height: 0.8,
191
+ color: '#B8860B',
192
+ tags: ['hallway'],
193
+ stackable: false,
194
+ wallMounted: false,
195
+ price: 199,
196
+ },
28
197
  // Beds
29
- { id: 'bed-king', name: 'King Bed', category: 'beds', icon: '🛏️', width: 1.9, depth: 2.1, height: 0.6, color: '#F5DEB3', tags: ['bedroom'], stackable: false, wallMounted: false, price: 899 },
30
- { id: 'bed-queen', name: 'Queen Bed', category: 'beds', icon: '🛏️', width: 1.6, depth: 2.0, height: 0.6, color: '#DEB887', tags: ['bedroom'], stackable: false, wallMounted: false, price: 699 },
31
- { id: 'bed-single', name: 'Single Bed', category: 'beds', icon: '🛏️', width: 1.0, depth: 2.0, height: 0.55, color: '#87CEEB', tags: ['bedroom', 'kids'], stackable: false, wallMounted: false, price: 349 },
32
- { id: 'bunk-bed', name: 'Bunk Bed', category: 'beds', icon: '🛏️', width: 1.0, depth: 2.0, height: 1.7, color: '#BC8F8F', tags: ['kids'], stackable: false, wallMounted: false, price: 499 },
33
- { id: 'crib', name: 'Baby Crib', category: 'beds', icon: '🛏️', width: 0.7, depth: 1.3, height: 1.0, color: '#FFFAF0', tags: ['nursery'], stackable: false, wallMounted: false, price: 299 },
198
+ {
199
+ id: 'bed-king',
200
+ name: 'King Bed',
201
+ category: 'beds',
202
+ icon: '🛏️',
203
+ width: 1.9,
204
+ depth: 2.1,
205
+ height: 0.6,
206
+ color: '#F5DEB3',
207
+ tags: ['bedroom'],
208
+ stackable: false,
209
+ wallMounted: false,
210
+ price: 899,
211
+ },
212
+ {
213
+ id: 'bed-queen',
214
+ name: 'Queen Bed',
215
+ category: 'beds',
216
+ icon: '🛏️',
217
+ width: 1.6,
218
+ depth: 2.0,
219
+ height: 0.6,
220
+ color: '#DEB887',
221
+ tags: ['bedroom'],
222
+ stackable: false,
223
+ wallMounted: false,
224
+ price: 699,
225
+ },
226
+ {
227
+ id: 'bed-single',
228
+ name: 'Single Bed',
229
+ category: 'beds',
230
+ icon: '🛏️',
231
+ width: 1.0,
232
+ depth: 2.0,
233
+ height: 0.55,
234
+ color: '#87CEEB',
235
+ tags: ['bedroom', 'kids'],
236
+ stackable: false,
237
+ wallMounted: false,
238
+ price: 349,
239
+ },
240
+ {
241
+ id: 'bunk-bed',
242
+ name: 'Bunk Bed',
243
+ category: 'beds',
244
+ icon: '🛏️',
245
+ width: 1.0,
246
+ depth: 2.0,
247
+ height: 1.7,
248
+ color: '#BC8F8F',
249
+ tags: ['kids'],
250
+ stackable: false,
251
+ wallMounted: false,
252
+ price: 499,
253
+ },
254
+ {
255
+ id: 'crib',
256
+ name: 'Baby Crib',
257
+ category: 'beds',
258
+ icon: '🛏️',
259
+ width: 0.7,
260
+ depth: 1.3,
261
+ height: 1.0,
262
+ color: '#FFFAF0',
263
+ tags: ['nursery'],
264
+ stackable: false,
265
+ wallMounted: false,
266
+ price: 299,
267
+ },
34
268
  // Storage
35
- { id: 'bookshelf', name: 'Bookshelf', category: 'storage', icon: '📚', width: 0.8, depth: 0.35, height: 1.8, color: '#8B6914', tags: ['living', 'office'], stackable: false, wallMounted: false, price: 229 },
36
- { id: 'wardrobe', name: 'Wardrobe', category: 'storage', icon: '🚪', width: 1.2, depth: 0.6, height: 2.0, color: '#A0522D', tags: ['bedroom'], stackable: false, wallMounted: false, price: 449 },
37
- { id: 'tv-unit', name: 'TV Unit', category: 'storage', icon: '📺', width: 1.6, depth: 0.45, height: 0.55, color: '#36454F', tags: ['living'], stackable: false, wallMounted: false, price: 329 },
38
- { id: 'dresser', name: 'Dresser', category: 'storage', icon: '🗄️', width: 1.0, depth: 0.5, height: 0.85, color: '#DEB887', tags: ['bedroom'], stackable: false, wallMounted: false, price: 279 },
39
- { id: 'shelf-wall', name: 'Wall Shelf', category: 'storage', icon: '📏', width: 0.8, depth: 0.2, height: 0.03, color: '#8B6914', tags: ['any'], stackable: false, wallMounted: true, price: 49 },
269
+ {
270
+ id: 'bookshelf',
271
+ name: 'Bookshelf',
272
+ category: 'storage',
273
+ icon: '📚',
274
+ width: 0.8,
275
+ depth: 0.35,
276
+ height: 1.8,
277
+ color: '#8B6914',
278
+ tags: ['living', 'office'],
279
+ stackable: false,
280
+ wallMounted: false,
281
+ price: 229,
282
+ },
283
+ {
284
+ id: 'wardrobe',
285
+ name: 'Wardrobe',
286
+ category: 'storage',
287
+ icon: '🚪',
288
+ width: 1.2,
289
+ depth: 0.6,
290
+ height: 2.0,
291
+ color: '#A0522D',
292
+ tags: ['bedroom'],
293
+ stackable: false,
294
+ wallMounted: false,
295
+ price: 449,
296
+ },
297
+ {
298
+ id: 'tv-unit',
299
+ name: 'TV Unit',
300
+ category: 'storage',
301
+ icon: '📺',
302
+ width: 1.6,
303
+ depth: 0.45,
304
+ height: 0.55,
305
+ color: '#36454F',
306
+ tags: ['living'],
307
+ stackable: false,
308
+ wallMounted: false,
309
+ price: 329,
310
+ },
311
+ {
312
+ id: 'dresser',
313
+ name: 'Dresser',
314
+ category: 'storage',
315
+ icon: '🗄️',
316
+ width: 1.0,
317
+ depth: 0.5,
318
+ height: 0.85,
319
+ color: '#DEB887',
320
+ tags: ['bedroom'],
321
+ stackable: false,
322
+ wallMounted: false,
323
+ price: 279,
324
+ },
325
+ {
326
+ id: 'shelf-wall',
327
+ name: 'Wall Shelf',
328
+ category: 'storage',
329
+ icon: '📏',
330
+ width: 0.8,
331
+ depth: 0.2,
332
+ height: 0.03,
333
+ color: '#8B6914',
334
+ tags: ['any'],
335
+ stackable: false,
336
+ wallMounted: true,
337
+ price: 49,
338
+ },
40
339
  // Lighting
41
- { id: 'floor-lamp', name: 'Floor Lamp', category: 'lighting', icon: '💡', width: 0.4, depth: 0.4, height: 1.7, color: '#FFD700', tags: ['living'], stackable: false, wallMounted: false, price: 119 },
42
- { id: 'table-lamp', name: 'Table Lamp', category: 'lighting', icon: '🔦', width: 0.3, depth: 0.3, height: 0.5, color: '#FAFAD2', tags: ['bedroom', 'living'], stackable: false, wallMounted: false, price: 59 },
43
- { id: 'ceiling-fan', name: 'Ceiling Fan', category: 'lighting', icon: '🌀', width: 1.2, depth: 1.2, height: 0.35, color: '#C0C0C0', tags: ['any'], stackable: false, wallMounted: false, price: 179 },
44
- { id: 'pendant', name: 'Pendant Light', category: 'lighting', icon: '💡', width: 0.4, depth: 0.4, height: 0.6, color: '#FFD700', tags: ['kitchen', 'dining'], stackable: false, wallMounted: false, price: 149 },
340
+ {
341
+ id: 'floor-lamp',
342
+ name: 'Floor Lamp',
343
+ category: 'lighting',
344
+ icon: '💡',
345
+ width: 0.4,
346
+ depth: 0.4,
347
+ height: 1.7,
348
+ color: '#FFD700',
349
+ tags: ['living'],
350
+ stackable: false,
351
+ wallMounted: false,
352
+ price: 119,
353
+ },
354
+ {
355
+ id: 'table-lamp',
356
+ name: 'Table Lamp',
357
+ category: 'lighting',
358
+ icon: '🔦',
359
+ width: 0.3,
360
+ depth: 0.3,
361
+ height: 0.5,
362
+ color: '#FAFAD2',
363
+ tags: ['bedroom', 'living'],
364
+ stackable: false,
365
+ wallMounted: false,
366
+ price: 59,
367
+ },
368
+ {
369
+ id: 'ceiling-fan',
370
+ name: 'Ceiling Fan',
371
+ category: 'lighting',
372
+ icon: '🌀',
373
+ width: 1.2,
374
+ depth: 1.2,
375
+ height: 0.35,
376
+ color: '#C0C0C0',
377
+ tags: ['any'],
378
+ stackable: false,
379
+ wallMounted: false,
380
+ price: 179,
381
+ },
382
+ {
383
+ id: 'pendant',
384
+ name: 'Pendant Light',
385
+ category: 'lighting',
386
+ icon: '💡',
387
+ width: 0.4,
388
+ depth: 0.4,
389
+ height: 0.6,
390
+ color: '#FFD700',
391
+ tags: ['kitchen', 'dining'],
392
+ stackable: false,
393
+ wallMounted: false,
394
+ price: 149,
395
+ },
45
396
  // Appliances
46
- { id: 'fridge', name: 'Refrigerator', category: 'appliances', icon: '🧊', width: 0.7, depth: 0.7, height: 1.8, color: '#C0C0C0', tags: ['kitchen'], stackable: false, wallMounted: false, price: 999 },
47
- { id: 'stove', name: 'Stove/Oven', category: 'appliances', icon: '🍳', width: 0.6, depth: 0.6, height: 0.9, color: '#696969', tags: ['kitchen'], stackable: false, wallMounted: false, price: 799 },
48
- { id: 'dishwasher', name: 'Dishwasher', category: 'appliances', icon: '🍽️', width: 0.6, depth: 0.6, height: 0.85, color: '#C0C0C0', tags: ['kitchen'], stackable: false, wallMounted: false, price: 549 },
49
- { id: 'washer', name: 'Washing Machine', category: 'appliances', icon: '🧺', width: 0.6, depth: 0.6, height: 0.85, color: '#F5F5F5', tags: ['laundry'], stackable: false, wallMounted: false, price: 599 },
50
- { id: 'microwave', name: 'Microwave', category: 'appliances', icon: '📻', width: 0.5, depth: 0.4, height: 0.3, color: '#333333', tags: ['kitchen'], stackable: true, wallMounted: false, price: 149 },
397
+ {
398
+ id: 'fridge',
399
+ name: 'Refrigerator',
400
+ category: 'appliances',
401
+ icon: '🧊',
402
+ width: 0.7,
403
+ depth: 0.7,
404
+ height: 1.8,
405
+ color: '#C0C0C0',
406
+ tags: ['kitchen'],
407
+ stackable: false,
408
+ wallMounted: false,
409
+ price: 999,
410
+ },
411
+ {
412
+ id: 'stove',
413
+ name: 'Stove/Oven',
414
+ category: 'appliances',
415
+ icon: '🍳',
416
+ width: 0.6,
417
+ depth: 0.6,
418
+ height: 0.9,
419
+ color: '#696969',
420
+ tags: ['kitchen'],
421
+ stackable: false,
422
+ wallMounted: false,
423
+ price: 799,
424
+ },
425
+ {
426
+ id: 'dishwasher',
427
+ name: 'Dishwasher',
428
+ category: 'appliances',
429
+ icon: '🍽️',
430
+ width: 0.6,
431
+ depth: 0.6,
432
+ height: 0.85,
433
+ color: '#C0C0C0',
434
+ tags: ['kitchen'],
435
+ stackable: false,
436
+ wallMounted: false,
437
+ price: 549,
438
+ },
439
+ {
440
+ id: 'washer',
441
+ name: 'Washing Machine',
442
+ category: 'appliances',
443
+ icon: '🧺',
444
+ width: 0.6,
445
+ depth: 0.6,
446
+ height: 0.85,
447
+ color: '#F5F5F5',
448
+ tags: ['laundry'],
449
+ stackable: false,
450
+ wallMounted: false,
451
+ price: 599,
452
+ },
453
+ {
454
+ id: 'microwave',
455
+ name: 'Microwave',
456
+ category: 'appliances',
457
+ icon: '📻',
458
+ width: 0.5,
459
+ depth: 0.4,
460
+ height: 0.3,
461
+ color: '#333333',
462
+ tags: ['kitchen'],
463
+ stackable: true,
464
+ wallMounted: false,
465
+ price: 149,
466
+ },
51
467
  // Bathroom
52
- { id: 'toilet', name: 'Toilet', category: 'bathroom', icon: '🚽', width: 0.4, depth: 0.7, height: 0.75, color: '#FFFFF0', tags: ['bathroom'], stackable: false, wallMounted: false, price: 199 },
53
- { id: 'bathtub', name: 'Bathtub', category: 'bathroom', icon: '🛁', width: 0.75, depth: 1.7, height: 0.6, color: '#FFFFF0', tags: ['bathroom'], stackable: false, wallMounted: false, price: 599 },
54
- { id: 'shower', name: 'Shower Cabin', category: 'bathroom', icon: '🚿', width: 0.9, depth: 0.9, height: 2.1, color: '#E0FFFF', tags: ['bathroom'], stackable: false, wallMounted: false, price: 449 },
55
- { id: 'vanity', name: 'Bathroom Vanity', category: 'bathroom', icon: '🪞', width: 0.8, depth: 0.5, height: 0.85, color: '#FFFFF0', tags: ['bathroom'], stackable: false, wallMounted: false, price: 349 },
56
- { id: 'sink-kitchen', name: 'Kitchen Sink', category: 'kitchen', icon: '🚰', width: 0.6, depth: 0.5, height: 0.85, color: '#C0C0C0', tags: ['kitchen'], stackable: false, wallMounted: false, price: 199 },
468
+ {
469
+ id: 'toilet',
470
+ name: 'Toilet',
471
+ category: 'bathroom',
472
+ icon: '🚽',
473
+ width: 0.4,
474
+ depth: 0.7,
475
+ height: 0.75,
476
+ color: '#FFFFF0',
477
+ tags: ['bathroom'],
478
+ stackable: false,
479
+ wallMounted: false,
480
+ price: 199,
481
+ },
482
+ {
483
+ id: 'bathtub',
484
+ name: 'Bathtub',
485
+ category: 'bathroom',
486
+ icon: '🛁',
487
+ width: 0.75,
488
+ depth: 1.7,
489
+ height: 0.6,
490
+ color: '#FFFFF0',
491
+ tags: ['bathroom'],
492
+ stackable: false,
493
+ wallMounted: false,
494
+ price: 599,
495
+ },
496
+ {
497
+ id: 'shower',
498
+ name: 'Shower Cabin',
499
+ category: 'bathroom',
500
+ icon: '🚿',
501
+ width: 0.9,
502
+ depth: 0.9,
503
+ height: 2.1,
504
+ color: '#E0FFFF',
505
+ tags: ['bathroom'],
506
+ stackable: false,
507
+ wallMounted: false,
508
+ price: 449,
509
+ },
510
+ {
511
+ id: 'vanity',
512
+ name: 'Bathroom Vanity',
513
+ category: 'bathroom',
514
+ icon: '🪞',
515
+ width: 0.8,
516
+ depth: 0.5,
517
+ height: 0.85,
518
+ color: '#FFFFF0',
519
+ tags: ['bathroom'],
520
+ stackable: false,
521
+ wallMounted: false,
522
+ price: 349,
523
+ },
524
+ {
525
+ id: 'sink-kitchen',
526
+ name: 'Kitchen Sink',
527
+ category: 'kitchen',
528
+ icon: '🚰',
529
+ width: 0.6,
530
+ depth: 0.5,
531
+ height: 0.85,
532
+ color: '#C0C0C0',
533
+ tags: ['kitchen'],
534
+ stackable: false,
535
+ wallMounted: false,
536
+ price: 199,
537
+ },
57
538
  // Decor
58
- { id: 'painting-large', name: 'Large Painting', category: 'decor', icon: '🖼️', width: 1.0, depth: 0.05, height: 0.7, color: '#B8860B', tags: ['any'], stackable: false, wallMounted: true, price: 89 },
59
- { id: 'mirror', name: 'Wall Mirror', category: 'decor', icon: '🪞', width: 0.6, depth: 0.03, height: 0.9, color: '#E0E0E0', tags: ['bathroom', 'hallway'], stackable: false, wallMounted: true, price: 69 },
60
- { id: 'clock', name: 'Wall Clock', category: 'decor', icon: '🕐', width: 0.3, depth: 0.05, height: 0.3, color: '#333333', tags: ['any'], stackable: false, wallMounted: true, price: 39 },
539
+ {
540
+ id: 'painting-large',
541
+ name: 'Large Painting',
542
+ category: 'decor',
543
+ icon: '🖼️',
544
+ width: 1.0,
545
+ depth: 0.05,
546
+ height: 0.7,
547
+ color: '#B8860B',
548
+ tags: ['any'],
549
+ stackable: false,
550
+ wallMounted: true,
551
+ price: 89,
552
+ },
553
+ {
554
+ id: 'mirror',
555
+ name: 'Wall Mirror',
556
+ category: 'decor',
557
+ icon: '🪞',
558
+ width: 0.6,
559
+ depth: 0.03,
560
+ height: 0.9,
561
+ color: '#E0E0E0',
562
+ tags: ['bathroom', 'hallway'],
563
+ stackable: false,
564
+ wallMounted: true,
565
+ price: 69,
566
+ },
567
+ {
568
+ id: 'clock',
569
+ name: 'Wall Clock',
570
+ category: 'decor',
571
+ icon: '🕐',
572
+ width: 0.3,
573
+ depth: 0.05,
574
+ height: 0.3,
575
+ color: '#333333',
576
+ tags: ['any'],
577
+ stackable: false,
578
+ wallMounted: true,
579
+ price: 39,
580
+ },
61
581
  // Plants
62
- { id: 'plant-large', name: 'Large Plant', category: 'plants', icon: '🌿', width: 0.5, depth: 0.5, height: 1.4, color: '#228B22', tags: ['any'], stackable: false, wallMounted: false, price: 49 },
63
- { id: 'plant-small', name: 'Small Plant', category: 'plants', icon: '🪴', width: 0.2, depth: 0.2, height: 0.35, color: '#2E8B57', tags: ['any'], stackable: true, wallMounted: false, price: 19 },
64
- { id: 'flower-vase', name: 'Flower Vase', category: 'plants', icon: '🌸', width: 0.15, depth: 0.15, height: 0.35, color: '#FF69B4', tags: ['decor'], stackable: true, wallMounted: false, price: 25 },
582
+ {
583
+ id: 'plant-large',
584
+ name: 'Large Plant',
585
+ category: 'plants',
586
+ icon: '🌿',
587
+ width: 0.5,
588
+ depth: 0.5,
589
+ height: 1.4,
590
+ color: '#228B22',
591
+ tags: ['any'],
592
+ stackable: false,
593
+ wallMounted: false,
594
+ price: 49,
595
+ },
596
+ {
597
+ id: 'plant-small',
598
+ name: 'Small Plant',
599
+ category: 'plants',
600
+ icon: '🪴',
601
+ width: 0.2,
602
+ depth: 0.2,
603
+ height: 0.35,
604
+ color: '#2E8B57',
605
+ tags: ['any'],
606
+ stackable: true,
607
+ wallMounted: false,
608
+ price: 19,
609
+ },
610
+ {
611
+ id: 'flower-vase',
612
+ name: 'Flower Vase',
613
+ category: 'plants',
614
+ icon: '🌸',
615
+ width: 0.15,
616
+ depth: 0.15,
617
+ height: 0.35,
618
+ color: '#FF69B4',
619
+ tags: ['decor'],
620
+ stackable: true,
621
+ wallMounted: false,
622
+ price: 25,
623
+ },
65
624
  // Electronics
66
- { id: 'tv-65', name: '65" TV', category: 'electronics', icon: '📺', width: 1.45, depth: 0.08, height: 0.85, color: '#1a1a1a', tags: ['living'], stackable: false, wallMounted: true, price: 799 },
67
- { id: 'tv-50', name: '50" TV', category: 'electronics', icon: '📺', width: 1.12, depth: 0.08, height: 0.65, color: '#1a1a1a', tags: ['living', 'bedroom'], stackable: false, wallMounted: true, price: 449 },
68
- { id: 'computer', name: 'Desktop Computer', category: 'electronics', icon: '🖥️', width: 0.55, depth: 0.3, height: 0.45, color: '#2F4F4F', tags: ['office'], stackable: false, wallMounted: false, price: 999 },
625
+ {
626
+ id: 'tv-65',
627
+ name: '65" TV',
628
+ category: 'electronics',
629
+ icon: '📺',
630
+ width: 1.45,
631
+ depth: 0.08,
632
+ height: 0.85,
633
+ color: '#1a1a1a',
634
+ tags: ['living'],
635
+ stackable: false,
636
+ wallMounted: true,
637
+ price: 799,
638
+ },
639
+ {
640
+ id: 'tv-50',
641
+ name: '50" TV',
642
+ category: 'electronics',
643
+ icon: '📺',
644
+ width: 1.12,
645
+ depth: 0.08,
646
+ height: 0.65,
647
+ color: '#1a1a1a',
648
+ tags: ['living', 'bedroom'],
649
+ stackable: false,
650
+ wallMounted: true,
651
+ price: 449,
652
+ },
653
+ {
654
+ id: 'computer',
655
+ name: 'Desktop Computer',
656
+ category: 'electronics',
657
+ icon: '🖥️',
658
+ width: 0.55,
659
+ depth: 0.3,
660
+ height: 0.45,
661
+ color: '#2F4F4F',
662
+ tags: ['office'],
663
+ stackable: false,
664
+ wallMounted: false,
665
+ price: 999,
666
+ },
69
667
  // Rugs
70
- { id: 'rug-large', name: 'Large Area Rug', category: 'rugs', icon: '🟫', width: 2.5, depth: 3.5, height: 0.02, color: '#8B4513', tags: ['living'], stackable: false, wallMounted: false, price: 199 },
71
- { id: 'rug-round', name: 'Round Rug', category: 'rugs', icon: '⭕', width: 1.5, depth: 1.5, height: 0.02, color: '#CD853F', tags: ['any'], stackable: false, wallMounted: false, price: 129 },
668
+ {
669
+ id: 'rug-large',
670
+ name: 'Large Area Rug',
671
+ category: 'rugs',
672
+ icon: '🟫',
673
+ width: 2.5,
674
+ depth: 3.5,
675
+ height: 0.02,
676
+ color: '#8B4513',
677
+ tags: ['living'],
678
+ stackable: false,
679
+ wallMounted: false,
680
+ price: 199,
681
+ },
682
+ {
683
+ id: 'rug-round',
684
+ name: 'Round Rug',
685
+ category: 'rugs',
686
+ icon: '⭕',
687
+ width: 1.5,
688
+ depth: 1.5,
689
+ height: 0.02,
690
+ color: '#CD853F',
691
+ tags: ['any'],
692
+ stackable: false,
693
+ wallMounted: false,
694
+ price: 129,
695
+ },
72
696
  // Outdoor
73
- { id: 'patio-table', name: 'Patio Table', category: 'outdoor', icon: '☂️', width: 1.0, depth: 1.0, height: 0.72, color: '#808080', tags: ['outdoor'], stackable: false, wallMounted: false, price: 249 },
74
- { id: 'patio-chair', name: 'Patio Chair', category: 'outdoor', icon: '🪑', width: 0.55, depth: 0.55, height: 0.85, color: '#808080', tags: ['outdoor'], stackable: true, wallMounted: false, price: 99 },
75
- { id: 'bbq-grill', name: 'BBQ Grill', category: 'outdoor', icon: '🔥', width: 1.2, depth: 0.6, height: 1.1, color: '#333333', tags: ['outdoor'], stackable: false, wallMounted: false, price: 399 },
697
+ {
698
+ id: 'patio-table',
699
+ name: 'Patio Table',
700
+ category: 'outdoor',
701
+ icon: '☂️',
702
+ width: 1.0,
703
+ depth: 1.0,
704
+ height: 0.72,
705
+ color: '#808080',
706
+ tags: ['outdoor'],
707
+ stackable: false,
708
+ wallMounted: false,
709
+ price: 249,
710
+ },
711
+ {
712
+ id: 'patio-chair',
713
+ name: 'Patio Chair',
714
+ category: 'outdoor',
715
+ icon: '🪑',
716
+ width: 0.55,
717
+ depth: 0.55,
718
+ height: 0.85,
719
+ color: '#808080',
720
+ tags: ['outdoor'],
721
+ stackable: true,
722
+ wallMounted: false,
723
+ price: 99,
724
+ },
725
+ {
726
+ id: 'bbq-grill',
727
+ name: 'BBQ Grill',
728
+ category: 'outdoor',
729
+ icon: '🔥',
730
+ width: 1.2,
731
+ depth: 0.6,
732
+ height: 1.1,
733
+ color: '#333333',
734
+ tags: ['outdoor'],
735
+ stackable: false,
736
+ wallMounted: false,
737
+ price: 399,
738
+ },
76
739
  // Kitchen
77
- { id: 'counter', name: 'Kitchen Counter', category: 'kitchen', icon: '🧱', width: 0.6, depth: 0.6, height: 0.9, color: '#D2B48C', tags: ['kitchen'], stackable: false, wallMounted: false, price: 199 },
78
- { id: 'island', name: 'Kitchen Island', category: 'kitchen', icon: '🧱', width: 1.5, depth: 0.8, height: 0.9, color: '#DCDCDC', tags: ['kitchen'], stackable: false, wallMounted: false, price: 599 },
79
- { id: 'cabinet-upper', name: 'Upper Cabinet', category: 'kitchen', icon: '🗄️', width: 0.6, depth: 0.35, height: 0.7, color: '#F5DEB3', tags: ['kitchen'], stackable: false, wallMounted: true, price: 149 },
740
+ {
741
+ id: 'counter',
742
+ name: 'Kitchen Counter',
743
+ category: 'kitchen',
744
+ icon: '🧱',
745
+ width: 0.6,
746
+ depth: 0.6,
747
+ height: 0.9,
748
+ color: '#D2B48C',
749
+ tags: ['kitchen'],
750
+ stackable: false,
751
+ wallMounted: false,
752
+ price: 199,
753
+ },
754
+ {
755
+ id: 'island',
756
+ name: 'Kitchen Island',
757
+ category: 'kitchen',
758
+ icon: '🧱',
759
+ width: 1.5,
760
+ depth: 0.8,
761
+ height: 0.9,
762
+ color: '#DCDCDC',
763
+ tags: ['kitchen'],
764
+ stackable: false,
765
+ wallMounted: false,
766
+ price: 599,
767
+ },
768
+ {
769
+ id: 'cabinet-upper',
770
+ name: 'Upper Cabinet',
771
+ category: 'kitchen',
772
+ icon: '🗄️',
773
+ width: 0.6,
774
+ depth: 0.35,
775
+ height: 0.7,
776
+ color: '#F5DEB3',
777
+ tags: ['kitchen'],
778
+ stackable: false,
779
+ wallMounted: true,
780
+ price: 149,
781
+ },
80
782
  // Office
81
- { id: 'filing-cabinet', name: 'Filing Cabinet', category: 'office', icon: '🗄️', width: 0.4, depth: 0.6, height: 1.0, color: '#808080', tags: ['office'], stackable: false, wallMounted: false, price: 129 },
82
- { id: 'whiteboard', name: 'Whiteboard', category: 'office', icon: '📋', width: 1.2, depth: 0.05, height: 0.9, color: '#FFFFFF', tags: ['office'], stackable: false, wallMounted: true, price: 99 },
783
+ {
784
+ id: 'filing-cabinet',
785
+ name: 'Filing Cabinet',
786
+ category: 'office',
787
+ icon: '🗄️',
788
+ width: 0.4,
789
+ depth: 0.6,
790
+ height: 1.0,
791
+ color: '#808080',
792
+ tags: ['office'],
793
+ stackable: false,
794
+ wallMounted: false,
795
+ price: 129,
796
+ },
797
+ {
798
+ id: 'whiteboard',
799
+ name: 'Whiteboard',
800
+ category: 'office',
801
+ icon: '📋',
802
+ width: 1.2,
803
+ depth: 0.05,
804
+ height: 0.9,
805
+ color: '#FFFFFF',
806
+ tags: ['office'],
807
+ stackable: false,
808
+ wallMounted: true,
809
+ price: 99,
810
+ },
83
811
  ];
84
812
  const FURNITURE_CATEGORIES = [
85
813
  { id: 'seating', name: 'Seating', icon: '🛋️' },
@@ -102,7 +830,9 @@ const FURNITURE_CATEGORIES = [
102
830
  ════════════════════════════════════════════════════════════════ */
103
831
  const ROOM_PRESETS = [
104
832
  {
105
- id: 'living-modern', name: 'Modern Living Room', icon: '🛋️',
833
+ id: 'living-modern',
834
+ name: 'Modern Living Room',
835
+ icon: '🛋️',
106
836
  items: [
107
837
  { itemId: 'sofa-3seat', x: 0, z: -1.5, rotation: 0 },
108
838
  { itemId: 'coffee-table', x: 0, z: 0, rotation: 0 },
@@ -114,7 +844,9 @@ const ROOM_PRESETS = [
114
844
  ],
115
845
  },
116
846
  {
117
- id: 'bedroom-master', name: 'Master Bedroom', icon: '🛏️',
847
+ id: 'bedroom-master',
848
+ name: 'Master Bedroom',
849
+ icon: '🛏️',
118
850
  items: [
119
851
  { itemId: 'bed-queen', x: 0, z: -0.5, rotation: 0 },
120
852
  { itemId: 'side-table', x: -1.1, z: -0.5, rotation: 0 },
@@ -126,7 +858,9 @@ const ROOM_PRESETS = [
126
858
  ],
127
859
  },
128
860
  {
129
- id: 'kitchen-l', name: 'L-Shaped Kitchen', icon: '🍳',
861
+ id: 'kitchen-l',
862
+ name: 'L-Shaped Kitchen',
863
+ icon: '🍳',
130
864
  items: [
131
865
  { itemId: 'counter', x: -1.5, z: -2, rotation: 0 },
132
866
  { itemId: 'counter', x: -0.9, z: -2, rotation: 0 },
@@ -141,7 +875,9 @@ const ROOM_PRESETS = [
141
875
  ],
142
876
  },
143
877
  {
144
- id: 'bathroom-main', name: 'Main Bathroom', icon: '🚿',
878
+ id: 'bathroom-main',
879
+ name: 'Main Bathroom',
880
+ icon: '🚿',
145
881
  items: [
146
882
  { itemId: 'bathtub', x: -0.6, z: -1, rotation: 0 },
147
883
  { itemId: 'vanity', x: 0.8, z: -1.5, rotation: 90 },
@@ -150,7 +886,9 @@ const ROOM_PRESETS = [
150
886
  ],
151
887
  },
152
888
  {
153
- id: 'office-home', name: 'Home Office', icon: '🖥️',
889
+ id: 'office-home',
890
+ name: 'Home Office',
891
+ icon: '🖥️',
154
892
  items: [
155
893
  { itemId: 'desk', x: 0, z: -1.2, rotation: 0 },
156
894
  { itemId: 'office-chair', x: 0, z: -0.3, rotation: 0 },
@@ -161,7 +899,9 @@ const ROOM_PRESETS = [
161
899
  ],
162
900
  },
163
901
  {
164
- id: 'dining-formal', name: 'Formal Dining Room', icon: '🍽️',
902
+ id: 'dining-formal',
903
+ name: 'Formal Dining Room',
904
+ icon: '🍽️',
165
905
  items: [
166
906
  { itemId: 'dining-table-6', x: 0, z: 0, rotation: 0 },
167
907
  { itemId: 'dining-chair', x: -0.7, z: -0.6, rotation: 0 },
@@ -213,26 +953,28 @@ function placeFurnitureInScene(scene, item, position, rotation = 0, gridSize = 0
213
953
  };
214
954
  }
215
955
  function removeFurnitureFromScene(scene, placedId) {
216
- const obj = scene.children.find(c => { var _a; return ((_a = c.userData) === null || _a === void 0 ? void 0 : _a.placedId) === placedId; });
956
+ const obj = scene.children.find((c) => { var _a; return ((_a = c.userData) === null || _a === void 0 ? void 0 : _a.placedId) === placedId; });
217
957
  if (obj) {
218
958
  scene.remove(obj);
219
959
  if (obj instanceof THREE.Mesh) {
220
960
  obj.geometry.dispose();
221
- if (Array.isArray(obj.material))
222
- obj.material.forEach(m => m.dispose());
223
- else
961
+ if (Array.isArray(obj.material)) {
962
+ obj.material.forEach((m) => m.dispose());
963
+ }
964
+ else {
224
965
  obj.material.dispose();
966
+ }
225
967
  }
226
968
  }
227
969
  }
228
970
  function rotatePlacedItem(scene, placedId, degrees) {
229
- const obj = scene.children.find(c => { var _a; return ((_a = c.userData) === null || _a === void 0 ? void 0 : _a.placedId) === placedId; });
971
+ const obj = scene.children.find((c) => { var _a; return ((_a = c.userData) === null || _a === void 0 ? void 0 : _a.placedId) === placedId; });
230
972
  if (obj) {
231
973
  obj.rotation.y += (degrees * Math.PI) / 180;
232
974
  }
233
975
  }
234
976
  function resizePlacedItem(scene, placedId, scale) {
235
- const obj = scene.children.find(c => { var _a; return ((_a = c.userData) === null || _a === void 0 ? void 0 : _a.placedId) === placedId; });
977
+ const obj = scene.children.find((c) => { var _a; return ((_a = c.userData) === null || _a === void 0 ? void 0 : _a.placedId) === placedId; });
236
978
  if (obj) {
237
979
  obj.scale.copy(scale);
238
980
  }
@@ -266,12 +1008,14 @@ function getFloorIntersection(raycaster, camera, mouse, floorY = 0) {
266
1008
  function checkFurnitureCollision(item, position, rotation, existing, catalog) {
267
1009
  const bounds = getRotatedBounds(item, position, rotation);
268
1010
  for (const placed of existing) {
269
- const existingItem = catalog.find(c => c.id === placed.itemId);
270
- if (!existingItem)
1011
+ const existingItem = catalog.find((c) => c.id === placed.itemId);
1012
+ if (!existingItem) {
271
1013
  continue;
1014
+ }
272
1015
  const existBounds = getRotatedBounds(existingItem, placed.position, placed.rotation);
273
- if (boundsOverlap(bounds, existBounds))
1016
+ if (boundsOverlap(bounds, existBounds)) {
274
1017
  return true;
1018
+ }
275
1019
  }
276
1020
  return false;
277
1021
  }
@@ -297,9 +1041,10 @@ function boundsOverlap(a, b) {
297
1041
  function applyRoomLayout(scene, layout, offset = new THREE.Vector3(0, 0, 0)) {
298
1042
  const placed = [];
299
1043
  for (const layoutItem of layout.items) {
300
- const item = FURNITURE_CATALOG.find(f => f.id === layoutItem.itemId);
301
- if (!item)
1044
+ const item = FURNITURE_CATALOG.find((f) => f.id === layoutItem.itemId);
1045
+ if (!item) {
302
1046
  continue;
1047
+ }
303
1048
  const pos = new THREE.Vector3(layoutItem.x + offset.x, offset.y, layoutItem.z + offset.z);
304
1049
  placed.push(placeFurnitureInScene(scene, item, pos, layoutItem.rotation, 0.5, false));
305
1050
  }
@@ -312,7 +1057,7 @@ function calculateBudget(placed) {
312
1057
  const breakdown = [];
313
1058
  let total = 0;
314
1059
  for (const p of placed) {
315
- const item = FURNITURE_CATALOG.find(f => f.id === p.itemId);
1060
+ const item = FURNITURE_CATALOG.find((f) => f.id === p.itemId);
316
1061
  if (item && item.price) {
317
1062
  breakdown.push({ name: item.name, price: item.price });
318
1063
  total += item.price;