@imagineio/configurator-sdk 0.1.0-beta.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 (246) hide show
  1. package/LICENSE.md +294 -0
  2. package/README.md +103 -0
  3. package/dist/00a41227ff.js +1 -0
  4. package/dist/00ab3dcbb5.js +1 -0
  5. package/dist/01a664fa9f.css +51 -0
  6. package/dist/04746bff9a.js +1 -0
  7. package/dist/04931f795e.js +1 -0
  8. package/dist/05973a4da2.js +3 -0
  9. package/dist/061b81ad81.js +1 -0
  10. package/dist/066fc9aa40.js +1 -0
  11. package/dist/09c4973968.js +1 -0
  12. package/dist/0a35b2c5f4.js +1 -0
  13. package/dist/0af28430ab.js +1 -0
  14. package/dist/0e2dedae0d.js +1 -0
  15. package/dist/0f7c8345a8.js +1 -0
  16. package/dist/12b8165d6d.js +1 -0
  17. package/dist/1458417bdb.js +1 -0
  18. package/dist/14c83bc57a.js +1 -0
  19. package/dist/15d6bec3b5.css +150 -0
  20. package/dist/16a399703e.js +1 -0
  21. package/dist/17876f4322.css +114 -0
  22. package/dist/1870fc037b.js +1 -0
  23. package/dist/1a2629800a.css +196 -0
  24. package/dist/1e243363f6.js +1 -0
  25. package/dist/1fac915f8b.js +1 -0
  26. package/dist/1fff100656.js +1 -0
  27. package/dist/205827c5c8.js +1 -0
  28. package/dist/20b0104576.js +1 -0
  29. package/dist/2239b22616.js +1 -0
  30. package/dist/22bd38ddcf.js +1 -0
  31. package/dist/239b619005.css +1849 -0
  32. package/dist/23dc0ccf32.js +1 -0
  33. package/dist/26155bf68c.js +1 -0
  34. package/dist/2774152dd2.js +1 -0
  35. package/dist/27fee7007f.js +1 -0
  36. package/dist/281cf952fa.js +1 -0
  37. package/dist/28a9d58274.js +1 -0
  38. package/dist/28d887bf8a.js +1 -0
  39. package/dist/28df2aa12f.js +1 -0
  40. package/dist/297e653adf.js +1 -0
  41. package/dist/2990ba64d6.js +1 -0
  42. package/dist/2b6aa27f6d.js +1 -0
  43. package/dist/2c7c1bcef1.js +1 -0
  44. package/dist/2cab5c5c23.js +1 -0
  45. package/dist/2cafe3274b.js +1 -0
  46. package/dist/2e366d7386.js +1 -0
  47. package/dist/2f8cc8b292.js +1 -0
  48. package/dist/30be653f00.css +110 -0
  49. package/dist/31ea036f5c.js +1 -0
  50. package/dist/32861ea2b0.js +1 -0
  51. package/dist/33fa2c8ca2.js +1 -0
  52. package/dist/35d8449ed8.js +1 -0
  53. package/dist/3656ffa1b8.js +1 -0
  54. package/dist/367a479d3a.js +1 -0
  55. package/dist/371ed78aa2.js +1 -0
  56. package/dist/37596ace72.js +1 -0
  57. package/dist/37addc7fb3.js +1 -0
  58. package/dist/388cadacbd.js +1 -0
  59. package/dist/39a62ef7b8.js +1 -0
  60. package/dist/3bbcee0334.js +1 -0
  61. package/dist/3c916f744f.js +1 -0
  62. package/dist/3f37665dd1.js +1 -0
  63. package/dist/3fb3ab6757.js +1 -0
  64. package/dist/40d6aeb28c.js +1 -0
  65. package/dist/41ed5985ad.js +1 -0
  66. package/dist/431a2d8618.js +1 -0
  67. package/dist/44a229099f.js +1 -0
  68. package/dist/4741e5d07d.css +263 -0
  69. package/dist/4910c07ca8.css +411 -0
  70. package/dist/4a99ddb3fd.js +1 -0
  71. package/dist/4aa671f9f6.js +1 -0
  72. package/dist/4b8958aa4c.js +1 -0
  73. package/dist/4ba4f544b9.js +1 -0
  74. package/dist/4c24338793.js +1 -0
  75. package/dist/4d7a0d1897.js +1 -0
  76. package/dist/4e1db1e3b0.js +1 -0
  77. package/dist/4e7d0a0d4a.js +1 -0
  78. package/dist/51b23203e5.css +1447 -0
  79. package/dist/52436e0169.js +1 -0
  80. package/dist/54413c1eae.js +1 -0
  81. package/dist/54f0fcf38b.js +1 -0
  82. package/dist/55ab45ada4.css +370 -0
  83. package/dist/561dc3f1ab.js +1 -0
  84. package/dist/58e6419ba8.js +1 -0
  85. package/dist/5c9fd9201c.js +1 -0
  86. package/dist/5d05e8982e.js +1 -0
  87. package/dist/5d5e8a9c58.js +3 -0
  88. package/dist/5e4f2349ff.js +1 -0
  89. package/dist/609e5e5d28.js +1 -0
  90. package/dist/60d697292c.js +1 -0
  91. package/dist/61e0c0c9b5.js +1 -0
  92. package/dist/631a9f7fac.js +1 -0
  93. package/dist/64e9020b49.js +1 -0
  94. package/dist/66c461dc2c.js +1 -0
  95. package/dist/672404d987.js +1 -0
  96. package/dist/67f6338a4a.js +1 -0
  97. package/dist/6855e6a3b1.js +1 -0
  98. package/dist/6b0a81e4f8.js +1 -0
  99. package/dist/6ba86aa3b8.js +1 -0
  100. package/dist/6bff84d27e.js +1 -0
  101. package/dist/6c0a2572dd.js +1 -0
  102. package/dist/6d238282c1.js +1 -0
  103. package/dist/6e2595aa36.js +1 -0
  104. package/dist/6f9ae59d6c.js +1 -0
  105. package/dist/70dd811d74.js +1 -0
  106. package/dist/710c1ab641.js +1 -0
  107. package/dist/7206ce49c6.js +1 -0
  108. package/dist/7281d77ed9.js +1 -0
  109. package/dist/73f7d65985.js +1 -0
  110. package/dist/776277593f.js +1 -0
  111. package/dist/79a397bb92.js +1 -0
  112. package/dist/7a748aae59.js +1 -0
  113. package/dist/7bfb0ecfbb.css +572 -0
  114. package/dist/7bfcd0a517.js +1 -0
  115. package/dist/7d9ddaeb47.js +1 -0
  116. package/dist/7f833bc5af.js +1 -0
  117. package/dist/811b403d43.js +1 -0
  118. package/dist/817d930a49.js +1 -0
  119. package/dist/81802759ca.js +1 -0
  120. package/dist/81eb433604.js +1 -0
  121. package/dist/82a8a4bc35.js +1 -0
  122. package/dist/85af90fade.js +1 -0
  123. package/dist/872c4302e0.js +1 -0
  124. package/dist/87bb469216.js +1 -0
  125. package/dist/87dcc12b65.js +1 -0
  126. package/dist/87f511c4a8.js +1 -0
  127. package/dist/88251d6671.js +1 -0
  128. package/dist/882bc739c8.js +1 -0
  129. package/dist/89ab18ebc5.js +1 -0
  130. package/dist/8a22e8944f.css +563 -0
  131. package/dist/8a3a57c008.js +1 -0
  132. package/dist/8ade32d067.js +1 -0
  133. package/dist/8bf6d26ad6.css +233 -0
  134. package/dist/8c27edda0f.js +1 -0
  135. package/dist/8db8655f21.js +24 -0
  136. package/dist/8f60e5059a.js +1 -0
  137. package/dist/91707f5ca0.css +78 -0
  138. package/dist/921bf270dd.js +20 -0
  139. package/dist/9326c23506.js +1 -0
  140. package/dist/94a0a79c65.js +1 -0
  141. package/dist/9526094bb7.js +1 -0
  142. package/dist/9544661159.js +1 -0
  143. package/dist/95a44ebec2.js +1 -0
  144. package/dist/970313b92b.js +1 -0
  145. package/dist/9794652102.js +1 -0
  146. package/dist/983cbed22c.js +1 -0
  147. package/dist/9840b9ce12.js +1 -0
  148. package/dist/98f3644031.js +1 -0
  149. package/dist/992778075d.css +353 -0
  150. package/dist/9c6c598569.js +1 -0
  151. package/dist/9f474b5d1a.js +1 -0
  152. package/dist/a0f71d0bf5.js +1 -0
  153. package/dist/a3c983d431.js +1 -0
  154. package/dist/a3f18e76fe.js +1 -0
  155. package/dist/a493e9aa8f.js +1 -0
  156. package/dist/a77b15c0d6.js +1 -0
  157. package/dist/a811c90bd5.js +1 -0
  158. package/dist/a822c5e4f2.js +1 -0
  159. package/dist/aaa0e82d7f.css +69 -0
  160. package/dist/ab6c80484f.js +1 -0
  161. package/dist/ae96f219e3.js +1 -0
  162. package/dist/b11b38869d.css +427 -0
  163. package/dist/b1349d5a21.js +4 -0
  164. package/dist/b14379d31b.css +151 -0
  165. package/dist/b3efb26fd7.js +1 -0
  166. package/dist/b59b0dde17.js +1 -0
  167. package/dist/b5c372377f.js +1 -0
  168. package/dist/b976df09ec.js +1 -0
  169. package/dist/baeaed46c9.js +1 -0
  170. package/dist/bb719febc6.js +1 -0
  171. package/dist/bcd44b4040.js +1 -0
  172. package/dist/bdc4e4c5b9.css +209 -0
  173. package/dist/bdec200d00.js +1 -0
  174. package/dist/be0cfe2236.js +1 -0
  175. package/dist/be337ddda5.js +1 -0
  176. package/dist/c12c112c6f.js +1 -0
  177. package/dist/c2a14a77ae.js +1 -0
  178. package/dist/c3b8f1973b.js +1 -0
  179. package/dist/c44d37da7a.js +1 -0
  180. package/dist/c4790179f1.js +1 -0
  181. package/dist/c5e990946e.js +1 -0
  182. package/dist/c71892453b.js +1 -0
  183. package/dist/c9a1656c62.js +1 -0
  184. package/dist/ca497b066c.js +1 -0
  185. package/dist/cdb4a0f7b3.js +3 -0
  186. package/dist/ce663020e4.js +60 -0
  187. package/dist/cec035efb1.js +1 -0
  188. package/dist/d0f9681634.js +1 -0
  189. package/dist/d118c2e7ba.js +1 -0
  190. package/dist/d20718159b.js +3 -0
  191. package/dist/d30f1f506e.js +1 -0
  192. package/dist/d3cd7f1bc1.js +1 -0
  193. package/dist/d4378d9afa.js +1 -0
  194. package/dist/d464da28a5.js +1 -0
  195. package/dist/d566d3874b.js +1 -0
  196. package/dist/d617bbb9f5.js +26 -0
  197. package/dist/d65f32e004.js +1 -0
  198. package/dist/d6851ea979.js +1 -0
  199. package/dist/d7c9500ba9.js +1 -0
  200. package/dist/d803155241.js +1 -0
  201. package/dist/d903df4e0d.js +1 -0
  202. package/dist/d94df858ea.js +1 -0
  203. package/dist/da7b5f450d.js +1 -0
  204. package/dist/daa11edd01.js +1 -0
  205. package/dist/db4afd43c9.js +1 -0
  206. package/dist/dbd5ba1d07.js +1 -0
  207. package/dist/dc2a1a0e13.js +1 -0
  208. package/dist/dc812f3e14.js +1 -0
  209. package/dist/dcbf419090.css +122 -0
  210. package/dist/dcdba78ddf.js +1 -0
  211. package/dist/de408c4516.js +1 -0
  212. package/dist/e1cd279733.js +1 -0
  213. package/dist/e379e0039b.js +1 -0
  214. package/dist/e4fe0551fd.js +1 -0
  215. package/dist/e6eed481cc.css +28 -0
  216. package/dist/e75f1e5992.js +1 -0
  217. package/dist/ea8577d22b.js +1 -0
  218. package/dist/ec4a34fc80.css +313 -0
  219. package/dist/ed6a54cdf6.js +1 -0
  220. package/dist/ee242c0099.js +1 -0
  221. package/dist/ee9b9fd7d1.js +1 -0
  222. package/dist/f0c3d8a28a.js +1 -0
  223. package/dist/f11a45a150.js +1 -0
  224. package/dist/f1b3b2622a.js +1 -0
  225. package/dist/f7b4a178e3.js +1 -0
  226. package/dist/f89d7cd931.js +1 -0
  227. package/dist/f8cb80a93c.js +1 -0
  228. package/dist/f8fec86f10.js +1 -0
  229. package/dist/fbd844f2d1.js +1 -0
  230. package/dist/fe235d7160.js +1 -0
  231. package/dist/fe58a84b85.js +1 -0
  232. package/dist/fe68b361ba.js +1 -0
  233. package/dist/ff5b3d17e2.js +1 -0
  234. package/dist/styles/globals.css +442 -0
  235. package/dist/styles/themes.css +532 -0
  236. package/dist/styles/variables.css +299 -0
  237. package/package.json +68 -0
  238. package/static/assets/draco/README.md +32 -0
  239. package/static/assets/draco/draco_decoder.js +34 -0
  240. package/static/assets/draco/draco_decoder.wasm +0 -0
  241. package/static/assets/draco/draco_encoder.js +35 -0
  242. package/static/assets/draco/draco_encoder.wasm +0 -0
  243. package/static/assets/draco/draco_encoder_wrapper.js +98 -0
  244. package/static/assets/draco/draco_wasm_wrapper.js +117 -0
  245. package/static/favicon.svg +28 -0
  246. package/static/version.txt +1 -0
@@ -0,0 +1,1849 @@
1
+ @layer sdk-base, vendor, sdk;
2
+ @layer sdk {
3
+ /* Floating sidebar container - positioned over the canvas */
4
+ .sidebar-container {
5
+ display: flex;
6
+ width: var(--sidebar-width);
7
+ flex-direction: column;
8
+ align-items: flex-start;
9
+ gap: 14px;
10
+ position: absolute;
11
+ left: 12px;
12
+ top: 12px;
13
+ bottom: 12px;
14
+ z-index: 15;
15
+ }
16
+
17
+ /* Chat kept, option panel hidden (`ui.hide('sidebar')` with `chat` still on). The container
18
+ normally spans top to bottom for the option panel; with only the chat card in it, anchor it
19
+ to the bottom at its own height so it does not reserve a column of empty space. */
20
+ .sidebar-container--chat-only {
21
+ top: auto;
22
+ justify-content: flex-end;
23
+ }
24
+
25
+ /* Features/Options card */
26
+ .sidebar--card {
27
+ display: flex;
28
+ width: var(--sidebar-width);
29
+ flex-direction: column;
30
+ align-items: flex-start;
31
+ flex: 1 0 0;
32
+ border-radius: 8px;
33
+ box-shadow: 0 0 40px 0 rgba(0, 0, 0, 0.12);
34
+ background: var(--bg-primary);
35
+ overflow: hidden;
36
+ overflow-x: hidden;
37
+ min-height: 0;
38
+ }
39
+
40
+ /* Chat card */
41
+ .sidebar-chat-card {
42
+ display: flex;
43
+ flex-direction: column;
44
+ align-items: flex-start;
45
+ flex-shrink: 0;
46
+ align-self: stretch;
47
+ border-radius: 8px;
48
+ background: var(--bg-primary, #FFF);
49
+ box-shadow: 0 0 40px 0 rgba(0, 0, 0, 0.12);
50
+ padding: 14px;
51
+ }
52
+
53
+ .sidebar__header {
54
+ display: flex;
55
+ align-items: center;
56
+ justify-content: space-between;
57
+ padding: 12px 14px;
58
+ width: 100%;
59
+ }
60
+
61
+ /* Logo + title in sidebar header */
62
+ .sidebar__logo {
63
+ display: flex;
64
+ align-items: center;
65
+ gap: 10px;
66
+ }
67
+
68
+ .sidebar__logo-icon {
69
+ width: 24px;
70
+ height: 22px;
71
+ flex-shrink: 0;
72
+ }
73
+
74
+ .sidebar__logo-divider {
75
+ width: 1px;
76
+ height: 22px;
77
+ background: var(--border-light, #E1E1E1);
78
+ }
79
+
80
+ .sidebar__logo-text {
81
+ font-size: 14px;
82
+ font-weight: 600;
83
+ color: var(--text-primary, #141414);
84
+ letter-spacing: -0.2px;
85
+ white-space: nowrap;
86
+ }
87
+
88
+ /* Undo/redo/reset actions in sidebar header */
89
+ .sidebar__header-actions {
90
+ display: flex;
91
+ align-items: center;
92
+ gap: 2px;
93
+ margin-left: auto;
94
+ }
95
+
96
+ .sidebar__action-btn {
97
+ display: flex;
98
+ align-items: center;
99
+ justify-content: center;
100
+ width: 30px;
101
+ height: 30px;
102
+ border: none;
103
+ background: transparent;
104
+ border-radius: 4px;
105
+ cursor: pointer;
106
+ color: var(--text-primary, #363636);
107
+ transition: background 0.15s ease;
108
+ }
109
+
110
+ .sidebar__action-btn:hover {
111
+ background: var(--bg-secondary, #f0f0f0);
112
+ }
113
+
114
+ .sidebar__action-btn svg {
115
+ width: 16px;
116
+ height: 16px;
117
+ }
118
+
119
+ .sidebar__title {
120
+ font-size: var(--font-size-lg);
121
+ font-weight: var(--font-weight-semibold);
122
+ color: var(--color-neutral-800);
123
+ }
124
+
125
+ .sidebar__collapse-btn {
126
+ display: flex;
127
+ align-items: center;
128
+ justify-content: center;
129
+ width: var(--sidebar-collapse-btn-size);
130
+ height: var(--sidebar-collapse-btn-size);
131
+ flex-shrink: 0;
132
+ aspect-ratio: 1/1;
133
+ border: none;
134
+ background: transparent;
135
+ color: var(--icon-color-default);
136
+ cursor: pointer;
137
+ transition: color var(--transition-fast);
138
+ }
139
+
140
+ .sidebar__collapse-btn:hover {
141
+ color: var(--text-primary);
142
+ }
143
+
144
+ .sidebar__collapse-btn svg {
145
+ width: var(--icon-size-lg);
146
+ height: var(--icon-size-lg);
147
+ }
148
+
149
+ .sidebar__content {
150
+ flex: 1;
151
+ overflow-y: auto;
152
+ padding: var(--sidebar-content-padding);
153
+ scrollbar-width: none;
154
+ -ms-overflow-style: none;
155
+ }
156
+
157
+ .sidebar__content::-webkit-scrollbar {
158
+ display: none;
159
+ }
160
+
161
+ .sidebar__section {
162
+ margin-bottom: var(--sidebar-section-gap);
163
+ padding: var(--spacing-sm);
164
+ margin-left: calc(-1 * var(--spacing-sm));
165
+ margin-right: calc(-1 * var(--spacing-sm));
166
+ border-radius: var(--radius-xl);
167
+ transition: background-color var(--transition-slow), box-shadow var(--transition-slow);
168
+ overflow-x: hidden;
169
+ }
170
+
171
+ .sidebar__section:last-child {
172
+ margin-bottom: 0;
173
+ }
174
+
175
+ /* Highlighted section when selected from canvas */
176
+ .sidebar__section--highlighted {
177
+ background-color: var(--color-selection-light);
178
+ box-shadow: 0 0 0 2px var(--color-selection-border);
179
+ animation: pulse-highlight 0.5s ease-in-out;
180
+ }
181
+
182
+ @keyframes pulse-highlight {
183
+ 0% {
184
+ box-shadow: 0 0 0 0 rgba(var(--color-selection-rgb), 0.6);
185
+ }
186
+ 50% {
187
+ box-shadow: 0 0 0 4px rgba(var(--color-selection-rgb), 0.3);
188
+ }
189
+ 100% {
190
+ box-shadow: 0 0 0 2px var(--color-selection-border);
191
+ }
192
+ }
193
+
194
+ .sidebar__section-title {
195
+ color: var(--color-neutral-900);
196
+ font-family: var(--font-family-heading);
197
+ font-size: var(--sidebar-section-title-size);
198
+ font-style: normal;
199
+ font-weight: var(--sidebar-section-title-weight);
200
+ line-height: 18px;
201
+ letter-spacing: var(--letter-spacing-wide);
202
+ text-transform: uppercase;
203
+ margin-bottom: var(--spacing-md);
204
+ }
205
+
206
+ .sidebar__hint {
207
+ font-size: var(--font-size-md);
208
+ color: var(--color-selection);
209
+ margin-bottom: var(--spacing-md);
210
+ padding: var(--spacing-sm) var(--spacing-md);
211
+ background: var(--color-selection-light);
212
+ border-radius: var(--radius-lg);
213
+ border-left: 3px solid var(--color-selection);
214
+ }
215
+
216
+ .sidebar__hint--replace {
217
+ color: var(--color-brand-primary);
218
+ background: rgba(var(--color-brand-primary-rgb), 0.08);
219
+ border-left-color: var(--color-brand-primary);
220
+ }
221
+
222
+ /* Thumbnail Grid */
223
+ .thumbnail-grid {
224
+ display: grid;
225
+ grid-template-columns: repeat(3, 1fr);
226
+ gap: var(--thumbnail-gap);
227
+ max-width: 100%;
228
+ }
229
+
230
+ .thumbnail-grid--2col {
231
+ grid-template-columns: repeat(2, 1fr);
232
+ }
233
+
234
+ .thumbnail-grid--3col {
235
+ grid-template-columns: repeat(3, 1fr);
236
+ }
237
+
238
+ .thumbnail-grid--4col {
239
+ grid-template-columns: repeat(4, 1fr);
240
+ }
241
+
242
+ .thumbnail-grid--5col {
243
+ grid-template-columns: repeat(5, 1fr);
244
+ }
245
+
246
+ /* ============================================
247
+ LAYOUT THUMBNAILS - layout previews
248
+ ============================================ */
249
+ .thumbnail-grid--layout {
250
+ grid-template-columns: repeat(3, 1fr);
251
+ gap: 6px;
252
+ }
253
+
254
+ .layout-thumbnail {
255
+ position: relative;
256
+ display: flex;
257
+ padding: 1px;
258
+ flex-direction: column;
259
+ justify-content: center;
260
+ align-items: flex-start;
261
+ gap: var(--spacing-sm);
262
+ border-radius: var(--thumbnail-border-radius);
263
+ border: var(--thumbnail-border-width) solid var(--thumbnail-border);
264
+ background: var(--thumbnail-bg);
265
+ overflow: visible;
266
+ cursor: pointer;
267
+ transition: border var(--transition-fast);
268
+ }
269
+
270
+ .layout-thumbnail:hover {
271
+ border-radius: var(--thumbnail-border-radius);
272
+ border: var(--thumbnail-border-width-selected) solid var(--thumbnail-border-hover);
273
+ background: var(--thumbnail-bg);
274
+ }
275
+
276
+ .layout-thumbnail--selected {
277
+ border-radius: var(--thumbnail-border-radius);
278
+ border: var(--thumbnail-border-width-selected) solid var(--thumbnail-border-selected);
279
+ background: var(--thumbnail-bg);
280
+ }
281
+
282
+ .layout-thumbnail__scene {
283
+ width: 100%;
284
+ aspect-ratio: 1/1;
285
+ position: relative;
286
+ display: flex;
287
+ align-items: flex-end;
288
+ justify-content: center;
289
+ overflow: hidden;
290
+ border-radius: var(--radius-sm);
291
+ background: var(--thumbnail-bg);
292
+ }
293
+
294
+ .layout-thumbnail__img {
295
+ width: 100%;
296
+ height: 100%;
297
+ object-fit: contain;
298
+ border-radius: var(--radius-sm);
299
+ }
300
+
301
+ /* Floor */
302
+ .layout-thumbnail__floor {
303
+ position: absolute;
304
+ bottom: 0;
305
+ left: 0;
306
+ right: 0;
307
+ height: 25%;
308
+ background: linear-gradient(to bottom, var(--preview-floor-light), var(--preview-floor-dark));
309
+ }
310
+
311
+ /* Cabinet representations */
312
+ .layout-thumbnail__cabinets {
313
+ position: relative;
314
+ z-index: 1;
315
+ width: 75%;
316
+ height: 60%;
317
+ }
318
+
319
+ /* L-Shape (l_shaped from JSON) */
320
+ .layout-thumbnail__cabinets--l_shape,
321
+ .layout-thumbnail__cabinets--l_shaped {
322
+ background: linear-gradient(180deg, var(--preview-countertop) 0%, var(--preview-wood-light) 8%, var(--preview-wood) 100%);
323
+ clip-path: polygon(0 0, 60% 0, 60% 50%, 100% 50%, 100% 100%, 0 100%);
324
+ border-radius: var(--radius-xs);
325
+ }
326
+
327
+ /* U-Shape (u_shaped from JSON) */
328
+ .layout-thumbnail__cabinets--u_shape,
329
+ .layout-thumbnail__cabinets--u_shaped {
330
+ background: linear-gradient(180deg, var(--preview-countertop) 0%, var(--preview-wood-light) 8%, var(--preview-wood) 100%);
331
+ clip-path: polygon(0 0, 100% 0, 100% 100%, 70% 100%, 70% 40%, 30% 40%, 30% 100%, 0 100%);
332
+ border-radius: var(--radius-xs);
333
+ }
334
+
335
+ /* Galley */
336
+ .layout-thumbnail__cabinets--galley {
337
+ background: linear-gradient(180deg, var(--preview-countertop) 0%, var(--preview-wood-light) 8%, var(--preview-wood) 100%);
338
+ height: 30%;
339
+ width: 85%;
340
+ border-radius: var(--radius-xs);
341
+ }
342
+
343
+ /* Single Wall */
344
+ .layout-thumbnail__cabinets--single_wall {
345
+ background: linear-gradient(180deg, var(--preview-countertop) 0%, var(--preview-wood-light) 8%, var(--preview-wood) 100%);
346
+ height: 30%;
347
+ width: 90%;
348
+ border-radius: var(--radius-xs);
349
+ }
350
+
351
+ /* Layout label - tooltip on hover */
352
+ .layout-thumbnail__label {
353
+ position: absolute;
354
+ bottom: 100%;
355
+ left: 50%;
356
+ transform: translateX(-50%);
357
+ background: var(--tooltip-bg);
358
+ color: var(--tooltip-text);
359
+ font-size: var(--tooltip-font-size);
360
+ padding: var(--tooltip-padding);
361
+ border-radius: var(--tooltip-border-radius);
362
+ white-space: nowrap;
363
+ opacity: 0;
364
+ visibility: hidden;
365
+ transition: opacity var(--transition-fast), visibility var(--transition-fast);
366
+ pointer-events: none;
367
+ margin-bottom: var(--spacing-xs);
368
+ z-index: var(--z-dropdown);
369
+ }
370
+
371
+ .layout-thumbnail__label::after {
372
+ content: '';
373
+ position: absolute;
374
+ top: 100%;
375
+ left: 50%;
376
+ transform: translateX(-50%);
377
+ border: 5px solid transparent;
378
+ border-top-color: var(--tooltip-bg);
379
+ border-bottom: none;
380
+ }
381
+
382
+ .layout-thumbnail:hover .layout-thumbnail__label {
383
+ opacity: 1;
384
+ visibility: visible;
385
+ }
386
+
387
+ /* ============================================
388
+ APPLIANCE THUMBNAILS - Light styled appliances
389
+ ============================================ */
390
+ .hosted-product-thumbnail {
391
+ position: relative;
392
+ display: flex;
393
+ padding: 1px;
394
+ flex-direction: column;
395
+ justify-content: center;
396
+ align-items: center;
397
+ gap: var(--spacing-sm);
398
+ border-radius: var(--thumbnail-border-radius);
399
+ border: var(--thumbnail-border-width) solid var(--thumbnail-border);
400
+ background: var(--thumbnail-bg);
401
+ aspect-ratio: 1/1;
402
+ overflow: visible;
403
+ cursor: pointer;
404
+ transition: border var(--transition-fast);
405
+ }
406
+
407
+ .hosted-product-thumbnail:hover {
408
+ border-radius: var(--thumbnail-border-radius);
409
+ border: var(--thumbnail-border-width-selected) solid var(--thumbnail-border-hover);
410
+ background: var(--thumbnail-bg);
411
+ }
412
+
413
+ .hosted-product-thumbnail--selected {
414
+ border-radius: var(--thumbnail-border-radius);
415
+ border: var(--thumbnail-border-width-selected) solid var(--color-selection);
416
+ background: var(--color-selection-light);
417
+ box-shadow: 0 0 0 3px var(--color-selection-medium);
418
+ }
419
+
420
+ .hosted-product-thumbnail--selected .hosted-product-thumbnail__icon {
421
+ color: var(--color-selection);
422
+ }
423
+
424
+ /* Replace mode - when a base cabinet is selected */
425
+ .hosted-product-thumbnail--replace-mode {
426
+ border-radius: var(--thumbnail-border-radius);
427
+ border: var(--thumbnail-border-width-selected) solid var(--color-brand-primary);
428
+ background: rgba(var(--color-brand-primary-rgb), 0.08);
429
+ }
430
+
431
+ .hosted-product-thumbnail--replace-mode:hover {
432
+ background: rgba(var(--color-brand-primary-rgb), 0.15);
433
+ box-shadow: 0 0 0 3px rgba(var(--color-brand-primary-rgb), 0.2);
434
+ }
435
+
436
+ .hosted-product-thumbnail--replace-mode .hosted-product-thumbnail__icon {
437
+ color: var(--color-brand-primary);
438
+ }
439
+
440
+ .hosted-product-thumbnail--has-img {
441
+ padding: 0;
442
+ }
443
+
444
+ .hosted-product-thumbnail__img {
445
+ width: 100%;
446
+ height: 100%;
447
+ object-fit: cover;
448
+ border-radius: var(--thumbnail-border-radius);
449
+ }
450
+
451
+ .hosted-product-thumbnail__icon {
452
+ color: var(--icon-color-default);
453
+ width: 50%;
454
+ height: 50%;
455
+ }
456
+
457
+ .hosted-product-thumbnail__icon svg {
458
+ width: 100%;
459
+ height: 100%;
460
+ }
461
+
462
+ /* Appliance label - tooltip on hover */
463
+ .hosted-product-thumbnail__label {
464
+ position: absolute;
465
+ bottom: 100%;
466
+ left: 50%;
467
+ transform: translateX(-50%);
468
+ background: var(--tooltip-bg);
469
+ color: var(--tooltip-text);
470
+ font-size: var(--tooltip-font-size);
471
+ padding: var(--tooltip-padding);
472
+ border-radius: var(--tooltip-border-radius);
473
+ white-space: nowrap;
474
+ opacity: 0;
475
+ visibility: hidden;
476
+ transition: opacity var(--transition-fast), visibility var(--transition-fast);
477
+ pointer-events: none;
478
+ margin-bottom: var(--spacing-xs);
479
+ z-index: var(--z-dropdown);
480
+ }
481
+
482
+ .hosted-product-thumbnail__label::after {
483
+ content: '';
484
+ position: absolute;
485
+ top: 100%;
486
+ left: 50%;
487
+ transform: translateX(-50%);
488
+ border: 5px solid transparent;
489
+ border-top-color: var(--tooltip-bg);
490
+ border-bottom: none;
491
+ }
492
+
493
+ .hosted-product-thumbnail:hover .hosted-product-thumbnail__label {
494
+ opacity: 1;
495
+ visibility: visible;
496
+ }
497
+
498
+ /* Placed appliance state - clickable to remove */
499
+ .hosted-product-thumbnail--placed {
500
+ border-radius: var(--thumbnail-border-radius);
501
+ border: var(--thumbnail-border-width) solid var(--badge-success-bg);
502
+ background: var(--thumbnail-bg);
503
+ cursor: pointer;
504
+ }
505
+
506
+ .hosted-product-thumbnail--placed:hover {
507
+ border: var(--thumbnail-border-width) solid var(--color-danger);
508
+ background: var(--color-danger-bg);
509
+ }
510
+
511
+ .hosted-product-thumbnail--placed:hover .hosted-product-thumbnail__badge {
512
+ background: var(--color-danger);
513
+ color: white;
514
+ }
515
+
516
+ .hosted-product-badge-remove {
517
+ display: none;
518
+ }
519
+
520
+ .hosted-product-thumbnail--placed:hover .hosted-product-badge-placed {
521
+ display: none;
522
+ }
523
+
524
+ .hosted-product-thumbnail--placed:hover .hosted-product-badge-remove {
525
+ display: inline;
526
+ }
527
+
528
+ .hosted-product-thumbnail--placed .hosted-product-thumbnail__icon {
529
+ color: var(--color-neutral-600);
530
+ }
531
+
532
+ /* Disabled appliance state - not compatible */
533
+ .hosted-product-thumbnail--disabled {
534
+ border-radius: var(--thumbnail-border-radius);
535
+ border: var(--thumbnail-border-width) solid var(--border-disabled);
536
+ background: var(--bg-disabled);
537
+ cursor: not-allowed;
538
+ opacity: 0.6;
539
+ }
540
+
541
+ .hosted-product-thumbnail--disabled:hover {
542
+ border: var(--thumbnail-border-width) solid var(--border-disabled);
543
+ background: var(--bg-disabled);
544
+ }
545
+
546
+ .hosted-product-thumbnail--disabled .hosted-product-thumbnail__icon {
547
+ color: var(--color-neutral-disabled);
548
+ }
549
+
550
+ /* Placed badge */
551
+ .hosted-product-thumbnail__badge {
552
+ position: absolute;
553
+ bottom: var(--spacing-xs);
554
+ left: 50%;
555
+ transform: translateX(-50%);
556
+ background: var(--badge-success-bg);
557
+ color: var(--badge-success-text);
558
+ font-size: var(--badge-font-size);
559
+ font-weight: var(--font-weight-semibold);
560
+ padding: var(--badge-padding);
561
+ border-radius: var(--badge-border-radius);
562
+ text-transform: uppercase;
563
+ letter-spacing: 0.3px;
564
+ }
565
+
566
+ .hosted-product-thumbnail__badge--replace {
567
+ background: var(--color-brand-primary);
568
+ color: var(--text-inverse);
569
+ }
570
+
571
+ .hosted-product-thumbnail__badge--disabled {
572
+ background: var(--border-disabled);
573
+ color: var(--color-neutral-disabled);
574
+ }
575
+
576
+ /* ============================================
577
+ PLACED APPLIANCES LIST
578
+ ============================================ */
579
+ .placed-appliances {
580
+ margin-top: var(--spacing-lg);
581
+ padding-top: var(--spacing-lg);
582
+ border-top: 1px solid var(--border-default);
583
+ }
584
+
585
+ .placed-appliances__title {
586
+ font-size: var(--font-size-sm);
587
+ font-weight: var(--font-weight-medium);
588
+ color: var(--color-neutral-600);
589
+ text-transform: uppercase;
590
+ letter-spacing: var(--letter-spacing-wide);
591
+ margin-bottom: var(--spacing-sm);
592
+ }
593
+
594
+ .placed-appliances__list {
595
+ list-style: none;
596
+ padding: 0;
597
+ margin: 0;
598
+ display: flex;
599
+ flex-direction: column;
600
+ gap: var(--spacing-lg);
601
+ }
602
+
603
+ .placed-appliances__item {
604
+ display: flex;
605
+ align-items: center;
606
+ justify-content: space-between;
607
+ padding: var(--spacing-sm) var(--spacing-md);
608
+ background: var(--thumbnail-bg);
609
+ border-radius: var(--radius-lg);
610
+ border: 1px solid var(--border-default);
611
+ }
612
+
613
+ .placed-appliances__name {
614
+ font-size: var(--font-size-md);
615
+ font-weight: var(--font-weight-medium);
616
+ color: var(--color-neutral-800);
617
+ }
618
+
619
+ .placed-appliances__remove {
620
+ display: flex;
621
+ align-items: center;
622
+ justify-content: center;
623
+ width: var(--btn-height-sm);
624
+ height: var(--btn-height-sm);
625
+ padding: 0;
626
+ border: none;
627
+ background: transparent;
628
+ color: var(--color-neutral-400);
629
+ cursor: pointer;
630
+ border-radius: var(--radius-md);
631
+ transition: all var(--transition-fast);
632
+ }
633
+
634
+ .placed-appliances__remove:hover {
635
+ background: var(--color-danger-bg);
636
+ color: var(--color-danger);
637
+ }
638
+
639
+ .placed-appliances__remove svg {
640
+ width: var(--icon-size-sm);
641
+ height: var(--icon-size-sm);
642
+ }
643
+
644
+ /* ============================================
645
+ FINISH THUMBNAILS - Square tile with texture/color
646
+ ============================================ */
647
+ .thumbnail-grid--finish {
648
+ grid-template-columns: repeat(4, 1fr);
649
+ gap: 6px;
650
+ }
651
+
652
+ .finish-thumbnail {
653
+ position: relative;
654
+ display: flex;
655
+ flex-direction: column;
656
+ align-items: center;
657
+ gap: 4px;
658
+ padding: 1px;
659
+ border-radius: var(--thumbnail-border-radius);
660
+ border: var(--thumbnail-border-width) solid var(--thumbnail-border);
661
+ background: var(--thumbnail-bg);
662
+ cursor: pointer;
663
+ transition: border var(--transition-fast), box-shadow var(--transition-fast);
664
+ overflow: visible;
665
+ /* As a grid item, `1fr` is really `minmax(auto, 1fr)`, so a cell's width can grow to
666
+ its CONTENT's max-content. A textured card (image content) then claimed more track
667
+ width than a colour-only card, so all-colour option sets rendered NARROWER (e.g.
668
+ 40px vs 60px). `min-width: 0` forces every track to pure 1fr — equal width for every
669
+ finish card regardless of whether its content is an image or a flat colour. */
670
+ min-width: 0;
671
+ }
672
+
673
+ .finish-thumbnail:hover {
674
+ border: 2px solid var(--thumbnail-border-hover);
675
+ }
676
+
677
+ .finish-thumbnail--selected {
678
+ border: 2px solid var(--thumbnail-border-selected);
679
+ }
680
+
681
+ .finish-thumbnail--disabled {
682
+ opacity: 0.45;
683
+ cursor: not-allowed;
684
+ pointer-events: auto;
685
+ }
686
+
687
+ .finish-thumbnail--disabled:hover {
688
+ border: var(--thumbnail-border-width) solid var(--thumbnail-border);
689
+ box-shadow: none;
690
+ }
691
+
692
+ .finish-thumbnail--disabled .finish-thumbnail__unavailable {
693
+ display: none;
694
+ }
695
+
696
+ .finish-thumbnail--disabled:hover .finish-thumbnail__unavailable {
697
+ display: block;
698
+ }
699
+
700
+ .finish-thumbnail__unavailable {
701
+ position: absolute;
702
+ bottom: 0;
703
+ left: 0;
704
+ right: 0;
705
+ background: rgba(var(--text-primary-rgb, 54, 54, 54), 0.85);
706
+ color: var(--bg-primary, #fff);
707
+ font-size: 10px;
708
+ padding: 2px 4px;
709
+ text-align: center;
710
+ border-radius: 0 0 var(--thumbnail-border-radius) var(--thumbnail-border-radius);
711
+ }
712
+
713
+ .finish-thumbnail__preview {
714
+ position: relative;
715
+ width: 100%;
716
+ aspect-ratio: 1/1;
717
+ overflow: hidden;
718
+ border-radius: var(--radius-sm);
719
+ }
720
+
721
+ .finish-thumbnail__img {
722
+ width: 100%;
723
+ height: 100%;
724
+ object-fit: cover;
725
+ display: block;
726
+ }
727
+
728
+ /* ── Thumbnail skeleton ("shadow" placeholder) ─────────────────────────────
729
+ Fills a thumbnail slot with an animated shimmer until the image loads, so an
730
+ option card always occupies its proper size and never collapses to unstyled
731
+ "dots" while thumbnails stream in. Shared by every theme (all use these cards).
732
+ The image fades in over it (inline opacity), then the skeleton unmounts. */
733
+ .thumb-skeleton {
734
+ position: absolute;
735
+ inset: 0;
736
+ border-radius: inherit;
737
+ background: linear-gradient(
738
+ 90deg,
739
+ rgba(0, 0, 0, 0.05) 25%,
740
+ rgba(0, 0, 0, 0.10) 37%,
741
+ rgba(0, 0, 0, 0.05) 63%
742
+ );
743
+ background-size: 400% 100%;
744
+ animation: thumb-skeleton-shimmer 1.4s ease-in-out infinite;
745
+ }
746
+ @keyframes thumb-skeleton-shimmer {
747
+ 0% { background-position: 100% 0; }
748
+ 100% { background-position: 0 0; }
749
+ }
750
+ @media (prefers-reduced-motion: reduce) {
751
+ .thumb-skeleton { animation: none; }
752
+ }
753
+ .finish-thumbnail__img,
754
+ .option-thumbnail__img,
755
+ .layout-thumbnail__img { transition: opacity 0.25s ease; }
756
+ /* Layout scene needs to anchor the absolute skeleton (finish preview + option card
757
+ are already position:relative). */
758
+ .layout-thumbnail__scene { position: relative; }
759
+
760
+ .finish-thumbnail__swatch {
761
+ width: 100%;
762
+ height: 100%;
763
+ border-radius: var(--radius-sm);
764
+ }
765
+
766
+ .finish-thumbnail__name {
767
+ position: absolute;
768
+ bottom: 100%;
769
+ left: 50%;
770
+ transform: translateX(-50%);
771
+ background: var(--tooltip-bg);
772
+ color: var(--tooltip-text);
773
+ font-size: var(--tooltip-font-size);
774
+ font-weight: 500;
775
+ padding: var(--tooltip-padding);
776
+ border-radius: var(--tooltip-border-radius);
777
+ white-space: nowrap;
778
+ opacity: 0;
779
+ visibility: hidden;
780
+ transition: opacity var(--transition-fast), visibility var(--transition-fast);
781
+ pointer-events: none;
782
+ margin-bottom: var(--spacing-xs);
783
+ z-index: var(--z-dropdown);
784
+ }
785
+
786
+ .finish-thumbnail__name::after {
787
+ content: '';
788
+ position: absolute;
789
+ top: 100%;
790
+ left: 50%;
791
+ transform: translateX(-50%);
792
+ border: 5px solid transparent;
793
+ border-top-color: var(--tooltip-bg);
794
+ border-bottom: none;
795
+ }
796
+
797
+ .finish-thumbnail:hover .finish-thumbnail__name {
798
+ opacity: 1;
799
+ visibility: visible;
800
+ }
801
+
802
+ /* When toggle ON: show inline on card instead of tooltip */
803
+ .finish-thumbnail--show-labels {
804
+ overflow: hidden;
805
+ }
806
+
807
+ .finish-thumbnail--show-labels .finish-thumbnail__name {
808
+ position: static;
809
+ transform: none;
810
+ background: none;
811
+ color: var(--color-neutral-700);
812
+ font-size: 9px;
813
+ padding: 0 2px 3px;
814
+ border-radius: 0;
815
+ white-space: nowrap;
816
+ opacity: 1;
817
+ visibility: visible;
818
+ pointer-events: auto;
819
+ margin-bottom: 0;
820
+ z-index: auto;
821
+ overflow: hidden;
822
+ text-overflow: ellipsis;
823
+ max-width: 100%;
824
+ text-align: center;
825
+ }
826
+
827
+ .finish-thumbnail--show-labels .finish-thumbnail__name::after {
828
+ display: none;
829
+ }
830
+
831
+ .finish-thumbnail--selected.finish-thumbnail--show-labels .finish-thumbnail__name {
832
+ color: var(--color-neutral-900);
833
+ font-weight: var(--font-weight-semibold);
834
+ }
835
+
836
+ /* ============================================
837
+ PRODUCT THUMBNAILS - For island/product selection
838
+ ============================================ */
839
+ /* ============================================
840
+ Toggle Row - Island toggle
841
+ ============================================ */
842
+ .sidebar__toggle-row {
843
+ display: flex;
844
+ align-items: center;
845
+ justify-content: space-between;
846
+ }
847
+
848
+ .sidebar__section-title--inline {
849
+ margin: 0;
850
+ }
851
+
852
+ .sidebar__toggle {
853
+ position: relative;
854
+ width: 40px;
855
+ height: 22px;
856
+ border-radius: 11px;
857
+ border: none;
858
+ background: var(--border-dark, #d1d5db);
859
+ cursor: pointer;
860
+ padding: 0;
861
+ transition: background 0.2s ease;
862
+ }
863
+
864
+ .sidebar__toggle--on {
865
+ background: var(--color-brand-primary, #ff5722);
866
+ }
867
+
868
+ .sidebar__toggle-thumb {
869
+ position: absolute;
870
+ top: 2px;
871
+ left: 2px;
872
+ width: 18px;
873
+ height: 18px;
874
+ border-radius: 50%;
875
+ background: var(--bg-primary, #fff);
876
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);
877
+ transition: transform 0.2s ease;
878
+ }
879
+
880
+ .sidebar__toggle--on .sidebar__toggle-thumb {
881
+ transform: translateX(18px);
882
+ }
883
+
884
+ /* ============================================
885
+ Island Controls - Tier & Width toggles
886
+ ============================================ */
887
+ .sidebar__island-controls {
888
+ padding: 8px 0;
889
+ display: flex;
890
+ flex-direction: column;
891
+ gap: 14px;
892
+ }
893
+
894
+ .sidebar__island-controls .option-thumbnail--has-img {
895
+ aspect-ratio: 1/1;
896
+ width: 72px;
897
+ height: 72px;
898
+ }
899
+
900
+ .sidebar__island-controls .thumbnail-grid--2col {
901
+ grid-template-columns: repeat(2, auto);
902
+ justify-content: start;
903
+ }
904
+
905
+ .sidebar__label {
906
+ font-size: 11px;
907
+ font-weight: 700;
908
+ text-transform: uppercase;
909
+ letter-spacing: 0.06em;
910
+ color: var(--color-neutral-600);
911
+ display: block;
912
+ margin-bottom: 8px;
913
+ }
914
+
915
+ /* ---- Width slider ---- */
916
+ .sidebar__label-row {
917
+ display: flex;
918
+ justify-content: space-between;
919
+ align-items: baseline;
920
+ margin-bottom: 8px;
921
+ }
922
+
923
+ .sidebar__label-row .sidebar__label {
924
+ margin-bottom: 0;
925
+ }
926
+
927
+ .sidebar__label-value {
928
+ font-size: 13px;
929
+ font-weight: 700;
930
+ color: var(--color-brand-primary, #ff5722);
931
+ }
932
+
933
+ .sidebar__slider-wrap {
934
+ display: flex;
935
+ flex-direction: column;
936
+ gap: 4px;
937
+ }
938
+
939
+ .sidebar__island-slider {
940
+ -webkit-appearance: none;
941
+ appearance: none;
942
+ width: 100%;
943
+ height: 4px;
944
+ border-radius: 4px;
945
+ background: var(--border-default, #e5e7eb);
946
+ outline: none;
947
+ cursor: pointer;
948
+ accent-color: var(--color-brand-primary, #ff5722);
949
+ }
950
+
951
+ .sidebar__island-slider::-webkit-slider-thumb {
952
+ -webkit-appearance: none;
953
+ appearance: none;
954
+ width: 18px;
955
+ height: 18px;
956
+ border-radius: 50%;
957
+ background: var(--color-brand-primary, #ff5722);
958
+ cursor: pointer;
959
+ border: 2px solid var(--bg-primary, #fff);
960
+ box-shadow: 0 1px 4px rgba(0,0,0,0.2);
961
+ transition: transform 0.15s;
962
+ }
963
+
964
+ .sidebar__island-slider::-webkit-slider-thumb:hover {
965
+ transform: scale(1.15);
966
+ }
967
+
968
+ .sidebar__island-slider::-moz-range-thumb {
969
+ width: 18px;
970
+ height: 18px;
971
+ border-radius: 50%;
972
+ background: var(--color-brand-primary, #ff5722);
973
+ cursor: pointer;
974
+ border: 2px solid var(--bg-primary, #fff);
975
+ box-shadow: 0 1px 4px rgba(0,0,0,0.2);
976
+ }
977
+
978
+ .sidebar__slider-ticks {
979
+ display: flex;
980
+ justify-content: space-between;
981
+ font-size: 11px;
982
+ color: var(--color-neutral-500);
983
+ font-weight: 500;
984
+ }
985
+
986
+ /* ============================================
987
+ Product Thumbnail (legacy)
988
+ ============================================ */
989
+ .product-thumbnail {
990
+ position: relative;
991
+ display: flex;
992
+ padding: 1px;
993
+ flex-direction: column;
994
+ justify-content: center;
995
+ align-items: center;
996
+ gap: var(--spacing-sm);
997
+ border-radius: var(--thumbnail-border-radius);
998
+ border: var(--thumbnail-border-width) solid var(--thumbnail-border);
999
+ background: var(--thumbnail-bg);
1000
+ aspect-ratio: 1/1;
1001
+ overflow: visible;
1002
+ cursor: pointer;
1003
+ transition: border var(--transition-fast);
1004
+ }
1005
+
1006
+ .product-thumbnail:hover {
1007
+ border-radius: var(--thumbnail-border-radius);
1008
+ border: var(--thumbnail-border-width-selected) solid var(--thumbnail-border-hover);
1009
+ background: var(--thumbnail-bg);
1010
+ }
1011
+
1012
+ .product-thumbnail--selected {
1013
+ border-radius: var(--thumbnail-border-radius);
1014
+ border: var(--thumbnail-border-width-selected) solid var(--thumbnail-border-selected);
1015
+ background: var(--thumbnail-bg);
1016
+ }
1017
+
1018
+ .product-thumbnail__icon {
1019
+ color: var(--icon-color-default);
1020
+ width: 40%;
1021
+ height: 40%;
1022
+ }
1023
+
1024
+ .product-thumbnail__icon svg {
1025
+ width: 100%;
1026
+ height: 100%;
1027
+ }
1028
+
1029
+ /* Product label - tooltip on hover */
1030
+ .product-thumbnail__label {
1031
+ position: absolute;
1032
+ bottom: 100%;
1033
+ left: 50%;
1034
+ transform: translateX(-50%);
1035
+ background: var(--tooltip-bg);
1036
+ color: var(--tooltip-text);
1037
+ font-size: var(--tooltip-font-size);
1038
+ padding: var(--tooltip-padding);
1039
+ border-radius: var(--tooltip-border-radius);
1040
+ white-space: nowrap;
1041
+ opacity: 0;
1042
+ visibility: hidden;
1043
+ transition: opacity var(--transition-fast), visibility var(--transition-fast);
1044
+ pointer-events: none;
1045
+ margin-bottom: var(--spacing-xs);
1046
+ z-index: var(--z-dropdown);
1047
+ }
1048
+
1049
+ .product-thumbnail__label::after {
1050
+ content: '';
1051
+ position: absolute;
1052
+ top: 100%;
1053
+ left: 50%;
1054
+ transform: translateX(-50%);
1055
+ border: 5px solid transparent;
1056
+ border-top-color: var(--tooltip-bg);
1057
+ border-bottom: none;
1058
+ }
1059
+
1060
+ .product-thumbnail:hover .product-thumbnail__label {
1061
+ opacity: 1;
1062
+ visibility: visible;
1063
+ }
1064
+
1065
+ /* ============================================
1066
+ BACK BUTTON - For cabinet selected view
1067
+ ============================================ */
1068
+ .sidebar__back-btn {
1069
+ display: flex;
1070
+ align-items: center;
1071
+ gap: var(--spacing-sm);
1072
+ border: none;
1073
+ background: transparent;
1074
+ color: var(--color-neutral-800);
1075
+ font-size: var(--font-size-xl);
1076
+ font-weight: var(--font-weight-medium);
1077
+ cursor: pointer;
1078
+ padding: 0;
1079
+ transition: color var(--transition-fast);
1080
+ }
1081
+
1082
+ .sidebar__content--mobile .sidebar__back-btn {
1083
+ margin-bottom: 16px;
1084
+ }
1085
+
1086
+ .sidebar__back-btn:hover {
1087
+ color: var(--color-neutral-600);
1088
+ }
1089
+
1090
+ .sidebar__back-btn svg {
1091
+ width: var(--icon-size-md);
1092
+ height: var(--icon-size-md);
1093
+ }
1094
+
1095
+ /* ============================================
1096
+ WIDTH SLIDER - Cabinet width control
1097
+ ============================================ */
1098
+ .width-slider {
1099
+ display: flex;
1100
+ align-items: center;
1101
+ gap: var(--spacing-md);
1102
+ max-width: 100%;
1103
+ overflow: hidden;
1104
+ user-select: none;
1105
+ -webkit-user-select: none;
1106
+ }
1107
+
1108
+ .width-slider__input {
1109
+ -webkit-appearance: none;
1110
+ appearance: none;
1111
+ margin-left: 6px;
1112
+ width: calc(100% - 12px);
1113
+ height: var(--slider-track-height);
1114
+ background: var(--slider-track-bg);
1115
+ border-radius: var(--radius-xs);
1116
+ max-width: 100%;
1117
+ outline: none;
1118
+ cursor: pointer;
1119
+ transition: background 0.2s ease;
1120
+ }
1121
+
1122
+ .width-slider__input::-webkit-slider-thumb {
1123
+ -webkit-appearance: none;
1124
+ appearance: none;
1125
+ width: var(--slider-thumb-size);
1126
+ height: var(--slider-thumb-size);
1127
+ background: var(--color-primary);
1128
+ border-radius: var(--radius-circle);
1129
+ cursor: pointer;
1130
+ transition: all 0.15s ease;
1131
+ }
1132
+
1133
+
1134
+ .width-slider__input::-moz-range-thumb {
1135
+ width: var(--slider-thumb-size);
1136
+ height: var(--slider-thumb-size);
1137
+ background: var(--color-primary);
1138
+ border-radius: var(--radius-circle);
1139
+ border: none;
1140
+ cursor: pointer;
1141
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.2);
1142
+ transition: transform 0.15s ease, box-shadow 0.15s ease;
1143
+ }
1144
+
1145
+ .width-slider__input::-moz-range-thumb:hover {
1146
+ transform: scale(1.2);
1147
+ box-shadow: 0 2px 8px rgba(var(--color-brand-primary-rgb), 0.4);
1148
+ }
1149
+
1150
+ .width-slider__input::-moz-range-track {
1151
+ height: var(--slider-track-height);
1152
+ background: var(--slider-track-bg);
1153
+ border-radius: var(--radius-xs);
1154
+ border: none;
1155
+ }
1156
+
1157
+ .width-slider__track-wrapper {
1158
+ flex: 1;
1159
+ min-width: 0;
1160
+ }
1161
+
1162
+ .width-slider__ticks {
1163
+ display: flex;
1164
+ justify-content: space-between;
1165
+ padding: 4px 2px 0;
1166
+ }
1167
+
1168
+ .width-slider__tick {
1169
+ text-align: center;
1170
+ min-width: 24px;
1171
+ font-size: var(--font-size-md);
1172
+ color: var(--color-neutral-400);
1173
+ font-weight: 500;
1174
+ cursor: pointer;
1175
+ user-select: none;
1176
+ transition: color 0.25s ease, font-weight 0.25s ease;
1177
+ }
1178
+
1179
+ .width-slider__tick:hover {
1180
+ color: var(--color-neutral-600);
1181
+ }
1182
+
1183
+ .width-slider__tick--active {
1184
+ color: var(--color-primary);
1185
+ font-weight: var(--font-weight-semibold);
1186
+ }
1187
+
1188
+ .width-slider__value {
1189
+ font-size: var(--font-size-lg);
1190
+ font-weight: var(--font-weight-semibold);
1191
+ color: var(--color-neutral-900);
1192
+ white-space: nowrap;
1193
+ flex-shrink: 0;
1194
+ min-width: 40px;
1195
+ text-align: right;
1196
+ transition: color 0.15s ease;
1197
+ }
1198
+
1199
+ /* ============================================
1200
+ DOOR STYLE THUMBNAILS - Door panel options
1201
+ ============================================ */
1202
+ .door-style-thumbnail {
1203
+ position: relative;
1204
+ display: flex;
1205
+ padding: var(--spacing-sm);
1206
+ flex-direction: column;
1207
+ justify-content: center;
1208
+ align-items: center;
1209
+ border-radius: var(--thumbnail-border-radius);
1210
+ border: var(--thumbnail-border-width) solid var(--thumbnail-border);
1211
+ background: var(--thumbnail-bg);
1212
+ aspect-ratio: 1/1;
1213
+ cursor: pointer;
1214
+ transition: border var(--transition-fast);
1215
+ }
1216
+
1217
+ .door-style-thumbnail:hover {
1218
+ border: var(--thumbnail-border-width-selected) solid var(--thumbnail-border-hover);
1219
+ }
1220
+
1221
+ .door-style-thumbnail--selected {
1222
+ border: var(--thumbnail-border-width-selected) solid var(--thumbnail-border-selected);
1223
+ }
1224
+
1225
+ .door-style-thumbnail__preview {
1226
+ width: 100%;
1227
+ height: 100%;
1228
+ display: flex;
1229
+ justify-content: center;
1230
+ align-items: center;
1231
+ }
1232
+
1233
+ .door-style-thumbnail__door {
1234
+ width: 70%;
1235
+ height: 85%;
1236
+ background: var(--preview-wood-light);
1237
+ border-radius: var(--radius-xs);
1238
+ }
1239
+
1240
+ /* Shaker style - recessed panel */
1241
+ .door-style-thumbnail__door--shaker {
1242
+ background: linear-gradient(135deg, var(--preview-wood-light) 0%, var(--preview-wood) 100%);
1243
+ box-shadow: inset 3px 3px 0 rgba(0,0,0,0.1), inset -3px -3px 0 rgba(255,255,255,0.1);
1244
+ border: 2px solid var(--preview-wood-dark);
1245
+ }
1246
+
1247
+ /* Slab style - flat */
1248
+ .door-style-thumbnail__door--slab {
1249
+ background: linear-gradient(180deg, var(--preview-slab-light) 0%, var(--preview-slab-dark) 100%);
1250
+ }
1251
+
1252
+ /* Raised panel */
1253
+ .door-style-thumbnail__door--raised_panel {
1254
+ background: linear-gradient(135deg, var(--preview-wood-light) 0%, var(--preview-wood) 100%);
1255
+ box-shadow: 2px 2px 4px rgba(0,0,0,0.2);
1256
+ }
1257
+
1258
+ /* Glass front */
1259
+ .door-style-thumbnail__door--glass {
1260
+ background: linear-gradient(180deg, rgba(200,220,240,0.8) 0%, rgba(180,200,220,0.6) 100%);
1261
+ border: 2px solid var(--preview-glass-border);
1262
+ }
1263
+
1264
+ /* Louvered */
1265
+ .door-style-thumbnail__door--louvered {
1266
+ background: repeating-linear-gradient(
1267
+ 0deg,
1268
+ var(--preview-wood-light) 0px,
1269
+ var(--preview-wood-light) 4px,
1270
+ var(--preview-wood-dark) 4px,
1271
+ var(--preview-wood-dark) 6px
1272
+ );
1273
+ }
1274
+
1275
+ /* ============================================
1276
+ OPTION THUMBNAILS - Generic option buttons
1277
+ ============================================ */
1278
+ .option-thumbnail {
1279
+ position: relative;
1280
+ display: flex;
1281
+ padding: 8px 4px;
1282
+ flex-direction: column;
1283
+ justify-content: center;
1284
+ align-items: center;
1285
+ border-radius: 4px;
1286
+ /* Use a 2px transparent border by default so hover/selected states
1287
+ * (which add a 2px solid border) don't change the element's outer box
1288
+ * and reflow neighboring cards. Only the border COLOR animates. */
1289
+ border: 2px solid var(--border-light, #E1E1E1);
1290
+ background: var(--bg-muted, #F7F7F7);
1291
+ min-height: 48px;
1292
+ cursor: pointer;
1293
+ transition: border-color 0.15s, background 0.15s;
1294
+ overflow: hidden;
1295
+ min-width: 0;
1296
+ box-sizing: border-box;
1297
+ }
1298
+
1299
+ .option-thumbnail:hover {
1300
+ border-color: var(--text-primary, #363636);
1301
+ background: var(--bg-primary, #fff);
1302
+ }
1303
+
1304
+ .option-thumbnail--selected {
1305
+ border-color: var(--text-primary, #363636);
1306
+ background: var(--bg-primary, #fff);
1307
+ }
1308
+
1309
+ .option-thumbnail--disabled {
1310
+ opacity: 0.45;
1311
+ cursor: not-allowed;
1312
+ pointer-events: auto;
1313
+ }
1314
+
1315
+ /* Layout tiles disabled by the engine (optionAvailability) — same treatment as an
1316
+ option thumbnail, since the tile is the same affordance in a different grid. */
1317
+ .layout-thumbnail--disabled {
1318
+ opacity: 0.45;
1319
+ cursor: not-allowed;
1320
+ }
1321
+
1322
+ .option-thumbnail--disabled:hover {
1323
+ border-color: var(--border-light, #E1E1E1);
1324
+ background: var(--bg-muted, #F7F7F7);
1325
+ }
1326
+
1327
+ .option-thumbnail--disabled .option-thumbnail__coming-soon {
1328
+ display: none;
1329
+ }
1330
+
1331
+ .option-thumbnail--disabled:hover .option-thumbnail__coming-soon {
1332
+ display: block;
1333
+ }
1334
+
1335
+ .option-thumbnail__coming-soon {
1336
+ position: absolute;
1337
+ bottom: 0;
1338
+ left: 0;
1339
+ right: 0;
1340
+ background: rgba(var(--text-primary-rgb, 54, 54, 54), 0.85);
1341
+ color: var(--bg-primary, #fff);
1342
+ font-size: 9px;
1343
+ font-weight: 600;
1344
+ text-align: center;
1345
+ padding: 2px 0;
1346
+ letter-spacing: 0.3px;
1347
+ }
1348
+
1349
+ .option-thumbnail--has-img {
1350
+ padding: 0;
1351
+ min-height: 0;
1352
+ aspect-ratio: 1/1;
1353
+ overflow: hidden;
1354
+ }
1355
+
1356
+ .option-thumbnail__img {
1357
+ width: 100%;
1358
+ height: 100%;
1359
+ object-fit: cover;
1360
+ border-radius: 3px;
1361
+ }
1362
+
1363
+ .option-thumbnail__img-label {
1364
+ position: absolute;
1365
+ bottom: 0;
1366
+ left: 0;
1367
+ right: 0;
1368
+ background: linear-gradient(transparent, rgba(0, 0, 0, 0.75));
1369
+ color: var(--bg-primary, #fff);
1370
+ font-size: 10px;
1371
+ font-weight: 600;
1372
+ padding: 8px 4px 3px;
1373
+ text-align: center;
1374
+ line-height: 1.2;
1375
+ opacity: 0;
1376
+ transition: opacity 0.15s ease;
1377
+ }
1378
+
1379
+ .option-thumbnail:hover .option-thumbnail__img-label {
1380
+ opacity: 1;
1381
+ }
1382
+
1383
+ .option-thumbnail--show-labels .option-thumbnail__img-label {
1384
+ opacity: 1;
1385
+ }
1386
+
1387
+ .option-thumbnail__content {
1388
+ display: flex;
1389
+ flex-direction: column;
1390
+ align-items: center;
1391
+ justify-content: center;
1392
+ text-align: center;
1393
+ }
1394
+
1395
+ .option-thumbnail__name {
1396
+ font-size: var(--font-size-sm);
1397
+ font-weight: 500;
1398
+ color: var(--text-primary, #363636);
1399
+ line-height: 1.2;
1400
+ word-break: break-word;
1401
+ overflow-wrap: break-word;
1402
+ /* Name text renders inside the no-image branch — always show it so tiles
1403
+ without a backend thumbnail still identify themselves. Previously hidden
1404
+ by default with hover-reveal, which left every no-thumbnail tile blank
1405
+ at rest. */
1406
+ display: block;
1407
+ }
1408
+
1409
+ .option-thumbnail--show-labels .option-thumbnail__name {
1410
+ display: block;
1411
+ }
1412
+
1413
+ /* Door type specific grid - smaller items */
1414
+ .thumbnail-grid--door-type {
1415
+ grid-template-columns: repeat(3, 1fr);
1416
+ gap: 6px;
1417
+ }
1418
+
1419
+ .thumbnail-grid--door-type .option-thumbnail {
1420
+ padding: 6px 4px;
1421
+ min-height: 40px;
1422
+ }
1423
+
1424
+ .thumbnail-grid--door-type .option-thumbnail__name {
1425
+ font-size: 9px;
1426
+ }
1427
+
1428
+ .thumbnail-grid--handle {
1429
+ grid-template-columns: repeat(4, 1fr);
1430
+ gap: 6px;
1431
+ }
1432
+
1433
+ .thumbnail-grid--style {
1434
+ grid-template-columns: repeat(4, 1fr);
1435
+ gap: 6px;
1436
+ }
1437
+
1438
+ /* ============================================
1439
+ FRAME SIZE BUTTONS - Dimension selection
1440
+ ============================================ */
1441
+ .frame-size-grid {
1442
+ display: flex;
1443
+ flex-wrap: wrap;
1444
+ gap: 6px;
1445
+ max-width: 100%;
1446
+ }
1447
+
1448
+ .frame-size-btn {
1449
+ flex: 0 0 auto;
1450
+ padding: 6px 8px;
1451
+ font-size: 10px;
1452
+ font-weight: 500;
1453
+ color: var(--text-primary, #363636);
1454
+ background: var(--bg-muted, #F7F7F7);
1455
+ border: 2px solid var(--border-light, #E1E1E1);
1456
+ border-radius: 4px;
1457
+ cursor: pointer;
1458
+ transition: border 0.15s, background 0.15s;
1459
+ white-space: nowrap;
1460
+ }
1461
+
1462
+ .frame-size-btn:hover {
1463
+ border: 2px solid var(--text-primary, #363636);
1464
+ background: var(--bg-primary, #fff);
1465
+ }
1466
+
1467
+ .frame-size-btn--selected {
1468
+ border: 2px solid var(--text-primary, #363636);
1469
+ background: var(--bg-primary, #fff);
1470
+ }
1471
+
1472
+ /* ============================================
1473
+ COLOR SWATCHES - Color selection
1474
+ ============================================ */
1475
+ .thumbnail-grid--color {
1476
+ grid-template-columns: repeat(4, 1fr);
1477
+ gap: 8px;
1478
+ }
1479
+
1480
+ .color-swatch {
1481
+ display: flex;
1482
+ flex-direction: column;
1483
+ align-items: center;
1484
+ gap: 4px;
1485
+ cursor: pointer;
1486
+ min-width: 0;
1487
+ overflow: hidden;
1488
+ }
1489
+
1490
+ .color-swatch__color {
1491
+ width: 100%;
1492
+ aspect-ratio: 1/1;
1493
+ border-radius: 4px;
1494
+ border: 2px solid transparent;
1495
+ transition: border 0.15s, transform 0.15s;
1496
+ box-shadow: 0 1px 3px rgba(0,0,0,0.1);
1497
+ }
1498
+
1499
+ .color-swatch:hover .color-swatch__color {
1500
+ border-color: var(--text-primary, #363636);
1501
+ transform: scale(1.05);
1502
+ }
1503
+
1504
+ .color-swatch--selected .color-swatch__color {
1505
+ border-color: var(--text-primary, #363636);
1506
+ box-shadow: 0 0 0 2px var(--bg-primary, #fff), 0 0 0 4px var(--text-primary, #363636);
1507
+ }
1508
+
1509
+ .color-swatch__name {
1510
+ font-size: 9px;
1511
+ font-weight: 500;
1512
+ color: var(--text-secondary, #666);
1513
+ text-align: center;
1514
+ max-width: 100%;
1515
+ overflow: hidden;
1516
+ text-overflow: ellipsis;
1517
+ white-space: nowrap;
1518
+ }
1519
+
1520
+ .color-swatch--selected .color-swatch__name {
1521
+ color: var(--text-primary, #363636);
1522
+ font-weight: 600;
1523
+ }
1524
+
1525
+ /* Sidebar overlay backdrop */
1526
+ .sidebar-overlay {
1527
+ display: none;
1528
+ }
1529
+
1530
+ /* ============================================
1531
+ SMALL LAPTOP (1024-1365px)
1532
+ ============================================ */
1533
+ @media (max-width: 1365px) and (min-width: 1024px) {
1534
+ .thumbnail-grid--finish {
1535
+ grid-template-columns: repeat(3, 1fr);
1536
+ }
1537
+
1538
+ .thumbnail-grid--handle {
1539
+ grid-template-columns: repeat(3, 1fr);
1540
+ }
1541
+
1542
+ .thumbnail-grid--style {
1543
+ grid-template-columns: repeat(3, 1fr);
1544
+ }
1545
+
1546
+ .thumbnail-grid--layout {
1547
+ grid-template-columns: repeat(3, 1fr);
1548
+ }
1549
+ }
1550
+
1551
+ /* ============================================
1552
+ TABLET (768-1023px)
1553
+ ============================================ */
1554
+ @media (max-width: 1023px) and (min-width: 768px) {
1555
+ .sidebar-overlay {
1556
+ display: block;
1557
+ position: fixed;
1558
+ inset: 0;
1559
+ background: rgba(0, 0, 0, 0.25);
1560
+ z-index: 14;
1561
+ }
1562
+
1563
+ .main-layout__scene--sidebar-open {
1564
+ padding-left: calc(var(--sidebar-width-tablet) + 24px) !important;
1565
+ }
1566
+
1567
+ .sidebar-container {
1568
+ width: var(--sidebar-width-tablet);
1569
+ }
1570
+
1571
+ .sidebar--card {
1572
+ width: var(--sidebar-width-tablet);
1573
+ }
1574
+
1575
+ .sidebar__logo-text {
1576
+ font-size: 12px;
1577
+ }
1578
+
1579
+ .sidebar__content {
1580
+ padding: 10px;
1581
+ }
1582
+
1583
+ .thumbnail-grid {
1584
+ gap: 6px;
1585
+ }
1586
+
1587
+ .thumbnail-grid--finish {
1588
+ grid-template-columns: repeat(3, 1fr);
1589
+ }
1590
+
1591
+ .thumbnail-grid--door-type {
1592
+ grid-template-columns: repeat(3, 1fr);
1593
+ }
1594
+
1595
+ .thumbnail-grid--handle {
1596
+ grid-template-columns: repeat(3, 1fr);
1597
+ }
1598
+
1599
+ .thumbnail-grid--style {
1600
+ grid-template-columns: repeat(3, 1fr);
1601
+ }
1602
+
1603
+ .thumbnail-grid--color {
1604
+ grid-template-columns: repeat(3, 1fr);
1605
+ }
1606
+
1607
+ .thumbnail-grid--layout {
1608
+ grid-template-columns: repeat(3, 1fr);
1609
+ }
1610
+
1611
+ .sidebar-chat-card {
1612
+ padding: 10px;
1613
+ }
1614
+ }
1615
+
1616
+ /* ============================================
1617
+ MOBILE — Sidebar renders as bottom cards via JSX.
1618
+ These styles apply to the mobile card content.
1619
+ ============================================ */
1620
+ /* Sticky header for mobile cabinet detail view — outside the scroll container */
1621
+ .sidebar__mobile-header {
1622
+ flex-shrink: 0;
1623
+ padding: 12px 14px;
1624
+ background: var(--bg-primary, #fff);
1625
+ }
1626
+
1627
+ .sidebar__mobile-header .sidebar__back-btn {
1628
+ font-size: var(--font-size-lg);
1629
+ }
1630
+
1631
+ .sidebar__content--mobile {
1632
+ padding: 14px;
1633
+ flex: 1;
1634
+ min-height: 0;
1635
+ overflow-y: auto;
1636
+ scrollbar-width: none;
1637
+ -ms-overflow-style: none;
1638
+ }
1639
+
1640
+ .sidebar__content--mobile::-webkit-scrollbar {
1641
+ display: none;
1642
+ }
1643
+
1644
+ .sidebar__content--mobile .thumbnail-grid {
1645
+ grid-template-columns: repeat(auto-fill, minmax(var(--thumbnail-min-width), 1fr));
1646
+ gap: 6px;
1647
+ }
1648
+
1649
+ .sidebar__content--mobile .thumbnail-grid--2col {
1650
+ grid-template-columns: repeat(2, 1fr);
1651
+ }
1652
+
1653
+ .sidebar__content--mobile .thumbnail-grid--finish {
1654
+ grid-template-columns: repeat(auto-fill, minmax(var(--thumbnail-min-width), 1fr));
1655
+ }
1656
+
1657
+ .sidebar__content--mobile .thumbnail-grid--door-type {
1658
+ grid-template-columns: repeat(auto-fill, minmax(var(--thumbnail-min-width), 1fr));
1659
+ gap: 4px;
1660
+ }
1661
+
1662
+ .sidebar__content--mobile .thumbnail-grid--handle {
1663
+ grid-template-columns: repeat(auto-fill, minmax(var(--thumbnail-min-width), 1fr));
1664
+ }
1665
+
1666
+ .sidebar__content--mobile .thumbnail-grid--style {
1667
+ grid-template-columns: repeat(auto-fill, minmax(var(--thumbnail-min-width), 1fr));
1668
+ }
1669
+
1670
+ .sidebar__content--mobile .thumbnail-grid--color {
1671
+ grid-template-columns: repeat(auto-fill, minmax(var(--thumbnail-min-width), 1fr));
1672
+ }
1673
+
1674
+ .sidebar__content--mobile .finish-thumbnail__name {
1675
+ font-size: 12px;
1676
+ }
1677
+
1678
+ .sidebar__content--mobile .sidebar__section-title {
1679
+ font-size: 12px;
1680
+ }
1681
+
1682
+ .sidebar__content--mobile .option-thumbnail__name {
1683
+ font-size: 10px;
1684
+ }
1685
+
1686
+ .sidebar__content--mobile .option-thumbnail__img-label {
1687
+ font-size: 12px;
1688
+ }
1689
+
1690
+ .sidebar__content--mobile .frame-size-btn {
1691
+ padding: 6px 8px;
1692
+ font-size: 12px;
1693
+ }
1694
+
1695
+ .sidebar__content--mobile .sidebar__back-btn {
1696
+ font-size: var(--font-size-lg);
1697
+ }
1698
+
1699
+ /* Small mobile (< 400px) override no longer needed — auto-fill handles it */
1700
+
1701
+ /* ============================================
1702
+ ADD WALL CORNER BUTTON
1703
+ ============================================ */
1704
+ .sidebar__add-btn {
1705
+ display: block;
1706
+ width: 100%;
1707
+ padding: var(--spacing-sm) var(--spacing-md);
1708
+ border: 1px dashed var(--color-neutral-400);
1709
+ border-radius: var(--border-radius-md, 6px);
1710
+ background: transparent;
1711
+ color: var(--color-neutral-700);
1712
+ font-size: var(--font-size-sm);
1713
+ font-weight: var(--font-weight-medium);
1714
+ cursor: pointer;
1715
+ transition: all var(--transition-fast);
1716
+ text-align: center;
1717
+ }
1718
+ .sidebar__add-btn:hover {
1719
+ border-color: var(--color-neutral-600);
1720
+ background: var(--color-neutral-100);
1721
+ color: var(--color-neutral-900);
1722
+ }
1723
+
1724
+ /* Options loader — shown while a selected piece's bindings are being fetched, so the
1725
+ sidebar doesn't flash the full/global option list before the narrowed per-piece list. */
1726
+ .sidebar__options-loading {
1727
+ display: flex;
1728
+ flex-direction: column;
1729
+ align-items: center;
1730
+ justify-content: center;
1731
+ gap: 10px;
1732
+ padding: 32px 16px;
1733
+ color: var(--color-text-secondary, var(--text-tertiary, #888));
1734
+ font-size: 13px;
1735
+ }
1736
+ .sidebar__options-loading-spinner {
1737
+ width: 22px;
1738
+ height: 22px;
1739
+ border: 2px solid rgba(0, 0, 0, 0.12);
1740
+ border-top-color: var(--color-primary, #3b82f6);
1741
+ border-radius: 50%;
1742
+ animation: sidebar-options-loading-spin 0.7s linear infinite;
1743
+ }
1744
+ @keyframes sidebar-options-loading-spin {
1745
+ to { transform: rotate(360deg); }
1746
+ }
1747
+ :root[data-theme-mode="dark"] .sidebar__options-loading-spinner {
1748
+ border-color: rgba(255, 255, 255, 0.18);
1749
+ border-top-color: var(--color-primary, #6ea8fe);
1750
+ }
1751
+
1752
+ /* ── Option-set presentations (accordion / popover) ─────────────────────────
1753
+ Only apply to sets whose backend record asks for them; the default `inline`
1754
+ presentation is untouched, which is what keeps the DOM-parity suite green. */
1755
+
1756
+ .sidebar__section-toggle {
1757
+ display: flex;
1758
+ align-items: center;
1759
+ justify-content: space-between;
1760
+ gap: 8px;
1761
+ width: 100%;
1762
+ padding: 0;
1763
+ background: none;
1764
+ border: 0;
1765
+ font: inherit;
1766
+ color: inherit;
1767
+ letter-spacing: inherit;
1768
+ text-align: left;
1769
+ cursor: pointer;
1770
+ }
1771
+
1772
+ .sidebar__section-chevron {
1773
+ flex: 0 0 auto;
1774
+ width: 8px;
1775
+ height: 8px;
1776
+ border-right: 1.5px solid currentColor;
1777
+ border-bottom: 1.5px solid currentColor;
1778
+ transform: rotate(45deg);
1779
+ transition: transform 0.15s ease;
1780
+ }
1781
+ @media (prefers-reduced-motion: reduce) {
1782
+ .sidebar__section-chevron { transition: none; }
1783
+ }
1784
+ /* accordion points down when closed, up when open; popover points sideways */
1785
+ [data-open="true"] > .sidebar__section-title .sidebar__section-chevron { transform: rotate(-135deg); }
1786
+ .sidebar__section--popover .sidebar__section-chevron { transform: rotate(-45deg); }
1787
+
1788
+ /* The floating panel. Portalled to <body>, so it must carry its own surface
1789
+ styling — it inherits nothing from the sidebar. z-index comes from the shared
1790
+ token scale (styles/variables.css) so it cannot fight modals and toasts. */
1791
+ .sdk-popover {
1792
+ z-index: var(--z-tooltip, 200);
1793
+ max-width: min(420px, calc(100vw - 32px));
1794
+ max-height: calc(100vh - 32px);
1795
+ overflow-y: auto;
1796
+ padding: 12px;
1797
+ background: var(--color-surface, var(--bg-primary, #fff));
1798
+ border: 1px solid var(--color-border, #e4e7ea);
1799
+ border-radius: var(--radius-xl, 12px);
1800
+ box-shadow: 0 8px 28px rgba(0, 0, 0, 0.14);
1801
+ }
1802
+
1803
+
1804
+ /* ── Nested option-set flow ────────────────────────────────────────────────
1805
+ `flow` (backend record or host override) decides the direction a section's
1806
+ content runs. `column` is the historical stacked layout and stays the default,
1807
+ so nothing changes unless a set asks for `row`. Both the option grid and a
1808
+ GROUP's child sections honour it, which is what makes side-wise nesting work
1809
+ without a custom component. */
1810
+ [data-part="option-set"][data-flow="row"] > [data-part="option-set/options"] {
1811
+ display: flex;
1812
+ flex-direction: row;
1813
+ flex-wrap: wrap;
1814
+ align-items: flex-start;
1815
+ }
1816
+ /* A section's children live INSIDE its options container, not as direct children of the
1817
+ section — so `row` is applied there, and the immediate children need explicit flex
1818
+ sizing or block-level content makes each one claim a full line and wrap. */
1819
+ [data-part="option-set"][data-flow="row"] > [data-part="option-set/options"] > * {
1820
+ flex: 1 1 0;
1821
+ min-width: 0;
1822
+ }
1823
+ [data-part="option-set"][data-flow="row"] > [data-part="option-set/options"] { gap: 12px; }
1824
+
1825
+
1826
+ /* ── Nested option-set GROUPS ──────────────────────────────────────────────
1827
+ A GROUP option set renders as a heading with its child option-set pickers
1828
+ nested under it. Public styling hooks: `data-kind="group"` + `data-depth="N"`
1829
+ on the section. Its children live in the group's `option-set/options`
1830
+ container (each child is itself a full option-set section). Themes override
1831
+ these; the tokens let a theme tune indent/heading without rewriting rules. */
1832
+ [data-part="option-set"][data-kind="group"] > [data-part="option-set/title"] {
1833
+ font-weight: var(--os-group-title-weight, 700);
1834
+ letter-spacing: 0.04em;
1835
+ }
1836
+ [data-part="option-set"][data-kind="group"] > [data-part="option-set/options"] {
1837
+ padding-left: var(--os-group-indent, 12px);
1838
+ border-left: 1px solid var(--os-group-border, var(--color-border, #e4e7ea));
1839
+ margin-top: 6px;
1840
+ }
1841
+ /* Space stacked child sections. Scoped to NON-row flow: in `row` the children sit side by
1842
+ side and the container's own `gap` spaces them, so a margin-top here offsets the second
1843
+ child vertically instead — 10px down, which is exactly enough to stop it being "on the same
1844
+ row". The :not() is what makes this match the sentence above it. */
1845
+ [data-part="option-set"][data-kind="group"]:not([data-flow="row"]) > [data-part="option-set/options"] > .sidebar__group-child + .sidebar__group-child {
1846
+ margin-top: var(--os-group-gap, 10px);
1847
+ }
1848
+
1849
+ }