diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index f65d541..421f78d 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -44,3 +44,63 @@ jobs: - name: Validate package run: npm run ${{ matrix.validation-script }} + + release-preflight: + name: PR-safe ecosystem release preflight + if: github.event_name == 'pull_request' + needs: quality + runs-on: ubuntu-latest + timeout-minutes: 30 + permissions: + contents: read + steps: + - name: Checkout Interactive Surface candidate + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 + + - name: Use Node.js 22 + uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5 + with: + node-version: 22 + cache: npm + + - name: Install candidate dependencies + run: npm ci + + - name: Resolve immutable UI release fixture + id: ui_fixture + run: node scripts/release-fixture-contract.mjs --write-github-outputs + + - name: Checkout reviewed UI release fixture + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 + with: + repository: ${{ steps.ui_fixture.outputs.ui_repository }} + ref: ${{ steps.ui_fixture.outputs.ui_revision }} + path: _ecosystem/ui-style-kit-css + + - name: Install UI fixture dependencies + working-directory: _ecosystem/ui-style-kit-css + run: npm ci + + - name: Resolve immutable Layout companion + id: ecosystem_sources + working-directory: _ecosystem/ui-style-kit-css + run: node scripts/write-ecosystem-workflow-outputs.mjs + + - name: Checkout reviewed Layout companion + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 + with: + repository: ${{ steps.ecosystem_sources.outputs.layout_repository }} + ref: ${{ steps.ecosystem_sources.outputs.layout_revision }} + path: _ecosystem/Layout-Style-CSS + + - name: Install Layout companion dependencies + working-directory: _ecosystem/Layout-Style-CSS + run: npm ci + + - name: Install clean-consumer Chromium + working-directory: _ecosystem/ui-style-kit-css + run: npx playwright install --with-deps chromium + + # Candidate override is an npm-pack tarball; the other two sources stay at reviewed immutable commits. + - name: Run read-only release preflight + run: npm run release:preflight -- --fixture-root $GITHUB_WORKSPACE/_ecosystem/ui-style-kit-css --layout-repo $GITHUB_WORKSPACE/_ecosystem/Layout-Style-CSS --layout-docs-repo $GITHUB_WORKSPACE/_ecosystem/Layout-Style-CSS --interactive-docs-repo $GITHUB_WORKSPACE diff --git a/.github/workflows/npm-publish.yml b/.github/workflows/npm-publish.yml index 223601d..081f5ea 100644 --- a/.github/workflows/npm-publish.yml +++ b/.github/workflows/npm-publish.yml @@ -60,6 +60,45 @@ jobs: - name: Validate publish package run: npm run validate:publish + - name: Resolve immutable UI release fixture + id: ui_fixture + run: node scripts/release-fixture-contract.mjs --write-github-outputs + + - name: Checkout reviewed UI release fixture + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 + with: + repository: ${{ steps.ui_fixture.outputs.ui_repository }} + ref: ${{ steps.ui_fixture.outputs.ui_revision }} + path: _ecosystem/ui-style-kit-css + + - name: Install UI fixture dependencies + working-directory: _ecosystem/ui-style-kit-css + run: npm ci + + - name: Resolve immutable Layout companion + id: ecosystem_sources + working-directory: _ecosystem/ui-style-kit-css + run: node scripts/write-ecosystem-workflow-outputs.mjs + + - name: Checkout reviewed Layout companion + uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 + with: + repository: ${{ steps.ecosystem_sources.outputs.layout_repository }} + ref: ${{ steps.ecosystem_sources.outputs.layout_revision }} + path: _ecosystem/Layout-Style-CSS + + - name: Install Layout companion dependencies + working-directory: _ecosystem/Layout-Style-CSS + run: npm ci + + - name: Install clean-consumer Chromium + working-directory: _ecosystem/ui-style-kit-css + run: npx playwright install --with-deps chromium + + # This gate performs only registry reads, candidate packing, and clean-consumer validation. + - name: Run ecosystem release preflight + run: npm run release:preflight -- --fixture-root $GITHUB_WORKSPACE/_ecosystem/ui-style-kit-css --layout-repo $GITHUB_WORKSPACE/_ecosystem/Layout-Style-CSS --layout-docs-repo $GITHUB_WORKSPACE/_ecosystem/Layout-Style-CSS --interactive-docs-repo $GITHUB_WORKSPACE + - name: Publish to npm run: npm publish --provenance --access public --ignore-scripts env: diff --git a/CHANGELOG.md b/CHANGELOG.md index 894678c..54dc42b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,32 @@ All notable changes to this package are documented in this file. ## Unreleased +## 1.6.0 - 2026-08-09 + +### Added + +- Added optional shared semantic fallbacks for standalone paint, control geometry, focus, and default motion while retaining package-specific precedence and all legacy behavior when shared tokens are absent. + +### Changed + +- Documented the third-party theme integration path, fallback order, and canonical UI Style Kit bridge boundary across the README and wiki without changing ownership or compatibility ranges. + +### Fixed + +- Preserved legacy standalone behavior when shared semantic tokens are unavailable by retaining the existing fallback chains. + +### Accessibility + +- Kept the established focus and motion semantics while allowing optional shared focus-color and default-motion values. + +### Documentation + +- Updated release-facing package, CDN, README, and wiki guidance for the unpublished `1.6.0` candidate. + +### Testing + +- Added focused contracts for shared semantic fallback precedence and manifest inventory while retaining generated, package, and public-export coverage. + ## 1.5.0 - 2026-07-20 ### Added diff --git a/README.md b/README.md index 0cb79a7..86b89a9 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ Framework-agnostic CSS for reliable hover, focus, press, selected, current, loading, disabled, and motion affordances on interactive controls. Use it alone or as the interaction layer beside your existing layout and theme system. -Version 1.5.0 is a release candidate in this repository until its npm release is published. Existing 1.x imports, selectors, data hooks, ARIA hooks, and tokens remain supported. +Version 1.6.0 is a release candidate in this repository until its npm release is published. Existing 1.x imports, selectors, data hooks, ARIA hooks, and tokens remain supported. The package targets Node.js 20+ for npm installs and local validation. CI proves the minimum Node 20 lane and the preferred Node 22 lane before release. @@ -56,11 +56,11 @@ For a no-build page, pin the release: ```html ``` -The equivalent unpkg URL is `https://unpkg.com/interactive-surface-css@1.5.0/standalone-preset.css`. To follow future releases deliberately, use `https://cdn.jsdelivr.net/npm/interactive-surface-css@latest/standalone-preset.css` — unpinned opt-in. +The equivalent unpkg URL is `https://unpkg.com/interactive-surface-css@1.6.0/standalone-preset.css`. To follow future releases deliberately, use `https://cdn.jsdelivr.net/npm/interactive-surface-css@latest/standalone-preset.css` — unpinned opt-in. ## Semantic recipes @@ -127,7 +127,7 @@ Native `disabled` is preferred because the browser suppresses focus and activati | `import "interactive-surface-css/interactive-surface.css";` | Complete standalone compatibility bundle | Existing direct-CSS 1.x consumers | | `import "interactive-surface-css";` | JavaScript entry that imports the complete compatibility bundle | Existing bundlers configured for CSS imports | -`standalone-preset.css` and `interactive-surface.css` are generated from the same authored modules and are behaviorally equivalent in 1.5.0. The compatibility paths remain stable; no 1.x migration is required. +`standalone-preset.css` and `interactive-surface.css` are generated from the same authored modules and are behaviorally equivalent in 1.6.0. The compatibility paths remain stable; no 1.x migration is required. The package `main` and `module` fields preserve the CommonJS and ESM entries; both load `interactive-surface.css`. The `style`, `unpkg`, and `jsdelivr` fields also resolve to that complete compatibility bundle. @@ -169,6 +169,15 @@ For selector details and responsibilities, see the [complete API reference](http The transition defaults are `translate, box-shadow, outline-color`, the established default motion duration, the standard easing curve, and zero delay. Existing `--interactive-surface-motion-*`, `--interactive-surface-ease-*`, `--motion-*`, and `--ease-*` fallbacks remain supported. All public custom properties use the `--interactive-surface-*` namespace. See the [token ownership tables and full reference](https://github.com/Foscat/Interactive-Surface-CSS/wiki/Token-Reference). +A third-party design system can theme the standalone entry point with the optional shared semantic tokens `--ui-color-surface`, `--ui-color-text`, `--ui-color-muted`, `--ui-color-primary`, `--ui-color-on-primary`, `--ui-color-border`, `--ui-radius-control`, `--ui-shadow-control`, `--ui-focus-color`, `--ui-motion-duration`, and `--ui-motion-easing`. The fallback order is package-specific `--interactive-surface-*` values, then shared semantic values, then existing legacy values and literals. When the shared tokens are absent, standalone output is unchanged. + +```js +import "third-party-theme/tokens.css"; +import "interactive-surface-css/standalone-preset.css"; +``` + +Use `state-core.css` instead when the third-party theme already paints and sizes the component directly. The full token-to-property mapping is in the [token reference](https://github.com/Foscat/Interactive-Surface-CSS/wiki/Token-Reference). + ## Accessibility responsibilities The CSS package provides visible keyboard focus, persistent-state treatment, disabled precedence, reduced-motion behavior, higher-contrast behavior, forced-colors affordances, hover gating for capable pointers, and standalone icon target sizing. The `:focus-visible` ring remains orthogonal across every focusable non-disabled interaction state. @@ -185,23 +194,26 @@ Read the [accessibility guide](https://github.com/Foscat/Interactive-Surface-CSS ## Pair with UI Style Kit CSS -When UI Style Kit owns visual paint, import its opt-in bridge and the state-only core: +When UI Style Kit owns visual paint, import its visual layer, token-and-paint bridge, and the state-only core: ```js -import "ui-style-kit-css/with-bridge.css"; +import "ui-style-kit-css/visual.css"; +import "ui-style-kit-css/interactive-surface-theme.css"; import "interactive-surface-css/state-core.css"; ``` -The bridge maps active UI Style Kit theme and mode values into the `--interactive-surface-*` contract. Interactive Surface keeps ownership of focus, hover, pressed, selected, current, loading, disabled, and motion behavior. UI Style Kit remains optional: this package declares no runtime or peer dependency on it, and the documented import order keeps its paint layer before `state-core.css`. +The token-and-paint bridge maps active UI Style Kit theme and mode values into the `--interactive-surface-*` contract. Interactive Surface keeps ownership of focus, hover, pressed, selected, current, loading, disabled, and motion behavior. UI Style Kit remains optional: this package declares no runtime or peer dependency on it, and the documented import order keeps its paint layer before `state-core.css`. + +For a generic semantic integration without specialized UI Style Kit variant and level mappings, `ui-style-kit-css/visual.css` may instead precede `interactive-surface-css/standalone-preset.css`. The shared tokens cover the portable control baseline; the canonical token-and-paint bridge above remains the preferred UI Style Kit composition. ## Use all three libraries Use the established order so paint, interaction, and structure retain clear ownership: ```js -import "ui-style-kit-css/with-bridge.css"; +import "ui-style-kit-css/visual.css"; +import "ui-style-kit-css/interactive-surface-theme.css"; import "interactive-surface-css/state-core.css"; -import "layout-style-css/bridge.css"; import "layout-style-css"; ``` diff --git a/ecosystem-release-fixture.json b/ecosystem-release-fixture.json new file mode 100644 index 0000000..ffe5858 --- /dev/null +++ b/ecosystem-release-fixture.json @@ -0,0 +1,4 @@ +{ + "repository": "Foscat/ui-style-kit-css", + "revision": "3869ca49c11d8cc085affa25115e8e80546f7a3c" +} diff --git a/index.html b/index.html index ca556a4..b6776b3 100644 --- a/index.html +++ b/index.html @@ -571,7 +571,7 @@

Edit token

Framework-agnostic CSS for reliable hover, focus, press, selected, current, loading, disabled, and motion affordances on interactive controls. Use it alone or as the interaction layer beside your existing layout and theme system. -Version 1.5.0 is a release candidate in this repository until its npm release is published. Existing 1.x imports, selectors, data hooks, ARIA hooks, and tokens remain supported. +Version 1.6.0 is a release candidate in this repository until its npm release is published. Existing 1.x imports, selectors, data hooks, ARIA hooks, and tokens remain supported. The package targets Node.js 20+ for npm installs and local validation. CI proves the minimum Node 20 lane and the preferred Node 22 lane before release. @@ -622,11 +622,11 @@

Edit token

```html ``` -The equivalent unpkg URL is `https://unpkg.com/interactive-surface-css@1.5.0/standalone-preset.css`. To follow future releases deliberately, use `https://cdn.jsdelivr.net/npm/interactive-surface-css@latest/standalone-preset.css` — unpinned opt-in. +The equivalent unpkg URL is `https://unpkg.com/interactive-surface-css@1.6.0/standalone-preset.css`. To follow future releases deliberately, use `https://cdn.jsdelivr.net/npm/interactive-surface-css@latest/standalone-preset.css` — unpinned opt-in. ## Semantic recipes @@ -693,7 +693,7 @@

Edit token

| `import "interactive-surface-css/interactive-surface.css";` | Complete standalone compatibility bundle | Existing direct-CSS 1.x consumers | | `import "interactive-surface-css";` | JavaScript entry that imports the complete compatibility bundle | Existing bundlers configured for CSS imports | -`standalone-preset.css` and `interactive-surface.css` are generated from the same authored modules and are behaviorally equivalent in 1.5.0. The compatibility paths remain stable; no 1.x migration is required. +`standalone-preset.css` and `interactive-surface.css` are generated from the same authored modules and are behaviorally equivalent in 1.6.0. The compatibility paths remain stable; no 1.x migration is required. The package `main` and `module` fields preserve the CommonJS and ESM entries; both load `interactive-surface.css`. The `style`, `unpkg`, and `jsdelivr` fields also resolve to that complete compatibility bundle. @@ -735,6 +735,15 @@

Edit token

The transition defaults are `translate, box-shadow, outline-color`, the established default motion duration, the standard easing curve, and zero delay. Existing `--interactive-surface-motion-*`, `--interactive-surface-ease-*`, `--motion-*`, and `--ease-*` fallbacks remain supported. All public custom properties use the `--interactive-surface-*` namespace. See the [token ownership tables and full reference](https://github.com/Foscat/Interactive-Surface-CSS/wiki/Token-Reference). +A third-party design system can theme the standalone entry point with the optional shared semantic tokens `--ui-color-surface`, `--ui-color-text`, `--ui-color-muted`, `--ui-color-primary`, `--ui-color-on-primary`, `--ui-color-border`, `--ui-radius-control`, `--ui-shadow-control`, `--ui-focus-color`, `--ui-motion-duration`, and `--ui-motion-easing`. The fallback order is package-specific `--interactive-surface-*` values, then shared semantic values, then existing legacy values and literals. When the shared tokens are absent, standalone output is unchanged. + +```js +import "third-party-theme/tokens.css"; +import "interactive-surface-css/standalone-preset.css"; +``` + +Use `state-core.css` instead when the third-party theme already paints and sizes the component directly. The full token-to-property mapping is in the [token reference](https://github.com/Foscat/Interactive-Surface-CSS/wiki/Token-Reference). + ## Accessibility responsibilities The CSS package provides visible keyboard focus, persistent-state treatment, disabled precedence, reduced-motion behavior, higher-contrast behavior, forced-colors affordances, hover gating for capable pointers, and standalone icon target sizing. The `:focus-visible` ring remains orthogonal across every focusable non-disabled interaction state. @@ -751,23 +760,26 @@

Edit token

## Pair with UI Style Kit CSS -When UI Style Kit owns visual paint, import its opt-in bridge and the state-only core: +When UI Style Kit owns visual paint, import its visual layer, token-and-paint bridge, and the state-only core: ```js -import "ui-style-kit-css/with-bridge.css"; +import "ui-style-kit-css/visual.css"; +import "ui-style-kit-css/interactive-surface-theme.css"; import "interactive-surface-css/state-core.css"; ``` -The bridge maps active UI Style Kit theme and mode values into the `--interactive-surface-*` contract. Interactive Surface keeps ownership of focus, hover, pressed, selected, current, loading, disabled, and motion behavior. UI Style Kit remains optional: this package declares no runtime or peer dependency on it, and the documented import order keeps its paint layer before `state-core.css`. +The token-and-paint bridge maps active UI Style Kit theme and mode values into the `--interactive-surface-*` contract. Interactive Surface keeps ownership of focus, hover, pressed, selected, current, loading, disabled, and motion behavior. UI Style Kit remains optional: this package declares no runtime or peer dependency on it, and the documented import order keeps its paint layer before `state-core.css`. + +For a generic semantic integration without specialized UI Style Kit variant and level mappings, `ui-style-kit-css/visual.css` may instead precede `interactive-surface-css/standalone-preset.css`. The shared tokens cover the portable control baseline; the canonical token-and-paint bridge above remains the preferred UI Style Kit composition. ## Use all three libraries Use the established order so paint, interaction, and structure retain clear ownership: ```js -import "ui-style-kit-css/with-bridge.css"; +import "ui-style-kit-css/visual.css"; +import "ui-style-kit-css/interactive-surface-theme.css"; import "interactive-surface-css/state-core.css"; -import "layout-style-css/bridge.css"; import "layout-style-css"; ``` diff --git a/interactive-surface.css b/interactive-surface.css index 745f52e..de10504 100644 --- a/interactive-surface.css +++ b/interactive-surface.css @@ -10,11 +10,14 @@ */ :is(.interactive-surface) { - /* Complete bundles retain the established lift and shadow fallbacks without imposing them on the core. */ + /* Shared semantic values remain optional and sit below package-specific overrides. */ --_is-preset-lift-base: var(--lift-base, 0px); --_is-preset-lift-hover: var(--lift-hover, -4px); --_is-preset-lift-active: var(--lift-active, -2px); - --_is-preset-shadow-base: var(--shadow-base, 0 0 0 rgb(0 0 0 / 0)); + --_is-preset-shadow-base: var( + --ui-shadow-control, + var(--shadow-base, 0 0 0 rgb(0 0 0 / 0)) + ); --_is-preset-shadow-hover: var( --shadow-hover, 0 10px 28px rgb(0 0 0 / 0.35), @@ -27,20 +30,29 @@ ); --_is-base-bg: var( --interactive-surface-bg, - var(--surface-bg, var(--bg-surface, rgb(248 250 252))) + var( + --ui-color-surface, + var(--surface-bg, var(--bg-surface, rgb(248 250 252))) + ) ); --_is-bg: var(--_is-base-bg); --_is-fg: var( --interactive-surface-fg, - var(--surface-fg, var(--text-primary, rgb(17 24 39))) + var(--ui-color-text, var(--surface-fg, var(--text-primary, rgb(17 24 39)))) ); --_is-base-border-color: var( --interactive-surface-border-color, - var(--surface-border, var(--border-color, rgba(15, 23, 42, 0.2))) + var( + --ui-color-border, + var(--surface-border, var(--border-color, rgba(15, 23, 42, 0.2))) + ) ); --_is-border-color: var(--_is-base-border-color); --_is-border-width: var(--interactive-surface-border-width, 1px); - --_is-radius: var(--interactive-surface-radius, 0.75rem); + --_is-radius: var( + --interactive-surface-radius, + var(--ui-radius-control, 0.75rem) + ); box-sizing: border-box; border: var(--_is-border-width) solid var(--_is-border-color); @@ -347,15 +359,18 @@ .interactive-surface[data-surface-variant="primary"] { --interactive-surface-bg: var( --interactive-surface-variant-primary-bg, - var(--variant-primary-bg, rgb(15 79 127)) + var(--ui-color-primary, var(--variant-primary-bg, rgb(15 79 127))) ); --interactive-surface-fg: var( --interactive-surface-variant-primary-fg, - var(--variant-primary-fg, rgb(244 251 255)) + var(--ui-color-on-primary, var(--variant-primary-fg, rgb(244 251 255))) ); --interactive-surface-border-color: var( --interactive-surface-variant-primary-border-color, - var(--variant-primary-border, var(--interactive-surface-bg)) + var( + --ui-color-primary, + var(--variant-primary-border, var(--interactive-surface-bg)) + ) ); --interactive-surface-darken-hover: 0.95; --interactive-surface-darken-active: 0.97; @@ -405,7 +420,7 @@ ); --interactive-surface-fg: var( --interactive-surface-variant-subtle-fg, - var(--variant-subtle-fg, rgb(26 52 75)) + var(--ui-color-muted, var(--variant-subtle-fg, rgb(26 52 75))) ); --interactive-surface-border-color: var( --interactive-surface-variant-subtle-border-color, @@ -553,7 +568,7 @@ ); --_is-motion-default: var( --interactive-surface-motion-default, - var(--motion-default, 140ms) + var(--ui-motion-duration, var(--motion-default, 140ms)) ); --_is-motion-press: var( --interactive-surface-motion-press, @@ -561,7 +576,7 @@ ); --_is-ease-standard: var( --interactive-surface-ease-standard, - var(--ease-standard, cubic-bezier(0.2, 0, 0.2, 1)) + var(--ui-motion-easing, var(--ease-standard, cubic-bezier(0.2, 0, 0.2, 1))) ); --_is-ease-press: var( --interactive-surface-ease-press, @@ -576,19 +591,25 @@ ); --_is-transition-duration: var( --interactive-surface-transition-duration, - var(--interactive-surface-motion-default, var(--motion-default, 140ms)) + var( + --interactive-surface-motion-default, + var(--ui-motion-duration, var(--motion-default, 140ms)) + ) ); --_is-transition-easing: var( --interactive-surface-transition-easing, var( --interactive-surface-ease-standard, - var(--ease-standard, cubic-bezier(0.2, 0, 0.2, 1)) + var( + --ui-motion-easing, + var(--ease-standard, cubic-bezier(0.2, 0, 0.2, 1)) + ) ) ); --_is-transition-delay: var(--interactive-surface-transition-delay, 0s); --_is-focus-ring-color: var( --interactive-surface-focus-ring-color, - var(--focus-ring, rgb(11 99 246)) + var(--ui-focus-color, var(--focus-ring, rgb(11 99 246))) ); --_is-focus-ring-width: var(--interactive-surface-focus-ring-width, 2px); --_is-focus-ring-offset: var(--interactive-surface-focus-ring-offset, 2px); diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..5a59ae0 --- /dev/null +++ b/manifest.json @@ -0,0 +1,252 @@ +{ + "schemaVersion": 1, + "schemaPolicy": { + "compatibility": "additive-within-major", + "breakingChange": "increment-schemaVersion-before-removing-or-renaming-fields" + }, + "name": "interactive-surface-css", + "version": "1.6.0", + "entrypoints": { + "stateCore": "./state-core.css", + "standalonePreset": "./standalone-preset.css", + "compatibility": "./interactive-surface.css" + }, + "selectors": { + "stable": [ + ".interactive-surface", + ".size-sm", + ".size-lg", + ".icon-only", + ".variant-primary", + ".variant-secondary", + ".variant-accent", + ".variant-subtle", + ".variant-warning", + ".variant-danger", + ".light-icon", + ".dark-icon", + ".accessibility-icon" + ], + "stateClasses": [".is-active", ".is-loading", ".is-disabled"], + "dataHooks": [ + { + "name": "data-surface-variant", + "selectors": [ + "[data-surface-variant='primary']", + "[data-surface-variant='secondary']", + "[data-surface-variant='accent']", + "[data-surface-variant='subtle']", + "[data-surface-variant='warning']", + "[data-surface-variant='danger']" + ] + }, + { + "name": "data-surface-level", + "selectors": [ + "[data-surface-level='1']", + "[data-surface-level='2']", + "[data-surface-level='3']" + ] + }, + { + "name": "data-icon-role", + "selectors": [ + "[data-icon-role='light']", + "[data-icon-role='dark']", + "[data-icon-role='accessibility']" + ] + } + ], + "deprecated": [], + "plannedRemoval": [] + }, + "states": { + "sizes": ["sm", "md", "lg"], + "variants": [ + "primary", + "secondary", + "accent", + "subtle", + "warning", + "danger" + ], + "levels": ["1", "2", "3"], + "precedence": [ + "disabled", + "busy-loading", + "active", + "persistent", + "hover", + "base" + ], + "ariaHooks": [ + "aria-pressed=true", + "aria-pressed=mixed", + "aria-current!=false", + "aria-selected=true", + "aria-busy=true", + "aria-disabled=true" + ] + }, + "tokens": { + "public": [ + "--interactive-surface-accessibility-icon-color", + "--interactive-surface-accessibility-icon-color-dark", + "--interactive-surface-bg", + "--interactive-surface-border-color", + "--interactive-surface-border-width", + "--interactive-surface-darken-active", + "--interactive-surface-darken-hover", + "--interactive-surface-dark-icon-color", + "--interactive-surface-dark-icon-color-dark", + "--interactive-surface-disabled-opacity", + "--interactive-surface-ease-press", + "--interactive-surface-ease-standard", + "--interactive-surface-fg", + "--interactive-surface-focus-ring-color", + "--interactive-surface-focus-ring-offset", + "--interactive-surface-focus-ring-width", + "--interactive-surface-level-1-active-opacity", + "--interactive-surface-level-1-bg", + "--interactive-surface-level-1-border-color", + "--interactive-surface-level-1-focus-opacity", + "--interactive-surface-level-1-hover-opacity", + "--interactive-surface-level-1-shadow", + "--interactive-surface-level-2-active-opacity", + "--interactive-surface-level-2-bg", + "--interactive-surface-level-2-border-color", + "--interactive-surface-level-2-focus-opacity", + "--interactive-surface-level-2-hover-opacity", + "--interactive-surface-level-2-shadow", + "--interactive-surface-level-3-active-opacity", + "--interactive-surface-level-3-bg", + "--interactive-surface-level-3-border-color", + "--interactive-surface-level-3-focus-opacity", + "--interactive-surface-level-3-hover-opacity", + "--interactive-surface-level-3-shadow", + "--interactive-surface-level-bg", + "--interactive-surface-level-border-color", + "--interactive-surface-level-shadow", + "--interactive-surface-lift-active", + "--interactive-surface-lift-base", + "--interactive-surface-lift-hover", + "--interactive-surface-light-icon-color", + "--interactive-surface-light-icon-color-dark", + "--interactive-surface-motion-default", + "--interactive-surface-motion-press", + "--interactive-surface-radius", + "--interactive-surface-shadow-active", + "--interactive-surface-shadow-base", + "--interactive-surface-shadow-hover", + "--interactive-surface-state-layer-active-opacity", + "--interactive-surface-state-layer-color", + "--interactive-surface-state-layer-focus-opacity", + "--interactive-surface-state-layer-hover-opacity", + "--interactive-surface-state-layer-opacity", + "--interactive-surface-state-layer-opacity-active", + "--interactive-surface-state-layer-opacity-focus", + "--interactive-surface-state-layer-opacity-hover", + "--interactive-surface-tap-highlight-color", + "--interactive-surface-transition-property", + "--interactive-surface-transition-duration", + "--interactive-surface-transition-easing", + "--interactive-surface-transition-delay", + "--interactive-surface-variant-accent-bg", + "--interactive-surface-variant-accent-border-color", + "--interactive-surface-variant-accent-fg", + "--interactive-surface-variant-danger-bg", + "--interactive-surface-variant-danger-border-color", + "--interactive-surface-variant-danger-fg", + "--interactive-surface-variant-primary-bg", + "--interactive-surface-variant-primary-border-color", + "--interactive-surface-variant-primary-fg", + "--interactive-surface-variant-secondary-bg", + "--interactive-surface-variant-secondary-border-color", + "--interactive-surface-variant-secondary-fg", + "--interactive-surface-variant-subtle-bg", + "--interactive-surface-variant-subtle-border-color", + "--interactive-surface-variant-subtle-fg", + "--interactive-surface-variant-warning-bg", + "--interactive-surface-variant-warning-border-color", + "--interactive-surface-variant-warning-fg" + ], + "fallbacks": [ + "--interactive-surface-motion-*", + "--interactive-surface-ease-*", + "--motion-*", + "--ease-*" + ], + "sharedSemanticFallbacks": [ + { + "name": "--ui-color-surface", + "type": "", + "precedence": "after-package-specific-before-legacy", + "standaloneExpectation": "optional-with-existing-fallbacks" + }, + { + "name": "--ui-color-text", + "type": "", + "precedence": "after-package-specific-before-legacy", + "standaloneExpectation": "optional-with-existing-fallbacks" + }, + { + "name": "--ui-color-muted", + "type": "", + "precedence": "after-package-specific-before-legacy", + "standaloneExpectation": "optional-with-existing-fallbacks" + }, + { + "name": "--ui-color-primary", + "type": "", + "precedence": "after-package-specific-before-legacy", + "standaloneExpectation": "optional-with-existing-fallbacks" + }, + { + "name": "--ui-color-on-primary", + "type": "", + "precedence": "after-package-specific-before-legacy", + "standaloneExpectation": "optional-with-existing-fallbacks" + }, + { + "name": "--ui-color-border", + "type": "", + "precedence": "after-package-specific-before-legacy", + "standaloneExpectation": "optional-with-existing-fallbacks" + }, + { + "name": "--ui-radius-control", + "type": "", + "precedence": "after-package-specific-before-legacy", + "standaloneExpectation": "optional-with-existing-fallbacks" + }, + { + "name": "--ui-shadow-control", + "type": "", + "precedence": "after-package-specific-before-legacy", + "standaloneExpectation": "optional-with-existing-fallbacks" + }, + { + "name": "--ui-focus-color", + "type": "", + "precedence": "after-package-specific-before-legacy", + "standaloneExpectation": "optional-with-existing-fallbacks" + }, + { + "name": "--ui-motion-duration", + "type": "