/* global React */ /* ============================================================ i18n — Wine Exchange (EN · FR · ES · IT) Translated as copy, not word-for-word. The rhyming taglines are crafted per language. ============================================================ */ const { createContext, useContext, useState, useEffect } = React; const LANGS = [ { code: "en", label: "EN" }, { code: "fr", label: "FR" }, { code: "es", label: "ES" }, { code: "it", label: "IT" }]; const TR = { /* ===================== ENGLISH ===================== */ en: { nav: { initiative: "Initiative", openCall: "Open Call", contact: "Contact", apply: "Apply to host" }, hero: { headPre: "The ", headRoman: "Offer", lede: "A travelling winery branding residency. Our European studio moves in for one week and creates your complete wine brand — strategy, logo, labels, packaging and visual identity.", cta: "Apply to host", illusCredit: "Illustration by Kornelija Zalpyte" }, marquee: ["Strategy", "Naming", "Identity", "Packaging", "Storytelling", "Art Direction", "Photography", "Print"], week: { eyebrowPrefix: "— The week · ", taglineB: "from cask to task", title: "Five working days, one weekend at the table.", cards: [ { day: "Monday", title: "Immersion", desc: "We walk the vines at dawn, sit with the story, and work out who the wine is really for.", loc: "Day one" }, { day: "Tuesday", title: "Strategy", desc: "We settle on what the wine is and — more usefully — what it isn't.", loc: "Day two" }, { day: "Wednesday", title: "Identity", desc: "Logo and identity, drawn by hand, then built into type, grid and palette. A name turns up too, if you need one.", loc: "Day three" }, { day: "Thursday", title: "Packaging", desc: "Label, capsule, neck, case. We mock the bottle up at full size and carry it through every light in the building.", loc: "Day four" }, { day: "Friday", title: "Refinement", desc: "Edits made standing up. Proofs pulled, papers tested wet, the whole system written into a printed dossier left on your table.", loc: "Day five" }, { day: "Sat / Sun", title: "Celebration", desc: "The work rests. We open a bottle of yours, mocked up at scale in its new dress, with the family and the harvest crew. A long table, a short speech.", loc: "Day six & seven", weekend: true }], end: { day: "After", title: "Delivery", desc: "Your full brand and print‑ready files — logo, labels, packaging, guidelines — in hand within four to six weeks.", loc: "By post or email" }, hint: "Drag, swipe, or use arrows →" }, about: { num: "01 — The Initiative", heading: ["A winery branding studio,", "temporarily yours,", "for one week."], ledeA: "We pack the studio into two trunks and move into your winery for a week. By ", ledeEm: "Friday evening", ledeB: " you have a finished brand — strategy, logo, labels, packaging and print‑ready files. From grapes to graphics, in about seven hours of your time.", p1: "Wine Exchange isn't a pitch. It's a residency. Each year our European studio picks a few wineries — estates, négociants, natural growers, biodynamic co‑ops — and gives them the kind of branding we'd otherwise only take on as a paid commission.", p2: "We do it to build a wine portfolio we believe in, and to keep good company in the trade. You cover travel, a bed and the meals. The thinking, the design, the files — those are ours to give.", mono: "Open call · 2026 cycle · a handful of wineries" }, compare: { num: "02 — from cellar to bestseller", heading: ["Worth €15,000.", "Yours for a week of hosting."], oursHead: "Wine Exchange", theirsHead: "Traditional agency", rows: [ { ours: "Travel, stay & meals", theirs: "€15,000+ in fees" }, { ours: "One focused week", theirs: "Three to nine months" }, { ours: "About 7 hours of your time", theirs: "Endless briefs & meetings" }, { ours: "Senior studio, on site", theirs: "Junior team, at a distance" }] }, philosophy: { l1a: "A week at ", em1: "your table", l2a: "Years on ", em2: "your label", attrib: "— Manifesto" }, team: { num: "03 — The studio", heading: ["The people who", "move in."], ledePre: "Wine Exchange is run by ", ledePost1: " — a branding and packaging team", ledePost2: "with ten years of bottles, cans, cases and cellar doors behind us.", sub: "We are fifteen in the studio. For each trip a balanced team of five comes to you — a strategist, designers and a copywriter.", figcaption: "The andstudio team — Barcelona" }, paths: { num: "04 — Open Call", heading: "Host the residency.", tag: "For wineries", lede: "You make the wine. You want a brand that tastes of the place it came from — not just a label, but the whole identity. You have a spare room and a long table. From the land to the brand: that's the whole idea.", list: [ "One week on site · about seven hours of your time.", "Strategy, logo, labels, packaging, the full identity.", "Print‑ready files, in your hands in four to six weeks.", "Normally a €15,000+ job. Hosting covers it."], footLabel: "We ask only for", footLine: "Travel · a bed · a seat at your table.", cta: "Apply to host" }, cta: { eyebrow: "— 03 / Invitation", headPre: "Bring us to ", headRoman: "your", headPost: "vineyard", p: "We only ask for flights, accommodation, and a seat at your table. Everything else — the work, the prints, the dossier — comes with us.", small: "Open call · 2026 cycle · Three editions · Three guest studios", cta: "Start the exchange" }, footer: { initBy: "An initiative by", studioLine: ["A branding & packaging studio,", "travelling on assignment."], correspondence: "Correspondence", follow: "Follow" }, privacy: { copy: "This site uses only essential cookies to remember your preferences — no tracking, no third‑party analytics. ", more: "More", less: "Less", detail: "We do not set any advertising or tracking cookies. We store one local preference (your acceptance of this notice) and the design system “Tweaks” you may toggle. We collect no personal data without your consent. Email enquiries are processed by our mail provider under their own terms. For any privacy question, write to ", accept: "Got it" } }, /* ===================== FRANÇAIS ===================== */ fr: { nav: { initiative: "Initiative", openCall: "Appel à candidatures", contact: "Contact", apply: "Nous accueillir" }, hero: { headPre: "L'", headRoman: "Offre", lede: "Une résidence de branding viticole itinérante. Notre studio européen s'installe chez vous une semaine et crée votre marque de vin complète — stratégie, logo, étiquettes, packaging et identité visuelle.", cta: "Nous accueillir", illusCredit: "Illustration par Kornelija Zalpyte" }, marquee: ["Stratégie", "Nommage", "Identité", "Packaging", "Récit", "Direction artistique", "Photographie", "Impression"], week: { eyebrowPrefix: "— La semaine · ", taglineB: "de la vigne au signe", title: "Cinq jours de travail, un week-end à table.", cards: [ { day: "Lundi", title: "Immersion", desc: "On marche dans les vignes à l'aube, on s'imprègne de l'histoire et on cherche à qui ce vin s'adresse vraiment.", loc: "Jour un" }, { day: "Mardi", title: "Stratégie", desc: "On décide de ce qu'est le vin et — plus utile encore — de ce qu'il n'est pas.", loc: "Jour deux" }, { day: "Mercredi", title: "Identité", desc: "Logo et identité dessinés à la main, puis déclinés en typographie, grille et palette. Un nom apparaît aussi, si besoin.", loc: "Jour trois" }, { day: "Jeudi", title: "Packaging", desc: "Étiquette, capsule, col, carton. On maquette la bouteille en taille réelle et on la regarde sous chaque lumière de la maison.", loc: "Jour quatre" }, { day: "Vendredi", title: "Ajustements", desc: "Des retouches faites debout. Épreuves tirées, papiers testés mouillés, tout le système consigné dans un dossier imprimé laissé sur votre table.", loc: "Jour cinq" }, { day: "Sam / Dim", title: "Célébration", desc: "Le travail se repose. On ouvre une de vos bouteilles, maquettée en grand dans sa nouvelle robe, avec la famille et l'équipe des vendanges. Une longue table, un court discours.", loc: "Jour six & sept", weekend: true }], end: { day: "Après", title: "Livraison", desc: "Votre marque complète et les fichiers prêts à imprimer — logo, étiquettes, packaging, guide — entre vos mains sous quatre à six semaines.", loc: "Par courrier ou e-mail" }, hint: "Glissez, balayez ou utilisez les flèches →" }, about: { num: "01 — L'Initiative", heading: ["Un studio de branding viticole,", "provisoirement le vôtre,", "le temps d'une semaine."], ledeA: "On range le studio dans deux malles et on s'installe chez vous une semaine. Dès le ", ledeEm: "vendredi soir", ledeB: ", vous avez une marque finie — stratégie, logo, étiquettes, packaging et fichiers prêts à imprimer. Du raisin au dessin, en sept heures environ de votre temps.", p1: "Wine Exchange n'est pas un démarchage. C'est une résidence. Chaque année, notre studio européen choisit quelques domaines — propriétés, négociants, vignerons natures, coopératives en biodynamie — et leur offre le branding que nous ne ferions autrement que sur commande.", p2: "On le fait pour bâtir un portefeuille de vins qu'on aime et garder de bonnes relations dans le métier. Vous prenez en charge le voyage, le couvert et le gîte. La réflexion, le design, les fichiers — c'est nous qui les offrons.", mono: "Appel à candidatures · cycle 2026 · une poignée de domaines" }, compare: { num: "02 — du terroir à la gloire", heading: ["Une valeur de 15 000 €.", "À vous pour une semaine d'accueil."], oursHead: "Wine Exchange", theirsHead: "Agence traditionnelle", rows: [ { ours: "Voyage, séjour et repas", theirs: "Plus de 15 000 € d'honoraires" }, { ours: "Une semaine concentrée", theirs: "De trois à neuf mois" }, { ours: "Environ 7 heures de votre temps", theirs: "Briefs et réunions sans fin" }, { ours: "Un studio senior, sur place", theirs: "Une équipe junior, à distance" }] }, philosophy: { l1a: "Une semaine à ", em1: "votre table", l2a: "Une vie sur ", em2: "votre étiquette", attrib: "— Manifeste" }, team: { num: "03 — Le studio", heading: ["Les personnes qui", "s'installent chez vous."], ledePre: "Wine Exchange est mené par ", ledePost1: " — une équipe de branding et de packaging", ledePost2: "avec dix ans de bouteilles, de canettes, de caisses et de caves derrière elle.", sub: "Nous sommes quinze au studio. Pour chaque voyage, une équipe équilibrée de cinq personnes vient à vous — un stratège, des designers et un concepteur-rédacteur.", figcaption: "L'équipe andstudio — Barcelone" }, paths: { num: "04 — Appel à candidatures", heading: "Accueillez la résidence.", tag: "Pour les domaines", lede: "Vous faites le vin. Vous voulez une marque qui ait le goût de son lieu d'origine — pas seulement une étiquette, mais toute l'identité. Vous avez une chambre libre et une grande table. Du domaine à l'emblème : c'est toute l'idée.", list: [ "Une semaine sur place · environ sept heures de votre temps.", "Stratégie, logo, étiquettes, packaging, toute l'identité.", "Fichiers prêts à imprimer, entre vos mains sous quatre à six semaines.", "Normalement un projet à plus de 15 000 €. L'accueil suffit."], footLabel: "Nous demandons seulement", footLine: "Le voyage · un lit · une place à votre table.", cta: "Nous accueillir" }, cta: { eyebrow: "— 03 / Invitation", headPre: "Faites-nous venir dans ", headRoman: "votre", headPost: "vignoble", p: "Nous demandons seulement les vols, l'hébergement et une place à votre table. Tout le reste — le travail, les impressions, le dossier — vient avec nous.", small: "Appel à candidatures · cycle 2026 · Trois éditions · Trois studios invités", cta: "Lancer l'échange" }, footer: { initBy: "Une initiative de", studioLine: ["Un studio de branding & packaging,", "en déplacement sur mission."], correspondence: "Correspondance", follow: "Suivez-nous" }, privacy: { copy: "Ce site n'utilise que des cookies essentiels pour mémoriser vos préférences — pas de pistage, pas d'analytics tiers. ", more: "Plus", less: "Moins", detail: "Nous ne déposons aucun cookie publicitaire ni de pistage. Nous conservons une préférence locale (votre acceptation de cet avis) et les « Tweaks » du design system que vous pouvez activer. Nous ne collectons aucune donnée personnelle sans votre consentement. Les demandes par e-mail sont traitées par notre prestataire de messagerie selon ses propres conditions. Pour toute question de confidentialité, écrivez à ", accept: "J'ai compris" } }, /* ===================== ESPAÑOL ===================== */ es: { nav: { initiative: "Iniciativa", openCall: "Convocatoria", contact: "Contacto", apply: "Solicita acoger" }, hero: { headPre: "La ", headRoman: "Oferta", lede: "Una residencia itinerante de branding para bodegas. Nuestro estudio europeo se instala una semana y crea tu marca de vino completa — estrategia, logo, etiquetas, packaging e identidad visual.", cta: "Solicita acoger", illusCredit: "Ilustración de Kornelija Zalpyte" }, marquee: ["Estrategia", "Naming", "Identidad", "Packaging", "Narrativa", "Dirección de arte", "Fotografía", "Impresión"], week: { eyebrowPrefix: "— La semana · ", taglineB: "de la viña a la línea", title: "Cinco días de trabajo, un fin de semana a la mesa.", cards: [ { day: "Lunes", title: "Inmersión", desc: "Caminamos entre las vides al amanecer, nos empapamos de la historia y averiguamos para quién es realmente el vino.", loc: "Día uno" }, { day: "Martes", title: "Estrategia", desc: "Acordamos qué es el vino y —más útil aún— qué no es.", loc: "Día dos" }, { day: "Miércoles", title: "Identidad", desc: "Logo e identidad dibujados a mano, luego llevados a tipografía, retícula y paleta. También aparece un nombre, si hace falta.", loc: "Día tres" }, { day: "Jueves", title: "Packaging", desc: "Etiqueta, cápsula, cuello, caja. Maquetamos la botella a tamaño real y la paseamos por cada luz de la casa.", loc: "Día cuatro" }, { day: "Viernes", title: "Refinamiento", desc: "Ediciones hechas de pie. Pruebas impresas, papeles probados en mojado, todo el sistema recogido en un dosier impreso que dejamos en tu mesa.", loc: "Día cinco" }, { day: "Sáb / Dom", title: "Celebración", desc: "El trabajo descansa. Abrimos una de tus botellas, maquetada a escala con su nuevo traje, con la familia y el equipo de la vendimia. Una mesa larga, un discurso corto.", loc: "Día seis y siete", weekend: true }], end: { day: "Después", title: "Entrega", desc: "Tu marca completa y los archivos listos para imprenta —logo, etiquetas, packaging, guía— en tus manos en cuatro a seis semanas.", loc: "Por correo o email" }, hint: "Arrastra, desliza o usa las flechas →" }, about: { num: "01 — La Iniciativa", heading: ["Un estudio de branding para bodegas,", "tuyo por un tiempo,", "durante una semana."], ledeA: "Guardamos el estudio en dos baúles y nos instalamos en tu bodega una semana. Para el ", ledeEm: "viernes por la tarde", ledeB: " ya tienes una marca terminada — estrategia, logo, etiquetas, packaging y archivos listos para imprenta. De la uva al diseño, en unas siete horas de tu tiempo.", p1: "Wine Exchange no es una propuesta comercial. Es una residencia. Cada año nuestro estudio europeo elige unas pocas bodegas — fincas, negociantes, productores naturales, cooperativas biodinámicas — y les da el branding que de otro modo solo haríamos por encargo.", p2: "Lo hacemos para construir un portafolio de vinos en el que creemos y mantener buena compañía en el oficio. Tú cubres el viaje, la cama y las comidas. El pensamiento, el diseño, los archivos — eso lo ponemos nosotros.", mono: "Convocatoria · ciclo 2026 · un puñado de bodegas" }, compare: { num: "02 — de la bodega a la leyenda", heading: ["Vale 15.000 €.", "Tuyo por una semana de acogida."], oursHead: "Wine Exchange", theirsHead: "Agencia tradicional", rows: [ { ours: "Viaje, estancia y comidas", theirs: "Más de 15.000 € en honorarios" }, { ours: "Una semana concentrada", theirs: "De tres a nueve meses" }, { ours: "Unas 7 horas de tu tiempo", theirs: "Briefings y reuniones sin fin" }, { ours: "Estudio sénior, in situ", theirs: "Equipo junior, a distancia" }] }, philosophy: { l1a: "Una semana en ", em1: "tu mesa", l2a: "Una vida en ", em2: "tu etiqueta", attrib: "— Manifiesto" }, team: { num: "03 — El estudio", heading: ["Las personas que", "se instalan contigo."], ledePre: "Wine Exchange está dirigido por ", ledePost1: " — un equipo de branding y packaging", ledePost2: "con diez años de botellas, latas, cajas y bodegas a la espalda.", sub: "Somos quince en el estudio. Para cada viaje viene un equipo equilibrado de cinco — un estratega, diseñadores y un copywriter.", figcaption: "El equipo de andstudio — Barcelona" }, paths: { num: "04 — Convocatoria", heading: "Acoge la residencia.", tag: "Para bodegas", lede: "Tú haces el vino. Quieres una marca que sepa al lugar del que viene — no solo una etiqueta, sino toda la identidad. Tienes una habitación libre y una mesa larga. Del campo a la marca: esa es toda la idea.", list: [ "Una semana in situ · unas siete horas de tu tiempo.", "Estrategia, logo, etiquetas, packaging, toda la identidad.", "Archivos listos para imprenta, en tus manos en cuatro a seis semanas.", "Normalmente un proyecto de más de 15.000 €. La acogida lo cubre."], footLabel: "Solo pedimos", footLine: "Viaje · una cama · un sitio en tu mesa.", cta: "Solicita acoger" }, cta: { eyebrow: "— 03 / Invitación", headPre: "Tráenos a ", headRoman: "tu", headPost: "viñedo", p: "Solo pedimos los vuelos, el alojamiento y un sitio en tu mesa. Todo lo demás — el trabajo, las impresiones, el dosier — viene con nosotros.", small: "Convocatoria · ciclo 2026 · Tres ediciones · Tres estudios invitados", cta: "Iniciar el intercambio" }, footer: { initBy: "Una iniciativa de", studioLine: ["Un estudio de branding & packaging,", "viajando por encargo."], correspondence: "Correspondencia", follow: "Síguenos" }, privacy: { copy: "Este sitio usa solo cookies esenciales para recordar tus preferencias — sin rastreo, sin analíticas de terceros. ", more: "Más", less: "Menos", detail: "No usamos ninguna cookie publicitaria ni de rastreo. Guardamos una preferencia local (tu aceptación de este aviso) y los « Tweaks » del sistema de diseño que puedes activar. No recogemos datos personales sin tu consentimiento. Las consultas por email las procesa nuestro proveedor de correo bajo sus propios términos. Para cualquier duda de privacidad, escribe a ", accept: "Entendido" } }, /* ===================== ITALIANO ===================== */ it: { nav: { initiative: "Iniziativa", openCall: "Bando", contact: "Contatto", apply: "Candidati a ospitare" }, hero: { headPre: "L'", headRoman: "Offerta", lede: "Una residenza itinerante di branding per cantine. Il nostro studio europeo si trasferisce da te per una settimana e crea la tua marca di vino completa — strategia, logo, etichette, packaging e identità visiva.", cta: "Candidati a ospitare", illusCredit: "Illustrazione di Kornelija Zalpyte" }, marquee: ["Strategia", "Naming", "Identità", "Packaging", "Narrazione", "Direzione artistica", "Fotografia", "Stampa"], week: { eyebrowPrefix: "— La settimana · ", taglineB: "dalla vigna all'insegna", title: "Cinque giorni di lavoro, un weekend a tavola.", cards: [ { day: "Lunedì", title: "Immersione", desc: "Camminiamo tra le vigne all'alba, ci immergiamo nella storia e capiamo per chi è davvero il vino.", loc: "Giorno uno" }, { day: "Martedì", title: "Strategia", desc: "Stabiliamo cos'è il vino e — cosa più utile — cosa non è.", loc: "Giorno due" }, { day: "Mercoledì", title: "Identità", desc: "Logo e identità disegnati a mano, poi tradotti in carattere, griglia e palette. Spunta anche un nome, se serve.", loc: "Giorno tre" }, { day: "Giovedì", title: "Packaging", desc: "Etichetta, capsula, collo, cartone. Realizziamo il mock-up della bottiglia a grandezza naturale e la osserviamo sotto ogni luce della casa.", loc: "Giorno quattro" }, { day: "Venerdì", title: "Rifinitura", desc: "Modifiche fatte in piedi. Prove di stampa, carte testate da bagnate, l'intero sistema raccolto in un dossier stampato lasciato sul tuo tavolo.", loc: "Giorno cinque" }, { day: "Sab / Dom", title: "Festa", desc: "Il lavoro riposa. Apriamo una tua bottiglia, in mock-up a grandezza nel suo nuovo abito, con la famiglia e la squadra della vendemmia. Un lungo tavolo, un breve discorso.", loc: "Giorno sei e sette", weekend: true }], end: { day: "Dopo", title: "Consegna", desc: "La tua marca completa e i file pronti per la stampa — logo, etichette, packaging, linee guida — tra le tue mani in quattro-sei settimane.", loc: "Per posta o email" }, hint: "Trascina, scorri o usa le frecce →" }, about: { num: "01 — L'Iniziativa", heading: ["Uno studio di branding per cantine,", "per un po' tuo,", "per una settimana."], ledeA: "Mettiamo lo studio in due bauli e ci trasferiamo nella tua cantina per una settimana. Entro il ", ledeEm: "venerdì sera", ledeB: " hai una marca finita — strategia, logo, etichette, packaging e file pronti per la stampa. Dall'uva al segno, in circa sette ore del tuo tempo.", p1: "Wine Exchange non è una proposta commerciale. È una residenza. Ogni anno il nostro studio europeo sceglie poche cantine — tenute, negozianti, produttori naturali, cooperative biodinamiche — e dà loro il branding che altrimenti faremmo solo su commissione.", p2: "Lo facciamo per costruire un portfolio di vini in cui crediamo e tenere buona compagnia nel mestiere. Tu copri il viaggio, il letto e i pasti. Il pensiero, il design, i file — quelli li mettiamo noi.", mono: "Bando · ciclo 2026 · una manciata di cantine" }, compare: { num: "02 — dalla cantina alla leggenda", heading: ["Vale 15.000 €.", "Tuo per una settimana di ospitalità."], oursHead: "Wine Exchange", theirsHead: "Agenzia tradizionale", rows: [ { ours: "Viaggio, soggiorno e pasti", theirs: "Oltre 15.000 € di onorari" }, { ours: "Una settimana concentrata", theirs: "Da tre a nove mesi" }, { ours: "Circa 7 ore del tuo tempo", theirs: "Brief e riunioni infinite" }, { ours: "Studio senior, in loco", theirs: "Team junior, a distanza" }] }, philosophy: { l1a: "Una settimana alla ", em1: "tua tavola", l2a: "Anni sulla ", em2: "tua etichetta", attrib: "— Manifesto" }, team: { num: "03 — Lo studio", heading: ["Le persone che", "si trasferiscono da te."], ledePre: "Wine Exchange è guidato da ", ledePost1: " — un team di branding e packaging", ledePost2: "con dieci anni di bottiglie, lattine, casse e cantine alle spalle.", sub: "Siamo in quindici nello studio. Per ogni viaggio arriva da te un team equilibrato di cinque — uno stratega, designer e un copywriter.", figcaption: "Il team di andstudio — Barcellona" }, paths: { num: "04 — Bando", heading: "Ospita la residenza.", tag: "Per le cantine", lede: "Tu fai il vino. Vuoi una marca che sappia del luogo da cui viene — non solo un'etichetta, ma tutta l'identità. Hai una stanza libera e un lungo tavolo. Dalla terra al marchio: è tutta qui l'idea.", list: [ "Una settimana in loco · circa sette ore del tuo tempo.", "Strategia, logo, etichette, packaging, tutta l'identità.", "File pronti per la stampa, tra le tue mani in quattro-sei settimane.", "Di norma un progetto da oltre 15.000 €. L'ospitalità lo copre."], footLabel: "Chiediamo solo", footLine: "Il viaggio · un letto · un posto al tuo tavolo.", cta: "Candidati a ospitare" }, cta: { eyebrow: "— 03 / Invito", headPre: "Portaci nella ", headRoman: "tua", headPost: "vigna", p: "Chiediamo solo i voli, l'alloggio e un posto al tuo tavolo. Tutto il resto — il lavoro, le stampe, il dossier — viene con noi.", small: "Bando · ciclo 2026 · Tre edizioni · Tre studi ospiti", cta: "Avvia lo scambio" }, footer: { initBy: "Un'iniziativa di", studioLine: ["Uno studio di branding & packaging,", "in viaggio per incarico."], correspondence: "Corrispondenza", follow: "Seguici" }, privacy: { copy: "Questo sito usa solo cookie essenziali per ricordare le tue preferenze — nessun tracciamento, nessuna analitica di terzi. ", more: "Più", less: "Meno", detail: "Non impostiamo alcun cookie pubblicitario o di tracciamento. Conserviamo una preferenza locale (la tua accettazione di questo avviso) e i « Tweaks » del design system che puoi attivare. Non raccogliamo dati personali senza il tuo consenso. Le richieste via email sono gestite dal nostro provider di posta secondo i suoi termini. Per qualsiasi domanda sulla privacy, scrivi a ", accept: "Ho capito" } } }; /* ---------- Context + provider ---------- */ const LangContext = createContext(null); function LangProvider({ children }) { const [lang, setLangState] = useState(() => { try { const saved = localStorage.getItem("we-lang"); if (saved && TR[saved]) return saved; } catch (_) {} return "en"; }); const setLang = (l) => { if (!TR[l]) return; try { localStorage.setItem("we-lang", l); } catch (_) {} setLangState(l); }; useEffect(() => { document.documentElement.lang = lang; }, [lang]); const value = { lang, setLang, t: TR[lang] || TR.en }; return React.createElement(LangContext.Provider, { value }, children); } function useLang() { return useContext(LangContext) || { lang: "en", setLang: () => {}, t: TR.en }; } /* ---------- Language switcher (dropdown) ---------- */ function LangSwitcher() { const { lang, setLang } = useLang(); const [open, setOpen] = useState(false); const ref = React.useRef(null); const current = LANGS.find((l) => l.code === lang) || LANGS[0]; useEffect(() => { if (!open) return undefined; const onDoc = (e) => { if (ref.current && !ref.current.contains(e.target)) setOpen(false); }; const onKey = (e) => { if (e.key === "Escape") setOpen(false); }; document.addEventListener("mousedown", onDoc); document.addEventListener("keydown", onKey); return () => { document.removeEventListener("mousedown", onDoc); document.removeEventListener("keydown", onKey); }; }, [open]); return (