Skip to content

Changelog

Every release of the Airframe fixed group. Core, tokens, theme, MCP, build, the ESLint plugin, and IntelliSense for Airframe share one version. Updates under each version are grouped by package. Follow along via RSS.

Latest release

v0.8.2 Unknown classes point at the real pattern

September 28, 2026

An invented af-* class is a failed lookup. Airframe MCP now names the catalog pattern that already covers it. Use that pattern, or say why it does not fit.

v0.8.2

PatchCurrent

core · tokens · theme · mcp · build · eslint-plugin · figma-plugin · intellisense

An invented af-* class is a failed lookup. Airframe MCP now names the catalog pattern that already covers it. Use that pattern, or say why it does not fit.

TypeDescription
docsAgents must use a closeMatches pattern or name why it does not fit.
TypeDescription
featvalidate_markup returns closeMatches for an unknown af-* class — the pattern id, base class, and why it matches.

v0.8.0

Minor

core · tokens · theme · mcp · build · eslint-plugin · figma-plugin · intellisense

0.8.0 says what 1.0 will freeze: class names, tokens, CSS exports, catalog ids, CLI flags, and Airframe MCP tool names. That promise is not in force yet. Alert, callout, skeleton, and spinner examples now carry the live-region roles agents should copy.

TypeDescription
docsCompatibility page states the intended 1.0 freeze. Masonry stays experimental.
docsAlert, callout, skeleton, and spinner examples use role="status", role="alert", and aria-busy.
TypeDescription
docsCallout, skeleton, and spinner descriptions name that same ARIA contract.

v0.7.1

Patch

core · tokens · theme · mcp · build · eslint-plugin · figma-plugin · intellisense

Cards no longer clip overflow. Choice groups use stack or inline for spacing. The html reset does not reserve scrollbar gutter.

TypeDescription
fixCards no longer set overflow: hidden, so popovers and focus rings can escape.
fixChoice labels no longer add sibling margins; group them with af-stack or af-inline.
fixDrop scrollbar-gutter: stable from the html reset.

v0.7.0

Minor

core · tokens · theme · mcp · build · eslint-plugin · figma-plugin · intellisense

Keep your product token namespace and still theme Airframe, Figma, and the CLI from one config. Coding agents get clearer pattern routing and stricter form markup checks.

TypeDescription
featcatalog blocks for command palette, filter bar, API key row, and logs panel
featform submit and field-error contracts in catalog rules
featinvert buttons on primary surfaces (af-bg-primary / af-is-on-primary)
TypeDescription
featBring Your Own Tokens — export product-owned CSS prefixes to DTCG and Figma without renaming to --af-*
TypeDescription
featvalidate form submit buttons and field-error markup
featrecommend patterns with structured use cases instead of free-text useWhen
TypeDescription
feataf theme and config support for Bring Your Own Tokens
featagent init follows the catalog’s structured use-case routing

v0.6.0

Minor

core · tokens · theme · mcp · build · eslint-plugin · figma-plugin · intellisense

Push brand tokens from CSS into native Figma Variables. Export a payload, Apply or Check in the Airframe Figma plugin. Airframe MCP can also find Blocks and Blueprints.

TypeDescription
featCatalog lists Blocks and Blueprints with docsUrl for agents and Airframe MCP.
fixScreen-reader-only utilities pin to the start of the containing block.
fixTighter gap on af-navbar-actions.
TypeDescription
featemitFigmaVariablesModel builds a native Variables payload from the resolved theme.
featDTCG export keeps simple var(--af-*) aliases as references.
TypeDescription
featsearch_patterns / get_pattern return Blocks and Blueprints (open docsUrl, then adapt).
TypeDescription
feataf figma export, sync, and check for Variables payloads.
featShips the Airframe Figma plugin under @airframeui/build/figma-plugin for team install.
TypeDescription
featDevelopment plugin — Apply figma.variables.json into Variables, Check for drift, with integrity score and issue groups.

v0.5.0

Minor

core · tokens · theme · mcp · build · eslint-plugin · intellisense

validate_markup checks catalog HTML rules. Opt-in af-body, af-prose line length, and Angular ESLint templates.

  • Sticky document footer is opt-in — put af-body on <body> (no longer global in reset).
  • af-measure → af-prose (also -narrow / -wide).
TypeDescription
featCatalog htmlSemantics rules.
featOpt-in af-body; list-group actions on nested a/button; label.af-action-row.
TypeDescription
featvalidate_markup enforces catalog HTML semantics.
TypeDescription
featAgent bootstrap mentions catalog HTML semantics.
TypeDescription
featAngular templates via flat/angular.
TypeDescription
featCompletions for af-body and af-prose*.

v0.4.2

Patch

core · tokens · theme · mcp · build · eslint-plugin · intellisense

Patterns round through --af-radius, --af-btn-radius, --af-input-radius, or --af-card-radius.

TypeDescription
featPatterns use those four families.
TypeDescription
feat--af-radius is the product default; --af-btn-radius, --af-input-radius, and --af-card-radius inherit it.
TypeDescription
featCompletions describe the radius families.

v0.4.1

Patch

core · tokens · theme · mcp · build · eslint-plugin · intellisense

Overlay locks scroll. Catalog ids, breaking map, and agent init work without MCP.

TypeDescription
featOverlay scroll lock, navbar aria-current, skip under sticky chrome, catalog docsUrl, @airframeui/core/breaking.
TypeDescription
docsPinned npx snippet; catalog → examples → CSS when MCP is off.
TypeDescription
fixaf init --agents writes AIRFRAME.md; will not replace a product file.

v0.4.0

Minor

core · tokens · theme · mcp · build · eslint-plugin · intellisense

Layouts are now Structure — primitives and shells. Skip-to-content. Overlay mobile nav.

  • layouts.css → structure.css; shells in shells.css. Catalog and Airframe MCP: layoutRecipes → structure (primitive | shell).
TypeDescription
feataf-skip, overlay af-nav-collapse, structure.css / shells.css.
docsStructure → Patterns → Blocks → Blueprints.
TypeDescription
feat--af-navbar-height.
fix--af-hard-toward follows --af-color-text.
TypeDescription
featStructure kinds; skip-link → skip.
TypeDescription
fixAgent docs list primitives and shells.
TypeDescription
featCompletions use primitive / shell.

v0.3.2

Patch

core · tokens · theme · mcp · build · eslint-plugin · intellisense

Footer, navbar collapse, and a collapsed app rail. Agent rules spell out design rationale and composition don’ts.

TypeDescription
featFooter, sticky/compact navbar, CSS-only nav collapse, and a collapsed app rail.
docsDesign rationale, composition don’ts, and Layouts → Patterns → Blocks → Blueprints.
TypeDescription
docsAgent instructions include construction hierarchy and composition don’ts.
TypeDescription
docsGenerated agent docs include design rationale and composition don’ts.

v0.3.1

Patch
Section titled “ESLint recommended matches JSX and TypeScript”

core · tokens · theme · mcp · build · eslint-plugin · intellisense

flat/recommended now sets files for .js, .jsx, .ts, and .tsx. ESLint only lints .js by default, so JSX and TypeScript never got Airframe rules.

TypeDescription
fixflat/recommended includes files for .js, .jsx, .cjs, .mjs, .ts, and .tsx.
docsREADME notes that ESLint needs files for non-.js extensions.

v0.3.0

Minor

Figma export, rounded buttons, and baseline tokens

Section titled “Figma export, rounded buttons, and baseline tokens”

core · tokens · theme · mcp · build · eslint-plugin · intellisense

af theme export writes DTCG for Figma — one collection per palette, four appearance modes. Buttons follow --af-radius instead of a pill. The radius scale is a 4px grid. Docs cover the pipeline, Theme Studio, and live blueprints.

Brand in CSS. Point theme.files at those sheets. npx af theme export writes tokens/<palette>/{light,dark,hc-*}.tokens.json. Drop each folder onto one Figma collection. Extra --af-* names export as extension tokens.

Filled af-btn is rounded (--af-radius), not a pill. Min-height follows --af-hit-size. Set --af-btn-radius to var(--af-pill-radius) for capsules.

--af-radius is the product default (8px). Scale is 4 / 8 / 12 / 16. Cards and controls inherit it. .af-force-light / .af-force-dark lock a subtree to the catalog canvas.

Homepage, Airframe → Figma, Theme Studio, the theme package page, and live blueprints. Installation and theming are shorter.

TypeDescription
featCSS-only dropdowns — native popover, CSS anchor positioning, af-is-end / af-is-start.
featCheckbox, radio, and range restyled to match inputs (appearance: none).
featInput group chrome on the group; inset addons and .af-input-group-action.
featButton-group joins for filled and outline segments.
feat.af-radius utility; .af-radius-full uses --af-pill-radius.
featViewport fill, scrollbar-gutter: stable, footer at the bottom.
fix:root[data-theme="dark"] sets color-scheme: dark.
TypeDescription
feat--af-radius (8px) and --af-pill-radius; scale 4 / 8 / 12 / 16.
featButtons, cards, and controls inherit --af-radius; --af-btn-radius is no longer a pill.
feat--af-control-min-height defaults to --af-hit-size.
featRange tokens --af-range-track-height and --af-range-thumb-size.
feat.af-force-light / .af-force-dark lock a subtree to the catalog canvas.
TypeDescription
featemitDtcgExport — one DTCG file per palette and appearance for Figma.
featExtra --af-* names export as extension tokens; brands come from [data-brand].
docsREADME leads with export to Figma.
TypeDescription
feataf theme export writes tokens/<palette>/*.tokens.json (default .airframeui).
feattheme.files and theme.outputDir in airframe.config.js.
featResponsive generator ships here. Use npx af build, not a core export.
TypeDescription
docsREADME rewritten — setup, rules table, and notes for coding agents.

v0.2.0

Minor

Optional @airframeui/build and ESLint plugin on npm, button borders, file dropzones

Section titled “Optional @airframeui/build and ESLint plugin on npm, button borders, file dropzones”

core · tokens · theme · mcp · build · eslint-plugin · intellisense

Most apps still only install core. @airframeui/build is now on npm for custom breakpoint pixels and @af directives. @airframeui/eslint-plugin is on npm too, at the same version as core. Filled buttons can take optional borders. File inputs get a CSS-only dropzone.

Dev dependency, not the CSS runtime. The PostCSS plugin inlines @import "@airframeui/core/core.css" and rewrites breakpoints in memory. Do not import generated responsive.css on top of core.

@airframeui/eslint-plugin publishes with the same version as core. Catch leftover Tailwind/Bootstrap, unknown af-* classes, and redundant defaults.

Filled af-btn borders stay transparent. Set --af-btn-border to a color, or to var(--af-btn-border-auto), to paint them.

TypeDescription
featOptional filled af-btn borders via --af-btn-border / --af-btn-border-auto (off by default).
feata.af-card, a.af-pill, a.af-link-button, and a.af-btn opt out of underline through --af-link-decoration.
featNative file input as a CSS-only dropzone (af-is-dropzone); hover and drag-over share the same highlight.
featExport buildResponsiveCss as @airframeui/core/generate-responsive (the generator @airframeui/build calls).
fixDefault full-width af-col-span no longer beats an explicit span, including @md variants (:where()).
fixBody p spacing uses 0.9lh instead of a fixed space token.
TypeDescription
feat--af-link-decoration and --af-link-hover-decoration (underline by default; patterns that are <a> override).
featFilled-button border tokens — --af-btn-border, --af-btn-border-auto, plus per-variant / hover / focus. Ghost stays independent.
TypeDescription
featemitConfigTokenCss — config breakpoints as an @layer af.tokens stylesheet (same mapping as declsFromConfig).
TypeDescription
featFirst npm release. PostCSS plugin inlines @import, compiles @af bp() / @af-apply, and replaces inlined --af-bp-* and @layer af.responsive.
feataf CLI — build, doctor, init, init --agents, and theme (facade over @airframeui/theme).
feataf doctor checks Airframe package versions and agent-file freshness against installed core.
feataf init --agents writes AGENTS.md from @airframeui/core/catalog and can add a package.json "af" script.
TypeDescription
featFirst npm release. Same version as core.
featRecommended rules — leftover Tailwind/Bootstrap, unknown af-*, layout recipes, redundant defaults/width, field-error ARIA. Autofix where the mapping is deterministic.
featBuild-time catalog snapshot from classes.json and catalog.json. Installed @airframeui/core / @airframeui/tokens win when present so lint matches the CSS you ship.

v0.1.4

Patch

ESLint plugin joins the fixed version group

Section titled “ESLint plugin joins the fixed version group”

eslint-plugin

@airframeui/eslint-plugin now versions with core, tokens, theme, MCP, build, and IntelliSense for Airframe. Catalog snapshot is generated from classes.json and catalog.json at build time.

The ESLint plugin is still private (not on npm yet). It tracks the same version as the published set so rules and catalogs cannot drift from the CSS you install.

TypeDescription
featJoin the fixed version group; catalog snapshot from classes.json and catalog.json.

v0.1.0

Minor

Product-app primitives, MCP, CDN bundle, token catalog

Section titled “Product-app primitives, MCP, CDN bundle, token catalog”

core · tokens · theme · mcp

App shell and related product primitives. Color scheme (data-theme) is separate from named palettes (data-brand). The token catalog ships with descriptions and default colours per mode. Static HTML can load one minified file. Coding agents get an MCP server on the same version as core.

App shell, settings nav, action rows, extra button styles, vertical divider, and a full-page loader. Overlay drawers get --af-drawer-width (default 20rem), distinct from --af-sidebar-width.

data-theme is light/dark. data-brand is a named palette. Light, dark, and high-contrast resolve from stored --light / --dark / --hc-* suffixes so multiple brands can coexist in CSS variables.

catalog.json lists every --af-* token with descriptions and default colours per mode. The Tokens full list docs page is generated from it.

dist/airframe.min.css is the jsDelivr / unpkg / static HTML entry. core.css stays the modular @import graph for bundlers. Do not link core.css from a CDN.

@airframeui/mcp ships with core and tokens: catalog-backed search, examples, markup validation, and Airframe rules as MCP resources.

Theme lint and MCP validate_markup both read @airframeui/tokens/catalog.json for known --af-* names.

TypeDescription
featApp shell, settings nav, action rows, extra button styles, vertical divider, and full-page loader.
feat--af-drawer-width for overlay drawer panels (default 20rem).
featSeparate color scheme (data-theme) from named palettes (data-brand).
featSelf-contained dist/airframe.min.css for jsDelivr, unpkg, and static HTML.
TypeDescription
featToken catalog (catalog.json) with descriptions and default colours per mode.
TypeDescription
featTheme lint reads @airframeui/tokens/catalog.json instead of a copied allowlist.
TypeDescription
featCatalog-backed search, examples, markup validation, and Airframe rules as MCP resources.
featPattern catalog related / useWhen / avoidWhen hints.

v0.0.1

Patch

core · tokens

Airframe goes public. A CSS-first structural UI system: layout primitives, a full token layer, accessible patterns, and a readable af-* DOM. No runtime JavaScript. Any framework.

@import "@airframeui/core/core.css" — tokens, reset, layouts (af-stack, af-inline, af-grid), patterns, and utilities. Brand with --af-* at runtime.

@airframeui/tokens is the CSS / JSON / TypeScript view. Core depends on it. Light, dark, and high-contrast ship built-in.

  • af-step-connector — steps use CSS counters on a semantic <ol>.
TypeDescription
featLayouts, patterns, utilities, and AI catalogs.
featSteps — semantic <ol>, CSS counters.
TypeDescription
featCSS custom properties, JSON, and TypeScript.

Package CHANGELOG.md files still ship on npm. This page is the system view — one version, updates listed per package.