Bug: Remix recipe does not render Puck correctly in new page routes
Description
When using the remix recipe, navigating to new routes (other than the homepage) results in Puck styles not loading correctly, making the editor unusable.
Environment
- Puck version: 0.18.2
Steps to reproduce
- Start a new Puck project using the Remix recipe.
- Navigate to
http://localhost:3000/new-page/edit.
What happens
The editor briefly renders correctly, but then fails to display properly, as if @measured/puck/puck.css wasn’t loaded.
In addition, hydration errors appear in the console:
hook.js:608 Warning: Expected server HTML to contain a matching <link> in <head>. Error Component Stack
at link (<anonymous>)
at Links (components.js:226:7)
at head (<anonymous>)
at html (<anonymous>)
at App (<anonymous>)
at RenderedRoute (hooks.tsx:665:26)
at RenderErrorBoundary (hooks.tsx:591:5)
at DataRoutes2 (index.tsx:767:3)
at Router (components.tsx:421:13)
at RouterProvider2 (index.tsx:489:3)
at RemixErrorBoundary (errorBoundaries.js:17:5)
at RemixBrowser (browser.js:254:45)
overrideMethod @ hook.js:608
react-dom.development.js:12507 Uncaught Error: Hydration failed because the initial UI does not match what was rendered on the server.
at throwOnHydrationMismatch (react-dom.development.js:12507:9)
at tryToClaimNextHydratableInstance (react-dom.development.js:12535:7)
at updateHostComponent (react-dom.development.js:19931:5)
at beginWork (react-dom.development.js:21657:14)
at HTMLUnknownElement.callCallback2 (react-dom.development.js:4164:14)
at Object.invokeGuardedCallbackDev (react-dom.development.js:4213:16)
at invokeGuardedCallback (react-dom.development.js:4277:31)
at beginWork$1 (react-dom.development.js:27490:7)
at performUnitOfWork (react-dom.development.js:26596:12)
at workLoopConcurrent (react-dom.development.js:26582:5)
hook.js:608 Error: Hydration failed because the initial UI does not match what was rendered on the server.
at throwOnHydrationMismatch (react-dom.development.js:12507:9)
at tryToClaimNextHydratableInstance (react-dom.development.js:12535:7)
at updateHostComponent (react-dom.development.js:19931:5)
at beginWork (react-dom.development.js:21657:14)
at beginWork$1 (react-dom.development.js:27465:14)
at performUnitOfWork (react-dom.development.js:26596:12)
at workLoopConcurrent (react-dom.development.js:26582:5)
at renderRootConcurrent (react-dom.development.js:26544:7)
at performConcurrentWorkOnRoot (react-dom.development.js:25777:38)
at workLoop (scheduler.development.js:266:34) Error Component Stack
at RemixRootDefaultErrorBoundary (errorBoundaries.js:70:3)
at ErrorBoundary (routes.js:43:12)
at RenderErrorBoundary (hooks.tsx:591:5)
at DataRoutes2 (index.tsx:767:3)
at Router (components.tsx:421:13)
at RouterProvider2 (index.tsx:489:3)
at RemixErrorBoundary (errorBoundaries.js:17:5)
at RemixBrowser (browser.js:254:45)
overrideMethod @ hook.js:608
hook.js:600 Error: Hydration failed because the initial UI does not match what was rendered on the server. Error Component Stack
at RemixRootDefaultErrorBoundary (errorBoundaries.js:70:3)
at ErrorBoundary (routes.js:43:12)
at RenderErrorBoundary (hooks.tsx:591:5)
at DataRoutes2 (index.tsx:767:3)
at Router (components.tsx:421:13)
at RouterProvider2 (index.tsx:489:3)
at RemixErrorBoundary (errorBoundaries.js:17:5)
at RemixBrowser (browser.js:254:45)
overrideMethod @ hook.js:600
hook.js:608 Error: Hydration failed because the initial UI does not match what was rendered on the server.
at throwOnHydrationMismatch (react-dom.development.js:12507:9)
at tryToClaimNextHydratableInstance (react-dom.development.js:12535:7)
at updateHostComponent (react-dom.development.js:19931:5)
at beginWork (react-dom.development.js:21657:14)
at beginWork$1 (react-dom.development.js:27465:14)
at performUnitOfWork (react-dom.development.js:26596:12)
at workLoopConcurrent (react-dom.development.js:26582:5)
at renderRootConcurrent (react-dom.development.js:26544:7)
at performConcurrentWorkOnRoot (react-dom.development.js:25777:38)
at workLoop (scheduler.development.js:266:34) Error Component Stack
at RemixRootDefaultErrorBoundary (errorBoundaries.js:70:3)
at RemixErrorBoundary (errorBoundaries.js:17:5)
at RemixBrowser (browser.js:254:45)
overrideMethod @ hook.js:608
hook.js:600 Error: Hydration failed because the initial UI does not match what was rendered on the server. Error Component Stack
at RemixRootDefaultErrorBoundary (errorBoundaries.js:70:3)
at RemixErrorBoundary (errorBoundaries.js:17:5)
at RemixBrowser (browser.js:254:45)
overrideMethod @ hook.js:600
hook.js:608 Warning: An error occurred during hydration. The server HTML was replaced with client content in <#document>.
overrideMethod @ hook.js:608
react-dom.development.js:12507 Uncaught Error: Hydration failed because the initial UI does not match what was rendered on the server.
at throwOnHydrationMismatch (react-dom.development.js:12507:9)
at tryToClaimNextHydratableInstance (react-dom.development.js:12535:7)
at updateHostComponent (react-dom.development.js:19931:5)
at beginWork (react-dom.development.js:21657:14)
at beginWork$1 (react-dom.development.js:27465:14)
at performUnitOfWork (react-dom.development.js:26596:12)
at workLoopConcurrent (react-dom.development.js:26582:5)
at renderRootConcurrent (react-dom.development.js:26544:7)
at performConcurrentWorkOnRoot (react-dom.development.js:25777:38)
at workLoop (scheduler.development.js:266:34)
react-dom.development.js:26951 Uncaught Error: Hydration failed because the initial UI does not match what was rendered on the server.
at throwOnHydrationMismatch (react-dom.development.js:12507:9)
at tryToClaimNextHydratableInstance (react-dom.development.js:12535:7)
at updateHostComponent (react-dom.development.js:19931:5)
at beginWork (react-dom.development.js:21657:14)
at beginWork$1 (react-dom.development.js:27465:14)
at performUnitOfWork (react-dom.development.js:26596:12)
at workLoopConcurrent (react-dom.development.js:26582:5)
at renderRootConcurrent (react-dom.development.js:26544:7)
at performConcurrentWorkOnRoot (react-dom.development.js:25777:38)
at workLoop (scheduler.development.js:266:34)
react-dom.development.js:26951 Uncaught Error: Hydration failed because the initial UI does not match what was rendered on the server.
at throwOnHydrationMismatch (react-dom.development.js:12507:9)
at tryToClaimNextHydratableInstance (react-dom.development.js:12535:7)
at updateHostComponent (react-dom.development.js:19931:5)
at beginWork (react-dom.development.js:21657:14)
at beginWork$1 (react-dom.development.js:27465:14)
at performUnitOfWork (react-dom.development.js:26596:12)
at workLoopConcurrent (react-dom.development.js:26582:5)
at renderRootConcurrent (react-dom.development.js:26544:7)
at performConcurrentWorkOnRoot (react-dom.development.js:25777:38)
at workLoop (scheduler.development.js:266:34)
react-dom.development.js:12507 Uncaught Error: Hydration failed because the initial UI does not match what was rendered on the server.
at throwOnHydrationMismatch (react-dom.development.js:12507:9)
at tryToClaimNextHydratableInstance (react-dom.development.js:12535:7)
at updateHostComponent (react-dom.development.js:19931:5)
at beginWork (react-dom.development.js:21657:14)
at beginWork$1 (react-dom.development.js:27465:14)
at performUnitOfWork (react-dom.development.js:26596:12)
at workLoopConcurrent (react-dom.development.js:26582:5)
at renderRootConcurrent (react-dom.development.js:26544:7)
at performConcurrentWorkOnRoot (react-dom.development.js:25777:38)
at workLoop (scheduler.development.js:266:34)
react-dom.development.js:19878 Uncaught Error: There was an error while hydrating. Because the error happened outside of a Suspense boundary, the entire root will switch to client rendering.
at updateHostRoot (react-dom.development.js:19878:57)
at beginWork (react-dom.development.js:21654:14)
at beginWork$1 (react-dom.development.js:27465:14)
at performUnitOfWork (react-dom.development.js:26596:12)
at workLoopSync (react-dom.development.js:26505:5)
at renderRootSync (react-dom.development.js:26473:7)
at recoverFromConcurrentError (react-dom.development.js:25889:20)
at performConcurrentWorkOnRoot (react-dom.development.js:25789:22)
at workLoop (scheduler.development.js:266:34)
at flushWork (scheduler.development.js:239:14)
hook.js:608 ⚠️ React Router Future Flag Warning: Relative route resolution within Splat routes is changing in v7. You can use the `v7_relativeSplatPath` future flag to opt-in early. For more information, see https://reactrouter.com/v6/upgrading/future#v7_relativesplatpath. Error Component Stack
at RouterProvider2 (index.tsx:489:3)
at RemixErrorBoundary (errorBoundaries.js:17:5)
at RemixBrowser (browser.js:254:45)
overrideMethod @ hook.js:608
hook.js:608 Warning: `NaN` is an invalid value for the `height` css style property. Error Component Stack
at div (<anonymous>)
at div (<anonymous>)
at div (<anonymous>)
at Canvas (index.mjs:7192:30)
at div (<anonymous>)
at div (<anonymous>)
at DefaultOverride (index.mjs:7377:26)
at DropZoneProvider (index.mjs:3219:3)
at ZoneStoreProvider (index.mjs:3213:3)
at DragDropProvider (index.js:81:5)
at div (<anonymous>)
at DragDropContextClient (index.mjs:4902:3)
at DragDropContext2 (index.mjs:5275:3)
at AppProvider (index.mjs:1006:3)
at div (<anonymous>)
at Puck (index.mjs:7443:3)
at Edit (edit.tsx:72:7)
at RenderedRoute (hooks.tsx:665:26)
at Outlet (components.tsx:341:26)
at body (<anonymous>)
at html (<anonymous>)
at App (<anonymous>)
at RenderedRoute (hooks.tsx:665:26)
at RenderErrorBoundary (hooks.tsx:591:5)
at DataRoutes2 (index.tsx:767:3)
at Router (components.tsx:421:13)
at RouterProvider2 (index.tsx:489:3)
at RemixErrorBoundary (errorBoundaries.js:17:5)
at RemixBrowser (browser.js:254:45)
overrideMethod @ hook.js:608
What I expect to happen
The Puck editor should render correctly on any route, not just the homepage. Styles should apply consistently, and hydration errors should not occur.
We work with remix (router 7 data and framework mode, puck works fine for us). Im sure the issue is not connected to puck.
Hello @kalysti 😄!
Thanks for chiming in, this problem specifically is about the recipe we offer for scaffolding a new project from scratch with Remix.