@saasicat/ui-vue 0.22.2 → 0.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/README.md +1 -1
  2. package/dist/{chunk-LY52T4N4.js → chunk-TQQMKWN6.js} +58 -1
  3. package/dist/{chunk-XMMFN2WJ.js → chunk-VYMTWCTT.js} +51 -1
  4. package/dist/client/index.cjs +57 -0
  5. package/dist/client/index.d.cts +58 -1
  6. package/dist/client/index.d.ts +58 -1
  7. package/dist/client/index.js +15 -1
  8. package/dist/index.cjs +321 -159
  9. package/dist/index.d.cts +67 -4
  10. package/dist/index.d.ts +67 -4
  11. package/dist/index.js +72 -2
  12. package/dist/quasar/index.cjs +116 -20
  13. package/dist/quasar/index.d.cts +48 -3
  14. package/dist/quasar/index.d.ts +48 -3
  15. package/dist/quasar/index.js +58 -3
  16. package/dist/{use-super-admin-i18n-CgTuNi8h.d.cts → use-sa-theme-B5t7oXph.d.cts} +51 -1
  17. package/dist/{use-super-admin-i18n-CHNdsSlm.d.ts → use-sa-theme-OUBlaqgl.d.ts} +51 -1
  18. package/package.json +5 -2
  19. package/src/client/identity-accents.ts +129 -0
  20. package/src/client/index.ts +1 -0
  21. package/src/components/BundleVersionPublishDialog.vue +17 -17
  22. package/src/components/KvBlock.vue +6 -6
  23. package/src/components/MarketingPromotionsTab.vue +84 -80
  24. package/src/components/MfaPromptDialog.vue +2 -2
  25. package/src/components/TenantActionConfirmDialog.vue +5 -5
  26. package/src/components/VersionDiffPreview.vue +18 -18
  27. package/src/components/bundle-editor/BundleCreatePanel.vue +52 -52
  28. package/src/components/bundle-editor/BundleFeaturesEditor.vue +20 -20
  29. package/src/components/bundle-editor/BundlePlanCompatPicker.vue +33 -33
  30. package/src/components/bundle-editor/BundleQuotasEditor.vue +26 -26
  31. package/src/components/bundle-editor/BundleStatusBanner.vue +21 -21
  32. package/src/components/bundle-editor/BundleVersionInlineEditor.vue +49 -49
  33. package/src/components/bundle-editor/BundleVersionStrip.vue +30 -30
  34. package/src/components/dialogs/PilotCreateDialog.vue +20 -20
  35. package/src/components/dialogs/PilotEditDialog.vue +6 -6
  36. package/src/components/dialogs/PromoCodeCreateDialog.vue +9 -9
  37. package/src/components/dialogs/PromoCodeDialogFields.vue +64 -63
  38. package/src/components/dialogs/PromoCodeEditDialog.vue +11 -11
  39. package/src/components/dialogs/pilot-dialog.css +48 -48
  40. package/src/components/plan/PlanCycleToggle.vue +9 -16
  41. package/src/components/plan/PlanGrid.vue +30 -34
  42. package/src/components/plan/PriceSummary.vue +35 -35
  43. package/src/components/plan/PromoCodeInput.vue +26 -26
  44. package/src/components/plan/PublicBundleGrid.vue +32 -28
  45. package/src/components/plan-create-dialog/PlanCreateDialog.vue +50 -50
  46. package/src/components/plan-detail/PlanDetail.vue +178 -157
  47. package/src/components/plan-detail/PlanTitleEdit.vue +11 -11
  48. package/src/components/plan-list/PlanList.vue +116 -100
  49. package/src/components/plan-matrix/PlanMatrix.vue +97 -114
  50. package/src/components/plan-review/PlanReview.vue +61 -57
  51. package/src/components/plan-version-editor/PlanVersionEditor.vue +246 -203
  52. package/src/components/wizard-stepper/WizardStepper.vue +17 -17
  53. package/src/index.ts +1 -0
  54. package/src/pages-standard/AdminLayout.vue +58 -37
  55. package/src/pages-standard/AdminManifestErrorPage.vue +6 -6
  56. package/src/pages-standard/AuditPage.vue +3 -3
  57. package/src/pages-standard/BundlesPage.vue +37 -37
  58. package/src/pages-standard/DashboardPage.vue +22 -19
  59. package/src/pages-standard/DiscoveryPage.vue +55 -49
  60. package/src/pages-standard/EmailHistoryPage.vue +53 -71
  61. package/src/pages-standard/MarketingCatalogPage.vue +245 -221
  62. package/src/pages-standard/PilotsPage.vue +7 -6
  63. package/src/pages-standard/PlatformEmailPage.vue +18 -18
  64. package/src/pages-standard/PromoCodeDetailPage.vue +3 -3
  65. package/src/pages-standard/PromoCodesPage.vue +10 -7
  66. package/src/pages-standard/SuperAdminLoginPage.vue +39 -25
  67. package/src/pages-standard/SuperAdminSetupWizard.vue +44 -33
  68. package/src/pages-standard/TenantDetailPage.vue +7 -7
  69. package/src/pages-standard/TenantsPage.vue +16 -50
  70. package/src/pages-standard/bundles-page/BundleAccordionList.vue +13 -13
  71. package/src/pages-standard/discovery-page/CatalogEntryTransPanel.vue +24 -24
  72. package/src/pages-standard/discovery-page/DiscoveryCapList.vue +22 -22
  73. package/src/pages-standard/discovery-page/DiscoveryFeatureCard.vue +39 -39
  74. package/src/pages-standard/discovery-page/DiscoveryQuotaCard.vue +26 -26
  75. package/src/pages-standard/discovery-page/DiscoveryStatusControl.vue +1 -1
  76. package/src/pages-standard/discovery-page/discovery-ui.ts +10 -7
  77. package/src/pages-standard/marketing-catalog/MarketingCatalogAdmin.vue +2 -5
  78. package/src/pages-standard/plan-versions/PlanDiffCard.vue +27 -20
  79. package/src/pages-standard/plan-versions/PlanVersionsDiff.vue +24 -16
  80. package/src/pages-standard/plan-versions/PlanVersionsTimeline.vue +45 -45
  81. package/src/pages-standard/plans-page/PlanBundleOverview.vue +21 -15
  82. package/src/pages-standard/plans-page/PlanPublishDialog.vue +4 -4
  83. package/src/pages-standard/plans-page/PlansPageToast.vue +6 -6
  84. package/src/pages-standard/sa-theme.css +9 -687
  85. package/src/pages-standard/tenants/StatusPill.vue +13 -13
  86. package/src/pages-standard/tenants/format.ts +11 -12
  87. package/src/pages-tenant/LimitsRow.vue +4 -4
  88. package/src/pages-tenant/MySubscriptionBundlesPage.vue +70 -61
  89. package/src/pages-tenant/OnboardingConfigurator.vue +25 -25
  90. package/src/pages-tenant/PackageSnapshotPanel.vue +10 -16
  91. package/src/pages-tenant/PendingVersionBanner.vue +12 -12
  92. package/src/pages-tenant/PlanChangeWizard.vue +22 -76
  93. package/src/pages-tenant/TenantPlanSection.vue +19 -69
  94. package/src/pages-tenant/UsageBar.vue +7 -7
  95. package/src/pages-tenant/default-i18n.ts +113 -0
  96. package/src/pages-tenant/tenant-plan-section/BundlePreviewDialog.vue +14 -14
  97. package/src/pages-tenant/tenant-plan-section/TenantBundleStore.vue +10 -10
  98. package/src/pages-tenant/tenant-plan-section/TenantFeatureMatrix.vue +2 -2
  99. package/src/quasar/create-super-admin-app.ts +96 -1
  100. package/src/quasar/dark-bridge.ts +66 -0
  101. package/src/quasar/index.ts +1 -0
  102. package/src/ui/theme/_breakpoints.scss +34 -0
  103. package/src/ui/theme/base.css +50 -0
  104. package/src/ui/theme/components/body.css +23 -0
  105. package/src/ui/theme/components/button.css +158 -0
  106. package/src/ui/theme/components/card.css +74 -0
  107. package/src/ui/theme/components/field.css +38 -0
  108. package/src/ui/theme/components/hero.css +46 -0
  109. package/src/ui/theme/components/paginator.css +63 -0
  110. package/src/ui/theme/components/section.css +67 -0
  111. package/src/ui/theme/components/statistics.css +189 -0
  112. package/src/ui/theme/components/table.css +60 -0
  113. package/src/ui/theme/index.css +42 -0
  114. package/src/ui/theme/tokens.legacy.css +147 -0
  115. package/src/ui/theme/tokens.primitive.css +112 -0
  116. package/src/ui/theme/tokens.scale.css +103 -0
  117. package/src/ui/theme/tokens.semantic.dark.css +185 -0
  118. package/src/ui/theme/tokens.semantic.light.css +242 -0
  119. package/src/vue/use-sa-theme.ts +154 -0
@@ -265,6 +265,7 @@
265
265
 
266
266
  <script setup lang="ts">
267
267
  import { computed } from 'vue';
268
+ import { identityChipStyle } from '../../client/identity-accents.js';
268
269
  import { formatMessage } from '../../client/i18n/format.js';
269
270
  import { useSaMessages } from '../../vue/use-super-admin-i18n.js';
270
271
  import type { PromoCodeDurationType, PromoCodePlanOption, PromoCodeValueType } from './types.js';
@@ -376,7 +377,7 @@ function togglePlan(key: string): void {
376
377
 
377
378
  function planChipStyle(p: PromoCodePlanOption): Record<string, string> {
378
379
  if (!isPlanSelected(p.key) || !p.color) return {};
379
- return { borderColor: p.color, background: `${p.color}12`, color: p.color };
380
+ return { ...identityChipStyle(p.color), borderColor: p.color };
380
381
  }
381
382
 
382
383
  const previewValue = computed(() => {
@@ -408,17 +409,17 @@ const advancedOpen = defineModel<boolean>('advancedOpen', { default: false });
408
409
 
409
410
  <style scoped>
410
411
  .pc-section {
411
- border: 1px solid var(--sa-border, var(--sa-border));
412
+ border: 1px solid var(--sa-color-border);
412
413
  border-radius: 10px;
413
414
  padding: 14px 16px;
414
- background: #fafbfc;
415
+ background: var(--sa-color-bg-surface-raised);
415
416
  }
416
417
 
417
418
  .pc-section__title {
418
419
  font-family: var(--sa-font-head, system-ui, sans-serif);
419
420
  font-weight: 700;
420
- font-size: 13px;
421
- color: var(--sa-heading, var(--sa-heading));
421
+ font-size: var(--sa-text-md);
422
+ color: var(--sa-color-fg-heading);
422
423
  margin-bottom: 12px;
423
424
  letter-spacing: -0.005em;
424
425
  }
@@ -427,8 +428,8 @@ const advancedOpen = defineModel<boolean>('advancedOpen', { default: false });
427
428
  border: 0;
428
429
  background: transparent;
429
430
  cursor: pointer;
430
- font: 600 12.5px var(--sa-font-body, system-ui, sans-serif);
431
- color: var(--sa-muted-dark, var(--sa-muted-dark));
431
+ font: 600 var(--sa-text-md) var(--sa-font-body, system-ui, sans-serif);
432
+ color: var(--sa-color-fg-secondary);
432
433
  display: inline-flex;
433
434
  align-items: center;
434
435
  gap: 4px;
@@ -452,7 +453,7 @@ const advancedOpen = defineModel<boolean>('advancedOpen', { default: false });
452
453
  grid-template-columns: 1fr 1fr;
453
454
  }
454
455
 
455
- @media (max-width: 600px) {
456
+ @media (max-width: 599.98px) {
456
457
  .pc-grid--2 {
457
458
  grid-template-columns: 1fr;
458
459
  }
@@ -469,42 +470,42 @@ const advancedOpen = defineModel<boolean>('advancedOpen', { default: false });
469
470
  }
470
471
 
471
472
  .pc-field__label {
472
- font-size: 11.5px;
473
+ font-size: var(--sa-text-sm);
473
474
  font-weight: 600;
474
- color: var(--sa-muted, var(--sa-muted));
475
+ color: var(--sa-color-fg-muted);
475
476
  text-transform: uppercase;
476
477
  letter-spacing: 0.04em;
477
478
  }
478
479
 
479
480
  .pc-field__hint {
480
- font-size: 11.5px;
481
- color: var(--sa-muted-light);
481
+ font-size: var(--sa-text-sm);
482
+ color: var(--sa-color-fg-subtle);
482
483
  }
483
484
 
484
485
  .pc-input {
485
486
  width: 100%;
486
- border: 1px solid var(--sa-border, var(--sa-border));
487
- background: #fff;
487
+ border: 1px solid var(--sa-color-border);
488
+ background: var(--sa-color-bg-surface);
488
489
  border-radius: 7px;
489
490
  padding: 8px 10px;
490
- font: 13.5px var(--sa-font-body, system-ui, sans-serif);
491
- color: var(--sa-body, #1e293b);
491
+ font: var(--sa-text-md) var(--sa-font-body, system-ui, sans-serif);
492
+ color: var(--sa-color-fg-body);
492
493
  outline: 0;
493
494
  }
494
495
 
495
496
  .pc-input:focus {
496
- border-color: var(--sa-primary, #3f6bff);
497
- box-shadow: 0 0 0 3px rgba(63, 107, 255, 0.12);
497
+ border-color: var(--sa-color-accent);
498
+ box-shadow: 0 0 0 3px var(--sa-shadow-tint-3);
498
499
  }
499
500
 
500
501
  .pc-input--code {
501
- font: 600 14px var(--sa-font-mono, ui-monospace, monospace);
502
+ font: 600 var(--sa-text-lg) var(--sa-font-mono, ui-monospace, monospace);
502
503
  letter-spacing: 0.04em;
503
504
  text-transform: uppercase;
504
505
  }
505
506
 
506
507
  textarea.pc-input {
507
- font: 13.5px var(--sa-font-body, system-ui, sans-serif);
508
+ font: var(--sa-text-md) var(--sa-font-body, system-ui, sans-serif);
508
509
  resize: vertical;
509
510
  }
510
511
 
@@ -515,17 +516,17 @@ textarea.pc-input {
515
516
  }
516
517
 
517
518
  .pc-btn-mini {
518
- border: 1px solid var(--sa-border, var(--sa-border));
519
- background: #fff;
519
+ border: 1px solid var(--sa-color-border);
520
+ background: var(--sa-color-bg-surface);
520
521
  border-radius: 7px;
521
522
  padding: 6px 10px;
522
- font: 500 12px var(--sa-font-body, system-ui, sans-serif);
523
+ font: 500 var(--sa-text-sm) var(--sa-font-body, system-ui, sans-serif);
523
524
  cursor: pointer;
524
- color: var(--sa-muted-dark, var(--sa-muted-dark));
525
+ color: var(--sa-color-fg-secondary);
525
526
  }
526
527
 
527
528
  .pc-btn-mini:hover {
528
- background: var(--sa-border-soft);
529
+ background: var(--sa-color-border-soft);
529
530
  }
530
531
 
531
532
  .pc-type-grid {
@@ -535,8 +536,8 @@ textarea.pc-input {
535
536
  }
536
537
 
537
538
  .pc-type-opt {
538
- border: 1px solid var(--sa-border, var(--sa-border));
539
- background: #fff;
539
+ border: 1px solid var(--sa-color-border);
540
+ background: var(--sa-color-bg-surface);
540
541
  border-radius: 8px;
541
542
  padding: 8px 10px;
542
543
  text-align: left;
@@ -547,22 +548,22 @@ textarea.pc-input {
547
548
  }
548
549
 
549
550
  .pc-type-opt:hover {
550
- border-color: #cbd5e1;
551
+ border-color: var(--sa-color-border-strong);
551
552
  }
552
553
 
553
554
  .pc-type-opt--active {
554
- border-color: var(--sa-primary, #3f6bff);
555
- background: var(--sa-primary-soft, rgba(63, 107, 255, 0.08));
555
+ border-color: var(--sa-color-accent);
556
+ background: var(--sa-color-accent-surface);
556
557
  }
557
558
 
558
559
  .pc-type-opt__label {
559
- font: 600 12.5px var(--sa-font-body, system-ui, sans-serif);
560
- color: var(--sa-heading, var(--sa-heading));
560
+ font: 600 var(--sa-text-md) var(--sa-font-body, system-ui, sans-serif);
561
+ color: var(--sa-color-fg-heading);
561
562
  }
562
563
 
563
564
  .pc-type-opt__sub {
564
- font: 11.5px var(--sa-font-mono, ui-monospace, monospace);
565
- color: var(--sa-muted, var(--sa-muted));
565
+ font: var(--sa-text-sm) var(--sa-font-mono, ui-monospace, monospace);
566
+ color: var(--sa-color-fg-muted);
566
567
  margin-top: 1px;
567
568
  }
568
569
 
@@ -576,26 +577,26 @@ textarea.pc-input {
576
577
  display: inline-flex;
577
578
  align-items: center;
578
579
  gap: 8px;
579
- background: #fff;
580
- border: 1px solid var(--sa-border, var(--sa-border));
580
+ background: var(--sa-color-bg-surface);
581
+ border: 1px solid var(--sa-color-border);
581
582
  border-radius: 999px;
582
583
  padding: 5px 12px 5px 8px;
583
- font: 600 12px var(--sa-font-body, system-ui, sans-serif);
584
+ font: 600 var(--sa-text-sm) var(--sa-font-body, system-ui, sans-serif);
584
585
  cursor: pointer;
585
- color: var(--sa-muted-dark, var(--sa-muted-dark));
586
+ color: var(--sa-color-fg-secondary);
586
587
  transition:
587
588
  border-color 0.1s,
588
589
  background 0.1s;
589
590
  }
590
591
 
591
592
  .pc-plan-opt:hover {
592
- border-color: #cbd5e1;
593
+ border-color: var(--sa-color-border-strong);
593
594
  }
594
595
 
595
596
  .pc-plan-opt--on {
596
- border-color: var(--sa-primary, #3f6bff);
597
- background: var(--sa-primary-soft, rgba(63, 107, 255, 0.08));
598
- color: var(--sa-primary, #3f6bff);
597
+ border-color: var(--sa-color-accent);
598
+ background: var(--sa-color-accent-surface);
599
+ color: var(--sa-color-accent);
599
600
  }
600
601
 
601
602
  .pc-plan-opt__mark {
@@ -611,41 +612,41 @@ textarea.pc-input {
611
612
 
612
613
  .pc-dur-opt {
613
614
  flex: 1;
614
- border: 1px solid var(--sa-border, var(--sa-border));
615
- background: #fff;
615
+ border: 1px solid var(--sa-color-border);
616
+ background: var(--sa-color-bg-surface);
616
617
  border-radius: 7px;
617
618
  padding: 6px 10px;
618
- font: 500 12px var(--sa-font-body, system-ui, sans-serif);
619
+ font: 500 var(--sa-text-sm) var(--sa-font-body, system-ui, sans-serif);
619
620
  cursor: pointer;
620
- color: var(--sa-muted-dark, var(--sa-muted-dark));
621
+ color: var(--sa-color-fg-secondary);
621
622
  }
622
623
 
623
624
  .pc-dur-opt--active {
624
- border-color: var(--sa-primary, #3f6bff);
625
- background: var(--sa-primary-soft, rgba(63, 107, 255, 0.08));
626
- color: var(--sa-primary, #3f6bff);
625
+ border-color: var(--sa-color-accent);
626
+ background: var(--sa-color-accent-surface);
627
+ color: var(--sa-color-accent);
627
628
  }
628
629
 
629
630
  .pc-check {
630
631
  display: inline-flex;
631
632
  align-items: center;
632
633
  gap: 8px;
633
- font: 13px var(--sa-font-body, system-ui, sans-serif);
634
- color: var(--sa-body, #1e293b);
634
+ font: var(--sa-text-md) var(--sa-font-body, system-ui, sans-serif);
635
+ color: var(--sa-color-fg-body);
635
636
  cursor: pointer;
636
637
  }
637
638
 
638
639
  .pc-preview {
639
- background: var(--sa-primary-soft, rgba(63, 107, 255, 0.06));
640
- border: 1px solid var(--sa-primary-border, rgba(63, 107, 255, 0.18));
640
+ background: var(--sa-color-accent-surface-soft);
641
+ border: 1px solid var(--sa-color-accent-border);
641
642
  border-radius: 10px;
642
643
  padding: 12px 14px;
643
644
  }
644
645
 
645
646
  .pc-preview__eyebrow {
646
- font-size: 11px;
647
+ font-size: var(--sa-text-xs);
647
648
  font-weight: 700;
648
- color: var(--sa-primary, #3f6bff);
649
+ color: var(--sa-color-accent);
649
650
  text-transform: uppercase;
650
651
  letter-spacing: 0.06em;
651
652
  margin-bottom: 6px;
@@ -659,22 +660,22 @@ textarea.pc-input {
659
660
  }
660
661
 
661
662
  .pc-preview__code {
662
- background: #fff;
663
- border: 1px solid var(--sa-border, var(--sa-border));
663
+ background: var(--sa-color-bg-surface);
664
+ border: 1px solid var(--sa-color-border);
664
665
  border-radius: 6px;
665
666
  padding: 3px 8px;
666
- font: 600 13px var(--sa-font-mono, ui-monospace, monospace);
667
+ font: 600 var(--sa-text-md) var(--sa-font-mono, ui-monospace, monospace);
667
668
  letter-spacing: 0.04em;
668
- color: var(--sa-heading, var(--sa-heading));
669
+ color: var(--sa-color-fg-heading);
669
670
  }
670
671
 
671
672
  .pc-preview__disc {
672
- font: 700 13px var(--sa-font-body, system-ui, sans-serif);
673
- color: var(--sa-positive, #047857);
673
+ font: 700 var(--sa-text-md) var(--sa-font-body, system-ui, sans-serif);
674
+ color: var(--sa-color-positive-fg);
674
675
  }
675
676
 
676
677
  .pc-preview__meta {
677
- font-size: 12px;
678
- color: var(--sa-muted, var(--sa-muted));
678
+ font-size: var(--sa-text-sm);
679
+ color: var(--sa-color-fg-muted);
679
680
  }
680
681
  </style>
@@ -303,13 +303,13 @@ async function onSubmit() {
303
303
  .pc-dlg__title {
304
304
  font-family: var(--sa-font-head, system-ui, sans-serif);
305
305
  font-weight: 700;
306
- font-size: 18px;
307
- color: var(--sa-heading, var(--sa-heading));
306
+ font-size: var(--sa-text-xl);
307
+ color: var(--sa-color-fg-heading);
308
308
  }
309
309
 
310
310
  .pc-dlg__sub {
311
- font-size: 12.5px;
312
- color: var(--sa-muted, var(--sa-muted));
311
+ font-size: var(--sa-text-md);
312
+ color: var(--sa-color-fg-muted);
313
313
  margin-top: 2px;
314
314
  }
315
315
 
@@ -321,14 +321,14 @@ async function onSubmit() {
321
321
  }
322
322
 
323
323
  .pc-dlg__foot {
324
- border-top: 1px solid var(--sa-border, var(--sa-border));
324
+ border-top: 1px solid var(--sa-color-border);
325
325
  }
326
326
 
327
327
  .pc-error {
328
- background: #fef2f2;
329
- border: 1px solid #fecaca;
330
- color: #b91c1c;
331
- font-size: 13px;
328
+ background: var(--sa-color-negative-surface);
329
+ border: 1px solid var(--sa-color-negative-border);
330
+ color: var(--sa-color-negative-fg);
331
+ font-size: var(--sa-text-md);
332
332
  margin: 8px 0 0;
333
333
  padding: 8px 12px;
334
334
  border-radius: 8px;
@@ -336,8 +336,8 @@ async function onSubmit() {
336
336
 
337
337
  /* The code cannot be changed after creation. */
338
338
  .pc-input:disabled {
339
- background: var(--sa-bg-surface-2);
340
- color: var(--sa-muted);
339
+ background: var(--sa-color-bg-sunken);
340
+ color: var(--sa-color-fg-muted);
341
341
  cursor: not-allowed;
342
342
  }
343
343
  </style>
@@ -13,14 +13,14 @@
13
13
  align-items: flex-start;
14
14
  gap: 16px;
15
15
  padding: 18px 22px 14px;
16
- border-bottom: 1px solid var(--sa-border, #e2e8f0);
16
+ border-bottom: 1px solid var(--sa-color-border);
17
17
  }
18
18
 
19
19
  .pl-dlg__title {
20
20
  font-family: var(--sa-font-head, system-ui, sans-serif);
21
21
  font-weight: 700;
22
- font-size: 17px;
23
- color: var(--sa-heading, #0f172a);
22
+ font-size: var(--sa-text-xl);
23
+ color: var(--sa-color-fg-heading);
24
24
  letter-spacing: -0.015em;
25
25
  }
26
26
 
@@ -29,8 +29,8 @@
29
29
  }
30
30
 
31
31
  .pl-dlg__foot {
32
- border-top: 1px solid var(--sa-border, #e2e8f0);
33
- background: #fbfbfd;
32
+ border-top: 1px solid var(--sa-color-border);
33
+ background: var(--sa-color-bg-surface-raised);
34
34
  padding: 12px 18px;
35
35
  }
36
36
 
@@ -44,42 +44,42 @@
44
44
  gap: 12px;
45
45
  margin-bottom: 12px;
46
46
  padding-bottom: 10px;
47
- border-bottom: 1px solid #f1f5f9;
47
+ border-bottom: 1px solid var(--sa-color-border-soft);
48
48
  }
49
49
 
50
50
  .pl-section__num {
51
51
  width: 24px;
52
52
  height: 24px;
53
- background: #eff6ff;
54
- color: #1d4ed8;
53
+ background: var(--sa-color-info-surface);
54
+ color: var(--sa-color-info-fg);
55
55
  border-radius: 50%;
56
- font: 700 12px var(--sa-font-body, system-ui, sans-serif);
56
+ font: 700 var(--sa-text-sm) var(--sa-font-body, system-ui, sans-serif);
57
57
  display: grid;
58
58
  place-items: center;
59
59
  flex: 0 0 auto;
60
60
  }
61
61
 
62
62
  .pl-section__title {
63
- font-size: 13.5px;
63
+ font-size: var(--sa-text-md);
64
64
  font-weight: 700;
65
- color: var(--sa-heading, #0f172a);
65
+ color: var(--sa-color-fg-heading);
66
66
  letter-spacing: -0.005em;
67
67
  }
68
68
 
69
69
  .pl-section__sub {
70
- font-size: 11.5px;
71
- color: #94a3b8;
70
+ font-size: var(--sa-text-sm);
71
+ color: var(--sa-color-fg-subtle);
72
72
  margin-top: 2px;
73
73
  }
74
74
 
75
75
  .pl-input {
76
76
  width: 100%;
77
77
  padding: 9px 12px;
78
- background: #fff;
79
- border: 1px solid var(--sa-border, #e2e8f0);
78
+ background: var(--sa-color-bg-surface);
79
+ border: 1px solid var(--sa-color-border);
80
80
  border-radius: 8px;
81
- font: 13px var(--sa-font-body, system-ui, sans-serif);
82
- color: var(--sa-body, #1e293b);
81
+ font: var(--sa-text-md) var(--sa-font-body, system-ui, sans-serif);
82
+ color: var(--sa-color-fg-body);
83
83
  outline: 0;
84
84
  transition:
85
85
  border-color 0.12s,
@@ -87,8 +87,8 @@
87
87
  }
88
88
 
89
89
  .pl-input:focus {
90
- border-color: var(--sa-primary, #3f6bff);
91
- box-shadow: 0 0 0 3px rgba(63, 107, 255, 0.12);
90
+ border-color: var(--sa-color-accent);
91
+ box-shadow: 0 0 0 3px var(--sa-shadow-tint-3);
92
92
  }
93
93
 
94
94
  .pl-plan-select {
@@ -102,8 +102,8 @@
102
102
  align-items: center;
103
103
  gap: 10px;
104
104
  padding: 8px 11px;
105
- background: #fff;
106
- border: 1px solid var(--sa-border, #e2e8f0);
105
+ background: var(--sa-color-bg-surface);
106
+ border: 1px solid var(--sa-color-border);
107
107
  border-radius: 8px;
108
108
  cursor: pointer;
109
109
  text-align: left;
@@ -114,14 +114,14 @@
114
114
  }
115
115
 
116
116
  .pl-plan-opt:hover {
117
- border-color: #93c5fd;
118
- background: #fafbff;
117
+ border-color: var(--sa-color-info-border);
118
+ background: var(--sa-color-accent-surface-soft);
119
119
  }
120
120
 
121
121
  .pl-plan-opt--active {
122
- border-color: var(--sa-primary, #2563eb);
123
- background: #eff6ff;
124
- box-shadow: 0 0 0 1px var(--sa-primary, #2563eb) inset;
122
+ border-color: var(--sa-color-info);
123
+ background: var(--sa-color-info-surface);
124
+ box-shadow: 0 0 0 1px var(--sa-color-info) inset;
125
125
  }
126
126
 
127
127
  .pl-plan-opt__dot {
@@ -139,19 +139,19 @@
139
139
  }
140
140
 
141
141
  .pl-plan-opt__key {
142
- font: 700 11px var(--sa-font-mono, ui-monospace, monospace);
142
+ font: 700 var(--sa-text-xs) var(--sa-font-mono, ui-monospace, monospace);
143
143
  letter-spacing: 0.05em;
144
- color: var(--sa-heading, #0f172a);
144
+ color: var(--sa-color-fg-heading);
145
145
  }
146
146
 
147
147
  .pl-plan-opt__label {
148
- font-size: 11px;
149
- color: var(--sa-muted, #64748b);
148
+ font-size: var(--sa-text-xs);
149
+ color: var(--sa-color-fg-muted);
150
150
  margin-top: 1px;
151
151
  }
152
152
 
153
153
  .pl-plan-opt__check {
154
- color: #1d4ed8;
154
+ color: var(--sa-color-info-fg);
155
155
  }
156
156
 
157
157
  .pl-end-row {
@@ -169,18 +169,18 @@
169
169
  align-items: center;
170
170
  gap: 4px;
171
171
  padding: 7px 10px;
172
- background: #fff;
173
- border: 1px solid var(--sa-border, #e2e8f0);
172
+ background: var(--sa-color-bg-surface);
173
+ border: 1px solid var(--sa-color-border);
174
174
  border-radius: 7px;
175
- color: var(--sa-muted-dark, #475569);
176
- font: 500 11.5px var(--sa-font-body, system-ui, sans-serif);
175
+ color: var(--sa-color-fg-secondary);
176
+ font: 500 var(--sa-text-sm) var(--sa-font-body, system-ui, sans-serif);
177
177
  cursor: pointer;
178
178
  white-space: nowrap;
179
179
  }
180
180
 
181
181
  .pl-btn-mini:hover {
182
- background: #f8fafc;
183
- border-color: #cbd5e1;
182
+ background: var(--sa-color-bg-sunken);
183
+ border-color: var(--sa-color-border-strong);
184
184
  }
185
185
 
186
186
  .pl-end-presets {
@@ -192,11 +192,11 @@
192
192
 
193
193
  .pl-preset-btn {
194
194
  padding: 4px 9px;
195
- background: #fff;
196
- border: 1px dashed #cbd5e1;
195
+ background: var(--sa-color-bg-surface);
196
+ border: 1px dashed var(--sa-color-border-strong);
197
197
  border-radius: 999px;
198
- font: 600 11px var(--sa-font-body, system-ui, sans-serif);
199
- color: var(--sa-muted-dark, #475569);
198
+ font: 600 var(--sa-text-xs) var(--sa-font-body, system-ui, sans-serif);
199
+ color: var(--sa-color-fg-secondary);
200
200
  cursor: pointer;
201
201
  transition:
202
202
  background 0.12s,
@@ -205,17 +205,17 @@
205
205
  }
206
206
 
207
207
  .pl-preset-btn:hover {
208
- background: #eff6ff;
209
- border-color: #93c5fd;
208
+ background: var(--sa-color-info-surface);
209
+ border-color: var(--sa-color-info-border);
210
210
  border-style: solid;
211
- color: #1d4ed8;
211
+ color: var(--sa-color-info-fg);
212
212
  }
213
213
 
214
214
  .pl-error {
215
- background: #fef2f2;
216
- border: 1px solid #fecaca;
217
- color: #b91c1c;
218
- font-size: 13px;
215
+ background: var(--sa-color-negative-surface);
216
+ border: 1px solid var(--sa-color-negative-border);
217
+ color: var(--sa-color-negative-fg);
218
+ font-size: var(--sa-text-md);
219
219
  margin: 12px 0 0;
220
220
  padding: 8px 12px;
221
221
  border-radius: 8px;
@@ -61,28 +61,21 @@ const labels = computed(() => ({
61
61
  <style scoped>
62
62
  .sp-cycle {
63
63
  display: inline-flex;
64
- /* CSS-Vars: dark-mode-overrides unten via :global(.body--dark) */
65
- --sp-cycle-bg: rgba(15, 118, 110, 0.06);
66
- --sp-cycle-btn-fg: rgba(0, 0, 0, 0.55);
67
- --sp-cycle-btn-active-bg: #fff;
68
- --sp-cycle-btn-active-fg: var(--q-primary, #0f766e);
64
+ --sp-cycle-bg: var(--sa-color-accent-surface-soft);
65
+ --sp-cycle-btn-fg: var(--sa-color-fg-muted);
66
+ --sp-cycle-btn-active-bg: var(--sa-color-bg-surface);
67
+ --sp-cycle-btn-active-fg: var(--sa-color-accent);
69
68
  background: var(--sp-cycle-bg);
70
69
  border-radius: 12px;
71
70
  padding: 3px;
72
71
  gap: 2px;
73
72
  }
74
- :global(.body--dark) .sp-cycle {
75
- --sp-cycle-bg: rgba(255, 255, 255, 0.08);
76
- --sp-cycle-btn-fg: rgba(255, 255, 255, 0.7);
77
- --sp-cycle-btn-active-bg: rgba(255, 255, 255, 0.92);
78
- --sp-cycle-btn-active-fg: var(--q-primary, #0f766e);
79
- }
80
73
  .sp-cycle__btn {
81
74
  padding: 8px 14px;
82
75
  border: none;
83
76
  background: none;
84
77
  font-family: inherit;
85
- font-size: 12px;
78
+ font-size: var(--sa-text-sm);
86
79
  font-weight: 700;
87
80
  color: var(--sp-cycle-btn-fg);
88
81
  cursor: pointer;
@@ -96,12 +89,12 @@ const labels = computed(() => ({
96
89
  .sp-cycle__btn--active {
97
90
  background: var(--sp-cycle-btn-active-bg);
98
91
  color: var(--sp-cycle-btn-active-fg);
99
- box-shadow: 0 2px 8px rgba(15, 118, 110, 0.12);
92
+ box-shadow: 0 2px 8px var(--sa-shadow-tint-3);
100
93
  }
101
94
  .sp-cycle__pill {
102
- background: rgba(22, 163, 74, 0.16);
103
- color: #166534;
104
- font-size: 10px;
95
+ background: var(--sa-color-positive-surface-strong);
96
+ color: var(--sa-color-positive-fg);
97
+ font-size: var(--sa-text-2xs);
105
98
  padding: 2px 7px;
106
99
  border-radius: 999px;
107
100
  font-family: 'SF Mono', Consolas, monospace;