@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.
- package/README.md +1 -1
- package/dist/{chunk-LY52T4N4.js → chunk-TQQMKWN6.js} +58 -1
- package/dist/{chunk-XMMFN2WJ.js → chunk-VYMTWCTT.js} +51 -1
- package/dist/client/index.cjs +57 -0
- package/dist/client/index.d.cts +58 -1
- package/dist/client/index.d.ts +58 -1
- package/dist/client/index.js +15 -1
- package/dist/index.cjs +321 -159
- package/dist/index.d.cts +67 -4
- package/dist/index.d.ts +67 -4
- package/dist/index.js +72 -2
- package/dist/quasar/index.cjs +116 -20
- package/dist/quasar/index.d.cts +48 -3
- package/dist/quasar/index.d.ts +48 -3
- package/dist/quasar/index.js +58 -3
- package/dist/{use-super-admin-i18n-CgTuNi8h.d.cts → use-sa-theme-B5t7oXph.d.cts} +51 -1
- package/dist/{use-super-admin-i18n-CHNdsSlm.d.ts → use-sa-theme-OUBlaqgl.d.ts} +51 -1
- package/package.json +5 -2
- package/src/client/identity-accents.ts +129 -0
- package/src/client/index.ts +1 -0
- package/src/components/BundleVersionPublishDialog.vue +17 -17
- package/src/components/KvBlock.vue +6 -6
- package/src/components/MarketingPromotionsTab.vue +84 -80
- package/src/components/MfaPromptDialog.vue +2 -2
- package/src/components/TenantActionConfirmDialog.vue +5 -5
- package/src/components/VersionDiffPreview.vue +18 -18
- package/src/components/bundle-editor/BundleCreatePanel.vue +52 -52
- package/src/components/bundle-editor/BundleFeaturesEditor.vue +20 -20
- package/src/components/bundle-editor/BundlePlanCompatPicker.vue +33 -33
- package/src/components/bundle-editor/BundleQuotasEditor.vue +26 -26
- package/src/components/bundle-editor/BundleStatusBanner.vue +21 -21
- package/src/components/bundle-editor/BundleVersionInlineEditor.vue +49 -49
- package/src/components/bundle-editor/BundleVersionStrip.vue +30 -30
- package/src/components/dialogs/PilotCreateDialog.vue +20 -20
- package/src/components/dialogs/PilotEditDialog.vue +6 -6
- package/src/components/dialogs/PromoCodeCreateDialog.vue +9 -9
- package/src/components/dialogs/PromoCodeDialogFields.vue +64 -63
- package/src/components/dialogs/PromoCodeEditDialog.vue +11 -11
- package/src/components/dialogs/pilot-dialog.css +48 -48
- package/src/components/plan/PlanCycleToggle.vue +9 -16
- package/src/components/plan/PlanGrid.vue +30 -34
- package/src/components/plan/PriceSummary.vue +35 -35
- package/src/components/plan/PromoCodeInput.vue +26 -26
- package/src/components/plan/PublicBundleGrid.vue +32 -28
- package/src/components/plan-create-dialog/PlanCreateDialog.vue +50 -50
- package/src/components/plan-detail/PlanDetail.vue +178 -157
- package/src/components/plan-detail/PlanTitleEdit.vue +11 -11
- package/src/components/plan-list/PlanList.vue +116 -100
- package/src/components/plan-matrix/PlanMatrix.vue +97 -114
- package/src/components/plan-review/PlanReview.vue +61 -57
- package/src/components/plan-version-editor/PlanVersionEditor.vue +246 -203
- package/src/components/wizard-stepper/WizardStepper.vue +17 -17
- package/src/index.ts +1 -0
- package/src/pages-standard/AdminLayout.vue +58 -37
- package/src/pages-standard/AdminManifestErrorPage.vue +6 -6
- package/src/pages-standard/AuditPage.vue +3 -3
- package/src/pages-standard/BundlesPage.vue +37 -37
- package/src/pages-standard/DashboardPage.vue +22 -19
- package/src/pages-standard/DiscoveryPage.vue +55 -49
- package/src/pages-standard/EmailHistoryPage.vue +53 -71
- package/src/pages-standard/MarketingCatalogPage.vue +245 -221
- package/src/pages-standard/PilotsPage.vue +7 -6
- package/src/pages-standard/PlatformEmailPage.vue +18 -18
- package/src/pages-standard/PromoCodeDetailPage.vue +3 -3
- package/src/pages-standard/PromoCodesPage.vue +10 -7
- package/src/pages-standard/SuperAdminLoginPage.vue +39 -25
- package/src/pages-standard/SuperAdminSetupWizard.vue +44 -33
- package/src/pages-standard/TenantDetailPage.vue +7 -7
- package/src/pages-standard/TenantsPage.vue +16 -50
- package/src/pages-standard/bundles-page/BundleAccordionList.vue +13 -13
- package/src/pages-standard/discovery-page/CatalogEntryTransPanel.vue +24 -24
- package/src/pages-standard/discovery-page/DiscoveryCapList.vue +22 -22
- package/src/pages-standard/discovery-page/DiscoveryFeatureCard.vue +39 -39
- package/src/pages-standard/discovery-page/DiscoveryQuotaCard.vue +26 -26
- package/src/pages-standard/discovery-page/DiscoveryStatusControl.vue +1 -1
- package/src/pages-standard/discovery-page/discovery-ui.ts +10 -7
- package/src/pages-standard/marketing-catalog/MarketingCatalogAdmin.vue +2 -5
- package/src/pages-standard/plan-versions/PlanDiffCard.vue +27 -20
- package/src/pages-standard/plan-versions/PlanVersionsDiff.vue +24 -16
- package/src/pages-standard/plan-versions/PlanVersionsTimeline.vue +45 -45
- package/src/pages-standard/plans-page/PlanBundleOverview.vue +21 -15
- package/src/pages-standard/plans-page/PlanPublishDialog.vue +4 -4
- package/src/pages-standard/plans-page/PlansPageToast.vue +6 -6
- package/src/pages-standard/sa-theme.css +9 -687
- package/src/pages-standard/tenants/StatusPill.vue +13 -13
- package/src/pages-standard/tenants/format.ts +11 -12
- package/src/pages-tenant/LimitsRow.vue +4 -4
- package/src/pages-tenant/MySubscriptionBundlesPage.vue +70 -61
- package/src/pages-tenant/OnboardingConfigurator.vue +25 -25
- package/src/pages-tenant/PackageSnapshotPanel.vue +10 -16
- package/src/pages-tenant/PendingVersionBanner.vue +12 -12
- package/src/pages-tenant/PlanChangeWizard.vue +22 -76
- package/src/pages-tenant/TenantPlanSection.vue +19 -69
- package/src/pages-tenant/UsageBar.vue +7 -7
- package/src/pages-tenant/default-i18n.ts +113 -0
- package/src/pages-tenant/tenant-plan-section/BundlePreviewDialog.vue +14 -14
- package/src/pages-tenant/tenant-plan-section/TenantBundleStore.vue +10 -10
- package/src/pages-tenant/tenant-plan-section/TenantFeatureMatrix.vue +2 -2
- package/src/quasar/create-super-admin-app.ts +96 -1
- package/src/quasar/dark-bridge.ts +66 -0
- package/src/quasar/index.ts +1 -0
- package/src/ui/theme/_breakpoints.scss +34 -0
- package/src/ui/theme/base.css +50 -0
- package/src/ui/theme/components/body.css +23 -0
- package/src/ui/theme/components/button.css +158 -0
- package/src/ui/theme/components/card.css +74 -0
- package/src/ui/theme/components/field.css +38 -0
- package/src/ui/theme/components/hero.css +46 -0
- package/src/ui/theme/components/paginator.css +63 -0
- package/src/ui/theme/components/section.css +67 -0
- package/src/ui/theme/components/statistics.css +189 -0
- package/src/ui/theme/components/table.css +60 -0
- package/src/ui/theme/index.css +42 -0
- package/src/ui/theme/tokens.legacy.css +147 -0
- package/src/ui/theme/tokens.primitive.css +112 -0
- package/src/ui/theme/tokens.scale.css +103 -0
- package/src/ui/theme/tokens.semantic.dark.css +185 -0
- package/src/ui/theme/tokens.semantic.light.css +242 -0
- 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-
|
|
98
|
-
outline: 2px solid var(--sa-
|
|
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:
|
|
104
|
+
font-size: var(--sa-text-xs);
|
|
105
105
|
font-weight: 500;
|
|
106
|
-
color: var(--sa-warning);
|
|
107
|
-
background: var(--sa-warning-
|
|
108
|
-
border: 1px solid var(--sa-
|
|
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-
|
|
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-
|
|
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
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
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-
|
|
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:
|
|
586
|
-
color: var(--sa-
|
|
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
|
-
|
|
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
|
-
|
|
599
|
+
display: flex;
|
|
600
|
+
align-items: center;
|
|
601
|
+
background: var(--sa-color-bg-surface-raised);
|
|
600
602
|
padding: 10px 16px;
|
|
601
|
-
font-size:
|
|
603
|
+
font-size: var(--sa-text-xs);
|
|
602
604
|
text-transform: uppercase;
|
|
603
605
|
letter-spacing: 0.1em;
|
|
604
|
-
color: var(--sa-
|
|
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-
|
|
614
|
+
color: var(--sa-color-fg-subtle);
|
|
613
615
|
font-style: italic;
|
|
614
|
-
font-size:
|
|
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:
|
|
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-
|
|
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:
|
|
641
|
+
background: var(--sa-color-positive-surface-strong) !important;
|
|
635
642
|
}
|
|
636
643
|
100% {
|
|
637
|
-
background: var(--sa-positive-
|
|
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:
|
|
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
|
|
671
|
-
border-bottom: 1.5px solid
|
|
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:
|
|
690
|
+
font-size: var(--sa-text-md);
|
|
679
691
|
font-weight: 600;
|
|
680
|
-
color: var(--sa-
|
|
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:
|
|
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:
|
|
706
|
+
font-size: var(--sa-text-md);
|
|
695
707
|
font-weight: 600;
|
|
696
|
-
color: var(--sa-
|
|
708
|
+
color: var(--sa-color-fg-secondary);
|
|
697
709
|
}
|
|
698
710
|
.sa-plan-list-cell--sub-impact {
|
|
699
|
-
color: var(--sa-
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
766
|
+
font-size: var(--sa-text-xs);
|
|
755
767
|
font-weight: 600;
|
|
756
|
-
background: var(--sa-bg-
|
|
757
|
-
color: var(--sa-
|
|
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:
|
|
774
|
+
font-size: var(--sa-text-2xs);
|
|
763
775
|
}
|
|
764
776
|
.sa-plan-list-chip--new {
|
|
765
|
-
background:
|
|
766
|
-
color:
|
|
767
|
-
border-color:
|
|
768
|
-
font-size:
|
|
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-
|
|
772
|
-
color:
|
|
773
|
-
border-color:
|
|
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-
|
|
777
|
-
color:
|
|
778
|
-
border-color:
|
|
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-
|
|
783
|
-
border-color:
|
|
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:
|
|
787
|
-
color:
|
|
788
|
-
border-color:
|
|
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:
|
|
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:
|
|
816
|
+
color: var(--sa-color-fg-disabled);
|
|
805
817
|
}
|
|
806
818
|
.sa-plan-list-version-sub {
|
|
807
|
-
font-size:
|
|
808
|
-
color: var(--sa-
|
|
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:
|
|
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:
|
|
819
|
-
color: var(--sa-
|
|
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:
|
|
823
|
-
color: var(--sa-
|
|
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:
|
|
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:
|
|
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
|
-
|
|
869
|
+
flex-direction: row;
|
|
870
|
+
align-items: center;
|
|
856
871
|
justify-content: flex-end;
|
|
872
|
+
gap: 4px;
|
|
857
873
|
}
|
|
858
874
|
</style>
|