diff --git a/.changeset/bright-islands-kick.md b/.changeset/bright-islands-kick.md
new file mode 100644
index 000000000000..a1cce3b79d92
--- /dev/null
+++ b/.changeset/bright-islands-kick.md
@@ -0,0 +1,5 @@
+---
+'@primer/react': minor
+---
+
+Add support for providing icons as an element to UnderlineNavItem
diff --git a/packages/react/src/UnderlineNav/UnderlineNav.test.tsx b/packages/react/src/UnderlineNav/UnderlineNav.test.tsx
index ae1383d5bab4..c3b113981de8 100644
--- a/packages/react/src/UnderlineNav/UnderlineNav.test.tsx
+++ b/packages/react/src/UnderlineNav/UnderlineNav.test.tsx
@@ -1,5 +1,5 @@
import React from 'react'
-import {render} from '@testing-library/react'
+import {render, screen} from '@testing-library/react'
import userEvent from '@testing-library/user-event'
import type {IconProps} from '@primer/octicons-react'
import {
@@ -186,6 +186,22 @@ describe('UnderlineNav', () => {
// We are expecting a left value back, that way we know the `getAnchoredPosition` ran.
expect(results).toEqual(expect.objectContaining({left: 0}))
})
+
+ it('should support icons passed in as an element', () => {
+ render(
+
+ }>
+ Page one
+
+ }>Page two
+ }>Page three
+ ,
+ )
+
+ expect(screen.getByTestId('page-one-icon')).toBeInTheDocument()
+ expect(screen.getByTestId('page-two-icon')).toBeInTheDocument()
+ expect(screen.getByTestId('page-three-icon')).toBeInTheDocument()
+ })
})
describe('Keyboard Navigation', () => {
diff --git a/packages/react/src/UnderlineNav/UnderlineNavItem.tsx b/packages/react/src/UnderlineNav/UnderlineNavItem.tsx
index f1b7e74f2097..f63c38c270b2 100644
--- a/packages/react/src/UnderlineNav/UnderlineNavItem.tsx
+++ b/packages/react/src/UnderlineNav/UnderlineNavItem.tsx
@@ -38,7 +38,7 @@ export type UnderlineNavItemProps = {
/**
* Icon before the text
*/
- icon?: React.FunctionComponent
+ icon?: React.FunctionComponent | React.ReactElement
/**
* Renders `UnderlineNav.Item` as given component i.e. react-router's Link
**/
diff --git a/packages/react/src/internal/components/UnderlineTabbedInterface.tsx b/packages/react/src/internal/components/UnderlineTabbedInterface.tsx
index 38acc6aafd51..f00ae0bd750f 100644
--- a/packages/react/src/internal/components/UnderlineTabbedInterface.tsx
+++ b/packages/react/src/internal/components/UnderlineTabbedInterface.tsx
@@ -193,7 +193,7 @@ export type UnderlineItemProps = {
iconsVisible?: boolean
loadingCounters?: boolean
counter?: number | string
- icon?: FC
+ icon?: FC | React.ReactElement
id?: string
} & SxProp
@@ -213,11 +213,7 @@ export const UnderlineItem = forwardRef(
) => {
return (
- {iconsVisible && Icon && (
-
-
-
- )}
+ {iconsVisible && Icon && {typeof Icon === 'function' ? : Icon}}
{children && (
{children}