diff --git a/examples/next-partial-prerendering/.gitignore b/examples/next-partial-prerendering/.gitignore
new file mode 100755
index 00000000..6d1ed289
--- /dev/null
+++ b/examples/next-partial-prerendering/.gitignore
@@ -0,0 +1,37 @@
+# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+# dependencies
+/node_modules
+/.pnp
+.pnp.js
+/.yarn
+
+# testing
+/coverage
+
+# next.js
+/.next/
+/out/
+
+# production
+/build
+
+# misc
+.DS_Store
+*.pem
+
+# debug
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+.pnpm-debug.log*
+
+# local env files
+.env*
+!.env*.example
+
+# vercel
+.vercel
+
+# typescript
+*.tsbuildinfo
diff --git a/examples/next-partial-prerendering/.prettierrc b/examples/next-partial-prerendering/.prettierrc
new file mode 100644
index 00000000..544138be
--- /dev/null
+++ b/examples/next-partial-prerendering/.prettierrc
@@ -0,0 +1,3 @@
+{
+ "singleQuote": true
+}
diff --git a/examples/next-partial-prerendering/README.md b/examples/next-partial-prerendering/README.md
new file mode 100755
index 00000000..967c9811
--- /dev/null
+++ b/examples/next-partial-prerendering/README.md
@@ -0,0 +1,23 @@
+## Next.js Partial Prerendering
+
+This is a demo of [Next.js](https://nextjs.org) using [Partial Prerendering](https://nextjs.org/docs/app/api-reference/next-config-js/partial-prerendering).
+
+This template uses the new Next.js [App Router](https://nextjs.org/docs/app). This includes support for enhanced layouts, colocation of components, tests, and styles, component-level data fetching, and more.
+
+It also uses the experimental Partial Prerendering feature available in Next.js 14. Partial Prerendering combines ultra-quick static edge delivery with fully dynamic capabilities and we believe it has the potential to [become the default rendering model for web applications](https://vercel.com/blog/partial-prerendering-with-next-js-creating-a-new-default-rendering-model), bringing together the best of static site generation and dynamic delivery.
+
+> ⚠️ Please note that PPR is an experimental technology that is not recommended for production. You may run into some DX issues, especially on larger code bases.
+
+## How it works
+
+The index route `/` uses Partial Prerendering through:
+
+1. Enabling the experimental flag in `next.config.js`.
+
+```js
+experimental: {
+ ppr: true,
+},
+```
+
+2. Using ` ` to wrap Dynamic content.
diff --git a/examples/next-partial-prerendering/app/favicon.ico b/examples/next-partial-prerendering/app/favicon.ico
new file mode 100644
index 00000000..af984505
Binary files /dev/null and b/examples/next-partial-prerendering/app/favicon.ico differ
diff --git a/examples/next-partial-prerendering/app/layout.tsx b/examples/next-partial-prerendering/app/layout.tsx
new file mode 100644
index 00000000..799e4280
--- /dev/null
+++ b/examples/next-partial-prerendering/app/layout.tsx
@@ -0,0 +1,50 @@
+import { CartCountProvider } from '#/components/cart-count-context';
+import { Header } from '#/components/header';
+import { Sidebar } from '#/components/sidebar';
+import { Metadata } from 'next';
+import { GlobalStyles } from './styles';
+
+export const metadata: Metadata = {
+ metadataBase: new URL('https://partialprerendering.com'),
+ title: 'Next.js Partial Prerendering',
+ description: 'A demo of Next.js using Partial Prerendering.',
+ openGraph: {
+ title: 'Next.js Partial Prerendering',
+ description: 'A demo of Next.js using Partial Prerendering.',
+ },
+ twitter: {
+ card: 'summary_large_image',
+ },
+};
+
+export default function RootLayout({
+ children,
+}: {
+ children: React.ReactNode;
+}) {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {children}
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/examples/next-partial-prerendering/app/not-found.tsx b/examples/next-partial-prerendering/app/not-found.tsx
new file mode 100644
index 00000000..2ad82307
--- /dev/null
+++ b/examples/next-partial-prerendering/app/not-found.tsx
@@ -0,0 +1,8 @@
+export default function NotFound() {
+ return (
+
+
Not Found
+
Could not find requested resource
+
+ );
+}
diff --git a/examples/next-partial-prerendering/app/opengraph-image.png b/examples/next-partial-prerendering/app/opengraph-image.png
new file mode 100644
index 00000000..44fd1ebe
Binary files /dev/null and b/examples/next-partial-prerendering/app/opengraph-image.png differ
diff --git a/examples/next-partial-prerendering/app/page.tsx b/examples/next-partial-prerendering/app/page.tsx
new file mode 100644
index 00000000..51cfd57a
--- /dev/null
+++ b/examples/next-partial-prerendering/app/page.tsx
@@ -0,0 +1,28 @@
+import { Suspense } from 'react';
+import {
+ RecommendedProducts,
+ RecommendedProductsSkeleton,
+} from '#/components/recommended-products';
+import { Reviews, ReviewsSkeleton } from '#/components/reviews';
+import { SingleProduct } from '#/components/single-product';
+import { Ping } from '#/components/ping';
+
+export default function Page() {
+ return (
+
+
+
+
+
+
}>
+
+
+
+
+
+
}>
+
+
+
+ );
+}
diff --git a/examples/next-partial-prerendering/app/styles.tsx b/examples/next-partial-prerendering/app/styles.tsx
new file mode 100644
index 00000000..8d7fcb99
--- /dev/null
+++ b/examples/next-partial-prerendering/app/styles.tsx
@@ -0,0 +1,13 @@
+export function GlobalStyles() {
+ return (
+
+ );
+}
+
+const styles = JSON.parse(
+ "\"/*\\n! tailwindcss v3.4.5 | MIT License | https://tailwindcss.com\\n*/*,:after,:before{box-sizing:border-box;border:0 solid #e4e4e7}:after,:before{--tw-content:\\\"\\\"}:host,html{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}fieldset{margin:0}fieldset,legend{padding:0}menu,ol,ul{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{color:#a1a1aa}input::placeholder,textarea::placeholder{color:#a1a1aa}[role=button],button{cursor:pointer}:disabled{cursor:default}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]{display:none}[multiple],[type=date],[type=datetime-local],[type=email],[type=month],[type=number],[type=password],[type=search],[type=tel],[type=text],[type=time],[type=url],[type=week],input:where(:not([type])),select,textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#71717a;border-width:1px;border-radius:0;padding:.5rem .75rem;font-size:1rem;line-height:1.5rem;--tw-shadow:0 0 #0000}[multiple]:focus,[type=date]:focus,[type=datetime-local]:focus,[type=email]:focus,[type=month]:focus,[type=number]:focus,[type=password]:focus,[type=search]:focus,[type=tel]:focus,[type=text]:focus,[type=time]:focus,[type=url]:focus,[type=week]:focus,input:where(:not([type])):focus,select:focus,textarea:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);border-color:#2563eb}input::-moz-placeholder,textarea::-moz-placeholder{color:#71717a;opacity:1}input::placeholder,textarea::placeholder{color:#71717a;opacity:1}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-date-and-time-value{min-height:1.5em;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit,::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-meridiem-field,::-webkit-datetime-edit-millisecond-field,::-webkit-datetime-edit-minute-field,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-second-field,::-webkit-datetime-edit-year-field{padding-top:0;padding-bottom:0}select{background-image:url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 20 20'%3e%3cpath stroke='%2371717a' stroke-linecap='round' stroke-linejoin='round' stroke-width='1.5' d='M6 8l4 4 4-4'/%3e%3c/svg%3e\\\");background-position:right .5rem center;background-repeat:no-repeat;background-size:1.5em 1.5em;padding-right:2.5rem;-webkit-print-color-adjust:exact;print-color-adjust:exact}[multiple],[size]:where(select:not([size=\\\"1\\\"])){background-image:none;background-position:0 0;background-repeat:unset;background-size:initial;padding-right:.75rem;-webkit-print-color-adjust:unset;print-color-adjust:unset}[type=checkbox],[type=radio]{-webkit-appearance:none;-moz-appearance:none;appearance:none;padding:0;-webkit-print-color-adjust:exact;print-color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;user-select:none;flex-shrink:0;height:1rem;width:1rem;color:#2563eb;background-color:#fff;border-color:#71717a;border-width:1px;--tw-shadow:0 0 #0000}[type=checkbox]{border-radius:0}[type=radio]{border-radius:100%}[type=checkbox]:focus,[type=radio]:focus{outline:2px solid transparent;outline-offset:2px;--tw-ring-inset:var(--tw-empty,/*!*/ /*!*/);--tw-ring-offset-width:2px;--tw-ring-offset-color:#fff;--tw-ring-color:#2563eb;--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}[type=checkbox]:checked,[type=radio]:checked{border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:50%;background-repeat:no-repeat}[type=checkbox]:checked{background-image:url(\\\"data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e\\\")}@media (forced-colors:active){[type=checkbox]:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=radio]:checked{background-image:url(\\\"data:image/svg+xml,%3csvg viewBox='0 0 16 16' fill='white' xmlns='http://www.w3.org/2000/svg'%3e%3ccircle cx='8' cy='8' r='3'/%3e%3c/svg%3e\\\")}@media (forced-colors:active){[type=radio]:checked{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=checkbox]:checked:focus,[type=checkbox]:checked:hover,[type=radio]:checked:focus,[type=radio]:checked:hover{border-color:transparent;background-color:currentColor}[type=checkbox]:indeterminate{background-image:url(\\\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 16 16'%3e%3cpath stroke='white' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M4 8h8'/%3e%3c/svg%3e\\\");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:50%;background-repeat:no-repeat}@media (forced-colors:active){[type=checkbox]:indeterminate{-webkit-appearance:auto;-moz-appearance:auto;appearance:auto}}[type=checkbox]:indeterminate:focus,[type=checkbox]:indeterminate:hover{border-color:transparent;background-color:currentColor}[type=file]{background:unset;border-color:inherit;border-width:0;border-radius:0;padding:0;font-size:unset;line-height:inherit}[type=file]:focus{outline:1px solid ButtonText;outline:1px auto -webkit-focus-ring-color}*,:after,:before{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x:0;--tw-border-spacing-y:0;--tw-translate-x:0;--tw-translate-y:0;--tw-rotate:0;--tw-skew-x:0;--tw-skew-y:0;--tw-scale-x:1;--tw-scale-y:1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness:proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59,130,246,.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000;--tw-shadow:0 0 #0000;--tw-shadow-colored:0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }.prose{color:var(--tw-prose-body);max-width:65ch}.prose :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-lead);font-size:1.25em;line-height:1.6;margin-top:1.2em;margin-bottom:1.2em}.prose :where(a):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-links);text-decoration:underline;font-weight:500}.prose :where(strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-bold);font-weight:600}.prose :where(a strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th strong):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol[type=A]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=A s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-alpha}.prose :where(ol[type=a s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-alpha}.prose :where(ol[type=I]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=I s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:upper-roman}.prose :where(ol[type=i s]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:lower-roman}.prose :where(ol[type=\\\"1\\\"]):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:decimal}.prose :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){list-style-type:disc;margin-top:1.25em;margin-bottom:1.25em;padding-inline-start:1.625em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{font-weight:400;color:var(--tw-prose-counters)}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *))::marker{color:var(--tw-prose-bullets)}.prose :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.25em}.prose :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){border-color:var(--tw-prose-hr);border-top-width:1px;margin-top:3em;margin-bottom:3em}.prose :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-style:italic;color:var(--tw-prose-quotes);border-inline-start-width:.25rem;border-inline-start-color:var(--tw-prose-quote-borders);quotes:\\\"\\\\201C\\\"\\\"\\\\201D\\\"\\\"\\\\2018\\\"\\\"\\\\2019\\\";margin-top:1.6em;margin-bottom:1.6em;padding-inline-start:1em}.prose :where(blockquote p:first-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:open-quote}.prose :where(blockquote p:last-of-type):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:close-quote}.prose :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:800;font-size:2.25em;margin-top:0;margin-bottom:.8888889em;line-height:1.1111111}.prose :where(h1 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:900;color:inherit}.prose :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:700;font-size:1.5em;margin-top:2em;margin-bottom:1em;line-height:1.3333333}.prose :where(h2 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:800;color:inherit}.prose :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;font-size:1.25em;margin-top:1.6em;margin-bottom:.6em;line-height:1.6}.prose :where(h3 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;margin-top:1.5em;margin-bottom:.5em;line-height:1.5}.prose :where(h4 strong):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:700;color:inherit}.prose :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){display:block;margin-top:2em;margin-bottom:2em}.prose :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-weight:500;font-family:inherit;color:var(--tw-prose-kbd);box-shadow:0 0 0 1px rgb(var(--tw-prose-kbd-shadows)/10%),0 3px 0 rgb(var(--tw-prose-kbd-shadows)/10%);font-size:.875em;border-radius:.3125rem;padding-top:.1875em;padding-inline-end:.375em;padding-bottom:.1875em;padding-inline-start:.375em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-code);font-weight:600;font-size:.875em}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:\\\"`\\\"}.prose :where(code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:\\\"`\\\"}.prose :where(a code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h1 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.875em}.prose :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit;font-size:.9em}.prose :where(h4 code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(blockquote code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(thead th code):not(:where([class~=not-prose],[class~=not-prose] *)){color:inherit}.prose :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-pre-code);background-color:var(--tw-prose-pre-bg);overflow-x:auto;font-weight:400;font-size:.875em;line-height:1.7142857;margin-top:1.7142857em;margin-bottom:1.7142857em;border-radius:.375rem;padding-top:.8571429em;padding-inline-end:1.1428571em;padding-bottom:.8571429em;padding-inline-start:1.1428571em}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)){background-color:transparent;border-width:0;border-radius:0;padding:0;font-weight:inherit;color:inherit;font-size:inherit;font-family:inherit;line-height:inherit}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):before{content:none}.prose :where(pre code):not(:where([class~=not-prose],[class~=not-prose] *)):after{content:none}.prose :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){width:100%;table-layout:auto;text-align:start;margin-top:2em;margin-bottom:2em;font-size:.875em;line-height:1.7142857}.prose :where(thead):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-th-borders)}.prose :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-headings);font-weight:600;vertical-align:bottom;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody tr):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:1px;border-bottom-color:var(--tw-prose-td-borders)}.prose :where(tbody tr:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){border-bottom-width:0}.prose :where(tbody td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:baseline}.prose :where(tfoot):not(:where([class~=not-prose],[class~=not-prose] *)){border-top-width:1px;border-top-color:var(--tw-prose-th-borders)}.prose :where(tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){vertical-align:top}.prose :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){color:var(--tw-prose-captions);font-size:.875em;line-height:1.4285714;margin-top:.8571429em}.prose{--tw-prose-body:#374151;--tw-prose-headings:#111827;--tw-prose-lead:#4b5563;--tw-prose-links:#111827;--tw-prose-bold:#111827;--tw-prose-counters:#6b7280;--tw-prose-bullets:#d1d5db;--tw-prose-hr:#e5e7eb;--tw-prose-quotes:#111827;--tw-prose-quote-borders:#e5e7eb;--tw-prose-captions:#6b7280;--tw-prose-kbd:#111827;--tw-prose-kbd-shadows:17 24 39;--tw-prose-code:#111827;--tw-prose-pre-code:#e5e7eb;--tw-prose-pre-bg:#1f2937;--tw-prose-th-borders:#d1d5db;--tw-prose-td-borders:#e5e7eb;--tw-prose-invert-body:#d1d5db;--tw-prose-invert-headings:#fff;--tw-prose-invert-lead:#9ca3af;--tw-prose-invert-links:#fff;--tw-prose-invert-bold:#fff;--tw-prose-invert-counters:#9ca3af;--tw-prose-invert-bullets:#4b5563;--tw-prose-invert-hr:#374151;--tw-prose-invert-quotes:#f3f4f6;--tw-prose-invert-quote-borders:#374151;--tw-prose-invert-captions:#9ca3af;--tw-prose-invert-kbd:#fff;--tw-prose-invert-kbd-shadows:255 255 255;--tw-prose-invert-code:#fff;--tw-prose-invert-pre-code:#d1d5db;--tw-prose-invert-pre-bg:rgba(0,0,0,.5);--tw-prose-invert-th-borders:#4b5563;--tw-prose-invert-td-borders:#374151;font-size:1rem;line-height:1.75}.prose :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;margin-bottom:.5em}.prose :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.375em}.prose :where(.prose>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(.prose>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(.prose>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em}.prose :where(.prose>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.25em}.prose :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.75em;margin-bottom:.75em}.prose :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.25em;margin-bottom:1.25em}.prose :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5em;padding-inline-start:1.625em}.prose :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.5714286em;padding-inline-end:.5714286em;padding-bottom:.5714286em;padding-inline-start:.5714286em}.prose :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2em;margin-bottom:2em}.prose :where(.prose>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose :where(.prose>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.prose-sm{font-size:.875rem;line-height:1.7142857}.prose-sm :where(p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em;margin-bottom:1.1428571em}.prose-sm :where([class~=lead]):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2857143em;line-height:1.5555556;margin-top:.8888889em;margin-bottom:.8888889em}.prose-sm :where(blockquote):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.3333333em;margin-bottom:1.3333333em;padding-inline-start:1.1111111em}.prose-sm :where(h1):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:2.1428571em;margin-top:0;margin-bottom:.8em;line-height:1.2}.prose-sm :where(h2):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.4285714em;margin-top:1.6em;margin-bottom:.8em;line-height:1.4}.prose-sm :where(h3):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:1.2857143em;margin-top:1.5555556em;margin-bottom:.4444444em;line-height:1.5555556}.prose-sm :where(h4):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.4285714em;margin-bottom:.5714286em;line-height:1.4285714}.prose-sm :where(img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(picture):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(picture>img):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose-sm :where(video):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(kbd):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;border-radius:.3125rem;padding-top:.1428571em;padding-inline-end:.3571429em;padding-bottom:.1428571em;padding-inline-start:.3571429em}.prose-sm :where(code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em}.prose-sm :where(h2 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.9em}.prose-sm :where(h3 code):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8888889em}.prose-sm :where(pre):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;line-height:1.6666667;margin-top:1.6666667em;margin-bottom:1.6666667em;border-radius:.25rem;padding-top:.6666667em;padding-inline-end:1em;padding-bottom:.6666667em;padding-inline-start:1em}.prose-sm :where(ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em;margin-bottom:1.1428571em;padding-inline-start:1.5714286em}.prose-sm :where(ul):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em;margin-bottom:1.1428571em;padding-inline-start:1.5714286em}.prose-sm :where(li):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.2857143em;margin-bottom:.2857143em}.prose-sm :where(ol>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4285714em}.prose-sm :where(ul>li):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:.4285714em}.prose-sm :where(.prose-sm>ul>li p):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5714286em;margin-bottom:.5714286em}.prose-sm :where(.prose-sm>ul>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}.prose-sm :where(.prose-sm>ul>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em}.prose-sm :where(.prose-sm>ol>li>p:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}.prose-sm :where(.prose-sm>ol>li>p:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:1.1428571em}.prose-sm :where(ul ul,ul ol,ol ul,ol ol):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.5714286em;margin-bottom:.5714286em}.prose-sm :where(dl):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em;margin-bottom:1.1428571em}.prose-sm :where(dt):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.1428571em}.prose-sm :where(dd):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:.2857143em;padding-inline-start:1.5714286em}.prose-sm :where(hr):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:2.8571429em;margin-bottom:2.8571429em}.prose-sm :where(hr+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(h2+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(h3+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(h4+*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(table):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;line-height:1.5}.prose-sm :where(thead th):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:1em;padding-bottom:.6666667em;padding-inline-start:1em}.prose-sm :where(thead th:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-sm :where(thead th:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-sm :where(tbody td,tfoot td):not(:where([class~=not-prose],[class~=not-prose] *)){padding-top:.6666667em;padding-inline-end:1em;padding-bottom:.6666667em;padding-inline-start:1em}.prose-sm :where(tbody td:first-child,tfoot td:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-start:0}.prose-sm :where(tbody td:last-child,tfoot td:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){padding-inline-end:0}.prose-sm :where(figure):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:1.7142857em;margin-bottom:1.7142857em}.prose-sm :where(figure>*):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0;margin-bottom:0}.prose-sm :where(figcaption):not(:where([class~=not-prose],[class~=not-prose] *)){font-size:.8571429em;line-height:1.3333333;margin-top:.6666667em}.prose-sm :where(.prose-sm>:first-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-top:0}.prose-sm :where(.prose-sm>:last-child):not(:where([class~=not-prose],[class~=not-prose] *)){margin-bottom:0}.prose-invert{--tw-prose-body:var(--tw-prose-invert-body);--tw-prose-headings:var(--tw-prose-invert-headings);--tw-prose-lead:var(--tw-prose-invert-lead);--tw-prose-links:var(--tw-prose-invert-links);--tw-prose-bold:var(--tw-prose-invert-bold);--tw-prose-counters:var(--tw-prose-invert-counters);--tw-prose-bullets:var(--tw-prose-invert-bullets);--tw-prose-hr:var(--tw-prose-invert-hr);--tw-prose-quotes:var(--tw-prose-invert-quotes);--tw-prose-quote-borders:var(--tw-prose-invert-quote-borders);--tw-prose-captions:var(--tw-prose-invert-captions);--tw-prose-kbd:var(--tw-prose-invert-kbd);--tw-prose-kbd-shadows:var(--tw-prose-invert-kbd-shadows);--tw-prose-code:var(--tw-prose-invert-code);--tw-prose-pre-code:var(--tw-prose-invert-pre-code);--tw-prose-pre-bg:var(--tw-prose-invert-pre-bg);--tw-prose-th-borders:var(--tw-prose-invert-th-borders);--tw-prose-td-borders:var(--tw-prose-invert-td-borders)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border-width:0}.pointer-events-none{pointer-events:none}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-x-0{left:0;right:0}.inset-y-0{top:0;bottom:0}.-left-4{left:-1rem}.-right-1{right:-.25rem}.-top-1{top:-.25rem}.bottom-0{bottom:0}.bottom-3{bottom:.75rem}.left-0{left:0}.left-2{left:.5rem}.right-0{right:0}.right-2{right:.5rem}.top-0{top:0}.top-1{top:.25rem}.top-1\\\\.5{top:.375rem}.top-14{top:3.5rem}.top-2{top:.5rem}.z-10{z-index:10}.z-20{z-index:20}.col-span-2{grid-column:span 2/span 2}.col-span-4{grid-column:span 4/span 4}.col-span-full{grid-column:1/-1}.mx-3{margin-left:.75rem;margin-right:.75rem}.mx-auto{margin-left:auto;margin-right:auto}.mt-px{margin-top:1px}.block{display:block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.grid{display:grid}.hidden{display:none}.aspect-square{aspect-ratio:1/1}.h-10{height:2.5rem}.h-14{height:3.5rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-\\\\[11px\\\\]{height:11px}.h-\\\\[167px\\\\]{height:167px}.h-full{height:100%}.w-1\\\\/2{width:50%}.w-1\\\\/3{width:33.333333%}.w-1\\\\/6{width:16.666667%}.w-10{width:2.5rem}.w-16{width:4rem}.w-2\\\\/5{width:40%}.w-2\\\\/6{width:33.333333%}.w-4{width:1rem}.w-4\\\\/6{width:66.666667%}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-\\\\[11px\\\\]{width:11px}.w-full{width:100%}.max-w-4xl{max-width:56rem}.max-w-none{max-width:none}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.animate-\\\\[loading_1\\\\.4s_ease-in-out_0\\\\.2s_infinite\\\\]{animation:loading 1.4s ease-in-out .2s infinite}.animate-\\\\[loading_1\\\\.4s_ease-in-out_0\\\\.4s_infinite\\\\]{animation:loading 1.4s ease-in-out .4s infinite}@keyframes loading{0%{opacity:.2}20%{opacity:1;transform:translateX(1px)}to{opacity:.2}}.animate-\\\\[loading_1\\\\.4s_ease-in-out_infinite\\\\]{animation:loading 1.4s ease-in-out infinite}@keyframes ping{75%,to{transform:scale(2);opacity:0}}.animate-ping{animation:ping 1s cubic-bezier(0,0,.2,1) infinite}@keyframes spin{to{transform:rotate(1turn)}}.animate-spin{animation:spin 1s linear infinite}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.flex-row{flex-direction:row}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-6{gap:1.5rem}.gap-x-1{-moz-column-gap:.25rem;column-gap:.25rem}.gap-x-1\\\\.5{-moz-column-gap:.375rem;column-gap:.375rem}.gap-x-2{-moz-column-gap:.5rem;column-gap:.5rem}.gap-x-2\\\\.5{-moz-column-gap:.625rem;column-gap:.625rem}.gap-x-3{-moz-column-gap:.75rem;column-gap:.75rem}.space-x-0\\\\.5>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.125rem * var(--tw-space-x-reverse));margin-left:calc(.125rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse:0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-y-10>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2.5rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.space-y-8>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(2rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(2rem * var(--tw-space-y-reverse))}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overflow-y-scroll{overflow-y:scroll}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.border{border-width:1px}.border-\\\\[3px\\\\]{border-width:3px}.border-b{border-bottom-width:1px}.border-none{border-style:none}.border-gray-800{--tw-border-opacity:1;border-color:rgb(39 39 42/var(--tw-border-opacity))}.border-white{--tw-border-opacity:1;border-color:rgb(255 255 255/var(--tw-border-opacity))}.border-white\\\\/30{border-color:hsla(0,0%,100%,.3)}.border-r-transparent{border-right-color:transparent}.bg-black{--tw-bg-opacity:1;background-color:rgb(0 0 0/var(--tw-bg-opacity))}.bg-gray-1100{--tw-bg-opacity:1;background-color:rgb(10 10 11/var(--tw-bg-opacity))}.bg-gray-600{--tw-bg-opacity:1;background-color:rgb(82 82 91/var(--tw-bg-opacity))}.bg-gray-700{--tw-bg-opacity:1;background-color:rgb(63 63 70/var(--tw-bg-opacity))}.bg-gray-800{--tw-bg-opacity:1;background-color:rgb(39 39 42/var(--tw-bg-opacity))}.bg-gray-900{--tw-bg-opacity:1;background-color:rgb(24 24 27/var(--tw-bg-opacity))}.bg-vercel-blue{--tw-bg-opacity:1;background-color:rgb(0 112 243/var(--tw-bg-opacity))}.bg-vercel-cyan{--tw-bg-opacity:1;background-color:rgb(80 227 194/var(--tw-bg-opacity))}.bg-vercel-pink{--tw-bg-opacity:1;background-color:rgb(255 0 128/var(--tw-bg-opacity))}.bg-\\\\[url\\\\(\\\\'\\\\/grid\\\\.svg\\\\'\\\\)\\\\]{background-image:url(/grid.svg)}.bg-vc-border-gradient{background-image:radial-gradient(at left top,#71717a,50px,#27272a 50%)}.p-3{padding:.75rem}.p-3\\\\.5{padding:.875rem}.p-px{padding:1px}.px-1\\\\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.pb-20{padding-bottom:5rem}.pb-36{padding-bottom:9rem}.pb-\\\\[5px\\\\]{padding-bottom:5px}.pl-10{padding-left:2.5rem}.pl-3{padding-left:.75rem}.pt-20{padding-top:5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.leading-5{line-height:1.25rem}.leading-snug{line-height:1.375}.tracking-wide{letter-spacing:.025em}.text-cyan-800{--tw-text-opacity:1;color:rgb(21 94 117/var(--tw-text-opacity))}.text-gray-100{--tw-text-opacity:1;color:rgb(244 244 245/var(--tw-text-opacity))}.text-gray-200{--tw-text-opacity:1;color:rgb(228 228 231/var(--tw-text-opacity))}.text-gray-300{--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}.text-gray-400{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.text-gray-500{--tw-text-opacity:1;color:rgb(113 113 122/var(--tw-text-opacity))}.text-vercel-cyan{--tw-text-opacity:1;color:rgb(80 227 194/var(--tw-text-opacity))}.text-vercel-pink{--tw-text-opacity:1;color:rgb(255 0 128/var(--tw-text-opacity))}.text-white{--tw-text-opacity:1;color:rgb(255 255 255/var(--tw-text-opacity))}.underline{text-decoration-line:underline}.line-through{text-decoration-line:line-through}.decoration-dotted{text-decoration-style:dotted}.underline-offset-4{text-underline-offset:4px}.opacity-75{opacity:.75}.shadow-lg{--tw-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -4px rgba(0,0,0,.1);--tw-shadow-colored:0 10px 15px -3px var(--tw-shadow-color),0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow,0 0 #0000),var(--tw-ring-shadow,0 0 #0000),var(--tw-shadow)}.shadow-black\\\\/20{--tw-shadow-color:rgba(0,0,0,.2);--tw-shadow:var(--tw-shadow-colored)}.blur{--tw-blur:blur(8px)}.blur,.grayscale{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.grayscale{--tw-grayscale:grayscale(100%)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.\\\\[color-scheme\\\\:dark\\\\]{color-scheme:dark}.before\\\\:absolute:before{content:var(--tw-content);position:absolute}.before\\\\:inset-0:before{content:var(--tw-content);inset:0}.before\\\\:-translate-x-full:before{content:var(--tw-content);--tw-translate-x:-100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes shimmer{to{content:var(--tw-content);transform:translateX(100%)}}.before\\\\:animate-\\\\[shimmer_1\\\\.5s_infinite\\\\]:before{content:var(--tw-content);animation:shimmer 1.5s infinite}.before\\\\:bg-gradient-to-r:before{content:var(--tw-content);background-image:linear-gradient(to right,var(--tw-gradient-stops))}.before\\\\:from-transparent:before{content:var(--tw-content);--tw-gradient-from:transparent var(--tw-gradient-from-position);--tw-gradient-to:transparent var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),var(--tw-gradient-to)}.before\\\\:via-white\\\\/10:before{content:var(--tw-content);--tw-gradient-to:hsla(0,0%,100%,0) var(--tw-gradient-to-position);--tw-gradient-stops:var(--tw-gradient-from),hsla(0,0%,100%,.1) var(--tw-gradient-via-position),var(--tw-gradient-to)}.before\\\\:to-transparent:before{content:var(--tw-content);--tw-gradient-to:transparent var(--tw-gradient-to-position)}@media (hover:hover) and (pointer:fine){.hover\\\\:bg-vercel-blue\\\\/90:hover{background-color:rgba(0,112,243,.9)}.hover\\\\:text-gray-300:hover{--tw-text-opacity:1;color:rgb(212 212 216/var(--tw-text-opacity))}.hover\\\\:text-gray-50:hover{--tw-text-opacity:1;color:rgb(250 250 250/var(--tw-text-opacity))}.hover\\\\:opacity-70:hover{opacity:.7}}.focus\\\\:border-vercel-pink:focus{--tw-border-opacity:1;border-color:rgb(255 0 128/var(--tw-border-opacity))}.focus\\\\:ring-2:focus{--tw-ring-offset-shadow:var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow:var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow,0 0 #0000)}.focus\\\\:ring-vercel-pink:focus{--tw-ring-opacity:1;--tw-ring-color:rgb(255 0 128/var(--tw-ring-opacity))}.disabled\\\\:text-white\\\\/70:disabled{color:hsla(0,0%,100%,.7)}@media (hover:hover) and (pointer:fine){.group:hover .group-hover\\\\:text-gray-400{--tw-text-opacity:1;color:rgb(161 161 170/var(--tw-text-opacity))}.group:hover .group-hover\\\\:text-vercel-cyan{--tw-text-opacity:1;color:rgb(80 227 194/var(--tw-text-opacity))}.group:hover .group-hover\\\\:opacity-80{opacity:.8}}@media (min-width:640px){.sm\\\\:block{display:block}}@media (min-width:768px){.md\\\\:order-1{order:1}.md\\\\:order-2{order:2}.md\\\\:order-3{order:3}.md\\\\:col-span-1{grid-column:span 1/span 1}.md\\\\:col-span-2{grid-column:span 2/span 2}}@media (min-width:1024px){.lg\\\\:static{position:static}.lg\\\\:bottom-0{bottom:0}.lg\\\\:z-auto{z-index:auto}.lg\\\\:col-span-1{grid-column:span 1/span 1}.lg\\\\:block{display:block}.lg\\\\:hidden{display:none}.lg\\\\:h-auto{height:auto}.lg\\\\:w-72{width:18rem}.lg\\\\:space-y-14>:not([hidden])~:not([hidden]){--tw-space-y-reverse:0;margin-top:calc(3.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(3.5rem * var(--tw-space-y-reverse))}.lg\\\\:border-b-0{border-bottom-width:0}.lg\\\\:border-r{border-right-width:1px}.lg\\\\:border-gray-800{--tw-border-opacity:1;border-color:rgb(39 39 42/var(--tw-border-opacity))}.lg\\\\:p-6{padding:1.5rem}.lg\\\\:px-5{padding-left:1.25rem;padding-right:1.25rem}.lg\\\\:px-8{padding-left:2rem;padding-right:2rem}.lg\\\\:py-3{padding-top:.75rem;padding-bottom:.75rem}.lg\\\\:py-4{padding-top:1rem;padding-bottom:1rem}.lg\\\\:py-8{padding-top:2rem;padding-bottom:2rem}.lg\\\\:pl-72{padding-left:18rem}.lg\\\\:text-2xl{font-size:1.5rem;line-height:2rem}}\"",
+);
diff --git a/examples/next-partial-prerendering/app/twitter-image.png b/examples/next-partial-prerendering/app/twitter-image.png
new file mode 100644
index 00000000..44fd1ebe
Binary files /dev/null and b/examples/next-partial-prerendering/app/twitter-image.png differ
diff --git a/examples/next-partial-prerendering/components/add-to-cart.tsx b/examples/next-partial-prerendering/components/add-to-cart.tsx
new file mode 100644
index 00000000..3596aa4d
--- /dev/null
+++ b/examples/next-partial-prerendering/components/add-to-cart.tsx
@@ -0,0 +1,56 @@
+'use client';
+
+import { useRouter } from 'next/navigation';
+import { useTransition } from 'react';
+import { useCartCount } from '#/components/cart-count-context';
+
+export function AddToCart({ initialCartCount }: { initialCartCount: number }) {
+ const router = useRouter();
+ const [isPending, startTransition] = useTransition();
+
+ const [, setOptimisticCartCount] = useCartCount(initialCartCount);
+
+ const addToCart = () => {
+ setOptimisticCartCount(initialCartCount + 1);
+
+ // update the cart count cookie
+ document.cookie = `_cart_count=${initialCartCount + 1}; path=/; max-age=${
+ 60 * 60 * 24 * 30
+ }};`;
+
+ // Normally you would also send a request to the server to add the item
+ // to the current users cart
+ // await fetch(`https://api.acme.com/...`);
+
+ // Use a transition and isPending to create inline loading UI
+ startTransition(() => {
+ setOptimisticCartCount(null);
+
+ // Refresh the current route and fetch new data from the server without
+ // losing client-side browser or React state.
+ router.refresh();
+
+ // We're working on more fine-grained data mutation and revalidation:
+ // https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions
+ });
+ };
+
+ return (
+
+ Add to Cart
+ {isPending ? (
+
+ ) : null}
+
+ );
+}
diff --git a/examples/next-partial-prerendering/components/byline.tsx b/examples/next-partial-prerendering/components/byline.tsx
new file mode 100644
index 00000000..a5144a59
--- /dev/null
+++ b/examples/next-partial-prerendering/components/byline.tsx
@@ -0,0 +1,31 @@
+import { VercelLogo } from '#/components/vercel-logo';
+
+export default function Byline({ className }: { className: string }) {
+ return (
+
+ );
+}
diff --git a/examples/next-partial-prerendering/components/cart-count-context.tsx b/examples/next-partial-prerendering/components/cart-count-context.tsx
new file mode 100644
index 00000000..7403f198
--- /dev/null
+++ b/examples/next-partial-prerendering/components/cart-count-context.tsx
@@ -0,0 +1,35 @@
+'use client';
+
+import React, { useState } from 'react';
+
+const CartCountContext = React.createContext<
+ | [null | number, React.Dispatch>]
+ | undefined
+>(undefined);
+
+export function CartCountProvider({ children }: { children: React.ReactNode }) {
+ const [optimisticCartCount, setOptimisticCartCount] = useState(
+ null,
+ );
+
+ return (
+
+ {children}
+
+ );
+}
+
+export function useCartCount(
+ initialCount: number,
+): [null | number, React.Dispatch>] {
+ const context = React.useContext(CartCountContext);
+ if (context === undefined) {
+ throw new Error('useCartCount must be used within a CartCountProvider');
+ }
+ if (context[0] === null) {
+ return [initialCount, context[1]];
+ }
+ return context;
+}
diff --git a/examples/next-partial-prerendering/components/cart-count.tsx b/examples/next-partial-prerendering/components/cart-count.tsx
new file mode 100644
index 00000000..bbafec86
--- /dev/null
+++ b/examples/next-partial-prerendering/components/cart-count.tsx
@@ -0,0 +1,8 @@
+'use client';
+
+import { useCartCount } from '#/components/cart-count-context';
+
+export function CartCount({ initialCartCount }: { initialCartCount: number }) {
+ const [count] = useCartCount(initialCartCount);
+ return {count} ;
+}
diff --git a/examples/next-partial-prerendering/components/header.tsx b/examples/next-partial-prerendering/components/header.tsx
new file mode 100644
index 00000000..ab98e249
--- /dev/null
+++ b/examples/next-partial-prerendering/components/header.tsx
@@ -0,0 +1,60 @@
+import { NextLogo } from '#/components/next-logo';
+import {
+ MagnifyingGlassIcon,
+ ShoppingCartIcon,
+} from '@heroicons/react/24/solid';
+import Image from 'next/image';
+import { CartCount } from '#/components/cart-count';
+import { cookies } from 'next/headers';
+import { Suspense } from 'react';
+
+async function CartCountFromCookies() {
+ const cartCount = Number(cookies().get('_cart_count')?.value || '0');
+ return ;
+}
+
+export function Header() {
+ return (
+
+ );
+}
diff --git a/examples/next-partial-prerendering/components/next-logo.tsx b/examples/next-partial-prerendering/components/next-logo.tsx
new file mode 100644
index 00000000..5d751f19
--- /dev/null
+++ b/examples/next-partial-prerendering/components/next-logo.tsx
@@ -0,0 +1,54 @@
+export function NextLogo() {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/examples/next-partial-prerendering/components/ping.tsx b/examples/next-partial-prerendering/components/ping.tsx
new file mode 100644
index 00000000..cd7b14d3
--- /dev/null
+++ b/examples/next-partial-prerendering/components/ping.tsx
@@ -0,0 +1,12 @@
+export function Ping() {
+ return (
+
+ );
+}
diff --git a/examples/next-partial-prerendering/components/pricing.tsx b/examples/next-partial-prerendering/components/pricing.tsx
new file mode 100644
index 00000000..c7d71bb9
--- /dev/null
+++ b/examples/next-partial-prerendering/components/pricing.tsx
@@ -0,0 +1,88 @@
+import type { Product } from '#/types/product';
+import { Ping } from '#/components/ping';
+import { ProductEstimatedArrival } from '#/components/product-estimated-arrival';
+import { ProductLowStockWarning } from '#/components/product-low-stock-warning';
+import { ProductPrice } from '#/components/product-price';
+import { ProductSplitPayments } from '#/components/product-split-payments';
+import { ProductUsedPrice } from '#/components/product-used-price';
+import { dinero, type DineroSnapshot } from 'dinero.js';
+import { Suspense } from 'react';
+import { AddToCart } from '#/components/add-to-cart';
+import { delayShippingEstimate, withDelay } from '#/lib/delay';
+import { cookies } from 'next/headers';
+
+async function AddToCartFromCookies() {
+ // Get the cart count from the users cookies and pass it to the client
+ // AddToCart component
+ const cartCount = Number(cookies().get('_cart_count')?.value || '0');
+ return ;
+}
+
+function LoadingDots() {
+ return (
+
+
+
+ •
+
+
+ •
+
+
+ •
+
+
+
+ );
+}
+
+async function UserSpecificDetails({ productId }: { productId: string }) {
+ const data = await withDelay(
+ fetch(
+ `https://app-router-api.vercel.app/api/products?id=${productId}&filter=price,usedPrice,leadTime,stock`,
+ {
+ // We intentionally disable Next.js Cache to better demo
+ // streaming
+ cache: 'no-store',
+ },
+ ),
+ delayShippingEstimate,
+ );
+
+ const product = (await data.json()) as Product;
+
+ const price = dinero(product.price as DineroSnapshot);
+
+ return (
+ <>
+
+ {product.usedPrice ? (
+
+ ) : null}
+
+ {product.stock <= 1 ? (
+
+ ) : null}
+ >
+ );
+}
+
+export function Pricing({ product }: { product: Product }) {
+ const price = dinero(product.price as DineroSnapshot);
+
+ return (
+
+
+
+
+
+
}>
+
+
+
+
}>
+
+
+
+ );
+}
diff --git a/examples/next-partial-prerendering/components/product-best-seller.tsx b/examples/next-partial-prerendering/components/product-best-seller.tsx
new file mode 100644
index 00000000..d6e10134
--- /dev/null
+++ b/examples/next-partial-prerendering/components/product-best-seller.tsx
@@ -0,0 +1,7 @@
+export const ProductBestSeller = () => {
+ return (
+
+ Best Seller
+
+ );
+};
diff --git a/examples/next-partial-prerendering/components/product-card.tsx b/examples/next-partial-prerendering/components/product-card.tsx
new file mode 100644
index 00000000..d2e66d8b
--- /dev/null
+++ b/examples/next-partial-prerendering/components/product-card.tsx
@@ -0,0 +1,54 @@
+import { Product } from '#/types/product';
+import { ProductBestSeller } from '#/components/product-best-seller';
+import { ProductEstimatedArrival } from '#/components/product-estimated-arrival';
+import { ProductLowStockWarning } from '#/components/product-low-stock-warning';
+import { ProductPrice } from '#/components/product-price';
+import { ProductRating } from '#/components/product-rating';
+import { ProductUsedPrice } from '#/components/product-used-price';
+import { dinero, type DineroSnapshot } from 'dinero.js';
+import Image from 'next/image';
+
+export const ProductCard = ({ product }: { product: Product }) => {
+ const price = dinero(product.price as DineroSnapshot);
+
+ return (
+
+
+
+ {product.isBestSeller ? (
+
+ ) : null}
+
+
+
+
+ {product.name}
+
+
+ {product.rating ?
: null}
+
+
+
+ {product.usedPrice ? (
+
+ ) : null}
+
+
+
+ {product.stock <= 1 ? (
+
+ ) : null}
+
+
+ );
+};
diff --git a/examples/next-partial-prerendering/components/product-currency-symbol.tsx b/examples/next-partial-prerendering/components/product-currency-symbol.tsx
new file mode 100644
index 00000000..b9d60ace
--- /dev/null
+++ b/examples/next-partial-prerendering/components/product-currency-symbol.tsx
@@ -0,0 +1,27 @@
+import { toFormat, type Dinero } from 'dinero.js';
+
+export const ProductCurrencySymbol = ({
+ dinero,
+}: {
+ dinero: Dinero;
+}) => {
+ let symbol = '';
+ switch (toFormat(dinero, ({ currency }) => currency.code)) {
+ case 'GBP': {
+ symbol = '£';
+ break;
+ }
+
+ case 'EUR': {
+ symbol = '€';
+ break;
+ }
+
+ default: {
+ symbol = '$';
+ break;
+ }
+ }
+
+ return <>{symbol}>;
+};
diff --git a/examples/next-partial-prerendering/components/product-deal.tsx b/examples/next-partial-prerendering/components/product-deal.tsx
new file mode 100644
index 00000000..3d8777ed
--- /dev/null
+++ b/examples/next-partial-prerendering/components/product-deal.tsx
@@ -0,0 +1,36 @@
+import { ProductCurrencySymbol } from '#/components/product-currency-symbol';
+import { toUnit, type Dinero } from 'dinero.js';
+
+export const ProductDeal = ({
+ price: priceRaw,
+ discount: discountRaw,
+}: {
+ price: Dinero;
+ discount: {
+ amount: Dinero;
+ };
+}) => {
+ const discount = toUnit(discountRaw.amount);
+ const price = toUnit(priceRaw);
+ const percent = Math.round(100 - (discount / price) * 100);
+
+ return (
+
+ );
+};
diff --git a/examples/next-partial-prerendering/components/product-estimated-arrival.tsx b/examples/next-partial-prerendering/components/product-estimated-arrival.tsx
new file mode 100644
index 00000000..1b236d4d
--- /dev/null
+++ b/examples/next-partial-prerendering/components/product-estimated-arrival.tsx
@@ -0,0 +1,24 @@
+import { add, format, isTomorrow } from 'date-fns';
+
+export const ProductEstimatedArrival = ({
+ leadTime,
+ hasDeliveryTime = false,
+}: {
+ leadTime: number;
+ hasDeliveryTime?: boolean;
+}) => {
+ const date = add(new Date(), {
+ days: leadTime,
+ });
+
+ return (
+
+ Get it{' '}
+
+ {isTomorrow(date) ? 'tomorrow, ' : null}
+ {format(date, 'MMM d')}
+
+ {hasDeliveryTime ? <> by 5pm> : null}
+
+ );
+};
diff --git a/examples/next-partial-prerendering/components/product-lightening-deal.tsx b/examples/next-partial-prerendering/components/product-lightening-deal.tsx
new file mode 100644
index 00000000..6612acb8
--- /dev/null
+++ b/examples/next-partial-prerendering/components/product-lightening-deal.tsx
@@ -0,0 +1,28 @@
+import { ProductDeal } from '#/components/product-deal';
+import { add, formatDistanceToNow } from 'date-fns';
+import { type Dinero } from 'dinero.js';
+
+export const ProductLighteningDeal = ({
+ price,
+ discount,
+}: {
+ price: Dinero;
+ discount: {
+ amount: Dinero;
+ expires?: number;
+ };
+}) => {
+ const date = add(new Date(), { days: discount.expires });
+
+ return (
+ <>
+
+
+ Expires in {formatDistanceToNow(date)}
+
+
+
+
+ >
+ );
+};
diff --git a/examples/next-partial-prerendering/components/product-low-stock-warning.tsx b/examples/next-partial-prerendering/components/product-low-stock-warning.tsx
new file mode 100644
index 00000000..26ac0d5e
--- /dev/null
+++ b/examples/next-partial-prerendering/components/product-low-stock-warning.tsx
@@ -0,0 +1,13 @@
+export const ProductLowStockWarning = ({ stock }: { stock: number }) => {
+ if (stock > 3) {
+ return null;
+ }
+
+ if (stock === 0) {
+ return Out of stock
;
+ }
+
+ return (
+ Only {stock} left in stock
+ );
+};
diff --git a/examples/next-partial-prerendering/components/product-price.tsx b/examples/next-partial-prerendering/components/product-price.tsx
new file mode 100644
index 00000000..ed5def05
--- /dev/null
+++ b/examples/next-partial-prerendering/components/product-price.tsx
@@ -0,0 +1,52 @@
+import { Product } from '#/types/product';
+import { ProductCurrencySymbol } from '#/components/product-currency-symbol';
+import { ProductDeal } from '#/components/product-deal';
+import { ProductLighteningDeal } from '#/components/product-lightening-deal';
+import { multiply, toUnit, type Dinero } from 'dinero.js';
+
+function isDiscount(obj: any): obj is { percent: number; expires?: number } {
+ return typeof obj?.percent === 'number';
+}
+
+function formatDiscount(
+ price: Dinero,
+ discountRaw: Product['discount'],
+) {
+ return isDiscount(discountRaw)
+ ? {
+ amount: multiply(price, {
+ amount: discountRaw.percent,
+ scale: 2,
+ }),
+ expires: discountRaw.expires,
+ }
+ : undefined;
+}
+
+export const ProductPrice = ({
+ price,
+ discount: discountRaw,
+}: {
+ price: Dinero;
+ discount: Product['discount'];
+}) => {
+ const discount = formatDiscount(price, discountRaw);
+
+ if (discount) {
+ if (discount?.expires && typeof discount.expires === 'number') {
+ return ;
+ }
+ return ;
+ }
+
+ return (
+
+
+
+ {toUnit(price)}
+
+
+ );
+};
diff --git a/examples/next-partial-prerendering/components/product-rating.tsx b/examples/next-partial-prerendering/components/product-rating.tsx
new file mode 100644
index 00000000..cc374503
--- /dev/null
+++ b/examples/next-partial-prerendering/components/product-rating.tsx
@@ -0,0 +1,17 @@
+import { StarIcon } from '@heroicons/react/24/solid';
+import clsx from 'clsx';
+
+export const ProductRating = ({ rating }: { rating: number }) => {
+ return (
+
+ {Array.from({ length: 5 }).map((_, i) => {
+ return (
+
+ );
+ })}
+
+ );
+};
diff --git a/examples/next-partial-prerendering/components/product-review-card.tsx b/examples/next-partial-prerendering/components/product-review-card.tsx
new file mode 100644
index 00000000..04a59489
--- /dev/null
+++ b/examples/next-partial-prerendering/components/product-review-card.tsx
@@ -0,0 +1,19 @@
+import type { Review } from '#/types/review';
+import { ProductRating } from '#/components/product-rating';
+
+export const ProductReviewCard = ({ review }: { review: Review }) => {
+ return (
+
+
+
+
+ {review.rating ?
: null}
+
+
+
{review.text}
+
+ );
+};
diff --git a/examples/next-partial-prerendering/components/product-split-payments.tsx b/examples/next-partial-prerendering/components/product-split-payments.tsx
new file mode 100644
index 00000000..18140bef
--- /dev/null
+++ b/examples/next-partial-prerendering/components/product-split-payments.tsx
@@ -0,0 +1,17 @@
+import { ProductCurrencySymbol } from '#/components/product-currency-symbol';
+import { allocate, toUnit, up, type Dinero } from 'dinero.js';
+
+export const ProductSplitPayments = ({ price }: { price: Dinero }) => {
+ // only offer split payments for more expensive items
+ if (toUnit(price) < 150) {
+ return null;
+ }
+
+ const [perMonth] = allocate(price, [1, 2]);
+ return (
+
+ Or
+ {toUnit(perMonth, { digits: 0, round: up })}/month for 3 months
+
+ );
+};
diff --git a/examples/next-partial-prerendering/components/product-used-price.tsx b/examples/next-partial-prerendering/components/product-used-price.tsx
new file mode 100644
index 00000000..d79c70fb
--- /dev/null
+++ b/examples/next-partial-prerendering/components/product-used-price.tsx
@@ -0,0 +1,19 @@
+import { Product } from '#/types/product';
+import { dinero, toUnit, up, type DineroSnapshot } from 'dinero.js';
+
+export const ProductUsedPrice = ({
+ usedPrice: usedPriceRaw,
+}: {
+ usedPrice: Product['usedPrice'];
+}) => {
+ const usedPrice = dinero(usedPriceRaw as DineroSnapshot);
+
+ return (
+
+
More buying choices
+
+ ${toUnit(usedPrice, { digits: 0, round: up })} (used)
+
+
+ );
+};
diff --git a/examples/next-partial-prerendering/components/recommended-products.tsx b/examples/next-partial-prerendering/components/recommended-products.tsx
new file mode 100644
index 00000000..982e4add
--- /dev/null
+++ b/examples/next-partial-prerendering/components/recommended-products.tsx
@@ -0,0 +1,72 @@
+import { Product } from '#/types/product';
+import { ProductCard } from '#/components/product-card';
+import { delayRecommendedProducts, withDelay } from '#/lib/delay';
+
+export async function RecommendedProducts() {
+ let products: Product[] = await withDelay(
+ fetch(
+ // We intentionally delay the response to simulate a slow data
+ // request that would benefit from streaming
+ `https://app-router-api.vercel.app/api/products?filter=1`,
+ {
+ // We intentionally disable Next.js Cache to better demo
+ // streaming
+ cache: 'no-store',
+ },
+ ).then((res) => res.json()),
+ delayRecommendedProducts,
+ );
+
+ return (
+
+
+
+ Recommended Products for You
+
+
+ Based on your preferences and shopping habits
+
+
+
+ {products.map((product) => (
+
+ ))}
+
+
+ );
+}
+
+const shimmer = `relative overflow-hidden before:absolute before:inset-0 before:-translate-x-full before:animate-[shimmer_1.5s_infinite] before:bg-gradient-to-r before:from-transparent before:via-white/10 before:to-transparent`;
+
+function ProductSkeleton() {
+ return (
+
+ );
+}
+
+export function RecommendedProductsSkeleton() {
+ return (
+
+ );
+}
diff --git a/examples/next-partial-prerendering/components/reviews.tsx b/examples/next-partial-prerendering/components/reviews.tsx
new file mode 100644
index 00000000..28a5407e
--- /dev/null
+++ b/examples/next-partial-prerendering/components/reviews.tsx
@@ -0,0 +1,55 @@
+import type { Review } from '#/types/review';
+import { ProductReviewCard } from '#/components/product-review-card';
+import { delayReviews, withDelay } from '#/lib/delay';
+
+export async function Reviews() {
+ let reviews: Review[] = await withDelay(
+ fetch(
+ // We intentionally delay the response to simulate a slow data
+ // request that would benefit from streaming
+ `https://app-router-api.vercel.app/api/reviews`,
+ {
+ // We intentionally disable Next.js Cache to better demo
+ // streaming
+ cache: 'no-store',
+ },
+ ).then((res) => res.json()),
+ delayReviews,
+ );
+
+ return (
+
+
Customer Reviews
+
+ {reviews.map((review) => {
+ return
;
+ })}
+
+
+ );
+}
+
+const shimmer = `relative overflow-hidden before:absolute before:inset-0 before:-translate-x-full before:animate-[shimmer_1.5s_infinite] before:bg-gradient-to-r before:from-transparent before:via-white/10 before:to-transparent`;
+
+function Skeleton() {
+ return (
+
+ );
+}
+
+export function ReviewsSkeleton() {
+ return (
+
+ );
+}
diff --git a/examples/next-partial-prerendering/components/sidebar.tsx b/examples/next-partial-prerendering/components/sidebar.tsx
new file mode 100644
index 00000000..f7ffa4bb
--- /dev/null
+++ b/examples/next-partial-prerendering/components/sidebar.tsx
@@ -0,0 +1,100 @@
+'use client';
+
+import { NextLogo } from '#/components/next-logo';
+import { Bars3Icon, XMarkIcon } from '@heroicons/react/24/solid';
+
+import clsx from 'clsx';
+import { useState } from 'react';
+import Byline from '#/components/byline';
+import {
+ delayRecommendedProducts,
+ delayReviews,
+ delayShippingEstimate,
+} from '#/lib/delay';
+
+export function Sidebar() {
+ const [isOpen, setIsOpen] = useState(false);
+
+ return (
+
+
+
+
+
+
+
+
+ Partial Prerendering
+
+
+
+
setIsOpen(!isOpen)}
+ >
+
+ Menu
+
+ {isOpen ? (
+
+ ) : (
+
+ )}
+
+
+
+
+
+
+ Pink dots {' '}
+ denote artificially delayed responses for demo purposes:
+
+
+ Shipping estimate → {delayShippingEstimate}ms
+ Recommended products → {delayRecommendedProducts}ms
+ Reviews → {delayReviews}ms
+
+
+
+
+
+ Partial Prerendering
+ {' '}
+ combines ultra-quick static edge delivery with fully dynamic
+ capabilities. This is different from how your application behaves
+ today, where entire routes are either fully static or dynamic.
+
+
How it works:
+
+
+ A static route shell is served immediately, this makes
+ the initial load fast.
+
+
+ The shell leaves holes where dynamic content (that might
+ be slower) will be streamed in to minimize the perceived overall
+ page load time.
+
+
+ The async holes are loaded in parallel, reducing the overall load
+ time of the page.
+
+
+
+ Try refreshing the page to restart the demo.
+
+
+
+
+
+ );
+}
diff --git a/examples/next-partial-prerendering/components/single-product.tsx b/examples/next-partial-prerendering/components/single-product.tsx
new file mode 100644
index 00000000..a49147a2
--- /dev/null
+++ b/examples/next-partial-prerendering/components/single-product.tsx
@@ -0,0 +1,79 @@
+import { Pricing } from '#/components/pricing';
+import type { Product } from '#/types/product';
+import { ProductRating } from '#/components/product-rating';
+import Image from 'next/image';
+
+export async function SingleProduct() {
+ const product: Product = await fetch(
+ `https://app-router-api.vercel.app/api/products?id=1`,
+ ).then((res) => res.json());
+
+ return (
+
+
+
+
+
+
+
+ {product.name}
+
+
+
+
+
+
{product.description}
+
{product.description}
+
+
+
+ );
+}
diff --git a/examples/next-partial-prerendering/components/vercel-logo.tsx b/examples/next-partial-prerendering/components/vercel-logo.tsx
new file mode 100644
index 00000000..6550d288
--- /dev/null
+++ b/examples/next-partial-prerendering/components/vercel-logo.tsx
@@ -0,0 +1,11 @@
+export function VercelLogo() {
+ return (
+
+
+
+ );
+}
diff --git a/examples/next-partial-prerendering/lib/delay.ts b/examples/next-partial-prerendering/lib/delay.ts
new file mode 100644
index 00000000..e154d0b3
--- /dev/null
+++ b/examples/next-partial-prerendering/lib/delay.ts
@@ -0,0 +1,17 @@
+// Times are in milliseconds
+export const delayShippingEstimate = 2000;
+export const delayRecommendedProducts = 5000;
+export const delayReviews = 6000;
+
+export async function withDelay(
+ promise: Promise,
+ delay: number,
+): Promise {
+ // Ensure we throw if this throws
+ const ret = await promise;
+ return new Promise((resolve) => {
+ setTimeout(() => {
+ resolve(ret);
+ }, delay);
+ });
+}
diff --git a/examples/next-partial-prerendering/next-env.d.ts b/examples/next-partial-prerendering/next-env.d.ts
new file mode 100755
index 00000000..4f11a03d
--- /dev/null
+++ b/examples/next-partial-prerendering/next-env.d.ts
@@ -0,0 +1,5 @@
+///
+///
+
+// NOTE: This file should not be edited
+// see https://nextjs.org/docs/basic-features/typescript for more information.
diff --git a/examples/next-partial-prerendering/next.config.js b/examples/next-partial-prerendering/next.config.js
new file mode 100755
index 00000000..dec7014f
--- /dev/null
+++ b/examples/next-partial-prerendering/next.config.js
@@ -0,0 +1,8 @@
+/** @type {import('next').NextConfig} */
+const nextConfig = {
+ experimental: {
+ ppr: true,
+ },
+};
+
+module.exports = nextConfig;
diff --git a/examples/next-partial-prerendering/open-next.config.ts b/examples/next-partial-prerendering/open-next.config.ts
new file mode 100644
index 00000000..be6fadc3
--- /dev/null
+++ b/examples/next-partial-prerendering/open-next.config.ts
@@ -0,0 +1,25 @@
+import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js';
+
+const config: OpenNextConfig = {
+ default: {
+ override: {
+ wrapper: 'cloudflare-node',
+ converter: 'edge',
+ // Unused implementation
+ incrementalCache: 'dummy',
+ tagCache: 'dummy',
+ queue: 'dummy',
+ },
+ },
+
+ middleware: {
+ external: true,
+ override: {
+ wrapper: 'cloudflare-edge',
+ converter: 'edge',
+ proxyExternalRequest: 'fetch',
+ },
+ },
+};
+
+export default config;
diff --git a/examples/next-partial-prerendering/package.json b/examples/next-partial-prerendering/package.json
new file mode 100644
index 00000000..cd05edf9
--- /dev/null
+++ b/examples/next-partial-prerendering/package.json
@@ -0,0 +1,34 @@
+{
+ "private": true,
+ "scripts": {
+ "build": "next build",
+ "dev": "next dev --turbo",
+ "start": "next start",
+ "build:worker": "opennextjs-cloudflare",
+ "dev:worker": "wrangler dev --port 8771 --inspector-port 9331",
+ "preview": "pnpm build:worker && pnpm dev:worker"
+ },
+ "dependencies": {
+ "@heroicons/react": "2.1.5",
+ "clsx": "2.1.1",
+ "date-fns": "3.6.0",
+ "dinero.js": "2.0.0-alpha.8",
+ "geist": "1.3.1",
+ "next": "15.0.0-canary.67",
+ "react": "19.0.0-rc-8b08e99e-20240713",
+ "react-dom": "19.0.0-rc-8b08e99e-20240713"
+ },
+ "devDependencies": {
+ "@opennextjs/cloudflare": "workspace:*",
+ "@tailwindcss/forms": "0.5.7",
+ "@tailwindcss/typography": "0.5.13",
+ "@types/node": "20.14.10",
+ "@types/react": "18.3.3",
+ "@types/react-dom": "18.3.0",
+ "autoprefixer": "10.4.19",
+ "postcss": "8.4.39",
+ "tailwindcss": "3.4.5",
+ "typescript": "5.5.3",
+ "wrangler": "catalog:"
+ }
+}
diff --git a/examples/next-partial-prerendering/postcss.config.js b/examples/next-partial-prerendering/postcss.config.js
new file mode 100644
index 00000000..12a703d9
--- /dev/null
+++ b/examples/next-partial-prerendering/postcss.config.js
@@ -0,0 +1,6 @@
+module.exports = {
+ plugins: {
+ tailwindcss: {},
+ autoprefixer: {},
+ },
+};
diff --git a/examples/next-partial-prerendering/public/alexander-andrews-brAkTCdnhW8-unsplash.jpg b/examples/next-partial-prerendering/public/alexander-andrews-brAkTCdnhW8-unsplash.jpg
new file mode 100644
index 00000000..9d5daa0f
Binary files /dev/null and b/examples/next-partial-prerendering/public/alexander-andrews-brAkTCdnhW8-unsplash.jpg differ
diff --git a/examples/next-partial-prerendering/public/eniko-kis-KsLPTsYaqIQ-unsplash.jpg b/examples/next-partial-prerendering/public/eniko-kis-KsLPTsYaqIQ-unsplash.jpg
new file mode 100644
index 00000000..40f4ffd5
Binary files /dev/null and b/examples/next-partial-prerendering/public/eniko-kis-KsLPTsYaqIQ-unsplash.jpg differ
diff --git a/examples/next-partial-prerendering/public/grid.svg b/examples/next-partial-prerendering/public/grid.svg
new file mode 100644
index 00000000..d467ad6d
--- /dev/null
+++ b/examples/next-partial-prerendering/public/grid.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/examples/next-partial-prerendering/public/guillaume-coupy-6HuoHgK7FN8-unsplash.jpg b/examples/next-partial-prerendering/public/guillaume-coupy-6HuoHgK7FN8-unsplash.jpg
new file mode 100644
index 00000000..527bbb51
Binary files /dev/null and b/examples/next-partial-prerendering/public/guillaume-coupy-6HuoHgK7FN8-unsplash.jpg differ
diff --git a/examples/next-partial-prerendering/public/nextjs-icon-light-background.png b/examples/next-partial-prerendering/public/nextjs-icon-light-background.png
new file mode 100644
index 00000000..659139c1
Binary files /dev/null and b/examples/next-partial-prerendering/public/nextjs-icon-light-background.png differ
diff --git a/examples/next-partial-prerendering/public/patrick-OIFgeLnjwrM-unsplash.jpg b/examples/next-partial-prerendering/public/patrick-OIFgeLnjwrM-unsplash.jpg
new file mode 100644
index 00000000..e19a4a1b
Binary files /dev/null and b/examples/next-partial-prerendering/public/patrick-OIFgeLnjwrM-unsplash.jpg differ
diff --git a/examples/next-partial-prerendering/public/prince-akachi-LWkFHEGpleE-unsplash.jpg b/examples/next-partial-prerendering/public/prince-akachi-LWkFHEGpleE-unsplash.jpg
new file mode 100644
index 00000000..146a6804
Binary files /dev/null and b/examples/next-partial-prerendering/public/prince-akachi-LWkFHEGpleE-unsplash.jpg differ
diff --git a/examples/next-partial-prerendering/public/yoann-siloine-_T4w3JDm6ug-unsplash.jpg b/examples/next-partial-prerendering/public/yoann-siloine-_T4w3JDm6ug-unsplash.jpg
new file mode 100644
index 00000000..ca2d1746
Binary files /dev/null and b/examples/next-partial-prerendering/public/yoann-siloine-_T4w3JDm6ug-unsplash.jpg differ
diff --git a/examples/next-partial-prerendering/tailwind.config.ts b/examples/next-partial-prerendering/tailwind.config.ts
new file mode 100644
index 00000000..2f0e2ba2
--- /dev/null
+++ b/examples/next-partial-prerendering/tailwind.config.ts
@@ -0,0 +1,89 @@
+import colors from 'tailwindcss/colors';
+import { Config } from 'tailwindcss';
+
+export default {
+ content: [
+ './app/**/*.{js,ts,jsx,tsx,mdx}',
+ './components/**/*.{js,ts,jsx,tsx,mdx}',
+ ],
+ future: {
+ hoverOnlyWhenSupported: true,
+ },
+ darkMode: 'class',
+ theme: {
+ extend: {
+ // https://vercel.com/design/color
+ colors: {
+ gray: colors.zinc,
+ 'gray-1000': 'rgb(17,17,19)',
+ 'gray-1100': 'rgb(10,10,11)',
+ vercel: {
+ pink: '#FF0080',
+ blue: '#0070F3',
+ cyan: '#50E3C2',
+ orange: '#F5A623',
+ violet: '#7928CA',
+ },
+ },
+ backgroundImage: ({ theme }) => ({
+ 'vc-border-gradient': `radial-gradient(at left top, ${theme(
+ 'colors.gray.500',
+ )}, 50px, ${theme('colors.gray.800')} 50%)`,
+ }),
+ keyframes: ({ theme }) => ({
+ rerender: {
+ '0%': {
+ ['border-color']: theme('colors.vercel.pink'),
+ },
+ '40%': {
+ ['border-color']: theme('colors.vercel.pink'),
+ },
+ },
+ highlight: {
+ '0%': {
+ background: theme('colors.vercel.pink'),
+ color: theme('colors.white'),
+ },
+ '40%': {
+ background: theme('colors.vercel.pink'),
+ color: theme('colors.white'),
+ },
+ },
+ loading: {
+ '0%': {
+ opacity: '.2',
+ },
+ '20%': {
+ opacity: '1',
+ transform: 'translateX(1px)',
+ },
+ to: {
+ opacity: '.2',
+ },
+ },
+ shimmer: {
+ '100%': {
+ transform: 'translateX(100%)',
+ },
+ },
+ translateXReset: {
+ '100%': {
+ transform: 'translateX(0)',
+ },
+ },
+ fadeToTransparent: {
+ '0%': {
+ opacity: '1',
+ },
+ '40%': {
+ opacity: '1',
+ },
+ '100%': {
+ opacity: '0',
+ },
+ },
+ }),
+ },
+ },
+ plugins: [require('@tailwindcss/typography'), require('@tailwindcss/forms')],
+} satisfies Config;
diff --git a/examples/next-partial-prerendering/tsconfig.json b/examples/next-partial-prerendering/tsconfig.json
new file mode 100755
index 00000000..0b1935d9
--- /dev/null
+++ b/examples/next-partial-prerendering/tsconfig.json
@@ -0,0 +1,29 @@
+{
+ "compilerOptions": {
+ "target": "es5",
+ "lib": ["dom", "dom.iterable", "esnext"],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "strict": true,
+ "forceConsistentCasingInFileNames": true,
+ "noEmit": true,
+ "esModuleInterop": true,
+ "module": "esnext",
+ "moduleResolution": "node",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "jsx": "preserve",
+ "incremental": true,
+ "baseUrl": ".",
+ "paths": {
+ "#/*": ["./*"]
+ },
+ "plugins": [
+ {
+ "name": "next"
+ }
+ ]
+ },
+ "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
+ "exclude": ["node_modules", "open-next.config.ts"]
+}
diff --git a/examples/next-partial-prerendering/types/product.d.ts b/examples/next-partial-prerendering/types/product.d.ts
new file mode 100644
index 00000000..c279cf76
--- /dev/null
+++ b/examples/next-partial-prerendering/types/product.d.ts
@@ -0,0 +1,37 @@
+export type Product = {
+ id: string;
+ stock: number;
+ rating: number;
+ name: string;
+ description: string;
+ price: Price;
+ isBestSeller: boolean;
+ leadTime: number;
+ image?: string;
+ imageBlur?: string;
+ discount?: Discount;
+ usedPrice?: UsedPrice;
+};
+
+type Price = {
+ amount: number;
+ currency: Currency;
+ scale: number;
+};
+
+type Currency = {
+ code: string;
+ base: number;
+ exponent: number;
+};
+
+type Discount = {
+ percent: number;
+ expires?: number;
+};
+
+type UsedPrice = {
+ amount: number;
+ currency: Currency;
+ scale: number;
+};
diff --git a/examples/next-partial-prerendering/types/review.d.ts b/examples/next-partial-prerendering/types/review.d.ts
new file mode 100644
index 00000000..0135e4d2
--- /dev/null
+++ b/examples/next-partial-prerendering/types/review.d.ts
@@ -0,0 +1,6 @@
+export type Review = {
+ id: string;
+ name: string;
+ rating: number;
+ text: string;
+};
diff --git a/examples/next-partial-prerendering/wrangler.json b/examples/next-partial-prerendering/wrangler.json
new file mode 100644
index 00000000..3d215410
--- /dev/null
+++ b/examples/next-partial-prerendering/wrangler.json
@@ -0,0 +1,11 @@
+{
+ "$schema": "node_modules/wrangler/config-schema.json",
+ "main": ".open-next/worker.js",
+ "name": "next-partial-prerendering",
+ "compatibility_date": "2024-12-30",
+ "compatibility_flags": ["nodejs_compat"],
+ "assets": {
+ "directory": ".open-next/assets",
+ "binding": "ASSETS"
+ }
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 7fa0f7d2..1a7ea1c5 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -589,6 +589,67 @@ importers:
specifier: 'catalog:'
version: 3.107.0(@cloudflare/workers-types@4.20250109.0)
+ examples/next-partial-prerendering:
+ dependencies:
+ '@heroicons/react':
+ specifier: 2.1.5
+ version: 2.1.5(react@19.0.0-rc-8b08e99e-20240713)
+ clsx:
+ specifier: 2.1.1
+ version: 2.1.1
+ date-fns:
+ specifier: 3.6.0
+ version: 3.6.0
+ dinero.js:
+ specifier: 2.0.0-alpha.8
+ version: 2.0.0-alpha.8
+ geist:
+ specifier: 1.3.1
+ version: 1.3.1(next@15.0.0-canary.67(@opentelemetry/api@1.9.0)(@playwright/test@1.47.0)(react-dom@19.0.0-rc-8b08e99e-20240713(react@19.0.0-rc-8b08e99e-20240713))(react@19.0.0-rc-8b08e99e-20240713))
+ next:
+ specifier: 15.0.0-canary.67
+ version: 15.0.0-canary.67(@opentelemetry/api@1.9.0)(@playwright/test@1.47.0)(react-dom@19.0.0-rc-8b08e99e-20240713(react@19.0.0-rc-8b08e99e-20240713))(react@19.0.0-rc-8b08e99e-20240713)
+ react:
+ specifier: 19.0.0-rc-8b08e99e-20240713
+ version: 19.0.0-rc-8b08e99e-20240713
+ react-dom:
+ specifier: 19.0.0-rc-8b08e99e-20240713
+ version: 19.0.0-rc-8b08e99e-20240713(react@19.0.0-rc-8b08e99e-20240713)
+ devDependencies:
+ '@opennextjs/cloudflare':
+ specifier: workspace:*
+ version: link:../../packages/cloudflare
+ '@tailwindcss/forms':
+ specifier: 0.5.7
+ version: 0.5.7(tailwindcss@3.4.5(ts-node@10.9.1(@types/node@20.14.10)(typescript@5.5.3)))
+ '@tailwindcss/typography':
+ specifier: 0.5.13
+ version: 0.5.13(tailwindcss@3.4.5(ts-node@10.9.1(@types/node@20.14.10)(typescript@5.5.3)))
+ '@types/node':
+ specifier: 20.14.10
+ version: 20.14.10
+ '@types/react':
+ specifier: 18.3.3
+ version: 18.3.3
+ '@types/react-dom':
+ specifier: 18.3.0
+ version: 18.3.0
+ autoprefixer:
+ specifier: 10.4.19
+ version: 10.4.19(postcss@8.4.39)
+ postcss:
+ specifier: 8.4.39
+ version: 8.4.39
+ tailwindcss:
+ specifier: 3.4.5
+ version: 3.4.5(ts-node@10.9.1(@types/node@20.14.10)(typescript@5.5.3))
+ typescript:
+ specifier: 5.5.3
+ version: 5.5.3
+ wrangler:
+ specifier: 'catalog:'
+ version: 3.107.0(@cloudflare/workers-types@4.20250109.0)
+
examples/vercel-blog-starter:
dependencies:
classnames:
@@ -1390,6 +1451,15 @@ packages:
resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
engines: {node: '>=12'}
+ '@dinero.js/calculator-number@2.0.0-alpha.8':
+ resolution: {integrity: sha512-/L+N7g5DjcS6wlMb2hcOXWBKW2TGiG+vZDZr9ow0nsHUTdwtMarL1bmBH9fGldHhH2XsxcrjN9H+036yeNzh3Q==}
+
+ '@dinero.js/core@2.0.0-alpha.8':
+ resolution: {integrity: sha512-3jaw2j6J/SshlCZz5KhHkh8zP47HRmt9RpnjR0BJs2awpweVuZIyyX9qzGVUEVpml9IwzQ1U+YdXevhOxtcDgg==}
+
+ '@dinero.js/currencies@2.0.0-alpha.8':
+ resolution: {integrity: sha512-zApiqtuuPwjiM9LJA5/kNcT48VSHRiz2/mktkXjIpfxrJKzthXybUAgEenExIH6dYhLDgVmsLQZtZFOsdYl0Ag==}
+
'@dotenvx/dotenvx@1.31.0':
resolution: {integrity: sha512-GeDxvtjiRuoyWVU9nQneId879zIyNdL05bS7RKiqMkfBSKpHMWHLoRyRqjYWLaXmX/llKO1hTlqHDmatkQAjPA==}
hasBin: true
@@ -2977,6 +3047,9 @@ packages:
'@next/env@15.0.0-canary.113':
resolution: {integrity: sha512-hiD7ux+YPCUJi3up0dHnROYBYg/AuPErOcBBzjCkKQ1q4ufuUNBQms4oDeOiHG9+Qga8mN5+k2L5qm7rNhzU4g==}
+ '@next/env@15.0.0-canary.67':
+ resolution: {integrity: sha512-PkVYpfGi4fHxlFST2MSDl4RptW1t4WaLSoDK+/X3EUvU0i2gDZoi9ktZ/29Sh1XjlY8moFPWsqUsbLmsZWVVvQ==}
+
'@next/env@15.0.4':
resolution: {integrity: sha512-WNRvtgnRVDD4oM8gbUcRc27IAhaL4eXQ/2ovGbgLnPGUvdyDr8UdXP4Q/IBDdAdojnD2eScryIDirv0YUCjUVw==}
@@ -3004,6 +3077,12 @@ packages:
cpu: [arm64]
os: [darwin]
+ '@next/swc-darwin-arm64@15.0.0-canary.67':
+ resolution: {integrity: sha512-w+SNDkXH/XBRdHgcAvoBc3zEktjSd2IlJ3Mt/To5ceYo/776CIc1c9bU+DEfjqtMwkNXqPZmBJqblolp2qbOqQ==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [darwin]
+
'@next/swc-darwin-arm64@15.0.4':
resolution: {integrity: sha512-QecQXPD0yRHxSXWL5Ff80nD+A56sUXZG9koUsjWJwA2Z0ZgVQfuy7gd0/otjxoOovPVHR2eVEvPMHbtZP+pf9w==}
engines: {node: '>= 10'}
@@ -3028,6 +3107,12 @@ packages:
cpu: [x64]
os: [darwin]
+ '@next/swc-darwin-x64@15.0.0-canary.67':
+ resolution: {integrity: sha512-/Wp1rLJjO5RvYidj4By0h2qnccHGPhWKpC9cDdNn6XwiMTYbA3YbrsWJPZsJt1vcfQ+TZgN6YPVFO7/XSJqz2w==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [darwin]
+
'@next/swc-darwin-x64@15.0.4':
resolution: {integrity: sha512-pb7Bye3y1Og3PlCtnz2oO4z+/b3pH2/HSYkLbL0hbVuTGil7fPen8/3pyyLjdiTLcFJ+ymeU3bck5hd4IPFFCA==}
engines: {node: '>= 10'}
@@ -3052,6 +3137,12 @@ packages:
cpu: [arm64]
os: [linux]
+ '@next/swc-linux-arm64-gnu@15.0.0-canary.67':
+ resolution: {integrity: sha512-TvgVRLN/p2P5ZVCqDKKPEzYJ8qKLUrf8U1yejTh1SYaMDK1Rz0I0roRXQQFYfRhAv3l5QmdFZbx98ZI5/IQjhA==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+
'@next/swc-linux-arm64-gnu@15.0.4':
resolution: {integrity: sha512-12oSaBFjGpB227VHzoXF3gJoK2SlVGmFJMaBJSu5rbpaoT5OjP5OuCLuR9/jnyBF1BAWMs/boa6mLMoJPRriMA==}
engines: {node: '>= 10'}
@@ -3076,6 +3167,12 @@ packages:
cpu: [arm64]
os: [linux]
+ '@next/swc-linux-arm64-musl@15.0.0-canary.67':
+ resolution: {integrity: sha512-EgExLdxjjUrTkvfsw//fX/bmZY8xl6ZrP9VqwhmHOFCAp5MDJi29bSbx0oYCcUPhsThAmqbno90Mu7JMfU4JeA==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+
'@next/swc-linux-arm64-musl@15.0.4':
resolution: {integrity: sha512-QARO88fR/a+wg+OFC3dGytJVVviiYFEyjc/Zzkjn/HevUuJ7qGUUAUYy5PGVWY1YgTzeRYz78akQrVQ8r+sMjw==}
engines: {node: '>= 10'}
@@ -3100,6 +3197,12 @@ packages:
cpu: [x64]
os: [linux]
+ '@next/swc-linux-x64-gnu@15.0.0-canary.67':
+ resolution: {integrity: sha512-tMEcNBtNjI+wfKM4fJOps3PzKbDswly08GAycI9BiuugNKpG1RPEHqbyfo27C6nQf5I7u7r7S55qJ4KZfHPTxA==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+
'@next/swc-linux-x64-gnu@15.0.4':
resolution: {integrity: sha512-Z50b0gvYiUU1vLzfAMiChV8Y+6u/T2mdfpXPHraqpypP7yIT2UV9YBBhcwYkxujmCvGEcRTVWOj3EP7XW/wUnw==}
engines: {node: '>= 10'}
@@ -3124,6 +3227,12 @@ packages:
cpu: [x64]
os: [linux]
+ '@next/swc-linux-x64-musl@15.0.0-canary.67':
+ resolution: {integrity: sha512-y8g3Afo+AkM9M1R2qLSjRKdDBsSzgd7CnUXT6OtxsaEsHwBAz9BBeANwo26Tc0K82U23Ev4uj7XS/Dr3jG5Row==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+
'@next/swc-linux-x64-musl@15.0.4':
resolution: {integrity: sha512-7H9C4FAsrTAbA/ENzvFWsVytqRYhaJYKa2B3fyQcv96TkOGVMcvyS6s+sj4jZlacxxTcn7ygaMXUPkEk7b78zw==}
engines: {node: '>= 10'}
@@ -3148,6 +3257,12 @@ packages:
cpu: [arm64]
os: [win32]
+ '@next/swc-win32-arm64-msvc@15.0.0-canary.67':
+ resolution: {integrity: sha512-SZr5EoYk9pQHPuwmDJUEwyQIbCPFEo8zdV+7gpTx3NZgmdDtgoG+gsct/ya9hLvP8sMw9x6gl+0YacSMd1lQNA==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [win32]
+
'@next/swc-win32-arm64-msvc@15.0.4':
resolution: {integrity: sha512-Z/v3WV5xRaeWlgJzN9r4PydWD8sXV35ywc28W63i37G2jnUgScA4OOgS8hQdiXLxE3gqfSuHTicUhr7931OXPQ==}
engines: {node: '>= 10'}
@@ -3172,6 +3287,12 @@ packages:
cpu: [ia32]
os: [win32]
+ '@next/swc-win32-ia32-msvc@15.0.0-canary.67':
+ resolution: {integrity: sha512-u4gm/gCUU+e8Y77LoTRo3yfzh/qIQg3FmGTw4vB/WYBNcfU8xm02CL0SZtgePzLLia0WsETW3cgoNPQPr3ae+w==}
+ engines: {node: '>= 10'}
+ cpu: [ia32]
+ os: [win32]
+
'@next/swc-win32-x64-msvc@14.2.11':
resolution: {integrity: sha512-gQpS7mcgovWoaTG1FbS5/ojF7CGfql1Q0ZLsMrhcsi2Sr9HEqsUZ70MPJyaYBXbk6iEAP7UXMD9HC8KY1qNwvA==}
engines: {node: '>= 10'}
@@ -3184,6 +3305,12 @@ packages:
cpu: [x64]
os: [win32]
+ '@next/swc-win32-x64-msvc@15.0.0-canary.67':
+ resolution: {integrity: sha512-nfJVGjNh9d2V81mzCPq8cQ2w/YMAI6V2OejepR/jBKxZ+n0PJKrUHf52e+Ubak8bZOIvxKqaOj4WaceOljqNMQ==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [win32]
+
'@next/swc-win32-x64-msvc@15.0.4':
resolution: {integrity: sha512-NGLchGruagh8lQpDr98bHLyWJXOBSmkEAfK980OiNBa7vNm6PsNoPvzTfstT78WyOeMRQphEQ455rggd7Eo+Dw==}
engines: {node: '>= 10'}
@@ -4013,6 +4140,9 @@ packages:
'@swc/counter@0.1.3':
resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==}
+ '@swc/helpers@0.5.11':
+ resolution: {integrity: sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A==}
+
'@swc/helpers@0.5.12':
resolution: {integrity: sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g==}
@@ -4048,6 +4178,16 @@ packages:
peerDependencies:
tailwindcss: '>=3.2.0'
+ '@tailwindcss/forms@0.5.7':
+ resolution: {integrity: sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==}
+ peerDependencies:
+ tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1'
+
+ '@tailwindcss/typography@0.5.13':
+ resolution: {integrity: sha512-ADGcJ8dX21dVVHIwTRgzrcunY6YY9uSlAHHGVKvkA+vLc5qLwEszvKts40lx7z0qc4clpjclwLeK5rVCV2P/uw==}
+ peerDependencies:
+ tailwindcss: '>=3.0.0 || insiders'
+
'@tailwindcss/typography@0.5.15':
resolution: {integrity: sha512-AqhlCXl+8grUz8uqExv5OTtgpjuVIwFTSXTrh8y9/pw6q2ek7fJ+Y8ZEVw7EB2DCcuCOtEjf9w3+J3rzts01uA==}
peerDependencies:
@@ -4164,6 +4304,9 @@ packages:
'@types/node@16.18.11':
resolution: {integrity: sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==}
+ '@types/node@20.14.10':
+ resolution: {integrity: sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==}
+
'@types/node@20.17.6':
resolution: {integrity: sha512-VEI7OdvK2wP7XHnsuXbAJnEpEkF6NjSN45QJlL4VGqZSXsnicpesdTWsg9RISeSdYd3yeRj/y3k5KGjUXYnFwQ==}
@@ -4556,6 +4699,13 @@ packages:
peerDependencies:
postcss: ^8.1.0
+ autoprefixer@10.4.19:
+ resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==}
+ engines: {node: ^10 || ^12 || >=14}
+ hasBin: true
+ peerDependencies:
+ postcss: ^8.1.0
+
autoprefixer@10.4.20:
resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==}
engines: {node: ^10 || ^12 || >=14}
@@ -5069,6 +5219,9 @@ packages:
resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
engines: {node: '>=0.3.1'}
+ dinero.js@2.0.0-alpha.8:
+ resolution: {integrity: sha512-6bl+g6oh6iQ6vPR5Pd4qr7D+P5e51GYRUT3jl8HYqYeejYC5sd9OVTTbXC3WU7L25mAIbOm+diiTVz1rL4QLwg==}
+
dir-glob@3.0.1:
resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
engines: {node: '>=8'}
@@ -6855,6 +7008,10 @@ packages:
resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
engines: {node: '>=4'}
+ mini-svg-data-uri@1.4.4:
+ resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==}
+ hasBin: true
+
miniflare@3.20250124.1:
resolution: {integrity: sha512-BL8jq7btzaHFs/8PwYjBIiBecyqkEwkJIsFvoO/4bJn8O9NAbFaLSB023nGpfwWCebP6uSepzqZm4hrOOxA8Eg==}
engines: {node: '>=16.13'}
@@ -7028,6 +7185,27 @@ packages:
sass:
optional: true
+ next@15.0.0-canary.67:
+ resolution: {integrity: sha512-t6TK98DaoVLfhMF5S3EhSyLjsDh06UjEiYGPScSft9DIdmY0SIjOFOHUVBuZ3Mt+oeuhSyZHs4q5G0+KLvxiSA==}
+ engines: {node: '>=18.18.0'}
+ hasBin: true
+ peerDependencies:
+ '@opentelemetry/api': ^1.1.0
+ '@playwright/test': ^1.41.2
+ babel-plugin-react-compiler: '*'
+ react: 19.0.0-rc.0
+ react-dom: 19.0.0-rc.0
+ sass: ^1.3.0
+ peerDependenciesMeta:
+ '@opentelemetry/api':
+ optional: true
+ '@playwright/test':
+ optional: true
+ babel-plugin-react-compiler:
+ optional: true
+ sass:
+ optional: true
+
next@15.0.4:
resolution: {integrity: sha512-nuy8FH6M1FG0lktGotamQDCXhh5hZ19Vo0ht1AOIQWrYJLP598TIUagKtvJrfJ5AGwB/WmDqkKaKhMpVifvGPA==}
engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0}
@@ -7485,6 +7663,10 @@ packages:
resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==}
engines: {node: ^10 || ^12 || >=14}
+ postcss@8.4.39:
+ resolution: {integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==}
+ engines: {node: ^10 || ^12 || >=14}
+
postcss@8.4.47:
resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==}
engines: {node: ^10 || ^12 || >=14}
@@ -7674,6 +7856,11 @@ packages:
peerDependencies:
react: 19.0.0-rc-3208e73e-20240730
+ react-dom@19.0.0-rc-8b08e99e-20240713:
+ resolution: {integrity: sha512-nTbNXc5LVuFh+CwsmwogdYzHumZb9LVtWr1pE3DFHjY3y2VM/bYg8d00Vn6WWqQ8js3PY1w150NEEax4CrtsTA==}
+ peerDependencies:
+ react: 19.0.0-rc-8b08e99e-20240713
+
react-hook-form@7.54.2:
resolution: {integrity: sha512-eHpAUgUjWbZocoQYUHposymRb4ZP6d0uwUnooL2uOybA9/3tPUvoAKqEWK1WaSiTxxOfTpffNZP7QwlnM3/gEg==}
engines: {node: '>=18.0.0'}
@@ -7700,6 +7887,10 @@ packages:
resolution: {integrity: sha512-4TmFOcgSfwM8w18vXLnEt8tb3ilO9a0GRJA9zQSYjZ5ie6g/zkxagRvZvZbEmhaNgDSF/PKmEdWmfBtlUBcjkA==}
engines: {node: '>=0.10.0'}
+ react@19.0.0-rc-8b08e99e-20240713:
+ resolution: {integrity: sha512-j56t3i/sMNftehdO/cA0kFeKDh9Pi1FxKba6u0sRgzZ73HVWii64oUbFxkUmf6I/C9uCmovY3HnFpT7/0UTIaw==}
+ engines: {node: '>=0.10.0'}
+
read-cache@1.0.0:
resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
@@ -7880,6 +8071,9 @@ packages:
scheduler@0.25.0-rc-3208e73e-20240730:
resolution: {integrity: sha512-eCGy6Bm6PX2JB7dLumQuEYwmXku9HweMfdXCQQ2ZaRG3kwxK76RWFr7CsW/LHju8fiDSiJajl0Iq62uoaH9VLQ==}
+ scheduler@0.25.0-rc-8b08e99e-20240713:
+ resolution: {integrity: sha512-vPAQ9hTVeh54O7K7nTH5rIr060XI2E5xXSLOeiDpZVjtZW9DhZMjq4L82aI8J5EZPwYlWH69SdKBwFMIleNkUQ==}
+
section-matter@1.0.0:
resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==}
engines: {node: '>=4'}
@@ -8271,6 +8465,11 @@ packages:
engines: {node: '>=14.0.0'}
hasBin: true
+ tailwindcss@3.4.5:
+ resolution: {integrity: sha512-DlTxttYcogpDfx3tf/8jfnma1nfAYi2cBUYV2YNoPPecwmO3YGiFlOX9D8tGAu+EDF38ryBzvrDKU/BLMsUwbw==}
+ engines: {node: '>=14.0.0'}
+ hasBin: true
+
tapable@2.2.1:
resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
engines: {node: '>=6'}
@@ -8501,6 +8700,11 @@ packages:
engines: {node: '>=4.2.0'}
hasBin: true
+ typescript@5.5.3:
+ resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
typescript@5.7.3:
resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==}
engines: {node: '>=14.17'}
@@ -8519,6 +8723,9 @@ packages:
resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==}
engines: {node: '>= 0.4'}
+ undici-types@5.26.5:
+ resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
+
undici-types@6.13.0:
resolution: {integrity: sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==}
@@ -10488,6 +10695,16 @@ snapshots:
dependencies:
'@jridgewell/trace-mapping': 0.3.9
+ '@dinero.js/calculator-number@2.0.0-alpha.8':
+ dependencies:
+ '@dinero.js/core': 2.0.0-alpha.8
+
+ '@dinero.js/core@2.0.0-alpha.8':
+ dependencies:
+ '@dinero.js/currencies': 2.0.0-alpha.8
+
+ '@dinero.js/currencies@2.0.0-alpha.8': {}
+
'@dotenvx/dotenvx@1.31.0':
dependencies:
commander: 11.1.0
@@ -11497,7 +11714,7 @@ snapshots:
'@grpc/grpc-js@1.9.15':
dependencies:
'@grpc/proto-loader': 0.7.13
- '@types/node': 20.17.6
+ '@types/node': 20.14.10
'@grpc/proto-loader@0.7.13':
dependencies:
@@ -11519,6 +11736,10 @@ snapshots:
dependencies:
react: 19.0.0-rc-3208e73e-20240730
+ '@heroicons/react@2.1.5(react@19.0.0-rc-8b08e99e-20240713)':
+ dependencies:
+ react: 19.0.0-rc-8b08e99e-20240713
+
'@hookform/resolvers@3.10.0(react-hook-form@7.54.2(react@19.0.0))':
dependencies:
react-hook-form: 7.54.2(react@19.0.0)
@@ -11753,6 +11974,8 @@ snapshots:
'@next/env@15.0.0-canary.113': {}
+ '@next/env@15.0.0-canary.67': {}
+
'@next/env@15.0.4': {}
'@next/env@15.1.0': {}
@@ -11775,6 +11998,9 @@ snapshots:
'@next/swc-darwin-arm64@15.0.0-canary.113':
optional: true
+ '@next/swc-darwin-arm64@15.0.0-canary.67':
+ optional: true
+
'@next/swc-darwin-arm64@15.0.4':
optional: true
@@ -11787,6 +12013,9 @@ snapshots:
'@next/swc-darwin-x64@15.0.0-canary.113':
optional: true
+ '@next/swc-darwin-x64@15.0.0-canary.67':
+ optional: true
+
'@next/swc-darwin-x64@15.0.4':
optional: true
@@ -11799,6 +12028,9 @@ snapshots:
'@next/swc-linux-arm64-gnu@15.0.0-canary.113':
optional: true
+ '@next/swc-linux-arm64-gnu@15.0.0-canary.67':
+ optional: true
+
'@next/swc-linux-arm64-gnu@15.0.4':
optional: true
@@ -11811,6 +12043,9 @@ snapshots:
'@next/swc-linux-arm64-musl@15.0.0-canary.113':
optional: true
+ '@next/swc-linux-arm64-musl@15.0.0-canary.67':
+ optional: true
+
'@next/swc-linux-arm64-musl@15.0.4':
optional: true
@@ -11823,6 +12058,9 @@ snapshots:
'@next/swc-linux-x64-gnu@15.0.0-canary.113':
optional: true
+ '@next/swc-linux-x64-gnu@15.0.0-canary.67':
+ optional: true
+
'@next/swc-linux-x64-gnu@15.0.4':
optional: true
@@ -11835,6 +12073,9 @@ snapshots:
'@next/swc-linux-x64-musl@15.0.0-canary.113':
optional: true
+ '@next/swc-linux-x64-musl@15.0.0-canary.67':
+ optional: true
+
'@next/swc-linux-x64-musl@15.0.4':
optional: true
@@ -11847,6 +12088,9 @@ snapshots:
'@next/swc-win32-arm64-msvc@15.0.0-canary.113':
optional: true
+ '@next/swc-win32-arm64-msvc@15.0.0-canary.67':
+ optional: true
+
'@next/swc-win32-arm64-msvc@15.0.4':
optional: true
@@ -11859,12 +12103,18 @@ snapshots:
'@next/swc-win32-ia32-msvc@15.0.0-canary.113':
optional: true
+ '@next/swc-win32-ia32-msvc@15.0.0-canary.67':
+ optional: true
+
'@next/swc-win32-x64-msvc@14.2.11':
optional: true
'@next/swc-win32-x64-msvc@15.0.0-canary.113':
optional: true
+ '@next/swc-win32-x64-msvc@15.0.0-canary.67':
+ optional: true
+
'@next/swc-win32-x64-msvc@15.0.4':
optional: true
@@ -13021,6 +13271,10 @@ snapshots:
'@swc/counter@0.1.3': {}
+ '@swc/helpers@0.5.11':
+ dependencies:
+ tslib: 2.8.1
+
'@swc/helpers@0.5.12':
dependencies:
tslib: 2.6.3
@@ -13055,6 +13309,19 @@ snapshots:
dependencies:
tailwindcss: 3.4.11(ts-node@10.9.1(@types/node@22.2.0)(typescript@5.7.3))
+ '@tailwindcss/forms@0.5.7(tailwindcss@3.4.5(ts-node@10.9.1(@types/node@20.14.10)(typescript@5.5.3)))':
+ dependencies:
+ mini-svg-data-uri: 1.4.4
+ tailwindcss: 3.4.5(ts-node@10.9.1(@types/node@20.14.10)(typescript@5.5.3))
+
+ '@tailwindcss/typography@0.5.13(tailwindcss@3.4.5(ts-node@10.9.1(@types/node@20.14.10)(typescript@5.5.3)))':
+ dependencies:
+ lodash.castarray: 4.4.0
+ lodash.isplainobject: 4.0.6
+ lodash.merge: 4.6.2
+ postcss-selector-parser: 6.0.10
+ tailwindcss: 3.4.5(ts-node@10.9.1(@types/node@20.14.10)(typescript@5.5.3))
+
'@tailwindcss/typography@0.5.15(tailwindcss@3.4.11(ts-node@10.9.1(@types/node@22.2.0)(typescript@5.7.3)))':
dependencies:
lodash.castarray: 4.4.0
@@ -13114,14 +13381,14 @@ snapshots:
'@types/body-parser@1.19.5':
dependencies:
'@types/connect': 3.4.38
- '@types/node': 20.17.6
+ '@types/node': 20.14.10
'@types/caseless@0.12.5':
optional: true
'@types/connect@3.4.38':
dependencies:
- '@types/node': 20.17.6
+ '@types/node': 20.14.10
'@types/debug@4.1.12':
dependencies:
@@ -13133,7 +13400,7 @@ snapshots:
'@types/express-serve-static-core@4.19.6':
dependencies:
- '@types/node': 20.17.6
+ '@types/node': 20.14.10
'@types/qs': 6.9.18
'@types/range-parser': 1.2.7
'@types/send': 0.17.4
@@ -13158,7 +13425,7 @@ snapshots:
'@types/jsonwebtoken@9.0.8':
dependencies:
'@types/ms': 0.7.34
- '@types/node': 20.17.6
+ '@types/node': 20.14.10
'@types/long@4.0.2':
optional: true
@@ -13171,7 +13438,7 @@ snapshots:
'@types/mock-fs@4.13.4':
dependencies:
- '@types/node': 20.17.6
+ '@types/node': 20.14.10
'@types/ms@0.7.34': {}
@@ -13179,6 +13446,10 @@ snapshots:
'@types/node@16.18.11': {}
+ '@types/node@20.14.10':
+ dependencies:
+ undici-types: 5.26.5
+
'@types/node@20.17.6':
dependencies:
undici-types: 6.19.8
@@ -13219,7 +13490,7 @@ snapshots:
'@types/request@2.48.12':
dependencies:
'@types/caseless': 0.12.5
- '@types/node': 20.17.6
+ '@types/node': 20.14.10
'@types/tough-cookie': 4.0.5
form-data: 2.5.2
optional: true
@@ -13229,12 +13500,12 @@ snapshots:
'@types/send@0.17.4':
dependencies:
'@types/mime': 1.3.5
- '@types/node': 20.17.6
+ '@types/node': 20.14.10
'@types/serve-static@1.15.7':
dependencies:
'@types/http-errors': 2.0.4
- '@types/node': 20.17.6
+ '@types/node': 20.14.10
'@types/send': 0.17.4
'@types/tough-cookie@4.0.5':
@@ -13246,7 +13517,7 @@ snapshots:
'@types/ws@8.5.14':
dependencies:
- '@types/node': 20.17.6
+ '@types/node': 20.14.10
'@typescript-eslint/eslint-plugin@8.7.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3)':
dependencies:
@@ -13801,6 +14072,16 @@ snapshots:
postcss: 8.4.27
postcss-value-parser: 4.2.0
+ autoprefixer@10.4.19(postcss@8.4.39):
+ dependencies:
+ browserslist: 4.24.0
+ caniuse-lite: 1.0.30001664
+ fraction.js: 4.3.7
+ normalize-range: 0.1.2
+ picocolors: 1.1.0
+ postcss: 8.4.39
+ postcss-value-parser: 4.2.0
+
autoprefixer@10.4.20(postcss@8.4.47):
dependencies:
browserslist: 4.24.0
@@ -14269,6 +14550,12 @@ snapshots:
diff@4.0.2: {}
+ dinero.js@2.0.0-alpha.8:
+ dependencies:
+ '@dinero.js/calculator-number': 2.0.0-alpha.8
+ '@dinero.js/core': 2.0.0-alpha.8
+ '@dinero.js/currencies': 2.0.0-alpha.8
+
dir-glob@3.0.1:
dependencies:
path-type: 4.0.0
@@ -14868,8 +15155,8 @@ snapshots:
'@typescript-eslint/parser': 8.7.0(eslint@8.57.1)(typescript@5.7.3)
eslint: 8.57.1
eslint-import-resolver-node: 0.3.9
- eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1)
- eslint-plugin-import: 2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
+ eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1)
+ eslint-plugin-import: 2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1)
eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.1)
eslint-plugin-react: 7.36.1(eslint@8.57.1)
eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1)
@@ -14888,7 +15175,7 @@ snapshots:
'@typescript-eslint/parser': 8.7.0(eslint@8.57.1)(typescript@5.7.3)
eslint: 8.57.1
eslint-import-resolver-node: 0.3.9
- eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1)
+ eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1)
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.1)
eslint-plugin-react: 7.36.1(eslint@8.57.1)
@@ -14908,7 +15195,7 @@ snapshots:
'@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3)
eslint: 9.11.1(jiti@1.21.6)
eslint-import-resolver-node: 0.3.9
- eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@1.21.6))
+ eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint@9.11.1(jiti@1.21.6)))(eslint@9.11.1(jiti@1.21.6))
eslint-plugin-import: 2.31.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@1.21.6))
eslint-plugin-jsx-a11y: 6.10.0(eslint@9.11.1(jiti@1.21.6))
eslint-plugin-react: 7.37.4(eslint@9.11.1(jiti@1.21.6))
@@ -14928,32 +15215,32 @@ snapshots:
transitivePeerDependencies:
- supports-color
- eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1):
+ eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1):
dependencies:
'@nolyfill/is-core-module': 1.0.39
debug: 4.3.6
enhanced-resolve: 5.17.1
eslint: 8.57.1
- eslint-module-utils: 2.11.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
+ eslint-module-utils: 2.11.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1)
fast-glob: 3.3.2
get-tsconfig: 4.8.0
is-bun-module: 1.2.1
is-glob: 4.0.3
optionalDependencies:
- eslint-plugin-import: 2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
+ eslint-plugin-import: 2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1)
transitivePeerDependencies:
- '@typescript-eslint/parser'
- eslint-import-resolver-node
- eslint-import-resolver-webpack
- supports-color
- eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1):
+ eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1):
dependencies:
'@nolyfill/is-core-module': 1.0.39
debug: 4.3.6
enhanced-resolve: 5.17.1
eslint: 8.57.1
- eslint-module-utils: 2.11.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
+ eslint-module-utils: 2.11.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1)
fast-glob: 3.3.2
get-tsconfig: 4.8.0
is-bun-module: 1.2.1
@@ -14966,13 +15253,13 @@ snapshots:
- eslint-import-resolver-webpack
- supports-color
- eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@1.21.6)):
+ eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint@9.11.1(jiti@1.21.6)))(eslint@9.11.1(jiti@1.21.6)):
dependencies:
'@nolyfill/is-core-module': 1.0.39
debug: 4.3.6
enhanced-resolve: 5.17.1
eslint: 9.11.1(jiti@1.21.6)
- eslint-module-utils: 2.11.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@1.21.6))
+ eslint-module-utils: 2.11.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint@9.11.1(jiti@1.21.6)))(eslint@9.11.1(jiti@1.21.6)))(eslint@9.11.1(jiti@1.21.6))
fast-glob: 3.3.2
get-tsconfig: 4.8.0
is-bun-module: 1.2.1
@@ -14985,51 +15272,62 @@ snapshots:
- eslint-import-resolver-webpack
- supports-color
- eslint-module-utils@2.11.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1):
+ eslint-module-utils@2.11.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1):
dependencies:
debug: 3.2.7
optionalDependencies:
'@typescript-eslint/parser': 8.7.0(eslint@8.57.1)(typescript@5.7.3)
eslint: 8.57.1
eslint-import-resolver-node: 0.3.9
- eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1)
+ eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1)
transitivePeerDependencies:
- supports-color
- eslint-module-utils@2.11.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@1.21.6)):
+ eslint-module-utils@2.11.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1):
+ dependencies:
+ debug: 3.2.7
+ optionalDependencies:
+ '@typescript-eslint/parser': 8.7.0(eslint@8.57.1)(typescript@5.7.3)
+ eslint: 8.57.1
+ eslint-import-resolver-node: 0.3.9
+ eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1)
+ transitivePeerDependencies:
+ - supports-color
+
+ eslint-module-utils@2.11.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint@9.11.1(jiti@1.21.6)))(eslint@9.11.1(jiti@1.21.6)))(eslint@9.11.1(jiti@1.21.6)):
dependencies:
debug: 3.2.7
optionalDependencies:
'@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3)
eslint: 9.11.1(jiti@1.21.6)
eslint-import-resolver-node: 0.3.9
- eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@1.21.6))
+ eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint@9.11.1(jiti@1.21.6)))(eslint@9.11.1(jiti@1.21.6))
transitivePeerDependencies:
- supports-color
- eslint-module-utils@2.12.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1):
+ eslint-module-utils@2.12.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1):
dependencies:
debug: 3.2.7
optionalDependencies:
'@typescript-eslint/parser': 8.7.0(eslint@8.57.1)(typescript@5.7.3)
eslint: 8.57.1
eslint-import-resolver-node: 0.3.9
- eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.1)
+ eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1)
transitivePeerDependencies:
- supports-color
- eslint-module-utils@2.12.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@1.21.6)):
+ eslint-module-utils@2.12.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint@9.11.1(jiti@1.21.6)))(eslint@9.11.1(jiti@1.21.6)))(eslint@9.11.1(jiti@1.21.6)):
dependencies:
debug: 3.2.7
optionalDependencies:
'@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3)
eslint: 9.11.1(jiti@1.21.6)
eslint-import-resolver-node: 0.3.9
- eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@9.11.1(jiti@1.21.6))
+ eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint@9.11.1(jiti@1.21.6)))(eslint@9.11.1(jiti@1.21.6))
transitivePeerDependencies:
- supports-color
- eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1):
+ eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1):
dependencies:
'@rtsao/scc': 1.1.0
array-includes: 3.1.8
@@ -15040,7 +15338,7 @@ snapshots:
doctrine: 2.1.0
eslint: 8.57.1
eslint-import-resolver-node: 0.3.9
- eslint-module-utils: 2.11.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
+ eslint-module-utils: 2.11.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1)
hasown: 2.0.2
is-core-module: 2.15.1
is-glob: 4.0.3
@@ -15068,7 +15366,7 @@ snapshots:
doctrine: 2.1.0
eslint: 8.57.1
eslint-import-resolver-node: 0.3.9
- eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1)
+ eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1))(eslint@8.57.1))(eslint@8.57.1)
hasown: 2.0.2
is-core-module: 2.15.1
is-glob: 4.0.3
@@ -15097,7 +15395,7 @@ snapshots:
doctrine: 2.1.0
eslint: 9.11.1(jiti@1.21.6)
eslint-import-resolver-node: 0.3.9
- eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3)(eslint@9.11.1(jiti@1.21.6))
+ eslint-module-utils: 2.12.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3))(eslint@9.11.1(jiti@1.21.6)))(eslint@9.11.1(jiti@1.21.6)))(eslint@9.11.1(jiti@1.21.6))
hasown: 2.0.2
is-core-module: 2.15.1
is-glob: 4.0.3
@@ -15720,6 +16018,10 @@ snapshots:
dependencies:
next: 15.0.0-canary.113(@opentelemetry/api@1.9.0)(@playwright/test@1.47.0)(react-dom@19.0.0-rc-3208e73e-20240730(react@19.0.0-rc-3208e73e-20240730))(react@19.0.0-rc-3208e73e-20240730)
+ geist@1.3.1(next@15.0.0-canary.67(@opentelemetry/api@1.9.0)(@playwright/test@1.47.0)(react-dom@19.0.0-rc-8b08e99e-20240713(react@19.0.0-rc-8b08e99e-20240713))(react@19.0.0-rc-8b08e99e-20240713)):
+ dependencies:
+ next: 15.0.0-canary.67(@opentelemetry/api@1.9.0)(@playwright/test@1.47.0)(react-dom@19.0.0-rc-8b08e99e-20240713(react@19.0.0-rc-8b08e99e-20240713))(react@19.0.0-rc-8b08e99e-20240713)
+
generic-pool@3.4.2: {}
get-caller-file@2.0.5: {}
@@ -16789,6 +17091,8 @@ snapshots:
min-indent@1.0.1: {}
+ mini-svg-data-uri@1.4.4: {}
+
miniflare@3.20250124.1:
dependencies:
'@cspotcode/source-map-support': 0.8.1
@@ -17003,6 +17307,34 @@ snapshots:
- '@babel/core'
- babel-plugin-macros
+ next@15.0.0-canary.67(@opentelemetry/api@1.9.0)(@playwright/test@1.47.0)(react-dom@19.0.0-rc-8b08e99e-20240713(react@19.0.0-rc-8b08e99e-20240713))(react@19.0.0-rc-8b08e99e-20240713):
+ dependencies:
+ '@next/env': 15.0.0-canary.67
+ '@swc/helpers': 0.5.11
+ busboy: 1.6.0
+ caniuse-lite: 1.0.30001664
+ graceful-fs: 4.2.11
+ postcss: 8.4.31
+ react: 19.0.0-rc-8b08e99e-20240713
+ react-dom: 19.0.0-rc-8b08e99e-20240713(react@19.0.0-rc-8b08e99e-20240713)
+ styled-jsx: 5.1.6(react@19.0.0-rc-8b08e99e-20240713)
+ optionalDependencies:
+ '@next/swc-darwin-arm64': 15.0.0-canary.67
+ '@next/swc-darwin-x64': 15.0.0-canary.67
+ '@next/swc-linux-arm64-gnu': 15.0.0-canary.67
+ '@next/swc-linux-arm64-musl': 15.0.0-canary.67
+ '@next/swc-linux-x64-gnu': 15.0.0-canary.67
+ '@next/swc-linux-x64-musl': 15.0.0-canary.67
+ '@next/swc-win32-arm64-msvc': 15.0.0-canary.67
+ '@next/swc-win32-ia32-msvc': 15.0.0-canary.67
+ '@next/swc-win32-x64-msvc': 15.0.0-canary.67
+ '@opentelemetry/api': 1.9.0
+ '@playwright/test': 1.47.0
+ sharp: 0.33.5
+ transitivePeerDependencies:
+ - '@babel/core'
+ - babel-plugin-macros
+
next@15.0.4(@opentelemetry/api@1.9.0)(@playwright/test@1.47.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
'@next/env': 15.0.4
@@ -17391,6 +17723,13 @@ snapshots:
possible-typed-array-names@1.0.0: {}
+ postcss-import@15.1.0(postcss@8.4.39):
+ dependencies:
+ postcss: 8.4.39
+ postcss-value-parser: 4.2.0
+ read-cache: 1.0.0
+ resolve: 1.22.8
+
postcss-import@15.1.0(postcss@8.4.47):
dependencies:
postcss: 8.4.47
@@ -17398,11 +17737,24 @@ snapshots:
read-cache: 1.0.0
resolve: 1.22.8
+ postcss-js@4.0.1(postcss@8.4.39):
+ dependencies:
+ camelcase-css: 2.0.1
+ postcss: 8.4.39
+
postcss-js@4.0.1(postcss@8.4.47):
dependencies:
camelcase-css: 2.0.1
postcss: 8.4.47
+ postcss-load-config@4.0.2(postcss@8.4.39)(ts-node@10.9.1(@types/node@20.14.10)(typescript@5.5.3)):
+ dependencies:
+ lilconfig: 3.1.2
+ yaml: 2.7.0
+ optionalDependencies:
+ postcss: 8.4.39
+ ts-node: 10.9.1(@types/node@20.14.10)(typescript@5.5.3)
+
postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.1(@types/node@20.17.6)(typescript@5.7.3)):
dependencies:
lilconfig: 3.1.2
@@ -17419,6 +17771,11 @@ snapshots:
postcss: 8.4.47
ts-node: 10.9.1(@types/node@22.2.0)(typescript@5.7.3)
+ postcss-nested@6.2.0(postcss@8.4.39):
+ dependencies:
+ postcss: 8.4.39
+ postcss-selector-parser: 6.1.2
+
postcss-nested@6.2.0(postcss@8.4.47):
dependencies:
postcss: 8.4.47
@@ -17448,6 +17805,12 @@ snapshots:
picocolors: 1.0.1
source-map-js: 1.2.0
+ postcss@8.4.39:
+ dependencies:
+ nanoid: 3.3.7
+ picocolors: 1.1.0
+ source-map-js: 1.2.1
+
postcss@8.4.47:
dependencies:
nanoid: 3.3.7
@@ -17525,7 +17888,7 @@ snapshots:
'@protobufjs/path': 1.1.2
'@protobufjs/pool': 1.1.0
'@protobufjs/utf8': 1.1.0
- '@types/node': 20.17.6
+ '@types/node': 20.14.10
long: 5.2.4
proxy-addr@2.0.7:
@@ -17608,6 +17971,11 @@ snapshots:
react: 19.0.0-rc-3208e73e-20240730
scheduler: 0.25.0-rc-3208e73e-20240730
+ react-dom@19.0.0-rc-8b08e99e-20240713(react@19.0.0-rc-8b08e99e-20240713):
+ dependencies:
+ react: 19.0.0-rc-8b08e99e-20240713
+ scheduler: 0.25.0-rc-8b08e99e-20240713
+
react-hook-form@7.54.2(react@19.0.0):
dependencies:
react: 19.0.0
@@ -17626,6 +17994,8 @@ snapshots:
react@19.0.0-rc-3208e73e-20240730: {}
+ react@19.0.0-rc-8b08e99e-20240713: {}
+
read-cache@1.0.0:
dependencies:
pify: 2.3.0
@@ -17888,6 +18258,8 @@ snapshots:
scheduler@0.25.0-rc-3208e73e-20240730: {}
+ scheduler@0.25.0-rc-8b08e99e-20240713: {}
+
section-matter@1.0.0:
dependencies:
extend-shallow: 2.0.1
@@ -18312,6 +18684,11 @@ snapshots:
client-only: 0.0.1
react: 19.0.0-rc-3208e73e-20240730
+ styled-jsx@5.1.6(react@19.0.0-rc-8b08e99e-20240713):
+ dependencies:
+ client-only: 0.0.1
+ react: 19.0.0-rc-8b08e99e-20240713
+
sucrase@3.35.0:
dependencies:
'@jridgewell/gen-mapping': 0.3.5
@@ -18427,6 +18804,33 @@ snapshots:
transitivePeerDependencies:
- ts-node
+ tailwindcss@3.4.5(ts-node@10.9.1(@types/node@20.14.10)(typescript@5.5.3)):
+ dependencies:
+ '@alloc/quick-lru': 5.2.0
+ arg: 5.0.2
+ chokidar: 3.6.0
+ didyoumean: 1.2.2
+ dlv: 1.1.3
+ fast-glob: 3.3.2
+ glob-parent: 6.0.2
+ is-glob: 4.0.3
+ jiti: 1.21.6
+ lilconfig: 2.1.0
+ micromatch: 4.0.7
+ normalize-path: 3.0.0
+ object-hash: 3.0.0
+ picocolors: 1.1.0
+ postcss: 8.4.39
+ postcss-import: 15.1.0(postcss@8.4.39)
+ postcss-js: 4.0.1(postcss@8.4.39)
+ postcss-load-config: 4.0.2(postcss@8.4.39)(ts-node@10.9.1(@types/node@20.14.10)(typescript@5.5.3))
+ postcss-nested: 6.2.0(postcss@8.4.39)
+ postcss-selector-parser: 6.1.2
+ resolve: 1.22.8
+ sucrase: 3.35.0
+ transitivePeerDependencies:
+ - ts-node
+
tapable@2.2.1: {}
tar-fs@2.1.2:
@@ -18567,6 +18971,25 @@ snapshots:
v8-compile-cache-lib: 3.0.1
yn: 3.1.1
+ ts-node@10.9.1(@types/node@20.14.10)(typescript@5.5.3):
+ dependencies:
+ '@cspotcode/source-map-support': 0.8.1
+ '@tsconfig/node10': 1.0.11
+ '@tsconfig/node12': 1.0.11
+ '@tsconfig/node14': 1.0.3
+ '@tsconfig/node16': 1.0.4
+ '@types/node': 20.14.10
+ acorn: 8.14.0
+ acorn-walk: 8.3.3
+ arg: 4.1.3
+ create-require: 1.1.1
+ diff: 4.0.2
+ make-error: 1.3.6
+ typescript: 5.5.3
+ v8-compile-cache-lib: 3.0.1
+ yn: 3.1.1
+ optional: true
+
ts-node@10.9.1(@types/node@20.17.6)(typescript@5.7.3):
dependencies:
'@cspotcode/source-map-support': 0.8.1
@@ -18736,6 +19159,8 @@ snapshots:
typescript@4.9.5: {}
+ typescript@5.5.3: {}
+
typescript@5.7.3: {}
ufo@1.5.4: {}
@@ -18756,6 +19181,8 @@ snapshots:
has-symbols: 1.1.0
which-boxed-primitive: 1.1.1
+ undici-types@5.26.5: {}
+
undici-types@6.13.0: {}
undici-types@6.19.8: {}