El componente vive en CategoryCard.astro y expone una API pequeña a propósito: label, href, image, imageAlt, badge, blurb, subcategories, ctaLabel e index. No sabe nada del blog —no llama a getCollection ni inventa datos—: solo recorre las props y pinta la tarjeta. Esa separación es justo lo que permite reusarla igual en el catálogo y en el blog.
El trabajo de datos vive en BlogListing, no en el componente. Recorre los artículos de la página y, por cada uno, mapea sus campos a las props: el título a label y al H3, /blog/<id> a href, la description a blurb, la categoría legible (CAT_LABEL) al badge y blogImage(id) a la imagen del pool. El index marca la prioridad de carga —las cuatro primeras eager, el resto lazy—.