ui-style-kit-css 2.6.1 → 2.7.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 (58) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +13 -12
  3. package/dist/ui-style-kit.css +481 -95
  4. package/dist/ui-style-kit.min.css +2 -2
  5. package/dist/ui-style-kit.visual.css +481 -95
  6. package/dist/ui-style-kit.visual.min.css +2 -2
  7. package/dist/ui-style-kit.with-bridge.css +481 -95
  8. package/dist/ui-style-kit.with-bridge.min.css +2 -2
  9. package/dist/visual/art-deco.css +322 -12
  10. package/dist/visual/bauhaus.css +2 -2
  11. package/dist/visual/bento.css +2 -2
  12. package/dist/visual/brutalism.css +318 -8
  13. package/dist/visual/clay.css +2 -2
  14. package/dist/visual/cyberpunk.css +327 -10
  15. package/dist/visual/data-terminal.css +319 -9
  16. package/dist/visual/editorial-luxe.css +319 -9
  17. package/dist/visual/industrial-utility.css +323 -8
  18. package/dist/visual/maximalist.css +320 -9
  19. package/dist/visual/minimal-saas.css +317 -7
  20. package/dist/visual/neo-noir.css +2 -2
  21. package/dist/visual/neumorphism.css +319 -9
  22. package/dist/visual/organic-modern.css +2 -2
  23. package/dist/visual/paper-editorial.css +358 -8
  24. package/dist/visual/retro-glass.css +326 -8
  25. package/dist/visual/retrofuturism.css +320 -10
  26. package/dist/visual/tactile.css +327 -15
  27. package/dist/visual/technical-blueprint.css +320 -10
  28. package/dist/visual/y2k.css +319 -9
  29. package/docs/COMPONENT-SPACING.md +154 -0
  30. package/docs/ECOSYSTEM.md +2 -2
  31. package/docs/PUBLISHING.md +7 -7
  32. package/docs/RELEASE-2.7.0.md +21 -0
  33. package/manifest.json +9 -1
  34. package/package.json +2 -2
  35. package/styles/art-deco.css +8 -8
  36. package/styles/bauhaus.css +4 -3
  37. package/styles/bento.css +17 -10
  38. package/styles/brutalism.css +4 -3
  39. package/styles/clay.css +6 -4
  40. package/styles/clean-defaults.css +20 -0
  41. package/styles/component-composition.css +63 -0
  42. package/styles/components.css +262 -2
  43. package/styles/cyberpunk.css +12 -5
  44. package/styles/data-terminal.css +6 -4
  45. package/styles/editorial-luxe.css +7 -4
  46. package/styles/industrial-utility.css +10 -3
  47. package/styles/maximalist.css +7 -4
  48. package/styles/minimal-saas.css +3 -2
  49. package/styles/native-elements.css +32 -2
  50. package/styles/neo-noir.css +7 -5
  51. package/styles/neumorphism.css +5 -4
  52. package/styles/organic-modern.css +3 -3
  53. package/styles/paper-editorial.css +39 -3
  54. package/styles/retro-glass.css +9 -3
  55. package/styles/retrofuturism.css +7 -5
  56. package/styles/tactile.css +16 -6
  57. package/styles/technical-blueprint.css +8 -5
  58. package/styles/y2k.css +5 -4
package/docs/ECOSYSTEM.md CHANGED
@@ -14,11 +14,11 @@ Before a UI branch or pull request is expected to validate, verify the reviewed
14
14
 
15
15
  | Library | Current aligned version | Owns |
16
16
  |---|---:|---|
17
- | `ui-style-kit-css@2.6.1` | current release | visual identity, color themes, UI paint, native HTML styling, content wrapping, and bridge tokens |
17
+ | `ui-style-kit-css@2.7.0` | current release candidate | visual identity, color themes, UI paint, native HTML styling, content wrapping, and bridge tokens |
18
18
  | `interactive-surface-css@1.7.3` | compatible state release | interaction-state primitives, surface behavior, state layers, and input affordances |
19
19
  | `layout-style-css@3.2.3` | compatible structural release | structural wrappers, grids, sections, app shells, and layout recipes |
20
20
 
21
- The current combination is `ui-style-kit-css@2.6.1`, `interactive-surface-css@1.7.3`, and `layout-style-css@3.2.3`. UI Style Kit `2.6.1` is the current release; the companion versions are reviewed releases. Layout Style `3.2.3` is the compatible structural release. The validated minimum remains `ui-style-kit-css@2.1.0`, `interactive-surface-css@1.5.0`, and `layout-style-css@3.0.0`.
21
+ The current combination is `ui-style-kit-css@2.7.0`, `interactive-surface-css@1.7.3`, and `layout-style-css@3.2.3`. UI Style Kit `2.7.0` is the current release candidate; `2.6.1` remains published on npm. The companion versions are reviewed releases. Layout Style `3.2.3` is the compatible structural release. The validated minimum remains `ui-style-kit-css@2.1.0`, `interactive-surface-css@1.5.0`, and `layout-style-css@3.0.0`.
22
22
 
23
23
  ## Layout-to-visual pairing matrix
24
24
 
@@ -1,10 +1,10 @@
1
1
  # Publishing Guide
2
2
 
3
- ## 2.6.1 release workflow
3
+ ## 2.7.0 release workflow
4
4
 
5
- The current checkout is a release candidate. [Release preparation notes](RELEASE-2.6.1.md)
5
+ The current checkout is a release candidate. [Release preparation notes](RELEASE-2.7.0.md)
6
6
  record the current local scope and gates; existing visual-QA documents are historical
7
- evidence, not proof that subsequent edits passed browser validation. The 2.6.1
7
+ evidence, not proof that subsequent edits passed browser validation. The 2.7.0
8
8
  changelog entry must carry the approved publication date before tagging.
9
9
 
10
10
  Update the tracked `wiki/` sources with the README and docs. Publishing those pages
@@ -13,9 +13,9 @@ documentation generator is configured in this package; reusable JavaScript helpe
13
13
  use JSDoc-compatible comments, and the checked-in build owns generated CSS, manifests,
14
14
  icons, README size measurements, and demo asset hashes.
15
15
 
16
- Prepare `ui-style-kit-css@2.6.1` on its release branch, open a pull request against `main`, and merge only after the fast automated gate is green and any requested manual demo review is complete. The aligned companion releases are `layout-style-css@3.2.3` and `interactive-surface-css@1.7.3`.
16
+ Prepare `ui-style-kit-css@2.7.0` on its release branch, open a pull request against `main`, and merge only after the fast automated gate is green and any requested manual demo review is complete. The aligned companion releases are `layout-style-css@3.2.3` and `interactive-surface-css@1.7.3`.
17
17
 
18
- Do not push `v2.6.1` before the reviewed release commit is on `main`. A pushed version tag runs Release Version Alignment, which validates the tag/package/changelog contract and creates the GitHub Release; publishing that release triggers the protected npm workflow.
18
+ Do not push `v2.7.0` before the reviewed release commit is on `main`. A pushed version tag runs Release Version Alignment, which validates the tag/package/changelog contract and creates the GitHub Release; publishing that release triggers the protected npm workflow.
19
19
 
20
20
  Release Version Alignment owns the fast automated release gate: lint, build, unit checks, the tagged Chromium release-smoke Playwright suite, and packed ecosystem preflight with `--skip-clean-install`. The visual-baseline suite, full UI matrix, and clean-install ecosystem matrix are manual escalation tools, not default push or publish blockers. The protected npm workflow intentionally does not rerun browser gates; it revalidates the immutable tag, package contracts, browser-free compatibility checks, companion commit reachability, the explicit release preflight with `--skip-clean-install`, npm token presence, npm owner authorization, and registry state before publishing.
21
21
 
@@ -76,7 +76,7 @@ npm run check:ecosystem:packs -- --layout-repo ../Layout-Style-CSS --interactive
76
76
  npm publish
77
77
  ```
78
78
 
79
- `prepublishOnly` runs `npm run release:verify`, so a direct `npm publish` still has the default fast release gate. For GitHub releases, push or dispatch the matching package tag, such as `v2.6.1`, only after the release PR is merged. The release workflows verify that `package.json`, `package-lock.json`, `CHANGELOG.md`, generated dist banners, and ecosystem pins are aligned before publishing. Dispatch the protected npm workflow from the current `main` workflow file when recovering publication for a release that has already passed Release Version Alignment.
79
+ `prepublishOnly` runs `npm run release:verify`, so a direct `npm publish` still has the default fast release gate. For GitHub releases, push or dispatch the matching package tag, such as `v2.7.0`, only after the release PR is merged. The release workflows verify that `package.json`, `package-lock.json`, `CHANGELOG.md`, generated dist banners, and ecosystem pins are aligned before publishing. Dispatch the protected npm workflow from the current `main` workflow file when recovering publication for a release that has already passed Release Version Alignment.
80
80
 
81
81
  The repository `NPM_TOKEN` secret must authenticate to npm as a user that appears in `npm owner ls ui-style-kit-css`. If the token belongs to another npm account or lacks package publish rights, npm may report a misleading registry `E404` at publish time.
82
82
 
@@ -88,4 +88,4 @@ npm run release:minor
88
88
  npm run release:major
89
89
  ```
90
90
 
91
- Use patch for compatible fixes, minor for new themes, presets, component capabilities, or browser-support contracts, and major for incompatible public API changes. Version `2.6.1` is the current compatible candidate for self-contained preset delivery and the hardened semantic component API; future feature versioning continues to follow this policy.
91
+ Use patch for compatible fixes, minor for new themes, presets, component capabilities, or browser-support contracts, and major for incompatible public API changes. Version `2.7.0` is a minor candidate because it adds shared component presentation and spacing controls while retaining the existing preset and semantic component APIs. Future feature versioning continues to follow this policy.
@@ -0,0 +1,21 @@
1
+ # v2.7.0 release candidate
2
+
3
+ UI Style Kit CSS 2.7.0 is the minor release candidate for shared component spacing, link presentation, feedback visibility, and preset variant paint. Its entrypoints, 20 presets, and theme inventory remain available. Version 2.6.1 remains published on npm until the release workflow completes.
4
+
5
+ ## Changed
6
+
7
+ - Added token-backed card spacing and link presentation controls for consumer markup.
8
+ - Made generic structural elements neutral and contained shared component content at narrow widths.
9
+ - Kept status titles in readable neutral ink while status surfaces, edges, and icons carry success, warning, and danger.
10
+ - Centered Paper Editorial status icons and gave native loading indicators the active preset identity.
11
+ - Guarded legacy neutral fallback paint so a button with both a preset class and `data-ui-variant` retains its selected variant in 17 affected presets.
12
+ - Repaired annotation contrast, star sizing, progress centering, text insets, tooltip variation, controls, and warning actions.
13
+ - The options toolbar stays visible during page scrolling at narrow and wide viewport sizes. Section links land below the toolbar.
14
+ - Optional preset specimen modules load when their preset is selected, reducing the initial demo JavaScript transfer.
15
+ - Theme and mode changes update palette-dependent sections while preserving unrelated demo controls and user-entered values.
16
+ - The toolbar uses shared semantic field and select styles with one neutral platform indicator rule in local CSS.
17
+ - Updated development-only dependency resolutions for fast-uri, postcss-selector-parser, and source-map-js.
18
+
19
+ ## Verification
20
+
21
+ The 2.7.0 candidate passed the focused UI correction tests, the remaining 43 Chromium release smoke cases, package export admission, affected CSS lint, and a clean npm advisory audit. The complete release workflow will repeat its protected gates from the merged commit. Confirm generated demo asset hashes, package exports, and version surfaces before merging. Tagging, GitHub Release creation, and npm publication follow the protected workflow in [PUBLISHING.md](PUBLISHING.md).
package/manifest.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "breakingChange": "increment-schemaVersion-before-removing-or-renaming-fields"
6
6
  },
7
7
  "name": "ui-style-kit-css",
8
- "version": "2.6.1",
8
+ "version": "2.7.0",
9
9
  "cascadeLayers": [
10
10
  "ui-style-kit.theme_colors",
11
11
  "ui-style-kit.native_elements",
@@ -733,6 +733,11 @@
733
733
  "success",
734
734
  "warning",
735
735
  "danger"
736
+ ],
737
+ ".usk-tooltip": [
738
+ "primary",
739
+ "secondary",
740
+ "accent"
736
741
  ]
737
742
  }
738
743
  },
@@ -1091,6 +1096,9 @@
1091
1096
  "toolbar",
1092
1097
  "tooltip",
1093
1098
  "tooltip-arrow",
1099
+ "tooltip-primary",
1100
+ "tooltip-secondary",
1101
+ "tooltip-accent",
1094
1102
  "tooltip-bottom",
1095
1103
  "tooltip-left",
1096
1104
  "tooltip-right",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ui-style-kit-css",
3
- "version": "2.6.1",
3
+ "version": "2.7.0",
4
4
  "description": "CSS theme and UI style preset library for accessible websites, dashboards, admin interfaces, and client-facing pages.",
5
5
  "style": "dist/ui-style-kit.css",
6
6
  "main": "dist/ui-style-kit.css",
@@ -248,7 +248,7 @@
248
248
  },
249
249
  "overrides": {
250
250
  "colord": "2.9.4",
251
- "fast-uri": "3.1.8",
251
+ "fast-uri": "3.1.9",
252
252
  "js-yaml": "4.3.2",
253
253
  "nanoid": "3.3.18",
254
254
  "postcss": "8.5.23"
@@ -251,7 +251,7 @@
251
251
  --usk-native-range-track-shadow: 0 0 0 2px var(--deco-surface-strong);
252
252
  --usk-native-range-progress-background: var(--deco-primary);
253
253
  --usk-native-range-thumb-size: 1.35rem;
254
- --usk-native-range-thumb-background: var(--deco-surface-strong);
254
+ --usk-native-range-thumb-background: var(--usk-native-primary);
255
255
  --usk-native-range-thumb-border: 1px solid var(--deco-border);
256
256
  --usk-native-range-thumb-radius: 50%;
257
257
  --usk-native-range-thumb-shadow: 0 0 0 2px var(--deco-surface-strong);
@@ -437,7 +437,8 @@
437
437
  /* Theme-responsive component defaults */
438
438
  .deco-card, .deco-panel { background: var(--deco-card-bg); }
439
439
  .deco-toolbar, .deco-table-wrap { background: var(--deco-control-bg); }
440
- .deco-button:not(.deco-button-primary):not(.deco-button-secondary):not(.deco-button-danger):not(.deco-button-warning):not(.deco-button-ghost), .deco-icon-button { background: var(--deco-control-bg); }
440
+ /** Attribute-selected variants bypass the legacy neutral-only paint fallback. */
441
+ .deco-button:where(:not([data-ui-variant])):not(.deco-button-primary):not(.deco-button-secondary):not(.deco-button-danger):not(.deco-button-warning):not(.deco-button-ghost), .deco-icon-button { background: var(--deco-control-bg); }
441
442
  .deco-button, .deco-icon-button, .deco-badge, .deco-nav-link { font-family: var(--deco-font-control); }
442
443
 
443
444
 
@@ -858,7 +859,7 @@
858
859
  --usk-native-range-track-shadow: inset 0 0 0 1px rgb(var(--deco-surface-strong-rgb) / .72);
859
860
  --usk-native-range-progress-background: linear-gradient(90deg, var(--deco-primary), var(--deco-warning));
860
861
  --usk-native-range-thumb-size: 1.18rem;
861
- --usk-native-range-thumb-background: linear-gradient(135deg, var(--deco-warning), var(--deco-primary));
862
+ --usk-native-range-thumb-background: var(--usk-native-primary);
862
863
  --usk-native-range-thumb-border: 3px double var(--deco-border);
863
864
  --usk-native-range-thumb-radius: 0;
864
865
  --usk-native-range-thumb-shadow: 0 0 0 2px rgb(var(--deco-surface-strong-rgb) / .72);
@@ -1035,8 +1036,7 @@
1035
1036
  --usk-native-range-track-background:
1036
1037
  linear-gradient(90deg, var(--deco-surface-soft), rgb(var(--deco-metal-rgb) / .52), var(--deco-surface-soft));
1037
1038
  --usk-native-range-progress-background: var(--deco-jewel-primary);
1038
- --usk-native-range-thumb-background:
1039
- linear-gradient(135deg, var(--deco-jewel-warning), var(--deco-jewel-primary));
1039
+ --usk-native-range-thumb-background: var(--usk-native-primary);
1040
1040
  --usk-native-progress-size: .625rem;
1041
1041
  --usk-native-progress-value-background: var(--deco-jewel-primary);
1042
1042
  --usk-native-meter-optimum-background: var(--deco-jewel-success);
@@ -1524,7 +1524,7 @@
1524
1524
  text-indent: 0;
1525
1525
  }
1526
1526
 
1527
- .deco-button:not(.deco-button-primary):not(.deco-button-secondary):not(.deco-button-danger):not(.deco-button-warning):not(.deco-button-ghost),
1527
+ .deco-button:where(:not([data-ui-variant])):not(.deco-button-primary):not(.deco-button-secondary):not(.deco-button-danger):not(.deco-button-warning):not(.deco-button-ghost),
1528
1528
  .deco-icon-button {
1529
1529
  background-color: var(--deco-surface-strong);
1530
1530
  background-image: none;
@@ -1839,7 +1839,7 @@
1839
1839
  --usk-native-choice-checked-background: var(--deco-secondary);
1840
1840
  --usk-native-choice-mark-color: var(--deco-on-secondary);
1841
1841
  --usk-native-range-progress-background: var(--deco-secondary);
1842
- --usk-native-range-thumb-background: var(--deco-secondary);
1842
+ --usk-native-range-thumb-background: var(--usk-native-primary);
1843
1843
  --usk-native-progress-value-background: var(--deco-secondary);
1844
1844
  }
1845
1845
  /** Decorative layers retain stepped borders without clipping focus or content. */
@@ -1901,7 +1901,7 @@
1901
1901
  .deco-icon-button { width: 36px; min-width: 36px; padding: 0; font-family: "Segoe UI Symbol", Arial, sans-serif; font-size: 16px; line-height: 1; }
1902
1902
  .deco-button-loading { display: inline-flex; align-items: center; justify-content: center; min-inline-size: 152px; }
1903
1903
  .deco-button[aria-busy="true"]::after, .deco-icon-button[aria-busy="true"]::after,
1904
- [data-ui="art-deco"] :where(button[aria-busy="true"])::after { content: ""; position: static; display: inline-block; box-sizing: border-box; flex: 0 0 16px; width: 16px; height: 16px; margin: 0; background: var(--deco-spinner-segmented-background); border: 3px double var(--deco-metal); box-shadow: none; border-radius: 50%; -webkit-mask: none; mask: none; animation: deco-spin 1.4s linear infinite; }
1904
+ [data-ui="art-deco"] :where(button[aria-busy="true"])::after { content: ""; position: static; display: inline-block; box-sizing: border-box; flex: 0 0 16px; width: 16px; height: 16px; margin: 0; background: repeating-conic-gradient(currentColor 0 8deg, transparent 8deg 16deg, currentColor 16deg 24deg, transparent 24deg 30deg); border: 3px double var(--deco-metal); box-shadow: none; border-radius: 50%; -webkit-mask: none; mask: none; animation: deco-spin 1.4s linear infinite; }
1905
1905
  /** One loader silhouette across prefixed, native, and generated semantic surfaces. */
1906
1906
  .deco-spinner, .deco-loading-spinner, [data-ui="art-deco"] :where(.ui-spinner, .loading-spinner, [data-loading-spinner]) { position: relative; display: inline-block; width: 48px; height: 48px; flex: 0 0 48px; border: 3px double var(--deco-metal); border-radius: 50%; background: var(--deco-spinner-segmented-background); box-shadow: none; clip-path: none; animation: deco-spin 1.4s linear infinite; }
1907
1907
  .deco-spinner::before, .deco-loading-spinner::before, [data-ui="art-deco"] :where(.ui-spinner, .loading-spinner, [data-loading-spinner])::before { content: ""; position: absolute; inset: 0; border-radius: 50%; background: repeating-conic-gradient(var(--deco-metal) 0deg 22deg, transparent 22deg 36deg); -webkit-mask: radial-gradient(transparent 49%, #000 51%); mask: radial-gradient(transparent 49%, #000 51%); }
@@ -264,7 +264,7 @@
264
264
  --usk-native-range-track-shadow: none;
265
265
  --usk-native-range-progress-background: var(--bau-primary);
266
266
  --usk-native-range-thumb-size: 1.55rem;
267
- --usk-native-range-thumb-background: var(--bau-primary);
267
+ --usk-native-range-thumb-background: var(--usk-native-primary);
268
268
  --usk-native-range-thumb-border: 2px solid var(--bau-border);
269
269
  --usk-native-range-thumb-radius: 50%;
270
270
  --usk-native-range-thumb-shadow: var(--bau-control-shadow-pressed);
@@ -463,7 +463,8 @@
463
463
  /* Theme-responsive component defaults */
464
464
  .bau-card, .bau-panel { background: var(--bau-card-bg); }
465
465
  .bau-toolbar, .bau-table-wrap { background: var(--bau-control-bg); }
466
- .bau-button:not(.bau-button-primary):not(.bau-button-secondary):not(.bau-button-danger):not(.bau-button-warning):not(.bau-button-ghost):not(.is-primary):not(.is-secondary):not(.is-danger):not(.is-ghost):not(.is-busy):not(.is-hover), .bau-icon-button { background: var(--bau-control-bg); }
466
+ /** Attribute-selected variants bypass the legacy neutral-only paint fallback. */
467
+ .bau-button:where(:not([data-ui-variant])):not(.bau-button-primary):not(.bau-button-secondary):not(.bau-button-danger):not(.bau-button-warning):not(.bau-button-ghost):not(.is-primary):not(.is-secondary):not(.is-danger):not(.is-ghost):not(.is-busy):not(.is-hover), .bau-icon-button { background: var(--bau-control-bg); }
467
468
  .bau-button, .bau-icon-button, .bau-badge, .bau-nav-link { font-family: var(--bau-font-control); }
468
469
 
469
470
 
@@ -863,7 +864,7 @@
863
864
  --usk-native-range-track-shadow: inset 0 -2px 0 rgb(var(--bau-text-rgb) / .3);
864
865
  --usk-native-range-progress-background: var(--bau-primary);
865
866
  --usk-native-range-thumb-size: 1.58rem;
866
- --usk-native-range-thumb-background: var(--bau-primary);
867
+ --usk-native-range-thumb-background: var(--usk-native-primary);
867
868
  --usk-native-range-thumb-border: 2px solid var(--bau-border);
868
869
  --usk-native-range-thumb-radius: 50%;
869
870
  --usk-native-range-thumb-shadow: .16rem .16rem 0 rgb(var(--bau-text-rgb) / .7);
package/styles/bento.css CHANGED
@@ -261,7 +261,7 @@
261
261
  --usk-native-range-track-shadow: inset 0 1px 2px rgb(var(--bento-text-rgb) / .12);
262
262
  --usk-native-range-progress-background: var(--bento-primary);
263
263
  --usk-native-range-thumb-size: 1.35rem;
264
- --usk-native-range-thumb-background: var(--bento-surface-strong);
264
+ --usk-native-range-thumb-background: var(--usk-native-primary);
265
265
  --usk-native-range-thumb-border: 1px solid rgb(var(--bento-primary-rgb) / .28);
266
266
  --usk-native-range-thumb-radius: .5rem;
267
267
  --usk-native-range-thumb-shadow: 0 .35rem .8rem rgb(var(--bento-text-rgb) / .18), inset 0 1px 0 rgb(var(--bento-surface-strong-rgb) / .78);
@@ -793,7 +793,8 @@
793
793
  .bento-card-feature { background: var(--bento-tile-accent-bg); border-radius: var(--bento-tile-radius); }
794
794
  .bento-icon-medallion {
795
795
  background: rgb(var(--bento-primary-rgb) / .10);
796
- color: var(--usk-primary-ink, var(--bento-primary));
796
+ /* Translucent tiles use readable surface ink when no shared palette is active. */
797
+ color: var(--usk-primary-ink, var(--bento-link));
797
798
  border: 1px solid rgb(var(--bento-primary-rgb) / .20);
798
799
  border-radius: var(--bento-radius-md);
799
800
  box-shadow: var(--bento-shadow-sm);
@@ -1334,6 +1335,9 @@
1334
1335
  [data-ui=bento][data-mode] .bento-stepper > i { background: var(--bento-mosaic-line-strong); height: 2px; width: 23px; }
1335
1336
 
1336
1337
  [data-ui=bento][data-mode] .bento-segment { background: var(--bento-mosaic-panel-soft); border: 1px solid var(--bento-mosaic-line); border-radius: 7px; display: grid; grid-template-columns: repeat(3, 1fr); padding: 2px; }
1338
+ /** The public segment button is distinct from the legacy three-column segment container. */
1339
+ [data-ui=bento][data-mode] button.bento-segment { display: inline-flex; grid-template-columns: none; align-items: center; justify-content: center; }
1340
+ [data-ui=bento][data-mode] button.bento-segment[aria-pressed="true"] { background: var(--usk-native-primary); color: var(--usk-native-on-primary); }
1337
1341
  [data-ui=bento][data-mode] .bento-segment button { background: transparent; border: 0; border-radius: 5px; color: var(--bento-mosaic-muted); font-size: 12px; min-height: 24px; }
1338
1342
  [data-ui=bento][data-mode] .bento-segment button.is-active { background: var(--bento-mosaic-panel-raised); box-shadow: 0 2px 8px rgba(24, 35, 72, 0.1); color: var(--usk-primary-ink, var(--bento-mosaic-primary)); font-weight: 800; }
1339
1343
 
@@ -1375,7 +1379,7 @@
1375
1379
 
1376
1380
  [data-ui=bento][data-mode] .bento-loading { align-items: center; display: grid; grid-template-columns: 40px 1fr; grid-template-rows: auto 1fr; }
1377
1381
  [data-ui=bento][data-mode] .bento-loading > header { width: 100%; }
1378
- [data-ui=bento][data-mode] .bento-spinner { color: var(--usk-primary-ink, var(--bento-mosaic-primary)); height: 31px; width: 31px; }
1382
+ [data-ui=bento][data-mode] .bento-spinner { color: var(--usk-primary-ink, var(--bento-link)); height: 31px; width: 31px; }
1379
1383
  [data-ui=bento][data-mode] .bento-spin { animation: bento-mosaic-spin 1s linear infinite; }
1380
1384
  @keyframes bento-mosaic-spin { to { transform: rotate(360deg); } }
1381
1385
  [data-ui=bento][data-mode] .bento-skeleton { display: grid; gap: 5px; }
@@ -1443,10 +1447,10 @@
1443
1447
  [data-ui=bento][data-mode] .bento-dialog-zone { background: var(--bento-primary); border-color: var(--bento-primary); display: grid; grid-template-rows: auto 1fr; padding: 0; }
1444
1448
  [data-ui=bento][data-mode] .bento-sheet[data-mode="dark"] .bento-dialog-zone { background: var(--bento-primary); border-color: var(--bento-border); }
1445
1449
  [data-ui=bento][data-mode] .bento-dialog-toolbar { align-items: center; border-bottom: 1px solid rgba(255, 255, 255, 0.15); display: flex; justify-content: space-between; padding: 7px 11px; }
1446
- [data-ui=bento][data-mode] .bento-tabs { display: flex; gap: 3px; }
1447
- [data-ui=bento][data-mode] .bento-tabs button,
1450
+ [data-ui=bento][data-mode] .bento-dialog-toolbar .bento-tabs { display: flex; gap: 3px; }
1451
+ [data-ui=bento][data-mode] .bento-dialog-toolbar .bento-tabs button,
1448
1452
  [data-ui=bento][data-mode] .bento-dialog-toolbar > button { background: transparent; border: 0; border-radius: 6px; color: var(--bento-on-primary); font-size: 12px; min-height: 26px; padding: 0 8px; }
1449
- [data-ui=bento][data-mode] .bento-tabs button.is-active { background: rgba(255, 255, 255, 0.13); color: var(--bento-on-primary); font-weight: 800; }
1453
+ [data-ui=bento][data-mode] .bento-dialog-toolbar .bento-tabs button.is-active { background: rgba(255, 255, 255, 0.13); color: var(--bento-on-primary); font-weight: 800; }
1450
1454
  [data-ui=bento][data-mode] .bento-dialog-surface { align-items: center; display: flex; justify-content: center; padding: 16px; }
1451
1455
  [data-ui=bento][data-mode] .bento-dialog-surface dialog { background: var(--bento-mosaic-panel-raised); border: 1px solid var(--bento-mosaic-line); border-radius: 14px; box-shadow: var(--bento-mosaic-shadow-raised); color: var(--bento-mosaic-text); display: block; margin: 0; max-width: 315px; padding: 26px; position: relative; width: 100%; }
1452
1456
  [data-ui=bento][data-mode] .bento-dialog-surface dialog:not([open]) { display: none; }
@@ -1590,7 +1594,8 @@
1590
1594
  [data-ui=bento][data-mode] .bento-feature-strip, [data-ui=bento][data-mode] .bento-callout-bar { border-radius: 17px; box-shadow: var(--bento-mosaic-shadow); }
1591
1595
  [data-ui=bento][data-mode] .bento-card, [data-ui=bento][data-mode] .bento-panel { padding: 16px; }
1592
1596
  [data-ui=bento][data-mode] .bento-button, [data-ui=bento][data-mode] .bento-icon-button { border-radius: 8px; box-shadow: none; font-weight: 750; text-shadow: none; }
1593
- [data-ui=bento][data-mode] .bento-button:not(.bento-button-primary):not(.bento-button-secondary):not(.bento-button-danger):not(.bento-button-warning):not(.bento-button-ghost):not(.is-primary):not(.is-secondary):not(.is-danger):not(.is-ghost):not(.is-busy):not(.is-hover) { background: var(--bento-surface-soft); }
1597
+ /** Attribute-selected variants bypass the legacy neutral-only paint fallback. */
1598
+ [data-ui=bento][data-mode] .bento-button:where(:not([data-ui-variant])):not(.bento-button-primary):not(.bento-button-secondary):not(.bento-button-danger):not(.bento-button-warning):not(.bento-button-ghost):not(.is-primary):not(.is-secondary):not(.is-danger):not(.is-ghost):not(.is-busy):not(.is-hover) { background: var(--bento-surface-soft); }
1594
1599
  [data-ui=bento][data-mode] .bento-button.bento-button-primary, [data-ui=bento][data-mode] .bento-button.is-primary, [data-ui=bento][data-mode] .bento-button.is-busy { background: var(--bento-primary); color: var(--bento-on-primary); border-color: var(--bento-primary); }
1595
1600
  [data-ui=bento][data-mode] .bento-button.bento-button-secondary, [data-ui=bento][data-mode] .bento-button.is-secondary { background: transparent; color: var(--bento-link); border-color: var(--bento-primary); }
1596
1601
  [data-ui=bento][data-mode] .bento-button.bento-button-danger, [data-ui=bento][data-mode] .bento-button.is-danger { background: var(--bento-mosaic-danger-soft); color: var(--bento-text); border-color: var(--bento-danger); }
@@ -1674,7 +1679,7 @@
1674
1679
  [data-ui=bento][data-mode] .bento-segment button.is-active,
1675
1680
  [data-ui=bento][data-mode] .bento-listbox button[aria-selected="true"] { color: var(--bento-link); }
1676
1681
  [data-ui=bento][data-mode] .bento-media-scrim > :where(figcaption, [data-media-caption]) * { color: inherit; }
1677
- [data-ui=bento][data-mode] .bento-tabs button.is-active { background: var(--bento-surface); color: var(--bento-text); }
1682
+ [data-ui=bento][data-mode] .bento-dialog-toolbar .bento-tabs button.is-active { background: var(--bento-surface); color: var(--bento-text); }
1678
1683
  [data-ui=bento][data-mode] .bento-switch-row { min-height: 32px; }
1679
1684
  [data-ui=bento][data-mode] .bento-sheet .bento-switch:where(button, span) { flex: 0 0 37px; padding: 2px; min-height: 20px; }
1680
1685
  [data-ui=bento][data-mode] .bento-segment button { min-height: 36px; padding: 4px; }
@@ -1688,8 +1693,10 @@
1688
1693
  [data-ui=bento][data-mode] .bento-loading-spinner,
1689
1694
  [data-ui=bento][data-mode] :where(.ui-spinner, .loading-spinner, [data-loading-spinner]),
1690
1695
  [data-ui=bento][data-mode] .bento-sheet .bento-spinner { border: 2px solid currentColor; border-top-color: transparent; background: transparent; clip-path: none; border-radius: 50%; box-shadow: none; animation: bento-mosaic-spin 1s linear infinite; width: 28px; height: 28px; inline-size: 28px; block-size: 28px; flex: 0 0 auto; }
1691
- /** Keeps semantic spinner paint aligned with the prefixed readable ink treatment. */
1692
- [data-ui=bento][data-mode] :where(.ui-spinner, .loading-spinner, [data-loading-spinner]) { color: var(--usk-primary-ink, var(--bento-spinner-stroke)); }
1696
+ /** Every loading entry point uses the same readable ink, including native palettes. */
1697
+ [data-ui=bento][data-mode] .bento-spinner,
1698
+ [data-ui=bento][data-mode] .bento-loading-spinner,
1699
+ [data-ui=bento][data-mode] :where(.ui-spinner, .loading-spinner, [data-loading-spinner]) { color: var(--usk-primary-ink, var(--bento-link)); }
1693
1700
  [data-ui=bento][data-mode] .bento-spinner-sm { width: 16px; height: 16px; inline-size: 16px; block-size: 16px; }
1694
1701
  [data-ui=bento][data-mode] .bento-spinner-lg { width: 40px; height: 40px; inline-size: 40px; block-size: 40px; }
1695
1702
  /** Keeps native busy controls on the same Soft Mosaic ring as authored button aliases. */
@@ -262,7 +262,7 @@
262
262
  --usk-native-range-track-shadow: 4px 4px 0 var(--brutal-border);
263
263
  --usk-native-range-progress-background: var(--brutal-primary);
264
264
  --usk-native-range-thumb-size: 1.45rem;
265
- --usk-native-range-thumb-background: var(--brutal-surface-strong);
265
+ --usk-native-range-thumb-background: var(--usk-native-primary);
266
266
  --usk-native-range-thumb-border: 2px solid var(--brutal-border);
267
267
  --usk-native-range-thumb-radius: 0;
268
268
  --usk-native-range-thumb-shadow: 4px 4px 0 var(--brutal-border);
@@ -524,7 +524,8 @@
524
524
  /* Theme-responsive component defaults */
525
525
  .brutal-card, .brutal-panel { background: var(--brutal-card-bg); }
526
526
  .brutal-toolbar, .brutal-table-wrap { background: var(--brutal-control-bg); }
527
- .brutal-button:not(.brutal-button-primary):not(.brutal-button-secondary):not(.brutal-button-danger):not(.brutal-button-warning):not(.brutal-button-ghost), .brutal-icon-button { background: var(--brutal-control-bg); }
527
+ /** Attribute-selected variants bypass the legacy neutral-only paint fallback. */
528
+ .brutal-button:where(:not([data-ui-variant])):not(.brutal-button-primary):not(.brutal-button-secondary):not(.brutal-button-danger):not(.brutal-button-warning):not(.brutal-button-ghost), .brutal-icon-button { background: var(--brutal-control-bg); }
528
529
  .brutal-button, .brutal-icon-button, .brutal-badge, .brutal-nav-link { font-family: var(--brutal-font-control); }
529
530
 
530
531
 
@@ -835,7 +836,7 @@
835
836
  --usk-native-range-track-shadow: inset 0 0 0 2px var(--brutal-surface-strong);
836
837
  --usk-native-range-progress-background: repeating-linear-gradient(90deg, var(--brutal-primary) 0 .9rem, var(--brutal-warning) .9rem 1.05rem);
837
838
  --usk-native-range-thumb-size: 1.24rem;
838
- --usk-native-range-thumb-background: var(--brutal-text);
839
+ --usk-native-range-thumb-background: var(--usk-native-primary);
839
840
  --usk-native-range-thumb-border: 3px solid var(--brutal-warning);
840
841
  --usk-native-range-thumb-radius: 0;
841
842
  --usk-native-range-thumb-shadow: .14rem .14rem 0 var(--brutal-primary);
package/styles/clay.css CHANGED
@@ -259,7 +259,7 @@
259
259
  --usk-native-range-track-shadow: inset 0 4px rgb(255 255 255 / .3);
260
260
  --usk-native-range-progress-background: var(--clay-primary);
261
261
  --usk-native-range-thumb-size: 1.65rem;
262
- --usk-native-range-thumb-background: var(--clay-surface-strong);
262
+ --usk-native-range-thumb-background: var(--usk-native-primary);
263
263
  --usk-native-range-thumb-border: 1px solid var(--clay-border);
264
264
  --usk-native-range-thumb-radius: 50%;
265
265
  --usk-native-range-thumb-shadow: inset 0 4px rgb(255 255 255 / .3);
@@ -445,7 +445,8 @@
445
445
  /* Theme-responsive component defaults */
446
446
  .clay-card, .clay-panel { background: var(--clay-card-bg); }
447
447
  .clay-toolbar, .clay-table-wrap { background: var(--clay-control-bg); }
448
- .clay-button:not(.clay-button-primary):not(.clay-button-secondary):not(.clay-button-danger):not(.clay-button-warning):not(.clay-button-ghost), .clay-icon-button { background: var(--clay-control-bg); }
448
+ /** Attribute-selected variants bypass the legacy neutral-only paint fallback. */
449
+ .clay-button:where(:not([data-ui-variant])):not(.clay-button-primary):not(.clay-button-secondary):not(.clay-button-danger):not(.clay-button-warning):not(.clay-button-ghost), .clay-icon-button { background: var(--clay-control-bg); }
449
450
  .clay-button, .clay-icon-button, .clay-badge, .clay-nav-link { font-family: var(--clay-font-control); }
450
451
 
451
452
 
@@ -928,7 +929,7 @@
928
929
  --usk-native-range-track-shadow: var(--clay-carved-shadow);
929
930
  --usk-native-range-progress-background: var(--clay-molded-primary);
930
931
  --usk-native-range-thumb-size: 1.32rem;
931
- --usk-native-range-thumb-background: var(--clay-molded-thumb);
932
+ --usk-native-range-thumb-background: var(--usk-native-primary);
932
933
  --usk-native-range-thumb-border: 1px solid var(--clay-material-seam);
933
934
  --usk-native-range-thumb-radius: 43% 57% 47% 53% / 52% 45% 55% 48%;
934
935
  --usk-native-range-thumb-shadow: inset 0 0 0 1px var(--clay-material-seam), var(--clay-filled-shadow);
@@ -1434,7 +1435,8 @@
1434
1435
  flex: 0 0 auto;
1435
1436
  border: 0;
1436
1437
  background:
1437
- radial-gradient(circle at 50% 8%, var(--clay-material-highlight) 0 3%, var(--clay-pigment-primary) 4% 9%, transparent 10%),
1438
+ /* The leading bead stays visible on every button fill; other beads retain their pigments. */
1439
+ radial-gradient(circle at 50% 8%, var(--clay-material-highlight) 0 3%, currentColor 4% 9%, transparent 10%),
1438
1440
  radial-gradient(circle at 80% 20%, var(--clay-material-highlight) 0 3%, var(--clay-accent) 4% 9%, transparent 10%),
1439
1441
  radial-gradient(circle at 92% 50%, var(--clay-material-highlight) 0 3%, var(--clay-pigment-secondary) 4% 9%, transparent 10%),
1440
1442
  radial-gradient(circle at 80% 80%, var(--clay-material-highlight) 0 3%, var(--clay-pigment-success) 4% 9%, transparent 10%),
@@ -48,6 +48,26 @@
48
48
  }
49
49
 
50
50
  @layer ui-style-kit.clean_defaults {
51
+ /** Inline hyperlinks and their labels must not inherit the control spacing floor. */
52
+ [data-ui][data-mode] :where(a:not([class]), a[data-link-presentation="inline"], a[data-link-presentation="inline"] > .usk-link__label, a[data-link-presentation="inline"] > .usk-link__icon) {
53
+ display: inline;
54
+ min-block-size: 0;
55
+ min-inline-size: 0;
56
+ margin: 0;
57
+ padding: 0;
58
+ border: 0;
59
+ border-radius: 0;
60
+ background: transparent;
61
+ box-shadow: none;
62
+ }
63
+
64
+ /** Explicit control links preserve a wrapping, aligned action composition. */
65
+ [data-ui][data-mode] :where(a[data-link-presentation="control"]) {
66
+ display: inline-flex;
67
+ align-items: center;
68
+ gap: var(--usk-link-gap, .5rem);
69
+ }
70
+
51
71
  /** Keeps semantic state paint paired when a preset also owns broad anchor or input rules. */
52
72
  [data-ui][data-mode] :where(
53
73
  [class~="usk-pagination-link"][aria-current="page"],
@@ -5,6 +5,69 @@
5
5
  classes. Visual paint remains preset-owned.
6
6
  ========================================================= */
7
7
 
8
+ @layer ui-style-kit.clean_defaults {
9
+ /** Long chip content shrinks and wraps before it can displace the separate remove action. */
10
+ [data-ui][data-mode] .usk-chip > .usk-chip__label {
11
+ min-inline-size: 0;
12
+ overflow-wrap: anywhere;
13
+ }
14
+
15
+ /** Avatar initials fill the containing avatar instead of using a font-relative centering offset. */
16
+ [data-ui][data-mode] .usk-avatar > .usk-avatar__fallback {
17
+ position: absolute;
18
+ inset: 0;
19
+ box-sizing: border-box;
20
+ inline-size: auto;
21
+ block-size: auto;
22
+ margin: 0;
23
+ padding: 0;
24
+ translate: none;
25
+ }
26
+
27
+ /** Centered dialogs retain auto margins; edge drawers keep their own placement contract. */
28
+ [data-ui][data-mode] :where(.usk-modal:not(.usk-drawer)) {
29
+ margin: auto;
30
+ }
31
+
32
+ /** Compound controls own their gap; labels and decorative icons have no separate inset. */
33
+ [data-ui][data-mode] :where(.usk-button__label, .usk-button__icon, .usk-nav-link__label, .usk-nav-link__icon, .usk-link__label, .usk-link__icon) {
34
+ min-inline-size: 0;
35
+ margin: 0;
36
+ padding: 0;
37
+ }
38
+
39
+ /** Explicit card density overrides preset padding through one shared token. */
40
+ [data-ui][data-mode] :where([class~="usk-card"], [class~="ui-card"])[data-card-spacing="flush"] {
41
+ --usk-card-padding: 0;
42
+ }
43
+
44
+ [data-ui][data-mode] :where([class~="usk-card"], [class~="ui-card"])[data-card-spacing="compact"] {
45
+ --usk-card-padding: var(--usk-card-padding-compact, .75rem);
46
+ }
47
+
48
+ [data-ui][data-mode] :where([class~="usk-card"], [class~="ui-card"])[data-card-spacing="normal"] {
49
+ --usk-card-padding: var(--usk-card-padding-normal, 1rem);
50
+ }
51
+
52
+ [data-ui][data-mode] :where([class~="usk-card"], [class~="ui-card"])[data-card-spacing="comfortable"] {
53
+ --usk-card-padding: var(--usk-card-padding-comfortable, clamp(1.25rem, 2.5vw, 2rem));
54
+ }
55
+
56
+ [data-ui][data-mode] :where([class~="usk-card"], [class~="ui-card"]):is([data-card-spacing="flush"], [data-card-spacing="compact"], [data-card-spacing="normal"], [data-card-spacing="comfortable"]) {
57
+ padding: var(--usk-card-padding);
58
+ }
59
+
60
+ /** Explicit structural boundaries opt out of element insets and panel paint without a global reset. */
61
+ [data-ui][data-mode] :where(div, main, section, header, footer, nav, article, aside)[data-ui-structure="neutral"] {
62
+ margin: 0;
63
+ padding: 0;
64
+ border: 0;
65
+ border-radius: 0;
66
+ background: transparent;
67
+ box-shadow: none;
68
+ }
69
+ }
70
+
8
71
  @layer ui-style-kit.components {
9
72
  /* Shared component composition keeps icon content aligned without overriding preset paint. */
10
73
  .usk-button__icon {