Premium self-marketing website for a freelance business building websites and AI agents for small businesses. Apple-inspired feel: clean spacing, bold typography, smooth scroll animations, floating glass cards, and mouse-driven parallax.
| Layer | Choice | Why |
|---|---|---|
| Build | Vite 5 | Instant HMR, tiny bundles |
| UI | React 18 + TypeScript | Component model, type safety |
| Animation | Framer Motion 11 | Spring physics, scroll triggers |
| Styles | CSS Custom Properties | Full design control, zero runtime cost |
| Forms | Formspree | Serverless email delivery, no backend needed |
npm install
npm run dev # http://localhost:5173
npm run build # production build → dist/
npm run preview # preview production buildCopy .env.example to .env.local and fill in your Formspree ID before testing the contact form.
velora/
├── index.html
├── package.json
├── vite.config.ts
├── tsconfig.json
├── tsconfig.node.json
├── .env.example # environment variable template (safe to commit)
└── src/
├── vite-env.d.ts # Vite + CSS module type declarations
├── main.tsx # React root, global CSS imports
├── App.tsx # App shell, section assembly
├── components/
│ ├── Navbar.tsx / .module.css
│ ├── Hero.tsx / .module.css
│ ├── Services.tsx / .module.css
│ ├── ServiceCard.tsx
│ ├── FeatureShowcase.tsx / .module.css
│ ├── Process.tsx / .module.css
│ ├── AIAgents.tsx / .module.css
│ ├── Portfolio.tsx / .module.css
│ ├── About.tsx / .module.css
│ ├── Testimonials.tsx / .module.css
│ ├── Pricing.tsx / .module.css
│ ├── FAQ.tsx / .module.css
│ ├── Contact.tsx / .module.css
│ └── Footer.tsx / .module.css
├── data/
│ ├── services.ts # Service card content
│ ├── features.ts # Feature showcase tabs
│ └── projects.ts # Portfolio case studies
├── hooks/
│ └── useMouseParallax.ts
├── utils/
│ └── validation.ts # Frontend form validation
└── styles/
├── variables.css # Design tokens (single source of truth)
├── globals.css # Reset, base styles, utility classes
└── animations.css # Keyframes + animation utility classes
Hero → Services → Feature Showcase → Process → AI Agents → Portfolio → About → Testimonials → Pricing → FAQ → Contact → Footer
package.json— React 18, Framer Motion, Vite 5, TypeScriptindex.html— HTML shell, SEO meta tags, Open Graph, Google Fonts (Inter + Space Grotesk)
vite.config.ts— Vite + React plugintsconfig.json+tsconfig.node.json— strict TypeScript configsrc/main.tsx— React root, CSS import ordersrc/App.tsx— App shell (grows as sections are added)
src/styles/variables.css— all CSS custom properties: colors, gradients, glass, type scale, spacing, radius, shadows, animation timing, z-indexsrc/styles/globals.css— reset, html/body base, scrollbar, selection, focus states, typography, utility classes
src/styles/animations.css— all@keyframes(float, pulse-glow, orb-drift, fade-in-up, scale-in, shimmer) + stagger delayssrc/components/Navbar.tsx+Navbar.module.css— fixed header, transparent to glass on scroll, mobile full-screen overlay, Space Grotesk gradient logo
src/hooks/useMouseParallax.ts— spring-smoothed mouse parallax, respectsprefers-reduced-motionsrc/components/Hero.tsx+Hero.module.css— full-viewport hero, 6 floating interactive glass cards (website mockup, live leads feed, AI chat, performance score, analytics, automation), mouse parallax at distinct depths per card, staggered entrance animations
src/data/services.ts— typed service datasrc/components/Services.tsx+Services.module.css— 3-col responsive glass card grid, SVG icon map, scroll-reveal with stagger
src/components/ServiceCard.tsx— reusable service card componentsrc/components/FeatureShowcase.tsx+FeatureShowcase.module.css— tabbed section with layoutId sliding indicator, 6 business-type visual mockups
src/data/features.ts— feature showcase tab contentsrc/components/Process.tsx+Process.module.css— 6-step workflow, staggered grid with ghost numbers and stroke SVG icons
src/components/AIAgents.tsx+AIAgents.module.css— AI agents explainer with live cycling task feed, floating capability chipssrc/data/projects.ts— portfolio case study data
src/components/Portfolio.tsx+Portfolio.module.css— 2-col case study cards, accent stripe, dl/dt/dd PSR rowssrc/components/About.tsx+About.module.css— two-col layout, gradient avatar, stats, skill tags, dual CTAs
src/utils/validation.ts— frontend form validationsrc/components/Contact.tsx+Contact.module.css— contact form, AnimatePresence form/success transition, char counter, Formspree integration
src/components/Footer.tsx+Footer.module.css— 4-col responsive footer, social icons, response badge, copyright bar
src/components/Contact.tsx— updatedsubmitFormto POST to Formspree (VITE_FORMSPREE_ID).env.example— environment variable template
src/components/Pricing.tsx+Pricing.module.css— launch special banner, two-tier pricing ($150 website / $200 website + chatbot), metric stat block, inline badge fix
src/components/FAQ.tsx+FAQ.module.css— accordion (one open at a time), AnimatePresence height animation, 7 pre-answered objections
src/components/Testimonials.tsx+Testimonials.module.css— 3-col glass cards, gradient open-quote mark, star ratings, stagger reveal. Replace placeholder quotes with real client feedback before going live.
/* Brand colors */
--color-violet: #7c3aed
--color-cyan: #06b6d4
--color-bg: #08080f
/* Key gradients */
--gradient-brand: linear-gradient(135deg, #7c3aed 0%, #06b6d4 100%)
--glass-bg: rgba(255, 255, 255, 0.04)
--glass-border: 1px solid rgba(255, 255, 255, 0.08)
/* Utility classes (from globals.css) */
.container → max-width 1200px, responsive padding
.section → section padding-block
.gradient-text → brand gradient applied to text
.glass-card → glass morphism card base
.btn-primary → gradient CTA button
.btn-secondary → ghost/glass button
.section-label → violet eyebrow text (uppercase, spaced)
.section-heading → large section title
.section-subtext → muted paragraph below heading- No API keys, secrets, or credentials in frontend code
VITE_FORMSPREE_IDis not sensitive (it is a public form endpoint) but is kept in.env.localfor easy swapping between environments- All user inputs validated on the frontend in
utils/validation.ts; Formspree runs its own backend validation - No
dangerouslySetInnerHTMLused anywhere - Frontend source is always visible via DevTools — this is by design
npm run build # outputs to dist/
npm run preview # preview the production build locallyDeploy dist/ to Vercel (zero config for Vite):
- Push the repo to GitHub
- Import the repo at vercel.com
- Add environment variable:
VITE_FORMSPREE_ID= your form ID - Set a custom domain in the Vercel dashboard
- Replace placeholder testimonials in
Testimonials.tsxwith real client quotes - Replace placeholder case studies in
src/data/projects.tswith real work - Swap the About section bio with real personal copy
- Update social
hrefvalues inFooter.tsxwith real LinkedIn, GitHub, X URLs - Add
VITE_FORMSPREE_IDas an environment variable in the Vercel dashboard