Skip to content

feat: gesture callback memo#2277

Merged
Yradex merged 1 commit intolynx-family:mainfrom
f0rdream:gesture_removal
Mar 3, 2026
Merged

feat: gesture callback memo#2277
Yradex merged 1 commit intolynx-family:mainfrom
f0rdream:gesture_removal

Conversation

@f0rdream
Copy link
Copy Markdown
Collaborator

@f0rdream f0rdream commented Feb 28, 2026

Optimize gesture callbacks and relationships to prevent unnecessary gesture registration and rerenders.

Summary by CodeRabbit

  • New Features

    • Added a memoized main-thread callback hook to keep gesture callbacks stable while executing the latest logic.
  • Bug Fixes

    • Prevented unnecessary state/version bumps and avoided duplicate or self-referential gesture linkages.
  • Tests

    • Added tests for idempotent gesture configuration, composed-gesture deduplication, and memoized-callback behavior.
  • Chores

    • Added a changeset for a patch release and updated build task dependency.

Checklist

  • Tests updated (or not required).
  • Documentation updated (or not required).
  • Changeset added, and when a BREAKING CHANGE occurs, it needs to be clearly marked (or not required).

@changeset-bot
Copy link
Copy Markdown

changeset-bot bot commented Feb 28, 2026

🦋 Changeset detected

Latest commit: 8a24244

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 1 package
Name Type
@lynx-js/gesture-runtime Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Feb 28, 2026

📝 Walkthrough

Walkthrough

Adds a main-thread memoization hook, conditions and deduplicates gesture config/relationship updates to avoid unnecessary execId bumps, adds tests for idempotency and memo behavior, updates build task dependency, and adds a changeset recording a patch bump for the package.

Changes

Cohort / File(s) Summary
Changeset
/.changeset/breezy-hounds-doubt.md
Adds a patch changeset for @lynx-js/gesture-runtime describing the optimization and change note.
New Hook
packages/lynx/gesture-runtime/src/utils/useMainThreadMemoizedFn.ts
Adds useMainThreadMemoizedFn<T extends noop>(fn: T): T, a hook returning a stable wrapper that delegates to the latest function on main thread/worklet.
Gesture core logic
packages/lynx/gesture-runtime/src/baseGesture.ts
Refactors updateConfig/updateCallback and relation methods to deduplicate, ignore self-references/duplicates, expand composed gestures, and only increment execId / mutate state when new values/associations are actually introduced.
Tests
packages/lynx/gesture-runtime/__test__/gesture-config.test.ts, packages/lynx/gesture-runtime/__test__/gesture-relations.test.tsx, packages/lynx/gesture-runtime/__test__/useMainThreadMemoizedFn.test.tsx
Adds tests covering idempotent config updates, deduplicated composed-gesture relationships, and stable memoized callback behavior (main/background execution and args/return handling).
Build config
packages/lynx/gesture-runtime/turbo.jsonc
Adds "//#build" to the build task's dependsOn array as an explicit prerequisite.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • feat: add gesture-runtime #1984 — touches the same gesture-runtime internals (baseGesture execId/relationship logic and memo utility) and may overlap with these changes.

Suggested reviewers

  • Yradex
  • colinaaa

Poem

🐇 I hide a memo in my paw, snug and light,
Worklets call steady while the main stays bright,
Exec IDs sleep until something truly new,
Tests nibble duplicates — hop, verify, and chew! ✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Title check ❓ Inconclusive The title 'feat: gesture callback memo' is vague and does not clearly convey the main objective of the changeset, which is to optimize gesture callbacks and relationships to prevent unnecessary gesture registration and rerenders. Consider using a more descriptive title such as 'feat: optimize gesture callbacks to prevent unnecessary registration' that better reflects the core optimization goals.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
packages/lynx/gesture-runtime/src/utils/useMainThreadMemoizedFn.ts (1)

53-56: Consider: Returning undefined may surprise callers if T has a non-void return type.

When currentFn is falsy, the function returns undefined as ReturnType<T>. If T is typed as () => number, callers might not expect undefined. This is a defensive edge case (should rarely occur given the ref is initialized), but documenting this behavior or throwing an error might be clearer.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/lynx/gesture-runtime/src/utils/useMainThreadMemoizedFn.ts` around
lines 53 - 56, The helper useMainThreadMemoizedFn currently returns undefined
when currentFn is falsy which can violate callers' expectations for non-void T;
update the function to either (A) assert/panic when currentFn is missing (throw
a descriptive Error inside useMainThreadMemoizedFn where currentFn is checked)
so callers never get undefined, or (B) make the function's return type explicit
about optionality (change the signature to ReturnType<T> | undefined and update
any call sites/types). Locate the logic around currentFn in
useMainThreadMemoizedFn and implement one of these fixes (prefer throwing a
clear error referencing useMainThreadMemoizedFn/currentFn if you want fail-fast
behavior).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@packages/lynx/gesture-runtime/__test__/gesture-config.test.ts`:
- Around line 15-17: The MainThreadFunction mock defined as MainThreadFunction =
{ _wkltId: 'bdd4:dd564:2' } is unused in gesture-config.test.ts; either remove
that declaration to clean up the test file or, if it is intended for future
assertions, use it explicitly in the relevant test(s) (e.g., reference
MainThreadFunction where a worker/main-thread id is asserted) and add a short
comment explaining its purpose so its presence is justified.

---

Nitpick comments:
In `@packages/lynx/gesture-runtime/src/utils/useMainThreadMemoizedFn.ts`:
- Around line 53-56: The helper useMainThreadMemoizedFn currently returns
undefined when currentFn is falsy which can violate callers' expectations for
non-void T; update the function to either (A) assert/panic when currentFn is
missing (throw a descriptive Error inside useMainThreadMemoizedFn where
currentFn is checked) so callers never get undefined, or (B) make the function's
return type explicit about optionality (change the signature to ReturnType<T> |
undefined and update any call sites/types). Locate the logic around currentFn in
useMainThreadMemoizedFn and implement one of these fixes (prefer throwing a
clear error referencing useMainThreadMemoizedFn/currentFn if you want fail-fast
behavior).

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 94e5779 and 681a7a6.

📒 Files selected for processing (5)
  • .changeset/breezy-hounds-doubt.md
  • packages/lynx/gesture-runtime/__test__/gesture-config.test.ts
  • packages/lynx/gesture-runtime/__test__/useMainThreadMemoizedFn.test.tsx
  • packages/lynx/gesture-runtime/src/baseGesture.ts
  • packages/lynx/gesture-runtime/src/utils/useMainThreadMemoizedFn.ts

@codecov
Copy link
Copy Markdown

codecov bot commented Feb 28, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ All tests successful. No failed tests found.

📢 Thoughts on this report? Let us know!

@f0rdream f0rdream force-pushed the gesture_removal branch 2 times, most recently from 380a88a to cc2f49d Compare March 2, 2026 08:19
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
packages/lynx/gesture-runtime/__test__/gesture-config.test.ts (1)

244-255: Consider extending this test to composed/self and same-id clone cases.

Current coverage validates duplicate insertion for the same instance, but not for composed arrays that may contain this, nor clone-equivalent gestures with the same id. Adding those cases would protect the dedupe contract more completely.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/lynx/gesture-runtime/__test__/gesture-config.test.ts` around lines
244 - 255, Extend the existing test that asserts execId doesn't increment for
duplicate relationships to also cover (1) composed/self relationships: call
externalSimultaneous with arrays that include the gesture itself (e.g., pass an
array containing pan1 and other gestures) and re-call with the same composed
array to assert pan1.execId remains unchanged, and (2) clone-equivalent
gestures: create another gesture instance with the same id as pan1 (or use
whatever cloning API produces an instance with identical id) and call
externalSimultaneous with that clone, asserting execId does not increment.
Target the existing symbols PanGesture, TapGesture, externalSimultaneous, and
execId when adding these assertions so the dedupe contract for composed/self and
same-id clones is validated.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@packages/lynx/gesture-runtime/src/baseGesture.ts`:
- Around line 200-207: The current expansion of composed gestures can add "this"
or duplicate gestures by object reference; update the creation of newGestures
(after calling gesture.toGestureArray()) to first filter out any gesture whose
identity matches the current instance (compare g === this or g.id === this.id)
and then dedupe by gesture.id (use a Set of ids to only keep the first
occurrence of each id) before computing newGestures and updating this.waitFor
and this.execId; apply the same id-based self-filter-and-dedupe logic to the
other equivalent blocks that perform this expansion (the other uses of
toGestureArray()/this.waitFor in the file).

---

Nitpick comments:
In `@packages/lynx/gesture-runtime/__test__/gesture-config.test.ts`:
- Around line 244-255: Extend the existing test that asserts execId doesn't
increment for duplicate relationships to also cover (1) composed/self
relationships: call externalSimultaneous with arrays that include the gesture
itself (e.g., pass an array containing pan1 and other gestures) and re-call with
the same composed array to assert pan1.execId remains unchanged, and (2)
clone-equivalent gestures: create another gesture instance with the same id as
pan1 (or use whatever cloning API produces an instance with identical id) and
call externalSimultaneous with that clone, asserting execId does not increment.
Target the existing symbols PanGesture, TapGesture, externalSimultaneous, and
execId when adding these assertions so the dedupe contract for composed/self and
same-id clones is validated.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 681a7a6 and fd57d13.

📒 Files selected for processing (6)
  • .changeset/breezy-hounds-doubt.md
  • packages/lynx/gesture-runtime/__test__/gesture-config.test.ts
  • packages/lynx/gesture-runtime/__test__/useMainThreadMemoizedFn.test.tsx
  • packages/lynx/gesture-runtime/src/baseGesture.ts
  • packages/lynx/gesture-runtime/src/utils/useMainThreadMemoizedFn.ts
  • packages/lynx/gesture-runtime/turbo.jsonc
🚧 Files skipped from review as they are similar to previous changes (1)
  • packages/lynx/gesture-runtime/src/utils/useMainThreadMemoizedFn.ts

@codspeed-hq
Copy link
Copy Markdown

codspeed-hq bot commented Mar 2, 2026

Merging this PR will improve performance by 6.14%

⚡ 2 improved benchmarks
✅ 70 untouched benchmarks
⏩ 3 skipped benchmarks1

Performance Changes

Benchmark BASE HEAD Efficiency
basic-performance-div-10000 485.4 ms 457.8 ms +6.03%
basic-performance-div-100 7.4 ms 6.9 ms +6.14%

Comparing f0rdream:gesture_removal (8a24244) with main (8ca97fe)

Open in CodSpeed

Footnotes

  1. 3 benchmarks were skipped, so the baseline results were used instead. If they were deleted from the codebase, click here and archive them to remove them from the performance reports.

@relativeci
Copy link
Copy Markdown

relativeci bot commented Mar 2, 2026

Web Explorer

#7888 Bundle Size — 383.64KiB (0%).

8a24244(current) vs 8ca97fe main#7876(baseline)

Bundle metrics  Change 1 change
                 Current
#7888
     Baseline
#7876
No change  Initial JS 154.78KiB 154.78KiB
No change  Initial CSS 35.06KiB 35.06KiB
No change  Cache Invalidation 0% 0%
No change  Chunks 8 8
No change  Assets 8 8
Change  Modules 238(-0.42%) 239
No change  Duplicate Modules 16 16
No change  Duplicate Code 2.99% 2.99%
No change  Packages 4 4
No change  Duplicate Packages 0 0
Bundle size by type  no changes
                 Current
#7888
     Baseline
#7876
No change  JS 252.72KiB 252.72KiB
No change  Other 95.85KiB 95.85KiB
No change  CSS 35.06KiB 35.06KiB

Bundle analysis reportBranch f0rdream:gesture_removalProject dashboard


Generated by RelativeCIDocumentationReport issue

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
packages/lynx/gesture-runtime/src/baseGesture.ts (1)

200-260: Consider extracting shared relation-dedupe logic into a helper.

externalWaitFor, externalSimultaneous, and externalContinueWith now share nearly identical filtering/dedupe blocks. A small helper would reduce drift risk.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/lynx/gesture-runtime/src/baseGesture.ts` around lines 200 - 260,
Extract the repeated gestures filtering/dedupe logic into a private helper
(e.g., normalizeAndDedupeRelations) and call it from externalWaitFor,
externalSimultaneous and externalContinueWith; the helper should accept the
incoming GestureKind (or already-expanded BaseGesture[]), the current relation
array (this.waitFor / this.simultaneousWith / this.continueWith) and the current
instance (this) and return an array of new gestures to add (excluding self and
existing IDs, preserving dedupe). Replace the in-method filter blocks with a
call to this helper, then only increment execId and concat the returned
newGestures when its length > 0 to preserve existing behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@packages/lynx/gesture-runtime/src/baseGesture.ts`:
- Around line 200-260: Extract the repeated gestures filtering/dedupe logic into
a private helper (e.g., normalizeAndDedupeRelations) and call it from
externalWaitFor, externalSimultaneous and externalContinueWith; the helper
should accept the incoming GestureKind (or already-expanded BaseGesture[]), the
current relation array (this.waitFor / this.simultaneousWith /
this.continueWith) and the current instance (this) and return an array of new
gestures to add (excluding self and existing IDs, preserving dedupe). Replace
the in-method filter blocks with a call to this helper, then only increment
execId and concat the returned newGestures when its length > 0 to preserve
existing behavior.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between fd57d13 and 2ecdcbe.

📒 Files selected for processing (7)
  • .changeset/breezy-hounds-doubt.md
  • packages/lynx/gesture-runtime/__test__/gesture-config.test.ts
  • packages/lynx/gesture-runtime/__test__/gesture-relations.test.tsx
  • packages/lynx/gesture-runtime/__test__/useMainThreadMemoizedFn.test.tsx
  • packages/lynx/gesture-runtime/src/baseGesture.ts
  • packages/lynx/gesture-runtime/src/utils/useMainThreadMemoizedFn.ts
  • packages/lynx/gesture-runtime/turbo.jsonc
🚧 Files skipped from review as they are similar to previous changes (2)
  • packages/lynx/gesture-runtime/turbo.jsonc
  • packages/lynx/gesture-runtime/test/useMainThreadMemoizedFn.test.tsx

@f0rdream f0rdream requested a review from Yradex March 2, 2026 08:59
@f0rdream f0rdream requested a review from Yradex March 2, 2026 13:04
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (3)
packages/lynx/gesture-runtime/__test__/gesture-config.test.ts (1)

244-255: Optionally assert relation storage state in addition to execId.

You can strengthen this test by asserting the relation list length stays unchanged (e.g., simultaneousWith.length === 1) after duplicate registration.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/lynx/gesture-runtime/__test__/gesture-config.test.ts` around lines
244 - 255, The test should also assert that adding a duplicate relationship does
not change the internal relation storage: after calling
pan1.externalSimultaneous(tap1) the second time, in addition to expecting
pan1.execId to remain 1, assert that the internal relation list (e.g.,
pan1.simultaneousWith or whatever collection is used by PanGesture to track
externalSimultaneous relationships) still has length 1 to ensure duplicates are
not stored; update the test case around PanGesture, tap1, externalSimultaneous,
execId, and simultaneousWith to include this extra expectation.
packages/lynx/gesture-runtime/__test__/useMainThreadMemoizedFn.test.tsx (1)

16-89: Consider extracting shared test harness for readability.

The first two tests duplicate App setup and update flow; a small helper would reduce repetition and future drift.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/lynx/gesture-runtime/__test__/useMainThreadMemoizedFn.test.tsx`
around lines 16 - 89, Both tests duplicate the same component/setup/update flow;
extract a shared test harness to reduce repetition by creating a helper function
(e.g., createMemoizedApp or mountMemoizedApp) that renders the App which uses
useMainThreadMemoizedFn and returns {memoizedFnRef, setCount} (or exposes the
run/render options), then replace the inline App definitions in both tests with
calls to that helper and reuse its returned memoizedFnRef and _setCount; ensure
the helper supports passing render options
(enableMainThread/enableBackgroundThread) so both test variants can call
runWorklet and act as before.
packages/lynx/gesture-runtime/src/baseGesture.ts (1)

151-165: Optional: unify duplicated callback-update logic.

BaseGesture.updateCallback and ContinuousGesture.updateCallback now carry near-identical control flow; extracting shared internals would lower maintenance overhead.

Also applies to: 279-293

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@packages/lynx/gesture-runtime/src/baseGesture.ts` around lines 151 - 165,
BaseGesture.updateCallback and ContinuousGesture.updateCallback duplicate the
same control flow; extract the shared logic into a single private helper (e.g.,
BaseGesture.prototype.setWrappedCallback or similar) that takes (k: keyof typeof
this.callbacks, cb: GestureCallback<TEvent>) and performs the execId bump check,
wraps the callback via wrapCallback(this.id, k) and assigns into this.callbacks
preserving types; then have both BaseGesture.updateCallback and
ContinuousGesture.updateCallback call that helper so execId, callbacks, id, and
wrapCallback usage are centralized and types remain intact.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@packages/lynx/gesture-runtime/__test__/gesture-config.test.ts`:
- Around line 244-255: The test should also assert that adding a duplicate
relationship does not change the internal relation storage: after calling
pan1.externalSimultaneous(tap1) the second time, in addition to expecting
pan1.execId to remain 1, assert that the internal relation list (e.g.,
pan1.simultaneousWith or whatever collection is used by PanGesture to track
externalSimultaneous relationships) still has length 1 to ensure duplicates are
not stored; update the test case around PanGesture, tap1, externalSimultaneous,
execId, and simultaneousWith to include this extra expectation.

In `@packages/lynx/gesture-runtime/__test__/useMainThreadMemoizedFn.test.tsx`:
- Around line 16-89: Both tests duplicate the same component/setup/update flow;
extract a shared test harness to reduce repetition by creating a helper function
(e.g., createMemoizedApp or mountMemoizedApp) that renders the App which uses
useMainThreadMemoizedFn and returns {memoizedFnRef, setCount} (or exposes the
run/render options), then replace the inline App definitions in both tests with
calls to that helper and reuse its returned memoizedFnRef and _setCount; ensure
the helper supports passing render options
(enableMainThread/enableBackgroundThread) so both test variants can call
runWorklet and act as before.

In `@packages/lynx/gesture-runtime/src/baseGesture.ts`:
- Around line 151-165: BaseGesture.updateCallback and
ContinuousGesture.updateCallback duplicate the same control flow; extract the
shared logic into a single private helper (e.g.,
BaseGesture.prototype.setWrappedCallback or similar) that takes (k: keyof typeof
this.callbacks, cb: GestureCallback<TEvent>) and performs the execId bump check,
wraps the callback via wrapCallback(this.id, k) and assigns into this.callbacks
preserving types; then have both BaseGesture.updateCallback and
ContinuousGesture.updateCallback call that helper so execId, callbacks, id, and
wrapCallback usage are centralized and types remain intact.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2ecdcbe and 8a24244.

📒 Files selected for processing (7)
  • .changeset/breezy-hounds-doubt.md
  • packages/lynx/gesture-runtime/__test__/gesture-config.test.ts
  • packages/lynx/gesture-runtime/__test__/gesture-relations.test.tsx
  • packages/lynx/gesture-runtime/__test__/useMainThreadMemoizedFn.test.tsx
  • packages/lynx/gesture-runtime/src/baseGesture.ts
  • packages/lynx/gesture-runtime/src/utils/useMainThreadMemoizedFn.ts
  • packages/lynx/gesture-runtime/turbo.jsonc
🚧 Files skipped from review as they are similar to previous changes (3)
  • packages/lynx/gesture-runtime/test/gesture-relations.test.tsx
  • packages/lynx/gesture-runtime/src/utils/useMainThreadMemoizedFn.ts
  • packages/lynx/gesture-runtime/turbo.jsonc

@Yradex Yradex merged commit dc27f64 into lynx-family:main Mar 3, 2026
79 of 80 checks passed
colinaaa pushed a commit that referenced this pull request Mar 9, 2026
This PR was opened by the [Changesets
release](https://github.com/changesets/action) 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.


# Releases
## @lynx-js/devtool-mcp-server@0.5.0

### Minor Changes

- Use `@lynx-js/devtool-connector` instead of
`@lynx-js/debug-router-connector`.
([#2284](#2284))

The new connector avoids using keep-alive connections, which makes the
connection much more reliable.

- **BREAKING CHANGE**: Remove the `./debug-router-connector` exports.
([#2284](#2284))

## @lynx-js/web-elements@0.12.0

### Minor Changes

- feat: add `willchange` event to `x-viewpager-ng`
([#2305](#2305))

### Patch Changes

- fix: firefox `@supports(width:1rex)`
([#2288](#2288))

- fix: check computed overflow style in `getTheMostScrollableKid` to
avoid treating `overflow: visible` elements as scroll containers
([#2309](#2309))

- fix: the inline-truncation should only work as a direct child of
x-text ([#2287](#2287))

- fix: getVisibleCells cannot work in firefox due to
contentvisibilityautostatechange not propagate list-item
([#2308](#2308))

- fix: foldview stuck issue
([#2304](#2304))

## @lynx-js/gesture-runtime@2.1.3

### Patch Changes

- Optimize gesture callbacks and relationships to prevent unnecessary
gesture registration and rerenders.
([#2277](#2277))

## @lynx-js/react@0.116.5

### Patch Changes

- Improve React runtime hook profiling.
([#2235](#2235))
Enable Profiling recording first, then enter the target page so the
trace includes full render/hydrate phases.

- Record trace events for `useEffect` / `useLayoutEffect` hook entry,
callback, and cleanup phases.
    -   Log trace events for `useState` setter calls.
- Wire `profileFlowId` support in debug profile utilities and attach
flow IDs to related hook traces.
- Instrument hydrate/background snapshot profiling around patch
operations with richer args (e.g. snapshot id/type, dynamic part index,
value type, and source when available).
- Capture vnode source mapping in dev and use it in profiling args to
improve trace attribution.
- Expand debug test coverage for profile utilities, hook profiling
behavior, vnode source mapping, and hydrate profiling branches.

- refactor: call loadWorkletRuntime once in each module
([#2315](#2315))

## @lynx-js/rspeedy@0.13.5

### Patch Changes

- feat: opt-in the web platform's new binary output format
([#2281](#2281))

    Introduce a new flag to enable the new binary output format.

Currently it's an internal-use-only flag that will be removed in the
future; set the corresponding environment variable to 'true' to enable
it.

- Avoid generating `Rsbuild vundefined` in greeting message.
([#2275](#2275))

-   Updated dependencies \[]:
    -   @lynx-js/web-rsbuild-server-middleware@0.19.8

## @lynx-js/lynx-bundle-rslib-config@0.2.2

### Patch Changes

- Support bundle and load css in external bundle
([#2143](#2143))

## @lynx-js/external-bundle-rsbuild-plugin@0.0.3

### Patch Changes

- Updated dependencies
\[[`c28b051`](c28b051),
[`4cbf809`](4cbf809)]:
    -   @lynx-js/externals-loading-webpack-plugin@0.0.4

## @lynx-js/react-rsbuild-plugin@0.12.10

### Patch Changes

- Support bundle and load css in external bundle
([#2143](#2143))

- Updated dependencies
\[[`59f2933`](59f2933),
[`453e006`](453e006)]:
    -   @lynx-js/template-webpack-plugin@0.10.5
    -   @lynx-js/css-extract-webpack-plugin@0.7.0
    -   @lynx-js/react-webpack-plugin@0.7.4
    -   @lynx-js/react-alias-rsbuild-plugin@0.12.10
    -   @lynx-js/use-sync-external-store@1.5.0
    -   @lynx-js/react-refresh-webpack-plugin@0.3.4

## @lynx-js/web-core-wasm@0.0.5

### Patch Changes

- Updated dependencies
\[[`4963907`](4963907),
[`8fd936a`](8fd936a),
[`0d41253`](0d41253),
[`d32c4c6`](d32c4c6),
[`7518b72`](7518b72),
[`fca9d4a`](fca9d4a)]:
    -   @lynx-js/web-elements@0.12.0

## @lynx-js/externals-loading-webpack-plugin@0.0.4

### Patch Changes

- perf: optimize external bundle loading by merging multiple
`fetchBundle` calls for the same URL into a single request.
([#2307](#2307))

- Support bundle and load css in external bundle
([#2143](#2143))

## @lynx-js/template-webpack-plugin@0.10.5

### Patch Changes

- feat: allow `templateDebugUrl` to be customized via
`output.publicPath` or the `beforeEncode` hook.
([#2274](#2274))

- feat: opt-in the web platform's new binary output format
([#2281](#2281))

    Introduce a new flag to enable the new binary output format.

Currently it's an internal-use-only flag that will be removed in the
future; set the corresponding environment variable to 'true' to enable
it.

-   Updated dependencies \[]:
    -   @lynx-js/web-core-wasm@0.0.5

## create-rspeedy@0.13.5



## @lynx-js/react-alias-rsbuild-plugin@0.12.10



## upgrade-rspeedy@0.13.5

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants