@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
@@ -92,20 +92,20 @@ function cancel(): void {
92
92
  * input keeps matching it when that changes. */
93
93
  .pd-title-edit__input {
94
94
  font: inherit;
95
- color: var(--sa-heading);
95
+ color: var(--sa-color-fg-heading);
96
96
  border: 0;
97
- background: var(--sa-warning-bg);
98
- outline: 2px solid var(--sa-amber-light);
97
+ background: var(--sa-color-warning-surface);
98
+ outline: 2px solid var(--sa-color-warning-strong);
99
99
  padding: 2px 8px;
100
100
  border-radius: var(--sa-radius-control);
101
101
  min-width: 220px;
102
102
  }
103
103
  .pd-title-edit__hint {
104
- font-size: 11px;
104
+ font-size: var(--sa-text-xs);
105
105
  font-weight: 500;
106
- color: var(--sa-warning);
107
- background: var(--sa-warning-bg);
108
- border: 1px solid var(--sa-amber-border);
106
+ color: var(--sa-color-warning);
107
+ background: var(--sa-color-warning-surface);
108
+ border: 1px solid var(--sa-color-warning-border);
109
109
  border-radius: var(--sa-radius-control);
110
110
  padding: 3px 8px;
111
111
  }
@@ -118,7 +118,7 @@ function cancel(): void {
118
118
  border-radius: var(--sa-radius-control);
119
119
  background: transparent;
120
120
  border: 1px solid transparent;
121
- color: var(--sa-muted-light);
121
+ color: var(--sa-color-fg-subtle);
122
122
  cursor: pointer;
123
123
  transition:
124
124
  background 0.12s,
@@ -126,8 +126,8 @@ function cancel(): void {
126
126
  border-color 0.12s;
127
127
  }
128
128
  .pd-title-edit__btn:hover {
129
- background: var(--sa-border-soft);
130
- color: var(--sa-primary);
131
- border-color: var(--sa-border);
129
+ background: var(--sa-color-border-soft);
130
+ color: var(--sa-color-accent);
131
+ border-color: var(--sa-color-border);
132
132
  }
133
133
  </style>
@@ -45,11 +45,7 @@
45
45
  <div class="sa-plan-list-plan-name">
46
46
  <div
47
47
  class="sa-plan-list-plan-mark"
48
- :style="{
49
- background: planAccent(p.planKey) + '15',
50
- color: planAccent(p.planKey),
51
- borderColor: planAccent(p.planKey) + '33',
52
- }"
48
+ :style="identityChipStyle(planAccent(p.planKey))"
53
49
  >
54
50
  {{ p.planKey.slice(0, 3) }}
55
51
  </div>
@@ -415,6 +411,7 @@
415
411
  import { resolvePlans, type ResolvedPlan } from '../../client/resolve-plans.js';
416
412
  import { computed, ref } from 'vue';
417
413
  import type { PlanRow, PlanVersionRow } from '@saasicat/types';
414
+ import { identityAccentFor, identityChipStyle } from '../../client/identity-accents.js';
418
415
  import { formatMessage } from '../../client/i18n/format.js';
419
416
  import { formatCurrency } from '../../client/i18n/currency.js';
420
417
  import { useSaMessages, useSuperAdminI18n } from '../../vue/use-super-admin-i18n.js';
@@ -456,24 +453,12 @@ const common = useSaMessages('common');
456
453
  // `clearable` emits null, not '' — see Quasar's use-field clearValue().
457
454
  const search = ref<string | null>('');
458
455
 
459
- const DEFAULT_ACCENTS: Record<string, string> = {
460
- STARTER: '#64748b',
461
- STANDARD: '#2563eb',
462
- PRO: '#7c3aed',
463
- PROFESSIONAL: '#7c3aed',
464
- BUSINESS: '#0ea5e9',
465
- ENTERPRISE: '#0f766e',
466
- BASIC: '#475569',
467
- };
468
- const FALLBACK_ACCENTS = ['#2563eb', '#7c3aed', '#0f766e', '#f59e0b', '#0ea5e9', '#ef4444'];
469
-
470
456
  function planAccent(planKey: string): string {
471
- const provided = props.planAccents[planKey];
472
- if (provided) return provided;
473
- const def = DEFAULT_ACCENTS[planKey];
474
- if (def) return def;
475
- const idx = props.plans.findIndex((p) => p.planKey === planKey);
476
- return FALLBACK_ACCENTS[idx % FALLBACK_ACCENTS.length] ?? FALLBACK_ACCENTS[0]!;
457
+ return identityAccentFor(
458
+ planKey,
459
+ props.planAccents,
460
+ props.plans.findIndex((p) => p.planKey === planKey),
461
+ );
477
462
  }
478
463
 
479
464
  const resolvedPlans = computed(() =>
@@ -552,8 +537,8 @@ function hasAnyPublished(row: ResolvedPlan<PlanRow, PlanVersionRow>): boolean {
552
537
  <style scoped>
553
538
  .sa-plan-list {
554
539
  /* padding: 22px 26px; */
555
- background: var(--sa-bg-app);
556
- color: var(--sa-heading);
540
+ background: var(--sa-color-bg-app);
541
+ color: var(--sa-color-fg-heading);
557
542
  font-family: var(--sa-font-body);
558
543
  min-height: 100%;
559
544
  box-sizing: border-box;
@@ -563,18 +548,24 @@ function hasAnyPublished(row: ResolvedPlan<PlanRow, PlanVersionRow>): boolean {
563
548
 
564
549
  /* List wrap */
565
550
  .sa-plan-list-wrap {
566
- background: var(--sa-bg-surface);
567
- border: 1px solid var(--sa-border);
551
+ background: var(--sa-color-bg-surface);
552
+ border: 1px solid var(--sa-color-border);
568
553
  border-radius: 10px;
569
- overflow: hidden;
554
+ /* Scrolls rather than clips. `overflow: hidden` was here to keep the corner
555
+ * radius, and it also cut the six-column grid off below ~790px — six data
556
+ * columns squeezed into a phone are not readable anyway, so the honest
557
+ * answer is the same as for the tab bar: let it scroll. `hidden` on the
558
+ * cross axis keeps the radius doing its job. */
559
+ overflow-x: auto;
560
+ overflow-y: hidden;
570
561
  }
571
562
  .sa-plan-list-toolbar {
572
563
  display: flex;
573
564
  align-items: center;
574
565
  gap: 10px;
575
566
  padding: 12px 16px;
576
- border-bottom: 1px solid var(--sa-border);
577
- background: var(--sa-bg-surface-2);
567
+ border-bottom: 1px solid var(--sa-color-border);
568
+ background: var(--sa-color-bg-sunken);
578
569
  }
579
570
  /* The search takes the row; the sort hint keeps its content width. */
580
571
  .sa-plan-list-toolbar > .q-field {
@@ -582,73 +573,94 @@ function hasAnyPublished(row: ResolvedPlan<PlanRow, PlanVersionRow>): boolean {
582
573
  }
583
574
  .sa-plan-list-sortinfo {
584
575
  margin-left: auto;
585
- font-size: 11.5px;
586
- color: var(--sa-muted-light);
576
+ font-size: var(--sa-text-sm);
577
+ color: var(--sa-color-fg-subtle);
587
578
  }
588
579
 
589
580
  /* List grid */
590
581
  .sa-plan-list-list {
591
582
  display: grid;
592
583
  grid-template-columns: 1.6fr 0.9fr 0.7fr 0.9fr 1.4fr 160px;
593
- align-items: center;
584
+ /* So the scroll above has something to scroll: without a content floor the
585
+ * tracks shrink to the container and the cells overflow individually,
586
+ * which is the clipped state rather than a scrollable one. */
587
+ min-width: max-content;
588
+ /* Stretch, not centre. Every row is `display: contents`, so its cells are
589
+ * grid items in their own right — and a centred item is only as tall as its
590
+ * own content. The row's hover background is painted per cell, so the band
591
+ * came out notched wherever one column was shorter than its neighbours.
592
+ * The cells fill the row now and centre their contents themselves. */
593
+ align-items: stretch;
594
594
  }
595
595
  .sa-plan-list-list-head {
596
596
  display: contents;
597
597
  }
598
598
  .sa-plan-list-list-head > div {
599
- background: #fbfbfd;
599
+ display: flex;
600
+ align-items: center;
601
+ background: var(--sa-color-bg-surface-raised);
600
602
  padding: 10px 16px;
601
- font-size: 10.5px;
603
+ font-size: var(--sa-text-xs);
602
604
  text-transform: uppercase;
603
605
  letter-spacing: 0.1em;
604
- color: var(--sa-muted-dark);
606
+ color: var(--sa-color-fg-secondary);
605
607
  font-weight: 700;
606
- border-bottom: 1px solid var(--sa-border);
608
+ border-bottom: 1px solid var(--sa-color-border);
607
609
  }
608
610
  .sa-plan-list-empty {
609
611
  grid-column: 1 / -1;
610
612
  padding: 32px 24px;
611
613
  text-align: center;
612
- color: var(--sa-muted-light);
614
+ color: var(--sa-color-fg-subtle);
613
615
  font-style: italic;
614
- font-size: 13px;
616
+ font-size: var(--sa-text-md);
615
617
  }
616
618
  .sa-plan-list-row {
617
619
  display: contents;
618
620
  cursor: pointer;
619
621
  }
620
622
  .sa-plan-list-row > .sa-plan-list-cell {
623
+ /* Column by default — most cells stack a value over a caption. The three
624
+ * that lay their content out in a row say so below. */
625
+ display: flex;
626
+ flex-direction: column;
627
+ justify-content: center;
621
628
  padding: 14px 16px;
622
- border-bottom: 1px solid var(--sa-border-soft);
629
+ border-bottom: 1px solid var(--sa-color-border-soft);
623
630
  transition: background 0.12s;
624
631
  }
625
632
  .sa-plan-list-row:hover > .sa-plan-list-cell {
626
- background: #fcfcfd;
633
+ background: var(--sa-color-bg-surface-raised);
627
634
  }
628
635
  .sa-plan-list-row--new > .sa-plan-list-cell {
629
- background: var(--sa-positive-bg) !important;
636
+ background: var(--sa-color-positive-surface) !important;
630
637
  animation: sa-plan-list-flashNew 2.4s ease-out;
631
638
  }
632
639
  @keyframes sa-plan-list-flashNew {
633
640
  0% {
634
- background: #d1fae5 !important;
641
+ background: var(--sa-color-positive-surface-strong) !important;
635
642
  }
636
643
  100% {
637
- background: var(--sa-positive-bg) !important;
644
+ background: var(--sa-color-positive-surface) !important;
638
645
  }
639
646
  }
640
647
 
641
648
  /* Sub-rows (drafts + future-scheduled versions, indented under the parent) */
642
649
  .sa-plan-list-row--sub > .sa-plan-list-cell {
643
- background: #fafbfd;
650
+ background: var(--sa-color-bg-surface-raised);
644
651
  padding-top: 10px;
645
652
  padding-bottom: 10px;
646
653
  }
647
654
  .sa-plan-list-row--sub:hover > .sa-plan-list-cell {
648
- background: var(--sa-border-soft);
655
+ background: var(--sa-color-border-soft);
649
656
  }
650
- .sa-plan-list-cell--sub-name {
657
+ .sa-plan-list-row > .sa-plan-list-cell--sub-name {
651
658
  display: flex;
659
+ flex-direction: row;
660
+ /* The base rule centres on the main axis, which is vertical for a column
661
+ * cell but horizontal here — it would float the indent and leave the tree
662
+ * elbow pointing at nothing. */
663
+ justify-content: flex-start;
652
664
  align-items: center;
653
665
  gap: 12px;
654
666
  padding-left: 32px !important;
@@ -667,36 +679,36 @@ function hasAnyPublished(row: ResolvedPlan<PlanRow, PlanVersionRow>): boolean {
667
679
  bottom: 50%;
668
680
  left: 12px;
669
681
  width: 14px;
670
- border-left: 1.5px solid #cbd5e1;
671
- border-bottom: 1.5px solid #cbd5e1;
682
+ border-left: 1.5px solid var(--sa-color-border-strong);
683
+ border-bottom: 1.5px solid var(--sa-color-border-strong);
672
684
  border-bottom-left-radius: 6px;
673
685
  }
674
686
  .sa-plan-list-sub-titles {
675
687
  min-width: 0;
676
688
  }
677
689
  .sa-plan-list-sub-title {
678
- font-size: 13px;
690
+ font-size: var(--sa-text-md);
679
691
  font-weight: 600;
680
- color: var(--sa-muted-dark);
692
+ color: var(--sa-color-fg-secondary);
681
693
  display: flex;
682
694
  align-items: center;
683
695
  gap: 8px;
684
696
  }
685
697
  .sa-plan-list-sub-desc {
686
- font-size: 11.5px;
687
- color: var(--sa-muted);
698
+ font-size: var(--sa-text-sm);
699
+ color: var(--sa-color-fg-muted);
688
700
  margin-top: 2px;
689
701
  overflow: hidden;
690
702
  text-overflow: ellipsis;
691
703
  white-space: nowrap;
692
704
  }
693
705
  .sa-plan-list-version-num--sub {
694
- font-size: 13px;
706
+ font-size: var(--sa-text-md);
695
707
  font-weight: 600;
696
- color: var(--sa-muted-dark);
708
+ color: var(--sa-color-fg-secondary);
697
709
  }
698
710
  .sa-plan-list-cell--sub-impact {
699
- color: var(--sa-muted-light);
711
+ color: var(--sa-color-fg-subtle);
700
712
  }
701
713
 
702
714
  .sa-plan-list-plan-name {
@@ -710,7 +722,7 @@ function hasAnyPublished(row: ResolvedPlan<PlanRow, PlanVersionRow>): boolean {
710
722
  border-radius: 8px;
711
723
  display: grid;
712
724
  place-items: center;
713
- font: 700 11px var(--sa-font-mono);
725
+ font: 700 var(--sa-text-xs) var(--sa-font-mono);
714
726
  letter-spacing: 0.04em;
715
727
  flex: 0 0 auto;
716
728
  border: 1px solid;
@@ -719,9 +731,9 @@ function hasAnyPublished(row: ResolvedPlan<PlanRow, PlanVersionRow>): boolean {
719
731
  min-width: 0;
720
732
  }
721
733
  .sa-plan-list-plan-title {
722
- font-size: 14.5px;
734
+ font-size: var(--sa-text-lg);
723
735
  font-weight: 700;
724
- color: var(--sa-heading);
736
+ color: var(--sa-color-fg-heading);
725
737
  letter-spacing: -0.01em;
726
738
  display: flex;
727
739
  align-items: center;
@@ -729,8 +741,8 @@ function hasAnyPublished(row: ResolvedPlan<PlanRow, PlanVersionRow>): boolean {
729
741
  flex-wrap: wrap;
730
742
  }
731
743
  .sa-plan-list-plan-desc {
732
- font-size: 11.5px;
733
- color: var(--sa-muted);
744
+ font-size: var(--sa-text-sm);
745
+ color: var(--sa-color-fg-muted);
734
746
  margin-top: 2px;
735
747
  overflow: hidden;
736
748
  text-overflow: ellipsis;
@@ -751,41 +763,41 @@ function hasAnyPublished(row: ResolvedPlan<PlanRow, PlanVersionRow>): boolean {
751
763
  gap: 5px;
752
764
  padding: 2px 8px;
753
765
  border-radius: 999px;
754
- font-size: 11px;
766
+ font-size: var(--sa-text-xs);
755
767
  font-weight: 600;
756
- background: var(--sa-bg-surface-2);
757
- color: var(--sa-muted-dark);
758
- border: 1px solid var(--sa-border);
768
+ background: var(--sa-color-bg-sunken);
769
+ color: var(--sa-color-fg-secondary);
770
+ border: 1px solid var(--sa-color-border);
759
771
  }
760
772
  .sa-plan-list-chip--tiny {
761
773
  padding: 1px 6px;
762
- font-size: 10px;
774
+ font-size: var(--sa-text-2xs);
763
775
  }
764
776
  .sa-plan-list-chip--new {
765
- background: #dbeafe;
766
- color: #1e40af;
767
- border-color: #bfdbfe;
768
- font-size: 10px;
777
+ background: var(--sa-color-info-surface-strong);
778
+ color: var(--sa-color-info-fg);
779
+ border-color: var(--sa-color-info-border);
780
+ font-size: var(--sa-text-2xs);
769
781
  }
770
782
  .sa-plan-list-chip--live {
771
- background: var(--sa-positive-bg);
772
- color: #047857;
773
- border-color: #a7f3d0;
783
+ background: var(--sa-color-positive-surface);
784
+ color: var(--sa-color-positive-fg);
785
+ border-color: var(--sa-color-positive-border);
774
786
  }
775
787
  .sa-plan-list-chip--draft {
776
- background: var(--sa-warning-bg);
777
- color: #b45309;
778
- border-color: #fde68a;
788
+ background: var(--sa-color-warning-surface);
789
+ color: var(--sa-color-warning-fg);
790
+ border-color: var(--sa-color-warning-border);
779
791
  }
780
792
  .sa-plan-list-chip--supersed {
781
- background: var(--sa-border-soft);
782
- color: var(--sa-muted-dark);
783
- border-color: #cbd5e1;
793
+ background: var(--sa-color-border-soft);
794
+ color: var(--sa-color-fg-secondary);
795
+ border-color: var(--sa-color-border-strong);
784
796
  }
785
797
  .sa-plan-list-chip--scheduled {
786
- background: #eef2ff;
787
- color: #4338ca;
788
- border-color: #c7d2fe;
798
+ background: var(--sa-color-scheduled-surface);
799
+ color: var(--sa-color-scheduled-fg);
800
+ border-color: var(--sa-color-scheduled-border);
789
801
  }
790
802
  .sa-plan-list-chip--dot::before {
791
803
  content: '';
@@ -796,53 +808,55 @@ function hasAnyPublished(row: ResolvedPlan<PlanRow, PlanVersionRow>): boolean {
796
808
  }
797
809
 
798
810
  .sa-plan-list-version-num {
799
- font-size: 13px;
811
+ font-size: var(--sa-text-md);
800
812
  font-weight: 700;
801
- color: var(--sa-heading);
813
+ color: var(--sa-color-fg-heading);
802
814
  }
803
815
  .sa-plan-list-version-num--muted {
804
- color: #cbd5e1;
816
+ color: var(--sa-color-fg-disabled);
805
817
  }
806
818
  .sa-plan-list-version-sub {
807
- font-size: 10.5px;
808
- color: var(--sa-muted-light);
819
+ font-size: var(--sa-text-xs);
820
+ color: var(--sa-color-fg-subtle);
809
821
  margin-top: 2px;
810
822
  }
811
823
 
812
824
  .sa-plan-list-price-big {
813
- font-size: 14px;
825
+ font-size: var(--sa-text-lg);
814
826
  font-weight: 700;
815
- color: var(--sa-heading);
827
+ color: var(--sa-color-fg-heading);
816
828
  }
817
829
  .sa-plan-list-price-unit {
818
- font-size: 11px;
819
- color: var(--sa-muted-light);
830
+ font-size: var(--sa-text-xs);
831
+ color: var(--sa-color-fg-subtle);
820
832
  }
821
833
  .sa-plan-list-price-sub {
822
- font-size: 10.5px;
823
- color: var(--sa-muted-light);
834
+ font-size: var(--sa-text-xs);
835
+ color: var(--sa-color-fg-subtle);
824
836
  margin-top: 2px;
825
837
  }
826
838
  .sa-plan-list-price-text {
827
- font-size: 13px;
839
+ font-size: var(--sa-text-md);
828
840
  font-weight: 600;
829
- color: var(--sa-heading);
841
+ color: var(--sa-color-fg-heading);
830
842
  }
831
843
 
832
- .sa-plan-list-cell--tenants {
844
+ .sa-plan-list-row > .sa-plan-list-cell--tenants {
833
845
  display: flex;
846
+ flex-direction: row;
847
+ justify-content: flex-start;
834
848
  align-items: center;
835
849
  gap: 10px;
836
850
  }
837
851
  .sa-plan-list-tenant-num {
838
- font-size: 16px;
852
+ font-size: var(--sa-text-lg);
839
853
  font-weight: 700;
840
- color: var(--sa-heading);
854
+ color: var(--sa-color-fg-heading);
841
855
  }
842
856
  .sa-plan-list-tenant-bar {
843
857
  flex: 1;
844
858
  height: 6px;
845
- background: var(--sa-border-soft);
859
+ background: var(--sa-color-border-soft);
846
860
  border-radius: 999px;
847
861
  overflow: hidden;
848
862
  }
@@ -850,9 +864,11 @@ function hasAnyPublished(row: ResolvedPlan<PlanRow, PlanVersionRow>): boolean {
850
864
  height: 100%;
851
865
  }
852
866
 
853
- .sa-plan-list-cell--actions {
867
+ .sa-plan-list-row > .sa-plan-list-cell--actions {
854
868
  display: flex;
855
- gap: 4px;
869
+ flex-direction: row;
870
+ align-items: center;
856
871
  justify-content: flex-end;
872
+ gap: 4px;
857
873
  }
858
874
  </style>