/* CATEGORÍAS — "Lo que fabricamos". Cada categoría se ilustra con la foto que REALMENTE muestra ese producto. El campo `featured` (= ruta del asset) referencia ProductData.jsx para mostrar título + medidas + material del ejemplo concreto al expandir. */ const Categories = ({ t, lang, setActiveProduct }) => { const [active, setActive] = React.useState(0); const pick = (field) => (typeof field === 'string' ? field : (field && (field[lang] || field.es)) || ''); const cats = [ { n: '01', title: t('Cocinas industriales', 'Industrial kitchens'), sub: t('Restaurantes, hoteles, cadenas', 'Restaurants, hotels, chains'), items: t( 'Líneas de producción · Tarjas de lavado · Campanas de extracción · Mesas de trabajo · Barras de servicio · Carritos · Racks · Estaciones fríos/calientes', 'Production lines · Wash sinks · Exhaust hoods · Work tables · Service counters · Carts · Racks · Hot/cold stations' ), img: 'assets/cocina-linea.jpeg', featured: 'assets/cocina-linea.jpeg', tag: 'T304 / T316', }, { n: '02', title: t('Mobiliario urbano', 'Street furniture'), sub: t('Mupis, tótems digitales, casetas en calle', 'Bus shelters, digital totems, street booths'), items: t( 'Mupis publicitarios · Tótems digitales · Casetas de información · Paradas de autobús · Marquesinas · Soportes y pedestales en inox para exterior', 'Advertising mupis · Digital totems · Info booths · Bus stops · Marquees · Outdoor stainless supports and pedestals' ), img: 'assets/totem-urban.jpeg', featured: 'assets/totem-urban.jpeg', tag: 'OUTDOOR · IP65', }, { n: '03', title: t('Casetas y cabinas', 'Booths & enclosures'), sub: t('Vigilancia, control de acceso, espacio público', 'Security, access control, public space'), items: t( 'Casetas de vigilancia en inox · Cabinas con vidrio templado · Módulos de control · Garitas · Encerramientos peatonales', 'Stainless guard booths · Tempered-glass cabins · Control modules · Sentry boxes · Pedestrian enclosures' ), img: 'assets/caseta-vigilancia-garita-inox-01.jpeg', featured: 'assets/caseta-vigilancia-garita-inox-01.jpeg', tag: 'INOX · VIDRIO', }, { n: '04', title: t('Mobiliario de oficina', 'Office furniture'), sub: t('Cubículos, call centers, escuelas', 'Cubicles, call centers, schools'), items: t( 'Cubículos para call center · Mamparas · Estaciones de trabajo · Paneles divisorios · Mobiliario operativo', 'Call-center cubicles · Partitions · Workstations · Dividing panels · Operational furniture' ), img: 'assets/cocina-trabajo.jpeg', featured: 'assets/cocina-trabajo.jpeg', tag: 'PINTURA POLVO', }, { n: '05', title: t('Archiveros y guarda', 'Filing & storage'), sub: t('Oficina, gobierno, áreas operativas', 'Office, government, operations'), items: t( 'Archiveros verticales · Archiveros de cajones · Gabinetes con llave · Lockers metálicos · Producción seriada', 'Vertical filing cabinets · Drawer units · Locking cabinets · Metal lockers · Serial production' ), img: 'assets/cabinet-archivero.jpeg', featured: 'assets/cabinet-archivero.jpeg', tag: 'SERIE · PROYECTO', }, { n: '06', title: t('Lo que tú necesites', 'Whatever you need'), sub: t('Sí. Cualquier cosa en metal.', 'Yes. Anything in metal.'), items: t( 'Después de 30+ años hemos hecho de todo. Si lo dibujas — incluso en una servilleta — lo fabricamos. Trae tu boceto, foto, idea, render, plano CAD o referencia visual.', "After 30+ years we've made it all. If you sketch it — even on a napkin — we'll build it. Bring your sketch, photo, idea, render, CAD plan or visual reference." ), img: 'assets/exhibidor-iluminado.jpeg', featured: 'assets/exhibidor-iluminado.jpeg', tag: 'ASK · ANYTHING', }, ]; return (
— 02

{t('Lo que fabricamos.', 'What we build.')}

{t( 'Cinco verticales claras y una sexta sin nombre — para todo lo demás. Pasa el cursor o toca cada una para ver ejemplos.', 'Five clear verticals and a sixth without a name — for everything else. Hover or tap each to see examples.' )}

{cats.map((c, i) => (
setActive(i)} onClick={() => setActive(i)} style={{ borderBottom: '1px solid var(--hairline)', padding: '24px 0', cursor: 'pointer', transition: 'background .2s, padding .25s', paddingLeft: active === i ? 16 : 0, background: active === i ? 'rgba(255,255,255,0.02)' : 'transparent', position: 'relative', }} > {active === i && ( )}
{c.n}

{c.title}

{c.tag}

{c.sub}

{c.items}

{(() => { const f = c.featured && window.productData?.[c.featured]; if (!f) return null; return (
{t('EJEMPLO ENTREGADO', 'DELIVERED EXAMPLE')} {f.measures && ( · {f.measures} )} {f.material && ( · {pick(f.material)} )}
); })()}
))}
setActiveProduct?.(cats[active].featured)} role="button" tabIndex={0} onKeyDown={(e) => { if (e.key === 'Enter' || e.key === ' ') setActiveProduct?.(cats[active].featured); }} title={t('Ver ficha', 'View details')} style={{ position: 'sticky', top: 100, aspectRatio: '4/5', background: 'var(--bg-2)', overflow: 'hidden', cursor: 'pointer' }} > {cats.map((c, i) => ( {c.title} ))}
{String(active + 1).padStart(2, '0')} / {String(cats.length).padStart(2, '0')} {t('CLICK · VER FICHA', 'CLICK · VIEW DETAILS')}
); }; window.Categories = Categories;