├── .gitignore ├── .npmignore ├── .vscode └── settings.json ├── LICENSE ├── README.md ├── example ├── .prettierrc ├── app │ ├── demo │ │ └── page.tsx │ ├── icon.svg │ ├── layout.tsx │ ├── opengraph-image.jpg │ ├── page.tsx │ ├── providers.tsx │ ├── styles.css │ ├── twitter-image.jpg │ └── utils.ts ├── assets │ ├── fonts │ │ ├── NeueMontreal-Italic.woff2 │ │ ├── NeueMontreal-Medium.woff2 │ │ ├── NeueMontreal-MediumItalic.woff2 │ │ └── NeueMontreal-Regular.woff2 │ └── image.jpg ├── components │ ├── back.tsx │ ├── button.tsx │ ├── debug.tsx │ ├── header.tsx │ ├── programmatic.tsx │ ├── reveal.tsx │ └── title.tsx ├── next-env.d.ts ├── package.json ├── postcss.config.js ├── tailwind.config.ts └── tsconfig.json ├── package.json ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── src ├── context.tsx ├── index.ts ├── link.tsx ├── router.tsx └── utils.ts └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | dist 2 | node_modules 3 | .next 4 | .DS_Store -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | example 2 | .vscode 3 | node_modules 4 | .DS_Store -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "editor.formatOnSave": true, 3 | "[markdown]": { 4 | "editor.formatOnSave": false 5 | }, 6 | "files.associations": { 7 | "*.css": "tailwindcss" 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Ismael Martínez 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. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 | next-transition-router 3 |

next-transition-router

4 |
5 | 6 | Easily add animated transitions between pages using Next.js App Router and your favorite animation library. 7 | 8 | - [**Live Demo using GSAP**](https://next-transition-router.vercel.app) (source code: [/example](/example)). 9 | - [**Stackblitz Demo using Framer Motion**](https://stackblitz.com/edit/next-transition-router-framer-motion). 10 | 11 | ## Features 12 | 13 | - Automatically detect internal links to handle page transitions ([optional `auto` flag](#auto-enabled)). 14 | - Use a custom `Link` component to manually handle page transitions ([when `auto` is disabled](#handle-links-custom-link-component-vs-auto-detection)). 15 | - Exclusively to be used with [Next.js App Router](https://nextjs.org/docs/app) (v14.0.0 or higher). 16 | - Quickly add animated transitions between pages using JavaScript or CSS. 17 | - Integrate seamlessly with [GSAP](https://gsap.com/resources/React/) or any other animation library of your choice (see [minimal GSAP example](#minimal-example-using-gsap)). 18 | - If JavaScript is disabled, the router's accessibility is not compromised. 19 | - It's really lightweight; the bundle size is less than 8 KB. 20 | - Focused on customizable animations, not targeting the [View Transitions API](https://developer.mozilla.org/en-US/docs/Web/API/View_Transitions_API). 21 | 22 | If you're looking to use the View Transitions API, check [next-view-transitions](https://github.com/shuding/next-view-transitions). 23 | 24 | > [!WARNING] 25 | > This project is currently in Beta. Please note that the API may change as features are enhanced and refined. 26 | 27 | ## Installation 28 | 29 | Install the package using your preferred package manager: 30 | 31 | ```sh 32 | pnpm add next-transition-router 33 | ``` 34 | 35 | ```sh 36 | yarn add next-transition-router 37 | ``` 38 | 39 | ```sh 40 | npm install next-transition-router 41 | ``` 42 | 43 | ```sh 44 | bun add next-transition-router 45 | ``` 46 | 47 | ## Usage 48 | 49 | ### `TransitionRouter` 50 | 51 | Create a client component (e.g.: `app/providers.tsx`) to use the `TransitionRouter` provider: 52 | 53 | ```tsx 54 | "use client"; 55 | 56 | import { TransitionRouter } from "next-transition-router"; 57 | 58 | export function Providers({ children }: { children: React.ReactNode }) { 59 | return ( 60 | { 62 | someAnimation().then(next); 63 | }} 64 | enter={(next) => { 65 | anotherAnimation().then(next); 66 | }} 67 | > 68 | {children} 69 | 70 | ); 71 | } 72 | ``` 73 | 74 | > [!NOTE] 75 | > It should be a client component because you have to pass DOM functions as props to the provider. 76 | 77 | After that, you should import that component in the layout component (e.g.: `app/layout.tsx`). 78 | 79 | #### Async Callbacks 80 | 81 | The `leave` and `enter` callbacks support async functions. 82 | 83 | ```tsx 84 | "use client"; 85 | 86 | import { TransitionRouter } from "next-transition-router"; 87 | 88 | export function Providers({ children }: { children: React.ReactNode }) { 89 | return ( 90 | { 92 | await someAsyncAnimation(); 93 | next(); 94 | }} 95 | enter={async (next) => { 96 | await anotherAsyncAnimation(); 97 | next(); 98 | }} 99 | > 100 | {children} 101 | 102 | ); 103 | } 104 | ``` 105 | 106 | #### `from` and `to` parameters for `leave` callback 107 | 108 | The `leave` callback receives the `from` and `to` parameters, which are strings with the previous and next page paths. Useful if you want to animate the transition conditionally based on the page. 109 | 110 | ```tsx 111 | const onLeave = (next, from, to) => { 112 | someAnimation(from, to).then(next); 113 | }; 114 | ``` 115 | 116 | > [!NOTE] 117 | > When using `router.back()` method, the `to` parameter will be undefined. See [programmatic navigation](#programmatic-navigation). 118 | 119 | ### Handling links (custom `Link` component vs auto-detection) 120 | 121 | To determine how to handle links, `TransitionRouter` can receive an `auto` prop (`boolean`). 122 | 123 | #### `auto` disabled (default) 124 | 125 | Use the custom `Link` component instead of the native [`Link` component from Next.js](https://nextjs.org/docs/app/api-reference/components/link) to trigger transitions. 126 | 127 | ```tsx 128 | import { Link } from "next-transition-router"; 129 | 130 | export function Example() { 131 | return About; 132 | } 133 | ``` 134 | 135 | > [!TIP] 136 | > Use `import { Link as TransitionLink } from "next-transition-router"` to avoid naming conflicts. 137 | 138 | #### `auto` enabled 139 | 140 | When `auto` is enabled, the `TransitionRouter` intercepts click events on internal links, except anchor links, and triggers page transitions. In this case you don't need to use the custom `Link` component. 141 | 142 | To ignore a link in this mode, simply add the `data-transition-ignore` attribute to the link. 143 | 144 | ### Programmatic navigation 145 | 146 | Use the `useTransitionRouter` hook to manage navigation (`push`, `replace`, `back`). 147 | 148 | It's similar to [Next.js `useRouter`](https://nextjs.org/docs/app/api-reference/functions/use-router) with added transition support. 149 | 150 | ```tsx 151 | "use client"; 152 | 153 | import { useTransitionRouter } from "next-transition-router"; 154 | 155 | export function Programmatic() { 156 | const router = useTransitionRouter(); 157 | 158 | return ( 159 | 167 | ); 168 | } 169 | ``` 170 | 171 | > [!IMPORTANT] 172 | > Back and Forward browser navigation doesn't trigger page transitions, and [this is intentional](https://github.com/ismamz/next-transition-router/issues/2). 173 | 174 | ### Transition state 175 | 176 | Use the `useTransitionState` hook to determine the current stage of the transition. 177 | 178 | Possible `stage` values: `'entering' | 'leaving' | 'none'`. 179 | 180 | Aditionally, you have the `isReady` state (`boolean`). 181 | 182 | ```tsx 183 | "use client"; 184 | 185 | import { useTransitionState } from "next-transition-router"; 186 | 187 | export function Example() { 188 | const { stage, isReady } = useTransitionState(); 189 | 190 | return ( 191 |
192 |

Current stage: {stage}

193 |

Page ready: {isReady ? "Yes" : "No"}

194 |
195 | ); 196 | } 197 | ``` 198 | 199 | > [!TIP] 200 | > This is useful, for example, if you want to trigger a reveal animation after the page transition ends. 201 | 202 | ### Cleanup 203 | 204 | `TransitionRouter` manages cleanup functions for `leave` and `enter` callbacks, to prevent memory leaks. 205 | 206 | Similar to React's `useEffect` hook, you can return a cleanup function to cancel the animation. 207 | 208 | #### Minimal example using GSAP 209 | 210 | ```tsx 211 | "use client"; 212 | 213 | import { gsap } from "gsap"; 214 | import { TransitionRouter } from "next-transition-router"; 215 | 216 | export function Providers({ children }: { children: React.ReactNode }) { 217 | return ( 218 | { 220 | const tween = gsap.fromTo("main", { autoAlpha: 1 }, { autoAlpha: 0, onComplete: next }); 221 | return () => tween.kill(); 222 | }} 223 | enter={(next) => { 224 | const tween = gsap.fromTo("main", { autoAlpha: 0 }, { autoAlpha: 1, onComplete: next }); 225 | return () => tween.kill(); 226 | }} 227 | > 228 | {children} 229 | 230 | ); 231 | } 232 | ``` 233 | 234 | ## API 235 | 236 | ### `TransitionRouter` 237 | 238 | | Prop | Type | Default Value | Description | 239 | | ---------- | ---------- | ---------------- | ------------------------------------------------- | 240 | | `leave` | `function` | `next => next()` | Function to handle the leaving animation | 241 | | `enter` | `function` | `next => next()` | Function to handle the entering animation | 242 | | `auto` | `boolean` | `false` | Flag to enable/disable auto-detection of links | 243 | 244 | ### `useTransitionState` 245 | 246 | | Property | Type | Description | 247 | |-----------|-------------------------------------|----------------------------------------------------| 248 | | `stage` | `'entering' \| 'leaving' \| 'none'` | Indicates the current stage of the transition. | 249 | | `isReady` | `boolean` | Indicates if the new page is ready to be animated. | 250 | 251 | ## Disclaimer 252 | 253 | This package may not cover every use case. If you require a specific scenario, please [open an issue](https://github.com/ismamz/next-transition-router/issues/new/choose), and we can explore the possibility of extending the functionality. 254 | 255 | ## License 256 | 257 | MIT. -------------------------------------------------------------------------------- /example/.prettierrc: -------------------------------------------------------------------------------- 1 | { "plugins": ["prettier-plugin-tailwindcss"] } 2 | -------------------------------------------------------------------------------- /example/app/demo/page.tsx: -------------------------------------------------------------------------------- 1 | import Image from "next/image"; 2 | import { ButtonLink } from "@/components/button"; 3 | import { Title } from "@/components/title"; 4 | import { Reveal } from "@/components/reveal"; 5 | import demoImage from "@/assets/image.jpg"; 6 | import Link from "next/link"; 7 | import { Link as TransitionLink } from "next-transition-router"; 8 | 9 | export default function DemoPage() { 10 | return ( 11 | <> 12 |
13 | 14 | <div className="overflow-hidden px-2"> 15 | <span className="block">Make the</span> 16 | </div> 17 | <div className="overflow-hidden px-2"> 18 | <span className="block"> 19 | <em>Transition</em> 20 | </span> 21 | </div> 22 | 23 | 24 |
25 | 26 | Back 27 | 28 |
29 |
30 | 31 | 32 | 38 | 39 | 40 |
41 |
42 | 47 | same pathname 48 | 49 | 54 | same pathname with hash 55 | 56 | 61 | simple custom link 62 | 63 | 71 | url object 72 | 73 |
74 |
75 | 76 |
77 |

78 | 79 | top ↑ (#) 80 | 81 | 82 | top ↑ (/demo#) 83 | 84 |

85 |
86 | 87 | ); 88 | } 89 | -------------------------------------------------------------------------------- /example/app/icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /example/app/layout.tsx: -------------------------------------------------------------------------------- 1 | import localFont from "next/font/local"; 2 | import { Header } from "@/components/header"; 3 | import { Debug } from "@/components/debug"; 4 | import { Providers } from "./providers"; 5 | import "./styles.css"; 6 | 7 | const primaryFont = localFont({ 8 | variable: "--font-primary", 9 | preload: true, 10 | src: [ 11 | { 12 | path: "../assets/fonts/NeueMontreal-Regular.woff2", 13 | weight: "normal", 14 | style: "normal", 15 | }, 16 | { 17 | path: "../assets/fonts/NeueMontreal-Italic.woff2", 18 | weight: "normal", 19 | style: "italic", 20 | }, 21 | { 22 | path: "../assets/fonts/NeueMontreal-Medium.woff2", 23 | weight: "500", 24 | style: "normal", 25 | }, 26 | { 27 | path: "../assets/fonts/NeueMontreal-MediumItalic.woff2", 28 | weight: "500", 29 | style: "italic", 30 | }, 31 | ], 32 | }); 33 | 34 | export const metadata = { 35 | title: "Transition Router - page transitions in Next.js App Router", 36 | description: 37 | "Easily add animated transitions between pages using Next.js App Router and your favorite animation library.", 38 | }; 39 | 40 | export default function RootLayout({ 41 | children, 42 | }: { 43 | children: React.ReactNode; 44 | }) { 45 | return ( 46 | 47 | 48 | 49 |
50 | {children} 51 | 52 | 53 | 54 | 55 | ); 56 | } 57 | -------------------------------------------------------------------------------- /example/app/opengraph-image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ismamz/next-transition-router/72661087b4069f33dac298b16adca0a160152409/example/app/opengraph-image.jpg -------------------------------------------------------------------------------- /example/app/page.tsx: -------------------------------------------------------------------------------- 1 | import Link from "next/link"; 2 | import Image from "next/image"; 3 | import { Link as TransitionLink } from "next-transition-router"; 4 | import { ButtonLink } from "@/components/button"; 5 | import { Title } from "@/components/title"; 6 | import { Programmatic } from "@/components/programmatic"; 7 | import { Reveal } from "@/components/reveal"; 8 | import { Back } from "@/components/back"; 9 | import demoImage from "@/assets/image.jpg"; 10 | 11 | export default function HomePage() { 12 | return ( 13 | <> 14 |
15 | 16 | <div className="overflow-hidden px-2"> 17 | <span className="block">Next.js — </span> 18 | </div> 19 | <div className="overflow-hidden px-2"> 20 | <span className="block"> 21 | <em>Transition </em> 22 | </span> 23 | </div> 24 | <div className="overflow-hidden px-2"> 25 | <span className="block">Router</span> 26 | </div> 27 | 28 | 29 |
30 | 31 | 39 | 40 | 41 | 45 | Navigate 46 | 47 |
48 |
49 | 50 |
51 | 52 | Demo{" "} 53 | 54 | 55 | 60 | ignore 61 | 62 | 63 | 68 | custom link 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | hash 77 | 78 | 79 | 87 | url object 88 | 89 |
90 | 91 | ); 92 | } 93 | -------------------------------------------------------------------------------- /example/app/providers.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { useRef } from "react"; 4 | import { gsap } from "gsap"; 5 | import { TransitionRouter } from "next-transition-router"; 6 | 7 | export function Providers({ children }: { children: React.ReactNode }) { 8 | const firstLayer = useRef(null); 9 | const secondLayer = useRef(null); 10 | 11 | return ( 12 | { 15 | console.log({ from, to }); 16 | 17 | const tl = gsap 18 | .timeline({ 19 | onComplete: next, 20 | }) 21 | .fromTo( 22 | firstLayer.current, 23 | { y: "100%" }, 24 | { 25 | y: 0, 26 | duration: 0.5, 27 | ease: "circ.inOut", 28 | }, 29 | ) 30 | .fromTo( 31 | secondLayer.current, 32 | { 33 | y: "100%", 34 | }, 35 | { 36 | y: 0, 37 | duration: 0.5, 38 | ease: "circ.inOut", 39 | }, 40 | "<50%", 41 | ); 42 | 43 | return () => { 44 | tl.kill(); 45 | }; 46 | }} 47 | enter={(next) => { 48 | const tl = gsap 49 | .timeline() 50 | .fromTo( 51 | secondLayer.current, 52 | { y: 0 }, 53 | { 54 | y: "-100%", 55 | duration: 0.5, 56 | ease: "circ.inOut", 57 | }, 58 | ) 59 | .fromTo( 60 | firstLayer.current, 61 | { y: 0 }, 62 | { 63 | y: "-100%", 64 | duration: 0.5, 65 | ease: "circ.inOut", 66 | }, 67 | "<50%", 68 | ) 69 | .call(next, undefined, "<50%"); 70 | 71 | return () => { 72 | tl.kill(); 73 | }; 74 | }} 75 | > 76 |
{children}
77 | 78 |
82 |
86 | 87 | ); 88 | } 89 | -------------------------------------------------------------------------------- /example/app/styles.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | 5 | :root { 6 | --background: #eef2f1; 7 | --foreground: #171717; 8 | --primary: tomato; 9 | } 10 | 11 | @media (min-width: 1900px) { 12 | :root { 13 | --font-size: 20px; 14 | } 15 | } 16 | 17 | @media (min-width: 1600px) { 18 | :root { 19 | --font-size: 18px; 20 | } 21 | } 22 | 23 | body { 24 | -webkit-font-smoothing: antialiased; 25 | font-family: var(--font-primary), system-ui, sans-serif; 26 | color: var(--foreground); 27 | background-color: var(--background); 28 | font-size: var(--font-size, 16px); 29 | } 30 | -------------------------------------------------------------------------------- /example/app/twitter-image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ismamz/next-transition-router/72661087b4069f33dac298b16adca0a160152409/example/app/twitter-image.jpg -------------------------------------------------------------------------------- /example/app/utils.ts: -------------------------------------------------------------------------------- 1 | import { type ClassValue, clsx } from "clsx"; 2 | import { twMerge } from "tailwind-merge"; 3 | 4 | export function cn(...inputs: ClassValue[]) { 5 | return twMerge(clsx(inputs)); 6 | } 7 | -------------------------------------------------------------------------------- /example/assets/fonts/NeueMontreal-Italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ismamz/next-transition-router/72661087b4069f33dac298b16adca0a160152409/example/assets/fonts/NeueMontreal-Italic.woff2 -------------------------------------------------------------------------------- /example/assets/fonts/NeueMontreal-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ismamz/next-transition-router/72661087b4069f33dac298b16adca0a160152409/example/assets/fonts/NeueMontreal-Medium.woff2 -------------------------------------------------------------------------------- /example/assets/fonts/NeueMontreal-MediumItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ismamz/next-transition-router/72661087b4069f33dac298b16adca0a160152409/example/assets/fonts/NeueMontreal-MediumItalic.woff2 -------------------------------------------------------------------------------- /example/assets/fonts/NeueMontreal-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ismamz/next-transition-router/72661087b4069f33dac298b16adca0a160152409/example/assets/fonts/NeueMontreal-Regular.woff2 -------------------------------------------------------------------------------- /example/assets/image.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ismamz/next-transition-router/72661087b4069f33dac298b16adca0a160152409/example/assets/image.jpg -------------------------------------------------------------------------------- /example/components/back.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { useTransitionRouter } from "next-transition-router"; 4 | 5 | export function Back() { 6 | const { back } = useTransitionRouter(); 7 | 8 | return ( 9 | 12 | ); 13 | } 14 | -------------------------------------------------------------------------------- /example/components/button.tsx: -------------------------------------------------------------------------------- 1 | import Link, { LinkProps } from "next/link"; 2 | import { cn } from "@/app/utils"; 3 | 4 | export function ButtonLink({ 5 | children, 6 | back = false, 7 | className, 8 | ...rest 9 | }: { 10 | children: React.ReactNode; 11 | back?: boolean; 12 | className?: string; 13 | } & LinkProps) { 14 | return ( 15 | 22 | {back && ( 23 | 24 | ← 25 | 26 | )} 27 | {children} 28 | {!back && ( 29 | 30 | → 31 | 32 | )} 33 | 34 | ); 35 | } 36 | -------------------------------------------------------------------------------- /example/components/debug.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { useTransitionState } from "next-transition-router"; 4 | 5 | export function Debug() { 6 | const { stage } = useTransitionState(); 7 | 8 | return ( 9 | 12 | ); 13 | } 14 | -------------------------------------------------------------------------------- /example/components/header.tsx: -------------------------------------------------------------------------------- 1 | import Link from "next/link"; 2 | 3 | export function Header() { 4 | return ( 5 |
6 | 10 | 18 | 24 | 30 | 31 | next-transition-router 32 | 33 | 34 | 40 | 47 | 51 | 52 | GitHub 53 | 54 | 55 |
56 | ); 57 | } 58 | -------------------------------------------------------------------------------- /example/components/programmatic.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { useTransitionRouter } from "next-transition-router"; 4 | 5 | export function Programmatic() { 6 | const router = useTransitionRouter(); 7 | 8 | return ( 9 | <> 10 | 19 | 28 | 29 | ); 30 | } 31 | -------------------------------------------------------------------------------- /example/components/reveal.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { useTransitionState } from "next-transition-router"; 4 | import { ComponentProps, useEffect, useRef } from "react"; 5 | import { gsap } from "gsap"; 6 | 7 | export function Reveal({ 8 | children, 9 | ...rest 10 | }: { children: React.ReactNode } & ComponentProps<"div">) { 11 | const ref = useRef(null); 12 | const { isReady } = useTransitionState(); 13 | 14 | useEffect(() => { 15 | if (isReady) { 16 | const ctx = gsap.context(() => { 17 | gsap.to("img", { scale: 1, duration: 0.8, ease: "expo.out" }); 18 | }, ref); 19 | 20 | return () => { 21 | ctx?.revert(); 22 | }; 23 | } 24 | }, [isReady]); 25 | 26 | return ( 27 |
28 | {children} 29 |
30 | ); 31 | } 32 | -------------------------------------------------------------------------------- /example/components/title.tsx: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | import { cn } from "@/app/utils"; 4 | import { gsap } from "gsap"; 5 | import { useTransitionState } from "next-transition-router"; 6 | import { useLayoutEffect, useRef } from "react"; 7 | 8 | export function Title({ 9 | children, 10 | className, 11 | }: { 12 | children: React.ReactNode; 13 | className: string; 14 | }) { 15 | const { isReady } = useTransitionState(); 16 | const ref = useRef(null); 17 | 18 | useLayoutEffect(() => { 19 | if (isReady) { 20 | const ctx = gsap.context(() => { 21 | gsap 22 | .timeline() 23 | .set(ref.current, { 24 | autoAlpha: 1, 25 | }) 26 | .from("span", { 27 | y: "110%", 28 | duration: 0.6, 29 | ease: "circ.out", 30 | stagger: { 31 | each: 0.2, 32 | }, 33 | }); 34 | }, ref); 35 | 36 | return () => { 37 | ctx?.revert(); 38 | }; 39 | } 40 | }, [isReady]); 41 | 42 | return ( 43 |

44 | {children} 45 |

46 | ); 47 | } 48 | -------------------------------------------------------------------------------- /example/next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | 4 | // NOTE: This file should not be edited 5 | // see https://nextjs.org/docs/basic-features/typescript for more information. 6 | -------------------------------------------------------------------------------- /example/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "next-transition-router-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 | "clsx": "^2.1.1", 12 | "gsap": "^3.12.5", 13 | "next": "latest", 14 | "next-transition-router": "workspace:*", 15 | "react": "latest", 16 | "react-dom": "latest", 17 | "tailwind-merge": "^2.5.2" 18 | }, 19 | "devDependencies": { 20 | "@types/node": "latest", 21 | "autoprefixer": "^10.4.20", 22 | "postcss": "^8.4.41", 23 | "prettier-plugin-tailwindcss": "^0.6.6", 24 | "tailwindcss": "^3.4.9" 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /example/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /example/tailwind.config.ts: -------------------------------------------------------------------------------- 1 | import type { Config } from 'tailwindcss'; 2 | 3 | const config = { 4 | content: [ 5 | './app/**/*.{js,ts,jsx,tsx,mdx}', 6 | './pages/**/*.{js,ts,jsx,tsx,mdx}', 7 | './components/**/*.{js,ts,jsx,tsx,mdx}', 8 | ], 9 | experimental: { 10 | optimizeUniversalDefaults: true, 11 | }, 12 | theme: { 13 | extend: { 14 | colors: { 15 | background: 'var(--background)', 16 | foreground: 'var(--foreground)', 17 | primary: 'var(--primary)', 18 | }, 19 | }, 20 | }, 21 | plugins: [], 22 | } satisfies Config; 23 | 24 | export default config; 25 | -------------------------------------------------------------------------------- /example/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "lib": ["dom", "dom.iterable", "esnext"], 5 | "allowJs": true, 6 | "skipLibCheck": true, 7 | "strict": true, 8 | "noEmit": true, 9 | "esModuleInterop": true, 10 | "module": "esnext", 11 | "moduleResolution": "bundler", 12 | "resolveJsonModule": true, 13 | "isolatedModules": true, 14 | "jsx": "preserve", 15 | "incremental": true, 16 | "plugins": [ 17 | { 18 | "name": "next" 19 | } 20 | ], 21 | "paths": { 22 | "@/*": ["./*"] 23 | } 24 | }, 25 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], 26 | "exclude": ["node_modules"] 27 | } 28 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "next-transition-router", 3 | "version": "0.2.11", 4 | "type": "module", 5 | "description": "Easily add animated transitions between pages using 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 | }, 16 | "keywords": [ 17 | "next", 18 | "next.js", 19 | "page transitions", 20 | "view transitions", 21 | "route transitions", 22 | "app router" 23 | ], 24 | "author": { 25 | "name": "Ismael Martínez", 26 | "email": "hola@isma.uy", 27 | "url": "https://isma.uy" 28 | }, 29 | "homepage": "https://next-transition-router.vercel.app", 30 | "license": "MIT", 31 | "dependencies": { 32 | "delegate-it": "^6.1.0" 33 | }, 34 | "devDependencies": { 35 | "@types/react": "^18.2.78", 36 | "bunchee": "^5.1.2", 37 | "next": "latest", 38 | "react": "^18.2.0", 39 | "react-dom": "^18.2.0", 40 | "typescript": "^5.4.5" 41 | }, 42 | "peerDependencies": { 43 | "next": ">=14.0.0", 44 | "react": ">=18.2.0", 45 | "react-dom": ">=18.2.0" 46 | }, 47 | "packageManager": "pnpm@9.1.2" 48 | } 49 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '9.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | importers: 8 | 9 | .: 10 | dependencies: 11 | delegate-it: 12 | specifier: ^6.1.0 13 | version: 6.1.0 14 | devDependencies: 15 | '@types/react': 16 | specifier: ^18.2.78 17 | version: 18.3.3 18 | bunchee: 19 | specifier: ^5.1.2 20 | version: 5.3.1(typescript@5.5.4) 21 | next: 22 | specifier: latest 23 | version: 14.2.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 24 | react: 25 | specifier: ^18.2.0 26 | version: 18.3.1 27 | react-dom: 28 | specifier: ^18.2.0 29 | version: 18.3.1(react@18.3.1) 30 | typescript: 31 | specifier: ^5.4.5 32 | version: 5.5.4 33 | 34 | example: 35 | dependencies: 36 | clsx: 37 | specifier: ^2.1.1 38 | version: 2.1.1 39 | gsap: 40 | specifier: ^3.12.5 41 | version: 3.12.5 42 | next: 43 | specifier: latest 44 | version: 14.2.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1) 45 | next-transition-router: 46 | specifier: workspace:* 47 | version: link:.. 48 | react: 49 | specifier: latest 50 | version: 18.3.1 51 | react-dom: 52 | specifier: latest 53 | version: 18.3.1(react@18.3.1) 54 | tailwind-merge: 55 | specifier: ^2.5.2 56 | version: 2.5.2 57 | devDependencies: 58 | '@types/node': 59 | specifier: latest 60 | version: 22.1.0 61 | autoprefixer: 62 | specifier: ^10.4.20 63 | version: 10.4.20(postcss@8.4.41) 64 | postcss: 65 | specifier: ^8.4.41 66 | version: 8.4.41 67 | prettier-plugin-tailwindcss: 68 | specifier: ^0.6.6 69 | version: 0.6.6(prettier@3.3.3) 70 | tailwindcss: 71 | specifier: ^3.4.9 72 | version: 3.4.9 73 | 74 | packages: 75 | 76 | '@alloc/quick-lru@5.2.0': 77 | resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} 78 | engines: {node: '>=10'} 79 | 80 | '@babel/code-frame@7.24.7': 81 | resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} 82 | engines: {node: '>=6.9.0'} 83 | 84 | '@babel/helper-validator-identifier@7.24.7': 85 | resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} 86 | engines: {node: '>=6.9.0'} 87 | 88 | '@babel/highlight@7.24.7': 89 | resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} 90 | engines: {node: '>=6.9.0'} 91 | 92 | '@fastify/deepmerge@1.3.0': 93 | resolution: {integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==} 94 | 95 | '@isaacs/cliui@8.0.2': 96 | resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} 97 | engines: {node: '>=12'} 98 | 99 | '@jridgewell/gen-mapping@0.3.5': 100 | resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} 101 | engines: {node: '>=6.0.0'} 102 | 103 | '@jridgewell/resolve-uri@3.1.2': 104 | resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} 105 | engines: {node: '>=6.0.0'} 106 | 107 | '@jridgewell/set-array@1.2.1': 108 | resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} 109 | engines: {node: '>=6.0.0'} 110 | 111 | '@jridgewell/sourcemap-codec@1.5.0': 112 | resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} 113 | 114 | '@jridgewell/trace-mapping@0.3.25': 115 | resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} 116 | 117 | '@next/env@14.2.5': 118 | resolution: {integrity: sha512-/zZGkrTOsraVfYjGP8uM0p6r0BDT6xWpkjdVbcz66PJVSpwXX3yNiRycxAuDfBKGWBrZBXRuK/YVlkNgxHGwmA==} 119 | 120 | '@next/swc-darwin-arm64@14.2.5': 121 | resolution: {integrity: sha512-/9zVxJ+K9lrzSGli1///ujyRfon/ZneeZ+v4ptpiPoOU+GKZnm8Wj8ELWU1Pm7GHltYRBklmXMTUqM/DqQ99FQ==} 122 | engines: {node: '>= 10'} 123 | cpu: [arm64] 124 | os: [darwin] 125 | 126 | '@next/swc-darwin-x64@14.2.5': 127 | resolution: {integrity: sha512-vXHOPCwfDe9qLDuq7U1OYM2wUY+KQ4Ex6ozwsKxp26BlJ6XXbHleOUldenM67JRyBfVjv371oneEvYd3H2gNSA==} 128 | engines: {node: '>= 10'} 129 | cpu: [x64] 130 | os: [darwin] 131 | 132 | '@next/swc-linux-arm64-gnu@14.2.5': 133 | resolution: {integrity: sha512-vlhB8wI+lj8q1ExFW8lbWutA4M2ZazQNvMWuEDqZcuJJc78iUnLdPPunBPX8rC4IgT6lIx/adB+Cwrl99MzNaA==} 134 | engines: {node: '>= 10'} 135 | cpu: [arm64] 136 | os: [linux] 137 | 138 | '@next/swc-linux-arm64-musl@14.2.5': 139 | resolution: {integrity: sha512-NpDB9NUR2t0hXzJJwQSGu1IAOYybsfeB+LxpGsXrRIb7QOrYmidJz3shzY8cM6+rO4Aojuef0N/PEaX18pi9OA==} 140 | engines: {node: '>= 10'} 141 | cpu: [arm64] 142 | os: [linux] 143 | 144 | '@next/swc-linux-x64-gnu@14.2.5': 145 | resolution: {integrity: sha512-8XFikMSxWleYNryWIjiCX+gU201YS+erTUidKdyOVYi5qUQo/gRxv/3N1oZFCgqpesN6FPeqGM72Zve+nReVXQ==} 146 | engines: {node: '>= 10'} 147 | cpu: [x64] 148 | os: [linux] 149 | 150 | '@next/swc-linux-x64-musl@14.2.5': 151 | resolution: {integrity: sha512-6QLwi7RaYiQDcRDSU/os40r5o06b5ue7Jsk5JgdRBGGp8l37RZEh9JsLSM8QF0YDsgcosSeHjglgqi25+m04IQ==} 152 | engines: {node: '>= 10'} 153 | cpu: [x64] 154 | os: [linux] 155 | 156 | '@next/swc-win32-arm64-msvc@14.2.5': 157 | resolution: {integrity: sha512-1GpG2VhbspO+aYoMOQPQiqc/tG3LzmsdBH0LhnDS3JrtDx2QmzXe0B6mSZZiN3Bq7IOMXxv1nlsjzoS1+9mzZw==} 158 | engines: {node: '>= 10'} 159 | cpu: [arm64] 160 | os: [win32] 161 | 162 | '@next/swc-win32-ia32-msvc@14.2.5': 163 | resolution: {integrity: sha512-Igh9ZlxwvCDsu6438FXlQTHlRno4gFpJzqPjSIBZooD22tKeI4fE/YMRoHVJHmrQ2P5YL1DoZ0qaOKkbeFWeMg==} 164 | engines: {node: '>= 10'} 165 | cpu: [ia32] 166 | os: [win32] 167 | 168 | '@next/swc-win32-x64-msvc@14.2.5': 169 | resolution: {integrity: sha512-tEQ7oinq1/CjSG9uSTerca3v4AZ+dFa+4Yu6ihaG8Ud8ddqLQgFGcnwYls13H5X5CPDPZJdYxyeMui6muOLd4g==} 170 | engines: {node: '>= 10'} 171 | cpu: [x64] 172 | os: [win32] 173 | 174 | '@nodelib/fs.scandir@2.1.5': 175 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 176 | engines: {node: '>= 8'} 177 | 178 | '@nodelib/fs.stat@2.0.5': 179 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 180 | engines: {node: '>= 8'} 181 | 182 | '@nodelib/fs.walk@1.2.8': 183 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 184 | engines: {node: '>= 8'} 185 | 186 | '@pkgjs/parseargs@0.11.0': 187 | resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} 188 | engines: {node: '>=14'} 189 | 190 | '@rollup/plugin-commonjs@26.0.1': 191 | resolution: {integrity: sha512-UnsKoZK6/aGIH6AdkptXhNvhaqftcjq3zZdT+LY5Ftms6JR06nADcDsYp5hTU9E2lbJUEOhdlY5J4DNTneM+jQ==} 192 | engines: {node: '>=16.0.0 || 14 >= 14.17'} 193 | peerDependencies: 194 | rollup: ^2.68.0||^3.0.0||^4.0.0 195 | peerDependenciesMeta: 196 | rollup: 197 | optional: true 198 | 199 | '@rollup/plugin-json@6.1.0': 200 | resolution: {integrity: sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==} 201 | engines: {node: '>=14.0.0'} 202 | peerDependencies: 203 | rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 204 | peerDependenciesMeta: 205 | rollup: 206 | optional: true 207 | 208 | '@rollup/plugin-node-resolve@15.2.3': 209 | resolution: {integrity: sha512-j/lym8nf5E21LwBT4Df1VD6hRO2L2iwUeUmP7litikRsVp1H6NWx20NEp0Y7su+7XGc476GnXXc4kFeZNGmaSQ==} 210 | engines: {node: '>=14.0.0'} 211 | peerDependencies: 212 | rollup: ^2.78.0||^3.0.0||^4.0.0 213 | peerDependenciesMeta: 214 | rollup: 215 | optional: true 216 | 217 | '@rollup/plugin-replace@5.0.7': 218 | resolution: {integrity: sha512-PqxSfuorkHz/SPpyngLyg5GCEkOcee9M1bkxiVDr41Pd61mqP1PLOoDPbpl44SB2mQGKwV/In74gqQmGITOhEQ==} 219 | engines: {node: '>=14.0.0'} 220 | peerDependencies: 221 | rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 222 | peerDependenciesMeta: 223 | rollup: 224 | optional: true 225 | 226 | '@rollup/plugin-wasm@6.2.2': 227 | resolution: {integrity: sha512-gpC4R1G9Ni92ZIRTexqbhX7U+9estZrbhP+9SRb0DW9xpB9g7j34r+J2hqrcW/lRI7dJaU84MxZM0Rt82tqYPQ==} 228 | engines: {node: '>=14.0.0'} 229 | peerDependencies: 230 | rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 231 | peerDependenciesMeta: 232 | rollup: 233 | optional: true 234 | 235 | '@rollup/pluginutils@5.1.0': 236 | resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} 237 | engines: {node: '>=14.0.0'} 238 | peerDependencies: 239 | rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 240 | peerDependenciesMeta: 241 | rollup: 242 | optional: true 243 | 244 | '@rollup/rollup-android-arm-eabi@4.20.0': 245 | resolution: {integrity: sha512-TSpWzflCc4VGAUJZlPpgAJE1+V60MePDQnBd7PPkpuEmOy8i87aL6tinFGKBFKuEDikYpig72QzdT3QPYIi+oA==} 246 | cpu: [arm] 247 | os: [android] 248 | 249 | '@rollup/rollup-android-arm64@4.20.0': 250 | resolution: {integrity: sha512-u00Ro/nok7oGzVuh/FMYfNoGqxU5CPWz1mxV85S2w9LxHR8OoMQBuSk+3BKVIDYgkpeOET5yXkx90OYFc+ytpQ==} 251 | cpu: [arm64] 252 | os: [android] 253 | 254 | '@rollup/rollup-darwin-arm64@4.20.0': 255 | resolution: {integrity: sha512-uFVfvzvsdGtlSLuL0ZlvPJvl6ZmrH4CBwLGEFPe7hUmf7htGAN+aXo43R/V6LATyxlKVC/m6UsLb7jbG+LG39Q==} 256 | cpu: [arm64] 257 | os: [darwin] 258 | 259 | '@rollup/rollup-darwin-x64@4.20.0': 260 | resolution: {integrity: sha512-xbrMDdlev53vNXexEa6l0LffojxhqDTBeL+VUxuuIXys4x6xyvbKq5XqTXBCEUA8ty8iEJblHvFaWRJTk/icAQ==} 261 | cpu: [x64] 262 | os: [darwin] 263 | 264 | '@rollup/rollup-linux-arm-gnueabihf@4.20.0': 265 | resolution: {integrity: sha512-jMYvxZwGmoHFBTbr12Xc6wOdc2xA5tF5F2q6t7Rcfab68TT0n+r7dgawD4qhPEvasDsVpQi+MgDzj2faOLsZjA==} 266 | cpu: [arm] 267 | os: [linux] 268 | 269 | '@rollup/rollup-linux-arm-musleabihf@4.20.0': 270 | resolution: {integrity: sha512-1asSTl4HKuIHIB1GcdFHNNZhxAYEdqML/MW4QmPS4G0ivbEcBr1JKlFLKsIRqjSwOBkdItn3/ZDlyvZ/N6KPlw==} 271 | cpu: [arm] 272 | os: [linux] 273 | 274 | '@rollup/rollup-linux-arm64-gnu@4.20.0': 275 | resolution: {integrity: sha512-COBb8Bkx56KldOYJfMf6wKeYJrtJ9vEgBRAOkfw6Ens0tnmzPqvlpjZiLgkhg6cA3DGzCmLmmd319pmHvKWWlQ==} 276 | cpu: [arm64] 277 | os: [linux] 278 | 279 | '@rollup/rollup-linux-arm64-musl@4.20.0': 280 | resolution: {integrity: sha512-+it+mBSyMslVQa8wSPvBx53fYuZK/oLTu5RJoXogjk6x7Q7sz1GNRsXWjn6SwyJm8E/oMjNVwPhmNdIjwP135Q==} 281 | cpu: [arm64] 282 | os: [linux] 283 | 284 | '@rollup/rollup-linux-powerpc64le-gnu@4.20.0': 285 | resolution: {integrity: sha512-yAMvqhPfGKsAxHN8I4+jE0CpLWD8cv4z7CK7BMmhjDuz606Q2tFKkWRY8bHR9JQXYcoLfopo5TTqzxgPUjUMfw==} 286 | cpu: [ppc64] 287 | os: [linux] 288 | 289 | '@rollup/rollup-linux-riscv64-gnu@4.20.0': 290 | resolution: {integrity: sha512-qmuxFpfmi/2SUkAw95TtNq/w/I7Gpjurx609OOOV7U4vhvUhBcftcmXwl3rqAek+ADBwSjIC4IVNLiszoj3dPA==} 291 | cpu: [riscv64] 292 | os: [linux] 293 | 294 | '@rollup/rollup-linux-s390x-gnu@4.20.0': 295 | resolution: {integrity: sha512-I0BtGXddHSHjV1mqTNkgUZLnS3WtsqebAXv11D5BZE/gfw5KoyXSAXVqyJximQXNvNzUo4GKlCK/dIwXlz+jlg==} 296 | cpu: [s390x] 297 | os: [linux] 298 | 299 | '@rollup/rollup-linux-x64-gnu@4.20.0': 300 | resolution: {integrity: sha512-y+eoL2I3iphUg9tN9GB6ku1FA8kOfmF4oUEWhztDJ4KXJy1agk/9+pejOuZkNFhRwHAOxMsBPLbXPd6mJiCwew==} 301 | cpu: [x64] 302 | os: [linux] 303 | 304 | '@rollup/rollup-linux-x64-musl@4.20.0': 305 | resolution: {integrity: sha512-hM3nhW40kBNYUkZb/r9k2FKK+/MnKglX7UYd4ZUy5DJs8/sMsIbqWK2piZtVGE3kcXVNj3B2IrUYROJMMCikNg==} 306 | cpu: [x64] 307 | os: [linux] 308 | 309 | '@rollup/rollup-win32-arm64-msvc@4.20.0': 310 | resolution: {integrity: sha512-psegMvP+Ik/Bg7QRJbv8w8PAytPA7Uo8fpFjXyCRHWm6Nt42L+JtoqH8eDQ5hRP7/XW2UiIriy1Z46jf0Oa1kA==} 311 | cpu: [arm64] 312 | os: [win32] 313 | 314 | '@rollup/rollup-win32-ia32-msvc@4.20.0': 315 | resolution: {integrity: sha512-GabekH3w4lgAJpVxkk7hUzUf2hICSQO0a/BLFA11/RMxQT92MabKAqyubzDZmMOC/hcJNlc+rrypzNzYl4Dx7A==} 316 | cpu: [ia32] 317 | os: [win32] 318 | 319 | '@rollup/rollup-win32-x64-msvc@4.20.0': 320 | resolution: {integrity: sha512-aJ1EJSuTdGnM6qbVC4B5DSmozPTqIag9fSzXRNNo+humQLG89XpPgdt16Ia56ORD7s+H8Pmyx44uczDQ0yDzpg==} 321 | cpu: [x64] 322 | os: [win32] 323 | 324 | '@swc/core-darwin-arm64@1.7.6': 325 | resolution: {integrity: sha512-6lYHey84ZzsdtC7UuPheM4Rm0Inzxm6Sb8U6dmKc4eCx8JL0LfWG4LC5RsdsrTxnjTsbriWlnhZBffh8ijUHIQ==} 326 | engines: {node: '>=10'} 327 | cpu: [arm64] 328 | os: [darwin] 329 | 330 | '@swc/core-darwin-x64@1.7.6': 331 | resolution: {integrity: sha512-Fyl+8aH9O5rpx4O7r2KnsPpoi32iWoKOYKiipeTbGjQ/E95tNPxbmsz4yqE8Ovldcga60IPJ5OKQA3HWRiuzdw==} 332 | engines: {node: '>=10'} 333 | cpu: [x64] 334 | os: [darwin] 335 | 336 | '@swc/core-linux-arm-gnueabihf@1.7.6': 337 | resolution: {integrity: sha512-2WxYTqFaOx48GKC2cbO1/IntA+w+kfCFy436Ij7qRqqtV/WAvTM9TC1OmiFbqq436rSot52qYmX8fkwdB5UcLQ==} 338 | engines: {node: '>=10'} 339 | cpu: [arm] 340 | os: [linux] 341 | 342 | '@swc/core-linux-arm64-gnu@1.7.6': 343 | resolution: {integrity: sha512-TBEGMSe0LhvPe4S7E68c7VzgT3OMu4VTmBLS7B2aHv4v8uZO92Khpp7L0WqgYU1y5eMjk+XLDLi4kokiNHv/Hg==} 344 | engines: {node: '>=10'} 345 | cpu: [arm64] 346 | os: [linux] 347 | 348 | '@swc/core-linux-arm64-musl@1.7.6': 349 | resolution: {integrity: sha512-QI8QGL0HGT42tj7F1A+YAzhGkJjUcvvTfI1e2m704W0Enl2/UIK9v5D1zvQzYwusRyKuaQfbeBRYDh0NcLOGLg==} 350 | engines: {node: '>=10'} 351 | cpu: [arm64] 352 | os: [linux] 353 | 354 | '@swc/core-linux-x64-gnu@1.7.6': 355 | resolution: {integrity: sha512-61AYVzhjuNQAVIKKWOJu3H0/pFD28RYJGxnGg3YMhvRLRyuWNyY5Nyyj2WkKcz/ON+g38Arlz00NT1LDIViRLg==} 356 | engines: {node: '>=10'} 357 | cpu: [x64] 358 | os: [linux] 359 | 360 | '@swc/core-linux-x64-musl@1.7.6': 361 | resolution: {integrity: sha512-hQFznpfLK8XajfAAN9Cjs0w/aVmO7iu9VZvInyrTCRcPqxV5O+rvrhRxKvC1LRMZXr5M6JRSRtepp5w+TK4kAw==} 362 | engines: {node: '>=10'} 363 | cpu: [x64] 364 | os: [linux] 365 | 366 | '@swc/core-win32-arm64-msvc@1.7.6': 367 | resolution: {integrity: sha512-Aqsd9afykVMuekzjm4X4TDqwxmG4CrzoOSFe0hZrn9SMio72l5eAPnMtYoe5LsIqtjV8MNprLfXaNbjHjTegmA==} 368 | engines: {node: '>=10'} 369 | cpu: [arm64] 370 | os: [win32] 371 | 372 | '@swc/core-win32-ia32-msvc@1.7.6': 373 | resolution: {integrity: sha512-9h0hYnOeRVNeQgHQTvD1Im67faNSSzBZ7Adtxyu9urNLfBTJilMllFd2QuGHlKW5+uaT6ZH7ZWDb+c/enx7Lcg==} 374 | engines: {node: '>=10'} 375 | cpu: [ia32] 376 | os: [win32] 377 | 378 | '@swc/core-win32-x64-msvc@1.7.6': 379 | resolution: {integrity: sha512-izeoB8glCSe6IIDQmrVm6bvR9muk9TeKgmtY7b6l1BwL4BFnTUk4dMmpbntT90bEVQn3JPCaPtUG4HfL8VuyuA==} 380 | engines: {node: '>=10'} 381 | cpu: [x64] 382 | os: [win32] 383 | 384 | '@swc/core@1.7.6': 385 | resolution: {integrity: sha512-FZxyao9eQks1MRmUshgsZTmlg/HB2oXK5fghkoWJm/1CU2q2kaJlVDll2as5j+rmWiwkp0Gidlq8wlXcEEAO+g==} 386 | engines: {node: '>=10'} 387 | peerDependencies: 388 | '@swc/helpers': '*' 389 | peerDependenciesMeta: 390 | '@swc/helpers': 391 | optional: true 392 | 393 | '@swc/counter@0.1.3': 394 | resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} 395 | 396 | '@swc/helpers@0.5.12': 397 | resolution: {integrity: sha512-KMZNXiGibsW9kvZAO1Pam2JPTDBm+KSHMMHWdsyI/1DbIZjT2A6Gy3hblVXUMEDvUAKq+e0vL0X0o54owWji7g==} 398 | 399 | '@swc/helpers@0.5.5': 400 | resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} 401 | 402 | '@swc/types@0.1.12': 403 | resolution: {integrity: sha512-wBJA+SdtkbFhHjTMYH+dEH1y4VpfGdAc2Kw/LK09i9bXd/K6j6PkDcFCEzb6iVfZMkPRrl/q0e3toqTAJdkIVA==} 404 | 405 | '@types/estree@1.0.5': 406 | resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} 407 | 408 | '@types/node@22.1.0': 409 | resolution: {integrity: sha512-AOmuRF0R2/5j1knA3c6G3HOk523Ga+l+ZXltX8SF1+5oqcXijjfTd8fY3XRZqSihEu9XhtQnKYLmkFaoxgsJHw==} 410 | 411 | '@types/prop-types@15.7.12': 412 | resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} 413 | 414 | '@types/react@18.3.3': 415 | resolution: {integrity: sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==} 416 | 417 | '@types/resolve@1.20.2': 418 | resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} 419 | 420 | ansi-regex@5.0.1: 421 | resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} 422 | engines: {node: '>=8'} 423 | 424 | ansi-regex@6.0.1: 425 | resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} 426 | engines: {node: '>=12'} 427 | 428 | ansi-styles@3.2.1: 429 | resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} 430 | engines: {node: '>=4'} 431 | 432 | ansi-styles@4.3.0: 433 | resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} 434 | engines: {node: '>=8'} 435 | 436 | ansi-styles@6.2.1: 437 | resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} 438 | engines: {node: '>=12'} 439 | 440 | any-promise@1.3.0: 441 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} 442 | 443 | anymatch@3.1.3: 444 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 445 | engines: {node: '>= 8'} 446 | 447 | arg@5.0.2: 448 | resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} 449 | 450 | autoprefixer@10.4.20: 451 | resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==} 452 | engines: {node: ^10 || ^12 || >=14} 453 | hasBin: true 454 | peerDependencies: 455 | postcss: ^8.1.0 456 | 457 | balanced-match@1.0.2: 458 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} 459 | 460 | binary-extensions@2.3.0: 461 | resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} 462 | engines: {node: '>=8'} 463 | 464 | brace-expansion@2.0.1: 465 | resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} 466 | 467 | braces@3.0.3: 468 | resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} 469 | engines: {node: '>=8'} 470 | 471 | browserslist@4.23.3: 472 | resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==} 473 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 474 | hasBin: true 475 | 476 | builtin-modules@3.3.0: 477 | resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} 478 | engines: {node: '>=6'} 479 | 480 | bunchee@5.3.1: 481 | resolution: {integrity: sha512-8RsaVmHrmmL/qy1B13StTvFUx8CATmRBbC4Dci9HZzajCZQMIwfZqcAGocd69lfLR1SOk3V/gj01/3yyjDEerA==} 482 | engines: {node: '>= 18.0.0'} 483 | hasBin: true 484 | peerDependencies: 485 | typescript: ^4.1 || ^5.0 486 | peerDependenciesMeta: 487 | typescript: 488 | optional: true 489 | 490 | busboy@1.6.0: 491 | resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} 492 | engines: {node: '>=10.16.0'} 493 | 494 | camelcase-css@2.0.1: 495 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} 496 | engines: {node: '>= 6'} 497 | 498 | caniuse-lite@1.0.30001649: 499 | resolution: {integrity: sha512-fJegqZZ0ZX8HOWr6rcafGr72+xcgJKI9oWfDW5DrD7ExUtgZC7a7R7ZYmZqplh7XDocFdGeIFn7roAxhOeYrPQ==} 500 | 501 | chalk@2.4.2: 502 | resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} 503 | engines: {node: '>=4'} 504 | 505 | chalk@5.3.0: 506 | resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} 507 | engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} 508 | 509 | chokidar@3.6.0: 510 | resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} 511 | engines: {node: '>= 8.10.0'} 512 | 513 | clean-css@5.3.3: 514 | resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} 515 | engines: {node: '>= 10.0'} 516 | 517 | cli-cursor@4.0.0: 518 | resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} 519 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 520 | 521 | cli-spinners@2.9.2: 522 | resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} 523 | engines: {node: '>=6'} 524 | 525 | client-only@0.0.1: 526 | resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} 527 | 528 | clsx@2.1.1: 529 | resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} 530 | engines: {node: '>=6'} 531 | 532 | color-convert@1.9.3: 533 | resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} 534 | 535 | color-convert@2.0.1: 536 | resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} 537 | engines: {node: '>=7.0.0'} 538 | 539 | color-name@1.1.3: 540 | resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} 541 | 542 | color-name@1.1.4: 543 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 544 | 545 | commander@4.1.1: 546 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} 547 | engines: {node: '>= 6'} 548 | 549 | commondir@1.0.1: 550 | resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} 551 | 552 | cross-spawn@7.0.3: 553 | resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} 554 | engines: {node: '>= 8'} 555 | 556 | cssesc@3.0.0: 557 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 558 | engines: {node: '>=4'} 559 | hasBin: true 560 | 561 | csstype@3.1.3: 562 | resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} 563 | 564 | deepmerge@4.3.1: 565 | resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} 566 | engines: {node: '>=0.10.0'} 567 | 568 | delegate-it@6.1.0: 569 | resolution: {integrity: sha512-sPgBvzO3GVViT1qKiuMLKnZs2HokFwCg304kv2bbG08Tm3qi9u5y5jEC7u2dR0js22i+17JTfqK0XpWop9c67w==} 570 | 571 | didyoumean@1.2.2: 572 | resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} 573 | 574 | dlv@1.1.3: 575 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} 576 | 577 | eastasianwidth@0.2.0: 578 | resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} 579 | 580 | electron-to-chromium@1.5.6: 581 | resolution: {integrity: sha512-jwXWsM5RPf6j9dPYzaorcBSUg6AiqocPEyMpkchkvntaH9HGfOOMZwxMJjDY/XEs3T5dM7uyH1VhRMkqUU9qVw==} 582 | 583 | emoji-regex@10.3.0: 584 | resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} 585 | 586 | emoji-regex@8.0.0: 587 | resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} 588 | 589 | emoji-regex@9.2.2: 590 | resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} 591 | 592 | escalade@3.1.2: 593 | resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} 594 | engines: {node: '>=6'} 595 | 596 | escape-string-regexp@1.0.5: 597 | resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} 598 | engines: {node: '>=0.8.0'} 599 | 600 | estree-walker@2.0.2: 601 | resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} 602 | 603 | fast-glob@3.3.2: 604 | resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} 605 | engines: {node: '>=8.6.0'} 606 | 607 | fastq@1.17.1: 608 | resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} 609 | 610 | fill-range@7.1.1: 611 | resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} 612 | engines: {node: '>=8'} 613 | 614 | foreground-child@3.2.1: 615 | resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} 616 | engines: {node: '>=14'} 617 | 618 | fraction.js@4.3.7: 619 | resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} 620 | 621 | fsevents@2.3.3: 622 | resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} 623 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 624 | os: [darwin] 625 | 626 | function-bind@1.1.2: 627 | resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} 628 | 629 | get-east-asian-width@1.2.0: 630 | resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} 631 | engines: {node: '>=18'} 632 | 633 | get-tsconfig@4.7.6: 634 | resolution: {integrity: sha512-ZAqrLlu18NbDdRaHq+AKXzAmqIUPswPWKUchfytdAjiRFnCe5ojG2bstg6mRiZabkKfCoL/e98pbBELIV/YCeA==} 635 | 636 | glob-parent@5.1.2: 637 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 638 | engines: {node: '>= 6'} 639 | 640 | glob-parent@6.0.2: 641 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 642 | engines: {node: '>=10.13.0'} 643 | 644 | glob@10.4.5: 645 | resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} 646 | hasBin: true 647 | 648 | graceful-fs@4.2.11: 649 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 650 | 651 | gsap@3.12.5: 652 | resolution: {integrity: sha512-srBfnk4n+Oe/ZnMIOXt3gT605BX9x5+rh/prT2F1SsNJsU1XuMiP0E2aptW481OnonOGACZWBqseH5Z7csHxhQ==} 653 | 654 | has-flag@3.0.0: 655 | resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} 656 | engines: {node: '>=4'} 657 | 658 | hasown@2.0.2: 659 | resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} 660 | engines: {node: '>= 0.4'} 661 | 662 | is-binary-path@2.1.0: 663 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 664 | engines: {node: '>=8'} 665 | 666 | is-builtin-module@3.2.1: 667 | resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} 668 | engines: {node: '>=6'} 669 | 670 | is-core-module@2.15.0: 671 | resolution: {integrity: sha512-Dd+Lb2/zvk9SKy1TGCt1wFJFo/MWBPMX5x7KcvLajWTGuomczdQX61PvY5yK6SVACwpoexWo81IfFyoKY2QnTA==} 672 | engines: {node: '>= 0.4'} 673 | 674 | is-extglob@2.1.1: 675 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 676 | engines: {node: '>=0.10.0'} 677 | 678 | is-fullwidth-code-point@3.0.0: 679 | resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} 680 | engines: {node: '>=8'} 681 | 682 | is-glob@4.0.3: 683 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 684 | engines: {node: '>=0.10.0'} 685 | 686 | is-interactive@2.0.0: 687 | resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} 688 | engines: {node: '>=12'} 689 | 690 | is-module@1.0.0: 691 | resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} 692 | 693 | is-number@7.0.0: 694 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 695 | engines: {node: '>=0.12.0'} 696 | 697 | is-reference@1.2.1: 698 | resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} 699 | 700 | is-unicode-supported@1.3.0: 701 | resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} 702 | engines: {node: '>=12'} 703 | 704 | is-unicode-supported@2.0.0: 705 | resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==} 706 | engines: {node: '>=18'} 707 | 708 | isexe@2.0.0: 709 | resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} 710 | 711 | jackspeak@3.4.3: 712 | resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} 713 | 714 | jiti@1.21.6: 715 | resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} 716 | hasBin: true 717 | 718 | js-tokens@4.0.0: 719 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 720 | 721 | lilconfig@2.1.0: 722 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} 723 | engines: {node: '>=10'} 724 | 725 | lilconfig@3.1.2: 726 | resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} 727 | engines: {node: '>=14'} 728 | 729 | lines-and-columns@1.2.4: 730 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} 731 | 732 | log-symbols@6.0.0: 733 | resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} 734 | engines: {node: '>=18'} 735 | 736 | loose-envify@1.4.0: 737 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 738 | hasBin: true 739 | 740 | lru-cache@10.4.3: 741 | resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} 742 | 743 | magic-string@0.30.11: 744 | resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} 745 | 746 | merge2@1.4.1: 747 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 748 | engines: {node: '>= 8'} 749 | 750 | micromatch@4.0.7: 751 | resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} 752 | engines: {node: '>=8.6'} 753 | 754 | mimic-fn@2.1.0: 755 | resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} 756 | engines: {node: '>=6'} 757 | 758 | minimatch@9.0.5: 759 | resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} 760 | engines: {node: '>=16 || 14 >=14.17'} 761 | 762 | minipass@7.1.2: 763 | resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} 764 | engines: {node: '>=16 || 14 >=14.17'} 765 | 766 | mz@2.7.0: 767 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} 768 | 769 | nanoid@3.3.7: 770 | resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} 771 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 772 | hasBin: true 773 | 774 | next@14.2.5: 775 | resolution: {integrity: sha512-0f8aRfBVL+mpzfBjYfQuLWh2WyAwtJXCRfkPF4UJ5qd2YwrHczsrSzXU4tRMV0OAxR8ZJZWPFn6uhSC56UTsLA==} 776 | engines: {node: '>=18.17.0'} 777 | hasBin: true 778 | peerDependencies: 779 | '@opentelemetry/api': ^1.1.0 780 | '@playwright/test': ^1.41.2 781 | react: ^18.2.0 782 | react-dom: ^18.2.0 783 | sass: ^1.3.0 784 | peerDependenciesMeta: 785 | '@opentelemetry/api': 786 | optional: true 787 | '@playwright/test': 788 | optional: true 789 | sass: 790 | optional: true 791 | 792 | node-releases@2.0.18: 793 | resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} 794 | 795 | normalize-path@3.0.0: 796 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 797 | engines: {node: '>=0.10.0'} 798 | 799 | normalize-range@0.1.2: 800 | resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} 801 | engines: {node: '>=0.10.0'} 802 | 803 | object-assign@4.1.1: 804 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} 805 | engines: {node: '>=0.10.0'} 806 | 807 | object-hash@3.0.0: 808 | resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} 809 | engines: {node: '>= 6'} 810 | 811 | onetime@5.1.2: 812 | resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} 813 | engines: {node: '>=6'} 814 | 815 | ora@8.0.1: 816 | resolution: {integrity: sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==} 817 | engines: {node: '>=18'} 818 | 819 | package-json-from-dist@1.0.0: 820 | resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} 821 | 822 | path-key@3.1.1: 823 | resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} 824 | engines: {node: '>=8'} 825 | 826 | path-parse@1.0.7: 827 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 828 | 829 | path-scurry@1.11.1: 830 | resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} 831 | engines: {node: '>=16 || 14 >=14.18'} 832 | 833 | picocolors@1.0.1: 834 | resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} 835 | 836 | picomatch@2.3.1: 837 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 838 | engines: {node: '>=8.6'} 839 | 840 | pify@2.3.0: 841 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} 842 | engines: {node: '>=0.10.0'} 843 | 844 | pirates@4.0.6: 845 | resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} 846 | engines: {node: '>= 6'} 847 | 848 | postcss-import@15.1.0: 849 | resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} 850 | engines: {node: '>=14.0.0'} 851 | peerDependencies: 852 | postcss: ^8.0.0 853 | 854 | postcss-js@4.0.1: 855 | resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} 856 | engines: {node: ^12 || ^14 || >= 16} 857 | peerDependencies: 858 | postcss: ^8.4.21 859 | 860 | postcss-load-config@4.0.2: 861 | resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} 862 | engines: {node: '>= 14'} 863 | peerDependencies: 864 | postcss: '>=8.0.9' 865 | ts-node: '>=9.0.0' 866 | peerDependenciesMeta: 867 | postcss: 868 | optional: true 869 | ts-node: 870 | optional: true 871 | 872 | postcss-nested@6.2.0: 873 | resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} 874 | engines: {node: '>=12.0'} 875 | peerDependencies: 876 | postcss: ^8.2.14 877 | 878 | postcss-selector-parser@6.1.2: 879 | resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} 880 | engines: {node: '>=4'} 881 | 882 | postcss-value-parser@4.2.0: 883 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 884 | 885 | postcss@8.4.31: 886 | resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} 887 | engines: {node: ^10 || ^12 || >=14} 888 | 889 | postcss@8.4.41: 890 | resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} 891 | engines: {node: ^10 || ^12 || >=14} 892 | 893 | prettier-plugin-tailwindcss@0.6.6: 894 | resolution: {integrity: sha512-OPva5S7WAsPLEsOuOWXATi13QrCKACCiIonFgIR6V4lYv4QLp++UXVhZSzRbZxXGimkQtQT86CC6fQqTOybGng==} 895 | engines: {node: '>=14.21.3'} 896 | peerDependencies: 897 | '@ianvs/prettier-plugin-sort-imports': '*' 898 | '@prettier/plugin-pug': '*' 899 | '@shopify/prettier-plugin-liquid': '*' 900 | '@trivago/prettier-plugin-sort-imports': '*' 901 | '@zackad/prettier-plugin-twig-melody': '*' 902 | prettier: ^3.0 903 | prettier-plugin-astro: '*' 904 | prettier-plugin-css-order: '*' 905 | prettier-plugin-import-sort: '*' 906 | prettier-plugin-jsdoc: '*' 907 | prettier-plugin-marko: '*' 908 | prettier-plugin-multiline-arrays: '*' 909 | prettier-plugin-organize-attributes: '*' 910 | prettier-plugin-organize-imports: '*' 911 | prettier-plugin-sort-imports: '*' 912 | prettier-plugin-style-order: '*' 913 | prettier-plugin-svelte: '*' 914 | peerDependenciesMeta: 915 | '@ianvs/prettier-plugin-sort-imports': 916 | optional: true 917 | '@prettier/plugin-pug': 918 | optional: true 919 | '@shopify/prettier-plugin-liquid': 920 | optional: true 921 | '@trivago/prettier-plugin-sort-imports': 922 | optional: true 923 | '@zackad/prettier-plugin-twig-melody': 924 | optional: true 925 | prettier-plugin-astro: 926 | optional: true 927 | prettier-plugin-css-order: 928 | optional: true 929 | prettier-plugin-import-sort: 930 | optional: true 931 | prettier-plugin-jsdoc: 932 | optional: true 933 | prettier-plugin-marko: 934 | optional: true 935 | prettier-plugin-multiline-arrays: 936 | optional: true 937 | prettier-plugin-organize-attributes: 938 | optional: true 939 | prettier-plugin-organize-imports: 940 | optional: true 941 | prettier-plugin-sort-imports: 942 | optional: true 943 | prettier-plugin-style-order: 944 | optional: true 945 | prettier-plugin-svelte: 946 | optional: true 947 | 948 | prettier@3.3.3: 949 | resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} 950 | engines: {node: '>=14'} 951 | hasBin: true 952 | 953 | pretty-bytes@5.6.0: 954 | resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} 955 | engines: {node: '>=6'} 956 | 957 | queue-microtask@1.2.3: 958 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 959 | 960 | react-dom@18.3.1: 961 | resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} 962 | peerDependencies: 963 | react: ^18.3.1 964 | 965 | react@18.3.1: 966 | resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} 967 | engines: {node: '>=0.10.0'} 968 | 969 | read-cache@1.0.0: 970 | resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} 971 | 972 | readdirp@3.6.0: 973 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 974 | engines: {node: '>=8.10.0'} 975 | 976 | resolve-pkg-maps@1.0.0: 977 | resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} 978 | 979 | resolve@1.22.8: 980 | resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} 981 | hasBin: true 982 | 983 | restore-cursor@4.0.0: 984 | resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} 985 | engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} 986 | 987 | reusify@1.0.4: 988 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 989 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 990 | 991 | rollup-plugin-dts@6.1.1: 992 | resolution: {integrity: sha512-aSHRcJ6KG2IHIioYlvAOcEq6U99sVtqDDKVhnwt70rW6tsz3tv5OSjEiWcgzfsHdLyGXZ/3b/7b/+Za3Y6r1XA==} 993 | engines: {node: '>=16'} 994 | peerDependencies: 995 | rollup: ^3.29.4 || ^4 996 | typescript: ^4.5 || ^5.0 997 | 998 | rollup-plugin-swc3@0.11.2: 999 | resolution: {integrity: sha512-o1ih9B806fV2wBSNk46T0cYfTF2eiiKmYXRpWw3K4j/Cp3tCAt10UCVsTqvUhGP58pcB3/GZcAVl5e7TCSKN6Q==} 1000 | engines: {node: '>=12'} 1001 | peerDependencies: 1002 | '@swc/core': '>=1.2.165' 1003 | rollup: ^2.0.0 || ^3.0.0 || ^4.0.0 1004 | 1005 | rollup-preserve-directives@1.1.1: 1006 | resolution: {integrity: sha512-+eQafbuEfDPfxQ9hQPlwaROfin4yiVRxap8hnrvvvcSGoukv1tTiYpAW9mvm3uR8J+fe4xd8FdVd5rz9q7jZ+Q==} 1007 | peerDependencies: 1008 | rollup: ^2.0.0 || ^3.0.0 || ^4.0.0 1009 | 1010 | rollup@4.20.0: 1011 | resolution: {integrity: sha512-6rbWBChcnSGzIlXeIdNIZTopKYad8ZG8ajhl78lGRLsI2rX8IkaotQhVas2Ma+GPxJav19wrSzvRvuiv0YKzWw==} 1012 | engines: {node: '>=18.0.0', npm: '>=8.0.0'} 1013 | hasBin: true 1014 | 1015 | run-parallel@1.2.0: 1016 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 1017 | 1018 | scheduler@0.23.2: 1019 | resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} 1020 | 1021 | shebang-command@2.0.0: 1022 | resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} 1023 | engines: {node: '>=8'} 1024 | 1025 | shebang-regex@3.0.0: 1026 | resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} 1027 | engines: {node: '>=8'} 1028 | 1029 | signal-exit@3.0.7: 1030 | resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} 1031 | 1032 | signal-exit@4.1.0: 1033 | resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} 1034 | engines: {node: '>=14'} 1035 | 1036 | source-map-js@1.2.0: 1037 | resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} 1038 | engines: {node: '>=0.10.0'} 1039 | 1040 | source-map@0.6.1: 1041 | resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} 1042 | engines: {node: '>=0.10.0'} 1043 | 1044 | stdin-discarder@0.2.2: 1045 | resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} 1046 | engines: {node: '>=18'} 1047 | 1048 | streamsearch@1.1.0: 1049 | resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} 1050 | engines: {node: '>=10.0.0'} 1051 | 1052 | string-width@4.2.3: 1053 | resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} 1054 | engines: {node: '>=8'} 1055 | 1056 | string-width@5.1.2: 1057 | resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} 1058 | engines: {node: '>=12'} 1059 | 1060 | string-width@7.2.0: 1061 | resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} 1062 | engines: {node: '>=18'} 1063 | 1064 | strip-ansi@6.0.1: 1065 | resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} 1066 | engines: {node: '>=8'} 1067 | 1068 | strip-ansi@7.1.0: 1069 | resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} 1070 | engines: {node: '>=12'} 1071 | 1072 | styled-jsx@5.1.1: 1073 | resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} 1074 | engines: {node: '>= 12.0.0'} 1075 | peerDependencies: 1076 | '@babel/core': '*' 1077 | babel-plugin-macros: '*' 1078 | react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' 1079 | peerDependenciesMeta: 1080 | '@babel/core': 1081 | optional: true 1082 | babel-plugin-macros: 1083 | optional: true 1084 | 1085 | sucrase@3.35.0: 1086 | resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} 1087 | engines: {node: '>=16 || 14 >=14.17'} 1088 | hasBin: true 1089 | 1090 | supports-color@5.5.0: 1091 | resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} 1092 | engines: {node: '>=4'} 1093 | 1094 | supports-preserve-symlinks-flag@1.0.0: 1095 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 1096 | engines: {node: '>= 0.4'} 1097 | 1098 | tailwind-merge@2.5.2: 1099 | resolution: {integrity: sha512-kjEBm+pvD+6eAwzJL2Bi+02/9LFLal1Gs61+QB7HvTfQQ0aXwC5LGT8PEt1gS0CWKktKe6ysPTAy3cBC5MeiIg==} 1100 | 1101 | tailwindcss@3.4.9: 1102 | resolution: {integrity: sha512-1SEOvRr6sSdV5IDf9iC+NU4dhwdqzF4zKKq3sAbasUWHEM6lsMhX+eNN5gkPx1BvLFEnZQEUFbXnGj8Qlp83Pg==} 1103 | engines: {node: '>=14.0.0'} 1104 | hasBin: true 1105 | 1106 | thenify-all@1.6.0: 1107 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} 1108 | engines: {node: '>=0.8'} 1109 | 1110 | thenify@3.3.1: 1111 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} 1112 | 1113 | to-regex-range@5.0.1: 1114 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 1115 | engines: {node: '>=8.0'} 1116 | 1117 | ts-interface-checker@0.1.13: 1118 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} 1119 | 1120 | tslib@2.6.3: 1121 | resolution: {integrity: sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==} 1122 | 1123 | typed-query-selector@2.11.3: 1124 | resolution: {integrity: sha512-lMG8vpGrthemzydrNhGbpFqLEDEe4ivjNcofh2L2JYC8OBnkIAZLAsNVEkxS8rix2YZhTMqbwwJh91uk31kKTA==} 1125 | 1126 | typescript@5.5.4: 1127 | resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} 1128 | engines: {node: '>=14.17'} 1129 | hasBin: true 1130 | 1131 | undici-types@6.13.0: 1132 | resolution: {integrity: sha512-xtFJHudx8S2DSoujjMd1WeWvn7KKWFRESZTMeL1RptAYERu29D6jphMjjY+vn96jvN3kVPDNxU/E13VTaXj6jg==} 1133 | 1134 | update-browserslist-db@1.1.0: 1135 | resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==} 1136 | hasBin: true 1137 | peerDependencies: 1138 | browserslist: '>= 4.21.0' 1139 | 1140 | util-deprecate@1.0.2: 1141 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 1142 | 1143 | which@2.0.2: 1144 | resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} 1145 | engines: {node: '>= 8'} 1146 | hasBin: true 1147 | 1148 | wrap-ansi@7.0.0: 1149 | resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} 1150 | engines: {node: '>=10'} 1151 | 1152 | wrap-ansi@8.1.0: 1153 | resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} 1154 | engines: {node: '>=12'} 1155 | 1156 | yaml@2.5.0: 1157 | resolution: {integrity: sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw==} 1158 | engines: {node: '>= 14'} 1159 | hasBin: true 1160 | 1161 | snapshots: 1162 | 1163 | '@alloc/quick-lru@5.2.0': {} 1164 | 1165 | '@babel/code-frame@7.24.7': 1166 | dependencies: 1167 | '@babel/highlight': 7.24.7 1168 | picocolors: 1.0.1 1169 | optional: true 1170 | 1171 | '@babel/helper-validator-identifier@7.24.7': 1172 | optional: true 1173 | 1174 | '@babel/highlight@7.24.7': 1175 | dependencies: 1176 | '@babel/helper-validator-identifier': 7.24.7 1177 | chalk: 2.4.2 1178 | js-tokens: 4.0.0 1179 | picocolors: 1.0.1 1180 | optional: true 1181 | 1182 | '@fastify/deepmerge@1.3.0': {} 1183 | 1184 | '@isaacs/cliui@8.0.2': 1185 | dependencies: 1186 | string-width: 5.1.2 1187 | string-width-cjs: string-width@4.2.3 1188 | strip-ansi: 7.1.0 1189 | strip-ansi-cjs: strip-ansi@6.0.1 1190 | wrap-ansi: 8.1.0 1191 | wrap-ansi-cjs: wrap-ansi@7.0.0 1192 | 1193 | '@jridgewell/gen-mapping@0.3.5': 1194 | dependencies: 1195 | '@jridgewell/set-array': 1.2.1 1196 | '@jridgewell/sourcemap-codec': 1.5.0 1197 | '@jridgewell/trace-mapping': 0.3.25 1198 | 1199 | '@jridgewell/resolve-uri@3.1.2': {} 1200 | 1201 | '@jridgewell/set-array@1.2.1': {} 1202 | 1203 | '@jridgewell/sourcemap-codec@1.5.0': {} 1204 | 1205 | '@jridgewell/trace-mapping@0.3.25': 1206 | dependencies: 1207 | '@jridgewell/resolve-uri': 3.1.2 1208 | '@jridgewell/sourcemap-codec': 1.5.0 1209 | 1210 | '@next/env@14.2.5': {} 1211 | 1212 | '@next/swc-darwin-arm64@14.2.5': 1213 | optional: true 1214 | 1215 | '@next/swc-darwin-x64@14.2.5': 1216 | optional: true 1217 | 1218 | '@next/swc-linux-arm64-gnu@14.2.5': 1219 | optional: true 1220 | 1221 | '@next/swc-linux-arm64-musl@14.2.5': 1222 | optional: true 1223 | 1224 | '@next/swc-linux-x64-gnu@14.2.5': 1225 | optional: true 1226 | 1227 | '@next/swc-linux-x64-musl@14.2.5': 1228 | optional: true 1229 | 1230 | '@next/swc-win32-arm64-msvc@14.2.5': 1231 | optional: true 1232 | 1233 | '@next/swc-win32-ia32-msvc@14.2.5': 1234 | optional: true 1235 | 1236 | '@next/swc-win32-x64-msvc@14.2.5': 1237 | optional: true 1238 | 1239 | '@nodelib/fs.scandir@2.1.5': 1240 | dependencies: 1241 | '@nodelib/fs.stat': 2.0.5 1242 | run-parallel: 1.2.0 1243 | 1244 | '@nodelib/fs.stat@2.0.5': {} 1245 | 1246 | '@nodelib/fs.walk@1.2.8': 1247 | dependencies: 1248 | '@nodelib/fs.scandir': 2.1.5 1249 | fastq: 1.17.1 1250 | 1251 | '@pkgjs/parseargs@0.11.0': 1252 | optional: true 1253 | 1254 | '@rollup/plugin-commonjs@26.0.1(rollup@4.20.0)': 1255 | dependencies: 1256 | '@rollup/pluginutils': 5.1.0(rollup@4.20.0) 1257 | commondir: 1.0.1 1258 | estree-walker: 2.0.2 1259 | glob: 10.4.5 1260 | is-reference: 1.2.1 1261 | magic-string: 0.30.11 1262 | optionalDependencies: 1263 | rollup: 4.20.0 1264 | 1265 | '@rollup/plugin-json@6.1.0(rollup@4.20.0)': 1266 | dependencies: 1267 | '@rollup/pluginutils': 5.1.0(rollup@4.20.0) 1268 | optionalDependencies: 1269 | rollup: 4.20.0 1270 | 1271 | '@rollup/plugin-node-resolve@15.2.3(rollup@4.20.0)': 1272 | dependencies: 1273 | '@rollup/pluginutils': 5.1.0(rollup@4.20.0) 1274 | '@types/resolve': 1.20.2 1275 | deepmerge: 4.3.1 1276 | is-builtin-module: 3.2.1 1277 | is-module: 1.0.0 1278 | resolve: 1.22.8 1279 | optionalDependencies: 1280 | rollup: 4.20.0 1281 | 1282 | '@rollup/plugin-replace@5.0.7(rollup@4.20.0)': 1283 | dependencies: 1284 | '@rollup/pluginutils': 5.1.0(rollup@4.20.0) 1285 | magic-string: 0.30.11 1286 | optionalDependencies: 1287 | rollup: 4.20.0 1288 | 1289 | '@rollup/plugin-wasm@6.2.2(rollup@4.20.0)': 1290 | dependencies: 1291 | '@rollup/pluginutils': 5.1.0(rollup@4.20.0) 1292 | optionalDependencies: 1293 | rollup: 4.20.0 1294 | 1295 | '@rollup/pluginutils@5.1.0(rollup@4.20.0)': 1296 | dependencies: 1297 | '@types/estree': 1.0.5 1298 | estree-walker: 2.0.2 1299 | picomatch: 2.3.1 1300 | optionalDependencies: 1301 | rollup: 4.20.0 1302 | 1303 | '@rollup/rollup-android-arm-eabi@4.20.0': 1304 | optional: true 1305 | 1306 | '@rollup/rollup-android-arm64@4.20.0': 1307 | optional: true 1308 | 1309 | '@rollup/rollup-darwin-arm64@4.20.0': 1310 | optional: true 1311 | 1312 | '@rollup/rollup-darwin-x64@4.20.0': 1313 | optional: true 1314 | 1315 | '@rollup/rollup-linux-arm-gnueabihf@4.20.0': 1316 | optional: true 1317 | 1318 | '@rollup/rollup-linux-arm-musleabihf@4.20.0': 1319 | optional: true 1320 | 1321 | '@rollup/rollup-linux-arm64-gnu@4.20.0': 1322 | optional: true 1323 | 1324 | '@rollup/rollup-linux-arm64-musl@4.20.0': 1325 | optional: true 1326 | 1327 | '@rollup/rollup-linux-powerpc64le-gnu@4.20.0': 1328 | optional: true 1329 | 1330 | '@rollup/rollup-linux-riscv64-gnu@4.20.0': 1331 | optional: true 1332 | 1333 | '@rollup/rollup-linux-s390x-gnu@4.20.0': 1334 | optional: true 1335 | 1336 | '@rollup/rollup-linux-x64-gnu@4.20.0': 1337 | optional: true 1338 | 1339 | '@rollup/rollup-linux-x64-musl@4.20.0': 1340 | optional: true 1341 | 1342 | '@rollup/rollup-win32-arm64-msvc@4.20.0': 1343 | optional: true 1344 | 1345 | '@rollup/rollup-win32-ia32-msvc@4.20.0': 1346 | optional: true 1347 | 1348 | '@rollup/rollup-win32-x64-msvc@4.20.0': 1349 | optional: true 1350 | 1351 | '@swc/core-darwin-arm64@1.7.6': 1352 | optional: true 1353 | 1354 | '@swc/core-darwin-x64@1.7.6': 1355 | optional: true 1356 | 1357 | '@swc/core-linux-arm-gnueabihf@1.7.6': 1358 | optional: true 1359 | 1360 | '@swc/core-linux-arm64-gnu@1.7.6': 1361 | optional: true 1362 | 1363 | '@swc/core-linux-arm64-musl@1.7.6': 1364 | optional: true 1365 | 1366 | '@swc/core-linux-x64-gnu@1.7.6': 1367 | optional: true 1368 | 1369 | '@swc/core-linux-x64-musl@1.7.6': 1370 | optional: true 1371 | 1372 | '@swc/core-win32-arm64-msvc@1.7.6': 1373 | optional: true 1374 | 1375 | '@swc/core-win32-ia32-msvc@1.7.6': 1376 | optional: true 1377 | 1378 | '@swc/core-win32-x64-msvc@1.7.6': 1379 | optional: true 1380 | 1381 | '@swc/core@1.7.6(@swc/helpers@0.5.12)': 1382 | dependencies: 1383 | '@swc/counter': 0.1.3 1384 | '@swc/types': 0.1.12 1385 | optionalDependencies: 1386 | '@swc/core-darwin-arm64': 1.7.6 1387 | '@swc/core-darwin-x64': 1.7.6 1388 | '@swc/core-linux-arm-gnueabihf': 1.7.6 1389 | '@swc/core-linux-arm64-gnu': 1.7.6 1390 | '@swc/core-linux-arm64-musl': 1.7.6 1391 | '@swc/core-linux-x64-gnu': 1.7.6 1392 | '@swc/core-linux-x64-musl': 1.7.6 1393 | '@swc/core-win32-arm64-msvc': 1.7.6 1394 | '@swc/core-win32-ia32-msvc': 1.7.6 1395 | '@swc/core-win32-x64-msvc': 1.7.6 1396 | '@swc/helpers': 0.5.12 1397 | 1398 | '@swc/counter@0.1.3': {} 1399 | 1400 | '@swc/helpers@0.5.12': 1401 | dependencies: 1402 | tslib: 2.6.3 1403 | 1404 | '@swc/helpers@0.5.5': 1405 | dependencies: 1406 | '@swc/counter': 0.1.3 1407 | tslib: 2.6.3 1408 | 1409 | '@swc/types@0.1.12': 1410 | dependencies: 1411 | '@swc/counter': 0.1.3 1412 | 1413 | '@types/estree@1.0.5': {} 1414 | 1415 | '@types/node@22.1.0': 1416 | dependencies: 1417 | undici-types: 6.13.0 1418 | 1419 | '@types/prop-types@15.7.12': {} 1420 | 1421 | '@types/react@18.3.3': 1422 | dependencies: 1423 | '@types/prop-types': 15.7.12 1424 | csstype: 3.1.3 1425 | 1426 | '@types/resolve@1.20.2': {} 1427 | 1428 | ansi-regex@5.0.1: {} 1429 | 1430 | ansi-regex@6.0.1: {} 1431 | 1432 | ansi-styles@3.2.1: 1433 | dependencies: 1434 | color-convert: 1.9.3 1435 | optional: true 1436 | 1437 | ansi-styles@4.3.0: 1438 | dependencies: 1439 | color-convert: 2.0.1 1440 | 1441 | ansi-styles@6.2.1: {} 1442 | 1443 | any-promise@1.3.0: {} 1444 | 1445 | anymatch@3.1.3: 1446 | dependencies: 1447 | normalize-path: 3.0.0 1448 | picomatch: 2.3.1 1449 | 1450 | arg@5.0.2: {} 1451 | 1452 | autoprefixer@10.4.20(postcss@8.4.41): 1453 | dependencies: 1454 | browserslist: 4.23.3 1455 | caniuse-lite: 1.0.30001649 1456 | fraction.js: 4.3.7 1457 | normalize-range: 0.1.2 1458 | picocolors: 1.0.1 1459 | postcss: 8.4.41 1460 | postcss-value-parser: 4.2.0 1461 | 1462 | balanced-match@1.0.2: {} 1463 | 1464 | binary-extensions@2.3.0: {} 1465 | 1466 | brace-expansion@2.0.1: 1467 | dependencies: 1468 | balanced-match: 1.0.2 1469 | 1470 | braces@3.0.3: 1471 | dependencies: 1472 | fill-range: 7.1.1 1473 | 1474 | browserslist@4.23.3: 1475 | dependencies: 1476 | caniuse-lite: 1.0.30001649 1477 | electron-to-chromium: 1.5.6 1478 | node-releases: 2.0.18 1479 | update-browserslist-db: 1.1.0(browserslist@4.23.3) 1480 | 1481 | builtin-modules@3.3.0: {} 1482 | 1483 | bunchee@5.3.1(typescript@5.5.4): 1484 | dependencies: 1485 | '@rollup/plugin-commonjs': 26.0.1(rollup@4.20.0) 1486 | '@rollup/plugin-json': 6.1.0(rollup@4.20.0) 1487 | '@rollup/plugin-node-resolve': 15.2.3(rollup@4.20.0) 1488 | '@rollup/plugin-replace': 5.0.7(rollup@4.20.0) 1489 | '@rollup/plugin-wasm': 6.2.2(rollup@4.20.0) 1490 | '@rollup/pluginutils': 5.1.0(rollup@4.20.0) 1491 | '@swc/core': 1.7.6(@swc/helpers@0.5.12) 1492 | '@swc/helpers': 0.5.12 1493 | arg: 5.0.2 1494 | clean-css: 5.3.3 1495 | magic-string: 0.30.11 1496 | ora: 8.0.1 1497 | pretty-bytes: 5.6.0 1498 | rollup: 4.20.0 1499 | rollup-plugin-dts: 6.1.1(rollup@4.20.0)(typescript@5.5.4) 1500 | rollup-plugin-swc3: 0.11.2(@swc/core@1.7.6(@swc/helpers@0.5.12))(rollup@4.20.0) 1501 | rollup-preserve-directives: 1.1.1(rollup@4.20.0) 1502 | tslib: 2.6.3 1503 | optionalDependencies: 1504 | typescript: 5.5.4 1505 | 1506 | busboy@1.6.0: 1507 | dependencies: 1508 | streamsearch: 1.1.0 1509 | 1510 | camelcase-css@2.0.1: {} 1511 | 1512 | caniuse-lite@1.0.30001649: {} 1513 | 1514 | chalk@2.4.2: 1515 | dependencies: 1516 | ansi-styles: 3.2.1 1517 | escape-string-regexp: 1.0.5 1518 | supports-color: 5.5.0 1519 | optional: true 1520 | 1521 | chalk@5.3.0: {} 1522 | 1523 | chokidar@3.6.0: 1524 | dependencies: 1525 | anymatch: 3.1.3 1526 | braces: 3.0.3 1527 | glob-parent: 5.1.2 1528 | is-binary-path: 2.1.0 1529 | is-glob: 4.0.3 1530 | normalize-path: 3.0.0 1531 | readdirp: 3.6.0 1532 | optionalDependencies: 1533 | fsevents: 2.3.3 1534 | 1535 | clean-css@5.3.3: 1536 | dependencies: 1537 | source-map: 0.6.1 1538 | 1539 | cli-cursor@4.0.0: 1540 | dependencies: 1541 | restore-cursor: 4.0.0 1542 | 1543 | cli-spinners@2.9.2: {} 1544 | 1545 | client-only@0.0.1: {} 1546 | 1547 | clsx@2.1.1: {} 1548 | 1549 | color-convert@1.9.3: 1550 | dependencies: 1551 | color-name: 1.1.3 1552 | optional: true 1553 | 1554 | color-convert@2.0.1: 1555 | dependencies: 1556 | color-name: 1.1.4 1557 | 1558 | color-name@1.1.3: 1559 | optional: true 1560 | 1561 | color-name@1.1.4: {} 1562 | 1563 | commander@4.1.1: {} 1564 | 1565 | commondir@1.0.1: {} 1566 | 1567 | cross-spawn@7.0.3: 1568 | dependencies: 1569 | path-key: 3.1.1 1570 | shebang-command: 2.0.0 1571 | which: 2.0.2 1572 | 1573 | cssesc@3.0.0: {} 1574 | 1575 | csstype@3.1.3: {} 1576 | 1577 | deepmerge@4.3.1: {} 1578 | 1579 | delegate-it@6.1.0: 1580 | dependencies: 1581 | typed-query-selector: 2.11.3 1582 | 1583 | didyoumean@1.2.2: {} 1584 | 1585 | dlv@1.1.3: {} 1586 | 1587 | eastasianwidth@0.2.0: {} 1588 | 1589 | electron-to-chromium@1.5.6: {} 1590 | 1591 | emoji-regex@10.3.0: {} 1592 | 1593 | emoji-regex@8.0.0: {} 1594 | 1595 | emoji-regex@9.2.2: {} 1596 | 1597 | escalade@3.1.2: {} 1598 | 1599 | escape-string-regexp@1.0.5: 1600 | optional: true 1601 | 1602 | estree-walker@2.0.2: {} 1603 | 1604 | fast-glob@3.3.2: 1605 | dependencies: 1606 | '@nodelib/fs.stat': 2.0.5 1607 | '@nodelib/fs.walk': 1.2.8 1608 | glob-parent: 5.1.2 1609 | merge2: 1.4.1 1610 | micromatch: 4.0.7 1611 | 1612 | fastq@1.17.1: 1613 | dependencies: 1614 | reusify: 1.0.4 1615 | 1616 | fill-range@7.1.1: 1617 | dependencies: 1618 | to-regex-range: 5.0.1 1619 | 1620 | foreground-child@3.2.1: 1621 | dependencies: 1622 | cross-spawn: 7.0.3 1623 | signal-exit: 4.1.0 1624 | 1625 | fraction.js@4.3.7: {} 1626 | 1627 | fsevents@2.3.3: 1628 | optional: true 1629 | 1630 | function-bind@1.1.2: {} 1631 | 1632 | get-east-asian-width@1.2.0: {} 1633 | 1634 | get-tsconfig@4.7.6: 1635 | dependencies: 1636 | resolve-pkg-maps: 1.0.0 1637 | 1638 | glob-parent@5.1.2: 1639 | dependencies: 1640 | is-glob: 4.0.3 1641 | 1642 | glob-parent@6.0.2: 1643 | dependencies: 1644 | is-glob: 4.0.3 1645 | 1646 | glob@10.4.5: 1647 | dependencies: 1648 | foreground-child: 3.2.1 1649 | jackspeak: 3.4.3 1650 | minimatch: 9.0.5 1651 | minipass: 7.1.2 1652 | package-json-from-dist: 1.0.0 1653 | path-scurry: 1.11.1 1654 | 1655 | graceful-fs@4.2.11: {} 1656 | 1657 | gsap@3.12.5: {} 1658 | 1659 | has-flag@3.0.0: 1660 | optional: true 1661 | 1662 | hasown@2.0.2: 1663 | dependencies: 1664 | function-bind: 1.1.2 1665 | 1666 | is-binary-path@2.1.0: 1667 | dependencies: 1668 | binary-extensions: 2.3.0 1669 | 1670 | is-builtin-module@3.2.1: 1671 | dependencies: 1672 | builtin-modules: 3.3.0 1673 | 1674 | is-core-module@2.15.0: 1675 | dependencies: 1676 | hasown: 2.0.2 1677 | 1678 | is-extglob@2.1.1: {} 1679 | 1680 | is-fullwidth-code-point@3.0.0: {} 1681 | 1682 | is-glob@4.0.3: 1683 | dependencies: 1684 | is-extglob: 2.1.1 1685 | 1686 | is-interactive@2.0.0: {} 1687 | 1688 | is-module@1.0.0: {} 1689 | 1690 | is-number@7.0.0: {} 1691 | 1692 | is-reference@1.2.1: 1693 | dependencies: 1694 | '@types/estree': 1.0.5 1695 | 1696 | is-unicode-supported@1.3.0: {} 1697 | 1698 | is-unicode-supported@2.0.0: {} 1699 | 1700 | isexe@2.0.0: {} 1701 | 1702 | jackspeak@3.4.3: 1703 | dependencies: 1704 | '@isaacs/cliui': 8.0.2 1705 | optionalDependencies: 1706 | '@pkgjs/parseargs': 0.11.0 1707 | 1708 | jiti@1.21.6: {} 1709 | 1710 | js-tokens@4.0.0: {} 1711 | 1712 | lilconfig@2.1.0: {} 1713 | 1714 | lilconfig@3.1.2: {} 1715 | 1716 | lines-and-columns@1.2.4: {} 1717 | 1718 | log-symbols@6.0.0: 1719 | dependencies: 1720 | chalk: 5.3.0 1721 | is-unicode-supported: 1.3.0 1722 | 1723 | loose-envify@1.4.0: 1724 | dependencies: 1725 | js-tokens: 4.0.0 1726 | 1727 | lru-cache@10.4.3: {} 1728 | 1729 | magic-string@0.30.11: 1730 | dependencies: 1731 | '@jridgewell/sourcemap-codec': 1.5.0 1732 | 1733 | merge2@1.4.1: {} 1734 | 1735 | micromatch@4.0.7: 1736 | dependencies: 1737 | braces: 3.0.3 1738 | picomatch: 2.3.1 1739 | 1740 | mimic-fn@2.1.0: {} 1741 | 1742 | minimatch@9.0.5: 1743 | dependencies: 1744 | brace-expansion: 2.0.1 1745 | 1746 | minipass@7.1.2: {} 1747 | 1748 | mz@2.7.0: 1749 | dependencies: 1750 | any-promise: 1.3.0 1751 | object-assign: 4.1.1 1752 | thenify-all: 1.6.0 1753 | 1754 | nanoid@3.3.7: {} 1755 | 1756 | next@14.2.5(react-dom@18.3.1(react@18.3.1))(react@18.3.1): 1757 | dependencies: 1758 | '@next/env': 14.2.5 1759 | '@swc/helpers': 0.5.5 1760 | busboy: 1.6.0 1761 | caniuse-lite: 1.0.30001649 1762 | graceful-fs: 4.2.11 1763 | postcss: 8.4.31 1764 | react: 18.3.1 1765 | react-dom: 18.3.1(react@18.3.1) 1766 | styled-jsx: 5.1.1(react@18.3.1) 1767 | optionalDependencies: 1768 | '@next/swc-darwin-arm64': 14.2.5 1769 | '@next/swc-darwin-x64': 14.2.5 1770 | '@next/swc-linux-arm64-gnu': 14.2.5 1771 | '@next/swc-linux-arm64-musl': 14.2.5 1772 | '@next/swc-linux-x64-gnu': 14.2.5 1773 | '@next/swc-linux-x64-musl': 14.2.5 1774 | '@next/swc-win32-arm64-msvc': 14.2.5 1775 | '@next/swc-win32-ia32-msvc': 14.2.5 1776 | '@next/swc-win32-x64-msvc': 14.2.5 1777 | transitivePeerDependencies: 1778 | - '@babel/core' 1779 | - babel-plugin-macros 1780 | 1781 | node-releases@2.0.18: {} 1782 | 1783 | normalize-path@3.0.0: {} 1784 | 1785 | normalize-range@0.1.2: {} 1786 | 1787 | object-assign@4.1.1: {} 1788 | 1789 | object-hash@3.0.0: {} 1790 | 1791 | onetime@5.1.2: 1792 | dependencies: 1793 | mimic-fn: 2.1.0 1794 | 1795 | ora@8.0.1: 1796 | dependencies: 1797 | chalk: 5.3.0 1798 | cli-cursor: 4.0.0 1799 | cli-spinners: 2.9.2 1800 | is-interactive: 2.0.0 1801 | is-unicode-supported: 2.0.0 1802 | log-symbols: 6.0.0 1803 | stdin-discarder: 0.2.2 1804 | string-width: 7.2.0 1805 | strip-ansi: 7.1.0 1806 | 1807 | package-json-from-dist@1.0.0: {} 1808 | 1809 | path-key@3.1.1: {} 1810 | 1811 | path-parse@1.0.7: {} 1812 | 1813 | path-scurry@1.11.1: 1814 | dependencies: 1815 | lru-cache: 10.4.3 1816 | minipass: 7.1.2 1817 | 1818 | picocolors@1.0.1: {} 1819 | 1820 | picomatch@2.3.1: {} 1821 | 1822 | pify@2.3.0: {} 1823 | 1824 | pirates@4.0.6: {} 1825 | 1826 | postcss-import@15.1.0(postcss@8.4.41): 1827 | dependencies: 1828 | postcss: 8.4.41 1829 | postcss-value-parser: 4.2.0 1830 | read-cache: 1.0.0 1831 | resolve: 1.22.8 1832 | 1833 | postcss-js@4.0.1(postcss@8.4.41): 1834 | dependencies: 1835 | camelcase-css: 2.0.1 1836 | postcss: 8.4.41 1837 | 1838 | postcss-load-config@4.0.2(postcss@8.4.41): 1839 | dependencies: 1840 | lilconfig: 3.1.2 1841 | yaml: 2.5.0 1842 | optionalDependencies: 1843 | postcss: 8.4.41 1844 | 1845 | postcss-nested@6.2.0(postcss@8.4.41): 1846 | dependencies: 1847 | postcss: 8.4.41 1848 | postcss-selector-parser: 6.1.2 1849 | 1850 | postcss-selector-parser@6.1.2: 1851 | dependencies: 1852 | cssesc: 3.0.0 1853 | util-deprecate: 1.0.2 1854 | 1855 | postcss-value-parser@4.2.0: {} 1856 | 1857 | postcss@8.4.31: 1858 | dependencies: 1859 | nanoid: 3.3.7 1860 | picocolors: 1.0.1 1861 | source-map-js: 1.2.0 1862 | 1863 | postcss@8.4.41: 1864 | dependencies: 1865 | nanoid: 3.3.7 1866 | picocolors: 1.0.1 1867 | source-map-js: 1.2.0 1868 | 1869 | prettier-plugin-tailwindcss@0.6.6(prettier@3.3.3): 1870 | dependencies: 1871 | prettier: 3.3.3 1872 | 1873 | prettier@3.3.3: {} 1874 | 1875 | pretty-bytes@5.6.0: {} 1876 | 1877 | queue-microtask@1.2.3: {} 1878 | 1879 | react-dom@18.3.1(react@18.3.1): 1880 | dependencies: 1881 | loose-envify: 1.4.0 1882 | react: 18.3.1 1883 | scheduler: 0.23.2 1884 | 1885 | react@18.3.1: 1886 | dependencies: 1887 | loose-envify: 1.4.0 1888 | 1889 | read-cache@1.0.0: 1890 | dependencies: 1891 | pify: 2.3.0 1892 | 1893 | readdirp@3.6.0: 1894 | dependencies: 1895 | picomatch: 2.3.1 1896 | 1897 | resolve-pkg-maps@1.0.0: {} 1898 | 1899 | resolve@1.22.8: 1900 | dependencies: 1901 | is-core-module: 2.15.0 1902 | path-parse: 1.0.7 1903 | supports-preserve-symlinks-flag: 1.0.0 1904 | 1905 | restore-cursor@4.0.0: 1906 | dependencies: 1907 | onetime: 5.1.2 1908 | signal-exit: 3.0.7 1909 | 1910 | reusify@1.0.4: {} 1911 | 1912 | rollup-plugin-dts@6.1.1(rollup@4.20.0)(typescript@5.5.4): 1913 | dependencies: 1914 | magic-string: 0.30.11 1915 | rollup: 4.20.0 1916 | typescript: 5.5.4 1917 | optionalDependencies: 1918 | '@babel/code-frame': 7.24.7 1919 | 1920 | rollup-plugin-swc3@0.11.2(@swc/core@1.7.6(@swc/helpers@0.5.12))(rollup@4.20.0): 1921 | dependencies: 1922 | '@fastify/deepmerge': 1.3.0 1923 | '@rollup/pluginutils': 5.1.0(rollup@4.20.0) 1924 | '@swc/core': 1.7.6(@swc/helpers@0.5.12) 1925 | get-tsconfig: 4.7.6 1926 | rollup: 4.20.0 1927 | rollup-preserve-directives: 1.1.1(rollup@4.20.0) 1928 | 1929 | rollup-preserve-directives@1.1.1(rollup@4.20.0): 1930 | dependencies: 1931 | magic-string: 0.30.11 1932 | rollup: 4.20.0 1933 | 1934 | rollup@4.20.0: 1935 | dependencies: 1936 | '@types/estree': 1.0.5 1937 | optionalDependencies: 1938 | '@rollup/rollup-android-arm-eabi': 4.20.0 1939 | '@rollup/rollup-android-arm64': 4.20.0 1940 | '@rollup/rollup-darwin-arm64': 4.20.0 1941 | '@rollup/rollup-darwin-x64': 4.20.0 1942 | '@rollup/rollup-linux-arm-gnueabihf': 4.20.0 1943 | '@rollup/rollup-linux-arm-musleabihf': 4.20.0 1944 | '@rollup/rollup-linux-arm64-gnu': 4.20.0 1945 | '@rollup/rollup-linux-arm64-musl': 4.20.0 1946 | '@rollup/rollup-linux-powerpc64le-gnu': 4.20.0 1947 | '@rollup/rollup-linux-riscv64-gnu': 4.20.0 1948 | '@rollup/rollup-linux-s390x-gnu': 4.20.0 1949 | '@rollup/rollup-linux-x64-gnu': 4.20.0 1950 | '@rollup/rollup-linux-x64-musl': 4.20.0 1951 | '@rollup/rollup-win32-arm64-msvc': 4.20.0 1952 | '@rollup/rollup-win32-ia32-msvc': 4.20.0 1953 | '@rollup/rollup-win32-x64-msvc': 4.20.0 1954 | fsevents: 2.3.3 1955 | 1956 | run-parallel@1.2.0: 1957 | dependencies: 1958 | queue-microtask: 1.2.3 1959 | 1960 | scheduler@0.23.2: 1961 | dependencies: 1962 | loose-envify: 1.4.0 1963 | 1964 | shebang-command@2.0.0: 1965 | dependencies: 1966 | shebang-regex: 3.0.0 1967 | 1968 | shebang-regex@3.0.0: {} 1969 | 1970 | signal-exit@3.0.7: {} 1971 | 1972 | signal-exit@4.1.0: {} 1973 | 1974 | source-map-js@1.2.0: {} 1975 | 1976 | source-map@0.6.1: {} 1977 | 1978 | stdin-discarder@0.2.2: {} 1979 | 1980 | streamsearch@1.1.0: {} 1981 | 1982 | string-width@4.2.3: 1983 | dependencies: 1984 | emoji-regex: 8.0.0 1985 | is-fullwidth-code-point: 3.0.0 1986 | strip-ansi: 6.0.1 1987 | 1988 | string-width@5.1.2: 1989 | dependencies: 1990 | eastasianwidth: 0.2.0 1991 | emoji-regex: 9.2.2 1992 | strip-ansi: 7.1.0 1993 | 1994 | string-width@7.2.0: 1995 | dependencies: 1996 | emoji-regex: 10.3.0 1997 | get-east-asian-width: 1.2.0 1998 | strip-ansi: 7.1.0 1999 | 2000 | strip-ansi@6.0.1: 2001 | dependencies: 2002 | ansi-regex: 5.0.1 2003 | 2004 | strip-ansi@7.1.0: 2005 | dependencies: 2006 | ansi-regex: 6.0.1 2007 | 2008 | styled-jsx@5.1.1(react@18.3.1): 2009 | dependencies: 2010 | client-only: 0.0.1 2011 | react: 18.3.1 2012 | 2013 | sucrase@3.35.0: 2014 | dependencies: 2015 | '@jridgewell/gen-mapping': 0.3.5 2016 | commander: 4.1.1 2017 | glob: 10.4.5 2018 | lines-and-columns: 1.2.4 2019 | mz: 2.7.0 2020 | pirates: 4.0.6 2021 | ts-interface-checker: 0.1.13 2022 | 2023 | supports-color@5.5.0: 2024 | dependencies: 2025 | has-flag: 3.0.0 2026 | optional: true 2027 | 2028 | supports-preserve-symlinks-flag@1.0.0: {} 2029 | 2030 | tailwind-merge@2.5.2: {} 2031 | 2032 | tailwindcss@3.4.9: 2033 | dependencies: 2034 | '@alloc/quick-lru': 5.2.0 2035 | arg: 5.0.2 2036 | chokidar: 3.6.0 2037 | didyoumean: 1.2.2 2038 | dlv: 1.1.3 2039 | fast-glob: 3.3.2 2040 | glob-parent: 6.0.2 2041 | is-glob: 4.0.3 2042 | jiti: 1.21.6 2043 | lilconfig: 2.1.0 2044 | micromatch: 4.0.7 2045 | normalize-path: 3.0.0 2046 | object-hash: 3.0.0 2047 | picocolors: 1.0.1 2048 | postcss: 8.4.41 2049 | postcss-import: 15.1.0(postcss@8.4.41) 2050 | postcss-js: 4.0.1(postcss@8.4.41) 2051 | postcss-load-config: 4.0.2(postcss@8.4.41) 2052 | postcss-nested: 6.2.0(postcss@8.4.41) 2053 | postcss-selector-parser: 6.1.2 2054 | resolve: 1.22.8 2055 | sucrase: 3.35.0 2056 | transitivePeerDependencies: 2057 | - ts-node 2058 | 2059 | thenify-all@1.6.0: 2060 | dependencies: 2061 | thenify: 3.3.1 2062 | 2063 | thenify@3.3.1: 2064 | dependencies: 2065 | any-promise: 1.3.0 2066 | 2067 | to-regex-range@5.0.1: 2068 | dependencies: 2069 | is-number: 7.0.0 2070 | 2071 | ts-interface-checker@0.1.13: {} 2072 | 2073 | tslib@2.6.3: {} 2074 | 2075 | typed-query-selector@2.11.3: {} 2076 | 2077 | typescript@5.5.4: {} 2078 | 2079 | undici-types@6.13.0: {} 2080 | 2081 | update-browserslist-db@1.1.0(browserslist@4.23.3): 2082 | dependencies: 2083 | browserslist: 4.23.3 2084 | escalade: 3.1.2 2085 | picocolors: 1.0.1 2086 | 2087 | util-deprecate@1.0.2: {} 2088 | 2089 | which@2.0.2: 2090 | dependencies: 2091 | isexe: 2.0.0 2092 | 2093 | wrap-ansi@7.0.0: 2094 | dependencies: 2095 | ansi-styles: 4.3.0 2096 | string-width: 4.2.3 2097 | strip-ansi: 6.0.1 2098 | 2099 | wrap-ansi@8.1.0: 2100 | dependencies: 2101 | ansi-styles: 6.2.1 2102 | string-width: 5.1.2 2103 | strip-ansi: 7.1.0 2104 | 2105 | yaml@2.5.0: {} 2106 | -------------------------------------------------------------------------------- /pnpm-workspace.yaml: -------------------------------------------------------------------------------- 1 | packages: 2 | - 'example' 3 | - '.' 4 | -------------------------------------------------------------------------------- /src/context.tsx: -------------------------------------------------------------------------------- 1 | import { 2 | createContext, 3 | ReactNode, 4 | use, 5 | useCallback, 6 | useEffect, 7 | useMemo, 8 | useRef, 9 | useState, 10 | } from "react"; 11 | import delegate, { DelegateEvent } from "delegate-it"; 12 | import { usePathname, useRouter } from "next/navigation"; 13 | import { NavigateOptions } from "next/dist/shared/lib/app-router-context.shared-runtime"; 14 | import { shouldLinkTriggerTransition } from "./utils"; 15 | 16 | export type Stage = "leaving" | "entering" | "none"; 17 | 18 | export type TransitionCallback = ( 19 | next: () => void, 20 | from?: string, 21 | to?: string 22 | ) => Promise<(() => void) | void> | ((() => void) | void); 23 | 24 | export interface TransitionRouterProps { 25 | children: ReactNode; 26 | leave?: TransitionCallback; 27 | enter?: TransitionCallback; 28 | auto?: boolean; 29 | } 30 | 31 | export type NavigateProps = ( 32 | href: string, 33 | pathname: string, 34 | method?: "push" | "replace" | "back", 35 | options?: NavigateOptions 36 | ) => void; 37 | 38 | const TransitionRouterContext = createContext<{ 39 | stage: Stage; 40 | navigate: NavigateProps; 41 | isReady: boolean; 42 | }>({ 43 | stage: "none", 44 | navigate: () => {}, 45 | isReady: false, 46 | }); 47 | 48 | export function TransitionRouter({ 49 | children, 50 | leave = async (next) => next(), 51 | enter = async (next) => next(), 52 | auto = false, 53 | }: TransitionRouterProps) { 54 | const router = useRouter(); 55 | const pathname = usePathname(); 56 | 57 | const [stage, setStage] = useState("none"); 58 | 59 | const leaveRef = useRef<(() => void) | void | null>(null); 60 | const enterRef = useRef<(() => void) | void | null>(null); 61 | 62 | const navigate: NavigateProps = useCallback( 63 | async (href, pathname, method = "push", options) => { 64 | if (stage === "leaving") return Promise.resolve(); 65 | 66 | let next = () => router[method](href, options); 67 | if (method === "back") next = () => router.back(); 68 | 69 | // handle back navigation case where href is undefined 70 | if (method === "back" || !href) { 71 | next(); 72 | return; 73 | } 74 | 75 | // skip transition for hash-only links 76 | if (href.startsWith("#")) { 77 | next(); 78 | return; 79 | } 80 | 81 | let target: URL; 82 | let current: URL; 83 | 84 | try { 85 | current = new URL(window.location.href); 86 | target = new URL(href, current); 87 | } catch (error) { 88 | next(); 89 | return; 90 | } 91 | 92 | const isSamePage = 93 | target.pathname === current.pathname && 94 | target.search === current.search && 95 | target.hash === current.hash; 96 | 97 | const isSamePathDifferentParams = 98 | target.pathname === current.pathname && 99 | (target.search !== current.search || target.hash !== current.hash); 100 | 101 | if ( 102 | target.origin === current.origin && // same origin 103 | !isSamePage && // not link to self 104 | !isSamePathDifferentParams // not same pathname but different params 105 | ) { 106 | setStage("leaving"); 107 | leaveRef.current = await leave(next, pathname, href); 108 | } else { 109 | next(); 110 | } 111 | }, 112 | [leave, router, stage] 113 | ); 114 | 115 | const handleClick = useCallback( 116 | (event: DelegateEvent) => { 117 | const link = event.delegateTarget as HTMLAnchorElement; 118 | const href = link?.getAttribute("href"); 119 | const ignore = link?.getAttribute("data-transition-ignore"); // ignore only works in auto mode 120 | 121 | if (!ignore && shouldLinkTriggerTransition(link, event)) { 122 | event.preventDefault(); 123 | navigate(href, pathname); 124 | } 125 | }, 126 | [navigate, pathname] 127 | ); 128 | 129 | useEffect(() => { 130 | if (!auto) return; 131 | 132 | const controller = new AbortController(); 133 | delegate("a[href]", "click", handleClick, { signal: controller.signal }); 134 | 135 | return () => { 136 | controller.abort(); 137 | }; 138 | }, [auto, handleClick]); 139 | 140 | useEffect(() => { 141 | if (stage === "entering") { 142 | if (typeof leaveRef.current === "function") leaveRef.current(); 143 | leaveRef.current = null; 144 | 145 | const runEnter = async () => { 146 | enterRef.current = await Promise.resolve(enter(() => setStage("none"))); 147 | }; 148 | 149 | runEnter(); 150 | } 151 | }, [stage, enter]); 152 | 153 | useEffect(() => { 154 | return () => { 155 | if (stage === "leaving") { 156 | if (typeof enterRef.current === "function") enterRef.current(); 157 | enterRef.current = null; 158 | 159 | setStage("entering"); 160 | } 161 | }; 162 | }, [stage, pathname]); 163 | 164 | const value = useMemo( 165 | () => ({ stage, navigate, isReady: stage !== "entering" }), 166 | [stage, navigate] 167 | ); 168 | 169 | return ( 170 | 171 | {children} 172 | 173 | ); 174 | } 175 | 176 | export function useTransitionState() { 177 | return use(TransitionRouterContext); 178 | } 179 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | "use client"; 2 | 3 | export { TransitionRouter, useTransitionState } from "./context"; 4 | export { useTransitionRouter } from "./router"; 5 | export { Link } from "./link"; 6 | -------------------------------------------------------------------------------- /src/link.tsx: -------------------------------------------------------------------------------- 1 | import NextLink from "next/link"; 2 | import { useCallback } from "react"; 3 | import { useTransitionRouter } from "./router"; 4 | import { shouldLinkTriggerTransition } from "./utils"; 5 | 6 | export function Link(props: React.ComponentProps) { 7 | const router = useTransitionRouter(); 8 | 9 | const { href, as, replace, scroll } = props; 10 | 11 | const onClick = useCallback( 12 | (e: React.MouseEvent) => { 13 | if (props.onClick) props.onClick(e); 14 | 15 | const link = e.currentTarget as HTMLAnchorElement; 16 | const targetHref = (as || href) as string; 17 | 18 | if (shouldLinkTriggerTransition(link, e)) { 19 | e.preventDefault(); 20 | const navigate = replace ? router.replace : router.push; 21 | navigate(targetHref, { scroll: scroll ?? true }); 22 | } 23 | }, 24 | [props.onClick, href, as, replace, scroll, router.replace, router.push] 25 | ); 26 | 27 | return ; 28 | } 29 | -------------------------------------------------------------------------------- /src/router.tsx: -------------------------------------------------------------------------------- 1 | import { useCallback, useMemo } from "react"; 2 | import { usePathname, useRouter } from "next/navigation"; 3 | import { NavigateOptions } from "next/dist/shared/lib/app-router-context.shared-runtime"; 4 | import { useTransitionState } from "./context"; 5 | import { format, UrlObject } from "url"; 6 | 7 | type Url = string | UrlObject; 8 | 9 | function getUrlAsString(url: Url): string { 10 | if (typeof url === "string") return url; 11 | return format(url); 12 | } 13 | 14 | export function useTransitionRouter() { 15 | const router = useRouter(); 16 | const pathname = usePathname(); 17 | const { navigate } = useTransitionState(); 18 | 19 | const push = useCallback( 20 | (href: Url, options?: NavigateOptions) => { 21 | navigate(getUrlAsString(href), pathname, "push", options); 22 | }, 23 | [pathname, navigate] 24 | ); 25 | 26 | const replace = useCallback( 27 | (href: Url, options?: NavigateOptions) => { 28 | navigate(getUrlAsString(href), pathname, "replace", options); 29 | }, 30 | [pathname, navigate] 31 | ); 32 | 33 | const back = useCallback(() => { 34 | navigate(undefined, pathname, "back"); 35 | }, [pathname, navigate]); 36 | 37 | return useMemo( 38 | () => ({ 39 | ...router, 40 | push, 41 | replace, 42 | back, 43 | }), 44 | [router, push, replace, back] 45 | ); 46 | } 47 | -------------------------------------------------------------------------------- /src/utils.ts: -------------------------------------------------------------------------------- 1 | import type { DelegateEvent } from "delegate-it"; 2 | import type { MouseEvent as ReactMouseEvent } from "react"; 3 | 4 | export function isModifiedEvent( 5 | event: DelegateEvent | ReactMouseEvent 6 | ): boolean { 7 | const eventTarget = ( 8 | "delegateTarget" in event ? event.delegateTarget : event.currentTarget 9 | ) as HTMLAnchorElement | SVGAElement; 10 | 11 | const target = eventTarget.getAttribute("target"); 12 | 13 | return ( 14 | (target && target !== "_self") || 15 | event.metaKey || 16 | event.ctrlKey || 17 | event.shiftKey || 18 | event.altKey || // triggers resource download 19 | ("which" in event ? event.which : event.nativeEvent.which) === 2 // middle mouse button 20 | ); 21 | } 22 | 23 | export function shouldLinkTriggerTransition( 24 | link: HTMLAnchorElement, 25 | event: DelegateEvent | ReactMouseEvent 26 | ): boolean { 27 | return ( 28 | link.target !== "_blank" && // not for new tab 29 | link.origin === window.location.origin && // ensure same origin 30 | link.rel !== "external" && // ensure not marked as external 31 | !link.download && // not download link 32 | !isModifiedEvent(event) && // not a modifier key 33 | !event.defaultPrevented // click was not cancelled 34 | ); 35 | } 36 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "ESNext", 4 | "moduleResolution": "bundler", 5 | "lib": ["ESNext", "DOM"], 6 | "jsx": "react-jsx" 7 | } 8 | } --------------------------------------------------------------------------------