1.1.0: R2 storage, media preconnect/normalization, favicon + SEO structured data, x-default hreflang

This commit is contained in:
2026-08-28 15:50:25 +02:00
parent 41630bb8c5
commit c41b75e364
25 changed files with 674 additions and 12 deletions
@@ -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,
})),
}
}