orbcafe-ui 2.0.0 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/orbis.css CHANGED
@@ -22,7 +22,10 @@
22
22
  ========================================================================== */
23
23
 
24
24
  :root {
25
- --orb-font: "Montserrat", system-ui, -apple-system, "Segoe UI", "Helvetica Neue", Arial, sans-serif;
25
+ /* Brand base — theme packs (themes/<brand>.css) override these; everything
26
+ below derives from them via color-mix, so the whole UI re-skins at once. */
27
+ --orb-font-brand: "Montserrat";
28
+ --orb-font: var(--orb-font-brand), system-ui, -apple-system, "Segoe UI", "Helvetica Neue", Arial, sans-serif;
26
29
  --orb-r: 10px;
27
30
  --orb-r-container: var(--orb-r);
28
31
  --orb-t-fast: 0.2s ease;
@@ -34,18 +37,18 @@
34
37
  --orb-surface-3: #f5f5f5;
35
38
  --orb-fg: #555555;
36
39
  --orb-fg-strong: #555555;
37
- --orb-table-fg: color-mix(in oklch, #555555 92%, #01091a);
40
+ --orb-table-fg: color-mix(in oklch, var(--orb-fg) 92%, #01091a);
38
41
  --orb-muted: #8c8c8c;
39
42
  --orb-border: #dbdbdb;
40
43
  --orb-primary: #154194;
41
44
  --orb-on-primary: #ffffff;
42
- --orb-link: #154194;
43
- --orb-p50: color-mix(in oklch, #154194 6%, #ffffff);
44
- --orb-p100: color-mix(in oklch, #154194 14%, #ffffff);
45
- --orb-p200: color-mix(in oklch, #154194 28%, #ffffff);
46
- --orb-p300: color-mix(in oklch, #154194 45%, #ffffff);
47
- --orb-p600: color-mix(in oklch, #154194 85%, #000000);
48
- --orb-p700: color-mix(in oklch, #154194 70%, #000000);
45
+ --orb-link: var(--orb-primary);
46
+ --orb-p50: color-mix(in oklch, var(--orb-primary) 6%, var(--orb-canvas));
47
+ --orb-p100: color-mix(in oklch, var(--orb-primary) 14%, var(--orb-canvas));
48
+ --orb-p200: color-mix(in oklch, var(--orb-primary) 28%, var(--orb-canvas));
49
+ --orb-p300: color-mix(in oklch, var(--orb-primary) 45%, var(--orb-canvas));
50
+ --orb-p600: color-mix(in oklch, var(--orb-primary) 85%, #000000);
51
+ --orb-p700: color-mix(in oklch, var(--orb-primary) 70%, #000000);
49
52
  --orb-accent: #fc4c02;
50
53
  --orb-divider: var(--orb-border);
51
54
  --orb-primary-bg: var(--orb-p50);
@@ -54,18 +57,39 @@
54
57
  --orb-success: var(--orb-primary);
55
58
  --orb-success-bg: var(--orb-p50);
56
59
  --orb-warn: var(--orb-accent);
57
- --orb-err: color-mix(in oklch, #fc4c02 75%, #000000);
58
- --orb-err-bg: color-mix(in oklch, #fc4c02 7%, #ffffff);
59
- --orb-warn-bg: color-mix(in oklch, #fc4c02 8%, #ffffff);
60
- --orb-hover: color-mix(in oklch, #154194 6%, transparent);
61
- --orb-selected: color-mix(in oklch, #154194 10%, transparent);
62
- --orb-focus-ring: color-mix(in oklch, #154194 18%, transparent);
63
- --orb-focus-solid: #154194;
64
- --orb-disabled-fg: color-mix(in oklch, #555555 45%, #ffffff);
65
- --orb-disabled-bg: color-mix(in oklch, #555555 8%, #ffffff);
60
+ --orb-err: color-mix(in oklch, var(--orb-accent) 75%, #000000);
61
+ --orb-err-bg: color-mix(in oklch, var(--orb-accent) 7%, var(--orb-canvas));
62
+ --orb-warn-bg: color-mix(in oklch, var(--orb-accent) 8%, var(--orb-canvas));
63
+ --orb-hover: color-mix(in oklch, var(--orb-primary) 6%, transparent);
64
+ --orb-selected: color-mix(in oklch, var(--orb-primary) 10%, transparent);
65
+ --orb-focus-ring: color-mix(in oklch, var(--orb-primary) 18%, transparent);
66
+ --orb-focus-solid: var(--orb-primary);
67
+ --orb-disabled-fg: color-mix(in oklch, var(--orb-fg) 45%, var(--orb-canvas));
68
+ --orb-disabled-bg: color-mix(in oklch, var(--orb-fg) 8%, var(--orb-canvas));
66
69
  --orb-chart-grid: #dbdbdb;
67
70
  --orb-chart-text: #8c8c8c;
71
+ /* Chart series + data states (theme packs override per brand) */
72
+ --orb-chart-1: var(--orb-primary);
73
+ --orb-chart-2: var(--orb-p300);
74
+ --orb-chart-3: var(--orb-muted);
75
+ --orb-chart-4: var(--orb-p700);
76
+ --orb-chart-5: var(--orb-accent);
77
+ --orb-chart-6: var(--orb-p200);
78
+ --orb-chart-positive: #66bb6a;
79
+ --orb-chart-negative: #ef5350;
68
80
  --orb-track: #f5f5f5;
81
+ --orb-inverse-surface: #01091a;
82
+ --orb-inverse-fg: #ffffff;
83
+ --orb-inverse-link: #91a8d1;
84
+ --orb-ai-accent: #21bcff;
85
+ /* Conventional status hues used by the Pad module; theme packs may override
86
+ to align with the brand's --orb-primary/--orb-accent discipline. */
87
+ --orb-status-fg: #475569;
88
+ --orb-status-primary: #1d4ed8;
89
+ --orb-status-success: #047857;
90
+ --orb-status-warning: #b45309;
91
+ --orb-status-error: #b91c1c;
92
+ --orb-status-info: #0369a1;
69
93
  --orb-shadow-1: 0 1px 2px rgba(1, 9, 26, 0.05), 0 2px 6px rgba(1, 9, 26, 0.06);
70
94
  --orb-shadow-2: 0 4px 14px rgba(1, 9, 26, 0.1);
71
95
  --orb-shadow-3: 0 12px 32px rgba(1, 9, 26, 0.16);
@@ -76,8 +100,8 @@
76
100
  [data-orb-mode="dark"] {
77
101
  --orb-canvas: #01091a;
78
102
  --orb-surface: #0a1526;
79
- --orb-surface-2: color-mix(in oklch, #ffffff 5%, #01091a);
80
- --orb-surface-3: color-mix(in oklch, #ffffff 9%, #01091a);
103
+ --orb-surface-2: color-mix(in oklch, #ffffff 5%, var(--orb-canvas));
104
+ --orb-surface-3: color-mix(in oklch, #ffffff 9%, var(--orb-canvas));
81
105
  --orb-fg: #ffffff;
82
106
  --orb-fg-strong: #ffffff;
83
107
  --orb-table-fg: #ffffff;
@@ -85,13 +109,13 @@
85
109
  --orb-border: rgba(255, 255, 255, 0.12);
86
110
  --orb-primary: #154194;
87
111
  --orb-on-primary: #ffffff;
88
- --orb-link: color-mix(in oklch, #154194 45%, #ffffff);
89
- --orb-p50: color-mix(in oklch, #154194 22%, #01091a);
90
- --orb-p100: color-mix(in oklch, #154194 32%, #01091a);
91
- --orb-p200: color-mix(in oklch, #154194 28%, #ffffff);
92
- --orb-p300: color-mix(in oklch, #154194 45%, #ffffff);
93
- --orb-p600: color-mix(in oklch, #154194 85%, #ffffff);
94
- --orb-p700: color-mix(in oklch, #154194 60%, #ffffff);
112
+ --orb-link: color-mix(in oklch, var(--orb-primary) 45%, #ffffff);
113
+ --orb-p50: color-mix(in oklch, var(--orb-primary) 22%, var(--orb-canvas));
114
+ --orb-p100: color-mix(in oklch, var(--orb-primary) 32%, var(--orb-canvas));
115
+ --orb-p200: color-mix(in oklch, var(--orb-primary) 28%, #ffffff);
116
+ --orb-p300: color-mix(in oklch, var(--orb-primary) 45%, #ffffff);
117
+ --orb-p600: color-mix(in oklch, var(--orb-primary) 85%, #ffffff);
118
+ --orb-p700: color-mix(in oklch, var(--orb-primary) 60%, #ffffff);
95
119
  --orb-accent: #fc4c02;
96
120
  --orb-divider: var(--orb-border);
97
121
  --orb-primary-bg: var(--orb-p50);
@@ -100,18 +124,27 @@
100
124
  --orb-success: var(--orb-p300);
101
125
  --orb-success-bg: var(--orb-p50);
102
126
  --orb-warn: var(--orb-accent);
103
- --orb-err: color-mix(in oklch, #fc4c02 88%, #000000);
104
- --orb-err-bg: color-mix(in oklch, #fc4c02 16%, #01091a);
105
- --orb-warn-bg: color-mix(in oklch, #fc4c02 18%, #01091a);
127
+ --orb-err: color-mix(in oklch, var(--orb-accent) 88%, #000000);
128
+ --orb-err-bg: color-mix(in oklch, var(--orb-accent) 16%, var(--orb-canvas));
129
+ --orb-warn-bg: color-mix(in oklch, var(--orb-accent) 18%, var(--orb-canvas));
106
130
  --orb-hover: rgba(255, 255, 255, 0.08);
107
- --orb-selected: color-mix(in oklch, #154194 45%, transparent);
108
- --orb-focus-ring: color-mix(in oklch, #154194 45%, #ffffff 25%);
109
- --orb-focus-solid: color-mix(in oklch, #154194 45%, #ffffff);
131
+ --orb-selected: color-mix(in oklch, var(--orb-primary) 45%, transparent);
132
+ --orb-focus-ring: color-mix(in oklch, var(--orb-primary) 45%, #ffffff 25%);
133
+ --orb-focus-solid: color-mix(in oklch, var(--orb-primary) 45%, #ffffff);
110
134
  --orb-disabled-fg: rgba(255, 255, 255, 0.38);
111
135
  --orb-disabled-bg: rgba(255, 255, 255, 0.07);
112
136
  --orb-chart-grid: rgba(255, 255, 255, 0.12);
113
137
  --orb-chart-text: rgba(255, 255, 255, 0.7);
114
138
  --orb-track: rgba(255, 255, 255, 0.1);
139
+ --orb-inverse-surface: #01091a;
140
+ --orb-inverse-fg: #ffffff;
141
+ /* status hues brightened for dark surfaces (≈ Tailwind -400 ramp) */
142
+ --orb-status-fg: #94a3b8;
143
+ --orb-status-primary: #60a5fa;
144
+ --orb-status-success: #34d399;
145
+ --orb-status-warning: #fbbf24;
146
+ --orb-status-error: #f87171;
147
+ --orb-status-info: #38bdf8;
115
148
  --orb-shadow-1: 0 1px 2px rgba(0, 0, 0, 0.4), 0 2px 8px rgba(0, 0, 0, 0.35);
116
149
  --orb-shadow-2: 0 4px 16px rgba(0, 0, 0, 0.5);
117
150
  --orb-shadow-3: 0 12px 32px rgba(0, 0, 0, 0.55);
@@ -130,12 +163,24 @@
130
163
  background: var(--orb-selected);
131
164
  }
132
165
 
166
+ /* Shared focus ring — component sections rely on these two rules. */
133
167
  .orb-root :focus-visible,
134
- .orb-focus-visible:focus-visible {
168
+ .orb-focus-visible:focus-visible,
169
+ .orb-chk input:focus-visible,
170
+ .orb-rdo input:focus-visible,
171
+ .orb-sw input:focus-visible,
172
+ .orb-app-header-ai-action:focus-visible {
135
173
  outline: 2px solid var(--orb-focus-solid);
136
174
  outline-offset: 1px;
137
175
  }
138
176
 
177
+ .orb-segmented-control:has(.orb-segmented-control-item:focus-visible),
178
+ .orb-app-header-user-trigger:focus-visible,
179
+ .orb-app-header-locale:focus-visible {
180
+ outline: 2px solid var(--orb-focus-solid);
181
+ outline-offset: 2px;
182
+ }
183
+
139
184
  /* typography helpers (type scale from the handoff §2) */
140
185
  .orb-h1 { font: 600 32px/1.25 var(--orb-font); color: var(--orb-fg-strong); }
141
186
  .orb-h2 { font: 600 24px/1.3 var(--orb-font); color: var(--orb-fg-strong); }
@@ -143,8 +188,8 @@
143
188
  .orb-subtitle { font: 500 16px/1.4 var(--orb-font); color: var(--orb-fg); }
144
189
  .orb-body { font: 300 16px/1.5 var(--orb-font); color: var(--orb-fg); }
145
190
  .orb-body-dense { font: 300 14px/1.5 var(--orb-font); color: var(--orb-fg); }
146
- .orb-label { font: 500 13px/1.3 var(--orb-font); color: var(--orb-fg); }
147
- .orb-meta { font: 500 12px/1.4 var(--orb-font); color: var(--orb-muted); }
191
+ .orb-label, .orb-fld > label, .orb-fld-label { font: 500 13px/1.3 var(--orb-font); color: var(--orb-fg); }
192
+ .orb-meta, .orb-fld-msg { font: 500 12px/1.4 var(--orb-font); color: var(--orb-muted); }
148
193
  .orb-overline {
149
194
  font: 500 11px/1.4 var(--orb-font);
150
195
  letter-spacing: 0.06em;
@@ -162,7 +207,8 @@
162
207
  border: none;
163
208
  padding: 0;
164
209
  }
165
- .orb-link:hover { text-decoration: underline; }
210
+ .orb-link:hover,
211
+ .orb-tbl a:hover { text-decoration: underline; }
166
212
 
167
213
  .orb-divider { border: none; border-top: 1px solid var(--orb-border); }
168
214
  .orb-divider-v { border: none; border-left: 1px solid var(--orb-border); }
@@ -190,9 +236,9 @@
190
236
  .orb-btn-primary:hover:not(:disabled) { background: var(--orb-p600); }
191
237
  .orb-btn-primary:active:not(:disabled) { background: var(--orb-p700); box-shadow: none; }
192
238
  .orb-btn-secondary { background: transparent; color: var(--orb-primary); border-color: var(--orb-primary); }
193
- .orb-btn-secondary:hover:not(:disabled) { background: var(--orb-hover); }
194
- .orb-btn-ghost { background: transparent; color: var(--orb-primary); }
239
+ .orb-btn-secondary:hover:not(:disabled),
195
240
  .orb-btn-ghost:hover:not(:disabled) { background: var(--orb-hover); }
241
+ .orb-btn-ghost { background: transparent; color: var(--orb-primary); }
196
242
  .orb-btn-neutral { background: transparent; color: var(--orb-fg); border-color: var(--orb-border); }
197
243
  .orb-btn-neutral:hover:not(:disabled) { background: var(--orb-hover); border-color: var(--orb-muted); }
198
244
  .orb-btn:disabled,
@@ -221,7 +267,6 @@
221
267
  transition: background var(--orb-t-fast), color var(--orb-t-fast);
222
268
  }
223
269
  .orb-icon-btn:hover:not(:disabled) { background: var(--orb-hover); color: var(--orb-fg); }
224
- .orb-icon-btn:disabled { cursor: not-allowed; color: var(--orb-disabled-fg); }
225
270
  .orb-icon-btn-sm { width: 32px; height: 32px; }
226
271
 
227
272
  .orb-segmented-control {
@@ -240,7 +285,7 @@
240
285
  border: 1px solid var(--orb-border);
241
286
  border-radius: calc(var(--orb-segmented-height) / 2);
242
287
  background: var(--orb-surface);
243
- box-shadow: inset 0 1px 2px rgba(85, 85, 85, 0.08);
288
+ box-shadow: inset 0 1px 2px color-mix(in oklch, var(--orb-fg) 8%, transparent);
244
289
  user-select: none;
245
290
  vertical-align: middle;
246
291
  }
@@ -253,7 +298,7 @@
253
298
  width: calc((100% - (var(--orb-segmented-pad) * 2)) / var(--orb-segmented-count));
254
299
  border-radius: 999px;
255
300
  background: var(--orb-primary);
256
- box-shadow: 0 1px 2px rgba(21, 65, 148, 0.3), 0 0 1px rgba(21, 65, 148, 0.24);
301
+ box-shadow: 0 1px 2px color-mix(in oklch, var(--orb-primary) 30%, transparent), 0 0 1px color-mix(in oklch, var(--orb-primary) 24%, transparent);
257
302
  opacity: 1;
258
303
  pointer-events: none;
259
304
  transform: translateX(calc(var(--orb-segmented-index) * 100%));
@@ -303,10 +348,6 @@
303
348
  .orb-segmented-control .orb-segmented-control-item:focus {
304
349
  outline: none;
305
350
  }
306
- .orb-segmented-control:has(.orb-segmented-control-item:focus-visible) {
307
- outline: 2px solid var(--orb-focus-solid);
308
- outline-offset: 2px;
309
- }
310
351
  .orb-segmented-control .orb-segmented-control-item:disabled {
311
352
  opacity: 0.4;
312
353
  }
@@ -368,8 +409,6 @@
368
409
 
369
410
  /* ---------- form fields ---------- */
370
411
  .orb-fld { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
371
- .orb-fld > label,
372
- .orb-fld-label { font: 500 13px/1.3 var(--orb-font); color: var(--orb-fg); }
373
412
  .orb-inp {
374
413
  font: 300 14px/1.4 var(--orb-font);
375
414
  color: var(--orb-fg);
@@ -381,7 +420,8 @@
381
420
  width: 100%;
382
421
  transition: border-color var(--orb-t-fast), box-shadow var(--orb-t-fast), background var(--orb-t-fast);
383
422
  }
384
- .orb-inp::placeholder { color: var(--orb-muted); }
423
+ .orb-inp::placeholder,
424
+ .orb-select-trigger[data-placeholder] { color: var(--orb-muted); }
385
425
  .orb-inp:hover:not(:disabled):not(:focus) { border-color: var(--orb-muted); }
386
426
  .orb-inp:focus { outline: none; border-color: var(--orb-primary); box-shadow: 0 0 0 3px var(--orb-focus-ring); }
387
427
  .orb-inp:disabled { background: var(--orb-disabled-bg); color: var(--orb-disabled-fg); cursor: not-allowed; }
@@ -400,7 +440,6 @@
400
440
  .orb-inp-adornment-end ~ .orb-inp,
401
441
  .orb-inp-adornment-wrap:has(.orb-inp-adornment-end) .orb-inp { padding-left: 14px; padding-right: 38px; }
402
442
  textarea.orb-inp { min-height: 80px; resize: vertical; }
403
- .orb-fld-msg { font: 500 12px/1.4 var(--orb-font); color: var(--orb-muted); }
404
443
  .orb-fld.orb-is-error .orb-inp { border-color: var(--orb-err); }
405
444
  .orb-fld.orb-is-error .orb-inp:focus {
406
445
  box-shadow: 0 0 0 3px color-mix(in oklch, var(--orb-err) 18%, transparent);
@@ -417,7 +456,8 @@ select.orb-inp {
417
456
  }
418
457
 
419
458
  .orb-chk,
420
- .orb-rdo {
459
+ .orb-rdo,
460
+ .orb-sw {
421
461
  position: relative;
422
462
  display: inline-flex;
423
463
  align-items: center;
@@ -470,20 +510,9 @@ select.orb-inp {
470
510
  }
471
511
  .orb-rdo input { border-radius: 50%; }
472
512
  .orb-rdo input:checked { border: 5px solid var(--orb-primary); }
473
- .orb-chk input:focus-visible,
474
- .orb-rdo input:focus-visible { outline: 2px solid var(--orb-focus-solid); outline-offset: 1px; }
475
513
  .orb-chk input:disabled,
476
514
  .orb-rdo input:disabled { background: var(--orb-disabled-bg); border-color: var(--orb-border); cursor: not-allowed; }
477
515
 
478
- .orb-sw {
479
- position: relative;
480
- display: inline-flex;
481
- align-items: center;
482
- gap: 10px;
483
- cursor: pointer;
484
- font: 300 14px/1.4 var(--orb-font);
485
- color: var(--orb-fg);
486
- }
487
516
  .orb-sw input {
488
517
  appearance: none;
489
518
  width: 38px;
@@ -510,7 +539,6 @@ select.orb-inp {
510
539
  }
511
540
  .orb-sw input:checked { background: var(--orb-primary); border-color: var(--orb-primary); }
512
541
  .orb-sw input:checked::after { transform: translateX(16px); }
513
- .orb-sw input:focus-visible { outline: 2px solid var(--orb-focus-solid); outline-offset: 1px; }
514
542
 
515
543
  /* ---------- chips / badges / alerts / feedback ---------- */
516
544
  .orb-chip {
@@ -568,9 +596,9 @@ select.orb-inp {
568
596
  border-radius: 2px 0 0 2px;
569
597
  }
570
598
  .orb-alert b { font-weight: 600; display: block; margin-bottom: 2px; }
571
- .orb-alert-info { background: var(--orb-p50); border-color: var(--orb-p100); }
572
- .orb-alert-info::before { background: var(--orb-primary); }
599
+ .orb-alert-info,
573
600
  .orb-alert-success { background: var(--orb-p50); border-color: var(--orb-p100); }
601
+ .orb-alert-info::before,
574
602
  .orb-alert-success::before { background: var(--orb-primary); }
575
603
  .orb-alert-warning { background: var(--orb-warn-bg); border-color: color-mix(in oklch, var(--orb-accent) 25%, var(--orb-border)); }
576
604
  .orb-alert-warning::before { background: var(--orb-accent); }
@@ -588,7 +616,8 @@ select.orb-inp {
588
616
  }
589
617
  @keyframes orb-sk { to { background-position: -200% 0; } }
590
618
 
591
- .orb-spin {
619
+ .orb-spin,
620
+ .orb-agent-spinner {
592
621
  width: 12px;
593
622
  height: 12px;
594
623
  flex: none;
@@ -605,14 +634,14 @@ select.orb-inp {
605
634
  display: inline-flex;
606
635
  align-items: center;
607
636
  gap: 16px;
608
- background: #01091a;
609
- color: #ffffff;
637
+ background: var(--orb-inverse-surface);
638
+ color: var(--orb-inverse-fg);
610
639
  border-radius: var(--orb-r);
611
640
  padding: 13px 18px;
612
641
  font: 300 14px/1.4 var(--orb-font);
613
642
  box-shadow: var(--orb-shadow-2);
614
643
  }
615
- .orb-snack button { background: none; border: none; color: #91a8d1; font: 500 13px var(--orb-font); cursor: pointer; padding: 0; }
644
+ .orb-snack button { background: none; border: none; color: var(--orb-inverse-link); font: 500 13px var(--orb-font); cursor: pointer; padding: 0; }
616
645
 
617
646
  /* ---------- cards / surfaces ---------- */
618
647
  .orb-card {
@@ -636,7 +665,8 @@ select.orb-inp {
636
665
  box-sizing: border-box;
637
666
  }
638
667
 
639
- .orb-planning-gantt {
668
+ .orb-planning-gantt,
669
+ .orb-planning-table {
640
670
  background: var(--orb-canvas);
641
671
  }
642
672
 
@@ -648,11 +678,6 @@ select.orb-inp {
648
678
  flex: 0 0 auto;
649
679
  }
650
680
 
651
- .orb-planning-extra-tool {
652
- display: flex;
653
- align-items: center;
654
- }
655
-
656
681
  .orb-planning-pane-controls .orb-segmented-control {
657
682
  min-height: 32px;
658
683
  height: 32px;
@@ -673,11 +698,13 @@ select.orb-inp {
673
698
  gap: 18px;
674
699
  }
675
700
 
676
- .orb-table-sort-dialog > div:first-child {
701
+ .orb-table-sort-dialog > div:first-child,
702
+ .orb-layout-save-dialog > div:first-child {
677
703
  align-items: center !important;
678
704
  }
679
705
 
680
- .orb-table-sort-dialog-content {
706
+ .orb-table-sort-dialog-content,
707
+ .orb-layout-save-form {
681
708
  display: grid;
682
709
  gap: 16px;
683
710
  }
@@ -730,7 +757,7 @@ select.orb-inp {
730
757
  }
731
758
 
732
759
  .orb-table-sort-delete:hover:not(:disabled) {
733
- color: var(--orb-danger) !important;
760
+ color: var(--orb-err) !important;
734
761
  }
735
762
 
736
763
  .orb-table-sort-add {
@@ -766,7 +793,8 @@ select.orb-inp {
766
793
  .orb-table-toolbar-actions,
767
794
  .orb-table-toolbar-custom,
768
795
  .orb-table-tool-group,
769
- .orb-table-pager {
796
+ .orb-table-pager,
797
+ .orb-planning-extra-tool {
770
798
  display: flex;
771
799
  align-items: center;
772
800
  }
@@ -965,11 +993,6 @@ select.orb-inp {
965
993
  padding: 0 4px;
966
994
  }
967
995
 
968
- .orb-tbl .orb-table-footer .orb-table-footer-cell.orb-num {
969
- font-variant-numeric: tabular-nums;
970
- text-align: right;
971
- }
972
-
973
996
  .orb-table-group-menu-header {
974
997
  min-height: 38px;
975
998
  display: flex;
@@ -1180,7 +1203,6 @@ select.orb-inp {
1180
1203
  .orb-tbl td { padding: 11px 14px; border-bottom: 1px solid var(--orb-border); font-weight: 380; color: var(--orb-fg); }
1181
1204
  .orb-tbl tbody tr:hover td { background: var(--orb-hover); }
1182
1205
  .orb-tbl tbody tr.orb-is-selected td { background: var(--orb-p50); }
1183
- .orb-planning-table { background: var(--orb-canvas); }
1184
1206
  .orb-planning-table tbody tr { height: 58px; }
1185
1207
  .orb-planning-table tbody tr > td { box-sizing: border-box; }
1186
1208
  .orb-planning-table tbody tr.orb-is-drop-target > td { border-top: 2px solid var(--orb-primary); }
@@ -1188,37 +1210,8 @@ select.orb-inp {
1188
1210
  .orb-planning-timeline-row { background-color: var(--orb-canvas); }
1189
1211
  .orb-planning-timeline-row.orb-table-group-row { background-color: var(--orb-surface); }
1190
1212
  .orb-planning-timeline-row.orb-is-selected { background-color: var(--orb-p50); }
1191
- .orb-tbl .orb-num,
1192
- .orb-tbl td.orb-num,
1193
- .orb-tbl th.orb-num { font-variant-numeric: tabular-nums; text-align: right; }
1194
- .orb-tbl a,
1195
- .orb-tbl .orb-tbl-link { color: var(--orb-link); text-decoration: none; font-weight: 500; cursor: pointer; background: none; border: none; padding: 0; font: inherit; }
1196
- .orb-tbl a:hover,
1197
- .orb-tbl .orb-tbl-link:hover { text-decoration: underline; }
1198
- .orb-tbl-sort {
1199
- display: inline-flex;
1200
- align-items: center;
1201
- gap: 4px;
1202
- background: none;
1203
- border: none;
1204
- padding: 0;
1205
- cursor: pointer;
1206
- font: inherit;
1207
- letter-spacing: inherit;
1208
- text-transform: inherit;
1209
- color: inherit;
1210
- }
1211
- .orb-tbl-sort:hover { color: var(--orb-fg); }
1212
-
1213
- .orb-pager {
1214
- display: flex;
1215
- align-items: center;
1216
- justify-content: flex-end;
1217
- gap: 14px;
1218
- padding: 10px 4px 0;
1219
- font: 500 12px/1 var(--orb-font);
1220
- color: var(--orb-muted);
1221
- }
1213
+ .orb-tbl .orb-num { font-variant-numeric: tabular-nums; text-align: right; }
1214
+ .orb-tbl a { color: var(--orb-link); text-decoration: none; font-weight: 500; cursor: pointer; background: none; border: none; padding: 0; font: inherit; }
1222
1215
 
1223
1216
  .orb-avatar {
1224
1217
  width: 28px;
@@ -1285,19 +1278,11 @@ select.orb-inp {
1285
1278
  .orb-dialog-title { font: 600 19px/1.3 var(--orb-font); color: var(--orb-fg-strong); margin: 0; }
1286
1279
  .orb-dialog-actions { display: flex; justify-content: flex-end; gap: 12px; margin-top: 8px; }
1287
1280
 
1281
+ /* NOTE: must stay after .orb-dialog so its gap wins over the dialog's 16px. */
1288
1282
  .orb-layout-save-dialog {
1289
1283
  gap: 18px;
1290
1284
  }
1291
1285
 
1292
- .orb-layout-save-dialog > div:first-child {
1293
- align-items: center !important;
1294
- }
1295
-
1296
- .orb-layout-save-form {
1297
- display: grid;
1298
- gap: 16px;
1299
- }
1300
-
1301
1286
  .orb-layout-save-warning {
1302
1287
  margin-top: -10px;
1303
1288
  padding-left: 2px;
@@ -1346,7 +1331,6 @@ select.orb-inp {
1346
1331
  }
1347
1332
  .orb-menu-item:hover,
1348
1333
  .orb-menu-item[data-highlighted] { background: var(--orb-hover); outline: none; }
1349
- .orb-menu-item[data-disabled] { color: var(--orb-disabled-fg); cursor: not-allowed; }
1350
1334
  .orb-menu-sep { height: 1px; background: var(--orb-border); margin: 6px 4px; }
1351
1335
  .orb-menu-label { padding: 8px 10px 4px; font: 500 10px/1 var(--orb-font); letter-spacing: 0.08em; text-transform: uppercase; color: var(--orb-muted); }
1352
1336
 
@@ -1360,10 +1344,6 @@ select.orb-inp {
1360
1344
  cursor: pointer;
1361
1345
  }
1362
1346
 
1363
- .orb-select-trigger[data-placeholder] {
1364
- color: var(--orb-muted);
1365
- }
1366
-
1367
1347
  .orb-select-value {
1368
1348
  min-width: 0;
1369
1349
  overflow: hidden;
@@ -1413,11 +1393,6 @@ select.orb-inp {
1413
1393
  font-weight: 500;
1414
1394
  }
1415
1395
 
1416
- .orb-select-option[data-disabled] {
1417
- color: var(--orb-disabled-fg);
1418
- cursor: not-allowed;
1419
- }
1420
-
1421
1396
  .orb-select-check {
1422
1397
  width: 14px;
1423
1398
  height: 14px;
@@ -1430,8 +1405,8 @@ select.orb-inp {
1430
1405
 
1431
1406
  .orb-tooltip {
1432
1407
  z-index: 1310;
1433
- background: #01091a;
1434
- color: #ffffff;
1408
+ background: var(--orb-inverse-surface);
1409
+ color: var(--orb-inverse-fg);
1435
1410
  border-radius: 8px;
1436
1411
  padding: 6px 10px;
1437
1412
  font: 500 12px/1.4 var(--orb-font);
@@ -1473,6 +1448,11 @@ select.orb-inp {
1473
1448
  transition: background var(--orb-t-fast), color var(--orb-t-fast);
1474
1449
  }
1475
1450
  .orb-cal-day:hover:not(:disabled):not(.orb-is-selected) { background: var(--orb-hover); }
1451
+ /* Shared disabled state — position preserved for cascade (must stay after
1452
+ .orb-select-option[data-state="checked"], before .orb-cal-day.orb-is-outside). */
1453
+ .orb-icon-btn:disabled,
1454
+ .orb-menu-item[data-disabled],
1455
+ .orb-select-option[data-disabled],
1476
1456
  .orb-cal-day:disabled { color: var(--orb-disabled-fg); cursor: not-allowed; }
1477
1457
  .orb-cal-day.orb-is-outside { color: var(--orb-muted); opacity: 0.6; }
1478
1458
  .orb-cal-day.orb-is-today { box-shadow: inset 0 0 0 1px var(--orb-primary); }
@@ -1482,30 +1462,52 @@ select.orb-inp {
1482
1462
  .orb-cal-day.orb-is-range-end { background: var(--orb-primary); color: var(--orb-on-primary); border-radius: 0 50% 50% 0; }
1483
1463
  .orb-cal-day.orb-is-range-start.orb-is-range-end { border-radius: 50%; }
1484
1464
 
1485
- /* ---------- date range picker ---------- */
1465
+ /* ---------- date range picker & value help (shared field chrome) ---------- */
1486
1466
  .orb-date-range-picker,
1487
1467
  .orb-date-range-field,
1488
- .orb-date-range-field .orb-inp-adornment-wrap {
1468
+ .orb-date-range-field .orb-inp-adornment-wrap,
1469
+ .orb-date-range-input-row,
1470
+ .orb-value-help-field,
1471
+ .orb-value-help-field .orb-inp-adornment-wrap {
1489
1472
  width: 100%;
1490
1473
  }
1491
1474
 
1492
- .orb-date-range-field .orb-inp {
1475
+ .orb-date-range-field .orb-inp,
1476
+ .orb-value-help-field .orb-inp {
1493
1477
  padding-right: 44px !important;
1494
1478
  }
1495
1479
 
1496
- .orb-date-range-field .orb-inp-adornment-end {
1480
+ .orb-value-help-field.orb-value-help-has-clear .orb-inp {
1481
+ padding-right: 74px !important;
1482
+ }
1483
+
1484
+ .orb-date-range-field .orb-inp-adornment-end,
1485
+ .orb-value-help-field .orb-inp-adornment-end {
1497
1486
  right: 5px;
1498
1487
  pointer-events: auto;
1499
1488
  }
1500
1489
 
1501
- .orb-date-range-calendar-trigger {
1502
- width: 30px !important;
1503
- height: 30px !important;
1490
+ .orb-date-range-calendar-trigger,
1491
+ .orb-value-help-search-trigger,
1492
+ .orb-value-help-clear-trigger {
1504
1493
  border-radius: 7px !important;
1505
1494
  color: var(--orb-muted);
1506
1495
  }
1507
1496
 
1508
- .orb-date-range-calendar-trigger:hover {
1497
+ .orb-date-range-calendar-trigger,
1498
+ .orb-value-help-search-trigger {
1499
+ width: 30px !important;
1500
+ height: 30px !important;
1501
+ }
1502
+
1503
+ .orb-value-help-clear-trigger {
1504
+ width: 26px !important;
1505
+ height: 26px !important;
1506
+ }
1507
+
1508
+ .orb-date-range-calendar-trigger:hover,
1509
+ .orb-value-help-search-trigger:hover,
1510
+ .orb-value-help-clear-trigger:hover {
1509
1511
  background: var(--orb-hover);
1510
1512
  color: var(--orb-primary);
1511
1513
  }
@@ -1526,10 +1528,6 @@ select.orb-inp {
1526
1528
  border-bottom: 1px solid var(--orb-border);
1527
1529
  }
1528
1530
 
1529
- .orb-date-range-input-row {
1530
- width: 100%;
1531
- }
1532
-
1533
1531
  .orb-date-range-manual-field {
1534
1532
  flex: 0 0 156px;
1535
1533
  width: 156px !important;
@@ -1558,53 +1556,12 @@ select.orb-inp {
1558
1556
  }
1559
1557
  }
1560
1558
 
1561
- /* ---------- value help ---------- */
1562
- .orb-value-help-field,
1563
- .orb-value-help-field .orb-inp-adornment-wrap {
1564
- width: 100%;
1565
- }
1566
-
1567
- .orb-value-help-field .orb-inp {
1568
- padding-right: 44px !important;
1569
- }
1570
-
1571
- .orb-value-help-field.orb-value-help-has-clear .orb-inp {
1572
- padding-right: 74px !important;
1573
- }
1574
-
1575
- .orb-value-help-field .orb-inp-adornment-end {
1576
- right: 5px;
1577
- pointer-events: auto;
1578
- }
1579
-
1580
1559
  .orb-value-help-actions {
1581
1560
  display: inline-flex;
1582
1561
  align-items: center;
1583
1562
  gap: 2px;
1584
1563
  }
1585
1564
 
1586
- .orb-value-help-search-trigger,
1587
- .orb-value-help-clear-trigger {
1588
- border-radius: 7px !important;
1589
- color: var(--orb-muted);
1590
- }
1591
-
1592
- .orb-value-help-search-trigger {
1593
- width: 30px !important;
1594
- height: 30px !important;
1595
- }
1596
-
1597
- .orb-value-help-clear-trigger {
1598
- width: 26px !important;
1599
- height: 26px !important;
1600
- }
1601
-
1602
- .orb-value-help-search-trigger:hover,
1603
- .orb-value-help-clear-trigger:hover {
1604
- background: var(--orb-hover);
1605
- color: var(--orb-primary);
1606
- }
1607
-
1608
1565
  /* ---------- smart filter ---------- */
1609
1566
  .orb-smart-filter {
1610
1567
  padding: 0;
@@ -1729,10 +1686,10 @@ select.orb-inp {
1729
1686
  /* ---------- charts (SVG classes, per handoff modules §1) ---------- */
1730
1687
  .orb-axis-lbl { font: 500 11px var(--orb-font); fill: var(--orb-chart-text); }
1731
1688
  .orb-grid-ln { stroke: var(--orb-chart-grid); stroke-width: 1; }
1732
- .orb-c1 { fill: var(--orb-primary); }
1733
- .orb-c2 { fill: var(--orb-p300); }
1734
- .orb-c3 { fill: var(--orb-muted); }
1735
- .orb-c4 { fill: var(--orb-p700); }
1689
+ .orb-c1 { fill: var(--orb-chart-1); }
1690
+ .orb-c2 { fill: var(--orb-chart-2); }
1691
+ .orb-c3 { fill: var(--orb-chart-3); }
1692
+ .orb-c4 { fill: var(--orb-chart-4); }
1736
1693
  .orb-l1 { stroke: var(--orb-primary); }
1737
1694
  .orb-l2 { stroke: var(--orb-muted); }
1738
1695
  .orb-legend { display: flex; flex-wrap: wrap; gap: 14px; font: 500 12px/1 var(--orb-font); color: var(--orb-muted); }
@@ -1747,8 +1704,8 @@ select.orb-inp {
1747
1704
  }
1748
1705
  .orb-auth-brand {
1749
1706
  position: relative;
1750
- background: #01091a;
1751
- color: #ffffff;
1707
+ background: var(--orb-inverse-surface);
1708
+ color: var(--orb-inverse-fg);
1752
1709
  padding: 44px 44px 36px;
1753
1710
  display: flex;
1754
1711
  flex-direction: column;
@@ -1766,8 +1723,8 @@ select.orb-inp {
1766
1723
  pointer-events: none;
1767
1724
  }
1768
1725
  .orb-auth-claim { margin-top: auto; position: relative; }
1769
- .orb-auth-rule { width: 48px; height: 2px; background: #fc4c02; border-radius: 2px; margin-bottom: 18px; }
1770
- .orb-auth-claim h2 { font: 600 30px/1.25 var(--orb-font); color: #ffffff; max-width: 320px; margin: 0; }
1726
+ .orb-auth-rule { width: 48px; height: 2px; background: var(--orb-accent); border-radius: 2px; margin-bottom: 18px; }
1727
+ .orb-auth-claim h2 { font: 600 30px/1.25 var(--orb-font); color: var(--orb-inverse-fg); max-width: 320px; margin: 0; }
1771
1728
  .orb-auth-claim p { margin: 10px 0 0; font: 300 14px/1.55 var(--orb-font); color: rgba(255, 255, 255, 0.7); max-width: 340px; }
1772
1729
  .orb-auth-meta { margin-top: 36px; font: 500 10px/1.6 var(--orb-font); letter-spacing: 0.1em; text-transform: uppercase; color: rgba(255, 255, 255, 0.45); }
1773
1730
  .orb-auth-form {
@@ -1863,6 +1820,18 @@ select.orb-inp {
1863
1820
  overflow: hidden;
1864
1821
  }
1865
1822
 
1823
+ .orb-app-header-default-logo {
1824
+ width: 36px;
1825
+ height: 36px;
1826
+ flex: 0 0 36px;
1827
+ display: inline-flex;
1828
+ align-items: center;
1829
+ justify-content: center;
1830
+ border-radius: 6px;
1831
+ background: var(--orb-primary);
1832
+ color: var(--orb-on-primary);
1833
+ }
1834
+
1866
1835
  .orb-app-header-brand > img {
1867
1836
  max-height: 48px;
1868
1837
  }
@@ -1909,18 +1878,8 @@ select.orb-inp {
1909
1878
  color: var(--orb-muted);
1910
1879
  }
1911
1880
 
1912
- .orb-app-header-ai-action:hover:not(:disabled) {
1913
- background: var(--orb-hover);
1914
- color: var(--orb-primary);
1915
- }
1916
-
1917
- .orb-app-header-ai-action:focus-visible {
1918
- outline: 2px solid var(--orb-focus-solid);
1919
- outline-offset: 1px;
1920
- }
1921
-
1922
1881
  .orb-app-header-ai-input {
1923
- font-family: "Montserrat", "Noto Sans CJK SC", "Noto Sans CJK JP", "PingFang SC", "Hiragino Sans", "Yu Gothic UI", system-ui, sans-serif !important;
1882
+ font-family: var(--orb-font-brand), "Noto Sans CJK SC", "Noto Sans CJK JP", "PingFang SC", "Hiragino Sans", "Yu Gothic UI", system-ui, sans-serif !important;
1924
1883
  font-size: 14px !important;
1925
1884
  font-weight: 400 !important;
1926
1885
  line-height: 1.4 !important;
@@ -1969,6 +1928,7 @@ button.orb-app-header-locale {
1969
1928
  cursor: pointer;
1970
1929
  }
1971
1930
 
1931
+ .orb-app-header-ai-action:hover:not(:disabled),
1972
1932
  button.orb-app-header-locale:hover,
1973
1933
  .orb-app-header-theme:hover {
1974
1934
  background: var(--orb-hover);
@@ -2013,12 +1973,6 @@ button.orb-app-header-locale:hover,
2013
1973
  background: var(--orb-hover);
2014
1974
  }
2015
1975
 
2016
- .orb-app-header-user-trigger:focus-visible,
2017
- .orb-app-header-locale:focus-visible {
2018
- outline: 2px solid var(--orb-focus-solid);
2019
- outline-offset: 2px;
2020
- }
2021
-
2022
1976
  .orb-app-header-user-copy {
2023
1977
  min-width: 0;
2024
1978
  display: flex;
@@ -2099,19 +2053,69 @@ button.orb-app-header-locale:hover,
2099
2053
  }
2100
2054
  }
2101
2055
 
2056
+ /* ---------- navigation island v2 tokens ---------- */
2057
+ /* Brand-linked values derive from --orb-primary/--orb-accent/--orb-nav-focus;
2058
+ theme packs may override any of these explicitly. */
2059
+ :root {
2060
+ --orb-nav-bg: rgba(250, 252, 255, 0.96);
2061
+ --orb-nav-bg-image: linear-gradient(180deg, rgba(255, 255, 255, 0.96), rgba(244, 248, 253, 0.96));
2062
+ --orb-nav-border: #cbd7e7;
2063
+ --orb-nav-shadow: 0 1px 0 rgba(255, 255, 255, 0.95) inset, 0 14px 34px rgba(1, 20, 50, 0.12), 0 2px 8px rgba(1, 20, 50, 0.08);
2064
+ --orb-nav-input-border: #d6dfeb;
2065
+ --orb-nav-input-bg: rgba(255, 255, 255, 0.9);
2066
+ --orb-nav-input-fg: #0b2343;
2067
+ --orb-nav-focus: #2878c8;
2068
+ --orb-nav-focus-ring: color-mix(in oklch, var(--orb-nav-focus) 14%, transparent);
2069
+ --orb-nav-scrollbar: color-mix(in oklch, var(--orb-primary) 25%, transparent);
2070
+ --orb-nav-footer-border: #dce4ee;
2071
+ --orb-nav-item-fg: #344861;
2072
+ --orb-nav-item-hover-border: #d7e1ed;
2073
+ --orb-nav-item-hover-bg: #edf3fa;
2074
+ --orb-nav-item-hover-fg: #0b2343;
2075
+ --orb-nav-active-border: color-mix(in oklch, var(--orb-primary) 16%, transparent);
2076
+ --orb-nav-active-bg: linear-gradient(90deg, color-mix(in oklch, var(--orb-primary) 11%, transparent), color-mix(in oklch, var(--orb-nav-focus) 3.5%, transparent));
2077
+ --orb-nav-active-fg: var(--orb-primary);
2078
+ --orb-nav-active-bar: var(--orb-accent);
2079
+ --orb-nav-pin-fg: #a7b1bf;
2080
+ --orb-nav-pin-hover-bg: color-mix(in oklch, var(--orb-primary) 7%, transparent);
2081
+ --orb-nav-pin-hover-fg: var(--orb-primary);
2082
+ --orb-nav-pin-pinned-fg: var(--orb-primary);
2083
+ --orb-nav-utility-fg: #344861;
2084
+ }
2085
+
2086
+ .orb-dark,
2087
+ [data-orb-mode="dark"] {
2088
+ --orb-nav-bg: rgba(8, 20, 38, 0.96);
2089
+ --orb-nav-bg-image: linear-gradient(180deg, rgba(12, 29, 52, 0.97), rgba(5, 16, 32, 0.97));
2090
+ --orb-nav-border: #283b55;
2091
+ --orb-nav-shadow: 0 1px 0 rgba(255, 255, 255, 0.08) inset, 0 18px 44px rgba(0, 0, 0, 0.42);
2092
+ --orb-nav-input-border: #30455f;
2093
+ --orb-nav-input-bg: rgba(5, 16, 32, 0.78);
2094
+ --orb-nav-input-fg: #f3f7fc;
2095
+ --orb-nav-footer-border: #263b55;
2096
+ --orb-nav-item-fg: #c6d2e1;
2097
+ --orb-nav-item-hover-border: #304965;
2098
+ --orb-nav-item-hover-bg: rgba(36, 69, 105, 0.42);
2099
+ --orb-nav-item-hover-fg: #ffffff;
2100
+ --orb-nav-active-border: rgba(110, 174, 235, 0.24);
2101
+ --orb-nav-active-bg: linear-gradient(90deg, rgba(54, 130, 206, 0.24), rgba(54, 130, 206, 0.04));
2102
+ --orb-nav-active-fg: #a9d2f7;
2103
+ --orb-nav-pin-fg: #71839a;
2104
+ --orb-nav-pin-hover-bg: rgba(145, 168, 209, 0.1);
2105
+ --orb-nav-pin-hover-fg: #91a8d1;
2106
+ --orb-nav-pin-pinned-fg: #91a8d1;
2107
+ --orb-nav-utility-fg: #9fb0c4;
2108
+ }
2109
+
2102
2110
  /* ---------- navigation island v2 ---------- */
2103
2111
  .orb-navigation-island-v2 {
2104
2112
  isolation: isolate;
2105
2113
  overflow: visible;
2106
- border: 1px solid #cbd7e7 !important;
2114
+ border: 1px solid var(--orb-nav-border) !important;
2107
2115
  border-radius: var(--orb-r-container) !important;
2108
- background-color: rgba(250, 252, 255, 0.96) !important;
2109
- background-image:
2110
- linear-gradient(180deg, rgba(255, 255, 255, 0.96), rgba(244, 248, 253, 0.96)) !important;
2111
- box-shadow:
2112
- 0 1px 0 rgba(255, 255, 255, 0.95) inset,
2113
- 0 14px 34px rgba(1, 20, 50, 0.12),
2114
- 0 2px 8px rgba(1, 20, 50, 0.08) !important;
2116
+ background-color: var(--orb-nav-bg) !important;
2117
+ background-image: var(--orb-nav-bg-image) !important;
2118
+ box-shadow: var(--orb-nav-shadow) !important;
2115
2119
  backdrop-filter: blur(22px) saturate(150%) !important;
2116
2120
  -webkit-backdrop-filter: blur(22px) saturate(150%) !important;
2117
2121
  }
@@ -2128,64 +2132,64 @@ button.orb-app-header-locale:hover,
2128
2132
  .orb-navigation-island-v2 input[type="text"],
2129
2133
  .orb-navigation-island-v2 input[type="search"] {
2130
2134
  height: 38px;
2131
- border: 1px solid #d6dfeb !important;
2135
+ border: 1px solid var(--orb-nav-input-border) !important;
2132
2136
  border-radius: 10px !important;
2133
- background: rgba(255, 255, 255, 0.9) !important;
2134
- color: #0b2343 !important;
2137
+ background: var(--orb-nav-input-bg) !important;
2138
+ color: var(--orb-nav-input-fg) !important;
2135
2139
  box-shadow: 0 1px 2px rgba(1, 20, 50, 0.04) inset;
2136
2140
  }
2137
2141
 
2138
2142
  .orb-navigation-island-v2 input[type="text"]:focus,
2139
2143
  .orb-navigation-island-v2 input[type="search"]:focus {
2140
- border-color: #2878c8 !important;
2141
- box-shadow: 0 0 0 3px rgba(40, 120, 200, 0.14) !important;
2144
+ border-color: var(--orb-nav-focus) !important;
2145
+ box-shadow: 0 0 0 3px var(--orb-nav-focus-ring) !important;
2142
2146
  }
2143
2147
 
2144
2148
  .orb-navigation-island-v2 nav {
2145
- scrollbar-color: rgba(21, 65, 148, 0.25) transparent;
2149
+ scrollbar-color: var(--orb-nav-scrollbar) transparent;
2146
2150
  scrollbar-width: thin;
2147
2151
  }
2148
2152
 
2149
2153
  .orb-navigation-island-v2-footer {
2150
- border-color: #dce4ee;
2154
+ border-color: var(--orb-nav-footer-border);
2151
2155
  }
2152
2156
 
2153
2157
  .orb-navigation-island-v2 .tree-menu-item > button:not(.orb-navigation-pin-button) {
2154
2158
  min-height: 40px;
2155
2159
  border: 1px solid transparent;
2156
2160
  border-radius: 10px !important;
2157
- color: #344861 !important;
2161
+ color: var(--orb-nav-item-fg) !important;
2158
2162
  }
2159
2163
 
2160
2164
  .orb-navigation-island-v2 .tree-menu-item > button:not(.orb-navigation-pin-button):hover {
2161
- border-color: #d7e1ed;
2162
- background: #edf3fa !important;
2163
- color: #0b2343 !important;
2165
+ border-color: var(--orb-nav-item-hover-border);
2166
+ background: var(--orb-nav-item-hover-bg) !important;
2167
+ color: var(--orb-nav-item-hover-fg) !important;
2164
2168
  }
2165
2169
 
2166
2170
  .orb-navigation-island-v2 .tree-menu-item:has(> div.absolute.left-0) > button:not(.orb-navigation-pin-button) {
2167
- border-color: rgba(21, 65, 148, 0.16);
2168
- background: linear-gradient(90deg, rgba(21, 65, 148, 0.11), rgba(40, 120, 200, 0.035)) !important;
2169
- color: #154194 !important;
2171
+ border-color: var(--orb-nav-active-border);
2172
+ background: var(--orb-nav-active-bg) !important;
2173
+ color: var(--orb-nav-active-fg) !important;
2170
2174
  }
2171
2175
 
2172
2176
  .orb-navigation-island-v2 .tree-menu-item > button.orb-navigation-pin-button {
2173
2177
  min-height: 0;
2174
2178
  border: 0;
2175
2179
  background: transparent !important;
2176
- color: #a7b1bf !important;
2180
+ color: var(--orb-nav-pin-fg) !important;
2177
2181
  box-shadow: none;
2178
2182
  }
2179
2183
 
2180
2184
  .orb-navigation-island-v2 .tree-menu-item > button.orb-navigation-pin-button:hover {
2181
- background: rgba(21, 65, 148, 0.07) !important;
2182
- color: #154194 !important;
2185
+ background: var(--orb-nav-pin-hover-bg) !important;
2186
+ color: var(--orb-nav-pin-hover-fg) !important;
2183
2187
  }
2184
2188
 
2185
2189
  .orb-navigation-island-v2 .tree-menu-item > button.orb-navigation-pin-button.orb-is-pinned,
2186
2190
  .orb-navigation-island-v2 .tree-menu-item > button.orb-navigation-pin-button.orb-is-pinned:hover {
2187
2191
  background: transparent !important;
2188
- color: #154194 !important;
2192
+ color: var(--orb-nav-pin-pinned-fg) !important;
2189
2193
  }
2190
2194
 
2191
2195
  .orb-navigation-island-v2 .tree-menu-item > div.absolute.left-0 {
@@ -2193,77 +2197,16 @@ button.orb-app-header-locale:hover,
2193
2197
  bottom: 7px !important;
2194
2198
  width: 4px !important;
2195
2199
  border-radius: 0 4px 4px 0 !important;
2196
- background: #fc4c02 !important;
2197
- }
2198
-
2199
- .orb-dark .orb-navigation-island-v2,
2200
- [data-orb-mode="dark"] .orb-navigation-island-v2 {
2201
- border-color: #283b55 !important;
2202
- background-color: rgba(8, 20, 38, 0.96) !important;
2203
- background-image: linear-gradient(180deg, rgba(12, 29, 52, 0.97), rgba(5, 16, 32, 0.97)) !important;
2204
- box-shadow:
2205
- 0 1px 0 rgba(255, 255, 255, 0.08) inset,
2206
- 0 18px 44px rgba(0, 0, 0, 0.42) !important;
2207
- }
2208
-
2209
- .orb-dark .orb-navigation-island-v2 input[type="text"],
2210
- .orb-dark .orb-navigation-island-v2 input[type="search"],
2211
- [data-orb-mode="dark"] .orb-navigation-island-v2 input[type="text"],
2212
- [data-orb-mode="dark"] .orb-navigation-island-v2 input[type="search"] {
2213
- border-color: #30455f !important;
2214
- background: rgba(5, 16, 32, 0.78) !important;
2215
- color: #f3f7fc !important;
2216
- }
2217
-
2218
- .orb-dark .orb-navigation-island-v2-footer,
2219
- [data-orb-mode="dark"] .orb-navigation-island-v2-footer {
2220
- border-color: #263b55;
2200
+ background: var(--orb-nav-active-bar) !important;
2221
2201
  }
2222
2202
 
2203
+ /* Dark mode is handled by the .orb-dark token block above; only the utility
2204
+ buttons (untokenized in light) need a dark-scoped rule. */
2223
2205
  .orb-dark .orb-navigation-island-v2 > button,
2224
2206
  .orb-dark .orb-navigation-island-v2 nav > div > button,
2225
2207
  [data-orb-mode="dark"] .orb-navigation-island-v2 > button,
2226
2208
  [data-orb-mode="dark"] .orb-navigation-island-v2 nav > div > button {
2227
- color: #9fb0c4;
2228
- }
2229
-
2230
- .orb-dark .orb-navigation-island-v2 .tree-menu-item > button:not(.orb-navigation-pin-button),
2231
- [data-orb-mode="dark"] .orb-navigation-island-v2 .tree-menu-item > button:not(.orb-navigation-pin-button) {
2232
- color: #c6d2e1 !important;
2233
- }
2234
-
2235
- .orb-dark .orb-navigation-island-v2 .tree-menu-item > button:not(.orb-navigation-pin-button):hover,
2236
- [data-orb-mode="dark"] .orb-navigation-island-v2 .tree-menu-item > button:not(.orb-navigation-pin-button):hover {
2237
- border-color: #304965;
2238
- background: rgba(36, 69, 105, 0.42) !important;
2239
- color: #ffffff !important;
2240
- }
2241
-
2242
- .orb-dark .orb-navigation-island-v2 .tree-menu-item:has(> div.absolute.left-0) > button:not(.orb-navigation-pin-button),
2243
- [data-orb-mode="dark"] .orb-navigation-island-v2 .tree-menu-item:has(> div.absolute.left-0) > button:not(.orb-navigation-pin-button) {
2244
- border-color: rgba(110, 174, 235, 0.24);
2245
- background: linear-gradient(90deg, rgba(54, 130, 206, 0.24), rgba(54, 130, 206, 0.04)) !important;
2246
- color: #a9d2f7 !important;
2247
- }
2248
-
2249
- .orb-dark .orb-navigation-island-v2 .tree-menu-item > button.orb-navigation-pin-button,
2250
- [data-orb-mode="dark"] .orb-navigation-island-v2 .tree-menu-item > button.orb-navigation-pin-button {
2251
- background: transparent !important;
2252
- color: #71839a !important;
2253
- }
2254
-
2255
- .orb-dark .orb-navigation-island-v2 .tree-menu-item > button.orb-navigation-pin-button:hover,
2256
- [data-orb-mode="dark"] .orb-navigation-island-v2 .tree-menu-item > button.orb-navigation-pin-button:hover {
2257
- background: rgba(145, 168, 209, 0.1) !important;
2258
- color: #91a8d1 !important;
2259
- }
2260
-
2261
- .orb-dark .orb-navigation-island-v2 .tree-menu-item > button.orb-navigation-pin-button.orb-is-pinned,
2262
- .orb-dark .orb-navigation-island-v2 .tree-menu-item > button.orb-navigation-pin-button.orb-is-pinned:hover,
2263
- [data-orb-mode="dark"] .orb-navigation-island-v2 .tree-menu-item > button.orb-navigation-pin-button.orb-is-pinned,
2264
- [data-orb-mode="dark"] .orb-navigation-island-v2 .tree-menu-item > button.orb-navigation-pin-button.orb-is-pinned:hover {
2265
- background: transparent !important;
2266
- color: #91a8d1 !important;
2209
+ color: var(--orb-nav-utility-fg);
2267
2210
  }
2268
2211
 
2269
2212
  /* ---------- agent UI (AIPanel) ---------- */
@@ -2347,22 +2290,6 @@ button.orb-app-header-locale:hover,
2347
2290
  color: var(--orb-muted);
2348
2291
  }
2349
2292
 
2350
- .orb-agent-spinner {
2351
- flex: none;
2352
- width: 12px;
2353
- height: 12px;
2354
- border-radius: 50%;
2355
- border: 2px solid var(--orb-p100);
2356
- border-top-color: var(--orb-primary);
2357
- animation: orb-agent-rot 1s linear infinite;
2358
- }
2359
-
2360
- @keyframes orb-agent-rot {
2361
- to {
2362
- transform: rotate(360deg);
2363
- }
2364
- }
2365
-
2366
2293
  .orb-agent-caret {
2367
2294
  display: inline-block;
2368
2295
  width: 2px;