this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Import the next-partial-prerendering example (#308)

https://github.com/vercel-labs/next-partial-prerendering

authored by

Victor Berchet and committed by
GitHub
156d9f17 68c7d6da

+1869 -34
+37
examples/next-partial-prerendering/.gitignore
··· 1 + # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 + 3 + # dependencies 4 + /node_modules 5 + /.pnp 6 + .pnp.js 7 + /.yarn 8 + 9 + # testing 10 + /coverage 11 + 12 + # next.js 13 + /.next/ 14 + /out/ 15 + 16 + # production 17 + /build 18 + 19 + # misc 20 + .DS_Store 21 + *.pem 22 + 23 + # debug 24 + npm-debug.log* 25 + yarn-debug.log* 26 + yarn-error.log* 27 + .pnpm-debug.log* 28 + 29 + # local env files 30 + .env* 31 + !.env*.example 32 + 33 + # vercel 34 + .vercel 35 + 36 + # typescript 37 + *.tsbuildinfo
+3
examples/next-partial-prerendering/.prettierrc
··· 1 + { 2 + "singleQuote": true 3 + }
+23
examples/next-partial-prerendering/README.md
··· 1 + ## Next.js Partial Prerendering 2 + 3 + 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). 4 + 5 + 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. 6 + 7 + 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. 8 + 9 + > ⚠️ 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. 10 + 11 + ## How it works 12 + 13 + The index route `/` uses Partial Prerendering through: 14 + 15 + 1. Enabling the experimental flag in `next.config.js`. 16 + 17 + ```js 18 + experimental: { 19 + ppr: true, 20 + }, 21 + ``` 22 + 23 + 2. Using `<Suspense />` to wrap Dynamic content.
examples/next-partial-prerendering/app/favicon.ico

This is a binary file and will not be displayed.

+50
examples/next-partial-prerendering/app/layout.tsx
··· 1 + import { CartCountProvider } from '#/components/cart-count-context'; 2 + import { Header } from '#/components/header'; 3 + import { Sidebar } from '#/components/sidebar'; 4 + import { Metadata } from 'next'; 5 + import { GlobalStyles } from './styles'; 6 + 7 + export const metadata: Metadata = { 8 + metadataBase: new URL('https://partialprerendering.com'), 9 + title: 'Next.js Partial Prerendering', 10 + description: 'A demo of Next.js using Partial Prerendering.', 11 + openGraph: { 12 + title: 'Next.js Partial Prerendering', 13 + description: 'A demo of Next.js using Partial Prerendering.', 14 + }, 15 + twitter: { 16 + card: 'summary_large_image', 17 + }, 18 + }; 19 + 20 + export default function RootLayout({ 21 + children, 22 + }: { 23 + children: React.ReactNode; 24 + }) { 25 + return ( 26 + <html lang="en" className={`[color-scheme:dark]`}> 27 + <head> 28 + <GlobalStyles /> 29 + </head> 30 + <body className="overflow-y-scroll bg-gray-1100 bg-[url('/grid.svg')] pb-36"> 31 + <Sidebar /> 32 + <div className="lg:pl-72"> 33 + <div className="mx-auto max-w-4xl space-y-8 px-2 pt-20 lg:px-8 lg:py-8"> 34 + <div className="rounded-lg bg-vc-border-gradient p-px shadow-lg shadow-black/20"> 35 + <div className="rounded-lg bg-black p-3.5 lg:p-6"> 36 + <CartCountProvider> 37 + <div className="space-y-10"> 38 + <Header /> 39 + 40 + {children} 41 + </div> 42 + </CartCountProvider> 43 + </div> 44 + </div> 45 + </div> 46 + </div> 47 + </body> 48 + </html> 49 + ); 50 + }
+8
examples/next-partial-prerendering/app/not-found.tsx
··· 1 + export default function NotFound() { 2 + return ( 3 + <div className="space-y-4 text-vercel-pink"> 4 + <h2 className="text-lg font-bold">Not Found</h2> 5 + <p className="text-sm">Could not find requested resource</p> 6 + </div> 7 + ); 8 + }
examples/next-partial-prerendering/app/opengraph-image.png

This is a binary file and will not be displayed.

+28
examples/next-partial-prerendering/app/page.tsx
··· 1 + import { Suspense } from 'react'; 2 + import { 3 + RecommendedProducts, 4 + RecommendedProductsSkeleton, 5 + } from '#/components/recommended-products'; 6 + import { Reviews, ReviewsSkeleton } from '#/components/reviews'; 7 + import { SingleProduct } from '#/components/single-product'; 8 + import { Ping } from '#/components/ping'; 9 + 10 + export default function Page() { 11 + return ( 12 + <div className="space-y-8 lg:space-y-14"> 13 + <SingleProduct /> 14 + 15 + <Ping /> 16 + 17 + <Suspense fallback={<RecommendedProductsSkeleton />}> 18 + <RecommendedProducts /> 19 + </Suspense> 20 + 21 + <Ping /> 22 + 23 + <Suspense fallback={<ReviewsSkeleton />}> 24 + <Reviews /> 25 + </Suspense> 26 + </div> 27 + ); 28 + }
+13
examples/next-partial-prerendering/app/styles.tsx
··· 1 + export function GlobalStyles() { 2 + return ( 3 + <style 4 + dangerouslySetInnerHTML={{ 5 + __html: styles, 6 + }} 7 + /> 8 + ); 9 + } 10 + 11 + const styles = JSON.parse( 12 + "\"/*\\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}}\"", 13 + );
examples/next-partial-prerendering/app/twitter-image.png

This is a binary file and will not be displayed.

+56
examples/next-partial-prerendering/components/add-to-cart.tsx
··· 1 + 'use client'; 2 + 3 + import { useRouter } from 'next/navigation'; 4 + import { useTransition } from 'react'; 5 + import { useCartCount } from '#/components/cart-count-context'; 6 + 7 + export function AddToCart({ initialCartCount }: { initialCartCount: number }) { 8 + const router = useRouter(); 9 + const [isPending, startTransition] = useTransition(); 10 + 11 + const [, setOptimisticCartCount] = useCartCount(initialCartCount); 12 + 13 + const addToCart = () => { 14 + setOptimisticCartCount(initialCartCount + 1); 15 + 16 + // update the cart count cookie 17 + document.cookie = `_cart_count=${initialCartCount + 1}; path=/; max-age=${ 18 + 60 * 60 * 24 * 30 19 + }};`; 20 + 21 + // Normally you would also send a request to the server to add the item 22 + // to the current users cart 23 + // await fetch(`https://api.acme.com/...`); 24 + 25 + // Use a transition and isPending to create inline loading UI 26 + startTransition(() => { 27 + setOptimisticCartCount(null); 28 + 29 + // Refresh the current route and fetch new data from the server without 30 + // losing client-side browser or React state. 31 + router.refresh(); 32 + 33 + // We're working on more fine-grained data mutation and revalidation: 34 + // https://nextjs.org/docs/app/building-your-application/data-fetching/server-actions 35 + }); 36 + }; 37 + 38 + return ( 39 + <button 40 + className="relative w-full items-center space-x-2 rounded-lg bg-vercel-blue px-3 py-1 text-sm font-medium text-white hover:bg-vercel-blue/90 disabled:text-white/70" 41 + onClick={addToCart} 42 + disabled={isPending} 43 + > 44 + Add to Cart 45 + {isPending ? ( 46 + <div className="absolute right-2 top-1.5" role="status"> 47 + <div 48 + className=" 49 + h-4 w-4 animate-spin rounded-full border-[3px] border-white border-r-transparent" 50 + /> 51 + <span className="sr-only">Loading...</span> 52 + </div> 53 + ) : null} 54 + </button> 55 + ); 56 + }
+31
examples/next-partial-prerendering/components/byline.tsx
··· 1 + import { VercelLogo } from '#/components/vercel-logo'; 2 + 3 + export default function Byline({ className }: { className: string }) { 4 + return ( 5 + <div 6 + className={`${className} inset-x-0 bottom-3 mx-3 rounded-lg bg-vc-border-gradient p-px shadow-lg shadow-black/20`} 7 + > 8 + <div className="flex flex-row justify-between rounded-lg bg-black p-3.5 lg:px-5 lg:py-3"> 9 + <div className="flex items-center gap-x-1.5"> 10 + <div className="text-sm text-gray-400">By</div> 11 + <a href="https://vercel.com" title="Vercel"> 12 + <div className="w-16 text-gray-100 hover:text-gray-50"> 13 + <VercelLogo /> 14 + </div> 15 + </a> 16 + </div> 17 + 18 + <div className="text-sm text-gray-400"> 19 + <a 20 + className="underline decoration-dotted underline-offset-4 transition-colors hover:text-gray-300" 21 + href="https://github.com/vercel-labs/next-partial-prerendering" 22 + target="_blank" 23 + rel="noreferrer" 24 + > 25 + View code 26 + </a> 27 + </div> 28 + </div> 29 + </div> 30 + ); 31 + }
+35
examples/next-partial-prerendering/components/cart-count-context.tsx
··· 1 + 'use client'; 2 + 3 + import React, { useState } from 'react'; 4 + 5 + const CartCountContext = React.createContext< 6 + | [null | number, React.Dispatch<React.SetStateAction<null | number>>] 7 + | undefined 8 + >(undefined); 9 + 10 + export function CartCountProvider({ children }: { children: React.ReactNode }) { 11 + const [optimisticCartCount, setOptimisticCartCount] = useState<null | number>( 12 + null, 13 + ); 14 + 15 + return ( 16 + <CartCountContext.Provider 17 + value={[optimisticCartCount, setOptimisticCartCount]} 18 + > 19 + {children} 20 + </CartCountContext.Provider> 21 + ); 22 + } 23 + 24 + export function useCartCount( 25 + initialCount: number, 26 + ): [null | number, React.Dispatch<React.SetStateAction<null | number>>] { 27 + const context = React.useContext(CartCountContext); 28 + if (context === undefined) { 29 + throw new Error('useCartCount must be used within a CartCountProvider'); 30 + } 31 + if (context[0] === null) { 32 + return [initialCount, context[1]]; 33 + } 34 + return context; 35 + }
+8
examples/next-partial-prerendering/components/cart-count.tsx
··· 1 + 'use client'; 2 + 3 + import { useCartCount } from '#/components/cart-count-context'; 4 + 5 + export function CartCount({ initialCartCount }: { initialCartCount: number }) { 6 + const [count] = useCartCount(initialCartCount); 7 + return <span>{count}</span>; 8 + }
+60
examples/next-partial-prerendering/components/header.tsx
··· 1 + import { NextLogo } from '#/components/next-logo'; 2 + import { 3 + MagnifyingGlassIcon, 4 + ShoppingCartIcon, 5 + } from '@heroicons/react/24/solid'; 6 + import Image from 'next/image'; 7 + import { CartCount } from '#/components/cart-count'; 8 + import { cookies } from 'next/headers'; 9 + import { Suspense } from 'react'; 10 + 11 + async function CartCountFromCookies() { 12 + const cartCount = Number(cookies().get('_cart_count')?.value || '0'); 13 + return <CartCount initialCartCount={cartCount} />; 14 + } 15 + 16 + export function Header() { 17 + return ( 18 + <div className="flex items-center justify-between gap-x-3 rounded-lg bg-gray-800 px-3 py-3 lg:px-5 lg:py-4"> 19 + <div className="flex gap-x-3"> 20 + <div className="h-10 w-10 hover:opacity-70"> 21 + <NextLogo /> 22 + </div> 23 + 24 + <div className="relative flex-1"> 25 + <div className="pointer-events-none absolute inset-y-0 left-0 flex items-center pl-3"> 26 + <MagnifyingGlassIcon className="h-5 w-5 text-gray-300" /> 27 + </div> 28 + <input 29 + aria-label="Search" 30 + type="search" 31 + name="search" 32 + id="search" 33 + className="block w-full rounded-full border-none bg-gray-600 pl-10 font-medium text-gray-200 focus:border-vercel-pink focus:ring-2 focus:ring-vercel-pink" 34 + autoComplete="off" 35 + /> 36 + </div> 37 + </div> 38 + 39 + <div className="flex shrink-0 gap-x-3"> 40 + <div className="relative flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-gray-600 text-white"> 41 + <ShoppingCartIcon className="w-6 text-white" /> 42 + <div className="absolute -right-1 -top-1 flex h-4 w-4 items-center justify-center rounded-full bg-vercel-cyan text-sm font-bold text-cyan-800"> 43 + <Suspense fallback={<span></span>}> 44 + <CartCountFromCookies /> 45 + </Suspense> 46 + </div> 47 + </div> 48 + 49 + <Image 50 + src="/prince-akachi-LWkFHEGpleE-unsplash.jpg" 51 + className="rounded-full" 52 + width={40} 53 + height={40} 54 + alt="User" 55 + priority 56 + /> 57 + </div> 58 + </div> 59 + ); 60 + }
+54
examples/next-partial-prerendering/components/next-logo.tsx
··· 1 + export function NextLogo() { 2 + return ( 3 + <svg viewBox="0 0 180 180" fill="none" xmlns="http://www.w3.org/2000/svg"> 4 + <mask 5 + id="mask0_408_134" 6 + style={{ maskType: 'alpha' }} 7 + x="0" 8 + y="0" 9 + width="180" 10 + height="180" 11 + > 12 + <circle cx="90" cy="90" r="90" fill="black" /> 13 + </mask> 14 + <g mask="url(#mask0_408_134)"> 15 + <circle cx="90" cy="90" r="90" fill="black" /> 16 + <path 17 + d="M149.508 157.52L69.142 54H54V125.97H66.1136V69.3836L139.999 164.845C143.333 162.614 146.509 160.165 149.508 157.52Z" 18 + fill="url(#paint0_linear_408_134)" 19 + /> 20 + <rect 21 + x="115" 22 + y="54" 23 + width="12" 24 + height="72" 25 + fill="url(#paint1_linear_408_134)" 26 + /> 27 + </g> 28 + <defs> 29 + <linearGradient 30 + id="paint0_linear_408_134" 31 + x1="109" 32 + y1="116.5" 33 + x2="144.5" 34 + y2="160.5" 35 + gradientUnits="userSpaceOnUse" 36 + > 37 + <stop stopColor="white" /> 38 + <stop offset="1" stopColor="white" stopOpacity="0" /> 39 + </linearGradient> 40 + <linearGradient 41 + id="paint1_linear_408_134" 42 + x1="121" 43 + y1="54" 44 + x2="120.799" 45 + y2="106.875" 46 + gradientUnits="userSpaceOnUse" 47 + > 48 + <stop stopColor="white" /> 49 + <stop offset="1" stopColor="white" stopOpacity="0" /> 50 + </linearGradient> 51 + </defs> 52 + </svg> 53 + ); 54 + }
+12
examples/next-partial-prerendering/components/ping.tsx
··· 1 + export function Ping() { 2 + return ( 3 + <div className="relative"> 4 + <div className="absolute -left-4 top-1"> 5 + <span className="flex h-[11px] w-[11px]"> 6 + <span className="absolute inline-flex h-full w-full animate-ping rounded-full bg-vercel-pink opacity-75"></span> 7 + <span className="relative inline-flex h-[11px] w-[11px] rounded-full bg-vercel-pink"></span> 8 + </span> 9 + </div> 10 + </div> 11 + ); 12 + }
+88
examples/next-partial-prerendering/components/pricing.tsx
··· 1 + import type { Product } from '#/types/product'; 2 + import { Ping } from '#/components/ping'; 3 + import { ProductEstimatedArrival } from '#/components/product-estimated-arrival'; 4 + import { ProductLowStockWarning } from '#/components/product-low-stock-warning'; 5 + import { ProductPrice } from '#/components/product-price'; 6 + import { ProductSplitPayments } from '#/components/product-split-payments'; 7 + import { ProductUsedPrice } from '#/components/product-used-price'; 8 + import { dinero, type DineroSnapshot } from 'dinero.js'; 9 + import { Suspense } from 'react'; 10 + import { AddToCart } from '#/components/add-to-cart'; 11 + import { delayShippingEstimate, withDelay } from '#/lib/delay'; 12 + import { cookies } from 'next/headers'; 13 + 14 + async function AddToCartFromCookies() { 15 + // Get the cart count from the users cookies and pass it to the client 16 + // AddToCart component 17 + const cartCount = Number(cookies().get('_cart_count')?.value || '0'); 18 + return <AddToCart initialCartCount={cartCount} />; 19 + } 20 + 21 + function LoadingDots() { 22 + return ( 23 + <div className="text-sm"> 24 + <span className="space-x-0.5"> 25 + <span className="inline-flex animate-[loading_1.4s_ease-in-out_infinite] rounded-full"> 26 + &bull; 27 + </span> 28 + <span className="inline-flex animate-[loading_1.4s_ease-in-out_0.2s_infinite] rounded-full"> 29 + &bull; 30 + </span> 31 + <span className="inline-flex animate-[loading_1.4s_ease-in-out_0.4s_infinite] rounded-full"> 32 + &bull; 33 + </span> 34 + </span> 35 + </div> 36 + ); 37 + } 38 + 39 + async function UserSpecificDetails({ productId }: { productId: string }) { 40 + const data = await withDelay( 41 + fetch( 42 + `https://app-router-api.vercel.app/api/products?id=${productId}&filter=price,usedPrice,leadTime,stock`, 43 + { 44 + // We intentionally disable Next.js Cache to better demo 45 + // streaming 46 + cache: 'no-store', 47 + }, 48 + ), 49 + delayShippingEstimate, 50 + ); 51 + 52 + const product = (await data.json()) as Product; 53 + 54 + const price = dinero(product.price as DineroSnapshot<number>); 55 + 56 + return ( 57 + <> 58 + <ProductSplitPayments price={price} /> 59 + {product.usedPrice ? ( 60 + <ProductUsedPrice usedPrice={product.usedPrice} /> 61 + ) : null} 62 + <ProductEstimatedArrival leadTime={product.leadTime} hasDeliveryTime /> 63 + {product.stock <= 1 ? ( 64 + <ProductLowStockWarning stock={product.stock} /> 65 + ) : null} 66 + </> 67 + ); 68 + } 69 + 70 + export function Pricing({ product }: { product: Product }) { 71 + const price = dinero(product.price as DineroSnapshot<number>); 72 + 73 + return ( 74 + <div className="space-y-4 rounded-lg bg-gray-900 p-3"> 75 + <ProductPrice price={price} discount={product.discount} /> 76 + 77 + <Ping /> 78 + 79 + <Suspense fallback={<LoadingDots />}> 80 + <UserSpecificDetails productId={product.id} /> 81 + </Suspense> 82 + 83 + <Suspense fallback={<AddToCart initialCartCount={0} />}> 84 + <AddToCartFromCookies /> 85 + </Suspense> 86 + </div> 87 + ); 88 + }
+7
examples/next-partial-prerendering/components/product-best-seller.tsx
··· 1 + export const ProductBestSeller = () => { 2 + return ( 3 + <div className="rounded bg-gray-600 px-1.5 text-xs font-medium leading-5 text-white"> 4 + Best Seller 5 + </div> 6 + ); 7 + };
+54
examples/next-partial-prerendering/components/product-card.tsx
··· 1 + import { Product } from '#/types/product'; 2 + import { ProductBestSeller } from '#/components/product-best-seller'; 3 + import { ProductEstimatedArrival } from '#/components/product-estimated-arrival'; 4 + import { ProductLowStockWarning } from '#/components/product-low-stock-warning'; 5 + import { ProductPrice } from '#/components/product-price'; 6 + import { ProductRating } from '#/components/product-rating'; 7 + import { ProductUsedPrice } from '#/components/product-used-price'; 8 + import { dinero, type DineroSnapshot } from 'dinero.js'; 9 + import Image from 'next/image'; 10 + 11 + export const ProductCard = ({ product }: { product: Product }) => { 12 + const price = dinero(product.price as DineroSnapshot<number>); 13 + 14 + return ( 15 + <div className="group block"> 16 + <div className="space-y-2"> 17 + <div className="relative aspect-square"> 18 + {product.isBestSeller ? ( 19 + <div className="absolute left-2 top-2 z-10 flex"> 20 + <ProductBestSeller /> 21 + </div> 22 + ) : null} 23 + <Image 24 + src={`/${product.image}`} 25 + fill 26 + sizes="(min-width: 1184px) 200px, (min-width: 1024px) 20vw, (min-width: 768px) 25vw, 50vw" 27 + className="rounded-xl grayscale group-hover:opacity-80" 28 + alt={product.name} 29 + placeholder="blur" 30 + blurDataURL={product.imageBlur} 31 + /> 32 + </div> 33 + 34 + <div className="truncate text-sm font-medium text-white group-hover:text-vercel-cyan"> 35 + {product.name} 36 + </div> 37 + 38 + {product.rating ? <ProductRating rating={product.rating} /> : null} 39 + 40 + <ProductPrice price={price} discount={product.discount} /> 41 + 42 + {product.usedPrice ? ( 43 + <ProductUsedPrice usedPrice={product.usedPrice} /> 44 + ) : null} 45 + 46 + <ProductEstimatedArrival leadTime={product.leadTime} /> 47 + 48 + {product.stock <= 1 ? ( 49 + <ProductLowStockWarning stock={product.stock} /> 50 + ) : null} 51 + </div> 52 + </div> 53 + ); 54 + };
+27
examples/next-partial-prerendering/components/product-currency-symbol.tsx
··· 1 + import { toFormat, type Dinero } from 'dinero.js'; 2 + 3 + export const ProductCurrencySymbol = ({ 4 + dinero, 5 + }: { 6 + dinero: Dinero<number>; 7 + }) => { 8 + let symbol = ''; 9 + switch (toFormat(dinero, ({ currency }) => currency.code)) { 10 + case 'GBP': { 11 + symbol = '£'; 12 + break; 13 + } 14 + 15 + case 'EUR': { 16 + symbol = '€'; 17 + break; 18 + } 19 + 20 + default: { 21 + symbol = '$'; 22 + break; 23 + } 24 + } 25 + 26 + return <>{symbol}</>; 27 + };
+36
examples/next-partial-prerendering/components/product-deal.tsx
··· 1 + import { ProductCurrencySymbol } from '#/components/product-currency-symbol'; 2 + import { toUnit, type Dinero } from 'dinero.js'; 3 + 4 + export const ProductDeal = ({ 5 + price: priceRaw, 6 + discount: discountRaw, 7 + }: { 8 + price: Dinero<number>; 9 + discount: { 10 + amount: Dinero<number>; 11 + }; 12 + }) => { 13 + const discount = toUnit(discountRaw.amount); 14 + const price = toUnit(priceRaw); 15 + const percent = Math.round(100 - (discount / price) * 100); 16 + 17 + return ( 18 + <div className="flex gap-x-1.5"> 19 + <div className="text-lg font-bold leading-snug text-vercel-cyan"> 20 + -{percent}% 21 + </div> 22 + <div className="flex"> 23 + <div className="text-sm leading-snug text-white"> 24 + <ProductCurrencySymbol dinero={discountRaw.amount} /> 25 + </div> 26 + <div className="text-lg font-bold leading-snug text-white"> 27 + {discount} 28 + </div> 29 + </div> 30 + <div className="text-sm leading-snug text-gray-400 line-through"> 31 + <ProductCurrencySymbol dinero={priceRaw} /> 32 + {price} 33 + </div> 34 + </div> 35 + ); 36 + };
+24
examples/next-partial-prerendering/components/product-estimated-arrival.tsx
··· 1 + import { add, format, isTomorrow } from 'date-fns'; 2 + 3 + export const ProductEstimatedArrival = ({ 4 + leadTime, 5 + hasDeliveryTime = false, 6 + }: { 7 + leadTime: number; 8 + hasDeliveryTime?: boolean; 9 + }) => { 10 + const date = add(new Date(), { 11 + days: leadTime, 12 + }); 13 + 14 + return ( 15 + <div className="text-sm text-gray-300"> 16 + Get it{' '} 17 + <strong className="font-bold text-gray-100"> 18 + {isTomorrow(date) ? 'tomorrow, ' : null} 19 + {format(date, 'MMM d')} 20 + </strong> 21 + {hasDeliveryTime ? <> by 5pm</> : null} 22 + </div> 23 + ); 24 + };
+28
examples/next-partial-prerendering/components/product-lightening-deal.tsx
··· 1 + import { ProductDeal } from '#/components/product-deal'; 2 + import { add, formatDistanceToNow } from 'date-fns'; 3 + import { type Dinero } from 'dinero.js'; 4 + 5 + export const ProductLighteningDeal = ({ 6 + price, 7 + discount, 8 + }: { 9 + price: Dinero<number>; 10 + discount: { 11 + amount: Dinero<number>; 12 + expires?: number; 13 + }; 14 + }) => { 15 + const date = add(new Date(), { days: discount.expires }); 16 + 17 + return ( 18 + <> 19 + <div className="flex"> 20 + <div className="rounded bg-gray-600 px-1.5 text-xs font-medium leading-5 text-white"> 21 + Expires in {formatDistanceToNow(date)} 22 + </div> 23 + </div> 24 + 25 + <ProductDeal price={price} discount={discount} /> 26 + </> 27 + ); 28 + };
+13
examples/next-partial-prerendering/components/product-low-stock-warning.tsx
··· 1 + export const ProductLowStockWarning = ({ stock }: { stock: number }) => { 2 + if (stock > 3) { 3 + return null; 4 + } 5 + 6 + if (stock === 0) { 7 + return <div className="text-sm text-vercel-cyan">Out of stock</div>; 8 + } 9 + 10 + return ( 11 + <div className="text-sm text-vercel-cyan">Only {stock} left in stock</div> 12 + ); 13 + };
+52
examples/next-partial-prerendering/components/product-price.tsx
··· 1 + import { Product } from '#/types/product'; 2 + import { ProductCurrencySymbol } from '#/components/product-currency-symbol'; 3 + import { ProductDeal } from '#/components/product-deal'; 4 + import { ProductLighteningDeal } from '#/components/product-lightening-deal'; 5 + import { multiply, toUnit, type Dinero } from 'dinero.js'; 6 + 7 + function isDiscount(obj: any): obj is { percent: number; expires?: number } { 8 + return typeof obj?.percent === 'number'; 9 + } 10 + 11 + function formatDiscount( 12 + price: Dinero<number>, 13 + discountRaw: Product['discount'], 14 + ) { 15 + return isDiscount(discountRaw) 16 + ? { 17 + amount: multiply(price, { 18 + amount: discountRaw.percent, 19 + scale: 2, 20 + }), 21 + expires: discountRaw.expires, 22 + } 23 + : undefined; 24 + } 25 + 26 + export const ProductPrice = ({ 27 + price, 28 + discount: discountRaw, 29 + }: { 30 + price: Dinero<number>; 31 + discount: Product['discount']; 32 + }) => { 33 + const discount = formatDiscount(price, discountRaw); 34 + 35 + if (discount) { 36 + if (discount?.expires && typeof discount.expires === 'number') { 37 + return <ProductLighteningDeal price={price} discount={discount} />; 38 + } 39 + return <ProductDeal price={price} discount={discount} />; 40 + } 41 + 42 + return ( 43 + <div className="flex"> 44 + <div className="text-sm leading-snug text-white"> 45 + <ProductCurrencySymbol dinero={price} /> 46 + </div> 47 + <div className="text-lg font-bold leading-snug text-white"> 48 + {toUnit(price)} 49 + </div> 50 + </div> 51 + ); 52 + };
+17
examples/next-partial-prerendering/components/product-rating.tsx
··· 1 + import { StarIcon } from '@heroicons/react/24/solid'; 2 + import clsx from 'clsx'; 3 + 4 + export const ProductRating = ({ rating }: { rating: number }) => { 5 + return ( 6 + <div className="flex gap-x-1"> 7 + {Array.from({ length: 5 }).map((_, i) => { 8 + return ( 9 + <StarIcon 10 + key={i} 11 + className={clsx('w-4', i < rating ? 'text-white' : 'text-gray-500')} 12 + /> 13 + ); 14 + })} 15 + </div> 16 + ); 17 + };
+19
examples/next-partial-prerendering/components/product-review-card.tsx
··· 1 + import type { Review } from '#/types/review'; 2 + import { ProductRating } from '#/components/product-rating'; 3 + 4 + export const ProductReviewCard = ({ review }: { review: Review }) => { 5 + return ( 6 + <div className="space-y-4"> 7 + <div className="space-y-2"> 8 + <div className="flex items-center gap-x-2"> 9 + <div className="h-6 w-6 rounded-full bg-gray-700" /> 10 + <div className="text-sm text-white">{review.name}</div> 11 + </div> 12 + 13 + {review.rating ? <ProductRating rating={review.rating} /> : null} 14 + </div> 15 + 16 + <div className="text-gray-400">{review.text}</div> 17 + </div> 18 + ); 19 + };
+17
examples/next-partial-prerendering/components/product-split-payments.tsx
··· 1 + import { ProductCurrencySymbol } from '#/components/product-currency-symbol'; 2 + import { allocate, toUnit, up, type Dinero } from 'dinero.js'; 3 + 4 + export const ProductSplitPayments = ({ price }: { price: Dinero<number> }) => { 5 + // only offer split payments for more expensive items 6 + if (toUnit(price) < 150) { 7 + return null; 8 + } 9 + 10 + const [perMonth] = allocate(price, [1, 2]); 11 + return ( 12 + <div className="text-sm text-gray-400"> 13 + Or <ProductCurrencySymbol dinero={price} /> 14 + {toUnit(perMonth, { digits: 0, round: up })}/month for 3 months 15 + </div> 16 + ); 17 + };
+19
examples/next-partial-prerendering/components/product-used-price.tsx
··· 1 + import { Product } from '#/types/product'; 2 + import { dinero, toUnit, up, type DineroSnapshot } from 'dinero.js'; 3 + 4 + export const ProductUsedPrice = ({ 5 + usedPrice: usedPriceRaw, 6 + }: { 7 + usedPrice: Product['usedPrice']; 8 + }) => { 9 + const usedPrice = dinero(usedPriceRaw as DineroSnapshot<number>); 10 + 11 + return ( 12 + <div className="text-sm"> 13 + <div className="text-gray-400">More buying choices</div> 14 + <div className="text-gray-200"> 15 + ${toUnit(usedPrice, { digits: 0, round: up })} (used) 16 + </div> 17 + </div> 18 + ); 19 + };
+72
examples/next-partial-prerendering/components/recommended-products.tsx
··· 1 + import { Product } from '#/types/product'; 2 + import { ProductCard } from '#/components/product-card'; 3 + import { delayRecommendedProducts, withDelay } from '#/lib/delay'; 4 + 5 + export async function RecommendedProducts() { 6 + let products: Product[] = await withDelay( 7 + fetch( 8 + // We intentionally delay the response to simulate a slow data 9 + // request that would benefit from streaming 10 + `https://app-router-api.vercel.app/api/products?filter=1`, 11 + { 12 + // We intentionally disable Next.js Cache to better demo 13 + // streaming 14 + cache: 'no-store', 15 + }, 16 + ).then((res) => res.json()), 17 + delayRecommendedProducts, 18 + ); 19 + 20 + return ( 21 + <div className="space-y-6"> 22 + <div> 23 + <div className="text-lg font-medium text-white"> 24 + Recommended Products for You 25 + </div> 26 + <div className="text-sm text-gray-400"> 27 + Based on your preferences and shopping habits 28 + </div> 29 + </div> 30 + <div className="grid grid-cols-4 gap-6"> 31 + {products.map((product) => ( 32 + <div key={product.id} className="col-span-2 md:col-span-1"> 33 + <ProductCard product={product} /> 34 + </div> 35 + ))} 36 + </div> 37 + </div> 38 + ); 39 + } 40 + 41 + 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`; 42 + 43 + function ProductSkeleton() { 44 + return ( 45 + <div className="col-span-4 space-y-4 lg:col-span-1"> 46 + <div className={`relative h-[167px] rounded-xl bg-gray-900 ${shimmer}`} /> 47 + 48 + <div className="h-4 w-full rounded-lg bg-gray-900" /> 49 + <div className="h-6 w-1/3 rounded-lg bg-gray-900" /> 50 + <div className="h-4 w-full rounded-lg bg-gray-900" /> 51 + <div className="h-4 w-4/6 rounded-lg bg-gray-900" /> 52 + </div> 53 + ); 54 + } 55 + 56 + export function RecommendedProductsSkeleton() { 57 + return ( 58 + <div className="space-y-6 pb-[5px]"> 59 + <div className="space-y-2"> 60 + <div className={`h-6 w-1/3 rounded-lg bg-gray-900 ${shimmer}`} /> 61 + <div className={`h-4 w-1/2 rounded-lg bg-gray-900 ${shimmer}`} /> 62 + </div> 63 + 64 + <div className="grid grid-cols-4 gap-6"> 65 + <ProductSkeleton /> 66 + <ProductSkeleton /> 67 + <ProductSkeleton /> 68 + <ProductSkeleton /> 69 + </div> 70 + </div> 71 + ); 72 + }
+55
examples/next-partial-prerendering/components/reviews.tsx
··· 1 + import type { Review } from '#/types/review'; 2 + import { ProductReviewCard } from '#/components/product-review-card'; 3 + import { delayReviews, withDelay } from '#/lib/delay'; 4 + 5 + export async function Reviews() { 6 + let reviews: Review[] = await withDelay( 7 + fetch( 8 + // We intentionally delay the response to simulate a slow data 9 + // request that would benefit from streaming 10 + `https://app-router-api.vercel.app/api/reviews`, 11 + { 12 + // We intentionally disable Next.js Cache to better demo 13 + // streaming 14 + cache: 'no-store', 15 + }, 16 + ).then((res) => res.json()), 17 + delayReviews, 18 + ); 19 + 20 + return ( 21 + <div className="space-y-6"> 22 + <div className="text-lg font-medium text-white">Customer Reviews</div> 23 + <div className="space-y-8"> 24 + {reviews.map((review) => { 25 + return <ProductReviewCard key={review.id} review={review} />; 26 + })} 27 + </div> 28 + </div> 29 + ); 30 + } 31 + 32 + 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`; 33 + 34 + function Skeleton() { 35 + return ( 36 + <div className="space-y-4"> 37 + <div className="h-6 w-2/6 rounded-lg bg-gray-900" /> 38 + <div className="h-4 w-1/6 rounded-lg bg-gray-900" /> 39 + <div className="h-4 w-full rounded-lg bg-gray-900" /> 40 + <div className="h-4 w-4/6 rounded-lg bg-gray-900" /> 41 + </div> 42 + ); 43 + } 44 + 45 + export function ReviewsSkeleton() { 46 + return ( 47 + <div className="space-y-6"> 48 + <div className={`h-7 w-2/5 rounded-lg bg-gray-900 ${shimmer}`} /> 49 + <div className="space-y-8"> 50 + <Skeleton /> 51 + <Skeleton /> 52 + </div> 53 + </div> 54 + ); 55 + }
+100
examples/next-partial-prerendering/components/sidebar.tsx
··· 1 + 'use client'; 2 + 3 + import { NextLogo } from '#/components/next-logo'; 4 + import { Bars3Icon, XMarkIcon } from '@heroicons/react/24/solid'; 5 + 6 + import clsx from 'clsx'; 7 + import { useState } from 'react'; 8 + import Byline from '#/components/byline'; 9 + import { 10 + delayRecommendedProducts, 11 + delayReviews, 12 + delayShippingEstimate, 13 + } from '#/lib/delay'; 14 + 15 + export function Sidebar() { 16 + const [isOpen, setIsOpen] = useState(false); 17 + 18 + return ( 19 + <div className="fixed top-0 z-20 flex w-full flex-col border-b border-gray-800 bg-black lg:bottom-0 lg:z-auto lg:w-72 lg:border-b-0 lg:border-r lg:border-gray-800"> 20 + <div className="flex h-14 items-center px-4 py-4 lg:h-auto"> 21 + <div className="group flex w-full items-center gap-x-2.5"> 22 + <div className="h-7 w-7 rounded-full border border-white/30"> 23 + <NextLogo /> 24 + </div> 25 + 26 + <h3 className="font-semibold tracking-wide text-gray-400"> 27 + Partial Prerendering 28 + </h3> 29 + </div> 30 + </div> 31 + <button 32 + type="button" 33 + className="group absolute right-0 top-0 flex h-14 items-center gap-x-2 px-4 lg:hidden" 34 + onClick={() => setIsOpen(!isOpen)} 35 + > 36 + <div className="font-medium text-gray-100 group-hover:text-gray-400"> 37 + Menu 38 + </div> 39 + {isOpen ? ( 40 + <XMarkIcon className="block w-6 text-gray-400" /> 41 + ) : ( 42 + <Bars3Icon className="block w-6 text-gray-400" /> 43 + )} 44 + </button> 45 + 46 + <div 47 + className={clsx('overflow-y-auto lg:static lg:block', { 48 + 'fixed inset-x-0 bottom-0 top-14 mt-px bg-black': isOpen, 49 + hidden: !isOpen, 50 + })} 51 + > 52 + <div className="prose prose-sm prose-invert max-w-none space-y-6 px-4 pb-20 text-gray-300"> 53 + <div className="text-gray-400"> 54 + <p> 55 + <span className="font-bold text-vercel-pink">Pink dots</span>{' '} 56 + denote artificially delayed responses for demo purposes: 57 + </p> 58 + <ul> 59 + <li>Shipping estimate → {delayShippingEstimate}ms</li> 60 + <li>Recommended products → {delayRecommendedProducts}ms</li> 61 + <li>Reviews → {delayReviews}ms</li> 62 + </ul> 63 + </div> 64 + 65 + <p> 66 + <a 67 + target="_blank" 68 + href="https://vercel.com/blog/partial-prerendering-with-next-js-creating-a-new-default-rendering-model" 69 + > 70 + Partial Prerendering 71 + </a>{' '} 72 + combines ultra-quick static edge delivery with fully dynamic 73 + capabilities. This is different from how your application behaves 74 + today, where entire routes are either fully static or dynamic. 75 + </p> 76 + <p>How it works:</p> 77 + <ul> 78 + <li> 79 + A static route <em>shell</em> is served immediately, this makes 80 + the initial load fast. 81 + </li> 82 + <li> 83 + The shell leaves <em>holes</em> where dynamic content (that might 84 + be slower) will be streamed in to minimize the perceived overall 85 + page load time. 86 + </li> 87 + <li> 88 + The async holes are loaded in parallel, reducing the overall load 89 + time of the page. 90 + </li> 91 + </ul> 92 + <p className="text-gray-400"> 93 + Try refreshing the page to restart the demo. 94 + </p> 95 + </div> 96 + <Byline className="absolute hidden sm:block" /> 97 + </div> 98 + </div> 99 + ); 100 + }
+79
examples/next-partial-prerendering/components/single-product.tsx
··· 1 + import { Pricing } from '#/components/pricing'; 2 + import type { Product } from '#/types/product'; 3 + import { ProductRating } from '#/components/product-rating'; 4 + import Image from 'next/image'; 5 + 6 + export async function SingleProduct() { 7 + const product: Product = await fetch( 8 + `https://app-router-api.vercel.app/api/products?id=1`, 9 + ).then((res) => res.json()); 10 + 11 + return ( 12 + <div className="grid grid-cols-4 gap-6"> 13 + <div className="col-span-2 md:order-1 md:col-span-1"> 14 + <div className="space-y-2"> 15 + <div className="relative aspect-square"> 16 + <Image 17 + src={`/${product.image}`} 18 + className="block rounded-lg grayscale" 19 + alt={product.name} 20 + fill 21 + sizes="(min-width: 1184px) 200px, (min-width: 1024px) 20vw, (min-width: 768px) 25vw, 50vw" 22 + priority 23 + /> 24 + </div> 25 + 26 + <div className="flex gap-x-2"> 27 + <div className="relative aspect-square w-1/3"> 28 + <Image 29 + src={`/${product.image}`} 30 + className="rounded-lg grayscale" 31 + alt={product.name} 32 + fill 33 + sizes="(min-width: 1184px) 75px, (min-width: 768px) 8.33vw, 16.66vw" 34 + loading="lazy" 35 + /> 36 + </div> 37 + <div className="relative aspect-square w-1/3"> 38 + <Image 39 + src={`/${product.image}`} 40 + className="rounded-lg grayscale" 41 + alt={product.name} 42 + fill 43 + sizes="(min-width: 1184px) 75px, (min-width: 768px) 8.33vw, 16.66vw" 44 + loading="lazy" 45 + /> 46 + </div> 47 + <div className="relative aspect-square w-1/3"> 48 + <Image 49 + src={`/${product.image}`} 50 + className="rounded-lg grayscale" 51 + alt={product.name} 52 + fill 53 + sizes="(min-width: 1184px) 75px, (min-width: 768px) 8.33vw, 16.66vw" 54 + loading="lazy" 55 + /> 56 + </div> 57 + </div> 58 + </div> 59 + </div> 60 + 61 + <div className="col-span-2 md:order-3 md:col-span-1"> 62 + <Pricing product={product} /> 63 + </div> 64 + 65 + <div className="col-span-full space-y-4 md:order-2 md:col-span-2"> 66 + <div className="truncate text-xl font-medium text-white lg:text-2xl"> 67 + {product.name} 68 + </div> 69 + 70 + <ProductRating rating={product.rating} /> 71 + 72 + <div className="space-y-4 text-sm text-gray-200"> 73 + <p>{product.description}</p> 74 + <p>{product.description}</p> 75 + </div> 76 + </div> 77 + </div> 78 + ); 79 + }
+11
examples/next-partial-prerendering/components/vercel-logo.tsx
··· 1 + export function VercelLogo() { 2 + return ( 3 + <svg 4 + viewBox="0 0 4438 1000" 5 + fill="currentColor" 6 + xmlns="http://www.w3.org/2000/svg" 7 + > 8 + <path d="M2223.75 250C2051.25 250 1926.87 362.5 1926.87 531.25C1926.87 700 2066.72 812.5 2239.38 812.5C2343.59 812.5 2435.47 771.25 2492.34 701.719L2372.81 632.656C2341.25 667.188 2293.28 687.344 2239.38 687.344C2164.53 687.344 2100.94 648.281 2077.34 585.781H2515.16C2518.59 568.281 2520.63 550.156 2520.63 531.094C2520.63 362.5 2396.41 250 2223.75 250ZM2076.09 476.562C2095.62 414.219 2149.06 375 2223.75 375C2298.59 375 2352.03 414.219 2371.41 476.562H2076.09ZM2040.78 78.125L1607.81 828.125L1174.69 78.125H1337.03L1607.66 546.875L1878.28 78.125H2040.78ZM577.344 0L1154.69 1000H0L577.344 0ZM3148.75 531.25C3148.75 625 3210 687.5 3305 687.5C3369.38 687.5 3417.66 658.281 3442.5 610.625L3562.5 679.844C3512.81 762.656 3419.69 812.5 3305 812.5C3132.34 812.5 3008.13 700 3008.13 531.25C3008.13 362.5 3132.5 250 3305 250C3419.69 250 3512.66 299.844 3562.5 382.656L3442.5 451.875C3417.66 404.219 3369.38 375 3305 375C3210.16 375 3148.75 437.5 3148.75 531.25ZM4437.5 78.125V796.875H4296.88V78.125H4437.5ZM3906.25 250C3733.75 250 3609.38 362.5 3609.38 531.25C3609.38 700 3749.38 812.5 3921.88 812.5C4026.09 812.5 4117.97 771.25 4174.84 701.719L4055.31 632.656C4023.75 667.188 3975.78 687.344 3921.88 687.344C3847.03 687.344 3783.44 648.281 3759.84 585.781H4197.66C4201.09 568.281 4203.12 550.156 4203.12 531.094C4203.12 362.5 4078.91 250 3906.25 250ZM3758.59 476.562C3778.13 414.219 3831.41 375 3906.25 375C3981.09 375 4034.53 414.219 4053.91 476.562H3758.59ZM2961.25 265.625V417.031C2945.63 412.5 2929.06 409.375 2911.25 409.375C2820.47 409.375 2755 471.875 2755 565.625V796.875H2614.38V265.625H2755V409.375C2755 330 2847.34 265.625 2961.25 265.625Z" /> 9 + </svg> 10 + ); 11 + }
+17
examples/next-partial-prerendering/lib/delay.ts
··· 1 + // Times are in milliseconds 2 + export const delayShippingEstimate = 2000; 3 + export const delayRecommendedProducts = 5000; 4 + export const delayReviews = 6000; 5 + 6 + export async function withDelay<T>( 7 + promise: Promise<T>, 8 + delay: number, 9 + ): Promise<T> { 10 + // Ensure we throw if this throws 11 + const ret = await promise; 12 + return new Promise((resolve) => { 13 + setTimeout(() => { 14 + resolve(ret); 15 + }, delay); 16 + }); 17 + }
+5
examples/next-partial-prerendering/next-env.d.ts
··· 1 + /// <reference types="next" /> 2 + /// <reference types="next/image-types/global" /> 3 + 4 + // NOTE: This file should not be edited 5 + // see https://nextjs.org/docs/basic-features/typescript for more information.
+8
examples/next-partial-prerendering/next.config.js
··· 1 + /** @type {import('next').NextConfig} */ 2 + const nextConfig = { 3 + experimental: { 4 + ppr: true, 5 + }, 6 + }; 7 + 8 + module.exports = nextConfig;
+25
examples/next-partial-prerendering/open-next.config.ts
··· 1 + import type { OpenNextConfig } from '@opennextjs/aws/types/open-next.js'; 2 + 3 + const config: OpenNextConfig = { 4 + default: { 5 + override: { 6 + wrapper: 'cloudflare-node', 7 + converter: 'edge', 8 + // Unused implementation 9 + incrementalCache: 'dummy', 10 + tagCache: 'dummy', 11 + queue: 'dummy', 12 + }, 13 + }, 14 + 15 + middleware: { 16 + external: true, 17 + override: { 18 + wrapper: 'cloudflare-edge', 19 + converter: 'edge', 20 + proxyExternalRequest: 'fetch', 21 + }, 22 + }, 23 + }; 24 + 25 + export default config;
+34
examples/next-partial-prerendering/package.json
··· 1 + { 2 + "private": true, 3 + "scripts": { 4 + "build": "next build", 5 + "dev": "next dev --turbo", 6 + "start": "next start", 7 + "build:worker": "opennextjs-cloudflare", 8 + "dev:worker": "wrangler dev --port 8771 --inspector-port 9331", 9 + "preview": "pnpm build:worker && pnpm dev:worker" 10 + }, 11 + "dependencies": { 12 + "@heroicons/react": "2.1.5", 13 + "clsx": "2.1.1", 14 + "date-fns": "3.6.0", 15 + "dinero.js": "2.0.0-alpha.8", 16 + "geist": "1.3.1", 17 + "next": "15.0.0-canary.67", 18 + "react": "19.0.0-rc-8b08e99e-20240713", 19 + "react-dom": "19.0.0-rc-8b08e99e-20240713" 20 + }, 21 + "devDependencies": { 22 + "@opennextjs/cloudflare": "workspace:*", 23 + "@tailwindcss/forms": "0.5.7", 24 + "@tailwindcss/typography": "0.5.13", 25 + "@types/node": "20.14.10", 26 + "@types/react": "18.3.3", 27 + "@types/react-dom": "18.3.0", 28 + "autoprefixer": "10.4.19", 29 + "postcss": "8.4.39", 30 + "tailwindcss": "3.4.5", 31 + "typescript": "5.5.3", 32 + "wrangler": "catalog:" 33 + } 34 + }
+6
examples/next-partial-prerendering/postcss.config.js
··· 1 + module.exports = { 2 + plugins: { 3 + tailwindcss: {}, 4 + autoprefixer: {}, 5 + }, 6 + };
examples/next-partial-prerendering/public/alexander-andrews-brAkTCdnhW8-unsplash.jpg

This is a binary file and will not be displayed.

examples/next-partial-prerendering/public/eniko-kis-KsLPTsYaqIQ-unsplash.jpg

This is a binary file and will not be displayed.

+5
examples/next-partial-prerendering/public/grid.svg
··· 1 + 2 + <svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100"> 3 + <path d="M96,95h4v1H96v4H95V96H86v4H85V96H76v4H75V96H66v4H65V96H56v4H55V96H46v4H45V96H36v4H35V96H26v4H25V96H16v4H15V96H0V95H15V86H0V85H15V76H0V75H15V66H0V65H15V56H0V55H15V46H0V45H15V36H0V35H15V26H0V25H15V16H0V15H15V0h1V15h9V0h1V15h9V0h1V15h9V0h1V15h9V0h1V15h9V0h1V15h9V0h1V15h9V0h1V15h9V0h1V15h4v1H96v9h4v1H96v9h4v1H96v9h4v1H96v9h4v1H96v9h4v1H96v9h4v1H96v9h4v1H96Zm-1,0V86H86v9ZM85,95V86H76v9ZM75,95V86H66v9ZM65,95V86H56v9ZM55,95V86H46v9ZM45,95V86H36v9ZM35,95V86H26v9ZM25,95V86H16v9ZM16,85h9V76H16Zm10,0h9V76H26Zm10,0h9V76H36Zm10,0h9V76H46Zm10,0h9V76H56Zm10,0h9V76H66Zm10,0h9V76H76Zm10,0h9V76H86Zm9-10V66H86v9ZM85,75V66H76v9ZM75,75V66H66v9ZM65,75V66H56v9ZM55,75V66H46v9ZM45,75V66H36v9ZM35,75V66H26v9ZM25,75V66H16v9ZM16,65h9V56H16Zm10,0h9V56H26Zm10,0h9V56H36Zm10,0h9V56H46Zm10,0h9V56H56Zm10,0h9V56H66Zm10,0h9V56H76Zm10,0h9V56H86Zm9-10V46H86v9ZM85,55V46H76v9ZM75,55V46H66v9ZM65,55V46H56v9ZM55,55V46H46v9ZM45,55V46H36v9ZM35,55V46H26v9ZM25,55V46H16v9ZM16,45h9V36H16Zm10,0h9V36H26Zm10,0h9V36H36Zm10,0h9V36H46Zm10,0h9V36H56Zm10,0h9V36H66Zm10,0h9V36H76Zm10,0h9V36H86Zm9-10V26H86v9ZM85,35V26H76v9ZM75,35V26H66v9ZM65,35V26H56v9ZM55,35V26H46v9ZM45,35V26H36v9ZM35,35V26H26v9ZM25,35V26H16v9ZM16,25h9V16H16Zm10,0h9V16H26Zm10,0h9V16H36Zm10,0h9V16H46Zm10,0h9V16H56Zm10,0h9V16H66Zm10,0h9V16H76Zm10,0h9V16H86Z" fill="rgba(255,255,255,0.2)" fill-rule="evenodd" opacity="0.2"/> 4 + <path d="M6,5V0H5V5H0V6H5v94H6V6h94V5Z" fill="rgba(255,255,255,0.075)" fill-rule="evenodd"/> 5 + </svg>
examples/next-partial-prerendering/public/guillaume-coupy-6HuoHgK7FN8-unsplash.jpg

This is a binary file and will not be displayed.

examples/next-partial-prerendering/public/nextjs-icon-light-background.png

This is a binary file and will not be displayed.

examples/next-partial-prerendering/public/patrick-OIFgeLnjwrM-unsplash.jpg

This is a binary file and will not be displayed.

examples/next-partial-prerendering/public/prince-akachi-LWkFHEGpleE-unsplash.jpg

This is a binary file and will not be displayed.

examples/next-partial-prerendering/public/yoann-siloine-_T4w3JDm6ug-unsplash.jpg

This is a binary file and will not be displayed.

+89
examples/next-partial-prerendering/tailwind.config.ts
··· 1 + import colors from 'tailwindcss/colors'; 2 + import { Config } from 'tailwindcss'; 3 + 4 + export default { 5 + content: [ 6 + './app/**/*.{js,ts,jsx,tsx,mdx}', 7 + './components/**/*.{js,ts,jsx,tsx,mdx}', 8 + ], 9 + future: { 10 + hoverOnlyWhenSupported: true, 11 + }, 12 + darkMode: 'class', 13 + theme: { 14 + extend: { 15 + // https://vercel.com/design/color 16 + colors: { 17 + gray: colors.zinc, 18 + 'gray-1000': 'rgb(17,17,19)', 19 + 'gray-1100': 'rgb(10,10,11)', 20 + vercel: { 21 + pink: '#FF0080', 22 + blue: '#0070F3', 23 + cyan: '#50E3C2', 24 + orange: '#F5A623', 25 + violet: '#7928CA', 26 + }, 27 + }, 28 + backgroundImage: ({ theme }) => ({ 29 + 'vc-border-gradient': `radial-gradient(at left top, ${theme( 30 + 'colors.gray.500', 31 + )}, 50px, ${theme('colors.gray.800')} 50%)`, 32 + }), 33 + keyframes: ({ theme }) => ({ 34 + rerender: { 35 + '0%': { 36 + ['border-color']: theme('colors.vercel.pink'), 37 + }, 38 + '40%': { 39 + ['border-color']: theme('colors.vercel.pink'), 40 + }, 41 + }, 42 + highlight: { 43 + '0%': { 44 + background: theme('colors.vercel.pink'), 45 + color: theme('colors.white'), 46 + }, 47 + '40%': { 48 + background: theme('colors.vercel.pink'), 49 + color: theme('colors.white'), 50 + }, 51 + }, 52 + loading: { 53 + '0%': { 54 + opacity: '.2', 55 + }, 56 + '20%': { 57 + opacity: '1', 58 + transform: 'translateX(1px)', 59 + }, 60 + to: { 61 + opacity: '.2', 62 + }, 63 + }, 64 + shimmer: { 65 + '100%': { 66 + transform: 'translateX(100%)', 67 + }, 68 + }, 69 + translateXReset: { 70 + '100%': { 71 + transform: 'translateX(0)', 72 + }, 73 + }, 74 + fadeToTransparent: { 75 + '0%': { 76 + opacity: '1', 77 + }, 78 + '40%': { 79 + opacity: '1', 80 + }, 81 + '100%': { 82 + opacity: '0', 83 + }, 84 + }, 85 + }), 86 + }, 87 + }, 88 + plugins: [require('@tailwindcss/typography'), require('@tailwindcss/forms')], 89 + } satisfies Config;
+29
examples/next-partial-prerendering/tsconfig.json
··· 1 + { 2 + "compilerOptions": { 3 + "target": "es5", 4 + "lib": ["dom", "dom.iterable", "esnext"], 5 + "allowJs": true, 6 + "skipLibCheck": true, 7 + "strict": true, 8 + "forceConsistentCasingInFileNames": true, 9 + "noEmit": true, 10 + "esModuleInterop": true, 11 + "module": "esnext", 12 + "moduleResolution": "node", 13 + "resolveJsonModule": true, 14 + "isolatedModules": true, 15 + "jsx": "preserve", 16 + "incremental": true, 17 + "baseUrl": ".", 18 + "paths": { 19 + "#/*": ["./*"] 20 + }, 21 + "plugins": [ 22 + { 23 + "name": "next" 24 + } 25 + ] 26 + }, 27 + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], 28 + "exclude": ["node_modules", "open-next.config.ts"] 29 + }
+37
examples/next-partial-prerendering/types/product.d.ts
··· 1 + export type Product = { 2 + id: string; 3 + stock: number; 4 + rating: number; 5 + name: string; 6 + description: string; 7 + price: Price; 8 + isBestSeller: boolean; 9 + leadTime: number; 10 + image?: string; 11 + imageBlur?: string; 12 + discount?: Discount; 13 + usedPrice?: UsedPrice; 14 + }; 15 + 16 + type Price = { 17 + amount: number; 18 + currency: Currency; 19 + scale: number; 20 + }; 21 + 22 + type Currency = { 23 + code: string; 24 + base: number; 25 + exponent: number; 26 + }; 27 + 28 + type Discount = { 29 + percent: number; 30 + expires?: number; 31 + }; 32 + 33 + type UsedPrice = { 34 + amount: number; 35 + currency: Currency; 36 + scale: number; 37 + };
+6
examples/next-partial-prerendering/types/review.d.ts
··· 1 + export type Review = { 2 + id: string; 3 + name: string; 4 + rating: number; 5 + text: string; 6 + };
+11
examples/next-partial-prerendering/wrangler.json
··· 1 + { 2 + "$schema": "node_modules/wrangler/config-schema.json", 3 + "main": ".open-next/worker.js", 4 + "name": "next-partial-prerendering", 5 + "compatibility_date": "2024-12-30", 6 + "compatibility_flags": ["nodejs_compat"], 7 + "assets": { 8 + "directory": ".open-next/assets", 9 + "binding": "ASSETS" 10 + } 11 + }
+461 -34
pnpm-lock.yaml
··· 589 589 specifier: 'catalog:' 590 590 version: 3.107.0(@cloudflare/workers-types@4.20250109.0) 591 591 592 + examples/next-partial-prerendering: 593 + dependencies: 594 + '@heroicons/react': 595 + specifier: 2.1.5 596 + version: 2.1.5(react@19.0.0-rc-8b08e99e-20240713) 597 + clsx: 598 + specifier: 2.1.1 599 + version: 2.1.1 600 + date-fns: 601 + specifier: 3.6.0 602 + version: 3.6.0 603 + dinero.js: 604 + specifier: 2.0.0-alpha.8 605 + version: 2.0.0-alpha.8 606 + geist: 607 + specifier: 1.3.1 608 + 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)) 609 + next: 610 + specifier: 15.0.0-canary.67 611 + 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) 612 + react: 613 + specifier: 19.0.0-rc-8b08e99e-20240713 614 + version: 19.0.0-rc-8b08e99e-20240713 615 + react-dom: 616 + specifier: 19.0.0-rc-8b08e99e-20240713 617 + version: 19.0.0-rc-8b08e99e-20240713(react@19.0.0-rc-8b08e99e-20240713) 618 + devDependencies: 619 + '@opennextjs/cloudflare': 620 + specifier: workspace:* 621 + version: link:../../packages/cloudflare 622 + '@tailwindcss/forms': 623 + specifier: 0.5.7 624 + version: 0.5.7(tailwindcss@3.4.5(ts-node@10.9.1(@types/node@20.14.10)(typescript@5.5.3))) 625 + '@tailwindcss/typography': 626 + specifier: 0.5.13 627 + version: 0.5.13(tailwindcss@3.4.5(ts-node@10.9.1(@types/node@20.14.10)(typescript@5.5.3))) 628 + '@types/node': 629 + specifier: 20.14.10 630 + version: 20.14.10 631 + '@types/react': 632 + specifier: 18.3.3 633 + version: 18.3.3 634 + '@types/react-dom': 635 + specifier: 18.3.0 636 + version: 18.3.0 637 + autoprefixer: 638 + specifier: 10.4.19 639 + version: 10.4.19(postcss@8.4.39) 640 + postcss: 641 + specifier: 8.4.39 642 + version: 8.4.39 643 + tailwindcss: 644 + specifier: 3.4.5 645 + version: 3.4.5(ts-node@10.9.1(@types/node@20.14.10)(typescript@5.5.3)) 646 + typescript: 647 + specifier: 5.5.3 648 + version: 5.5.3 649 + wrangler: 650 + specifier: 'catalog:' 651 + version: 3.107.0(@cloudflare/workers-types@4.20250109.0) 652 + 592 653 examples/vercel-blog-starter: 593 654 dependencies: 594 655 classnames: ··· 1389 1450 '@cspotcode/source-map-support@0.8.1': 1390 1451 resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} 1391 1452 engines: {node: '>=12'} 1453 + 1454 + '@dinero.js/calculator-number@2.0.0-alpha.8': 1455 + resolution: {integrity: sha512-/L+N7g5DjcS6wlMb2hcOXWBKW2TGiG+vZDZr9ow0nsHUTdwtMarL1bmBH9fGldHhH2XsxcrjN9H+036yeNzh3Q==} 1456 + 1457 + '@dinero.js/core@2.0.0-alpha.8': 1458 + resolution: {integrity: sha512-3jaw2j6J/SshlCZz5KhHkh8zP47HRmt9RpnjR0BJs2awpweVuZIyyX9qzGVUEVpml9IwzQ1U+YdXevhOxtcDgg==} 1459 + 1460 + '@dinero.js/currencies@2.0.0-alpha.8': 1461 + resolution: {integrity: sha512-zApiqtuuPwjiM9LJA5/kNcT48VSHRiz2/mktkXjIpfxrJKzthXybUAgEenExIH6dYhLDgVmsLQZtZFOsdYl0Ag==} 1392 1462 1393 1463 '@dotenvx/dotenvx@1.31.0': 1394 1464 resolution: {integrity: sha512-GeDxvtjiRuoyWVU9nQneId879zIyNdL05bS7RKiqMkfBSKpHMWHLoRyRqjYWLaXmX/llKO1hTlqHDmatkQAjPA==} ··· 2977 3047 '@next/env@15.0.0-canary.113': 2978 3048 resolution: {integrity: sha512-hiD7ux+YPCUJi3up0dHnROYBYg/AuPErOcBBzjCkKQ1q4ufuUNBQms4oDeOiHG9+Qga8mN5+k2L5qm7rNhzU4g==} 2979 3049 3050 + '@next/env@15.0.0-canary.67': 3051 + resolution: {integrity: sha512-PkVYpfGi4fHxlFST2MSDl4RptW1t4WaLSoDK+/X3EUvU0i2gDZoi9ktZ/29Sh1XjlY8moFPWsqUsbLmsZWVVvQ==} 3052 + 2980 3053 '@next/env@15.0.4': 2981 3054 resolution: {integrity: sha512-WNRvtgnRVDD4oM8gbUcRc27IAhaL4eXQ/2ovGbgLnPGUvdyDr8UdXP4Q/IBDdAdojnD2eScryIDirv0YUCjUVw==} 2982 3055 ··· 3004 3077 cpu: [arm64] 3005 3078 os: [darwin] 3006 3079 3080 + '@next/swc-darwin-arm64@15.0.0-canary.67': 3081 + resolution: {integrity: sha512-w+SNDkXH/XBRdHgcAvoBc3zEktjSd2IlJ3Mt/To5ceYo/776CIc1c9bU+DEfjqtMwkNXqPZmBJqblolp2qbOqQ==} 3082 + engines: {node: '>= 10'} 3083 + cpu: [arm64] 3084 + os: [darwin] 3085 + 3007 3086 '@next/swc-darwin-arm64@15.0.4': 3008 3087 resolution: {integrity: sha512-QecQXPD0yRHxSXWL5Ff80nD+A56sUXZG9koUsjWJwA2Z0ZgVQfuy7gd0/otjxoOovPVHR2eVEvPMHbtZP+pf9w==} 3009 3088 engines: {node: '>= 10'} ··· 3028 3107 cpu: [x64] 3029 3108 os: [darwin] 3030 3109 3110 + '@next/swc-darwin-x64@15.0.0-canary.67': 3111 + resolution: {integrity: sha512-/Wp1rLJjO5RvYidj4By0h2qnccHGPhWKpC9cDdNn6XwiMTYbA3YbrsWJPZsJt1vcfQ+TZgN6YPVFO7/XSJqz2w==} 3112 + engines: {node: '>= 10'} 3113 + cpu: [x64] 3114 + os: [darwin] 3115 + 3031 3116 '@next/swc-darwin-x64@15.0.4': 3032 3117 resolution: {integrity: sha512-pb7Bye3y1Og3PlCtnz2oO4z+/b3pH2/HSYkLbL0hbVuTGil7fPen8/3pyyLjdiTLcFJ+ymeU3bck5hd4IPFFCA==} 3033 3118 engines: {node: '>= 10'} ··· 3048 3133 3049 3134 '@next/swc-linux-arm64-gnu@15.0.0-canary.113': 3050 3135 resolution: {integrity: sha512-WQJMkp9YhzjF5qEQVcHovqyeumOoQhyj6KUrAg9iOjTHqY/w5F1et6+n0A7c/PqQC+pZLvOkN+8c0bpnCk8enw==} 3136 + engines: {node: '>= 10'} 3137 + cpu: [arm64] 3138 + os: [linux] 3139 + 3140 + '@next/swc-linux-arm64-gnu@15.0.0-canary.67': 3141 + resolution: {integrity: sha512-TvgVRLN/p2P5ZVCqDKKPEzYJ8qKLUrf8U1yejTh1SYaMDK1Rz0I0roRXQQFYfRhAv3l5QmdFZbx98ZI5/IQjhA==} 3051 3142 engines: {node: '>= 10'} 3052 3143 cpu: [arm64] 3053 3144 os: [linux] ··· 3072 3163 3073 3164 '@next/swc-linux-arm64-musl@15.0.0-canary.113': 3074 3165 resolution: {integrity: sha512-qp9fCL3Nd05yE/HJuMBQxAXrUwfQXSIBql7/tuTUhNJOaOPXloifZJRAY6FoAkezrNUkkekAoU10E65KnvoQaQ==} 3166 + engines: {node: '>= 10'} 3167 + cpu: [arm64] 3168 + os: [linux] 3169 + 3170 + '@next/swc-linux-arm64-musl@15.0.0-canary.67': 3171 + resolution: {integrity: sha512-EgExLdxjjUrTkvfsw//fX/bmZY8xl6ZrP9VqwhmHOFCAp5MDJi29bSbx0oYCcUPhsThAmqbno90Mu7JMfU4JeA==} 3075 3172 engines: {node: '>= 10'} 3076 3173 cpu: [arm64] 3077 3174 os: [linux] ··· 3100 3197 cpu: [x64] 3101 3198 os: [linux] 3102 3199 3200 + '@next/swc-linux-x64-gnu@15.0.0-canary.67': 3201 + resolution: {integrity: sha512-tMEcNBtNjI+wfKM4fJOps3PzKbDswly08GAycI9BiuugNKpG1RPEHqbyfo27C6nQf5I7u7r7S55qJ4KZfHPTxA==} 3202 + engines: {node: '>= 10'} 3203 + cpu: [x64] 3204 + os: [linux] 3205 + 3103 3206 '@next/swc-linux-x64-gnu@15.0.4': 3104 3207 resolution: {integrity: sha512-Z50b0gvYiUU1vLzfAMiChV8Y+6u/T2mdfpXPHraqpypP7yIT2UV9YBBhcwYkxujmCvGEcRTVWOj3EP7XW/wUnw==} 3105 3208 engines: {node: '>= 10'} ··· 3124 3227 cpu: [x64] 3125 3228 os: [linux] 3126 3229 3230 + '@next/swc-linux-x64-musl@15.0.0-canary.67': 3231 + resolution: {integrity: sha512-y8g3Afo+AkM9M1R2qLSjRKdDBsSzgd7CnUXT6OtxsaEsHwBAz9BBeANwo26Tc0K82U23Ev4uj7XS/Dr3jG5Row==} 3232 + engines: {node: '>= 10'} 3233 + cpu: [x64] 3234 + os: [linux] 3235 + 3127 3236 '@next/swc-linux-x64-musl@15.0.4': 3128 3237 resolution: {integrity: sha512-7H9C4FAsrTAbA/ENzvFWsVytqRYhaJYKa2B3fyQcv96TkOGVMcvyS6s+sj4jZlacxxTcn7ygaMXUPkEk7b78zw==} 3129 3238 engines: {node: '>= 10'} ··· 3148 3257 cpu: [arm64] 3149 3258 os: [win32] 3150 3259 3260 + '@next/swc-win32-arm64-msvc@15.0.0-canary.67': 3261 + resolution: {integrity: sha512-SZr5EoYk9pQHPuwmDJUEwyQIbCPFEo8zdV+7gpTx3NZgmdDtgoG+gsct/ya9hLvP8sMw9x6gl+0YacSMd1lQNA==} 3262 + engines: {node: '>= 10'} 3263 + cpu: [arm64] 3264 + os: [win32] 3265 + 3151 3266 '@next/swc-win32-arm64-msvc@15.0.4': 3152 3267 resolution: {integrity: sha512-Z/v3WV5xRaeWlgJzN9r4PydWD8sXV35ywc28W63i37G2jnUgScA4OOgS8hQdiXLxE3gqfSuHTicUhr7931OXPQ==} 3153 3268 engines: {node: '>= 10'} ··· 3172 3287 cpu: [ia32] 3173 3288 os: [win32] 3174 3289 3290 + '@next/swc-win32-ia32-msvc@15.0.0-canary.67': 3291 + resolution: {integrity: sha512-u4gm/gCUU+e8Y77LoTRo3yfzh/qIQg3FmGTw4vB/WYBNcfU8xm02CL0SZtgePzLLia0WsETW3cgoNPQPr3ae+w==} 3292 + engines: {node: '>= 10'} 3293 + cpu: [ia32] 3294 + os: [win32] 3295 + 3175 3296 '@next/swc-win32-x64-msvc@14.2.11': 3176 3297 resolution: {integrity: sha512-gQpS7mcgovWoaTG1FbS5/ojF7CGfql1Q0ZLsMrhcsi2Sr9HEqsUZ70MPJyaYBXbk6iEAP7UXMD9HC8KY1qNwvA==} 3177 3298 engines: {node: '>= 10'} ··· 3184 3305 cpu: [x64] 3185 3306 os: [win32] 3186 3307 3308 + '@next/swc-win32-x64-msvc@15.0.0-canary.67': 3309 + resolution: {integrity: sha512-nfJVGjNh9d2V81mzCPq8cQ2w/YMAI6V2OejepR/jBKxZ+n0PJKrUHf52e+Ubak8bZOIvxKqaOj4WaceOljqNMQ==} 3310 + engines: {node: '>= 10'} 3311 + cpu: [x64] 3312 + os: [win32] 3313 + 3187 3314 '@next/swc-win32-x64-msvc@15.0.4': 3188 3315 resolution: {integrity: sha512-NGLchGruagh8lQpDr98bHLyWJXOBSmkEAfK980OiNBa7vNm6PsNoPvzTfstT78WyOeMRQphEQ455rggd7Eo+Dw==} 3189 3316 engines: {node: '>= 10'} ··· 4013 4140 '@swc/counter@0.1.3': 4014 4141 resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} 4015 4142 4143 + '@swc/helpers@0.5.11': 4144 + resolution: {integrity: sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A==} 4145 + 4016 4146 '@swc/helpers@0.5.12': 4017 4147 resolution: {integrity: sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g==} 4018 4148 ··· 4047 4177 resolution: {integrity: sha512-p18dswChx6WnTSaJCSGx6lTmrGzNNvm2FtXmiO6AuA1V4U5REyoqwmT6kgAsIMdjo07QdAfYXHJ4hnMtfHzWgA==} 4048 4178 peerDependencies: 4049 4179 tailwindcss: '>=3.2.0' 4180 + 4181 + '@tailwindcss/forms@0.5.7': 4182 + resolution: {integrity: sha512-QE7X69iQI+ZXwldE+rzasvbJiyV/ju1FGHH0Qn2W3FKbuYtqp8LKcy6iSw79fVUT5/Vvf+0XgLCeYVG+UV6hOw==} 4183 + peerDependencies: 4184 + tailwindcss: '>=3.0.0 || >= 3.0.0-alpha.1' 4185 + 4186 + '@tailwindcss/typography@0.5.13': 4187 + resolution: {integrity: sha512-ADGcJ8dX21dVVHIwTRgzrcunY6YY9uSlAHHGVKvkA+vLc5qLwEszvKts40lx7z0qc4clpjclwLeK5rVCV2P/uw==} 4188 + peerDependencies: 4189 + tailwindcss: '>=3.0.0 || insiders' 4050 4190 4051 4191 '@tailwindcss/typography@0.5.15': 4052 4192 resolution: {integrity: sha512-AqhlCXl+8grUz8uqExv5OTtgpjuVIwFTSXTrh8y9/pw6q2ek7fJ+Y8ZEVw7EB2DCcuCOtEjf9w3+J3rzts01uA==} ··· 4164 4304 '@types/node@16.18.11': 4165 4305 resolution: {integrity: sha512-3oJbGBUWuS6ahSnEq1eN2XrCyf4YsWI8OyCvo7c64zQJNplk3mO84t53o8lfTk+2ji59g5ycfc6qQ3fdHliHuA==} 4166 4306 4307 + '@types/node@20.14.10': 4308 + resolution: {integrity: sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==} 4309 + 4167 4310 '@types/node@20.17.6': 4168 4311 resolution: {integrity: sha512-VEI7OdvK2wP7XHnsuXbAJnEpEkF6NjSN45QJlL4VGqZSXsnicpesdTWsg9RISeSdYd3yeRj/y3k5KGjUXYnFwQ==} 4169 4312 ··· 4551 4694 4552 4695 autoprefixer@10.4.15: 4553 4696 resolution: {integrity: sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==} 4697 + engines: {node: ^10 || ^12 || >=14} 4698 + hasBin: true 4699 + peerDependencies: 4700 + postcss: ^8.1.0 4701 + 4702 + autoprefixer@10.4.19: 4703 + resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} 4554 4704 engines: {node: ^10 || ^12 || >=14} 4555 4705 hasBin: true 4556 4706 peerDependencies: ··· 5068 5218 diff@4.0.2: 5069 5219 resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} 5070 5220 engines: {node: '>=0.3.1'} 5221 + 5222 + dinero.js@2.0.0-alpha.8: 5223 + resolution: {integrity: sha512-6bl+g6oh6iQ6vPR5Pd4qr7D+P5e51GYRUT3jl8HYqYeejYC5sd9OVTTbXC3WU7L25mAIbOm+diiTVz1rL4QLwg==} 5071 5224 5072 5225 dir-glob@3.0.1: 5073 5226 resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} ··· 6855 7008 resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} 6856 7009 engines: {node: '>=4'} 6857 7010 7011 + mini-svg-data-uri@1.4.4: 7012 + resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==} 7013 + hasBin: true 7014 + 6858 7015 miniflare@3.20250124.1: 6859 7016 resolution: {integrity: sha512-BL8jq7btzaHFs/8PwYjBIiBecyqkEwkJIsFvoO/4bJn8O9NAbFaLSB023nGpfwWCebP6uSepzqZm4hrOOxA8Eg==} 6860 7017 engines: {node: '>=16.13'} ··· 7017 7174 babel-plugin-react-compiler: '*' 7018 7175 react: 19.0.0-rc-187dd6a7-20240806 7019 7176 react-dom: 19.0.0-rc-187dd6a7-20240806 7177 + sass: ^1.3.0 7178 + peerDependenciesMeta: 7179 + '@opentelemetry/api': 7180 + optional: true 7181 + '@playwright/test': 7182 + optional: true 7183 + babel-plugin-react-compiler: 7184 + optional: true 7185 + sass: 7186 + optional: true 7187 + 7188 + next@15.0.0-canary.67: 7189 + resolution: {integrity: sha512-t6TK98DaoVLfhMF5S3EhSyLjsDh06UjEiYGPScSft9DIdmY0SIjOFOHUVBuZ3Mt+oeuhSyZHs4q5G0+KLvxiSA==} 7190 + engines: {node: '>=18.18.0'} 7191 + hasBin: true 7192 + peerDependencies: 7193 + '@opentelemetry/api': ^1.1.0 7194 + '@playwright/test': ^1.41.2 7195 + babel-plugin-react-compiler: '*' 7196 + react: 19.0.0-rc.0 7197 + react-dom: 19.0.0-rc.0 7020 7198 sass: ^1.3.0 7021 7199 peerDependenciesMeta: 7022 7200 '@opentelemetry/api': ··· 7485 7663 resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} 7486 7664 engines: {node: ^10 || ^12 || >=14} 7487 7665 7666 + postcss@8.4.39: 7667 + resolution: {integrity: sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==} 7668 + engines: {node: ^10 || ^12 || >=14} 7669 + 7488 7670 postcss@8.4.47: 7489 7671 resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} 7490 7672 engines: {node: ^10 || ^12 || >=14} ··· 7674 7856 peerDependencies: 7675 7857 react: 19.0.0-rc-3208e73e-20240730 7676 7858 7859 + react-dom@19.0.0-rc-8b08e99e-20240713: 7860 + resolution: {integrity: sha512-nTbNXc5LVuFh+CwsmwogdYzHumZb9LVtWr1pE3DFHjY3y2VM/bYg8d00Vn6WWqQ8js3PY1w150NEEax4CrtsTA==} 7861 + peerDependencies: 7862 + react: 19.0.0-rc-8b08e99e-20240713 7863 + 7677 7864 react-hook-form@7.54.2: 7678 7865 resolution: {integrity: sha512-eHpAUgUjWbZocoQYUHposymRb4ZP6d0uwUnooL2uOybA9/3tPUvoAKqEWK1WaSiTxxOfTpffNZP7QwlnM3/gEg==} 7679 7866 engines: {node: '>=18.0.0'} ··· 7698 7885 7699 7886 react@19.0.0-rc-3208e73e-20240730: 7700 7887 resolution: {integrity: sha512-4TmFOcgSfwM8w18vXLnEt8tb3ilO9a0GRJA9zQSYjZ5ie6g/zkxagRvZvZbEmhaNgDSF/PKmEdWmfBtlUBcjkA==} 7888 + engines: {node: '>=0.10.0'} 7889 + 7890 + react@19.0.0-rc-8b08e99e-20240713: 7891 + resolution: {integrity: sha512-j56t3i/sMNftehdO/cA0kFeKDh9Pi1FxKba6u0sRgzZ73HVWii64oUbFxkUmf6I/C9uCmovY3HnFpT7/0UTIaw==} 7701 7892 engines: {node: '>=0.10.0'} 7702 7893 7703 7894 read-cache@1.0.0: ··· 7879 8070 7880 8071 scheduler@0.25.0-rc-3208e73e-20240730: 7881 8072 resolution: {integrity: sha512-eCGy6Bm6PX2JB7dLumQuEYwmXku9HweMfdXCQQ2ZaRG3kwxK76RWFr7CsW/LHju8fiDSiJajl0Iq62uoaH9VLQ==} 8073 + 8074 + scheduler@0.25.0-rc-8b08e99e-20240713: 8075 + resolution: {integrity: sha512-vPAQ9hTVeh54O7K7nTH5rIr060XI2E5xXSLOeiDpZVjtZW9DhZMjq4L82aI8J5EZPwYlWH69SdKBwFMIleNkUQ==} 7882 8076 7883 8077 section-matter@1.0.0: 7884 8078 resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} ··· 8271 8465 engines: {node: '>=14.0.0'} 8272 8466 hasBin: true 8273 8467 8468 + tailwindcss@3.4.5: 8469 + resolution: {integrity: sha512-DlTxttYcogpDfx3tf/8jfnma1nfAYi2cBUYV2YNoPPecwmO3YGiFlOX9D8tGAu+EDF38ryBzvrDKU/BLMsUwbw==} 8470 + engines: {node: '>=14.0.0'} 8471 + hasBin: true 8472 + 8274 8473 tapable@2.2.1: 8275 8474 resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} 8276 8475 engines: {node: '>=6'} ··· 8501 8700 engines: {node: '>=4.2.0'} 8502 8701 hasBin: true 8503 8702 8703 + typescript@5.5.3: 8704 + resolution: {integrity: sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==} 8705 + engines: {node: '>=14.17'} 8706 + hasBin: true 8707 + 8504 8708 typescript@5.7.3: 8505 8709 resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} 8506 8710 engines: {node: '>=14.17'} ··· 8518 8722 unbox-primitive@1.1.0: 8519 8723 resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} 8520 8724 engines: {node: '>= 0.4'} 8725 + 8726 + undici-types@5.26.5: 8727 + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} 8521 8728 8522 8729 undici-types@6.13.0: 8523 8730 resolution: {integrity: sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==} ··· 10487 10694 '@cspotcode/source-map-support@0.8.1': 10488 10695 dependencies: 10489 10696 '@jridgewell/trace-mapping': 0.3.9 10697 + 10698 + '@dinero.js/calculator-number@2.0.0-alpha.8': 10699 + dependencies: 10700 + '@dinero.js/core': 2.0.0-alpha.8 10701 + 10702 + '@dinero.js/core@2.0.0-alpha.8': 10703 + dependencies: 10704 + '@dinero.js/currencies': 2.0.0-alpha.8 10705 + 10706 + '@dinero.js/currencies@2.0.0-alpha.8': {} 10490 10707 10491 10708 '@dotenvx/dotenvx@1.31.0': 10492 10709 dependencies: ··· 11497 11714 '@grpc/grpc-js@1.9.15': 11498 11715 dependencies: 11499 11716 '@grpc/proto-loader': 0.7.13 11500 - '@types/node': 20.17.6 11717 + '@types/node': 20.14.10 11501 11718 11502 11719 '@grpc/proto-loader@0.7.13': 11503 11720 dependencies: ··· 11518 11735 '@heroicons/react@2.1.5(react@19.0.0-rc-3208e73e-20240730)': 11519 11736 dependencies: 11520 11737 react: 19.0.0-rc-3208e73e-20240730 11738 + 11739 + '@heroicons/react@2.1.5(react@19.0.0-rc-8b08e99e-20240713)': 11740 + dependencies: 11741 + react: 19.0.0-rc-8b08e99e-20240713 11521 11742 11522 11743 '@hookform/resolvers@3.10.0(react-hook-form@7.54.2(react@19.0.0))': 11523 11744 dependencies: ··· 11753 11974 11754 11975 '@next/env@15.0.0-canary.113': {} 11755 11976 11977 + '@next/env@15.0.0-canary.67': {} 11978 + 11756 11979 '@next/env@15.0.4': {} 11757 11980 11758 11981 '@next/env@15.1.0': {} ··· 11775 11998 '@next/swc-darwin-arm64@15.0.0-canary.113': 11776 11999 optional: true 11777 12000 12001 + '@next/swc-darwin-arm64@15.0.0-canary.67': 12002 + optional: true 12003 + 11778 12004 '@next/swc-darwin-arm64@15.0.4': 11779 12005 optional: true 11780 12006 ··· 11787 12013 '@next/swc-darwin-x64@15.0.0-canary.113': 11788 12014 optional: true 11789 12015 12016 + '@next/swc-darwin-x64@15.0.0-canary.67': 12017 + optional: true 12018 + 11790 12019 '@next/swc-darwin-x64@15.0.4': 11791 12020 optional: true 11792 12021 ··· 11799 12028 '@next/swc-linux-arm64-gnu@15.0.0-canary.113': 11800 12029 optional: true 11801 12030 12031 + '@next/swc-linux-arm64-gnu@15.0.0-canary.67': 12032 + optional: true 12033 + 11802 12034 '@next/swc-linux-arm64-gnu@15.0.4': 11803 12035 optional: true 11804 12036 ··· 11811 12043 '@next/swc-linux-arm64-musl@15.0.0-canary.113': 11812 12044 optional: true 11813 12045 12046 + '@next/swc-linux-arm64-musl@15.0.0-canary.67': 12047 + optional: true 12048 + 11814 12049 '@next/swc-linux-arm64-musl@15.0.4': 11815 12050 optional: true 11816 12051 ··· 11823 12058 '@next/swc-linux-x64-gnu@15.0.0-canary.113': 11824 12059 optional: true 11825 12060 12061 + '@next/swc-linux-x64-gnu@15.0.0-canary.67': 12062 + optional: true 12063 + 11826 12064 '@next/swc-linux-x64-gnu@15.0.4': 11827 12065 optional: true 11828 12066 ··· 11835 12073 '@next/swc-linux-x64-musl@15.0.0-canary.113': 11836 12074 optional: true 11837 12075 12076 + '@next/swc-linux-x64-musl@15.0.0-canary.67': 12077 + optional: true 12078 + 11838 12079 '@next/swc-linux-x64-musl@15.0.4': 11839 12080 optional: true 11840 12081 ··· 11847 12088 '@next/swc-win32-arm64-msvc@15.0.0-canary.113': 11848 12089 optional: true 11849 12090 12091 + '@next/swc-win32-arm64-msvc@15.0.0-canary.67': 12092 + optional: true 12093 + 11850 12094 '@next/swc-win32-arm64-msvc@15.0.4': 11851 12095 optional: true 11852 12096 ··· 11859 12103 '@next/swc-win32-ia32-msvc@15.0.0-canary.113': 11860 12104 optional: true 11861 12105 12106 + '@next/swc-win32-ia32-msvc@15.0.0-canary.67': 12107 + optional: true 12108 + 11862 12109 '@next/swc-win32-x64-msvc@14.2.11': 11863 12110 optional: true 11864 12111 11865 12112 '@next/swc-win32-x64-msvc@15.0.0-canary.113': 12113 + optional: true 12114 + 12115 + '@next/swc-win32-x64-msvc@15.0.0-canary.67': 11866 12116 optional: true 11867 12117 11868 12118 '@next/swc-win32-x64-msvc@15.0.4': ··· 13021 13271 13022 13272 '@swc/counter@0.1.3': {} 13023 13273 13274 + '@swc/helpers@0.5.11': 13275 + dependencies: 13276 + tslib: 2.8.1 13277 + 13024 13278 '@swc/helpers@0.5.12': 13025 13279 dependencies: 13026 13280 tslib: 2.6.3 ··· 13055 13309 dependencies: 13056 13310 tailwindcss: 3.4.11(ts-node@10.9.1(@types/node@22.2.0)(typescript@5.7.3)) 13057 13311 13312 + '@tailwindcss/forms@0.5.7(tailwindcss@3.4.5(ts-node@10.9.1(@types/node@20.14.10)(typescript@5.5.3)))': 13313 + dependencies: 13314 + mini-svg-data-uri: 1.4.4 13315 + tailwindcss: 3.4.5(ts-node@10.9.1(@types/node@20.14.10)(typescript@5.5.3)) 13316 + 13317 + '@tailwindcss/typography@0.5.13(tailwindcss@3.4.5(ts-node@10.9.1(@types/node@20.14.10)(typescript@5.5.3)))': 13318 + dependencies: 13319 + lodash.castarray: 4.4.0 13320 + lodash.isplainobject: 4.0.6 13321 + lodash.merge: 4.6.2 13322 + postcss-selector-parser: 6.0.10 13323 + tailwindcss: 3.4.5(ts-node@10.9.1(@types/node@20.14.10)(typescript@5.5.3)) 13324 + 13058 13325 '@tailwindcss/typography@0.5.15(tailwindcss@3.4.11(ts-node@10.9.1(@types/node@22.2.0)(typescript@5.7.3)))': 13059 13326 dependencies: 13060 13327 lodash.castarray: 4.4.0 ··· 13114 13381 '@types/body-parser@1.19.5': 13115 13382 dependencies: 13116 13383 '@types/connect': 3.4.38 13117 - '@types/node': 20.17.6 13384 + '@types/node': 20.14.10 13118 13385 13119 13386 '@types/caseless@0.12.5': 13120 13387 optional: true 13121 13388 13122 13389 '@types/connect@3.4.38': 13123 13390 dependencies: 13124 - '@types/node': 20.17.6 13391 + '@types/node': 20.14.10 13125 13392 13126 13393 '@types/debug@4.1.12': 13127 13394 dependencies: ··· 13133 13400 13134 13401 '@types/express-serve-static-core@4.19.6': 13135 13402 dependencies: 13136 - '@types/node': 20.17.6 13403 + '@types/node': 20.14.10 13137 13404 '@types/qs': 6.9.18 13138 13405 '@types/range-parser': 1.2.7 13139 13406 '@types/send': 0.17.4 ··· 13158 13425 '@types/jsonwebtoken@9.0.8': 13159 13426 dependencies: 13160 13427 '@types/ms': 0.7.34 13161 - '@types/node': 20.17.6 13428 + '@types/node': 20.14.10 13162 13429 13163 13430 '@types/long@4.0.2': 13164 13431 optional: true ··· 13171 13438 13172 13439 '@types/mock-fs@4.13.4': 13173 13440 dependencies: 13174 - '@types/node': 20.17.6 13441 + '@types/node': 20.14.10 13175 13442 13176 13443 '@types/ms@0.7.34': {} 13177 13444 ··· 13179 13446 13180 13447 '@types/node@16.18.11': {} 13181 13448 13449 + '@types/node@20.14.10': 13450 + dependencies: 13451 + undici-types: 5.26.5 13452 + 13182 13453 '@types/node@20.17.6': 13183 13454 dependencies: 13184 13455 undici-types: 6.19.8 ··· 13219 13490 '@types/request@2.48.12': 13220 13491 dependencies: 13221 13492 '@types/caseless': 0.12.5 13222 - '@types/node': 20.17.6 13493 + '@types/node': 20.14.10 13223 13494 '@types/tough-cookie': 4.0.5 13224 13495 form-data: 2.5.2 13225 13496 optional: true ··· 13229 13500 '@types/send@0.17.4': 13230 13501 dependencies: 13231 13502 '@types/mime': 1.3.5 13232 - '@types/node': 20.17.6 13503 + '@types/node': 20.14.10 13233 13504 13234 13505 '@types/serve-static@1.15.7': 13235 13506 dependencies: 13236 13507 '@types/http-errors': 2.0.4 13237 - '@types/node': 20.17.6 13508 + '@types/node': 20.14.10 13238 13509 '@types/send': 0.17.4 13239 13510 13240 13511 '@types/tough-cookie@4.0.5': ··· 13246 13517 13247 13518 '@types/ws@8.5.14': 13248 13519 dependencies: 13249 - '@types/node': 20.17.6 13520 + '@types/node': 20.14.10 13250 13521 13251 13522 '@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)': 13252 13523 dependencies: ··· 13801 14072 postcss: 8.4.27 13802 14073 postcss-value-parser: 4.2.0 13803 14074 14075 + autoprefixer@10.4.19(postcss@8.4.39): 14076 + dependencies: 14077 + browserslist: 4.24.0 14078 + caniuse-lite: 1.0.30001664 14079 + fraction.js: 4.3.7 14080 + normalize-range: 0.1.2 14081 + picocolors: 1.1.0 14082 + postcss: 8.4.39 14083 + postcss-value-parser: 4.2.0 14084 + 13804 14085 autoprefixer@10.4.20(postcss@8.4.47): 13805 14086 dependencies: 13806 14087 browserslist: 4.24.0 ··· 14268 14549 didyoumean@1.2.2: {} 14269 14550 14270 14551 diff@4.0.2: {} 14552 + 14553 + dinero.js@2.0.0-alpha.8: 14554 + dependencies: 14555 + '@dinero.js/calculator-number': 2.0.0-alpha.8 14556 + '@dinero.js/core': 2.0.0-alpha.8 14557 + '@dinero.js/currencies': 2.0.0-alpha.8 14271 14558 14272 14559 dir-glob@3.0.1: 14273 14560 dependencies: ··· 14868 15155 '@typescript-eslint/parser': 8.7.0(eslint@8.57.1)(typescript@5.7.3) 14869 15156 eslint: 8.57.1 14870 15157 eslint-import-resolver-node: 0.3.9 14871 - 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) 14872 - 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) 15158 + 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) 15159 + 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) 14873 15160 eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.1) 14874 15161 eslint-plugin-react: 7.36.1(eslint@8.57.1) 14875 15162 eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1) ··· 14888 15175 '@typescript-eslint/parser': 8.7.0(eslint@8.57.1)(typescript@5.7.3) 14889 15176 eslint: 8.57.1 14890 15177 eslint-import-resolver-node: 0.3.9 14891 - 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) 15178 + 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) 14892 15179 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) 14893 15180 eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.1) 14894 15181 eslint-plugin-react: 7.36.1(eslint@8.57.1) ··· 14908 15195 '@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3) 14909 15196 eslint: 9.11.1(jiti@1.21.6) 14910 15197 eslint-import-resolver-node: 0.3.9 14911 - 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)) 15198 + 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)) 14912 15199 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)) 14913 15200 eslint-plugin-jsx-a11y: 6.10.0(eslint@9.11.1(jiti@1.21.6)) 14914 15201 eslint-plugin-react: 7.37.4(eslint@9.11.1(jiti@1.21.6)) ··· 14928 15215 transitivePeerDependencies: 14929 15216 - supports-color 14930 15217 14931 - 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): 15218 + 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): 14932 15219 dependencies: 14933 15220 '@nolyfill/is-core-module': 1.0.39 14934 15221 debug: 4.3.6 14935 15222 enhanced-resolve: 5.17.1 14936 15223 eslint: 8.57.1 14937 - 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) 15224 + 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) 14938 15225 fast-glob: 3.3.2 14939 15226 get-tsconfig: 4.8.0 14940 15227 is-bun-module: 1.2.1 14941 15228 is-glob: 4.0.3 14942 15229 optionalDependencies: 14943 - 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) 15230 + 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) 14944 15231 transitivePeerDependencies: 14945 15232 - '@typescript-eslint/parser' 14946 15233 - eslint-import-resolver-node 14947 15234 - eslint-import-resolver-webpack 14948 15235 - supports-color 14949 15236 14950 - 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): 15237 + 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): 14951 15238 dependencies: 14952 15239 '@nolyfill/is-core-module': 1.0.39 14953 15240 debug: 4.3.6 14954 15241 enhanced-resolve: 5.17.1 14955 15242 eslint: 8.57.1 14956 - 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) 15243 + 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) 14957 15244 fast-glob: 3.3.2 14958 15245 get-tsconfig: 4.8.0 14959 15246 is-bun-module: 1.2.1 ··· 14966 15253 - eslint-import-resolver-webpack 14967 15254 - supports-color 14968 15255 14969 - 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)): 15256 + 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)): 14970 15257 dependencies: 14971 15258 '@nolyfill/is-core-module': 1.0.39 14972 15259 debug: 4.3.6 14973 15260 enhanced-resolve: 5.17.1 14974 15261 eslint: 9.11.1(jiti@1.21.6) 14975 - 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)) 15262 + 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)) 14976 15263 fast-glob: 3.3.2 14977 15264 get-tsconfig: 4.8.0 14978 15265 is-bun-module: 1.2.1 ··· 14985 15272 - eslint-import-resolver-webpack 14986 15273 - supports-color 14987 15274 14988 - 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): 15275 + 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): 14989 15276 dependencies: 14990 15277 debug: 3.2.7 14991 15278 optionalDependencies: 14992 15279 '@typescript-eslint/parser': 8.7.0(eslint@8.57.1)(typescript@5.7.3) 14993 15280 eslint: 8.57.1 14994 15281 eslint-import-resolver-node: 0.3.9 14995 - 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) 15282 + 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) 14996 15283 transitivePeerDependencies: 14997 15284 - supports-color 14998 15285 14999 - 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)): 15286 + 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): 15287 + dependencies: 15288 + debug: 3.2.7 15289 + optionalDependencies: 15290 + '@typescript-eslint/parser': 8.7.0(eslint@8.57.1)(typescript@5.7.3) 15291 + eslint: 8.57.1 15292 + eslint-import-resolver-node: 0.3.9 15293 + 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) 15294 + transitivePeerDependencies: 15295 + - supports-color 15296 + 15297 + 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)): 15000 15298 dependencies: 15001 15299 debug: 3.2.7 15002 15300 optionalDependencies: 15003 15301 '@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3) 15004 15302 eslint: 9.11.1(jiti@1.21.6) 15005 15303 eslint-import-resolver-node: 0.3.9 15006 - 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)) 15304 + 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)) 15007 15305 transitivePeerDependencies: 15008 15306 - supports-color 15009 15307 15010 - 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): 15308 + 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): 15011 15309 dependencies: 15012 15310 debug: 3.2.7 15013 15311 optionalDependencies: 15014 15312 '@typescript-eslint/parser': 8.7.0(eslint@8.57.1)(typescript@5.7.3) 15015 15313 eslint: 8.57.1 15016 15314 eslint-import-resolver-node: 0.3.9 15017 - 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) 15315 + 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) 15018 15316 transitivePeerDependencies: 15019 15317 - supports-color 15020 15318 15021 - 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)): 15319 + 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)): 15022 15320 dependencies: 15023 15321 debug: 3.2.7 15024 15322 optionalDependencies: 15025 15323 '@typescript-eslint/parser': 8.7.0(eslint@9.11.1(jiti@1.21.6))(typescript@5.7.3) 15026 15324 eslint: 9.11.1(jiti@1.21.6) 15027 15325 eslint-import-resolver-node: 0.3.9 15028 - 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)) 15326 + 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)) 15029 15327 transitivePeerDependencies: 15030 15328 - supports-color 15031 15329 15032 - 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): 15330 + 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): 15033 15331 dependencies: 15034 15332 '@rtsao/scc': 1.1.0 15035 15333 array-includes: 3.1.8 ··· 15040 15338 doctrine: 2.1.0 15041 15339 eslint: 8.57.1 15042 15340 eslint-import-resolver-node: 0.3.9 15043 - 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) 15341 + 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) 15044 15342 hasown: 2.0.2 15045 15343 is-core-module: 2.15.1 15046 15344 is-glob: 4.0.3 ··· 15068 15366 doctrine: 2.1.0 15069 15367 eslint: 8.57.1 15070 15368 eslint-import-resolver-node: 0.3.9 15071 - 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) 15369 + 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) 15072 15370 hasown: 2.0.2 15073 15371 is-core-module: 2.15.1 15074 15372 is-glob: 4.0.3 ··· 15097 15395 doctrine: 2.1.0 15098 15396 eslint: 9.11.1(jiti@1.21.6) 15099 15397 eslint-import-resolver-node: 0.3.9 15100 - 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)) 15398 + 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)) 15101 15399 hasown: 2.0.2 15102 15400 is-core-module: 2.15.1 15103 15401 is-glob: 4.0.3 ··· 15719 16017 geist@1.3.1(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)): 15720 16018 dependencies: 15721 16019 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) 16020 + 16021 + 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)): 16022 + dependencies: 16023 + 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) 15722 16024 15723 16025 generic-pool@3.4.2: {} 15724 16026 ··· 16789 17091 16790 17092 min-indent@1.0.1: {} 16791 17093 17094 + mini-svg-data-uri@1.4.4: {} 17095 + 16792 17096 miniflare@3.20250124.1: 16793 17097 dependencies: 16794 17098 '@cspotcode/source-map-support': 0.8.1 ··· 17003 17307 - '@babel/core' 17004 17308 - babel-plugin-macros 17005 17309 17310 + 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): 17311 + dependencies: 17312 + '@next/env': 15.0.0-canary.67 17313 + '@swc/helpers': 0.5.11 17314 + busboy: 1.6.0 17315 + caniuse-lite: 1.0.30001664 17316 + graceful-fs: 4.2.11 17317 + postcss: 8.4.31 17318 + react: 19.0.0-rc-8b08e99e-20240713 17319 + react-dom: 19.0.0-rc-8b08e99e-20240713(react@19.0.0-rc-8b08e99e-20240713) 17320 + styled-jsx: 5.1.6(react@19.0.0-rc-8b08e99e-20240713) 17321 + optionalDependencies: 17322 + '@next/swc-darwin-arm64': 15.0.0-canary.67 17323 + '@next/swc-darwin-x64': 15.0.0-canary.67 17324 + '@next/swc-linux-arm64-gnu': 15.0.0-canary.67 17325 + '@next/swc-linux-arm64-musl': 15.0.0-canary.67 17326 + '@next/swc-linux-x64-gnu': 15.0.0-canary.67 17327 + '@next/swc-linux-x64-musl': 15.0.0-canary.67 17328 + '@next/swc-win32-arm64-msvc': 15.0.0-canary.67 17329 + '@next/swc-win32-ia32-msvc': 15.0.0-canary.67 17330 + '@next/swc-win32-x64-msvc': 15.0.0-canary.67 17331 + '@opentelemetry/api': 1.9.0 17332 + '@playwright/test': 1.47.0 17333 + sharp: 0.33.5 17334 + transitivePeerDependencies: 17335 + - '@babel/core' 17336 + - babel-plugin-macros 17337 + 17006 17338 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): 17007 17339 dependencies: 17008 17340 '@next/env': 15.0.4 ··· 17391 17723 17392 17724 possible-typed-array-names@1.0.0: {} 17393 17725 17726 + postcss-import@15.1.0(postcss@8.4.39): 17727 + dependencies: 17728 + postcss: 8.4.39 17729 + postcss-value-parser: 4.2.0 17730 + read-cache: 1.0.0 17731 + resolve: 1.22.8 17732 + 17394 17733 postcss-import@15.1.0(postcss@8.4.47): 17395 17734 dependencies: 17396 17735 postcss: 8.4.47 ··· 17398 17737 read-cache: 1.0.0 17399 17738 resolve: 1.22.8 17400 17739 17740 + postcss-js@4.0.1(postcss@8.4.39): 17741 + dependencies: 17742 + camelcase-css: 2.0.1 17743 + postcss: 8.4.39 17744 + 17401 17745 postcss-js@4.0.1(postcss@8.4.47): 17402 17746 dependencies: 17403 17747 camelcase-css: 2.0.1 17404 17748 postcss: 8.4.47 17405 17749 17750 + postcss-load-config@4.0.2(postcss@8.4.39)(ts-node@10.9.1(@types/node@20.14.10)(typescript@5.5.3)): 17751 + dependencies: 17752 + lilconfig: 3.1.2 17753 + yaml: 2.7.0 17754 + optionalDependencies: 17755 + postcss: 8.4.39 17756 + ts-node: 10.9.1(@types/node@20.14.10)(typescript@5.5.3) 17757 + 17406 17758 postcss-load-config@4.0.2(postcss@8.4.47)(ts-node@10.9.1(@types/node@20.17.6)(typescript@5.7.3)): 17407 17759 dependencies: 17408 17760 lilconfig: 3.1.2 ··· 17418 17770 optionalDependencies: 17419 17771 postcss: 8.4.47 17420 17772 ts-node: 10.9.1(@types/node@22.2.0)(typescript@5.7.3) 17773 + 17774 + postcss-nested@6.2.0(postcss@8.4.39): 17775 + dependencies: 17776 + postcss: 8.4.39 17777 + postcss-selector-parser: 6.1.2 17421 17778 17422 17779 postcss-nested@6.2.0(postcss@8.4.47): 17423 17780 dependencies: ··· 17448 17805 picocolors: 1.0.1 17449 17806 source-map-js: 1.2.0 17450 17807 17808 + postcss@8.4.39: 17809 + dependencies: 17810 + nanoid: 3.3.7 17811 + picocolors: 1.1.0 17812 + source-map-js: 1.2.1 17813 + 17451 17814 postcss@8.4.47: 17452 17815 dependencies: 17453 17816 nanoid: 3.3.7 ··· 17525 17888 '@protobufjs/path': 1.1.2 17526 17889 '@protobufjs/pool': 1.1.0 17527 17890 '@protobufjs/utf8': 1.1.0 17528 - '@types/node': 20.17.6 17891 + '@types/node': 20.14.10 17529 17892 long: 5.2.4 17530 17893 17531 17894 proxy-addr@2.0.7: ··· 17608 17971 react: 19.0.0-rc-3208e73e-20240730 17609 17972 scheduler: 0.25.0-rc-3208e73e-20240730 17610 17973 17974 + react-dom@19.0.0-rc-8b08e99e-20240713(react@19.0.0-rc-8b08e99e-20240713): 17975 + dependencies: 17976 + react: 19.0.0-rc-8b08e99e-20240713 17977 + scheduler: 0.25.0-rc-8b08e99e-20240713 17978 + 17611 17979 react-hook-form@7.54.2(react@19.0.0): 17612 17980 dependencies: 17613 17981 react: 19.0.0 ··· 17625 17993 react@19.0.0: {} 17626 17994 17627 17995 react@19.0.0-rc-3208e73e-20240730: {} 17996 + 17997 + react@19.0.0-rc-8b08e99e-20240713: {} 17628 17998 17629 17999 read-cache@1.0.0: 17630 18000 dependencies: ··· 17887 18257 scheduler@0.25.0: {} 17888 18258 17889 18259 scheduler@0.25.0-rc-3208e73e-20240730: {} 18260 + 18261 + scheduler@0.25.0-rc-8b08e99e-20240713: {} 17890 18262 17891 18263 section-matter@1.0.0: 17892 18264 dependencies: ··· 18312 18684 client-only: 0.0.1 18313 18685 react: 19.0.0-rc-3208e73e-20240730 18314 18686 18687 + styled-jsx@5.1.6(react@19.0.0-rc-8b08e99e-20240713): 18688 + dependencies: 18689 + client-only: 0.0.1 18690 + react: 19.0.0-rc-8b08e99e-20240713 18691 + 18315 18692 sucrase@3.35.0: 18316 18693 dependencies: 18317 18694 '@jridgewell/gen-mapping': 0.3.5 ··· 18427 18804 transitivePeerDependencies: 18428 18805 - ts-node 18429 18806 18807 + tailwindcss@3.4.5(ts-node@10.9.1(@types/node@20.14.10)(typescript@5.5.3)): 18808 + dependencies: 18809 + '@alloc/quick-lru': 5.2.0 18810 + arg: 5.0.2 18811 + chokidar: 3.6.0 18812 + didyoumean: 1.2.2 18813 + dlv: 1.1.3 18814 + fast-glob: 3.3.2 18815 + glob-parent: 6.0.2 18816 + is-glob: 4.0.3 18817 + jiti: 1.21.6 18818 + lilconfig: 2.1.0 18819 + micromatch: 4.0.7 18820 + normalize-path: 3.0.0 18821 + object-hash: 3.0.0 18822 + picocolors: 1.1.0 18823 + postcss: 8.4.39 18824 + postcss-import: 15.1.0(postcss@8.4.39) 18825 + postcss-js: 4.0.1(postcss@8.4.39) 18826 + postcss-load-config: 4.0.2(postcss@8.4.39)(ts-node@10.9.1(@types/node@20.14.10)(typescript@5.5.3)) 18827 + postcss-nested: 6.2.0(postcss@8.4.39) 18828 + postcss-selector-parser: 6.1.2 18829 + resolve: 1.22.8 18830 + sucrase: 3.35.0 18831 + transitivePeerDependencies: 18832 + - ts-node 18833 + 18430 18834 tapable@2.2.1: {} 18431 18835 18432 18836 tar-fs@2.1.2: ··· 18567 18971 v8-compile-cache-lib: 3.0.1 18568 18972 yn: 3.1.1 18569 18973 18974 + ts-node@10.9.1(@types/node@20.14.10)(typescript@5.5.3): 18975 + dependencies: 18976 + '@cspotcode/source-map-support': 0.8.1 18977 + '@tsconfig/node10': 1.0.11 18978 + '@tsconfig/node12': 1.0.11 18979 + '@tsconfig/node14': 1.0.3 18980 + '@tsconfig/node16': 1.0.4 18981 + '@types/node': 20.14.10 18982 + acorn: 8.14.0 18983 + acorn-walk: 8.3.3 18984 + arg: 4.1.3 18985 + create-require: 1.1.1 18986 + diff: 4.0.2 18987 + make-error: 1.3.6 18988 + typescript: 5.5.3 18989 + v8-compile-cache-lib: 3.0.1 18990 + yn: 3.1.1 18991 + optional: true 18992 + 18570 18993 ts-node@10.9.1(@types/node@20.17.6)(typescript@5.7.3): 18571 18994 dependencies: 18572 18995 '@cspotcode/source-map-support': 0.8.1 ··· 18736 19159 18737 19160 typescript@4.9.5: {} 18738 19161 19162 + typescript@5.5.3: {} 19163 + 18739 19164 typescript@5.7.3: {} 18740 19165 18741 19166 ufo@1.5.4: {} ··· 18755 19180 has-bigints: 1.0.2 18756 19181 has-symbols: 1.1.0 18757 19182 which-boxed-primitive: 1.1.1 19183 + 19184 + undici-types@5.26.5: {} 18758 19185 18759 19186 undici-types@6.13.0: {} 18760 19187