diff --git a/apps/docs/.gitignore b/apps/docs/.gitignore deleted file mode 100644 index 1437c53..0000000 --- a/apps/docs/.gitignore +++ /dev/null @@ -1,34 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# next.js -/.next/ -/out/ - -# production -/build - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# local env files -.env.local -.env.development.local -.env.test.local -.env.production.local - -# vercel -.vercel diff --git a/apps/docs/README.md b/apps/docs/README.md deleted file mode 100644 index 04c1d97..0000000 --- a/apps/docs/README.md +++ /dev/null @@ -1,28 +0,0 @@ -## Getting Started - -First, run the development server: - -```bash -yarn dev -``` - -Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. - -You can start editing the page by modifying `src/app/page.tsx`. The page auto-updates as you edit the file. - -To create [API routes](https://nextjs.org/docs/app/building-your-application/routing/router-handlers) add an `api/` directory to the `app/` directory with a `route.ts` file. For individual endpoints, create a subfolder in the `api` directory, like `api/hello/route.ts` would map to [http://localhost:3000/api/hello](http://localhost:3000/api/hello). - -## 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/foundations/about-nextjs) - 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_source=github.com&utm_medium=referral&utm_campaign=turborepo-readme) from the creators of Next.js. - -Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details. diff --git a/apps/docs/app/favicon.ico b/apps/docs/app/favicon.ico deleted file mode 100644 index 3f804c0..0000000 Binary files a/apps/docs/app/favicon.ico and /dev/null differ diff --git a/apps/docs/app/globals.css b/apps/docs/app/globals.css deleted file mode 100644 index fd85386..0000000 --- a/apps/docs/app/globals.css +++ /dev/null @@ -1,26 +0,0 @@ -@import "tailwindcss"; -@import "@repo/tailwind-config"; - -:root { - --foreground-rgb: 0, 0, 0; - --background-start-rgb: 214, 219, 220; - --background-end-rgb: 255, 255, 255; -} - -@media (prefers-color-scheme: dark) { - :root { - --foreground-rgb: 255, 255, 255; - --background-start-rgb: 0, 0, 0; - --background-end-rgb: 0, 0, 0; - } -} - -body { - color: rgb(var(--foreground-rgb)); - background: linear-gradient( - to bottom, - transparent, - rgb(var(--background-end-rgb)) - ) - rgb(var(--background-start-rgb)); -} diff --git a/apps/docs/app/layout.tsx b/apps/docs/app/layout.tsx deleted file mode 100644 index 5912a62..0000000 --- a/apps/docs/app/layout.tsx +++ /dev/null @@ -1,23 +0,0 @@ -import "@repo/ui/styles.css"; -import "./globals.css"; -import type { Metadata } from "next"; -import { Geist } from "next/font/google"; - -const geist = Geist({ subsets: ["latin"] }); - -export const metadata: Metadata = { - title: "Create Turborepo", - description: "Generated by create turbo", -}; - -export default function RootLayout({ - children, -}: { - children: React.ReactNode; -}) { - return ( - - {children} - - ); -} diff --git a/apps/docs/app/page.tsx b/apps/docs/app/page.tsx deleted file mode 100644 index 213a94b..0000000 --- a/apps/docs/app/page.tsx +++ /dev/null @@ -1,116 +0,0 @@ -import Image from "next/image"; -import { Card } from "@repo/ui/card"; -import { Gradient } from "@repo/ui/gradient"; -import { TurborepoLogo } from "@repo/ui/turborepo-logo"; - -const LINKS = [ - { - title: "Docs", - href: "https://turborepo.com/docs", - description: "Find in-depth information about Turborepo features and API.", - }, - { - title: "Learn", - href: "https://turborepo.com/docs/handbook", - description: "Learn more about monorepos with our handbook.", - }, - { - title: "Templates", - href: "https://turborepo.com/docs/getting-started/from-example", - description: "Choose from over 15 examples and deploy with a single click.", - }, - { - title: "Deploy", - href: "https://vercel.com/new", - description: - "Instantly deploy your Turborepo to a shareable URL with Vercel.", - }, -]; - -export default function Page() { - return ( -
-
-

- examples/with-tailwind -  - docs -

-
- - By{" "} - Vercel Logo - -
-
- -
-
-
-
- Turborepo -
-
- -
- -
- -
-
- -
- - Turborepo logo - - - - - - - - - - -
-
-
- -
- {LINKS.map(({ title, href, description }) => ( - - {description} - - ))} -
-
- ); -} diff --git a/apps/docs/eslint.config.js b/apps/docs/eslint.config.js deleted file mode 100644 index e8759ff..0000000 --- a/apps/docs/eslint.config.js +++ /dev/null @@ -1,4 +0,0 @@ -import { nextJsConfig } from "@repo/eslint-config/next-js"; - -/** @type {import("eslint").Linter.Config} */ -export default nextJsConfig; diff --git a/apps/docs/next-env.d.ts b/apps/docs/next-env.d.ts deleted file mode 100644 index 1b3be08..0000000 --- a/apps/docs/next-env.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -/// -/// - -// NOTE: This file should not be edited -// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/apps/docs/next.config.ts b/apps/docs/next.config.ts deleted file mode 100644 index 5cb563c..0000000 --- a/apps/docs/next.config.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { NextConfig } from "next"; - -const nextConfig: NextConfig = { - typescript: { - ignoreBuildErrors: true, - }, - eslint: { - ignoreDuringBuilds: true, - }, -}; - -export default nextConfig; diff --git a/apps/docs/package.json b/apps/docs/package.json deleted file mode 100644 index aca22b2..0000000 --- a/apps/docs/package.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "name": "docs", - "version": "1.0.0", - "type": "module", - "private": true, - "scripts": { - "dev": "next dev --port 3000 --turbopack", - "build": "next build", - "start": "next start", - "lint": "next lint --max-warnings 0", - "check-types": "tsc --noEmit" - }, - "dependencies": { - "@repo/ui": "workspace:*", - "next": "^15.4.2", - "react": "^19.1.0", - "react-dom": "^19.1.0" - }, - "devDependencies": { - "@next/eslint-plugin-next": "^15.4.2", - "@repo/eslint-config": "workspace:*", - "@repo/tailwind-config": "workspace:*", - "@repo/typescript-config": "workspace:*", - "@tailwindcss/postcss": "^4.1.5", - "@types/node": "^22.15.30", - "@types/react": "^19.1.0", - "@types/react-dom": "^19.1.1", - "autoprefixer": "^10.4.20", - "eslint": "^9.32.0", - "postcss": "^8.5.3", - "tailwindcss": "^4.1.5", - "typescript": "5.8.2" - } -} diff --git a/apps/docs/postcss.config.js b/apps/docs/postcss.config.js deleted file mode 100644 index b2391c1..0000000 --- a/apps/docs/postcss.config.js +++ /dev/null @@ -1,3 +0,0 @@ -import { postcssConfig } from "@repo/tailwind-config/postcss"; - -export default postcssConfig; diff --git a/apps/docs/public/circles.svg b/apps/docs/public/circles.svg deleted file mode 100644 index 6533be5..0000000 --- a/apps/docs/public/circles.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/apps/docs/public/next.svg b/apps/docs/public/next.svg deleted file mode 100644 index 5174b28..0000000 --- a/apps/docs/public/next.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/docs/public/turborepo.svg b/apps/docs/public/turborepo.svg deleted file mode 100644 index 2f9aa1f..0000000 --- a/apps/docs/public/turborepo.svg +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/apps/docs/public/vercel.svg b/apps/docs/public/vercel.svg deleted file mode 100644 index d2f8422..0000000 --- a/apps/docs/public/vercel.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/apps/docs/tsconfig.json b/apps/docs/tsconfig.json deleted file mode 100644 index df214c3..0000000 --- a/apps/docs/tsconfig.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "extends": "@repo/typescript-config/nextjs.json", - "compilerOptions": { - "plugins": [ - { - "name": "next" - } - ] - }, - "include": [ - "**/*.ts", - "**/*.tsx", - "next-env.d.ts", - "next.config.ts", - ".next/types/**/*.ts" - ], - "exclude": ["node_modules"] -} diff --git a/apps/web/app/QueryClientProvider.tsx b/apps/web/app/QueryClientProvider.tsx new file mode 100644 index 0000000..e778813 --- /dev/null +++ b/apps/web/app/QueryClientProvider.tsx @@ -0,0 +1,57 @@ +// In Next.js, this file would be called: app/providers.tsx +'use client' + +// Since QueryClientProvider relies on useContext under the hood, we have to put 'use client' on top +import { + isServer, + QueryClient, + QueryClientProvider, +} from '@tanstack/react-query' +import { ReactQueryDevtools } from '@tanstack/react-query-devtools' + +function makeQueryClient() { + return new QueryClient({ + defaultOptions: { + queries: { + // With SSR, we usually want to set some default staleTime + // above 0 to avoid refetching immediately on the client + staleTime: 60 * 1000, + }, + }, + }) +} + +let browserQueryClient: QueryClient | undefined = undefined + +function getQueryClient() { + if (isServer) { + // Server: always make a new query client + return makeQueryClient() + } else { + // Browser: make a new query client if we don't already have one + // This is very important, so we don't re-make a new client if React + // suspends during the initial render. This may not be needed if we + // have a suspense boundary BELOW the creation of the query client + if (!browserQueryClient) browserQueryClient = makeQueryClient() + return browserQueryClient + } +} + +export default function QueryProvider({ + children, +}: { + children: React.ReactNode +}) { + // NOTE: Avoid useState when initializing the query client if you don't + // have a suspense boundary between this and the code that may + // suspend because React will throw away the client on the initial + // render if it suspends and there is no boundary + const queryClient = getQueryClient() + + return ( + + {children} + + + ) +} diff --git a/apps/web/app/layout.tsx b/apps/web/app/layout.tsx index 5912a62..ce359ee 100644 --- a/apps/web/app/layout.tsx +++ b/apps/web/app/layout.tsx @@ -1,23 +1,30 @@ -import "@repo/ui/styles.css"; -import "./globals.css"; -import type { Metadata } from "next"; -import { Geist } from "next/font/google"; - -const geist = Geist({ subsets: ["latin"] }); +import '@repo/ui/styles.css' +import './globals.css' +import type { Metadata } from 'next' +import QueryProvider from './QueryClientProvider' +import localFont from 'next/font/local' export const metadata: Metadata = { - title: "Create Turborepo", - description: "Generated by create turbo", -}; + title: 'Create Turborepo', + description: 'Generated by create turbo', +} + +const pretendard = localFont({ + src: '../public/fonts/PretendardVariable.woff2', + display: 'swap', + weight: '45 920', +}) export default function RootLayout({ children, }: { - children: React.ReactNode; + children: React.ReactNode }) { return ( - - {children} + + + {children} + - ); + ) } diff --git a/apps/web/package.json b/apps/web/package.json index 50879c0..cc54215 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -4,7 +4,7 @@ "type": "module", "private": true, "scripts": { - "dev": "next dev --port 3001 --turbopack", + "dev": "next dev --port 3000 --turbopack", "build": "next build", "start": "next start", "lint": "next lint --max-warnings 0", @@ -12,9 +12,14 @@ }, "dependencies": { "@repo/ui": "workspace:*", + "@suspensive/react": "^3.3.2", + "@tanstack/react-query": "^5.84.1", + "@tanstack/react-query-devtools": "^5.84.1", + "motion": "^12.23.12", "next": "^15.4.2", "react": "^19.1.0", - "react-dom": "^19.1.0" + "react-dom": "^19.1.0", + "zustand": "^5.0.7" }, "devDependencies": { "@next/eslint-plugin-next": "^15.4.2", diff --git a/apps/web/public/fonts/PretendardVariable.woff2 b/apps/web/public/fonts/PretendardVariable.woff2 new file mode 100644 index 0000000..32b0811 Binary files /dev/null and b/apps/web/public/fonts/PretendardVariable.woff2 differ diff --git a/packages/tailwind-config/shared-styles.css b/packages/tailwind-config/shared-styles.css index a91cd75..77a57d5 100644 --- a/packages/tailwind-config/shared-styles.css +++ b/packages/tailwind-config/shared-styles.css @@ -1,7 +1,14 @@ @import "tailwindcss"; @theme { - --color-blue-1000: #2a8af6; - --color-purple-1000: #a853ba; - --color-red-1000: #e92a67; -} + --color-main: #313D4C; + + --color-blue: #3182F7; + + --color-gray-50: #F3F4F6; + --color-gray-100: #E4E7EB; + --color-gray-200: #B0B9C2; + --color-gray-300: #6C7887; + --color-gray-400: #3D3D3D; + --color-gray-500: #403E3F; +} \ No newline at end of file diff --git a/packages/ui/package.json b/packages/ui/package.json index ee00698..c854fc3 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -32,5 +32,10 @@ "eslint": "^9.32.0", "tailwindcss": "^4.1.5", "typescript": "5.8.2" + }, + "dependencies": { + "clsx": "^2.1.1", + "motion": "^12.23.12", + "tailwind-merge": "^3.3.1" } } diff --git a/packages/ui/src/styles.css b/packages/ui/src/styles.css index b2773df..8d4223c 100644 --- a/packages/ui/src/styles.css +++ b/packages/ui/src/styles.css @@ -1,2 +1,3 @@ /* Component-level styles for the UI package */ @import "tailwindcss" prefix(ui); +@import "@repo/tailwind-config"; diff --git a/packages/ui/src/utils/cn.ts b/packages/ui/src/utils/cn.ts new file mode 100644 index 0000000..250ed8a --- /dev/null +++ b/packages/ui/src/utils/cn.ts @@ -0,0 +1,21 @@ +import { ClassValue, clsx } from 'clsx' +import { twMerge } from 'tailwind-merge' + +/** + * Tailwind CSS 클래스를 조건적으로 병합하고 충돌을 해결하는 유틸리티 함수이다. + * `clsx`와 `tailwind-merge`를 결합하여 클래스 이름을 효율적으로 처리한다. + * @param inputs 문자열, 조건부 클래스 객체, falsy 값 등이 포함된 클래스 입력 배열 + * @example + * ```ts + * cn('text-red-500', 'bg-blue-500'); // 'text-red-500 bg-blue-500' + * + * cn('text-red-500', false && 'bg-blue-500'); // 'text-red-500' + * + * cn('p-2', 'p-4'); // 'p-4' (tailwind-merge가 충돌을 해결) + * + * cn('block', { hidden: isHidden }); // 'block hidden' (isHidden이 true일 경우) + * ``` + */ +export const cn = (...inputs: ClassValue[]) => { + return twMerge(clsx(inputs)) +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3dbf130..0eef2d8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,61 +24,6 @@ importers: specifier: ^2.5.5 version: 2.5.5 - apps/docs: - dependencies: - '@repo/ui': - specifier: workspace:* - version: link:../../packages/ui - next: - specifier: ^15.4.2 - version: 15.4.2(react-dom@19.1.0)(react@19.1.0) - react: - specifier: ^19.1.0 - version: 19.1.0 - react-dom: - specifier: ^19.1.0 - version: 19.1.0(react@19.1.0) - devDependencies: - '@next/eslint-plugin-next': - specifier: ^15.4.2 - version: 15.4.2 - '@repo/eslint-config': - specifier: workspace:* - version: link:../../packages/eslint-config - '@repo/tailwind-config': - specifier: workspace:* - version: link:../../packages/tailwind-config - '@repo/typescript-config': - specifier: workspace:* - version: link:../../packages/typescript-config - '@tailwindcss/postcss': - specifier: ^4.1.5 - version: 4.1.5 - '@types/node': - specifier: ^22.15.30 - version: 22.15.30 - '@types/react': - specifier: ^19.1.0 - version: 19.1.0 - '@types/react-dom': - specifier: ^19.1.1 - version: 19.1.1(@types/react@19.1.0) - autoprefixer: - specifier: ^10.4.20 - version: 10.4.20(postcss@8.5.3) - eslint: - specifier: ^9.32.0 - version: 9.32.0 - postcss: - specifier: ^8.5.3 - version: 8.5.3 - tailwindcss: - specifier: ^4.1.5 - version: 4.1.5 - typescript: - specifier: 5.8.2 - version: 5.8.2 - apps/storybook: dependencies: '@repo/ui': @@ -160,6 +105,18 @@ importers: '@repo/ui': specifier: workspace:* version: link:../../packages/ui + '@suspensive/react': + specifier: ^3.3.2 + version: 3.3.2(react@19.1.0) + '@tanstack/react-query': + specifier: ^5.84.1 + version: 5.84.1(react@19.1.0) + '@tanstack/react-query-devtools': + specifier: ^5.84.1 + version: 5.84.1(@tanstack/react-query@5.84.1)(react@19.1.0) + motion: + specifier: ^12.23.12 + version: 12.23.12(react-dom@19.1.0)(react@19.1.0) next: specifier: ^15.4.2 version: 15.4.2(react-dom@19.1.0)(react@19.1.0) @@ -169,6 +126,9 @@ importers: react-dom: specifier: ^19.1.0 version: 19.1.0(react@19.1.0) + zustand: + specifier: ^5.0.7 + version: 5.0.7(@types/react@19.1.0)(react@19.1.0) devDependencies: '@next/eslint-plugin-next': specifier: ^15.4.2 @@ -259,9 +219,18 @@ importers: packages/ui: dependencies: + clsx: + specifier: ^2.1.1 + version: 2.1.1 + motion: + specifier: ^12.23.12 + version: 12.23.12(react@19.0.0) react: specifier: ^19 version: 19.0.0 + tailwind-merge: + specifier: ^3.3.1 + version: 3.3.1 devDependencies: '@repo/eslint-config': specifier: workspace:* @@ -2912,6 +2881,14 @@ packages: typescript: 5.8.2 dev: true + /@suspensive/react@3.3.2(react@19.1.0): + resolution: {integrity: sha512-ke7SMILp1+odkf3Bh7ff/ZlSi4R+yHtTaFpMTNjBDcS2gcFx85XterFyj12XancfDwfwvAZutGg1tthexuLO3Q==} + peerDependencies: + react: ^18 || ^19 + dependencies: + react: 19.1.0 + dev: false + /@swc/helpers@0.5.15: resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} dependencies: @@ -3080,6 +3057,34 @@ packages: tailwindcss: 4.1.5 dev: true + /@tanstack/query-core@5.83.1: + resolution: {integrity: sha512-OG69LQgT7jSp+5pPuCfzltq/+7l2xoweggjme9vlbCPa/d7D7zaqv5vN/S82SzSYZ4EDLTxNO1PWrv49RAS64Q==} + dev: false + + /@tanstack/query-devtools@5.84.0: + resolution: {integrity: sha512-fbF3n+z1rqhvd9EoGp5knHkv3p5B2Zml1yNRjh7sNXklngYI5RVIWUrUjZ1RIcEoscarUb0+bOvIs5x9dwzOXQ==} + dev: false + + /@tanstack/react-query-devtools@5.84.1(@tanstack/react-query@5.84.1)(react@19.1.0): + resolution: {integrity: sha512-nle+OQ9B3Z3EG2R3ixvaNcJ6OeqGwmAc5iMDW6Vj+emLZkWRrN3BDsrzZQu414n34lpxplnC7z1jmKuU/scHCQ==} + peerDependencies: + '@tanstack/react-query': ^5.84.1 + react: ^18 || ^19 + dependencies: + '@tanstack/query-devtools': 5.84.0 + '@tanstack/react-query': 5.84.1(react@19.1.0) + react: 19.1.0 + dev: false + + /@tanstack/react-query@5.84.1(react@19.1.0): + resolution: {integrity: sha512-zo7EUygcWJMQfFNWDSG7CBhy8irje/XY0RDVKKV4IQJAysb+ZJkkJPcnQi+KboyGUgT+SQebRFoTqLuTtfoDLw==} + peerDependencies: + react: ^18 || ^19 + dependencies: + '@tanstack/query-core': 5.83.1 + react: 19.1.0 + dev: false + /@testing-library/dom@10.4.1: resolution: {integrity: sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==} engines: {node: '>=18'} @@ -3239,7 +3244,6 @@ packages: resolution: {integrity: sha512-UaicktuQI+9UKyA4njtDOGBD/67t8YEBt2xdfqu8+gP9hqPUPsiXlNPcpS2gVdjmis5GKPG3fCxbQLVgxsQZ8w==} dependencies: csstype: 3.1.3 - dev: true /@types/resolve@1.20.6: resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==} @@ -4536,6 +4540,11 @@ packages: wrap-ansi: 7.0.0 dev: true + /clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + dev: false + /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -4805,7 +4814,6 @@ packages: /csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - dev: true /damerau-levenshtein@1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} @@ -5899,6 +5907,47 @@ packages: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} dev: true + /framer-motion@12.23.12(react-dom@19.1.0)(react@19.1.0): + resolution: {integrity: sha512-6e78rdVtnBvlEVgu6eFEAgG9v3wLnYEboM8I5O5EXvfKC8gxGQB8wXJdhkMy10iVcn05jl6CNw7/HTsTCfwcWg==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + dependencies: + motion-dom: 12.23.12 + motion-utils: 12.23.6 + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + tslib: 2.8.1 + dev: false + + /framer-motion@12.23.12(react@19.0.0): + resolution: {integrity: sha512-6e78rdVtnBvlEVgu6eFEAgG9v3wLnYEboM8I5O5EXvfKC8gxGQB8wXJdhkMy10iVcn05jl6CNw7/HTsTCfwcWg==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + dependencies: + motion-dom: 12.23.12 + motion-utils: 12.23.6 + react: 19.0.0 + tslib: 2.8.1 + dev: false + /fs-extra@10.1.0: resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} engines: {node: '>=12'} @@ -6993,6 +7042,55 @@ packages: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} dev: true + /motion-dom@12.23.12: + resolution: {integrity: sha512-RcR4fvMCTESQBD/uKQe49D5RUeDOokkGRmz4ceaJKDBgHYtZtntC/s2vLvY38gqGaytinij/yi3hMcWVcEF5Kw==} + dependencies: + motion-utils: 12.23.6 + dev: false + + /motion-utils@12.23.6: + resolution: {integrity: sha512-eAWoPgr4eFEOFfg2WjIsMoqJTW6Z8MTUCgn/GZ3VRpClWBdnbjryiA3ZSNLyxCTmCQx4RmYX6jX1iWHbenUPNQ==} + dev: false + + /motion@12.23.12(react-dom@19.1.0)(react@19.1.0): + resolution: {integrity: sha512-8jCD8uW5GD1csOoqh1WhH1A6j5APHVE15nuBkFeRiMzYBdRwyAHmSP/oXSuW0WJPZRXTFdBoG4hY9TFWNhhwng==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + dependencies: + framer-motion: 12.23.12(react-dom@19.1.0)(react@19.1.0) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + tslib: 2.8.1 + dev: false + + /motion@12.23.12(react@19.0.0): + resolution: {integrity: sha512-8jCD8uW5GD1csOoqh1WhH1A6j5APHVE15nuBkFeRiMzYBdRwyAHmSP/oXSuW0WJPZRXTFdBoG4hY9TFWNhhwng==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + dependencies: + framer-motion: 12.23.12(react@19.0.0) + react: 19.0.0 + tslib: 2.8.1 + dev: false + /mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -8491,6 +8589,10 @@ packages: engines: {node: '>= 0.4'} dev: true + /tailwind-merge@3.3.1: + resolution: {integrity: sha512-gBXpgUm/3rp1lMZZrM/w7D8GKqshif0zAymAhbCyIt8KMe+0v9DQ7cdYLR4FHH/cKpdTXb+A/tKKU3eolfsI+g==} + dev: false + /tailwindcss@4.1.5: resolution: {integrity: sha512-nYtSPfWGDiWgCkwQG/m+aX83XCwf62sBgg3bIlNiiOcggnS1x3uVRDAuyelBFL+vJdOPPCGElxv9DjHJjRHiVA==} dev: true @@ -9154,3 +9256,28 @@ packages: resolution: {integrity: sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg==} engines: {node: '>=12.20'} dev: true + + /zustand@5.0.7(@types/react@19.1.0)(react@19.1.0): + resolution: {integrity: sha512-Ot6uqHDW/O2VdYsKLLU8GQu8sCOM1LcoE8RwvLv9uuRT9s6SOHCKs0ZEOhxg+I1Ld+A1Q5lwx+UlKXXUoCZITg==} + engines: {node: '>=12.20.0'} + peerDependencies: + '@types/react': '>=18.0.0' + immer: '>=9.0.6' + react: '>=18.0.0' + use-sync-external-store: '>=1.2.0' + peerDependenciesMeta: + '@types/react': + optional: true + immer: + optional: true + react: + optional: true + use-sync-external-store: + optional: true + dependencies: + '@types/react': 19.1.0 + react: 19.1.0 + dev: false + +catalogs: + default: null