1.1.0: R2 storage, media preconnect/normalization, favicon + SEO structured data, x-default hreflang
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
type NavItem = {
|
||||
/** Visible label (e.g. 'Usługi'). */
|
||||
name: string
|
||||
/** Absolute URL (e.g. 'https://example.com/pl/uslugi'). */
|
||||
url: string
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds SiteNavigationElement JSON-LD (schema.org) from the main navigation —
|
||||
* declares the site's primary nav as structured data. A weaker sitelinks signal
|
||||
* than WebSite/breadcrumbs, but cheap: it tells Google which pages are the main
|
||||
* navigation targets.
|
||||
*
|
||||
* Feed it the SAME nav items the header renders (from the panel/nav global), so
|
||||
* the structured data matches the visible menu — not a separate hardcoded list.
|
||||
*
|
||||
* import { buildSiteNavigationJsonLd } from '@intecion/ipal-kit'
|
||||
* const jsonLd = buildSiteNavigationJsonLd(
|
||||
* navItems.map(i => ({ name: i.label, url: `${base}${i.href}` }))
|
||||
* )
|
||||
* <script type="application/ld+json" ... />
|
||||
*
|
||||
* Emit once (site-wide, root layout). Data from the nav source, never hardcoded.
|
||||
* Returns null for empty nav.
|
||||
*/
|
||||
export function buildSiteNavigationJsonLd(items: NavItem[]) {
|
||||
if (!items || items.length === 0) {return null}
|
||||
|
||||
return {
|
||||
'@context': 'https://schema.org',
|
||||
'@type': 'ItemList',
|
||||
itemListElement: items.map((item, index) => ({
|
||||
name: item.name,
|
||||
'@type': 'SiteNavigationElement',
|
||||
position: index + 1,
|
||||
url: item.url,
|
||||
})),
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user