@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
@@ -563,10 +563,30 @@ const checklistOkCount = computed(() => checklist.value.filter((c) => c.ok).leng
563
563
  // ── Diff vs. predecessor ────────────────────────────────────────────
564
564
  const showDiff = ref(false);
565
565
 
566
+ // Roles rather than values, because these reach the DOM through a `:style`
567
+ // binding — see PlanVersionDiffDialog. Fixed light hexes there meant the dialog
568
+ // kept white-ish rows in dark mode while the label above them turned near-white
569
+ // with the theme, which is the one state where a diff has to be readable.
570
+ // An inline style resolves `var()`, so the indirection costs nothing.
566
571
  const DIFF_STYLE = {
567
- added: { bg: '#ecfdf5', border: '#a7f3d0', color: '#047857', sign: '+' },
568
- removed: { bg: '#fef2f2', border: '#fecaca', color: '#b91c1c', sign: '−' },
569
- changed: { bg: '#fffbeb', border: '#fde68a', color: '#b45309', sign: '~' },
572
+ added: {
573
+ bg: 'var(--sa-color-positive-surface)',
574
+ border: 'var(--sa-color-positive-border)',
575
+ color: 'var(--sa-color-positive-fg)',
576
+ sign: '+',
577
+ },
578
+ removed: {
579
+ bg: 'var(--sa-color-negative-surface)',
580
+ border: 'var(--sa-color-negative-border)',
581
+ color: 'var(--sa-color-negative-fg)',
582
+ sign: '−',
583
+ },
584
+ changed: {
585
+ bg: 'var(--sa-color-warning-surface)',
586
+ border: 'var(--sa-color-warning-border)',
587
+ color: 'var(--sa-color-warning-fg)',
588
+ sign: '~',
589
+ },
570
590
  } as const;
571
591
 
572
592
  const diffStyles = computed(() => ({
@@ -740,6 +760,10 @@ function emitSave(): void {
740
760
  display: flex;
741
761
  flex-direction: column;
742
762
  box-sizing: border-box;
763
+ /* The editor reflows on ITS OWN width, not the window's — see the
764
+ `@container` rules at the end of this block. */
765
+ container-type: inline-size;
766
+ container-name: pve;
743
767
  /* A full view rather than a modal: the columns stretch to the content area
744
768
  AdminPage already sizes. */
745
769
  height: 100%;
@@ -754,10 +778,10 @@ function emitSave(): void {
754
778
  align-items: center;
755
779
  gap: 10px;
756
780
  padding: 10px 22px;
757
- background: #fef2f2;
758
- border-bottom: 1px solid #fecaca;
759
- color: #b91c1c;
760
- font-size: 13px;
781
+ background: var(--sa-color-negative-surface);
782
+ border-bottom: 1px solid var(--sa-color-negative-border);
783
+ color: var(--sa-color-negative-fg);
784
+ font-size: var(--sa-text-md);
761
785
  font-weight: 500;
762
786
  }
763
787
  .pve-error-ico {
@@ -769,16 +793,16 @@ function emitSave(): void {
769
793
  display: inline-flex;
770
794
  align-items: center;
771
795
  gap: 6px;
772
- font-size: 10px;
796
+ font-size: var(--sa-text-2xs);
773
797
  font-weight: 700;
774
798
  letter-spacing: 0.1em;
775
- color: var(--sa-muted-light);
799
+ color: var(--sa-color-fg-subtle);
776
800
  }
777
801
  .pve-mono {
778
- font: 500 11px var(--sa-font-mono);
802
+ font: 500 var(--sa-text-xs) var(--sa-font-mono);
779
803
  }
780
804
  .pve-mono--xs {
781
- font-size: 10px;
805
+ font-size: var(--sa-text-2xs);
782
806
  }
783
807
 
784
808
  /* ── Buttons & Chips ───────────────────────────────────────────── */
@@ -789,22 +813,22 @@ function emitSave(): void {
789
813
  gap: 5px;
790
814
  padding: 2px 8px;
791
815
  border-radius: 999px;
792
- font-size: 11px;
816
+ font-size: var(--sa-text-xs);
793
817
  font-weight: 600;
794
818
  letter-spacing: 0.01em;
795
- background: var(--sa-bg-surface-2);
796
- color: var(--sa-muted-dark);
797
- border: 1px solid var(--sa-border);
819
+ background: var(--sa-color-bg-sunken);
820
+ color: var(--sa-color-fg-secondary);
821
+ border: 1px solid var(--sa-color-border);
798
822
  }
799
823
  .pve-chip--plan {
800
- background: #dbeafe;
801
- color: #1e40af;
802
- border-color: #bfdbfe;
824
+ background: var(--sa-color-info-surface-strong);
825
+ color: var(--sa-color-info-fg);
826
+ border-color: var(--sa-color-info-border);
803
827
  }
804
828
  .pve-chip--draft {
805
- background: var(--sa-warning-bg);
806
- color: #b45309;
807
- border-color: #fde68a;
829
+ background: var(--sa-color-warning-surface);
830
+ color: var(--sa-color-warning-fg);
831
+ border-color: var(--sa-color-warning-border);
808
832
  }
809
833
  .pve-chip--dot::before {
810
834
  content: '';
@@ -814,18 +838,18 @@ function emitSave(): void {
814
838
  background: currentColor;
815
839
  }
816
840
  .pve-chip--changes {
817
- background: var(--sa-warning-bg);
818
- color: #b45309;
819
- border-color: #fde68a;
841
+ background: var(--sa-color-warning-surface);
842
+ color: var(--sa-color-warning-fg);
843
+ border-color: var(--sa-color-warning-border);
820
844
  }
821
845
 
822
846
  .pve-kbd {
823
- font: 600 10.5px var(--sa-font-mono);
824
- background: var(--sa-border-soft);
825
- color: var(--sa-muted-dark);
847
+ font: 600 var(--sa-text-xs) var(--sa-font-mono);
848
+ background: var(--sa-color-border-soft);
849
+ color: var(--sa-color-fg-secondary);
826
850
  padding: 2px 6px;
827
851
  border-radius: 4px;
828
- border: 1px solid var(--sa-border);
852
+ border: 1px solid var(--sa-color-border);
829
853
  }
830
854
 
831
855
  /* ── Body Grid ──────────────────────────────────────────────────── */
@@ -841,14 +865,14 @@ function emitSave(): void {
841
865
  overflow: hidden;
842
866
  display: grid;
843
867
  grid-template-columns: 380px 1fr 400px;
844
- background: var(--sa-bg-app);
868
+ background: var(--sa-color-bg-app);
845
869
  }
846
870
 
847
871
  .pve-col {
848
872
  display: flex;
849
873
  flex-direction: column;
850
- border-right: 1px solid var(--sa-border);
851
- background: #fff;
874
+ border-right: 1px solid var(--sa-color-border);
875
+ background: var(--sa-color-bg-surface);
852
876
  min-width: 0;
853
877
  overflow: hidden;
854
878
  }
@@ -857,7 +881,7 @@ function emitSave(): void {
857
881
  }
858
882
  .pve-col-header {
859
883
  padding: 16px 18px 12px;
860
- border-bottom: 1px solid var(--sa-border);
884
+ border-bottom: 1px solid var(--sa-color-border);
861
885
  display: flex;
862
886
  align-items: flex-start;
863
887
  gap: 8px;
@@ -870,19 +894,19 @@ function emitSave(): void {
870
894
  padding: 16px 18px 12px;
871
895
  }
872
896
  .pve-col-title {
873
- font-size: 14px;
897
+ font-size: var(--sa-text-lg);
874
898
  font-weight: 700;
875
899
  letter-spacing: -0.01em;
876
900
  }
877
901
  .pve-col-sub {
878
- font-size: 11.5px;
879
- color: var(--sa-muted);
902
+ font-size: var(--sa-text-sm);
903
+ color: var(--sa-color-fg-muted);
880
904
  margin-top: 2px;
881
905
  }
882
906
 
883
907
  /* ── LEFT — Pool ───────────────────────────────────────────────── */
884
908
  .pve-pool {
885
- background: #fbfbfd;
909
+ background: var(--sa-color-bg-surface-raised);
886
910
  }
887
911
  .pve-search {
888
912
  display: flex;
@@ -890,8 +914,8 @@ function emitSave(): void {
890
914
  gap: 8px;
891
915
  padding: 10px 14px;
892
916
  margin: 10px 14px 0;
893
- background: #fff;
894
- border: 1px solid var(--sa-border);
917
+ background: var(--sa-color-bg-surface);
918
+ border: 1px solid var(--sa-color-border);
895
919
  border-radius: 8px;
896
920
  }
897
921
  .pve-search input {
@@ -899,11 +923,11 @@ function emitSave(): void {
899
923
  border: 0;
900
924
  outline: 0;
901
925
  background: transparent;
902
- font: 13px var(--sa-font-body);
903
- color: var(--sa-heading);
926
+ font: var(--sa-text-md) var(--sa-font-body);
927
+ color: var(--sa-color-fg-heading);
904
928
  }
905
929
  .pve-search-ico {
906
- color: var(--sa-muted-light);
930
+ color: var(--sa-color-fg-subtle);
907
931
  display: inline-flex;
908
932
  }
909
933
  .pve-tabs {
@@ -916,27 +940,27 @@ function emitSave(): void {
916
940
  border: 0;
917
941
  padding: 5px 10px;
918
942
  border-radius: 6px;
919
- font: 500 12.5px var(--sa-font-body);
920
- color: var(--sa-muted-dark);
943
+ font: 500 var(--sa-text-md) var(--sa-font-body);
944
+ color: var(--sa-color-fg-secondary);
921
945
  cursor: pointer;
922
946
  display: flex;
923
947
  align-items: center;
924
948
  gap: 6px;
925
949
  }
926
950
  .pve-tab--active {
927
- background: var(--sa-heading);
928
- color: #fff;
951
+ background: var(--sa-color-inverse-bg);
952
+ color: var(--sa-color-fg-on-accent);
929
953
  }
930
954
  .pve-tab-count {
931
- font-size: 10.5px;
955
+ font-size: var(--sa-text-xs);
932
956
  padding: 1px 5px;
933
957
  border-radius: 4px;
934
- background: var(--sa-border);
935
- color: var(--sa-muted-dark);
958
+ background: var(--sa-color-border);
959
+ color: var(--sa-color-fg-secondary);
936
960
  }
937
961
  .pve-tab--active .pve-tab-count {
938
- background: rgba(255, 255, 255, 0.15);
939
- color: #fff;
962
+ background: var(--sa-color-inverse-border-strong);
963
+ color: var(--sa-color-fg-on-accent);
940
964
  }
941
965
  .pve-pool-list {
942
966
  flex: 1;
@@ -945,10 +969,10 @@ function emitSave(): void {
945
969
  padding: 6px 14px 18px;
946
970
  }
947
971
  .pve-pool-group {
948
- font-size: 10px;
972
+ font-size: var(--sa-text-2xs);
949
973
  text-transform: uppercase;
950
974
  letter-spacing: 0.1em;
951
- color: var(--sa-muted-light);
975
+ color: var(--sa-color-fg-subtle);
952
976
  font-weight: 700;
953
977
  padding: 12px 4px 6px;
954
978
  }
@@ -956,8 +980,8 @@ function emitSave(): void {
956
980
  display: flex;
957
981
  align-items: flex-start;
958
982
  gap: 10px;
959
- background: #fff;
960
- border: 1px solid var(--sa-border);
983
+ background: var(--sa-color-bg-surface);
984
+ border: 1px solid var(--sa-color-border);
961
985
  border-radius: 8px;
962
986
  padding: 9px 10px;
963
987
  margin-bottom: 6px;
@@ -968,22 +992,22 @@ function emitSave(): void {
968
992
  user-select: none;
969
993
  }
970
994
  .pve-pool-card:hover {
971
- border-color: #c7d2fe;
972
- box-shadow: 0 1px 3px rgba(15, 23, 42, 0.06);
995
+ border-color: var(--sa-color-scheduled-border);
996
+ box-shadow: 0 1px 3px var(--sa-shadow-tint-1);
973
997
  }
974
998
  .pve-pool-card:active {
975
999
  cursor: grabbing;
976
1000
  }
977
1001
  .pve-pool-card--selected {
978
- background: var(--sa-bg-surface-2);
1002
+ background: var(--sa-color-bg-sunken);
979
1003
  opacity: 0.7;
980
1004
  }
981
1005
  .pve-pool-card--partial {
982
- border-color: #fde68a;
983
- background: var(--sa-warning-bg);
1006
+ border-color: var(--sa-color-warning-border);
1007
+ background: var(--sa-color-warning-surface);
984
1008
  }
985
1009
  .pve-pool-grip {
986
- color: #cbd5e1;
1010
+ color: var(--sa-color-fg-disabled);
987
1011
  padding-top: 3px;
988
1012
  flex: 0 0 auto;
989
1013
  }
@@ -997,9 +1021,9 @@ function emitSave(): void {
997
1021
  gap: 8px;
998
1022
  }
999
1023
  .pve-pool-card-label {
1000
- font-size: 13px;
1024
+ font-size: var(--sa-text-md);
1001
1025
  font-weight: 600;
1002
- color: var(--sa-heading);
1026
+ color: var(--sa-color-fg-heading);
1003
1027
  }
1004
1028
  .pve-pool-card-check {
1005
1029
  display: inline-grid;
@@ -1007,8 +1031,8 @@ function emitSave(): void {
1007
1031
  width: 16px;
1008
1032
  height: 16px;
1009
1033
  border-radius: 4px;
1010
- background: #d1fae5;
1011
- color: #047857;
1034
+ background: var(--sa-color-positive-surface-strong);
1035
+ color: var(--sa-color-positive-fg);
1012
1036
  margin-left: auto;
1013
1037
  }
1014
1038
  .pve-pool-card-meta {
@@ -1016,23 +1040,23 @@ function emitSave(): void {
1016
1040
  gap: 5px;
1017
1041
  align-items: center;
1018
1042
  flex-wrap: wrap;
1019
- font-size: 10.5px;
1020
- color: var(--sa-muted-light);
1043
+ font-size: var(--sa-text-xs);
1044
+ color: var(--sa-color-fg-subtle);
1021
1045
  margin-top: 2px;
1022
1046
  }
1023
1047
  .pve-pool-card-key {
1024
- font: 500 10px var(--sa-font-mono);
1025
- color: var(--sa-muted);
1048
+ font: 500 var(--sa-text-2xs) var(--sa-font-mono);
1049
+ color: var(--sa-color-fg-muted);
1026
1050
  }
1027
1051
  .pve-pool-card-dot {
1028
- color: #cbd5e1;
1052
+ color: var(--sa-color-fg-disabled);
1029
1053
  }
1030
1054
 
1031
1055
  .pve-empty {
1032
1056
  padding: 24px 4px;
1033
1057
  text-align: center;
1034
- color: var(--sa-muted-light);
1035
- font-size: 12.5px;
1058
+ color: var(--sa-color-fg-subtle);
1059
+ font-size: var(--sa-text-md);
1036
1060
  font-style: italic;
1037
1061
  }
1038
1062
 
@@ -1045,12 +1069,16 @@ function emitSave(): void {
1045
1069
  box-shadow 0.15s;
1046
1070
  }
1047
1071
  .pve-basket--dragover {
1048
- background: #f0f6ff;
1049
- box-shadow: inset 0 0 0 2px var(--sa-primary);
1072
+ background: var(--sa-color-accent-surface);
1073
+ box-shadow: inset 0 0 0 2px var(--sa-color-accent);
1050
1074
  }
1051
1075
  .pve-basket-settings {
1052
- background: linear-gradient(180deg, var(--sa-bg-surface-2) 0%, #fff 100%);
1053
- border-bottom: 1px solid var(--sa-border);
1076
+ background: linear-gradient(
1077
+ 180deg,
1078
+ var(--sa-color-bg-sunken) 0%,
1079
+ var(--sa-color-bg-surface) 100%
1080
+ );
1081
+ border-bottom: 1px solid var(--sa-color-border);
1054
1082
  padding: 14px 22px 16px;
1055
1083
  display: flex;
1056
1084
  flex-direction: column;
@@ -1062,8 +1090,8 @@ function emitSave(): void {
1062
1090
  gap: 10px;
1063
1091
  }
1064
1092
  .pve-bs-label {
1065
- font-size: 12px;
1066
- color: var(--sa-muted-dark);
1093
+ font-size: var(--sa-text-sm);
1094
+ color: var(--sa-color-fg-secondary);
1067
1095
  font-weight: 500;
1068
1096
  min-width: 88px;
1069
1097
  }
@@ -1072,34 +1100,34 @@ function emitSave(): void {
1072
1100
  margin-left: 8px;
1073
1101
  }
1074
1102
  .pve-bs-input {
1075
- background: #fff;
1076
- border: 1px solid var(--sa-border);
1103
+ background: var(--sa-color-bg-surface);
1104
+ border: 1px solid var(--sa-color-border);
1077
1105
  border-radius: 6px;
1078
1106
  padding: 6px 10px;
1079
- font: 13px var(--sa-font-body);
1080
- color: var(--sa-heading);
1107
+ font: var(--sa-text-md) var(--sa-font-body);
1108
+ color: var(--sa-color-fg-heading);
1081
1109
  outline: none;
1082
1110
  }
1083
1111
  .pve-bs-input:focus {
1084
- border-color: var(--sa-primary);
1085
- box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
1112
+ border-color: var(--sa-color-accent);
1113
+ box-shadow: 0 0 0 3px var(--sa-shadow-tint-2);
1086
1114
  }
1087
1115
  .pve-bs-input--error {
1088
- border-color: #ef4444;
1089
- background: #fef2f2;
1116
+ border-color: var(--sa-color-negative-strong);
1117
+ background: var(--sa-color-negative-surface);
1090
1118
  }
1091
1119
  .pve-bs-input--error:focus {
1092
- border-color: #ef4444;
1093
- box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.15);
1120
+ border-color: var(--sa-color-negative-strong);
1121
+ box-shadow: 0 0 0 3px var(--sa-shadow-tint-3);
1094
1122
  }
1095
1123
  .pve-bs-error {
1096
1124
  display: flex;
1097
1125
  align-items: center;
1098
1126
  gap: 6px;
1099
1127
  margin: -2px 0 2px;
1100
- font-size: 11.5px;
1128
+ font-size: var(--sa-text-sm);
1101
1129
  font-weight: 500;
1102
- color: #b91c1c;
1130
+ color: var(--sa-color-negative-fg);
1103
1131
  }
1104
1132
  .pve-bs-error svg {
1105
1133
  flex: 0 0 auto;
@@ -1111,9 +1139,9 @@ function emitSave(): void {
1111
1139
  .pve-bs-input-grp {
1112
1140
  display: flex;
1113
1141
  align-items: stretch;
1114
- border: 1px solid var(--sa-border);
1142
+ border: 1px solid var(--sa-color-border);
1115
1143
  border-radius: 6px;
1116
- background: #fff;
1144
+ background: var(--sa-color-bg-surface);
1117
1145
  overflow: hidden;
1118
1146
  }
1119
1147
  .pve-bs-input-grp--gap {
@@ -1127,17 +1155,17 @@ function emitSave(): void {
1127
1155
  }
1128
1156
  .pve-bs-prefix,
1129
1157
  .pve-bs-suffix {
1130
- background: var(--sa-bg-surface-2);
1158
+ background: var(--sa-color-bg-sunken);
1131
1159
  padding: 6px 10px;
1132
- font-size: 12px;
1133
- color: var(--sa-muted);
1160
+ font-size: var(--sa-text-sm);
1161
+ color: var(--sa-color-fg-muted);
1134
1162
  display: grid;
1135
1163
  place-items: center;
1136
- border-right: 1px solid var(--sa-border);
1164
+ border-right: 1px solid var(--sa-color-border);
1137
1165
  }
1138
1166
  .pve-bs-suffix {
1139
1167
  border-right: 0;
1140
- border-left: 1px solid var(--sa-border);
1168
+ border-left: 1px solid var(--sa-color-border);
1141
1169
  }
1142
1170
 
1143
1171
  .pve-toggle {
@@ -1155,7 +1183,7 @@ function emitSave(): void {
1155
1183
  .pve-toggle span {
1156
1184
  position: absolute;
1157
1185
  inset: 0;
1158
- background: #cbd5e1;
1186
+ background: var(--sa-color-border-strong);
1159
1187
  border-radius: 999px;
1160
1188
  transition: background 0.15s;
1161
1189
  }
@@ -1167,11 +1195,11 @@ function emitSave(): void {
1167
1195
  width: 16px;
1168
1196
  height: 16px;
1169
1197
  border-radius: 50%;
1170
- background: #fff;
1198
+ background: var(--sa-color-bg-surface);
1171
1199
  transition: transform 0.15s;
1172
1200
  }
1173
1201
  .pve-toggle input:checked + span {
1174
- background: var(--sa-primary);
1202
+ background: var(--sa-color-accent);
1175
1203
  }
1176
1204
  .pve-toggle input:checked + span::before {
1177
1205
  transform: translateX(16px);
@@ -1179,7 +1207,7 @@ function emitSave(): void {
1179
1207
 
1180
1208
  .pve-basket-group {
1181
1209
  padding: 14px 22px;
1182
- border-bottom: 1px solid var(--sa-border-soft);
1210
+ border-bottom: 1px solid var(--sa-color-border-soft);
1183
1211
  }
1184
1212
  .pve-basket-group:last-child {
1185
1213
  border-bottom: 0;
@@ -1196,41 +1224,41 @@ function emitSave(): void {
1196
1224
  border-radius: 50%;
1197
1225
  }
1198
1226
  .pve-bg-dot--quota {
1199
- background: #0ea5e9;
1227
+ background: var(--sa-color-quota);
1200
1228
  }
1201
1229
  .pve-bg-dot--feature {
1202
- background: #8b5cf6;
1230
+ background: var(--sa-color-feature);
1203
1231
  }
1204
1232
  .pve-bg-dot--bundle {
1205
- background: #f59e0b;
1233
+ background: var(--sa-color-bundle);
1206
1234
  }
1207
1235
  .pve-bg-title {
1208
- font-size: 12px;
1236
+ font-size: var(--sa-text-sm);
1209
1237
  text-transform: uppercase;
1210
1238
  letter-spacing: 0.1em;
1211
1239
  font-weight: 700;
1212
- color: #334155;
1240
+ color: var(--sa-color-fg-body);
1213
1241
  }
1214
1242
  .pve-bg-count {
1215
1243
  margin-left: 6px;
1216
- font-size: 11px;
1217
- color: var(--sa-muted-light);
1244
+ font-size: var(--sa-text-xs);
1245
+ color: var(--sa-color-fg-subtle);
1218
1246
  }
1219
1247
 
1220
1248
  .pve-dz {
1221
- border: 1.5px dashed var(--sa-border-strong);
1249
+ border: 1.5px dashed var(--sa-color-border-strong);
1222
1250
  border-radius: 10px;
1223
1251
  padding: 12px;
1224
- background: #fafbfc;
1252
+ background: var(--sa-color-bg-surface-raised);
1225
1253
  min-height: 60px;
1226
1254
  }
1227
1255
  .pve-basket--dragover .pve-dz {
1228
- border-color: var(--sa-primary);
1229
- background: #f0f6ff;
1256
+ border-color: var(--sa-color-accent);
1257
+ background: var(--sa-color-accent-surface);
1230
1258
  }
1231
1259
  .pve-dz-empty {
1232
- font-size: 12px;
1233
- color: var(--sa-muted-light);
1260
+ font-size: var(--sa-text-sm);
1261
+ color: var(--sa-color-fg-subtle);
1234
1262
  text-align: center;
1235
1263
  padding: 4px 0;
1236
1264
  }
@@ -1243,8 +1271,8 @@ function emitSave(): void {
1243
1271
  align-items: center;
1244
1272
  gap: 10px;
1245
1273
  padding: 8px 10px;
1246
- background: #fff;
1247
- border: 1px solid var(--sa-border);
1274
+ background: var(--sa-color-bg-surface);
1275
+ border: 1px solid var(--sa-color-border);
1248
1276
  border-radius: 6px;
1249
1277
  margin-bottom: 4px;
1250
1278
  }
@@ -1258,43 +1286,43 @@ function emitSave(): void {
1258
1286
  flex: 0 0 auto;
1259
1287
  }
1260
1288
  .pve-sel-dot--quota {
1261
- background: #0ea5e9;
1289
+ background: var(--sa-color-quota);
1262
1290
  }
1263
1291
  .pve-sel-dot--feature {
1264
- background: #8b5cf6;
1292
+ background: var(--sa-color-feature);
1265
1293
  }
1266
1294
  .pve-sel-dot--bundle {
1267
- background: #f59e0b;
1295
+ background: var(--sa-color-bundle);
1268
1296
  }
1269
1297
  .pve-sel-body {
1270
1298
  flex: 1;
1271
1299
  min-width: 0;
1272
1300
  }
1273
1301
  .pve-sel-label {
1274
- font-size: 13px;
1302
+ font-size: var(--sa-text-md);
1275
1303
  font-weight: 600;
1276
- color: var(--sa-heading);
1304
+ color: var(--sa-color-fg-heading);
1277
1305
  }
1278
1306
  .pve-sel-sub {
1279
- font: 500 10.5px var(--sa-font-mono);
1280
- color: var(--sa-muted-light);
1307
+ font: 500 var(--sa-text-xs) var(--sa-font-mono);
1308
+ color: var(--sa-color-fg-subtle);
1281
1309
  }
1282
1310
  .pve-sel-val-edit {
1283
1311
  display: flex;
1284
1312
  align-items: center;
1285
1313
  gap: 4px;
1286
- background: var(--sa-bg-surface-2);
1314
+ background: var(--sa-color-bg-sunken);
1287
1315
  padding: 3px 8px;
1288
1316
  border-radius: 5px;
1289
- border: 1px solid var(--sa-border);
1317
+ border: 1px solid var(--sa-color-border);
1290
1318
  }
1291
1319
  .pve-sel-val-input {
1292
1320
  width: 64px;
1293
1321
  border: 0;
1294
1322
  outline: 0;
1295
1323
  background: transparent;
1296
- font: 600 13px var(--sa-font-body);
1297
- color: var(--sa-heading);
1324
+ font: 600 var(--sa-text-md) var(--sa-font-body);
1325
+ color: var(--sa-color-fg-heading);
1298
1326
  text-align: right;
1299
1327
  -moz-appearance: textfield;
1300
1328
  }
@@ -1304,13 +1332,13 @@ function emitSave(): void {
1304
1332
  margin: 0;
1305
1333
  }
1306
1334
  .pve-sel-val-unit {
1307
- font-size: 10.5px;
1308
- color: var(--sa-muted-light);
1335
+ font-size: var(--sa-text-xs);
1336
+ color: var(--sa-color-fg-subtle);
1309
1337
  }
1310
1338
  .pve-sel-x {
1311
1339
  background: transparent;
1312
1340
  border: 0;
1313
- color: var(--sa-muted-light);
1341
+ color: var(--sa-color-fg-subtle);
1314
1342
  cursor: pointer;
1315
1343
  padding: 4px;
1316
1344
  border-radius: 4px;
@@ -1318,13 +1346,13 @@ function emitSave(): void {
1318
1346
  place-items: center;
1319
1347
  }
1320
1348
  .pve-sel-x:hover {
1321
- background: #fef2f2;
1322
- color: #ef4444;
1349
+ background: var(--sa-color-negative-surface);
1350
+ color: var(--sa-color-negative-strong);
1323
1351
  }
1324
1352
 
1325
1353
  /* ── RIGHT — Preview ───────────────────────────────────────────── */
1326
1354
  .pve-preview {
1327
- background: var(--sa-bg-surface-2);
1355
+ background: var(--sa-color-bg-sunken);
1328
1356
  overflow: auto;
1329
1357
  }
1330
1358
  .pve-preview-toggle {
@@ -1334,9 +1362,9 @@ function emitSave(): void {
1334
1362
  }
1335
1363
  .pve-prev-window {
1336
1364
  margin: 14px 18px;
1337
- background: #fff;
1365
+ background: var(--sa-color-bg-surface);
1338
1366
  border-radius: 10px;
1339
- border: 1px solid var(--sa-border);
1367
+ border: 1px solid var(--sa-color-border);
1340
1368
  overflow: hidden;
1341
1369
  transition: max-width 0.18s;
1342
1370
  }
@@ -1348,8 +1376,8 @@ function emitSave(): void {
1348
1376
  align-items: center;
1349
1377
  gap: 6px;
1350
1378
  padding: 8px 12px;
1351
- background: var(--sa-border-soft);
1352
- border-bottom: 1px solid var(--sa-border);
1379
+ background: var(--sa-color-border-soft);
1380
+ border-bottom: 1px solid var(--sa-color-border);
1353
1381
  }
1354
1382
  .pve-prev-dot {
1355
1383
  width: 9px;
@@ -1358,34 +1386,34 @@ function emitSave(): void {
1358
1386
  }
1359
1387
  .pve-prev-url {
1360
1388
  flex: 1;
1361
- background: #fff;
1389
+ background: var(--sa-color-bg-surface);
1362
1390
  border-radius: 4px;
1363
1391
  padding: 3px 10px;
1364
1392
  margin-left: 10px;
1365
- font: 500 11px var(--sa-font-mono);
1366
- color: var(--sa-muted);
1367
- border: 1px solid var(--sa-border);
1393
+ font: 500 var(--sa-text-xs) var(--sa-font-mono);
1394
+ color: var(--sa-color-fg-muted);
1395
+ border: 1px solid var(--sa-color-border);
1368
1396
  }
1369
1397
  .pve-prev-body {
1370
1398
  padding: 18px 18px 16px;
1371
1399
  }
1372
1400
  .pve-prev-eyebrow {
1373
- font-size: 10.5px;
1401
+ font-size: var(--sa-text-xs);
1374
1402
  text-transform: uppercase;
1375
1403
  letter-spacing: 0.12em;
1376
- color: var(--sa-muted);
1404
+ color: var(--sa-color-fg-muted);
1377
1405
  font-weight: 700;
1378
1406
  }
1379
1407
  .pve-prev-title {
1380
- font-size: 28px;
1408
+ font-size: var(--sa-text-3xl);
1381
1409
  font-weight: 700;
1382
1410
  letter-spacing: -0.03em;
1383
1411
  margin-top: 6px;
1384
- color: var(--sa-heading);
1412
+ color: var(--sa-color-fg-heading);
1385
1413
  }
1386
1414
  .pve-prev-desc {
1387
- font-size: 12.5px;
1388
- color: var(--sa-muted-dark);
1415
+ font-size: var(--sa-text-md);
1416
+ color: var(--sa-color-fg-secondary);
1389
1417
  margin-top: 6px;
1390
1418
  line-height: 1.5;
1391
1419
  }
@@ -1396,18 +1424,18 @@ function emitSave(): void {
1396
1424
  margin-top: 14px;
1397
1425
  }
1398
1426
  .pve-prev-price-big {
1399
- font-size: 38px;
1427
+ font-size: var(--sa-text-4xl);
1400
1428
  font-weight: 700;
1401
1429
  letter-spacing: -0.03em;
1402
- color: var(--sa-heading);
1430
+ color: var(--sa-color-fg-heading);
1403
1431
  }
1404
1432
  .pve-prev-price-unit {
1405
- font-size: 13px;
1406
- color: var(--sa-muted);
1433
+ font-size: var(--sa-text-md);
1434
+ color: var(--sa-color-fg-muted);
1407
1435
  }
1408
1436
  .pve-prev-price-yearly {
1409
- font-size: 11.5px;
1410
- color: #047857;
1437
+ font-size: var(--sa-text-sm);
1438
+ color: var(--sa-color-positive-fg);
1411
1439
  margin-top: 2px;
1412
1440
  font-weight: 500;
1413
1441
  }
@@ -1416,21 +1444,21 @@ function emitSave(): void {
1416
1444
  width: 100%;
1417
1445
  margin-top: 14px;
1418
1446
  padding: 10px;
1419
- background: var(--sa-heading);
1420
- color: #fff;
1447
+ background: var(--sa-color-inverse-bg);
1448
+ color: var(--sa-color-fg-on-accent);
1421
1449
  border: 0;
1422
1450
  border-radius: 7px;
1423
- font: 600 13px var(--sa-font-body);
1451
+ font: 600 var(--sa-text-md) var(--sa-font-body);
1424
1452
  cursor: pointer;
1425
1453
  }
1426
1454
  .pve-prev-sep {
1427
1455
  margin-top: 18px;
1428
1456
  padding-top: 14px;
1429
- border-top: 1px solid var(--sa-border-soft);
1430
- font-size: 10.5px;
1457
+ border-top: 1px solid var(--sa-color-border-soft);
1458
+ font-size: var(--sa-text-xs);
1431
1459
  text-transform: uppercase;
1432
1460
  letter-spacing: 0.12em;
1433
- color: var(--sa-muted-light);
1461
+ color: var(--sa-color-fg-subtle);
1434
1462
  font-weight: 700;
1435
1463
  }
1436
1464
  .pve-prev-list {
@@ -1445,8 +1473,8 @@ function emitSave(): void {
1445
1473
  display: flex;
1446
1474
  align-items: center;
1447
1475
  gap: 8px;
1448
- font-size: 12.5px;
1449
- color: var(--sa-heading);
1476
+ font-size: var(--sa-text-md);
1477
+ color: var(--sa-color-fg-heading);
1450
1478
  }
1451
1479
  .pve-prev-list li b {
1452
1480
  font-weight: 600;
@@ -1457,27 +1485,27 @@ function emitSave(): void {
1457
1485
  width: 16px;
1458
1486
  height: 16px;
1459
1487
  border-radius: 50%;
1460
- background: #d1fae5;
1461
- color: #047857;
1488
+ background: var(--sa-color-positive-surface-strong);
1489
+ color: var(--sa-color-positive-fg);
1462
1490
  flex: 0 0 auto;
1463
1491
  }
1464
1492
  .pve-prev-empty {
1465
- color: var(--sa-muted-light);
1493
+ color: var(--sa-color-fg-subtle);
1466
1494
  font-style: italic;
1467
1495
  }
1468
1496
  .pve-prev-foot {
1469
1497
  margin-top: 16px;
1470
1498
  padding-top: 14px;
1471
- border-top: 1px solid var(--sa-border-soft);
1472
- font-size: 10.5px;
1473
- color: var(--sa-muted-light);
1499
+ border-top: 1px solid var(--sa-color-border-soft);
1500
+ font-size: var(--sa-text-xs);
1501
+ color: var(--sa-color-fg-subtle);
1474
1502
  line-height: 1.5;
1475
1503
  }
1476
1504
 
1477
1505
  .pve-prev-validate {
1478
1506
  margin: 0 18px 18px;
1479
- background: #fff;
1480
- border: 1px solid var(--sa-border);
1507
+ background: var(--sa-color-bg-surface);
1508
+ border: 1px solid var(--sa-color-border);
1481
1509
  border-radius: 8px;
1482
1510
  padding: 12px;
1483
1511
  }
@@ -1488,86 +1516,101 @@ function emitSave(): void {
1488
1516
  margin-bottom: 6px;
1489
1517
  }
1490
1518
  .pve-prev-validate-tick {
1491
- color: var(--sa-positive-light);
1519
+ color: var(--sa-color-positive-strong);
1492
1520
  display: inline-flex;
1493
1521
  }
1494
1522
  .pve-prev-validate-title {
1495
- font-size: 12.5px;
1523
+ font-size: var(--sa-text-md);
1496
1524
  font-weight: 600;
1497
1525
  }
1498
1526
  .pve-prev-validate-count {
1499
1527
  margin-left: auto;
1500
- font-size: 11px;
1501
- color: var(--sa-muted);
1528
+ font-size: var(--sa-text-xs);
1529
+ color: var(--sa-color-fg-muted);
1502
1530
  }
1503
1531
  .pve-vchk {
1504
1532
  display: flex;
1505
1533
  align-items: center;
1506
1534
  gap: 6px;
1507
- font-size: 11.5px;
1535
+ font-size: var(--sa-text-sm);
1508
1536
  padding: 3px 0;
1509
1537
  }
1510
1538
  .pve-vchk--ok {
1511
- color: var(--sa-muted-dark);
1539
+ color: var(--sa-color-fg-secondary);
1512
1540
  }
1513
1541
  .pve-vchk--ok span:first-child {
1514
- color: var(--sa-positive-light);
1542
+ color: var(--sa-color-positive-strong);
1515
1543
  display: inline-flex;
1516
1544
  }
1517
1545
  .pve-vchk--warn {
1518
- color: #b45309;
1546
+ color: var(--sa-color-warning-fg);
1519
1547
  }
1520
1548
  .pve-vchk--warn span:first-child {
1521
- color: var(--sa-amber);
1549
+ color: var(--sa-color-warning-strong);
1522
1550
  display: inline-flex;
1523
1551
  }
1524
1552
 
1525
- /* ── Responsive ────────────────────────────────────────────────── */
1526
- @media (max-width: 1280px) {
1553
+ /* ── Responsive ────────────────────────────────────────────────────
1554
+ *
1555
+ * On the CONTAINER's width, not the viewport's, because the viewport is not
1556
+ * what this grid has to fit into. The admin drawer is 240px and collapsible, so
1557
+ * a viewport threshold is wrong in one of its two states by construction — and
1558
+ * with the drawer open at 1024–1100px the old viewport rule left 784–860px for
1559
+ * `320px 1fr 360px`, squeezing the middle column to 104–180px and clipping its
1560
+ * form controls behind `overflow: hidden`.
1561
+ *
1562
+ * The thresholds are the widths the columns actually need:
1563
+ * 1060px → 320 + 360 fixed leaves ≥ 380px for the basket
1564
+ * 780px → below this the three-column form is not usable at all
1565
+ *
1566
+ * These are container queries, so they are not viewport breakpoints and the
1567
+ * Quasar-band rule does not reach them; `@container` needs no newer browser
1568
+ * than the theme already requires. */
1569
+ @container pve (max-width: 1060px) {
1527
1570
  .pve-body {
1528
1571
  grid-template-columns: 320px 1fr 360px;
1529
1572
  }
1530
1573
  }
1531
- @media (max-width: 1100px) {
1574
+ @container pve (max-width: 780px) {
1532
1575
  .pve-body {
1533
1576
  grid-template-columns: 1fr;
1534
1577
  overflow-y: auto;
1535
1578
  }
1536
1579
  .pve-col {
1537
1580
  border-right: 0;
1538
- border-bottom: 1px solid var(--sa-border);
1581
+ border-bottom: 1px solid var(--sa-color-border);
1539
1582
  }
1540
1583
  }
1541
1584
 
1542
1585
  /* ── Diff dialog ────────────────────────────────────────────────── */
1543
1586
  .pve-diff-modal {
1544
- background: #fff;
1587
+ background: var(--sa-color-bg-surface);
1545
1588
  width: 560px;
1546
1589
  max-width: 92vw;
1547
1590
  border-radius: 14px;
1548
- box-shadow: 0 24px 60px rgba(15, 23, 42, 0.3);
1591
+ box-shadow: 0 24px 60px var(--sa-shadow-tint-4);
1549
1592
  overflow: hidden;
1550
1593
  font-family: var(--sa-font-body);
1551
- color: var(--sa-heading);
1594
+ color: var(--sa-color-fg-heading);
1552
1595
  }
1553
1596
  .pve-diff-modal * {
1554
1597
  box-sizing: border-box;
1555
1598
  }
1556
1599
  .pve-diff-head {
1557
1600
  padding: 16px 20px;
1558
- border-bottom: 1px solid var(--sa-border);
1601
+ border-bottom: 1px solid var(--sa-color-border);
1559
1602
  display: flex;
1560
1603
  align-items: flex-start;
1561
1604
  gap: 12px;
1562
1605
  }
1563
1606
  .pve-diff-title {
1564
- font-size: 15px;
1607
+ font-size: var(--sa-text-lg);
1565
1608
  font-weight: 700;
1566
1609
  letter-spacing: -0.01em;
1567
1610
  }
1568
1611
  .pve-diff-sub {
1569
- font-size: 11.5px;
1570
- color: var(--sa-muted);
1612
+ font-size: var(--sa-text-sm);
1613
+ color: var(--sa-color-fg-muted);
1571
1614
  margin-top: 3px;
1572
1615
  }
1573
1616
  .pve-diff-close {
@@ -1577,15 +1620,15 @@ function emitSave(): void {
1577
1620
  border-radius: 6px;
1578
1621
  background: transparent;
1579
1622
  border: 0;
1580
- color: var(--sa-muted-light);
1623
+ color: var(--sa-color-fg-subtle);
1581
1624
  cursor: pointer;
1582
1625
  display: grid;
1583
1626
  place-items: center;
1584
1627
  flex: 0 0 auto;
1585
1628
  }
1586
1629
  .pve-diff-close:hover {
1587
- background: rgba(15, 23, 42, 0.05);
1588
- color: var(--sa-heading);
1630
+ background: var(--sa-color-bg-sunken);
1631
+ color: var(--sa-color-fg-heading);
1589
1632
  }
1590
1633
  .pve-diff-body {
1591
1634
  padding: 14px 20px 18px;
@@ -1607,9 +1650,9 @@ function emitSave(): void {
1607
1650
  width: 20px;
1608
1651
  height: 20px;
1609
1652
  border-radius: 5px;
1610
- color: #fff;
1653
+ color: var(--sa-color-fg-on-accent);
1611
1654
  font-weight: 800;
1612
- font-size: 13px;
1655
+ font-size: var(--sa-text-md);
1613
1656
  display: grid;
1614
1657
  place-items: center;
1615
1658
  flex: 0 0 auto;
@@ -1625,43 +1668,43 @@ function emitSave(): void {
1625
1668
  flex-wrap: wrap;
1626
1669
  }
1627
1670
  .pve-diff-section {
1628
- font-size: 10.5px;
1671
+ font-size: var(--sa-text-xs);
1629
1672
  text-transform: uppercase;
1630
1673
  letter-spacing: 0.08em;
1631
1674
  font-weight: 700;
1632
1675
  }
1633
1676
  .pve-diff-label {
1634
- font-size: 13px;
1677
+ font-size: var(--sa-text-md);
1635
1678
  font-weight: 600;
1636
- color: var(--sa-heading);
1679
+ color: var(--sa-color-fg-heading);
1637
1680
  }
1638
1681
  .pve-diff-change {
1639
1682
  display: flex;
1640
1683
  align-items: center;
1641
1684
  gap: 8px;
1642
1685
  margin-top: 3px;
1643
- font-size: 12px;
1686
+ font-size: var(--sa-text-sm);
1644
1687
  }
1645
1688
  .pve-diff-from {
1646
1689
  text-decoration: line-through;
1647
- color: var(--sa-muted-light);
1690
+ color: var(--sa-color-fg-subtle);
1648
1691
  }
1649
1692
  .pve-diff-to {
1650
- color: var(--sa-heading);
1693
+ color: var(--sa-color-fg-heading);
1651
1694
  font-weight: 600;
1652
1695
  }
1653
1696
  .pve-diff-arrow {
1654
1697
  font-weight: 700;
1655
1698
  }
1656
1699
  .pve-diff-tag {
1657
- font-size: 10px;
1658
- background: #fff;
1700
+ font-size: var(--sa-text-2xs);
1701
+ background: var(--sa-color-bg-surface);
1659
1702
  }
1660
1703
  .pve-diff-empty {
1661
1704
  padding: 24px 8px;
1662
1705
  text-align: center;
1663
- color: var(--sa-muted-light);
1706
+ color: var(--sa-color-fg-subtle);
1664
1707
  font-style: italic;
1665
- font-size: 13px;
1708
+ font-size: var(--sa-text-md);
1666
1709
  }
1667
1710
  </style>