Skip to content

Project

Changelog

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.
  • Adaptive layouts in @toned/core/adaptive and motion in @toned/core/motion. (Adaptive layouts, Motion and presence)
  • 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.
  • Design inspector and its development source bridge. (Design inspector, Development source bridge)
  • 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)
  • core+react: platform keys, host-tunable style type, $$type-constrained tokens (921ad7a)
  • core+systems+react: dimensional enumeration, animation timing, css-only group hover, tighter element props (92e06a9)
  • core: compound state+pseudo keys — ':open:hover' with AND semantics in css chain mode (a461b48)
  • core: condition breakpoints — a parenthesised value is a raw media condition (b66697a)
  • core: cross-element state channel — 'source:
    HTML
    <state>
    ' → descendant (a07f0c7)
  • core: declared states — static attribute/pseudo selectors, the breakpoint analogue (34eadba)
  • core: defineAnimations — named, system-compiled motion (a72f7d7)
  • core: definePalette + generatePalette — first-class themes (0dedc9a)
  • core: elementDescriptors() — runtime element list with $$type for bindings (953936b)
  • core: generate() takes a scope selector so two systems share one page (47178e6)
  • core: inherit — the third $types state, a text token legal on a View (c1a159a)
  • core: instance sharing + loud failure modes (3aea5ec)
  • core: per-platform token resolve — resolve(value, tokens, { platform }) (0679217)
  • core: responsive atomic classes — breakpoint overrides for opted tokens compile to media-scoped classes (a15984e)
  • core: sibling-source and focus-within channels (5dca0a2)
  • core: string breakpoint values (rem scales), and applyState preserves foreign classes (4e81d09)
  • core: the alpha modifier, hover gating, focus-visible, alpha-aware override chains (98607f2)
  • core: the build writes a system's declared themes (ef6f4ba)
  • core: token pseudoRules — the one sanctioned pseudo-element channel (303738a)
  • cross-platform container queries — @container var toggles on web, measured providers at runtime (12e57cb)
  • overrides: .variants() — an override says what a declaration says (fdbe5ad)
  • overrides: two tokens writing one property no longer tie (61640dd)
  • react: resolveElement config seam — $$type → host element (web default; native deferred) (67b3b06)
  • react: scoped style overrides — the pluggable ambient-scope channel (dd8c0ff)
  • react: typed 'as' on bound elements; pressable joins the $$type vocabulary (1242e65)
  • static-CSS affordances for utility-framework hosts (4a07f48)
  • the ':rtl' runtime seam — getDirection on the config answers every
    HTML
    <element>
    :rtl mod (65bfca9)
  • the condition algebra — ad-hoc container widths, and/or/not, one grammar behind every @-key (6cc15d7)

Changed

  • types: the brand records element KINDS, not element rules (a3de732)

Fixed

  • core: breakpoint chains kebab-case the key, matching generate's toggles (1f5b5c7)
  • core: bridge fallbacks preserve inheritance — inherited properties fall back to inherit, not initial (9d72e8c)
  • core: chain values reach class fidelity; resting fallback crosses tokens (8d01815)
  • core: descendant bridges compile class-scoped; with() carries passed props (e4f7448)
  • core: extend() beats variant values for the properties it names (b856f58)
  • core: keep the caller's scope intact for every scoped selector (a02be1f)
  • core: media-only values chain OPEN, and t() carries nested pseudo/breakpoint blocks (543f600)
  • core: multiply the source alpha channel instead of replacing it (f3eee32)
  • core: refuse theme values a class cannot apply; export namespaceCss (1f4afe6)
  • core: the sibling and focus-within channels reach the painted property (fe2ccb7)
  • core: two parts of one family can share an element (e5ac3a9)
  • review: ResolveContext.platform defaults to web; resolveElement resolves lazily (4026832)
  • type-safety restored, container numbers ride the base scale, initMedia string queries (e191e4b)
  • types: an override may say what the stylesheet says (e2b02be)
  • types: infer query-builder callbacks on TypeScript 5.9 and 6 (1c4bd90)
  • types: keep variants inferable after making them chainable (3abb5ac)
  • types: make a stylesheet's generics recoverable, restore with() (ae5e532)
  • types: make the type surface describe what the runtime actually does (c51d84c)

@toned/react 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)
  • core+react: platform keys, host-tunable style type, $$type-constrained tokens (921ad7a)
  • core+systems+react: dimensional enumeration, animation timing, css-only group hover, tighter element props (92e06a9)
  • cross-platform container queries — @container var toggles on web, measured providers at runtime (12e57cb)
  • overrides: .variants() — an override says what a declaration says (fdbe5ad)
  • overrides: two tokens writing one property no longer tie (61640dd)
  • react: bind() — mod-less stylesheet→components over resolveElement (14d6e55)
  • react: native resolveElement seam — host-provided, throws until installed (48322ce)
  • react: native string-as fallback infers the primitive from the tag (99582f9)
  • react: OverridableStylesheet — an emittable export type for override targets (e112c46)
  • react: resolveElement config seam — $$type → host element (web default; native deferred) (67b3b06)
  • react: scoped style overrides — the pluggable ambient-scope channel (dd8c0ff)
  • react: stylesheet overrides — identity-keyed, provider-scoped, integration-agnostic (9320187)
  • react: typed 'as' on bound elements; pressable joins the $$type vocabulary (1242e65)
  • react: useBind — hook form, mods in the call, stable element components (ed78272)
  • react: view is the default element, and a string as is a web-only refinement (22b6b02)
  • the condition algebra — ad-hoc container widths, and/or/not, one grammar behind every @-key (6cc15d7)

Changed

  • types: the brand records element KINDS, not element rules (a3de732)

Fixed

  • core: descendant bridges compile class-scoped; with() carries passed props (e4f7448)
  • core: refuse theme values a class cannot apply; export namespaceCss (1f4afe6)
  • core: two parts of one family can share an element (e5ac3a9)
  • react: 'with' stays non-enumerable on bound components (464955c)
  • react: record the applied state so a stable mods object skips applyState (e984a83)
  • remove the phantom with(), add flexBasis, stop methods posing as elements (5891af1)
  • review: ResolveContext.platform defaults to web; resolveElement resolves lazily (4026832)
  • type-safety restored, container numbers ride the base scale, initMedia string queries (e191e4b)
  • types: an override may say what the stylesheet says (e2b02be)
  • types: infer query-builder callbacks on TypeScript 5.9 and 6 (1c4bd90)
  • types: keep variants inferable after making them chainable (3abb5ac)
  • types: make a stylesheet's generics recoverable, restore with() (ae5e532)

@toned/systems 1.0.0

Added

  • consume packages from source, namespace internal config (b84ca59)
  • core+systems+react: dimensional enumeration, animation timing, css-only group hover, tighter element props (92e06a9)
  • core: string breakpoint values (rem scales), and applyState preserves foreign classes (4e81d09)
  • static-CSS affordances for utility-framework hosts (4a07f48)
  • systems: 'fit-content' as an enumerated size value (4f65fe4)
  • systems: 'max-content' joins the enumerated size keywords (navigation-menu's max-w-max/w-max) (de70545)
  • systems: 32 joins the enumerated spacing scale (basis-32 parity) (8c96669)
  • systems: export SpaceUnit from the base entry (ae54b02)
  • systems: the logical inline margins (fba1d78)

Fixed

  • remove the phantom with(), add flexBasis, stop methods posing as elements (5891af1)
  • systems: inset tokens pass CSS lengths and expressions through (cc25282)

@toned/themes 1.0.0

Added

  • consume packages from source, namespace internal config (b84ca59)

@toned/compiler 1.0.0

Added

  • consume packages from source, namespace internal config (b84ca59)
  • restructure the monorepo (7571b9c)

@toned/eslint-plugin 1.0.0

Note: Version bump only for package @toned/eslint-plugin

30 September 2026

@toned/core 0.6.0

Added

  • publish (cc32fd9)
  • toned-core: support breakpoint and pseudo blocks in t() (08994e8)

Fixed

  • toned-core: correct the CSS that generate() emits (555c2cb)
  • toned-core: flatten React Native array styles when merging (281e2c0)
  • toned-core: handle custom properties correctly in the style pipeline (2cbafd3)
  • toned-core: restore redundant-write skip lost in merge (119ee6d)
  • toned-core: skip falsy t() arguments and unwrap nested t() blocks (1fd88e0)

@toned/core 0.5.0

Added

  • toned-core: support breakpoint and pseudo blocks in t() (08994e8)

Fixed

  • toned-core: correct the CSS that generate() emits (555c2cb)
  • toned-core: flatten React Native array styles when merging (281e2c0)
  • toned-core: handle custom properties correctly in the style pipeline (2cbafd3)
  • toned-core: restore redundant-write skip lost in merge (119ee6d)
  • toned-core: skip falsy t() arguments and unwrap nested t() blocks (1fd88e0)

@toned/react 0.4.0

Added

0.3.1 (2026-09-30)

Note: Version bump only for package @toned/react

@toned/systems 0.3.0

Added

0.2.1 (2026-09-30)

Note: Version bump only for package @toned/systems

5 August 2026

@toned/core 0.4.0

Added

  • add initial support for static pseudos (6e08762)
  • core: add CSS variable media mode and fix breakpoint types (d498a31)
  • core: add CSS-only pseudo-state support via pseudoMode: 'css' (985cf58)
  • core: add root-level media queries and fix docs hydration (034ba14)
  • core: add Vite plugin for static CSS generation (2174285)
  • core: defineSystem types (c3484cc)
  • core: inject media (e1df62f)
  • core: minor update (534208f)
  • core: minor updates (b9be0aa)
  • core: use breakpoints config for runtime media (e7634c2)
  • infer breakpoints from config, improve breakpoints types (997e927)
  • migrate stylesheet API to new flat interface (TASK_2) (e8d98ea)
  • minor updates (7f420b3)
  • minor updates (3e8a947)
  • overhaul (cd39c6a)
  • restructure the monorepo (7571b9c)
  • StyleMatcher: updates (d499a40)
  • stylesheet: add callback-based variants API with type-safe selectors (10acd34)
  • stylesheet: update types - wip (52cdb57)
  • task 5 (8bc25ba)
  • toned-core: 0.2.0 (e81fcab)
  • toned-core: loosen the style type temporarily (fc921fd)
  • toned-core: per-element interaction resolution and style deep-merge (bf4268c)
  • update readme (32bc1c8)
  • update runtime media support (d0a4501)

Changed

  • toned-core: bound StyleMatcher match cache with an LRU cap (39d3fe8)
  • toned-core: skip redundant style writes to unchanged siblings (c2157b4)
  • toned-react: back multi-instance refs with a Set and prune lazily (cddcdf3)

Fixed

  • core: allow falsy token values like 0 in exec (e725082)
  • core: fix callback variant selector and add size tokens (39e826f)
  • core: wrap media query CSS variables in html selector (adb474c)
  • stylesheet: make VariantBuilder extend string for computed property keys (d2c3002)
  • stylesheet: use template literal types for variant keys (722babc)
  • toned-core: make pseudo raw-style vs token precedence deterministic (c98b777)
  • toned-core: resolve declarative style pseudo-free and clean up on unmount (fd37420)
  • toned-core: resolve interactive multi-instance styles per element on contextless updates (e074a2f)
  • toned-core: restore inline style baselines by ownership (e2c3bba)
  • toned-core: stop cross-element interaction leaking across instances (6fe74c5)
  • types: preserve element key types through useStyles (bfb34bc)
  • use .js extensions in package.json exports for published output (9fc746d)

@toned/react 0.3.0

Added

  • minor updates (9640c00)
  • minor updates (7f420b3)
  • minor updates (3e8a947)
  • overhaul (cd39c6a)
  • react: add .with() composition API and tokenize inline styles (a1c0333)
  • react: drop old configs, improve native config resolution (9c8fab4)
  • react: filter symbol keys from styles (c0ebb7e)
  • react: improve type inference for styles (ac97261)
  • react: improve variants type (8cb6793)
  • restructure the monorepo (7571b9c)
  • toned-react: per-element hover/active/focus for multi-instance stylesheets (dbe7429)
  • update readme (32bc1c8)

Changed

  • 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

Fixed

  • core: fix callback variant selector and add size tokens (39e826f)

@toned/themes 0.2.0

Added

24 February 2026

@toned/core 0.1.0

Added

  • add initial support for static pseudos (6e08762)
  • core: add CSS variable media mode and fix breakpoint types (1ef3a3e)
  • core: add CSS-only pseudo-state support via pseudoMode: 'css' (73745e4)
  • core: add root-level media queries and fix docs hydration (e4f57e9)
  • core: add Vite plugin for static CSS generation (0f76f10)
  • core: defineSystem types (c3484cc)
  • core: inject media (e1df62f)
  • core: minor update (534208f)
  • core: minor updates (b9be0aa)
  • core: use breakpoints config for runtime media (e7634c2)
  • infer breakpoints from config, improve breakpoints types (997e927)
  • migrate stylesheet API to new flat interface (TASK_2) (e8d98ea)
  • minor updates (7208cb6)
  • minor updates (3e8a947)
  • overhaul (a9a6673)
  • restructure the monorepo (7571b9c)
  • StyleMatcher: updates (0e0e413)
  • stylesheet: add callback-based variants API with type-safe selectors (5a0cda1)
  • stylesheet: update types - wip (dc3efd0)
  • task 5 (7cd6b4e)
  • update readme (32bc1c8)
  • update runtime media support (d0a4501)

Fixed

  • core: allow falsy token values like 0 in exec (d201ed7)
  • core: fix callback variant selector and add size tokens (5803d20)
  • core: wrap media query CSS variables in html selector (6425a93)
  • stylesheet: make VariantBuilder extend string for computed property keys (1de8f82)
  • stylesheet: use template literal types for variant keys (1acbe7e)
  • types: preserve element key types through useStyles (2cc4635)

@toned/react 0.1.0

Added

  • minor updates (7abd43f)
  • minor updates (7208cb6)
  • minor updates (3e8a947)
  • overhaul (a9a6673)
  • react: add .with() composition API and tokenize inline styles (15be2e8)
  • react: drop old configs, improve native config resolution (9c8fab4)
  • react: filter symbol keys from styles (8e0749e)
  • react: improve type inference for styles (7db91fe)
  • react: improve variants type (77bf8af)
  • restructure the monorepo (7571b9c)
  • update readme (32bc1c8)

Fixed

  • types: preserve element key types through useStyles (2cc4635)

@toned/systems 0.1.0

Added

Fixed

  • core: fix callback variant selector and add size tokens (5803d20)

@toned/themes 0.1.0

Added

Each package keeps its own file, for example packages/toned-core/CHANGELOG.md.