diff --git a/.tegami/2026-07-28-9c4e2b.md b/.tegami/2026-07-28-9c4e2b.md deleted file mode 100644 index dfb1389a..00000000 --- a/.tegami/2026-07-28-9c4e2b.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -packages: - "npm:@reactunity/renderer": patch ---- - -### Fix gradients rendering too dark in gamma colour space - -Every gradient — `linear-gradient`, `radial-gradient`, `conic-gradient` and their repeating forms — had its colours converted to linear space regardless of the project's colour space. A gamma-space project never converts them back, so the whole ramp came out darkened by a 2.2 exponent: CSS `green` painted as `rgb(0,55,0)` rather than `rgb(0,128,0)`, and `linear-gradient(red, blue)` crossed at `rgb(54,0,55)` rather than `rgb(127,0,128)`. Saturated endpoints survived while everything between them sank toward black. - -The ramp is stored in a texture flagged linear and its contents have to agree with that flag, so the conversion is right in a linear-space project and stays. It now follows `QualitySettings.activeColorSpace` instead of applying unconditionally. Gamma-space projects again match what a browser paints for the same CSS declaration, to the byte. - -Introduced in 0.23.0. Projects on Linear colour space were never affected, and need no changes. diff --git a/.tegami/2026-07-29-b71c4e.md b/.tegami/2026-07-29-b71c4e.md deleted file mode 100644 index 16a2988f..00000000 --- a/.tegami/2026-07-29-b71c4e.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -packages: - "npm:@reactunity/renderer": patch ---- - -### Fix non-solid border styles rendering as solid until the next style update - -`inset`, `outset`, `groove`, `ridge`, `dotted`, `dashed` and `double` borders came out flat solid on an element's first render. Any later style update — a hot reload, a state change, anything that re-ran the style pass — painted them correctly, so in the Editor they appeared to work while a build, where no such update ever arrives, showed solid borders forever. - -The style is encoded as UVs into a lookup texture that the border graphic samples. That texture was bound from the `Rounding` setter alone, and the graphic is also created from the layout pass, which never assigns rounding: styles run before layout, so on the first pass Yoga has no border widths yet and no border graphic exists to receive the rounding, and by the time the layout pass creates one the style pass is over. With no texture bound, Unity substitutes a white one and every style samples as solid. - -The texture is now resolved on each material rebuild instead of being cached on assignment, so it is correct however the graphic came to exist. - -Borders with a `border-radius` still ignore `border-style` and paint solid — a separate, pre-existing limitation of the rounded mesh path. diff --git a/.tegami/2026-07-29-e35a90.md b/.tegami/2026-07-29-e35a90.md deleted file mode 100644 index c970dbb2..00000000 --- a/.tegami/2026-07-29-e35a90.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -packages: - "npm:@reactunity/renderer": patch ---- - -### Support border-style and outline-style on rounded corners - -`border-radius` used to drop `border-style` entirely: the rounded mesh path sampled no style at all, so every style painted as flat solid, and `none` painted a solid border rather than nothing. Browsers render all of them with rounded corners, so a declaration that worked on a square element silently lost its style once a radius was added. `outline-style` was dropped the same way. All seven styles now render along the curve. - -`groove`, `ridge`, `inset`, `outset` and `double` are ramps across the border width, and the rounded path already emitted an inner and an outer vertex ring stitched 1:1 into a quad strip. Feeding the style band's inner edge to the inner ring and its outer edge to the outer ring makes the strip interpolate the ramp, using the same bands and the same per-side inversion as the square path. - -`dotted` and `dashed` repeat *along* the edge instead, which one continuous ring cannot express. When a side asks for one, the rings are emitted as vertices only and each side is drawn as its own strip, walked out by arc length along the border's centreline so a dash keeps its length through a corner. The dash and dot counts are fitted to a whole number per side, so a side begins and ends with half a gap rather than a clipped dash at the mitre. Sides can mix freely - a dashed top against solid sides keeps a clean mitre, since each corner arc doubles its vertex at 45 degrees and the per-side split lands exactly on that pair. diff --git a/.tegami/2026-07-30-6d2b81.md b/.tegami/2026-07-30-6d2b81.md deleted file mode 100644 index e8784f30..00000000 --- a/.tegami/2026-07-30-6d2b81.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -packages: - "upm:com.reactunity.jint": minor - "upm:com.reactunity.core": minor ---- - -### Update Jint to 4.15.3 - -`com.reactunity.jint` carried a 4.0.0-beta build; it now ships Jint 4.15.3 and Acornima 1.6.2. `System.Collections.Immutable` and `System.Reflection.Metadata` are gone with it — 4.15 no longer depends on either — while `Jint.dll` grew from 0.9 MB to 2.5 MB, most of it the Intl and time-zone data Jint now bundles. - -Two behaviours changed under us and are handled in `JintEngine`: - -**`import.meta.url` is no longer filled in by Jint.** It used to report the specifier a module was added under; 4.15 leaves `import.meta` to the host, which is what the spec asks for. A `Jint.Runtime.Host` supplies `url` from the module's location again, so the Vite HMR client keeps reading its own address off it. The cache-busting query on the specifier is still needed — re-adding a specifier is still a no-op, so a hot update would otherwise re-run the first version of the module. - -**Tasks are now promises.** A `Task` handed to script code was an ordinary CLR wrapper, so `await` on one did nothing useful and the test covering it was skipped for Jint. It is now converted through a wrap handler, matching what QuickJS and ClearScript already did. Jint 4.15 has its own `ExperimentalFeature.TaskInterop` for this, but it rejects with the `AggregateException` wrapping the failure; the handler here rejects with the inner exception, so a `catch` sees the same error on all three engines. - -Two pieces of glue went with the update. The `Esprima.NET` fallback in `TryExecute` and the `REACT_JINT_ACORNIMA` version define that selected it are gone — Jint has parsed with Acornima since 4.0, and `Esprima.dll` has not shipped since 0.20.0. `ObjectWrapper` also reads `Array.prototype` methods off a CLR list now, so `reduce`, `map` and friends work on a `List` without spreading it first; the mutating half (`splice`, assigning `length`) still throws, because Jint wraps the list read-only on Unity's runtime, and that test stays skipped for Jint alone. diff --git a/.tegami/2026-07-30-a1c9f4.md b/.tegami/2026-07-30-a1c9f4.md deleted file mode 100644 index 25095140..00000000 --- a/.tegami/2026-07-30-a1c9f4.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -packages: - "upm:com.reactunity.core": minor - "upm:com.reactunity.quickjs": minor ---- - -### Run a Vite dev server, entry document and HMR patches included - -Pointing `DevServer` at a Vite server root now works on every engine. - -A dev server answers its root with an HTML entry document rather than JavaScript — Vite's is a bare `