@saasicat/ui-vue 0.21.0 → 0.22.1

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 (132) hide show
  1. package/dist/{catalog-BY_t9prv.d.cts → catalog-DJcfm5N2.d.cts} +20 -7
  2. package/dist/{catalog-BY_t9prv.d.ts → catalog-DJcfm5N2.d.ts} +20 -7
  3. package/dist/{chunk-JN6HZGLV.js → chunk-F7NRM6KI.js} +54 -28
  4. package/dist/{chunk-7IFKVGZV.js → chunk-LY52T4N4.js} +21 -2
  5. package/dist/{chunk-OTP3OSSW.js → chunk-XMMFN2WJ.js} +74 -3
  6. package/dist/client/index.cjs +132 -29
  7. package/dist/client/index.d.cts +53 -3
  8. package/dist/client/index.d.ts +53 -3
  9. package/dist/client/index.js +14 -2
  10. package/dist/index.cjs +319 -162
  11. package/dist/index.d.cts +30 -8
  12. package/dist/index.d.ts +30 -8
  13. package/dist/index.js +176 -133
  14. package/dist/quasar/index.cjs +76 -29
  15. package/dist/quasar/index.d.cts +2 -2
  16. package/dist/quasar/index.d.ts +2 -2
  17. package/dist/quasar/index.js +6 -2
  18. package/dist/testing-e2e/admin-pages-suite.d.cts +37 -0
  19. package/dist/testing-e2e/admin-pages-suite.d.ts +37 -0
  20. package/dist/{use-super-admin-i18n-c_Eqsu9u.d.ts → use-super-admin-i18n-CHNdsSlm.d.ts} +34 -7
  21. package/dist/{use-super-admin-i18n-DlJRGIVq.d.cts → use-super-admin-i18n-CgTuNi8h.d.cts} +34 -7
  22. package/package.json +18 -8
  23. package/src/client/i18n/messages/bundles.ts +0 -2
  24. package/src/client/i18n/messages/common.ts +22 -0
  25. package/src/client/i18n/messages/discovery.ts +2 -2
  26. package/src/client/i18n/messages/marketing.ts +2 -4
  27. package/src/client/i18n/messages/plan-detail.ts +0 -4
  28. package/src/client/i18n/messages/plans.ts +20 -8
  29. package/src/client/i18n/messages/tenants.ts +0 -2
  30. package/src/client/index.ts +1 -0
  31. package/src/client/manifest-loader.ts +1 -1
  32. package/src/client/resolve-plans.ts +144 -0
  33. package/src/components/BundleVersionPublishDialog.vue +6 -6
  34. package/src/components/KvBlock.vue +4 -4
  35. package/src/components/MarketingPromotionsTab.vue +34 -48
  36. package/src/components/MfaPromptDialog.vue +8 -2
  37. package/src/components/TenantActionConfirmDialog.vue +4 -4
  38. package/src/components/VersionDiffPreview.vue +7 -7
  39. package/src/components/admin-page/AdminFilters.vue +12 -0
  40. package/src/components/admin-page/AdminHero.vue +22 -5
  41. package/src/components/admin-page/AdminKpi.vue +84 -0
  42. package/src/components/admin-page/AdminPaginator.vue +195 -0
  43. package/src/components/admin-page/AdminRefreshBtn.vue +39 -0
  44. package/src/components/admin-page/AdminSection.vue +31 -16
  45. package/src/components/admin-page/AdminStatistics.vue +40 -0
  46. package/src/components/admin-page/AdminTable.vue +175 -0
  47. package/src/components/bundle-editor/BundleCreatePanel.vue +23 -23
  48. package/src/components/bundle-editor/BundleFeaturesEditor.vue +7 -7
  49. package/src/components/bundle-editor/BundlePlanCompatPicker.vue +9 -9
  50. package/src/components/bundle-editor/BundleQuotasEditor.vue +11 -11
  51. package/src/components/bundle-editor/BundleStatusBanner.vue +6 -6
  52. package/src/components/bundle-editor/BundleVersionInlineEditor.vue +18 -18
  53. package/src/components/bundle-editor/BundleVersionStrip.vue +12 -12
  54. package/src/components/dialogs/PilotCreateDialog.vue +12 -12
  55. package/src/components/dialogs/PilotEditDialog.vue +7 -7
  56. package/src/components/dialogs/PromoCodeCreateDialog.vue +8 -8
  57. package/src/components/dialogs/PromoCodeDialogFields.vue +33 -19
  58. package/src/components/dialogs/PromoCodeEditDialog.vue +10 -10
  59. package/src/components/plan/PlanGrid.vue +1 -1
  60. package/src/components/plan-create-dialog/PlanCreateDialog.vue +34 -46
  61. package/src/components/plan-detail/PlanDetail.vue +92 -302
  62. package/src/components/plan-detail/PlanDetailKpis.vue +22 -27
  63. package/src/components/plan-detail/PlanTitleEdit.vue +133 -0
  64. package/src/components/plan-list/PlanList.vue +72 -290
  65. package/src/components/plan-matrix/PlanMatrix.vue +66 -183
  66. package/src/components/plan-review/PlanReview.vue +191 -275
  67. package/src/components/plan-version-editor/PlanCatalogPreview.vue +7 -5
  68. package/src/components/plan-version-editor/PlanVersionEditor.vue +200 -295
  69. package/src/components/plan-version-editor/PlanVersionEditorHeader.vue +23 -55
  70. package/src/index.ts +1 -0
  71. package/src/pages-standard/AdminLayout.vue +34 -10
  72. package/src/pages-standard/AdminManifestErrorPage.vue +79 -9
  73. package/src/pages-standard/AuditPage.vue +53 -72
  74. package/src/pages-standard/BundlesPage.vue +128 -144
  75. package/src/pages-standard/DashboardPage.vue +43 -107
  76. package/src/pages-standard/DiscoveryPage.vue +158 -200
  77. package/src/pages-standard/EmailHistoryPage.vue +98 -88
  78. package/src/pages-standard/MarketingCatalogPage.vue +237 -267
  79. package/src/pages-standard/PilotsPage.vue +44 -60
  80. package/src/pages-standard/PlansPage.vue +230 -105
  81. package/src/pages-standard/PlatformEmailPage.vue +37 -40
  82. package/src/pages-standard/PromoCodeDetailPage.vue +16 -30
  83. package/src/pages-standard/PromoCodesPage.vue +86 -112
  84. package/src/pages-standard/SubscriptionsPage.vue +10 -17
  85. package/src/pages-standard/SuperAdminLoginPage.vue +12 -12
  86. package/src/pages-standard/SuperAdminSetupWizard.vue +20 -17
  87. package/src/pages-standard/TenantDetailPage.vue +45 -41
  88. package/src/pages-standard/TenantsPage.vue +184 -264
  89. package/src/pages-standard/UsersPage.vue +69 -104
  90. package/src/pages-standard/bundles-page/BundleAccordionList.vue +20 -17
  91. package/src/pages-standard/bundles-page/BundlesKpis.vue +13 -22
  92. package/src/pages-standard/bundles-page/BundlesToolbar.vue +6 -10
  93. package/src/pages-standard/discovery-page/CatalogEntryTransPanel.vue +10 -10
  94. package/src/pages-standard/discovery-page/DiscoveryCapList.vue +5 -5
  95. package/src/pages-standard/discovery-page/DiscoveryFeatureCard.vue +16 -16
  96. package/src/pages-standard/discovery-page/DiscoveryKpis.vue +31 -27
  97. package/src/pages-standard/discovery-page/DiscoveryQuotaCard.vue +7 -7
  98. package/src/pages-standard/marketing-catalog/MarketingCatalogAdmin.vue +1 -1
  99. package/src/pages-standard/marketing-catalog/MarketingCatalogHeader.vue +2 -13
  100. package/src/pages-standard/plan-versions/PlanDiffCard.vue +6 -6
  101. package/src/pages-standard/plan-versions/PlanVersionsDiff.vue +6 -6
  102. package/src/pages-standard/plan-versions/PlanVersionsTimeline.vue +16 -16
  103. package/src/pages-standard/plans-page/PlanBundleOverview.vue +14 -29
  104. package/src/pages-standard/plans-page/PlanPublishDialog.vue +1 -1
  105. package/src/pages-standard/plans-page/PlansPageToast.vue +1 -1
  106. package/src/pages-standard/sa-theme.css +481 -71
  107. package/src/pages-standard/tenant-detail/TenantUsers.vue +2 -8
  108. package/src/pages-standard/tenants/StatusPill.vue +2 -2
  109. package/src/pages-tenant/MySubscriptionBundlesPage.vue +25 -25
  110. package/src/pages-tenant/OnboardingConfigurator.vue +1 -5
  111. package/src/pages-tenant/PackageSnapshotPanel.vue +1 -1
  112. package/src/pages-tenant/TenantPlanSection.vue +12 -20
  113. package/src/quasar/create-super-admin-app.ts +4 -0
  114. package/src/vue/entitlement-provider.ts +0 -1
  115. package/src/vue/feature-router-guard.ts +0 -1
  116. package/src/vue/super-admin-context.ts +106 -1
  117. package/src/vue/use-api-list.ts +2 -1
  118. package/src/vue/use-pagination.ts +63 -0
  119. package/src/vue/use-plans.ts +1 -2
  120. package/src/vue/use-sign-out.ts +90 -0
  121. package/src/vue/use-tenant-billing.ts +1 -1
  122. package/src/vue/use-tenant-manifest.ts +0 -1
  123. package/src/components/KpiCard.vue +0 -53
  124. package/src/components/plan-cockpit/PlanCockpit.vue +0 -1027
  125. package/src/components/plan-cockpit/PlanCockpitAuditLog.vue +0 -72
  126. package/src/components/plan-cockpit/PlanCockpitDiffPanel.vue +0 -99
  127. package/src/components/plan-cockpit/PlanCockpitHeader.vue +0 -101
  128. package/src/components/plan-cockpit/PlanCockpitImpactPanel.vue +0 -112
  129. package/src/components/plan-cockpit/PlanCockpitKpis.vue +0 -68
  130. package/src/components/plan-cockpit/PlanCockpitVersions.vue +0 -249
  131. package/src/components/plan-cockpit/types.ts +0 -72
  132. package/src/components/plan-detail/PlanDetailHeader.vue +0 -194
@@ -12,91 +12,93 @@
12
12
  @save="emitSave"
13
13
  />
14
14
 
15
- <!-- Save error banner (e.g. "Plan hat bereits eine Draft-Version") -->
16
- <div v-if="saveError" class="pve-error" role="alert">
17
- <span class="pve-error-ico" aria-hidden="true">
18
- <svg
19
- width="16"
20
- height="16"
21
- viewBox="0 0 24 24"
22
- fill="none"
23
- stroke="currentColor"
24
- stroke-width="2"
25
- >
26
- <path
27
- d="M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z"
28
- />
29
- <path d="M12 9v4M12 17h.01" />
30
- </svg>
31
- </span>
32
- <span>{{ saveError }}</span>
33
- </div>
34
-
35
- <!-- 3-Col Body -->
36
- <div class="pve-body">
37
- <PlanComponentPool
38
- v-model:search-term="searchTerm"
39
- v-model:active-tab="activeTab"
40
- :pool-tabs="poolTabs"
41
- :filtered-feature-groups="filteredFeatureGroups"
42
- :filtered-quotas="filteredQuotas"
43
- :filtered-bundles="filteredBundles"
44
- :feature-label="featureLabel"
45
- :feature-group-label="featureGroupLabel"
46
- :is-feature-on="isFeatureOn"
47
- :is-quota-on="isQuotaOn"
48
- :is-bundle-fully-on="isBundleFullyOn"
49
- :is-bundle-partially-on="isBundlePartiallyOn"
50
- @toggle-feature="toggleFeature"
51
- @pool-quota-click="onPoolQuotaClick"
52
- @toggle-bundle="toggleBundle"
53
- @drag-start="onDragStart"
54
- @drag-end="onDragEnd"
55
- />
56
-
57
- <PlanVersionBasket
58
- :form="form"
59
- :drag-over="dragOver"
60
- :change-count="changeCount"
61
- :min-valid-from="minValidFrom"
62
- :valid-from-error="validFromError"
63
- :selected-quota-list="selectedQuotaList"
64
- :sorted-selected-features="sortedSelectedFeatures"
65
- :active-bundles="activeBundles"
66
- :feature-label="featureLabel"
67
- @update:valid-from="onValidFromInput($event)"
68
- @update:valid-until="form.validUntil = $event"
69
- @update:monthly-net="form.monthlyNet = $event"
70
- @update:yearly-net="form.yearlyNet = $event"
71
- @update:marketed="form.marketed = $event"
72
- @update:change-note="form.changeNote = $event"
73
- @set-quota-value="setQuotaValue"
74
- @toggle-quota="toggleQuota"
75
- @toggle-feature="toggleFeature"
76
- @toggle-bundle="toggleBundle"
77
- @drag-over="onDragOver"
78
- @drag-leave="onDragLeave"
79
- @drop="onDrop"
80
- />
81
-
82
- <PlanCatalogPreview
83
- v-model:preview-mode="previewMode"
84
- :catalog-url="catalogUrl"
85
- :plan-key="planKey"
86
- :version="form.version"
87
- :change-note="form.changeNote"
88
- :quotas="form.quotas"
89
- :plan-display-name="planDisplayName"
90
- :formatted-monthly="formattedMonthly"
91
- :formatted-yearly="formattedYearly"
92
- :yearly-savings-label="yearlySavingsLabel"
93
- :selected-quota-list="selectedQuotaList"
94
- :sorted-selected-features="sortedSelectedFeatures"
95
- :checklist="checklist"
96
- :checklist-ok-count="checklistOkCount"
97
- :feature-label="featureLabel"
98
- />
99
- </div>
15
+ <AdminBody>
16
+ <!-- Save error banner (e.g. "Plan hat bereits eine Draft-Version") -->
17
+ <div v-if="saveError" class="pve-error" role="alert">
18
+ <span class="pve-error-ico" aria-hidden="true">
19
+ <svg
20
+ width="16"
21
+ height="16"
22
+ viewBox="0 0 24 24"
23
+ fill="none"
24
+ stroke="currentColor"
25
+ stroke-width="2"
26
+ >
27
+ <path
28
+ d="M10.29 3.86L1.82 18a2 2 0 001.71 3h16.94a2 2 0 001.71-3L13.71 3.86a2 2 0 00-3.42 0z"
29
+ />
30
+ <path d="M12 9v4M12 17h.01" />
31
+ </svg>
32
+ </span>
33
+ <span>{{ saveError }}</span>
34
+ </div>
35
+
36
+ <!-- 3-Col Body -->
37
+ <div class="pve-body">
38
+ <PlanComponentPool
39
+ v-model:search-term="searchTerm"
40
+ v-model:active-tab="activeTab"
41
+ :pool-tabs="poolTabs"
42
+ :filtered-feature-groups="filteredFeatureGroups"
43
+ :filtered-quotas="filteredQuotas"
44
+ :filtered-bundles="filteredBundles"
45
+ :feature-label="featureLabel"
46
+ :feature-group-label="featureGroupLabel"
47
+ :is-feature-on="isFeatureOn"
48
+ :is-quota-on="isQuotaOn"
49
+ :is-bundle-fully-on="isBundleFullyOn"
50
+ :is-bundle-partially-on="isBundlePartiallyOn"
51
+ @toggle-feature="toggleFeature"
52
+ @pool-quota-click="onPoolQuotaClick"
53
+ @toggle-bundle="toggleBundle"
54
+ @drag-start="onDragStart"
55
+ @drag-end="onDragEnd"
56
+ />
57
+
58
+ <PlanVersionBasket
59
+ :form="form"
60
+ :drag-over="dragOver"
61
+ :change-count="changeCount"
62
+ :min-valid-from="minValidFrom"
63
+ :valid-from-error="validFromError"
64
+ :selected-quota-list="selectedQuotaList"
65
+ :sorted-selected-features="sortedSelectedFeatures"
66
+ :active-bundles="activeBundles"
67
+ :feature-label="featureLabel"
68
+ @update:valid-from="onValidFromInput($event)"
69
+ @update:valid-until="form.validUntil = $event"
70
+ @update:monthly-net="form.monthlyNet = $event"
71
+ @update:yearly-net="form.yearlyNet = $event"
72
+ @update:marketed="form.marketed = $event"
73
+ @update:change-note="form.changeNote = $event"
74
+ @set-quota-value="setQuotaValue"
75
+ @toggle-quota="toggleQuota"
76
+ @toggle-feature="toggleFeature"
77
+ @toggle-bundle="toggleBundle"
78
+ @drag-over="onDragOver"
79
+ @drag-leave="onDragLeave"
80
+ @drop="onDrop"
81
+ />
82
+
83
+ <PlanCatalogPreview
84
+ v-model:preview-mode="previewMode"
85
+ :catalog-url="catalogUrl"
86
+ :plan-key="planKey"
87
+ :version="form.version"
88
+ :change-note="form.changeNote"
89
+ :quotas="form.quotas"
90
+ :plan-display-name="planDisplayName"
91
+ :formatted-monthly="formattedMonthly"
92
+ :formatted-yearly="formattedYearly"
93
+ :yearly-savings-label="yearlySavingsLabel"
94
+ :selected-quota-list="selectedQuotaList"
95
+ :sorted-selected-features="sortedSelectedFeatures"
96
+ :checklist="checklist"
97
+ :checklist-ok-count="checklistOkCount"
98
+ :feature-label="featureLabel"
99
+ />
100
+ </div>
101
+ </AdminBody>
100
102
 
101
103
  <PlanVersionDiffDialog
102
104
  v-model="showDiff"
@@ -116,6 +118,7 @@ import PlanComponentPool from './PlanComponentPool.vue';
116
118
  import PlanCatalogPreview from './PlanCatalogPreview.vue';
117
119
  import PlanVersionBasket from './PlanVersionBasket.vue';
118
120
  import PlanVersionDiffDialog from './PlanVersionDiffDialog.vue';
121
+ import AdminBody from '../admin-page/AdminBody.vue';
119
122
  import PlanVersionEditorHeader from './PlanVersionEditorHeader.vue';
120
123
  import type {
121
124
  BundleEntry,
@@ -453,7 +456,7 @@ const yearlySavingsLabel = computed(() => {
453
456
  // ── Validation ──────────────────────────────────────────────────────
454
457
 
455
458
  // "Gültig ab" must be strictly after the "Gültig ab" of the predecessor
456
- // version — otherwise the version timeline is wrong (SPEC_V2 §4.2.1).
459
+ // version — otherwise the version timeline is wrong.
457
460
  // ISO date strings (YYYY-MM-DD) are lexicographically comparable.
458
461
  const validFromError = computed<string | null>(() => {
459
462
  const prev = props.predecessorVersion;
@@ -719,7 +722,7 @@ function emitSave(): void {
719
722
  features: [...form.features],
720
723
  // Persisted bundle selection = all fully active bundles. Derived from
721
724
  // the features so that `bundles` is always consistent with `features`
722
- // (SPEC_V2 §6.1 / PlanVersionRow.bundles).
725
+ // (see PlanVersionRow.bundles).
723
726
  bundles: activeBundles.value.map((b) => b.bundleKey),
724
727
  quotas: { ...form.quotas },
725
728
  monthlyNet: form.monthlyNet,
@@ -734,48 +737,15 @@ function emitSave(): void {
734
737
 
735
738
  <style>
736
739
  .pve {
737
- --pve-nav-bg: #0b1929;
738
- --pve-bg: #f6f7f9;
739
- --pve-surface: #ffffff;
740
- --pve-surface-2: #f8fafc;
741
- --pve-border: #e5e7eb;
742
- --pve-border-strong: #d1d5db;
743
- --pve-text: #0f172a;
744
- --pve-text-2: #475569;
745
- --pve-text-3: #94a3b8;
746
- --pve-primary: #2563eb;
747
- --pve-primary-700: #1d4ed8;
748
- --pve-live: #10b981;
749
- --pve-draft: #f59e0b;
750
- --pve-draft-bg: #fffbeb;
751
- --pve-font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
752
- --pve-font-mono: 'JetBrains Mono', ui-monospace, 'SF Mono', Menlo, monospace;
753
-
754
740
  display: flex;
755
741
  flex-direction: column;
756
- background: var(--pve-bg);
757
- color: var(--pve-text);
758
- font-family: var(--pve-font-sans);
759
742
  box-sizing: border-box;
760
- /* Fullscreen screen instead of a modal: fills the content area of the
761
- hosting AdminLayout page (topbar 56px subtracted). */
743
+ /* A full view rather than a modal: the columns stretch to the content area
744
+ AdminPage already sizes. */
762
745
  height: 100%;
763
- min-height: calc(100vh - 56px);
764
- }
765
- .pve :deep(*) {
766
- box-sizing: border-box;
767
746
  }
768
747
 
769
748
  /* ── Editor bar ─────────────────────────────────────────────────── */
770
- .pve-bar {
771
- background: #fff;
772
- border-bottom: 1px solid var(--pve-border);
773
- padding: 12px 22px;
774
- display: flex;
775
- align-items: center;
776
- gap: 16px;
777
- flex: 0 0 auto;
778
- }
779
749
 
780
750
  /* ── Save error banner ──────────────────────────────────────────── */
781
751
  .pve-error {
@@ -794,95 +764,24 @@ function emitSave(): void {
794
764
  display: inline-flex;
795
765
  flex: 0 0 auto;
796
766
  }
797
- .pve-bar-left {
798
- display: flex;
799
- align-items: center;
800
- gap: 14px;
801
- min-width: 0;
802
- }
803
- .pve-bar-right {
804
- display: flex;
805
- align-items: center;
806
- gap: 8px;
807
- margin-left: auto;
808
- }
809
- .pve-titlechip {
810
- display: flex;
767
+ /* The kicker above the heading: "Plan" plus the plan key. */
768
+ .pve-kicker {
769
+ display: inline-flex;
811
770
  align-items: center;
812
771
  gap: 6px;
813
- }
814
- .pve-titlechip-kicker {
815
772
  font-size: 10px;
816
773
  font-weight: 700;
817
774
  letter-spacing: 0.1em;
818
- color: #94a3b8;
819
- }
820
- .pve-title {
821
- font-size: 18px;
822
- font-weight: 700;
823
- margin: 0;
824
- letter-spacing: -0.02em;
825
- }
826
- .pve-bar-note {
827
- font-size: 11.5px;
828
- color: #64748b;
775
+ color: var(--sa-muted-light);
829
776
  }
830
777
  .pve-mono {
831
- font: 500 11px var(--pve-font-mono);
778
+ font: 500 11px var(--sa-font-mono);
832
779
  }
833
780
  .pve-mono--xs {
834
781
  font-size: 10px;
835
782
  }
836
783
 
837
784
  /* ── Buttons & Chips ───────────────────────────────────────────── */
838
- .pve-btn {
839
- display: inline-flex;
840
- align-items: center;
841
- gap: 7px;
842
- padding: 8px 14px;
843
- border-radius: 7px;
844
- font: 500 13px var(--pve-font-sans);
845
- cursor: pointer;
846
- border: 1px solid var(--pve-border-strong);
847
- background: #fff;
848
- color: var(--pve-text);
849
- transition:
850
- background 0.12s,
851
- border-color 0.12s;
852
- }
853
- .pve-btn:hover {
854
- background: var(--pve-surface-2);
855
- }
856
- .pve-btn:disabled {
857
- cursor: not-allowed;
858
- opacity: 0.5;
859
- }
860
- .pve-btn--primary {
861
- background: var(--pve-primary);
862
- border-color: var(--pve-primary);
863
- color: #fff;
864
- }
865
- .pve-btn--primary:hover {
866
- background: var(--pve-primary-700);
867
- }
868
- .pve-btn--ghost {
869
- border-color: transparent;
870
- background: transparent;
871
- }
872
- .pve-btn--ghost:hover {
873
- background: rgba(15, 23, 42, 0.05);
874
- }
875
- .pve-btn--sm {
876
- padding: 5px 9px;
877
- font-size: 12px;
878
- gap: 5px;
879
- }
880
- .pve-ico {
881
- display: inline-flex;
882
- }
883
- .pve-ico--rot180 {
884
- transform: rotate(180deg);
885
- }
886
785
 
887
786
  .pve-chip {
888
787
  display: inline-flex;
@@ -893,9 +792,9 @@ function emitSave(): void {
893
792
  font-size: 11px;
894
793
  font-weight: 600;
895
794
  letter-spacing: 0.01em;
896
- background: var(--pve-surface-2);
897
- color: var(--pve-text-2);
898
- border: 1px solid var(--pve-border);
795
+ background: var(--sa-bg-surface-2);
796
+ color: var(--sa-muted-dark);
797
+ border: 1px solid var(--sa-border);
899
798
  }
900
799
  .pve-chip--plan {
901
800
  background: #dbeafe;
@@ -903,7 +802,7 @@ function emitSave(): void {
903
802
  border-color: #bfdbfe;
904
803
  }
905
804
  .pve-chip--draft {
906
- background: var(--pve-draft-bg);
805
+ background: var(--sa-warning-bg);
907
806
  color: #b45309;
908
807
  border-color: #fde68a;
909
808
  }
@@ -915,34 +814,40 @@ function emitSave(): void {
915
814
  background: currentColor;
916
815
  }
917
816
  .pve-chip--changes {
918
- background: #fffbeb;
817
+ background: var(--sa-warning-bg);
919
818
  color: #b45309;
920
819
  border-color: #fde68a;
921
820
  }
922
821
 
923
822
  .pve-kbd {
924
- font: 600 10.5px var(--pve-font-mono);
925
- background: #f1f5f9;
926
- color: #475569;
823
+ font: 600 10.5px var(--sa-font-mono);
824
+ background: var(--sa-border-soft);
825
+ color: var(--sa-muted-dark);
927
826
  padding: 2px 6px;
928
827
  border-radius: 4px;
929
- border: 1px solid #e2e8f0;
828
+ border: 1px solid var(--sa-border);
930
829
  }
931
830
 
932
831
  /* ── Body Grid ──────────────────────────────────────────────────── */
832
+ .pve > .sa-page-body {
833
+ display: flex;
834
+ flex-direction: column;
835
+ flex: 1 1 auto;
836
+ min-height: 0;
837
+ }
933
838
  .pve-body {
934
839
  flex: 1 1 auto;
935
840
  min-height: 0;
936
841
  overflow: hidden;
937
842
  display: grid;
938
843
  grid-template-columns: 380px 1fr 400px;
939
- background: var(--pve-bg);
844
+ background: var(--sa-bg-app);
940
845
  }
941
846
 
942
847
  .pve-col {
943
848
  display: flex;
944
849
  flex-direction: column;
945
- border-right: 1px solid var(--pve-border);
850
+ border-right: 1px solid var(--sa-border);
946
851
  background: #fff;
947
852
  min-width: 0;
948
853
  overflow: hidden;
@@ -952,7 +857,7 @@ function emitSave(): void {
952
857
  }
953
858
  .pve-col-header {
954
859
  padding: 16px 18px 12px;
955
- border-bottom: 1px solid var(--pve-border);
860
+ border-bottom: 1px solid var(--sa-border);
956
861
  display: flex;
957
862
  align-items: flex-start;
958
863
  gap: 8px;
@@ -971,7 +876,7 @@ function emitSave(): void {
971
876
  }
972
877
  .pve-col-sub {
973
878
  font-size: 11.5px;
974
- color: #64748b;
879
+ color: var(--sa-muted);
975
880
  margin-top: 2px;
976
881
  }
977
882
 
@@ -986,7 +891,7 @@ function emitSave(): void {
986
891
  padding: 10px 14px;
987
892
  margin: 10px 14px 0;
988
893
  background: #fff;
989
- border: 1px solid var(--pve-border);
894
+ border: 1px solid var(--sa-border);
990
895
  border-radius: 8px;
991
896
  }
992
897
  .pve-search input {
@@ -994,11 +899,11 @@ function emitSave(): void {
994
899
  border: 0;
995
900
  outline: 0;
996
901
  background: transparent;
997
- font: 13px var(--pve-font-sans);
998
- color: #0f172a;
902
+ font: 13px var(--sa-font-body);
903
+ color: var(--sa-heading);
999
904
  }
1000
905
  .pve-search-ico {
1001
- color: #94a3b8;
906
+ color: var(--sa-muted-light);
1002
907
  display: inline-flex;
1003
908
  }
1004
909
  .pve-tabs {
@@ -1011,23 +916,23 @@ function emitSave(): void {
1011
916
  border: 0;
1012
917
  padding: 5px 10px;
1013
918
  border-radius: 6px;
1014
- font: 500 12.5px var(--pve-font-sans);
1015
- color: #475569;
919
+ font: 500 12.5px var(--sa-font-body);
920
+ color: var(--sa-muted-dark);
1016
921
  cursor: pointer;
1017
922
  display: flex;
1018
923
  align-items: center;
1019
924
  gap: 6px;
1020
925
  }
1021
926
  .pve-tab--active {
1022
- background: #0f172a;
927
+ background: var(--sa-heading);
1023
928
  color: #fff;
1024
929
  }
1025
930
  .pve-tab-count {
1026
931
  font-size: 10.5px;
1027
932
  padding: 1px 5px;
1028
933
  border-radius: 4px;
1029
- background: #e2e8f0;
1030
- color: #475569;
934
+ background: var(--sa-border);
935
+ color: var(--sa-muted-dark);
1031
936
  }
1032
937
  .pve-tab--active .pve-tab-count {
1033
938
  background: rgba(255, 255, 255, 0.15);
@@ -1043,7 +948,7 @@ function emitSave(): void {
1043
948
  font-size: 10px;
1044
949
  text-transform: uppercase;
1045
950
  letter-spacing: 0.1em;
1046
- color: #94a3b8;
951
+ color: var(--sa-muted-light);
1047
952
  font-weight: 700;
1048
953
  padding: 12px 4px 6px;
1049
954
  }
@@ -1052,7 +957,7 @@ function emitSave(): void {
1052
957
  align-items: flex-start;
1053
958
  gap: 10px;
1054
959
  background: #fff;
1055
- border: 1px solid var(--pve-border);
960
+ border: 1px solid var(--sa-border);
1056
961
  border-radius: 8px;
1057
962
  padding: 9px 10px;
1058
963
  margin-bottom: 6px;
@@ -1070,12 +975,12 @@ function emitSave(): void {
1070
975
  cursor: grabbing;
1071
976
  }
1072
977
  .pve-pool-card--selected {
1073
- background: var(--pve-surface-2);
978
+ background: var(--sa-bg-surface-2);
1074
979
  opacity: 0.7;
1075
980
  }
1076
981
  .pve-pool-card--partial {
1077
982
  border-color: #fde68a;
1078
- background: #fffbeb;
983
+ background: var(--sa-warning-bg);
1079
984
  }
1080
985
  .pve-pool-grip {
1081
986
  color: #cbd5e1;
@@ -1094,7 +999,7 @@ function emitSave(): void {
1094
999
  .pve-pool-card-label {
1095
1000
  font-size: 13px;
1096
1001
  font-weight: 600;
1097
- color: #0f172a;
1002
+ color: var(--sa-heading);
1098
1003
  }
1099
1004
  .pve-pool-card-check {
1100
1005
  display: inline-grid;
@@ -1112,12 +1017,12 @@ function emitSave(): void {
1112
1017
  align-items: center;
1113
1018
  flex-wrap: wrap;
1114
1019
  font-size: 10.5px;
1115
- color: #94a3b8;
1020
+ color: var(--sa-muted-light);
1116
1021
  margin-top: 2px;
1117
1022
  }
1118
1023
  .pve-pool-card-key {
1119
- font: 500 10px var(--pve-font-mono);
1120
- color: #64748b;
1024
+ font: 500 10px var(--sa-font-mono);
1025
+ color: var(--sa-muted);
1121
1026
  }
1122
1027
  .pve-pool-card-dot {
1123
1028
  color: #cbd5e1;
@@ -1126,7 +1031,7 @@ function emitSave(): void {
1126
1031
  .pve-empty {
1127
1032
  padding: 24px 4px;
1128
1033
  text-align: center;
1129
- color: #94a3b8;
1034
+ color: var(--sa-muted-light);
1130
1035
  font-size: 12.5px;
1131
1036
  font-style: italic;
1132
1037
  }
@@ -1141,11 +1046,11 @@ function emitSave(): void {
1141
1046
  }
1142
1047
  .pve-basket--dragover {
1143
1048
  background: #f0f6ff;
1144
- box-shadow: inset 0 0 0 2px var(--pve-primary);
1049
+ box-shadow: inset 0 0 0 2px var(--sa-primary);
1145
1050
  }
1146
1051
  .pve-basket-settings {
1147
- background: linear-gradient(180deg, var(--pve-surface-2) 0%, #fff 100%);
1148
- border-bottom: 1px solid var(--pve-border);
1052
+ background: linear-gradient(180deg, var(--sa-bg-surface-2) 0%, #fff 100%);
1053
+ border-bottom: 1px solid var(--sa-border);
1149
1054
  padding: 14px 22px 16px;
1150
1055
  display: flex;
1151
1056
  flex-direction: column;
@@ -1158,7 +1063,7 @@ function emitSave(): void {
1158
1063
  }
1159
1064
  .pve-bs-label {
1160
1065
  font-size: 12px;
1161
- color: #475569;
1066
+ color: var(--sa-muted-dark);
1162
1067
  font-weight: 500;
1163
1068
  min-width: 88px;
1164
1069
  }
@@ -1168,15 +1073,15 @@ function emitSave(): void {
1168
1073
  }
1169
1074
  .pve-bs-input {
1170
1075
  background: #fff;
1171
- border: 1px solid var(--pve-border);
1076
+ border: 1px solid var(--sa-border);
1172
1077
  border-radius: 6px;
1173
1078
  padding: 6px 10px;
1174
- font: 13px var(--pve-font-sans);
1175
- color: #0f172a;
1079
+ font: 13px var(--sa-font-body);
1080
+ color: var(--sa-heading);
1176
1081
  outline: none;
1177
1082
  }
1178
1083
  .pve-bs-input:focus {
1179
- border-color: var(--pve-primary);
1084
+ border-color: var(--sa-primary);
1180
1085
  box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
1181
1086
  }
1182
1087
  .pve-bs-input--error {
@@ -1206,7 +1111,7 @@ function emitSave(): void {
1206
1111
  .pve-bs-input-grp {
1207
1112
  display: flex;
1208
1113
  align-items: stretch;
1209
- border: 1px solid var(--pve-border);
1114
+ border: 1px solid var(--sa-border);
1210
1115
  border-radius: 6px;
1211
1116
  background: #fff;
1212
1117
  overflow: hidden;
@@ -1222,17 +1127,17 @@ function emitSave(): void {
1222
1127
  }
1223
1128
  .pve-bs-prefix,
1224
1129
  .pve-bs-suffix {
1225
- background: var(--pve-surface-2);
1130
+ background: var(--sa-bg-surface-2);
1226
1131
  padding: 6px 10px;
1227
1132
  font-size: 12px;
1228
- color: #64748b;
1133
+ color: var(--sa-muted);
1229
1134
  display: grid;
1230
1135
  place-items: center;
1231
- border-right: 1px solid var(--pve-border);
1136
+ border-right: 1px solid var(--sa-border);
1232
1137
  }
1233
1138
  .pve-bs-suffix {
1234
1139
  border-right: 0;
1235
- border-left: 1px solid var(--pve-border);
1140
+ border-left: 1px solid var(--sa-border);
1236
1141
  }
1237
1142
 
1238
1143
  .pve-toggle {
@@ -1266,7 +1171,7 @@ function emitSave(): void {
1266
1171
  transition: transform 0.15s;
1267
1172
  }
1268
1173
  .pve-toggle input:checked + span {
1269
- background: var(--pve-primary);
1174
+ background: var(--sa-primary);
1270
1175
  }
1271
1176
  .pve-toggle input:checked + span::before {
1272
1177
  transform: translateX(16px);
@@ -1274,7 +1179,7 @@ function emitSave(): void {
1274
1179
 
1275
1180
  .pve-basket-group {
1276
1181
  padding: 14px 22px;
1277
- border-bottom: 1px solid #f1f5f9;
1182
+ border-bottom: 1px solid var(--sa-border-soft);
1278
1183
  }
1279
1184
  .pve-basket-group:last-child {
1280
1185
  border-bottom: 0;
@@ -1309,23 +1214,23 @@ function emitSave(): void {
1309
1214
  .pve-bg-count {
1310
1215
  margin-left: 6px;
1311
1216
  font-size: 11px;
1312
- color: #94a3b8;
1217
+ color: var(--sa-muted-light);
1313
1218
  }
1314
1219
 
1315
1220
  .pve-dz {
1316
- border: 1.5px dashed var(--pve-border-strong);
1221
+ border: 1.5px dashed var(--sa-border-strong);
1317
1222
  border-radius: 10px;
1318
1223
  padding: 12px;
1319
1224
  background: #fafbfc;
1320
1225
  min-height: 60px;
1321
1226
  }
1322
1227
  .pve-basket--dragover .pve-dz {
1323
- border-color: var(--pve-primary);
1228
+ border-color: var(--sa-primary);
1324
1229
  background: #f0f6ff;
1325
1230
  }
1326
1231
  .pve-dz-empty {
1327
1232
  font-size: 12px;
1328
- color: #94a3b8;
1233
+ color: var(--sa-muted-light);
1329
1234
  text-align: center;
1330
1235
  padding: 4px 0;
1331
1236
  }
@@ -1339,7 +1244,7 @@ function emitSave(): void {
1339
1244
  gap: 10px;
1340
1245
  padding: 8px 10px;
1341
1246
  background: #fff;
1342
- border: 1px solid var(--pve-border);
1247
+ border: 1px solid var(--sa-border);
1343
1248
  border-radius: 6px;
1344
1249
  margin-bottom: 4px;
1345
1250
  }
@@ -1368,28 +1273,28 @@ function emitSave(): void {
1368
1273
  .pve-sel-label {
1369
1274
  font-size: 13px;
1370
1275
  font-weight: 600;
1371
- color: #0f172a;
1276
+ color: var(--sa-heading);
1372
1277
  }
1373
1278
  .pve-sel-sub {
1374
- font: 500 10.5px var(--pve-font-mono);
1375
- color: #94a3b8;
1279
+ font: 500 10.5px var(--sa-font-mono);
1280
+ color: var(--sa-muted-light);
1376
1281
  }
1377
1282
  .pve-sel-val-edit {
1378
1283
  display: flex;
1379
1284
  align-items: center;
1380
1285
  gap: 4px;
1381
- background: var(--pve-surface-2);
1286
+ background: var(--sa-bg-surface-2);
1382
1287
  padding: 3px 8px;
1383
1288
  border-radius: 5px;
1384
- border: 1px solid var(--pve-border);
1289
+ border: 1px solid var(--sa-border);
1385
1290
  }
1386
1291
  .pve-sel-val-input {
1387
1292
  width: 64px;
1388
1293
  border: 0;
1389
1294
  outline: 0;
1390
1295
  background: transparent;
1391
- font: 600 13px var(--pve-font-sans);
1392
- color: #0f172a;
1296
+ font: 600 13px var(--sa-font-body);
1297
+ color: var(--sa-heading);
1393
1298
  text-align: right;
1394
1299
  -moz-appearance: textfield;
1395
1300
  }
@@ -1400,12 +1305,12 @@ function emitSave(): void {
1400
1305
  }
1401
1306
  .pve-sel-val-unit {
1402
1307
  font-size: 10.5px;
1403
- color: #94a3b8;
1308
+ color: var(--sa-muted-light);
1404
1309
  }
1405
1310
  .pve-sel-x {
1406
1311
  background: transparent;
1407
1312
  border: 0;
1408
- color: #94a3b8;
1313
+ color: var(--sa-muted-light);
1409
1314
  cursor: pointer;
1410
1315
  padding: 4px;
1411
1316
  border-radius: 4px;
@@ -1419,7 +1324,7 @@ function emitSave(): void {
1419
1324
 
1420
1325
  /* ── RIGHT — Preview ───────────────────────────────────────────── */
1421
1326
  .pve-preview {
1422
- background: var(--pve-surface-2);
1327
+ background: var(--sa-bg-surface-2);
1423
1328
  overflow: auto;
1424
1329
  }
1425
1330
  .pve-preview-toggle {
@@ -1431,7 +1336,7 @@ function emitSave(): void {
1431
1336
  margin: 14px 18px;
1432
1337
  background: #fff;
1433
1338
  border-radius: 10px;
1434
- border: 1px solid var(--pve-border);
1339
+ border: 1px solid var(--sa-border);
1435
1340
  overflow: hidden;
1436
1341
  transition: max-width 0.18s;
1437
1342
  }
@@ -1443,8 +1348,8 @@ function emitSave(): void {
1443
1348
  align-items: center;
1444
1349
  gap: 6px;
1445
1350
  padding: 8px 12px;
1446
- background: #f1f5f9;
1447
- border-bottom: 1px solid var(--pve-border);
1351
+ background: var(--sa-border-soft);
1352
+ border-bottom: 1px solid var(--sa-border);
1448
1353
  }
1449
1354
  .pve-prev-dot {
1450
1355
  width: 9px;
@@ -1457,9 +1362,9 @@ function emitSave(): void {
1457
1362
  border-radius: 4px;
1458
1363
  padding: 3px 10px;
1459
1364
  margin-left: 10px;
1460
- font: 500 11px var(--pve-font-mono);
1461
- color: #64748b;
1462
- border: 1px solid var(--pve-border);
1365
+ font: 500 11px var(--sa-font-mono);
1366
+ color: var(--sa-muted);
1367
+ border: 1px solid var(--sa-border);
1463
1368
  }
1464
1369
  .pve-prev-body {
1465
1370
  padding: 18px 18px 16px;
@@ -1468,7 +1373,7 @@ function emitSave(): void {
1468
1373
  font-size: 10.5px;
1469
1374
  text-transform: uppercase;
1470
1375
  letter-spacing: 0.12em;
1471
- color: #64748b;
1376
+ color: var(--sa-muted);
1472
1377
  font-weight: 700;
1473
1378
  }
1474
1379
  .pve-prev-title {
@@ -1476,11 +1381,11 @@ function emitSave(): void {
1476
1381
  font-weight: 700;
1477
1382
  letter-spacing: -0.03em;
1478
1383
  margin-top: 6px;
1479
- color: #0f172a;
1384
+ color: var(--sa-heading);
1480
1385
  }
1481
1386
  .pve-prev-desc {
1482
1387
  font-size: 12.5px;
1483
- color: #475569;
1388
+ color: var(--sa-muted-dark);
1484
1389
  margin-top: 6px;
1485
1390
  line-height: 1.5;
1486
1391
  }
@@ -1494,11 +1399,11 @@ function emitSave(): void {
1494
1399
  font-size: 38px;
1495
1400
  font-weight: 700;
1496
1401
  letter-spacing: -0.03em;
1497
- color: #0f172a;
1402
+ color: var(--sa-heading);
1498
1403
  }
1499
1404
  .pve-prev-price-unit {
1500
1405
  font-size: 13px;
1501
- color: #64748b;
1406
+ color: var(--sa-muted);
1502
1407
  }
1503
1408
  .pve-prev-price-yearly {
1504
1409
  font-size: 11.5px;
@@ -1511,21 +1416,21 @@ function emitSave(): void {
1511
1416
  width: 100%;
1512
1417
  margin-top: 14px;
1513
1418
  padding: 10px;
1514
- background: #0f172a;
1419
+ background: var(--sa-heading);
1515
1420
  color: #fff;
1516
1421
  border: 0;
1517
1422
  border-radius: 7px;
1518
- font: 600 13px var(--pve-font-sans);
1423
+ font: 600 13px var(--sa-font-body);
1519
1424
  cursor: pointer;
1520
1425
  }
1521
1426
  .pve-prev-sep {
1522
1427
  margin-top: 18px;
1523
1428
  padding-top: 14px;
1524
- border-top: 1px solid #f1f5f9;
1429
+ border-top: 1px solid var(--sa-border-soft);
1525
1430
  font-size: 10.5px;
1526
1431
  text-transform: uppercase;
1527
1432
  letter-spacing: 0.12em;
1528
- color: #94a3b8;
1433
+ color: var(--sa-muted-light);
1529
1434
  font-weight: 700;
1530
1435
  }
1531
1436
  .pve-prev-list {
@@ -1541,7 +1446,7 @@ function emitSave(): void {
1541
1446
  align-items: center;
1542
1447
  gap: 8px;
1543
1448
  font-size: 12.5px;
1544
- color: #0f172a;
1449
+ color: var(--sa-heading);
1545
1450
  }
1546
1451
  .pve-prev-list li b {
1547
1452
  font-weight: 600;
@@ -1557,22 +1462,22 @@ function emitSave(): void {
1557
1462
  flex: 0 0 auto;
1558
1463
  }
1559
1464
  .pve-prev-empty {
1560
- color: #94a3b8;
1465
+ color: var(--sa-muted-light);
1561
1466
  font-style: italic;
1562
1467
  }
1563
1468
  .pve-prev-foot {
1564
1469
  margin-top: 16px;
1565
1470
  padding-top: 14px;
1566
- border-top: 1px solid #f1f5f9;
1471
+ border-top: 1px solid var(--sa-border-soft);
1567
1472
  font-size: 10.5px;
1568
- color: #94a3b8;
1473
+ color: var(--sa-muted-light);
1569
1474
  line-height: 1.5;
1570
1475
  }
1571
1476
 
1572
1477
  .pve-prev-validate {
1573
1478
  margin: 0 18px 18px;
1574
1479
  background: #fff;
1575
- border: 1px solid var(--pve-border);
1480
+ border: 1px solid var(--sa-border);
1576
1481
  border-radius: 8px;
1577
1482
  padding: 12px;
1578
1483
  }
@@ -1583,7 +1488,7 @@ function emitSave(): void {
1583
1488
  margin-bottom: 6px;
1584
1489
  }
1585
1490
  .pve-prev-validate-tick {
1586
- color: var(--pve-live);
1491
+ color: var(--sa-positive-light);
1587
1492
  display: inline-flex;
1588
1493
  }
1589
1494
  .pve-prev-validate-title {
@@ -1593,7 +1498,7 @@ function emitSave(): void {
1593
1498
  .pve-prev-validate-count {
1594
1499
  margin-left: auto;
1595
1500
  font-size: 11px;
1596
- color: #64748b;
1501
+ color: var(--sa-muted);
1597
1502
  }
1598
1503
  .pve-vchk {
1599
1504
  display: flex;
@@ -1603,17 +1508,17 @@ function emitSave(): void {
1603
1508
  padding: 3px 0;
1604
1509
  }
1605
1510
  .pve-vchk--ok {
1606
- color: #475569;
1511
+ color: var(--sa-muted-dark);
1607
1512
  }
1608
1513
  .pve-vchk--ok span:first-child {
1609
- color: var(--pve-live);
1514
+ color: var(--sa-positive-light);
1610
1515
  display: inline-flex;
1611
1516
  }
1612
1517
  .pve-vchk--warn {
1613
1518
  color: #b45309;
1614
1519
  }
1615
1520
  .pve-vchk--warn span:first-child {
1616
- color: var(--pve-draft);
1521
+ color: var(--sa-amber);
1617
1522
  display: inline-flex;
1618
1523
  }
1619
1524
 
@@ -1630,7 +1535,7 @@ function emitSave(): void {
1630
1535
  }
1631
1536
  .pve-col {
1632
1537
  border-right: 0;
1633
- border-bottom: 1px solid var(--pve-border);
1538
+ border-bottom: 1px solid var(--sa-border);
1634
1539
  }
1635
1540
  }
1636
1541
 
@@ -1642,15 +1547,15 @@ function emitSave(): void {
1642
1547
  border-radius: 14px;
1643
1548
  box-shadow: 0 24px 60px rgba(15, 23, 42, 0.3);
1644
1549
  overflow: hidden;
1645
- font-family: var(--pve-font-sans);
1646
- color: var(--pve-text);
1550
+ font-family: var(--sa-font-body);
1551
+ color: var(--sa-heading);
1647
1552
  }
1648
1553
  .pve-diff-modal * {
1649
1554
  box-sizing: border-box;
1650
1555
  }
1651
1556
  .pve-diff-head {
1652
1557
  padding: 16px 20px;
1653
- border-bottom: 1px solid var(--pve-border);
1558
+ border-bottom: 1px solid var(--sa-border);
1654
1559
  display: flex;
1655
1560
  align-items: flex-start;
1656
1561
  gap: 12px;
@@ -1662,7 +1567,7 @@ function emitSave(): void {
1662
1567
  }
1663
1568
  .pve-diff-sub {
1664
1569
  font-size: 11.5px;
1665
- color: #64748b;
1570
+ color: var(--sa-muted);
1666
1571
  margin-top: 3px;
1667
1572
  }
1668
1573
  .pve-diff-close {
@@ -1672,7 +1577,7 @@ function emitSave(): void {
1672
1577
  border-radius: 6px;
1673
1578
  background: transparent;
1674
1579
  border: 0;
1675
- color: var(--pve-text-3);
1580
+ color: var(--sa-muted-light);
1676
1581
  cursor: pointer;
1677
1582
  display: grid;
1678
1583
  place-items: center;
@@ -1680,7 +1585,7 @@ function emitSave(): void {
1680
1585
  }
1681
1586
  .pve-diff-close:hover {
1682
1587
  background: rgba(15, 23, 42, 0.05);
1683
- color: var(--pve-text);
1588
+ color: var(--sa-heading);
1684
1589
  }
1685
1590
  .pve-diff-body {
1686
1591
  padding: 14px 20px 18px;
@@ -1728,7 +1633,7 @@ function emitSave(): void {
1728
1633
  .pve-diff-label {
1729
1634
  font-size: 13px;
1730
1635
  font-weight: 600;
1731
- color: var(--pve-text);
1636
+ color: var(--sa-heading);
1732
1637
  }
1733
1638
  .pve-diff-change {
1734
1639
  display: flex;
@@ -1739,10 +1644,10 @@ function emitSave(): void {
1739
1644
  }
1740
1645
  .pve-diff-from {
1741
1646
  text-decoration: line-through;
1742
- color: var(--pve-text-3);
1647
+ color: var(--sa-muted-light);
1743
1648
  }
1744
1649
  .pve-diff-to {
1745
- color: var(--pve-text);
1650
+ color: var(--sa-heading);
1746
1651
  font-weight: 600;
1747
1652
  }
1748
1653
  .pve-diff-arrow {
@@ -1755,7 +1660,7 @@ function emitSave(): void {
1755
1660
  .pve-diff-empty {
1756
1661
  padding: 24px 8px;
1757
1662
  text-align: center;
1758
- color: var(--pve-text-3);
1663
+ color: var(--sa-muted-light);
1759
1664
  font-style: italic;
1760
1665
  font-size: 13px;
1761
1666
  }