@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,499 @@
1
+ import type { Meta, StoryObj } from '@storybook/react'
2
+ import {
3
+ CICDBuilder,
4
+ defaultPipeline,
5
+ } from './index'
6
+ import type { Pipeline, PipelineStage, PipelineStep, StepType, StepStatus } from './index'
7
+ import * as React from 'react'
8
+
9
+ const meta: Meta<typeof CICDBuilder> = {
10
+ title: 'Blocks/CICDBuilder',
11
+ component: CICDBuilder,
12
+ parameters: {
13
+ layout: 'fullscreen',
14
+ docs: {
15
+ description: {
16
+ component:
17
+ 'A CI/CD pipeline builder for creating and visualizing build, test, and deployment pipelines with drag-and-drop stages, step configuration, and YAML/JSON export.',
18
+ },
19
+ },
20
+ },
21
+ tags: ['autodocs'],
22
+ }
23
+
24
+ export default meta
25
+ type Story = StoryObj<typeof CICDBuilder>
26
+
27
+ export const Default: Story = {
28
+ render: () => (
29
+ <div className="p-6">
30
+ <CICDBuilder
31
+ pipeline={defaultPipeline}
32
+ onPipelineChange={(pipeline) => console.log('Pipeline changed:', pipeline)}
33
+ onRun={() => console.log('Run pipeline')}
34
+ onSave={() => console.log('Save pipeline')}
35
+ onExport={(format) => console.log('Export as:', format)}
36
+ />
37
+ </div>
38
+ ),
39
+ }
40
+
41
+ export const EmptyPipeline: Story = {
42
+ render: () => {
43
+ const emptyPipeline: Pipeline = {
44
+ id: 'new',
45
+ name: 'New Pipeline',
46
+ description: 'Configure your CI/CD pipeline',
47
+ stages: [],
48
+ }
49
+
50
+ return (
51
+ <div className="p-6">
52
+ <CICDBuilder
53
+ pipeline={emptyPipeline}
54
+ onPipelineChange={(pipeline) => console.log('Pipeline changed:', pipeline)}
55
+ onRun={() => console.log('Run pipeline')}
56
+ onSave={() => console.log('Save pipeline')}
57
+ />
58
+ </div>
59
+ )
60
+ },
61
+ }
62
+
63
+ export const ReadOnly: Story = {
64
+ render: () => (
65
+ <div className="p-6">
66
+ <CICDBuilder
67
+ pipeline={defaultPipeline}
68
+ readOnly
69
+ onRun={() => console.log('Run pipeline')}
70
+ onExport={(format) => console.log('Export as:', format)}
71
+ />
72
+ </div>
73
+ ),
74
+ }
75
+
76
+ export const PipelineRunning: Story = {
77
+ render: () => {
78
+ const runningPipeline: Pipeline = {
79
+ ...defaultPipeline,
80
+ stages: defaultPipeline.stages.map((stage, index) => ({
81
+ ...stage,
82
+ status: index === 0 ? 'success' : index === 1 ? 'running' : 'pending',
83
+ steps: stage.steps.map((step, stepIndex) => ({
84
+ ...step,
85
+ status: index === 0
86
+ ? 'success'
87
+ : index === 1
88
+ ? stepIndex === 0 ? 'success' : stepIndex === 1 ? 'running' : 'pending'
89
+ : 'pending',
90
+ })),
91
+ })),
92
+ }
93
+
94
+ return (
95
+ <div className="p-6">
96
+ <CICDBuilder
97
+ pipeline={runningPipeline}
98
+ readOnly
99
+ onExport={(format) => console.log('Export as:', format)}
100
+ />
101
+ </div>
102
+ )
103
+ },
104
+ }
105
+
106
+ export const PipelineFailed: Story = {
107
+ render: () => {
108
+ const failedPipeline: Pipeline = {
109
+ ...defaultPipeline,
110
+ stages: defaultPipeline.stages.map((stage, index) => ({
111
+ ...stage,
112
+ status: index < 2 ? 'success' : index === 2 ? 'failed' : 'skipped',
113
+ steps: stage.steps.map((step, stepIndex) => ({
114
+ ...step,
115
+ status: index < 2
116
+ ? 'success'
117
+ : index === 2
118
+ ? stepIndex === 0 ? 'success' : stepIndex === 1 ? 'failed' : 'skipped'
119
+ : 'skipped',
120
+ })),
121
+ })),
122
+ }
123
+
124
+ return (
125
+ <div className="p-6">
126
+ <CICDBuilder
127
+ pipeline={failedPipeline}
128
+ readOnly
129
+ onRun={() => console.log('Retry pipeline')}
130
+ onExport={(format) => console.log('Export as:', format)}
131
+ />
132
+ </div>
133
+ )
134
+ },
135
+ }
136
+
137
+ export const PipelineSuccess: Story = {
138
+ render: () => {
139
+ const successPipeline: Pipeline = {
140
+ ...defaultPipeline,
141
+ stages: defaultPipeline.stages.map(stage => ({
142
+ ...stage,
143
+ status: 'success' as StepStatus,
144
+ steps: stage.steps.map(step => ({
145
+ ...step,
146
+ status: 'success' as StepStatus,
147
+ })),
148
+ })),
149
+ }
150
+
151
+ return (
152
+ <div className="p-6">
153
+ <CICDBuilder
154
+ pipeline={successPipeline}
155
+ readOnly
156
+ onRun={() => console.log('Run again')}
157
+ onExport={(format) => console.log('Export as:', format)}
158
+ />
159
+ </div>
160
+ )
161
+ },
162
+ }
163
+
164
+ export const SimplePipeline: Story = {
165
+ render: () => {
166
+ const simplePipeline: Pipeline = {
167
+ id: 'simple',
168
+ name: 'Simple Build & Deploy',
169
+ trigger: {
170
+ branches: ['main'],
171
+ events: ['push'],
172
+ },
173
+ stages: [
174
+ {
175
+ id: 'build',
176
+ name: 'Build',
177
+ steps: [
178
+ { id: 'install', name: 'Install', type: 'script', command: 'npm install' },
179
+ { id: 'build', name: 'Build', type: 'build', command: 'npm run build' },
180
+ ],
181
+ },
182
+ {
183
+ id: 'deploy',
184
+ name: 'Deploy',
185
+ steps: [
186
+ { id: 'deploy', name: 'Deploy to Production', type: 'deploy', command: 'npm run deploy' },
187
+ ],
188
+ },
189
+ ],
190
+ }
191
+
192
+ return (
193
+ <div className="p-6">
194
+ <CICDBuilder
195
+ pipeline={simplePipeline}
196
+ onPipelineChange={(pipeline) => console.log('Pipeline changed:', pipeline)}
197
+ onRun={() => console.log('Run pipeline')}
198
+ onSave={() => console.log('Save pipeline')}
199
+ />
200
+ </div>
201
+ )
202
+ },
203
+ }
204
+
205
+ export const ComplexPipeline: Story = {
206
+ render: () => {
207
+ const complexPipeline: Pipeline = {
208
+ id: 'complex',
209
+ name: 'Full CI/CD Pipeline',
210
+ description: 'Complete pipeline with all stages',
211
+ trigger: {
212
+ branches: ['main', 'develop', 'release/*'],
213
+ events: ['push', 'pull_request', 'tag'],
214
+ schedule: '0 2 * * *',
215
+ },
216
+ stages: [
217
+ {
218
+ id: 'prepare',
219
+ name: 'Prepare',
220
+ steps: [
221
+ { id: 'checkout', name: 'Checkout Code', type: 'script', command: 'git checkout $BRANCH' },
222
+ { id: 'cache-restore', name: 'Restore Cache', type: 'cache' },
223
+ { id: 'install', name: 'Install Dependencies', type: 'script', command: 'npm ci' },
224
+ ],
225
+ },
226
+ {
227
+ id: 'build',
228
+ name: 'Build',
229
+ steps: [
230
+ { id: 'lint', name: 'Lint', type: 'script', command: 'npm run lint' },
231
+ { id: 'build', name: 'Build', type: 'build', command: 'npm run build' },
232
+ { id: 'cache-save', name: 'Save Cache', type: 'cache' },
233
+ ],
234
+ },
235
+ {
236
+ id: 'test',
237
+ name: 'Test',
238
+ steps: [
239
+ { id: 'unit', name: 'Unit Tests', type: 'test', command: 'npm run test:unit' },
240
+ { id: 'integration', name: 'Integration Tests', type: 'test', command: 'npm run test:integration' },
241
+ { id: 'e2e', name: 'E2E Tests', type: 'test', command: 'npm run test:e2e', timeout: 600 },
242
+ { id: 'coverage', name: 'Coverage Report', type: 'artifact', artifacts: ['coverage/**'] },
243
+ ],
244
+ },
245
+ {
246
+ id: 'security',
247
+ name: 'Security',
248
+ steps: [
249
+ { id: 'sast', name: 'SAST Scan', type: 'script', command: 'npm run security:sast' },
250
+ { id: 'deps', name: 'Dependency Audit', type: 'script', command: 'npm audit --audit-level=high' },
251
+ { id: 'secrets', name: 'Secret Scanning', type: 'script', command: 'gitleaks detect' },
252
+ ],
253
+ },
254
+ {
255
+ id: 'package',
256
+ name: 'Package',
257
+ steps: [
258
+ { id: 'docker', name: 'Build Docker Image', type: 'docker', image: 'app:$CI_COMMIT_SHA' },
259
+ { id: 'push', name: 'Push to Registry', type: 'script', command: 'docker push $REGISTRY/app:$CI_COMMIT_SHA' },
260
+ { id: 'artifact', name: 'Upload Artifacts', type: 'artifact', artifacts: ['dist/**', 'build/**'] },
261
+ ],
262
+ },
263
+ {
264
+ id: 'deploy-staging',
265
+ name: 'Deploy Staging',
266
+ steps: [
267
+ { id: 'deploy', name: 'Deploy to Staging', type: 'deploy', command: 'kubectl apply -f k8s/staging/' },
268
+ { id: 'smoke', name: 'Smoke Tests', type: 'test', command: 'npm run test:smoke -- --env=staging' },
269
+ { id: 'notify', name: 'Notify Team', type: 'notify' },
270
+ ],
271
+ },
272
+ {
273
+ id: 'deploy-prod',
274
+ name: 'Deploy Production',
275
+ steps: [
276
+ { id: 'approval', name: 'Approval Gate', type: 'approval', condition: "$CI_COMMIT_BRANCH == 'main'" },
277
+ { id: 'deploy', name: 'Deploy to Production', type: 'deploy', command: 'kubectl apply -f k8s/production/' },
278
+ { id: 'verify', name: 'Verify Deployment', type: 'test', command: 'npm run test:smoke -- --env=production' },
279
+ { id: 'notify', name: 'Notify Stakeholders', type: 'notify' },
280
+ ],
281
+ },
282
+ ],
283
+ variables: {
284
+ NODE_ENV: 'production',
285
+ REGISTRY: 'gcr.io/my-project',
286
+ KUBECONFIG: '/secrets/kubeconfig',
287
+ },
288
+ }
289
+
290
+ return (
291
+ <div className="p-6">
292
+ <CICDBuilder
293
+ pipeline={complexPipeline}
294
+ onPipelineChange={(pipeline) => console.log('Pipeline changed:', pipeline)}
295
+ onRun={() => console.log('Run pipeline')}
296
+ onSave={() => console.log('Save pipeline')}
297
+ onExport={(format) => console.log('Export as:', format)}
298
+ />
299
+ </div>
300
+ )
301
+ },
302
+ }
303
+
304
+ export const DockerPipeline: Story = {
305
+ render: () => {
306
+ const dockerPipeline: Pipeline = {
307
+ id: 'docker',
308
+ name: 'Docker Build & Push',
309
+ trigger: {
310
+ branches: ['main'],
311
+ events: ['push', 'tag'],
312
+ },
313
+ stages: [
314
+ {
315
+ id: 'build',
316
+ name: 'Build Image',
317
+ steps: [
318
+ { id: 'docker-build', name: 'Build Docker Image', type: 'docker', image: 'myapp:$CI_COMMIT_SHA' },
319
+ { id: 'docker-tag', name: 'Tag Image', type: 'script', command: 'docker tag myapp:$CI_COMMIT_SHA myapp:latest' },
320
+ ],
321
+ },
322
+ {
323
+ id: 'test',
324
+ name: 'Test',
325
+ steps: [
326
+ { id: 'container-test', name: 'Container Tests', type: 'test', command: 'docker run myapp:$CI_COMMIT_SHA npm test' },
327
+ { id: 'security-scan', name: 'Security Scan', type: 'script', command: 'trivy image myapp:$CI_COMMIT_SHA' },
328
+ ],
329
+ },
330
+ {
331
+ id: 'push',
332
+ name: 'Push',
333
+ steps: [
334
+ { id: 'login', name: 'Login to Registry', type: 'script', command: 'docker login -u $DOCKER_USER -p $DOCKER_PASS' },
335
+ { id: 'push', name: 'Push to Registry', type: 'script', command: 'docker push myregistry/myapp:$CI_COMMIT_SHA' },
336
+ ],
337
+ },
338
+ ],
339
+ }
340
+
341
+ return (
342
+ <div className="p-6">
343
+ <CICDBuilder
344
+ pipeline={dockerPipeline}
345
+ onPipelineChange={(pipeline) => console.log('Pipeline changed:', pipeline)}
346
+ onRun={() => console.log('Run pipeline')}
347
+ onSave={() => console.log('Save pipeline')}
348
+ />
349
+ </div>
350
+ )
351
+ },
352
+ }
353
+
354
+ export const Interactive: Story = {
355
+ render: () => {
356
+ const [pipeline, setPipeline] = React.useState<Pipeline>(defaultPipeline)
357
+
358
+ const handleRun = () => {
359
+ // Simulate pipeline execution
360
+ const stages = pipeline.stages.map(stage => ({
361
+ ...stage,
362
+ status: 'pending' as StepStatus,
363
+ steps: stage.steps.map(step => ({ ...step, status: 'pending' as StepStatus })),
364
+ }))
365
+ setPipeline({ ...pipeline, stages })
366
+
367
+ // Simulate progress
368
+ let stageIndex = 0
369
+ let stepIndex = 0
370
+
371
+ const interval = setInterval(() => {
372
+ setPipeline(prev => {
373
+ const newStages = [...prev.stages]
374
+
375
+ if (stageIndex < newStages.length) {
376
+ const stage = { ...newStages[stageIndex] }
377
+ const steps = [...stage.steps]
378
+
379
+ if (stepIndex < steps.length) {
380
+ steps[stepIndex] = { ...steps[stepIndex], status: 'running' }
381
+ if (stepIndex > 0) {
382
+ steps[stepIndex - 1] = { ...steps[stepIndex - 1], status: 'success' }
383
+ }
384
+ stage.steps = steps
385
+ stage.status = 'running'
386
+ newStages[stageIndex] = stage
387
+ stepIndex++
388
+ } else {
389
+ steps[steps.length - 1] = { ...steps[steps.length - 1], status: 'success' }
390
+ stage.steps = steps
391
+ stage.status = 'success'
392
+ newStages[stageIndex] = stage
393
+ stageIndex++
394
+ stepIndex = 0
395
+ }
396
+ } else {
397
+ clearInterval(interval)
398
+ }
399
+
400
+ return { ...prev, stages: newStages }
401
+ })
402
+ }, 1000)
403
+ }
404
+
405
+ const handleExport = (format: 'yaml' | 'json') => {
406
+ const content = format === 'json'
407
+ ? JSON.stringify(pipeline, null, 2)
408
+ : `# Pipeline: ${pipeline.name}\nstages:\n${pipeline.stages.map(s => ` - ${s.name}`).join('\n')}`
409
+
410
+ alert(`Exported as ${format.toUpperCase()}:\n\n${content.slice(0, 500)}...`)
411
+ }
412
+
413
+ return (
414
+ <div className="p-6">
415
+ <CICDBuilder
416
+ pipeline={pipeline}
417
+ onPipelineChange={setPipeline}
418
+ onRun={handleRun}
419
+ onSave={() => alert('Pipeline saved!')}
420
+ onExport={handleExport}
421
+ />
422
+ </div>
423
+ )
424
+ },
425
+ }
426
+
427
+ export const PipelineBuilder: Story = {
428
+ render: () => (
429
+ <div className="min-h-screen bg-muted/30">
430
+ <header className="bg-background border-b px-6 py-4">
431
+ <div className="flex items-center justify-between">
432
+ <div>
433
+ <h1 className="font-bold text-xl">Pipeline Builder</h1>
434
+ <p className="text-sm text-muted-foreground">Create and manage CI/CD pipelines</p>
435
+ </div>
436
+ <nav className="flex gap-4 text-sm">
437
+ <a href="#" className="text-foreground font-medium">Editor</a>
438
+ <a href="#" className="text-muted-foreground hover:text-foreground">Runs</a>
439
+ <a href="#" className="text-muted-foreground hover:text-foreground">Triggers</a>
440
+ <a href="#" className="text-muted-foreground hover:text-foreground">Variables</a>
441
+ </nav>
442
+ </div>
443
+ </header>
444
+ <main className="p-6">
445
+ <CICDBuilder
446
+ pipeline={defaultPipeline}
447
+ onPipelineChange={(pipeline) => console.log('Pipeline changed:', pipeline)}
448
+ onRun={() => console.log('Run pipeline')}
449
+ onSave={() => console.log('Save pipeline')}
450
+ onExport={(format) => console.log('Export as:', format)}
451
+ />
452
+ </main>
453
+ </div>
454
+ ),
455
+ }
456
+
457
+ export const GitHubActionsStyle: Story = {
458
+ render: () => {
459
+ const ghaPipeline: Pipeline = {
460
+ id: 'gha',
461
+ name: 'CI',
462
+ trigger: {
463
+ branches: ['main', 'develop'],
464
+ events: ['push', 'pull_request'],
465
+ },
466
+ stages: [
467
+ {
468
+ id: 'build',
469
+ name: 'build',
470
+ steps: [
471
+ { id: 'checkout', name: 'Checkout', type: 'script', command: 'actions/checkout@v4' },
472
+ { id: 'setup', name: 'Setup Node.js', type: 'script', command: 'actions/setup-node@v4' },
473
+ { id: 'install', name: 'Install', type: 'script', command: 'npm ci' },
474
+ { id: 'build', name: 'Build', type: 'build', command: 'npm run build' },
475
+ ],
476
+ },
477
+ {
478
+ id: 'test',
479
+ name: 'test',
480
+ steps: [
481
+ { id: 'test', name: 'Run Tests', type: 'test', command: 'npm test' },
482
+ { id: 'upload', name: 'Upload Coverage', type: 'artifact', artifacts: ['coverage/**'] },
483
+ ],
484
+ },
485
+ ],
486
+ }
487
+
488
+ return (
489
+ <div className="p-6">
490
+ <CICDBuilder
491
+ pipeline={ghaPipeline}
492
+ onPipelineChange={(pipeline) => console.log('Pipeline changed:', pipeline)}
493
+ onRun={() => console.log('Run workflow')}
494
+ onExport={(format) => console.log('Export as:', format)}
495
+ />
496
+ </div>
497
+ )
498
+ },
499
+ }