-
Notifications
You must be signed in to change notification settings - Fork 1.2k
/
Copy pathBreadcrumbItem.tsx
81 lines (75 loc) · 2.55 KB
/
BreadcrumbItem.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/*
* Copyright 2020 Adobe. All rights reserved.
* This file is licensed to you under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. You may obtain a copy
* of the License at http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under
* the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS
* OF ANY KIND, either express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*/
import {BreadcrumbItemProps} from '@react-types/breadcrumbs';
import ChevronRightSmall from '@spectrum-icons/ui/ChevronRightSmall';
import {classNames} from '@react-spectrum/utils';
import {FocusRing} from '@react-aria/focus';
import {mergeProps} from '@react-aria/utils';
import React, {Fragment, JSX, useRef} from 'react';
import styles from '@adobe/spectrum-css-temp/components/breadcrumb/vars.css';
import {useBreadcrumbItem} from '@react-aria/breadcrumbs';
import {useHover} from '@react-aria/interactions';
import {useLocale} from '@react-aria/i18n';
interface SpectrumBreadcrumbItemProps extends BreadcrumbItemProps {
isMenu?: boolean
}
export function BreadcrumbItem(props: SpectrumBreadcrumbItemProps): JSX.Element {
let {
children,
isCurrent,
isDisabled,
isMenu
} = props;
let {direction} = useLocale();
let ref = useRef(null);
let ElementType: React.ElementType = props.href ? 'a' : 'span';
let {itemProps} = useBreadcrumbItem({
...props,
elementType: ElementType
}, ref);
let {hoverProps, isHovered} = useHover(props);
// If this item contains a menu button, then it shouldn't be a link.
if (isMenu) {
itemProps = {};
}
return (
<Fragment>
<FocusRing focusRingClass={classNames(styles, 'focus-ring')}>
<ElementType
{...mergeProps(itemProps, hoverProps)}
ref={ref}
className={
classNames(
styles,
{
'spectrum-Breadcrumbs-itemLink': !isMenu,
'is-disabled': !isCurrent && isDisabled,
'is-hovered': isHovered
}
)
}>
{children}
</ElementType>
</FocusRing>
<ChevronRightSmall
UNSAFE_className={
classNames(
styles,
'spectrum-Breadcrumbs-itemSeparator',
{
'is-reversed': direction === 'rtl'
}
)
} />
</Fragment>
);
}