Yusuf Kebab.
A Turkish grill in Bucharest wanted a dark, atmospheric site with real food photography. The build carries a floating-ember effect that costs the browser zero JavaScript per frame.
- Role
- Design + Build
- Timeline
- 2026-04-29 to 2026-05-01, 9 commits
- Live URL
- yusuf-kebab.vercel.app ↗
01 / THE REQUEST
Cinematic,not another menu PDF.
Bucharest, Romania. A Turkish grill wanted the site to feel like the food: dark, mood-lit, atmospheric, with delivery links front and center for Glovo and Wolt (src/data/site.ts:16), RON pricing, and a real address, not a template with stock photography.
02 / THE PROBLEM
Atmosphere costsframe time.
An ember/particle effect run in JavaScript means a per-frame loop computing position, opacity and drift for every particle, competing with everything else on the main thread. On a restaurant site loaded mostly on phones over restaurant wifi, that is exactly the wrong place to spend a frame budget.
03 / THE CHALLENGE
Zero JS,every frame.
The ember field is a frozen 16-entry seed table (src/components/effects/EmberField.tsx:9-26) written once as inline CSS custom properties, which GPU-composited keyframe animations then consume (src/app/globals.css:97-110). There is no animation loop: the browser's compositor handles every frame after the initial paint.
Because the seed table is a fixed array evaluated the same way on server and client, there is no hydration mismatch, the thing a random-per-render particle system would hit immediately in a server-rendered React app. About 20 named keyframes drive the full effect, with a blanket prefers-reduced-motion override (globals.css:780-800) that disables the whole system for users who ask for it.
Food photography was compressed with a WebP pass that cut roughly 8 MB down to 3.4 MB, the difference between a fast-loading gallery and a stall on a restaurant's phone-heavy traffic.
04 / THE SOLUTION
What gotbuilt.
CSS-only ember field
A frozen seed table drives GPU-composited keyframes. Zero JavaScript per frame, no hydration mismatch.
Reduced-motion override
A single blanket rule disables the entire effect system for users who ask for less motion.
Compressed food photography
WebP pass cut the gallery from roughly 8 MB to 3.4 MB.
Delivery-first layout
Real Bucharest address, RON pricing, direct Glovo and Wolt links.
05 / THE RESULT
Three days,nine commits.
- Liveyusuf-kebab.vercel.app
- Build window2026-04-29 to 2026-05-01, 9 commits
- Handed offFull source and deployment access
- Owns the codeClient
BUILT WITH
Want a site that sets the mood?
Next project
scroll-craft