@@ -11,6 +11,7 @@ import type {ResizeObserverEntry} from '../hooks/useResizeObserver'
1111import { useOnEscapePress } from '../hooks/useOnEscapePress'
1212import { useOnOutsideClick } from '../hooks/useOnOutsideClick'
1313import { useFeatureFlag } from '../FeatureFlags'
14+ import { type PolymorphicProps , fixedForwardRef } from '../utils/modern-polymorphic'
1415
1516export type BreadcrumbsProps = React . PropsWithChildren < {
1617 /**
@@ -118,11 +119,14 @@ const BreadcrumbsMenuItem = React.forwardRef<HTMLDetailsElement, BreadcrumbsMenu
118119 < div ref = { menuContainerRef } className = { classes . MenuOverlay } >
119120 < ActionList >
120121 { items . map ( ( item , index ) => {
121- const href = item . props . href
122- const children = item . props . children
123- const selected = item . props . selected
122+ const { children, selected, as : Component , ...itemProps } = item . props
124123 return (
125- < ActionList . LinkItem key = { index } href = { href } aria-current = { selected ? 'page' : undefined } >
124+ < ActionList . LinkItem
125+ key = { index }
126+ as = { Component }
127+ { ...itemProps }
128+ aria-current = { selected ? 'page' : undefined }
129+ >
126130 { children }
127131 </ ActionList . LinkItem >
128132 )
@@ -360,41 +364,39 @@ const ItemSeparator = () => {
360364 )
361365}
362366
363- // eslint-disable-next-line @typescript-eslint/no-explicit-any
364- type DistributiveOmit < T , TOmitted extends PropertyKey > = T extends any ? Omit < T , TOmitted > : never
365-
366- type StyledBreadcrumbsItemProps < As extends React . ElementType > = {
367- as ?: As
368- to ?: To
369- selected ?: boolean
370- className ?: string
371- style ?: React . CSSProperties
372- } & DistributiveOmit < React . ComponentPropsWithRef < React . ElementType extends As ? 'a' : As > , 'as' >
373-
374- function BreadcrumbsItemComponent < As extends React . ElementType > (
375- props : StyledBreadcrumbsItemProps < As > ,
376- // eslint-disable-next-line @typescript-eslint/no-explicit-any
377- ref : ForwardedRef < any > ,
378- ) {
379- const { as : Component = 'a' , selected, className, ...rest } = props
380- return (
381- < Component
382- className = { clsx ( className , classes . Item , selected && 'selected' ) }
383- aria-current = { selected ? 'page' : undefined }
384- ref = { ref }
385- { ...rest }
386- />
387- )
388- }
389-
390- BreadcrumbsItemComponent . displayName = 'Breadcrumbs.Item'
391-
392- const BreadcrumbsItem = React . forwardRef ( BreadcrumbsItemComponent )
367+ type StyledBreadcrumbsItemProps < As extends React . ElementType = 'a' > = PolymorphicProps <
368+ As ,
369+ 'a' ,
370+ {
371+ to ?: To
372+ selected ?: boolean
373+ }
374+ >
375+
376+ const BreadcrumbsItem = fixedForwardRef (
377+ < As extends React . ElementType = 'a' > (
378+ props : StyledBreadcrumbsItemProps < As > ,
379+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
380+ ref : ForwardedRef < any > ,
381+ ) => {
382+ const { as : Component = 'a' , selected, className, ...rest } = props
383+ return (
384+ < Component
385+ className = { clsx ( className , classes . Item , selected && 'selected' ) }
386+ aria-current = { selected ? 'page' : undefined }
387+ ref = { ref }
388+ { ...rest }
389+ />
390+ )
391+ } ,
392+ )
393393
394394Breadcrumbs . displayName = 'Breadcrumbs'
395395
396396export type BreadcrumbsItemProps < As extends React . ElementType = 'a' > = StyledBreadcrumbsItemProps < As >
397- export default Object . assign ( Breadcrumbs , { Item : BreadcrumbsItem } )
397+
398+ const BreadcrumbsItemWithDisplayName = Object . assign ( BreadcrumbsItem , { displayName : 'Breadcrumbs.Item' } )
399+ export default Object . assign ( Breadcrumbs , { Item : BreadcrumbsItemWithDisplayName } )
398400
399401/**
400402 * @deprecated Use the `Breadcrumbs` component instead (i.e. `<Breadcrumb>` → `<Breadcrumbs>`)
0 commit comments