@saasicat/ui-vue 0.19.0 → 0.21.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 (66) hide show
  1. package/dist/{catalog-JXdKdIqG.d.cts → catalog-BY_t9prv.d.cts} +1 -0
  2. package/dist/{catalog-JXdKdIqG.d.ts → catalog-BY_t9prv.d.ts} +1 -0
  3. package/dist/{chunk-RVG6LQHL.js → chunk-7IFKVGZV.js} +1 -1
  4. package/dist/{chunk-DPTIOQXX.js → chunk-JN6HZGLV.js} +2 -0
  5. package/dist/{chunk-ORX3ZG47.js → chunk-OTP3OSSW.js} +1 -1
  6. package/dist/client/index.cjs +2 -0
  7. package/dist/client/index.d.cts +2 -2
  8. package/dist/client/index.d.ts +2 -2
  9. package/dist/client/index.js +2 -2
  10. package/dist/index.cjs +2 -0
  11. package/dist/index.d.cts +4 -4
  12. package/dist/index.d.ts +4 -4
  13. package/dist/index.js +3 -3
  14. package/dist/quasar/index.cjs +2 -0
  15. package/dist/quasar/index.d.cts +2 -2
  16. package/dist/quasar/index.d.ts +2 -2
  17. package/dist/quasar/index.js +2 -2
  18. package/dist/{use-super-admin-i18n-1nCOkvgi.d.cts → use-super-admin-i18n-DlJRGIVq.d.cts} +1 -1
  19. package/dist/{use-super-admin-i18n-BlqcD0N7.d.ts → use-super-admin-i18n-c_Eqsu9u.d.ts} +1 -1
  20. package/package.json +2 -2
  21. package/src/client/i18n/messages/common.ts +2 -0
  22. package/src/components/admin-page/AdminBody.vue +40 -0
  23. package/src/components/admin-page/AdminHero.vue +32 -0
  24. package/src/components/admin-page/AdminPage.vue +16 -0
  25. package/src/components/admin-page/AdminSection.vue +38 -0
  26. package/src/components/plan-cockpit/PlanCockpit.vue +15 -0
  27. package/src/components/plan-cockpit/PlanCockpitAuditLog.vue +8 -8
  28. package/src/components/plan-cockpit/PlanCockpitDiffPanel.vue +10 -11
  29. package/src/components/plan-cockpit/PlanCockpitImpactPanel.vue +8 -8
  30. package/src/components/plan-cockpit/PlanCockpitVersions.vue +9 -11
  31. package/src/components/plan-detail/PlanAuditLog.vue +7 -8
  32. package/src/components/plan-detail/PlanDetail.vue +14 -1
  33. package/src/components/plan-detail/PlanVersionDiffPanel.vue +5 -8
  34. package/src/components/plan-detail/PlanVersionsPanel.vue +9 -11
  35. package/src/components/plan-list/PlanList.vue +224 -257
  36. package/src/pages-standard/AdminLayout.vue +4 -2
  37. package/src/pages-standard/AuditPage.vue +18 -43
  38. package/src/pages-standard/BundlesPage.vue +17 -34
  39. package/src/pages-standard/DashboardPage.vue +20 -51
  40. package/src/pages-standard/DiscoveryPage.vue +38 -51
  41. package/src/pages-standard/EmailHistoryPage.vue +20 -71
  42. package/src/pages-standard/MarketingCatalogPage.vue +304 -315
  43. package/src/pages-standard/PilotsPage.vue +24 -56
  44. package/src/pages-standard/PlansPage.vue +25 -22
  45. package/src/pages-standard/PlatformEmailPage.vue +19 -51
  46. package/src/pages-standard/PromoCodeDetailPage.vue +39 -50
  47. package/src/pages-standard/PromoCodesPage.vue +8 -15
  48. package/src/pages-standard/SubscriptionsPage.vue +9 -35
  49. package/src/pages-standard/SuperAdminSetupWizard.vue +2 -1
  50. package/src/pages-standard/TenantDetailPage.vue +79 -174
  51. package/src/pages-standard/TenantsPage.vue +8 -33
  52. package/src/pages-standard/UsersPage.vue +21 -54
  53. package/src/pages-standard/bundles-page/BundlesToolbar.vue +67 -0
  54. package/src/pages-standard/marketing-catalog/MarketingCatalogAdmin.vue +111 -73
  55. package/src/pages-standard/marketing-catalog/MarketingCatalogHeader.vue +54 -62
  56. package/src/pages-standard/marketing-catalog/MarketingCatalogPreview.vue +53 -35
  57. package/src/pages-standard/marketing-catalog/MarketingCatalogToolbar.vue +7 -7
  58. package/src/pages-standard/plans-page/PlansPageToast.vue +5 -5
  59. package/src/pages-standard/sa-theme.css +85 -29
  60. package/src/pages-standard/tenant-detail/TenantMasterData.vue +28 -0
  61. package/src/pages-standard/tenant-detail/TenantUsage.vue +31 -0
  62. package/src/pages-standard/tenant-detail/TenantUsers.vue +21 -0
  63. package/src/pages-standard/tenant-detail/types.ts +38 -0
  64. package/src/vue/use-mfa-prompt.ts +72 -0
  65. package/src/pages-standard/bundles-page/BundlesHeader.vue +0 -68
  66. package/src/pages-standard/discovery-page/DiscoveryHeader.vue +0 -34
@@ -17,23 +17,27 @@
17
17
  `adminEndpoint` + `projectKey`, the wrapper stays thin.
18
18
  -->
19
19
  <template>
20
- <div class="mc">
21
- <MarketingCatalogHeader
22
- v-model:locale-picker-open="localePickerOpen"
23
- :active-locale-set="activeLocaleSet"
24
- :active-locale="activeLocale"
25
- :default-locale="defaultLocale"
26
- :addable-locales="addableLocales"
27
- :busy="busy"
28
- @locale-change="onLocaleChange"
29
- @remove-locale="removeLocale"
30
- @add-locale="addLocale"
31
- @reload="reloadAll"
32
- />
33
-
34
- <div v-if="pageError" class="mc-banner mc-banner--error" role="alert">
20
+ <AdminPage class="sa-marketing">
21
+ <AdminHero :title="msg.header.title" :subtitle="msg.header.subtitle">
22
+ <template #actions>
23
+ <MarketingCatalogHeader
24
+ v-model:locale-picker-open="localePickerOpen"
25
+ :active-locale-set="activeLocaleSet"
26
+ :active-locale="activeLocale"
27
+ :default-locale="defaultLocale"
28
+ :addable-locales="addableLocales"
29
+ :busy="busy"
30
+ @locale-change="onLocaleChange"
31
+ @remove-locale="removeLocale"
32
+ @add-locale="addLocale"
33
+ @reload="reloadAll"
34
+ />
35
+ </template>
36
+ </AdminHero>
37
+
38
+ <div v-if="pageError" class="sa-marketing-banner sa-marketing-banner--error" role="alert">
35
39
  <strong>{{ common.error }}:</strong> {{ pageError }}
36
- <button class="mc-banner-x" type="button" @click="pageError = null">×</button>
40
+ <button class="sa-marketing-banner-x" type="button" @click="pageError = null">×</button>
37
41
  </div>
38
42
 
39
43
  <MarketingCatalogToolbar
@@ -43,7 +47,7 @@
43
47
  :active-locale="activeLocale"
44
48
  />
45
49
 
46
- <div v-if="loading" class="mc-loading">{{ msg.page.loading }}</div>
50
+ <div v-if="loading" class="sa-marketing-loading">{{ msg.page.loading }}</div>
47
51
 
48
52
  <!-- ─── Tab: Promotions ─── -->
49
53
  <MarketingPromotionsTab
@@ -58,7 +62,7 @@
58
62
  :remove="promotionsApi.remove"
59
63
  />
60
64
 
61
- <div v-else-if="rows.length === 0" class="mc-banner mc-banner--info">
65
+ <div v-else-if="rows.length === 0" class="sa-marketing-banner sa-marketing-banner--info">
62
66
  {{ msg.page.emptyPlansBefore }} <strong>{{ msg.page.emptyPlansLink }}</strong>
63
67
  {{ msg.page.emptyPlansAfter }}
64
68
  </div>
@@ -106,11 +110,13 @@
106
110
  @add-feature="addFeature"
107
111
  @add-suggestion="addSuggestion"
108
112
  />
109
- </div>
113
+ </AdminPage>
110
114
  </template>
111
115
 
112
116
  <script setup lang="ts">
113
117
  import { computed, onMounted, ref } from 'vue';
118
+ import AdminHero from '../components/admin-page/AdminHero.vue';
119
+ import AdminPage from '../components/admin-page/AdminPage.vue';
114
120
  import {
115
121
  applyPromo,
116
122
  pickActivePromo,
@@ -815,144 +821,127 @@ async function onLocaleChange(loc: string): Promise<void> {
815
821
  </script>
816
822
 
817
823
  <style>
818
- .mc {
819
- --mc-bg: #f6f7f9;
820
- --mc-surface: #ffffff;
821
- --mc-surface-2: #f8fafc;
822
- --mc-border: #e5e7eb;
823
- --mc-border-strong: #d1d5db;
824
- --mc-text: #0f172a;
825
- --mc-text-2: #475569;
826
- --mc-text-3: #94a3b8;
827
- --mc-primary: #2563eb;
828
- --mc-primary-700: #1d4ed8;
829
- --mc-primary-50: #eff6ff;
830
- --mc-font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
831
- --mc-font-mono: 'JetBrains Mono', ui-monospace, 'SF Mono', Menlo, monospace;
824
+ .sa-marketing {
825
+ --sa-marketing-bg: #f6f7f9;
826
+ --sa-marketing-surface: #ffffff;
827
+ --sa-marketing-surface-2: #f8fafc;
828
+ --sa-marketing-border: #e5e7eb;
829
+ --sa-marketing-border-strong: #d1d5db;
830
+ --sa-marketing-text: #0f172a;
831
+ --sa-marketing-text-2: #475569;
832
+ --sa-marketing-text-3: #94a3b8;
833
+ --sa-marketing-primary: #2563eb;
834
+ --sa-marketing-primary-700: #1d4ed8;
835
+ --sa-marketing-primary-50: #eff6ff;
836
+ --sa-marketing-font-sans:
837
+ 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
838
+ --sa-marketing-font-mono: 'JetBrains Mono', ui-monospace, 'SF Mono', Menlo, monospace;
832
839
 
833
840
  padding: 22px 26px;
834
- background: var(--mc-bg);
835
- color: var(--mc-text);
836
- font-family: var(--mc-font-sans);
841
+ background: var(--sa-marketing-bg);
842
+ color: var(--sa-marketing-text);
843
+ font-family: var(--sa-marketing-font-sans);
837
844
  min-height: 100%;
838
845
  box-sizing: border-box;
839
846
  }
840
- .mc * {
847
+ .sa-marketing * {
841
848
  box-sizing: border-box;
842
849
  }
843
850
 
844
- .mc-page-head {
845
- display: flex;
846
- align-items: flex-end;
847
- justify-content: space-between;
848
- gap: 20px;
849
- margin-bottom: 14px;
850
- }
851
- .mc-h-title {
852
- font-size: 22px;
853
- font-weight: 700;
854
- letter-spacing: -0.02em;
855
- margin: 0;
856
- }
857
- .mc-h-sub {
858
- font-size: 12.5px;
859
- color: var(--mc-text-2);
860
- margin: 3px 0 0;
861
- }
862
- .mc-head-actions {
851
+ .sa-marketing-head-actions {
863
852
  display: flex;
864
853
  align-items: center;
865
854
  gap: 10px;
866
855
  }
867
856
 
868
- .mc-locale-switch {
857
+ .sa-marketing-locale-switch {
869
858
  display: inline-flex;
870
859
  gap: 2px;
871
- background: var(--mc-surface);
872
- border: 1px solid var(--mc-border);
860
+ background: var(--sa-marketing-surface);
861
+ border: 1px solid var(--sa-marketing-border);
873
862
  border-radius: 8px;
874
863
  padding: 3px;
875
864
  }
876
- .mc-locale-btn {
865
+ .sa-marketing-locale-btn {
877
866
  padding: 5px 10px;
878
867
  border: 0;
879
868
  background: transparent;
880
869
  border-radius: 6px;
881
- font: 500 12px var(--mc-font-mono);
882
- color: var(--mc-text-2);
870
+ font: 500 12px var(--sa-marketing-font-mono);
871
+ color: var(--sa-marketing-text-2);
883
872
  cursor: pointer;
884
873
  }
885
- .mc-locale-btn.active {
886
- background: var(--mc-primary-50);
887
- color: var(--mc-primary-700);
874
+ .sa-marketing-locale-btn.active {
875
+ background: var(--sa-marketing-primary-50);
876
+ color: var(--sa-marketing-primary-700);
888
877
  font-weight: 600;
889
878
  }
890
- .mc-locale-mgr {
879
+ .sa-marketing-locale-mgr {
891
880
  display: inline-flex;
892
881
  align-items: center;
893
882
  gap: 6px;
894
883
  flex-wrap: wrap;
895
884
  }
896
- .mc-locale-mgr-label {
885
+ .sa-marketing-locale-mgr-label {
897
886
  font-size: 11px;
898
- color: var(--mc-text-3);
887
+ color: var(--sa-marketing-text-3);
899
888
  }
900
- .mc-locale-pill {
889
+ .sa-marketing-locale-pill {
901
890
  display: inline-flex;
902
891
  align-items: center;
903
- border: 1px solid var(--mc-border);
892
+ border: 1px solid var(--sa-marketing-border);
904
893
  border-radius: 7px;
905
894
  overflow: hidden;
906
895
  }
907
- .mc-locale-pill.active {
908
- border-color: var(--mc-primary-700);
909
- background: var(--mc-primary-50);
896
+ .sa-marketing-locale-pill.active {
897
+ border-color: var(--sa-marketing-primary-700);
898
+ background: var(--sa-marketing-primary-50);
910
899
  }
911
- .mc-locale-pill-btn {
900
+ .sa-marketing-locale-pill-btn {
912
901
  border: 0;
913
902
  background: transparent;
914
903
  padding: 4px 8px;
915
- font: 600 11px var(--mc-font-mono);
916
- color: var(--mc-text-2);
904
+ font: 600 11px var(--sa-marketing-font-mono);
905
+ color: var(--sa-marketing-text-2);
917
906
  cursor: pointer;
918
907
  }
919
- .mc-locale-pill.active .mc-locale-pill-btn {
920
- color: var(--mc-primary-700);
908
+ .sa-marketing-locale-pill.active .sa-marketing-locale-pill-btn {
909
+ color: var(--sa-marketing-primary-700);
921
910
  }
922
- .mc-locale-x {
911
+ .sa-marketing-locale-x {
923
912
  border: 0;
924
913
  background: transparent;
925
914
  padding: 4px 7px;
926
- color: var(--mc-text-3);
915
+ color: var(--sa-marketing-text-3);
927
916
  cursor: pointer;
928
917
  font-size: 13px;
929
918
  }
930
- .mc-locale-x:hover {
919
+ .sa-marketing-locale-x:hover {
931
920
  color: #dc2626;
932
921
  }
933
- .mc-locale-add-wrap {
922
+ .sa-marketing-locale-add-wrap {
934
923
  position: relative;
935
924
  }
936
- .mc-locale-add {
937
- border: 1px dashed var(--mc-border);
925
+ .sa-marketing-locale-add {
926
+ border: 1px dashed var(--sa-marketing-border);
938
927
  background: transparent;
939
928
  border-radius: 7px;
940
929
  padding: 4px 9px;
941
930
  font-size: 11px;
942
- color: var(--mc-text-2);
931
+ color: var(--sa-marketing-text-2);
943
932
  cursor: pointer;
944
933
  }
945
- .mc-locale-add:disabled {
934
+ .sa-marketing-locale-add:disabled {
946
935
  opacity: 0.4;
947
936
  cursor: default;
948
937
  }
949
- .mc-locale-picker {
938
+ .sa-marketing-locale-picker {
950
939
  position: absolute;
951
940
  top: 100%;
952
941
  right: 0;
953
942
  margin-top: 4px;
954
- background: var(--mc-surface);
955
- border: 1px solid var(--mc-border);
943
+ background: var(--sa-marketing-surface);
944
+ border: 1px solid var(--sa-marketing-border);
956
945
  border-radius: 8px;
957
946
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
958
947
  padding: 4px;
@@ -962,48 +951,48 @@ async function onLocaleChange(loc: string): Promise<void> {
962
951
  z-index: 20;
963
952
  min-width: 80px;
964
953
  }
965
- .mc-locale-picker-row {
954
+ .sa-marketing-locale-picker-row {
966
955
  border: 0;
967
956
  background: transparent;
968
957
  padding: 6px 10px;
969
958
  text-align: left;
970
959
  border-radius: 6px;
971
- font: 600 11px var(--mc-font-mono);
960
+ font: 600 11px var(--sa-marketing-font-mono);
972
961
  cursor: pointer;
973
962
  }
974
- .mc-locale-picker-row:hover {
975
- background: var(--mc-primary-50);
963
+ .sa-marketing-locale-picker-row:hover {
964
+ background: var(--sa-marketing-primary-50);
976
965
  }
977
966
 
978
- .mc-btn {
967
+ .sa-marketing-btn {
979
968
  display: inline-flex;
980
969
  align-items: center;
981
970
  gap: 7px;
982
971
  padding: 8px 14px;
983
972
  border-radius: 7px;
984
- font: 500 13px var(--mc-font-sans);
973
+ font: 500 13px var(--sa-marketing-font-sans);
985
974
  cursor: pointer;
986
- border: 1px solid var(--mc-border-strong);
987
- background: var(--mc-surface);
988
- color: var(--mc-text);
975
+ border: 1px solid var(--sa-marketing-border-strong);
976
+ background: var(--sa-marketing-surface);
977
+ color: var(--sa-marketing-text);
989
978
  transition:
990
979
  background 0.12s,
991
980
  border-color 0.12s;
992
981
  }
993
- .mc-btn:hover:not(:disabled) {
982
+ .sa-marketing-btn:hover:not(:disabled) {
994
983
  background: #f8fafc;
995
984
  }
996
- .mc-btn:disabled {
985
+ .sa-marketing-btn:disabled {
997
986
  opacity: 0.5;
998
987
  cursor: not-allowed;
999
988
  }
1000
- .mc-btn--sm {
989
+ .sa-marketing-btn--sm {
1001
990
  padding: 5px 9px;
1002
991
  font-size: 12px;
1003
992
  gap: 5px;
1004
993
  }
1005
994
 
1006
- .mc-banner {
995
+ .sa-marketing-banner {
1007
996
  border-radius: 8px;
1008
997
  padding: 10px 14px;
1009
998
  font-size: 12.5px;
@@ -1012,17 +1001,17 @@ async function onLocaleChange(loc: string): Promise<void> {
1012
1001
  align-items: center;
1013
1002
  gap: 8px;
1014
1003
  }
1015
- .mc-banner--error {
1004
+ .sa-marketing-banner--error {
1016
1005
  background: #fef2f2;
1017
1006
  color: #b91c1c;
1018
1007
  border: 1px solid #fca5a5;
1019
1008
  }
1020
- .mc-banner--info {
1021
- background: var(--mc-primary-50);
1009
+ .sa-marketing-banner--info {
1010
+ background: var(--sa-marketing-primary-50);
1022
1011
  color: #1e40af;
1023
1012
  border: 1px solid #bfdbfe;
1024
1013
  }
1025
- .mc-banner-x {
1014
+ .sa-marketing-banner-x {
1026
1015
  margin-left: auto;
1027
1016
  background: transparent;
1028
1017
  border: 0;
@@ -1031,32 +1020,32 @@ async function onLocaleChange(loc: string): Promise<void> {
1031
1020
  line-height: 1;
1032
1021
  color: inherit;
1033
1022
  }
1034
- .mc-loading {
1023
+ .sa-marketing-loading {
1035
1024
  padding: 40px;
1036
1025
  text-align: center;
1037
- color: var(--mc-text-3);
1026
+ color: var(--sa-marketing-text-3);
1038
1027
  font-size: 13px;
1039
1028
  }
1040
1029
 
1041
- .mc-toolbar {
1030
+ .sa-marketing-toolbar {
1042
1031
  display: flex;
1043
1032
  gap: 12px;
1044
1033
  align-items: center;
1045
1034
  margin: 4px 0 16px;
1046
1035
  }
1047
- .mc-tabbar {
1036
+ .sa-marketing-tabbar {
1048
1037
  display: inline-flex;
1049
1038
  gap: 2px;
1050
- background: var(--mc-surface);
1051
- border: 1px solid var(--mc-border);
1039
+ background: var(--sa-marketing-surface);
1040
+ border: 1px solid var(--sa-marketing-border);
1052
1041
  border-radius: 8px;
1053
1042
  padding: 3px;
1054
1043
  }
1055
- .mc-tab {
1044
+ .sa-marketing-tab {
1056
1045
  padding: 6px 14px;
1057
1046
  border-radius: 6px;
1058
- font: 500 13px var(--mc-font-sans);
1059
- color: var(--mc-text-2);
1047
+ font: 500 13px var(--sa-marketing-font-sans);
1048
+ color: var(--sa-marketing-text-2);
1060
1049
  background: transparent;
1061
1050
  border: 0;
1062
1051
  cursor: pointer;
@@ -1064,15 +1053,15 @@ async function onLocaleChange(loc: string): Promise<void> {
1064
1053
  background 0.12s,
1065
1054
  color 0.12s;
1066
1055
  }
1067
- .mc-tab:hover {
1068
- color: var(--mc-text);
1056
+ .sa-marketing-tab:hover {
1057
+ color: var(--sa-marketing-text);
1069
1058
  }
1070
- .mc-tab.active {
1071
- background: var(--mc-primary-50);
1072
- color: var(--mc-primary-700);
1059
+ .sa-marketing-tab.active {
1060
+ background: var(--sa-marketing-primary-50);
1061
+ color: var(--sa-marketing-primary-700);
1073
1062
  font-weight: 600;
1074
1063
  }
1075
- .mc-tab-count {
1064
+ .sa-marketing-tab-count {
1076
1065
  display: inline-block;
1077
1066
  margin-left: 5px;
1078
1067
  background: #10b981;
@@ -1082,16 +1071,16 @@ async function onLocaleChange(loc: string): Promise<void> {
1082
1071
  padding: 1px 6px;
1083
1072
  border-radius: 999px;
1084
1073
  }
1085
- .mc-meta {
1074
+ .sa-marketing-meta {
1086
1075
  margin-left: auto;
1087
1076
  font-size: 12px;
1088
- color: var(--mc-text-2);
1077
+ color: var(--sa-marketing-text-2);
1089
1078
  display: flex;
1090
1079
  align-items: center;
1091
1080
  gap: 8px;
1092
1081
  }
1093
- .mc-meta code {
1094
- font: 500 11px var(--mc-font-mono);
1082
+ .sa-marketing-meta code {
1083
+ font: 500 11px var(--sa-marketing-font-mono);
1095
1084
  background: #f1f5f9;
1096
1085
  color: #475569;
1097
1086
  padding: 2px 7px;
@@ -1099,71 +1088,71 @@ async function onLocaleChange(loc: string): Promise<void> {
1099
1088
  }
1100
1089
 
1101
1090
  /* ── Public catalog preview ── */
1102
- .mc-window {
1103
- background: var(--mc-surface);
1104
- border: 1px solid var(--mc-border);
1091
+ .sa-marketing-window {
1092
+ background: var(--sa-marketing-surface);
1093
+ border: 1px solid var(--sa-marketing-border);
1105
1094
  border-radius: 12px;
1106
1095
  overflow: hidden;
1107
1096
  }
1108
- .mc-chrome {
1097
+ .sa-marketing-chrome {
1109
1098
  height: 36px;
1110
1099
  background: #f1f5f9;
1111
- border-bottom: 1px solid var(--mc-border);
1100
+ border-bottom: 1px solid var(--sa-marketing-border);
1112
1101
  display: flex;
1113
1102
  align-items: center;
1114
1103
  padding: 0 14px;
1115
1104
  gap: 6px;
1116
1105
  }
1117
- .mc-chrome-dot {
1106
+ .sa-marketing-chrome-dot {
1118
1107
  width: 10px;
1119
1108
  height: 10px;
1120
1109
  border-radius: 50%;
1121
1110
  }
1122
- .mc-chrome-url {
1111
+ .sa-marketing-chrome-url {
1123
1112
  margin-left: 18px;
1124
1113
  flex: 1;
1125
- background: var(--mc-surface);
1114
+ background: var(--sa-marketing-surface);
1126
1115
  border: 1px solid #e2e8f0;
1127
1116
  border-radius: 6px;
1128
1117
  padding: 4px 10px;
1129
- font: 500 11.5px var(--mc-font-mono);
1118
+ font: 500 11.5px var(--sa-marketing-font-mono);
1130
1119
  color: #475569;
1131
1120
  max-width: 380px;
1132
1121
  }
1133
- .mc-canvas {
1122
+ .sa-marketing-canvas {
1134
1123
  background: linear-gradient(180deg, #fbfbfd 0%, #fff 100%);
1135
1124
  padding: 36px 32px 28px;
1136
1125
  }
1137
- .mc-eyebrow {
1138
- font: 700 11px var(--mc-font-sans);
1126
+ .sa-marketing-eyebrow {
1127
+ font: 700 11px var(--sa-marketing-font-sans);
1139
1128
  letter-spacing: 0.14em;
1140
1129
  text-transform: uppercase;
1141
- color: var(--mc-primary);
1130
+ color: var(--sa-marketing-primary);
1142
1131
  text-align: center;
1143
1132
  }
1144
- .mc-hero {
1133
+ .sa-marketing-hero {
1145
1134
  font-size: 32px;
1146
1135
  font-weight: 700;
1147
1136
  letter-spacing: -0.025em;
1148
- color: var(--mc-text);
1137
+ color: var(--sa-marketing-text);
1149
1138
  text-align: center;
1150
1139
  margin: 10px 0 6px;
1151
1140
  }
1152
- .mc-sub {
1141
+ .sa-marketing-sub {
1153
1142
  font-size: 14px;
1154
- color: var(--mc-text-2);
1143
+ color: var(--sa-marketing-text-2);
1155
1144
  text-align: center;
1156
1145
  max-width: 540px;
1157
1146
  margin: 0 auto 26px;
1158
1147
  }
1159
- .mc-grid {
1148
+ .sa-marketing-grid {
1160
1149
  display: grid;
1161
1150
  grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
1162
1151
  gap: 16px;
1163
1152
  }
1164
- .mc-card {
1165
- background: var(--mc-surface);
1166
- border: 1px solid var(--mc-border);
1153
+ .sa-marketing-card {
1154
+ background: var(--sa-marketing-surface);
1155
+ border: 1px solid var(--sa-marketing-border);
1167
1156
  border-radius: 12px;
1168
1157
  padding: 22px 20px 20px;
1169
1158
  display: flex;
@@ -1174,103 +1163,103 @@ async function onLocaleChange(loc: string): Promise<void> {
1174
1163
  box-shadow 0.15s,
1175
1164
  border-color 0.15s;
1176
1165
  }
1177
- .mc-card:hover {
1166
+ .sa-marketing-card:hover {
1178
1167
  transform: translateY(-2px);
1179
1168
  box-shadow: 0 8px 24px rgba(15, 23, 42, 0.06);
1180
1169
  }
1181
- .mc-card.featured {
1170
+ .sa-marketing-card.featured {
1182
1171
  border-color: #bfdbfe;
1183
1172
  box-shadow: 0 10px 32px rgba(37, 99, 235, 0.1);
1184
1173
  }
1185
- .mc-card-badge {
1174
+ .sa-marketing-card-badge {
1186
1175
  position: absolute;
1187
1176
  top: -10px;
1188
1177
  left: 50%;
1189
1178
  transform: translateX(-50%);
1190
- background: var(--mc-primary);
1179
+ background: var(--sa-marketing-primary);
1191
1180
  color: #fff;
1192
- font: 700 10.5px var(--mc-font-sans);
1181
+ font: 700 10.5px var(--sa-marketing-font-sans);
1193
1182
  letter-spacing: 0.1em;
1194
1183
  text-transform: uppercase;
1195
1184
  padding: 4px 12px;
1196
1185
  border-radius: 999px;
1197
1186
  white-space: nowrap;
1198
1187
  }
1199
- .mc-card-key {
1200
- font: 700 10.5px var(--mc-font-mono);
1188
+ .sa-marketing-card-key {
1189
+ font: 700 10.5px var(--sa-marketing-font-mono);
1201
1190
  letter-spacing: 0.08em;
1202
- color: var(--mc-text-3);
1191
+ color: var(--sa-marketing-text-3);
1203
1192
  text-transform: uppercase;
1204
1193
  }
1205
- .mc-card-name {
1194
+ .sa-marketing-card-name {
1206
1195
  font-size: 22px;
1207
1196
  font-weight: 700;
1208
1197
  letter-spacing: -0.02em;
1209
- color: var(--mc-text);
1198
+ color: var(--sa-marketing-text);
1210
1199
  margin: 2px 0 4px;
1211
1200
  }
1212
- .mc-card-desc {
1201
+ .sa-marketing-card-desc {
1213
1202
  font-size: 12.5px;
1214
- color: var(--mc-text-2);
1203
+ color: var(--sa-marketing-text-2);
1215
1204
  line-height: 1.4;
1216
1205
  min-height: 36px;
1217
1206
  }
1218
- .mc-card-price {
1207
+ .sa-marketing-card-price {
1219
1208
  margin: 18px 0 4px;
1220
1209
  display: flex;
1221
1210
  align-items: baseline;
1222
1211
  gap: 6px;
1223
1212
  }
1224
- .mc-card-price-big {
1213
+ .sa-marketing-card-price-big {
1225
1214
  font-size: 32px;
1226
1215
  font-weight: 700;
1227
1216
  letter-spacing: -0.03em;
1228
- color: var(--mc-text);
1217
+ color: var(--sa-marketing-text);
1229
1218
  }
1230
- .mc-card-price-unit {
1219
+ .sa-marketing-card-price-unit {
1231
1220
  font-size: 13px;
1232
- color: var(--mc-text-3);
1221
+ color: var(--sa-marketing-text-3);
1233
1222
  }
1234
- .mc-card-price-y {
1223
+ .sa-marketing-card-price-y {
1235
1224
  font-size: 11.5px;
1236
- color: var(--mc-text-3);
1225
+ color: var(--sa-marketing-text-3);
1237
1226
  margin-bottom: 12px;
1238
1227
  }
1239
- .mc-card-cta {
1228
+ .sa-marketing-card-cta {
1240
1229
  width: 100%;
1241
1230
  margin-top: 14px;
1242
1231
  padding: 9px 12px;
1243
1232
  border-radius: 8px;
1244
- border: 1px solid var(--mc-border);
1245
- background: var(--mc-surface);
1246
- color: var(--mc-text);
1247
- font: 600 13px var(--mc-font-sans);
1233
+ border: 1px solid var(--sa-marketing-border);
1234
+ background: var(--sa-marketing-surface);
1235
+ color: var(--sa-marketing-text);
1236
+ font: 600 13px var(--sa-marketing-font-sans);
1248
1237
  cursor: pointer;
1249
1238
  transition:
1250
1239
  background 0.12s,
1251
1240
  border-color 0.12s;
1252
1241
  }
1253
- .mc-card-cta:hover {
1242
+ .sa-marketing-card-cta:hover {
1254
1243
  background: #f8fafc;
1255
1244
  }
1256
- .mc-card.featured .mc-card-cta {
1257
- background: var(--mc-primary);
1258
- border-color: var(--mc-primary);
1245
+ .sa-marketing-card.featured .sa-marketing-card-cta {
1246
+ background: var(--sa-marketing-primary);
1247
+ border-color: var(--sa-marketing-primary);
1259
1248
  color: #fff;
1260
1249
  }
1261
- .mc-card.featured .mc-card-cta:hover {
1262
- background: var(--mc-primary-700);
1250
+ .sa-marketing-card.featured .sa-marketing-card-cta:hover {
1251
+ background: var(--sa-marketing-primary-700);
1263
1252
  }
1264
- .mc-card-trialnote {
1253
+ .sa-marketing-card-trialnote {
1265
1254
  font-size: 11px;
1266
- color: var(--mc-text-3);
1255
+ color: var(--sa-marketing-text-3);
1267
1256
  text-align: center;
1268
1257
  margin-top: 6px;
1269
1258
  }
1270
- .mc-card.has-promo {
1259
+ .sa-marketing-card.has-promo {
1271
1260
  border-color: #10b981;
1272
1261
  }
1273
- .mc-promo-ribbon {
1262
+ .sa-marketing-promo-ribbon {
1274
1263
  position: absolute;
1275
1264
  top: 12px;
1276
1265
  right: -2px;
@@ -1280,37 +1269,37 @@ async function onLocaleChange(loc: string): Promise<void> {
1280
1269
  padding: 3px 12px 3px 10px;
1281
1270
  border-radius: 4px 0 0 4px;
1282
1271
  }
1283
- .mc-card-price-strike {
1272
+ .sa-marketing-card-price-strike {
1284
1273
  display: flex;
1285
1274
  gap: 8px;
1286
1275
  align-items: baseline;
1287
1276
  margin-top: 2px;
1288
1277
  }
1289
- .mc-card-price-strike s {
1290
- color: var(--mc-text-3);
1278
+ .sa-marketing-card-price-strike s {
1279
+ color: var(--sa-marketing-text-3);
1291
1280
  font-size: 14px;
1292
1281
  }
1293
- .mc-price-regular {
1282
+ .sa-marketing-price-regular {
1294
1283
  font-size: 10px;
1295
1284
  text-transform: uppercase;
1296
1285
  letter-spacing: 0.5px;
1297
- color: var(--mc-text-3);
1286
+ color: var(--sa-marketing-text-3);
1298
1287
  }
1299
- .mc-card-fineprint {
1288
+ .sa-marketing-card-fineprint {
1300
1289
  font-size: 10px;
1301
1290
  color: #059669;
1302
1291
  text-align: center;
1303
1292
  margin-top: 6px;
1304
1293
  }
1305
- .mc-card-includes {
1294
+ .sa-marketing-card-includes {
1306
1295
  margin-top: 18px;
1307
1296
  font-size: 11px;
1308
1297
  text-transform: uppercase;
1309
1298
  letter-spacing: 0.08em;
1310
- color: var(--mc-text-3);
1299
+ color: var(--sa-marketing-text-3);
1311
1300
  font-weight: 700;
1312
1301
  }
1313
- .mc-card-features {
1302
+ .sa-marketing-card-features {
1314
1303
  list-style: none;
1315
1304
  padding: 0;
1316
1305
  margin: 8px 0 0;
@@ -1320,145 +1309,145 @@ async function onLocaleChange(loc: string): Promise<void> {
1320
1309
  font-size: 12.5px;
1321
1310
  color: #334155;
1322
1311
  }
1323
- .mc-card-features li {
1312
+ .sa-marketing-card-features li {
1324
1313
  display: flex;
1325
1314
  align-items: flex-start;
1326
1315
  gap: 8px;
1327
1316
  line-height: 1.35;
1328
1317
  }
1329
- .mc-card-features .mc-tick {
1318
+ .sa-marketing-card-features .sa-marketing-tick {
1330
1319
  color: #10b981;
1331
1320
  flex: 0 0 14px;
1332
1321
  margin-top: 1px;
1333
1322
  }
1334
- .mc-card-features b {
1335
- color: var(--mc-text);
1323
+ .sa-marketing-card-features b {
1324
+ color: var(--sa-marketing-text);
1336
1325
  font-weight: 700;
1337
1326
  }
1338
- .mc-card-features-empty {
1327
+ .sa-marketing-card-features-empty {
1339
1328
  margin-top: 8px;
1340
1329
  font-size: 12px;
1341
- color: var(--mc-text-3);
1330
+ color: var(--sa-marketing-text-3);
1342
1331
  }
1343
1332
 
1344
1333
  /* ── Marketing administration ── */
1345
- .mc-admin {
1346
- background: var(--mc-surface);
1347
- border: 1px solid var(--mc-border);
1334
+ .sa-marketing-admin {
1335
+ background: var(--sa-marketing-surface);
1336
+ border: 1px solid var(--sa-marketing-border);
1348
1337
  border-radius: 10px;
1349
1338
  }
1350
- .mc-admin-head {
1339
+ .sa-marketing-admin-head {
1351
1340
  padding: 14px 16px;
1352
1341
  border-bottom: 1px solid #f1f5f9;
1353
1342
  display: flex;
1354
1343
  align-items: center;
1355
1344
  gap: 12px;
1356
1345
  }
1357
- .mc-admin-title {
1346
+ .sa-marketing-admin-title {
1358
1347
  font-size: 14px;
1359
1348
  font-weight: 700;
1360
1349
  letter-spacing: -0.01em;
1361
- color: var(--mc-text);
1350
+ color: var(--sa-marketing-text);
1362
1351
  }
1363
- .mc-admin-sub {
1352
+ .sa-marketing-admin-sub {
1364
1353
  font-size: 11.5px;
1365
- color: var(--mc-text-2);
1354
+ color: var(--sa-marketing-text-2);
1366
1355
  }
1367
- .mc-admin-grid {
1356
+ .sa-marketing-admin-grid {
1368
1357
  display: grid;
1369
1358
  grid-template-columns: 1.6fr 1fr 1.4fr 1fr 1fr 150px;
1370
1359
  align-items: stretch;
1371
1360
  }
1372
- .mc-admin-thead {
1361
+ .sa-marketing-admin-thead {
1373
1362
  display: contents;
1374
1363
  }
1375
- .mc-admin-thead > div {
1364
+ .sa-marketing-admin-thead > div {
1376
1365
  background: #fbfbfd;
1377
1366
  padding: 10px 14px;
1378
1367
  font-size: 10.5px;
1379
1368
  text-transform: uppercase;
1380
1369
  letter-spacing: 0.1em;
1381
- color: var(--mc-text-2);
1370
+ color: var(--sa-marketing-text-2);
1382
1371
  font-weight: 700;
1383
- border-bottom: 1px solid var(--mc-border);
1372
+ border-bottom: 1px solid var(--sa-marketing-border);
1384
1373
  }
1385
- .mc-admin-row {
1374
+ .sa-marketing-admin-row {
1386
1375
  display: contents;
1387
1376
  }
1388
- .mc-admin-row > div {
1377
+ .sa-marketing-admin-row > div {
1389
1378
  padding: 12px 14px;
1390
1379
  border-bottom: 1px solid #f1f5f9;
1391
1380
  display: flex;
1392
1381
  align-items: center;
1393
1382
  font-size: 12.5px;
1394
- color: var(--mc-text);
1383
+ color: var(--sa-marketing-text);
1395
1384
  }
1396
- .mc-admin-row--disabled > div {
1385
+ .sa-marketing-admin-row--disabled > div {
1397
1386
  background: #fcfcfd;
1398
1387
  }
1399
- .mc-admin-row-end {
1388
+ .sa-marketing-admin-row-end {
1400
1389
  justify-content: flex-end;
1401
1390
  gap: 8px;
1402
1391
  }
1403
- .mc-plan-cell {
1392
+ .sa-marketing-plan-cell {
1404
1393
  display: flex;
1405
1394
  align-items: center;
1406
1395
  gap: 12px;
1407
1396
  }
1408
- .mc-plan-mark {
1397
+ .sa-marketing-plan-mark {
1409
1398
  width: 32px;
1410
1399
  height: 32px;
1411
1400
  border-radius: 8px;
1412
1401
  display: grid;
1413
1402
  place-items: center;
1414
- font: 700 10px var(--mc-font-mono);
1403
+ font: 700 10px var(--sa-marketing-font-mono);
1415
1404
  border: 1px solid;
1416
1405
  }
1417
- .mc-plan-label {
1406
+ .sa-marketing-plan-label {
1418
1407
  font-size: 13px;
1419
1408
  font-weight: 700;
1420
- color: var(--mc-text);
1409
+ color: var(--sa-marketing-text);
1421
1410
  }
1422
- .mc-plan-key {
1423
- font: 500 11px var(--mc-font-mono);
1424
- color: var(--mc-text-3);
1411
+ .sa-marketing-plan-key {
1412
+ font: 500 11px var(--sa-marketing-font-mono);
1413
+ color: var(--sa-marketing-text-3);
1425
1414
  }
1426
1415
 
1427
- .mc-field {
1416
+ .sa-marketing-field {
1428
1417
  width: 100%;
1429
1418
  padding: 5px 8px;
1430
- font: 400 12px var(--mc-font-sans);
1431
- color: var(--mc-text);
1432
- background: var(--mc-surface);
1433
- border: 1px solid var(--mc-border-strong);
1419
+ font: 400 12px var(--sa-marketing-font-sans);
1420
+ color: var(--sa-marketing-text);
1421
+ background: var(--sa-marketing-surface);
1422
+ border: 1px solid var(--sa-marketing-border-strong);
1434
1423
  border-radius: 6px;
1435
1424
  }
1436
- .mc-field:focus {
1425
+ .sa-marketing-field:focus {
1437
1426
  outline: none;
1438
- border-color: var(--mc-primary);
1439
- box-shadow: 0 0 0 3px var(--mc-primary-50);
1427
+ border-color: var(--sa-marketing-primary);
1428
+ box-shadow: 0 0 0 3px var(--sa-marketing-primary-50);
1440
1429
  }
1441
- .mc-field:disabled {
1430
+ .sa-marketing-field:disabled {
1442
1431
  background: #f1f5f9;
1443
- color: var(--mc-text-3);
1432
+ color: var(--sa-marketing-text-3);
1444
1433
  cursor: not-allowed;
1445
1434
  }
1446
- .mc-field--area {
1435
+ .sa-marketing-field--area {
1447
1436
  resize: vertical;
1448
1437
  font-size: 12.5px;
1449
1438
  line-height: 1.4;
1450
1439
  }
1451
1440
 
1452
- .mc-toggle {
1441
+ .sa-marketing-toggle {
1453
1442
  position: relative;
1454
1443
  display: inline-block;
1455
1444
  width: 36px;
1456
1445
  height: 20px;
1457
1446
  }
1458
- .mc-toggle input {
1447
+ .sa-marketing-toggle input {
1459
1448
  display: none;
1460
1449
  }
1461
- .mc-toggle span {
1450
+ .sa-marketing-toggle span {
1462
1451
  position: absolute;
1463
1452
  inset: 0;
1464
1453
  background: #cbd5e1;
@@ -1466,7 +1455,7 @@ async function onLocaleChange(loc: string): Promise<void> {
1466
1455
  transition: background 0.15s;
1467
1456
  cursor: pointer;
1468
1457
  }
1469
- .mc-toggle span::before {
1458
+ .sa-marketing-toggle span::before {
1470
1459
  content: '';
1471
1460
  position: absolute;
1472
1461
  width: 16px;
@@ -1478,18 +1467,18 @@ async function onLocaleChange(loc: string): Promise<void> {
1478
1467
  transition: transform 0.15s;
1479
1468
  box-shadow: 0 1px 2px rgba(0, 0, 0, 0.2);
1480
1469
  }
1481
- .mc-toggle input:checked + span {
1482
- background: var(--mc-primary);
1470
+ .sa-marketing-toggle input:checked + span {
1471
+ background: var(--sa-marketing-primary);
1483
1472
  }
1484
- .mc-toggle input:checked + span::before {
1473
+ .sa-marketing-toggle input:checked + span::before {
1485
1474
  transform: translateX(16px);
1486
1475
  }
1487
- .mc-toggle.disabled span {
1476
+ .sa-marketing-toggle.disabled span {
1488
1477
  opacity: 0.45;
1489
1478
  cursor: not-allowed;
1490
1479
  }
1491
1480
 
1492
- .mc-chip {
1481
+ .sa-marketing-chip {
1493
1482
  display: inline-flex;
1494
1483
  align-items: center;
1495
1484
  gap: 5px;
@@ -1499,22 +1488,22 @@ async function onLocaleChange(loc: string): Promise<void> {
1499
1488
  font-weight: 600;
1500
1489
  border: 1px solid;
1501
1490
  }
1502
- .mc-chip--muted {
1491
+ .sa-marketing-chip--muted {
1503
1492
  background: #f1f5f9;
1504
1493
  color: #475569;
1505
1494
  border-color: #cbd5e1;
1506
1495
  }
1507
- .mc-chip--featured {
1508
- background: var(--mc-primary-50);
1509
- color: var(--mc-primary-700);
1496
+ .sa-marketing-chip--featured {
1497
+ background: var(--sa-marketing-primary-50);
1498
+ color: var(--sa-marketing-primary-700);
1510
1499
  border-color: #bfdbfe;
1511
1500
  }
1512
- .mc-chip--live {
1501
+ .sa-marketing-chip--live {
1513
1502
  background: #ecfdf5;
1514
1503
  color: #047857;
1515
1504
  border-color: #a7f3d0;
1516
1505
  }
1517
- .mc-chip--live::before {
1506
+ .sa-marketing-chip--live::before {
1518
1507
  content: '';
1519
1508
  width: 6px;
1520
1509
  height: 6px;
@@ -1522,7 +1511,7 @@ async function onLocaleChange(loc: string): Promise<void> {
1522
1511
  background: currentColor;
1523
1512
  }
1524
1513
 
1525
- .mc-expand-btn {
1514
+ .sa-marketing-expand-btn {
1526
1515
  width: 28px;
1527
1516
  height: 28px;
1528
1517
  display: grid;
@@ -1531,198 +1520,198 @@ async function onLocaleChange(loc: string): Promise<void> {
1531
1520
  border: 1px solid transparent;
1532
1521
  border-radius: 6px;
1533
1522
  cursor: pointer;
1534
- color: var(--mc-text-3);
1523
+ color: var(--sa-marketing-text-3);
1535
1524
  transition:
1536
1525
  background 0.12s,
1537
1526
  color 0.12s,
1538
1527
  border-color 0.12s;
1539
1528
  }
1540
- .mc-expand-btn:hover {
1529
+ .sa-marketing-expand-btn:hover {
1541
1530
  background: #f1f5f9;
1542
- color: var(--mc-primary);
1531
+ color: var(--sa-marketing-primary);
1543
1532
  border-color: #e2e8f0;
1544
1533
  }
1545
- .mc-chev {
1534
+ .sa-marketing-chev {
1546
1535
  display: inline-flex;
1547
1536
  transition: transform 0.15s;
1548
1537
  }
1549
- .mc-chev.open {
1538
+ .sa-marketing-chev.open {
1550
1539
  transform: rotate(90deg);
1551
1540
  }
1552
1541
 
1553
- .mc-admin-expand {
1542
+ .sa-marketing-admin-expand {
1554
1543
  grid-column: 1 / -1;
1555
1544
  background: linear-gradient(180deg, #fbfbfd 0%, #fff 100%);
1556
1545
  border-bottom: 1px solid #f1f5f9;
1557
1546
  padding: 18px 20px 22px;
1558
1547
  }
1559
- .mc-expand-grid {
1548
+ .sa-marketing-expand-grid {
1560
1549
  display: grid;
1561
1550
  grid-template-columns: minmax(0, 1fr) minmax(0, 1.3fr);
1562
1551
  gap: 24px;
1563
1552
  }
1564
- .mc-expand-col {
1553
+ .sa-marketing-expand-col {
1565
1554
  display: flex;
1566
1555
  flex-direction: column;
1567
1556
  gap: 14px;
1568
1557
  }
1569
- .mc-expand-sec {
1558
+ .sa-marketing-expand-sec {
1570
1559
  display: flex;
1571
1560
  flex-direction: column;
1572
1561
  gap: 6px;
1573
1562
  }
1574
- .mc-expand-label {
1563
+ .sa-marketing-expand-label {
1575
1564
  font-size: 10.5px;
1576
1565
  text-transform: uppercase;
1577
1566
  letter-spacing: 0.1em;
1578
- color: var(--mc-text-2);
1567
+ color: var(--sa-marketing-text-2);
1579
1568
  font-weight: 700;
1580
1569
  }
1581
- .mc-expand-hint {
1570
+ .sa-marketing-expand-hint {
1582
1571
  font-size: 11px;
1583
- color: var(--mc-text-3);
1572
+ color: var(--sa-marketing-text-3);
1584
1573
  }
1585
- .mc-field-head {
1574
+ .sa-marketing-field-head {
1586
1575
  display: flex;
1587
1576
  align-items: baseline;
1588
1577
  gap: 8px;
1589
1578
  flex-wrap: wrap;
1590
1579
  }
1591
- .mc-source-hint {
1580
+ .sa-marketing-source-hint {
1592
1581
  font-size: 11px;
1593
- color: var(--mc-text-3);
1582
+ color: var(--sa-marketing-text-3);
1594
1583
  }
1595
- .mc-source-hint em {
1596
- color: var(--mc-text-2);
1584
+ .sa-marketing-source-hint em {
1585
+ color: var(--sa-marketing-text-2);
1597
1586
  font-style: normal;
1598
1587
  }
1599
- .mc-locked-value {
1588
+ .sa-marketing-locked-value {
1600
1589
  display: flex;
1601
1590
  align-items: center;
1602
1591
  gap: 8px;
1603
1592
  padding: 8px 10px;
1604
- background: var(--mc-surface);
1605
- border: 1px solid var(--mc-border);
1593
+ background: var(--sa-marketing-surface);
1594
+ border: 1px solid var(--sa-marketing-border);
1606
1595
  border-radius: 6px;
1607
1596
  font-size: 13px;
1608
- color: var(--mc-text-1);
1597
+ color: var(--sa-marketing-text-1);
1609
1598
  }
1610
- .mc-locked-hint {
1599
+ .sa-marketing-locked-hint {
1611
1600
  font-size: 10px;
1612
1601
  text-transform: uppercase;
1613
- color: var(--mc-text-3);
1602
+ color: var(--sa-marketing-text-3);
1614
1603
  background: rgba(148, 163, 184, 0.15);
1615
1604
  padding: 1px 6px;
1616
1605
  border-radius: 4px;
1617
1606
  margin-left: auto;
1618
1607
  }
1619
- .mc-trial-row {
1608
+ .sa-marketing-trial-row {
1620
1609
  display: flex;
1621
1610
  align-items: center;
1622
1611
  gap: 10px;
1623
- background: var(--mc-surface);
1624
- border: 1px solid var(--mc-border);
1612
+ background: var(--sa-marketing-surface);
1613
+ border: 1px solid var(--sa-marketing-border);
1625
1614
  border-radius: 8px;
1626
1615
  padding: 8px 12px;
1627
1616
  }
1628
- .mc-trial-label {
1617
+ .sa-marketing-trial-label {
1629
1618
  font-size: 13px;
1630
- color: var(--mc-text);
1619
+ color: var(--sa-marketing-text);
1631
1620
  }
1632
- .mc-trial-days {
1621
+ .sa-marketing-trial-days {
1633
1622
  margin-left: auto;
1634
1623
  display: flex;
1635
1624
  align-items: center;
1636
1625
  gap: 6px;
1637
1626
  }
1638
- .mc-trial-unit {
1627
+ .sa-marketing-trial-unit {
1639
1628
  font-size: 12px;
1640
- color: var(--mc-text-2);
1629
+ color: var(--sa-marketing-text-2);
1641
1630
  }
1642
1631
 
1643
- .mc-tf-head {
1632
+ .sa-marketing-tf-head {
1644
1633
  display: flex;
1645
1634
  align-items: center;
1646
1635
  }
1647
- .mc-tf-list {
1636
+ .sa-marketing-tf-list {
1648
1637
  display: flex;
1649
1638
  flex-direction: column;
1650
1639
  gap: 6px;
1651
1640
  }
1652
- .mc-tf-row {
1641
+ .sa-marketing-tf-row {
1653
1642
  display: grid;
1654
1643
  grid-template-columns: 22px minmax(0, 1.4fr) minmax(0, 1fr) auto;
1655
1644
  gap: 8px;
1656
1645
  align-items: center;
1657
1646
  }
1658
- .mc-tf-num {
1659
- font: 600 11px var(--mc-font-mono);
1660
- color: var(--mc-text-3);
1647
+ .sa-marketing-tf-num {
1648
+ font: 600 11px var(--sa-marketing-font-mono);
1649
+ color: var(--sa-marketing-text-3);
1661
1650
  text-align: center;
1662
1651
  }
1663
- .mc-tf-actions {
1652
+ .sa-marketing-tf-actions {
1664
1653
  display: flex;
1665
1654
  gap: 2px;
1666
1655
  }
1667
- .mc-iconbtn {
1656
+ .sa-marketing-iconbtn {
1668
1657
  width: 24px;
1669
1658
  height: 24px;
1670
1659
  display: grid;
1671
1660
  place-items: center;
1672
- background: var(--mc-surface);
1673
- border: 1px solid var(--mc-border);
1661
+ background: var(--sa-marketing-surface);
1662
+ border: 1px solid var(--sa-marketing-border);
1674
1663
  border-radius: 5px;
1675
1664
  cursor: pointer;
1676
- font: 600 10px var(--mc-font-sans);
1677
- color: var(--mc-text-2);
1665
+ font: 600 10px var(--sa-marketing-font-sans);
1666
+ color: var(--sa-marketing-text-2);
1678
1667
  padding: 0;
1679
1668
  transition:
1680
1669
  background 0.12s,
1681
1670
  border-color 0.12s;
1682
1671
  }
1683
- .mc-iconbtn:hover:not(:disabled) {
1672
+ .sa-marketing-iconbtn:hover:not(:disabled) {
1684
1673
  background: #f1f5f9;
1685
1674
  border-color: #cbd5e1;
1686
1675
  }
1687
- .mc-iconbtn:disabled {
1676
+ .sa-marketing-iconbtn:disabled {
1688
1677
  opacity: 0.35;
1689
1678
  cursor: not-allowed;
1690
1679
  }
1691
- .mc-iconbtn--danger {
1680
+ .sa-marketing-iconbtn--danger {
1692
1681
  color: #b91c1c;
1693
1682
  }
1694
- .mc-iconbtn--danger:hover:not(:disabled) {
1683
+ .sa-marketing-iconbtn--danger:hover:not(:disabled) {
1695
1684
  background: #fef2f2;
1696
1685
  border-color: #fca5a5;
1697
1686
  }
1698
- .mc-tf-empty {
1687
+ .sa-marketing-tf-empty {
1699
1688
  padding: 14px;
1700
1689
  text-align: center;
1701
1690
  font-size: 12px;
1702
- color: var(--mc-text-3);
1703
- background: var(--mc-surface);
1691
+ color: var(--sa-marketing-text-3);
1692
+ background: var(--sa-marketing-surface);
1704
1693
  border: 1px dashed #cbd5e1;
1705
1694
  border-radius: 8px;
1706
1695
  }
1707
- .mc-tf-add {
1696
+ .sa-marketing-tf-add {
1708
1697
  display: flex;
1709
1698
  flex-direction: column;
1710
1699
  gap: 8px;
1711
1700
  margin-top: 4px;
1712
1701
  }
1713
- .mc-tf-suggestions {
1702
+ .sa-marketing-tf-suggestions {
1714
1703
  display: flex;
1715
1704
  flex-wrap: wrap;
1716
1705
  gap: 6px;
1717
1706
  align-items: center;
1718
1707
  }
1719
- .mc-tf-chip {
1708
+ .sa-marketing-tf-chip {
1720
1709
  display: inline-flex;
1721
1710
  align-items: center;
1722
1711
  gap: 5px;
1723
1712
  padding: 3px 9px;
1724
1713
  border-radius: 999px;
1725
- background: var(--mc-surface);
1714
+ background: var(--sa-marketing-surface);
1726
1715
  border: 1px dashed #cbd5e1;
1727
1716
  font-size: 11.5px;
1728
1717
  color: #475569;
@@ -1732,24 +1721,24 @@ async function onLocaleChange(loc: string): Promise<void> {
1732
1721
  border-color 0.12s,
1733
1722
  color 0.12s;
1734
1723
  }
1735
- .mc-tf-chip em {
1724
+ .sa-marketing-tf-chip em {
1736
1725
  font-style: normal;
1737
- color: var(--mc-text-3);
1738
- font: 500 11px var(--mc-font-mono);
1726
+ color: var(--sa-marketing-text-3);
1727
+ font: 500 11px var(--sa-marketing-font-mono);
1739
1728
  }
1740
- .mc-tf-chip:hover:not(:disabled) {
1741
- background: var(--mc-primary-50);
1729
+ .sa-marketing-tf-chip:hover:not(:disabled) {
1730
+ background: var(--sa-marketing-primary-50);
1742
1731
  border-color: #93c5fd;
1743
1732
  border-style: solid;
1744
- color: var(--mc-primary-700);
1733
+ color: var(--sa-marketing-primary-700);
1745
1734
  }
1746
- .mc-tf-chip:disabled {
1735
+ .sa-marketing-tf-chip:disabled {
1747
1736
  opacity: 0.5;
1748
1737
  cursor: not-allowed;
1749
1738
  }
1750
1739
 
1751
1740
  @media (max-width: 980px) {
1752
- .mc-expand-grid {
1741
+ .sa-marketing-expand-grid {
1753
1742
  grid-template-columns: 1fr;
1754
1743
  }
1755
1744
  }
@@ -1757,13 +1746,13 @@ async function onLocaleChange(loc: string): Promise<void> {
1757
1746
  /* Version tabs below the plan name — visible only when the plan
1758
1747
  * has multiple published versions (e.g. v2 active + v3 planned).
1759
1748
  * Sim pattern: small pills, active version inverted. */
1760
- .mc-version-tabs {
1749
+ .sa-marketing-version-tabs {
1761
1750
  display: flex;
1762
1751
  flex-wrap: wrap;
1763
1752
  gap: 4px;
1764
1753
  margin-top: 6px;
1765
1754
  }
1766
- .mc-version-tab {
1755
+ .sa-marketing-version-tab {
1767
1756
  border: 1px solid #e2e8f0;
1768
1757
  background: #fff;
1769
1758
  border-radius: 6px;
@@ -1777,12 +1766,12 @@ async function onLocaleChange(loc: string): Promise<void> {
1777
1766
  background 0.1s,
1778
1767
  color 0.1s;
1779
1768
  }
1780
- .mc-version-tab:hover {
1769
+ .sa-marketing-version-tab:hover {
1781
1770
  border-color: #cbd5e1;
1782
1771
  background: #f8fafc;
1783
1772
  color: #475569;
1784
1773
  }
1785
- .mc-version-tab--active {
1774
+ .sa-marketing-version-tab--active {
1786
1775
  border-color: #1d4ed8;
1787
1776
  background: #eff6ff;
1788
1777
  color: #1d4ed8;