/* ═══════════════════════════════════════════════════════════════════════════
   ACTIVITATS — bundle (shared components + page).
   ═══════════════════════════════════════════════════════════════════════════ */

/* ─── EsbartNav — loaded via shared/components/Nav.jsx ───────────────────── */
const EsbartNav = window.EsbartNav;

/* ─── EsbartFooter ───────────────────────────────────────────────────────── */
const EsbartFooter = window.EsbartFooter; /* unified shared footer */

/* ─── Tweaks — loaded via shared/components/TweaksPanel.jsx ─── */
const useEsbartTweaks = window.EsbartTweaks.useTweaks;
const EsbartTweaksPanel = window.EsbartTweaksPanel;

/* ═══════════════════════════════════════════════════════════════════════════
   ACTIVITATS — page
   ═══════════════════════════════════════════════════════════════════════════ */

const { useState, useEffect, useRef } = React;

// Renders `*text*` emphasis as real <em> elements — never via innerHTML
// (INT-4: seeds get replaced by CMS data at F0, so no HTML injection paths).
function emText(s) {
  return String(s || '').split(/\*([^*]+)\*/g).map((part, i) => (i % 2 ? <em key={i}>{part}</em> : part));
}

const ESBART_TWEAKS = /*EDITMODE-BEGIN*/{
  "accentHue": 350,
  "typeScale": 1
}/*EDITMODE-END*/;
window.ESBART_TWEAKS = ESBART_TWEAKS;

/* ─── Shared data: MercèDansa editions (titles are translatable) ──────────
   Items mantenen els noms tal qual (no canvien per idioma).
   ─────────────────────────────────────────────────────────────────────── */
const MERCEDANSA_EDITIONS = [
  { id: "2025", year: "2025", theme: null, accompaniment: "Cobla Sabadell (direcció: Joan Gòmez Soriano i Albert Montcada) · Grallers Els Vinardells (Vilafranca)", dances: [
    { name: "Dansa d'Arenys de Mar", town: "Arenys de Mar" },
    { name: "Ball de Cavallets Cotoners", town: "Barcelona" },
    { name: "Ball de cascavells", town: "Castellgalí" },
    { name: "Ball de nyacres i Farandola", town: "L'Escala" },
    { name: "Ball de cavallets, gegants i mulassa", town: "Sant Feliu de Pallerols" },
    { name: "Ball de cavallets", town: "Valls" },
    { name: "Moixiganga", town: "Vilafranca del Penedès" },
    { name: "Galop de la Mercè", town: "Barcelona" },
  ]},
  { id: "2024", year: "2024", theme: null, dances: [
    { name: "Ball de l'ovella", town: "Castellví de la Marca" },
    { name: "Ball de morratxes", town: "Gironella" },
    { name: "Moixiganga", town: "Olesa" },
    { name: "Ball de garrofins", town: "Moià" },
    { name: "Ball de cascavells", town: "Ribes" },
    { name: "Ball d'espases", town: "Salou" },
    { name: "Ball de gitanes", town: "Sentmenat" },
    { name: "Galop de la Mercè", town: "Barcelona" },
  ]},
  { id: "2023", year: "2023", theme: null, dances: [
    { name: "Ball del vano i el ram de Gràcia", town: "Barcelona" },
    { name: "Entrada de Ball", town: "Caldes Montbui" },
    { name: "Ball de gitanes", town: "Granollers" },
    { name: "Ball de valencians", town: "Lleida" },
    { name: "Ball de capgrossos", town: "Manresa" },
    { name: "Ball dels xatos", town: "Rubí" },
    { name: "Ball pla", town: "Vilafranca del Penedès" },
    { name: "Galop de la Mercè", town: "Barcelona" },
  ]},
  { id: "2022", year: "2022", theme: null, dances: [
    { name: "Dansa de canuts", town: "Agramunt" },
    { name: "Ball de teixidores", town: "Sant Andreu de Palomar (Barcelona)" },
    { name: "Ball de l'aristocràcia", town: "Molins de Rei" },
    { name: "Ball de mocadors", town: "Sant Climent de Llobregat" },
    { name: "Ball de gitanes", town: "Sant Vicenç de Castellet" },
    { name: "Contrapàs", town: "Torroella de Montgrí" },
    { name: "Ball de figuetaires", town: "Vilafranca del Penedès" },
    { name: "Galop de la Mercè", town: "Barcelona" },
  ]},
  { id: "2021", year: "2021", theme: "Balls de Barcelona i poblacions veïnes", dances: [
    { name: "Danses de maig", town: "Badalona" },
    { name: "Ball de bastons de Poble-sec", town: "Barcelona" },
    { name: "Ball del babau", town: "Esplugues de Llobregat" },
    { name: "Ball del tortell", town: "El Prat de Llobregat" },
    { name: "Ball de Carnestoltes", town: "El Prat de Llobregat" },
    { name: "Ball de vinyataires", town: "Santa Coloma de Cervelló" },
    { name: "Ball de capgrossos cireraires", town: "Santa Coloma de Cervelló" },
    { name: "Ball de capgrossos", town: "Santa Coloma de Gramenet" },
    { name: "Ball de les gitanes", town: "Sant Cugat del Vallès" },
    { name: "Galop de la Mercè", town: "Barcelona" },
  ]},
  { id: "2020", year: "2020", theme: "Del calendari festiu barceloní", dances: [
    { name: "Ball dels Capgrossos Macers", town: "Barcelona" },
    { name: "Ball dels Cavallets Cotoners", town: "Barcelona" },
    { name: "Ball de bastons", town: "Gràcia" },
    { name: "Ball de l'ofrena a la Mare de Déu del Roser", town: "Sarrià" },
    { name: "Ball de bastons", town: "Barri Gòtic" },
    { name: "Ball de rams de Sant Martí", town: "Clot — Camp de l'Arpa" },
    { name: "Ball del Corpus de sang", town: "Sant Andreu del Palomar" },
    { name: "Galop de la Mercè", town: "Barcelona" },
  ]},
  { id: "2019", year: "2019", theme: "De flors i violes", dances: [
    { name: "Ball del Tortell", town: "Esponellà" },
    { name: "Ball de Cercolets", town: "Vilanova i la Geltrú" },
    { name: "Ball de l'arbre", town: "Matadepera" },
    { name: "Cap de dansa", town: "El Pinell de Brai" },
    { name: "Ball de rams", town: "Barcelona" },
    { name: "Ball de gitanes", town: "Rubí" },
    { name: "Galop de la Mercè", town: "Barcelona" },
  ]},
  { id: "2018", year: "2018", theme: "Els balls d'Aureli Capmany", dances: [
    { name: "Ball de bastons", town: "Barcelona" },
    { name: "Ball de l'Almorratxa i corrandes", town: "Fals" },
    { name: "Ball de Cascavells", town: "Fals" },
    { name: "Ball del Patatuf i de la gegantona", town: "El Vendrell" },
    { name: "Ball de capgrossos", town: "Capellades" },
    { name: "Ball de cercolets", town: "Igualada" },
    { name: "Ball dels garrofins", town: "Moià" },
    { name: "Ball de gitanes", town: "L'Arboç" },
    { name: "Galop de la Mercè", town: "Barcelona" },
  ]},
  { id: "2017", year: "2017", theme: "Balls de festa major", dances: [
    { name: "La Gallarda del Pou", town: "Cornellà" },
    { name: "La Jota", town: "Benifallet" },
    { name: "Bastoners Els Picots del Fluvià", town: "Sant Miquel de Fluvià" },
    { name: "El Rossinyol i La Bolangera (Esbart Manresà)", town: "Manresa" },
    { name: "Ball de Nans", town: "Tàrrega" },
    { name: "Ball de Morratxes", town: "Blanes" },
    { name: "Ball de Valencians", town: "Vilanova i la Geltrú" },
    { name: "Galop de la Mercè", town: "Barcelona" },
  ]},
  { id: "2016", year: "2016", theme: "Ballar, menjar i beure", dances: [
    { name: "Ball de gitanes", town: "Martorelles" },
    { name: "Ball del Xai-bé", town: "Olot" },
    { name: "Ball de crespelles", town: "Òdena" },
    { name: "Ball de Sant Isidre", town: "Sant Privat d'en Bas" },
    { name: "Ball del tirabou de Gaserans", town: "Sant Feliu de Buixalleu" },
    { name: "Ball de cascavells", town: "Súria" },
    { name: "Ball dels capgrossos", town: "Vilafranca del Penedès" },
    { name: "Galop de la Mercè", town: "Barcelona" },
  ]},
  { id: "2015", year: "2015", theme: "Balls amb història", dances: [
    { name: "L'Esquerrana", town: "Castellciutat" },
    { name: "La Morisca", town: "Gerri de la Sal" },
    { name: "Ball del Ciri", town: "Manlleu" },
    { name: "Ball de nans", town: "Terrassa" },
    { name: "Ball de la Rosa", town: "Tona" },
    { name: "Ball de gitanes", town: "Vilafranca del Penedès" },
    { name: "La Moixiganga", town: "Valls" },
    { name: "Galop de la Mercè", town: "Barcelona" },
  ]},
  { id: "2014", year: "2014", theme: "Tricentenari 1714—2014", dances: [
    { name: "Ball de Cercolets", town: "Vilanova i la Geltrú" },
    { name: "Ball de Cintes", town: "Les Preses" },
    { name: "Balls de Bastons", town: "Barcelona (Casc Antic)" },
    { name: "La Trencadansa", town: "Prats de Lluçanès" },
    { name: "Ball de Diables", town: "L'Arboç" },
    { name: "Ball dels Verds", town: "Torelló" },
    { name: "El Galop de la Mercè", town: "Barcelona" },
  ]},
  { id: "2013", year: "2013", theme: "Balls amb objecte, estri o carcassa", dances: [
    { name: "Ball dels Cavallets Cotoners", town: "Barcelona" },
    { name: "Ball de panderos", town: "Premià de Mar" },
    { name: "Ball de les rentadores", town: "Riu de Cerdanya" },
    { name: "Ball de garlandes", town: "Sant Esteve Sesrovires" },
    { name: "Ball de faixes", town: "Sant Martí de Tous" },
    { name: "Ball de les gitanes", town: "Santa Maria de Palautordera" },
    { name: "Ball de pastorets", town: "Sitges" },
    { name: "El Galop de la Mercè", town: "Barcelona" },
  ]},
  { id: "2012", year: "2012", theme: "Vint anys amb balls i danses", dances: [
    { name: "Ball de gegants i nans", town: "Badalona" },
    { name: "La Moixiganga", town: "Lleida" },
    { name: "Ball de Forques", town: "Nalec" },
    { name: "Ball de Carnestoltes i Ball del Tortell", town: "El Prat de Llobregat" },
    { name: "Ball dels Romeus", town: "Prats de Lluçanès" },
    { name: "Ball del Ciri", town: "Taradell" },
    { name: "Ball de Llancers", town: "Teià" },
    { name: "Grup Aljama", town: "Bétera" },
    { name: "El Galop de la Mercè", town: "Barcelona" },
  ]},
  { id: "2011", year: "2011", theme: "Ballant, ballant, el calendari va endavant", dances: [
    { name: "Ball de cintes", town: "Les Preses" },
    { name: "Ball del Bo bo", town: "Monistrol" },
    { name: "Ball de Xatos", town: "Rubí" },
    { name: "Ball pla", town: "Capellades" },
    { name: "L'Estapera", town: "Terrassa" },
    { name: "Ball de Serrallonga", town: "Vilafranca del Penedès" },
    { name: "El Galop de la Mercè", town: "Barcelona" },
  ]},
  { id: "2010", year: "2010", theme: "Del Francolí al Llobregat", dances: [
    { name: "Ball de bastons", town: "Altafulla" },
    { name: "Ball de Cavallets", town: "Torredembarra" },
    { name: "Ball de Cercolets", town: "Sant Pere de Ribes" },
    { name: "Ball de Gitanes", town: "Vilanova i la Geltrú" },
    { name: "Ball de Mossèn Joan de Vic", town: "Reus" },
    { name: "Ball de Panderos", town: "Vilafranca del Penedès" },
    { name: "Ball del Patatuf", town: "Torredembarra" },
    { name: "La Moixiganga", town: "Sitges" },
    { name: "El Galop de la Mercè", town: "Barcelona" },
  ]},
  { id: "2009", year: "2009", theme: "Balls de Carnaval", dances: [
    { name: "Ball de les Gitanes", town: "Castellar del Vallès" },
    { name: "Ball del Ciri", town: "Moià" },
    { name: "El Contrapàs", town: "Moià" },
    { name: "Ball de Cascavells", town: "Navàs" },
    { name: "Ball de la Revolta dels Capgrossos", town: "Premià de Mar" },
    { name: "La Disfressada", town: "Premià de Mar" },
    { name: "Ball del Banyut", town: "Torelló" },
    { name: "Ball del Xirri", town: "Torelló" },
    { name: "El Galop de la Mercè", town: "Barcelona" },
  ]},
  { id: "2008", year: "2008", theme: "Centenari de l'Esbart — balls documentats o restaurats per l'entitat", dances: [
    { name: "Ball de Rams d'Hostafrancs", town: "Barcelona" },
    { name: "Ball de les donzelles", town: "Granollers" },
    { name: "Ball de Morratxes", town: "Lloret de Mar" },
    { name: "Cap de Dansa", town: "El Pinell de Brai" },
    { name: "Ball de les Gitanes", town: "Vilafranca del Penedès" },
    { name: "Danses", town: "Vilanova i la Geltrú" },
    { name: "El Galop de la Mercè", town: "Barcelona" },
  ]},
  { id: "2007", year: "2007", theme: "La Mercè i el Mar — Maresme", dances: [
    { name: "Dansa", town: "Arenys de Mar" },
    { name: "Ball de nans", town: "Mataró" },
    { name: "Ball de pedretes", town: "Mataró" },
    { name: "Ball de pescadors", town: "Mataró" },
    { name: "Contrapàs", town: "Santa Susanna" },
    { name: "Ball del Patatuf", town: "Sant Iscle de Vallalta" },
    { name: "Ball de morratxes", town: "Sant Pol" },
    { name: "El Galop de la Mercè", town: "Barcelona" },
  ]},
  { id: "2006", year: "2006", theme: "Comarques de Ponent", dances: [
    { name: "La bolangera, el ball pla i les corrandes", town: "Bellvís" },
    { name: "Ball de palitrocs", town: "Benavarri" },
    { name: "Ball de totxets", town: "Camporrells" },
    { name: "Ball de bastons", town: "Lleida" },
    { name: "L'Eixida", town: "Tàrrega" },
    { name: "El Contrapàs", town: "Tremp" },
    { name: "El Galop de la Mercè", town: "Barcelona" },
  ]},
  { id: "2005", year: "2005", theme: "Comarques pirinenques", dances: [
    { name: "Ballet i ball dels Ocellets", town: "Alp" },
    { name: "Ball d'en Serrallonga", town: "Baó" },
    { name: "Dansa i Ball Cerdà", town: "Gombrèn" },
    { name: "Contrapàs", town: "Prats de Molló" },
    { name: "Ball de la Maniera i Ball de la Mare de Déu del Puig de França", town: "Ogassa" },
    { name: "Ball del Petó", town: "Tuir" },
    { name: "El Galop de la Mercè", town: "Barcelona" },
  ]},
  { id: "2004", year: "2004", theme: "Any Dalí", dances: [
    { name: "Ball de Bastons", town: "Malpàs" },
    { name: "Ball del Ciri", town: "Osor" },
    { name: "L'Espolsada", town: "Premià de Dalt" },
    { name: "La Bolangera i el Ball de Nyacres", town: "Roses" },
    { name: "Treure Ball", town: "Sant Feliu Saserra" },
    { name: "Ball de la garlanda", town: "Vallbona d'Anoia" },
    { name: "Ball de nyacres", town: "Roses" },
    { name: "El Galop de la Mercè", town: "Barcelona" },
  ]},
  { id: "2003", year: "2003", theme: "Vallès Oriental i Vallès Occidental", dances: [
    { name: "Entrada de Ball", town: "Caldes de Montbui" },
    { name: "Ball de les Gitanes", town: "Castellar del Vallès" },
    { name: "Ball de les Gitanes", town: "Cerdanyola" },
    { name: "Contrapàs de les cosses i corrandes", town: "Gósol" },
    { name: "La Dansada", town: "Gandesa" },
    { name: "Ball de Bastons dels Blaus", town: "Granollers" },
    { name: "Ball de les Gitanes", town: "Polinyà" },
    { name: "Ball de Xatos", town: "Rubí" },
    { name: "Ball de la Bola", town: "Sabadell" },
    { name: "Paga-li Joan (Ball del vano i el ram)", town: "Sant Cugat del Vallès" },
    { name: "Els Rigodons", town: "Sort" },
    { name: "Ball d'En Serrallonga", town: "Terrassa" },
    { name: "Ball de Nans", town: "Terrassa" },
    { name: "El Galop de la Mercè", town: "Barcelona" },
  ]},
  { id: "2002", year: "2002", theme: "Garraf", dances: [
    { name: "Ball de Valencians", town: "Vilanova i la Geltrú" },
    { name: "Ball de Panderetes", town: "Sitges" },
    { name: "Ball de Pastorets", town: "Sant Pere de Ribes" },
    { name: "Ball de Bastons", town: "Cubelles" },
    { name: "Ball de Bastons", town: "Sant Pere de Ribes" },
    { name: "Ball de Panderos", town: "Sant Pere de Ribes" },
    { name: "Ball de Bastons", town: "Sitges" },
    { name: "Ball de Panderetes", town: "Vilanova i la Geltrú" },
    { name: "Ball de les Gitanes", town: "Cubelles" },
    { name: "Ball de Pastorets", town: "Sant Pere de Ribes" },
    { name: "La Moixiganga", town: "La Geltrú" },
    { name: "Ball de Cercolets", town: "Sitges" },
    { name: "Ball de Bastons", town: "Vilanova i la Geltrú" },
    { name: "Ball de les Gitanes", town: "Sant Pere de Ribes" },
    { name: "La Moixiganga", town: "Sitges" },
    { name: "Ball del Foc", town: "Castelló d'Empúries" },
    { name: "El Contrapàs", town: "Sant Vicenç de Torelló" },
    { name: "Jota de Gavadà", town: "Vandellòs" },
    { name: "El Galop de la Mercè", town: "Barcelona" },
  ]},
  { id: "2001", year: "2001", theme: null, dances: [
    { name: "Ball del coro de l'estisora", town: "Albelda" },
    { name: "Dansa alpensina", town: "Alpens" },
    { name: "Ball de Bastons", town: "L'Espluga de Francolí" },
    { name: "Jota La Gresca", town: "Falset" },
    { name: "Ball de Cercolets", town: "Igualada" },
    { name: "Ball de Sant Joan i Sant Pau", town: "Malgrat de Mar" },
    { name: "Ball de la Bim Bam", town: "Palafrugell" },
    { name: "Dacqa", town: "Taroudant" },
    { name: "Ball de la Tal·lara", town: "Torrelles de Llobregat" },
    { name: "Ball d'En Serrallonga", town: "Vilafranca del Penedès" },
    { name: "El Galop de la Mercè", town: "Barcelona" },
  ]},
  { id: "2000", year: "2000", theme: null, dances: [
    { name: "Artà, Balla i Canta", town: "Artà" },
    { name: "Ball del Ciri i La dansa", town: "Castellterçol" },
    { name: "La Faràndola", town: "L'Escala" },
    { name: "Agrupació Folklòrica", town: "Montcada" },
    { name: "Dansaires", town: "Neàpolis" },
    { name: "Ball de Cascavells", town: "Oliana" },
    { name: "Ball de Flocs", town: "Riudarenes" },
    { name: "Ballet Cerdà", town: "Sant Llorenç de Cerdans" },
    { name: "La Zagara", town: "Sicília" },
    { name: "Ball de Bastons, Ball de Nans i Ball de Cavallets", town: "Torredembarra" },
    { name: "El Galop de la Mercè", town: "Barcelona" },
  ]},
  { id: "1999", year: "1999", theme: null, dances: [
    { name: "Ball Pagès", town: "Eivissa" },
    { name: "Grup Valdemars", town: "Letònia" },
    { name: "Ball de Valencians", town: "Reus" },
    { name: "Ball Cerdà i Ball de la Marratxa", town: "Sant Julià de Lòria" },
    { name: "Danses Guerreres", town: "La Todolella" },
    { name: "Ball de Priors", town: "Torà" },
    { name: "La Moma", town: "València" },
    { name: "Ball del Roser", town: "Vallfogona del Ripollès" },
    { name: "Ball de Panderos", town: "Vilanova i la Geltrú" },
    { name: "Jota Xertolina", town: "Xerta" },
    { name: "El Galop de la Mercè", town: "Barcelona" },
  ]},
  { id: "1998", year: "1998", theme: "Estrena del MercèDansa Mediterrània", dances: [
    { name: "Les Danses i Ball de Nanos", town: "Alacant" },
    { name: "Ball de Cascavells", town: "Ardèvol de Pinós" },
    { name: "Ball de Rams", town: "Hostafrancs (Barcelona)" },
    { name: "Ball de Faixes", town: "Sant Martí de Tous" },
    { name: "La Disfressada", town: "Sant Vicenç dels Horts" },
    { name: "Jota rasquerana", town: "Rasquera" },
    { name: "Ball de Cerdà", town: "La Seu d'Urgell" },
    { name: "Grup de dansa", town: "Riga" },
    { name: "El Galop de la Mercè", town: "Barcelona" },
  ]},
  { id: "1997", year: "1997", theme: "Estrena d'El Galop de la Mercè", dances: [
    { name: "Ball de Collir Castanyes", town: "Arbúcies" },
    { name: "Sardana", town: "Banyoles" },
    { name: "Ball del babau", town: "Esplugues de Llobregat" },
    { name: "Jota", town: "Paüls" },
    { name: "Ball de Pabordes", town: "Sant Joan de les Abadesses" },
    { name: "Ball de la Primera", town: "Valls" },
    { name: "Ball del Tatero", town: "Vilaller" },
    { name: "El Galop de la Mercè", town: "Barcelona" },
  ]},
  { id: "1996", year: "1996", theme: null, dances: [
    { name: "Ball de Totxets", town: "Camporrells" },
    { name: "Ball de les Cintes", town: "Les Preses" },
    { name: "Ball de Plaça", town: "Lloret de Mar" },
    { name: "El Contrapàs", town: "Palau de Noguera" },
    { name: "Paga-li Joan", town: "Sant Cugat del Vallès" },
    { name: "Ball de les majorales", town: "Ulldemolins" },
  ]},
  { id: "1995", year: "1995", theme: null, dances: [
    { name: "Ball del Cornut", town: "Cornellà de Terri" },
    { name: "Ball dels Garrofins", town: "Moià" },
    { name: "Ball de Prims", town: "Reus" },
    { name: "L'Eixida", town: "Tàrrega" },
    { name: "Ball de Mantons", town: "Ulldecona" },
    { name: "Balh Pla", town: "Vielha" },
    { name: "Ball Cerdà", town: "Viladrau" },
    { name: "Grup de dansa", town: "Bòsnia" },
  ]},
  { id: "1994", year: "1994", theme: null, dances: [
    { name: "Ball de Bastons", town: "L'Arboç" },
    { name: "Corrandes i Ballet", town: "Bellver de Cerdanya" },
    { name: "La Gala", town: "Campdevànol" },
    { name: "Ball Pla i Esquerrana", town: "Esterri d'Àneu" },
    { name: "Ball de les Gitanes", town: "Mollet" },
    { name: "El Contrapàs", town: "Prats de Molló" },
    { name: "La Tornaboda i el Patatuf", town: "—" },
  ]},
  { id: "1993", year: "1993", theme: "Primera edició — neix el MercèDansa", dances: [
    { name: "La Dansa", town: "Arenys de Munt" },
    { name: "Ball de nans", town: "L'Ametlla de Merola" },
    { name: "Cap de dansa", town: "El Pinell de Brai" },
    { name: "El Contrapàs", town: "Prats de Lluçanès" },
    { name: "Ball del Gambeto", town: "Riudaura" },
    { name: "Ball de Cavallets, gegants i mulassa", town: "Sant Feliu de Pallerols" },
  ]},
];

const PREMI_EDITIONS = [
  {
    id: "VI", year: "2023", label: "VI Premi Rafel Tudó", num: 6, status: "pending",
    author: null, workTitle: null, publication: null, accessit: null,
  },
  {
    id: "V", year: "2018", label: "V Premi Rafel Tudó", num: 5, status: "awarded",
    author: "Antoni Ribas i Beltran",
    workTitle: "Bastons! El Ball de bastons de Vilafranca del Penedès",
    publication: null,
    accessit: {
      author: "Raül Sanchís Francés",
      workTitle: "La festa i la dansa en les fonts historiogràfiques de la memòria. Corpus documental de la ciutat de València",
      publication: { ca: "Publicat l'any 2020", es: "Publicado en 2020", en: "Published in 2020" },
    },
  },
  {
    id: "IV", year: "2014", label: "IV Premi Rafel Tudó", num: 4, status: "awarded",
    author: "Roser Reixach",
    workTitle: "La Trencadansa. La Festa Major de Prats de Lluçanés",
    publication: null, accessit: null,
  },
  {
    id: "III", year: "2008", label: "III Premi Rafel Tudó", num: 3, status: "deserted",
    author: null, workTitle: null, publication: null, accessit: null,
  },
  {
    id: "II", year: "2003", label: "II Premi Rafel Tudó", num: 2, status: "awarded",
    author: "Ramon Vallverdú",
    workTitle: "Foc en dansa: els balls de diables tradicionals del Penedès i el Camp de Tarragona",
    publication: {
      ca: "Publicat per l'Esbart Català de Dansaires, Carrutxa i l'Ajuntament de l'Arboç l'any 2006",
      es: "Publicado por el Esbart Català de Dansaires, Carrutxa y el Ayuntamiento de l'Arboç en 2006",
      en: "Published by the Esbart Català de Dansaires, Carrutxa and the L'Arboç Town Council in 2006",
    },
    accessit: null,
  },
  {
    id: "I", year: "1998", label: "I Premi Rafel Tudó", num: 1, status: "awarded",
    author: "Núria Vinyoles",
    workTitle: "Sant Feliu de Codines: tradicions i danses",
    publication: {
      ca: "Publicat per l'Esbart Català de Dansaires l'any 2001",
      es: "Publicado por el Esbart Català de Dansaires en 2001",
      en: "Published by the Esbart Català de Dansaires in 2001",
    },
    accessit: null,
  },
];

/* ─── Strings (CA / ES / EN) ─────────────────────────────────────────────── */
const ACTS_STRINGS_CA = {
  pageTitle: "Activitats · Esbart Català de Dansaires",
  heroEyebrow: "Agenda · Espectacles · Formació · Premi",
  heroHashtag: "#TRADICIÓVIVA",
  heroT1: "TRADICIÓ",
  heroT2: "VIVA",
  heroT3: "AL CARRER",
  heroTag: "Cada setmana, l'Esbart porta la dansa tradicional catalana a places, sales i escoles d'arreu del territori.",
  kineticWords: [
    "AGENDA", "CERCAVILA", "MERCÈDANSA", "BASTONS", "CAFETERA", "TROBADA",
    "BALL DEL DIVENDRES", "MATÍ BASTONER", "CAVALLETS", "SARDANA",
    "MOIXIGANGA", "DANSA", "ESCENARI", "TRADICIÓ", "PATRIMONI", "ESBART",
  ],
  heroTitle: ["Tradició ", "viva", " al carrer i a ", "l'escenari", "."],
  heroLead: "Cada setmana, durant l'any, l'Esbart porta la dansa tradicional catalana a places, sales i escoles d'arreu del territori. Una agenda en moviment constant des de 1908.",
  heroCta1: "Vine a ballar",
  heroCta2: "Contracta una actuació",
  heroStats: [
    { num: "80+", label: "Danses al repertori" },
    { num: "30+", label: "Actuacions a l'any" },
    { num: "118", label: "Anys d'activitat" },
  ],
  heroScroll: "Descobreix",

  timelineEyebrow: "Un any a l'Esbart",
  timelineTitle: ["Quan i on ", "ballem?"],
  timelineHint: "Arrossega · roda · llisca →",
  timelineTodayLabel: "Avui",
  timelineLegendPast: "Celebrat",
  timelineLegendFuture: "Per venir",
  timelineTagPast: "Celebrat",
  timelineDetailsCta: "Detalls",
  detailLabels: {
    close: "Tancar",
    when: "Horari",
    where: "On",
    about: "Sobre l'esdeveniment",
    repertoire: "Repertori",
    tickets: "Accés",
    group: "Grup",
    save: "Afegir al calendari",
    share: "Compartir",
    eventOf: "Esdeveniment",
    free: "Lliure",
    reservation: "Reserva prèvia",
    paid: "Amb entrada",
    imagePlaceholder: "Imatge oficial · pendent",
  },
  timelineItems: [
    {
      id: "ev-2025-10-04",
      date: "2025-10-04",
      label: "Inici del Ball del Divendres",
      note: "La Casa dels Entremesos",
      details: {
        time: "21:30 → 00:00",
        location: "Pl. de les Beates, 2 · Ciutat Vella",
        group: "Tots els grups · Obert al públic",
        about: "Reobrim la temporada del Ball del Divendres, una tradició setmanal on l'esbart convida socis i visitants a ballar plegats el repertori bàsic català. Cap experiència prèvia és necessària.",
        repertoire: ["Jota d'Olot", "Ball pla", "Ballet de Déu", "Patatuf"],
        access: { kind: "free", label: "Accés lliure · Aforament limitat" },
      },
    },
    {
      id: "ev-2025-11-15",
      date: "2025-11-15",
      label: "Trobada d'Esbarts",
      note: "Comarques gironines",
      details: {
        time: "11:00 → 19:00",
        location: "Plaça de la Vila · Banyoles",
        group: "Cos de dansa principal",
        about: "Trobada anual amb esbarts d'arreu del Principat, amb mostra de repertori comarcal i sopar conjunt. L'Esbart Català hi participa com a convidat històric.",
        repertoire: ["Ball de Cascavells", "Contrapàs", "Sardana revessa"],
        access: { kind: "free", label: "Accés lliure" },
      },
    },
    {
      id: "ev-2025-12-21",
      date: "2025-12-21",
      label: "Cercavila de Nadal",
      note: "Ciutat Vella",
      details: {
        time: "18:00 → 20:30",
        location: "Sortida des de Plaça Sant Just",
        group: "Cos de dansa + Grup de bastoners",
        about: "Cercavila tradicional de Nadal pels carrers de Ciutat Vella, amb parades a Sant Felip Neri i acabant a la Plaça del Rei.",
        repertoire: ["Ball de bastons de Nadal", "Galops d'hivern"],
        access: { kind: "free", label: "Accés lliure · Itinerari per carrer" },
      },
    },
    {
      id: "ev-2026-02-12",
      date: "2026-02-12",
      label: "Festes de Santa Eulàlia",
      note: "Pla de la Catedral",
      details: {
        time: "12:00 → 13:30",
        location: "Pla de la Catedral · Barri Gòtic",
        group: "Cos de dansa principal",
        about: "Ballada matinal a la festa major d'hivern de Barcelona, al Pla de la Catedral, amb la cobla La Principal.",
        repertoire: ["Ball de Santa Eulàlia", "Sardanes de festa major"],
        access: { kind: "free", label: "Accés lliure" },
      },
    },
    {
      id: "ev-2026-02-28",
      date: "2026-02-28",
      label: "Ballada del Soci",
      note: "Acte anual de l'entitat",
      highlight: true,
      details: {
        time: "19:00 → 23:00",
        location: "Sala Petita · La Casa dels Entremesos",
        group: "Tots els socis i sòcies",
        about: "L'acte més important per als socis: ballada plenària, lliurament de reconeixements i sopar de germanor. Tradició ininterrompuda des de 1924.",
        repertoire: ["Repertori històric complet", "Estrenes de la temporada"],
        access: { kind: "reservation", label: "Reserva prèvia · Només socis" },
      },
    },
    {
      id: "ev-2026-03-14",
      date: "2026-03-14",
      label: "Matí Bastoner",
      note: "Plaça de Sant Jaume",
      details: {
        time: "11:00 → 13:00",
        location: "Plaça de Sant Jaume",
        group: "Grup de bastoners",
        about: "Ballada conjunta dels grups de bastoners de Catalunya, amb mostra de coreografies tradicionals i una creació pròpia estrenada per a l'ocasió.",
        repertoire: ["Ball de bastons (Barcelona)", "Bastoners de l'Esquirol", "Estrena 2026"],
        access: { kind: "free", label: "Accés lliure" },
      },
    },
    {
      id: "ev-2026-04-23",
      date: "2026-04-23",
      label: "Diada de Sant Jordi",
      note: "Mostres a centres escolars",
      details: {
        time: "Tot el matí",
        location: "Diversos centres educatius · Barcelona",
        group: "Equip pedagògic",
        about: "Itinerari de mostres pedagògiques per centres escolars amb motiu de la Diada, presentant el repertori bàsic i convidant l'alumnat a participar.",
        repertoire: ["Demostració didàctica", "Ball pla", "Sardana fàcil"],
        access: { kind: "reservation", label: "Reservat als centres adscrits" },
      },
    },
    {
      id: "ev-2026-05-30",
      date: "2026-05-30",
      label: "Cercaviles primaverals",
      note: "Festes majors",
      details: {
        time: "18:00 → 21:00",
        location: "Diversos barris de Barcelona",
        group: "Cos de dansa + cobla",
        about: "Coincidint amb les festes majors de barri, sortim a ballar al carrer en format cercavila amb la cobla. Itinerari rotatiu cada cap de setmana.",
        repertoire: ["Repertori de carrer", "Sardanes lluïdes"],
        access: { kind: "free", label: "Accés lliure" },
      },
    },
    {
      id: "ev-2026-06-20",
      date: "2026-06-20",
      label: "Festa fi de curs",
      note: "Tots els grups",
      details: {
        time: "19:30 → 22:30",
        location: "Teatre del Raval",
        group: "Tots els grups de l'esbart",
        about: "Cloenda del curs amb la gala anual que reuneix tots els grups: infantil, juvenil, cos principal i bastoners. Estrena obligada de peces noves.",
        repertoire: ["Estrenes del curs", "Repertori de cada grup"],
        access: { kind: "paid", label: "Entrada · 8€ / 4€ socis" },
      },
    },
    {
      id: "ev-2026-07-11",
      date: "2026-07-11",
      label: "Aplec d'estiu",
      note: "Itinerant per Catalunya",
      highlight: true,
      details: {
        time: "Tot el cap de setmana",
        location: "Vall de Núria (residència)",
        group: "Cos de dansa principal · 28 persones",
        about: "Estada anual de l'esbart per assajar repertori, descobrir balls de la zona i conviure. Programa amb intercanvi amb esbarts locals i mostra final oberta al públic.",
        repertoire: ["Balls del Ripollès", "Repertori en preparació", "Mostra oberta diumenge"],
        access: { kind: "reservation", label: "Mostra oberta · Reserva al web" },
      },
    },
    {
      id: "ev-2026-09-24",
      date: "2026-09-24",
      label: "MercèDansa",
      note: "Festes de la Mercè · Barcelona",
      highlight: true,
      details: {
        time: "18:00 → 22:00",
        location: "Plaça Sant Jaume · Plaça del Rei",
        group: "Cos de dansa + 6 esbarts convidats",
        about: "Espectacle estrella de l'esbart durant les Festes de la Mercè. Programa conjunt amb sis esbarts convidats i creació coreogràfica pròpia per a l'ocasió.",
        repertoire: ["Creació MercèDansa 2026", "Repertori festiu", "Final conjunt"],
        access: { kind: "free", label: "Accés lliure · Aforament al ras" },
      },
    },
  ],

  rows: [
    {
      id: "agenda",
      num: "01 / 05",
      title: ["Agenda d'", "esdeveniments"],
      teaser: "Pròximes actuacions, cercaviles, tallers i moments per ballar junts.",
    },
    {
      id: "espectacles",
      num: "02 / 05",
      title: ["Espectacles i ", "projectes"],
      teaser: "Mostres, cercaviles, MercèDansa i contractació per a festes majors i entitats.",
    },
    {
      id: "formacio",
      num: "03 / 05",
      title: ["Formació i ", "tallers"],
      teaser: "Cursos a aules i a demanda, tallers de descripció coreogràfica i dinamitzacions educatives.",
    },
    {
      id: "premi",
      num: "04 / 05",
      title: ["Premi ", "Rafel Tudó"],
      teaser: "Convocatòria quinquennal de recerca i divulgació de la dansa tradicional catalana.",
    },
    {
      id: "aportacions",
      num: "05 / 05",
      title: ["Aportacions a la ", "dansa catalana"],
      teaser: "Jornada quinquennal oberta de divulgació; les comunicacions es publiquen en volums propis.",
    },
  ],

  agendaCta: "Subscriu-te a l'agenda",

  espTypesTitle: "Tipus d'actuacions",
  espTypesSub: "Dues grans famílies de formats — adaptades a l'espai, la durada i el caràcter de cada convocatòria.",
  espTypesFormatsLabel: "Formats",
  espTypesRepertoireLabel: "Balls i entremesos",
  espTypesNotesLabel: "Detalls tècnics",
  espTypes: [
    {
      num: "01",
      name: ["Mostres de ", "dansa"],
      desc: "Programes autoconclusius amb música en directe. Es poden realitzar a plaça o espai públic ampli — interior o exterior, en empostissat o escenari — i s'adapten al caràcter de la convocatòria.",
      formats: [
        {
          title: "Petit format",
          meta: "Fins a 30 minuts",
          body: "Combinació lliure del repertori, fins a sis balls. Permet mostres monogràfiques: balls de Gitanes, Danses de Cort (mitjans del s. XVII fins a començaments del s. XX), o mostres temàtiques d'un mateix tipus de dansa o d'una zona geogràfica determinada.",
        },
        {
          title: "Format complet",
          meta: "60 — 90 min amb mitja part",
          body: "Programa de fins a dotze balls amb estructura editorial. Combina o amplia qualsevol dels apartats del format curt amb dramatúrgia pròpia per a temporada de teatre, festes majors o esdeveniments singulars.",
        },
        {
          title: "Trobades i mostres temàtiques",
          meta: "Coordinació especialitzada",
          body: "L'Esbart organitza trobades convidant balls i danses de pobles i ciutats de Catalunya, ja siguin temàtiques o de repertori obert. Des de 1993 coordina les activitats de l'espai MercèDansa de la programació de les Festes de la Mercè de Barcelona.",
        },
      ],
      notes: "Acompanyament musical amb flabiols o cobla de tres quartans, colla de grallers, cobla, orquestrina o altres formacions segons el repertori.",
    },
    {
      num: "02",
      name: ["Itinerants i ", "cercaviles"],
      desc: "Participació en qualsevol manifestació itinerant — cercaviles, seguicis, processons, acompanyaments d'autoritats — amb el patrimoni festiu en moviment.",
      formats: [
        {
          title: "Cercaviles i seguicis",
          meta: "Repertori de carrer",
          body: "Itineraris festius amb ball pla, entremesos i bastons. Grup variable adaptat al recorregut i a la durada.",
        },
        {
          title: "Actes institucionals",
          meta: "Acompanyament d'autoritats",
          body: "Presència en processons, seguicis oficials i actes municipals amb el repertori cerimonial de l'entitat.",
        },
        {
          title: "Tocs d'inici i ballades de lluïment",
          meta: "Repertori solemne",
          body: "Ballades curtes en moments rellevants — com el Toc d'Inici de les Festes de la Mercè amb els Cavallets Cotoners — amb els grups complets de bastoners i entremesos.",
        },
      ],
      repertoire: [
        { name: "Ball de Bastons", note: "Colla gran, mitjana i petita" },
        { name: "Ball de Cercolets" },
        { name: "Cavallets Petits", note: "Repertori propi de l'Esbart" },
        { name: "Cavallets Cotoners de Barcelona", note: "Recuperats per l'ECD · Seguici Popular" },
        { name: "Ball de Rentadores" },
        { name: "Ball de Mocadors" },
        { name: "Ball de Cintes" },
        { name: "Cascavellada" },
        { name: "Indiot", note: "Altres entremesos" },
      ],
      anecdote: {
        eyebrow: "Patrimoni recuperat · 1424 → avui",
        title: "Cavallets Cotoners de Barcelona",
        body: "La primera notícia documentada dels cavallets a Barcelona data del 1424 dins del Llibre de les Solemnitats. Els cotoners apareixen en les festes de Carles I, Felip II i en les beatificacions del s. XVII, i s'oblidaren després. L'any 1933 van ser recreats per l'Esbart Català de Dansaires amb peces del Taller Malatesta, amb motiu del 25è aniversari de l'entitat.",
        body2: "Des del 1994, integrats al Seguici Popular de Barcelona, ostenten la denominació oficial de Cavallets Cotoners de Barcelona i obren cada any el Toc d'Inici de les Festes de la Mercè, el Seguici d'Autoritats i la Cavalcada.",
      },
    },
  ],

  espMercedansaTitle: "MercèDansa · 1993 — actualitat",
  espMercedansaSub: "Mostra de danses tradicionals catalanes a les Festes de la Mercè. Coordinada per l'Esbart des de 1993, amb 33 edicions celebrades.",
  espMercedansaPrev: "Edició anterior",
  espMercedansaNext: "Edició següent",
  espMercedansaProgress: "de",
  espMercedansaProgramsLabel: "Programa",
  espMercedansaLead: "Cada any l'Ajuntament de Barcelona convida set poblacions de la geografia catalana — i, des de 1998, també d'arreu de la Mediterrània — perquè vinguin a ballar les seves danses a la Plaça de Sant Jaume, dins el conjunt MercèDansa.",
  espMercedansaNoTheme: "Edició MercèDansa",
  espMercedansaDances: "danses convidades",
  espMercedansaTowns: "poblacions",
  espMercedansaAccompanimentLabel: "Acompanyament musical",

  espMercedansaHistoryEyebrow: "Història · 1992 → actualitat",
  espMercedansaHistoryTitle: ["D'una proposta ", "ciutadana a una", " institució festiva"],
  espMercedansaHistoryIntro: "L'any 1992, en la convocatòria *Fes-te teva la Mercè* de l'Ajuntament de Barcelona, l'Esbart Català de Dansaires presentà el projecte d'una Mostra de danses tradicionals catalanes ballades per les persones que ho fan habitualment a les festes de la seva localitat. La proposta fou premiada i incorporada a la programació de la Mercè 1993, on adoptà el nom de MercèDansa.",
  espMercedansaHistoryIntro2: "A partir de 1997 s'hi afegeix El Galop de la Mercè — pasdoble compost per Jesús Ventura — com a acte de cloenda participatiu, i neix El Matí Bastoner amb les colles de Barcelona. Des de 1998, el cicle s'amplia amb el MercèDansa Mediterrània, acollint danses d'arreu de la conca mediterrània.",
  espMercedansaHistoryCriteriaLabel: "Criteris de selecció",
  espMercedansaHistoryCriteria: [
    "Dispersió geogràfica dels pobles convidats, sense concentració en una mateixa zona",
    "Varietat de les danses: coreografia, música, funció, vestuari, balladors",
    "Bona execució dels balladors i cura del muntatge escènic",
    "Varietat i cura del vestuari (en alguns casos, indumentària de carrer)",
    "Raresa de la dansa, per la forma o pels qui la ballen",
    "Cura i rigor en l'acompanyament musical",
  ],
  espMercedansaMilestones: [
    { year: "1992", title: "La idea", body: "L'ECD presenta a Fes-te teva la Mercè la proposta d'una Mostra de danses tradicionals catalanes. Resulta premiada." },
    { year: "1993", title: "Neix el MercèDansa", body: "Primera edició dins la programació de la Mercè, amb mostra matinal al Pla de la Seu i cloenda a Sant Jaume." },
    { year: "1997", title: "El Galop i el Matí Bastoner", body: "Estrena d'El Galop de la Mercè (pasdoble de Jesús Ventura) i creació d'El Matí Bastoner amb les colles bastoneres de Barcelona." },
    { year: "1998", title: "MercèDansa Mediterrània", body: "El cicle s'amplia acollint danses de la conca mediterrània: de Grècia a Occitània, d'Alacant a Gènova." },
    { year: "2002 → 2007", title: "Atenció a les comarques", body: "Edicions monogràfiques: Garraf, Vallès, Alt i Baix Empordà (Any Dalí), Catalunya Nord, Ponent i Maresme." },
    { year: "2008", title: "Centenari de l'Esbart", body: "Convidem balls i danses lligats a la història de l'entitat amb motiu dels 100 anys de l'ECD." },
  ],

  contractTitle: ["Contracta una ", "actuació"],
  contractP: "Adaptem el format, la durada i el repertori a la teva festa, escola o entitat. Mostres, cercaviles, tallers i dinamitzacions arreu de Catalunya.",
  contractCta: "Sol·licita pressupost",

  formacioTitle: "Cursos i tallers",
  formacioSub: "Per a escoles, entitats i grups que vulguin acostar-se a la dansa tradicional.",

  cafeteraEyebrow: "La Cafetera · 1988 → actualitat",
  cafeteraTitle: ["Un curs pioner de ", "dansa tradicional"],
  cafeteraIntro: "La Cafetera neix l'octubre de 1988, quan l'Esbart Català de Dansaires programa un curs de dansa tradicional amb motiu de celebrar els vuitanta anys de la fundació. El projecte, però, és anterior a aquesta data i ja s'havia assajat amb diverses iniciatives prèvies. Des d'aleshores és el curs de referència de l'entitat.",
  cafeteraIntro2: "Inicialment es plantejà en nou sessions de dilluns entre octubre i juny — amb una desena sessió de repàs, i alguns anys de sessions teòriques sobre descripció coreogràfica, arxius de dansa i interpretació documental. A partir de 2007 el format es transforma en sessions monogràfiques intensives de dissabte, matí i tarda.",
  cafeteraObjectivesLabel: "Objectius",
  cafeteraObjectives: [
    { title: "Resposta institucional", body: "Donar compliment a les conclusions del I Congrés de Cultura Tradicional i Popular del Departament de Cultura de la Generalitat de Catalunya." },
    { title: "Repertori per als esbarts", body: "Cobrir la necessitat dels esbarts de disposar d'un repertori de danses compartit i ben documentat." },
    { title: "Documentació oberta", body: "Posar a l'abast dels interessats la documentació pròpia de l'ampli repertori coreogràfic de l'Esbart Català de Dansaires." },
  ],
  cafeteraAudienceLabel: "A qui s'adreça",
  cafeteraAudience: [
    "Membres de grups de dansa",
    "Mestres de primària i secundària",
    "Monitors d'esplais i grups de lleure",
    "Animadors culturals",
    "Professors de música, educació física i dansa",
    "Persones interessades en la pràctica de la dansa catalana",
  ],
  cafeteraEvolutionLabel: "Evolució del format",
  cafeteraEvolution: [
    { range: "1988 → 2006", title: "Curs anual", body: "9 sessions de dilluns entre octubre i juny + 10a sessió de repàs. Anys puntuals amb sessions teòriques (descripció coreogràfica, arxius de dansa, interpretació documental)." },
    { range: "2008 → 2009", title: "Curs anual", body: "Recuperació puntual del format de dilluns durant un curs." },
    { range: "2007 → actualitat", title: "Sessions monogràfiques", body: "Format intensiu en dissabtes, matí i tarda, monogràfic per dansa o temàtica.", current: true },
  ],
  cafeteraAwardLabel: "Reconeixement",
  cafeteraAwardYear: "1993",
  cafeteraAwardTitle: "Premi Ateneu a la Creativitat Artística",
  cafeteraAwardBody: "Concedit per la Federació d'Ateneus de Catalunya a la millor iniciativa cultural. La Cafetera fou reconeguda com a projecte pioner de transmissió del patrimoni coreogràfic.",
  cafeteraOtherLabel: "Altres cursos i tallers",
  cafeteraOtherSub: "Programes complementaris a La Cafetera, per a escoles, entitats i activitats culturals.",

  formacioItems: [
    { num: "01", title: ["Ballem a ", "l'aula"], sub: "Curs pedagògic", desc: "Programa de dansa tradicional a l'escola amb sessions adaptades a primària i secundària." },
    { num: "02", title: ["Tallers de ", "dansa"], sub: "A demanda · Tots els públics", desc: "Sessions monogràfiques per fer un primer tast del repertori o aprofundir en un ball concret." },
    { num: "03", title: ["Descripció ", "coreogràfica"], sub: "Mestres i recercadors", desc: "Taller especialitzat sobre el sistema de notació i descripció de danses tradicionals." },
    { num: "04", title: ["Cursos a ", "demanda"], sub: "Entitats i ajuntaments", desc: "Disseny a mida per a programes municipals i entitats culturals." },
    { num: "05", title: ["Dinamitzacions ", "culturals"], sub: "Festes i espais públics", desc: "Activitats de dinamització amb dansa tradicional per a festes, esdeveniments i espais públics." },
    { num: "06", title: ["Mostres ", "educatives"], sub: "Centres educatius", desc: "Mostres didàctiques amb explicacions i participació del públic per a aules i centres." },
  ],

  premiTitle: "Premi Rafel Tudó",
  premiSub: "Convocatòria quinquennal de recerca i divulgació de la dansa tradicional catalana, dotada per l'Esbart Català de Dansaires.",
  premiPrev: "Convocatòria anterior",
  premiNext: "Convocatòria següent",
  premiProgress: "de",
  premiAboutEyebrow: "Premi Rafel Tudó · 1998 → avui",
  premiAboutTitle: ["Un premi per a la ", "recerca inèdita", " sobre la dansa tradicional"],
  premiAboutIntro1: "El Premi Rafel Tudó reconeix els treballs *inèdits* realitzats sobre algun aspecte de la dansa tradicional catalana — estudis, projectes, experiències, documentació sobre danses vives, enregistraments sonors o audiovisuals — en els àmbits de l'ensenyament, la documentació, la recerca, la recuperació i la difusió. Es valora especialment l'aportació de documentació històrica, material sonor i gràfic, i tot allò que enriqueixi els treballs presentats.",
  premiAboutIntro2: "La iniciativa, *única a Catalunya* per a treballs sobre dansa, neix l'any 1998 com una de les activitats del *norantè aniversari* de la fundació de l'Esbart Català de Dansaires. De periodicitat quinquennal, premia els autors guanyadors amb la publicació de l'obra en el suport requerit — o la realització pràctica del projecte segons les seves característiques — a més de la concessió pública del trofeu distintiu.",
  premiSinceLabel: "Des de",
  premiSince: "1998",
  premiPeriodicityLabel: "Periodicitat",
  premiPeriodicity: "Quinquennal",
  premiCallsLabel: "Convocatòries",
  premiCategoriesLabel: "Àmbits valorats",
  premiCategories: ["Ensenyament", "Documentació", "Recerca", "Recuperació", "Difusió"],
  premiAwardLabel: "Què premia",
  premiAwardBody: "Publicació de l'obra en el suport requerit — o realització pràctica del projecte segons les seves característiques — i concessió pública del trofeu distintiu.",
  premiAuthorLabel: "Autor/a",
  premiWorkLabel: "Obra premiada",
  premiPublicationLabel: "Publicació",
  premiAccessitLabel: "Accèssit",
  premiStatusDesertedTag: "Declarat desert",
  premiStatusDesertedBody: "En aquesta convocatòria el jurat va declarar desert el premi. Cap obra presentada va satisfer els criteris de l'edició.",
  premiStatusPendingTag: "Convocatòria oberta",
  premiStatusPendingBody: "Convocatòria en curs. Les bases i el calendari de presentació es publiquen al web de l'Esbart.",
  premiEditionEyebrow: "Convocatòria",

  // — Aportacions a la dansa catalana —
  aporTitle: "Aportacions a la dansa catalana",
  aporSub: "Jornada quinquennal oberta de recerca i divulgació al voltant de la dansa tradicional.",
  aporAboutEyebrow: "Aportacions · 2004 → avui",
  aporAboutTitle: ["Una jornada per ", "donar veu", " a la dansa tradicional"],
  aporIntro1: "*Aportacions a la dansa catalana* és un espai per donar veu i difondre qualsevol aspecte relacionat amb la dansa tradicional.",
  aporIntro2: "L'Esbart l'organitza *cada cinc anys*; la participació, com a ponent o com a públic, és oberta i gratuïta.",
  aporSinceLabel: "Des de",
  aporSince: "2004",
  aporPeriodicityLabel: "Periodicitat",
  aporPeriodicity: "Quinquennal",
  aporEditionsLabel: "Jornades celebrades",
  aporPubLabel: "Les actes, publicades",
  aporPubBody: "Les comunicacions presentades a cada jornada es recullen en volums editats per l'Esbart, que formen part del seu fons de publicacions.",
  aporPubCta: "Vegeu les publicacions al Patrimoni",
};

/* ─── ES ─────────────────────────────────────────────────────────────────── */
const ACTS_STRINGS_ES = {
  pageTitle: "Actividades · Esbart Català de Dansaires",
  heroEyebrow: "Agenda · Espectáculos · Formación · Premio",
  heroHashtag: "#TRADICIÓNVIVA",
  heroT1: "TRADICIÓN",
  heroT2: "VIVA",
  heroT3: "EN LA CALLE",
  heroTag: "Cada semana, el Esbart lleva la danza tradicional catalana a plazas, salas y escuelas de todo el territorio.",
  kineticWords: [
    "AGENDA", "CERCAVILA", "MERCÈDANSA", "BASTONES", "CAFETERA", "ENCUENTRO",
    "BALL DEL DIVENDRES", "MATÍ BASTONER", "CAVALLETS", "SARDANA",
    "MOIXIGANGA", "DANZA", "ESCENARIO", "TRADICIÓN", "PATRIMONIO", "ESBART",
  ],
  heroTitle: ["Tradición ", "viva", " en la calle y en ", "el escenario", "."],
  heroLead: "Cada semana, durante el año, el Esbart lleva la danza tradicional catalana a plazas, salas y escuelas de todo el territorio. Una agenda en movimiento constante desde 1908.",
  heroCta1: "Ven a bailar",
  heroCta2: "Contrata una actuación",
  heroStats: [
    { num: "80+", label: "Danzas en el repertorio" },
    { num: "30+", label: "Actuaciones al año" },
    { num: "118", label: "Años de actividad" },
  ],
  heroScroll: "Descubre",

  timelineEyebrow: "Un año en el Esbart",
  timelineTitle: ["¿Cuándo y dónde ", "bailamos?"],
  timelineHint: "Arrastra · rueda · desliza →",
  timelineTodayLabel: "Hoy",
  timelineLegendPast: "Celebrado",
  timelineLegendFuture: "Por venir",
  timelineTagPast: "Celebrado",
  timelineDetailsCta: "Detalles",
  detailLabels: {
    close: "Cerrar",
    when: "Horario",
    where: "Dónde",
    about: "Sobre el evento",
    repertoire: "Repertorio",
    tickets: "Acceso",
    group: "Grupo",
    save: "Añadir al calendario",
    share: "Compartir",
    eventOf: "Evento",
    free: "Libre",
    reservation: "Reserva previa",
    paid: "Con entrada",
    imagePlaceholder: "Imagen oficial · pendiente",
  },
  timelineItems: [
    { id: "ev-2025-10-04", date: "2025-10-04", label: "Inicio del Ball del Divendres", note: "La Casa dels Entremesos",
      details: { time: "21:30 → 00:00", location: "Pl. de les Beates, 2 · Ciutat Vella", group: "Todos los grupos · Abierto al público",
        about: "Reabrimos la temporada del Ball del Divendres, una tradición semanal donde el esbart invita a socios y visitantes a bailar juntos el repertorio básico catalán. No es necesaria experiencia previa.",
        repertoire: ["Jota d'Olot", "Ball pla", "Ballet de Déu", "Patatuf"],
        access: { kind: "free", label: "Acceso libre · Aforo limitado" } } },
    { id: "ev-2025-11-15", date: "2025-11-15", label: "Encuentro de Esbarts", note: "Comarcas gerundenses",
      details: { time: "11:00 → 19:00", location: "Plaça de la Vila · Banyoles", group: "Cuerpo de danza principal",
        about: "Encuentro anual con esbarts de todo el Principado, con muestra de repertorio comarcal y cena conjunta. El Esbart Català participa como invitado histórico.",
        repertoire: ["Ball de Cascavells", "Contrapàs", "Sardana revessa"],
        access: { kind: "free", label: "Acceso libre" } } },
    { id: "ev-2025-12-21", date: "2025-12-21", label: "Cercavila de Navidad", note: "Ciutat Vella",
      details: { time: "18:00 → 20:30", location: "Salida desde Plaça Sant Just", group: "Cuerpo de danza + Grupo de bastoneros",
        about: "Cercavila tradicional de Navidad por las calles de Ciutat Vella, con paradas en Sant Felip Neri y final en la Plaça del Rei.",
        repertoire: ["Ball de bastons de Nadal", "Galops d'hivern"],
        access: { kind: "free", label: "Acceso libre · Itinerario por la calle" } } },
    { id: "ev-2026-02-12", date: "2026-02-12", label: "Fiestas de Santa Eulàlia", note: "Pla de la Catedral",
      details: { time: "12:00 → 13:30", location: "Pla de la Catedral · Barri Gòtic", group: "Cuerpo de danza principal",
        about: "Baile matinal en la fiesta mayor de invierno de Barcelona, en el Pla de la Catedral, con la cobla La Principal.",
        repertoire: ["Ball de Santa Eulàlia", "Sardanas de fiesta mayor"],
        access: { kind: "free", label: "Acceso libre" } } },
    { id: "ev-2026-02-28", date: "2026-02-28", label: "Ballada del Soci", note: "Acto anual de la entidad", highlight: true,
      details: { time: "19:00 → 23:00", location: "Sala Petita · La Casa dels Entremesos", group: "Todos los socios y socias",
        about: "El acto más importante para los socios: baile plenario, entrega de reconocimientos y cena de hermandad. Tradición ininterrumpida desde 1924.",
        repertoire: ["Repertorio histórico completo", "Estrenos de la temporada"],
        access: { kind: "reservation", label: "Reserva previa · Solo socios" } } },
    { id: "ev-2026-03-14", date: "2026-03-14", label: "Matí Bastoner", note: "Plaça de Sant Jaume",
      details: { time: "11:00 → 13:00", location: "Plaça de Sant Jaume", group: "Grupo de bastoneros",
        about: "Baile conjunto de los grupos de bastoneros de Cataluña, con muestra de coreografías tradicionales y una creación propia estrenada para la ocasión.",
        repertoire: ["Ball de bastons (Barcelona)", "Bastoners de l'Esquirol", "Estreno 2026"],
        access: { kind: "free", label: "Acceso libre" } } },
    { id: "ev-2026-04-23", date: "2026-04-23", label: "Diada de Sant Jordi", note: "Muestras en centros escolares",
      details: { time: "Toda la mañana", location: "Varios centros educativos · Barcelona", group: "Equipo pedagógico",
        about: "Itinerario de muestras pedagógicas por centros escolares con motivo de la Diada, presentando el repertorio básico e invitando al alumnado a participar.",
        repertoire: ["Demostración didáctica", "Ball pla", "Sardana fácil"],
        access: { kind: "reservation", label: "Reservado a los centros adscritos" } } },
    { id: "ev-2026-05-30", date: "2026-05-30", label: "Cercaviles primaverales", note: "Fiestas mayores",
      details: { time: "18:00 → 21:00", location: "Varios barrios de Barcelona", group: "Cuerpo de danza + cobla",
        about: "Coincidiendo con las fiestas mayores de barrio, salimos a bailar en la calle en formato cercavila con la cobla. Itinerario rotativo cada fin de semana.",
        repertoire: ["Repertorio de calle", "Sardanas lucidas"],
        access: { kind: "free", label: "Acceso libre" } } },
    { id: "ev-2026-06-20", date: "2026-06-20", label: "Fiesta fin de curso", note: "Todos los grupos",
      details: { time: "19:30 → 22:30", location: "Teatre del Raval", group: "Todos los grupos del esbart",
        about: "Cierre del curso con la gala anual que reúne a todos los grupos: infantil, juvenil, cuerpo principal y bastoneros. Estreno obligado de piezas nuevas.",
        repertoire: ["Estrenos del curso", "Repertorio de cada grupo"],
        access: { kind: "paid", label: "Entrada · 8€ / 4€ socios" } } },
    { id: "ev-2026-07-11", date: "2026-07-11", label: "Aplec de verano", note: "Itinerante por Cataluña", highlight: true,
      details: { time: "Todo el fin de semana", location: "Vall de Núria (residencia)", group: "Cuerpo de danza principal · 28 personas",
        about: "Estancia anual del esbart para ensayar repertorio, descubrir bailes de la zona y convivir. Programa con intercambio con esbarts locales y muestra final abierta al público.",
        repertoire: ["Bailes del Ripollès", "Repertorio en preparación", "Muestra abierta domingo"],
        access: { kind: "reservation", label: "Muestra abierta · Reserva en la web" } } },
    { id: "ev-2026-09-24", date: "2026-09-24", label: "MercèDansa", note: "Fiestas de la Mercè · Barcelona", highlight: true,
      details: { time: "18:00 → 22:00", location: "Plaça Sant Jaume · Plaça del Rei", group: "Cuerpo de danza + 6 esbarts invitados",
        about: "Espectáculo estrella del esbart durante las Fiestas de la Mercè. Programa conjunto con seis esbarts invitados y creación coreográfica propia para la ocasión.",
        repertoire: ["Creación MercèDansa 2026", "Repertorio festivo", "Final conjunto"],
        access: { kind: "free", label: "Acceso libre · Aforo al raso" } } },
  ],

  rows: [
    { id: "agenda",      num: "01 / 05", title: ["Agenda de ", "eventos"],         teaser: "Próximas actuaciones, cercaviles, talleres y momentos para bailar juntos." },
    { id: "espectacles", num: "02 / 05", title: ["Espectáculos y ", "proyectos"],  teaser: "Muestras, cercaviles, MercèDansa y contratación para fiestas mayores y entidades." },
    { id: "formacio",    num: "03 / 05", title: ["Formación y ", "talleres"],      teaser: "Cursos en aulas y a demanda, talleres de descripción coreográfica y dinamizaciones educativas." },
    { id: "premi",       num: "04 / 05", title: ["Premio ", "Rafel Tudó"],         teaser: "Convocatoria quinquenal de investigación y divulgación de la danza tradicional catalana." },
    { id: "aportacions", num: "05 / 05", title: ["Aportaciones a la ", "danza catalana"], teaser: "Jornada quinquenal abierta de divulgación; las comunicaciones se publican en volúmenes propios." },
  ],

  agendaCta: "Suscríbete a la agenda",

  espTypesTitle: "Tipos de actuaciones",
  espTypesSub: "Dos grandes familias de formatos — adaptadas al espacio, la duración y el carácter de cada convocatoria.",
  espTypesFormatsLabel: "Formatos",
  espTypesRepertoireLabel: "Bailes y entremeses",
  espTypesNotesLabel: "Detalles técnicos",
  espTypes: [
    {
      num: "01", name: ["Muestras de ", "danza"],
      desc: "Programas autoconclusivos con música en directo. Pueden realizarse en plaza o espacio público amplio — interior o exterior, en tablado o escenario — y se adaptan al carácter de la convocatoria.",
      formats: [
        { title: "Formato pequeño", meta: "Hasta 30 minutos",
          body: "Combinación libre del repertorio, hasta seis bailes. Permite muestras monográficas: bailes de Gitanes, Danzas de Corte (mediados del s. XVII hasta principios del s. XX), o muestras temáticas de un mismo tipo de danza o de una zona geográfica determinada." },
        { title: "Formato completo", meta: "60 — 90 min con descanso",
          body: "Programa de hasta doce bailes con estructura editorial. Combina o amplía cualquiera de los apartados del formato corto con dramaturgia propia para temporada de teatro, fiestas mayores o eventos singulares." },
        { title: "Encuentros y muestras temáticas", meta: "Coordinación especializada",
          body: "El Esbart organiza encuentros invitando bailes y danzas de pueblos y ciudades de Cataluña, ya sean temáticas o de repertorio abierto. Desde 1993 coordina las actividades del espacio MercèDansa de la programación de las Fiestas de la Mercè de Barcelona." },
      ],
      notes: "Acompañamiento musical con flabiols o cobla de tres quartans, colla de grallers, cobla, orquestina u otras formaciones según el repertorio.",
    },
    {
      num: "02", name: ["Itinerantes y ", "cercaviles"],
      desc: "Participación en cualquier manifestación itinerante — cercaviles, séquitos, procesiones, acompañamientos de autoridades — con el patrimonio festivo en movimiento.",
      formats: [
        { title: "Cercaviles y séquitos", meta: "Repertorio de calle",
          body: "Itinerarios festivos con ball pla, entremeses y bastones. Grupo variable adaptado al recorrido y a la duración." },
        { title: "Actos institucionales", meta: "Acompañamiento de autoridades",
          body: "Presencia en procesiones, séquitos oficiales y actos municipales con el repertorio ceremonial de la entidad." },
        { title: "Toques de inicio y bailes de lucimiento", meta: "Repertorio solemne",
          body: "Bailes cortos en momentos relevantes — como el Toc d'Inici de las Fiestas de la Mercè con los Cavallets Cotoners — con los grupos completos de bastoneros y entremeses." },
      ],
      repertoire: [
        { name: "Ball de Bastons", note: "Colla grande, mediana y pequeña" },
        { name: "Ball de Cercolets" },
        { name: "Cavallets Petits", note: "Repertorio propio del Esbart" },
        { name: "Cavallets Cotoners de Barcelona", note: "Recuperados por el ECD · Seguici Popular" },
        { name: "Ball de Rentadores" },
        { name: "Ball de Mocadors" },
        { name: "Ball de Cintes" },
        { name: "Cascavellada" },
        { name: "Indiot", note: "Otros entremeses" },
      ],
      anecdote: {
        eyebrow: "Patrimonio recuperado · 1424 → hoy",
        title: "Cavallets Cotoners de Barcelona",
        body: "La primera noticia documentada de los cavallets en Barcelona data de 1424 dentro del Llibre de les Solemnitats. Los cotoners aparecen en las fiestas de Carlos I, Felipe II y en las beatificaciones del s. XVII, y se olvidaron después. En 1933 fueron recreados por el Esbart Català de Dansaires con piezas del Taller Malatesta, con motivo del 25º aniversario de la entidad.",
        body2: "Desde 1994, integrados en el Seguici Popular de Barcelona, ostentan la denominación oficial de Cavallets Cotoners de Barcelona y abren cada año el Toc d'Inici de las Fiestas de la Mercè, el Séquito de Autoridades y la Cabalgata.",
      },
    },
  ],

  espMercedansaTitle: "MercèDansa · 1993 — actualidad",
  espMercedansaSub: "Muestra de danzas tradicionales catalanas en las Fiestas de la Mercè. Coordinada por el Esbart desde 1993, con 33 ediciones celebradas.",
  espMercedansaPrev: "Edición anterior",
  espMercedansaNext: "Edición siguiente",
  espMercedansaProgress: "de",
  espMercedansaProgramsLabel: "Programa",
  espMercedansaLead: "Cada año el Ayuntamiento de Barcelona invita a siete poblaciones de la geografía catalana — y, desde 1998, también de toda la Mediterránea — para que vengan a bailar sus danzas en la Plaça de Sant Jaume, dentro del conjunto MercèDansa.",
  espMercedansaNoTheme: "Edición MercèDansa",
  espMercedansaDances: "danzas invitadas",
  espMercedansaTowns: "poblaciones",
  espMercedansaAccompanimentLabel: "Acompañamiento musical",

  espMercedansaHistoryEyebrow: "Historia · 1992 → actualidad",
  espMercedansaHistoryTitle: ["De una propuesta ", "ciudadana a una", " institución festiva"],
  espMercedansaHistoryIntro: "En 1992, en la convocatoria *Fes-te teva la Mercè* del Ayuntamiento de Barcelona, el Esbart Català de Dansaires presentó el proyecto de una Muestra de danzas tradicionales catalanas bailadas por las personas que lo hacen habitualmente en las fiestas de su localidad. La propuesta fue premiada e incorporada a la programación de la Mercè 1993, donde adoptó el nombre de MercèDansa.",
  espMercedansaHistoryIntro2: "A partir de 1997 se añade El Galop de la Mercè — pasodoble compuesto por Jesús Ventura — como acto de cierre participativo, y nace El Matí Bastoner con las colles de Barcelona. Desde 1998, el ciclo se amplía con el MercèDansa Mediterrània, acogiendo danzas de toda la cuenca mediterránea.",
  espMercedansaHistoryCriteriaLabel: "Criterios de selección",
  espMercedansaHistoryCriteria: [
    "Dispersión geográfica de los pueblos invitados, sin concentración en una misma zona",
    "Variedad de las danzas: coreografía, música, función, vestuario, bailadores",
    "Buena ejecución de los bailadores y cuidado del montaje escénico",
    "Variedad y cuidado del vestuario (en algunos casos, indumentaria de calle)",
    "Rareza de la danza, por la forma o por quienes la bailan",
    "Cuidado y rigor en el acompañamiento musical",
  ],
  espMercedansaMilestones: [
    { year: "1992",        title: "La idea",                          body: "El ECD presenta a Fes-te teva la Mercè la propuesta de una Muestra de danzas tradicionales catalanas. Resulta premiada." },
    { year: "1993",        title: "Nace el MercèDansa",               body: "Primera edición dentro de la programación de la Mercè, con muestra matinal en el Pla de la Seu y cierre en Sant Jaume." },
    { year: "1997",        title: "El Galop y el Matí Bastoner",      body: "Estreno de El Galop de la Mercè (pasodoble de Jesús Ventura) y creación de El Matí Bastoner con las colles bastoneras de Barcelona." },
    { year: "1998",        title: "MercèDansa Mediterrània",          body: "El ciclo se amplía acogiendo danzas de la cuenca mediterránea: de Grecia a Occitania, de Alicante a Génova." },
    { year: "2002 → 2007", title: "Atención a las comarcas",          body: "Ediciones monográficas: Garraf, Vallès, Alt y Baix Empordà (Año Dalí), Cataluña Norte, Ponent y Maresme." },
    { year: "2008",        title: "Centenario del Esbart",            body: "Invitamos bailes y danzas ligados a la historia de la entidad con motivo de los 100 años del ECD." },
  ],

  contractTitle: ["Contrata una ", "actuación"],
  contractP: "Adaptamos el formato, la duración y el repertorio a tu fiesta, escuela o entidad. Muestras, cercaviles, talleres y dinamizaciones por toda Cataluña.",
  contractCta: "Solicita presupuesto",

  formacioTitle: "Cursos y talleres",
  formacioSub: "Para escuelas, entidades y grupos que quieran acercarse a la danza tradicional.",

  cafeteraEyebrow: "La Cafetera · 1988 → actualidad",
  cafeteraTitle: ["Un curso pionero de ", "danza tradicional"],
  cafeteraIntro: "La Cafetera nace en octubre de 1988, cuando el Esbart Català de Dansaires programa un curso de danza tradicional con motivo de la celebración de los ochenta años de su fundación. El proyecto, sin embargo, es anterior a esta fecha y ya se había ensayado con diversas iniciativas previas. Desde entonces es el curso de referencia de la entidad.",
  cafeteraIntro2: "Inicialmente se planteó en nueve sesiones de lunes entre octubre y junio — con una décima sesión de repaso, y algunos años de sesiones teóricas sobre descripción coreográfica, archivos de danza e interpretación documental. A partir de 2007 el formato se transforma en sesiones monográficas intensivas de sábado, mañana y tarde.",
  cafeteraObjectivesLabel: "Objetivos",
  cafeteraObjectives: [
    { title: "Respuesta institucional",   body: "Dar cumplimiento a las conclusiones del I Congrés de Cultura Tradicional i Popular del Departament de Cultura de la Generalitat de Catalunya." },
    { title: "Repertorio para los esbarts", body: "Cubrir la necesidad de los esbarts de disponer de un repertorio de danzas compartido y bien documentado." },
    { title: "Documentación abierta",     body: "Poner al alcance de los interesados la documentación propia del amplio repertorio coreográfico del Esbart Català de Dansaires." },
  ],
  cafeteraAudienceLabel: "A quién se dirige",
  cafeteraAudience: [
    "Miembros de grupos de danza",
    "Maestros de primaria y secundaria",
    "Monitores de esplais y grupos de ocio",
    "Animadores culturales",
    "Profesores de música, educación física y danza",
    "Personas interesadas en la práctica de la danza catalana",
  ],
  cafeteraEvolutionLabel: "Evolución del formato",
  cafeteraEvolution: [
    { range: "1988 → 2006",      title: "Curso anual",           body: "9 sesiones de lunes entre octubre y junio + 10ª sesión de repaso. Años puntuales con sesiones teóricas (descripción coreográfica, archivos de danza, interpretación documental)." },
    { range: "2008 → 2009",      title: "Curso anual",           body: "Recuperación puntual del formato de lunes durante un curso." },
    { range: "2007 → actualidad", title: "Sesiones monográficas", body: "Formato intensivo en sábados, mañana y tarde, monográfico por danza o temática.", current: true },
  ],
  cafeteraAwardLabel: "Reconocimiento",
  cafeteraAwardYear: "1993",
  cafeteraAwardTitle: "Premio Ateneu a la Creatividad Artística",
  cafeteraAwardBody: "Concedido por la Federación de Ateneus de Catalunya a la mejor iniciativa cultural. La Cafetera fue reconocida como proyecto pionero de transmisión del patrimonio coreográfico.",
  cafeteraOtherLabel: "Otros cursos y talleres",
  cafeteraOtherSub: "Programas complementarios a La Cafetera, para escuelas, entidades y actividades culturales.",

  formacioItems: [
    { num: "01", title: ["Bailamos en ", "el aula"],          sub: "Curso pedagógico",                 desc: "Programa de danza tradicional en la escuela con sesiones adaptadas a primaria y secundaria." },
    { num: "02", title: ["Talleres de ", "danza"],            sub: "A demanda · Todos los públicos",   desc: "Sesiones monográficas para una primera toma de contacto con el repertorio o profundizar en un baile concreto." },
    { num: "03", title: ["Descripción ", "coreográfica"],     sub: "Maestros e investigadores",        desc: "Taller especializado sobre el sistema de notación y descripción de danzas tradicionales." },
    { num: "04", title: ["Cursos a ", "demanda"],             sub: "Entidades y ayuntamientos",        desc: "Diseño a medida para programas municipales y entidades culturales." },
    { num: "05", title: ["Dinamizaciones ", "culturales"],    sub: "Fiestas y espacios públicos",      desc: "Actividades de dinamización con danza tradicional para fiestas, eventos y espacios públicos." },
    { num: "06", title: ["Muestras ", "educativas"],          sub: "Centros educativos",               desc: "Muestras didácticas con explicaciones y participación del público para aulas y centros." },
  ],

  premiTitle: "Premio Rafel Tudó",
  premiSub: "Convocatoria quinquenal de investigación y divulgación de la danza tradicional catalana, dotada por el Esbart Català de Dansaires.",
  premiPrev: "Convocatoria anterior",
  premiNext: "Convocatoria siguiente",
  premiProgress: "de",
  premiAboutEyebrow: "Premio Rafel Tudó · 1998 → hoy",
  premiAboutTitle: ["Un premio para la ", "investigación inédita", " sobre danza tradicional"],
  premiAboutIntro1: "El Premio Rafel Tudó reconoce los trabajos *inéditos* realizados sobre algún aspecto de la danza tradicional catalana — estudios, proyectos, experiencias, documentación sobre danzas vivas, grabaciones sonoras o audiovisuales — en los ámbitos de la enseñanza, la documentación, la investigación, la recuperación y la difusión. Se valora especialmente la aportación de documentación histórica, material sonoro y gráfico, y todo aquello que enriquezca los trabajos presentados.",
  premiAboutIntro2: "La iniciativa, *única en Cataluña* para trabajos sobre danza, nace en 1998 como una de las actividades del *nonagésimo aniversario* de la fundación del Esbart Català de Dansaires. De periodicidad quinquenal, premia a los autores ganadores con la publicación de la obra en el soporte requerido — o la realización práctica del proyecto según sus características — además de la concesión pública del trofeo distintivo.",
  premiSinceLabel: "Desde",
  premiSince: "1998",
  premiPeriodicityLabel: "Periodicidad",
  premiPeriodicity: "Quinquenal",
  premiCallsLabel: "Convocatorias",
  premiCategoriesLabel: "Ámbitos valorados",
  premiCategories: ["Enseñanza", "Documentación", "Investigación", "Recuperación", "Difusión"],
  premiAwardLabel: "Qué premia",
  premiAwardBody: "Publicación de la obra en el soporte requerido — o realización práctica del proyecto según sus características — y concesión pública del trofeo distintivo.",
  premiAuthorLabel: "Autor/a",
  premiWorkLabel: "Obra premiada",
  premiPublicationLabel: "Publicación",
  premiAccessitLabel: "Accésit",
  premiStatusDesertedTag: "Declarado desierto",
  premiStatusDesertedBody: "En esta convocatoria el jurado declaró desierto el premio. Ninguna obra presentada satisfizo los criterios de la edición.",
  premiStatusPendingTag: "Convocatoria abierta",
  premiStatusPendingBody: "Convocatoria en curso. Las bases y el calendario de presentación se publican en la web del Esbart.",
  premiEditionEyebrow: "Convocatoria",

  // — Aportaciones a la danza catalana —
  aporTitle: "Aportaciones a la danza catalana",
  aporSub: "Jornada quinquenal abierta de investigación y divulgación en torno a la danza tradicional.",
  aporAboutEyebrow: "Aportaciones · 2004 → hoy",
  aporAboutTitle: ["Una jornada para ", "dar voz", " a la danza tradicional"],
  aporIntro1: "*Aportaciones a la danza catalana* es un espacio para dar voz y difundir cualquier aspecto relacionado con la danza tradicional.",
  aporIntro2: "El Esbart la organiza *cada cinco años*; la participación, como ponente o como público, es abierta y gratuita.",
  aporSinceLabel: "Desde",
  aporSince: "2004",
  aporPeriodicityLabel: "Periodicidad",
  aporPeriodicity: "Quinquenal",
  aporEditionsLabel: "Jornadas celebradas",
  aporPubLabel: "Las actas, publicadas",
  aporPubBody: "Las comunicaciones presentadas en cada jornada se recogen en volúmenes editados por el Esbart, que forman parte de su fondo de publicaciones.",
  aporPubCta: "Ver las publicaciones en Patrimonio",
};

/* ─── EN ─────────────────────────────────────────────────────────────────── */
const ACTS_STRINGS_EN = {
  pageTitle: "Activities · Esbart Català de Dansaires",
  heroEyebrow: "Calendar · Performances · Training · Award",
  heroHashtag: "#LIVINGTRADITION",
  heroT1: "LIVING",
  heroT2: "TRADITION",
  heroT3: "IN MOTION",
  heroTag: "Every week, the Esbart brings traditional Catalan dance to squares, halls and schools across the territory.",
  kineticWords: [
    "CALENDAR", "PARADE", "MERCÈDANSA", "BASTONS", "CAFETERA", "GATHERING",
    "BALL DEL DIVENDRES", "MATÍ BASTONER", "CAVALLETS", "SARDANA",
    "MOIXIGANGA", "DANCE", "STAGE", "TRADITION", "HERITAGE", "ESBART",
  ],
  heroTitle: ["Living ", "tradition", " on the street and on ", "stage", "."],
  heroLead: "Every week, throughout the year, the Esbart brings traditional Catalan dance to squares, halls and schools all over the territory. An agenda in constant motion since 1908.",
  heroCta1: "Come dance",
  heroCta2: "Book a performance",
  heroStats: [
    { num: "80+", label: "Dances in repertoire" },
    { num: "30+", label: "Performances per year" },
    { num: "118", label: "Years active" },
  ],
  heroScroll: "Discover",

  timelineEyebrow: "A year at the Esbart",
  timelineTitle: ["When and where do ", "we dance?"],
  timelineHint: "Drag · scroll · slide →",
  timelineTodayLabel: "Today",
  timelineLegendPast: "Past",
  timelineLegendFuture: "Upcoming",
  timelineTagPast: "Past",
  timelineDetailsCta: "Details",
  detailLabels: {
    close: "Close",
    when: "Time",
    where: "Where",
    about: "About the event",
    repertoire: "Repertoire",
    tickets: "Access",
    group: "Group",
    save: "Add to calendar",
    share: "Share",
    eventOf: "Event",
    free: "Free",
    reservation: "Reservation",
    paid: "Ticketed",
    imagePlaceholder: "Official image · pending",
  },
  timelineItems: [
    { id: "ev-2025-10-04", date: "2025-10-04", label: "Ball del Divendres opening", note: "La Casa dels Entremesos",
      details: { time: "21:30 → 00:00", location: "Pl. de les Beates, 2 · Ciutat Vella", group: "All groups · Open to the public",
        about: "We reopen the Ball del Divendres season, a weekly tradition where the esbart invites members and visitors to dance the basic Catalan repertoire together. No prior experience required.",
        repertoire: ["Jota d'Olot", "Ball pla", "Ballet de Déu", "Patatuf"],
        access: { kind: "free", label: "Free access · Limited capacity" } } },
    { id: "ev-2025-11-15", date: "2025-11-15", label: "Esbarts gathering", note: "Girona counties",
      details: { time: "11:00 → 19:00", location: "Plaça de la Vila · Banyoles", group: "Main dance ensemble",
        about: "Annual gathering with esbarts from across the Principality, featuring regional repertoire and a shared dinner. The Esbart Català participates as a historic guest.",
        repertoire: ["Ball de Cascavells", "Contrapàs", "Sardana revessa"],
        access: { kind: "free", label: "Free access" } } },
    { id: "ev-2025-12-21", date: "2025-12-21", label: "Christmas parade", note: "Ciutat Vella",
      details: { time: "18:00 → 20:30", location: "Starting from Plaça Sant Just", group: "Dance ensemble + Bastoners group",
        about: "Traditional Christmas parade through the streets of Ciutat Vella, with stops at Sant Felip Neri and ending at Plaça del Rei.",
        repertoire: ["Ball de bastons de Nadal", "Galops d'hivern"],
        access: { kind: "free", label: "Free access · Street route" } } },
    { id: "ev-2026-02-12", date: "2026-02-12", label: "Santa Eulàlia festivities", note: "Pla de la Catedral",
      details: { time: "12:00 → 13:30", location: "Pla de la Catedral · Barri Gòtic", group: "Main dance ensemble",
        about: "Morning dance at Barcelona's winter festivity, at the Pla de la Catedral, with the cobla La Principal.",
        repertoire: ["Ball de Santa Eulàlia", "Festival sardanas"],
        access: { kind: "free", label: "Free access" } } },
    { id: "ev-2026-02-28", date: "2026-02-28", label: "Members' Ball", note: "Annual entity event", highlight: true,
      details: { time: "19:00 → 23:00", location: "Sala Petita · La Casa dels Entremesos", group: "All members",
        about: "The most important event for members: plenary dance, recognitions and a fellowship dinner. An unbroken tradition since 1924.",
        repertoire: ["Full historical repertoire", "Season premieres"],
        access: { kind: "reservation", label: "Reservation · Members only" } } },
    { id: "ev-2026-03-14", date: "2026-03-14", label: "Matí Bastoner", note: "Plaça de Sant Jaume",
      details: { time: "11:00 → 13:00", location: "Plaça de Sant Jaume", group: "Bastoners group",
        about: "Joint dance of Catalonia's bastoners groups, with traditional choreographies and an original piece premiered for the occasion.",
        repertoire: ["Ball de bastons (Barcelona)", "Bastoners de l'Esquirol", "2026 premiere"],
        access: { kind: "free", label: "Free access" } } },
    { id: "ev-2026-04-23", date: "2026-04-23", label: "Sant Jordi day", note: "School showings",
      details: { time: "All morning", location: "Various schools · Barcelona", group: "Educational team",
        about: "An itinerary of educational showings at schools on Sant Jordi day, presenting the basic repertoire and inviting students to take part.",
        repertoire: ["Didactic demonstration", "Ball pla", "Easy sardana"],
        access: { kind: "reservation", label: "Reserved for affiliated schools" } } },
    { id: "ev-2026-05-30", date: "2026-05-30", label: "Spring parades", note: "Local festivities",
      details: { time: "18:00 → 21:00", location: "Various Barcelona neighbourhoods", group: "Dance ensemble + cobla",
        about: "Coinciding with the local neighbourhood festivities, we go out to dance in the street with the cobla. Rotating route every weekend.",
        repertoire: ["Street repertoire", "Festive sardanas"],
        access: { kind: "free", label: "Free access" } } },
    { id: "ev-2026-06-20", date: "2026-06-20", label: "End-of-year gala", note: "All groups",
      details: { time: "19:30 → 22:30", location: "Teatre del Raval", group: "All groups of the esbart",
        about: "Closing the year with the annual gala bringing together all groups: children, youth, main ensemble and bastoners. Mandatory premiere of new pieces.",
        repertoire: ["Year's premieres", "Each group's repertoire"],
        access: { kind: "paid", label: "Ticket · €8 / €4 members" } } },
    { id: "ev-2026-07-11", date: "2026-07-11", label: "Summer retreat", note: "Travelling across Catalonia", highlight: true,
      details: { time: "Full weekend", location: "Vall de Núria (residence)", group: "Main dance ensemble · 28 people",
        about: "Annual stay of the esbart to rehearse repertoire, discover local dances and share time together. Programme with exchange with local esbarts and a final open showing.",
        repertoire: ["Ripollès dances", "Repertoire in preparation", "Open showing on Sunday"],
        access: { kind: "reservation", label: "Open showing · Reserve on the website" } } },
    { id: "ev-2026-09-24", date: "2026-09-24", label: "MercèDansa", note: "La Mercè festivities · Barcelona", highlight: true,
      details: { time: "18:00 → 22:00", location: "Plaça Sant Jaume · Plaça del Rei", group: "Dance ensemble + 6 guest esbarts",
        about: "The esbart's flagship performance during the La Mercè festivities. Joint programme with six guest esbarts and an original choreography for the occasion.",
        repertoire: ["MercèDansa 2026 premiere", "Festive repertoire", "Joint finale"],
        access: { kind: "free", label: "Free access · Outdoor seating" } } },
  ],

  rows: [
    { id: "agenda",      num: "01 / 05", title: ["Events ", "calendar"],            teaser: "Upcoming performances, parades, workshops and moments to dance together." },
    { id: "espectacles", num: "02 / 05", title: ["Performances and ", "projects"],  teaser: "Showings, parades, MercèDansa and bookings for local festivities and organisations." },
    { id: "formacio",    num: "03 / 05", title: ["Training and ", "workshops"],     teaser: "Classroom and on-demand courses, choreographic description workshops and educational activities." },
    { id: "premi",       num: "04 / 05", title: ["Rafel Tudó ", "Award"],           teaser: "Quinquennial call for research and dissemination of Catalan traditional dance." },
    { id: "aportacions", num: "05 / 05", title: ["Contributions to ", "Catalan dance"], teaser: "An open five-yearly gathering for dissemination; the papers are published in dedicated volumes." },
  ],

  agendaCta: "Subscribe to the calendar",

  espTypesTitle: "Performance types",
  espTypesSub: "Two large families of formats — adapted to the space, duration and character of each call.",
  espTypesFormatsLabel: "Formats",
  espTypesRepertoireLabel: "Dances and entremeses",
  espTypesNotesLabel: "Technical details",
  espTypes: [
    {
      num: "01", name: ["Dance ", "showings"],
      desc: "Self-contained programmes with live music. They can take place in a square or large public space — indoors or outdoors, on a platform or stage — and adapt to the character of the occasion.",
      formats: [
        { title: "Small format", meta: "Up to 30 minutes",
          body: "Free combination from the repertoire, up to six dances. Allows monographic showings: Gitanes dances, Court dances (mid-17th to early 20th century), or thematic showings of one dance type or a specific geographic area." },
        { title: "Full format", meta: "60 — 90 min with interval",
          body: "Programme of up to twelve dances with editorial structure. Combines or expands any of the short-format sections with original dramaturgy for theatre season, local festivities or singular events." },
        { title: "Gatherings and thematic showings", meta: "Specialised coordination",
          body: "The Esbart organises gatherings inviting dances from towns and cities of Catalonia, either thematic or open repertoire. Since 1993 it coordinates the MercèDansa activities within the La Mercè festivities programme in Barcelona." },
      ],
      notes: "Musical accompaniment with flabiols or cobla de tres quartans, colla de grallers, cobla, orchestra or other ensembles depending on the repertoire.",
    },
    {
      num: "02", name: ["Processions and ", "parades"],
      desc: "Participation in any travelling event — parades, processions, ceremonial entourages, authority escorts — bringing festive heritage in motion.",
      formats: [
        { title: "Parades and processions", meta: "Street repertoire",
          body: "Festive routes with ball pla, entremeses and bastons. Variable group size adapted to the route and duration." },
        { title: "Institutional acts", meta: "Authority escort",
          body: "Presence in processions, official entourages and municipal acts with the entity's ceremonial repertoire." },
        { title: "Opening calls and showcase dances", meta: "Solemn repertoire",
          body: "Short dances at key moments — such as the Toc d'Inici of La Mercè with the Cavallets Cotoners — with the full bastoners and entremeses groups." },
      ],
      repertoire: [
        { name: "Ball de Bastons", note: "Large, medium and small colla" },
        { name: "Ball de Cercolets" },
        { name: "Cavallets Petits", note: "Esbart's own repertoire" },
        { name: "Cavallets Cotoners de Barcelona", note: "Recovered by ECD · Seguici Popular" },
        { name: "Ball de Rentadores" },
        { name: "Ball de Mocadors" },
        { name: "Ball de Cintes" },
        { name: "Cascavellada" },
        { name: "Indiot", note: "Other entremeses" },
      ],
      anecdote: {
        eyebrow: "Recovered heritage · 1424 → today",
        title: "Cavallets Cotoners de Barcelona",
        body: "The first documented record of cavallets in Barcelona dates from 1424 in the Llibre de les Solemnitats. The cotoners appear at the festivities of Charles I, Philip II and at 17th-century beatifications, and were later forgotten. In 1933 they were recreated by the Esbart Català de Dansaires with pieces from the Taller Malatesta, on the entity's 25th anniversary.",
        body2: "Since 1994, integrated in the Seguici Popular of Barcelona, they bear the official name Cavallets Cotoners de Barcelona and open every year the Toc d'Inici of the La Mercè festivities, the Authorities' Entourage and the Parade.",
      },
    },
  ],

  espMercedansaTitle: "MercèDansa · 1993 — present",
  espMercedansaSub: "Showing of traditional Catalan dances at the La Mercè festivities. Coordinated by the Esbart since 1993, with 33 editions held.",
  espMercedansaPrev: "Previous edition",
  espMercedansaNext: "Next edition",
  espMercedansaProgress: "of",
  espMercedansaProgramsLabel: "Programme",
  espMercedansaLead: "Every year the Barcelona City Council invites seven towns from across Catalonia — and, since 1998, also from across the Mediterranean — to come and dance their traditional dances at Plaça de Sant Jaume, within the MercèDansa cycle.",
  espMercedansaNoTheme: "MercèDansa edition",
  espMercedansaDances: "guest dances",
  espMercedansaTowns: "towns",
  espMercedansaAccompanimentLabel: "Musical accompaniment",

  espMercedansaHistoryEyebrow: "History · 1992 → present",
  espMercedansaHistoryTitle: ["From a ", "citizens' proposal to a", " festive institution"],
  espMercedansaHistoryIntro: "In 1992, in the *Fes-te teva la Mercè* call by the Barcelona City Council, the Esbart Català de Dansaires submitted the project of a Showing of traditional Catalan dances performed by those who do so regularly at the festivities of their hometown. The proposal was awarded and incorporated into the Mercè 1993 programme, where it adopted the name MercèDansa.",
  espMercedansaHistoryIntro2: "From 1997, El Galop de la Mercè — a paso doble composed by Jesús Ventura — was added as a participatory closing act, and El Matí Bastoner was created with the Barcelona colles. Since 1998, the cycle has expanded with the MercèDansa Mediterrània, hosting dances from across the Mediterranean basin.",
  espMercedansaHistoryCriteriaLabel: "Selection criteria",
  espMercedansaHistoryCriteria: [
    "Geographic dispersion of the invited towns, with no concentration in a single area",
    "Variety of dances: choreography, music, function, costume, dancers",
    "Good execution by the dancers and care in stage production",
    "Variety and care of costume (in some cases, street attire)",
    "Rarity of the dance, in form or in who performs it",
    "Care and rigour in the musical accompaniment",
  ],
  espMercedansaMilestones: [
    { year: "1992",        title: "The idea",                       body: "ECD submits to Fes-te teva la Mercè the proposal of a Showing of traditional Catalan dances. It is awarded." },
    { year: "1993",        title: "MercèDansa is born",             body: "First edition within the La Mercè programme, with a morning showing at the Pla de la Seu and closing at Sant Jaume." },
    { year: "1997",        title: "El Galop and the Matí Bastoner", body: "Premiere of El Galop de la Mercè (paso doble by Jesús Ventura) and creation of El Matí Bastoner with Barcelona's bastoners colles." },
    { year: "1998",        title: "MercèDansa Mediterrània",        body: "The cycle expands to host dances from the Mediterranean basin: from Greece to Occitania, from Alicante to Genoa." },
    { year: "2002 → 2007", title: "Focus on the counties",          body: "Monographic editions: Garraf, Vallès, Alt and Baix Empordà (Dalí Year), Northern Catalonia, Ponent and Maresme." },
    { year: "2008",        title: "Esbart centenary",               body: "We invite dances linked to the entity's history on the occasion of the ECD's 100 years." },
  ],

  contractTitle: ["Book a ", "performance"],
  contractP: "We adapt format, duration and repertoire to your festivity, school or organisation. Showings, parades, workshops and activities all over Catalonia.",
  contractCta: "Request a quote",

  formacioTitle: "Courses and workshops",
  formacioSub: "For schools, organisations and groups wishing to engage with traditional dance.",

  cafeteraEyebrow: "La Cafetera · 1988 → present",
  cafeteraTitle: ["A pioneering course on ", "traditional dance"],
  cafeteraIntro: "La Cafetera was born in October 1988, when the Esbart Català de Dansaires programmed a traditional dance course on the occasion of the entity's eightieth anniversary. The project, however, predates this date and had already been tested through several previous initiatives. Since then, it has been the entity's flagship course.",
  cafeteraIntro2: "It was initially structured in nine Monday sessions between October and June — with a tenth review session, and some years of theoretical sessions on choreographic description, dance archives and documentary interpretation. From 2007, the format shifts to intensive monographic Saturday sessions, morning and afternoon.",
  cafeteraObjectivesLabel: "Goals",
  cafeteraObjectives: [
    { title: "Institutional response",      body: "Fulfilling the conclusions of the I Congress of Traditional and Popular Culture of the Department of Culture of the Generalitat de Catalunya." },
    { title: "Repertoire for the esbarts",   body: "Meeting the esbarts' need for a shared, well-documented dance repertoire." },
    { title: "Open documentation",           body: "Making available to those interested the documentation of the wide choreographic repertoire of the Esbart Català de Dansaires." },
  ],
  cafeteraAudienceLabel: "Who it's for",
  cafeteraAudience: [
    "Members of dance groups",
    "Primary and secondary school teachers",
    "Esplais and leisure groups leaders",
    "Cultural facilitators",
    "Music, physical education and dance teachers",
    "People interested in practising Catalan dance",
  ],
  cafeteraEvolutionLabel: "Format evolution",
  cafeteraEvolution: [
    { range: "1988 → 2006",   title: "Annual course",          body: "9 Monday sessions between October and June + 10th review session. Some years with theoretical sessions (choreographic description, dance archives, documentary interpretation)." },
    { range: "2008 → 2009",   title: "Annual course",          body: "Brief revival of the Monday format for one year." },
    { range: "2007 → present", title: "Monographic sessions",  body: "Intensive format on Saturdays, morning and afternoon, monographic by dance or theme.", current: true },
  ],
  cafeteraAwardLabel: "Recognition",
  cafeteraAwardYear: "1993",
  cafeteraAwardTitle: "Ateneu Award for Artistic Creativity",
  cafeteraAwardBody: "Granted by the Federation of Ateneus of Catalonia for the best cultural initiative. La Cafetera was recognised as a pioneering project for the transmission of choreographic heritage.",
  cafeteraOtherLabel: "Other courses and workshops",
  cafeteraOtherSub: "Programmes complementary to La Cafetera, for schools, organisations and cultural activities.",

  formacioItems: [
    { num: "01", title: ["Dance in ", "the classroom"],      sub: "Educational course",                desc: "Traditional dance programme in schools with sessions adapted to primary and secondary levels." },
    { num: "02", title: ["Dance ", "workshops"],             sub: "On demand · All audiences",         desc: "Monographic sessions for a first taste of the repertoire or to deepen one specific dance." },
    { num: "03", title: ["Choreographic ", "description"],   sub: "Teachers and researchers",          desc: "Specialised workshop on the notation and description system for traditional dances." },
    { num: "04", title: ["On-demand ", "courses"],           sub: "Organisations and councils",        desc: "Bespoke design for municipal programmes and cultural organisations." },
    { num: "05", title: ["Cultural ", "activities"],         sub: "Festivities and public spaces",     desc: "Activities with traditional dance for festivities, events and public spaces." },
    { num: "06", title: ["Educational ", "showings"],        sub: "Schools",                           desc: "Didactic showings with explanations and audience participation for classrooms and centres." },
  ],

  premiTitle: "Rafel Tudó Award",
  premiSub: "Quinquennial call for research and dissemination of Catalan traditional dance, funded by the Esbart Català de Dansaires.",
  premiPrev: "Previous call",
  premiNext: "Next call",
  premiProgress: "of",
  premiAboutEyebrow: "Rafel Tudó Award · 1998 → present",
  premiAboutTitle: ["An award for ", "unpublished research", " on traditional dance"],
  premiAboutIntro1: "The Rafel Tudó Award recognises *unpublished* works on any aspect of Catalan traditional dance — studies, projects, experiences, documentation of living dances, sound or audiovisual recordings — in the fields of teaching, documentation, research, recovery and dissemination. Special value is given to historical documentation, sound and graphic material, and anything that enriches the works submitted.",
  premiAboutIntro2: "The initiative, *unique in Catalonia* for works on dance, was born in 1998 as part of the *90th anniversary* of the founding of the Esbart Català de Dansaires. Held every five years, it awards the winning authors with the publication of the work in the required medium — or the practical realisation of the project according to its characteristics — in addition to the public granting of the distinguishing trophy.",
  premiSinceLabel: "Since",
  premiSince: "1998",
  premiPeriodicityLabel: "Frequency",
  premiPeriodicity: "Every 5 years",
  premiCallsLabel: "Editions",
  premiCategoriesLabel: "Fields considered",
  premiCategories: ["Teaching", "Documentation", "Research", "Recovery", "Dissemination"],
  premiAwardLabel: "What is awarded",
  premiAwardBody: "Publication of the work in the required medium — or practical realisation of the project depending on its characteristics — and public granting of the distinguishing trophy.",
  premiAuthorLabel: "Author",
  premiWorkLabel: "Awarded work",
  premiPublicationLabel: "Publication",
  premiAccessitLabel: "Honourable mention",
  premiStatusDesertedTag: "Declared void",
  premiStatusDesertedBody: "In this edition the jury declared the award void. None of the submitted works met the criteria of the call.",
  premiStatusPendingTag: "Open call",
  premiStatusPendingBody: "Call currently open. Terms and submission schedule are published on the Esbart's website.",
  premiEditionEyebrow: "Edition",

  // — Contributions to Catalan dance —
  aporTitle: "Contributions to Catalan dance",
  aporSub: "An open five-yearly gathering for research and dissemination around traditional dance.",
  aporAboutEyebrow: "Contributions · 2004 → present",
  aporAboutTitle: ["A gathering that ", "gives voice", " to traditional dance"],
  aporIntro1: "*Contributions to Catalan dance* is a space to give voice to and share any aspect of traditional dance.",
  aporIntro2: "The Esbart organises it *every five years*; participation, as speaker or audience, is open and free.",
  aporSinceLabel: "Since",
  aporSince: "2004",
  aporPeriodicityLabel: "Frequency",
  aporPeriodicity: "Every 5 years",
  aporEditionsLabel: "Gatherings held",
  aporPubLabel: "Published proceedings",
  aporPubBody: "The papers presented at each gathering are collected in volumes published by the Esbart, part of its publications collection.",
  aporPubCta: "See the publications in Heritage",
};

const ACTS_STRINGS = { ca: ACTS_STRINGS_CA, es: ACTS_STRINGS_ES, en: ACTS_STRINGS_EN };

/* ═══════════════════════════════════════════════════════════════════════════
   Components
   ═══════════════════════════════════════════════════════════════════════════ */

/* ─── Cavallets silhouette — line-art animat (paral·lel a Sobre) ───────── */
function CavalletsSilhouette() {
  const ref = React.useRef(null);
  React.useEffect(() => {
    const host = ref.current;
    if (!host) return;
    let cancelled = false;
    fetch("assets/cavallet_silhouette.svg")
      .then((r) => r.text())
      .then((txt) => {
        if (cancelled) return;
        host.innerHTML = txt;
        const svg = host.querySelector("svg");
        if (!svg) return;
        svg.setAttribute("class", "hero-cavallet");
        svg.setAttribute("preserveAspectRatio", "xMidYMid meet");
        svg.setAttribute("aria-hidden", "true");
        svg.removeAttribute("width");
        svg.removeAttribute("height");
        const paths = svg.querySelectorAll("path, polygon, polyline, line, rect, circle, ellipse");
        paths.forEach((p, i) => {
          p.setAttribute("stroke", "currentColor");
          p.setAttribute("fill", "none");
          p.setAttribute("stroke-width", "1");
          let len = 0;
          try { len = p.getTotalLength ? p.getTotalLength() : 0; } catch (e) { len = 1200; }
          if (!len || !isFinite(len)) len = 1200;
          p.style.strokeDasharray = len;
          p.style.strokeDashoffset = len;
          p.style.animation = "heroDraw 2.4s cubic-bezier(.65,.05,.36,1) forwards";
          p.style.animationDelay = (i * 0.014).toFixed(3) + "s";
        });
      })
      .catch(() => {});
    return () => { cancelled = true; };
  }, []);
  return <div ref={ref} className="hero-cavallet-host" aria-hidden="true"></div>;
}

/* ─── Hero — sober editorial (mirrors Sobre l'Esbart) ───────────────── */
function ActsHero({ t }) {
  const ti = t.heroTitle;
  return (
    <header className="acts-hero acts-hero--editorial" id="inici">
      <div className="acts-hero__bg" aria-hidden="true"></div>
      <CavalletsSilhouette />
      <div className="wrap">
        <div className="acts-hero__eyebrow reveal">{t.heroEyebrow}</div>
        <h1 className="acts-hero__title reveal d1">
          {ti[0]}<em>{ti[1]}</em>{ti[2]}<em>{ti[3]}</em>{ti[4]}
        </h1>
        <p className="acts-hero__lead reveal d2">{t.heroLead}</p>
        <div className="acts-hero__meta reveal d3">
          {t.heroStats.map((s, i) => (
            <div key={i} className="acts-hero__meta-item">
              <div className="acts-hero__meta-num">{s.num}</div>
              <div className="acts-hero__meta-label">{s.label}</div>
            </div>
          ))}
        </div>
      </div>
      <div className="acts-hero__scroll" aria-hidden="true">{t.heroScroll}</div>
    </header>
  );
}

/* ─── Timeline horitzontal — calendari de 12 mesos amb "avui" ─────────── */
const MONTHS_CA = ["Gen","Feb","Mar","Abr","Mai","Jun","Jul","Ago","Set","Oct","Nov","Des"];
const MONTHS_FULL_CA = ["Gener","Febrer","Març","Abril","Maig","Juny","Juliol","Agost","Setembre","Octubre","Novembre","Desembre"];
const MONTHS_FULL_ES = ["Enero","Febrero","Marzo","Abril","Mayo","Junio","Julio","Agosto","Septiembre","Octubre","Noviembre","Diciembre"];
const MONTHS_FULL_EN = ["January","February","March","April","May","June","July","August","September","October","November","December"];
function monthFull(idx, lang) {
  if (lang === 'es') return MONTHS_FULL_ES[idx];
  if (lang === 'en') return MONTHS_FULL_EN[idx];
  return MONTHS_FULL_CA[idx];
}
function ActsTimeline({ t, compact = false, lang = 'ca' }) {
  const trackRef = useRef(null);
  const stripRef = useRef(null);
  const cardRefs = useRef(new Map());
  const [openEvent, setOpenEvent] = useState(null);

  // — Drag + wheel + touch — el track segueix sent un scroller lliure —
  useEffect(() => {
    const track = trackRef.current;
    if (!track) return;
    let isDown = false, startX = 0, startScroll = 0, moved = 0;
    const onDown = (e) => {
      if (e.button !== undefined && e.button !== 0) return;
      isDown = true; moved = 0;
      startX = e.pageX;
      startScroll = track.scrollLeft;
    };
    const onMove = (e) => {
      if (!isDown) return;
      const dx = e.pageX - startX;
      moved = Math.abs(dx);
      if (moved > 4 && !track.classList.contains('is-dragging')) {
        track.classList.add('is-dragging');
      }
      if (track.classList.contains('is-dragging')) {
        track.scrollLeft = startScroll - dx;
      }
    };
    const onUp = () => {
      if (!isDown) return;
      isDown = false;
      track.classList.remove('is-dragging');
    };
    const onClickCapture = (e) => {
      if (moved > 6) { e.preventDefault(); e.stopPropagation(); }
    };
    const onWheel = (e) => {
      if (Math.abs(e.deltaY) > Math.abs(e.deltaX)) {
        const max = track.scrollWidth - track.clientWidth;
        if ((e.deltaY > 0 && track.scrollLeft < max) ||
            (e.deltaY < 0 && track.scrollLeft > 0)) {
          e.preventDefault();
          track.scrollLeft += e.deltaY;
        }
      }
    };
    track.addEventListener('mousedown', onDown);
    window.addEventListener('mousemove', onMove);
    window.addEventListener('mouseup', onUp);
    track.addEventListener('click', onClickCapture, true);
    track.addEventListener('wheel', onWheel, { passive: false });
    return () => {
      track.removeEventListener('mousedown', onDown);
      window.removeEventListener('mousemove', onMove);
      window.removeEventListener('mouseup', onUp);
      track.removeEventListener('click', onClickCapture, true);
      track.removeEventListener('wheel', onWheel);
    };
  }, []);

  // — Construcció del calendari de 12 mesos —
  // Compatible amb dades estàtiques i amb dades dinàmiques (backend):
  // accepta items amb `date` ISO (YYYY-MM-DD). Recalcula a cada canvi.
  // LIVE since F1: /agenda feeds the timeline; t.timelineItems stays as the
  // eternal fallback (INT-1). `from` reaches ~10 months back so past events
  // keep filling the 12-month window as the CMS grows. The map() folds the
  // D6 event into the timeline shape; fields the CMS doesn't carry (group,
  // repertoire, access) are simply absent and their detail rows hide.
  const from = React.useMemo(() => {
    const d = new Date();
    d.setMonth(d.getMonth() - 10);
    return d.toISOString().slice(0, 10);
  }, []);
  const { items: liveItems } = window.EsbartData.useCollection(
    `agenda?lang=${lang}&from=${from}&size=50`,
    t.timelineItems || [],
    { map: (j) => j.items.map((e) => ({
        id: e.slug, date: e.iso, label: e.title, note: e.place,
        highlight: e.featured,
        details: { time: e.time, location: e.place, about: e.description },
      })) }
  );
  const items = React.useMemo(
    () => [...liveItems].sort((a, b) => a.date.localeCompare(b.date)),
    [liveItems]
  );
  const lastDate = items.length ? items[items.length - 1].date : new Date().toISOString().slice(0,10);
  const [ly, lm] = lastDate.split('-').map(Number);
  const months = React.useMemo(() => {
    const out = [];
    for (let i = 11; i >= 0; i--) {
      const d = new Date(ly, (lm - 1) - i, 1);
      const y = d.getFullYear();
      const m = d.getMonth() + 1;
      out.push({ year: y, month: m, key: `${y}-${String(m).padStart(2,'0')}` });
    }
    return out;
  }, [ly, lm]);

  const now = new Date();
  const ny = now.getFullYear();
  const nm = now.getMonth() + 1;
  const nd = now.getDate();
  const todayMonthIdx = months.findIndex(mm => mm.year === ny && mm.month === nm);
  const daysInToday = new Date(ny, nm, 0).getDate();
  const todayFrac = (nd - 0.5) / daysInToday;
  const todayInRange = todayMonthIdx >= 0;
  const todayPos = todayInRange ? todayMonthIdx + todayFrac : null;

  // bandes d'any per mostrar 2025/2026 al damunt
  const yearBands = React.useMemo(() => {
    const bands = [];
    months.forEach((mm, idx) => {
      const last = bands[bands.length - 1];
      if (!last || last.year !== mm.year) bands.push({ year: mm.year, start: idx, end: idx });
      else last.end = idx;
    });
    return bands;
  }, [months]);

  // events agrupats per mes
  const itemsByMonth = React.useMemo(() => {
    const map = {};
    items.forEach(it => { (map[it.date.slice(0,7)] ||= []).push(it); });
    return map;
  }, [items]);

  const cmpYM = (y, m) => (y < ny) || (y === ny && m < nm);
  const isPastMonth = (mm) => cmpYM(mm.year, mm.month);
  const isCurrentMonth = (mm) => mm.year === ny && mm.month === nm;
  const todayLabel = `${nd} ${MONTHS_CA[nm - 1].toLowerCase()}`;

  // Auto-scroll a "avui" en muntar (centrat)
  useEffect(() => {
    const track = trackRef.current;
    const strip = stripRef.current;
    if (!track || !strip || todayPos == null) return;
    const cell = strip.querySelector('[data-cell]');
    if (!cell) return;
    const scrollToToday = () => {
      const cellW = cell.getBoundingClientRect().width;
      const stripLeft = strip.getBoundingClientRect().left - track.getBoundingClientRect().left + track.scrollLeft;
      const padLeft = parseFloat(getComputedStyle(strip).paddingLeft) || 0;
      const targetX = stripLeft + padLeft + cellW * todayPos - track.clientWidth * 0.5;
      track.scrollTo({ left: Math.max(0, targetX), behavior: 'auto' });
    };
    scrollToToday();
    // Re-run after layout settles (fonts, accordion open animation)
    const t1 = setTimeout(scrollToToday, 180);
    const t2 = setTimeout(scrollToToday, 600);
    return () => { clearTimeout(t1); clearTimeout(t2); };
  }, [todayPos]);

  // — Animacions d'entrada GSAP (ScrollTrigger horitzontal sobre el scroller) —
  // Cada targeta apareix per la dreta amb fade + slide + reveal del dia/etiqueta.
  // Es regenera quan canvien els items (preparat per dades dinàmiques i multidioma).
  useEffect(() => {
    const gsap = window.gsap;
    const ScrollTrigger = window.ScrollTrigger;
    if (!gsap || !ScrollTrigger) return;
    gsap.registerPlugin(ScrollTrigger);
    const track = trackRef.current;
    const strip = stripRef.current;
    if (!track || !strip) return;

    const ctx = gsap.context(() => {
      const cards = strip.querySelectorAll('.acts-timeline__item');
      cards.forEach((card) => {
        const day   = card.querySelector('.acts-timeline__day');
        const label = card.querySelector('.acts-timeline__label');
        const note  = card.querySelector('.acts-timeline__note');
        const tag   = card.querySelector('.acts-timeline__tag');

        gsap.set(card, { opacity: 0, y: 36, scale: 0.985 });
        if (day)   gsap.set(day,   { yPercent: 80, rotate: 4, opacity: 0 });
        if (label) gsap.set(label, { opacity: 0, y: 14 });
        if (note)  gsap.set(note,  { opacity: 0, y: 10 });
        if (tag)   gsap.set(tag,   { opacity: 0, x: -8 });

        const tl = gsap.timeline({
          scrollTrigger: {
            scroller: track,
            horizontal: true,
            trigger: card,
            start: 'left 92%',
            end: 'left 55%',
            toggleActions: 'play none none reverse',
          },
        });
        tl.to(card, { opacity: 1, y: 0, scale: 1, duration: 0.55, ease: 'power3.out' });
        if (day)   tl.to(day,   { yPercent: 0, rotate: 0, opacity: 1, duration: 0.6, ease: 'back.out(1.6)' }, '-=0.35');
        if (label) tl.to(label, { opacity: 1, y: 0, duration: 0.4, ease: 'power2.out' }, '-=0.35');
        if (note)  tl.to(note,  { opacity: 1, y: 0, duration: 0.35, ease: 'power2.out' }, '-=0.25');
        if (tag)   tl.to(tag,   { opacity: 1, x: 0, duration: 0.3, ease: 'power2.out' }, '-=0.2');
      });

      // Animació suau de la línia "avui" en entrar la secció (efecte de bateig).
      const todayEl = strip.querySelector('.acts-timeline__today-line');
      if (todayEl) {
        gsap.from(todayEl, {
          scaleY: 0,
          transformOrigin: 'top center',
          duration: 1.1,
          ease: 'power3.inOut',
          scrollTrigger: { trigger: track, start: 'top 85%' },
        });
      }
      const todayPill = strip.querySelector('.acts-timeline__today-pill');
      if (todayPill) {
        gsap.from(todayPill, {
          opacity: 0, y: -8, duration: 0.6, ease: 'power2.out', delay: 0.4,
          scrollTrigger: { trigger: track, start: 'top 85%' },
        });
      }

      ScrollTrigger.refresh();
    }, strip);

    return () => ctx.revert();
  }, [items]);

  return (
    <section className={"acts-timeline" + (compact ? " acts-timeline--compact" : "")}>
      {!compact && (
        <div className="acts-timeline__head reveal">
          <div>
            <div className="acts-timeline__eyebrow">{t.timelineEyebrow}</div>
            <h2 className="acts-timeline__title">{t.timelineTitle[0]}<em>{t.timelineTitle[1]}</em></h2>
          </div>
          <div className="acts-timeline__meta">
            <div className="acts-timeline__scroll-hint" aria-hidden="true">
              <svg viewBox="0 0 24 14" width="32" height="14" fill="none" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round" strokeLinejoin="round"><path d="M6 1L1 7l5 6"/></svg>
              <svg viewBox="0 0 24 14" width="32" height="14" fill="none" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round" strokeLinejoin="round"><path d="M18 1l5 6-5 6"/></svg>
            </div>
          </div>
        </div>
      )}
      {compact && (
        <div className="acts-timeline__meta acts-timeline__meta--compact">
          <div className="acts-timeline__scroll-hint" aria-hidden="true">
            <svg viewBox="0 0 24 14" width="32" height="14" fill="none" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round" strokeLinejoin="round"><path d="M6 1L1 7l5 6"/></svg>
            <svg viewBox="0 0 24 14" width="32" height="14" fill="none" stroke="currentColor" strokeWidth="1.6" strokeLinecap="round" strokeLinejoin="round"><path d="M18 1l5 6-5 6"/></svg>
          </div>
        </div>
      )}
      <div className="acts-timeline__track" ref={trackRef}>
        <div className="acts-timeline__strip" ref={stripRef}>
          <div className="acts-timeline__years">
            {yearBands.map((b, i) => (
              <div
                key={i}
                className="acts-timeline__year-band"
                style={{
                  left: `calc(var(--acts-cell-w) * ${b.start})`,
                  width: `calc(var(--acts-cell-w) * ${b.end - b.start + 1})`,
                }}
              >
                <span>{b.year}</span>
              </div>
            ))}
          </div>
          <div className="acts-timeline__axis">
            {todayPos !== null && (
              <div
                className="acts-timeline__today"
                style={{ left: `calc(var(--acts-cell-w) * ${todayPos})` }}
              >
                <div className="acts-timeline__today-pill">
                  <span className="acts-timeline__today-pill-eyebrow">{t.timelineTodayLabel}</span>
                  <span className="acts-timeline__today-pill-date">{todayLabel}</span>
                </div>
                <span className="acts-timeline__today-line" />
                <span className="acts-timeline__today-dot" />
              </div>
            )}
            <div className="acts-timeline__row">
              {months.map((mm) => {
                const past = isPastMonth(mm);
                const current = isCurrentMonth(mm);
                const evs = itemsByMonth[mm.key] || [];
                const cellStyle = current ? { '--today-frac': todayFrac } : undefined;
                return (
                  <div
                    key={mm.key}
                    data-cell
                    style={cellStyle}
                    className={`acts-timeline__cell ${past ? 'is-past' : 'is-future'} ${current ? 'is-current' : ''}`}
                  >
                    <div className="acts-timeline__events">
                      {evs.map((ev, j) => {
                        const evPast = ev.date < now.toISOString().slice(0,10);
                        const dNum = Number(ev.date.slice(8, 10));
                        const dMon = MONTHS_CA[Number(ev.date.slice(5,7))-1].toLowerCase();
                        const evKey = ev.id || `${ev.date}-${j}`;
                        return (
                          <button
                            type="button"
                            key={evKey}
                            ref={(el) => { if (el) cardRefs.current.set(evKey, el); else cardRefs.current.delete(evKey); }}
                            onClick={() => setOpenEvent({ ev, key: evKey })}
                            className={`acts-timeline__item ${evPast ? 'is-past' : 'is-future'} ${ev.highlight ? 'is-highlight' : ''}`}
                          >
                            <div className="acts-timeline__day">
                              <span className="acts-timeline__day-num">{dNum}</span>
                              <span className="acts-timeline__day-mon">{dMon}</span>
                            </div>
                            <div className="acts-timeline__label">{ev.label}</div>
                          </button>
                        );
                      })}
                    </div>
                    <div className="acts-timeline__tick" />
                    <div className="acts-timeline__month">
                      {MONTHS_CA[mm.month - 1]}
                    </div>
                  </div>
                );
              })}
            </div>
          </div>
        </div>
      </div>
      {openEvent && (
        <ActsEventDetail
          ev={openEvent.ev}
          sourceEl={cardRefs.current.get(openEvent.key)}
          t={t}
          lang={lang}
          onClose={() => setOpenEvent(null)}
        />
      )}
    </section>
  );
}

/* ─── Event detail — Flip "wow" expansion from card → full overlay ────── */
function ActsEventDetail({ ev, sourceEl, t, onClose, lang }) {
  const overlayRef = React.useRef(null);
  const heroRef = React.useRef(null);
  const sheetRef = React.useRef(null);
  const closingRef = React.useRef(false);
  const labels = t.detailLabels || {};
  const detail = ev.details || {};
  const dNum = Number(ev.date.slice(8, 10));
  const dMon = monthFull(Number(ev.date.slice(5,7))-1, lang);
  const dYear = ev.date.slice(0,4);
  const evPast = ev.date < new Date().toISOString().slice(0,10);

  React.useLayoutEffect(() => {
    const gsap = window.gsap;
    const Flip = window.Flip;
    if (!gsap || !Flip) return;
    gsap.registerPlugin(Flip);

    const hero = heroRef.current;
    const sheet = sheetRef.current;
    const overlay = overlayRef.current;
    if (!hero || !sheet || !overlay) return;

    // bloqueja l'scroll del document
    const prevOverflow = document.body.style.overflow;
    document.body.style.overflow = 'hidden';

    // amaga la targeta original durant la transició perquè no es vegi a sota
    if (sourceEl) sourceEl.style.visibility = 'hidden';

    // 1) backdrop in
    gsap.fromTo(overlay, { opacity: 0 }, { opacity: 1, duration: 0.45, ease: 'power2.out' });

    // 2) Flip hero from card → natural large position
    if (sourceEl) {
      // Posicionem el hero al bbox de la card original primer
      Flip.fit(hero, sourceEl, { scale: true });
      // Capturem aquest estat (= petit, sobre la card)
      const state = Flip.getState(hero);
      // Treiem la transformació perquè torni a la mida natural (gran)
      gsap.set(hero, { clearProps: 'transform,width,height' });
      // Animem des de l'estat petit fins a la mida natural (gran)
      Flip.from(state, {
        duration: 0.9,
        ease: 'power3.inOut',
        scale: true,
        absolute: false,
        onComplete: () => {
          // Reset any residual inline transforms left by Flip so the hero
          // sits naturally inside the modal shell
          gsap.set(hero, { clearProps: 'all' });
          // 3) Reveal the sheet contents (cascade)
          const sections = sheet.querySelectorAll('[data-detail-block]');
          gsap.fromTo(sections,
            { opacity: 0, y: 44 },
            { opacity: 1, y: 0, duration: 0.65, stagger: 0.07, ease: 'power3.out' });
        },
      });
    } else {
      // sense source (fallback): fade-in net
      gsap.from(hero, { opacity: 0, y: 30, duration: 0.5, ease: 'power2.out' });
      gsap.fromTo(sheet.querySelectorAll('[data-detail-block]'),
        { opacity: 0, y: 30 },
        { opacity: 1, y: 0, duration: 0.55, stagger: 0.06, ease: 'power3.out', delay: 0.15 });
    }

    return () => {
      document.body.style.overflow = prevOverflow;
      if (sourceEl) sourceEl.style.visibility = '';
    };
  }, []);

  const triggerClose = React.useCallback(() => {
    if (closingRef.current) return;
    closingRef.current = true;
    const gsap = window.gsap;
    const Flip = window.Flip;
    if (!gsap || !Flip) { onClose(); return; }
    const hero = heroRef.current;
    const sheet = sheetRef.current;
    const overlay = overlayRef.current;

    // amaga sections amb cascade ràpida
    if (sheet) {
      gsap.to(sheet.querySelectorAll('[data-detail-block]'), {
        opacity: 0, y: 20, duration: 0.28, stagger: 0.025, ease: 'power2.in',
      });
    }

    // morph hero back to source card
    gsap.delayedCall(0.22, () => {
      if (hero && sourceEl) {
        const state = Flip.getState(hero);
        Flip.fit(hero, sourceEl, { scale: true });
        Flip.from(state, {
          duration: 0.55,
          ease: 'power3.in',
          scale: true,
          onComplete: onClose,
        });
      } else {
        gsap.to(hero, { opacity: 0, y: 20, duration: 0.3, onComplete: onClose });
      }
      gsap.to(overlay, { opacity: 0, duration: 0.45, ease: 'power2.in' });
    });
  }, [onClose, sourceEl]);

  // ESC tancar
  React.useEffect(() => {
    const onKey = (e) => { if (e.key === 'Escape') triggerClose(); };
    window.addEventListener('keydown', onKey);
    return () => window.removeEventListener('keydown', onKey);
  }, [triggerClose]);

  // The access row only renders when the data really carries it — defaulting
  // to "free" would state an access policy the CMS never published (INT-11).
  const accessKind = detail.access ? (detail.access.kind || 'free') : null;
  const accessLabel = detail.access
    ? (detail.access.label
      || (accessKind === 'free' ? labels.free : accessKind === 'reservation' ? labels.reservation : labels.paid))
    : null;

  return (
    <div className="acts-detail" ref={overlayRef} role="dialog" aria-modal="true">
      <div className="acts-detail__backdrop" onClick={triggerClose} />
      <div className="acts-detail__shell">
        <button className="acts-detail__close" onClick={triggerClose} aria-label={labels.close || 'Close'}>
          <span className="acts-detail__close-x" aria-hidden="true">
            <svg width="18" height="18" viewBox="0 0 18 18" fill="none">
              <path d="M2 2l14 14M16 2L2 16" stroke="currentColor" strokeWidth="1.5" strokeLinecap="round"/>
            </svg>
          </span>
          <span className="acts-detail__close-label">{labels.close || 'Tancar'}</span>
        </button>

        {/* HERO — l'element que es morpha des de la card original */}
        <div
          className={`acts-timeline__item acts-detail__hero ${evPast ? 'is-past' : 'is-future'} ${ev.highlight ? 'is-highlight' : ''}`}
          ref={heroRef}
        >
          <div className="acts-detail__eyebrow">
            <span>{labels.eventOf || 'Esdeveniment'}</span>
            <span className="acts-detail__eyebrow-dot" />
            <span>{dYear}</span>
          </div>
          <div className="acts-timeline__day acts-detail__day">
            <span className="acts-timeline__day-num">{dNum}</span>
            <span className="acts-timeline__day-mon">{dMon}</span>
          </div>
          <div className="acts-timeline__label acts-detail__label">{ev.label}</div>
          <div className="acts-timeline__note acts-detail__note">{ev.note}</div>
        </div>

        <div className="acts-detail__sheet" ref={sheetRef}>
          <div className="acts-detail__grid">
            <div className="acts-detail__meta" data-detail-block>
              {detail.time && (
                <div className="acts-detail__meta-row">
                  <span className="acts-detail__meta-key">{labels.when}</span>
                  <span className="acts-detail__meta-val">{detail.time}</span>
                </div>
              )}
              {detail.location && (
                <div className="acts-detail__meta-row">
                  <span className="acts-detail__meta-key">{labels.where}</span>
                  <span className="acts-detail__meta-val">{detail.location}</span>
                </div>
              )}
              {detail.group && (
                <div className="acts-detail__meta-row">
                  <span className="acts-detail__meta-key">{labels.group}</span>
                  <span className="acts-detail__meta-val">{detail.group}</span>
                </div>
              )}
              {accessLabel && (
                <div className="acts-detail__meta-row">
                  <span className="acts-detail__meta-key">{labels.tickets}</span>
                  <span className={`acts-detail__access acts-detail__access--${accessKind}`}>{accessLabel}</span>
                </div>
              )}
            </div>

            <div className="acts-detail__media" data-detail-block aria-hidden="true">
              <div className="acts-detail__placeholder">
                <span className="acts-detail__placeholder-text">{labels.imagePlaceholder || 'Image'}</span>
              </div>
            </div>

            {detail.about && (
              <div className="acts-detail__about" data-detail-block>
                <div className="acts-detail__section-title">{labels.about}</div>
                <p className="acts-detail__about-text">{detail.about}</p>
              </div>
            )}

            {detail.repertoire && detail.repertoire.length > 0 && (
              <div className="acts-detail__rep" data-detail-block>
                <div className="acts-detail__section-title">{labels.repertoire}</div>
                <ul className="acts-detail__rep-list">
                  {detail.repertoire.map((r, i) => (
                    <li key={i} className="acts-detail__rep-item">
                      <span className="acts-detail__rep-num">{String(i+1).padStart(2,'0')}</span>
                      <span>{r}</span>
                    </li>
                  ))}
                </ul>
              </div>
            )}

            <div className="acts-detail__actions" data-detail-block>
              <button type="button" className="acts-detail__action is-primary">
                {labels.save || 'Save'}
                <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8">
                  <rect x="3" y="5" width="18" height="16" rx="2"/>
                  <path d="M16 3v4M8 3v4M3 9h18"/>
                </svg>
              </button>
              <button type="button" className="acts-detail__action">
                {labels.share || 'Share'}
                <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.8">
                  <circle cx="18" cy="5" r="3"/><circle cx="6" cy="12" r="3"/><circle cx="18" cy="19" r="3"/>
                  <path d="m8.6 13.5 6.8 4M15.4 6.5l-6.8 4"/>
                </svg>
              </button>
            </div>
          </div>
        </div>
      </div>
    </div>
  );
}

/* ─── Accordion row — motor compartit (shared/components/Accordion.jsx) ── */
const EsbartAccordion = window.EsbartAccordion;

/* ─── Section blocks ────────────────────────────────────────────────────── */

function AgendaSection({ t, lang }) {
  return <ActsTimeline t={t} compact lang={lang} />;
}

function EspectaclesSection({ t }) {
  const [active, setActive] = useState(0);
  const [phase, setPhase] = useState('in');
  const sections = MERCEDANSA_EDITIONS;
  const total = sections.length;
  const sec = sections[active];

  function goTo(idx) {
    if (idx < 0 || idx >= total || idx === active) return;
    setPhase('out');
    setTimeout(() => {
      setActive(idx);
      setPhase('in');
      setTimeout(() => setPhase('idle'), 350);
    }, 180);
  }

  return (
    <>
      {/* Tipus d'actuacions */}
      <div className="act-block">
        <div className="act-block__head">
          <h3 className="act-block__title">{t.espTypesTitle}</h3>
          <div className="act-block__sub">{t.espTypesSub}</div>
        </div>
        <div className="acts-types">
          {t.espTypes.map((ty, i) => (
            <article key={i} className="acts-type">
              <header className="acts-type__head">
                <div className="acts-type__num">{ty.num}</div>
                <h4 className="acts-type__name">{ty.name[0]}<em>{ty.name[1]}</em></h4>
              </header>
              <p className="acts-type__desc">{ty.desc}</p>

              {ty.formats && (
                <div className="acts-type__formats">
                  <div className="acts-type__label">{t.espTypesFormatsLabel}</div>
                  <ol className="acts-type__formats-list">
                    {ty.formats.map((f, j) => (
                      <li key={j} className="acts-type__format">
                        <div className="acts-type__format-head">
                          <span className="acts-type__format-num">{String(j+1).padStart(2,'0')}</span>
                          <div>
                            <div className="acts-type__format-title">{f.title}</div>
                            <div className="acts-type__format-meta">{f.meta}</div>
                          </div>
                        </div>
                        <p className="acts-type__format-body">{f.body}</p>
                      </li>
                    ))}
                  </ol>
                </div>
              )}

              {ty.repertoire && (
                <div className="acts-type__repertoire">
                  <div className="acts-type__label">{t.espTypesRepertoireLabel}</div>
                  <ul className="acts-type__rep-list">
                    {ty.repertoire.map((r, j) => (
                      <li key={j} className="acts-type__rep-item">
                        <span className="acts-type__rep-name">{r.name}</span>
                        {r.note && <span className="acts-type__rep-note">{r.note}</span>}
                      </li>
                    ))}
                  </ul>
                </div>
              )}

              {ty.notes && (
                <div className="acts-type__notes">
                  <span className="acts-type__notes-label">{t.espTypesNotesLabel}</span>
                  <span className="acts-type__notes-body">{ty.notes}</span>
                </div>
              )}

              {ty.anecdote && (
                <aside className="acts-type__anecdote">
                  <div className="acts-type__anecdote-eyebrow">{ty.anecdote.eyebrow}</div>
                  <div className="acts-type__anecdote-title">{ty.anecdote.title}</div>
                  <p className="acts-type__anecdote-body">{ty.anecdote.body}</p>
                  {ty.anecdote.body2 && <p className="acts-type__anecdote-body">{ty.anecdote.body2}</p>}
                </aside>
              )}
            </article>
          ))}
        </div>
      </div>

      {/* MercèDansa explorer */}
      <div className="act-block" id="mercedansa">
        <div className="act-block__head">
          <h3 className="act-block__title">{t.espMercedansaTitle}</h3>
          <div className="act-block__sub">{t.espMercedansaSub}</div>
        </div>

        {/* Historical context */}
        <div className="md-history">
          <div className="md-history__intro">
            <div className="md-history__eyebrow">{t.espMercedansaHistoryEyebrow}</div>
            <h4 className="md-history__title">
              {t.espMercedansaHistoryTitle[0]}<em>{t.espMercedansaHistoryTitle[1]}</em>{t.espMercedansaHistoryTitle[2]}
            </h4>
            <p className="md-history__text">{emText(t.espMercedansaHistoryIntro)}</p>
            <p className="md-history__text">{emText(t.espMercedansaHistoryIntro2)}</p>
          </div>

          <div className="md-history__milestones">
            {t.espMercedansaMilestones.map((m, i) => (
              <div key={i} className="md-milestone">
                <div className="md-milestone__year">{m.year}</div>
                <div className="md-milestone__title">{m.title}</div>
                <div className="md-milestone__body">{m.body}</div>
              </div>
            ))}
          </div>

          <div className="md-history__criteria">
            <div className="md-history__criteria-label">{t.espMercedansaHistoryCriteriaLabel}</div>
            <ol className="md-history__criteria-list">
              {t.espMercedansaHistoryCriteria.map((c, i) => (
                <li key={i}>
                  <span className="md-history__criteria-num">{String(i+1).padStart(2,'0')}</span>
                  <span>{c}</span>
                </li>
              ))}
            </ol>
          </div>
        </div>

        <div className="acts-explorer">
          <div className="era-rail-wrap">
            <div className="era-rail" role="tablist">
              {sections.map((s, i) => (
                <button
                  key={s.id}
                  className={"era-chip" + (i === active ? " is-active" : "")}
                  role="tab"
                  aria-selected={i === active}
                  onClick={() => goTo(i)}
                >
                  <span className="era-chip__range">{s.year}</span>
                  <span className="era-chip__kicker">{s.theme || t.espMercedansaNoTheme}</span>
                </button>
              ))}
            </div>
            <div className="era-rail__progress" aria-hidden="true">
              <span style={{width: `${((active + 1) / total) * 100}%`}} />
            </div>
          </div>

          <div className={"era-stage era-stage--" + phase}>
            <div className="era-stage__inner">
              <aside className="era-stage__meta">
                <div className="era-stage__count">
                  <span>{String(active + 1).padStart(2, "0")}</span>
                  <span className="era-stage__count-sep">/</span>
                  <span>{String(total).padStart(2, "0")}</span>
                </div>
                <div className="era-stage__range"><em>{sec.year}</em></div>
                <div className="era-stage__kicker">{sec.theme || t.espMercedansaNoTheme}</div>
                <div className="era-stage__meta-stats">
                  <div><b>{sec.dances.length}</b> {t.espMercedansaDances}</div>
                  <div><b>{new Set(sec.dances.map(d => d.town)).size}</b> {t.espMercedansaTowns}</div>
                </div>
              </aside>
              <div className="era-stage__body">
                <h4 className="era-stage__title">{sec.theme || `Edició MercèDansa ${sec.year}`}</h4>
                <p className="era-stage__lead">{t.espMercedansaLead}</p>
                <ol className="acts-explorer__dances">
                  {sec.dances.map((d, i) => (
                    <li key={i} className="acts-explorer__dance">
                      <span className="acts-explorer__dance-num">{String(i+1).padStart(2,'0')}</span>
                      <span className="acts-explorer__dance-name">{d.name}</span>
                      <span className="acts-explorer__dance-town">{d.town}</span>
                    </li>
                  ))}
                </ol>
                {sec.accompaniment && (
                  <div className="acts-explorer__accompaniment">
                    <div className="acts-explorer__accompaniment-label">{t.espMercedansaAccompanimentLabel}</div>
                    <div className="acts-explorer__accompaniment-body">{sec.accompaniment}</div>
                  </div>
                )}
              </div>
            </div>
          </div>

          <div className="era-controls">
            <button className="era-nav" onClick={() => goTo(active - 1)} disabled={active === 0} aria-label={t.espMercedansaPrev}>
              <svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" strokeWidth="1.6"><path d="M14 6l-6 6 6 6" strokeLinecap="round" strokeLinejoin="round"/></svg>
              <span>{t.espMercedansaPrev}</span>
            </button>
            <div className="era-progress">
              <span className="era-progress__num">{String(active + 1).padStart(2, "0")}</span>
              <span className="era-progress__of">{t.espMercedansaProgress}</span>
              <span className="era-progress__total">{String(total).padStart(2, "0")}</span>
            </div>
            <button className="era-nav era-nav--next" onClick={() => goTo(active + 1)} disabled={active === total - 1} aria-label={t.espMercedansaNext}>
              <span>{t.espMercedansaNext}</span>
              <svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" strokeWidth="1.6"><path d="M10 6l6 6-6 6" strokeLinecap="round" strokeLinejoin="round"/></svg>
            </button>
          </div>
        </div>
      </div>

      {/* Contract CTA */}
      <div className="acts-contract" id="contractar">
        <div>
          <h4>{t.contractTitle[0]}<em>{t.contractTitle[1]}</em></h4>
          <p>{t.contractP}</p>
        </div>
        <a href="Participa.html#contacte" className="acts-contract__cta">{t.contractCta} →</a>
      </div>
    </>
  );
}

function FormacioSection({ t }) {
  return (
    <div className="act-block">
      <div className="act-block__head">
        <h3 className="act-block__title">{t.formacioTitle}</h3>
        <div className="act-block__sub">{t.formacioSub}</div>
      </div>

      {/* La Cafetera — curs principal */}
      <div className="cafetera">
        <div className="cafetera__hero">
          <div className="cafetera__head">
            <div className="cafetera__eyebrow">{t.cafeteraEyebrow}</div>
            <h4 className="cafetera__title">{t.cafeteraTitle[0]}<em>{t.cafeteraTitle[1]}</em></h4>
            <p className="cafetera__intro">{t.cafeteraIntro}</p>
            <p className="cafetera__intro">{t.cafeteraIntro2}</p>
          </div>
          <aside className="cafetera__award">
            <div className="cafetera__award-label">{t.cafeteraAwardLabel}</div>
            <div className="cafetera__award-year">{t.cafeteraAwardYear}</div>
            <div className="cafetera__award-title">{t.cafeteraAwardTitle}</div>
            <p className="cafetera__award-body">{t.cafeteraAwardBody}</p>
          </aside>
        </div>

        <div className="cafetera__grid">
          <div className="cafetera__objectives">
            <div className="cafetera__label">{t.cafeteraObjectivesLabel}</div>
            <ol className="cafetera__obj-list">
              {t.cafeteraObjectives.map((o, i) => (
                <li key={i} className="cafetera__obj">
                  <span className="cafetera__obj-num">{String(i+1).padStart(2,'0')}</span>
                  <div>
                    <div className="cafetera__obj-title">{o.title}</div>
                    <div className="cafetera__obj-body">{o.body}</div>
                  </div>
                </li>
              ))}
            </ol>
          </div>

          <div className="cafetera__audience">
            <div className="cafetera__label">{t.cafeteraAudienceLabel}</div>
            <ul className="cafetera__audience-list">
              {t.cafeteraAudience.map((a, i) => <li key={i}>{a}</li>)}
            </ul>
          </div>
        </div>

        <div className="cafetera__evolution">
          <div className="cafetera__label">{t.cafeteraEvolutionLabel}</div>
          <div className="cafetera__evo-list">
            {t.cafeteraEvolution.map((e, i) => (
              <div key={i} className={`cafetera__evo ${e.current ? 'is-current' : ''}`}>
                <div className="cafetera__evo-range">{e.range}</div>
                <div className="cafetera__evo-title">{e.title}</div>
                <div className="cafetera__evo-body">{e.body}</div>
              </div>
            ))}
          </div>
        </div>
      </div>

      {/* Altres tallers — programes complementaris */}
      <div className="cafetera__other-head">
        <h4 className="cafetera__other-title">{t.cafeteraOtherLabel}</h4>
        <div className="cafetera__other-sub">{t.cafeteraOtherSub}</div>
      </div>
      <div className="acts-carousel">
        {t.formacioItems.map((it, i) => (
          <div key={i} className="acts-carousel__card">
            <div className="acts-carousel__num">{it.num} / 0{t.formacioItems.length}</div>
            <h4 className="acts-carousel__title">{it.title[0]}<em>{it.title[1]}</em></h4>
            <div className="acts-carousel__sub">{it.sub}</div>
            <p className="acts-carousel__desc">{it.desc}</p>
          </div>
        ))}
      </div>
    </div>
  );
}

function PremiSection({ t, lang }) {
  const [active, setActive] = useState(0);
  const [phase, setPhase] = useState('in');
  const sections = PREMI_EDITIONS;
  const total = sections.length;
  const sec = sections[active];

  function goTo(idx) {
    if (idx < 0 || idx >= total || idx === active) return;
    setPhase('out');
    setTimeout(() => {
      setActive(idx);
      setPhase('in');
      setTimeout(() => setPhase('idle'), 350);
    }, 180);
  }

  // Helper to read a field that may be either a plain string or { ca/es/en } map
  const tr = (field) => {
    if (!field) return null;
    if (typeof field === 'string') return field;
    return field[lang] || field.ca || '';
  };

  return (
    <div className="act-block">
      <div className="act-block__head">
        <h3 className="act-block__title">{t.premiTitle}</h3>
        <div className="act-block__sub">{t.premiSub}</div>
      </div>

      {/* Context */}
      <div className="premi-context">
        <div className="premi-context__intro">
          <div className="premi-context__eyebrow">{t.premiAboutEyebrow}</div>
          <h4 className="premi-context__title">
            {t.premiAboutTitle[0]}<em>{t.premiAboutTitle[1]}</em>{t.premiAboutTitle[2]}
          </h4>
          <p className="premi-context__text">{emText(t.premiAboutIntro1)}</p>
          <p className="premi-context__text">{emText(t.premiAboutIntro2)}</p>
        </div>

        <aside className="premi-context__facts">
          <div className="premi-fact">
            <span className="premi-fact__label">{t.premiSinceLabel}</span>
            <span className="premi-fact__val"><em>{t.premiSince}</em></span>
          </div>
          <div className="premi-fact">
            <span className="premi-fact__label">{t.premiPeriodicityLabel}</span>
            <span className="premi-fact__val">{t.premiPeriodicity}</span>
          </div>
          <div className="premi-fact">
            <span className="premi-fact__label">{t.premiCallsLabel}</span>
            <span className="premi-fact__val"><em>{total}</em></span>
          </div>
        </aside>

        <div className="premi-context__categories">
          <div className="premi-context__categories-label">{t.premiCategoriesLabel}</div>
          <ul className="premi-context__categories-list">
            {(t.premiCategories || []).map((c, i) => (
              <li key={i}>
                <span className="premi-context__categories-num">{String(i+1).padStart(2,'0')}</span>
                <span>{c}</span>
              </li>
            ))}
          </ul>
        </div>

        <div className="premi-context__award">
          <div className="premi-context__award-label">{t.premiAwardLabel}</div>
          <p className="premi-context__award-body">{t.premiAwardBody}</p>
        </div>
      </div>

      <div className="acts-explorer acts-explorer--premi">
        <div className="era-rail-wrap">
          <div className="era-rail" role="tablist">
            {sections.map((s, i) => (
              <button
                key={s.id}
                className={"era-chip era-chip--premi" + (i === active ? " is-active" : "") + (s.status === 'deserted' ? ' is-deserted' : '') + (s.status === 'pending' ? ' is-pending' : '')}
                role="tab"
                aria-selected={i === active}
                onClick={() => goTo(i)}
              >
                <span className="era-chip__range">{s.id}</span>
                <span className="era-chip__kicker">{s.year}</span>
              </button>
            ))}
          </div>
          <div className="era-rail__progress" aria-hidden="true">
            <span style={{width: `${((active + 1) / total) * 100}%`}} />
          </div>
        </div>

        <div className={"era-stage era-stage--" + phase}>
          <div className="era-stage__inner">
            <aside className="era-stage__meta">
              <div className="premi-numeral" aria-hidden="true">{sec.id}</div>
              <div className="era-stage__count">
                <span>{String(active + 1).padStart(2, "0")}</span>
                <span className="era-stage__count-sep">/</span>
                <span>{String(total).padStart(2, "0")}</span>
              </div>
              <div className="premi-edition__year"><em>{sec.year}</em></div>
              <div className="premi-edition__eyebrow">{t.premiEditionEyebrow} {sec.id}</div>
            </aside>

            <div className="era-stage__body">
              <h4 className="premi-edition__heading">
                <span className="premi-edition__heading-num">{sec.id}</span>
                <span className="premi-edition__heading-text">Premi Rafel Tudó</span>
                <span className="premi-edition__heading-year">· {sec.year}</span>
              </h4>

              {sec.status === 'deserted' && (
                <div className="premi-edition__empty premi-edition__empty--deserted">
                  <div className="premi-edition__empty-tag">
                    <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="1.6" aria-hidden="true">
                      <circle cx="12" cy="12" r="9"/><path d="M5 5l14 14"/>
                    </svg>
                    <span>{t.premiStatusDesertedTag}</span>
                  </div>
                  <p className="premi-edition__empty-body">{t.premiStatusDesertedBody}</p>
                </div>
              )}

              {sec.status === 'pending' && (
                <div className="premi-edition__empty premi-edition__empty--pending">
                  <div className="premi-edition__empty-tag">
                    <span className="premi-edition__empty-dot" aria-hidden="true" />
                    <span>{t.premiStatusPendingTag}</span>
                  </div>
                  <p className="premi-edition__empty-body">{t.premiStatusPendingBody}</p>
                </div>
              )}

              {sec.status === 'awarded' && (
                <>
                  <div className="premi-edition__author">
                    <span className="premi-edition__field-label">{t.premiAuthorLabel}</span>
                    <span className="premi-edition__author-name">{sec.author}</span>
                  </div>

                  <figure className="premi-edition__work">
                    <span className="premi-edition__field-label">{t.premiWorkLabel}</span>
                    <blockquote className="premi-edition__work-title">
                      <span className="premi-edition__quote-mark" aria-hidden="true">“</span>
                      <span>{sec.workTitle}</span>
                    </blockquote>
                    {tr(sec.publication) && (
                      <figcaption className="premi-edition__work-pub">
                        <span className="premi-edition__work-pub-key">{t.premiPublicationLabel}</span>
                        <span>{tr(sec.publication)}</span>
                      </figcaption>
                    )}
                  </figure>

                  {sec.accessit && (
                    <aside className="premi-edition__accessit">
                      <div className="premi-edition__accessit-head">
                        <span className="premi-edition__accessit-label">{t.premiAccessitLabel}</span>
                        <span className="premi-edition__accessit-sep" aria-hidden="true" />
                      </div>
                      <div className="premi-edition__accessit-author">{sec.accessit.author}</div>
                      <div className="premi-edition__accessit-work">
                        <span className="premi-edition__quote-mark premi-edition__quote-mark--sm" aria-hidden="true">“</span>
                        <span>{sec.accessit.workTitle}</span>
                      </div>
                      {tr(sec.accessit.publication) && (
                        <div className="premi-edition__accessit-pub">{tr(sec.accessit.publication)}</div>
                      )}
                    </aside>
                  )}
                </>
              )}
            </div>
          </div>
        </div>

        <div className="era-controls">
          <button className="era-nav" onClick={() => goTo(active - 1)} disabled={active === 0} aria-label={t.premiPrev}>
            <svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" strokeWidth="1.6"><path d="M14 6l-6 6 6 6" strokeLinecap="round" strokeLinejoin="round"/></svg>
            <span>{t.premiPrev}</span>
          </button>
          <div className="era-progress">
            <span className="era-progress__num">{String(active + 1).padStart(2, "0")}</span>
            <span className="era-progress__of">{t.premiProgress}</span>
            <span className="era-progress__total">{String(total).padStart(2, "0")}</span>
          </div>
          <button className="era-nav era-nav--next" onClick={() => goTo(active + 1)} disabled={active === total - 1} aria-label={t.premiNext}>
            <span>{t.premiNext}</span>
            <svg viewBox="0 0 24 24" width="14" height="14" fill="none" stroke="currentColor" strokeWidth="1.6"><path d="M10 6l6 6-6 6" strokeLinecap="round" strokeLinejoin="round"/></svg>
          </button>
        </div>
      </div>
    </div>
  );
}

/* ─── Aportacions a la dansa catalana ──────────────────────────────────── */
// Jornada quinquennal (2004 · 2009 · 2014 · 2020). Les actes es publiquen en
// volums que ja consten a Patrimoni (#publicacions) — d'aquí el CTA creuat.
const APOR_EDITIONS = ["2004", "2009", "2014", "2020"];

function AportacionsSection({ t }) {
  return (
    <div className="act-block">
      <div className="act-block__head">
        <h3 className="act-block__title">{t.aporTitle}</h3>
        <div className="act-block__sub">{t.aporSub}</div>
      </div>

      <div className="premi-context">
        <div className="premi-context__intro">
          <div className="premi-context__eyebrow">{t.aporAboutEyebrow}</div>
          <h4 className="premi-context__title">
            {t.aporAboutTitle[0]}<em>{t.aporAboutTitle[1]}</em>{t.aporAboutTitle[2]}
          </h4>
          <p className="premi-context__text">{emText(t.aporIntro1)}</p>
          <p className="premi-context__text">{emText(t.aporIntro2)}</p>
        </div>

        <aside className="premi-context__facts">
          <div className="premi-fact">
            <span className="premi-fact__label">{t.aporSinceLabel}</span>
            <span className="premi-fact__val"><em>{t.aporSince}</em></span>
          </div>
          <div className="premi-fact">
            <span className="premi-fact__label">{t.aporPeriodicityLabel}</span>
            <span className="premi-fact__val">{t.aporPeriodicity}</span>
          </div>
        </aside>

        <div className="premi-context__categories">
          <div className="premi-context__categories-label">{t.aporEditionsLabel}</div>
          <ul className="premi-context__categories-list">
            {APOR_EDITIONS.map((y, i) => (
              <li key={y}>
                <span className="premi-context__categories-num">{String(i + 1).padStart(2, '0')}</span>
                <span>{y}</span>
              </li>
            ))}
          </ul>
        </div>

        <div className="premi-context__award">
          <div className="premi-context__award-label">{t.aporPubLabel}</div>
          <div>
            <p className="premi-context__award-body">{t.aporPubBody}</p>
            <a className="btn ghost" href="Patrimoni.html#publicacions" style={{ marginTop: 22 }}>{t.aporPubCta}</a>
          </div>
        </div>
      </div>
    </div>
  );
}

/* ─── App ───────────────────────────────────────────────────────────────── */
/* ─── Sub-navegació de pàgina (shared/components/Subnav.jsx) ──────────── */
const EsbartSubnav = window.EsbartSubnav;
const ACTS_SUBNAV = {
  ca: [
    { id: "agenda", label: "Agenda" },
    { id: "espectacles", label: "Espectacles" },
    { id: "formacio", label: "Formació" },
    { id: "premi", label: "Premi Rafel Tudó" },
    { id: "aportacions", label: "Aportacions" },
  ],
  es: [
    { id: "agenda", label: "Agenda" },
    { id: "espectacles", label: "Espectáculos" },
    { id: "formacio", label: "Formación" },
    { id: "premi", label: "Premio Rafel Tudó" },
    { id: "aportacions", label: "Aportaciones" },
  ],
  en: [
    { id: "agenda", label: "Agenda" },
    { id: "espectacles", label: "Performances" },
    { id: "formacio", label: "Training" },
    { id: "premi", label: "Rafel Tudó Award" },
    { id: "aportacions", label: "Contributions" },
  ],
};

function App() {
  const { lang, setLang, t } = window.EsbartI18n.useI18n(ACTS_STRINGS);
  const tweaks = useEsbartTweaks();
  const [heroMode] = useState(false); // editorial hero on cream → use light nav
  const [openRow, setOpenRow] = useState('agenda');

  useEffect(() => {
    // Open the section corresponding to URL hash
    const onHash = () => {
      const id = location.hash.replace('#', '');
      const map = { agenda: 'agenda', espectacles: 'espectacles', mercedansa: 'espectacles', formacio: 'formacio', premi: 'premi', aportacions: 'aportacions' };
      if (map[id]) setOpenRow(map[id]);
    };
    onHash();
    window.addEventListener('hashchange', onHash);
    return () => window.removeEventListener('hashchange', onHash);
  }, []);

  useEffect(() => { if (t.pageTitle) document.title = t.pageTitle; }, [lang, t]);

  const rowContent = {
    agenda:      <AgendaSection t={t} lang={lang} />,
    espectacles: <EspectaclesSection t={t} />,
    formacio:    <FormacioSection t={t} />,
    premi:       <PremiSection t={t} lang={lang} />,
    aportacions: <AportacionsSection t={t} />,
  };

  return (
    <>
      <EsbartNav lang={lang} setLang={setLang} t={t} heroMode={heroMode} current="activitats" />
      <main id="main-content" tabIndex={-1}>
      <ActsHero t={t} />
      <EsbartSubnav
        items={ACTS_SUBNAV[lang] || ACTS_SUBNAV.ca}
        active={openRow}
        onNavigate={(id) => setOpenRow(id)}
      />
      <EsbartAccordion
        containerClass="acts-accordion"
        as="section"
        idPrefix="act"
        classes={{ root: "act-row", head: "act-row__header reveal", body: "act-row__body", inner: "act-row__body-inner" }}
        items={t.rows.map(row => ({ id: row.id, row }))}
        open={openRow}
        onChange={(id) => setOpenRow(id)}
        hashOpen={false}
        scrollOnOpen={true}
        scrollOffset={96}
        renderHead={(it) => (
          <>
            <div className="act-row__num">{it.row.num}</div>
            <div className="act-row__main">
              <h2 className="act-row__title">{it.row.title[0]}<em>{it.row.title[1]}</em></h2>
              <p className="act-row__teaser">{it.row.teaser}</p>
            </div>
            <span className="act-row__toggle" aria-hidden="true">
              <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2.2" strokeLinecap="round">
                <path d="M12 5v14M5 12h14"/>
              </svg>
            </span>
          </>
        )}
        renderBody={(it) => <div className="act-row__body-content">{rowContent[it.row.id]}</div>}
      />
      </main>
      <EsbartFooter t={t} />
      <EsbartTweaksPanel {...tweaks} />
    </>
  );
}

ReactDOM.createRoot(document.getElementById('app')).render(<App />);
