/* Berlin Döner Rauma — main app */ const THEME_URL = (document.getElementById('berlin-doner-app-js')?.src.replace('/assets/app.jsx', '').split('?')[0]) || 'https://berlin2.demowpsite.com/wp-content/themes/berlin-doner-rauma'; const { useState, useEffect, useMemo, useRef } = React; // ==================== HELPERS ==================== function fmtEUR(n) { return n.toFixed(2).replace('.', ','); } function getStatus() { const now = new Date(); const day = now.getDay(); const mins = now.getHours() * 60 + now.getMinutes(); const today = HOURS.find(h => h.dayIdx === day); if (!today) return { open: false, label: 'Closed' }; const [oh, om] = today.open.split(':').map(Number); const [ch, cm] = today.close.split(':').map(Number); const oMin = oh * 60 + om; const cMin = ch * 60 + cm; if (mins >= oMin && mins < cMin) { return { open: true, label: `Open until ${today.close}` }; } return { open: false, label: `Opens ${today.open}` }; } // ==================== NAV ==================== const overlayLinkStyle = { fontFamily: "Anton, 'Bebas Neue', sans-serif", fontSize: 'clamp(2.5rem, 8vw, 4rem)', color: '#f5f1e8', textDecoration: 'none', textTransform: 'uppercase', letterSpacing: '0.05em', transition: 'color 0.2s', }; const hamburgerStyle = { width: 40, height: 40, borderRadius: 8, border: '1px solid rgba(245,241,232,0.3)', background: 'transparent', color: '#7dddd8', fontSize: 18, display: 'flex', alignItems: 'center', justifyContent: 'center', cursor: 'pointer', }; function Nav({ status }) { const [menuOpen, setMenuOpen] = useState(false); useEffect(() => { function onKey(e) { if (e.key === 'Escape') setMenuOpen(false); } document.addEventListener('keydown', onKey); return () => document.removeEventListener('keydown', onKey); }, []); return ( <> {menuOpen && (
setMenuOpen(false)} style={overlayLinkStyle} onMouseEnter={e => e.currentTarget.style.color = '#7dddd8'} onMouseLeave={e => e.currentTarget.style.color = '#f5f1e8'}>About setMenuOpen(false)} style={overlayLinkStyle} onMouseEnter={e => e.currentTarget.style.color = '#7dddd8'} onMouseLeave={e => e.currentTarget.style.color = '#f5f1e8'}>Menu setMenuOpen(false)} style={overlayLinkStyle} onMouseEnter={e => e.currentTarget.style.color = '#7dddd8'} onMouseLeave={e => e.currentTarget.style.color = '#f5f1e8'}>Ice Cream setMenuOpen(false)} style={overlayLinkStyle} onMouseEnter={e => e.currentTarget.style.color = '#7dddd8'} onMouseLeave={e => e.currentTarget.style.color = '#f5f1e8'}>Gallery setMenuOpen(false)} style={overlayLinkStyle} onMouseEnter={e => e.currentTarget.style.color = '#7dddd8'} onMouseLeave={e => e.currentTarget.style.color = '#f5f1e8'}>Contact Order on Wolt →
)} ); } // ==================== HERO ==================== function Hero({ status, onOrder }) { return (
Est. Rauma · Authentic Berlin Recipe

Berlin
Döner
in Rauma.

Hand-carved döner stacked into our house-baked sesame flatbread — built on a recipe straight out of Berlin, served fresh on Savilankatu.

See the Menu → Order Now
From
€12,90
★ Rating
4.9 / 5.0
Based on 281 reviews
Address
Savilankatu 6
26100 Rauma, Finland
Today
{status.label}
Dine-in · Takeaway · Delivery
Reserve
+358 41 3262052
Walk-ins welcome
); } // ==================== MARQUEE ==================== function Marquee() { const items = ['Authentic Berlin Recipe', 'Hand-Carved Daily', 'House-Baked Bread', '100% Fresh', 'Made in Rauma', 'Since Day One', 'Crew of Two Bears']; return (
{[...items, ...items, ...items].map((t, i) => ( {t} ))}
); } // ==================== STORY ==================== function Story({ showStamp }) { return (
01 / Our Story

From Berlin
to Rauma.

The Berlin döner isn't just a sandwich — it's a 1970s Berlin invention, a city's after-work ritual, a street-food icon. We brought that exact recipe to Rauma's Savilankatu: vertical-spit roasted meat, sesame-crusted bread baked in-house, the same chili and yogurt sauces a Berlin kebabçı would recognize.

100%
Fresh ingredients
7
Days a week
4.9★
Customer rating
€12,90
Starting price
{showStamp && (
Authentic
Berlin
Recipe
★ ★ ★ ★ ★
)}
); } // ==================== MENU ==================== function MenuSection() { const [tab, setTab] = useState('signature'); const [currentIndex, setCurrentIndex] = useState(0); const [isMobile, setIsMobile] = useState(false); useEffect(() => { function update() { setIsMobile(window.innerWidth <= 768); } update(); window.addEventListener('resize', update); return () => window.removeEventListener('resize', update); }, []); const groups = { signature: { title: 'Signature Döners', items: MENU.signature, num: '02' }, meals: { title: 'Combo Meals', items: MENU.meals, num: '03' }, drinks: { title: 'Drinks', items: MENU.drinks, num: '04' }, }; const g = groups[tab]; const gap = 16; const visibleCount = isMobile ? 1 : 3; const cardWidth = isMobile ? Math.round(window.innerWidth * 0.85) : 320; const maxIndex = Math.max(0, g.items.length - visibleCount); const safeIndex = Math.min(currentIndex, maxIndex); const translateX = safeIndex * (cardWidth + gap); function switchTab(k) { setTab(k); setCurrentIndex(0); } const prev = () => setCurrentIndex(i => Math.max(0, i - 1)); const next = () => setCurrentIndex(i => Math.min(maxIndex, i + 1)); const arrowStyle = (disabled) => ({ width: 44, height: 44, borderRadius: '50%', border: `1px solid ${disabled ? 'rgba(255,255,255,0.1)' : 'var(--cyan)'}`, background: disabled ? 'transparent' : 'var(--cyan)', color: disabled ? 'rgba(255,255,255,0.25)' : '#0a0a0a', fontSize: 22, cursor: disabled ? 'not-allowed' : 'pointer', display: 'flex', alignItems: 'center', justifyContent: 'center', transition: 'all 0.2s', lineHeight: 1, }); return ( ); } function MenuItem({ item, num, compact }) { const tagClass = item.tag === 'Hot' ? 'hot' : item.tag === 'Light' ? 'veg' : ''; return (
N°{String(num).padStart(2, '0')} {item.tag && !compact && {item.tag}}
{item.name}
{item.desc}
{fmtEUR(item.price)}
); } // ==================== ORDER STRIP ==================== function OrderStrip() { return (
→ Delivery

Order on Wolt.
To your door.

Hot, fast, fresh — we deliver across Rauma through Wolt. Sesame bread still warm by the time it reaches you.

Order via Wolt →
Wolt
→ Takeaway

Call ahead.
Skip the wait.

Phone in your order and we'll have it carved, packed and ready for pickup at Savilankatu 6.

Call +358 41 326 2052
Call
); } // ==================== INFO / VISIT ==================== function Info({ status }) { const todayIdx = new Date().getDay(); return (
05 / Visit

Find us.
Eat well.

Address
Savilankatu 6 26100 Rauma, Finland
Phone
+358 41 326 2052 Walk-ins welcome — call ahead for large orders
Social
Facebook {' · '} TikTok Follow for daily specials and what's coming off the spit
Map
Open in Google Maps → 2 min walk from Rauma centre
06 / Opening Hours
{HOURS.map(h => { const isToday = h.dayIdx === todayIdx; return (
{h.day} {h.badge && {h.badge}}
{h.open}–{h.close}
{isToday ? (status.open ? 'OPEN' : 'CLOSED') : ''}
); })}
Savilankatu 6
); } // ==================== FOOTER ==================== function Footer() { return ( ); } // ==================== CART DRAWER ==================== function CartDrawer({ open, onClose, cart, onChange }) { const subtotal = cart.reduce((s, l) => s + l.price * l.qty, 0); const items = cart.reduce((s, l) => s + l.qty, 0); return ( <>
); } // ==================== SCROLL TO TOP ==================== function ScrollToTop() { const [visible, setVisible] = React.useState(false); React.useEffect(() => { const onScroll = () => setVisible(window.scrollY > 400); window.addEventListener('scroll', onScroll); return () => window.removeEventListener('scroll', onScroll); }, []); return visible ? ( ) : null; } // ==================== ICE CREAM ==================== const ICE_CREAM = [ { name: 'Cherry', img: 'assets/icecream/Cherry-kirsikka.png' }, { name: 'Mango Yogurt', img: 'assets/icecream/Mango yogurt-mangojogurtti-etusivu.png' }, { name: 'Chili Chocolate Orange', img: 'assets/icecream/Chili chocolate orange-chili-suklaa-appelsiini.png' }, { name: 'Superman', img: 'assets/icecream/SUPERMAN-Superman-Azzurro.png' }, { name: 'Licorice', img: 'assets/icecream/Licorice-lakritsi.png' }, { name: 'Creme Brulee', img: 'assets/icecream/Creme Brulee-Creme-Brulee-Crema-Catalana.png' }, { name: 'Stracciatella', img: 'assets/icecream/Stracciatella-Stracciatella.png' }, { name: 'Orange', img: 'assets/icecream/Orange-Appelsiini.png' }, ]; function IceCream() { const [currentIndex, setCurrentIndex] = useState(0); const [isMobile, setIsMobile] = useState(false); const containerRef = useRef(null); const [containerWidth, setContainerWidth] = useState(0); useEffect(() => { function update() { setIsMobile(window.innerWidth <= 768); if (containerRef.current) setContainerWidth(containerRef.current.offsetWidth); } update(); window.addEventListener('resize', update); return () => window.removeEventListener('resize', update); }, []); const gap = 16; const visibleCount = isMobile ? 1 : 3; const maxIndex = ICE_CREAM.length - visibleCount; const cardWidth = containerWidth > 0 ? (containerWidth - (visibleCount - 1) * gap) / visibleCount : 220; const translateX = currentIndex * (cardWidth + gap); const prev = () => setCurrentIndex(i => Math.max(0, i - 1)); const next = () => setCurrentIndex(i => Math.min(maxIndex, i + 1)); const arrowStyle = (disabled) => ({ width: 44, height: 44, borderRadius: '50%', border: `1px solid ${disabled ? 'rgba(255,255,255,0.1)' : 'var(--cyan)'}`, background: disabled ? 'transparent' : 'var(--cyan)', color: disabled ? 'rgba(255,255,255,0.25)' : '#0a0a0a', fontSize: 22, cursor: disabled ? 'not-allowed' : 'pointer', display: 'flex', alignItems: 'center', justifyContent: 'center', transition: 'all 0.2s', lineHeight: 1, }); return (
New at Berlin Döner

Döner from Germany.
Ice cream from Italy.

We brought the best of both worlds to Rauma. Premium Minetti ice cream — one of the most respected brands on the market — now available alongside our döner.

{ICE_CREAM.map(item => (
{item.name}
{item.name}
))}
); } // ==================== APP ==================== function App() { const status = useMemo(() => getStatus(), []); React.useEffect(() => { document.querySelectorAll('*').forEach(el => { if (el.getBoundingClientRect().right > window.innerWidth + 5) { el.style.maxWidth = '100%'; el.style.overflowX = 'hidden'; } }); }, []); return ( <>