@wakastellar/ui 2.3.5 → 2.4.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/dist/stories/Button.d.ts +14 -0
- package/dist/stories/Button.stories.d.ts +8 -0
- package/dist/stories/Header.d.ts +11 -0
- package/dist/stories/Header.stories.d.ts +6 -0
- package/dist/stories/Page.d.ts +2 -0
- package/dist/stories/Page.stories.d.ts +6 -0
- package/package.json +11 -3
- package/src/blocks/activity-timeline/ActivityTimeline.stories.tsx +460 -0
- package/src/blocks/apm-overview/APMOverview.stories.tsx +435 -0
- package/src/blocks/auth-2fa/Auth2FA.stories.tsx +308 -0
- package/src/blocks/calendar-view/CalendarView.stories.tsx +398 -0
- package/src/blocks/chat/Chat.stories.tsx +466 -0
- package/src/blocks/chat-interface/ChatInterface.stories.tsx +412 -0
- package/src/blocks/checkout-flow/CheckoutFlow.stories.tsx +408 -0
- package/src/blocks/cicd-builder/CICDBuilder.stories.tsx +499 -0
- package/src/blocks/cloud-cost-dashboard/CloudCostDashboard.stories.tsx +356 -0
- package/src/blocks/container-orchestrator/ContainerOrchestrator.stories.tsx +461 -0
- package/src/blocks/dashboard/Dashboard.stories.tsx +559 -0
- package/src/blocks/dashboard-kpi/DashboardKPI.stories.tsx +422 -0
- package/src/blocks/database-admin/DatabaseAdmin.stories.tsx +393 -0
- package/src/blocks/deployment-dashboard/DeploymentDashboard.stories.tsx +457 -0
- package/src/blocks/empty-states/EmptyStates.stories.tsx +467 -0
- package/src/blocks/error-pages/ErrorPages.stories.tsx +401 -0
- package/src/blocks/faq/FAQ.stories.tsx +416 -0
- package/src/blocks/file-manager/FileManager.stories.tsx +413 -0
- package/src/blocks/footer/Footer.stories.tsx +328 -0
- package/src/blocks/gitops-sync-status/GitOpsSyncStatus.stories.tsx +529 -0
- package/src/blocks/header/WakaHeader.stories.tsx +455 -0
- package/src/blocks/headtab/Headtab.stories.tsx +369 -0
- package/src/blocks/i18n-editor/I18nEditor.stories.tsx +451 -0
- package/src/blocks/incident-manager/IncidentManager.stories.tsx +464 -0
- package/src/blocks/infrastructure-map/InfrastructureMap.stories.tsx +533 -0
- package/src/blocks/kanban-board/KanbanBoard.stories.tsx +494 -0
- package/src/blocks/landing/WakaLanding.stories.tsx +449 -0
- package/src/blocks/language-selector/LanguageSelector.stories.tsx +345 -0
- package/src/blocks/layout/Layout.stories.tsx +373 -0
- package/src/blocks/login/Login.stories.tsx +443 -0
- package/src/blocks/on-call-schedule/OnCallSchedule.stories.tsx +381 -0
- package/src/blocks/player-profile/PlayerProfile.stories.tsx +316 -0
- package/src/blocks/pricing/WakaPricing.stories.tsx +530 -0
- package/src/blocks/profile/Profile.stories.tsx +371 -0
- package/src/blocks/release-notes/ReleaseNotes.stories.tsx +431 -0
- package/src/blocks/settings/Settings.stories.tsx +520 -0
- package/src/blocks/sidebar/WakaSidebar.stories.tsx +513 -0
- package/src/blocks/theme-creator-block/ThemeCreatorBlock.stories.tsx +370 -0
- package/src/blocks/user-management/UserManagement.stories.tsx +411 -0
- package/src/blocks/wizard/Wizard.stories.tsx +683 -0
- package/src/components/accordion/Accordion.stories.tsx +93 -0
- package/src/components/alert/Alert.stories.tsx +95 -0
- package/src/components/alert-dialog/AlertDialog.stories.tsx +126 -0
- package/src/components/aspect-ratio/AspectRatio.stories.tsx +118 -0
- package/src/components/avatar/Avatar.stories.tsx +104 -0
- package/src/components/button/Button.stories.tsx +12 -1
- package/src/components/calendar/Calendar.stories.tsx +102 -0
- package/src/components/card/Card.stories.tsx +125 -0
- package/src/components/checkbox/Checkbox.stories.tsx +100 -0
- package/src/components/code/Code.stories.tsx +402 -0
- package/src/components/collapsible/Collapsible.stories.tsx +123 -0
- package/src/components/command/Command.stories.tsx +207 -0
- package/src/components/context-menu/ContextMenu.stories.tsx +220 -0
- package/src/components/dialog/Dialog.stories.tsx +157 -0
- package/src/components/dropdown-menu/DropdownMenu.stories.tsx +225 -0
- package/src/components/form/Form.stories.tsx +413 -0
- package/src/components/hover-card/HoverCard.stories.tsx +148 -0
- package/src/components/input-otp/InputOTP.stories.tsx +255 -0
- package/src/components/label/Label.stories.tsx +68 -0
- package/src/components/menubar/Menubar.stories.tsx +278 -0
- package/src/components/navigation-menu/NavigationMenu.stories.tsx +202 -0
- package/src/components/popover/Popover.stories.tsx +199 -0
- package/src/components/progress/Progress.stories.tsx +104 -0
- package/src/components/radio-group/RadioGroup.stories.tsx +138 -0
- package/src/components/scroll-area/ScrollArea.stories.tsx +153 -0
- package/src/components/select/Select.stories.tsx +146 -0
- package/src/components/separator/Separator.stories.tsx +117 -0
- package/src/components/sheet/Sheet.stories.tsx +195 -0
- package/src/components/skeleton/Skeleton.stories.tsx +114 -0
- package/src/components/slider/Slider.stories.tsx +157 -0
- package/src/components/switch/Switch.stories.tsx +114 -0
- package/src/components/table/Table.stories.tsx +153 -0
- package/src/components/tabs/Tabs.stories.tsx +155 -0
- package/src/components/textarea/Textarea.stories.tsx +116 -0
- package/src/components/toast/Toast.stories.tsx +160 -0
- package/src/components/toggle/Toggle.stories.tsx +125 -0
- package/src/components/tooltip/Tooltip.stories.tsx +133 -0
- package/src/components/typography/Typography.stories.tsx +207 -0
- package/src/components/waka-3d-pie-chart/Waka3DPieChart.stories.tsx +308 -0
- package/src/components/waka-achievement-unlock/WakaAchievementUnlock.stories.tsx +353 -0
- package/src/components/waka-artifact-list/WakaArtifactList.stories.tsx +258 -0
- package/src/components/waka-autocomplete/WakaAutocomplete.stories.tsx +224 -0
- package/src/components/waka-badge-showcase/WakaBadgeShowcase.stories.tsx +269 -0
- package/src/components/waka-barcode/WakaBarcode.stories.tsx +227 -0
- package/src/components/waka-bottom-sheet/WakaBottomSheet.stories.tsx +408 -0
- package/src/components/waka-breadcrumb/WakaBreadcrumb.stories.tsx +237 -0
- package/src/components/waka-build-matrix/WakaBuildMatrix.stories.tsx +328 -0
- package/src/components/waka-carousel/WakaCarousel.stories.tsx +296 -0
- package/src/components/waka-charts/WakaCharts.stories.tsx +519 -0
- package/src/components/waka-color-picker/WakaColorPicker.stories.tsx +200 -0
- package/src/components/waka-combobox/WakaCombobox.stories.tsx +250 -0
- package/src/components/waka-container-list/WakaContainerList.stories.tsx +315 -0
- package/src/components/waka-contribution-graph/WakaContributionGraph.stories.tsx +354 -0
- package/src/components/waka-cost-breakdown/WakaCostBreakdown.stories.tsx +348 -0
- package/src/components/waka-daily-reward/WakaDailyReward.stories.tsx +365 -0
- package/src/components/waka-database-card/WakaDatabaseCard.stories.tsx +306 -0
- package/src/components/waka-date-range-picker/WakaDateRangePicker.stories.tsx +339 -0
- package/src/components/waka-datetime-picker/WakaDateTimePicker.stories.tsx +317 -0
- package/src/components/waka-deployment-lane/WakaDeploymentLane.stories.tsx +292 -0
- package/src/components/waka-dock/WakaDock.stories.tsx +332 -0
- package/src/components/waka-drawer/WakaDrawer.stories.tsx +437 -0
- package/src/components/waka-env-var-editor/WakaEnvVarEditor.stories.tsx +263 -0
- package/src/components/waka-error-shake/WakaErrorShake.stories.tsx +410 -0
- package/src/components/waka-file-upload/WakaFileUpload.stories.tsx +239 -0
- package/src/components/waka-flow-diagram/WakaFlowDiagram.stories.tsx +365 -0
- package/src/components/waka-funnel-chart/WakaFunnelChart.stories.tsx +281 -0
- package/src/components/waka-glow-card/WakaGlowCard.stories.tsx +274 -0
- package/src/components/waka-haptic-button/WakaHapticButton.stories.tsx +349 -0
- package/src/components/waka-health-pulse/WakaHealthPulse.stories.tsx +293 -0
- package/src/components/waka-heatmap/WakaHeatmap.stories.tsx +376 -0
- package/src/components/waka-image/WakaImage.stories.tsx +255 -0
- package/src/components/waka-incident-timeline/WakaIncidentTimeline.stories.tsx +300 -0
- package/src/components/waka-kanban/WakaKanban.stories.tsx +399 -0
- package/src/components/waka-kubernetes-overview/WakaKubernetesOverview.stories.tsx +281 -0
- package/src/components/waka-leaderboard/WakaLeaderboard.stories.tsx +300 -0
- package/src/components/waka-level-progress/WakaLevelProgress.stories.tsx +313 -0
- package/src/components/waka-loading-orbit/WakaLoadingOrbit.stories.tsx +413 -0
- package/src/components/waka-log-viewer/WakaLogViewer.stories.tsx +312 -0
- package/src/components/waka-loot-box/WakaLootBox.stories.tsx +374 -0
- package/src/components/waka-metric-sparkline/WakaMetricSparkline.stories.tsx +312 -0
- package/src/components/waka-migration-list/WakaMigrationList.stories.tsx +289 -0
- package/src/components/waka-modal/WakaModal.stories.tsx +434 -0
- package/src/components/waka-morph-button/WakaMorphButton.stories.tsx +405 -0
- package/src/components/waka-network-topology/WakaNetworkTopology.stories.tsx +364 -0
- package/src/components/waka-notifications/WakaNotifications.stories.tsx +290 -0
- package/src/components/waka-number-input/WakaNumberInput.stories.tsx +282 -0
- package/src/components/waka-pagination/WakaPagination.stories.tsx +328 -0
- package/src/components/waka-password-strength/WakaPasswordStrength.stories.tsx +318 -0
- package/src/components/waka-pipeline-view/WakaPipelineView.stories.tsx +386 -0
- package/src/components/waka-player-card/WakaPlayerCard.stories.tsx +333 -0
- package/src/components/waka-pod-card/WakaPodCard.stories.tsx +435 -0
- package/src/components/waka-qrcode/WakaQRCode.stories.tsx +232 -0
- package/src/components/waka-query-explain/WakaQueryExplain.stories.tsx +407 -0
- package/src/components/waka-quest-card/WakaQuestCard.stories.tsx +394 -0
- package/src/components/waka-quota-bar/WakaQuotaBar.stories.tsx +435 -0
- package/src/components/waka-radar-score/WakaRadarScore.stories.tsx +372 -0
- package/src/components/waka-resource-gauge/WakaResourceGauge.stories.tsx +366 -0
- package/src/components/waka-rich-text-editor/WakaRichTextEditor.stories.tsx +238 -0
- package/src/components/waka-sankey-diagram/WakaSankeyDiagram.stories.tsx +389 -0
- package/src/components/waka-scratch-card/WakaScratchCard.stories.tsx +388 -0
- package/src/components/waka-secret-card/WakaSecretCard.stories.tsx +314 -0
- package/src/components/waka-segmented-control/WakaSegmentedControl.stories.tsx +309 -0
- package/src/components/waka-server-rack/WakaServerRack.stories.tsx +382 -0
- package/src/components/waka-service-graph/WakaServiceGraph.stories.tsx +262 -0
- package/src/components/waka-skeleton-wave/WakaSkeletonWave.stories.tsx +321 -0
- package/src/components/waka-skill-tree/WakaSkillTree.stories.tsx +308 -0
- package/src/components/waka-spin-wheel/WakaSpinWheel.stories.tsx +368 -0
- package/src/components/waka-spinner/WakaSpinner.stories.tsx +156 -0
- package/src/components/waka-stat/WakaStat.stories.tsx +334 -0
- package/src/components/waka-status-matrix/WakaStatusMatrix.stories.tsx +331 -0
- package/src/components/waka-stepper/WakaStepper.stories.tsx +468 -0
- package/src/components/waka-streak-counter/WakaStreakCounter.stories.tsx +235 -0
- package/src/components/waka-success-explosion/WakaSuccessExplosion.stories.tsx +389 -0
- package/src/components/waka-tabs-morph/WakaTabsMorph.stories.tsx +471 -0
- package/src/components/waka-terminal-output/WakaTerminalOutput.stories.tsx +351 -0
- package/src/components/waka-test-report/WakaTestReport.stories.tsx +322 -0
- package/src/components/waka-tilt-card/WakaTiltCard.stories.tsx +300 -0
- package/src/components/waka-time-picker/WakaTimePicker.stories.tsx +227 -0
- package/src/components/waka-timeline/WakaTimeline.stories.tsx +383 -0
- package/src/components/waka-tournament-bracket/WakaTournamentBracket.stories.tsx +375 -0
- package/src/components/waka-trace-viewer/WakaTraceViewer.stories.tsx +445 -0
- package/src/components/waka-tree/WakaTree.stories.tsx +359 -0
- package/src/components/waka-treemap-chart/WakaTreemapChart.stories.tsx +378 -0
- package/src/components/waka-typewriter/WakaTypewriter.stories.tsx +366 -0
- package/src/components/waka-versus-card/WakaVersusCard.stories.tsx +530 -0
- package/src/components/waka-video/WakaVideo.stories.tsx +203 -0
- package/src/components/waka-virtual-list/WakaVirtualList.stories.tsx +273 -0
- package/src/components/waka-xp-bar/WakaXPBar.stories.tsx +305 -0
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react'
|
|
2
|
+
import { WakaBreadcrumb } from './index'
|
|
3
|
+
import type { BreadcrumbItem } from './index'
|
|
4
|
+
import * as React from 'react'
|
|
5
|
+
import { Home, Settings, User, FileText, Folder } from 'lucide-react'
|
|
6
|
+
|
|
7
|
+
const meta: Meta<typeof WakaBreadcrumb> = {
|
|
8
|
+
title: 'Components/Display/WakaBreadcrumb',
|
|
9
|
+
component: WakaBreadcrumb,
|
|
10
|
+
parameters: {
|
|
11
|
+
layout: 'centered',
|
|
12
|
+
docs: {
|
|
13
|
+
description: {
|
|
14
|
+
component: 'A breadcrumb navigation component for showing the current page location within a hierarchy.',
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
tags: ['autodocs'],
|
|
19
|
+
argTypes: {
|
|
20
|
+
size: {
|
|
21
|
+
control: 'select',
|
|
22
|
+
options: ['sm', 'md', 'lg'],
|
|
23
|
+
description: 'Size of the breadcrumb',
|
|
24
|
+
},
|
|
25
|
+
variant: {
|
|
26
|
+
control: 'select',
|
|
27
|
+
options: ['default', 'ghost', 'outline'],
|
|
28
|
+
description: 'Visual variant',
|
|
29
|
+
},
|
|
30
|
+
showHomeIcon: {
|
|
31
|
+
control: 'boolean',
|
|
32
|
+
description: 'Show home icon for first item',
|
|
33
|
+
},
|
|
34
|
+
maxItems: {
|
|
35
|
+
control: 'number',
|
|
36
|
+
description: 'Maximum visible items',
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export default meta
|
|
42
|
+
type Story = StoryObj<typeof WakaBreadcrumb>
|
|
43
|
+
|
|
44
|
+
const basicItems: BreadcrumbItem[] = [
|
|
45
|
+
{ label: 'Home', href: '/' },
|
|
46
|
+
{ label: 'Products', href: '/products' },
|
|
47
|
+
{ label: 'Electronics', href: '/products/electronics' },
|
|
48
|
+
{ label: 'Smartphones' },
|
|
49
|
+
]
|
|
50
|
+
|
|
51
|
+
export const Default: Story = {
|
|
52
|
+
args: {
|
|
53
|
+
items: basicItems,
|
|
54
|
+
},
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export const WithHomeIcon: Story = {
|
|
58
|
+
args: {
|
|
59
|
+
items: basicItems,
|
|
60
|
+
showHomeIcon: true,
|
|
61
|
+
},
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export const Sizes: Story = {
|
|
65
|
+
render: () => (
|
|
66
|
+
<div className="space-y-6">
|
|
67
|
+
<div>
|
|
68
|
+
<p className="text-sm text-muted-foreground mb-2">Small</p>
|
|
69
|
+
<WakaBreadcrumb items={basicItems} size="sm" />
|
|
70
|
+
</div>
|
|
71
|
+
<div>
|
|
72
|
+
<p className="text-sm text-muted-foreground mb-2">Medium (Default)</p>
|
|
73
|
+
<WakaBreadcrumb items={basicItems} size="md" />
|
|
74
|
+
</div>
|
|
75
|
+
<div>
|
|
76
|
+
<p className="text-sm text-muted-foreground mb-2">Large</p>
|
|
77
|
+
<WakaBreadcrumb items={basicItems} size="lg" />
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
),
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
export const Variants: Story = {
|
|
84
|
+
render: () => (
|
|
85
|
+
<div className="space-y-6">
|
|
86
|
+
<div>
|
|
87
|
+
<p className="text-sm text-muted-foreground mb-2">Default</p>
|
|
88
|
+
<WakaBreadcrumb items={basicItems} variant="default" />
|
|
89
|
+
</div>
|
|
90
|
+
<div>
|
|
91
|
+
<p className="text-sm text-muted-foreground mb-2">Ghost</p>
|
|
92
|
+
<WakaBreadcrumb items={basicItems} variant="ghost" />
|
|
93
|
+
</div>
|
|
94
|
+
<div>
|
|
95
|
+
<p className="text-sm text-muted-foreground mb-2">Outline</p>
|
|
96
|
+
<WakaBreadcrumb items={basicItems} variant="outline" />
|
|
97
|
+
</div>
|
|
98
|
+
</div>
|
|
99
|
+
),
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export const WithIcons: Story = {
|
|
103
|
+
render: () => {
|
|
104
|
+
const itemsWithIcons: BreadcrumbItem[] = [
|
|
105
|
+
{ label: 'Home', href: '/', icon: <Home className="h-4 w-4" /> },
|
|
106
|
+
{ label: 'Settings', href: '/settings', icon: <Settings className="h-4 w-4" /> },
|
|
107
|
+
{ label: 'Profile', href: '/settings/profile', icon: <User className="h-4 w-4" /> },
|
|
108
|
+
{ label: 'Edit', icon: <FileText className="h-4 w-4" /> },
|
|
109
|
+
]
|
|
110
|
+
|
|
111
|
+
return <WakaBreadcrumb items={itemsWithIcons} />
|
|
112
|
+
},
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export const Collapsed: Story = {
|
|
116
|
+
render: () => {
|
|
117
|
+
const longPath: BreadcrumbItem[] = [
|
|
118
|
+
{ label: 'Home', href: '/' },
|
|
119
|
+
{ label: 'Documents', href: '/documents' },
|
|
120
|
+
{ label: 'Work', href: '/documents/work' },
|
|
121
|
+
{ label: 'Projects', href: '/documents/work/projects' },
|
|
122
|
+
{ label: '2024', href: '/documents/work/projects/2024' },
|
|
123
|
+
{ label: 'Q1', href: '/documents/work/projects/2024/q1' },
|
|
124
|
+
{ label: 'Reports' },
|
|
125
|
+
]
|
|
126
|
+
|
|
127
|
+
return (
|
|
128
|
+
<div className="space-y-6">
|
|
129
|
+
<div>
|
|
130
|
+
<p className="text-sm text-muted-foreground mb-2">Max 4 items (collapsed)</p>
|
|
131
|
+
<WakaBreadcrumb items={longPath} maxItems={4} />
|
|
132
|
+
</div>
|
|
133
|
+
<div>
|
|
134
|
+
<p className="text-sm text-muted-foreground mb-2">All items visible</p>
|
|
135
|
+
<WakaBreadcrumb items={longPath} />
|
|
136
|
+
</div>
|
|
137
|
+
</div>
|
|
138
|
+
)
|
|
139
|
+
},
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export const CustomSeparator: Story = {
|
|
143
|
+
render: () => (
|
|
144
|
+
<div className="space-y-6">
|
|
145
|
+
<div>
|
|
146
|
+
<p className="text-sm text-muted-foreground mb-2">Slash separator</p>
|
|
147
|
+
<WakaBreadcrumb
|
|
148
|
+
items={basicItems}
|
|
149
|
+
separator={<span className="text-muted-foreground mx-2">/</span>}
|
|
150
|
+
/>
|
|
151
|
+
</div>
|
|
152
|
+
<div>
|
|
153
|
+
<p className="text-sm text-muted-foreground mb-2">Arrow separator</p>
|
|
154
|
+
<WakaBreadcrumb
|
|
155
|
+
items={basicItems}
|
|
156
|
+
separator={<span className="text-muted-foreground mx-2">→</span>}
|
|
157
|
+
/>
|
|
158
|
+
</div>
|
|
159
|
+
<div>
|
|
160
|
+
<p className="text-sm text-muted-foreground mb-2">Dot separator</p>
|
|
161
|
+
<WakaBreadcrumb
|
|
162
|
+
items={basicItems}
|
|
163
|
+
separator={<span className="text-muted-foreground mx-2">•</span>}
|
|
164
|
+
/>
|
|
165
|
+
</div>
|
|
166
|
+
</div>
|
|
167
|
+
),
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export const WithClickHandler: Story = {
|
|
171
|
+
render: () => {
|
|
172
|
+
const handleClick = (item: BreadcrumbItem, index: number) => {
|
|
173
|
+
alert(`Clicked: ${item.label} at index ${index}`)
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
return (
|
|
177
|
+
<WakaBreadcrumb
|
|
178
|
+
items={basicItems}
|
|
179
|
+
onItemClick={handleClick}
|
|
180
|
+
/>
|
|
181
|
+
)
|
|
182
|
+
},
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
export const DisabledItems: Story = {
|
|
186
|
+
render: () => {
|
|
187
|
+
const itemsWithDisabled: BreadcrumbItem[] = [
|
|
188
|
+
{ label: 'Home', href: '/' },
|
|
189
|
+
{ label: 'Products', href: '/products' },
|
|
190
|
+
{ label: 'Archived', href: '/products/archived', disabled: true },
|
|
191
|
+
{ label: 'Item' },
|
|
192
|
+
]
|
|
193
|
+
|
|
194
|
+
return <WakaBreadcrumb items={itemsWithDisabled} />
|
|
195
|
+
},
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
export const FileExplorer: Story = {
|
|
199
|
+
render: () => {
|
|
200
|
+
const filePath: BreadcrumbItem[] = [
|
|
201
|
+
{ label: 'Root', href: '/', icon: <Folder className="h-4 w-4" /> },
|
|
202
|
+
{ label: 'Users', href: '/users', icon: <Folder className="h-4 w-4" /> },
|
|
203
|
+
{ label: 'john', href: '/users/john', icon: <Folder className="h-4 w-4" /> },
|
|
204
|
+
{ label: 'Documents', href: '/users/john/documents', icon: <Folder className="h-4 w-4" /> },
|
|
205
|
+
{ label: 'report.pdf', icon: <FileText className="h-4 w-4" /> },
|
|
206
|
+
]
|
|
207
|
+
|
|
208
|
+
return (
|
|
209
|
+
<div className="border rounded-lg p-4 w-[500px]">
|
|
210
|
+
<div className="bg-muted/50 rounded p-2">
|
|
211
|
+
<WakaBreadcrumb items={filePath} showHomeIcon={false} size="sm" />
|
|
212
|
+
</div>
|
|
213
|
+
<div className="mt-4 text-sm text-muted-foreground">
|
|
214
|
+
Current location: /users/john/documents/report.pdf
|
|
215
|
+
</div>
|
|
216
|
+
</div>
|
|
217
|
+
)
|
|
218
|
+
},
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
export const DashboardHeader: Story = {
|
|
222
|
+
render: () => {
|
|
223
|
+
const dashboardPath: BreadcrumbItem[] = [
|
|
224
|
+
{ label: 'Dashboard', href: '/dashboard' },
|
|
225
|
+
{ label: 'Analytics', href: '/dashboard/analytics' },
|
|
226
|
+
{ label: 'User Metrics' },
|
|
227
|
+
]
|
|
228
|
+
|
|
229
|
+
return (
|
|
230
|
+
<div className="border-b pb-4 w-[600px]">
|
|
231
|
+
<WakaBreadcrumb items={dashboardPath} showHomeIcon />
|
|
232
|
+
<h1 className="text-2xl font-bold mt-4">User Metrics</h1>
|
|
233
|
+
<p className="text-muted-foreground">View detailed user engagement metrics</p>
|
|
234
|
+
</div>
|
|
235
|
+
)
|
|
236
|
+
},
|
|
237
|
+
}
|
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/react'
|
|
2
|
+
import { WakaBuildMatrix, defaultBuildMatrixColumns, defaultBuildMatrixRows } from './index'
|
|
3
|
+
import type { BuildMatrixRow, BuildCell, BuildStatus } from './index'
|
|
4
|
+
import * as React from 'react'
|
|
5
|
+
|
|
6
|
+
const allPassingRows: BuildMatrixRow[] = [
|
|
7
|
+
{
|
|
8
|
+
label: 'Node.js 20',
|
|
9
|
+
description: 'LTS version',
|
|
10
|
+
cells: [
|
|
11
|
+
{ id: '1', status: 'success', duration: 125 },
|
|
12
|
+
{ id: '2', status: 'success', duration: 142 },
|
|
13
|
+
{ id: '3', status: 'success', duration: 98 },
|
|
14
|
+
{ id: '4', status: 'success', duration: 156 },
|
|
15
|
+
],
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
label: 'Node.js 18',
|
|
19
|
+
description: 'Previous LTS',
|
|
20
|
+
cells: [
|
|
21
|
+
{ id: '5', status: 'success', duration: 118 },
|
|
22
|
+
{ id: '6', status: 'success', duration: 135 },
|
|
23
|
+
{ id: '7', status: 'success', duration: 102 },
|
|
24
|
+
{ id: '8', status: 'success', duration: 162 },
|
|
25
|
+
],
|
|
26
|
+
},
|
|
27
|
+
]
|
|
28
|
+
|
|
29
|
+
const allFailingRows: BuildMatrixRow[] = [
|
|
30
|
+
{
|
|
31
|
+
label: 'Node.js 20',
|
|
32
|
+
cells: [
|
|
33
|
+
{ id: '1', status: 'failed', duration: 45 },
|
|
34
|
+
{ id: '2', status: 'failed', duration: 52 },
|
|
35
|
+
{ id: '3', status: 'failed', duration: 38 },
|
|
36
|
+
{ id: '4', status: 'failed', duration: 67 },
|
|
37
|
+
],
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
label: 'Node.js 18',
|
|
41
|
+
cells: [
|
|
42
|
+
{ id: '5', status: 'failed', duration: 41 },
|
|
43
|
+
{ id: '6', status: 'failed', duration: 55 },
|
|
44
|
+
{ id: '7', status: 'failed', duration: 48 },
|
|
45
|
+
{ id: '8', status: 'failed', duration: 72 },
|
|
46
|
+
],
|
|
47
|
+
},
|
|
48
|
+
]
|
|
49
|
+
|
|
50
|
+
const runningRows: BuildMatrixRow[] = [
|
|
51
|
+
{
|
|
52
|
+
label: 'Node.js 20',
|
|
53
|
+
cells: [
|
|
54
|
+
{ id: '1', status: 'success', duration: 125 },
|
|
55
|
+
{ id: '2', status: 'running', startedAt: new Date(Date.now() - 60000) },
|
|
56
|
+
{ id: '3', status: 'pending' },
|
|
57
|
+
{ id: '4', status: 'pending' },
|
|
58
|
+
],
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
label: 'Node.js 18',
|
|
62
|
+
cells: [
|
|
63
|
+
{ id: '5', status: 'running', startedAt: new Date(Date.now() - 45000) },
|
|
64
|
+
{ id: '6', status: 'pending' },
|
|
65
|
+
{ id: '7', status: 'pending' },
|
|
66
|
+
{ id: '8', status: 'pending' },
|
|
67
|
+
],
|
|
68
|
+
},
|
|
69
|
+
]
|
|
70
|
+
|
|
71
|
+
const largeMatrix: BuildMatrixRow[] = [
|
|
72
|
+
'Chrome', 'Firefox', 'Safari', 'Edge', 'Node.js 20', 'Node.js 18', 'Deno'
|
|
73
|
+
].map((label, i) => ({
|
|
74
|
+
label,
|
|
75
|
+
description: i < 4 ? 'Browser' : 'Runtime',
|
|
76
|
+
cells: ['Ubuntu 22.04', 'Ubuntu 20.04', 'macOS 13', 'macOS 12', 'Windows 2022', 'Windows 2019'].map((_, j) => ({
|
|
77
|
+
id: `cell-${i}-${j}`,
|
|
78
|
+
status: Math.random() > 0.15 ? 'success' : Math.random() > 0.5 ? 'failed' : 'skipped' as BuildStatus,
|
|
79
|
+
duration: Math.floor(Math.random() * 200) + 50,
|
|
80
|
+
})),
|
|
81
|
+
}))
|
|
82
|
+
|
|
83
|
+
const meta: Meta<typeof WakaBuildMatrix> = {
|
|
84
|
+
title: 'Components/DevOps/WakaBuildMatrix',
|
|
85
|
+
component: WakaBuildMatrix,
|
|
86
|
+
parameters: {
|
|
87
|
+
layout: 'centered',
|
|
88
|
+
docs: {
|
|
89
|
+
description: {
|
|
90
|
+
component: 'A build matrix visualization for CI/CD with status indicators, expandable details, pass rates, and retry functionality.',
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
tags: ['autodocs'],
|
|
95
|
+
argTypes: {
|
|
96
|
+
showDuration: {
|
|
97
|
+
control: 'boolean',
|
|
98
|
+
description: 'Show duration in cells',
|
|
99
|
+
},
|
|
100
|
+
},
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export default meta
|
|
104
|
+
type Story = StoryObj<typeof WakaBuildMatrix>
|
|
105
|
+
|
|
106
|
+
export const Default: Story = {
|
|
107
|
+
args: {
|
|
108
|
+
columns: defaultBuildMatrixColumns,
|
|
109
|
+
rows: defaultBuildMatrixRows,
|
|
110
|
+
},
|
|
111
|
+
render: (args) => (
|
|
112
|
+
<div className="w-[700px]">
|
|
113
|
+
<WakaBuildMatrix
|
|
114
|
+
{...args}
|
|
115
|
+
onCellClick={(row, col, cell) => console.log('Click:', row, col, cell)}
|
|
116
|
+
onRetry={(row, col) => console.log('Retry:', row, col)}
|
|
117
|
+
/>
|
|
118
|
+
</div>
|
|
119
|
+
),
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
export const AllPassing: Story = {
|
|
123
|
+
render: () => (
|
|
124
|
+
<div className="w-[700px]">
|
|
125
|
+
<WakaBuildMatrix
|
|
126
|
+
columns={defaultBuildMatrixColumns}
|
|
127
|
+
rows={allPassingRows}
|
|
128
|
+
title="All Tests Passing"
|
|
129
|
+
/>
|
|
130
|
+
</div>
|
|
131
|
+
),
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export const AllFailing: Story = {
|
|
135
|
+
render: () => (
|
|
136
|
+
<div className="w-[700px]">
|
|
137
|
+
<WakaBuildMatrix
|
|
138
|
+
columns={defaultBuildMatrixColumns}
|
|
139
|
+
rows={allFailingRows}
|
|
140
|
+
title="Build Failures"
|
|
141
|
+
onRetry={(row, col) => console.log('Retry:', row, col)}
|
|
142
|
+
/>
|
|
143
|
+
</div>
|
|
144
|
+
),
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export const Running: Story = {
|
|
148
|
+
render: () => (
|
|
149
|
+
<div className="w-[700px]">
|
|
150
|
+
<WakaBuildMatrix
|
|
151
|
+
columns={defaultBuildMatrixColumns}
|
|
152
|
+
rows={runningRows}
|
|
153
|
+
title="Build In Progress"
|
|
154
|
+
/>
|
|
155
|
+
</div>
|
|
156
|
+
),
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export const LargeMatrix: Story = {
|
|
160
|
+
render: () => (
|
|
161
|
+
<div className="w-[900px]">
|
|
162
|
+
<WakaBuildMatrix
|
|
163
|
+
columns={['Ubuntu 22.04', 'Ubuntu 20.04', 'macOS 13', 'macOS 12', 'Windows 2022', 'Windows 2019']}
|
|
164
|
+
rows={largeMatrix}
|
|
165
|
+
title="Cross-Platform Test Matrix"
|
|
166
|
+
onCellClick={(row, col, cell) => console.log('Click:', row, col, cell)}
|
|
167
|
+
onRetry={(row, col) => console.log('Retry:', row, col)}
|
|
168
|
+
/>
|
|
169
|
+
</div>
|
|
170
|
+
),
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
export const NoDuration: Story = {
|
|
174
|
+
render: () => (
|
|
175
|
+
<div className="w-[700px]">
|
|
176
|
+
<WakaBuildMatrix
|
|
177
|
+
columns={defaultBuildMatrixColumns}
|
|
178
|
+
rows={defaultBuildMatrixRows}
|
|
179
|
+
showDuration={false}
|
|
180
|
+
/>
|
|
181
|
+
</div>
|
|
182
|
+
),
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
export const WithRetry: Story = {
|
|
186
|
+
render: () => {
|
|
187
|
+
const [rows, setRows] = React.useState(defaultBuildMatrixRows)
|
|
188
|
+
|
|
189
|
+
const handleRetry = (rowIndex: number, colIndex: number) => {
|
|
190
|
+
setRows(prev => {
|
|
191
|
+
const newRows = [...prev]
|
|
192
|
+
newRows[rowIndex] = {
|
|
193
|
+
...newRows[rowIndex],
|
|
194
|
+
cells: newRows[rowIndex].cells.map((cell, i) =>
|
|
195
|
+
i === colIndex
|
|
196
|
+
? { ...cell, status: 'running' as BuildStatus, startedAt: new Date() }
|
|
197
|
+
: cell
|
|
198
|
+
),
|
|
199
|
+
}
|
|
200
|
+
return newRows
|
|
201
|
+
})
|
|
202
|
+
|
|
203
|
+
// Simulate completion
|
|
204
|
+
setTimeout(() => {
|
|
205
|
+
setRows(prev => {
|
|
206
|
+
const newRows = [...prev]
|
|
207
|
+
newRows[rowIndex] = {
|
|
208
|
+
...newRows[rowIndex],
|
|
209
|
+
cells: newRows[rowIndex].cells.map((cell, i) =>
|
|
210
|
+
i === colIndex
|
|
211
|
+
? { ...cell, status: Math.random() > 0.3 ? 'success' : 'failed' as BuildStatus, duration: Math.floor(Math.random() * 100) + 50 }
|
|
212
|
+
: cell
|
|
213
|
+
),
|
|
214
|
+
}
|
|
215
|
+
return newRows
|
|
216
|
+
})
|
|
217
|
+
}, 2000)
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
return (
|
|
221
|
+
<div className="w-[700px]">
|
|
222
|
+
<WakaBuildMatrix
|
|
223
|
+
columns={defaultBuildMatrixColumns}
|
|
224
|
+
rows={rows}
|
|
225
|
+
title="Interactive Build Matrix"
|
|
226
|
+
onRetry={handleRetry}
|
|
227
|
+
/>
|
|
228
|
+
</div>
|
|
229
|
+
)
|
|
230
|
+
},
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
export const AllStatuses: Story = {
|
|
234
|
+
render: () => {
|
|
235
|
+
const statusRows: BuildMatrixRow[] = [
|
|
236
|
+
{
|
|
237
|
+
label: 'Status Demo',
|
|
238
|
+
cells: [
|
|
239
|
+
{ id: '1', status: 'success', duration: 100 },
|
|
240
|
+
{ id: '2', status: 'failed', duration: 45 },
|
|
241
|
+
{ id: '3', status: 'running', startedAt: new Date() },
|
|
242
|
+
{ id: '4', status: 'pending' },
|
|
243
|
+
{ id: '5', status: 'skipped' },
|
|
244
|
+
{ id: '6', status: 'cancelled' },
|
|
245
|
+
],
|
|
246
|
+
},
|
|
247
|
+
]
|
|
248
|
+
|
|
249
|
+
return (
|
|
250
|
+
<div className="w-[800px]">
|
|
251
|
+
<WakaBuildMatrix
|
|
252
|
+
columns={['Success', 'Failed', 'Running', 'Pending', 'Skipped', 'Cancelled']}
|
|
253
|
+
rows={statusRows}
|
|
254
|
+
title="All Build Statuses"
|
|
255
|
+
/>
|
|
256
|
+
</div>
|
|
257
|
+
)
|
|
258
|
+
},
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
export const GitHubActions: Story = {
|
|
262
|
+
render: () => {
|
|
263
|
+
const ghRows: BuildMatrixRow[] = [
|
|
264
|
+
{
|
|
265
|
+
label: 'lint',
|
|
266
|
+
cells: [
|
|
267
|
+
{ id: '1', status: 'success', duration: 23 },
|
|
268
|
+
{ id: '2', status: 'success', duration: 25 },
|
|
269
|
+
{ id: '3', status: 'success', duration: 21 },
|
|
270
|
+
],
|
|
271
|
+
},
|
|
272
|
+
{
|
|
273
|
+
label: 'test',
|
|
274
|
+
cells: [
|
|
275
|
+
{ id: '4', status: 'success', duration: 156 },
|
|
276
|
+
{ id: '5', status: 'success', duration: 178 },
|
|
277
|
+
{ id: '6', status: 'failed', duration: 89 },
|
|
278
|
+
],
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
label: 'build',
|
|
282
|
+
cells: [
|
|
283
|
+
{ id: '7', status: 'success', duration: 45 },
|
|
284
|
+
{ id: '8', status: 'running', startedAt: new Date() },
|
|
285
|
+
{ id: '9', status: 'skipped' },
|
|
286
|
+
],
|
|
287
|
+
},
|
|
288
|
+
{
|
|
289
|
+
label: 'deploy',
|
|
290
|
+
cells: [
|
|
291
|
+
{ id: '10', status: 'pending' },
|
|
292
|
+
{ id: '11', status: 'pending' },
|
|
293
|
+
{ id: '12', status: 'pending' },
|
|
294
|
+
],
|
|
295
|
+
},
|
|
296
|
+
]
|
|
297
|
+
|
|
298
|
+
return (
|
|
299
|
+
<div className="w-[600px] p-6 rounded-xl border bg-card">
|
|
300
|
+
<div className="flex items-center gap-2 mb-4">
|
|
301
|
+
<div className="w-2 h-2 rounded-full bg-yellow-500 animate-pulse" />
|
|
302
|
+
<span className="font-medium">CI Pipeline Running</span>
|
|
303
|
+
<span className="text-sm text-muted-foreground ml-auto">
|
|
304
|
+
Workflow: main.yml
|
|
305
|
+
</span>
|
|
306
|
+
</div>
|
|
307
|
+
<WakaBuildMatrix
|
|
308
|
+
columns={['Node 20', 'Node 18', 'Node 16']}
|
|
309
|
+
rows={ghRows}
|
|
310
|
+
title="Build Jobs"
|
|
311
|
+
onRetry={(row, col) => console.log('Retry:', row, col)}
|
|
312
|
+
/>
|
|
313
|
+
</div>
|
|
314
|
+
)
|
|
315
|
+
},
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
export const Empty: Story = {
|
|
319
|
+
render: () => (
|
|
320
|
+
<div className="w-[700px]">
|
|
321
|
+
<WakaBuildMatrix
|
|
322
|
+
columns={defaultBuildMatrixColumns}
|
|
323
|
+
rows={[]}
|
|
324
|
+
title="No Builds"
|
|
325
|
+
/>
|
|
326
|
+
</div>
|
|
327
|
+
),
|
|
328
|
+
}
|