@saasicat/ui-vue 0.21.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 (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
@@ -1,25 +1,14 @@
1
1
  <template>
2
- <div class="pd">
3
- <PlanDetailHeader
4
- :plan="plan"
5
- :draft-version="draftVersion"
6
- :tenant-total="tenantTotal"
7
- :published-count="publishedCount"
8
- @back="$emit('back')"
9
- @delete-plan="$emit('deletePlan')"
10
- @clone-plan="$emit('clonePlan')"
11
- @create-draft="$emit('createDraft')"
12
- @publish="$emit('publish', $event)"
13
- @update-plan="$emit('updatePlan', $event)"
14
- />
15
-
16
- <PlanDetailKpis
17
- :live-version="liveVersion"
18
- :draft-version="draftVersion"
19
- :tenant-total="tenantTotal"
20
- :version-count="versions.length"
21
- :published-count="publishedCount"
22
- />
2
+ <div>
3
+ <AdminSection class="q-mb-md">
4
+ <PlanDetailKpis
5
+ :live-version="liveVersion"
6
+ :draft-version="draftVersion"
7
+ :tenant-total="tenantTotal"
8
+ :version-count="versions.length"
9
+ :published-count="publishedCount"
10
+ />
11
+ </AdminSection>
23
12
 
24
13
  <div class="pd-body">
25
14
  <PlanVersionsPanel
@@ -81,7 +70,7 @@ import { isVersionEditable, type PlanRow, type PlanVersionRow } from '@saasicat/
81
70
  import { formatCurrency } from '../../client/i18n/currency.js';
82
71
  import { useSaMessages, useSuperAdminI18n } from '../../vue/use-super-admin-i18n.js';
83
72
  import PlanAuditLog from './PlanAuditLog.vue';
84
- import PlanDetailHeader from './PlanDetailHeader.vue';
73
+ import AdminSection from '../admin-page/AdminSection.vue';
85
74
  import PlanDetailKpis from './PlanDetailKpis.vue';
86
75
  import PlanTerminateDialog from './PlanTerminateDialog.vue';
87
76
  import PlanVersionDiffPanel from './PlanVersionDiffPanel.vue';
@@ -131,13 +120,9 @@ const props = withDefaults(
131
120
  );
132
121
 
133
122
  const emit = defineEmits<{
134
- (e: 'back'): void;
135
123
  (e: 'createDraft'): void;
136
124
  (e: 'editDraft', version: PlanVersionRow): void;
137
125
  (e: 'publish', version: PlanVersionRow): void;
138
- (e: 'clonePlan'): void;
139
- (e: 'deletePlan'): void;
140
- (e: 'updatePlan', patch: { label: string }): void;
141
126
  (e: 'terminate', versionId: string, endsAt: string): void;
142
127
  }>();
143
128
 
@@ -155,7 +140,6 @@ function statusOf(v: PlanVersionRow): PlanVersionStatus {
155
140
  * Editability decision per version — identical to the backend rule
156
141
  * (`isVersionEditable`). The UI uses the result both for the visibility
157
142
  * of the edit button and for the badge on published-but-future versions
158
- * (SPEC_V2 §11.1 M6 Pack 2c).
159
143
  */
160
144
  function editabilityOf(v: PlanVersionRow): PlanVersionEditability {
161
145
  return isVersionEditable(v);
@@ -420,38 +404,8 @@ async function executeTerminate(): Promise<void> {
420
404
  </script>
421
405
 
422
406
  <style>
423
- .pd {
424
- --primary: #2563eb;
425
- --border: #e5e7eb;
426
- --border-strong: #d1d5db;
427
- --text: #0f172a;
428
- --text-2: #475569;
429
- --bg: #f6f7f9;
430
- --font-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', system-ui, sans-serif;
431
- --font-mono: 'JetBrains Mono', ui-monospace, 'SF Mono', Menlo, monospace;
432
-
433
- padding: 22px 26px;
434
- background: var(--bg);
435
- font-family: var(--font-sans);
436
- color: var(--text);
437
- min-height: 100%;
438
- box-sizing: border-box;
439
- }
440
- .pd * {
441
- box-sizing: border-box;
442
- }
443
- /* Consumer apps load Quasar, which styles h1–h6 globally with very large
444
- line-heights. Neutralize that here so headings (and the tier chip
445
- sitting next to them) are aligned correctly. */
446
- .pd h1,
447
- .pd h2,
448
- .pd h3,
449
- .pd h4 {
450
- line-height: 1.2;
451
- margin: 0;
452
- }
453
407
  .pd-code {
454
- font: 500 11px var(--font-mono);
408
+ font: 500 11px var(--sa-font-mono);
455
409
  }
456
410
 
457
411
  /* buttons + chips (1:1 styles.css) */
@@ -461,40 +415,31 @@ async function executeTerminate(): Promise<void> {
461
415
  gap: 7px;
462
416
  padding: 8px 14px;
463
417
  border-radius: 7px;
464
- font: 500 13px var(--font-sans);
418
+ font: 500 13px var(--sa-font-body);
465
419
  cursor: pointer;
466
- border: 1px solid var(--border-strong);
420
+ border: 1px solid var(--sa-border-strong);
467
421
  background: #fff;
468
- color: var(--text);
422
+ color: var(--sa-heading);
469
423
  transition:
470
424
  background 0.12s,
471
425
  border-color 0.12s;
472
426
  }
473
427
  .btn:hover {
474
- background: #f8fafc;
428
+ background: var(--sa-bg-surface-2);
475
429
  }
476
430
  .btn.primary {
477
- background: var(--primary);
478
- border-color: var(--primary);
431
+ background: var(--sa-primary);
432
+ border-color: var(--sa-primary);
479
433
  color: #fff;
480
434
  }
481
435
  .btn.primary:hover {
482
- background: #1d4ed8;
436
+ background: var(--sa-primary-strong);
483
437
  }
484
438
  .btn.btn--sm {
485
439
  padding: 5px 9px;
486
440
  font-size: 12px;
487
441
  gap: 5px;
488
442
  }
489
- .btn.danger {
490
- border-color: #fecaca;
491
- color: #b91c1c;
492
- background: #fff;
493
- }
494
- .btn.danger:hover {
495
- background: #fef2f2;
496
- border-color: #fca5a5;
497
- }
498
443
  .chip {
499
444
  display: inline-flex;
500
445
  align-items: center;
@@ -503,23 +448,23 @@ async function executeTerminate(): Promise<void> {
503
448
  border-radius: 999px;
504
449
  font-size: 11px;
505
450
  font-weight: 600;
506
- background: #f8fafc;
507
- color: var(--text-2);
508
- border: 1px solid var(--border);
451
+ background: var(--sa-bg-surface-2);
452
+ color: var(--sa-muted-dark);
453
+ border: 1px solid var(--sa-border);
509
454
  }
510
455
  .chip.live {
511
- background: #ecfdf5;
456
+ background: var(--sa-positive-bg);
512
457
  color: #047857;
513
458
  border-color: #a7f3d0;
514
459
  }
515
460
  .chip.draft {
516
- background: #fffbeb;
461
+ background: var(--sa-warning-bg);
517
462
  color: #b45309;
518
463
  border-color: #fde68a;
519
464
  }
520
465
  .chip.supersed {
521
- background: #f1f5f9;
522
- color: #475569;
466
+ background: var(--sa-border-soft);
467
+ color: var(--sa-muted-dark);
523
468
  border-color: #cbd5e1;
524
469
  }
525
470
  .chip.dot::before {
@@ -531,148 +476,8 @@ async function executeTerminate(): Promise<void> {
531
476
  }
532
477
 
533
478
  /* header */
534
- .pd-header {
535
- display: flex;
536
- align-items: flex-start;
537
- gap: 18px;
538
- margin-bottom: 18px;
539
- }
540
- .pd-header-left {
541
- display: flex;
542
- align-items: flex-start;
543
- gap: 14px;
544
- min-width: 0;
545
- flex: 1;
546
- }
547
- .pd-header-titles {
548
- min-width: 0;
549
- }
550
- .pd-back-arrow {
551
- display: inline-flex;
552
- transform: rotate(180deg);
553
- }
554
- .pd-tier-chip {
555
- font: 700 10.5px var(--font-mono);
556
- letter-spacing: 0.08em;
557
- background: #f1f5f9;
558
- color: #475569;
559
- border: 1px solid #e2e8f0;
560
- padding: 4px 10px;
561
- border-radius: 6px;
562
- margin-top: 8px;
563
- }
564
- .pd-title {
565
- font-size: 28px;
566
- font-weight: 700;
567
- letter-spacing: -0.025em;
568
- margin: 0;
569
- color: var(--text);
570
- }
571
- .pd-desc {
572
- margin-top: 4px;
573
- font-size: 13px;
574
- color: var(--text-2);
575
- }
576
- .pd-actions {
577
- display: flex;
578
- gap: 8px;
579
- align-items: center;
580
- }
581
- .pd-title-wrap {
582
- display: flex;
583
- align-items: center;
584
- gap: 8px;
585
- }
586
- .pd-title-edit-btn {
587
- display: inline-flex;
588
- align-items: center;
589
- justify-content: center;
590
- width: 28px;
591
- height: 28px;
592
- border-radius: 6px;
593
- background: transparent;
594
- border: 1px solid transparent;
595
- color: #94a3b8;
596
- cursor: pointer;
597
- transition:
598
- background 0.12s,
599
- color 0.12s,
600
- border-color 0.12s;
601
- }
602
- .pd-title-edit-btn:hover {
603
- background: #f1f5f9;
604
- color: var(--primary);
605
- border-color: #e2e8f0;
606
- }
607
- .pd-title-input {
608
- font: inherit;
609
- font-size: 28px;
610
- font-weight: 700;
611
- letter-spacing: -0.025em;
612
- color: var(--text);
613
- border: 0;
614
- background: #fffbeb;
615
- outline: 2px solid #fcd34d;
616
- padding: 2px 8px;
617
- border-radius: 6px;
618
- min-width: 220px;
619
- }
620
- .pd-title-hint {
621
- font-size: 11px;
622
- color: #92400e;
623
- font-weight: 500;
624
- background: #fffbeb;
625
- border: 1px solid #fde68a;
626
- padding: 2px 8px;
627
- border-radius: 999px;
628
- margin-left: 4px;
629
- }
630
479
 
631
480
  /* KPI cards */
632
- .pd-kpis {
633
- display: grid;
634
- grid-template-columns: repeat(4, 1fr);
635
- gap: 12px;
636
- margin-bottom: 16px;
637
- }
638
- .pd-kpi {
639
- background: #fff;
640
- border: 1px solid var(--border);
641
- border-radius: 10px;
642
- padding: 14px 16px 12px;
643
- min-height: 102px;
644
- display: flex;
645
- flex-direction: column;
646
- gap: 6px;
647
- }
648
- .pd-kpi-label {
649
- font-size: 10.5px;
650
- font-weight: 700;
651
- text-transform: uppercase;
652
- letter-spacing: 0.1em;
653
- color: #64748b;
654
- }
655
- .pd-kpi-big {
656
- font: 700 26px/1 var(--font-sans);
657
- letter-spacing: -0.025em;
658
- color: var(--text);
659
- display: flex;
660
- align-items: center;
661
- gap: 10px;
662
- }
663
- .pd-kpi-sub {
664
- font-size: 11.5px;
665
- color: #64748b;
666
- margin-top: auto;
667
- }
668
- .pd-kpi.draft {
669
- background: linear-gradient(180deg, #fffbeb 0%, #fffef7 100%);
670
- border-color: #fde68a;
671
- }
672
- .pd-kpi.draft .pd-kpi-label,
673
- .pd-kpi.draft .pd-kpi-sub {
674
- color: #92400e;
675
- }
676
481
 
677
482
  /* body */
678
483
  .pd-body {
@@ -681,10 +486,9 @@ async function executeTerminate(): Promise<void> {
681
486
  gap: 16px;
682
487
  align-items: start;
683
488
  }
489
+ /* Surface, border and radius come from `.sa-section` — the panel IS one.
490
+ * Only `overflow` stays, so content is clipped at the rounded edge. */
684
491
  .pd-panel {
685
- background: #fff;
686
- border: 1px solid var(--border);
687
- border-radius: 10px;
688
492
  overflow: hidden;
689
493
  }
690
494
  .pd-panel-head {
@@ -692,29 +496,18 @@ async function executeTerminate(): Promise<void> {
692
496
  align-items: flex-start;
693
497
  gap: 12px;
694
498
  padding: 14px 16px 12px;
695
- border-bottom: 1px solid #f1f5f9;
696
- }
697
- .pd-panel .sa-section__head {
698
- align-items: flex-start;
699
- gap: 12px;
700
- padding: 14px 16px 12px;
701
- border-bottom: 1px solid #f1f5f9;
702
- margin-bottom: 0;
703
- }
704
- .pd-panel .sa-section__sub {
705
- font-size: 11.5px;
706
- margin-top: 2px;
499
+ border-bottom: 1px solid var(--sa-border-soft);
707
500
  }
708
501
  .pd-panel-title {
709
502
  font-size: 15px;
710
503
  font-weight: 700;
711
504
  margin: 0;
712
505
  letter-spacing: -0.01em;
713
- color: var(--text);
506
+ color: var(--sa-heading);
714
507
  }
715
508
  .pd-panel-sub {
716
509
  font-size: 11.5px;
717
- color: #64748b;
510
+ color: var(--sa-muted);
718
511
  margin-top: 3px;
719
512
  }
720
513
  .pd-panel-head-right {
@@ -733,7 +526,7 @@ async function executeTerminate(): Promise<void> {
733
526
  align-items: center;
734
527
  gap: 6px;
735
528
  font-size: 11px;
736
- color: #94a3b8;
529
+ color: var(--sa-muted-light);
737
530
  margin-bottom: 8px;
738
531
  font-weight: 500;
739
532
  }
@@ -747,14 +540,14 @@ async function executeTerminate(): Promise<void> {
747
540
  height: 24px;
748
541
  border-radius: 6px;
749
542
  overflow: hidden;
750
- background: #f1f5f9;
751
- border: 1px solid #e2e8f0;
543
+ background: var(--sa-border-soft);
544
+ border: 1px solid var(--sa-border);
752
545
  }
753
546
  .pd-timeline-seg {
754
547
  display: flex;
755
548
  align-items: center;
756
549
  justify-content: center;
757
- font: 600 11px var(--font-sans);
550
+ font: 600 11px var(--sa-font-body);
758
551
  color: rgba(15, 23, 42, 0.65);
759
552
  border-right: 1px solid rgba(0, 0, 0, 0.06);
760
553
  white-space: nowrap;
@@ -777,8 +570,8 @@ async function executeTerminate(): Promise<void> {
777
570
  transform: translateY(0);
778
571
  }
779
572
  .pd-timeline-seg.superseded {
780
- background: #e2e8f0;
781
- color: #475569;
573
+ background: var(--sa-border);
574
+ color: var(--sa-muted-dark);
782
575
  }
783
576
  .pd-timeline-seg.live {
784
577
  background: #10b981;
@@ -793,13 +586,13 @@ async function executeTerminate(): Promise<void> {
793
586
  .pd-timeline-seg.is-selected {
794
587
  position: relative;
795
588
  z-index: 1;
796
- outline: 2px solid var(--primary);
589
+ outline: 2px solid var(--sa-primary);
797
590
  outline-offset: -2px;
798
591
  box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.18);
799
592
  font-weight: 700;
800
593
  }
801
594
  .pd-timeline-seg.is-selected.superseded {
802
- color: #0f172a;
595
+ color: var(--sa-heading);
803
596
  }
804
597
  .pd-timeline-seg.is-selected.live {
805
598
  outline-color: #047857;
@@ -813,8 +606,8 @@ async function executeTerminate(): Promise<void> {
813
606
  display: flex;
814
607
  justify-content: space-between;
815
608
  margin-top: 6px;
816
- font: 500 10.5px var(--font-mono);
817
- color: #94a3b8;
609
+ font: 500 10.5px var(--sa-font-mono);
610
+ color: var(--sa-muted-light);
818
611
  }
819
612
 
820
613
  /* versions table */
@@ -830,7 +623,7 @@ async function executeTerminate(): Promise<void> {
830
623
  64px minmax(0, 1.4fr) minmax(0, 1.1fr) minmax(0, 0.8fr) minmax(0, 1fr)
831
624
  minmax(96px, auto);
832
625
  align-items: stretch;
833
- border-top: 1px solid #f1f5f9;
626
+ border-top: 1px solid var(--sa-border-soft);
834
627
  margin-top: 12px;
835
628
  }
836
629
  .pd-versions-head {
@@ -842,9 +635,9 @@ async function executeTerminate(): Promise<void> {
842
635
  font-size: 10px;
843
636
  text-transform: uppercase;
844
637
  letter-spacing: 0.1em;
845
- color: #64748b;
638
+ color: var(--sa-muted);
846
639
  font-weight: 700;
847
- border-bottom: 1px solid var(--border);
640
+ border-bottom: 1px solid var(--sa-border);
848
641
  }
849
642
  .pd-vrow {
850
643
  display: contents;
@@ -852,11 +645,11 @@ async function executeTerminate(): Promise<void> {
852
645
  }
853
646
  .pd-vrow > div {
854
647
  padding: 13px 12px;
855
- border-bottom: 1px solid #f1f5f9;
648
+ border-bottom: 1px solid var(--sa-border-soft);
856
649
  display: flex;
857
650
  align-items: center;
858
651
  font-size: 12.5px;
859
- color: var(--text);
652
+ color: var(--sa-heading);
860
653
  }
861
654
  .pd-vrow:hover > div {
862
655
  background: #fafbfd;
@@ -868,7 +661,7 @@ async function executeTerminate(): Promise<void> {
868
661
  background: #fff8e7;
869
662
  }
870
663
  .pd-vrow.is-selected > div {
871
- background: #eff6ff !important;
664
+ background: var(--sa-primary-50) !important;
872
665
  box-shadow: inset 0 -1px 0 0 #bfdbfe;
873
666
  }
874
667
  .pd-vrow.is-selected.is-draft > div {
@@ -877,7 +670,7 @@ async function executeTerminate(): Promise<void> {
877
670
  }
878
671
  .pd-vrow.is-selected > div:first-child {
879
672
  box-shadow:
880
- inset 3px 0 0 0 var(--primary),
673
+ inset 3px 0 0 0 var(--sa-primary),
881
674
  inset 0 -1px 0 0 #bfdbfe;
882
675
  }
883
676
  .pd-vrow.is-draft > div:first-child {
@@ -895,7 +688,7 @@ async function executeTerminate(): Promise<void> {
895
688
  align-items: flex-start;
896
689
  }
897
690
  .pd-v-num {
898
- font: 700 14px var(--font-sans);
691
+ font: 700 14px var(--sa-font-body);
899
692
  }
900
693
  .pd-validity {
901
694
  display: flex;
@@ -909,32 +702,32 @@ async function executeTerminate(): Promise<void> {
909
702
  }
910
703
  .pd-validity-sub {
911
704
  font-size: 10.5px;
912
- color: #94a3b8;
705
+ color: var(--sa-muted-light);
913
706
  }
914
707
  .pd-validity-date {
915
- font: 500 12.5px var(--font-mono);
708
+ font: 500 12.5px var(--sa-font-mono);
916
709
  }
917
710
  .pd-arrow-inf {
918
- font: 600 13px var(--font-mono);
919
- color: #94a3b8;
711
+ font: 600 13px var(--sa-font-mono);
712
+ color: var(--sa-muted-light);
920
713
  }
921
714
  .pd-pricing-m {
922
- font: 600 13px var(--font-sans);
715
+ font: 600 13px var(--sa-font-body);
923
716
  }
924
717
  .pd-pricing-y {
925
- font: 500 10.5px var(--font-sans);
926
- color: #94a3b8;
718
+ font: 500 10.5px var(--sa-font-body);
719
+ color: var(--sa-muted-light);
927
720
  margin-top: 2px;
928
721
  }
929
722
  .pd-impact-num {
930
- font: 700 14px var(--font-sans);
723
+ font: 700 14px var(--sa-font-body);
931
724
  }
932
725
  .pd-impact-sub {
933
726
  font-size: 10.5px;
934
- color: #94a3b8;
727
+ color: var(--sa-muted-light);
935
728
  }
936
729
  .pd-change-note {
937
- color: #94a3b8;
730
+ color: var(--sa-muted-light);
938
731
  font-style: italic;
939
732
  overflow: hidden;
940
733
  text-overflow: ellipsis;
@@ -951,8 +744,8 @@ async function executeTerminate(): Promise<void> {
951
744
  align-items: center;
952
745
  padding: 3px 8px;
953
746
  border-radius: 999px;
954
- font: 600 10.5px var(--font-mono);
955
- background: #fffbeb;
747
+ font: 600 10.5px var(--sa-font-mono);
748
+ background: var(--sa-warning-bg);
956
749
  color: #b45309;
957
750
  border: 1px solid #fde68a;
958
751
  white-space: nowrap;
@@ -964,12 +757,12 @@ async function executeTerminate(): Promise<void> {
964
757
  gap: 6px;
965
758
  }
966
759
  .pd-diff-chip {
967
- font: 700 11px var(--font-mono);
760
+ font: 700 11px var(--sa-font-mono);
968
761
  padding: 3px 8px;
969
762
  border-radius: 6px;
970
763
  }
971
764
  .pd-diff-chip.add {
972
- background: #ecfdf5;
765
+ background: var(--sa-positive-bg);
973
766
  color: #047857;
974
767
  border: 1px solid #a7f3d0;
975
768
  }
@@ -979,9 +772,9 @@ async function executeTerminate(): Promise<void> {
979
772
  border: 1px solid #fecaca;
980
773
  }
981
774
  .pd-diff-chip.mod {
982
- background: #f1f5f9;
983
- color: #475569;
984
- border: 1px solid #e2e8f0;
775
+ background: var(--sa-border-soft);
776
+ color: var(--sa-muted-dark);
777
+ border: 1px solid var(--sa-border);
985
778
  }
986
779
  .pd-diff-list {
987
780
  padding: 12px;
@@ -994,13 +787,13 @@ async function executeTerminate(): Promise<void> {
994
787
  align-items: center;
995
788
  gap: 10px;
996
789
  background: #fff;
997
- border: 1px solid var(--border);
790
+ border: 1px solid var(--sa-border);
998
791
  border-radius: 8px;
999
792
  padding: 11px 12px 11px 0;
1000
793
  overflow: hidden;
1001
794
  }
1002
795
  .pd-diff-row.add {
1003
- background: linear-gradient(90deg, #ecfdf5 0%, #fff 60%);
796
+ background: linear-gradient(90deg, var(--sa-positive-bg) 0%, #fff 60%);
1004
797
  border-color: #a7f3d0;
1005
798
  }
1006
799
  .pd-diff-row.rm {
@@ -1008,8 +801,8 @@ async function executeTerminate(): Promise<void> {
1008
801
  border-color: #fecaca;
1009
802
  }
1010
803
  .pd-diff-row.mod {
1011
- background: linear-gradient(90deg, #f8fafc 0%, #fff 60%);
1012
- border-color: #e2e8f0;
804
+ background: linear-gradient(90deg, var(--sa-bg-surface-2) 0%, #fff 60%);
805
+ border-color: var(--sa-border);
1013
806
  }
1014
807
  .pd-diff-icon {
1015
808
  width: 32px;
@@ -1018,7 +811,7 @@ async function executeTerminate(): Promise<void> {
1018
811
  place-items: center;
1019
812
  flex: 0 0 32px;
1020
813
  color: #fff;
1021
- font: 700 16px var(--font-sans);
814
+ font: 700 16px var(--sa-font-body);
1022
815
  }
1023
816
  .pd-diff-row.add .pd-diff-icon {
1024
817
  background: #10b981;
@@ -1027,7 +820,7 @@ async function executeTerminate(): Promise<void> {
1027
820
  background: #ef4444;
1028
821
  }
1029
822
  .pd-diff-row.mod .pd-diff-icon {
1030
- background: #64748b;
823
+ background: var(--sa-muted);
1031
824
  }
1032
825
  .pd-diff-body {
1033
826
  flex: 1;
@@ -1038,29 +831,29 @@ async function executeTerminate(): Promise<void> {
1038
831
  flex-wrap: wrap;
1039
832
  }
1040
833
  .pd-diff-kind {
1041
- font: 700 10px var(--font-mono);
834
+ font: 700 10px var(--sa-font-mono);
1042
835
  text-transform: uppercase;
1043
836
  letter-spacing: 0.1em;
1044
- color: #64748b;
837
+ color: var(--sa-muted);
1045
838
  }
1046
839
  .pd-diff-label {
1047
840
  font-size: 13.5px;
1048
841
  font-weight: 600;
1049
- color: var(--text);
842
+ color: var(--sa-heading);
1050
843
  }
1051
844
  .pd-diff-key {
1052
- font: 500 11px var(--font-mono);
1053
- color: #94a3b8;
845
+ font: 500 11px var(--sa-font-mono);
846
+ color: var(--sa-muted-light);
1054
847
  }
1055
848
  .pd-diff-vals {
1056
849
  display: flex;
1057
850
  align-items: center;
1058
851
  gap: 6px;
1059
- font: 500 12px var(--font-mono);
852
+ font: 500 12px var(--sa-font-mono);
1060
853
  }
1061
854
  .pd-diff-strike {
1062
855
  text-decoration: line-through;
1063
- color: #94a3b8;
856
+ color: var(--sa-muted-light);
1064
857
  }
1065
858
  .pd-diff-arrow {
1066
859
  color: #cbd5e1;
@@ -1089,12 +882,12 @@ async function executeTerminate(): Promise<void> {
1089
882
  }
1090
883
  .pd-diff-tag.mod {
1091
884
  background: #fff;
1092
- color: #475569;
885
+ color: var(--sa-muted-dark);
1093
886
  border-color: #cbd5e1;
1094
887
  }
1095
888
  .pd-diff-row.plain {
1096
889
  background: #fff;
1097
- border-color: #e2e8f0;
890
+ border-color: var(--sa-border);
1098
891
  padding: 11px 12px 11px 0;
1099
892
  }
1100
893
  .pd-diff-section {
@@ -1106,7 +899,7 @@ async function executeTerminate(): Promise<void> {
1106
899
  font-size: 10.5px;
1107
900
  text-transform: uppercase;
1108
901
  letter-spacing: 0.1em;
1109
- color: #94a3b8;
902
+ color: var(--sa-muted-light);
1110
903
  font-weight: 700;
1111
904
  }
1112
905
  .pd-diff-section:first-child {
@@ -1115,17 +908,17 @@ async function executeTerminate(): Promise<void> {
1115
908
  .pd-diff-section hr {
1116
909
  flex: 1;
1117
910
  border: 0;
1118
- border-top: 1px dashed #e2e8f0;
911
+ border-top: 1px dashed var(--sa-border);
1119
912
  }
1120
913
  .pd-diff-empty {
1121
914
  padding: 28px 18px;
1122
915
  text-align: center;
1123
- color: #94a3b8;
916
+ color: var(--sa-muted-light);
1124
917
  font-size: 13px;
1125
918
  }
1126
919
  .pd-diff-empty b {
1127
920
  display: block;
1128
- color: #475569;
921
+ color: var(--sa-muted-dark);
1129
922
  font-size: 14px;
1130
923
  margin-bottom: 4px;
1131
924
  }
@@ -1142,7 +935,7 @@ async function executeTerminate(): Promise<void> {
1142
935
  align-items: center;
1143
936
  gap: 14px;
1144
937
  padding: 9px 0;
1145
- border-top: 1px solid #f1f5f9;
938
+ border-top: 1px solid var(--sa-border-soft);
1146
939
  }
1147
940
  .pd-audit-row:first-child {
1148
941
  border-top: 0;
@@ -1160,7 +953,7 @@ async function executeTerminate(): Promise<void> {
1160
953
  background: #10b981;
1161
954
  }
1162
955
  .pd-audit-change {
1163
- background: #2563eb;
956
+ background: var(--sa-primary);
1164
957
  }
1165
958
  .pd-audit-publish {
1166
959
  background: #8b5cf6;
@@ -1170,28 +963,28 @@ async function executeTerminate(): Promise<void> {
1170
963
  }
1171
964
  .pd-audit-when {
1172
965
  font-size: 11.5px;
1173
- color: #64748b;
966
+ color: var(--sa-muted);
1174
967
  min-width: 130px;
1175
968
  }
1176
969
  .pd-audit-avatar {
1177
970
  width: 24px;
1178
971
  height: 24px;
1179
972
  border-radius: 50%;
1180
- background: var(--text);
973
+ background: var(--sa-heading);
1181
974
  color: #fff;
1182
975
  display: grid;
1183
976
  place-items: center;
1184
- font: 700 11px var(--font-sans);
977
+ font: 700 11px var(--sa-font-body);
1185
978
  flex: 0 0 auto;
1186
979
  }
1187
980
  .pd-audit-who {
1188
981
  font-size: 12px;
1189
- color: var(--text-2);
982
+ color: var(--sa-muted-dark);
1190
983
  min-width: 64px;
1191
984
  }
1192
985
  .pd-audit-what {
1193
986
  font-size: 13px;
1194
- color: var(--text);
987
+ color: var(--sa-heading);
1195
988
  flex: 1;
1196
989
  }
1197
990
 
@@ -1199,8 +992,5 @@ async function executeTerminate(): Promise<void> {
1199
992
  .pd-body {
1200
993
  grid-template-columns: 1fr;
1201
994
  }
1202
- .pd-kpis {
1203
- grid-template-columns: repeat(2, 1fr);
1204
- }
1205
995
  }
1206
996
  </style>