From 94b242100c39e9bfed8a7b0a2a950da53f622129 Mon Sep 17 00:00:00 2001 From: Jennie Robinson Faber Date: Tue, 19 May 2026 00:10:10 +0100 Subject: [PATCH] fix(layouts): drop URL-slug breadcrumb fallback The breadcrumb computed fell back to the URL slug when pageBreadcrumbTitle was empty. SSR rendered the slug; the client re-rendered the page-supplied title after useFetch, triggering a hydration text-content mismatch on span.breadcrumb-current on every detail page. Intermediate segments are stable across server and client, so render them unconditionally. Only include the trailing segment when a page provides a title. --- app/layouts/admin.vue | 5 +++-- app/layouts/default.vue | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/app/layouts/admin.vue b/app/layouts/admin.vue index 5e0baad..74f5505 100644 --- a/app/layouts/admin.vue +++ b/app/layouts/admin.vue @@ -227,10 +227,11 @@ const currentPageName = computed(() => { const path = route.path; if (path === "/admin") return "admin"; const segments = path.slice(1).split("/"); - if (pageBreadcrumbTitle.value && segments.length > 1) { + if (segments.length === 1) return segments[0]; + if (pageBreadcrumbTitle.value) { return [...segments.slice(0, -1), pageBreadcrumbTitle.value].join(" / "); } - return segments.join(" / "); + return segments.slice(0, -1).join(" / "); }); diff --git a/app/layouts/default.vue b/app/layouts/default.vue index 89b7fed..f674b4f 100644 --- a/app/layouts/default.vue +++ b/app/layouts/default.vue @@ -41,10 +41,11 @@ const currentPageName = computed(() => { const path = route.path; if (path === "/") return ""; const segments = path.slice(1).split("/"); - if (pageBreadcrumbTitle.value && segments.length > 1) { + if (segments.length === 1) return segments[0]; + if (pageBreadcrumbTitle.value) { return [...segments.slice(0, -1), pageBreadcrumbTitle.value].join(" / "); } - return segments.join(" / "); + return segments.slice(0, -1).join(" / "); });