@qilin-agent/client-ui-theme-brand 3.1.6 → 3.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/client.js CHANGED
@@ -4,13 +4,141 @@ window.__ModuleLoader__.load({
4
4
  var module = { exports: {} };
5
5
  var exports = module.exports;
6
6
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
7
- //#region lib/types/client/tokens.js
7
+ //#region lib/types/packs/blush.js
8
8
  /**
9
- * QiLin alias-token overrides, applied as one layer over the active palette.
9
+ * The blush color pack: warm pink-paper surfaces with a deep rose accent in the
10
+ * light scheme, and a dim rose canvas with a pale pink accent in the dark one.
10
11
  *
11
- * The palette is the "玄金麒麟" (dark-gold) landing VI extended to both
12
- * schemes: the dark values transplant the landing page's tokens verbatim
13
- * (apps/web/src/landing/landing.css), the light values derive the matching
12
+ * The identity tint is 浅樱 (#e8a0b4); WCAG AA governs where text sits on it,
13
+ * so fills and links deepen to #b25b74 (white on it clears 4.9:1, and it clears
14
+ * 4.9:1 on the #fbf6f4 paper) while the pale tint stays for selection and
15
+ * decoration only. State colors, masks, and the ongoing blue stay with the base
16
+ * palettes, the same omission rule as every pack. Hover darkens the light accent
17
+ * and brightens the dark one, matching each platform's convention.
18
+ */
19
+ /** Blush tokens over the platform palettes. Every value states both schemes. */
20
+ const BLUSH_TOKENS = Object.freeze({
21
+ "--qilin-alias-brand-primary": {
22
+ light: "#b25b74",
23
+ dark: "#f2bccb"
24
+ },
25
+ "--qilin-alias-button-primary-hover": {
26
+ light: "#9d4e66",
27
+ dark: "#ffd6e0"
28
+ },
29
+ "--qilin-alias-link": {
30
+ light: "#a04f66",
31
+ dark: "#f6cdd9"
32
+ },
33
+ "--qilin-alias-bg-base": {
34
+ light: "#fbf6f4",
35
+ dark: "#141010"
36
+ },
37
+ "--qilin-alias-bg-layer-1": {
38
+ light: "#fffdfc",
39
+ dark: "#1b1616"
40
+ },
41
+ "--qilin-alias-bg-layer-2": {
42
+ light: "#fdf8f6",
43
+ dark: "#221b1b"
44
+ },
45
+ "--qilin-alias-bg-layer-3": {
46
+ light: "#f8f1ef",
47
+ dark: "#291f1f"
48
+ },
49
+ "--qilin-alias-bg-overlay": {
50
+ light: "#f5e9e7",
51
+ dark: "#3a2a2e"
52
+ },
53
+ "--qilin-alias-bg-skeleton": {
54
+ light: "rgba(120, 60, 76, 0.06)",
55
+ dark: "rgba(242, 188, 203, 0.08)"
56
+ },
57
+ "--qilin-specific-sidebar-fill": {
58
+ light: "#f8f1ef",
59
+ dark: "#141010"
60
+ },
61
+ "--qilin-specific-sidebar-nav-item-hover": {
62
+ light: "#f4e8e6",
63
+ dark: "#241b1d"
64
+ },
65
+ "--qilin-specific-sidebar-nav-item-active": {
66
+ light: "#f0e0df",
67
+ dark: "#2e2024"
68
+ },
69
+ "--qilin-specific-sidebar-nav-item-active-accent": {
70
+ light: "#b25b74",
71
+ dark: "#f2bccb"
72
+ },
73
+ "--qilin-specific-bubble": {
74
+ light: "#fbeef0",
75
+ dark: "#241a1c"
76
+ },
77
+ "--qilin-specific-input-major": {
78
+ light: "#fffdfc",
79
+ dark: "#1c1617"
80
+ },
81
+ "--qilin-specific-selector": {
82
+ light: "#f9efee",
83
+ dark: "#2e2024"
84
+ },
85
+ "--qilin-specific-tip": {
86
+ light: "#f9efee",
87
+ dark: "#2e2024"
88
+ },
89
+ "--qilin-alias-toast-bg": {
90
+ light: "#2b1f23",
91
+ dark: "#2b2124"
92
+ },
93
+ "--qilin-alias-tooltip-bg": {
94
+ light: "#261b1f",
95
+ dark: "#2b2124"
96
+ },
97
+ "--qilin-alias-label-primary": {
98
+ light: "#23191c",
99
+ dark: "#f0e6e8"
100
+ },
101
+ "--qilin-alias-label-secondary": {
102
+ light: "#6d5b61",
103
+ dark: "#b9a6ac"
104
+ },
105
+ "--qilin-alias-label-tertiary": {
106
+ light: "#8c7a80",
107
+ dark: "#93838a"
108
+ },
109
+ "--qilin-alias-border-l1": {
110
+ light: "rgba(120, 60, 76, 0.08)",
111
+ dark: "rgba(242, 188, 203, 0.08)"
112
+ },
113
+ "--qilin-alias-border-l2": {
114
+ light: "rgba(120, 60, 76, 0.12)",
115
+ dark: "rgba(242, 188, 203, 0.14)"
116
+ },
117
+ "--qilin-alias-border-l3": {
118
+ light: "rgba(120, 60, 76, 0.16)",
119
+ dark: "rgba(242, 188, 203, 0.18)"
120
+ }
121
+ });
122
+ /** The blush pack as the appearance row consumes it. */
123
+ const BLUSH_PACK = Object.freeze({
124
+ id: "blush",
125
+ label: Object.freeze({
126
+ en: "Blush",
127
+ zh: "浅樱"
128
+ }),
129
+ boot: Object.freeze({
130
+ light: "#fbf6f4",
131
+ dark: "#141010"
132
+ }),
133
+ tokens: BLUSH_TOKENS
134
+ });
135
+ //#endregion
136
+ //#region lib/types/packs/qilin.js
137
+ /**
138
+ * The dark-gold color pack: the "玄金" landing VI extended to both schemes.
139
+ *
140
+ * The dark values transplant the landing page's tokens verbatim
141
+ * (apps/web/src/landing/landing.css); the light values derive the matching
14
142
  * warm-paper variant because the landing VI ships no light mode. Accent
15
143
  * contrast is WCAG AA verified: the deep link gold #7d6126 clears 5.3:1 on
16
144
  * paper #f8f5ee where the VI's gold-700 #8f6f2e reaches only 4.3:1, and
@@ -22,15 +150,7 @@ window.__ModuleLoader__.load({
22
150
  * convention: dark schemes brighten (landing CTA gold-500 -> gold-300),
23
151
  * light schemes darken (gold-700 -> #7d6126).
24
152
  */
25
- /**
26
- * The layer source id. One layer per source, so this names the origin in
27
- * `ctx.theme` inspection and makes re-application replace rather than stack.
28
- */
29
- const QILIN_THEME_SOURCE = "@qilin-agent/client-ui-theme-brand";
30
- /**
31
- * QiLin's brand tokens over the platform palettes. Every value states both
32
- * schemes (the ThemeTokenModes contract), grouped by surface family.
33
- */
153
+ /** Dark-gold tokens over the platform palettes. Every value states both schemes. */
34
154
  const QILIN_TOKENS = Object.freeze({
35
155
  "--qilin-alias-brand-primary": {
36
156
  light: "#8f6f2e",
@@ -261,18 +381,563 @@ window.__ModuleLoader__.load({
261
381
  dark: "#c94a40"
262
382
  }
263
383
  });
384
+ /** The dark-gold pack as one selectable skin. */
385
+ const QILIN_PACK = Object.freeze({
386
+ id: "qilin",
387
+ label: Object.freeze({
388
+ zh: "玄金",
389
+ en: "Xuanjin"
390
+ }),
391
+ boot: Object.freeze({
392
+ light: "#f8f5ee",
393
+ dark: "#0d0b09"
394
+ }),
395
+ tokens: QILIN_TOKENS
396
+ });
397
+ //#endregion
398
+ //#region lib/types/packs/mono.js
399
+ /**
400
+ * The monochrome color pack: one neutral ramp from pure white to pure black,
401
+ * with no hue. Accent, canvas, and ink are all greys; the light scheme uses a
402
+ * near-black accent so white on-accent text and focus rings clear AA, and the
403
+ * dark scheme mirrors it with an off-white accent on black.
404
+ *
405
+ * State colors, masks, and the ongoing blue stay with the base palettes, the
406
+ * same omission rule as every pack. Hover darkens the light accent and
407
+ * brightens the dark one, matching each platform's convention.
408
+ */
409
+ /** Monochrome tokens over the platform palettes. Every value states both schemes. */
410
+ const MONO_TOKENS = Object.freeze({
411
+ "--qilin-alias-brand-primary": {
412
+ light: "#1a1a1a",
413
+ dark: "#f2f2f2"
414
+ },
415
+ "--qilin-alias-button-primary-hover": {
416
+ light: "#000000",
417
+ dark: "#ffffff"
418
+ },
419
+ "--qilin-alias-link": {
420
+ light: "#1f1f1f",
421
+ dark: "#ededed"
422
+ },
423
+ "--qilin-alias-bg-base": {
424
+ light: "#f4f4f4",
425
+ dark: "#000000"
426
+ },
427
+ "--qilin-alias-bg-layer-1": {
428
+ light: "#ffffff",
429
+ dark: "#0d0d0d"
430
+ },
431
+ "--qilin-alias-bg-layer-2": {
432
+ light: "#ffffff",
433
+ dark: "#141414"
434
+ },
435
+ "--qilin-alias-bg-layer-3": {
436
+ light: "#ffffff",
437
+ dark: "#1c1c1c"
438
+ },
439
+ "--qilin-alias-bg-overlay": {
440
+ light: "#e6e6e6",
441
+ dark: "#3f3f3f"
442
+ },
443
+ "--qilin-alias-bg-skeleton": {
444
+ light: "rgba(20, 20, 20, 0.06)",
445
+ dark: "rgba(242, 242, 242, 0.08)"
446
+ },
447
+ "--qilin-specific-sidebar-fill": {
448
+ light: "#ececec",
449
+ dark: "#000000"
450
+ },
451
+ "--qilin-specific-sidebar-nav-item-hover": {
452
+ light: "#e6e6e6",
453
+ dark: "#141414"
454
+ },
455
+ "--qilin-specific-sidebar-nav-item-active": {
456
+ light: "#dedede",
457
+ dark: "#1c1c1c"
458
+ },
459
+ "--qilin-specific-sidebar-nav-item-active-accent": {
460
+ light: "#1a1a1a",
461
+ dark: "#f2f2f2"
462
+ },
463
+ "--qilin-specific-bubble": {
464
+ light: "#ededed",
465
+ dark: "#1a1a1a"
466
+ },
467
+ "--qilin-specific-input-major": {
468
+ light: "#ffffff",
469
+ dark: "#141414"
470
+ },
471
+ "--qilin-specific-selector": {
472
+ light: "#f0f0f0",
473
+ dark: "#1c1c1c"
474
+ },
475
+ "--qilin-specific-tip": {
476
+ light: "#f0f0f0",
477
+ dark: "#1c1c1c"
478
+ },
479
+ "--qilin-alias-toast-bg": {
480
+ light: "#262626",
481
+ dark: "#2b2b2b"
482
+ },
483
+ "--qilin-alias-tooltip-bg": {
484
+ light: "#1f1f1f",
485
+ dark: "#262626"
486
+ },
487
+ "--qilin-alias-label-primary": {
488
+ light: "#141414",
489
+ dark: "#f2f2f2"
490
+ },
491
+ "--qilin-alias-label-primary-dimmed": {
492
+ light: "#262626",
493
+ dark: "#dcdcdc"
494
+ },
495
+ "--qilin-alias-label-secondary": {
496
+ light: "#5a5a5a",
497
+ dark: "#a6a6a6"
498
+ },
499
+ "--qilin-alias-label-tertiary": {
500
+ light: "#808080",
501
+ dark: "#8a8a8a"
502
+ },
503
+ "--qilin-alias-label-caption": {
504
+ light: "#969696",
505
+ dark: "#707070"
506
+ },
507
+ "--qilin-alias-label-dimmed": {
508
+ light: "#cfcfcf",
509
+ dark: "#4a4a4a"
510
+ },
511
+ "--qilin-alias-label-primary-inverted": {
512
+ light: "#ffffff",
513
+ dark: "#141414"
514
+ },
515
+ "--qilin-alias-border-l1": {
516
+ light: "rgba(20, 20, 20, 0.07)",
517
+ dark: "rgba(242, 242, 242, 0.07)"
518
+ },
519
+ "--qilin-alias-border-l2": {
520
+ light: "rgba(20, 20, 20, 0.11)",
521
+ dark: "rgba(242, 242, 242, 0.12)"
522
+ },
523
+ "--qilin-alias-border-l2-darkmode-thin": {
524
+ light: "rgba(20, 20, 20, 0.11)",
525
+ dark: "rgba(242, 242, 242, 0.07)"
526
+ },
527
+ "--qilin-alias-border-l3": {
528
+ light: "rgba(20, 20, 20, 0.13)",
529
+ dark: "rgba(242, 242, 242, 0.16)"
530
+ },
531
+ "--qilin-alias-border-l4": {
532
+ light: "rgba(20, 20, 20, 0.17)",
533
+ dark: "rgba(242, 242, 242, 0.20)"
534
+ },
535
+ "--qilin-alias-border-inverted": {
536
+ light: "rgba(20, 20, 20, 0)",
537
+ dark: "rgba(242, 242, 242, 0.06)"
538
+ },
539
+ "--qilin-alias-border-inverted2": {
540
+ light: "rgba(20, 20, 20, 0)",
541
+ dark: "rgba(242, 242, 242, 0.08)"
542
+ },
543
+ "--qilin-alias-interactive-bg-hover": {
544
+ light: "rgba(20, 20, 20, 0.07)",
545
+ dark: "rgba(242, 242, 242, 0.08)"
546
+ },
547
+ "--qilin-alias-interactive-bg-active": {
548
+ light: "rgba(20, 20, 20, 0.12)",
549
+ dark: "rgba(242, 242, 242, 0.14)"
550
+ },
551
+ "--qilin-alias-interactive-bg-hover-accent": {
552
+ light: "rgba(20, 20, 20, 0.14)",
553
+ dark: "rgba(242, 242, 242, 0.24)"
554
+ },
555
+ "--qilin-alias-interactive-bg-hover-solid": {
556
+ light: "#ededed",
557
+ dark: "#1c1c1c"
558
+ },
559
+ "--qilin-alias-button-contrast-fill": {
560
+ light: "#5a5a5a",
561
+ dark: "#f2f2f2"
562
+ },
563
+ "--qilin-alias-button-elevated-fill": {
564
+ light: "#ffffff",
565
+ dark: "#1f1f1f"
566
+ },
567
+ "--qilin-alias-button-floating-fill": {
568
+ light: "#ffffff",
569
+ dark: "#141414"
570
+ },
571
+ "--qilin-alias-button-floating-hover": {
572
+ light: "#ededed",
573
+ dark: "#1c1c1c"
574
+ },
575
+ "--qilin-alias-button-ghost-active-fill": {
576
+ light: "#ededed",
577
+ dark: "#1f1f1f"
578
+ },
579
+ "--qilin-alias-button-ghost-active-hover": {
580
+ light: "#e4e4e4",
581
+ dark: "#2a2a2a"
582
+ },
583
+ "--qilin-alias-button-ghost-active-border": {
584
+ light: "#9a9a9a",
585
+ dark: "#6f6f6f"
586
+ },
587
+ "--qilin-alias-button-tool-bar-fill": {
588
+ light: "rgba(90, 90, 90, 0.5)",
589
+ dark: "rgba(160, 160, 160, 0.4)"
590
+ },
591
+ "--qilin-alias-button-tool-bar-hover": {
592
+ light: "rgba(90, 90, 90, 0.6)",
593
+ dark: "rgba(160, 160, 160, 0.5)"
594
+ },
595
+ "--qilin-alias-button-tool-bar-fill-invisible": {
596
+ light: "rgba(20, 20, 20, 0.36)",
597
+ dark: "rgba(30, 30, 30, 0.36)"
598
+ },
599
+ "--qilin-alias-markdown-code-block": {
600
+ light: "#efefef",
601
+ dark: "#101010"
602
+ },
603
+ "--qilin-alias-markdown-code-block-banner": {
604
+ light: "#e8e8e8",
605
+ dark: "#171717"
606
+ },
607
+ "--qilin-alias-markdown-inline-code": {
608
+ light: "#eeeeee",
609
+ dark: "#1a1a1a"
610
+ },
611
+ "--qilin-alias-markdown-citation": {
612
+ light: "#eaeaea",
613
+ dark: "#1a1a1a"
614
+ },
615
+ "--qilin-alias-markdown-tag": {
616
+ light: "#ededed",
617
+ dark: "#141414"
618
+ },
619
+ "--qilin-alias-scrollbar-bg-l1": {
620
+ light: "#dcdcdc",
621
+ dark: "#3a3a3a"
622
+ },
623
+ "--qilin-alias-scrollbar-bg-l2": {
624
+ light: "#dcdcdc",
625
+ dark: "#4a4a4a"
626
+ },
627
+ "--qilin-alias-scrollbar-hover-l1": {
628
+ light: "#cfcfcf",
629
+ dark: "#4a4a4a"
630
+ },
631
+ "--qilin-alias-scrollbar-hover-l2": {
632
+ light: "#cfcfcf",
633
+ dark: "#5a5a5a"
634
+ }
635
+ });
636
+ /** The monochrome pack as one selectable skin. */
637
+ const MONO_PACK = Object.freeze({
638
+ id: "mono",
639
+ label: Object.freeze({
640
+ zh: "黑白",
641
+ en: "Mono"
642
+ }),
643
+ boot: Object.freeze({
644
+ light: "#f4f4f4",
645
+ dark: "#000000"
646
+ }),
647
+ tokens: MONO_TOKENS
648
+ });
649
+ //#endregion
650
+ //#region lib/types/packs/verdant.js
651
+ /**
652
+ * The green color pack: light-green paper with a deep green accent in the
653
+ * light scheme, and a deep ink-green canvas with a light green accent in the
654
+ * dark scheme. Accent contrast is WCAG AA verified: white on #2f6b4b clears
655
+ * 6.4:1, the light link #2a5a40 clears 6.5:1 on #f1f6f2, and the dark accent
656
+ * #8fd0a8 clears 11:1 on the #0a120e canvas.
657
+ *
658
+ * State colors, masks, and the ongoing blue stay with the base palettes, the
659
+ * same omission rule as every pack. Hover darkens the light accent and
660
+ * brightens the dark one, matching each platform's convention.
661
+ */
662
+ /** Green tokens over the platform palettes. Every value states both schemes. */
663
+ const VERDANT_TOKENS = Object.freeze({
664
+ "--qilin-alias-brand-primary": {
665
+ light: "#2f6b4b",
666
+ dark: "#8fd0a8"
667
+ },
668
+ "--qilin-alias-button-primary-hover": {
669
+ light: "#24553b",
670
+ dark: "#aee3c1"
671
+ },
672
+ "--qilin-alias-link": {
673
+ light: "#2a5a40",
674
+ dark: "#b7e6c8"
675
+ },
676
+ "--qilin-alias-bg-base": {
677
+ light: "#f1f6f2",
678
+ dark: "#0a120e"
679
+ },
680
+ "--qilin-alias-bg-layer-1": {
681
+ light: "#fbfdfb",
682
+ dark: "#101a14"
683
+ },
684
+ "--qilin-alias-bg-layer-2": {
685
+ light: "#fbfdfb",
686
+ dark: "#16221a"
687
+ },
688
+ "--qilin-alias-bg-layer-3": {
689
+ light: "#fbfdfb",
690
+ dark: "#1d2b21"
691
+ },
692
+ "--qilin-alias-bg-overlay": {
693
+ light: "#e2ebe4",
694
+ dark: "#3c4f43"
695
+ },
696
+ "--qilin-alias-bg-skeleton": {
697
+ light: "rgba(20, 60, 40, 0.06)",
698
+ dark: "rgba(210, 235, 220, 0.08)"
699
+ },
700
+ "--qilin-specific-sidebar-fill": {
701
+ light: "#e9f1ea",
702
+ dark: "#0a120e"
703
+ },
704
+ "--qilin-specific-sidebar-nav-item-hover": {
705
+ light: "#e2ece4",
706
+ dark: "#152018"
707
+ },
708
+ "--qilin-specific-sidebar-nav-item-active": {
709
+ light: "#d9e7dc",
710
+ dark: "#1d2b21"
711
+ },
712
+ "--qilin-specific-sidebar-nav-item-active-accent": {
713
+ light: "#2f6b4b",
714
+ dark: "#8fd0a8"
715
+ },
716
+ "--qilin-specific-bubble": {
717
+ light: "#eaf2ec",
718
+ dark: "#18251c"
719
+ },
720
+ "--qilin-specific-input-major": {
721
+ light: "#fcfefc",
722
+ dark: "#14201a"
723
+ },
724
+ "--qilin-specific-selector": {
725
+ light: "#eef4ef",
726
+ dark: "#1d2b21"
727
+ },
728
+ "--qilin-specific-tip": {
729
+ light: "#eef4ef",
730
+ dark: "#1d2b21"
731
+ },
732
+ "--qilin-alias-toast-bg": {
733
+ light: "#1f2a24",
734
+ dark: "#1f2c24"
735
+ },
736
+ "--qilin-alias-tooltip-bg": {
737
+ light: "#1a241f",
738
+ dark: "#1f2c24"
739
+ },
740
+ "--qilin-alias-label-primary": {
741
+ light: "#16211b",
742
+ dark: "#e4f0e7"
743
+ },
744
+ "--qilin-alias-label-primary-dimmed": {
745
+ light: "#24322a",
746
+ dark: "#cfe0d4"
747
+ },
748
+ "--qilin-alias-label-secondary": {
749
+ light: "#4f6157",
750
+ dark: "#9db3a4"
751
+ },
752
+ "--qilin-alias-label-tertiary": {
753
+ light: "#76877c",
754
+ dark: "#7f9487"
755
+ },
756
+ "--qilin-alias-label-caption": {
757
+ light: "#8a998f",
758
+ dark: "#64796b"
759
+ },
760
+ "--qilin-alias-label-dimmed": {
761
+ light: "#c8d5cb",
762
+ dark: "#42544a"
763
+ },
764
+ "--qilin-alias-label-primary-inverted": {
765
+ light: "#fbfdfb",
766
+ dark: "#14201a"
767
+ },
768
+ "--qilin-alias-border-l1": {
769
+ light: "rgba(28, 58, 42, 0.07)",
770
+ dark: "rgba(210, 235, 220, 0.07)"
771
+ },
772
+ "--qilin-alias-border-l2": {
773
+ light: "rgba(28, 58, 42, 0.11)",
774
+ dark: "rgba(210, 235, 220, 0.12)"
775
+ },
776
+ "--qilin-alias-border-l2-darkmode-thin": {
777
+ light: "rgba(28, 58, 42, 0.11)",
778
+ dark: "rgba(210, 235, 220, 0.07)"
779
+ },
780
+ "--qilin-alias-border-l3": {
781
+ light: "rgba(28, 58, 42, 0.13)",
782
+ dark: "rgba(210, 235, 220, 0.16)"
783
+ },
784
+ "--qilin-alias-border-l4": {
785
+ light: "rgba(28, 58, 42, 0.17)",
786
+ dark: "rgba(210, 235, 220, 0.20)"
787
+ },
788
+ "--qilin-alias-border-inverted": {
789
+ light: "rgba(28, 58, 42, 0)",
790
+ dark: "rgba(210, 235, 220, 0.06)"
791
+ },
792
+ "--qilin-alias-border-inverted2": {
793
+ light: "rgba(28, 58, 42, 0)",
794
+ dark: "rgba(210, 235, 220, 0.08)"
795
+ },
796
+ "--qilin-alias-interactive-bg-hover": {
797
+ light: "rgba(28, 58, 42, 0.08)",
798
+ dark: "rgba(210, 235, 220, 0.08)"
799
+ },
800
+ "--qilin-alias-interactive-bg-active": {
801
+ light: "rgba(28, 58, 42, 0.13)",
802
+ dark: "rgba(210, 235, 220, 0.14)"
803
+ },
804
+ "--qilin-alias-interactive-bg-hover-accent": {
805
+ light: "rgba(28, 58, 42, 0.14)",
806
+ dark: "rgba(210, 235, 220, 0.24)"
807
+ },
808
+ "--qilin-alias-interactive-bg-hover-solid": {
809
+ light: "#eaf2ec",
810
+ dark: "#1d2b21"
811
+ },
812
+ "--qilin-alias-button-contrast-fill": {
813
+ light: "#4f6157",
814
+ dark: "#e4f0e7"
815
+ },
816
+ "--qilin-alias-button-elevated-fill": {
817
+ light: "#fcfefc",
818
+ dark: "#1f2c24"
819
+ },
820
+ "--qilin-alias-button-floating-fill": {
821
+ light: "#fcfefc",
822
+ dark: "#18251c"
823
+ },
824
+ "--qilin-alias-button-floating-hover": {
825
+ light: "#eef4ef",
826
+ dark: "#1d2b21"
827
+ },
828
+ "--qilin-alias-button-ghost-active-fill": {
829
+ light: "#eaf2ec",
830
+ dark: "#1f2c24"
831
+ },
832
+ "--qilin-alias-button-ghost-active-hover": {
833
+ light: "#e2ece4",
834
+ dark: "#27362c"
835
+ },
836
+ "--qilin-alias-button-ghost-active-border": {
837
+ light: "#8fa096",
838
+ dark: "#5f7466"
839
+ },
840
+ "--qilin-alias-button-tool-bar-fill": {
841
+ light: "rgba(90, 110, 98, 0.5)",
842
+ dark: "rgba(140, 165, 150, 0.4)"
843
+ },
844
+ "--qilin-alias-button-tool-bar-hover": {
845
+ light: "rgba(90, 110, 98, 0.6)",
846
+ dark: "rgba(140, 165, 150, 0.5)"
847
+ },
848
+ "--qilin-alias-button-tool-bar-fill-invisible": {
849
+ light: "rgba(28, 58, 42, 0.36)",
850
+ dark: "rgba(35, 50, 42, 0.36)"
851
+ },
852
+ "--qilin-alias-markdown-code-block": {
853
+ light: "#e9f1ea",
854
+ dark: "#0f1a13"
855
+ },
856
+ "--qilin-alias-markdown-code-block-banner": {
857
+ light: "#e2ece4",
858
+ dark: "#16221a"
859
+ },
860
+ "--qilin-alias-markdown-inline-code": {
861
+ light: "#e8f0e9",
862
+ dark: "#18251c"
863
+ },
864
+ "--qilin-alias-markdown-citation": {
865
+ light: "#e4eee6",
866
+ dark: "#18251c"
867
+ },
868
+ "--qilin-alias-markdown-tag": {
869
+ light: "#e8f0e9",
870
+ dark: "#14201a"
871
+ },
872
+ "--qilin-alias-scrollbar-bg-l1": {
873
+ light: "#d3e0d6",
874
+ dark: "#39493f"
875
+ },
876
+ "--qilin-alias-scrollbar-bg-l2": {
877
+ light: "#c5d5c9",
878
+ dark: "#4a5c50"
879
+ },
880
+ "--qilin-alias-scrollbar-hover-l1": {
881
+ light: "#c5d5c9",
882
+ dark: "#4a5c50"
883
+ },
884
+ "--qilin-alias-scrollbar-hover-l2": {
885
+ light: "#b7cabd",
886
+ dark: "#5a6d60"
887
+ }
888
+ });
889
+ /** The green pack as one selectable skin. */
890
+ const VERDANT_PACK = Object.freeze({
891
+ id: "verdant",
892
+ label: Object.freeze({
893
+ zh: "墨绿",
894
+ en: "Verdant"
895
+ }),
896
+ boot: Object.freeze({
897
+ light: "#f1f6f2",
898
+ dark: "#0a120e"
899
+ }),
900
+ tokens: VERDANT_TOKENS
901
+ });
902
+ //#endregion
903
+ //#region lib/types/skin.js
904
+ /**
905
+ * The shipped color packs, shared by the node and browser halves.
906
+ *
907
+ * A pack is one selectable skin: an id, a provider-owned label, the canvas
908
+ * colors the pre-plugin index render paints, and the alias-token overrides for
909
+ * both base palettes. Packs are identified by their palette, never by a
910
+ * product name, so a composition can pick any of them without exposing who
911
+ * uses it.
912
+ */
913
+ /** Every shipped pack, in appearance-row order. */
914
+ const SKIN_PACKS = Object.freeze([
915
+ QILIN_PACK,
916
+ BLUSH_PACK,
917
+ MONO_PACK,
918
+ VERDANT_PACK
919
+ ]);
920
+ QILIN_PACK.id;
921
+ QILIN_PACK.label;
922
+ QILIN_PACK.boot;
264
923
  //#endregion
265
924
  //#region lib/types/client/index.js
266
- /** QiLin brand color layer for the Web client theme. */
267
- /** Required service: the theme registry and override stack. */
925
+ /** Color packs for the Web client theme: every shipped pack registers as one selectable skin. */
926
+ /** Required service: the theme registry and its skin registry. */
268
927
  const inject = ["theme"];
269
928
  /**
270
- * Stack the QiLin brand layer over whatever palette the user selected. The
271
- * layer is an effect, so unloading the plugin restores the covered tokens.
929
+ * Register every shipped color pack as a selectable skin. Light/dark selection
930
+ * stays the user's; a skin only replaces the alias tokens it names. Registration
931
+ * is an effect, so unloading the plugin removes every skin and restores the
932
+ * platform palette while the durable selection survives for a later load.
272
933
  * @param ctx - Client root context.
273
934
  */
274
935
  function apply(ctx) {
275
- ctx.effect(() => ctx.theme.overrideTokens(QILIN_THEME_SOURCE, QILIN_TOKENS), "qilin: brand tokens");
936
+ for (const pack of SKIN_PACKS) ctx.effect(() => ctx.theme.registerSkin({
937
+ id: pack.id,
938
+ label: pack.label,
939
+ tokens: pack.tokens
940
+ }), `ui-theme-brand: ${pack.id} skin`);
276
941
  }
277
942
  //#endregion
278
943
  exports.apply = apply;