Skip to content

Port upstream performance work and features from 25 September to 11 October 2026 #905

Open

Description

@Ernxst

The fork has none of the upstream (remorses/gpuix) performance work and features merged between 25 September and 11 October 2026, most of it from remorses/gpuix#88. This issue lists what to port, what to skip and why. Porting waits until we decide to start pulling upstream again.

Upstream main was at 6a5c7c1 when this list was made. The last sync was #614 (upstream 0.10 without the Solid renderer). Upstream's Dialog, Tab and Escape defaults and dismiss layer stack came in through #746, and fill="window" on anchored is already here.

Why each item is a port, not a merge

Upstream moved its shared adapter runtime into packages/native/js/ (mutations.ts, host-runtime.ts, idle-gc.ts, testing.ts) so that @gpuix/solid can share it with React. The fork skipped that move with Solid, and several of the commits below land in that layer. Of the 135 files upstream changed under packages/ and examples/ since the merge base 7ac9880, the fork has also changed 56, including renderer.rs, retained_tree.rs, style.rs and host-config.ts. Port each item as its own change against the fork's code, using the upstream commit as the reference. Do not merge upstream/main.

Port: performance

These change no public API. Each port needs a test or benchmark that shows the saved work, as the upstream commit does.

Upstream commit What it saves
782607b repaint only when a batch changed something A mutation batch that changes nothing no longer invalidates the window
d8cf51a track host bounds from paint Drops the extra child node per host that recorded bounds
720e975 focus sync visits only focusable elements Focus sync no longer walks the whole retained tree
c027782 store sparse host metadata out of line Smaller retained-tree nodes
be82b36 compile the highlight query once per keystroke Syntax highlighting no longer recompiles its query per edit
cd76744 skip unchanged style and custom prop updates An update whose style or custom props are equal by value sends nothing to native
b5789d9 diff event handlers over the props an element has Event-handler diffing no longer scans every known event prop
a1b3441 release temporary host child lists Lower memory after large commits
239f16d root.render() keeps one context value Every useGpuix consumer stops re-rendering on each root.render()

The fork has the bug that the last row fixes. root.render builds a new { renderer } object on every call, so the GpuixContext value changes identity each time.

Port: features, under DOM names

The fork matches react-dom, so each of these lands under the name the DOM or react-dom uses, not upstream's name.

Upstream commit Upstream API Fork API
d47fb1d createPortal createPortal(children, element) with react-dom's signature
f3eede6 registerFont FontFace and document.fonts.add(). The fork has no font loading today
5d86e4f getElementsAt(x, y) document.elementsFromPoint() and elementFromPoint()
d789ba4, a064295, 90c6ad0 scrollbarColor paints a thumb on scroll containers and virtual lists scrollbarColor as in CSS. The fork accepts scrollbarWidth (auto, none) but paints no scrollbar thumb
447ade9 padding on a virtual list insets its rows Same; CSS already behaves this way
4f62248 collectGarbageWhenIdle root option Same name; it has no DOM equivalent

d8fd814 ends hover when the pointer leaves the window. The fork handles window exit for drags in renderer.rs, but nobody has checked whether hover styles and pointerleave fire there. Start with the test from that commit; port the fix only if the test fails on the fork.

Port: Windows ARM64

bb8a357 and f221650 build, test and package aarch64-pc-windows-msvc beside x64. Adding it means a new release tarball, so the release steps in docs/releasing.md change with it.

Skip

Upstream change Why the fork skips it
onLayout, onScrollChange The fork has ResizeObserver and DOM-style onScroll
Keyboard focus dims other controls, with no default focus ring, and the keyboardFocusDim root option The fork follows the browser's focus and focusVisible behaviour
setImagePixels The fork has its own live images and canvas putImageData()
@gpuix/solid, the move of the shared runtime into packages/native/js/, disktree, website changes Out of scope for the fork

Done means

  • Each item under the three Port headings has a merged fork PR or a comment here saying why it was dropped.
  • Each ported feature has a README entry and a skills/gpuix/ entry under its fork name.

Activity

  1. added
    enhancementNew feature or request
    layer:nativeRust and N-API native binding
    layer:reactReact package and reconciler
    parkedDeliberately deferred
    on Oct 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestlayer:nativeRust and N-API native bindinglayer:reactReact package and reconcilerparkedDeliberately deferred

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions