@saasicat/ui-vue 0.22.2 → 0.23.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 (108) hide show
  1. package/README.md +1 -1
  2. package/dist/{chunk-LY52T4N4.js → chunk-TQQMKWN6.js} +58 -1
  3. package/dist/index.cjs +213 -159
  4. package/dist/index.d.cts +2 -2
  5. package/dist/index.d.ts +2 -2
  6. package/dist/index.js +7 -1
  7. package/dist/quasar/index.cjs +116 -20
  8. package/dist/quasar/index.d.cts +48 -3
  9. package/dist/quasar/index.d.ts +48 -3
  10. package/dist/quasar/index.js +58 -3
  11. package/dist/{use-super-admin-i18n-CgTuNi8h.d.cts → use-sa-theme-B5t7oXph.d.cts} +51 -1
  12. package/dist/{use-super-admin-i18n-CHNdsSlm.d.ts → use-sa-theme-OUBlaqgl.d.ts} +51 -1
  13. package/package.json +5 -2
  14. package/src/components/BundleVersionPublishDialog.vue +17 -17
  15. package/src/components/KvBlock.vue +6 -6
  16. package/src/components/MarketingPromotionsTab.vue +78 -78
  17. package/src/components/MfaPromptDialog.vue +2 -2
  18. package/src/components/TenantActionConfirmDialog.vue +5 -5
  19. package/src/components/VersionDiffPreview.vue +18 -18
  20. package/src/components/bundle-editor/BundleCreatePanel.vue +52 -52
  21. package/src/components/bundle-editor/BundleFeaturesEditor.vue +20 -20
  22. package/src/components/bundle-editor/BundlePlanCompatPicker.vue +33 -33
  23. package/src/components/bundle-editor/BundleQuotasEditor.vue +26 -26
  24. package/src/components/bundle-editor/BundleStatusBanner.vue +21 -21
  25. package/src/components/bundle-editor/BundleVersionInlineEditor.vue +48 -48
  26. package/src/components/bundle-editor/BundleVersionStrip.vue +30 -30
  27. package/src/components/dialogs/PilotCreateDialog.vue +20 -20
  28. package/src/components/dialogs/PilotEditDialog.vue +6 -6
  29. package/src/components/dialogs/PromoCodeCreateDialog.vue +9 -9
  30. package/src/components/dialogs/PromoCodeDialogFields.vue +61 -61
  31. package/src/components/dialogs/PromoCodeEditDialog.vue +11 -11
  32. package/src/components/dialogs/pilot-dialog.css +48 -48
  33. package/src/components/plan/PlanCycleToggle.vue +9 -16
  34. package/src/components/plan/PlanGrid.vue +30 -34
  35. package/src/components/plan/PriceSummary.vue +35 -35
  36. package/src/components/plan/PromoCodeInput.vue +26 -26
  37. package/src/components/plan/PublicBundleGrid.vue +32 -28
  38. package/src/components/plan-create-dialog/PlanCreateDialog.vue +49 -49
  39. package/src/components/plan-detail/PlanDetail.vue +172 -156
  40. package/src/components/plan-detail/PlanTitleEdit.vue +11 -11
  41. package/src/components/plan-list/PlanList.vue +98 -77
  42. package/src/components/plan-matrix/PlanMatrix.vue +89 -89
  43. package/src/components/plan-review/PlanReview.vue +60 -56
  44. package/src/components/plan-version-editor/PlanVersionEditor.vue +224 -200
  45. package/src/components/wizard-stepper/WizardStepper.vue +17 -17
  46. package/src/index.ts +1 -0
  47. package/src/pages-standard/AdminLayout.vue +58 -37
  48. package/src/pages-standard/AdminManifestErrorPage.vue +6 -6
  49. package/src/pages-standard/AuditPage.vue +3 -3
  50. package/src/pages-standard/BundlesPage.vue +36 -36
  51. package/src/pages-standard/DashboardPage.vue +17 -17
  52. package/src/pages-standard/DiscoveryPage.vue +55 -49
  53. package/src/pages-standard/EmailHistoryPage.vue +53 -71
  54. package/src/pages-standard/MarketingCatalogPage.vue +226 -218
  55. package/src/pages-standard/PilotsPage.vue +7 -6
  56. package/src/pages-standard/PlatformEmailPage.vue +18 -18
  57. package/src/pages-standard/PromoCodeDetailPage.vue +3 -3
  58. package/src/pages-standard/PromoCodesPage.vue +7 -6
  59. package/src/pages-standard/SuperAdminLoginPage.vue +39 -25
  60. package/src/pages-standard/SuperAdminSetupWizard.vue +44 -33
  61. package/src/pages-standard/TenantDetailPage.vue +7 -7
  62. package/src/pages-standard/TenantsPage.vue +11 -46
  63. package/src/pages-standard/bundles-page/BundleAccordionList.vue +13 -13
  64. package/src/pages-standard/discovery-page/CatalogEntryTransPanel.vue +24 -24
  65. package/src/pages-standard/discovery-page/DiscoveryCapList.vue +22 -22
  66. package/src/pages-standard/discovery-page/DiscoveryFeatureCard.vue +39 -39
  67. package/src/pages-standard/discovery-page/DiscoveryQuotaCard.vue +26 -26
  68. package/src/pages-standard/discovery-page/DiscoveryStatusControl.vue +1 -1
  69. package/src/pages-standard/plan-versions/PlanDiffCard.vue +16 -16
  70. package/src/pages-standard/plan-versions/PlanVersionsDiff.vue +21 -15
  71. package/src/pages-standard/plan-versions/PlanVersionsTimeline.vue +45 -45
  72. package/src/pages-standard/plans-page/PlanBundleOverview.vue +21 -15
  73. package/src/pages-standard/plans-page/PlanPublishDialog.vue +4 -4
  74. package/src/pages-standard/plans-page/PlansPageToast.vue +6 -6
  75. package/src/pages-standard/sa-theme.css +9 -687
  76. package/src/pages-standard/tenants/StatusPill.vue +13 -13
  77. package/src/pages-tenant/LimitsRow.vue +4 -4
  78. package/src/pages-tenant/MySubscriptionBundlesPage.vue +61 -61
  79. package/src/pages-tenant/OnboardingConfigurator.vue +24 -24
  80. package/src/pages-tenant/PackageSnapshotPanel.vue +10 -16
  81. package/src/pages-tenant/PendingVersionBanner.vue +12 -12
  82. package/src/pages-tenant/PlanChangeWizard.vue +20 -27
  83. package/src/pages-tenant/TenantPlanSection.vue +13 -21
  84. package/src/pages-tenant/UsageBar.vue +7 -7
  85. package/src/pages-tenant/tenant-plan-section/BundlePreviewDialog.vue +14 -14
  86. package/src/pages-tenant/tenant-plan-section/TenantBundleStore.vue +10 -10
  87. package/src/pages-tenant/tenant-plan-section/TenantFeatureMatrix.vue +2 -2
  88. package/src/quasar/create-super-admin-app.ts +96 -1
  89. package/src/quasar/dark-bridge.ts +66 -0
  90. package/src/quasar/index.ts +1 -0
  91. package/src/ui/theme/_breakpoints.scss +28 -0
  92. package/src/ui/theme/base.css +50 -0
  93. package/src/ui/theme/components/body.css +23 -0
  94. package/src/ui/theme/components/button.css +158 -0
  95. package/src/ui/theme/components/card.css +48 -0
  96. package/src/ui/theme/components/field.css +38 -0
  97. package/src/ui/theme/components/hero.css +46 -0
  98. package/src/ui/theme/components/paginator.css +63 -0
  99. package/src/ui/theme/components/section.css +67 -0
  100. package/src/ui/theme/components/statistics.css +189 -0
  101. package/src/ui/theme/components/table.css +60 -0
  102. package/src/ui/theme/index.css +42 -0
  103. package/src/ui/theme/tokens.legacy.css +147 -0
  104. package/src/ui/theme/tokens.primitive.css +108 -0
  105. package/src/ui/theme/tokens.scale.css +103 -0
  106. package/src/ui/theme/tokens.semantic.dark.css +173 -0
  107. package/src/ui/theme/tokens.semantic.light.css +212 -0
  108. package/src/vue/use-sa-theme.ts +154 -0
@@ -171,14 +171,14 @@ function copyFromDefault(locale: string): void {
171
171
  gap: 12px;
172
172
  }
173
173
  .sa-trans-lang {
174
- border: 1px solid var(--sa-border);
174
+ border: 1px solid var(--sa-color-border);
175
175
  border-radius: 10px;
176
- background: #fff;
176
+ background: var(--sa-color-bg-surface);
177
177
  padding: 10px 12px;
178
178
  }
179
179
  .sa-trans-lang--source {
180
- background: var(--sa-bg-surface-2);
181
- border-color: #cbd5e1;
180
+ background: var(--sa-color-bg-sunken);
181
+ border-color: var(--sa-color-border-strong);
182
182
  }
183
183
  .sa-trans-lang__head {
184
184
  display: flex;
@@ -187,31 +187,31 @@ function copyFromDefault(locale: string): void {
187
187
  margin-bottom: 8px;
188
188
  }
189
189
  .sa-trans-lang__code {
190
- font-size: 10px;
190
+ font-size: var(--sa-text-2xs);
191
191
  font-weight: 700;
192
- background: var(--sa-heading);
193
- color: #fff;
192
+ background: var(--sa-color-inverse-bg);
193
+ color: var(--sa-color-fg-on-accent);
194
194
  padding: 2px 6px;
195
195
  border-radius: 5px;
196
196
  }
197
197
  .sa-trans-lang__name {
198
- font-size: 12px;
198
+ font-size: var(--sa-text-sm);
199
199
  font-weight: 600;
200
- color: #334155;
200
+ color: var(--sa-color-fg-body);
201
201
  flex: 1;
202
202
  }
203
203
  .sa-trans-lang__badge {
204
- font-size: 9px;
204
+ font-size: var(--sa-text-2xs);
205
205
  font-weight: 700;
206
206
  text-transform: uppercase;
207
207
  letter-spacing: 0.5px;
208
- color: var(--sa-muted-dark);
209
- background: var(--sa-border);
208
+ color: var(--sa-color-fg-secondary);
209
+ background: var(--sa-color-border);
210
210
  padding: 2px 6px;
211
211
  border-radius: 5px;
212
212
  }
213
213
  .sa-trans-lang__copy {
214
- color: var(--sa-muted-dark);
214
+ color: var(--sa-color-fg-secondary);
215
215
  }
216
216
  .sa-trans-fields {
217
217
  display: flex;
@@ -224,17 +224,17 @@ function copyFromDefault(locale: string): void {
224
224
  gap: 3px;
225
225
  }
226
226
  .sa-trans-field__cap {
227
- font-size: 10px;
227
+ font-size: var(--sa-text-2xs);
228
228
  font-weight: 600;
229
229
  text-transform: uppercase;
230
230
  letter-spacing: 0.3px;
231
- color: var(--sa-muted-light);
231
+ color: var(--sa-color-fg-subtle);
232
232
  }
233
233
  .sa-trans-locked {
234
- font-size: 13px;
235
- color: #334155;
236
- background: var(--sa-border-soft);
237
- border: 1px dashed #cbd5e1;
234
+ font-size: var(--sa-text-md);
235
+ color: var(--sa-color-fg-body);
236
+ background: var(--sa-color-border-soft);
237
+ border: 1px dashed var(--sa-color-border-strong);
238
238
  border-radius: 6px;
239
239
  padding: 6px 10px;
240
240
  display: flex;
@@ -242,17 +242,17 @@ function copyFromDefault(locale: string): void {
242
242
  gap: 8px;
243
243
  }
244
244
  .sa-trans-locked__hint {
245
- font-size: 10px;
246
- color: var(--sa-muted-light);
245
+ font-size: var(--sa-text-2xs);
246
+ color: var(--sa-color-fg-subtle);
247
247
  text-transform: uppercase;
248
248
  }
249
249
  .sa-trans__empty {
250
250
  grid-column: 1 / -1;
251
251
  padding: 16px;
252
252
  text-align: center;
253
- font-size: 12px;
254
- color: var(--sa-muted-light);
255
- border: 1px dashed #cbd5e1;
253
+ font-size: var(--sa-text-sm);
254
+ color: var(--sa-color-fg-subtle);
255
+ border: 1px dashed var(--sa-color-border-strong);
256
256
  border-radius: 10px;
257
257
  }
258
258
  </style>
@@ -90,17 +90,17 @@ function isNew(cap: CapabilityCatalogEntryRow): boolean {
90
90
  display: flex;
91
91
  gap: 10px;
92
92
  align-items: flex-start;
93
- background: #fff;
94
- border: 1px solid var(--sa-border);
93
+ background: var(--sa-color-bg-surface);
94
+ border: 1px solid var(--sa-color-border);
95
95
  border-radius: 8px;
96
96
  padding: 8px 10px;
97
97
  }
98
98
  .sa-caps-row.dep {
99
- border-color: #fecaca;
100
- background: #fef2f2;
99
+ border-color: var(--sa-color-negative-border);
100
+ background: var(--sa-color-negative-surface);
101
101
  }
102
102
  .sa-caps-row__kind {
103
- font-size: 9px;
103
+ font-size: var(--sa-text-2xs);
104
104
  font-weight: 700;
105
105
  text-transform: uppercase;
106
106
  padding: 2px 6px;
@@ -120,30 +120,30 @@ function isNew(cap: CapabilityCatalogEntryRow): boolean {
120
120
  flex-wrap: wrap;
121
121
  }
122
122
  .sa-caps-row__key {
123
- font-size: 11px;
123
+ font-size: var(--sa-text-xs);
124
124
  font-weight: 700;
125
125
  }
126
126
  .sa-caps-row__flag {
127
- font-size: 9px;
127
+ font-size: var(--sa-text-2xs);
128
128
  font-weight: 700;
129
129
  padding: 1px 5px;
130
130
  border-radius: 4px;
131
131
  }
132
132
  .sa-caps-row__flag--new {
133
- background: #fef3c7;
134
- color: #92400e;
133
+ background: var(--sa-color-warning-surface-strong);
134
+ color: var(--sa-color-warning-fg);
135
135
  }
136
136
  .sa-caps-row__flag--exp {
137
- background: #ede9fe;
138
- color: #6d28d9;
137
+ background: var(--sa-color-feature-surface);
138
+ color: var(--sa-color-feature-fg);
139
139
  }
140
140
  .sa-caps-row__flag--dep {
141
- background: #fee2e2;
142
- color: #b91c1c;
141
+ background: var(--sa-color-negative-surface-strong);
142
+ color: var(--sa-color-negative-fg);
143
143
  }
144
144
  .sa-caps-row__flag--gone {
145
- background: var(--sa-border);
146
- color: var(--sa-muted);
145
+ background: var(--sa-color-border);
146
+ color: var(--sa-color-fg-muted);
147
147
  }
148
148
  .sa-caps-row.gone {
149
149
  opacity: 0.6;
@@ -152,21 +152,21 @@ function isNew(cap: CapabilityCatalogEntryRow): boolean {
152
152
  display: flex;
153
153
  gap: 12px;
154
154
  flex-wrap: wrap;
155
- font-size: 11px;
156
- color: var(--sa-muted-dark);
155
+ font-size: var(--sa-text-xs);
156
+ color: var(--sa-color-fg-secondary);
157
157
  margin-top: 1px;
158
158
  }
159
159
  .sa-caps-row__meta code {
160
- font-size: 10px;
160
+ font-size: var(--sa-text-2xs);
161
161
  }
162
162
  .sa-caps__empty {
163
163
  display: flex;
164
164
  align-items: center;
165
165
  gap: 6px;
166
- font-size: 11px;
167
- color: #b45309;
168
- background: var(--sa-warning-bg);
169
- border: 1px dashed #fde68a;
166
+ font-size: var(--sa-text-xs);
167
+ color: var(--sa-color-warning-fg);
168
+ background: var(--sa-color-warning-surface);
169
+ border: 1px dashed var(--sa-color-warning-border);
170
170
  border-radius: 8px;
171
171
  padding: 10px 12px;
172
172
  }
@@ -269,14 +269,14 @@ function coverage(locale: string): number {
269
269
 
270
270
  <style scoped>
271
271
  .sa-fc {
272
- border: 1px solid var(--sa-border);
272
+ border: 1px solid var(--sa-color-border);
273
273
  border-radius: 10px;
274
- background: #fff;
274
+ background: var(--sa-color-bg-surface);
275
275
  overflow: hidden;
276
276
  }
277
277
  .sa-fc.expanded {
278
- border-color: #c7d2fe;
279
- box-shadow: 0 1px 3px rgba(15, 23, 42, 0.08);
278
+ border-color: var(--sa-color-scheduled-border);
279
+ box-shadow: 0 1px 3px var(--sa-shadow-tint-2);
280
280
  }
281
281
  .sa-fc__head {
282
282
  display: flex;
@@ -286,7 +286,7 @@ function coverage(locale: string): number {
286
286
  cursor: pointer;
287
287
  }
288
288
  .sa-fc__icon {
289
- color: var(--sa-muted-dark);
289
+ color: var(--sa-color-fg-secondary);
290
290
  flex-shrink: 0;
291
291
  }
292
292
  .sa-fc__main {
@@ -300,55 +300,55 @@ function coverage(locale: string): number {
300
300
  flex-wrap: wrap;
301
301
  }
302
302
  .sa-fc__key {
303
- font-size: 11px;
303
+ font-size: var(--sa-text-xs);
304
304
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
305
- background: var(--sa-border-soft);
306
- color: var(--sa-muted-dark);
305
+ background: var(--sa-color-border-soft);
306
+ color: var(--sa-color-fg-secondary);
307
307
  padding: 2px 6px;
308
308
  border-radius: 5px;
309
309
  white-space: nowrap;
310
310
  }
311
311
  .sa-fc__label {
312
- font-size: 13px;
312
+ font-size: var(--sa-text-md);
313
313
  font-weight: 600;
314
- color: var(--sa-heading);
314
+ color: var(--sa-color-fg-heading);
315
315
  }
316
316
  .sa-fc__flag {
317
- font-size: 10px;
317
+ font-size: var(--sa-text-2xs);
318
318
  font-weight: 700;
319
319
  padding: 1px 6px;
320
320
  border-radius: 5px;
321
321
  }
322
322
  .sa-fc__flag--new {
323
- background: #fef3c7;
324
- color: #92400e;
323
+ background: var(--sa-color-warning-surface-strong);
324
+ color: var(--sa-color-warning-fg);
325
325
  }
326
326
  .sa-fc__flag--dep {
327
- background: #fee2e2;
328
- color: #b91c1c;
327
+ background: var(--sa-color-negative-surface-strong);
328
+ color: var(--sa-color-negative-fg);
329
329
  }
330
330
  .sa-fc__flag--succ {
331
- background: #fef3c7;
332
- color: #92400e;
331
+ background: var(--sa-color-warning-surface-strong);
332
+ color: var(--sa-color-warning-fg);
333
333
  }
334
334
  .sa-fc__flag--repl {
335
- background: #dbeafe;
336
- color: #1e40af;
335
+ background: var(--sa-color-info-surface-strong);
336
+ color: var(--sa-color-info-fg);
337
337
  }
338
338
  .sa-fc__sub {
339
- font-size: 11px;
340
- color: var(--sa-muted);
339
+ font-size: var(--sa-text-xs);
340
+ color: var(--sa-color-fg-muted);
341
341
  margin-top: 1px;
342
342
  }
343
343
  .sa-fc__dot {
344
344
  margin: 0 4px;
345
- color: #cbd5e1;
345
+ color: var(--sa-color-fg-disabled);
346
346
  }
347
347
  .sa-fc__tier {
348
348
  font-weight: 700;
349
349
  text-transform: uppercase;
350
350
  letter-spacing: 0.3px;
351
- color: #4f46e5;
351
+ color: var(--sa-color-scheduled);
352
352
  }
353
353
  .sa-fc__coverage {
354
354
  display: flex;
@@ -356,39 +356,39 @@ function coverage(locale: string): number {
356
356
  flex-shrink: 0;
357
357
  }
358
358
  .sa-fc__chev {
359
- color: var(--sa-muted-light);
359
+ color: var(--sa-color-fg-subtle);
360
360
  transition: transform 0.15s;
361
361
  }
362
362
  .sa-fc__chev.open {
363
363
  transform: rotate(90deg);
364
364
  }
365
365
  .sa-fc__body {
366
- border-top: 1px solid var(--sa-border-soft);
366
+ border-top: 1px solid var(--sa-color-border-soft);
367
367
  padding: 12px;
368
- background: var(--sa-bg-surface-2);
368
+ background: var(--sa-color-bg-sunken);
369
369
  }
370
370
  .sa-fc__banner {
371
371
  display: flex;
372
372
  align-items: center;
373
373
  gap: 8px;
374
- font-size: 12px;
374
+ font-size: var(--sa-text-sm);
375
375
  border-radius: 8px;
376
376
  padding: 8px 12px;
377
377
  margin-bottom: 10px;
378
378
  }
379
379
  .sa-fc__banner.warn {
380
- background: var(--sa-warning-bg);
381
- border: 1px solid #fde68a;
382
- color: #92400e;
380
+ background: var(--sa-color-warning-surface);
381
+ border: 1px solid var(--sa-color-warning-border);
382
+ color: var(--sa-color-warning-fg);
383
383
  }
384
384
  .sa-fc__banner.mute {
385
- background: var(--sa-border-soft);
386
- border: 1px solid var(--sa-border);
387
- color: var(--sa-muted-dark);
385
+ background: var(--sa-color-border-soft);
386
+ border: 1px solid var(--sa-color-border);
387
+ color: var(--sa-color-fg-secondary);
388
388
  }
389
389
  .sa-fc__subtabs {
390
390
  margin-bottom: 12px;
391
- border-bottom: 1px solid var(--sa-border);
391
+ border-bottom: 1px solid var(--sa-color-border);
392
392
  }
393
393
  .sa-fc__split {
394
394
  display: grid;
@@ -396,18 +396,18 @@ function coverage(locale: string): number {
396
396
  gap: 14px;
397
397
  }
398
398
  .sa-fc__split-head {
399
- font-size: 11px;
399
+ font-size: var(--sa-text-xs);
400
400
  font-weight: 700;
401
401
  text-transform: uppercase;
402
402
  letter-spacing: 0.5px;
403
- color: var(--sa-muted-light);
403
+ color: var(--sa-color-fg-subtle);
404
404
  margin-bottom: 8px;
405
405
  }
406
406
  .sa-fc__split-count {
407
407
  font-weight: 600;
408
408
  text-transform: none;
409
409
  letter-spacing: 0;
410
- color: #cbd5e1;
410
+ color: var(--sa-color-fg-disabled);
411
411
  margin-left: 6px;
412
412
  }
413
413
  .sa-fc__fields {
@@ -421,9 +421,9 @@ function coverage(locale: string): number {
421
421
  gap: 3px;
422
422
  }
423
423
  .sa-fc-field__cap {
424
- font-size: 11px;
424
+ font-size: var(--sa-text-xs);
425
425
  font-weight: 600;
426
426
  text-transform: uppercase;
427
- color: var(--sa-muted-light);
427
+ color: var(--sa-color-fg-subtle);
428
428
  }
429
429
  </style>
@@ -154,17 +154,17 @@ function coverage(locale: string): number {
154
154
 
155
155
  <style scoped>
156
156
  .sa-qc {
157
- border: 1px solid var(--sa-border);
157
+ border: 1px solid var(--sa-color-border);
158
158
  border-radius: 10px;
159
- background: #fff;
159
+ background: var(--sa-color-bg-surface);
160
160
  overflow: hidden;
161
161
  }
162
162
  .sa-qc.warn {
163
- border-color: #fecaca;
163
+ border-color: var(--sa-color-negative-border);
164
164
  }
165
165
  .sa-qc.expanded {
166
- border-color: #c7d2fe;
167
- box-shadow: 0 1px 3px rgba(15, 23, 42, 0.08);
166
+ border-color: var(--sa-color-scheduled-border);
167
+ box-shadow: 0 1px 3px var(--sa-shadow-tint-2);
168
168
  }
169
169
  .sa-qc__head {
170
170
  display: flex;
@@ -174,7 +174,7 @@ function coverage(locale: string): number {
174
174
  cursor: pointer;
175
175
  }
176
176
  .sa-qc.warn .sa-qc__head {
177
- background: #fef2f2;
177
+ background: var(--sa-color-negative-surface);
178
178
  }
179
179
  .sa-qc__icon {
180
180
  flex-shrink: 0;
@@ -191,38 +191,38 @@ function coverage(locale: string): number {
191
191
  }
192
192
  .sa-qc__label {
193
193
  font-weight: 600;
194
- font-size: 13px;
195
- color: var(--sa-heading);
194
+ font-size: var(--sa-text-md);
195
+ color: var(--sa-color-fg-heading);
196
196
  }
197
197
  .sa-qc__key {
198
- font-size: 11px;
198
+ font-size: var(--sa-text-xs);
199
199
  }
200
200
  .sa-qc__flag {
201
- font-size: 10px;
201
+ font-size: var(--sa-text-2xs);
202
202
  font-weight: 700;
203
203
  padding: 1px 6px;
204
204
  border-radius: 5px;
205
205
  }
206
206
  .sa-qc__flag--succ {
207
- background: #fef3c7;
208
- color: #92400e;
207
+ background: var(--sa-color-warning-surface-strong);
208
+ color: var(--sa-color-warning-fg);
209
209
  }
210
210
  .sa-qc__flag--repl {
211
- background: #dbeafe;
212
- color: #1e40af;
211
+ background: var(--sa-color-info-surface-strong);
212
+ color: var(--sa-color-info-fg);
213
213
  }
214
214
  .sa-qc__sub {
215
- font-size: 11px;
216
- color: var(--sa-muted);
215
+ font-size: var(--sa-text-xs);
216
+ color: var(--sa-color-fg-muted);
217
217
  margin-top: 2px;
218
218
  }
219
219
  .sa-qc__missing {
220
- color: #b91c1c;
220
+ color: var(--sa-color-negative-fg);
221
221
  font-weight: 700;
222
222
  }
223
223
  .sa-qc__warning {
224
- font-size: 11px;
225
- color: #b91c1c;
224
+ font-size: var(--sa-text-xs);
225
+ color: var(--sa-color-negative-fg);
226
226
  margin-top: 4px;
227
227
  }
228
228
  .sa-qc__coverage {
@@ -231,27 +231,27 @@ function coverage(locale: string): number {
231
231
  flex-shrink: 0;
232
232
  }
233
233
  .sa-qc__chev {
234
- color: var(--sa-muted-light);
234
+ color: var(--sa-color-fg-subtle);
235
235
  transition: transform 0.15s;
236
236
  }
237
237
  .sa-qc__chev.open {
238
238
  transform: rotate(90deg);
239
239
  }
240
240
  .sa-qc__body {
241
- border-top: 1px solid var(--sa-border-soft);
241
+ border-top: 1px solid var(--sa-color-border-soft);
242
242
  padding: 12px;
243
- background: var(--sa-bg-surface-2);
243
+ background: var(--sa-color-bg-sunken);
244
244
  }
245
245
  .sa-qc__banner {
246
246
  display: flex;
247
247
  align-items: center;
248
248
  gap: 8px;
249
- font-size: 12px;
249
+ font-size: var(--sa-text-sm);
250
250
  border-radius: 8px;
251
251
  padding: 8px 12px;
252
252
  margin-bottom: 10px;
253
- background: var(--sa-warning-bg);
254
- border: 1px solid #fde68a;
255
- color: #92400e;
253
+ background: var(--sa-color-warning-surface);
254
+ border: 1px solid var(--sa-color-warning-border);
255
+ color: var(--sa-color-warning-fg);
256
256
  }
257
257
  </style>
@@ -71,6 +71,6 @@ const menu = computed(() => reviewMenuActions(props.status, msg.value));
71
71
  flex-shrink: 0;
72
72
  }
73
73
  .sa-stc__danger {
74
- color: #b91c1c;
74
+ color: var(--sa-color-negative-fg);
75
75
  }
76
76
  </style>
@@ -63,8 +63,8 @@ const changeCountLabel = computed(() => {
63
63
 
64
64
  <style scoped>
65
65
  .sa-pv-diff-card {
66
- background: #fff;
67
- border: 1px solid var(--sa-border, var(--sa-border));
66
+ background: var(--sa-color-bg-surface);
67
+ border: 1px solid var(--sa-color-border);
68
68
  border-radius: 10px;
69
69
  margin-bottom: 12px;
70
70
  overflow: hidden;
@@ -81,22 +81,22 @@ const changeCountLabel = computed(() => {
81
81
  width: 28px;
82
82
  height: 28px;
83
83
  border-radius: 7px;
84
- background: var(--sa-positive-soft, rgba(4, 120, 87, 0.1));
84
+ background: var(--sa-color-positive-surface);
85
85
  display: flex;
86
86
  align-items: center;
87
87
  justify-content: center;
88
88
  }
89
89
  .sa-pv-diff-card__noop-icon :deep(.q-icon) {
90
- color: var(--sa-positive, #047857);
90
+ color: var(--sa-color-positive-fg);
91
91
  }
92
92
 
93
93
  .sa-pv-diff-card__head {
94
94
  padding: 12px 16px;
95
- border-bottom: 1px solid var(--sa-border-soft, var(--sa-border-soft));
95
+ border-bottom: 1px solid var(--sa-color-border-soft);
96
96
  display: flex;
97
97
  align-items: center;
98
98
  gap: 12px;
99
- background: #fafbfc;
99
+ background: var(--sa-color-bg-surface-raised);
100
100
  }
101
101
  .sa-pv-diff-card__accent {
102
102
  width: 28px;
@@ -109,29 +109,29 @@ const changeCountLabel = computed(() => {
109
109
  }
110
110
  .sa-pv-diff-card__name {
111
111
  font-weight: 700;
112
- font-size: 14px;
113
- color: var(--sa-heading, var(--sa-heading));
112
+ font-size: var(--sa-text-lg);
113
+ color: var(--sa-color-fg-heading);
114
114
  font-family: var(--sa-font-head, system-ui, sans-serif);
115
115
  }
116
116
  .sa-pv-diff-card__ver {
117
117
  font-family: var(--sa-font-mono, ui-monospace, monospace);
118
- font-size: 11px;
118
+ font-size: var(--sa-text-xs);
119
119
  font-weight: 600;
120
- color: var(--sa-muted, var(--sa-muted));
121
- background: var(--sa-border-soft);
120
+ color: var(--sa-color-fg-muted);
121
+ background: var(--sa-color-border-soft);
122
122
  padding: 2px 6px;
123
123
  border-radius: 4px;
124
124
  }
125
125
  .sa-pv-diff-card__sub {
126
- font-size: 11.5px;
127
- color: var(--sa-muted, var(--sa-muted));
126
+ font-size: var(--sa-text-sm);
127
+ color: var(--sa-color-fg-muted);
128
128
  }
129
129
  .sa-pv-diff-card__count {
130
- font-size: 11px;
130
+ font-size: var(--sa-text-xs);
131
131
  font-weight: 700;
132
132
  letter-spacing: 0.06em;
133
- background: var(--sa-warning-soft, rgba(245, 158, 11, 0.1));
134
- color: var(--sa-warning, #b45309);
133
+ background: var(--sa-color-warning-surface-strong);
134
+ color: var(--sa-color-warning-fg);
135
135
  padding: 2px 8px;
136
136
  border-radius: 4px;
137
137
  margin-left: auto;
@@ -195,8 +195,8 @@ function directionFor(delta: number, polarity: 'higher' | 'lower'): VersionChang
195
195
  padding: 20px 28px;
196
196
  }
197
197
  .sa-pv-diff__overview {
198
- background: #fff;
199
- border: 1px solid var(--sa-border, var(--sa-border));
198
+ background: var(--sa-color-bg-surface);
199
+ border: 1px solid var(--sa-color-border);
200
200
  border-radius: 12px;
201
201
  padding: 16px 20px;
202
202
  margin-bottom: 18px;
@@ -208,26 +208,32 @@ function directionFor(delta: number, polarity: 'higher' | 'lower'): VersionChang
208
208
  width: 44px;
209
209
  height: 44px;
210
210
  border-radius: 10px;
211
- background: linear-gradient(135deg, #f59e0b, #d97706);
211
+ /* Invariant: the icon inside is explicitly white. The `warning` roles
212
+ * lighten in dark, which would leave it at 1.67:1 on its own badge. */
213
+ background: linear-gradient(
214
+ 135deg,
215
+ var(--sa-color-inverse-notice),
216
+ var(--sa-color-inverse-notice-strong)
217
+ );
212
218
  display: flex;
213
219
  align-items: center;
214
220
  justify-content: center;
215
221
  }
216
222
  .sa-pv-diff__legend {
217
- font-size: 11px;
223
+ font-size: var(--sa-text-xs);
218
224
  font-weight: 700;
219
225
  letter-spacing: 0.08em;
220
- color: var(--sa-muted, var(--sa-muted));
226
+ color: var(--sa-color-fg-muted);
221
227
  text-transform: uppercase;
222
228
  }
223
229
  .sa-pv-diff__title {
224
230
  font-family: var(--sa-font-head, system-ui, sans-serif);
225
231
  font-weight: 700;
226
- font-size: 18px;
227
- color: var(--sa-heading, var(--sa-heading));
232
+ font-size: var(--sa-text-xl);
233
+ color: var(--sa-color-fg-heading);
228
234
  }
229
235
  .sa-pv-diff__sep {
230
- color: var(--sa-muted, var(--sa-muted));
236
+ color: var(--sa-color-fg-muted);
231
237
  font-weight: 500;
232
238
  }
233
239
  .sa-pv-diff__spacer {
@@ -241,30 +247,30 @@ function directionFor(delta: number, polarity: 'higher' | 'lower'): VersionChang
241
247
  text-align: right;
242
248
  }
243
249
  .sa-pv-diff__stat-label {
244
- font-size: 10.5px;
250
+ font-size: var(--sa-text-xs);
245
251
  font-weight: 700;
246
252
  letter-spacing: 0.08em;
247
- color: var(--sa-muted, var(--sa-muted));
253
+ color: var(--sa-color-fg-muted);
248
254
  text-transform: uppercase;
249
255
  }
250
256
  .sa-pv-diff__stat-value {
251
257
  font-family: var(--sa-font-head, system-ui, sans-serif);
252
258
  font-weight: 700;
253
- font-size: 22px;
259
+ font-size: var(--sa-text-2xl);
254
260
  }
255
261
  .sa-pv-diff__stat-value--warn {
256
- color: var(--sa-warning, #b45309);
262
+ color: var(--sa-color-warning-fg);
257
263
  }
258
264
  .sa-pv-diff__stat-value--bad {
259
- color: var(--sa-negative, #dc2626);
265
+ color: var(--sa-color-negative);
260
266
  }
261
267
 
262
268
  .sa-pv-diff__section {
263
269
  margin: 22px 0 10px;
264
270
  font-family: var(--sa-font-head, system-ui, sans-serif);
265
- font-size: 14px;
271
+ font-size: var(--sa-text-lg);
266
272
  font-weight: 700;
267
- color: var(--sa-muted, var(--sa-muted));
273
+ color: var(--sa-color-fg-muted);
268
274
  text-transform: uppercase;
269
275
  letter-spacing: 0.08em;
270
276
  }