chore: release v0.25.0 - #141
Merged
Merged
Conversation
github-actions
Bot
force-pushed
the
tegami/version-packages
branch
from
September 14, 2026 02:34
50419bf to
5f61f97
Compare
github-actions
Bot
force-pushed
the
tegami/version-packages
branch
from
September 14, 2026 16:21
5f61f97 to
fac5ce4
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
All bumped packages.
@reactunity/create0.24.00.25.0@reactunity/material0.24.00.25.0@reactunity/renderer0.24.00.25.0@reactunity/scripts0.24.00.25.0Changelogs
2026-09-12-logical-borders-and-sizing.mdShow Bumped Packages (1)
npm:@reactunity/rendererLogical borders and sizing
The painted border properties have their logical spellings —
border-inline-color,border-start-start-radiusand the rest — sodirection: rtlturns a coloured edge or a rounded corneraround, and Tailwind's
border-s-*androunded-s-*do something.inline-size,block-sizeand theirmin-/max-forms are aliases for the width and height properties.2026-09-12-scroll-padding-margin-stop.mdShow Bumped Packages (1)
npm:@reactunity/rendererscroll-padding,scroll-marginandscroll-snap-stopThe three scroll-snap properties that were missing are in:
scroll-paddinginsets the box a snap targetlines up against,
scroll-marginoutsets the target itself, andscroll-snap-stop: alwayskeeps a flingfrom carrying past a target on its way to one further along.
2026-09-13-background-clip.mdShow Bumped Packages (1)
npm:@reactunity/rendererbackground-clipbackground-cliptakes one value per background layer, and all four of CSS's values now do what they say.textcuts a layer down to the element's own glyphs — a gradient or an image painted through the text,which with
color: transparentis the gradient-text effect. The glyphs are rasterised into a coveragetexture by a command buffer and only when they move, so an idle element costs nothing.
The three boxes used to be one box. Every background was masked at the padding edge, so a background never
reached under its own border: a dashed, dotted or semi-transparent border showed the page through its gaps
rather than the element, and a rounded one took the border's inner radius instead of its own. The mask is the border box now, which is both
what
border-boxmeans and what CSS makes the default;padding-boxandcontent-boxare cut per layerin the fragment shader, with the radii that box has left, and cost nothing when there is no border or
padding to separate them.
Moving that mask corrected an inset
box-shadowwith it. One is cast by the padding edge, which is whereit is now drawn and rounded — it used to be cast by the border box and then trimmed back to the padding
box by the mask, so on a bordered element it sat a border-width out from where CSS puts it.
2026-09-13-calc-percentage.mdShow Bumped Packages (1)
npm:@reactunity/renderercalc()keeps a percentageA
calc()that works out to a percentage is one now, on every property Yoga can hold a percentage for:width: calc(1/2 * 100%)is50%, and sow-1/2,left-1/2,-translate-x-1/2andbasis-1/3— whichis how a CSS framework spells every fraction it has — lay out instead of dropping. The percentage is
carried through the arithmetic rather than resolved on sight, which is what used to throw the answer away:
the parent it was resolved against had not been laid out yet, so the declaration came out as nothing at
all.
It survives a sub-expression too, parenthesised or a nested
calc()—calc(calc(1 / 2 * 100%) * -1),which is what a framework emits for every negative fraction utility. A group is worked out before the
calculation around it, and the length or percentage it came out as is an operand again exactly as it
stands, rather than something the arithmetic around it could not read.
On a property Yoga does not hold as a percentage --
border-left-width,scroll-margin-left-- acalculated percentage now resolves to the same number the percentage written out gets, rather than
reaching the property as a value of the wrong type.
A calculation mixing a percentage with a length,
calc(100% - 2rem), is still dropped. Yoga has one unitper value and no calc of its own, so there is nothing to hand it.
infinityis a number as CSS Values 4 asks — the largest length the implementation supports, not a realinfinity.
border-radius: calc(infinity * 1px), which is what arounded-fullutility compiles to, usedto come out of the corner reduction as NaN and leave the element painting nothing.
Under
REACT_UNITY_DEVELOPER, a declaration that resolves to nothing now says so once in the console,naming the property and the value. A dropped declaration was silent before, which is the part of this that
cost the most to find.
2026-09-13-overscroll-behavior.mdShow Bumped Packages (1)
npm:@reactunity/rendereroverscroll-behaviorScrolling now chains. A
<scroll>that has reached its end hands the rest of the gesture to thenearest scroll box above it, as a page does on the web. Until now the innermost box swallowed every
tick and every drag it was given, so a short list inside a long page was a dead spot: reaching its
end stopped the scroll rather than carrying on with the page behind it.
overscroll-behavioris how a box keeps a scroll to itself instead.containstops the handover,nonestops it and drops the local overscroll effect with it -- which here is<scroll>'selasticityprop, sononeon an elastic box takes its bounce away wherecontainleaves it. Bothaxes are separate: the shorthand takes one value or two with
xfirst,overscroll-behavior-xand-yset them individually, andoverscroll-behavior-inlineand-blockare the same two undertheir logical names. The axis a gesture runs along is the one that decides, so a contained
ydoesnot trap a sideways scroll.
A gesture stays with whichever box took it, rather than being handed over the moment that one
reaches its own end: dragging a list down to its end and on past it does not then start dragging the
page. That is the latching a browser does, and it is measured from where the drag began, so a slow
one is not mistaken for a stuck one.
Chaining walks the element tree rather than the transform hierarchy, so a
filteror aperspectivein between -- both of which reparent their subtree onto an offscreen canvas -- doesnot break it.
2026-09-13-perspective-and-backface.mdShow Bumped Packages (1)
npm:@reactunity/rendererperspective,perspective-originandbackface-visibility3D transforms have always composed here —
rotateXandrotateYset a real rotation, and children keeptheir own depth the way
transform-style: preserve-3ddescribes — but nothing projected them, so arotation only ever foreshortened linearly and never converged anywhere.
perspectiveon a parent now does. Its subtree is captured through a camera of its own, the same offscreenmachinery
filteruses, with an off-axis frustum standing the viewer whereverperspective-originputsthem; the capture grows to hold whatever the projection throws outside the element's box, so a card leaning
out of its stage is not clipped.
backface-visibility: hiddenis separate and needs no perspective: itwatches the element's winding — which catches a mirror as well as a rotation, as CSS does — and takes the
element out of both drawing and hit testing while its back is turned.
There is still no
transform-style. Itspreserve-3dis what everything already does, and its defaultflatwould need a shear the transform model has nowhere to put.A
transformwhose functions run together with no space between them --rotateX(35deg)rotateY(-30deg),which is what every CSS minifier emits -- now parses. It was being read as one token naming no function,
so a built stylesheet silently lost the whole declaration while the same rule worked in source.
translate-zhas changed sign. A positive value now comes towards the viewer, as CSS says and asrotateX/rotateYalready did. Nothing could show the difference under an orthographic screen-spacecanvas, which is why it went unnoticed; a
perspectiveshows it immediately. Code that leaned on the olddirection — most likely ordering elements in a world-space canvas — wants the opposite sign now.
2026-09-14-lightningcss-logical-properties.mdShow Bumped Packages (1)
npm:@reactunity/rendererLogical border radii survive the Vite build
The preset names an old CSS target so that Lightning CSS lowers what ReactUnity's CSS subset has no
parser for.
border-start-start-radiusand its three siblings were caught by that too, and theirlowered form is a pair of rules selected by
:-webkit-any(:lang(ae),:lang(ar),...)naming everyright-to-left language -- pseudo-classes ReactUnity reads as custom states, which never match, so the
radius was dropped and the console carried a warning for each. Lowering is excluded for the logical
properties now, the way it already was for
light-dark(): both are things the renderer resolvesitself, and against the element's own direction rather than the document's language.
2026-09-14-relative-color-syntax.mdShow Bumped Packages (1)
npm:@reactunity/rendererRelative color syntax
Every color function takes a
from <color>origin, which is CSS Color 5's relative color syntax:rgb(),hsl(),hsv(),lab(),lch(),oklab()andoklch(). The origin is converted into thefunction's own space and its channels become keywords the channel slots can use, on their own or inside
calc()— sorgb(from var(--brand) r g b / 50%)is a brand color at half opacity without repeating it,and
oklch(from currentcolor calc(l * 0.8) c h)is a hover shade of whatever the element's own colorturns out to be. A keyword may appear in any slot, so
rgb(from red b g r)is blue.Each keyword carries the range CSS gives it —
ris0–255,hsl()'ssis0–100,oklch()'slis0–1, a hue is degrees,alphais0–1— so a literal mixes with one exactly as it would ina browser. An omitted alpha is the origin's own rather than
1, sorgb(from <color> r g b)is thatcolor unchanged.
The origin stays lazy, so it may be a
var(),currentColor, acolor-mix()or another relative color,and one parsed rule resolves against each element it lands on. A literal origin is decomposed while
parsing instead, so the whole function still folds to a constant.
Two things the color functions have always got wrong were in the way, and are fixed:
hsl()andhsv()read saturation and lightness on CSS's0–100scale rather than0–1, so the%may be left off as every framework that emitshsl(152 37 59)expects. Written with percentagesthey are unchanged; written as bare fractions —
hsl(152, 0.37, 0.59), which was the only spelling thatused to work — they now mean what CSS says they mean, which is very nearly black.
Out-of-range components are clamped rather than carried through the conversion, which is what CSS
Color 4 asks of a specified color and what this arithmetic reaches constantly:
rgb(300 0 0)is red,hsl(0 150 50)is a saturation of100%, andcalc(l * 4)is a lightness of1rather than a colorthat paints nothing. A saturation past
100%used to come out of the conversion as a different hueentirely. Alpha is clamped everywhere, hue wraps, and a channel written as
noneis0inrgb(),hsl()andhsv()as it already was in the Lab family.Publish
The following packages will be published if merged:
@reactunity/create0.25.0npm@reactunity/material0.25.0npm@reactunity/renderer0.25.0npm@reactunity/scripts0.25.0npm