Minor Changes
-
BREAKING CHANGE: Remix UI framework-owned DOM attributes now consistently use the
data-rmx-*namespace. Renamermx-document,rmx-target,rmx-src,rmx-history,rmx-reset-scroll,rmx-preserve-dom, anddata-keytodata-rmx-document,data-rmx-target,data-rmx-src,data-rmx-history,data-rmx-reset-scroll,data-rmx-preserve-dom, anddata-rmx-key. Generated style and module preload markers now usedata-rmx-styleanddata-rmx-module-preloadinstead ofdata-rmx. -
BREAKING CHANGE: During server rendering, script elements with non-string children previously serialized those children as escaped HTML text. They now render empty and report an error. Pass a single string child, such as
JSON.stringify(value), to embed script content without HTML entity escaping. Script-tag sequences that could terminate the element remain escaped. -
BREAKING CHANGE: Remove
addEventListeners(). Use nativetarget.addEventListener(type, listener, { signal })instead. If a listener used the helper's second callback argument, create anAbortControllerand abort it when the listener runs again or its lifetime signal aborts. -
Added a browser-only SPA response protocol to
remix/uifor associating bodyless route responses with Remix UI nodes. Application code uses the higher-levelrender()andrun()APIs fromremix/spa.
Patch Changes
-
Prevent aborted
renderToStreamrequests with multiple blockingFrames from producing unhandled promise rejections that can crash Node servers. -
Changed the scheduler's cascading update guard to warn when many component updates happen in one event-loop turn and only throw the infinite-loop error when a single component instance repeatedly updates itself. This keeps large
clientEntryhydration bursts interactive while still surfacing component names and counts for diagnosis. -
Fixed
mixprop types to accept argument-bearing mixins authored for a base element type on compatible subtype elements. -
Gracefully degrade to document navigations for browsers that do not support the Navigation API (see #11665).
-
Fix
data-rmx-reset-scroll="false"andnavigate(..., { resetScroll: false })to preserve the current scroll position. Default navigations now leave scroll resets and history restoration to the browser. -
Adjust CSS escaping to preserve CSS range media queries such as
@media (width < 900px)in server-renderedcss()output while continuing to neutralize literal closing</style>tags. -
Restore saved scroll positions for intercepted back and forward navigations when client entry reconciliation temporarily shrinks the document or triggers scroll anchoring, while continuing to wait for nested blocking frames before the Navigation API restores scrolling.
-
Prevent Safari Navigation API scroll resets from desynchronizing page hit testing after intercepted push and replace navigations (see WebKit bug 309542).