├── .gitignore
├── .vscode
└── settings.json
├── README.md
├── app
├── favicon.ico
├── layout.tsx
└── new
│ ├── page.tsx
│ └── settings
│ ├── display
│ └── page.tsx
│ ├── layout.tsx
│ └── profile
│ └── page.tsx
├── components
├── cards.tsx
├── home-layout.tsx
├── minimal.tsx
├── navbar.tsx
├── settings-layout.tsx
└── table.tsx
├── lib
└── db.ts
├── next.config.js
├── package.json
├── pages
├── _app.tsx
├── _document.tsx
├── api
│ └── submit.ts
├── index.tsx
└── settings
│ ├── display.tsx
│ └── profile.tsx
├── pnpm-lock.yaml
├── postcss.config.js
├── styles
└── globals.css
├── tailwind.config.js
└── tsconfig.json
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 | /.pnp
6 | .pnp.js
7 |
8 | # testing
9 | /coverage
10 |
11 | # next.js
12 | /.next/
13 | /out/
14 |
15 | # production
16 | /build
17 |
18 | # misc
19 | .DS_Store
20 | *.pem
21 |
22 | # debug
23 | npm-debug.log*
24 | yarn-debug.log*
25 | yarn-error.log*
26 |
27 | # local env files
28 | .env*.local
29 |
30 | # vercel
31 | .vercel
32 |
33 | # typescript
34 | *.tsbuildinfo
35 | next-env.d.ts
36 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "typescript.tsdk": "node_modules/typescript/lib"
3 | }
4 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Next.js Metamorphosis (React Summit 2023)
2 |
3 | [🎥 **Watch Talk**](https://www.youtube.com/watch?v=5HaX0Q_Do1I)
4 |
5 | This was the source for my talk about React Summit 2023. In the talk, I show how to incrementally adopt to new App Router, and some of the benefits of using the new router versus the previous Pages Router approach.
6 |
7 | This includes:
8 |
9 | - Simplified data fetching
10 | 1. `getInitialProps` (Pages Router)
11 | 1. `getStaticProps` / `getServerSideProps` (Pages Router)
12 | 1. `async` / `await` (App Router)
13 | - Colocating data fetching with components (React Server Components)
14 | - Defining layouts through the file system (`layout.tsx`)
15 | - Granular control over data freshness (`revalidate` for components)
16 | - Out-of-order streaming of data (Suspense for SSR)
17 | - Simplified form submissions (Server Actions)
18 |
19 | ## `NEXT_DATA` vs RSC Payload
20 |
21 | The data fetching methods in the Pages Router, like `getServerSideProps`, forward `props` to the default exported React component. This `NEXT_DATA` payload also includes rendering instructions.
22 |
23 | Inside the App Router, there is no longer `NEXT_DATA`. Instead, the React Server Components payload includes the already rendered result, meaning no additional rendering work needs to be done on the client. This also means that the rendering instructions remain on the server, and just need to be "slotted" into the right place.
24 |
25 | You'll also notice that in the App Router, the baseline client-side JavaScript of Next.js + React is smaller than the Pages Router.
26 |
--------------------------------------------------------------------------------
/app/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/leerob/nextjs-metamorphosis/a0b60b58af01414888ee99721b48066f21ec5014/app/favicon.ico
--------------------------------------------------------------------------------
/app/layout.tsx:
--------------------------------------------------------------------------------
1 | import 'styles/globals.css';
2 | import Navbar from 'components/navbar';
3 |
4 | export default function RootLayout({
5 | children,
6 | }: {
7 | children: React.ReactNode;
8 | }) {
9 | return (
10 |
11 |
12 |
13 | {children}
14 |
15 |
16 | );
17 | }
18 |
--------------------------------------------------------------------------------
/app/new/page.tsx:
--------------------------------------------------------------------------------
1 | import Cards from 'components/cards';
2 | import Layout from 'components/home-layout';
3 | import Table from 'components/table';
4 | import { Suspense } from 'react';
5 |
6 | export default async function HomePage() {
7 | return (
8 |
9 | }>
10 |
11 |
12 |
13 |
14 | );
15 | }
16 |
--------------------------------------------------------------------------------
/app/new/settings/display/page.tsx:
--------------------------------------------------------------------------------
1 | import MinimalMode from 'components/minimal';
2 | import Table from 'components/table';
3 |
4 | export default function DisplayPage() {
5 | return (
6 |
7 |
8 |
9 | );
10 | }
11 |
--------------------------------------------------------------------------------
/app/new/settings/layout.tsx:
--------------------------------------------------------------------------------
1 | import { Layout } from 'components/settings-layout';
2 |
3 | export default function SettingsLayout({
4 | children,
5 | }: {
6 | children: React.ReactNode;
7 | }) {
8 | return {children};
9 | }
10 |
--------------------------------------------------------------------------------
/app/new/settings/profile/page.tsx:
--------------------------------------------------------------------------------
1 | import { Bio, Button, Name } from 'components/settings-layout';
2 |
3 | export default function ProfilePage() {
4 | async function handleSubmit(formData: FormData) {
5 | 'use server';
6 | const name = formData.get('name');
7 | const bio = formData.get('bio');
8 | console.log(name, bio);
9 | }
10 |
11 | return (
12 |
17 | );
18 | }
19 |
--------------------------------------------------------------------------------
/components/cards.tsx:
--------------------------------------------------------------------------------
1 | import { getPlaceholderCardData, getCardData, Card, Icon } from 'lib/db';
2 |
3 | export default function Cards({
4 | data,
5 | loading,
6 | slow,
7 | }: {
8 | data?: Card[];
9 | loading?: boolean;
10 | slow?: boolean;
11 | }) {
12 | if (data === undefined) {
13 | data = getPlaceholderCardData();
14 | }
15 | if (slow === true) {
16 | // data = await getCardData(2000);
17 | }
18 |
19 | return (
20 |
21 | {data.map((card) => (
22 |
23 | ))}
24 |
25 | );
26 | }
27 |
28 | function Card({ card, isLoading }: { card: any; isLoading?: boolean }) {
29 | const getIcon = (icon: Icon) => {
30 | switch (icon) {
31 | case Icon.Revenue:
32 | return (
33 |
48 | );
49 | case Icon.Subscriptions:
50 | return (
51 |
68 | );
69 | case Icon.Sales:
70 | return (
71 |
86 | );
87 | case Icon.ActiveNow:
88 | return (
89 |
103 | );
104 | default:
105 | return null;
106 | }
107 | };
108 |
109 | return (
110 |
111 |
112 | {isLoading ? (
113 |
114 | ) : (
115 | <>
116 |
{card.title}
117 | {getIcon(card.icon)}
118 | >
119 | )}
120 |
121 |
122 | {isLoading ? (
123 | <>
124 |
125 |
126 | >
127 | ) : (
128 | <>
129 |
{card.value}
130 |
{card.description}
131 | >
132 | )}
133 |
134 |
135 | );
136 | }
137 |
--------------------------------------------------------------------------------
/components/home-layout.tsx:
--------------------------------------------------------------------------------
1 | import Navbar from './navbar';
2 |
3 | export default function Layout({ children }: { children: React.ReactNode }) {
4 | return (
5 | <>
6 |
7 |
8 |
9 |
Lee's Account
10 |
View your recent invoices.
11 |
12 |
17 | {children}
18 |
19 | >
20 | );
21 | }
22 |
--------------------------------------------------------------------------------
/components/minimal.tsx:
--------------------------------------------------------------------------------
1 | export default function MinimalMode({
2 | children,
3 | }: {
4 | children: React.ReactNode;
5 | }) {
6 | return (
7 | <>
8 |
9 |
10 |
13 |
14 | Display only the most important information for invoices.
15 |
16 |
17 |
23 |
24 |
25 |
{children}
26 |
27 |
28 | >
29 | );
30 | }
31 |
--------------------------------------------------------------------------------
/components/navbar.tsx:
--------------------------------------------------------------------------------
1 | import Link from 'next/link';
2 |
3 | export default function Navbar() {
4 | return (
5 |
6 |
16 |
17 | );
18 | }
19 |
--------------------------------------------------------------------------------
/components/settings-layout.tsx:
--------------------------------------------------------------------------------
1 | 'use client';
2 |
3 | import Navbar from './navbar';
4 | import Link from 'next/link';
5 | import { usePathname } from 'next/navigation';
6 |
7 | function classNames(...classes: any) {
8 | return classes.filter(Boolean).join(' ');
9 | }
10 |
11 | export function Layout({ children }: { children: React.ReactNode }) {
12 | const pathname = usePathname() || '';
13 | const settingsUrl = pathname.includes('/new')
14 | ? '/new/settings/profile'
15 | : '/settings/profile';
16 | const displayUrl = pathname.includes('/new')
17 | ? '/new/settings/display'
18 | : '/settings/display';
19 |
20 | return (
21 | <>
22 |
23 |
24 |
25 |
Settings
26 |
27 | Manage your account settings and set e-mail preferences.
28 |
29 |
30 |
35 |
36 |
78 |
81 |
82 |
83 | >
84 | );
85 | }
86 |
87 | export function Name() {
88 | return (
89 |
90 |
93 |
99 |
100 | This is your public display name. It can be your real name or a
101 | pseudonym. You can only change this once every 30 days.
102 |
103 |
104 | );
105 | }
106 |
107 | export function Bio() {
108 | return (
109 |
110 |
113 |
119 |
120 | You can @mention other users and organizations to link to
121 | them.
122 |
123 |
124 | );
125 | }
126 |
127 | export function Button(props: any) {
128 | return (
129 |
133 | );
134 | }
135 |
--------------------------------------------------------------------------------
/components/table.tsx:
--------------------------------------------------------------------------------
1 | import { getTableData, Status } from 'lib/db';
2 |
3 | export default function Table() {
4 | const tableData = getTableData();
5 |
6 | return (
7 |
8 |
9 |
10 |
11 | Invoice
12 | |
13 |
14 | Status
15 | |
16 |
17 | Method
18 | |
19 |
20 | Amount
21 | |
22 |
23 |
24 |
25 | {tableData.map((rowData, index) => (
26 |
27 | ))}
28 |
29 |
30 | );
31 | }
32 |
33 | function TableRow({
34 | invoice,
35 | status,
36 | method,
37 | amount,
38 | }: {
39 | invoice: string;
40 | status: Status;
41 | method: string;
42 | amount: string;
43 | }) {
44 | let statusBadge;
45 | switch (status) {
46 | case Status.PENDING:
47 | statusBadge = ;
48 | break;
49 | case Status.UNPAID:
50 | statusBadge = ;
51 | break;
52 | case Status.PAID:
53 | statusBadge = ;
54 | break;
55 | default:
56 | statusBadge = null;
57 | break;
58 | }
59 |
60 | return (
61 |
62 | {invoice} |
63 | {statusBadge} |
64 | {method} |
65 | {amount} |
66 |
67 | );
68 | }
69 |
70 | function PendingBadge() {
71 | return (
72 |
73 | Pending
74 |
75 | );
76 | }
77 |
78 | function UnpaidBadge() {
79 | return (
80 |
81 | Unpaid
82 |
83 | );
84 | }
85 |
86 | function PaidBadge() {
87 | return (
88 |
89 | Paid
90 |
91 | );
92 | }
93 |
--------------------------------------------------------------------------------
/lib/db.ts:
--------------------------------------------------------------------------------
1 | export enum Icon {
2 | Revenue = 'revenue',
3 | Subscriptions = 'subscriptions',
4 | Sales = 'sales',
5 | ActiveNow = 'active-now',
6 | }
7 |
8 | export type Card = {
9 | id: number;
10 | title: string;
11 | icon: Icon;
12 | value: string;
13 | description: string;
14 | };
15 |
16 | export async function getCardData(delay?: number) {
17 | if (delay) {
18 | await new Promise((resolve) => setTimeout(resolve, delay));
19 | }
20 |
21 | return [
22 | {
23 | id: 1,
24 | title: 'Total Revenue',
25 | icon: Icon.Revenue,
26 | value: '$45,231.89',
27 | description: '+20.1% from last month',
28 | },
29 | {
30 | id: 2,
31 | title: 'Subscriptions',
32 | icon: Icon.Subscriptions,
33 | value: '+2350',
34 | description: '+180.1% from last month',
35 | },
36 | {
37 | id: 3,
38 | title: 'Sales',
39 | icon: Icon.Sales,
40 | value: '+12,234',
41 | description: '+19% from last month',
42 | },
43 | {
44 | id: 4,
45 | title: 'Active Now',
46 | icon: Icon.ActiveNow,
47 | value: '+573',
48 | description: '+201 since last hour',
49 | },
50 | ];
51 | }
52 |
53 | export function getPlaceholderCardData() {
54 | return [
55 | {
56 | id: 1,
57 | title: '—',
58 | icon: Icon.Revenue,
59 | value: '?',
60 | description: ' ',
61 | },
62 | {
63 | id: 2,
64 | title: '—',
65 | icon: Icon.Subscriptions,
66 | value: '?',
67 | description: ' ',
68 | },
69 | {
70 | id: 3,
71 | title: '—',
72 | icon: Icon.Sales,
73 | value: '?',
74 | description: ' ',
75 | },
76 | {
77 | id: 4,
78 | title: '—',
79 | icon: Icon.ActiveNow,
80 | value: '?',
81 | description: ' ',
82 | },
83 | ];
84 | }
85 |
86 | export enum Status {
87 | PENDING = 'PENDING',
88 | UNPAID = 'UNPAID',
89 | PAID = 'PAID',
90 | }
91 |
92 | export function getTableData() {
93 | return [
94 | {
95 | invoice: 'INV001',
96 | status: Status.PAID,
97 | method: 'Credit Card',
98 | amount: '$250.00',
99 | },
100 | {
101 | invoice: 'INV002',
102 | status: Status.PENDING,
103 | method: 'PayPal',
104 | amount: '$150.00',
105 | },
106 | {
107 | invoice: 'INV003',
108 | status: Status.UNPAID,
109 | method: 'Bank Transfer',
110 | amount: '$350.00',
111 | },
112 | {
113 | invoice: 'INV004',
114 | status: Status.PAID,
115 | method: 'Credit Card',
116 | amount: '$450.00',
117 | },
118 | {
119 | invoice: 'INV005',
120 | status: Status.PAID,
121 | method: 'PayPal',
122 | amount: '$550.00',
123 | },
124 | {
125 | invoice: 'INV006',
126 | status: Status.PENDING,
127 | method: 'Bank Transfer',
128 | amount: '$200.00',
129 | },
130 | {
131 | invoice: 'INV007',
132 | status: Status.UNPAID,
133 | method: 'Credit Card',
134 | amount: '$300.00',
135 | },
136 | ];
137 | }
138 |
--------------------------------------------------------------------------------
/next.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('next').NextConfig} */
2 | const nextConfig = {
3 | experimental: {
4 | serverActions: true,
5 | },
6 | };
7 |
8 | module.exports = nextConfig;
9 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "private": true,
3 | "scripts": {
4 | "dev": "next dev",
5 | "build": "next build",
6 | "start": "next start"
7 | },
8 | "dependencies": {
9 | "@types/node": "20.2.5",
10 | "@types/react": "18.2.8",
11 | "@types/react-dom": "18.2.4",
12 | "autoprefixer": "^10.4.14",
13 | "next": "13.4.4",
14 | "postcss": "^8.4.24",
15 | "react": "18.2.0",
16 | "react-dom": "18.2.0",
17 | "tailwindcss": "^3.3.2",
18 | "typescript": "5.1.3"
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/pages/_app.tsx:
--------------------------------------------------------------------------------
1 | import 'styles/globals.css';
2 | import type { AppProps } from 'next/app';
3 |
4 | export default function App({ Component, pageProps }: AppProps) {
5 | return ;
6 | }
7 |
--------------------------------------------------------------------------------
/pages/_document.tsx:
--------------------------------------------------------------------------------
1 | import { Html, Head, Main, NextScript } from 'next/document'
2 |
3 | export default function Document() {
4 | return (
5 |
6 |
8 |
9 |
10 |
11 |
12 | )
13 | }
14 |
--------------------------------------------------------------------------------
/pages/api/submit.ts:
--------------------------------------------------------------------------------
1 | import type { NextApiRequest, NextApiResponse } from 'next';
2 |
3 | type ResponseData = {
4 | message: string;
5 | };
6 |
7 | export default function handler(
8 | req: NextApiRequest,
9 | res: NextApiResponse
10 | ) {
11 | console.log(req.body); // { name: 'Lee Rob' }
12 |
13 | res.status(200).json({ message: 'Success!' });
14 | }
15 |
--------------------------------------------------------------------------------
/pages/index.tsx:
--------------------------------------------------------------------------------
1 | import Layout from 'components/home-layout';
2 | import Cards from 'components/cards';
3 | import Table from 'components/table';
4 | import { getCardData, Card } from 'lib/db';
5 |
6 | HomePage.getInitialProps = async () => {
7 | const cardData = await getCardData(2000);
8 | return { cardData };
9 | };
10 |
11 | export default function HomePage({ cardData }: { cardData: Card[] }) {
12 | return (
13 |
14 |
15 |
16 |
17 | );
18 | }
19 |
--------------------------------------------------------------------------------
/pages/settings/display.tsx:
--------------------------------------------------------------------------------
1 | import MinimalMode from 'components/minimal';
2 | import { Layout } from 'components/settings-layout';
3 | import Table from 'components/table';
4 |
5 | export default function DisplayPage() {
6 | return (
7 |
8 |
9 |
10 |
11 |
12 | );
13 | }
14 |
--------------------------------------------------------------------------------
/pages/settings/profile.tsx:
--------------------------------------------------------------------------------
1 | import { Bio, Button, Layout, Name } from 'components/settings-layout';
2 |
3 | export default function ProfilePage() {
4 | function handleSubmit(event: React.FormEvent) {
5 | event.preventDefault();
6 | const form = event.currentTarget;
7 | const nameElement = form.elements.namedItem('name') as HTMLInputElement;
8 | const bioElement = form.elements.namedItem('bio') as HTMLInputElement;
9 |
10 | fetch('/api/submit', {
11 | method: 'POST',
12 | headers: {
13 | 'Content-Type': 'application/json',
14 | },
15 | body: JSON.stringify({
16 | name: nameElement.value,
17 | bio: bioElement.value,
18 | }),
19 | });
20 | }
21 |
22 | return (
23 |
24 |
29 |
30 | );
31 | }
32 |
--------------------------------------------------------------------------------
/pnpm-lock.yaml:
--------------------------------------------------------------------------------
1 | lockfileVersion: 5.4
2 |
3 | specifiers:
4 | '@types/node': 20.2.5
5 | '@types/react': 18.2.8
6 | '@types/react-dom': 18.2.4
7 | autoprefixer: ^10.4.14
8 | next: 13.4.4
9 | postcss: ^8.4.24
10 | react: 18.2.0
11 | react-dom: 18.2.0
12 | tailwindcss: ^3.3.2
13 | typescript: 5.1.3
14 |
15 | dependencies:
16 | '@types/node': 20.2.5
17 | '@types/react': 18.2.8
18 | '@types/react-dom': 18.2.4
19 | autoprefixer: 10.4.14_postcss@8.4.24
20 | next: 13.4.4_biqbaboplfbrettd7655fr4n2y
21 | postcss: 8.4.24
22 | react: 18.2.0
23 | react-dom: 18.2.0_react@18.2.0
24 | tailwindcss: 3.3.2
25 | typescript: 5.1.3
26 |
27 | packages:
28 |
29 | /@alloc/quick-lru/5.2.0:
30 | resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
31 | engines: {node: '>=10'}
32 | dev: false
33 |
34 | /@jridgewell/gen-mapping/0.3.3:
35 | resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==}
36 | engines: {node: '>=6.0.0'}
37 | dependencies:
38 | '@jridgewell/set-array': 1.1.2
39 | '@jridgewell/sourcemap-codec': 1.4.15
40 | '@jridgewell/trace-mapping': 0.3.18
41 | dev: false
42 |
43 | /@jridgewell/resolve-uri/3.1.0:
44 | resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==}
45 | engines: {node: '>=6.0.0'}
46 | dev: false
47 |
48 | /@jridgewell/set-array/1.1.2:
49 | resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==}
50 | engines: {node: '>=6.0.0'}
51 | dev: false
52 |
53 | /@jridgewell/sourcemap-codec/1.4.14:
54 | resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==}
55 | dev: false
56 |
57 | /@jridgewell/sourcemap-codec/1.4.15:
58 | resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
59 | dev: false
60 |
61 | /@jridgewell/trace-mapping/0.3.18:
62 | resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==}
63 | dependencies:
64 | '@jridgewell/resolve-uri': 3.1.0
65 | '@jridgewell/sourcemap-codec': 1.4.14
66 | dev: false
67 |
68 | /@next/env/13.4.4:
69 | resolution: {integrity: sha512-q/y7VZj/9YpgzDe64Zi6rY1xPizx80JjlU2BTevlajtaE3w1LqweH1gGgxou2N7hdFosXHjGrI4OUvtFXXhGLg==}
70 | dev: false
71 |
72 | /@next/swc-darwin-arm64/13.4.4:
73 | resolution: {integrity: sha512-xfjgXvp4KalNUKZMHmsFxr1Ug+aGmmO6NWP0uoh4G3WFqP/mJ1xxfww0gMOeMeSq/Jyr5k7DvoZ2Pv+XOITTtw==}
74 | engines: {node: '>= 10'}
75 | cpu: [arm64]
76 | os: [darwin]
77 | requiresBuild: true
78 | dev: false
79 | optional: true
80 |
81 | /@next/swc-darwin-x64/13.4.4:
82 | resolution: {integrity: sha512-ZY9Ti1hkIwJsxGus3nlubIkvYyB0gNOYxKrfsOrLEqD0I2iCX8D7w8v6QQZ2H+dDl6UT29oeEUdDUNGk4UEpfg==}
83 | engines: {node: '>= 10'}
84 | cpu: [x64]
85 | os: [darwin]
86 | requiresBuild: true
87 | dev: false
88 | optional: true
89 |
90 | /@next/swc-linux-arm64-gnu/13.4.4:
91 | resolution: {integrity: sha512-+KZnDeMShYkpkqAvGCEDeqYTRADJXc6SY1jWXz+Uo6qWQO/Jd9CoyhTJwRSxvQA16MoYzvILkGaDqirkRNctyA==}
92 | engines: {node: '>= 10'}
93 | cpu: [arm64]
94 | os: [linux]
95 | requiresBuild: true
96 | dev: false
97 | optional: true
98 |
99 | /@next/swc-linux-arm64-musl/13.4.4:
100 | resolution: {integrity: sha512-evC1twrny2XDT4uOftoubZvW3EG0zs0ZxMwEtu/dDGVRO5n5pT48S8qqEIBGBUZYu/Xx4zzpOkIxx1vpWdE+9A==}
101 | engines: {node: '>= 10'}
102 | cpu: [arm64]
103 | os: [linux]
104 | requiresBuild: true
105 | dev: false
106 | optional: true
107 |
108 | /@next/swc-linux-x64-gnu/13.4.4:
109 | resolution: {integrity: sha512-PX706XcCHr2FfkyhP2lpf+pX/tUvq6/ke7JYnnr0ykNdEMo+sb7cC/o91gnURh4sPYSiZJhsF2gbIqg9rciOHQ==}
110 | engines: {node: '>= 10'}
111 | cpu: [x64]
112 | os: [linux]
113 | requiresBuild: true
114 | dev: false
115 | optional: true
116 |
117 | /@next/swc-linux-x64-musl/13.4.4:
118 | resolution: {integrity: sha512-TKUUx3Ftd95JlHV6XagEnqpT204Y+IsEa3awaYIjayn0MOGjgKZMZibqarK3B1FsMSPaieJf2FEAcu9z0yT5aA==}
119 | engines: {node: '>= 10'}
120 | cpu: [x64]
121 | os: [linux]
122 | requiresBuild: true
123 | dev: false
124 | optional: true
125 |
126 | /@next/swc-win32-arm64-msvc/13.4.4:
127 | resolution: {integrity: sha512-FP8AadgSq4+HPtim7WBkCMGbhr5vh9FePXiWx9+YOdjwdQocwoCK5ZVC3OW8oh3TWth6iJ0AXJ/yQ1q1cwSZ3A==}
128 | engines: {node: '>= 10'}
129 | cpu: [arm64]
130 | os: [win32]
131 | requiresBuild: true
132 | dev: false
133 | optional: true
134 |
135 | /@next/swc-win32-ia32-msvc/13.4.4:
136 | resolution: {integrity: sha512-3WekVmtuA2MCdcAOrgrI+PuFiFURtSyyrN1I3UPtS0ckR2HtLqyqmS334Eulf15g1/bdwMteePdK363X/Y9JMg==}
137 | engines: {node: '>= 10'}
138 | cpu: [ia32]
139 | os: [win32]
140 | requiresBuild: true
141 | dev: false
142 | optional: true
143 |
144 | /@next/swc-win32-x64-msvc/13.4.4:
145 | resolution: {integrity: sha512-AHRITu/CrlQ+qzoqQtEMfaTu7GHaQ6bziQln/pVWpOYC1wU+Mq6VQQFlsDtMCnDztPZtppAXdvvbNS7pcfRzlw==}
146 | engines: {node: '>= 10'}
147 | cpu: [x64]
148 | os: [win32]
149 | requiresBuild: true
150 | dev: false
151 | optional: true
152 |
153 | /@nodelib/fs.scandir/2.1.5:
154 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
155 | engines: {node: '>= 8'}
156 | dependencies:
157 | '@nodelib/fs.stat': 2.0.5
158 | run-parallel: 1.2.0
159 | dev: false
160 |
161 | /@nodelib/fs.stat/2.0.5:
162 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
163 | engines: {node: '>= 8'}
164 | dev: false
165 |
166 | /@nodelib/fs.walk/1.2.8:
167 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
168 | engines: {node: '>= 8'}
169 | dependencies:
170 | '@nodelib/fs.scandir': 2.1.5
171 | fastq: 1.15.0
172 | dev: false
173 |
174 | /@swc/helpers/0.5.1:
175 | resolution: {integrity: sha512-sJ902EfIzn1Fa+qYmjdQqh8tPsoxyBz+8yBKC2HKUxyezKJFwPGOn7pv4WY6QuQW//ySQi5lJjA/ZT9sNWWNTg==}
176 | dependencies:
177 | tslib: 2.5.2
178 | dev: false
179 |
180 | /@types/node/20.2.5:
181 | resolution: {integrity: sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==}
182 | dev: false
183 |
184 | /@types/prop-types/15.7.5:
185 | resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==}
186 | dev: false
187 |
188 | /@types/react-dom/18.2.4:
189 | resolution: {integrity: sha512-G2mHoTMTL4yoydITgOGwWdWMVd8sNgyEP85xVmMKAPUBwQWm9wBPQUmvbeF4V3WBY1P7mmL4BkjQ0SqUpf1snw==}
190 | dependencies:
191 | '@types/react': 18.2.8
192 | dev: false
193 |
194 | /@types/react/18.2.8:
195 | resolution: {integrity: sha512-lTyWUNrd8ntVkqycEEplasWy2OxNlShj3zqS0LuB1ENUGis5HodmhM7DtCoUGbxj3VW/WsGA0DUhpG6XrM7gPA==}
196 | dependencies:
197 | '@types/prop-types': 15.7.5
198 | '@types/scheduler': 0.16.3
199 | csstype: 3.1.2
200 | dev: false
201 |
202 | /@types/scheduler/0.16.3:
203 | resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==}
204 | dev: false
205 |
206 | /any-promise/1.3.0:
207 | resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==}
208 | dev: false
209 |
210 | /anymatch/3.1.3:
211 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
212 | engines: {node: '>= 8'}
213 | dependencies:
214 | normalize-path: 3.0.0
215 | picomatch: 2.3.1
216 | dev: false
217 |
218 | /arg/5.0.2:
219 | resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
220 | dev: false
221 |
222 | /autoprefixer/10.4.14_postcss@8.4.24:
223 | resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==}
224 | engines: {node: ^10 || ^12 || >=14}
225 | hasBin: true
226 | peerDependencies:
227 | postcss: ^8.1.0
228 | dependencies:
229 | browserslist: 4.21.7
230 | caniuse-lite: 1.0.30001492
231 | fraction.js: 4.2.0
232 | normalize-range: 0.1.2
233 | picocolors: 1.0.0
234 | postcss: 8.4.24
235 | postcss-value-parser: 4.2.0
236 | dev: false
237 |
238 | /balanced-match/1.0.2:
239 | resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
240 | dev: false
241 |
242 | /binary-extensions/2.2.0:
243 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
244 | engines: {node: '>=8'}
245 | dev: false
246 |
247 | /brace-expansion/1.1.11:
248 | resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
249 | dependencies:
250 | balanced-match: 1.0.2
251 | concat-map: 0.0.1
252 | dev: false
253 |
254 | /braces/3.0.2:
255 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
256 | engines: {node: '>=8'}
257 | dependencies:
258 | fill-range: 7.0.1
259 | dev: false
260 |
261 | /browserslist/4.21.7:
262 | resolution: {integrity: sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==}
263 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
264 | hasBin: true
265 | dependencies:
266 | caniuse-lite: 1.0.30001492
267 | electron-to-chromium: 1.4.417
268 | node-releases: 2.0.12
269 | update-browserslist-db: 1.0.11_browserslist@4.21.7
270 | dev: false
271 |
272 | /busboy/1.6.0:
273 | resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==}
274 | engines: {node: '>=10.16.0'}
275 | dependencies:
276 | streamsearch: 1.1.0
277 | dev: false
278 |
279 | /camelcase-css/2.0.1:
280 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
281 | engines: {node: '>= 6'}
282 | dev: false
283 |
284 | /caniuse-lite/1.0.30001492:
285 | resolution: {integrity: sha512-2efF8SAZwgAX1FJr87KWhvuJxnGJKOnctQa8xLOskAXNXq8oiuqgl6u1kk3fFpsp3GgvzlRjiK1sl63hNtFADw==}
286 | dev: false
287 |
288 | /chokidar/3.5.3:
289 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
290 | engines: {node: '>= 8.10.0'}
291 | dependencies:
292 | anymatch: 3.1.3
293 | braces: 3.0.2
294 | glob-parent: 5.1.2
295 | is-binary-path: 2.1.0
296 | is-glob: 4.0.3
297 | normalize-path: 3.0.0
298 | readdirp: 3.6.0
299 | optionalDependencies:
300 | fsevents: 2.3.2
301 | dev: false
302 |
303 | /client-only/0.0.1:
304 | resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
305 | dev: false
306 |
307 | /commander/4.1.1:
308 | resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
309 | engines: {node: '>= 6'}
310 | dev: false
311 |
312 | /concat-map/0.0.1:
313 | resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=}
314 | dev: false
315 |
316 | /cssesc/3.0.0:
317 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
318 | engines: {node: '>=4'}
319 | hasBin: true
320 | dev: false
321 |
322 | /csstype/3.1.2:
323 | resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==}
324 | dev: false
325 |
326 | /didyoumean/1.2.2:
327 | resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==}
328 | dev: false
329 |
330 | /dlv/1.1.3:
331 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==}
332 | dev: false
333 |
334 | /electron-to-chromium/1.4.417:
335 | resolution: {integrity: sha512-8rY8HdCxuSVY8wku3i/eDac4g1b4cSbruzocenrqBlzqruAZYHjQCHIjC66dLR9DXhEHTojsC4EjhZ8KmzwXqA==}
336 | dev: false
337 |
338 | /escalade/3.1.1:
339 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
340 | engines: {node: '>=6'}
341 | dev: false
342 |
343 | /fast-glob/3.2.12:
344 | resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==}
345 | engines: {node: '>=8.6.0'}
346 | dependencies:
347 | '@nodelib/fs.stat': 2.0.5
348 | '@nodelib/fs.walk': 1.2.8
349 | glob-parent: 5.1.2
350 | merge2: 1.4.1
351 | micromatch: 4.0.5
352 | dev: false
353 |
354 | /fastq/1.15.0:
355 | resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==}
356 | dependencies:
357 | reusify: 1.0.4
358 | dev: false
359 |
360 | /fill-range/7.0.1:
361 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
362 | engines: {node: '>=8'}
363 | dependencies:
364 | to-regex-range: 5.0.1
365 | dev: false
366 |
367 | /fraction.js/4.2.0:
368 | resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==}
369 | dev: false
370 |
371 | /fs.realpath/1.0.0:
372 | resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
373 | dev: false
374 |
375 | /fsevents/2.3.2:
376 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
377 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
378 | os: [darwin]
379 | requiresBuild: true
380 | dev: false
381 | optional: true
382 |
383 | /function-bind/1.1.1:
384 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
385 | dev: false
386 |
387 | /glob-parent/5.1.2:
388 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
389 | engines: {node: '>= 6'}
390 | dependencies:
391 | is-glob: 4.0.3
392 | dev: false
393 |
394 | /glob-parent/6.0.2:
395 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
396 | engines: {node: '>=10.13.0'}
397 | dependencies:
398 | is-glob: 4.0.3
399 | dev: false
400 |
401 | /glob/7.1.6:
402 | resolution: {integrity: sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==}
403 | dependencies:
404 | fs.realpath: 1.0.0
405 | inflight: 1.0.6
406 | inherits: 2.0.4
407 | minimatch: 3.1.2
408 | once: 1.4.0
409 | path-is-absolute: 1.0.1
410 | dev: false
411 |
412 | /has/1.0.3:
413 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
414 | engines: {node: '>= 0.4.0'}
415 | dependencies:
416 | function-bind: 1.1.1
417 | dev: false
418 |
419 | /inflight/1.0.6:
420 | resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
421 | dependencies:
422 | once: 1.4.0
423 | wrappy: 1.0.2
424 | dev: false
425 |
426 | /inherits/2.0.4:
427 | resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
428 | dev: false
429 |
430 | /is-binary-path/2.1.0:
431 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
432 | engines: {node: '>=8'}
433 | dependencies:
434 | binary-extensions: 2.2.0
435 | dev: false
436 |
437 | /is-core-module/2.12.1:
438 | resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==}
439 | dependencies:
440 | has: 1.0.3
441 | dev: false
442 |
443 | /is-extglob/2.1.1:
444 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
445 | engines: {node: '>=0.10.0'}
446 | dev: false
447 |
448 | /is-glob/4.0.3:
449 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
450 | engines: {node: '>=0.10.0'}
451 | dependencies:
452 | is-extglob: 2.1.1
453 | dev: false
454 |
455 | /is-number/7.0.0:
456 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
457 | engines: {node: '>=0.12.0'}
458 | dev: false
459 |
460 | /jiti/1.18.2:
461 | resolution: {integrity: sha512-QAdOptna2NYiSSpv0O/BwoHBSmz4YhpzJHyi+fnMRTXFjp7B8i/YG5Z8IfusxB1ufjcD2Sre1F3R+nX3fvy7gg==}
462 | hasBin: true
463 | dev: false
464 |
465 | /js-tokens/4.0.0:
466 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
467 | dev: false
468 |
469 | /lilconfig/2.1.0:
470 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==}
471 | engines: {node: '>=10'}
472 | dev: false
473 |
474 | /lines-and-columns/1.2.4:
475 | resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
476 | dev: false
477 |
478 | /loose-envify/1.4.0:
479 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
480 | hasBin: true
481 | dependencies:
482 | js-tokens: 4.0.0
483 | dev: false
484 |
485 | /merge2/1.4.1:
486 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
487 | engines: {node: '>= 8'}
488 | dev: false
489 |
490 | /micromatch/4.0.5:
491 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
492 | engines: {node: '>=8.6'}
493 | dependencies:
494 | braces: 3.0.2
495 | picomatch: 2.3.1
496 | dev: false
497 |
498 | /minimatch/3.1.2:
499 | resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
500 | dependencies:
501 | brace-expansion: 1.1.11
502 | dev: false
503 |
504 | /mz/2.7.0:
505 | resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
506 | dependencies:
507 | any-promise: 1.3.0
508 | object-assign: 4.1.1
509 | thenify-all: 1.6.0
510 | dev: false
511 |
512 | /nanoid/3.3.6:
513 | resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==}
514 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
515 | hasBin: true
516 | dev: false
517 |
518 | /next/13.4.4_biqbaboplfbrettd7655fr4n2y:
519 | resolution: {integrity: sha512-C5S0ysM0Ily9McL4Jb48nOQHT1BukOWI59uC3X/xCMlYIh9rJZCv7nzG92J6e1cOBqQbKovlpgvHWFmz4eKKEA==}
520 | engines: {node: '>=16.8.0'}
521 | hasBin: true
522 | peerDependencies:
523 | '@opentelemetry/api': ^1.1.0
524 | fibers: '>= 3.1.0'
525 | react: ^18.2.0
526 | react-dom: ^18.2.0
527 | sass: ^1.3.0
528 | peerDependenciesMeta:
529 | '@opentelemetry/api':
530 | optional: true
531 | fibers:
532 | optional: true
533 | sass:
534 | optional: true
535 | dependencies:
536 | '@next/env': 13.4.4
537 | '@swc/helpers': 0.5.1
538 | busboy: 1.6.0
539 | caniuse-lite: 1.0.30001492
540 | postcss: 8.4.14
541 | react: 18.2.0
542 | react-dom: 18.2.0_react@18.2.0
543 | styled-jsx: 5.1.1_react@18.2.0
544 | zod: 3.21.4
545 | optionalDependencies:
546 | '@next/swc-darwin-arm64': 13.4.4
547 | '@next/swc-darwin-x64': 13.4.4
548 | '@next/swc-linux-arm64-gnu': 13.4.4
549 | '@next/swc-linux-arm64-musl': 13.4.4
550 | '@next/swc-linux-x64-gnu': 13.4.4
551 | '@next/swc-linux-x64-musl': 13.4.4
552 | '@next/swc-win32-arm64-msvc': 13.4.4
553 | '@next/swc-win32-ia32-msvc': 13.4.4
554 | '@next/swc-win32-x64-msvc': 13.4.4
555 | transitivePeerDependencies:
556 | - '@babel/core'
557 | - babel-plugin-macros
558 | dev: false
559 |
560 | /node-releases/2.0.12:
561 | resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==}
562 | dev: false
563 |
564 | /normalize-path/3.0.0:
565 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
566 | engines: {node: '>=0.10.0'}
567 | dev: false
568 |
569 | /normalize-range/0.1.2:
570 | resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
571 | engines: {node: '>=0.10.0'}
572 | dev: false
573 |
574 | /object-assign/4.1.1:
575 | resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
576 | engines: {node: '>=0.10.0'}
577 | dev: false
578 |
579 | /object-hash/3.0.0:
580 | resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==}
581 | engines: {node: '>= 6'}
582 | dev: false
583 |
584 | /once/1.4.0:
585 | resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
586 | dependencies:
587 | wrappy: 1.0.2
588 | dev: false
589 |
590 | /path-is-absolute/1.0.1:
591 | resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
592 | engines: {node: '>=0.10.0'}
593 | dev: false
594 |
595 | /path-parse/1.0.7:
596 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
597 | dev: false
598 |
599 | /picocolors/1.0.0:
600 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
601 | dev: false
602 |
603 | /picomatch/2.3.1:
604 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
605 | engines: {node: '>=8.6'}
606 | dev: false
607 |
608 | /pify/2.3.0:
609 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
610 | engines: {node: '>=0.10.0'}
611 | dev: false
612 |
613 | /pirates/4.0.5:
614 | resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==}
615 | engines: {node: '>= 6'}
616 | dev: false
617 |
618 | /postcss-import/15.1.0_postcss@8.4.24:
619 | resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
620 | engines: {node: '>=14.0.0'}
621 | peerDependencies:
622 | postcss: ^8.0.0
623 | dependencies:
624 | postcss: 8.4.24
625 | postcss-value-parser: 4.2.0
626 | read-cache: 1.0.0
627 | resolve: 1.22.2
628 | dev: false
629 |
630 | /postcss-js/4.0.1_postcss@8.4.24:
631 | resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==}
632 | engines: {node: ^12 || ^14 || >= 16}
633 | peerDependencies:
634 | postcss: ^8.4.21
635 | dependencies:
636 | camelcase-css: 2.0.1
637 | postcss: 8.4.24
638 | dev: false
639 |
640 | /postcss-load-config/4.0.1_postcss@8.4.24:
641 | resolution: {integrity: sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==}
642 | engines: {node: '>= 14'}
643 | peerDependencies:
644 | postcss: '>=8.0.9'
645 | ts-node: '>=9.0.0'
646 | peerDependenciesMeta:
647 | postcss:
648 | optional: true
649 | ts-node:
650 | optional: true
651 | dependencies:
652 | lilconfig: 2.1.0
653 | postcss: 8.4.24
654 | yaml: 2.3.1
655 | dev: false
656 |
657 | /postcss-nested/6.0.1_postcss@8.4.24:
658 | resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==}
659 | engines: {node: '>=12.0'}
660 | peerDependencies:
661 | postcss: ^8.2.14
662 | dependencies:
663 | postcss: 8.4.24
664 | postcss-selector-parser: 6.0.13
665 | dev: false
666 |
667 | /postcss-selector-parser/6.0.13:
668 | resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==}
669 | engines: {node: '>=4'}
670 | dependencies:
671 | cssesc: 3.0.0
672 | util-deprecate: 1.0.2
673 | dev: false
674 |
675 | /postcss-value-parser/4.2.0:
676 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
677 | dev: false
678 |
679 | /postcss/8.4.14:
680 | resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==}
681 | engines: {node: ^10 || ^12 || >=14}
682 | dependencies:
683 | nanoid: 3.3.6
684 | picocolors: 1.0.0
685 | source-map-js: 1.0.2
686 | dev: false
687 |
688 | /postcss/8.4.24:
689 | resolution: {integrity: sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==}
690 | engines: {node: ^10 || ^12 || >=14}
691 | dependencies:
692 | nanoid: 3.3.6
693 | picocolors: 1.0.0
694 | source-map-js: 1.0.2
695 | dev: false
696 |
697 | /queue-microtask/1.2.3:
698 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
699 | dev: false
700 |
701 | /react-dom/18.2.0_react@18.2.0:
702 | resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==}
703 | peerDependencies:
704 | react: ^18.2.0
705 | dependencies:
706 | loose-envify: 1.4.0
707 | react: 18.2.0
708 | scheduler: 0.23.0
709 | dev: false
710 |
711 | /react/18.2.0:
712 | resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==}
713 | engines: {node: '>=0.10.0'}
714 | dependencies:
715 | loose-envify: 1.4.0
716 | dev: false
717 |
718 | /read-cache/1.0.0:
719 | resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==}
720 | dependencies:
721 | pify: 2.3.0
722 | dev: false
723 |
724 | /readdirp/3.6.0:
725 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
726 | engines: {node: '>=8.10.0'}
727 | dependencies:
728 | picomatch: 2.3.1
729 | dev: false
730 |
731 | /resolve/1.22.2:
732 | resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==}
733 | hasBin: true
734 | dependencies:
735 | is-core-module: 2.12.1
736 | path-parse: 1.0.7
737 | supports-preserve-symlinks-flag: 1.0.0
738 | dev: false
739 |
740 | /reusify/1.0.4:
741 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
742 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
743 | dev: false
744 |
745 | /run-parallel/1.2.0:
746 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
747 | dependencies:
748 | queue-microtask: 1.2.3
749 | dev: false
750 |
751 | /scheduler/0.23.0:
752 | resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==}
753 | dependencies:
754 | loose-envify: 1.4.0
755 | dev: false
756 |
757 | /source-map-js/1.0.2:
758 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
759 | engines: {node: '>=0.10.0'}
760 | dev: false
761 |
762 | /streamsearch/1.1.0:
763 | resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==}
764 | engines: {node: '>=10.0.0'}
765 | dev: false
766 |
767 | /styled-jsx/5.1.1_react@18.2.0:
768 | resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==}
769 | engines: {node: '>= 12.0.0'}
770 | peerDependencies:
771 | '@babel/core': '*'
772 | babel-plugin-macros: '*'
773 | react: '>= 16.8.0 || 17.x.x || ^18.0.0-0'
774 | peerDependenciesMeta:
775 | '@babel/core':
776 | optional: true
777 | babel-plugin-macros:
778 | optional: true
779 | dependencies:
780 | client-only: 0.0.1
781 | react: 18.2.0
782 | dev: false
783 |
784 | /sucrase/3.32.0:
785 | resolution: {integrity: sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==}
786 | engines: {node: '>=8'}
787 | hasBin: true
788 | dependencies:
789 | '@jridgewell/gen-mapping': 0.3.3
790 | commander: 4.1.1
791 | glob: 7.1.6
792 | lines-and-columns: 1.2.4
793 | mz: 2.7.0
794 | pirates: 4.0.5
795 | ts-interface-checker: 0.1.13
796 | dev: false
797 |
798 | /supports-preserve-symlinks-flag/1.0.0:
799 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
800 | engines: {node: '>= 0.4'}
801 | dev: false
802 |
803 | /tailwindcss/3.3.2:
804 | resolution: {integrity: sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==}
805 | engines: {node: '>=14.0.0'}
806 | hasBin: true
807 | dependencies:
808 | '@alloc/quick-lru': 5.2.0
809 | arg: 5.0.2
810 | chokidar: 3.5.3
811 | didyoumean: 1.2.2
812 | dlv: 1.1.3
813 | fast-glob: 3.2.12
814 | glob-parent: 6.0.2
815 | is-glob: 4.0.3
816 | jiti: 1.18.2
817 | lilconfig: 2.1.0
818 | micromatch: 4.0.5
819 | normalize-path: 3.0.0
820 | object-hash: 3.0.0
821 | picocolors: 1.0.0
822 | postcss: 8.4.24
823 | postcss-import: 15.1.0_postcss@8.4.24
824 | postcss-js: 4.0.1_postcss@8.4.24
825 | postcss-load-config: 4.0.1_postcss@8.4.24
826 | postcss-nested: 6.0.1_postcss@8.4.24
827 | postcss-selector-parser: 6.0.13
828 | postcss-value-parser: 4.2.0
829 | resolve: 1.22.2
830 | sucrase: 3.32.0
831 | transitivePeerDependencies:
832 | - ts-node
833 | dev: false
834 |
835 | /thenify-all/1.6.0:
836 | resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==}
837 | engines: {node: '>=0.8'}
838 | dependencies:
839 | thenify: 3.3.1
840 | dev: false
841 |
842 | /thenify/3.3.1:
843 | resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==}
844 | dependencies:
845 | any-promise: 1.3.0
846 | dev: false
847 |
848 | /to-regex-range/5.0.1:
849 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
850 | engines: {node: '>=8.0'}
851 | dependencies:
852 | is-number: 7.0.0
853 | dev: false
854 |
855 | /ts-interface-checker/0.1.13:
856 | resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
857 | dev: false
858 |
859 | /tslib/2.5.2:
860 | resolution: {integrity: sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==}
861 | dev: false
862 |
863 | /typescript/5.1.3:
864 | resolution: {integrity: sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==}
865 | engines: {node: '>=14.17'}
866 | hasBin: true
867 | dev: false
868 |
869 | /update-browserslist-db/1.0.11_browserslist@4.21.7:
870 | resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==}
871 | hasBin: true
872 | peerDependencies:
873 | browserslist: '>= 4.21.0'
874 | dependencies:
875 | browserslist: 4.21.7
876 | escalade: 3.1.1
877 | picocolors: 1.0.0
878 | dev: false
879 |
880 | /util-deprecate/1.0.2:
881 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
882 | dev: false
883 |
884 | /wrappy/1.0.2:
885 | resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
886 | dev: false
887 |
888 | /yaml/2.3.1:
889 | resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==}
890 | engines: {node: '>= 14'}
891 | dev: false
892 |
893 | /zod/3.21.4:
894 | resolution: {integrity: sha512-m46AKbrzKVzOzs/DZgVnG5H55N1sv1M8qZU3A8RIKbs3mrACDNeIOeilDymVb2HdmP8uwshOCF4uJ8uM9rCqJw==}
895 | dev: false
896 |
--------------------------------------------------------------------------------
/postcss.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | plugins: {
3 | tailwindcss: {},
4 | autoprefixer: {},
5 | },
6 | }
7 |
--------------------------------------------------------------------------------
/styles/globals.css:
--------------------------------------------------------------------------------
1 | @tailwind base;
2 | @tailwind components;
3 | @tailwind utilities;
4 |
--------------------------------------------------------------------------------
/tailwind.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('tailwindcss').Config} */
2 | module.exports = {
3 | content: [
4 | './app/**/*.{js,ts,jsx,tsx,mdx}',
5 | './pages/**/*.{js,ts,jsx,tsx,mdx}',
6 | './components/**/*.{js,ts,jsx,tsx,mdx}',
7 | ],
8 | theme: {
9 | extend: {},
10 | },
11 | plugins: [],
12 | };
13 |
--------------------------------------------------------------------------------
/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "es5",
4 | "lib": ["dom", "dom.iterable", "esnext"],
5 | "allowJs": true,
6 | "skipLibCheck": true,
7 | "strict": true,
8 | "forceConsistentCasingInFileNames": true,
9 | "noEmit": true,
10 | "esModuleInterop": true,
11 | "module": "esnext",
12 | "moduleResolution": "node",
13 | "resolveJsonModule": true,
14 | "isolatedModules": true,
15 | "jsx": "preserve",
16 | "incremental": true,
17 | "paths": {
18 | "*": ["./*"]
19 | },
20 | "plugins": [
21 | {
22 | "name": "next"
23 | }
24 | ]
25 | },
26 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
27 | "exclude": ["node_modules"]
28 | }
29 |
--------------------------------------------------------------------------------