diff --git a/.changeset/sad-women-rule.md b/.changeset/sad-women-rule.md
new file mode 100644
index 0000000000..04bbbe1eed
--- /dev/null
+++ b/.changeset/sad-women-rule.md
@@ -0,0 +1,5 @@
+---
+'@backstage/ui': patch
+---
+
+Add react router for internal routing for ButtonLinks
diff --git a/packages/ui/src/components/ButtonLink/ButtonLink.stories.tsx b/packages/ui/src/components/ButtonLink/ButtonLink.stories.tsx
index b4667f017b..f032af318c 100644
--- a/packages/ui/src/components/ButtonLink/ButtonLink.stories.tsx
+++ b/packages/ui/src/components/ButtonLink/ButtonLink.stories.tsx
@@ -14,15 +14,23 @@
* limitations under the License.
*/
-import type { Meta, StoryObj } from '@storybook/react-vite';
+import type { Meta, StoryFn, StoryObj } from '@storybook/react-vite';
import { ButtonLink } from './ButtonLink';
import { Flex } from '../Flex';
import { Text } from '../Text';
import { Icon } from '../Icon';
+import { MemoryRouter } from 'react-router-dom';
const meta = {
title: 'Backstage UI/ButtonLink',
component: ButtonLink,
+ decorators: [
+ (Story: StoryFn) => (
+
+
+
+ ),
+ ],
argTypes: {
size: {
control: 'select',
diff --git a/packages/ui/src/components/ButtonLink/ButtonLink.tsx b/packages/ui/src/components/ButtonLink/ButtonLink.tsx
index 153643a530..b5b5ab208d 100644
--- a/packages/ui/src/components/ButtonLink/ButtonLink.tsx
+++ b/packages/ui/src/components/ButtonLink/ButtonLink.tsx
@@ -16,13 +16,16 @@
import clsx from 'clsx';
import { forwardRef, Ref } from 'react';
-import { Link as RALink } from 'react-aria-components';
+import { Link as RALink, RouterProvider } from 'react-aria-components';
+import { useNavigate, useHref } from 'react-router-dom';
import type { ButtonLinkProps } from './types';
import { useStyles } from '../../hooks/useStyles';
+import { isExternalLink } from '../../utils/isExternalLink';
/** @public */
export const ButtonLink = forwardRef(
(props: ButtonLinkProps, ref: Ref) => {
+ const navigate = useNavigate();
const {
size = 'small',
variant = 'primary',
@@ -30,6 +33,7 @@ export const ButtonLink = forwardRef(
iconEnd,
children,
className,
+ href,
...rest
} = props;
@@ -40,17 +44,48 @@ export const ButtonLink = forwardRef(
const { classNames: classNamesButtonLink } = useStyles('ButtonLink');
+ const isExternal = isExternalLink(href);
+
+ // If it's an external link, render RALink without RouterProvider
+ if (isExternal) {
+ return (
+
+ {iconStart}
+ {children}
+ {iconEnd}
+
+ );
+ }
+
+ // For internal links, use RouterProvider
return (
-
- {iconStart}
- {children}
- {iconEnd}
-
+
+
+ {iconStart}
+ {children}
+ {iconEnd}
+
+
);
},
);