@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.
Files changed (145) hide show
  1. package/dist/{catalog-JXdKdIqG.d.cts → catalog-DJcfm5N2.d.cts} +21 -7
  2. package/dist/{catalog-JXdKdIqG.d.ts → catalog-DJcfm5N2.d.ts} +21 -7
  3. package/dist/{chunk-DPTIOQXX.js → chunk-F7NRM6KI.js} +56 -28
  4. package/dist/{chunk-RVG6LQHL.js → chunk-LY52T4N4.js} +21 -2
  5. package/dist/{chunk-ORX3ZG47.js → chunk-XMMFN2WJ.js} +74 -3
  6. package/dist/client/index.cjs +134 -29
  7. package/dist/client/index.d.cts +53 -3
  8. package/dist/client/index.d.ts +53 -3
  9. package/dist/client/index.js +14 -2
  10. package/dist/index.cjs +321 -162
  11. package/dist/index.d.cts +30 -8
  12. package/dist/index.d.ts +30 -8
  13. package/dist/index.js +176 -133
  14. package/dist/quasar/index.cjs +78 -29
  15. package/dist/quasar/index.d.cts +2 -2
  16. package/dist/quasar/index.d.ts +2 -2
  17. package/dist/quasar/index.js +6 -2
  18. package/dist/testing-e2e/admin-pages-suite.d.cts +37 -0
  19. package/dist/testing-e2e/admin-pages-suite.d.ts +37 -0
  20. package/dist/{use-super-admin-i18n-BlqcD0N7.d.ts → use-super-admin-i18n-CHNdsSlm.d.ts} +34 -7
  21. package/dist/{use-super-admin-i18n-1nCOkvgi.d.cts → use-super-admin-i18n-CgTuNi8h.d.cts} +34 -7
  22. package/package.json +18 -8
  23. package/src/client/i18n/messages/bundles.ts +0 -2
  24. package/src/client/i18n/messages/common.ts +24 -0
  25. package/src/client/i18n/messages/discovery.ts +2 -2
  26. package/src/client/i18n/messages/marketing.ts +2 -4
  27. package/src/client/i18n/messages/plan-detail.ts +0 -4
  28. package/src/client/i18n/messages/plans.ts +20 -8
  29. package/src/client/i18n/messages/tenants.ts +0 -2
  30. package/src/client/index.ts +1 -0
  31. package/src/client/manifest-loader.ts +1 -1
  32. package/src/client/resolve-plans.ts +144 -0
  33. package/src/components/BundleVersionPublishDialog.vue +6 -6
  34. package/src/components/KvBlock.vue +4 -4
  35. package/src/components/MarketingPromotionsTab.vue +34 -48
  36. package/src/components/MfaPromptDialog.vue +8 -2
  37. package/src/components/TenantActionConfirmDialog.vue +4 -4
  38. package/src/components/VersionDiffPreview.vue +7 -7
  39. package/src/components/admin-page/AdminBody.vue +40 -0
  40. package/src/components/admin-page/AdminFilters.vue +12 -0
  41. package/src/components/admin-page/AdminHero.vue +49 -0
  42. package/src/components/admin-page/AdminKpi.vue +84 -0
  43. package/src/components/admin-page/AdminPage.vue +16 -0
  44. package/src/components/admin-page/AdminPaginator.vue +195 -0
  45. package/src/components/admin-page/AdminRefreshBtn.vue +39 -0
  46. package/src/components/admin-page/AdminSection.vue +53 -0
  47. package/src/components/admin-page/AdminStatistics.vue +40 -0
  48. package/src/components/admin-page/AdminTable.vue +175 -0
  49. package/src/components/bundle-editor/BundleCreatePanel.vue +23 -23
  50. package/src/components/bundle-editor/BundleFeaturesEditor.vue +7 -7
  51. package/src/components/bundle-editor/BundlePlanCompatPicker.vue +9 -9
  52. package/src/components/bundle-editor/BundleQuotasEditor.vue +11 -11
  53. package/src/components/bundle-editor/BundleStatusBanner.vue +6 -6
  54. package/src/components/bundle-editor/BundleVersionInlineEditor.vue +18 -18
  55. package/src/components/bundle-editor/BundleVersionStrip.vue +12 -12
  56. package/src/components/dialogs/PilotCreateDialog.vue +12 -12
  57. package/src/components/dialogs/PilotEditDialog.vue +7 -7
  58. package/src/components/dialogs/PromoCodeCreateDialog.vue +8 -8
  59. package/src/components/dialogs/PromoCodeDialogFields.vue +33 -19
  60. package/src/components/dialogs/PromoCodeEditDialog.vue +10 -10
  61. package/src/components/plan/PlanGrid.vue +1 -1
  62. package/src/components/plan-create-dialog/PlanCreateDialog.vue +34 -46
  63. package/src/components/plan-detail/PlanAuditLog.vue +7 -8
  64. package/src/components/plan-detail/PlanDetail.vue +95 -292
  65. package/src/components/plan-detail/PlanDetailKpis.vue +22 -27
  66. package/src/components/plan-detail/PlanTitleEdit.vue +133 -0
  67. package/src/components/plan-detail/PlanVersionDiffPanel.vue +5 -8
  68. package/src/components/plan-detail/PlanVersionsPanel.vue +9 -11
  69. package/src/components/plan-list/PlanList.vue +206 -457
  70. package/src/components/plan-matrix/PlanMatrix.vue +66 -183
  71. package/src/components/plan-review/PlanReview.vue +191 -275
  72. package/src/components/plan-version-editor/PlanCatalogPreview.vue +7 -5
  73. package/src/components/plan-version-editor/PlanVersionEditor.vue +200 -295
  74. package/src/components/plan-version-editor/PlanVersionEditorHeader.vue +23 -55
  75. package/src/index.ts +1 -0
  76. package/src/pages-standard/AdminLayout.vue +38 -12
  77. package/src/pages-standard/AdminManifestErrorPage.vue +79 -9
  78. package/src/pages-standard/AuditPage.vue +65 -109
  79. package/src/pages-standard/BundlesPage.vue +146 -179
  80. package/src/pages-standard/DashboardPage.vue +59 -154
  81. package/src/pages-standard/DiscoveryPage.vue +172 -227
  82. package/src/pages-standard/EmailHistoryPage.vue +118 -159
  83. package/src/pages-standard/MarketingCatalogPage.vue +399 -440
  84. package/src/pages-standard/PilotsPage.vue +69 -117
  85. package/src/pages-standard/PlansPage.vue +240 -112
  86. package/src/pages-standard/PlatformEmailPage.vue +56 -91
  87. package/src/pages-standard/PromoCodeDetailPage.vue +49 -74
  88. package/src/pages-standard/PromoCodesPage.vue +95 -128
  89. package/src/pages-standard/SubscriptionsPage.vue +19 -52
  90. package/src/pages-standard/SuperAdminLoginPage.vue +12 -12
  91. package/src/pages-standard/SuperAdminSetupWizard.vue +22 -18
  92. package/src/pages-standard/TenantDetailPage.vue +100 -191
  93. package/src/pages-standard/TenantsPage.vue +190 -295
  94. package/src/pages-standard/UsersPage.vue +89 -157
  95. package/src/pages-standard/bundles-page/BundleAccordionList.vue +20 -17
  96. package/src/pages-standard/bundles-page/BundlesKpis.vue +13 -22
  97. package/src/pages-standard/bundles-page/BundlesToolbar.vue +63 -0
  98. package/src/pages-standard/discovery-page/CatalogEntryTransPanel.vue +10 -10
  99. package/src/pages-standard/discovery-page/DiscoveryCapList.vue +5 -5
  100. package/src/pages-standard/discovery-page/DiscoveryFeatureCard.vue +16 -16
  101. package/src/pages-standard/discovery-page/DiscoveryKpis.vue +31 -27
  102. package/src/pages-standard/discovery-page/DiscoveryQuotaCard.vue +7 -7
  103. package/src/pages-standard/marketing-catalog/MarketingCatalogAdmin.vue +111 -73
  104. package/src/pages-standard/marketing-catalog/MarketingCatalogHeader.vue +43 -62
  105. package/src/pages-standard/marketing-catalog/MarketingCatalogPreview.vue +53 -35
  106. package/src/pages-standard/marketing-catalog/MarketingCatalogToolbar.vue +7 -7
  107. package/src/pages-standard/plan-versions/PlanDiffCard.vue +6 -6
  108. package/src/pages-standard/plan-versions/PlanVersionsDiff.vue +6 -6
  109. package/src/pages-standard/plan-versions/PlanVersionsTimeline.vue +16 -16
  110. package/src/pages-standard/plans-page/PlanBundleOverview.vue +14 -29
  111. package/src/pages-standard/plans-page/PlanPublishDialog.vue +1 -1
  112. package/src/pages-standard/plans-page/PlansPageToast.vue +6 -6
  113. package/src/pages-standard/sa-theme.css +552 -86
  114. package/src/pages-standard/tenant-detail/TenantMasterData.vue +28 -0
  115. package/src/pages-standard/tenant-detail/TenantUsage.vue +31 -0
  116. package/src/pages-standard/tenant-detail/TenantUsers.vue +15 -0
  117. package/src/pages-standard/tenant-detail/types.ts +38 -0
  118. package/src/pages-standard/tenants/StatusPill.vue +2 -2
  119. package/src/pages-tenant/MySubscriptionBundlesPage.vue +25 -25
  120. package/src/pages-tenant/OnboardingConfigurator.vue +1 -5
  121. package/src/pages-tenant/PackageSnapshotPanel.vue +1 -1
  122. package/src/pages-tenant/TenantPlanSection.vue +12 -20
  123. package/src/quasar/create-super-admin-app.ts +4 -0
  124. package/src/vue/entitlement-provider.ts +0 -1
  125. package/src/vue/feature-router-guard.ts +0 -1
  126. package/src/vue/super-admin-context.ts +106 -1
  127. package/src/vue/use-api-list.ts +2 -1
  128. package/src/vue/use-mfa-prompt.ts +72 -0
  129. package/src/vue/use-pagination.ts +63 -0
  130. package/src/vue/use-plans.ts +1 -2
  131. package/src/vue/use-sign-out.ts +90 -0
  132. package/src/vue/use-tenant-billing.ts +1 -1
  133. package/src/vue/use-tenant-manifest.ts +0 -1
  134. package/src/components/KpiCard.vue +0 -53
  135. package/src/components/plan-cockpit/PlanCockpit.vue +0 -1012
  136. package/src/components/plan-cockpit/PlanCockpitAuditLog.vue +0 -72
  137. package/src/components/plan-cockpit/PlanCockpitDiffPanel.vue +0 -100
  138. package/src/components/plan-cockpit/PlanCockpitHeader.vue +0 -101
  139. package/src/components/plan-cockpit/PlanCockpitImpactPanel.vue +0 -112
  140. package/src/components/plan-cockpit/PlanCockpitKpis.vue +0 -68
  141. package/src/components/plan-cockpit/PlanCockpitVersions.vue +0 -251
  142. package/src/components/plan-cockpit/types.ts +0 -72
  143. package/src/components/plan-detail/PlanDetailHeader.vue +0 -194
  144. package/src/pages-standard/bundles-page/BundlesHeader.vue +0 -68
  145. package/src/pages-standard/discovery-page/DiscoveryHeader.vue +0 -34
@@ -1,123 +1,135 @@
1
1
  <template>
2
- <div class="sa-bundles">
3
- <BundlesHeader
4
- :loading="loading"
5
- :display-locale="displayLocale"
6
- :locales="locales"
7
- @create="openCreatePanel"
8
- @refresh="load"
9
- @update:display-locale="(value) => (displayLocale = value)"
10
- />
11
-
12
- <q-banner v-if="error" class="sa-bundles__error" rounded>
13
- <template #avatar><q-icon name="warning" color="negative" /></template>
14
- {{ loadErrorText }}
15
- </q-banner>
16
-
17
- <BundlesKpis
18
- :bundles-total="bundles.length"
19
- :live-count="liveCount"
20
- :scheduled-bundles-count="scheduledBundlesCount"
21
- :total-scheduled-versions="totalScheduledVersions"
22
- :total-draft-versions="totalDraftVersions"
23
- :draft-bundles-count="draftBundlesCount"
24
- :translated-count="translatedCount"
25
- :locales-count="locales.length"
26
- />
27
-
28
- <BundlesFilterBar
29
- v-model:query="query"
30
- v-model:status-filter="statusFilter"
31
- :status-filter-options="statusFilterOptions"
32
- />
33
-
34
- <!-- Inline creation (collapsible panel, replaces the former dialog modal) -->
35
- <BundleCreatePanel
36
- v-if="createOpen"
37
- :project-key="projectKey"
38
- :available-features="snapshot?.features ?? []"
39
- :available-quotas="snapshot?.quotas ?? []"
40
- :plans="plans"
41
- :live-plan-versions="livePlanVersions"
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
- <q-banner
52
- v-if="bundles.length === 0 && !loading && !error"
53
- class="sa-bundles__empty"
54
- rounded
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
- :inline-editor-saving="inlineEditorSaving"
86
- :inline-editor-error="inlineEditorError"
87
- @set-i18n="setI18n"
88
- @submit-edit="submitEdit"
89
- @select-version="onSelectVersion"
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
- </template>
97
- </BundleAccordionList>
98
-
99
- <!-- Strict mode warnings after the last mutation -->
100
- <q-banner
101
- v-if="lastWarnings.length > 0"
102
- class="sa-bundles__warnings-banner"
103
- inline-actions
104
- rounded
105
- >
106
- <template #avatar><q-icon name="warning" color="warning" /></template>
107
- <strong>{{ strictWarningsText }}</strong>
108
- <ul class="sa-bundles__warnings-list">
109
- <li v-for="(w, i) in lastWarnings" :key="i">
110
- <code>{{ w.code }}</code>
111
- <template v-if="w.value">
112
- · <code>{{ w.value }}</code></template
113
- >
114
- — {{ w.message }}
115
- </li>
116
- </ul>
117
- <template #action>
118
- <q-btn flat dense :label="common.close" @click="lastWarnings = []" />
119
- </template>
120
- </q-banner>
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
- </div>
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 BundlesHeader from './bundles-page/BundlesHeader.vue';
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 (SPEC_V2 §6.4, §11.1 M6 Pack 2c +
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 #e2e8f0;
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: #eff6ff;
744
- color: #1d4ed8;
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: #64748b;
738
+ color: var(--sa-muted);
772
739
  }
773
740
  .sa-bd-card__chev {
774
741
  transition: transform 0.15s;
775
- color: #94a3b8;
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 #e2e8f0;
748
+ border-top: 1px solid var(--sa-border);
782
749
  padding: 14px;
783
- background: #f8fafc;
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: #475569;
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: #94a3b8;
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: #94a3b8;
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 #e2e8f0;
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: #f1f5f9;
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 #e2e8f0;
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: #64748b;
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: #f1f5f9;
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: #94a3b8;
875
+ color: var(--sa-muted-light);
909
876
  font-size: 12px;
910
877
  border: 1px dashed #cbd5e1;
911
878
  border-radius: 8px;