@le-space/ui 0.6.42 → 0.6.43

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/styles.css CHANGED
@@ -1,21 +1,95 @@
1
+ /*
2
+ * Relay Button widget theme — Le-Space brand system (Style Guide V1.0).
3
+ * Dark ("Deep Space") is the default. Light mode activates when the host
4
+ * page sets `data-theme="light"` (Docusaurus convention) or
5
+ * `data-relay-theme="light"` on any ancestor element.
6
+ *
7
+ * The widget uses a compact type scale (13px body) instead of the 16px web
8
+ * scale from the style guide — see docs/reference/branding for the rationale.
9
+ */
1
10
  :root {
11
+ /* Typography — Inter for UI text, JetBrains Mono for labels/status/code. */
2
12
  --relay-font-heading:
3
- "Epilogue", "Avenir Next", "Segoe UI", sans-serif;
13
+ "Inter", -apple-system, "Segoe UI", Roboto, sans-serif;
4
14
  --relay-font-body:
5
- "DM Sans", "Inter", "Segoe UI", sans-serif;
15
+ "Inter", -apple-system, "Segoe UI", Roboto, sans-serif;
6
16
  --relay-font-mono:
7
- "DM Mono", "SFMono-Regular", "Menlo", monospace;
8
- --relay-panel-bg: rgba(49, 46, 129, 0.94);
9
- --relay-panel-border: rgba(199, 210, 254, 0.22);
10
- --relay-panel-shadow: 0 28px 80px rgba(49, 46, 129, 0.34);
11
- --relay-text: #f8fafc;
12
- --relay-muted: #9fb2ca;
13
- --relay-blue: #4f46e5;
14
- --relay-red: #6366f1;
15
- --relay-yellow: #ffc83f;
16
- --relay-green: #37d67a;
17
- --relay-launcher-border: rgba(199, 210, 254, 0.42);
18
- --relay-launcher-badge-bg: rgba(49, 46, 129, 0.92);
19
- --relay-launcher-badge-border: rgba(191, 219, 254, 0.24);
20
- --relay-backdrop-accent: rgba(79, 70, 229, 0.2);
17
+ "JetBrains Mono", ui-monospace, "SFMono-Regular", "Noto Sans Mono", Menlo, monospace;
18
+
19
+ /* Core palette (dark) */
20
+ --relay-deep-space: #0b0e15;
21
+ --relay-nebula: #141926;
22
+ --relay-horizon: #232b3d;
23
+ --relay-starlight: #edf1f8;
24
+ --relay-stardust: #a8b3c7;
25
+ --relay-comet: #6b7690;
26
+ --relay-coral: #ff6b5b;
27
+ --relay-cyan: #58c7f3;
28
+
29
+ /* Semantic colors */
30
+ --relay-success: #3edc97;
31
+ --relay-warning: #ffc24b;
32
+ --relay-danger: #ff4d6a;
33
+ --relay-info: #58c7f3;
34
+
35
+ /* Component tokens */
36
+ --relay-panel-bg: rgba(20, 25, 38, 0.97);
37
+ --relay-panel-border: var(--relay-horizon);
38
+ --relay-panel-shadow: 0 28px 80px rgba(4, 6, 12, 0.55);
39
+ --relay-text: var(--relay-starlight);
40
+ --relay-muted: var(--relay-stardust);
41
+ --relay-text-dim: var(--relay-comet);
42
+ --relay-surface: rgba(11, 14, 21, 0.55);
43
+ --relay-surface-border: var(--relay-horizon);
44
+ --relay-field-bg: rgba(11, 14, 21, 0.85);
45
+ --relay-accent: var(--relay-coral);
46
+ --relay-accent-contrast: #0b0e15;
47
+ --relay-link: var(--relay-cyan);
48
+
49
+ /* Launcher: the brand lockup as a button — Deep Space pill. */
50
+ --relay-launcher-bg: linear-gradient(135deg, #10151f 0%, #0b0e15 100%);
51
+ --relay-launcher-border: var(--relay-horizon);
52
+ --relay-launcher-text: var(--relay-starlight);
53
+ --relay-launcher-shadow: 0 18px 40px rgba(4, 6, 12, 0.5);
54
+ --relay-launcher-badge-bg: rgba(20, 25, 38, 0.92);
55
+ --relay-launcher-badge-border: var(--relay-horizon);
56
+ --relay-backdrop-accent: rgba(255, 107, 91, 0.14);
57
+
58
+ /* Legacy status aliases (kept for host-page overrides) */
59
+ --relay-blue: var(--relay-info);
60
+ --relay-red: var(--relay-danger);
61
+ --relay-yellow: var(--relay-warning);
62
+ --relay-green: var(--relay-success);
63
+ }
64
+
65
+ :root[data-theme="light"],
66
+ [data-theme="light"],
67
+ [data-relay-theme="light"] {
68
+ --relay-coral: #e8503f;
69
+ --relay-cyan: #0e86c4;
70
+ --relay-success: #0f9d6a;
71
+ --relay-warning: #a8690a;
72
+ --relay-danger: #d5365a;
73
+ --relay-info: #0e86c4;
74
+
75
+ --relay-panel-bg: rgba(255, 255, 255, 0.98);
76
+ --relay-panel-border: #d9e0ec;
77
+ --relay-panel-shadow: 0 28px 80px rgba(20, 27, 46, 0.18);
78
+ --relay-text: #141b2e;
79
+ --relay-muted: #4d5a74;
80
+ --relay-text-dim: #6b7690;
81
+ --relay-surface: rgba(20, 27, 46, 0.04);
82
+ --relay-surface-border: #d9e0ec;
83
+ --relay-field-bg: #ffffff;
84
+ --relay-accent: var(--relay-coral);
85
+ --relay-accent-contrast: #ffffff;
86
+ --relay-link: var(--relay-cyan);
87
+
88
+ --relay-launcher-bg: linear-gradient(135deg, #ffffff 0%, #f2f5fa 100%);
89
+ --relay-launcher-border: #d9e0ec;
90
+ --relay-launcher-text: #141b2e;
91
+ --relay-launcher-shadow: 0 18px 40px rgba(20, 27, 46, 0.16);
92
+ --relay-launcher-badge-bg: rgba(20, 27, 46, 0.05);
93
+ --relay-launcher-badge-border: #d9e0ec;
94
+ --relay-backdrop-accent: rgba(232, 80, 63, 0.1);
21
95
  }
@@ -449,12 +449,14 @@ export let apiHosts = undefined
449
449
  max-height: calc(100vh - 12.5rem);
450
450
  overflow: auto;
451
451
  border: 1px solid var(--relay-panel-border);
452
- border-radius: 1.6rem;
452
+ border-radius: 0.625rem;
453
453
  background: var(--relay-panel-bg);
454
454
  box-shadow: var(--relay-panel-shadow);
455
455
  color: var(--relay-text);
456
456
  padding: 1rem;
457
457
  font-family: var(--relay-font-body);
458
+ font-size: 0.8125rem;
459
+ line-height: 1.5;
458
460
  }
459
461
 
460
462
  .panel-head,
@@ -474,9 +476,9 @@ export let apiHosts = undefined
474
476
  gap: 0.28rem;
475
477
  margin: 0.25rem 0 0.8rem;
476
478
  padding: 0.7rem 0.85rem;
477
- border-radius: 1rem;
478
- background: linear-gradient(180deg, rgba(59, 130, 246, 0.12), rgba(59, 130, 246, 0.05));
479
- border: 1px solid rgba(125, 211, 252, 0.18);
479
+ border-radius: 0.625rem;
480
+ background: rgba(88, 199, 243, 0.08);
481
+ border: 1px solid rgba(88, 199, 243, 0.22);
480
482
  }
481
483
 
482
484
  .polling-head {
@@ -486,12 +488,12 @@ export let apiHosts = undefined
486
488
  }
487
489
 
488
490
  .polling-row strong {
489
- font-size: 0.88rem;
491
+ font-size: 0.8125rem;
490
492
  }
491
493
 
492
494
  .polling-row small {
493
- color: var(--relay-text-dim);
494
- line-height: 1.35;
495
+ color: var(--relay-muted);
496
+ line-height: 1.4;
495
497
  }
496
498
 
497
499
  .rootfs-blocker {
@@ -499,19 +501,30 @@ export let apiHosts = undefined
499
501
  gap: 0.55rem;
500
502
  margin-top: 1rem;
501
503
  padding: 0.9rem;
502
- border: 1px solid rgba(248, 113, 113, 0.58);
503
- border-radius: 1rem;
504
- background: rgba(127, 29, 29, 0.34);
505
- color: #fee2e2;
504
+ border: 1px solid rgba(255, 77, 106, 0.5);
505
+ border-radius: 0.625rem;
506
+ background: rgba(255, 77, 106, 0.1);
507
+ color: var(--relay-text);
508
+ }
509
+
510
+ .rootfs-blocker strong {
511
+ color: var(--relay-danger);
506
512
  }
507
513
 
508
514
  .rootfs-blocker p,
509
515
  .rootfs-blocker small { margin: 0; line-height: 1.45; }
510
- .rootfs-reference { overflow-wrap: anywhere; font-size: 0.7rem; }
516
+ .rootfs-reference { overflow-wrap: anywhere; font-size: 0.6875rem; font-family: var(--relay-font-mono); }
511
517
  .rootfs-actions { display: flex; flex-wrap: wrap; gap: 0.5rem; align-items: center; }
512
- .rootfs-actions .refresh { padding: 0.55rem 0.7rem; }
513
- .rootfs-actions a { color: #bfdbfe; font-size: 0.78rem; }
514
- .primary.blocked { border-color: rgba(248, 113, 113, 0.45); background: rgba(148, 163, 184, 0.22); color: #fee2e2; box-shadow: none; cursor: not-allowed; }
518
+ .rootfs-actions .refresh { padding: 0.5rem 0.7rem; }
519
+ .rootfs-actions a { color: var(--relay-link); font-size: 0.75rem; }
520
+
521
+ .primary.blocked {
522
+ border-color: rgba(255, 77, 106, 0.45);
523
+ background: var(--relay-surface);
524
+ color: var(--relay-muted);
525
+ box-shadow: none;
526
+ cursor: not-allowed;
527
+ }
515
528
 
516
529
  .eyebrow,
517
530
  .field span,
@@ -519,17 +532,25 @@ export let apiHosts = undefined
519
532
  .mono-block span,
520
533
  .instance-grid span,
521
534
  .section-head small {
522
- color: var(--relay-muted);
523
- font-size: 0.72rem;
535
+ color: var(--relay-comet);
536
+ font-family: var(--relay-font-mono);
537
+ font-weight: 700;
538
+ font-size: 0.6563rem;
524
539
  text-transform: uppercase;
525
540
  letter-spacing: 0.08em;
526
541
  }
527
542
 
543
+ .eyebrow {
544
+ color: var(--relay-accent);
545
+ }
546
+
528
547
  .eyebrow-version {
529
- font-size: 0.62rem;
548
+ font-family: var(--relay-font-mono);
549
+ font-weight: 400;
550
+ font-size: 0.625rem;
530
551
  letter-spacing: 0.04em;
531
552
  text-transform: none;
532
- color: rgba(191, 219, 254, 0.82);
553
+ color: var(--relay-comet);
533
554
  }
534
555
 
535
556
  h2,
@@ -540,62 +561,80 @@ export let apiHosts = undefined
540
561
  }
541
562
 
542
563
  h2 {
543
- font-size: 1.5rem;
564
+ font-size: 1.125rem;
565
+ font-weight: 700;
566
+ letter-spacing: -0.01em;
567
+ color: var(--relay-text);
568
+ }
569
+
570
+ h3 {
571
+ font-size: 0.9375rem;
572
+ font-weight: 600;
544
573
  }
545
574
 
546
575
  .refresh,
547
576
  .primary,
548
577
  .delete,
549
578
  .warning {
550
- border-radius: 0.95rem;
551
- padding: 0.7rem 0.9rem;
579
+ border-radius: 0.5rem;
580
+ padding: 0.65rem 0.9rem;
552
581
  cursor: pointer;
553
- font-weight: 700;
582
+ font-family: var(--relay-font-body);
583
+ font-size: 0.8125rem;
584
+ font-weight: 600;
554
585
  line-height: 1.1;
586
+ transition: filter 150ms ease, border-color 150ms ease;
555
587
  }
556
588
 
557
589
  .refresh {
558
- border: 1px solid rgba(255, 255, 255, 0.22);
590
+ border: 1px solid var(--relay-surface-border);
559
591
  color: var(--relay-text);
560
- background: rgba(255, 255, 255, 0.1);
561
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.06);
562
- backdrop-filter: blur(8px);
592
+ background: var(--relay-surface);
593
+ }
594
+
595
+ .refresh:hover:not(:disabled) {
596
+ border-color: var(--relay-cyan);
563
597
  }
564
598
 
565
599
  .primary {
566
600
  width: 100%;
567
- border: 1px solid rgba(251, 191, 36, 0.42);
568
- background: linear-gradient(135deg, #f6c453 0%, #f59e0b 100%);
569
- color: #281606;
570
- box-shadow: 0 10px 24px rgba(245, 158, 11, 0.24);
601
+ border: 1px solid transparent;
602
+ background: var(--relay-accent);
603
+ color: var(--relay-accent-contrast);
604
+ font-weight: 700;
605
+ box-shadow: 0 10px 24px rgba(255, 107, 91, 0.22);
606
+ }
607
+
608
+ .primary:hover:not(:disabled) {
609
+ filter: brightness(1.06);
571
610
  }
572
611
 
573
612
  .delete {
574
- border: 1px solid rgba(248, 113, 113, 0.45);
575
- background: rgba(239, 68, 68, 0.18);
576
- color: #ffe2e2;
613
+ border: 1px solid rgba(255, 77, 106, 0.45);
614
+ background: transparent;
615
+ color: var(--relay-danger);
577
616
  }
578
617
 
579
618
  .warning {
580
- border: 1px solid rgba(251, 146, 60, 0.4);
581
- background: rgba(251, 146, 60, 0.16);
582
- color: #fed7aa;
619
+ border: 1px solid rgba(255, 194, 75, 0.45);
620
+ background: transparent;
621
+ color: var(--relay-warning);
583
622
  }
584
623
 
585
624
  .chip-confirmed {
586
- background: rgba(34, 197, 94, 0.16);
587
- color: #86efac;
625
+ border-color: rgba(62, 220, 151, 0.45);
626
+ color: var(--relay-success);
588
627
  display: inline-flex;
589
628
  align-items: center;
590
629
  gap: 0.32rem;
591
630
  }
592
631
 
593
632
  .chip-dot-confirmed {
594
- width: 0.45rem;
595
- height: 0.45rem;
633
+ width: 0.42rem;
634
+ height: 0.42rem;
596
635
  border-radius: 999px;
597
- background: #22c55e;
598
- box-shadow: 0 0 0 3px rgba(34, 197, 94, 0.18);
636
+ background: var(--relay-success);
637
+ box-shadow: 0 0 0 3px rgba(62, 220, 151, 0.18);
599
638
  }
600
639
 
601
640
  .status-strip,
@@ -610,10 +649,10 @@ export let apiHosts = undefined
610
649
  .metric-card {
611
650
  display: grid;
612
651
  gap: 0.3rem;
613
- border: 1px solid rgba(255, 255, 255, 0.08);
614
- border-radius: 1rem;
652
+ border: 1px solid var(--relay-surface-border);
653
+ border-radius: 0.625rem;
615
654
  padding: 0.8rem;
616
- background: rgba(255, 255, 255, 0.035);
655
+ background: var(--relay-surface);
617
656
  }
618
657
 
619
658
  .status-pill {
@@ -622,13 +661,25 @@ export let apiHosts = undefined
622
661
  gap: 0.7rem;
623
662
  }
624
663
 
664
+ .status-pill strong,
665
+ .metric-card strong {
666
+ font-size: 0.8125rem;
667
+ }
668
+
669
+ .status-pill small,
670
+ .metric-card small {
671
+ color: var(--relay-muted);
672
+ font-size: 0.6875rem;
673
+ line-height: 1.4;
674
+ }
675
+
625
676
  .orphan-box {
626
677
  display: grid;
627
678
  gap: 0.7rem;
628
679
  padding: 0.85rem;
629
- border-radius: 1rem;
630
- border: 1px solid rgba(248, 113, 113, 0.22);
631
- background: linear-gradient(180deg, rgba(127, 29, 29, 0.18), rgba(69, 10, 10, 0.12));
680
+ border-radius: 0.625rem;
681
+ border: 1px solid rgba(255, 77, 106, 0.3);
682
+ background: rgba(255, 77, 106, 0.06);
632
683
  }
633
684
 
634
685
  .orphan-head {
@@ -636,18 +687,23 @@ export let apiHosts = undefined
636
687
  gap: 0.2rem;
637
688
  }
638
689
 
690
+ .orphan-head strong {
691
+ color: var(--relay-danger);
692
+ }
693
+
639
694
  .orphan-head small {
640
- color: #fecaca;
641
- line-height: 1.35;
695
+ color: var(--relay-muted);
696
+ line-height: 1.4;
642
697
  }
643
698
 
644
699
  .orphan-card {
645
700
  display: grid;
646
701
  gap: 0.35rem;
647
702
  padding: 0.75rem;
648
- border-radius: 0.9rem;
649
- background: rgba(15, 23, 42, 0.22);
650
- border: 1px solid rgba(255, 255, 255, 0.08);
703
+ border-radius: 0.5rem;
704
+ background: var(--relay-surface);
705
+ border: 1px solid var(--relay-surface-border);
706
+ font-size: 0.75rem;
651
707
  }
652
708
 
653
709
  .orphan-title {
@@ -657,9 +713,10 @@ export let apiHosts = undefined
657
713
  .alert {
658
714
  margin: 0.8rem 0 0;
659
715
  padding: 0.75rem 0.85rem;
660
- border-radius: 0.9rem;
661
- background: rgba(233, 19, 21, 0.12);
662
- color: #ffd9d9;
716
+ border-radius: 0.5rem;
717
+ border: 1px solid rgba(255, 77, 106, 0.3);
718
+ background: rgba(255, 77, 106, 0.1);
719
+ color: var(--relay-danger);
663
720
  }
664
721
 
665
722
  .status-text {
@@ -681,8 +738,8 @@ export let apiHosts = undefined
681
738
 
682
739
  .field small {
683
740
  color: var(--relay-muted);
684
- font-size: 0.72rem;
685
- line-height: 1.35;
741
+ font-size: 0.6875rem;
742
+ line-height: 1.4;
686
743
  }
687
744
 
688
745
  .field.wide {
@@ -691,17 +748,17 @@ export let apiHosts = undefined
691
748
 
692
749
  .accordion {
693
750
  margin-top: 0.9rem;
694
- border: 1px solid var(--relay-panel-border);
695
- border-radius: 1rem;
696
- background: rgba(255, 255, 255, 0.035);
751
+ border: 1px solid var(--relay-surface-border);
752
+ border-radius: 0.625rem;
753
+ background: var(--relay-surface);
697
754
  }
698
755
 
699
756
  .accordion summary {
700
757
  cursor: pointer;
701
758
  list-style: none;
702
- padding: 0.8rem 0.95rem;
759
+ padding: 0.75rem 0.9rem;
703
760
  color: var(--relay-text);
704
- font: 700 0.8rem/1.1 var(--relay-font-heading);
761
+ font: 700 0.6875rem/1.1 var(--relay-font-mono);
705
762
  text-transform: uppercase;
706
763
  letter-spacing: 0.08em;
707
764
  }
@@ -711,7 +768,7 @@ export let apiHosts = undefined
711
768
  }
712
769
 
713
770
  .accordion-body {
714
- padding: 0 0.95rem 0.95rem;
771
+ padding: 0 0.9rem 0.9rem;
715
772
  }
716
773
 
717
774
  .advanced-grid {
@@ -723,12 +780,19 @@ export let apiHosts = undefined
723
780
  select,
724
781
  textarea {
725
782
  width: 100%;
726
- border: 1px solid rgba(255, 255, 255, 0.12);
727
- border-radius: 0.95rem;
728
- background: rgba(255, 255, 255, 0.05);
783
+ border: 1px solid var(--relay-surface-border);
784
+ border-radius: 0.5rem;
785
+ background: var(--relay-field-bg);
729
786
  color: var(--relay-text);
730
- padding: 0.75rem 0.85rem;
731
- font: 500 0.9rem/1.35 var(--relay-font-body);
787
+ padding: 0.65rem 0.8rem;
788
+ font: 500 0.8125rem/1.4 var(--relay-font-body);
789
+ }
790
+
791
+ input:focus-visible,
792
+ select:focus-visible,
793
+ textarea:focus-visible {
794
+ outline: 2px solid var(--relay-cyan);
795
+ outline-offset: 1px;
732
796
  }
733
797
 
734
798
  textarea,
@@ -736,6 +800,11 @@ export let apiHosts = undefined
736
800
  font-family: var(--relay-font-mono);
737
801
  }
738
802
 
803
+ .mono-block strong {
804
+ font-size: 0.75rem;
805
+ overflow-wrap: anywhere;
806
+ }
807
+
739
808
  .actions,
740
809
  .deployment-box,
741
810
  .instances {
@@ -749,11 +818,21 @@ export let apiHosts = undefined
749
818
  gap: 0.3rem;
750
819
  }
751
820
 
821
+ .deployment-box strong {
822
+ font-family: var(--relay-font-mono);
823
+ font-size: 0.75rem;
824
+ }
825
+
752
826
  .instance-grid {
753
827
  grid-template-columns: 1fr 1fr;
754
828
  margin: 0.75rem 0;
755
829
  }
756
830
 
831
+ .instance-grid strong {
832
+ font-size: 0.8125rem;
833
+ overflow-wrap: anywhere;
834
+ }
835
+
757
836
  .chip-row {
758
837
  display: flex;
759
838
  gap: 0.4rem;
@@ -761,11 +840,16 @@ export let apiHosts = undefined
761
840
  }
762
841
 
763
842
  .chip {
843
+ border: 1px solid var(--relay-surface-border);
764
844
  border-radius: 999px;
765
- padding: 0.25rem 0.55rem;
766
- background: rgba(255, 255, 255, 0.08);
767
- color: var(--relay-text);
768
- font-size: 0.72rem;
845
+ padding: 0.22rem 0.55rem;
846
+ background: transparent;
847
+ color: var(--relay-muted);
848
+ font-family: var(--relay-font-mono);
849
+ font-weight: 700;
850
+ font-size: 0.6563rem;
851
+ text-transform: uppercase;
852
+ letter-spacing: 0.06em;
769
853
  }
770
854
 
771
855
  .link-row {
@@ -775,9 +859,14 @@ export let apiHosts = undefined
775
859
  }
776
860
 
777
861
  .link-row a {
778
- color: #bde0ff;
862
+ color: var(--relay-link);
779
863
  text-decoration: none;
780
- font-weight: 700;
864
+ font-weight: 600;
865
+ font-size: 0.8125rem;
866
+ }
867
+
868
+ .link-row a:hover {
869
+ text-decoration: underline;
781
870
  }
782
871
 
783
872
  .empty {
@@ -12,17 +12,17 @@
12
12
 
13
13
  <style>
14
14
  .accordion {
15
- border: 1px solid var(--relay-panel-border);
16
- border-radius: 1rem;
17
- background: rgba(255, 255, 255, 0.035);
15
+ border: 1px solid var(--relay-surface-border);
16
+ border-radius: 0.625rem;
17
+ background: var(--relay-surface);
18
18
  }
19
19
 
20
20
  summary {
21
21
  cursor: pointer;
22
22
  list-style: none;
23
- padding: 0.8rem 0.95rem;
23
+ padding: 0.75rem 0.9rem;
24
24
  color: var(--relay-text);
25
- font: 700 0.8rem/1.1 var(--relay-font-heading);
25
+ font: 700 0.6875rem/1.1 var(--relay-font-mono);
26
26
  text-transform: uppercase;
27
27
  letter-spacing: 0.08em;
28
28
  }
@@ -32,6 +32,6 @@
32
32
  }
33
33
 
34
34
  .accordion-body {
35
- padding: 0 0.95rem 0.95rem;
35
+ padding: 0 0.9rem 0.9rem;
36
36
  }
37
37
  </style>
@@ -20,12 +20,20 @@
20
20
 
21
21
  <style>
22
22
  .copy-button {
23
- border: 1px solid rgba(255, 255, 255, 0.18);
23
+ border: 1px solid var(--relay-surface-border);
24
24
  border-radius: 999px;
25
- background: rgba(255, 255, 255, 0.04);
26
- color: var(--relay-text);
25
+ background: transparent;
26
+ color: var(--relay-muted);
27
27
  padding: 0.28rem 0.7rem;
28
- font: 600 0.73rem/1 var(--relay-font-body);
28
+ font: 700 0.6563rem/1 var(--relay-font-mono);
29
+ text-transform: uppercase;
30
+ letter-spacing: 0.06em;
29
31
  cursor: pointer;
32
+ transition: color 150ms ease, border-color 150ms ease;
33
+ }
34
+
35
+ .copy-button:hover {
36
+ color: var(--relay-text);
37
+ border-color: var(--relay-cyan);
30
38
  }
31
39
  </style>
@@ -5,22 +5,45 @@
5
5
  </script>
6
6
 
7
7
  <button class={`launcher ${mode} ${open ? 'open' : ''}`} type="button" on:click={onToggle}>
8
+ <svg class="mark" viewBox="0 0 32 32" aria-hidden="true" focusable="false">
9
+ <line x1="17" y1="15.4" x2="19.6" y2="13" class="mark-link" stroke-width="2.4" stroke-linecap="round" />
10
+ <circle cx="11.5" cy="20.5" r="7" class="mark-node" />
11
+ <circle cx="23.5" cy="9.5" r="4.2" fill="none" class="mark-peer" stroke-width="2.8" />
12
+ </svg>
8
13
  <span>Relay Button</span>
9
14
  </button>
10
15
 
11
16
  <style>
12
17
  .launcher {
13
- border: 2px solid var(--relay-launcher-border);
18
+ display: inline-flex;
19
+ align-items: center;
20
+ gap: 0.5rem;
21
+ border: 1px solid var(--relay-launcher-border);
14
22
  border-radius: 999px;
15
- padding: 0.9rem 1.2rem;
16
- background: linear-gradient(135deg, var(--relay-blue) 0%, var(--relay-red) 100%);
17
- color: white;
18
- box-shadow: 0 18px 40px rgba(79, 70, 229, 0.28);
19
- font: 700 0.84rem/1 var(--relay-font-heading);
23
+ padding: 0.75rem 1.1rem;
24
+ background: var(--relay-launcher-bg);
25
+ color: var(--relay-launcher-text);
26
+ box-shadow: var(--relay-launcher-shadow);
27
+ font: 700 0.78rem/1 var(--relay-font-mono);
20
28
  letter-spacing: 0.08em;
21
29
  text-transform: uppercase;
22
30
  cursor: pointer;
23
- transition: transform 180ms ease;
31
+ transition: transform 180ms ease, border-color 180ms ease;
32
+ }
33
+
34
+ .mark {
35
+ width: 1.15rem;
36
+ height: 1.15rem;
37
+ flex: none;
38
+ }
39
+
40
+ .mark-node {
41
+ fill: var(--relay-coral);
42
+ }
43
+
44
+ .mark-peer,
45
+ .mark-link {
46
+ stroke: var(--relay-cyan);
24
47
  }
25
48
 
26
49
  .launcher.floating {
@@ -33,12 +56,13 @@
33
56
  .launcher.inline {
34
57
  position: relative;
35
58
  z-index: auto;
36
- padding: 0.55rem 0.9rem;
37
- font-size: 0.78rem;
59
+ padding: 0.5rem 0.85rem;
60
+ font-size: 0.72rem;
38
61
  }
39
62
 
40
63
  .launcher:hover,
41
64
  .launcher.open {
42
65
  transform: translateY(-2px) scale(1.02);
66
+ border-color: var(--relay-cyan);
43
67
  }
44
68
  </style>