One-page portfolio/lead-gen site. Dark, motion-rich, bilingual (EN/FA + RTL).
npm install
npm run dev # http://localhost:5173
npm run build # dist/ → Cloudflare PagesSearch [TODO-handle] and [TODO-number] in the codebase — they appear in:
src/components/Header.tsx(Telegram CTA)src/components/Hero.tsxsrc/components/Contact.tsxsrc/components/Footer.tsx
Replace https://t.me/[TODO-handle] with your real Telegram link and tel:[TODO-number] with your phone.
All visible text lives in two files:
src/lib/i18n/en.ts— Englishsrc/lib/i18n/fa.ts— Persian (Farsi)
Every placeholder is marked [TODO]. Find them with:
grep -r "\[TODO" src/lib/i18n/src/data/index.ts — workItems array. The first item (behkame) is live. Add real projects or replace the three placeholder: true entries.
src/data/index.ts — techStack array. Update with your actual tools.
src/lib/i18n/en.ts and fa.ts — whyUs.stats array. Replace values and labels.
src/lib/i18n/context.tsx line 8:
const PERSIST = true // set false to reset to EN on every page load- Push to GitHub
- In Cloudflare Pages: connect repo, build command
npm run build, outputdist - Done —
public/_redirectshandles SPA routing
All animations check prefers-reduced-motion via useReducedMotion() in src/lib/motion/index.ts. When active: Lenis smoothing off, no path-draw, no scroll-scrub, no parallax — final states render immediately.