Minor Changes
-
BREAKING CHANGE: Browser
resolveFramecallbacks now receive a single options object instead of positional signal and target arguments. UpdateresolveFrame(src, signal, target)implementations to useresolveFrame(src, options)and readoptions?.signalandoptions?.target. -
Added
framesto theappobject returned fromrun(), mirroring the existinghandle.framesAPI -
Added
@remix-run/ui/dev/refreshfor development tooling that needs to reconcile mounted roots after component modules update. -
Same-origin forms now progressively enhance into frame navigations when
run({ resolveFrame })is configured. Native constraint validation runs before interception, submissions target the top frame by default,rmx-targetselects a named frame, andrmx-documentopts back into document navigation. For non-GET submissions, resolvers receive the browser's nativeFormDataplus the selected method and encoding, and remain responsible for request encoding and_methodconventions. Non-GET submissions to the current URL replace its history entry without retaining theirFormData; submissions to a different URL and GET submissions push a new entry. -
Browser frame resolvers may now return a
Response. Its body is streamed into the frame, and when a top-frame navigation follows a redirect, the final response URL replaces the current navigation entry and becomes the frame's canonicalsrcwithout loading the frame a second time. Direct reloads and named-frame navigations render the redirected response without replacing their canonicalsrcwith the final response URL. -
Add an
rmx-history="push|replace"attribute for anchors and forms that overrides the history behavior of enhanced frame navigations. Native anchors usinglink(href, { history })emit the corresponding attribute value automatically. -
Add an
rmx-preserve-domattribute that tells the DOM reconciler to preserve a matching element's current attributes and children during reloads, allowing client-owned subtrees such as custom elements to manage their own DOM.
Patch Changes
-
Allow element-wide mixins such as
css()to be used on subtype hosts like<select>without TypeScript assignability errors. -
Built-in styled components now use adaptive
light-dark(...)colors for their internal surfaces, text, borders, focus rings, and control states so they render correctly in dark color schemes. -
Escape less-than characters in server-rendered
css()output so style values cannot terminate the generated<style>element. -
Fix hydrated component updates that could lose content when adding elements before existing content in a fragment
-
Prevent navigation and reloads from hanging when a nested
Framemarker moves outside a frame region while the DOM is being updated. -
Preserve client entry and frame state only for live boundaries with matching semantic identities, while replacing pending client entry SSR during reloads and releasing temporary response metadata after hydration or cancellation.
-
Prevent client-side document navigation and
Frameupdates from stalling after navigating between pages with differentFramelayouts. A frame's end marker could be reused as the start marker of an incoming frame, which left the frame's region bounds and instance pointing at the wrong nodes. -
Preserve resolved client-created frame content when its parent rerenders while the frame is still pending (see #11659).
-
Prevent document and frame reloads from dropping newly rendered sibling elements when client entries from the previous content are disposed.
-
Reload frames rendered within preserved client entries during ancestor frame reloads
-
Show complete destination server-rendered client entry content during document and frame reloads while replacement modules load, instead of retaining only positionally matched source content.
-
Fix top frame reloads using the previous URL after navigation targets a named frame.