├── .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 |
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 | {
161 | alert("Do something before navigating away");
162 | router.push("/about");
163 | }}
164 | >
165 | Go to /about
166 |
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 |
15 | Make the
16 |
17 |
18 |
19 | Transition
20 |
21 |
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 |
17 | Next.js —
18 |
19 |
20 |
21 | Transition
22 |
23 |
24 |
25 | Router
26 |
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 |
10 | back
11 |
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 | {
13 | alert("Do something before navigating away");
14 | router.push("/demo");
15 | }}
16 | >
17 | push
18 |
19 | {
22 | alert("Do something before navigating away");
23 | router.replace("/demo");
24 | }}
25 | >
26 | replace
27 |
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 | }
--------------------------------------------------------------------------------