aural-ui 4.0.1 → 4.2.0
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 +8 -1
- package/dist/components/aspect-ratio/AspectRatio.stories.tsx +290 -1228
- package/dist/components/avatar/Avatar.stories.tsx +219 -235
- package/dist/components/badge/Badge.stories.tsx +379 -116
- package/dist/components/banner/Banner.stories.tsx +445 -391
- package/dist/components/breadcrumb/Breadcrumb.stories.tsx +453 -199
- package/dist/components/button/Button.stories.tsx +585 -230
- package/dist/components/card/Card.stories.tsx +619 -301
- package/dist/components/char-count/CharCount.stories.tsx +350 -248
- package/dist/components/checkbox/Checkbox.stories.tsx +309 -167
- package/dist/components/chip/Chip.stories.tsx +362 -168
- package/dist/components/circular-loader/CircularLoader.stories.tsx +221 -636
- package/dist/components/clamp-lines/ClampLines.stories.tsx +246 -117
- package/dist/components/collapsible/Collapsible.stories.tsx +391 -252
- package/dist/components/command/Command.stories.tsx +530 -867
- package/dist/components/dialog/Dialog.stories.tsx +501 -950
- package/dist/components/divider/Divider.stories.tsx +264 -527
- package/dist/components/dot-loader/DotLoader.stories.tsx +256 -257
- package/dist/components/drawer/Drawer.stories.tsx +659 -1023
- package/dist/components/dropdown/Dropdown.stories.tsx +643 -1028
- package/dist/components/form/Form.stories.tsx +560 -274
- package/dist/components/helper-text/HelperText.stories.tsx +199 -200
- package/dist/components/hover-card/HoverCard.stories.tsx +318 -1254
- package/dist/components/icon-button/IconButton.stories.tsx +837 -194
- package/dist/components/if-else/if-else.stories.tsx +370 -83
- package/dist/components/input/Input.stories.tsx +436 -368
- package/dist/components/label/Label.stories.tsx +156 -154
- package/dist/components/list/List.stories.tsx +484 -835
- package/dist/components/marquee/Marquee.stories.tsx +356 -712
- package/dist/components/otp-inputs/OtpInputs.stories.tsx +352 -422
- package/dist/components/overlay/Overlay.stories.tsx +452 -824
- package/dist/components/pagination/Pagination.stories.tsx +721 -210
- package/dist/components/popover/Popover.stories.tsx +481 -896
- package/dist/components/radio/Radio.stories.tsx +432 -124
- package/dist/components/resizable/Resizable.stories.tsx +495 -799
- package/dist/components/scroll-area/ScrollArea.stories.tsx +383 -1059
- package/dist/components/search/Search.stories.tsx +312 -595
- package/dist/components/select/Select.stories.tsx +684 -789
- package/dist/components/sheet/Sheet.stories.tsx +671 -950
- package/dist/components/skelton/Skelton.stories.tsx +230 -764
- package/dist/components/slider/Slider.stories.tsx +383 -760
- package/dist/components/stepper/Stepper.stories.tsx +371 -514
- package/dist/components/switch/Switch.stories.tsx +461 -208
- package/dist/components/switch-case/SwitchCase.stories.tsx +367 -188
- package/dist/components/table/Table.stories.tsx +770 -916
- package/dist/components/tabs/Tabs.stories.tsx +458 -1455
- package/dist/components/tag/Tag.stories.tsx +714 -542
- package/dist/components/textarea/TextArea.stories.tsx +621 -562
- package/dist/components/thumbnail-tags/ThumbnailTags.stories.tsx +228 -154
- package/dist/components/toast/Toast.stories.tsx +452 -1339
- package/dist/components/toggle/Toggle.stories.tsx +488 -931
- package/dist/components/tooltip/Tooltip.stories.tsx +344 -1388
- package/dist/components/typography/Typography.stories.tsx +406 -89
- package/dist/hooks/use-change-state/UseChangeState.stories.tsx +309 -606
- package/dist/hooks/use-previous/UsePrevious.stories.tsx +367 -917
- package/dist/hooks/use-standalone-pagination/UseStandalonePagination.stories.tsx +639 -867
- package/dist/icons/Icons.stories.tsx +0 -12
- package/dist/icons/ai-avatar-icon/AiAvatarIcon.stories.tsx +223 -1060
- package/dist/icons/alert-icon/AlertIcon.stories.tsx +106 -968
- package/dist/icons/all-icons.tsx +37 -16
- package/dist/icons/angle-down-icon/AngleDownIcon.stories.tsx +137 -1010
- package/dist/icons/apple-logo-icon/AppleLogoIcon.stories.tsx +145 -935
- package/dist/icons/arrow-box-left-icon/ArrowBoxLeftIcon.stories.tsx +132 -1046
- package/dist/icons/arrow-corner-up-left-icon/ArrowCornerUpLeftIcon.stories.tsx +134 -986
- package/dist/icons/arrow-corner-up-right-icon/ArrowCornerUpRightIcon.stories.tsx +135 -1028
- package/dist/icons/arrow-left-icon/ArrowLeftIcon.stories.tsx +133 -971
- package/dist/icons/arrow-right-icon/ArrowRightIcon.stories.tsx +145 -1123
- package/dist/icons/arrow-right-up-icon/ArrowRightUpIcon.stories.tsx +143 -1252
- package/dist/icons/art-board-icon/ArtBoardIcon.stories.tsx +123 -632
- package/dist/icons/audio-bar-icon/AudioBarIcon.stories.tsx +141 -1223
- package/dist/icons/backward-ten-seconds-icon/BackwardTenSecondsIcon.stories.tsx +164 -1018
- package/dist/icons/bubble-check-icon/BubbleCheckIcon.stories.tsx +121 -1236
- package/dist/icons/bubble-crossed-icon/BubbleCrossedIcon.stories.tsx +121 -1213
- package/dist/icons/bubble-sparkle-icon/BubbleSparkleIcon.stories.tsx +116 -893
- package/dist/icons/camera-icon/CameraIcon.stories.tsx +109 -1254
- package/dist/icons/capital-a-letter-icon/CapitalALetterIcon.stories.tsx +114 -975
- package/dist/icons/chevron-double-left-icon/ChevronDoubleLeftIcon.stories.tsx +157 -994
- package/dist/icons/chevron-double-right-icon/ChevronDoubleRightIcon.stories.tsx +160 -992
- package/dist/icons/chevron-down-icon/ChevronDownIcon.stories.tsx +140 -970
- package/dist/icons/chevron-left-icon/ChevronLeftIcon.stories.tsx +126 -993
- package/dist/icons/chevron-right-icon/ChevronRightIcon.stories.tsx +144 -987
- package/dist/icons/chevron-up-icon/ChevronUpIcon.stories.tsx +141 -1007
- package/dist/icons/circle-tick-icon/CircleTickIcon.stories.tsx +147 -1187
- package/dist/icons/circular-play-icon/CircularPlayIcon.stories.tsx +110 -476
- package/dist/icons/coin-icon/CoinIcon.stories.tsx +120 -1364
- package/dist/icons/coin-toons-icon/CoinToonsIcon.stories.tsx +113 -1360
- package/dist/icons/column-wide-add-icon/ColumnWideAddIcon.stories.tsx +111 -942
- package/dist/icons/command-icon/CommandIcon.stories.tsx +124 -1087
- package/dist/icons/copy-icon/CopyIcon.stories.tsx +119 -996
- package/dist/icons/cross-circle-icon/CrossCircleIcon.stories.tsx +144 -1046
- package/dist/icons/cross-icon/CrossIcon.stories.tsx +136 -999
- package/dist/icons/download-icon/DownloadIcon.stories.tsx +123 -857
- package/dist/icons/edit-big-icon/EditBigIcon.stories.tsx +121 -1080
- package/dist/icons/email-icon/EmailIcon.stories.tsx +112 -979
- package/dist/icons/expand-icon/ExpandIcon.stories.tsx +109 -1146
- package/dist/icons/eye-close-icon/EyeCloseIcon.stories.tsx +141 -1068
- package/dist/icons/eye-open-icon/EyeOpenIcon.stories.tsx +140 -1081
- package/dist/icons/feature-shine-icon/FeatureShineIcon.stories.tsx +124 -1050
- package/dist/icons/file-chart-icon/FileChartIcon.stories.tsx +123 -1091
- package/dist/icons/file-text-icon/FileTextIcon.stories.tsx +122 -633
- package/dist/icons/filter-bar-row-icon/FilterBarRowIcon.stories.tsx +116 -1087
- package/dist/icons/forward-ten-seconds-icon/ForwardTenSecondsIcon.stories.tsx +166 -1020
- package/dist/icons/git-branch-icon/GitBranchIcon.stories.tsx +112 -1182
- package/dist/icons/git-fork-icon/GitForkIcon.stories.tsx +112 -1155
- package/dist/icons/globe-icon/GlobeIcon.stories.tsx +127 -325
- package/dist/icons/google-logo-icon/GoogleLogoIcon.stories.tsx +142 -985
- package/dist/icons/grip-vertical-icon/GripVerticalIcon.stories.tsx +116 -1217
- package/dist/icons/head-icon/HeadIcon.stories.tsx +108 -953
- package/dist/icons/heart-icon/HeartIcon.stories.tsx +117 -1060
- package/dist/icons/image-avatar-sparkle-icon/ImageAvatarSparkleIcon.stories.tsx +116 -716
- package/dist/icons/image-icon/ImageIcon.stories.tsx +102 -1164
- package/dist/icons/import-folder-icon/ImportFolderIcon.stories.tsx +108 -1233
- package/dist/icons/import-left-arrow-folder-icon/ImportLeftArrowFolderIcon.stories.tsx +133 -1289
- package/dist/icons/indian-flag-icon/IndianFlagIcon.stories.tsx +155 -1012
- package/dist/icons/instagram-icon/InstagramIcon.stories.tsx +158 -1438
- package/dist/icons/layout-column-icon/LayoutColumnIcon.stories.tsx +121 -1011
- package/dist/icons/layout-left-icon/LayoutLeftIcon.stories.tsx +116 -981
- package/dist/icons/layout-right-icon/LayoutRightIcon.stories.tsx +116 -979
- package/dist/icons/light-bulb-simple-icon/LightBulbSimpleIcon.stories.tsx +105 -1252
- package/dist/icons/linked-in-icon/LinkedInIcon.stories.tsx +151 -1554
- package/dist/icons/magic-book-icon/MagicBookIcon.stories.tsx +107 -1227
- package/dist/icons/magic-edit-icon/MagicEditIcon.stories.tsx +116 -707
- package/dist/icons/maintenance-icon/MaintenanceIcon.stories.tsx +119 -1226
- package/dist/icons/message-icon/MessageIcon.stories.tsx +111 -557
- package/dist/icons/minimize-icon/MinimizeIcon.stories.tsx +112 -1198
- package/dist/icons/moon-icon/MoonIcon.stories.tsx +117 -557
- package/dist/icons/move-horizontal-icon/MoveHorizontalIcon.stories.tsx +106 -1235
- package/dist/icons/move-vertical-icon/MoveVerticalIcon.stories.tsx +112 -1185
- package/dist/icons/musical-note-icon/MusicalNoteIcon.stories.tsx +116 -1012
- package/dist/icons/notepad-icon/NotepadIcon.stories.tsx +108 -1137
- package/dist/icons/notes-icon/NotesIcon.stories.tsx +116 -1138
- package/dist/icons/page-search-icon/PageSearchIcon.stories.tsx +106 -1146
- package/dist/icons/page-text-icon/PageTextIcon.stories.tsx +119 -719
- package/dist/icons/paint-roll-icon/PaintRollIcon.stories.tsx +110 -999
- package/dist/icons/paper-plane-icon/PaperPlaneIcon.stories.tsx +109 -912
- package/dist/icons/pause-icon/PauseIcon.stories.tsx +110 -1041
- package/dist/icons/pencil-icon/PencilIcon.stories.tsx +112 -1109
- package/dist/icons/phone-icon/PhoneIcon.stories.tsx +112 -1023
- package/dist/icons/plus-icon/PlusIcon.stories.tsx +103 -1132
- package/dist/icons/pocket-studio-icon/PocketStudioIcon.stories.tsx +104 -870
- package/dist/icons/scroll-down-icon/ScrollDownIcon.stories.tsx +99 -476
- package/dist/icons/search-icon/SearchIcon.stories.tsx +108 -1161
- package/dist/icons/setting-icon/SettingIcon.stories.tsx +104 -1009
- package/dist/icons/share-icon/ShareIcon.stories.tsx +117 -1064
- package/dist/icons/shield-icon/ShieldIcon.stories.tsx +114 -974
- package/dist/icons/site-logo-icon/SiteLogoIcon.stories.tsx +134 -1160
- package/dist/icons/skip-backward-icon/SkipBackwardIcon.stories.tsx +169 -1017
- package/dist/icons/skip-forward-icon/SkipForwardIcon.stories.tsx +161 -1016
- package/dist/icons/sparkles-soft-icon/SparklesSoftIcon.stories.tsx +102 -1001
- package/dist/icons/spinner-gradient-icon/SpinnerGradientIcon.stories.tsx +155 -593
- package/dist/icons/spinner-solid-icon/SpinnerSolidIcon.stories.tsx +155 -608
- package/dist/icons/spinner-solid-neutral-icon/SpinnerSolidINeutralcon.stories.tsx +142 -712
- package/dist/icons/star-icon/StarIcon.stories.tsx +120 -946
- package/dist/icons/store-coin-icon/StoreCoinIcon.stories.tsx +109 -1013
- package/dist/icons/suggestion-icon/SuggestionIcon.stories.tsx +113 -891
- package/dist/icons/sun-icon/SunIcon.stories.tsx +117 -864
- package/dist/icons/text-color-icon/TextColorIcon.stories.tsx +113 -989
- package/dist/icons/text-indicator-icon/TextIndicatorIcon.stories.tsx +120 -1027
- package/dist/icons/threads-icon/ThreadsIcon.stories.tsx +153 -1476
- package/dist/icons/tick-circle-icon/TickCircleIcon.stories.tsx +143 -1187
- package/dist/icons/tick-icon/TickIcon.stories.tsx +142 -1322
- package/dist/icons/trash-icon/TrashIcon.stories.tsx +105 -970
- package/dist/icons/twitter-x-icon/TwitterXIcon.stories.tsx +154 -1457
- package/dist/icons/upload-icon/UploadIcon.stories.tsx +112 -930
- package/dist/icons/vertical-menu-icon/VerticalMenuIcon.stories.tsx +115 -1019
- package/dist/icons/video-play-list-icon/VideoPlaylistIcon.stories.tsx +122 -1092
- package/dist/icons/voice-playing-icon/VoicePlayingIcon.stories.tsx +120 -1401
- package/dist/icons/volume-full-icon/VolumeFullIcon.stories.tsx +107 -1212
- package/dist/icons/volume-half-icon/VolumeHalfIcon.stories.tsx +109 -1122
- package/dist/icons/volume-off-icon/VolumeOffIcon.stories.tsx +112 -1124
- package/dist/icons/warning-icon/WarningIcon.stories.tsx +119 -1083
- package/dist/icons/youtube-icon/YoutubeIcon.stories.tsx +158 -983
- package/dist/index.cjs +90 -90
- package/dist/index.js +90 -90
- package/package.json +8 -3
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import React from "react"
|
|
2
|
-
import { ArrowRightIcon } from "@icons/arrow-right-icon"
|
|
3
2
|
import { ChevronDoubleRightIcon } from "@icons/chevron-double-right-icon"
|
|
4
3
|
import type { Meta, StoryObj } from "@storybook/react-vite"
|
|
5
4
|
|
|
5
|
+
import { AuralComponentDocsPage } from "src/ui/story-spec/components/component-story-docs-page"
|
|
6
|
+
|
|
6
7
|
import { Breadcrumb } from "."
|
|
7
8
|
|
|
8
9
|
const meta: Meta<typeof Breadcrumb> = {
|
|
@@ -10,73 +11,29 @@ const meta: Meta<typeof Breadcrumb> = {
|
|
|
10
11
|
component: Breadcrumb,
|
|
11
12
|
parameters: {
|
|
12
13
|
layout: "centered",
|
|
13
|
-
backgrounds: {
|
|
14
|
-
default: "dark",
|
|
15
|
-
values: [
|
|
16
|
-
{ name: "dark", value: "#0a0a0a" },
|
|
17
|
-
{ name: "light", value: "#ffffff" },
|
|
18
|
-
],
|
|
19
|
-
},
|
|
20
14
|
docs: {
|
|
21
15
|
description: {
|
|
22
|
-
component:
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
A navigation component that shows the current page's location within a site hierarchy. Users can navigate back to previous levels by clicking on breadcrumb items.
|
|
26
|
-
|
|
27
|
-
## Features
|
|
28
|
-
|
|
29
|
-
- **Multiple Separators**: Support for chevron, slash, arrow, and custom separators
|
|
30
|
-
- **Custom Separator**: Use any React component or icon as a separator
|
|
31
|
-
- **Clickable Navigation**: Items can be clickable links or static text
|
|
32
|
-
- **Responsive Design**: Adapts spacing for mobile and desktop
|
|
33
|
-
- **Accessibility**: Proper ARIA labels and semantic HTML structure
|
|
34
|
-
- **Customizable**: Size variants and custom styling options
|
|
35
|
-
- **Truncation**: Optional max items with ellipsis for long breadcrumbs
|
|
36
|
-
- **Home Integration**: Optional home item at the beginning
|
|
37
|
-
|
|
38
|
-
## Usage Examples
|
|
39
|
-
|
|
40
|
-
### Basic Breadcrumb
|
|
41
|
-
\`\`\`tsx
|
|
42
|
-
<Breadcrumb
|
|
43
|
-
items={[
|
|
44
|
-
{ title: "Home", url: "/" },
|
|
45
|
-
{ title: "Products", url: "/products" },
|
|
46
|
-
{ title: "Electronics" }
|
|
47
|
-
]}
|
|
48
|
-
onItemClick={(title, url) => console.log(title, url)}
|
|
49
|
-
/>
|
|
50
|
-
\`\`\`
|
|
51
|
-
|
|
52
|
-
### With Different Separators
|
|
53
|
-
\`\`\`tsx
|
|
54
|
-
<Breadcrumb
|
|
55
|
-
items={items}
|
|
56
|
-
separator="slash"
|
|
57
|
-
onItemClick={handleClick}
|
|
58
|
-
/>
|
|
59
|
-
\`\`\`
|
|
60
|
-
|
|
61
|
-
### With Size Variants
|
|
62
|
-
\`\`\`tsx
|
|
63
|
-
<Breadcrumb
|
|
64
|
-
items={items}
|
|
65
|
-
size="lg"
|
|
66
|
-
onItemClick={handleClick}
|
|
67
|
-
/>
|
|
68
|
-
\`\`\`
|
|
69
|
-
|
|
70
|
-
### With Custom Separator
|
|
71
|
-
\`\`\`tsx
|
|
72
|
-
<Breadcrumb
|
|
73
|
-
items={items}
|
|
74
|
-
customSeparator={<ArrowRightIcon width={16} height={16} />}
|
|
75
|
-
onItemClick={handleClick}
|
|
76
|
-
/>
|
|
77
|
-
\`\`\`
|
|
78
|
-
`,
|
|
16
|
+
component:
|
|
17
|
+
"A navigation component that shows the current page's location within a site hierarchy. Supports chevron, slash, arrow, and custom separators; optional home prepend; maxItems truncation; and clickable or static items.",
|
|
79
18
|
},
|
|
19
|
+
page: () => (
|
|
20
|
+
<AuralComponentDocsPage
|
|
21
|
+
features={[
|
|
22
|
+
{
|
|
23
|
+
title: "Multiple Separators",
|
|
24
|
+
description: "Chevron, slash, arrow",
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
title: "Home Prefix",
|
|
28
|
+
description: "Optional home item",
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
title: "Auto Truncation",
|
|
32
|
+
description: "maxItems collapses path",
|
|
33
|
+
},
|
|
34
|
+
]}
|
|
35
|
+
/>
|
|
36
|
+
),
|
|
80
37
|
},
|
|
81
38
|
},
|
|
82
39
|
tags: ["autodocs"],
|
|
@@ -104,199 +61,496 @@ A navigation component that shows the current page's location within a site hier
|
|
|
104
61
|
export default meta
|
|
105
62
|
type Story = StoryObj<typeof Breadcrumb>
|
|
106
63
|
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
64
|
+
const subsectionHeaderClass =
|
|
65
|
+
"text-fm-secondary font-fm-text text-fm-md leading-fm-md font-medium"
|
|
66
|
+
const itemLabelClass = "text-fm-secondary font-fm-text text-fm-sm leading-fm-sm"
|
|
67
|
+
const cardClass =
|
|
68
|
+
"border-fm-divider-secondary rounded-xl border bg-transparent p-4"
|
|
69
|
+
const codeBlockClass =
|
|
70
|
+
"border-fm-divider-secondary bg-fm-surface-secondary rounded-lg border px-4 py-3"
|
|
71
|
+
const codeClass =
|
|
72
|
+
"text-fm-secondary font-[var(--font-fm-mono)] text-fm-md leading-fm-md"
|
|
73
|
+
|
|
74
|
+
const musicItems = [
|
|
75
|
+
{ title: "Discover", url: "/discover", isClickable: true },
|
|
76
|
+
{ title: "Artists", url: "/discover/artists", isClickable: true },
|
|
77
|
+
{
|
|
78
|
+
title: "Electronic",
|
|
79
|
+
url: "/discover/artists/electronic",
|
|
80
|
+
isClickable: true,
|
|
81
|
+
},
|
|
111
82
|
{
|
|
112
|
-
title: "
|
|
113
|
-
url: "/
|
|
83
|
+
title: "Bicep",
|
|
84
|
+
url: "/discover/artists/electronic/bicep",
|
|
114
85
|
isClickable: true,
|
|
115
86
|
},
|
|
116
|
-
{ title: "
|
|
87
|
+
{ title: "Isles" },
|
|
117
88
|
]
|
|
118
89
|
|
|
119
|
-
const
|
|
120
|
-
{ title: "
|
|
121
|
-
{ title: "
|
|
122
|
-
{ title: "Electronics", url: "/products/electronics", isClickable: true },
|
|
90
|
+
const longMusicItems = [
|
|
91
|
+
{ title: "Discover", url: "/discover", isClickable: true },
|
|
92
|
+
{ title: "Artists", url: "/discover/artists", isClickable: true },
|
|
123
93
|
{
|
|
124
|
-
title: "
|
|
125
|
-
url: "/
|
|
94
|
+
title: "Electronic",
|
|
95
|
+
url: "/discover/artists/electronic",
|
|
126
96
|
isClickable: true,
|
|
127
97
|
},
|
|
128
98
|
{
|
|
129
|
-
title: "
|
|
130
|
-
url: "/
|
|
99
|
+
title: "United Kingdom",
|
|
100
|
+
url: "/discover/artists/electronic/uk",
|
|
131
101
|
isClickable: true,
|
|
132
102
|
},
|
|
133
103
|
{
|
|
134
|
-
title: "
|
|
135
|
-
url: "/
|
|
104
|
+
title: "Bicep",
|
|
105
|
+
url: "/discover/artists/electronic/uk/bicep",
|
|
136
106
|
isClickable: true,
|
|
137
107
|
},
|
|
138
|
-
{
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
args: {
|
|
143
|
-
items: sampleItems,
|
|
144
|
-
size: "md",
|
|
145
|
-
separator: "chevron",
|
|
108
|
+
{
|
|
109
|
+
title: "Studio Albums",
|
|
110
|
+
url: "/discover/artists/electronic/uk/bicep/albums",
|
|
111
|
+
isClickable: true,
|
|
146
112
|
},
|
|
147
|
-
}
|
|
113
|
+
{ title: "Isles" },
|
|
114
|
+
]
|
|
148
115
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
items: sampleItems,
|
|
152
|
-
separator: "slash",
|
|
153
|
-
},
|
|
116
|
+
function StoryLabel({ children }: React.PropsWithChildren) {
|
|
117
|
+
return <p className={itemLabelClass}>{children}</p>
|
|
154
118
|
}
|
|
155
119
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
120
|
+
function BreadcrumbCard({
|
|
121
|
+
children,
|
|
122
|
+
align = "center",
|
|
123
|
+
}: React.PropsWithChildren<{ align?: "center" | "start" }>) {
|
|
124
|
+
return (
|
|
125
|
+
<div className={cardClass}>
|
|
126
|
+
<div className="overflow-x-auto pb-1">
|
|
127
|
+
<div
|
|
128
|
+
className={
|
|
129
|
+
align === "start"
|
|
130
|
+
? "flex min-w-max items-center"
|
|
131
|
+
: "flex min-w-max items-center justify-center"
|
|
132
|
+
}
|
|
133
|
+
>
|
|
134
|
+
{children}
|
|
135
|
+
</div>
|
|
136
|
+
</div>
|
|
137
|
+
</div>
|
|
138
|
+
)
|
|
161
139
|
}
|
|
162
140
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
141
|
+
function BreadcrumbItemCard({
|
|
142
|
+
label,
|
|
143
|
+
children,
|
|
144
|
+
}: React.PropsWithChildren<{ label: string }>) {
|
|
145
|
+
return (
|
|
146
|
+
<div className="space-y-2 text-center">
|
|
147
|
+
<BreadcrumbCard>{children}</BreadcrumbCard>
|
|
148
|
+
<StoryLabel>{label}</StoryLabel>
|
|
149
|
+
</div>
|
|
150
|
+
)
|
|
168
151
|
}
|
|
169
152
|
|
|
170
|
-
export const
|
|
153
|
+
export const Playground: Story = {
|
|
171
154
|
args: {
|
|
172
|
-
items:
|
|
173
|
-
size: "
|
|
155
|
+
items: musicItems,
|
|
156
|
+
size: "md",
|
|
157
|
+
separator: "chevron",
|
|
158
|
+
showHome: false,
|
|
174
159
|
},
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
160
|
+
render: (args) => (
|
|
161
|
+
<div className="w-full max-w-2xl space-y-4">
|
|
162
|
+
<BreadcrumbCard>
|
|
163
|
+
<Breadcrumb {...args} />
|
|
164
|
+
</BreadcrumbCard>
|
|
165
|
+
<div className={codeBlockClass}>
|
|
166
|
+
<code className={codeClass}>
|
|
167
|
+
{`<Breadcrumb size="${args.size}" separator="${args.separator}" showHome={${args.showHome}} />`}
|
|
168
|
+
</code>
|
|
169
|
+
</div>
|
|
170
|
+
</div>
|
|
171
|
+
),
|
|
172
|
+
parameters: {
|
|
173
|
+
docs: {
|
|
174
|
+
description: {
|
|
175
|
+
story:
|
|
176
|
+
"Controls-driven playground. Use the Storybook sidebar to change size, separator, showHome, and maxItems and see live results alongside the generated code snippet.",
|
|
177
|
+
},
|
|
178
|
+
},
|
|
181
179
|
},
|
|
182
180
|
}
|
|
183
181
|
|
|
184
|
-
export const
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
182
|
+
export const Configurations: Story = {
|
|
183
|
+
render: () => (
|
|
184
|
+
<div className="space-y-8">
|
|
185
|
+
<div className="space-y-4">
|
|
186
|
+
<h4 className={subsectionHeaderClass}>Separator Types</h4>
|
|
187
|
+
<div className="grid gap-4 md:grid-cols-2">
|
|
188
|
+
<BreadcrumbItemCard label="Chevron (default)">
|
|
189
|
+
<Breadcrumb items={musicItems} separator="chevron" />
|
|
190
|
+
</BreadcrumbItemCard>
|
|
191
|
+
<BreadcrumbItemCard label="Slash">
|
|
192
|
+
<Breadcrumb items={musicItems} separator="slash" />
|
|
193
|
+
</BreadcrumbItemCard>
|
|
194
|
+
<BreadcrumbItemCard label="Arrow">
|
|
195
|
+
<Breadcrumb items={musicItems} separator="arrow" />
|
|
196
|
+
</BreadcrumbItemCard>
|
|
197
|
+
<BreadcrumbItemCard label="Custom icon">
|
|
198
|
+
<Breadcrumb
|
|
199
|
+
items={musicItems}
|
|
200
|
+
customSeparator={
|
|
201
|
+
<ChevronDoubleRightIcon width={14} height={14} />
|
|
202
|
+
}
|
|
203
|
+
/>
|
|
204
|
+
</BreadcrumbItemCard>
|
|
205
|
+
<BreadcrumbItemCard label="Custom text">
|
|
206
|
+
<Breadcrumb items={musicItems} customSeparator="·" />
|
|
207
|
+
</BreadcrumbItemCard>
|
|
208
|
+
</div>
|
|
209
|
+
</div>
|
|
196
210
|
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
211
|
+
<div className="space-y-4">
|
|
212
|
+
<h4 className={subsectionHeaderClass}>Show Home Prefix</h4>
|
|
213
|
+
<div className="grid gap-4 md:grid-cols-2">
|
|
214
|
+
<BreadcrumbItemCard label="showHome: false">
|
|
215
|
+
<Breadcrumb
|
|
216
|
+
items={[
|
|
217
|
+
{ title: "Artists", url: "/artists", isClickable: true },
|
|
218
|
+
{ title: "Bicep" },
|
|
219
|
+
]}
|
|
220
|
+
/>
|
|
221
|
+
</BreadcrumbItemCard>
|
|
222
|
+
<BreadcrumbItemCard label="showHome: true">
|
|
223
|
+
<Breadcrumb
|
|
224
|
+
items={[
|
|
225
|
+
{ title: "Artists", url: "/artists", isClickable: true },
|
|
226
|
+
{ title: "Bicep" },
|
|
227
|
+
]}
|
|
228
|
+
showHome
|
|
229
|
+
homeTitle="Home"
|
|
230
|
+
homeUrl="/"
|
|
231
|
+
/>
|
|
232
|
+
</BreadcrumbItemCard>
|
|
233
|
+
</div>
|
|
234
|
+
</div>
|
|
203
235
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
236
|
+
<div className="space-y-4">
|
|
237
|
+
<h4 className={subsectionHeaderClass}>maxItems Truncation</h4>
|
|
238
|
+
<div className="grid gap-4">
|
|
239
|
+
<BreadcrumbItemCard label="All items (no limit)">
|
|
240
|
+
<Breadcrumb items={longMusicItems} />
|
|
241
|
+
</BreadcrumbItemCard>
|
|
242
|
+
<BreadcrumbItemCard label="maxItems: 4 (ellipsis middle)">
|
|
243
|
+
<Breadcrumb items={longMusicItems} maxItems={4} />
|
|
244
|
+
</BreadcrumbItemCard>
|
|
245
|
+
<BreadcrumbItemCard label="maxItems: 2 (first + last only)">
|
|
246
|
+
<Breadcrumb items={longMusicItems} maxItems={2} />
|
|
247
|
+
</BreadcrumbItemCard>
|
|
248
|
+
</div>
|
|
249
|
+
</div>
|
|
214
250
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
251
|
+
<div className="space-y-4">
|
|
252
|
+
<h4 className={subsectionHeaderClass}>
|
|
253
|
+
Clickable vs Non-Clickable Items
|
|
254
|
+
</h4>
|
|
255
|
+
<div className="grid gap-4 md:grid-cols-2">
|
|
256
|
+
<BreadcrumbItemCard label="Clickable ancestors, static current page">
|
|
257
|
+
<Breadcrumb
|
|
258
|
+
items={[
|
|
259
|
+
{ title: "Discover", url: "/discover", isClickable: true },
|
|
260
|
+
{ title: "Artists", url: "/artists", isClickable: true },
|
|
261
|
+
{ title: "Bicep" },
|
|
262
|
+
]}
|
|
263
|
+
/>
|
|
264
|
+
</BreadcrumbItemCard>
|
|
265
|
+
<BreadcrumbItemCard label="All non-clickable">
|
|
266
|
+
<Breadcrumb
|
|
267
|
+
items={[
|
|
268
|
+
{ title: "Discover", isClickable: false },
|
|
269
|
+
{ title: "Artists", isClickable: false },
|
|
270
|
+
{ title: "Bicep" },
|
|
271
|
+
]}
|
|
272
|
+
/>
|
|
273
|
+
</BreadcrumbItemCard>
|
|
274
|
+
</div>
|
|
275
|
+
</div>
|
|
276
|
+
</div>
|
|
277
|
+
),
|
|
278
|
+
parameters: {
|
|
279
|
+
docs: {
|
|
280
|
+
description: {
|
|
281
|
+
story:
|
|
282
|
+
"Comparison of all configuration axes: separator types (chevron, slash, arrow, custom), showHome toggle, maxItems truncation levels, and clickable versus static items.",
|
|
283
|
+
},
|
|
284
|
+
},
|
|
223
285
|
},
|
|
224
286
|
}
|
|
225
287
|
|
|
226
|
-
export const
|
|
288
|
+
export const Sizes: Story = {
|
|
227
289
|
render: () => (
|
|
228
|
-
<div className="
|
|
290
|
+
<div className="space-y-8">
|
|
291
|
+
<div className="flex flex-wrap items-end justify-center gap-6">
|
|
292
|
+
<BreadcrumbItemCard label="Small (sm)">
|
|
293
|
+
<Breadcrumb
|
|
294
|
+
items={[
|
|
295
|
+
{ title: "Discover", url: "/discover", isClickable: true },
|
|
296
|
+
{ title: "Artists", url: "/artists", isClickable: true },
|
|
297
|
+
{ title: "Bicep" },
|
|
298
|
+
]}
|
|
299
|
+
size="sm"
|
|
300
|
+
/>
|
|
301
|
+
</BreadcrumbItemCard>
|
|
302
|
+
<BreadcrumbItemCard label="Medium (md · default)">
|
|
303
|
+
<Breadcrumb
|
|
304
|
+
items={[
|
|
305
|
+
{ title: "Discover", url: "/discover", isClickable: true },
|
|
306
|
+
{ title: "Artists", url: "/artists", isClickable: true },
|
|
307
|
+
{ title: "Bicep" },
|
|
308
|
+
]}
|
|
309
|
+
size="md"
|
|
310
|
+
/>
|
|
311
|
+
</BreadcrumbItemCard>
|
|
312
|
+
<BreadcrumbItemCard label="Large (lg)">
|
|
313
|
+
<Breadcrumb
|
|
314
|
+
items={[
|
|
315
|
+
{ title: "Discover", url: "/discover", isClickable: true },
|
|
316
|
+
{ title: "Artists", url: "/artists", isClickable: true },
|
|
317
|
+
{ title: "Bicep" },
|
|
318
|
+
]}
|
|
319
|
+
size="lg"
|
|
320
|
+
/>
|
|
321
|
+
</BreadcrumbItemCard>
|
|
322
|
+
</div>
|
|
323
|
+
|
|
229
324
|
<div className="space-y-4">
|
|
230
|
-
<
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
325
|
+
<h4 className={subsectionHeaderClass}>Size × Separator</h4>
|
|
326
|
+
<div className="grid gap-4">
|
|
327
|
+
{(["sm", "md", "lg"] as const).map((size) => (
|
|
328
|
+
<BreadcrumbItemCard key={size} label={`${size} · slash`}>
|
|
329
|
+
<Breadcrumb items={musicItems} size={size} separator="slash" />
|
|
330
|
+
</BreadcrumbItemCard>
|
|
331
|
+
))}
|
|
237
332
|
</div>
|
|
238
333
|
</div>
|
|
334
|
+
</div>
|
|
335
|
+
),
|
|
336
|
+
parameters: {
|
|
337
|
+
docs: {
|
|
338
|
+
description: {
|
|
339
|
+
story:
|
|
340
|
+
"Three size variants (sm, md, lg) shown side by side with a size × separator cross-axis comparison.",
|
|
341
|
+
},
|
|
342
|
+
},
|
|
343
|
+
},
|
|
344
|
+
}
|
|
239
345
|
|
|
346
|
+
export const UseCases: Story = {
|
|
347
|
+
render: () => (
|
|
348
|
+
<div className="mx-auto max-w-3xl space-y-8 p-8">
|
|
240
349
|
<div className="space-y-4">
|
|
241
|
-
<
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
350
|
+
<h4 className={subsectionHeaderClass}>Music Library Navigation</h4>
|
|
351
|
+
<div className="border-fm-divider-secondary mx-auto max-w-2xl space-y-4 rounded-xl border bg-transparent p-5">
|
|
352
|
+
<div className="overflow-x-auto pb-1">
|
|
353
|
+
<div className="min-w-max">
|
|
354
|
+
<Breadcrumb
|
|
355
|
+
items={[
|
|
356
|
+
{ title: "Library", url: "/library", isClickable: true },
|
|
357
|
+
{
|
|
358
|
+
title: "Albums",
|
|
359
|
+
url: "/library/albums",
|
|
360
|
+
isClickable: true,
|
|
361
|
+
},
|
|
362
|
+
{
|
|
363
|
+
title: "Electronic",
|
|
364
|
+
url: "/library/albums/electronic",
|
|
365
|
+
isClickable: true,
|
|
366
|
+
},
|
|
367
|
+
{ title: "Isles" },
|
|
368
|
+
]}
|
|
369
|
+
showHome
|
|
370
|
+
homeTitle="Home"
|
|
371
|
+
homeUrl="/"
|
|
372
|
+
separator="chevron"
|
|
373
|
+
size="sm"
|
|
374
|
+
/>
|
|
375
|
+
</div>
|
|
376
|
+
</div>
|
|
377
|
+
<div className="bg-fm-surface-tertiary h-32 rounded-lg" />
|
|
378
|
+
<p className="text-fm-primary font-fm-brand text-fm-lg leading-fm-lg font-semibold">
|
|
379
|
+
Isles
|
|
380
|
+
</p>
|
|
381
|
+
<p className={itemLabelClass}>Bicep · 2021 · 12 tracks</p>
|
|
257
382
|
</div>
|
|
258
383
|
</div>
|
|
259
384
|
|
|
260
385
|
<div className="space-y-4">
|
|
261
|
-
<
|
|
262
|
-
<
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
386
|
+
<h4 className={subsectionHeaderClass}>Settings Page Context</h4>
|
|
387
|
+
<div className="border-fm-divider-secondary mx-auto max-w-2xl rounded-xl border bg-transparent">
|
|
388
|
+
<div className="border-fm-divider-secondary overflow-x-auto border-b px-5 py-3">
|
|
389
|
+
<div className="min-w-max">
|
|
390
|
+
<Breadcrumb
|
|
391
|
+
items={[
|
|
392
|
+
{ title: "Account", url: "/account", isClickable: true },
|
|
393
|
+
{
|
|
394
|
+
title: "Preferences",
|
|
395
|
+
url: "/account/preferences",
|
|
396
|
+
isClickable: true,
|
|
397
|
+
},
|
|
398
|
+
{ title: "Audio Quality" },
|
|
399
|
+
]}
|
|
400
|
+
separator="slash"
|
|
401
|
+
size="sm"
|
|
402
|
+
/>
|
|
403
|
+
</div>
|
|
404
|
+
</div>
|
|
405
|
+
<div className="space-y-3 p-5">
|
|
406
|
+
<p className="text-fm-primary font-fm-brand text-fm-md leading-fm-md font-semibold">
|
|
407
|
+
Audio Quality Settings
|
|
408
|
+
</p>
|
|
409
|
+
<p className={itemLabelClass}>
|
|
410
|
+
Choose your preferred streaming and download quality.
|
|
411
|
+
</p>
|
|
412
|
+
</div>
|
|
413
|
+
</div>
|
|
269
414
|
</div>
|
|
270
415
|
|
|
271
416
|
<div className="space-y-4">
|
|
272
|
-
<
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
417
|
+
<h4 className={subsectionHeaderClass}>Deep Path with Truncation</h4>
|
|
418
|
+
<div className="border-fm-divider-secondary mx-auto max-w-2xl space-y-3 rounded-xl border bg-transparent p-5">
|
|
419
|
+
<div className="overflow-x-auto pb-1">
|
|
420
|
+
<div className="min-w-max">
|
|
421
|
+
<Breadcrumb
|
|
422
|
+
items={longMusicItems}
|
|
423
|
+
maxItems={4}
|
|
424
|
+
separator="arrow"
|
|
425
|
+
size="md"
|
|
426
|
+
/>
|
|
427
|
+
</div>
|
|
428
|
+
</div>
|
|
429
|
+
<p className="text-fm-tertiary font-fm-text text-fm-sm leading-fm-sm">
|
|
430
|
+
Deep paths collapse automatically so the current location stays easy
|
|
431
|
+
to scan.
|
|
432
|
+
</p>
|
|
433
|
+
</div>
|
|
276
434
|
</div>
|
|
277
435
|
</div>
|
|
278
436
|
),
|
|
437
|
+
parameters: {
|
|
438
|
+
layout: "fullscreen",
|
|
439
|
+
docs: {
|
|
440
|
+
description: {
|
|
441
|
+
story:
|
|
442
|
+
"Real product-shaped examples: music library album navigation with home prefix, a settings page context bar, and a deep path using maxItems truncation.",
|
|
443
|
+
},
|
|
444
|
+
},
|
|
445
|
+
},
|
|
279
446
|
}
|
|
280
447
|
|
|
281
448
|
export const Interactive: Story = {
|
|
282
449
|
render: () => {
|
|
283
|
-
const
|
|
450
|
+
const pathTree = [
|
|
451
|
+
{ title: "Discover", url: "/discover" },
|
|
452
|
+
{ title: "Artists", url: "/discover/artists" },
|
|
453
|
+
{ title: "Electronic", url: "/discover/artists/electronic" },
|
|
454
|
+
{ title: "Bicep", url: "/discover/artists/electronic/bicep" },
|
|
455
|
+
{ title: "Isles", url: "/discover/artists/electronic/bicep/isles" },
|
|
456
|
+
]
|
|
284
457
|
|
|
285
|
-
const
|
|
286
|
-
|
|
287
|
-
|
|
458
|
+
const [activePath, setActivePath] = React.useState<string[]>([
|
|
459
|
+
"Discover",
|
|
460
|
+
"Artists",
|
|
461
|
+
"Electronic",
|
|
462
|
+
"Bicep",
|
|
463
|
+
"Isles",
|
|
464
|
+
])
|
|
465
|
+
|
|
466
|
+
const handleItemClick = (title: string) => {
|
|
467
|
+
const nextIndex = pathTree.findIndex((node) => node.title === title)
|
|
468
|
+
|
|
469
|
+
if (nextIndex >= 0) {
|
|
470
|
+
setActivePath(
|
|
471
|
+
pathTree.slice(0, nextIndex + 1).map((node) => node.title)
|
|
472
|
+
)
|
|
473
|
+
}
|
|
288
474
|
}
|
|
289
475
|
|
|
476
|
+
const breadcrumbItems = activePath.map((title, index) => ({
|
|
477
|
+
title,
|
|
478
|
+
url: pathTree.find((node) => node.title === title)?.url,
|
|
479
|
+
isClickable: index < activePath.length - 1,
|
|
480
|
+
}))
|
|
481
|
+
|
|
290
482
|
return (
|
|
291
|
-
<div className="
|
|
292
|
-
<
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
483
|
+
<div className="w-full p-8">
|
|
484
|
+
<div className="mx-auto max-w-4xl space-y-6">
|
|
485
|
+
<div className="grid grid-cols-1 gap-6 lg:grid-cols-3">
|
|
486
|
+
<div className="border-fm-divider-secondary space-y-5 rounded-xl border bg-transparent p-5">
|
|
487
|
+
<p className="text-fm-primary font-fm-brand text-fm-sm leading-fm-sm font-semibold tracking-widest uppercase">
|
|
488
|
+
Navigate To
|
|
489
|
+
</p>
|
|
490
|
+
<div className="space-y-2">
|
|
491
|
+
{pathTree.map((node) => {
|
|
492
|
+
const isCurrent =
|
|
493
|
+
activePath[activePath.length - 1] === node.title
|
|
494
|
+
const isVisited = activePath.includes(node.title)
|
|
495
|
+
|
|
496
|
+
return (
|
|
497
|
+
<button
|
|
498
|
+
key={node.title}
|
|
499
|
+
onClick={() => handleItemClick(node.title)}
|
|
500
|
+
className={[
|
|
501
|
+
"border-fm-divider-secondary w-full rounded-lg border px-3 py-2 text-left transition-colors",
|
|
502
|
+
"text-fm-sm leading-fm-sm",
|
|
503
|
+
isCurrent
|
|
504
|
+
? "bg-fm-surface-tertiary text-fm-primary font-medium"
|
|
505
|
+
: isVisited
|
|
506
|
+
? "bg-fm-surface-secondary text-fm-primary"
|
|
507
|
+
: "bg-fm-surface-primary text-fm-secondary hover:bg-fm-surface-tertiary",
|
|
508
|
+
].join(" ")}
|
|
509
|
+
>
|
|
510
|
+
{node.title}
|
|
511
|
+
</button>
|
|
512
|
+
)
|
|
513
|
+
})}
|
|
514
|
+
</div>
|
|
515
|
+
</div>
|
|
516
|
+
|
|
517
|
+
<div className="flex flex-col gap-3 lg:col-span-2">
|
|
518
|
+
<div className="border-fm-divider-secondary rounded-xl border bg-transparent p-6">
|
|
519
|
+
<div className="overflow-x-auto pb-1">
|
|
520
|
+
<div className="min-w-max">
|
|
521
|
+
<Breadcrumb
|
|
522
|
+
items={breadcrumbItems}
|
|
523
|
+
onItemClick={handleItemClick}
|
|
524
|
+
size="md"
|
|
525
|
+
separator="chevron"
|
|
526
|
+
/>
|
|
527
|
+
</div>
|
|
528
|
+
</div>
|
|
529
|
+
</div>
|
|
530
|
+
<div className={codeBlockClass}>
|
|
531
|
+
<code className={`${codeClass} break-all`}>
|
|
532
|
+
{`Current: ${activePath.join(" › ")}`}
|
|
533
|
+
</code>
|
|
534
|
+
</div>
|
|
535
|
+
<div className="border-fm-divider-secondary bg-fm-surface-secondary rounded-lg border p-4">
|
|
536
|
+
<p className="text-fm-secondary font-fm-text text-fm-md leading-fm-xl">
|
|
537
|
+
Click any breadcrumb item or jump directly from the left panel
|
|
538
|
+
to simulate moving back through the hierarchy.
|
|
539
|
+
</p>
|
|
540
|
+
</div>
|
|
541
|
+
</div>
|
|
542
|
+
</div>
|
|
298
543
|
</div>
|
|
299
544
|
</div>
|
|
300
545
|
)
|
|
301
546
|
},
|
|
547
|
+
parameters: {
|
|
548
|
+
layout: "fullscreen",
|
|
549
|
+
docs: {
|
|
550
|
+
description: {
|
|
551
|
+
story:
|
|
552
|
+
"Live navigation simulation using useState. Click any breadcrumb item or a node in the panel to travel to that depth; the trail updates immediately to show the new active path.",
|
|
553
|
+
},
|
|
554
|
+
},
|
|
555
|
+
},
|
|
302
556
|
}
|