@saasicat/ui-vue 0.19.0 → 0.22.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 (145) hide show
  1. package/dist/{catalog-JXdKdIqG.d.cts → catalog-DJcfm5N2.d.cts} +21 -7
  2. package/dist/{catalog-JXdKdIqG.d.ts → catalog-DJcfm5N2.d.ts} +21 -7
  3. package/dist/{chunk-DPTIOQXX.js → chunk-F7NRM6KI.js} +56 -28
  4. package/dist/{chunk-RVG6LQHL.js → chunk-LY52T4N4.js} +21 -2
  5. package/dist/{chunk-ORX3ZG47.js → chunk-XMMFN2WJ.js} +74 -3
  6. package/dist/client/index.cjs +134 -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 +321 -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 +78 -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-BlqcD0N7.d.ts → use-super-admin-i18n-CHNdsSlm.d.ts} +34 -7
  21. package/dist/{use-super-admin-i18n-1nCOkvgi.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 +24 -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/AdminBody.vue +40 -0
  40. package/src/components/admin-page/AdminFilters.vue +12 -0
  41. package/src/components/admin-page/AdminHero.vue +49 -0
  42. package/src/components/admin-page/AdminKpi.vue +84 -0
  43. package/src/components/admin-page/AdminPage.vue +16 -0
  44. package/src/components/admin-page/AdminPaginator.vue +195 -0
  45. package/src/components/admin-page/AdminRefreshBtn.vue +39 -0
  46. package/src/components/admin-page/AdminSection.vue +53 -0
  47. package/src/components/admin-page/AdminStatistics.vue +40 -0
  48. package/src/components/admin-page/AdminTable.vue +175 -0
  49. package/src/components/bundle-editor/BundleCreatePanel.vue +23 -23
  50. package/src/components/bundle-editor/BundleFeaturesEditor.vue +7 -7
  51. package/src/components/bundle-editor/BundlePlanCompatPicker.vue +9 -9
  52. package/src/components/bundle-editor/BundleQuotasEditor.vue +11 -11
  53. package/src/components/bundle-editor/BundleStatusBanner.vue +6 -6
  54. package/src/components/bundle-editor/BundleVersionInlineEditor.vue +18 -18
  55. package/src/components/bundle-editor/BundleVersionStrip.vue +12 -12
  56. package/src/components/dialogs/PilotCreateDialog.vue +12 -12
  57. package/src/components/dialogs/PilotEditDialog.vue +7 -7
  58. package/src/components/dialogs/PromoCodeCreateDialog.vue +8 -8
  59. package/src/components/dialogs/PromoCodeDialogFields.vue +33 -19
  60. package/src/components/dialogs/PromoCodeEditDialog.vue +10 -10
  61. package/src/components/plan/PlanGrid.vue +1 -1
  62. package/src/components/plan-create-dialog/PlanCreateDialog.vue +34 -46
  63. package/src/components/plan-detail/PlanAuditLog.vue +7 -8
  64. package/src/components/plan-detail/PlanDetail.vue +95 -292
  65. package/src/components/plan-detail/PlanDetailKpis.vue +22 -27
  66. package/src/components/plan-detail/PlanTitleEdit.vue +133 -0
  67. package/src/components/plan-detail/PlanVersionDiffPanel.vue +5 -8
  68. package/src/components/plan-detail/PlanVersionsPanel.vue +9 -11
  69. package/src/components/plan-list/PlanList.vue +206 -457
  70. package/src/components/plan-matrix/PlanMatrix.vue +66 -183
  71. package/src/components/plan-review/PlanReview.vue +191 -275
  72. package/src/components/plan-version-editor/PlanCatalogPreview.vue +7 -5
  73. package/src/components/plan-version-editor/PlanVersionEditor.vue +200 -295
  74. package/src/components/plan-version-editor/PlanVersionEditorHeader.vue +23 -55
  75. package/src/index.ts +1 -0
  76. package/src/pages-standard/AdminLayout.vue +38 -12
  77. package/src/pages-standard/AdminManifestErrorPage.vue +79 -9
  78. package/src/pages-standard/AuditPage.vue +65 -109
  79. package/src/pages-standard/BundlesPage.vue +146 -179
  80. package/src/pages-standard/DashboardPage.vue +59 -154
  81. package/src/pages-standard/DiscoveryPage.vue +172 -227
  82. package/src/pages-standard/EmailHistoryPage.vue +118 -159
  83. package/src/pages-standard/MarketingCatalogPage.vue +399 -440
  84. package/src/pages-standard/PilotsPage.vue +69 -117
  85. package/src/pages-standard/PlansPage.vue +240 -112
  86. package/src/pages-standard/PlatformEmailPage.vue +56 -91
  87. package/src/pages-standard/PromoCodeDetailPage.vue +49 -74
  88. package/src/pages-standard/PromoCodesPage.vue +95 -128
  89. package/src/pages-standard/SubscriptionsPage.vue +19 -52
  90. package/src/pages-standard/SuperAdminLoginPage.vue +12 -12
  91. package/src/pages-standard/SuperAdminSetupWizard.vue +22 -18
  92. package/src/pages-standard/TenantDetailPage.vue +100 -191
  93. package/src/pages-standard/TenantsPage.vue +190 -295
  94. package/src/pages-standard/UsersPage.vue +89 -157
  95. package/src/pages-standard/bundles-page/BundleAccordionList.vue +20 -17
  96. package/src/pages-standard/bundles-page/BundlesKpis.vue +13 -22
  97. package/src/pages-standard/bundles-page/BundlesToolbar.vue +63 -0
  98. package/src/pages-standard/discovery-page/CatalogEntryTransPanel.vue +10 -10
  99. package/src/pages-standard/discovery-page/DiscoveryCapList.vue +5 -5
  100. package/src/pages-standard/discovery-page/DiscoveryFeatureCard.vue +16 -16
  101. package/src/pages-standard/discovery-page/DiscoveryKpis.vue +31 -27
  102. package/src/pages-standard/discovery-page/DiscoveryQuotaCard.vue +7 -7
  103. package/src/pages-standard/marketing-catalog/MarketingCatalogAdmin.vue +111 -73
  104. package/src/pages-standard/marketing-catalog/MarketingCatalogHeader.vue +43 -62
  105. package/src/pages-standard/marketing-catalog/MarketingCatalogPreview.vue +53 -35
  106. package/src/pages-standard/marketing-catalog/MarketingCatalogToolbar.vue +7 -7
  107. package/src/pages-standard/plan-versions/PlanDiffCard.vue +6 -6
  108. package/src/pages-standard/plan-versions/PlanVersionsDiff.vue +6 -6
  109. package/src/pages-standard/plan-versions/PlanVersionsTimeline.vue +16 -16
  110. package/src/pages-standard/plans-page/PlanBundleOverview.vue +14 -29
  111. package/src/pages-standard/plans-page/PlanPublishDialog.vue +1 -1
  112. package/src/pages-standard/plans-page/PlansPageToast.vue +6 -6
  113. package/src/pages-standard/sa-theme.css +552 -86
  114. package/src/pages-standard/tenant-detail/TenantMasterData.vue +28 -0
  115. package/src/pages-standard/tenant-detail/TenantUsage.vue +31 -0
  116. package/src/pages-standard/tenant-detail/TenantUsers.vue +15 -0
  117. package/src/pages-standard/tenant-detail/types.ts +38 -0
  118. package/src/pages-standard/tenants/StatusPill.vue +2 -2
  119. package/src/pages-tenant/MySubscriptionBundlesPage.vue +25 -25
  120. package/src/pages-tenant/OnboardingConfigurator.vue +1 -5
  121. package/src/pages-tenant/PackageSnapshotPanel.vue +1 -1
  122. package/src/pages-tenant/TenantPlanSection.vue +12 -20
  123. package/src/quasar/create-super-admin-app.ts +4 -0
  124. package/src/vue/entitlement-provider.ts +0 -1
  125. package/src/vue/feature-router-guard.ts +0 -1
  126. package/src/vue/super-admin-context.ts +106 -1
  127. package/src/vue/use-api-list.ts +2 -1
  128. package/src/vue/use-mfa-prompt.ts +72 -0
  129. package/src/vue/use-pagination.ts +63 -0
  130. package/src/vue/use-plans.ts +1 -2
  131. package/src/vue/use-sign-out.ts +90 -0
  132. package/src/vue/use-tenant-billing.ts +1 -1
  133. package/src/vue/use-tenant-manifest.ts +0 -1
  134. package/src/components/KpiCard.vue +0 -53
  135. package/src/components/plan-cockpit/PlanCockpit.vue +0 -1012
  136. package/src/components/plan-cockpit/PlanCockpitAuditLog.vue +0 -72
  137. package/src/components/plan-cockpit/PlanCockpitDiffPanel.vue +0 -100
  138. package/src/components/plan-cockpit/PlanCockpitHeader.vue +0 -101
  139. package/src/components/plan-cockpit/PlanCockpitImpactPanel.vue +0 -112
  140. package/src/components/plan-cockpit/PlanCockpitKpis.vue +0 -68
  141. package/src/components/plan-cockpit/PlanCockpitVersions.vue +0 -251
  142. package/src/components/plan-cockpit/types.ts +0 -72
  143. package/src/components/plan-detail/PlanDetailHeader.vue +0 -194
  144. package/src/pages-standard/bundles-page/BundlesHeader.vue +0 -68
  145. package/src/pages-standard/discovery-page/DiscoveryHeader.vue +0 -34
@@ -1,41 +1,11 @@
1
1
  <template>
2
2
  <div class="pm">
3
- <!-- Page header -->
4
- <div class="pm-page-head">
5
- <div>
6
- <h2 class="pm-h-title">{{ msg.matrix.title }}</h2>
7
- <p class="pm-h-sub">{{ summary }}</p>
8
- </div>
9
- <div class="pm-head-actions">
10
- <button class="pm-btn" type="button" @click="$emit('viewCatalog')">
11
- <svg
12
- width="14"
13
- height="14"
14
- viewBox="0 0 24 24"
15
- fill="none"
16
- stroke="currentColor"
17
- stroke-width="2"
18
- >
19
- <path d="M1 12s4-8 11-8 11 8 11 8-4 8-11 8-11-8-11-8z" />
20
- <circle cx="12" cy="12" r="3" />
21
- </svg>
22
- <span>{{ msg.matrix.catalogPreview }}</span>
23
- </button>
24
- <button class="pm-btn pm-btn--primary" type="button" @click="$emit('createPlan')">
25
- <svg
26
- width="14"
27
- height="14"
28
- viewBox="0 0 24 24"
29
- fill="none"
30
- stroke="currentColor"
31
- stroke-width="2.5"
32
- >
33
- <path d="M12 5v14M5 12h14" />
34
- </svg>
35
- <span>{{ msg.matrix.createPlan }}</span>
36
- </button>
37
- </div>
38
- </div>
3
+ <AdminStatistics :columns="4">
4
+ <AdminKpi :label="msg.matrix.statPlans" :value="plans.length" />
5
+ <AdminKpi :label="msg.matrix.statFeatures" :value="orderedFeatureKeys.length" />
6
+ <AdminKpi :label="msg.matrix.statQuotas" :value="orderedQuotaKeys.length" />
7
+ <AdminKpi :label="msg.matrix.statBundles" :value="orderedBundleKeys.length" />
8
+ </AdminStatistics>
39
9
 
40
10
  <!-- Matrix -->
41
11
  <div class="pm-card pm-wrap">
@@ -65,7 +35,7 @@
65
35
  ⋯
66
36
  </button>
67
37
  </div>
68
- <div class="pm-plan-desc">{{ p.description || ' ' }}</div>
38
+ <div class="pm-plan-desc">{{ p.description || NBSP }}</div>
69
39
  <div class="pm-plan-divider" />
70
40
 
71
41
  <div class="pm-status-row">
@@ -150,7 +120,7 @@
150
120
 
151
121
  <div class="pm-plan-actions">
152
122
  <button
153
- class="pm-btn pm-btn--sm pm-btn--flex"
123
+ class="sa-btn sa-btn--sm sa-btn--flex"
154
124
  type="button"
155
125
  @click="$emit('openPlan', p.plan)"
156
126
  >
@@ -169,10 +139,10 @@
169
139
  <span>{{ common.open }}</span>
170
140
  </button>
171
141
  <button
172
- class="pm-btn pm-btn--sm pm-btn--ghost"
142
+ class="sa-btn sa-btn--sm sa-btn--ghost"
173
143
  type="button"
174
- @click="$emit('clonePlan', p.plan)"
175
144
  :aria-label="msg.matrix.clonePlan"
145
+ @click="$emit('clonePlan', p.plan)"
176
146
  >
177
147
  <svg
178
148
  width="12"
@@ -403,7 +373,16 @@
403
373
  </template>
404
374
 
405
375
  <script setup lang="ts">
376
+ import AdminKpi from '../admin-page/AdminKpi.vue';
377
+ import AdminStatistics from '../admin-page/AdminStatistics.vue';
406
378
  import { computed } from 'vue';
379
+
380
+ /**
381
+ * Placeholder for an empty plan description. A non-breaking space keeps the
382
+ * row height stable across the matrix columns; written as an escape because a
383
+ * literal U+00A0 is invisible in a diff.
384
+ */
385
+ const NBSP = '\u00A0';
407
386
  import type { PlanRow, PlanVersionRow } from '@saasicat/types';
408
387
  import { formatMessage } from '../../client/i18n/format.js';
409
388
  import { formatCurrency } from '../../client/i18n/currency.js';
@@ -464,9 +443,8 @@ const props = withDefaults(
464
443
 
465
444
  defineEmits<{
466
445
  (e: 'openPlan', plan: PlanRow): void;
467
- (e: 'createPlan'): void;
468
446
  (e: 'clonePlan', plan: PlanRow): void;
469
- (e: 'viewCatalog'): void;
447
+ (e: 'createPlan'): void;
470
448
  }>();
471
449
 
472
450
  interface ResolvedPlan {
@@ -632,15 +610,6 @@ const orderedFeatureKeys = computed<string[]>(() => {
632
610
 
633
611
  const orderedBundleKeys = computed<string[]>(() => props.availableBundles.map((b) => b.bundleKey));
634
612
 
635
- const summary = computed(() =>
636
- formatMessage(msg.value.matrix.summary, {
637
- plans: props.plans.length,
638
- features: orderedFeatureKeys.value.length,
639
- quotas: orderedQuotaKeys.value.length,
640
- bundles: orderedBundleKeys.value.length,
641
- }),
642
- );
643
-
644
613
  function quotaLabel(key: string): string {
645
614
  return props.availableQuotas.find((q) => q.quotaKey === key)?.label || key;
646
615
  }
@@ -687,103 +656,17 @@ function formatQuota(v: number | undefined): string {
687
656
 
688
657
  <style scoped>
689
658
  .pm {
690
- --pm-bg: #f6f7f9;
691
- --pm-surface: #ffffff;
692
- --pm-surface-2: #f8fafc;
693
- --pm-border: #e5e7eb;
694
- --pm-border-strong: #d1d5db;
695
- --pm-text: #0f172a;
696
- --pm-text-2: #475569;
697
- --pm-text-3: #94a3b8;
698
- --pm-primary: #2563eb;
699
- --pm-live: #10b981;
700
- --pm-live-bg: #ecfdf5;
701
- --pm-draft: #f59e0b;
702
- --pm-draft-bg: #fffbeb;
703
- --pm-supersed: #94a3b8;
704
- --pm-supersed-bg: #f1f5f9;
705
- --pm-font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
706
- --pm-font-mono: 'JetBrains Mono', ui-monospace, 'SF Mono', Menlo, monospace;
707
-
708
659
  padding: 22px 26px;
709
- background: var(--pm-bg);
710
- color: var(--pm-text);
711
- font-family: var(--pm-font-sans);
660
+ background: var(--sa-bg-app);
661
+ color: var(--sa-heading);
662
+ font-family: var(--sa-font-body);
712
663
  min-height: 100%;
713
664
  box-sizing: border-box;
714
665
  }
715
- .pm * {
716
- box-sizing: border-box;
717
- }
718
-
719
- .pm-page-head {
720
- display: flex;
721
- align-items: flex-end;
722
- gap: 20px;
723
- margin-bottom: 18px;
724
- }
725
- .pm-h-title {
726
- font-size: 22px;
727
- font-weight: 700;
728
- letter-spacing: -0.02em;
729
- margin: 0;
730
- }
731
- .pm-h-sub {
732
- font-size: 12.5px;
733
- color: var(--pm-text-2);
734
- margin: 3px 0 0;
735
- }
736
- .pm-head-actions {
737
- margin-left: auto;
738
- display: flex;
739
- gap: 8px;
740
- }
741
-
742
- .pm-btn {
743
- display: inline-flex;
744
- align-items: center;
745
- gap: 7px;
746
- padding: 8px 14px;
747
- border-radius: 7px;
748
- font: 500 13px var(--pm-font-sans);
749
- cursor: pointer;
750
- border: 1px solid var(--pm-border-strong);
751
- background: #fff;
752
- color: var(--pm-text);
753
- transition:
754
- background 0.12s,
755
- border-color 0.12s;
756
- }
757
- .pm-btn:hover {
758
- background: var(--pm-surface-2);
759
- }
760
- .pm-btn--primary {
761
- background: var(--pm-primary);
762
- border-color: var(--pm-primary);
763
- color: #fff;
764
- }
765
- .pm-btn--primary:hover {
766
- background: #1d4ed8;
767
- }
768
- .pm-btn--ghost {
769
- border-color: transparent;
770
- background: transparent;
771
- }
772
- .pm-btn--ghost:hover {
773
- background: rgba(15, 23, 42, 0.05);
774
- }
775
- .pm-btn--sm {
776
- padding: 5px 9px;
777
- font-size: 12px;
778
- gap: 5px;
779
- }
780
- .pm-btn--flex {
781
- flex: 1;
782
- }
783
666
 
784
667
  .pm-card {
785
- background: var(--pm-surface);
786
- border: 1px solid var(--pm-border);
668
+ background: var(--sa-bg-surface);
669
+ border: 1px solid var(--sa-border);
787
670
  border-radius: 10px;
788
671
  }
789
672
  .pm-wrap {
@@ -798,7 +681,7 @@ function formatQuota(v: number | undefined): string {
798
681
  }
799
682
  .pm-head th {
800
683
  background: #fbfbfd;
801
- border-bottom: 1px solid var(--pm-border);
684
+ border-bottom: 1px solid var(--sa-border);
802
685
  }
803
686
  .pm-rowhead-cell {
804
687
  text-align: left;
@@ -811,7 +694,7 @@ function formatQuota(v: number | undefined): string {
811
694
  font-size: 11px;
812
695
  text-transform: uppercase;
813
696
  letter-spacing: 0.1em;
814
- color: var(--pm-text-3);
697
+ color: var(--sa-muted-light);
815
698
  font-weight: 700;
816
699
  }
817
700
 
@@ -822,7 +705,7 @@ function formatQuota(v: number | undefined): string {
822
705
  }
823
706
  .pm-plan-card {
824
707
  background: #fff;
825
- border: 1px solid var(--pm-border);
708
+ border: 1px solid var(--sa-border);
826
709
  border-top: 3px solid;
827
710
  border-radius: 10px;
828
711
  padding: 14px 14px 12px;
@@ -835,32 +718,32 @@ function formatQuota(v: number | undefined): string {
835
718
  align-items: flex-start;
836
719
  }
837
720
  .pm-plan-key {
838
- font: 700 11px var(--pm-font-mono);
721
+ font: 700 11px var(--sa-font-mono);
839
722
  letter-spacing: 0.08em;
840
- color: var(--pm-text-2);
723
+ color: var(--sa-muted-dark);
841
724
  }
842
725
  .pm-plan-label {
843
726
  font-size: 17px;
844
727
  font-weight: 700;
845
728
  letter-spacing: -0.02em;
846
- color: var(--pm-text);
729
+ color: var(--sa-heading);
847
730
  }
848
731
  .pm-plan-desc {
849
732
  font-size: 11.5px;
850
- color: #64748b;
733
+ color: var(--sa-muted);
851
734
  margin-top: 4px;
852
735
  line-height: 1.4;
853
736
  min-height: 32px;
854
737
  }
855
738
  .pm-plan-divider {
856
739
  height: 1px;
857
- background: var(--pm-border);
740
+ background: var(--sa-border);
858
741
  margin: 10px 0;
859
742
  }
860
743
  .pm-kebab {
861
744
  background: none;
862
745
  border: 0;
863
- color: var(--pm-text-3);
746
+ color: var(--sa-muted-light);
864
747
  cursor: pointer;
865
748
  font-size: 16px;
866
749
  padding: 0;
@@ -886,17 +769,17 @@ function formatQuota(v: number | undefined): string {
886
769
  }
887
770
  .pm-price-unit {
888
771
  font-size: 11px;
889
- color: #64748b;
772
+ color: var(--sa-muted);
890
773
  }
891
774
  .pm-price-yearly {
892
775
  font-size: 10px;
893
- color: var(--pm-text-3);
776
+ color: var(--sa-muted-light);
894
777
  margin-left: 4px;
895
778
  }
896
779
  .pm-price-free {
897
780
  font-size: 14px;
898
781
  font-weight: 600;
899
- color: var(--pm-text);
782
+ color: var(--sa-heading);
900
783
  }
901
784
  .pm-plan-meta {
902
785
  display: flex;
@@ -904,7 +787,7 @@ function formatQuota(v: number | undefined): string {
904
787
  flex-wrap: wrap;
905
788
  align-items: center;
906
789
  font-size: 11px;
907
- color: #64748b;
790
+ color: var(--sa-muted);
908
791
  margin-top: 8px;
909
792
  }
910
793
  .pm-plan-actions {
@@ -912,7 +795,7 @@ function formatQuota(v: number | undefined): string {
912
795
  gap: 6px;
913
796
  margin-top: 10px;
914
797
  padding-top: 10px;
915
- border-top: 1px solid #f1f5f9;
798
+ border-top: 1px solid var(--sa-border-soft);
916
799
  }
917
800
 
918
801
  .pm-add-col {
@@ -944,18 +827,18 @@ function formatQuota(v: number | undefined): string {
944
827
  width: 30px;
945
828
  height: 30px;
946
829
  border-radius: 50%;
947
- background: #eff6ff;
948
- color: var(--pm-primary);
830
+ background: var(--sa-primary-50);
831
+ color: var(--sa-primary);
949
832
  margin: 0 auto 6px;
950
833
  }
951
834
  .pm-add-title {
952
835
  font-size: 12px;
953
836
  font-weight: 600;
954
- color: var(--pm-primary);
837
+ color: var(--sa-primary);
955
838
  }
956
839
  .pm-add-sub {
957
840
  font-size: 10.5px;
958
- color: var(--pm-text-3);
841
+ color: var(--sa-muted-light);
959
842
  margin-top: 3px;
960
843
  }
961
844
 
@@ -968,27 +851,27 @@ function formatQuota(v: number | undefined): string {
968
851
  border-radius: 999px;
969
852
  font-size: 11px;
970
853
  font-weight: 600;
971
- background: var(--pm-surface-2);
972
- color: var(--pm-text-2);
973
- border: 1px solid var(--pm-border);
854
+ background: var(--sa-bg-surface-2);
855
+ color: var(--sa-muted-dark);
856
+ border: 1px solid var(--sa-border);
974
857
  }
975
858
  .pm-chip--tiny {
976
859
  padding: 1px 6px;
977
860
  font-size: 10px;
978
861
  }
979
862
  .pm-chip--live {
980
- background: var(--pm-live-bg);
863
+ background: var(--sa-positive-bg);
981
864
  color: #047857;
982
865
  border-color: #a7f3d0;
983
866
  }
984
867
  .pm-chip--draft {
985
- background: var(--pm-draft-bg);
868
+ background: var(--sa-warning-bg);
986
869
  color: #b45309;
987
870
  border-color: #fde68a;
988
871
  }
989
872
  .pm-chip--supersed {
990
- background: var(--pm-supersed-bg);
991
- color: var(--pm-text-2);
873
+ background: var(--sa-border-soft);
874
+ color: var(--sa-muted-dark);
992
875
  border-color: #cbd5e1;
993
876
  }
994
877
  .pm-chip--dot::before {
@@ -1001,9 +884,9 @@ function formatQuota(v: number | undefined): string {
1001
884
 
1002
885
  /* Group rows */
1003
886
  .pm-group td {
1004
- background: var(--pm-surface-2);
1005
- border-top: 1px solid var(--pm-border);
1006
- border-bottom: 1px solid var(--pm-border);
887
+ background: var(--sa-bg-surface-2);
888
+ border-top: 1px solid var(--sa-border);
889
+ border-bottom: 1px solid var(--sa-border);
1007
890
  }
1008
891
  .pm-group-inner {
1009
892
  display: flex;
@@ -1014,7 +897,7 @@ function formatQuota(v: number | undefined): string {
1014
897
  font-weight: 700;
1015
898
  letter-spacing: 0.08em;
1016
899
  text-transform: uppercase;
1017
- color: var(--pm-text-2);
900
+ color: var(--sa-muted-dark);
1018
901
  }
1019
902
  .pm-group-dot {
1020
903
  width: 7px;
@@ -1031,8 +914,8 @@ function formatQuota(v: number | undefined): string {
1031
914
  background: #f59e0b;
1032
915
  }
1033
916
  .pm-group-count {
1034
- background: #e2e8f0;
1035
- color: var(--pm-text-2);
917
+ background: var(--sa-border);
918
+ color: var(--sa-muted-dark);
1036
919
  padding: 1px 7px;
1037
920
  border-radius: 999px;
1038
921
  font-size: 10px;
@@ -1040,7 +923,7 @@ function formatQuota(v: number | undefined): string {
1040
923
 
1041
924
  /* Data rows */
1042
925
  .pm-row td {
1043
- border-bottom: 1px solid #f1f5f9;
926
+ border-bottom: 1px solid var(--sa-border-soft);
1044
927
  height: 44px;
1045
928
  }
1046
929
  .pm-row:hover td {
@@ -1057,11 +940,11 @@ function formatQuota(v: number | undefined): string {
1057
940
  .pm-rh-label {
1058
941
  font-size: 13px;
1059
942
  font-weight: 500;
1060
- color: var(--pm-text);
943
+ color: var(--sa-heading);
1061
944
  }
1062
945
  .pm-rh-key {
1063
- font: 500 10px var(--pm-font-mono);
1064
- color: var(--pm-text-3);
946
+ font: 500 10px var(--sa-font-mono);
947
+ color: var(--sa-muted-light);
1065
948
  }
1066
949
  .pm-cell {
1067
950
  text-align: center;
@@ -1079,7 +962,7 @@ function formatQuota(v: number | undefined): string {
1079
962
  }
1080
963
  .pm-cell--base {
1081
964
  text-align: center;
1082
- background: var(--pm-surface-2);
965
+ background: var(--sa-bg-surface-2);
1083
966
  }
1084
967
  .pm-base-badge {
1085
968
  display: inline-flex;
@@ -1106,12 +989,12 @@ function formatQuota(v: number | undefined): string {
1106
989
  font-weight: 500;
1107
990
  }
1108
991
  .pm-num {
1109
- font: 600 14px var(--pm-font-sans);
1110
- color: var(--pm-text);
992
+ font: 600 14px var(--sa-font-body);
993
+ color: var(--sa-heading);
1111
994
  }
1112
995
  .pm-unit {
1113
996
  font-size: 10.5px;
1114
- color: var(--pm-text-3);
997
+ color: var(--sa-muted-light);
1115
998
  margin-left: 3px;
1116
999
  }
1117
1000
  .pm-quota {
@@ -1126,7 +1009,7 @@ function formatQuota(v: number | undefined): string {
1126
1009
  gap: 18px;
1127
1010
  margin-top: 14px;
1128
1011
  font-size: 12px;
1129
- color: var(--pm-text-2);
1012
+ color: var(--sa-muted-dark);
1130
1013
  align-items: center;
1131
1014
  }
1132
1015
  .pm-legend-item {
@@ -1155,6 +1038,6 @@ function formatQuota(v: number | undefined): string {
1155
1038
  .pm-legend-loading {
1156
1039
  margin-left: auto;
1157
1040
  font-style: italic;
1158
- color: var(--pm-text-3);
1041
+ color: var(--sa-muted-light);
1159
1042
  }
1160
1043
  </style>