1234npm create vite@latest my-site -- --template react-ts cd my-site npm install unframer react@19 react-dom@19 npx unframer {projectId} --outDir ./src/framer
src/main.tsx and remove the <StrictMode> wrapper:12345// src/main.tsx import { createRoot } from 'react-dom/client' import App from './App' createRoot(document.getElementById('root')!).render(<App />)
1234567891011121314151617// src/App.tsx import './framer/styles.css' import Header from './framer/header' import Hero from './framer/hero' import Features from './framer/features' import Footer from './framer/footer' export default function App() { return ( <div> <Header /> <Hero.Responsive /> <Features.Responsive /> <Footer /> </div> ) }
npm run dev and open http://localhost:5173.1npm install react-router react-router-dom
12345678910111213141516171819202122232425262728293031// src/main.tsx import { createRoot } from 'react-dom/client' import { BrowserRouter, Routes, Route, useNavigate } from 'react-router-dom' import { UnframerProvider } from 'unframer' import './framer/styles.css' import Home from './pages/Home' import About from './pages/About' function App() { return ( <BrowserRouter> <UnframerProviderWrapper> <Routes> <Route path="/" element={<Home />} /> <Route path="/about" element={<About />} /> </Routes> </UnframerProviderWrapper> </BrowserRouter> ) } function UnframerProviderWrapper({ children }: { children: React.ReactNode }) { const navigate = useNavigate() return ( <UnframerProvider navigate={navigate}> {children} </UnframerProvider> ) } createRoot(document.getElementById('root')!).render(<App />)
UnframerProvider must be inside BrowserRouter because it uses useNavigate(). Wrap it in a separate component as shown above.1npm run build
dist/ folder contains a static site you can deploy to Vercel, Cloudflare Pages, Netlify, or any static hosting.dark class to a parent element. A simple implementation:1234567891011121314import { useState } from 'react' export default function App() { const [dark, setDark] = useState(false) return ( <div className={dark ? 'dark' : ''}> <button onClick={() => { setDark(!dark) }}> Toggle dark mode </button> <Hero.Responsive /> </div> ) }
--unframer-* CSS variables automatically switch to their dark values when the dark class is present.