@zolomedia/bifrost-client 1.7.79 → 1.7.81

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 (2) hide show
  1. package/package.json +1 -1
  2. package/zSys/theme/zbase.css +137 -111
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zolomedia/bifrost-client",
3
- "version": "1.7.79",
3
+ "version": "1.7.81",
4
4
  "description": "Browser client for zBifrost — the WebSocket bridge that turns JSON events from a zOS server into live DOM. Thin bootstrap + server-controlled core.",
5
5
  "homepage": "https://github.com/ZoloAi/zbifrost-client#readme",
6
6
  "repository": {
@@ -32,6 +32,17 @@
32
32
  --color-success: #52B788; /* Manifestation — organic & vibrant */
33
33
  --color-warning: #FFB347; /* Caution — warm & approachable */
34
34
  --color-error: #E63946; /* Decisive — clear & strong */
35
+
36
+ /* Neutral foundation — surfaces, ink & lines on the dark zOS canvas.
37
+ * SSOT for every NON-accent value so no component carries raw rgba/hex.
38
+ * Apps re-skin the whole chrome by redefining these once. */
39
+ --ink: #f9fafb; /* primary text on dark */
40
+ --ink-muted: rgba(255, 255, 255, 0.65); /* secondary / captions */
41
+ --surface-1: rgba(255, 255, 255, 0.04); /* raised panel */
42
+ --surface-2: rgba(255, 255, 255, 0.08); /* input / hover fill */
43
+ --border: rgba(255, 255, 255, 0.12); /* hairline divider */
44
+ --border-strong: rgba(255, 255, 255, 0.18); /* field / control outline*/
45
+ --shadow: rgba(0, 0, 0, 0.20); /* ambient drop shadow */
35
46
  }
36
47
 
37
48
  /* ─── 1. Reset ─────────────────────────────────────────────────────────────── */
@@ -148,8 +159,8 @@ code:not(pre code) {
148
159
  font-size: 0.88em;
149
160
  font-weight: 600;
150
161
  color: var(--color-code, #5CA9FF);
151
- background: rgba(92, 169, 255, 0.12);
152
- border: 1px solid rgba(92, 169, 255, 0.25);
162
+ background: color-mix(in srgb, var(--color-info) 12%, transparent);
163
+ border: 1px solid color-mix(in srgb, var(--color-info) 25%, transparent);
153
164
  border-radius: 5px;
154
165
  padding: 0.1em 0.4em;
155
166
  letter-spacing: -0.01em;
@@ -208,9 +219,9 @@ input.zInput, textarea.zInput, select.zInput {
208
219
  font-family: inherit;
209
220
  font-size: 0.95rem;
210
221
  line-height: 1.5;
211
- color: var(--zinput-color, #e2e8f0);
212
- background: var(--zinput-bg, rgba(255, 255, 255, 0.14));
213
- border: 1.5px solid var(--zinput-border, rgba(255, 255, 255, 0.18));
222
+ color: var(--zinput-color, var(--ink));
223
+ background: var(--zinput-bg, color-mix(in srgb, var(--ink) 14%, transparent));
224
+ border: 1.5px solid var(--zinput-border, var(--border-strong));
214
225
  border-radius: var(--zinput-radius, 10px);
215
226
  transition: border-color 0.18s, background 0.18s, box-shadow 0.18s;
216
227
  }
@@ -221,9 +232,9 @@ input.zInput, textarea.zInput, select.zInput {
221
232
  .zForm-control:focus,
222
233
  input.zInput:focus, textarea.zInput:focus, select.zInput:focus {
223
234
  outline: none;
224
- border-color: var(--zinput-focus, var(--color-primary, #6366f1));
225
- background: var(--zinput-bg-focus, rgba(255, 255, 255, 0.17));
226
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--zinput-focus, var(--color-primary, #6366f1)) 20%, transparent);
235
+ border-color: var(--zinput-focus, var(--color-primary));
236
+ background: var(--zinput-bg-focus, color-mix(in srgb, var(--ink) 17%, transparent));
237
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--zinput-focus, var(--color-primary)) 20%, transparent);
227
238
  }
228
239
 
229
240
  .zForm-control:disabled, .zForm-control[readonly],
@@ -274,7 +285,7 @@ input[type="file"].zInput::file-selector-button {
274
285
  padding: 0.45rem 1rem;
275
286
  border: 0;
276
287
  border-radius: 8px;
277
- background: var(--zinput-accent, #4f46e5);
288
+ background: var(--zinput-accent, var(--color-secondary));
278
289
  color: #fff;
279
290
  font-family: inherit;
280
291
  font-size: 0.85rem;
@@ -304,7 +315,7 @@ input[type="color"].zInput {
304
315
  }
305
316
  input[type="color"].zForm-control:hover,
306
317
  input[type="color"].zInput:hover {
307
- border-color: var(--zinput-border-hover, rgba(255, 255, 255, 0.3));
318
+ border-color: var(--zinput-border-hover, color-mix(in srgb, var(--ink) 30%, transparent));
308
319
  }
309
320
  input[type="color"].zForm-control::-webkit-color-swatch-wrapper,
310
321
  input[type="color"].zInput::-webkit-color-swatch-wrapper { padding: 0; }
@@ -345,9 +356,9 @@ input[type="datetime-local"].zForm-control::-webkit-calendar-picker-indicator:ho
345
356
  align-items: center;
346
357
  padding: 0.55rem 0.85rem;
347
358
  font-size: 0.95rem;
348
- color: var(--zinput-color, #e2e8f0);
349
- background: var(--zinput-affix-bg, rgba(79, 70, 229, 0.14));
350
- border: 1.5px solid var(--zinput-border, rgba(255, 255, 255, 0.14));
359
+ color: var(--zinput-color, var(--ink));
360
+ background: var(--zinput-affix-bg, color-mix(in srgb, var(--color-secondary) 14%, transparent));
361
+ border: 1.5px solid var(--zinput-border, color-mix(in srgb, var(--ink) 14%, transparent));
351
362
  white-space: nowrap;
352
363
  }
353
364
  .zInputGroup > .zInputGroup-text:first-child { border-radius: 10px 0 0 10px; border-right: 0; }
@@ -380,8 +391,8 @@ input[type="datetime-local"].zForm-control::-webkit-calendar-picker-indicator:ho
380
391
  margin: 0;
381
392
  display: inline-grid;
382
393
  place-content: center;
383
- background: var(--zinput-bg, rgba(255, 255, 255, 0.14));
384
- border: 1.5px solid var(--zinput-border, rgba(255, 255, 255, 0.3));
394
+ background: var(--zinput-bg, color-mix(in srgb, var(--ink) 14%, transparent));
395
+ border: 1.5px solid var(--zinput-border, color-mix(in srgb, var(--ink) 30%, transparent));
385
396
  cursor: pointer;
386
397
  transition: border-color 0.18s, background 0.18s, box-shadow 0.18s;
387
398
  }
@@ -393,8 +404,8 @@ input[type="datetime-local"].zForm-control::-webkit-calendar-picker-indicator:ho
393
404
  .zForm-check input[type="checkbox"]:checked,
394
405
  .zForm-check input[type="radio"]:checked,
395
406
  .zForm-check-input:checked {
396
- background: var(--zinput-focus, var(--color-primary, #6366f1));
397
- border-color: var(--zinput-focus, var(--color-primary, #6366f1));
407
+ background: var(--zinput-focus, var(--color-primary));
408
+ border-color: var(--zinput-focus, var(--color-primary));
398
409
  }
399
410
  /* checkmark glyph */
400
411
  .zForm-check input[type="checkbox"]:checked::after,
@@ -423,7 +434,7 @@ input[type="datetime-local"].zForm-control::-webkit-calendar-picker-indicator:ho
423
434
  .zForm-check input[type="radio"]:focus-visible,
424
435
  .zForm-check-input:focus-visible {
425
436
  outline: none;
426
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--zinput-focus, var(--color-primary, #6366f1)) 30%, transparent);
437
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--zinput-focus, var(--color-primary)) 30%, transparent);
427
438
  }
428
439
 
429
440
  .zForm-check-label {
@@ -442,7 +453,7 @@ input[type="datetime-local"].zForm-control::-webkit-calendar-picker-indicator:ho
442
453
 
443
454
  /* native radios/checkboxes NOT given the custom .zForm-check treatment
444
455
  * still pick up the theme color (belt-and-braces — groups now emit .zForm-check). */
445
- input[type="radio"], input[type="checkbox"] { accent-color: var(--color-primary, #6366f1); }
456
+ input[type="radio"], input[type="checkbox"] { accent-color: var(--color-primary); }
446
457
 
447
458
  /* radio / checkbox group (zSelect type:radio|checkbox) — legend + row rhythm */
448
459
  .zForm-check-group .zLabel { margin-bottom: 0.45rem; }
@@ -464,9 +475,9 @@ select.zInput {
464
475
  font-family: inherit;
465
476
  font-size: 0.95rem;
466
477
  line-height: 1.5;
467
- color: var(--zinput-color, #e2e8f0);
468
- background-color: var(--zinput-bg, rgba(255, 255, 255, 0.14));
469
- border: 1.5px solid var(--zinput-border, rgba(255, 255, 255, 0.18));
478
+ color: var(--zinput-color, var(--ink));
479
+ background-color: var(--zinput-bg, color-mix(in srgb, var(--ink) 14%, transparent));
480
+ border: 1.5px solid var(--zinput-border, var(--border-strong));
470
481
  border-radius: var(--zinput-radius, 10px);
471
482
  cursor: pointer;
472
483
  transition: border-color 0.18s, background 0.18s, box-shadow 0.18s;
@@ -481,9 +492,9 @@ select.zSelect:focus,
481
492
  select.zForm-control:focus,
482
493
  select.zInput:focus {
483
494
  outline: none;
484
- border-color: var(--zinput-focus, var(--color-primary, #6366f1));
485
- background-color: var(--zinput-bg-focus, rgba(255, 255, 255, 0.17));
486
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--zinput-focus, var(--color-primary, #6366f1)) 20%, transparent);
495
+ border-color: var(--zinput-focus, var(--color-primary));
496
+ background-color: var(--zinput-bg-focus, color-mix(in srgb, var(--ink) 17%, transparent));
497
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--zinput-focus, var(--color-primary)) 20%, transparent);
487
498
  }
488
499
 
489
500
  select.zSelect:disabled,
@@ -495,7 +506,7 @@ select.zSelect option,
495
506
  select.zForm-control option,
496
507
  select.zInput option { color: #1f2937; background: #fff; }
497
508
  select.zSelect option:disabled,
498
- select.zForm-control option:disabled { color: #9ca3af; }
509
+ select.zForm-control option:disabled { color: var(--ink-muted); }
499
510
 
500
511
  /* multi-select / sized list box — themed box, no caret, themed inline options */
501
512
  select.zSelect[multiple],
@@ -509,7 +520,7 @@ select.zForm-control[multiple] {
509
520
  select.zSelect[multiple] option,
510
521
  select.zSelect[size] option,
511
522
  select.zForm-control[multiple] option {
512
- color: var(--zinput-color, #e2e8f0);
523
+ color: var(--zinput-color, var(--ink));
513
524
  background: transparent;
514
525
  padding: 0.35rem 0.55rem;
515
526
  border-radius: 6px;
@@ -520,7 +531,7 @@ select.zSelect[multiple] option:checked,
520
531
  select.zSelect[size] option:checked,
521
532
  select.zForm-control[multiple] option:checked {
522
533
  color: #fff;
523
- background: linear-gradient(var(--color-primary, #6366f1), var(--color-primary, #6366f1));
534
+ background: linear-gradient(var(--color-primary), var(--color-primary));
524
535
  }
525
536
  select.zSelect[multiple] option:disabled,
526
537
  select.zForm-control[multiple] option:disabled { color: var(--zinput-placeholder, rgba(156, 163, 175, 0.55)); }
@@ -539,9 +550,9 @@ zBifrostBadge {
539
550
 
540
551
  /* ─── zBifrostBadge states ─────────────────────────────────────────────────── */
541
552
 
542
- .zBadge-pending { color: #fbbf24; }
543
- .zBadge-success { color: #34d399; }
544
- .zBadge-error { color: #f87171; }
553
+ .zBadge-pending { color: var(--color-warning); }
554
+ .zBadge-success { color: var(--color-success); }
555
+ .zBadge-error { color: var(--color-error); }
545
556
  .zBadge-dot { border-radius: 50%; background: currentColor; }
546
557
  .zIcon { display: inline-block; width: 0.75em; height: 0.75em; fill: currentColor; }
547
558
 
@@ -579,7 +590,7 @@ zNavBar .zNavbar {
579
590
  flex-wrap: wrap;
580
591
  padding: 0.75rem 1.5rem;
581
592
  background: var(--znav-bg, rgba(10, 14, 39, 0.92));
582
- border-bottom: 1px solid var(--znav-border, rgba(79, 70, 229, 0.15));
593
+ border-bottom: 1px solid var(--znav-border, color-mix(in srgb, var(--color-secondary) 15%, transparent));
583
594
  backdrop-filter: blur(12px);
584
595
  font-family: var(--znav-font, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif);
585
596
  }
@@ -589,7 +600,7 @@ zNavBar .zNavbar-brand {
589
600
  font-weight: 800;
590
601
  letter-spacing: -0.02em;
591
602
  margin-right: 2rem;
592
- color: var(--znav-brand-color, #f9fafb);
603
+ color: var(--znav-brand-color, var(--ink));
593
604
  }
594
605
 
595
606
  zNavBar .zNavbar-toggler {
@@ -599,9 +610,9 @@ zNavBar .zNavbar-toggler {
599
610
  font-size: 1.1rem;
600
611
  line-height: 1;
601
612
  cursor: pointer;
602
- color: var(--znav-brand-color, #f9fafb);
603
- background: var(--znav-link-hover-bg, rgba(79, 70, 229, 0.15));
604
- border: 1px solid var(--znav-border, rgba(79, 70, 229, 0.3));
613
+ color: var(--znav-brand-color, var(--ink));
614
+ background: var(--znav-link-hover-bg, color-mix(in srgb, var(--color-secondary) 15%, transparent));
615
+ border: 1px solid var(--znav-border, color-mix(in srgb, var(--color-secondary) 30%, transparent));
605
616
  border-radius: 6px;
606
617
  }
607
618
 
@@ -628,14 +639,14 @@ zNavBar .zNav-link {
628
639
  font-size: 0.9rem;
629
640
  font-weight: 500;
630
641
  border-radius: 8px;
631
- color: var(--znav-link-color, #d1d5db);
642
+ color: var(--znav-link-color, var(--ink-muted));
632
643
  transition: color 0.2s, background 0.2s;
633
644
  }
634
645
 
635
646
  zNavBar .zNav-link:hover,
636
647
  zNavBar .zNav-link.active {
637
- color: var(--znav-link-hover-color, #f9fafb);
638
- background: var(--znav-link-hover-bg, rgba(79, 70, 229, 0.15));
648
+ color: var(--znav-link-hover-color, var(--ink));
649
+ background: var(--znav-link-hover-bg, color-mix(in srgb, var(--color-secondary) 15%, transparent));
639
650
  }
640
651
 
641
652
  /* ─── zDropdown (navbar menus) — JS toggles .zShow ─────────────────────────── */
@@ -649,7 +660,7 @@ zNavBar .zNav-link.active {
649
660
  min-width: 11rem;
650
661
  padding: 0.4rem 0;
651
662
  background: var(--zdropdown-bg, rgba(20, 25, 45, 0.97));
652
- border: 1px solid var(--znav-border, rgba(79, 70, 229, 0.25));
663
+ border: 1px solid var(--znav-border, color-mix(in srgb, var(--color-secondary) 25%, transparent));
653
664
  border-radius: 10px;
654
665
  box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);
655
666
  backdrop-filter: blur(12px);
@@ -660,12 +671,12 @@ zNavBar .zNav-link.active {
660
671
  display: block;
661
672
  padding: 0.5rem 1rem;
662
673
  font-size: 0.875rem;
663
- color: var(--znav-link-color, #d1d5db);
674
+ color: var(--znav-link-color, var(--ink-muted));
664
675
  transition: color 0.15s, background 0.15s;
665
676
  }
666
677
  .zDropdown-item:hover {
667
- color: var(--znav-link-hover-color, #f9fafb);
668
- background: var(--znav-link-hover-bg, rgba(79, 70, 229, 0.15));
678
+ color: var(--znav-link-hover-color, var(--ink));
679
+ background: var(--znav-link-hover-bg, color-mix(in srgb, var(--color-secondary) 15%, transparent));
669
680
  }
670
681
 
671
682
  /* ─── zNavbar-inblock — light, in-content navbar variant ────────────────────────
@@ -758,7 +769,7 @@ zNavBar .zNav-link.active {
758
769
  border: none;
759
770
  border-radius: 0;
760
771
  padding-left: 0.75rem;
761
- background: var(--znav-link-hover-bg, rgba(79, 70, 229, 0.08));
772
+ background: var(--znav-link-hover-bg, color-mix(in srgb, var(--color-secondary) 8%, transparent));
762
773
  }
763
774
  }
764
775
 
@@ -1052,9 +1063,10 @@ zNavBar .zNav-link.active {
1052
1063
  }
1053
1064
 
1054
1065
  .zText-muted { opacity: 0.6; }
1055
- .zText-dark { color: #f9fafb; }
1056
- .zBorder { border: 1px solid rgba(255, 255, 255, 0.12); }
1057
- .zShadow-sm { box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2); }
1066
+ .zText-dark { color: var(--ink); }
1067
+ .zBorder { border: 1px solid var(--border); }
1068
+ .zShadow-sm { box-shadow: 0 1px 3px var(--shadow); }
1069
+ .zBg-white { background: var(--surface-1); }
1058
1070
  .zText-center { text-align: center !important; }
1059
1071
  .zText-start { text-align: left !important; }
1060
1072
  .zText-end { text-align: right !important; }
@@ -1077,7 +1089,7 @@ zNavBar .zNav-link.active {
1077
1089
  border: 1px solid transparent;
1078
1090
  text-decoration: none;
1079
1091
  }
1080
- .zBtn:focus { outline: 2px solid rgba(79, 70, 229, 0.5); outline-offset: 2px; }
1092
+ .zBtn:focus { outline: 2px solid color-mix(in srgb, var(--color-primary) 55%, transparent); outline-offset: 2px; }
1081
1093
 
1082
1094
  /* ─── Button color variants — canonical fills (theme tokens) ───────────────── */
1083
1095
  /* The renderer maps a zBtn's `color:` (default primary) to .zBtn-{color}; these
@@ -1117,6 +1129,12 @@ zNavBar .zNav-link.active {
1117
1129
  opacity: 0.5; cursor: not-allowed; transform: none; box-shadow: none; filter: none;
1118
1130
  }
1119
1131
 
1132
+ /* Generic disabled — covers outline/plain buttons (e.g. paging First/Prev at edge)
1133
+ * so a disabled control always reads as muted and never out-ranks an active one. */
1134
+ .zBtn:disabled, .zBtn[disabled] {
1135
+ opacity: 0.45; cursor: not-allowed; transform: none; box-shadow: none;
1136
+ }
1137
+
1120
1138
  /* SSOT fills — keyed to --color-* (same tokens/hexes as .zText-*), so a button
1121
1139
  * matches a heading of the same color name. Dark text on the light hues
1122
1140
  * (primary/success/warning/info), white on the deep ones (secondary/danger). */
@@ -1138,8 +1156,16 @@ zNavBar .zNav-link.active {
1138
1156
  .zBtn-outline-success,
1139
1157
  .zBtn-outline-warning,
1140
1158
  .zBtn-outline-info {
1159
+ display: inline-flex;
1160
+ align-items: center;
1161
+ justify-content: center;
1162
+ gap: 0.35rem;
1163
+ font-family: inherit;
1164
+ font-weight: 600;
1165
+ line-height: 1.4;
1141
1166
  background: transparent;
1142
1167
  border-color: currentColor;
1168
+ transition: background 0.15s ease, transform 0.08s ease;
1143
1169
  }
1144
1170
  .zBtn-outline-primary { color: var(--color-primary, #A2D46E); }
1145
1171
  .zBtn-outline-secondary { color: var(--color-secondary, #9370DB); }
@@ -1211,7 +1237,7 @@ zNavBar .zNav-link.active {
1211
1237
  }
1212
1238
  .zDash-format-sidebar > .zRow > .zCol-auto {
1213
1239
  border-right: none !important;
1214
- border-bottom: 1px solid rgba(79, 70, 229, 0.15);
1240
+ border-bottom: 1px solid color-mix(in srgb, var(--color-secondary) 15%, transparent);
1215
1241
  }
1216
1242
  .zDash-format-sidebar .zDash-sidebar {
1217
1243
  flex-direction: row !important;
@@ -1222,7 +1248,7 @@ zNavBar .zNav-link.active {
1222
1248
  }
1223
1249
  .zDash-format-sidebar .zDash-sidebar .zNav-link.zActive {
1224
1250
  box-shadow: none !important;
1225
- border-bottom: 2px solid #4F46E5;
1251
+ border-bottom: 2px solid var(--color-secondary);
1226
1252
  }
1227
1253
  .zDash-panel { padding: 1.25rem 1rem; }
1228
1254
  .zDash-container .zDialog-form { grid-template-columns: 1fr 1fr; }
@@ -1247,7 +1273,7 @@ zNavBar .zNav-link.active {
1247
1273
  right: 0;
1248
1274
  z-index: 50;
1249
1275
  background: rgba(10, 14, 39, 0.98);
1250
- border-bottom: 1px solid rgba(79, 70, 229, 0.2);
1276
+ border-bottom: 1px solid color-mix(in srgb, var(--color-secondary) 20%, transparent);
1251
1277
  backdrop-filter: blur(12px);
1252
1278
  }
1253
1279
 
@@ -1273,18 +1299,18 @@ zNavBar .zNav-link.active {
1273
1299
  gap: 0.4rem;
1274
1300
  margin: 0.75rem 0.75rem 0;
1275
1301
  padding: 0.45rem 0.85rem;
1276
- background: rgba(79, 70, 229, 0.15);
1277
- border: 1px solid rgba(79, 70, 229, 0.3);
1302
+ background: color-mix(in srgb, var(--color-secondary) 15%, transparent);
1303
+ border: 1px solid color-mix(in srgb, var(--color-secondary) 30%, transparent);
1278
1304
  border-radius: 8px;
1279
- color: #c7d2fe;
1305
+ color: var(--ink);
1280
1306
  font-size: 0.875rem;
1281
1307
  font-weight: 500;
1282
1308
  cursor: pointer;
1283
1309
  font-family: inherit;
1284
1310
  }
1285
1311
  .zDash-sidebar-toggle:hover {
1286
- background: rgba(79, 70, 229, 0.25);
1287
- color: #e0e7ff;
1312
+ background: color-mix(in srgb, var(--color-secondary) 25%, transparent);
1313
+ color: var(--ink);
1288
1314
  }
1289
1315
 
1290
1316
  .zDash-panel { padding: 1rem 0.75rem; }
@@ -1297,7 +1323,7 @@ zNavBar .zNav-link.active {
1297
1323
  .zDash-format-tabs .zDash-sidebar {
1298
1324
  display: flex;
1299
1325
  flex-direction: row;
1300
- border-bottom: 1px solid rgba(79, 70, 229, 0.2);
1326
+ border-bottom: 1px solid color-mix(in srgb, var(--color-secondary) 20%, transparent);
1301
1327
  }
1302
1328
 
1303
1329
  /* accordion format (future) */
@@ -1312,7 +1338,7 @@ zNavBar .zNav-link.active {
1312
1338
  /* Sidebar column chrome */
1313
1339
  .zDash-format-sidebar > .zRow > .zCol-auto {
1314
1340
  background: rgba(10, 14, 39, 0.6);
1315
- border-right: 1px solid rgba(79, 70, 229, 0.15);
1341
+ border-right: 1px solid color-mix(in srgb, var(--color-secondary) 15%, transparent);
1316
1342
  padding: 0;
1317
1343
  }
1318
1344
 
@@ -1329,7 +1355,7 @@ zNavBar .zNav-link.active {
1329
1355
  align-items: center;
1330
1356
  padding: 0.55rem 0.85rem;
1331
1357
  border-radius: 8px;
1332
- color: #94a3b8;
1358
+ color: var(--ink-muted);
1333
1359
  font-size: 0.875rem;
1334
1360
  font-weight: 500;
1335
1361
  cursor: pointer;
@@ -1338,13 +1364,13 @@ zNavBar .zNav-link.active {
1338
1364
  text-decoration: none;
1339
1365
  }
1340
1366
  .zDash-sidebar .zNav-link:hover {
1341
- color: #f1f5f9;
1342
- background: rgba(79, 70, 229, 0.12);
1367
+ color: var(--ink);
1368
+ background: color-mix(in srgb, var(--color-secondary) 12%, transparent);
1343
1369
  }
1344
1370
  .zDash-sidebar .zNav-link.zActive {
1345
- color: #f9fafb;
1346
- background: rgba(79, 70, 229, 0.22);
1347
- box-shadow: inset 3px 0 0 #4F46E5;
1371
+ color: var(--ink);
1372
+ background: color-mix(in srgb, var(--color-secondary) 22%, transparent);
1373
+ box-shadow: inset 3px 0 0 var(--color-secondary);
1348
1374
  }
1349
1375
 
1350
1376
  /* Panel area */
@@ -1358,7 +1384,7 @@ zNavBar .zNav-link.active {
1358
1384
  box-sizing: border-box;
1359
1385
  margin-bottom: 1.25rem;
1360
1386
  background: rgba(15, 20, 48, 0.6);
1361
- border: 1px solid rgba(79, 70, 229, 0.15);
1387
+ border: 1px solid color-mix(in srgb, var(--color-secondary) 15%, transparent);
1362
1388
  border-radius: 10px;
1363
1389
  }
1364
1390
 
@@ -1366,10 +1392,10 @@ zNavBar .zNav-link.active {
1366
1392
  .zDash-container .zDialog-title {
1367
1393
  font-size: 1rem;
1368
1394
  font-weight: 700;
1369
- color: #c7d2fe;
1395
+ color: var(--ink);
1370
1396
  margin-bottom: 1rem;
1371
1397
  padding-bottom: 0.6rem;
1372
- border-bottom: 1px solid rgba(79, 70, 229, 0.15);
1398
+ border-bottom: 1px solid color-mix(in srgb, var(--color-secondary) 15%, transparent);
1373
1399
  }
1374
1400
 
1375
1401
  /* Multi-column form grid */
@@ -1388,7 +1414,7 @@ zNavBar .zNav-link.active {
1388
1414
  font-size: 0.7rem;
1389
1415
  text-transform: uppercase;
1390
1416
  letter-spacing: 0.06em;
1391
- color: #64748b;
1417
+ color: var(--ink-muted);
1392
1418
  font-weight: 600;
1393
1419
  display: block;
1394
1420
  margin-bottom: 0.3rem;
@@ -1397,10 +1423,10 @@ zNavBar .zNav-link.active {
1397
1423
  /* Inputs & selects */
1398
1424
  .zDash-container .zInput {
1399
1425
  appearance: none;
1400
- background: rgba(255, 255, 255, 0.04);
1401
- border: 1px solid rgba(79, 70, 229, 0.2);
1426
+ background: var(--surface-1);
1427
+ border: 1px solid color-mix(in srgb, var(--color-secondary) 20%, transparent);
1402
1428
  border-radius: 7px;
1403
- color: #e2e8f0;
1429
+ color: var(--ink);
1404
1430
  padding: 0.5rem 0.75rem;
1405
1431
  font-size: 0.875rem;
1406
1432
  width: 100%;
@@ -1410,13 +1436,13 @@ zNavBar .zNav-link.active {
1410
1436
  }
1411
1437
  .zDash-container .zInput:focus {
1412
1438
  outline: none;
1413
- border-color: rgba(79, 70, 229, 0.6);
1414
- background: rgba(255, 255, 255, 0.07);
1439
+ border-color: color-mix(in srgb, var(--color-secondary) 60%, transparent);
1440
+ background: color-mix(in srgb, var(--ink) 7%, transparent);
1415
1441
  }
1416
1442
 
1417
1443
  /* Primary action button */
1418
1444
  .zDash-container .zBtn-primary {
1419
- background: #4F46E5;
1445
+ background: var(--color-secondary);
1420
1446
  border: none;
1421
1447
  color: #fff;
1422
1448
  padding: 0.55rem 1.25rem;
@@ -1428,7 +1454,7 @@ zNavBar .zNav-link.active {
1428
1454
  transition: background 0.15s, transform 0.1s;
1429
1455
  }
1430
1456
  .zDash-container .zBtn-primary:hover {
1431
- background: #4338ca;
1457
+ background: color-mix(in srgb, var(--color-secondary) 82%, black);
1432
1458
  transform: translateY(-1px);
1433
1459
  }
1434
1460
 
@@ -1439,10 +1465,10 @@ zNavBar .zNav-link.active {
1439
1465
  gap: 0.4rem;
1440
1466
  padding: 0.5rem 1rem;
1441
1467
  margin: 0 0.4rem 0.4rem 0;
1442
- background: rgba(79, 70, 229, 0.15);
1443
- border: 1px solid rgba(79, 70, 229, 0.3);
1468
+ background: color-mix(in srgb, var(--color-secondary) 15%, transparent);
1469
+ border: 1px solid color-mix(in srgb, var(--color-secondary) 30%, transparent);
1444
1470
  border-radius: 8px;
1445
- color: #c7d2fe;
1471
+ color: var(--ink);
1446
1472
  font-size: 0.875rem;
1447
1473
  font-weight: 500;
1448
1474
  font-family: inherit;
@@ -1450,9 +1476,9 @@ zNavBar .zNav-link.active {
1450
1476
  transition: background 0.15s, border-color 0.15s, color 0.15s;
1451
1477
  }
1452
1478
  .zDash-container button[data-key]:hover {
1453
- background: rgba(79, 70, 229, 0.3);
1454
- border-color: rgba(79, 70, 229, 0.5);
1455
- color: #e0e7ff;
1479
+ background: color-mix(in srgb, var(--color-secondary) 30%, transparent);
1480
+ border-color: color-mix(in srgb, var(--color-secondary) 50%, transparent);
1481
+ color: var(--ink);
1456
1482
  }
1457
1483
 
1458
1484
  /* Tables */
@@ -1460,32 +1486,32 @@ zNavBar .zNav-link.active {
1460
1486
  width: 100%;
1461
1487
  border-collapse: collapse;
1462
1488
  font-size: 0.875rem;
1463
- color: #e2e8f0;
1489
+ color: var(--ink);
1464
1490
  }
1465
1491
  .zDash-container th {
1466
1492
  padding: 0.6rem 0.9rem;
1467
- background: rgba(79, 70, 229, 0.12);
1468
- color: #a5b4fc;
1493
+ background: color-mix(in srgb, var(--color-secondary) 12%, transparent);
1494
+ color: var(--color-secondary);
1469
1495
  font-weight: 600;
1470
1496
  text-align: left;
1471
- border-bottom: 1px solid rgba(79, 70, 229, 0.2);
1497
+ border-bottom: 1px solid color-mix(in srgb, var(--color-secondary) 20%, transparent);
1472
1498
  }
1473
1499
  .zDash-container td {
1474
1500
  padding: 0.55rem 0.9rem;
1475
- border-bottom: 1px solid rgba(255, 255, 255, 0.05);
1501
+ border-bottom: 1px solid color-mix(in srgb, var(--ink) 5%, transparent);
1476
1502
  }
1477
- .zDash-container tr:hover td { background: rgba(79, 70, 229, 0.07); }
1503
+ .zDash-container tr:hover td { background: color-mix(in srgb, var(--color-secondary) 7%, transparent); }
1478
1504
 
1479
1505
  /* Section headings */
1480
1506
  .zDash-container h2 {
1481
1507
  font-size: 1.2rem;
1482
1508
  font-weight: 700;
1483
- color: #f9fafb;
1509
+ color: var(--ink);
1484
1510
  margin: 0 0 1rem;
1485
1511
  }
1486
1512
 
1487
1513
  /* Spinner */
1488
- .zSpinner-border { color: #6366f1; }
1514
+ .zSpinner-border { color: var(--color-primary); }
1489
1515
 
1490
1516
  /* ============================================================================
1491
1517
  Tables (zTable) — canonical dark-theme data tables
@@ -1496,7 +1522,7 @@ zNavBar .zNav-link.active {
1496
1522
  .zTable-container { margin: 1.5rem 0; }
1497
1523
 
1498
1524
  .zTable-container h4 {
1499
- color: #f9fafb;
1525
+ color: var(--ink);
1500
1526
  font-size: 1.1rem;
1501
1527
  font-weight: 700;
1502
1528
  margin: 0 0 0.75rem;
@@ -1505,7 +1531,7 @@ zNavBar .zNav-link.active {
1505
1531
  .zTable-responsive {
1506
1532
  overflow-x: auto;
1507
1533
  border-radius: 12px;
1508
- border: 1px solid rgba(79, 70, 229, 0.2);
1534
+ border: 1px solid color-mix(in srgb, var(--color-secondary) 20%, transparent);
1509
1535
  }
1510
1536
 
1511
1537
  .zTable {
@@ -1517,30 +1543,30 @@ zNavBar .zNav-link.active {
1517
1543
  /* Default body text colour lives here so cells INHERIT it. Keeping it off the
1518
1544
  td selector lets a per-cell utility (zText-success/-danger…) win — a bare
1519
1545
  .zText-* class (0,1,0) would otherwise lose to `.zTable tbody td` (0,1,2). */
1520
- color: #d1d5db;
1546
+ color: var(--ink-muted);
1521
1547
  }
1522
1548
 
1523
1549
  .zTable thead th {
1524
- background: rgba(79, 70, 229, 0.18);
1525
- color: #c7d2fe;
1550
+ background: color-mix(in srgb, var(--color-secondary) 18%, transparent);
1551
+ color: var(--ink);
1526
1552
  font-weight: 700;
1527
1553
  text-align: left;
1528
1554
  padding: 0.85rem 1rem;
1529
1555
  letter-spacing: 0.02em;
1530
- border-bottom: 1px solid rgba(79, 70, 229, 0.3);
1556
+ border-bottom: 1px solid color-mix(in srgb, var(--color-secondary) 30%, transparent);
1531
1557
  white-space: nowrap;
1532
1558
  }
1533
1559
 
1534
1560
  .zTable tbody td {
1535
1561
  padding: 0.8rem 1rem;
1536
- border-bottom: 1px solid rgba(255, 255, 255, 0.06);
1562
+ border-bottom: 1px solid color-mix(in srgb, var(--ink) 6%, transparent);
1537
1563
  vertical-align: top;
1538
1564
  }
1539
1565
 
1540
1566
  .zTable tbody tr:last-child td { border-bottom: none; }
1541
- .zTable tbody tr:nth-child(even) td { background: rgba(255, 255, 255, 0.02); }
1542
- .zTable tbody tr:hover td { background: rgba(79, 70, 229, 0.08); }
1543
- .zTable td strong { color: #f9fafb; }
1567
+ .zTable tbody tr:nth-child(even) td { background: color-mix(in srgb, var(--ink) 2%, transparent); }
1568
+ .zTable tbody tr:hover td { background: color-mix(in srgb, var(--color-secondary) 8%, transparent); }
1569
+ .zTable td strong { color: var(--ink); }
1544
1570
 
1545
1571
  /* ════════════════════════════════════════════════════════════════════════════
1546
1572
  Progress bar (zProgress) — canonical animated progress component
@@ -1561,14 +1587,14 @@ zNavBar .zNav-link.active {
1561
1587
  align-items: baseline;
1562
1588
  margin-bottom: 0.4rem;
1563
1589
  }
1564
- .zProgress-container .zFw-bold { font-weight: 600; color: var(--zprogress-label, #e5e7eb); }
1590
+ .zProgress-container .zFw-bold { font-weight: 600; color: var(--zprogress-label, var(--ink)); }
1565
1591
  .zProgress-container .zText-muted { color: var(--zprogress-info, rgba(229, 231, 235, 0.6)); }
1566
1592
 
1567
1593
  /* Track — the rail behind the fill. Inset shadow gives the pill real depth. */
1568
1594
  .zProgress {
1569
1595
  width: 100%;
1570
1596
  height: 1rem; /* default; renderer may override inline via height prop */
1571
- background: var(--zprogress-track, rgba(255, 255, 255, 0.07));
1597
+ background: var(--zprogress-track, color-mix(in srgb, var(--ink) 7%, transparent));
1572
1598
  border-radius: 999px;
1573
1599
  overflow: hidden;
1574
1600
  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.35);
@@ -1584,11 +1610,11 @@ zNavBar .zNav-link.active {
1584
1610
  background-color: var(--color-primary, #A2D46E); /* default; zBg-{color} overrides */
1585
1611
  background-image:
1586
1612
  linear-gradient(to bottom,
1587
- rgba(255, 255, 255, 0.28), rgba(255, 255, 255, 0.04) 48%, rgba(0, 0, 0, 0.10)),
1613
+ color-mix(in srgb, var(--ink) 28%, transparent), var(--surface-1) 48%, rgba(0, 0, 0, 0.10)),
1588
1614
  linear-gradient(-45deg,
1589
- rgba(255, 255, 255, 0.16) 25%, transparent 25%,
1590
- transparent 50%, rgba(255, 255, 255, 0.16) 50%,
1591
- rgba(255, 255, 255, 0.16) 75%, transparent 75%, transparent);
1615
+ color-mix(in srgb, var(--ink) 16%, transparent) 25%, transparent 25%,
1616
+ transparent 50%, color-mix(in srgb, var(--ink) 16%, transparent) 50%,
1617
+ color-mix(in srgb, var(--ink) 16%, transparent) 75%, transparent 75%, transparent);
1592
1618
  background-size: 100% 100%, 1.15rem 1.15rem;
1593
1619
  background-repeat: no-repeat, repeat;
1594
1620
  border-radius: inherit;
@@ -1622,11 +1648,11 @@ zNavBar .zNav-link.active {
1622
1648
  .zProgress-bar-striped {
1623
1649
  background-image:
1624
1650
  linear-gradient(to bottom,
1625
- rgba(255, 255, 255, 0.28), rgba(255, 255, 255, 0.04) 48%, rgba(0, 0, 0, 0.10)),
1651
+ color-mix(in srgb, var(--ink) 28%, transparent), var(--surface-1) 48%, rgba(0, 0, 0, 0.10)),
1626
1652
  linear-gradient(-45deg,
1627
- rgba(255, 255, 255, 0.28) 25%, transparent 25%,
1628
- transparent 50%, rgba(255, 255, 255, 0.28) 50%,
1629
- rgba(255, 255, 255, 0.28) 75%, transparent 75%, transparent);
1653
+ color-mix(in srgb, var(--ink) 28%, transparent) 25%, transparent 25%,
1654
+ transparent 50%, color-mix(in srgb, var(--ink) 28%, transparent) 50%,
1655
+ color-mix(in srgb, var(--ink) 28%, transparent) 75%, transparent 75%, transparent);
1630
1656
  }
1631
1657
  .zProgress-bar-animated { animation: zProgress-flow 0.9s linear infinite; }
1632
1658
 
@@ -1711,7 +1737,7 @@ zNavBar .zNav-link.active {
1711
1737
  .zMenu-nav .zNav-link:focus-visible,
1712
1738
  .zMenu-container .zMenu-option button:hover,
1713
1739
  .zMenu-container .zMenu-option button:focus-visible {
1714
- background: rgba(162, 212, 110, 0.12);
1740
+ background: color-mix(in srgb, var(--color-primary) 12%, transparent);
1715
1741
  border-color: var(--color-primary, #A2D46E);
1716
1742
  transform: translateX(2px);
1717
1743
  outline: none;
@@ -1753,7 +1779,7 @@ zNavBar .zNav-link.active {
1753
1779
  font-weight: 600;
1754
1780
  font-variant-numeric: tabular-nums;
1755
1781
  color: var(--color-secondary, #9370DB);
1756
- background: rgba(147, 112, 219, 0.16);
1782
+ background: color-mix(in srgb, var(--color-secondary) 16%, transparent);
1757
1783
  border-radius: 50%;
1758
1784
  }
1759
1785