libreria-astro-lefebvre
Version:
Librería de componentes Astro, React y Vue para Lefebvre
235 lines (233 loc) • 9.82 kB
text/typescript
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'],
}
}
]
};