@wakastellar/ui 2.3.4 → 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.
Files changed (194) hide show
  1. package/dist/blocks/dashboard/index.d.ts +4 -1
  2. package/dist/blocks/empty-states/index.d.ts +4 -1
  3. package/dist/blocks/error-pages/index.d.ts +4 -1
  4. package/dist/blocks/index.d.ts +1 -1
  5. package/dist/blocks/landing/index.d.ts +4 -1
  6. package/dist/blocks/pricing/index.d.ts +5 -1
  7. package/dist/blocks/sidebar/index.d.ts +5 -1
  8. package/dist/index.cjs.js +130 -130
  9. package/dist/index.d.ts +1 -0
  10. package/dist/index.es.js +7905 -7856
  11. package/dist/stories/Button.d.ts +14 -0
  12. package/dist/stories/Button.stories.d.ts +8 -0
  13. package/dist/stories/Header.d.ts +11 -0
  14. package/dist/stories/Header.stories.d.ts +6 -0
  15. package/dist/stories/Page.d.ts +2 -0
  16. package/dist/stories/Page.stories.d.ts +6 -0
  17. package/dist/types/index.d.ts +1 -0
  18. package/dist/types/link.d.ts +23 -0
  19. package/package.json +11 -3
  20. package/src/blocks/activity-timeline/ActivityTimeline.stories.tsx +460 -0
  21. package/src/blocks/apm-overview/APMOverview.stories.tsx +435 -0
  22. package/src/blocks/auth-2fa/Auth2FA.stories.tsx +308 -0
  23. package/src/blocks/calendar-view/CalendarView.stories.tsx +398 -0
  24. package/src/blocks/chat/Chat.stories.tsx +466 -0
  25. package/src/blocks/chat-interface/ChatInterface.stories.tsx +412 -0
  26. package/src/blocks/checkout-flow/CheckoutFlow.stories.tsx +408 -0
  27. package/src/blocks/cicd-builder/CICDBuilder.stories.tsx +499 -0
  28. package/src/blocks/cloud-cost-dashboard/CloudCostDashboard.stories.tsx +356 -0
  29. package/src/blocks/container-orchestrator/ContainerOrchestrator.stories.tsx +461 -0
  30. package/src/blocks/dashboard/Dashboard.stories.tsx +559 -0
  31. package/src/blocks/dashboard/index.tsx +68 -27
  32. package/src/blocks/dashboard-kpi/DashboardKPI.stories.tsx +422 -0
  33. package/src/blocks/database-admin/DatabaseAdmin.stories.tsx +393 -0
  34. package/src/blocks/deployment-dashboard/DeploymentDashboard.stories.tsx +457 -0
  35. package/src/blocks/empty-states/EmptyStates.stories.tsx +467 -0
  36. package/src/blocks/empty-states/index.tsx +26 -8
  37. package/src/blocks/error-pages/ErrorPages.stories.tsx +401 -0
  38. package/src/blocks/error-pages/index.tsx +26 -8
  39. package/src/blocks/faq/FAQ.stories.tsx +416 -0
  40. package/src/blocks/file-manager/FileManager.stories.tsx +413 -0
  41. package/src/blocks/footer/Footer.stories.tsx +328 -0
  42. package/src/blocks/gitops-sync-status/GitOpsSyncStatus.stories.tsx +529 -0
  43. package/src/blocks/header/WakaHeader.stories.tsx +455 -0
  44. package/src/blocks/headtab/Headtab.stories.tsx +369 -0
  45. package/src/blocks/i18n-editor/I18nEditor.stories.tsx +451 -0
  46. package/src/blocks/incident-manager/IncidentManager.stories.tsx +464 -0
  47. package/src/blocks/index.ts +1 -1
  48. package/src/blocks/infrastructure-map/InfrastructureMap.stories.tsx +533 -0
  49. package/src/blocks/kanban-board/KanbanBoard.stories.tsx +494 -0
  50. package/src/blocks/landing/WakaLanding.stories.tsx +449 -0
  51. package/src/blocks/landing/index.tsx +125 -66
  52. package/src/blocks/language-selector/LanguageSelector.stories.tsx +345 -0
  53. package/src/blocks/layout/Layout.stories.tsx +373 -0
  54. package/src/blocks/login/Login.stories.tsx +443 -0
  55. package/src/blocks/on-call-schedule/OnCallSchedule.stories.tsx +381 -0
  56. package/src/blocks/player-profile/PlayerProfile.stories.tsx +316 -0
  57. package/src/blocks/pricing/WakaPricing.stories.tsx +530 -0
  58. package/src/blocks/pricing/index.tsx +38 -4
  59. package/src/blocks/profile/Profile.stories.tsx +371 -0
  60. package/src/blocks/release-notes/ReleaseNotes.stories.tsx +431 -0
  61. package/src/blocks/settings/Settings.stories.tsx +520 -0
  62. package/src/blocks/sidebar/WakaSidebar.stories.tsx +513 -0
  63. package/src/blocks/sidebar/index.tsx +49 -20
  64. package/src/blocks/theme-creator-block/ThemeCreatorBlock.stories.tsx +370 -0
  65. package/src/blocks/user-management/UserManagement.stories.tsx +411 -0
  66. package/src/blocks/wizard/Wizard.stories.tsx +683 -0
  67. package/src/components/accordion/Accordion.stories.tsx +93 -0
  68. package/src/components/alert/Alert.stories.tsx +95 -0
  69. package/src/components/alert-dialog/AlertDialog.stories.tsx +126 -0
  70. package/src/components/aspect-ratio/AspectRatio.stories.tsx +118 -0
  71. package/src/components/avatar/Avatar.stories.tsx +104 -0
  72. package/src/components/button/Button.stories.tsx +12 -1
  73. package/src/components/calendar/Calendar.stories.tsx +102 -0
  74. package/src/components/card/Card.stories.tsx +125 -0
  75. package/src/components/checkbox/Checkbox.stories.tsx +100 -0
  76. package/src/components/code/Code.stories.tsx +402 -0
  77. package/src/components/collapsible/Collapsible.stories.tsx +123 -0
  78. package/src/components/command/Command.stories.tsx +207 -0
  79. package/src/components/context-menu/ContextMenu.stories.tsx +220 -0
  80. package/src/components/dialog/Dialog.stories.tsx +157 -0
  81. package/src/components/dropdown-menu/DropdownMenu.stories.tsx +225 -0
  82. package/src/components/form/Form.stories.tsx +413 -0
  83. package/src/components/hover-card/HoverCard.stories.tsx +148 -0
  84. package/src/components/input-otp/InputOTP.stories.tsx +255 -0
  85. package/src/components/label/Label.stories.tsx +68 -0
  86. package/src/components/menubar/Menubar.stories.tsx +278 -0
  87. package/src/components/navigation-menu/NavigationMenu.stories.tsx +202 -0
  88. package/src/components/popover/Popover.stories.tsx +199 -0
  89. package/src/components/progress/Progress.stories.tsx +104 -0
  90. package/src/components/radio-group/RadioGroup.stories.tsx +138 -0
  91. package/src/components/scroll-area/ScrollArea.stories.tsx +153 -0
  92. package/src/components/select/Select.stories.tsx +146 -0
  93. package/src/components/separator/Separator.stories.tsx +117 -0
  94. package/src/components/sheet/Sheet.stories.tsx +195 -0
  95. package/src/components/skeleton/Skeleton.stories.tsx +114 -0
  96. package/src/components/slider/Slider.stories.tsx +157 -0
  97. package/src/components/switch/Switch.stories.tsx +114 -0
  98. package/src/components/table/Table.stories.tsx +153 -0
  99. package/src/components/tabs/Tabs.stories.tsx +155 -0
  100. package/src/components/textarea/Textarea.stories.tsx +116 -0
  101. package/src/components/toast/Toast.stories.tsx +160 -0
  102. package/src/components/toggle/Toggle.stories.tsx +125 -0
  103. package/src/components/tooltip/Tooltip.stories.tsx +133 -0
  104. package/src/components/typography/Typography.stories.tsx +207 -0
  105. package/src/components/waka-3d-pie-chart/Waka3DPieChart.stories.tsx +308 -0
  106. package/src/components/waka-achievement-unlock/WakaAchievementUnlock.stories.tsx +353 -0
  107. package/src/components/waka-artifact-list/WakaArtifactList.stories.tsx +258 -0
  108. package/src/components/waka-autocomplete/WakaAutocomplete.stories.tsx +224 -0
  109. package/src/components/waka-badge-showcase/WakaBadgeShowcase.stories.tsx +269 -0
  110. package/src/components/waka-barcode/WakaBarcode.stories.tsx +227 -0
  111. package/src/components/waka-bottom-sheet/WakaBottomSheet.stories.tsx +408 -0
  112. package/src/components/waka-breadcrumb/WakaBreadcrumb.stories.tsx +237 -0
  113. package/src/components/waka-build-matrix/WakaBuildMatrix.stories.tsx +328 -0
  114. package/src/components/waka-carousel/WakaCarousel.stories.tsx +296 -0
  115. package/src/components/waka-charts/WakaCharts.stories.tsx +519 -0
  116. package/src/components/waka-color-picker/WakaColorPicker.stories.tsx +200 -0
  117. package/src/components/waka-combobox/WakaCombobox.stories.tsx +250 -0
  118. package/src/components/waka-container-list/WakaContainerList.stories.tsx +315 -0
  119. package/src/components/waka-contribution-graph/WakaContributionGraph.stories.tsx +354 -0
  120. package/src/components/waka-cost-breakdown/WakaCostBreakdown.stories.tsx +348 -0
  121. package/src/components/waka-daily-reward/WakaDailyReward.stories.tsx +365 -0
  122. package/src/components/waka-database-card/WakaDatabaseCard.stories.tsx +306 -0
  123. package/src/components/waka-date-range-picker/WakaDateRangePicker.stories.tsx +339 -0
  124. package/src/components/waka-datetime-picker/WakaDateTimePicker.stories.tsx +317 -0
  125. package/src/components/waka-deployment-lane/WakaDeploymentLane.stories.tsx +292 -0
  126. package/src/components/waka-dock/WakaDock.stories.tsx +332 -0
  127. package/src/components/waka-drawer/WakaDrawer.stories.tsx +437 -0
  128. package/src/components/waka-env-var-editor/WakaEnvVarEditor.stories.tsx +263 -0
  129. package/src/components/waka-error-shake/WakaErrorShake.stories.tsx +410 -0
  130. package/src/components/waka-file-upload/WakaFileUpload.stories.tsx +239 -0
  131. package/src/components/waka-flow-diagram/WakaFlowDiagram.stories.tsx +365 -0
  132. package/src/components/waka-funnel-chart/WakaFunnelChart.stories.tsx +281 -0
  133. package/src/components/waka-glow-card/WakaGlowCard.stories.tsx +274 -0
  134. package/src/components/waka-haptic-button/WakaHapticButton.stories.tsx +349 -0
  135. package/src/components/waka-health-pulse/WakaHealthPulse.stories.tsx +293 -0
  136. package/src/components/waka-heatmap/WakaHeatmap.stories.tsx +376 -0
  137. package/src/components/waka-image/WakaImage.stories.tsx +255 -0
  138. package/src/components/waka-incident-timeline/WakaIncidentTimeline.stories.tsx +300 -0
  139. package/src/components/waka-kanban/WakaKanban.stories.tsx +399 -0
  140. package/src/components/waka-kubernetes-overview/WakaKubernetesOverview.stories.tsx +281 -0
  141. package/src/components/waka-leaderboard/WakaLeaderboard.stories.tsx +300 -0
  142. package/src/components/waka-level-progress/WakaLevelProgress.stories.tsx +313 -0
  143. package/src/components/waka-loading-orbit/WakaLoadingOrbit.stories.tsx +413 -0
  144. package/src/components/waka-log-viewer/WakaLogViewer.stories.tsx +312 -0
  145. package/src/components/waka-loot-box/WakaLootBox.stories.tsx +374 -0
  146. package/src/components/waka-metric-sparkline/WakaMetricSparkline.stories.tsx +312 -0
  147. package/src/components/waka-migration-list/WakaMigrationList.stories.tsx +289 -0
  148. package/src/components/waka-modal/WakaModal.stories.tsx +434 -0
  149. package/src/components/waka-morph-button/WakaMorphButton.stories.tsx +405 -0
  150. package/src/components/waka-network-topology/WakaNetworkTopology.stories.tsx +364 -0
  151. package/src/components/waka-notifications/WakaNotifications.stories.tsx +290 -0
  152. package/src/components/waka-number-input/WakaNumberInput.stories.tsx +282 -0
  153. package/src/components/waka-pagination/WakaPagination.stories.tsx +328 -0
  154. package/src/components/waka-password-strength/WakaPasswordStrength.stories.tsx +318 -0
  155. package/src/components/waka-pipeline-view/WakaPipelineView.stories.tsx +386 -0
  156. package/src/components/waka-player-card/WakaPlayerCard.stories.tsx +333 -0
  157. package/src/components/waka-pod-card/WakaPodCard.stories.tsx +435 -0
  158. package/src/components/waka-qrcode/WakaQRCode.stories.tsx +232 -0
  159. package/src/components/waka-query-explain/WakaQueryExplain.stories.tsx +407 -0
  160. package/src/components/waka-quest-card/WakaQuestCard.stories.tsx +394 -0
  161. package/src/components/waka-quota-bar/WakaQuotaBar.stories.tsx +435 -0
  162. package/src/components/waka-radar-score/WakaRadarScore.stories.tsx +372 -0
  163. package/src/components/waka-resource-gauge/WakaResourceGauge.stories.tsx +366 -0
  164. package/src/components/waka-rich-text-editor/WakaRichTextEditor.stories.tsx +238 -0
  165. package/src/components/waka-sankey-diagram/WakaSankeyDiagram.stories.tsx +389 -0
  166. package/src/components/waka-scratch-card/WakaScratchCard.stories.tsx +388 -0
  167. package/src/components/waka-secret-card/WakaSecretCard.stories.tsx +314 -0
  168. package/src/components/waka-segmented-control/WakaSegmentedControl.stories.tsx +309 -0
  169. package/src/components/waka-server-rack/WakaServerRack.stories.tsx +382 -0
  170. package/src/components/waka-service-graph/WakaServiceGraph.stories.tsx +262 -0
  171. package/src/components/waka-skeleton-wave/WakaSkeletonWave.stories.tsx +321 -0
  172. package/src/components/waka-skill-tree/WakaSkillTree.stories.tsx +308 -0
  173. package/src/components/waka-spin-wheel/WakaSpinWheel.stories.tsx +368 -0
  174. package/src/components/waka-spinner/WakaSpinner.stories.tsx +156 -0
  175. package/src/components/waka-stat/WakaStat.stories.tsx +334 -0
  176. package/src/components/waka-status-matrix/WakaStatusMatrix.stories.tsx +331 -0
  177. package/src/components/waka-stepper/WakaStepper.stories.tsx +468 -0
  178. package/src/components/waka-streak-counter/WakaStreakCounter.stories.tsx +235 -0
  179. package/src/components/waka-success-explosion/WakaSuccessExplosion.stories.tsx +389 -0
  180. package/src/components/waka-tabs-morph/WakaTabsMorph.stories.tsx +471 -0
  181. package/src/components/waka-terminal-output/WakaTerminalOutput.stories.tsx +351 -0
  182. package/src/components/waka-test-report/WakaTestReport.stories.tsx +322 -0
  183. package/src/components/waka-tilt-card/WakaTiltCard.stories.tsx +300 -0
  184. package/src/components/waka-time-picker/WakaTimePicker.stories.tsx +227 -0
  185. package/src/components/waka-timeline/WakaTimeline.stories.tsx +383 -0
  186. package/src/components/waka-tournament-bracket/WakaTournamentBracket.stories.tsx +375 -0
  187. package/src/components/waka-trace-viewer/WakaTraceViewer.stories.tsx +445 -0
  188. package/src/components/waka-tree/WakaTree.stories.tsx +359 -0
  189. package/src/components/waka-treemap-chart/WakaTreemapChart.stories.tsx +378 -0
  190. package/src/components/waka-typewriter/WakaTypewriter.stories.tsx +366 -0
  191. package/src/components/waka-versus-card/WakaVersusCard.stories.tsx +530 -0
  192. package/src/components/waka-video/WakaVideo.stories.tsx +203 -0
  193. package/src/components/waka-virtual-list/WakaVirtualList.stories.tsx +273 -0
  194. 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
+ }