@zolomedia/bifrost-client 1.7.80 → 1.7.82

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 +168 -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.82",
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;
@@ -190,6 +201,51 @@ pre {
190
201
  white-space: pre;
191
202
  }
192
203
 
204
+ /* ─── Lists (zUL / zOL / zDL) ──────────────────────────────────────────────── */
205
+ /* Bifrost owns the list baseline so a bare zUL/zOL/zDL — and every markdown list
206
+ * — renders deliberately and themed, never on raw browser UA defaults. Marker
207
+ * variants (circle/square/letter/roman) are set inline by the renderer; here we
208
+ * own the rhythm, indent, brand-tinted markers, and the dl term/definition look.
209
+ * Apps re-skin via _zClass — they never SUPPLY the baseline. */
210
+
211
+ ul, ol {
212
+ margin: 0 0 1rem;
213
+ padding-left: 1.4rem;
214
+ line-height: 1.6;
215
+ }
216
+ ul:last-child, ol:last-child { margin-bottom: 0; }
217
+
218
+ li { margin-bottom: 0.4rem; }
219
+ li:last-child { margin-bottom: 0; }
220
+
221
+ /* Themed markers — the modern touch (brand-tinted, not flat UA black). */
222
+ li::marker { color: var(--color-secondary); }
223
+
224
+ /* Nested lists tuck under their parent item with a single tight gap. */
225
+ li > ul, li > ol { margin: 0.4rem 0 0; }
226
+
227
+ /* Definition list (zDL) — term in ink, definition indented & muted. */
228
+ dl { margin: 0 0 1rem; }
229
+ dl:last-child { margin-bottom: 0; }
230
+ dt { font-weight: 700; color: var(--ink); }
231
+ dd {
232
+ margin: 0 0 0.6rem 1.2rem;
233
+ color: var(--ink-muted);
234
+ line-height: 1.6;
235
+ }
236
+ dd:last-child { margin-bottom: 0; }
237
+
238
+ /* Inline list (zList-inline) — horizontal, marker-less row of items. */
239
+ .zList-inline {
240
+ display: flex;
241
+ flex-wrap: wrap;
242
+ gap: 0.5rem 1.25rem;
243
+ margin: 0 0 1rem;
244
+ padding-left: 0;
245
+ list-style: none;
246
+ }
247
+ .zList-inline-item { margin: 0; }
248
+
193
249
  /* ─── Form controls — canonical field base (Bootstrap-like) ────────────────── */
194
250
  /* The client emits a real field as `.zForm-control` (default) or `.zInput`
195
251
  * (input-groups / explicit). Style BOTH so a field on ANY page — not just
@@ -208,9 +264,9 @@ input.zInput, textarea.zInput, select.zInput {
208
264
  font-family: inherit;
209
265
  font-size: 0.95rem;
210
266
  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));
267
+ color: var(--zinput-color, var(--ink));
268
+ background: var(--zinput-bg, color-mix(in srgb, var(--ink) 14%, transparent));
269
+ border: 1.5px solid var(--zinput-border, var(--border-strong));
214
270
  border-radius: var(--zinput-radius, 10px);
215
271
  transition: border-color 0.18s, background 0.18s, box-shadow 0.18s;
216
272
  }
@@ -221,9 +277,9 @@ input.zInput, textarea.zInput, select.zInput {
221
277
  .zForm-control:focus,
222
278
  input.zInput:focus, textarea.zInput:focus, select.zInput:focus {
223
279
  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);
280
+ border-color: var(--zinput-focus, var(--color-primary));
281
+ background: var(--zinput-bg-focus, color-mix(in srgb, var(--ink) 17%, transparent));
282
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--zinput-focus, var(--color-primary)) 20%, transparent);
227
283
  }
228
284
 
229
285
  .zForm-control:disabled, .zForm-control[readonly],
@@ -274,7 +330,7 @@ input[type="file"].zInput::file-selector-button {
274
330
  padding: 0.45rem 1rem;
275
331
  border: 0;
276
332
  border-radius: 8px;
277
- background: var(--zinput-accent, #4f46e5);
333
+ background: var(--zinput-accent, var(--color-secondary));
278
334
  color: #fff;
279
335
  font-family: inherit;
280
336
  font-size: 0.85rem;
@@ -304,7 +360,7 @@ input[type="color"].zInput {
304
360
  }
305
361
  input[type="color"].zForm-control:hover,
306
362
  input[type="color"].zInput:hover {
307
- border-color: var(--zinput-border-hover, rgba(255, 255, 255, 0.3));
363
+ border-color: var(--zinput-border-hover, color-mix(in srgb, var(--ink) 30%, transparent));
308
364
  }
309
365
  input[type="color"].zForm-control::-webkit-color-swatch-wrapper,
310
366
  input[type="color"].zInput::-webkit-color-swatch-wrapper { padding: 0; }
@@ -345,9 +401,9 @@ input[type="datetime-local"].zForm-control::-webkit-calendar-picker-indicator:ho
345
401
  align-items: center;
346
402
  padding: 0.55rem 0.85rem;
347
403
  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));
404
+ color: var(--zinput-color, var(--ink));
405
+ background: var(--zinput-affix-bg, color-mix(in srgb, var(--color-secondary) 14%, transparent));
406
+ border: 1.5px solid var(--zinput-border, color-mix(in srgb, var(--ink) 14%, transparent));
351
407
  white-space: nowrap;
352
408
  }
353
409
  .zInputGroup > .zInputGroup-text:first-child { border-radius: 10px 0 0 10px; border-right: 0; }
@@ -380,8 +436,8 @@ input[type="datetime-local"].zForm-control::-webkit-calendar-picker-indicator:ho
380
436
  margin: 0;
381
437
  display: inline-grid;
382
438
  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));
439
+ background: var(--zinput-bg, color-mix(in srgb, var(--ink) 14%, transparent));
440
+ border: 1.5px solid var(--zinput-border, color-mix(in srgb, var(--ink) 30%, transparent));
385
441
  cursor: pointer;
386
442
  transition: border-color 0.18s, background 0.18s, box-shadow 0.18s;
387
443
  }
@@ -393,8 +449,8 @@ input[type="datetime-local"].zForm-control::-webkit-calendar-picker-indicator:ho
393
449
  .zForm-check input[type="checkbox"]:checked,
394
450
  .zForm-check input[type="radio"]:checked,
395
451
  .zForm-check-input:checked {
396
- background: var(--zinput-focus, var(--color-primary, #6366f1));
397
- border-color: var(--zinput-focus, var(--color-primary, #6366f1));
452
+ background: var(--zinput-focus, var(--color-primary));
453
+ border-color: var(--zinput-focus, var(--color-primary));
398
454
  }
399
455
  /* checkmark glyph */
400
456
  .zForm-check input[type="checkbox"]:checked::after,
@@ -423,7 +479,7 @@ input[type="datetime-local"].zForm-control::-webkit-calendar-picker-indicator:ho
423
479
  .zForm-check input[type="radio"]:focus-visible,
424
480
  .zForm-check-input:focus-visible {
425
481
  outline: none;
426
- box-shadow: 0 0 0 3px color-mix(in srgb, var(--zinput-focus, var(--color-primary, #6366f1)) 30%, transparent);
482
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--zinput-focus, var(--color-primary)) 30%, transparent);
427
483
  }
428
484
 
429
485
  .zForm-check-label {
@@ -442,7 +498,7 @@ input[type="datetime-local"].zForm-control::-webkit-calendar-picker-indicator:ho
442
498
 
443
499
  /* native radios/checkboxes NOT given the custom .zForm-check treatment
444
500
  * 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); }
501
+ input[type="radio"], input[type="checkbox"] { accent-color: var(--color-primary); }
446
502
 
447
503
  /* radio / checkbox group (zSelect type:radio|checkbox) — legend + row rhythm */
448
504
  .zForm-check-group .zLabel { margin-bottom: 0.45rem; }
@@ -464,9 +520,9 @@ select.zInput {
464
520
  font-family: inherit;
465
521
  font-size: 0.95rem;
466
522
  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));
523
+ color: var(--zinput-color, var(--ink));
524
+ background-color: var(--zinput-bg, color-mix(in srgb, var(--ink) 14%, transparent));
525
+ border: 1.5px solid var(--zinput-border, var(--border-strong));
470
526
  border-radius: var(--zinput-radius, 10px);
471
527
  cursor: pointer;
472
528
  transition: border-color 0.18s, background 0.18s, box-shadow 0.18s;
@@ -481,9 +537,9 @@ select.zSelect:focus,
481
537
  select.zForm-control:focus,
482
538
  select.zInput:focus {
483
539
  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);
540
+ border-color: var(--zinput-focus, var(--color-primary));
541
+ background-color: var(--zinput-bg-focus, color-mix(in srgb, var(--ink) 17%, transparent));
542
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--zinput-focus, var(--color-primary)) 20%, transparent);
487
543
  }
488
544
 
489
545
  select.zSelect:disabled,
@@ -495,7 +551,7 @@ select.zSelect option,
495
551
  select.zForm-control option,
496
552
  select.zInput option { color: #1f2937; background: #fff; }
497
553
  select.zSelect option:disabled,
498
- select.zForm-control option:disabled { color: #9ca3af; }
554
+ select.zForm-control option:disabled { color: var(--ink-muted); }
499
555
 
500
556
  /* multi-select / sized list box — themed box, no caret, themed inline options */
501
557
  select.zSelect[multiple],
@@ -509,7 +565,7 @@ select.zForm-control[multiple] {
509
565
  select.zSelect[multiple] option,
510
566
  select.zSelect[size] option,
511
567
  select.zForm-control[multiple] option {
512
- color: var(--zinput-color, #e2e8f0);
568
+ color: var(--zinput-color, var(--ink));
513
569
  background: transparent;
514
570
  padding: 0.35rem 0.55rem;
515
571
  border-radius: 6px;
@@ -520,7 +576,7 @@ select.zSelect[multiple] option:checked,
520
576
  select.zSelect[size] option:checked,
521
577
  select.zForm-control[multiple] option:checked {
522
578
  color: #fff;
523
- background: linear-gradient(var(--color-primary, #6366f1), var(--color-primary, #6366f1));
579
+ background: linear-gradient(var(--color-primary), var(--color-primary));
524
580
  }
525
581
  select.zSelect[multiple] option:disabled,
526
582
  select.zForm-control[multiple] option:disabled { color: var(--zinput-placeholder, rgba(156, 163, 175, 0.55)); }
@@ -539,9 +595,9 @@ zBifrostBadge {
539
595
 
540
596
  /* ─── zBifrostBadge states ─────────────────────────────────────────────────── */
541
597
 
542
- .zBadge-pending { color: #fbbf24; }
543
- .zBadge-success { color: #34d399; }
544
- .zBadge-error { color: #f87171; }
598
+ .zBadge-pending { color: var(--color-warning); }
599
+ .zBadge-success { color: var(--color-success); }
600
+ .zBadge-error { color: var(--color-error); }
545
601
  .zBadge-dot { border-radius: 50%; background: currentColor; }
546
602
  .zIcon { display: inline-block; width: 0.75em; height: 0.75em; fill: currentColor; }
547
603
 
@@ -579,7 +635,7 @@ zNavBar .zNavbar {
579
635
  flex-wrap: wrap;
580
636
  padding: 0.75rem 1.5rem;
581
637
  background: var(--znav-bg, rgba(10, 14, 39, 0.92));
582
- border-bottom: 1px solid var(--znav-border, rgba(79, 70, 229, 0.15));
638
+ border-bottom: 1px solid var(--znav-border, color-mix(in srgb, var(--color-secondary) 15%, transparent));
583
639
  backdrop-filter: blur(12px);
584
640
  font-family: var(--znav-font, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif);
585
641
  }
@@ -589,7 +645,7 @@ zNavBar .zNavbar-brand {
589
645
  font-weight: 800;
590
646
  letter-spacing: -0.02em;
591
647
  margin-right: 2rem;
592
- color: var(--znav-brand-color, #f9fafb);
648
+ color: var(--znav-brand-color, var(--ink));
593
649
  }
594
650
 
595
651
  zNavBar .zNavbar-toggler {
@@ -599,9 +655,9 @@ zNavBar .zNavbar-toggler {
599
655
  font-size: 1.1rem;
600
656
  line-height: 1;
601
657
  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));
658
+ color: var(--znav-brand-color, var(--ink));
659
+ background: var(--znav-link-hover-bg, color-mix(in srgb, var(--color-secondary) 15%, transparent));
660
+ border: 1px solid var(--znav-border, color-mix(in srgb, var(--color-secondary) 30%, transparent));
605
661
  border-radius: 6px;
606
662
  }
607
663
 
@@ -628,14 +684,14 @@ zNavBar .zNav-link {
628
684
  font-size: 0.9rem;
629
685
  font-weight: 500;
630
686
  border-radius: 8px;
631
- color: var(--znav-link-color, #d1d5db);
687
+ color: var(--znav-link-color, var(--ink-muted));
632
688
  transition: color 0.2s, background 0.2s;
633
689
  }
634
690
 
635
691
  zNavBar .zNav-link:hover,
636
692
  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));
693
+ color: var(--znav-link-hover-color, var(--ink));
694
+ background: var(--znav-link-hover-bg, color-mix(in srgb, var(--color-secondary) 15%, transparent));
639
695
  }
640
696
 
641
697
  /* ─── zDropdown (navbar menus) — JS toggles .zShow ─────────────────────────── */
@@ -649,7 +705,7 @@ zNavBar .zNav-link.active {
649
705
  min-width: 11rem;
650
706
  padding: 0.4rem 0;
651
707
  background: var(--zdropdown-bg, rgba(20, 25, 45, 0.97));
652
- border: 1px solid var(--znav-border, rgba(79, 70, 229, 0.25));
708
+ border: 1px solid var(--znav-border, color-mix(in srgb, var(--color-secondary) 25%, transparent));
653
709
  border-radius: 10px;
654
710
  box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4);
655
711
  backdrop-filter: blur(12px);
@@ -660,12 +716,12 @@ zNavBar .zNav-link.active {
660
716
  display: block;
661
717
  padding: 0.5rem 1rem;
662
718
  font-size: 0.875rem;
663
- color: var(--znav-link-color, #d1d5db);
719
+ color: var(--znav-link-color, var(--ink-muted));
664
720
  transition: color 0.15s, background 0.15s;
665
721
  }
666
722
  .zDropdown-item:hover {
667
- color: var(--znav-link-hover-color, #f9fafb);
668
- background: var(--znav-link-hover-bg, rgba(79, 70, 229, 0.15));
723
+ color: var(--znav-link-hover-color, var(--ink));
724
+ background: var(--znav-link-hover-bg, color-mix(in srgb, var(--color-secondary) 15%, transparent));
669
725
  }
670
726
 
671
727
  /* ─── zNavbar-inblock — light, in-content navbar variant ────────────────────────
@@ -758,7 +814,7 @@ zNavBar .zNav-link.active {
758
814
  border: none;
759
815
  border-radius: 0;
760
816
  padding-left: 0.75rem;
761
- background: var(--znav-link-hover-bg, rgba(79, 70, 229, 0.08));
817
+ background: var(--znav-link-hover-bg, color-mix(in srgb, var(--color-secondary) 8%, transparent));
762
818
  }
763
819
  }
764
820
 
@@ -1052,10 +1108,10 @@ zNavBar .zNav-link.active {
1052
1108
  }
1053
1109
 
1054
1110
  .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); }
1111
+ .zText-dark { color: var(--ink); }
1112
+ .zBorder { border: 1px solid var(--border); }
1113
+ .zShadow-sm { box-shadow: 0 1px 3px var(--shadow); }
1114
+ .zBg-white { background: var(--surface-1); }
1059
1115
  .zText-center { text-align: center !important; }
1060
1116
  .zText-start { text-align: left !important; }
1061
1117
  .zText-end { text-align: right !important; }
@@ -1078,7 +1134,7 @@ zNavBar .zNav-link.active {
1078
1134
  border: 1px solid transparent;
1079
1135
  text-decoration: none;
1080
1136
  }
1081
- .zBtn:focus { outline: 2px solid rgba(79, 70, 229, 0.5); outline-offset: 2px; }
1137
+ .zBtn:focus { outline: 2px solid color-mix(in srgb, var(--color-primary) 55%, transparent); outline-offset: 2px; }
1082
1138
 
1083
1139
  /* ─── Button color variants — canonical fills (theme tokens) ───────────────── */
1084
1140
  /* The renderer maps a zBtn's `color:` (default primary) to .zBtn-{color}; these
@@ -1226,7 +1282,7 @@ zNavBar .zNav-link.active {
1226
1282
  }
1227
1283
  .zDash-format-sidebar > .zRow > .zCol-auto {
1228
1284
  border-right: none !important;
1229
- border-bottom: 1px solid rgba(79, 70, 229, 0.15);
1285
+ border-bottom: 1px solid color-mix(in srgb, var(--color-secondary) 15%, transparent);
1230
1286
  }
1231
1287
  .zDash-format-sidebar .zDash-sidebar {
1232
1288
  flex-direction: row !important;
@@ -1237,7 +1293,7 @@ zNavBar .zNav-link.active {
1237
1293
  }
1238
1294
  .zDash-format-sidebar .zDash-sidebar .zNav-link.zActive {
1239
1295
  box-shadow: none !important;
1240
- border-bottom: 2px solid #4F46E5;
1296
+ border-bottom: 2px solid var(--color-secondary);
1241
1297
  }
1242
1298
  .zDash-panel { padding: 1.25rem 1rem; }
1243
1299
  .zDash-container .zDialog-form { grid-template-columns: 1fr 1fr; }
@@ -1262,7 +1318,7 @@ zNavBar .zNav-link.active {
1262
1318
  right: 0;
1263
1319
  z-index: 50;
1264
1320
  background: rgba(10, 14, 39, 0.98);
1265
- border-bottom: 1px solid rgba(79, 70, 229, 0.2);
1321
+ border-bottom: 1px solid color-mix(in srgb, var(--color-secondary) 20%, transparent);
1266
1322
  backdrop-filter: blur(12px);
1267
1323
  }
1268
1324
 
@@ -1288,18 +1344,18 @@ zNavBar .zNav-link.active {
1288
1344
  gap: 0.4rem;
1289
1345
  margin: 0.75rem 0.75rem 0;
1290
1346
  padding: 0.45rem 0.85rem;
1291
- background: rgba(79, 70, 229, 0.15);
1292
- border: 1px solid rgba(79, 70, 229, 0.3);
1347
+ background: color-mix(in srgb, var(--color-secondary) 15%, transparent);
1348
+ border: 1px solid color-mix(in srgb, var(--color-secondary) 30%, transparent);
1293
1349
  border-radius: 8px;
1294
- color: #c7d2fe;
1350
+ color: var(--ink);
1295
1351
  font-size: 0.875rem;
1296
1352
  font-weight: 500;
1297
1353
  cursor: pointer;
1298
1354
  font-family: inherit;
1299
1355
  }
1300
1356
  .zDash-sidebar-toggle:hover {
1301
- background: rgba(79, 70, 229, 0.25);
1302
- color: #e0e7ff;
1357
+ background: color-mix(in srgb, var(--color-secondary) 25%, transparent);
1358
+ color: var(--ink);
1303
1359
  }
1304
1360
 
1305
1361
  .zDash-panel { padding: 1rem 0.75rem; }
@@ -1312,7 +1368,7 @@ zNavBar .zNav-link.active {
1312
1368
  .zDash-format-tabs .zDash-sidebar {
1313
1369
  display: flex;
1314
1370
  flex-direction: row;
1315
- border-bottom: 1px solid rgba(79, 70, 229, 0.2);
1371
+ border-bottom: 1px solid color-mix(in srgb, var(--color-secondary) 20%, transparent);
1316
1372
  }
1317
1373
 
1318
1374
  /* accordion format (future) */
@@ -1327,7 +1383,7 @@ zNavBar .zNav-link.active {
1327
1383
  /* Sidebar column chrome */
1328
1384
  .zDash-format-sidebar > .zRow > .zCol-auto {
1329
1385
  background: rgba(10, 14, 39, 0.6);
1330
- border-right: 1px solid rgba(79, 70, 229, 0.15);
1386
+ border-right: 1px solid color-mix(in srgb, var(--color-secondary) 15%, transparent);
1331
1387
  padding: 0;
1332
1388
  }
1333
1389
 
@@ -1344,7 +1400,7 @@ zNavBar .zNav-link.active {
1344
1400
  align-items: center;
1345
1401
  padding: 0.55rem 0.85rem;
1346
1402
  border-radius: 8px;
1347
- color: #94a3b8;
1403
+ color: var(--ink-muted);
1348
1404
  font-size: 0.875rem;
1349
1405
  font-weight: 500;
1350
1406
  cursor: pointer;
@@ -1353,13 +1409,13 @@ zNavBar .zNav-link.active {
1353
1409
  text-decoration: none;
1354
1410
  }
1355
1411
  .zDash-sidebar .zNav-link:hover {
1356
- color: #f1f5f9;
1357
- background: rgba(79, 70, 229, 0.12);
1412
+ color: var(--ink);
1413
+ background: color-mix(in srgb, var(--color-secondary) 12%, transparent);
1358
1414
  }
1359
1415
  .zDash-sidebar .zNav-link.zActive {
1360
- color: #f9fafb;
1361
- background: rgba(79, 70, 229, 0.22);
1362
- box-shadow: inset 3px 0 0 #4F46E5;
1416
+ color: var(--ink);
1417
+ background: color-mix(in srgb, var(--color-secondary) 22%, transparent);
1418
+ box-shadow: inset 3px 0 0 var(--color-secondary);
1363
1419
  }
1364
1420
 
1365
1421
  /* Panel area */
@@ -1373,7 +1429,7 @@ zNavBar .zNav-link.active {
1373
1429
  box-sizing: border-box;
1374
1430
  margin-bottom: 1.25rem;
1375
1431
  background: rgba(15, 20, 48, 0.6);
1376
- border: 1px solid rgba(79, 70, 229, 0.15);
1432
+ border: 1px solid color-mix(in srgb, var(--color-secondary) 15%, transparent);
1377
1433
  border-radius: 10px;
1378
1434
  }
1379
1435
 
@@ -1381,10 +1437,10 @@ zNavBar .zNav-link.active {
1381
1437
  .zDash-container .zDialog-title {
1382
1438
  font-size: 1rem;
1383
1439
  font-weight: 700;
1384
- color: #c7d2fe;
1440
+ color: var(--ink);
1385
1441
  margin-bottom: 1rem;
1386
1442
  padding-bottom: 0.6rem;
1387
- border-bottom: 1px solid rgba(79, 70, 229, 0.15);
1443
+ border-bottom: 1px solid color-mix(in srgb, var(--color-secondary) 15%, transparent);
1388
1444
  }
1389
1445
 
1390
1446
  /* Multi-column form grid */
@@ -1403,7 +1459,7 @@ zNavBar .zNav-link.active {
1403
1459
  font-size: 0.7rem;
1404
1460
  text-transform: uppercase;
1405
1461
  letter-spacing: 0.06em;
1406
- color: #64748b;
1462
+ color: var(--ink-muted);
1407
1463
  font-weight: 600;
1408
1464
  display: block;
1409
1465
  margin-bottom: 0.3rem;
@@ -1412,10 +1468,10 @@ zNavBar .zNav-link.active {
1412
1468
  /* Inputs & selects */
1413
1469
  .zDash-container .zInput {
1414
1470
  appearance: none;
1415
- background: rgba(255, 255, 255, 0.04);
1416
- border: 1px solid rgba(79, 70, 229, 0.2);
1471
+ background: var(--surface-1);
1472
+ border: 1px solid color-mix(in srgb, var(--color-secondary) 20%, transparent);
1417
1473
  border-radius: 7px;
1418
- color: #e2e8f0;
1474
+ color: var(--ink);
1419
1475
  padding: 0.5rem 0.75rem;
1420
1476
  font-size: 0.875rem;
1421
1477
  width: 100%;
@@ -1425,13 +1481,13 @@ zNavBar .zNav-link.active {
1425
1481
  }
1426
1482
  .zDash-container .zInput:focus {
1427
1483
  outline: none;
1428
- border-color: rgba(79, 70, 229, 0.6);
1429
- background: rgba(255, 255, 255, 0.07);
1484
+ border-color: color-mix(in srgb, var(--color-secondary) 60%, transparent);
1485
+ background: color-mix(in srgb, var(--ink) 7%, transparent);
1430
1486
  }
1431
1487
 
1432
1488
  /* Primary action button */
1433
1489
  .zDash-container .zBtn-primary {
1434
- background: #4F46E5;
1490
+ background: var(--color-secondary);
1435
1491
  border: none;
1436
1492
  color: #fff;
1437
1493
  padding: 0.55rem 1.25rem;
@@ -1443,7 +1499,7 @@ zNavBar .zNav-link.active {
1443
1499
  transition: background 0.15s, transform 0.1s;
1444
1500
  }
1445
1501
  .zDash-container .zBtn-primary:hover {
1446
- background: #4338ca;
1502
+ background: color-mix(in srgb, var(--color-secondary) 82%, black);
1447
1503
  transform: translateY(-1px);
1448
1504
  }
1449
1505
 
@@ -1454,10 +1510,10 @@ zNavBar .zNav-link.active {
1454
1510
  gap: 0.4rem;
1455
1511
  padding: 0.5rem 1rem;
1456
1512
  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);
1513
+ background: color-mix(in srgb, var(--color-secondary) 15%, transparent);
1514
+ border: 1px solid color-mix(in srgb, var(--color-secondary) 30%, transparent);
1459
1515
  border-radius: 8px;
1460
- color: #c7d2fe;
1516
+ color: var(--ink);
1461
1517
  font-size: 0.875rem;
1462
1518
  font-weight: 500;
1463
1519
  font-family: inherit;
@@ -1465,9 +1521,9 @@ zNavBar .zNav-link.active {
1465
1521
  transition: background 0.15s, border-color 0.15s, color 0.15s;
1466
1522
  }
1467
1523
  .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;
1524
+ background: color-mix(in srgb, var(--color-secondary) 30%, transparent);
1525
+ border-color: color-mix(in srgb, var(--color-secondary) 50%, transparent);
1526
+ color: var(--ink);
1471
1527
  }
1472
1528
 
1473
1529
  /* Tables */
@@ -1475,32 +1531,32 @@ zNavBar .zNav-link.active {
1475
1531
  width: 100%;
1476
1532
  border-collapse: collapse;
1477
1533
  font-size: 0.875rem;
1478
- color: #e2e8f0;
1534
+ color: var(--ink);
1479
1535
  }
1480
1536
  .zDash-container th {
1481
1537
  padding: 0.6rem 0.9rem;
1482
- background: rgba(79, 70, 229, 0.12);
1483
- color: #a5b4fc;
1538
+ background: color-mix(in srgb, var(--color-secondary) 12%, transparent);
1539
+ color: var(--color-secondary);
1484
1540
  font-weight: 600;
1485
1541
  text-align: left;
1486
- border-bottom: 1px solid rgba(79, 70, 229, 0.2);
1542
+ border-bottom: 1px solid color-mix(in srgb, var(--color-secondary) 20%, transparent);
1487
1543
  }
1488
1544
  .zDash-container td {
1489
1545
  padding: 0.55rem 0.9rem;
1490
- border-bottom: 1px solid rgba(255, 255, 255, 0.05);
1546
+ border-bottom: 1px solid color-mix(in srgb, var(--ink) 5%, transparent);
1491
1547
  }
1492
- .zDash-container tr:hover td { background: rgba(79, 70, 229, 0.07); }
1548
+ .zDash-container tr:hover td { background: color-mix(in srgb, var(--color-secondary) 7%, transparent); }
1493
1549
 
1494
1550
  /* Section headings */
1495
1551
  .zDash-container h2 {
1496
1552
  font-size: 1.2rem;
1497
1553
  font-weight: 700;
1498
- color: #f9fafb;
1554
+ color: var(--ink);
1499
1555
  margin: 0 0 1rem;
1500
1556
  }
1501
1557
 
1502
1558
  /* Spinner */
1503
- .zSpinner-border { color: #6366f1; }
1559
+ .zSpinner-border { color: var(--color-primary); }
1504
1560
 
1505
1561
  /* ============================================================================
1506
1562
  Tables (zTable) — canonical dark-theme data tables
@@ -1511,7 +1567,7 @@ zNavBar .zNav-link.active {
1511
1567
  .zTable-container { margin: 1.5rem 0; }
1512
1568
 
1513
1569
  .zTable-container h4 {
1514
- color: #f9fafb;
1570
+ color: var(--ink);
1515
1571
  font-size: 1.1rem;
1516
1572
  font-weight: 700;
1517
1573
  margin: 0 0 0.75rem;
@@ -1520,7 +1576,7 @@ zNavBar .zNav-link.active {
1520
1576
  .zTable-responsive {
1521
1577
  overflow-x: auto;
1522
1578
  border-radius: 12px;
1523
- border: 1px solid rgba(79, 70, 229, 0.2);
1579
+ border: 1px solid color-mix(in srgb, var(--color-secondary) 20%, transparent);
1524
1580
  }
1525
1581
 
1526
1582
  .zTable {
@@ -1532,30 +1588,30 @@ zNavBar .zNav-link.active {
1532
1588
  /* Default body text colour lives here so cells INHERIT it. Keeping it off the
1533
1589
  td selector lets a per-cell utility (zText-success/-danger…) win — a bare
1534
1590
  .zText-* class (0,1,0) would otherwise lose to `.zTable tbody td` (0,1,2). */
1535
- color: #d1d5db;
1591
+ color: var(--ink-muted);
1536
1592
  }
1537
1593
 
1538
1594
  .zTable thead th {
1539
- background: rgba(79, 70, 229, 0.18);
1540
- color: #c7d2fe;
1595
+ background: color-mix(in srgb, var(--color-secondary) 18%, transparent);
1596
+ color: var(--ink);
1541
1597
  font-weight: 700;
1542
1598
  text-align: left;
1543
1599
  padding: 0.85rem 1rem;
1544
1600
  letter-spacing: 0.02em;
1545
- border-bottom: 1px solid rgba(79, 70, 229, 0.3);
1601
+ border-bottom: 1px solid color-mix(in srgb, var(--color-secondary) 30%, transparent);
1546
1602
  white-space: nowrap;
1547
1603
  }
1548
1604
 
1549
1605
  .zTable tbody td {
1550
1606
  padding: 0.8rem 1rem;
1551
- border-bottom: 1px solid rgba(255, 255, 255, 0.06);
1607
+ border-bottom: 1px solid color-mix(in srgb, var(--ink) 6%, transparent);
1552
1608
  vertical-align: top;
1553
1609
  }
1554
1610
 
1555
1611
  .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; }
1612
+ .zTable tbody tr:nth-child(even) td { background: color-mix(in srgb, var(--ink) 2%, transparent); }
1613
+ .zTable tbody tr:hover td { background: color-mix(in srgb, var(--color-secondary) 8%, transparent); }
1614
+ .zTable td strong { color: var(--ink); }
1559
1615
 
1560
1616
  /* ════════════════════════════════════════════════════════════════════════════
1561
1617
  Progress bar (zProgress) — canonical animated progress component
@@ -1576,14 +1632,14 @@ zNavBar .zNav-link.active {
1576
1632
  align-items: baseline;
1577
1633
  margin-bottom: 0.4rem;
1578
1634
  }
1579
- .zProgress-container .zFw-bold { font-weight: 600; color: var(--zprogress-label, #e5e7eb); }
1635
+ .zProgress-container .zFw-bold { font-weight: 600; color: var(--zprogress-label, var(--ink)); }
1580
1636
  .zProgress-container .zText-muted { color: var(--zprogress-info, rgba(229, 231, 235, 0.6)); }
1581
1637
 
1582
1638
  /* Track — the rail behind the fill. Inset shadow gives the pill real depth. */
1583
1639
  .zProgress {
1584
1640
  width: 100%;
1585
1641
  height: 1rem; /* default; renderer may override inline via height prop */
1586
- background: var(--zprogress-track, rgba(255, 255, 255, 0.07));
1642
+ background: var(--zprogress-track, color-mix(in srgb, var(--ink) 7%, transparent));
1587
1643
  border-radius: 999px;
1588
1644
  overflow: hidden;
1589
1645
  box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.35);
@@ -1599,11 +1655,11 @@ zNavBar .zNav-link.active {
1599
1655
  background-color: var(--color-primary, #A2D46E); /* default; zBg-{color} overrides */
1600
1656
  background-image:
1601
1657
  linear-gradient(to bottom,
1602
- rgba(255, 255, 255, 0.28), rgba(255, 255, 255, 0.04) 48%, rgba(0, 0, 0, 0.10)),
1658
+ color-mix(in srgb, var(--ink) 28%, transparent), var(--surface-1) 48%, rgba(0, 0, 0, 0.10)),
1603
1659
  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);
1660
+ color-mix(in srgb, var(--ink) 16%, transparent) 25%, transparent 25%,
1661
+ transparent 50%, color-mix(in srgb, var(--ink) 16%, transparent) 50%,
1662
+ color-mix(in srgb, var(--ink) 16%, transparent) 75%, transparent 75%, transparent);
1607
1663
  background-size: 100% 100%, 1.15rem 1.15rem;
1608
1664
  background-repeat: no-repeat, repeat;
1609
1665
  border-radius: inherit;
@@ -1637,11 +1693,11 @@ zNavBar .zNav-link.active {
1637
1693
  .zProgress-bar-striped {
1638
1694
  background-image:
1639
1695
  linear-gradient(to bottom,
1640
- rgba(255, 255, 255, 0.28), rgba(255, 255, 255, 0.04) 48%, rgba(0, 0, 0, 0.10)),
1696
+ color-mix(in srgb, var(--ink) 28%, transparent), var(--surface-1) 48%, rgba(0, 0, 0, 0.10)),
1641
1697
  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);
1698
+ color-mix(in srgb, var(--ink) 28%, transparent) 25%, transparent 25%,
1699
+ transparent 50%, color-mix(in srgb, var(--ink) 28%, transparent) 50%,
1700
+ color-mix(in srgb, var(--ink) 28%, transparent) 75%, transparent 75%, transparent);
1645
1701
  }
1646
1702
  .zProgress-bar-animated { animation: zProgress-flow 0.9s linear infinite; }
1647
1703
 
@@ -1726,7 +1782,7 @@ zNavBar .zNav-link.active {
1726
1782
  .zMenu-nav .zNav-link:focus-visible,
1727
1783
  .zMenu-container .zMenu-option button:hover,
1728
1784
  .zMenu-container .zMenu-option button:focus-visible {
1729
- background: rgba(162, 212, 110, 0.12);
1785
+ background: color-mix(in srgb, var(--color-primary) 12%, transparent);
1730
1786
  border-color: var(--color-primary, #A2D46E);
1731
1787
  transform: translateX(2px);
1732
1788
  outline: none;
@@ -1768,7 +1824,7 @@ zNavBar .zNav-link.active {
1768
1824
  font-weight: 600;
1769
1825
  font-variant-numeric: tabular-nums;
1770
1826
  color: var(--color-secondary, #9370DB);
1771
- background: rgba(147, 112, 219, 0.16);
1827
+ background: color-mix(in srgb, var(--color-secondary) 16%, transparent);
1772
1828
  border-radius: 50%;
1773
1829
  }
1774
1830