diff --git a/app/components/breadcrumb.tsx b/app/components/breadcrumb.tsx index fb1c89d8a2..e4d32481a4 100644 --- a/app/components/breadcrumb.tsx +++ b/app/components/breadcrumb.tsx @@ -7,6 +7,7 @@ import { BreadcrumbPage, BreadcrumbSeparator, } from "@/components/ui/breadcrumb"; +import { ArrowLeft } from "lucide-react"; import { usePathname } from "next/navigation"; import React, { FC, useMemo } from "react"; import { tinaField } from "tinacms/dist/react"; @@ -47,7 +48,7 @@ export const Breadcrumbs: FC = ({ }) => { const pathname = usePathname(); - const breadcrumbItems = useMemo(() => { + const { breadcrumbItems, mobileParent } = useMemo(() => { const pathSegments = pathname .split("/") .filter((segment) => segment !== ""); @@ -70,7 +71,7 @@ export const Breadcrumbs: FC = ({ Home @@ -87,9 +88,9 @@ export const Breadcrumbs: FC = ({ items.push( - {">"} + {"/"} ); @@ -97,7 +98,7 @@ export const Breadcrumbs: FC = ({ {isLast ? ( = ({ {displayName} @@ -118,14 +119,37 @@ export const Breadcrumbs: FC = ({ ); }); - return items; + let mobileParent: { label: string; href: string }; + if (pathSegments.length >= 2) { + const parentIndex = pathSegments.length - 2; + mobileParent = { + label: getDisplayName(pathSegments[parentIndex]), + href: "/" + pathSegments.slice(0, parentIndex + 1).join("/"), + }; + } else { + mobileParent = { label: "Home", href: "/" }; + } + + return { breadcrumbItems: items, mobileParent }; }, [pathname, path, title, seoSchema, additionalReplacements]); return ( - - - {breadcrumbItems} - - + <> + + + {breadcrumbItems} + + + + ); }; diff --git a/components/blocks/breadcrumbs/breadcrumbs.tsx b/components/blocks/breadcrumbs/breadcrumbs.tsx index 7c6027b886..50ccc1e29c 100644 --- a/components/blocks/breadcrumbs/breadcrumbs.tsx +++ b/components/blocks/breadcrumbs/breadcrumbs.tsx @@ -20,6 +20,7 @@ import { Container } from "@/components/util/container"; import global from "@/content/global/index.json"; import { cn } from "@/lib/utils"; import { Consultingv2BlocksBreadcrumbs } from "@/tina/types"; +import { ArrowLeft } from "lucide-react"; import { usePathname } from "next/navigation"; import React from "react"; import { tinaField } from "tinacms/dist/react"; @@ -103,10 +104,21 @@ export function Breadcrumbs({ data }: { data: Consultingv2BlocksBreadcrumbs }) { // Index 0 is an empty string if the path starts with a slash const links = getLinks(paths, data, data.finalBreadcrumb); + // Parent one level above the current page, for the collapsed mobile view + const segments = paths.filter((segment) => segment !== ""); + const replacementMap = new Map( + global.breadcrumbReplacements.map((r) => [r.from, r.to]) + ); + const parent = segments[segments.length - 2]; + const mobileParent = + segments.length >= 2 + ? { label: replacementMap.get(parent) ?? parent, href: `/${parent}` } + : { label: global.breadcrumbHomeRoute, href: "/" }; + return ( - + {links.map((link, index) => ( // react fragments don't appear in the dom @@ -121,6 +133,19 @@ export function Breadcrumbs({ data }: { data: Consultingv2BlocksBreadcrumbs }) { ))} + ); diff --git a/components/ui/breadcrumb.tsx b/components/ui/breadcrumb.tsx index 6978ab15d4..3ec5d1e54e 100644 --- a/components/ui/breadcrumb.tsx +++ b/components/ui/breadcrumb.tsx @@ -114,5 +114,6 @@ export { BreadcrumbLink, BreadcrumbList, BreadcrumbPage, - BreadcrumbSeparator, + BreadcrumbSeparator }; +