diff --git a/apps/web/app/globals.css b/apps/web/app/globals.css index eae39d5..dd73ca8 100644 --- a/apps/web/app/globals.css +++ b/apps/web/app/globals.css @@ -1,436 +1,415 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; +@import "tailwindcss"; :root { - --bg-base: #f0f2f5; - --bg-panel: rgba(255, 255, 255, 0.9); - --bg-panel-hover: rgba(0, 0, 0, 0.05); + --bg-base: #f0f2f5; + --bg-panel: rgba(255, 255, 255, 0.9); + --bg-panel-hover: rgba(0, 0, 0, 0.05); - --text-primary: #121212; - --text-secondary: #555555; + --text-primary: #121212; + --text-secondary: #555555; - --border-color: rgba(0, 0, 0, 0.15); - --shadow-glow: rgba(0, 136, 255, 0.2); + --border-color: rgba(0, 0, 0, 0.15); + --shadow-glow: rgba(0, 136, 255, 0.2); - --pin-academic: #D91A4D; - --pin-food: #00995C; - --pin-social: #8E00E6; - --pin-transit: #D98200; - --pin-utility: #0088CC; + --pin-academic: #d91a4d; + --pin-food: #00995c; + --pin-social: #8e00e6; + --pin-transit: #d98200; + --pin-utility: #0088cc; } .dark { - --bg-base: #0f1115; - --bg-panel: rgba(10, 10, 12, 0.85); - --bg-panel-hover: rgba(255, 255, 255, 0.1); + --bg-base: #0f1115; + --bg-panel: rgba(10, 10, 12, 0.85); + --bg-panel-hover: rgba(255, 255, 255, 0.1); - --text-primary: #ffffff; - --text-secondary: #8899A6; + --text-primary: #ffffff; + --text-secondary: #8899a6; - --border-color: rgba(255, 255, 255, 0.15); - --shadow-glow: rgba(0, 229, 255, 0.2); - - --pin-academic: #FF3366; - --pin-food: #00FF99; - --pin-social: #B026FF; - --pin-transit: #FFD700; - --pin-utility: #00E5FF; + --border-color: rgba(255, 255, 255, 0.15); + --shadow-glow: rgba(0, 229, 255, 0.2); + + --pin-academic: #ff3366; + --pin-food: #00ff99; + --pin-social: #b026ff; + --pin-transit: #ffd700; + --pin-utility: #00e5ff; } body { - background-color: var(--bg-base); - color: var(--text-primary); - transition: background-color 0.3s ease, color 0.3s ease; - margin: 0; - padding: 0; - overflow: hidden; - font-family: var(--font-chakra), sans-serif; + background-color: var(--bg-base); + color: var(--text-primary); + transition: + background-color 0.3s ease, + color 0.3s ease; + margin: 0; + padding: 0; + overflow: hidden; + font-family: var(--font-chakra), sans-serif; } -p, -.font-desc, -.details-card p { - font-family: var(--font-nunito), sans-serif; +p { + font-family: var(--font-nunito), sans-serif; } .map-container { - width: 100vw; - height: 100vh; - position: absolute; - top: 0; - left: 0; - z-index: 0; + width: 100vw; + height: 100vh; + position: absolute; + top: 0; + left: 0; + z-index: 0; } .tactical-panel { - background: var(--bg-panel); - backdrop-filter: blur(12px); - -webkit-backdrop-filter: blur(12px); - border: 1px solid var(--border-color); - border-radius: 16px; - color: var(--text-primary); - box-shadow: 0 8px 32px rgba(0, 0, 0, 0.15); - transition: background 0.3s ease, border-color 0.3s ease, color 0.3s ease; + background: var(--bg-panel); + backdrop-filter: blur(12px); + -webkit-backdrop-filter: blur(12px); + border: 1px solid var(--border-color); + border-radius: 16px; + color: var(--text-primary); + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.15); + transition: + background 0.3s ease, + border-color 0.3s ease, + color 0.3s ease; } .tactical-button { - background: var(--bg-panel); - border: 1px solid var(--border-color); - color: var(--text-primary); - border-radius: 8px; - font-family: var(--font-chakra), sans-serif; - font-weight: 600; - cursor: pointer; - transition: all 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275); + background: var(--bg-panel); + border: 1px solid var(--border-color); + color: var(--text-primary); + border-radius: 8px; + font-family: var(--font-chakra), sans-serif; + font-weight: 600; + cursor: pointer; + transition: all 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275); } .tactical-button:hover { - background: var(--bg-panel-hover); - transform: translateY(-2px); + background: var(--bg-panel-hover); + transform: translateY(-2px); } .tactical-button:active { - transform: translateY(1px); + transform: translateY(1px); } .tactical-button-primary { - background: rgba(0, 229, 255, 0.15); - border: 1px solid var(--neon-blue); - color: var(--neon-blue); - box-shadow: 0 0 10px var(--shadow-glow); - border-radius: 8px; - font-family: var(--font-chakra), sans-serif; - font-weight: 600; - cursor: pointer; - transition: all 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275); + background: rgba(0, 229, 255, 0.15); + border: 1px solid var(--neon-blue); + color: var(--neon-blue); + box-shadow: 0 0 10px var(--shadow-glow); + border-radius: 8px; + font-family: var(--font-chakra), sans-serif; + font-weight: 600; + cursor: pointer; + transition: all 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275); } .tactical-button-primary:hover { - background: var(--neon-blue); - color: var(--bg-base); - box-shadow: 0 0 20px var(--neon-blue); + background: var(--neon-blue); + color: var(--bg-base); + box-shadow: 0 0 20px var(--neon-blue); } /* --- UI LAYER --- */ .ui-layer { - position: absolute; - inset: 0; - pointer-events: none; - display: flex; - justify-content: space-between; - padding: 8px; - z-index: 100; - overflow: hidden; + position: absolute; + inset: 0; + pointer-events: none; + display: flex; + justify-content: space-between; + padding: 8px; + z-index: 100; + overflow: hidden; } /* --- ZONES --- */ .zone-left, .zone-right { - pointer-events: auto; + pointer-events: auto; } .zone-left { - position: absolute; - top: 8px; - left: 8px; - z-index: 20; + position: absolute; + top: 8px; + left: 8px; + z-index: 20; } .zone-right { - position: absolute; - top: 8px; - right: 8px; - bottom: 24px; - display: flex; - flex-direction: column; - justify-content: space-between; - width: 44px; - z-index: 20; + position: absolute; + top: 8px; + right: 8px; + bottom: 24px; + display: flex; + flex-direction: column; + justify-content: space-between; + width: 44px; + z-index: 20; } .zone-center { - position: absolute; - top: 8px; - left: 50%; - transform: translateX(-50%); - width: max-content; - max-width: calc(100vw - 120px); - display: flex; - flex-direction: column; - align-items: stretch; - gap: 8px; - pointer-events: none; - z-index: 10; + position: absolute; + top: 8px; + left: 50%; + transform: translateX(-50%); + width: max-content; + max-width: calc(100vw - 120px); + display: flex; + flex-direction: column; + align-items: stretch; + gap: 8px; + pointer-events: none; + z-index: 10; } /* --- CENTER CONTENTS --- */ .search-block { - position: relative; - width: 100%; - margin: 0 auto; - pointer-events: auto; - transition: transform 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275); - display: flex; - align-items: center; + position: relative; + width: 100%; + margin: 0 auto; + pointer-events: auto; + transition: transform 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275); + display: flex; + align-items: center; } .search-block:focus-within { - transform: scale(1.05); + transform: scale(1.05); } .search-input { - width: 100%; - height: 44px; - background: var(--bg-panel); - backdrop-filter: blur(12px); - border: 1px solid var(--border-color); - border-radius: 14px; - box-sizing: border-box; - padding: 0 40px 0 14px; - color: var(--text-primary); - font-size: 13px; - font-weight: 700; - font-family: var(--font-chakra); + width: 100%; + height: 44px; + background: var(--bg-panel); + backdrop-filter: blur(12px); + border: 1px solid var(--border-color); + border-radius: 14px; + box-sizing: border-box; + padding: 0 40px 0 14px; + color: var(--text-primary); + font-size: 13px; + font-weight: 700; + font-family: var(--font-chakra); } .search-input:focus { - outline: none; - border-color: rgba(255, 255, 255, 0.3); + outline: none; + border-color: rgba(255, 255, 255, 0.3); } .search-icon-right { - position: absolute; - right: 12px; - top: 50%; - transform: translateY(-50%); - color: #aaa; - pointer-events: none; - z-index: 5; + position: absolute; + right: 12px; + top: 50%; + transform: translateY(-50%); + color: #aaa; + pointer-events: none; + z-index: 5; } .filter-row { - display: flex; - justify-content: center; - gap: 8px; - width: 100%; - overflow-x: auto; - padding-top: 4px; - padding-bottom: 4px; - pointer-events: auto; + display: flex; + justify-content: center; + gap: 8px; + width: 100%; + overflow-x: auto; + padding-top: 4px; + padding-bottom: 4px; + pointer-events: auto; } .no-scrollbar::-webkit-scrollbar { - display: none; + display: none; } .filter-chip { - padding: 6px 14px; - border: 1px solid; - border-radius: 18px; - font-size: 10px; - font-weight: 900; - white-space: nowrap; - cursor: pointer; - font-family: var(--font-chakra); - transition: transform 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275), background 0.2s; + padding: 6px 14px; + border: 1px solid; + border-radius: 18px; + font-size: 10px; + font-weight: 900; + white-space: nowrap; + cursor: pointer; + font-family: var(--font-chakra); + transition: + transform 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275), + background 0.2s; } /* --- SIDE CONTROLS --- */ .icon-button, .control-button { - width: 44px; - height: 44px; - background: var(--bg-panel); - backdrop-filter: blur(12px); - border: 1px solid var(--border-color); - border-radius: 12px; - color: var(--text-primary); - display: flex; - align-items: center; - justify-content: center; - cursor: pointer; - transition: transform 0.1s; - font-family: var(--font-chakra); + width: 44px; + height: 44px; + background: var(--bg-panel); + backdrop-filter: blur(12px); + border: 1px solid var(--border-color); + border-radius: 12px; + color: var(--text-primary); + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + transition: transform 0.1s; + font-family: var(--font-chakra); } .icon-button:active, .control-button:active { - transform: scale(0.92); + transform: scale(0.92); } .tool-group { - display: flex; - flex-direction: column; - gap: 8px; + display: flex; + flex-direction: column; + gap: 8px; } .bottom-align { - margin-top: auto; + margin-top: auto; } .zoom-stack { - display: flex; - flex-direction: column; - background: var(--bg-panel); - backdrop-filter: blur(12px); - border: 1px solid var(--border-color); - border-radius: 12px; - overflow: hidden; + display: flex; + flex-direction: column; + background: var(--bg-panel); + backdrop-filter: blur(12px); + border: 1px solid var(--border-color); + border-radius: 12px; + overflow: hidden; } .control-button { - border: none; - border-radius: 0; + border: none; + border-radius: 0; } .divider { - height: 1px; - background: var(--border-color); - width: 80%; - margin: 0 auto; + height: 1px; + background: var(--border-color); + width: 80%; + margin: 0 auto; } .transit-system-container { - position: relative; - margin-top: 12px; - display: flex; - align-items: center; + position: relative; + margin-top: 12px; + display: flex; + align-items: center; } .transit-btn.active { - background: rgba(0, 229, 255, 0.15); - color: var(--neon-blue, #00E5FF); - border-color: var(--neon-blue, #00E5FF); + background: rgba(0, 229, 255, 0.15); + color: var(--neon-blue, #00e5ff); + border-color: var(--neon-blue, #00e5ff); } .extruded-menu { - position: absolute; - left: 100%; - margin-left: 12px; - display: flex; - gap: 8px; - background: var(--bg-panel); - backdrop-filter: blur(12px); - -webkit-backdrop-filter: blur(12px); - border: 1px solid var(--border-color); - border-radius: 20px; - padding: 6px; - animation: extrudeRight 0.25s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards; + position: absolute; + left: 100%; + margin-left: 12px; + display: flex; + gap: 8px; + background: var(--bg-panel); + backdrop-filter: blur(12px); + -webkit-backdrop-filter: blur(12px); + border: 1px solid var(--border-color); + border-radius: 20px; + padding: 6px; + animation: extrudeRight 0.25s cubic-bezier(0.175, 0.885, 0.32, 1.275) forwards; } .route-node { - width: 32px; - height: 32px; - border-radius: 50%; - display: flex; - align-items: center; - justify-content: center; - font-family: var(--font-chakra), sans-serif; - font-weight: 700; - font-size: 14px; - cursor: pointer; - border: 1px solid transparent; - transition: all 0.2s ease; + width: 32px; + height: 32px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + font-family: var(--font-chakra), sans-serif; + font-weight: 700; + font-size: 14px; + cursor: pointer; + border: 1px solid transparent; + transition: all 0.2s ease; } .route-node:hover { - transform: scale(1.1); - background: var(--bg-panel-hover) !important; - color: var(--text-primary) !important; + transform: scale(1.1); + background: var(--bg-panel-hover) !important; + color: var(--text-primary) !important; } @keyframes extrudeRight { - from { - opacity: 0; - transform: translateX(-15px) scale(0.9); - } + from { + opacity: 0; + transform: translateX(-15px) scale(0.9); + } - to { - opacity: 1; - transform: translateX(0) scale(1); - } + to { + opacity: 1; + transform: translateX(0) scale(1); + } } /* --- HUD & ANIMATIONS --- */ -.details-card { - background: rgba(3, 3, 4, 0.9); - backdrop-filter: blur(20px); - border: 1px solid rgba(255, 255, 255, 0.1); - border-radius: 20px; - padding: 24px; - width: 100%; - max-width: 400px; - box-shadow: 0 20px 40px rgba(0, 0, 0, 0.5); - animation: slideUp 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275); -} - -.lock-button { - font-family: var(--font-chakra); - font-size: 12px; - letter-spacing: 0.05em; - cursor: pointer; - transition: transform 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275); -} - -.lock-button:active { - transform: scale(0.95); -} @media (max-width: 768px) { + .profile-btn, + .theme-toggle { + display: none; + } - .profile-btn, - .theme-toggle { - display: none; - } - - .zone-left { - top: auto; - bottom: 24px; - display: flex; - flex-direction: column-reverse; - gap: 12px; - } + .zone-left { + top: auto; + bottom: 24px; + display: flex; + flex-direction: column-reverse; + gap: 12px; + } - .zone-left .transit-system-container { - margin-top: 0; - } + .zone-left .transit-system-container { + margin-top: 0; + } } @keyframes slideUp { - from { - transform: translateY(100px); - opacity: 0; - } + from { + transform: translateY(100px); + opacity: 0; + } - to { - transform: translateY(0); - opacity: 1; - } + to { + transform: translateY(0); + opacity: 1; + } } @keyframes fadeIn { - from { - opacity: 0; - transform: scale(0.95); - } + from { + opacity: 0; + transform: scale(0.95); + } - to { - opacity: 1; - transform: scale(1); - } + to { + opacity: 1; + transform: scale(1); + } } @keyframes pulse { - 0% { - opacity: 1; - } - - 50% { - opacity: 0.4; - } - - 100% { - opacity: 1; - } -} \ No newline at end of file + 0% { + opacity: 1; + } + + 50% { + opacity: 0.4; + } + + 100% { + opacity: 1; + } +} diff --git a/apps/web/components/PinDetailsCard.tsx b/apps/web/components/PinDetailsCard.tsx index 796c75f..a4e6e9e 100644 --- a/apps/web/components/PinDetailsCard.tsx +++ b/apps/web/components/PinDetailsCard.tsx @@ -2,6 +2,15 @@ import { getPinColor } from "@/data/pin-categories"; import { trpc } from "@/lib/trpc"; +import { clsxm } from "@repo/ui/clsxm"; + +// STYLES +const detailsCardStyles = ` + p-[24px] w-full max-w-[400px] flex flex-col gap-[16px] + bg-[var(--bg-panel)] backdrop-filter-[blur(20px)] + border border-solid border-[1px] border-[var(--border-color)] border-t-[3px] rounded-[20px] + shadow-[0_20px_40px_rgba(0, 0, 0, 0.3)] + `; interface PinDetailsCardProps { pinId: string; @@ -30,7 +39,7 @@ export function PinDetailsCard({ if (isPinLoading) return (
+
{/* HEADER */}
@@ -80,35 +89,23 @@ export function PinDetailsCard({ +
); diff --git a/apps/web/package.json b/apps/web/package.json index 4cbe2c1..43ab5dc 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -16,6 +16,7 @@ "@repo/api": "workspace:*", "@repo/auth": "workspace:*", "@repo/ui": "workspace:*", + "@tailwindcss/postcss": "^4.2.2", "@tanstack/react-query": "^5.90.21", "@trpc/client": "^11.10.0", "@trpc/react-query": "^11.10.0", @@ -24,10 +25,12 @@ "better-auth": "^1.4.18", "client-only": "^0.0.1", "next": "16.1.0", + "postcss": "^8.5.8", "react": "^19.2.0", "react-dom": "^19.2.0", "react-hook-form": "^7.71.2", "server-only": "^0.0.1", + "tailwindcss": "^4.2.2", "zod": "^4.3.6" }, "devDependencies": { diff --git a/apps/web/postcss.config.mjs b/apps/web/postcss.config.mjs new file mode 100644 index 0000000..c42f31c --- /dev/null +++ b/apps/web/postcss.config.mjs @@ -0,0 +1,7 @@ +const config = { + plugins: { + "@tailwindcss/postcss": {}, + }, +}; + +export default config; diff --git a/biome.json b/biome.json index 8476d18..df3c34f 100644 --- a/biome.json +++ b/biome.json @@ -33,5 +33,11 @@ "organizeImports": "off" } } + }, + "css": { + "parser": { + "cssModules": true, + "tailwindDirectives": true + } } } diff --git a/packages/ui/package.json b/packages/ui/package.json index 90c1488..0871bc6 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -20,7 +20,9 @@ "typescript": "5.9.2" }, "dependencies": { + "clsx": "^2.1.1", "react": "^19.2.0", - "react-dom": "^19.2.0" + "react-dom": "^19.2.0", + "tailwind-merge": "^3.5.0" } } diff --git a/packages/ui/src/clsxm.tsx b/packages/ui/src/clsxm.tsx new file mode 100644 index 0000000..bb17024 --- /dev/null +++ b/packages/ui/src/clsxm.tsx @@ -0,0 +1,6 @@ +import clsx, { type ClassValue } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function clsxm(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f27c7d6..881de43 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -60,7 +60,7 @@ importers: version: 19.2.2(@types/react@19.2.2) eslint: specifier: ^9.39.1 - version: 9.39.1 + version: 9.39.1(jiti@2.6.1) typescript: specifier: 5.9.2 version: 5.9.2 @@ -82,6 +82,9 @@ importers: '@repo/ui': specifier: workspace:* version: link:../../packages/ui + '@tailwindcss/postcss': + specifier: ^4.2.2 + version: 4.2.2 '@tanstack/react-query': specifier: ^5.90.21 version: 5.90.21(react@19.2.0) @@ -99,13 +102,16 @@ importers: version: 1.7.1(react-dom@19.2.0(react@19.2.0))(react@19.2.0) better-auth: specifier: ^1.4.18 - version: 1.4.18(drizzle-kit@0.31.8)(drizzle-orm@0.45.1(kysely@0.28.11)(postgres@3.4.8))(next@16.1.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vitest@4.0.18(@types/node@22.15.3)(tsx@4.21.0)) + version: 1.4.18(drizzle-kit@0.31.8)(drizzle-orm@0.45.1(kysely@0.28.11)(postgres@3.4.8))(next@16.1.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vitest@4.0.18(@types/node@22.15.3)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)) client-only: specifier: ^0.0.1 version: 0.0.1 next: specifier: 16.1.0 version: 16.1.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + postcss: + specifier: ^8.5.8 + version: 8.5.8 react: specifier: ^19.2.0 version: 19.2.0 @@ -118,6 +124,9 @@ importers: server-only: specifier: ^0.0.1 version: 0.0.1 + tailwindcss: + specifier: ^4.2.2 + version: 4.2.2 zod: specifier: ^4.3.6 version: 4.3.6 @@ -142,7 +151,7 @@ importers: version: 19.2.2(@types/react@19.2.2) eslint: specifier: ^9.39.1 - version: 9.39.1 + version: 9.39.1(jiti@2.6.1) typescript: specifier: 5.9.2 version: 5.9.2 @@ -188,13 +197,13 @@ importers: version: 19.2.2(@types/react@19.2.2) eslint: specifier: ^9.39.1 - version: 9.39.1 + version: 9.39.1(jiti@2.6.1) typescript: specifier: 5.9.2 version: 5.9.2 vitest: specifier: ^4.0.18 - version: 4.0.18(@types/node@22.15.3)(tsx@4.21.0) + version: 4.0.18(@types/node@22.15.3)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0) packages/auth: dependencies: @@ -203,7 +212,7 @@ importers: version: link:../db better-auth: specifier: ^1.4.18 - version: 1.4.18(drizzle-kit@0.31.8)(drizzle-orm@0.45.1(kysely@0.28.11)(postgres@3.4.8))(next@16.1.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vitest@4.0.18(@types/node@22.15.3)(tsx@4.21.0)) + version: 1.4.18(drizzle-kit@0.31.8)(drizzle-orm@0.45.1(kysely@0.28.11)(postgres@3.4.8))(next@16.1.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vitest@4.0.18(@types/node@22.15.3)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)) react: specifier: ^19.2.0 version: 19.2.0 @@ -228,7 +237,7 @@ importers: version: 19.2.2(@types/react@19.2.2) eslint: specifier: ^9.39.1 - version: 9.39.1 + version: 9.39.1(jiti@2.6.1) typescript: specifier: 5.9.2 version: 5.9.2 @@ -271,7 +280,7 @@ importers: version: 0.31.8 eslint: specifier: ^9.39.1 - version: 9.39.1 + version: 9.39.1(jiti@2.6.1) tsx: specifier: ^4.21.0 version: 4.21.0 @@ -289,22 +298,22 @@ importers: version: 15.5.0 eslint: specifier: ^9.39.1 - version: 9.39.1 + version: 9.39.1(jiti@2.6.1) eslint-config-prettier: specifier: ^10.1.1 - version: 10.1.1(eslint@9.39.1) + version: 10.1.1(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-only-warn: specifier: ^1.1.0 version: 1.1.0 eslint-plugin-react: specifier: ^7.37.5 - version: 7.37.5(eslint@9.39.1) + version: 7.37.5(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-react-hooks: specifier: ^5.2.0 - version: 5.2.0(eslint@9.39.1) + version: 5.2.0(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-turbo: specifier: ^2.7.1 - version: 2.7.1(eslint@9.39.1)(turbo@2.8.0) + version: 2.7.1(eslint@9.39.1(jiti@2.6.1))(turbo@2.8.0) globals: specifier: ^16.5.0 version: 16.5.0 @@ -313,18 +322,24 @@ importers: version: 5.9.2 typescript-eslint: specifier: ^8.50.0 - version: 8.50.0(eslint@9.39.1)(typescript@5.9.2) + version: 8.50.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.2) packages/typescript-config: {} packages/ui: dependencies: + clsx: + specifier: ^2.1.1 + version: 2.1.1 react: specifier: ^19.2.0 version: 19.2.0 react-dom: specifier: ^19.2.0 version: 19.2.0(react@19.2.0) + tailwind-merge: + specifier: ^3.5.0 + version: 3.5.0 devDependencies: '@repo/eslint-config': specifier: workspace:* @@ -343,13 +358,17 @@ importers: version: 19.2.2(@types/react@19.2.2) eslint: specifier: ^9.39.1 - version: 9.39.1 + version: 9.39.1(jiti@2.6.1) typescript: specifier: 5.9.2 version: 5.9.2 packages: + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + '@aws-crypto/crc32@5.2.0': resolution: {integrity: sha512-nLbCWqQNgUiwwtFsen1AdzAtvuLRsQS8rYgMuxCrdKf9kOssamGLuPwyTY9wyYblNr9+1XM8v6zoDTPPSIeANg==} engines: {node: '>=16.0.0'} @@ -1237,9 +1256,22 @@ packages: cpu: [x64] os: [win32] + '@jridgewell/gen-mapping@0.3.13': + resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} + + '@jridgewell/remapping@2.3.5': + resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/trace-mapping@0.3.31': + resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} + '@next/env@16.1.0': resolution: {integrity: sha512-Dd23XQeFHmhf3KBW76leYVkejHlCdB7erakC2At2apL1N08Bm+dLYNP+nNHh0tzUXfPQcNcXiQyacw0PG4Fcpw==} @@ -1664,6 +1696,94 @@ packages: '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} + '@tailwindcss/node@4.2.2': + resolution: {integrity: sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==} + + '@tailwindcss/oxide-android-arm64@4.2.2': + resolution: {integrity: sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.2.2': + resolution: {integrity: sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.2.2': + resolution: {integrity: sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.2.2': + resolution: {integrity: sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2': + resolution: {integrity: sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==} + engines: {node: '>= 20'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.2.2': + resolution: {integrity: sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.2.2': + resolution: {integrity: sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.2.2': + resolution: {integrity: sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.2.2': + resolution: {integrity: sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.2.2': + resolution: {integrity: sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + + '@tailwindcss/oxide-win32-arm64-msvc@4.2.2': + resolution: {integrity: sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.2.2': + resolution: {integrity: sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.2.2': + resolution: {integrity: sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==} + engines: {node: '>= 20'} + + '@tailwindcss/postcss@4.2.2': + resolution: {integrity: sha512-n4goKQbW8RVXIbNKRB/45LzyUqN451deQK0nzIeauVEqjlI49slUlgKYJM2QyUzap/PcpnS7kzSUmPb1sCRvYQ==} + '@tanstack/query-core@5.90.20': resolution: {integrity: sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg==} @@ -1993,6 +2113,10 @@ packages: client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -2161,6 +2285,10 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} + enhanced-resolve@5.20.1: + resolution: {integrity: sha512-Qohcme7V1inbAfvjItgw0EaxVX5q2rdVEZHRBrEQdRZTssLDGsL8Lwrznl8oQ/6kuTJONLaDcGjkNP247XEhcA==} + engines: {node: '>=10.13.0'} + es-abstract@1.24.0: resolution: {integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg==} engines: {node: '>= 0.4'} @@ -2406,6 +2534,9 @@ packages: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + has-bigints@1.1.0: resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==} engines: {node: '>= 0.4'} @@ -2563,6 +2694,10 @@ packages: resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} + jiti@2.6.1: + resolution: {integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==} + hasBin: true + jose@6.1.3: resolution: {integrity: sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==} @@ -2596,6 +2731,76 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + locate-path@6.0.0: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} @@ -2755,6 +2960,10 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} + postcss@8.5.8: + resolution: {integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==} + engines: {node: ^10 || ^12 || >=14} + postgres@3.4.8: resolution: {integrity: sha512-d+JFcLM17njZaOLkv6SCev7uoLaBtfK86vMUXhW1Z4glPWh4jozno9APvW/XKFJ3CCxVoC7OL38BqRydtu5nGg==} engines: {node: '>=12'} @@ -2967,6 +3176,16 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} + tailwind-merge@3.5.0: + resolution: {integrity: sha512-I8K9wewnVDkL1NTGoqWmVEIlUcB9gFriAEkXkfCjX5ib8ezGxtR3xD7iZIxrfArjEsH7F1CHD4RFUtxefdqV/A==} + + tailwindcss@4.2.2: + resolution: {integrity: sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==} + + tapable@2.3.2: + resolution: {integrity: sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==} + engines: {node: '>=6'} + tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -3188,6 +3407,8 @@ packages: snapshots: + '@alloc/quick-lru@5.2.0': {} + '@aws-crypto/crc32@5.2.0': dependencies: '@aws-crypto/util': 5.2.0 @@ -3926,9 +4147,9 @@ snapshots: '@esbuild/win32-x64@0.27.3': optional: true - '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1)': + '@eslint-community/eslint-utils@4.9.0(eslint@9.39.1(jiti@2.6.1))': dependencies: - eslint: 9.39.1 + eslint: 9.39.1(jiti@2.6.1) eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.2': {} @@ -4085,8 +4306,25 @@ snapshots: '@img/sharp-win32-x64@0.34.5': optional: true + '@jridgewell/gen-mapping@0.3.13': + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/remapping@2.3.5': + dependencies: + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 + + '@jridgewell/resolve-uri@3.1.2': {} + '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/trace-mapping@0.3.31': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.5.5 + '@next/env@16.1.0': {} '@next/eslint-plugin-next@15.5.0': @@ -4554,6 +4792,75 @@ snapshots: dependencies: tslib: 2.8.1 + '@tailwindcss/node@4.2.2': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.20.1 + jiti: 2.6.1 + lightningcss: 1.32.0 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.2.2 + + '@tailwindcss/oxide-android-arm64@4.2.2': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.2.2': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.2.2': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.2.2': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.2.2': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.2.2': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.2.2': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.2.2': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.2.2': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.2.2': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.2.2': + optional: true + + '@tailwindcss/oxide@4.2.2': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.2.2 + '@tailwindcss/oxide-darwin-arm64': 4.2.2 + '@tailwindcss/oxide-darwin-x64': 4.2.2 + '@tailwindcss/oxide-freebsd-x64': 4.2.2 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.2 + '@tailwindcss/oxide-linux-arm64-gnu': 4.2.2 + '@tailwindcss/oxide-linux-arm64-musl': 4.2.2 + '@tailwindcss/oxide-linux-x64-gnu': 4.2.2 + '@tailwindcss/oxide-linux-x64-musl': 4.2.2 + '@tailwindcss/oxide-wasm32-wasi': 4.2.2 + '@tailwindcss/oxide-win32-arm64-msvc': 4.2.2 + '@tailwindcss/oxide-win32-x64-msvc': 4.2.2 + + '@tailwindcss/postcss@4.2.2': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.2.2 + '@tailwindcss/oxide': 4.2.2 + postcss: 8.5.8 + tailwindcss: 4.2.2 + '@tanstack/query-core@5.90.20': {} '@tanstack/react-query@5.90.21(react@19.2.0)': @@ -4603,15 +4910,15 @@ snapshots: dependencies: csstype: 3.1.3 - '@typescript-eslint/eslint-plugin@8.50.0(@typescript-eslint/parser@8.50.0(eslint@9.39.1)(typescript@5.9.2))(eslint@9.39.1)(typescript@5.9.2)': + '@typescript-eslint/eslint-plugin@8.50.0(@typescript-eslint/parser@8.50.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.2))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.2)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.50.0(eslint@9.39.1)(typescript@5.9.2) + '@typescript-eslint/parser': 8.50.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.2) '@typescript-eslint/scope-manager': 8.50.0 - '@typescript-eslint/type-utils': 8.50.0(eslint@9.39.1)(typescript@5.9.2) - '@typescript-eslint/utils': 8.50.0(eslint@9.39.1)(typescript@5.9.2) + '@typescript-eslint/type-utils': 8.50.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.2) + '@typescript-eslint/utils': 8.50.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.2) '@typescript-eslint/visitor-keys': 8.50.0 - eslint: 9.39.1 + eslint: 9.39.1(jiti@2.6.1) ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.1.0(typescript@5.9.2) @@ -4619,14 +4926,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.50.0(eslint@9.39.1)(typescript@5.9.2)': + '@typescript-eslint/parser@8.50.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.2)': dependencies: '@typescript-eslint/scope-manager': 8.50.0 '@typescript-eslint/types': 8.50.0 '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.2) '@typescript-eslint/visitor-keys': 8.50.0 debug: 4.4.3 - eslint: 9.39.1 + eslint: 9.39.1(jiti@2.6.1) typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -4649,13 +4956,13 @@ snapshots: dependencies: typescript: 5.9.2 - '@typescript-eslint/type-utils@8.50.0(eslint@9.39.1)(typescript@5.9.2)': + '@typescript-eslint/type-utils@8.50.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.2)': dependencies: '@typescript-eslint/types': 8.50.0 '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.50.0(eslint@9.39.1)(typescript@5.9.2) + '@typescript-eslint/utils': 8.50.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.2) debug: 4.4.3 - eslint: 9.39.1 + eslint: 9.39.1(jiti@2.6.1) ts-api-utils: 2.1.0(typescript@5.9.2) typescript: 5.9.2 transitivePeerDependencies: @@ -4678,13 +4985,13 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.50.0(eslint@9.39.1)(typescript@5.9.2)': + '@typescript-eslint/utils@8.50.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.2)': dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.50.0 '@typescript-eslint/types': 8.50.0 '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.2) - eslint: 9.39.1 + eslint: 9.39.1(jiti@2.6.1) typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -4710,13 +5017,13 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.0.3 - '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@22.15.3)(tsx@4.21.0))': + '@vitest/mocker@4.0.18(vite@7.3.1(@types/node@22.15.3)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0))': dependencies: '@vitest/spy': 4.0.18 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 7.3.1(@types/node@22.15.3)(tsx@4.21.0) + vite: 7.3.1(@types/node@22.15.3)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0) '@vitest/pretty-format@4.0.18': dependencies: @@ -4828,7 +5135,7 @@ snapshots: baseline-browser-mapping@2.9.11: {} - better-auth@1.4.18(drizzle-kit@0.31.8)(drizzle-orm@0.45.1(kysely@0.28.11)(postgres@3.4.8))(next@16.1.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vitest@4.0.18(@types/node@22.15.3)(tsx@4.21.0)): + better-auth@1.4.18(drizzle-kit@0.31.8)(drizzle-orm@0.45.1(kysely@0.28.11)(postgres@3.4.8))(next@16.1.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(vitest@4.0.18(@types/node@22.15.3)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)): dependencies: '@better-auth/core': 1.4.18(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.0) '@better-auth/telemetry': 1.4.18(@better-auth/core@1.4.18(@better-auth/utils@0.3.0)(@better-fetch/fetch@1.1.21)(better-call@1.1.8(zod@4.3.6))(jose@6.1.3)(kysely@0.28.11)(nanostores@1.1.0)) @@ -4848,7 +5155,7 @@ snapshots: next: 16.1.0(react-dom@19.2.0(react@19.2.0))(react@19.2.0) react: 19.2.0 react-dom: 19.2.0(react@19.2.0) - vitest: 4.0.18(@types/node@22.15.3)(tsx@4.21.0) + vitest: 4.0.18(@types/node@22.15.3)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0) better-call@1.1.8(zod@4.3.6): dependencies: @@ -4906,6 +5213,8 @@ snapshots: client-only@0.0.1: {} + clsx@2.1.1: {} + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -4960,8 +5269,7 @@ snapshots: defu@6.1.4: {} - detect-libc@2.1.2: - optional: true + detect-libc@2.1.2: {} doctrine@2.1.0: dependencies: @@ -4991,6 +5299,11 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 + enhanced-resolve@5.20.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.2 + es-abstract@1.24.0: dependencies: array-buffer-byte-length: 1.0.2 @@ -5186,17 +5499,17 @@ snapshots: escape-string-regexp@4.0.0: {} - eslint-config-prettier@10.1.1(eslint@9.39.1): + eslint-config-prettier@10.1.1(eslint@9.39.1(jiti@2.6.1)): dependencies: - eslint: 9.39.1 + eslint: 9.39.1(jiti@2.6.1) eslint-plugin-only-warn@1.1.0: {} - eslint-plugin-react-hooks@5.2.0(eslint@9.39.1): + eslint-plugin-react-hooks@5.2.0(eslint@9.39.1(jiti@2.6.1)): dependencies: - eslint: 9.39.1 + eslint: 9.39.1(jiti@2.6.1) - eslint-plugin-react@7.37.5(eslint@9.39.1): + eslint-plugin-react@7.37.5(eslint@9.39.1(jiti@2.6.1)): dependencies: array-includes: 3.1.9 array.prototype.findlast: 1.2.5 @@ -5204,7 +5517,7 @@ snapshots: array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 es-iterator-helpers: 1.2.1 - eslint: 9.39.1 + eslint: 9.39.1(jiti@2.6.1) estraverse: 5.3.0 hasown: 2.0.2 jsx-ast-utils: 3.3.5 @@ -5218,10 +5531,10 @@ snapshots: string.prototype.matchall: 4.0.12 string.prototype.repeat: 1.0.0 - eslint-plugin-turbo@2.7.1(eslint@9.39.1)(turbo@2.8.0): + eslint-plugin-turbo@2.7.1(eslint@9.39.1(jiti@2.6.1))(turbo@2.8.0): dependencies: dotenv: 16.0.3 - eslint: 9.39.1 + eslint: 9.39.1(jiti@2.6.1) turbo: 2.8.0 eslint-scope@8.4.0: @@ -5233,9 +5546,9 @@ snapshots: eslint-visitor-keys@4.2.1: {} - eslint@9.39.1: + eslint@9.39.1(jiti@2.6.1): dependencies: - '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1) + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) '@eslint-community/regexpp': 4.12.2 '@eslint/config-array': 0.21.1 '@eslint/config-helpers': 0.4.2 @@ -5269,6 +5582,8 @@ snapshots: minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.4 + optionalDependencies: + jiti: 2.6.1 transitivePeerDependencies: - supports-color @@ -5414,6 +5729,8 @@ snapshots: gopd@1.2.0: {} + graceful-fs@4.2.11: {} + has-bigints@1.1.0: {} has-flag@4.0.0: {} @@ -5573,6 +5890,8 @@ snapshots: has-symbols: 1.1.0 set-function-name: 2.0.2 + jiti@2.6.1: {} + jose@6.1.3: {} js-tokens@4.0.0: {} @@ -5605,6 +5924,55 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lightningcss-android-arm64@1.32.0: + optional: true + + lightningcss-darwin-arm64@1.32.0: + optional: true + + lightningcss-darwin-x64@1.32.0: + optional: true + + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + locate-path@6.0.0: dependencies: p-locate: 5.0.0 @@ -5763,6 +6131,12 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postcss@8.5.8: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + postgres@3.4.8: {} prelude-ls@1.2.1: {} @@ -6057,6 +6431,12 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} + tailwind-merge@3.5.0: {} + + tailwindcss@4.2.2: {} + + tapable@2.3.2: {} + tinybench@2.9.0: {} tinyexec@1.0.2: {} @@ -6149,13 +6529,13 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.50.0(eslint@9.39.1)(typescript@5.9.2): + typescript-eslint@8.50.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.2): dependencies: - '@typescript-eslint/eslint-plugin': 8.50.0(@typescript-eslint/parser@8.50.0(eslint@9.39.1)(typescript@5.9.2))(eslint@9.39.1)(typescript@5.9.2) - '@typescript-eslint/parser': 8.50.0(eslint@9.39.1)(typescript@5.9.2) + '@typescript-eslint/eslint-plugin': 8.50.0(@typescript-eslint/parser@8.50.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.2))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.2) + '@typescript-eslint/parser': 8.50.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.2) '@typescript-eslint/typescript-estree': 8.50.0(typescript@5.9.2) - '@typescript-eslint/utils': 8.50.0(eslint@9.39.1)(typescript@5.9.2) - eslint: 9.39.1 + '@typescript-eslint/utils': 8.50.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.2) + eslint: 9.39.1(jiti@2.6.1) typescript: 5.9.2 transitivePeerDependencies: - supports-color @@ -6175,7 +6555,7 @@ snapshots: dependencies: punycode: 2.3.1 - vite@7.3.1(@types/node@22.15.3)(tsx@4.21.0): + vite@7.3.1(@types/node@22.15.3)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0): dependencies: esbuild: 0.27.3 fdir: 6.5.0(picomatch@4.0.3) @@ -6186,12 +6566,14 @@ snapshots: optionalDependencies: '@types/node': 22.15.3 fsevents: 2.3.3 + jiti: 2.6.1 + lightningcss: 1.32.0 tsx: 4.21.0 - vitest@4.0.18(@types/node@22.15.3)(tsx@4.21.0): + vitest@4.0.18(@types/node@22.15.3)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0): dependencies: '@vitest/expect': 4.0.18 - '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@22.15.3)(tsx@4.21.0)) + '@vitest/mocker': 4.0.18(vite@7.3.1(@types/node@22.15.3)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0)) '@vitest/pretty-format': 4.0.18 '@vitest/runner': 4.0.18 '@vitest/snapshot': 4.0.18 @@ -6208,7 +6590,7 @@ snapshots: tinyexec: 1.0.2 tinyglobby: 0.2.15 tinyrainbow: 3.0.3 - vite: 7.3.1(@types/node@22.15.3)(tsx@4.21.0) + vite: 7.3.1(@types/node@22.15.3)(jiti@2.6.1)(lightningcss@1.32.0)(tsx@4.21.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.15.3