Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
96765f3
fix(vendor): support FormattedMessage
DouweBos Jun 19, 2026
5502e4b
feat(vendor): synchronous Yoga text measurement for wrapping and intr…
DouweBos Jun 21, 2026
840bef7
fix(vendor): withhold paint until first layout to avoid async-flex or…
DouweBos Jun 22, 2026
e96bf56
feat(vendor): focus-when-ready, arrival-not-mount autoFocus, destinat…
DouweBos Jun 22, 2026
f8f3bd7
feat(vendor): getLayout ref API and skipChildFocusScroll opt-out
DouweBos Jun 22, 2026
88b908e
fix(vendor): flatten Image array styles and paint/clear border shader…
DouweBos Jun 22, 2026
e1b812a
fix(vendor): normalize key events and emit held-key auto-repeat
DouweBos Jun 22, 2026
64edb24
fix(vendor): parse string aspectRatio values so ratio-sized nodes get…
DouweBos Jun 22, 2026
80bb583
fix(vendor): accept handler array in useComposedEventHandler
DouweBos Jul 6, 2026
08143e2
fix(vendor): expose focused state to function children
DouweBos Jul 6, 2026
40de3a0
fix(vendor): resolve font atlas urls before they reach the inlined wo…
RuudBurger Jul 7, 2026
f1c8813
fix(vendor): apply animated transforms and replay resting styles to l…
RuudBurger Jul 8, 2026
adfdd7f
fix(vendor): measure virtuallist header/footer size (RNG-469)
RuudBurger Jul 8, 2026
422c9ad
fix(vendor): render experimental_backgroundImage linear-gradients
RuudBurger Jul 8, 2026
24842f3
fix(vendor): round status badge corners on tiles (RNG-530)
RuudBurger Jul 8, 2026
689922c
fix(vendor): mask the background wash and reuse BackgroundContent
RuudBurger Jul 8, 2026
1777049
fix(vendor): export findNodeHandle from react-native-lightning
RuudBurger Jul 8, 2026
ac30c91
fix(lightning): pin virtuallist cell cross axis when the list width i…
RuudBurger Jul 8, 2026
28e4e41
fix(vendor): detach removed nodes from yoga parent so shrink-fit cont…
RuudBurger Jul 8, 2026
e154993
fix(vendor): feed border width into yoga so borders reserve layout
RuudBurger Jul 8, 2026
57aaeca
fix(vendor): let modifier key combos through the key press handler
RuudBurger Jul 8, 2026
bf888e0
fix(vendor): key virtuallist focus-follow snap off header/footer size…
RuudBurger Jul 8, 2026
64aa64d
fix(vendor): fold border-radius into the linear-gradient shader inste…
RuudBurger Jul 8, 2026
6c700e0
fix(vendor): skip empty focus groups in spatial nav and autofocus
RuudBurger Jul 8, 2026
2cf6837
fix(vendor): skip virtuallist focus-follow while a pointer is suppres…
RuudBurger Jul 8, 2026
99d9ff2
fix(vendor): map logical start/end position insets to yoga edges
RuudBurger Jul 8, 2026
0ef7c92
fix(vendor): pin virtuallist header/footer cross axis when the list w…
RuudBurger Jul 8, 2026
ea01326
fix(vendor): keep the rounded shader on partial style updates
RuudBurger Jul 8, 2026
9628e0a
fix(vendor): cap virtuallist viewport at stage edge, honor per-row sc…
RuudBurger Jul 8, 2026
a618824
fix(vendor): honor caller easing in withTiming
RuudBurger Jul 9, 2026
f17bd84
fix(vendor): play composed reanimated animations (sequence/repeat/del…
RuudBurger Jul 9, 2026
f8db554
fix(vendor): translate the anchored yoga edge so right/bottom-docked …
RuudBurger Jul 9, 2026
ccb04c9
fix(vendor): stop horizontal VirtualList cross-size ratcheting off it…
RuudBurger Jul 9, 2026
26a33aa
chore(vendor): bump @lightningjs/renderer to 3.1.1
RuudBurger Jul 10, 2026
398cc2d
fix(vendor): export CanvasRoot for react-dom-free mount
RuudBurger Jul 10, 2026
64b5c5d
fix(vendor): drop estimatedItemSize from VirtualList, sizes come from…
RuudBurger Jul 10, 2026
38ee1f2
fix(vendor): await font metrics in yoga init so the first layout meas…
RuudBurger Jul 10, 2026
a50167d
fix(vendor): stub getPosition on the yoga node spec mock
RuudBurger Jul 10, 2026
9d62639
fix(vendor): re-push cell cross-size after a virtuallist data reset s…
RuudBurger Jul 10, 2026
b56b335
fix(vendor): skip no-op style animations so they don't hold the scene…
RuudBurger Jul 11, 2026
3589df8
fix(vendor): withhold virtuallist rows until their measured height se…
RuudBurger Jul 11, 2026
df684f6
fix(lightning): drive virtuallist focus scroll with the tvos spring
RuudBurger Jul 11, 2026
695af95
fix(vendor): measure missing glyphs at the ? fallback advance
RuudBurger Jul 11, 2026
81eba01
fix(vendor): handle same-parent insertChild as a move so reorders re-…
RuudBurger Jul 11, 2026
130f735
fix(vendor): reset dropped flex style props to yoga defaults
RuudBurger Jul 11, 2026
f55123c
feat(vendor): synchronous flushLayout and settled event
RuudBurger Jul 11, 2026
5d7e318
feat(vendor): deterministic layout benchmark with local-baseline delt…
RuudBurger Jul 11, 2026
da8a9f8
perf(vendor): drive virtuallist reveal off yoga settled, not timers
RuudBurger Jul 11, 2026
e44f2a1
fix(vendor): resolve percentage translate against own size at layout …
RuudBurger Jul 12, 2026
e77cc15
feat(vendor): opt-in rounded clipping (borderRadius + overflow hidden…
RuudBurger Jul 12, 2026
bf7d5f3
fix(vendor): rounded clipping via stencil clipRadius instead of rtt
RuudBurger Jul 12, 2026
48e5d5c
fix(vendor): infer reanimated hook deps by tracking shared-value reads
RuudBurger Jul 12, 2026
ecb6ba8
feat(vendor): flatten layout-only views behind a flattenLayoutViews o…
RuudBurger Jul 12, 2026
3f22ba5
fix(vendor): fold direct node.x/y writes through flattened placeholders
RuudBurger Jul 12, 2026
110b3b2
fix(vendor): materialize flattened elements before their exit animation
RuudBurger Jul 12, 2026
70a62b5
fix(vendor): bind animateStyle so composed reanimated animations play
RuudBurger Jul 12, 2026
7cefd36
fix(vendor): drop unresolvable css keyword colors instead of throwing
RuudBurger Jul 13, 2026
0797149
fix(vendor): annotate and cast so check:types passes again
RuudBurger Jul 13, 2026
d7bfeb6
fix(vendor): widen the yoga layout wire from int16 to int32
RuudBurger Jul 13, 2026
287e698
fix(vendor): mark animated style pushes partial so static flex props …
RuudBurger Jul 13, 2026
e076b0a
fix(vendor): skip stale visible indices after a sync data shrink in v…
RuudBurger Jul 13, 2026
3bfe605
fix(vendor): clamp spatial nav cross-axis distance to the target span
RuudBurger Jul 13, 2026
60b5639
test(vendor): rounded clipping storybook fixtures
RuudBurger Jul 13, 2026
fc6dd7d
fix(vendor): satisfy oxlint in flexbox and element test/bench files
RuudBurger Jul 13, 2026
6130288
fix(vendor): clear a removed border's shader on full restyles, keep i…
RuudBurger Jul 13, 2026
72ab440
chore: changeset for the border-shader clear fix
RuudBurger Jul 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/css-transform-keyword-colors.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@plextv/react-lightning-plugin-css-transform': patch
---

Drop unresolvable CSS keyword colors (`inherit`, `currentColor`, `initial`, `unset`, `revert`) instead of throwing. They have no fixed value to resolve, so they reached the invalid-hex throw and took the whole screen down via the error boundary. Now the property is omitted. Also keep zero-valued transform values (`if (value != null)`), which the previous truthy check dropped.
5 changes: 5 additions & 0 deletions .changeset/flatten-exit-animation-materialize.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@plextv/react-lightning': patch
---

Fix flattened elements leaking when they run a reanimated exit animation. A layout-only view flattens to a placeholder node, and a placeholder's `animate()` is a no-op that never emits `stopped`. Reanimated defers node removal until the exit animation finishes, so on a flattened wrapper the finish never fired, the deferred destroy never ran, and the subtree (and its real image descendants) stayed on the scene forever, stacking on every remount. Materialize the element when a deferred-removal handler is attached so the exit animation runs on a real node and completes.
5 changes: 5 additions & 0 deletions .changeset/flatten-layout-views.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@plextv/react-lightning': minor
---

Add a `flattenLayoutViews` render option: layout-only Views (no background, border, clip, non-neutral alpha/transform, or transition) skip renderer node creation entirely. The element keeps a lightweight placeholder, descendants attach to the nearest materialized ancestor, and layout positions accumulate across the flattened chain (folded at the layout write funnels, unwound in `getRelativePosition`/`onLayout`). A flattened element materializes a real node on the first prop that needs one (sticky, so per-focus style toggles don't churn nodes). Inert RN-layer props (handlers, testID) don't prevent flattening; visual props at neutral values (color 0, alpha 1, scale 1) don't either. Off by default.
5 changes: 5 additions & 0 deletions .changeset/flatten-scroll-fold-through.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@plextv/react-lightning': patch
---

Fix flattened content not scrolling: a scroll handler (or any code) that writes a flattened element's position straight through `node.x`/`node.y`, bypassing `setProps`, now folds through to the hoisted children. The placeholder's `x`/`y` are accessors that notify the owning element, which re-pushes the offset to descendants. Without this, a direct write landed on the inert placeholder and the content only jumped to its final position on the next React commit (no animation).
5 changes: 5 additions & 0 deletions .changeset/flexbox-layout-benchmark.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@plextv/react-lightning-plugin-flexbox': patch
---

Add a deterministic layout benchmark (synthetic home/details/grid/epg pages run through the real managers) with a baseline gate, so layout changes are checked instead of eyeballed.
5 changes: 5 additions & 0 deletions .changeset/flexbox-logical-position-insets.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@plextv/react-lightning-plugin-flexbox': patch
---

Logical `start`/`end` position insets now map to yoga's `EDGE_START`/`EDGE_END` (LTR), matching the existing logical margin/padding handling. Previously they were silently dropped, so an absolutely positioned box pinned with `end: 0` fell back to the left edge.
5 changes: 5 additions & 0 deletions .changeset/flexbox-missing-glyph-fallback.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@plextv/react-lightning-plugin-flexbox": patch
---

Measure missing glyphs at the ? fallback advance so text boxes match painted output
5 changes: 5 additions & 0 deletions .changeset/flexbox-reset-dropped-style-props.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@plextv/react-lightning-plugin-flexbox': patch
---

Reset yoga props to their defaults when a style re-apply drops them
5 changes: 5 additions & 0 deletions .changeset/flexbox-sync-flush-settled.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@plextv/react-lightning-plugin-flexbox': minor
---

Add a synchronous flushLayout() that lays out to a fixpoint, and a settled event that fires once layout converges. Deterministic replacement for the timer-based "has it settled yet" guesses in VirtualList.
5 changes: 5 additions & 0 deletions .changeset/focus-skip-empty-groups.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@plextv/react-lightning': patch
---

A FocusGroup with no focusable descendant is now skipped by spatial navigation and autoFocus instead of acting as a focus stop. Groups only delegate focus to their children, so a group wrapping non-interactive content (e.g. a list section header) shouldn't be a target; real leaves (Pressable, a `focusable` View) are unaffected. Effective focusability tracks `hasFocusableChildren` and propagates up the ancestor chain, so a group flips back the moment a focusable child mounts (or its last one is removed).
8 changes: 8 additions & 0 deletions .changeset/lightning-animated-transform-and-resting-styles.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
'@plextv/react-lightning-plugin-flexbox': patch
'@plextv/react-lightning-plugin-reanimated': patch
---

fix(reanimated): apply animated transforms and replay resting styles to late-attached nodes

Two gaps stopped a reanimated `transform` (e.g. a scroll-linked `translateY`) from reaching a laid-out node. The flexbox worker proxy filtered every non-flex style key before postMessage, so `transform` was dropped even though the worker-side Yoga already applies it as a top/left offset (and the serializer special-cases transform objects) — let it through. And `useAnimatedStyle` only pushed styles when a shared value changed, so a view that registers after the fact (recycled cell, re-created node) never got the current resting value; `AnimatedStyle` now exposes `applyToView`, which `createAnimatedComponent` calls on registration to replay the last-applied styles. Replay-only on purpose: computing a fresh value at attach time pushed states the normal flow never emitted and broke focus on some nodes.
7 changes: 7 additions & 0 deletions .changeset/lightning-aspect-ratio.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@plextv/react-lightning-plugin-flexbox": patch
---

fix(flexbox): parse string `aspectRatio` values so ratio-sized nodes get a box

React Native accepts `aspectRatio` as a number (`1.5`), a ratio string (`'3/2'`), or a numeric string (`'1.5'`), but the value was passed straight to Yoga's `setAspectRatio`, which only takes a number. String forms became `NaN` and the ratio was silently dropped — so a node sized only by `aspectRatio` plus one dimension (e.g. an image with `aspectRatio: '3/2'` and `height: '65%'` but no width) resolved to zero width and never painted. String ratios are now parsed to a number before being applied.
7 changes: 7 additions & 0 deletions .changeset/lightning-border-shader-clear.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@plextv/react-lightning': patch
---

fix(react-lightning): clear a removed border's shader on full restyles

The keep-shader guard (added so reanimated's partial pushes don't square off a rounded node) inferred "partial" from "no shader-relevant prop present". A full restyle that dropped a border matched that too, so a removed focus-ring border kept painting. It now gates on the PARTIAL_STYLE marker: a reconciler snapshot recomputes (and clears) the shader, while reanimated and imperative single-key style sets keep it. Imperative `el.style.x =` pushes are marked PARTIAL_STYLE too.
5 changes: 5 additions & 0 deletions .changeset/lightning-find-node-handle.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@plextv/react-native-lightning': patch
---

Add a findNodeHandle export that returns the element ref instead of throwing (react-native-web's re-export throws unconditionally). Lightning focus APIs (setDestinations, focus hints) take element refs directly, so shared RN code that funnels refs through findNodeHandle now works unchanged.
8 changes: 8 additions & 0 deletions .changeset/lightning-flex-nonzero-sizing.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
"@plextv/react-lightning": minor
"@plextv/react-lightning-plugin-flexbox": patch
---

fix(flexbox): withhold paint until first layout to avoid the async-flex origin flash

Flex layout is computed asynchronously (in a worker), so a definite-sized node mounts and paints at its pre-layout origin (0,0) for a frame or two before the layout result moves it. A node now keeps its rendered alpha at 0 from mount until its first layout resolves, then restores the styled alpha (`withholdPaintUntilLayout` / `releaseWithheldPaint`). Zero-sized and already-invisible nodes are skipped, and subtrees detached from flex layout are released so they can never be stranded invisible.
7 changes: 7 additions & 0 deletions .changeset/lightning-flex-shrink-on-child-removal.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@plextv/react-lightning-plugin-flexbox': patch
---

fix(flexbox): detach removed nodes from the yoga parent so shrink-fit containers shrink

`removeNode` freed the child's yoga node and spliced the ManagerNode children array, but never called `parent.node.removeChild(child.node)` on the yoga nodes themselves (unlike `detachChildNode`). The freed child stayed in the parent's yoga child list, so on the next layout the parent kept laying it out and a shrink-to-content container never shrank back. Visible as buttons that grow to fit a label on focus but stay expanded after blur once the label is removed. Now the child is detached from its yoga parent before it's freed.
7 changes: 7 additions & 0 deletions .changeset/lightning-focus-engine.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@plextv/react-lightning": minor
---

feat(focus): focus-when-ready, arrival-not-mount autoFocus, and destinations-on-arrival

`FocusManager.focus()` no longer drops a request for an element that isn't registered or focusable yet — it queues it and resolves the moment the element becomes ready, so callers don't have to poll across frames. A later-mounting `autoFocus` child no longer steals live focus on registration (a new `focusCommitted` flag gates the upgrade), matching native `TVFocusGuideView`, which forwards focus on arrival rather than on mount. And `destinations` are now honoured on arrival (first visit without `focusRedirect`, every visit with it), so focus forwards to a declared destination then remembers the last-focused child.
12 changes: 12 additions & 0 deletions .changeset/lightning-image-border-paint.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
"@plextv/react-lightning": minor
"@plextv/react-native-lightning": patch
---

fix(image+border): flatten array styles on Image and paint/clear border shaders on live nodes

The RN `Image` component built its node style with an object spread (`{ ...style, w, h }`), so an RN style array (`style={[a, b]}`) became numeric-keyed garbage and its `width`/`height`/`borderRadius` were silently dropped (the array-flatten polyfill only ran when the style reached `setProps` still an array). `Image` now flattens with `flattenStyles` before spreading.

Border shaders can now be toggled on an already-mounted node. `border` and `borderColor` were missing from the set of style props that force the shader-creating slow path, so toggling a plain border (e.g. a focus ring) fast-pathed straight onto the node and never created a `Border` shader. A node that already carries a shader now always takes the slow path, and removing the border clears the shader (resetting the node to the stage default) instead of leaving it painting.

Updating an existing shader's props in place now keys off whether the prop exists, not whether its current value is truthy. Previously a prop whose current value was falsy (e.g. a transparent `border-color` of `0`) was skipped, so toggling a focus-ring border from transparent to a visible color on a mounted node was silently dropped and the ring never appeared.
9 changes: 9 additions & 0 deletions .changeset/lightning-input-events.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
"@plextv/react-lightning": minor
---

fix(input): normalize key events and stop swallowing held-key auto-repeat

The key pipeline no longer drops OS auto-repeat events. Holding a directional key now keeps bubbling `onKeyDown` events (with `repeat: true`) through the focus tree, so held keys keep navigating and handlers can implement held-key/long-press behavior without re-deriving repeats from raw DOM listeners. The long-press duration is now measured from the initial press (the press timestamp is no longer reset by each repeat), so a held key still resolves to `onLongPress` on release.

Key events are also normalized into a consistent shape via a new `normalizeKeyEvent` helper: `keyCode` maps to `remoteKey` (falling back to `Keys.Unknown`), `repeat` is preserved, and `preventDefault` is now bound — previously the raw DOM method was copied unbound, so calling `event.preventDefault()` from a handler threw "Illegal invocation". `currentTarget` is now part of the `KeyEvent` type rather than bolted on during bubbling.
9 changes: 9 additions & 0 deletions .changeset/lightning-pressable-focused-state.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
'@plextv/react-native-lightning': patch
---

fix(pressable): expose `focused` to function children

`Pressable` tracked only `{ pressed }` in state and passed that to its style/children render functions, so `focused` was always `undefined`. Every focus-driven visual built on RN's `({ focused }) => …` contract — focus rings, focus scale — was dead on Lightning. It also only wired `onFocus`/`onBlur` to the node when the consumer passed those callbacks, so a focusable with no listeners tracked nothing.

`Pressable` now tracks `focused` in state, updates it on focus/blur regardless of whether the consumer passes `onFocus`/`onBlur` (still forwarding to them), and passes `{ focused, pressed }` to its function children — matching React Native. The `pressed` setters no longer replace the whole state object, so a keypress can't clobber `focused`.
6 changes: 6 additions & 0 deletions .changeset/lightning-same-parent-reorder.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
'@plextv/react-lightning': patch
'@plextv/react-lightning-plugin-flexbox': patch
---

Handle same-parent insertChild as a move so reordered children re-layout in the new order
12 changes: 12 additions & 0 deletions .changeset/lightning-shader-partial-update.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
'@plextv/react-lightning': patch
---

fix(react-lightning): keep the rounded/border shader on partial style updates

A partial style update (reanimated pushing just opacity/transform straight to
setProps) recomputed the node's shader from that partial style, found no
borderRadius/border, and cleared the Rounded shader. Any animated rounded node
squared off the moment reanimated touched it. Only rebuild or clear the shader
when the update actually carries a shader-relevant prop (or an explicit shader
override); otherwise keep the existing one.
8 changes: 8 additions & 0 deletions .changeset/lightning-text-intrinsic-sizing.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
"@plextv/react-lightning-plugin-flexbox": minor
"@plextv/react-lightning": patch
---

feat(flexbox): measure text synchronously in Yoga for wrapping and intrinsic sizing

Text leaves are now measured during Yoga layout (via msdf font metrics passed through the new `fonts` option) instead of relying solely on the renderer's async texture measurement, so text wraps and sizes correctly within flex layouts. The text node's explicit width/height is cleared when it becomes a measured leaf so the measure function — not a stale renderer-set width — drives its size, and `react-lightning` emits a `textChanged` signal so recycled/updated text re-measures.
7 changes: 7 additions & 0 deletions .changeset/lightning-virtuallist-parity.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"@plextv/react-lightning-components": minor
---

feat(virtuallist): getLayout ref API and skipChildFocusScroll opt-out for FlashList parity

`VirtualListRef` now exposes `getLayout(index)`, returning the scroll-space `{ x, y, width, height }` rectangle of an item (or `undefined` when out of range) — mirroring FlashList's per-item layout query for callers that interpolate row positions against the scroll offset (crossfade/parallax). A new `skipChildFocusScroll` prop opts out of VirtualList's internal focus-follow scroll: a focused child crossing a cell boundary still resolves and persists `focusedIndex`, but the list no longer scrolls the cell into view, letting the app layer own scrolling (e.g. a row that drives `scrollToIndex` from its own authoritative focused index). Both are additive — default behaviour is unchanged.
7 changes: 7 additions & 0 deletions .changeset/lightning-worker-font-url.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
'@plextv/react-lightning-plugin-flexbox': patch
---

fix(flexbox): resolve font atlas URLs before they cross into the Yoga worker

The Yoga worker is bundled inline (`?worker&inline`), so in a production build its `self.location` is a `blob:` URL. A root-relative atlas URL like `/fonts/x.msdf.json` (what `import.meta.env.BASE_URL` produces) can't resolve against a blob base, so the worker's `fetch` threw "is not a valid URL" and font metrics never loaded — text fell back to single-line, unmeasured layout. It only reproduced in built apps; the dev server serves the worker as a real module, so root-relative URLs resolved fine. Atlas URLs are now resolved to absolute against the document URL on the main thread, before the options cross `postMessage`.
6 changes: 6 additions & 0 deletions .changeset/percent-translate-own-size.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
'@plextv/react-lightning-plugin-css-transform': patch
'@plextv/react-lightning-plugin-flexbox': patch
---

Resolve percentage translateX/translateY against the node's own size (RN semantics). The css-transform converter used parseInt, which stripped the % and treated the number as pixels; the flexbox plugin now stashes the percentage and resolves it at layout readback, once the node's computed size is known, and keeps emitting the node on passes that don't dirty yoga.
5 changes: 5 additions & 0 deletions .changeset/reanimated-dep-inference.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@plextv/react-lightning-plugin-reanimated': minor
---

Infer reanimated hook dependencies at runtime by tracking shared-value reads. No babel plugin runs on Lightning, so `useAnimatedStyle` / `useDerivedValue` / `useAnimatedReaction` without an explicit dependency array never subscribed to their shared values and only updated on re-renders. Shared values from `useSharedValue` / `makeMutable` now report reads to the active hook, which subscribes to exactly what its updater read (re-collected on every run, so branches are handled). Explicit dependency arrays keep their old behavior.
5 changes: 5 additions & 0 deletions .changeset/rounded-clipping-option.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@plextv/react-lightning': patch
---

Add an opt-in `roundedClipping` render option: a node with borderRadius + clipping (overflow hidden) clips its children to the rounded rect, like the other RN platforms. Implemented via the renderer's stencil clip (`clipRadius`), so it costs no extra textures, nests, and works for text and images.
5 changes: 5 additions & 0 deletions .changeset/two-geese-stand.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@plextv/react-lightning": patch
---

fix(text): support FormattedMessage
5 changes: 5 additions & 0 deletions .changeset/virtuallist-pin-cross-axis.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@plextv/react-lightning-components': patch
---

VirtualList cells now pin their FlexRoot's cross axis to the cell's cross size when the list's cross size is definite (explicit style, parent cell bounds, or the flex-allocated outer size), so flex children can fill the cell width/height like a native list cell. Content-derived cross sizes stay unpinned to avoid the measure feedback loop.
5 changes: 5 additions & 0 deletions .changeset/virtuallist-pin-section-cross-axis.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@plextv/react-lightning-components': patch
---

VirtualList header and footer now pin their FlexRoot's cross axis under the same definiteness rule as the cells, so flex content (e.g. a stretch Column) fills the list width instead of shrink-fitting to its widest child.
6 changes: 6 additions & 0 deletions .changeset/virtuallist-reveal-on-settled.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
'@plextv/react-lightning-plugin-flexbox': patch
'@plextv/react-lightning-components': patch
---

Reveal VirtualList cells off Yoga's `settled` signal instead of wall-clock timers. A cell now reads its final size once layout has converged to a fixpoint and reports it as authoritative, so the LayoutManager skips its stability window and the RevealGate skips its quiet window. Cuts content-paint latency on the main-thread (worker-off) path; worker mode never emits `settled`, so it falls back to the existing timers.
2 changes: 0 additions & 2 deletions apps/react-lightning-example/src/pages/VirtualListPage.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,6 @@ export const VirtualListPage = () => {
<VirtualList
data={horizontalItems}
horizontal
estimatedItemSize={75}
drawDistance={150}
ListHeaderComponent={HorizontalHeader}
listHeaderSize={46}
Expand Down Expand Up @@ -101,7 +100,6 @@ export const VirtualListPage = () => {

<VirtualList
data={items}
estimatedItemSize={50}
drawDistance={200}
ListHeaderComponent={Header}
listHeaderSize={30}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,6 @@ const LibraryView = ({ items }: { items: PosterItem[] }) => {
snapToAlignment="center"
drawDistance={100}
numColumns={6}
estimatedItemSize={400}
ItemSeparatorComponent={() => <lng-view style={{ w: 20, h: 1 }} />}
contentContainerStyle={{ paddingHorizontal: 25 }}
style={{ w: 1670, h: 1080 }}
Expand Down
6 changes: 5 additions & 1 deletion apps/storybook/.storybook/preview.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,11 @@ const preview: Preview = {
context.tags.includes('overrideDecorator') ? (
<Story />
) : (
<StorybookDecorator story={Story} tags={context.tags} />
<StorybookDecorator
story={Story}
tags={context.tags}
canvasOptions={context.parameters.canvasOptions}
/>
),
],
};
Expand Down
Loading
Loading