/* Direction 03 — MANIFESTO (v2 · cleaner) Editorial broadside. Bold editorial serif (Bodoni / Cormorant / Newsreader). Lighter warm background, much more breathing room, Bergen color pops. */ const { useState: useState03, useEffect: useEffect03 } = React; function ManifestoDirection({ lang, setLang, accent, products, copy, drop, redactedName, revealAll, palette, showTroll }) { const cart = useCart(); const cd = useCountdown(drop.iso); const paper = "#efe7d6"; const ink = "#222222"; const f = { stack: "'Newsreader', 'Times New Roman', serif", body: 500, display: 600 }; return (
{/* Global mobile clamps — prevents horizontal overflow that otherwise makes mobile Safari auto-zoom out to fit. */}
); } // ───────────────────────────────────────────────────────────────── // NAV — minimal site-level navigation + mobile overlay menu // ───────────────────────────────────────────────────────────────── function MfNav({ lang, setLang, accent, cart, cd, revealAll }) { const pages = window.DROP_DATA.nav.pages; const [open, setOpen] = useState03(false); const [isMobile, setIsMobile] = useState03(typeof window !== 'undefined' && window.innerWidth < 768); useEffect03(() => { const onResize = () => setIsMobile(window.innerWidth < 768); window.addEventListener('resize', onResize); return () => window.removeEventListener('resize', onResize); }, []); // Lock body scroll while mobile overlay is open useEffect03(() => { document.body.style.overflow = open ? 'hidden' : ''; return () => { document.body.style.overflow = ''; }; }, [open]); // Close overlay on Esc useEffect03(() => { if (!open) return; const onKey = (e) => { if (e.key === 'Escape') setOpen(false); }; window.addEventListener('keydown', onKey); return () => window.removeEventListener('keydown', onKey); }, [open]); if (window.AWO_HEADER_RENDERED) return null; return ( <>
{!isMobile && (
№ 01 · {lang === "no" ? "Første utgave" : lang === "es" ? "Primera edición" : "First edition"}
)} { e.preventDefault(); scrollToId("top"); }} style={{ textDecoration: "none", color: accent, display: "flex", alignItems: "center", justifySelf: isMobile ? "start" : "center", }}> {/* Desktop right side */} {!isMobile && (
({String(cart.total).padStart(2, "0")})
)} {/* Mobile right group — language toggle + hamburger */} {isMobile && (
)}
{/* Mobile overlay menu — rendered as a SIBLING of
, not inside. The header uses backdrop-filter which creates a containing block for position:fixed descendants, which would clip the menu to the header. */} {isMobile && open && ( setOpen(false)} /> )} ); } function MobileMenu({ pages, lang, setLang, accent, cart, onClose }) { // Translucent smoked-glass treatment — mirrors the header chrome // (rgba dark + backdrop blur) rather than a solid page. const paper = 'rgba(28,28,28,0.80)'; const ink = '#ece5d8'; const rule = 'rgba(236,229,216,0.14)'; return (
{/* Top bar — logo + close */}
{/* Edition meta strip */}
№ 01 · {lang === 'no' ? 'Første utgave' : 'First edition'} BGO
{/* Primary nav — big numbered serif items, hairline separators */} {/* Secondary links — like the refs (FAQ / Contact / etc) */}
{lang === 'no' ? 'Mer' : lang === 'es' ? 'Más' : 'More'}
{[ { href: awoLink('faq', 'faq/'), en: 'FAQ', no: 'FAQ', es: 'FAQ' }, { href: 'mailto:info@awotowa.com', en: 'Contact', no: 'Kontakt', es: 'Contacto' }, ].map((s, i) => ( {s[lang]} ))}
{/* Footer: lang toggle + cart */}
{lang === 'no' ? 'KURV' : lang === 'es' ? 'CARRITO' : 'CART'} ({String(cart.total).padStart(2, "0")})
); } // ───────────────────────────────────────────────────────────────── // MASTHEAD — magazine cover, asymmetric, cleaner // ───────────────────────────────────────────────────────────────── function MfMasthead({ lang, accent, cd, drop, redactedName, palette }) { return (
{/* huge editorial title — content packs at top, no forced gap */}
{lang === "no" ? "Til den det måtte angå —" : lang === "es" ? "A quien corresponda —" : "To whom it may concern —"}

{lang === "no" ? "Dette" : lang === "es" ? "Esto" : "This"}
{lang === "no" ? "er ikke et" : lang === "es" ? "no es una" : "is not a"}
{lang === "no" ? "MERKE" : lang === "es" ? "MARCA" : "BRAND"} .

{/* footer of masthead */}

{lang === "no" ? "Seks plagg. Én by. Ingen navn. Du leser dette fordi noen mente at du burde." : "Six garments. One city. No name. You are reading this because someone thought you should."}

{lang === "no" ? "Åpner om" : lang === "es" ? "Abre en" : "Opens in"}
{cd.d} {lang === "no" ? "dager" : lang === "es" ? "días" : "days"}
{cd.h}h {cd.m}m {cd.s}s
scrollToId("manifesto")}> {lang === "no" ? "LES BREVET" : lang === "es" ? "LEE LA CARTA" : "READ THE LETTER"} scrollToId("inventory")}> {lang === "no" ? "SE PLAGGENE" : lang === "es" ? "VER LAS PRENDAS" : "SEE THE GARMENTS"}
); } function MfButton({ children, primary, accent, onClick }) { const [hov, setHov] = useState03(false); return ( ); } // ───────────────────────────────────────────────────────────────── // Bergen color strip — under masthead // ───────────────────────────────────────────────────────────────── function MfBergenStrip({ palette }) { const segments = [ palette.red, palette.cream, palette.ochre, palette.copper, palette.orange, palette.cream, palette.red, ]; return (
{segments.map((c, i) => (
))}
); } // ───────────────────────────────────────────────────────────────── // LETTER — single-column letter on warm paper, very editorial // ───────────────────────────────────────────────────────────────── function MfLetter({ lang, accent, copy, revealAll, paper }) { return (
{/* header */}
Letter № 01 Bergen / 14.06.26

{lang === "no" ? "Et brev fra ingen, til hvem som helst." : lang === "es" ? "Una carta de nadie, para cualquiera." : "A letter from no one, to anyone."}

{lang === "no" ? "K" : "Y"}

{lang === "no" ? "Lageret er allerede ferdig. Når seks er borte, er seks borte." : "The inventory is already finished. When six are gone, six are gone."}

{/* signature */}
{lang === "no" ? "Med hilsen," : lang === "es" ? "Atentamente," : "Yours sincerely,"}
{lang === "no" ? "(navn unndratt av forfatteren)" : lang === "es" ? "(nombre omitido por el autor)" : "(name redacted by author)"}
⚑ ANON · BGO
); } // ───────────────────────────────────────────────────────────────── // INVENTORY — alternating asymmetric editorial pairs // ───────────────────────────────────────────────────────────────── function MfInventory({ lang, accent, products, cart }) { const totalUnits = products.reduce((a, p) => a + (Number(p.units) || 0), 0); const hasUnits = products.some(p => p.units != null); return (
{lang === "no" ? "Plagg" : lang === "es" ? "Prendas" : "Garments"} · {String(products.length).padStart(2, "0")}

{lang === "no" ? "Lageret." : lang === "es" ? "El inventario." : "The inventory."}

{hasUnits ? `${totalUnits} ${lang === "no" ? "enheter totalt" : lang === "es" ? "unidades totales" : "units total"}` : (lang === "no" ? "Fast lager" : lang === "es" ? "Inventario fijo" : "Fixed inventory")}
{products.map((p, i) => ( cart.add(p.id)} inCart={cart.items[p.id]} /> ))}
); } function MfProductCard({ p, idx, lang, accent, onAdd, inCart }) { const [hov, setHov] = useState03(false); const align = idx % 2 === 0 ? "right" : "left"; return (
setHov(true)} onMouseLeave={() => setHov(false)}> {align === "right" ? ( <>
) : ( <>
)}
); } function MfPlaceholder({ p, lang, hov }) { return (
); } function MfProductMeta({ p, idx, lang, accent, onAdd, inCart, hov, align }) { return (
№ {String(idx + 1).padStart(2, "0")} · {p.lot}

{txField(p.name, lang)}

{txField(p.cat, lang)}{p.units != null ? ` · ${String(p.units).padStart(3, "0")} ${lang === "no" ? "enheter" : lang === "es" ? "unidades" : "units"}` : ""}
{formatPrice(p.price, lang)} {p.href ? ( {lang === "no" ? "RESERVER" : lang === "es" ? "RESERVAR" : "RESERVE"} → ) : ( )}
); } // ───────────────────────────────────────────────────────────────── // MARGINALIA — dead drops as a literary index // ───────────────────────────────────────────────────────────────── function MfMarginalia({ lang, accent, copy, showTroll }) { return (
{lang === "no" ? "Marginalnotater" : lang === "es" ? "Notas al margen" : "Marginalia"}

{lang === "no" ? "Hvor å finne oss." : lang === "es" ? "Dónde encontrarnos." : "Where to find us."}

{lang === "no" ? "Vi etterlater plagg på fem steder i Bergen, i rotasjon. Det er ingen ordre. Det er ingen kø." : "We leave garments in five places across Bergen, in rotation. There is no order. There is no queue."}

    {copy.deadDrops.items.map((d, i) => { const active = (d.status[lang] === (lang === "no" ? "AKTIV" : lang === "es" ? "ACTIVO" : "ACTIVE")); const dark = (d.status[lang] === (lang === "no" ? "MØRK" : lang === "es" ? "OSCURO" : "DARK")); return (
  1. {d.code} {d.area[lang]} {d.status[lang]} {/* Troll lurks in the DARK drop */} {dark && showTroll && ( )}
  2. ); })}
); } // ───────────────────────────────────────────────────────────────── // FOOTER — magazine colophon // ───────────────────────────────────────────────────────────────── function MfFooter({ lang, accent, drop }) { return (
{lang === "no" ? "Kolofon" : lang === "es" ? "Colofón" : "Colophon"}

{lang === "no" ? "Trykt i Bergen, i et antall ingen vil bekrefte. Ingen reklame ble laget. Ingen e-post ble sendt." : "Printed in Bergen, in numbers no one will confirm. No advertising was made. No e-mail was sent."}

{drop.fileNo} · BGO
© ████ {new Date().getFullYear()}
{lang === "no" ? "Alle rettigheter unndratt" : lang === "es" ? "Todos los derechos reservados" : "All rights withheld"}
{/* small logo + all rights reserved at the very bottom */}
{`© AWOTOWA ${new Date().getFullYear()} · All rights reserved`}
); } Object.assign(window, { ManifestoDirection }); // Small footer-logo wrapper — handles hover-tinting via state, since // the inline-svg Logo takes a `color` prop (not a CSS background). function FooterLogo({ accent }) { const [hov, setHov] = useState03(false); return (
setHov(true)} onMouseLeave={() => setHov(false)} style={{ display: "flex", alignItems: "center" }} >
); }