@neo4j-ndl/react
Version:
React implementation of Neo4j Design System
246 lines (205 loc) • 9.18 kB
Markdown
# Breadcrumbs
Import: `import { Breadcrumbs } from '@neo4j-ndl/react'`
## Props
### Breadcrumbs
| Prop | Type | Required | Default | Description |
|------|------|----------|---------|-------------|
| `children` | `ReactNode` | | | Content to be rendered. Should only be `Breadcrumbs.Item`. |
| `ref` | `Ref<HTMLElement>` | | | A ref to apply to the root element. |
| `shouldWrap` | `boolean` | | `true` | Additional classnames. |
### Breadcrumbs.Button
| Prop | Type | Required | Default | Description |
|------|------|----------|---------|-------------|
| `as` | `("button" & ElementType<any, keyof IntrinsicElements>) \| ("a" & ElementType<any, keyof IntrinsicElements>) \| ... 177 more ... \| (FunctionComponent<...> & ElementType<...>)` | | | An override of the default HTML tag of the root of the component. Can also be another React component. What HTML element to render the root element as. |
| `children` | `ReactNode` | | | Content to be rendered. |
| `href` | `string` | ✅ | | The href of the link. Only applicable if `as` is `'a'`. |
| `leadingElement` | `ReactNode` | | | Leading element to be rendered. |
| `onClick` | `(event: MouseEvent<HTMLButtonElement, MouseEvent>) => void` | | | Event handler for when the button is clicked. Only applicable if `as` is `'button'`. |
| `ref` | `any` | | | A ref to apply to the root element. |
| `target` | `HTMLAttributeAnchorTarget` | | | The target of the link. Only applicable if `as` is `'a'`. |
| `trailingElement` | `ReactNode` | | | Trailing element to be rendered. |
### Breadcrumbs.Item
| Prop | Type | Required | Default | Description |
|------|------|----------|---------|-------------|
| `children` | `ReactNode` | | | Content to be rendered. Should be either `Breadcrumbs.Link`, `Breadcrumbs.Button` or `Breadcrumbs.SelectButton`. |
| `ref` | `Ref<HTMLLIElement>` | | | A ref to apply to the root element. |
### Breadcrumbs.Link
| Prop | Type | Required | Default | Description |
|------|------|----------|---------|-------------|
| `ariaCurrent` | `boolean \| "time" \| "false" \| "true" \| "page" \| "step" \| "location" \| "date"` | | `false` | Whether the link is the current item. Use `'page'` if it indicates the current page and `'step'` for steps (in a multi-step wizard for example). https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-current |
| `as` | `("button" & ElementType<any, keyof IntrinsicElements>) \| ("a" & ElementType<any, keyof IntrinsicElements>) \| ... 177 more ... \| (FunctionComponent<...> & ElementType<...>)` | | | An override of the default HTML tag of the root of the component. Can also be another React component. What HTML element to render the root element as. |
| `children` | `ReactNode` | | | Content to be rendered. |
| `href` | `string` | ✅ | | The href of the link. Only applicable if `as` is `'a'`. |
| `onClick` | `(event: MouseEvent<HTMLButtonElement, MouseEvent>) => void` | | | Event handler for when the button is clicked. Only applicable if `as` is `'button'`. |
| `ref` | `any` | | | A ref to apply to the root element. |
| `target` | `HTMLAttributeAnchorTarget` | | | The target of the link. Only applicable if `as` is `'a'`. |
### Breadcrumbs.SelectButton
| Prop | Type | Required | Default | Description |
|------|------|----------|---------|-------------|
| `ariaLabel` | `string` | ✅ | | Aria label needed for accessibility. |
| `children` | `ReactNode` | | | Content to be rendered. |
| `isActive` | `boolean` | | | Active - used when a connected menu is open |
| `onClick` | `(event: MouseEvent<HTMLButtonElement, MouseEvent>) => void` | | | Event handler for when the button is clicked. Should be used to open a `Menu`. |
| `ref` | `Ref<HTMLButtonElement>` | | | A ref to apply to the root element. |
## Accessibility
## Implementation guidelines
- The `Link` has a `ariaCurrent` prop that should be set on the breadcrumb that is representing the current step or page, to the corresponding value.
- The `Button` can be used with both icon + text, text only or icon only. If you only provide an icon, to create a custom home breadcrumb e.g., make sure to set the `aria-label` in the `htmlAttributes` prop.
- The `SelectButton` is essentially an icon button, and therefore has a prop `ariaLabel` that is required for accessibility.
## Examples
### Ellipses
```tsx
import '@neo4j-ndl/base/lib/neo4j-ds-styles.css';
import { Breadcrumbs, Menu } from '@neo4j-ndl/react';
import { useRef, useState } from 'react';
const Component = () => {
const menuRef = useRef<HTMLButtonElement>(null);
const [isMenuOpen, setIsMenuOpen] = useState(false);
return (
<Breadcrumbs>
<Breadcrumbs.Item>
<Breadcrumbs.Link href="#">Home</Breadcrumbs.Link>
</Breadcrumbs.Item>
<Breadcrumbs.Item>
<Breadcrumbs.Link
ref={menuRef}
as="button"
onClick={() => setIsMenuOpen(!isMenuOpen)}
htmlAttributes={{
'aria-label': 'Open ellipsis menu',
}}
>
...
<Menu
anchorRef={menuRef}
isOpen={isMenuOpen}
onClose={() => setIsMenuOpen(false)}
>
<Menu.Item title="Page 1" />
<Menu.Item title="Page 2" />
<Menu.Item title="Page 3" />
</Menu>
</Breadcrumbs.Link>
</Breadcrumbs.Item>
<Breadcrumbs.Item>
<Breadcrumbs.Link as="span" ariaCurrent="page">
Current page
</Breadcrumbs.Link>
</Breadcrumbs.Item>
</Breadcrumbs>
);
};
export default Component;
```
### Header
```tsx
import '@neo4j-ndl/base/lib/neo4j-ds-styles.css';
import { Breadcrumbs, Menu } from '@neo4j-ndl/react';
import {
BuildingOffice2IconOutline,
FolderIconOutline,
Neo4JIconColorIcon,
} from '-ndl/react/icons';
import { useRef, useState } from 'react';
const Component = () => {
const [isOrganizationMenuOpen, setIsOrganizationMenuOpen] = useState(false);
const organizationMenuRef = useRef<HTMLButtonElement>(null);
return (
<Breadcrumbs shouldWrap={false}>
<Breadcrumbs.Item className="n-mr-token-8">
<button
type="button"
aria-label="Home"
className="n-rounded-sm focus-visible:n-outline-2 focus-visible:n-outline-offset-[3px] focus-visible:n-outline-primary-focus n-shrink-0"
>
<Neo4JIconColorIcon className="n-h-6 n-w-[26px]" />
</button>
</Breadcrumbs.Item>
<Breadcrumbs.Item>
<Breadcrumbs.Button leadingElement={<BuildingOffice2IconOutline />}>
Organization 1
</Breadcrumbs.Button>
<Breadcrumbs.SelectButton
ref={organizationMenuRef}
ariaLabel="Open organization menu"
onClick={() => {
setIsOrganizationMenuOpen((prev) => !prev);
}}
isActive={isOrganizationMenuOpen}
>
<Menu
anchorRef={organizationMenuRef}
isOpen={isOrganizationMenuOpen}
onClose={() => setIsOrganizationMenuOpen(false)}
>
<Menu.Group>
<Menu.RadioItem title="Organization 1" isChecked={true} />
<Menu.RadioItem title="Organization 2" isChecked={false} />
</Menu.Group>
<Menu.Divider />
<Menu.Group>
<Menu.Item title="All Organizations" />
</Menu.Group>
</Menu>
</Breadcrumbs.SelectButton>
</Breadcrumbs.Item>
<Breadcrumbs.Item>
<Breadcrumbs.Button leadingElement={<FolderIconOutline />}>
Project 1
</Breadcrumbs.Button>
<Breadcrumbs.SelectButton ariaLabel="Open project menu"></Breadcrumbs.SelectButton>
</Breadcrumbs.Item>
</Breadcrumbs>
);
};
export default Component;
```
### Pages
```tsx
import '@neo4j-ndl/base/lib/neo4j-ds-styles.css';
import { Breadcrumbs } from '@neo4j-ndl/react';
const Component = () => {
return (
<Breadcrumbs>
<Breadcrumbs.Item>
<Breadcrumbs.Link href="">Home</Breadcrumbs.Link>
</Breadcrumbs.Item>
<Breadcrumbs.Item>
<Breadcrumbs.Link href="">Page</Breadcrumbs.Link>
</Breadcrumbs.Item>
<Breadcrumbs.Item>
<Breadcrumbs.Link href="">Subpage</Breadcrumbs.Link>
</Breadcrumbs.Item>
<Breadcrumbs.Item>
<Breadcrumbs.Link href="" ariaCurrent="page">
Current page
</Breadcrumbs.Link>
</Breadcrumbs.Item>
</Breadcrumbs>
);
};
export default Component;
```
### Steps
```tsx
import '@neo4j-ndl/base/lib/neo4j-ds-styles.css';
import { Breadcrumbs } from '@neo4j-ndl/react';
const Component = () => {
return (
<Breadcrumbs>
<Breadcrumbs.Item>
<Breadcrumbs.Link href="">Previous step</Breadcrumbs.Link>
</Breadcrumbs.Item>
<Breadcrumbs.Item>
<Breadcrumbs.Link href="" ariaCurrent="step">
Current step
</Breadcrumbs.Link>
</Breadcrumbs.Item>
<Breadcrumbs.Item>
<Breadcrumbs.Link href="">Next step</Breadcrumbs.Link>
</Breadcrumbs.Item>
</Breadcrumbs>
);
};
export default Component;
```