Breadcrumbs
Breadcrumbs display the user's current location within a navigational hierarchy, allowing them to trace their path back to the starting point.
Installation
$ cbui-cli install breadcrumbs
cbui-cli
globally and authenticated your account. This will ensure you can access all the necessary features.Import
1import { Breadcrumbs, BreadcrumbItem, useBreadcrumbsContext, BreadcrumbsContext } from '@/crossbuildui/breadcrumbs';
2import Icon from 'react-native-vector-icons/MaterialIcons'; // If using custom icons
react-native-vector-icons
for its default separator. Ensure this library is installed and linked in your Expo project.Basic Usage
Create a breadcrumb trail by nesting BreadcrumbItem
components within a Breadcrumbs
container. Use the isCurrent
prop to indicate the active page.
1<Breadcrumbs>
2 <BreadcrumbItem href="/home">Home</BreadcrumbItem>
3 <BreadcrumbItem href="/products">Products</BreadcrumbItem>
4 <BreadcrumbItem isCurrent>Laptops</BreadcrumbItem>
5</Breadcrumbs>
With Icons
You can include icons or other custom content within breadcrumb items using the startContent
or endContent
props.
1<Breadcrumbs>
2 <BreadcrumbItem href="/home" startContent={<Icon name="home" size={16} />}>
3 Home
4 </BreadcrumbItem>
5 <BreadcrumbItem href="/settings" startContent={<Icon name="settings" size={16} />}>
6 Settings
7 </BreadcrumbItem>
8 <BreadcrumbItem isCurrent startContent={<Icon name="person" size={16} />}>
9 Profile
10 </BreadcrumbItem>
11</Breadcrumbs>
Variants & Colors
Breadcrumbs support light
(default), solid
, bordered
, and glass
variants. The color
prop influences item text color and container background/border for solid/bordered variants. For the glass variant, item text color often defaults to the theme's foreground.
1// Light (default)
2<Breadcrumbs>
3 <BreadcrumbItem>Light</BreadcrumbItem>
4 <BreadcrumbItem>Variant</BreadcrumbItem>
5</Breadcrumbs>
6
7// Solid
8<Breadcrumbs variant="solid" color="primary" radius="md">
9 <BreadcrumbItem>Solid</BreadcrumbItem>
10 <BreadcrumbItem>Primary</BreadcrumbItem>
11</Breadcrumbs>
12
13// Bordered
14<Breadcrumbs variant="bordered" color="secondary" radius="lg">
15 <BreadcrumbItem>Bordered</BreadcrumbItem>
16 <BreadcrumbItem>Secondary</BreadcrumbItem>
17</Breadcrumbs>
18
19// Glass
20<Breadcrumbs variant="glass" glassIntensity={70} glassTint="light" radius="md">
21 <BreadcrumbItem href="/store">Store</BreadcrumbItem>
22 <BreadcrumbItem isCurrent>Accessories</BreadcrumbItem>
23</Breadcrumbs>
Sizes
Adjust the size of breadcrumb items using the size
prop. Available sizes are sm
, md
(default), and lg
.
1<Breadcrumbs size="sm">
2 <BreadcrumbItem>Small</BreadcrumbItem>
3 <BreadcrumbItem>Size</BreadcrumbItem>
4</Breadcrumbs>
5
6<Breadcrumbs size="md">
7 <BreadcrumbItem>Medium</BreadcrumbItem>
8 <BreadcrumbItem>Size</BreadcrumbItem>
9</Breadcrumbs>
10
11<Breadcrumbs size="lg">
12 <BreadcrumbItem>Large</BreadcrumbItem>
13 <BreadcrumbItem>Size</BreadcrumbItem>
14</Breadcrumbs>
Glass Variant
The glass
variant applies a frosted glass effect to the breadcrumbs container using expo-blur
. Customize it with glassIntensity
(0-100) and glassTint
('light'
, 'dark'
, 'default'
). Item text and separator colors adapt for better contrast on the blurred background. You might need to adjust item colors manually for dark glass tints.
1<Breadcrumbs variant="glass" glassIntensity={80} glassTint="light" radius="lg" style={{padding: 8}}>
2 <BreadcrumbItem href="/home" startContent={<Icon name="home" size={16} />}>
3 Home
4 </BreadcrumbItem>
5 <BreadcrumbItem isCurrent>Dashboard</BreadcrumbItem>
6</Breadcrumbs>
7
8<Breadcrumbs variant="glass" glassIntensity={40} glassTint="dark" radius="md" style={{padding: 8, marginTop: 16}}>
9 <BreadcrumbItem href="/settings" itemStyles={{content: {color: 'white'}, startContent: {color: 'white'}}} startContent={<Icon name="settings" size={16} />}>
10 Settings
11 </BreadcrumbItem>
12 <BreadcrumbItem isCurrent itemStyles={{content: {color: 'lightgray'}}}>Appearance</BreadcrumbItem>
13</Breadcrumbs>
Collapsing Items
When there are many breadcrumb items, you can use maxItems
to collapse intermediate items into an ellipsis (...). Control the number of visible items before and after the ellipsis with itemsBeforeCollapse
and itemsAfterCollapse
.
1<Breadcrumbs maxItems={3} itemsBeforeCollapse={1} itemsAfterCollapse={1}>
2 <BreadcrumbItem href="/section1">Section 1</BreadcrumbItem>
3 <BreadcrumbItem href="/section2">Section 2</BreadcrumbItem>
4 <BreadcrumbItem href="/section3">Section 3</BreadcrumbItem>
5 <BreadcrumbItem href="/section4">Section 4</BreadcrumbItem>
6 <BreadcrumbItem href="/section5" isCurrent>Section 5</BreadcrumbItem>
7</Breadcrumbs>
Custom Separators
Provide a custom separator globally via the separator
prop on Breadcrumbs
, or for individual items using the separator
prop on BreadcrumbItem
.
1<Breadcrumbs separator={<Icon name="arrow-forward-ios" size={12} color="gray" />}>
2 <BreadcrumbItem href="/path1">Path One</BreadcrumbItem>
3 <BreadcrumbItem href="/path2">Path Two</BreadcrumbItem>
4 <BreadcrumbItem isCurrent>Current Page</BreadcrumbItem>
5</Breadcrumbs>
6
7// Item-specific separator
8<Breadcrumbs>
9 <BreadcrumbItem href="/docs">Docs</BreadcrumbItem>
10 <BreadcrumbItem href="/components" separator={<Text style={{marginHorizontal: 4}}>→</Text>}>
11 Components
12 </BreadcrumbItem>
13 <BreadcrumbItem isCurrent>Breadcrumbs</BreadcrumbItem>
14</Breadcrumbs>
Props Overview
Breadcrumbs Props
PROP | TYPE | DEFAULT | DESCRIPTION |
---|---|---|---|
children | ReactElement<BreadcrumbItemProps>[] | - | The breadcrumb items. |
variant | 'solid' | 'bordered' | 'light' | 'glass' | 'light' | Visual style. |
color | Theme color key | 'foreground' | Color theme. |
size | 'sm' | 'md' | 'lg' | 'md' | Size of items. |
radius | 'none' | 'sm' | 'md' | 'lg' | 'full' | 'md' | Container border radius for solid/bordered variants. |
underline | 'none' | 'hover' | 'active' | 'always' | 'hover' | Underline style. |
separator | ReactNode | Chevron Icon | Custom global separator. |
maxItems | number | - | Max items before collapsing. |
itemsBeforeCollapse | number | 1 | Items before ellipsis. |
itemsAfterCollapse | number | 1 | Items after ellipsis. |
hideSeparator | boolean | false | Hide all separators. |
isDisabled | boolean | false | Disable all items (except current). |
itemStyle | BreadcrumbItemSlotsStyles | - | Global styles for item slots. |
styles | BreadcrumbsSlotsStyles | - | Styles for container slots (base, list, ellipsis). |
style | StyleProp<ViewStyle> | - | Style for the outer container. |
glassTint | 'default' | 'light' | 'dark' | Theme-derived | Tint for the 'glass' variant blur effect. |
glassIntensity | number | 50 | Intensity (0-100) for the 'glass' variant blur effect. |
BreadcrumbItem Props
PROP | TYPE | DEFAULT | DESCRIPTION |
---|---|---|---|
children | ReactNode | - | Content of the item. |
color , size , underline | various | Inherited | Overrides parent settings. |
startContent , endContent | ReactNode | - | Content at start/end. |
separator | ReactNode | Inherited | Item-specific separator. |
isCurrent | boolean | false | Marks item as current page. |
isLast | boolean | Injected | (Injected by Breadcrumbs) Marks item as last. |
hideSeparator | boolean | false | Hides separator after this item. |
disabled | boolean | false | Disables the item. |
itemStyles | BreadcrumbItemSlotsStyles | - | Styles for this item's slots. |
style | StyleProp<ViewStyle> | - | Style for the Pressable wrapper. |
onPress | (event) => void | - | Handler for press events. |
...PressableProps | various | - | Other props from React Native's Pressable. |
Styling
Customize the appearance using:
style
prop onBreadcrumbs
for the outer container.styles
prop onBreadcrumbs
for internal slots likebase
,list
, andellipsis
.itemStyle
prop onBreadcrumbs
for global styling of all item slots.itemStyles
prop onBreadcrumbItem
for specific item slot styling.style
prop onBreadcrumbItem
for the Pressable wrapper.- For the
glass
variant, the background is rendered byBlurView
fromexpo-blur
, controlled byglassIntensity
andglassTint
. Thestyles.base.backgroundColor
will be overridden for this variant.
1<Breadcrumbs
2 style={{ marginVertical: 10 }} // Style for the outer container
3 styles={{
4 base: { padding: 8, backgroundColor: '#f0f0f0' }, // Style for the main list container
5 list: { justifyContent: 'center' },
6 ellipsis: { fontWeight: 'bold' }
7 }}
8 itemStyle={{ // Global styles for all items
9 base: { marginHorizontal: 2 },
10 content: { fontFamily: 'Arial' }
11 }}
12>
13 <BreadcrumbItem
14 itemStyles={{ // Specific styles for this item
15 base: { backgroundColor: 'lightblue' },
16 content: { color: 'darkblue', fontWeight: 'bold' },
17 startContent: { marginRight: 8 }
18 }}
19 startContent={<Icon name="star" size={16} />}
20 >
21 Styled Item
22 </BreadcrumbItem>
23 <BreadcrumbItem>Another Item</BreadcrumbItem>
24</Breadcrumbs>
Using Breadcrumbs Context
For advanced customization or to build components that react to the Breadcrumbs state, you can use the useBreadcrumbsContext
hook. This hook provides access to properties like variant
, color
, size
, maxItems
, items
(the children passed to Breadcrumbs), and more.
Any component that calls useBreadcrumbsContext
must be a descendant of a Breadcrumbs
component.
1import { Breadcrumbs, BreadcrumbItem, useBreadcrumbsContext } from '@/crossbuildui/breadcrumbs';
2import { Text, View } from 'react-native';
3
4const CustomBreadcrumbContent = () => {
5 const context = useBreadcrumbsContext();
6
7 if (!context) {
8 return <Text>This component must be used within Breadcrumbs.</Text>;
9 }
10
11 const { variant, color, size, maxItems, items } = context;
12
13 return (
14 <View style={{ marginTop: 8, padding: 8, backgroundColor: '#f0f0f0', borderRadius: 4 }}>
15 <Text>Breadcrumbs Info:</Text>
16 <Text>- Variant: {variant}</Text>
17 <Text>- Color: {color}</Text>
18 <Text>- Size: {size}</Text>
19 <Text>- Max Items: {maxItems ?? 'Not set'}</Text>
20 <Text>- Total Items (passed as children): {items.length}</Text>
21 </View>
22 );
23};
24
25// Later in your component:
26// <Breadcrumbs size="sm" color="primary"><BreadcrumbItem href="/home">Home</BreadcrumbItem><CustomBreadcrumbContent /></Breadcrumbs>
Accessibility
The Breadcrumbs
component has accessibilityRole="menubar"
. Each interactive BreadcrumbItem
has accessibilityRole="link"
and appropriate accessibilityState
(disabled, selected).