From ac315f72eaab4965b275cc9e893343196c31f6f8 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Tue, 28 Oct 2025 21:23:27 +0900 Subject: [PATCH 01/82] first commit --- .gitignore | 41 + README.md | 69 +- app/favicon.ico | Bin 0 -> 25931 bytes app/globals.css | 26 + app/layout.tsx | 34 + app/page.tsx | 65 + eslint.config.mjs | 18 + next.config.ts | 7 + package-lock.json | 6537 ++++++++++++++++++++++++++++++++++++++++++++ package.json | 26 + postcss.config.mjs | 7 + public/file.svg | 1 + public/globe.svg | 1 + public/next.svg | 1 + public/vercel.svg | 1 + public/window.svg | 1 + tsconfig.json | 44 + 17 files changed, 6833 insertions(+), 46 deletions(-) create mode 100644 .gitignore create mode 100644 app/favicon.ico create mode 100644 app/globals.css create mode 100644 app/layout.tsx create mode 100644 app/page.tsx create mode 100644 eslint.config.mjs create mode 100644 next.config.ts create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.mjs create mode 100644 public/file.svg create mode 100644 public/globe.svg create mode 100644 public/next.svg create mode 100644 public/vercel.svg create mode 100644 public/window.svg create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5ef6a52 --- /dev/null +++ b/.gitignore @@ -0,0 +1,41 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/out/ + +# production +/build + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +*.tsbuildinfo +next-env.d.ts diff --git a/README.md b/README.md index 115611f..e215bc4 100644 --- a/README.md +++ b/README.md @@ -1,59 +1,36 @@ -# 5μ£Όμ°¨ 과제: Next Netflix 🎬🍿 +This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). -## μ„œλ‘  +## Getting Started -μ•ˆλ…•ν•˜μ„Έμš”, ν”„λ‘ νŠΈ μš΄μ˜μ§„ **κΆŒλ™μš±**μž…λ‹ˆλ‹€! 🩷πŸ₯° +First, run the development server: -이번 μ£ΌλΆ€ν„°λŠ” μƒˆ ν”„λ‘œμ νŠΈμΈ **Netflix 클둠코딩**을 μ§„ν–‰ν•©λ‹ˆλ‹€! +```bash +npm run dev +# or +yarn dev +# or +pnpm dev +# or +bun dev +``` -이번 κ³Όμ œμ—μ„œλŠ” **Next.js**λ₯Ό ν™œμš©ν•΄ **SSR(Server Side Rendering)** 을 직접 κ²½ν—˜ν•΄λ³΄κ³ , μ£Όμ–΄μ§„ **Figma λ””μžμΈ**을 ν™œμš©ν•΄ μŠ€νƒ€μΌλ§ ν•˜λŠ” 방법을 μ΄ν•΄ν•˜λŠ” 것을 λͺ©ν‘œλ‘œ ν•©λ‹ˆλ‹€. +Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. -λ˜ν•œ 이번 μ£ΌλΆ€ν„°λŠ” ν”„λ‘ νŠΈ νŽ˜μ–΄μ™€ ν•¨κ»˜ν•˜λŠ” 첫 과제인 만큼, νŒ€λ³„λ‘œ 미리 **호흑**을 맞좰볼 수 μžˆλŠ” 쒋은 κΈ°νšŒκ°€ 될 것 κ°™μŠ΅λ‹ˆλ‹€. +You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. -그럼 이번 κ³Όμ œλ„ λͺ¨λ‘ νŒŒμ΄νŒ…μž…λ‹ˆλ‹€!!!! πŸ”₯πŸ”₯ +This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. -## 과제 +## Learn More -### **⭐ 과제 λͺ©ν‘œ** +To learn more about Next.js, take a look at the following resources: -- Next.js μ‚¬μš©λ²•μ„ κ³΅λΆ€ν•΄λ΄…λ‹ˆλ‹€. -- Figma둜 μ£Όμ–΄μ§€λŠ” λ””μžμΈμœΌλ‘œ μŠ€νƒ€μΌλ§ ν•˜λŠ” 방식에 μ΅μˆ™ν•΄μ§‘λ‹ˆλ‹€. -- Git을 μ΄μš©ν•œ ν˜‘μ—… 방식에 μ΅μˆ™ν•΄μ§‘λ‹ˆλ‹€. -- ν”„λ‘ νŠΈμ—”λ“œμ™€ λ°±μ—”λ“œ μ‹œμŠ€ν…œμ— λŒ€ν•œ 흐름을 μ΄ν•΄ν•©λ‹ˆλ‹€. +- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. +- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. -### πŸ“… κΈ°ν•œ +You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! -> 2025λ…„ 11μ›” 1일 ν† μš”μΌ (κΈ°ν•œ μ—„μˆ˜) +## Deploy on Vercel -### **βœ… ν•„μˆ˜ μš”κ±΄** +The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. -- [κ²°κ³Όν™”λ©΄](https://next-netflix-18th-2.vercel.app)의 λžœλ”© νŽ˜μ΄μ§€μ™€ 메인 νŽ˜μ΄μ§€λ₯Ό κ΅¬ν˜„ν•©λ‹ˆλ‹€. -- [Figma](https://www.figma.com/file/UqdXDovIczt1Gl0IjknHQf/Netflix?node-id=0%3A1)의 λ””μžμΈμ„ κ·ΈλŒ€λ‘œ κ΅¬ν˜„ν•©λ‹ˆλ‹€. -- Open apiλ₯Ό μ‚¬μš©ν•΄μ„œ 데이터 νŒ¨μΉ­μ„ μ§„ν–‰ν•©λ‹ˆλ‹€. (ex. [themoviedb API](https://developers.themoviedb.org/3/getting-started/introduction)) -- `yarn`, `yarn berry`, `npm`, `pnpm`λ“± νŒ¨ν‚€μ§€ λ§€λ‹ˆμ €λ₯Ό 직접 선택해 Next.jsλ₯Ό μ„ΈνŒ…ν•΄ λ΄…λ‹ˆλ‹€. - -### πŸ‘πŸ» 선택 μš”κ±΄ - -- SSR(Server Side Rendering)을 μ μš©ν•΄μ„œ κ΅¬ν˜„ν•©λ‹ˆλ‹€. -- μ›Ή 폰트λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. -- λ°˜μ‘ν˜•μ„ κ³ λ €ν•©λ‹ˆλ‹€. - -### πŸ”‘ Research Question - -- μ „λ°˜μ μΈ ν˜‘μ—… 과정에 λŒ€ν•΄ μ•Œλ €μ£Όμ„Έμš”. πŸ‘πŸ» (21κΈ° PR μ°Έκ³ ν•˜μ…”λ„ 쒋을 것 κ°™μ•„μš”) - ---- - -### **πŸ”— 링크 및 참고자료** - -- [useCallbackκ³Ό React.Memoλ₯Ό μ΄μš©ν•œ λ Œλ”λ§ μ΅œμ ν™”](https://velog.io/@yejinh/useCallback%EA%B3%BC-React.Memo%EC%9D%84-%ED%86%B5%ED%95%9C-%EB%A0%8C%EB%8D%94%EB%A7%81-%EC%B5%9C%EC%A0%81%ED%99%94) -- [μ„±λŠ₯ μ΅œμ ν™”](https://ui.toast.com/fe-guide/ko_PERFORMANCE) -- [React 18의 μƒˆλ‘œμš΄ κΈ°λŠ₯](https://www.youtube.com/watch?v=7mkQi0TlJQo) -- [react μ„œλ²„ μ»΄ν¬λ„ŒνŠΈκ°€ ν•΄κ²°ν•˜λŠ” λ¬Έμ œλ“€ in kakao 기술 λΈ”λ‘œκ·Έ](https://tech.kakaopay.com/post/react-server-components/) -- [vercel의 배포 방식](https://www.youtube.com/watch?v=8q-jCvLWwKc&t=11s) -- [λžœλ”©νŽ˜μ΄μ§€ μ˜μƒ](https://lottiefiles.com/kr/) -- [Next.js Docs](https://beta.nextjs.org/docs) -- [Next.js 13μ—μ„œ λ³€ν•œ 것듀](https://velog.io/@hang_kem_0531/Next.js-13%EC%9D%B4-%EB%82%98%EC%99%80%EB%B2%84%EB%A0%B8%EB%8B%A4) -- [Next.js 14μ—μ„œ λ³€ν•œ 것듀](https://velog.io/@lee_1124/Next.js-14-%EC%97%85%EB%8D%B0%EC%9D%B4%ED%8A%B8) -- [Git ν˜‘μ—… κ°€μ΄λ“œ](https://velog.io/@jinuku/Git-%ED%98%91%EC%97%85-%EA%B0%80%EC%9D%B4%EB%93%9C) -- [λ””μžμ΄λ„ˆμ™€ κ°œλ°œμžκ°€ ν˜‘μ—…ν•˜κΈ° μœ„ν•œ ν”Όκ·Έλ§ˆ κΈ°λ³Έ κΈ°λŠ₯](https://chingguhl.tistory.com/entry/%EA%B0%9C%EB%B0%9C%EC%9E%90%EA%B0%80-%EA%BC%AD-%EC%95%8C%EC%95%84%EC%95%BC-%ED%95%A0-%ED%94%BC%EA%B7%B8%EB%A7%88-10%EA%B0%80%EC%A7%80-%EA%B8%B0%EB%8A%A5-%EB%94%94%EC%9E%90%EC%9D%B4%EB%84%88%EC%99%80-%EA%B0%9C%EB%B0%9C%EC%9E%90%EA%B0%80-%ED%98%91%EC%97%85%ED%95%98%EA%B8%B0-%EC%9C%84%ED%95%9C-%ED%94%BC%EA%B7%B8%EB%A7%88-%EA%B8%B0%EB%B3%B8-%EA%B8%B0%EB%8A%A5) +Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. diff --git a/app/favicon.ico b/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 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 LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/app/globals.css b/app/globals.css new file mode 100644 index 0000000..a2dc41e --- /dev/null +++ b/app/globals.css @@ -0,0 +1,26 @@ +@import "tailwindcss"; + +:root { + --background: #ffffff; + --foreground: #171717; +} + +@theme inline { + --color-background: var(--background); + --color-foreground: var(--foreground); + --font-sans: var(--font-geist-sans); + --font-mono: var(--font-geist-mono); +} + +@media (prefers-color-scheme: dark) { + :root { + --background: #0a0a0a; + --foreground: #ededed; + } +} + +body { + background: var(--background); + color: var(--foreground); + font-family: Arial, Helvetica, sans-serif; +} diff --git a/app/layout.tsx b/app/layout.tsx new file mode 100644 index 0000000..f7fa87e --- /dev/null +++ b/app/layout.tsx @@ -0,0 +1,34 @@ +import type { Metadata } from "next"; +import { Geist, Geist_Mono } from "next/font/google"; +import "./globals.css"; + +const geistSans = Geist({ + variable: "--font-geist-sans", + subsets: ["latin"], +}); + +const geistMono = Geist_Mono({ + variable: "--font-geist-mono", + subsets: ["latin"], +}); + +export const metadata: Metadata = { + title: "Create Next App", + description: "Generated by create next app", +}; + +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( + + + {children} + + + ); +} diff --git a/app/page.tsx b/app/page.tsx new file mode 100644 index 0000000..295f8fd --- /dev/null +++ b/app/page.tsx @@ -0,0 +1,65 @@ +import Image from "next/image"; + +export default function Home() { + return ( +
+
+ Next.js logo +
+

+ To get started, edit the page.tsx file. +

+

+ Looking for a starting point or more instructions? Head over to{" "} + + Templates + {" "} + or the{" "} + + Learning + {" "} + center. +

+
+ +
+
+ ); +} diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..05e726d --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,18 @@ +import { defineConfig, globalIgnores } from "eslint/config"; +import nextVitals from "eslint-config-next/core-web-vitals"; +import nextTs from "eslint-config-next/typescript"; + +const eslintConfig = defineConfig([ + ...nextVitals, + ...nextTs, + // Override default ignores of eslint-config-next. + globalIgnores([ + // Default ignores of eslint-config-next: + ".next/**", + "out/**", + "build/**", + "next-env.d.ts", + ]), +]); + +export default eslintConfig; diff --git a/next.config.ts b/next.config.ts new file mode 100644 index 0000000..e9ffa30 --- /dev/null +++ b/next.config.ts @@ -0,0 +1,7 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + /* config options here */ +}; + +export default nextConfig; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..e901ba3 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6537 @@ +{ + "name": "next-netflix-22nd", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "next-netflix-22nd", + "version": "0.1.0", + "dependencies": { + "next": "16.0.0", + "react": "19.2.0", + "react-dom": "19.2.0" + }, + "devDependencies": { + "@tailwindcss/postcss": "^4", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "eslint": "^9", + "eslint-config-next": "16.0.0", + "tailwindcss": "^4", + "typescript": "^5" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", + "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", + "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", + "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@babel/types": "^7.28.5", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", + "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", + "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.5", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.5", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.5", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", + "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@emnapi/core": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.6.0.tgz", + "integrity": "sha512-zq/ay+9fNIJJtJiZxdTnXS20PllcYMX3OE23ESc4HK/bdYu3cOWYVhsOhVnXALfU/uqJIxn5NBPd9z4v+SfoSg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/wasi-threads": "1.1.0", + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/runtime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.6.0.tgz", + "integrity": "sha512-obtUmAHTMjll499P+D9A3axeJFlhdjOWdKUNs/U6QIGT7V5RjcUW1xToAzjvmgTSQhDbYn/NwfTRoJcQ2rNBxA==", + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@emnapi/wasi-threads": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.1.0.tgz", + "integrity": "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.1.tgz", + "integrity": "sha512-csZAzkNhsgwb0I/UAV6/RGFTbiakPCf0ZrGmrIxQpYvGZ00PhTkSnyKNolphgIvmnJeGw6rcGVEXfTzUnFuEvw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz", + "integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "9.38.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.38.0.tgz", + "integrity": "sha512-UZ1VpFvXf9J06YG9xQBdnzU+kthors6KjhMAl6f4gH4usHyh31rUf2DLGInT8RFYIReYXNSydgPY0V2LuWgl7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz", + "integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.16.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@img/colour": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", + "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@img/sharp-darwin-arm64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.4.tgz", + "integrity": "sha512-sitdlPzDVyvmINUdJle3TNHl+AG9QcwiAMsXmccqsCOMZNIdW2/7S26w0LyU8euiLVzFBL3dXPwVCq/ODnf2vA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-arm64": "1.2.3" + } + }, + "node_modules/@img/sharp-darwin-x64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.4.tgz", + "integrity": "sha512-rZheupWIoa3+SOdF/IcUe1ah4ZDpKBGWcsPX6MT0lYniH9micvIU7HQkYTfrx5Xi8u+YqwLtxC/3vl8TQN6rMg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-darwin-x64": "1.2.3" + } + }, + "node_modules/@img/sharp-libvips-darwin-arm64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.3.tgz", + "integrity": "sha512-QzWAKo7kpHxbuHqUC28DZ9pIKpSi2ts2OJnoIGI26+HMgq92ZZ4vk8iJd4XsxN+tYfNJxzH6W62X5eTcsBymHw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-darwin-x64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.3.tgz", + "integrity": "sha512-Ju+g2xn1E2AKO6YBhxjj+ACcsPQRHT0bhpglxcEf+3uyPY+/gL8veniKoo96335ZaPo03bdDXMv0t+BBFAbmRA==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "darwin" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.3.tgz", + "integrity": "sha512-x1uE93lyP6wEwGvgAIV0gP6zmaL/a0tGzJs/BIDDG0zeBhMnuUPm7ptxGhUbcGs4okDJrk4nxgrmxpib9g6HpA==", + "cpu": [ + "arm" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-arm64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.3.tgz", + "integrity": "sha512-I4RxkXU90cpufazhGPyVujYwfIm9Nk1QDEmiIsaPwdnm013F7RIceaCc87kAH+oUB1ezqEvC6ga4m7MSlqsJvQ==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-ppc64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.3.tgz", + "integrity": "sha512-Y2T7IsQvJLMCBM+pmPbM3bKT/yYJvVtLJGfCs4Sp95SjvnFIjynbjzsa7dY1fRJX45FTSfDksbTp6AGWudiyCg==", + "cpu": [ + "ppc64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-s390x": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.3.tgz", + "integrity": "sha512-RgWrs/gVU7f+K7P+KeHFaBAJlNkD1nIZuVXdQv6S+fNA6syCcoboNjsV2Pou7zNlVdNQoQUpQTk8SWDHUA3y/w==", + "cpu": [ + "s390x" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linux-x64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.3.tgz", + "integrity": "sha512-3JU7LmR85K6bBiRzSUc/Ff9JBVIFVvq6bomKE0e63UXGeRw2HPVEjoJke1Yx+iU4rL7/7kUjES4dZ/81Qjhyxg==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-arm64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.3.tgz", + "integrity": "sha512-F9q83RZ8yaCwENw1GieztSfj5msz7GGykG/BA+MOUefvER69K/ubgFHNeSyUu64amHIYKGDs4sRCMzXVj8sEyw==", + "cpu": [ + "arm64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-libvips-linuxmusl-x64": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.3.tgz", + "integrity": "sha512-U5PUY5jbc45ANM6tSJpsgqmBF/VsL6LnxJmIf11kB7J5DctHgqm0SkuXzVWtIY90GnJxKnC/JT251TDnk1fu/g==", + "cpu": [ + "x64" + ], + "license": "LGPL-3.0-or-later", + "optional": true, + "os": [ + "linux" + ], + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-linux-arm": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.4.tgz", + "integrity": "sha512-Xyam4mlqM0KkTHYVSuc6wXRmM7LGN0P12li03jAnZ3EJWZqj83+hi8Y9UxZUbxsgsK1qOEwg7O0Bc0LjqQVtxA==", + "cpu": [ + "arm" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm": "1.2.3" + } + }, + "node_modules/@img/sharp-linux-arm64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.4.tgz", + "integrity": "sha512-YXU1F/mN/Wu786tl72CyJjP/Ngl8mGHN1hST4BGl+hiW5jhCnV2uRVTNOcaYPs73NeT/H8Upm3y9582JVuZHrQ==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-arm64": "1.2.3" + } + }, + "node_modules/@img/sharp-linux-ppc64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.4.tgz", + "integrity": "sha512-F4PDtF4Cy8L8hXA2p3TO6s4aDt93v+LKmpcYFLAVdkkD3hSxZzee0rh6/+94FpAynsuMpLX5h+LRsSG3rIciUQ==", + "cpu": [ + "ppc64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-ppc64": "1.2.3" + } + }, + "node_modules/@img/sharp-linux-s390x": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.4.tgz", + "integrity": "sha512-qVrZKE9Bsnzy+myf7lFKvng6bQzhNUAYcVORq2P7bDlvmF6u2sCmK2KyEQEBdYk+u3T01pVsPrkj943T1aJAsw==", + "cpu": [ + "s390x" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-s390x": "1.2.3" + } + }, + "node_modules/@img/sharp-linux-x64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.4.tgz", + "integrity": "sha512-ZfGtcp2xS51iG79c6Vhw9CWqQC8l2Ot8dygxoDoIQPTat/Ov3qAa8qpxSrtAEAJW+UjTXc4yxCjNfxm4h6Xm2A==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linux-x64": "1.2.3" + } + }, + "node_modules/@img/sharp-linuxmusl-arm64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.4.tgz", + "integrity": "sha512-8hDVvW9eu4yHWnjaOOR8kHVrew1iIX+MUgwxSuH2XyYeNRtLUe4VNioSqbNkB7ZYQJj9rUTT4PyRscyk2PXFKA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-arm64": "1.2.3" + } + }, + "node_modules/@img/sharp-linuxmusl-x64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.4.tgz", + "integrity": "sha512-lU0aA5L8QTlfKjpDCEFOZsTYGn3AEiO6db8W5aQDxj0nQkVrZWmN3ZP9sYKWJdtq3PWPhUNlqehWyXpYDcI9Sg==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-libvips-linuxmusl-x64": "1.2.3" + } + }, + "node_modules/@img/sharp-wasm32": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.4.tgz", + "integrity": "sha512-33QL6ZO/qpRyG7woB/HUALz28WnTMI2W1jgX3Nu2bypqLIKx/QKMILLJzJjI+SIbvXdG9fUnmrxR7vbi1sTBeA==", + "cpu": [ + "wasm32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", + "optional": true, + "dependencies": { + "@emnapi/runtime": "^1.5.0" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-arm64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.4.tgz", + "integrity": "sha512-2Q250do/5WXTwxW3zjsEuMSv5sUU4Tq9VThWKlU2EYLm4MB7ZeMwF+SFJutldYODXF6jzc6YEOC+VfX0SZQPqA==", + "cpu": [ + "arm64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-ia32": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.4.tgz", + "integrity": "sha512-3ZeLue5V82dT92CNL6rsal6I2weKw1cYu+rGKm8fOCCtJTR2gYeUfY3FqUnIJsMUPIH68oS5jmZ0NiJ508YpEw==", + "cpu": [ + "ia32" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@img/sharp-win32-x64": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.4.tgz", + "integrity": "sha512-xIyj4wpYs8J18sVN3mSQjwrw7fKUqRw+Z5rnHNCy5fYTxigBz81u5mOMPmFumwjcn8+ld1ppptMBCLic1nz6ig==", + "cpu": [ + "x64" + ], + "license": "Apache-2.0 AND LGPL-3.0-or-later", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@napi-rs/wasm-runtime": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", + "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.4.3", + "@emnapi/runtime": "^1.4.3", + "@tybys/wasm-util": "^0.10.0" + } + }, + "node_modules/@next/env": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.0.0.tgz", + "integrity": "sha512-s5j2iFGp38QsG1LWRQaE2iUY3h1jc014/melHFfLdrsMJPqxqDQwWNwyQTcNoUSGZlCVZuM7t7JDMmSyRilsnA==", + "license": "MIT" + }, + "node_modules/@next/eslint-plugin-next": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.0.0.tgz", + "integrity": "sha512-IB7RzmmtrPOrpAgEBR1PIQPD0yea5lggh5cq54m51jHjjljU80Ia+czfxJYMlSDl1DPvpzb8S9TalCc0VMo9Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-glob": "3.3.1" + } + }, + "node_modules/@next/swc-darwin-arm64": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.0.0.tgz", + "integrity": "sha512-/CntqDCnk5w2qIwMiF0a9r6+9qunZzFmU0cBX4T82LOflE72zzH6gnOjCwUXYKOBlQi8OpP/rMj8cBIr18x4TA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-darwin-x64": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.0.0.tgz", + "integrity": "sha512-hB4GZnJGKa8m4efvTGNyii6qs76vTNl+3dKHTCAUaksN6KjYy4iEO3Q5ira405NW2PKb3EcqWiRaL9DrYJfMHg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-gnu": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.0.0.tgz", + "integrity": "sha512-E2IHMdE+C1k+nUgndM13/BY/iJY9KGCphCftMh7SXWcaQqExq/pJU/1Hgn8n/tFwSoLoYC/yUghOv97tAsIxqg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-arm64-musl": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.0.0.tgz", + "integrity": "sha512-xzgl7c7BVk4+7PDWldU+On2nlwnGgFqJ1siWp3/8S0KBBLCjonB6zwJYPtl4MUY7YZJrzzumdUpUoquu5zk8vg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-gnu": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.0.0.tgz", + "integrity": "sha512-sdyOg4cbiCw7YUr0F/7ya42oiVBXLD21EYkSwN+PhE4csJH4MSXUsYyslliiiBwkM+KsuQH/y9wuxVz6s7Nstg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.0.0.tgz", + "integrity": "sha512-IAXv3OBYqVaNOgyd3kxR4L3msuhmSy1bcchPHxDOjypG33i2yDWvGBwFD94OuuTjjTt/7cuIKtAmoOOml6kfbg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.0.0.tgz", + "integrity": "sha512-bmo3ncIJKUS9PWK1JD9pEVv0yuvp1KPuOsyJTHXTv8KDrEmgV/K+U0C75rl9rhIaODcS7JEb6/7eJhdwXI0XmA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.0.0.tgz", + "integrity": "sha512-O1cJbT+lZp+cTjYyZGiDwsOjO3UHHzSqobkPNipdlnnuPb1swfcuY6r3p8dsKU4hAIEO4cO67ZCfVVH/M1ETXA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@swc/helpers": { + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", + "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.16.tgz", + "integrity": "sha512-BX5iaSsloNuvKNHRN3k2RcCuTEgASTo77mofW0vmeHkfrDWaoFAFvNHpEgtu0eqyypcyiBkDWzSMxJhp3AUVcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/remapping": "^2.3.4", + "enhanced-resolve": "^5.18.3", + "jiti": "^2.6.1", + "lightningcss": "1.30.2", + "magic-string": "^0.30.19", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.16" + } + }, + "node_modules/@tailwindcss/oxide": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.16.tgz", + "integrity": "sha512-2OSv52FRuhdlgyOQqgtQHuCgXnS8nFSYRp2tJ+4WZXKgTxqPy7SMSls8c3mPT5pkZ17SBToGM5LHEJBO7miEdg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@tailwindcss/oxide-android-arm64": "4.1.16", + "@tailwindcss/oxide-darwin-arm64": "4.1.16", + "@tailwindcss/oxide-darwin-x64": "4.1.16", + "@tailwindcss/oxide-freebsd-x64": "4.1.16", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.16", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.16", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.16", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.16", + "@tailwindcss/oxide-linux-x64-musl": "4.1.16", + "@tailwindcss/oxide-wasm32-wasi": "4.1.16", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.16", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.16" + } + }, + "node_modules/@tailwindcss/oxide-android-arm64": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.16.tgz", + "integrity": "sha512-8+ctzkjHgwDJ5caq9IqRSgsP70xhdhJvm+oueS/yhD5ixLhqTw9fSL1OurzMUhBwE5zK26FXLCz2f/RtkISqHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-arm64": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.16.tgz", + "integrity": "sha512-C3oZy5042v2FOALBZtY0JTDnGNdS6w7DxL/odvSny17ORUnaRKhyTse8xYi3yKGyfnTUOdavRCdmc8QqJYwFKA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-darwin-x64": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.16.tgz", + "integrity": "sha512-vjrl/1Ub9+JwU6BP0emgipGjowzYZMjbWCDqwA2Z4vCa+HBSpP4v6U2ddejcHsolsYxwL5r4bPNoamlV0xDdLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-freebsd-x64": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.16.tgz", + "integrity": "sha512-TSMpPYpQLm+aR1wW5rKuUuEruc/oOX3C7H0BTnPDn7W/eMw8W+MRMpiypKMkXZfwH8wqPIRKppuZoedTtNj2tg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.16.tgz", + "integrity": "sha512-p0GGfRg/w0sdsFKBjMYvvKIiKy/LNWLWgV/plR4lUgrsxFAoQBFrXkZ4C0w8IOXfslB9vHK/JGASWD2IefIpvw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.16.tgz", + "integrity": "sha512-DoixyMmTNO19rwRPdqviTrG1rYzpxgyYJl8RgQvdAQUzxC1ToLRqtNJpU/ATURSKgIg6uerPw2feW0aS8SNr/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-arm64-musl": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.16.tgz", + "integrity": "sha512-H81UXMa9hJhWhaAUca6bU2wm5RRFpuHImrwXBUvPbYb+3jo32I9VIwpOX6hms0fPmA6f2pGVlybO6qU8pF4fzQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-gnu": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.16.tgz", + "integrity": "sha512-ZGHQxDtFC2/ruo7t99Qo2TTIvOERULPl5l0K1g0oK6b5PGqjYMga+FcY1wIUnrUxY56h28FxybtDEla+ICOyew==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-linux-x64-musl": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.16.tgz", + "integrity": "sha512-Oi1tAaa0rcKf1Og9MzKeINZzMLPbhxvm7rno5/zuP1WYmpiG0bEHq4AcRUiG2165/WUzvxkW4XDYCscZWbTLZw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-wasm32-wasi": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.16.tgz", + "integrity": "sha512-B01u/b8LteGRwucIBmCQ07FVXLzImWESAIMcUU6nvFt/tYsQ6IHz8DmZ5KtvmwxD+iTYBtM1xwoGXswnlu9v0Q==", + "bundleDependencies": [ + "@napi-rs/wasm-runtime", + "@emnapi/core", + "@emnapi/runtime", + "@tybys/wasm-util", + "@emnapi/wasi-threads", + "tslib" + ], + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@emnapi/core": "^1.5.0", + "@emnapi/runtime": "^1.5.0", + "@emnapi/wasi-threads": "^1.1.0", + "@napi-rs/wasm-runtime": "^1.0.7", + "@tybys/wasm-util": "^0.10.1", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.16.tgz", + "integrity": "sha512-zX+Q8sSkGj6HKRTMJXuPvOcP8XfYON24zJBRPlszcH1Np7xuHXhWn8qfFjIujVzvH3BHU+16jBXwgpl20i+v9A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/oxide-win32-x64-msvc": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.16.tgz", + "integrity": "sha512-m5dDFJUEejbFqP+UXVstd4W/wnxA4F61q8SoL+mqTypId2T2ZpuxosNSgowiCnLp2+Z+rivdU0AqpfgiD7yCBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@tailwindcss/postcss": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.16.tgz", + "integrity": "sha512-Qn3SFGPXYQMKR/UtqS+dqvPrzEeBZHrFA92maT4zijCVggdsXnDBMsPFJo1eArX3J+O+Gi+8pV4PkqjLCNBk3A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "@tailwindcss/node": "4.1.16", + "@tailwindcss/oxide": "4.1.16", + "postcss": "^8.4.41", + "tailwindcss": "4.1.16" + } + }, + "node_modules/@tybys/wasm-util": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", + "integrity": "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.19.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.23.tgz", + "integrity": "sha512-yIdlVVVHXpmqRhtyovZAcSy0MiPcYWGkoO4CGe/+jpP0hmNuihm4XhHbADpK++MsiLHP5MVlv+bcgdF99kSiFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/react": { + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz", + "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.2.tgz", + "integrity": "sha512-9KQPoO6mZCi7jcIStSnlOWn2nEF3mNmyr3rIAsGnAbQKYbRLyqmeSc39EVgtxXVia+LMT8j3knZLAZAh+xLmrw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.2.tgz", + "integrity": "sha512-ZGBMToy857/NIPaaCucIUQgqueOiq7HeAKkhlvqVV4lm089zUFW6ikRySx2v+cAhKeUCPuWVHeimyk6Dw1iY3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.46.2", + "@typescript-eslint/type-utils": "8.46.2", + "@typescript-eslint/utils": "8.46.2", + "@typescript-eslint/visitor-keys": "8.46.2", + "graphemer": "^1.4.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.46.2", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.2.tgz", + "integrity": "sha512-BnOroVl1SgrPLywqxyqdJ4l3S2MsKVLDVxZvjI1Eoe8ev2r3kGDo+PcMihNmDE+6/KjkTubSJnmqGZZjQSBq/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.46.2", + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/typescript-estree": "8.46.2", + "@typescript-eslint/visitor-keys": "8.46.2", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.2.tgz", + "integrity": "sha512-PULOLZ9iqwI7hXcmL4fVfIsBi6AN9YxRc0frbvmg8f+4hQAjQ5GYNKK0DIArNo+rOKmR/iBYwkpBmnIwin4wBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.46.2", + "@typescript-eslint/types": "^8.46.2", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.2.tgz", + "integrity": "sha512-LF4b/NmGvdWEHD2H4MsHD8ny6JpiVNDzrSZr3CsckEgCbAGZbYM4Cqxvi9L+WqDMT+51Ozy7lt2M+d0JLEuBqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/visitor-keys": "8.46.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.2.tgz", + "integrity": "sha512-a7QH6fw4S57+F5y2FIxxSDyi5M4UfGF+Jl1bCGd7+L4KsaUY80GsiF/t0UoRFDHAguKlBaACWJRmdrc6Xfkkag==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.2.tgz", + "integrity": "sha512-HbPM4LbaAAt/DjxXaG9yiS9brOOz6fabal4uvUmaUYe6l3K1phQDMQKBRUrr06BQkxkvIZVVHttqiybM9nJsLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/typescript-estree": "8.46.2", + "@typescript-eslint/utils": "8.46.2", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.2.tgz", + "integrity": "sha512-lNCWCbq7rpg7qDsQrd3D6NyWYu+gkTENkG5IKYhUIcxSb59SQC/hEQ+MrG4sTgBVghTonNWq42bA/d4yYumldQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.2.tgz", + "integrity": "sha512-f7rW7LJ2b7Uh2EiQ+7sza6RDZnajbNbemn54Ob6fRwQbgcIn+GWfyuHDHRYgRoZu1P4AayVScrRW+YfbTvPQoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.46.2", + "@typescript-eslint/tsconfig-utils": "8.46.2", + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/visitor-keys": "8.46.2", + "debug": "^4.3.4", + "fast-glob": "^3.3.2", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.2.tgz", + "integrity": "sha512-sExxzucx0Tud5tE0XqR0lT0psBQvEpnpiul9XbGUB1QwpWJJAps1O/Z7hJxLGiZLBKMCutjTzDgmd1muEhBnVg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.46.2", + "@typescript-eslint/types": "8.46.2", + "@typescript-eslint/typescript-estree": "8.46.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.2.tgz", + "integrity": "sha512-tUFMXI4gxzzMXt4xpGJEsBsTox0XbNQ1y94EwlD/CuZwFcQP79xfQqMhau9HsRc/J0cAPA/HZt1dZPtGn9V/7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.46.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@unrs/resolver-binding-android-arm-eabi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", + "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-android-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", + "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-arm64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", + "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-darwin-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", + "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@unrs/resolver-binding-freebsd-x64": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", + "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", + "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", + "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", + "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-arm64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", + "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", + "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", + "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", + "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", + "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-gnu": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", + "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-linux-x64-musl": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", + "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@unrs/resolver-binding-wasm32-wasi": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", + "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", + "cpu": [ + "wasm32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "@napi-rs/wasm-runtime": "^0.2.11" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", + "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", + "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@unrs/resolver-binding-win32-x64-msvc": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", + "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/aria-query": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz", + "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", + "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "is-array-buffer": "^3.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.9.tgz", + "integrity": "sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.24.0", + "es-object-atoms": "^1.1.1", + "get-intrinsic": "^1.3.0", + "is-string": "^1.1.1", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlast": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", + "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz", + "integrity": "sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-shim-unscopables": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", + "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", + "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", + "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3", + "es-errors": "^1.3.0", + "es-shim-unscopables": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", + "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.1", + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ast-types-flow": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz", + "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/async-function": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", + "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.0.tgz", + "integrity": "sha512-ilYanEU8vxxBexpJd8cWM4ElSQq4QctCLKih0TSfjIfCQTeyH/6zVrmIJfLPrKTKJRbiG+cfnZbQIjAlJmF1jQ==", + "dev": true, + "license": "MPL-2.0", + "engines": { + "node": ">=4" + } + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", + "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.20", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.20.tgz", + "integrity": "sha512-JMWsdF+O8Orq3EMukbUN1QfbLK9mX2CkUmQBcW2T0s8OmdAUL5LLM/6wFwSrqXzlXB13yhyK9gTKS1rIizOduQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.27.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz", + "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.8.19", + "caniuse-lite": "^1.0.30001751", + "electron-to-chromium": "^1.5.238", + "node-releases": "^2.0.26", + "update-browserslist-db": "^1.1.4" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.0", + "es-define-property": "^1.0.0", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001751", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz", + "integrity": "sha512-A0QJhug0Ly64Ii3eIqHu5X51ebln3k4yTUkY1j8drqpWHVreg/VLijN48cZ1bYPiqOQuqpkIKnzr/Ul8V+p6Cw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/client-only": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", + "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", + "license": "MIT" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/data-view-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", + "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", + "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/inspect-js" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", + "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.241", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.241.tgz", + "integrity": "sha512-ILMvKX/ZV5WIJzzdtuHg8xquk2y0BOGlFOxBVwTpbiXqWIH0hamG45ddU4R3PQ0gYu+xgo0vdHXHli9sHIGb4w==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.18.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.3.tgz", + "integrity": "sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==", + "dev": true, + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/es-abstract": { + "version": "1.24.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", + "integrity": "sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-buffer-byte-length": "^1.0.2", + "arraybuffer.prototype.slice": "^1.0.4", + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "data-view-buffer": "^1.0.2", + "data-view-byte-length": "^1.0.2", + "data-view-byte-offset": "^1.0.1", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "es-set-tostringtag": "^2.1.0", + "es-to-primitive": "^1.3.0", + "function.prototype.name": "^1.1.8", + "get-intrinsic": "^1.3.0", + "get-proto": "^1.0.1", + "get-symbol-description": "^1.1.0", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "internal-slot": "^1.1.0", + "is-array-buffer": "^3.0.5", + "is-callable": "^1.2.7", + "is-data-view": "^1.0.2", + "is-negative-zero": "^2.0.3", + "is-regex": "^1.2.1", + "is-set": "^2.0.3", + "is-shared-array-buffer": "^1.0.4", + "is-string": "^1.1.1", + "is-typed-array": "^1.1.15", + "is-weakref": "^1.1.1", + "math-intrinsics": "^1.1.0", + "object-inspect": "^1.13.4", + "object-keys": "^1.1.1", + "object.assign": "^4.1.7", + "own-keys": "^1.0.1", + "regexp.prototype.flags": "^1.5.4", + "safe-array-concat": "^1.1.3", + "safe-push-apply": "^1.0.0", + "safe-regex-test": "^1.1.0", + "set-proto": "^1.0.0", + "stop-iteration-iterator": "^1.1.0", + "string.prototype.trim": "^1.2.10", + "string.prototype.trimend": "^1.0.9", + "string.prototype.trimstart": "^1.0.8", + "typed-array-buffer": "^1.0.3", + "typed-array-byte-length": "^1.0.3", + "typed-array-byte-offset": "^1.0.4", + "typed-array-length": "^1.0.7", + "unbox-primitive": "^1.1.0", + "which-typed-array": "^1.1.19" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-iterator-helpers": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", + "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-set-tostringtag": "^2.0.3", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.6", + "globalthis": "^1.0.4", + "gopd": "^1.2.0", + "has-property-descriptors": "^1.0.2", + "has-proto": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "iterator.prototype": "^1.1.4", + "safe-array-concat": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", + "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-to-primitive": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.38.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.38.0.tgz", + "integrity": "sha512-t5aPOpmtJcZcz5UJyY2GbvpDlsK5E8JqRqoKtfiKE3cNh437KIqfJr3A3AKf5k64NPx6d0G3dno6XDY05PqPtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.1", + "@eslint/core": "^0.16.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.38.0", + "@eslint/plugin-kit": "^0.4.0", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-next": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.0.0.tgz", + "integrity": "sha512-DWKT1YAO9ex2rK0/EeiPpKU++ghTiG59z6m08/ReLRECOYIaEv17maSCYT8zmFQLwIrY5lhJ+iaJPQdT4sJd4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@next/eslint-plugin-next": "16.0.0", + "eslint-import-resolver-node": "^0.3.6", + "eslint-import-resolver-typescript": "^3.5.2", + "eslint-plugin-import": "^2.32.0", + "eslint-plugin-jsx-a11y": "^6.10.0", + "eslint-plugin-react": "^7.37.0", + "eslint-plugin-react-hooks": "^7.0.0", + "globals": "16.4.0", + "typescript-eslint": "^8.46.0" + }, + "peerDependencies": { + "eslint": ">=9.0.0", + "typescript": ">=3.3.1" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-config-next/node_modules/globals": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-import-resolver-typescript": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.10.1.tgz", + "integrity": "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "@nolyfill/is-core-module": "1.0.39", + "debug": "^4.4.0", + "get-tsconfig": "^4.10.0", + "is-bun-module": "^2.0.0", + "stable-hash": "^0.0.5", + "tinyglobby": "^0.2.13", + "unrs-resolver": "^1.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-import-resolver-typescript" + }, + "peerDependencies": { + "eslint": "*", + "eslint-plugin-import": "*", + "eslint-plugin-import-x": "*" + }, + "peerDependenciesMeta": { + "eslint-plugin-import": { + "optional": true + }, + "eslint-plugin-import-x": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.1.tgz", + "integrity": "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz", + "integrity": "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rtsao/scc": "^1.1.0", + "array-includes": "^3.1.9", + "array.prototype.findlastindex": "^1.2.6", + "array.prototype.flat": "^1.3.3", + "array.prototype.flatmap": "^1.3.3", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.12.1", + "hasown": "^2.0.2", + "is-core-module": "^2.16.1", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "object.groupby": "^1.0.3", + "object.values": "^1.2.1", + "semver": "^6.3.1", + "string.prototype.trimend": "^1.0.9", + "tsconfig-paths": "^3.15.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", + "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "aria-query": "^5.3.2", + "array-includes": "^3.1.8", + "array.prototype.flatmap": "^1.3.2", + "ast-types-flow": "^0.0.8", + "axe-core": "^4.10.0", + "axobject-query": "^4.1.0", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "hasown": "^2.0.2", + "jsx-ast-utils": "^3.3.5", + "language-tags": "^1.0.9", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.8", + "safe-regex-test": "^1.0.3", + "string.prototype.includes": "^2.0.1" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.37.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", + "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.8", + "array.prototype.findlast": "^1.2.5", + "array.prototype.flatmap": "^1.3.3", + "array.prototype.tosorted": "^1.1.4", + "doctrine": "^2.1.0", + "es-iterator-helpers": "^1.2.1", + "estraverse": "^5.3.0", + "hasown": "^2.0.2", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.9", + "object.fromentries": "^2.0.8", + "object.values": "^1.2.1", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.5", + "semver": "^6.3.1", + "string.prototype.matchall": "^4.0.12", + "string.prototype.repeat": "^1.0.0" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.0.1.tgz", + "integrity": "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/parser": "^7.24.4", + "hermes-parser": "^0.25.1", + "zod": "^3.25.0 || ^4.0.0", + "zod-validation-error": "^3.5.0 || ^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.5", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", + "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/for-each": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", + "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/function.prototype.name": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", + "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "functions-have-names": "^1.2.3", + "hasown": "^2.0.2", + "is-callable": "^1.2.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/generator-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/generator-function/-/generator-function-2.0.1.tgz", + "integrity": "sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-symbol-description": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", + "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-tsconfig": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", + "integrity": "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", + "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.2.1", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-bigints": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.1.0.tgz", + "integrity": "sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", + "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hermes-estree": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", + "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==", + "dev": true, + "license": "MIT" + }, + "node_modules/hermes-parser": { + "version": "0.25.1", + "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz", + "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hermes-estree": "0.25.1" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/internal-slot": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", + "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", + "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-async-function": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", + "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "async-function": "^1.0.0", + "call-bound": "^1.0.3", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bigint": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-bigints": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", + "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-bun-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", + "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.7.1" + } + }, + "node_modules/is-bun-module/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-view": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", + "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", + "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-finalizationregistry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", + "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-generator-function": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", + "integrity": "sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.4", + "generator-function": "^2.0.0", + "get-proto": "^1.0.1", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", + "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", + "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", + "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", + "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", + "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "has-symbols": "^1.1.0", + "safe-regex-test": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", + "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", + "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "get-intrinsic": "^1.2.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true, + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/iterator.prototype": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", + "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "get-proto": "^1.0.0", + "has-symbols": "^1.1.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/jiti": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", + "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", + "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.23", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", + "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/language-tags": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz", + "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==", + "dev": true, + "license": "MIT", + "dependencies": { + "language-subtag-registry": "^0.3.20" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lightningcss": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", + "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", + "dev": true, + "license": "MPL-2.0", + "dependencies": { + "detect-libc": "^2.0.3" + }, + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "lightningcss-android-arm64": "1.30.2", + "lightningcss-darwin-arm64": "1.30.2", + "lightningcss-darwin-x64": "1.30.2", + "lightningcss-freebsd-x64": "1.30.2", + "lightningcss-linux-arm-gnueabihf": "1.30.2", + "lightningcss-linux-arm64-gnu": "1.30.2", + "lightningcss-linux-arm64-musl": "1.30.2", + "lightningcss-linux-x64-gnu": "1.30.2", + "lightningcss-linux-x64-musl": "1.30.2", + "lightningcss-win32-arm64-msvc": "1.30.2", + "lightningcss-win32-x64-msvc": "1.30.2" + } + }, + "node_modules/lightningcss-android-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", + "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-arm64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", + "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-darwin-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", + "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-freebsd-x64": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", + "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm-gnueabihf": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", + "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", + "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-arm64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", + "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-gnu": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", + "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-linux-x64-musl": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", + "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-arm64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", + "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/lightningcss-win32-x64-msvc": { + "version": "1.30.2", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", + "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MPL-2.0", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/napi-postinstall": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz", + "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==", + "dev": true, + "license": "MIT", + "bin": { + "napi-postinstall": "lib/cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/napi-postinstall" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/next": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/next/-/next-16.0.0.tgz", + "integrity": "sha512-nYohiNdxGu4OmBzggxy9rczmjIGI+TpR5vbKTsE1HqYwNm1B+YSiugSrFguX6omMOKnDHAmBPY4+8TNJk0Idyg==", + "license": "MIT", + "dependencies": { + "@next/env": "16.0.0", + "@swc/helpers": "0.5.15", + "caniuse-lite": "^1.0.30001579", + "postcss": "8.4.31", + "styled-jsx": "5.1.6" + }, + "bin": { + "next": "dist/bin/next" + }, + "engines": { + "node": ">=20.9.0" + }, + "optionalDependencies": { + "@next/swc-darwin-arm64": "16.0.0", + "@next/swc-darwin-x64": "16.0.0", + "@next/swc-linux-arm64-gnu": "16.0.0", + "@next/swc-linux-arm64-musl": "16.0.0", + "@next/swc-linux-x64-gnu": "16.0.0", + "@next/swc-linux-x64-musl": "16.0.0", + "@next/swc-win32-arm64-msvc": "16.0.0", + "@next/swc-win32-x64-msvc": "16.0.0", + "sharp": "^0.34.4" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.1.0", + "@playwright/test": "^1.51.1", + "babel-plugin-react-compiler": "*", + "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", + "sass": "^1.3.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@playwright/test": { + "optional": true + }, + "babel-plugin-react-compiler": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/next/node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/node-releases": { + "version": "2.0.26", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.26.tgz", + "integrity": "sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", + "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.values": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", + "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/own-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", + "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.6", + "object-keys": "^1.1.1", + "safe-push-apply": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/possible-typed-array-names": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz", + "integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz", + "integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/reflect.getprototypeof": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", + "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.9", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.7", + "get-proto": "^1.0.1", + "which-builtin-type": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", + "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "set-function-name": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve": { + "version": "1.22.11", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", + "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", + "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "get-intrinsic": "^1.2.6", + "has-symbols": "^1.1.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-push-apply": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", + "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-proto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", + "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/sharp": { + "version": "0.34.4", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.4.tgz", + "integrity": "sha512-FUH39xp3SBPnxWvd5iib1X8XY7J0K0X7d93sie9CJg2PO8/7gmg89Nve6OjItK53/MlAushNNxteBYfM6DEuoA==", + "hasInstallScript": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "@img/colour": "^1.0.0", + "detect-libc": "^2.1.0", + "semver": "^7.7.2" + }, + "engines": { + "node": "^18.17.0 || ^20.3.0 || >=21.0.0" + }, + "funding": { + "url": "https://opencollective.com/libvips" + }, + "optionalDependencies": { + "@img/sharp-darwin-arm64": "0.34.4", + "@img/sharp-darwin-x64": "0.34.4", + "@img/sharp-libvips-darwin-arm64": "1.2.3", + "@img/sharp-libvips-darwin-x64": "1.2.3", + "@img/sharp-libvips-linux-arm": "1.2.3", + "@img/sharp-libvips-linux-arm64": "1.2.3", + "@img/sharp-libvips-linux-ppc64": "1.2.3", + "@img/sharp-libvips-linux-s390x": "1.2.3", + "@img/sharp-libvips-linux-x64": "1.2.3", + "@img/sharp-libvips-linuxmusl-arm64": "1.2.3", + "@img/sharp-libvips-linuxmusl-x64": "1.2.3", + "@img/sharp-linux-arm": "0.34.4", + "@img/sharp-linux-arm64": "0.34.4", + "@img/sharp-linux-ppc64": "0.34.4", + "@img/sharp-linux-s390x": "0.34.4", + "@img/sharp-linux-x64": "0.34.4", + "@img/sharp-linuxmusl-arm64": "0.34.4", + "@img/sharp-linuxmusl-x64": "0.34.4", + "@img/sharp-wasm32": "0.34.4", + "@img/sharp-win32-arm64": "0.34.4", + "@img/sharp-win32-ia32": "0.34.4", + "@img/sharp-win32-x64": "0.34.4" + } + }, + "node_modules/sharp/node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "license": "ISC", + "optional": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stable-hash": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", + "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", + "dev": true, + "license": "MIT" + }, + "node_modules/stop-iteration-iterator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz", + "integrity": "sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "internal-slot": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.includes": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", + "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", + "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.6", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.6", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "internal-slot": "^1.1.0", + "regexp.prototype.flags": "^1.5.3", + "set-function-name": "^2.0.2", + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.repeat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", + "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", + "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-data-property": "^1.1.4", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-object-atoms": "^1.0.0", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", + "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "call-bound": "^1.0.2", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.16.tgz", + "integrity": "sha512-pONL5awpaQX4LN5eiv7moSiSPd/DLDzKVRJz8Q9PgzmAdd1R4307GQS2ZpfiN7ZmekdQrfhZZiSE5jkLR4WNaA==", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", + "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", + "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", + "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "es-errors": "^1.3.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", + "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.14" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", + "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "for-each": "^0.3.3", + "gopd": "^1.2.0", + "has-proto": "^1.2.0", + "is-typed-array": "^1.1.15", + "reflect.getprototypeof": "^1.0.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "is-typed-array": "^1.1.13", + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.46.2", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.2.tgz", + "integrity": "sha512-vbw8bOmiuYNdzzV3lsiWv6sRwjyuKJMQqWulBOU7M0RrxedXledX8G8kBbQeiOYDnTfiXz0Y4081E1QMNB6iQg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.46.2", + "@typescript-eslint/parser": "8.46.2", + "@typescript-eslint/typescript-estree": "8.46.2", + "@typescript-eslint/utils": "8.46.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/unbox-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", + "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.3", + "has-bigints": "^1.0.2", + "has-symbols": "^1.1.0", + "which-boxed-primitive": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unrs-resolver": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", + "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "napi-postinstall": "^0.3.0" + }, + "funding": { + "url": "https://opencollective.com/unrs-resolver" + }, + "optionalDependencies": { + "@unrs/resolver-binding-android-arm-eabi": "1.11.1", + "@unrs/resolver-binding-android-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-arm64": "1.11.1", + "@unrs/resolver-binding-darwin-x64": "1.11.1", + "@unrs/resolver-binding-freebsd-x64": "1.11.1", + "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", + "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", + "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", + "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", + "@unrs/resolver-binding-linux-x64-musl": "1.11.1", + "@unrs/resolver-binding-wasm32-wasi": "1.11.1", + "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", + "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", + "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", + "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", + "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.1", + "is-number-object": "^1.1.1", + "is-string": "^1.1.1", + "is-symbol": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-builtin-type": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", + "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.1.0", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.2.1", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.1.0", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.16" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.19", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", + "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", + "dev": true, + "license": "MIT", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.4", + "for-each": "^0.3.5", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zod": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.1.12.tgz", + "integrity": "sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/zod-validation-error": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz", + "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + }, + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..378e321 --- /dev/null +++ b/package.json @@ -0,0 +1,26 @@ +{ + "name": "next-netflix-22nd", + "version": "0.1.0", + "private": true, + "scripts": { + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "eslint" + }, + "dependencies": { + "react": "19.2.0", + "react-dom": "19.2.0", + "next": "16.0.0" + }, + "devDependencies": { + "typescript": "^5", + "@types/node": "^20", + "@types/react": "^19", + "@types/react-dom": "^19", + "@tailwindcss/postcss": "^4", + "tailwindcss": "^4", + "eslint": "^9", + "eslint-config-next": "16.0.0" + } +} diff --git a/postcss.config.mjs b/postcss.config.mjs new file mode 100644 index 0000000..61e3684 --- /dev/null +++ b/postcss.config.mjs @@ -0,0 +1,7 @@ +const config = { + plugins: { + "@tailwindcss/postcss": {}, + }, +}; + +export default config; diff --git a/public/file.svg b/public/file.svg new file mode 100644 index 0000000..004145c --- /dev/null +++ b/public/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/globe.svg b/public/globe.svg new file mode 100644 index 0000000..567f17b --- /dev/null +++ b/public/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/next.svg b/public/next.svg new file mode 100644 index 0000000..5174b28 --- /dev/null +++ b/public/next.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/vercel.svg b/public/vercel.svg new file mode 100644 index 0000000..7705396 --- /dev/null +++ b/public/vercel.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/window.svg b/public/window.svg new file mode 100644 index 0000000..b2b2a44 --- /dev/null +++ b/public/window.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..af21167 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,44 @@ +{ + "compilerOptions": { + "target": "ES2017", + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": [ + "./*" + ] + } + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts", + "**/*.mts", + ".next\\dev/types/**/*.ts", + ".next\\dev/types/**/*.ts" + ], + "exclude": [ + "node_modules" + ] +} From 089b3eb8a1eb1c32783453276fe2b2ae977ae3e0 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Tue, 28 Oct 2025 21:29:35 +0900 Subject: [PATCH 02/82] =?UTF-8?q?vercel=20branch=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 378e321..2e20d5e 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "dev": "next dev", "build": "next build", "start": "next start", - "lint": "eslint" + "lint": "eslint", + "lint:fix": "eslint --fix" }, "dependencies": { "react": "19.2.0", From dee7a58013089742e128c42dbbc26cf0a84bafd2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=EC=84=B1=EC=95=84?= <170587664+sungahChooo@users.noreply.github.com> Date: Tue, 28 Oct 2025 22:54:39 +0900 Subject: [PATCH 03/82] Update issue templates MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 이슈 ν…œν”Œλ¦Ώ λ³€κ²½ --- ...0-\355\205\234\355\224\214\353\246\277.md" | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 ".github/ISSUE_TEMPLATE/\354\273\244\354\212\244\355\205\200-\354\235\264\354\212\210-\355\205\234\355\224\214\353\246\277.md" diff --git "a/.github/ISSUE_TEMPLATE/\354\273\244\354\212\244\355\205\200-\354\235\264\354\212\210-\355\205\234\355\224\214\353\246\277.md" "b/.github/ISSUE_TEMPLATE/\354\273\244\354\212\244\355\205\200-\354\235\264\354\212\210-\355\205\234\355\224\214\353\246\277.md" new file mode 100644 index 0000000..3afcadd --- /dev/null +++ "b/.github/ISSUE_TEMPLATE/\354\273\244\354\212\244\355\205\200-\354\235\264\354\212\210-\355\205\234\355\224\214\353\246\277.md" @@ -0,0 +1,22 @@ +--- +name: μ»€μŠ€ν…€ 이슈 ν…œν”Œλ¦Ώ +about: ν•΄λ‹Ή 이슈 생성 ν…œν”Œλ¦Ώμ„ μ‚¬μš©ν•˜μ—¬ 이슈λ₯Ό μƒμ„±ν•΄μ£Όμ„Έμš”. +title: "[♻️ refactor /✨ feat /\U0001F41B bug /\U0001F527 fix] 이슈 제λͺ©" +labels: '' +assignees: '' + +--- + +πŸ“Œ 이슈 λ‚΄μš© +------------ +이슈λ₯Ό μ„€λͺ…ν•΄μ£Όμ„Έμš”. + + +πŸ“ μž‘μ—… λ‚΄μš© +------------ +- [ ] μž‘μ—… 1 +- [ ] μž‘μ—… 2 + + +✨ μ°Έκ³  사항 +------------ From 0bfd4b7d521daa2e0f9e99cc4ecaefd1f8a098c2 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Tue, 28 Oct 2025 23:07:16 +0900 Subject: [PATCH 04/82] =?UTF-8?q?styled-components=20=EC=84=A4=EC=B9=98=20?= =?UTF-8?q?babel=20=ED=8C=8C=EC=9D=BC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .babelrc | 4 + package-lock.json | 272 +++++++++++++++++++++++++++++++++++++++------- package.json | 13 ++- 3 files changed, 242 insertions(+), 47 deletions(-) create mode 100644 .babelrc diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..34abf3f --- /dev/null +++ b/.babelrc @@ -0,0 +1,4 @@ +{ + "presets": ["next/babel"], + "plugins": ["styled-components"] +} diff --git a/package-lock.json b/package-lock.json index e901ba3..011bf56 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,9 +8,12 @@ "name": "next-netflix-22nd", "version": "0.1.0", "dependencies": { + "@types/styled-components": "^5.1.35", + "babel-plugin-styled-components": "^2.1.4", "next": "16.0.0", "react": "19.2.0", - "react-dom": "19.2.0" + "react-dom": "19.2.0", + "styled-components": "^6.1.19" }, "devDependencies": { "@tailwindcss/postcss": "^4", @@ -40,7 +43,6 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.27.1", @@ -55,7 +57,6 @@ "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.5.tgz", "integrity": "sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -65,7 +66,6 @@ "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.5.tgz", "integrity": "sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", @@ -96,7 +96,6 @@ "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.5.tgz", "integrity": "sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.28.5", @@ -109,11 +108,22 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.27.3", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.27.3.tgz", + "integrity": "sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.3" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-compilation-targets": { "version": "7.27.2", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/compat-data": "^7.27.2", @@ -130,7 +140,6 @@ "version": "7.28.0", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -140,7 +149,6 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "dev": true, "license": "MIT", "dependencies": { "@babel/traverse": "^7.27.1", @@ -154,7 +162,6 @@ "version": "7.28.3", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.27.1", @@ -168,11 +175,19 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -182,7 +197,6 @@ "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -192,7 +206,6 @@ "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -202,7 +215,6 @@ "version": "7.28.4", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", - "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.27.2", @@ -216,7 +228,6 @@ "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.5.tgz", "integrity": "sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.28.5" @@ -228,11 +239,25 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", + "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/template": { "version": "7.27.2", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", @@ -247,7 +272,6 @@ "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.5.tgz", "integrity": "sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.27.1", @@ -266,7 +290,6 @@ "version": "7.28.5", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.5.tgz", "integrity": "sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -309,6 +332,27 @@ "tslib": "^2.4.0" } }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", + "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==", + "license": "MIT" + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", @@ -937,7 +981,6 @@ "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", @@ -948,7 +991,6 @@ "version": "2.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", @@ -959,7 +1001,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -969,14 +1010,12 @@ "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", @@ -1493,6 +1532,18 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.7.tgz", + "integrity": "sha512-PQTyIulDkIDro8P+IHbKCsw7U2xxBYflVzW/FgWdCAePD9xGSidgA76/GeJ6lBKoblyhf9pBY763gbrN+1dI8g==", + "license": "MIT", + "dependencies": { + "hoist-non-react-statics": "^3.3.0" + }, + "peerDependencies": { + "@types/react": "*" + } + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -1521,7 +1572,6 @@ "version": "19.2.2", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz", "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==", - "dev": true, "license": "MIT", "dependencies": { "csstype": "^3.0.2" @@ -1537,6 +1587,23 @@ "@types/react": "^19.2.0" } }, + "node_modules/@types/styled-components": { + "version": "5.1.35", + "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.35.tgz", + "integrity": "sha512-JeYII52nSFGXGaw/5Odf0TBUhT3024HduBewrZCQBoUFKBw8V6x1dbnZCpgJuzmiokWAlVo3kkS3k3jrEK1NyA==", + "license": "MIT", + "dependencies": { + "@types/hoist-non-react-statics": "*", + "@types/react": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/stylis": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz", + "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==", + "license": "MIT" + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.46.2", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.2.tgz", @@ -2393,6 +2460,22 @@ "node": ">= 0.4" } }, + "node_modules/babel-plugin-styled-components": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.4.tgz", + "integrity": "sha512-Xgp9g+A/cG47sUyRwwYxGM4bR/jDRg5N6it/8+HxCnbT5XNKSKDT9xm4oag/osgqjC2It/vH0yXsomOG6k558g==", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "lodash": "^4.17.21", + "picomatch": "^2.3.1" + }, + "peerDependencies": { + "styled-components": ">= 2" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2404,7 +2487,6 @@ "version": "2.8.20", "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.20.tgz", "integrity": "sha512-JMWsdF+O8Orq3EMukbUN1QfbLK9mX2CkUmQBcW2T0s8OmdAUL5LLM/6wFwSrqXzlXB13yhyK9gTKS1rIizOduQ==", - "dev": true, "license": "Apache-2.0", "bin": { "baseline-browser-mapping": "dist/cli.js" @@ -2438,7 +2520,6 @@ "version": "4.27.0", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.27.0.tgz", "integrity": "sha512-AXVQwdhot1eqLihwasPElhX2tAZiBjWdJ9i/Zcj2S6QYIjkx62OKSfnobkriB81C3l4w0rVy3Nt4jaTBltYEpw==", - "dev": true, "funding": [ { "type": "opencollective", @@ -2528,6 +2609,15 @@ "node": ">=6" } }, + "node_modules/camelize": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", + "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001751", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001751.tgz", @@ -2602,7 +2692,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, "license": "MIT" }, "node_modules/cross-spawn": { @@ -2620,11 +2709,30 @@ "node": ">= 8" } }, + "node_modules/css-color-keywords": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", + "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", + "license": "ISC", + "engines": { + "node": ">=4" + } + }, + "node_modules/css-to-react-native": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", + "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", + "license": "MIT", + "dependencies": { + "camelize": "^1.0.0", + "css-color-keywords": "^1.0.0", + "postcss-value-parser": "^4.0.2" + } + }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true, "license": "MIT" }, "node_modules/damerau-levenshtein": { @@ -2692,7 +2800,6 @@ "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -2791,7 +2898,6 @@ "version": "1.5.241", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.241.tgz", "integrity": "sha512-ILMvKX/ZV5WIJzzdtuHg8xquk2y0BOGlFOxBVwTpbiXqWIH0hamG45ddU4R3PQ0gYu+xgo0vdHXHli9sHIGb4w==", - "dev": true, "license": "ISC" }, "node_modules/emoji-regex": { @@ -2996,7 +3102,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -3635,7 +3740,6 @@ "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -3892,6 +3996,15 @@ "hermes-estree": "0.25.1" } }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -4405,7 +4518,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, "license": "MIT" }, "node_modules/js-yaml": { @@ -4425,7 +4537,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -4459,7 +4570,6 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, "license": "MIT", "bin": { "json5": "lib/cli.js" @@ -4805,6 +4915,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -4829,7 +4945,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, "license": "ISC", "dependencies": { "yallist": "^3.0.2" @@ -4906,7 +5021,6 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, "license": "MIT" }, "node_modules/nanoid": { @@ -5034,7 +5148,6 @@ "version": "2.0.26", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.26.tgz", "integrity": "sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA==", - "dev": true, "license": "MIT" }, "node_modules/object-assign": { @@ -5278,7 +5391,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "license": "MIT", "engines": { "node": ">=8.6" @@ -5326,6 +5438,12 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "license": "MIT" + }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -5404,7 +5522,6 @@ "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true, "license": "MIT" }, "node_modules/reflect.getprototypeof": { @@ -5592,7 +5709,6 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" @@ -5647,6 +5763,12 @@ "node": ">= 0.4" } }, + "node_modules/shallowequal": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", + "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", + "license": "MIT" + }, "node_modules/sharp": { "version": "0.34.4", "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.4.tgz", @@ -5968,6 +6090,68 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/styled-components": { + "version": "6.1.19", + "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.19.tgz", + "integrity": "sha512-1v/e3Dl1BknC37cXMhwGomhO8AkYmN41CqyX9xhUDxry1ns3BFQy2lLDRQXJRdVVWB9OHemv/53xaStimvWyuA==", + "license": "MIT", + "dependencies": { + "@emotion/is-prop-valid": "1.2.2", + "@emotion/unitless": "0.8.1", + "@types/stylis": "4.2.5", + "css-to-react-native": "3.2.0", + "csstype": "3.1.3", + "postcss": "8.4.49", + "shallowequal": "1.1.0", + "stylis": "4.3.2", + "tslib": "2.6.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/styled-components" + }, + "peerDependencies": { + "react": ">= 16.8.0", + "react-dom": ">= 16.8.0" + } + }, + "node_modules/styled-components/node_modules/postcss": { + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/styled-components/node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "license": "0BSD" + }, "node_modules/styled-jsx": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", @@ -5991,6 +6175,12 @@ } } }, + "node_modules/stylis": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", + "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==", + "license": "MIT" + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -6338,7 +6528,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.4.tgz", "integrity": "sha512-q0SPT4xyU84saUX+tomz1WLkxUbuaJnR1xWt17M7fJtEJigJeWUNGUqrauFXsHnqev9y9JTRGwk13tFBuKby4A==", - "dev": true, "funding": [ { "type": "opencollective", @@ -6494,7 +6683,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, "license": "ISC" }, "node_modules/yocto-queue": { diff --git a/package.json b/package.json index 2e20d5e..39fb90f 100644 --- a/package.json +++ b/package.json @@ -10,18 +10,21 @@ "lint:fix": "eslint --fix" }, "dependencies": { + "@types/styled-components": "^5.1.35", + "babel-plugin-styled-components": "^2.1.4", + "next": "16.0.0", "react": "19.2.0", "react-dom": "19.2.0", - "next": "16.0.0" + "styled-components": "^6.1.19" }, "devDependencies": { - "typescript": "^5", + "@tailwindcss/postcss": "^4", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", - "@tailwindcss/postcss": "^4", - "tailwindcss": "^4", "eslint": "^9", - "eslint-config-next": "16.0.0" + "eslint-config-next": "16.0.0", + "tailwindcss": "^4", + "typescript": "^5" } } From e629e8b6dd5b574e3b13ea2c8842301a65187488 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Tue, 28 Oct 2025 23:27:50 +0900 Subject: [PATCH 05/82] =?UTF-8?q?favicon=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/favicon.ico | Bin 25931 -> 0 bytes app/layout.tsx | 5 +++- app/page.tsx | 66 ++++----------------------------------------- public/favicon.png | Bin 0 -> 615 bytes public/globe.svg | 1 - public/next.svg | 1 - public/vercel.svg | 1 - public/window.svg | 1 - 8 files changed, 9 insertions(+), 66 deletions(-) delete mode 100644 app/favicon.ico create mode 100644 public/favicon.png delete mode 100644 public/globe.svg delete mode 100644 public/next.svg delete mode 100644 public/vercel.svg delete mode 100644 public/window.svg diff --git a/app/favicon.ico b/app/favicon.ico deleted file mode 100644 index 718d6fea4835ec2d246af9800eddb7ffb276240c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25931 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 LrJugUA?W`A8`#=m diff --git a/app/layout.tsx b/app/layout.tsx index f7fa87e..21b5b41 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -13,8 +13,11 @@ const geistMono = Geist_Mono({ }); export const metadata: Metadata = { - title: "Create Next App", + title: "netflix-clone", description: "Generated by create next app", + icons: { + icon: "/favicon.png", + }, }; export default function RootLayout({ diff --git a/app/page.tsx b/app/page.tsx index 295f8fd..b22bc1d 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,65 +1,9 @@ -import Image from "next/image"; - +// src/app/page.tsx export default function Home() { return ( -
-
- Next.js logo -
-

- To get started, edit the page.tsx file. -

-

- Looking for a starting point or more instructions? Head over to{" "} - - Templates - {" "} - or the{" "} - - Learning - {" "} - center. -

-
- -
-
+
+

Hello Next.js πŸ‘‹

+

λ„·ν”Œλ¦­μŠ€ 클둠 μ½”λ”© μ‹œμž‘

+
); } diff --git a/public/favicon.png b/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..b9a282151469ac9845f345cf04e1ecc773327586 GIT binary patch literal 615 zcmV-t0+{`YP)q*s#0=B$!kLTIB!NAJJrw+S z0Dru#L{Ad1pp%hnxC$c^Fl6gB=;Ul(B)kSBBk(~})yN`X88#xPa1%b-S`D%Zj1iuK zHV@6feJVsT@^WvcKBn?Ja}*P> zhj=HIm5xTXeV#kk;|^m)|bcxzm*B48oKASgzC zKZ~2Krcq5m4M-0r#G^mi!^~o=CeTg$wLAAFwdSl-7zhD%z%RYb-9PkB$a=93gn<6l zLsi{!H+OG(o^cHWAz&F5C@99qq \ No newline at end of file diff --git a/public/next.svg b/public/next.svg deleted file mode 100644 index 5174b28..0000000 --- a/public/next.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/vercel.svg b/public/vercel.svg deleted file mode 100644 index 7705396..0000000 --- a/public/vercel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/window.svg b/public/window.svg deleted file mode 100644 index b2b2a44..0000000 --- a/public/window.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file From 165f4361adf3d5613b70ad9a9876273e7ed73977 Mon Sep 17 00:00:00 2001 From: baekseungsun Date: Wed, 29 Oct 2025 15:04:31 +0900 Subject: [PATCH 06/82] =?UTF-8?q?Styled-components=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/page.tsx | 2 + package-lock.json | 138 ++++++++++++++++++++++++++++-------------- package.json | 8 +-- public/icons/logo.svg | 20 ++++++ 4 files changed, 117 insertions(+), 51 deletions(-) create mode 100644 public/icons/logo.svg diff --git a/app/page.tsx b/app/page.tsx index b22bc1d..fc2bc6d 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,4 +1,6 @@ // src/app/page.tsx +'use client'; + export default function Home() { return (
diff --git a/package-lock.json b/package-lock.json index 011bf56..9d4d904 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,21 +8,21 @@ "name": "next-netflix-22nd", "version": "0.1.0", "dependencies": { - "@types/styled-components": "^5.1.35", "babel-plugin-styled-components": "^2.1.4", "next": "16.0.0", "react": "19.2.0", - "react-dom": "19.2.0", - "styled-components": "^6.1.19" + "react-dom": "19.2.0" }, "devDependencies": { "@tailwindcss/postcss": "^4", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", + "autoprefixer": "^10.4.21", "eslint": "^9", "eslint-config-next": "16.0.0", - "tailwindcss": "^4", + "postcss": "^8.5.6", + "tailwindcss": "^4.1.16", "typescript": "^5" } }, @@ -337,6 +337,7 @@ "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", "license": "MIT", + "peer": true, "dependencies": { "@emotion/memoize": "^0.8.1" } @@ -345,13 +346,15 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@emotion/unitless": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.0", @@ -1532,18 +1535,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/hoist-non-react-statics": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.7.tgz", - "integrity": "sha512-PQTyIulDkIDro8P+IHbKCsw7U2xxBYflVzW/FgWdCAePD9xGSidgA76/GeJ6lBKoblyhf9pBY763gbrN+1dI8g==", - "license": "MIT", - "dependencies": { - "hoist-non-react-statics": "^3.3.0" - }, - "peerDependencies": { - "@types/react": "*" - } - }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -1559,9 +1550,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "20.19.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.23.tgz", - "integrity": "sha512-yIdlVVVHXpmqRhtyovZAcSy0MiPcYWGkoO4CGe/+jpP0hmNuihm4XhHbADpK++MsiLHP5MVlv+bcgdF99kSiFQ==", + "version": "20.19.24", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.24.tgz", + "integrity": "sha512-FE5u0ezmi6y9OZEzlJfg37mqqf6ZDSF2V/NLjUyGrR9uTZ7Sb9F7bLNZ03S4XVUNRWGA7Ck4c1kK+YnuWjl+DA==", "dev": true, "license": "MIT", "dependencies": { @@ -1572,6 +1563,7 @@ "version": "19.2.2", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz", "integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==", + "dev": true, "license": "MIT", "dependencies": { "csstype": "^3.0.2" @@ -1587,22 +1579,12 @@ "@types/react": "^19.2.0" } }, - "node_modules/@types/styled-components": { - "version": "5.1.35", - "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.35.tgz", - "integrity": "sha512-JeYII52nSFGXGaw/5Odf0TBUhT3024HduBewrZCQBoUFKBw8V6x1dbnZCpgJuzmiokWAlVo3kkS3k3jrEK1NyA==", - "license": "MIT", - "dependencies": { - "@types/hoist-non-react-statics": "*", - "@types/react": "*", - "csstype": "^3.0.2" - } - }, "node_modules/@types/stylis": { "version": "4.2.5", "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz", "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.46.2", @@ -2424,6 +2406,44 @@ "node": ">= 0.4" } }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -2614,6 +2634,7 @@ "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", "integrity": "sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==", "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -2714,6 +2735,7 @@ "resolved": "https://registry.npmjs.org/css-color-keywords/-/css-color-keywords-1.0.0.tgz", "integrity": "sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==", "license": "ISC", + "peer": true, "engines": { "node": ">=4" } @@ -2723,6 +2745,7 @@ "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", "integrity": "sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==", "license": "MIT", + "peer": true, "dependencies": { "camelize": "^1.0.0", "css-color-keywords": "^1.0.0", @@ -3685,6 +3708,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -3996,15 +4033,6 @@ "hermes-estree": "0.25.1" } }, - "node_modules/hoist-non-react-statics": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", - "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", - "license": "BSD-3-Clause", - "dependencies": { - "react-is": "^16.7.0" - } - }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -5150,6 +5178,16 @@ "integrity": "sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA==", "license": "MIT" }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -5411,7 +5449,7 @@ }, "node_modules/postcss": { "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz", "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "dev": true, "funding": [ @@ -5522,6 +5560,7 @@ "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true, "license": "MIT" }, "node_modules/reflect.getprototypeof": { @@ -5767,7 +5806,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/shallowequal/-/shallowequal-1.1.0.tgz", "integrity": "sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/sharp": { "version": "0.34.4", @@ -6095,6 +6135,7 @@ "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.19.tgz", "integrity": "sha512-1v/e3Dl1BknC37cXMhwGomhO8AkYmN41CqyX9xhUDxry1ns3BFQy2lLDRQXJRdVVWB9OHemv/53xaStimvWyuA==", "license": "MIT", + "peer": true, "dependencies": { "@emotion/is-prop-valid": "1.2.2", "@emotion/unitless": "0.8.1", @@ -6137,6 +6178,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.1.1", @@ -6150,7 +6192,8 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/styled-jsx": { "version": "5.1.6", @@ -6179,7 +6222,8 @@ "version": "4.3.2", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/supports-color": { "version": "7.2.0", @@ -6209,7 +6253,7 @@ }, "node_modules/tailwindcss": { "version": "4.1.16", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.16.tgz", + "resolved": "https://registry.npmmirror.com/tailwindcss/-/tailwindcss-4.1.16.tgz", "integrity": "sha512-pONL5awpaQX4LN5eiv7moSiSPd/DLDzKVRJz8Q9PgzmAdd1R4307GQS2ZpfiN7ZmekdQrfhZZiSE5jkLR4WNaA==", "dev": true, "license": "MIT" diff --git a/package.json b/package.json index 39fb90f..3638473 100644 --- a/package.json +++ b/package.json @@ -10,21 +10,21 @@ "lint:fix": "eslint --fix" }, "dependencies": { - "@types/styled-components": "^5.1.35", "babel-plugin-styled-components": "^2.1.4", "next": "16.0.0", "react": "19.2.0", - "react-dom": "19.2.0", - "styled-components": "^6.1.19" + "react-dom": "19.2.0" }, "devDependencies": { "@tailwindcss/postcss": "^4", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", + "autoprefixer": "^10.4.21", "eslint": "^9", "eslint-config-next": "16.0.0", - "tailwindcss": "^4", + "postcss": "^8.5.6", + "tailwindcss": "^4.1.16", "typescript": "^5" } } diff --git a/public/icons/logo.svg b/public/icons/logo.svg new file mode 100644 index 0000000..947e74b --- /dev/null +++ b/public/icons/logo.svg @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + From f2faef864d6b060e58d31cb8e3ac779824080e10 Mon Sep 17 00:00:00 2001 From: baekseungsun Date: Wed, 29 Oct 2025 15:05:24 +0900 Subject: [PATCH 07/82] =?UTF-8?q?Styled-components=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .babelrc | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 .babelrc diff --git a/.babelrc b/.babelrc deleted file mode 100644 index 34abf3f..0000000 --- a/.babelrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "presets": ["next/babel"], - "plugins": ["styled-components"] -} From 2c99859636bc0bdd9de49add7e7e3400e7a8d32b Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Thu, 30 Oct 2025 03:10:36 +0900 Subject: [PATCH 08/82] =?UTF-8?q?feat:=20landing=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EA=B0=9C=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/animations/logo.json | 2222 +++++++++++++++++++++++++++++++++++ app/home/page.tsx | 16 + app/layout.tsx | 4 +- app/lottieLogo.tsx | 25 + app/page.tsx | 12 +- components/IndicatorBar.tsx | 7 + package-lock.json | 20 + package.json | 1 + 8 files changed, 2300 insertions(+), 7 deletions(-) create mode 100644 app/animations/logo.json create mode 100644 app/home/page.tsx create mode 100644 app/lottieLogo.tsx create mode 100644 components/IndicatorBar.tsx diff --git a/app/animations/logo.json b/app/animations/logo.json new file mode 100644 index 0000000..b23b10e --- /dev/null +++ b/app/animations/logo.json @@ -0,0 +1,2222 @@ +{ + "v": "5.5.7", + "meta": { + "g": "LottieFiles AE 0.1.20", + "a": "", + "k": "", + "d": "", + "tc": "#FFFFFF" + }, + "fr": 30, + "ip": 0, + "op": 138, + "w": 512, + "h": 512, + "nm": "Nettflix", + "ddd": 0, + "assets": [], + "layers": [ + { + "ddd": 0, + "ind": 1, + "ty": 4, + "nm": "Big N 1", + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.333], "y": [0] }, + "t": 9, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 14.333, + "s": [100] + }, + { + "i": { "x": [1], "y": [1] }, + "o": { "x": [0.612], "y": [0] }, + "t": 57, + "s": [100] + }, + { "t": 83, "s": [0] } + ], + "ix": 11 + }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { + "a": 1, + "k": [ + { + "i": { "x": 0.455, "y": 1 }, + "o": { "x": 0.684, "y": 0 }, + "t": 52, + "s": [256, 256, 0], + "to": [-24.667, 0, 0], + "ti": [24.667, 0, 0] + }, + { "t": 77.373046875, "s": [108, 256, 0] } + ], + "ix": 2 + }, + "a": { "a": 0, "k": [0.209, 0.143, 0], "ix": 1 }, + "s": { + "a": 1, + "k": [ + { + "i": { "x": [0.461, 0.461, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.655, 0.655, 0.333], "y": [0, 0, 0] }, + "t": 23, + "s": [66, 66, 100] + }, + { "t": 52, "s": [21, 21, 100] } + ], + "ix": 6 + } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 1, + "k": [ + { + "i": { "x": 0.252, "y": 1 }, + "o": { "x": 0.434, "y": 0 }, + "t": 9, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [42.684, 1.078], + [0, 0] + ], + "v": [ + [120.607, 218.722], + [31.805, 211.525], + [31.977, 211.212], + [120.318, 218.496] + ], + "c": true + } + ] + }, + { + "i": { "x": 0.833, "y": 1 }, + "o": { "x": 0.167, "y": 0 }, + "t": 23, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [42.684, 1.078], + [0, 0] + ], + "v": [ + [-34.128, -218.21], + [-119.9, -218.21], + [31.977, 211.212], + [120.318, 218.496] + ], + "c": true + } + ] + }, + { + "i": { "x": 0.833, "y": 1 }, + "o": { "x": 0.167, "y": 0 }, + "t": 62, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [42.684, 1.078], + [0, 0] + ], + "v": [ + [-34.128, -218.21], + [-119.9, -218.21], + [31.977, 211.212], + [120.318, 218.496] + ], + "c": true + } + ] + }, + { + "t": 78, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [44.422, -6.307], + [0, 0] + ], + "v": [ + [-47.223, -218.706], + [-102.043, -218.706], + [41.501, 198.117], + [102.46, 192.802] + ], + "c": true + } + ] + } + ], + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.898039215686, 0.035294117647, 0.078431372549, 1], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Big N 1", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 1948, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 2, + "ty": 4, + "nm": "Big N 2 matte", + "parent": 1, + "td": 1, + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.333], "y": [0] }, + "t": 0, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.333], "y": [0] }, + "t": 5.333, + "s": [100] + }, + { + "i": { "x": [1], "y": [1] }, + "o": { "x": [0.612], "y": [0] }, + "t": 57, + "s": [100] + }, + { "t": 83, "s": [0] } + ], + "ix": 11 + }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [77.223, 0, 0], "ix": 2 }, + "a": { "a": 0, "k": [77.223, 0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 1, + "k": [ + { + "i": { "x": 0.252, "y": 1 }, + "o": { "x": 0.434, "y": 0 }, + "t": 0, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [1.198, 0] + ], + "o": [ + [0, 0], + [0, 0], + [-0.901, 0], + [0, 0] + ], + "v": [ + [34.099, -359.119], + [120.288, -359.43], + [120.49, -359.888], + [33.164, -359.117] + ], + "c": true + } + ] + }, + { + "i": { "x": 0.833, "y": 1 }, + "o": { "x": 0.167, "y": 0 }, + "t": 12, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [28.673, 0.875] + ], + "o": [ + [0, 0], + [0, 0], + [-28.673, -3.601], + [0, 0] + ], + "v": [ + [34.128, -218.21], + [120.318, -218.521], + [120.318, 218.521], + [34.128, 211.337] + ], + "c": true + } + ] + }, + { + "i": { "x": 0.833, "y": 1 }, + "o": { "x": 0.167, "y": 0 }, + "t": 62, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [28.673, 0.875] + ], + "o": [ + [0, 0], + [0, 0], + [-28.673, -3.601], + [0, 0] + ], + "v": [ + [34.128, -218.21], + [120.318, -218.521], + [120.318, 218.521], + [34.128, 211.337] + ], + "c": true + } + ] + }, + { + "t": 78, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [28.249, -4.53] + ], + "o": [ + [0, 0], + [0, 0], + [-27.545, 1.34], + [0, 0] + ], + "v": [ + [48.414, -218.706], + [114.365, -217.965], + [116.869, 194.041], + [44.408, 201.102] + ], + "c": true + } + ] + } + ], + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.694117647059, 0.023529411765, 0.058823529412, 1], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Big N 2", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 1948, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 3, + "ty": 4, + "nm": "Big N 1 shadow 2", + "tt": 1, + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.333], "y": [0] }, + "t": 9, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 14.333, + "s": [100] + }, + { + "i": { "x": [1], "y": [1] }, + "o": { "x": [0.612], "y": [0] }, + "t": 57, + "s": [100] + }, + { "t": 83, "s": [0] } + ], + "ix": 11 + }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { + "a": 1, + "k": [ + { + "i": { "x": 0.455, "y": 1 }, + "o": { "x": 0.684, "y": 0 }, + "t": 52, + "s": [256, 256, 0], + "to": [-24.667, 0, 0], + "ti": [24.667, 0, 0] + }, + { "t": 77.373046875, "s": [108, 256, 0] } + ], + "ix": 2 + }, + "a": { "a": 0, "k": [0.209, 0.143, 0], "ix": 1 }, + "s": { + "a": 1, + "k": [ + { + "i": { "x": [0.461, 0.461, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.655, 0.655, 0.333], "y": [0, 0, 0] }, + "t": 23, + "s": [66, 66, 100] + }, + { "t": 52, "s": [21, 21, 100] } + ], + "ix": 6 + } + }, + "ao": 0, + "ef": [ + { + "ty": 25, + "nm": "Drop Shadow", + "np": 8, + "mn": "ADBE Drop Shadow", + "ix": 1, + "en": 1, + "ef": [ + { + "ty": 2, + "nm": "Shadow Color", + "mn": "ADBE Drop Shadow-0001", + "ix": 1, + "v": { + "a": 0, + "k": [0.086274512112, 0, 0.0074725952, 1], + "ix": 1 + } + }, + { + "ty": 0, + "nm": "Opacity", + "mn": "ADBE Drop Shadow-0002", + "ix": 2, + "v": { "a": 0, "k": 178.5, "ix": 2 } + }, + { + "ty": 0, + "nm": "Direction", + "mn": "ADBE Drop Shadow-0003", + "ix": 3, + "v": { "a": 0, "k": 0, "ix": 3 } + }, + { + "ty": 0, + "nm": "Distance", + "mn": "ADBE Drop Shadow-0004", + "ix": 4, + "v": { "a": 0, "k": 0, "ix": 4 } + }, + { + "ty": 0, + "nm": "Softness", + "mn": "ADBE Drop Shadow-0005", + "ix": 5, + "v": { "a": 0, "k": 100, "ix": 5 } + }, + { + "ty": 7, + "nm": "Shadow Only", + "mn": "ADBE Drop Shadow-0006", + "ix": 6, + "v": { "a": 0, "k": 0, "ix": 6 } + } + ] + } + ], + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 1, + "k": [ + { + "i": { "x": 0.252, "y": 1 }, + "o": { "x": 0.434, "y": 0 }, + "t": 9, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [42.684, 1.078], + [0, 0] + ], + "v": [ + [120.607, 218.722], + [31.805, 211.525], + [31.977, 211.212], + [120.318, 218.496] + ], + "c": true + } + ] + }, + { + "i": { "x": 0.833, "y": 1 }, + "o": { "x": 0.167, "y": 0 }, + "t": 23, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [42.684, 1.078], + [0, 0] + ], + "v": [ + [-34.128, -218.21], + [-119.9, -218.21], + [31.977, 211.212], + [120.318, 218.496] + ], + "c": true + } + ] + }, + { + "i": { "x": 0.833, "y": 1 }, + "o": { "x": 0.167, "y": 0 }, + "t": 62, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [42.684, 1.078], + [0, 0] + ], + "v": [ + [-34.128, -218.21], + [-119.9, -218.21], + [31.977, 211.212], + [120.318, 218.496] + ], + "c": true + } + ] + }, + { + "t": 78, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [44.422, -6.307], + [0, 0] + ], + "v": [ + [-47.223, -218.706], + [-102.043, -218.706], + [41.501, 198.117], + [102.46, 192.802] + ], + "c": true + } + ] + } + ], + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.898039215686, 0.035294117647, 0.078431372549, 1], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Big N 1", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + }, + { + "ty": "gr", + "it": [ + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Group 1", + "np": 0, + "cix": 2, + "bm": 0, + "ix": 2, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 1948, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 4, + "ty": 4, + "nm": "Big N 2", + "parent": 1, + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.333], "y": [0] }, + "t": 0, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.333], "y": [0] }, + "t": 5.333, + "s": [100] + }, + { + "i": { "x": [1], "y": [1] }, + "o": { "x": [0.612], "y": [0] }, + "t": 57, + "s": [100] + }, + { "t": 83, "s": [0] } + ], + "ix": 11 + }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [77.223, 0, 0], "ix": 2 }, + "a": { "a": 0, "k": [77.223, 0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 1, + "k": [ + { + "i": { "x": 0.252, "y": 1 }, + "o": { "x": 0.434, "y": 0 }, + "t": 0, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [1.198, 0] + ], + "o": [ + [0, 0], + [0, 0], + [-0.901, 0], + [0, 0] + ], + "v": [ + [34.099, -359.119], + [120.288, -359.43], + [120.49, -359.888], + [33.164, -359.117] + ], + "c": true + } + ] + }, + { + "i": { "x": 0.833, "y": 1 }, + "o": { "x": 0.167, "y": 0 }, + "t": 12, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [28.673, 0.875] + ], + "o": [ + [0, 0], + [0, 0], + [-28.673, -3.601], + [0, 0] + ], + "v": [ + [34.128, -218.21], + [120.318, -218.521], + [120.318, 218.521], + [34.128, 211.337] + ], + "c": true + } + ] + }, + { + "i": { "x": 0.833, "y": 1 }, + "o": { "x": 0.167, "y": 0 }, + "t": 62, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [28.673, 0.875] + ], + "o": [ + [0, 0], + [0, 0], + [-28.673, -3.601], + [0, 0] + ], + "v": [ + [34.128, -218.21], + [120.318, -218.521], + [120.318, 218.521], + [34.128, 211.337] + ], + "c": true + } + ] + }, + { + "t": 78, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [28.249, -4.53] + ], + "o": [ + [0, 0], + [0, 0], + [-27.545, 1.34], + [0, 0] + ], + "v": [ + [48.414, -218.706], + [114.365, -217.965], + [116.869, 194.041], + [44.408, 201.102] + ], + "c": true + } + ] + } + ], + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.694117647059, 0.023529411765, 0.058823529412, 1], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Big N 2", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 1948, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 5, + "ty": 4, + "nm": "Big N 3 matte", + "parent": 1, + "td": 1, + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.333], "y": [0] }, + "t": 19, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 24.333, + "s": [100] + }, + { + "i": { "x": [1], "y": [1] }, + "o": { "x": [0.612], "y": [0] }, + "t": 57, + "s": [100] + }, + { "t": 83, "s": [0] } + ], + "ix": 11 + }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [-77.223, 0, 0], "ix": 2 }, + "a": { "a": 0, "k": [-77.223, 0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 1, + "k": [ + { + "i": { "x": 0.252, "y": 1 }, + "o": { "x": 0.434, "y": 0 }, + "t": 19, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 1.089] + ], + "o": [ + [0, 0], + [0, 0], + [26.294, 0.724], + [0, 0] + ], + "v": [ + [-34.128, -218.21], + [-120.318, -218.521], + [-120.72, -218.979], + [-34.705, -218.587] + ], + "c": true + } + ] + }, + { + "i": { "x": 0.833, "y": 1 }, + "o": { "x": 0.167, "y": 0 }, + "t": 30, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [-28.673, 0.875] + ], + "o": [ + [0, 0], + [0, 0], + [28.673, -3.601], + [0, 0] + ], + "v": [ + [-34.128, -218.21], + [-120.318, -218.521], + [-120.318, 218.521], + [-34.128, 211.337] + ], + "c": true + } + ] + }, + { + "i": { "x": 0.833, "y": 1 }, + "o": { "x": 0.167, "y": 0 }, + "t": 62, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [-28.673, 0.875] + ], + "o": [ + [0, 0], + [0, 0], + [28.673, -3.601], + [0, 0] + ], + "v": [ + [-34.128, -218.21], + [-120.318, -218.521], + [-120.318, 218.521], + [-34.128, 211.337] + ], + "c": true + } + ] + }, + { + "t": 78, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [-28.758, -0.959] + ], + "o": [ + [0, 0], + [0, 0], + [28.673, -3.601], + [0, 0] + ], + "v": [ + [-43.652, -218.74], + [-106.032, -218.137], + [-106.032, 217.33], + [-37.7, 211.816] + ], + "c": true + } + ] + } + ], + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.694117647059, 0.023529411765, 0.058823529412, 1], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Big N 3", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 1948, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 6, + "ty": 4, + "nm": "Big N 1 shadow", + "tt": 1, + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.333], "y": [0] }, + "t": 9, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 14.333, + "s": [100] + }, + { + "i": { "x": [1], "y": [1] }, + "o": { "x": [0.612], "y": [0] }, + "t": 57, + "s": [100] + }, + { "t": 83, "s": [0] } + ], + "ix": 11 + }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { + "a": 1, + "k": [ + { + "i": { "x": 0.455, "y": 1 }, + "o": { "x": 0.684, "y": 0 }, + "t": 52, + "s": [256, 256, 0], + "to": [-24.667, 0, 0], + "ti": [24.667, 0, 0] + }, + { "t": 77.373046875, "s": [108, 256, 0] } + ], + "ix": 2 + }, + "a": { "a": 0, "k": [0.209, 0.143, 0], "ix": 1 }, + "s": { + "a": 1, + "k": [ + { + "i": { "x": [0.461, 0.461, 0.667], "y": [1, 1, 1] }, + "o": { "x": [0.655, 0.655, 0.333], "y": [0, 0, 0] }, + "t": 23, + "s": [66, 66, 100] + }, + { "t": 52, "s": [21, 21, 100] } + ], + "ix": 6 + } + }, + "ao": 0, + "ef": [ + { + "ty": 25, + "nm": "Drop Shadow", + "np": 8, + "mn": "ADBE Drop Shadow", + "ix": 1, + "en": 1, + "ef": [ + { + "ty": 2, + "nm": "Shadow Color", + "mn": "ADBE Drop Shadow-0001", + "ix": 1, + "v": { + "a": 0, + "k": [0.086274512112, 0, 0.0074725952, 1], + "ix": 1 + } + }, + { + "ty": 0, + "nm": "Opacity", + "mn": "ADBE Drop Shadow-0002", + "ix": 2, + "v": { "a": 0, "k": 178.5, "ix": 2 } + }, + { + "ty": 0, + "nm": "Direction", + "mn": "ADBE Drop Shadow-0003", + "ix": 3, + "v": { "a": 0, "k": 0, "ix": 3 } + }, + { + "ty": 0, + "nm": "Distance", + "mn": "ADBE Drop Shadow-0004", + "ix": 4, + "v": { "a": 0, "k": 0, "ix": 4 } + }, + { + "ty": 0, + "nm": "Softness", + "mn": "ADBE Drop Shadow-0005", + "ix": 5, + "v": { "a": 0, "k": 100, "ix": 5 } + }, + { + "ty": 7, + "nm": "Shadow Only", + "mn": "ADBE Drop Shadow-0006", + "ix": 6, + "v": { "a": 0, "k": 0, "ix": 6 } + } + ] + } + ], + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 1, + "k": [ + { + "i": { "x": 0.252, "y": 1 }, + "o": { "x": 0.434, "y": 0 }, + "t": 9, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [42.684, 1.078], + [0, 0] + ], + "v": [ + [120.607, 218.722], + [31.805, 211.525], + [31.977, 211.212], + [120.318, 218.496] + ], + "c": true + } + ] + }, + { + "i": { "x": 0.833, "y": 1 }, + "o": { "x": 0.167, "y": 0 }, + "t": 23, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [42.684, 1.078], + [0, 0] + ], + "v": [ + [-34.128, -218.21], + [-119.9, -218.21], + [31.977, 211.212], + [120.318, 218.496] + ], + "c": true + } + ] + }, + { + "i": { "x": 0.833, "y": 1 }, + "o": { "x": 0.167, "y": 0 }, + "t": 62, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [42.684, 1.078], + [0, 0] + ], + "v": [ + [-34.128, -218.21], + [-119.9, -218.21], + [31.977, 211.212], + [120.318, 218.496] + ], + "c": true + } + ] + }, + { + "t": 78, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [44.422, -6.307], + [0, 0] + ], + "v": [ + [-47.223, -218.706], + [-102.043, -218.706], + [41.501, 198.117], + [102.46, 192.802] + ], + "c": true + } + ] + } + ], + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.898039215686, 0.035294117647, 0.078431372549, 1], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Big N 1", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 1948, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 7, + "ty": 4, + "nm": "Big N 3", + "parent": 1, + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { "x": [0.667], "y": [1] }, + "o": { "x": [0.333], "y": [0] }, + "t": 19, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 24.333, + "s": [100] + }, + { + "i": { "x": [1], "y": [1] }, + "o": { "x": [0.612], "y": [0] }, + "t": 57, + "s": [100] + }, + { "t": 83, "s": [0] } + ], + "ix": 11 + }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [-77.223, 0, 0], "ix": 2 }, + "a": { "a": 0, "k": [-77.223, 0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 1, + "k": [ + { + "i": { "x": 0.252, "y": 1 }, + "o": { "x": 0.434, "y": 0 }, + "t": 19, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 1.089] + ], + "o": [ + [0, 0], + [0, 0], + [26.294, 0.724], + [0, 0] + ], + "v": [ + [-34.128, -218.21], + [-120.318, -218.521], + [-120.72, -218.979], + [-34.705, -218.587] + ], + "c": true + } + ] + }, + { + "i": { "x": 0.833, "y": 1 }, + "o": { "x": 0.167, "y": 0 }, + "t": 30, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [-28.673, 0.875] + ], + "o": [ + [0, 0], + [0, 0], + [28.673, -3.601], + [0, 0] + ], + "v": [ + [-34.128, -218.21], + [-120.318, -218.521], + [-120.318, 218.521], + [-34.128, 211.337] + ], + "c": true + } + ] + }, + { + "i": { "x": 0.833, "y": 1 }, + "o": { "x": 0.167, "y": 0 }, + "t": 62, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [-28.673, 0.875] + ], + "o": [ + [0, 0], + [0, 0], + [28.673, -3.601], + [0, 0] + ], + "v": [ + [-34.128, -218.21], + [-120.318, -218.521], + [-120.318, 218.521], + [-34.128, 211.337] + ], + "c": true + } + ] + }, + { + "t": 78, + "s": [ + { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [-28.758, -0.959] + ], + "o": [ + [0, 0], + [0, 0], + [28.673, -3.601], + [0, 0] + ], + "v": [ + [-43.652, -218.74], + [-106.032, -218.137], + [-106.032, 217.33], + [-37.7, 211.816] + ], + "c": true + } + ] + } + ], + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.694117647059, 0.023529411765, 0.058823529412, 1], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Big N 3", + "np": 2, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 1948, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 8, + "ty": 4, + "nm": "Wordmark Matte", + "td": 1, + "sr": 1, + "ks": { + "o": { "a": 0, "k": 100, "ix": 11 }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { "a": 0, "k": [565.279, 256.14, 0], "ix": 2 }, + "a": { "a": 0, "k": [232, 1, 0], "ix": 1 }, + "s": { "a": 0, "k": [232.448, 114, 100], "ix": 6 } + }, + "ao": 0, + "ef": [ + { + "ty": 29, + "nm": "Gaussian Blur", + "np": 5, + "mn": "ADBE Gaussian Blur 2", + "ix": 1, + "en": 1, + "ef": [ + { + "ty": 0, + "nm": "Blurriness", + "mn": "ADBE Gaussian Blur 2-0001", + "ix": 1, + "v": { "a": 0, "k": 70, "ix": 1 } + }, + { + "ty": 7, + "nm": "Blur Dimensions", + "mn": "ADBE Gaussian Blur 2-0002", + "ix": 2, + "v": { "a": 0, "k": 1, "ix": 2 } + }, + { + "ty": 7, + "nm": "Repeat Edge Pixels", + "mn": "ADBE Gaussian Blur 2-0003", + "ix": 3, + "v": { "a": 0, "k": 0, "ix": 3 } + } + ] + } + ], + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ty": "rc", + "d": 1, + "s": { "a": 0, "k": [72, 538], "ix": 2 }, + "p": { "a": 0, "k": [0, 0], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 4 }, + "nm": "Rectangle Path 1", + "mn": "ADBE Vector Shape - Rect", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.694117647059, 0.023529411765, 0.058823529412, 1], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [232, 1], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Rectangle 1", + "np": 3, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 0, + "op": 1948, + "st": 0, + "bm": 0 + }, + { + "ddd": 0, + "ind": 9, + "ty": 4, + "nm": "Netflix Wordmark", + "tt": 2, + "sr": 1, + "ks": { + "o": { + "a": 1, + "k": [ + { + "i": { "x": [0.87], "y": [1] }, + "o": { "x": [0.612], "y": [0] }, + "t": 52, + "s": [0] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 75, + "s": [100] + }, + { + "i": { "x": [0.833], "y": [1] }, + "o": { "x": [0.167], "y": [0] }, + "t": 121.776, + "s": [100] + }, + { "t": 137, "s": [0] } + ], + "ix": 11 + }, + "r": { "a": 0, "k": 0, "ix": 10 }, + "p": { + "s": true, + "x": { + "a": 1, + "k": [ + { + "i": { "x": [0.455], "y": [1] }, + "o": { "x": [0.684], "y": [0] }, + "t": 52, + "s": [402.75] + }, + { "t": 77.373046875, "s": [256] } + ], + "ix": 3 + }, + "y": { "a": 0, "k": 256, "ix": 4 } + }, + "a": { "a": 0, "k": [0, 0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100, 100], "ix": 6 } + }, + "ao": 0, + "shapes": [ + { + "ty": "gr", + "it": [ + { + "ind": 0, + "ty": "sh", + "ix": 1, + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [5.401, -0.719], + [0, 0], + [0, 0], + [4.861, -0.72], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [-5.131, 0.901], + [0, 0], + [0, 0], + [-5.131, 0.54], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "v": [ + [-123.641, 40.148], + [-139.394, 42.039], + [-155.868, -6.211], + [-155.868, 44.11], + [-170.541, 46.09], + [-170.541, -46.09], + [-156.858, -46.09], + [-138.134, 6.212], + [-138.134, -46.09], + [-123.641, -46.09] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 1", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ind": 1, + "ty": "sh", + "ix": 2, + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [-5.131, 0], + [0, 0], + [5.401, -0.27], + [0, 0], + [-8.551, 0.27], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [5.582, 0], + [0, 0], + [-6.392, 0], + [0, 0], + [8.462, -0.54], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "v": [ + [-95.285, -12.333], + [-76.021, -12.603], + [-76.021, 1.8], + [-95.285, 2.07], + [-95.285, 23.495], + [-69.81, 21.964], + [-69.81, 35.826], + [-109.689, 38.978], + [-109.689, -46.09], + [-69.81, -46.09], + [-69.81, -31.687], + [-95.285, -31.687] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 2", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ind": 2, + "ty": "sh", + "ix": 3, + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [4.68, -0.18], + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [-4.861, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "v": [ + [-16.249, -31.686], + [-31.192, -31.686], + [-31.192, 34.568], + [-45.594, 34.747], + [-45.594, -31.686], + [-60.537, -31.686], + [-60.537, -46.09], + [-16.248, -46.09] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 3", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ind": 3, + "ty": "sh", + "ix": 4, + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "v": [ + [7.156, -13.323], + [26.871, -13.323], + [26.871, 1.08], + [7.156, 1.08], + [7.156, 33.757], + [-6.978, 33.757], + [-6.978, -46.09], + [33.262, -46.09], + [33.262, -31.687], + [7.156, -31.687] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 4", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ind": 4, + "ty": "sh", + "ix": 5, + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [-8.012, -0.449], + [0, 0], + [13.143, 0.271], + [0, 0], + [0, 0] + ], + "o": [ + [8.192, 0.18], + [0, 0], + [-12.873, -0.811], + [0, 0], + [0, 0], + [0, 0] + ], + "v": [ + [56.667, 21.154], + [81.152, 22.415], + [81.152, 36.638], + [42.264, 34.747], + [42.264, -46.09], + [56.667, -46.09] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 5", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ind": 5, + "ty": "sh", + "ix": 6, + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [-4.681, -0.539], + [0, 0], + [0, 0] + ], + "o": [ + [4.591, 0.27], + [0, 0], + [0, 0], + [0, 0] + ], + "v": [ + [93.304, 37.628], + [107.437, 38.708], + [107.437, -46.09], + [93.304, -46.09] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 6", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ind": 6, + "ty": "sh", + "ix": 7, + "ks": { + "a": 0, + "k": { + "i": [ + [0, 0], + [0, 0], + [0, 0], + [5.401, 0.9], + [0, 0], + [0, 0], + [5.22, 0.72], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "o": [ + [0, 0], + [0, 0], + [-5.403, -0.72], + [0, 0], + [0, 0], + [-5.222, -0.901], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0], + [0, 0] + ], + "v": [ + [170.541, -46.09], + [152.267, -2.25], + [170.541, 46.09], + [154.337, 43.479], + [143.985, 16.834], + [133.454, 41.319], + [117.971, 39.428], + [136.515, -2.791], + [119.771, -46.09], + [135.253, -46.09], + [144.705, -21.875], + [154.788, -46.09] + ], + "c": true + }, + "ix": 2 + }, + "nm": "Path 7", + "mn": "ADBE Vector Shape - Group", + "hd": false + }, + { + "ty": "fl", + "c": { + "a": 0, + "k": [0.898039215686, 0.035294117647, 0.078431372549, 1], + "ix": 4 + }, + "o": { "a": 0, "k": 100, "ix": 5 }, + "r": 1, + "bm": 0, + "nm": "Fill 1", + "mn": "ADBE Vector Graphic - Fill", + "hd": false + }, + { + "ty": "tr", + "p": { "a": 0, "k": [0, 0], "ix": 2 }, + "a": { "a": 0, "k": [0, 0], "ix": 1 }, + "s": { "a": 0, "k": [100, 100], "ix": 3 }, + "r": { "a": 0, "k": 0, "ix": 6 }, + "o": { "a": 0, "k": 100, "ix": 7 }, + "sk": { "a": 0, "k": 0, "ix": 4 }, + "sa": { "a": 0, "k": 0, "ix": 5 }, + "nm": "Transform" + } + ], + "nm": "Netflix Wordmark", + "np": 8, + "cix": 2, + "bm": 0, + "ix": 1, + "mn": "ADBE Vector Group", + "hd": false + } + ], + "ip": 51, + "op": 1948, + "st": 0, + "bm": 0 + } + ], + "markers": [] +} diff --git a/app/home/page.tsx b/app/home/page.tsx new file mode 100644 index 0000000..fd1cf1e --- /dev/null +++ b/app/home/page.tsx @@ -0,0 +1,16 @@ +export default function Home() { + return ( +
+
+
+ ν—€λ”μ˜μ—­ +
+
+ λ°°λ„ˆ μ˜μ—­ +
μ„Ήμ…˜ μ˜μ—­
+
μ„Ήμ…˜ μ˜μ—­
+
+
+
+ ); +} diff --git a/app/layout.tsx b/app/layout.tsx index 21b5b41..b3176d7 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,6 +1,7 @@ import type { Metadata } from "next"; import { Geist, Geist_Mono } from "next/font/google"; import "./globals.css"; +import IndicatorBar from "@/components/IndicatorBar"; const geistSans = Geist({ variable: "--font-geist-sans", @@ -28,9 +29,10 @@ export default function RootLayout({ return ( {children} + ); diff --git a/app/lottieLogo.tsx b/app/lottieLogo.tsx new file mode 100644 index 0000000..b14ad2d --- /dev/null +++ b/app/lottieLogo.tsx @@ -0,0 +1,25 @@ +"use client"; + +import dynamic from "next/dynamic"; +import { useRouter } from "next/navigation"; +import LogoAnimation from "./animations/logo.json"; + +const Lottie = dynamic(() => import("lottie-react"), { ssr: false }); + +export default function LottieLogo() { + const router = useRouter(); + + const handleComplete = () => { + router.push("/home"); + }; + + return ( +
+ +
+ ); +} diff --git a/app/page.tsx b/app/page.tsx index b22bc1d..e3553ac 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,9 +1,9 @@ -// src/app/page.tsx -export default function Home() { +import LottieLogo from "./lottieLogo"; + +export default function Landing() { return ( -
-

Hello Next.js πŸ‘‹

-

λ„·ν”Œλ¦­μŠ€ 클둠 μ½”λ”© μ‹œμž‘

-
+
+ +
); } diff --git a/components/IndicatorBar.tsx b/components/IndicatorBar.tsx new file mode 100644 index 0000000..085bff8 --- /dev/null +++ b/components/IndicatorBar.tsx @@ -0,0 +1,7 @@ +export default function IndicatorBar() { + return ( +
+
+
+ ); +} diff --git a/package-lock.json b/package-lock.json index 011bf56..498e372 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "@types/styled-components": "^5.1.35", "babel-plugin-styled-components": "^2.1.4", + "lottie-react": "^2.4.1", "next": "16.0.0", "react": "19.2.0", "react-dom": "19.2.0", @@ -4941,6 +4942,25 @@ "loose-envify": "cli.js" } }, + "node_modules/lottie-react": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/lottie-react/-/lottie-react-2.4.1.tgz", + "integrity": "sha512-LQrH7jlkigIIv++wIyrOYFLHSKQpEY4zehPicL9bQsrt1rnoKRYCYgpCUe5maqylNtacy58/sQDZTkwMcTRxZw==", + "license": "MIT", + "dependencies": { + "lottie-web": "^5.10.2" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/lottie-web": { + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/lottie-web/-/lottie-web-5.13.0.tgz", + "integrity": "sha512-+gfBXl6sxXMPe8tKQm7qzLnUy5DUPJPKIyRHwtpCpyUEYjHYRJC/5gjUvdkuO2c3JllrPtHXH5UJJK8LRYl5yQ==", + "license": "MIT" + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", diff --git a/package.json b/package.json index 39fb90f..fb08f15 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "dependencies": { "@types/styled-components": "^5.1.35", "babel-plugin-styled-components": "^2.1.4", + "lottie-react": "^2.4.1", "next": "16.0.0", "react": "19.2.0", "react-dom": "19.2.0", From 94a444a652dfe9e6ffc36248105c8f69fef5a4b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=EC=84=B1=EC=95=84?= <170587664+sungahChooo@users.noreply.github.com> Date: Thu, 30 Oct 2025 03:23:37 +0900 Subject: [PATCH 09/82] Add pull request template for better contributions Add a pull request template with sections for issues, work description, screenshots, and review requirements. --- .github/PULL_REQUEST_TEMPLATE.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..bedfb13 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,10 @@ +## #οΈβƒ£μ—°κ΄€λœ 이슈 +> ex) #이슈번호, #이슈번호 + +## πŸ“μž‘μ—… λ‚΄μš© +> 이번 PRμ—μ„œ μž‘μ—…ν•œ λ‚΄μš©μ„ κ°„λž΅νžˆ μ„€λͺ…ν•΄μ£Όμ„Έμš”(이미지 첨뢀 κ°€λŠ₯) + +### πŸ“·μŠ€ν¬λ¦°μƒ· (선택) + +## πŸ’¬λ¦¬λ·° μš”κ΅¬μ‚¬ν•­(선택) +> 리뷰어가 νŠΉλ³„νžˆ λ΄μ£Όμ—ˆμœΌλ©΄ ν•˜λŠ” 뢀뢄이 μžˆλ‹€λ©΄ μž‘μ„±ν•΄μ£Όμ„Έμš” From 81f9589839b939f3b8b69b6f1fbc9f54c0c9d0f8 Mon Sep 17 00:00:00 2001 From: baekseungsun Date: Thu, 30 Oct 2025 16:26:49 +0900 Subject: [PATCH 10/82] =?UTF-8?q?=ED=97=A4=EB=8D=94=EC=99=80=20API?= =?UTF-8?q?=EC=9D=B4=EC=9A=A9=ED=95=9C=20=EB=B0=B0=EB=84=88=20=EA=B0=9C?= =?UTF-8?q?=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/globals.css | 28 +-- app/layout.tsx | 1 + app/page.tsx | 22 +- components/Banner.tsx | 88 ++++++++ components/Header.tsx | 20 ++ lib/fetcher.ts | 33 +++ lib/tmdb.ts | 42 ++++ next.config.ts | 1 + package-lock.json | 482 +++++++++++++++++++++++++++++++++++++++++- package.json | 6 +- public/icons/add.svg | 4 + public/icons/info.svg | 5 + public/icons/play.svg | 3 + types/tmdb.ts | 16 ++ 14 files changed, 723 insertions(+), 28 deletions(-) create mode 100644 components/Banner.tsx create mode 100644 components/Header.tsx create mode 100644 lib/fetcher.ts create mode 100644 lib/tmdb.ts create mode 100644 public/icons/add.svg create mode 100644 public/icons/info.svg create mode 100644 public/icons/play.svg create mode 100644 types/tmdb.ts diff --git a/app/globals.css b/app/globals.css index a2dc41e..3b709de 100644 --- a/app/globals.css +++ b/app/globals.css @@ -1,26 +1,26 @@ @import "tailwindcss"; :root { - --background: #ffffff; - --foreground: #171717; + --background: #ffffff; + --foreground: #171717; } @theme inline { - --color-background: var(--background); - --color-foreground: var(--foreground); - --font-sans: var(--font-geist-sans); - --font-mono: var(--font-geist-mono); + --color-background: var(--background); + --color-foreground: var(--foreground); + --font-sans: var(--font-geist-sans); + --font-mono: var(--font-geist-mono); } @media (prefers-color-scheme: dark) { - :root { - --background: #0a0a0a; - --foreground: #ededed; - } + :root { + --background: #0a0a0a; + --foreground: #ededed; + } } body { - background: var(--background); - color: var(--foreground); - font-family: Arial, Helvetica, sans-serif; -} + background: var(--background); + color: var(--foreground); + font-family: Arial, Helvetica, sans-serif; +} \ No newline at end of file diff --git a/app/layout.tsx b/app/layout.tsx index 21b5b41..08b80a0 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -2,6 +2,7 @@ import type { Metadata } from "next"; import { Geist, Geist_Mono } from "next/font/google"; import "./globals.css"; + const geistSans = Geist({ variable: "--font-geist-sans", subsets: ["latin"], diff --git a/app/page.tsx b/app/page.tsx index fc2bc6d..2eb483d 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,11 +1,15 @@ -// src/app/page.tsx -'use client'; +import Header from "@/components/Header"; +import Banner from "@/components/Banner"; -export default function Home() { - return ( -
-

Hello Next.js πŸ‘‹

-

λ„·ν”Œλ¦­μŠ€ 클둠 μ½”λ”© μ‹œμž‘

-
- ); +export default function Page() { + return ( +
+
+
+
+
+ +
+
+ ); } diff --git a/components/Banner.tsx b/components/Banner.tsx new file mode 100644 index 0000000..fcc1e21 --- /dev/null +++ b/components/Banner.tsx @@ -0,0 +1,88 @@ +// components/Banner.tsx +"use client"; + +import { useEffect, useState } from "react"; +import { fetcher } from "@/lib/fetcher"; +import type { tmdbListResponse, tmdbTitle } from "@/types/tmdb"; +import Image from "next/image"; +import add from '../public/icons/add.svg' +import play from '../public/icons/play.svg' +import info from '../public/icons/info.svg' + + +const imgBase = process.env.NEXT_PUBLIC_TMDB_IMAGE_BASE; + +//URLλ§Œλ“œλŠ” ν•¨μˆ˜ +function buildImageUrl(path?: string | null, size: "w780" | "w1280" | "original" = "w1280") { + if (!path) return ""; + return `${imgBase}/${size}${path}`; +} + +export default function Banner() { + const [item, setItem] = useState(null); + const rank = 1; //ν˜„μž¬ 1λ“±μœΌλ‘œ κ³ μ • + const regionName = "Korea"; //ν˜„μž¬ ν•œκ΅­μœΌλ‘œ κ³ μ • + + //인기 μ˜ν™” API 콜 + useEffect(() => { + (async () => { + try { + //ν˜„μž¬ ν•œκ΅­ 1λ“± μ˜ν™”λ‘œ κ³ μ • + const data = await fetcher>("/movie/popular", { + language: "ko-KR", + region: "kr", + page: "1", + }); + const candidate = data.results?.[1] ?? data.results?.[0] ?? null; + setItem(candidate); + } catch (e) { + console.error(e); + } + })(); + }, []); + + const title = item?.title + //backdrop 이미지 + const backdrop = buildImageUrl(item?.backdrop_path ?? item?.poster_path, "w1280"); + + return ( +
+ {backdrop && ( + {title} + )} + {/*이미지 κ·Έλ ˆμ΄λ””μ–ΈνŠΈ*/} +
+
+
+ +
+
TOP
+
10
+
+ #{rank} in {regionName} Today +
+
+
+ + + + + +
+
+
+ ); +} diff --git a/components/Header.tsx b/components/Header.tsx new file mode 100644 index 0000000..9f3ec5c --- /dev/null +++ b/components/Header.tsx @@ -0,0 +1,20 @@ +"use client"; + +import logo from '../public/icons/logo.svg' +import Image from "next/image"; + +export default function Header() { + return ( +
+
+ {logo} +
+ {/* νƒ­λ“€ */} + +
+ ); +} \ No newline at end of file diff --git a/lib/fetcher.ts b/lib/fetcher.ts new file mode 100644 index 0000000..9e470b3 --- /dev/null +++ b/lib/fetcher.ts @@ -0,0 +1,33 @@ +// lib/fetcher.ts +export async function fetcher( + endpoint: string, + params?: Record, + options: RequestInit = {} +): Promise { + const baseUrl = process.env.NEXT_PUBLIC_TMDB_V3_BASE_URL!; + const url = new URL(`${baseUrl}${endpoint}`); + + // 곡톡 쿼리 μΆ”κ°€ + if (params) { + Object.entries(params).forEach(([key, value]) => { + url.searchParams.append(key, value); + }); + } + + // 인증: v4 Bearer μš°μ„ , μ—†μœΌλ©΄ v3 api_key 쿼리 + const v4Token = process.env.NEXT_PUBLIC_TMDB_V4_ACCESS_TOKEN; + + const res: Response = await fetch(url.toString(), { + next: { revalidate: 3600 }, + headers: { + ...(v4Token ? { Authorization: `Bearer ${v4Token}` } : {}), + ...(options.headers || {}), + }, + ...options, + }); + + if (!res.ok) { + throw new Error(`TMDB fetch failed: ${res.status} ${res.statusText}`); + } + return (await res.json()) as T; +} diff --git a/lib/tmdb.ts b/lib/tmdb.ts new file mode 100644 index 0000000..29be445 --- /dev/null +++ b/lib/tmdb.ts @@ -0,0 +1,42 @@ +// lib/tmdb.ts +import { fetcher } from "./fetcher"; + +const IMG_BASE = "https://image.tmdb.org/t/p"; + +//λ°°λ„ˆμš© 이미지 URL +function backdropUrl(path?: string, size: string = "w780") { + return path ? `${IMG_BASE}/${size}${path}` : ""; +} + +//preview 썸넀일 용 이미지 URL +function posterUrl(path?: string, size: string = "w342") { + return path ? `${IMG_BASE}/${size}${path}` : ""; +} + +//λ°°λ„ˆμš© 이미지 exportν•¨μˆ˜ +export async function getHeroBannerImage() { + const data = await fetcher("/movie/popular", { + language: "ko-KR", + page: "1", + region: "KR", + }); + const first = data.results?.[0]; + return { + backdrop: backdropUrl(first?.backdrop_path, "w780"), + }; +} + +//프리뷰 이미지 export ν•¨μˆ˜ +export async function getPreviewPosters() { + const data = await fetcher("/movie/now_playing", { + language: "ko-KR", + page: "1", + region: "KR", + }); + + return data.results + .slice(0, 10) + .map((movie: any) => ({ + poster: posterUrl(movie.poster_path, "w342"), + })); +} diff --git a/next.config.ts b/next.config.ts index e9ffa30..7443abb 100644 --- a/next.config.ts +++ b/next.config.ts @@ -5,3 +5,4 @@ const nextConfig: NextConfig = { }; export default nextConfig; + diff --git a/package-lock.json b/package-lock.json index 9d4d904..4a9eb1d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,8 @@ "babel-plugin-styled-components": "^2.1.4", "next": "16.0.0", "react": "19.2.0", - "react-dom": "19.2.0" + "react-dom": "19.2.0", + "styled-jsx": "^5.1.7" }, "devDependencies": { "@tailwindcss/postcss": "^4", @@ -21,7 +22,9 @@ "autoprefixer": "^10.4.21", "eslint": "^9", "eslint-config-next": "16.0.0", + "kill-port": "^2.0.1", "postcss": "^8.5.6", + "rimraf": "^6.0.1", "tailwindcss": "^4.1.16", "typescript": "^5" } @@ -980,6 +983,47 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@isaacs/balanced-match": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", + "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/brace-expansion": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", + "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@isaacs/balanced-match": "^4.0.1" + }, + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmmirror.com/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -2196,6 +2240,19 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ansi-regex": { + "version": "6.2.2", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.2.2.tgz", + "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -2917,6 +2974,13 @@ "node": ">= 0.4" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, "node_modules/electron-to-chromium": { "version": "1.5.241", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.241.tgz", @@ -3708,6 +3772,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/fraction.js": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", @@ -3839,6 +3920,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-them-args": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/get-them-args/-/get-them-args-1.3.2.tgz", + "integrity": "sha512-LRn8Jlk+DwZE4GTlDbT3Hikd1wSHgLMme/+7ddlqKd7ldwR6LjJgTVWzBnR01wnYGe4KgrXjg287RaI22UHmAw==", + "dev": true, + "license": "MIT" + }, "node_modules/get-tsconfig": { "version": "4.13.0", "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", @@ -3852,6 +3940,30 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, + "node_modules/glob": { + "version": "11.0.3", + "resolved": "https://registry.npmmirror.com/glob/-/glob-11.0.3.tgz", + "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.3.1", + "jackspeak": "^4.1.1", + "minimatch": "^10.0.3", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^2.0.0" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -3865,6 +3977,22 @@ "node": ">=10.13.0" } }, + "node_modules/glob/node_modules/minimatch": { + "version": "10.1.1", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-10.1.1.tgz", + "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/brace-expansion": "^5.0.0" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", @@ -4269,6 +4397,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", @@ -4532,6 +4670,22 @@ "node": ">= 0.4" } }, + "node_modules/jackspeak": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/jackspeak/-/jackspeak-4.1.1.tgz", + "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/jiti": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", @@ -4632,6 +4786,20 @@ "json-buffer": "3.0.1" } }, + "node_modules/kill-port": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/kill-port/-/kill-port-2.0.1.tgz", + "integrity": "sha512-e0SVOV5jFo0mx8r7bS29maVWp17qGqLBZ5ricNSajON6//kmb7qqqNnml4twNE8Dtj97UQD+gNFOaipS/q1zzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-them-args": "1.3.2", + "shell-exec": "1.0.2" + }, + "bin": { + "kill-port": "cli.js" + } + }, "node_modules/language-subtag-registry": { "version": "0.3.23", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", @@ -5045,6 +5213,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmmirror.com/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -5172,6 +5350,29 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/next/node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmmirror.com/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, "node_modules/node-releases": { "version": "2.0.26", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.26.tgz", @@ -5379,6 +5580,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -5419,6 +5627,33 @@ "dev": true, "license": "MIT" }, + "node_modules/path-scurry": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/path-scurry/-/path-scurry-2.0.0.tgz", + "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "11.2.2", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-11.2.2.tgz", + "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "20 || >=22" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -5659,6 +5894,26 @@ "node": ">=0.10.0" } }, + "node_modules/rimraf": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-6.0.1.tgz", + "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^11.0.0", + "package-json-from-dist": "^1.0.0" + }, + "bin": { + "rimraf": "dist/esm/bin.mjs" + }, + "engines": { + "node": "20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -5888,6 +6143,13 @@ "node": ">=8" } }, + "node_modules/shell-exec": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/shell-exec/-/shell-exec-1.0.2.tgz", + "integrity": "sha512-jyVd+kU2X+mWKMmGhx4fpWbPsjvD53k9ivqetutVW/BQ+WIZoDoP4d8vUMGezV6saZsiNoW2f9GIhg9Dondohg==", + "dev": true, + "license": "MIT" + }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -5964,6 +6226,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -5994,6 +6269,70 @@ "node": ">= 0.4" } }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/string.prototype.includes": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", @@ -6107,6 +6446,46 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/strip-ansi": { + "version": "7.1.2", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.2.tgz", + "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -6196,9 +6575,9 @@ "peer": true }, "node_modules/styled-jsx": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", - "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "version": "5.1.7", + "resolved": "https://registry.npmmirror.com/styled-jsx/-/styled-jsx-5.1.7.tgz", + "integrity": "sha512-HPLmEIYprxCeWDMLYiaaAhsV3yGfIlCqzuVOybE6fjF3SUJmH67nCoMDO+nAvHNHo46OfvpCNu4Rcue82dMNFg==", "license": "MIT", "dependencies": { "client-only": "0.0.1" @@ -6723,6 +7102,101 @@ "node": ">=0.10.0" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", diff --git a/package.json b/package.json index 3638473..5b6ef4e 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,8 @@ "babel-plugin-styled-components": "^2.1.4", "next": "16.0.0", "react": "19.2.0", - "react-dom": "19.2.0" + "react-dom": "19.2.0", + "styled-jsx": "^5.1.7" }, "devDependencies": { "@tailwindcss/postcss": "^4", @@ -23,8 +24,11 @@ "autoprefixer": "^10.4.21", "eslint": "^9", "eslint-config-next": "16.0.0", + "kill-port": "^2.0.1", "postcss": "^8.5.6", + "rimraf": "^6.0.1", "tailwindcss": "^4.1.16", "typescript": "^5" } } + diff --git a/public/icons/add.svg b/public/icons/add.svg new file mode 100644 index 0000000..cc20d76 --- /dev/null +++ b/public/icons/add.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/icons/info.svg b/public/icons/info.svg new file mode 100644 index 0000000..65323f3 --- /dev/null +++ b/public/icons/info.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/public/icons/play.svg b/public/icons/play.svg new file mode 100644 index 0000000..52e5366 --- /dev/null +++ b/public/icons/play.svg @@ -0,0 +1,3 @@ + + + diff --git a/types/tmdb.ts b/types/tmdb.ts new file mode 100644 index 0000000..040bb82 --- /dev/null +++ b/types/tmdb.ts @@ -0,0 +1,16 @@ + +export interface tmdbTitle { + id: number; + title?: string; + name?: string; + backdrop_path?: string | null; + poster_path?: string | null; +} + +//generic type으둜 tmdb응닡 λ°›κΈ° +export interface tmdbListResponse { + page: number; + results: T[]; + total_pages: number; + total_results: number; +} From d9bd5d6999be1859369b7d1f3640a4d009cd2869 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Thu, 30 Oct 2025 16:43:27 +0900 Subject: [PATCH 11/82] =?UTF-8?q?feat:=20continue=20watching=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EA=B0=9C=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .babelrc | 3 +- app/home/page.tsx | 36 ++++++++++++++++++++ components/AfricanMovies.tsx | 3 ++ components/ContinueWatching.tsx | 53 ++++++++++++++++++++++++++++++ components/MyList.tsx | 3 ++ components/NetflixOriginals.tsx | 3 ++ components/NewReleases.tsx | 3 ++ components/Nollywood.tsx | 3 ++ components/Popular.tsx | 8 +++++ components/Top10.tsx | 3 ++ components/TrendingNow.tsx | 3 ++ components/TvThrillerMysteries.tsx | 3 ++ components/USTvShow.tsx | 3 ++ components/WatchItAgain.tsx | 3 ++ libs/tdmbs.ts | 26 +++++++++++++++ next.config.ts | 4 ++- public/file.svg | 1 - 17 files changed, 157 insertions(+), 4 deletions(-) create mode 100644 app/home/page.tsx create mode 100644 components/AfricanMovies.tsx create mode 100644 components/ContinueWatching.tsx create mode 100644 components/MyList.tsx create mode 100644 components/NetflixOriginals.tsx create mode 100644 components/NewReleases.tsx create mode 100644 components/Nollywood.tsx create mode 100644 components/Popular.tsx create mode 100644 components/Top10.tsx create mode 100644 components/TrendingNow.tsx create mode 100644 components/TvThrillerMysteries.tsx create mode 100644 components/USTvShow.tsx create mode 100644 components/WatchItAgain.tsx create mode 100644 libs/tdmbs.ts delete mode 100644 public/file.svg diff --git a/.babelrc b/.babelrc index 34abf3f..1ff94f7 100644 --- a/.babelrc +++ b/.babelrc @@ -1,4 +1,3 @@ { - "presets": ["next/babel"], - "plugins": ["styled-components"] + "presets": ["next/babel"] } diff --git a/app/home/page.tsx b/app/home/page.tsx new file mode 100644 index 0000000..61b7562 --- /dev/null +++ b/app/home/page.tsx @@ -0,0 +1,36 @@ +import AfricanMovies from "@/components/AfricanMovies"; +import ContinueWataching from "@/components/ContinueWatching"; +import MyList from "@/components/MyList"; +import NetflixOriginals from "@/components/NetflixOriginals"; +import NewReleases from "@/components/NewReleases"; +import Nollywood from "@/components/Nollywood"; +import Popular from "@/components/Popular"; +import Top10 from "@/components/Top10"; +import TrendingNow from "@/components/TrendingNow"; +import ThrillerMysteries from "@/components/TvThrillerMysteries"; +import UsTvShow from "@/components/USTvShow"; +import WatchItAgain from "@/components/WatchItAgain"; +export default async function Home() { + return ( +
+
+
+ ν—€λ”μ˜μ—­ +
+
λ°°λ„ˆ μ˜μ—­
+ + + + + + + + + + + + +
+
+ ); +} diff --git a/components/AfricanMovies.tsx b/components/AfricanMovies.tsx new file mode 100644 index 0000000..3fdf2cc --- /dev/null +++ b/components/AfricanMovies.tsx @@ -0,0 +1,3 @@ +export default function AfricanMovies() { + return
AfricanMovies νŽ˜μ΄μ§€μž…λ‹ˆλ‹€.
; +} diff --git a/components/ContinueWatching.tsx b/components/ContinueWatching.tsx new file mode 100644 index 0000000..7936e20 --- /dev/null +++ b/components/ContinueWatching.tsx @@ -0,0 +1,53 @@ +"use client"; + +import { useEffect, useState } from "react"; +import { fetchMovieById } from "@/libs/tdmbs"; +import Image from "next/image"; + +type Movie = { + id: number; + title: string; + poster_path: string; +}; + +const MOCK_WATCHING_IDS = [550, 299534, 155, 597, 681]; + +export default function ContinueWatching() { + const [movies, setMovies] = useState([]); + + useEffect(() => { + async function loadMovies() { + const data = await Promise.all( + MOCK_WATCHING_IDS.map((id) => fetchMovieById(id)) + ); + setMovies(data); + } + loadMovies(); + }, []); + + return ( +
+
+ Continue Watching for Emenalo +
+ +
+ {movies.map((movie) => ( +
+ {movie.title} +
+
+ {/* μ§„ν–‰λ₯  μ˜ˆμ‹œ */} +
+
+ ))} +
+
+ ); +} diff --git a/components/MyList.tsx b/components/MyList.tsx new file mode 100644 index 0000000..e27c009 --- /dev/null +++ b/components/MyList.tsx @@ -0,0 +1,3 @@ +export default function MyList() { + return
MyList νŽ˜μ΄μ§€μž…λ‹ˆλ‹€.
; +} diff --git a/components/NetflixOriginals.tsx b/components/NetflixOriginals.tsx new file mode 100644 index 0000000..405e7aa --- /dev/null +++ b/components/NetflixOriginals.tsx @@ -0,0 +1,3 @@ +export default function NetflixOriginals() { + return
NetflixOriginals νŽ˜μ΄μ§€μž…λ‹ˆλ‹€.
; +} diff --git a/components/NewReleases.tsx b/components/NewReleases.tsx new file mode 100644 index 0000000..79a48d5 --- /dev/null +++ b/components/NewReleases.tsx @@ -0,0 +1,3 @@ +export default function NewReleases() { + return
NewReleases μ»΄ν¬λ„ŒνŠΈμž…λ‹ˆλ‹€.
; +} diff --git a/components/Nollywood.tsx b/components/Nollywood.tsx new file mode 100644 index 0000000..adb5960 --- /dev/null +++ b/components/Nollywood.tsx @@ -0,0 +1,3 @@ +export default function Nollywood() { + return
Nollywood νŽ˜μ΄μ§€μž…λ‹ˆλ‹€.
; +} diff --git a/components/Popular.tsx b/components/Popular.tsx new file mode 100644 index 0000000..775ee88 --- /dev/null +++ b/components/Popular.tsx @@ -0,0 +1,8 @@ +export default function Popular() { + return ( +
+ popular on netflix +
이미지 μ˜μ—­
+
+ ); +} diff --git a/components/Top10.tsx b/components/Top10.tsx new file mode 100644 index 0000000..af9a64b --- /dev/null +++ b/components/Top10.tsx @@ -0,0 +1,3 @@ +export default function Top10() { + return
Top10 νŽ˜μ΄μ§€μž…λ‹ˆλ‹€.
; +} diff --git a/components/TrendingNow.tsx b/components/TrendingNow.tsx new file mode 100644 index 0000000..12a65cb --- /dev/null +++ b/components/TrendingNow.tsx @@ -0,0 +1,3 @@ +export default function TrandingNow() { + return
TrandingNow νŽ˜μ΄μ§€μž…λ‹ˆλ‹€.
; +} diff --git a/components/TvThrillerMysteries.tsx b/components/TvThrillerMysteries.tsx new file mode 100644 index 0000000..72ac5c5 --- /dev/null +++ b/components/TvThrillerMysteries.tsx @@ -0,0 +1,3 @@ +export default function ThrillerMysteries() { + return
ThrillerMysteries μ»΄ν¬λ„ŒνŠΈμž…λ‹ˆλ‹€.
; +} diff --git a/components/USTvShow.tsx b/components/USTvShow.tsx new file mode 100644 index 0000000..1487b01 --- /dev/null +++ b/components/USTvShow.tsx @@ -0,0 +1,3 @@ +export default function UsTvShow() { + return
UsTvShow μ»΄ν¬λ„ŒνŠΈμž…λ‹ˆλ‹€.
; +} diff --git a/components/WatchItAgain.tsx b/components/WatchItAgain.tsx new file mode 100644 index 0000000..c439eba --- /dev/null +++ b/components/WatchItAgain.tsx @@ -0,0 +1,3 @@ +export default function WatchItAgain() { + return
WatchItAgain μ»΄ν¬λ„ŒνŠΈμž…λ‹ˆλ‹€.
; +} diff --git a/libs/tdmbs.ts b/libs/tdmbs.ts new file mode 100644 index 0000000..04003f0 --- /dev/null +++ b/libs/tdmbs.ts @@ -0,0 +1,26 @@ +const BASE_URL = "https://api.themoviedb.org/3"; +const API_KEY = process.env.NEXT_PUBLIC_TMDB_API_KEY; + +export async function fetchPopularMovies(language = "ko-KR", page = 1) { + const res = await fetch( + `${BASE_URL}/movie/popular?api_key=${API_KEY}&language=${language}&page=${page}`, + { + next: { revalidate: 3600 }, // ISR 캐싱: 1μ‹œκ°„λ§ˆλ‹€ μƒˆλ‘œ 패치 + } + ); + + if (!res.ok) { + throw new Error("Failed to fetch movies"); + } + + const data = await res.json(); + return data.results; +} + +export async function fetchMovieById(id: number, language = "ko-KR") { + const res = await fetch( + `${BASE_URL}/movie/${id}?api_key=${API_KEY}&language=${language}` + ); + if (!res.ok) throw new Error("Failed to fetch movie details"); + return res.json(); +} diff --git a/next.config.ts b/next.config.ts index e9ffa30..08be352 100644 --- a/next.config.ts +++ b/next.config.ts @@ -1,7 +1,9 @@ import type { NextConfig } from "next"; const nextConfig: NextConfig = { - /* config options here */ + images: { + domains: ["image.tmdb.org"], + }, }; export default nextConfig; diff --git a/public/file.svg b/public/file.svg deleted file mode 100644 index 004145c..0000000 --- a/public/file.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file From 5b25f8fbabc7f52c1def690f169ab008f1ae1eb0 Mon Sep 17 00:00:00 2001 From: baekseungsun Date: Thu, 30 Oct 2025 19:18:51 +0900 Subject: [PATCH 12/82] =?UTF-8?q?=ED=94=84=EB=A6=AC=EB=B7=B0=20=EA=B0=9C?= =?UTF-8?q?=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/globals.css | 4 ++++ app/page.tsx | 10 ++++++++-- components/Banner.tsx | 12 ++++++++---- components/Previews.tsx | 26 ++++++++++++++++++++++++++ lib/tmdb.ts | 4 ++-- types/tmdb.ts | 2 +- 6 files changed, 49 insertions(+), 9 deletions(-) create mode 100644 components/Previews.tsx diff --git a/app/globals.css b/app/globals.css index 3b709de..1788641 100644 --- a/app/globals.css +++ b/app/globals.css @@ -23,4 +23,8 @@ body { background: var(--background); color: var(--foreground); font-family: Arial, Helvetica, sans-serif; +} + +.no-scrollbar::-webkit-scrollbar { + display: none; } \ No newline at end of file diff --git a/app/page.tsx b/app/page.tsx index 2eb483d..56c28fd 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,15 +1,21 @@ import Header from "@/components/Header"; import Banner from "@/components/Banner"; +import Previews from "@/components/Previews"; export default function Page() { return (
-
+ {/* ν—€λ”λŠ” ν™”λ©΄ 쀑앙 κ³ μ • μΆ”μ²œ */} +
+
+
+ +
); -} +} \ No newline at end of file diff --git a/components/Banner.tsx b/components/Banner.tsx index fcc1e21..b6db0f4 100644 --- a/components/Banner.tsx +++ b/components/Banner.tsx @@ -56,27 +56,31 @@ export default function Banner() { )} {/*이미지 κ·Έλ ˆμ΄λ””μ–ΈνŠΈ*/}
-
+
- -
-
TOP
+ +
+
TOP
10
+ {/*ν˜„μž¬λŠ” ν•œκ΅­1λ“±μœΌλ‘œ κ³ μ •λœ κ°’*/} #{rank} in {regionName} Today
+ {/*MyList λ²„νŠΌ*/} + {/*play λ²„νŠΌ*/} + {/*Info λ²„νŠΌ*/} - - - - -
-
- - ); -} diff --git a/components/Header.tsx b/components/Header.tsx deleted file mode 100644 index 9f3ec5c..0000000 --- a/components/Header.tsx +++ /dev/null @@ -1,20 +0,0 @@ -"use client"; - -import logo from '../public/icons/logo.svg' -import Image from "next/image"; - -export default function Header() { - return ( -
-
- {logo} -
- {/* νƒ­λ“€ */} - -
- ); -} \ No newline at end of file diff --git a/lib/fetcher.ts b/lib/fetcher.ts deleted file mode 100644 index 9e470b3..0000000 --- a/lib/fetcher.ts +++ /dev/null @@ -1,33 +0,0 @@ -// lib/fetcher.ts -export async function fetcher( - endpoint: string, - params?: Record, - options: RequestInit = {} -): Promise { - const baseUrl = process.env.NEXT_PUBLIC_TMDB_V3_BASE_URL!; - const url = new URL(`${baseUrl}${endpoint}`); - - // 곡톡 쿼리 μΆ”κ°€ - if (params) { - Object.entries(params).forEach(([key, value]) => { - url.searchParams.append(key, value); - }); - } - - // 인증: v4 Bearer μš°μ„ , μ—†μœΌλ©΄ v3 api_key 쿼리 - const v4Token = process.env.NEXT_PUBLIC_TMDB_V4_ACCESS_TOKEN; - - const res: Response = await fetch(url.toString(), { - next: { revalidate: 3600 }, - headers: { - ...(v4Token ? { Authorization: `Bearer ${v4Token}` } : {}), - ...(options.headers || {}), - }, - ...options, - }); - - if (!res.ok) { - throw new Error(`TMDB fetch failed: ${res.status} ${res.statusText}`); - } - return (await res.json()) as T; -} diff --git a/lib/tmdb.ts b/lib/tmdb.ts deleted file mode 100644 index 29be445..0000000 --- a/lib/tmdb.ts +++ /dev/null @@ -1,42 +0,0 @@ -// lib/tmdb.ts -import { fetcher } from "./fetcher"; - -const IMG_BASE = "https://image.tmdb.org/t/p"; - -//λ°°λ„ˆμš© 이미지 URL -function backdropUrl(path?: string, size: string = "w780") { - return path ? `${IMG_BASE}/${size}${path}` : ""; -} - -//preview 썸넀일 용 이미지 URL -function posterUrl(path?: string, size: string = "w342") { - return path ? `${IMG_BASE}/${size}${path}` : ""; -} - -//λ°°λ„ˆμš© 이미지 exportν•¨μˆ˜ -export async function getHeroBannerImage() { - const data = await fetcher("/movie/popular", { - language: "ko-KR", - page: "1", - region: "KR", - }); - const first = data.results?.[0]; - return { - backdrop: backdropUrl(first?.backdrop_path, "w780"), - }; -} - -//프리뷰 이미지 export ν•¨μˆ˜ -export async function getPreviewPosters() { - const data = await fetcher("/movie/now_playing", { - language: "ko-KR", - page: "1", - region: "KR", - }); - - return data.results - .slice(0, 10) - .map((movie: any) => ({ - poster: posterUrl(movie.poster_path, "w342"), - })); -} diff --git a/next.config.ts b/next.config.ts index 7443abb..e9ffa30 100644 --- a/next.config.ts +++ b/next.config.ts @@ -5,4 +5,3 @@ const nextConfig: NextConfig = { }; export default nextConfig; - diff --git a/package-lock.json b/package-lock.json index 4a9eb1d..9d4d904 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,8 +11,7 @@ "babel-plugin-styled-components": "^2.1.4", "next": "16.0.0", "react": "19.2.0", - "react-dom": "19.2.0", - "styled-jsx": "^5.1.7" + "react-dom": "19.2.0" }, "devDependencies": { "@tailwindcss/postcss": "^4", @@ -22,9 +21,7 @@ "autoprefixer": "^10.4.21", "eslint": "^9", "eslint-config-next": "16.0.0", - "kill-port": "^2.0.1", "postcss": "^8.5.6", - "rimraf": "^6.0.1", "tailwindcss": "^4.1.16", "typescript": "^5" } @@ -983,47 +980,6 @@ "url": "https://opencollective.com/libvips" } }, - "node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/brace-expansion": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", - "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmmirror.com/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -2240,19 +2196,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -2974,13 +2917,6 @@ "node": ">= 0.4" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, "node_modules/electron-to-chromium": { "version": "1.5.241", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.241.tgz", @@ -3772,23 +3708,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmmirror.com/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/fraction.js": { "version": "4.3.7", "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", @@ -3920,13 +3839,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-them-args": { - "version": "1.3.2", - "resolved": "https://registry.npmmirror.com/get-them-args/-/get-them-args-1.3.2.tgz", - "integrity": "sha512-LRn8Jlk+DwZE4GTlDbT3Hikd1wSHgLMme/+7ddlqKd7ldwR6LjJgTVWzBnR01wnYGe4KgrXjg287RaI22UHmAw==", - "dev": true, - "license": "MIT" - }, "node_modules/get-tsconfig": { "version": "4.13.0", "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", @@ -3940,30 +3852,6 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/glob": { - "version": "11.0.3", - "resolved": "https://registry.npmmirror.com/glob/-/glob-11.0.3.tgz", - "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.3.1", - "jackspeak": "^4.1.1", - "minimatch": "^10.0.3", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^2.0.0" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -3977,22 +3865,6 @@ "node": ">=10.13.0" } }, - "node_modules/glob/node_modules/minimatch": { - "version": "10.1.1", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", @@ -4397,16 +4269,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/is-generator-function": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", @@ -4670,22 +4532,6 @@ "node": ">= 0.4" } }, - "node_modules/jackspeak": { - "version": "4.1.1", - "resolved": "https://registry.npmmirror.com/jackspeak/-/jackspeak-4.1.1.tgz", - "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/jiti": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", @@ -4786,20 +4632,6 @@ "json-buffer": "3.0.1" } }, - "node_modules/kill-port": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/kill-port/-/kill-port-2.0.1.tgz", - "integrity": "sha512-e0SVOV5jFo0mx8r7bS29maVWp17qGqLBZ5ricNSajON6//kmb7qqqNnml4twNE8Dtj97UQD+gNFOaipS/q1zzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-them-args": "1.3.2", - "shell-exec": "1.0.2" - }, - "bin": { - "kill-port": "cli.js" - } - }, "node_modules/language-subtag-registry": { "version": "0.3.23", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", @@ -5213,16 +5045,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmmirror.com/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -5350,29 +5172,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/next/node_modules/styled-jsx": { - "version": "5.1.6", - "resolved": "https://registry.npmmirror.com/styled-jsx/-/styled-jsx-5.1.6.tgz", - "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", - "license": "MIT", - "dependencies": { - "client-only": "0.0.1" - }, - "engines": { - "node": ">= 12.0.0" - }, - "peerDependencies": { - "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "babel-plugin-macros": { - "optional": true - } - } - }, "node_modules/node-releases": { "version": "2.0.26", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.26.tgz", @@ -5580,13 +5379,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -5627,33 +5419,6 @@ "dev": true, "license": "MIT" }, - "node_modules/path-scurry": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/path-scurry/-/path-scurry-2.0.0.tgz", - "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.2.2", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-11.2.2.tgz", - "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "20 || >=22" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -5894,26 +5659,6 @@ "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-6.0.1.tgz", - "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^11.0.0", - "package-json-from-dist": "^1.0.0" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -6143,13 +5888,6 @@ "node": ">=8" } }, - "node_modules/shell-exec": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/shell-exec/-/shell-exec-1.0.2.tgz", - "integrity": "sha512-jyVd+kU2X+mWKMmGhx4fpWbPsjvD53k9ivqetutVW/BQ+WIZoDoP4d8vUMGezV6saZsiNoW2f9GIhg9Dondohg==", - "dev": true, - "license": "MIT" - }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -6226,19 +5964,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -6269,70 +5994,6 @@ "node": ">= 0.4" } }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/string.prototype.includes": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", @@ -6446,46 +6107,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -6575,9 +6196,9 @@ "peer": true }, "node_modules/styled-jsx": { - "version": "5.1.7", - "resolved": "https://registry.npmmirror.com/styled-jsx/-/styled-jsx-5.1.7.tgz", - "integrity": "sha512-HPLmEIYprxCeWDMLYiaaAhsV3yGfIlCqzuVOybE6fjF3SUJmH67nCoMDO+nAvHNHo46OfvpCNu4Rcue82dMNFg==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", "license": "MIT", "dependencies": { "client-only": "0.0.1" @@ -7102,101 +6723,6 @@ "node": ">=0.10.0" } }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", diff --git a/package.json b/package.json index 5b6ef4e..3638473 100644 --- a/package.json +++ b/package.json @@ -13,8 +13,7 @@ "babel-plugin-styled-components": "^2.1.4", "next": "16.0.0", "react": "19.2.0", - "react-dom": "19.2.0", - "styled-jsx": "^5.1.7" + "react-dom": "19.2.0" }, "devDependencies": { "@tailwindcss/postcss": "^4", @@ -24,11 +23,8 @@ "autoprefixer": "^10.4.21", "eslint": "^9", "eslint-config-next": "16.0.0", - "kill-port": "^2.0.1", "postcss": "^8.5.6", - "rimraf": "^6.0.1", "tailwindcss": "^4.1.16", "typescript": "^5" } } - diff --git a/public/icons/add.svg b/public/icons/add.svg deleted file mode 100644 index cc20d76..0000000 --- a/public/icons/add.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/public/icons/info.svg b/public/icons/info.svg deleted file mode 100644 index 65323f3..0000000 --- a/public/icons/info.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/public/icons/play.svg b/public/icons/play.svg deleted file mode 100644 index 52e5366..0000000 --- a/public/icons/play.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/types/tmdb.ts b/types/tmdb.ts deleted file mode 100644 index 040bb82..0000000 --- a/types/tmdb.ts +++ /dev/null @@ -1,16 +0,0 @@ - -export interface tmdbTitle { - id: number; - title?: string; - name?: string; - backdrop_path?: string | null; - poster_path?: string | null; -} - -//generic type으둜 tmdb응닡 λ°›κΈ° -export interface tmdbListResponse { - page: number; - results: T[]; - total_pages: number; - total_results: number; -} From d5083cf9a603797f73e8e26412c41d0af5bfaf85 Mon Sep 17 00:00:00 2001 From: baekseungsun Date: Thu, 30 Oct 2025 21:19:57 +0900 Subject: [PATCH 14/82] =?UTF-8?q?navbar=20=EA=B0=9C=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/home/page.tsx | 7 ++++++ app/page.tsx | 4 ++++ components/Navbar.tsx | 43 +++++++++++++++++++++++++++++++++++++ public/icons/comingSoon.svg | 3 +++ public/icons/download.svg | 3 +++ public/icons/home.svg | 7 ++++++ public/icons/menu.svg | 3 +++ public/icons/search.svg | 4 ++++ 8 files changed, 74 insertions(+) create mode 100644 app/home/page.tsx create mode 100644 components/Navbar.tsx create mode 100644 public/icons/comingSoon.svg create mode 100644 public/icons/download.svg create mode 100644 public/icons/home.svg create mode 100644 public/icons/menu.svg create mode 100644 public/icons/search.svg diff --git a/app/home/page.tsx b/app/home/page.tsx new file mode 100644 index 0000000..d1bd94f --- /dev/null +++ b/app/home/page.tsx @@ -0,0 +1,7 @@ +export default function SearchPage() { + return ( +
+

EMPTY PAGE

+
+ ); +} \ No newline at end of file diff --git a/app/page.tsx b/app/page.tsx index 2eb483d..5ae06be 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,5 +1,6 @@ import Header from "@/components/Header"; import Banner from "@/components/Banner"; +import Navbar from "@/components/Navbar" export default function Page() { return ( @@ -10,6 +11,9 @@ export default function Page() {
+
+ +
); } diff --git a/components/Navbar.tsx b/components/Navbar.tsx new file mode 100644 index 0000000..aaaa3c7 --- /dev/null +++ b/components/Navbar.tsx @@ -0,0 +1,43 @@ +"use client"; + +import Image from "next/image"; +import Link from "next/link"; +import home from "../public/icons/home.svg"; +import search from "../public/icons/search.svg"; +import comingSoon from "../public/icons/comingSoon.svg"; +import download from "../public/icons/download.svg"; +import menu from "../public/icons/menu.svg"; + + +export default function Navbar() { + + return ( + +
+ + + + search + Search + + + + + + +
+ more + More +
+
+ ); +} diff --git a/public/icons/comingSoon.svg b/public/icons/comingSoon.svg new file mode 100644 index 0000000..80dd1fc --- /dev/null +++ b/public/icons/comingSoon.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/download.svg b/public/icons/download.svg new file mode 100644 index 0000000..789ff1a --- /dev/null +++ b/public/icons/download.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/home.svg b/public/icons/home.svg new file mode 100644 index 0000000..8530ee9 --- /dev/null +++ b/public/icons/home.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/public/icons/menu.svg b/public/icons/menu.svg new file mode 100644 index 0000000..f1677ec --- /dev/null +++ b/public/icons/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/search.svg b/public/icons/search.svg new file mode 100644 index 0000000..fbb70ae --- /dev/null +++ b/public/icons/search.svg @@ -0,0 +1,4 @@ + + + + From 5a6fd53266f4258f0b9186f18e741a19ae9451b5 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Thu, 30 Oct 2025 23:07:27 +0900 Subject: [PATCH 15/82] =?UTF-8?q?feat:=20popular=20on=20netflix=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EA=B0=9C=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/movies/route.ts | 9 ++++++ app/globals.css | 6 ++++ app/home/page.tsx | 3 +- components/ContinueWatching.tsx | 17 +++++------ components/Popular.tsx | 52 ++++++++++++++++++++++++++++++--- components/SectionTitle.tsx | 9 ++++++ libs/tdmbs.ts | 11 ++++++- 7 files changed, 92 insertions(+), 15 deletions(-) create mode 100644 app/api/movies/route.ts create mode 100644 components/SectionTitle.tsx diff --git a/app/api/movies/route.ts b/app/api/movies/route.ts new file mode 100644 index 0000000..487fa43 --- /dev/null +++ b/app/api/movies/route.ts @@ -0,0 +1,9 @@ +import { NextResponse } from "next/server"; + +export async function GET() { + const res = await fetch( + `https://api.themoviedb.org/3/movie/popular?api_key=${process.env.TMDB_API_KEY}` + ); + const data = await res.json(); + return NextResponse.json(data); +} diff --git a/app/globals.css b/app/globals.css index a2dc41e..f41c6cf 100644 --- a/app/globals.css +++ b/app/globals.css @@ -24,3 +24,9 @@ body { color: var(--foreground); font-family: Arial, Helvetica, sans-serif; } +.scrollbar-custom::-webkit-scrollbar { + height: 5px; /* μ„Έλ‘œ/κ°€λ‘œ μŠ€ν¬λ‘€λ°” λ‘κ»˜ */ +} +.scrollbar-custom::-webkit-scrollbar-track { + background-color: #374151; /* νšŒμƒ‰ λ°°κ²½ */ +} diff --git a/app/home/page.tsx b/app/home/page.tsx index 61b7562..7bd2e43 100644 --- a/app/home/page.tsx +++ b/app/home/page.tsx @@ -17,7 +17,8 @@ export default async function Home() {
ν—€λ”μ˜μ—­
-
λ°°λ„ˆ μ˜μ—­
+
λ°°λ„ˆ μ˜μ—­
+ diff --git a/components/ContinueWatching.tsx b/components/ContinueWatching.tsx index 7936e20..025dc78 100644 --- a/components/ContinueWatching.tsx +++ b/components/ContinueWatching.tsx @@ -3,6 +3,7 @@ import { useEffect, useState } from "react"; import { fetchMovieById } from "@/libs/tdmbs"; import Image from "next/image"; +import SectionTitle from "@/components/SectionTitle"; type Movie = { id: number; @@ -26,24 +27,22 @@ export default function ContinueWatching() { }, []); return ( -
-
- Continue Watching for Emenalo -
+
+ -
+
{movies.map((movie) => ( -
+
{movie.title} + {/* μ§„ν–‰λ₯  ν‘œμ‹œ*/}
-
- {/* μ§„ν–‰λ₯  μ˜ˆμ‹œ */} +
))} diff --git a/components/Popular.tsx b/components/Popular.tsx index 775ee88..085b733 100644 --- a/components/Popular.tsx +++ b/components/Popular.tsx @@ -1,8 +1,52 @@ +"use client"; + +import { useEffect, useState } from "react"; +import Image from "next/image"; +import SectionTitle from "@/components/SectionTitle"; +import { fetchPopularMovies } from "@/libs/tdmbs"; + +type Movie = { + id: number; + title: string; + poster_path: string; +}; + export default function Popular() { + const [movies, setMovies] = useState([]); + + useEffect(() => { + const getPopularMovies = async () => { + try { + const movieData = await fetchPopularMovies(); + setMovies(movieData); + } catch (error) { + console.error("Failed to fetch popular movies:", error); + } + }; + + getPopularMovies(); + }, []); + return ( -
- popular on netflix -
이미지 μ˜μ—­
-
+
+ + +
+ {movies.map((movie) => ( +
+ {movie.title} +
+ ))} +
+
); } diff --git a/components/SectionTitle.tsx b/components/SectionTitle.tsx new file mode 100644 index 0000000..2c15a2d --- /dev/null +++ b/components/SectionTitle.tsx @@ -0,0 +1,9 @@ +type Props = { + title: string; +}; + +export default function SectionTitle({ title }: Props) { + return ( +
{title}
+ ); +} diff --git a/libs/tdmbs.ts b/libs/tdmbs.ts index 04003f0..8c9522b 100644 --- a/libs/tdmbs.ts +++ b/libs/tdmbs.ts @@ -1,6 +1,15 @@ const BASE_URL = "https://api.themoviedb.org/3"; const API_KEY = process.env.NEXT_PUBLIC_TMDB_API_KEY; +export type TMDBMovie = { + id: number; + title: string; + poster_path: string | null; + backdrop_path: string | null; + overview: string; + release_date?: string; +}; + export async function fetchPopularMovies(language = "ko-KR", page = 1) { const res = await fetch( `${BASE_URL}/movie/popular?api_key=${API_KEY}&language=${language}&page=${page}`, @@ -13,7 +22,7 @@ export async function fetchPopularMovies(language = "ko-KR", page = 1) { throw new Error("Failed to fetch movies"); } - const data = await res.json(); + const data = await res.json(); //응닡 받은 json μ €μž₯ return data.results; } From 920c260711d7f12ae339012e88da6fa86c01d3ce Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Thu, 30 Oct 2025 23:44:47 +0900 Subject: [PATCH 16/82] =?UTF-8?q?feat:=20Trending=20Now=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EA=B0=9C=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/ContinueWatching.tsx | 35 ++++++++++++--------- components/Popular.tsx | 33 ++++++++++--------- components/TrendingNow.tsx | 56 +++++++++++++++++++++++++++++++-- libs/tdmbs.ts | 24 +++++++++++++- 4 files changed, 115 insertions(+), 33 deletions(-) diff --git a/components/ContinueWatching.tsx b/components/ContinueWatching.tsx index 025dc78..da4a6f3 100644 --- a/components/ContinueWatching.tsx +++ b/components/ContinueWatching.tsx @@ -30,22 +30,27 @@ export default function ContinueWatching() {
-
- {movies.map((movie) => ( -
- {movie.title} - {/* μ§„ν–‰λ₯  ν‘œμ‹œ*/} -
-
+
+ {movies + .filter((movie) => movie.poster_path) + .map((movie) => ( +
+ {movie.title} + {/* μ§„ν–‰λ₯  ν‘œμ‹œ*/} +
+
+
-
- ))} + ))}
); diff --git a/components/Popular.tsx b/components/Popular.tsx index 085b733..43cfd3b 100644 --- a/components/Popular.tsx +++ b/components/Popular.tsx @@ -31,21 +31,24 @@ export default function Popular() {
-
- {movies.map((movie) => ( -
- {movie.title} -
- ))} +
+ {movies + .filter((movie) => movie.poster_path) // null μ•„λ‹Œ κ²ƒλ§Œ + .slice(0, 5) // 5개만 ν‘œμ‹œ + .map((movie) => ( +
+ {movie.title} +
+ ))}
); diff --git a/components/TrendingNow.tsx b/components/TrendingNow.tsx index 12a65cb..0f75628 100644 --- a/components/TrendingNow.tsx +++ b/components/TrendingNow.tsx @@ -1,3 +1,55 @@ -export default function TrandingNow() { - return
TrandingNow νŽ˜μ΄μ§€μž…λ‹ˆλ‹€.
; +"use client"; + +import { useEffect, useState } from "react"; +import Image from "next/image"; +import SectionTitle from "@/components/SectionTitle"; +import { fetchTrendingMovies } from "@/libs/tdmbs"; + +type Movie = { + id: number; + title: string; + poster_path: string; +}; + +export default function TrendingNow() { + const [movies, setMovies] = useState([]); + + useEffect(() => { + const getPopularMovies = async () => { + try { + const movieData = await fetchTrendingMovies(); + setMovies(movieData); + } catch (error) { + console.error("Failed to fetch popular movies:", error); + } + }; + + getPopularMovies(); + }, []); + + return ( +
+ + +
+ {movies + .filter((movie) => movie.poster_path) // null μ•„λ‹Œ κ²ƒλ§Œ + .slice(0, 5) // 5개만 ν‘œμ‹œ + .map((movie) => ( +
+ {movie.title} +
+ ))} +
+
+ ); } diff --git a/libs/tdmbs.ts b/libs/tdmbs.ts index 8c9522b..2992e62 100644 --- a/libs/tdmbs.ts +++ b/libs/tdmbs.ts @@ -10,6 +10,27 @@ export type TMDBMovie = { release_date?: string; }; +//Trending Now λΆ€λΆ„ +export async function fetchTrendingMovies( + timeWindow: "day" | "week" = "week", + language = "ko-KR", + page = 1 +) { + const res = await fetch( + `${BASE_URL}/trending/movie/${timeWindow}?api_key=${API_KEY}&language=${language}&page=${page}`, + { + next: { revalidate: 3600 }, // ISR 캐싱: 1μ‹œκ°„λ§ˆλ‹€ μƒˆλ‘œ 패치 + } + ); + if (!res.ok) { + throw new Error("Failed to fetch movies"); + } + + const data = await res.json(); + return data.results; +} + +//Popular on Netflix λΆ€λΆ„ export async function fetchPopularMovies(language = "ko-KR", page = 1) { const res = await fetch( `${BASE_URL}/movie/popular?api_key=${API_KEY}&language=${language}&page=${page}`, @@ -22,10 +43,11 @@ export async function fetchPopularMovies(language = "ko-KR", page = 1) { throw new Error("Failed to fetch movies"); } - const data = await res.json(); //응닡 받은 json μ €μž₯ + const data = await res.json(); return data.results; } +//μ˜ν™” ν¬μŠ€ν„° κ°€μ Έμ˜€κΈ° export async function fetchMovieById(id: number, language = "ko-KR") { const res = await fetch( `${BASE_URL}/movie/${id}?api_key=${API_KEY}&language=${language}` From e2db329102d6b3f180fe9c41e925297a84582218 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Thu, 30 Oct 2025 23:46:16 +0900 Subject: [PATCH 17/82] =?UTF-8?q?style:=20=ED=99=88=20section=20padding=20?= =?UTF-8?q?=EC=A1=B0=EC=A0=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/Popular.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/Popular.tsx b/components/Popular.tsx index 43cfd3b..d341403 100644 --- a/components/Popular.tsx +++ b/components/Popular.tsx @@ -28,7 +28,7 @@ export default function Popular() { }, []); return ( -
+
From 1aa7bf69620667003359df988ac2565066e8452d Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Thu, 30 Oct 2025 23:53:39 +0900 Subject: [PATCH 18/82] =?UTF-8?q?feat:=20Top=2010=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EA=B0=9C=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/Top10.tsx | 56 ++++++++++++++++++++++++++++++++++++++++++-- libs/tdmbs.ts | 22 ++++++++++++++++- 2 files changed, 75 insertions(+), 3 deletions(-) diff --git a/components/Top10.tsx b/components/Top10.tsx index af9a64b..5df2273 100644 --- a/components/Top10.tsx +++ b/components/Top10.tsx @@ -1,3 +1,55 @@ -export default function Top10() { - return
Top10 νŽ˜μ΄μ§€μž…λ‹ˆλ‹€.
; +"use client"; + +import { useEffect, useState } from "react"; +import Image from "next/image"; +import SectionTitle from "@/components/SectionTitle"; +import { fetchTop10Movies } from "@/libs/tdmbs"; + +type Movie = { + id: number; + title: string; + poster_path: string; +}; + +export default function Popular() { + const [movies, setMovies] = useState([]); + + useEffect(() => { + const getPopularMovies = async () => { + try { + const movieData = await fetchTop10Movies(); + setMovies(movieData); + } catch (error) { + console.error("Failed to fetch popular movies:", error); + } + }; + + getPopularMovies(); + }, []); + + return ( +
+ + +
+ {movies + .filter((movie) => movie.poster_path) // null μ•„λ‹Œ κ²ƒλ§Œ + .slice(0, 10) // 10개 ν‘œμ‹œ! + .map((movie) => ( +
+ {movie.title} +
+ ))} +
+
+ ); } diff --git a/libs/tdmbs.ts b/libs/tdmbs.ts index 2992e62..00e6f96 100644 --- a/libs/tdmbs.ts +++ b/libs/tdmbs.ts @@ -10,9 +10,29 @@ export type TMDBMovie = { release_date?: string; }; +//Top 10 in Nigiria λΆ€λΆ„ +export async function fetchTop10Movies( + region = "NG", //κΈ°μ€€ κ΅­κ°€ μ •ν•  수 있음 + language = "ko-KR", + page = 1 +) { + const res = await fetch( + `${BASE_URL}/movie/top_rated?api_key=${API_KEY}®ion=${region}&language=${language}&page=${page}`, + { + next: { revalidate: 3600 }, // ISR 캐싱: 1μ‹œκ°„λ§ˆλ‹€ μƒˆλ‘œ 패치 + } + ); + if (!res.ok) { + throw new Error("Failed to fetch movies"); + } + + const data = await res.json(); + return data.results; +} + //Trending Now λΆ€λΆ„ export async function fetchTrendingMovies( - timeWindow: "day" | "week" = "week", + timeWindow: "day" | "week" = "week", // day: 24μ‹œκ°„, week: 7일 선택 κ°€λŠ₯ language = "ko-KR", page = 1 ) { From f424c1d69ae908de648dd84aa60e78fdffd6d358 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Thu, 30 Oct 2025 23:59:31 +0900 Subject: [PATCH 19/82] =?UTF-8?q?feat:=20My=20List=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EA=B0=9C=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/MyList.tsx | 52 ++++++++++++++++++++++++++++++++++++++++++- components/Top10.tsx | 2 +- libs/tdmbs.ts | 2 +- 3 files changed, 53 insertions(+), 3 deletions(-) diff --git a/components/MyList.tsx b/components/MyList.tsx index e27c009..b279d2f 100644 --- a/components/MyList.tsx +++ b/components/MyList.tsx @@ -1,3 +1,53 @@ +"use client"; + +import { useEffect, useState } from "react"; +import { fetchMovieById } from "@/libs/tdmbs"; +import Image from "next/image"; +import SectionTitle from "@/components/SectionTitle"; + +type Movie = { + id: number; + title: string; + poster_path: string; +}; + +const MOCK_WATCHING_IDS = [555, 299535, 157, 97, 682]; //μž„μ˜λ‘œ μ§€μ •ν•œ My List μ˜ν™” IDλ“€ + export default function MyList() { - return
MyList νŽ˜μ΄μ§€μž…λ‹ˆλ‹€.
; + const [movies, setMovies] = useState([]); + + useEffect(() => { + async function loadMovies() { + const data = await Promise.all( + MOCK_WATCHING_IDS.map((id) => fetchMovieById(id)) + ); + setMovies(data); + } + loadMovies(); + }, []); + + return ( +
+ + +
+ {movies + .filter((movie) => movie.poster_path) + .map((movie) => ( +
+ {movie.title} +
+ ))} +
+
+ ); } diff --git a/components/Top10.tsx b/components/Top10.tsx index 5df2273..1b9f1e1 100644 --- a/components/Top10.tsx +++ b/components/Top10.tsx @@ -11,7 +11,7 @@ type Movie = { poster_path: string; }; -export default function Popular() { +export default function Top10() { const [movies, setMovies] = useState([]); useEffect(() => { diff --git a/libs/tdmbs.ts b/libs/tdmbs.ts index 00e6f96..4f6924c 100644 --- a/libs/tdmbs.ts +++ b/libs/tdmbs.ts @@ -67,7 +67,7 @@ export async function fetchPopularMovies(language = "ko-KR", page = 1) { return data.results; } -//μ˜ν™” ν¬μŠ€ν„° κ°€μ Έμ˜€κΈ° +//μ˜ν™” ν¬μŠ€ν„° κ°€μ Έμ˜€κΈ° Continue Watching & My List λΆ€λΆ„ export async function fetchMovieById(id: number, language = "ko-KR") { const res = await fetch( `${BASE_URL}/movie/${id}?api_key=${API_KEY}&language=${language}` From 09ca403584b15b1e7ab4241336c39d927a1f68cc Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Fri, 31 Oct 2025 00:41:24 +0900 Subject: [PATCH 20/82] =?UTF-8?q?feat:=20Nollywood=20=EC=BB=B4=ED=8F=AC?= =?UTF-8?q?=EB=84=8C=ED=8A=B8=20=EA=B0=9C=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/AfricanMovies.tsx | 54 +++++++++++++++++++++++++++++++- components/Nollywood.tsx | 54 +++++++++++++++++++++++++++++++- components/Top10.tsx | 4 +-- components/TrendingNow.tsx | 4 +-- libs/tdmbs.ts | 60 +++++++++++++++++++++++++++++++++--- 5 files changed, 166 insertions(+), 10 deletions(-) diff --git a/components/AfricanMovies.tsx b/components/AfricanMovies.tsx index 3fdf2cc..07d482c 100644 --- a/components/AfricanMovies.tsx +++ b/components/AfricanMovies.tsx @@ -1,3 +1,55 @@ +"use client"; + +import { useEffect, useState } from "react"; +import Image from "next/image"; +import SectionTitle from "@/components/SectionTitle"; +import { fetchAfricanMovies } from "@/libs/tdmbs"; + +type Movie = { + id: number; + title: string; + poster_path: string; +}; + export default function AfricanMovies() { - return
AfricanMovies νŽ˜μ΄μ§€μž…λ‹ˆλ‹€.
; + const [movies, setMovies] = useState([]); + + useEffect(() => { + const getAfricanMovies = async () => { + try { + const movieData = await fetchAfricanMovies(); + setMovies(movieData); + } catch (error) { + console.error("Failed to fetch popular movies:", error); + } + }; + + getAfricanMovies(); + }, []); + + return ( +
+ + +
+ {movies + .filter((movie) => movie.poster_path) // null μ•„λ‹Œ κ²ƒλ§Œ + .slice(0, 5) // 5개만 ν‘œμ‹œ + .map((movie) => ( +
+ {movie.title} +
+ ))} +
+
+ ); } diff --git a/components/Nollywood.tsx b/components/Nollywood.tsx index adb5960..83e9ce5 100644 --- a/components/Nollywood.tsx +++ b/components/Nollywood.tsx @@ -1,3 +1,55 @@ +"use client"; + +import { useEffect, useState } from "react"; +import Image from "next/image"; +import SectionTitle from "@/components/SectionTitle"; +import { fetchNollywoodMovies } from "@/libs/tdmbs"; + +type Movie = { + id: number; + title: string; + poster_path: string; +}; + export default function Nollywood() { - return
Nollywood νŽ˜μ΄μ§€μž…λ‹ˆλ‹€.
; + const [movies, setMovies] = useState([]); + + useEffect(() => { + const loadMovies = async () => { + try { + const movieData = await fetchNollywoodMovies(); + setMovies(movieData); + } catch (error) { + console.error("Failed to fetch popular movies:", error); + } + }; + + loadMovies(); + }, []); + + return ( +
+ + +
+ {movies + .filter((movie) => movie.poster_path) // null μ•„λ‹Œ κ²ƒλ§Œ + .slice(0, 5) // 5개만 ν‘œμ‹œ + .map((movie) => ( +
+ {movie.title} +
+ ))} +
+
+ ); } diff --git a/components/Top10.tsx b/components/Top10.tsx index 1b9f1e1..6a83f9d 100644 --- a/components/Top10.tsx +++ b/components/Top10.tsx @@ -15,7 +15,7 @@ export default function Top10() { const [movies, setMovies] = useState([]); useEffect(() => { - const getPopularMovies = async () => { + const loadMovies = async () => { try { const movieData = await fetchTop10Movies(); setMovies(movieData); @@ -24,7 +24,7 @@ export default function Top10() { } }; - getPopularMovies(); + loadMovies(); }, []); return ( diff --git a/components/TrendingNow.tsx b/components/TrendingNow.tsx index 0f75628..8b48514 100644 --- a/components/TrendingNow.tsx +++ b/components/TrendingNow.tsx @@ -15,7 +15,7 @@ export default function TrendingNow() { const [movies, setMovies] = useState([]); useEffect(() => { - const getPopularMovies = async () => { + const loadMovies = async () => { try { const movieData = await fetchTrendingMovies(); setMovies(movieData); @@ -24,7 +24,7 @@ export default function TrendingNow() { } }; - getPopularMovies(); + loadMovies(); }, []); return ( diff --git a/libs/tdmbs.ts b/libs/tdmbs.ts index 4f6924c..3b6ccd7 100644 --- a/libs/tdmbs.ts +++ b/libs/tdmbs.ts @@ -10,10 +10,62 @@ export type TMDBMovie = { release_date?: string; }; +//Nollywood Movies & TV λΆ€λΆ„ +export async function fetchNollywoodMovies( + region = "NG", + language = "en-US", + page = 1 +) { + //λ‚˜μ΄μ§€λ¦¬μ•„ μ˜ν™” API 호좜 + const moviesRes = await fetch( + `${BASE_URL}/discover/movie?api_key=${API_KEY}&with_origin_country=${region}&language=${language}&sort_by=popularity.desc&page=${page}`, + { + next: { revalidate: 3600 }, // ISR 캐싱: 1μ‹œκ°„λ§ˆλ‹€ μƒˆλ‘œ 패치 + } + ); + const moviesData = await moviesRes.json(); + const movies = moviesData.results.slice(0, 5); // μƒμœ„ 5개 + + //λ‚˜μ΄μ§€λ¦¬μ•„ tv μ‡Ό API 호좜 + const tvRes = await fetch( + `${BASE_URL}/discover/tv?api_key=${API_KEY}&with_origin_country=${region}&language=${language}&sort_by=popularity.desc&page=${page}`, + { + next: { revalidate: 3600 }, // ISR 캐싱: 1μ‹œκ°„λ§ˆλ‹€ μƒˆλ‘œ 패치 + } + ); + const tvShowData = await tvRes.json(); + const tvShows = tvShowData.results.slice(0, 5); // μƒμœ„ 5개 + + const combined = [...movies, ...tvShows]; + return combined; +} + +//African Movies λΆ€λΆ„ +//with_origin_country=NG β†’ κ·Έ λ‚˜λΌμ—μ„œ μƒμ˜ 쀑인 μ˜ν™”κ°€ μ•„λ‹Œ μ§„μ§œ λ‚˜μ΄μ§€λ¦¬μ•„ μ˜ν™”/TV 선택 +export async function fetchAfricanMovies( + region = "ZA", + language = "en-US", + page = 1 +) { + const res = await fetch( + `${BASE_URL}/movie/popular?api_key=${API_KEY}&with_origin_country=${region}&language=${language}&page=${page}`, + { + next: { revalidate: 3600 }, // ISR 캐싱: 1μ‹œκ°„λ§ˆλ‹€ μƒˆλ‘œ 패치 + } + ); + + if (!res.ok) { + throw new Error("Failed to fetch movies"); + } + + const data = await res.json(); + return data.results; +} + //Top 10 in Nigiria λΆ€λΆ„ export async function fetchTop10Movies( region = "NG", //κΈ°μ€€ κ΅­κ°€ μ •ν•  수 있음 - language = "ko-KR", + language = "en-US", page = 1 ) { const res = await fetch( @@ -33,7 +85,7 @@ export async function fetchTop10Movies( //Trending Now λΆ€λΆ„ export async function fetchTrendingMovies( timeWindow: "day" | "week" = "week", // day: 24μ‹œκ°„, week: 7일 선택 κ°€λŠ₯ - language = "ko-KR", + language = "en-US", page = 1 ) { const res = await fetch( @@ -51,7 +103,7 @@ export async function fetchTrendingMovies( } //Popular on Netflix λΆ€λΆ„ -export async function fetchPopularMovies(language = "ko-KR", page = 1) { +export async function fetchPopularMovies(language = "en-US", page = 1) { const res = await fetch( `${BASE_URL}/movie/popular?api_key=${API_KEY}&language=${language}&page=${page}`, { @@ -68,7 +120,7 @@ export async function fetchPopularMovies(language = "ko-KR", page = 1) { } //μ˜ν™” ν¬μŠ€ν„° κ°€μ Έμ˜€κΈ° Continue Watching & My List λΆ€λΆ„ -export async function fetchMovieById(id: number, language = "ko-KR") { +export async function fetchMovieById(id: number, language = "en-US") { const res = await fetch( `${BASE_URL}/movie/${id}?api_key=${API_KEY}&language=${language}` ); From 94b4ba6f55eaa56900d019fb1e7f0182b23c562d Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Fri, 31 Oct 2025 01:04:25 +0900 Subject: [PATCH 21/82] =?UTF-8?q?feat:=20Netflix=20originals=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EA=B0=9C=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/api/movies/route.ts | 9 ------ components/NetflixOriginals.tsx | 54 ++++++++++++++++++++++++++++++++- libs/tdmbs.ts | 36 ++++++++++++++++++++-- 3 files changed, 87 insertions(+), 12 deletions(-) delete mode 100644 app/api/movies/route.ts diff --git a/app/api/movies/route.ts b/app/api/movies/route.ts deleted file mode 100644 index 487fa43..0000000 --- a/app/api/movies/route.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { NextResponse } from "next/server"; - -export async function GET() { - const res = await fetch( - `https://api.themoviedb.org/3/movie/popular?api_key=${process.env.TMDB_API_KEY}` - ); - const data = await res.json(); - return NextResponse.json(data); -} diff --git a/components/NetflixOriginals.tsx b/components/NetflixOriginals.tsx index 405e7aa..873d051 100644 --- a/components/NetflixOriginals.tsx +++ b/components/NetflixOriginals.tsx @@ -1,3 +1,55 @@ +"use client"; + +import { useEffect, useState } from "react"; +import Image from "next/image"; +import SectionTitle from "@/components/SectionTitle"; +import { fetchNetflixOriginals, fetchNollywoodMovies } from "@/libs/tdmbs"; + +type Movie = { + id: number; + title: string; + poster_path: string; +}; + export default function NetflixOriginals() { - return
NetflixOriginals νŽ˜μ΄μ§€μž…λ‹ˆλ‹€.
; + const [movies, setMovies] = useState([]); + + useEffect(() => { + const loadMovies = async () => { + try { + const movieData = await fetchNetflixOriginals(); + setMovies(movieData); + } catch (error) { + console.error("Failed to fetch popular movies:", error); + } + }; + + loadMovies(); + }, []); + + return ( +
+ + +
+ {movies + .filter((movie) => movie.poster_path) // null μ•„λ‹Œ κ²ƒλ§Œ + .slice(0, 5) // 5개만 ν‘œμ‹œ + .map((movie) => ( +
+ {movie.title} +
+ ))} +
+
+ ); } diff --git a/libs/tdmbs.ts b/libs/tdmbs.ts index 3b6ccd7..33bb6b4 100644 --- a/libs/tdmbs.ts +++ b/libs/tdmbs.ts @@ -10,6 +10,38 @@ export type TMDBMovie = { release_date?: string; }; +//Netflix Originals λΆ€λΆ„ +export async function fetchNetflixOriginals( + language = "en-US", + page = 1, + netflixID = 213, + with_watch_providers = 8, + watch_region = "US" +) { + //netflix originals μ˜ν™” API 호좜 + const moviesRes = await fetch( + `${BASE_URL}/discover/movie?api_key=${API_KEY}&language=${language}&with_watch_providers=${with_watch_providers}&watch_region=${watch_region}&sort_by=popularity.desc&page=${page}`, + { + next: { revalidate: 3600 }, // ISR 캐싱: 1μ‹œκ°„λ§ˆλ‹€ μƒˆλ‘œ 패치 + } + ); + const moviesData = await moviesRes.json(); + const movies = moviesData.results.slice(0, 5) || []; // μƒμœ„ 5개 + + //netflix originals tv μ‡Ό API 호좜 + const tvRes = await fetch( + `${BASE_URL}/discover/tv?api_key=${API_KEY}&language=${language}&with_networks=${netflixID}&sort_by=popularity.desc&page=${page}`, + { + next: { revalidate: 3600 }, // ISR 캐싱: 1μ‹œκ°„λ§ˆλ‹€ μƒˆλ‘œ 패치 + } + ); + const tvShowData = await tvRes.json(); + const tvShows = tvShowData.results.slice(0, 5) || []; // μƒμœ„ 5개 + + const combined = [...movies, ...tvShows]; + return combined; +} + //Nollywood Movies & TV λΆ€λΆ„ export async function fetchNollywoodMovies( region = "NG", @@ -24,7 +56,7 @@ export async function fetchNollywoodMovies( } ); const moviesData = await moviesRes.json(); - const movies = moviesData.results.slice(0, 5); // μƒμœ„ 5개 + const movies = moviesData.results.slice(0, 5) || []; // μƒμœ„ 5개 //λ‚˜μ΄μ§€λ¦¬μ•„ tv μ‡Ό API 호좜 const tvRes = await fetch( @@ -34,7 +66,7 @@ export async function fetchNollywoodMovies( } ); const tvShowData = await tvRes.json(); - const tvShows = tvShowData.results.slice(0, 5); // μƒμœ„ 5개 + const tvShows = tvShowData.results.slice(0, 5) || []; // μƒμœ„ 5개 const combined = [...movies, ...tvShows]; return combined; From 6841897dcb3c327adbba2c6be3d9a156b3b1ef87 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Fri, 31 Oct 2025 01:14:45 +0900 Subject: [PATCH 22/82] =?UTF-8?q?feat:=20New=20Releases=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EA=B0=9C=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/NetflixOriginals.tsx | 4 +-- components/NewReleases.tsx | 54 ++++++++++++++++++++++++++++++++- libs/tdmbs.ts | 19 ++++++++++++ 3 files changed, 74 insertions(+), 3 deletions(-) diff --git a/components/NetflixOriginals.tsx b/components/NetflixOriginals.tsx index 873d051..db8c90e 100644 --- a/components/NetflixOriginals.tsx +++ b/components/NetflixOriginals.tsx @@ -3,7 +3,7 @@ import { useEffect, useState } from "react"; import Image from "next/image"; import SectionTitle from "@/components/SectionTitle"; -import { fetchNetflixOriginals, fetchNollywoodMovies } from "@/libs/tdmbs"; +import { fetchNetflixOriginals } from "@/libs/tdmbs"; type Movie = { id: number; @@ -28,7 +28,7 @@ export default function NetflixOriginals() { }, []); return ( -
+
diff --git a/components/NewReleases.tsx b/components/NewReleases.tsx index 79a48d5..b885695 100644 --- a/components/NewReleases.tsx +++ b/components/NewReleases.tsx @@ -1,3 +1,55 @@ +"use client"; + +import { useEffect, useState } from "react"; +import Image from "next/image"; +import SectionTitle from "@/components/SectionTitle"; +import { fetchNewReleases } from "@/libs/tdmbs"; + +type Movie = { + id: number; + title: string; + poster_path: string; +}; + export default function NewReleases() { - return
NewReleases μ»΄ν¬λ„ŒνŠΈμž…λ‹ˆλ‹€.
; + const [movies, setMovies] = useState([]); + + useEffect(() => { + const loadMovies = async () => { + try { + const movieData = await fetchNewReleases(); + setMovies(movieData); + } catch (error) { + console.error("Failed to fetch popular movies:", error); + } + }; + + loadMovies(); + }, []); + + return ( +
+ + +
+ {movies + .filter((movie) => movie.poster_path) // null μ•„λ‹Œ κ²ƒλ§Œ + .slice(0, 5) // 5개만 ν‘œμ‹œ + .map((movie) => ( +
+ {movie.title} +
+ ))} +
+
+ ); } diff --git a/libs/tdmbs.ts b/libs/tdmbs.ts index 33bb6b4..79d3b81 100644 --- a/libs/tdmbs.ts +++ b/libs/tdmbs.ts @@ -10,6 +10,25 @@ export type TMDBMovie = { release_date?: string; }; +//New Releases λΆ€λΆ„ +export async function fetchNewReleases( + language = "en-US", + page = 1, + region = "US" +) { + const res = await fetch( + `${BASE_URL}/movie/now_playing?api_key=${API_KEY}&language=${language}&page=${page}®ion=${region}`, + { + next: { revalidate: 3600 }, // ISR 캐싱: 1μ‹œκ°„λ§ˆλ‹€ μƒˆλ‘œ 패치 + } + ); + if (!res.ok) { + throw new Error("Failed to fetch movies"); + } + const data = await res.json(); + return data.results; +} + //Netflix Originals λΆ€λΆ„ export async function fetchNetflixOriginals( language = "en-US", From 65b9b1fa45e2872ad8a223b71e56b37c125f2f8d Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Fri, 31 Oct 2025 01:40:50 +0900 Subject: [PATCH 23/82] =?UTF-8?q?feat:=20Tv=20Thriller=20Mysteris=20?= =?UTF-8?q?=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EA=B0=9C=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/TvThrillerMysteries.tsx | 56 ++++++++++++++++++++++++++++-- libs/tdmbs.ts | 17 +++++++++ 2 files changed, 71 insertions(+), 2 deletions(-) diff --git a/components/TvThrillerMysteries.tsx b/components/TvThrillerMysteries.tsx index 72ac5c5..3b81705 100644 --- a/components/TvThrillerMysteries.tsx +++ b/components/TvThrillerMysteries.tsx @@ -1,3 +1,55 @@ -export default function ThrillerMysteries() { - return
ThrillerMysteries μ»΄ν¬λ„ŒνŠΈμž…λ‹ˆλ‹€.
; +"use client"; + +import { useEffect, useState } from "react"; +import Image from "next/image"; +import SectionTitle from "@/components/SectionTitle"; +import { fetchThrillerMysteryMovies } from "@/libs/tdmbs"; + +type Tv = { + id: number; + name: string; + poster_path: string; +}; + +export default function TvThrillerMysteries() { + const [movies, setMovies] = useState([]); + + useEffect(() => { + const loadMovies = async () => { + try { + const movieData = await fetchThrillerMysteryMovies(); + setMovies(movieData); + } catch (error) { + console.error("Failed to fetch popular movies:", error); + } + }; + + loadMovies(); + }, []); + + return ( +
+ + +
+ {movies + .filter((movie) => movie.poster_path) // null μ•„λ‹Œ κ²ƒλ§Œ + .slice(0, 5) // 5개만 ν‘œμ‹œ + .map((movie) => ( +
+ {movie.name} +
+ ))} +
+
+ ); } diff --git a/libs/tdmbs.ts b/libs/tdmbs.ts index 79d3b81..b9f5b2e 100644 --- a/libs/tdmbs.ts +++ b/libs/tdmbs.ts @@ -10,6 +10,23 @@ export type TMDBMovie = { release_date?: string; }; +//TV Thriller Mysteries λΆ€λΆ„ +//Tv μž₯λ₯΄μ—λŠ” Thriller μž₯λ₯΄ μ½”λ“œκ°€ μ—†μŒ +//Mystery μž₯λ₯΄μ½”λ“œμΈ 9648만 μ‚¬μš© +export async function fetchThrillerMysteryMovies( + language = "en-US", + page = 1, + with_genres = "9648" +) { + const res = await fetch( + `${BASE_URL}/discover/tv?api_key=${API_KEY}&language=${language}&with_genres=${with_genres}&sort_by=popularity.desc&page=${page}`, + { next: { revalidate: 3600 } } + ); + const data = await res.json(); + const tvShows = data.results.slice(0, 5); // μƒμœ„ 5개 + console.log("Fetched Thriller Mystery TV Shows:", tvShows); + return tvShows; +} //New Releases λΆ€λΆ„ export async function fetchNewReleases( language = "en-US", From 22e2c060970f306b34eccc31ec52603fc53219e7 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Fri, 31 Oct 2025 01:41:46 +0900 Subject: [PATCH 24/82] =?UTF-8?q?fix:=20Tv=20Thriller=20&=20Mysteries=20?= =?UTF-8?q?=EC=98=A4=ED=83=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/TvThrillerMysteries.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/TvThrillerMysteries.tsx b/components/TvThrillerMysteries.tsx index 3b81705..1575573 100644 --- a/components/TvThrillerMysteries.tsx +++ b/components/TvThrillerMysteries.tsx @@ -29,7 +29,7 @@ export default function TvThrillerMysteries() { return (
- +
{movies From e7a90af707f2e755b03b29cd41b71d5609ebf1bf Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Fri, 31 Oct 2025 01:54:18 +0900 Subject: [PATCH 25/82] =?UTF-8?q?feat:=20US=20TV=20shows=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EA=B0=9C=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/NewReleases.tsx | 2 +- components/TvThrillerMysteries.tsx | 6 ++-- components/USTvShow.tsx | 54 +++++++++++++++++++++++++++++- libs/tdmbs.ts | 16 ++++++++- 4 files changed, 72 insertions(+), 6 deletions(-) diff --git a/components/NewReleases.tsx b/components/NewReleases.tsx index b885695..02dfcaa 100644 --- a/components/NewReleases.tsx +++ b/components/NewReleases.tsx @@ -28,7 +28,7 @@ export default function NewReleases() { }, []); return ( -
+
diff --git a/components/TvThrillerMysteries.tsx b/components/TvThrillerMysteries.tsx index 1575573..f2b1927 100644 --- a/components/TvThrillerMysteries.tsx +++ b/components/TvThrillerMysteries.tsx @@ -7,7 +7,7 @@ import { fetchThrillerMysteryMovies } from "@/libs/tdmbs"; type Tv = { id: number; - name: string; + name: string; //title μ•„λ‹˜ poster_path: string; }; @@ -28,7 +28,7 @@ export default function TvThrillerMysteries() { }, []); return ( -
+
@@ -38,7 +38,7 @@ export default function TvThrillerMysteries() { .map((movie) => (
UsTvShow μ»΄ν¬λ„ŒνŠΈμž…λ‹ˆλ‹€.
; + const [movies, setMovies] = useState([]); + + useEffect(() => { + const loadMovies = async () => { + try { + const movieData = await fetchUSTVShows(); + setMovies(movieData); + } catch (error) { + console.error("Failed to fetch popular movies:", error); + } + }; + + loadMovies(); + }, []); + + return ( +
+ + +
+ {movies + .filter((movie) => movie.poster_path) // null μ•„λ‹Œ κ²ƒλ§Œ + .slice(0, 5) // 5개만 ν‘œμ‹œ + .map((movie) => ( +
+ {movie.name} +
+ ))} +
+
+ ); } diff --git a/libs/tdmbs.ts b/libs/tdmbs.ts index b9f5b2e..c1269dd 100644 --- a/libs/tdmbs.ts +++ b/libs/tdmbs.ts @@ -1,6 +1,7 @@ const BASE_URL = "https://api.themoviedb.org/3"; const API_KEY = process.env.NEXT_PUBLIC_TMDB_API_KEY; +//TMDBMovie νƒ€μž… μ •μ˜ μΆ”ν›„ μ‚¬μš©μ„ μœ„ν•΄ export export type TMDBMovie = { id: number; title: string; @@ -10,6 +11,20 @@ export type TMDBMovie = { release_date?: string; }; +//US tv shows λΆ€λΆ„ +export async function fetchUSTVShows( + language = "en-US", + with_origin_country = "US", + page = 1 +) { + const res = await fetch( + `${BASE_URL}/discover/tv?api_key=${API_KEY}&language=${language}&sort_by=popularity.desc&with_origin_country=${with_origin_country}&page=${page}`, + { next: { revalidate: 3600 } } + ); + const data = await res.json(); + return data.results; +} + //TV Thriller Mysteries λΆ€λΆ„ //Tv μž₯λ₯΄μ—λŠ” Thriller μž₯λ₯΄ μ½”λ“œκ°€ μ—†μŒ //Mystery μž₯λ₯΄μ½”λ“œμΈ 9648만 μ‚¬μš© @@ -24,7 +39,6 @@ export async function fetchThrillerMysteryMovies( ); const data = await res.json(); const tvShows = data.results.slice(0, 5); // μƒμœ„ 5개 - console.log("Fetched Thriller Mystery TV Shows:", tvShows); return tvShows; } //New Releases λΆ€λΆ„ From 279c5fc7fde8c632bbb719f43eeea07e6e37862e Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Fri, 31 Oct 2025 02:22:18 +0900 Subject: [PATCH 26/82] =?UTF-8?q?feat:=20Watch=20It=20Again=20=EC=BB=B4?= =?UTF-8?q?=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EA=B0=9C=EB=B0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/ContinueWatching.tsx | 6 ++-- components/WatchItAgain.tsx | 51 ++++++++++++++++++++++++++++++++- data/watchHistory.ts | 35 ++++++++++++++++++++++ libs/tdmbs.ts | 9 ++++++ 4 files changed, 98 insertions(+), 3 deletions(-) create mode 100644 data/watchHistory.ts diff --git a/components/ContinueWatching.tsx b/components/ContinueWatching.tsx index da4a6f3..16ba425 100644 --- a/components/ContinueWatching.tsx +++ b/components/ContinueWatching.tsx @@ -4,13 +4,15 @@ import { useEffect, useState } from "react"; import { fetchMovieById } from "@/libs/tdmbs"; import Image from "next/image"; import SectionTitle from "@/components/SectionTitle"; +import { watchHistory } from "@/data/watchHistory"; type Movie = { id: number; title: string; poster_path: string; }; - +// μ‚¬μš©μž 이름 κ°€μ Έμ˜€κΈ° (더미 데이터 κΈ°μ€€) +const userName = watchHistory[0]?.userName || "User"; const MOCK_WATCHING_IDS = [550, 299534, 155, 597, 681]; export default function ContinueWatching() { @@ -28,7 +30,7 @@ export default function ContinueWatching() { return (
- +
{movies diff --git a/components/WatchItAgain.tsx b/components/WatchItAgain.tsx index c439eba..ceaaf23 100644 --- a/components/WatchItAgain.tsx +++ b/components/WatchItAgain.tsx @@ -1,3 +1,52 @@ +"use client"; + +import { useEffect, useState } from "react"; +import { fetchMovieById } from "@/libs/tdmbs"; +import Image from "next/image"; +import SectionTitle from "@/components/SectionTitle"; +import { watchHistory } from "@/data/watchHistory"; + +type Movie = { + id: number; + title: string; + poster_path: string; +}; + export default function WatchItAgain() { - return
WatchItAgain μ»΄ν¬λ„ŒνŠΈμž…λ‹ˆλ‹€.
; + const [movies, setMovies] = useState([]); + + useEffect(() => { + async function loadMovies() { + const data = await Promise.all( + watchHistory.map((item) => fetchMovieById(item.contentId)) + ); + setMovies(data); + } + loadMovies(); + }, []); + + return ( +
+ + +
+ {movies + .filter((movie) => movie.poster_path) + .map((movie) => ( +
+ {movie.title} +
+ ))} +
+
+ ); } diff --git a/data/watchHistory.ts b/data/watchHistory.ts new file mode 100644 index 0000000..8f4e92d --- /dev/null +++ b/data/watchHistory.ts @@ -0,0 +1,35 @@ +export type WatchHistoryItem = { + id: number; // 더미 데이터 고유 ID + userName: string; // μ‚¬μš©μž 이름 + contentId: number; // TMDB id + title: string; // μ˜ν™”/TV 제λͺ© + type: "movie" | "tv"; // ꡬ뢄 + watchedAt: string; // μ‹œμ²­ λ‚ μ§œ (ISO λ¬Έμžμ—΄) +}; + +export const watchHistory: WatchHistoryItem[] = [ + { + id: 1, + userName: "μ„±μ•„ μ‘°", + contentId: 552, + title: "Fight Club", + type: "movie", + watchedAt: "2025-10-31T14:23:00Z", + }, + { + id: 2, + userName: "μ„±μ•„ μ‘°", + contentId: 598, + title: "Game of Thrones", + type: "movie", + watchedAt: "2025-10-30T20:45:00Z", + }, + { + id: 3, + userName: "μ„±μ•„ μ‘°", + contentId: 680, + title: "The Shawshank Redemption", + type: "movie", + watchedAt: "2025-10-29T19:10:00Z", + }, +]; diff --git a/libs/tdmbs.ts b/libs/tdmbs.ts index c1269dd..a221a8e 100644 --- a/libs/tdmbs.ts +++ b/libs/tdmbs.ts @@ -209,3 +209,12 @@ export async function fetchMovieById(id: number, language = "en-US") { if (!res.ok) throw new Error("Failed to fetch movie details"); return res.json(); } + +//tv ν¬μŠ€ν„° κ°€μ Έμ˜€κΈ° +export async function fetchTvById(id: number, language = "en-US") { + const res = await fetch( + `${BASE_URL}/tv/${id}?api_key=${API_KEY}&language=${language}` + ); + if (!res.ok) throw new Error("Failed to fetch movie details"); + return res.json(); +} From 8e2c8cafae00c1ec8260849bc57ba86174aec296 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=EC=84=B1=EC=95=84?= <170587664+sungahChooo@users.noreply.github.com> Date: Fri, 31 Oct 2025 11:42:31 +0900 Subject: [PATCH 27/82] Update issue templates --- ...35\264\354\212\210-\355\205\234\355\224\214\353\246\277.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/.github/ISSUE_TEMPLATE/\354\273\244\354\212\244\355\205\200-\354\235\264\354\212\210-\355\205\234\355\224\214\353\246\277.md" "b/.github/ISSUE_TEMPLATE/\354\273\244\354\212\244\355\205\200-\354\235\264\354\212\210-\355\205\234\355\224\214\353\246\277.md" index 3afcadd..9bf9804 100644 --- "a/.github/ISSUE_TEMPLATE/\354\273\244\354\212\244\355\205\200-\354\235\264\354\212\210-\355\205\234\355\224\214\353\246\277.md" +++ "b/.github/ISSUE_TEMPLATE/\354\273\244\354\212\244\355\205\200-\354\235\264\354\212\210-\355\205\234\355\224\214\353\246\277.md" @@ -1,7 +1,8 @@ --- name: μ»€μŠ€ν…€ 이슈 ν…œν”Œλ¦Ώ about: ν•΄λ‹Ή 이슈 생성 ν…œν”Œλ¦Ώμ„ μ‚¬μš©ν•˜μ—¬ 이슈λ₯Ό μƒμ„±ν•΄μ£Όμ„Έμš”. -title: "[♻️ refactor /✨ feat /\U0001F41B bug /\U0001F527 fix] 이슈 제λͺ©" +title: "[♻️ refactor /✨ feat /\U0001F41B bug /\U0001F527 fix / \U0001F9F9chore ] 이슈 + 제λͺ©" labels: '' assignees: '' From cdd5525560f5e7cc9c82db78e0786d405583f3a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=EC=84=B1=EC=95=84?= <170587664+sungahChooo@users.noreply.github.com> Date: Fri, 31 Oct 2025 11:57:39 +0900 Subject: [PATCH 28/82] Update PULL_REQUEST_TEMPLATE.md --- .github/PULL_REQUEST_TEMPLATE.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index bedfb13..c091f9a 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,6 +1,9 @@ ## #οΈβƒ£μ—°κ΄€λœ 이슈 > ex) #이슈번호, #이슈번호 +## μž‘μ—… 브랜치λͺ… +> ex)feat/home + ## πŸ“μž‘μ—… λ‚΄μš© > 이번 PRμ—μ„œ μž‘μ—…ν•œ λ‚΄μš©μ„ κ°„λž΅νžˆ μ„€λͺ…ν•΄μ£Όμ„Έμš”(이미지 첨뢀 κ°€λŠ₯) From d1cc53bfc75e0a198f1f3a6b8eb580b42ce9b038 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Fri, 31 Oct 2025 14:21:53 +0900 Subject: [PATCH 29/82] =?UTF-8?q?refactor:=20type=EA=B3=BC=20fetch?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- libs/tdmbs.ts | 10 ---------- libs/type/tdmbs.ts | 17 +++++++++++++++++ 2 files changed, 17 insertions(+), 10 deletions(-) create mode 100644 libs/type/tdmbs.ts diff --git a/libs/tdmbs.ts b/libs/tdmbs.ts index a221a8e..bd2a994 100644 --- a/libs/tdmbs.ts +++ b/libs/tdmbs.ts @@ -1,16 +1,6 @@ const BASE_URL = "https://api.themoviedb.org/3"; const API_KEY = process.env.NEXT_PUBLIC_TMDB_API_KEY; -//TMDBMovie νƒ€μž… μ •μ˜ μΆ”ν›„ μ‚¬μš©μ„ μœ„ν•΄ export -export type TMDBMovie = { - id: number; - title: string; - poster_path: string | null; - backdrop_path: string | null; - overview: string; - release_date?: string; -}; - //US tv shows λΆ€λΆ„ export async function fetchUSTVShows( language = "en-US", diff --git a/libs/type/tdmbs.ts b/libs/type/tdmbs.ts new file mode 100644 index 0000000..6dbefcb --- /dev/null +++ b/libs/type/tdmbs.ts @@ -0,0 +1,17 @@ +export type TMDBMovie = { + id: number; + title: string; + poster_path: string | null; + backdrop_path: string | null; + overview: string; + release_date?: string; +}; + +export type TMDBTVShow = { + id: number; + name: string; + poster_path: string | null; + backdrop_path: string | null; + overview: string; + first_air_date?: string; +}; From 6a738f3e971c378157fabe3ee9d1e5cea93a6a79 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Fri, 31 Oct 2025 16:27:36 +0900 Subject: [PATCH 30/82] =?UTF-8?q?reafact:=20fetch=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/AfricanMovies.tsx | 2 +- components/ContinueWatching.tsx | 2 +- components/MyList.tsx | 2 +- components/NetflixOriginals.tsx | 2 +- components/NewReleases.tsx | 2 +- components/Nollywood.tsx | 2 +- components/Popular.tsx | 2 +- components/Top10.tsx | 2 +- components/TrendingNow.tsx | 2 +- components/TvThrillerMysteries.tsx | 2 +- components/USTvShow.tsx | 2 +- components/WatchItAgain.tsx | 2 +- lib/api/tdmb/movie.ts | 31 +++++++++++++++++++++++++++ lib/api/tdmb/tv.ts | 27 +++++++++++++++++++++++ {libs/type => lib/api/types}/tdmbs.ts | 9 +++++++- lib/constants/tdmbs.ts | 3 +++ {libs => lib}/tdmbs.ts | 0 17 files changed, 81 insertions(+), 13 deletions(-) create mode 100644 lib/api/tdmb/movie.ts create mode 100644 lib/api/tdmb/tv.ts rename {libs/type => lib/api/types}/tdmbs.ts (67%) create mode 100644 lib/constants/tdmbs.ts rename {libs => lib}/tdmbs.ts (100%) diff --git a/components/AfricanMovies.tsx b/components/AfricanMovies.tsx index 07d482c..f68344f 100644 --- a/components/AfricanMovies.tsx +++ b/components/AfricanMovies.tsx @@ -3,7 +3,7 @@ import { useEffect, useState } from "react"; import Image from "next/image"; import SectionTitle from "@/components/SectionTitle"; -import { fetchAfricanMovies } from "@/libs/tdmbs"; +import { fetchAfricanMovies } from "@/lib/tdmbs"; type Movie = { id: number; diff --git a/components/ContinueWatching.tsx b/components/ContinueWatching.tsx index 16ba425..2ec4221 100644 --- a/components/ContinueWatching.tsx +++ b/components/ContinueWatching.tsx @@ -1,7 +1,7 @@ "use client"; import { useEffect, useState } from "react"; -import { fetchMovieById } from "@/libs/tdmbs"; +import { fetchMovieById } from "@/lib/tdmbs"; import Image from "next/image"; import SectionTitle from "@/components/SectionTitle"; import { watchHistory } from "@/data/watchHistory"; diff --git a/components/MyList.tsx b/components/MyList.tsx index b279d2f..0b35694 100644 --- a/components/MyList.tsx +++ b/components/MyList.tsx @@ -1,7 +1,7 @@ "use client"; import { useEffect, useState } from "react"; -import { fetchMovieById } from "@/libs/tdmbs"; +import { fetchMovieById } from "@/lib/tdmbs"; import Image from "next/image"; import SectionTitle from "@/components/SectionTitle"; diff --git a/components/NetflixOriginals.tsx b/components/NetflixOriginals.tsx index db8c90e..24f3127 100644 --- a/components/NetflixOriginals.tsx +++ b/components/NetflixOriginals.tsx @@ -3,7 +3,7 @@ import { useEffect, useState } from "react"; import Image from "next/image"; import SectionTitle from "@/components/SectionTitle"; -import { fetchNetflixOriginals } from "@/libs/tdmbs"; +import { fetchNetflixOriginals } from "@/lib/tdmbs"; type Movie = { id: number; diff --git a/components/NewReleases.tsx b/components/NewReleases.tsx index 02dfcaa..a98f37a 100644 --- a/components/NewReleases.tsx +++ b/components/NewReleases.tsx @@ -3,7 +3,7 @@ import { useEffect, useState } from "react"; import Image from "next/image"; import SectionTitle from "@/components/SectionTitle"; -import { fetchNewReleases } from "@/libs/tdmbs"; +import { fetchNewReleases } from "@/lib/tdmbs"; type Movie = { id: number; diff --git a/components/Nollywood.tsx b/components/Nollywood.tsx index 83e9ce5..f1ce612 100644 --- a/components/Nollywood.tsx +++ b/components/Nollywood.tsx @@ -3,7 +3,7 @@ import { useEffect, useState } from "react"; import Image from "next/image"; import SectionTitle from "@/components/SectionTitle"; -import { fetchNollywoodMovies } from "@/libs/tdmbs"; +import { fetchNollywoodMovies } from "@/lib/tdmbs"; type Movie = { id: number; diff --git a/components/Popular.tsx b/components/Popular.tsx index d341403..d3a6b12 100644 --- a/components/Popular.tsx +++ b/components/Popular.tsx @@ -3,7 +3,7 @@ import { useEffect, useState } from "react"; import Image from "next/image"; import SectionTitle from "@/components/SectionTitle"; -import { fetchPopularMovies } from "@/libs/tdmbs"; +import { fetchPopularMovies } from "@/lib/tdmbs"; type Movie = { id: number; diff --git a/components/Top10.tsx b/components/Top10.tsx index 6a83f9d..a36e93a 100644 --- a/components/Top10.tsx +++ b/components/Top10.tsx @@ -3,7 +3,7 @@ import { useEffect, useState } from "react"; import Image from "next/image"; import SectionTitle from "@/components/SectionTitle"; -import { fetchTop10Movies } from "@/libs/tdmbs"; +import { fetchTop10Movies } from "@/lib/tdmbs"; type Movie = { id: number; diff --git a/components/TrendingNow.tsx b/components/TrendingNow.tsx index 8b48514..3eaa6b6 100644 --- a/components/TrendingNow.tsx +++ b/components/TrendingNow.tsx @@ -3,7 +3,7 @@ import { useEffect, useState } from "react"; import Image from "next/image"; import SectionTitle from "@/components/SectionTitle"; -import { fetchTrendingMovies } from "@/libs/tdmbs"; +import { fetchTrendingMovies } from "@/lib/tdmbs"; type Movie = { id: number; diff --git a/components/TvThrillerMysteries.tsx b/components/TvThrillerMysteries.tsx index f2b1927..593d831 100644 --- a/components/TvThrillerMysteries.tsx +++ b/components/TvThrillerMysteries.tsx @@ -3,7 +3,7 @@ import { useEffect, useState } from "react"; import Image from "next/image"; import SectionTitle from "@/components/SectionTitle"; -import { fetchThrillerMysteryMovies } from "@/libs/tdmbs"; +import { fetchThrillerMysteryMovies } from "@/lib/tdmbs"; type Tv = { id: number; diff --git a/components/USTvShow.tsx b/components/USTvShow.tsx index 764678a..988ee1a 100644 --- a/components/USTvShow.tsx +++ b/components/USTvShow.tsx @@ -3,7 +3,7 @@ import { useEffect, useState } from "react"; import Image from "next/image"; import SectionTitle from "@/components/SectionTitle"; -import { fetchUSTVShows } from "@/libs/tdmbs"; +import { fetchUSTVShows } from "@/lib/tdmbs"; type TvShow = { id: number; diff --git a/components/WatchItAgain.tsx b/components/WatchItAgain.tsx index ceaaf23..6b8a566 100644 --- a/components/WatchItAgain.tsx +++ b/components/WatchItAgain.tsx @@ -1,7 +1,7 @@ "use client"; import { useEffect, useState } from "react"; -import { fetchMovieById } from "@/libs/tdmbs"; +import { fetchMovieById } from "@/lib/tdmbs"; import Image from "next/image"; import SectionTitle from "@/components/SectionTitle"; import { watchHistory } from "@/data/watchHistory"; diff --git a/lib/api/tdmb/movie.ts b/lib/api/tdmb/movie.ts new file mode 100644 index 0000000..140fd7c --- /dev/null +++ b/lib/api/tdmb/movie.ts @@ -0,0 +1,31 @@ +import { BASE_URL, API_KEY, REVALIDATE_TIME } from "../../constants/tdmbs"; +import type { TMDBApiResponse, TMDBMovie } from "../types/tdmbs"; + +export async function fetchNewReleases( + language = "en-US", + page = 1, + region = "US" +): Promise { + const res = await fetch( + `${BASE_URL}/movie/now_playing?api_key=${API_KEY}&language=${language}&page=${page}®ion=${region}`, + { next: { revalidate: REVALIDATE_TIME } } + ); + if (!res.ok) throw new Error("Failed to fetch movies"); + const data: TMDBApiResponse = await res.json(); + return data.results; +} + +export async function fetchPopularMovies( + language = "en-US", + page = 1 +): Promise { + const res = await fetch( + `${BASE_URL}/movie/popular?api_key=${API_KEY}&language=${language}&page=${page}`, + { next: { revalidate: REVALIDATE_TIME } } + ); + if (!res.ok) throw new Error("Failed to fetch movies"); + const data: TMDBApiResponse = await res.json(); + return data.results; +} + +// κ·Έ μ™Έ movie κ΄€λ ¨ (Top10, African λ“±) diff --git a/lib/api/tdmb/tv.ts b/lib/api/tdmb/tv.ts new file mode 100644 index 0000000..00849a6 --- /dev/null +++ b/lib/api/tdmb/tv.ts @@ -0,0 +1,27 @@ +import { BASE_URL, API_KEY, REVALIDATE_TIME } from "../../constants/tdmbs"; +import type { TMDBTvShow, TMDBApiResponse } from "../types/tdmbs"; + +export async function fetchUSTVShows( + language = "en-US", + with_origin_country = "US", + page = 1 +): Promise { + const res = await fetch( + `${BASE_URL}/discover/tv?api_key=${API_KEY}&language=${language}&sort_by=popularity.desc&with_origin_country=${with_origin_country}&page=${page}`, + { next: { revalidate: REVALIDATE_TIME } } + ); + const data: TMDBApiResponse = await res.json(); + return data.results; +} + +export async function fetchThrillerMysteryTV( + language = "en-US", + page = 1 +): Promise { + const res = await fetch( + `${BASE_URL}/discover/tv?api_key=${API_KEY}&language=${language}&with_genres=9648&sort_by=popularity.desc&page=${page}`, + { next: { revalidate: REVALIDATE_TIME } } + ); + const data: TMDBApiResponse = await res.json(); + return data.results.slice(0, 5); +} diff --git a/libs/type/tdmbs.ts b/lib/api/types/tdmbs.ts similarity index 67% rename from libs/type/tdmbs.ts rename to lib/api/types/tdmbs.ts index 6dbefcb..2627e48 100644 --- a/libs/type/tdmbs.ts +++ b/lib/api/types/tdmbs.ts @@ -7,7 +7,7 @@ export type TMDBMovie = { release_date?: string; }; -export type TMDBTVShow = { +export type TMDBTvShow = { id: number; name: string; poster_path: string | null; @@ -15,3 +15,10 @@ export type TMDBTVShow = { overview: string; first_air_date?: string; }; + +export type TMDBApiResponse = { + page: number; + results: T[]; + total_pages: number; + total_results: number; +}; diff --git a/lib/constants/tdmbs.ts b/lib/constants/tdmbs.ts new file mode 100644 index 0000000..12263fa --- /dev/null +++ b/lib/constants/tdmbs.ts @@ -0,0 +1,3 @@ +export const BASE_URL = "https://api.themoviedb.org/3"; +export const API_KEY = process.env.NEXT_PUBLIC_TMDB_API_KEY; +export const REVALIDATE_TIME = 3600; // 1μ‹œκ°„ diff --git a/libs/tdmbs.ts b/lib/tdmbs.ts similarity index 100% rename from libs/tdmbs.ts rename to lib/tdmbs.ts From 404f188db706d7fad030d9cc5d48bf5cee78533b Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Fri, 31 Oct 2025 17:29:46 +0900 Subject: [PATCH 31/82] =?UTF-8?q?refact:=20fetch=20=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC=20=EC=98=A4=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/AfricanMovies.tsx | 11 +- components/ContinueWatching.tsx | 10 +- components/MyList.tsx | 2 +- components/NetflixOriginals.tsx | 19 ++- components/NewReleases.tsx | 11 +- components/Nollywood.tsx | 17 +-- components/Popular.tsx | 11 +- components/Top10.tsx | 11 +- components/TrendingNow.tsx | 11 +- components/TvThrillerMysteries.tsx | 11 +- components/USTvShow.tsx | 11 +- components/WatchItAgain.tsx | 11 +- lib/api/tdmb/combined.ts | 59 ++++++++ lib/api/tdmb/movie.ts | 90 ++++++++++++- lib/api/tdmb/tv.ts | 10 ++ lib/tdmbs.ts | 210 ----------------------------- 16 files changed, 201 insertions(+), 304 deletions(-) create mode 100644 lib/api/tdmb/combined.ts delete mode 100644 lib/tdmbs.ts diff --git a/components/AfricanMovies.tsx b/components/AfricanMovies.tsx index f68344f..0c9b341 100644 --- a/components/AfricanMovies.tsx +++ b/components/AfricanMovies.tsx @@ -3,16 +3,11 @@ import { useEffect, useState } from "react"; import Image from "next/image"; import SectionTitle from "@/components/SectionTitle"; -import { fetchAfricanMovies } from "@/lib/tdmbs"; - -type Movie = { - id: number; - title: string; - poster_path: string; -}; +import { fetchAfricanMovies } from "../lib/api/tdmb/movie"; +import type { TMDBMovie } from "../lib/api/types/tdmbs"; export default function AfricanMovies() { - const [movies, setMovies] = useState([]); + const [movies, setMovies] = useState([]); useEffect(() => { const getAfricanMovies = async () => { diff --git a/components/ContinueWatching.tsx b/components/ContinueWatching.tsx index 2ec4221..275e18b 100644 --- a/components/ContinueWatching.tsx +++ b/components/ContinueWatching.tsx @@ -1,22 +1,18 @@ "use client"; import { useEffect, useState } from "react"; -import { fetchMovieById } from "@/lib/tdmbs"; +import { fetchMovieById } from "../lib/api/tdmb/movie"; import Image from "next/image"; import SectionTitle from "@/components/SectionTitle"; import { watchHistory } from "@/data/watchHistory"; +import type { TMDBMovie } from "../lib/api/types/tdmbs"; -type Movie = { - id: number; - title: string; - poster_path: string; -}; // μ‚¬μš©μž 이름 κ°€μ Έμ˜€κΈ° (더미 데이터 κΈ°μ€€) const userName = watchHistory[0]?.userName || "User"; const MOCK_WATCHING_IDS = [550, 299534, 155, 597, 681]; export default function ContinueWatching() { - const [movies, setMovies] = useState([]); + const [movies, setMovies] = useState([]); useEffect(() => { async function loadMovies() { diff --git a/components/MyList.tsx b/components/MyList.tsx index 0b35694..4f6b206 100644 --- a/components/MyList.tsx +++ b/components/MyList.tsx @@ -1,7 +1,7 @@ "use client"; import { useEffect, useState } from "react"; -import { fetchMovieById } from "@/lib/tdmbs"; +import { fetchMovieById } from "../lib/api/tdmb/movie"; import Image from "next/image"; import SectionTitle from "@/components/SectionTitle"; diff --git a/components/NetflixOriginals.tsx b/components/NetflixOriginals.tsx index 24f3127..4670432 100644 --- a/components/NetflixOriginals.tsx +++ b/components/NetflixOriginals.tsx @@ -3,22 +3,19 @@ import { useEffect, useState } from "react"; import Image from "next/image"; import SectionTitle from "@/components/SectionTitle"; -import { fetchNetflixOriginals } from "@/lib/tdmbs"; +import { fetchNetflixOriginals } from "../lib/api/tdmb/combined"; +import type { TMDBMovie, TMDBTvShow } from "../lib/api/types/tdmbs"; -type Movie = { - id: number; - title: string; - poster_path: string; -}; +type CombinedItem = TMDBMovie | TMDBTvShow; export default function NetflixOriginals() { - const [movies, setMovies] = useState([]); + const [data, setData] = useState([]); useEffect(() => { const loadMovies = async () => { try { - const movieData = await fetchNetflixOriginals(); - setMovies(movieData); + const data = await fetchNetflixOriginals(); + setData(data); } catch (error) { console.error("Failed to fetch popular movies:", error); } @@ -32,7 +29,7 @@ export default function NetflixOriginals() {
- {movies + {data .filter((movie) => movie.poster_path) // null μ•„λ‹Œ κ²ƒλ§Œ .slice(0, 5) // 5개만 ν‘œμ‹œ .map((movie) => ( @@ -42,7 +39,7 @@ export default function NetflixOriginals() { > {movie.title}([]); + const [movies, setMovies] = useState([]); useEffect(() => { const loadMovies = async () => { diff --git a/components/Nollywood.tsx b/components/Nollywood.tsx index f1ce612..76a96cc 100644 --- a/components/Nollywood.tsx +++ b/components/Nollywood.tsx @@ -3,22 +3,19 @@ import { useEffect, useState } from "react"; import Image from "next/image"; import SectionTitle from "@/components/SectionTitle"; -import { fetchNollywoodMovies } from "@/lib/tdmbs"; +import { fetchNollywoodMovies } from "../lib/api/tdmb/combined"; +import type { TMDBMovie, TMDBTvShow } from "../lib/api/types/tdmbs"; -type Movie = { - id: number; - title: string; - poster_path: string; -}; +type CombinedItem = TMDBMovie | TMDBTvShow; export default function Nollywood() { - const [movies, setMovies] = useState([]); + const [data, setData] = useState([]); useEffect(() => { const loadMovies = async () => { try { const movieData = await fetchNollywoodMovies(); - setMovies(movieData); + setData(movieData); } catch (error) { console.error("Failed to fetch popular movies:", error); } @@ -32,7 +29,7 @@ export default function Nollywood() {
- {movies + {data .filter((movie) => movie.poster_path) // null μ•„λ‹Œ κ²ƒλ§Œ .slice(0, 5) // 5개만 ν‘œμ‹œ .map((movie) => ( @@ -42,7 +39,7 @@ export default function Nollywood() { > {movie.title}([]); + const [movies, setMovies] = useState([]); useEffect(() => { const getPopularMovies = async () => { diff --git a/components/Top10.tsx b/components/Top10.tsx index a36e93a..877f730 100644 --- a/components/Top10.tsx +++ b/components/Top10.tsx @@ -3,16 +3,11 @@ import { useEffect, useState } from "react"; import Image from "next/image"; import SectionTitle from "@/components/SectionTitle"; -import { fetchTop10Movies } from "@/lib/tdmbs"; - -type Movie = { - id: number; - title: string; - poster_path: string; -}; +import { fetchTop10Movies } from "../lib/api/tdmb/movie"; +import type { TMDBMovie } from "../lib/api/types/tdmbs"; export default function Top10() { - const [movies, setMovies] = useState([]); + const [movies, setMovies] = useState([]); useEffect(() => { const loadMovies = async () => { diff --git a/components/TrendingNow.tsx b/components/TrendingNow.tsx index 3eaa6b6..ee56aac 100644 --- a/components/TrendingNow.tsx +++ b/components/TrendingNow.tsx @@ -3,16 +3,11 @@ import { useEffect, useState } from "react"; import Image from "next/image"; import SectionTitle from "@/components/SectionTitle"; -import { fetchTrendingMovies } from "@/lib/tdmbs"; - -type Movie = { - id: number; - title: string; - poster_path: string; -}; +import { fetchTrendingMovies } from "../lib/api/tdmb/movie"; +import type { TMDBMovie } from "../lib/api/types/tdmbs"; export default function TrendingNow() { - const [movies, setMovies] = useState([]); + const [movies, setMovies] = useState([]); useEffect(() => { const loadMovies = async () => { diff --git a/components/TvThrillerMysteries.tsx b/components/TvThrillerMysteries.tsx index 593d831..b88cf8a 100644 --- a/components/TvThrillerMysteries.tsx +++ b/components/TvThrillerMysteries.tsx @@ -3,16 +3,11 @@ import { useEffect, useState } from "react"; import Image from "next/image"; import SectionTitle from "@/components/SectionTitle"; -import { fetchThrillerMysteryMovies } from "@/lib/tdmbs"; - -type Tv = { - id: number; - name: string; //title μ•„λ‹˜ - poster_path: string; -}; +import { fetchThrillerMysteryMovies } from "../lib/api/tdmb/movie"; +import type { TMDBTvShow } from "../lib/api/types/tdmbs"; export default function TvThrillerMysteries() { - const [movies, setMovies] = useState([]); + const [movies, setMovies] = useState([]); useEffect(() => { const loadMovies = async () => { diff --git a/components/USTvShow.tsx b/components/USTvShow.tsx index 988ee1a..e3ec007 100644 --- a/components/USTvShow.tsx +++ b/components/USTvShow.tsx @@ -3,16 +3,11 @@ import { useEffect, useState } from "react"; import Image from "next/image"; import SectionTitle from "@/components/SectionTitle"; -import { fetchUSTVShows } from "@/lib/tdmbs"; - -type TvShow = { - id: number; - name: string; - poster_path: string; -}; +import { fetchUSTVShows } from "../lib/api/tdmb/tv"; +import type { TMDBTvShow } from "../lib/api/types/tdmbs"; export default function UsTvShow() { - const [movies, setMovies] = useState([]); + const [movies, setMovies] = useState([]); useEffect(() => { const loadMovies = async () => { diff --git a/components/WatchItAgain.tsx b/components/WatchItAgain.tsx index 6b8a566..bcef87c 100644 --- a/components/WatchItAgain.tsx +++ b/components/WatchItAgain.tsx @@ -1,19 +1,14 @@ "use client"; import { useEffect, useState } from "react"; -import { fetchMovieById } from "@/lib/tdmbs"; +import { fetchMovieById } from "../lib/api/tdmb/movie"; import Image from "next/image"; import SectionTitle from "@/components/SectionTitle"; import { watchHistory } from "@/data/watchHistory"; - -type Movie = { - id: number; - title: string; - poster_path: string; -}; +import type { TMDBMovie } from "../lib/api/types/tdmbs"; export default function WatchItAgain() { - const [movies, setMovies] = useState([]); + const [movies, setMovies] = useState([]); useEffect(() => { async function loadMovies() { diff --git a/lib/api/tdmb/combined.ts b/lib/api/tdmb/combined.ts new file mode 100644 index 0000000..46f6e4b --- /dev/null +++ b/lib/api/tdmb/combined.ts @@ -0,0 +1,59 @@ +import { BASE_URL, API_KEY, REVALIDATE_TIME } from "../../constants/tdmbs"; +import type { TMDBApiResponse, TMDBMovie, TMDBTvShow } from "../types/tdmbs"; + +//Netflix Originals λΆ€λΆ„ +export async function fetchNetflixOriginals( + language = "en-US", + page = 1, + netflixID = 213, + with_watch_providers = 8, + watch_region = "US" +) { + const [movieRes, tvRes] = await Promise.all([ + fetch( + //netflix originals μ˜ν™” API 호좜 + `${BASE_URL}/discover/movie?api_key=${API_KEY}&language=${language}&with_watch_providers=${with_watch_providers}&watch_region=${watch_region}&sort_by=popularity.desc&page=${page}`, + { next: { revalidate: REVALIDATE_TIME } } + ), + fetch( + //netflix originals tv μ‡Ό API 호좜 + `${BASE_URL}/discover/tv?api_key=${API_KEY}&language=${language}&with_networks=${netflixID}&sort_by=popularity.desc&page=${page}`, + { next: { revalidate: REVALIDATE_TIME } } + ), + ]); + + const movieData: TMDBApiResponse = await movieRes.json(); + const tvData: TMDBApiResponse = await tvRes.json(); + + return [...movieData.results.slice(0, 5), ...tvData.results.slice(0, 5)]; +} + +//Nollywood Movies & TV λΆ€λΆ„ +export async function fetchNollywoodMovies( + region = "NG", + language = "en-US", + page = 1 +) { + //λ‚˜μ΄μ§€λ¦¬μ•„ μ˜ν™” API 호좜 + const moviesRes = await fetch( + `${BASE_URL}/discover/movie?api_key=${API_KEY}&with_origin_country=${region}&language=${language}&sort_by=popularity.desc&page=${page}`, + { + next: { revalidate: 3600 }, // ISR 캐싱: 1μ‹œκ°„λ§ˆλ‹€ μƒˆλ‘œ 패치 + } + ); + const moviesData = await moviesRes.json(); + const movies = moviesData.results.slice(0, 5) || []; // μƒμœ„ 5개 + + //λ‚˜μ΄μ§€λ¦¬μ•„ tv μ‡Ό API 호좜 + const tvRes = await fetch( + `${BASE_URL}/discover/tv?api_key=${API_KEY}&with_origin_country=${region}&language=${language}&sort_by=popularity.desc&page=${page}`, + { + next: { revalidate: 3600 }, // ISR 캐싱: 1μ‹œκ°„λ§ˆλ‹€ μƒˆλ‘œ 패치 + } + ); + const tvShowData = await tvRes.json(); + const tvShows = tvShowData.results.slice(0, 5) || []; // μƒμœ„ 5개 + + const combined = [...movies, ...tvShows]; + return combined; +} diff --git a/lib/api/tdmb/movie.ts b/lib/api/tdmb/movie.ts index 140fd7c..5523820 100644 --- a/lib/api/tdmb/movie.ts +++ b/lib/api/tdmb/movie.ts @@ -1,6 +1,7 @@ import { BASE_URL, API_KEY, REVALIDATE_TIME } from "../../constants/tdmbs"; import type { TMDBApiResponse, TMDBMovie } from "../types/tdmbs"; +//New Releases λΆ€λΆ„ export async function fetchNewReleases( language = "en-US", page = 1, @@ -15,6 +16,7 @@ export async function fetchNewReleases( return data.results; } +//Popular moviesλΆ€λΆ„ export async function fetchPopularMovies( language = "en-US", page = 1 @@ -28,4 +30,90 @@ export async function fetchPopularMovies( return data.results; } -// κ·Έ μ™Έ movie κ΄€λ ¨ (Top10, African λ“±) +//TV Thriller Mysteries λΆ€λΆ„ +//Tv μž₯λ₯΄μ—λŠ” Thriller μž₯λ₯΄ μ½”λ“œκ°€ μ—†μŒ +//Mystery μž₯λ₯΄μ½”λ“œμΈ 9648만 μ‚¬μš© +export async function fetchThrillerMysteryMovies( + language = "en-US", + page = 1, + with_genres = "9648" +) { + const res = await fetch( + `${BASE_URL}/discover/tv?api_key=${API_KEY}&language=${language}&with_genres=${with_genres}&sort_by=popularity.desc&page=${page}`, + { next: { revalidate: 3600 } } + ); + const data = await res.json(); + const tvShows = data.results.slice(0, 5); // μƒμœ„ 5개 + return tvShows; +} + +//African Movies λΆ€λΆ„ +//with_origin_country=NG β†’ κ·Έ λ‚˜λΌμ—μ„œ μƒμ˜ 쀑인 μ˜ν™”κ°€ μ•„λ‹Œ μ§„μ§œ λ‚˜μ΄μ§€λ¦¬μ•„ μ˜ν™”/TV 선택 +export async function fetchAfricanMovies( + region = "ZA", + language = "en-US", + page = 1 +) { + const res = await fetch( + `${BASE_URL}/movie/popular?api_key=${API_KEY}&with_origin_country=${region}&language=${language}&page=${page}`, + { + next: { revalidate: 3600 }, // ISR 캐싱: 1μ‹œκ°„λ§ˆλ‹€ μƒˆλ‘œ 패치 + } + ); + + if (!res.ok) { + throw new Error("Failed to fetch movies"); + } + + const data = await res.json(); + return data.results; +} + +//Top 10 in Nigiria λΆ€λΆ„ +export async function fetchTop10Movies( + region = "NG", //κΈ°μ€€ κ΅­κ°€ μ •ν•  수 있음 + language = "en-US", + page = 1 +) { + const res = await fetch( + `${BASE_URL}/movie/top_rated?api_key=${API_KEY}®ion=${region}&language=${language}&page=${page}`, + { + next: { revalidate: 3600 }, // ISR 캐싱: 1μ‹œκ°„λ§ˆλ‹€ μƒˆλ‘œ 패치 + } + ); + if (!res.ok) { + throw new Error("Failed to fetch movies"); + } + + const data = await res.json(); + return data.results; +} + +//Trending Now λΆ€λΆ„ +export async function fetchTrendingMovies( + timeWindow: "day" | "week" = "week", // day: 24μ‹œκ°„, week: 7일 선택 κ°€λŠ₯ + language = "en-US", + page = 1 +) { + const res = await fetch( + `${BASE_URL}/trending/movie/${timeWindow}?api_key=${API_KEY}&language=${language}&page=${page}`, + { + next: { revalidate: 3600 }, // ISR 캐싱: 1μ‹œκ°„λ§ˆλ‹€ μƒˆλ‘œ 패치 + } + ); + if (!res.ok) { + throw new Error("Failed to fetch movies"); + } + + const data = await res.json(); + return data.results; +} + +//μ˜ν™” ν¬μŠ€ν„° κ°€μ Έμ˜€κΈ° Continue Watching & My List λΆ€λΆ„ +export async function fetchMovieById(id: number, language = "en-US") { + const res = await fetch( + `${BASE_URL}/movie/${id}?api_key=${API_KEY}&language=${language}` + ); + if (!res.ok) throw new Error("Failed to fetch movie details"); + return res.json(); +} diff --git a/lib/api/tdmb/tv.ts b/lib/api/tdmb/tv.ts index 00849a6..3809a3f 100644 --- a/lib/api/tdmb/tv.ts +++ b/lib/api/tdmb/tv.ts @@ -1,6 +1,7 @@ import { BASE_URL, API_KEY, REVALIDATE_TIME } from "../../constants/tdmbs"; import type { TMDBTvShow, TMDBApiResponse } from "../types/tdmbs"; +//US tv shows λΆ€λΆ„ export async function fetchUSTVShows( language = "en-US", with_origin_country = "US", @@ -25,3 +26,12 @@ export async function fetchThrillerMysteryTV( const data: TMDBApiResponse = await res.json(); return data.results.slice(0, 5); } + +//tv ν¬μŠ€ν„° κ°€μ Έμ˜€κΈ° +export async function fetchTvById(id: number, language = "en-US") { + const res = await fetch( + `${BASE_URL}/tv/${id}?api_key=${API_KEY}&language=${language}` + ); + if (!res.ok) throw new Error("Failed to fetch movie details"); + return res.json(); +} diff --git a/lib/tdmbs.ts b/lib/tdmbs.ts deleted file mode 100644 index bd2a994..0000000 --- a/lib/tdmbs.ts +++ /dev/null @@ -1,210 +0,0 @@ -const BASE_URL = "https://api.themoviedb.org/3"; -const API_KEY = process.env.NEXT_PUBLIC_TMDB_API_KEY; - -//US tv shows λΆ€λΆ„ -export async function fetchUSTVShows( - language = "en-US", - with_origin_country = "US", - page = 1 -) { - const res = await fetch( - `${BASE_URL}/discover/tv?api_key=${API_KEY}&language=${language}&sort_by=popularity.desc&with_origin_country=${with_origin_country}&page=${page}`, - { next: { revalidate: 3600 } } - ); - const data = await res.json(); - return data.results; -} - -//TV Thriller Mysteries λΆ€λΆ„ -//Tv μž₯λ₯΄μ—λŠ” Thriller μž₯λ₯΄ μ½”λ“œκ°€ μ—†μŒ -//Mystery μž₯λ₯΄μ½”λ“œμΈ 9648만 μ‚¬μš© -export async function fetchThrillerMysteryMovies( - language = "en-US", - page = 1, - with_genres = "9648" -) { - const res = await fetch( - `${BASE_URL}/discover/tv?api_key=${API_KEY}&language=${language}&with_genres=${with_genres}&sort_by=popularity.desc&page=${page}`, - { next: { revalidate: 3600 } } - ); - const data = await res.json(); - const tvShows = data.results.slice(0, 5); // μƒμœ„ 5개 - return tvShows; -} -//New Releases λΆ€λΆ„ -export async function fetchNewReleases( - language = "en-US", - page = 1, - region = "US" -) { - const res = await fetch( - `${BASE_URL}/movie/now_playing?api_key=${API_KEY}&language=${language}&page=${page}®ion=${region}`, - { - next: { revalidate: 3600 }, // ISR 캐싱: 1μ‹œκ°„λ§ˆλ‹€ μƒˆλ‘œ 패치 - } - ); - if (!res.ok) { - throw new Error("Failed to fetch movies"); - } - const data = await res.json(); - return data.results; -} - -//Netflix Originals λΆ€λΆ„ -export async function fetchNetflixOriginals( - language = "en-US", - page = 1, - netflixID = 213, - with_watch_providers = 8, - watch_region = "US" -) { - //netflix originals μ˜ν™” API 호좜 - const moviesRes = await fetch( - `${BASE_URL}/discover/movie?api_key=${API_KEY}&language=${language}&with_watch_providers=${with_watch_providers}&watch_region=${watch_region}&sort_by=popularity.desc&page=${page}`, - { - next: { revalidate: 3600 }, // ISR 캐싱: 1μ‹œκ°„λ§ˆλ‹€ μƒˆλ‘œ 패치 - } - ); - const moviesData = await moviesRes.json(); - const movies = moviesData.results.slice(0, 5) || []; // μƒμœ„ 5개 - - //netflix originals tv μ‡Ό API 호좜 - const tvRes = await fetch( - `${BASE_URL}/discover/tv?api_key=${API_KEY}&language=${language}&with_networks=${netflixID}&sort_by=popularity.desc&page=${page}`, - { - next: { revalidate: 3600 }, // ISR 캐싱: 1μ‹œκ°„λ§ˆλ‹€ μƒˆλ‘œ 패치 - } - ); - const tvShowData = await tvRes.json(); - const tvShows = tvShowData.results.slice(0, 5) || []; // μƒμœ„ 5개 - - const combined = [...movies, ...tvShows]; - return combined; -} - -//Nollywood Movies & TV λΆ€λΆ„ -export async function fetchNollywoodMovies( - region = "NG", - language = "en-US", - page = 1 -) { - //λ‚˜μ΄μ§€λ¦¬μ•„ μ˜ν™” API 호좜 - const moviesRes = await fetch( - `${BASE_URL}/discover/movie?api_key=${API_KEY}&with_origin_country=${region}&language=${language}&sort_by=popularity.desc&page=${page}`, - { - next: { revalidate: 3600 }, // ISR 캐싱: 1μ‹œκ°„λ§ˆλ‹€ μƒˆλ‘œ 패치 - } - ); - const moviesData = await moviesRes.json(); - const movies = moviesData.results.slice(0, 5) || []; // μƒμœ„ 5개 - - //λ‚˜μ΄μ§€λ¦¬μ•„ tv μ‡Ό API 호좜 - const tvRes = await fetch( - `${BASE_URL}/discover/tv?api_key=${API_KEY}&with_origin_country=${region}&language=${language}&sort_by=popularity.desc&page=${page}`, - { - next: { revalidate: 3600 }, // ISR 캐싱: 1μ‹œκ°„λ§ˆλ‹€ μƒˆλ‘œ 패치 - } - ); - const tvShowData = await tvRes.json(); - const tvShows = tvShowData.results.slice(0, 5) || []; // μƒμœ„ 5개 - - const combined = [...movies, ...tvShows]; - return combined; -} - -//African Movies λΆ€λΆ„ -//with_origin_country=NG β†’ κ·Έ λ‚˜λΌμ—μ„œ μƒμ˜ 쀑인 μ˜ν™”κ°€ μ•„λ‹Œ μ§„μ§œ λ‚˜μ΄μ§€λ¦¬μ•„ μ˜ν™”/TV 선택 -export async function fetchAfricanMovies( - region = "ZA", - language = "en-US", - page = 1 -) { - const res = await fetch( - `${BASE_URL}/movie/popular?api_key=${API_KEY}&with_origin_country=${region}&language=${language}&page=${page}`, - { - next: { revalidate: 3600 }, // ISR 캐싱: 1μ‹œκ°„λ§ˆλ‹€ μƒˆλ‘œ 패치 - } - ); - - if (!res.ok) { - throw new Error("Failed to fetch movies"); - } - - const data = await res.json(); - return data.results; -} - -//Top 10 in Nigiria λΆ€λΆ„ -export async function fetchTop10Movies( - region = "NG", //κΈ°μ€€ κ΅­κ°€ μ •ν•  수 있음 - language = "en-US", - page = 1 -) { - const res = await fetch( - `${BASE_URL}/movie/top_rated?api_key=${API_KEY}®ion=${region}&language=${language}&page=${page}`, - { - next: { revalidate: 3600 }, // ISR 캐싱: 1μ‹œκ°„λ§ˆλ‹€ μƒˆλ‘œ 패치 - } - ); - if (!res.ok) { - throw new Error("Failed to fetch movies"); - } - - const data = await res.json(); - return data.results; -} - -//Trending Now λΆ€λΆ„ -export async function fetchTrendingMovies( - timeWindow: "day" | "week" = "week", // day: 24μ‹œκ°„, week: 7일 선택 κ°€λŠ₯ - language = "en-US", - page = 1 -) { - const res = await fetch( - `${BASE_URL}/trending/movie/${timeWindow}?api_key=${API_KEY}&language=${language}&page=${page}`, - { - next: { revalidate: 3600 }, // ISR 캐싱: 1μ‹œκ°„λ§ˆλ‹€ μƒˆλ‘œ 패치 - } - ); - if (!res.ok) { - throw new Error("Failed to fetch movies"); - } - - const data = await res.json(); - return data.results; -} - -//Popular on Netflix λΆ€λΆ„ -export async function fetchPopularMovies(language = "en-US", page = 1) { - const res = await fetch( - `${BASE_URL}/movie/popular?api_key=${API_KEY}&language=${language}&page=${page}`, - { - next: { revalidate: 3600 }, // ISR 캐싱: 1μ‹œκ°„λ§ˆλ‹€ μƒˆλ‘œ 패치 - } - ); - - if (!res.ok) { - throw new Error("Failed to fetch movies"); - } - - const data = await res.json(); - return data.results; -} - -//μ˜ν™” ν¬μŠ€ν„° κ°€μ Έμ˜€κΈ° Continue Watching & My List λΆ€λΆ„ -export async function fetchMovieById(id: number, language = "en-US") { - const res = await fetch( - `${BASE_URL}/movie/${id}?api_key=${API_KEY}&language=${language}` - ); - if (!res.ok) throw new Error("Failed to fetch movie details"); - return res.json(); -} - -//tv ν¬μŠ€ν„° κ°€μ Έμ˜€κΈ° -export async function fetchTvById(id: number, language = "en-US") { - const res = await fetch( - `${BASE_URL}/tv/${id}?api_key=${API_KEY}&language=${language}` - ); - if (!res.ok) throw new Error("Failed to fetch movie details"); - return res.json(); -} From 2d056f60e32fd8da92277ed2c353f78e391597f3 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Fri, 31 Oct 2025 21:02:44 +0900 Subject: [PATCH 32/82] =?UTF-8?q?feat:=20indicator=20bar=20z-index=20?= =?UTF-8?q?=EC=A1=B0=EC=A0=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/home/page.tsx | 6 +++++- app/layout.tsx | 7 +++++-- components/IndicatorBar.tsx | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/app/home/page.tsx b/app/home/page.tsx index fd1cf1e..ddd6d4e 100644 --- a/app/home/page.tsx +++ b/app/home/page.tsx @@ -1,7 +1,7 @@ export default function Home() { return (
-
+
ν—€λ”μ˜μ—­
@@ -9,6 +9,10 @@ export default function Home() { λ°°λ„ˆ μ˜μ—­
μ„Ήμ…˜ μ˜μ—­
μ„Ήμ…˜ μ˜μ—­
+
μ„Ήμ…˜ μ˜μ—­
+
μ„Ήμ…˜ μ˜μ—­
+
μ„Ήμ…˜ μ˜μ—­
+
μ„Ήμ…˜ μ˜μ—­
diff --git a/app/layout.tsx b/app/layout.tsx index b3176d7..6cda068 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -31,8 +31,11 @@ export default function RootLayout({ - {children} - + {/* νœ΄λŒ€ν° ν”„λ ˆμž„ */} +
+ {children} + +
); diff --git a/components/IndicatorBar.tsx b/components/IndicatorBar.tsx index 085bff8..2551925 100644 --- a/components/IndicatorBar.tsx +++ b/components/IndicatorBar.tsx @@ -1,6 +1,6 @@ export default function IndicatorBar() { return ( -
+
); From 98a97a6d05fafa5ce8aade296a6a608da8385e0f Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Fri, 31 Oct 2025 21:40:56 +0900 Subject: [PATCH 33/82] =?UTF-8?q?chore:=20eslint,=20prettier=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .prettierrc | 11 ++++ eslint.config.mjs | 48 ++++++++++------ eslint.config.mts | 11 ++++ package-lock.json | 144 ++++++++++++++++++++++++++++++++++++++++++---- package.json | 14 ++++- 5 files changed, 196 insertions(+), 32 deletions(-) create mode 100644 .prettierrc create mode 100644 eslint.config.mts diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..705716e --- /dev/null +++ b/.prettierrc @@ -0,0 +1,11 @@ +{ + "arrowParens": "always", + "bracketSpacing": true, + "endOfLine": "auto", + "printWidth": 120, + "semi": true, + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "all", + "useTabs": false +} diff --git a/eslint.config.mjs b/eslint.config.mjs index 05e726d..46cd49f 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,18 +1,32 @@ -import { defineConfig, globalIgnores } from "eslint/config"; -import nextVitals from "eslint-config-next/core-web-vitals"; -import nextTs from "eslint-config-next/typescript"; +// eslint.config.mjs +import js from '@eslint/js'; +import globals from 'globals'; +import react from 'eslint-plugin-react'; +import tseslint from 'typescript-eslint'; +import prettier from 'eslint-plugin-prettier'; -const eslintConfig = defineConfig([ - ...nextVitals, - ...nextTs, - // Override default ignores of eslint-config-next. - globalIgnores([ - // Default ignores of eslint-config-next: - ".next/**", - "out/**", - "build/**", - "next-env.d.ts", - ]), -]); - -export default eslintConfig; +export default tseslint.config(js.configs.recommended, ...tseslint.configs.recommended, { + files: ['**/*.{ts,tsx,js,jsx}'], + ignores: ['node_modules', 'dist', '.next'], + languageOptions: { + globals: { + ...globals.browser, + ...globals.node, + }, + }, + plugins: { + react, + prettier, + }, + rules: { + ...react.configs.recommended.rules, + 'react/react-in-jsx-scope': 'off', // Next.jsμ—μ„œλŠ” λΆˆν•„μš” + 'prettier/prettier': 'error', // prettier κ·œμΉ™μ„ ESLint에 톡합 + '@typescript-eslint/no-unused-vars': ['warn'], + }, + settings: { + react: { + version: 'detect', + }, + }, +}); diff --git a/eslint.config.mts b/eslint.config.mts new file mode 100644 index 0000000..673b075 --- /dev/null +++ b/eslint.config.mts @@ -0,0 +1,11 @@ +import js from "@eslint/js"; +import globals from "globals"; +import tseslint from "typescript-eslint"; +import pluginReact from "eslint-plugin-react"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + { files: ["**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"], plugins: { js }, extends: ["js/recommended"], languageOptions: { globals: globals.browser } }, + tseslint.configs.recommended, + pluginReact.configs.flat.recommended, +]); diff --git a/package-lock.json b/package-lock.json index 498e372..ceeff77 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,14 +17,22 @@ "styled-components": "^6.1.19" }, "devDependencies": { + "@eslint/js": "^9.38.0", "@tailwindcss/postcss": "^4", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", - "eslint": "^9", + "eslint": "^9.38.0", "eslint-config-next": "16.0.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-prettier": "^5.5.4", + "eslint-plugin-react": "^7.37.5", + "globals": "^16.4.0", + "jiti": "^2.6.1", + "prettier": "^3.6.2", "tailwindcss": "^4", - "typescript": "^5" + "typescript": "^5", + "typescript-eslint": "^8.46.2" } }, "node_modules/@alloc/quick-lru": { @@ -461,6 +469,19 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@eslint/js": { "version": "9.38.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.38.0.tgz", @@ -1228,6 +1249,19 @@ "node": ">=12.4.0" } }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", @@ -3208,17 +3242,20 @@ } } }, - "node_modules/eslint-config-next/node_modules/globals": { - "version": "16.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", - "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", - "engines": { - "node": ">=18" + "bin": { + "eslint-config-prettier": "bin/cli.js" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" } }, "node_modules/eslint-import-resolver-node": { @@ -3380,6 +3417,37 @@ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9" } }, + "node_modules/eslint-plugin-prettier": { + "version": "5.5.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.4.tgz", + "integrity": "sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg==", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.11.7" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": ">= 7.0.0 <10.0.0 || >=10.1.0", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, "node_modules/eslint-plugin-react": { "version": "7.37.5", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", @@ -3552,6 +3620,13 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/fast-glob": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", @@ -3830,9 +3905,9 @@ } }, "node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", "dev": true, "license": "MIT", "engines": { @@ -5474,6 +5549,35 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -6227,6 +6331,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/synckit": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", + "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@pkgr/core": "^0.2.9" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/synckit" + } + }, "node_modules/tailwindcss": { "version": "4.1.16", "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.16.tgz", diff --git a/package.json b/package.json index fb08f15..012deb5 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "dev": "next dev", "build": "next build", "start": "next start", - "lint": "eslint", + "lint": "eslint .", "lint:fix": "eslint --fix" }, "dependencies": { @@ -19,13 +19,21 @@ "styled-components": "^6.1.19" }, "devDependencies": { + "@eslint/js": "^9.38.0", "@tailwindcss/postcss": "^4", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", - "eslint": "^9", + "eslint": "^9.38.0", "eslint-config-next": "16.0.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-prettier": "^5.5.4", + "eslint-plugin-react": "^7.37.5", + "globals": "^16.4.0", + "jiti": "^2.6.1", + "prettier": "^3.6.2", "tailwindcss": "^4", - "typescript": "^5" + "typescript": "^5", + "typescript-eslint": "^8.46.2" } } From d4ef53ba2bf8ffbf5cacc4ffb90a17d3824d9f61 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Fri, 31 Oct 2025 22:15:44 +0900 Subject: [PATCH 34/82] =?UTF-8?q?chore:=20=ED=8F=B0=ED=8A=B8=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/font.css | 39 +++++++++++++++++++++ app/globals.css | 9 +++-- app/layout.tsx | 23 ++++++------ eslint.config.mjs | 32 ----------------- eslint.config.mts | 11 ------ public/fonts/sf-pro-display-bold.woff2 | Bin 0 -> 36480 bytes public/fonts/sf-pro-display-heavy.woff2 | Bin 0 -> 37224 bytes public/fonts/sf-pro-display-medium.woff2 | Bin 0 -> 36168 bytes public/fonts/sf-pro-display-regular.woff2 | Bin 0 -> 29632 bytes public/fonts/sf-pro-display-semibold.woff2 | Bin 0 -> 37560 bytes 10 files changed, 58 insertions(+), 56 deletions(-) create mode 100644 app/font.css delete mode 100644 eslint.config.mjs delete mode 100644 eslint.config.mts create mode 100644 public/fonts/sf-pro-display-bold.woff2 create mode 100644 public/fonts/sf-pro-display-heavy.woff2 create mode 100644 public/fonts/sf-pro-display-medium.woff2 create mode 100644 public/fonts/sf-pro-display-regular.woff2 create mode 100644 public/fonts/sf-pro-display-semibold.woff2 diff --git a/app/font.css b/app/font.css new file mode 100644 index 0000000..4e57a40 --- /dev/null +++ b/app/font.css @@ -0,0 +1,39 @@ +@font-face { + font-family: 'SF Pro Display'; + font-style: normal; + font-weight: 400; + font-display: swap; + src: url('/fonts/sf-pro-display-regular.woff2') format('woff2'); +} + +@font-face { + font-family: 'SF Pro Display'; + font-style: normal; + font-weight: 500; + font-display: swap; + src: url('/fonts/sf-pro-display-medium.woff2') format('woff2'); +} + +@font-face { + font-family: 'SF Pro Display'; + font-style: normal; + font-weight: 600; + font-display: swap; + src: url('/fonts/sf-pro-display-semibold.woff2') format('woff2'); +} + +@font-face { + font-family: 'SF Pro Display'; + font-style: normal; + font-weight: 700; + font-display: swap; + src: url('/fonts/sf-pro-display-bold.woff2') format('woff2'); +} + +@font-face { + font-family: 'SF Pro Display'; + font-style: normal; + font-weight: 800; + font-display: swap; + src: url('/fonts/sf-pro-display-heavy.woff2') format('woff2'); +} diff --git a/app/globals.css b/app/globals.css index a2dc41e..699a933 100644 --- a/app/globals.css +++ b/app/globals.css @@ -1,10 +1,15 @@ -@import "tailwindcss"; +@import 'tailwindcss'; :root { --background: #ffffff; --foreground: #171717; } +@theme { + /* Font Family */ + --font-sans: 'SF Pro Display', sans-serif; +} + @theme inline { --color-background: var(--background); --color-foreground: var(--foreground); @@ -22,5 +27,5 @@ body { background: var(--background); color: var(--foreground); - font-family: Arial, Helvetica, sans-serif; + font-family: var(--font-sans); } diff --git a/app/layout.tsx b/app/layout.tsx index 6cda068..e41b6cd 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,23 +1,24 @@ -import type { Metadata } from "next"; -import { Geist, Geist_Mono } from "next/font/google"; -import "./globals.css"; -import IndicatorBar from "@/components/IndicatorBar"; +import type { Metadata } from 'next'; +import { Geist, Geist_Mono } from 'next/font/google'; +import './globals.css'; +import IndicatorBar from '@/components/IndicatorBar'; +import localFont from 'next/font/local'; const geistSans = Geist({ - variable: "--font-geist-sans", - subsets: ["latin"], + variable: '--font-geist-sans', + subsets: ['latin'], }); const geistMono = Geist_Mono({ - variable: "--font-geist-mono", - subsets: ["latin"], + variable: '--font-geist-mono', + subsets: ['latin'], }); export const metadata: Metadata = { - title: "netflix-clone", - description: "Generated by create next app", + title: 'netflix-clone', + description: 'Generated by create next app', icons: { - icon: "/favicon.png", + icon: '/favicon.png', }, }; diff --git a/eslint.config.mjs b/eslint.config.mjs deleted file mode 100644 index 46cd49f..0000000 --- a/eslint.config.mjs +++ /dev/null @@ -1,32 +0,0 @@ -// eslint.config.mjs -import js from '@eslint/js'; -import globals from 'globals'; -import react from 'eslint-plugin-react'; -import tseslint from 'typescript-eslint'; -import prettier from 'eslint-plugin-prettier'; - -export default tseslint.config(js.configs.recommended, ...tseslint.configs.recommended, { - files: ['**/*.{ts,tsx,js,jsx}'], - ignores: ['node_modules', 'dist', '.next'], - languageOptions: { - globals: { - ...globals.browser, - ...globals.node, - }, - }, - plugins: { - react, - prettier, - }, - rules: { - ...react.configs.recommended.rules, - 'react/react-in-jsx-scope': 'off', // Next.jsμ—μ„œλŠ” λΆˆν•„μš” - 'prettier/prettier': 'error', // prettier κ·œμΉ™μ„ ESLint에 톡합 - '@typescript-eslint/no-unused-vars': ['warn'], - }, - settings: { - react: { - version: 'detect', - }, - }, -}); diff --git a/eslint.config.mts b/eslint.config.mts deleted file mode 100644 index 673b075..0000000 --- a/eslint.config.mts +++ /dev/null @@ -1,11 +0,0 @@ -import js from "@eslint/js"; -import globals from "globals"; -import tseslint from "typescript-eslint"; -import pluginReact from "eslint-plugin-react"; -import { defineConfig } from "eslint/config"; - -export default defineConfig([ - { files: ["**/*.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"], plugins: { js }, extends: ["js/recommended"], languageOptions: { globals: globals.browser } }, - tseslint.configs.recommended, - pluginReact.configs.flat.recommended, -]); diff --git a/public/fonts/sf-pro-display-bold.woff2 b/public/fonts/sf-pro-display-bold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..03e501cf98942099c9143f5099b9ac8e8b431ec0 GIT binary patch literal 36480 zcmV(@K-Rx^Pew8T0RR910FHnF6aWAK0)dzS0FDj-0RR9100000000000000000000 z0000PfoMNQMpR848a5k;jbI#va0XxigIWkm34~=42nvFoK!N&l0X7081BW0BgHiwl zAO)}?2Zc!tf*(J3WnyLqTNQ0`f$63@>rrkSK#X|Y=$&&X+lIZ~OaZ*h=ZvC4*f;

nU*x5;EfUbg~4vxANuY) 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 literal 0 HcmV?d00001 diff --git a/public/fonts/sf-pro-display-heavy.woff2 b/public/fonts/sf-pro-display-heavy.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..d5d68cc09272f9ee7029be7745cc353452650973 GIT binary patch literal 37224 zcmV(~K+nH-Pew8T0RR910Fh__6aWAK0)5B;0Fd+m0RR9100000000000000000000 z0000PfoMNQMpR848a5k;jSw7!a0XxigIWkg34~=42nvFhSb_5~0X7081BW0BgHiwl zAO)~62Zc!tf&o8wWnyLqTkmLcgj~0usyOJp%_>n-JhUg=hFi~VU};_Lw6Vy5uyFtZ zXkE_P|Ns9fNyiuttT8aPsy|DT0fte8L=lO~Oh@!YHyP|%9KQi7O}6NU}Tf5!02Ew7{Wf@2|viTRr#1mVcQOvI{ic}%KUkP*wU z@o%1z^L>GDP9ecGKeO6n#|JK(KY~^?UmN|{u4-QR%nDJCG|JxH4T!D1{q5!$h|Q(& z3betFM=DKRIM=W;Z=@Fy-2@>TdJ}1;+n?-Bd7p^36X6luPr55{J8#IVK_{_1ZnwtR z7+O6MHB0VkzZOrM_0=OV3}OQelJJlaL1MB*bQ7{BaLI}bIcH6?dMcCL7u7S-0e)Wp zhV4xprY_u$zKI+?Y|UnyvteOrn3{^w<6M-At6imY?Ofqf^!?9;xQN69u7KfgbZb<38mg5a zEy7uZ;XLY`+u1nea3RF;H>RfPT(T|d3av9IPAut&9;m2RF1a{voz{*kZ=ExRI{SaW zwem{qDOYQfdkOD2NF|lKP%e;SN($8pF&J<##*PcNk+HBXlo%Im$u?pg1<44DHIkV% zI$J`yOIs@04z2E8hN%LsGOmK9qQ-LrDwT8qatmWRZ zwc?tXVYJFFbKS3uZ$!&ZWg_r6X;$En>q*8l(ger47sk=T*YsDw@p@1KiZ zHf9I&w@9p?P#^cK$+T39VM>`)-QxKCm%8eT2HZ?Y+K|KDO{Y!y-9x~KBmW9{Yrdt@p$bx1}7=Er&up|eB3EcxU(?e(Cge(lxk4J~RDWCT3ZQs3zo}Bh} zE882~%?5X~A;nud-1mIh|1&jh|LkJHStw;%PN{U!U4TOB+!fkC8?-wMkUO&g4!Zy; z0#E>Olm&p4On@gZNZvhAk#|lf(jh01cd|sDQtVuGE=tK|NM+~JrHj&4Z)+p5%nJG~ z$q$PhB65fyQMy>cQ?dHB3BO40RW!B#73ba0R6wu z=kEbFJ<9xl%`V>u;IY2tzo28{BdY{30a5^th#W096)@nQf- zip8WfXw!!w8U#T4L2y8wKBe59Qof*6cc66SU;6Tgk}qy_M@NB3g#VBE`*^m>rHQDB z13&-{AzLw?p^b^RP0rmp+(CbD9EA_D!4o|=C*&)WQ#ss$3k!aJKv>z%4Q_Iow|z$L zQ$d1$S^%%K=kB5W%QJ5@{6cgnFyaUeIn$(s+)&gMKX3pz zn3Zr$yWm|V7?p|PZ8cCuJQV^14<+I&Sqb$GiWSdM!B+V$A>;9=*)ojVU@)INQt}ab z3sJg%A0I#-Qbpvh^3ZggpdGKTxDWSsSVp`I9271dK1@hhqqJ6C228cZ4!h)yy6P6U8uvS#l>~5r zx|>Knm}h_OYN8v{Rg1=91*dxrTxviiXMgB{{!-;^Yw+9jgQwyCk}Y83V3u z*dU6BeQNPzPMTD^H$aP1&}~m#Hoj~XBJ+yvTlFZ5SB$A>Uk;*c^uO!~L)wM|8iQ6_lwIFtKwvjvVN<5IkQ8 zi+2S1>tGJr>6LfLvqa!ehmORAdzy>k@5e>47P^5;R2O++28b_na1=OTkZ|3n@STubGUgKL6C4`F)+q2OQ3j zoGjNw1ryIQv+ayZw@5}a?W(*@4UX(iUwZPrKGA&G@;W!7kE07Nc40r6O38R%-KuDO zMwD}5XomsQZjKu=m{Y)0l>|k0m^MfYcq`&R7f~@8n%2l{5$1ITQM2 zw2kHll>Bo-iawuQxfxpo2MQqv%&$>WW=F)HnND5n?x(>$6r#wGo7}LgM8?=W4`p1a%JG8qXJ93~- zEqR3;j`a2;U|N1)`X=?`Rq3nfbp&ipY24!dJafC-vA3 zrVAGlT-N zF%PKF9RcrfOHT5E=43Jjkc#D2!j#lf)@j0(rU~(YMPMyo2#V67P`I8fHHN#6z@8dg z^9c9%c^8X_+eG0|U0WnX%5gFTUV^zv^yX2FpXv zM45!yzIK~Mi(QvY<Gd3l?W{14o7Dwq3AosSpl1Y8yjB%f$c)!1IqA+Vo&(^)vf7r2 zSA2(1m~Y;Z6d??(CM2p7;@c}qyaPg~Bt?GAN@{x;!omw9u80-x$RLGURv7qOXit-4 zIXcZP#j)iZ%Z)R#vqE_#1uRt^G1ai)0wR{eN46Duj-&~0As;vfO6xtr>rsO%qXa%N zuBH6gKfP>1IcOPW0$}%Ialy$vK%H3HNL3EoZ9a>@23*SSnCt+YZEmn8svw$wae%Uf zSvM)$T8ZU4ROkV9%>{mL%tGq6vSR97-FVl@x9n zB`}pim2+=K{|0gR??PG$cDRm0wXKv(e4{1L^c)U43{-iNK%Fu{71@s(rI-<4u%0Od z39UqJwF!iuNTNEY(6|L(+)O-A64jit4Pz-c9IbPMBobWI#x5{0z`{ub3$&kCCC>7#F5mrY0n1Ec4dMUg{s1j<*Op_L+ zeJI8p3)CyVg{{y&r6^{!sC||d(rQJ;9g{Z)ZbT<*nIT-t&e>GRCJB-h*F#jO*bija zCkX6wK{G{Re6&{~y}lCJE%5HXg_Cd5&nGMN2{`uDu+=fm-_X_TI%fl=lmbss54(si z8*B1*#%YDz=nC|MWSs?tvOi1qihV6xG&zNqwK7Y% zy=privldu`HJ-+q5K5~kkl)s=M?!gwMd8YZ6fQtn#`I%2x?rA z&NqFoK*?CRF*p0tD&YA5O&mL8XgZDXcA2}CxMhHs6v}bee;|2!yA4!@yi2gW>(C@g z5t>*(YgR-$3`?@+ITukXNxKf~6zMHraMWhgA(Ny#z$V2~$Z=FMrFq7-{ z6={4dARG%Q_v<51Cm)6VSU}P(oga9?uS?tzwHa~3az2}@!TH&bg{U>dDMySN>Pmst zUbDu~=Gtq(LBcvK00jH@XQJ+yQuPkPQojOb3%(Ew0iNXGCmE)F{h=zu)kXagKNC*!xQ)fbjlbyh=&S`5$FZf*nC8*b=llVtJ zmCOehkx*VkHN((j*bhqljX@wZO+ofAaU{Ml%7SC4RliBx1d5|rCaSz~QH{MBq8q4T z?E#4HERl^#oi!S+aexbhH%X{QwPFeRLQ^{8G^cih0XD+nRwR$V>u3UwKMAxx?SzO& zCrY7$vLFZJmHL1&N?HoZfejI6r?ZJxKx2GPb`W4142x+@mgsnF3MgEG2PFnSJ`*^o zj5P*S>jJ-6@dy0QTBZd(Jwu|AAOjb~8v1Kyjocic4fo;%la|V^nJA1G(dq|95$^#Q z-4k2z^k&_wh3S~`Q2C&0cgv!8SoqIIR%|}O{v9OaY)7+%HPe78)#vJ{9<8XOMeSDr zV|v&KWY+5o2JmqKK5GCSY0w%v@mxugx(*a0Fye!0!w|$%7mGuhiz1U0xbhPy38mD_ zWzmjRirG`Lj?L;q(dMuT_$OSdF4*@4?BM9$LTVjiZD_nCyIBZTI6f^bHv<&E&$LRi zZC1Wi!Ikl_t6vEWbs1QLO{QqyHL_Rw7_YrtVwLfhQ19W_oO{3dm7Z7j-7_`5@Q$+q z3uN4Vvo{a`Y<}(Un)_imBeaucUB{*AyxD8`^#$lP;TBg6Us3MTT?R{V;ETZO@a$&^ z`e*fvyOV*3t@Cy3tu5RE}PN@XBb4$h#khfCQ;-Q!fSoR`!1I7yJr zLaY*IzX$``8Pvrg3mLJ5rPi~>4z}6FK6z%0vfV9I+{#Mh7mp#Lmj+r%Aoy8$wIILv zG8J}1{F@xeEUaSoWV;;UkJJ4Z`U1=C_o;M9jXEXVnI_E;LLs~Z_>I4hZ06TwswpnyUaKa^NNdxifhHpuk{Ko58^Zoz+au(51#gQ@ zsf8~PV5?gs=x;qNqFtATmRNs<0HnIOTR+`Tc+-owtR}k*QDj@+*yv;k$UijN>$vm_^%#<)h60?y?>UDk7i+4;ht zG@$D2@HvvQ2DGp-roV!c6a14SrEx>;c4r=1Z6+ztLeOx!rOHjk z0l%PPborkdXwEs|%0eQXzkTtG%h3}-?|7!ShnFyQ_INsUZ2knO>Z)K5 zg*Z0`xsNs~{)Hp4wtQN^*xF~_015>j-pqF=-|mcPc%nFDWim{TI!eIg2CLdg?!$TE zItE6580b!imPpH27gd=@K|1)btZJ@>ddgvzs{Ka2V&Ba=xr&3-28yWN?aFWQ>zfpw3*M z{0vSv$+iFhcLUAKGj`^g28!JhB%AUmOP4T7bq2~JTtI0Bt*op7M1QKd-JZTS!P*h| z&}5&5JF8f89Y2bSD`97tjVRjpo zR_mRcu09Ax8_t3SZD|)VIdAyIq^NxaU_?QJ>x38y(rh6>oy=+>&I7#)f;OtEWV$$# zUX62Yk@kEs#7_ixl%DEr9P`|KSx>IdXNZDsb3=!R+o*Kggz~bk=IcK0Jp9Vrl;8ci z6x21|q+2wLl$i+UwDN0F z#lcJ+?$&dn_92|g;tUb#0@RysA@6P^HkYr}9>}t=g7f)gH8&uj|5yiXkArhS-{3nA zyk#BW7z~`i12|_w@e#YrUe+n2WQi~LrtJK>>HF2KUxS(+gx&(Wgcl6ffPo)A1=tJh z43@O1v(j`y1}^mmqYH|x@e2oebjwJ5aF=O;Okj#u0A_jtrb9D0SWp`$3)jIl%m=zB z3xY~C(E&Lxz#MoAI&-zQ0-<^j5PLaI(E13lLbCB-Kc|)y;Q?en+Yt5xR8}3=yQwb@ z!lu}|Nc23wvcYR4p5nikIT>B2;HU!iM`PfSbPbm#a?ju$Z$`cLSHIGGUB(QEtNSmB z>CXdo2YMEQW^oXKBH$qiCN&681I0t3G^t+l9pztZ1+0jm?S1YO?H9F(JH;DIK!Z7| zOG%I`mS(#3Q7H$@Drb-myHkgVn%mgTF}PNoZYwGA?F>OYvSe1)Y>pd!WB`%b9flO9 z_2+sgy7z-%`b(8Vc>|&J{(Iq<&eC;hLpq`5mT#ltEOMku z!+ExIa>~jQcvprE@f|O#=OOd4vRayW@%Id0T%1*HmPZ>f4Bp6F+u=@{D z>!ZfAs_9U+QL(-o&_ngt^d&hxPEuzX5FH_(?ne1N8>y~V={kNmRLrSXto#Q3!#v98 zyflS0A%+bK`~Li+^rz<>KCLfr5dZJLH~yyWcLrSWbIt^WAGY^>HPyR5lCDT~HPsgL zbdVCsoO-4b^4nCsC><)Y7w|cw+wTGBKp%~1>2lL8wvd7OfyG*}?E^G3KJ7@{n>o!@ zYH^pcW+SV2B``^K&O)lZh>wU)N}W~T6i-s^84u8FP#;-bnQTKdEh|`Y7WHWtpEoK7 zDnPwCeTn3u*YZP!*%C;DBumiKjr4F3#)n&ptkNr2z}y9u=-6v2Hj^BcO0&%ykhVam z3c*jWn_<)l#dNZl^EAHe)A5phK47?pH&#}gQB;R3rAXk+MqZ=W18c-ergw!*F;E0Y z_f1)?YUYX{Nr2FYOE{CRcQBDId<%D;T0uiKC4ji;umVlrU{z8>jx6|Ka{OD%01%)C zsG)bu9p^sLd!?yr2h@UtU|MdK!5?7!VXaQ(vr5#Hh5XEp5Q>5D`&BtRM zMH_j=n?#044$PT1vUL#52q-_021iZ7W}2+>HIw;JnmdDKOw%VX zb)$;KBHJvYaw6zFS6mNQ4ibsW3{&eqX_BhfF6l=nK16A|L74Dk)ekbqf6a})f0}Fq73W2--c(Bfy38?C<(C>t%TaO~l z2ycV7Gu>A2WbPjJS;_qS#^gZwZBO`M{J z648~{l2u%!O4|josxiHlO9xHbcqp964!8dw^DHGtn~c*;muq(5ucHNXuJZ){fbivs z3@(C9b%Gnw*QP#L;ijF$O$ToFR*+p=n+GX1`k)A*E0HpjdkTaUlsn*WRIP*7@?W3Y z91|C#4i=qm6+W?pmZ^5O?n1RvZpVehC;EeSU;;^mbuomsTwwOQF2@YUmj^k>Yi3Qi z#aW(Ecmngx{y^24?A#K`q*@`z6-9qlc@++6SATn z|3<)FD4T(f3DNXV&RH9eQhnyuP(ABYr{J=dsP8Ki=*h_EVYYgWmmbUNx4?0 zwr5JQJBL`ptzw{BvQ7Q*oeNF`&w@+AL*M~$H+ZxiweOs{O+0Kh{0{GBR{&@7fExe@ zS(}7cd0y_KI4|8feS==&@$oH} zpXy4x%yKQ*@ED*#Q)@jZ3Q}njEo;mF51oYC8vaWD97u_SXd&^4Mui8-7LS5~Gsd)o zGl{1kxiXIe1!7eR7|^=?X+-+i_nCocOa-U(;_{5Zot5 zP*iW;#(~a5?|rf6LX|yNO7~|x0QLg=fhjFgRA>5z4$`6%Z|xxUQh*c9QMhdFO^ePk zJ8D(9!w>|;txF&Y`b*LDv|>6(F_EE)!!A>BNMUWcx)*fyz6Z<+L_vmE)}o7=&>cO+ z12lGpmIxXK0Xz{zyXIIBgFyS6>UDfG_d|D}81xz1YFV!w1sV*;o|bl1$vUWj=TWdi zYa;Iz%zW4NDHF6y?X0=XrC@is%%F8}2cFWkDn!&}xGPwwsaZ@CZ9uB(Nxkq^PYH^i zdk37+7oo=7L47zicgZ`KQjJvTS-%Sh*I?(Vg@d+L3bege6WzZ790{HTXM!8RHEYg* z_CsPha9Y#T1Q|$u=K8;|o#*yaX6ZEy7!04ClTCx?z|L?YQx#W7o+xFwyxx(S5VT18 z^nL3F&@goDzYgagbc-G2uYIJ4jwe6lUjVLyTT&l3Uki4XhW4s-N`d19>Q4>aE+s9+ zEY!y-eZmgbq7_EtjmKfOfT~RtkYBp5l(NW z45DS-1=$3=p|fBmi{J)`f_AaM6Jc|B2GsXzoHfx5 zLIegM=^g744j)G69_x}Lt>n6MwW~n}mA6Mc1|A8CgZBBV%z+uMJivEOao~=sf!Hlw zjuFj~t+@}~v5O@FTsTBGT#75ItA?2zTSrgmI;k*Fm!g-x3<@u3WzsMK{Te)GzNoPd z##%Fh1(FHcCGaV{DhYEVxI3i8Z)wp{NMt4!4l*{5pJ|1vZ@f=HF(xXeOofEX)Jsz{ zBdgS?Rj-kQ&05s2hG5qY_8&<=L=lD>7aWZq;^;`K#bPT91_C$?zH|iusMnCIS0x3z z8l1*?2!%j{v{ontfV3WBIfQg5jAr4gthflb)~E#$yevJiq$X`XYDAo11vW3>rdx}Q zB>uO9ef)IJnmBVHa#1fY%aoHGe4&q{`wM-61;rS|cXNf?9_ux@*nAfNsyzRT_%xSy z%ITQSJ0p%Cn-vLS!lJgygWRUW^+o{mc2cmU$EU0q0T-2*^O(n*-QM*J%# zJpcvvfd>X}dyGfA9hB##D!_o6@e4o*=`HGEXZwx6j|>p_g)j;6wJIzxLgMG9$wCY{ zsIcfW&fx>J z8^eA+mf(%e?!35BuHiqs-TJpyWgCDhwQZbK8 zmjzGHVpcPbO;rO05iTz|_i>}$`Ah#l65ZX>pyk*&T0GA6`0<4}O5fVyXCMj303p^GWi~#o{@fYMw4mS-wMs zL_RoQe7D=g`0ZqA2Wf*j6Mn`aQ(Mb7q7q^<;8JRd2G1B`nRf>)Yc##I)t-DAC6KgM zpF^?Rp?pvVAcooe+2_a!S@r@#>JOqqr-q7aN+LT$*I9MFz_A?hmL@dp*zn`*^u3G_Bz>~mL* zqU$kyk`T~Kux>7_iU9O631VklxCq(WU^;ZTq$U%Ez8Q5ug_@$L(ABHIr2f8_qar{G zKEnn=g(YATi&iqfZ@qcc6CYr6*Xql%EEgOq8FI1{BPvNaomu-(wTr|j;&Sm4JzMP& zM{UqjWUVDy0TA051BP(Ps;vVT*V5Wz-$@#?2Hd~_NaqUGaMU=&gyy~3NF~14Rc+?lS+*(3E^G%0KGfY{szD#c-kaLOh zNCd0c>X3VwrP_@!Mk~0GjTUw-lo8f)CMWsOWv}FN+`+Bp7M6x^NR=Rx@=dJcR}_ED zPAXDtV`E>Xn6wCsjC(@DSaX{|L229=3W>-qIII;?!^-w{x@w)1S$5dVZ3I=D+32#mgQFacis`n8gUz7JjCZJLp7*+ZjI{DEcrGv8&hvQn*?dn)04*Wg2| zZai_Sa5XyJ4Q$re^OIU#+WY3Ver36Ytc92gUvj0erA2Z1NNzcRl`b`vu1Vou*g}-y zvCYdPqWj}WOdw0;! zjT~2_tlY8L(oC^ei%IYS;j0(S~CX$s$4(Ci{b>+$t-31*sBMX6${p=7^1t*THX ziVH21VO|lPJ390DD)DO;ccxQq)PPzs1y-!rPyaq-w0?A3>2;xQ1mmH?Vae%+S;y{BR&6?*i+99{8GiK`W=f51`&nTU#q=s=GV#9IUOUe~J`m+Wfaoe*yNzcN9yN zD?8#1?TJDj$A30@G#YRnqx5dba1O$&tY8E~1`^7Uv;`;62q{POsLXydGovnI`*)-$FO#W=QXi z81fTDBbkU((Md_}n&u73*TS%b#lfqY0>a5aX}=~1K}s21eN|^p`GuSmVFNdCE!3$h z!EXQ}MXO_+YYGvrZa|X?nc{%uJt#nmF*m;&C=)C((qa}I|*S7WA7M10yzM}JQe)vLfpVFORCMR>o~T+am1ot2uYbWbcVQM z8C>#B!RKjk>3nC_wnt2D%Qo~-jeiPKgb=E+j*YB^h|RupSev1qH$`83$2CDRYhu+k z^EcsaFJ?!Jvr#pm0p8gtw`Ui9@Gwq=YrAtX?QsvEVdHb6-ap^?hvUxIemqqX!mhL1 zkNyuQHAr{GIw+{~H=`CxdE~`6_x_oX?WgBy_T;Zpx^Wh3<)}>lUVDhy^Cxd}3vZvU z8gJ)}(do$-I*{xanVnenS>dknUHrl7-wM#MJ&X9rXGCX zp=ykwHqN?~`|w@p)u-O!vO<1A4?0I7rmwwJkEeD#PEA#xTjT&pBKE{qWR}15(ZRWg zQYkt%?vVI4&MaI{`yO9P3&Ih#`C-UxgytD(r)Vr{7C0zxx2vj6GP_TbQj)4To^LF4 zY-avIVNU)j%>?=0mJ&@LpPcM~mbahojAqT^+0sG}NUx1}83$YF#8?G1Eb=2~Kdq<2 zwrF#(qmnViY6plJ@s1)G!?-?+EQy6!3M&RTn^%+*O-kA-vXwGPDu)BCQ&ov3g~VaA z3fk<_m0wD}DTGMy?vQ>@A%_*%3I&Hf%-7N+mLbvla#95fz?qMO5Y&8GxQwpU1UUg< zMHYMNtemUPnX%@z-KzS;)tNb*5IVt`w>}}-l%Cx`v+k#S4_&L{6b|txj*T7E5KX1= zgHjmBaySBlX5DPlq;~I$W*@S4%I=i zR3FG&1>&R04}`Mz36CVYW?oyI{anKXkM%b~2JU=E0PYO&zKs!8Vr)msMzDoeN~zbW zIE>R#ZE-OL$^uz!7@V_K!z$3-J7zk#)|7039omxf8dI>d7Z%KRV|ieRfeN+5HA)b) z(v}c?;$c?;uPu)6R)k(P+Icr$QXksOYJl5gjZf+S13la2yCppvgO9_jV;AS;YiC;S zvoUV@ZOr1;yh>~GeQd5EbM4o?8el+kHfmAuQFFBv%e)C+LCoV*7-<$PM>wmJ1%Dmr zD+nGp#M)Ed^>UZwU;3<*K2UGvmARMQ;{MZ=0+^d|4Uk~JBkbZarjwLOEtjiQL_rOE z@jz5~6^7hue)_XW?}I&nd9=*5&bKP!)>03d$wocy!j?-n_3EDGpv3BU$NG&td*f|w ztMnY60OEJM@rI)#9ORHKZQ1J3-~<*q;<)8OJR2I=NVsgG?T=FblA5wSbGbrLi=@%= z97Bwm2W1;~M4NO5wbjE#cWR};vZE0X^l-jt$5IB-d}ueXTR*rdnxoPR!GD5M!JT3C zoEA);{^5?#Yw+JX-9DDhP&5i)&K&LCSBh^Ed(PoH(QX#lZ1zcDYY(_)Au2Vytqe~G z8amS8SPaod;=yVE?q1tY(JgAH<9O>&k=0RM13$aK1d;fc-zUvq{3W8K$EZ+q#d+KC{=f-ED zbU)3L6WST5{AnH(-k~)Ni2dHaDy5Hi~Vth~(_Ks4A#5L%Mp8r6RbuwLwS#%XlkrGK=eJ$Tsd@w>C<|90hzfPSc-Ixfl~>Ns6C#97U#wMstFU+pS zq_)Hud}7Am=*!iFt&|89Eo-`_Q1HpVCZNS3a^Zf8$VO|<_?d;PAO(=otsl%K7MoHA zN?|r~0g8Dkb1K z!~GUga9oREiEbKoL&G{JioXXRD3dl%LW7!3%G-F2Enr4WvxT$E1C*dNR0!a?kMJyat{ zWTnp6>!o!Lpwk)Vv>HWegTB@5lbmm)ulkw4i771`wqBeC8{Bcr?{oNed)W44Jwr;a z9tY#1ydxY?IC(!hJ{FW6p~MXI20dNS%1D~&9MdsHJ763e;Vir7Z4;41`m6z55^0CG zM9k1&RK6M}DO-;i^58uid1qbe2v1|1mJ1^y6?<|s*r&Q{c3G&gv{;6a_^hh&9178hwJaL^yb()1`c( zpx(uO#us>ToZfYMAL>AH@5E6k9P|r;QHWB-yhk(9b*LuQF;crfjozcr>SwWTy^RHo z#Kl`zOU*p>1g1aW2~Z|3Ra~t-vm1%Bvra0bmFx^sAEha{WiahSA1DKdj$3_z)N?D+bN>zWjPzCLA&B|_YI9j4a&hFBpVUms! zipD5@Ua-sj%8$l$wiC+z>|&c=rl2%xvIEL>8+4I*)Ob$C4*X>TWO!La$0U+)Ljwam zR`TeD=V;A5+Ybm?R|Qmgqy#bjn`xo}3D!$XNKF8^H>{d8DI;zFQ2>bI49`9woO`Ze z<;o?fNbPb0Tu%wsOwok)shud*9MXy@Et6qX?}@H9Md~kVQ=`f-Iy2#77v&3Y(5y~w zS;=3?5}|7H!tdHE8w9IoO1Q*Yt0xZ+bc=2@Xr z*!3vEjf5+~Q8f;Xvx_>Xa0h?=IY@~-ixM7Pr&OF+PQSmsr&JU4Mve8ZX#96$Y@jOc z?yhzDg56cX!Zt5TJq*WhdYUN){{5J|&SgSK6ahE+a(>J}L>#nY1}6xG4^Y zsVtf|HEY$g9~}^76(=$70z456J;{!8E-43sr5rgvvPo!oUc_4gxHz%VebEy-RKPLh za56AT$|BQfk`vF;NaVm^J&Zv%#;3-j>hu+krTJos)KHKxG#=}TQynL&GzSal`Y_rK zGrY@&C>*>i1=n+_0J4&FW0XSo4@;qp2L|MEFnzXGbxILT%;pjJl}cQ~!X~W;&Tw|Q z|M&nU0}^c*M6gDzI0`6)r!XKBd7`&+AsAfDqE0upE}olL&NGjuQ4T=1OBw=HEMLIz zWD%p^zdF+SGK`CxHOf<+L|Iy0w2!Y}gL16>rizWi)R)gV8A zBG2depU?~53AsgyrMd-enGb6>E=z<8h^e&O|zM zG!S206D7M7!BB!GKIv;*`#yhN@-zsYw(0q1s<9RzU&lyd-bkh3wwbW%b(m9Ws-d(s zLImFJ51oimM)LBHCR^gECW=J>*egU#)+J!Q9ZSYY05^>{0nK8HjWZa31;-dic=^^W z6jM}W*gR=6T|~<3qqKFKpDPXs4yW@$sPluAh7TTL{{}m$^h57x2vw#eraP;U+lgc( z#Dc7kf0;W^=P9}>u8?EnXb7Q!;&Q>U6%qL640}WbRRe-wIl0r`!7r_cugAOrCQ49_ z;C4$C-z|zo<%tlrQB*Oo4ztvch81Hdf>n*6b3y2s;!ihoJs>*WY9U;{KG{jnUR~|B zGRY|CckH52Ne60q0oE(&=F^?e$OkL}ge*;%ih-W$I)_BfREzR~m z3UaBux#UKRxMmX=3!@QX?QkAq8v;5dir|~&OIwp)S`bZ~)mv#)K4rPYhtvtgpTjr6 z!8T|S(>hW;f*f}&66UAzc_n*~!u%q9&g@6S!NLHx-30F!A?>~{IjiX>6Gj+4;65vr zHaLPG)+NGk9A4K@kg|+X%fy08XAPwK$gJyH9&1mCV;E#e$};HdAZ zP>N3tV>qp^TwB%rAej*! z3Yid10cWg0PY2tX1=I^xHOU*(L@b6qum*~DRk7RkvGLpZnP{z36X#Pp=uEd2HO8@J z6d7C{oO;$lAA`gsDkd!=W@$R#z5xgc#0IG;U}f&=7%f^o@gg8?6|YSdkyB%3IZ+&c zbH>4sFhcK3LT#ZXE1OuEMfIDzlN*(pY@^w6NJ7ykUTw6|dE81D@>}3-Nm-OiZj<=GSU1W7+ zX+w?VN|MN+u@VogCO|S+gYt$Unuib5x;huk7X0z(46zbI9%)<4lUP~EtUJmAxMWX} z5Uu`?I*DA4+qg$T0K&97(D4-yeqvGewD~^4Ov@+;a~MH0SHML~IZHFL4O~c~OyLOK z8$tjNdV=t~NGiIm;r}SK5Ra6nc*`@Z_%0cUGHFh?t47C0#P&aJxl%x)|A(q**??SL`O}iR$G8-VXQiAY!-|Qcfjp}@F;Yz zY-%H8aH~$?yQe&b2wYfH=_X?y!)nifi^YeT!+B%=;TE$z%ws8AO27D{?1LD_aN$}A z2i|%Vb`2DED)L=8Hh{bNip&si% zg$NPgVm(+0!~qCBoGo}zF!u=|1D1#2NQP%Ep-$+#^F!jG4uvHMMG&G83NiwP(^dij za0o?v_9m6qI|ztDFm`|l5>z091Qlu!g!bI9JiO;)XfHoS3ZPUDJx@zTKjq6K|5G}z zDx!bZpd?OSCc&xT*cz~>M&f+oz$;$$-*lC=T! zja8Du>F}lgY?qmtHq%z-$(@&3*#{UDY zl9ax4j2(xxl_=|3ZC=fD=~at2$oX86W4nupO0ffcO|X>GEYqMD?XW?=z9TJB3mE@XEqFbh#H+K zJA3#EXJHzJ5*~G8Pj}tIqL>rK4diI>>_Hcp?FJ0d?!)pc9tLnJ(g7i7TXJkga~;H1 z_A`xWP#u#c^FT2I&I(?^ewL4*SEgG7qg^D%Gz}7WNw#80pAnwI4xlKGo1&#`0waQ= za>~v$ukerFpC<#cWp9b-u^45s^#o*N!sOphW1QB}oD00sw!@;0^fOu$c--dIm}9LV zt2y!y>UKgI(O62gfz3T&iKChYhTb@*8@o9l=C&g(c9~yBv!C&3!d~)Uvd>Qu(x;(y zERFqb)(#)L^~$pwU)U?&jK8f2{f7_I$`WGi+(cGJa@ZNQcs|inGcK1hZK>rVyb|Su zZx#wCu;ozo^nzGXYm?&8s5QI2LFH&m_nAu01qe`cW4|wXc(+5;XMg_7lcw+u^8n`m1(o9A3N&7OhG()<RB1gFI&WO%4pJ&|qZ-nTcb&5f!K@!G&=-TEu zpj7QFL_LZ84=BFF^`JHKO#$4H_x5}Wg@xIBQTpk`8tAej41>syz&U>)iksE(8~|#) z<=+=#gmUC3Q3ukE9lXbCKkR}$V~{zJ7vOroOk>3d<%TV}!MEJ_G^g0v`K`=+o^oFn zL*S?JPD&0Aob_>NxxRT09Z2l@OWq~;ge@u_RG@1hL)|i1ZS9@;*H7?;^xPjRu-yP> zr;Bf0LB2PCLe;Jn@>ey)4+dUsuz~q!L3mcS9q=0(Bqdb2)HTd;om_#R(U?c5+5+5+ zB8H)lY-9=R53cx__F82@f}>2DHAjEo!vnD<-SC*ghwm%kIN^#T{ItG9DM^_}qI|~e zEylSO{LbbdMz)_>iM()3z7U0fk0jW5RM`Ab6F^jrxP zRmOf;!ew&pbA=SGaROijdBTnWhIg?Je~LSiKl)()yF9%z4cEdIR4HiS=nU<1qXyNb z)!erMDTEQOuJ(qo4*nMi@r+bU&;}b?qK2HH-(T6QsfcB&$g4Y}v6F)YnK7iS5|6!h zYScX{cPjCTa|5`Yw#uiXWg*oLo0{A9A25ycDIzS$wt7x$^?L*bv4;Zs8R9HSL7t!N zAeJPiQvT+e`#h<)E4rU~7Fy+Bl!#;R9^O>=nBeF_7?3ev#Ha{iHZaX5)7A=Zm^-nx zAxTDID63HZkA`~OL32;2yb@Ws&VWC|81NKK$|v6_HIQmWxUyHvLqZSA9LWD*u2P9& z7#Yf!z=Cie@LT2CH3w;k;R%|q+u<5j43rFT=7zVARdO~&=Pp4EJcLiyD5hsFrT%)V z9|ywOYJcvFh;PLFwN}Sl_%3IMH4y6M#vdM8K6iScMfYG0(8!p)dmgCKBA_e9?wWKC z8{Lc2W02m+XD3S}t?bg`ER*1`k+Z0YWOjSu9V5O^+0U8{)UgOLS zAG=hmj0#S!r{}+Rp=e{oDOVg*o#=0S^KP21!3gjcJ)Myd^?12$4x?&(F721mTCw8P zGLIbIyn;!K8^;ndIHO<}3M4^SD~P8t<~O~`sJ`)P@KQ*O0%?#Nq!3qX5Htc)c5QBp zV;@YQ2d){>=*rFFX6B@Db^1po!%OEVIq;bxH4WGb#p33I2QN`GQg+ppr(>i>k-Ts4CZz#1;s+94 znygf^HE;`SUTi(3W7BFF6a~$|B7pCNb&Zzz0oJ*=?J6**?<1bK?igECNM3Y!SG6(- z5aSxsd?#9Bw4%ZrF&`7>k#B~GuLKET2s6Z|gBfI$`xGwr;lcbCSf|uC7z0m5Q@ki2 zl`QJUC~vEF${nSgk{0$l;7z;)l{2b1B}4{`$-!dApq)8b#1fQQg9=+vX1A4!C>`U5 zH);fBacpE5!|>V=wCfBa%?~214O&_kgxMIhv^j{hK|_0kmi7hVejJoN z7F_A^pt&c4rk)J0^iL3W zM4YH=7PHq;Wh%slF{wDgC_nWuEKc^55)W&=-#Lx8AQw|NK!FW>VjxiG7RVHtew>*g z27zEEs$>cQd$4Z&8=P}d54c}Le621MR!$IA#1Gx-ymL2nD0qWE*&hQ!LP$B0%*f2b z%Er#gz29eM+H?|1l_o=$?64|SDpukmW5qA;vscaEMa??hH`tCP)0gKMamIpMSwEs{Q5=^z*w){GlcA zD4}8er9PWHmx$xSage%7P$9=gv`4c7snbJ<6fSN(A}1R<5DS13nw`$b#KM8$R5P07|6P=$);{Y)K9n~%0`~lLHaD5|m6#!xI zgc^Vn0iT%%1P}oDA59eg#TWbtP=OK1%=TL%)=0tVK=^%kGnpyO$BJ2)#aJb4VGGy; zp>WC9U)2T70B(U9V4oYz##9zq+PtXxc`IpKTOWSZp8rc9|NHX;F3jPAFg^~G+I)HL z27o3ce~_i)yN5DJ{k@_P0QY|%0zMXpo-#$vOP%Ir-S)U_$5lVaHQf8-`Fejap^OWu zw6V^IqO9ts?P8xoE8W`G-hsmth$J#4G>l3Mr!$xl>mpg~sOT6Dm&cD42t{HEQ1jY` zP4z81)qD3H*njZw(XyDDw%KPK_gxt$b{!p+d;xs-6&S#xDlGbGr)0`Twram^ZE zG7w>!5X)$Y$QG6r7O`7olRp&7`3s@ENK}|lCM;m{+d{}f#svFMRag^;P^szT!&$~A zM*0@5W?8m$adrek%vj-cE-SE!g@SCNA%iAR7XY*!c2 zeq_TEoKZ?)cGfePk&P^78f?1!Q;HzhvvkbJj>8h&OS;C1k+-bImT2B(0X(8Bp+$%h z&8ki&Nre7SsqZ6r9RSc909^v-9Vq%w*%mYC`PO2NJBU2-NUSt@UhWEfhX=)P2#x~b zZZV+b0V872abP89EuhA#fq& zcO00Fg<{QSAv$=Ui5Des{clti2K-T8$QmZOoRY6={bH8e#w zGZ`i|ltg4R&I3b5W4jeBAwR|mkpLqJEPO7RUabDjK6k00=g$UwWq?#ll}UMJ^GPx! zBa!8eT4!j;Acy?_uZVNrXCR@h9AfcdOaLxA_7S7DU{e*+y0yAS(!BUlLcM&Mk*i-& zpRKAOumpUTe!_xb;8ui=f`DZCqXecau(nrIe#ExW2T51%RsjVAvEagVOftojNY>XM zFV(w+UnYNjgsEe0`sHbego7Pid)5vzdRIhWw7!%c2}4T%=sZ0y`w5O8)Xo-&&p|{m z$DXgt6X_wZT()NP-rOiXP|{Lb|rBJn#PmqquZ4$PkSv& zokI#yIT`?|6~_lTV{3}1CaPfv|2mfS9g;&}q>4$QvSK>mxEX=c`qHFNVrQXBzStX@ zgSv&b&dbQpD>@81O_IahT+QdR?O|?c4OV%9mUvmL6fNSs<(29_n_L=2U|~p&p@7e& z*3VP0qM>{289VXTFO)zCQwc*sP~{ohSr>6HhQK( zQY@m&>x42Gvnlg}xam9?wu9*y%F0Aot%MzQ!{9m^TG%SEx?i5<9O6bG^?Yn0UV(@( zfX*~?ih)~oy(0Ne>6~1BHgyPXD>6*FVvETzwz<`_f4J`8PngH(2MldI)EK#h1vhAk z=h^B9dQ)k$Ks74zWWiA0_b>1vQ<%EX7J{o5p%Ak`4j-x4a{`;b%?qPxV(8n<2W#%; z9S(71ZdA1}NIld>bkI@)7K}q#s_UspA4t=gY4$`LO>T+Bho~pvmlBk-Np3^*z>;B;41)=M+K&*LJ z#Oi2GTd=T3i89(5j}LZVpNI$Tb`*y$E8;Ndx3y_^)fpN55}H-R45&cG=>uSq0fsYf z%1F0&TsPGE)r+g0Rii}f z-NgBvqswDgrc5SIKK~J^bFYt63lUJ$(F{kG`RNi#zTvFAPy$=YCP*CF~N`M7lxFflaz-o!i zE~|@yMTFy+UC*BI-T3gCKrrfQ&i$hNN?eOX;f;|x$*Bk@kF^h$+2$VZmp5jdq?Wx> zdp)lO6FbDdBCoEtT)n$N!&WY{_~nbv^GWVoYbq|kEbX#E0K_D?TnytkLSO5lM(aG; z_4P=52^M)l%okp5uzyi*DW3zEU`YZ16p_N3Cp^-76@B367-U>^^_O=(|NnJ$lUtNi zH}aWoyWQgy^R7G5jeDIwsGa0y(?>-ZEX{_}9Vwqr)#!VF{rV9^iunAAqT+|CZ^~-N zF+DZ{L|FdWHc~xzGM~mjfUN}{4A@Cegc z^w2S}f7O~cv9uU3EQRw6!Q#AJpfvt(Uq=o-c zWCJM&Ct}rhjEMBn!gM+wwR`46AgSK=;2Z_8$07}v2N3Sb-5wqNBUm+QgdC|UA+5Yo zkV=pi=RD6rsqRt*CxY_o=~-?pC$dwNlbP|a{i_CYeKgH-51d zx`&{qM!JZk-N#76WJIv06r|y;+7U^mC^6Se7=1?QN;19?raZJWy_Jc|m{nc_J=1cU zrr{F$Von6(u`qV2^f++$AnZrV)NI;#ylYE*(} zZen!(u@51p{|%s#U0F&#>SDR+>XKO5&An8(7e;}-gopN`Xz^a;++t^g9 z&LZk&&|rLu63`jNhY2FCwVMxnS3n=5=g%UrR>n5eDIsR8ucg`Vqs9ZIk3WVR6KA>{^u(6YOMu33&Ko2`kyoU-C?4X1;KNgJP14F&Sq1`5=fbvm@05r<- zn0|)PGT7p}o6@96WHQ9mQzd6GVYz*&kk5Brna~ARghRwwgkuCI!|l%_r`bntzaEo> zFoN*OBO^!@K6U-|(sA~g>z|jQ>0qe2e*zdK9XY4ti_l#y<>>N?0_-W{0NnE0M1slQ;n)dsnj z{v3Nm|L~=Y{gV*`6MuhnXa3Hu`P+fHh03lPnx)MXh(sFEFy1>~Zd~qpd9mT)s*Yzr z%ELAbk@;D;F@LJbn&P;mu;6E;>UYLd_-S@Yd;+P!32Nm7b;3LP$K)$ryrYQN2uG?Q zFesc}#AF;{&$nT7+FP&gXnQw3tETPEkI&lPW!2I<&hI#CZQ=XYfzf`x?x;3M`m@$B ztsliN& ziixb~a<6l@P8YSMq_(B{DmOn%vl;sFe~BAq3HAg#ZLtQRi{Znlve$d8MN-tZ%*&7k}NYgg{ca0%t`>vSrz_k=|y`EyNtw0 zj$@09bA)Wdej$unDwIo=QYNoLRM7deJ*iO0WF&C}qFf<#9bJ3STpf=mFGY-=ABFe@5q>A$U zm1S~z4q-Z2b0PNLsw1mYL8q|8QR#yqeDD?4LhCCALZ`_Gm@U?i175Gbm}rVm31w{F z2+{lxbd=vM-Z~11_nRBvfmH|W{QgO*t0dy;3P1ozDodrZYGtx!!-iEJ=C- z>yG*maC@ST&*&b1C;*zzS~ywYyR^Xdi2-0 zbISPjJhT0;r;RR2su;!;L{Rhbjw{c5&z*hJ5UHdh@rb;qf9mf!;^}*~7>40YEfdn$ zy5w*J8+qnknaKKUguKPcGT#GT((ts6bj1yZqPD4CAlF2xuOHuEq)HfCD=93>sCp2J7;of?~Qi>tAZ`lFBjqA?t$8D7PSmu50?{&GUD zS-tslr|G^UGlYMu5u|sgH5Qeqji{|kg)$&@No~bts?A@jHkTErt3R{sR<7zf`a&kv zdk``V9Kpuat?pM3S!pz?m3ru5xPkGo{TGHmwaVp{3{M=fa!Bsc=~<3=hHz`d zzCbz!w9Flz(EFz!jAfB2WDYhv1U$6t_Wb|aclW>Mwu6q$)4YVX@r%Mk=ut1vdbEevf5 zU+b~-%JQGEK{7l_97h)>wr}5&*db(ygxYKpY}ok2Gss#uA=(=H5_Lc4Sf;H2w3g=n z?<2kpT5-BE^Y1-#Os<8eG+j$=tgcFH>1Cje3~haXezSJ?C3|cp%_|gB5<~2li?xF}$FuAN z;B~S0b-zX672jq3rkLTx0GcdW!nzGwMt3FW54=Jq7sHabO2nyKt19slDb)_X+p(ve z$SywH_u$55sY1w?M{^{Zf&@ATC&ihW$|>=((6H{HkR4&6pDPc>dJi-FNne>XYyb4= zJ9w5(&6{}6jhRCNFu%@Cm7}eS7I<4oIK%S;tesDH6plLvS|lATPA}>#FjIgQ@^hty zyZi4SScuzjyfu_1il||2iKIt|g+@stRM~0qAaS-Mj_I4PK)R5V7|oVu^5smlrM8Rv z5;?i)7&th=9GnyN8svK}B<*RaOWt=bX&-|v0-$>&H>7%|B6nzU$ou)nlh+EtRe()7 zP?6TsGYtq7ZK2|-eSua|jH4*yl}m zH4e$hEzAlcq9QqFB^~5-9!_?b!t{IXcCAsXOZI79?SGSWqW@ngy7p_EiVFjqGUXg9qfNQk^COQ+~XCRz^0 z>zu_1h^7s`XQ_c-bm|_A#DMcUUgq_rN+5%uTsAa)_B;ERD>pPkdMvF@RjY3orpA+Y zQX0zSy8dE+dvI~AFexK8 zWyV$l#7ameKe=>xD(4q1WlM_Q^qHSKDas%k;rtehILHZ2z3HwWyC}-QaMHOFi#UxF zkvhg(TxXCdee<|<{V}D()@0T_4nkMy@s^KOMq%p+=T@FE;$p>k8SpQO4>o)V6 zKQ1$N5iaQ+u!zn}$I0GwcodmW>vR2}Ejy3Q)ss7S)@;d<`I)kM54W2m1lT45N@tIS zNIL^jw5!;}x1rE<(@%xbEM`M3~1bVPZfE1&KEnO9rUFDTrUil1(#mFIhq&!L-OOCWpg>5YmxlNw};(hO0@X;1X%a36ezc)SQuxc zWo4pWM!iobmi2(`M3EqfK#Ib8+nuJE4HAy|w(O7#D;iUf#`&J|GI6KLmBlHH~_f*p8XwuZ45H-eP!?c$Mjr}E_-@A8CR9x~zq~0r< zFFCk(#fm)#iswXo_p}JRZVw%6yu4edYATx;ROYf>u_>jt+SL|Fn{iD;u{QFNwePh6in_pBJ~V^#dF_{KcGJ8Zgj)H&fQ&418A{!+HQFF;U?S6tbJ!&dk-_P zA&*UALFbptLp1$wx|Bus@(jO{cU&!L4QTrtN$~N*u}5^i8g=jOM#17r@&8XzXQuG8 zQ=y1_OjI-`n0-7giXDU*jMsu(?XVhOCx;e3^L+73NmZhScF#^g) z8I*jr=G3YO1ovCWHJ|OAQrAXku>QUGm%2GcBJp|5eGy(6!3HR2Z`V1^oKv;iwwz8* zBn$XNJt$v0kxR|ERKBnA%H}-8;z%RbZ5E5PYcH=T>HZmxG$U3noWi4>*RF(prke<} zs%WU_uw2kwT$IXo3Pak#%A~Lf@C@X|$Vvd#4KFvkrTyA}G4+YHC$0YJV?EvXT1p#A zgigUGIMY!0jVNLW8&h(K;f^izmZS}4HJ?2`o-`Y7xo>z zdM>i}+?N9^3@@D+K2cC`q)-t?SKw}~bK?`K@-th5@e>-iE zck+rhw@-Xitaziibnd1DOtGHcatd&t{Qq#4Iyhb1u8GNl4Iwi>Q$y4G^)|9|xqeC7 zp!fhH8yCc-g;Kccoht)5qv%pkYq?sp^Jbl?Hkc_R(t`u-sPJD))@GUzV_(p3?~MmB`|I%c^AS`6QGj<91b3kpC~Rk6?B%Mgd?d#VHsqL z!%y1AwKiYXta4!OHtS^lWV>x^rzq!3$&Z*ZAxh~O;y!d=`+9sgvkzCi8P!U8d)#?Q zbAoEqD5BO29At1p3k?;Mo=!+m@cA4%id(HQSC73s55FR zCfNZxC7k+iMzKkb(1BcAUkk%|OtCo2>`Ek*5JEgHZm@S zrZIl9%cfEGrK{elg~Q`;_wVBZ20SzN;h&aFh$Gzc9iiWjWoN7E%kwuj+;rw5&h69D zbVYeXWoA{&jZ}A~rBIvCqAGXw{Mf-|k@Bv$VLWGzD0y%sAqH@Kivyn^Tl9k*+mv;p zem|6T@r0$=yGfZY>MF-mvX;!YFu|v8@cGx08N`B-#={v4jkkYf%Mmw<3HcD8{C(ZaU^zy;dXfUaB~lIda;ORX#9~TPL63RggXV z9$ZPwauWw*si3TqLDr7BI6RY~XnKd&C0C%sbZqVaU=4HHzseKv-D(+^W4c_sYMn(V zeJ%c+lL|1d%ys`Panqe;#Uf1wRp%l}GBj38xl8__3^&o57p$-9&3S^@^{U=fkk1dd zpBz}9wrw0W&el#wl`UyG1~ktdp4R)L?-e49q!7hemLKc@^zKmc1?mz!d*j=uE7$&! z&6-K_io~S&5TB40hsBDt_wJ2zCkNS zo-}6dO!sK{L4o!>f8A$nPiyAyWd5Z2C)DQgu>@^$Qnki#&tY;`$cEFkgog?hcWl~3 z_~I)i>I%OC65;!?a&442LhSMpEl>HBR^FdmbktlN!AWrrgY7yanQM1_2e5CXP(fo~ zVv-|R?VgLE$?Xp)SQp)&ixQu|dGwz0tac1LqQ<|@keS!YA^Yy%b6Uu8=OQn?vAHNU z*uGaqKEJ-FPN$Bn! zl}pPO|5b9=$diNf&O{B~Ya@_+*l?Oeo%$<$(Fx9RvYe}}%eqm2x9^6WY;&T{gfY8! z)boY6amVkM?uzu3XyrsnJ*U{Rk?_f~Zfl zPeL8};8391wtM3n#o>O@s@$xO3*UV5Qg>YZ?sX8o0&eI3MWggQ0?oP`S2$Kg=)91yb5-K*bNWm_>lbNqWJwW`DQTrG z^VQR9s30+^0PL>qS9=XSr*`>b#XQ%65 znN)AOZD_e2Z9u-g)$s2vY$aXJ-AizBNAKYt_tdDj49aAgt!5(9TK}tYR@!j=W1QVG zeYqAcdE@2v+fGq1|r?~A+>PA!LAncz~$+Sy7|S^+M|i~?qBlG?7+1=3s!0Jb%&y$w+#(B0@v6?p_HAi7y9151Ps;Xv_tc&XEN?h*GFo0yd-nPlq=-5<-g+Z4Jl4QRST zgEEk%!;>S-qEMg6<6mk5*_ZCf%fo-O@>!SS%PS)gYB(84e>hmH?mybxrTo3quORmU zD7`_=IJ_j#?B{t0>ggx@CanrTWc{hC9b9H zm?OrCtY^)G5gjtL0Xj1}8Zj|V0cjGOhN^7xO!!6=Q;xd=1lEKWhz0;%qX1Dr^Pmvz zGNl&eLZ*sLgCfKbO$CcWW}iw>(jYs&APuFA$TwmT4<0e0TL3CVDIE&S%-H++)?(<% zEEhnJqQU8a4uDHWZ20V)EPXW!=5ogb4VP3_*Xs5ZHRj;dDIgwZ zk%@!}M2tWlVu9;&s=f9riJLwD;@b?VHL)XX|M4O^})oq@gH{WoUsiH{Shp3j#3J zGl^->2FUN0 zf_Gc&U}k&;*+zt8yuHmmtLx?!arf0c%w11|Ks`6z7fOut4)Oj|Q(y!;pv4r4RMY|7 zAf32+I5U|k2Y_fwSZSy_6a{ZSoy>S#r=ll}Z;sCHk=B~)ncuMgfjASO*X4Pfl$t3% zf@>hrmx94Q+@_>h8m&cK4qbZ7y7Pvb#~xB$wt=O zrwD8e{Oom9{ONJ!7t;}1sFjGdrV%TbkFH}}^=~V+j;8#@dRe#5J>=FM`5!w?__*#{ z7aCR%5cKjR@UZ9NWmkX0o8Nwz`%^ruems7b{@Z%epO-LkxUYU5_u7Hbvg0h#asK#e z?j_92!NasoO>{I8Pyw}WY8#rYa!CUsVwOJ^Ce|Prado|?30&&pspjy$rb}y-bq76e zX%vrkwWVpxpxl%svQe_B$#da0;GXDCL-L^v7KUI^Y8tEzhejeScI{B0de11!m3i|H z8@0sk0#%O|37FgO^n8xcVYJ#uQud~zxoa@tRfVM_4i=l%28#k)2hFf1Y$oI&D-U24 z2skXlvJ|niV~eU9P!%%mSnUnVBa!_q?sXmyCaY-DLQ|w`=q)@sPFlOSM-{uX9hZe; zV$5sW5HP)tX1Sfa#uUk?7!EKb8ule*sUT{{Oi?HYfz?4-nS7_6He&E-xB8(mw9N#b znsyl+lzaPLlGr?$WK8gQN|PVgg$LSIBs8KN8OTN=*?MM5TDT0vE{e!T8QRa4jeqB= zr!I3x7aKG|IEB1MH}hrS`sRVM7fw0s5ru_^;d$8|QW>6_tb<9E%YZSwlb*^7%WL65 z+;SrCosdGfTnc?PoUR#5^aQS}`j~m(l$^mBDKT2@QiR?P2Mqptlp^qHLb+*aT?FrxR959ca0$O^6bXU#d!{B@7cY3qvtSpy3LVNot`#q?%E6K3Pm@1bP@>2eUdNN^jZ??(xWg8Iis3LHtr=BR?-1JR}o%MhfqvBE9y zrnzMn+k4w0K>Cfi^;Srn%9`;Q*^=kP>F->6sfULImCuVTEDA4GQ;Ur-5QMShFj_rs7;C_W}s0 zB~kX66rqvAZjcB97f7j-T&c)n{c9_u_Aas_c@Pa7=i~?nCV47&<)jMNlV1d&-52O1 z^E(4?Hj86p@rtnRSK_b#-IVc{?{3|tv4coT9@chxWSA`P@R zv3iQ+o2lyQi5)d3Yfp<^5gt4eupzYLP)8cm8M5`V5YYyttoo+daIDLQX+9+$o|!#T zb?XD+_id#<{Q`l&qzsV&Z)=xkCXmL$)I0-KJCo@zf%c>%(LW%H$%$pLcwYg{tDl>a zG3u}^iiCqf*`}w^v>%?fIpAY)9uz-0Wm8F1yNq6+t6g{Fs3IK!En1=UkD(Z$&=8Q8 zV-xizFU;L;vz_A;B`MTZ3tbM)(N|sgCUp9>XUalIu|ACn43DeVqZf&Zl2YY!3J#{o zj0q#=j>xBdHy;{LdFcT%`*Z3Luva9KT*KLf*HFDbwej})_EW9NH|~muCqo8>z`4~C6f+}HNE8zQTg7qfD#EVrF2LxI%#!$|gYaaxwD1p3o{0xtN?Q}}a z98^-_^UwkTOE}NDV&$OZLqWi_vrjr8S-~rki3^)3K*Wk$IJ4B2mp_I4>%5D9jba$s^)lm4eCc^e6yw5$6n-BW?8UX_9B3E{ZXlOnBTS~qf zs^&R`dhKjFD+&bo2I^2xNKdmJC@_jBH9Y{Cau9qk=>kGBp;v%}jMuH#Zr#sOuY}P0 zs*Z%JGCPzz@+oe3Y9pjplbB>SLC`A+fik{5q!4*HA)`6zZb0Al&{XSS2@+8@9Xb9S zjsg(jt8vSEro=*-UHanZq+=y1ZH1=$ePd6kkyu zrfZ}LY-L_yKLtCQAQXvAtWTUW(TyRYDvec2*}_y)q^CiEh%l-O?1Ty{2_i$BPN%bN zHT{yS0CTGOuL@8O>}6+*;RF}{@xKGiN$rLH)EvHa*gyaIPf_LSw}=9*(_@+Zxno`w z7H|DWuIvAsCha{4(FU$(1NCUZTuEIKFcqJ+ zIQTXSr^>KG-jtqXTZ#XUOkM9y$Mcpw|vl=kc?}( zO|fJGhRu>3xUh*HSANK45ddATr2#N#GC`S{9G%)I@O_u!EhZ?bOfF$Ml%(uSyg zReH4j2^QqB!d4qBb|rNn)dF-~mMSway=3~cP@+H@8=O975b6RlQnx)!Utzd$J*>uS z0*qo8amp3~A#Vk9Ofo9MGPo{QBT+q#a53K<=deOB*TWKfAJHcQW9q{&mT+|mCwRR* z=PE9M^CH%+0sgJP2+YBuFL$0hz5#`2Vi8awj|{5Y)fHr8qd!5{52r`^r+c6jn}hZJ zQpZnn^u6z?wPv^d$~$mwdxtPjX7kp7=*51R7k@Ud%ZP$$mAbx8`6SDz1m3ECT~c+- z!Y?)%&2C+4xRz6A(6nWI6+ZsR^ye}TbE^r>6VTrB2>9Ul8Htl1_#kGiAxBuYHdyL-o_RDi1CoY|5 z{#(+~{ddcse+^3W8(GgCJu8PkUYc}jKaVqiIx$>9U;x2_3Yq3-csisc10gbWIkLAq z8`d;*4J%dN6+a7zDc=6LuD`uE9;J@2WFFt><29P{Tg|efpf4w)8>n8y0$$*Ln5))@ z_v#nrgO6h8C&_pE^1Lm!bEhirFJJ%cV#fy#^YMpshUR0N`!h7r&o;a56XDoZc`|xw zvq|9t7RNxo06#5DC80FCa5lDJdz$8y+bD(I(dQS_*P8Oxz5F zB66^kjnA*+*e>qwD2M1~u?z{E3Sq9PVn&H6i%9Zez>~<|N2r#fql3y|PqDQNW-KNH zFYKa((qt4VV`gd)%6G<2x&U>S>1J)7m(eM(D7bxN~d{a6g_j%Mmru|OFB<_At~YDZNa*b zt1TKpa_la2p_FC?fcyfiGs63(XgY4&wClN7IGkKv^9+!p?}e1tfo@Yefi5V%EFd6d zfE1X$P1z~WGgjH>CT?ApSsGT(G zy|{rtoFLU>4r5h@B^XHvtCoJKp=ncUg+0_QA{;+SLt?$sXLBnMOIdH9VuQBgMPV!OW$Dv2BP6Qnaoj;+i#6hADI5BA45#lmIeOAqMRT$w zkYCU#qFx{Vikpz;PU@iFoOTr5bhnnNq z?CV2Tl{rl+D#PpjLKM9Lv@$2)?y~r%b|tQHk#z5q$@?12LRb)_P9mFZv6X*h*J{`Hgl)!&3%%; zH;MvWZjp*L7G|%KcY{fV`5!>{R@Ko~ah391!O)K}^mH@^Qz*)*l(K8DyNy7?{1bC2 zDg>iCEc8@NRo%K-f)mk{k5L{)fD-|??ss6r6C6LKBXcSCgThq-TJoi!MGRG`m6@vs z)v|Mr=KNY-#6qfPXd(#E&nHQlMhP=Okz~?73sWvFCT1cUHah*lWK{KAIy`x-8+*o; z$-+|5%&m(WNSCF?p@H3EWvwzB^KxN~($^vkiNRPRY8{7+?Yc1H*W9?0n+-vTjrR z*vdUZeb8EKNO{LG|0+lSR@J0)rB!O4FOT zSTzbukIDt1+-McQH3f4!#lti%*ujzDvwp)B-<7$4T{|xHg?WCr&`<64NY{A~d~fDBxOVV*uYz%Sf{A7}T8TbbX)E85*P#f*BCbQV?Q_j!OuXX5F5D4;KLN z^9Ni3T<1b*?AbXxBa$J#IZn~TQMYxil;(8v!6L*#;%MSm!Nd<*k zMUK^vDYvz>)PMFZp@>8d+N^JzCnXP#EBPRp9HYCp)y=_9r9zOg;?K)yZIorMdp_rJ z9CJ?%an1uv5wqxTfRci2jz^Fpu&e+4px0Zi>tOa1R&%`M#ZXqp?HQ$UsmbE>s7Rsh zJs_6sne%pp89+Lsji6G^6jQ+6>=2S0sA?H>uDh>Q9xgKq2m7d==_&aq0cx=k8h7Q} z#Q_r$?Cu<8m-mCdJ-E}o^PObJxhuyqnip8nZf2%XS&BO_;ARu3c~&1)k*6uu2Buk7 zT47o9a~RjSd>Y$Mt~H?acNE|5kG+F@j<(#Nt@=;YYmDX#7?)XG`VFs4Pqi+Oh%L0W$Ne#9W zN*?{F^>ax%&f@G=?1HW#xJsXOI;T(fn_^4kD0)RhJaBw%f^2*m>pvAEmGk4JZ8Q2F z{hkfqs}uONTw1v6Ap7=h-z&olfn-;StaU-kMVVEQH7y9YeoIZp6kJ7TZO+j~GwE9g z5X$!#TJqwb(|z*9c?Sf_!-e)&tr+$l8p`DlF(P@qXCnZs)htArs|n~m^7@9>5;F*j zxzM+IB5=nPm=$7xowoAV7@8aIxrogsohs&jUQ8 z@8JqoeYHMobl*O#($%{Z=c#A5EqG6%>NhSHXI$5q2AbpR+&K>{>Oel?Gm~{)>VH@b z3pCFtwZ+VXdqM>*%Wku`Rvj264$^;Qh$s$cE9l{}htD7nQ}mK{zeZKR*hE%`F`CunX_G1x0WoaK^rFa{f7rU zc>N|WSF)x?b=;Xpp>LioRLU_d+x8n<2&64hpzNU(+uYG0M|sP<ibGbzVMmsh*zzP4q{ZNOK?9^s&#IxNb|b+gtG%gIwd5R&ed zw@q8CZ!9m86A7f!Tu$TCtIkYPvY3BHS~^_paIq;S9O@G5UUg7(>uYV}^gw1xN2O95 z;=pM+X^GobF_uA2sqI=nwoy&ju6Q+!)Ipp5+rx>rhsRI%1?Brelw#}YQt8xzBnuD_ zrjjR@)l_=g4tFMze75p>yIuMKSHrXh=6`NZ>yx$0vc_GvTDT}Hmf8rE6uLcuDAaMA zCV}x0u4BM%IZ?OklPfp)Wn`UmeHBh+SfsiGR*VBVZc10Azx60Y=wgdTI|ekLb2&YN z>P)nkFNQW@A(*ZX_uN{bd66M{(=fCrEgzoOCk6>v_38}!Mf~yO#(p14L|Y`o9}pnI zKp_MhU|s)a_7P^=*mpsQpsh4^I>-BzYrL!lvz1MqZ#t-u9~P8hOYit7n#o(o+EPz+ zo-1K4*flWi7^x7b1x zing)kB_2eCB-1$<8QOa>jy8X|A6{7zJti8-{KMd&qB(StFu;M(unO=BPl)*=)u$?1 zE__e6_&7TcxGjrQ0B)zoMDnVToy?eY3**RGwS*q?P_?q4)wmT)lI>~4meTcXwEzJtW9$;5Y8e!nFfyPWG_xB# z2~g|`^T3hGQ&?bkKdzg|TCChncv&Rg({%*F@$DMgK2snIDlGF20Z{~tT#2d5Qjijj z6E`MgPZE$aL<0f4ftpTe_AYnx5@u^II1OyA_m4j^OtpCo$y3_^5+G0$NLT)SA}05A zlC=A2@|y@RdOiFf5uO%058NZS&K%)l0peWgPsTa91`|9b9EPq?v5W?Z+qLzFMKDc9 z2xs6k2Z-A+XUWw5Hn5(0HWq1}Y+APPp46OVVJ=U^ebM94<6%fz4lOj7SJqtL_CqE_ zX*@2h?DEheZ6TL2HAA1CnW*7E`?(nd)z z0uvas=aF?$ZCZd9jf%NMMnaF(+;YjxRmro@FNt%}qI_e!!Q4uvY;dt)U4uc0HX-3L zzQ{ar3Yi;((DLmv5gXPs5JV=Z+k7QazA+<|^%6I9b^&~Uzu&;^Y;ouK6TU3i5V+D7 zIz?<)&qN@7Zs<^zyT|0G8VAo~8Uxr<05{GpKwk2iJ#fc?egbI7t|>kMIto|=V1pOB zEdWRWZlko3qEKB$n+Fh^f|n%YaY25jcmr8E263*qC&euuAU08yIAQ?-UPlB4033o< z+(2lVtu_|a-ZAm>+N<6Zq~0H*w>w7KZfXm8pkP_x#Gom}&-S0-43BVsUu zbE}CNha4dC8W3Gs80eT3>sZ^IWEf-HBy+}&z6NQAipJ#N1^C1nct$i;LDnzB5%}bW zXVPjRKPnU>S01-uIbE$;_e?K9@697{;kMphc8TrZr@yp!;l8cCyXTU(i?mV9U3r9y z+x&P=?#(VyM9bWT->gsE2N-g1J0m6^f8DkTF4gW5uvQ6MI! zHF=#Qp^ZrH2=(b4kbz@t`a;Ab{3Zo?j!cBv-8Wy51}X-p%@B{Xv&s#O#m>}is|rIhogDH-(mbRdyyhuF6Tr?U z_-liIz{ki+H-60`yez$;BsP<)z>PHAI5?^2OwFe<<9U^Mw z&(3N~r;>SMULm4-m>MRd(G=N8mPg*09xNi3P=-wuRwJ7qCSHnud+;imjE&2qJL|!7 z*AiBR{UQ90yHBT?1cLKk4HmFIfY}RoOsI`Ua_Q9231FS2^vLGTsWWzk6{fy%dg@$S z?IkJ3K+^>$4rUR7`54F~dAR$e94BOEw(~e(_UUcw1v_X2g_FoekeCFFnBhG}z?DL6 z`c8A}hv1Aj*KbbODPgEi%?_YeD8>OAK?Tva_7b3fMGMpC-4P(Nai+2 zmCCq_pJ`K!CFbO-jcC*jVI#lk6%i!GpG>g_CNp=u(~7yN3H4RN{HPAWiLGF?0Jej$ za1hI4=ua@{bqf=Gl!l?+sa}`{&SGTzGXTSvfBL`YkcJ|OwQ)umR-18Hhk+r^Kr!8O zP$bhPnVmvRVMlK_2Mx|Vu?E7B|J{yOiY@FkAlRn{(i~-mj4ZhF-xXQHW61buJ~c6~ zM*8E#NP&eKs&ixYa>iUuGxTL!v>0WK7V<IXFav{YZ%$!f@aSk{=(%U-Cjz;XZZEe9*+khHI$AgmSP`Jl8QBFD!wyn!B z21HYtGiD>keEmVg&_-LTg5V+jT^t_8wSYzbRZ>#6LMgu29G z8>PUfsWTXh5d)$vsFaNmg?SlPth}uztvY)(fd8zcOqY?aP}42O6{YE+@S1^jXR?_g zzGpTx>!F5Noo~j|fwS~5_aW@J42(`fv&q?|$MfsNH9!q~ZJbdnYXZOeb428Vk+#mF z8#dY)SE~WYSH__+yg}wGE>>^WpTyZX#Uhd#lol?BIhep&wlo_jYnqSVY*C;w4)(&OQkSHHLOgwJvqir2!8}uJd*-_ zX}+F-oI&`)gS24ZnXvvdCP{X`j}%;F5P@$|NmBTqWGFC6T>6F`qm8Rc>9N3U;D+f` z3SFXDTvFI0+xH1eC(GIT6u!JbXHXyZI)FmrF?t0e9sTc%!R61$miT0Mu0u6HRhzAs zVEc34xk1&`P%wV(ymm~fvfs3SFfJh}rLs@CU87c=rUZDSE`{S36Lcc5Q=4`jaPSDT z3&<#_;ej?yIJ%~VdBkV@`@^xYMTr)JgNuhRmVl6mm?T=b-F2?_b7yb!|FXtWhg^2A zI|4<)ld7BwjPy9-oSXdCqhK0W+~*S?`_ye7^k=u6uvnb!mbxe2ZFdd3Z_tpJ5{w%$ z>ZBDuIN?zfCds|_)&{F3Ns%U%!fqR6%8(^nt{i#ty;7h^A*B+?iJ_=nkG%lju9Q5J=XV;($tzQ zH>fEy()0&&MVc-?oP|TN-q~HeN7J+3asFT!KLd1S`WO()bl(R;smNOBRPKSm$%gzG1!Z-yOD&!btUhXG=ANURs%jT7qQ3PAv3d<>AtFSJ>c3y7lGRbL5 M95hs6-UR>v0O=eFy#N3J literal 0 HcmV?d00001 diff --git a/public/fonts/sf-pro-display-medium.woff2 b/public/fonts/sf-pro-display-medium.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..01d78a7fa1f10f8048308aa39c5d6dc83240582b GIT binary patch literal 36168 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 literal 0 HcmV?d00001 diff --git a/public/fonts/sf-pro-display-regular.woff2 b/public/fonts/sf-pro-display-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..cb171342b35866cfb4d842720147ba5c627fa836 GIT binary patch literal 29632 zcmV(}K+wN;Pew8T0RR910CT_q6aWAK0z8NS0CP?N0RR9100000000000000000000 z0000PfoMNQMpR848a5k-n+zO;a0XxigIWki34~=42nvFgM1k}+0X7081BV<7gHiwl zAO)cc2Zc!tfqp-CWnyLqTg51H06lFj@VjjQLAJw}@|ekVn~(HnX`o0SPcJ%9!^Q#F z(A$>m|Nnb(GKMeQtyCNjwo38f{=`ZJ|HMDtZ?!(UY$`GoBrC4(<4jvEhT%)i{^F+rTogu7pqQ0+6-hE-a^8Kuu?R4sf+iumTjSBtqe!} zfHql$6fDcMJ;C(XR4(dN$%g^jW(S;r&M7L!oKvxCinC@+FtSh-tFRKZF?t3lVxed+ zbfKG(3+G(4EC07&#p{2ry`P;*q!dn?@@D&N0pX^^pB<3zWacY>KA=L2s9b>_Z24Jf z%@#X{mSN+D)*y#rmd4Ebc#$u%!;u+ZV21DrI)MIjqUu9!j7U26{M+CFPxa4g{qOe9 zdq#8-+w+_Uu|ZDz-;Du(gIFUr$=_3F@dn?{3Am zb+|;VWGP5xO7g4y^rtedMpmk9!=UR(TOJ>NyGIEh2%qVo&Pd53G|50QBu?Vo

^W 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 H%6tj{ftxk& literal 0 HcmV?d00001 diff --git a/public/fonts/sf-pro-display-semibold.woff2 b/public/fonts/sf-pro-display-semibold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..16f8102c881f200ab363cf6fdd27ac0bc11302e1 GIT binary patch literal 37560 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 literal 0 HcmV?d00001 From 0fd3b0b80e14400d828519c3239c9e9565e828f6 Mon Sep 17 00:00:00 2001 From: baekseungsun Date: Fri, 31 Oct 2025 23:00:48 +0900 Subject: [PATCH 35/82] =?UTF-8?q?refact:=20navbar=20=ED=95=98=EB=8B=A8=20?= =?UTF-8?q?=EA=B3=A0=EC=A0=95,=20=EB=88=8C=EB=A0=80=EC=9D=84=EC=8B=9C=20?= =?UTF-8?q?=EC=9E=84=EC=8B=9C=20=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=9D=B4?= =?UTF-8?q?=EB=8F=99=20=EB=B0=8F=20=EC=83=89=EC=83=81=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/comingSoon/page.tsx | 11 ++++++++ app/downloads/page.tsx | 11 ++++++++ app/search/page.tsx | 11 ++++++++ components/Navbar.tsx | 51 +++++++++++++++++++++---------------- public/icons/comingSoon.svg | 3 --- public/icons/comingSoon.tsx | 11 ++++++++ public/icons/download.svg | 3 --- public/icons/download.tsx | 8 ++++++ public/icons/home.svg | 7 ----- public/icons/home.tsx | 11 ++++++++ public/icons/menu.svg | 3 --- public/icons/menu.tsx | 7 +++++ public/icons/search.svg | 4 --- public/icons/search.tsx | 8 ++++++ 14 files changed, 107 insertions(+), 42 deletions(-) create mode 100644 app/comingSoon/page.tsx create mode 100644 app/downloads/page.tsx create mode 100644 app/search/page.tsx delete mode 100644 public/icons/comingSoon.svg create mode 100644 public/icons/comingSoon.tsx delete mode 100644 public/icons/download.svg create mode 100644 public/icons/download.tsx delete mode 100644 public/icons/home.svg create mode 100644 public/icons/home.tsx delete mode 100644 public/icons/menu.svg create mode 100644 public/icons/menu.tsx delete mode 100644 public/icons/search.svg create mode 100644 public/icons/search.tsx diff --git a/app/comingSoon/page.tsx b/app/comingSoon/page.tsx new file mode 100644 index 0000000..3ef0fd2 --- /dev/null +++ b/app/comingSoon/page.tsx @@ -0,0 +1,11 @@ +import Navbar from "@/components/Navbar"; + +export default function SearchPage() { + return ( +

+

EMPTY PAGE

+ + +
+ ); +} \ No newline at end of file diff --git a/app/downloads/page.tsx b/app/downloads/page.tsx new file mode 100644 index 0000000..3ef0fd2 --- /dev/null +++ b/app/downloads/page.tsx @@ -0,0 +1,11 @@ +import Navbar from "@/components/Navbar"; + +export default function SearchPage() { + return ( +
+

EMPTY PAGE

+ + +
+ ); +} \ No newline at end of file diff --git a/app/search/page.tsx b/app/search/page.tsx new file mode 100644 index 0000000..3ef0fd2 --- /dev/null +++ b/app/search/page.tsx @@ -0,0 +1,11 @@ +import Navbar from "@/components/Navbar"; + +export default function SearchPage() { + return ( +
+

EMPTY PAGE

+ + +
+ ); +} \ No newline at end of file diff --git a/components/Navbar.tsx b/components/Navbar.tsx index aaaa3c7..8cc8f2b 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -1,43 +1,50 @@ "use client"; -import Image from "next/image"; import Link from "next/link"; -import home from "../public/icons/home.svg"; -import search from "../public/icons/search.svg"; -import comingSoon from "../public/icons/comingSoon.svg"; -import download from "../public/icons/download.svg"; -import menu from "../public/icons/menu.svg"; - +import { usePathname } from "next/navigation"; +import Home from "../public/icons/home"; +import Search from "../public/icons/search"; +import ComingSoon from "../public/icons/comingSoon"; +import Download from "../public/icons/download"; +import Menu from "../public/icons/menu"; export default function Navbar() { + const pathname = usePathname(); + + // Tailwind classes based on active page + const getLinkClass = (path: string) => + pathname === path + ? "flex flex-col items-center text-white text-[8px]" + : "flex flex-col items-center text-[#8C8787] text-[8px]"; return ( +
-
- + - - search + + Search - + - + -
- more + + More -
+ +
); } diff --git a/public/icons/comingSoon.svg b/public/icons/comingSoon.svg deleted file mode 100644 index 80dd1fc..0000000 --- a/public/icons/comingSoon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/public/icons/comingSoon.tsx b/public/icons/comingSoon.tsx new file mode 100644 index 0000000..a935780 --- /dev/null +++ b/public/icons/comingSoon.tsx @@ -0,0 +1,11 @@ +export default function ComingSoonIcon(props: React.SVGProps) { + return ( + + + + + + + + ); +} diff --git a/public/icons/download.svg b/public/icons/download.svg deleted file mode 100644 index 789ff1a..0000000 --- a/public/icons/download.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/public/icons/download.tsx b/public/icons/download.tsx new file mode 100644 index 0000000..6e20bda --- /dev/null +++ b/public/icons/download.tsx @@ -0,0 +1,8 @@ + +export default function ArrowIcon(props: React.SVGProps) { + return ( + + + + ); +} diff --git a/public/icons/home.svg b/public/icons/home.svg deleted file mode 100644 index 8530ee9..0000000 --- a/public/icons/home.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/public/icons/home.tsx b/public/icons/home.tsx new file mode 100644 index 0000000..3fc62f1 --- /dev/null +++ b/public/icons/home.tsx @@ -0,0 +1,11 @@ +export default function BuildingIcon(props: React.SVGProps) { + return ( + + + + + + + + ); +} diff --git a/public/icons/menu.svg b/public/icons/menu.svg deleted file mode 100644 index f1677ec..0000000 --- a/public/icons/menu.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/public/icons/menu.tsx b/public/icons/menu.tsx new file mode 100644 index 0000000..9c7e93d --- /dev/null +++ b/public/icons/menu.tsx @@ -0,0 +1,7 @@ +export default function MenuIcon(props: React.SVGProps) { + return ( + + + + ); +} \ No newline at end of file diff --git a/public/icons/search.svg b/public/icons/search.svg deleted file mode 100644 index fbb70ae..0000000 --- a/public/icons/search.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/public/icons/search.tsx b/public/icons/search.tsx new file mode 100644 index 0000000..80c574d --- /dev/null +++ b/public/icons/search.tsx @@ -0,0 +1,8 @@ +export default function SearchIcon(props: React.SVGProps) { + return ( + + + + + ); +} \ No newline at end of file From d53f43c1575a68deeb952176f7dcdf4949db8009 Mon Sep 17 00:00:00 2001 From: baekseungsun Date: Fri, 31 Oct 2025 23:21:34 +0900 Subject: [PATCH 36/82] =?UTF-8?q?refact:=20any=EB=8C=80=EC=8B=A0=20?= =?UTF-8?q?=EC=8B=A4=EC=A0=9C=20=ED=83=80=EC=9E=85=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B0=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/tmdb.ts | 17 +++++++++-------- types/tmdb.ts | 3 +++ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/lib/tmdb.ts b/lib/tmdb.ts index 29be445..89ce4d9 100644 --- a/lib/tmdb.ts +++ b/lib/tmdb.ts @@ -1,21 +1,22 @@ // lib/tmdb.ts import { fetcher } from "./fetcher"; - +import type { tmdbListResponse, tmdbTitle, previewPoster, heroBannerImage } from "@/types/tmdb" const IMG_BASE = "https://image.tmdb.org/t/p"; + //λ°°λ„ˆμš© 이미지 URL -function backdropUrl(path?: string, size: string = "w780") { +function backdropUrl(path: string | null | undefined, size = "w780") { return path ? `${IMG_BASE}/${size}${path}` : ""; } //preview 썸넀일 용 이미지 URL -function posterUrl(path?: string, size: string = "w342") { +function posterUrl(path: string | null | undefined, size = "w342") { return path ? `${IMG_BASE}/${size}${path}` : ""; } //λ°°λ„ˆμš© 이미지 exportν•¨μˆ˜ -export async function getHeroBannerImage() { - const data = await fetcher("/movie/popular", { +export async function getHeroBannerImage(): Promise { + const data = await fetcher>("/movie/popular", { language: "ko-KR", page: "1", region: "KR", @@ -27,8 +28,8 @@ export async function getHeroBannerImage() { } //프리뷰 이미지 export ν•¨μˆ˜ -export async function getPreviewPosters() { - const data = await fetcher("/movie/now_playing", { +export async function getPreviewPosters(): Promise { + const data = await fetcher>("/movie/now_playing", { language: "ko-KR", page: "1", region: "KR", @@ -36,7 +37,7 @@ export async function getPreviewPosters() { return data.results .slice(0, 10) - .map((movie: any) => ({ + .map((movie) => ({ poster: posterUrl(movie.poster_path, "w342"), })); } diff --git a/types/tmdb.ts b/types/tmdb.ts index 040bb82..508a2ef 100644 --- a/types/tmdb.ts +++ b/types/tmdb.ts @@ -14,3 +14,6 @@ export interface tmdbListResponse { total_pages: number; total_results: number; } + +export type heroBannerImage = { backdrop: string }; +export type previewPoster = { poster: string }; From c5c468fc81c3b43e0a40d92bb7bf2439e218ca9d Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Sat, 1 Nov 2025 00:14:44 +0900 Subject: [PATCH 37/82] =?UTF-8?q?chore:=20=ED=8F=B0=ED=8A=B8=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9=20=EC=98=A4=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/globals.css | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/app/globals.css b/app/globals.css index 699a933..5fa755c 100644 --- a/app/globals.css +++ b/app/globals.css @@ -1,13 +1,10 @@ @import 'tailwindcss'; +@import './font.css'; :root { --background: #ffffff; --foreground: #171717; -} - -@theme { - /* Font Family */ - --font-sans: 'SF Pro Display', sans-serif; + --font-sf-pro: 'SF Pro Display', system-ui, -apple-system, sans-serif; } @theme inline { @@ -17,6 +14,14 @@ --font-mono: var(--font-geist-mono); } +@layer base { + body { + background: var(--color-grayscale-02-white); + color: var(--color-grayscale-02-white); + font-family: var(--font-sans); + } +} + @media (prefers-color-scheme: dark) { :root { --background: #0a0a0a; @@ -27,5 +32,11 @@ body { background: var(--background); color: var(--foreground); - font-family: var(--font-sans); + font-family: var(--font-sf-pro); +} +.scrollbar-custom::-webkit-scrollbar { + height: 5px; /* μ„Έλ‘œ/κ°€λ‘œ μŠ€ν¬λ‘€λ°” λ‘κ»˜ */ +} +.scrollbar-custom::-webkit-scrollbar-track { + background-color: #374151; /* νšŒμƒ‰ λ°°κ²½ */ } From 01637ef4c3b2c60704758e88100a55b1cb2b726d Mon Sep 17 00:00:00 2001 From: baekseungsun Date: Sat, 1 Nov 2025 01:22:26 +0900 Subject: [PATCH 38/82] =?UTF-8?q?refactor:=20home/page=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/globals.css | 4 +-- app/home/page.tsx | 32 +++++++++++--------- components/Banner.tsx | 66 +++++++++++++++++++++-------------------- components/Header.tsx | 2 +- components/Previews.tsx | 4 +-- lib/tmdb.ts | 2 +- 6 files changed, 58 insertions(+), 52 deletions(-) diff --git a/app/globals.css b/app/globals.css index 1788641..b38d062 100644 --- a/app/globals.css +++ b/app/globals.css @@ -24,7 +24,7 @@ body { color: var(--foreground); font-family: Arial, Helvetica, sans-serif; } - +/* Chrome, Safari, Edge */ .no-scrollbar::-webkit-scrollbar { display: none; -} \ No newline at end of file +} diff --git a/app/home/page.tsx b/app/home/page.tsx index fd1cf1e..bed37de 100644 --- a/app/home/page.tsx +++ b/app/home/page.tsx @@ -1,16 +1,20 @@ + +import Banner from '../../components/Banner' +import Header from '../../components/Header' +import Previews from '../../components/Previews' + export default function Home() { - return ( -
-
-
- ν—€λ”μ˜μ—­ -
-
- λ°°λ„ˆ μ˜μ—­ -
μ„Ήμ…˜ μ˜μ—­
-
μ„Ήμ…˜ μ˜μ—­
+ return ( +
+
+
+
+
+ +
+
+ +
-
-
- ); -} + ); +} \ No newline at end of file diff --git a/components/Banner.tsx b/components/Banner.tsx index b6db0f4..287909f 100644 --- a/components/Banner.tsx +++ b/components/Banner.tsx @@ -9,7 +9,6 @@ import add from '../public/icons/add.svg' import play from '../public/icons/play.svg' import info from '../public/icons/info.svg' - const imgBase = process.env.NEXT_PUBLIC_TMDB_IMAGE_BASE; //URLλ§Œλ“œλŠ” ν•¨μˆ˜ @@ -46,47 +45,50 @@ export default function Banner() { const backdrop = buildImageUrl(item?.backdrop_path ?? item?.poster_path, "w1280"); return ( -
- {backdrop && ( - {title} - )} - {/*이미지 κ·Έλ ˆμ΄λ””μ–ΈνŠΈ*/} -
-
+
+
+ {backdrop && ( + {title} + )} + {/* 이미지 κ·Έλ ˆλ””μ–ΈνŠΈ */} +
+
+ +
- -
-
TOP
-
10
+ + + TOP + 10 + + #{rank} in {regionName} Today +
- {/*ν˜„μž¬λŠ” ν•œκ΅­1λ“±μœΌλ‘œ κ³ μ •λœ κ°’*/} - #{rank} in {regionName} Today -
-
-
- {/*MyList λ²„νŠΌ*/} - - {/*play λ²„νŠΌ*/} - - {/*Info λ²„νŠΌ*/} -
); -} +} \ No newline at end of file diff --git a/components/Header.tsx b/components/Header.tsx index 9f3ec5c..dec49c2 100644 --- a/components/Header.tsx +++ b/components/Header.tsx @@ -5,7 +5,7 @@ import Image from "next/image"; export default function Header() { return ( -
+
{logo}
diff --git a/components/Previews.tsx b/components/Previews.tsx index a56521b..2124f0c 100644 --- a/components/Previews.tsx +++ b/components/Previews.tsx @@ -12,8 +12,8 @@ export default function Previews() { }, []); return ( -
- Previews +
+ Previews
{items.map((item, i) => (
diff --git a/lib/tmdb.ts b/lib/tmdb.ts index 5e21a59..89ce4d9 100644 --- a/lib/tmdb.ts +++ b/lib/tmdb.ts @@ -23,7 +23,7 @@ export async function getHeroBannerImage(): Promise { }); const first = data.results?.[0]; return { - backdrop: backdropUrl(first?.backdropPath, "w780"), + backdrop: backdropUrl(first?.backdrop_path, "w780"), }; } From 43dd3964d303803a6e2988d215d28e31d21c1c95 Mon Sep 17 00:00:00 2001 From: baekseungsun Date: Sat, 1 Nov 2025 01:25:35 +0900 Subject: [PATCH 39/82] =?UTF-8?q?refactor:=20types=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Conflicts: # types/tmdb.ts --- lib/tmdb.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tmdb.ts b/lib/tmdb.ts index 5e21a59..1378d6f 100644 --- a/lib/tmdb.ts +++ b/lib/tmdb.ts @@ -40,4 +40,4 @@ export async function getPreviewPosters(): Promise { .map((movie) => ({ poster: posterUrl(movie.poster_path, "w342"), })); -} +} \ No newline at end of file From f479e43c83f00d478bf2adda74792652e9f3126c Mon Sep 17 00:00:00 2001 From: baekseungsun Date: Sat, 1 Nov 2025 01:30:48 +0900 Subject: [PATCH 40/82] =?UTF-8?q?refactor:=20type=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/tmdb.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/tmdb.ts b/lib/tmdb.ts index 1378d6f..528d997 100644 --- a/lib/tmdb.ts +++ b/lib/tmdb.ts @@ -23,7 +23,7 @@ export async function getHeroBannerImage(): Promise { }); const first = data.results?.[0]; return { - backdrop: backdropUrl(first?.backdropPath, "w780"), + backdrop: backdropUrl(first?.backdrop_path, "w780"), }; } From 252ddcb8ff10a1395e8d2fae74500f86fef10265 Mon Sep 17 00:00:00 2001 From: baekseungsun Date: Sat, 1 Nov 2025 01:44:00 +0900 Subject: [PATCH 41/82] =?UTF-8?q?refactor:=20navbar=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/home/page.tsx | 4 ++++ components/Previews.tsx | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/home/page.tsx b/app/home/page.tsx index bed37de..991f85d 100644 --- a/app/home/page.tsx +++ b/app/home/page.tsx @@ -2,6 +2,7 @@ import Banner from '../../components/Banner' import Header from '../../components/Header' import Previews from '../../components/Previews' +import Navbar from '../../components/Navbar' export default function Home() { return ( @@ -15,6 +16,9 @@ export default function Home() {
+
+ +
); } \ No newline at end of file diff --git a/components/Previews.tsx b/components/Previews.tsx index 2124f0c..0779ca6 100644 --- a/components/Previews.tsx +++ b/components/Previews.tsx @@ -17,7 +17,7 @@ export default function Previews() {
{items.map((item, i) => (
- {`preview-${i}`} + {`preview-${i}`}
))}
From fb29d93b4db5517d39315d5b3920c185e08b57cc Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Sat, 1 Nov 2025 03:09:28 +0900 Subject: [PATCH 42/82] =?UTF-8?q?fix:=20API=20=ED=98=B8=EC=B6=9C=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/HomeHeader.tsx | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 components/HomeHeader.tsx diff --git a/components/HomeHeader.tsx b/components/HomeHeader.tsx new file mode 100644 index 0000000..ab6c97e --- /dev/null +++ b/components/HomeHeader.tsx @@ -0,0 +1,20 @@ +"use client"; + +import logo from "../public/icons/logo.svg"; +import Image from "next/image"; + +export default function Header() { + return ( +
+
+ {logo} +
+ {/* νƒ­λ“€ */} + +
+ ); +} From 0905056f4c38ee55d05eaf08c2ee514b8e6e8f25 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Sat, 1 Nov 2025 03:15:02 +0900 Subject: [PATCH 43/82] =?UTF-8?q?choore:=20=ED=99=88=20margin=20=EC=A1=B0?= =?UTF-8?q?=EC=A0=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/home/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/home/page.tsx b/app/home/page.tsx index 5e35565..01357c4 100644 --- a/app/home/page.tsx +++ b/app/home/page.tsx @@ -16,7 +16,7 @@ import WatchItAgain from "@/components/WatchItAgain"; export default async function Home() { return (
-
+
From 5439b6c08e44bd079e8e546388bf9886d9170e15 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Sat, 1 Nov 2025 03:31:31 +0900 Subject: [PATCH 44/82] =?UTF-8?q?fix:=20=EB=9E=9C=EB=94=A9=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20navbar=EC=88=A8=EA=B9=80=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/layout.tsx | 4 ++-- components/NavbarWrapper.tsx | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 components/NavbarWrapper.tsx diff --git a/app/layout.tsx b/app/layout.tsx index 69f6a79..88705c5 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -2,7 +2,7 @@ import type { Metadata } from "next"; import { Geist, Geist_Mono } from "next/font/google"; import "./globals.css"; import IndicatorBar from "@/components/IndicatorBar"; -import Navbar from "@/components/Navbar"; +import NavbarWrapper from "@/components/NavbarWrapper"; const geistSans = Geist({ variable: "--font-geist-sans", @@ -33,7 +33,7 @@ export default function RootLayout({ className={`${geistSans.variable} ${geistMono.variable} antialiased flex flex-col items-center justify-center min-h-screen bg-white `} > {children} - + diff --git a/components/NavbarWrapper.tsx b/components/NavbarWrapper.tsx new file mode 100644 index 0000000..d5dd4f5 --- /dev/null +++ b/components/NavbarWrapper.tsx @@ -0,0 +1,16 @@ +"use client"; + +import { usePathname } from "next/navigation"; +import Navbar from "./Navbar"; + +export default function NavbarWrapper() { + const pathname = usePathname(); + + // 숨기고 싢은 경둜 λ°°μ—΄ (예: /) + const hiddenPaths = ["/"]; + + // ν˜„μž¬ κ²½λ‘œκ°€ μˆ¨κΉ€ λŒ€μƒμ΄λΌλ©΄ ν‘œμ‹œν•˜μ§€ μ•ŠμŒ + if (hiddenPaths.includes(pathname)) return null; + + return ; +} From c66d0ac590d4602fd7fa175e3b9f09fb509a6310 Mon Sep 17 00:00:00 2001 From: baekseungsun Date: Sat, 1 Nov 2025 10:52:15 +0900 Subject: [PATCH 45/82] =?UTF-8?q?refactor:=20=EB=9D=BC=EC=9A=B0=ED=8C=85?= =?UTF-8?q?=EC=8B=9C=20=ED=99=94=EB=A9=B4=20=EC=9B=80=EC=A7=81=EC=9E=84=20?= =?UTF-8?q?=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/globals.css | 10 +- app/home/page.tsx | 2 +- app/lottieLogo.tsx | 2 +- app/page.tsx | 3 + components/Banner.tsx | 183 ++++++++++++++++++++---------------- components/HomeHeader.tsx | 2 +- components/Previews.tsx | 2 +- lib/tmdb.ts | 2 + public/icons/comingSoon.tsx | 12 +-- 9 files changed, 117 insertions(+), 101 deletions(-) diff --git a/app/globals.css b/app/globals.css index 5193769..c3081a2 100644 --- a/app/globals.css +++ b/app/globals.css @@ -24,13 +24,7 @@ body { color: var(--foreground); font-family: Arial, Helvetica, sans-serif; } -/* Chrome, Safari, Edge */ -.no-scrollbar::-webkit-scrollbar { + +*::-webkit-scrollbar { display: none; } -.scrollbar-custom::-webkit-scrollbar { - height: 5px; /* μ„Έλ‘œ/κ°€λ‘œ μŠ€ν¬λ‘€λ°” λ‘κ»˜ */ -} -.scrollbar-custom::-webkit-scrollbar-track { - background-color: #374151; /* νšŒμƒ‰ λ°°κ²½ */ -} diff --git a/app/home/page.tsx b/app/home/page.tsx index 5e35565..b85b793 100644 --- a/app/home/page.tsx +++ b/app/home/page.tsx @@ -15,7 +15,7 @@ import UsTvShow from "@/components/USTvShow"; import WatchItAgain from "@/components/WatchItAgain"; export default async function Home() { return ( -
+
diff --git a/app/lottieLogo.tsx b/app/lottieLogo.tsx index b14ad2d..a9ae44c 100644 --- a/app/lottieLogo.tsx +++ b/app/lottieLogo.tsx @@ -14,7 +14,7 @@ export default function LottieLogo() { }; return ( -
+
); } + + + diff --git a/components/Banner.tsx b/components/Banner.tsx index 54d9cdd..c5f3921 100644 --- a/components/Banner.tsx +++ b/components/Banner.tsx @@ -1,6 +1,6 @@ "use client"; -import { useEffect, useState } from "react"; +import { useEffect, useMemo, useRef, useState } from "react"; import { fetcher } from "@/lib/fetcher"; import type { tmdbListResponse, tmdbTitle } from "@/types/tmdb"; import Image from "next/image"; @@ -8,76 +8,95 @@ import add from "../public/icons/add.svg"; import play from "../public/icons/play.svg"; import info from "../public/icons/info.svg"; -const imgBase = - process.env.NEXT_PUBLIC_TMDB_IMAGE_BASE || "https://image.tmdb.org/t/p"; +const imgBase = process.env.NEXT_PUBLIC_TMDB_IMAGE_BASE || "https://image.tmdb.org/t/p"; +const rotateTime = 20_000; // 20초 간격 (μž„μ˜) +const regionName = "Korea"; -//URLλ§Œλ“œλŠ” ν•¨μˆ˜ +// URL λ§Œλ“œλŠ” ν•¨μˆ˜ function buildImageUrl( - path?: string | null, - size: "w780" | "w1280" | "original" = "w1280" + path?: string | null, + size: "w780" | "w1280" | "original" = "w1280" ) { - if (!path) return ""; - try { - // path μ•žμ˜ μŠ¬λž˜μ‹œ 제거 - const cleanPath = path.startsWith("/") ? path.slice(1) : path; - return `${imgBase}/${size}/${cleanPath}`; - } catch { - return ""; - } + if (!path) return ""; + try { + const cleanPath = path.startsWith("/") ? path.slice(1) : path; + return `${imgBase}/${size}/${cleanPath}`; + } catch { + return ""; + } } export default function Banner() { - const [item, setItem] = useState(null); - const rank = 1; //ν˜„μž¬ 1λ“±μœΌλ‘œ κ³ μ • - const regionName = "Korea"; //ν˜„μž¬ ν•œκ΅­μœΌλ‘œ κ³ μ • + const [items, setItems] = useState([]); + const [index, setIndex] = useState(0); + const timerRef = useRef(null); - //인기 μ˜ν™” API 콜 - useEffect(() => { - (async () => { - try { - //ν˜„μž¬ ν•œκ΅­ 1λ“± μ˜ν™”λ‘œ κ³ μ • - const data = await fetcher>( - "/3/movie/popular", - { - language: "ko-KR", - region: "kr", - page: "1", - } - ); - const candidate = data.results?.[1] ?? data.results?.[0] ?? null; - setItem(candidate); - } catch (e) { - console.error(e); - } - })(); - }, []); + // ν•œκ΅­ 인기 Top10 첫 마운트 λ‘œλ“œ + useEffect(() => { + (async () => { + try { + const data = await fetcher>( + "/3/movie/popular", + { language: "ko-KR", region: "KR", page: "1" } + ); + setItems((data.results ?? []).slice(0, 10)); + setIndex(0); + } catch (e) { + console.error(e); + } + })(); + }, []); - const title = item?.title; - //backdrop 이미지 - const backdrop = buildImageUrl( - item?.backdrop_path ?? item?.poster_path, - "w1280" - ); + // 20μ΄ˆλ§ˆλ‹€ λ³€κ²½ + useEffect(() => { + if (!items.length) return; + const start = () => { + stop(); + timerRef.current = window.setInterval(() => { + setIndex((i) => (i + 1) % items.length); //index증가 + }, rotateTime); + }; + const stop = () => { + if (timerRef.current) { + window.clearInterval(timerRef.current); + timerRef.current = null; + } + }; - return ( -
-
- {backdrop && ( - {title - )} - {/* 이미지 κ·Έλ ˆλ””μ–ΈνŠΈ */} -
-
+ start(); + return () => { + stop(); + }; + }, [items.length]); -
-
+ const current = items[index] ?? null; + const title = current?.title ?? current?.name ?? ""; + const backdrop = useMemo( + () => buildImageUrl(current?.backdrop_path ?? current?.poster_path, "w1280"), + [current?.backdrop_path, current?.poster_path] + ); + const rank = Math.min(index + 1, 10); + + return ( +
+
+ {backdrop && ( + {title + )} + {/* 이미지 κ·Έλ ˆμ΄λ””μ–ΈνŠΈ */} +
+
+ +
+
TOP @@ -87,27 +106,27 @@ export default function Banner() { #{rank} in {regionName} Today -
-
- {/* My List */} - +
+
+ {/* My List */} + - {/* Play */} - + {/* Play */} + - {/* Info */} - -
-
-
- ); + {/* Info */} + +
+
+
+ ); } diff --git a/components/HomeHeader.tsx b/components/HomeHeader.tsx index ab6c97e..c87a140 100644 --- a/components/HomeHeader.tsx +++ b/components/HomeHeader.tsx @@ -1,6 +1,6 @@ "use client"; -import logo from "../public/icons/logo.svg"; +import logo from "@/public/icons/logo.svg"; import Image from "next/image"; export default function Header() { diff --git a/components/Previews.tsx b/components/Previews.tsx index 0779ca6..c8b9ac1 100644 --- a/components/Previews.tsx +++ b/components/Previews.tsx @@ -1,7 +1,7 @@ "use client"; import { useEffect, useState } from "react"; -import { getPreviewPosters } from "@/lib/tmdb"; // λ„€ 파일 κ²½λ‘œμ— 맞게 μˆ˜μ • +import { getPreviewPosters } from "@/lib/tmdb"; export default function Previews() { //ν¬μŠ€ν„°μš© URL λ°°μ—΄ diff --git a/lib/tmdb.ts b/lib/tmdb.ts index 45e0c1c..48dca55 100644 --- a/lib/tmdb.ts +++ b/lib/tmdb.ts @@ -8,6 +8,8 @@ import type { } from "@/types/tmdb"; const IMG_BASE = "https://image.tmdb.org/t/p"; + + //λ°°λ„ˆμš© 이미지 URL function backdropUrl(path: string | null | undefined, size = "w780") { return path ? `${IMG_BASE}/${size}${path}` : ""; diff --git a/public/icons/comingSoon.tsx b/public/icons/comingSoon.tsx index a935780..e2c925d 100644 --- a/public/icons/comingSoon.tsx +++ b/public/icons/comingSoon.tsx @@ -1,11 +1,9 @@ -export default function ComingSoonIcon(props: React.SVGProps) { +export default function comingSoon( + props: React.SVGProps +) { return ( - - - - - - + + ); } From b30dd90d8ea5a993cd9b7d71a5d29a1579815316 Mon Sep 17 00:00:00 2001 From: baekseungsun Date: Sat, 1 Nov 2025 10:58:41 +0900 Subject: [PATCH 46/82] =?UTF-8?q?refactor:=20=EB=A7=88=EC=A7=84=20?= =?UTF-8?q?=EC=A1=B0=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/home/page.tsx | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/app/home/page.tsx b/app/home/page.tsx index b85b793..3d7566c 100644 --- a/app/home/page.tsx +++ b/app/home/page.tsx @@ -14,27 +14,27 @@ import ThrillerMysteries from "@/components/TvThrillerMysteries"; import UsTvShow from "@/components/USTvShow"; import WatchItAgain from "@/components/WatchItAgain"; export default async function Home() { - return ( -
-
-
- + return ( +
+
+
+ +
+ + + + + + + + + + + + + + +
- - - - - - - - - - - - - - -
-
- ); -} + ); +} \ No newline at end of file From a6ed4b2c68cb5cdf3fc3bcf8ec00cedd51224abc Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Sat, 1 Nov 2025 11:21:33 +0900 Subject: [PATCH 47/82] =?UTF-8?q?chore=20=ED=8F=AC=ED=8A=B8=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EC=A7=80=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c4913d2..411f492 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "0.1.0", "private": true, "scripts": { - "dev": "next dev", + "dev": "next dev 3000", "build": "next build", "start": "next start", "lint": "eslint .", From 92d045860344891db08633694f2dd2416a611b8b Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Sat, 1 Nov 2025 11:23:31 +0900 Subject: [PATCH 48/82] =?UTF-8?q?chore:=20=ED=8F=AC=ED=8A=B8=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EC=A7=80=EC=A0=95=20=EC=B7=A8=EC=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 411f492..c4913d2 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "version": "0.1.0", "private": true, "scripts": { - "dev": "next dev 3000", + "dev": "next dev", "build": "next build", "start": "next start", "lint": "eslint .", From 6ef9935cb45284552d0c9bf422d43dfdf8ed16eb Mon Sep 17 00:00:00 2001 From: baekseungsun Date: Sat, 1 Nov 2025 11:36:29 +0900 Subject: [PATCH 49/82] =?UTF-8?q?refactor:=20=ED=99=94=EB=A9=B4=20?= =?UTF-8?q?=ED=9D=94=EB=93=A4=EB=A6=BC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/globals.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/globals.css b/app/globals.css index c5a90fe..364e10d 100644 --- a/app/globals.css +++ b/app/globals.css @@ -73,3 +73,7 @@ body { color: var(--foreground); font-family: 'SF Pro Display', -apple-system, BlinkMacSystemFont, system-ui, sans-serif; } + +*::-webkit-scrollbar { + display: none; +} \ No newline at end of file From c8800359157a83fb2a052d069bda7d98e63ed4ec Mon Sep 17 00:00:00 2001 From: baekseungsun Date: Sat, 1 Nov 2025 12:01:08 +0900 Subject: [PATCH 50/82] =?UTF-8?q?refactor:=20=EB=A9=94=EC=9D=B8=20?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EB=A0=88=EC=9D=B4=EC=95=84?= =?UTF-8?q?=EC=9B=83=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/home/page.tsx | 2 +- components/Banner.tsx | 2 +- components/Previews.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/home/page.tsx b/app/home/page.tsx index 31d1fc7..6713642 100644 --- a/app/home/page.tsx +++ b/app/home/page.tsx @@ -16,7 +16,7 @@ import WatchItAgain from "@/components/WatchItAgain"; export default async function Home() { return (
-
+
diff --git a/components/Banner.tsx b/components/Banner.tsx index c5f3921..fc65db8 100644 --- a/components/Banner.tsx +++ b/components/Banner.tsx @@ -79,7 +79,7 @@ export default function Banner() { return (
-
+
{backdrop && ( - Previews + Previews
{items.map((item, i) => (
From d187fe57b4201e8a56e0a4e8f9b8550fad5de6a4 Mon Sep 17 00:00:00 2001 From: baekseungsun Date: Sat, 1 Nov 2025 12:38:04 +0900 Subject: [PATCH 51/82] =?UTF-8?q?refactor:=20=EB=88=84=EB=9D=BD=EB=90=9C?= =?UTF-8?q?=20=EC=95=84=EC=9D=B4=EC=BD=98=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/icons/add.svg | 4 ++++ public/icons/info.svg | 5 +++++ public/icons/play.svg | 3 +++ 3 files changed, 12 insertions(+) create mode 100644 public/icons/add.svg create mode 100644 public/icons/info.svg create mode 100644 public/icons/play.svg diff --git a/public/icons/add.svg b/public/icons/add.svg new file mode 100644 index 0000000..95ffdca --- /dev/null +++ b/public/icons/add.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/public/icons/info.svg b/public/icons/info.svg new file mode 100644 index 0000000..ba21c8d --- /dev/null +++ b/public/icons/info.svg @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/public/icons/play.svg b/public/icons/play.svg new file mode 100644 index 0000000..4c22609 --- /dev/null +++ b/public/icons/play.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file From 6a490c72187dfe5635821339543a1f0a4b79192d Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Sat, 1 Nov 2025 15:31:56 +0900 Subject: [PATCH 52/82] =?UTF-8?q?fix:=20=ED=99=88=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EC=95=84=EC=9D=B4=EC=BD=98=20=EA=B2=BD=EB=A1=9C=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/home/page.tsx | 30 +++++++++---------- components/IndicatorBar.tsx | 2 +- components/{ => home}/AfricanMovies.tsx | 6 ++-- components/{ => home}/Banner.tsx | 6 ++-- components/{ => home}/ContinueWatching.tsx | 6 ++-- components/{ => home}/HomeHeader.tsx | 0 components/{ => home}/MyList.tsx | 4 +-- components/{ => home}/NetflixOriginals.tsx | 6 ++-- components/{ => home}/NewReleases.tsx | 6 ++-- components/{ => home}/Nollywood.tsx | 6 ++-- components/{ => home}/Popular.tsx | 6 ++-- components/{ => home}/Previews.tsx | 0 components/{ => home}/SectionTitle.tsx | 0 components/{ => home}/Top10.tsx | 6 ++-- components/{ => home}/TrendingNow.tsx | 6 ++-- components/{ => home}/TvThrillerMysteries.tsx | 6 ++-- components/{ => home}/USTvShow.tsx | 6 ++-- components/{ => home}/WatchItAgain.tsx | 6 ++-- 18 files changed, 54 insertions(+), 54 deletions(-) rename components/{ => home}/AfricanMovies.tsx (88%) rename components/{ => home}/Banner.tsx (97%) rename components/{ => home}/ContinueWatching.tsx (90%) rename components/{ => home}/HomeHeader.tsx (100%) rename components/{ => home}/MyList.tsx (92%) rename components/{ => home}/NetflixOriginals.tsx (88%) rename components/{ => home}/NewReleases.tsx (88%) rename components/{ => home}/Nollywood.tsx (88%) rename components/{ => home}/Popular.tsx (88%) rename components/{ => home}/Previews.tsx (100%) rename components/{ => home}/SectionTitle.tsx (100%) rename components/{ => home}/Top10.tsx (88%) rename components/{ => home}/TrendingNow.tsx (88%) rename components/{ => home}/TvThrillerMysteries.tsx (88%) rename components/{ => home}/USTvShow.tsx (88%) rename components/{ => home}/WatchItAgain.tsx (88%) diff --git a/app/home/page.tsx b/app/home/page.tsx index 6713642..0e0a1b5 100644 --- a/app/home/page.tsx +++ b/app/home/page.tsx @@ -1,18 +1,18 @@ -import Banner from "../../components/Banner"; -import HomeHeader from "../../components/HomeHeader"; -import Previews from "../../components/Previews"; -import AfricanMovies from "@/components/AfricanMovies"; -import ContinueWataching from "@/components/ContinueWatching"; -import MyList from "@/components/MyList"; -import NetflixOriginals from "@/components/NetflixOriginals"; -import NewReleases from "@/components/NewReleases"; -import Nollywood from "@/components/Nollywood"; -import Popular from "@/components/Popular"; -import Top10 from "@/components/Top10"; -import TrendingNow from "@/components/TrendingNow"; -import ThrillerMysteries from "@/components/TvThrillerMysteries"; -import UsTvShow from "@/components/USTvShow"; -import WatchItAgain from "@/components/WatchItAgain"; +import Banner from "../../components/home/Banner"; +import HomeHeader from "../../components/home/HomeHeader"; +import Previews from "@/components/home/Previews"; +import AfricanMovies from "@/components/home/AfricanMovies"; +import ContinueWataching from "@/components/home/ContinueWatching"; +import MyList from "@/components/home/MyList"; +import NetflixOriginals from "@/components/home/NetflixOriginals"; +import NewReleases from "@/components/home/NewReleases"; +import Nollywood from "@/components/home/Nollywood"; +import Popular from "@/components/home/Popular"; +import Top10 from "@/components/home/Top10"; +import TrendingNow from "@/components/home/TrendingNow"; +import ThrillerMysteries from "@/components/home/TvThrillerMysteries"; +import UsTvShow from "@/components/home/USTvShow"; +import WatchItAgain from "@/components/home/WatchItAgain"; export default async function Home() { return (
diff --git a/components/IndicatorBar.tsx b/components/IndicatorBar.tsx index f551776..a13dfa3 100644 --- a/components/IndicatorBar.tsx +++ b/components/IndicatorBar.tsx @@ -1,6 +1,6 @@ export default function IndicatorBar() { return ( -
+
diff --git a/components/AfricanMovies.tsx b/components/home/AfricanMovies.tsx similarity index 88% rename from components/AfricanMovies.tsx rename to components/home/AfricanMovies.tsx index 0c9b341..47bc556 100644 --- a/components/AfricanMovies.tsx +++ b/components/home/AfricanMovies.tsx @@ -2,9 +2,9 @@ import { useEffect, useState } from "react"; import Image from "next/image"; -import SectionTitle from "@/components/SectionTitle"; -import { fetchAfricanMovies } from "../lib/api/tdmb/movie"; -import type { TMDBMovie } from "../lib/api/types/tdmbs"; +import SectionTitle from "@/components/home/SectionTitle"; +import { fetchAfricanMovies } from "../../lib/api/tdmb/movie"; +import type { TMDBMovie } from "../../lib/api/types/tdmbs"; export default function AfricanMovies() { const [movies, setMovies] = useState([]); diff --git a/components/Banner.tsx b/components/home/Banner.tsx similarity index 97% rename from components/Banner.tsx rename to components/home/Banner.tsx index fc65db8..3d4a259 100644 --- a/components/Banner.tsx +++ b/components/home/Banner.tsx @@ -4,9 +4,9 @@ import { useEffect, useMemo, useRef, useState } from "react"; import { fetcher } from "@/lib/fetcher"; import type { tmdbListResponse, tmdbTitle } from "@/types/tmdb"; import Image from "next/image"; -import add from "../public/icons/add.svg"; -import play from "../public/icons/play.svg"; -import info from "../public/icons/info.svg"; +import add from "@/public/icons/add.svg"; +import play from "@/public/icons/play.svg"; +import info from "@/public/icons/info.svg"; const imgBase = process.env.NEXT_PUBLIC_TMDB_IMAGE_BASE || "https://image.tmdb.org/t/p"; const rotateTime = 20_000; // 20초 간격 (μž„μ˜) diff --git a/components/ContinueWatching.tsx b/components/home/ContinueWatching.tsx similarity index 90% rename from components/ContinueWatching.tsx rename to components/home/ContinueWatching.tsx index 275e18b..6f00495 100644 --- a/components/ContinueWatching.tsx +++ b/components/home/ContinueWatching.tsx @@ -1,11 +1,11 @@ "use client"; import { useEffect, useState } from "react"; -import { fetchMovieById } from "../lib/api/tdmb/movie"; +import { fetchMovieById } from "../../lib/api/tdmb/movie"; import Image from "next/image"; -import SectionTitle from "@/components/SectionTitle"; +import SectionTitle from "@/components/home/SectionTitle"; import { watchHistory } from "@/data/watchHistory"; -import type { TMDBMovie } from "../lib/api/types/tdmbs"; +import type { TMDBMovie } from "../../lib/api/types/tdmbs"; // μ‚¬μš©μž 이름 κ°€μ Έμ˜€κΈ° (더미 데이터 κΈ°μ€€) const userName = watchHistory[0]?.userName || "User"; diff --git a/components/HomeHeader.tsx b/components/home/HomeHeader.tsx similarity index 100% rename from components/HomeHeader.tsx rename to components/home/HomeHeader.tsx diff --git a/components/MyList.tsx b/components/home/MyList.tsx similarity index 92% rename from components/MyList.tsx rename to components/home/MyList.tsx index 4f6b206..65fa2a6 100644 --- a/components/MyList.tsx +++ b/components/home/MyList.tsx @@ -1,9 +1,9 @@ "use client"; import { useEffect, useState } from "react"; -import { fetchMovieById } from "../lib/api/tdmb/movie"; +import { fetchMovieById } from "@/lib/api/tdmb/movie"; import Image from "next/image"; -import SectionTitle from "@/components/SectionTitle"; +import SectionTitle from "@/components/home/SectionTitle"; type Movie = { id: number; diff --git a/components/NetflixOriginals.tsx b/components/home/NetflixOriginals.tsx similarity index 88% rename from components/NetflixOriginals.tsx rename to components/home/NetflixOriginals.tsx index 4670432..d3b5c95 100644 --- a/components/NetflixOriginals.tsx +++ b/components/home/NetflixOriginals.tsx @@ -2,9 +2,9 @@ import { useEffect, useState } from "react"; import Image from "next/image"; -import SectionTitle from "@/components/SectionTitle"; -import { fetchNetflixOriginals } from "../lib/api/tdmb/combined"; -import type { TMDBMovie, TMDBTvShow } from "../lib/api/types/tdmbs"; +import SectionTitle from "@/components/home/SectionTitle"; +import { fetchNetflixOriginals } from "@/lib/api/tdmb/combined"; +import type { TMDBMovie, TMDBTvShow } from "@/lib/api/types/tdmbs"; type CombinedItem = TMDBMovie | TMDBTvShow; diff --git a/components/NewReleases.tsx b/components/home/NewReleases.tsx similarity index 88% rename from components/NewReleases.tsx rename to components/home/NewReleases.tsx index d176bf9..696d3b7 100644 --- a/components/NewReleases.tsx +++ b/components/home/NewReleases.tsx @@ -2,9 +2,9 @@ import { useEffect, useState } from "react"; import Image from "next/image"; -import SectionTitle from "@/components/SectionTitle"; -import { fetchNewReleases } from "../lib/api/tdmb/movie"; -import type { TMDBMovie } from "../lib/api/types/tdmbs"; +import SectionTitle from "@/components/home/SectionTitle"; +import { fetchNewReleases } from "@/lib/api/tdmb/movie"; +import type { TMDBMovie } from "@/lib/api/types/tdmbs"; export default function NewReleases() { const [movies, setMovies] = useState([]); diff --git a/components/Nollywood.tsx b/components/home/Nollywood.tsx similarity index 88% rename from components/Nollywood.tsx rename to components/home/Nollywood.tsx index 76a96cc..9fefd60 100644 --- a/components/Nollywood.tsx +++ b/components/home/Nollywood.tsx @@ -2,9 +2,9 @@ import { useEffect, useState } from "react"; import Image from "next/image"; -import SectionTitle from "@/components/SectionTitle"; -import { fetchNollywoodMovies } from "../lib/api/tdmb/combined"; -import type { TMDBMovie, TMDBTvShow } from "../lib/api/types/tdmbs"; +import SectionTitle from "@/components/home/SectionTitle"; +import { fetchNollywoodMovies } from "@/lib/api/tdmb/combined"; +import type { TMDBMovie, TMDBTvShow } from "@/lib/api/types/tdmbs"; type CombinedItem = TMDBMovie | TMDBTvShow; diff --git a/components/Popular.tsx b/components/home/Popular.tsx similarity index 88% rename from components/Popular.tsx rename to components/home/Popular.tsx index ee102bf..7fcc6f3 100644 --- a/components/Popular.tsx +++ b/components/home/Popular.tsx @@ -2,9 +2,9 @@ import { useEffect, useState } from "react"; import Image from "next/image"; -import SectionTitle from "@/components/SectionTitle"; -import { fetchPopularMovies } from "../lib/api/tdmb/movie"; -import type { TMDBMovie } from "../lib/api/types/tdmbs"; +import SectionTitle from "@/components/home/SectionTitle"; +import { fetchPopularMovies } from "@/lib/api/tdmb/movie"; +import type { TMDBMovie } from "@/lib/api/types/tdmbs"; export default function Popular() { const [movies, setMovies] = useState([]); diff --git a/components/Previews.tsx b/components/home/Previews.tsx similarity index 100% rename from components/Previews.tsx rename to components/home/Previews.tsx diff --git a/components/SectionTitle.tsx b/components/home/SectionTitle.tsx similarity index 100% rename from components/SectionTitle.tsx rename to components/home/SectionTitle.tsx diff --git a/components/Top10.tsx b/components/home/Top10.tsx similarity index 88% rename from components/Top10.tsx rename to components/home/Top10.tsx index 877f730..4515353 100644 --- a/components/Top10.tsx +++ b/components/home/Top10.tsx @@ -2,9 +2,9 @@ import { useEffect, useState } from "react"; import Image from "next/image"; -import SectionTitle from "@/components/SectionTitle"; -import { fetchTop10Movies } from "../lib/api/tdmb/movie"; -import type { TMDBMovie } from "../lib/api/types/tdmbs"; +import SectionTitle from "@/components/home/SectionTitle"; +import { fetchTop10Movies } from "@/lib/api/tdmb/movie"; +import type { TMDBMovie } from "@/lib/api/types/tdmbs"; export default function Top10() { const [movies, setMovies] = useState([]); diff --git a/components/TrendingNow.tsx b/components/home/TrendingNow.tsx similarity index 88% rename from components/TrendingNow.tsx rename to components/home/TrendingNow.tsx index ee56aac..9362920 100644 --- a/components/TrendingNow.tsx +++ b/components/home/TrendingNow.tsx @@ -2,9 +2,9 @@ import { useEffect, useState } from "react"; import Image from "next/image"; -import SectionTitle from "@/components/SectionTitle"; -import { fetchTrendingMovies } from "../lib/api/tdmb/movie"; -import type { TMDBMovie } from "../lib/api/types/tdmbs"; +import SectionTitle from "@/components/home/SectionTitle"; +import { fetchTrendingMovies } from "@/lib/api/tdmb/movie"; +import type { TMDBMovie } from "@/lib/api/types/tdmbs"; export default function TrendingNow() { const [movies, setMovies] = useState([]); diff --git a/components/TvThrillerMysteries.tsx b/components/home/TvThrillerMysteries.tsx similarity index 88% rename from components/TvThrillerMysteries.tsx rename to components/home/TvThrillerMysteries.tsx index b88cf8a..55ccaae 100644 --- a/components/TvThrillerMysteries.tsx +++ b/components/home/TvThrillerMysteries.tsx @@ -2,9 +2,9 @@ import { useEffect, useState } from "react"; import Image from "next/image"; -import SectionTitle from "@/components/SectionTitle"; -import { fetchThrillerMysteryMovies } from "../lib/api/tdmb/movie"; -import type { TMDBTvShow } from "../lib/api/types/tdmbs"; +import SectionTitle from "@/components/home/SectionTitle"; +import { fetchThrillerMysteryMovies } from "@/lib/api/tdmb/movie"; +import type { TMDBTvShow } from "@/lib/api/types/tdmbs"; export default function TvThrillerMysteries() { const [movies, setMovies] = useState([]); diff --git a/components/USTvShow.tsx b/components/home/USTvShow.tsx similarity index 88% rename from components/USTvShow.tsx rename to components/home/USTvShow.tsx index e3ec007..99437b4 100644 --- a/components/USTvShow.tsx +++ b/components/home/USTvShow.tsx @@ -2,9 +2,9 @@ import { useEffect, useState } from "react"; import Image from "next/image"; -import SectionTitle from "@/components/SectionTitle"; -import { fetchUSTVShows } from "../lib/api/tdmb/tv"; -import type { TMDBTvShow } from "../lib/api/types/tdmbs"; +import SectionTitle from "@/components/home/SectionTitle"; +import { fetchUSTVShows } from "@/lib/api/tdmb/tv"; +import type { TMDBTvShow } from "@/lib/api/types/tdmbs"; export default function UsTvShow() { const [movies, setMovies] = useState([]); diff --git a/components/WatchItAgain.tsx b/components/home/WatchItAgain.tsx similarity index 88% rename from components/WatchItAgain.tsx rename to components/home/WatchItAgain.tsx index bcef87c..2f0905d 100644 --- a/components/WatchItAgain.tsx +++ b/components/home/WatchItAgain.tsx @@ -1,11 +1,11 @@ "use client"; import { useEffect, useState } from "react"; -import { fetchMovieById } from "../lib/api/tdmb/movie"; +import { fetchMovieById } from "@/lib/api/tdmb/movie"; import Image from "next/image"; -import SectionTitle from "@/components/SectionTitle"; +import SectionTitle from "@/components/home/SectionTitle"; import { watchHistory } from "@/data/watchHistory"; -import type { TMDBMovie } from "../lib/api/types/tdmbs"; +import type { TMDBMovie } from "@/lib/api/types/tdmbs"; export default function WatchItAgain() { const [movies, setMovies] = useState([]); From b9d8a4fcfc85566c2f16a18f80033d0d93316077 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Sat, 1 Nov 2025 15:35:52 +0900 Subject: [PATCH 53/82] =?UTF-8?q?fix:=20=ED=97=A4=EB=8D=94=EC=99=80=20navb?= =?UTF-8?q?ar=20UI=20=EC=B4=88=EA=B3=BC=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/home/page.tsx | 2 +- components/Navbar.tsx | 2 +- components/home/HomeHeader.tsx | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/home/page.tsx b/app/home/page.tsx index 0e0a1b5..35e165d 100644 --- a/app/home/page.tsx +++ b/app/home/page.tsx @@ -16,7 +16,7 @@ import WatchItAgain from "@/components/home/WatchItAgain"; export default async function Home() { return (
-
+
diff --git a/components/Navbar.tsx b/components/Navbar.tsx index c3dff65..888c155 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -18,7 +18,7 @@ export default function Navbar() { : "flex flex-col items-center text-[#8C8787] text-[8px]"; return ( -
+
Home diff --git a/components/home/HomeHeader.tsx b/components/home/HomeHeader.tsx index c87a140..88b1662 100644 --- a/components/home/HomeHeader.tsx +++ b/components/home/HomeHeader.tsx @@ -3,9 +3,9 @@ import logo from "@/public/icons/logo.svg"; import Image from "next/image"; -export default function Header() { +export default function HomeHeader() { return ( -
+
{logo}
From ad92980ff0e8677502783ed91b643f41ca6ed6a2 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Sat, 1 Nov 2025 15:39:17 +0900 Subject: [PATCH 54/82] =?UTF-8?q?style:=20=ED=99=88=20=ED=97=A4=EB=8D=94?= =?UTF-8?q?=20=EB=B0=B0=EA=B2=BD=20=ED=88=AC=EB=AA=85=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/home/HomeHeader.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/home/HomeHeader.tsx b/components/home/HomeHeader.tsx index 88b1662..0816cb2 100644 --- a/components/home/HomeHeader.tsx +++ b/components/home/HomeHeader.tsx @@ -5,7 +5,7 @@ import Image from "next/image"; export default function HomeHeader() { return ( -
+
{logo}
From 319a923bcfbafd0e48b14ac10fb86eef5baeb3d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=EC=84=B1=EC=95=84?= <170587664+sungahChooo@users.noreply.github.com> Date: Sat, 1 Nov 2025 15:48:18 +0900 Subject: [PATCH 55/82] Update README with team member names Added team members' names to the README. --- README.md | 39 +++------------------------------------ 1 file changed, 3 insertions(+), 36 deletions(-) diff --git a/README.md b/README.md index e215bc4..548b1a3 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,3 @@ -This is a [Next.js](https://nextjs.org) project bootstrapped with [`create-next-app`](https://nextjs.org/docs/app/api-reference/cli/create-next-app). - -## Getting Started - -First, run the development server: - -```bash -npm run dev -# or -yarn dev -# or -pnpm dev -# or -bun dev -``` - -Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. - -You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. - -This project uses [`next/font`](https://nextjs.org/docs/app/building-your-application/optimizing/fonts) to automatically optimize and load [Geist](https://vercel.com/font), a new font family for Vercel. - -## Learn More - -To learn more about Next.js, take a look at the following resources: - -- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API. -- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial. - -You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js) - your feedback and contributions are welcome! - -## Deploy on Vercel - -The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. - -Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. +# Team DiggIndie +λ°±μŠΉμ„  +μ‘°μ„±μ•„ From f3890cd11ffc54a2694b82e1e974972770ffb9c9 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Sat, 1 Nov 2025 15:58:15 +0900 Subject: [PATCH 56/82] =?UTF-8?q?fix:=20=EB=A1=9C=EC=BB=AC=20main=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/home/Banner.tsx | 130 +++++++++++++++++++++++++++++++++++++ package-lock.json | 112 +++++++++++--------------------- 2 files changed, 169 insertions(+), 73 deletions(-) create mode 100644 components/home/Banner.tsx diff --git a/components/home/Banner.tsx b/components/home/Banner.tsx new file mode 100644 index 0000000..4c77a5e --- /dev/null +++ b/components/home/Banner.tsx @@ -0,0 +1,130 @@ +'use client'; + +import { useEffect, useMemo, useRef, useState } from 'react'; +import { fetcher } from '@/lib/fetcher'; +import type { tmdbListResponse, tmdbTitle } from '@/types/tmdb'; +import Image from 'next/image'; +import add from '@/public/icons/add.svg'; +import play from '@/public/icons/play.svg'; +import info from '@/public/icons/info.svg'; + +const imgBase = process.env.NEXT_PUBLIC_TMDB_IMAGE_BASE || 'https://image.tmdb.org/t/p'; +const rotateTime = 20_000; // 20초 간격 (μž„μ˜) +const regionName = 'Korea'; + +// URL λ§Œλ“œλŠ” ν•¨μˆ˜ +function buildImageUrl(path?: string | null, size: 'w780' | 'w1280' | 'original' = 'w1280') { + if (!path) return ''; + try { + const cleanPath = path.startsWith('/') ? path.slice(1) : path; + return `${imgBase}/${size}/${cleanPath}`; + } catch { + return ''; + } +} + +export default function Banner() { + const [items, setItems] = useState([]); + const [index, setIndex] = useState(0); + const timerRef = useRef(null); + + // ν•œκ΅­ 인기 Top10 첫 마운트 λ‘œλ“œ + useEffect(() => { + (async () => { + try { + const data = await fetcher>('/3/movie/popular', { + language: 'ko-KR', + region: 'KR', + page: '1', + }); + setItems((data.results ?? []).slice(0, 10)); + setIndex(0); + } catch (e) { + console.error(e); + } + })(); + }, []); + + // 20μ΄ˆλ§ˆλ‹€ λ³€κ²½ + useEffect(() => { + if (!items.length) return; + const start = () => { + stop(); + timerRef.current = window.setInterval(() => { + setIndex((i) => (i + 1) % items.length); //index증가 + }, rotateTime); + }; + const stop = () => { + if (timerRef.current) { + window.clearInterval(timerRef.current); + timerRef.current = null; + } + }; + + start(); + return () => { + stop(); + }; + }, [items.length]); + + const current = items[index] ?? null; + const title = current?.title ?? current?.name ?? ''; + const backdrop = useMemo( + () => buildImageUrl(current?.backdrop_path ?? current?.poster_path, 'w1280'), + [current?.backdrop_path, current?.poster_path], + ); + const rank = Math.min(index + 1, 10); + + return ( +
+
+ {backdrop && ( + {title + )} + {/* 이미지 κ·Έλ ˆμ΄λ””μ–ΈνŠΈ */} +
+
+ +
+
+ + + TOP + 10 + + + #{rank} in {regionName} Today + + +
+
+ {/* My List */} + + + {/* Play */} + + + {/* Info */} + +
+
+
+ ); +} diff --git a/package-lock.json b/package-lock.json index 017ff5d..ffa0061 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,8 @@ "lottie-react": "^2.4.1", "next": "16.0.0", "react": "19.2.0", - "react-dom": "19.2.0" + "react-dom": "19.2.0", + "styled-jsx": "^5.1.7" }, "devDependencies": { "@eslint/js": "^9.38.0", @@ -22,12 +23,15 @@ "@types/react-dom": "^19", "eslint": "^9.38.0", "eslint-config-next": "16.0.0", - "autoprefixer": "^10.4.21", - "eslint": "^9", - "eslint-config-next": "16.0.0", - "postcss": "^8.5.6", - "tailwindcss": "^4.1.16", - "typescript": "^5" + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-prettier": "^5.5.4", + "eslint-plugin-react": "^7.37.5", + "globals": "^16.4.0", + "jiti": "^2.6.1", + "prettier": "^3.6.2", + "tailwindcss": "^4", + "typescript": "^5", + "typescript-eslint": "^8.46.2" } }, "node_modules/@alloc/quick-lru": { @@ -2436,44 +2440,6 @@ "node": ">= 0.4" } }, - "node_modules/autoprefixer": { - "version": "10.4.21", - "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.21.tgz", - "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.24.4", - "caniuse-lite": "^1.0.30001702", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -3779,20 +3745,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -5262,22 +5214,35 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/next/node_modules/styled-jsx": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", + "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "license": "MIT", + "dependencies": { + "client-only": "0.0.1" + }, + "engines": { + "node": ">= 12.0.0" + }, + "peerDependencies": { + "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "babel-plugin-macros": { + "optional": true + } + } + }, "node_modules/node-releases": { "version": "2.0.26", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.26.tgz", "integrity": "sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA==", "license": "MIT" }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -5570,7 +5535,8 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/prelude-ls": { "version": "1.2.1", @@ -6315,9 +6281,9 @@ "peer": true }, "node_modules/styled-jsx": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", - "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.7.tgz", + "integrity": "sha512-HPLmEIYprxCeWDMLYiaaAhsV3yGfIlCqzuVOybE6fjF3SUJmH67nCoMDO+nAvHNHo46OfvpCNu4Rcue82dMNFg==", "license": "MIT", "dependencies": { "client-only": "0.0.1" From ceb824544528e920ef33d61710b0475fb1fe02b6 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Sat, 1 Nov 2025 17:10:15 +0900 Subject: [PATCH 57/82] =?UTF-8?q?chore:=20=ED=98=91=EC=97=85=EC=9D=84=20?= =?UTF-8?q?=EC=9C=84=ED=95=9C=20prettier=20=EC=84=A4=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .vscode/settings.json | 16 ++++++++++++++++ package.json | 2 -- 2 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 .vscode/settings.json diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..90e20fe --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,16 @@ +{ + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "[javascript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[typescript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[typescriptreact]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[json]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + } +} diff --git a/package.json b/package.json index c4913d2..6077636 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,5 @@ "tailwindcss": "^4", "typescript": "^5", "typescript-eslint": "^8.46.2" - } } - From dfc23a06fe07aca7b611fa10565376923f639e1a Mon Sep 17 00:00:00 2001 From: baekseungsun Date: Mon, 3 Nov 2025 02:17:07 +0900 Subject: [PATCH 58/82] =?UTF-8?q?[#19]=20refactor:=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=9D=B4=EB=A6=84=20=EB=B3=80=EA=B2=BD,=20=EC=88=98=EC=A0=95,?= =?UTF-8?q?=20=EC=9C=84=EC=B9=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/page.tsx | 5 ++++- app/lottieLogo.tsx => components/LottieLogo.tsx | 2 +- {app => public}/animations/logo.json | 0 3 files changed, 5 insertions(+), 2 deletions(-) rename app/lottieLogo.tsx => components/LottieLogo.tsx (90%) rename {app => public}/animations/logo.json (100%) diff --git a/app/page.tsx b/app/page.tsx index 0e88e43..d9116ec 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,4 +1,6 @@ -import LottieLogo from "./lottieLogo"; +'use client'; + +import LottieLogo from "../components/LottieLogo"; export default function Landing() { return ( @@ -10,3 +12,4 @@ export default function Landing() { + diff --git a/app/lottieLogo.tsx b/components/LottieLogo.tsx similarity index 90% rename from app/lottieLogo.tsx rename to components/LottieLogo.tsx index a9ae44c..a6d4f06 100644 --- a/app/lottieLogo.tsx +++ b/components/LottieLogo.tsx @@ -2,7 +2,7 @@ import dynamic from "next/dynamic"; import { useRouter } from "next/navigation"; -import LogoAnimation from "./animations/logo.json"; +import LogoAnimation from "@/public/animations/logo.json"; const Lottie = dynamic(() => import("lottie-react"), { ssr: false }); diff --git a/app/animations/logo.json b/public/animations/logo.json similarity index 100% rename from app/animations/logo.json rename to public/animations/logo.json From f2f67729dd7bb577d2ee7abb09d09e1246410cdf Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Wed, 5 Nov 2025 19:32:05 +0900 Subject: [PATCH 59/82] =?UTF-8?q?chore:=20=EC=A0=88=EB=8C=80=EA=B2=BD?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=BC=EA=B4=80=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/home/page.tsx | 37 +- app/page.tsx | 6 +- components/LottieLogo.tsx | 18 +- components/home/AfricanMovies.tsx | 50 -- components/home/Banner.tsx | 132 ---- components/home/HomeHeader.tsx | 6 +- components/home/Previews.tsx | 26 - components/home/section/Banner.tsx | 130 ++++ .../home/{ => section}/ContinueWatching.tsx | 29 +- .../{Nollywood.tsx => section/Hollywood.tsx} | 27 +- components/home/section/KoreanMovies.tsx | 47 ++ components/home/{ => section}/MyList.tsx | 21 +- .../Mysteries.tsx} | 25 +- .../home/{ => section}/NetflixOriginals.tsx | 23 +- components/home/{ => section}/NewReleases.tsx | 21 +- components/home/{ => section}/Popular.tsx | 25 +- components/home/section/Previews.tsx | 30 + .../home/{ => section}/SectionTitle.tsx | 0 components/home/{ => section}/Top10.tsx | 21 +- components/home/{ => section}/TrendingNow.tsx | 21 +- components/home/{ => section}/USTvShow.tsx | 21 +- .../home/{ => section}/WatchItAgain.tsx | 25 +- lib/api/tdmb/combined.ts | 110 +-- lib/api/tdmb/movie.ts | 149 ++-- package-lock.json | 634 +++--------------- package.json | 3 +- 26 files changed, 597 insertions(+), 1040 deletions(-) delete mode 100644 components/home/AfricanMovies.tsx delete mode 100644 components/home/Banner.tsx delete mode 100644 components/home/Previews.tsx create mode 100644 components/home/section/Banner.tsx rename components/home/{ => section}/ContinueWatching.tsx (64%) rename components/home/{Nollywood.tsx => section/Hollywood.tsx} (57%) create mode 100644 components/home/section/KoreanMovies.tsx rename components/home/{ => section}/MyList.tsx (68%) rename components/home/{TvThrillerMysteries.tsx => section/Mysteries.tsx} (60%) rename components/home/{ => section}/NetflixOriginals.tsx (64%) rename components/home/{ => section}/NewReleases.tsx (67%) rename components/home/{ => section}/Popular.tsx (63%) create mode 100644 components/home/section/Previews.tsx rename components/home/{ => section}/SectionTitle.tsx (100%) rename components/home/{ => section}/Top10.tsx (68%) rename components/home/{ => section}/TrendingNow.tsx (67%) rename components/home/{ => section}/USTvShow.tsx (68%) rename components/home/{ => section}/WatchItAgain.tsx (59%) diff --git a/app/home/page.tsx b/app/home/page.tsx index 35e165d..747a82e 100644 --- a/app/home/page.tsx +++ b/app/home/page.tsx @@ -1,18 +1,18 @@ -import Banner from "../../components/home/Banner"; -import HomeHeader from "../../components/home/HomeHeader"; -import Previews from "@/components/home/Previews"; -import AfricanMovies from "@/components/home/AfricanMovies"; -import ContinueWataching from "@/components/home/ContinueWatching"; -import MyList from "@/components/home/MyList"; -import NetflixOriginals from "@/components/home/NetflixOriginals"; -import NewReleases from "@/components/home/NewReleases"; -import Nollywood from "@/components/home/Nollywood"; -import Popular from "@/components/home/Popular"; -import Top10 from "@/components/home/Top10"; -import TrendingNow from "@/components/home/TrendingNow"; -import ThrillerMysteries from "@/components/home/TvThrillerMysteries"; -import UsTvShow from "@/components/home/USTvShow"; -import WatchItAgain from "@/components/home/WatchItAgain"; +import Banner from '../../components/home/section/Banner'; +import HomeHeader from '../../components/home/HomeHeader'; +import Previews from '@/components/home/section/Previews'; +import KoreanMovies from '@/components/home/section/KoreanMovies'; +import ContinueWataching from '@/components/home/section/ContinueWatching'; +import MyList from '@/components/home/section/MyList'; +import NetflixOriginals from '@/components/home/section/NetflixOriginals'; +import NewReleases from '@/components/home/section/NewReleases'; +import Hollywood from '@/components/home/section/Hollywood'; +import Popular from '@/components/home/section/Popular'; +import Top10 from '@/components/home/section/Top10'; +import TrendingNow from '@/components/home/section/TrendingNow'; +import Mysteries from '@/components/home/section/Mysteries'; +import UsTvShow from '@/components/home/section/USTvShow'; +import WatchItAgain from '@/components/home/section/WatchItAgain'; export default async function Home() { return (
@@ -27,14 +27,13 @@ export default async function Home() { - - + + - + -
); diff --git a/app/page.tsx b/app/page.tsx index d9116ec..b297f58 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,6 +1,6 @@ 'use client'; -import LottieLogo from "../components/LottieLogo"; +import LottieLogo from '../components/LottieLogo'; export default function Landing() { return ( @@ -9,7 +9,3 @@ export default function Landing() {
); } - - - - diff --git a/components/LottieLogo.tsx b/components/LottieLogo.tsx index a6d4f06..5cf393f 100644 --- a/components/LottieLogo.tsx +++ b/components/LottieLogo.tsx @@ -1,25 +1,21 @@ -"use client"; +'use client'; -import dynamic from "next/dynamic"; -import { useRouter } from "next/navigation"; -import LogoAnimation from "@/public/animations/logo.json"; +import dynamic from 'next/dynamic'; +import { useRouter } from 'next/navigation'; +import LogoAnimation from '@/public/animations/logo.json'; -const Lottie = dynamic(() => import("lottie-react"), { ssr: false }); +const Lottie = dynamic(() => import('lottie-react'), { ssr: false }); export default function LottieLogo() { const router = useRouter(); const handleComplete = () => { - router.push("/home"); + router.push('/home'); }; return (
- +
); } diff --git a/components/home/AfricanMovies.tsx b/components/home/AfricanMovies.tsx deleted file mode 100644 index 47bc556..0000000 --- a/components/home/AfricanMovies.tsx +++ /dev/null @@ -1,50 +0,0 @@ -"use client"; - -import { useEffect, useState } from "react"; -import Image from "next/image"; -import SectionTitle from "@/components/home/SectionTitle"; -import { fetchAfricanMovies } from "../../lib/api/tdmb/movie"; -import type { TMDBMovie } from "../../lib/api/types/tdmbs"; - -export default function AfricanMovies() { - const [movies, setMovies] = useState([]); - - useEffect(() => { - const getAfricanMovies = async () => { - try { - const movieData = await fetchAfricanMovies(); - setMovies(movieData); - } catch (error) { - console.error("Failed to fetch popular movies:", error); - } - }; - - getAfricanMovies(); - }, []); - - return ( -
- - -
- {movies - .filter((movie) => movie.poster_path) // null μ•„λ‹Œ κ²ƒλ§Œ - .slice(0, 5) // 5개만 ν‘œμ‹œ - .map((movie) => ( -
- {movie.title} -
- ))} -
-
- ); -} diff --git a/components/home/Banner.tsx b/components/home/Banner.tsx deleted file mode 100644 index 3d4a259..0000000 --- a/components/home/Banner.tsx +++ /dev/null @@ -1,132 +0,0 @@ -"use client"; - -import { useEffect, useMemo, useRef, useState } from "react"; -import { fetcher } from "@/lib/fetcher"; -import type { tmdbListResponse, tmdbTitle } from "@/types/tmdb"; -import Image from "next/image"; -import add from "@/public/icons/add.svg"; -import play from "@/public/icons/play.svg"; -import info from "@/public/icons/info.svg"; - -const imgBase = process.env.NEXT_PUBLIC_TMDB_IMAGE_BASE || "https://image.tmdb.org/t/p"; -const rotateTime = 20_000; // 20초 간격 (μž„μ˜) -const regionName = "Korea"; - -// URL λ§Œλ“œλŠ” ν•¨μˆ˜ -function buildImageUrl( - path?: string | null, - size: "w780" | "w1280" | "original" = "w1280" -) { - if (!path) return ""; - try { - const cleanPath = path.startsWith("/") ? path.slice(1) : path; - return `${imgBase}/${size}/${cleanPath}`; - } catch { - return ""; - } -} - -export default function Banner() { - const [items, setItems] = useState([]); - const [index, setIndex] = useState(0); - const timerRef = useRef(null); - - // ν•œκ΅­ 인기 Top10 첫 마운트 λ‘œλ“œ - useEffect(() => { - (async () => { - try { - const data = await fetcher>( - "/3/movie/popular", - { language: "ko-KR", region: "KR", page: "1" } - ); - setItems((data.results ?? []).slice(0, 10)); - setIndex(0); - } catch (e) { - console.error(e); - } - })(); - }, []); - - // 20μ΄ˆλ§ˆλ‹€ λ³€κ²½ - useEffect(() => { - if (!items.length) return; - const start = () => { - stop(); - timerRef.current = window.setInterval(() => { - setIndex((i) => (i + 1) % items.length); //index증가 - }, rotateTime); - }; - const stop = () => { - if (timerRef.current) { - window.clearInterval(timerRef.current); - timerRef.current = null; - } - }; - - start(); - return () => { - stop(); - }; - }, [items.length]); - - const current = items[index] ?? null; - const title = current?.title ?? current?.name ?? ""; - const backdrop = useMemo( - () => buildImageUrl(current?.backdrop_path ?? current?.poster_path, "w1280"), - [current?.backdrop_path, current?.poster_path] - ); - const rank = Math.min(index + 1, 10); - - return ( -
-
- {backdrop && ( - {title - )} - {/* 이미지 κ·Έλ ˆμ΄λ””μ–ΈνŠΈ */} -
-
- -
-
- - - TOP - 10 - - - #{rank} in {regionName} Today - - -
-
- {/* My List */} - - - {/* Play */} - - - {/* Info */} - -
-
-
- ); -} diff --git a/components/home/HomeHeader.tsx b/components/home/HomeHeader.tsx index 0816cb2..c48f960 100644 --- a/components/home/HomeHeader.tsx +++ b/components/home/HomeHeader.tsx @@ -1,7 +1,7 @@ -"use client"; +'use client'; -import logo from "@/public/icons/logo.svg"; -import Image from "next/image"; +import logo from '@/public/icons/logo.svg'; +import Image from 'next/image'; export default function HomeHeader() { return ( diff --git a/components/home/Previews.tsx b/components/home/Previews.tsx deleted file mode 100644 index 553fbf6..0000000 --- a/components/home/Previews.tsx +++ /dev/null @@ -1,26 +0,0 @@ -"use client"; - -import { useEffect, useState } from "react"; -import { getPreviewPosters } from "@/lib/tmdb"; - -export default function Previews() { - //ν¬μŠ€ν„°μš© URL λ°°μ—΄ - const [items, setItems] = useState<{ poster: string }[]>([]); - - useEffect(() => { - getPreviewPosters().then(setItems).catch(console.error); - }, []); - - return ( -
- Previews -
- {items.map((item, i) => ( -
- {`preview-${i}`} -
- ))} -
-
- ); -} diff --git a/components/home/section/Banner.tsx b/components/home/section/Banner.tsx new file mode 100644 index 0000000..199f7b3 --- /dev/null +++ b/components/home/section/Banner.tsx @@ -0,0 +1,130 @@ +'use client'; + +import { useEffect, useMemo, useRef, useState } from 'react'; +import { fetcher } from '@/lib/fetcher'; +import type { tmdbListResponse, tmdbTitle } from '@/types/tmdb'; +import Image from 'next/image'; +import add from '@/public/icons/add.svg'; +import play from '@/public/icons/play.svg'; +import info from '@/public/icons/info.svg'; + +const imgBase = process.env.NEXT_PUBLIC_TMDB_IMAGE_BASE || 'https://image.tmdb.org/t/p'; +const rotateTime = 20_000; // 20초 간격 (μž„μ˜) +const regionName = 'Korea'; + +// URL λ§Œλ“œλŠ” ν•¨μˆ˜ +function buildImageUrl(path?: string | null, size: 'w780' | 'w1280' | 'original' = 'w1280') { + if (!path) return ''; + try { + const cleanPath = path.startsWith('/') ? path.slice(1) : path; + return `${imgBase}/${size}/${cleanPath}`; + } catch { + return ''; + } +} + +export default function Banner() { + const [items, setItems] = useState([]); + const [index, setIndex] = useState(0); + const timerRef = useRef(null); + + // ν•œκ΅­ 인기 Top10 첫 마운트 λ‘œλ“œ + useEffect(() => { + (async () => { + try { + const data = await fetcher>('/3/movie/popular', { + language: 'ko-KR', + region: 'KR', + page: '1', + }); + setItems((data.results ?? []).slice(0, 10)); + setIndex(0); + } catch (e) { + console.error(e); + } + })(); + }, []); + + // 20μ΄ˆλ§ˆλ‹€ λ³€κ²½ + useEffect(() => { + if (!items.length) return; + const start = () => { + stop(); + timerRef.current = window.setInterval(() => { + setIndex((i) => (i + 1) % items.length); //index증가 + }, rotateTime); + }; + const stop = () => { + if (timerRef.current) { + window.clearInterval(timerRef.current); + timerRef.current = null; + } + }; + + start(); + return () => { + stop(); + }; + }, [items.length]); + + const current = items[index] ?? null; + const title = current?.title ?? current?.name ?? ''; + const backdrop = useMemo( + () => buildImageUrl(current?.backdrop_path ?? current?.poster_path, 'w1280'), + [current?.backdrop_path, current?.poster_path], + ); + const rank = Math.min(index + 1, 10); + + return ( +
+
+ {backdrop && ( + {title + )} + {/* 이미지 κ·Έλ ˆμ΄λ””μ–ΈνŠΈ */} +
+
+ +
+
+ + + TOP + 10 + + + #{rank} in {regionName} Today + + +
+
+ {/* My List */} + + + {/* Play */} + + + {/* Info */} + +
+
+
+ ); +} diff --git a/components/home/ContinueWatching.tsx b/components/home/section/ContinueWatching.tsx similarity index 64% rename from components/home/ContinueWatching.tsx rename to components/home/section/ContinueWatching.tsx index 6f00495..9ea95b9 100644 --- a/components/home/ContinueWatching.tsx +++ b/components/home/section/ContinueWatching.tsx @@ -1,14 +1,14 @@ -"use client"; +'use client'; -import { useEffect, useState } from "react"; -import { fetchMovieById } from "../../lib/api/tdmb/movie"; -import Image from "next/image"; -import SectionTitle from "@/components/home/SectionTitle"; -import { watchHistory } from "@/data/watchHistory"; -import type { TMDBMovie } from "../../lib/api/types/tdmbs"; +import { useEffect, useState } from 'react'; +import { fetchMovieById } from '@/lib/api/tdmb/movie'; +import Image from 'next/image'; +import SectionTitle from '@/components/home/section/SectionTitle'; +import { watchHistory } from '@/data/watchHistory'; +import type { TMDBMovie } from '@/lib/api/types/tdmbs'; // μ‚¬μš©μž 이름 κ°€μ Έμ˜€κΈ° (더미 데이터 κΈ°μ€€) -const userName = watchHistory[0]?.userName || "User"; +const userName = watchHistory[0]?.userName || 'User'; const MOCK_WATCHING_IDS = [550, 299534, 155, 597, 681]; export default function ContinueWatching() { @@ -16,9 +16,7 @@ export default function ContinueWatching() { useEffect(() => { async function loadMovies() { - const data = await Promise.all( - MOCK_WATCHING_IDS.map((id) => fetchMovieById(id)) - ); + const data = await Promise.all(MOCK_WATCHING_IDS.map((id) => fetchMovieById(id))); setMovies(data); } loadMovies(); @@ -28,14 +26,11 @@ export default function ContinueWatching() {
-
+
{movies .filter((movie) => movie.poster_path) .map((movie) => ( -
+
{movie.title} {/* μ§„ν–‰λ₯  ν‘œμ‹œ*/}
-
+
))} diff --git a/components/home/Nollywood.tsx b/components/home/section/Hollywood.tsx similarity index 57% rename from components/home/Nollywood.tsx rename to components/home/section/Hollywood.tsx index 9fefd60..200f509 100644 --- a/components/home/Nollywood.tsx +++ b/components/home/section/Hollywood.tsx @@ -1,10 +1,10 @@ -"use client"; +'use client'; -import { useEffect, useState } from "react"; -import Image from "next/image"; -import SectionTitle from "@/components/home/SectionTitle"; -import { fetchNollywoodMovies } from "@/lib/api/tdmb/combined"; -import type { TMDBMovie, TMDBTvShow } from "@/lib/api/types/tdmbs"; +import { useEffect, useState } from 'react'; +import Image from 'next/image'; +import SectionTitle from '@/components/home/section/SectionTitle'; +import { fetchHollywoodMovies } from '@/lib/api/tdmb/combined'; +import type { TMDBMovie, TMDBTvShow } from '@/lib/api/types/tdmbs'; type CombinedItem = TMDBMovie | TMDBTvShow; @@ -14,10 +14,10 @@ export default function Nollywood() { useEffect(() => { const loadMovies = async () => { try { - const movieData = await fetchNollywoodMovies(); + const movieData = await fetchHollywoodMovies(); setData(movieData); } catch (error) { - console.error("Failed to fetch popular movies:", error); + console.error('Failed to fetch Hollywood movies:', error); } }; @@ -26,20 +26,17 @@ export default function Nollywood() { return (
- + -
+
{data .filter((movie) => movie.poster_path) // null μ•„λ‹Œ κ²ƒλ§Œ .slice(0, 5) // 5개만 ν‘œμ‹œ .map((movie) => ( -
+
{("title"([]); + + useEffect(() => { + const loadMovies = async () => { + try { + const data = await fetchKoreanMovies(); + setMovies(data); + } catch (error) { + console.error('Failed to fetch Korean movies:', error); + } + }; + + loadMovies(); + }, []); + + return ( +
+ + +
+ {movies + .filter((movie) => movie.poster_path) // null μ•„λ‹Œ κ²ƒλ§Œ + .slice(0, 5) // 5개만 ν‘œμ‹œ + .map((movie) => ( +
+ {movie.title} +
+ ))} +
+
+ ); +} diff --git a/components/home/MyList.tsx b/components/home/section/MyList.tsx similarity index 68% rename from components/home/MyList.tsx rename to components/home/section/MyList.tsx index 65fa2a6..4071e7c 100644 --- a/components/home/MyList.tsx +++ b/components/home/section/MyList.tsx @@ -1,9 +1,9 @@ -"use client"; +'use client'; -import { useEffect, useState } from "react"; -import { fetchMovieById } from "@/lib/api/tdmb/movie"; -import Image from "next/image"; -import SectionTitle from "@/components/home/SectionTitle"; +import { useEffect, useState } from 'react'; +import { fetchMovieById } from '@/lib/api/tdmb/movie'; +import Image from 'next/image'; +import SectionTitle from '@/components/home/section/SectionTitle'; type Movie = { id: number; @@ -18,9 +18,7 @@ export default function MyList() { useEffect(() => { async function loadMovies() { - const data = await Promise.all( - MOCK_WATCHING_IDS.map((id) => fetchMovieById(id)) - ); + const data = await Promise.all(MOCK_WATCHING_IDS.map((id) => fetchMovieById(id))); setMovies(data); } loadMovies(); @@ -30,14 +28,11 @@ export default function MyList() {
-
+
{movies .filter((movie) => movie.poster_path) .map((movie) => ( -
+
{movie.title}([]); @@ -12,10 +12,10 @@ export default function TvThrillerMysteries() { useEffect(() => { const loadMovies = async () => { try { - const movieData = await fetchThrillerMysteryMovies(); + const movieData = await fetchMysteryMovies(); setMovies(movieData); } catch (error) { - console.error("Failed to fetch popular movies:", error); + console.error('Failed to fetch Mysteries movies:', error); } }; @@ -24,17 +24,14 @@ export default function TvThrillerMysteries() { return (
- + -
+
{movies .filter((movie) => movie.poster_path) // null μ•„λ‹Œ κ²ƒλ§Œ .slice(0, 5) // 5개만 ν‘œμ‹œ .map((movie) => ( -
+
{movie.name} -
+
{data .filter((movie) => movie.poster_path) // null μ•„λ‹Œ κ²ƒλ§Œ .slice(0, 5) // 5개만 ν‘œμ‹œ .map((movie) => ( -
+
{("title"([]); @@ -15,7 +15,7 @@ export default function NewReleases() { const movieData = await fetchNewReleases(); setMovies(movieData); } catch (error) { - console.error("Failed to fetch popular movies:", error); + console.error('Failed to fetch popular movies:', error); } }; @@ -26,15 +26,12 @@ export default function NewReleases() {
-
+
{movies .filter((movie) => movie.poster_path) // null μ•„λ‹Œ κ²ƒλ§Œ .slice(0, 5) // 5개만 ν‘œμ‹œ .map((movie) => ( -
+
{movie.title}([]); useEffect(() => { - const getPopularMovies = async () => { + const loadMovies = async () => { try { const movieData = await fetchPopularMovies(); setMovies(movieData); } catch (error) { - console.error("Failed to fetch popular movies:", error); + console.error('Failed to fetch popular movies:', error); } }; - getPopularMovies(); + loadMovies(); }, []); return (
-
+
{movies .filter((movie) => movie.poster_path) // null μ•„λ‹Œ κ²ƒλ§Œ .slice(0, 5) // 5개만 ν‘œμ‹œ .map((movie) => ( -
+
{movie.title}([]); + + useEffect(() => { + getPreviewPosters().then(setItems).catch(console.error); + }, []); + + return ( +
+ Previews +
+ {items.map((item, i) => ( +
+ {`preview-${i}`} +
+ ))} +
+
+ ); +} diff --git a/components/home/SectionTitle.tsx b/components/home/section/SectionTitle.tsx similarity index 100% rename from components/home/SectionTitle.tsx rename to components/home/section/SectionTitle.tsx diff --git a/components/home/Top10.tsx b/components/home/section/Top10.tsx similarity index 68% rename from components/home/Top10.tsx rename to components/home/section/Top10.tsx index 4515353..4eaf59a 100644 --- a/components/home/Top10.tsx +++ b/components/home/section/Top10.tsx @@ -1,10 +1,10 @@ -"use client"; +'use client'; -import { useEffect, useState } from "react"; -import Image from "next/image"; -import SectionTitle from "@/components/home/SectionTitle"; -import { fetchTop10Movies } from "@/lib/api/tdmb/movie"; -import type { TMDBMovie } from "@/lib/api/types/tdmbs"; +import { useEffect, useState } from 'react'; +import Image from 'next/image'; +import SectionTitle from '@/components/home/section/SectionTitle'; +import { fetchTop10Movies } from '@/lib/api/tdmb/movie'; +import type { TMDBMovie } from '@/lib/api/types/tdmbs'; export default function Top10() { const [movies, setMovies] = useState([]); @@ -15,7 +15,7 @@ export default function Top10() { const movieData = await fetchTop10Movies(); setMovies(movieData); } catch (error) { - console.error("Failed to fetch popular movies:", error); + console.error('Failed to fetch popular movies:', error); } }; @@ -26,15 +26,12 @@ export default function Top10() {
-
+
{movies .filter((movie) => movie.poster_path) // null μ•„λ‹Œ κ²ƒλ§Œ .slice(0, 10) // 10개 ν‘œμ‹œ! .map((movie) => ( -
+
{movie.title}([]); @@ -15,7 +15,7 @@ export default function TrendingNow() { const movieData = await fetchTrendingMovies(); setMovies(movieData); } catch (error) { - console.error("Failed to fetch popular movies:", error); + console.error('Failed to fetch popular movies:', error); } }; @@ -26,15 +26,12 @@ export default function TrendingNow() {
-
+
{movies .filter((movie) => movie.poster_path) // null μ•„λ‹Œ κ²ƒλ§Œ .slice(0, 5) // 5개만 ν‘œμ‹œ .map((movie) => ( -
+
{movie.title}([]); @@ -15,7 +15,7 @@ export default function UsTvShow() { const movieData = await fetchUSTVShows(); setMovies(movieData); } catch (error) { - console.error("Failed to fetch popular movies:", error); + console.error('Failed to fetch popular movies:', error); } }; @@ -26,15 +26,12 @@ export default function UsTvShow() {
-
+
{movies .filter((movie) => movie.poster_path) // null μ•„λ‹Œ κ²ƒλ§Œ .slice(0, 5) // 5개만 ν‘œμ‹œ .map((movie) => ( -
+
{movie.name}([]); useEffect(() => { async function loadMovies() { - const data = await Promise.all( - watchHistory.map((item) => fetchMovieById(item.contentId)) - ); + const data = await Promise.all(watchHistory.map((item) => fetchMovieById(item.contentId))); setMovies(data); } loadMovies(); @@ -24,14 +22,11 @@ export default function WatchItAgain() {
-
+
{movies .filter((movie) => movie.poster_path) .map((movie) => ( -
+
{movie.title}>(`${BASE_URL}/discover/movie`, { + params: { + api_key: API_KEY, + language, + with_watch_providers, + watch_region, + sort_by: 'popularity.desc', + page, + }, + }), + axios.get>(`${BASE_URL}/discover/tv`, { + params: { + api_key: API_KEY, + language, + with_networks: netflixID, + sort_by: 'popularity.desc', + page, + }, + }), + ]); - const movieData: TMDBApiResponse = await movieRes.json(); - const tvData: TMDBApiResponse = await tvRes.json(); + // axiosλŠ” μžλ™μœΌλ‘œ JSON νŒŒμ‹±ν•΄μ„œ .data에 λ‹΄κΉλ‹ˆλ‹€. + const movieData = movieRes.data; + const tvData = tvRes.data; - return [...movieData.results.slice(0, 5), ...tvData.results.slice(0, 5)]; + return [...movieData.results.slice(0, 5), ...tvData.results.slice(0, 5)]; + } catch (error) { + console.error('❌ fetchNetflixOriginals error:', error); + return []; + } } -//Nollywood Movies & TV λΆ€λΆ„ -export async function fetchNollywoodMovies( - region = "NG", - language = "en-US", - page = 1 -) { - //λ‚˜μ΄μ§€λ¦¬μ•„ μ˜ν™” API 호좜 - const moviesRes = await fetch( - `${BASE_URL}/discover/movie?api_key=${API_KEY}&with_origin_country=${region}&language=${language}&sort_by=popularity.desc&page=${page}`, - { - next: { revalidate: 3600 }, // ISR 캐싱: 1μ‹œκ°„λ§ˆλ‹€ μƒˆλ‘œ 패치 - } - ); - const moviesData = await moviesRes.json(); - const movies = moviesData.results.slice(0, 5) || []; // μƒμœ„ 5개 +//Hollywood Movies & TV λΆ€λΆ„ +export async function fetchHollywoodMovies(region = 'US', language = 'en-US', page = 1) { + try { + const [moviesRes, tvRes] = await Promise.all([ + axios.get>(`${BASE_URL}/discover/movie`, { + params: { + api_key: API_KEY, + with_origin_country: region, + language, + sort_by: 'popularity.desc', + page, + }, + }), + axios.get>(`${BASE_URL}/discover/tv`, { + params: { + api_key: API_KEY, + with_origin_country: region, + language, + sort_by: 'popularity.desc', + page, + }, + }), + ]); - //λ‚˜μ΄μ§€λ¦¬μ•„ tv μ‡Ό API 호좜 - const tvRes = await fetch( - `${BASE_URL}/discover/tv?api_key=${API_KEY}&with_origin_country=${region}&language=${language}&sort_by=popularity.desc&page=${page}`, - { - next: { revalidate: 3600 }, // ISR 캐싱: 1μ‹œκ°„λ§ˆλ‹€ μƒˆλ‘œ 패치 - } - ); - const tvShowData = await tvRes.json(); - const tvShows = tvShowData.results.slice(0, 5) || []; // μƒμœ„ 5개 + const movies = moviesRes.data.results.slice(0, 5); + const tvShows = tvRes.data.results.slice(0, 5); - const combined = [...movies, ...tvShows]; - return combined; + return [...movies, ...tvShows]; + } catch (error) { + console.error('❌ fetchHollywoodMovies error:', error); + return []; + } } diff --git a/lib/api/tdmb/movie.ts b/lib/api/tdmb/movie.ts index 5523820..7ce2a93 100644 --- a/lib/api/tdmb/movie.ts +++ b/lib/api/tdmb/movie.ts @@ -1,88 +1,97 @@ -import { BASE_URL, API_KEY, REVALIDATE_TIME } from "../../constants/tdmbs"; -import type { TMDBApiResponse, TMDBMovie } from "../types/tdmbs"; +import { BASE_URL, API_KEY } from '@/lib/constants/tdmbs'; +import type { TMDBApiResponse, TMDBMovie, TMDBTvShow } from '@/lib/api/types/tdmbs'; +import axios from 'axios'; //New Releases λΆ€λΆ„ -export async function fetchNewReleases( - language = "en-US", - page = 1, - region = "US" -): Promise { - const res = await fetch( - `${BASE_URL}/movie/now_playing?api_key=${API_KEY}&language=${language}&page=${page}®ion=${region}`, - { next: { revalidate: REVALIDATE_TIME } } - ); - if (!res.ok) throw new Error("Failed to fetch movies"); - const data: TMDBApiResponse = await res.json(); - return data.results; +export async function fetchNewReleases(language = 'en-US', page = 1, region = 'US'): Promise { + try { + const res = await axios.get>(`${BASE_URL}/movie/now_playing`, { + params: { + api_key: API_KEY, + language, + page, + region, + }, + }); + return res.data.results; + } catch (error) { + console.error('❌ fetchNewReleases error:', error); + return []; + } } //Popular moviesλΆ€λΆ„ -export async function fetchPopularMovies( - language = "en-US", - page = 1 -): Promise { - const res = await fetch( - `${BASE_URL}/movie/popular?api_key=${API_KEY}&language=${language}&page=${page}`, - { next: { revalidate: REVALIDATE_TIME } } - ); - if (!res.ok) throw new Error("Failed to fetch movies"); - const data: TMDBApiResponse = await res.json(); - return data.results; +export async function fetchPopularMovies(language = 'en-US', page = 1): Promise { + try { + const res = await axios.get>(`${BASE_URL}/movie/popular`, { + params: { + api_key: API_KEY, + language, + page, + }, + }); + return res.data.results; + } catch (error) { + console.error('fetchPopularMovies error:', error); + return []; + } } //TV Thriller Mysteries λΆ€λΆ„ //Tv μž₯λ₯΄μ—λŠ” Thriller μž₯λ₯΄ μ½”λ“œκ°€ μ—†μŒ //Mystery μž₯λ₯΄μ½”λ“œμΈ 9648만 μ‚¬μš© -export async function fetchThrillerMysteryMovies( - language = "en-US", - page = 1, - with_genres = "9648" -) { - const res = await fetch( - `${BASE_URL}/discover/tv?api_key=${API_KEY}&language=${language}&with_genres=${with_genres}&sort_by=popularity.desc&page=${page}`, - { next: { revalidate: 3600 } } - ); - const data = await res.json(); - const tvShows = data.results.slice(0, 5); // μƒμœ„ 5개 - return tvShows; +export async function fetchMysteryMovies(language = 'en-US', page = 1, with_genres = '9648') { + try { + const res = await axios.get>(`${BASE_URL}/discover/tv`, { + params: { + api_key: API_KEY, + language, + page, + with_genres, + }, + }); + return res.data.results.slice(0, 5); // μƒμœ„ 5개 + } catch (error) { + console.log('fetchThrillerMysteryMovies error:', error); + return []; + } } -//African Movies λΆ€λΆ„ -//with_origin_country=NG β†’ κ·Έ λ‚˜λΌμ—μ„œ μƒμ˜ 쀑인 μ˜ν™”κ°€ μ•„λ‹Œ μ§„μ§œ λ‚˜μ΄μ§€λ¦¬μ•„ μ˜ν™”/TV 선택 -export async function fetchAfricanMovies( - region = "ZA", - language = "en-US", - page = 1 -) { - const res = await fetch( - `${BASE_URL}/movie/popular?api_key=${API_KEY}&with_origin_country=${region}&language=${language}&page=${page}`, - { - next: { revalidate: 3600 }, // ISR 캐싱: 1μ‹œκ°„λ§ˆλ‹€ μƒˆλ‘œ 패치 - } - ); - - if (!res.ok) { - throw new Error("Failed to fetch movies"); +//Korean Movies λΆ€λΆ„ +//ν•œκ΅­ μ˜ν™” 인기순 쑰회 +//with_origin_country=KR β†’ κ·Έ λ‚˜λΌμ—μ„œ μƒμ˜ 쀑인 μ˜ν™”κ°€ μ•„λ‹Œ μ§„μ§œ ν•œκ΅­ μ˜ν™”/TV 선택 +export async function fetchKoreanMovies(region = 'KR', language = 'en-US', page = 1) { + try { + const res = await axios.get>(`${BASE_URL}/discover/movie`, { + params: { + api_key: API_KEY, + with_origin_country: region, + sort_by: 'popularity.desc', + language, + page, + }, + }); + return res.data.results; + } catch (error) { + console.log('fetch Korean Movies error:', error); + return []; } - - const data = await res.json(); - return data.results; } //Top 10 in Nigiria λΆ€λΆ„ export async function fetchTop10Movies( - region = "NG", //κΈ°μ€€ κ΅­κ°€ μ •ν•  수 있음 - language = "en-US", - page = 1 + region = 'NG', //κΈ°μ€€ κ΅­κ°€ μ •ν•  수 있음 + language = 'en-US', + page = 1, ) { const res = await fetch( `${BASE_URL}/movie/top_rated?api_key=${API_KEY}®ion=${region}&language=${language}&page=${page}`, { next: { revalidate: 3600 }, // ISR 캐싱: 1μ‹œκ°„λ§ˆλ‹€ μƒˆλ‘œ 패치 - } + }, ); if (!res.ok) { - throw new Error("Failed to fetch movies"); + throw new Error('Failed to fetch movies'); } const data = await res.json(); @@ -91,18 +100,18 @@ export async function fetchTop10Movies( //Trending Now λΆ€λΆ„ export async function fetchTrendingMovies( - timeWindow: "day" | "week" = "week", // day: 24μ‹œκ°„, week: 7일 선택 κ°€λŠ₯ - language = "en-US", - page = 1 + timeWindow: 'day' | 'week' = 'week', // day: 24μ‹œκ°„, week: 7일 선택 κ°€λŠ₯ + language = 'en-US', + page = 1, ) { const res = await fetch( `${BASE_URL}/trending/movie/${timeWindow}?api_key=${API_KEY}&language=${language}&page=${page}`, { next: { revalidate: 3600 }, // ISR 캐싱: 1μ‹œκ°„λ§ˆλ‹€ μƒˆλ‘œ 패치 - } + }, ); if (!res.ok) { - throw new Error("Failed to fetch movies"); + throw new Error('Failed to fetch movies'); } const data = await res.json(); @@ -110,10 +119,8 @@ export async function fetchTrendingMovies( } //μ˜ν™” ν¬μŠ€ν„° κ°€μ Έμ˜€κΈ° Continue Watching & My List λΆ€λΆ„ -export async function fetchMovieById(id: number, language = "en-US") { - const res = await fetch( - `${BASE_URL}/movie/${id}?api_key=${API_KEY}&language=${language}` - ); - if (!res.ok) throw new Error("Failed to fetch movie details"); +export async function fetchMovieById(id: number, language = 'en-US') { + const res = await fetch(`${BASE_URL}/movie/${id}?api_key=${API_KEY}&language=${language}`); + if (!res.ok) throw new Error('Failed to fetch movie details'); return res.json(); } diff --git a/package-lock.json b/package-lock.json index a8f7697..2fe5db6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "next-netflix-22nd", "version": "0.1.0", "dependencies": { + "axios": "^1.13.2", "babel-plugin-styled-components": "^2.1.4", "lottie-react": "^2.4.1", "next": "16.0.0", @@ -23,14 +24,15 @@ "@types/react-dom": "^19", "eslint": "^9.38.0", "eslint-config-next": "16.0.0", - "autoprefixer": "^10.4.21", - "eslint": "^9", - "eslint-config-next": "16.0.0", - "kill-port": "^2.0.1", - "postcss": "^8.5.6", - "rimraf": "^6.0.1", - "tailwindcss": "^4.1.16", - "typescript": "^5" + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-prettier": "^5.5.4", + "eslint-plugin-react": "^7.37.5", + "globals": "^16.4.0", + "jiti": "^2.6.1", + "prettier": "^3.6.2", + "tailwindcss": "^4", + "typescript": "^5", + "typescript-eslint": "^8.46.2" } }, "node_modules/@alloc/quick-lru": { @@ -1000,47 +1002,6 @@ "url": "https://opencollective.com/libvips" } }, - "node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/brace-expansion": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", - "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmmirror.com/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -2270,19 +2231,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -2493,43 +2441,11 @@ "node": ">= 0.4" } }, - "node_modules/autoprefixer": { - "version": "10.4.21", - "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.21.tgz", - "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.24.4", - "caniuse-lite": "^1.0.30001702", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" }, "node_modules/available-typed-arrays": { "version": "1.0.7", @@ -2557,6 +2473,17 @@ "node": ">=4" } }, + "node_modules/axios": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/axobject-query": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", @@ -2679,7 +2606,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -2789,6 +2715,18 @@ "dev": true, "license": "MIT" }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2966,6 +2904,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", @@ -2993,7 +2940,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -3004,13 +2950,6 @@ "node": ">= 0.4" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, "node_modules/electron-to-chromium": { "version": "1.5.241", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.241.tgz", @@ -3111,7 +3050,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -3121,7 +3059,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -3159,7 +3096,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -3172,7 +3108,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -3827,6 +3762,26 @@ "dev": true, "license": "ISC" }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/for-each": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", @@ -3843,42 +3798,26 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmmirror.com/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "license": "ISC", + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "license": "MIT", "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", - "dev": true, - "license": "MIT", "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" + "node": ">= 6" } }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3938,7 +3877,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -3963,7 +3901,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -3991,13 +3928,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-them-args": { - "version": "1.3.2", - "resolved": "https://registry.npmmirror.com/get-them-args/-/get-them-args-1.3.2.tgz", - "integrity": "sha512-LRn8Jlk+DwZE4GTlDbT3Hikd1wSHgLMme/+7ddlqKd7ldwR6LjJgTVWzBnR01wnYGe4KgrXjg287RaI22UHmAw==", - "dev": true, - "license": "MIT" - }, "node_modules/get-tsconfig": { "version": "4.13.0", "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", @@ -4011,30 +3941,6 @@ "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, - "node_modules/glob": { - "version": "11.0.3", - "resolved": "https://registry.npmmirror.com/glob/-/glob-11.0.3.tgz", - "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.3.1", - "jackspeak": "^4.1.1", - "minimatch": "^10.0.3", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^2.0.0" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -4048,22 +3954,6 @@ "node": ">=10.13.0" } }, - "node_modules/glob/node_modules/minimatch": { - "version": "10.1.1", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/globals": { "version": "16.4.0", "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", @@ -4098,7 +3988,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -4177,7 +4066,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -4190,7 +4078,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -4206,7 +4093,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -4468,16 +4354,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/is-generator-function": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", @@ -4741,22 +4617,6 @@ "node": ">= 0.4" } }, - "node_modules/jackspeak": { - "version": "4.1.1", - "resolved": "https://registry.npmmirror.com/jackspeak/-/jackspeak-4.1.1.tgz", - "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/jiti": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", @@ -4857,20 +4717,6 @@ "json-buffer": "3.0.1" } }, - "node_modules/kill-port": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/kill-port/-/kill-port-2.0.1.tgz", - "integrity": "sha512-e0SVOV5jFo0mx8r7bS29maVWp17qGqLBZ5ricNSajON6//kmb7qqqNnml4twNE8Dtj97UQD+gNFOaipS/q1zzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-them-args": "1.3.2", - "shell-exec": "1.0.2" - }, - "bin": { - "kill-port": "cli.js" - } - }, "node_modules/language-subtag-registry": { "version": "0.3.23", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", @@ -5250,7 +5096,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -5280,6 +5125,27 @@ "node": ">=8.6" } }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -5303,16 +5169,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmmirror.com/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -5469,16 +5325,6 @@ "integrity": "sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA==", "license": "MIT" }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -5670,13 +5516,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -5717,33 +5556,6 @@ "dev": true, "license": "MIT" }, - "node_modules/path-scurry": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/path-scurry/-/path-scurry-2.0.0.tgz", - "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.2.2", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-11.2.2.tgz", - "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", - "dev": true, - "license": "ISC", - "engines": { - "node": "20 || >=22" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -5805,7 +5617,8 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/prelude-ls": { "version": "1.2.1", @@ -5858,6 +5671,12 @@ "react-is": "^16.13.1" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -6013,26 +5832,6 @@ "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-6.0.1.tgz", - "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^11.0.0", - "package-json-from-dist": "^1.0.0" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -6262,13 +6061,6 @@ "node": ">=8" } }, - "node_modules/shell-exec": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/shell-exec/-/shell-exec-1.0.2.tgz", - "integrity": "sha512-jyVd+kU2X+mWKMmGhx4fpWbPsjvD53k9ivqetutVW/BQ+WIZoDoP4d8vUMGezV6saZsiNoW2f9GIhg9Dondohg==", - "dev": true, - "license": "MIT" - }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -6345,19 +6137,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", @@ -6388,70 +6167,6 @@ "node": ">= 0.4" } }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/string.prototype.includes": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", @@ -6565,46 +6280,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -7237,101 +6912,6 @@ "node": ">=0.10.0" } }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", diff --git a/package.json b/package.json index c4913d2..2f31aef 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "lint:fix": "eslint --fix" }, "dependencies": { + "axios": "^1.13.2", "babel-plugin-styled-components": "^2.1.4", "lottie-react": "^2.4.1", "next": "16.0.0", @@ -34,7 +35,5 @@ "tailwindcss": "^4", "typescript": "^5", "typescript-eslint": "^8.46.2" - } } - From e2f28cfe8d17d9d734a9d1a9b785de64981d0239 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Wed, 5 Nov 2025 20:31:28 +0900 Subject: [PATCH 60/82] =?UTF-8?q?chore:=20axios=20=EB=B0=A9=EC=8B=9D=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/Navbar.tsx | 30 ++++++++--------- components/home/section/Top10.tsx | 4 +-- lib/api/tdmb/movie.ts | 55 +++++++++++++++++-------------- 3 files changed, 48 insertions(+), 41 deletions(-) diff --git a/components/Navbar.tsx b/components/Navbar.tsx index 888c155..64e76d9 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -1,12 +1,12 @@ -"use client"; +'use client'; -import Link from "next/link"; -import { usePathname } from "next/navigation"; -import Home from "../public/icons/home"; -import Search from "../public/icons/search"; -import ComingSoon from "../public/icons/comingSoon"; -import Download from "../public/icons/download"; -import Menu from "../public/icons/menu"; +import Link from 'next/link'; +import { usePathname } from 'next/navigation'; +import Home from '@/public/icons/home'; +import Search from '@/public/icons/search'; +import ComingSoon from '@/public/icons/comingSoon'; +import Download from '@/public/icons/download'; +import Menu from '@/public/icons/menu'; export default function Navbar() { const pathname = usePathname(); @@ -14,32 +14,32 @@ export default function Navbar() { // Tailwind classes based on active page const getLinkClass = (path: string) => pathname === path - ? "flex flex-col items-center text-white text-[8px]" - : "flex flex-col items-center text-[#8C8787] text-[8px]"; + ? 'flex flex-col items-center text-white text-[8px]' + : 'flex flex-col items-center text-[#8C8787] text-[8px]'; return (
- + Home - + Search - + Coming Soon - + Downloads - + More diff --git a/components/home/section/Top10.tsx b/components/home/section/Top10.tsx index 4eaf59a..57ad2a9 100644 --- a/components/home/section/Top10.tsx +++ b/components/home/section/Top10.tsx @@ -15,7 +15,7 @@ export default function Top10() { const movieData = await fetchTop10Movies(); setMovies(movieData); } catch (error) { - console.error('Failed to fetch popular movies:', error); + console.error('Failed to fetch top 10 movies:', error); } }; @@ -24,7 +24,7 @@ export default function Top10() { return (
- +
{movies diff --git a/lib/api/tdmb/movie.ts b/lib/api/tdmb/movie.ts index 7ce2a93..55f06e5 100644 --- a/lib/api/tdmb/movie.ts +++ b/lib/api/tdmb/movie.ts @@ -78,24 +78,28 @@ export async function fetchKoreanMovies(region = 'KR', language = 'en-US', page } } -//Top 10 in Nigiria λΆ€λΆ„ +//Top 10 in Korea λΆ€λΆ„ export async function fetchTop10Movies( - region = 'NG', //κΈ°μ€€ κ΅­κ°€ μ •ν•  수 있음 + region = 'KR', //κΈ°μ€€ κ΅­κ°€ μ •ν•  수 있음 language = 'en-US', page = 1, ) { - const res = await fetch( - `${BASE_URL}/movie/top_rated?api_key=${API_KEY}®ion=${region}&language=${language}&page=${page}`, - { - next: { revalidate: 3600 }, // ISR 캐싱: 1μ‹œκ°„λ§ˆλ‹€ μƒˆλ‘œ 패치 - }, - ); - if (!res.ok) { - throw new Error('Failed to fetch movies'); - } + try { + const res = await axios.get>(`${BASE_URL}/movie/top_rated`, { + params: { + api_key: API_KEY, + region, + language, + sort_by: 'popularity.desc', + page, + }, + }); - const data = await res.json(); - return data.results; + return res.data.results; + } catch (error) { + console.log('fetch top 10 movies error:', error); + return []; + } } //Trending Now λΆ€λΆ„ @@ -104,18 +108,21 @@ export async function fetchTrendingMovies( language = 'en-US', page = 1, ) { - const res = await fetch( - `${BASE_URL}/trending/movie/${timeWindow}?api_key=${API_KEY}&language=${language}&page=${page}`, - { - next: { revalidate: 3600 }, // ISR 캐싱: 1μ‹œκ°„λ§ˆλ‹€ μƒˆλ‘œ 패치 - }, - ); - if (!res.ok) { - throw new Error('Failed to fetch movies'); + try { + const res = await axios.get>(`${BASE_URL}/trending/movie/${timeWindow}`, { + params: { + api_key: API_KEY, + timeWindow, + language, + sort_by: 'popularity.desc', + page, + }, + }); + return res.data.results; + } catch (error) { + console.log('fetch trending movies error:', error); + return []; } - - const data = await res.json(); - return data.results; } //μ˜ν™” ν¬μŠ€ν„° κ°€μ Έμ˜€κΈ° Continue Watching & My List λΆ€λΆ„ From 760d841cf1b2df0b23a91ad2c316e9feeba029bb Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Wed, 5 Nov 2025 20:42:39 +0900 Subject: [PATCH 61/82] =?UTF-8?q?refact:=20axios=20=EB=B0=A9=EC=8B=9D=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/api/tdmb/movie.ts | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/lib/api/tdmb/movie.ts b/lib/api/tdmb/movie.ts index 55f06e5..ea03001 100644 --- a/lib/api/tdmb/movie.ts +++ b/lib/api/tdmb/movie.ts @@ -127,7 +127,18 @@ export async function fetchTrendingMovies( //μ˜ν™” ν¬μŠ€ν„° κ°€μ Έμ˜€κΈ° Continue Watching & My List λΆ€λΆ„ export async function fetchMovieById(id: number, language = 'en-US') { - const res = await fetch(`${BASE_URL}/movie/${id}?api_key=${API_KEY}&language=${language}`); - if (!res.ok) throw new Error('Failed to fetch movie details'); - return res.json(); + try { + const res = await axios.get(`${BASE_URL}/movie/${id}`, { + params: { + api_key: API_KEY, + id, + language, + }, + }); + + return res.data; + } catch (error) { + console.log('fetch movie by id error: ', error); + return null; + } } From a9403b01e04a4195c72105ab0a8c7f83b7846c22 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Wed, 5 Nov 2025 20:59:12 +0900 Subject: [PATCH 62/82] =?UTF-8?q?refactor:=20tv=20show=EB=A5=BC=20axios?= =?UTF-8?q?=EB=A1=9C=20=EB=B6=88=EB=9F=AC=EC=98=A4=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/home/section/Mysteries.tsx | 6 +- lib/api/tdmb/movie.ts | 20 ------- lib/api/tdmb/tv.ts | 80 +++++++++++++++++---------- 3 files changed, 54 insertions(+), 52 deletions(-) diff --git a/components/home/section/Mysteries.tsx b/components/home/section/Mysteries.tsx index 618883d..20382dc 100644 --- a/components/home/section/Mysteries.tsx +++ b/components/home/section/Mysteries.tsx @@ -3,16 +3,16 @@ import { useEffect, useState } from 'react'; import Image from 'next/image'; import SectionTitle from '@/components/home/section/SectionTitle'; -import { fetchMysteryMovies } from '@/lib/api/tdmb/movie'; +import { fetchMysteryTv } from '@/lib/api/tdmb/tv'; import type { TMDBTvShow } from '@/lib/api/types/tdmbs'; -export default function TvThrillerMysteries() { +export default function Mysteries() { const [movies, setMovies] = useState([]); useEffect(() => { const loadMovies = async () => { try { - const movieData = await fetchMysteryMovies(); + const movieData = await fetchMysteryTv(); setMovies(movieData); } catch (error) { console.error('Failed to fetch Mysteries movies:', error); diff --git a/lib/api/tdmb/movie.ts b/lib/api/tdmb/movie.ts index ea03001..18989eb 100644 --- a/lib/api/tdmb/movie.ts +++ b/lib/api/tdmb/movie.ts @@ -37,26 +37,6 @@ export async function fetchPopularMovies(language = 'en-US', page = 1): Promise< } } -//TV Thriller Mysteries λΆ€λΆ„ -//Tv μž₯λ₯΄μ—λŠ” Thriller μž₯λ₯΄ μ½”λ“œκ°€ μ—†μŒ -//Mystery μž₯λ₯΄μ½”λ“œμΈ 9648만 μ‚¬μš© -export async function fetchMysteryMovies(language = 'en-US', page = 1, with_genres = '9648') { - try { - const res = await axios.get>(`${BASE_URL}/discover/tv`, { - params: { - api_key: API_KEY, - language, - page, - with_genres, - }, - }); - return res.data.results.slice(0, 5); // μƒμœ„ 5개 - } catch (error) { - console.log('fetchThrillerMysteryMovies error:', error); - return []; - } -} - //Korean Movies λΆ€λΆ„ //ν•œκ΅­ μ˜ν™” 인기순 쑰회 //with_origin_country=KR β†’ κ·Έ λ‚˜λΌμ—μ„œ μƒμ˜ 쀑인 μ˜ν™”κ°€ μ•„λ‹Œ μ§„μ§œ ν•œκ΅­ μ˜ν™”/TV 선택 diff --git a/lib/api/tdmb/tv.ts b/lib/api/tdmb/tv.ts index 3809a3f..81759c2 100644 --- a/lib/api/tdmb/tv.ts +++ b/lib/api/tdmb/tv.ts @@ -1,37 +1,59 @@ -import { BASE_URL, API_KEY, REVALIDATE_TIME } from "../../constants/tdmbs"; -import type { TMDBTvShow, TMDBApiResponse } from "../types/tdmbs"; +import axios from 'axios'; +import { BASE_URL, API_KEY, REVALIDATE_TIME } from '../../constants/tdmbs'; +import type { TMDBTvShow, TMDBApiResponse } from '../types/tdmbs'; //US tv shows λΆ€λΆ„ -export async function fetchUSTVShows( - language = "en-US", - with_origin_country = "US", - page = 1 -): Promise { - const res = await fetch( - `${BASE_URL}/discover/tv?api_key=${API_KEY}&language=${language}&sort_by=popularity.desc&with_origin_country=${with_origin_country}&page=${page}`, - { next: { revalidate: REVALIDATE_TIME } } - ); - const data: TMDBApiResponse = await res.json(); - return data.results; +export async function fetchUSTVShows(language = 'en-US', with_origin_country = 'US', page = 1) { + try { + const res = await axios.get>(`${BASE_URL}/discover/tv`, { + params: { + api_key: API_KEY, + language, + with_origin_country, + page, + }, + }); + return res.data.results; + } catch (error) { + console.log('fetch us tv show error: ', error); + return []; + } } -export async function fetchThrillerMysteryTV( - language = "en-US", - page = 1 -): Promise { - const res = await fetch( - `${BASE_URL}/discover/tv?api_key=${API_KEY}&language=${language}&with_genres=9648&sort_by=popularity.desc&page=${page}`, - { next: { revalidate: REVALIDATE_TIME } } - ); - const data: TMDBApiResponse = await res.json(); - return data.results.slice(0, 5); +//TV Thriller Mysteries λΆ€λΆ„ +//Tv μž₯λ₯΄μ—λŠ” Thriller μž₯λ₯΄ μ½”λ“œκ°€ μ—†μŒ +//Mystery μž₯λ₯΄μ½”λ“œμΈ 9648만 μ‚¬μš© +export async function fetchMysteryTv(language = 'en-US', page = 1, with_genres = '9648') { + try { + const res = await axios.get>(`${BASE_URL}/discover/tv`, { + params: { + api_key: API_KEY, + language, + page, + with_genres, + }, + }); + return res.data.results.slice(0, 5); // μƒμœ„ 5개 + } catch (error) { + console.log('fetch Mystery Tv error:', error); + return []; + } } //tv ν¬μŠ€ν„° κ°€μ Έμ˜€κΈ° -export async function fetchTvById(id: number, language = "en-US") { - const res = await fetch( - `${BASE_URL}/tv/${id}?api_key=${API_KEY}&language=${language}` - ); - if (!res.ok) throw new Error("Failed to fetch movie details"); - return res.json(); +export async function fetchTvById(id: number, language = 'en-US') { + try { + const res = await axios.get(`${BASE_URL}/tv/${id}`, { + params: { + api_key: API_KEY, + id, + language, + }, + }); + + return res.data; + } catch (error) { + console.log('fetch tv by id error: ', error); + return null; + } } From c0ed437bcf02d5fe5af022586bb17df94811f95e Mon Sep 17 00:00:00 2001 From: baekseungsun Date: Thu, 6 Nov 2025 00:04:56 +0900 Subject: [PATCH 63/82] =?UTF-8?q?refactor:=20Navbar=20SVGR=20=EB=B0=A9?= =?UTF-8?q?=EC=8B=9D=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/Navbar.tsx | 85 +- next.config.ts | 2 + package-lock.json | 3051 ++++++++++++++++++----- package.json | 8 +- public/icons/comingSoon.tsx | 9 - public/icons/download.tsx | 8 - public/icons/home.tsx | 11 - public/icons/iconsGen/ComingSoon.tsx | 11 + public/icons/iconsGen/Downloads.tsx | 13 + public/icons/iconsGen/Home.tsx | 15 + public/icons/iconsGen/Menu.tsx | 8 + public/icons/iconsGen/Search.tsx | 14 + public/icons/iconsGen/index.ts | 5 + public/icons/menu.tsx | 7 - public/icons/navbarIcons/comingSoon.svg | 3 + public/icons/navbarIcons/downloads.svg | 3 + public/icons/navbarIcons/home.svg | 7 + public/icons/navbarIcons/menu.svg | 3 + public/icons/navbarIcons/search.svg | 4 + 19 files changed, 2612 insertions(+), 655 deletions(-) delete mode 100644 public/icons/comingSoon.tsx delete mode 100644 public/icons/download.tsx delete mode 100644 public/icons/home.tsx create mode 100644 public/icons/iconsGen/ComingSoon.tsx create mode 100644 public/icons/iconsGen/Downloads.tsx create mode 100644 public/icons/iconsGen/Home.tsx create mode 100644 public/icons/iconsGen/Menu.tsx create mode 100644 public/icons/iconsGen/Search.tsx create mode 100644 public/icons/iconsGen/index.ts delete mode 100644 public/icons/menu.tsx create mode 100644 public/icons/navbarIcons/comingSoon.svg create mode 100644 public/icons/navbarIcons/downloads.svg create mode 100644 public/icons/navbarIcons/home.svg create mode 100644 public/icons/navbarIcons/menu.svg create mode 100644 public/icons/navbarIcons/search.svg diff --git a/components/Navbar.tsx b/components/Navbar.tsx index 888c155..a787865 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -2,47 +2,48 @@ import Link from "next/link"; import { usePathname } from "next/navigation"; -import Home from "../public/icons/home"; -import Search from "../public/icons/search"; -import ComingSoon from "../public/icons/comingSoon"; -import Download from "../public/icons/download"; -import Menu from "../public/icons/menu"; + +import HomeIcon from "../public/icons/iconsGen/Home"; +import Search from "../public/icons/iconsGen/Search"; +import ComingSoon from "../public/icons/iconsGen/ComingSoon"; +import Download from "../public/icons/iconsGen/Downloads"; +import Menu from "../public/icons/iconsGen/Menu"; + export default function Navbar() { - const pathname = usePathname(); - - // Tailwind classes based on active page - const getLinkClass = (path: string) => - pathname === path - ? "flex flex-col items-center text-white text-[8px]" - : "flex flex-col items-center text-[#8C8787] text-[8px]"; - - return ( -
- - - Home - - - - - Search - - - - - Coming Soon - - - - - Downloads - - - - - More - -
- ); -} + const pathname = usePathname(); + + const getLinkClass = (path: string) => + `flex flex-col items-center text-[8px] ${ + pathname === path ? "text-white" : "text-[#8C8787]" + }`; + + return ( +
+ + + Home + + + + + Search + + + + + Coming Soon + + + + + Downloads + + + + + More + +
+ ); +} \ No newline at end of file diff --git a/next.config.ts b/next.config.ts index 08be352..804e7a1 100644 --- a/next.config.ts +++ b/next.config.ts @@ -7,3 +7,5 @@ const nextConfig: NextConfig = { }; export default nextConfig; + + diff --git a/package-lock.json b/package-lock.json index a8f7697..ca684c2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,20 +17,23 @@ }, "devDependencies": { "@eslint/js": "^9.38.0", + "@svgr/cli": "^8.1.0", + "@svgr/webpack": "^8.1.0", "@tailwindcss/postcss": "^4", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", "eslint": "^9.38.0", "eslint-config-next": "16.0.0", - "autoprefixer": "^10.4.21", - "eslint": "^9", - "eslint-config-next": "16.0.0", - "kill-port": "^2.0.1", - "postcss": "^8.5.6", - "rimraf": "^6.0.1", - "tailwindcss": "^4.1.16", - "typescript": "^5" + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-prettier": "^5.5.4", + "eslint-plugin-react": "^7.37.5", + "globals": "^16.4.0", + "jiti": "^2.6.1", + "prettier": "^3.6.2", + "tailwindcss": "^4", + "typescript": "^5", + "typescript-eslint": "^8.46.2" } }, "node_modules/@alloc/quick-lru": { @@ -143,6 +146,63 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.5.tgz", + "integrity": "sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-member-expression-to-functions": "^7.28.5", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/traverse": "^7.28.5", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.28.5.tgz", + "integrity": "sha512-N1EhvLtHzOvj7QQOUCCS3NrPJP8c5W6ZXCHDn7Yialuy1iu4r5EmIYkXlKNqT99Ciw+W0mDqWoR6HWMZlFP3hw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "regexpu-core": "^6.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.5.tgz", + "integrity": "sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "debug": "^4.4.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.22.10" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/@babel/helper-globals": { "version": "7.28.0", "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", @@ -152,6 +212,20 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.28.5.tgz", + "integrity": "sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.5", + "@babel/types": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-module-imports": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", @@ -182,6 +256,19 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.27.1.tgz", + "integrity": "sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-plugin-utils": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", @@ -191,6 +278,56 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.27.1.tgz", + "integrity": "sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-wrap-function": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.27.1.tgz", + "integrity": "sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.27.1", + "@babel/helper-optimise-call-expression": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.27.1.tgz", + "integrity": "sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-string-parser": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", @@ -218,6 +355,21 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.28.3", + "resolved": "https://registry.npmmirror.com/@babel/helper-wrap-function/-/helper-wrap-function-7.28.3.tgz", + "integrity": "sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.3", + "@babel/types": "^7.28.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helpers": { "version": "7.28.4", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", @@ -246,6 +398,135 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", + "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", + "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.27.1.tgz", + "integrity": "sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.27.1.tgz", + "integrity": "sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.28.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.3.tgz", + "integrity": "sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmmirror.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.27.1.tgz", + "integrity": "sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", + "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", @@ -261,6 +542,1141 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", + "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.27.1.tgz", + "integrity": "sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.28.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.28.0.tgz", + "integrity": "sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1", + "@babel/traverse": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.27.1.tgz", + "integrity": "sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-remap-async-to-generator": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.27.1.tgz", + "integrity": "sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.5.tgz", + "integrity": "sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.27.1.tgz", + "integrity": "sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.28.3", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.3.tgz", + "integrity": "sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz", + "integrity": "sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-globals": "^7.28.0", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1", + "@babel/traverse": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.27.1.tgz", + "integrity": "sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/template": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.28.5.tgz", + "integrity": "sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.27.1.tgz", + "integrity": "sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.27.1.tgz", + "integrity": "sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", + "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-explicit-resource-management": { + "version": "7.28.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.0.tgz", + "integrity": "sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.5.tgz", + "integrity": "sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", + "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.27.1.tgz", + "integrity": "sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.27.1.tgz", + "integrity": "sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.27.1.tgz", + "integrity": "sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.27.1.tgz", + "integrity": "sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.5.tgz", + "integrity": "sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.27.1.tgz", + "integrity": "sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.27.1.tgz", + "integrity": "sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.27.1.tgz", + "integrity": "sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.28.5.tgz", + "integrity": "sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.27.1.tgz", + "integrity": "sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.27.1.tgz", + "integrity": "sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.27.1.tgz", + "integrity": "sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.27.1.tgz", + "integrity": "sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.27.1.tgz", + "integrity": "sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz", + "integrity": "sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.0", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/traverse": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.27.1.tgz", + "integrity": "sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-replace-supers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.27.1.tgz", + "integrity": "sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.5.tgz", + "integrity": "sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.27.7", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.27.7.tgz", + "integrity": "sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.27.1.tgz", + "integrity": "sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.27.1.tgz", + "integrity": "sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-create-class-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.27.1.tgz", + "integrity": "sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.27.1.tgz", + "integrity": "sha512-edoidOjl/ZxvYo4lSBOQGDSyToYVkTAwyVoa2tkuYTSmjrB1+uAedoL5iROVLXkxH+vRgA7uP4tMg2pUJpZ3Ug==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.28.0", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.28.0.tgz", + "integrity": "sha512-D6Eujc2zMxKjfa4Zxl4GHMsmhKKZ9VpcqIchJLvwTxad9zWIYulwYItBovpDOoNLISpcZSXoDJ5gaGbQUDqViA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", + "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.27.1.tgz", + "integrity": "sha512-ykDdF5yI4f1WrAolLqeF3hmYU12j9ntLQl/AOG1HAS21jxyg1Q0/J/tpREuYLfatGdGmXp/3yS0ZA76kOlVq9Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.27.1.tgz", + "integrity": "sha512-JfuinvDOsD9FVMTHpzA/pBLisxpv1aSf+OIV8lgH3MuWrks19R27e6a6DipIg4aX1Zm9Wpb04p8wljfKrVSnPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.28.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz", + "integrity": "sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regexp-modifiers": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.27.1.tgz", + "integrity": "sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.27.1.tgz", + "integrity": "sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.27.1.tgz", + "integrity": "sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.27.1.tgz", + "integrity": "sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.27.1.tgz", + "integrity": "sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.27.1.tgz", + "integrity": "sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.1.tgz", + "integrity": "sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.28.5.tgz", + "integrity": "sha512-x2Qa+v/CuEoX7Dr31iAfr0IhInrVOWZU/2vJMJ00FOR/2nM0BcBEclpaf9sWCDc+v5e9dMrhSH8/atq/kX7+bA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-create-class-features-plugin": "^7.28.5", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", + "@babel/plugin-syntax-typescript": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.27.1.tgz", + "integrity": "sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.27.1.tgz", + "integrity": "sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.27.1.tgz", + "integrity": "sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.27.1.tgz", + "integrity": "sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/preset-env/-/preset-env-7.28.5.tgz", + "integrity": "sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.5", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.3", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-import-assertions": "^7.27.1", + "@babel/plugin-syntax-import-attributes": "^7.27.1", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.27.1", + "@babel/plugin-transform-async-generator-functions": "^7.28.0", + "@babel/plugin-transform-async-to-generator": "^7.27.1", + "@babel/plugin-transform-block-scoped-functions": "^7.27.1", + "@babel/plugin-transform-block-scoping": "^7.28.5", + "@babel/plugin-transform-class-properties": "^7.27.1", + "@babel/plugin-transform-class-static-block": "^7.28.3", + "@babel/plugin-transform-classes": "^7.28.4", + "@babel/plugin-transform-computed-properties": "^7.27.1", + "@babel/plugin-transform-destructuring": "^7.28.5", + "@babel/plugin-transform-dotall-regex": "^7.27.1", + "@babel/plugin-transform-duplicate-keys": "^7.27.1", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-dynamic-import": "^7.27.1", + "@babel/plugin-transform-explicit-resource-management": "^7.28.0", + "@babel/plugin-transform-exponentiation-operator": "^7.28.5", + "@babel/plugin-transform-export-namespace-from": "^7.27.1", + "@babel/plugin-transform-for-of": "^7.27.1", + "@babel/plugin-transform-function-name": "^7.27.1", + "@babel/plugin-transform-json-strings": "^7.27.1", + "@babel/plugin-transform-literals": "^7.27.1", + "@babel/plugin-transform-logical-assignment-operators": "^7.28.5", + "@babel/plugin-transform-member-expression-literals": "^7.27.1", + "@babel/plugin-transform-modules-amd": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-modules-systemjs": "^7.28.5", + "@babel/plugin-transform-modules-umd": "^7.27.1", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.27.1", + "@babel/plugin-transform-new-target": "^7.27.1", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.27.1", + "@babel/plugin-transform-numeric-separator": "^7.27.1", + "@babel/plugin-transform-object-rest-spread": "^7.28.4", + "@babel/plugin-transform-object-super": "^7.27.1", + "@babel/plugin-transform-optional-catch-binding": "^7.27.1", + "@babel/plugin-transform-optional-chaining": "^7.28.5", + "@babel/plugin-transform-parameters": "^7.27.7", + "@babel/plugin-transform-private-methods": "^7.27.1", + "@babel/plugin-transform-private-property-in-object": "^7.27.1", + "@babel/plugin-transform-property-literals": "^7.27.1", + "@babel/plugin-transform-regenerator": "^7.28.4", + "@babel/plugin-transform-regexp-modifiers": "^7.27.1", + "@babel/plugin-transform-reserved-words": "^7.27.1", + "@babel/plugin-transform-shorthand-properties": "^7.27.1", + "@babel/plugin-transform-spread": "^7.27.1", + "@babel/plugin-transform-sticky-regex": "^7.27.1", + "@babel/plugin-transform-template-literals": "^7.27.1", + "@babel/plugin-transform-typeof-symbol": "^7.27.1", + "@babel/plugin-transform-unicode-escapes": "^7.27.1", + "@babel/plugin-transform-unicode-property-regex": "^7.27.1", + "@babel/plugin-transform-unicode-regex": "^7.27.1", + "@babel/plugin-transform-unicode-sets-regex": "^7.27.1", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.14", + "babel-plugin-polyfill-corejs3": "^0.13.0", + "babel-plugin-polyfill-regenerator": "^0.6.5", + "core-js-compat": "^3.43.0", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmmirror.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/preset-react/-/preset-react-7.28.5.tgz", + "integrity": "sha512-Z3J8vhRq7CeLjdC58jLv4lnZ5RKFUJWqH5emvxmv9Hv3BD1T9R/Im713R4MTKwvFaV74ejZ3sM01LyEKk4ugNQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-transform-react-display-name": "^7.28.0", + "@babel/plugin-transform-react-jsx": "^7.27.1", + "@babel/plugin-transform-react-jsx-development": "^7.27.1", + "@babel/plugin-transform-react-pure-annotations": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.28.5", + "resolved": "https://registry.npmmirror.com/@babel/preset-typescript/-/preset-typescript-7.28.5.tgz", + "integrity": "sha512-+bQy5WOI2V6LJZpPVxY+yp66XdZ2yifu0Mc1aP5CQKgjn4QM5IN2i5fAZ4xKop47pr8rpVhiAeu+nDQa12C8+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/helper-validator-option": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/plugin-transform-modules-commonjs": "^7.27.1", + "@babel/plugin-transform-typescript": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/template": { "version": "7.27.2", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", @@ -1000,47 +2416,6 @@ "url": "https://opencollective.com/libvips" } }, - "node_modules/@isaacs/balanced-match": { - "version": "4.0.1", - "resolved": "https://registry.npmmirror.com/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz", - "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/brace-expansion": { - "version": "5.0.0", - "resolved": "https://registry.npmmirror.com/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz", - "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@isaacs/balanced-match": "^4.0.1" - }, - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmmirror.com/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", @@ -1179,137 +2554,484 @@ "node": ">= 10" } }, - "node_modules/@next/swc-linux-x64-gnu": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.0.0.tgz", - "integrity": "sha512-sdyOg4cbiCw7YUr0F/7ya42oiVBXLD21EYkSwN+PhE4csJH4MSXUsYyslliiiBwkM+KsuQH/y9wuxVz6s7Nstg==", - "cpu": [ - "x64" - ], + "node_modules/@next/swc-linux-x64-gnu": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.0.0.tgz", + "integrity": "sha512-sdyOg4cbiCw7YUr0F/7ya42oiVBXLD21EYkSwN+PhE4csJH4MSXUsYyslliiiBwkM+KsuQH/y9wuxVz6s7Nstg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-linux-x64-musl": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.0.0.tgz", + "integrity": "sha512-IAXv3OBYqVaNOgyd3kxR4L3msuhmSy1bcchPHxDOjypG33i2yDWvGBwFD94OuuTjjTt/7cuIKtAmoOOml6kfbg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-arm64-msvc": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.0.0.tgz", + "integrity": "sha512-bmo3ncIJKUS9PWK1JD9pEVv0yuvp1KPuOsyJTHXTv8KDrEmgV/K+U0C75rl9rhIaODcS7JEb6/7eJhdwXI0XmA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@next/swc-win32-x64-msvc": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.0.0.tgz", + "integrity": "sha512-O1cJbT+lZp+cTjYyZGiDwsOjO3UHHzSqobkPNipdlnnuPb1swfcuY6r3p8dsKU4hAIEO4cO67ZCfVVH/M1ETXA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nolyfill/is-core-module": { + "version": "1.0.39", + "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", + "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/@pkgr/core": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", + "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/pkgr" + } + }, + "node_modules/@rtsao/scc": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", + "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "dev": true, + "license": "MIT" + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz", + "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz", + "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz", + "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz", + "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz", + "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz", + "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz", + "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/@svgr/babel-preset/-/babel-preset-8.1.0.tgz", + "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, "engines": { - "node": ">= 10" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@next/swc-linux-x64-musl": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.0.0.tgz", - "integrity": "sha512-IAXv3OBYqVaNOgyd3kxR4L3msuhmSy1bcchPHxDOjypG33i2yDWvGBwFD94OuuTjjTt/7cuIKtAmoOOml6kfbg==", - "cpu": [ - "x64" - ], + "node_modules/@svgr/cli": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/@svgr/cli/-/cli-8.1.0.tgz", + "integrity": "sha512-SnlaLspB610XFXvs3PmhzViHErsXp0yIy4ERyZlHDlO1ro2iYtHMWYk2mztdLD/lBjiA4ZXe4RePON3qU/Tc4A==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "dependencies": { + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-prettier": "8.1.0", + "@svgr/plugin-svgo": "8.1.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.2", + "commander": "^9.4.1", + "dashify": "^2.0.0", + "glob": "^8.0.3", + "snake-case": "^3.0.4" + }, + "bin": { + "svgr": "bin/svgr" + }, "engines": { - "node": ">= 10" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@next/swc-win32-arm64-msvc": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.0.0.tgz", - "integrity": "sha512-bmo3ncIJKUS9PWK1JD9pEVv0yuvp1KPuOsyJTHXTv8KDrEmgV/K+U0C75rl9rhIaODcS7JEb6/7eJhdwXI0XmA==", - "cpu": [ - "arm64" - ], + "node_modules/@svgr/cli/node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], "engines": { - "node": ">= 10" + "node": "^12.20.0 || >=14" } }, - "node_modules/@next/swc-win32-x64-msvc": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.0.0.tgz", - "integrity": "sha512-O1cJbT+lZp+cTjYyZGiDwsOjO3UHHzSqobkPNipdlnnuPb1swfcuY6r3p8dsKU4hAIEO4cO67ZCfVVH/M1ETXA==", - "cpu": [ - "x64" - ], + "node_modules/@svgr/core": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/@svgr/core/-/core-8.1.0.tgz", + "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==", + "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, "engines": { - "node": ">= 10" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz", + "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==", "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" + "@babel/types": "^7.21.3", + "entities": "^4.4.0" }, "engines": { - "node": ">= 8" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz", + "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, "engines": { - "node": ">= 8" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" } }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "node_modules/@svgr/plugin-prettier": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/@svgr/plugin-prettier/-/plugin-prettier-8.1.0.tgz", + "integrity": "sha512-o4/uFI8G64tAjBZ4E7gJfH+VP7Qi3T0+M4WnIsP91iFnGPqs5WvPDkpZALXPiyWEtzfYs1Rmwy1Zdfu8qoZuKw==", "dev": true, "license": "MIT", "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" + "deepmerge": "^4.3.1", + "prettier": "^2.8.7" }, "engines": { - "node": ">= 8" + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" } }, - "node_modules/@nolyfill/is-core-module": { - "version": "1.0.39", - "resolved": "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz", - "integrity": "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==", + "node_modules/@svgr/plugin-prettier/node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmmirror.com/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, "engines": { - "node": ">=12.4.0" + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" } }, - "node_modules/@pkgr/core": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", - "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", + "node_modules/@svgr/plugin-svgo": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz", + "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==", "dev": true, "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + "node": ">=14" }, "funding": { - "url": "https://opencollective.com/pkgr" + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" } }, - "node_modules/@rtsao/scc": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", - "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", + "node_modules/@svgr/webpack": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/@svgr/webpack/-/webpack-8.1.0.tgz", + "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } }, "node_modules/@swc/helpers": { "version": "0.5.15", @@ -1591,6 +3313,16 @@ "tailwindcss": "4.1.16" } }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/@tybys/wasm-util": { "version": "0.10.1", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.1.tgz", @@ -2270,19 +4002,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ansi-regex": { - "version": "6.2.2", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.2.2.tgz", - "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -2493,44 +4212,6 @@ "node": ">= 0.4" } }, - "node_modules/autoprefixer": { - "version": "10.4.21", - "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.21.tgz", - "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.24.4", - "caniuse-lite": "^1.0.30001702", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -2567,6 +4248,48 @@ "node": ">= 0.4" } }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.14", + "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.14.tgz", + "integrity": "sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.7", + "@babel/helper-define-polyfill-provider": "^0.6.5", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.13.0", + "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.13.0.tgz", + "integrity": "sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5", + "core-js-compat": "^3.43.0" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.5", + "resolved": "https://registry.npmmirror.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.5.tgz", + "integrity": "sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.5" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, "node_modules/babel-plugin-styled-components": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.4.tgz", @@ -2599,6 +4322,13 @@ "baseline-browser-mapping": "dist/cli.js" } }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true, + "license": "ISC" + }, "node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -2716,6 +4446,19 @@ "node": ">=6" } }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/camelize": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/camelize/-/camelize-1.0.1.tgz", @@ -2789,6 +4532,16 @@ "dev": true, "license": "MIT" }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2796,11 +4549,52 @@ "dev": true, "license": "MIT" }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "license": "MIT" + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, + "node_modules/core-js-compat": { + "version": "3.46.0", + "resolved": "https://registry.npmmirror.com/core-js-compat/-/core-js-compat-3.46.0.tgz", + "integrity": "sha512-p9hObIIEENxSV8xIu+V68JjSeARg6UVMG5mR+JEUguG3sI6MsiS1njz2jHmyJDvA+8jX/sytkBHup6kxhM9law==", + "dev": true, + "license": "MIT", + "dependencies": { + "browserslist": "^4.26.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmmirror.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", + "dev": true, + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } }, "node_modules/cross-spawn": { "version": "7.0.6", @@ -2827,6 +4621,23 @@ "node": ">=4" } }, + "node_modules/css-select": { + "version": "5.2.2", + "resolved": "https://registry.npmmirror.com/css-select/-/css-select-5.2.2.tgz", + "integrity": "sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, "node_modules/css-to-react-native": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/css-to-react-native/-/css-to-react-native-3.2.0.tgz", @@ -2839,6 +4650,69 @@ "postcss-value-parser": "^4.0.2" } }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.2.2", + "resolved": "https://registry.npmmirror.com/css-what/-/css-what-6.2.2.tgz", + "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "resolved": "https://registry.npmmirror.com/csso/-/csso-5.0.5.tgz", + "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/css-tree/-/css-tree-2.2.1.tgz", + "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.28.tgz", + "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==", + "dev": true, + "license": "CC0-1.0" + }, "node_modules/csstype": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", @@ -2852,6 +4726,16 @@ "dev": true, "license": "BSD-2-Clause" }, + "node_modules/dashify": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/dashify/-/dashify-2.0.0.tgz", + "integrity": "sha512-hpA5C/YrPjucXypHPPc0oJ1l9Hf6wWbiOL7Ik42cxnsUOhWiCB/fylKbKqqJalW9FgkNQCw16YO8uW9Hs0Iy1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/data-view-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", @@ -2930,6 +4814,16 @@ "dev": true, "license": "MIT" }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", @@ -2989,6 +4883,76 @@ "node": ">=0.10.0" } }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", + "dev": true, + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/domutils/-/domutils-3.2.2.tgz", + "integrity": "sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -3004,13 +4968,6 @@ "node": ">= 0.4" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true, - "license": "MIT" - }, "node_modules/electron-to-chromium": { "version": "1.5.241", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.241.tgz", @@ -3038,6 +4995,29 @@ "node": ">=10.13.0" } }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmmirror.com/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/es-abstract": { "version": "1.24.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.0.tgz", @@ -3843,36 +5823,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmmirror.com/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/fraction.js": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", - "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true, - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "patreon", - "url": "https://github.com/sponsors/rawify" - } + "license": "ISC" }, "node_modules/function-bind": { "version": "1.1.2", @@ -3991,13 +5947,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-them-args": { - "version": "1.3.2", - "resolved": "https://registry.npmmirror.com/get-them-args/-/get-them-args-1.3.2.tgz", - "integrity": "sha512-LRn8Jlk+DwZE4GTlDbT3Hikd1wSHgLMme/+7ddlqKd7ldwR6LjJgTVWzBnR01wnYGe4KgrXjg287RaI22UHmAw==", - "dev": true, - "license": "MIT" - }, "node_modules/get-tsconfig": { "version": "4.13.0", "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.13.0.tgz", @@ -4012,24 +5961,21 @@ } }, "node_modules/glob": { - "version": "11.0.3", - "resolved": "https://registry.npmmirror.com/glob/-/glob-11.0.3.tgz", - "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==", + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", "dependencies": { - "foreground-child": "^3.3.1", - "jackspeak": "^4.1.1", - "minimatch": "^10.0.3", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^2.0.0" - }, - "bin": { - "glob": "dist/esm/bin.mjs" + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" }, "engines": { - "node": "20 || >=22" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -4048,20 +5994,27 @@ "node": ">=10.13.0" } }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, "node_modules/glob/node_modules/minimatch": { - "version": "10.1.1", - "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-10.1.1.tgz", - "integrity": "sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ==", + "version": "5.1.6", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, - "license": "BlueOak-1.0.0", + "license": "ISC", "dependencies": { - "@isaacs/brace-expansion": "^5.0.0" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "node": ">=10" } }, "node_modules/globals": { @@ -4269,6 +6222,25 @@ "node": ">=0.8.19" } }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true, + "license": "ISC" + }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", @@ -4302,6 +6274,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, "node_modules/is-async-function": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", @@ -4468,16 +6447,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/is-generator-function": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.2.tgz", @@ -4741,22 +6710,6 @@ "node": ">= 0.4" } }, - "node_modules/jackspeak": { - "version": "4.1.1", - "resolved": "https://registry.npmmirror.com/jackspeak/-/jackspeak-4.1.1.tgz", - "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/jiti": { "version": "2.6.1", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz", @@ -4805,6 +6758,13 @@ "dev": true, "license": "MIT" }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -4857,20 +6817,6 @@ "json-buffer": "3.0.1" } }, - "node_modules/kill-port": { - "version": "2.0.1", - "resolved": "https://registry.npmmirror.com/kill-port/-/kill-port-2.0.1.tgz", - "integrity": "sha512-e0SVOV5jFo0mx8r7bS29maVWp17qGqLBZ5ricNSajON6//kmb7qqqNnml4twNE8Dtj97UQD+gNFOaipS/q1zzQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "get-them-args": "1.3.2", - "shell-exec": "1.0.2" - }, - "bin": { - "kill-port": "cli.js" - } - }, "node_modules/language-subtag-registry": { "version": "0.3.23", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz", @@ -5166,6 +7112,13 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -5188,6 +7141,13 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "license": "MIT" }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", @@ -5227,6 +7187,16 @@ "integrity": "sha512-+gfBXl6sxXMPe8tKQm7qzLnUy5DUPJPKIyRHwtpCpyUEYjHYRJC/5gjUvdkuO2c3JllrPtHXH5UJJK8LRYl5yQ==", "license": "MIT" }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -5256,6 +7226,13 @@ "node": ">= 0.4" } }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmmirror.com/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==", + "dev": true, + "license": "CC0-1.0" + }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", @@ -5303,16 +7280,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmmirror.com/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -5463,20 +7430,34 @@ } } }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, "node_modules/node-releases": { "version": "2.0.26", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.26.tgz", "integrity": "sha512-S2M9YimhSjBSvYnlr5/+umAnPHE++ODwt5e2Ij6FoX45HA/s4vHdkDx1eax2pAPeAOqu4s9b7ppahsyEFdVqQA==", "license": "MIT" }, - "node_modules/normalize-range": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", - "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" } }, "node_modules/object-assign": { @@ -5602,6 +7583,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -5670,13 +7661,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmmirror.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "dev": true, - "license": "BlueOak-1.0.0" - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -5690,6 +7674,25 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmmirror.com/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -5717,31 +7720,14 @@ "dev": true, "license": "MIT" }, - "node_modules/path-scurry": { - "version": "2.0.0", - "resolved": "https://registry.npmmirror.com/path-scurry/-/path-scurry-2.0.0.tgz", - "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^11.0.0", - "minipass": "^7.1.2" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "11.2.2", - "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-11.2.2.tgz", - "integrity": "sha512-F9ODfyqML2coTIsQpSkRHnLSZMtkU8Q+mSfcaIyKwy58u+8k5nvAYeiNhsyMARvzNcXJ9QfWVrcPsC9e9rAxtg==", + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, - "license": "ISC", + "license": "MIT", "engines": { - "node": "20 || >=22" + "node": ">=8" } }, "node_modules/picocolors": { @@ -5805,7 +7791,8 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/prelude-ls": { "version": "1.2.1", @@ -5940,6 +7927,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmmirror.com/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.2.2", + "resolved": "https://registry.npmmirror.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.2.tgz", + "integrity": "sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/regexp.prototype.flags": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", @@ -5961,6 +7968,44 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/regexpu-core": { + "version": "6.4.0", + "resolved": "https://registry.npmmirror.com/regexpu-core/-/regexpu-core-6.4.0.tgz", + "integrity": "sha512-0ghuzq67LI9bLXpOX/ISfve/Mq33a4aFRzoQYhnnok1JOFpmE/A2TBGkNVenOGEeSBCjIiWcc6MVOG5HEQv0sA==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.2.2", + "regjsgen": "^0.8.0", + "regjsparser": "^0.13.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.2.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmmirror.com/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/regjsparser": { + "version": "0.13.0", + "resolved": "https://registry.npmmirror.com/regjsparser/-/regjsparser-0.13.0.tgz", + "integrity": "sha512-NZQZdC5wOE/H3UT28fVGL+ikOZcEzfMGk/c3iN9UGxzWHMa1op7274oyiUVrAG4B2EuFhus8SvkaYnhvW92p9Q==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~3.1.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, "node_modules/resolve": { "version": "1.22.11", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", @@ -6013,26 +8058,6 @@ "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-6.0.1.tgz", - "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^11.0.0", - "package-json-from-dist": "^1.0.0" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "engines": { - "node": "20 || >=22" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -6262,13 +8287,6 @@ "node": ">=8" } }, - "node_modules/shell-exec": { - "version": "1.0.2", - "resolved": "https://registry.npmmirror.com/shell-exec/-/shell-exec-1.0.2.tgz", - "integrity": "sha512-jyVd+kU2X+mWKMmGhx4fpWbPsjvD53k9ivqetutVW/BQ+WIZoDoP4d8vUMGezV6saZsiNoW2f9GIhg9Dondohg==", - "dev": true, - "license": "MIT" - }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", @@ -6345,17 +8363,15 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" } }, "node_modules/source-map-js": { @@ -6388,70 +8404,6 @@ "node": ">= 0.4" } }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/string.prototype.includes": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz", @@ -6565,46 +8517,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/strip-ansi": { - "version": "7.1.2", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.2.tgz", - "integrity": "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", @@ -6749,6 +8661,39 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/svgo": { + "version": "3.3.2", + "resolved": "https://registry.npmmirror.com/svgo/-/svgo-3.3.2.tgz", + "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, "node_modules/synckit": { "version": "0.11.11", "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", @@ -7047,6 +8992,50 @@ "dev": true, "license": "MIT" }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz", + "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz", + "integrity": "sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.2.0.tgz", + "integrity": "sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/unrs-resolver": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", @@ -7237,100 +9226,12 @@ "node": ">=0.10.0" } }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.3", - "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.3.tgz", - "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } + "license": "ISC" }, "node_modules/yallist": { "version": "3.1.1", diff --git a/package.json b/package.json index c4913d2..e6cf4c4 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,9 @@ "build": "next build", "start": "next start", "lint": "eslint .", - "lint:fix": "eslint --fix" + "lint:fix": "eslint --fix", + "svgr:navbarIcons": "svgr --typescript --icon --replace-attr-values '#000=currentColor,#8C8787=currentColor,#FFFFFF=currentColor' --out-dir public/icons/iconsGen public/icons/navbarIcons", + "prebuild": "npm run svgr:navbarIcons" }, "dependencies": { "babel-plugin-styled-components": "^2.1.4", @@ -19,6 +21,8 @@ }, "devDependencies": { "@eslint/js": "^9.38.0", + "@svgr/cli": "^8.1.0", + "@svgr/webpack": "^8.1.0", "@tailwindcss/postcss": "^4", "@types/node": "^20", "@types/react": "^19", @@ -34,7 +38,5 @@ "tailwindcss": "^4", "typescript": "^5", "typescript-eslint": "^8.46.2" - } } - diff --git a/public/icons/comingSoon.tsx b/public/icons/comingSoon.tsx deleted file mode 100644 index e2c925d..0000000 --- a/public/icons/comingSoon.tsx +++ /dev/null @@ -1,9 +0,0 @@ -export default function comingSoon( - props: React.SVGProps -) { - return ( - - - - ); -} diff --git a/public/icons/download.tsx b/public/icons/download.tsx deleted file mode 100644 index 6e20bda..0000000 --- a/public/icons/download.tsx +++ /dev/null @@ -1,8 +0,0 @@ - -export default function ArrowIcon(props: React.SVGProps) { - return ( - - - - ); -} diff --git a/public/icons/home.tsx b/public/icons/home.tsx deleted file mode 100644 index 3fc62f1..0000000 --- a/public/icons/home.tsx +++ /dev/null @@ -1,11 +0,0 @@ -export default function BuildingIcon(props: React.SVGProps) { - return ( - - - - - - - - ); -} diff --git a/public/icons/iconsGen/ComingSoon.tsx b/public/icons/iconsGen/ComingSoon.tsx new file mode 100644 index 0000000..d320349 --- /dev/null +++ b/public/icons/iconsGen/ComingSoon.tsx @@ -0,0 +1,11 @@ +import * as React from 'react'; +import type { SVGProps } from 'react'; +const SvgComingSoon = (props: SVGProps) => ( + + + +); +export default SvgComingSoon; diff --git a/public/icons/iconsGen/Downloads.tsx b/public/icons/iconsGen/Downloads.tsx new file mode 100644 index 0000000..6671fea --- /dev/null +++ b/public/icons/iconsGen/Downloads.tsx @@ -0,0 +1,13 @@ +import * as React from 'react'; +import type { SVGProps } from 'react'; +const SvgDownloads = (props: SVGProps) => ( + + + +); +export default SvgDownloads; diff --git a/public/icons/iconsGen/Home.tsx b/public/icons/iconsGen/Home.tsx new file mode 100644 index 0000000..c6c2806 --- /dev/null +++ b/public/icons/iconsGen/Home.tsx @@ -0,0 +1,15 @@ +import * as React from 'react'; +import type { SVGProps } from 'react'; +const SvgHome = (props: SVGProps) => ( + + + + +); +export default SvgHome; diff --git a/public/icons/iconsGen/Menu.tsx b/public/icons/iconsGen/Menu.tsx new file mode 100644 index 0000000..02dfc15 --- /dev/null +++ b/public/icons/iconsGen/Menu.tsx @@ -0,0 +1,8 @@ +import * as React from 'react'; +import type { SVGProps } from 'react'; +const SvgMenu = (props: SVGProps) => ( + + + +); +export default SvgMenu; diff --git a/public/icons/iconsGen/Search.tsx b/public/icons/iconsGen/Search.tsx new file mode 100644 index 0000000..d833b57 --- /dev/null +++ b/public/icons/iconsGen/Search.tsx @@ -0,0 +1,14 @@ +import * as React from 'react'; +import type { SVGProps } from 'react'; +const SvgSearch = (props: SVGProps) => ( + + + +); +export default SvgSearch; diff --git a/public/icons/iconsGen/index.ts b/public/icons/iconsGen/index.ts new file mode 100644 index 0000000..c63a8cb --- /dev/null +++ b/public/icons/iconsGen/index.ts @@ -0,0 +1,5 @@ +export { default as ComingSoon } from './ComingSoon'; +export { default as Downloads } from './Downloads'; +export { default as Home } from './Home'; +export { default as Menu } from './Menu'; +export { default as Search } from './Search'; diff --git a/public/icons/menu.tsx b/public/icons/menu.tsx deleted file mode 100644 index 9c7e93d..0000000 --- a/public/icons/menu.tsx +++ /dev/null @@ -1,7 +0,0 @@ -export default function MenuIcon(props: React.SVGProps) { - return ( - - - - ); -} \ No newline at end of file diff --git a/public/icons/navbarIcons/comingSoon.svg b/public/icons/navbarIcons/comingSoon.svg new file mode 100644 index 0000000..80dd1fc --- /dev/null +++ b/public/icons/navbarIcons/comingSoon.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/navbarIcons/downloads.svg b/public/icons/navbarIcons/downloads.svg new file mode 100644 index 0000000..789ff1a --- /dev/null +++ b/public/icons/navbarIcons/downloads.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/navbarIcons/home.svg b/public/icons/navbarIcons/home.svg new file mode 100644 index 0000000..7cd8872 --- /dev/null +++ b/public/icons/navbarIcons/home.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/public/icons/navbarIcons/menu.svg b/public/icons/navbarIcons/menu.svg new file mode 100644 index 0000000..f1677ec --- /dev/null +++ b/public/icons/navbarIcons/menu.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/navbarIcons/search.svg b/public/icons/navbarIcons/search.svg new file mode 100644 index 0000000..fbb70ae --- /dev/null +++ b/public/icons/navbarIcons/search.svg @@ -0,0 +1,4 @@ + + + + From 38b79db678b596694faa3231b9fec63c960fe8a5 Mon Sep 17 00:00:00 2001 From: baekseungsun Date: Thu, 6 Nov 2025 17:25:34 +0900 Subject: [PATCH 64/82] =?UTF-8?q?feat:=20=EB=A1=9C=EB=94=A9=20=EC=8A=A4?= =?UTF-8?q?=ED=94=BC=EB=84=88=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/comingSoon/page.tsx | 6 ++++-- app/downloads/page.tsx | 2 +- app/more/page.tsx | 2 +- app/search/page.tsx | 4 ++-- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/app/comingSoon/page.tsx b/app/comingSoon/page.tsx index 6b5c09f..59ea6a7 100644 --- a/app/comingSoon/page.tsx +++ b/app/comingSoon/page.tsx @@ -1,7 +1,9 @@ -export default function CommingSoon() { +"use client"; + +export default function ComingSoon() { return (
- CommingSoon νŽ˜μ΄μ§€μž…λ‹ˆλ‹€. +
); } diff --git a/app/downloads/page.tsx b/app/downloads/page.tsx index d636969..7958dbf 100644 --- a/app/downloads/page.tsx +++ b/app/downloads/page.tsx @@ -1,7 +1,7 @@ export default function Downloads() { return (
- Downloads νŽ˜μ΄μ§€μž…λ‹ˆλ‹€. +
); } diff --git a/app/more/page.tsx b/app/more/page.tsx index c043326..d642eeb 100644 --- a/app/more/page.tsx +++ b/app/more/page.tsx @@ -1,7 +1,7 @@ export default function More() { return (
- More νŽ˜μ΄μ§€μž…λ‹ˆλ‹€. +
); } diff --git a/app/search/page.tsx b/app/search/page.tsx index c9cf052..00fa630 100644 --- a/app/search/page.tsx +++ b/app/search/page.tsx @@ -1,7 +1,7 @@ export default function Search() { return ( -
- Search νŽ˜μ΄μ§€μž…λ‹ˆλ‹€. +
+
); } From 35b80ee2d985d247c099647cf312e855074cee61 Mon Sep 17 00:00:00 2001 From: baekseungsun Date: Fri, 7 Nov 2025 14:01:59 +0900 Subject: [PATCH 65/82] =?UTF-8?q?feat:=20Preview=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/title/[id]/page.tsx | 63 +++++++++++++ components/Thumbnail.tsx | 25 +++++ components/home/Banner.tsx | 51 +++++++---- components/home/ContinueWatching.tsx | 9 +- components/home/NetflixOriginals.tsx | 9 +- components/home/NewReleases.tsx | 9 +- components/home/Nollywood.tsx | 9 +- components/home/Popular.tsx | 9 +- components/home/Previews.tsx | 78 ++++++++++++---- components/home/Top10.tsx | 18 ++-- components/home/TrendingNow.tsx | 9 +- components/home/TvThrillerMysteries.tsx | 9 +- components/home/USTvShow.tsx | 9 +- components/home/WatchItAgain.tsx | 9 +- lib/api/tdmb/getOverview.ts | 26 ++++++ lib/api/tdmb/movie.ts | 45 ++++++--- next.config.ts | 8 +- package-lock.json | 116 +++++++++++++++++++++--- package.json | 1 + 19 files changed, 369 insertions(+), 143 deletions(-) create mode 100644 app/title/[id]/page.tsx create mode 100644 components/Thumbnail.tsx create mode 100644 lib/api/tdmb/getOverview.ts diff --git a/app/title/[id]/page.tsx b/app/title/[id]/page.tsx new file mode 100644 index 0000000..641ea9e --- /dev/null +++ b/app/title/[id]/page.tsx @@ -0,0 +1,63 @@ +"use client"; + +import Image from "next/image"; +import { useEffect, useState } from "react"; +import { useSearchParams, useParams } from "next/navigation"; +import { fetchOverview } from "@/lib/api/tdmb/getOverview"; + +const IMG_BASE = "https://image.tmdb.org/t/p"; + +export default function TitlePreviewPage() { + const searchParams = useSearchParams(); + const params = useParams<{ id: string }>(); + + const imgPath = searchParams.get("img") || ""; + const id = params?.id ?? ""; + + const [overview, setOverview] = useState(""); + const [loading, setLoading] = useState(true); + + + useEffect(() => { + if (!id) return; + (async () => { + try { + const data = await fetchOverview(id, { language: "en-" }); + setOverview(data.overview); + } finally { + setLoading(false); + } + })(); + }, [id]); + + const normalized = imgPath.startsWith("/") ? imgPath : `/${imgPath}`; + const src = `${IMG_BASE}/w780${normalized}`; + + return ( +
+ {/* 이미지 */} +
+ +
+
+ + {/* Play λ²„νŠΌ */} + + + {/* Previews */} + + Previews + + + {overview} + +
+ ); +} diff --git a/components/Thumbnail.tsx b/components/Thumbnail.tsx new file mode 100644 index 0000000..e616d98 --- /dev/null +++ b/components/Thumbnail.tsx @@ -0,0 +1,25 @@ +"use client"; + +import Link from "next/link"; +import Image from "next/image"; +import type { TMDBMovie, TMDBTvShow } from "@/lib/api/types/tdmbs"; + +type Thumb = TMDBMovie | TMDBTvShow; + +const IMG_BASE = "https://image.tmdb.org/t/p"; + +export default function Thumbnail({item, className, imgSize = "w500", }: { + item: Thumb; + className?: string; + imgSize?: "w200" | "w300" | "w342" | "w500" | "w780" | "original"; }) { + const path = item.poster_path || item.backdrop_path || ""; + const src = path ? `${IMG_BASE}/${imgSize}${path}` : "/placeholder-portrait.png"; + + return ( + + + thumbnail + + ); +} diff --git a/components/home/Banner.tsx b/components/home/Banner.tsx index 3d4a259..ec315f5 100644 --- a/components/home/Banner.tsx +++ b/components/home/Banner.tsx @@ -1,15 +1,17 @@ "use client"; import { useEffect, useMemo, useRef, useState } from "react"; +import Link from "next/link"; +import Image from "next/image"; import { fetcher } from "@/lib/fetcher"; import type { tmdbListResponse, tmdbTitle } from "@/types/tmdb"; -import Image from "next/image"; import add from "@/public/icons/add.svg"; import play from "@/public/icons/play.svg"; import info from "@/public/icons/info.svg"; -const imgBase = process.env.NEXT_PUBLIC_TMDB_IMAGE_BASE || "https://image.tmdb.org/t/p"; -const rotateTime = 20_000; // 20초 간격 (μž„μ˜) +const imgBase = + process.env.NEXT_PUBLIC_TMDB_IMAGE_BASE || "https://image.tmdb.org/t/p"; +const rotateTime = 20_000; // 20초 간격 const regionName = "Korea"; // URL λ§Œλ“œλŠ” ν•¨μˆ˜ @@ -47,13 +49,13 @@ export default function Banner() { })(); }, []); - // 20μ΄ˆλ§ˆλ‹€ λ³€κ²½ + // 20μ΄ˆλ§ˆλ‹€ μžλ™ λ³€κ²½ useEffect(() => { if (!items.length) return; const start = () => { stop(); timerRef.current = window.setInterval(() => { - setIndex((i) => (i + 1) % items.length); //index증가 + setIndex((i) => (i + 1) % items.length); }, rotateTime); }; const stop = () => { @@ -64,23 +66,33 @@ export default function Banner() { }; start(); - return () => { - stop(); - }; + return () => stop(); }, [items.length]); const current = items[index] ?? null; const title = current?.title ?? current?.name ?? ""; + const backdropPath = current?.backdrop_path ?? current?.poster_path ?? ""; const backdrop = useMemo( - () => buildImageUrl(current?.backdrop_path ?? current?.poster_path, "w1280"), - [current?.backdrop_path, current?.poster_path] + () => buildImageUrl(backdropPath, "w1280"), + [backdropPath] ); const rank = Math.min(index + 1, 10); + // img 쿼리둜 κ²½λ‘œμ „λ‹¬ + const previewHref = + current && backdropPath + ? { pathname: `/title/${current.id}`, query: { img: backdropPath } } + : "#"; + return (
-
- {backdrop && ( + {current && backdrop ? ( + - )} - {/* 이미지 κ·Έλ ˆμ΄λ””μ–ΈνŠΈ */} -
-
+ {/* 이미지 κ·ΈλΌλ°μ΄μ…˜ */} +
+ + ) : ( +
+ )}
@@ -102,11 +116,10 @@ export default function Banner() { TOP 10 - - #{rank} in {regionName} Today - + #{rank} in {regionName} Today
+
{/* My List */}
))}
diff --git a/components/home/Nollywood.tsx b/components/home/Nollywood.tsx index 9fefd60..4f2db7d 100644 --- a/components/home/Nollywood.tsx +++ b/components/home/Nollywood.tsx @@ -5,6 +5,7 @@ import Image from "next/image"; import SectionTitle from "@/components/home/SectionTitle"; import { fetchNollywoodMovies } from "@/lib/api/tdmb/combined"; import type { TMDBMovie, TMDBTvShow } from "@/lib/api/types/tdmbs"; +import Thumbnail from '@/components/Thumbnail'; type CombinedItem = TMDBMovie | TMDBTvShow; @@ -37,13 +38,7 @@ export default function Nollywood() { key={movie.id} className="relative w-[103px] h-[161px] flex-shrink-0 group" > - {("title" +
))}
diff --git a/components/home/Popular.tsx b/components/home/Popular.tsx index 7fcc6f3..a0c60b5 100644 --- a/components/home/Popular.tsx +++ b/components/home/Popular.tsx @@ -5,6 +5,7 @@ import Image from "next/image"; import SectionTitle from "@/components/home/SectionTitle"; import { fetchPopularMovies } from "@/lib/api/tdmb/movie"; import type { TMDBMovie } from "@/lib/api/types/tdmbs"; +import Thumbnail from '@/components/Thumbnail'; export default function Popular() { const [movies, setMovies] = useState([]); @@ -35,13 +36,7 @@ export default function Popular() { key={movie.id} className="relative w-[103px] h-[161px] flex-shrink-0 group" > - {movie.title} +
))}
diff --git a/components/home/Previews.tsx b/components/home/Previews.tsx index 553fbf6..fd3d689 100644 --- a/components/home/Previews.tsx +++ b/components/home/Previews.tsx @@ -1,26 +1,66 @@ "use client"; import { useEffect, useState } from "react"; -import { getPreviewPosters } from "@/lib/tmdb"; +import Link from "next/link"; +import { fetcher } from "@/lib/fetcher"; +import type { tmdbListResponse, tmdbTitle } from "@/types/tmdb"; + +const IMG_BASE = process.env.NEXT_PUBLIC_TMDB_IMAGE_BASE || "https://image.tmdb.org/t/p"; + +type Row = { id: number; poster_path: string }; export default function Previews() { - //ν¬μŠ€ν„°μš© URL λ°°μ—΄ - const [items, setItems] = useState<{ poster: string }[]>([]); - - useEffect(() => { - getPreviewPosters().then(setItems).catch(console.error); - }, []); - - return ( -
- Previews -
- {items.map((item, i) => ( -
- {`preview-${i}`} -
- ))} + const [items, setItems] = useState([]); + + useEffect(() => { + fetcher>("/3/movie/now_playing", { + language: "ko-KR", + page: "1", + region: "KR", + }) + .then((data) => { + const rows = + (data.results ?? []) + .filter((t) => !!t.poster_path && !!t.id) + .slice(0, 10) //10개만 (μž„μ˜) + .map((t) => ({ id: t.id!, poster_path: t.poster_path! })); + setItems(rows); + }) + .catch(console.error); + }, []); + + return ( +
+ Previews + +
+ {items.map((item) => { + const pathOnly = item.poster_path.startsWith("/") + ? item.poster_path + : `/${item.poster_path}`; + + //쿼리에 path전달 + const thumbUrl = `${IMG_BASE}/w342${pathOnly}`; + + return ( +
+ + {`preview-${item.id}`} +
-
- ); + ); + })} +
+
+ ); } diff --git a/components/home/Top10.tsx b/components/home/Top10.tsx index 4515353..1fa7d72 100644 --- a/components/home/Top10.tsx +++ b/components/home/Top10.tsx @@ -5,6 +5,7 @@ import Image from "next/image"; import SectionTitle from "@/components/home/SectionTitle"; import { fetchTop10Movies } from "@/lib/api/tdmb/movie"; import type { TMDBMovie } from "@/lib/api/types/tdmbs"; +import Thumbnail from "@/components/Thumbnail" export default function Top10() { const [movies, setMovies] = useState([]); @@ -28,23 +29,16 @@ export default function Top10() {
{movies - .filter((movie) => movie.poster_path) // null μ•„λ‹Œ κ²ƒλ§Œ - .slice(0, 10) // 10개 ν‘œμ‹œ! + .filter((movie) => movie.poster_path || movie.backdrop_path) + .slice(0, 10) .map((movie) => (
- {movie.title} + className="relative w-[103px] h-[161px] flex-shrink-0 group"> +
))}
); -} +} \ No newline at end of file diff --git a/components/home/TrendingNow.tsx b/components/home/TrendingNow.tsx index 9362920..b9e7a9c 100644 --- a/components/home/TrendingNow.tsx +++ b/components/home/TrendingNow.tsx @@ -5,6 +5,7 @@ import Image from "next/image"; import SectionTitle from "@/components/home/SectionTitle"; import { fetchTrendingMovies } from "@/lib/api/tdmb/movie"; import type { TMDBMovie } from "@/lib/api/types/tdmbs"; +import Thumbnail from '@/components/Thumbnail'; export default function TrendingNow() { const [movies, setMovies] = useState([]); @@ -35,13 +36,7 @@ export default function TrendingNow() { key={movie.id} className="relative w-[103px] h-[161px] flex-shrink-0 group" > - {movie.title} +
))}
diff --git a/components/home/TvThrillerMysteries.tsx b/components/home/TvThrillerMysteries.tsx index 55ccaae..bfd5c39 100644 --- a/components/home/TvThrillerMysteries.tsx +++ b/components/home/TvThrillerMysteries.tsx @@ -5,6 +5,7 @@ import Image from "next/image"; import SectionTitle from "@/components/home/SectionTitle"; import { fetchThrillerMysteryMovies } from "@/lib/api/tdmb/movie"; import type { TMDBTvShow } from "@/lib/api/types/tdmbs"; +import Thumbnail from '@/components/Thumbnail'; export default function TvThrillerMysteries() { const [movies, setMovies] = useState([]); @@ -35,13 +36,7 @@ export default function TvThrillerMysteries() { key={movie.id} className="relative w-[103px] h-[161px] flex-shrink-0 group" > - {movie.name} +
))}
diff --git a/components/home/USTvShow.tsx b/components/home/USTvShow.tsx index 99437b4..857f3d0 100644 --- a/components/home/USTvShow.tsx +++ b/components/home/USTvShow.tsx @@ -5,6 +5,7 @@ import Image from "next/image"; import SectionTitle from "@/components/home/SectionTitle"; import { fetchUSTVShows } from "@/lib/api/tdmb/tv"; import type { TMDBTvShow } from "@/lib/api/types/tdmbs"; +import Thumbnail from '@/components/Thumbnail'; export default function UsTvShow() { const [movies, setMovies] = useState([]); @@ -35,13 +36,7 @@ export default function UsTvShow() { key={movie.id} className="relative w-[103px] h-[161px] flex-shrink-0 group" > - {movie.name} +
))}
diff --git a/components/home/WatchItAgain.tsx b/components/home/WatchItAgain.tsx index 2f0905d..dd19839 100644 --- a/components/home/WatchItAgain.tsx +++ b/components/home/WatchItAgain.tsx @@ -6,6 +6,7 @@ import Image from "next/image"; import SectionTitle from "@/components/home/SectionTitle"; import { watchHistory } from "@/data/watchHistory"; import type { TMDBMovie } from "@/lib/api/types/tdmbs"; +import Thumbnail from '@/components/Thumbnail'; export default function WatchItAgain() { const [movies, setMovies] = useState([]); @@ -32,13 +33,7 @@ export default function WatchItAgain() { key={movie.id} className="relative w-[103px] h-[161px] flex-shrink-0 group" > - {movie.title} +
))}
diff --git a/lib/api/tdmb/getOverview.ts b/lib/api/tdmb/getOverview.ts new file mode 100644 index 0000000..a309773 --- /dev/null +++ b/lib/api/tdmb/getOverview.ts @@ -0,0 +1,26 @@ +const TMDB_API_BASE = "https://api.themoviedb.org/3"; +const TMDB_KEY = process.env.NEXT_PUBLIC_TMDB_API_KEY!; + +type Kind = "movie" | "tv"; +type Result = { kind: Kind | null; overview: string }; + +export async function fetchOverview( + id: string | number, + opts?: { language?: string } +): Promise { + const language = opts?.language ?? "en-US"; + const kinds: Kind[] = ["movie", "tv"]; + const langs = [language, "en-US"]; + + for (const lang of langs) { + for (const kind of kinds) { + const url = `${TMDB_API_BASE}/${kind}/${id}?language=${lang}&api_key=${TMDB_KEY}`; + const res = await fetch(url); + if (!res.ok) continue; + const json = await res.json(); + const text = (json?.overview || "").trim(); + if (text) return { kind, overview: text }; + } + } + return { kind: null, overview: "" }; +} diff --git a/lib/api/tdmb/movie.ts b/lib/api/tdmb/movie.ts index 5523820..4d78681 100644 --- a/lib/api/tdmb/movie.ts +++ b/lib/api/tdmb/movie.ts @@ -1,7 +1,22 @@ import { BASE_URL, API_KEY, REVALIDATE_TIME } from "../../constants/tdmbs"; import type { TMDBApiResponse, TMDBMovie } from "../types/tdmbs"; -//New Releases λΆ€λΆ„ +//Banner +export async function fetchBanner( + language = "en-US", + page = 1, + region = "US" +): Promise { + const res = await fetch( + `${BASE_URL}/movie/popular?api_key=${API_KEY}&language=${language}&page=${page}®ion=${region}`, + { next: { revalidate: REVALIDATE_TIME } } + ); + if (!res.ok) throw new Error("Failed to fetch movies"); + const data: TMDBApiResponse = await res.json(); + return data.results; +} + +// New Releases λΆ€λΆ„ export async function fetchNewReleases( language = "en-US", page = 1, @@ -69,21 +84,21 @@ export async function fetchAfricanMovies( return data.results; } -//Top 10 in Nigiria λΆ€λΆ„ -export async function fetchTop10Movies( - region = "NG", //κΈ°μ€€ κ΅­κ°€ μ •ν•  수 있음 - language = "en-US", - page = 1 -) { - const res = await fetch( - `${BASE_URL}/movie/top_rated?api_key=${API_KEY}®ion=${region}&language=${language}&page=${page}`, - { - next: { revalidate: 3600 }, // ISR 캐싱: 1μ‹œκ°„λ§ˆλ‹€ μƒˆλ‘œ 패치 +//Top 10 in Nigeria λΆ€λΆ„ + export async function fetchTop10Movies( + region = "NG", //κΈ°μ€€ κ΅­κ°€ μ •ν•  수 있음 + language = "en-US", + page = 1 + ) { + const res = await fetch( + `${BASE_URL}/movie/top_rated?api_key=${API_KEY}®ion=${region}&language=${language}&page=${page}`, + { + next: { revalidate: 3600 }, // ISR 캐싱: 1μ‹œκ°„λ§ˆλ‹€ μƒˆλ‘œ 패치 + } + ); + if (!res.ok) { + throw new Error("Failed to fetch movies"); } - ); - if (!res.ok) { - throw new Error("Failed to fetch movies"); - } const data = await res.json(); return data.results; diff --git a/next.config.ts b/next.config.ts index 804e7a1..225468c 100644 --- a/next.config.ts +++ b/next.config.ts @@ -6,6 +6,12 @@ const nextConfig: NextConfig = { }, }; -export default nextConfig; +module.exports = { images: { domains: ["image.tmdb.org"] } } +// next.config.js +module.exports = { + images: { + domains: ["image.tmdb.org"], + }, +}; diff --git a/package-lock.json b/package-lock.json index ca684c2..169d2d3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,7 @@ "name": "next-netflix-22nd", "version": "0.1.0", "dependencies": { + "axios": "^1.13.2", "babel-plugin-styled-components": "^2.1.4", "lottie-react": "^2.4.1", "next": "16.0.0", @@ -4212,6 +4213,12 @@ "node": ">= 0.4" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -4238,6 +4245,17 @@ "node": ">=4" } }, + "node_modules/axios": { + "version": "1.13.2", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.13.2.tgz", + "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, "node_modules/axobject-query": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", @@ -4409,7 +4427,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -4532,6 +4549,18 @@ "dev": true, "license": "MIT" }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/commander": { "version": "7.2.0", "resolved": "https://registry.npmmirror.com/commander/-/commander-7.2.0.tgz", @@ -4860,6 +4889,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", @@ -4957,7 +4995,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -5091,7 +5128,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -5101,7 +5137,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -5139,7 +5174,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -5152,7 +5186,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -5807,6 +5840,26 @@ "dev": true, "license": "ISC" }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/for-each": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", @@ -5823,6 +5876,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -5834,7 +5903,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -5894,7 +5962,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -5919,7 +5986,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -6051,7 +6117,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -6130,7 +6195,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -6143,7 +6207,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -6159,7 +6222,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -7220,7 +7282,6 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -7257,6 +7318,27 @@ "node": ">=8.6" } }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -7845,6 +7927,12 @@ "react-is": "^16.13.1" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", diff --git a/package.json b/package.json index e6cf4c4..8751e86 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "prebuild": "npm run svgr:navbarIcons" }, "dependencies": { + "axios": "^1.13.2", "babel-plugin-styled-components": "^2.1.4", "lottie-react": "^2.4.1", "next": "16.0.0", From 34e19b3c4271cbcfd40c4a750d11e859042d3c48 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Sat, 8 Nov 2025 10:29:16 +0900 Subject: [PATCH 66/82] =?UTF-8?q?[#22]=20feat:=20=EA=B2=80=EC=83=89=20?= =?UTF-8?q?=EC=98=81=ED=99=94=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/home/page.tsx | 4 +-- app/layout.tsx | 14 +++++------ app/page.tsx | 2 +- app/search/page.tsx | 38 +++++++++++++++++++++++++++-- components/search/SearchResult.tsx | 33 +++++++++++++++++++++++++ components/search/SearchSection.tsx | 35 ++++++++++++++++++++++++++ lib/api/tdmb/movie.ts | 26 ++++++++++++++++++++ public/icons/search.svg | 3 +++ public/icons/xButton.svg | 3 +++ 9 files changed, 145 insertions(+), 13 deletions(-) create mode 100644 components/search/SearchResult.tsx create mode 100644 components/search/SearchSection.tsx create mode 100644 public/icons/search.svg create mode 100644 public/icons/xButton.svg diff --git a/app/home/page.tsx b/app/home/page.tsx index 747a82e..28762a2 100644 --- a/app/home/page.tsx +++ b/app/home/page.tsx @@ -1,5 +1,5 @@ -import Banner from '../../components/home/section/Banner'; -import HomeHeader from '../../components/home/HomeHeader'; +import Banner from '@/components/home/section/Banner'; +import HomeHeader from '@/components/home/HomeHeader'; import Previews from '@/components/home/section/Previews'; import KoreanMovies from '@/components/home/section/KoreanMovies'; import ContinueWataching from '@/components/home/section/ContinueWatching'; diff --git a/app/layout.tsx b/app/layout.tsx index 7fee958..dfc0cb9 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,10 +1,8 @@ - -import type { Metadata } from "next"; -import { Geist, Geist_Mono } from "next/font/google"; -import "./globals.css"; -import IndicatorBar from "@/components/IndicatorBar"; -import NavbarWrapper from "@/components/NavbarWrapper"; - +import type { Metadata } from 'next'; +import { Geist, Geist_Mono } from 'next/font/google'; +import './globals.css'; +import IndicatorBar from '@/components/IndicatorBar'; +import NavbarWrapper from '@/components/NavbarWrapper'; const geistSans = Geist({ variable: '--font-geist-sans', @@ -32,7 +30,7 @@ export default function RootLayout({ return ( {children} diff --git a/app/page.tsx b/app/page.tsx index b297f58..c1630c6 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -4,7 +4,7 @@ import LottieLogo from '../components/LottieLogo'; export default function Landing() { return ( -
+
); diff --git a/app/search/page.tsx b/app/search/page.tsx index c9cf052..b4563cd 100644 --- a/app/search/page.tsx +++ b/app/search/page.tsx @@ -1,7 +1,41 @@ +'use client'; +import SearchResult from '@/components/search/SearchResult'; +import SearchSection from '@/components/search/SearchSection'; +import { fetchPopularMovies, fetchSearchMovie } from '@/lib/api/tdmb/movie'; +import type { TMDBMovie } from '@/lib/api/types/tdmbs'; +import { useEffect, useState } from 'react'; + export default function Search() { + const [query, setQuery] = useState(''); + const [movies, setMovies] = useState([]); + + useEffect(() => { + const loadMovies = async () => { + if (!query) { + const data = await fetchPopularMovies(); + setMovies(data); + } else { + const data = await fetchSearchMovie('ko-KR', query); + setMovies(data); + } + }; + + loadMovies(); + }, [query]); + return ( -
- Search νŽ˜μ΄μ§€μž…λ‹ˆλ‹€. +
+ {/* 상단 κ³ μ • 검색창 + Top search */} +
+ + Top search +
+ + {/* 검색결과 λͺ©λ‘ */} +
+ {/* mt-[104px] = fixed 헀더(SearchSection + Top search) λ†’μ΄λ§ŒνΌ */} + +
); } diff --git a/components/search/SearchResult.tsx b/components/search/SearchResult.tsx new file mode 100644 index 0000000..d319713 --- /dev/null +++ b/components/search/SearchResult.tsx @@ -0,0 +1,33 @@ +import Image from 'next/image'; +import type { TMDBMovie } from '@/lib/api/types/tdmbs'; + +interface SearchResultProps { + movies: TMDBMovie[]; + query: string; +} + +export default function SearchResult({ movies, query }: SearchResultProps) { + //const state = query ? `Results for "${query}"` : 'Top Searches'; + + if (!movies || movies.length === 0) { + return
검색 κ²°κ³Όκ°€ μ—†μŠ΅λ‹ˆλ‹€. 😒
; + } + return ( +
+ {/*{state}*/} + {movies.map((movie) => ( +
+
+ {movie.title} +
+ {movie.title} +
+ ))} +
+ ); +} diff --git a/components/search/SearchSection.tsx b/components/search/SearchSection.tsx new file mode 100644 index 0000000..4d2aeb6 --- /dev/null +++ b/components/search/SearchSection.tsx @@ -0,0 +1,35 @@ +import Image from 'next/image'; +import { ChangeEvent } from 'react'; +interface SearchSectionProps { + query: string; + onChange: (value: string) => void; // λΆ€λͺ¨μ—κ²Œ query 전달 +} +export default function SearchSection({ query, onChange }: SearchSectionProps) { + const handleInputChange = (e: ChangeEvent) => { + onChange(e.target.value); + }; + return ( +
+
+ search + +
+ {query && ( + xbtton onChange('')} + /> + )} +
+ ); +} diff --git a/lib/api/tdmb/movie.ts b/lib/api/tdmb/movie.ts index 18989eb..db0cf2d 100644 --- a/lib/api/tdmb/movie.ts +++ b/lib/api/tdmb/movie.ts @@ -2,6 +2,32 @@ import { BASE_URL, API_KEY } from '@/lib/constants/tdmbs'; import type { TMDBApiResponse, TMDBMovie, TMDBTvShow } from '@/lib/api/types/tdmbs'; import axios from 'axios'; +//search page μ˜ν™” λΆ€λΆ„ +export async function fetchSearchMovie( + language = 'ko-KR', + query = '', + page = 1, + include_adult = false, +): Promise { + try { + const res = await axios.get>(`${BASE_URL}/search/movie`, { + params: { + api_key: API_KEY, + language, + query, + page, + include_adult, + }, + }); + const moviesWithImage = res.data.results.filter((movie) => movie.poster_path !== null); + console.log('search movie:', res.data.results); + return moviesWithImage; + } catch (error) { + console.error('❌ fetch search movie error:', error); + return []; + } +} + //New Releases λΆ€λΆ„ export async function fetchNewReleases(language = 'en-US', page = 1, region = 'US'): Promise { try { diff --git a/public/icons/search.svg b/public/icons/search.svg new file mode 100644 index 0000000..381d3b0 --- /dev/null +++ b/public/icons/search.svg @@ -0,0 +1,3 @@ + + + diff --git a/public/icons/xButton.svg b/public/icons/xButton.svg new file mode 100644 index 0000000..d786511 --- /dev/null +++ b/public/icons/xButton.svg @@ -0,0 +1,3 @@ + + + From 28643d62bad9c58d2438853c489b4b53bf98f6a8 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Sat, 8 Nov 2025 10:31:26 +0900 Subject: [PATCH 67/82] =?UTF-8?q?[#22]=20fix:=20=EC=8A=A4=ED=83=80?= =?UTF-8?q?=EC=9D=BC=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/search/page.tsx | 5 ++--- components/search/SearchResult.tsx | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/app/search/page.tsx b/app/search/page.tsx index b4563cd..ca0f112 100644 --- a/app/search/page.tsx +++ b/app/search/page.tsx @@ -26,13 +26,12 @@ export default function Search() { return (
{/* 상단 κ³ μ • 검색창 + Top search */} -
+
- Top search
{/* 검색결과 λͺ©λ‘ */} -
+
{/* mt-[104px] = fixed 헀더(SearchSection + Top search) λ†’μ΄λ§ŒνΌ */}
diff --git a/components/search/SearchResult.tsx b/components/search/SearchResult.tsx index d319713..d350960 100644 --- a/components/search/SearchResult.tsx +++ b/components/search/SearchResult.tsx @@ -7,14 +7,14 @@ interface SearchResultProps { } export default function SearchResult({ movies, query }: SearchResultProps) { - //const state = query ? `Results for "${query}"` : 'Top Searches'; + const state = query ? `Results for "${query}"` : 'Top Searches'; if (!movies || movies.length === 0) { return
검색 κ²°κ³Όκ°€ μ—†μŠ΅λ‹ˆλ‹€. 😒
; } return (
- {/*{state}*/} + {state} {movies.map((movie) => (
From 8b1dc4213012c04794c9d8536a54c1931415fbd3 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Sat, 8 Nov 2025 10:49:26 +0900 Subject: [PATCH 68/82] =?UTF-8?q?[#22]=20feat:=20=EB=AC=B4=ED=95=9C=20?= =?UTF-8?q?=EB=A1=9C=EB=94=A9=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/search/page.tsx | 61 +++++++++++++++++++++++------- components/search/SearchResult.tsx | 20 +++++++++- public/icons/playSearch.svg | 4 ++ 3 files changed, 70 insertions(+), 15 deletions(-) create mode 100644 public/icons/playSearch.svg diff --git a/app/search/page.tsx b/app/search/page.tsx index ca0f112..8b4420d 100644 --- a/app/search/page.tsx +++ b/app/search/page.tsx @@ -3,26 +3,61 @@ import SearchResult from '@/components/search/SearchResult'; import SearchSection from '@/components/search/SearchSection'; import { fetchPopularMovies, fetchSearchMovie } from '@/lib/api/tdmb/movie'; import type { TMDBMovie } from '@/lib/api/types/tdmbs'; -import { useEffect, useState } from 'react'; +import { useEffect, useRef, useState } from 'react'; export default function Search() { const [query, setQuery] = useState(''); const [movies, setMovies] = useState([]); - useEffect(() => { - const loadMovies = async () => { - if (!query) { - const data = await fetchPopularMovies(); - setMovies(data); - } else { - const data = await fetchSearchMovie('ko-KR', query); - setMovies(data); - } - }; + const [page, setPage] = useState(1); + const [hasMore, setHasMore] = useState(true); + + const loaderRef = useRef(null); + + const loadMovies = async (isNewSearch = false) => { + const nextPage = isNewSearch ? 1 : page; + let data: TMDBMovie[] = []; + + if (!query) { + data = await fetchPopularMovies('en-US', nextPage); + } else { + data = await fetchSearchMovie('ko-KR', query, nextPage); + } + + if (isNewSearch) { + setMovies(data); + setPage(2); + } else { + setMovies((prev) => [...prev, ...data]); + setPage((prev) => prev + 1); + } + + setHasMore(data.length > 0); + }; - loadMovies(); + // 검색어 λ³€κ²½ μ‹œ μ΄ˆκΈ°ν™” + useEffect(() => { + loadMovies(true); }, [query]); + // λ¬΄ν•œ 슀크둀 Intersection Observer + useEffect(() => { + const observer = new IntersectionObserver( + (entries) => { + if (entries[0].isIntersecting && hasMore) { + loadMovies(); + } + }, + { root: null, rootMargin: '0px', threshold: 1.0 }, + ); + + if (loaderRef.current) observer.observe(loaderRef.current); + + return () => { + if (loaderRef.current) observer.unobserve(loaderRef.current); + }; + }, [loaderRef, hasMore, query, page]); + return (
{/* 상단 κ³ μ • 검색창 + Top search */} @@ -33,7 +68,7 @@ export default function Search() { {/* 검색결과 λͺ©λ‘ */}
{/* mt-[104px] = fixed 헀더(SearchSection + Top search) λ†’μ΄λ§ŒνΌ */} - +
); diff --git a/components/search/SearchResult.tsx b/components/search/SearchResult.tsx index d350960..8a9175e 100644 --- a/components/search/SearchResult.tsx +++ b/components/search/SearchResult.tsx @@ -1,12 +1,15 @@ import Image from 'next/image'; import type { TMDBMovie } from '@/lib/api/types/tdmbs'; +import { RefObject } from 'react'; interface SearchResultProps { movies: TMDBMovie[]; query: string; + loaderRef: RefObject; // loader ref μΆ”κ°€ + hasMore: boolean; // 더 뢈러올 μ˜ν™”κ°€ μžˆλŠ”μ§€ } -export default function SearchResult({ movies, query }: SearchResultProps) { +export default function SearchResult({ movies, query, loaderRef, hasMore }: SearchResultProps) { const state = query ? `Results for "${query}"` : 'Top Searches'; if (!movies || movies.length === 0) { @@ -16,7 +19,10 @@ export default function SearchResult({ movies, query }: SearchResultProps) {
{state} {movies.map((movie) => ( -
+
{movie.title} + Play Search Icon
))} + {/* λ¬΄ν•œ 슀크둀 감지 div */} +
+ {hasMore ? 'Loading...' : 'No more movies'} +
); } diff --git a/public/icons/playSearch.svg b/public/icons/playSearch.svg new file mode 100644 index 0000000..6d95f76 --- /dev/null +++ b/public/icons/playSearch.svg @@ -0,0 +1,4 @@ + + + + From 3f995164e3b81d0f369f6bfc9a40485fda1a3d6d Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Sat, 8 Nov 2025 11:04:59 +0900 Subject: [PATCH 69/82] =?UTF-8?q?feat:=20skeleton=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/search/page.tsx | 39 +++++++++++++--------- components/search/SearchResult.tsx | 50 ++++++++++++++++------------ components/search/SearchSkeleton.tsx | 12 +++++++ 3 files changed, 64 insertions(+), 37 deletions(-) create mode 100644 components/search/SearchSkeleton.tsx diff --git a/app/search/page.tsx b/app/search/page.tsx index 8b4420d..247dbe1 100644 --- a/app/search/page.tsx +++ b/app/search/page.tsx @@ -11,28 +11,35 @@ export default function Search() { const [page, setPage] = useState(1); const [hasMore, setHasMore] = useState(true); - + const [loading, setLoading] = useState(false); const loaderRef = useRef(null); const loadMovies = async (isNewSearch = false) => { + setLoading(true); const nextPage = isNewSearch ? 1 : page; let data: TMDBMovie[] = []; - if (!query) { - data = await fetchPopularMovies('en-US', nextPage); - } else { - data = await fetchSearchMovie('ko-KR', query, nextPage); - } + try { + if (!query) { + data = await fetchPopularMovies('en-US', nextPage); + } else { + data = await fetchSearchMovie('ko-KR', query, nextPage); + } - if (isNewSearch) { - setMovies(data); - setPage(2); - } else { - setMovies((prev) => [...prev, ...data]); - setPage((prev) => prev + 1); - } + if (isNewSearch) { + setMovies(data); + setPage(2); + } else { + setMovies((prev) => [...prev, ...data]); + setPage((prev) => prev + 1); + } - setHasMore(data.length > 0); + setHasMore(data.length > 0); + } catch (error) { + console.log('error:', error); + } finally { + setLoading(false); + } }; // 검색어 λ³€κ²½ μ‹œ μ΄ˆκΈ°ν™” @@ -56,7 +63,7 @@ export default function Search() { return () => { if (loaderRef.current) observer.unobserve(loaderRef.current); }; - }, [loaderRef, hasMore, query, page]); + }, [loading, loaderRef, hasMore, query, page]); return (
@@ -68,7 +75,7 @@ export default function Search() { {/* 검색결과 λͺ©λ‘ */}
{/* mt-[104px] = fixed 헀더(SearchSection + Top search) λ†’μ΄λ§ŒνΌ */} - +
); diff --git a/components/search/SearchResult.tsx b/components/search/SearchResult.tsx index 8a9175e..3cdeec3 100644 --- a/components/search/SearchResult.tsx +++ b/components/search/SearchResult.tsx @@ -1,15 +1,17 @@ import Image from 'next/image'; import type { TMDBMovie } from '@/lib/api/types/tdmbs'; import { RefObject } from 'react'; +import MovieSkeleton from '@/components/search/SearchSkeleton'; interface SearchResultProps { movies: TMDBMovie[]; query: string; loaderRef: RefObject; // loader ref μΆ”κ°€ hasMore: boolean; // 더 뢈러올 μ˜ν™”κ°€ μžˆλŠ”μ§€ + loading: boolean; } -export default function SearchResult({ movies, query, loaderRef, hasMore }: SearchResultProps) { +export default function SearchResult({ movies, query, loaderRef, hasMore, loading }: SearchResultProps) { const state = query ? `Results for "${query}"` : 'Top Searches'; if (!movies || movies.length === 0) { @@ -18,31 +20,37 @@ export default function SearchResult({ movies, query, loaderRef, hasMore }: Sear return (
{state} - {movies.map((movie) => ( -
-
+ {loading ? ( + + ) : movies.length === 0 ? ( +
검색 κ²°κ³Όκ°€ μ—†μŠ΅λ‹ˆλ‹€. 😒
+ ) : ( + movies.map((movie) => ( +
+
+ {movie.title} +
+ {movie.title} {movie.title}
- {movie.title} - Play Search Icon -
- ))} + )) + )} {/* λ¬΄ν•œ 슀크둀 감지 div */}
- {hasMore ? 'Loading...' : 'No more movies'} + {hasMore ? 'λ‘œλ”© μ€‘μž…λ‹ˆλ‹€.' : '더 이상 쑰회된 μ˜ν™”κ°€ μ—†μŠ΅λ‹ˆλ‹€.'}
); diff --git a/components/search/SearchSkeleton.tsx b/components/search/SearchSkeleton.tsx new file mode 100644 index 0000000..d2ac222 --- /dev/null +++ b/components/search/SearchSkeleton.tsx @@ -0,0 +1,12 @@ +export default function MovieSkeleton({ count = 6 }: { count?: number }) { + return ( +
+ {Array.from({ length: count }).map((_, idx) => ( +
+ {/* μΉ΄λ“œ μ•ˆμ— 이미지 μ˜μ—­ */} +
+
+ ))} +
+ ); +} From bf60fbdf4dd8ffd044c45896ba01cd114a3a4e12 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A1=B0=EC=84=B1=EC=95=84?= <170587664+sungahChooo@users.noreply.github.com> Date: Sat, 8 Nov 2025 15:18:22 +0900 Subject: [PATCH 70/82] Update PULL_REQUEST_TEMPLATE.md --- .github/PULL_REQUEST_TEMPLATE.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index c091f9a..2482227 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,3 +1,10 @@ +### 체크리슀트! +- [ ] βœ… baseκ°€ devκ°€ λ§žλ‚˜μš”? +- [ ] πŸ”€ PR 제λͺ©μ˜ ν˜•μ‹μ„ 잘 μž‘μ„±ν–ˆλ‚˜μš”? +- [ ] 🧹 λΆˆν•„μš”ν•œ μ½”λ“œλŠ” μ œκ±°ν–ˆλ‚˜μš”? +- [ ] πŸ’­ μ΄μŠˆλŠ” λ“±λ‘ν–ˆλ‚˜μš”? +- [ ] 🏷️ 라벨은 λ“±λ‘ν–ˆλ‚˜μš”? + ## #οΈβƒ£μ—°κ΄€λœ 이슈 > ex) #이슈번호, #이슈번호 @@ -11,3 +18,5 @@ ## πŸ’¬λ¦¬λ·° μš”κ΅¬μ‚¬ν•­(선택) > 리뷰어가 νŠΉλ³„νžˆ λ΄μ£Όμ—ˆμœΌλ©΄ ν•˜λŠ” 뢀뢄이 μžˆλ‹€λ©΄ μž‘μ„±ν•΄μ£Όμ„Έμš” + +#### close: μžμ‹ μ΄ 개발 전에 올린 이슈번호 From 19fbd95b08644c033c9bfc223334efc34119f8b9 Mon Sep 17 00:00:00 2001 From: baekseungsun Date: Sat, 8 Nov 2025 16:47:03 +0900 Subject: [PATCH 71/82] =?UTF-8?q?refactor:=20searchResults.tsx=20=ED=94=84?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/home/section/KoreanMovies.tsx | 10 ++-------- components/search/SearchResult.tsx | 8 ++------ 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/components/home/section/KoreanMovies.tsx b/components/home/section/KoreanMovies.tsx index 85e0d67..921cc84 100644 --- a/components/home/section/KoreanMovies.tsx +++ b/components/home/section/KoreanMovies.tsx @@ -1,10 +1,10 @@ 'use client'; import { useEffect, useState } from 'react'; -import Image from 'next/image'; import SectionTitle from '@/components/home/section/SectionTitle'; import { fetchKoreanMovies } from '@/lib/api/tdmb/movie'; import type { TMDBMovie } from '@/lib/api/types/tdmbs'; +import Thumbnail from '@/components/Thumbnail'; export default function KoreanMovies() { const [movies, setMovies] = useState([]); @@ -32,13 +32,7 @@ export default function KoreanMovies() { .slice(0, 5) // 5개만 ν‘œμ‹œ .map((movie) => (
- {movie.title} +
))}
diff --git a/components/search/SearchResult.tsx b/components/search/SearchResult.tsx index 3cdeec3..b8d4696 100644 --- a/components/search/SearchResult.tsx +++ b/components/search/SearchResult.tsx @@ -2,6 +2,7 @@ import Image from 'next/image'; import type { TMDBMovie } from '@/lib/api/types/tdmbs'; import { RefObject } from 'react'; import MovieSkeleton from '@/components/search/SearchSkeleton'; +import Thumbnail from '@/components/Thumbnail'; interface SearchResultProps { movies: TMDBMovie[]; @@ -31,12 +32,7 @@ export default function SearchResult({ movies, query, loaderRef, hasMore, loadin className=" cursor-pointer bg-[#424242] w-full h-[76px] flex items-center gap-3 pr-2 rounded-xl justify-between" >
- {movie.title} +
{movie.title} Date: Sat, 8 Nov 2025 20:39:25 +0900 Subject: [PATCH 72/82] =?UTF-8?q?[#22]=20fix:=20=EB=AC=B4=ED=95=9C=20?= =?UTF-8?q?=EC=8A=A4=ED=81=AC=EB=A1=A4=20=20=EC=A1=B0=EA=B1=B4=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/search/page.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/search/page.tsx b/app/search/page.tsx index 247dbe1..38a90ea 100644 --- a/app/search/page.tsx +++ b/app/search/page.tsx @@ -51,7 +51,7 @@ export default function Search() { useEffect(() => { const observer = new IntersectionObserver( (entries) => { - if (entries[0].isIntersecting && hasMore) { + if (entries[0].isIntersecting && hasMore && !loading) { loadMovies(); } }, From ceaf143243d85a6494907d171240bb9c3c5a7a05 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Sat, 8 Nov 2025 21:39:17 +0900 Subject: [PATCH 73/82] =?UTF-8?q?fix:=20=ED=99=88,=20=EC=83=81=EC=84=B8?= =?UTF-8?q?=ED=8E=98=EC=9D=B4=EC=A7=80=20=EC=8A=A4=ED=83=80=EC=9D=BC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95,=20skeleton=20=EC=BB=B4=ED=8F=AC=EB=84=8C?= =?UTF-8?q?=ED=8A=B8=20=EC=8A=A4=ED=83=80=EC=9D=BC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/home/page.tsx | 7 ++- app/page.tsx | 2 +- app/title/[id]/page.tsx | 48 +++++++-------- components/Navbar.tsx | 87 ++++++++++++++-------------- components/home/Banner.tsx | 72 +++++++++++------------ components/search/SearchSkeleton.tsx | 17 ++++-- 6 files changed, 118 insertions(+), 115 deletions(-) diff --git a/app/home/page.tsx b/app/home/page.tsx index 28762a2..8f69b14 100644 --- a/app/home/page.tsx +++ b/app/home/page.tsx @@ -15,9 +15,10 @@ import UsTvShow from '@/components/home/section/USTvShow'; import WatchItAgain from '@/components/home/section/WatchItAgain'; export default async function Home() { return ( -
-
-
+
+
+ {/* Headerλ₯Ό λ°°λ„ˆ μœ„μ— 겹치기 */} +
diff --git a/app/page.tsx b/app/page.tsx index c1630c6..543d9e2 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -4,7 +4,7 @@ import LottieLogo from '../components/LottieLogo'; export default function Landing() { return ( -
+
); diff --git a/app/title/[id]/page.tsx b/app/title/[id]/page.tsx index 641ea9e..049e4c4 100644 --- a/app/title/[id]/page.tsx +++ b/app/title/[id]/page.tsx @@ -1,28 +1,27 @@ -"use client"; +'use client'; -import Image from "next/image"; -import { useEffect, useState } from "react"; -import { useSearchParams, useParams } from "next/navigation"; -import { fetchOverview } from "@/lib/api/tdmb/getOverview"; +import Image from 'next/image'; +import { useEffect, useState } from 'react'; +import { useSearchParams, useParams } from 'next/navigation'; +import { fetchOverview } from '@/lib/api/tdmb/getOverview'; -const IMG_BASE = "https://image.tmdb.org/t/p"; +const IMG_BASE = 'https://image.tmdb.org/t/p'; export default function TitlePreviewPage() { const searchParams = useSearchParams(); const params = useParams<{ id: string }>(); - const imgPath = searchParams.get("img") || ""; - const id = params?.id ?? ""; + const imgPath = searchParams.get('img') || ''; + const id = params?.id ?? ''; - const [overview, setOverview] = useState(""); + const [overview, setOverview] = useState(''); const [loading, setLoading] = useState(true); - useEffect(() => { if (!id) return; (async () => { try { - const data = await fetchOverview(id, { language: "en-" }); + const data = await fetchOverview(id, { language: 'en-' }); setOverview(data.overview); } finally { setLoading(false); @@ -30,21 +29,26 @@ export default function TitlePreviewPage() { })(); }, [id]); - const normalized = imgPath.startsWith("/") ? imgPath : `/${imgPath}`; + const normalized = imgPath.startsWith('/') ? imgPath : `/${imgPath}`; const src = `${IMG_BASE}/w780${normalized}`; return ( -
+
{/* 이미지 */} -
+
{/* Play λ²„νŠΌ */} - {/* Previews */} - - Previews - - - {overview} - +
+ Previews + {overview} +
); } diff --git a/components/Navbar.tsx b/components/Navbar.tsx index a787865..3f649ee 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -1,49 +1,46 @@ -"use client"; +'use client'; -import Link from "next/link"; -import { usePathname } from "next/navigation"; - -import HomeIcon from "../public/icons/iconsGen/Home"; -import Search from "../public/icons/iconsGen/Search"; -import ComingSoon from "../public/icons/iconsGen/ComingSoon"; -import Download from "../public/icons/iconsGen/Downloads"; -import Menu from "../public/icons/iconsGen/Menu"; +import Link from 'next/link'; +import { usePathname } from 'next/navigation'; +import HomeIcon from '@/public/icons/iconsGen/Home'; +import Search from '@/public/icons/iconsGen/Search'; +import ComingSoon from '@/public/icons/iconsGen/ComingSoon'; +import Download from '@/public/icons/iconsGen/Downloads'; +import Menu from '@/public/icons/iconsGen/Menu'; export default function Navbar() { - const pathname = usePathname(); - - const getLinkClass = (path: string) => - `flex flex-col items-center text-[8px] ${ - pathname === path ? "text-white" : "text-[#8C8787]" - }`; - - return ( -
- - - Home - - - - - Search - - - - - Coming Soon - - - - - Downloads - - - - - More - -
- ); -} \ No newline at end of file + const pathname = usePathname(); + + const getLinkClass = (path: string) => + `flex flex-col items-center text-[8px] ${pathname === path ? 'text-white' : 'text-[#8C8787]'}`; + + return ( +
+ + + Home + + + + + Search + + + + + Coming Soon + + + + + Downloads + + + + + More + +
+ ); +} diff --git a/components/home/Banner.tsx b/components/home/Banner.tsx index 1ec0ed3..9a629b1 100644 --- a/components/home/Banner.tsx +++ b/components/home/Banner.tsx @@ -1,30 +1,26 @@ -"use client"; +'use client'; -import { useEffect, useMemo, useRef, useState } from "react"; -import Link from "next/link"; -import Image from "next/image"; -import { fetcher } from "@/lib/fetcher"; -import type { tmdbListResponse, tmdbTitle } from "@/types/tmdb"; -import add from "@/public/icons/add.svg"; -import play from "@/public/icons/play.svg"; -import info from "@/public/icons/info.svg"; +import { useEffect, useMemo, useRef, useState } from 'react'; +import Link from 'next/link'; +import Image from 'next/image'; +import { fetcher } from '@/lib/fetcher'; +import type { tmdbListResponse, tmdbTitle } from '@/types/tmdb'; +import add from '@/public/icons/add.svg'; +import play from '@/public/icons/play.svg'; +import info from '@/public/icons/info.svg'; -const imgBase = - process.env.NEXT_PUBLIC_TMDB_IMAGE_BASE || "https://image.tmdb.org/t/p"; +const imgBase = process.env.NEXT_PUBLIC_TMDB_IMAGE_BASE || 'https://image.tmdb.org/t/p'; const rotateTime = 20_000; // 20초 간격 -const regionName = "Korea"; +const regionName = 'Korea'; // URL λ§Œλ“œλŠ” ν•¨μˆ˜ -function buildImageUrl( - path?: string | null, - size: "w780" | "w1280" | "original" = "w1280" -) { - if (!path) return ""; +function buildImageUrl(path?: string | null, size: 'w780' | 'w1280' | 'original' = 'w1280') { + if (!path) return ''; try { - const cleanPath = path.startsWith("/") ? path.slice(1) : path; + const cleanPath = path.startsWith('/') ? path.slice(1) : path; return `${imgBase}/${size}/${cleanPath}`; } catch { - return ""; + return ''; } } @@ -37,10 +33,11 @@ export default function Banner() { useEffect(() => { (async () => { try { - const data = await fetcher>( - "/3/movie/popular", - { language: "ko-KR", region: "KR", page: "1" } - ); + const data = await fetcher>('/3/movie/popular', { + language: 'ko-KR', + region: 'KR', + page: '1', + }); setItems((data.results ?? []).slice(0, 10)); setIndex(0); } catch (e) { @@ -70,40 +67,35 @@ export default function Banner() { }, [items.length]); const current = items[index] ?? null; - const title = current?.title ?? current?.name ?? ""; - const backdropPath = current?.backdrop_path ?? current?.poster_path ?? ""; - const backdrop = useMemo( - () => buildImageUrl(backdropPath, "w1280"), - [backdropPath] - ); + const title = current?.title ?? current?.name ?? ''; + const backdropPath = current?.backdrop_path ?? current?.poster_path ?? ''; + const backdrop = useMemo(() => buildImageUrl(backdropPath, 'w1280'), [backdropPath]); const rank = Math.min(index + 1, 10); // img 쿼리둜 κ²½λ‘œμ „λ‹¬ const previewHref = - current && backdropPath - ? { pathname: `/title/${current.id}`, query: { img: backdropPath } } - : "#"; + current && backdropPath ? { pathname: `/title/${current.id}`, query: { img: backdropPath } } : '#'; return ( -
+
{current && backdrop ? ( {title - {/* 이미지 κ·ΈλΌλ°μ΄μ…˜ */} -
+ {/* 이미지 κ·ΈλΌλ°μ΄μ…˜ +
*/} ) : (
@@ -116,7 +108,9 @@ export default function Banner() { TOP 10 - #{rank} in {regionName} Today + + #{rank} in {regionName} Today +
diff --git a/components/search/SearchSkeleton.tsx b/components/search/SearchSkeleton.tsx index d2ac222..0484ed3 100644 --- a/components/search/SearchSkeleton.tsx +++ b/components/search/SearchSkeleton.tsx @@ -1,10 +1,19 @@ export default function MovieSkeleton({ count = 6 }: { count?: number }) { return ( -
+
{Array.from({ length: count }).map((_, idx) => ( -
- {/* μΉ΄λ“œ μ•ˆμ— 이미지 μ˜μ—­ */} -
+
+ {/* μ™Όμͺ½ 썸넀일 μ˜μ—­ */} +
+ + {/* κ°€μš΄λ° 제λͺ© 자리 */} +
+ + {/* 였λ₯Έμͺ½ μ•„μ΄μ½˜ 자리 */} +
))}
From 3e3d835201d8d81b933f3654fa3f7dd810713202 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Sat, 8 Nov 2025 21:58:14 +0900 Subject: [PATCH 74/82] =?UTF-8?q?fix:=20search=20=EC=8A=A4=ED=83=80?= =?UTF-8?q?=EC=9D=BC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/title/[id]/page.tsx | 2 +- components/search/SearchResult.tsx | 7 +------ 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/app/title/[id]/page.tsx b/app/title/[id]/page.tsx index 049e4c4..de4bab9 100644 --- a/app/title/[id]/page.tsx +++ b/app/title/[id]/page.tsx @@ -38,7 +38,7 @@ export default function TitlePreviewPage() { text-white " > {/* 이미지 */} -
+
diff --git a/components/search/SearchResult.tsx b/components/search/SearchResult.tsx index b8d4696..e94f2f1 100644 --- a/components/search/SearchResult.tsx +++ b/components/search/SearchResult.tsx @@ -35,12 +35,7 @@ export default function SearchResult({ movies, query, loaderRef, hasMore, loadin
{movie.title} - Play Search Icon + Play Search Icon
)) )} From 1a074675f6795faca4276995c5030863badc0e8c Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Sat, 8 Nov 2025 22:07:49 +0900 Subject: [PATCH 75/82] =?UTF-8?q?feat:=20home=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20swipe=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/home/section/ContinueWatching.tsx | 29 +++++++--------- components/home/section/Hollywood.tsx | 21 +++++------- components/home/section/KoreanMovies.tsx | 5 +-- components/home/section/MyList.tsx | 2 +- components/home/section/Mysteries.tsx | 21 +++++------- components/home/section/NetflixOriginals.tsx | 25 ++++++-------- components/home/section/NewReleases.tsx | 21 +++++------- components/home/section/Popular.tsx | 21 +++++------- components/home/section/Previews.tsx | 35 +++++++++----------- components/home/section/Top10.tsx | 24 ++++++-------- components/home/section/TrendingNow.tsx | 21 +++++------- components/home/section/USTvShow.tsx | 21 +++++------- components/home/section/WatchItAgain.tsx | 25 ++++++-------- 13 files changed, 118 insertions(+), 153 deletions(-) diff --git a/components/home/section/ContinueWatching.tsx b/components/home/section/ContinueWatching.tsx index 104c08e..e3f1925 100644 --- a/components/home/section/ContinueWatching.tsx +++ b/components/home/section/ContinueWatching.tsx @@ -1,15 +1,15 @@ -"use client"; +'use client'; -import { useEffect, useState } from "react"; -import { fetchMovieById } from "@/lib/api/tdmb/movie"; -import Image from "next/image"; -import SectionTitle from "@/components/home/section/SectionTitle"; -import { watchHistory } from "@/data/watchHistory"; -import type { TMDBMovie } from "@/lib/api/types/tdmbs"; +import { useEffect, useState } from 'react'; +import { fetchMovieById } from '@/lib/api/tdmb/movie'; +import Image from 'next/image'; +import SectionTitle from '@/components/home/section/SectionTitle'; +import { watchHistory } from '@/data/watchHistory'; +import type { TMDBMovie } from '@/lib/api/types/tdmbs'; import Thumbnail from '@/components/Thumbnail'; // μ‚¬μš©μž 이름 κ°€μ Έμ˜€κΈ° (더미 데이터 κΈ°μ€€) -const userName = watchHistory[0]?.userName || "User"; +const userName = watchHistory[0]?.userName || 'User'; const MOCK_WATCHING_IDS = [550, 299534, 155, 597, 681]; export default function ContinueWatching() { @@ -17,9 +17,7 @@ export default function ContinueWatching() { useEffect(() => { async function loadMovies() { - const data = await Promise.all( - MOCK_WATCHING_IDS.map((id) => fetchMovieById(id)) - ); + const data = await Promise.all(MOCK_WATCHING_IDS.map((id) => fetchMovieById(id))); setMovies(data); } loadMovies(); @@ -29,18 +27,15 @@ export default function ContinueWatching() {
-
+
{movies .filter((movie) => movie.poster_path) .map((movie) => ( -
+
{/* μ§„ν–‰λ₯  ν‘œμ‹œ*/}
-
+
))} diff --git a/components/home/section/Hollywood.tsx b/components/home/section/Hollywood.tsx index fc57bde..fc69fc8 100644 --- a/components/home/section/Hollywood.tsx +++ b/components/home/section/Hollywood.tsx @@ -1,10 +1,10 @@ -"use client"; +'use client'; -import { useEffect, useState } from "react"; -import Image from "next/image"; -import SectionTitle from "@/components/home/section/SectionTitle"; -import { fetchHollywoodMovies } from "@/lib/api/tdmb/combined"; -import type { TMDBMovie, TMDBTvShow } from "@/lib/api/types/tdmbs"; +import { useEffect, useState } from 'react'; +import Image from 'next/image'; +import SectionTitle from '@/components/home/section/SectionTitle'; +import { fetchHollywoodMovies } from '@/lib/api/tdmb/combined'; +import type { TMDBMovie, TMDBTvShow } from '@/lib/api/types/tdmbs'; import Thumbnail from '@/components/Thumbnail'; type CombinedItem = TMDBMovie | TMDBTvShow; @@ -18,7 +18,7 @@ export default function Nollywood() { const movieData = await fetchHollywoodMovies(); setData(movieData); } catch (error) { - console.error("Failed to fetch popular movies:", error); + console.error('Failed to fetch popular movies:', error); } }; @@ -29,15 +29,12 @@ export default function Nollywood() {
-
+
{data .filter((movie) => movie.poster_path) // null μ•„λ‹Œ κ²ƒλ§Œ .slice(0, 5) // 5개만 ν‘œμ‹œ .map((movie) => ( -
+
))} diff --git a/components/home/section/KoreanMovies.tsx b/components/home/section/KoreanMovies.tsx index 921cc84..42b9d4a 100644 --- a/components/home/section/KoreanMovies.tsx +++ b/components/home/section/KoreanMovies.tsx @@ -26,12 +26,13 @@ export default function KoreanMovies() {
-
+ {/* Scroll Snap 적용 */} +
{movies .filter((movie) => movie.poster_path) // null μ•„λ‹Œ κ²ƒλ§Œ .slice(0, 5) // 5개만 ν‘œμ‹œ .map((movie) => ( -
+
))} diff --git a/components/home/section/MyList.tsx b/components/home/section/MyList.tsx index 4071e7c..700c734 100644 --- a/components/home/section/MyList.tsx +++ b/components/home/section/MyList.tsx @@ -28,7 +28,7 @@ export default function MyList() {
-
+
{movies .filter((movie) => movie.poster_path) .map((movie) => ( diff --git a/components/home/section/Mysteries.tsx b/components/home/section/Mysteries.tsx index 66e70b5..ed12dfe 100644 --- a/components/home/section/Mysteries.tsx +++ b/components/home/section/Mysteries.tsx @@ -1,10 +1,10 @@ -"use client"; +'use client'; -import { useEffect, useState } from "react"; -import Image from "next/image"; -import SectionTitle from "@/components/home/section/SectionTitle"; -import { fetchMysteryTv } from "@/lib/api/tdmb/tv"; -import type { TMDBTvShow } from "@/lib/api/types/tdmbs"; +import { useEffect, useState } from 'react'; +import Image from 'next/image'; +import SectionTitle from '@/components/home/section/SectionTitle'; +import { fetchMysteryTv } from '@/lib/api/tdmb/tv'; +import type { TMDBTvShow } from '@/lib/api/types/tdmbs'; import Thumbnail from '@/components/Thumbnail'; export default function TvThrillerMysteries() { @@ -16,7 +16,7 @@ export default function TvThrillerMysteries() { const movieData = await fetchMysteryTv(); setMovies(movieData); } catch (error) { - console.error("Failed to fetch popular movies:", error); + console.error('Failed to fetch popular movies:', error); } }; @@ -27,15 +27,12 @@ export default function TvThrillerMysteries() {
-
+
{movies .filter((movie) => movie.poster_path) // null μ•„λ‹Œ κ²ƒλ§Œ .slice(0, 5) // 5개만 ν‘œμ‹œ .map((movie) => ( -
+
))} diff --git a/components/home/section/NetflixOriginals.tsx b/components/home/section/NetflixOriginals.tsx index 4c7f282..2b81e3a 100644 --- a/components/home/section/NetflixOriginals.tsx +++ b/components/home/section/NetflixOriginals.tsx @@ -1,11 +1,11 @@ -"use client"; +'use client'; -import { useEffect, useState } from "react"; -import Image from "next/image"; -import SectionTitle from "@/components/home/section/SectionTitle"; -import { fetchNetflixOriginals } from "@/lib/api/tdmb/combined"; -import type { TMDBMovie, TMDBTvShow } from "@/lib/api/types/tdmbs"; -import Thumbnail from "@/components/Thumbnail"; +import { useEffect, useState } from 'react'; +import Image from 'next/image'; +import SectionTitle from '@/components/home/section/SectionTitle'; +import { fetchNetflixOriginals } from '@/lib/api/tdmb/combined'; +import type { TMDBMovie, TMDBTvShow } from '@/lib/api/types/tdmbs'; +import Thumbnail from '@/components/Thumbnail'; type CombinedItem = TMDBMovie | TMDBTvShow; @@ -18,7 +18,7 @@ export default function NetflixOriginals() { const data = await fetchNetflixOriginals(); setData(data); } catch (error) { - console.error("Failed to fetch popular movies:", error); + console.error('Failed to fetch popular movies:', error); } }; @@ -29,16 +29,13 @@ export default function NetflixOriginals() {
-
+
{data .filter((movie) => movie.poster_path) // null μ•„λ‹Œ κ²ƒλ§Œ .slice(0, 5) // 5개만 ν‘œμ‹œ .map((movie) => ( -
- +
+
))}
diff --git a/components/home/section/NewReleases.tsx b/components/home/section/NewReleases.tsx index 37983ca..f1b437d 100644 --- a/components/home/section/NewReleases.tsx +++ b/components/home/section/NewReleases.tsx @@ -1,10 +1,10 @@ -"use client"; +'use client'; -import { useEffect, useState } from "react"; -import Image from "next/image"; -import SectionTitle from "@/components/home/section/SectionTitle"; -import { fetchNewReleases } from "@/lib/api/tdmb/movie"; -import type { TMDBMovie } from "@/lib/api/types/tdmbs"; +import { useEffect, useState } from 'react'; +import Image from 'next/image'; +import SectionTitle from '@/components/home/section/SectionTitle'; +import { fetchNewReleases } from '@/lib/api/tdmb/movie'; +import type { TMDBMovie } from '@/lib/api/types/tdmbs'; import Thumbnail from '@/components/Thumbnail'; export default function NewReleases() { @@ -16,7 +16,7 @@ export default function NewReleases() { const movieData = await fetchNewReleases(); setMovies(movieData); } catch (error) { - console.error("Failed to fetch popular movies:", error); + console.error('Failed to fetch popular movies:', error); } }; @@ -27,15 +27,12 @@ export default function NewReleases() {
-
+
{movies .filter((movie) => movie.poster_path) // null μ•„λ‹Œ κ²ƒλ§Œ .slice(0, 5) // 5개만 ν‘œμ‹œ .map((movie) => ( -
+
))} diff --git a/components/home/section/Popular.tsx b/components/home/section/Popular.tsx index 7946760..04d035b 100644 --- a/components/home/section/Popular.tsx +++ b/components/home/section/Popular.tsx @@ -1,10 +1,10 @@ -"use client"; +'use client'; -import { useEffect, useState } from "react"; -import Image from "next/image"; -import SectionTitle from "@/components/home/section/SectionTitle"; -import { fetchPopularMovies } from "@/lib/api/tdmb/movie"; -import type { TMDBMovie } from "@/lib/api/types/tdmbs"; +import { useEffect, useState } from 'react'; +import Image from 'next/image'; +import SectionTitle from '@/components/home/section/SectionTitle'; +import { fetchPopularMovies } from '@/lib/api/tdmb/movie'; +import type { TMDBMovie } from '@/lib/api/types/tdmbs'; import Thumbnail from '@/components/Thumbnail'; export default function Popular() { @@ -16,7 +16,7 @@ export default function Popular() { const movieData = await fetchPopularMovies(); setMovies(movieData); } catch (error) { - console.error("Failed to fetch popular movies:", error); + console.error('Failed to fetch popular movies:', error); } }; @@ -27,15 +27,12 @@ export default function Popular() {
-
+
{movies .filter((movie) => movie.poster_path) // null μ•„λ‹Œ κ²ƒλ§Œ .slice(0, 5) // 5개만 ν‘œμ‹œ .map((movie) => ( -
+
))} diff --git a/components/home/section/Previews.tsx b/components/home/section/Previews.tsx index fd3d689..615e2c3 100644 --- a/components/home/section/Previews.tsx +++ b/components/home/section/Previews.tsx @@ -1,11 +1,11 @@ -"use client"; +'use client'; -import { useEffect, useState } from "react"; -import Link from "next/link"; -import { fetcher } from "@/lib/fetcher"; -import type { tmdbListResponse, tmdbTitle } from "@/types/tmdb"; +import { useEffect, useState } from 'react'; +import Link from 'next/link'; +import { fetcher } from '@/lib/fetcher'; +import type { tmdbListResponse, tmdbTitle } from '@/types/tmdb'; -const IMG_BASE = process.env.NEXT_PUBLIC_TMDB_IMAGE_BASE || "https://image.tmdb.org/t/p"; +const IMG_BASE = process.env.NEXT_PUBLIC_TMDB_IMAGE_BASE || 'https://image.tmdb.org/t/p'; type Row = { id: number; poster_path: string }; @@ -13,17 +13,16 @@ export default function Previews() { const [items, setItems] = useState([]); useEffect(() => { - fetcher>("/3/movie/now_playing", { - language: "ko-KR", - page: "1", - region: "KR", + fetcher>('/3/movie/now_playing', { + language: 'ko-KR', + page: '1', + region: 'KR', }) .then((data) => { - const rows = - (data.results ?? []) - .filter((t) => !!t.poster_path && !!t.id) - .slice(0, 10) //10개만 (μž„μ˜) - .map((t) => ({ id: t.id!, poster_path: t.poster_path! })); + const rows = (data.results ?? []) + .filter((t) => !!t.poster_path && !!t.id) + .slice(0, 10) //10개만 (μž„μ˜) + .map((t) => ({ id: t.id!, poster_path: t.poster_path! })); setItems(rows); }) .catch(console.error); @@ -33,11 +32,9 @@ export default function Previews() {
Previews -
+
{items.map((item) => { - const pathOnly = item.poster_path.startsWith("/") - ? item.poster_path - : `/${item.poster_path}`; + const pathOnly = item.poster_path.startsWith('/') ? item.poster_path : `/${item.poster_path}`; //쿼리에 path전달 const thumbUrl = `${IMG_BASE}/w342${pathOnly}`; diff --git a/components/home/section/Top10.tsx b/components/home/section/Top10.tsx index be518ab..6d5baa9 100644 --- a/components/home/section/Top10.tsx +++ b/components/home/section/Top10.tsx @@ -1,11 +1,11 @@ -"use client"; +'use client'; -import { useEffect, useState } from "react"; -import Image from "next/image"; -import SectionTitle from "@/components/home/section/SectionTitle"; -import { fetchTop10Movies } from "@/lib/api/tdmb/movie"; -import type { TMDBMovie } from "@/lib/api/types/tdmbs"; -import Thumbnail from "@/components/Thumbnail" +import { useEffect, useState } from 'react'; +import Image from 'next/image'; +import SectionTitle from '@/components/home/section/SectionTitle'; +import { fetchTop10Movies } from '@/lib/api/tdmb/movie'; +import type { TMDBMovie } from '@/lib/api/types/tdmbs'; +import Thumbnail from '@/components/Thumbnail'; export default function Top10() { const [movies, setMovies] = useState([]); @@ -16,7 +16,7 @@ export default function Top10() { const movieData = await fetchTop10Movies(); setMovies(movieData); } catch (error) { - console.error("Failed to fetch popular movies:", error); + console.error('Failed to fetch popular movies:', error); } }; @@ -27,18 +27,16 @@ export default function Top10() {
-
+
{movies .filter((movie) => movie.poster_path || movie.backdrop_path) .slice(0, 10) .map((movie) => ( -
+
))}
); -} \ No newline at end of file +} diff --git a/components/home/section/TrendingNow.tsx b/components/home/section/TrendingNow.tsx index 33c8a8a..4deb0fe 100644 --- a/components/home/section/TrendingNow.tsx +++ b/components/home/section/TrendingNow.tsx @@ -1,10 +1,10 @@ -"use client"; +'use client'; -import { useEffect, useState } from "react"; -import Image from "next/image"; -import SectionTitle from "@/components/home/section/SectionTitle"; -import { fetchTrendingMovies } from "@/lib/api/tdmb/movie"; -import type { TMDBMovie } from "@/lib/api/types/tdmbs"; +import { useEffect, useState } from 'react'; +import Image from 'next/image'; +import SectionTitle from '@/components/home/section/SectionTitle'; +import { fetchTrendingMovies } from '@/lib/api/tdmb/movie'; +import type { TMDBMovie } from '@/lib/api/types/tdmbs'; import Thumbnail from '@/components/Thumbnail'; export default function TrendingNow() { @@ -16,7 +16,7 @@ export default function TrendingNow() { const movieData = await fetchTrendingMovies(); setMovies(movieData); } catch (error) { - console.error("Failed to fetch popular movies:", error); + console.error('Failed to fetch popular movies:', error); } }; @@ -27,15 +27,12 @@ export default function TrendingNow() {
-
+
{movies .filter((movie) => movie.poster_path) // null μ•„λ‹Œ κ²ƒλ§Œ .slice(0, 5) // 5개만 ν‘œμ‹œ .map((movie) => ( -
+
))} diff --git a/components/home/section/USTvShow.tsx b/components/home/section/USTvShow.tsx index d424432..c56b022 100644 --- a/components/home/section/USTvShow.tsx +++ b/components/home/section/USTvShow.tsx @@ -1,10 +1,10 @@ -"use client"; +'use client'; -import { useEffect, useState } from "react"; -import Image from "next/image"; -import SectionTitle from "@/components/home/section/SectionTitle"; -import { fetchUSTVShows } from "@/lib/api/tdmb/tv"; -import type { TMDBTvShow } from "@/lib/api/types/tdmbs"; +import { useEffect, useState } from 'react'; +import Image from 'next/image'; +import SectionTitle from '@/components/home/section/SectionTitle'; +import { fetchUSTVShows } from '@/lib/api/tdmb/tv'; +import type { TMDBTvShow } from '@/lib/api/types/tdmbs'; import Thumbnail from '@/components/Thumbnail'; export default function UsTvShow() { @@ -16,7 +16,7 @@ export default function UsTvShow() { const movieData = await fetchUSTVShows(); setMovies(movieData); } catch (error) { - console.error("Failed to fetch popular movies:", error); + console.error('Failed to fetch popular movies:', error); } }; @@ -27,15 +27,12 @@ export default function UsTvShow() {
-
+
{movies .filter((movie) => movie.poster_path) // null μ•„λ‹Œ κ²ƒλ§Œ .slice(0, 5) // 5개만 ν‘œμ‹œ .map((movie) => ( -
+
))} diff --git a/components/home/section/WatchItAgain.tsx b/components/home/section/WatchItAgain.tsx index f3fa981..4edf33f 100644 --- a/components/home/section/WatchItAgain.tsx +++ b/components/home/section/WatchItAgain.tsx @@ -1,11 +1,11 @@ -"use client"; +'use client'; -import { useEffect, useState } from "react"; -import { fetchMovieById } from "@/lib/api/tdmb/movie"; -import Image from "next/image"; -import SectionTitle from "@/components/home/section/SectionTitle"; -import { watchHistory } from "@/data/watchHistory"; -import type { TMDBMovie } from "@/lib/api/types/tdmbs"; +import { useEffect, useState } from 'react'; +import { fetchMovieById } from '@/lib/api/tdmb/movie'; +import Image from 'next/image'; +import SectionTitle from '@/components/home/section/SectionTitle'; +import { watchHistory } from '@/data/watchHistory'; +import type { TMDBMovie } from '@/lib/api/types/tdmbs'; import Thumbnail from '@/components/Thumbnail'; export default function WatchItAgain() { @@ -13,9 +13,7 @@ export default function WatchItAgain() { useEffect(() => { async function loadMovies() { - const data = await Promise.all( - watchHistory.map((item) => fetchMovieById(item.contentId)) - ); + const data = await Promise.all(watchHistory.map((item) => fetchMovieById(item.contentId))); setMovies(data); } loadMovies(); @@ -25,14 +23,11 @@ export default function WatchItAgain() {
-
+
{movies .filter((movie) => movie.poster_path) .map((movie) => ( -
+
))} From 27892d40b0782106e94f710b2691d8ab9990aebc Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Sat, 8 Nov 2025 22:12:18 +0900 Subject: [PATCH 76/82] =?UTF-8?q?fix:=20search=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20movie=20id=20=EC=A4=91=EB=B3=B5=20=EB=AC=B8?= =?UTF-8?q?=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/search/SearchResult.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/search/SearchResult.tsx b/components/search/SearchResult.tsx index e94f2f1..8154b40 100644 --- a/components/search/SearchResult.tsx +++ b/components/search/SearchResult.tsx @@ -26,9 +26,9 @@ export default function SearchResult({ movies, query, loaderRef, hasMore, loadin ) : movies.length === 0 ? (
검색 κ²°κ³Όκ°€ μ—†μŠ΅λ‹ˆλ‹€. 😒
) : ( - movies.map((movie) => ( + movies.map((movie, idx) => (
From 895c06dd3d8278c20059db7fa7e6c847d646cc21 Mon Sep 17 00:00:00 2001 From: baekseungsun Date: Sun, 9 Nov 2025 00:01:09 +0900 Subject: [PATCH 77/82] =?UTF-8?q?refactor:=20searchResult=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=97=90=EC=84=9C=20Preview=20Page=20?= =?UTF-8?q?=EB=9D=BC=EC=9A=B0=ED=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/search/SearchResult.tsx | 80 ++++++++++++++---------------- 1 file changed, 36 insertions(+), 44 deletions(-) diff --git a/components/search/SearchResult.tsx b/components/search/SearchResult.tsx index 8154b40..674e9cf 100644 --- a/components/search/SearchResult.tsx +++ b/components/search/SearchResult.tsx @@ -1,48 +1,40 @@ -import Image from 'next/image'; -import type { TMDBMovie } from '@/lib/api/types/tdmbs'; -import { RefObject } from 'react'; -import MovieSkeleton from '@/components/search/SearchSkeleton'; -import Thumbnail from '@/components/Thumbnail'; +import Link from "next/link"; +import Image from "next/image"; +import type { TMDBMovie } from "@/lib/api/types/tdmbs"; +import { RefObject } from "react"; +import MovieSkeleton from "@/components/search/SearchSkeleton"; -interface SearchResultProps { - movies: TMDBMovie[]; - query: string; - loaderRef: RefObject; // loader ref μΆ”κ°€ - hasMore: boolean; // 더 뢈러올 μ˜ν™”κ°€ μžˆλŠ”μ§€ - loading: boolean; -} - -export default function SearchResult({ movies, query, loaderRef, hasMore, loading }: SearchResultProps) { - const state = query ? `Results for "${query}"` : 'Top Searches'; +const IMG_BASE = "https://image.tmdb.org/t/p"; - if (!movies || movies.length === 0) { - return
검색 κ²°κ³Όκ°€ μ—†μŠ΅λ‹ˆλ‹€. 😒
; - } - return ( -
- {state} - {loading ? ( - - ) : movies.length === 0 ? ( -
검색 κ²°κ³Όκ°€ μ—†μŠ΅λ‹ˆλ‹€. 😒
- ) : ( - movies.map((movie, idx) => ( -
-
- +export default function SearchResult({ movies, query, loaderRef, hasMore, loading }: +{ movies: TMDBMovie[]; query: string; loaderRef: RefObject; + hasMore: boolean; loading: boolean; }) { + const state = query ? `Results for "${query}"` : "Top Searches"; + if (!movies?.length) return
검색 κ²°κ³Όκ°€ μ—†μŠ΅λ‹ˆλ‹€. 😒
; + return ( +
+ {state} + {loading ? : movies.map(m => { + const path = m.poster_path || m.backdrop_path || ""; + const src = path ? `${IMG_BASE}/w500${path}` : "/placeholder-portrait.png"; + return ( + +
+ +
+ {m.title} + + + ); + })} +
+ {hasMore ? "λ‘œλ”© μ€‘μž…λ‹ˆλ‹€." : "더 이상 쑰회된 μ˜ν™”κ°€ μ—†μŠ΅λ‹ˆλ‹€."}
- {movie.title} - Play Search Icon -
- )) - )} - {/* λ¬΄ν•œ 슀크둀 감지 div */} -
- {hasMore ? 'λ‘œλ”© μ€‘μž…λ‹ˆλ‹€.' : '더 이상 쑰회된 μ˜ν™”κ°€ μ—†μŠ΅λ‹ˆλ‹€.'} -
-
- ); +
+ ); } From 0d5ab154c67413fb1c7d2aea6bda9b454a84b624 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Sun, 9 Nov 2025 19:23:54 +0900 Subject: [PATCH 78/82] =?UTF-8?q?fix:=20=EB=AC=B4=ED=95=9C=20=EC=8A=A4?= =?UTF-8?q?=ED=81=AC=EB=A1=A4=20=EC=98=A4=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- next.config.ts | 9 ++++----- public/placeholder-portrait.png | Bin 0 -> 13490 bytes 2 files changed, 4 insertions(+), 5 deletions(-) create mode 100644 public/placeholder-portrait.png diff --git a/next.config.ts b/next.config.ts index 225468c..5b8ee29 100644 --- a/next.config.ts +++ b/next.config.ts @@ -1,17 +1,16 @@ -import type { NextConfig } from "next"; +import type { NextConfig } from 'next'; const nextConfig: NextConfig = { images: { - domains: ["image.tmdb.org"], + domains: ['image.tmdb.org'], }, }; -module.exports = { images: { domains: ["image.tmdb.org"] } } - +module.exports = { images: { domains: ['image.tmdb.org'] } }; // next.config.js module.exports = { images: { - domains: ["image.tmdb.org"], + domains: ['cdn.automedi.co.kr', 'image.tmdb.org'], }, }; diff --git a/public/placeholder-portrait.png b/public/placeholder-portrait.png new file mode 100644 index 0000000000000000000000000000000000000000..864eac0b18641ccbfa8a085f2c6c9f761cba6853 GIT binary patch literal 13490 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 Date: Sun, 9 Nov 2025 20:28:39 +0900 Subject: [PATCH 79/82] =?UTF-8?q?fix:=20=EB=AC=B4=ED=95=9C=20=EC=8A=A4?= =?UTF-8?q?=ED=81=AC=EB=A1=A4=20=EC=98=A4=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/search/page.tsx | 23 ++++---- components/search/SearchResult.tsx | 87 +++++++++++++++++------------- lib/api/tdmb/movie.ts | 2 + 3 files changed, 66 insertions(+), 46 deletions(-) diff --git a/app/search/page.tsx b/app/search/page.tsx index 38a90ea..b488472 100644 --- a/app/search/page.tsx +++ b/app/search/page.tsx @@ -27,10 +27,13 @@ export default function Search() { } if (isNewSearch) { - setMovies(data); + setMovies(data.slice(0, 10)); // μƒˆλ‘œμš΄ 검색 μ‹œ 처음 10개만 보여주기 setPage(2); } else { - setMovies((prev) => [...prev, ...data]); + setMovies((prev) => { + const merged = [...prev, ...data.slice(0, 10)]; // λ‹€μŒ νŽ˜μ΄μ§€μ—μ„œ 10개만 μΆ”κ°€ + return Array.from(new Map(merged.map((m) => [m.id, m])).values()); + }); setPage((prev) => prev + 1); } @@ -47,23 +50,23 @@ export default function Search() { loadMovies(true); }, [query]); - // λ¬΄ν•œ 슀크둀 Intersection Observer useEffect(() => { + if (!loaderRef.current) return; + const observer = new IntersectionObserver( (entries) => { - if (entries[0].isIntersecting && hasMore && !loading) { + const entry = entries[0]; + if (entry.isIntersecting && hasMore && !loading) { loadMovies(); } }, - { root: null, rootMargin: '0px', threshold: 1.0 }, + { root: null, rootMargin: '200px', threshold: 0.1 }, ); - if (loaderRef.current) observer.observe(loaderRef.current); + observer.observe(loaderRef.current); - return () => { - if (loaderRef.current) observer.unobserve(loaderRef.current); - }; - }, [loading, loaderRef, hasMore, query, page]); + return () => observer.disconnect(); + }, [hasMore, loading, query]); return (
diff --git a/components/search/SearchResult.tsx b/components/search/SearchResult.tsx index 674e9cf..954c01a 100644 --- a/components/search/SearchResult.tsx +++ b/components/search/SearchResult.tsx @@ -1,40 +1,55 @@ -import Link from "next/link"; -import Image from "next/image"; -import type { TMDBMovie } from "@/lib/api/types/tdmbs"; -import { RefObject } from "react"; -import MovieSkeleton from "@/components/search/SearchSkeleton"; +import Link from 'next/link'; +import Image from 'next/image'; +import type { TMDBMovie } from '@/lib/api/types/tdmbs'; +import { RefObject } from 'react'; +import MovieSkeleton from '@/components/search/SearchSkeleton'; -const IMG_BASE = "https://image.tmdb.org/t/p"; +const IMG_BASE = 'https://image.tmdb.org/t/p'; -export default function SearchResult({ movies, query, loaderRef, hasMore, loading }: -{ movies: TMDBMovie[]; query: string; loaderRef: RefObject; - hasMore: boolean; loading: boolean; }) { - const state = query ? `Results for "${query}"` : "Top Searches"; - if (!movies?.length) return
검색 κ²°κ³Όκ°€ μ—†μŠ΅λ‹ˆλ‹€. 😒
; - return ( -
- {state} - {loading ? : movies.map(m => { - const path = m.poster_path || m.backdrop_path || ""; - const src = path ? `${IMG_BASE}/w500${path}` : "/placeholder-portrait.png"; - return ( - 검색 κ²°κ³Όκ°€ μ—†μŠ΅λ‹ˆλ‹€. 😒
; + return ( +
+ {state} + {loading ? ( + + ) : ( + movies.map((m) => { + const path = m.poster_path || m.backdrop_path || ''; + const src = path ? `${IMG_BASE}/w500${path}` : '/placeholder-portrait.png'; + return ( + -
- -
- {m.title} - - - ); - })} -
- {hasMore ? "λ‘œλ”© μ€‘μž…λ‹ˆλ‹€." : "더 이상 쑰회된 μ˜ν™”κ°€ μ—†μŠ΅λ‹ˆλ‹€."} -
-
- ); + > +
+ +
+ {m.title} + + + ); + }) + )} +
+ {hasMore ? 'λ‘œλ”© μ€‘μž…λ‹ˆλ‹€.' : '더 이상 쑰회된 μ˜ν™”κ°€ μ—†μŠ΅λ‹ˆλ‹€.'} +
+
+ ); } diff --git a/lib/api/tdmb/movie.ts b/lib/api/tdmb/movie.ts index db0cf2d..97d4e9f 100644 --- a/lib/api/tdmb/movie.ts +++ b/lib/api/tdmb/movie.ts @@ -8,6 +8,7 @@ export async function fetchSearchMovie( query = '', page = 1, include_adult = false, + limit = 10, ): Promise { try { const res = await axios.get>(`${BASE_URL}/search/movie`, { @@ -17,6 +18,7 @@ export async function fetchSearchMovie( query, page, include_adult, + limit, }, }); const moviesWithImage = res.data.results.filter((movie) => movie.poster_path !== null); From 2ef43dfb8218d6ff2d79d0c938ffc7463a444fe6 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Wed, 12 Nov 2025 16:25:23 +0900 Subject: [PATCH 80/82] =?UTF-8?q?style:=20navbar=20=EC=8A=A4=ED=83=80?= =?UTF-8?q?=EC=9D=BC=20=EC=98=A4=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/comingSoon/page.tsx | 6 +++--- app/downloads/page.tsx | 6 ++++-- app/home/page.tsx | 38 ++++++++++++++++++-------------------- app/layout.tsx | 9 +++++---- app/more/page.tsx | 6 ++++-- app/search/page.tsx | 4 ++-- components/Navbar.tsx | 2 +- components/Spinner.tsx | 3 +++ 8 files changed, 40 insertions(+), 34 deletions(-) create mode 100644 components/Spinner.tsx diff --git a/app/comingSoon/page.tsx b/app/comingSoon/page.tsx index 59ea6a7..4ea1d59 100644 --- a/app/comingSoon/page.tsx +++ b/app/comingSoon/page.tsx @@ -1,9 +1,9 @@ -"use client"; +import Spinner from '@/components/Spinner'; export default function ComingSoon() { return ( -
-
+
+
); } diff --git a/app/downloads/page.tsx b/app/downloads/page.tsx index 7958dbf..e82e23d 100644 --- a/app/downloads/page.tsx +++ b/app/downloads/page.tsx @@ -1,7 +1,9 @@ +import Spinner from '@/components/Spinner'; + export default function Downloads() { return ( -
-
+
+
); } diff --git a/app/home/page.tsx b/app/home/page.tsx index 8f69b14..fd15a76 100644 --- a/app/home/page.tsx +++ b/app/home/page.tsx @@ -15,27 +15,25 @@ import UsTvShow from '@/components/home/section/USTvShow'; import WatchItAgain from '@/components/home/section/WatchItAgain'; export default async function Home() { return ( -
-
- {/* Headerλ₯Ό λ°°λ„ˆ μœ„μ— 겹치기 */} -
- -
- - - - - - - - - - - - - - +
+ {/* Headerλ₯Ό λ°°λ„ˆ μœ„μ— 겹치기 */} +
+
+ + + + + + + + + + + + + +
); } diff --git a/app/layout.tsx b/app/layout.tsx index 7190ad2..c59ccec 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,4 +1,3 @@ - import type { Metadata } from 'next'; import { Geist, Geist_Mono } from 'next/font/google'; import './globals.css'; @@ -33,9 +32,11 @@ export default function RootLayout({ - {children} - - +
+ {children} + + +
); diff --git a/app/more/page.tsx b/app/more/page.tsx index d642eeb..82dd16e 100644 --- a/app/more/page.tsx +++ b/app/more/page.tsx @@ -1,7 +1,9 @@ +import Spinner from '@/components/Spinner'; + export default function More() { return ( -
-
+
+
); } diff --git a/app/search/page.tsx b/app/search/page.tsx index b488472..1fec8b6 100644 --- a/app/search/page.tsx +++ b/app/search/page.tsx @@ -69,7 +69,7 @@ export default function Search() { }, [hasMore, loading, query]); return ( -
+ <> {/* 상단 κ³ μ • 검색창 + Top search */}
@@ -80,6 +80,6 @@ export default function Search() { {/* mt-[104px] = fixed 헀더(SearchSection + Top search) λ†’μ΄λ§ŒνΌ */}
-
+ ); } diff --git a/components/Navbar.tsx b/components/Navbar.tsx index 3f649ee..61453a3 100644 --- a/components/Navbar.tsx +++ b/components/Navbar.tsx @@ -16,7 +16,7 @@ export default function Navbar() { `flex flex-col items-center text-[8px] ${pathname === path ? 'text-white' : 'text-[#8C8787]'}`; return ( -
+
Home diff --git a/components/Spinner.tsx b/components/Spinner.tsx new file mode 100644 index 0000000..08a9b23 --- /dev/null +++ b/components/Spinner.tsx @@ -0,0 +1,3 @@ +export default function Spinner() { + return
; +} From 1a9cf84916007190d4a8f65d36476f8af62ce8f9 Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Wed, 12 Nov 2025 16:50:18 +0900 Subject: [PATCH 81/82] =?UTF-8?q?refact:=20search=20=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=A7=80=20debounce=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/layout.tsx | 8 +++----- app/search/page.tsx | 14 ++++++++++++-- components/search/SearchResult.tsx | 2 +- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/app/layout.tsx b/app/layout.tsx index c59ccec..bdd528a 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -32,11 +32,9 @@ export default function RootLayout({ -
- {children} - - -
+
{children}
+ + ); diff --git a/app/search/page.tsx b/app/search/page.tsx index 1fec8b6..0090f6d 100644 --- a/app/search/page.tsx +++ b/app/search/page.tsx @@ -7,6 +7,7 @@ import { useEffect, useRef, useState } from 'react'; export default function Search() { const [query, setQuery] = useState(''); + const [debouncedQuery, setDebouncedQuery] = useState(query); const [movies, setMovies] = useState([]); const [page, setPage] = useState(1); @@ -45,11 +46,20 @@ export default function Search() { } }; - // 검색어 λ³€κ²½ μ‹œ μ΄ˆκΈ°ν™” + // queryκ°€ λ°”λ€” λ•Œ debounce 적용 useEffect(() => { - loadMovies(true); + const timer = setTimeout(() => { + setDebouncedQuery(query); + }, 300); // 300ms λŒ€κΈ° + + return () => clearTimeout(timer); // 이전 타이머 제거 }, [query]); + //μ‹€μ œ 검색 μ‹€ν–‰ + useEffect(() => { + loadMovies(true); + }, [debouncedQuery]); + useEffect(() => { if (!loaderRef.current) return; diff --git a/components/search/SearchResult.tsx b/components/search/SearchResult.tsx index 954c01a..97253f8 100644 --- a/components/search/SearchResult.tsx +++ b/components/search/SearchResult.tsx @@ -25,7 +25,7 @@ export default function SearchResult({
{state} {loading ? ( - + ) : ( movies.map((m) => { const path = m.poster_path || m.backdrop_path || ''; From 62ee8756add4de1ae7ce5f0a12b154c57122d45a Mon Sep 17 00:00:00 2001 From: sungahChooo <170587664+sungahChooo@users.noreply.github.com> Date: Wed, 12 Nov 2025 17:04:23 +0900 Subject: [PATCH 82/82] =?UTF-8?q?style:=20layout,=20search=20page=20?= =?UTF-8?q?=EC=8A=A4=ED=83=80=EC=9D=BC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 43 ++++++++++++++++++++++++++++++++++++++++--- app/layout.tsx | 10 +++++++--- app/search/page.tsx | 2 +- 3 files changed, 48 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 548b1a3..e0fb980 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,40 @@ -# Team DiggIndie -λ°±μŠΉμ„  -μ‘°μ„±μ•„ +## μ†Œκ°œ + +next.js ν”„λ ˆμž„μ›Œν¬ 기반의 λ„·ν”Œλ¦­μŠ€ 클둠 μ½”λ”© ν”„λ‘œμ νŠΈ + +## 배포링크 + +https://next-netflix-22nd.vercel.app/ + +## UX ν–₯상을 μœ„ν•œ λ…Έλ ₯ + +- search νŽ˜μ΄μ§€ skeleton 적용 +- λ¬΄ν•œ 슀크둀, debounce 적용으둜 λΆˆν•„μš”ν•œ API 호좜 λ°©μ§€ + +## Team DiggIndie + +- λ°±μŠΉμ„  +- μ‘°μ„±μ•„ + +## 폴더 ꡬ쑰 + +``` +app + ┣ comingSoon + ┃ β”— page.tsx + ┣ downloads + ┃ β”— page.tsx + ┣ home + ┃ β”— page.tsx + ┣ more + ┃ β”— page.tsx + ┣ search + ┃ β”— page.tsx + ┣ title + ┃ β”— [id] + ┃ ┃ β”— page.tsx + ┣ font.css + ┣ globals.css + ┣ layout.tsx + β”— page.tsx +``` diff --git a/app/layout.tsx b/app/layout.tsx index bdd528a..4a36ebf 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -32,9 +32,13 @@ export default function RootLayout({ -
{children}
- - +
+
{children}
{/* ν•˜λ‹¨ UI λ†’μ΄λ§ŒνΌ νŒ¨λ”© */} +
+ + +
+
); diff --git a/app/search/page.tsx b/app/search/page.tsx index 0090f6d..f2b9585 100644 --- a/app/search/page.tsx +++ b/app/search/page.tsx @@ -86,7 +86,7 @@ export default function Search() {
{/* 검색결과 λͺ©λ‘ */} -
+
{/* mt-[104px] = fixed 헀더(SearchSection + Top search) λ†’μ΄λ§ŒνΌ */}