@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,442 @@
1
+ @layer sdk-base, vendor, sdk;
2
+ @import './variables.css';
3
+ @import './themes.css';
4
+ @layer sdk-base {
5
+ /* Import CSS variables - single source of truth */
6
+
7
+ /* Backend-selectable theme skins (data-theme on <html>) */
8
+
9
+
10
+ * {
11
+ margin: 0;
12
+ padding: 0;
13
+ box-sizing: border-box;
14
+ }
15
+
16
+ html, body, #root {
17
+ height: 100%;
18
+ width: 100%;
19
+ overflow: hidden;
20
+ }
21
+
22
+ body {
23
+ font-family: var(--font-family);
24
+ font-size: var(--font-size-md);
25
+ color: var(--text-primary);
26
+ background-color: var(--bg-secondary);
27
+ -webkit-font-smoothing: antialiased;
28
+ -moz-osx-font-smoothing: grayscale;
29
+ }
30
+
31
+ /* Scrollbar styling */
32
+ ::-webkit-scrollbar {
33
+ width: 8px;
34
+ height: 8px;
35
+ }
36
+
37
+ ::-webkit-scrollbar-track {
38
+ background: var(--bg-secondary);
39
+ }
40
+
41
+ ::-webkit-scrollbar-thumb {
42
+ background: var(--border-color);
43
+ border-radius: 4px;
44
+ }
45
+
46
+ ::-webkit-scrollbar-thumb:hover {
47
+ background: var(--text-secondary);
48
+ }
49
+
50
+ /* Button reset */
51
+ button {
52
+ font-family: inherit;
53
+ font-size: inherit;
54
+ cursor: pointer;
55
+ border: none;
56
+ background: none;
57
+ }
58
+
59
+ /* Input reset */
60
+ input, select, textarea {
61
+ font-family: inherit;
62
+ font-size: inherit;
63
+ }
64
+
65
+ /* Common utility classes */
66
+ .flex {
67
+ display: flex;
68
+ }
69
+
70
+ .flex-col {
71
+ flex-direction: column;
72
+ }
73
+
74
+ .items-center {
75
+ align-items: center;
76
+ }
77
+
78
+ .justify-center {
79
+ justify-content: center;
80
+ }
81
+
82
+ .justify-between {
83
+ justify-content: space-between;
84
+ }
85
+
86
+ .gap-sm {
87
+ gap: var(--spacing-sm);
88
+ }
89
+
90
+ .gap-md {
91
+ gap: var(--spacing-md);
92
+ }
93
+
94
+ /* Loading screen */
95
+ /* Floating AI assistant for the structural theme shells (wizard/showroom/showcase).
96
+ The default theme docks ChatBar in the sidebar, which those shells' <Sidebar
97
+ embedded> strips — so here it's a round AI button pinned BOTTOM-RIGHT of the scene
98
+ that opens a chat popup anchored above it (desktop AND mobile). Themeable via the
99
+ shared brand tokens. */
100
+ /* Scrim behind the open mobile chat sheet — none on desktop. */
101
+ .shell-chat-backdrop { display: none; }
102
+
103
+ .shell-chat-fab {
104
+ /* Desktop: anchored to the SCENE's bottom-right (ShellAssistants mounts inside
105
+ the scene <main>, which is position:relative and full-height on desktop). That
106
+ keeps the button clear of the side panel's footer CTA (Generate/Save). Mobile
107
+ switches to position:fixed + raised above the footer (see the @media block). */
108
+ position: absolute;
109
+ left: 18px;
110
+ /* 64, not 18: the scene's bottom-left corner is the SDK watermark's (Powered by
111
+ imagine.io, ~49px tall incl. offset, not configurable). At 18 the FAB sat on it in
112
+ Showroom (T3) + Showcase (T4), which use this base (user-reported). LiveStatus owns
113
+ bottom-right, MainLayout renders no FAB, and Wizard overrides this line — so raising
114
+ the base clears the watermark on exactly the two shells that needed it. */
115
+ bottom: 64px;
116
+ z-index: 21;
117
+ width: 54px;
118
+ height: 54px;
119
+ display: flex;
120
+ align-items: center;
121
+ justify-content: center;
122
+ padding: 0;
123
+ border: none;
124
+ border-radius: 50%;
125
+ /* --shell-fab-bg is set by each theme shell to its accent (matches the theme's
126
+ CTA colour). Falls back to the global primary, then a literal. */
127
+ background: var(--shell-fab-bg, var(--color-primary, #e07b39));
128
+ color: #fff;
129
+ cursor: pointer;
130
+ box-shadow: 0 10px 26px -6px rgba(0, 0, 0, 0.35);
131
+ transition: transform 0.15s ease, box-shadow 0.15s ease, background 0.15s ease;
132
+ }
133
+ /* No mark, no clearance: back to the corner it was designed for. Without this the button
134
+ floats a mark's height above nothing on every entitled org (user-reported). */
135
+ html[data-watermark="off"] .shell-chat-fab { bottom: 18px; }
136
+ .shell-chat-fab:hover { transform: translateY(-1px); box-shadow: 0 14px 30px -6px rgba(0, 0, 0, 0.42); }
137
+ .shell-chat-fab:active { transform: translateY(0); }
138
+ .shell-chat-fab svg { width: 24px; height: 24px; }
139
+ .shell-chat-fab--open { background: var(--shell-fab-bg-strong, var(--shell-fab-bg, var(--color-primary-dark, #c8692c))); }
140
+
141
+ /* The popup — anchored above the FAB in the bottom-right (scene-relative on
142
+ desktop, viewport-fixed on mobile — mirrors the FAB). */
143
+ .shell-chat-pop {
144
+ position: absolute;
145
+ left: 18px;
146
+ bottom: 130px; /* above the raised FAB (64 + 54 + gap) */
147
+ z-index: 21;
148
+ width: 360px;
149
+ max-width: calc(100% - 36px);
150
+ height: min(520px, 68vh);
151
+ display: flex;
152
+ flex-direction: column;
153
+ overflow: hidden;
154
+ background: var(--bg-primary, #fff);
155
+ border: 1px solid var(--border-color, #e1e1e1);
156
+ border-radius: 14px;
157
+ box-shadow: 0 18px 46px -10px rgba(0, 0, 0, 0.32);
158
+ transform-origin: bottom left;
159
+ animation: shell-chat-pop-in 0.16s ease-out;
160
+ }
161
+ @keyframes shell-chat-pop-in {
162
+ from { opacity: 0; transform: translateY(8px) scale(0.96); }
163
+ to { opacity: 1; transform: translateY(0) scale(1); }
164
+ }
165
+ .shell-chat-pop__head {
166
+ flex: 0 0 auto;
167
+ display: flex;
168
+ align-items: center;
169
+ justify-content: space-between;
170
+ gap: 8px;
171
+ padding: 12px 12px 12px 16px;
172
+ border-bottom: 1px solid var(--border-color, #ececec);
173
+ }
174
+ .shell-chat-pop__title {
175
+ display: flex;
176
+ align-items: center;
177
+ gap: 8px;
178
+ font-size: 14px;
179
+ font-weight: 600;
180
+ color: var(--text-primary, #1a1a1a);
181
+ }
182
+ .shell-chat-pop__title svg { width: 16px; height: 16px; color: var(--shell-fab-bg, var(--color-primary, #e07b39)); }
183
+ .shell-chat-pop__off { font-style: normal; font-size: 11px; font-weight: 500; color: #ff6b6b; }
184
+ .shell-chat-pop__close {
185
+ flex: 0 0 auto;
186
+ width: 30px;
187
+ height: 30px;
188
+ display: inline-flex;
189
+ align-items: center;
190
+ justify-content: center;
191
+ padding: 0;
192
+ border: none;
193
+ border-radius: 8px;
194
+ background: transparent;
195
+ color: var(--text-secondary, #6b6b6b);
196
+ cursor: pointer;
197
+ }
198
+ .shell-chat-pop__close:hover { background: rgba(0, 0, 0, 0.06); color: var(--text-primary, #1a1a1a); }
199
+ .shell-chat-pop__close svg { width: 18px; height: 18px; }
200
+ .shell-chat-pop__body { flex: 1 1 auto; min-height: 0; display: flex; }
201
+ .shell-chat-pop__body .chat-bar--embedded { flex: 1 1 auto; min-height: 0; display: flex; flex-direction: column; width: 100%; }
202
+
203
+ /* The AI FAB owns the scene's bottom-LEFT, so the LiveStatusPanel stays bottom-RIGHT
204
+ (its default) — the two never share a corner. */
205
+ .shell-live .live-status-bar { right: 16px; left: auto; }
206
+
207
+ /* Mobile: the panel (with its Generate/Save footer CTA) sits at the bottom of the
208
+ screen, so pin the FAB to the VIEWPORT bottom-right but RAISED above that footer
209
+ bar so it never collides with it. The popup spans nearly full width above it. */
210
+ @media (max-width: 768px) {
211
+ .shell-chat-fab {
212
+ position: fixed;
213
+ left: 14px;
214
+ /* Each theme sets --shell-fab-bottom-m to clear ITS footer (a pinned Generate/
215
+ Save bar needs more; a short/scrolling footer needs almost none). Default is
216
+ a small offset so it doesn't float awkwardly high. */
217
+ bottom: var(--shell-fab-bottom-m, 16px);
218
+ width: 48px;
219
+ height: 48px;
220
+ }
221
+ .shell-chat-fab svg { width: 22px; height: 22px; }
222
+ .shell-chat-backdrop {
223
+ display: block;
224
+ position: fixed;
225
+ inset: 0;
226
+ z-index: 69; /* under the sheet (70), over the watermark (60) */
227
+ background: rgba(15, 14, 12, 0.22); /* a light tint so the blur reads on flat scenes */
228
+ backdrop-filter: blur(3px);
229
+ -webkit-backdrop-filter: blur(3px); /* iOS Safari */
230
+ }
231
+ .shell-chat-pop {
232
+ /* A BOTTOM-HALF SHEET on phones (user decision 2026-08-28), same in every theme —
233
+ the old near-fullscreen sheet (top:12 → above the FAB) covered the whole app and
234
+ its bottom edge collided with the watermark / FAB corners. Half the screen keeps
235
+ the scene visible above the conversation, which is the point of the product. */
236
+ position: fixed;
237
+ left: 0;
238
+ right: 0;
239
+ top: auto;
240
+ bottom: 0;
241
+ width: auto;
242
+ max-width: none;
243
+ height: 50vh;
244
+ height: 50dvh; /* dynamic viewport: correct under mobile URL bars */
245
+ border-radius: 16px 16px 0 0;
246
+ border-left: none;
247
+ border-right: none;
248
+ border-bottom: none;
249
+ z-index: 70; /* above the watermark (60) — the sheet is a focused task */
250
+ }
251
+ }
252
+
253
+ .loading-screen {
254
+ display: flex;
255
+ align-items: center;
256
+ justify-content: center;
257
+ height: 100%;
258
+ background: var(--bg-primary);
259
+ }
260
+
261
+ /* The spinner + label live in a box so the translucent variant can float them
262
+ as a card over the visible scene. Transparent by default → opaque loader looks
263
+ unchanged. */
264
+ .loading-screen__box {
265
+ display: flex;
266
+ flex-direction: column;
267
+ align-items: center;
268
+ gap: var(--spacing-sm);
269
+ }
270
+
271
+ /* Overlay variant — the base loader is height:100% in normal flow (used as the
272
+ sole element / a Suspense fallback). This pins it over already-mounted content
273
+ so the App boot can render the scene canvas underneath (assets load) while the
274
+ loader stays on top until they're idle. */
275
+ .loading-screen--overlay {
276
+ position: fixed;
277
+ inset: 0;
278
+ width: 100%;
279
+ height: 100%;
280
+ z-index: 10000;
281
+ /* Uses the theme tokens (background/font) so the loader matches the active theme —
282
+ bootConfigurator applies the theme as soon as the config loads, while the loader
283
+ is still up, so it's themed for the whole boot. */
284
+ }
285
+
286
+ /* Translucent variant — the scene is already visible and only its products are
287
+ still streaming in. A light, blurred scrim lets the scene show through while a
288
+ floating card presents the spinner + "Loading products…". */
289
+ .loading-screen--translucent {
290
+ background: rgba(20, 20, 24, 0.28); /* fallback for no color-mix support */
291
+ background: color-mix(in srgb, var(--bg-primary) 35%, transparent);
292
+ backdrop-filter: blur(2px);
293
+ -webkit-backdrop-filter: blur(2px);
294
+ }
295
+ .loading-screen--translucent .loading-screen__box {
296
+ padding: 18px 26px;
297
+ border-radius: var(--radius-lg, 12px);
298
+ background: var(--bg-primary);
299
+ box-shadow: 0 10px 34px rgba(0, 0, 0, 0.2), 0 0 0 1px rgba(0, 0, 0, 0.04);
300
+ }
301
+
302
+ /* Compact variant — the in-context pill: the busy veil during engine round-trips /
303
+ ui.setLoading (EvaluatingOverlay renders it) and panels loading in place (the chat).
304
+ In flow, transparent, one row: small spinner + one line in a floating card. The SAME
305
+ component as the boot screen, so a registered LoadingScreen replaces this too. */
306
+ .loading-screen--compact {
307
+ height: auto;
308
+ background: transparent;
309
+ }
310
+ .loading-screen--compact .loading-screen__box {
311
+ flex-direction: row;
312
+ align-items: center;
313
+ gap: 10px;
314
+ padding: 10px 16px;
315
+ border-radius: 10px;
316
+ background: var(--bg-primary, #ffffff);
317
+ color: var(--text-primary, #222222);
318
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.18);
319
+ }
320
+ .loading-screen--compact .loading-screen__spinner {
321
+ width: 18px;
322
+ height: 18px;
323
+ border-width: 2px;
324
+ animation-duration: 0.7s;
325
+ flex: none;
326
+ }
327
+ .loading-screen--compact .loading-screen__text {
328
+ margin: 0;
329
+ font-size: 13px;
330
+ font-weight: 500;
331
+ color: var(--text-primary, #222222);
332
+ }
333
+ .loading-screen--compact .loading-screen__detail,
334
+ .loading-screen--compact .loading-screen__bar,
335
+ .loading-screen--compact .loading-screen__pct {
336
+ display: none;
337
+ }
338
+
339
+ .loading-screen__spinner {
340
+ width: 48px;
341
+ height: 48px;
342
+ border: 4px solid var(--border-color);
343
+ border-top-color: var(--color-primary);
344
+ border-radius: 50%;
345
+ animation: spin 1s linear infinite;
346
+ }
347
+
348
+ .loading-screen__text {
349
+ margin-top: var(--spacing-md);
350
+ color: var(--text-secondary);
351
+ }
352
+
353
+ /* Secondary line: WHAT is loading right now (e.g. "Loading components… 12/18"). */
354
+ .loading-screen__detail {
355
+ margin: 2px 0 0;
356
+ font-size: 12.5px;
357
+ color: var(--text-tertiary, var(--text-secondary, #8a8a8a));
358
+ text-align: center;
359
+ min-height: 15px;
360
+ }
361
+
362
+ /* Determinate progress bar (shown when a numeric progress is passed). */
363
+ .loading-screen__bar {
364
+ margin-top: 12px;
365
+ width: min(240px, 60vw);
366
+ height: 6px;
367
+ border-radius: 999px;
368
+ background: var(--border-color, rgba(0, 0, 0, 0.1));
369
+ overflow: hidden;
370
+ }
371
+ .loading-screen__bar-fill {
372
+ height: 100%;
373
+ border-radius: 999px;
374
+ background: var(--color-primary, #e07b39);
375
+ transition: width 0.3s ease;
376
+ }
377
+ .loading-screen__pct {
378
+ margin: 6px 0 0;
379
+ font-size: 11px;
380
+ font-weight: 600;
381
+ letter-spacing: 0.5px;
382
+ color: var(--text-secondary, #8a8a8a);
383
+ }
384
+
385
+ @keyframes spin {
386
+ to {
387
+ transform: rotate(360deg);
388
+ }
389
+ }
390
+
391
+ /* Error screen */
392
+ .error-screen {
393
+ display: flex;
394
+ flex-direction: column;
395
+ align-items: center;
396
+ justify-content: center;
397
+ height: 100%;
398
+ padding: var(--spacing-xl);
399
+ text-align: center;
400
+ }
401
+
402
+ .error-screen h1 {
403
+ color: var(--color-error);
404
+ margin-bottom: var(--spacing-md);
405
+ }
406
+
407
+ .error-screen p {
408
+ color: var(--text-secondary);
409
+ margin-bottom: var(--spacing-lg);
410
+ }
411
+
412
+ .error-screen button {
413
+ padding: var(--spacing-sm) var(--spacing-lg);
414
+ background: var(--color-primary);
415
+ color: var(--text-inverse);
416
+ border-radius: var(--border-radius);
417
+ font-weight: 500;
418
+ }
419
+
420
+ .error-screen button:hover {
421
+ background: var(--color-primary-dark);
422
+ }
423
+
424
+ /* Shared spinner for Generate Assets button */
425
+ .generate-btn__spinner {
426
+ width: 14px;
427
+ height: 14px;
428
+ border: 2px solid rgba(255, 255, 255, 0.3);
429
+ border-top-color: #fff;
430
+ border-radius: 50%;
431
+ animation: generate-btn-spin 0.6s linear infinite;
432
+ margin-right: 6px;
433
+ }
434
+
435
+ @keyframes generate-btn-spin {
436
+ to { transform: rotate(360deg); }
437
+ }
438
+
439
+ /* LICENCE GATE REFUSAL lives in ui/LicenceNotice.css — a FIXED look by design, so it takes
440
+ no theme tokens from here. */
441
+
442
+ }