ui-style-kit-css 2.2.0 → 2.3.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 (63) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/README.md +100 -31
  3. package/STYLE-MAP.md +19 -0
  4. package/dist/ui-style-kit.css +18417 -1704
  5. package/dist/ui-style-kit.min.css +2 -2
  6. package/dist/ui-style-kit.visual.css +17709 -1446
  7. package/dist/ui-style-kit.visual.min.css +2 -2
  8. package/dist/ui-style-kit.with-bridge.css +18425 -1706
  9. package/dist/ui-style-kit.with-bridge.min.css +2 -2
  10. package/dist/visual/art-deco.css +4776 -0
  11. package/dist/visual/bauhaus.css +1809 -78
  12. package/dist/visual/bento.css +1825 -97
  13. package/dist/visual/brutalism.css +1774 -35
  14. package/dist/visual/clay.css +4789 -0
  15. package/dist/visual/cyberpunk.css +1765 -35
  16. package/dist/visual/data-terminal.css +4804 -0
  17. package/dist/visual/editorial-luxe.css +4804 -0
  18. package/dist/visual/industrial-utility.css +4797 -0
  19. package/dist/visual/maximalist.css +1771 -37
  20. package/dist/visual/minimal-saas.css +1801 -78
  21. package/dist/visual/neo-noir.css +4790 -0
  22. package/dist/visual/neumorphism.css +1807 -78
  23. package/dist/visual/organic-modern.css +4767 -0
  24. package/dist/visual/paper-editorial.css +4799 -0
  25. package/dist/visual/retro-glass.css +1786 -36
  26. package/dist/visual/retrofuturism.css +1759 -36
  27. package/dist/visual/tactile.css +1760 -36
  28. package/dist/visual/technical-blueprint.css +4791 -0
  29. package/dist/visual/y2k.css +1767 -35
  30. package/docs/ECOSYSTEM.md +8 -4
  31. package/docs/PUBLISHING.md +14 -10
  32. package/docs/STYLE-GUIDE.md +53 -13
  33. package/docs/TOKENS.md +10 -1
  34. package/docs/superpowers/plans/2026-08-29-preset-identity-system-refinement.md +649 -0
  35. package/docs/superpowers/specs/2026-08-29-preset-identity-system-refinement-design.md +212 -0
  36. package/manifest.json +160 -2
  37. package/package.json +63 -6
  38. package/styles/art-deco.css +683 -0
  39. package/styles/bauhaus.css +237 -3
  40. package/styles/bento.css +266 -7
  41. package/styles/brutalism.css +235 -3
  42. package/styles/clay.css +692 -0
  43. package/styles/components.css +608 -14
  44. package/styles/content-overflow.css +423 -4
  45. package/styles/cyberpunk.css +234 -3
  46. package/styles/data-terminal.css +691 -0
  47. package/styles/editorial-luxe.css +687 -0
  48. package/styles/industrial-utility.css +690 -0
  49. package/styles/interactive-surface-bridge.css +11 -5
  50. package/styles/interactive-surface-theme.css +11 -3
  51. package/styles/maximalist.css +238 -4
  52. package/styles/minimal-saas.css +234 -3
  53. package/styles/native-elements.css +64 -12
  54. package/styles/neo-noir.css +690 -0
  55. package/styles/neumorphism.css +234 -3
  56. package/styles/organic-modern.css +683 -0
  57. package/styles/paper-editorial.css +688 -0
  58. package/styles/retro-glass.css +242 -3
  59. package/styles/retrofuturism.css +233 -3
  60. package/styles/tactile.css +235 -3
  61. package/styles/technical-blueprint.css +686 -0
  62. package/styles/theme-colors.css +796 -5
  63. package/styles/y2k.css +237 -3
@@ -52,9 +52,9 @@
52
52
  --interactive-surface-level-2-bg: var(--interactive-surface-bg);
53
53
  --interactive-surface-level-2-border-color: var(--interactive-surface-border-color);
54
54
  --interactive-surface-level-2-shadow: 0 8px 20px rgb(var(--usk-bg-rgb, 0 0 0) / .22);
55
- --interactive-surface-level-3-bg: color-mix(in srgb, var(--interactive-surface-bg) 82%, var(--interactive-surface-variant-primary-bg));
56
- --interactive-surface-level-3-border-color: color-mix(in srgb, var(--interactive-surface-variant-primary-border-color) 72%, var(--interactive-surface-border-color));
57
- --interactive-surface-level-3-shadow: 0 14px 34px rgb(var(--usk-bg-rgb, 0 0 0) / .3), 0 0 0 1px color-mix(in srgb, var(--interactive-surface-variant-primary-border-color) 34%, transparent);
55
+ --interactive-surface-level-3-bg: var(--interactive-surface-bg);
56
+ --interactive-surface-level-3-border-color: var(--interactive-surface-variant-primary-border-color);
57
+ --interactive-surface-level-3-shadow: 0 14px 34px rgb(var(--usk-bg-rgb, 0 0 0) / .3);
58
58
  --interactive-surface-level-bg: var(--interactive-surface-level-1-bg);
59
59
  --interactive-surface-level-border-color: var(--interactive-surface-level-1-border-color);
60
60
  --interactive-surface-level-shadow: var(--interactive-surface-level-1-shadow);
@@ -69,13 +69,19 @@
69
69
  border-radius: var(--interactive-surface-radius);
70
70
  box-shadow: var(--interactive-surface-level-shadow, none);
71
71
  transition:
72
- background-color 160ms ease,
73
72
  border-color 160ms ease,
74
73
  box-shadow 160ms ease,
75
- color 160ms ease,
76
74
  transform 160ms ease;
77
75
  }
78
76
 
77
+ @supports (color: color-mix(in srgb, black, white)) {
78
+ :where([data-ui][data-theme][data-mode]) .interactive-surface {
79
+ --interactive-surface-level-3-bg: color-mix(in srgb, var(--interactive-surface-bg) 82%, var(--interactive-surface-variant-primary-bg));
80
+ --interactive-surface-level-3-border-color: color-mix(in srgb, var(--interactive-surface-variant-primary-border-color) 72%, var(--interactive-surface-border-color));
81
+ --interactive-surface-level-3-shadow: 0 14px 34px rgb(var(--usk-bg-rgb, 0 0 0) / .3), 0 0 0 1px color-mix(in srgb, var(--interactive-surface-variant-primary-border-color) 34%, transparent);
82
+ }
83
+ }
84
+
79
85
  :where([data-ui][data-theme][data-mode]) .interactive-surface::before {
80
86
  position: absolute;
81
87
  inset: 0;
@@ -44,9 +44,9 @@
44
44
  --interactive-surface-level-2-bg: var(--interactive-surface-bg);
45
45
  --interactive-surface-level-2-border-color: var(--interactive-surface-border-color);
46
46
  --interactive-surface-level-2-shadow: 0 8px 20px rgb(var(--usk-bg-rgb, 0 0 0) / .22);
47
- --interactive-surface-level-3-bg: color-mix(in srgb, var(--interactive-surface-bg) 82%, var(--interactive-surface-variant-primary-bg));
48
- --interactive-surface-level-3-border-color: color-mix(in srgb, var(--interactive-surface-variant-primary-border-color) 72%, var(--interactive-surface-border-color));
49
- --interactive-surface-level-3-shadow: 0 14px 34px rgb(var(--usk-bg-rgb, 0 0 0) / .3), 0 0 0 1px color-mix(in srgb, var(--interactive-surface-variant-primary-border-color) 34%, transparent);
47
+ --interactive-surface-level-3-bg: var(--interactive-surface-bg);
48
+ --interactive-surface-level-3-border-color: var(--interactive-surface-variant-primary-border-color);
49
+ --interactive-surface-level-3-shadow: 0 14px 34px rgb(var(--usk-bg-rgb, 0 0 0) / .3);
50
50
  --interactive-surface-level-bg: var(--interactive-surface-level-1-bg);
51
51
  --interactive-surface-level-border-color: var(--interactive-surface-level-1-border-color);
52
52
  --interactive-surface-level-shadow: var(--interactive-surface-level-1-shadow);
@@ -59,6 +59,14 @@
59
59
  color: var(--interactive-surface-fg);
60
60
  }
61
61
 
62
+ @supports (color: color-mix(in srgb, black, white)) {
63
+ :where([data-ui][data-theme][data-mode]) .interactive-surface {
64
+ --interactive-surface-level-3-bg: color-mix(in srgb, var(--interactive-surface-bg) 82%, var(--interactive-surface-variant-primary-bg));
65
+ --interactive-surface-level-3-border-color: color-mix(in srgb, var(--interactive-surface-variant-primary-border-color) 72%, var(--interactive-surface-border-color));
66
+ --interactive-surface-level-3-shadow: 0 14px 34px rgb(var(--usk-bg-rgb, 0 0 0) / .3), 0 0 0 1px color-mix(in srgb, var(--interactive-surface-variant-primary-border-color) 34%, transparent);
67
+ }
68
+ }
69
+
62
70
  :where([data-ui][data-theme][data-mode]) .interactive-surface[data-surface-variant="primary"] {
63
71
  --interactive-surface-bg: var(--interactive-surface-variant-primary-bg);
64
72
  --interactive-surface-fg: var(--interactive-surface-variant-primary-fg);
@@ -1,6 +1,6 @@
1
1
  /* =========================================================
2
2
  UI Style Kit CSS — Maximalist / Playful Theme System
3
- Includes 10 color schemes, light/dark/contrast modes,
3
+ Includes 20 color schemes, light/dark/contrast modes,
4
4
  component classes, native element coverage, and CSS-only
5
5
  accessibility presentation helpers.
6
6
 
@@ -131,7 +131,7 @@
131
131
  --max-fg: var(--max-text);
132
132
  --max-surface-fg: var(--max-text);
133
133
  --max-muted: var(--max-text-muted);
134
- --max-border: rgb(var(--max-border-rgb) / var(--max-border-alpha));
134
+ --max-border: rgb(var(--max-border-rgb) / max(var(--max-border-alpha), var(--usk-border-min-alpha)));
135
135
  --max-control-fg: var(--max-text);
136
136
  --max-primary: rgb(var(--max-primary-rgb));
137
137
  --max-primary-hover: rgb(var(--max-primary-hover-rgb));
@@ -161,6 +161,10 @@
161
161
  --max-spinner-accent: var(--max-accent);
162
162
  }
163
163
 
164
+ @supports (color: color-mix(in srgb, black, white)) {
165
+ [data-ui="maximalist"][data-theme][data-mode] { --max-border: color-mix(in srgb, rgb(var(--max-border-rgb) / max(var(--max-border-alpha), var(--usk-border-min-alpha))), var(--max-text) var(--usk-border-text-mix)); }
166
+ }
167
+
164
168
 
165
169
 
166
170
 
@@ -225,7 +229,8 @@
225
229
  ========================================================= */
226
230
 
227
231
  .max-title, .max-heading, .max-kicker, .max-button, .max-badge, .max-nav-link { font-family: var(--max-font-heading); }
228
- .max-title { margin: 0; color: var(--max-text); font-size: clamp(2rem, 5vw, 3.7rem); line-height: 1.02; letter-spacing: -0.04em; text-wrap: balance; }
232
+ .max-title { margin: 0; color: var(--max-text); font-size: clamp(2rem, 5vw, 3.7rem); line-height: 1.02; letter-spacing: -0.04em; }
233
+ @supports (text-wrap: balance) { .max-title { text-wrap: balance; } }
229
234
  .max-heading { margin: 0; color: var(--max-text); font-size: clamp(1.2rem, 2.5vw, 2rem); line-height: 1.15; letter-spacing: -0.03em; }
230
235
  .max-kicker { margin: 0; color: var(--max-primary); font-size: .82rem; font-weight: 850; letter-spacing: .12em; text-transform: uppercase; }
231
236
  .max-subtitle, .max-copy { margin: 0; color: var(--max-text-muted); line-height: 1.65; }
@@ -405,6 +410,235 @@
405
410
  @keyframes max-spin { to { transform: rotate(360deg); } }
406
411
 
407
412
 
413
+
414
+ /* =========================================================
415
+ Marketing / Commercial Component Modifiers
416
+ Reusable visual patterns derived from service-oriented brand systems.
417
+ ========================================================= */
418
+
419
+ .max-card-media {
420
+ display: block;
421
+ inline-size: 100%;
422
+ aspect-ratio: 16 / 9;
423
+ object-fit: cover;
424
+ border: 1px solid rgb(var(--max-border-rgb) / .72);
425
+ border-radius: var(--max-radius-lg);
426
+ }
427
+
428
+ .max-card-service {
429
+ position: relative;
430
+ display: grid;
431
+ gap: var(--max-space-3);
432
+ align-content: start;
433
+ text-align: center;
434
+ overflow: visible;
435
+ }
436
+ .max-card-service > .max-icon-medallion {
437
+ justify-self: center;
438
+ margin-block-start: -2.15rem;
439
+ position: relative;
440
+ z-index: 2;
441
+ }
442
+ .max-card-service > .max-card-media + .max-icon-medallion { margin-block-start: -2.15rem; }
443
+
444
+ .max-card-feature {
445
+ display: grid;
446
+ grid-template-columns: auto minmax(0, 1fr);
447
+ gap: var(--max-space-4);
448
+ align-items: start;
449
+ }
450
+
451
+ .max-card-accent-edge {
452
+ border-inline-start: .35rem solid var(--max-primary);
453
+ }
454
+
455
+ .max-icon-medallion {
456
+ display: inline-grid;
457
+ place-items: center;
458
+ inline-size: 3.75rem;
459
+ block-size: 3.75rem;
460
+ flex: 0 0 auto;
461
+ padding: .7rem;
462
+ background: var(--max-primary);
463
+ color: var(--max-on-primary);
464
+ border: 2px solid rgb(var(--max-border-rgb) / .82);
465
+ border-radius: 50%;
466
+ line-height: 1;
467
+ }
468
+ .max-icon-medallion > :where(svg, img) { inline-size: 100%; block-size: 100%; object-fit: contain; }
469
+
470
+ .max-button.max-button-cut,
471
+ .max-button-cut {
472
+ border-radius: 0;
473
+ clip-path: polygon(.6rem 0, 100% 0, 100% calc(100% - .6rem), calc(100% - .6rem) 100%, 0 100%, 0 .6rem);
474
+ }
475
+ .max-button.max-button-cut:focus-visible,
476
+ .max-button-cut:focus-visible { outline-offset: -3px; }
477
+
478
+ .max-button.max-button-outline-heavy,
479
+ .max-button-outline-heavy {
480
+ background: transparent;
481
+ color: var(--max-primary);
482
+ border-style: solid;
483
+ border-width: 2px;
484
+ border-color: var(--max-primary);
485
+ box-shadow: none;
486
+ }
487
+ .max-button.max-button-outline-heavy:hover,
488
+ .max-button-outline-heavy:hover {
489
+ background: var(--max-primary);
490
+ color: var(--max-on-primary);
491
+ border-color: var(--max-primary-hover);
492
+ }
493
+
494
+ .max-badge-seal {
495
+ display: inline-grid;
496
+ place-items: center;
497
+ align-content: center;
498
+ inline-size: 5rem;
499
+ min-inline-size: 5rem;
500
+ aspect-ratio: 1;
501
+ padding: .65rem;
502
+ background: var(--max-surface-strong);
503
+ color: var(--max-text);
504
+ border: 2px solid var(--max-primary);
505
+ border-radius: 50%;
506
+ text-align: center;
507
+ font-family: var(--max-font-heading);
508
+ font-size: .72rem;
509
+ font-weight: 900;
510
+ line-height: 1.05;
511
+ letter-spacing: .04em;
512
+ }
513
+
514
+ .max-feature-strip {
515
+ display: grid;
516
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 13rem), 1fr));
517
+ overflow: hidden;
518
+ background: var(--max-card-bg);
519
+ color: var(--max-text);
520
+ border: 1px solid var(--max-border);
521
+ border-radius: var(--max-radius-lg);
522
+ }
523
+
524
+ .max-feature-item {
525
+ display: grid;
526
+ grid-template-columns: auto minmax(0, 1fr);
527
+ align-items: center;
528
+ gap: var(--max-space-3);
529
+ min-inline-size: 0;
530
+ padding: var(--max-space-4);
531
+ border-inline-end: 1px solid rgb(var(--max-border-rgb) / .62);
532
+ }
533
+ .max-feature-item:last-child { border-inline-end: 0; }
534
+ .max-feature-item > :where(p, small) { margin: 0; color: var(--max-text-muted); }
535
+
536
+ .max-callout-bar {
537
+ display: grid;
538
+ grid-template-columns: auto minmax(0, 1fr) auto;
539
+ align-items: center;
540
+ gap: var(--max-space-4);
541
+ padding: var(--max-space-4) var(--max-space-5);
542
+ background: var(--max-card-bg);
543
+ color: var(--max-text);
544
+ border: 1px solid var(--max-border);
545
+ border-radius: var(--max-radius-lg);
546
+ }
547
+ .max-callout-bar > :where(p, div) { min-inline-size: 0; }
548
+ .max-callout-bar > :where(.max-button, a, button):last-child { justify-self: end; }
549
+
550
+ .max-eyebrow {
551
+ margin: 0;
552
+ color: var(--max-primary);
553
+ font-family: var(--max-font-heading);
554
+ font-size: .76rem;
555
+ font-weight: 900;
556
+ line-height: 1.2;
557
+ letter-spacing: .14em;
558
+ text-transform: uppercase;
559
+ }
560
+
561
+ .max-media-scrim {
562
+ position: relative;
563
+ overflow: hidden;
564
+ isolation: isolate;
565
+ min-block-size: 12rem;
566
+ background: var(--max-surface-soft);
567
+ border: 1px solid var(--max-border);
568
+ border-radius: var(--max-radius-lg);
569
+ }
570
+ .max-media-scrim > :where(img, picture, video) {
571
+ display: block;
572
+ inline-size: 100%;
573
+ block-size: 100%;
574
+ min-block-size: inherit;
575
+ object-fit: cover;
576
+ }
577
+ .max-media-scrim > :where(figcaption, [data-media-caption]) {
578
+ position: absolute;
579
+ z-index: 1;
580
+ inset-inline: 0;
581
+ inset-block-end: 0;
582
+ padding: clamp(1rem, 4vw, 2rem);
583
+ color: #fff;
584
+ background: linear-gradient(to top, rgb(0 0 0 / .9), rgb(0 0 0 / .58) 56%, transparent);
585
+ }
586
+ .max-media-scrim > :where(figcaption, [data-media-caption]) * {
587
+ color: inherit;
588
+ }
589
+
590
+ @media (max-width: 42rem) {
591
+ .max-callout-bar { grid-template-columns: 1fr; align-items: start; }
592
+ .max-callout-bar > :where(.max-button, a, button):last-child { justify-self: stretch; }
593
+ .max-feature-item { border-inline-end: 0; border-block-end: 1px solid rgb(var(--max-border-rgb) / .62); }
594
+ .max-feature-item:last-child { border-block-end: 0; }
595
+ }
596
+
597
+ .max-card-service, .max-card-feature { border-width: 2px; box-shadow: .45rem .45rem 0 rgb(var(--max-primary-rgb) / .22); }
598
+ .max-icon-medallion { transform: rotate(-3deg); box-shadow: .25rem .25rem 0 rgb(var(--max-secondary-rgb) / .5); }
599
+ .max-button-cut { clip-path: polygon(9% 0, 100% 0, 91% 100%, 0 100%); }
600
+ .max-callout-bar { background: linear-gradient(120deg, rgb(var(--max-primary-rgb) / .18), rgb(var(--max-secondary-rgb) / .15)), var(--max-card-bg); }
601
+
602
+ /* Filled and framed actions use opposing poster skews and a shared offset rhythm. */
603
+ .max-button.max-button-cut, .max-button-cut {
604
+ min-inline-size: 6rem;
605
+ max-inline-size: 100%;
606
+ justify-self: end;
607
+ justify-content: center;
608
+ clip-path: polygon(9% 0, 100% 0, 91% 100%, 0 100%);
609
+ box-shadow: .35rem .35rem 0 rgb(var(--max-secondary-rgb) / .52);
610
+ }
611
+ .max-button.max-button-outline-heavy, .max-button-outline-heavy {
612
+ border-width: 2px;
613
+ border-radius: 0;
614
+ clip-path: polygon(0 0, 91% 0, 100% 100%, 9% 100%);
615
+ box-shadow: -.28rem .28rem 0 rgb(var(--max-primary-rgb) / .32);
616
+ }
617
+
618
+ /* Marketing and native surfaces use layered token fills and poster-like displacement. */
619
+ .max-card-service, .max-media-scrim, .max-feature-strip, .max-callout-bar, .max-well {
620
+ background: linear-gradient(125deg, rgb(var(--max-primary-rgb) / .12), rgb(var(--max-secondary-rgb) / .1)), var(--max-card-bg);
621
+ border: 2px solid var(--max-border);
622
+ border-radius: var(--max-radius-sm);
623
+ box-shadow: .42rem .42rem 0 rgb(var(--max-secondary-rgb) / .28);
624
+ }
625
+ [data-ui="maximalist"][data-theme][data-mode] :where(button:not([class]), input[type="button"]:not([class]), input[type="submit"]:not([class]), input[type="reset"]:not([class])) {
626
+ border: 2px solid var(--max-primary);
627
+ border-radius: var(--max-radius-sm);
628
+ box-shadow: .28rem .28rem 0 rgb(var(--max-secondary-rgb) / .42);
629
+ }
630
+ [data-ui="maximalist"][data-theme][data-mode] :where(dialog) {
631
+ background: linear-gradient(135deg, rgb(var(--max-primary-rgb) / .1), rgb(var(--max-secondary-rgb) / .08)), var(--max-surface-strong);
632
+ border: 2px solid var(--max-border);
633
+ border-radius: var(--max-radius-sm);
634
+ box-shadow: .5rem .5rem 0 rgb(var(--max-secondary-rgb) / .32);
635
+ }
636
+
637
+ /* Busy indicators use an off-kilter layered blob instead of a neutral ring. */
638
+ .max-button[aria-busy="true"]::after, .max-icon-button[aria-busy="true"]::after, [data-ui="maximalist"] :where(button[aria-busy="true"], input[type="button"][aria-busy="true"], input[type="submit"][aria-busy="true"], input[type="reset"][aria-busy="true"])::after {
639
+ border: .11em solid currentColor; border-radius: 44% 56% 52% 48%; background: conic-gradient(currentColor, transparent 38%, currentColor 62%, transparent); box-shadow: .1em .1em 0 rgb(var(--max-secondary-rgb) / .7); clip-path: none; animation: max-spin .82s ease-in-out infinite;
640
+ }
641
+
408
642
  @media (prefers-reduced-motion: reduce) {
409
643
  [data-ui="maximalist"] *, [data-ui="maximalist"] *::before, [data-ui="maximalist"] *::after { scroll-behavior: auto !important; transition-duration: 1ms !important; animation-duration: 1ms !important; animation-iteration-count: 1 !important; }
410
644
  }
@@ -412,7 +646,7 @@
412
646
  [data-ui="maximalist"] { --max-border-alpha: 1; --max-focus-alpha: .75; }
413
647
  }
414
648
  @media (forced-colors: active) {
415
- [data-ui="maximalist"] * { forced-color-adjust: auto; }
649
+ @supports (forced-color-adjust: auto) { [data-ui="maximalist"] * { forced-color-adjust: auto; } }
416
650
  [data-ui="maximalist"] :where(:focus-visible) { outline: 3px solid CanvasText; }
417
651
  }
418
652
  @media print {
@@ -1,6 +1,6 @@
1
1
  /* =========================================================
2
2
  UI Style Kit CSS — Minimal SaaS Theme System
3
- Includes 10 color schemes, light/dark/contrast modes,
3
+ Includes 20 color schemes, light/dark/contrast modes,
4
4
  component classes, native element coverage, and CSS-only
5
5
  accessibility presentation helpers.
6
6
 
@@ -131,7 +131,7 @@
131
131
  --saas-fg: var(--saas-text);
132
132
  --saas-surface-fg: var(--saas-text);
133
133
  --saas-muted: var(--saas-text-muted);
134
- --saas-border: rgb(var(--saas-border-rgb) / var(--saas-border-alpha));
134
+ --saas-border: rgb(var(--saas-border-rgb) / max(var(--saas-border-alpha), var(--usk-border-min-alpha)));
135
135
  --saas-control-fg: var(--saas-text);
136
136
  --saas-primary: rgb(var(--saas-primary-rgb));
137
137
  --saas-primary-hover: rgb(var(--saas-primary-hover-rgb));
@@ -161,6 +161,10 @@
161
161
  --saas-spinner-accent: var(--saas-accent);
162
162
  }
163
163
 
164
+ @supports (color: color-mix(in srgb, black, white)) {
165
+ [data-ui="minimal-saas"][data-theme][data-mode] { --saas-border: color-mix(in srgb, rgb(var(--saas-border-rgb) / max(var(--saas-border-alpha), var(--usk-border-min-alpha))), var(--saas-text) var(--usk-border-text-mix)); }
166
+ }
167
+
164
168
 
165
169
 
166
170
 
@@ -401,6 +405,233 @@
401
405
  @keyframes saas-spin { to { transform: rotate(360deg); } }
402
406
 
403
407
 
408
+
409
+ /* =========================================================
410
+ Marketing / Commercial Component Modifiers
411
+ Reusable visual patterns derived from service-oriented brand systems.
412
+ ========================================================= */
413
+
414
+ .saas-card-media {
415
+ display: block;
416
+ inline-size: 100%;
417
+ aspect-ratio: 16 / 9;
418
+ object-fit: cover;
419
+ border: 1px solid rgb(var(--saas-border-rgb) / .72);
420
+ border-radius: var(--saas-radius-lg);
421
+ }
422
+
423
+ .saas-card-service {
424
+ position: relative;
425
+ display: grid;
426
+ gap: var(--saas-space-3);
427
+ align-content: start;
428
+ text-align: center;
429
+ overflow: visible;
430
+ }
431
+ .saas-card-service > .saas-icon-medallion {
432
+ justify-self: center;
433
+ margin-block-start: -2.15rem;
434
+ position: relative;
435
+ z-index: 2;
436
+ }
437
+ .saas-card-service > .saas-card-media + .saas-icon-medallion { margin-block-start: -2.15rem; }
438
+
439
+ .saas-card-feature {
440
+ display: grid;
441
+ grid-template-columns: auto minmax(0, 1fr);
442
+ gap: var(--saas-space-4);
443
+ align-items: start;
444
+ }
445
+
446
+ .saas-card-accent-edge {
447
+ border-inline-start: .35rem solid var(--saas-primary);
448
+ }
449
+
450
+ .saas-icon-medallion {
451
+ display: inline-grid;
452
+ place-items: center;
453
+ inline-size: 3.75rem;
454
+ block-size: 3.75rem;
455
+ flex: 0 0 auto;
456
+ padding: .7rem;
457
+ background: var(--saas-primary);
458
+ color: var(--saas-on-primary);
459
+ border: 2px solid rgb(var(--saas-border-rgb) / .82);
460
+ border-radius: 50%;
461
+ line-height: 1;
462
+ }
463
+ .saas-icon-medallion > :where(svg, img) { inline-size: 100%; block-size: 100%; object-fit: contain; }
464
+
465
+ .saas-button.saas-button-cut,
466
+ .saas-button-cut {
467
+ border-radius: 0;
468
+ clip-path: polygon(.6rem 0, 100% 0, 100% calc(100% - .6rem), calc(100% - .6rem) 100%, 0 100%, 0 .6rem);
469
+ }
470
+ .saas-button.saas-button-cut:focus-visible,
471
+ .saas-button-cut:focus-visible { outline-offset: -3px; }
472
+
473
+ .saas-button.saas-button-outline-heavy,
474
+ .saas-button-outline-heavy {
475
+ background: transparent;
476
+ color: var(--saas-primary);
477
+ border-style: solid;
478
+ border-width: 2px;
479
+ border-color: var(--saas-primary);
480
+ box-shadow: none;
481
+ }
482
+ .saas-button.saas-button-outline-heavy:hover,
483
+ .saas-button-outline-heavy:hover {
484
+ background: var(--saas-primary);
485
+ color: var(--saas-on-primary);
486
+ border-color: var(--saas-primary-hover);
487
+ }
488
+
489
+ .saas-badge-seal {
490
+ display: inline-grid;
491
+ place-items: center;
492
+ align-content: center;
493
+ inline-size: 5rem;
494
+ min-inline-size: 5rem;
495
+ aspect-ratio: 1;
496
+ padding: .65rem;
497
+ background: var(--saas-surface-strong);
498
+ color: var(--saas-text);
499
+ border: 2px solid var(--saas-primary);
500
+ border-radius: 50%;
501
+ text-align: center;
502
+ font-family: var(--saas-font-heading);
503
+ font-size: .72rem;
504
+ font-weight: 900;
505
+ line-height: 1.05;
506
+ letter-spacing: .04em;
507
+ }
508
+
509
+ .saas-feature-strip {
510
+ display: grid;
511
+ grid-template-columns: repeat(auto-fit, minmax(min(100%, 13rem), 1fr));
512
+ overflow: hidden;
513
+ background: var(--saas-card-bg);
514
+ color: var(--saas-text);
515
+ border: 1px solid var(--saas-border);
516
+ border-radius: var(--saas-radius-lg);
517
+ }
518
+
519
+ .saas-feature-item {
520
+ display: grid;
521
+ grid-template-columns: auto minmax(0, 1fr);
522
+ align-items: center;
523
+ gap: var(--saas-space-3);
524
+ min-inline-size: 0;
525
+ padding: var(--saas-space-4);
526
+ border-inline-end: 1px solid rgb(var(--saas-border-rgb) / .62);
527
+ }
528
+ .saas-feature-item:last-child { border-inline-end: 0; }
529
+ .saas-feature-item > :where(p, small) { margin: 0; color: var(--saas-text-muted); }
530
+
531
+ .saas-callout-bar {
532
+ display: grid;
533
+ grid-template-columns: auto minmax(0, 1fr) auto;
534
+ align-items: center;
535
+ gap: var(--saas-space-4);
536
+ padding: var(--saas-space-4) var(--saas-space-5);
537
+ background: var(--saas-card-bg);
538
+ color: var(--saas-text);
539
+ border: 1px solid var(--saas-border);
540
+ border-radius: var(--saas-radius-lg);
541
+ }
542
+ .saas-callout-bar > :where(p, div) { min-inline-size: 0; }
543
+ .saas-callout-bar > :where(.saas-button, a, button):last-child { justify-self: end; }
544
+
545
+ .saas-eyebrow {
546
+ margin: 0;
547
+ color: var(--saas-primary);
548
+ font-family: var(--saas-font-heading);
549
+ font-size: .76rem;
550
+ font-weight: 900;
551
+ line-height: 1.2;
552
+ letter-spacing: .14em;
553
+ text-transform: uppercase;
554
+ }
555
+
556
+ .saas-media-scrim {
557
+ position: relative;
558
+ overflow: hidden;
559
+ isolation: isolate;
560
+ min-block-size: 12rem;
561
+ background: var(--saas-surface-soft);
562
+ border: 1px solid var(--saas-border);
563
+ border-radius: var(--saas-radius-lg);
564
+ }
565
+ .saas-media-scrim > :where(img, picture, video) {
566
+ display: block;
567
+ inline-size: 100%;
568
+ block-size: 100%;
569
+ min-block-size: inherit;
570
+ object-fit: cover;
571
+ }
572
+ .saas-media-scrim > :where(figcaption, [data-media-caption]) {
573
+ position: absolute;
574
+ z-index: 1;
575
+ inset-inline: 0;
576
+ inset-block-end: 0;
577
+ padding: clamp(1rem, 4vw, 2rem);
578
+ color: #fff;
579
+ background: linear-gradient(to top, rgb(0 0 0 / .9), rgb(0 0 0 / .58) 56%, transparent);
580
+ }
581
+ .saas-media-scrim > :where(figcaption, [data-media-caption]) * {
582
+ color: inherit;
583
+ }
584
+
585
+ @media (max-width: 42rem) {
586
+ .saas-callout-bar { grid-template-columns: 1fr; align-items: start; }
587
+ .saas-callout-bar > :where(.saas-button, a, button):last-child { justify-self: stretch; }
588
+ .saas-feature-item { border-inline-end: 0; border-block-end: 1px solid rgb(var(--saas-border-rgb) / .62); }
589
+ .saas-feature-item:last-child { border-block-end: 0; }
590
+ }
591
+
592
+ .saas-card-service, .saas-card-feature, .saas-feature-strip, .saas-callout-bar { box-shadow: 0 .9rem 2rem rgb(15 23 42 / calc(var(--saas-shadow-alpha) + .03)); }
593
+ .saas-card-accent-edge { border-inline-start-width: .3rem; }
594
+ .saas-icon-medallion { box-shadow: 0 .55rem 1.2rem rgb(15 23 42 / calc(var(--saas-shadow-alpha) + .05)); }
595
+
596
+ /* Filled and framed actions share one precise fold without becoming the same control. */
597
+ .saas-button.saas-button-cut, .saas-button-cut {
598
+ min-inline-size: 6rem;
599
+ max-inline-size: 100%;
600
+ justify-self: start;
601
+ justify-content: center;
602
+ clip-path: polygon(0 0, calc(100% - .55rem) 0, 100% .55rem, 100% 100%, 0 100%);
603
+ }
604
+ .saas-button.saas-button-outline-heavy, .saas-button-outline-heavy {
605
+ border-width: 1px;
606
+ border-radius: 0;
607
+ clip-path: polygon(0 0, calc(100% - .42rem) 0, 100% .42rem, 100% 100%, 0 100%);
608
+ box-shadow: 0 .25rem .6rem rgb(var(--saas-text-rgb) / .08);
609
+ }
610
+
611
+ /* Marketing and native surfaces repeat the fold through a precise leading rule. */
612
+ .saas-card-service, .saas-media-scrim, .saas-feature-strip, .saas-callout-bar, .saas-metric {
613
+ border: 1px solid var(--saas-border);
614
+ border-inline-start-width: .22rem;
615
+ border-inline-start-color: var(--saas-primary);
616
+ box-shadow: 0 .6rem 1.4rem rgb(var(--saas-text-rgb) / .1);
617
+ }
618
+ [data-ui="minimal-saas"][data-theme][data-mode] :where(button:not([class]), input[type="button"]:not([class]), input[type="submit"]:not([class]), input[type="reset"]:not([class])) {
619
+ border: 1px solid var(--saas-primary);
620
+ border-radius: var(--saas-radius-md);
621
+ box-shadow: 0 .25rem .6rem rgb(var(--saas-text-rgb) / .1);
622
+ }
623
+ [data-ui="minimal-saas"][data-theme][data-mode] :where(dialog) {
624
+ border: 1px solid var(--saas-border);
625
+ border-inline-start-width: .22rem;
626
+ border-radius: var(--saas-radius-lg);
627
+ box-shadow: 0 1rem 2.2rem rgb(var(--saas-text-rgb) / .18);
628
+ }
629
+
630
+ /* Busy indicators retain the restrained circular progress language of Minimal SaaS. */
631
+ .saas-button[aria-busy="true"]::after, .saas-icon-button[aria-busy="true"]::after, [data-ui="minimal-saas"] :where(button[aria-busy="true"], input[type="button"][aria-busy="true"], input[type="submit"][aria-busy="true"], input[type="reset"][aria-busy="true"])::after {
632
+ border: .14em solid rgb(var(--saas-primary-text-rgb) / .38); border-block-start-color: currentColor; border-radius: 50%; background: transparent; box-shadow: none; clip-path: circle(50%); animation: saas-spin .7s linear infinite;
633
+ }
634
+
404
635
  @media (prefers-reduced-motion: reduce) {
405
636
  [data-ui="minimal-saas"] *, [data-ui="minimal-saas"] *::before, [data-ui="minimal-saas"] *::after { scroll-behavior: auto !important; transition-duration: 1ms !important; animation-duration: 1ms !important; animation-iteration-count: 1 !important; }
406
637
  }
@@ -408,7 +639,7 @@
408
639
  [data-ui="minimal-saas"] { --saas-border-alpha: 1; --saas-focus-alpha: .75; }
409
640
  }
410
641
  @media (forced-colors: active) {
411
- [data-ui="minimal-saas"] * { forced-color-adjust: auto; }
642
+ @supports (forced-color-adjust: auto) { [data-ui="minimal-saas"] * { forced-color-adjust: auto; } }
412
643
  [data-ui="minimal-saas"] :where(:focus-visible) { outline: 3px solid CanvasText; }
413
644
  }
414
645
  @media print {