fix(embed): skip site chrome on /widget routes via root layout
(embed)/+layout@.svelte only resets intermediate layouts — root
+layout.svelte still wrapped every widget page with Header, Footer,
TopBanner, Breadcrumbs, Skip-Link, OG/JSON-LD/Analytics.
Root layout now derives isEmbed from $page.route.id (matches /(embed))
and renders just {@render children()} in that branch. svelte:head is
gated too: embed mode emits only the favicon, leaving the page free to
set its own <title> and noindex meta.
+layout.server.ts short-circuits the bootstrap batch (navigation,
footer, page_config, logo) for embed routes — saves one CMS roundtrip
+ logo transform per widget request, and avoids double-counting in
Umami/pm86 analytics when the widget is iframed elsewhere.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -48,9 +48,33 @@ function getSlugFromEntry(entry: NavLinkEntry): string {
|
||||
return e.slug ?? e._slug ?? '';
|
||||
}
|
||||
|
||||
export const load: LayoutServerLoad = async ({ locals }) => {
|
||||
export const load: LayoutServerLoad = async ({ locals, route }) => {
|
||||
const translations = locals.translations ?? {};
|
||||
|
||||
// Embed-Routen ((embed)/...) brauchen kein Site-Chrome. Bootstrap-Batch
|
||||
// wird übersprungen — spart 1 CMS-Roundtrip + Logo-Transform pro Request.
|
||||
// Layout-Komponente rendert über `isEmbed` ohne Header/Footer/Banner.
|
||||
if ((route.id ?? '').startsWith('/(embed)')) {
|
||||
const siteName =
|
||||
(import.meta.env.PUBLIC_SITE_NAME as string | undefined) || SITE_NAME;
|
||||
const siteBaseUrl = (env.PUBLIC_SITE_URL || '').replace(/\/$/, '');
|
||||
return {
|
||||
headerLinks: [] as NavLink[],
|
||||
socialLinks: [] as SocialLink[],
|
||||
footerData: null as FooterEntry | null,
|
||||
logoUrl: null as string | null,
|
||||
logoSvgHtml: null as string | null,
|
||||
logoSocialImage: null as string | null,
|
||||
siteName,
|
||||
siteBaseUrl,
|
||||
translations,
|
||||
pageConfig: null as PageConfigEntry | null,
|
||||
seoTitleTemplate: null,
|
||||
seoDescriptionTemplate: null,
|
||||
analyticsPm86SiteId: null,
|
||||
};
|
||||
}
|
||||
|
||||
// Layout-Bootstrap: Navigation (header + social), Footer, page_config in
|
||||
// einem einzigen HTTP-Roundtrip (POST /api/content/_batch). Reduziert von
|
||||
// 4 sequentiellen Calls auf 1. Page-/Post-Stubs gehen separat (sparse
|
||||
|
||||
Reference in New Issue
Block a user