# STACK.md — exact dependencies ## package.json deps (pin to these majors) ```json { "dependencies": { "@gsap/react": "^2.1.2", "clsx": "^2.1.1", "gsap": "^3.15.0", "lenis": "^1.3.23", "motion": "^12.38.0", "next": "^16.2.6", "react": "^19.2.4", "react-dom": "^19.2.4", "tailwind-merge": "^3.6.0" }, "devDependencies": { "@tailwindcss/postcss": "^4", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", "tailwindcss": "^4", "typescript": "^5" } } ``` Optional (only if needed): - `@base-ui/react` — accessible primitives (popovers, dialogs). - `class-variance-authority` — variant components. - `lucide-react` — icon set (avoid if possible, prefer inline SVG). - `next-themes` — dark mode (not required; deck variants handle theming per slide). - `shadcn` — only if installing shadcn components. - `tw-animate-css` — only if you want CSS animations utilities. ## scripts ```json { "scripts": { "dev": "next dev", "build": "next build", "start": "next start", "lint": "eslint", "typecheck": "tsc --noEmit" } } ``` ## Node Node 20 LTS or newer. Vercel default Node 24 LTS is fine. ## Fonts Self-hosted via `next/font/google`. No external CSS imports. ```ts import { DM_Serif_Text, Nunito_Sans } from "next/font/google"; const nunito = Nunito_Sans({ variable: "--font-nunito", subsets: ["latin"], weight: ["300","400","500","600","700","800"], display: "swap", }); const dmSerif = DM_Serif_Text({ variable: "--font-dm-serif", subsets: ["latin"], weight: ["400"], style: ["normal","italic"], display: "swap", }); ``` ## Tailwind v4 note Tailwind v4 reads tokens from CSS `@theme inline { ... }`. There is no `tailwind.config.ts`. All custom palette / fonts / radii live inside `app/globals.css`. See `files/globals.css`. ## tsconfig essentials - `"strict": true` - `"moduleResolution": "bundler"` - `"jsx": "react-jsx"` - `"paths": { "@/*": ["./*"] }` See `files/tsconfig.json` for the full file.