@saasicat/ui-vue 0.22.2 → 0.24.0

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 (119) hide show
  1. package/README.md +1 -1
  2. package/dist/{chunk-LY52T4N4.js → chunk-TQQMKWN6.js} +58 -1
  3. package/dist/{chunk-XMMFN2WJ.js → chunk-VYMTWCTT.js} +51 -1
  4. package/dist/client/index.cjs +57 -0
  5. package/dist/client/index.d.cts +58 -1
  6. package/dist/client/index.d.ts +58 -1
  7. package/dist/client/index.js +15 -1
  8. package/dist/index.cjs +321 -159
  9. package/dist/index.d.cts +67 -4
  10. package/dist/index.d.ts +67 -4
  11. package/dist/index.js +72 -2
  12. package/dist/quasar/index.cjs +116 -20
  13. package/dist/quasar/index.d.cts +48 -3
  14. package/dist/quasar/index.d.ts +48 -3
  15. package/dist/quasar/index.js +58 -3
  16. package/dist/{use-super-admin-i18n-CgTuNi8h.d.cts → use-sa-theme-B5t7oXph.d.cts} +51 -1
  17. package/dist/{use-super-admin-i18n-CHNdsSlm.d.ts → use-sa-theme-OUBlaqgl.d.ts} +51 -1
  18. package/package.json +5 -2
  19. package/src/client/identity-accents.ts +129 -0
  20. package/src/client/index.ts +1 -0
  21. package/src/components/BundleVersionPublishDialog.vue +17 -17
  22. package/src/components/KvBlock.vue +6 -6
  23. package/src/components/MarketingPromotionsTab.vue +84 -80
  24. package/src/components/MfaPromptDialog.vue +2 -2
  25. package/src/components/TenantActionConfirmDialog.vue +5 -5
  26. package/src/components/VersionDiffPreview.vue +18 -18
  27. package/src/components/bundle-editor/BundleCreatePanel.vue +52 -52
  28. package/src/components/bundle-editor/BundleFeaturesEditor.vue +20 -20
  29. package/src/components/bundle-editor/BundlePlanCompatPicker.vue +33 -33
  30. package/src/components/bundle-editor/BundleQuotasEditor.vue +26 -26
  31. package/src/components/bundle-editor/BundleStatusBanner.vue +21 -21
  32. package/src/components/bundle-editor/BundleVersionInlineEditor.vue +49 -49
  33. package/src/components/bundle-editor/BundleVersionStrip.vue +30 -30
  34. package/src/components/dialogs/PilotCreateDialog.vue +20 -20
  35. package/src/components/dialogs/PilotEditDialog.vue +6 -6
  36. package/src/components/dialogs/PromoCodeCreateDialog.vue +9 -9
  37. package/src/components/dialogs/PromoCodeDialogFields.vue +64 -63
  38. package/src/components/dialogs/PromoCodeEditDialog.vue +11 -11
  39. package/src/components/dialogs/pilot-dialog.css +48 -48
  40. package/src/components/plan/PlanCycleToggle.vue +9 -16
  41. package/src/components/plan/PlanGrid.vue +30 -34
  42. package/src/components/plan/PriceSummary.vue +35 -35
  43. package/src/components/plan/PromoCodeInput.vue +26 -26
  44. package/src/components/plan/PublicBundleGrid.vue +32 -28
  45. package/src/components/plan-create-dialog/PlanCreateDialog.vue +50 -50
  46. package/src/components/plan-detail/PlanDetail.vue +178 -157
  47. package/src/components/plan-detail/PlanTitleEdit.vue +11 -11
  48. package/src/components/plan-list/PlanList.vue +116 -100
  49. package/src/components/plan-matrix/PlanMatrix.vue +97 -114
  50. package/src/components/plan-review/PlanReview.vue +61 -57
  51. package/src/components/plan-version-editor/PlanVersionEditor.vue +246 -203
  52. package/src/components/wizard-stepper/WizardStepper.vue +17 -17
  53. package/src/index.ts +1 -0
  54. package/src/pages-standard/AdminLayout.vue +58 -37
  55. package/src/pages-standard/AdminManifestErrorPage.vue +6 -6
  56. package/src/pages-standard/AuditPage.vue +3 -3
  57. package/src/pages-standard/BundlesPage.vue +37 -37
  58. package/src/pages-standard/DashboardPage.vue +22 -19
  59. package/src/pages-standard/DiscoveryPage.vue +55 -49
  60. package/src/pages-standard/EmailHistoryPage.vue +53 -71
  61. package/src/pages-standard/MarketingCatalogPage.vue +245 -221
  62. package/src/pages-standard/PilotsPage.vue +7 -6
  63. package/src/pages-standard/PlatformEmailPage.vue +18 -18
  64. package/src/pages-standard/PromoCodeDetailPage.vue +3 -3
  65. package/src/pages-standard/PromoCodesPage.vue +10 -7
  66. package/src/pages-standard/SuperAdminLoginPage.vue +39 -25
  67. package/src/pages-standard/SuperAdminSetupWizard.vue +44 -33
  68. package/src/pages-standard/TenantDetailPage.vue +7 -7
  69. package/src/pages-standard/TenantsPage.vue +16 -50
  70. package/src/pages-standard/bundles-page/BundleAccordionList.vue +13 -13
  71. package/src/pages-standard/discovery-page/CatalogEntryTransPanel.vue +24 -24
  72. package/src/pages-standard/discovery-page/DiscoveryCapList.vue +22 -22
  73. package/src/pages-standard/discovery-page/DiscoveryFeatureCard.vue +39 -39
  74. package/src/pages-standard/discovery-page/DiscoveryQuotaCard.vue +26 -26
  75. package/src/pages-standard/discovery-page/DiscoveryStatusControl.vue +1 -1
  76. package/src/pages-standard/discovery-page/discovery-ui.ts +10 -7
  77. package/src/pages-standard/marketing-catalog/MarketingCatalogAdmin.vue +2 -5
  78. package/src/pages-standard/plan-versions/PlanDiffCard.vue +27 -20
  79. package/src/pages-standard/plan-versions/PlanVersionsDiff.vue +24 -16
  80. package/src/pages-standard/plan-versions/PlanVersionsTimeline.vue +45 -45
  81. package/src/pages-standard/plans-page/PlanBundleOverview.vue +21 -15
  82. package/src/pages-standard/plans-page/PlanPublishDialog.vue +4 -4
  83. package/src/pages-standard/plans-page/PlansPageToast.vue +6 -6
  84. package/src/pages-standard/sa-theme.css +9 -687
  85. package/src/pages-standard/tenants/StatusPill.vue +13 -13
  86. package/src/pages-standard/tenants/format.ts +11 -12
  87. package/src/pages-tenant/LimitsRow.vue +4 -4
  88. package/src/pages-tenant/MySubscriptionBundlesPage.vue +70 -61
  89. package/src/pages-tenant/OnboardingConfigurator.vue +25 -25
  90. package/src/pages-tenant/PackageSnapshotPanel.vue +10 -16
  91. package/src/pages-tenant/PendingVersionBanner.vue +12 -12
  92. package/src/pages-tenant/PlanChangeWizard.vue +22 -76
  93. package/src/pages-tenant/TenantPlanSection.vue +19 -69
  94. package/src/pages-tenant/UsageBar.vue +7 -7
  95. package/src/pages-tenant/default-i18n.ts +113 -0
  96. package/src/pages-tenant/tenant-plan-section/BundlePreviewDialog.vue +14 -14
  97. package/src/pages-tenant/tenant-plan-section/TenantBundleStore.vue +10 -10
  98. package/src/pages-tenant/tenant-plan-section/TenantFeatureMatrix.vue +2 -2
  99. package/src/quasar/create-super-admin-app.ts +96 -1
  100. package/src/quasar/dark-bridge.ts +66 -0
  101. package/src/quasar/index.ts +1 -0
  102. package/src/ui/theme/_breakpoints.scss +34 -0
  103. package/src/ui/theme/base.css +50 -0
  104. package/src/ui/theme/components/body.css +23 -0
  105. package/src/ui/theme/components/button.css +158 -0
  106. package/src/ui/theme/components/card.css +74 -0
  107. package/src/ui/theme/components/field.css +38 -0
  108. package/src/ui/theme/components/hero.css +46 -0
  109. package/src/ui/theme/components/paginator.css +63 -0
  110. package/src/ui/theme/components/section.css +67 -0
  111. package/src/ui/theme/components/statistics.css +189 -0
  112. package/src/ui/theme/components/table.css +60 -0
  113. package/src/ui/theme/index.css +42 -0
  114. package/src/ui/theme/tokens.legacy.css +147 -0
  115. package/src/ui/theme/tokens.primitive.css +112 -0
  116. package/src/ui/theme/tokens.scale.css +103 -0
  117. package/src/ui/theme/tokens.semantic.dark.css +185 -0
  118. package/src/ui/theme/tokens.semantic.light.css +242 -0
  119. package/src/vue/use-sa-theme.ts +154 -0
@@ -15,22 +15,22 @@ defineProps<{ label: string; value: string }>();
15
15
 
16
16
  <style scoped>
17
17
  .kv {
18
- background: var(--sa-bg-surface-2);
19
- border: 1px solid var(--sa-border);
18
+ background: var(--sa-color-bg-sunken);
19
+ border: 1px solid var(--sa-color-border);
20
20
  border-radius: 10px;
21
21
  padding: 10px 12px;
22
22
  }
23
23
  .kv__label {
24
- color: var(--sa-muted);
25
- font-size: 11px;
24
+ color: var(--sa-color-fg-muted);
25
+ font-size: var(--sa-text-xs);
26
26
  text-transform: uppercase;
27
27
  letter-spacing: 0.05em;
28
28
  font-weight: 700;
29
29
  }
30
30
  .kv__value {
31
- font-size: 14px;
31
+ font-size: var(--sa-text-lg);
32
32
  font-weight: 600;
33
- color: var(--sa-heading);
33
+ color: var(--sa-color-fg-heading);
34
34
  margin-top: 4px;
35
35
  }
36
36
  </style>
@@ -361,7 +361,11 @@ const cycleOptions = computed<Array<{ id: PromotionBillingCycle; label: string }
361
361
  { id: 'yearly', label: common.value.yearly },
362
362
  { id: 'both', label: common.value.both },
363
363
  ]);
364
- const COLORS = ['#10b981', '#dc2626', '#f59e0b', '#2563eb', '#7c3aed', '#0f172a'];
364
+ import { IDENTITY_ACCENT_VALUES } from '../client/identity-accents.js';
365
+
366
+ // Concrete values, not tokens: every swatch here is PATCHed to
367
+ // `/catalog/promotions` and stored, and the DTO caps `color` at 16 characters.
368
+ const COLORS = IDENTITY_ACCENT_VALUES;
365
369
 
366
370
  const today = new Date();
367
371
 
@@ -550,7 +554,7 @@ async function onAdd(): Promise<void> {
550
554
  validFrom: new Date().toISOString().slice(0, 10),
551
555
  validTo: new Date(today.getTime() + 30 * 86400000).toISOString().slice(0, 10),
552
556
  priority: 5,
553
- color: '#2563eb',
557
+ color: IDENTITY_ACCENT_VALUES[0],
554
558
  i18n: { [DEFAULT_LOCALE]: { badge: 'Aktion' } },
555
559
  });
556
560
  expandedId.value = created.id;
@@ -581,65 +585,65 @@ async function onRemove(p: PromotionRow): Promise<void> {
581
585
  flex: 1;
582
586
  }
583
587
  .mc-promo-title {
584
- font-size: 15px;
588
+ font-size: var(--sa-text-lg);
585
589
  font-weight: 700;
586
590
  }
587
591
  .mc-promo-subtitle {
588
- font-size: 12px;
589
- color: var(--sa-muted);
592
+ font-size: var(--sa-text-sm);
593
+ color: var(--sa-color-fg-muted);
590
594
  }
591
595
  .mc-promo-stats {
592
596
  display: flex;
593
597
  gap: 8px;
594
598
  }
595
599
  .mc-promo-stat {
596
- font-size: 11px;
600
+ font-size: var(--sa-text-xs);
597
601
  font-weight: 600;
598
602
  padding: 3px 9px;
599
603
  border-radius: 999px;
600
- background: var(--sa-border-soft);
601
- color: var(--sa-muted-dark);
604
+ background: var(--sa-color-border-soft);
605
+ color: var(--sa-color-fg-secondary);
602
606
  }
603
607
  .mc-promo-stat.active {
604
- background: #dcfce7;
605
- color: #166534;
608
+ background: var(--sa-color-positive-surface-strong);
609
+ color: var(--sa-color-positive-fg);
606
610
  }
607
611
  .mc-promo-stat.scheduled {
608
- background: #dbeafe;
609
- color: var(--sa-primary-strong);
612
+ background: var(--sa-color-scheduled-surface);
613
+ color: var(--sa-color-scheduled-fg);
610
614
  }
611
615
  .mc-promo-stat.expired {
612
- background: var(--sa-border-soft);
613
- color: var(--sa-muted-light);
616
+ background: var(--sa-color-border-soft);
617
+ color: var(--sa-color-fg-subtle);
614
618
  }
615
619
  .mc-promo-timeline {
616
- background: #fff;
617
- border: 1px solid var(--sa-border);
620
+ background: var(--sa-color-bg-surface);
621
+ border: 1px solid var(--sa-color-border);
618
622
  border-radius: 10px;
619
623
  padding: 12px 14px;
620
624
  }
621
625
  .mc-promo-timeline-head {
622
- font-size: 11px;
623
- color: var(--sa-muted);
626
+ font-size: var(--sa-text-xs);
627
+ color: var(--sa-color-fg-muted);
624
628
  margin-bottom: 6px;
625
629
  }
626
630
  .mc-promo-timeline-chart {
627
631
  position: relative;
628
- border-left: 1px solid var(--sa-border);
632
+ border-left: 1px solid var(--sa-color-border);
629
633
  }
630
634
  .mc-promo-tick {
631
635
  position: absolute;
632
636
  top: 0;
633
637
  bottom: 0;
634
638
  width: 1px;
635
- background: var(--sa-border-soft);
639
+ background: var(--sa-color-border-soft);
636
640
  }
637
641
  .mc-promo-tick-label {
638
642
  position: absolute;
639
643
  bottom: 0;
640
644
  left: 3px;
641
- font-size: 9px;
642
- color: var(--sa-muted-light);
645
+ font-size: var(--sa-text-2xs);
646
+ color: var(--sa-color-fg-subtle);
643
647
  white-space: nowrap;
644
648
  }
645
649
  .mc-promo-today {
@@ -647,14 +651,14 @@ async function onRemove(p: PromotionRow): Promise<void> {
647
651
  top: 0;
648
652
  bottom: 18px;
649
653
  width: 0;
650
- border-left: 2px dashed #ef4444;
654
+ border-left: 2px dashed var(--sa-color-negative-strong);
651
655
  }
652
656
  .mc-promo-today span {
653
657
  position: absolute;
654
658
  top: -2px;
655
659
  left: 3px;
656
- font-size: 9px;
657
- color: #ef4444;
660
+ font-size: var(--sa-text-2xs);
661
+ color: var(--sa-color-negative-strong);
658
662
  font-weight: 700;
659
663
  }
660
664
  .mc-promo-bar {
@@ -671,8 +675,8 @@ async function onRemove(p: PromotionRow): Promise<void> {
671
675
  opacity: 0.45;
672
676
  }
673
677
  .mc-promo-bar-label {
674
- font-size: 10px;
675
- color: #fff;
678
+ font-size: var(--sa-text-2xs);
679
+ color: var(--sa-color-fg-on-accent);
676
680
  font-weight: 600;
677
681
  padding: 0 6px;
678
682
  white-space: nowrap;
@@ -680,9 +684,9 @@ async function onRemove(p: PromotionRow): Promise<void> {
680
684
  .mc-promo-empty {
681
685
  padding: 28px;
682
686
  text-align: center;
683
- color: var(--sa-muted-light);
684
- font-size: 13px;
685
- border: 1px dashed #cbd5e1;
687
+ color: var(--sa-color-fg-subtle);
688
+ font-size: var(--sa-text-md);
689
+ border: 1px dashed var(--sa-color-border-strong);
686
690
  border-radius: 10px;
687
691
  }
688
692
  .mc-promo-list {
@@ -694,14 +698,14 @@ async function onRemove(p: PromotionRow): Promise<void> {
694
698
  display: flex;
695
699
  align-items: center;
696
700
  gap: 12px;
697
- background: #fff;
698
- border: 1px solid var(--sa-border);
701
+ background: var(--sa-color-bg-surface);
702
+ border: 1px solid var(--sa-color-border);
699
703
  border-radius: 8px;
700
704
  padding: 10px 12px;
701
705
  cursor: pointer;
702
706
  }
703
707
  .mc-promo-row.expanded {
704
- border-color: #3f6bff;
708
+ border-color: var(--sa-color-accent);
705
709
  border-bottom-left-radius: 0;
706
710
  border-bottom-right-radius: 0;
707
711
  }
@@ -716,7 +720,7 @@ async function onRemove(p: PromotionRow): Promise<void> {
716
720
  min-width: 0;
717
721
  }
718
722
  .mc-promo-row-title {
719
- font-size: 13px;
723
+ font-size: var(--sa-text-md);
720
724
  font-weight: 600;
721
725
  }
722
726
  .mc-promo-row-sub {
@@ -727,57 +731,57 @@ async function onRemove(p: PromotionRow): Promise<void> {
727
731
  margin-top: 2px;
728
732
  }
729
733
  .mc-promo-typechip {
730
- font-size: 10px;
734
+ font-size: var(--sa-text-2xs);
731
735
  font-weight: 700;
732
- background: var(--sa-primary-50);
733
- color: var(--sa-primary-strong);
736
+ background: var(--sa-color-accent-surface-strong);
737
+ color: var(--sa-color-accent-strong);
734
738
  padding: 1px 6px;
735
739
  border-radius: 4px;
736
740
  }
737
741
  .mc-promo-planchip {
738
- font-size: 10px;
739
- background: var(--sa-border-soft);
740
- color: var(--sa-muted-dark);
742
+ font-size: var(--sa-text-2xs);
743
+ background: var(--sa-color-border-soft);
744
+ color: var(--sa-color-fg-secondary);
741
745
  padding: 1px 6px;
742
746
  border-radius: 4px;
743
747
  }
744
748
  .mc-promo-muted {
745
- font-size: 11px;
746
- color: var(--sa-muted-light);
749
+ font-size: var(--sa-text-xs);
750
+ color: var(--sa-color-fg-subtle);
747
751
  }
748
752
  .mc-promo-row-when {
749
- font-size: 11px;
750
- color: var(--sa-muted);
753
+ font-size: var(--sa-text-xs);
754
+ color: var(--sa-color-fg-muted);
751
755
  text-align: right;
752
756
  }
753
757
  .mc-promo-cycle {
754
758
  display: block;
755
- color: var(--sa-muted-light);
759
+ color: var(--sa-color-fg-subtle);
756
760
  }
757
761
  .mc-promo-status {
758
- font-size: 10px;
762
+ font-size: var(--sa-text-2xs);
759
763
  font-weight: 700;
760
764
  text-transform: uppercase;
761
765
  padding: 3px 8px;
762
766
  border-radius: 6px;
763
767
  }
764
768
  .mc-promo-status.active {
765
- background: #dcfce7;
766
- color: #166534;
769
+ background: var(--sa-color-positive-surface-strong);
770
+ color: var(--sa-color-positive-fg);
767
771
  }
768
772
  .mc-promo-status.scheduled {
769
- background: #dbeafe;
770
- color: var(--sa-primary-strong);
773
+ background: var(--sa-color-scheduled-surface);
774
+ color: var(--sa-color-scheduled-fg);
771
775
  }
772
776
  .mc-promo-status.expired {
773
- background: var(--sa-border-soft);
774
- color: var(--sa-muted-light);
777
+ background: var(--sa-color-border-soft);
778
+ color: var(--sa-color-fg-subtle);
775
779
  }
776
780
  .mc-promo-editor {
777
- border: 1px solid #3f6bff;
781
+ border: 1px solid var(--sa-color-accent);
778
782
  border-top: 0;
779
783
  border-radius: 0 0 8px 8px;
780
- background: var(--sa-bg-surface-2);
784
+ background: var(--sa-color-bg-sunken);
781
785
  padding: 14px;
782
786
  }
783
787
  .mc-promo-editor-grid {
@@ -791,18 +795,18 @@ async function onRemove(p: PromotionRow): Promise<void> {
791
795
  gap: 6px;
792
796
  }
793
797
  .mc-promo-label {
794
- font-size: 10px;
798
+ font-size: var(--sa-text-2xs);
795
799
  font-weight: 700;
796
800
  text-transform: uppercase;
797
801
  letter-spacing: 0.5px;
798
- color: var(--sa-muted-dark);
802
+ color: var(--sa-color-fg-secondary);
799
803
  margin-top: 6px;
800
804
  }
801
805
  .mc-promo-input {
802
- border: 1px solid #cbd5e1;
806
+ border: 1px solid var(--sa-color-border-strong);
803
807
  border-radius: 6px;
804
808
  padding: 6px 8px;
805
- font-size: 13px;
809
+ font-size: var(--sa-text-md);
806
810
  }
807
811
  .mc-promo-input--sm {
808
812
  max-width: 90px;
@@ -818,17 +822,17 @@ async function onRemove(p: PromotionRow): Promise<void> {
818
822
  gap: 6px;
819
823
  }
820
824
  .mc-promo-typeopt {
821
- border: 1px solid #cbd5e1;
822
- background: #fff;
825
+ border: 1px solid var(--sa-color-border-strong);
826
+ background: var(--sa-color-bg-surface);
823
827
  border-radius: 6px;
824
828
  padding: 5px 10px;
825
- font-size: 12px;
829
+ font-size: var(--sa-text-sm);
826
830
  cursor: pointer;
827
831
  }
828
832
  .mc-promo-typeopt.active {
829
- border-color: #3f6bff;
830
- background: var(--sa-primary-50);
831
- color: var(--sa-primary-strong);
833
+ border-color: var(--sa-color-accent);
834
+ background: var(--sa-color-accent-surface-strong);
835
+ color: var(--sa-color-accent-strong);
832
836
  font-weight: 600;
833
837
  }
834
838
  .mc-promo-planlist {
@@ -839,34 +843,34 @@ async function onRemove(p: PromotionRow): Promise<void> {
839
843
  .mc-promo-planopt {
840
844
  display: flex;
841
845
  justify-content: space-between;
842
- border: 1px solid #cbd5e1;
843
- background: #fff;
846
+ border: 1px solid var(--sa-color-border-strong);
847
+ background: var(--sa-color-bg-surface);
844
848
  border-radius: 6px;
845
849
  padding: 6px 10px;
846
- font-size: 12px;
850
+ font-size: var(--sa-text-sm);
847
851
  cursor: pointer;
848
852
  }
849
853
  .mc-promo-planopt.active {
850
- border-color: #3f6bff;
851
- background: var(--sa-primary-50);
854
+ border-color: var(--sa-color-accent);
855
+ background: var(--sa-color-accent-surface-strong);
852
856
  }
853
857
  .mc-promo-planopt code {
854
- color: var(--sa-muted-light);
855
- font-size: 10px;
858
+ color: var(--sa-color-fg-subtle);
859
+ font-size: var(--sa-text-2xs);
856
860
  }
857
861
  .mc-promo-i18n-block {
858
862
  display: flex;
859
863
  flex-direction: column;
860
864
  gap: 4px;
861
865
  padding: 8px;
862
- border: 1px solid var(--sa-border);
866
+ border: 1px solid var(--sa-color-border);
863
867
  border-radius: 8px;
864
- background: #fff;
868
+ background: var(--sa-color-bg-surface);
865
869
  }
866
870
  .mc-promo-i18n-code {
867
- font-size: 10px;
871
+ font-size: var(--sa-text-2xs);
868
872
  font-weight: 700;
869
- background: var(--sa-border-soft);
873
+ background: var(--sa-color-border-soft);
870
874
  padding: 2px 7px;
871
875
  border-radius: 5px;
872
876
  align-self: flex-start;
@@ -883,16 +887,16 @@ async function onRemove(p: PromotionRow): Promise<void> {
883
887
  cursor: pointer;
884
888
  }
885
889
  .mc-promo-colorbtn.active {
886
- border-color: var(--sa-heading);
890
+ border-color: var(--sa-color-fg-heading);
887
891
  }
888
892
  .mc-promo-delete {
889
893
  margin-top: 12px;
890
894
  align-self: flex-start;
891
- border: 1px solid #fecaca;
892
- background: #fef2f2;
893
- color: #b91c1c;
895
+ border: 1px solid var(--sa-color-negative-border);
896
+ background: var(--sa-color-negative-surface);
897
+ color: var(--sa-color-negative-fg);
894
898
  font-weight: 600;
895
- font-size: 12px;
899
+ font-size: var(--sa-text-sm);
896
900
  padding: 6px 12px;
897
901
  border-radius: 6px;
898
902
  cursor: pointer;
@@ -102,9 +102,9 @@ function onConfirm() {
102
102
  padding-bottom: 0;
103
103
  }
104
104
  code {
105
- background: rgba(15, 23, 42, 0.06);
105
+ background: var(--sa-color-bg-sunken);
106
106
  padding: 1px 6px;
107
107
  border-radius: 4px;
108
- font-size: 11px;
108
+ font-size: var(--sa-text-xs);
109
109
  }
110
110
  </style>
@@ -236,19 +236,19 @@ function onCancel(): void {
236
236
  }
237
237
  .tenant-action-confirm__lead {
238
238
  margin: 0 0 12px;
239
- color: var(--sa-muted-dark);
239
+ color: var(--sa-color-fg-secondary);
240
240
  line-height: 1.5;
241
241
  }
242
242
  .tenant-action-confirm__hint {
243
243
  margin: 0 0 8px;
244
- color: var(--sa-muted-dark);
245
- font-size: 13px;
244
+ color: var(--sa-color-fg-secondary);
245
+ font-size: var(--sa-text-md);
246
246
  }
247
247
  .tenant-action-confirm__hint code {
248
- background: var(--sa-border-soft);
248
+ background: var(--sa-color-border-soft);
249
249
  padding: 1px 6px;
250
250
  border-radius: 4px;
251
251
  font-family: ui-monospace, SFMono-Regular, monospace;
252
- font-size: 13px;
252
+ font-size: var(--sa-text-md);
253
253
  }
254
254
  </style>
@@ -109,12 +109,12 @@ function formatValue(value: unknown): string {
109
109
 
110
110
  <style scoped>
111
111
  .sa-diff-preview__empty {
112
- color: var(--sa-muted);
112
+ color: var(--sa-color-fg-muted);
113
113
  font-style: italic;
114
114
  padding: 12px;
115
- background: var(--sa-bg-surface-2);
115
+ background: var(--sa-color-bg-sunken);
116
116
  border-radius: 8px;
117
- border: 1px dashed #cbd5e1;
117
+ border: 1px dashed var(--sa-color-border-strong);
118
118
  }
119
119
  .sa-diff-preview__list {
120
120
  display: flex;
@@ -128,35 +128,35 @@ function formatValue(value: unknown): string {
128
128
  padding: 8px 12px;
129
129
  border-radius: 8px;
130
130
  border: 1px solid;
131
- font-size: 13px;
131
+ font-size: var(--sa-text-md);
132
132
  align-items: center;
133
133
  }
134
134
  .sa-diff-preview__row--improvement {
135
- background: #f0fdf4;
136
- border-color: #bbf7d0;
137
- color: #166534;
135
+ background: var(--sa-color-positive-surface);
136
+ border-color: var(--sa-color-positive-border);
137
+ color: var(--sa-color-positive-fg);
138
138
  }
139
139
  .sa-diff-preview__row--regression {
140
- background: #fef2f2;
141
- border-color: #fecaca;
142
- color: #991b1b;
140
+ background: var(--sa-color-negative-surface);
141
+ border-color: var(--sa-color-negative-border);
142
+ color: var(--sa-color-negative-fg);
143
143
  }
144
144
  .sa-diff-preview__row--neutral {
145
- background: var(--sa-bg-surface-2);
146
- border-color: var(--sa-border);
147
- color: var(--sa-muted-dark);
145
+ background: var(--sa-color-bg-sunken);
146
+ border-color: var(--sa-color-border);
147
+ color: var(--sa-color-fg-secondary);
148
148
  }
149
149
  .sa-diff-preview__direction {
150
150
  display: flex;
151
151
  align-items: center;
152
152
  gap: 6px;
153
153
  font-weight: 600;
154
- font-size: 12px;
154
+ font-size: var(--sa-text-sm);
155
155
  text-transform: uppercase;
156
156
  letter-spacing: 0.04em;
157
157
  }
158
158
  .sa-diff-preview__field {
159
- color: var(--sa-heading);
159
+ color: var(--sa-color-fg-heading);
160
160
  font-weight: 500;
161
161
  }
162
162
  .sa-diff-preview__values {
@@ -165,15 +165,15 @@ function formatValue(value: unknown): string {
165
165
  gap: 8px;
166
166
  }
167
167
  .sa-diff-preview__values .old {
168
- color: var(--sa-muted-light);
168
+ color: var(--sa-color-fg-subtle);
169
169
  text-decoration: line-through;
170
170
  font-family: ui-monospace, 'SF Mono', Menlo, monospace;
171
- font-size: 12px;
171
+ font-size: var(--sa-text-sm);
172
172
  }
173
173
  .sa-diff-preview__values .new {
174
174
  color: inherit;
175
175
  font-weight: 600;
176
176
  font-family: ui-monospace, 'SF Mono', Menlo, monospace;
177
- font-size: 12px;
177
+ font-size: var(--sa-text-sm);
178
178
  }
179
179
  </style>