chore: Update versions (alpha)#111
Merged
Merged
Conversation
d609012 to
ece5657
Compare
RuudBurger
approved these changes
Jul 14, 2026
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.
This PR was opened by the Changesets release GitHub action. When you're ready to do a release, you can merge this and the packages will be published to npm automatically. If you're not ready to do a release yet, that's fine, whenever you add more changesets to main, this PR will be updated.
mainis currently in pre mode so this branch has prereleases rather than normal releases. If you want to exit prereleases, runchangeset pre exitonmain.Releases
@plextv/react-lightning-plugin-css-transform@0.4.3-alpha.0
Patch Changes
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.@plextv/react-lightning-plugin-flexbox@0.4.3-alpha.0
Patch Changes
df7da6a: 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.
69653c6: Logical
start/endposition insets now map to yoga'sEDGE_START/EDGE_END(LTR), matching the existing logical margin/padding handling. Previously they were silently dropped, so an absolutely positioned box pinned withend: 0fell back to the left edge.5e69f9c: Measure missing glyphs at the ? fallback advance so text boxes match painted output
c34f03c: Reset yoga props to their defaults when a style re-apply drops them
ec4f817: 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.
4a7e3a4: fix(reanimated): apply animated transforms and replay resting styles to late-attached nodes
Two gaps stopped a reanimated
transform(e.g. a scroll-linkedtranslateY) from reaching a laid-out node. The flexbox worker proxy filtered every non-flex style key before postMessage, sotransformwas 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. AnduseAnimatedStyleonly 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;AnimatedStylenow exposesapplyToView, whichcreateAnimatedComponentcalls 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.f31d1d1: fix(flexbox): parse string
aspectRatiovalues so ratio-sized nodes get a boxReact Native accepts
aspectRatioas a number (1.5), a ratio string ('3/2'), or a numeric string ('1.5'), but the value was passed straight to Yoga'ssetAspectRatio, which only takes a number. String forms becameNaNand the ratio was silently dropped — so a node sized only byaspectRatioplus one dimension (e.g. an image withaspectRatio: '3/2'andheight: '65%'but no width) resolved to zero width and never painted. String ratios are now parsed to a number before being applied.7005125: 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.15fb74a: fix(flexbox): detach removed nodes from the yoga parent so shrink-fit containers shrink
removeNodefreed the child's yoga node and spliced the ManagerNode children array, but never calledparent.node.removeChild(child.node)on the yoga nodes themselves (unlikedetachChildNode). 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.b2492c6: Handle same-parent insertChild as a move so reordered children re-layout in the new order
660ae8d: 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
fontsoption) 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, andreact-lightningemits atextChangedsignal so recycled/updated text re-measures.dded826: 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 itsself.locationis ablob:URL. A root-relative atlas URL like/fonts/x.msdf.json(whatimport.meta.env.BASE_URLproduces) can't resolve against a blob base, so the worker'sfetchthrew "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 crosspostMessage.8d993ca: 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.
f2f0c11: Reveal VirtualList cells off Yoga's
settledsignal 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 emitssettled, so it falls back to the existing timers.Updated dependencies [e2a5e11]
Updated dependencies [5237e31]
Updated dependencies [8d0b8e8]
Updated dependencies [3a9a0c7]
Updated dependencies [01a42e4]
Updated dependencies [7005125]
Updated dependencies [66c2c93]
Updated dependencies [9beb550]
Updated dependencies [6e50057]
Updated dependencies [b2492c6]
Updated dependencies [3f4ed43]
Updated dependencies [660ae8d]
Updated dependencies [f6bee05]
Updated dependencies [43594e7]
@plextv/react-lightning-plugin-flexbox-lite@0.4.3-alpha.0
Patch Changes
@plextv/react-lightning-plugin-reanimated@0.4.3-alpha.0
Patch Changes
4a7e3a4: fix(reanimated): apply animated transforms and replay resting styles to late-attached nodes
Two gaps stopped a reanimated
transform(e.g. a scroll-linkedtranslateY) from reaching a laid-out node. The flexbox worker proxy filtered every non-flex style key before postMessage, sotransformwas 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. AnduseAnimatedStyleonly 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;AnimatedStylenow exposesapplyToView, whichcreateAnimatedComponentcalls 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.e1a8ad2: Infer reanimated hook dependencies at runtime by tracking shared-value reads. No babel plugin runs on Lightning, so
useAnimatedStyle/useDerivedValue/useAnimatedReactionwithout an explicit dependency array never subscribed to their shared values and only updated on re-renders. Shared values fromuseSharedValue/makeMutablenow 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.Updated dependencies [6ced46f]
Updated dependencies [e2a5e11]
Updated dependencies [5237e31]
Updated dependencies [8d0b8e8]
Updated dependencies [df7da6a]
Updated dependencies [69653c6]
Updated dependencies [5e69f9c]
Updated dependencies [c34f03c]
Updated dependencies [ec4f817]
Updated dependencies [3a9a0c7]
Updated dependencies [4a7e3a4]
Updated dependencies [f31d1d1]
Updated dependencies [01a42e4]
Updated dependencies [58a3c4d]
Updated dependencies [7005125]
Updated dependencies [15fb74a]
Updated dependencies [66c2c93]
Updated dependencies [9beb550]
Updated dependencies [6e50057]
Updated dependencies [48f2025]
Updated dependencies [b2492c6]
Updated dependencies [3f4ed43]
Updated dependencies [660ae8d]
Updated dependencies [dded826]
Updated dependencies [8d993ca]
Updated dependencies [f6bee05]
Updated dependencies [43594e7]
Updated dependencies [f2f0c11]
@plextv/react-lightning@0.4.3-alpha.0
Patch Changes
e2a5e11: 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 emitsstopped. 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.5237e31: Add a
flattenLayoutViewsrender 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 ingetRelativePosition/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.8d0b8e8: Fix flattened content not scrolling: a scroll handler (or any code) that writes a flattened element's position straight through
node.x/node.y, bypassingsetProps, now folds through to the hoisted children. The placeholder'sx/yare 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).3a9a0c7: 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
focusableView) are unaffected. Effective focusability trackshasFocusableChildrenand propagates up the ancestor chain, so a group flips back the moment a focusable child mounts (or its last one is removed).01a42e4: 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.7005125: 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.66c2c93: 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-mountingautoFocuschild no longer steals live focus on registration (a newfocusCommittedflag gates the upgrade), matching nativeTVFocusGuideView, which forwards focus on arrival rather than on mount. Anddestinationsare now honoured on arrival (first visit withoutfocusRedirect, every visit with it), so focus forwards to a declared destination then remembers the last-focused child.9beb550: fix(image+border): flatten array styles on Image and paint/clear border shaders on live nodes
The RN
Imagecomponent built its node style with an object spread ({ ...style, w, h }), so an RN style array (style={[a, b]}) became numeric-keyed garbage and itswidth/height/borderRadiuswere silently dropped (the array-flatten polyfill only ran when the style reachedsetPropsstill an array).Imagenow flattens withflattenStylesbefore spreading.Border shaders can now be toggled on an already-mounted node.
borderandborderColorwere 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 aBordershader. 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-colorof0) 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.6e50057: 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
onKeyDownevents (withrepeat: 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 toonLongPresson release.Key events are also normalized into a consistent shape via a new
normalizeKeyEventhelper:keyCodemaps toremoteKey(falling back toKeys.Unknown),repeatis preserved, andpreventDefaultis now bound — previously the raw DOM method was copied unbound, so callingevent.preventDefault()from a handler threw "Illegal invocation".currentTargetis now part of theKeyEventtype rather than bolted on during bubbling.b2492c6: Handle same-parent insertChild as a move so reordered children re-layout in the new order
3f4ed43: 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.
660ae8d: 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
fontsoption) 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, andreact-lightningemits atextChangedsignal so recycled/updated text re-measures.f6bee05: Add an opt-in
roundedClippingrender 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.43594e7: fix(text): support FormattedMessage
@plextv/react-lightning-components@0.4.4-alpha.0
Patch Changes
658f68e: feat(virtuallist): getLayout ref API and skipChildFocusScroll opt-out for FlashList parity
VirtualListRefnow exposesgetLayout(index), returning the scroll-space{ x, y, width, height }rectangle of an item (orundefinedwhen out of range) — mirroring FlashList's per-item layout query for callers that interpolate row positions against the scroll offset (crossfade/parallax). A newskipChildFocusScrollprop opts out of VirtualList's internal focus-follow scroll: a focused child crossing a cell boundary still resolves and persistsfocusedIndex, but the list no longer scrolls the cell into view, letting the app layer own scrolling (e.g. a row that drivesscrollToIndexfrom its own authoritative focused index). Both are additive — default behaviour is unchanged.0647e88: 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.
7f54f81: 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.
f2f0c11: Reveal VirtualList cells off Yoga's
settledsignal 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 emitssettled, so it falls back to the existing timers.Updated dependencies [e2a5e11]
Updated dependencies [5237e31]
Updated dependencies [8d0b8e8]
Updated dependencies [df7da6a]
Updated dependencies [69653c6]
Updated dependencies [5e69f9c]
Updated dependencies [c34f03c]
Updated dependencies [ec4f817]
Updated dependencies [3a9a0c7]
Updated dependencies [4a7e3a4]
Updated dependencies [f31d1d1]
Updated dependencies [01a42e4]
Updated dependencies [7005125]
Updated dependencies [15fb74a]
Updated dependencies [66c2c93]
Updated dependencies [9beb550]
Updated dependencies [6e50057]
Updated dependencies [b2492c6]
Updated dependencies [3f4ed43]
Updated dependencies [660ae8d]
Updated dependencies [dded826]
Updated dependencies [8d993ca]
Updated dependencies [f6bee05]
Updated dependencies [43594e7]
Updated dependencies [f2f0c11]
@plextv/react-native-lightning@0.4.3-alpha.0
Patch Changes
58a3c4d: 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.
9beb550: fix(image+border): flatten array styles on Image and paint/clear border shaders on live nodes
The RN
Imagecomponent built its node style with an object spread ({ ...style, w, h }), so an RN style array (style={[a, b]}) became numeric-keyed garbage and itswidth/height/borderRadiuswere silently dropped (the array-flatten polyfill only ran when the style reachedsetPropsstill an array).Imagenow flattens withflattenStylesbefore spreading.Border shaders can now be toggled on an already-mounted node.
borderandborderColorwere 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 aBordershader. 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-colorof0) 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.48f2025: fix(pressable): expose
focusedto function childrenPressabletracked only{ pressed }in state and passed that to its style/children render functions, sofocusedwas alwaysundefined. Every focus-driven visual built on RN's({ focused }) => …contract — focus rings, focus scale — was dead on Lightning. It also only wiredonFocus/onBlurto the node when the consumer passed those callbacks, so a focusable with no listeners tracked nothing.Pressablenow tracksfocusedin state, updates it on focus/blur regardless of whether the consumer passesonFocus/onBlur(still forwarding to them), and passes{ focused, pressed }to its function children — matching React Native. Thepressedsetters no longer replace the whole state object, so a keypress can't clobberfocused.Updated dependencies [6ced46f]
Updated dependencies [e2a5e11]
Updated dependencies [5237e31]
Updated dependencies [8d0b8e8]
Updated dependencies [df7da6a]
Updated dependencies [69653c6]
Updated dependencies [5e69f9c]
Updated dependencies [c34f03c]
Updated dependencies [ec4f817]
Updated dependencies [3a9a0c7]
Updated dependencies [4a7e3a4]
Updated dependencies [f31d1d1]
Updated dependencies [01a42e4]
Updated dependencies [7005125]
Updated dependencies [15fb74a]
Updated dependencies [66c2c93]
Updated dependencies [9beb550]
Updated dependencies [6e50057]
Updated dependencies [b2492c6]
Updated dependencies [3f4ed43]
Updated dependencies [660ae8d]
Updated dependencies [658f68e]
Updated dependencies [dded826]
Updated dependencies [8d993ca]
Updated dependencies [f6bee05]
Updated dependencies [43594e7]
Updated dependencies [0647e88]
Updated dependencies [7f54f81]
Updated dependencies [f2f0c11]
@plextv/react-native-lightning-components@0.4.3-alpha.0
Patch Changes
@plextv/vite-plugin-react-native-lightning@0.4.4-alpha.0
Patch Changes
@plextv/vite-plugin-react-reanimated-lightning@0.4.4-alpha.0
Patch Changes
@plextv/react-lightning-example@0.4.4-alpha.0
Patch Changes
@plextv/react-native-lightning-example@0.4.4-alpha.0
Patch Changes
@plextv/react-lightning-storybook@0.4.4-alpha.0
Patch Changes