@bunnyland/ui-web 0.2.0

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 (57) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +211 -0
  3. package/assets/bunnyland-api.js +345 -0
  4. package/assets/bunnyland-play.js +1223 -0
  5. package/assets/bunnyland-ui.css +1634 -0
  6. package/assets/bunnyland-ui.js +795 -0
  7. package/dist/admin-widgets.d.ts +31 -0
  8. package/dist/admin-widgets.d.ts.map +1 -0
  9. package/dist/admin-widgets.js +100 -0
  10. package/dist/admin-widgets.js.map +1 -0
  11. package/dist/api.d.ts +37 -0
  12. package/dist/api.d.ts.map +1 -0
  13. package/dist/api.js +125 -0
  14. package/dist/api.js.map +1 -0
  15. package/dist/index.d.ts +7 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +7 -0
  18. package/dist/play.d.ts +265 -0
  19. package/dist/play.d.ts.map +1 -0
  20. package/dist/play.js +806 -0
  21. package/dist/play.js.map +1 -0
  22. package/dist/player-widgets.d.ts +11 -0
  23. package/dist/player-widgets.d.ts.map +1 -0
  24. package/dist/player-widgets.js +21 -0
  25. package/dist/player-widgets.js.map +1 -0
  26. package/dist/preact/auth.d.ts +37 -0
  27. package/dist/preact/auth.d.ts.map +1 -0
  28. package/dist/preact/components.d.ts +58 -0
  29. package/dist/preact/components.d.ts.map +1 -0
  30. package/dist/preact/theme.d.ts +16 -0
  31. package/dist/preact/theme.d.ts.map +1 -0
  32. package/dist/preact.d.ts +4 -0
  33. package/dist/preact.d.ts.map +1 -0
  34. package/dist/preact.js +488 -0
  35. package/dist/preact.js.map +1 -0
  36. package/dist/theme.d.ts +31 -0
  37. package/dist/theme.d.ts.map +1 -0
  38. package/dist/theme.js +165 -0
  39. package/dist/theme.js.map +1 -0
  40. package/dist/widgets.d.ts +7 -0
  41. package/dist/widgets.d.ts.map +1 -0
  42. package/dist/widgets.js +31 -0
  43. package/dist/widgets.js.map +1 -0
  44. package/docs/admin/custom-web-themes.md +112 -0
  45. package/docs/developer/design-language.md +116 -0
  46. package/package.json +101 -0
  47. package/src/admin-widgets.ts +189 -0
  48. package/src/api.ts +193 -0
  49. package/src/index.ts +6 -0
  50. package/src/play.ts +1151 -0
  51. package/src/player-widgets.ts +29 -0
  52. package/src/preact/auth.tsx +338 -0
  53. package/src/preact/components.tsx +249 -0
  54. package/src/preact/theme.tsx +72 -0
  55. package/src/preact.ts +3 -0
  56. package/src/theme.ts +225 -0
  57. package/src/widgets.ts +41 -0
@@ -0,0 +1,1634 @@
1
+ :root,
2
+ :root.bl-theme-dark,
3
+ :root.bl-theme-purple-blue-dark,
4
+ :root.bl-theme-purple-blue {
5
+ color-scheme: dark;
6
+
7
+ --bl-font-mono: 'Courier New', monospace;
8
+ --bl-radius-sm: 3px;
9
+ --bl-radius-md: 4px;
10
+ --bl-text-xs: 10px;
11
+ --bl-text-sm: 11px;
12
+ --bl-text-md: 12px;
13
+
14
+ --bl-bg: #1e1e2e;
15
+ --bl-bg-strong: #181825;
16
+ --bl-bg-deep: #11111b;
17
+ --bl-bg-row: #1a1a2a;
18
+ --bl-bg-subtle: #252535;
19
+ --bl-surface: #313244;
20
+ --bl-surface-hover: #45475a;
21
+ --bl-border: #313244;
22
+ --bl-border-muted: #26263a;
23
+ --bl-border-control: #45475a;
24
+ --bl-border-strong: #585b70;
25
+
26
+ --bl-text: #cdd6f4;
27
+ --bl-text-soft: #a6adc8;
28
+ --bl-text-muted: #585b70;
29
+ --bl-text-dim: #6c7086;
30
+ --bl-text-inverse: #ffffff;
31
+ --bl-accent: #89b4fa;
32
+ --bl-accent-strong: #89dceb;
33
+ --bl-secondary: #cba6f7;
34
+ --bl-ok: #a6e3a1;
35
+ --bl-error: #f38ba8;
36
+ --bl-warn: #fab387;
37
+ --bl-info: #74c7ec;
38
+
39
+ --bl-shadow-popover: 0 4px 12px rgba(0, 0, 0, 0.5);
40
+ --bl-shadow-text: 0 1px 2px rgba(0, 0, 0, 0.6);
41
+ --bl-overlay: rgba(17, 17, 27, 0.74);
42
+ --bl-overlay-strong: rgba(17, 17, 27, 0.86);
43
+ --bl-overlay-solid: rgba(30, 30, 46, 0.95);
44
+ --bl-accent-wash: rgba(137, 180, 250, 0.14);
45
+ --bl-accent-wash-strong: rgba(137, 180, 250, 0.28);
46
+ --bl-secondary-wash: rgba(203, 166, 247, 0.28);
47
+ --bl-secondary-wash-strong: rgba(203, 166, 247, 0.4);
48
+ }
49
+
50
+ :root,
51
+ :root.bl-theme-light,
52
+ :root.bl-theme-purple-blue-light,
53
+ :root.bl-theme-purple-blue {
54
+
55
+ --bl-light-bg: #f4f1ea;
56
+ --bl-light-bg-strong: #ebe6dc;
57
+ --bl-light-bg-deep: #ddd6c9;
58
+ --bl-light-bg-row: #e4ded3;
59
+ --bl-light-bg-subtle: #f8f5ee;
60
+ --bl-light-surface: #ffffff;
61
+ --bl-light-surface-hover: #ece7dd;
62
+ --bl-light-border: #c9c0b4;
63
+ --bl-light-border-muted: #ddd4c8;
64
+ --bl-light-border-control: #b8aea2;
65
+ --bl-light-border-strong: #95897d;
66
+
67
+ --bl-light-text: #27231e;
68
+ --bl-light-text-soft: #4f473f;
69
+ --bl-light-text-muted: #82786d;
70
+ --bl-light-text-dim: #6a6158;
71
+ --bl-light-text-inverse: #111111;
72
+ --bl-light-accent: #2f66b1;
73
+ --bl-light-accent-strong: #167287;
74
+ --bl-light-secondary: #7c4eb2;
75
+ --bl-light-ok: #367a38;
76
+ --bl-light-error: #b83c4b;
77
+ --bl-light-warn: #9c5d19;
78
+ --bl-light-info: #26718d;
79
+
80
+ --bl-light-shadow-popover: 0 8px 20px rgba(40, 34, 28, 0.22);
81
+ --bl-light-shadow-text: 0 1px 2px rgba(255, 255, 255, 0.65);
82
+ --bl-light-overlay: rgba(244, 241, 234, 0.78);
83
+ --bl-light-overlay-strong: rgba(248, 245, 238, 0.9);
84
+ --bl-light-overlay-solid: rgba(244, 241, 234, 0.96);
85
+ --bl-light-accent-wash: rgba(47, 102, 177, 0.12);
86
+ --bl-light-accent-wash-strong: rgba(47, 102, 177, 0.24);
87
+ --bl-light-secondary-wash: rgba(124, 78, 178, 0.16);
88
+ --bl-light-secondary-wash-strong: rgba(124, 78, 178, 0.26);
89
+ }
90
+
91
+ :root.bl-theme-anime-dark,
92
+ :root.bl-theme-candy-dark,
93
+ :root.bl-theme-candy {
94
+ color-scheme: dark;
95
+
96
+ --bl-bg: #241626;
97
+ --bl-bg-strong: #1b101f;
98
+ --bl-bg-deep: #130b16;
99
+ --bl-bg-row: #201322;
100
+ --bl-bg-subtle: #2f1e32;
101
+ --bl-surface: #3d2942;
102
+ --bl-surface-hover: #553858;
103
+ --bl-border: #3d2942;
104
+ --bl-border-muted: #2c1c31;
105
+ --bl-border-control: #68445f;
106
+ --bl-border-strong: #876078;
107
+
108
+ --bl-text: #f5d7ea;
109
+ --bl-text-soft: #dcaecf;
110
+ --bl-text-muted: #8f6683;
111
+ --bl-text-dim: #a07791;
112
+ --bl-text-inverse: #ffffff;
113
+ --bl-accent: #ff8fc7;
114
+ --bl-accent-strong: #8ee7f0;
115
+ --bl-secondary: #b99cff;
116
+ --bl-ok: #8ee6b5;
117
+ --bl-error: #ff7e9d;
118
+ --bl-warn: #ffc47a;
119
+ --bl-info: #8ee7f0;
120
+
121
+ --bl-shadow-popover: 0 6px 18px rgba(15, 8, 20, 0.62);
122
+ --bl-shadow-text: 0 1px 2px rgba(0, 0, 0, 0.55);
123
+ --bl-overlay: rgba(27, 16, 31, 0.76);
124
+ --bl-overlay-strong: rgba(36, 22, 38, 0.9);
125
+ --bl-overlay-solid: rgba(36, 22, 38, 0.96);
126
+ --bl-accent-wash: rgba(255, 143, 199, 0.16);
127
+ --bl-accent-wash-strong: rgba(255, 143, 199, 0.3);
128
+ --bl-secondary-wash: rgba(142, 231, 240, 0.16);
129
+ --bl-secondary-wash-strong: rgba(142, 231, 240, 0.28);
130
+ }
131
+
132
+ :root.bl-theme-anime-light,
133
+ :root.bl-theme-candy-light,
134
+ :root.bl-theme-candy {
135
+
136
+ --bl-light-bg: #fff2f8;
137
+ --bl-light-bg-strong: #f9e3f0;
138
+ --bl-light-bg-deep: #efd0e2;
139
+ --bl-light-bg-row: #f3d9e9;
140
+ --bl-light-bg-subtle: #fff8fb;
141
+ --bl-light-surface: #ffffff;
142
+ --bl-light-surface-hover: #f7ddec;
143
+ --bl-light-border: #e4bdd3;
144
+ --bl-light-border-muted: #f0d4e3;
145
+ --bl-light-border-control: #ce9fbb;
146
+ --bl-light-border-strong: #a97895;
147
+
148
+ --bl-light-text: #33212d;
149
+ --bl-light-text-soft: #604657;
150
+ --bl-light-text-muted: #9a748b;
151
+ --bl-light-text-dim: #7d5c71;
152
+ --bl-light-text-inverse: #180d14;
153
+ --bl-light-accent: #c9337f;
154
+ --bl-light-accent-strong: #087e92;
155
+ --bl-light-secondary: #6c50bd;
156
+ --bl-light-ok: #26784c;
157
+ --bl-light-error: #c7355c;
158
+ --bl-light-warn: #a86112;
159
+ --bl-light-info: #087e92;
160
+
161
+ --bl-light-shadow-popover: 0 8px 22px rgba(72, 38, 56, 0.2);
162
+ --bl-light-shadow-text: 0 1px 2px rgba(255, 255, 255, 0.72);
163
+ --bl-light-overlay: rgba(255, 242, 248, 0.78);
164
+ --bl-light-overlay-strong: rgba(255, 248, 251, 0.9);
165
+ --bl-light-overlay-solid: rgba(255, 242, 248, 0.96);
166
+ --bl-light-accent-wash: rgba(201, 51, 127, 0.12);
167
+ --bl-light-accent-wash-strong: rgba(201, 51, 127, 0.22);
168
+ --bl-light-secondary-wash: rgba(8, 126, 146, 0.12);
169
+ --bl-light-secondary-wash-strong: rgba(8, 126, 146, 0.22);
170
+ }
171
+
172
+ :root.bl-theme-earth-dark,
173
+ :root.bl-theme-earth {
174
+ color-scheme: dark;
175
+
176
+ --bl-bg: #17211b;
177
+ --bl-bg-strong: #111912;
178
+ --bl-bg-deep: #0b110d;
179
+ --bl-bg-row: #142018;
180
+ --bl-bg-subtle: #1f2d23;
181
+ --bl-surface: #2d3c31;
182
+ --bl-surface-hover: #3f5243;
183
+ --bl-border: #2d3c31;
184
+ --bl-border-muted: #202e24;
185
+ --bl-border-control: #506457;
186
+ --bl-border-strong: #6e8173;
187
+
188
+ --bl-text: #dce8d9;
189
+ --bl-text-soft: #b8cbb4;
190
+ --bl-text-muted: #71836d;
191
+ --bl-text-dim: #899b84;
192
+ --bl-text-inverse: #ffffff;
193
+ --bl-accent: #92d184;
194
+ --bl-accent-strong: #d6c46f;
195
+ --bl-secondary: #7fb6a4;
196
+ --bl-ok: #9fda8e;
197
+ --bl-error: #e18484;
198
+ --bl-warn: #d6c46f;
199
+ --bl-info: #7fb6a4;
200
+
201
+ --bl-shadow-popover: 0 6px 18px rgba(5, 12, 7, 0.56);
202
+ --bl-shadow-text: 0 1px 2px rgba(0, 0, 0, 0.58);
203
+ --bl-overlay: rgba(17, 25, 18, 0.76);
204
+ --bl-overlay-strong: rgba(23, 33, 27, 0.9);
205
+ --bl-overlay-solid: rgba(23, 33, 27, 0.96);
206
+ --bl-accent-wash: rgba(146, 209, 132, 0.14);
207
+ --bl-accent-wash-strong: rgba(146, 209, 132, 0.27);
208
+ --bl-secondary-wash: rgba(214, 196, 111, 0.14);
209
+ --bl-secondary-wash-strong: rgba(214, 196, 111, 0.26);
210
+ }
211
+
212
+ :root.bl-theme-earth-light,
213
+ :root.bl-theme-earth {
214
+
215
+ --bl-light-bg: #f2f5ed;
216
+ --bl-light-bg-strong: #e5ecdc;
217
+ --bl-light-bg-deep: #d5dfcc;
218
+ --bl-light-bg-row: #dfe8d8;
219
+ --bl-light-bg-subtle: #f8faf4;
220
+ --bl-light-surface: #ffffff;
221
+ --bl-light-surface-hover: #e2eadb;
222
+ --bl-light-border: #bfceb7;
223
+ --bl-light-border-muted: #d4dfcc;
224
+ --bl-light-border-control: #a2b49a;
225
+ --bl-light-border-strong: #7b9275;
226
+
227
+ --bl-light-text: #222b21;
228
+ --bl-light-text-soft: #44513f;
229
+ --bl-light-text-muted: #75836e;
230
+ --bl-light-text-dim: #5f7059;
231
+ --bl-light-text-inverse: #10160f;
232
+ --bl-light-accent: #3f8f4d;
233
+ --bl-light-accent-strong: #85751f;
234
+ --bl-light-secondary: #2f7c73;
235
+ --bl-light-ok: #3f8f4d;
236
+ --bl-light-error: #af4e4e;
237
+ --bl-light-warn: #8f721b;
238
+ --bl-light-info: #2f7c73;
239
+
240
+ --bl-light-shadow-popover: 0 8px 22px rgba(42, 55, 36, 0.22);
241
+ --bl-light-shadow-text: 0 1px 2px rgba(255, 255, 255, 0.7);
242
+ --bl-light-overlay: rgba(242, 245, 237, 0.78);
243
+ --bl-light-overlay-strong: rgba(248, 250, 244, 0.9);
244
+ --bl-light-overlay-solid: rgba(242, 245, 237, 0.96);
245
+ --bl-light-accent-wash: rgba(63, 143, 77, 0.12);
246
+ --bl-light-accent-wash-strong: rgba(63, 143, 77, 0.22);
247
+ --bl-light-secondary-wash: rgba(133, 117, 31, 0.12);
248
+ --bl-light-secondary-wash-strong: rgba(133, 117, 31, 0.22);
249
+ }
250
+
251
+ :root.bl-theme-ocean-dark,
252
+ :root.bl-theme-ocean {
253
+ color-scheme: dark;
254
+
255
+ --bl-bg: #10252b;
256
+ --bl-bg-strong: #0b1c21;
257
+ --bl-bg-deep: #071317;
258
+ --bl-bg-row: #0d2026;
259
+ --bl-bg-subtle: #173139;
260
+ --bl-surface: #21434b;
261
+ --bl-surface-hover: #2e5962;
262
+ --bl-border: #29505a;
263
+ --bl-border-muted: #1b3941;
264
+ --bl-border-control: #3e6870;
265
+ --bl-border-strong: #65868c;
266
+
267
+ --bl-text: #d9f2f2;
268
+ --bl-text-soft: #acd3d2;
269
+ --bl-text-muted: #709699;
270
+ --bl-text-dim: #89afb0;
271
+ --bl-text-inverse: #ffffff;
272
+ --bl-accent: #65d1cb;
273
+ --bl-accent-strong: #79bfff;
274
+ --bl-secondary: #ff9b82;
275
+ --bl-ok: #83d49a;
276
+ --bl-error: #ff8c96;
277
+ --bl-warn: #f4c36b;
278
+ --bl-info: #79bfff;
279
+
280
+ --bl-shadow-popover: 0 6px 18px rgba(2, 12, 15, 0.62);
281
+ --bl-shadow-text: 0 1px 2px rgba(0, 0, 0, 0.58);
282
+ --bl-overlay: rgba(7, 19, 23, 0.76);
283
+ --bl-overlay-strong: rgba(11, 28, 33, 0.9);
284
+ --bl-overlay-solid: rgba(16, 37, 43, 0.96);
285
+ --bl-accent-wash: rgba(101, 209, 203, 0.14);
286
+ --bl-accent-wash-strong: rgba(101, 209, 203, 0.28);
287
+ --bl-secondary-wash: rgba(255, 155, 130, 0.14);
288
+ --bl-secondary-wash-strong: rgba(255, 155, 130, 0.26);
289
+ }
290
+
291
+ :root.bl-theme-ocean-light,
292
+ :root.bl-theme-ocean {
293
+
294
+ --bl-light-bg: #edf8f7;
295
+ --bl-light-bg-strong: #deeeed;
296
+ --bl-light-bg-deep: #cbdedc;
297
+ --bl-light-bg-row: #d6e8e6;
298
+ --bl-light-bg-subtle: #f5fbfa;
299
+ --bl-light-surface: #ffffff;
300
+ --bl-light-surface-hover: #d9ecea;
301
+ --bl-light-border: #b4cfcd;
302
+ --bl-light-border-muted: #cde0de;
303
+ --bl-light-border-control: #91b6b4;
304
+ --bl-light-border-strong: #668f8e;
305
+
306
+ --bl-light-text: #183134;
307
+ --bl-light-text-soft: #3d5c5e;
308
+ --bl-light-text-muted: #708b8b;
309
+ --bl-light-text-dim: #587778;
310
+ --bl-light-text-inverse: #071719;
311
+ --bl-light-accent: #087f83;
312
+ --bl-light-accent-strong: #176ba0;
313
+ --bl-light-secondary: #b84f38;
314
+ --bl-light-ok: #2d7d49;
315
+ --bl-light-error: #b43e4c;
316
+ --bl-light-warn: #94610d;
317
+ --bl-light-info: #176ba0;
318
+
319
+ --bl-light-shadow-popover: 0 8px 22px rgba(25, 62, 64, 0.2);
320
+ --bl-light-shadow-text: 0 1px 2px rgba(255, 255, 255, 0.72);
321
+ --bl-light-overlay: rgba(237, 248, 247, 0.8);
322
+ --bl-light-overlay-strong: rgba(245, 251, 250, 0.92);
323
+ --bl-light-overlay-solid: rgba(237, 248, 247, 0.97);
324
+ --bl-light-accent-wash: rgba(8, 127, 131, 0.12);
325
+ --bl-light-accent-wash-strong: rgba(8, 127, 131, 0.23);
326
+ --bl-light-secondary-wash: rgba(184, 79, 56, 0.12);
327
+ --bl-light-secondary-wash-strong: rgba(184, 79, 56, 0.22);
328
+ }
329
+
330
+ :root.bl-theme-sunset-dark,
331
+ :root.bl-theme-sunset {
332
+ color-scheme: dark;
333
+
334
+ --bl-bg: #291922;
335
+ --bl-bg-strong: #201219;
336
+ --bl-bg-deep: #160c12;
337
+ --bl-bg-row: #25161e;
338
+ --bl-bg-subtle: #35212b;
339
+ --bl-surface: #49303b;
340
+ --bl-surface-hover: #60404d;
341
+ --bl-border: #50333f;
342
+ --bl-border-muted: #39232d;
343
+ --bl-border-control: #714c58;
344
+ --bl-border-strong: #916a73;
345
+
346
+ --bl-text: #f7e1db;
347
+ --bl-text-soft: #ddbcb7;
348
+ --bl-text-muted: #9b7477;
349
+ --bl-text-dim: #b18a89;
350
+ --bl-text-inverse: #ffffff;
351
+ --bl-accent: #ff9a62;
352
+ --bl-accent-strong: #ffd166;
353
+ --bl-secondary: #df86d8;
354
+ --bl-ok: #9bd58c;
355
+ --bl-error: #ff8497;
356
+ --bl-warn: #ffd166;
357
+ --bl-info: #8fc9e8;
358
+
359
+ --bl-shadow-popover: 0 6px 18px rgba(18, 6, 11, 0.62);
360
+ --bl-shadow-text: 0 1px 2px rgba(0, 0, 0, 0.58);
361
+ --bl-overlay: rgba(22, 12, 18, 0.76);
362
+ --bl-overlay-strong: rgba(32, 18, 25, 0.9);
363
+ --bl-overlay-solid: rgba(41, 25, 34, 0.96);
364
+ --bl-accent-wash: rgba(255, 154, 98, 0.15);
365
+ --bl-accent-wash-strong: rgba(255, 154, 98, 0.29);
366
+ --bl-secondary-wash: rgba(223, 134, 216, 0.15);
367
+ --bl-secondary-wash-strong: rgba(223, 134, 216, 0.27);
368
+ }
369
+
370
+ :root.bl-theme-sunset-light,
371
+ :root.bl-theme-sunset {
372
+
373
+ --bl-light-bg: #fff4ec;
374
+ --bl-light-bg-strong: #f5e5db;
375
+ --bl-light-bg-deep: #e8d1c5;
376
+ --bl-light-bg-row: #f0ddd2;
377
+ --bl-light-bg-subtle: #fff9f5;
378
+ --bl-light-surface: #ffffff;
379
+ --bl-light-surface-hover: #f4ddd2;
380
+ --bl-light-border: #dbbdb1;
381
+ --bl-light-border-muted: #ead2c8;
382
+ --bl-light-border-control: #c49c8f;
383
+ --bl-light-border-strong: #9e756c;
384
+
385
+ --bl-light-text: #39241f;
386
+ --bl-light-text-soft: #65483f;
387
+ --bl-light-text-muted: #96756d;
388
+ --bl-light-text-dim: #7d5d55;
389
+ --bl-light-text-inverse: #1c0f0c;
390
+ --bl-light-accent: #ad4f19;
391
+ --bl-light-accent-strong: #8a6200;
392
+ --bl-light-secondary: #964c8c;
393
+ --bl-light-ok: #427a35;
394
+ --bl-light-error: #b43d50;
395
+ --bl-light-warn: #8a6200;
396
+ --bl-light-info: #32718f;
397
+
398
+ --bl-light-shadow-popover: 0 8px 22px rgba(83, 45, 34, 0.2);
399
+ --bl-light-shadow-text: 0 1px 2px rgba(255, 255, 255, 0.72);
400
+ --bl-light-overlay: rgba(255, 244, 236, 0.8);
401
+ --bl-light-overlay-strong: rgba(255, 249, 245, 0.92);
402
+ --bl-light-overlay-solid: rgba(255, 244, 236, 0.97);
403
+ --bl-light-accent-wash: rgba(173, 79, 25, 0.12);
404
+ --bl-light-accent-wash-strong: rgba(173, 79, 25, 0.23);
405
+ --bl-light-secondary-wash: rgba(150, 76, 140, 0.12);
406
+ --bl-light-secondary-wash-strong: rgba(150, 76, 140, 0.22);
407
+ }
408
+
409
+ :root.bl-theme-high-contrast-dark,
410
+ :root.bl-theme-high-contrast {
411
+ color-scheme: dark;
412
+
413
+ --bl-bg: #000000;
414
+ --bl-bg-strong: #090909;
415
+ --bl-bg-deep: #000000;
416
+ --bl-bg-row: #101010;
417
+ --bl-bg-subtle: #181818;
418
+ --bl-surface: #202020;
419
+ --bl-surface-hover: #333333;
420
+ --bl-border: #767676;
421
+ --bl-border-muted: #595959;
422
+ --bl-border-control: #a5a5a5;
423
+ --bl-border-strong: #ffffff;
424
+
425
+ --bl-text: #ffffff;
426
+ --bl-text-soft: #e2e2e2;
427
+ --bl-text-muted: #b8b8b8;
428
+ --bl-text-dim: #cccccc;
429
+ --bl-text-inverse: #000000;
430
+ --bl-accent: #66e6ff;
431
+ --bl-accent-strong: #ffeb66;
432
+ --bl-secondary: #ff9cda;
433
+ --bl-ok: #85f28b;
434
+ --bl-error: #ff8c8c;
435
+ --bl-warn: #ffeb66;
436
+ --bl-info: #66e6ff;
437
+
438
+ --bl-shadow-popover: 0 0 0 2px #ffffff;
439
+ --bl-shadow-text: 0 1px 2px #000000;
440
+ --bl-overlay: rgba(0, 0, 0, 0.82);
441
+ --bl-overlay-strong: rgba(0, 0, 0, 0.94);
442
+ --bl-overlay-solid: #000000;
443
+ --bl-accent-wash: rgba(102, 230, 255, 0.2);
444
+ --bl-accent-wash-strong: rgba(102, 230, 255, 0.38);
445
+ --bl-secondary-wash: rgba(255, 156, 218, 0.2);
446
+ --bl-secondary-wash-strong: rgba(255, 156, 218, 0.38);
447
+ }
448
+
449
+ :root.bl-theme-high-contrast-light,
450
+ :root.bl-theme-high-contrast {
451
+
452
+ --bl-light-bg: #ffffff;
453
+ --bl-light-bg-strong: #f4f4f4;
454
+ --bl-light-bg-deep: #e3e3e3;
455
+ --bl-light-bg-row: #ededed;
456
+ --bl-light-bg-subtle: #fafafa;
457
+ --bl-light-surface: #ffffff;
458
+ --bl-light-surface-hover: #dedede;
459
+ --bl-light-border: #666666;
460
+ --bl-light-border-muted: #8a8a8a;
461
+ --bl-light-border-control: #333333;
462
+ --bl-light-border-strong: #000000;
463
+
464
+ --bl-light-text: #000000;
465
+ --bl-light-text-soft: #242424;
466
+ --bl-light-text-muted: #4f4f4f;
467
+ --bl-light-text-dim: #383838;
468
+ --bl-light-text-inverse: #ffffff;
469
+ --bl-light-accent: #005fcc;
470
+ --bl-light-accent-strong: #00536b;
471
+ --bl-light-secondary: #7a1f78;
472
+ --bl-light-ok: #176b24;
473
+ --bl-light-error: #a8001c;
474
+ --bl-light-warn: #755000;
475
+ --bl-light-info: #00536b;
476
+
477
+ --bl-light-shadow-popover: 0 0 0 2px #000000;
478
+ --bl-light-shadow-text: 0 1px 2px #ffffff;
479
+ --bl-light-overlay: rgba(255, 255, 255, 0.84);
480
+ --bl-light-overlay-strong: rgba(255, 255, 255, 0.95);
481
+ --bl-light-overlay-solid: #ffffff;
482
+ --bl-light-accent-wash: rgba(0, 95, 204, 0.14);
483
+ --bl-light-accent-wash-strong: rgba(0, 95, 204, 0.28);
484
+ --bl-light-secondary-wash: rgba(122, 31, 120, 0.14);
485
+ --bl-light-secondary-wash-strong: rgba(122, 31, 120, 0.26);
486
+ }
487
+
488
+ @media (prefers-color-scheme: light) {
489
+ :root:not([class*="bl-theme-"]):not(.bl-color-scheme-dark),
490
+ :root.bl-theme-purple-blue:not(.bl-color-scheme-dark),
491
+ :root.bl-theme-candy:not(.bl-color-scheme-dark),
492
+ :root.bl-theme-earth:not(.bl-color-scheme-dark),
493
+ :root.bl-theme-ocean:not(.bl-color-scheme-dark),
494
+ :root.bl-theme-sunset:not(.bl-color-scheme-dark),
495
+ :root.bl-theme-high-contrast:not(.bl-color-scheme-dark) {
496
+ color-scheme: light;
497
+
498
+ --bl-bg: var(--bl-light-bg);
499
+ --bl-bg-strong: var(--bl-light-bg-strong);
500
+ --bl-bg-deep: var(--bl-light-bg-deep);
501
+ --bl-bg-row: var(--bl-light-bg-row);
502
+ --bl-bg-subtle: var(--bl-light-bg-subtle);
503
+ --bl-surface: var(--bl-light-surface);
504
+ --bl-surface-hover: var(--bl-light-surface-hover);
505
+ --bl-border: var(--bl-light-border);
506
+ --bl-border-muted: var(--bl-light-border-muted);
507
+ --bl-border-control: var(--bl-light-border-control);
508
+ --bl-border-strong: var(--bl-light-border-strong);
509
+ --bl-text: var(--bl-light-text);
510
+ --bl-text-soft: var(--bl-light-text-soft);
511
+ --bl-text-muted: var(--bl-light-text-muted);
512
+ --bl-text-dim: var(--bl-light-text-dim);
513
+ --bl-text-inverse: var(--bl-light-text-inverse);
514
+ --bl-accent: var(--bl-light-accent);
515
+ --bl-accent-strong: var(--bl-light-accent-strong);
516
+ --bl-secondary: var(--bl-light-secondary);
517
+ --bl-ok: var(--bl-light-ok);
518
+ --bl-error: var(--bl-light-error);
519
+ --bl-warn: var(--bl-light-warn);
520
+ --bl-info: var(--bl-light-info);
521
+ --bl-shadow-popover: var(--bl-light-shadow-popover);
522
+ --bl-shadow-text: var(--bl-light-shadow-text);
523
+ --bl-overlay: var(--bl-light-overlay);
524
+ --bl-overlay-strong: var(--bl-light-overlay-strong);
525
+ --bl-overlay-solid: var(--bl-light-overlay-solid);
526
+ --bl-accent-wash: var(--bl-light-accent-wash);
527
+ --bl-accent-wash-strong: var(--bl-light-accent-wash-strong);
528
+ --bl-secondary-wash: var(--bl-light-secondary-wash);
529
+ --bl-secondary-wash-strong: var(--bl-light-secondary-wash-strong);
530
+ }
531
+ }
532
+
533
+ :root.bl-theme-purple-blue.bl-color-scheme-light,
534
+ :root.bl-theme-candy.bl-color-scheme-light,
535
+ :root.bl-theme-earth.bl-color-scheme-light,
536
+ :root.bl-theme-ocean.bl-color-scheme-light,
537
+ :root.bl-theme-sunset.bl-color-scheme-light,
538
+ :root.bl-theme-high-contrast.bl-color-scheme-light,
539
+ :root.bl-theme-light,
540
+ :root.bl-theme-purple-blue-light,
541
+ :root.bl-theme-anime-light,
542
+ :root.bl-theme-candy-light,
543
+ :root.bl-theme-earth-light,
544
+ :root.bl-theme-ocean-light,
545
+ :root.bl-theme-sunset-light,
546
+ :root.bl-theme-high-contrast-light {
547
+ color-scheme: light;
548
+
549
+ --bl-bg: var(--bl-light-bg);
550
+ --bl-bg-strong: var(--bl-light-bg-strong);
551
+ --bl-bg-deep: var(--bl-light-bg-deep);
552
+ --bl-bg-row: var(--bl-light-bg-row);
553
+ --bl-bg-subtle: var(--bl-light-bg-subtle);
554
+ --bl-surface: var(--bl-light-surface);
555
+ --bl-surface-hover: var(--bl-light-surface-hover);
556
+ --bl-border: var(--bl-light-border);
557
+ --bl-border-muted: var(--bl-light-border-muted);
558
+ --bl-border-control: var(--bl-light-border-control);
559
+ --bl-border-strong: var(--bl-light-border-strong);
560
+ --bl-text: var(--bl-light-text);
561
+ --bl-text-soft: var(--bl-light-text-soft);
562
+ --bl-text-muted: var(--bl-light-text-muted);
563
+ --bl-text-dim: var(--bl-light-text-dim);
564
+ --bl-text-inverse: var(--bl-light-text-inverse);
565
+ --bl-accent: var(--bl-light-accent);
566
+ --bl-accent-strong: var(--bl-light-accent-strong);
567
+ --bl-secondary: var(--bl-light-secondary);
568
+ --bl-ok: var(--bl-light-ok);
569
+ --bl-error: var(--bl-light-error);
570
+ --bl-warn: var(--bl-light-warn);
571
+ --bl-info: var(--bl-light-info);
572
+ --bl-shadow-popover: var(--bl-light-shadow-popover);
573
+ --bl-shadow-text: var(--bl-light-shadow-text);
574
+ --bl-overlay: var(--bl-light-overlay);
575
+ --bl-overlay-strong: var(--bl-light-overlay-strong);
576
+ --bl-overlay-solid: var(--bl-light-overlay-solid);
577
+ --bl-accent-wash: var(--bl-light-accent-wash);
578
+ --bl-accent-wash-strong: var(--bl-light-accent-wash-strong);
579
+ --bl-secondary-wash: var(--bl-light-secondary-wash);
580
+ --bl-secondary-wash-strong: var(--bl-light-secondary-wash-strong);
581
+ }
582
+
583
+ :root.bl-color-scheme-dark {
584
+ color-scheme: dark;
585
+ }
586
+
587
+ :root {
588
+ --bl-action-point-icon: #f59e0b;
589
+ --bl-focus-point-icon: #3b82f6;
590
+ }
591
+
592
+ .bl-point-icon {
593
+ line-height: 1;
594
+ }
595
+
596
+ .bl-point-icon-action {
597
+ color: var(--bl-action-point-icon);
598
+ }
599
+
600
+ .bl-point-icon-focus {
601
+ color: var(--bl-focus-point-icon);
602
+ }
603
+
604
+ * { box-sizing: border-box; margin: 0; padding: 0; }
605
+
606
+ html {
607
+ width: 100%;
608
+ height: 100%;
609
+ }
610
+
611
+ body {
612
+ font-family: var(--bl-font-mono);
613
+ background: var(--bl-bg);
614
+ color: var(--bl-text);
615
+ height: 100vh;
616
+ width: 100%;
617
+ display: flex;
618
+ flex-direction: column;
619
+ overflow: hidden;
620
+ }
621
+
622
+ @supports (height: 100dvh) {
623
+ body { height: 100dvh; }
624
+ }
625
+
626
+ :where(body > #app) {
627
+ display: flex;
628
+ flex: 1 1 auto;
629
+ flex-direction: column;
630
+ width: 100%;
631
+ height: 100%;
632
+ min-width: 0;
633
+ min-height: 0;
634
+ }
635
+
636
+ label { color: var(--bl-text-soft); }
637
+ input, select, textarea, button { font-family: var(--bl-font-mono); }
638
+
639
+ input[type=file],
640
+ input[type=text],
641
+ input[type=number],
642
+ select,
643
+ textarea {
644
+ font-size: var(--bl-text-sm);
645
+ color: var(--bl-text);
646
+ background: var(--bl-surface);
647
+ border: 1px solid var(--bl-border-control);
648
+ border-radius: var(--bl-radius-sm);
649
+ padding: 3px 6px;
650
+ }
651
+
652
+ input[type=file] {
653
+ padding: 2px 6px;
654
+ cursor: pointer;
655
+ }
656
+
657
+ input:focus, select:focus, textarea:focus {
658
+ outline: none;
659
+ border-color: var(--bl-accent);
660
+ }
661
+
662
+ button {
663
+ padding: 3px 10px;
664
+ background: var(--bl-surface);
665
+ border: 1px solid var(--bl-border-control);
666
+ color: var(--bl-text);
667
+ border-radius: var(--bl-radius-sm);
668
+ cursor: pointer;
669
+ font-size: var(--bl-text-sm);
670
+ line-height: 1.2;
671
+ white-space: nowrap;
672
+ }
673
+
674
+ button:hover:not(:disabled) { background: var(--bl-surface-hover); }
675
+ button:disabled { opacity: 0.4; cursor: default; }
676
+
677
+ .bl-button-primary {
678
+ color: var(--bl-text-inverse);
679
+ background: var(--bl-accent);
680
+ border-color: var(--bl-accent);
681
+ }
682
+
683
+ .bl-button-secondary { border-color: var(--bl-secondary); }
684
+ .bl-button-danger { color: var(--bl-error); border-color: var(--bl-error); }
685
+ .bl-button-quiet { padding-inline: 5px; background: transparent; border-color: transparent; }
686
+
687
+ .bl-status { font-size: var(--bl-text-sm); }
688
+ .bl-status-muted { color: var(--bl-text-muted); }
689
+ .bl-status-ok { color: var(--bl-ok); }
690
+ .bl-status-error { color: var(--bl-error); }
691
+ .bl-status-warn { color: var(--bl-warn); }
692
+ .bl-status-info { color: var(--bl-info); }
693
+
694
+ .bl-auth-gate {
695
+ display: flex;
696
+ flex-direction: column;
697
+ align-items: center;
698
+ justify-content: center;
699
+ gap: 10px;
700
+ min-height: 180px;
701
+ padding: 24px;
702
+ text-align: center;
703
+ }
704
+
705
+ .bl-auth-dialog {
706
+ width: min(420px, calc(100vw - 24px));
707
+ border: 1px solid var(--bl-border-control);
708
+ border-radius: var(--bl-radius-md);
709
+ color: var(--bl-text);
710
+ background: var(--bl-bg-strong);
711
+ box-shadow: var(--bl-shadow-popover);
712
+ }
713
+
714
+ .bl-auth-dialog::backdrop { background: var(--bl-overlay); }
715
+
716
+ .bl-auth-form,
717
+ .bl-auth-form label {
718
+ display: grid;
719
+ gap: 6px;
720
+ }
721
+
722
+ .bl-auth-form { gap: 14px; }
723
+ .bl-auth-form h2 { margin: 0; font-size: var(--bl-text-xl); }
724
+ .bl-auth-form input { width: 100%; }
725
+
726
+ .bl-auth-scopes {
727
+ margin: 0;
728
+ color: var(--bl-text-muted);
729
+ font-size: var(--bl-text-xs);
730
+ line-height: 1.45;
731
+ }
732
+
733
+ .bl-auth-actions {
734
+ display: flex;
735
+ justify-content: flex-end;
736
+ gap: 8px;
737
+ }
738
+
739
+ #toolbar {
740
+ display: flex;
741
+ flex-direction: column;
742
+ gap: 5px;
743
+ padding: 5px 12px;
744
+ background: var(--bl-bg-strong);
745
+ border-bottom: 1px solid var(--bl-border);
746
+ flex-shrink: 0;
747
+ font-size: var(--bl-text-md);
748
+ min-width: 0;
749
+ max-width: 100%;
750
+ overflow-x: hidden;
751
+ }
752
+
753
+ .bl-toolbar {
754
+ display: flex;
755
+ flex-direction: column;
756
+ gap: 5px;
757
+ padding: 5px 12px;
758
+ background: var(--bl-bg-strong);
759
+ border-bottom: 1px solid var(--bl-border);
760
+ flex-shrink: 0;
761
+ font-size: var(--bl-text-md);
762
+ min-width: 0;
763
+ max-width: 100%;
764
+ overflow-x: hidden;
765
+ }
766
+
767
+ .toolbar-row {
768
+ display: flex;
769
+ flex-wrap: wrap;
770
+ align-items: center;
771
+ gap: 8px;
772
+ min-height: 24px;
773
+ min-width: 0;
774
+ max-width: 100%;
775
+ }
776
+
777
+ .toolbar-row + .toolbar-row {
778
+ border-top: 1px solid var(--bl-border-muted);
779
+ padding-top: 5px;
780
+ }
781
+
782
+ .toolbar-heading {
783
+ flex-wrap: nowrap;
784
+ }
785
+
786
+ .toolbar-heading .toolbar-brand {
787
+ min-width: 0;
788
+ overflow: hidden;
789
+ text-overflow: ellipsis;
790
+ }
791
+
792
+ .toolbar-heading .client-menu-button {
793
+ flex: 0 0 auto;
794
+ }
795
+
796
+ .toolbar-row > * {
797
+ max-width: 100%;
798
+ }
799
+
800
+ .toolbar-row input[type=file],
801
+ .toolbar-row input[type=text],
802
+ .toolbar-row input[type=number],
803
+ .toolbar-row select,
804
+ .toolbar-row .search-dropdown {
805
+ min-width: 0;
806
+ max-width: 100%;
807
+ }
808
+
809
+ .toolbar-sep { color: var(--bl-border); }
810
+
811
+ .toolbar-brand {
812
+ display: inline-flex;
813
+ align-items: center;
814
+ gap: 6px;
815
+ color: var(--bl-text);
816
+ font-weight: bold;
817
+ white-space: nowrap;
818
+ }
819
+
820
+ .toolbar-brand img {
821
+ width: 20px;
822
+ height: 20px;
823
+ image-rendering: pixelated;
824
+ }
825
+
826
+ .nav-link,
827
+ .toolbar-link {
828
+ color: var(--bl-accent);
829
+ text-decoration: none;
830
+ font-size: var(--bl-text-sm);
831
+ white-space: nowrap;
832
+ }
833
+
834
+ .nav-link:hover,
835
+ .toolbar-link:hover {
836
+ text-decoration: underline;
837
+ }
838
+
839
+ .push { margin-left: auto; }
840
+
841
+ .client-menu-button {
842
+ margin-left: auto;
843
+ }
844
+
845
+ .client-menu-backdrop {
846
+ position: fixed;
847
+ inset: 0;
848
+ z-index: 10000;
849
+ display: flex;
850
+ align-items: flex-start;
851
+ justify-content: center;
852
+ padding: 72px 16px 16px;
853
+ background: var(--bl-overlay);
854
+ }
855
+
856
+ .client-menu-backdrop.hidden {
857
+ display: none;
858
+ }
859
+
860
+ .client-menu-card {
861
+ width: min(560px, 100%);
862
+ max-height: calc(100vh - 96px);
863
+ overflow: hidden;
864
+ display: flex;
865
+ flex-direction: column;
866
+ border: 1px solid var(--bl-border-control);
867
+ border-radius: var(--bl-radius-md);
868
+ background: var(--bl-bg-strong);
869
+ box-shadow: var(--bl-shadow-popover);
870
+ }
871
+
872
+ .client-menu-header {
873
+ display: flex;
874
+ align-items: flex-start;
875
+ justify-content: space-between;
876
+ gap: 12px;
877
+ padding: 12px 14px;
878
+ border-bottom: 1px solid var(--bl-border);
879
+ background: var(--bl-bg);
880
+ }
881
+
882
+ .client-menu-kicker {
883
+ color: var(--bl-accent-strong);
884
+ font-size: var(--bl-text-xs);
885
+ text-transform: uppercase;
886
+ letter-spacing: 0.5px;
887
+ }
888
+
889
+ .client-menu-title {
890
+ margin-top: 3px;
891
+ color: var(--bl-text);
892
+ font-size: 15px;
893
+ font-weight: bold;
894
+ }
895
+
896
+ .client-menu-close {
897
+ padding: 2px 7px;
898
+ line-height: 1.2;
899
+ }
900
+
901
+ .client-menu-list {
902
+ overflow-y: auto;
903
+ padding: 6px;
904
+ }
905
+
906
+ .client-menu-item {
907
+ display: grid;
908
+ grid-template-columns: minmax(0, 1fr) auto;
909
+ gap: 12px;
910
+ align-items: center;
911
+ padding: 10px;
912
+ border: 1px solid transparent;
913
+ border-radius: var(--bl-radius-md);
914
+ color: var(--bl-text);
915
+ text-decoration: none;
916
+ }
917
+
918
+ .client-menu-item:hover {
919
+ background: var(--bl-surface);
920
+ border-color: var(--bl-border-control);
921
+ }
922
+
923
+ .client-menu-item.active {
924
+ background: var(--bl-bg-subtle);
925
+ border-color: var(--bl-accent);
926
+ }
927
+
928
+ .client-menu-item-main {
929
+ min-width: 0;
930
+ display: flex;
931
+ flex-direction: column;
932
+ gap: 4px;
933
+ }
934
+
935
+ .client-menu-item-title {
936
+ color: var(--bl-text);
937
+ font-size: var(--bl-text-md);
938
+ font-weight: bold;
939
+ }
940
+
941
+ .client-menu-admin-badge {
942
+ color: var(--bl-error);
943
+ font-size: 0.7em;
944
+ vertical-align: middle;
945
+ margin-left: 6px;
946
+ }
947
+
948
+ .client-menu-item-desc {
949
+ color: var(--bl-text-soft);
950
+ font-size: var(--bl-text-sm);
951
+ line-height: 1.45;
952
+ }
953
+
954
+ .client-menu-item-label {
955
+ color: var(--bl-text-muted);
956
+ font-size: var(--bl-text-xs);
957
+ white-space: nowrap;
958
+ }
959
+
960
+ .client-menu-footer {
961
+ display: flex;
962
+ flex-wrap: wrap;
963
+ align-items: center;
964
+ justify-content: space-between;
965
+ gap: 8px 12px;
966
+ padding: 10px 14px;
967
+ border-top: 1px solid var(--bl-border);
968
+ background: var(--bl-bg);
969
+ }
970
+
971
+ .client-menu-admin-note {
972
+ flex-basis: 100%;
973
+ margin: 0;
974
+ color: var(--bl-text-muted);
975
+ font-size: var(--bl-text-xs);
976
+ }
977
+
978
+ .client-menu-theme {
979
+ min-width: 0;
980
+ display: flex;
981
+ align-items: center;
982
+ gap: 7px;
983
+ color: var(--bl-text-soft);
984
+ font-size: var(--bl-text-sm);
985
+ }
986
+
987
+ .client-menu-theme select {
988
+ max-width: 230px;
989
+ }
990
+
991
+ .client-menu-discord {
992
+ display: inline-flex;
993
+ align-items: center;
994
+ flex-shrink: 0;
995
+ padding: 7px 11px;
996
+ border: 1px solid var(--bl-border-control);
997
+ border-radius: var(--bl-radius-sm);
998
+ color: var(--bl-text);
999
+ font-size: var(--bl-text-sm);
1000
+ text-decoration: none;
1001
+ }
1002
+
1003
+ .client-menu-discord:hover {
1004
+ background: var(--bl-surface);
1005
+ border-color: var(--bl-accent);
1006
+ }
1007
+
1008
+ /* Help modal (shares the client-menu chrome) */
1009
+ .help-section-title {
1010
+ color: var(--bl-accent-strong);
1011
+ font-size: var(--bl-text-xs);
1012
+ text-transform: uppercase;
1013
+ letter-spacing: 0.5px;
1014
+ padding: 10px 10px 2px;
1015
+ }
1016
+
1017
+ .help-intro {
1018
+ margin: 6px 10px 2px;
1019
+ color: var(--bl-text-soft);
1020
+ font-size: var(--bl-text-sm);
1021
+ line-height: 1.45;
1022
+ }
1023
+
1024
+ #world-info,
1025
+ #status,
1026
+ #save-status,
1027
+ #runtime-status {
1028
+ font-size: var(--bl-text-xs);
1029
+ color: var(--bl-text-muted);
1030
+ }
1031
+
1032
+ #status.ok,
1033
+ #save-status.ok,
1034
+ #api-status.ok,
1035
+ #api-status.live,
1036
+ #problems.ok {
1037
+ color: var(--bl-ok);
1038
+ }
1039
+
1040
+ #status.err,
1041
+ #save-status.err,
1042
+ #api-status.err,
1043
+ #api-status.error {
1044
+ color: var(--bl-error);
1045
+ }
1046
+
1047
+ #api-status {
1048
+ font-size: var(--bl-text-sm);
1049
+ color: var(--bl-text-muted);
1050
+ flex: 1 1 180px;
1051
+ min-width: 0;
1052
+ max-width: 100%;
1053
+ overflow-wrap: anywhere;
1054
+ white-space: normal;
1055
+ }
1056
+
1057
+ .toolbar-row #status,
1058
+ .toolbar-row #save-status,
1059
+ .toolbar-row #runtime-status,
1060
+ .toolbar-row #tempo-status {
1061
+ min-width: 0;
1062
+ max-width: 100%;
1063
+ overflow-wrap: anywhere;
1064
+ white-space: normal;
1065
+ }
1066
+
1067
+ .app-grid,
1068
+ .app-split {
1069
+ flex: 1;
1070
+ min-height: 0;
1071
+ overflow: hidden;
1072
+ }
1073
+
1074
+ .app-grid { display: grid; }
1075
+ .app-split { display: flex; }
1076
+
1077
+ .control-stack {
1078
+ padding: 12px;
1079
+ display: flex;
1080
+ flex-direction: column;
1081
+ gap: 14px;
1082
+ }
1083
+
1084
+ .field-stack {
1085
+ display: flex;
1086
+ flex-direction: column;
1087
+ gap: 6px;
1088
+ }
1089
+
1090
+ .field-row {
1091
+ display: flex;
1092
+ align-items: center;
1093
+ gap: 8px;
1094
+ flex-wrap: wrap;
1095
+ }
1096
+
1097
+ .field-row label {
1098
+ display: inline-flex;
1099
+ align-items: center;
1100
+ gap: 5px;
1101
+ font-size: var(--bl-text-sm);
1102
+ color: var(--bl-text-soft);
1103
+ }
1104
+
1105
+ .hint {
1106
+ color: var(--bl-text-muted);
1107
+ font-size: var(--bl-text-xs);
1108
+ line-height: 1.5;
1109
+ }
1110
+
1111
+ .pill-row {
1112
+ display: flex;
1113
+ flex-wrap: wrap;
1114
+ gap: 5px;
1115
+ }
1116
+
1117
+ .pill {
1118
+ color: var(--bl-text);
1119
+ background: var(--bl-surface);
1120
+ border: 1px solid var(--bl-border-control);
1121
+ border-radius: var(--bl-radius-sm);
1122
+ padding: 1px 6px;
1123
+ font-size: var(--bl-text-xs);
1124
+ white-space: nowrap;
1125
+ }
1126
+
1127
+ .tag-editor {
1128
+ display: flex;
1129
+ flex-direction: column;
1130
+ gap: 6px;
1131
+ }
1132
+
1133
+ .tag-list {
1134
+ display: flex;
1135
+ flex-wrap: wrap;
1136
+ gap: 5px;
1137
+ min-height: 24px;
1138
+ }
1139
+
1140
+ .tag-pill {
1141
+ display: inline-flex;
1142
+ align-items: center;
1143
+ gap: 5px;
1144
+ max-width: 100%;
1145
+ padding: 3px 6px;
1146
+ border: 1px solid var(--bl-border-strong);
1147
+ border-radius: var(--bl-radius-sm);
1148
+ background: var(--bl-surface);
1149
+ color: var(--bl-text);
1150
+ font-size: var(--bl-text-sm);
1151
+ }
1152
+
1153
+ .tag-pill span {
1154
+ overflow-wrap: anywhere;
1155
+ }
1156
+
1157
+ .tag-pill button {
1158
+ padding: 0 4px;
1159
+ border-color: var(--bl-text-dim);
1160
+ line-height: 1.2;
1161
+ }
1162
+
1163
+ .tag-entry {
1164
+ display: flex;
1165
+ gap: 6px;
1166
+ align-items: center;
1167
+ }
1168
+
1169
+ .tag-entry input,
1170
+ .tag-entry select {
1171
+ flex: 1;
1172
+ }
1173
+
1174
+ .metric-grid {
1175
+ display: grid;
1176
+ grid-template-columns: repeat(2, minmax(0, 1fr));
1177
+ gap: 8px;
1178
+ }
1179
+
1180
+ .metric {
1181
+ border: 1px solid var(--bl-border);
1182
+ background: var(--bl-bg);
1183
+ border-radius: var(--bl-radius-md);
1184
+ padding: 8px;
1185
+ min-height: 52px;
1186
+ }
1187
+
1188
+ .metric-value {
1189
+ color: var(--bl-text);
1190
+ font-size: 20px;
1191
+ line-height: 1.1;
1192
+ }
1193
+
1194
+ .metric-label {
1195
+ color: var(--bl-text-muted);
1196
+ font-size: var(--bl-text-xs);
1197
+ margin-top: 4px;
1198
+ }
1199
+
1200
+ .activity-row {
1201
+ display: grid;
1202
+ grid-template-columns: 76px minmax(0, 1fr);
1203
+ gap: 8px;
1204
+ padding: 5px 10px;
1205
+ border-bottom: 1px solid var(--bl-bg-row);
1206
+ font-size: var(--bl-text-sm);
1207
+ line-height: 1.45;
1208
+ }
1209
+
1210
+ .activity-row.kind-error { color: var(--bl-error); }
1211
+ .activity-row.kind-ok { color: var(--bl-ok); }
1212
+
1213
+ .activity-time {
1214
+ color: var(--bl-text-muted);
1215
+ white-space: nowrap;
1216
+ }
1217
+
1218
+ .pane {
1219
+ min-width: 0;
1220
+ min-height: 0;
1221
+ display: flex;
1222
+ flex-direction: column;
1223
+ background: var(--bl-bg-strong);
1224
+ border-right: 1px solid var(--bl-border);
1225
+ overflow: hidden;
1226
+ }
1227
+
1228
+ .pane:last-child { border-right: none; }
1229
+
1230
+ .pane-header {
1231
+ flex-shrink: 0;
1232
+ padding: 7px 10px;
1233
+ border-bottom: 1px solid var(--bl-border);
1234
+ background: var(--bl-bg);
1235
+ display: flex;
1236
+ align-items: center;
1237
+ gap: 8px;
1238
+ min-height: 33px;
1239
+ }
1240
+
1241
+ .pane-title {
1242
+ color: var(--bl-accent-strong);
1243
+ font-weight: bold;
1244
+ font-size: var(--bl-text-md);
1245
+ white-space: nowrap;
1246
+ }
1247
+
1248
+ .pane-tools {
1249
+ display: inline-flex;
1250
+ align-items: center;
1251
+ gap: 6px;
1252
+ margin-left: auto;
1253
+ }
1254
+
1255
+ .pane-count {
1256
+ color: var(--bl-text-muted);
1257
+ font-size: var(--bl-text-xs);
1258
+ white-space: nowrap;
1259
+ }
1260
+
1261
+ .pane-body {
1262
+ flex: 1;
1263
+ min-height: 0;
1264
+ overflow-y: auto;
1265
+ }
1266
+
1267
+ .pane-body::-webkit-scrollbar,
1268
+ .editor-scroll::-webkit-scrollbar,
1269
+ textarea::-webkit-scrollbar {
1270
+ width: 6px;
1271
+ }
1272
+
1273
+ .pane-body::-webkit-scrollbar-track,
1274
+ .editor-scroll::-webkit-scrollbar-track,
1275
+ textarea::-webkit-scrollbar-track {
1276
+ background: var(--bl-bg-strong);
1277
+ }
1278
+
1279
+ .pane-body::-webkit-scrollbar-thumb,
1280
+ .editor-scroll::-webkit-scrollbar-thumb,
1281
+ textarea::-webkit-scrollbar-thumb {
1282
+ background: var(--bl-surface);
1283
+ border-radius: var(--bl-radius-sm);
1284
+ }
1285
+
1286
+ .entity-row {
1287
+ padding: 5px 10px;
1288
+ border-bottom: 1px solid var(--bl-bg-row);
1289
+ cursor: pointer;
1290
+ font-size: var(--bl-text-sm);
1291
+ display: grid;
1292
+ grid-template-columns: 18px minmax(0, 1fr);
1293
+ gap: 5px;
1294
+ }
1295
+
1296
+ .entity-row:hover,
1297
+ .entity-row.active {
1298
+ background: var(--bl-surface);
1299
+ }
1300
+
1301
+ .entity-name {
1302
+ color: var(--bl-text);
1303
+ white-space: nowrap;
1304
+ overflow: hidden;
1305
+ text-overflow: ellipsis;
1306
+ }
1307
+
1308
+ .entity-meta {
1309
+ color: var(--bl-text-dim);
1310
+ margin-top: 2px;
1311
+ white-space: nowrap;
1312
+ overflow: hidden;
1313
+ text-overflow: ellipsis;
1314
+ }
1315
+
1316
+ .editor-scroll {
1317
+ min-width: 0;
1318
+ min-height: 0;
1319
+ overflow-y: auto;
1320
+ padding: 10px;
1321
+ }
1322
+
1323
+ .section,
1324
+ .form-section {
1325
+ border-bottom: 1px solid var(--bl-bg);
1326
+ padding-bottom: 12px;
1327
+ margin-bottom: 12px;
1328
+ }
1329
+
1330
+ .section-title {
1331
+ color: var(--bl-accent-strong);
1332
+ font-size: var(--bl-text-sm);
1333
+ font-weight: bold;
1334
+ margin-bottom: 8px;
1335
+ display: flex;
1336
+ align-items: center;
1337
+ gap: 6px;
1338
+ }
1339
+
1340
+ .section-title button { margin-left: auto; padding: 1px 7px; }
1341
+
1342
+ .form-grid {
1343
+ display: grid;
1344
+ grid-template-columns: repeat(4, minmax(0, 1fr));
1345
+ gap: 8px;
1346
+ }
1347
+
1348
+ .field {
1349
+ min-width: 0;
1350
+ display: flex;
1351
+ flex-direction: column;
1352
+ gap: 3px;
1353
+ font-size: var(--bl-text-xs);
1354
+ color: var(--bl-text-soft);
1355
+ }
1356
+
1357
+ .field.wide { grid-column: span 2; }
1358
+ .field.full { grid-column: 1 / -1; }
1359
+ .field input, .field select, .field textarea { width: 100%; }
1360
+
1361
+ .field-label {
1362
+ display: flex;
1363
+ align-items: center;
1364
+ justify-content: space-between;
1365
+ gap: 8px;
1366
+ }
1367
+
1368
+ .nullable-choice {
1369
+ display: inline-flex;
1370
+ align-items: center;
1371
+ gap: 3px;
1372
+ color: var(--bl-text-muted);
1373
+ font-size: var(--bl-text-xs);
1374
+ font-weight: normal;
1375
+ white-space: nowrap;
1376
+ }
1377
+
1378
+ .nullable-choice input {
1379
+ width: auto;
1380
+ }
1381
+
1382
+ .search-dropdown {
1383
+ position: relative;
1384
+ min-width: 190px;
1385
+ display: inline-block;
1386
+ }
1387
+
1388
+ .search-dropdown::after {
1389
+ content: "";
1390
+ position: absolute;
1391
+ right: 9px;
1392
+ top: 50%;
1393
+ width: 0;
1394
+ height: 0;
1395
+ border-left: 4px solid transparent;
1396
+ border-right: 4px solid transparent;
1397
+ border-top: 5px solid var(--bl-text-muted);
1398
+ pointer-events: none;
1399
+ transform: translateY(-35%);
1400
+ }
1401
+
1402
+ .search-dropdown-input {
1403
+ width: 100%;
1404
+ padding-right: 26px;
1405
+ cursor: pointer;
1406
+ }
1407
+
1408
+ .search-dropdown:focus-within::after {
1409
+ border-top-color: var(--bl-accent);
1410
+ }
1411
+
1412
+ .search-dropdown-menu {
1413
+ position: absolute;
1414
+ top: 100%;
1415
+ left: 0;
1416
+ right: 0;
1417
+ margin-top: 3px;
1418
+ max-height: 240px;
1419
+ overflow-y: auto;
1420
+ background: var(--bl-bg);
1421
+ border: 1px solid var(--bl-border-control);
1422
+ border-radius: var(--bl-radius-md);
1423
+ box-shadow: var(--bl-shadow-popover);
1424
+ z-index: 30;
1425
+ }
1426
+
1427
+ .search-dropdown-menu.hidden {
1428
+ display: none;
1429
+ }
1430
+
1431
+ .search-dropdown-option {
1432
+ display: block;
1433
+ width: 100%;
1434
+ padding: 4px 8px;
1435
+ color: var(--bl-text);
1436
+ background: transparent;
1437
+ cursor: pointer;
1438
+ font-size: var(--bl-text-sm);
1439
+ text-align: left;
1440
+ border: 0;
1441
+ border-bottom: 1px solid var(--bl-bg-strong);
1442
+ border-radius: 0;
1443
+ overflow: hidden;
1444
+ text-overflow: ellipsis;
1445
+ white-space: nowrap;
1446
+ }
1447
+
1448
+ .search-dropdown-option:hover,
1449
+ .search-dropdown-option.active {
1450
+ background: var(--bl-surface);
1451
+ }
1452
+
1453
+ .search-dropdown-empty {
1454
+ padding: 8px;
1455
+ color: var(--bl-text-muted);
1456
+ font-size: var(--bl-text-sm);
1457
+ }
1458
+
1459
+ textarea {
1460
+ resize: vertical;
1461
+ line-height: 1.45;
1462
+ tab-size: 2;
1463
+ }
1464
+
1465
+ .button-row {
1466
+ display: flex;
1467
+ align-items: center;
1468
+ gap: 7px;
1469
+ flex-wrap: wrap;
1470
+ margin-top: 8px;
1471
+ }
1472
+
1473
+ .empty {
1474
+ padding: 18px;
1475
+ text-align: center;
1476
+ color: var(--bl-text-muted);
1477
+ font-size: var(--bl-text-md);
1478
+ line-height: 1.7;
1479
+ }
1480
+
1481
+ .tiny { font-size: var(--bl-text-xs); color: var(--bl-text-muted); }
1482
+ .danger { color: var(--bl-error); }
1483
+ .bad-json { border-color: var(--bl-error) !important; }
1484
+
1485
+ .record-card,
1486
+ .action-card {
1487
+ border: 1px solid var(--bl-border);
1488
+ border-radius: var(--bl-radius-md);
1489
+ margin-bottom: 9px;
1490
+ background: var(--bl-bg);
1491
+ overflow: hidden;
1492
+ }
1493
+
1494
+ .record-head,
1495
+ .action-head {
1496
+ display: flex;
1497
+ align-items: center;
1498
+ gap: 7px;
1499
+ padding: 6px 8px;
1500
+ border-bottom: 1px solid var(--bl-border);
1501
+ color: var(--bl-accent);
1502
+ font-size: var(--bl-text-sm);
1503
+ }
1504
+
1505
+ .record-head button,
1506
+ .action-head button {
1507
+ margin-left: auto;
1508
+ padding: 1px 7px;
1509
+ }
1510
+
1511
+ .record-body,
1512
+ .action-body {
1513
+ padding: 8px;
1514
+ }
1515
+
1516
+ #json-output {
1517
+ flex: 1;
1518
+ min-height: 0;
1519
+ width: 100%;
1520
+ border: none;
1521
+ border-radius: 0;
1522
+ padding: 10px;
1523
+ background: var(--bl-bg-deep);
1524
+ color: var(--bl-text);
1525
+ font-size: var(--bl-text-sm);
1526
+ line-height: 1.45;
1527
+ resize: none;
1528
+ }
1529
+
1530
+ #problems {
1531
+ flex-shrink: 0;
1532
+ border-top: 1px solid var(--bl-border);
1533
+ background: var(--bl-bg-strong);
1534
+ color: var(--bl-error);
1535
+ font-size: var(--bl-text-sm);
1536
+ padding: 7px 10px;
1537
+ max-height: 120px;
1538
+ overflow-y: auto;
1539
+ }
1540
+
1541
+ @media (max-width: 760px), (max-width: 900px) and (max-height: 500px) {
1542
+ #toolbar,
1543
+ .bl-toolbar {
1544
+ max-height: 45dvh;
1545
+ padding: 6px 8px;
1546
+ overflow-y: auto;
1547
+ }
1548
+
1549
+ .toolbar-row {
1550
+ flex-shrink: 0;
1551
+ align-items: center;
1552
+ gap: 6px;
1553
+ }
1554
+
1555
+ .toolbar-row > * {
1556
+ max-width: 100%;
1557
+ }
1558
+
1559
+ .toolbar-row input[type=file],
1560
+ .toolbar-row input[type=text],
1561
+ .toolbar-row input[type=number],
1562
+ .toolbar-row select,
1563
+ .search-dropdown {
1564
+ min-width: 0;
1565
+ max-width: 100%;
1566
+ }
1567
+
1568
+ .toolbar-sep {
1569
+ display: none;
1570
+ }
1571
+
1572
+ .push,
1573
+ .client-menu-button {
1574
+ margin-left: 0;
1575
+ }
1576
+
1577
+ button,
1578
+ input[type=file],
1579
+ input[type=text],
1580
+ input[type=number],
1581
+ select {
1582
+ min-height: 30px;
1583
+ }
1584
+
1585
+ .client-menu-backdrop {
1586
+ padding: 12px;
1587
+ }
1588
+
1589
+ .client-menu-card {
1590
+ max-height: calc(100dvh - 24px);
1591
+ }
1592
+
1593
+ .client-menu-item {
1594
+ grid-template-columns: minmax(0, 1fr);
1595
+ gap: 5px;
1596
+ }
1597
+
1598
+ .client-menu-item-label {
1599
+ white-space: normal;
1600
+ }
1601
+
1602
+ .client-menu-footer,
1603
+ .client-menu-theme {
1604
+ align-items: stretch;
1605
+ }
1606
+
1607
+ .client-menu-theme {
1608
+ flex: 1 1 100%;
1609
+ flex-direction: column;
1610
+ }
1611
+
1612
+ .client-menu-theme select {
1613
+ width: 100%;
1614
+ max-width: none;
1615
+ }
1616
+
1617
+ .pane {
1618
+ border-right: 0;
1619
+ border-bottom: 1px solid var(--bl-border);
1620
+ }
1621
+
1622
+ .pane:last-child {
1623
+ border-bottom: 0;
1624
+ }
1625
+
1626
+ .form-grid,
1627
+ .metric-grid {
1628
+ grid-template-columns: minmax(0, 1fr);
1629
+ }
1630
+
1631
+ .field.wide {
1632
+ grid-column: auto;
1633
+ }
1634
+ }