d7b5988858
Foundation: - CLAUDE.md with full coding rules (tech stack, patterns, redirect rules) - Install @tanstack/react-query, zod, react-hook-form, shadcn/ui deps - CSS variables design system (Tailwind v4 + tw-animate-css) - Shared components: Button, Input, Label, Card, Badge, Separator, Form - PortalLoginShell: two-column login layout (branding left, form right) - PortalNav: shared sidebar nav used by all portals - ReactQueryProvider in root layout - api-client.ts: typed fetch wrapper (no raw fetch in components) Portal isolation: - Sidebar now returns null for all non-chapter routes; portals own their layout - Admin layout: auth guard + PortalNav (slate accent) - Org layout: auth guard + PortalNav (violet accent) - Member layout: server-side cookie check → MemberNav client component - Chapter admin sidebar: PortalNav (blue accent) Login pages (all use react-hook-form + Zod + PortalLoginShell): - /login → defaults next to /search (was /) — fixes redirect bug - /admin/login → replaces /admin - /org/login → replaces /org - /member-login → two-step phone+OTP with proper form validation Portal selector (/) redesigned with accent border-left cards Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
52 lines
1.5 KiB
JSON
52 lines
1.5 KiB
JSON
{
|
|
"name": "@tower/web",
|
|
"version": "0.0.1",
|
|
"scripts": {
|
|
"build": "next build",
|
|
"dev": "next dev --port 3000",
|
|
"start": "next start",
|
|
"test": "jest",
|
|
"lint": "next lint"
|
|
},
|
|
"dependencies": {
|
|
"@hookform/resolvers": "^5.4.0",
|
|
"@radix-ui/react-alert-dialog": "^1.1.17",
|
|
"@radix-ui/react-avatar": "^1.2.0",
|
|
"@radix-ui/react-dialog": "^1.1.17",
|
|
"@radix-ui/react-dropdown-menu": "^2.1.18",
|
|
"@radix-ui/react-label": "^2.1.10",
|
|
"@radix-ui/react-select": "^2.3.1",
|
|
"@radix-ui/react-separator": "^1.1.10",
|
|
"@radix-ui/react-slot": "^1.3.0",
|
|
"@radix-ui/react-toast": "^1.2.17",
|
|
"@radix-ui/react-tooltip": "^1.2.10",
|
|
"@tanstack/react-query": "^5.101.0",
|
|
"@tower/types": "workspace:*",
|
|
"@tower/ui": "workspace:*",
|
|
"class-variance-authority": "^0.7.1",
|
|
"clsx": "^2.1.1",
|
|
"lucide-react": "^1.21.0",
|
|
"next": "^16.0.0",
|
|
"react": "^19.0.0",
|
|
"react-dom": "^19.0.0",
|
|
"react-hook-form": "^7.80.0",
|
|
"tailwind-merge": "^3.6.0",
|
|
"tw-animate-css": "^1.4.0",
|
|
"zod": "^3.23.0"
|
|
},
|
|
"devDependencies": {
|
|
"@tailwindcss/postcss": "^4.0.0",
|
|
"@testing-library/jest-dom": "^6.0.0",
|
|
"@testing-library/react": "^16.0.0",
|
|
"@types/node": "^22.0.0",
|
|
"@types/react": "^19.0.0",
|
|
"@types/react-dom": "^19.0.0",
|
|
"jest": "^29.0.0",
|
|
"jest-environment-jsdom": "^29.0.0",
|
|
"postcss": "^8.0.0",
|
|
"tailwindcss": "^4.0.0",
|
|
"ts-jest": "^29.0.0",
|
|
"typescript": "^5.7.0"
|
|
}
|
|
}
|