function Home() { const { go, m, open, avail, addPreset, pick, soon } = useShop(); const left = FLAVORS.reduce((s, f) => s + avail(f.id), 0), total = FLAVORS.reduce((s, f) => s + f.stock, 0) + 40; const steps = [['01', 'Compose ta box', 'Box de ' + SIZES.join(', ') + ' ou +. Tu choisis chaque cookie.'], ['02', 'Commande en semaine', 'Tu réserves jusqu’à vendredi, on cuit pour samedi ou dimanche. Retrait ou livraison* dès ' + CFG.deliveryMin + ' pièces.', '*Des frais de livraison s’appliquent.'], ['03', 'Tu paies à la remise', 'Rien à payer en ligne. Confirmation envoyée par mail.']]; return (
{open ? (m ? CFG.openTextShort : CFG.openText) : 'Pre-orders closed'} CRAVE. Cookies & pastries
Comment ça marche
{steps.map(s => (
{s[0]} {s[1]} {s[2]} {s[3] ? {s[3]} : null}
))}
{'Six parfums.\nUn seul problème.'}choisir. 5€ le cookie.
{!m ? : null}
{soon ? : null}
Pas envie
de choisir ?
Nos box prêtes, en un clic.
{PRESETS.map((b, i) => { const bg = ['#8E2F3A', '#B5652A', '#372008'][i]; const uniq = [...new Set(b.items)]; return (
0{i + 1} / 0{PRESETS.length} {b.price ? Offre
-5€
: b.tag}
{b.name}
{uniq.map((id, k) => )} {boxLabel(b.size)} · {uniq.length} parfum{uniq.length > 1 ? 's' : ''}
{euroShort(boxPrice(b))}{b.price ? {euroShort(sizePrice(b.size))} : null}
); })}
{[['/wp-content/themes/crave/assets/img/street-box.png', 'Seen in Brussels'], ['/wp-content/themes/crave/assets/img/box-coffee.png', 'Slow sunday'], ['/wp-content/themes/crave/assets/img/cookie-split-hand.png', 'Pull it apart']].map(([src, t]) => (
{t}
))}
Vos avisReçus en DM. Non retouchés.
{CFG.instagram}
{[['Tiramisu incrooooooyable', 'DM · Instagram', -1.5], ['J’ai connue diams et tes cookies on peut m’ôter l’âme mtn c’est bon', 'DM · Instagram', 1]].map(([q, src, r], i) => (
“
{q}
{src} ♥
))}
Ton avis ici ? Goûte, envoie-nous un DM, et tu finis peut-être sur cette page. e.preventDefault()} className="btn btn-dark btn-sm" style={{ marginTop: 'auto', alignSelf: 'flex-start' }}>Écrire en DM
{'Ton week-end\nmérite un cookie.'}
); } function ComingSoon({ compact }) { const { m, notify } = useShop(); const [mail, setMail] = useState(''); const [done, setDone] = useState(false); const ok = /^\S+@\S+\.\S+$/.test(mail); return (
Coming
soon
Bientôt,
plus que des cookies.
CRAVE. prépare ses pâtisseries. On ne dit rien de plus, pour l’instant.
Sois prévenu·e en premier {done ?
C’est noté. On t’écrit au lancement.
: (
setMail(e.target.value)} placeholder="ton email" onKeyDown={e => { if (e.key === 'Enter' && ok) { setDone(true); notify(); } }} />
)}
); } function FlavorList() { const { go, m, avail, pick } = useShop(); const [hov, setHov] = useState(null); const [pos, setPos] = useState({ x: 0, y: 0 }); const ref = useRef(null); return (
{ const r = ref.current.getBoundingClientRect(); setPos({ x: e.clientX - r.left, y: e.clientY - r.top }); }} onMouseLeave={() => setHov(null)} style={{ position: 'relative', borderBottom: '1px solid rgba(244,240,231,.15)' }}> {FLAVORS.map((f, i) => ( ))} {!m && hov ?
: null}
); } function StockTag({ n }) { return null; if (n <= 0) return Sold out; if (n <= 6) return Plus que {n}; return {n} dispo; } function Menu() { const { go, m, add, avail, open, pick, soon } = useShop(); return (
Le menu5€ le cookie · 150/160 gr
{!m ? : null}
{FLAVORS.map(f => { const n = avail(f.id); return (
pick(f.id)} style={{ background: f.color, padding: m ? '22px 14px 16px' : '40px 30px 26px', position: 'relative', overflow: 'hidden' }}>
{n <= 0 ?
Sold out · sold out · sold out
: null}
{f.name} {f.desc} {f.chips ? Pépites · {f.chips} : null}
{euroShort(PRICE)}{!m ? : null}
); })}
{soon ?
: null}
); } function Product({ id }) { const { go, m, add, avail, open } = useShop(); const f = FL[id]; const n = avail(id); const [q, setQ] = useState(1); useEffect(() => setQ(1), [id]); const others = FLAVORS.filter(x => x.id !== id); return (
{f.name}
/{f.name}
{f.name} {f.desc}

{f.long}

{f.chips ? Pépites de chocolat · {f.chips} : null}
{[['Prix', euroShort(PRICE) + ' / pièce'], ['Poids', '150/160 gr'], ['Retrait', 'samedi & dimanche'], ['Allergènes', 'sur demande en DM']].map(([k, v]) => (
{k}{v}
))}
{q}
Les autres
{others.map((o, i) => )}
); } function About() { const { m, go } = useShop(); return (
{'Made in Brussels.\nCraved everywhere.'}
À propos

Des cookies épais, généreux, cuits en petites fournées à Bruxelles.

On ouvre les pré-commandes pour le week-end, on cuit pour toi, et tu viens les chercher, ou on te les livre. Pas de vitrine, pas de stock qui traîne : chaque cookie part le jour où il sort du four.

); } function Faq() { const { m } = useShop(); const [o, setO] = useState(0); const qs = [ ['Quand puis-je commander ?', 'En semaine, jusqu’à vendredi, pour un retrait ou une livraison le samedi ou le dimanche.'], ['Combien de cookies minimum ?', CFG.minPieces + ' cookies, en box de ' + CFG.minPieces + '. Ensuite box de ' + SIZES.filter(n => n > CFG.minPieces).join(', ') + ' ou plus, comme tu veux. ' + euroShort(PRICE) + ' le cookie.'], ['Vous livrez ?', 'Livraison disponible dès ' + CFG.deliveryMin + ' pièces*, autour de ' + CFG.delivery.label + ' (jusqu’à ' + Math.max(...CFG.delivery.tiers.map(t => t.km)) + ' km). Frais calculés automatiquement selon ton adresse : ' + CFG.delivery.tiers.map(t => (t.fee > 0 ? euroShort(t.fee) : 'gratuit') + ' jusqu’à ' + t.km + ' km').join(', ') + '. En dessous de ' + CFG.deliveryMin + ' pièces, c’est retrait uniquement.'], ['Comment je paie ?', 'À la remise de ta commande. Rien à payer en ligne.'], ['Je reçois une confirmation ?', 'Oui, un mail automatique récapitule ta commande, ton jour et l’heure exacte. Retrait : ' + SLOTS.pickup + ' · livraison : ' + SLOTS.delivery + '.'], ['Je peux modifier ma commande ?', 'Envoie-nous un DM ' + CFG.instagram + ' avec ton numéro de commande.'], ['Et les allergènes ?', 'Demande-nous en DM, on te répond pour chaque parfum.'], ]; return (
FAQTout ce qu’il faut savoir avant de craquer.
{qs.map(([q, a], i) => (

{a}

))}
); } Object.assign(window, { ComingSoon, Home, Menu, Product, About, Faq, StockTag });