├── .gitignore ├── pnpm-workspace.yaml ├── example ├── app │ ├── opengraph-image.png │ ├── icon.svg │ ├── demo │ │ └── page.js │ ├── layout.js │ ├── style.css │ └── page.js └── package.json ├── tsconfig.json ├── src ├── index.ts ├── use-hash.ts ├── transition-context.tsx ├── use-transition-router.ts ├── link.tsx └── browser-native-events.ts ├── LICENSE ├── package.json ├── README.md └── pnpm-lock.yaml /.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules 3 | .next 4 | .DS_Store -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - 'example' 3 | - '.' 4 | -------------------------------------------------------------------------------- /example/app/opengraph-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/shuding/next-view-transitions/HEAD/example/app/opengraph-image.png -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "ESNext", 4 | "moduleResolution": "bundler", 5 | "lib": ["ESNext", "DOM"], 6 | "jsx": "react-jsx" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | export { Link } from './link' 4 | export { ViewTransitions } from './transition-context' 5 | export { useTransitionRouter } from './use-transition-router' 6 | -------------------------------------------------------------------------------- /example/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "next-view-transitions-example", 3 | "version": "0.0.0", 4 | "private": true, 5 | "scripts": { 6 | "dev": "next dev", 7 | "build": "next build", 8 | "start": "next start" 9 | }, 10 | "dependencies": { 11 | "geist": "^1.3.0", 12 | "next": "^14.2.1", 13 | "next-view-transitions": "workspace:*", 14 | "react": "^18.2.0", 15 | "react-dom": "^18.2.0" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /example/app/icon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /src/use-hash.ts: -------------------------------------------------------------------------------- 1 | import { useSyncExternalStore } from 'react' 2 | 3 | export function useHash() { 4 | return useSyncExternalStore( 5 | subscribeHash, 6 | getHashSnapshot, 7 | getServerHashSnapshot 8 | ) 9 | } 10 | 11 | function getHashSnapshot() { 12 | return window.location.hash 13 | } 14 | 15 | function getServerHashSnapshot() { 16 | return '' 17 | } 18 | 19 | function subscribeHash(onStoreChange: () => void) { 20 | window.addEventListener('hashchange', onStoreChange) 21 | return () => window.removeEventListener('hashchange', onStoreChange) 22 | } 23 | -------------------------------------------------------------------------------- /example/app/demo/page.js: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { useTransitionRouter } from 'next-view-transitions' 4 | 5 | export default function Page() { 6 | const router = useTransitionRouter() 7 | return ( 8 |
9 |

10 | This is the demo 11 |

12 |

OK you just saw the demo :)

13 | { 16 | e.preventDefault() 17 | router.back() 18 | }} 19 | > 20 | ← Back to homepage 21 | 22 |
23 | ) 24 | } 25 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Shu Ding 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "next-view-transitions", 3 | "version": "0.3.5", 4 | "type": "module", 5 | "description": "View Transitions API for Next.js App Router", 6 | "main": "./dist/index.js", 7 | "types": "./dist/index.d.ts", 8 | "files": [ 9 | "dist" 10 | ], 11 | "exports": "./dist/index.js", 12 | "scripts": { 13 | "build": "bunchee", 14 | "dev": "bunchee --watch", 15 | "prepare": "pnpm run build" 16 | }, 17 | "keywords": [ 18 | "next", 19 | "next.js", 20 | "view transitions", 21 | "route transitions", 22 | "app router" 23 | ], 24 | "author": { 25 | "name": "Shu Ding", 26 | "email": "g@shud.in", 27 | "url": "https://shud.in" 28 | }, 29 | "homepage": "https://next-view-transitions.vercel.app", 30 | "license": "MIT", 31 | "devDependencies": { 32 | "@types/react": "^18.2.78", 33 | "bunchee": "^5.1.2", 34 | "next": "^14.2.1", 35 | "react": "^18.2.0", 36 | "react-dom": "^18.2.0", 37 | "typescript": "^5.4.5" 38 | }, 39 | "peerDependencies": { 40 | "next": ">=14.0.0", 41 | "react": ">=18.2.0 || ^19.0.0", 42 | "react-dom": ">=18.2.0 || ^19.0.0" 43 | }, 44 | "packageManager": "pnpm@9.1.2" 45 | } 46 | -------------------------------------------------------------------------------- /src/transition-context.tsx: -------------------------------------------------------------------------------- 1 | import type { Dispatch, SetStateAction } from 'react' 2 | import { createContext, use, useEffect, useState } from 'react' 3 | 4 | import { useBrowserNativeTransitions } from './browser-native-events' 5 | 6 | const ViewTransitionsContext = createContext< 7 | Dispatch void) | null>> 8 | >(null) 9 | 10 | export function ViewTransitions({ 11 | children, 12 | }: Readonly<{ 13 | children: React.ReactNode 14 | }>) { 15 | const [finishViewTransition, setFinishViewTransition] = useState< 16 | null | (() => void) 17 | >(null) 18 | 19 | useEffect(() => { 20 | if (finishViewTransition) { 21 | finishViewTransition() 22 | setFinishViewTransition(null) 23 | } 24 | }, [finishViewTransition]) 25 | 26 | useBrowserNativeTransitions() 27 | 28 | return ( 29 | 30 | {children} 31 | 32 | ) 33 | } 34 | 35 | export function useSetFinishViewTransition() { 36 | const context = use(ViewTransitionsContext) 37 | 38 | if (!context) { 39 | throw new Error( 40 | 'useSetFinishViewTransition must be used within a ViewTransitions component', 41 | ) 42 | } 43 | 44 | return context 45 | } 46 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # next-view-transitions 2 | 3 | Use [View Transitions API](https://developer.mozilla.org/en-US/docs/Web/API/View_Transitions_API) in Next.js App Router. 4 | 5 | [**Demo**](https://next-view-transitions.vercel.app). 6 | 7 | ## Disclaimer 8 | 9 | This library is aimed at basic use cases of View Transitions and Next.js App Router. With more complex applications and use cases like concurrent rendering, Suspense and streaming, new primitives and APIs still need to be developed into the core of React and Next.js in the future ([more](https://twitter.com/shuding_/status/1779583281920344448)). 10 | 11 | ## Installation 12 | 13 | Use your favorite package manager to install the `next-view-transitions` package. For example: 14 | 15 | ```bash 16 | pnpm install next-view-transitions 17 | ``` 18 | 19 | ## Usage 20 | 21 | Wrap your content with the `` component inside the layout file: 22 | 23 | ```jsx 24 | import { ViewTransitions } from 'next-view-transitions' 25 | 26 | export default function Layout({ children }) { 27 | return ( 28 | 29 | 30 | 31 | {children} 32 | 33 | 34 | 35 | ) 36 | } 37 | ``` 38 | 39 | Then, use the `` component for links that need to trigger a view transition: 40 | 41 | ```jsx 42 | import { Link } from 'next-view-transitions' 43 | 44 | export default function Component() { 45 | return ( 46 |
47 | Go to /about 48 |
49 | ) 50 | } 51 | ``` 52 | 53 | Or use the `useTransitionRouter` hook for programmatic navigation: 54 | 55 | ```jsx 56 | import { useTransitionRouter } from 'next-view-transitions' 57 | 58 | export default function Component() { 59 | const router = useTransitionRouter() 60 | 61 | return ( 62 |
63 | 67 |
68 | ) 69 | } 70 | ``` 71 | 72 | That's it! 73 | 74 | ## License 75 | 76 | MIT. 77 | -------------------------------------------------------------------------------- /example/app/layout.js: -------------------------------------------------------------------------------- 1 | import { GeistSans } from 'geist/font/sans' 2 | import { GeistMono } from 'geist/font/mono' 3 | 4 | import { ViewTransitions } from 'next-view-transitions' 5 | import './style.css' 6 | 7 | export const metadata = { 8 | title: 'Next.js View Transitions', 9 | description: 'Using native CSS View Transitions API in Next.js App Router', 10 | metadataBase: new URL('https://next-view-transitions.vercel.app'), 11 | } 12 | 13 | export default function RootLayout({ children }) { 14 | return ( 15 | 16 | 17 | 18 |

Next.js View Transitions

19 |

20 | Use{' '} 21 | 25 | View Transitions API 26 | {' '} 27 | in Next.js App Router.{' '} 28 | 32 | Source Code ↗ 33 | 34 |

35 |

36 | 37 | ️🔴 Your browser doesn’t support View Transitions. 38 | 39 | 40 | ️🟢 Your browser supports View Transitions. 41 | 42 |

43 |

44 |
{children}
45 | 61 | 62 | 63 |
64 | ) 65 | } 66 | -------------------------------------------------------------------------------- /src/use-transition-router.ts: -------------------------------------------------------------------------------- 1 | import { useRouter as useNextRouter } from 'next/navigation' 2 | import {startTransition, useCallback, useMemo} from "react"; 3 | import { useSetFinishViewTransition } from "./transition-context"; 4 | import { 5 | AppRouterInstance, 6 | NavigateOptions 7 | } from "next/dist/shared/lib/app-router-context.shared-runtime"; 8 | 9 | export type TransitionOptions = { 10 | onTransitionReady?: () => void; 11 | }; 12 | 13 | type NavigateOptionsWithTransition = NavigateOptions & TransitionOptions; 14 | 15 | export type TransitionRouter = AppRouterInstance & { 16 | push: (href: string, options?: NavigateOptionsWithTransition) => void; 17 | replace: (href: string, options?: NavigateOptionsWithTransition) => void; 18 | }; 19 | 20 | export function useTransitionRouter() { 21 | const router = useNextRouter() 22 | const finishViewTransition = useSetFinishViewTransition() 23 | 24 | const triggerTransition = useCallback((cb: () => void, { onTransitionReady }: TransitionOptions = {}) => { 25 | if ('startViewTransition' in document) { 26 | // @ts-ignore 27 | const transition = document.startViewTransition( 28 | () => 29 | new Promise((resolve) => { 30 | startTransition(() => { 31 | cb(); 32 | finishViewTransition(() => resolve) 33 | }) 34 | }) 35 | ) 36 | 37 | if (onTransitionReady) { 38 | transition.ready.then(onTransitionReady); 39 | } 40 | } 41 | else { 42 | return cb() 43 | } 44 | }, []) 45 | 46 | const push = useCallback(( 47 | href: string, 48 | { onTransitionReady, ...options }: NavigateOptionsWithTransition = {} 49 | ) => { 50 | triggerTransition(() => router.push(href, options), { 51 | onTransitionReady 52 | }) 53 | }, [triggerTransition, router]) 54 | 55 | const replace = useCallback(( 56 | href: string, 57 | { onTransitionReady, ...options }: NavigateOptionsWithTransition = {} 58 | ) => { 59 | triggerTransition(() => router.replace(href, options), { 60 | onTransitionReady 61 | }); 62 | }, [triggerTransition, router]); 63 | 64 | return useMemo( 65 | () => ({ 66 | ...router, 67 | push, 68 | replace, 69 | }), 70 | [push, replace, router]); 71 | } -------------------------------------------------------------------------------- /src/link.tsx: -------------------------------------------------------------------------------- 1 | import NextLink from 'next/link' 2 | import { useTransitionRouter } from './use-transition-router' 3 | import { useCallback } from 'react' 4 | 5 | // copied from https://github.com/vercel/next.js/blob/66f8ffaa7a834f6591a12517618dce1fd69784f6/packages/next/src/client/link.tsx#L180-L191 6 | function isModifiedEvent(event: React.MouseEvent): boolean { 7 | const eventTarget = event.currentTarget as HTMLAnchorElement | SVGAElement 8 | const target = eventTarget.getAttribute('target') 9 | return ( 10 | (target && target !== '_self') || 11 | event.metaKey || 12 | event.ctrlKey || 13 | event.shiftKey || 14 | event.altKey || // triggers resource download 15 | (event.nativeEvent && event.nativeEvent.which === 2) 16 | ) 17 | } 18 | 19 | // copied from https://github.com/vercel/next.js/blob/66f8ffaa7a834f6591a12517618dce1fd69784f6/packages/next/src/client/link.tsx#L204-L217 20 | function shouldPreserveDefault( 21 | e: React.MouseEvent 22 | ): boolean { 23 | const { nodeName } = e.currentTarget 24 | 25 | // anchors inside an svg have a lowercase nodeName 26 | const isAnchorNodeName = nodeName.toUpperCase() === 'A' 27 | 28 | if (isAnchorNodeName && isModifiedEvent(e)) { 29 | // ignore click for browser’s default behavior 30 | return true 31 | } 32 | 33 | return false 34 | } 35 | 36 | // This is a wrapper around next/link that explicitly uses the router APIs 37 | // to navigate, and trigger a view transition. 38 | 39 | export function Link(props: React.ComponentProps) { 40 | const router = useTransitionRouter() 41 | 42 | const { href, as, replace, scroll } = props 43 | const onClick = useCallback( 44 | (e: React.MouseEvent) => { 45 | if (props.onClick) { 46 | props.onClick(e) 47 | } 48 | 49 | if (e.defaultPrevented) { 50 | return 51 | } 52 | 53 | if ('startViewTransition' in document) { 54 | if (shouldPreserveDefault(e)) { 55 | return 56 | } 57 | 58 | e.preventDefault() 59 | 60 | const navigate = replace ? router.replace : router.push 61 | navigate(as || href, { scroll: scroll ?? true }) 62 | } 63 | }, 64 | [props.onClick, href, as, replace, scroll] 65 | ) 66 | 67 | return 68 | } 69 | -------------------------------------------------------------------------------- /src/browser-native-events.ts: -------------------------------------------------------------------------------- 1 | import { useEffect, useRef, useState, use } from 'react' 2 | import { usePathname } from 'next/navigation' 3 | import { useHash } from './use-hash' 4 | 5 | // TODO: This implementation might not be complete when there are nested 6 | // Suspense boundaries during a route transition. But it should work fine for 7 | // the most common use cases. 8 | 9 | export function useBrowserNativeTransitions() { 10 | const pathname = usePathname() 11 | const currentPathname = useRef(pathname) 12 | 13 | // This is a global state to keep track of the view transition state. 14 | const [currentViewTransition, setCurrentViewTransition] = useState< 15 | | null 16 | | [ 17 | // Promise to wait for the view transition to start 18 | Promise, 19 | // Resolver to finish the view transition 20 | () => void 21 | ] 22 | >(null) 23 | 24 | useEffect(() => { 25 | if (!('startViewTransition' in document)) { 26 | return () => {} 27 | } 28 | 29 | const onPopState = () => { 30 | let pendingViewTransitionResolve: () => void 31 | 32 | const pendingViewTransition = new Promise((resolve) => { 33 | pendingViewTransitionResolve = resolve 34 | }) 35 | 36 | const pendingStartViewTransition = new Promise((resolve) => { 37 | // @ts-ignore 38 | document.startViewTransition(() => { 39 | resolve() 40 | return pendingViewTransition 41 | }) 42 | }) 43 | 44 | setCurrentViewTransition([ 45 | pendingStartViewTransition, 46 | pendingViewTransitionResolve!, 47 | ]) 48 | } 49 | window.addEventListener('popstate', onPopState) 50 | 51 | return () => { 52 | window.removeEventListener('popstate', onPopState) 53 | } 54 | }, []) 55 | 56 | if (currentViewTransition && currentPathname.current !== pathname) { 57 | // Whenever the pathname changes, we block the rendering of the new route 58 | // until the view transition is started (i.e. DOM screenshotted). 59 | use(currentViewTransition[0]) 60 | } 61 | 62 | // Keep the transition reference up-to-date. 63 | const transitionRef = useRef(currentViewTransition) 64 | useEffect(() => { 65 | transitionRef.current = currentViewTransition 66 | }, [currentViewTransition]) 67 | 68 | const hash = useHash(); 69 | 70 | useEffect(() => { 71 | // When the new route component is actually mounted, we finish the view 72 | // transition. 73 | currentPathname.current = pathname 74 | if (transitionRef.current) { 75 | transitionRef.current[1]() 76 | transitionRef.current = null 77 | } 78 | }, [hash, pathname]); 79 | } 80 | -------------------------------------------------------------------------------- /example/app/style.css: -------------------------------------------------------------------------------- 1 | /** CSS Reset from https://www.joshwcomeau.com/css/custom-css-reset <3 */ 2 | *, 3 | *::before, 4 | *::after { 5 | box-sizing: border-box; 6 | } 7 | 8 | * { 9 | margin: 0; 10 | } 11 | 12 | body { 13 | line-height: 1.5; 14 | -webkit-font-smoothing: antialiased; 15 | } 16 | 17 | img, 18 | picture, 19 | video, 20 | canvas, 21 | svg { 22 | display: block; 23 | max-width: 100%; 24 | } 25 | 26 | input, 27 | button, 28 | textarea, 29 | select { 30 | font: inherit; 31 | } 32 | 33 | p, 34 | h1, 35 | h2, 36 | h3, 37 | h4, 38 | h5, 39 | h6 { 40 | overflow-wrap: break-word; 41 | } 42 | 43 | /** Styles */ 44 | body { 45 | font-family: var(--font-geist-sans), system-ui, -apple-system, 46 | BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, Noto Sans, 47 | sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, 48 | Noto Color Emoji; 49 | font-feature-settings: 'liga', 'clig', 'calt'; 50 | font-variant: common-ligatures contextual; 51 | letter-spacing: -0.01em; 52 | font-size: 15px; 53 | color: #111; 54 | background-color: #f9f9f9; 55 | padding: 2rem; 56 | line-height: 1.5; 57 | } 58 | 59 | h1 { 60 | font-size: 1.5rem; 61 | margin-bottom: 1rem; 62 | } 63 | 64 | h2 { 65 | font-size: 1.15rem; 66 | margin-top: 1.5rem; 67 | margin-bottom: 1rem; 68 | } 69 | 70 | p, 71 | pre { 72 | margin-bottom: 0.75rem; 73 | width: 600px; 74 | max-width: 100%; 75 | } 76 | 77 | a { 78 | color: #888; 79 | text-decoration: underline solid currentColor; 80 | text-underline-position: from-font; 81 | text-decoration-thickness: from-font; 82 | } 83 | 84 | a:hover { 85 | color: #333; 86 | } 87 | 88 | code { 89 | font-family: var(--font-geist-mono), menlo, 'Courier New', Courier, monospace; 90 | letter-spacing: 0; 91 | background-color: #eee; 92 | padding: 0.2em 0.3em; 93 | border-radius: 3px; 94 | font-size: 0.95em; 95 | color: #565656; 96 | } 97 | 98 | pre { 99 | display: inline-block; 100 | background-color: #eee; 101 | padding: 0.3em 0.5em; 102 | border-radius: 3px; 103 | width: 600px; 104 | max-width: 100%; 105 | white-space: pre-wrap; 106 | } 107 | 108 | pre code { 109 | padding: 0; 110 | background: none; 111 | border-radius: 0; 112 | } 113 | 114 | footer { 115 | margin-top: 2rem; 116 | padding-top: 1rem; 117 | border-top: 1px solid #ddd; 118 | width: 600px; 119 | max-width: 100%; 120 | } 121 | 122 | ul { 123 | padding-left: 1rem; 124 | } 125 | 126 | li { 127 | list-style: '• '; 128 | } 129 | 130 | .demo { 131 | view-transition-name: demo-title; 132 | width: fit-content; 133 | } 134 | 135 | .demo-box { 136 | padding: 1rem; 137 | border: 1px solid #ddd; 138 | width: 600px; 139 | max-width: 100%; 140 | border-radius: 3px; 141 | } 142 | 143 | .demo-box h2:first-child { 144 | margin-top: 0; 145 | } 146 | 147 | .container { 148 | view-transition-name: container-move; 149 | } 150 | 151 | .support span { 152 | font-size: small; 153 | padding: 4px 6px; 154 | border-radius: 8px; 155 | box-decoration-break: clone; 156 | line-height: 2; 157 | } 158 | 159 | .support .no { 160 | color: rgba(200, 0, 0, 1); 161 | background-color: rgba(200, 0, 0, 0.1); 162 | } 163 | 164 | .support .yes { 165 | display: none; 166 | color: rgb(0, 120, 0); 167 | background-color: rgba(0, 120, 0, 0.1); 168 | } 169 | 170 | @supports (view-transition-name: figure-caption) { 171 | .support .yes { 172 | display: inline; 173 | } 174 | .support .no { 175 | display: none; 176 | } 177 | } 178 | -------------------------------------------------------------------------------- /example/app/page.js: -------------------------------------------------------------------------------- 1 | 'use client' 2 | 3 | import { Link, useTransitionRouter } from 'next-view-transitions' 4 | 5 | export default function Page() { 6 | const router = useTransitionRouter() 7 | 8 | return ( 9 |
10 | 26 |

27 | Demo 28 |

29 |

30 | Go to /demo → 31 |

32 |

33 | { 35 | e.preventDefault() 36 | router.push('/demo', { 37 | // Optional custom transition 38 | onTransitionReady: slideInOut, 39 | }) 40 | }} 41 | href='/demo' 42 | > 43 | Go to /demo with custom transition → 44 | 45 |

46 |

Disclaimer

47 |

48 | This library is aimed at basic use cases of View Transitions and Next.js 49 | App Router. With more complex applications and use cases like concurrent 50 | rendering, Suspense and streaming, new primitives and APIs still need to 51 | be developed into the core of React and Next.js in the future ( 52 | 56 | more 57 | 58 | ). 59 |

60 |

Installation

61 |

62 | Use your favorite package manager to install the{' '} 63 | next-view-transitions package: 64 |

65 |

66 | pnpm install next-view-transitions 67 |

68 |

Usage

69 |

70 | Wrap your content with the <ViewTransitions>{' '} 71 | component inside the layout file: 72 |

73 |
 74 |         
 75 |           {`\
 76 | import { ViewTransitions } from 'next-view-transitions'
 77 | 
 78 | export default function Layout({ children }) {
 79 |   return (
 80 |     
 81 |       
 82 |         
 83 |           {children}
 84 |         
 85 |       
 86 |     
 87 |   )
 88 | }`}
 89 |         
 90 |       
91 |

92 | Then, use the <Link> component for links that need to 93 | trigger a view transition: 94 |

95 |
 96 |         
 97 |           {`\
 98 | import { Link } from 'next-view-transitions'
 99 | 
100 | export default function Component() {
101 |   return (
102 |     
103 | Go to /about 104 |
105 | ) 106 | }`} 107 |
108 |
109 |

110 | Or use the useTransitionRouter() hook to navigate manually: 111 |

112 |
113 |         
114 |           {`\
115 | import { useTransitionRouter } from 'next-view-transitions'
116 | 
117 | export default function Component() {
118 |   const router = useTransitionRouter()
119 |   return (
120 |     
121 | 126 |
127 | ) 128 | }`} 129 |
130 |
131 |

That’s it!

132 |
133 | ) 134 | } 135 | 136 | function slideInOut() { 137 | document.documentElement.animate( 138 | [ 139 | { 140 | opacity: 1, 141 | transform: 'translate(0, 0)', 142 | }, 143 | { 144 | opacity: 0, 145 | transform: 'translate(-100px, 0)', 146 | }, 147 | ], 148 | { 149 | duration: 400, 150 | easing: 'ease', 151 | fill: 'forwards', 152 | pseudoElement: '::view-transition-old(root)', 153 | } 154 | ) 155 | 156 | document.documentElement.animate( 157 | [ 158 | { 159 | opacity: 0, 160 | transform: 'translate(100px, 0)', 161 | }, 162 | { 163 | opacity: 1, 164 | transform: 'translate(0, 0)', 165 | }, 166 | ], 167 | { 168 | duration: 400, 169 | easing: 'ease', 170 | fill: 'forwards', 171 | pseudoElement: '::view-transition-new(root)', 172 | } 173 | ) 174 | } 175 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | devDependencies: 11 | '@types/react': 12 | specifier: ^18.2.78 13 | version: 18.2.78 14 | bunchee: 15 | specifier: ^5.1.2 16 | version: 5.1.2(typescript@5.4.5) 17 | next: 18 | specifier: ^14.2.1 19 | version: 14.2.1(react-dom@18.2.0)(react@18.2.0) 20 | react: 21 | specifier: ^18.2.0 22 | version: 18.2.0 23 | react-dom: 24 | specifier: ^18.2.0 25 | version: 18.2.0(react@18.2.0) 26 | typescript: 27 | specifier: ^5.4.5 28 | version: 5.4.5 29 | 30 | example: 31 | dependencies: 32 | geist: 33 | specifier: ^1.3.0 34 | version: 1.3.0(next@14.2.1) 35 | next: 36 | specifier: ^14.2.1 37 | version: 14.2.1(react-dom@18.2.0)(react@18.2.0) 38 | next-view-transitions: 39 | specifier: workspace:* 40 | version: link:.. 41 | react: 42 | specifier: ^18.2.0 43 | version: 18.2.0 44 | react-dom: 45 | specifier: ^18.2.0 46 | version: 18.2.0(react@18.2.0) 47 | 48 | packages: 49 | 50 | '@babel/code-frame@7.24.2': 51 | resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} 52 | engines: {node: '>=6.9.0'} 53 | 54 | '@babel/helper-validator-identifier@7.22.20': 55 | resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} 56 | engines: {node: '>=6.9.0'} 57 | 58 | '@babel/highlight@7.24.2': 59 | resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} 60 | engines: {node: '>=6.9.0'} 61 | 62 | '@fastify/deepmerge@1.3.0': 63 | resolution: {integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==} 64 | 65 | '@jridgewell/sourcemap-codec@1.4.15': 66 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} 67 | 68 | '@next/env@14.2.1': 69 | resolution: {integrity: sha512-qsHJle3GU3CmVx7pUoXcghX4sRN+vINkbLdH611T8ZlsP//grzqVW87BSUgOZeSAD4q7ZdZicdwNe/20U2janA==} 70 | 71 | '@next/swc-darwin-arm64@14.2.1': 72 | resolution: {integrity: sha512-kGjnjcIJehEcd3rT/3NAATJQndAEELk0J9GmGMXHSC75TMnvpOhONcjNHbjtcWE5HUQnIHy5JVkatrnYm1QhVw==} 73 | engines: {node: '>= 10'} 74 | cpu: [arm64] 75 | os: [darwin] 76 | 77 | '@next/swc-darwin-x64@14.2.1': 78 | resolution: {integrity: sha512-dAdWndgdQi7BK2WSXrx4lae7mYcOYjbHJUhvOUnJjMNYrmYhxbbvJ2xElZpxNxdfA6zkqagIB9He2tQk+l16ew==} 79 | engines: {node: '>= 10'} 80 | cpu: [x64] 81 | os: [darwin] 82 | 83 | '@next/swc-linux-arm64-gnu@14.2.1': 84 | resolution: {integrity: sha512-2ZctfnyFOGvTkoD6L+DtQtO3BfFz4CapoHnyLTXkOxbZkVRgg3TQBUjTD/xKrO1QWeydeo8AWfZRg8539qNKrg==} 85 | engines: {node: '>= 10'} 86 | cpu: [arm64] 87 | os: [linux] 88 | 89 | '@next/swc-linux-arm64-musl@14.2.1': 90 | resolution: {integrity: sha512-jazZXctiaanemy4r+TPIpFP36t1mMwWCKMsmrTRVChRqE6putyAxZA4PDujx0SnfvZHosjdkx9xIq9BzBB5tWg==} 91 | engines: {node: '>= 10'} 92 | cpu: [arm64] 93 | os: [linux] 94 | 95 | '@next/swc-linux-x64-gnu@14.2.1': 96 | resolution: {integrity: sha512-VjCHWCjsAzQAAo8lkBOLEIkBZFdfW+Z18qcQ056kL4KpUYc8o59JhLDCBlhg+hINQRgzQ2UPGma2AURGOH0+Qg==} 97 | engines: {node: '>= 10'} 98 | cpu: [x64] 99 | os: [linux] 100 | 101 | '@next/swc-linux-x64-musl@14.2.1': 102 | resolution: {integrity: sha512-7HZKYKvAp4nAHiHIbY04finRqjeYvkITOGOurP1aLMexIFG/1+oCnqhGogBdc4lao/lkMW1c+AkwWSzSlLasqw==} 103 | engines: {node: '>= 10'} 104 | cpu: [x64] 105 | os: [linux] 106 | 107 | '@next/swc-win32-arm64-msvc@14.2.1': 108 | resolution: {integrity: sha512-YGHklaJ/Cj/F0Xd8jxgj2p8po4JTCi6H7Z3Yics3xJhm9CPIqtl8erlpK1CLv+HInDqEWfXilqatF8YsLxxA2Q==} 109 | engines: {node: '>= 10'} 110 | cpu: [arm64] 111 | os: [win32] 112 | 113 | '@next/swc-win32-ia32-msvc@14.2.1': 114 | resolution: {integrity: sha512-o+ISKOlvU/L43ZhtAAfCjwIfcwuZstiHVXq/BDsZwGqQE0h/81td95MPHliWCnFoikzWcYqh+hz54ZB2FIT8RA==} 115 | engines: {node: '>= 10'} 116 | cpu: [ia32] 117 | os: [win32] 118 | 119 | '@next/swc-win32-x64-msvc@14.2.1': 120 | resolution: {integrity: sha512-GmRoTiLcvCLifujlisknv4zu9/C4i9r0ktsA8E51EMqJL4bD4CpO7lDYr7SrUxCR0tS4RVcrqKmCak24T0ohaw==} 121 | engines: {node: '>= 10'} 122 | cpu: [x64] 123 | os: [win32] 124 | 125 | '@rollup/plugin-commonjs@25.0.7': 126 | resolution: {integrity: sha512-nEvcR+LRjEjsaSsc4x3XZfCCvZIaSMenZu/OiwOKGN2UhQpAYI7ru7czFvyWbErlpoGjnSX3D5Ch5FcMA3kRWQ==} 127 | engines: {node: '>=14.0.0'} 128 | peerDependencies: 129 | rollup: ^2.68.0||^3.0.0||^4.0.0 130 | peerDependenciesMeta: 131 | rollup: 132 | optional: true 133 | 134 | '@rollup/plugin-json@6.1.0': 135 | resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} 136 | engines: {node: '>=14.0.0'} 137 | peerDependencies: 138 | rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 139 | peerDependenciesMeta: 140 | rollup: 141 | optional: true 142 | 143 | '@rollup/plugin-node-resolve@15.2.3': 144 | resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} 145 | engines: {node: '>=14.0.0'} 146 | peerDependencies: 147 | rollup: ^2.78.0||^3.0.0||^4.0.0 148 | peerDependenciesMeta: 149 | rollup: 150 | optional: true 151 | 152 | '@rollup/plugin-replace@5.0.5': 153 | resolution: {integrity: sha512-rYO4fOi8lMaTg/z5Jb+hKnrHHVn8j2lwkqwyS4kTRhKyWOLf2wST2sWXr4WzWiTcoHTp2sTjqUbqIj2E39slKQ==} 154 | engines: {node: '>=14.0.0'} 155 | peerDependencies: 156 | rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 157 | peerDependenciesMeta: 158 | rollup: 159 | optional: true 160 | 161 | '@rollup/plugin-wasm@6.2.2': 162 | resolution: {integrity: sha512-gpC4R1G9Ni92ZIRTexqbhX7U+9estZrbhP+9SRb0DW9xpB9g7j34r+J2hqrcW/lRI7dJaU84MxZM0Rt82tqYPQ==} 163 | engines: {node: '>=14.0.0'} 164 | peerDependencies: 165 | rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 166 | peerDependenciesMeta: 167 | rollup: 168 | optional: true 169 | 170 | '@rollup/pluginutils@5.1.0': 171 | resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} 172 | engines: {node: '>=14.0.0'} 173 | peerDependencies: 174 | rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 175 | peerDependenciesMeta: 176 | rollup: 177 | optional: true 178 | 179 | '@rollup/rollup-android-arm-eabi@4.14.2': 180 | resolution: {integrity: sha512-ahxSgCkAEk+P/AVO0vYr7DxOD3CwAQrT0Go9BJyGQ9Ef0QxVOfjDZMiF4Y2s3mLyPrjonchIMH/tbWHucJMykQ==} 181 | cpu: [arm] 182 | os: [android] 183 | 184 | '@rollup/rollup-android-arm64@4.14.2': 185 | resolution: {integrity: sha512-lAarIdxZWbFSHFSDao9+I/F5jDaKyCqAPMq5HqnfpBw8dKDiCaaqM0lq5h1pQTLeIqueeay4PieGR5jGZMWprw==} 186 | cpu: [arm64] 187 | os: [android] 188 | 189 | '@rollup/rollup-darwin-arm64@4.14.2': 190 | resolution: {integrity: sha512-SWsr8zEUk82KSqquIMgZEg2GE5mCSfr9sE/thDROkX6pb3QQWPp8Vw8zOq2GyxZ2t0XoSIUlvHDkrf5Gmf7x3Q==} 191 | cpu: [arm64] 192 | os: [darwin] 193 | 194 | '@rollup/rollup-darwin-x64@4.14.2': 195 | resolution: {integrity: sha512-o/HAIrQq0jIxJAhgtIvV5FWviYK4WB0WwV91SLUnsliw1lSAoLsmgEEgRWzDguAFeUEUUoIWXiJrPqU7vGiVkA==} 196 | cpu: [x64] 197 | os: [darwin] 198 | 199 | '@rollup/rollup-linux-arm-gnueabihf@4.14.2': 200 | resolution: {integrity: sha512-nwlJ65UY9eGq91cBi6VyDfArUJSKOYt5dJQBq8xyLhvS23qO+4Nr/RreibFHjP6t+5ap2ohZrUJcHv5zk5ju/g==} 201 | cpu: [arm] 202 | os: [linux] 203 | 204 | '@rollup/rollup-linux-arm64-gnu@4.14.2': 205 | resolution: {integrity: sha512-Pg5TxxO2IVlMj79+c/9G0LREC9SY3HM+pfAwX7zj5/cAuwrbfj2Wv9JbMHIdPCfQpYsI4g9mE+2Bw/3aeSs2rQ==} 206 | cpu: [arm64] 207 | os: [linux] 208 | 209 | '@rollup/rollup-linux-arm64-musl@4.14.2': 210 | resolution: {integrity: sha512-cAOTjGNm84gc6tS02D1EXtG7tDRsVSDTBVXOLbj31DkwfZwgTPYZ6aafSU7rD/4R2a34JOwlF9fQayuTSkoclA==} 211 | cpu: [arm64] 212 | os: [linux] 213 | 214 | '@rollup/rollup-linux-powerpc64le-gnu@4.14.2': 215 | resolution: {integrity: sha512-4RyT6v1kXb7C0fn6zV33rvaX05P0zHoNzaXI/5oFHklfKm602j+N4mn2YvoezQViRLPnxP8M1NaY4s/5kXO5cw==} 216 | cpu: [ppc64] 217 | os: [linux] 218 | 219 | '@rollup/rollup-linux-riscv64-gnu@4.14.2': 220 | resolution: {integrity: sha512-KNUH6jC/vRGAKSorySTyc/yRYlCwN/5pnMjXylfBniwtJx5O7X17KG/0efj8XM3TZU7raYRXJFFReOzNmL1n1w==} 221 | cpu: [riscv64] 222 | os: [linux] 223 | 224 | '@rollup/rollup-linux-s390x-gnu@4.14.2': 225 | resolution: {integrity: sha512-xPV4y73IBEXToNPa3h5lbgXOi/v0NcvKxU0xejiFw6DtIYQqOTMhZ2DN18/HrrP0PmiL3rGtRG9gz1QE8vFKXQ==} 226 | cpu: [s390x] 227 | os: [linux] 228 | 229 | '@rollup/rollup-linux-x64-gnu@4.14.2': 230 | resolution: {integrity: sha512-QBhtr07iFGmF9egrPOWyO5wciwgtzKkYPNLVCFZTmr4TWmY0oY2Dm/bmhHjKRwZoGiaKdNcKhFtUMBKvlchH+Q==} 231 | cpu: [x64] 232 | os: [linux] 233 | 234 | '@rollup/rollup-linux-x64-musl@4.14.2': 235 | resolution: {integrity: sha512-8zfsQRQGH23O6qazZSFY5jP5gt4cFvRuKTpuBsC1ZnSWxV8ZKQpPqOZIUtdfMOugCcBvFGRa1pDC/tkf19EgBw==} 236 | cpu: [x64] 237 | os: [linux] 238 | 239 | '@rollup/rollup-win32-arm64-msvc@4.14.2': 240 | resolution: {integrity: sha512-H4s8UjgkPnlChl6JF5empNvFHp77Jx+Wfy2EtmYPe9G22XV+PMuCinZVHurNe8ggtwoaohxARJZbaH/3xjB/FA==} 241 | cpu: [arm64] 242 | os: [win32] 243 | 244 | '@rollup/rollup-win32-ia32-msvc@4.14.2': 245 | resolution: {integrity: sha512-djqpAjm/i8erWYF0K6UY4kRO3X5+T4TypIqw60Q8MTqSBaQNpNXDhxdjpZ3ikgb+wn99svA7jxcXpiyg9MUsdw==} 246 | cpu: [ia32] 247 | os: [win32] 248 | 249 | '@rollup/rollup-win32-x64-msvc@4.14.2': 250 | resolution: {integrity: sha512-teAqzLT0yTYZa8ZP7zhFKEx4cotS8Tkk5XiqNMJhD4CpaWB1BHARE4Qy+RzwnXvSAYv+Q3jAqCVBS+PS+Yee8Q==} 251 | cpu: [x64] 252 | os: [win32] 253 | 254 | '@swc/core-darwin-arm64@1.4.13': 255 | resolution: {integrity: sha512-36P72FLpm5iq85IvoEjBvi22DiqkkEIanJ1M0E8bkxcFHUbjBrYfPY9T6cpPyK5oQqkaTBvNAc3j1BlVD6IH6w==} 256 | engines: {node: '>=10'} 257 | cpu: [arm64] 258 | os: [darwin] 259 | 260 | '@swc/core-darwin-x64@1.4.13': 261 | resolution: {integrity: sha512-ye7OgKpDdyA8AMIVVdmD1ICDaFXgoEXORnVO8bBHyul0WN71yUBZMX+YxEx2lpWtiftA2vY/1MAuOR80vHkBCw==} 262 | engines: {node: '>=10'} 263 | cpu: [x64] 264 | os: [darwin] 265 | 266 | '@swc/core-linux-arm-gnueabihf@1.4.13': 267 | resolution: {integrity: sha512-+x593Jlmu4c3lJtZUKRejWpV2MAij1Js5nmQLLdjo6ChR2D4B2rzj3iMiKn5gITew7fraF9t3fvXALdWh7HmUg==} 268 | engines: {node: '>=10'} 269 | cpu: [arm] 270 | os: [linux] 271 | 272 | '@swc/core-linux-arm64-gnu@1.4.13': 273 | resolution: {integrity: sha512-0x8OVw4dfyNerrs/9eZX9wNnmvwbwXSMCi+LbE6Xt1pXOIwvoLtFIXcV3NsrlkFboO3sr5UAQIwDxKqbIZA9pQ==} 274 | engines: {node: '>=10'} 275 | cpu: [arm64] 276 | os: [linux] 277 | 278 | '@swc/core-linux-arm64-musl@1.4.13': 279 | resolution: {integrity: sha512-Z9c4JiequtZvngPcxbCuAOkmWBxi2vInZbjjhD5I+Q9oiJdXUz1t2USGwsGPS41Xvk1BOA3ecK2Sn1ilY3titg==} 280 | engines: {node: '>=10'} 281 | cpu: [arm64] 282 | os: [linux] 283 | 284 | '@swc/core-linux-x64-gnu@1.4.13': 285 | resolution: {integrity: sha512-ChatHtk+vX0Ke5QG+jO+rIapw/KwZsi9MedCBHFXHH6iWF4z8d51cJeN68ykcn+vAXzjNeFNdlNy5Vbkd1zAqg==} 286 | engines: {node: '>=10'} 287 | cpu: [x64] 288 | os: [linux] 289 | 290 | '@swc/core-linux-x64-musl@1.4.13': 291 | resolution: {integrity: sha512-0Pz39YR530mXpsztwQkmEKdkkZy4fY4Smdh4pkm6Ly8Nndyo0te/l4bcAGqN24Jp7aVwF/QSy14SAtw4HRjU9g==} 292 | engines: {node: '>=10'} 293 | cpu: [x64] 294 | os: [linux] 295 | 296 | '@swc/core-win32-arm64-msvc@1.4.13': 297 | resolution: {integrity: sha512-LVZfhlD+jHcAbz5NN+gAJ1BEasB0WpcvUzcsJt0nQSRsojgzPzFjJ+fzEBnvT7SMtqKkrnVJ0OmDYeh88bDRpw==} 298 | engines: {node: '>=10'} 299 | cpu: [arm64] 300 | os: [win32] 301 | 302 | '@swc/core-win32-ia32-msvc@1.4.13': 303 | resolution: {integrity: sha512-78hxHWUvUZtWsnhcf8DKwhBcNFJw+j4y4fN2B9ioXmBWX2tIyw+BqUHOrismOtjPihaZmwe/Ok2e4qmkawE2fw==} 304 | engines: {node: '>=10'} 305 | cpu: [ia32] 306 | os: [win32] 307 | 308 | '@swc/core-win32-x64-msvc@1.4.13': 309 | resolution: {integrity: sha512-WSfy1u2Xde6jU7UpHIInCUMW98Zw9iZglddKUAvmr1obkZji5U6EX0Oca3asEJdZPFb+2lMLjt0Mh5a1YisROg==} 310 | engines: {node: '>=10'} 311 | cpu: [x64] 312 | os: [win32] 313 | 314 | '@swc/core@1.4.13': 315 | resolution: {integrity: sha512-rOtusBE+2gaeRkAJn5E4zp5yzZekZOypzSOz5ZG6P1hFbd+Cc26fWEdK6sUSnrkkvTd0Oj33KXLB/4UkbK/UHA==} 316 | engines: {node: '>=10'} 317 | peerDependencies: 318 | '@swc/helpers': ^0.5.0 319 | peerDependenciesMeta: 320 | '@swc/helpers': 321 | optional: true 322 | 323 | '@swc/counter@0.1.3': 324 | resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} 325 | 326 | '@swc/helpers@0.5.5': 327 | resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} 328 | 329 | '@swc/helpers@0.5.9': 330 | resolution: {integrity: sha512-XI76sLwMJoLjJTOK5RblBZkouOJG3X3hjxLCzLnyN1ifAiKQc6Hck3uvnU4Z/dV/Dyk36Ffj8FLvDLV2oWvKTw==} 331 | 332 | '@swc/types@0.1.6': 333 | resolution: {integrity: sha512-/JLo/l2JsT/LRd80C3HfbmVpxOAJ11FO2RCEslFrgzLltoP9j8XIbsyDcfCt2WWyX+CM96rBoNM+IToAkFOugg==} 334 | 335 | '@types/estree@1.0.5': 336 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} 337 | 338 | '@types/prop-types@15.7.12': 339 | resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} 340 | 341 | '@types/react@18.2.78': 342 | resolution: {integrity: sha512-qOwdPnnitQY4xKlKayt42q5W5UQrSHjgoXNVEtxeqdITJ99k4VXJOP3vt8Rkm9HmgJpH50UNU+rlqfkfWOqp0A==} 343 | 344 | '@types/resolve@1.20.2': 345 | resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} 346 | 347 | ansi-styles@3.2.1: 348 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 349 | engines: {node: '>=4'} 350 | 351 | arg@5.0.2: 352 | resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} 353 | 354 | balanced-match@1.0.2: 355 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 356 | 357 | brace-expansion@2.0.1: 358 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 359 | 360 | builtin-modules@3.3.0: 361 | resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} 362 | engines: {node: '>=6'} 363 | 364 | bunchee@5.1.2: 365 | resolution: {integrity: sha512-fOcub+z6CcCesKjVX82+B6wPTzQjtcHjrI1zcAc/acc5PRmI4fNsww7p20VxR8lctaXPrLnbuWeuhtSrZ311/Q==} 366 | engines: {node: '>= 18.0.0'} 367 | hasBin: true 368 | peerDependencies: 369 | typescript: ^4.1 || ^5.0 370 | peerDependenciesMeta: 371 | typescript: 372 | optional: true 373 | 374 | busboy@1.6.0: 375 | resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} 376 | engines: {node: '>=10.16.0'} 377 | 378 | caniuse-lite@1.0.30001609: 379 | resolution: {integrity: sha512-JFPQs34lHKx1B5t1EpQpWH4c+29zIyn/haGsbpfq3suuV9v56enjFt23zqijxGTMwy1p/4H2tjnQMY+p1WoAyA==} 380 | 381 | chalk@2.4.2: 382 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 383 | engines: {node: '>=4'} 384 | 385 | clean-css@5.3.3: 386 | resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} 387 | engines: {node: '>= 10.0'} 388 | 389 | client-only@0.0.1: 390 | resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} 391 | 392 | color-convert@1.9.3: 393 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 394 | 395 | color-name@1.1.3: 396 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 397 | 398 | commondir@1.0.1: 399 | resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} 400 | 401 | csstype@3.1.3: 402 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 403 | 404 | deepmerge@4.3.1: 405 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 406 | engines: {node: '>=0.10.0'} 407 | 408 | escape-string-regexp@1.0.5: 409 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 410 | engines: {node: '>=0.8.0'} 411 | 412 | estree-walker@2.0.2: 413 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 414 | 415 | fs.realpath@1.0.0: 416 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} 417 | 418 | fsevents@2.3.3: 419 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 420 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 421 | os: [darwin] 422 | 423 | function-bind@1.1.2: 424 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 425 | 426 | geist@1.3.0: 427 | resolution: {integrity: sha512-IoGBfcqVEYB4bEwsfHd35jF4+X9LHRPYZymHL4YOltHSs9LJa24DYs1Z7rEMQ/lsEvaAIc61Y9aUxgcJaQ8lrg==} 428 | peerDependencies: 429 | next: '>=13.2.0 <15.0.0-0' 430 | 431 | get-tsconfig@4.7.3: 432 | resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==} 433 | 434 | glob@8.1.0: 435 | resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} 436 | engines: {node: '>=12'} 437 | 438 | graceful-fs@4.2.11: 439 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 440 | 441 | has-flag@3.0.0: 442 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 443 | engines: {node: '>=4'} 444 | 445 | hasown@2.0.2: 446 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 447 | engines: {node: '>= 0.4'} 448 | 449 | inflight@1.0.6: 450 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} 451 | 452 | inherits@2.0.4: 453 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} 454 | 455 | is-builtin-module@3.2.1: 456 | resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} 457 | engines: {node: '>=6'} 458 | 459 | is-core-module@2.13.1: 460 | resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} 461 | 462 | is-module@1.0.0: 463 | resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} 464 | 465 | is-reference@1.2.1: 466 | resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} 467 | 468 | js-tokens@4.0.0: 469 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 470 | 471 | loose-envify@1.4.0: 472 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 473 | hasBin: true 474 | 475 | magic-string@0.30.9: 476 | resolution: {integrity: sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==} 477 | engines: {node: '>=12'} 478 | 479 | minimatch@5.1.6: 480 | resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} 481 | engines: {node: '>=10'} 482 | 483 | nanoid@3.3.7: 484 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 485 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 486 | hasBin: true 487 | 488 | next@14.2.1: 489 | resolution: {integrity: sha512-SF3TJnKdH43PMkCcErLPv+x/DY1YCklslk3ZmwaVoyUfDgHKexuKlf9sEfBQ69w+ue8jQ3msLb+hSj1T19hGag==} 490 | engines: {node: '>=18.17.0'} 491 | hasBin: true 492 | peerDependencies: 493 | '@opentelemetry/api': ^1.1.0 494 | '@playwright/test': ^1.41.2 495 | react: ^18.2.0 496 | react-dom: ^18.2.0 497 | sass: ^1.3.0 498 | peerDependenciesMeta: 499 | '@opentelemetry/api': 500 | optional: true 501 | '@playwright/test': 502 | optional: true 503 | sass: 504 | optional: true 505 | 506 | once@1.4.0: 507 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} 508 | 509 | path-parse@1.0.7: 510 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 511 | 512 | picocolors@1.0.0: 513 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 514 | 515 | picomatch@2.3.1: 516 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 517 | engines: {node: '>=8.6'} 518 | 519 | postcss@8.4.31: 520 | resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} 521 | engines: {node: ^10 || ^12 || >=14} 522 | 523 | pretty-bytes@5.6.0: 524 | resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} 525 | engines: {node: '>=6'} 526 | 527 | react-dom@18.2.0: 528 | resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} 529 | peerDependencies: 530 | react: ^18.2.0 531 | 532 | react@18.2.0: 533 | resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} 534 | engines: {node: '>=0.10.0'} 535 | 536 | resolve-pkg-maps@1.0.0: 537 | resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 538 | 539 | resolve@1.22.8: 540 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 541 | hasBin: true 542 | 543 | rollup-plugin-dts@6.1.0: 544 | resolution: {integrity: sha512-ijSCPICkRMDKDLBK9torss07+8dl9UpY9z1N/zTeA1cIqdzMlpkV3MOOC7zukyvQfDyxa1s3Dl2+DeiP/G6DOw==} 545 | engines: {node: '>=16'} 546 | peerDependencies: 547 | rollup: ^3.29.4 || ^4 548 | typescript: ^4.5 || ^5.0 549 | 550 | rollup-plugin-swc3@0.11.0: 551 | resolution: {integrity: sha512-luB9Ngb1YieWPpJttKvkmjN3lG5l28SmASLbf2CoScUB2+EImU0bE8wX4EYKEqv5clVulhWRQHQvE+H33X/03g==} 552 | engines: {node: '>=12'} 553 | peerDependencies: 554 | '@swc/core': '>=1.2.165' 555 | rollup: ^2.0.0 || ^3.0.0 || ^4.0.0 556 | 557 | rollup-preserve-directives@1.1.1: 558 | resolution: {integrity: sha512-+eQafbuEfDPfxQ9hQPlwaROfin4yiVRxap8hnrvvvcSGoukv1tTiYpAW9mvm3uR8J+fe4xd8FdVd5rz9q7jZ+Q==} 559 | peerDependencies: 560 | rollup: ^2.0.0 || ^3.0.0 || ^4.0.0 561 | 562 | rollup@4.14.2: 563 | resolution: {integrity: sha512-WkeoTWvuBoFjFAhsEOHKRoZ3r9GfTyhh7Vff1zwebEFLEFjT1lG3784xEgKiTa7E+e70vsC81roVL2MP4tgEEQ==} 564 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 565 | hasBin: true 566 | 567 | scheduler@0.23.0: 568 | resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} 569 | 570 | source-map-js@1.2.0: 571 | resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} 572 | engines: {node: '>=0.10.0'} 573 | 574 | source-map@0.6.1: 575 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 576 | engines: {node: '>=0.10.0'} 577 | 578 | streamsearch@1.1.0: 579 | resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} 580 | engines: {node: '>=10.0.0'} 581 | 582 | styled-jsx@5.1.1: 583 | resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} 584 | engines: {node: '>= 12.0.0'} 585 | peerDependencies: 586 | '@babel/core': '*' 587 | babel-plugin-macros: '*' 588 | react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' 589 | peerDependenciesMeta: 590 | '@babel/core': 591 | optional: true 592 | babel-plugin-macros: 593 | optional: true 594 | 595 | supports-color@5.5.0: 596 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 597 | engines: {node: '>=4'} 598 | 599 | supports-preserve-symlinks-flag@1.0.0: 600 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 601 | engines: {node: '>= 0.4'} 602 | 603 | tslib@2.6.2: 604 | resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} 605 | 606 | typescript@5.4.5: 607 | resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} 608 | engines: {node: '>=14.17'} 609 | hasBin: true 610 | 611 | wrappy@1.0.2: 612 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} 613 | 614 | snapshots: 615 | 616 | '@babel/code-frame@7.24.2': 617 | dependencies: 618 | '@babel/highlight': 7.24.2 619 | picocolors: 1.0.0 620 | optional: true 621 | 622 | '@babel/helper-validator-identifier@7.22.20': 623 | optional: true 624 | 625 | '@babel/highlight@7.24.2': 626 | dependencies: 627 | '@babel/helper-validator-identifier': 7.22.20 628 | chalk: 2.4.2 629 | js-tokens: 4.0.0 630 | picocolors: 1.0.0 631 | optional: true 632 | 633 | '@fastify/deepmerge@1.3.0': {} 634 | 635 | '@jridgewell/sourcemap-codec@1.4.15': {} 636 | 637 | '@next/env@14.2.1': {} 638 | 639 | '@next/swc-darwin-arm64@14.2.1': 640 | optional: true 641 | 642 | '@next/swc-darwin-x64@14.2.1': 643 | optional: true 644 | 645 | '@next/swc-linux-arm64-gnu@14.2.1': 646 | optional: true 647 | 648 | '@next/swc-linux-arm64-musl@14.2.1': 649 | optional: true 650 | 651 | '@next/swc-linux-x64-gnu@14.2.1': 652 | optional: true 653 | 654 | '@next/swc-linux-x64-musl@14.2.1': 655 | optional: true 656 | 657 | '@next/swc-win32-arm64-msvc@14.2.1': 658 | optional: true 659 | 660 | '@next/swc-win32-ia32-msvc@14.2.1': 661 | optional: true 662 | 663 | '@next/swc-win32-x64-msvc@14.2.1': 664 | optional: true 665 | 666 | '@rollup/plugin-commonjs@25.0.7(rollup@4.14.2)': 667 | dependencies: 668 | '@rollup/pluginutils': 5.1.0(rollup@4.14.2) 669 | commondir: 1.0.1 670 | estree-walker: 2.0.2 671 | glob: 8.1.0 672 | is-reference: 1.2.1 673 | magic-string: 0.30.9 674 | rollup: 4.14.2 675 | 676 | '@rollup/plugin-json@6.1.0(rollup@4.14.2)': 677 | dependencies: 678 | '@rollup/pluginutils': 5.1.0(rollup@4.14.2) 679 | rollup: 4.14.2 680 | 681 | '@rollup/plugin-node-resolve@15.2.3(rollup@4.14.2)': 682 | dependencies: 683 | '@rollup/pluginutils': 5.1.0(rollup@4.14.2) 684 | '@types/resolve': 1.20.2 685 | deepmerge: 4.3.1 686 | is-builtin-module: 3.2.1 687 | is-module: 1.0.0 688 | resolve: 1.22.8 689 | rollup: 4.14.2 690 | 691 | '@rollup/plugin-replace@5.0.5(rollup@4.14.2)': 692 | dependencies: 693 | '@rollup/pluginutils': 5.1.0(rollup@4.14.2) 694 | magic-string: 0.30.9 695 | rollup: 4.14.2 696 | 697 | '@rollup/plugin-wasm@6.2.2(rollup@4.14.2)': 698 | dependencies: 699 | '@rollup/pluginutils': 5.1.0(rollup@4.14.2) 700 | rollup: 4.14.2 701 | 702 | '@rollup/pluginutils@5.1.0(rollup@4.14.2)': 703 | dependencies: 704 | '@types/estree': 1.0.5 705 | estree-walker: 2.0.2 706 | picomatch: 2.3.1 707 | rollup: 4.14.2 708 | 709 | '@rollup/rollup-android-arm-eabi@4.14.2': 710 | optional: true 711 | 712 | '@rollup/rollup-android-arm64@4.14.2': 713 | optional: true 714 | 715 | '@rollup/rollup-darwin-arm64@4.14.2': 716 | optional: true 717 | 718 | '@rollup/rollup-darwin-x64@4.14.2': 719 | optional: true 720 | 721 | '@rollup/rollup-linux-arm-gnueabihf@4.14.2': 722 | optional: true 723 | 724 | '@rollup/rollup-linux-arm64-gnu@4.14.2': 725 | optional: true 726 | 727 | '@rollup/rollup-linux-arm64-musl@4.14.2': 728 | optional: true 729 | 730 | '@rollup/rollup-linux-powerpc64le-gnu@4.14.2': 731 | optional: true 732 | 733 | '@rollup/rollup-linux-riscv64-gnu@4.14.2': 734 | optional: true 735 | 736 | '@rollup/rollup-linux-s390x-gnu@4.14.2': 737 | optional: true 738 | 739 | '@rollup/rollup-linux-x64-gnu@4.14.2': 740 | optional: true 741 | 742 | '@rollup/rollup-linux-x64-musl@4.14.2': 743 | optional: true 744 | 745 | '@rollup/rollup-win32-arm64-msvc@4.14.2': 746 | optional: true 747 | 748 | '@rollup/rollup-win32-ia32-msvc@4.14.2': 749 | optional: true 750 | 751 | '@rollup/rollup-win32-x64-msvc@4.14.2': 752 | optional: true 753 | 754 | '@swc/core-darwin-arm64@1.4.13': 755 | optional: true 756 | 757 | '@swc/core-darwin-x64@1.4.13': 758 | optional: true 759 | 760 | '@swc/core-linux-arm-gnueabihf@1.4.13': 761 | optional: true 762 | 763 | '@swc/core-linux-arm64-gnu@1.4.13': 764 | optional: true 765 | 766 | '@swc/core-linux-arm64-musl@1.4.13': 767 | optional: true 768 | 769 | '@swc/core-linux-x64-gnu@1.4.13': 770 | optional: true 771 | 772 | '@swc/core-linux-x64-musl@1.4.13': 773 | optional: true 774 | 775 | '@swc/core-win32-arm64-msvc@1.4.13': 776 | optional: true 777 | 778 | '@swc/core-win32-ia32-msvc@1.4.13': 779 | optional: true 780 | 781 | '@swc/core-win32-x64-msvc@1.4.13': 782 | optional: true 783 | 784 | '@swc/core@1.4.13(@swc/helpers@0.5.9)': 785 | dependencies: 786 | '@swc/counter': 0.1.3 787 | '@swc/helpers': 0.5.9 788 | '@swc/types': 0.1.6 789 | optionalDependencies: 790 | '@swc/core-darwin-arm64': 1.4.13 791 | '@swc/core-darwin-x64': 1.4.13 792 | '@swc/core-linux-arm-gnueabihf': 1.4.13 793 | '@swc/core-linux-arm64-gnu': 1.4.13 794 | '@swc/core-linux-arm64-musl': 1.4.13 795 | '@swc/core-linux-x64-gnu': 1.4.13 796 | '@swc/core-linux-x64-musl': 1.4.13 797 | '@swc/core-win32-arm64-msvc': 1.4.13 798 | '@swc/core-win32-ia32-msvc': 1.4.13 799 | '@swc/core-win32-x64-msvc': 1.4.13 800 | 801 | '@swc/counter@0.1.3': {} 802 | 803 | '@swc/helpers@0.5.5': 804 | dependencies: 805 | '@swc/counter': 0.1.3 806 | tslib: 2.6.2 807 | 808 | '@swc/helpers@0.5.9': 809 | dependencies: 810 | tslib: 2.6.2 811 | 812 | '@swc/types@0.1.6': 813 | dependencies: 814 | '@swc/counter': 0.1.3 815 | 816 | '@types/estree@1.0.5': {} 817 | 818 | '@types/prop-types@15.7.12': {} 819 | 820 | '@types/react@18.2.78': 821 | dependencies: 822 | '@types/prop-types': 15.7.12 823 | csstype: 3.1.3 824 | 825 | '@types/resolve@1.20.2': {} 826 | 827 | ansi-styles@3.2.1: 828 | dependencies: 829 | color-convert: 1.9.3 830 | optional: true 831 | 832 | arg@5.0.2: {} 833 | 834 | balanced-match@1.0.2: {} 835 | 836 | brace-expansion@2.0.1: 837 | dependencies: 838 | balanced-match: 1.0.2 839 | 840 | builtin-modules@3.3.0: {} 841 | 842 | bunchee@5.1.2(typescript@5.4.5): 843 | dependencies: 844 | '@rollup/plugin-commonjs': 25.0.7(rollup@4.14.2) 845 | '@rollup/plugin-json': 6.1.0(rollup@4.14.2) 846 | '@rollup/plugin-node-resolve': 15.2.3(rollup@4.14.2) 847 | '@rollup/plugin-replace': 5.0.5(rollup@4.14.2) 848 | '@rollup/plugin-wasm': 6.2.2(rollup@4.14.2) 849 | '@rollup/pluginutils': 5.1.0(rollup@4.14.2) 850 | '@swc/core': 1.4.13(@swc/helpers@0.5.9) 851 | '@swc/helpers': 0.5.9 852 | arg: 5.0.2 853 | clean-css: 5.3.3 854 | magic-string: 0.30.9 855 | pretty-bytes: 5.6.0 856 | rollup: 4.14.2 857 | rollup-plugin-dts: 6.1.0(rollup@4.14.2)(typescript@5.4.5) 858 | rollup-plugin-swc3: 0.11.0(@swc/core@1.4.13)(rollup@4.14.2) 859 | rollup-preserve-directives: 1.1.1(rollup@4.14.2) 860 | tslib: 2.6.2 861 | typescript: 5.4.5 862 | 863 | busboy@1.6.0: 864 | dependencies: 865 | streamsearch: 1.1.0 866 | 867 | caniuse-lite@1.0.30001609: {} 868 | 869 | chalk@2.4.2: 870 | dependencies: 871 | ansi-styles: 3.2.1 872 | escape-string-regexp: 1.0.5 873 | supports-color: 5.5.0 874 | optional: true 875 | 876 | clean-css@5.3.3: 877 | dependencies: 878 | source-map: 0.6.1 879 | 880 | client-only@0.0.1: {} 881 | 882 | color-convert@1.9.3: 883 | dependencies: 884 | color-name: 1.1.3 885 | optional: true 886 | 887 | color-name@1.1.3: 888 | optional: true 889 | 890 | commondir@1.0.1: {} 891 | 892 | csstype@3.1.3: {} 893 | 894 | deepmerge@4.3.1: {} 895 | 896 | escape-string-regexp@1.0.5: 897 | optional: true 898 | 899 | estree-walker@2.0.2: {} 900 | 901 | fs.realpath@1.0.0: {} 902 | 903 | fsevents@2.3.3: 904 | optional: true 905 | 906 | function-bind@1.1.2: {} 907 | 908 | geist@1.3.0(next@14.2.1): 909 | dependencies: 910 | next: 14.2.1(react-dom@18.2.0)(react@18.2.0) 911 | 912 | get-tsconfig@4.7.3: 913 | dependencies: 914 | resolve-pkg-maps: 1.0.0 915 | 916 | glob@8.1.0: 917 | dependencies: 918 | fs.realpath: 1.0.0 919 | inflight: 1.0.6 920 | inherits: 2.0.4 921 | minimatch: 5.1.6 922 | once: 1.4.0 923 | 924 | graceful-fs@4.2.11: {} 925 | 926 | has-flag@3.0.0: 927 | optional: true 928 | 929 | hasown@2.0.2: 930 | dependencies: 931 | function-bind: 1.1.2 932 | 933 | inflight@1.0.6: 934 | dependencies: 935 | once: 1.4.0 936 | wrappy: 1.0.2 937 | 938 | inherits@2.0.4: {} 939 | 940 | is-builtin-module@3.2.1: 941 | dependencies: 942 | builtin-modules: 3.3.0 943 | 944 | is-core-module@2.13.1: 945 | dependencies: 946 | hasown: 2.0.2 947 | 948 | is-module@1.0.0: {} 949 | 950 | is-reference@1.2.1: 951 | dependencies: 952 | '@types/estree': 1.0.5 953 | 954 | js-tokens@4.0.0: {} 955 | 956 | loose-envify@1.4.0: 957 | dependencies: 958 | js-tokens: 4.0.0 959 | 960 | magic-string@0.30.9: 961 | dependencies: 962 | '@jridgewell/sourcemap-codec': 1.4.15 963 | 964 | minimatch@5.1.6: 965 | dependencies: 966 | brace-expansion: 2.0.1 967 | 968 | nanoid@3.3.7: {} 969 | 970 | next@14.2.1(react-dom@18.2.0)(react@18.2.0): 971 | dependencies: 972 | '@next/env': 14.2.1 973 | '@swc/helpers': 0.5.5 974 | busboy: 1.6.0 975 | caniuse-lite: 1.0.30001609 976 | graceful-fs: 4.2.11 977 | postcss: 8.4.31 978 | react: 18.2.0 979 | react-dom: 18.2.0(react@18.2.0) 980 | styled-jsx: 5.1.1(react@18.2.0) 981 | optionalDependencies: 982 | '@next/swc-darwin-arm64': 14.2.1 983 | '@next/swc-darwin-x64': 14.2.1 984 | '@next/swc-linux-arm64-gnu': 14.2.1 985 | '@next/swc-linux-arm64-musl': 14.2.1 986 | '@next/swc-linux-x64-gnu': 14.2.1 987 | '@next/swc-linux-x64-musl': 14.2.1 988 | '@next/swc-win32-arm64-msvc': 14.2.1 989 | '@next/swc-win32-ia32-msvc': 14.2.1 990 | '@next/swc-win32-x64-msvc': 14.2.1 991 | transitivePeerDependencies: 992 | - '@babel/core' 993 | - babel-plugin-macros 994 | 995 | once@1.4.0: 996 | dependencies: 997 | wrappy: 1.0.2 998 | 999 | path-parse@1.0.7: {} 1000 | 1001 | picocolors@1.0.0: {} 1002 | 1003 | picomatch@2.3.1: {} 1004 | 1005 | postcss@8.4.31: 1006 | dependencies: 1007 | nanoid: 3.3.7 1008 | picocolors: 1.0.0 1009 | source-map-js: 1.2.0 1010 | 1011 | pretty-bytes@5.6.0: {} 1012 | 1013 | react-dom@18.2.0(react@18.2.0): 1014 | dependencies: 1015 | loose-envify: 1.4.0 1016 | react: 18.2.0 1017 | scheduler: 0.23.0 1018 | 1019 | react@18.2.0: 1020 | dependencies: 1021 | loose-envify: 1.4.0 1022 | 1023 | resolve-pkg-maps@1.0.0: {} 1024 | 1025 | resolve@1.22.8: 1026 | dependencies: 1027 | is-core-module: 2.13.1 1028 | path-parse: 1.0.7 1029 | supports-preserve-symlinks-flag: 1.0.0 1030 | 1031 | rollup-plugin-dts@6.1.0(rollup@4.14.2)(typescript@5.4.5): 1032 | dependencies: 1033 | magic-string: 0.30.9 1034 | rollup: 4.14.2 1035 | typescript: 5.4.5 1036 | optionalDependencies: 1037 | '@babel/code-frame': 7.24.2 1038 | 1039 | rollup-plugin-swc3@0.11.0(@swc/core@1.4.13)(rollup@4.14.2): 1040 | dependencies: 1041 | '@fastify/deepmerge': 1.3.0 1042 | '@rollup/pluginutils': 5.1.0(rollup@4.14.2) 1043 | '@swc/core': 1.4.13(@swc/helpers@0.5.9) 1044 | get-tsconfig: 4.7.3 1045 | rollup: 4.14.2 1046 | rollup-preserve-directives: 1.1.1(rollup@4.14.2) 1047 | 1048 | rollup-preserve-directives@1.1.1(rollup@4.14.2): 1049 | dependencies: 1050 | magic-string: 0.30.9 1051 | rollup: 4.14.2 1052 | 1053 | rollup@4.14.2: 1054 | dependencies: 1055 | '@types/estree': 1.0.5 1056 | optionalDependencies: 1057 | '@rollup/rollup-android-arm-eabi': 4.14.2 1058 | '@rollup/rollup-android-arm64': 4.14.2 1059 | '@rollup/rollup-darwin-arm64': 4.14.2 1060 | '@rollup/rollup-darwin-x64': 4.14.2 1061 | '@rollup/rollup-linux-arm-gnueabihf': 4.14.2 1062 | '@rollup/rollup-linux-arm64-gnu': 4.14.2 1063 | '@rollup/rollup-linux-arm64-musl': 4.14.2 1064 | '@rollup/rollup-linux-powerpc64le-gnu': 4.14.2 1065 | '@rollup/rollup-linux-riscv64-gnu': 4.14.2 1066 | '@rollup/rollup-linux-s390x-gnu': 4.14.2 1067 | '@rollup/rollup-linux-x64-gnu': 4.14.2 1068 | '@rollup/rollup-linux-x64-musl': 4.14.2 1069 | '@rollup/rollup-win32-arm64-msvc': 4.14.2 1070 | '@rollup/rollup-win32-ia32-msvc': 4.14.2 1071 | '@rollup/rollup-win32-x64-msvc': 4.14.2 1072 | fsevents: 2.3.3 1073 | 1074 | scheduler@0.23.0: 1075 | dependencies: 1076 | loose-envify: 1.4.0 1077 | 1078 | source-map-js@1.2.0: {} 1079 | 1080 | source-map@0.6.1: {} 1081 | 1082 | streamsearch@1.1.0: {} 1083 | 1084 | styled-jsx@5.1.1(react@18.2.0): 1085 | dependencies: 1086 | client-only: 0.0.1 1087 | react: 18.2.0 1088 | 1089 | supports-color@5.5.0: 1090 | dependencies: 1091 | has-flag: 3.0.0 1092 | optional: true 1093 | 1094 | supports-preserve-symlinks-flag@1.0.0: {} 1095 | 1096 | tslib@2.6.2: {} 1097 | 1098 | typescript@5.4.5: {} 1099 | 1100 | wrappy@1.0.2: {} 1101 | --------------------------------------------------------------------------------