@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.
- package/LICENSE.md +294 -0
- package/README.md +103 -0
- package/dist/00a41227ff.js +1 -0
- package/dist/00ab3dcbb5.js +1 -0
- package/dist/01a664fa9f.css +51 -0
- package/dist/04746bff9a.js +1 -0
- package/dist/04931f795e.js +1 -0
- package/dist/05973a4da2.js +3 -0
- package/dist/061b81ad81.js +1 -0
- package/dist/066fc9aa40.js +1 -0
- package/dist/09c4973968.js +1 -0
- package/dist/0a35b2c5f4.js +1 -0
- package/dist/0af28430ab.js +1 -0
- package/dist/0e2dedae0d.js +1 -0
- package/dist/0f7c8345a8.js +1 -0
- package/dist/12b8165d6d.js +1 -0
- package/dist/1458417bdb.js +1 -0
- package/dist/14c83bc57a.js +1 -0
- package/dist/15d6bec3b5.css +150 -0
- package/dist/16a399703e.js +1 -0
- package/dist/17876f4322.css +114 -0
- package/dist/1870fc037b.js +1 -0
- package/dist/1a2629800a.css +196 -0
- package/dist/1e243363f6.js +1 -0
- package/dist/1fac915f8b.js +1 -0
- package/dist/1fff100656.js +1 -0
- package/dist/205827c5c8.js +1 -0
- package/dist/20b0104576.js +1 -0
- package/dist/2239b22616.js +1 -0
- package/dist/22bd38ddcf.js +1 -0
- package/dist/239b619005.css +1849 -0
- package/dist/23dc0ccf32.js +1 -0
- package/dist/26155bf68c.js +1 -0
- package/dist/2774152dd2.js +1 -0
- package/dist/27fee7007f.js +1 -0
- package/dist/281cf952fa.js +1 -0
- package/dist/28a9d58274.js +1 -0
- package/dist/28d887bf8a.js +1 -0
- package/dist/28df2aa12f.js +1 -0
- package/dist/297e653adf.js +1 -0
- package/dist/2990ba64d6.js +1 -0
- package/dist/2b6aa27f6d.js +1 -0
- package/dist/2c7c1bcef1.js +1 -0
- package/dist/2cab5c5c23.js +1 -0
- package/dist/2cafe3274b.js +1 -0
- package/dist/2e366d7386.js +1 -0
- package/dist/2f8cc8b292.js +1 -0
- package/dist/30be653f00.css +110 -0
- package/dist/31ea036f5c.js +1 -0
- package/dist/32861ea2b0.js +1 -0
- package/dist/33fa2c8ca2.js +1 -0
- package/dist/35d8449ed8.js +1 -0
- package/dist/3656ffa1b8.js +1 -0
- package/dist/367a479d3a.js +1 -0
- package/dist/371ed78aa2.js +1 -0
- package/dist/37596ace72.js +1 -0
- package/dist/37addc7fb3.js +1 -0
- package/dist/388cadacbd.js +1 -0
- package/dist/39a62ef7b8.js +1 -0
- package/dist/3bbcee0334.js +1 -0
- package/dist/3c916f744f.js +1 -0
- package/dist/3f37665dd1.js +1 -0
- package/dist/3fb3ab6757.js +1 -0
- package/dist/40d6aeb28c.js +1 -0
- package/dist/41ed5985ad.js +1 -0
- package/dist/431a2d8618.js +1 -0
- package/dist/44a229099f.js +1 -0
- package/dist/4741e5d07d.css +263 -0
- package/dist/4910c07ca8.css +411 -0
- package/dist/4a99ddb3fd.js +1 -0
- package/dist/4aa671f9f6.js +1 -0
- package/dist/4b8958aa4c.js +1 -0
- package/dist/4ba4f544b9.js +1 -0
- package/dist/4c24338793.js +1 -0
- package/dist/4d7a0d1897.js +1 -0
- package/dist/4e1db1e3b0.js +1 -0
- package/dist/4e7d0a0d4a.js +1 -0
- package/dist/51b23203e5.css +1447 -0
- package/dist/52436e0169.js +1 -0
- package/dist/54413c1eae.js +1 -0
- package/dist/54f0fcf38b.js +1 -0
- package/dist/55ab45ada4.css +370 -0
- package/dist/561dc3f1ab.js +1 -0
- package/dist/58e6419ba8.js +1 -0
- package/dist/5c9fd9201c.js +1 -0
- package/dist/5d05e8982e.js +1 -0
- package/dist/5d5e8a9c58.js +3 -0
- package/dist/5e4f2349ff.js +1 -0
- package/dist/609e5e5d28.js +1 -0
- package/dist/60d697292c.js +1 -0
- package/dist/61e0c0c9b5.js +1 -0
- package/dist/631a9f7fac.js +1 -0
- package/dist/64e9020b49.js +1 -0
- package/dist/66c461dc2c.js +1 -0
- package/dist/672404d987.js +1 -0
- package/dist/67f6338a4a.js +1 -0
- package/dist/6855e6a3b1.js +1 -0
- package/dist/6b0a81e4f8.js +1 -0
- package/dist/6ba86aa3b8.js +1 -0
- package/dist/6bff84d27e.js +1 -0
- package/dist/6c0a2572dd.js +1 -0
- package/dist/6d238282c1.js +1 -0
- package/dist/6e2595aa36.js +1 -0
- package/dist/6f9ae59d6c.js +1 -0
- package/dist/70dd811d74.js +1 -0
- package/dist/710c1ab641.js +1 -0
- package/dist/7206ce49c6.js +1 -0
- package/dist/7281d77ed9.js +1 -0
- package/dist/73f7d65985.js +1 -0
- package/dist/776277593f.js +1 -0
- package/dist/79a397bb92.js +1 -0
- package/dist/7a748aae59.js +1 -0
- package/dist/7bfb0ecfbb.css +572 -0
- package/dist/7bfcd0a517.js +1 -0
- package/dist/7d9ddaeb47.js +1 -0
- package/dist/7f833bc5af.js +1 -0
- package/dist/811b403d43.js +1 -0
- package/dist/817d930a49.js +1 -0
- package/dist/81802759ca.js +1 -0
- package/dist/81eb433604.js +1 -0
- package/dist/82a8a4bc35.js +1 -0
- package/dist/85af90fade.js +1 -0
- package/dist/872c4302e0.js +1 -0
- package/dist/87bb469216.js +1 -0
- package/dist/87dcc12b65.js +1 -0
- package/dist/87f511c4a8.js +1 -0
- package/dist/88251d6671.js +1 -0
- package/dist/882bc739c8.js +1 -0
- package/dist/89ab18ebc5.js +1 -0
- package/dist/8a22e8944f.css +563 -0
- package/dist/8a3a57c008.js +1 -0
- package/dist/8ade32d067.js +1 -0
- package/dist/8bf6d26ad6.css +233 -0
- package/dist/8c27edda0f.js +1 -0
- package/dist/8db8655f21.js +24 -0
- package/dist/8f60e5059a.js +1 -0
- package/dist/91707f5ca0.css +78 -0
- package/dist/921bf270dd.js +20 -0
- package/dist/9326c23506.js +1 -0
- package/dist/94a0a79c65.js +1 -0
- package/dist/9526094bb7.js +1 -0
- package/dist/9544661159.js +1 -0
- package/dist/95a44ebec2.js +1 -0
- package/dist/970313b92b.js +1 -0
- package/dist/9794652102.js +1 -0
- package/dist/983cbed22c.js +1 -0
- package/dist/9840b9ce12.js +1 -0
- package/dist/98f3644031.js +1 -0
- package/dist/992778075d.css +353 -0
- package/dist/9c6c598569.js +1 -0
- package/dist/9f474b5d1a.js +1 -0
- package/dist/a0f71d0bf5.js +1 -0
- package/dist/a3c983d431.js +1 -0
- package/dist/a3f18e76fe.js +1 -0
- package/dist/a493e9aa8f.js +1 -0
- package/dist/a77b15c0d6.js +1 -0
- package/dist/a811c90bd5.js +1 -0
- package/dist/a822c5e4f2.js +1 -0
- package/dist/aaa0e82d7f.css +69 -0
- package/dist/ab6c80484f.js +1 -0
- package/dist/ae96f219e3.js +1 -0
- package/dist/b11b38869d.css +427 -0
- package/dist/b1349d5a21.js +4 -0
- package/dist/b14379d31b.css +151 -0
- package/dist/b3efb26fd7.js +1 -0
- package/dist/b59b0dde17.js +1 -0
- package/dist/b5c372377f.js +1 -0
- package/dist/b976df09ec.js +1 -0
- package/dist/baeaed46c9.js +1 -0
- package/dist/bb719febc6.js +1 -0
- package/dist/bcd44b4040.js +1 -0
- package/dist/bdc4e4c5b9.css +209 -0
- package/dist/bdec200d00.js +1 -0
- package/dist/be0cfe2236.js +1 -0
- package/dist/be337ddda5.js +1 -0
- package/dist/c12c112c6f.js +1 -0
- package/dist/c2a14a77ae.js +1 -0
- package/dist/c3b8f1973b.js +1 -0
- package/dist/c44d37da7a.js +1 -0
- package/dist/c4790179f1.js +1 -0
- package/dist/c5e990946e.js +1 -0
- package/dist/c71892453b.js +1 -0
- package/dist/c9a1656c62.js +1 -0
- package/dist/ca497b066c.js +1 -0
- package/dist/cdb4a0f7b3.js +3 -0
- package/dist/ce663020e4.js +60 -0
- package/dist/cec035efb1.js +1 -0
- package/dist/d0f9681634.js +1 -0
- package/dist/d118c2e7ba.js +1 -0
- package/dist/d20718159b.js +3 -0
- package/dist/d30f1f506e.js +1 -0
- package/dist/d3cd7f1bc1.js +1 -0
- package/dist/d4378d9afa.js +1 -0
- package/dist/d464da28a5.js +1 -0
- package/dist/d566d3874b.js +1 -0
- package/dist/d617bbb9f5.js +26 -0
- package/dist/d65f32e004.js +1 -0
- package/dist/d6851ea979.js +1 -0
- package/dist/d7c9500ba9.js +1 -0
- package/dist/d803155241.js +1 -0
- package/dist/d903df4e0d.js +1 -0
- package/dist/d94df858ea.js +1 -0
- package/dist/da7b5f450d.js +1 -0
- package/dist/daa11edd01.js +1 -0
- package/dist/db4afd43c9.js +1 -0
- package/dist/dbd5ba1d07.js +1 -0
- package/dist/dc2a1a0e13.js +1 -0
- package/dist/dc812f3e14.js +1 -0
- package/dist/dcbf419090.css +122 -0
- package/dist/dcdba78ddf.js +1 -0
- package/dist/de408c4516.js +1 -0
- package/dist/e1cd279733.js +1 -0
- package/dist/e379e0039b.js +1 -0
- package/dist/e4fe0551fd.js +1 -0
- package/dist/e6eed481cc.css +28 -0
- package/dist/e75f1e5992.js +1 -0
- package/dist/ea8577d22b.js +1 -0
- package/dist/ec4a34fc80.css +313 -0
- package/dist/ed6a54cdf6.js +1 -0
- package/dist/ee242c0099.js +1 -0
- package/dist/ee9b9fd7d1.js +1 -0
- package/dist/f0c3d8a28a.js +1 -0
- package/dist/f11a45a150.js +1 -0
- package/dist/f1b3b2622a.js +1 -0
- package/dist/f7b4a178e3.js +1 -0
- package/dist/f89d7cd931.js +1 -0
- package/dist/f8cb80a93c.js +1 -0
- package/dist/f8fec86f10.js +1 -0
- package/dist/fbd844f2d1.js +1 -0
- package/dist/fe235d7160.js +1 -0
- package/dist/fe58a84b85.js +1 -0
- package/dist/fe68b361ba.js +1 -0
- package/dist/ff5b3d17e2.js +1 -0
- package/dist/styles/globals.css +442 -0
- package/dist/styles/themes.css +532 -0
- package/dist/styles/variables.css +299 -0
- package/package.json +68 -0
- package/static/assets/draco/README.md +32 -0
- package/static/assets/draco/draco_decoder.js +34 -0
- package/static/assets/draco/draco_decoder.wasm +0 -0
- package/static/assets/draco/draco_encoder.js +35 -0
- package/static/assets/draco/draco_encoder.wasm +0 -0
- package/static/assets/draco/draco_encoder_wrapper.js +98 -0
- package/static/assets/draco/draco_wasm_wrapper.js +117 -0
- package/static/favicon.svg +28 -0
- 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
|
+
}
|