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