@floegence/floe-webapp-core 0.36.15 → 0.36.17

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 (31) hide show
  1. package/dist/components/ui/InfiniteCanvas.d.ts +1 -0
  2. package/dist/components/ui/InfiniteCanvas.js +94 -84
  3. package/dist/components/ui/index.d.ts +1 -0
  4. package/dist/components/ui/pointerSession.d.ts +35 -0
  5. package/dist/components/ui/pointerSession.js +85 -0
  6. package/dist/components/workbench/WorkbenchCanvas.d.ts +3 -0
  7. package/dist/components/workbench/WorkbenchCanvas.js +51 -28
  8. package/dist/components/workbench/WorkbenchCanvasField.d.ts +2 -0
  9. package/dist/components/workbench/WorkbenchCanvasField.js +18 -6
  10. package/dist/components/workbench/WorkbenchFilterBar.js +119 -117
  11. package/dist/components/workbench/WorkbenchHud.d.ts +9 -0
  12. package/dist/components/workbench/WorkbenchHud.js +24 -10
  13. package/dist/components/workbench/WorkbenchSurface.js +68 -49
  14. package/dist/components/workbench/WorkbenchThemeSelector.d.ts +6 -0
  15. package/dist/components/workbench/WorkbenchThemeSelector.js +77 -0
  16. package/dist/components/workbench/WorkbenchWidget.d.ts +2 -0
  17. package/dist/components/workbench/WorkbenchWidget.js +211 -167
  18. package/dist/components/workbench/index.d.ts +2 -0
  19. package/dist/components/workbench/types.d.ts +2 -0
  20. package/dist/components/workbench/useWorkbenchModel.d.ts +5 -0
  21. package/dist/components/workbench/useWorkbenchModel.js +83 -77
  22. package/dist/components/workbench/workbenchHelpers.js +53 -50
  23. package/dist/components/workbench/workbenchThemes.d.ts +32 -0
  24. package/dist/components/workbench/workbenchThemes.js +82 -0
  25. package/dist/full.js +71 -69
  26. package/dist/styles.css +1 -1
  27. package/dist/ui.js +26 -24
  28. package/dist/workbench-themes.css +1106 -0
  29. package/dist/workbench.css +492 -96
  30. package/dist/workbench.js +35 -27
  31. package/package.json +1 -1
@@ -1,3 +1,5 @@
1
+ @import './workbench-themes.css';
2
+
1
3
  @layer components {
2
4
  /* ------------------------------------------------------------------ */
3
5
  /* Overlay */
@@ -9,11 +11,7 @@
9
11
  display: flex;
10
12
  align-items: stretch;
11
13
  justify-content: stretch;
12
- background: color-mix(
13
- in srgb,
14
- var(--foreground, #000) 55%,
15
- transparent
16
- );
14
+ background: color-mix(in srgb, var(--foreground, #000) 55%, transparent);
17
15
  backdrop-filter: blur(6px);
18
16
  -webkit-backdrop-filter: blur(6px);
19
17
  }
@@ -54,7 +52,7 @@
54
52
  font-size: 13px;
55
53
  font-weight: 600;
56
54
  letter-spacing: -0.01em;
57
- color: var(--foreground, #111);
55
+ color: var(--wb-text);
58
56
  }
59
57
 
60
58
  .workbench-overlay__header-separator {
@@ -65,7 +63,7 @@
65
63
 
66
64
  .workbench-overlay__header-stat {
67
65
  font-size: 11px;
68
- color: var(--muted-foreground, #888);
66
+ color: var(--wb-text-muted);
69
67
  font-variant-numeric: tabular-nums;
70
68
  }
71
69
 
@@ -86,12 +84,14 @@
86
84
  background: transparent;
87
85
  color: var(--muted-foreground, #888);
88
86
  cursor: pointer;
89
- transition: background-color 140ms ease, color 140ms ease;
87
+ transition:
88
+ background-color 140ms ease,
89
+ color 140ms ease;
90
90
  }
91
91
 
92
92
  .workbench-overlay__close:hover {
93
93
  background: var(--accent, #f5f5f5);
94
- color: var(--foreground, #111);
94
+ color: var(--wb-text);
95
95
  }
96
96
 
97
97
  .workbench-overlay__body {
@@ -109,6 +109,52 @@
109
109
  height: 100%;
110
110
  overflow: hidden;
111
111
  isolation: isolate;
112
+ font-family: var(--wb-font-body);
113
+ --wb-font-body: var(
114
+ --font-sans,
115
+ ui-sans-serif,
116
+ system-ui,
117
+ -apple-system,
118
+ BlinkMacSystemFont,
119
+ 'Segoe UI',
120
+ sans-serif
121
+ );
122
+ --wb-font-display: var(--wb-font-body);
123
+ --wb-font-mono: 'SF Mono', 'Cascadia Code', Menlo, Consolas, ui-monospace, monospace;
124
+ --wb-accent: var(--primary, #3b82f6);
125
+ --wb-accent-strong: color-mix(in srgb, var(--wb-accent) 82%, black);
126
+ --wb-accent-soft: color-mix(in srgb, var(--wb-accent) 12%, transparent);
127
+ --wb-accent-ring: color-mix(in srgb, var(--wb-accent) 28%, transparent);
128
+ --wb-text: var(--foreground, #111);
129
+ --wb-text-muted: var(--muted-foreground, #888);
130
+ --wb-border: var(--border, #e5e5e5);
131
+ --wb-widget-body: color-mix(in srgb, var(--card, #fff) 96%, var(--muted, #f5f5f5) 4%);
132
+ --wb-widget-body-alt: color-mix(in srgb, var(--muted, #f5f5f5) 62%, transparent);
133
+ --wb-row-hover: color-mix(in srgb, var(--accent, #f5f5f5) 80%, transparent);
134
+ --wb-row-active: color-mix(in srgb, var(--wb-accent) 10%, transparent);
135
+ --wb-grid-major: 160px;
136
+ --wb-grid-minor: 40px;
137
+ --wb-grid-minor-offset: 20px;
138
+ --wb-atmosphere: none;
139
+ --wb-atmosphere-opacity: 0;
140
+ --wb-atmosphere-blend: normal;
141
+ --wb-terminal-bg: linear-gradient(180deg, #1d1f2b 0%, #121322 100%);
142
+ --wb-terminal-toolbar: rgba(0, 0, 0, 0.15);
143
+ --wb-terminal-text: #d6dee7;
144
+ --wb-terminal-muted: #7e87a4;
145
+ --wb-terminal-prompt: #6bff8d;
146
+ --wb-chart-cpu: #3b82f6;
147
+ --wb-chart-memory: #f59e0b;
148
+ --wb-chart-disk: #10b981;
149
+ --wb-log-info: #3b82f6;
150
+ --wb-log-warn: #f59e0b;
151
+ --wb-log-error: #ef4444;
152
+ --wb-log-debug: #94a3b8;
153
+ --wb-syntax-keyword: #c678dd;
154
+ --wb-syntax-string: #98c379;
155
+ --wb-syntax-fn: #61afef;
156
+ --wb-syntax-number: #d19a66;
157
+ --wb-syntax-attr: #e5c07b;
112
158
  }
113
159
 
114
160
  .workbench-surface__body {
@@ -126,21 +172,33 @@
126
172
  .workbench-canvas {
127
173
  position: absolute;
128
174
  inset: 0;
175
+ overflow: hidden;
129
176
  background: color-mix(in srgb, var(--background, #fafafa) 96%, var(--muted, #f3f3f3) 4%);
130
177
  }
131
178
 
179
+ .workbench-canvas__atmosphere {
180
+ position: absolute;
181
+ inset: 0;
182
+ pointer-events: none;
183
+ z-index: 7;
184
+ background: var(--wb-atmosphere);
185
+ opacity: var(--wb-atmosphere-opacity);
186
+ mix-blend-mode: var(--wb-atmosphere-blend);
187
+ }
188
+
132
189
  .workbench-canvas.is-locked::after {
133
190
  content: '';
134
191
  position: absolute;
135
192
  inset: 0;
136
193
  pointer-events: none;
137
- box-shadow: inset 0 0 0 2px
138
- color-mix(in srgb, var(--primary, #3b82f6) 28%, transparent);
194
+ box-shadow: inset 0 0 0 2px color-mix(in srgb, var(--primary, #3b82f6) 28%, transparent);
139
195
  z-index: 4;
140
196
  border-radius: inherit;
141
197
  }
142
198
 
143
199
  .workbench-canvas__infinite {
200
+ position: relative;
201
+ z-index: 0;
144
202
  width: 100%;
145
203
  height: 100%;
146
204
  }
@@ -179,8 +237,14 @@
179
237
  color-mix(in srgb, var(--border, #e5e5e5) 70%, transparent) 0.9px,
180
238
  transparent 1px
181
239
  );
182
- background-size: 160px 160px, 160px 160px, 40px 40px;
183
- background-position: 0 0, 0 0, 20px 20px;
240
+ background-size:
241
+ var(--wb-grid-major) var(--wb-grid-major),
242
+ var(--wb-grid-major) var(--wb-grid-major),
243
+ var(--wb-grid-minor) var(--wb-grid-minor);
244
+ background-position:
245
+ 0 0,
246
+ 0 0,
247
+ var(--wb-grid-minor-offset) var(--wb-grid-minor-offset);
184
248
  opacity: 0.78;
185
249
  }
186
250
 
@@ -247,6 +311,8 @@
247
311
  }
248
312
 
249
313
  .workbench-widget__header {
314
+ --wb-window-control-bleed: 6px;
315
+ --wb-window-control-bleed-negative: -6px;
250
316
  display: flex;
251
317
  align-items: center;
252
318
  gap: 6px;
@@ -254,6 +320,104 @@
254
320
  border-bottom: 1px solid color-mix(in srgb, var(--border, #e5e5e5) 70%, transparent);
255
321
  background: color-mix(in srgb, var(--card, #fff) 86%, var(--muted, #f3f3f3) 14%);
256
322
  flex-shrink: 0;
323
+ cursor: move;
324
+ }
325
+
326
+ .workbench-widget.is-dragging .workbench-widget__header {
327
+ cursor: grabbing;
328
+ }
329
+
330
+ .workbench-widget.is-locked .workbench-widget__header {
331
+ cursor: default;
332
+ }
333
+
334
+ .workbench-widget__traffic {
335
+ display: none;
336
+ align-items: center;
337
+ gap: 6px;
338
+ flex-shrink: 0;
339
+ }
340
+
341
+ .workbench-widget__traffic-dot {
342
+ --wb-traffic-glyph: rgba(52, 24, 18, 0.62);
343
+ display: inline-flex;
344
+ align-items: center;
345
+ justify-content: center;
346
+ width: 12px;
347
+ height: 12px;
348
+ padding: 0;
349
+ border: 0;
350
+ border-radius: 999px;
351
+ color: rgba(0, 0, 0, 0.48);
352
+ cursor: pointer;
353
+ box-shadow:
354
+ 0 0 0 0.5px rgba(0, 0, 0, 0.18),
355
+ inset 0 0.5px 0.5px rgba(255, 255, 255, 0.42);
356
+ transition:
357
+ transform 120ms ease,
358
+ box-shadow 120ms ease;
359
+ }
360
+
361
+ .workbench-widget__traffic-icon {
362
+ width: 6.5px;
363
+ height: 6.5px;
364
+ color: var(--wb-traffic-glyph);
365
+ opacity: 0;
366
+ pointer-events: none;
367
+ transition: opacity 120ms ease;
368
+ }
369
+
370
+ .workbench-widget__traffic-dot--max .workbench-widget__traffic-icon {
371
+ width: 5.75px;
372
+ height: 5.75px;
373
+ }
374
+
375
+ .workbench-widget__traffic:hover .workbench-widget__traffic-icon,
376
+ .workbench-widget__traffic-dot:focus-visible .workbench-widget__traffic-icon {
377
+ opacity: 1;
378
+ }
379
+
380
+ .workbench-widget__traffic-dot:hover {
381
+ transform: scale(1.08);
382
+ }
383
+
384
+ .workbench-widget__traffic-dot:focus-visible {
385
+ outline: 2px solid var(--wb-accent);
386
+ outline-offset: 3px;
387
+ }
388
+
389
+ .workbench-widget__traffic-dot:active {
390
+ transform: scale(0.94);
391
+ }
392
+
393
+ .workbench-widget__traffic-dot--close {
394
+ background: #ff5f57;
395
+ }
396
+
397
+ .workbench-widget__traffic-dot--min {
398
+ background: #febc2e;
399
+ }
400
+
401
+ .workbench-widget__traffic-dot--max {
402
+ background: #28c840;
403
+ }
404
+
405
+ .workbench-widget__badge {
406
+ display: none;
407
+ align-items: center;
408
+ justify-content: center;
409
+ min-width: 24px;
410
+ height: 20px;
411
+ padding: 0 6px;
412
+ border-radius: 4px;
413
+ background: var(--wb-accent-soft);
414
+ color: var(--wb-accent);
415
+ font-family: var(--wb-font-mono);
416
+ font-size: 10px;
417
+ font-weight: 700;
418
+ letter-spacing: 0.04em;
419
+ line-height: 1;
420
+ flex-shrink: 0;
257
421
  }
258
422
 
259
423
  .workbench-widget__drag {
@@ -269,7 +433,9 @@
269
433
  /* Four-way arrow signals "you can drag me anywhere". */
270
434
  cursor: move;
271
435
  flex-shrink: 0;
272
- transition: background-color 140ms ease, color 140ms ease;
436
+ transition:
437
+ background-color 140ms ease,
438
+ color 140ms ease;
273
439
  }
274
440
 
275
441
  .workbench-widget__drag:hover {
@@ -296,49 +462,83 @@
296
462
  display: flex;
297
463
  align-items: center;
298
464
  gap: 6px;
465
+ flex: 1;
299
466
  min-width: 0;
300
- color: var(--muted-foreground, #888);
467
+ color: var(--wb-text-muted);
468
+ }
469
+
470
+ .workbench-widget__title-dot {
471
+ display: none;
472
+ width: 7px;
473
+ height: 7px;
474
+ border-radius: 999px;
475
+ background: var(--wb-accent);
476
+ box-shadow: 0 0 0 3px var(--wb-accent-soft);
477
+ flex-shrink: 0;
301
478
  }
302
479
 
303
480
  .workbench-widget__title {
304
481
  font-size: 11px;
305
482
  font-weight: 600;
306
483
  letter-spacing: -0.005em;
307
- color: var(--foreground, #111);
484
+ color: var(--wb-text);
308
485
  white-space: nowrap;
309
486
  overflow: hidden;
310
487
  text-overflow: ellipsis;
311
488
  }
312
489
 
313
- .workbench-widget__close {
490
+ .workbench-widget__window-controls {
314
491
  display: inline-flex;
315
- align-items: center;
316
- justify-content: center;
317
- width: 20px;
318
- height: 20px;
492
+ align-items: stretch;
493
+ gap: 0;
494
+ height: calc(
495
+ 100% + var(--wb-window-control-bleed) + var(--wb-window-control-bleed)
496
+ );
497
+ margin-block: var(--wb-window-control-bleed-negative);
319
498
  margin-left: auto;
320
499
  flex-shrink: 0;
321
- border-radius: 5px;
322
- border: none;
500
+ }
501
+
502
+ .workbench-widget__window-control {
503
+ position: relative;
504
+ display: inline-flex;
505
+ width: 36px;
506
+ padding: 0;
507
+ border: 0;
323
508
  background: transparent;
324
- color: var(--muted-foreground, #888);
509
+ align-items: center;
510
+ justify-content: center;
511
+ color: var(--wb-text-muted);
325
512
  cursor: pointer;
326
- opacity: 0;
327
- pointer-events: none;
328
513
  transition:
329
- background-color 140ms ease,
330
- color 140ms ease,
331
- opacity 140ms ease;
514
+ background-color 120ms ease,
515
+ color 120ms ease;
332
516
  }
333
517
 
334
- .workbench-widget:hover .workbench-widget__close,
335
- .workbench-widget.is-selected .workbench-widget__close {
336
- opacity: 1;
337
- pointer-events: auto;
518
+ .workbench-widget__window-control:hover,
519
+ .workbench-widget__window-control:focus-visible {
520
+ background: var(--wb-row-hover);
521
+ color: var(--wb-text);
522
+ outline: none;
523
+ }
524
+
525
+ .workbench-widget__window-control-icon {
526
+ width: 11px;
527
+ height: 11px;
528
+ pointer-events: none;
529
+ }
530
+
531
+ .workbench-widget__window-control--min .workbench-widget__window-control-icon {
532
+ width: 10px;
533
+ height: 10px;
534
+ }
535
+
536
+ .workbench-widget__window-control--close {
537
+ width: 40px;
338
538
  }
339
539
 
340
- .workbench-widget__close:hover,
341
- .workbench-widget__close:focus-visible {
540
+ .workbench-widget__window-control--close:hover,
541
+ .workbench-widget__window-control--close:focus-visible {
342
542
  background: var(--destructive, #ef4444);
343
543
  color: #fff;
344
544
  outline: none;
@@ -364,7 +564,9 @@
364
564
  padding: 2px;
365
565
  z-index: 2;
366
566
  opacity: 0;
367
- transition: opacity 140ms ease, color 140ms ease;
567
+ transition:
568
+ opacity 140ms ease,
569
+ color 140ms ease;
368
570
  }
369
571
 
370
572
  .workbench-widget:hover .workbench-widget__resize,
@@ -440,7 +642,9 @@
440
642
  color: var(--foreground, #111);
441
643
  font-size: 12px;
442
644
  cursor: pointer;
443
- transition: background-color 120ms ease, color 120ms ease;
645
+ transition:
646
+ background-color 120ms ease,
647
+ color 120ms ease;
444
648
  text-align: left;
445
649
  }
446
650
 
@@ -724,7 +928,9 @@
724
928
  background: transparent;
725
929
  color: var(--muted-foreground, #888);
726
930
  cursor: pointer;
727
- transition: background-color 140ms ease, color 140ms ease;
931
+ transition:
932
+ background-color 140ms ease,
933
+ color 140ms ease;
728
934
  }
729
935
 
730
936
  .workbench-hud__button:hover {
@@ -742,6 +948,13 @@
742
948
  font-variant-numeric: tabular-nums;
743
949
  }
744
950
 
951
+ .workbench-hud__divider {
952
+ width: 1px;
953
+ height: 16px;
954
+ margin: 0 2px;
955
+ background: color-mix(in srgb, var(--border, #e5e5e5) 80%, transparent);
956
+ }
957
+
745
958
  /* ------------------------------------------------------------------ */
746
959
  /* Widget bodies – Terminal */
747
960
  /* ------------------------------------------------------------------ */
@@ -749,9 +962,9 @@
749
962
  display: flex;
750
963
  flex-direction: column;
751
964
  height: 100%;
752
- background: linear-gradient(180deg, #1d1f2b 0%, #121322 100%);
753
- color: #d6dee7;
754
- font-family: 'SF Mono', 'Cascadia Code', 'Menlo', 'Consolas', monospace;
965
+ background: var(--wb-terminal-bg);
966
+ color: var(--wb-terminal-text);
967
+ font-family: var(--wb-font-mono);
755
968
  font-size: 11px;
756
969
  line-height: 1.6;
757
970
  }
@@ -762,7 +975,7 @@
762
975
  gap: 6px;
763
976
  padding: 6px 10px;
764
977
  border-bottom: 1px solid rgba(255, 255, 255, 0.06);
765
- background: rgba(0, 0, 0, 0.15);
978
+ background: var(--wb-terminal-toolbar);
766
979
  }
767
980
 
768
981
  .workbench-widget-terminal__dot {
@@ -772,13 +985,19 @@
772
985
  box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.25);
773
986
  }
774
987
 
775
- .workbench-widget-terminal__dot--red { background: #ff6b6b; }
776
- .workbench-widget-terminal__dot--yellow { background: #ffd93d; }
777
- .workbench-widget-terminal__dot--green { background: #6bff8d; }
988
+ .workbench-widget-terminal__dot--red {
989
+ background: #ff6b6b;
990
+ }
991
+ .workbench-widget-terminal__dot--yellow {
992
+ background: #ffd93d;
993
+ }
994
+ .workbench-widget-terminal__dot--green {
995
+ background: #6bff8d;
996
+ }
778
997
 
779
998
  .workbench-widget-terminal__path {
780
999
  margin-left: 8px;
781
- color: #7e87a4;
1000
+ color: var(--wb-terminal-muted);
782
1001
  font-size: 10px;
783
1002
  }
784
1003
 
@@ -807,11 +1026,11 @@
807
1026
  }
808
1027
 
809
1028
  .workbench-widget-terminal__line--muted {
810
- color: #7e87a4;
1029
+ color: var(--wb-terminal-muted);
811
1030
  }
812
1031
 
813
1032
  .workbench-widget-terminal__prompt {
814
- color: #6bff8d;
1033
+ color: var(--wb-terminal-prompt);
815
1034
  flex-shrink: 0;
816
1035
  }
817
1036
 
@@ -819,15 +1038,21 @@
819
1038
  display: inline-block;
820
1039
  width: 7px;
821
1040
  height: 13px;
822
- background: #d6dee7;
1041
+ background: var(--wb-terminal-text);
823
1042
  margin-left: 2px;
824
1043
  align-self: center;
825
1044
  animation: workbench-blink 1s step-end infinite;
826
1045
  }
827
1046
 
828
1047
  @keyframes workbench-blink {
829
- 0%, 49% { opacity: 1; }
830
- 50%, 100% { opacity: 0; }
1048
+ 0%,
1049
+ 49% {
1050
+ opacity: 1;
1051
+ }
1052
+ 50%,
1053
+ 100% {
1054
+ opacity: 0;
1055
+ }
831
1056
  }
832
1057
 
833
1058
  /* ------------------------------------------------------------------ */
@@ -844,20 +1069,21 @@
844
1069
  display: flex;
845
1070
  align-items: center;
846
1071
  padding: 6px 10px;
847
- border-bottom: 1px solid color-mix(in srgb, var(--border, #e5e5e5) 70%, transparent);
848
- background: color-mix(in srgb, var(--muted, #f5f5f5) 62%, transparent);
1072
+ border-bottom: 1px solid color-mix(in srgb, var(--wb-border) 70%, transparent);
1073
+ background: var(--wb-widget-body-alt);
849
1074
  }
850
1075
 
851
1076
  .workbench-widget-filebrowser__path {
852
1077
  font-size: 10px;
853
- color: var(--muted-foreground, #888);
854
- font-family: 'SF Mono', 'Cascadia Code', 'Menlo', monospace;
1078
+ color: var(--wb-text-muted);
1079
+ font-family: var(--wb-font-mono);
855
1080
  }
856
1081
 
857
1082
  .workbench-widget-filebrowser__tree {
858
1083
  flex: 1;
859
1084
  padding: 4px 0;
860
1085
  overflow: auto;
1086
+ background: var(--wb-widget-body);
861
1087
  }
862
1088
 
863
1089
  .workbench-widget-filebrowser__row {
@@ -868,15 +1094,17 @@
868
1094
  padding: 4px 10px 4px 0;
869
1095
  border: none;
870
1096
  background: transparent;
871
- color: var(--foreground, #111);
1097
+ color: var(--wb-text);
872
1098
  text-align: left;
873
1099
  font-size: 11.5px;
874
1100
  cursor: default;
875
- transition: background-color 100ms ease, color 100ms ease;
1101
+ transition:
1102
+ background-color 100ms ease,
1103
+ color 100ms ease;
876
1104
  }
877
1105
 
878
1106
  .workbench-widget-filebrowser__row:hover {
879
- background: color-mix(in srgb, var(--accent, #f5f5f5) 80%, transparent);
1107
+ background: var(--wb-row-hover);
880
1108
  }
881
1109
 
882
1110
  .workbench-widget-filebrowser__row.is-folder {
@@ -884,7 +1112,7 @@
884
1112
  }
885
1113
 
886
1114
  .workbench-widget-filebrowser__row.is-open {
887
- color: var(--foreground, #111);
1115
+ color: var(--wb-text);
888
1116
  }
889
1117
 
890
1118
  .workbench-widget-filebrowser__chev {
@@ -893,7 +1121,7 @@
893
1121
  justify-content: center;
894
1122
  width: 14px;
895
1123
  height: 14px;
896
- color: var(--muted-foreground, #888);
1124
+ color: var(--wb-text-muted);
897
1125
  transition: transform 150ms cubic-bezier(0.33, 1, 0.68, 1);
898
1126
  }
899
1127
 
@@ -901,11 +1129,11 @@
901
1129
  display: inline-flex;
902
1130
  align-items: center;
903
1131
  justify-content: center;
904
- color: color-mix(in srgb, var(--primary, #3b82f6) 70%, var(--muted-foreground, #888));
1132
+ color: color-mix(in srgb, var(--wb-accent) 70%, var(--wb-text-muted));
905
1133
  }
906
1134
 
907
1135
  .workbench-widget-filebrowser__row:not(.is-folder) .workbench-widget-filebrowser__icon {
908
- color: var(--muted-foreground, #888);
1136
+ color: var(--wb-text-muted);
909
1137
  }
910
1138
 
911
1139
  .workbench-widget-filebrowser__name {
@@ -943,7 +1171,7 @@
943
1171
  .workbench-widget-sysmon__bar {
944
1172
  height: 8px;
945
1173
  border-radius: 4px;
946
- background: color-mix(in srgb, var(--muted, #eee) 70%, transparent);
1174
+ background: color-mix(in srgb, var(--wb-text-muted) 14%, transparent);
947
1175
  overflow: hidden;
948
1176
  }
949
1177
 
@@ -955,16 +1183,16 @@
955
1183
  }
956
1184
 
957
1185
  .workbench-widget-sysmon__fill--cpu {
958
- background: linear-gradient(90deg, #60a5fa, #3b82f6);
959
- color: #3b82f6;
1186
+ background: var(--wb-chart-cpu);
1187
+ color: var(--wb-chart-cpu);
960
1188
  }
961
1189
  .workbench-widget-sysmon__fill--memory {
962
- background: linear-gradient(90deg, #fbbf24, #f59e0b);
963
- color: #f59e0b;
1190
+ background: var(--wb-chart-memory);
1191
+ color: var(--wb-chart-memory);
964
1192
  }
965
1193
  .workbench-widget-sysmon__fill--disk {
966
- background: linear-gradient(90deg, #34d399, #10b981);
967
- color: #10b981;
1194
+ background: var(--wb-chart-disk);
1195
+ color: var(--wb-chart-disk);
968
1196
  }
969
1197
 
970
1198
  .workbench-widget-sysmon__spark {
@@ -972,14 +1200,20 @@
972
1200
  width: 100%;
973
1201
  }
974
1202
 
975
- .workbench-widget-sysmon__spark--cpu { color: #3b82f6; }
976
- .workbench-widget-sysmon__spark--memory { color: #f59e0b; }
977
- .workbench-widget-sysmon__spark--disk { color: #10b981; }
1203
+ .workbench-widget-sysmon__spark--cpu {
1204
+ color: var(--wb-chart-cpu);
1205
+ }
1206
+ .workbench-widget-sysmon__spark--memory {
1207
+ color: var(--wb-chart-memory);
1208
+ }
1209
+ .workbench-widget-sysmon__spark--disk {
1210
+ color: var(--wb-chart-disk);
1211
+ }
978
1212
 
979
1213
  .workbench-widget-sysmon__value {
980
1214
  font-size: 11px;
981
1215
  font-weight: 700;
982
- color: var(--foreground, #111);
1216
+ color: var(--wb-text);
983
1217
  text-align: right;
984
1218
  font-variant-numeric: tabular-nums;
985
1219
  }
@@ -990,10 +1224,10 @@
990
1224
  .workbench-widget-logviewer {
991
1225
  height: 100%;
992
1226
  overflow: hidden;
993
- font-family: 'SF Mono', 'Cascadia Code', 'Menlo', 'Consolas', monospace;
1227
+ font-family: var(--wb-font-mono);
994
1228
  font-size: 10.5px;
995
1229
  line-height: 1.65;
996
- background: color-mix(in srgb, var(--card, #fff) 96%, var(--muted, #f5f5f5) 4%);
1230
+ background: var(--wb-widget-body);
997
1231
  }
998
1232
 
999
1233
  .workbench-widget-logviewer__lines {
@@ -1010,7 +1244,7 @@
1010
1244
  gap: 8px;
1011
1245
  align-items: baseline;
1012
1246
  white-space: nowrap;
1013
- color: var(--foreground, #111);
1247
+ color: var(--wb-text);
1014
1248
  animation: workbench-log-line-in 180ms cubic-bezier(0.33, 1, 0.68, 1);
1015
1249
  }
1016
1250
 
@@ -1031,7 +1265,7 @@
1031
1265
  }
1032
1266
 
1033
1267
  .workbench-widget-logviewer__ts {
1034
- color: var(--muted-foreground, #888);
1268
+ color: var(--wb-text-muted);
1035
1269
  }
1036
1270
 
1037
1271
  .workbench-widget-logviewer__level {
@@ -1039,10 +1273,18 @@
1039
1273
  letter-spacing: 0.02em;
1040
1274
  }
1041
1275
 
1042
- .workbench-widget-logviewer__level--info { color: #3b82f6; }
1043
- .workbench-widget-logviewer__level--warn { color: #f59e0b; }
1044
- .workbench-widget-logviewer__level--error { color: #ef4444; }
1045
- .workbench-widget-logviewer__level--debug { color: #94a3b8; }
1276
+ .workbench-widget-logviewer__level--info {
1277
+ color: var(--wb-log-info);
1278
+ }
1279
+ .workbench-widget-logviewer__level--warn {
1280
+ color: var(--wb-log-warn);
1281
+ }
1282
+ .workbench-widget-logviewer__level--error {
1283
+ color: var(--wb-log-error);
1284
+ }
1285
+ .workbench-widget-logviewer__level--debug {
1286
+ color: var(--wb-log-debug);
1287
+ }
1046
1288
 
1047
1289
  /* ------------------------------------------------------------------ */
1048
1290
  /* Widget bodies – Code Editor */
@@ -1050,10 +1292,10 @@
1050
1292
  .workbench-widget-codeeditor {
1051
1293
  display: flex;
1052
1294
  height: 100%;
1053
- font-family: 'SF Mono', 'Cascadia Code', 'Menlo', 'Consolas', monospace;
1295
+ font-family: var(--wb-font-mono);
1054
1296
  font-size: 11px;
1055
1297
  line-height: 1.7;
1056
- background: color-mix(in srgb, var(--card, #fff) 94%, var(--muted, #f5f5f5) 6%);
1298
+ background: var(--wb-widget-body);
1057
1299
  }
1058
1300
 
1059
1301
  .workbench-widget-codeeditor__gutter {
@@ -1061,15 +1303,15 @@
1061
1303
  flex-direction: column;
1062
1304
  padding: 10px 10px 10px 14px;
1063
1305
  text-align: right;
1064
- color: color-mix(in srgb, var(--muted-foreground, #888) 70%, transparent);
1065
- border-right: 1px solid color-mix(in srgb, var(--border, #e5e5e5) 70%, transparent);
1306
+ color: color-mix(in srgb, var(--wb-text-muted) 70%, transparent);
1307
+ border-right: 1px solid color-mix(in srgb, var(--wb-border) 70%, transparent);
1066
1308
  user-select: none;
1067
1309
  flex-shrink: 0;
1068
1310
  font-variant-numeric: tabular-nums;
1069
1311
  }
1070
1312
 
1071
1313
  .workbench-widget-codeeditor__gutter span.is-active {
1072
- color: var(--primary, #3b82f6);
1314
+ color: var(--wb-accent);
1073
1315
  font-weight: 700;
1074
1316
  }
1075
1317
 
@@ -1077,7 +1319,7 @@
1077
1319
  flex: 1;
1078
1320
  padding: 10px 12px;
1079
1321
  overflow: hidden;
1080
- color: var(--foreground, #111);
1322
+ color: var(--wb-text);
1081
1323
  }
1082
1324
 
1083
1325
  .workbench-widget-codeeditor__line {
@@ -1089,29 +1331,41 @@
1089
1331
  }
1090
1332
 
1091
1333
  .workbench-widget-codeeditor__line.is-active {
1092
- background: color-mix(in srgb, var(--primary, #3b82f6) 8%, transparent);
1334
+ background: var(--wb-row-active);
1093
1335
  }
1094
1336
 
1095
1337
  .workbench-widget-codeeditor__caret {
1096
1338
  display: inline-block;
1097
1339
  width: 1.5px;
1098
1340
  height: 1.1em;
1099
- background: var(--primary, #3b82f6);
1341
+ background: var(--wb-accent);
1100
1342
  margin-left: 2px;
1101
1343
  vertical-align: text-bottom;
1102
1344
  animation: workbench-blink 1s step-end infinite;
1103
1345
  }
1104
1346
 
1105
- .workbench-widget-codeeditor__keyword { color: #c678dd; }
1106
- .workbench-widget-codeeditor__string { color: #98c379; }
1107
- .workbench-widget-codeeditor__fn { color: #61afef; }
1108
- .workbench-widget-codeeditor__number { color: #d19a66; }
1109
- .workbench-widget-codeeditor__attr { color: #e5c07b; }
1347
+ .workbench-widget-codeeditor__keyword {
1348
+ color: var(--wb-syntax-keyword);
1349
+ }
1350
+ .workbench-widget-codeeditor__string {
1351
+ color: var(--wb-syntax-string);
1352
+ }
1353
+ .workbench-widget-codeeditor__fn {
1354
+ color: var(--wb-syntax-fn);
1355
+ }
1356
+ .workbench-widget-codeeditor__number {
1357
+ color: var(--wb-syntax-number);
1358
+ }
1359
+ .workbench-widget-codeeditor__attr {
1360
+ color: var(--wb-syntax-attr);
1361
+ }
1110
1362
  .workbench-widget-codeeditor__comment {
1111
- color: color-mix(in srgb, var(--muted-foreground, #888) 80%, transparent);
1363
+ color: color-mix(in srgb, var(--wb-text-muted) 80%, transparent);
1112
1364
  font-style: italic;
1113
1365
  }
1114
- .workbench-widget-codeeditor__plain { color: inherit; }
1366
+ .workbench-widget-codeeditor__plain {
1367
+ color: inherit;
1368
+ }
1115
1369
 
1116
1370
  /* ------------------------------------------------------------------ */
1117
1371
  /* Dock — drag-to-create ghost */
@@ -1234,4 +1488,146 @@
1234
1488
  .workbench-dock-ghost.is-over-canvas .workbench-dock-ghost__hint {
1235
1489
  color: var(--primary, #3b82f6);
1236
1490
  }
1491
+
1492
+ /* ------------------------------------------------------------------ */
1493
+ /* Theme Selector */
1494
+ /* ------------------------------------------------------------------ */
1495
+ .workbench-theme-selector {
1496
+ display: inline-flex;
1497
+ align-items: center;
1498
+ }
1499
+
1500
+ .workbench-theme-selector__trigger {
1501
+ display: inline-flex;
1502
+ align-items: center;
1503
+ justify-content: center;
1504
+ width: 28px;
1505
+ height: 28px;
1506
+ border-radius: 6px;
1507
+ border: none;
1508
+ background: transparent;
1509
+ color: var(--muted-foreground, #888);
1510
+ cursor: pointer;
1511
+ transition:
1512
+ background-color 140ms ease,
1513
+ color 140ms ease;
1514
+ }
1515
+
1516
+ .workbench-theme-selector__trigger:hover,
1517
+ .workbench-theme-selector__trigger[data-open='true'] {
1518
+ background: var(--accent, #f2f2f2);
1519
+ color: var(--foreground, #111);
1520
+ }
1521
+
1522
+ .workbench-theme-selector__trigger-inner {
1523
+ display: inline-flex;
1524
+ align-items: center;
1525
+ justify-content: center;
1526
+ }
1527
+
1528
+ .workbench-theme-grid {
1529
+ display: flex;
1530
+ flex-direction: column;
1531
+ gap: 8px;
1532
+ min-width: 244px;
1533
+ padding: 4px 2px 2px;
1534
+ }
1535
+
1536
+ .workbench-theme-grid__header {
1537
+ padding: 2px 8px 4px;
1538
+ font-size: 10.5px;
1539
+ font-weight: 600;
1540
+ letter-spacing: 0.08em;
1541
+ text-transform: uppercase;
1542
+ color: var(--muted-foreground, #888);
1543
+ }
1544
+
1545
+ .workbench-theme-grid__items {
1546
+ display: grid;
1547
+ grid-template-columns: 1fr;
1548
+ gap: 4px;
1549
+ }
1550
+
1551
+ .workbench-theme-tile {
1552
+ display: grid;
1553
+ grid-template-columns: 40px 1fr;
1554
+ align-items: center;
1555
+ gap: 10px;
1556
+ padding: 6px 8px;
1557
+ border-radius: 7px;
1558
+ border: 1px solid transparent;
1559
+ background: transparent;
1560
+ text-align: left;
1561
+ cursor: pointer;
1562
+ color: inherit;
1563
+ transition:
1564
+ background-color 140ms ease,
1565
+ border-color 140ms ease;
1566
+ }
1567
+
1568
+ .workbench-theme-tile:hover {
1569
+ background: color-mix(in srgb, var(--accent, #f2f2f2) 80%, transparent);
1570
+ }
1571
+
1572
+ .workbench-theme-tile.is-active {
1573
+ background: color-mix(in srgb, var(--primary, #3b82f6) 12%, transparent);
1574
+ border-color: color-mix(in srgb, var(--primary, #3b82f6) 32%, transparent);
1575
+ }
1576
+
1577
+ .workbench-theme-tile__canvas {
1578
+ position: relative;
1579
+ display: block;
1580
+ width: 40px;
1581
+ height: 28px;
1582
+ border-radius: 5px;
1583
+ overflow: hidden;
1584
+ border: 1px solid color-mix(in srgb, var(--border, #e5e5e5) 70%, transparent);
1585
+ box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.1);
1586
+ }
1587
+
1588
+ .workbench-theme-tile__widget {
1589
+ position: absolute;
1590
+ left: 6px;
1591
+ top: 5px;
1592
+ width: 18px;
1593
+ height: 12px;
1594
+ border-radius: 2.5px;
1595
+ border: 1px solid rgba(0, 0, 0, 0.12);
1596
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08);
1597
+ }
1598
+
1599
+ .workbench-theme-tile__dot {
1600
+ position: absolute;
1601
+ right: 5px;
1602
+ bottom: 5px;
1603
+ width: 6px;
1604
+ height: 6px;
1605
+ border-radius: 50%;
1606
+ box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.28);
1607
+ }
1608
+
1609
+ .workbench-theme-tile__meta {
1610
+ display: flex;
1611
+ flex-direction: column;
1612
+ gap: 1px;
1613
+ min-width: 0;
1614
+ }
1615
+
1616
+ .workbench-theme-tile__label {
1617
+ font-size: 12px;
1618
+ font-weight: 600;
1619
+ color: var(--foreground, #111);
1620
+ letter-spacing: -0.005em;
1621
+ white-space: nowrap;
1622
+ overflow: hidden;
1623
+ text-overflow: ellipsis;
1624
+ }
1625
+
1626
+ .workbench-theme-tile__description {
1627
+ font-size: 10.5px;
1628
+ color: var(--muted-foreground, #888);
1629
+ white-space: nowrap;
1630
+ overflow: hidden;
1631
+ text-overflow: ellipsis;
1632
+ }
1237
1633
  }