@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.
- package/dist/{catalog-BY_t9prv.d.cts → catalog-DJcfm5N2.d.cts} +20 -7
- package/dist/{catalog-BY_t9prv.d.ts → catalog-DJcfm5N2.d.ts} +20 -7
- package/dist/{chunk-JN6HZGLV.js → chunk-F7NRM6KI.js} +54 -28
- package/dist/{chunk-7IFKVGZV.js → chunk-LY52T4N4.js} +21 -2
- package/dist/{chunk-OTP3OSSW.js → chunk-XMMFN2WJ.js} +74 -3
- package/dist/client/index.cjs +132 -29
- package/dist/client/index.d.cts +53 -3
- package/dist/client/index.d.ts +53 -3
- package/dist/client/index.js +14 -2
- package/dist/index.cjs +319 -162
- package/dist/index.d.cts +30 -8
- package/dist/index.d.ts +30 -8
- package/dist/index.js +176 -133
- package/dist/quasar/index.cjs +76 -29
- package/dist/quasar/index.d.cts +2 -2
- package/dist/quasar/index.d.ts +2 -2
- package/dist/quasar/index.js +6 -2
- package/dist/testing-e2e/admin-pages-suite.d.cts +37 -0
- package/dist/testing-e2e/admin-pages-suite.d.ts +37 -0
- package/dist/{use-super-admin-i18n-c_Eqsu9u.d.ts → use-super-admin-i18n-CHNdsSlm.d.ts} +34 -7
- package/dist/{use-super-admin-i18n-DlJRGIVq.d.cts → use-super-admin-i18n-CgTuNi8h.d.cts} +34 -7
- package/package.json +18 -8
- package/src/client/i18n/messages/bundles.ts +0 -2
- package/src/client/i18n/messages/common.ts +22 -0
- package/src/client/i18n/messages/discovery.ts +2 -2
- package/src/client/i18n/messages/marketing.ts +2 -4
- package/src/client/i18n/messages/plan-detail.ts +0 -4
- package/src/client/i18n/messages/plans.ts +20 -8
- package/src/client/i18n/messages/tenants.ts +0 -2
- package/src/client/index.ts +1 -0
- package/src/client/manifest-loader.ts +1 -1
- package/src/client/resolve-plans.ts +144 -0
- package/src/components/BundleVersionPublishDialog.vue +6 -6
- package/src/components/KvBlock.vue +4 -4
- package/src/components/MarketingPromotionsTab.vue +34 -48
- package/src/components/MfaPromptDialog.vue +8 -2
- package/src/components/TenantActionConfirmDialog.vue +4 -4
- package/src/components/VersionDiffPreview.vue +7 -7
- package/src/components/admin-page/AdminFilters.vue +12 -0
- package/src/components/admin-page/AdminHero.vue +22 -5
- package/src/components/admin-page/AdminKpi.vue +84 -0
- package/src/components/admin-page/AdminPaginator.vue +195 -0
- package/src/components/admin-page/AdminRefreshBtn.vue +39 -0
- package/src/components/admin-page/AdminSection.vue +31 -16
- package/src/components/admin-page/AdminStatistics.vue +40 -0
- package/src/components/admin-page/AdminTable.vue +175 -0
- package/src/components/bundle-editor/BundleCreatePanel.vue +23 -23
- package/src/components/bundle-editor/BundleFeaturesEditor.vue +7 -7
- package/src/components/bundle-editor/BundlePlanCompatPicker.vue +9 -9
- package/src/components/bundle-editor/BundleQuotasEditor.vue +11 -11
- package/src/components/bundle-editor/BundleStatusBanner.vue +6 -6
- package/src/components/bundle-editor/BundleVersionInlineEditor.vue +18 -18
- package/src/components/bundle-editor/BundleVersionStrip.vue +12 -12
- package/src/components/dialogs/PilotCreateDialog.vue +12 -12
- package/src/components/dialogs/PilotEditDialog.vue +7 -7
- package/src/components/dialogs/PromoCodeCreateDialog.vue +8 -8
- package/src/components/dialogs/PromoCodeDialogFields.vue +33 -19
- package/src/components/dialogs/PromoCodeEditDialog.vue +10 -10
- package/src/components/plan/PlanGrid.vue +1 -1
- package/src/components/plan-create-dialog/PlanCreateDialog.vue +34 -46
- package/src/components/plan-detail/PlanDetail.vue +92 -302
- package/src/components/plan-detail/PlanDetailKpis.vue +22 -27
- package/src/components/plan-detail/PlanTitleEdit.vue +133 -0
- package/src/components/plan-list/PlanList.vue +72 -290
- package/src/components/plan-matrix/PlanMatrix.vue +66 -183
- package/src/components/plan-review/PlanReview.vue +191 -275
- package/src/components/plan-version-editor/PlanCatalogPreview.vue +7 -5
- package/src/components/plan-version-editor/PlanVersionEditor.vue +200 -295
- package/src/components/plan-version-editor/PlanVersionEditorHeader.vue +23 -55
- package/src/index.ts +1 -0
- package/src/pages-standard/AdminLayout.vue +34 -10
- package/src/pages-standard/AdminManifestErrorPage.vue +79 -9
- package/src/pages-standard/AuditPage.vue +53 -72
- package/src/pages-standard/BundlesPage.vue +128 -144
- package/src/pages-standard/DashboardPage.vue +43 -107
- package/src/pages-standard/DiscoveryPage.vue +158 -200
- package/src/pages-standard/EmailHistoryPage.vue +98 -88
- package/src/pages-standard/MarketingCatalogPage.vue +237 -267
- package/src/pages-standard/PilotsPage.vue +44 -60
- package/src/pages-standard/PlansPage.vue +230 -105
- package/src/pages-standard/PlatformEmailPage.vue +37 -40
- package/src/pages-standard/PromoCodeDetailPage.vue +16 -30
- package/src/pages-standard/PromoCodesPage.vue +86 -112
- package/src/pages-standard/SubscriptionsPage.vue +10 -17
- package/src/pages-standard/SuperAdminLoginPage.vue +12 -12
- package/src/pages-standard/SuperAdminSetupWizard.vue +20 -17
- package/src/pages-standard/TenantDetailPage.vue +45 -41
- package/src/pages-standard/TenantsPage.vue +184 -264
- package/src/pages-standard/UsersPage.vue +69 -104
- package/src/pages-standard/bundles-page/BundleAccordionList.vue +20 -17
- package/src/pages-standard/bundles-page/BundlesKpis.vue +13 -22
- package/src/pages-standard/bundles-page/BundlesToolbar.vue +6 -10
- package/src/pages-standard/discovery-page/CatalogEntryTransPanel.vue +10 -10
- package/src/pages-standard/discovery-page/DiscoveryCapList.vue +5 -5
- package/src/pages-standard/discovery-page/DiscoveryFeatureCard.vue +16 -16
- package/src/pages-standard/discovery-page/DiscoveryKpis.vue +31 -27
- package/src/pages-standard/discovery-page/DiscoveryQuotaCard.vue +7 -7
- package/src/pages-standard/marketing-catalog/MarketingCatalogAdmin.vue +1 -1
- package/src/pages-standard/marketing-catalog/MarketingCatalogHeader.vue +2 -13
- package/src/pages-standard/plan-versions/PlanDiffCard.vue +6 -6
- package/src/pages-standard/plan-versions/PlanVersionsDiff.vue +6 -6
- package/src/pages-standard/plan-versions/PlanVersionsTimeline.vue +16 -16
- package/src/pages-standard/plans-page/PlanBundleOverview.vue +14 -29
- package/src/pages-standard/plans-page/PlanPublishDialog.vue +1 -1
- package/src/pages-standard/plans-page/PlansPageToast.vue +1 -1
- package/src/pages-standard/sa-theme.css +481 -71
- package/src/pages-standard/tenant-detail/TenantUsers.vue +2 -8
- package/src/pages-standard/tenants/StatusPill.vue +2 -2
- package/src/pages-tenant/MySubscriptionBundlesPage.vue +25 -25
- package/src/pages-tenant/OnboardingConfigurator.vue +1 -5
- package/src/pages-tenant/PackageSnapshotPanel.vue +1 -1
- package/src/pages-tenant/TenantPlanSection.vue +12 -20
- package/src/quasar/create-super-admin-app.ts +4 -0
- package/src/vue/entitlement-provider.ts +0 -1
- package/src/vue/feature-router-guard.ts +0 -1
- package/src/vue/super-admin-context.ts +106 -1
- package/src/vue/use-api-list.ts +2 -1
- package/src/vue/use-pagination.ts +63 -0
- package/src/vue/use-plans.ts +1 -2
- package/src/vue/use-sign-out.ts +90 -0
- package/src/vue/use-tenant-billing.ts +1 -1
- package/src/vue/use-tenant-manifest.ts +0 -1
- package/src/components/KpiCard.vue +0 -53
- package/src/components/plan-cockpit/PlanCockpit.vue +0 -1027
- package/src/components/plan-cockpit/PlanCockpitAuditLog.vue +0 -72
- package/src/components/plan-cockpit/PlanCockpitDiffPanel.vue +0 -99
- package/src/components/plan-cockpit/PlanCockpitHeader.vue +0 -101
- package/src/components/plan-cockpit/PlanCockpitImpactPanel.vue +0 -112
- package/src/components/plan-cockpit/PlanCockpitKpis.vue +0 -68
- package/src/components/plan-cockpit/PlanCockpitVersions.vue +0 -249
- package/src/components/plan-cockpit/types.ts +0 -72
- package/src/components/plan-detail/PlanDetailHeader.vue +0 -194
|
@@ -1,25 +1,14 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<div
|
|
3
|
-
<
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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
|
|
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-
|
|
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(--
|
|
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:
|
|
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:
|
|
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:
|
|
507
|
-
color: var(--
|
|
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:
|
|
456
|
+
background: var(--sa-positive-bg);
|
|
512
457
|
color: #047857;
|
|
513
458
|
border-color: #a7f3d0;
|
|
514
459
|
}
|
|
515
460
|
.chip.draft {
|
|
516
|
-
background:
|
|
461
|
+
background: var(--sa-warning-bg);
|
|
517
462
|
color: #b45309;
|
|
518
463
|
border-color: #fde68a;
|
|
519
464
|
}
|
|
520
465
|
.chip.supersed {
|
|
521
|
-
background:
|
|
522
|
-
color:
|
|
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
|
|
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(--
|
|
506
|
+
color: var(--sa-heading);
|
|
714
507
|
}
|
|
715
508
|
.pd-panel-sub {
|
|
716
509
|
font-size: 11.5px;
|
|
717
|
-
color:
|
|
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:
|
|
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:
|
|
751
|
-
border: 1px solid
|
|
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-
|
|
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:
|
|
781
|
-
color:
|
|
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:
|
|
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:
|
|
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
|
|
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:
|
|
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
|
|
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(--
|
|
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:
|
|
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-
|
|
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:
|
|
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:
|
|
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-
|
|
715
|
+
font: 600 13px var(--sa-font-body);
|
|
923
716
|
}
|
|
924
717
|
.pd-pricing-y {
|
|
925
|
-
font: 500 10.5px var(--font-
|
|
926
|
-
color:
|
|
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-
|
|
723
|
+
font: 700 14px var(--sa-font-body);
|
|
931
724
|
}
|
|
932
725
|
.pd-impact-sub {
|
|
933
726
|
font-size: 10.5px;
|
|
934
|
-
color:
|
|
727
|
+
color: var(--sa-muted-light);
|
|
935
728
|
}
|
|
936
729
|
.pd-change-note {
|
|
937
|
-
color:
|
|
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:
|
|
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:
|
|
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:
|
|
983
|
-
color:
|
|
984
|
-
border: 1px solid
|
|
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,
|
|
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,
|
|
1012
|
-
border-color:
|
|
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-
|
|
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:
|
|
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:
|
|
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(--
|
|
842
|
+
color: var(--sa-heading);
|
|
1050
843
|
}
|
|
1051
844
|
.pd-diff-key {
|
|
1052
|
-
font: 500 11px var(--font-mono);
|
|
1053
|
-
color:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
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:
|
|
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:
|
|
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
|
|
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:
|
|
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:
|
|
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(--
|
|
973
|
+
background: var(--sa-heading);
|
|
1181
974
|
color: #fff;
|
|
1182
975
|
display: grid;
|
|
1183
976
|
place-items: center;
|
|
1184
|
-
font: 700 11px var(--font-
|
|
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(--
|
|
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(--
|
|
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>
|