Skip to content

Commit

Permalink
Merge pull request #176 from reaviz/Add-breadcrumbs
Browse files Browse the repository at this point in the history
Add breadcrumbs component
  • Loading branch information
amcdnl authored May 13, 2024
2 parents 2e6ba05 + 816a1e5 commit af42d49
Show file tree
Hide file tree
Showing 12 changed files with 238 additions and 3 deletions.
33 changes: 33 additions & 0 deletions docs/components/layout/Breadcrumbs.mdx
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import { Meta, Canvas, ArgTypes } from '@storybook/addon-docs';
import { Breadcrumbs, BreadcrumbList, BreadcrumbItem, BreadcrumbPage, BreadcrumbLink, BreadcrumbSeparator, breadcrumbsTheme } from '../../../src/layout/Breadcrumbs';
import * as BreadcrumbsStories from '../../../src/layout/Breadcrumbs/Breadcrumbs.story';
import ThemeRender from '../../ThemeRender.tsx';

<Meta title="Docs/Components/Layout/Breadcrumbs" />

# Breadcrumbs
Breadcrumbs are a navigation component that shows the user's location within a website or application.

## Example
<Canvas sourceState="shown" of={BreadcrumbsStories.Basic}/>

## Theme
This component uses the following default theme:

<ThemeRender theme={breadcrumbsTheme} />

Learn more about how to customize in the [Theme documentation](?path=/docs/docs-theme-getting-started--docs).

## API

### Breadcrumbs
<ArgTypes of={Breadcrumbs} />

### BreadcrumbList
<ArgTypes of={BreadcrumbList} />

### BreadcrumbLink
<ArgTypes of={BreadcrumbLink} />

### BreadcrumbSeparator
<ArgTypes of={BreadcrumbSeparator} />
7 changes: 7 additions & 0 deletions src/layout/Breadcrumbs/BreadcrumbItem.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import React, { FC } from 'react';
import { cn } from '@/utils';

export const BreadcrumbItem: FC<React.LiHTMLAttributes<HTMLLIElement>> = ({
className,
...rest
}) => <li className={cn('flex gap-2 items-center', className)} {...rest} />;
19 changes: 19 additions & 0 deletions src/layout/Breadcrumbs/BreadcrumbLink.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import React, { FC } from 'react';
import { cn, useComponentTheme } from '@/utils';
import { BreadcrumbsTheme } from './BreadcrumbsTheme';

export interface BreadcrumbLinkProps
extends React.AnchorHTMLAttributes<HTMLAnchorElement> {
theme?: BreadcrumbsTheme;
}

export const BreadcrumbLink: FC<BreadcrumbLinkProps> = ({
className,
theme: customTheme,
href,
...rest
}) => {
const theme = useComponentTheme('breadcrumbs', customTheme);

return <a className={cn(theme.link, className)} href={href} {...rest} />;
};
18 changes: 18 additions & 0 deletions src/layout/Breadcrumbs/BreadcrumbList.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
import React, { FC } from 'react';
import { cn, useComponentTheme } from '@/utils';
import { BreadcrumbsTheme } from './BreadcrumbsTheme';

export interface BreadcrumbListProps
extends React.OlHTMLAttributes<HTMLOListElement> {
theme?: BreadcrumbsTheme;
}

export const BreadcrumbList: FC<BreadcrumbListProps> = ({
className,
theme: customTheme,
...rest
}) => {
const theme = useComponentTheme('breadcrumbs', customTheme);

return <ol className={cn(theme.list, className)} {...rest} />;
};
26 changes: 26 additions & 0 deletions src/layout/Breadcrumbs/BreadcrumbPage.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { cn, useComponentTheme } from '@/utils';
import React, { FC } from 'react';
import { BreadcrumbsTheme } from './BreadcrumbsTheme';

export interface BreadcrumbPageProps
extends React.HTMLAttributes<HTMLSpanElement> {
theme?: BreadcrumbsTheme;
}

export const BreadcrumbPage: FC<BreadcrumbPageProps> = ({
theme: customTheme,
className,
...rest
}) => {
const theme = useComponentTheme('breadcrumbs', customTheme);

return (
<span
role="link"
aria-disabled="true"
aria-current="page"
className={cn(theme.activePage, className)}
{...rest}
/>
);
};
29 changes: 29 additions & 0 deletions src/layout/Breadcrumbs/BreadcrumbSeparator.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { Arrow } from '@/elements';
import { cn, useComponentTheme } from '@/utils';
import React, { FC } from 'react';
import { BreadcrumbsTheme } from './BreadcrumbsTheme';

export interface BreadcrumbSeparatorProps
extends React.LiHTMLAttributes<HTMLLIElement> {
theme?: BreadcrumbsTheme;
}

export const BreadcrumbSeparator: FC<BreadcrumbSeparatorProps> = ({
children = <Arrow direction="right" />,
className,
theme: customTheme,
...rest
}) => {
const theme = useComponentTheme('breadcrumbs', customTheme);

return (
<li
role="presentation"
aria-hidden={true}
className={cn(theme.separator, className)}
{...rest}
>
{children}
</li>
);
};
49 changes: 49 additions & 0 deletions src/layout/Breadcrumbs/Breadcrumbs.story.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import {
BreadcrumbItem,
BreadcrumbLink,
BreadcrumbList,
BreadcrumbPage,
BreadcrumbSeparator,
Breadcrumbs
} from './';

export default {
title: 'Components/Layout/Breadcrumbs',
component: Breadcrumbs
};

export const Basic = () => (
<Breadcrumbs>
<BreadcrumbList>
<BreadcrumbItem>
<BreadcrumbLink href="/">Home</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbSeparator />
<BreadcrumbItem>
<BreadcrumbLink href="/">Docs</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbSeparator />
<BreadcrumbItem>
<BreadcrumbPage>Breadcrumbs</BreadcrumbPage>
</BreadcrumbItem>
</BreadcrumbList>
</Breadcrumbs>
);

export const WithCustomSeparator = () => (
<Breadcrumbs>
<BreadcrumbList>
<BreadcrumbItem>
<BreadcrumbLink href="/">Home</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbSeparator>/</BreadcrumbSeparator>
<BreadcrumbItem>
<BreadcrumbLink href="/">Docs</BreadcrumbLink>
</BreadcrumbItem>
<BreadcrumbSeparator>/</BreadcrumbSeparator>
<BreadcrumbItem>
<BreadcrumbPage>Breadcrumbs</BreadcrumbPage>
</BreadcrumbItem>
</BreadcrumbList>
</Breadcrumbs>
);
23 changes: 23 additions & 0 deletions src/layout/Breadcrumbs/Breadcrumbs.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { cn, useComponentTheme } from '@/utils';
import React, { FC } from 'react';
import { BreadcrumbsTheme } from './BreadcrumbsTheme';

export interface BreadcrumbsProps extends React.HTMLAttributes<HTMLElement> {
theme?: BreadcrumbsTheme;
}

export const Breadcrumbs: FC<BreadcrumbsProps> = ({
theme: customTheme,
className,
...rest
}) => {
const theme = useComponentTheme('breadcrumbs', customTheme);

return (
<nav
className={cn(theme.base, className)}
aria-label={rest?.['aria-label'] ?? 'breadcrumbs'}
{...rest}
/>
);
};
17 changes: 17 additions & 0 deletions src/layout/Breadcrumbs/BreadcrumbsTheme.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
export interface BreadcrumbsTheme {
base: string;
separator: string;
list: string;
link: string;
activePage: string;
}

export const breadcrumbsTheme: BreadcrumbsTheme = {
base: '',
separator: '[&>svg]:size-3.5',
list: 'flex gap-2 items-center',
link: 'hover:text-panel-content text-panel-secondary-content transition-colors',
activePage: 'text-primary pointer-events-none'
};

export const legacyBreadcrumbTheme: BreadcrumbsTheme = breadcrumbsTheme;
7 changes: 7 additions & 0 deletions src/layout/Breadcrumbs/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
export * from './Breadcrumbs';
export * from './BreadcrumbsTheme';
export * from './BreadcrumbItem';
export * from './BreadcrumbLink';
export * from './BreadcrumbList';
export * from './BreadcrumbSeparator';
export * from './BreadcrumbPage';
1 change: 1 addition & 0 deletions src/layout/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@ export * from './Stack';
export * from './Tree';
export * from './VerticalSpacer';
export * from './Tabs';
export * from './Breadcrumbs';
12 changes: 9 additions & 3 deletions src/utils/Theme/themes/theme.ts
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,10 @@ import {
legacyDividerTheme,
JsonTreeTheme,
jsonTreeTheme,
legacyJsonTreeTheme
legacyJsonTreeTheme,
breadcrumbsTheme,
BreadcrumbsTheme,
legacyBreadcrumbTheme
} from '@/layout';

import {
Expand Down Expand Up @@ -182,6 +185,7 @@ export interface ReablocksTheme {
popover: PopoverTheme;
pager: PagerTheme;
tabs: TabsTheme;
breadcrumbs: BreadcrumbsTheme;
};
}

Expand Down Expand Up @@ -227,7 +231,8 @@ export const theme: ReablocksTheme = {
popover: popoverTheme,
pager: pagerTheme,
tabs: tabsTheme,
jsonTree: jsonTreeTheme
jsonTree: jsonTreeTheme,
breadcrumbs: breadcrumbsTheme
}
};

Expand Down Expand Up @@ -273,6 +278,7 @@ export const legacyThemeVars: ReablocksTheme = {
popover: legacyPopoverTheme,
pager: legacyPagerTheme,
tabs: legacyTabsTheme,
jsonTree: legacyJsonTreeTheme
jsonTree: legacyJsonTreeTheme,
breadcrumbs: legacyBreadcrumbTheme
}
};

0 comments on commit af42d49

Please sign in to comment.