@floegence/floe-webapp-core 0.35.59 → 0.36.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/dist/components/deck/DeckCell.js +47 -50
  2. package/dist/components/deck/DeckContextMenu.d.ts +22 -0
  3. package/dist/components/deck/DeckContextMenu.js +73 -0
  4. package/dist/components/deck/DeckGrid.js +147 -104
  5. package/dist/components/deck/DeckTopBar.js +74 -96
  6. package/dist/components/deck/WidgetFrame.d.ts +7 -1
  7. package/dist/components/deck/WidgetFrame.js +60 -52
  8. package/dist/components/deck/index.d.ts +1 -0
  9. package/dist/components/layout/DisplayModePageShell.d.ts +8 -0
  10. package/dist/components/layout/DisplayModePageShell.js +22 -0
  11. package/dist/components/layout/DisplayModeSwitcher.d.ts +7 -0
  12. package/dist/components/layout/DisplayModeSwitcher.js +52 -0
  13. package/dist/components/layout/index.d.ts +2 -0
  14. package/dist/components/ui/InfiniteCanvas.d.ts +2 -0
  15. package/dist/components/ui/InfiniteCanvas.js +43 -37
  16. package/dist/components/workbench/WorkbenchCanvas.d.ts +29 -0
  17. package/dist/components/workbench/WorkbenchCanvas.js +83 -0
  18. package/dist/components/workbench/WorkbenchContextMenu.d.ts +24 -0
  19. package/dist/components/workbench/WorkbenchContextMenu.js +44 -0
  20. package/dist/components/workbench/WorkbenchFilterBar.d.ts +17 -0
  21. package/dist/components/workbench/WorkbenchFilterBar.js +267 -0
  22. package/dist/components/workbench/WorkbenchHud.d.ts +6 -0
  23. package/dist/components/workbench/WorkbenchHud.js +17 -0
  24. package/dist/components/workbench/WorkbenchLockButton.d.ts +6 -0
  25. package/dist/components/workbench/WorkbenchLockButton.js +49 -0
  26. package/dist/components/workbench/WorkbenchOverlay.d.ts +18 -0
  27. package/dist/components/workbench/WorkbenchOverlay.js +107 -0
  28. package/dist/components/workbench/WorkbenchSurface.d.ts +34 -0
  29. package/dist/components/workbench/WorkbenchSurface.js +200 -0
  30. package/dist/components/workbench/WorkbenchWidget.d.ts +26 -0
  31. package/dist/components/workbench/WorkbenchWidget.js +192 -0
  32. package/dist/components/workbench/index.d.ts +7 -0
  33. package/dist/components/workbench/types.d.ts +56 -0
  34. package/dist/components/workbench/types.js +11 -0
  35. package/dist/components/workbench/useWorkbenchModel.d.ts +83 -0
  36. package/dist/components/workbench/useWorkbenchModel.js +284 -0
  37. package/dist/components/workbench/widgets/CodeEditorWidget.d.ts +1 -0
  38. package/dist/components/workbench/widgets/CodeEditorWidget.js +144 -0
  39. package/dist/components/workbench/widgets/FileBrowserWidget.d.ts +1 -0
  40. package/dist/components/workbench/widgets/FileBrowserWidget.js +142 -0
  41. package/dist/components/workbench/widgets/LogViewerWidget.d.ts +1 -0
  42. package/dist/components/workbench/widgets/LogViewerWidget.js +86 -0
  43. package/dist/components/workbench/widgets/SystemMonitorWidget.d.ts +1 -0
  44. package/dist/components/workbench/widgets/SystemMonitorWidget.js +122 -0
  45. package/dist/components/workbench/widgets/TerminalWidget.d.ts +1 -0
  46. package/dist/components/workbench/widgets/TerminalWidget.js +70 -0
  47. package/dist/components/workbench/widgets/widgetRegistry.d.ts +14 -0
  48. package/dist/components/workbench/widgets/widgetRegistry.js +71 -0
  49. package/dist/components/workbench/workbenchHelpers.d.ts +26 -0
  50. package/dist/components/workbench/workbenchHelpers.js +139 -0
  51. package/dist/deck.js +14 -12
  52. package/dist/display-mode.css +70 -0
  53. package/dist/full.js +475 -468
  54. package/dist/hooks/useDeckDrag.js +15 -15
  55. package/dist/layout.js +32 -27
  56. package/dist/styles.css +1 -1
  57. package/dist/tailwind.css +2 -0
  58. package/dist/ui.css +4 -0
  59. package/dist/workbench.css +1220 -0
  60. package/dist/workbench.d.ts +1 -0
  61. package/dist/workbench.js +23 -0
  62. package/package.json +5 -1
@@ -0,0 +1,1220 @@
1
+ @layer components {
2
+ /* ------------------------------------------------------------------ */
3
+ /* Overlay */
4
+ /* ------------------------------------------------------------------ */
5
+ .workbench-overlay {
6
+ position: fixed;
7
+ inset: 0;
8
+ z-index: 9000;
9
+ display: flex;
10
+ align-items: stretch;
11
+ justify-content: stretch;
12
+ background: color-mix(
13
+ in srgb,
14
+ var(--foreground, #000) 55%,
15
+ transparent
16
+ );
17
+ backdrop-filter: blur(6px);
18
+ -webkit-backdrop-filter: blur(6px);
19
+ }
20
+
21
+ .workbench-overlay__frame {
22
+ position: relative;
23
+ flex: 1;
24
+ display: flex;
25
+ flex-direction: column;
26
+ margin: 14px;
27
+ border-radius: 14px;
28
+ background: var(--card, #fff);
29
+ border: 1px solid color-mix(in srgb, var(--border, #e5e5e5) 82%, transparent);
30
+ overflow: hidden;
31
+ box-shadow:
32
+ 0 24px 64px color-mix(in srgb, var(--foreground, #000) 16%, transparent),
33
+ 0 2px 6px color-mix(in srgb, var(--foreground, #000) 6%, transparent);
34
+ }
35
+
36
+ .workbench-overlay__header {
37
+ display: flex;
38
+ align-items: center;
39
+ justify-content: space-between;
40
+ padding: 10px 16px;
41
+ border-bottom: 1px solid color-mix(in srgb, var(--border, #e5e5e5) 82%, transparent);
42
+ flex-shrink: 0;
43
+ background: color-mix(in srgb, var(--card, #fff) 92%, var(--muted, #f9f9f9) 8%);
44
+ z-index: 10;
45
+ }
46
+
47
+ .workbench-overlay__header-brand {
48
+ display: flex;
49
+ align-items: center;
50
+ gap: 10px;
51
+ }
52
+
53
+ .workbench-overlay__header-title {
54
+ font-size: 13px;
55
+ font-weight: 600;
56
+ letter-spacing: -0.01em;
57
+ color: var(--foreground, #111);
58
+ }
59
+
60
+ .workbench-overlay__header-separator {
61
+ width: 1px;
62
+ height: 14px;
63
+ background: var(--border, #e5e5e5);
64
+ }
65
+
66
+ .workbench-overlay__header-stat {
67
+ font-size: 11px;
68
+ color: var(--muted-foreground, #888);
69
+ font-variant-numeric: tabular-nums;
70
+ }
71
+
72
+ .workbench-overlay__header-actions {
73
+ display: flex;
74
+ align-items: center;
75
+ gap: 4px;
76
+ }
77
+
78
+ .workbench-overlay__close {
79
+ display: inline-flex;
80
+ align-items: center;
81
+ justify-content: center;
82
+ width: 28px;
83
+ height: 28px;
84
+ border-radius: 6px;
85
+ border: none;
86
+ background: transparent;
87
+ color: var(--muted-foreground, #888);
88
+ cursor: pointer;
89
+ transition: background-color 140ms ease, color 140ms ease;
90
+ }
91
+
92
+ .workbench-overlay__close:hover {
93
+ background: var(--accent, #f5f5f5);
94
+ color: var(--foreground, #111);
95
+ }
96
+
97
+ .workbench-overlay__body {
98
+ position: relative;
99
+ flex: 1;
100
+ overflow: hidden;
101
+ }
102
+
103
+ /* ------------------------------------------------------------------ */
104
+ /* Surface (page-mode body, no modal chrome) */
105
+ /* ------------------------------------------------------------------ */
106
+ .workbench-surface {
107
+ position: relative;
108
+ width: 100%;
109
+ height: 100%;
110
+ overflow: hidden;
111
+ }
112
+
113
+ .workbench-surface__body {
114
+ position: absolute;
115
+ inset: 0;
116
+ }
117
+
118
+ .workbench-surface--in-overlay {
119
+ border-radius: inherit;
120
+ }
121
+
122
+ /* ------------------------------------------------------------------ */
123
+ /* Canvas */
124
+ /* ------------------------------------------------------------------ */
125
+ .workbench-canvas {
126
+ position: absolute;
127
+ inset: 0;
128
+ background: color-mix(in srgb, var(--background, #fafafa) 96%, var(--muted, #f3f3f3) 4%);
129
+ }
130
+
131
+ .workbench-canvas.is-locked::after {
132
+ content: '';
133
+ position: absolute;
134
+ inset: 0;
135
+ pointer-events: none;
136
+ box-shadow: inset 0 0 0 2px
137
+ color-mix(in srgb, var(--primary, #3b82f6) 28%, transparent);
138
+ z-index: 4;
139
+ border-radius: inherit;
140
+ }
141
+
142
+ .workbench-canvas__infinite {
143
+ width: 100%;
144
+ height: 100%;
145
+ }
146
+
147
+ .workbench-canvas__field {
148
+ position: relative;
149
+ width: 3600px;
150
+ height: 2600px;
151
+ }
152
+
153
+ .workbench-canvas__grid {
154
+ position: absolute;
155
+ inset: 0;
156
+ pointer-events: none;
157
+ background-image:
158
+ linear-gradient(
159
+ to right,
160
+ color-mix(in srgb, var(--border, #e5e5e5) 42%, transparent) 1px,
161
+ transparent 1px
162
+ ),
163
+ linear-gradient(
164
+ to bottom,
165
+ color-mix(in srgb, var(--border, #e5e5e5) 42%, transparent) 1px,
166
+ transparent 1px
167
+ ),
168
+ radial-gradient(
169
+ circle,
170
+ color-mix(in srgb, var(--border, #e5e5e5) 70%, transparent) 0.9px,
171
+ transparent 1px
172
+ );
173
+ background-size: 160px 160px, 160px 160px, 40px 40px;
174
+ background-position: 0 0, 0 0, 20px 20px;
175
+ opacity: 0.78;
176
+ }
177
+
178
+ /* ------------------------------------------------------------------ */
179
+ /* Widget */
180
+ /* ------------------------------------------------------------------ */
181
+ .workbench-widget {
182
+ position: absolute;
183
+ top: 0;
184
+ left: 0;
185
+ display: flex;
186
+ flex-direction: column;
187
+ border-radius: 10px;
188
+ border: 1px solid color-mix(in srgb, var(--border, #e5e5e5) 82%, transparent);
189
+ background: var(--card, #fff);
190
+ box-shadow:
191
+ 0 1px 2px color-mix(in srgb, var(--foreground, #000) 4%, transparent),
192
+ 0 10px 30px -18px color-mix(in srgb, var(--foreground, #000) 22%, transparent);
193
+ overflow: hidden;
194
+ cursor: default;
195
+ will-change: transform;
196
+ /* Transform is intentionally NOT transitioned — drag must be 1:1 with pointer. */
197
+ transition:
198
+ box-shadow 220ms cubic-bezier(0.33, 1, 0.68, 1),
199
+ opacity 220ms ease,
200
+ border-color 180ms ease;
201
+ }
202
+
203
+ .workbench-widget.is-dragging {
204
+ transition: none;
205
+ }
206
+
207
+ .workbench-widget:hover {
208
+ box-shadow:
209
+ 0 1px 2px color-mix(in srgb, var(--foreground, #000) 5%, transparent),
210
+ 0 18px 40px -18px color-mix(in srgb, var(--foreground, #000) 26%, transparent);
211
+ }
212
+
213
+ .workbench-widget.is-selected {
214
+ border-color: color-mix(in srgb, var(--primary, #3b82f6) 55%, transparent);
215
+ box-shadow:
216
+ 0 0 0 2px color-mix(in srgb, var(--primary, #3b82f6) 28%, transparent),
217
+ 0 18px 42px -14px color-mix(in srgb, var(--primary, #3b82f6) 22%, transparent);
218
+ }
219
+
220
+ .workbench-widget.is-dragging {
221
+ box-shadow:
222
+ 0 0 0 2px color-mix(in srgb, var(--primary, #3b82f6) 40%, transparent),
223
+ 0 28px 60px -12px color-mix(in srgb, var(--foreground, #000) 30%, transparent);
224
+ cursor: grabbing;
225
+ }
226
+
227
+ .workbench-widget.is-filtered-out {
228
+ opacity: 0;
229
+ pointer-events: none;
230
+ }
231
+
232
+ .workbench-widget__header {
233
+ display: flex;
234
+ align-items: center;
235
+ gap: 6px;
236
+ padding: 6px 10px 6px 6px;
237
+ border-bottom: 1px solid color-mix(in srgb, var(--border, #e5e5e5) 70%, transparent);
238
+ background: color-mix(in srgb, var(--card, #fff) 86%, var(--muted, #f3f3f3) 14%);
239
+ flex-shrink: 0;
240
+ }
241
+
242
+ .workbench-widget__drag {
243
+ display: inline-flex;
244
+ align-items: center;
245
+ justify-content: center;
246
+ width: 22px;
247
+ height: 22px;
248
+ border-radius: 5px;
249
+ border: none;
250
+ background: transparent;
251
+ color: var(--muted-foreground, #888);
252
+ /* Four-way arrow signals "you can drag me anywhere". */
253
+ cursor: move;
254
+ flex-shrink: 0;
255
+ transition: background-color 140ms ease, color 140ms ease;
256
+ }
257
+
258
+ .workbench-widget__drag:hover {
259
+ background: var(--accent, #eee);
260
+ color: var(--foreground, #111);
261
+ }
262
+
263
+ .workbench-widget__drag:active {
264
+ cursor: grabbing;
265
+ }
266
+
267
+ .workbench-widget.is-dragging,
268
+ .workbench-widget.is-dragging .workbench-widget__drag {
269
+ cursor: grabbing;
270
+ }
271
+
272
+ .workbench-widget.is-resizing {
273
+ box-shadow:
274
+ 0 0 0 2px color-mix(in srgb, var(--primary, #3b82f6) 40%, transparent),
275
+ 0 18px 42px -14px color-mix(in srgb, var(--primary, #3b82f6) 22%, transparent);
276
+ }
277
+
278
+ .workbench-widget__title-area {
279
+ display: flex;
280
+ align-items: center;
281
+ gap: 6px;
282
+ min-width: 0;
283
+ color: var(--muted-foreground, #888);
284
+ }
285
+
286
+ .workbench-widget__title {
287
+ font-size: 11px;
288
+ font-weight: 600;
289
+ letter-spacing: -0.005em;
290
+ color: var(--foreground, #111);
291
+ white-space: nowrap;
292
+ overflow: hidden;
293
+ text-overflow: ellipsis;
294
+ }
295
+
296
+ .workbench-widget__close {
297
+ display: inline-flex;
298
+ align-items: center;
299
+ justify-content: center;
300
+ width: 20px;
301
+ height: 20px;
302
+ margin-left: auto;
303
+ flex-shrink: 0;
304
+ border-radius: 5px;
305
+ border: none;
306
+ background: transparent;
307
+ color: var(--muted-foreground, #888);
308
+ cursor: pointer;
309
+ opacity: 0;
310
+ pointer-events: none;
311
+ transition:
312
+ background-color 140ms ease,
313
+ color 140ms ease,
314
+ opacity 140ms ease;
315
+ }
316
+
317
+ .workbench-widget:hover .workbench-widget__close,
318
+ .workbench-widget.is-selected .workbench-widget__close {
319
+ opacity: 1;
320
+ pointer-events: auto;
321
+ }
322
+
323
+ .workbench-widget__close:hover,
324
+ .workbench-widget__close:focus-visible {
325
+ background: var(--destructive, #ef4444);
326
+ color: #fff;
327
+ outline: none;
328
+ }
329
+
330
+ .workbench-widget__body {
331
+ flex: 1;
332
+ overflow: hidden;
333
+ position: relative;
334
+ }
335
+
336
+ .workbench-widget__resize {
337
+ position: absolute;
338
+ right: 0;
339
+ bottom: 0;
340
+ width: 18px;
341
+ height: 18px;
342
+ cursor: nwse-resize;
343
+ color: color-mix(in srgb, var(--muted-foreground, #888) 60%, transparent);
344
+ display: flex;
345
+ align-items: flex-end;
346
+ justify-content: flex-end;
347
+ padding: 2px;
348
+ z-index: 2;
349
+ opacity: 0;
350
+ transition: opacity 140ms ease, color 140ms ease;
351
+ }
352
+
353
+ .workbench-widget:hover .workbench-widget__resize,
354
+ .workbench-widget.is-selected .workbench-widget__resize,
355
+ .workbench-widget.is-resizing .workbench-widget__resize {
356
+ opacity: 1;
357
+ }
358
+
359
+ .workbench-widget__resize:hover {
360
+ color: var(--primary, #3b82f6);
361
+ }
362
+
363
+ .workbench-widget__resize-glyph {
364
+ width: 12px;
365
+ height: 12px;
366
+ stroke: currentColor;
367
+ stroke-width: 1.3;
368
+ fill: none;
369
+ stroke-linecap: round;
370
+ }
371
+
372
+ /* ------------------------------------------------------------------ */
373
+ /* Context Menu */
374
+ /* ------------------------------------------------------------------ */
375
+ .workbench-menu-backdrop {
376
+ position: fixed;
377
+ inset: 0;
378
+ z-index: 9010;
379
+ }
380
+
381
+ .workbench-context-menu {
382
+ position: fixed;
383
+ z-index: 9011;
384
+ min-width: 190px;
385
+ padding: 4px;
386
+ border-radius: 10px;
387
+ border: 1px solid color-mix(in srgb, var(--border, #e5e5e5) 70%, transparent);
388
+ background: var(--popover, var(--card, #fff));
389
+ box-shadow:
390
+ 0 10px 32px color-mix(in srgb, var(--foreground, #000) 18%, transparent),
391
+ 0 1px 0 color-mix(in srgb, white 50%, transparent) inset;
392
+ backdrop-filter: blur(10px);
393
+ -webkit-backdrop-filter: blur(10px);
394
+ animation: workbench-menu-in 140ms cubic-bezier(0.33, 1, 0.68, 1);
395
+ }
396
+
397
+ @keyframes workbench-menu-in {
398
+ from {
399
+ opacity: 0;
400
+ transform: translateY(-4px) scale(0.98);
401
+ }
402
+ to {
403
+ opacity: 1;
404
+ transform: translateY(0) scale(1);
405
+ }
406
+ }
407
+
408
+ .workbench-context-menu__separator {
409
+ height: 1px;
410
+ margin: 4px 6px;
411
+ background: var(--border, #e5e5e5);
412
+ }
413
+
414
+ .workbench-context-menu__item {
415
+ display: flex;
416
+ align-items: center;
417
+ gap: 8px;
418
+ width: 100%;
419
+ padding: 7px 10px;
420
+ border-radius: 6px;
421
+ border: none;
422
+ background: transparent;
423
+ color: var(--foreground, #111);
424
+ font-size: 12px;
425
+ cursor: pointer;
426
+ transition: background-color 120ms ease, color 120ms ease;
427
+ text-align: left;
428
+ }
429
+
430
+ .workbench-context-menu__item:hover {
431
+ background: var(--accent, #f2f2f2);
432
+ }
433
+
434
+ .workbench-context-menu__item.is-destructive {
435
+ color: var(--destructive, #ef4444);
436
+ }
437
+
438
+ .workbench-context-menu__item.is-destructive:hover {
439
+ background: color-mix(in srgb, var(--destructive, #ef4444) 10%, transparent);
440
+ }
441
+
442
+ .workbench-context-menu__label {
443
+ flex: 1;
444
+ }
445
+
446
+ /* ------------------------------------------------------------------ */
447
+ /* Dock (filter bar) */
448
+ /* ------------------------------------------------------------------ */
449
+ .workbench-dock {
450
+ position: absolute;
451
+ bottom: 14px;
452
+ left: 50%;
453
+ transform: translateX(-50%);
454
+ display: flex;
455
+ align-items: flex-end;
456
+ gap: 10px;
457
+ padding: 8px 14px;
458
+ border-radius: 16px;
459
+ border: 1px solid color-mix(in srgb, var(--border, #e5e5e5) 82%, transparent);
460
+ background: color-mix(in srgb, var(--card, #fff) 72%, transparent);
461
+ box-shadow:
462
+ 0 18px 48px -12px color-mix(in srgb, var(--foreground, #000) 22%, transparent),
463
+ 0 1px 0 color-mix(in srgb, white 60%, transparent) inset;
464
+ backdrop-filter: blur(18px) saturate(180%);
465
+ -webkit-backdrop-filter: blur(18px) saturate(180%);
466
+ z-index: 8;
467
+ }
468
+
469
+ .workbench-dock__item {
470
+ position: relative;
471
+ display: inline-flex;
472
+ flex-direction: column;
473
+ align-items: center;
474
+ justify-content: flex-end;
475
+ padding: 0;
476
+ border: none;
477
+ background: transparent;
478
+ cursor: pointer;
479
+ color: var(--muted-foreground, #888);
480
+ transform-origin: center bottom;
481
+ /* Keep each slot at a fixed footprint so neighbor translateX moves the
482
+ visual tile without reflowing the row. */
483
+ width: 36px;
484
+ height: 36px;
485
+ }
486
+
487
+ .workbench-dock__tile {
488
+ display: inline-flex;
489
+ align-items: center;
490
+ justify-content: center;
491
+ width: 36px;
492
+ height: 36px;
493
+ border-radius: 10px;
494
+ background: color-mix(in srgb, var(--muted, #f1f1f1) 62%, transparent);
495
+ border: 1px solid color-mix(in srgb, var(--border, #e5e5e5) 50%, transparent);
496
+ color: var(--muted-foreground, #888);
497
+ transform-origin: center bottom;
498
+ will-change: transform;
499
+ /* Motion component drives transform; only animate visual chrome here. */
500
+ transition:
501
+ background-color 160ms ease,
502
+ color 160ms ease,
503
+ border-color 160ms ease,
504
+ box-shadow 160ms ease;
505
+ }
506
+
507
+ .workbench-dock__icon {
508
+ width: 18px;
509
+ height: 18px;
510
+ }
511
+
512
+ .workbench-dock__item.is-active .workbench-dock__tile {
513
+ background: linear-gradient(
514
+ 135deg,
515
+ color-mix(in srgb, var(--primary, #3b82f6) 90%, white),
516
+ var(--primary, #3b82f6)
517
+ );
518
+ color: var(--primary-foreground, #fff);
519
+ border-color: color-mix(in srgb, var(--primary, #3b82f6) 80%, transparent);
520
+ box-shadow:
521
+ 0 6px 14px -4px color-mix(in srgb, var(--primary, #3b82f6) 52%, transparent),
522
+ 0 1px 0 color-mix(in srgb, white 30%, transparent) inset;
523
+ }
524
+
525
+ .workbench-dock__item.is-hovered .workbench-dock__tile {
526
+ box-shadow:
527
+ 0 10px 22px -8px color-mix(in srgb, var(--foreground, #000) 22%, transparent),
528
+ 0 1px 0 color-mix(in srgb, white 50%, transparent) inset;
529
+ }
530
+
531
+ .workbench-dock__divider {
532
+ width: 1px;
533
+ height: 24px;
534
+ align-self: center;
535
+ background: color-mix(in srgb, var(--border, #e5e5e5) 75%, transparent);
536
+ margin: 0 2px;
537
+ }
538
+
539
+ .workbench-dock__tooltip {
540
+ position: absolute;
541
+ bottom: 100%;
542
+ margin-bottom: 10px;
543
+ padding: 3px 8px;
544
+ border-radius: 6px;
545
+ background: var(--foreground, #111);
546
+ color: var(--background, #fff);
547
+ font-size: 10px;
548
+ font-weight: 500;
549
+ white-space: nowrap;
550
+ pointer-events: none;
551
+ opacity: 0;
552
+ }
553
+
554
+ /* ------------------------------------------------------------------ */
555
+ /* Lock Button */
556
+ /* ------------------------------------------------------------------ */
557
+ .workbench-lock-button {
558
+ position: absolute;
559
+ bottom: 14px;
560
+ left: 14px;
561
+ display: inline-flex;
562
+ align-items: center;
563
+ gap: 6px;
564
+ padding: 0 10px 0 8px;
565
+ height: 36px;
566
+ border-radius: 10px;
567
+ border: 1px solid color-mix(in srgb, var(--border, #e5e5e5) 80%, transparent);
568
+ background: color-mix(in srgb, var(--card, #fff) 78%, transparent);
569
+ color: var(--muted-foreground, #888);
570
+ cursor: pointer;
571
+ box-shadow:
572
+ 0 6px 20px -10px color-mix(in srgb, var(--foreground, #000) 22%, transparent),
573
+ 0 1px 0 color-mix(in srgb, white 40%, transparent) inset;
574
+ transition:
575
+ background-color 160ms ease,
576
+ color 160ms ease,
577
+ border-color 160ms ease,
578
+ box-shadow 160ms ease;
579
+ backdrop-filter: blur(14px) saturate(160%);
580
+ -webkit-backdrop-filter: blur(14px) saturate(160%);
581
+ z-index: 8;
582
+ }
583
+
584
+ .workbench-lock-button:hover {
585
+ background: var(--card, #fff);
586
+ color: var(--foreground, #111);
587
+ }
588
+
589
+ .workbench-lock-button.is-locked {
590
+ background: linear-gradient(
591
+ 135deg,
592
+ color-mix(in srgb, var(--primary, #3b82f6) 90%, white),
593
+ var(--primary, #3b82f6)
594
+ );
595
+ color: var(--primary-foreground, #fff);
596
+ border-color: color-mix(in srgb, var(--primary, #3b82f6) 70%, transparent);
597
+ box-shadow:
598
+ 0 8px 24px -6px color-mix(in srgb, var(--primary, #3b82f6) 45%, transparent),
599
+ 0 1px 0 color-mix(in srgb, white 30%, transparent) inset;
600
+ }
601
+
602
+ .workbench-lock-button__icon {
603
+ display: inline-flex;
604
+ align-items: center;
605
+ justify-content: center;
606
+ width: 22px;
607
+ height: 22px;
608
+ position: relative;
609
+ }
610
+
611
+ .workbench-lock-button__icon-swap {
612
+ display: inline-flex;
613
+ align-items: center;
614
+ justify-content: center;
615
+ }
616
+
617
+ .workbench-lock-button__kbd {
618
+ font-size: 10px;
619
+ font-weight: 600;
620
+ letter-spacing: 0.04em;
621
+ padding: 2px 5px;
622
+ border-radius: 4px;
623
+ background: color-mix(in srgb, currentColor 12%, transparent);
624
+ border: 1px solid color-mix(in srgb, currentColor 22%, transparent);
625
+ line-height: 1.1;
626
+ }
627
+
628
+ /* ------------------------------------------------------------------ */
629
+ /* Mobile-responsive positioning */
630
+ /* */
631
+ /* On narrow viewports the dock takes ~80% of the width and sits at */
632
+ /* bottom-center; the lock button's default bottom-left slot would */
633
+ /* collide with it. Relocate the lock to the top-left corner and hide */
634
+ /* the F1 kbd hint — the key isn't reachable on mobile anyway. */
635
+ /* ------------------------------------------------------------------ */
636
+ @media (max-width: 640px) {
637
+ .workbench-lock-button {
638
+ left: 12px;
639
+ top: 12px;
640
+ bottom: auto;
641
+ padding: 0;
642
+ width: 36px;
643
+ height: 36px;
644
+ justify-content: center;
645
+ }
646
+
647
+ .workbench-lock-button__kbd {
648
+ display: none;
649
+ }
650
+
651
+ .workbench-dock {
652
+ bottom: 12px;
653
+ padding: 6px 10px;
654
+ gap: 6px;
655
+ /* Cap the width so magnified tiles can't push the dock outside the
656
+ viewport, and so the HUD / lock above stay clear. */
657
+ max-width: calc(100vw - 24px);
658
+ }
659
+
660
+ .workbench-dock__item,
661
+ .workbench-dock__tile {
662
+ width: 32px;
663
+ height: 32px;
664
+ }
665
+
666
+ .workbench-dock__icon {
667
+ width: 16px;
668
+ height: 16px;
669
+ }
670
+
671
+ .workbench-hud {
672
+ top: 12px;
673
+ right: 12px;
674
+ }
675
+ }
676
+
677
+ /* ------------------------------------------------------------------ */
678
+ /* HUD (zoom controls) */
679
+ /* ------------------------------------------------------------------ */
680
+ .workbench-hud {
681
+ position: absolute;
682
+ top: 14px;
683
+ right: 14px;
684
+ display: flex;
685
+ align-items: center;
686
+ gap: 2px;
687
+ padding: 4px;
688
+ border-radius: 10px;
689
+ border: 1px solid color-mix(in srgb, var(--border, #e5e5e5) 80%, transparent);
690
+ background: color-mix(in srgb, var(--card, #fff) 80%, transparent);
691
+ box-shadow:
692
+ 0 6px 20px -10px color-mix(in srgb, var(--foreground, #000) 22%, transparent),
693
+ 0 1px 0 color-mix(in srgb, white 40%, transparent) inset;
694
+ backdrop-filter: blur(14px) saturate(160%);
695
+ -webkit-backdrop-filter: blur(14px) saturate(160%);
696
+ z-index: 8;
697
+ }
698
+
699
+ .workbench-hud__button {
700
+ display: inline-flex;
701
+ align-items: center;
702
+ justify-content: center;
703
+ width: 28px;
704
+ height: 28px;
705
+ border-radius: 6px;
706
+ border: none;
707
+ background: transparent;
708
+ color: var(--muted-foreground, #888);
709
+ cursor: pointer;
710
+ transition: background-color 140ms ease, color 140ms ease;
711
+ }
712
+
713
+ .workbench-hud__button:hover {
714
+ background: var(--accent, #f2f2f2);
715
+ color: var(--foreground, #111);
716
+ }
717
+
718
+ .workbench-hud__scale {
719
+ font-size: 11px;
720
+ font-weight: 600;
721
+ color: var(--muted-foreground, #888);
722
+ min-width: 42px;
723
+ text-align: center;
724
+ user-select: none;
725
+ font-variant-numeric: tabular-nums;
726
+ }
727
+
728
+ /* ------------------------------------------------------------------ */
729
+ /* Widget bodies – Terminal */
730
+ /* ------------------------------------------------------------------ */
731
+ .workbench-widget-terminal {
732
+ display: flex;
733
+ flex-direction: column;
734
+ height: 100%;
735
+ background: linear-gradient(180deg, #1d1f2b 0%, #121322 100%);
736
+ color: #d6dee7;
737
+ font-family: 'SF Mono', 'Cascadia Code', 'Menlo', 'Consolas', monospace;
738
+ font-size: 11px;
739
+ line-height: 1.6;
740
+ }
741
+
742
+ .workbench-widget-terminal__toolbar {
743
+ display: flex;
744
+ align-items: center;
745
+ gap: 6px;
746
+ padding: 6px 10px;
747
+ border-bottom: 1px solid rgba(255, 255, 255, 0.06);
748
+ background: rgba(0, 0, 0, 0.15);
749
+ }
750
+
751
+ .workbench-widget-terminal__dot {
752
+ width: 9px;
753
+ height: 9px;
754
+ border-radius: 50%;
755
+ box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.25);
756
+ }
757
+
758
+ .workbench-widget-terminal__dot--red { background: #ff6b6b; }
759
+ .workbench-widget-terminal__dot--yellow { background: #ffd93d; }
760
+ .workbench-widget-terminal__dot--green { background: #6bff8d; }
761
+
762
+ .workbench-widget-terminal__path {
763
+ margin-left: 8px;
764
+ color: #7e87a4;
765
+ font-size: 10px;
766
+ }
767
+
768
+ .workbench-widget-terminal__body {
769
+ flex: 1;
770
+ padding: 8px 10px;
771
+ overflow: hidden;
772
+ }
773
+
774
+ .workbench-widget-terminal__line {
775
+ white-space: pre;
776
+ display: flex;
777
+ gap: 6px;
778
+ animation: workbench-term-line-in 160ms cubic-bezier(0.33, 1, 0.68, 1);
779
+ }
780
+
781
+ @keyframes workbench-term-line-in {
782
+ from {
783
+ opacity: 0;
784
+ transform: translateY(3px);
785
+ }
786
+ to {
787
+ opacity: 1;
788
+ transform: translateY(0);
789
+ }
790
+ }
791
+
792
+ .workbench-widget-terminal__line--muted {
793
+ color: #7e87a4;
794
+ }
795
+
796
+ .workbench-widget-terminal__prompt {
797
+ color: #6bff8d;
798
+ flex-shrink: 0;
799
+ }
800
+
801
+ .workbench-widget-terminal__cursor {
802
+ display: inline-block;
803
+ width: 7px;
804
+ height: 13px;
805
+ background: #d6dee7;
806
+ margin-left: 2px;
807
+ align-self: center;
808
+ animation: workbench-blink 1s step-end infinite;
809
+ }
810
+
811
+ @keyframes workbench-blink {
812
+ 0%, 49% { opacity: 1; }
813
+ 50%, 100% { opacity: 0; }
814
+ }
815
+
816
+ /* ------------------------------------------------------------------ */
817
+ /* Widget bodies – File Browser */
818
+ /* ------------------------------------------------------------------ */
819
+ .workbench-widget-filebrowser {
820
+ display: flex;
821
+ flex-direction: column;
822
+ height: 100%;
823
+ font-size: 12px;
824
+ }
825
+
826
+ .workbench-widget-filebrowser__toolbar {
827
+ display: flex;
828
+ align-items: center;
829
+ padding: 6px 10px;
830
+ border-bottom: 1px solid color-mix(in srgb, var(--border, #e5e5e5) 70%, transparent);
831
+ background: color-mix(in srgb, var(--muted, #f5f5f5) 62%, transparent);
832
+ }
833
+
834
+ .workbench-widget-filebrowser__path {
835
+ font-size: 10px;
836
+ color: var(--muted-foreground, #888);
837
+ font-family: 'SF Mono', 'Cascadia Code', 'Menlo', monospace;
838
+ }
839
+
840
+ .workbench-widget-filebrowser__tree {
841
+ flex: 1;
842
+ padding: 4px 0;
843
+ overflow: auto;
844
+ }
845
+
846
+ .workbench-widget-filebrowser__row {
847
+ display: flex;
848
+ align-items: center;
849
+ gap: 6px;
850
+ width: 100%;
851
+ padding: 4px 10px 4px 0;
852
+ border: none;
853
+ background: transparent;
854
+ color: var(--foreground, #111);
855
+ text-align: left;
856
+ font-size: 11.5px;
857
+ cursor: default;
858
+ transition: background-color 100ms ease, color 100ms ease;
859
+ }
860
+
861
+ .workbench-widget-filebrowser__row:hover {
862
+ background: color-mix(in srgb, var(--accent, #f5f5f5) 80%, transparent);
863
+ }
864
+
865
+ .workbench-widget-filebrowser__row.is-folder {
866
+ cursor: pointer;
867
+ }
868
+
869
+ .workbench-widget-filebrowser__row.is-open {
870
+ color: var(--foreground, #111);
871
+ }
872
+
873
+ .workbench-widget-filebrowser__chev {
874
+ display: inline-flex;
875
+ align-items: center;
876
+ justify-content: center;
877
+ width: 14px;
878
+ height: 14px;
879
+ color: var(--muted-foreground, #888);
880
+ transition: transform 150ms cubic-bezier(0.33, 1, 0.68, 1);
881
+ }
882
+
883
+ .workbench-widget-filebrowser__icon {
884
+ display: inline-flex;
885
+ align-items: center;
886
+ justify-content: center;
887
+ color: color-mix(in srgb, var(--primary, #3b82f6) 70%, var(--muted-foreground, #888));
888
+ }
889
+
890
+ .workbench-widget-filebrowser__row:not(.is-folder) .workbench-widget-filebrowser__icon {
891
+ color: var(--muted-foreground, #888);
892
+ }
893
+
894
+ .workbench-widget-filebrowser__name {
895
+ font-weight: 500;
896
+ }
897
+
898
+ /* ------------------------------------------------------------------ */
899
+ /* Widget bodies – System Monitor */
900
+ /* ------------------------------------------------------------------ */
901
+ .workbench-widget-sysmon {
902
+ display: flex;
903
+ flex-direction: column;
904
+ gap: 14px;
905
+ padding: 16px;
906
+ height: 100%;
907
+ justify-content: center;
908
+ }
909
+
910
+ .workbench-widget-sysmon__row {
911
+ display: grid;
912
+ grid-template-columns: 86px 78px 1fr 40px;
913
+ align-items: center;
914
+ gap: 10px;
915
+ }
916
+
917
+ .workbench-widget-sysmon__label {
918
+ display: flex;
919
+ align-items: center;
920
+ gap: 6px;
921
+ font-size: 11px;
922
+ font-weight: 600;
923
+ color: var(--foreground, #111);
924
+ }
925
+
926
+ .workbench-widget-sysmon__bar {
927
+ height: 8px;
928
+ border-radius: 4px;
929
+ background: color-mix(in srgb, var(--muted, #eee) 70%, transparent);
930
+ overflow: hidden;
931
+ }
932
+
933
+ .workbench-widget-sysmon__fill {
934
+ height: 100%;
935
+ border-radius: 4px;
936
+ transition: width 480ms cubic-bezier(0.33, 1, 0.68, 1);
937
+ box-shadow: 0 0 12px color-mix(in srgb, currentColor 30%, transparent);
938
+ }
939
+
940
+ .workbench-widget-sysmon__fill--cpu {
941
+ background: linear-gradient(90deg, #60a5fa, #3b82f6);
942
+ color: #3b82f6;
943
+ }
944
+ .workbench-widget-sysmon__fill--memory {
945
+ background: linear-gradient(90deg, #fbbf24, #f59e0b);
946
+ color: #f59e0b;
947
+ }
948
+ .workbench-widget-sysmon__fill--disk {
949
+ background: linear-gradient(90deg, #34d399, #10b981);
950
+ color: #10b981;
951
+ }
952
+
953
+ .workbench-widget-sysmon__spark {
954
+ height: 22px;
955
+ width: 100%;
956
+ }
957
+
958
+ .workbench-widget-sysmon__spark--cpu { color: #3b82f6; }
959
+ .workbench-widget-sysmon__spark--memory { color: #f59e0b; }
960
+ .workbench-widget-sysmon__spark--disk { color: #10b981; }
961
+
962
+ .workbench-widget-sysmon__value {
963
+ font-size: 11px;
964
+ font-weight: 700;
965
+ color: var(--foreground, #111);
966
+ text-align: right;
967
+ font-variant-numeric: tabular-nums;
968
+ }
969
+
970
+ /* ------------------------------------------------------------------ */
971
+ /* Widget bodies – Log Viewer */
972
+ /* ------------------------------------------------------------------ */
973
+ .workbench-widget-logviewer {
974
+ height: 100%;
975
+ overflow: hidden;
976
+ font-family: 'SF Mono', 'Cascadia Code', 'Menlo', 'Consolas', monospace;
977
+ font-size: 10.5px;
978
+ line-height: 1.65;
979
+ background: color-mix(in srgb, var(--card, #fff) 96%, var(--muted, #f5f5f5) 4%);
980
+ }
981
+
982
+ .workbench-widget-logviewer__lines {
983
+ padding: 6px 10px;
984
+ display: flex;
985
+ flex-direction: column;
986
+ justify-content: flex-end;
987
+ height: 100%;
988
+ }
989
+
990
+ .workbench-widget-logviewer__line {
991
+ display: grid;
992
+ grid-template-columns: 58px 48px 1fr;
993
+ gap: 8px;
994
+ align-items: baseline;
995
+ white-space: nowrap;
996
+ color: var(--foreground, #111);
997
+ animation: workbench-log-line-in 180ms cubic-bezier(0.33, 1, 0.68, 1);
998
+ }
999
+
1000
+ .workbench-widget-logviewer__msg {
1001
+ overflow: hidden;
1002
+ text-overflow: ellipsis;
1003
+ }
1004
+
1005
+ @keyframes workbench-log-line-in {
1006
+ from {
1007
+ opacity: 0;
1008
+ transform: translateY(4px);
1009
+ }
1010
+ to {
1011
+ opacity: 1;
1012
+ transform: translateY(0);
1013
+ }
1014
+ }
1015
+
1016
+ .workbench-widget-logviewer__ts {
1017
+ color: var(--muted-foreground, #888);
1018
+ }
1019
+
1020
+ .workbench-widget-logviewer__level {
1021
+ font-weight: 700;
1022
+ letter-spacing: 0.02em;
1023
+ }
1024
+
1025
+ .workbench-widget-logviewer__level--info { color: #3b82f6; }
1026
+ .workbench-widget-logviewer__level--warn { color: #f59e0b; }
1027
+ .workbench-widget-logviewer__level--error { color: #ef4444; }
1028
+ .workbench-widget-logviewer__level--debug { color: #94a3b8; }
1029
+
1030
+ /* ------------------------------------------------------------------ */
1031
+ /* Widget bodies – Code Editor */
1032
+ /* ------------------------------------------------------------------ */
1033
+ .workbench-widget-codeeditor {
1034
+ display: flex;
1035
+ height: 100%;
1036
+ font-family: 'SF Mono', 'Cascadia Code', 'Menlo', 'Consolas', monospace;
1037
+ font-size: 11px;
1038
+ line-height: 1.7;
1039
+ background: color-mix(in srgb, var(--card, #fff) 94%, var(--muted, #f5f5f5) 6%);
1040
+ }
1041
+
1042
+ .workbench-widget-codeeditor__gutter {
1043
+ display: flex;
1044
+ flex-direction: column;
1045
+ padding: 10px 10px 10px 14px;
1046
+ text-align: right;
1047
+ color: color-mix(in srgb, var(--muted-foreground, #888) 70%, transparent);
1048
+ border-right: 1px solid color-mix(in srgb, var(--border, #e5e5e5) 70%, transparent);
1049
+ user-select: none;
1050
+ flex-shrink: 0;
1051
+ font-variant-numeric: tabular-nums;
1052
+ }
1053
+
1054
+ .workbench-widget-codeeditor__gutter span.is-active {
1055
+ color: var(--primary, #3b82f6);
1056
+ font-weight: 700;
1057
+ }
1058
+
1059
+ .workbench-widget-codeeditor__code {
1060
+ flex: 1;
1061
+ padding: 10px 12px;
1062
+ overflow: hidden;
1063
+ color: var(--foreground, #111);
1064
+ }
1065
+
1066
+ .workbench-widget-codeeditor__line {
1067
+ min-height: 1.7em;
1068
+ white-space: pre;
1069
+ position: relative;
1070
+ padding: 0 6px;
1071
+ border-radius: 3px;
1072
+ }
1073
+
1074
+ .workbench-widget-codeeditor__line.is-active {
1075
+ background: color-mix(in srgb, var(--primary, #3b82f6) 8%, transparent);
1076
+ }
1077
+
1078
+ .workbench-widget-codeeditor__caret {
1079
+ display: inline-block;
1080
+ width: 1.5px;
1081
+ height: 1.1em;
1082
+ background: var(--primary, #3b82f6);
1083
+ margin-left: 2px;
1084
+ vertical-align: text-bottom;
1085
+ animation: workbench-blink 1s step-end infinite;
1086
+ }
1087
+
1088
+ .workbench-widget-codeeditor__keyword { color: #c678dd; }
1089
+ .workbench-widget-codeeditor__string { color: #98c379; }
1090
+ .workbench-widget-codeeditor__fn { color: #61afef; }
1091
+ .workbench-widget-codeeditor__number { color: #d19a66; }
1092
+ .workbench-widget-codeeditor__attr { color: #e5c07b; }
1093
+ .workbench-widget-codeeditor__comment {
1094
+ color: color-mix(in srgb, var(--muted-foreground, #888) 80%, transparent);
1095
+ font-style: italic;
1096
+ }
1097
+ .workbench-widget-codeeditor__plain { color: inherit; }
1098
+
1099
+ /* ------------------------------------------------------------------ */
1100
+ /* Dock — drag-to-create ghost */
1101
+ /* ------------------------------------------------------------------ */
1102
+ .workbench-dock__item.is-source-dragging .workbench-dock__tile {
1103
+ opacity: 0.45;
1104
+ filter: saturate(0.8);
1105
+ }
1106
+
1107
+ .workbench-dock-ghost {
1108
+ position: fixed;
1109
+ left: 0;
1110
+ top: 0;
1111
+ pointer-events: none;
1112
+ z-index: 9020;
1113
+ /* Transform is driven every pointermove — keep it GPU-composited and
1114
+ never transition, so the ghost is 1:1 with the cursor. */
1115
+ will-change: transform;
1116
+ transition: none;
1117
+ }
1118
+
1119
+ .workbench-dock-ghost__halo {
1120
+ position: absolute;
1121
+ left: -12px;
1122
+ top: -12px;
1123
+ right: -12px;
1124
+ bottom: -12px;
1125
+ border-radius: 18px;
1126
+ background: radial-gradient(
1127
+ circle at center,
1128
+ color-mix(in srgb, var(--primary, #3b82f6) 32%, transparent),
1129
+ transparent 70%
1130
+ );
1131
+ opacity: 0;
1132
+ transition: opacity 160ms ease;
1133
+ }
1134
+
1135
+ .workbench-dock-ghost.is-over-canvas .workbench-dock-ghost__halo {
1136
+ opacity: 1;
1137
+ }
1138
+
1139
+ .workbench-dock-ghost__card {
1140
+ position: relative;
1141
+ display: flex;
1142
+ align-items: center;
1143
+ gap: 10px;
1144
+ padding: 8px 12px 8px 10px;
1145
+ border-radius: 12px;
1146
+ background: color-mix(in srgb, var(--card, #fff) 92%, transparent);
1147
+ border: 1px solid color-mix(in srgb, var(--border, #e5e5e5) 80%, transparent);
1148
+ box-shadow:
1149
+ 0 18px 36px -10px color-mix(in srgb, var(--foreground, #000) 28%, transparent),
1150
+ 0 4px 12px -4px color-mix(in srgb, var(--foreground, #000) 14%, transparent),
1151
+ 0 1px 0 color-mix(in srgb, white 60%, transparent) inset;
1152
+ backdrop-filter: blur(14px) saturate(160%);
1153
+ -webkit-backdrop-filter: blur(14px) saturate(160%);
1154
+ min-width: 168px;
1155
+ transform-origin: top left;
1156
+ animation: workbench-dock-ghost-in 140ms cubic-bezier(0.33, 1, 0.68, 1);
1157
+ }
1158
+
1159
+ .workbench-dock-ghost.is-over-canvas .workbench-dock-ghost__card {
1160
+ border-color: color-mix(in srgb, var(--primary, #3b82f6) 70%, transparent);
1161
+ box-shadow:
1162
+ 0 18px 36px -10px color-mix(in srgb, var(--primary, #3b82f6) 32%, transparent),
1163
+ 0 4px 12px -4px color-mix(in srgb, var(--primary, #3b82f6) 18%, transparent),
1164
+ 0 0 0 1px color-mix(in srgb, var(--primary, #3b82f6) 38%, transparent) inset;
1165
+ }
1166
+
1167
+ @keyframes workbench-dock-ghost-in {
1168
+ from {
1169
+ opacity: 0;
1170
+ transform: scale(0.94);
1171
+ }
1172
+ to {
1173
+ opacity: 1;
1174
+ transform: scale(1);
1175
+ }
1176
+ }
1177
+
1178
+ .workbench-dock-ghost__icon {
1179
+ display: inline-flex;
1180
+ align-items: center;
1181
+ justify-content: center;
1182
+ width: 28px;
1183
+ height: 28px;
1184
+ border-radius: 8px;
1185
+ background: linear-gradient(
1186
+ 135deg,
1187
+ color-mix(in srgb, var(--primary, #3b82f6) 88%, white),
1188
+ var(--primary, #3b82f6)
1189
+ );
1190
+ color: var(--primary-foreground, #fff);
1191
+ flex-shrink: 0;
1192
+ box-shadow: 0 4px 10px -3px color-mix(in srgb, var(--primary, #3b82f6) 60%, transparent);
1193
+ }
1194
+
1195
+ .workbench-dock-ghost__copy {
1196
+ display: flex;
1197
+ flex-direction: column;
1198
+ gap: 1px;
1199
+ }
1200
+
1201
+ .workbench-dock-ghost__title {
1202
+ font-size: 12px;
1203
+ font-weight: 600;
1204
+ color: var(--foreground, #111);
1205
+ letter-spacing: -0.005em;
1206
+ }
1207
+
1208
+ .workbench-dock-ghost__hint {
1209
+ display: inline-flex;
1210
+ align-items: center;
1211
+ gap: 3px;
1212
+ font-size: 10px;
1213
+ color: var(--muted-foreground, #888);
1214
+ font-weight: 500;
1215
+ }
1216
+
1217
+ .workbench-dock-ghost.is-over-canvas .workbench-dock-ghost__hint {
1218
+ color: var(--primary, #3b82f6);
1219
+ }
1220
+ }