@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
@@ -164,7 +164,9 @@ import type {
164
164
  ResolvedMarketing,
165
165
  } from './marketing-catalog/types.js';
166
166
 
167
- const DEFAULT_ACCENT = '#64748b';
167
+ import { IDENTITY_NEUTRAL, identityAccentAt } from '../client/identity-accents.js';
168
+
169
+ const DEFAULT_ACCENT = IDENTITY_NEUTRAL;
168
170
 
169
171
  const props = defineProps<{
170
172
  adminEndpoint: string;
@@ -650,7 +652,7 @@ function promoFineprintOf(row: MarketingRow): string {
650
652
  return promo.i18n?.[activeLocale.value]?.fineprint || promo.i18n?.de?.fineprint || '';
651
653
  }
652
654
  function promoColorOf(row: MarketingRow): string {
653
- return promoOf(row)?.color ?? '#10b981';
655
+ return promoOf(row)?.color ?? identityAccentAt(0);
654
656
  }
655
657
 
656
658
  // ─── CTA ───
@@ -839,8 +841,8 @@ async function onLocaleChange(loc: string): Promise<void> {
839
841
  <style>
840
842
  .sa-marketing {
841
843
  padding: 22px 26px;
842
- background: var(--sa-bg-app);
843
- color: var(--sa-heading);
844
+ background: var(--sa-color-bg-app);
845
+ color: var(--sa-color-fg-heading);
844
846
  font-family: var(--sa-font-body);
845
847
  min-height: 100%;
846
848
  box-sizing: border-box;
@@ -855,8 +857,8 @@ async function onLocaleChange(loc: string): Promise<void> {
855
857
  .sa-marketing-locale-switch {
856
858
  display: inline-flex;
857
859
  gap: 2px;
858
- background: var(--sa-bg-surface);
859
- border: 1px solid var(--sa-border);
860
+ background: var(--sa-color-bg-surface);
861
+ border: 1px solid var(--sa-color-border);
860
862
  border-radius: 8px;
861
863
  padding: 3px;
862
864
  }
@@ -865,13 +867,13 @@ async function onLocaleChange(loc: string): Promise<void> {
865
867
  border: 0;
866
868
  background: transparent;
867
869
  border-radius: 6px;
868
- font: 500 12px var(--sa-font-mono);
869
- color: var(--sa-muted-dark);
870
+ font: 500 var(--sa-text-sm) var(--sa-font-mono);
871
+ color: var(--sa-color-fg-secondary);
870
872
  cursor: pointer;
871
873
  }
872
874
  .sa-marketing-locale-btn.active {
873
- background: var(--sa-primary-50);
874
- color: var(--sa-primary-strong);
875
+ background: var(--sa-color-accent-surface-strong);
876
+ color: var(--sa-color-accent-strong);
875
877
  font-weight: 600;
876
878
  }
877
879
  .sa-marketing-locale-mgr {
@@ -881,52 +883,52 @@ async function onLocaleChange(loc: string): Promise<void> {
881
883
  flex-wrap: wrap;
882
884
  }
883
885
  .sa-marketing-locale-mgr-label {
884
- font-size: 11px;
885
- color: var(--sa-muted-light);
886
+ font-size: var(--sa-text-xs);
887
+ color: var(--sa-color-fg-subtle);
886
888
  }
887
889
  .sa-marketing-locale-pill {
888
890
  display: inline-flex;
889
891
  align-items: center;
890
- border: 1px solid var(--sa-border);
892
+ border: 1px solid var(--sa-color-border);
891
893
  border-radius: 7px;
892
894
  overflow: hidden;
893
895
  }
894
896
  .sa-marketing-locale-pill.active {
895
- border-color: var(--sa-primary-strong);
896
- background: var(--sa-primary-50);
897
+ border-color: var(--sa-color-accent-strong);
898
+ background: var(--sa-color-accent-surface-strong);
897
899
  }
898
900
  .sa-marketing-locale-pill-btn {
899
901
  border: 0;
900
902
  background: transparent;
901
903
  padding: 4px 8px;
902
- font: 600 11px var(--sa-font-mono);
903
- color: var(--sa-muted-dark);
904
+ font: 600 var(--sa-text-xs) var(--sa-font-mono);
905
+ color: var(--sa-color-fg-secondary);
904
906
  cursor: pointer;
905
907
  }
906
908
  .sa-marketing-locale-pill.active .sa-marketing-locale-pill-btn {
907
- color: var(--sa-primary-strong);
909
+ color: var(--sa-color-accent-strong);
908
910
  }
909
911
  .sa-marketing-locale-x {
910
912
  border: 0;
911
913
  background: transparent;
912
914
  padding: 4px 7px;
913
- color: var(--sa-muted-light);
915
+ color: var(--sa-color-fg-subtle);
914
916
  cursor: pointer;
915
- font-size: 13px;
917
+ font-size: var(--sa-text-md);
916
918
  }
917
919
  .sa-marketing-locale-x:hover {
918
- color: #dc2626;
920
+ color: var(--sa-color-negative);
919
921
  }
920
922
  .sa-marketing-locale-add-wrap {
921
923
  position: relative;
922
924
  }
923
925
  .sa-marketing-locale-add {
924
- border: 1px dashed var(--sa-border);
926
+ border: 1px dashed var(--sa-color-border);
925
927
  background: transparent;
926
928
  border-radius: 7px;
927
929
  padding: 4px 9px;
928
- font-size: 11px;
929
- color: var(--sa-muted-dark);
930
+ font-size: var(--sa-text-xs);
931
+ color: var(--sa-color-fg-secondary);
930
932
  cursor: pointer;
931
933
  }
932
934
  .sa-marketing-locale-add:disabled {
@@ -938,10 +940,10 @@ async function onLocaleChange(loc: string): Promise<void> {
938
940
  top: 100%;
939
941
  right: 0;
940
942
  margin-top: 4px;
941
- background: var(--sa-bg-surface);
942
- border: 1px solid var(--sa-border);
943
+ background: var(--sa-color-bg-surface);
944
+ border: 1px solid var(--sa-color-border);
943
945
  border-radius: 8px;
944
- box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
946
+ box-shadow: 0 8px 24px var(--sa-shadow-tint-3);
945
947
  padding: 4px;
946
948
  display: flex;
947
949
  flex-direction: column;
@@ -955,67 +957,77 @@ async function onLocaleChange(loc: string): Promise<void> {
955
957
  padding: 6px 10px;
956
958
  text-align: left;
957
959
  border-radius: 6px;
958
- font: 600 11px var(--sa-font-mono);
960
+ font: 600 var(--sa-text-xs) var(--sa-font-mono);
959
961
  cursor: pointer;
960
962
  }
961
963
  .sa-marketing-locale-picker-row:hover {
962
- background: var(--sa-primary-50);
964
+ background: var(--sa-color-accent-surface-strong);
963
965
  }
964
966
 
965
967
  .sa-marketing-banner {
966
968
  border-radius: 8px;
967
969
  padding: 10px 14px;
968
- font-size: 12.5px;
970
+ font-size: var(--sa-text-md);
969
971
  margin-bottom: 14px;
970
972
  display: flex;
971
973
  align-items: center;
972
974
  gap: 8px;
973
975
  }
974
976
  .sa-marketing-banner--error {
975
- background: #fef2f2;
976
- color: #b91c1c;
977
- border: 1px solid #fca5a5;
977
+ background: var(--sa-color-negative-surface);
978
+ color: var(--sa-color-negative-fg);
979
+ border: 1px solid var(--sa-color-negative-border);
978
980
  }
979
981
  .sa-marketing-banner--info {
980
- background: var(--sa-primary-50);
981
- color: #1e40af;
982
- border: 1px solid #bfdbfe;
982
+ background: var(--sa-color-accent-surface-strong);
983
+ color: var(--sa-color-info-fg);
984
+ border: 1px solid var(--sa-color-info-border);
983
985
  }
984
986
  .sa-marketing-banner-x {
985
987
  margin-left: auto;
986
988
  background: transparent;
987
989
  border: 0;
988
990
  cursor: pointer;
989
- font-size: 18px;
991
+ font-size: var(--sa-text-xl);
990
992
  line-height: 1;
991
993
  color: inherit;
992
994
  }
993
995
  .sa-marketing-loading {
994
996
  padding: 40px;
995
997
  text-align: center;
996
- color: var(--sa-muted-light);
997
- font-size: 13px;
998
+ color: var(--sa-color-fg-subtle);
999
+ font-size: var(--sa-text-md);
998
1000
  }
999
1001
 
1000
1002
  .sa-marketing-toolbar {
1001
1003
  display: flex;
1004
+ /* The tab bar and the meta line do not fit side by side below ~672px, and
1005
+ * without this they simply pushed the page off its own right edge — at every
1006
+ * viewport narrower than that, not just the smallest. Nothing measured it
1007
+ * until the overflow guard started asking at each breakpoint band. */
1008
+ flex-wrap: wrap;
1002
1009
  gap: 12px;
1003
1010
  align-items: center;
1004
1011
  margin: 0px;
1005
1012
  }
1006
1013
  .sa-marketing-tabbar {
1007
1014
  display: inline-flex;
1015
+ /* Scrolls rather than wraps: a row of tabs broken across two lines reads as
1016
+ * two groups. It fits every band except the narrowest phone, where the four
1017
+ * tabs need 389px. */
1018
+ overflow-x: auto;
1019
+ max-width: 100%;
1008
1020
  gap: 2px;
1009
- background: var(--sa-bg-surface);
1010
- border: 1px solid var(--sa-border);
1021
+ background: var(--sa-color-bg-surface);
1022
+ border: 1px solid var(--sa-color-border);
1011
1023
  border-radius: 8px;
1012
1024
  padding: 3px;
1013
1025
  }
1014
1026
  .sa-marketing-tab {
1015
1027
  padding: 6px 14px;
1016
1028
  border-radius: 6px;
1017
- font: 500 13px var(--sa-font-body);
1018
- color: var(--sa-muted-dark);
1029
+ font: 500 var(--sa-text-md) var(--sa-font-body);
1030
+ color: var(--sa-color-fg-secondary);
1019
1031
  background: transparent;
1020
1032
  border: 0;
1021
1033
  cursor: pointer;
@@ -1024,50 +1036,54 @@ async function onLocaleChange(loc: string): Promise<void> {
1024
1036
  color 0.12s;
1025
1037
  }
1026
1038
  .sa-marketing-tab:hover {
1027
- color: var(--sa-heading);
1039
+ color: var(--sa-color-fg-heading);
1028
1040
  }
1029
1041
  .sa-marketing-tab.active {
1030
- background: var(--sa-primary-50);
1031
- color: var(--sa-primary-strong);
1042
+ background: var(--sa-color-accent-surface-strong);
1043
+ color: var(--sa-color-accent-strong);
1032
1044
  font-weight: 600;
1033
1045
  }
1034
1046
  .sa-marketing-tab-count {
1035
1047
  display: inline-block;
1036
1048
  margin-left: 5px;
1037
- background: #10b981;
1038
- color: #fff;
1039
- font-size: 10px;
1049
+ background: var(--sa-color-positive-surface-strong);
1050
+ color: var(--sa-color-positive-fg);
1051
+ font-size: var(--sa-text-2xs);
1040
1052
  font-weight: 700;
1041
1053
  padding: 1px 6px;
1042
1054
  border-radius: 999px;
1043
1055
  }
1044
1056
  .sa-marketing-meta {
1045
1057
  margin-left: auto;
1046
- font-size: 12px;
1047
- color: var(--sa-muted-dark);
1058
+ /* Its own contents wrap too: `catalogVersion <code> · locale <code>` is
1059
+ * wider than a phone on its own, so wrapping only the toolbar would move
1060
+ * the overflow one level down instead of removing it. */
1061
+ flex-wrap: wrap;
1062
+ font-size: var(--sa-text-sm);
1063
+ color: var(--sa-color-fg-secondary);
1048
1064
  display: flex;
1049
1065
  align-items: center;
1050
1066
  gap: 8px;
1051
1067
  }
1052
1068
  .sa-marketing-meta code {
1053
- font: 500 11px var(--sa-font-mono);
1054
- background: var(--sa-border-soft);
1055
- color: var(--sa-muted-dark);
1069
+ font: 500 var(--sa-text-xs) var(--sa-font-mono);
1070
+ background: var(--sa-color-border-soft);
1071
+ color: var(--sa-color-fg-secondary);
1056
1072
  padding: 2px 7px;
1057
1073
  border-radius: 4px;
1058
1074
  }
1059
1075
 
1060
1076
  /* ── Public catalog preview ── */
1061
1077
  .sa-marketing-window {
1062
- background: var(--sa-bg-surface);
1063
- border: 1px solid var(--sa-border);
1078
+ background: var(--sa-color-bg-surface);
1079
+ border: 1px solid var(--sa-color-border);
1064
1080
  border-radius: 12px;
1065
1081
  overflow: hidden;
1066
1082
  }
1067
1083
  .sa-marketing-chrome {
1068
1084
  height: 36px;
1069
- background: var(--sa-border-soft);
1070
- border-bottom: 1px solid var(--sa-border);
1085
+ background: var(--sa-color-border-soft);
1086
+ border-bottom: 1px solid var(--sa-color-border);
1071
1087
  display: flex;
1072
1088
  align-items: center;
1073
1089
  padding: 0 14px;
@@ -1081,36 +1097,40 @@ async function onLocaleChange(loc: string): Promise<void> {
1081
1097
  .sa-marketing-chrome-url {
1082
1098
  margin-left: 18px;
1083
1099
  flex: 1;
1084
- background: var(--sa-bg-surface);
1085
- border: 1px solid var(--sa-border);
1100
+ background: var(--sa-color-bg-surface);
1101
+ border: 1px solid var(--sa-color-border);
1086
1102
  border-radius: 6px;
1087
1103
  padding: 4px 10px;
1088
- font: 500 11.5px var(--sa-font-mono);
1089
- color: var(--sa-muted-dark);
1104
+ font: 500 var(--sa-text-sm) var(--sa-font-mono);
1105
+ color: var(--sa-color-fg-secondary);
1090
1106
  max-width: 380px;
1091
1107
  }
1092
1108
  .sa-marketing-canvas {
1093
- background: linear-gradient(180deg, #fbfbfd 0%, #fff 100%);
1109
+ background: linear-gradient(
1110
+ 180deg,
1111
+ var(--sa-color-bg-surface-raised) 0%,
1112
+ var(--sa-color-bg-surface) 100%
1113
+ );
1094
1114
  padding: 36px 32px 28px;
1095
1115
  }
1096
1116
  .sa-marketing-eyebrow {
1097
- font: 700 11px var(--sa-font-body);
1117
+ font: 700 var(--sa-text-xs) var(--sa-font-body);
1098
1118
  letter-spacing: 0.14em;
1099
1119
  text-transform: uppercase;
1100
- color: var(--sa-primary);
1120
+ color: var(--sa-color-accent);
1101
1121
  text-align: center;
1102
1122
  }
1103
1123
  .sa-marketing-hero {
1104
- font-size: 32px;
1124
+ font-size: var(--sa-text-4xl);
1105
1125
  font-weight: 700;
1106
1126
  letter-spacing: -0.025em;
1107
- color: var(--sa-heading);
1127
+ color: var(--sa-color-fg-heading);
1108
1128
  text-align: center;
1109
1129
  margin: 10px 0 6px;
1110
1130
  }
1111
1131
  .sa-marketing-sub {
1112
- font-size: 14px;
1113
- color: var(--sa-muted-dark);
1132
+ font-size: var(--sa-text-lg);
1133
+ color: var(--sa-color-fg-secondary);
1114
1134
  text-align: center;
1115
1135
  max-width: 540px;
1116
1136
  margin: 0 auto 26px;
@@ -1121,8 +1141,8 @@ async function onLocaleChange(loc: string): Promise<void> {
1121
1141
  gap: 16px;
1122
1142
  }
1123
1143
  .sa-marketing-card {
1124
- background: var(--sa-bg-surface);
1125
- border: 1px solid var(--sa-border);
1144
+ background: var(--sa-color-bg-surface);
1145
+ border: 1px solid var(--sa-color-border);
1126
1146
  border-radius: 12px;
1127
1147
  padding: 22px 20px 20px;
1128
1148
  display: flex;
@@ -1135,20 +1155,20 @@ async function onLocaleChange(loc: string): Promise<void> {
1135
1155
  }
1136
1156
  .sa-marketing-card:hover {
1137
1157
  transform: translateY(-2px);
1138
- box-shadow: 0 8px 24px rgba(15, 23, 42, 0.06);
1158
+ box-shadow: 0 8px 24px var(--sa-shadow-tint-1);
1139
1159
  }
1140
1160
  .sa-marketing-card.featured {
1141
- border-color: #bfdbfe;
1142
- box-shadow: 0 10px 32px rgba(37, 99, 235, 0.1);
1161
+ border-color: var(--sa-color-info-border);
1162
+ box-shadow: 0 10px 32px var(--sa-shadow-tint-2);
1143
1163
  }
1144
1164
  .sa-marketing-card-badge {
1145
1165
  position: absolute;
1146
1166
  top: -10px;
1147
1167
  left: 50%;
1148
1168
  transform: translateX(-50%);
1149
- background: var(--sa-primary);
1150
- color: #fff;
1151
- font: 700 10.5px var(--sa-font-body);
1169
+ background: var(--sa-color-accent);
1170
+ color: var(--sa-color-fg-on-accent);
1171
+ font: 700 var(--sa-text-xs) var(--sa-font-body);
1152
1172
  letter-spacing: 0.1em;
1153
1173
  text-transform: uppercase;
1154
1174
  padding: 4px 12px;
@@ -1156,21 +1176,21 @@ async function onLocaleChange(loc: string): Promise<void> {
1156
1176
  white-space: nowrap;
1157
1177
  }
1158
1178
  .sa-marketing-card-key {
1159
- font: 700 10.5px var(--sa-font-mono);
1179
+ font: 700 var(--sa-text-xs) var(--sa-font-mono);
1160
1180
  letter-spacing: 0.08em;
1161
- color: var(--sa-muted-light);
1181
+ color: var(--sa-color-fg-subtle);
1162
1182
  text-transform: uppercase;
1163
1183
  }
1164
1184
  .sa-marketing-card-name {
1165
- font-size: 22px;
1185
+ font-size: var(--sa-text-2xl);
1166
1186
  font-weight: 700;
1167
1187
  letter-spacing: -0.02em;
1168
- color: var(--sa-heading);
1188
+ color: var(--sa-color-fg-heading);
1169
1189
  margin: 2px 0 4px;
1170
1190
  }
1171
1191
  .sa-marketing-card-desc {
1172
- font-size: 12.5px;
1173
- color: var(--sa-muted-dark);
1192
+ font-size: var(--sa-text-md);
1193
+ color: var(--sa-color-fg-secondary);
1174
1194
  line-height: 1.4;
1175
1195
  min-height: 36px;
1176
1196
  }
@@ -1181,18 +1201,18 @@ async function onLocaleChange(loc: string): Promise<void> {
1181
1201
  gap: 6px;
1182
1202
  }
1183
1203
  .sa-marketing-card-price-big {
1184
- font-size: 32px;
1204
+ font-size: var(--sa-text-4xl);
1185
1205
  font-weight: 700;
1186
1206
  letter-spacing: -0.03em;
1187
- color: var(--sa-heading);
1207
+ color: var(--sa-color-fg-heading);
1188
1208
  }
1189
1209
  .sa-marketing-card-price-unit {
1190
- font-size: 13px;
1191
- color: var(--sa-muted-light);
1210
+ font-size: var(--sa-text-md);
1211
+ color: var(--sa-color-fg-subtle);
1192
1212
  }
1193
1213
  .sa-marketing-card-price-y {
1194
- font-size: 11.5px;
1195
- color: var(--sa-muted-light);
1214
+ font-size: var(--sa-text-sm);
1215
+ color: var(--sa-color-fg-subtle);
1196
1216
  margin-bottom: 12px;
1197
1217
  }
1198
1218
  .sa-marketing-card-cta {
@@ -1200,41 +1220,41 @@ async function onLocaleChange(loc: string): Promise<void> {
1200
1220
  margin-top: 14px;
1201
1221
  padding: 9px 12px;
1202
1222
  border-radius: 8px;
1203
- border: 1px solid var(--sa-border);
1204
- background: var(--sa-bg-surface);
1205
- color: var(--sa-heading);
1206
- font: 600 13px var(--sa-font-body);
1223
+ border: 1px solid var(--sa-color-border);
1224
+ background: var(--sa-color-bg-surface);
1225
+ color: var(--sa-color-fg-heading);
1226
+ font: 600 var(--sa-text-md) var(--sa-font-body);
1207
1227
  cursor: pointer;
1208
1228
  transition:
1209
1229
  background 0.12s,
1210
1230
  border-color 0.12s;
1211
1231
  }
1212
1232
  .sa-marketing-card-cta:hover {
1213
- background: var(--sa-bg-surface-2);
1233
+ background: var(--sa-color-bg-sunken);
1214
1234
  }
1215
1235
  .sa-marketing-card.featured .sa-marketing-card-cta {
1216
- background: var(--sa-primary);
1217
- border-color: var(--sa-primary);
1218
- color: #fff;
1236
+ background: var(--sa-color-accent);
1237
+ border-color: var(--sa-color-accent);
1238
+ color: var(--sa-color-fg-on-accent);
1219
1239
  }
1220
1240
  .sa-marketing-card.featured .sa-marketing-card-cta:hover {
1221
- background: var(--sa-primary-strong);
1241
+ background: var(--sa-color-accent-strong);
1222
1242
  }
1223
1243
  .sa-marketing-card-trialnote {
1224
- font-size: 11px;
1225
- color: var(--sa-muted-light);
1244
+ font-size: var(--sa-text-xs);
1245
+ color: var(--sa-color-fg-subtle);
1226
1246
  text-align: center;
1227
1247
  margin-top: 6px;
1228
1248
  }
1229
1249
  .sa-marketing-card.has-promo {
1230
- border-color: #10b981;
1250
+ border-color: var(--sa-color-positive-strong);
1231
1251
  }
1232
1252
  .sa-marketing-promo-ribbon {
1233
1253
  position: absolute;
1234
1254
  top: 12px;
1235
1255
  right: -2px;
1236
- color: #fff;
1237
- font-size: 11px;
1256
+ color: var(--sa-color-fg-on-accent);
1257
+ font-size: var(--sa-text-xs);
1238
1258
  font-weight: 700;
1239
1259
  padding: 3px 12px 3px 10px;
1240
1260
  border-radius: 4px 0 0 4px;
@@ -1246,27 +1266,27 @@ async function onLocaleChange(loc: string): Promise<void> {
1246
1266
  margin-top: 2px;
1247
1267
  }
1248
1268
  .sa-marketing-card-price-strike s {
1249
- color: var(--sa-muted-light);
1250
- font-size: 14px;
1269
+ color: var(--sa-color-fg-subtle);
1270
+ font-size: var(--sa-text-lg);
1251
1271
  }
1252
1272
  .sa-marketing-price-regular {
1253
- font-size: 10px;
1273
+ font-size: var(--sa-text-2xs);
1254
1274
  text-transform: uppercase;
1255
1275
  letter-spacing: 0.5px;
1256
- color: var(--sa-muted-light);
1276
+ color: var(--sa-color-fg-subtle);
1257
1277
  }
1258
1278
  .sa-marketing-card-fineprint {
1259
- font-size: 10px;
1260
- color: #059669;
1279
+ font-size: var(--sa-text-2xs);
1280
+ color: var(--sa-color-positive);
1261
1281
  text-align: center;
1262
1282
  margin-top: 6px;
1263
1283
  }
1264
1284
  .sa-marketing-card-includes {
1265
1285
  margin-top: 18px;
1266
- font-size: 11px;
1286
+ font-size: var(--sa-text-xs);
1267
1287
  text-transform: uppercase;
1268
1288
  letter-spacing: 0.08em;
1269
- color: var(--sa-muted-light);
1289
+ color: var(--sa-color-fg-subtle);
1270
1290
  font-weight: 700;
1271
1291
  }
1272
1292
  .sa-marketing-card-features {
@@ -1276,8 +1296,8 @@ async function onLocaleChange(loc: string): Promise<void> {
1276
1296
  display: flex;
1277
1297
  flex-direction: column;
1278
1298
  gap: 7px;
1279
- font-size: 12.5px;
1280
- color: #334155;
1299
+ font-size: var(--sa-text-md);
1300
+ color: var(--sa-color-fg-body);
1281
1301
  }
1282
1302
  .sa-marketing-card-features li {
1283
1303
  display: flex;
@@ -1286,42 +1306,42 @@ async function onLocaleChange(loc: string): Promise<void> {
1286
1306
  line-height: 1.35;
1287
1307
  }
1288
1308
  .sa-marketing-card-features .sa-marketing-tick {
1289
- color: #10b981;
1309
+ color: var(--sa-color-positive-strong);
1290
1310
  flex: 0 0 14px;
1291
1311
  margin-top: 1px;
1292
1312
  }
1293
1313
  .sa-marketing-card-features b {
1294
- color: var(--sa-heading);
1314
+ color: var(--sa-color-fg-heading);
1295
1315
  font-weight: 700;
1296
1316
  }
1297
1317
  .sa-marketing-card-features-empty {
1298
1318
  margin-top: 8px;
1299
- font-size: 12px;
1300
- color: var(--sa-muted-light);
1319
+ font-size: var(--sa-text-sm);
1320
+ color: var(--sa-color-fg-subtle);
1301
1321
  }
1302
1322
 
1303
1323
  /* ── Marketing administration ── */
1304
1324
  .sa-marketing-admin {
1305
- background: var(--sa-bg-surface);
1306
- border: 1px solid var(--sa-border);
1325
+ background: var(--sa-color-bg-surface);
1326
+ border: 1px solid var(--sa-color-border);
1307
1327
  border-radius: 10px;
1308
1328
  }
1309
1329
  .sa-marketing-admin-head {
1310
1330
  padding: 14px 16px;
1311
- border-bottom: 1px solid var(--sa-border-soft);
1331
+ border-bottom: 1px solid var(--sa-color-border-soft);
1312
1332
  display: flex;
1313
1333
  align-items: center;
1314
1334
  gap: 12px;
1315
1335
  }
1316
1336
  .sa-marketing-admin-title {
1317
- font-size: 14px;
1337
+ font-size: var(--sa-text-lg);
1318
1338
  font-weight: 700;
1319
1339
  letter-spacing: -0.01em;
1320
- color: var(--sa-heading);
1340
+ color: var(--sa-color-fg-heading);
1321
1341
  }
1322
1342
  .sa-marketing-admin-sub {
1323
- font-size: 11.5px;
1324
- color: var(--sa-muted-dark);
1343
+ font-size: var(--sa-text-sm);
1344
+ color: var(--sa-color-fg-secondary);
1325
1345
  }
1326
1346
  .sa-marketing-admin-grid {
1327
1347
  display: grid;
@@ -1332,28 +1352,28 @@ async function onLocaleChange(loc: string): Promise<void> {
1332
1352
  display: contents;
1333
1353
  }
1334
1354
  .sa-marketing-admin-thead > div {
1335
- background: #fbfbfd;
1355
+ background: var(--sa-color-bg-surface-raised);
1336
1356
  padding: 10px 14px;
1337
- font-size: 10.5px;
1357
+ font-size: var(--sa-text-xs);
1338
1358
  text-transform: uppercase;
1339
1359
  letter-spacing: 0.1em;
1340
- color: var(--sa-muted-dark);
1360
+ color: var(--sa-color-fg-secondary);
1341
1361
  font-weight: 700;
1342
- border-bottom: 1px solid var(--sa-border);
1362
+ border-bottom: 1px solid var(--sa-color-border);
1343
1363
  }
1344
1364
  .sa-marketing-admin-row {
1345
1365
  display: contents;
1346
1366
  }
1347
1367
  .sa-marketing-admin-row > div {
1348
1368
  padding: 12px 14px;
1349
- border-bottom: 1px solid var(--sa-border-soft);
1369
+ border-bottom: 1px solid var(--sa-color-border-soft);
1350
1370
  display: flex;
1351
1371
  align-items: center;
1352
- font-size: 12.5px;
1353
- color: var(--sa-heading);
1372
+ font-size: var(--sa-text-md);
1373
+ color: var(--sa-color-fg-heading);
1354
1374
  }
1355
1375
  .sa-marketing-admin-row--disabled > div {
1356
- background: #fcfcfd;
1376
+ background: var(--sa-color-bg-surface-raised);
1357
1377
  }
1358
1378
  .sa-marketing-admin-row-end {
1359
1379
  justify-content: flex-end;
@@ -1370,41 +1390,41 @@ async function onLocaleChange(loc: string): Promise<void> {
1370
1390
  border-radius: 8px;
1371
1391
  display: grid;
1372
1392
  place-items: center;
1373
- font: 700 10px var(--sa-font-mono);
1393
+ font: 700 var(--sa-text-2xs) var(--sa-font-mono);
1374
1394
  border: 1px solid;
1375
1395
  }
1376
1396
  .sa-marketing-plan-label {
1377
- font-size: 13px;
1397
+ font-size: var(--sa-text-md);
1378
1398
  font-weight: 700;
1379
- color: var(--sa-heading);
1399
+ color: var(--sa-color-fg-heading);
1380
1400
  }
1381
1401
  .sa-marketing-plan-key {
1382
- font: 500 11px var(--sa-font-mono);
1383
- color: var(--sa-muted-light);
1402
+ font: 500 var(--sa-text-xs) var(--sa-font-mono);
1403
+ color: var(--sa-color-fg-subtle);
1384
1404
  }
1385
1405
 
1386
1406
  .sa-marketing-field {
1387
1407
  width: 100%;
1388
1408
  padding: 5px 8px;
1389
- font: 400 12px var(--sa-font-body);
1390
- color: var(--sa-heading);
1391
- background: var(--sa-bg-surface);
1392
- border: 1px solid var(--sa-border-strong);
1409
+ font: 400 var(--sa-text-sm) var(--sa-font-body);
1410
+ color: var(--sa-color-fg-heading);
1411
+ background: var(--sa-color-bg-surface);
1412
+ border: 1px solid var(--sa-color-border-strong);
1393
1413
  border-radius: 6px;
1394
1414
  }
1395
1415
  .sa-marketing-field:focus {
1396
1416
  outline: none;
1397
- border-color: var(--sa-primary);
1398
- box-shadow: 0 0 0 3px var(--sa-primary-50);
1417
+ border-color: var(--sa-color-accent);
1418
+ box-shadow: 0 0 0 3px var(--sa-color-accent-surface-strong);
1399
1419
  }
1400
1420
  .sa-marketing-field:disabled {
1401
- background: var(--sa-border-soft);
1402
- color: var(--sa-muted-light);
1421
+ background: var(--sa-color-border-soft);
1422
+ color: var(--sa-color-fg-subtle);
1403
1423
  cursor: not-allowed;
1404
1424
  }
1405
1425
  .sa-marketing-field--area {
1406
1426
  resize: vertical;
1407
- font-size: 12.5px;
1427
+ font-size: var(--sa-text-md);
1408
1428
  line-height: 1.4;
1409
1429
  }
1410
1430
 
@@ -1420,7 +1440,7 @@ async function onLocaleChange(loc: string): Promise<void> {
1420
1440
  .sa-marketing-toggle span {
1421
1441
  position: absolute;
1422
1442
  inset: 0;
1423
- background: #cbd5e1;
1443
+ background: var(--sa-color-border-strong);
1424
1444
  border-radius: 999px;
1425
1445
  transition: background 0.15s;
1426
1446
  cursor: pointer;
@@ -1430,15 +1450,15 @@ async function onLocaleChange(loc: string): Promise<void> {
1430
1450
  position: absolute;
1431
1451
  width: 16px;
1432
1452
  height: 16px;
1433
- background: #fff;
1453
+ background: var(--sa-color-bg-surface);
1434
1454
  border-radius: 50%;
1435
1455
  left: 2px;
1436
1456
  top: 2px;
1437
1457
  transition: transform 0.15s;
1438
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
1458
+ box-shadow: 0 1px 2px var(--sa-shadow-tint-4);
1439
1459
  }
1440
1460
  .sa-marketing-toggle input:checked + span {
1441
- background: var(--sa-primary);
1461
+ background: var(--sa-color-accent);
1442
1462
  }
1443
1463
  .sa-marketing-toggle input:checked + span::before {
1444
1464
  transform: translateX(16px);
@@ -1454,24 +1474,24 @@ async function onLocaleChange(loc: string): Promise<void> {
1454
1474
  gap: 5px;
1455
1475
  padding: 2px 8px;
1456
1476
  border-radius: 999px;
1457
- font-size: 11px;
1477
+ font-size: var(--sa-text-xs);
1458
1478
  font-weight: 600;
1459
1479
  border: 1px solid;
1460
1480
  }
1461
1481
  .sa-marketing-chip--muted {
1462
- background: var(--sa-border-soft);
1463
- color: var(--sa-muted-dark);
1464
- border-color: #cbd5e1;
1482
+ background: var(--sa-color-border-soft);
1483
+ color: var(--sa-color-fg-secondary);
1484
+ border-color: var(--sa-color-border-strong);
1465
1485
  }
1466
1486
  .sa-marketing-chip--featured {
1467
- background: var(--sa-primary-50);
1468
- color: var(--sa-primary-strong);
1469
- border-color: #bfdbfe;
1487
+ background: var(--sa-color-accent-surface-strong);
1488
+ color: var(--sa-color-accent-strong);
1489
+ border-color: var(--sa-color-info-border);
1470
1490
  }
1471
1491
  .sa-marketing-chip--live {
1472
- background: var(--sa-positive-bg);
1473
- color: #047857;
1474
- border-color: #a7f3d0;
1492
+ background: var(--sa-color-positive-surface);
1493
+ color: var(--sa-color-positive-fg);
1494
+ border-color: var(--sa-color-positive-border);
1475
1495
  }
1476
1496
  .sa-marketing-chip--live::before {
1477
1497
  content: '';
@@ -1490,16 +1510,16 @@ async function onLocaleChange(loc: string): Promise<void> {
1490
1510
  border: 1px solid transparent;
1491
1511
  border-radius: 6px;
1492
1512
  cursor: pointer;
1493
- color: var(--sa-muted-light);
1513
+ color: var(--sa-color-fg-subtle);
1494
1514
  transition:
1495
1515
  background 0.12s,
1496
1516
  color 0.12s,
1497
1517
  border-color 0.12s;
1498
1518
  }
1499
1519
  .sa-marketing-expand-btn:hover {
1500
- background: var(--sa-border-soft);
1501
- color: var(--sa-primary);
1502
- border-color: var(--sa-border);
1520
+ background: var(--sa-color-border-soft);
1521
+ color: var(--sa-color-accent);
1522
+ border-color: var(--sa-color-border);
1503
1523
  }
1504
1524
  .sa-marketing-chev {
1505
1525
  display: inline-flex;
@@ -1511,8 +1531,12 @@ async function onLocaleChange(loc: string): Promise<void> {
1511
1531
 
1512
1532
  .sa-marketing-admin-expand {
1513
1533
  grid-column: 1 / -1;
1514
- background: linear-gradient(180deg, #fbfbfd 0%, #fff 100%);
1515
- border-bottom: 1px solid var(--sa-border-soft);
1534
+ background: linear-gradient(
1535
+ 180deg,
1536
+ var(--sa-color-bg-surface-raised) 0%,
1537
+ var(--sa-color-bg-surface) 100%
1538
+ );
1539
+ border-bottom: 1px solid var(--sa-color-border-soft);
1516
1540
  padding: 18px 20px 22px;
1517
1541
  }
1518
1542
  .sa-marketing-expand-grid {
@@ -1531,15 +1555,15 @@ async function onLocaleChange(loc: string): Promise<void> {
1531
1555
  gap: 6px;
1532
1556
  }
1533
1557
  .sa-marketing-expand-label {
1534
- font-size: 10.5px;
1558
+ font-size: var(--sa-text-xs);
1535
1559
  text-transform: uppercase;
1536
1560
  letter-spacing: 0.1em;
1537
- color: var(--sa-muted-dark);
1561
+ color: var(--sa-color-fg-secondary);
1538
1562
  font-weight: 700;
1539
1563
  }
1540
1564
  .sa-marketing-expand-hint {
1541
- font-size: 11px;
1542
- color: var(--sa-muted-light);
1565
+ font-size: var(--sa-text-xs);
1566
+ color: var(--sa-color-fg-subtle);
1543
1567
  }
1544
1568
  .sa-marketing-field-head {
1545
1569
  display: flex;
@@ -1548,11 +1572,11 @@ async function onLocaleChange(loc: string): Promise<void> {
1548
1572
  flex-wrap: wrap;
1549
1573
  }
1550
1574
  .sa-marketing-source-hint {
1551
- font-size: 11px;
1552
- color: var(--sa-muted-light);
1575
+ font-size: var(--sa-text-xs);
1576
+ color: var(--sa-color-fg-subtle);
1553
1577
  }
1554
1578
  .sa-marketing-source-hint em {
1555
- color: var(--sa-muted-dark);
1579
+ color: var(--sa-color-fg-secondary);
1556
1580
  font-style: normal;
1557
1581
  }
1558
1582
  .sa-marketing-locked-value {
@@ -1560,17 +1584,17 @@ async function onLocaleChange(loc: string): Promise<void> {
1560
1584
  align-items: center;
1561
1585
  gap: 8px;
1562
1586
  padding: 8px 10px;
1563
- background: var(--sa-bg-surface);
1564
- border: 1px solid var(--sa-border);
1587
+ background: var(--sa-color-bg-surface);
1588
+ border: 1px solid var(--sa-color-border);
1565
1589
  border-radius: 6px;
1566
- font-size: 13px;
1567
- color: var(--sa-heading);
1590
+ font-size: var(--sa-text-md);
1591
+ color: var(--sa-color-fg-heading);
1568
1592
  }
1569
1593
  .sa-marketing-locked-hint {
1570
- font-size: 10px;
1594
+ font-size: var(--sa-text-2xs);
1571
1595
  text-transform: uppercase;
1572
- color: var(--sa-muted-light);
1573
- background: rgba(148, 163, 184, 0.15);
1596
+ color: var(--sa-color-fg-subtle);
1597
+ background: var(--sa-color-bg-sunken);
1574
1598
  padding: 1px 6px;
1575
1599
  border-radius: 4px;
1576
1600
  margin-left: auto;
@@ -1579,14 +1603,14 @@ async function onLocaleChange(loc: string): Promise<void> {
1579
1603
  display: flex;
1580
1604
  align-items: center;
1581
1605
  gap: 10px;
1582
- background: var(--sa-bg-surface);
1583
- border: 1px solid var(--sa-border);
1606
+ background: var(--sa-color-bg-surface);
1607
+ border: 1px solid var(--sa-color-border);
1584
1608
  border-radius: 8px;
1585
1609
  padding: 8px 12px;
1586
1610
  }
1587
1611
  .sa-marketing-trial-label {
1588
- font-size: 13px;
1589
- color: var(--sa-heading);
1612
+ font-size: var(--sa-text-md);
1613
+ color: var(--sa-color-fg-heading);
1590
1614
  }
1591
1615
  .sa-marketing-trial-days {
1592
1616
  margin-left: auto;
@@ -1595,8 +1619,8 @@ async function onLocaleChange(loc: string): Promise<void> {
1595
1619
  gap: 6px;
1596
1620
  }
1597
1621
  .sa-marketing-trial-unit {
1598
- font-size: 12px;
1599
- color: var(--sa-muted-dark);
1622
+ font-size: var(--sa-text-sm);
1623
+ color: var(--sa-color-fg-secondary);
1600
1624
  }
1601
1625
 
1602
1626
  .sa-marketing-tf-head {
@@ -1615,8 +1639,8 @@ async function onLocaleChange(loc: string): Promise<void> {
1615
1639
  align-items: center;
1616
1640
  }
1617
1641
  .sa-marketing-tf-num {
1618
- font: 600 11px var(--sa-font-mono);
1619
- color: var(--sa-muted-light);
1642
+ font: 600 var(--sa-text-xs) var(--sa-font-mono);
1643
+ color: var(--sa-color-fg-subtle);
1620
1644
  text-align: center;
1621
1645
  }
1622
1646
  .sa-marketing-tf-actions {
@@ -1628,39 +1652,39 @@ async function onLocaleChange(loc: string): Promise<void> {
1628
1652
  height: 24px;
1629
1653
  display: grid;
1630
1654
  place-items: center;
1631
- background: var(--sa-bg-surface);
1632
- border: 1px solid var(--sa-border);
1655
+ background: var(--sa-color-bg-surface);
1656
+ border: 1px solid var(--sa-color-border);
1633
1657
  border-radius: 5px;
1634
1658
  cursor: pointer;
1635
- font: 600 10px var(--sa-font-body);
1636
- color: var(--sa-muted-dark);
1659
+ font: 600 var(--sa-text-2xs) var(--sa-font-body);
1660
+ color: var(--sa-color-fg-secondary);
1637
1661
  padding: 0;
1638
1662
  transition:
1639
1663
  background 0.12s,
1640
1664
  border-color 0.12s;
1641
1665
  }
1642
1666
  .sa-marketing-iconbtn:hover:not(:disabled) {
1643
- background: var(--sa-border-soft);
1644
- border-color: #cbd5e1;
1667
+ background: var(--sa-color-border-soft);
1668
+ border-color: var(--sa-color-border-strong);
1645
1669
  }
1646
1670
  .sa-marketing-iconbtn:disabled {
1647
1671
  opacity: 0.35;
1648
1672
  cursor: not-allowed;
1649
1673
  }
1650
1674
  .sa-marketing-iconbtn--danger {
1651
- color: #b91c1c;
1675
+ color: var(--sa-color-negative-fg);
1652
1676
  }
1653
1677
  .sa-marketing-iconbtn--danger:hover:not(:disabled) {
1654
- background: #fef2f2;
1655
- border-color: #fca5a5;
1678
+ background: var(--sa-color-negative-surface);
1679
+ border-color: var(--sa-color-negative-border);
1656
1680
  }
1657
1681
  .sa-marketing-tf-empty {
1658
1682
  padding: 14px;
1659
1683
  text-align: center;
1660
- font-size: 12px;
1661
- color: var(--sa-muted-light);
1662
- background: var(--sa-bg-surface);
1663
- border: 1px dashed #cbd5e1;
1684
+ font-size: var(--sa-text-sm);
1685
+ color: var(--sa-color-fg-subtle);
1686
+ background: var(--sa-color-bg-surface);
1687
+ border: 1px dashed var(--sa-color-border-strong);
1664
1688
  border-radius: 8px;
1665
1689
  }
1666
1690
  .sa-marketing-tf-add {
@@ -1681,10 +1705,10 @@ async function onLocaleChange(loc: string): Promise<void> {
1681
1705
  gap: 5px;
1682
1706
  padding: 3px 9px;
1683
1707
  border-radius: 999px;
1684
- background: var(--sa-bg-surface);
1685
- border: 1px dashed #cbd5e1;
1686
- font-size: 11.5px;
1687
- color: var(--sa-muted-dark);
1708
+ background: var(--sa-color-bg-surface);
1709
+ border: 1px dashed var(--sa-color-border-strong);
1710
+ font-size: var(--sa-text-sm);
1711
+ color: var(--sa-color-fg-secondary);
1688
1712
  cursor: pointer;
1689
1713
  transition:
1690
1714
  background 0.12s,
@@ -1693,21 +1717,21 @@ async function onLocaleChange(loc: string): Promise<void> {
1693
1717
  }
1694
1718
  .sa-marketing-tf-chip em {
1695
1719
  font-style: normal;
1696
- color: var(--sa-muted-light);
1697
- font: 500 11px var(--sa-font-mono);
1720
+ color: var(--sa-color-fg-subtle);
1721
+ font: 500 var(--sa-text-xs) var(--sa-font-mono);
1698
1722
  }
1699
1723
  .sa-marketing-tf-chip:hover:not(:disabled) {
1700
- background: var(--sa-primary-50);
1701
- border-color: #93c5fd;
1724
+ background: var(--sa-color-accent-surface-strong);
1725
+ border-color: var(--sa-color-info-border);
1702
1726
  border-style: solid;
1703
- color: var(--sa-primary-strong);
1727
+ color: var(--sa-color-accent-strong);
1704
1728
  }
1705
1729
  .sa-marketing-tf-chip:disabled {
1706
1730
  opacity: 0.5;
1707
1731
  cursor: not-allowed;
1708
1732
  }
1709
1733
 
1710
- @media (max-width: 980px) {
1734
+ @media (max-width: 1023.98px) {
1711
1735
  .sa-marketing-expand-grid {
1712
1736
  grid-template-columns: 1fr;
1713
1737
  }
@@ -1723,12 +1747,12 @@ async function onLocaleChange(loc: string): Promise<void> {
1723
1747
  margin-top: 6px;
1724
1748
  }
1725
1749
  .sa-marketing-version-tab {
1726
- border: 1px solid var(--sa-border);
1727
- background: #fff;
1750
+ border: 1px solid var(--sa-color-border);
1751
+ background: var(--sa-color-bg-surface);
1728
1752
  border-radius: 6px;
1729
1753
  padding: 2px 8px;
1730
- font: 600 10.5px var(--sa-font-mono, ui-monospace, monospace);
1731
- color: var(--sa-muted);
1754
+ font: 600 var(--sa-text-xs) var(--sa-font-mono, ui-monospace, monospace);
1755
+ color: var(--sa-color-fg-muted);
1732
1756
  cursor: pointer;
1733
1757
  letter-spacing: 0.02em;
1734
1758
  transition:
@@ -1737,13 +1761,13 @@ async function onLocaleChange(loc: string): Promise<void> {
1737
1761
  color 0.1s;
1738
1762
  }
1739
1763
  .sa-marketing-version-tab:hover {
1740
- border-color: #cbd5e1;
1741
- background: var(--sa-bg-surface-2);
1742
- color: var(--sa-muted-dark);
1764
+ border-color: var(--sa-color-border-strong);
1765
+ background: var(--sa-color-bg-sunken);
1766
+ color: var(--sa-color-fg-secondary);
1743
1767
  }
1744
1768
  .sa-marketing-version-tab--active {
1745
- border-color: var(--sa-primary-strong);
1746
- background: var(--sa-primary-50);
1747
- color: var(--sa-primary-strong);
1769
+ border-color: var(--sa-color-accent-strong);
1770
+ background: var(--sa-color-accent-surface-strong);
1771
+ color: var(--sa-color-accent-strong);
1748
1772
  }
1749
1773
  </style>