@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,457 @@
1
+ import type { Meta, StoryObj } from '@storybook/react'
2
+ import {
3
+ DeploymentDashboard,
4
+ defaultDeployments,
5
+ defaultPipelines,
6
+ defaultEnvironments,
7
+ } from './index'
8
+ import type { Deployment, Pipeline, EnvironmentStatus, Environment } from './index'
9
+ import * as React from 'react'
10
+
11
+ const meta: Meta<typeof DeploymentDashboard> = {
12
+ title: 'Blocks/DeploymentDashboard',
13
+ component: DeploymentDashboard,
14
+ parameters: {
15
+ layout: 'fullscreen',
16
+ docs: {
17
+ description: {
18
+ component:
19
+ 'A deployment dashboard for managing CI/CD deployments across multiple environments with pipeline visualization, rollback support, and environment health monitoring.',
20
+ },
21
+ },
22
+ },
23
+ tags: ['autodocs'],
24
+ }
25
+
26
+ export default meta
27
+ type Story = StoryObj<typeof DeploymentDashboard>
28
+
29
+ export const Default: Story = {
30
+ render: () => (
31
+ <div className="p-6">
32
+ <DeploymentDashboard
33
+ deployments={defaultDeployments}
34
+ pipelines={defaultPipelines}
35
+ environments={defaultEnvironments}
36
+ onDeploy={(env, branch) => console.log('Deploy:', env, branch)}
37
+ onRollback={(id) => console.log('Rollback:', id)}
38
+ onCancel={(id) => console.log('Cancel:', id)}
39
+ onRetry={(id) => console.log('Retry:', id)}
40
+ />
41
+ </div>
42
+ ),
43
+ }
44
+
45
+ export const Empty: Story = {
46
+ render: () => (
47
+ <div className="p-6">
48
+ <DeploymentDashboard
49
+ deployments={[]}
50
+ pipelines={[]}
51
+ environments={defaultEnvironments}
52
+ onDeploy={(env, branch) => console.log('Deploy:', env, branch)}
53
+ />
54
+ </div>
55
+ ),
56
+ }
57
+
58
+ export const AllSuccess: Story = {
59
+ render: () => {
60
+ const successDeployments: Deployment[] = [
61
+ {
62
+ id: 'd1',
63
+ status: 'success',
64
+ environment: 'production',
65
+ branch: 'main',
66
+ commit: 'abc123def',
67
+ commitMessage: 'feat: Add user authentication',
68
+ author: { name: 'Alice Developer' },
69
+ startedAt: new Date(Date.now() - 3600000),
70
+ finishedAt: new Date(Date.now() - 3300000),
71
+ duration: '5m 0s',
72
+ url: 'https://app.example.com',
73
+ },
74
+ {
75
+ id: 'd2',
76
+ status: 'success',
77
+ environment: 'staging',
78
+ branch: 'develop',
79
+ commit: 'def456ghi',
80
+ commitMessage: 'fix: Resolve login redirect issue',
81
+ author: { name: 'Bob Engineer' },
82
+ startedAt: new Date(Date.now() - 7200000),
83
+ finishedAt: new Date(Date.now() - 6900000),
84
+ duration: '5m 0s',
85
+ url: 'https://staging.example.com',
86
+ },
87
+ ]
88
+
89
+ const healthyEnvironments: EnvironmentStatus[] = [
90
+ {
91
+ name: 'production',
92
+ status: 'healthy',
93
+ url: 'https://app.example.com',
94
+ uptime: '99.99%',
95
+ responseTime: '95ms',
96
+ lastDeployment: successDeployments[0],
97
+ },
98
+ {
99
+ name: 'staging',
100
+ status: 'healthy',
101
+ url: 'https://staging.example.com',
102
+ uptime: '99.5%',
103
+ responseTime: '120ms',
104
+ lastDeployment: successDeployments[1],
105
+ },
106
+ {
107
+ name: 'development',
108
+ status: 'healthy',
109
+ url: 'https://dev.example.com',
110
+ uptime: '98%',
111
+ responseTime: '150ms',
112
+ },
113
+ ]
114
+
115
+ return (
116
+ <div className="p-6">
117
+ <DeploymentDashboard
118
+ deployments={successDeployments}
119
+ pipelines={[]}
120
+ environments={healthyEnvironments}
121
+ onDeploy={(env, branch) => console.log('Deploy:', env, branch)}
122
+ onRollback={(id) => console.log('Rollback:', id)}
123
+ />
124
+ </div>
125
+ )
126
+ },
127
+ }
128
+
129
+ export const WithFailedDeployment: Story = {
130
+ render: () => {
131
+ const deploymentsWithFailure: Deployment[] = [
132
+ {
133
+ id: 'd1',
134
+ status: 'failed',
135
+ environment: 'production',
136
+ branch: 'main',
137
+ commit: 'bad123bad',
138
+ commitMessage: 'fix: Critical security patch',
139
+ author: { name: 'Charlie DevOps' },
140
+ startedAt: new Date(Date.now() - 1800000),
141
+ finishedAt: new Date(Date.now() - 1500000),
142
+ duration: '5m 0s',
143
+ },
144
+ ...defaultDeployments,
145
+ ]
146
+
147
+ return (
148
+ <div className="p-6">
149
+ <DeploymentDashboard
150
+ deployments={deploymentsWithFailure}
151
+ pipelines={defaultPipelines}
152
+ environments={defaultEnvironments}
153
+ onRetry={(id) => console.log('Retry:', id)}
154
+ onDeploy={(env, branch) => console.log('Deploy:', env, branch)}
155
+ />
156
+ </div>
157
+ )
158
+ },
159
+ }
160
+
161
+ export const ActiveDeployments: Story = {
162
+ render: () => {
163
+ const activeDeployments: Deployment[] = [
164
+ {
165
+ id: 'd1',
166
+ status: 'deploying',
167
+ environment: 'production',
168
+ branch: 'main',
169
+ commit: 'abc123def',
170
+ commitMessage: 'feat: Major feature release v2.0',
171
+ author: { name: 'Dana PM' },
172
+ startedAt: new Date(Date.now() - 120000),
173
+ },
174
+ {
175
+ id: 'd2',
176
+ status: 'building',
177
+ environment: 'staging',
178
+ branch: 'develop',
179
+ commit: 'def456ghi',
180
+ commitMessage: 'chore: Update dependencies',
181
+ author: { name: 'Eve DevOps' },
182
+ startedAt: new Date(Date.now() - 60000),
183
+ },
184
+ ]
185
+
186
+ return (
187
+ <div className="p-6">
188
+ <DeploymentDashboard
189
+ deployments={activeDeployments}
190
+ pipelines={defaultPipelines}
191
+ environments={defaultEnvironments}
192
+ onCancel={(id) => console.log('Cancel:', id)}
193
+ onDeploy={(env, branch) => console.log('Deploy:', env, branch)}
194
+ />
195
+ </div>
196
+ )
197
+ },
198
+ }
199
+
200
+ export const MultiplePipelines: Story = {
201
+ render: () => {
202
+ const pipelines: Pipeline[] = [
203
+ {
204
+ id: 'p1',
205
+ name: 'Production Release',
206
+ status: 'building',
207
+ trigger: 'push to main',
208
+ branch: 'main',
209
+ startedAt: new Date(Date.now() - 300000),
210
+ stages: [
211
+ { id: 's1', name: 'Build', status: 'success', duration: '2m 15s' },
212
+ { id: 's2', name: 'Test', status: 'success', duration: '4m 30s' },
213
+ { id: 's3', name: 'Security', status: 'building' },
214
+ { id: 's4', name: 'Deploy', status: 'pending' },
215
+ ],
216
+ },
217
+ {
218
+ id: 'p2',
219
+ name: 'Feature Branch CI',
220
+ status: 'success',
221
+ trigger: 'pull_request',
222
+ branch: 'feature/new-api',
223
+ startedAt: new Date(Date.now() - 600000),
224
+ stages: [
225
+ { id: 's1', name: 'Build', status: 'success', duration: '1m 45s' },
226
+ { id: 's2', name: 'Test', status: 'success', duration: '3m 20s' },
227
+ { id: 's3', name: 'Lint', status: 'success', duration: '0m 45s' },
228
+ ],
229
+ },
230
+ {
231
+ id: 'p3',
232
+ name: 'Nightly Build',
233
+ status: 'failed',
234
+ trigger: 'scheduled',
235
+ branch: 'develop',
236
+ startedAt: new Date(Date.now() - 3600000 * 8),
237
+ stages: [
238
+ { id: 's1', name: 'Build', status: 'success', duration: '2m 0s' },
239
+ { id: 's2', name: 'E2E Tests', status: 'failed', duration: '15m 0s' },
240
+ { id: 's3', name: 'Report', status: 'skipped' },
241
+ ],
242
+ },
243
+ ]
244
+
245
+ return (
246
+ <div className="p-6">
247
+ <DeploymentDashboard
248
+ deployments={defaultDeployments}
249
+ pipelines={pipelines}
250
+ environments={defaultEnvironments}
251
+ onDeploy={(env, branch) => console.log('Deploy:', env, branch)}
252
+ />
253
+ </div>
254
+ )
255
+ },
256
+ }
257
+
258
+ export const DegradedEnvironment: Story = {
259
+ render: () => {
260
+ const environments: EnvironmentStatus[] = [
261
+ {
262
+ name: 'production',
263
+ status: 'healthy',
264
+ url: 'https://app.example.com',
265
+ uptime: '99.9%',
266
+ responseTime: '100ms',
267
+ },
268
+ {
269
+ name: 'staging',
270
+ status: 'degraded',
271
+ url: 'https://staging.example.com',
272
+ uptime: '95%',
273
+ responseTime: '850ms',
274
+ },
275
+ {
276
+ name: 'development',
277
+ status: 'down',
278
+ url: 'https://dev.example.com',
279
+ uptime: '0%',
280
+ responseTime: 'N/A',
281
+ },
282
+ ]
283
+
284
+ return (
285
+ <div className="p-6">
286
+ <DeploymentDashboard
287
+ deployments={defaultDeployments}
288
+ pipelines={defaultPipelines}
289
+ environments={environments}
290
+ onDeploy={(env, branch) => console.log('Deploy:', env, branch)}
291
+ />
292
+ </div>
293
+ )
294
+ },
295
+ }
296
+
297
+ export const CustomBranches: Story = {
298
+ render: () => (
299
+ <div className="p-6">
300
+ <DeploymentDashboard
301
+ deployments={defaultDeployments}
302
+ pipelines={defaultPipelines}
303
+ environments={defaultEnvironments}
304
+ branches={['main', 'develop', 'release/v2.0', 'hotfix/critical-bug', 'feature/new-dashboard']}
305
+ onDeploy={(env, branch) => console.log('Deploy:', env, branch)}
306
+ />
307
+ </div>
308
+ ),
309
+ }
310
+
311
+ export const Interactive: Story = {
312
+ render: () => {
313
+ const [deployments, setDeployments] = React.useState<Deployment[]>(defaultDeployments)
314
+ const [deploying, setDeploying] = React.useState(false)
315
+
316
+ const handleDeploy = async (environment: Environment, branch: string) => {
317
+ setDeploying(true)
318
+ const newDeployment: Deployment = {
319
+ id: `d-${Date.now()}`,
320
+ status: 'building',
321
+ environment,
322
+ branch,
323
+ commit: Math.random().toString(36).substring(7),
324
+ commitMessage: `Deploy ${branch} to ${environment}`,
325
+ author: { name: 'Current User' },
326
+ startedAt: new Date(),
327
+ }
328
+ setDeployments(prev => [newDeployment, ...prev])
329
+
330
+ // Simulate build phase
331
+ await new Promise(r => setTimeout(r, 2000))
332
+ setDeployments(prev =>
333
+ prev.map(d =>
334
+ d.id === newDeployment.id ? { ...d, status: 'deploying' as const } : d
335
+ )
336
+ )
337
+
338
+ // Simulate deploy phase
339
+ await new Promise(r => setTimeout(r, 2000))
340
+ setDeployments(prev =>
341
+ prev.map(d =>
342
+ d.id === newDeployment.id
343
+ ? {
344
+ ...d,
345
+ status: 'success' as const,
346
+ finishedAt: new Date(),
347
+ duration: '4s',
348
+ url: `https://${environment}.example.com`,
349
+ }
350
+ : d
351
+ )
352
+ )
353
+ setDeploying(false)
354
+ }
355
+
356
+ const handleRollback = (id: string) => {
357
+ setDeployments(prev =>
358
+ prev.map(d =>
359
+ d.id === id ? { ...d, status: 'rollback' as const } : d
360
+ )
361
+ )
362
+ alert(`Rolling back deployment ${id}`)
363
+ }
364
+
365
+ const handleCancel = (id: string) => {
366
+ setDeployments(prev =>
367
+ prev.map(d =>
368
+ d.id === id ? { ...d, status: 'cancelled' as const } : d
369
+ )
370
+ )
371
+ }
372
+
373
+ return (
374
+ <div className="p-6">
375
+ <DeploymentDashboard
376
+ deployments={deployments}
377
+ pipelines={defaultPipelines}
378
+ environments={defaultEnvironments}
379
+ onDeploy={handleDeploy}
380
+ onRollback={handleRollback}
381
+ onCancel={handleCancel}
382
+ onRetry={(id) => console.log('Retry:', id)}
383
+ />
384
+ </div>
385
+ )
386
+ },
387
+ }
388
+
389
+ export const ManyDeployments: Story = {
390
+ render: () => {
391
+ const manyDeployments: Deployment[] = Array.from({ length: 20 }, (_, i) => ({
392
+ id: `d-${i}`,
393
+ status: (['success', 'failed', 'success', 'success', 'cancelled'] as const)[i % 5],
394
+ environment: (['production', 'staging', 'development'] as const)[i % 3],
395
+ branch: ['main', 'develop', 'feature/test', 'hotfix/bug'][i % 4],
396
+ commit: Math.random().toString(36).substring(2, 9),
397
+ commitMessage: [
398
+ 'feat: Add new feature',
399
+ 'fix: Bug fix',
400
+ 'chore: Update deps',
401
+ 'refactor: Clean code',
402
+ 'docs: Update README',
403
+ ][i % 5],
404
+ author: {
405
+ name: ['Alice', 'Bob', 'Charlie', 'Diana', 'Eve'][i % 5],
406
+ },
407
+ startedAt: new Date(Date.now() - i * 3600000),
408
+ finishedAt: new Date(Date.now() - i * 3600000 + 300000),
409
+ duration: `${Math.floor(Math.random() * 10) + 1}m ${Math.floor(Math.random() * 60)}s`,
410
+ }))
411
+
412
+ return (
413
+ <div className="p-6">
414
+ <DeploymentDashboard
415
+ deployments={manyDeployments}
416
+ pipelines={defaultPipelines}
417
+ environments={defaultEnvironments}
418
+ onDeploy={(env, branch) => console.log('Deploy:', env, branch)}
419
+ onRollback={(id) => console.log('Rollback:', id)}
420
+ />
421
+ </div>
422
+ )
423
+ },
424
+ }
425
+
426
+ export const ProductionDashboard: Story = {
427
+ render: () => (
428
+ <div className="min-h-screen bg-muted/30">
429
+ <header className="bg-background border-b px-6 py-4">
430
+ <div className="flex items-center justify-between">
431
+ <div>
432
+ <h1 className="font-bold text-xl">DevOps Portal</h1>
433
+ <p className="text-sm text-muted-foreground">Acme Corp Infrastructure</p>
434
+ </div>
435
+ <nav className="flex gap-4 text-sm">
436
+ <a href="#" className="text-foreground font-medium">Deployments</a>
437
+ <a href="#" className="text-muted-foreground hover:text-foreground">Monitoring</a>
438
+ <a href="#" className="text-muted-foreground hover:text-foreground">Logs</a>
439
+ <a href="#" className="text-muted-foreground hover:text-foreground">Settings</a>
440
+ </nav>
441
+ </div>
442
+ </header>
443
+ <main className="p-6">
444
+ <DeploymentDashboard
445
+ deployments={defaultDeployments}
446
+ pipelines={defaultPipelines}
447
+ environments={defaultEnvironments}
448
+ branches={['main', 'develop', 'release/v2.1.0', 'hotfix/auth-fix']}
449
+ onDeploy={(env, branch) => console.log('Deploy:', env, branch)}
450
+ onRollback={(id) => console.log('Rollback:', id)}
451
+ onCancel={(id) => console.log('Cancel:', id)}
452
+ onRetry={(id) => console.log('Retry:', id)}
453
+ />
454
+ </main>
455
+ </div>
456
+ ),
457
+ }