What was added, changed and fixed in each release, per package. The packages are versioned independently, so a release is listed by its date with the version each package received. This page is generated from the CHANGELOG.md file of each package.
Next release
Changes that are merged and will be published with the next version of each package.
@toned/core
Added
Descriptor systems.defineSystem({ id, tokens, conditions, themes }) declares a namespaced system; the returned object is what builds and renderers take. (defineSystem)
Typed query builder.stylesheet(q => …) and .variants(($, q) => …) receive q.state, q.media, q.container, q.part(…).state, q.part(…).has, q.platform, q.all, q.any and q.not. Each returns a literal key that is checked against the system. (Conditions and selectors)
Readable key aliases.'@media md', '@container field wide' and '@platform web' are accepted beside '@md', '@field/wide' and '@platform.web'; $kind and $style name what $$type and style did. (Conditions and selectors)
Checked variants. Annotating the callback parameter with Variants<Mods> infers the axes and checks every returned rule, including nested ones. A second argument, { defaults }, makes an axis optional. (variants)
Container queries on web and native, from containers declared in the system or a fixed dp() width at the use site.
Declared states and cross-part states. A system's states become ':open'-style keys; 'Root:hover' styles other parts from one part's state; ':focus-visible', ':focus-within', compound keys such as ':open:hover', and relationship queries with q.part(…).has(…). (Interactive styles)
Platform blocks.'@platform web' and '@platform native' hold platform-only declarations and widen $style to that platform's types.
Themes in the build. Themes declared on a system are written by buildStyles and the Vite plugin as custom properties: the first on :root, each under [data-theme='<name>']. generateThemes returns that CSS alone, and the themes option picks the default or turns it off. (Theming)
Typed theme schemas with defineTokenFor<Theme>(), and definePalette / generatePalette.
Pure renderers in @toned/core/server: createWebRenderer, createNativeRenderer, createInlineRenderer for email and static HTML, and createPdfRenderer. They resolve part props without hooks, so they run in Server Components. (SSR and Server Components, Web, email and PDF)
Build output with a manifest.buildStyles in @toned/core/build returns the CSS and a manifest that a renderer validates; the Vite plugin serves them as virtual:toned.css and virtual:toned.manifest. assertBuildArtifact checks the pair before publication.
Authoritative overrides.overrideSheet(sheet, rules, variants?) adds a higher-priority layer, and null removes an inherited declaration. sheet.extend(rules) derives new defaults that the sheet's variants still override. (Extending and overriding)
Typed web grid.defineGrid, $grid and $area, with responsive plans from .variant(…). (Grid example)
Web-only selectors.$webRules: webRules({ … }) for pseudo-elements and DOM selectors, with explicit media groups.
t() blocks. The inline helper accepts ':hover' and breakpoint blocks.
Colour alpha.alpha('primary', 0.2) for tokens that declare an alpha channel.
Output backends in @toned/core/backends, including a built Tailwind profile. (Backend integrations)
externalCssVariables keeps named custom properties of the host application out of a system's namespace.
namespaceCss is exported from @toned/core/system, to give a separately generated palette the system's prefix.
defineAnimations for named keyframes compiled with the system.
Changed
A .variants() callback without explicit type arguments is fully checked: keys that were silently accepted before, such as a misspelled part or token, are now errors.
The standalone bp, cq, and, or and not condition builders moved to @toned/core/compat. New declarations use the system's q.
The Vite plugin no longer adds a style element to the HTML; import virtual:toned.css. Injecting styles at runtime is a development helper in @toned/core/dev/inject.
Type checking a stylesheet costs less: parts are validated once against a shape shared by every sheet of a system.
Token names in the build manifest are compared in name order, so a bundler that reorders module exports does not invalidate an unchanged system.
The types are checked against TypeScript 5.9, 6 and 7; TypeScript 5.9 is the minimum supported version.
Fixed
Two parts of one family can be merged onto one element; each keeps its own styles and removing one leaves the other.
The build refuses a theme value that a generated class cannot apply, such as 3px 0 0 0 in a field read by a four-sided property.
Scoped CSS keeps the caller's scope for every selector, including :root and [data-theme] rules.
t() skips falsy arguments and unwraps nested t() results.
The alpha modifier multiplies a colour's own alpha instead of replacing it, and generated alpha colours work without relative colour syntax.
Custom properties pass through the style pipeline unchanged.
React Native array styles are flattened before merging.
An inherited property falls back to inherit, not initial, when a condition does not apply.
@toned/react
Added
Element families.createElements(sheet) returns stable part components and a provider for the sheet's variants, created once at module scope. (useStyles and element families)
TonedProvider. Takes an explicit renderer and host; an array of renderers serves several systems in one tree. (React reference)
Hosts.@toned/react/hosts/web and @toned/react/hosts/native. (React Native hosts)
Scoped overrides.StyleOverrides with overrideStyles(sheet, rules).variants(…) customises a child's stylesheet from an ancestor. (Extending and overriding)
Typed as. A part's as prop checks the chosen element's or component's props and ref.
withProps<Host>() merges props, styles, classes, handlers and refs into a part's prop bag.
useBind and bind return bound part components from a stylesheet.
useMotion in @toned/react/motion and adaptive layout bindings in @toned/react/adaptive.
Variant defaults declared on a sheet make the matching props optional.
Changed
The package emits JavaScript that Node can load directly.
useStyles commits its styles in a layout effect; a suspended render cannot publish variants, theme values or refs.
On the web, a theme is switched with the data-theme attribute. The provider's theme prop is for explicit token values, such as a native renderer's.
Fixed
Two parts of one family can share an element: {...s.Root.with(disabled && s.Disabled)}.
as="div" stays a literal type when JSX.IntrinsicElements has a pattern key.
A stable variants object no longer re-applies unchanged state.
@toned/systems
Added
marginInlineStart and marginInlineEnd in the base system.
fit-content and max-content size keywords, and step 32 on the spacing scale.
flexBasis.
SpaceUnit is exported from @toned/systems/base.
Fixed
Inset tokens (top, right, bottom, left) pass CSS lengths and expressions such as 50% and calc(100% - 2rem) through instead of reading them as spacing aliases.
@toned/themes
Added
@toned/themes/shadcn/config.css is an exported subpath, so a bundler can import the theme's stylesheet.
@toned/compiler 0.1.0
First release.
Added
Source index. A bounded index of systems, stylesheets, parts and token uses across a workspace, with version-checked edit proposals. (Source intelligence)
Language server.toned-lsp provides diagnostics, completions, hover, definitions, references and rename. (Compiler and language server)
@toned/compiler/language-service. The same service as a library, with no Node dependencies, for editors that run in a browser.
DTCG token exchange. Import, resolve and export the supported subset of the Design Tokens format. (DTCG token exchange)
Design contracts. Scenarios evaluated against measured geometry. (Design contracts)
@toned/eslint-plugin 0.1.0
First release.
Added
Five rules for ESLint and Oxlint: toned/react/no-create-elements-in-render, toned/react/no-partial-host-bag, toned/prefer-canonical-declarations, toned/no-global-config and the opt-in toned/prefer-semantic-tokens. (ESLint and Oxlint)
2 October 2026
@toned/core 1.0.0
Added
consume packages from source, namespace internal config (b84ca59)
core+react: bridges — styling CSS alone cannot reach from the style attribute (df3beee)
core+react: media raw-style chains + useStyles type contracts (9696814)
toned-react: back multi-instance refs with a Set and prune lazily (cddcdf3)
toned-react: react-native no longer returns a style(state) callback for
interactive elements; it now spreads interaction event handlers (onPressIn/
onPressOut, onHoverIn/onHoverOut, onFocus/onBlur). Consumers relying on the
style-function contract must spread the returned props onto a Pressable/host
component instead.
Fixed
toned-react: reconcile :active on release without leaking listeners (0d9273c)
toned-react: spread resting style and reconcile per-element interaction on commit (fb9f782)
types: preserve element key types through useStyles (bfb34bc)
@toned/systems 0.2.0
Added
core: add CSS variable media mode and fix breakpoint types (d498a31)