/* 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 (
<>
Order on Wolt →
setMenuOpen(true)} aria-label="Open menu" style={hamburgerStyle}>☰
{menuOpen && (
)}
>
);
}
// ==================== 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.
★ Rating
4.9 / 5.0
Based on 281 reviews
Address
Savilankatu 6
26100 Rauma, Finland
Today
{status.label}
Dine-in · Takeaway · Delivery
);
}
// ==================== 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.
{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} }
);
}
// ==================== 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.
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
);
}
// ==================== INFO / VISIT ====================
function Info({ status }) {
const todayIdx = new Date().getDay();
return (
05 /
Visit
Find us. Eat well.
Address
Savilankatu 6
26100 Rauma, Finland
Social
Facebook
{' · '}
TikTok
Follow for daily specials and what's coming off the spit
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') : ''}
);
})}
);
}
// ==================== FOOTER ====================
function Footer() {
return (
{/* Column 1 — Logo + tagline + social */}
Hand-carved döner. Straight from our house-baked seasons tradition — built on a recipe straight out of Berlin, served fresh in Savilankatu.
{/* Column 2 — Visit Us + Map */}
{/* Column 3 — Contact */}
{/* Column 4 — Opening Hours */}
Opening Hours
Monday: 10:30–21:00
Tuesday: 10:30–21:00
Wednesday: 10:30–21:00
Thursday: 10:30–21:00
Friday: 10:30–22:00
Saturday: 11:00–22:00
Sunday: 11:00–21:00
{/* Bottom bar */}
);
}
// ==================== 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 ? (
window.scrollTo({ top: 0, behavior: 'smooth' })}
style={{
position: 'fixed', bottom: '2rem', right: '2rem', zIndex: 999,
width: 48, height: 48, borderRadius: '50%',
background: 'var(--cyan)', border: 'none', cursor: 'pointer',
display: 'flex', alignItems: 'center', justifyContent: 'center',
fontSize: 22, color: '#0a0a0a', boxShadow: '0 4px 16px rgba(0,0,0,0.4)'
}}
>↑
) : 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.
‹
= maxIndex} style={arrowStyle(currentIndex >= maxIndex)} aria-label="Next">›
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}
))}
);
}
// ==================== 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 (
<>
>
);
}
ReactDOM.createRoot(document.getElementById('root')).render( );