├── .gitignore ├── .vscode └── settings.json ├── README.md ├── app ├── [lang] │ ├── layout.tsx │ └── todos │ │ └── page.tsx ├── favicon.ico ├── globals.css ├── image.tsx ├── layout.tsx ├── page.tsx ├── post │ └── [id] │ │ └── page.tsx ├── route-handler.json │ └── route.ts └── spa-post │ ├── [id] │ └── page.tsx │ └── layout.tsx ├── next.config.js ├── package.json ├── pnpm-lock.yaml ├── postcss.config.js ├── 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 | .pnpm-debug.log* 27 | 28 | # local env files 29 | .env*.local 30 | 31 | # vercel 32 | .vercel 33 | 34 | # typescript 35 | *.tsbuildinfo 36 | next-env.d.ts 37 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "typescript.tsdk": "node_modules/.pnpm/typescript@5.0.2/node_modules/typescript/lib", 3 | "typescript.enablePromptUseWorkspaceTsdk": true 4 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Next.js Static Export 2 | 3 | - Component level data fetching 4 | - i18n routes support (no runtime detection) 5 | - Dynamic routes (`/post/[id]`) 6 | - SPA routes (`/spa-post/[id]`) 7 | - Image optimization (uses Cloudinary) 8 | - Route Handlers 9 | 10 | ## Static Export 11 | 12 | Running `pnpm build` will export the site to the `out` directory. Then, you can deploy the `out` directory to any static hosting provider. 13 | 14 | You can also run it locally using a tool like `serve`: 15 | 16 | ```bash 17 | pnpm install -g serve 18 | serve out 19 | ``` 20 | -------------------------------------------------------------------------------- /app/[lang]/layout.tsx: -------------------------------------------------------------------------------- 1 | export async function generateStaticParams() { 2 | return [{ lang: 'en-US' }, { lang: 'de' }]; 3 | } 4 | 5 | export default function Layout({ 6 | children, 7 | params, 8 | }: { 9 | children: React.ReactNode; 10 | params: { lang: string }; 11 | }) { 12 | return ( 13 | 14 | {children} 15 | 16 | ); 17 | } 18 | -------------------------------------------------------------------------------- /app/[lang]/todos/page.tsx: -------------------------------------------------------------------------------- 1 | type Todo = { 2 | userId: number; 3 | id: number; 4 | title: string; 5 | completed: boolean; 6 | }; 7 | 8 | async function getTodos(): Promise { 9 | const res = await fetch('https://jsonplaceholder.typicode.com/todos'); 10 | return res.json(); 11 | } 12 | 13 | export default async function TodoPage() { 14 | const todos = await getTodos(); 15 | return ( 16 |
17 | There are {todos.length} todos. 18 |
19 | ); 20 | } 21 | -------------------------------------------------------------------------------- /app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/leerob/next-static-export-example/87c81d5cdfbcdc952930c4ad0504434928017904/app/favicon.ico -------------------------------------------------------------------------------- /app/globals.css: -------------------------------------------------------------------------------- 1 | @tailwind base; 2 | @tailwind components; 3 | @tailwind utilities; 4 | -------------------------------------------------------------------------------- /app/image.tsx: -------------------------------------------------------------------------------- 1 | export default function cloudinaryLoader({ 2 | src, 3 | width, 4 | quality, 5 | }: { 6 | src: string; 7 | width: number; 8 | quality?: number; 9 | }) { 10 | const params = ['f_auto', 'c_limit', `w_${width}`, `q_${quality || 'auto'}`]; 11 | return `https://res.cloudinary.com/demo/image/upload/${params.join( 12 | ',' 13 | )}${src}`; 14 | } 15 | -------------------------------------------------------------------------------- /app/layout.tsx: -------------------------------------------------------------------------------- 1 | import './globals.css' 2 | 3 | export const metadata = { 4 | title: 'Create Next App', 5 | description: 'Generated by create next app', 6 | } 7 | 8 | export default function RootLayout({ 9 | children, 10 | }: { 11 | children: React.ReactNode 12 | }) { 13 | return ( 14 | 15 | {children} 16 | 17 | ) 18 | } 19 | -------------------------------------------------------------------------------- /app/page.tsx: -------------------------------------------------------------------------------- 1 | import Link from 'next/link'; 2 | 3 | type Post = { 4 | userId: number; 5 | id: number; 6 | title: string; 7 | body: string; 8 | }; 9 | 10 | async function getPosts(): Promise { 11 | const res = await fetch('https://jsonplaceholder.typicode.com/posts'); 12 | return res.json(); 13 | } 14 | 15 | export default async function Home() { 16 | const post = await getPosts(); 17 | return ( 18 |
19 | {post.map((post) => ( 20 | 25 |

{post.title}

26 |

{post.body}

27 | 28 | ))} 29 |
30 | ); 31 | } 32 | -------------------------------------------------------------------------------- /app/post/[id]/page.tsx: -------------------------------------------------------------------------------- 1 | import Image from 'next/image'; 2 | 3 | type Post = { 4 | userId: number; 5 | id: number; 6 | title: string; 7 | body: string; 8 | }; 9 | 10 | export async function generateStaticParams() { 11 | const res = await fetch('https://jsonplaceholder.typicode.com/posts'); 12 | const posts = await res.json(); 13 | 14 | return posts.map((post: Post) => ({ 15 | id: post.id.toString(), 16 | })); 17 | } 18 | 19 | async function getPost(id: string): Promise { 20 | const res = await fetch(`https://jsonplaceholder.typicode.com/posts/${id}`); 21 | return res.json(); 22 | } 23 | 24 | export default async function PostPage({ params }: { params: { id: string } }) { 25 | const post = await getPost(params.id); 26 | return ( 27 |
28 |

{post.title}

29 |

{post.body}

30 | {/* turtles */} 31 |
32 | ); 33 | } 34 | -------------------------------------------------------------------------------- /app/route-handler.json/route.ts: -------------------------------------------------------------------------------- 1 | import { NextResponse } from 'next/server'; 2 | 3 | export async function GET() { 4 | return NextResponse.json({ name: 'Lee' }); 5 | } 6 | -------------------------------------------------------------------------------- /app/spa-post/[id]/page.tsx: -------------------------------------------------------------------------------- 1 | 'use client'; 2 | 3 | import useSWR from 'swr'; 4 | 5 | const fetcher = (url: string) => fetch(url).then((r) => r.json()); 6 | 7 | // This is not implemented yet. Today, you would still need to 8 | // export function generateStaticParams() at build time. 9 | // See https://github.com/vercel/next.js/issues/54393 10 | export default function SPAPostPage({ params }: { params: { id: string } }) { 11 | const { data, error } = useSWR( 12 | `https://jsonplaceholder.typicode.com/posts/${params.id}`, 13 | fetcher 14 | ); 15 | if (error) return

Failed to load

; 16 | if (!data) return

Loading...

; 17 | 18 | return ( 19 | <> 20 |

{data.title}

21 |

{data.body}

22 | 23 | ); 24 | } 25 | -------------------------------------------------------------------------------- /app/spa-post/layout.tsx: -------------------------------------------------------------------------------- 1 | export default function Layout({ children }: { children: React.ReactNode }) { 2 | return ( 3 |
4 | {children} 5 |
6 | ); 7 | } 8 | -------------------------------------------------------------------------------- /next.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('next').NextConfig} */ 2 | const nextConfig = { 3 | output: 'export', 4 | images: { 5 | loader: 'custom', 6 | loaderFile: './app/image.tsx', 7 | }, 8 | }; 9 | 10 | module.exports = nextConfig; 11 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "packageManager": "pnpm@8.9.0", 4 | "scripts": { 5 | "dev": "next dev", 6 | "build": "next build", 7 | "start": "next start", 8 | "lint": "next lint" 9 | }, 10 | "dependencies": { 11 | "@types/node": "18.15.3", 12 | "@types/react": "18.0.28", 13 | "@types/react-dom": "18.0.11", 14 | "autoprefixer": "10.4.14", 15 | "next": "13.5.4", 16 | "postcss": "8.4.21", 17 | "react": "18.2.0", 18 | "react-dom": "18.2.0", 19 | "swr": "^2.1.0", 20 | "tailwindcss": "3.2.7", 21 | "typescript": "5.0.2" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /pnpm-lock.yaml: -------------------------------------------------------------------------------- 1 | lockfileVersion: '6.0' 2 | 3 | settings: 4 | autoInstallPeers: true 5 | excludeLinksFromLockfile: false 6 | 7 | dependencies: 8 | '@types/node': 9 | specifier: 18.15.3 10 | version: 18.15.3 11 | '@types/react': 12 | specifier: 18.0.28 13 | version: 18.0.28 14 | '@types/react-dom': 15 | specifier: 18.0.11 16 | version: 18.0.11 17 | autoprefixer: 18 | specifier: 10.4.14 19 | version: 10.4.14(postcss@8.4.21) 20 | next: 21 | specifier: 13.5.4 22 | version: 13.5.4(react-dom@18.2.0)(react@18.2.0) 23 | postcss: 24 | specifier: 8.4.21 25 | version: 8.4.21 26 | react: 27 | specifier: 18.2.0 28 | version: 18.2.0 29 | react-dom: 30 | specifier: 18.2.0 31 | version: 18.2.0(react@18.2.0) 32 | swr: 33 | specifier: ^2.1.0 34 | version: 2.1.0(react@18.2.0) 35 | tailwindcss: 36 | specifier: 3.2.7 37 | version: 3.2.7(postcss@8.4.21) 38 | typescript: 39 | specifier: 5.0.2 40 | version: 5.0.2 41 | 42 | packages: 43 | 44 | /@next/env@13.5.4: 45 | resolution: {integrity: sha512-LGegJkMvRNw90WWphGJ3RMHMVplYcOfRWf2Be3td3sUa+1AaxmsYyANsA+znrGCBjXJNi4XAQlSoEfUxs/4kIQ==} 46 | dev: false 47 | 48 | /@next/swc-darwin-arm64@13.5.4: 49 | resolution: {integrity: sha512-Df8SHuXgF1p+aonBMcDPEsaahNo2TCwuie7VXED4FVyECvdXfRT9unapm54NssV9tF3OQFKBFOdlje4T43VO0w==} 50 | engines: {node: '>= 10'} 51 | cpu: [arm64] 52 | os: [darwin] 53 | requiresBuild: true 54 | dev: false 55 | optional: true 56 | 57 | /@next/swc-darwin-x64@13.5.4: 58 | resolution: {integrity: sha512-siPuUwO45PnNRMeZnSa8n/Lye5ZX93IJom9wQRB5DEOdFrw0JjOMu1GINB8jAEdwa7Vdyn1oJ2xGNaQpdQQ9Pw==} 59 | engines: {node: '>= 10'} 60 | cpu: [x64] 61 | os: [darwin] 62 | requiresBuild: true 63 | dev: false 64 | optional: true 65 | 66 | /@next/swc-linux-arm64-gnu@13.5.4: 67 | resolution: {integrity: sha512-l/k/fvRP/zmB2jkFMfefmFkyZbDkYW0mRM/LB+tH5u9pB98WsHXC0WvDHlGCYp3CH/jlkJPL7gN8nkTQVrQ/2w==} 68 | engines: {node: '>= 10'} 69 | cpu: [arm64] 70 | os: [linux] 71 | requiresBuild: true 72 | dev: false 73 | optional: true 74 | 75 | /@next/swc-linux-arm64-musl@13.5.4: 76 | resolution: {integrity: sha512-YYGb7SlLkI+XqfQa8VPErljb7k9nUnhhRrVaOdfJNCaQnHBcvbT7cx/UjDQLdleJcfyg1Hkn5YSSIeVfjgmkTg==} 77 | engines: {node: '>= 10'} 78 | cpu: [arm64] 79 | os: [linux] 80 | requiresBuild: true 81 | dev: false 82 | optional: true 83 | 84 | /@next/swc-linux-x64-gnu@13.5.4: 85 | resolution: {integrity: sha512-uE61vyUSClnCH18YHjA8tE1prr/PBFlBFhxBZis4XBRJoR+txAky5d7gGNUIbQ8sZZ7LVkSVgm/5Fc7mwXmRAg==} 86 | engines: {node: '>= 10'} 87 | cpu: [x64] 88 | os: [linux] 89 | requiresBuild: true 90 | dev: false 91 | optional: true 92 | 93 | /@next/swc-linux-x64-musl@13.5.4: 94 | resolution: {integrity: sha512-qVEKFYML/GvJSy9CfYqAdUexA6M5AklYcQCW+8JECmkQHGoPxCf04iMh7CPR7wkHyWWK+XLt4Ja7hhsPJtSnhg==} 95 | engines: {node: '>= 10'} 96 | cpu: [x64] 97 | os: [linux] 98 | requiresBuild: true 99 | dev: false 100 | optional: true 101 | 102 | /@next/swc-win32-arm64-msvc@13.5.4: 103 | resolution: {integrity: sha512-mDSQfqxAlfpeZOLPxLymZkX0hYF3juN57W6vFHTvwKlnHfmh12Pt7hPIRLYIShk8uYRsKPtMTth/EzpwRI+u8w==} 104 | engines: {node: '>= 10'} 105 | cpu: [arm64] 106 | os: [win32] 107 | requiresBuild: true 108 | dev: false 109 | optional: true 110 | 111 | /@next/swc-win32-ia32-msvc@13.5.4: 112 | resolution: {integrity: sha512-aoqAT2XIekIWoriwzOmGFAvTtVY5O7JjV21giozBTP5c6uZhpvTWRbmHXbmsjZqY4HnEZQRXWkSAppsIBweKqw==} 113 | engines: {node: '>= 10'} 114 | cpu: [ia32] 115 | os: [win32] 116 | requiresBuild: true 117 | dev: false 118 | optional: true 119 | 120 | /@next/swc-win32-x64-msvc@13.5.4: 121 | resolution: {integrity: sha512-cyRvlAxwlddlqeB9xtPSfNSCRy8BOa4wtMo0IuI9P7Y0XT2qpDrpFKRyZ7kUngZis59mPVla5k8X1oOJ8RxDYg==} 122 | engines: {node: '>= 10'} 123 | cpu: [x64] 124 | os: [win32] 125 | requiresBuild: true 126 | dev: false 127 | optional: true 128 | 129 | /@nodelib/fs.scandir@2.1.5: 130 | resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} 131 | engines: {node: '>= 8'} 132 | dependencies: 133 | '@nodelib/fs.stat': 2.0.5 134 | run-parallel: 1.2.0 135 | dev: false 136 | 137 | /@nodelib/fs.stat@2.0.5: 138 | resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} 139 | engines: {node: '>= 8'} 140 | dev: false 141 | 142 | /@nodelib/fs.walk@1.2.8: 143 | resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} 144 | engines: {node: '>= 8'} 145 | dependencies: 146 | '@nodelib/fs.scandir': 2.1.5 147 | fastq: 1.15.0 148 | dev: false 149 | 150 | /@swc/helpers@0.5.2: 151 | resolution: {integrity: sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw==} 152 | dependencies: 153 | tslib: 2.5.0 154 | dev: false 155 | 156 | /@types/node@18.15.3: 157 | resolution: {integrity: sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==} 158 | dev: false 159 | 160 | /@types/prop-types@15.7.5: 161 | resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} 162 | dev: false 163 | 164 | /@types/react-dom@18.0.11: 165 | resolution: {integrity: sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==} 166 | dependencies: 167 | '@types/react': 18.0.28 168 | dev: false 169 | 170 | /@types/react@18.0.28: 171 | resolution: {integrity: sha512-RD0ivG1kEztNBdoAK7lekI9M+azSnitIn85h4iOiaLjaTrMjzslhaqCGaI4IyCJ1RljWiLCEu4jyrLLgqxBTew==} 172 | dependencies: 173 | '@types/prop-types': 15.7.5 174 | '@types/scheduler': 0.16.2 175 | csstype: 3.1.1 176 | dev: false 177 | 178 | /@types/scheduler@0.16.2: 179 | resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==} 180 | dev: false 181 | 182 | /acorn-node@1.8.2: 183 | resolution: {integrity: sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==} 184 | dependencies: 185 | acorn: 7.4.1 186 | acorn-walk: 7.2.0 187 | xtend: 4.0.2 188 | dev: false 189 | 190 | /acorn-walk@7.2.0: 191 | resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} 192 | engines: {node: '>=0.4.0'} 193 | dev: false 194 | 195 | /acorn@7.4.1: 196 | resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} 197 | engines: {node: '>=0.4.0'} 198 | hasBin: true 199 | dev: false 200 | 201 | /anymatch@3.1.3: 202 | resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} 203 | engines: {node: '>= 8'} 204 | dependencies: 205 | normalize-path: 3.0.0 206 | picomatch: 2.3.1 207 | dev: false 208 | 209 | /arg@5.0.2: 210 | resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} 211 | dev: false 212 | 213 | /autoprefixer@10.4.14(postcss@8.4.21): 214 | resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==} 215 | engines: {node: ^10 || ^12 || >=14} 216 | hasBin: true 217 | peerDependencies: 218 | postcss: ^8.1.0 219 | dependencies: 220 | browserslist: 4.21.5 221 | caniuse-lite: 1.0.30001467 222 | fraction.js: 4.2.0 223 | normalize-range: 0.1.2 224 | picocolors: 1.0.0 225 | postcss: 8.4.21 226 | postcss-value-parser: 4.2.0 227 | dev: false 228 | 229 | /binary-extensions@2.2.0: 230 | resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} 231 | engines: {node: '>=8'} 232 | dev: false 233 | 234 | /braces@3.0.2: 235 | resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} 236 | engines: {node: '>=8'} 237 | dependencies: 238 | fill-range: 7.0.1 239 | dev: false 240 | 241 | /browserslist@4.21.5: 242 | resolution: {integrity: sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==} 243 | engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} 244 | hasBin: true 245 | dependencies: 246 | caniuse-lite: 1.0.30001467 247 | electron-to-chromium: 1.4.332 248 | node-releases: 2.0.10 249 | update-browserslist-db: 1.0.10(browserslist@4.21.5) 250 | dev: false 251 | 252 | /busboy@1.6.0: 253 | resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} 254 | engines: {node: '>=10.16.0'} 255 | dependencies: 256 | streamsearch: 1.1.0 257 | dev: false 258 | 259 | /camelcase-css@2.0.1: 260 | resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} 261 | engines: {node: '>= 6'} 262 | dev: false 263 | 264 | /caniuse-lite@1.0.30001467: 265 | resolution: {integrity: sha512-cEdN/5e+RPikvl9AHm4uuLXxeCNq8rFsQ+lPHTfe/OtypP3WwnVVbjn+6uBV7PaFL6xUFzTh+sSCOz1rKhcO+Q==} 266 | dev: false 267 | 268 | /chokidar@3.5.3: 269 | resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} 270 | engines: {node: '>= 8.10.0'} 271 | dependencies: 272 | anymatch: 3.1.3 273 | braces: 3.0.2 274 | glob-parent: 5.1.2 275 | is-binary-path: 2.1.0 276 | is-glob: 4.0.3 277 | normalize-path: 3.0.0 278 | readdirp: 3.6.0 279 | optionalDependencies: 280 | fsevents: 2.3.2 281 | dev: false 282 | 283 | /client-only@0.0.1: 284 | resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} 285 | dev: false 286 | 287 | /color-name@1.1.4: 288 | resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} 289 | dev: false 290 | 291 | /cssesc@3.0.0: 292 | resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} 293 | engines: {node: '>=4'} 294 | hasBin: true 295 | dev: false 296 | 297 | /csstype@3.1.1: 298 | resolution: {integrity: sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==} 299 | dev: false 300 | 301 | /defined@1.0.1: 302 | resolution: {integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==} 303 | dev: false 304 | 305 | /detective@5.2.1: 306 | resolution: {integrity: sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==} 307 | engines: {node: '>=0.8.0'} 308 | hasBin: true 309 | dependencies: 310 | acorn-node: 1.8.2 311 | defined: 1.0.1 312 | minimist: 1.2.8 313 | dev: false 314 | 315 | /didyoumean@1.2.2: 316 | resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} 317 | dev: false 318 | 319 | /dlv@1.1.3: 320 | resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} 321 | dev: false 322 | 323 | /electron-to-chromium@1.4.332: 324 | resolution: {integrity: sha512-c1Vbv5tuUlBFp0mb3mCIjw+REEsgthRgNE8BlbEDKmvzb8rxjcVki6OkQP83vLN34s0XCxpSkq7AZNep1a6xhw==} 325 | dev: false 326 | 327 | /escalade@3.1.1: 328 | resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} 329 | engines: {node: '>=6'} 330 | dev: false 331 | 332 | /fast-glob@3.2.12: 333 | resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} 334 | engines: {node: '>=8.6.0'} 335 | dependencies: 336 | '@nodelib/fs.stat': 2.0.5 337 | '@nodelib/fs.walk': 1.2.8 338 | glob-parent: 5.1.2 339 | merge2: 1.4.1 340 | micromatch: 4.0.5 341 | dev: false 342 | 343 | /fastq@1.15.0: 344 | resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} 345 | dependencies: 346 | reusify: 1.0.4 347 | dev: false 348 | 349 | /fill-range@7.0.1: 350 | resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} 351 | engines: {node: '>=8'} 352 | dependencies: 353 | to-regex-range: 5.0.1 354 | dev: false 355 | 356 | /fraction.js@4.2.0: 357 | resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==} 358 | dev: false 359 | 360 | /fsevents@2.3.2: 361 | resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} 362 | engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} 363 | os: [darwin] 364 | requiresBuild: true 365 | dev: false 366 | optional: true 367 | 368 | /function-bind@1.1.1: 369 | resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} 370 | dev: false 371 | 372 | /glob-parent@5.1.2: 373 | resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} 374 | engines: {node: '>= 6'} 375 | dependencies: 376 | is-glob: 4.0.3 377 | dev: false 378 | 379 | /glob-parent@6.0.2: 380 | resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} 381 | engines: {node: '>=10.13.0'} 382 | dependencies: 383 | is-glob: 4.0.3 384 | dev: false 385 | 386 | /glob-to-regexp@0.4.1: 387 | resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} 388 | dev: false 389 | 390 | /graceful-fs@4.2.11: 391 | resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} 392 | dev: false 393 | 394 | /has@1.0.3: 395 | resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} 396 | engines: {node: '>= 0.4.0'} 397 | dependencies: 398 | function-bind: 1.1.1 399 | dev: false 400 | 401 | /is-binary-path@2.1.0: 402 | resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} 403 | engines: {node: '>=8'} 404 | dependencies: 405 | binary-extensions: 2.2.0 406 | dev: false 407 | 408 | /is-core-module@2.11.0: 409 | resolution: {integrity: sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==} 410 | dependencies: 411 | has: 1.0.3 412 | dev: false 413 | 414 | /is-extglob@2.1.1: 415 | resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} 416 | engines: {node: '>=0.10.0'} 417 | dev: false 418 | 419 | /is-glob@4.0.3: 420 | resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} 421 | engines: {node: '>=0.10.0'} 422 | dependencies: 423 | is-extglob: 2.1.1 424 | dev: false 425 | 426 | /is-number@7.0.0: 427 | resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} 428 | engines: {node: '>=0.12.0'} 429 | dev: false 430 | 431 | /js-tokens@4.0.0: 432 | resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} 433 | dev: false 434 | 435 | /lilconfig@2.1.0: 436 | resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} 437 | engines: {node: '>=10'} 438 | dev: false 439 | 440 | /loose-envify@1.4.0: 441 | resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} 442 | hasBin: true 443 | dependencies: 444 | js-tokens: 4.0.0 445 | dev: false 446 | 447 | /merge2@1.4.1: 448 | resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} 449 | engines: {node: '>= 8'} 450 | dev: false 451 | 452 | /micromatch@4.0.5: 453 | resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} 454 | engines: {node: '>=8.6'} 455 | dependencies: 456 | braces: 3.0.2 457 | picomatch: 2.3.1 458 | dev: false 459 | 460 | /minimist@1.2.8: 461 | resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} 462 | dev: false 463 | 464 | /nanoid@3.3.4: 465 | resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==} 466 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 467 | hasBin: true 468 | dev: false 469 | 470 | /nanoid@3.3.6: 471 | resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} 472 | engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} 473 | hasBin: true 474 | dev: false 475 | 476 | /next@13.5.4(react-dom@18.2.0)(react@18.2.0): 477 | resolution: {integrity: sha512-+93un5S779gho8y9ASQhb/bTkQF17FNQOtXLKAj3lsNgltEcF0C5PMLLncDmH+8X1EnJH1kbqAERa29nRXqhjA==} 478 | engines: {node: '>=16.14.0'} 479 | hasBin: true 480 | peerDependencies: 481 | '@opentelemetry/api': ^1.1.0 482 | react: ^18.2.0 483 | react-dom: ^18.2.0 484 | sass: ^1.3.0 485 | peerDependenciesMeta: 486 | '@opentelemetry/api': 487 | optional: true 488 | sass: 489 | optional: true 490 | dependencies: 491 | '@next/env': 13.5.4 492 | '@swc/helpers': 0.5.2 493 | busboy: 1.6.0 494 | caniuse-lite: 1.0.30001467 495 | postcss: 8.4.31 496 | react: 18.2.0 497 | react-dom: 18.2.0(react@18.2.0) 498 | styled-jsx: 5.1.1(react@18.2.0) 499 | watchpack: 2.4.0 500 | optionalDependencies: 501 | '@next/swc-darwin-arm64': 13.5.4 502 | '@next/swc-darwin-x64': 13.5.4 503 | '@next/swc-linux-arm64-gnu': 13.5.4 504 | '@next/swc-linux-arm64-musl': 13.5.4 505 | '@next/swc-linux-x64-gnu': 13.5.4 506 | '@next/swc-linux-x64-musl': 13.5.4 507 | '@next/swc-win32-arm64-msvc': 13.5.4 508 | '@next/swc-win32-ia32-msvc': 13.5.4 509 | '@next/swc-win32-x64-msvc': 13.5.4 510 | transitivePeerDependencies: 511 | - '@babel/core' 512 | - babel-plugin-macros 513 | dev: false 514 | 515 | /node-releases@2.0.10: 516 | resolution: {integrity: sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==} 517 | dev: false 518 | 519 | /normalize-path@3.0.0: 520 | resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} 521 | engines: {node: '>=0.10.0'} 522 | dev: false 523 | 524 | /normalize-range@0.1.2: 525 | resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} 526 | engines: {node: '>=0.10.0'} 527 | dev: false 528 | 529 | /object-hash@3.0.0: 530 | resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} 531 | engines: {node: '>= 6'} 532 | dev: false 533 | 534 | /path-parse@1.0.7: 535 | resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} 536 | dev: false 537 | 538 | /picocolors@1.0.0: 539 | resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} 540 | dev: false 541 | 542 | /picomatch@2.3.1: 543 | resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} 544 | engines: {node: '>=8.6'} 545 | dev: false 546 | 547 | /pify@2.3.0: 548 | resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} 549 | engines: {node: '>=0.10.0'} 550 | dev: false 551 | 552 | /postcss-import@14.1.0(postcss@8.4.21): 553 | resolution: {integrity: sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==} 554 | engines: {node: '>=10.0.0'} 555 | peerDependencies: 556 | postcss: ^8.0.0 557 | dependencies: 558 | postcss: 8.4.21 559 | postcss-value-parser: 4.2.0 560 | read-cache: 1.0.0 561 | resolve: 1.22.1 562 | dev: false 563 | 564 | /postcss-js@4.0.1(postcss@8.4.21): 565 | resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} 566 | engines: {node: ^12 || ^14 || >= 16} 567 | peerDependencies: 568 | postcss: ^8.4.21 569 | dependencies: 570 | camelcase-css: 2.0.1 571 | postcss: 8.4.21 572 | dev: false 573 | 574 | /postcss-load-config@3.1.4(postcss@8.4.21): 575 | resolution: {integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==} 576 | engines: {node: '>= 10'} 577 | peerDependencies: 578 | postcss: '>=8.0.9' 579 | ts-node: '>=9.0.0' 580 | peerDependenciesMeta: 581 | postcss: 582 | optional: true 583 | ts-node: 584 | optional: true 585 | dependencies: 586 | lilconfig: 2.1.0 587 | postcss: 8.4.21 588 | yaml: 1.10.2 589 | dev: false 590 | 591 | /postcss-nested@6.0.0(postcss@8.4.21): 592 | resolution: {integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==} 593 | engines: {node: '>=12.0'} 594 | peerDependencies: 595 | postcss: ^8.2.14 596 | dependencies: 597 | postcss: 8.4.21 598 | postcss-selector-parser: 6.0.11 599 | dev: false 600 | 601 | /postcss-selector-parser@6.0.11: 602 | resolution: {integrity: sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==} 603 | engines: {node: '>=4'} 604 | dependencies: 605 | cssesc: 3.0.0 606 | util-deprecate: 1.0.2 607 | dev: false 608 | 609 | /postcss-value-parser@4.2.0: 610 | resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} 611 | dev: false 612 | 613 | /postcss@8.4.21: 614 | resolution: {integrity: sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==} 615 | engines: {node: ^10 || ^12 || >=14} 616 | dependencies: 617 | nanoid: 3.3.4 618 | picocolors: 1.0.0 619 | source-map-js: 1.0.2 620 | dev: false 621 | 622 | /postcss@8.4.31: 623 | resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} 624 | engines: {node: ^10 || ^12 || >=14} 625 | dependencies: 626 | nanoid: 3.3.6 627 | picocolors: 1.0.0 628 | source-map-js: 1.0.2 629 | dev: false 630 | 631 | /queue-microtask@1.2.3: 632 | resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} 633 | dev: false 634 | 635 | /quick-lru@5.1.1: 636 | resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} 637 | engines: {node: '>=10'} 638 | dev: false 639 | 640 | /react-dom@18.2.0(react@18.2.0): 641 | resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} 642 | peerDependencies: 643 | react: ^18.2.0 644 | dependencies: 645 | loose-envify: 1.4.0 646 | react: 18.2.0 647 | scheduler: 0.23.0 648 | dev: false 649 | 650 | /react@18.2.0: 651 | resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} 652 | engines: {node: '>=0.10.0'} 653 | dependencies: 654 | loose-envify: 1.4.0 655 | dev: false 656 | 657 | /read-cache@1.0.0: 658 | resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} 659 | dependencies: 660 | pify: 2.3.0 661 | dev: false 662 | 663 | /readdirp@3.6.0: 664 | resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} 665 | engines: {node: '>=8.10.0'} 666 | dependencies: 667 | picomatch: 2.3.1 668 | dev: false 669 | 670 | /resolve@1.22.1: 671 | resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==} 672 | hasBin: true 673 | dependencies: 674 | is-core-module: 2.11.0 675 | path-parse: 1.0.7 676 | supports-preserve-symlinks-flag: 1.0.0 677 | dev: false 678 | 679 | /reusify@1.0.4: 680 | resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} 681 | engines: {iojs: '>=1.0.0', node: '>=0.10.0'} 682 | dev: false 683 | 684 | /run-parallel@1.2.0: 685 | resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} 686 | dependencies: 687 | queue-microtask: 1.2.3 688 | dev: false 689 | 690 | /scheduler@0.23.0: 691 | resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} 692 | dependencies: 693 | loose-envify: 1.4.0 694 | dev: false 695 | 696 | /source-map-js@1.0.2: 697 | resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} 698 | engines: {node: '>=0.10.0'} 699 | dev: false 700 | 701 | /streamsearch@1.1.0: 702 | resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} 703 | engines: {node: '>=10.0.0'} 704 | dev: false 705 | 706 | /styled-jsx@5.1.1(react@18.2.0): 707 | resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} 708 | engines: {node: '>= 12.0.0'} 709 | peerDependencies: 710 | '@babel/core': '*' 711 | babel-plugin-macros: '*' 712 | react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' 713 | peerDependenciesMeta: 714 | '@babel/core': 715 | optional: true 716 | babel-plugin-macros: 717 | optional: true 718 | dependencies: 719 | client-only: 0.0.1 720 | react: 18.2.0 721 | dev: false 722 | 723 | /supports-preserve-symlinks-flag@1.0.0: 724 | resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} 725 | engines: {node: '>= 0.4'} 726 | dev: false 727 | 728 | /swr@2.1.0(react@18.2.0): 729 | resolution: {integrity: sha512-4hYl5p3/KalQ1MORealM79g/DtLohmud6yyfXw5l4wjtFksYUnocRFudvyaoUtgj3FrVNK9lS25Av9dsZYvz0g==} 730 | engines: {pnpm: '7'} 731 | peerDependencies: 732 | react: ^16.11.0 || ^17.0.0 || ^18.0.0 733 | dependencies: 734 | react: 18.2.0 735 | use-sync-external-store: 1.2.0(react@18.2.0) 736 | dev: false 737 | 738 | /tailwindcss@3.2.7(postcss@8.4.21): 739 | resolution: {integrity: sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ==} 740 | engines: {node: '>=12.13.0'} 741 | hasBin: true 742 | peerDependencies: 743 | postcss: ^8.0.9 744 | dependencies: 745 | arg: 5.0.2 746 | chokidar: 3.5.3 747 | color-name: 1.1.4 748 | detective: 5.2.1 749 | didyoumean: 1.2.2 750 | dlv: 1.1.3 751 | fast-glob: 3.2.12 752 | glob-parent: 6.0.2 753 | is-glob: 4.0.3 754 | lilconfig: 2.1.0 755 | micromatch: 4.0.5 756 | normalize-path: 3.0.0 757 | object-hash: 3.0.0 758 | picocolors: 1.0.0 759 | postcss: 8.4.21 760 | postcss-import: 14.1.0(postcss@8.4.21) 761 | postcss-js: 4.0.1(postcss@8.4.21) 762 | postcss-load-config: 3.1.4(postcss@8.4.21) 763 | postcss-nested: 6.0.0(postcss@8.4.21) 764 | postcss-selector-parser: 6.0.11 765 | postcss-value-parser: 4.2.0 766 | quick-lru: 5.1.1 767 | resolve: 1.22.1 768 | transitivePeerDependencies: 769 | - ts-node 770 | dev: false 771 | 772 | /to-regex-range@5.0.1: 773 | resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} 774 | engines: {node: '>=8.0'} 775 | dependencies: 776 | is-number: 7.0.0 777 | dev: false 778 | 779 | /tslib@2.5.0: 780 | resolution: {integrity: sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==} 781 | dev: false 782 | 783 | /typescript@5.0.2: 784 | resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==} 785 | engines: {node: '>=12.20'} 786 | hasBin: true 787 | dev: false 788 | 789 | /update-browserslist-db@1.0.10(browserslist@4.21.5): 790 | resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} 791 | hasBin: true 792 | peerDependencies: 793 | browserslist: '>= 4.21.0' 794 | dependencies: 795 | browserslist: 4.21.5 796 | escalade: 3.1.1 797 | picocolors: 1.0.0 798 | dev: false 799 | 800 | /use-sync-external-store@1.2.0(react@18.2.0): 801 | resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==} 802 | peerDependencies: 803 | react: ^16.8.0 || ^17.0.0 || ^18.0.0 804 | dependencies: 805 | react: 18.2.0 806 | dev: false 807 | 808 | /util-deprecate@1.0.2: 809 | resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} 810 | dev: false 811 | 812 | /watchpack@2.4.0: 813 | resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} 814 | engines: {node: '>=10.13.0'} 815 | dependencies: 816 | glob-to-regexp: 0.4.1 817 | graceful-fs: 4.2.11 818 | dev: false 819 | 820 | /xtend@4.0.2: 821 | resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} 822 | engines: {node: '>=0.4'} 823 | dev: false 824 | 825 | /yaml@1.10.2: 826 | resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} 827 | engines: {node: '>= 6'} 828 | dev: false 829 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /tailwind.config.js: -------------------------------------------------------------------------------- 1 | /** @type {import('tailwindcss').Config} */ 2 | module.exports = { 3 | content: [ 4 | './pages/**/*.{js,ts,jsx,tsx}', 5 | './components/**/*.{js,ts,jsx,tsx}', 6 | './app/**/*.{js,ts,jsx,tsx}', 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 | "baseUrl": ".", 18 | "plugins": [ 19 | { 20 | "name": "next" 21 | } 22 | ], 23 | "paths": { 24 | "@/*": ["./*"] 25 | } 26 | }, 27 | "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], 28 | "exclude": ["node_modules"] 29 | } 30 | --------------------------------------------------------------------------------