@delightui/components 0.1.104 → 0.1.106
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +104 -1
- package/dist/cjs/components/molecules/Modal/DemoModal.d.ts +8 -0
- package/dist/cjs/components/molecules/Modal/ModalContext/ModalContext.d.ts +41 -0
- package/dist/cjs/components/molecules/Modal/ModalContext/ModalContext.types.d.ts +87 -0
- package/dist/cjs/components/molecules/Modal/ModalContext/index.d.ts +3 -0
- package/dist/cjs/components/molecules/Modal/ModalContext/useModal.d.ts +34 -0
- package/dist/cjs/components/molecules/Modal/index.d.ts +2 -0
- package/dist/cjs/components/molecules/Popover/Popover.presenter.d.ts +26 -0
- package/dist/cjs/components/molecules/Select/Option/Option.types.d.ts +6 -0
- package/dist/cjs/components/molecules/Select/Select.Context.d.ts +1 -1
- package/dist/cjs/components/molecules/Select/Select.d.ts +5 -5
- package/dist/cjs/components/molecules/Select/Select.presenter.d.ts +1 -0
- package/dist/cjs/components/molecules/Select/Select.types.d.ts +5 -0
- package/dist/cjs/components/molecules/Select/index.d.ts +2 -9
- package/dist/cjs/components/molecules/index.d.ts +2 -0
- package/dist/cjs/components/utils/accessibilityUtils.d.ts +41 -0
- package/dist/cjs/components/utils/index.d.ts +2 -0
- package/dist/cjs/library.css +13 -0
- package/dist/cjs/library.js +2 -2
- package/dist/cjs/library.js.map +1 -1
- package/dist/esm/components/molecules/Modal/DemoModal.d.ts +8 -0
- package/dist/esm/components/molecules/Modal/ModalContext/ModalContext.d.ts +41 -0
- package/dist/esm/components/molecules/Modal/ModalContext/ModalContext.types.d.ts +87 -0
- package/dist/esm/components/molecules/Modal/ModalContext/index.d.ts +3 -0
- package/dist/esm/components/molecules/Modal/ModalContext/useModal.d.ts +34 -0
- package/dist/esm/components/molecules/Modal/index.d.ts +2 -0
- package/dist/esm/components/molecules/Popover/Popover.presenter.d.ts +26 -0
- package/dist/esm/components/molecules/Select/Option/Option.types.d.ts +6 -0
- package/dist/esm/components/molecules/Select/Select.Context.d.ts +1 -1
- package/dist/esm/components/molecules/Select/Select.d.ts +5 -5
- package/dist/esm/components/molecules/Select/Select.presenter.d.ts +1 -0
- package/dist/esm/components/molecules/Select/Select.types.d.ts +5 -0
- package/dist/esm/components/molecules/Select/index.d.ts +2 -9
- package/dist/esm/components/molecules/index.d.ts +2 -0
- package/dist/esm/components/utils/accessibilityUtils.d.ts +41 -0
- package/dist/esm/components/utils/index.d.ts +2 -0
- package/dist/esm/library.css +13 -0
- package/dist/esm/library.js +3 -3
- package/dist/esm/library.js.map +1 -1
- package/dist/index.d.ts +156 -12
- package/docs/README.md +264 -0
- package/docs/components/atoms/ActionImage.md +119 -0
- package/docs/components/atoms/Button.md +197 -0
- package/docs/components/atoms/Checkbox.md +299 -0
- package/docs/components/atoms/CheckboxItem.md +314 -0
- package/docs/components/atoms/Chip.md +380 -0
- package/docs/components/atoms/CustomToggle.md +270 -0
- package/docs/components/atoms/Icon.md +365 -0
- package/docs/components/atoms/IconButton.md +407 -0
- package/docs/components/atoms/Image.md +448 -0
- package/docs/components/atoms/Input.md +430 -0
- package/docs/components/atoms/ListItem.md +502 -0
- package/docs/components/atoms/Password.md +472 -0
- package/docs/components/atoms/RadioButton.md +614 -0
- package/docs/components/atoms/RadioButtonItem.md +588 -0
- package/docs/components/atoms/ResponsiveComponent.md +612 -0
- package/docs/components/atoms/SelectListItem.md +609 -0
- package/docs/components/atoms/Slider.md +605 -0
- package/docs/components/atoms/Spinner.md +605 -0
- package/docs/components/atoms/Text.md +463 -0
- package/docs/components/atoms/TextArea.md +670 -0
- package/docs/components/atoms/ToastNotification.md +668 -0
- package/docs/components/atoms/Toggle.md +737 -0
- package/docs/components/atoms/ToggleButton.md +751 -0
- package/docs/components/atoms/Tooltip.md +391 -0
- package/docs/components/molecules/Accordion.md +440 -0
- package/docs/components/molecules/AccordionGroup.md +547 -0
- package/docs/components/molecules/ActionCard.md +546 -0
- package/docs/components/molecules/Breadcrumb.md +403 -0
- package/docs/components/molecules/Breadcrumbs.md +485 -0
- package/docs/components/molecules/ButtonGroup.md +383 -0
- package/docs/components/molecules/Card.md +298 -0
- package/docs/components/molecules/ChipInput.md +646 -0
- package/docs/components/molecules/ContextMenu.md +768 -0
- package/docs/components/molecules/CustomTimeSelector.md +116 -0
- package/docs/components/molecules/DatePicker.md +516 -0
- package/docs/components/molecules/DateTimeSelector.md +166 -0
- package/docs/components/molecules/FormField.md +312 -0
- package/docs/components/molecules/Grid.md +577 -0
- package/docs/components/molecules/GridItem.md +834 -0
- package/docs/components/molecules/GridList.md +244 -0
- package/docs/components/molecules/List.md +485 -0
- package/docs/components/molecules/Modal.md +470 -0
- package/docs/components/molecules/ModalFooter.md +702 -0
- package/docs/components/molecules/ModalHeader.md +756 -0
- package/docs/components/molecules/ModalProvider.md +205 -0
- package/docs/components/molecules/Nav.md +530 -0
- package/docs/components/molecules/NavItem.md +572 -0
- package/docs/components/molecules/NavLink.md +499 -0
- package/docs/components/molecules/Option.md +521 -0
- package/docs/components/molecules/Pagination.md +592 -0
- package/docs/components/molecules/PaginationNumberField.md +722 -0
- package/docs/components/molecules/Popover.md +516 -0
- package/docs/components/molecules/ProgressBar.md +624 -0
- package/docs/components/molecules/RadioGroup.md +831 -0
- package/docs/components/molecules/RepeaterList.md +185 -0
- package/docs/components/molecules/Select.md +402 -0
- package/docs/components/molecules/SortableTrigger.md +82 -0
- package/docs/components/molecules/useModal.md +379 -0
- package/docs/components/organisms/Dropzone.md +346 -0
- package/docs/components/organisms/DropzoneClear.md +135 -0
- package/docs/components/organisms/DropzoneContent.md +216 -0
- package/docs/components/organisms/DropzoneFilename.md +191 -0
- package/docs/components/organisms/DropzoneSupportedFormats.md +184 -0
- package/docs/components/organisms/DropzoneTrigger.md +209 -0
- package/docs/components/organisms/Form.md +533 -0
- package/docs/components/organisms/SlideOutPanel.md +662 -0
- package/docs/components/organisms/TabContent.md +902 -0
- package/docs/components/organisms/TabItem.md +1091 -0
- package/docs/components/organisms/Table.md +611 -0
- package/docs/components/organisms/TableBody.md +679 -0
- package/docs/components/organisms/TableCell.md +482 -0
- package/docs/components/organisms/TableHeader.md +513 -0
- package/docs/components/organisms/TableHeaderCell.md +661 -0
- package/docs/components/organisms/TableRow.md +715 -0
- package/docs/components/organisms/Tabs.md +1330 -0
- package/docs/components/utils/ConditionalView.md +568 -0
- package/docs/components/utils/RenderStateView.md +726 -0
- package/docs/components/utils/WrapTextNodes.md +614 -0
- package/package.json +3 -2
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
# Breadcrumb
|
|
2
|
+
|
|
3
|
+
## Description
|
|
4
|
+
|
|
5
|
+
An individual breadcrumb item component that represents a single step in a navigation path. Works as a building block for breadcrumb trails, providing clickable navigation links with support for different states including active, disabled, and various visual styles.
|
|
6
|
+
|
|
7
|
+
## Aliases
|
|
8
|
+
|
|
9
|
+
- Breadcrumb
|
|
10
|
+
- BreadcrumbItem
|
|
11
|
+
- PathItem
|
|
12
|
+
- NavigationItem
|
|
13
|
+
- RouteItem
|
|
14
|
+
|
|
15
|
+
## Props Breakdown
|
|
16
|
+
|
|
17
|
+
**Extends:** `Omit<NavLinkProps, 'type'>`
|
|
18
|
+
|
|
19
|
+
| Prop | Type | Default | Required | Description |
|
|
20
|
+
|------|------|---------|----------|-------------|
|
|
21
|
+
| `selected` | `boolean` | `false` | No | Flag that defines the breadcrumb state as selected/active |
|
|
22
|
+
| `navLinkType` | `ButtonTypeEnum` | - | No | Defines the button type used for the breadcrumb link |
|
|
23
|
+
| `to` | `string \| -1` | - | No | Destination URL or path for navigation |
|
|
24
|
+
| `children` | `ReactNode` | - | Yes | Content of the breadcrumb item |
|
|
25
|
+
| `className` | `string` | - | No | Additional CSS class names |
|
|
26
|
+
| `disabled` | `boolean` | `false` | No | Whether the breadcrumb link is disabled |
|
|
27
|
+
|
|
28
|
+
## Examples
|
|
29
|
+
|
|
30
|
+
### Basic Usage
|
|
31
|
+
```tsx
|
|
32
|
+
import { Breadcrumb, Text } from '@delightui/components';
|
|
33
|
+
|
|
34
|
+
function BasicExample() {
|
|
35
|
+
return (
|
|
36
|
+
<Breadcrumb to="/dashboard">
|
|
37
|
+
<Text type="BodyMedium">Dashboard</Text>
|
|
38
|
+
</Breadcrumb>
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Selected State
|
|
44
|
+
```tsx
|
|
45
|
+
function SelectedExample() {
|
|
46
|
+
return (
|
|
47
|
+
<div className="breadcrumb-trail">
|
|
48
|
+
<Breadcrumb to="/home">
|
|
49
|
+
<Text type="BodyMedium">Home</Text>
|
|
50
|
+
</Breadcrumb>
|
|
51
|
+
<span className="breadcrumb-separator">/</span>
|
|
52
|
+
<Breadcrumb to="/products">
|
|
53
|
+
<Text type="BodyMedium">Products</Text>
|
|
54
|
+
</Breadcrumb>
|
|
55
|
+
<span className="breadcrumb-separator">/</span>
|
|
56
|
+
<Breadcrumb selected>
|
|
57
|
+
<Text type="BodyMedium">Product Details</Text>
|
|
58
|
+
</Breadcrumb>
|
|
59
|
+
</div>
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### Different Button Types
|
|
65
|
+
```tsx
|
|
66
|
+
function ButtonTypesExample() {
|
|
67
|
+
return (
|
|
68
|
+
<div className="breadcrumb-types">
|
|
69
|
+
<Breadcrumb to="/home" navLinkType="Filled">
|
|
70
|
+
<Text type="BodyMedium">Filled</Text>
|
|
71
|
+
</Breadcrumb>
|
|
72
|
+
<span className="breadcrumb-separator">/</span>
|
|
73
|
+
|
|
74
|
+
<Breadcrumb to="/products" navLinkType="Outlined">
|
|
75
|
+
<Text type="BodyMedium">Outlined</Text>
|
|
76
|
+
</Breadcrumb>
|
|
77
|
+
<span className="breadcrumb-separator">/</span>
|
|
78
|
+
|
|
79
|
+
<Breadcrumb to="/details" navLinkType="Ghost">
|
|
80
|
+
<Text type="BodyMedium">Ghost</Text>
|
|
81
|
+
</Breadcrumb>
|
|
82
|
+
<span className="breadcrumb-separator">/</span>
|
|
83
|
+
|
|
84
|
+
<Breadcrumb selected navLinkType="Text">
|
|
85
|
+
<Text type="BodyMedium">Text</Text>
|
|
86
|
+
</Breadcrumb>
|
|
87
|
+
</div>
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### With Icons
|
|
93
|
+
```tsx
|
|
94
|
+
function WithIconsExample() {
|
|
95
|
+
return (
|
|
96
|
+
<div className="breadcrumb-with-icons">
|
|
97
|
+
<Breadcrumb to="/home">
|
|
98
|
+
<Icon icon="Home" size="Small" />
|
|
99
|
+
<Text type="BodyMedium">Home</Text>
|
|
100
|
+
</Breadcrumb>
|
|
101
|
+
<span className="breadcrumb-separator">/</span>
|
|
102
|
+
|
|
103
|
+
<Breadcrumb to="/users">
|
|
104
|
+
<Icon icon="Users" size="Small" />
|
|
105
|
+
<Text type="BodyMedium">Users</Text>
|
|
106
|
+
</Breadcrumb>
|
|
107
|
+
<span className="breadcrumb-separator">/</span>
|
|
108
|
+
|
|
109
|
+
<Breadcrumb to="/profile">
|
|
110
|
+
<Icon icon="Person" size="Small" />
|
|
111
|
+
<Text type="BodyMedium">Profile</Text>
|
|
112
|
+
</Breadcrumb>
|
|
113
|
+
<span className="breadcrumb-separator">/</span>
|
|
114
|
+
|
|
115
|
+
<Breadcrumb selected>
|
|
116
|
+
<Icon icon="Settings" size="Small" />
|
|
117
|
+
<Text type="BodyMedium">Settings</Text>
|
|
118
|
+
</Breadcrumb>
|
|
119
|
+
</div>
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### Disabled State
|
|
125
|
+
```tsx
|
|
126
|
+
function DisabledExample() {
|
|
127
|
+
return (
|
|
128
|
+
<div className="breadcrumb-disabled">
|
|
129
|
+
<Breadcrumb to="/home">
|
|
130
|
+
<Text type="BodyMedium">Home</Text>
|
|
131
|
+
</Breadcrumb>
|
|
132
|
+
<span className="breadcrumb-separator">/</span>
|
|
133
|
+
|
|
134
|
+
<Breadcrumb to="/category" disabled>
|
|
135
|
+
<Text type="BodyMedium">Restricted Category</Text>
|
|
136
|
+
</Breadcrumb>
|
|
137
|
+
<span className="breadcrumb-separator">/</span>
|
|
138
|
+
|
|
139
|
+
<Breadcrumb selected>
|
|
140
|
+
<Text type="BodyMedium">Current Page</Text>
|
|
141
|
+
</Breadcrumb>
|
|
142
|
+
</div>
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
### E-commerce Navigation
|
|
148
|
+
```tsx
|
|
149
|
+
function EcommerceExample() {
|
|
150
|
+
const breadcrumbPath = [
|
|
151
|
+
{ label: 'Home', path: '/', icon: 'Home' },
|
|
152
|
+
{ label: 'Electronics', path: '/electronics', icon: 'Devices' },
|
|
153
|
+
{ label: 'Smartphones', path: '/electronics/smartphones', icon: 'Phone' },
|
|
154
|
+
{ label: 'iPhone 15 Pro', path: '/electronics/smartphones/iphone-15-pro', selected: true }
|
|
155
|
+
];
|
|
156
|
+
|
|
157
|
+
return (
|
|
158
|
+
<div className="ecommerce-breadcrumbs">
|
|
159
|
+
{breadcrumbPath.map((item, index) => (
|
|
160
|
+
<div key={index} className="breadcrumb-item">
|
|
161
|
+
{index > 0 && <span className="breadcrumb-separator">›</span>}
|
|
162
|
+
<Breadcrumb
|
|
163
|
+
to={item.path}
|
|
164
|
+
selected={item.selected}
|
|
165
|
+
className="ecommerce-breadcrumb"
|
|
166
|
+
>
|
|
167
|
+
{item.icon && <Icon icon={item.icon} size="Small" />}
|
|
168
|
+
<Text type="BodyMedium">{item.label}</Text>
|
|
169
|
+
</Breadcrumb>
|
|
170
|
+
</div>
|
|
171
|
+
))}
|
|
172
|
+
</div>
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
### Admin Dashboard Navigation
|
|
178
|
+
```tsx
|
|
179
|
+
function AdminDashboardExample() {
|
|
180
|
+
const currentPath = '/admin/users/manage/permissions';
|
|
181
|
+
const pathSegments = [
|
|
182
|
+
{ label: 'Dashboard', path: '/admin', icon: 'Dashboard' },
|
|
183
|
+
{ label: 'Users', path: '/admin/users', icon: 'Users' },
|
|
184
|
+
{ label: 'Manage', path: '/admin/users/manage', icon: 'Settings' },
|
|
185
|
+
{ label: 'Permissions', path: '/admin/users/manage/permissions', selected: true, icon: 'Security' }
|
|
186
|
+
];
|
|
187
|
+
|
|
188
|
+
return (
|
|
189
|
+
<div className="admin-breadcrumbs">
|
|
190
|
+
{pathSegments.map((segment, index) => (
|
|
191
|
+
<div key={index} className="admin-breadcrumb-item">
|
|
192
|
+
{index > 0 && <span className="admin-separator">→</span>}
|
|
193
|
+
<Breadcrumb
|
|
194
|
+
to={segment.path}
|
|
195
|
+
selected={segment.selected}
|
|
196
|
+
navLinkType={segment.selected ? "Filled" : "Ghost"}
|
|
197
|
+
className="admin-breadcrumb"
|
|
198
|
+
>
|
|
199
|
+
<Icon icon={segment.icon} size="Small" />
|
|
200
|
+
<Text type="BodyMedium">{segment.label}</Text>
|
|
201
|
+
{segment.selected && <Chip size="Small" style="A">Current</Chip>}
|
|
202
|
+
</Breadcrumb>
|
|
203
|
+
</div>
|
|
204
|
+
))}
|
|
205
|
+
</div>
|
|
206
|
+
);
|
|
207
|
+
}
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### File System Navigation
|
|
211
|
+
```tsx
|
|
212
|
+
function FileSystemExample() {
|
|
213
|
+
const filePath = '/documents/projects/website/assets/images/logo.png';
|
|
214
|
+
const pathParts = filePath.split('/').filter(Boolean);
|
|
215
|
+
|
|
216
|
+
return (
|
|
217
|
+
<div className="file-system-breadcrumbs">
|
|
218
|
+
<Breadcrumb to="/">
|
|
219
|
+
<Icon icon="Folder" size="Small" />
|
|
220
|
+
<Text type="BodyMedium">Root</Text>
|
|
221
|
+
</Breadcrumb>
|
|
222
|
+
|
|
223
|
+
{pathParts.map((part, index) => {
|
|
224
|
+
const isLast = index === pathParts.length - 1;
|
|
225
|
+
const fullPath = '/' + pathParts.slice(0, index + 1).join('/');
|
|
226
|
+
const isFile = isLast && part.includes('.');
|
|
227
|
+
|
|
228
|
+
return (
|
|
229
|
+
<div key={index} className="file-breadcrumb-item">
|
|
230
|
+
<span className="file-separator">/</span>
|
|
231
|
+
<Breadcrumb
|
|
232
|
+
to={fullPath}
|
|
233
|
+
selected={isLast}
|
|
234
|
+
className="file-breadcrumb"
|
|
235
|
+
>
|
|
236
|
+
<Icon
|
|
237
|
+
icon={isFile ? "InsertDriveFile" : "Folder"}
|
|
238
|
+
size="Small"
|
|
239
|
+
/>
|
|
240
|
+
<Text type="BodyMedium">{part}</Text>
|
|
241
|
+
{isFile && <Chip size="Small" style="B">PNG</Chip>}
|
|
242
|
+
</Breadcrumb>
|
|
243
|
+
</div>
|
|
244
|
+
);
|
|
245
|
+
})}
|
|
246
|
+
</div>
|
|
247
|
+
);
|
|
248
|
+
}
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
### Multi-level Categories
|
|
252
|
+
```tsx
|
|
253
|
+
function MultiLevelExample() {
|
|
254
|
+
const categories = [
|
|
255
|
+
{ id: 1, name: 'Technology', path: '/tech', level: 0 },
|
|
256
|
+
{ id: 2, name: 'Web Development', path: '/tech/web-dev', level: 1 },
|
|
257
|
+
{ id: 3, name: 'Frontend', path: '/tech/web-dev/frontend', level: 2 },
|
|
258
|
+
{ id: 4, name: 'React', path: '/tech/web-dev/frontend/react', level: 3, selected: true }
|
|
259
|
+
];
|
|
260
|
+
|
|
261
|
+
return (
|
|
262
|
+
<div className="multi-level-breadcrumbs">
|
|
263
|
+
{categories.map((category, index) => (
|
|
264
|
+
<div key={category.id} className="category-breadcrumb-item">
|
|
265
|
+
{index > 0 && <span className="category-separator">•</span>}
|
|
266
|
+
<Breadcrumb
|
|
267
|
+
to={category.path}
|
|
268
|
+
selected={category.selected}
|
|
269
|
+
navLinkType={category.level === 0 ? "Filled" : "Ghost"}
|
|
270
|
+
className={`category-breadcrumb level-${category.level}`}
|
|
271
|
+
>
|
|
272
|
+
<Text
|
|
273
|
+
type={category.level === 0 ? "Heading6" : "BodyMedium"}
|
|
274
|
+
className={`category-text level-${category.level}`}
|
|
275
|
+
>
|
|
276
|
+
{category.name}
|
|
277
|
+
</Text>
|
|
278
|
+
{category.selected && (
|
|
279
|
+
<Icon icon="CheckCircle" size="Small" />
|
|
280
|
+
)}
|
|
281
|
+
</Breadcrumb>
|
|
282
|
+
</div>
|
|
283
|
+
))}
|
|
284
|
+
</div>
|
|
285
|
+
);
|
|
286
|
+
}
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
### Interactive Breadcrumb with Dropdown
|
|
290
|
+
```tsx
|
|
291
|
+
function InteractiveExample() {
|
|
292
|
+
const [showOptions, setShowOptions] = useState(false);
|
|
293
|
+
const siblingPages = [
|
|
294
|
+
{ name: 'Overview', path: '/project/overview' },
|
|
295
|
+
{ name: 'Timeline', path: '/project/timeline' },
|
|
296
|
+
{ name: 'Team', path: '/project/team' },
|
|
297
|
+
{ name: 'Files', path: '/project/files' }
|
|
298
|
+
];
|
|
299
|
+
|
|
300
|
+
return (
|
|
301
|
+
<div className="interactive-breadcrumbs">
|
|
302
|
+
<Breadcrumb to="/home">
|
|
303
|
+
<Icon icon="Home" size="Small" />
|
|
304
|
+
<Text type="BodyMedium">Home</Text>
|
|
305
|
+
</Breadcrumb>
|
|
306
|
+
<span className="breadcrumb-separator">/</span>
|
|
307
|
+
|
|
308
|
+
<Breadcrumb to="/projects">
|
|
309
|
+
<Text type="BodyMedium">Projects</Text>
|
|
310
|
+
</Breadcrumb>
|
|
311
|
+
<span className="breadcrumb-separator">/</span>
|
|
312
|
+
|
|
313
|
+
<div className="breadcrumb-dropdown">
|
|
314
|
+
<Breadcrumb
|
|
315
|
+
selected
|
|
316
|
+
onClick={() => setShowOptions(!showOptions)}
|
|
317
|
+
className="dropdown-breadcrumb"
|
|
318
|
+
>
|
|
319
|
+
<Text type="BodyMedium">Website Redesign</Text>
|
|
320
|
+
<Icon icon="ExpandMore" size="Small" />
|
|
321
|
+
</Breadcrumb>
|
|
322
|
+
|
|
323
|
+
{showOptions && (
|
|
324
|
+
<div className="breadcrumb-options">
|
|
325
|
+
{siblingPages.map((page, index) => (
|
|
326
|
+
<Breadcrumb
|
|
327
|
+
key={index}
|
|
328
|
+
to={page.path}
|
|
329
|
+
className="dropdown-option"
|
|
330
|
+
>
|
|
331
|
+
<Text type="BodySmall">{page.name}</Text>
|
|
332
|
+
</Breadcrumb>
|
|
333
|
+
))}
|
|
334
|
+
</div>
|
|
335
|
+
)}
|
|
336
|
+
</div>
|
|
337
|
+
</div>
|
|
338
|
+
);
|
|
339
|
+
}
|
|
340
|
+
```
|
|
341
|
+
|
|
342
|
+
### Responsive Breadcrumbs
|
|
343
|
+
```tsx
|
|
344
|
+
function ResponsiveExample() {
|
|
345
|
+
const [showAll, setShowAll] = useState(false);
|
|
346
|
+
const breadcrumbItems = [
|
|
347
|
+
{ label: 'Home', path: '/' },
|
|
348
|
+
{ label: 'Products', path: '/products' },
|
|
349
|
+
{ label: 'Electronics', path: '/products/electronics' },
|
|
350
|
+
{ label: 'Computers', path: '/products/electronics/computers' },
|
|
351
|
+
{ label: 'Laptops', path: '/products/electronics/computers/laptops' },
|
|
352
|
+
{ label: 'Gaming Laptops', path: '/products/electronics/computers/laptops/gaming', selected: true }
|
|
353
|
+
];
|
|
354
|
+
|
|
355
|
+
const visibleItems = showAll ? breadcrumbItems : [
|
|
356
|
+
breadcrumbItems[0],
|
|
357
|
+
...breadcrumbItems.slice(-2)
|
|
358
|
+
];
|
|
359
|
+
|
|
360
|
+
return (
|
|
361
|
+
<div className="responsive-breadcrumbs">
|
|
362
|
+
{!showAll && breadcrumbItems.length > 3 && (
|
|
363
|
+
<>
|
|
364
|
+
<Breadcrumb to={breadcrumbItems[0].path}>
|
|
365
|
+
<Text type="BodyMedium">{breadcrumbItems[0].label}</Text>
|
|
366
|
+
</Breadcrumb>
|
|
367
|
+
<span className="breadcrumb-separator">/</span>
|
|
368
|
+
<Breadcrumb
|
|
369
|
+
onClick={() => setShowAll(true)}
|
|
370
|
+
className="breadcrumb-ellipsis"
|
|
371
|
+
>
|
|
372
|
+
<Text type="BodyMedium">...</Text>
|
|
373
|
+
</Breadcrumb>
|
|
374
|
+
<span className="breadcrumb-separator">/</span>
|
|
375
|
+
</>
|
|
376
|
+
)}
|
|
377
|
+
|
|
378
|
+
{(showAll ? breadcrumbItems : breadcrumbItems.slice(-2)).map((item, index, array) => (
|
|
379
|
+
<div key={index} className="responsive-breadcrumb-item">
|
|
380
|
+
{index > 0 && <span className="breadcrumb-separator">/</span>}
|
|
381
|
+
<Breadcrumb
|
|
382
|
+
to={item.path}
|
|
383
|
+
selected={item.selected}
|
|
384
|
+
>
|
|
385
|
+
<Text type="BodyMedium">{item.label}</Text>
|
|
386
|
+
</Breadcrumb>
|
|
387
|
+
</div>
|
|
388
|
+
))}
|
|
389
|
+
|
|
390
|
+
{showAll && (
|
|
391
|
+
<Button
|
|
392
|
+
size="Small"
|
|
393
|
+
type="Ghost"
|
|
394
|
+
onClick={() => setShowAll(false)}
|
|
395
|
+
className="collapse-breadcrumbs"
|
|
396
|
+
>
|
|
397
|
+
<Icon icon="ExpandLess" size="Small" />
|
|
398
|
+
</Button>
|
|
399
|
+
)}
|
|
400
|
+
</div>
|
|
401
|
+
);
|
|
402
|
+
}
|
|
403
|
+
```
|