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
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {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