@saasicat/ui-vue 0.19.0 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{catalog-JXdKdIqG.d.cts → catalog-DJcfm5N2.d.cts} +21 -7
- package/dist/{catalog-JXdKdIqG.d.ts → catalog-DJcfm5N2.d.ts} +21 -7
- package/dist/{chunk-DPTIOQXX.js → chunk-F7NRM6KI.js} +56 -28
- package/dist/{chunk-RVG6LQHL.js → chunk-LY52T4N4.js} +21 -2
- package/dist/{chunk-ORX3ZG47.js → chunk-XMMFN2WJ.js} +74 -3
- package/dist/client/index.cjs +134 -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 +321 -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 +78 -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-BlqcD0N7.d.ts → use-super-admin-i18n-CHNdsSlm.d.ts} +34 -7
- package/dist/{use-super-admin-i18n-1nCOkvgi.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 +24 -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/AdminBody.vue +40 -0
- package/src/components/admin-page/AdminFilters.vue +12 -0
- package/src/components/admin-page/AdminHero.vue +49 -0
- package/src/components/admin-page/AdminKpi.vue +84 -0
- package/src/components/admin-page/AdminPage.vue +16 -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 +53 -0
- 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/PlanAuditLog.vue +7 -8
- package/src/components/plan-detail/PlanDetail.vue +95 -292
- package/src/components/plan-detail/PlanDetailKpis.vue +22 -27
- package/src/components/plan-detail/PlanTitleEdit.vue +133 -0
- package/src/components/plan-detail/PlanVersionDiffPanel.vue +5 -8
- package/src/components/plan-detail/PlanVersionsPanel.vue +9 -11
- package/src/components/plan-list/PlanList.vue +206 -457
- 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 +38 -12
- package/src/pages-standard/AdminManifestErrorPage.vue +79 -9
- package/src/pages-standard/AuditPage.vue +65 -109
- package/src/pages-standard/BundlesPage.vue +146 -179
- package/src/pages-standard/DashboardPage.vue +59 -154
- package/src/pages-standard/DiscoveryPage.vue +172 -227
- package/src/pages-standard/EmailHistoryPage.vue +118 -159
- package/src/pages-standard/MarketingCatalogPage.vue +399 -440
- package/src/pages-standard/PilotsPage.vue +69 -117
- package/src/pages-standard/PlansPage.vue +240 -112
- package/src/pages-standard/PlatformEmailPage.vue +56 -91
- package/src/pages-standard/PromoCodeDetailPage.vue +49 -74
- package/src/pages-standard/PromoCodesPage.vue +95 -128
- package/src/pages-standard/SubscriptionsPage.vue +19 -52
- package/src/pages-standard/SuperAdminLoginPage.vue +12 -12
- package/src/pages-standard/SuperAdminSetupWizard.vue +22 -18
- package/src/pages-standard/TenantDetailPage.vue +100 -191
- package/src/pages-standard/TenantsPage.vue +190 -295
- package/src/pages-standard/UsersPage.vue +89 -157
- 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 +63 -0
- 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 +111 -73
- package/src/pages-standard/marketing-catalog/MarketingCatalogHeader.vue +43 -62
- package/src/pages-standard/marketing-catalog/MarketingCatalogPreview.vue +53 -35
- package/src/pages-standard/marketing-catalog/MarketingCatalogToolbar.vue +7 -7
- 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 +6 -6
- package/src/pages-standard/sa-theme.css +552 -86
- package/src/pages-standard/tenant-detail/TenantMasterData.vue +28 -0
- package/src/pages-standard/tenant-detail/TenantUsage.vue +31 -0
- package/src/pages-standard/tenant-detail/TenantUsers.vue +15 -0
- package/src/pages-standard/tenant-detail/types.ts +38 -0
- 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-mfa-prompt.ts +72 -0
- 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 -1012
- package/src/components/plan-cockpit/PlanCockpitAuditLog.vue +0 -72
- package/src/components/plan-cockpit/PlanCockpitDiffPanel.vue +0 -100
- 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 -251
- package/src/components/plan-cockpit/types.ts +0 -72
- package/src/components/plan-detail/PlanDetailHeader.vue +0 -194
- package/src/pages-standard/bundles-page/BundlesHeader.vue +0 -68
- package/src/pages-standard/discovery-page/DiscoveryHeader.vue +0 -34
|
@@ -1,123 +1,135 @@
|
|
|
1
1
|
<template>
|
|
2
|
-
<
|
|
3
|
-
<
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
:feature-registry="featureRegistryResolved"
|
|
43
|
-
:quota-registry="quotaRegistryResolved"
|
|
44
|
-
:existing-bundle-keys="existingBundleKeys"
|
|
45
|
-
:create="create"
|
|
46
|
-
:create-draft="createDraft"
|
|
47
|
-
@cancel="createOpen = false"
|
|
48
|
-
@created="onWizardCreated"
|
|
49
|
-
/>
|
|
2
|
+
<AdminPage class="sa-bundles">
|
|
3
|
+
<AdminHero :title="msg.header.title" :subtitle="msg.header.subtitle">
|
|
4
|
+
<template #actions>
|
|
5
|
+
<BundlesToolbar
|
|
6
|
+
:loading="loading"
|
|
7
|
+
:display-locale="displayLocale"
|
|
8
|
+
:locales="locales"
|
|
9
|
+
@create="openCreatePanel"
|
|
10
|
+
@refresh="load"
|
|
11
|
+
@update:display-locale="(value) => (displayLocale = value)"
|
|
12
|
+
/>
|
|
13
|
+
</template>
|
|
14
|
+
</AdminHero>
|
|
15
|
+
|
|
16
|
+
<AdminBody>
|
|
17
|
+
<q-banner v-if="error" class="sa-bundles__error" rounded>
|
|
18
|
+
<template #avatar><q-icon name="warning" color="negative" /></template>
|
|
19
|
+
{{ loadErrorText }}
|
|
20
|
+
</q-banner>
|
|
21
|
+
|
|
22
|
+
<AdminSection>
|
|
23
|
+
<BundlesKpis
|
|
24
|
+
:bundles-total="bundles.length"
|
|
25
|
+
:live-count="liveCount"
|
|
26
|
+
:scheduled-bundles-count="scheduledBundlesCount"
|
|
27
|
+
:total-scheduled-versions="totalScheduledVersions"
|
|
28
|
+
:total-draft-versions="totalDraftVersions"
|
|
29
|
+
:draft-bundles-count="draftBundlesCount"
|
|
30
|
+
:translated-count="translatedCount"
|
|
31
|
+
:locales-count="locales.length"
|
|
32
|
+
/>
|
|
33
|
+
</AdminSection>
|
|
34
|
+
|
|
35
|
+
<AdminSection class="sa-bundles__filter">
|
|
36
|
+
<BundlesFilterBar
|
|
37
|
+
v-model:query="query"
|
|
38
|
+
v-model:status-filter="statusFilter"
|
|
39
|
+
class="q-mb-md"
|
|
40
|
+
:status-filter-options="statusFilterOptions"
|
|
41
|
+
/>
|
|
50
42
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
<template #avatar><q-icon name="info" color="info" /></template>
|
|
57
|
-
{{ msg.page.emptyBefore }} <strong>{{ msg.header.newBundle }}</strong>
|
|
58
|
-
{{ msg.page.emptyAfter }}
|
|
59
|
-
</q-banner>
|
|
60
|
-
|
|
61
|
-
<BundleAccordionList
|
|
62
|
-
:filtered-bundles="filteredBundles"
|
|
63
|
-
:bundles-total="bundles.length"
|
|
64
|
-
:open-key="openKey"
|
|
65
|
-
:aggregate-status-of="aggregateStatusOf"
|
|
66
|
-
:i18n-locale-count="i18nLocaleCount"
|
|
67
|
-
@toggle="toggle"
|
|
68
|
-
>
|
|
69
|
-
<template #detail="{ bundle }">
|
|
70
|
-
<BundleDetailPanel
|
|
71
|
-
:bundle="bundle"
|
|
72
|
-
v-model:edit-form="editForm"
|
|
73
|
-
:i18n-draft="i18nDraft"
|
|
74
|
-
:translatable-locales="translatableLocales"
|
|
75
|
-
:edit-submitting="editSubmitting"
|
|
76
|
-
:detail-versions="detailVersions"
|
|
77
|
-
:selected-version-id="selectedVersionIdByBundle[bundle.id] ?? null"
|
|
78
|
-
:selected-version="selectedVersion"
|
|
43
|
+
<!-- Inline creation (collapsible panel, replaces the former dialog modal) -->
|
|
44
|
+
<BundleCreatePanel
|
|
45
|
+
v-if="createOpen"
|
|
46
|
+
class="q-mb-sm"
|
|
47
|
+
:project-key="projectKey"
|
|
79
48
|
:available-features="snapshot?.features ?? []"
|
|
80
49
|
:available-quotas="snapshot?.quotas ?? []"
|
|
81
50
|
:plans="plans"
|
|
82
51
|
:live-plan-versions="livePlanVersions"
|
|
83
52
|
:feature-registry="featureRegistryResolved"
|
|
84
53
|
:quota-registry="quotaRegistryResolved"
|
|
85
|
-
:
|
|
86
|
-
:
|
|
87
|
-
|
|
88
|
-
@
|
|
89
|
-
@
|
|
90
|
-
@add-version="onAddVersion"
|
|
91
|
-
@inline-save="onInlineSave"
|
|
92
|
-
@discard-version="onDiscardVersion"
|
|
93
|
-
@publish-version="openPublish"
|
|
94
|
-
@delete-bundle="confirmDelete"
|
|
54
|
+
:existing-bundle-keys="existingBundleKeys"
|
|
55
|
+
:create="create"
|
|
56
|
+
:create-draft="createDraft"
|
|
57
|
+
@cancel="createOpen = false"
|
|
58
|
+
@created="onWizardCreated"
|
|
95
59
|
/>
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
60
|
+
|
|
61
|
+
<q-banner
|
|
62
|
+
v-if="bundles.length === 0 && !loading && !error"
|
|
63
|
+
class="sa-bundles__empty"
|
|
64
|
+
rounded
|
|
65
|
+
>
|
|
66
|
+
<template #avatar><q-icon name="info" color="info" /></template>
|
|
67
|
+
{{ msg.page.emptyBefore }} <strong>{{ msg.header.newBundle }}</strong>
|
|
68
|
+
{{ msg.page.emptyAfter }}
|
|
69
|
+
</q-banner>
|
|
70
|
+
|
|
71
|
+
<BundleAccordionList
|
|
72
|
+
:filtered-bundles="filteredBundles"
|
|
73
|
+
:bundles-total="bundles.length"
|
|
74
|
+
:open-key="openKey"
|
|
75
|
+
:aggregate-status-of="aggregateStatusOf"
|
|
76
|
+
:i18n-locale-count="i18nLocaleCount"
|
|
77
|
+
@toggle="toggle"
|
|
78
|
+
>
|
|
79
|
+
<template #detail="{ bundle }">
|
|
80
|
+
<BundleDetailPanel
|
|
81
|
+
v-model:edit-form="editForm"
|
|
82
|
+
:bundle="bundle"
|
|
83
|
+
:i18n-draft="i18nDraft"
|
|
84
|
+
:translatable-locales="translatableLocales"
|
|
85
|
+
:edit-submitting="editSubmitting"
|
|
86
|
+
:detail-versions="detailVersions"
|
|
87
|
+
:selected-version-id="selectedVersionIdByBundle[bundle.id] ?? null"
|
|
88
|
+
:selected-version="selectedVersion"
|
|
89
|
+
:available-features="snapshot?.features ?? []"
|
|
90
|
+
:available-quotas="snapshot?.quotas ?? []"
|
|
91
|
+
:plans="plans"
|
|
92
|
+
:live-plan-versions="livePlanVersions"
|
|
93
|
+
:feature-registry="featureRegistryResolved"
|
|
94
|
+
:quota-registry="quotaRegistryResolved"
|
|
95
|
+
:inline-editor-saving="inlineEditorSaving"
|
|
96
|
+
:inline-editor-error="inlineEditorError"
|
|
97
|
+
@set-i18n="setI18n"
|
|
98
|
+
@submit-edit="submitEdit"
|
|
99
|
+
@select-version="onSelectVersion"
|
|
100
|
+
@add-version="onAddVersion"
|
|
101
|
+
@inline-save="onInlineSave"
|
|
102
|
+
@discard-version="onDiscardVersion"
|
|
103
|
+
@publish-version="openPublish"
|
|
104
|
+
@delete-bundle="confirmDelete"
|
|
105
|
+
/>
|
|
106
|
+
</template>
|
|
107
|
+
</BundleAccordionList>
|
|
108
|
+
</AdminSection>
|
|
109
|
+
|
|
110
|
+
<!-- Strict mode warnings after the last mutation -->
|
|
111
|
+
<q-banner
|
|
112
|
+
v-if="lastWarnings.length > 0"
|
|
113
|
+
class="sa-bundles__warnings-banner"
|
|
114
|
+
inline-actions
|
|
115
|
+
rounded
|
|
116
|
+
>
|
|
117
|
+
<template #avatar><q-icon name="warning" color="warning" /></template>
|
|
118
|
+
<strong>{{ strictWarningsText }}</strong>
|
|
119
|
+
<ul class="sa-bundles__warnings-list">
|
|
120
|
+
<li v-for="(w, i) in lastWarnings" :key="i">
|
|
121
|
+
<code>{{ w.code }}</code>
|
|
122
|
+
<template v-if="w.value">
|
|
123
|
+
· <code>{{ w.value }}</code></template
|
|
124
|
+
>
|
|
125
|
+
— {{ w.message }}
|
|
126
|
+
</li>
|
|
127
|
+
</ul>
|
|
128
|
+
<template #action>
|
|
129
|
+
<q-btn flat dense :label="common.close" @click="lastWarnings = []" />
|
|
130
|
+
</template>
|
|
131
|
+
</q-banner>
|
|
132
|
+
</AdminBody>
|
|
121
133
|
|
|
122
134
|
<!-- Publish confirmation modal -->
|
|
123
135
|
<BundleVersionPublishDialog
|
|
@@ -131,7 +143,7 @@
|
|
|
131
143
|
:submit="onPublishSubmit"
|
|
132
144
|
@submitted="onPublishSubmitted"
|
|
133
145
|
/>
|
|
134
|
-
</
|
|
146
|
+
</AdminPage>
|
|
135
147
|
</template>
|
|
136
148
|
|
|
137
149
|
<script setup lang="ts">
|
|
@@ -174,7 +186,11 @@ import { useSaMessages } from '../vue/use-super-admin-i18n.js';
|
|
|
174
186
|
import BundleAccordionList from './bundles-page/BundleAccordionList.vue';
|
|
175
187
|
import BundleDetailPanel from './bundles-page/BundleDetailPanel.vue';
|
|
176
188
|
import BundlesFilterBar from './bundles-page/BundlesFilterBar.vue';
|
|
177
|
-
import
|
|
189
|
+
import AdminBody from '../components/admin-page/AdminBody.vue';
|
|
190
|
+
import AdminHero from '../components/admin-page/AdminHero.vue';
|
|
191
|
+
import AdminSection from '../components/admin-page/AdminSection.vue';
|
|
192
|
+
import AdminPage from '../components/admin-page/AdminPage.vue';
|
|
193
|
+
import BundlesToolbar from './bundles-page/BundlesToolbar.vue';
|
|
178
194
|
import BundlesKpis from './bundles-page/BundlesKpis.vue';
|
|
179
195
|
import type {
|
|
180
196
|
BundleEditForm,
|
|
@@ -182,7 +198,7 @@ import type {
|
|
|
182
198
|
BundlesStatusFilterOption,
|
|
183
199
|
} from './bundles-page/types.js';
|
|
184
200
|
|
|
185
|
-
// Platform standard page: Bundles (
|
|
201
|
+
// Platform standard page: Bundles (§11.1 M6 Pack 2c +
|
|
186
202
|
// Pack 2d inline editor after plan simulation). Dumb component —
|
|
187
203
|
// the consumer wrapper supplies the composable results + plan-root
|
|
188
204
|
// list + live PlanVersion index as props.
|
|
@@ -643,65 +659,16 @@ const classifyDiff = computed(() => props.classifyDiff);
|
|
|
643
659
|
|
|
644
660
|
<style>
|
|
645
661
|
.sa-bundles {
|
|
646
|
-
padding: 16px;
|
|
647
662
|
display: flex;
|
|
648
663
|
flex-direction: column;
|
|
649
664
|
gap: 14px;
|
|
650
665
|
}
|
|
651
|
-
.sa-bundles__head {
|
|
652
|
-
display: flex;
|
|
653
|
-
justify-content: space-between;
|
|
654
|
-
align-items: flex-end;
|
|
655
|
-
gap: 16px;
|
|
656
|
-
}
|
|
657
|
-
.sa-bundles__title {
|
|
658
|
-
font-size: 20px;
|
|
659
|
-
font-weight: 700;
|
|
660
|
-
margin: 0;
|
|
661
|
-
}
|
|
662
|
-
.sa-bundles__sub {
|
|
663
|
-
margin: 4px 0 0;
|
|
664
|
-
color: #64748b;
|
|
665
|
-
font-size: 12px;
|
|
666
|
-
max-width: 560px;
|
|
667
|
-
}
|
|
668
|
-
.sa-bundles__head-actions {
|
|
669
|
-
display: flex;
|
|
670
|
-
align-items: center;
|
|
671
|
-
gap: 12px;
|
|
672
|
-
}
|
|
673
666
|
.sa-bundles__error {
|
|
674
667
|
border-left: 4px solid #dc2626;
|
|
675
668
|
}
|
|
676
669
|
.sa-bundles__empty {
|
|
677
670
|
border-left: 4px solid #31ccec;
|
|
678
671
|
}
|
|
679
|
-
.sa-bundles__kpis {
|
|
680
|
-
display: grid;
|
|
681
|
-
/* Responsive: as many KPIs as fit (up to 4), then 3 → 2 → 1. */
|
|
682
|
-
grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
|
|
683
|
-
gap: 10px;
|
|
684
|
-
}
|
|
685
|
-
.sa-bundles__kpi {
|
|
686
|
-
background: #fff;
|
|
687
|
-
border: 1px solid #e2e8f0;
|
|
688
|
-
border-radius: 10px;
|
|
689
|
-
padding: 12px 14px;
|
|
690
|
-
}
|
|
691
|
-
.sa-bundles__kpi-label {
|
|
692
|
-
font-size: 10px;
|
|
693
|
-
text-transform: uppercase;
|
|
694
|
-
letter-spacing: 0.5px;
|
|
695
|
-
color: #64748b;
|
|
696
|
-
}
|
|
697
|
-
.sa-bundles__kpi-value {
|
|
698
|
-
font-size: 26px;
|
|
699
|
-
font-weight: 700;
|
|
700
|
-
}
|
|
701
|
-
.sa-bundles__kpi-sub {
|
|
702
|
-
font-size: 11px;
|
|
703
|
-
color: #94a3b8;
|
|
704
|
-
}
|
|
705
672
|
.sa-bundles__filter-row {
|
|
706
673
|
display: flex;
|
|
707
674
|
align-items: center;
|
|
@@ -722,7 +689,7 @@ const classifyDiff = computed(() => props.classifyDiff);
|
|
|
722
689
|
}
|
|
723
690
|
.sa-bd-card {
|
|
724
691
|
background: #fff;
|
|
725
|
-
border: 1px solid
|
|
692
|
+
border: 1px solid var(--sa-border);
|
|
726
693
|
border-radius: 10px;
|
|
727
694
|
overflow: hidden;
|
|
728
695
|
}
|
|
@@ -740,8 +707,8 @@ const classifyDiff = computed(() => props.classifyDiff);
|
|
|
740
707
|
width: 34px;
|
|
741
708
|
height: 34px;
|
|
742
709
|
border-radius: 8px;
|
|
743
|
-
background:
|
|
744
|
-
color:
|
|
710
|
+
background: var(--sa-primary-50);
|
|
711
|
+
color: var(--sa-primary-strong);
|
|
745
712
|
display: flex;
|
|
746
713
|
align-items: center;
|
|
747
714
|
justify-content: center;
|
|
@@ -768,19 +735,19 @@ const classifyDiff = computed(() => props.classifyDiff);
|
|
|
768
735
|
}
|
|
769
736
|
.sa-bd-card__desc {
|
|
770
737
|
font-size: 12px;
|
|
771
|
-
color:
|
|
738
|
+
color: var(--sa-muted);
|
|
772
739
|
}
|
|
773
740
|
.sa-bd-card__chev {
|
|
774
741
|
transition: transform 0.15s;
|
|
775
|
-
color:
|
|
742
|
+
color: var(--sa-muted-light);
|
|
776
743
|
}
|
|
777
744
|
.sa-bd-card__chev.open {
|
|
778
745
|
transform: rotate(90deg);
|
|
779
746
|
}
|
|
780
747
|
.sa-bd-card__body {
|
|
781
|
-
border-top: 1px solid
|
|
748
|
+
border-top: 1px solid var(--sa-border);
|
|
782
749
|
padding: 14px;
|
|
783
|
-
background:
|
|
750
|
+
background: var(--sa-bg-surface-2);
|
|
784
751
|
}
|
|
785
752
|
.sa-bd-grid {
|
|
786
753
|
display: grid;
|
|
@@ -811,7 +778,7 @@ const classifyDiff = computed(() => props.classifyDiff);
|
|
|
811
778
|
font-weight: 700;
|
|
812
779
|
text-transform: uppercase;
|
|
813
780
|
letter-spacing: 0.5px;
|
|
814
|
-
color:
|
|
781
|
+
color: var(--sa-muted-dark);
|
|
815
782
|
display: flex;
|
|
816
783
|
justify-content: space-between;
|
|
817
784
|
}
|
|
@@ -819,7 +786,7 @@ const classifyDiff = computed(() => props.classifyDiff);
|
|
|
819
786
|
margin-top: 10px;
|
|
820
787
|
}
|
|
821
788
|
.sa-bd-section-count {
|
|
822
|
-
color:
|
|
789
|
+
color: var(--sa-muted-light);
|
|
823
790
|
font-weight: 600;
|
|
824
791
|
}
|
|
825
792
|
.sa-bundles__form {
|
|
@@ -829,14 +796,14 @@ const classifyDiff = computed(() => props.classifyDiff);
|
|
|
829
796
|
}
|
|
830
797
|
.sa-bd-i18n-hint {
|
|
831
798
|
font-size: 11px;
|
|
832
|
-
color:
|
|
799
|
+
color: var(--sa-muted-light);
|
|
833
800
|
}
|
|
834
801
|
.sa-bd-i18n-block {
|
|
835
802
|
display: flex;
|
|
836
803
|
flex-direction: column;
|
|
837
804
|
gap: 6px;
|
|
838
805
|
padding: 8px;
|
|
839
|
-
border: 1px solid
|
|
806
|
+
border: 1px solid var(--sa-border);
|
|
840
807
|
border-radius: 8px;
|
|
841
808
|
background: #fff;
|
|
842
809
|
}
|
|
@@ -848,7 +815,7 @@ const classifyDiff = computed(() => props.classifyDiff);
|
|
|
848
815
|
.sa-bd-i18n-code {
|
|
849
816
|
font-size: 10px;
|
|
850
817
|
font-weight: 700;
|
|
851
|
-
background:
|
|
818
|
+
background: var(--sa-border-soft);
|
|
852
819
|
padding: 2px 7px;
|
|
853
820
|
border-radius: 5px;
|
|
854
821
|
}
|
|
@@ -869,7 +836,7 @@ const classifyDiff = computed(() => props.classifyDiff);
|
|
|
869
836
|
gap: 10px;
|
|
870
837
|
align-items: flex-start;
|
|
871
838
|
background: #fff;
|
|
872
|
-
border: 1px solid
|
|
839
|
+
border: 1px solid var(--sa-border);
|
|
873
840
|
border-radius: 8px;
|
|
874
841
|
padding: 10px;
|
|
875
842
|
}
|
|
@@ -884,7 +851,7 @@ const classifyDiff = computed(() => props.classifyDiff);
|
|
|
884
851
|
}
|
|
885
852
|
.sa-bd-version__sub {
|
|
886
853
|
font-size: 11px;
|
|
887
|
-
color:
|
|
854
|
+
color: var(--sa-muted);
|
|
888
855
|
margin: 2px 0;
|
|
889
856
|
}
|
|
890
857
|
.sa-bd-version__feats {
|
|
@@ -894,7 +861,7 @@ const classifyDiff = computed(() => props.classifyDiff);
|
|
|
894
861
|
}
|
|
895
862
|
.sa-bd-feat-chip {
|
|
896
863
|
font-size: 10px;
|
|
897
|
-
background:
|
|
864
|
+
background: var(--sa-border-soft);
|
|
898
865
|
padding: 2px 6px;
|
|
899
866
|
border-radius: 5px;
|
|
900
867
|
}
|
|
@@ -905,7 +872,7 @@ const classifyDiff = computed(() => props.classifyDiff);
|
|
|
905
872
|
.sa-bd-empty-row {
|
|
906
873
|
padding: 20px;
|
|
907
874
|
text-align: center;
|
|
908
|
-
color:
|
|
875
|
+
color: var(--sa-muted-light);
|
|
909
876
|
font-size: 12px;
|
|
910
877
|
border: 1px dashed #cbd5e1;
|
|
911
878
|
border-radius: 8px;
|