From 68d2df90847ed746a9b64262c57f5c67f6919697 Mon Sep 17 00:00:00 2001 From: Charles de Dreuille Date: Tue, 22 Jul 2025 08:09:12 +0100 Subject: [PATCH] Fix links on the header toolbar Signed-off-by: Charles de Dreuille --- packages/ui/report.api.md | 2 + .../src/components/Header/Header.stories.tsx | 1 + packages/ui/src/components/Header/Header.tsx | 14 +- .../src/components/Header/HeaderToolbar.tsx | 164 ++++++++++-------- packages/ui/src/components/Header/types.ts | 2 + 5 files changed, 109 insertions(+), 74 deletions(-) diff --git a/packages/ui/report.api.md b/packages/ui/report.api.md index 6f6fc41fdb..5f08a8ce84 100644 --- a/packages/ui/report.api.md +++ b/packages/ui/report.api.md @@ -1045,6 +1045,8 @@ export interface HeaderProps { tabs?: HeaderTab[]; // (undocumented) title?: string; + // (undocumented) + titleLink?: string; } // @public diff --git a/packages/ui/src/components/Header/Header.stories.tsx b/packages/ui/src/components/Header/Header.stories.tsx index 5a632d741e..f7aa47e64b 100644 --- a/packages/ui/src/components/Header/Header.stories.tsx +++ b/packages/ui/src/components/Header/Header.stories.tsx @@ -230,6 +230,7 @@ export const WithEverything: Story = { menuItems, breadcrumbs, tabs, + titleLink: '/', }, decorators: layoutDecorator, render: args => ( diff --git a/packages/ui/src/components/Header/Header.tsx b/packages/ui/src/components/Header/Header.tsx index 4f85d9096d..7fd93c4154 100644 --- a/packages/ui/src/components/Header/Header.tsx +++ b/packages/ui/src/components/Header/Header.tsx @@ -32,7 +32,16 @@ declare module 'react-aria-components' { * @public */ export const Header = (props: HeaderProps) => { - const { tabs, icon, title, menuItems, breadcrumbs, customActions } = props; + const { + tabs, + icon, + title, + titleLink, + menuItems, + breadcrumbs, + customActions, + onTabSelectionChange, + } = props; const { classNames } = useStyles('Header'); @@ -43,6 +52,7 @@ export const Header = (props: HeaderProps) => { { /> {tabs && (
- + {tabs?.map(tab => ( diff --git a/packages/ui/src/components/Header/HeaderToolbar.tsx b/packages/ui/src/components/Header/HeaderToolbar.tsx index e03b70055d..9236ad3fe7 100644 --- a/packages/ui/src/components/Header/HeaderToolbar.tsx +++ b/packages/ui/src/components/Header/HeaderToolbar.tsx @@ -14,7 +14,7 @@ * limitations under the License. */ -import { Link } from 'react-aria-components'; +import { Link, RouterProvider } from 'react-aria-components'; import { useStyles } from '../../hooks/useStyles'; import { useRef, useState, useEffect } from 'react'; import { RiArrowRightSLine, RiMore2Line, RiShapesLine } from '@remixicon/react'; @@ -23,6 +23,7 @@ import { ButtonIcon } from '../ButtonIcon'; import { Menu } from '../Menu'; import { Text } from '../Text'; import { motion, useScroll, useTransform } from 'motion/react'; +import { useNavigate, useHref } from 'react-router-dom'; /** * A component that renders a toolbar. @@ -30,9 +31,17 @@ import { motion, useScroll, useTransform } from 'motion/react'; * @internal */ export const HeaderToolbar = (props: HeaderToolbarProps) => { - const { icon, title, menuItems, breadcrumbs, customActions, hasTabs } = props; + const { + icon, + title, + titleLink, + menuItems, + breadcrumbs, + customActions, + hasTabs, + } = props; const { classNames } = useStyles('Header'); - + let navigate = useNavigate(); const { scrollY } = useScroll(); const breadcrumbOpacity = useTransform(scrollY, [80, 120], [0, 1]); @@ -87,80 +96,91 @@ export const HeaderToolbar = (props: HeaderToolbarProps) => { }; }, []); + const titleContent = ( + <> +
{icon || }
+ {title || 'Your plugin'} + + ); + return ( -
-
-
-
-
- {icon || } -
- {title || 'Your plugin'} + + {' '} +
+
+
+ {titleLink ? ( + + {titleContent} + + ) : ( +
{titleContent}
+ )} + {breadcrumbs && ( + + + {breadcrumbs.map((breadcrumb, index) => ( +
+ + {breadcrumb.label} + + {index < breadcrumbs.length - 1 && ( + + )} +
+ ))} +
+ )}
- {breadcrumbs && ( - - - {breadcrumbs.map((breadcrumb, index) => ( -
- - {breadcrumb.label} - - {index < breadcrumbs.length - 1 && ( - + {customActions} + {menuItems && ( + + ( + } + variant="tertiary" + {...props} /> )} -
- ))} -
- )} -
-
- {customActions} - {menuItems && ( - - ( - } - variant="tertiary" - {...props} - /> - )} - /> - - - - {menuItems.map(option => ( - option.onClick?.()} - > - {option.label} - - ))} - - - - - )} + /> + + + + {menuItems.map(option => ( + option.onClick?.()} + > + {option.label} + + ))} + + + + + )} +
-
+ ); }; diff --git a/packages/ui/src/components/Header/types.ts b/packages/ui/src/components/Header/types.ts index cf76929389..5f3eceec5b 100644 --- a/packages/ui/src/components/Header/types.ts +++ b/packages/ui/src/components/Header/types.ts @@ -24,6 +24,7 @@ import { TabsProps } from 'react-aria-components'; export interface HeaderProps { icon?: React.ReactNode; title?: string; + titleLink?: string; breadcrumbs?: HeaderBreadcrumb[]; customActions?: React.ReactNode; menuItems?: HeaderMenuItem[]; @@ -71,6 +72,7 @@ export interface HeaderBreadcrumb { export interface HeaderToolbarProps { icon?: HeaderProps['icon']; title?: HeaderProps['title']; + titleLink?: HeaderProps['titleLink']; breadcrumbs?: HeaderProps['breadcrumbs']; customActions?: HeaderProps['customActions']; menuItems?: HeaderProps['menuItems'];