1:root {
2 --bg: #14161a;
3 --panel: #1d2026;
4 --panel2: #23272f;
5 --border: #31363f;
6 --text: #d6dae2;
7 --muted: #8b93a1;
8 --accent: #e8a33d;
9 --accent2: #4dd0e1;
10 --good: #6fbf73;
11 --warn: #e57373;
12 font-family: system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif;
13}
15* { box-sizing: border-box; }
17html, body, #root {
18 margin: 0;
19 height: 100%;
20 background: var(--bg);
21 color: var(--text);
22}
24.app {
25 display: flex;
26 flex-direction: column;
27 height: 100vh;
28}
30.topbar {
31 display: flex;
32 align-items: center;
33 gap: 10px;
34 padding: 8px 14px;
35 background: var(--panel);
36 border-bottom: 1px solid var(--border);
37 flex-wrap: wrap;
38}
40.topbar h1 {
41 font-size: 16px;
42 margin: 0 12px 0 0;
43 font-weight: 600;
44 color: var(--accent);
45 white-space: nowrap;
46}
48button {
49 background: var(--panel2);
50 color: var(--text);
51 border: 1px solid var(--border);
52 border-radius: 6px;
53 padding: 6px 14px;
54 font-size: 13px;
55 cursor: pointer;
56}
57button:hover { border-color: var(--muted); }
58button:disabled { opacity: 0.45; cursor: default; }
59button.primary {
60 background: var(--accent);
61 color: #1a1204;
62 border-color: var(--accent);
63 font-weight: 600;
64}
65button.play {
66 background: var(--good);
67 color: #06210a;
68 border-color: var(--good);
69 font-weight: 600;
70}
71button.play.preview {
72 background: transparent;
73 color: var(--accent);
74 border-color: var(--accent);
75}
76button.loop.active {
77 background: var(--accent2);
78 color: #062a2f;
79 border-color: var(--accent2);
80 font-weight: 600;
81}
82button.code { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; }
83button.code.active { border-color: var(--accent2); color: var(--accent2); }
85.status {
86 margin-left: auto;
87 font-size: 12px;
88 color: var(--muted);
89 display: flex;
90 align-items: center;
91 gap: 8px;
92 min-width: 180px;
93 justify-content: flex-end;
94}
96.badge {
97 font-size: 11px;
98 border-radius: 10px;
99 padding: 2px 8px;
100 border: 1px solid var(--border);
101}
102.badge.preview { color: var(--accent); border-color: var(--accent); }
103.badge.full { color: var(--good); border-color: var(--good); }
104.badge.err { color: var(--warn); border-color: var(--warn); }
106.progressbar {
107 width: 90px;
108 height: 6px;
109 background: var(--panel2);
110 border-radius: 3px;
111 overflow: hidden;
112}
113.progressbar > div {
114 height: 100%;
115 background: var(--accent2);
116 transition: width 0.1s linear;
117}
119.main {
120 display: flex;
121 flex: 1;
122 min-height: 0;
123}
125.sidebar {
126 width: 340px;
127 min-width: 340px;
128 overflow-y: auto;
129 background: var(--panel);
130 border-right: 1px solid var(--border);
131 padding: 8px;
132}
134.content {
135 flex: 1;
136 overflow-y: auto;
137 padding: 10px;
138 display: grid;
139 grid-template-columns: 1fr 1fr;
140 gap: 10px;
141 align-content: start;
142}
144.card {
145 background: var(--panel);
146 border: 1px solid var(--border);
147 border-radius: 8px;
148 padding: 8px 10px 10px;
149 min-width: 0;
150}
151.card.wide { grid-column: 1 / -1; }
152.card h2 {
153 font-size: 12px;
154 text-transform: uppercase;
155 letter-spacing: 0.06em;
156 color: var(--muted);
157 margin: 0 0 6px;
158 font-weight: 600;
159}
160.card canvas { display: block; width: 100%; }
162.scene3d { height: 380px; position: relative; }
163.scene3d canvas { height: 100%; border-radius: 6px; }
164.scene-hint {
165 position: absolute;
166 bottom: 10px;
167 right: 14px;
168 font-size: 11px;
169 color: var(--muted);
170 pointer-events: none;
171}
173/* Parameter panel */
174details.group {
175 border: 1px solid var(--border);
176 border-radius: 6px;
177 margin-bottom: 6px;
178 background: var(--panel2);
179}
180details.group summary {
181 cursor: pointer;
182 padding: 6px 10px;
183 font-size: 13px;
184 font-weight: 600;
185 user-select: none;
186}
187details.group[open] summary { border-bottom: 1px solid var(--border); }
188.group-body { padding: 6px 10px 8px; }
190.param-row { margin-bottom: 8px; }
191.param-label {
192 display: flex;
193 justify-content: space-between;
194 font-size: 12px;
195 margin-bottom: 2px;
196 align-items: baseline;
197}
198.param-label .name { color: var(--text); }
199.param-controls { display: flex; gap: 8px; align-items: center; }
200.param-controls input[type='range'] { flex: 1; accent-color: var(--accent2); }
201.param-controls input[type='number'] {
202 width: 88px;
203 background: var(--bg);
204 color: var(--text);
205 border: 1px solid var(--border);
206 border-radius: 4px;
207 padding: 3px 5px;
208 font-size: 12px;
209}
210.param-controls select, .param-controls input[type='checkbox'] {
211 background: var(--bg);
212 color: var(--text);
213 border: 1px solid var(--border);
214 border-radius: 4px;
215 font-size: 12px;
216}
217.param-help { font-size: 11px; color: var(--muted); margin-top: 1px; }
219/* Diagnostics */
220.diag table { border-collapse: collapse; font-size: 12px; width: 100%; }
221.diag td, .diag th {
222 padding: 2px 8px 2px 0;
223 text-align: left;
224 color: var(--text);
225 font-weight: 400;
226}
227.diag th { color: var(--muted); white-space: nowrap; }
228.diag .partials { font-variant-numeric: tabular-nums; }
229.warning { color: var(--warn); font-size: 12px; margin-top: 4px; }
230.cachenote { color: var(--muted); font-size: 11px; margin-top: 6px; }
232.mode-list { display: flex; gap: 6px; flex-wrap: wrap; margin-bottom: 6px; }
233.mode-list button { padding: 3px 10px; font-size: 12px; }
234.mode-list button.active { border-color: var(--accent2); color: var(--accent2); }
236/* Code panel */
237.modal-backdrop {
238 position: fixed;
239 inset: 0;
240 background: rgba(8, 10, 13, 0.72);
241 display: flex;
242 align-items: center;
243 justify-content: center;
244 z-index: 50;
245}
247.code-panel {
248 width: min(1180px, 94vw);
249 height: min(860px, 92vh);
250 background: var(--panel);
251 border: 1px solid var(--border);
252 border-radius: 10px;
253 display: flex;
254 flex-direction: column;
255 overflow: hidden;
256}
258.code-header {
259 display: flex;
260 align-items: center;
261 gap: 10px;
262 padding: 9px 12px;
263 border-bottom: 1px solid var(--border);
264}
265.code-header h2 {
266 margin: 0;
267 font-size: 13px;
268 text-transform: uppercase;
269 letter-spacing: 0.06em;
270 color: var(--accent);
271}
272.code-header button:last-child { margin-left: 0; }
273.code-note {
274 font-size: 11.5px;
275 color: var(--muted);
276 margin-right: auto;
277}
279.code-body { display: flex; flex: 1; min-height: 0; }
281.code-files {
282 width: 236px;
283 min-width: 236px;
284 border-right: 1px solid var(--border);
285 overflow-y: auto;
286 padding: 6px;
287}
288.code-files button {
289 display: flex;
290 align-items: center;
291 justify-content: space-between;
292 gap: 6px;
293 width: 100%;
294 text-align: left;
295 background: transparent;
296 border: 1px solid transparent;
297 border-radius: 5px;
298 padding: 5px 8px;
299 margin-bottom: 2px;
300 font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
301 font-size: 12px;
302}
303.code-files button:hover { background: var(--panel2); }
304.code-files button.active {
305 background: var(--panel2);
306 border-color: var(--accent2);
307 color: var(--accent2);
308}
309.code-files .fname { display: flex; align-items: center; gap: 5px; }
310.code-files .dot {
311 width: 6px;
312 height: 6px;
313 border-radius: 50%;
314 background: var(--accent);
315}
316.code-files .ftag {
317 font-size: 9.5px;
318 color: var(--muted);
319 text-transform: uppercase;
320 letter-spacing: 0.05em;
321 font-family: system-ui, sans-serif;
322}
324.code-main { flex: 1; min-width: 0; display: flex; flex-direction: column; }
325.code-toolbar {
326 display: flex;
327 align-items: center;
328 gap: 10px;
329 padding: 6px 10px;
330 border-bottom: 1px solid var(--border);
331 font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
332 font-size: 12px;
333 color: var(--text);
334}
335.code-hint {
336 font-size: 11px;
337 color: var(--muted);
338 font-family: system-ui, sans-serif;
339}
340.code-editor { flex: 1; min-height: 0; overflow: hidden; }
342.code-error {
343 border-top: 1px solid var(--warn);
344 background: #2a1a1a;
345 color: #ffb4a9;
346 padding: 7px 12px;
347 font-size: 12px;
348 font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
349}
351.error-card { border-color: var(--warn); }
352.error-card h2 { color: var(--warn); }
353.error-card div { font-size: 12px; }
354.error-card strong { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; }
356@media (max-width: 1100px) {
357 .content { grid-template-columns: 1fr; }
358}