UNPKG

libreria-astro-lefebvre

Version:

Librería de componentes Astro, React y Vue para Lefebvre

235 lines (233 loc) 9.82 kB
import type { ComponentMetadata } from '../interfaces/types'; export const metadata: ComponentMetadata = { component_name: 'SEO_Schema_Page', category: 'SEO', name: 'SEO Schema raíz de página (JSON-LD)', description: 'Componente opt-in que inyecta el JSON-LD raíz schema.org de la página (WebPage / Article / BlogPosting / NewsArticle / AboutPage / CollectionPage / ContactPage / FAQPage). Va dentro del <head> junto a SEO_Head_Section. IMPORTANTE: usar UNO Y SÓLO UNO por URL. Si pageType es FAQPage no usar a la vez con FAQ_2025_Hiroshima', framework: 'Astro', priority: 1, tags: ['seo', 'schema', 'json-ld', 'structured-data', 'genial'], fields: [ { name: 'pageType', type: 'select', help: 'Tipo schema.org raíz que describe la página entera. WebPage es el genérico. Article/BlogPosting/NewsArticle son para contenido editorial. AboutPage/CollectionPage/ContactPage/FAQPage son subtipos especializados de WebPage', label: 'Tipo de página', mandatory: false, options: ['WebPage', 'Article', 'BlogPosting', 'NewsArticle', 'AboutPage', 'CollectionPage', 'ContactPage', 'FAQPage', 'ProfilePage'], options_labels: ['WebPage (genérico)', 'Article (artículo)', 'BlogPosting (post de blog)', 'NewsArticle (noticia)', 'AboutPage (sobre nosotros)', 'CollectionPage (listado)', 'ContactPage (contacto)', 'FAQPage (preguntas frecuentes)', 'ProfilePage (perfil de persona)'], example_value: 'WebPage' }, { name: 'name', type: 'text', help: 'Nombre/título de la página. Aparece como name del schema', label: 'Nombre de la página', mandatory: true, example_value: 'La inteligencia artificial en el sector legal' }, { name: 'description', type: 'text', help: 'Descripción corta de la página', label: 'Descripción', mandatory: true, example_value: 'Analizamos los casos reales en los que la IA generativa está transformando la labor diaria de los despachos de abogados' }, { name: 'url', type: 'text', help: 'URL canónica de la página. Si se deja vacío usa Astro.url.href automáticamente', label: 'URL', mandatory: false, example_value: '' }, { name: 'image', type: 'image', help: 'Imagen principal de la página (URL absoluta). Recomendada para Article/BlogPosting/NewsArticle', label: 'Imagen principal', mandatory: false, example_value: 'https://assets.lefebvre.es/media/img/preview-comp/comp-16-9.png' }, { name: 'headline', type: 'text', help: 'Titular del artículo. Sólo se usa con pageType Article/BlogPosting/NewsArticle. Si se deja vacío usa el valor de "name"', label: 'Titular (sólo Article)', mandatory: false, example_value: '' }, { name: 'datePublished', type: 'text', help: 'Fecha de publicación en formato ISO 8601 (YYYY-MM-DD o completo). Sólo se usa con pageType Article/BlogPosting/NewsArticle', label: 'Fecha de publicación ISO', mandatory: false, example_value: '2026-01-15' }, { name: 'dateModified', type: 'text', help: 'Fecha de última modificación en formato ISO 8601. Sólo se usa con pageType Article/BlogPosting/NewsArticle', label: 'Fecha de modificación ISO', mandatory: false, example_value: '' }, { name: 'authorName', type: 'text', help: 'Nombre del autor. Sólo se usa con pageType Article/BlogPosting/NewsArticle', label: 'Nombre del autor', mandatory: false, example_value: 'María García López' }, { name: 'authorUrl', type: 'text', help: 'URL del perfil del autor. Sólo se usa con pageType Article/BlogPosting/NewsArticle', label: 'URL del autor', mandatory: false, example_value: '' }, { name: 'authorImage', type: 'text', help: 'URL de la foto del autor. Sólo se usa con pageType Article/BlogPosting/NewsArticle', label: 'Imagen del autor', mandatory: false, example_value: '' }, { name: 'authorId', type: 'text', help: '@id de un Person ya declarado en otro JSON-LD de la página. Si se proporciona, el author se referencia con { "@id": ... } en lugar de redeclararse, evitando duplicación. Ignora authorName/authorUrl/authorImage si está presente. Sólo Article/BlogPosting/NewsArticle', label: '@id del autor (referencia)', mandatory: false, example_value: '' }, { name: 'authorType', type: 'select', options: ['Person', 'Organization'], options_labels: ['Persona', 'Organización'], help: 'Tipo schema.org del autor. Usar "Organización" cuando el autor sea la propia entidad (p. ej. "Lefebvre"); en el resto de casos, "Persona". Aplica al author de Article/BlogPosting/NewsArticle y al mainEntity de ProfilePage. Default: Persona', label: 'Tipo de autor', mandatory: false, example_value: 'Person' }, { name: 'publisherName', type: 'text', help: 'Nombre de la organización publisher. Default: Lefebvre', label: 'Nombre del publisher', mandatory: false, example_value: 'Lefebvre' }, { name: 'publisherLogo', type: 'text', help: 'URL del logo del publisher. Default: logo de Lefebvre', label: 'Logo del publisher', mandatory: false, example_value: 'https://assets.lefebvre.es/media/logos-2/svg/lefebvre.svg' }, { name: 'publisherUrl', type: 'text', help: 'URL de la web del publisher. Default: https://lefebvre.es', label: 'URL del publisher', mandatory: false, example_value: 'https://lefebvre.es' }, { name: 'publisherId', type: 'text', help: '@id de una Organization ya declarada en otro JSON-LD de la página (típicamente la del @graph del Layout). Si se proporciona, el publisher se referencia con { "@id": ... } en lugar de redeclararse, evitando duplicación. Ignora publisherName/publisherUrl/publisherLogo si está presente. Sólo Article/BlogPosting/NewsArticle', label: '@id del publisher (referencia)', mandatory: false, example_value: 'https://www.lefebvre.es/#organization' }, { name: 'websiteId', type: 'text', help: '@id del nodo WebSite del sitio (el del @graph del Layout). Si se proporciona, el WebPage de la página añade isPartOf: { "@id": ... } enlazando la página con el sitio/organización.', label: '@id del WebSite (isPartOf)', mandatory: false, example_value: 'https://genia-l.lefebvre.es/#website' }, { name: 'breadcrumbId', type: 'text', help: '@id de la BreadcrumbList de la página (el que emite Cabecera_2025_Barcelona, = {canonical}#breadcrumb). Si se proporciona, el WebPage añade breadcrumb: { "@id": ... }. No pasarlo si la página no tiene breadcrumb (evita referencia colgante).', label: '@id del breadcrumb', mandatory: false, example_value: '' }, { name: 'mainEntityId', type: 'text', help: '@id del nodo principal de la página (la "entidad principal"), p. ej. el ItemList de un listado (#itemlist). Si se proporciona, el WebPage/CollectionPage añade mainEntity: { "@id": ... }. Solo aplica a tipos NO artículo/FAQ/ProfilePage (esos ya fijan su propio mainEntity). Usar @id relativo para que funcione también vía render API.', label: '@id de la entidad principal (mainEntity)', mandatory: false, example_value: '#itemlist' }, { name: 'keywords', type: 'text', help: 'Palabras clave separadas por coma', label: 'Keywords', mandatory: false, example_value: 'inteligencia artificial, derecho, legaltech' }, { name: 'inLanguage', type: 'text', help: 'Código de idioma de la página (ej. es, en, fr). Default: es', label: 'Idioma', mandatory: false, example_value: 'es' }, { name: 'articleSection', type: 'text', help: 'Sección del sitio a la que pertenece el artículo. Sólo se usa con pageType Article/BlogPosting/NewsArticle', label: 'Sección del artículo', mandatory: false, example_value: 'IA Jurídica' }, { name: 'faqItems', type: 'list', help: 'Listado de preguntas y respuestas. Sólo se usa con pageType FAQPage. Si la página ya usa FAQ_2025_Hiroshima, NO duplicar las FAQs aquí', label: 'FAQs (sólo FAQPage)', mandatory: false, items: { type: 'object', fields: [ { name: 'question', type: 'text', help: 'Pregunta', label: 'Pregunta', example_value: '¿Qué es GenIA-L?' }, { name: 'answer', type: 'text', help: 'Respuesta (texto plano sin HTML)', label: 'Respuesta', example_value: 'Es la solución de IA generativa de Lefebvre para profesionales del derecho' } ] } }, { name: 'jobTitle', type: 'text', help: 'Cargo profesional de la persona. Sólo se usa con pageType ProfilePage para enriquecer el mainEntity Person', label: 'Cargo profesional (sólo ProfilePage)', mandatory: false, example_value: 'Abogada especialista en derecho mercantil' }, { name: 'sameAs', type: 'list', help: 'URLs de perfiles de la persona en redes sociales u otros sitios oficiales (LinkedIn, Twitter, etc.). Se inyectan en sameAs del mainEntity Person. Sólo se usa con pageType ProfilePage', label: 'Perfiles externos (sólo ProfilePage)', mandatory: false, items: { type: 'text', example_value: ['https://www.linkedin.com/in/maria-garcia'], } } ] };