AMS Frontend
Tech stack: React 18, Vite, TypeScript, TanStack Router, TanStack Query, Shadcn UI, Tailwind, Zustand. GraphQL via Keycloak OIDC auth.
Commands
- Dev:
pnpm run dev(port 5173) - Build:
pnpm run build| Lint:pnpm run lint| Codegen:npx graphql-codegen
Key conventions
@/alias forsrc/- GraphQL:
TypedDocumentStringfrom generated types; OIDC token fromuseAuth().user?.access_token - Queries:
useGraphQLQuery+ centralized keys fromsrc/lib/query-keys.ts - Mutations:
useGraphQLMutationNewwith selector - Auth:
RequireAuthwraps all routes; authenticated routes underroutes/_authenticated/ - i18n:
src/lib/i18n/translations/{en,ja,de}/— all user-facing text must be translated; uset()hook - Error handling:
src/lib/handle-server-error.ts; 401 redirects to sign-in
Route structure
- Personal workspace:
src/routes/_authenticated/p/$workspaceSlug/ - Org workspace:
src/routes/_authenticated/o/$orgSlug/ - Use
getRouteApi('/path/').useParams()— no path duplication - Workspace slugs: unique within a user; team slugs: unique within a workspace
Workspace resolution from URL (use-bootstrap.ts)
/o/.../w/{slug}/...→ match by workspaceslug/o/{orgSlug}/...(no/w/) → match byentitySlug— covers org-level admin paths/p/{slug}/...→ match by workspaceslug
Step 2 must never be removed — it makes page refresh work on org-level paths without /w/.
Sidebar navigation
Always read docu/docs/domain/navigation.md before modifying sidebar structure, URLs, or groups. Three sidebar types: Staff (org STAFF/MIXED), Client (org CLIENT), Personal. Configuration group (Documents, Templates, Roles & Permissions) is flat.
Build errors vs. warnings
See docu/docs/ai/claude/rules/frontend-build.md.