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