@zolomedia/bifrost-client 1.7.80 → 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 +123 -112
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zolomedia/bifrost-client",
3
- "version": "1.7.80",
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,10 +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); }
1058
- .zBg-white { background: rgba(255, 255, 255, 0.04); }
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); }
1059
1070
  .zText-center { text-align: center !important; }
1060
1071
  .zText-start { text-align: left !important; }
1061
1072
  .zText-end { text-align: right !important; }
@@ -1078,7 +1089,7 @@ zNavBar .zNav-link.active {
1078
1089
  border: 1px solid transparent;
1079
1090
  text-decoration: none;
1080
1091
  }
1081
- .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; }
1082
1093
 
1083
1094
  /* ─── Button color variants — canonical fills (theme tokens) ───────────────── */
1084
1095
  /* The renderer maps a zBtn's `color:` (default primary) to .zBtn-{color}; these
@@ -1226,7 +1237,7 @@ zNavBar .zNav-link.active {
1226
1237
  }
1227
1238
  .zDash-format-sidebar > .zRow > .zCol-auto {
1228
1239
  border-right: none !important;
1229
- border-bottom: 1px solid rgba(79, 70, 229, 0.15);
1240
+ border-bottom: 1px solid color-mix(in srgb, var(--color-secondary) 15%, transparent);
1230
1241
  }
1231
1242
  .zDash-format-sidebar .zDash-sidebar {
1232
1243
  flex-direction: row !important;
@@ -1237,7 +1248,7 @@ zNavBar .zNav-link.active {
1237
1248
  }
1238
1249
  .zDash-format-sidebar .zDash-sidebar .zNav-link.zActive {
1239
1250
  box-shadow: none !important;
1240
- border-bottom: 2px solid #4F46E5;
1251
+ border-bottom: 2px solid var(--color-secondary);
1241
1252
  }
1242
1253
  .zDash-panel { padding: 1.25rem 1rem; }
1243
1254
  .zDash-container .zDialog-form { grid-template-columns: 1fr 1fr; }
@@ -1262,7 +1273,7 @@ zNavBar .zNav-link.active {
1262
1273
  right: 0;
1263
1274
  z-index: 50;
1264
1275
  background: rgba(10, 14, 39, 0.98);
1265
- border-bottom: 1px solid rgba(79, 70, 229, 0.2);
1276
+ border-bottom: 1px solid color-mix(in srgb, var(--color-secondary) 20%, transparent);
1266
1277
  backdrop-filter: blur(12px);
1267
1278
  }
1268
1279
 
@@ -1288,18 +1299,18 @@ zNavBar .zNav-link.active {
1288
1299
  gap: 0.4rem;
1289
1300
  margin: 0.75rem 0.75rem 0;
1290
1301
  padding: 0.45rem 0.85rem;
1291
- background: rgba(79, 70, 229, 0.15);
1292
- 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);
1293
1304
  border-radius: 8px;
1294
- color: #c7d2fe;
1305
+ color: var(--ink);
1295
1306
  font-size: 0.875rem;
1296
1307
  font-weight: 500;
1297
1308
  cursor: pointer;
1298
1309
  font-family: inherit;
1299
1310
  }
1300
1311
  .zDash-sidebar-toggle:hover {
1301
- background: rgba(79, 70, 229, 0.25);
1302
- color: #e0e7ff;
1312
+ background: color-mix(in srgb, var(--color-secondary) 25%, transparent);
1313
+ color: var(--ink);
1303
1314
  }
1304
1315
 
1305
1316
  .zDash-panel { padding: 1rem 0.75rem; }
@@ -1312,7 +1323,7 @@ zNavBar .zNav-link.active {
1312
1323
  .zDash-format-tabs .zDash-sidebar {
1313
1324
  display: flex;
1314
1325
  flex-direction: row;
1315
- border-bottom: 1px solid rgba(79, 70, 229, 0.2);
1326
+ border-bottom: 1px solid color-mix(in srgb, var(--color-secondary) 20%, transparent);
1316
1327
  }
1317
1328
 
1318
1329
  /* accordion format (future) */
@@ -1327,7 +1338,7 @@ zNavBar .zNav-link.active {
1327
1338
  /* Sidebar column chrome */
1328
1339
  .zDash-format-sidebar > .zRow > .zCol-auto {
1329
1340
  background: rgba(10, 14, 39, 0.6);
1330
- border-right: 1px solid rgba(79, 70, 229, 0.15);
1341
+ border-right: 1px solid color-mix(in srgb, var(--color-secondary) 15%, transparent);
1331
1342
  padding: 0;
1332
1343
  }
1333
1344
 
@@ -1344,7 +1355,7 @@ zNavBar .zNav-link.active {
1344
1355
  align-items: center;
1345
1356
  padding: 0.55rem 0.85rem;
1346
1357
  border-radius: 8px;
1347
- color: #94a3b8;
1358
+ color: var(--ink-muted);
1348
1359
  font-size: 0.875rem;
1349
1360
  font-weight: 500;
1350
1361
  cursor: pointer;
@@ -1353,13 +1364,13 @@ zNavBar .zNav-link.active {
1353
1364
  text-decoration: none;
1354
1365
  }
1355
1366
  .zDash-sidebar .zNav-link:hover {
1356
- color: #f1f5f9;
1357
- background: rgba(79, 70, 229, 0.12);
1367
+ color: var(--ink);
1368
+ background: color-mix(in srgb, var(--color-secondary) 12%, transparent);
1358
1369
  }
1359
1370
  .zDash-sidebar .zNav-link.zActive {
1360
- color: #f9fafb;
1361
- background: rgba(79, 70, 229, 0.22);
1362
- 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);
1363
1374
  }
1364
1375
 
1365
1376
  /* Panel area */
@@ -1373,7 +1384,7 @@ zNavBar .zNav-link.active {
1373
1384
  box-sizing: border-box;
1374
1385
  margin-bottom: 1.25rem;
1375
1386
  background: rgba(15, 20, 48, 0.6);
1376
- border: 1px solid rgba(79, 70, 229, 0.15);
1387
+ border: 1px solid color-mix(in srgb, var(--color-secondary) 15%, transparent);
1377
1388
  border-radius: 10px;
1378
1389
  }
1379
1390
 
@@ -1381,10 +1392,10 @@ zNavBar .zNav-link.active {
1381
1392
  .zDash-container .zDialog-title {
1382
1393
  font-size: 1rem;
1383
1394
  font-weight: 700;
1384
- color: #c7d2fe;
1395
+ color: var(--ink);
1385
1396
  margin-bottom: 1rem;
1386
1397
  padding-bottom: 0.6rem;
1387
- border-bottom: 1px solid rgba(79, 70, 229, 0.15);
1398
+ border-bottom: 1px solid color-mix(in srgb, var(--color-secondary) 15%, transparent);
1388
1399
  }
1389
1400
 
1390
1401
  /* Multi-column form grid */
@@ -1403,7 +1414,7 @@ zNavBar .zNav-link.active {
1403
1414
  font-size: 0.7rem;
1404
1415
  text-transform: uppercase;
1405
1416
  letter-spacing: 0.06em;
1406
- color: #64748b;
1417
+ color: var(--ink-muted);
1407
1418
  font-weight: 600;
1408
1419
  display: block;
1409
1420
  margin-bottom: 0.3rem;
@@ -1412,10 +1423,10 @@ zNavBar .zNav-link.active {
1412
1423
  /* Inputs & selects */
1413
1424
  .zDash-container .zInput {
1414
1425
  appearance: none;
1415
- background: rgba(255, 255, 255, 0.04);
1416
- 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);
1417
1428
  border-radius: 7px;
1418
- color: #e2e8f0;
1429
+ color: var(--ink);
1419
1430
  padding: 0.5rem 0.75rem;
1420
1431
  font-size: 0.875rem;
1421
1432
  width: 100%;
@@ -1425,13 +1436,13 @@ zNavBar .zNav-link.active {
1425
1436
  }
1426
1437
  .zDash-container .zInput:focus {
1427
1438
  outline: none;
1428
- border-color: rgba(79, 70, 229, 0.6);
1429
- 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);
1430
1441
  }
1431
1442
 
1432
1443
  /* Primary action button */
1433
1444
  .zDash-container .zBtn-primary {
1434
- background: #4F46E5;
1445
+ background: var(--color-secondary);
1435
1446
  border: none;
1436
1447
  color: #fff;
1437
1448
  padding: 0.55rem 1.25rem;
@@ -1443,7 +1454,7 @@ zNavBar .zNav-link.active {
1443
1454
  transition: background 0.15s, transform 0.1s;
1444
1455
  }
1445
1456
  .zDash-container .zBtn-primary:hover {
1446
- background: #4338ca;
1457
+ background: color-mix(in srgb, var(--color-secondary) 82%, black);
1447
1458
  transform: translateY(-1px);
1448
1459
  }
1449
1460
 
@@ -1454,10 +1465,10 @@ zNavBar .zNav-link.active {
1454
1465
  gap: 0.4rem;
1455
1466
  padding: 0.5rem 1rem;
1456
1467
  margin: 0 0.4rem 0.4rem 0;
1457
- background: rgba(79, 70, 229, 0.15);
1458
- 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);
1459
1470
  border-radius: 8px;
1460
- color: #c7d2fe;
1471
+ color: var(--ink);
1461
1472
  font-size: 0.875rem;
1462
1473
  font-weight: 500;
1463
1474
  font-family: inherit;
@@ -1465,9 +1476,9 @@ zNavBar .zNav-link.active {
1465
1476
  transition: background 0.15s, border-color 0.15s, color 0.15s;
1466
1477
  }
1467
1478
  .zDash-container button[data-key]:hover {
1468
- background: rgba(79, 70, 229, 0.3);
1469
- border-color: rgba(79, 70, 229, 0.5);
1470
- 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);
1471
1482
  }
1472
1483
 
1473
1484
  /* Tables */
@@ -1475,32 +1486,32 @@ zNavBar .zNav-link.active {
1475
1486
  width: 100%;
1476
1487
  border-collapse: collapse;
1477
1488
  font-size: 0.875rem;
1478
- color: #e2e8f0;
1489
+ color: var(--ink);
1479
1490
  }
1480
1491
  .zDash-container th {
1481
1492
  padding: 0.6rem 0.9rem;
1482
- background: rgba(79, 70, 229, 0.12);
1483
- color: #a5b4fc;
1493
+ background: color-mix(in srgb, var(--color-secondary) 12%, transparent);
1494
+ color: var(--color-secondary);
1484
1495
  font-weight: 600;
1485
1496
  text-align: left;
1486
- border-bottom: 1px solid rgba(79, 70, 229, 0.2);
1497
+ border-bottom: 1px solid color-mix(in srgb, var(--color-secondary) 20%, transparent);
1487
1498
  }
1488
1499
  .zDash-container td {
1489
1500
  padding: 0.55rem 0.9rem;
1490
- border-bottom: 1px solid rgba(255, 255, 255, 0.05);
1501
+ border-bottom: 1px solid color-mix(in srgb, var(--ink) 5%, transparent);
1491
1502
  }
1492
- .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); }
1493
1504
 
1494
1505
  /* Section headings */
1495
1506
  .zDash-container h2 {
1496
1507
  font-size: 1.2rem;
1497
1508
  font-weight: 700;
1498
- color: #f9fafb;
1509
+ color: var(--ink);
1499
1510
  margin: 0 0 1rem;
1500
1511
  }
1501
1512
 
1502
1513
  /* Spinner */
1503
- .zSpinner-border { color: #6366f1; }
1514
+ .zSpinner-border { color: var(--color-primary); }
1504
1515
 
1505
1516
  /* ============================================================================
1506
1517
  Tables (zTable) — canonical dark-theme data tables
@@ -1511,7 +1522,7 @@ zNavBar .zNav-link.active {
1511
1522
  .zTable-container { margin: 1.5rem 0; }
1512
1523
 
1513
1524
  .zTable-container h4 {
1514
- color: #f9fafb;
1525
+ color: var(--ink);
1515
1526
  font-size: 1.1rem;
1516
1527
  font-weight: 700;
1517
1528
  margin: 0 0 0.75rem;
@@ -1520,7 +1531,7 @@ zNavBar .zNav-link.active {
1520
1531
  .zTable-responsive {
1521
1532
  overflow-x: auto;
1522
1533
  border-radius: 12px;
1523
- border: 1px solid rgba(79, 70, 229, 0.2);
1534
+ border: 1px solid color-mix(in srgb, var(--color-secondary) 20%, transparent);
1524
1535
  }
1525
1536
 
1526
1537
  .zTable {
@@ -1532,30 +1543,30 @@ zNavBar .zNav-link.active {
1532
1543
  /* Default body text colour lives here so cells INHERIT it. Keeping it off the
1533
1544
  td selector lets a per-cell utility (zText-success/-danger…) win — a bare
1534
1545
  .zText-* class (0,1,0) would otherwise lose to `.zTable tbody td` (0,1,2). */
1535
- color: #d1d5db;
1546
+ color: var(--ink-muted);
1536
1547
  }
1537
1548
 
1538
1549
  .zTable thead th {
1539
- background: rgba(79, 70, 229, 0.18);
1540
- color: #c7d2fe;
1550
+ background: color-mix(in srgb, var(--color-secondary) 18%, transparent);
1551
+ color: var(--ink);
1541
1552
  font-weight: 700;
1542
1553
  text-align: left;
1543
1554
  padding: 0.85rem 1rem;
1544
1555
  letter-spacing: 0.02em;
1545
- border-bottom: 1px solid rgba(79, 70, 229, 0.3);
1556
+ border-bottom: 1px solid color-mix(in srgb, var(--color-secondary) 30%, transparent);
1546
1557
  white-space: nowrap;
1547
1558
  }
1548
1559
 
1549
1560
  .zTable tbody td {
1550
1561
  padding: 0.8rem 1rem;
1551
- border-bottom: 1px solid rgba(255, 255, 255, 0.06);
1562
+ border-bottom: 1px solid color-mix(in srgb, var(--ink) 6%, transparent);
1552
1563
  vertical-align: top;
1553
1564
  }
1554
1565
 
1555
1566
  .zTable tbody tr:last-child td { border-bottom: none; }
1556
- .zTable tbody tr:nth-child(even) td { background: rgba(255, 255, 255, 0.02); }
1557
- .zTable tbody tr:hover td { background: rgba(79, 70, 229, 0.08); }
1558
- .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); }
1559
1570
 
1560
1571
  /* ════════════════════════════════════════════════════════════════════════════
1561
1572
  Progress bar (zProgress) — canonical animated progress component
@@ -1576,14 +1587,14 @@ zNavBar .zNav-link.active {
1576
1587
  align-items: baseline;
1577
1588
  margin-bottom: 0.4rem;
1578
1589
  }
1579
- .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)); }
1580
1591
  .zProgress-container .zText-muted { color: var(--zprogress-info, rgba(229, 231, 235, 0.6)); }
1581
1592
 
1582
1593
  /* Track — the rail behind the fill. Inset shadow gives the pill real depth. */
1583
1594
  .zProgress {
1584
1595
  width: 100%;
1585
1596
  height: 1rem; /* default; renderer may override inline via height prop */
1586
- background: var(--zprogress-track, rgba(255, 255, 255, 0.07));
1597
+ background: var(--zprogress-track, color-mix(in srgb, var(--ink) 7%, transparent));
1587
1598
  border-radius: 999px;
1588
1599
  overflow: hidden;
1589
1600
  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.35);
@@ -1599,11 +1610,11 @@ zNavBar .zNav-link.active {
1599
1610
  background-color: var(--color-primary, #A2D46E); /* default; zBg-{color} overrides */
1600
1611
  background-image:
1601
1612
  linear-gradient(to bottom,
1602
- 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)),
1603
1614
  linear-gradient(-45deg,
1604
- rgba(255, 255, 255, 0.16) 25%, transparent 25%,
1605
- transparent 50%, rgba(255, 255, 255, 0.16) 50%,
1606
- 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);
1607
1618
  background-size: 100% 100%, 1.15rem 1.15rem;
1608
1619
  background-repeat: no-repeat, repeat;
1609
1620
  border-radius: inherit;
@@ -1637,11 +1648,11 @@ zNavBar .zNav-link.active {
1637
1648
  .zProgress-bar-striped {
1638
1649
  background-image:
1639
1650
  linear-gradient(to bottom,
1640
- 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)),
1641
1652
  linear-gradient(-45deg,
1642
- rgba(255, 255, 255, 0.28) 25%, transparent 25%,
1643
- transparent 50%, rgba(255, 255, 255, 0.28) 50%,
1644
- 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);
1645
1656
  }
1646
1657
  .zProgress-bar-animated { animation: zProgress-flow 0.9s linear infinite; }
1647
1658
 
@@ -1726,7 +1737,7 @@ zNavBar .zNav-link.active {
1726
1737
  .zMenu-nav .zNav-link:focus-visible,
1727
1738
  .zMenu-container .zMenu-option button:hover,
1728
1739
  .zMenu-container .zMenu-option button:focus-visible {
1729
- background: rgba(162, 212, 110, 0.12);
1740
+ background: color-mix(in srgb, var(--color-primary) 12%, transparent);
1730
1741
  border-color: var(--color-primary, #A2D46E);
1731
1742
  transform: translateX(2px);
1732
1743
  outline: none;
@@ -1768,7 +1779,7 @@ zNavBar .zNav-link.active {
1768
1779
  font-weight: 600;
1769
1780
  font-variant-numeric: tabular-nums;
1770
1781
  color: var(--color-secondary, #9370DB);
1771
- background: rgba(147, 112, 219, 0.16);
1782
+ background: color-mix(in srgb, var(--color-secondary) 16%, transparent);
1772
1783
  border-radius: 50%;
1773
1784
  }
1774
1785