ui-style-kit-css 2.6.1 → 2.7.1

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 (60) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/README.md +13 -12
  3. package/dist/ui-style-kit.css +1185 -1335
  4. package/dist/ui-style-kit.min.css +2 -2
  5. package/dist/ui-style-kit.visual.css +1185 -1335
  6. package/dist/ui-style-kit.visual.min.css +2 -2
  7. package/dist/ui-style-kit.with-bridge.css +1185 -1335
  8. package/dist/ui-style-kit.with-bridge.min.css +2 -2
  9. package/dist/visual/art-deco.css +455 -717
  10. package/dist/visual/bauhaus.css +2 -2
  11. package/dist/visual/bento.css +2 -2
  12. package/dist/visual/brutalism.css +411 -678
  13. package/dist/visual/clay.css +2 -2
  14. package/dist/visual/cyberpunk.css +430 -690
  15. package/dist/visual/data-terminal.css +426 -693
  16. package/dist/visual/editorial-luxe.css +429 -696
  17. package/dist/visual/industrial-utility.css +437 -699
  18. package/dist/visual/maximalist.css +434 -700
  19. package/dist/visual/minimal-saas.css +421 -684
  20. package/dist/visual/neo-noir.css +2 -2
  21. package/dist/visual/neumorphism.css +422 -689
  22. package/dist/visual/organic-modern.css +2 -2
  23. package/dist/visual/paper-editorial.css +484 -711
  24. package/dist/visual/retro-glass.css +435 -689
  25. package/dist/visual/retrofuturism.css +423 -690
  26. package/dist/visual/tactile.css +433 -698
  27. package/dist/visual/technical-blueprint.css +437 -700
  28. package/dist/visual/y2k.css +445 -692
  29. package/docs/COMPONENT-SPACING.md +154 -0
  30. package/docs/DEMO-SHOWCASE.md +16 -0
  31. package/docs/ECOSYSTEM.md +2 -2
  32. package/docs/PUBLISHING.md +7 -7
  33. package/docs/RELEASE-2.7.0.md +21 -0
  34. package/docs/RELEASE-2.7.1.md +21 -0
  35. package/manifest.json +9 -1
  36. package/package.json +2 -2
  37. package/styles/art-deco.css +18 -9
  38. package/styles/bauhaus.css +8 -5
  39. package/styles/bento.css +27 -16
  40. package/styles/brutalism.css +8 -5
  41. package/styles/clay.css +17 -10
  42. package/styles/clean-defaults.css +20 -0
  43. package/styles/component-composition.css +63 -0
  44. package/styles/components.css +262 -2
  45. package/styles/cyberpunk.css +21 -10
  46. package/styles/data-terminal.css +9 -5
  47. package/styles/editorial-luxe.css +9 -5
  48. package/styles/industrial-utility.css +17 -8
  49. package/styles/maximalist.css +10 -5
  50. package/styles/minimal-saas.css +9 -4
  51. package/styles/native-elements.css +32 -2
  52. package/styles/neo-noir.css +18 -9
  53. package/styles/neumorphism.css +13 -7
  54. package/styles/organic-modern.css +4 -4
  55. package/styles/paper-editorial.css +45 -7
  56. package/styles/retro-glass.css +16 -6
  57. package/styles/retrofuturism.css +10 -7
  58. package/styles/tactile.css +22 -9
  59. package/styles/technical-blueprint.css +14 -7
  60. package/styles/y2k.css +34 -14
@@ -251,7 +251,7 @@
251
251
  --usk-native-range-track-shadow: 2px 2px 0 rgb(0 0 0 / .16);
252
252
  --usk-native-range-progress-background: var(--paper-primary);
253
253
  --usk-native-range-thumb-size: 1.15rem;
254
- --usk-native-range-thumb-background: var(--paper-surface-strong);
254
+ --usk-native-range-thumb-background: var(--usk-native-primary);
255
255
  --usk-native-range-thumb-border: 1px solid var(--paper-border);
256
256
  --usk-native-range-thumb-radius: 50%;
257
257
  --usk-native-range-thumb-shadow: 2px 2px 0 rgb(0 0 0 / .16);
@@ -437,7 +437,9 @@
437
437
  /* Theme-responsive component defaults */
438
438
  .paper-card, .paper-panel { background: var(--paper-card-bg); }
439
439
  .paper-toolbar, .paper-table-wrap { background: var(--paper-control-bg); }
440
- .paper-button:not(.paper-button-primary):not(.paper-button-secondary):not(.paper-button-danger):not(.paper-button-warning):not(.paper-button-ghost), .paper-icon-button { background: var(--paper-control-bg); }
440
+ /** Attribute-selected variants bypass the legacy neutral-only paint fallback. */
441
+ /** Neutral defaults exclude outlined actions so their hover fill and ink remain paired. */
442
+ .paper-button:where(:not([data-ui-variant])):not(.paper-button-primary):not(.paper-button-secondary):not(.paper-button-danger):not(.paper-button-warning):not(.paper-button-ghost):not(.paper-button-outline-heavy), .paper-icon-button { background: var(--paper-control-bg); }
441
443
  .paper-button, .paper-icon-button, .paper-badge, .paper-nav-link { font-family: var(--paper-font-control); }
442
444
 
443
445
 
@@ -629,7 +631,7 @@
629
631
  .paper-button.paper-button-outline-heavy,
630
632
  .paper-button-outline-heavy {
631
633
  background: transparent;
632
- color: var(--usk-primary-ink, var(--paper-primary));
634
+ color: var(--usk-primary-ink, var(--paper-text));
633
635
  border-style: solid;
634
636
  border-width: 2px;
635
637
  border-color: var(--paper-primary);
@@ -863,7 +865,7 @@
863
865
  --usk-native-range-track-shadow: 0 1px 0 rgb(var(--paper-text-rgb) / .22);
864
866
  --usk-native-range-progress-background: var(--paper-primary);
865
867
  --usk-native-range-thumb-size: 1rem;
866
- --usk-native-range-thumb-background: var(--paper-surface-strong);
868
+ --usk-native-range-thumb-background: var(--usk-native-primary);
867
869
  --usk-native-range-thumb-border: 2px solid var(--paper-primary);
868
870
  --usk-native-range-thumb-radius: .02rem;
869
871
  --usk-native-range-thumb-shadow: .08rem .08rem 0 rgb(var(--paper-text-rgb) / .28);
@@ -941,7 +943,8 @@
941
943
  @media print {
942
944
  [data-ui="paper-editorial"] { background: #fff !important; color: #000 !important; }
943
945
  [data-ui="paper-editorial"] * { box-shadow: none !important; text-shadow: none !important; }
944
- [data-ui="paper-editorial"] a { color: #000 !important; text-decoration: underline; }
946
+ /** Inline-link ink must not override the foreground paired with an action surface. */
947
+ [data-ui="paper-editorial"] a { color: #000 !important; text-decoration: underline; }
945
948
  }
946
949
  }
947
950
 
@@ -1069,13 +1072,13 @@
1069
1072
 
1070
1073
  :where([data-ui="paper-editorial"]) :where(button,input,select,textarea) { font: inherit; }
1071
1074
 
1072
- [data-ui="paper-editorial"] a {
1075
+ [data-ui="paper-editorial"] a:where(:not(.paper-button):not(.paper-icon-button):not(.paper-nav-link)) {
1073
1076
  color: var(--paper-sheet-blue);
1074
1077
  text-decoration-thickness: 1px;
1075
1078
  text-underline-offset: 3px;
1076
1079
  }
1077
1080
 
1078
- [data-ui="paper-editorial"] a:hover { color: var(--paper-sheet-oxblood); }
1081
+ [data-ui="paper-editorial"] a:where(:not(.paper-button):not(.paper-icon-button):not(.paper-nav-link)):hover { color: var(--paper-sheet-oxblood); }
1079
1082
 
1080
1083
  .paper-kicker,
1081
1084
  .paper-label,
@@ -1699,6 +1702,41 @@ dialog.paper-dialog:not([open]) { display: none; }
1699
1702
  .paper-switch input:checked + .paper-switch-track .paper-switch-thumb { background: var(--paper-sheet-on-blue); }
1700
1703
  .paper-switch input:has(+ .paper-switch-track) { position: absolute; opacity: 0; pointer-events: none; }
1701
1704
  .paper-switch input:not(:has(+ .paper-switch-track)) { pointer-events: auto; }
1705
+ /** Message symbols have their own lane, centered against the complete text block. */
1706
+ .paper-alert {
1707
+ position: relative;
1708
+ display: grid;
1709
+ grid-template-columns: minmax(0, 1fr);
1710
+ align-items: center;
1711
+ gap: .25rem .5rem;
1712
+ padding-inline-start: 2.75rem;
1713
+ }
1714
+ .paper-alert::before {
1715
+ position: absolute;
1716
+ inset-block-start: 50%;
1717
+ inset-inline-start: .75rem;
1718
+ display: grid;
1719
+ place-items: center;
1720
+ inline-size: 1.5rem;
1721
+ block-size: 1.5rem;
1722
+ min-inline-size: 0;
1723
+ min-block-size: 0;
1724
+ margin: 0;
1725
+ padding: 0;
1726
+ font: 700 1.25rem/1 "Segoe UI Symbol", Arial, sans-serif;
1727
+ transform: translateY(-50%);
1728
+ }
1729
+ .paper-alert > :is(p, strong, span, div) {
1730
+ min-inline-size: 0;
1731
+ width: auto;
1732
+ margin: 0;
1733
+ }
1734
+ .paper-alert:has(> button) { grid-template-columns: minmax(0, 1fr) auto; }
1735
+ .paper-alert > button {
1736
+ align-self: center;
1737
+ margin: 0;
1738
+ }
1739
+
1702
1740
  .paper-spinner, .paper-loading-spinner, [data-ui="paper-editorial"] :where(.ui-spinner,.loading-spinner,[data-loading-spinner]) {
1703
1741
  inline-size: 24px; block-size: 24px; min-width: 24px; padding: 0; border: 2px solid var(--paper-sheet-rule-soft); border-right-color: var(--paper-sheet-blue); border-radius: 50%; background: none; box-shadow: none; clip-path: none; animation: paper-sheet-spin .75s linear infinite;
1704
1742
  }
@@ -290,7 +290,7 @@
290
290
  --usk-native-range-track-shadow: inset 0 1px rgb(255 255 255 / .55);
291
291
  --usk-native-range-progress-background: var(--rg-primary);
292
292
  --usk-native-range-thumb-size: 1.35rem;
293
- --usk-native-range-thumb-background: var(--rg-surface-strong);
293
+ --usk-native-range-thumb-background: var(--usk-native-primary);
294
294
  --usk-native-range-thumb-border: 1px solid var(--rg-border);
295
295
  --usk-native-range-thumb-radius: 50%;
296
296
  --usk-native-range-thumb-shadow: inset 0 1px rgb(255 255 255 / .55);
@@ -484,7 +484,9 @@
484
484
  /* Theme-responsive component defaults */
485
485
  .rg-card, .rg-panel { background: var(--rg-card-bg); }
486
486
  .rg-toolbar, .rg-table-wrap { background: var(--rg-control-bg); }
487
- .rg-button:not(.rg-button-primary):not(.rg-button-secondary):not(.rg-button-danger):not(.rg-button-warning):not(.rg-button-ghost), .rg-icon-button { background: var(--rg-control-bg); }
487
+ /** Attribute-selected variants bypass the legacy neutral-only paint fallback. */
488
+ /** Neutral defaults exclude outlined actions so their hover fill and ink remain paired. */
489
+ .rg-button:where(:not([data-ui-variant])):not(.rg-button-primary):not(.rg-button-secondary):not(.rg-button-danger):not(.rg-button-warning):not(.rg-button-ghost):not(.rg-button-outline-heavy), .rg-icon-button { background: var(--rg-control-bg); }
488
490
  .rg-button, .rg-icon-button, .rg-badge, .rg-nav-link { font-family: var(--rg-font-control); }
489
491
 
490
492
  /** All loader APIs share a complete circular track with one rotating accent. */
@@ -606,7 +608,7 @@
606
608
  .rg-button.rg-button-outline-heavy,
607
609
  .rg-button-outline-heavy {
608
610
  background: transparent;
609
- color: var(--usk-primary-ink, var(--rg-primary));
611
+ color: var(--usk-primary-ink, var(--rg-text));
610
612
  border-style: solid;
611
613
  border-width: 2px;
612
614
  border-color: var(--rg-primary);
@@ -806,7 +808,7 @@
806
808
  --usk-native-range-track-shadow: inset 0 2px 4px rgb(var(--rg-text-rgb) / .22);
807
809
  --usk-native-range-progress-background: linear-gradient(180deg, var(--rg-primary-hover), var(--rg-primary));
808
810
  --usk-native-range-thumb-size: 1.2rem;
809
- --usk-native-range-thumb-background: radial-gradient(circle at 42% 32%, var(--rg-glass-highlight), transparent 28%), var(--rg-control-material);
811
+ --usk-native-range-thumb-background: var(--usk-native-primary);
810
812
  --usk-native-range-thumb-border: 1px solid var(--rg-border);
811
813
  --usk-native-range-thumb-radius: 50%;
812
814
  --usk-native-range-thumb-shadow: inset 0 1px 0 var(--rg-surface-strong), 0 2px 4px rgb(var(--rg-text-rgb) / .28);
@@ -994,7 +996,9 @@
994
996
  .rg-icon-button { inline-size: var(--rg-control-height); padding: 8px; aspect-ratio: 1; }
995
997
  .rg-button-primary { background: var(--rg-gloss); color: var(--rg-gloss-ink); border-color: var(--rg-primary); }
996
998
  .rg-button-secondary { background: var(--rg-control-material); color: var(--rg-text); border-color: var(--rg-line-strong); }
997
- .rg-button-danger { background: var(--rg-danger-gloss); color: rgb(var(--usk-danger-text-rgb, 255 255 255)); border-color: var(--rg-danger); }
999
+ /** Danger gloss retains its semantic foreground pair and confines reflection to the upper edge. */
1000
+ .rg-button-danger { background: linear-gradient(180deg, rgb(255 255 255 / .4), transparent 12%), var(--rg-danger); color: var(--rg-on-danger); border-color: var(--rg-danger); }
1001
+ .rg-button-primary:hover { background: var(--rg-gloss); color: var(--rg-gloss-ink); }
998
1002
  /**
999
1003
  * Lets explicit runtime foreground edits win without changing the default
1000
1004
  * Retro Glass danger gloss treatment used by the reference specimen.
@@ -1095,7 +1099,8 @@
1095
1099
  .rg-tab:hover, .rg-tab.is-active, .rg-tab[aria-selected="true"] { background: linear-gradient(rgb(var(--rg-primary-rgb) / .2), rgb(var(--rg-primary-rgb) / .2)), var(--rg-surface-input); border-bottom-color: var(--rg-primary); color: var(--rg-text); }
1096
1100
  .rg-pagination-page { min-inline-size: 36px; padding: 8px; font-size: 12px; }
1097
1101
  .rg-nav { padding: 0; background: transparent; border: 0; box-shadow: none; gap: 6px; }
1098
- .rg-nav-link { min-block-size: var(--rg-control-height); padding: 8px 12px; background: var(--rg-control-material); border: 1px solid var(--rg-line-strong); border-radius: var(--rg-radius-sm); color: var(--rg-text-soft); text-shadow: none; letter-spacing: 0; }
1102
+ /** Chrome reflections need full surface ink for ordinary navigation labels. */
1103
+ .rg-nav-link { min-block-size: var(--rg-control-height); padding: 8px 12px; background: var(--rg-control-material); border: 1px solid var(--rg-line-strong); border-radius: var(--rg-radius-sm); color: var(--rg-text); text-shadow: none; letter-spacing: 0; }
1099
1104
  .rg-nav-link:hover { color: var(--rg-text); background: var(--rg-control-material); }
1100
1105
  .rg-nav-link.is-active, .rg-nav-link[aria-current="page"] { background: var(--rg-gloss); color: var(--rg-gloss-ink); box-shadow: inset 0 1px 0 var(--rg-highlight); }
1101
1106
  .rg-table-wrap { background: transparent; border: 0; box-shadow: none; }
@@ -1185,3 +1190,8 @@
1185
1190
  font-weight: 800;
1186
1191
  line-height: 1;
1187
1192
  }
1193
+
1194
+ @layer ui-style-kit.retro_glass {
1195
+ /** Console content scrolls inside its frame instead of expanding a narrow parent. */
1196
+ .rg-console { box-sizing: border-box; min-inline-size: 0; max-inline-size: 100%; margin-inline: 0; overflow-x: auto; }
1197
+ }
@@ -251,7 +251,7 @@
251
251
  --usk-native-range-track-shadow: 0 0 10px var(--retro-primary);
252
252
  --usk-native-range-progress-background: var(--retro-primary);
253
253
  --usk-native-range-thumb-size: 1.55rem;
254
- --usk-native-range-thumb-background: var(--retro-surface-strong);
254
+ --usk-native-range-thumb-background: var(--usk-native-primary);
255
255
  --usk-native-range-thumb-border: 1px solid var(--retro-border);
256
256
  --usk-native-range-thumb-radius: 50%;
257
257
  --usk-native-range-thumb-shadow: 0 0 10px var(--retro-primary);
@@ -438,7 +438,9 @@
438
438
  /* Theme-responsive component defaults */
439
439
  .retro-card, .retro-panel { background: var(--retro-card-bg); }
440
440
  .retro-toolbar, .retro-table-wrap { background: var(--retro-control-bg); }
441
- .retro-button:not(.retro-button-primary):not(.retro-button-secondary):not(.retro-button-danger):not(.retro-button-warning):not(.retro-button-ghost), .retro-icon-button { background: var(--retro-control-bg); }
441
+ /** Attribute-selected variants bypass the legacy neutral-only paint fallback. */
442
+ /** Neutral defaults exclude outlined actions so their hover fill and ink remain paired. */
443
+ .retro-button:where(:not([data-ui-variant])):not(.retro-button-primary):not(.retro-button-secondary):not(.retro-button-danger):not(.retro-button-warning):not(.retro-button-ghost):not(.retro-button-outline-heavy), .retro-icon-button { background: var(--retro-control-bg); }
442
444
  .retro-button, .retro-icon-button, .retro-badge, .retro-nav-link { font-family: var(--retro-font-control); }
443
445
 
444
446
 
@@ -637,7 +639,7 @@
637
639
  .retro-button.retro-button-outline-heavy,
638
640
  .retro-button-outline-heavy {
639
641
  background: transparent;
640
- color: var(--usk-primary-ink, var(--retro-primary));
642
+ color: var(--usk-primary-ink, var(--retro-text));
641
643
  border-style: solid;
642
644
  border-width: 2px;
643
645
  border-color: var(--retro-primary);
@@ -920,7 +922,7 @@
920
922
  --usk-native-range-track-shadow: var(--retro-recess-shadow);
921
923
  --usk-native-range-progress-background: var(--retro-calibration-track);
922
924
  --usk-native-range-thumb-size: 1.25rem;
923
- --usk-native-range-thumb-background: var(--retro-metal-rim);
925
+ --usk-native-range-thumb-background: var(--usk-native-primary);
924
926
  --usk-native-range-thumb-border: 3px double var(--retro-metal-edge);
925
927
  --usk-native-range-thumb-radius: 50%;
926
928
  --usk-native-range-thumb-shadow: var(--retro-control-shadow);
@@ -1316,9 +1318,10 @@
1316
1318
  }
1317
1319
 
1318
1320
  .retro-icon-medallion {
1319
- background: var(--retro-metal-rim);
1321
+ /* Keep chrome on the rim and give the central glyph a paired, stable surface. */
1322
+ background: linear-gradient(var(--retro-surface), var(--retro-surface)) padding-box, var(--retro-metal-rim) border-box;
1320
1323
  color: var(--retro-text);
1321
- border: 3px double var(--retro-metal-edge);
1324
+ border: 3px double transparent;
1322
1325
  box-shadow: var(--retro-control-shadow);
1323
1326
  }
1324
1327
 
@@ -1334,7 +1337,7 @@
1334
1337
 
1335
1338
  .retro-button.retro-button-outline-heavy, .retro-button-outline-heavy {
1336
1339
  background: var(--retro-enamel-bg);
1337
- color: var(--usk-primary-ink, var(--retro-primary));
1340
+ color: var(--usk-primary-ink, var(--retro-text));
1338
1341
  border: 4px double var(--retro-metal-edge);
1339
1342
  border-radius: var(--retro-radius-pill);
1340
1343
  clip-path: inset(0 round var(--retro-radius-pill));
@@ -257,7 +257,7 @@
257
257
  --usk-native-range-track-shadow: var(--tactile-deep-inset-shadow);
258
258
  --usk-native-range-progress-background: var(--tactile-action-solid);
259
259
  --usk-native-range-thumb-size: 1.55rem;
260
- --usk-native-range-thumb-background: var(--tactile-thumb-bg);
260
+ --usk-native-range-thumb-background: var(--usk-native-primary);
261
261
  --usk-native-range-thumb-border: 1px solid var(--tactile-keyline);
262
262
  --usk-native-range-thumb-radius: .22rem;
263
263
  --usk-native-range-thumb-shadow: var(--tactile-button-shadow);
@@ -467,7 +467,9 @@
467
467
  /* Theme-responsive component defaults */
468
468
  .tactile-card, .tactile-panel { background: var(--tactile-card-bg); }
469
469
  .tactile-toolbar, .tactile-table-wrap { background: var(--tactile-card-bg); }
470
- .tactile-button:not(.tactile-button-primary):not(.tactile-button-secondary):not(.tactile-button-danger):not(.tactile-button-warning):not(.tactile-button-ghost), .tactile-icon-button { background: var(--tactile-control-bg); }
470
+ /** Attribute-selected variants bypass the legacy neutral-only paint fallback. */
471
+ /** Neutral defaults exclude outlined actions so their hover fill and ink remain paired. */
472
+ .tactile-button:where(:not([data-ui-variant])):not(.tactile-button-primary):not(.tactile-button-secondary):not(.tactile-button-danger):not(.tactile-button-warning):not(.tactile-button-ghost):not(.tactile-button-outline-heavy), .tactile-icon-button { background: var(--tactile-control-bg); }
471
473
  .tactile-button, .tactile-icon-button, .tactile-badge, .tactile-nav-link { font-family: var(--tactile-font-control); }
472
474
 
473
475
 
@@ -663,7 +665,7 @@
663
665
  .tactile-button.tactile-button-outline-heavy,
664
666
  .tactile-button-outline-heavy {
665
667
  background: transparent;
666
- color: var(--usk-primary-ink, var(--tactile-primary));
668
+ color: var(--usk-primary-ink, var(--tactile-text));
667
669
  border-style: solid;
668
670
  border-width: 2px;
669
671
  border-color: var(--tactile-primary);
@@ -1059,7 +1061,14 @@
1059
1061
 
1060
1062
  /* Busy indicators preserve the bevel and pressed-depth cues of tactile controls. */
1061
1063
  .tactile-button[aria-busy="true"]::after, .tactile-icon-button[aria-busy="true"]::after, [data-ui="tactile"] :where(button[aria-busy="true"], input[type="button"][aria-busy="true"], input[type="submit"][aria-busy="true"], input[type="reset"][aria-busy="true"])::after {
1062
- border: .12em solid currentColor; border-radius: 50%; background: linear-gradient(145deg, rgb(255 255 255 / .35), transparent 48%); box-shadow: inset .1em .1em .18em rgb(0 0 0 / .3), inset -.08em -.08em .15em rgb(255 255 255 / .32), 0 .08em .16em rgb(0 0 0 / .22); clip-path: circle(50%); animation: tactile-spin .88s cubic-bezier(.2, .8, .2, 1) infinite;
1064
+ border: .14em solid currentColor;
1065
+ border-block-start-color: transparent;
1066
+ border-inline-start-color: transparent;
1067
+ border-radius: 50%;
1068
+ background: none;
1069
+ box-shadow: 0 .08em .16em rgb(0 0 0 / .22);
1070
+ clip-path: none;
1071
+ animation: tactile-spin .88s linear infinite;
1063
1072
  }
1064
1073
 
1065
1074
  @media (prefers-reduced-motion: reduce) {
@@ -1361,7 +1370,7 @@
1361
1370
  --usk-native-range-track-radius: .16rem;
1362
1371
  --usk-native-range-track-shadow: var(--tactile-deep-inset-shadow);
1363
1372
  --usk-native-range-thumb-size: 1.35rem;
1364
- --usk-native-range-thumb-background: var(--tactile-thumb-bg);
1373
+ --usk-native-range-thumb-background: var(--usk-native-primary);
1365
1374
  --usk-native-range-thumb-border: 1px solid var(--tactile-keyline);
1366
1375
  --usk-native-range-thumb-radius: .16rem;
1367
1376
  --usk-native-range-thumb-shadow: var(--tactile-button-shadow);
@@ -1544,7 +1553,8 @@
1544
1553
  /** Enhances supported browsers with the reference's light-to-dark enamel ramp. */
1545
1554
  @supports (color: color-mix(in srgb, black, white)) {
1546
1555
  .tactile-button-primary {
1547
- background: linear-gradient(180deg, color-mix(in srgb, var(--tactile-primary), white 16%), var(--tactile-primary) 48%, color-mix(in srgb, var(--tactile-primary), black 18%));
1556
+ /** Both enamel stops retain the same tested primary foreground pair. */
1557
+ background: linear-gradient(180deg, var(--tactile-primary-hover), var(--tactile-primary) 48%, var(--tactile-primary));
1548
1558
  border-color: color-mix(in srgb, var(--tactile-primary), black 34%);
1549
1559
  box-shadow: inset 0 1px 0 rgb(255 255 255 / .42), inset 0 -2px 0 rgb(0 0 0 / .25), 0 1px 2px rgb(var(--tactile-material-shadow-rgb) / .3);
1550
1560
  }
@@ -1557,7 +1567,8 @@
1557
1567
 
1558
1568
  .tactile-button-ghost {
1559
1569
  background: transparent;
1560
- color: var(--usk-primary-ink, var(--tactile-primary));
1570
+ /* Unfilled controls and their busy arcs need surface ink, not a copper fill. */
1571
+ color: var(--usk-primary-ink, var(--tactile-link));
1561
1572
  border-color: transparent;
1562
1573
  box-shadow: none;
1563
1574
  }
@@ -1696,7 +1707,8 @@
1696
1707
 
1697
1708
  .tactile-nav-link[aria-current="page"],
1698
1709
  .tactile-nav-link.is-active {
1699
- color: var(--tactile-brass);
1710
+ /** The copper rail carries selection; text retains the sidebar's paired foreground. */
1711
+ color: var(--tactile-sidebar-fg);
1700
1712
  background: rgb(var(--tactile-sidebar-text-rgb) / .06);
1701
1713
  border-color: rgb(var(--tactile-sidebar-text-rgb) / .18);
1702
1714
  box-shadow: inset .18rem 0 0 var(--tactile-copper), inset .08rem .08rem .18rem rgb(0 0 0 / .38);
@@ -1804,7 +1816,8 @@
1804
1816
  .tactile-icon-medallion,
1805
1817
  .tactile-badge-seal {
1806
1818
  background: var(--tactile-sidebar-bg);
1807
- color: var(--tactile-brass);
1819
+ /* The theme may invert this material; its paired ink follows that inversion. */
1820
+ color: var(--tactile-sidebar-fg);
1808
1821
  border-color: rgb(var(--tactile-keyline-rgb) / .82);
1809
1822
  box-shadow: var(--tactile-button-shadow);
1810
1823
  }
@@ -250,7 +250,8 @@
250
250
  --usk-native-range-track-shadow: 0 -.34rem 0 -.31rem var(--blueprint-primary);
251
251
  --usk-native-range-progress-background: linear-gradient(90deg, var(--blueprint-primary), var(--blueprint-focus));
252
252
  --usk-native-range-thumb-size: 1.02rem;
253
- --usk-native-range-thumb-background: var(--blueprint-surface);
253
+ /** A split marker stays colored against the ruled blueprint track. */
254
+ --usk-native-range-thumb-background: linear-gradient(135deg, var(--blueprint-primary) 0 55%, var(--blueprint-surface) 55%);
254
255
  --usk-native-range-thumb-border: 1px double var(--blueprint-primary);
255
256
  --usk-native-range-thumb-radius: 0;
256
257
  --usk-native-range-thumb-shadow: 0 0 0 2px var(--blueprint-surface), 0 0 0 3px var(--blueprint-primary);
@@ -367,7 +368,7 @@
367
368
  --usk-native-range-track-shadow: 0 0 0 1px var(--blueprint-primary);
368
369
  --usk-native-range-progress-background: var(--blueprint-primary);
369
370
  --usk-native-range-thumb-size: 1.2rem;
370
- --usk-native-range-thumb-background: var(--blueprint-surface-strong);
371
+ --usk-native-range-thumb-background: var(--usk-native-primary);
371
372
  --usk-native-range-thumb-border: 1px solid var(--blueprint-border);
372
373
  --usk-native-range-thumb-radius: 50%;
373
374
  --usk-native-range-thumb-shadow: 0 0 0 1px var(--blueprint-primary);
@@ -554,7 +555,9 @@
554
555
  /* Theme-responsive component defaults */
555
556
  .blueprint-card, .blueprint-panel { background: var(--blueprint-card-bg); }
556
557
  .blueprint-toolbar, .blueprint-table-wrap { background: var(--blueprint-control-bg); }
557
- .blueprint-button:not(.blueprint-button-primary):not(.blueprint-button-secondary):not(.blueprint-button-danger):not(.blueprint-button-warning):not(.blueprint-button-ghost), .blueprint-icon-button { background: var(--blueprint-control-bg); }
558
+ /** Attribute-selected variants bypass the legacy neutral-only paint fallback. */
559
+ /** Neutral defaults exclude outlined actions so their hover fill and ink remain paired. */
560
+ .blueprint-button:where(:not([data-ui-variant])):not(.blueprint-button-primary):not(.blueprint-button-secondary):not(.blueprint-button-danger):not(.blueprint-button-warning):not(.blueprint-button-ghost):not(.blueprint-button-outline-heavy), .blueprint-icon-button { background: var(--blueprint-control-bg); }
558
561
  .blueprint-button, .blueprint-icon-button, .blueprint-badge, .blueprint-nav-link { font-family: var(--blueprint-font-control); }
559
562
 
560
563
 
@@ -746,7 +749,7 @@
746
749
  .blueprint-button.blueprint-button-outline-heavy,
747
750
  .blueprint-button-outline-heavy {
748
751
  background: transparent;
749
- color: var(--usk-primary-ink, var(--blueprint-primary));
752
+ color: var(--usk-primary-ink, var(--blueprint-text));
750
753
  border-style: solid;
751
754
  border-width: 2px;
752
755
  border-color: var(--blueprint-primary);
@@ -890,7 +893,8 @@
890
893
  .blueprint-surface, .blueprint-card, .blueprint-panel, .blueprint-toolbar, .blueprint-table-wrap { border-radius: 0; box-shadow: inset 0 0 0 1px rgb(var(--blueprint-primary-rgb) / .12); }
891
894
  .blueprint-card, .blueprint-panel, .blueprint-toolbar { background-image: linear-gradient(90deg, transparent calc(100% - .55rem), rgb(var(--blueprint-primary-rgb) / .3) calc(100% - .55rem), rgb(var(--blueprint-primary-rgb) / .3) calc(100% - .48rem), transparent calc(100% - .48rem)); }
892
895
  .blueprint-button, .blueprint-icon-button { border-radius: 0; box-shadow: none; font-family: var(--blueprint-font-control); text-transform: uppercase; letter-spacing: .06em; }
893
- .blueprint-button:not(.blueprint-button-primary):not(.blueprint-button-secondary):not(.blueprint-button-danger):not(.blueprint-button-warning) { background: transparent; }
896
+ /** Flat neutral paint yields to outlined CTA hover fills. */
897
+ .blueprint-button:where(:not([data-ui-variant])):not(.blueprint-button-primary):not(.blueprint-button-secondary):not(.blueprint-button-danger):not(.blueprint-button-warning):not(.blueprint-button-outline-heavy) { background: transparent; }
894
898
  .blueprint-nav { border-radius: 0; box-shadow: none; }
895
899
  .blueprint-nav-link { border-radius: 0; font-family: var(--blueprint-font-control); font-size: .75rem; text-transform: uppercase; }
896
900
  .blueprint-input, .blueprint-textarea, .blueprint-select, .blueprint-badge, .blueprint-alert, .blueprint-metric, .blueprint-well, .blueprint-inset { border-radius: 0; }
@@ -984,7 +988,8 @@
984
988
  --usk-native-range-track-shadow: 0 -.34rem 0 -.31rem var(--blueprint-primary);
985
989
  --usk-native-range-progress-background: linear-gradient(90deg, var(--blueprint-primary), var(--blueprint-focus));
986
990
  --usk-native-range-thumb-size: 1.02rem;
987
- --usk-native-range-thumb-background: var(--blueprint-surface);
991
+ /** A split marker stays colored against the ruled blueprint track. */
992
+ --usk-native-range-thumb-background: linear-gradient(135deg, var(--blueprint-primary) 0 55%, var(--blueprint-surface) 55%);
988
993
  --usk-native-range-thumb-border: 1px double var(--blueprint-primary);
989
994
  --usk-native-range-thumb-radius: 0;
990
995
  --usk-native-range-thumb-shadow: 0 0 0 2px var(--blueprint-surface), 0 0 0 3px var(--blueprint-primary);
@@ -1100,7 +1105,7 @@
1100
1105
  --blueprint-fallback-border-rgb: 20 95 147;
1101
1106
  --blueprint-fallback-primary-rgb: 7 95 157;
1102
1107
  --blueprint-fallback-primary-hover-rgb: 6 76 124;
1103
- --blueprint-fallback-danger-rgb: 201 49 44;
1108
+ --blueprint-fallback-danger-rgb: 197 45 40;
1104
1109
  --blueprint-fallback-success-rgb: 24 111 64;
1105
1110
  --blueprint-fallback-warning-rgb: 132 76 0;
1106
1111
  --blueprint-fallback-warning-text-rgb: 255 255 255;
@@ -1168,6 +1173,8 @@
1168
1173
  }
1169
1174
  .blueprint-icon-button { inline-size: 36px; padding: 8px; aspect-ratio: 1; }
1170
1175
  .blueprint-button-primary { background: var(--blueprint-fill); color: var(--blueprint-fill-ink); border-color: var(--blueprint-primary); }
1176
+ /** The hover fill uses the primary role, so its label must use that role's foreground. */
1177
+ .blueprint-button-primary:hover { color: var(--blueprint-on-primary); }
1171
1178
  .blueprint-button-secondary { background: transparent; color: var(--blueprint-secondary); border-color: var(--blueprint-secondary); }
1172
1179
  .blueprint-button-ghost { border-style: dashed; color: var(--blueprint-text-soft); }
1173
1180
  .blueprint-button-danger { background: transparent; border-color: var(--blueprint-danger); color: var(--blueprint-danger); }
package/styles/y2k.css CHANGED
@@ -272,7 +272,7 @@
272
272
  --usk-native-range-track-shadow: inset 0 3px rgb(255 255 255 / .55);
273
273
  --usk-native-range-progress-background: var(--y2k-primary);
274
274
  --usk-native-range-thumb-size: 1.55rem;
275
- --usk-native-range-thumb-background: var(--y2k-surface-strong);
275
+ --usk-native-range-thumb-background: var(--usk-native-primary);
276
276
  --usk-native-range-thumb-border: 1px solid var(--y2k-border);
277
277
  --usk-native-range-thumb-radius: 50%;
278
278
  --usk-native-range-thumb-shadow: inset 0 3px rgb(255 255 255 / .55);
@@ -433,7 +433,8 @@
433
433
  }
434
434
  [data-ui="y2k"] *, [data-ui="y2k"] *::before, [data-ui="y2k"] *::after { box-sizing: border-box; }
435
435
  [data-ui="y2k"][data-mode] { background: var(--y2k-theme-bg); background-size: var(--y2k-theme-bg-size); }
436
- [data-ui="y2k"] a { color: var(--y2k-link); text-decoration-thickness: 0.11em; text-underline-offset: 0.18em; } [data-ui="y2k"] ::selection { background: var(--y2k-primary); color: var(--y2k-on-primary); }
436
+ /** Inline-link ink must not override the foreground paired with an action surface. */
437
+ [data-ui="y2k"] a:where(:not(.y2k-button):not(.y2k-icon-button)) { color: var(--y2k-link); text-decoration-thickness: 0.11em; text-underline-offset: 0.18em; } [data-ui="y2k"] ::selection { background: var(--y2k-primary); color: var(--y2k-on-primary); }
437
438
 
438
439
  .y2k-page { min-height: 100vh; padding: clamp(1rem, 4vw, 3rem); background-image: radial-gradient(rgb(var(--y2k-border-rgb) / var(--y2k-grid-alpha)) 1px, transparent 1px); background-size: 22px 22px; }
439
440
  .y2k-container { width: min(100% - 2rem, 1200px); margin-inline: auto; } .y2k-stack { display: flex; flex-direction: column; gap: var(--y2k-space-4); } .y2k-cluster { display: flex; flex-wrap: wrap; align-items: center; gap: var(--y2k-space-3); } .y2k-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(100%, 16rem), 1fr)); gap: var(--y2k-space-5); } .y2k-section { padding: clamp(1.25rem, 4vw, 2.5rem); }
@@ -466,7 +467,9 @@
466
467
  /* Theme-responsive component defaults */
467
468
  .y2k-card, .y2k-panel { background: var(--y2k-card-bg); }
468
469
  .y2k-toolbar, .y2k-table-wrap { background: var(--y2k-control-bg); }
469
- .y2k-button:not(.y2k-button-primary):not(.y2k-button-secondary):not(.y2k-button-danger):not(.y2k-button-warning):not(.y2k-button-ghost), .y2k-icon-button { background: var(--y2k-control-bg); }
470
+ /** Attribute-selected variants bypass the legacy neutral-only paint fallback. */
471
+ /** Neutral defaults exclude outlined actions so their hover fill and ink remain paired. */
472
+ .y2k-button:where(:not([data-ui-variant])):not(.y2k-button-primary):not(.y2k-button-secondary):not(.y2k-button-danger):not(.y2k-button-warning):not(.y2k-button-ghost):not(.y2k-button-outline-heavy), .y2k-icon-button { background: var(--y2k-control-bg); }
470
473
  .y2k-button, .y2k-icon-button, .y2k-badge, .y2k-nav-link { font-family: var(--y2k-font-control); }
471
474
 
472
475
  /* Spinner geometry follows the y2k preset's glossy plastic controls. */
@@ -567,7 +570,7 @@
567
570
  .y2k-button.y2k-button-outline-heavy,
568
571
  .y2k-button-outline-heavy {
569
572
  background: transparent;
570
- color: var(--usk-primary-ink, var(--y2k-primary));
573
+ color: var(--usk-primary-ink, var(--y2k-text));
571
574
  border-style: solid;
572
575
  border-width: 2px;
573
576
  border-color: var(--y2k-primary);
@@ -768,7 +771,7 @@
768
771
  --usk-native-range-track-shadow: inset 1px 1px 0 rgb(var(--y2k-text-rgb) / .28);
769
772
  --usk-native-range-progress-background: repeating-linear-gradient(90deg, var(--y2k-primary) 0 .4rem, var(--y2k-surface) .4rem .48rem);
770
773
  --usk-native-range-thumb-size: 1.12rem;
771
- --usk-native-range-thumb-background: linear-gradient(135deg, var(--y2k-surface-strong), var(--y2k-surface-soft));
774
+ --usk-native-range-thumb-background: var(--usk-native-primary);
772
775
  --usk-native-range-thumb-border: 1px outset var(--y2k-border);
773
776
  --usk-native-range-thumb-radius: 0;
774
777
  --usk-native-range-thumb-shadow: 1px 1px 0 rgb(var(--y2k-text-rgb) / .24);
@@ -898,7 +901,7 @@
898
901
  --usk-native-range-track-shadow: var(--y2k-bevel-recessed);
899
902
  --usk-native-range-progress-background: repeating-linear-gradient(90deg, var(--y2k-primary) 0 .5rem, var(--y2k-surface) .5rem .5625rem);
900
903
  --usk-native-range-thumb-size: .875rem;
901
- --usk-native-range-thumb-background: var(--y2k-surface);
904
+ --usk-native-range-thumb-background: var(--usk-native-primary);
902
905
  --usk-native-range-thumb-border: 1px outset var(--y2k-border);
903
906
  --usk-native-range-thumb-radius: 0;
904
907
  --usk-native-range-thumb-shadow: var(--y2k-bevel-raised);
@@ -925,7 +928,7 @@
925
928
  font: 400 11px/1.2 Tahoma, Verdana, Arial, sans-serif;
926
929
  }
927
930
 
928
- [data-ui="y2k"] a {
931
+ [data-ui="y2k"] a:where(:not(.y2k-button):not(.y2k-icon-button)) {
929
932
  color: var(--y2k-link);
930
933
  text-decoration: underline;
931
934
  text-decoration-thickness: auto;
@@ -1097,10 +1100,11 @@
1097
1100
  padding: 0;
1098
1101
  }
1099
1102
 
1100
- .y2k-button:hover,
1103
+ /** Hovered neutral controls retain the foreground paired with their neutral surface. */
1104
+ .y2k-button:where(:not(.y2k-button-primary):not(.y2k-button-danger):not(.y2k-button-warning)):hover,
1101
1105
  .y2k-icon-button:hover {
1102
- background: var(--y2k-primary-hover);
1103
- color: var(--y2k-on-primary);
1106
+ background: var(--y2k-surface-soft);
1107
+ color: var(--y2k-text);
1104
1108
  transform: none;
1105
1109
  box-shadow: var(--y2k-bevel-raised);
1106
1110
  }
@@ -1117,11 +1121,17 @@
1117
1121
  }
1118
1122
 
1119
1123
  .y2k-button-primary {
1120
- background: linear-gradient(180deg, rgb(255 255 255 / .2), transparent 48%), var(--y2k-primary);
1124
+ /** Keep the raised bevel's reflection outside the label lane. */
1125
+ background: linear-gradient(180deg, rgb(255 255 255 / .2), transparent 20%), var(--y2k-primary);
1121
1126
  color: var(--y2k-on-primary);
1122
1127
  border-color: var(--y2k-border);
1123
1128
  }
1124
1129
 
1130
+ .y2k-button-primary:hover {
1131
+ background: var(--y2k-primary-hover);
1132
+ color: var(--y2k-on-primary);
1133
+ }
1134
+
1125
1135
  .y2k-button-secondary {
1126
1136
  background: var(--y2k-surface-soft);
1127
1137
  color: var(--y2k-text);
@@ -1130,8 +1140,9 @@
1130
1140
 
1131
1141
  .y2k-button-danger {
1132
1142
  background: var(--y2k-surface-soft);
1133
- color: var(--y2k-danger);
1134
- border-color: var(--y2k-border);
1143
+ /** The outline carries the danger signal while surface ink keeps its label readable. */
1144
+ color: var(--y2k-text);
1145
+ border-color: var(--y2k-danger);
1135
1146
  }
1136
1147
 
1137
1148
  /**
@@ -1156,12 +1167,16 @@
1156
1167
  .y2k-button.y2k-button-outline-heavy {
1157
1168
  min-inline-size: 0;
1158
1169
  min-block-size: 1.375rem;
1159
- background: var(--y2k-surface-soft);
1160
1170
  border: 1px outset var(--y2k-border);
1161
1171
  border-radius: 0;
1162
1172
  box-shadow: var(--y2k-bevel-raised);
1163
1173
  clip-path: none;
1164
1174
  }
1175
+ /** Compact CTA geometry preserves a primary action's filled paint and paired ink. */
1176
+ .y2k-button-cut:where(:not(.y2k-button-primary)),
1177
+ .y2k-button.y2k-button-cut:where(:not(.y2k-button-primary)),
1178
+ .y2k-button-outline-heavy,
1179
+ .y2k-button.y2k-button-outline-heavy { background: var(--y2k-surface-soft); }
1165
1180
 
1166
1181
  .y2k-field {
1167
1182
  gap: .125rem;
@@ -1379,6 +1394,11 @@
1379
1394
  text-align: center;
1380
1395
  }
1381
1396
 
1397
+ /** The two-line seal needs its own frame; compact icon dimensions clip its labels. */
1398
+ .y2k-badge-seal { inline-size: 4rem; min-inline-size: 4rem; block-size: 4rem; }
1399
+ /** Native inline spacing must not consume the compact seal's label tracks. */
1400
+ .y2k-badge-seal > strong, .y2k-badge-seal > small { margin: 0; padding: 0; white-space: nowrap; }
1401
+
1382
1402
  .y2k-feature-item > .y2k-icon-medallion,
1383
1403
  .y2k-callout-bar > .y2k-icon-medallion {
1384
1404
  min-inline-size: 2.75rem;