Skip to content

Release v3.1.0 - #11978

Open
remix-run-bot wants to merge 1 commit into
mainfrom
release-pr/main
Open

remix-run-bot wants to merge 1 commit into
mainfrom
release-pr/main

Conversation

@remix-run-bot

@remix-run-bot remix-run-bot commented Oct 7, 2026 •

Copy link
Copy Markdown
Contributor

This PR is managed by the release-pr workflow. Do not edit it manually. See CONTRIBUTING.md for more.

Releases

Package Version
remix 3.0.0 → 3.1.0
@remix-run/assets 1.0.0 → 1.0.1
@remix-run/cli 1.0.0 → 1.0.1
@remix-run/component 1.0.0 → 1.1.0
@remix-run/compression-middleware 1.0.0 → 1.0.1
@remix-run/render-middleware 1.0.0 → 1.0.1
@remix-run/response 1.0.0 → 1.0.1
@remix-run/spa 1.0.0 → 1.0.1
@remix-run/static-middleware 1.0.0 → 1.0.1
@remix-run/ui 0.12.1 → 0.13.0

Changelogs

remix v3.1.0

Minor Changes

  • Mixins created through remix/component can use createMixin(setup, { ssr: false }) to skip setup and render on the server while keeping browser behavior and hydration. Server rendering remains enabled by default. The option is intended for behavior that does not contribute to the server HTML.

  • Use frame.reload({ src, method, encType, body }) from remix/component to reload another source or submit data and render the response without changing browser history. FormData follows GET query and POST encoding defaults, with multipart and plain-text encodings available (see Support source changes and form submissions in frame.reload() #11938).

  • remix/component supports disabling automatic focus resets during intercepted navigation. Scroll and focus controls accept "after-transition" and "manual" in navigate() / link() options and HTML attributes, while existing boolean values remain supported (see Add focus reset controls and Navigation API option values #11939).

Patch Changes

@remix-run/assets v1.0.1

Patch Changes

  • Reduce server rendering work by caching getScriptEntry() metadata between calls. Watched file changes and browser HMR events clear the cache, failed requests can be retried, and each caller receives a separate copy of the metadata.

  • Ensure script entries requested after an HMR update use current cache-busting URLs.

  • Avoid competing frame refreshes when a browser HMR update requires a full page reload. Server updates now wait for pending browser updates before refreshing server-rendered content.

  • Reduce rebuild work in watch mode. When a watched script changes, modules that import it are no longer transformed again because their own source did not change, and barrel file import analysis reuses its results for unchanged modules instead of parsing them again.

@remix-run/cli v1.0.1

Patch Changes

  • New apps now derive AppContext from the router with RouterContext<typeof router> instead of declaring it up front and passing it to createRouter<AppContext>(). The explicit type argument turned off middleware inference, so middleware added to the router later (such as formData()) did not show up on context in controllers. This also matches the setup shown in the Remix guides.

    Existing generated apps can apply the same setup in app/router.ts:

    -import { createRouter, type MiddlewareContext } from 'remix/router'
    +import { createRouter, type RouterContext } from 'remix/router'
    
    -const renderMiddleware = render({ assets })
    -type AppContext = MiddlewareContext<[typeof renderMiddleware]>
    +export const router = createRouter({
    +  middleware: [staticFiles('./public', { index: false }), render({ assets })],
    +})
    +
    +export type AppContext = RouterContext<typeof router>
    
     declare module 'remix' {
       interface RouterTypes {
         context: AppContext
       }
     }
    
    -export const router = createRouter<AppContext>({
    -  middleware: [staticFiles('./public', { index: false }), renderMiddleware],
    -})
  • Bumped @remix-run/* dependencies:

@remix-run/component v1.1.0

Minor Changes

  • Mixins that only add browser behavior can skip server rendering with createMixin(setup, { ssr: false }). The server skips their setup and render functions, including when another mixin returns them. The browser still initializes them during hydration and later renders. Server rendering remains enabled by default.

    import { createMixin } from 'remix/component'
    
    const focusOnInsert = createMixin<HTMLElement>(
      (handle) => {
        handle.addEventListener('insert', ({ node }) => node.focus())
      },
      { ssr: false },
    )

    Use this option only when the mixin does not contribute to the server HTML. The built-in on and ref mixins now use it. MixinOptions is exported for typed options.

  • Add options to frame.reload() to support setting the src and imperative frame submissions.

    • Reload a different source via frame.reload({ src }) and skip frame.src = "..."
    • Submit data through a frame reload via frame.reload({ method, encType, body }) without changing browser history
    • Like <form>, the method defaults to GET, which puts FormData fields in the source query; POST defaults to URL encoding, with multipart and plain-text encoding available through encType
  • Disable automatic focus resets during intercepted navigation with data-rmx-reset-focus="manual" on links, forms, or submit buttons, or with resetFocus: 'manual' in navigate() and link() (see Add focus reset controls and Navigation API option values #11939).

    Scroll and focus controls accept the Navigation API values "after-transition" (the default) and "manual". Use the same values for resetScroll and resetFocus options and data-rmx-reset-scroll and data-rmx-reset-focus attributes. Existing boolean options and "true" / "false" attributes remain supported: true corresponds to "after-transition" and false to "manual".

Patch Changes

  • Fix frame navigation for forms whose submit button is removed immediately after submission, including buttons reused across forms while an earlier submission is still pending (see fix(component): resolve form navigation when submitter is detached before navigate fires #11987). Preserve the original POST data across additional FormData snapshots and keep later canceled submissions on the same or another form from replacing the pending navigation.

  • Fix server rendering so components rendered after a nested component subtree no longer reuse handle.id values from that subtree.

  • Treat client entry href values as the same identity across HMR updates when they differ only by a cache-busting t timestamp query parameter.

  • Include unsafeHTML() guidance in raw HTML prop errors (innerHTML, srcDoc, and srcdoc) and clarify that outerHTML is not supported on host elements.

  • Preserve explicit and inferred generic component prop types in JSX, including components typed with partial handles (see Keep generic component props typed in JSX #11942).

  • Fix unintended input blur when frame updates remove or replace sibling content, such as when a search returns no results or its query is cleared (see Add focus reset controls and Navigation API option values #11939).

  • Improve server rendering throughput and reduce temporary allocations by skipping unused mixin and attribute work, and closing responses directly when no frame content remains. Blocking frames still resolve before the first HTML chunk.

  • Reduce server rendering work by writing ordinary HTML into a shared chunk list, awaiting blocking frames directly instead of scanning the rendered tree, skipping DOM event mixin setup, avoiding delete when merging class props, and inserting head resources and hydration data in a single pass before assembling the final document.

  • Reduce server rendering memory use by assembling each HTML response with a single join and keeping client entry hydration props serialized. Request abort listeners are removed when rendering finishes, fails, or is canceled, so long-lived request signals no longer keep finished renders reachable.

  • Streamed <Frame> content no longer loses items when the browser receives its template in multiple network chunks during initial page loading

  • Restore scroll position when navigating back or forward to a page that previously used resetScroll: false or data-rmx-reset-scroll="false" (see Restore scroll and reset focus on traverse navigations #11989).

@remix-run/compression-middleware v1.0.1

Patch Changes

@remix-run/render-middleware v1.0.1

Patch Changes

@remix-run/response v1.0.1

Patch Changes

  • Reduce memory use when streaming HTML by checking a short prefix for a doctype instead of decoding the whole first chunk. Leading whitespace and declarations that cross the prefix boundary continue to work.

@remix-run/spa v1.0.1

Patch Changes

@remix-run/static-middleware v1.0.1

Patch Changes

@remix-run/ui v0.13.0

Minor Changes

  • BREAKING CHANGE: Prop types for the previously removed styled Accordion, Select, and Combobox components have also been removed: AccordionProps, AccordionItemProps, AccordionTriggerProps, AccordionContentProps, SelectProps, SelectOptionProps, ComboboxProps, and ComboboxOptionProps. Accordion's unused headingLevel prop and corresponding context fields, along with the AccordionHeadingLevel type, have also been removed.

  • BREAKING CHANGE: The toggle mixin is now exported as toggle instead of control. Since toggle consists of a single mixin, it can now be called directly as toggle() rather than grouped under toggle.control().

    -import * as toggle from '@remix-run/ui/toggle'
    +import { toggle } from '@remix-run/ui/toggle'
    
    -<input mix={toggle.control({ defaultChecked: true })} />
    +<input mix={toggle({ defaultChecked: true })} />

    The options type has also been renamed from ToggleControlOptions to ToggleOptions:

    -import type { ToggleControlOptions } from '@remix-run/ui/toggle'
    +import type { ToggleOptions } from '@remix-run/ui/toggle'

Patch Changes

  • Server rendering skips setup and render for animation mixins, keyboard and outside-click helpers, typeahead behavior, and popover anchor and focus helpers. Mixins that provide initial attributes, styles, or ARIA props still run on the server.

  • Bumped @remix-run/* dependencies:

@github-actions

github-actions Bot commented Oct 7, 2026

Copy link
Copy Markdown
Contributor

Preview Build Available

A preview build has been created for this PR. You can install it using:

pnpm install "remix-run/remix#preview/pr-11978&path:packages/remix"

This preview build will be updated automatically as you push new commits.

@remix-run-bot remix-run-bot changed the title Release v3.0.1 Release v3.1.0 Oct 7, 2026
@remix-run-bot
remix-run-bot force-pushed the release-pr/main branch 11 times, most recently from b1977a1 to ee6da0a Compare October 14, 2026 18:05
@remix-run-bot
remix-run-bot force-pushed the release-pr/main branch 9 times, most recently from 3f699dc to edc0b46 Compare October 16, 2026 05:43
- @remix-run/assets: 1.0.0 -> 1.0.1
- @remix-run/cli: 1.0.0 -> 1.0.1
- @remix-run/component: 1.0.0 -> 1.1.0
- @remix-run/compression-middleware: 1.0.0 -> 1.0.1
- @remix-run/render-middleware: 1.0.0 -> 1.0.1
- @remix-run/response: 1.0.0 -> 1.0.1
- @remix-run/spa: 1.0.0 -> 1.0.1
- @remix-run/static-middleware: 1.0.0 -> 1.0.1
- @remix-run/ui: 0.12.1 -> 0.13.0
- remix: 3.0.0 -> 3.1.0
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.

1 participant