@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,529 @@
1
+ import type { Meta, StoryObj } from '@storybook/react'
2
+ import {
3
+ GitOpsSyncStatus,
4
+ defaultGitOpsApplications,
5
+ } from './index'
6
+ import type { GitOpsApplication, GitOpsResource, SyncStatus, HealthStatus, ResourceKind } from './index'
7
+ import * as React from 'react'
8
+
9
+ const meta: Meta<typeof GitOpsSyncStatus> = {
10
+ title: 'Blocks/GitOpsSyncStatus',
11
+ component: GitOpsSyncStatus,
12
+ parameters: {
13
+ layout: 'fullscreen',
14
+ docs: {
15
+ description: {
16
+ component:
17
+ 'A GitOps synchronization dashboard for monitoring ArgoCD/Flux-style applications with sync status, health status, Git revision tracking, and resource-level details.',
18
+ },
19
+ },
20
+ },
21
+ tags: ['autodocs'],
22
+ }
23
+
24
+ export default meta
25
+ type Story = StoryObj<typeof GitOpsSyncStatus>
26
+
27
+ export const Default: Story = {
28
+ render: () => (
29
+ <div className="p-6">
30
+ <GitOpsSyncStatus
31
+ applications={defaultGitOpsApplications}
32
+ onSync={(app) => console.log('Sync:', app.name)}
33
+ onSuspend={(app) => console.log('Suspend:', app.name)}
34
+ onResume={(app) => console.log('Resume:', app.name)}
35
+ onViewDetails={(app) => console.log('View details:', app.name)}
36
+ onRefresh={() => console.log('Refresh all')}
37
+ />
38
+ </div>
39
+ ),
40
+ }
41
+
42
+ export const AllSynced: Story = {
43
+ render: () => {
44
+ const syncedApps: GitOpsApplication[] = [
45
+ {
46
+ id: '1',
47
+ name: 'frontend-app',
48
+ project: 'production',
49
+ repo: { url: 'https://github.com/org/apps', branch: 'main', path: 'apps/frontend' },
50
+ destination: { server: 'https://kubernetes.default.svc', namespace: 'production' },
51
+ syncStatus: 'synced',
52
+ healthStatus: 'healthy',
53
+ lastSyncedAt: new Date(Date.now() - 2 * 60000),
54
+ lastSyncedRevision: 'abc123def',
55
+ autoSync: true,
56
+ resources: [
57
+ { kind: 'Deployment', name: 'frontend', namespace: 'production', syncStatus: 'synced', healthStatus: 'healthy' },
58
+ { kind: 'Service', name: 'frontend', namespace: 'production', syncStatus: 'synced', healthStatus: 'healthy' },
59
+ { kind: 'Ingress', name: 'frontend', namespace: 'production', syncStatus: 'synced', healthStatus: 'healthy' },
60
+ ],
61
+ },
62
+ {
63
+ id: '2',
64
+ name: 'backend-api',
65
+ project: 'production',
66
+ repo: { url: 'https://github.com/org/apps', branch: 'main', path: 'apps/backend' },
67
+ destination: { server: 'https://kubernetes.default.svc', namespace: 'production' },
68
+ syncStatus: 'synced',
69
+ healthStatus: 'healthy',
70
+ lastSyncedAt: new Date(Date.now() - 5 * 60000),
71
+ lastSyncedRevision: 'def456ghi',
72
+ autoSync: true,
73
+ resources: [
74
+ { kind: 'Deployment', name: 'backend', namespace: 'production', syncStatus: 'synced', healthStatus: 'healthy' },
75
+ { kind: 'Service', name: 'backend', namespace: 'production', syncStatus: 'synced', healthStatus: 'healthy' },
76
+ { kind: 'ConfigMap', name: 'backend-config', namespace: 'production', syncStatus: 'synced', healthStatus: 'healthy' },
77
+ { kind: 'Secret', name: 'backend-secrets', namespace: 'production', syncStatus: 'synced', healthStatus: 'healthy' },
78
+ ],
79
+ },
80
+ {
81
+ id: '3',
82
+ name: 'database-operator',
83
+ project: 'system',
84
+ repo: { url: 'https://github.com/org/infra', branch: 'main', path: 'operators/database' },
85
+ destination: { server: 'https://kubernetes.default.svc', namespace: 'operators' },
86
+ syncStatus: 'synced',
87
+ healthStatus: 'healthy',
88
+ lastSyncedAt: new Date(Date.now() - 10 * 60000),
89
+ lastSyncedRevision: 'ghi789jkl',
90
+ autoSync: true,
91
+ resources: [
92
+ { kind: 'Deployment', name: 'db-operator', namespace: 'operators', syncStatus: 'synced', healthStatus: 'healthy' },
93
+ { kind: 'Service', name: 'db-operator', namespace: 'operators', syncStatus: 'synced', healthStatus: 'healthy' },
94
+ ],
95
+ },
96
+ ]
97
+
98
+ return (
99
+ <div className="p-6">
100
+ <GitOpsSyncStatus
101
+ applications={syncedApps}
102
+ onSync={(app) => console.log('Sync:', app.name)}
103
+ onRefresh={() => console.log('Refresh all')}
104
+ />
105
+ </div>
106
+ )
107
+ },
108
+ }
109
+
110
+ export const WithFailedSync: Story = {
111
+ render: () => {
112
+ const failedApps: GitOpsApplication[] = [
113
+ {
114
+ id: '1',
115
+ name: 'broken-deployment',
116
+ project: 'production',
117
+ repo: { url: 'https://github.com/org/apps', branch: 'main', path: 'apps/broken' },
118
+ destination: { server: 'https://kubernetes.default.svc', namespace: 'production' },
119
+ syncStatus: 'failed',
120
+ healthStatus: 'degraded',
121
+ lastSyncedAt: new Date(Date.now() - 15 * 60000),
122
+ lastSyncedRevision: 'broken123',
123
+ message: 'ComparisonError: failed to load resource: Secret not found: missing-secret',
124
+ autoSync: false,
125
+ resources: [
126
+ { kind: 'Deployment', name: 'broken-app', namespace: 'production', syncStatus: 'failed', healthStatus: 'degraded', message: 'ImagePullBackOff' },
127
+ { kind: 'Service', name: 'broken-app', namespace: 'production', syncStatus: 'synced', healthStatus: 'healthy' },
128
+ { kind: 'Secret', name: 'missing-secret', namespace: 'production', syncStatus: 'failed', healthStatus: 'missing', message: 'Secret not found' },
129
+ ],
130
+ },
131
+ ...defaultGitOpsApplications,
132
+ ]
133
+
134
+ return (
135
+ <div className="p-6">
136
+ <GitOpsSyncStatus
137
+ applications={failedApps}
138
+ onSync={(app) => console.log('Sync:', app.name)}
139
+ onViewDetails={(app) => console.log('View details:', app.name)}
140
+ onRefresh={() => console.log('Refresh all')}
141
+ />
142
+ </div>
143
+ )
144
+ },
145
+ }
146
+
147
+ export const OutOfSync: Story = {
148
+ render: () => {
149
+ const outOfSyncApps: GitOpsApplication[] = [
150
+ {
151
+ id: '1',
152
+ name: 'pending-update-1',
153
+ project: 'production',
154
+ repo: { url: 'https://github.com/org/apps', branch: 'main', path: 'apps/service-a' },
155
+ destination: { server: 'https://kubernetes.default.svc', namespace: 'production' },
156
+ syncStatus: 'out_of_sync',
157
+ healthStatus: 'healthy',
158
+ lastSyncedAt: new Date(Date.now() - 2 * 3600000),
159
+ lastSyncedRevision: 'old123456',
160
+ targetRevision: 'new789abc',
161
+ autoSync: false,
162
+ resources: [
163
+ { kind: 'Deployment', name: 'service-a', namespace: 'production', syncStatus: 'out_of_sync', healthStatus: 'healthy', version: 'v1.2.0 -> v1.3.0' },
164
+ { kind: 'ConfigMap', name: 'service-a-config', namespace: 'production', syncStatus: 'out_of_sync', healthStatus: 'healthy' },
165
+ { kind: 'Service', name: 'service-a', namespace: 'production', syncStatus: 'synced', healthStatus: 'healthy' },
166
+ ],
167
+ },
168
+ {
169
+ id: '2',
170
+ name: 'pending-update-2',
171
+ project: 'production',
172
+ repo: { url: 'https://github.com/org/apps', branch: 'main', path: 'apps/service-b' },
173
+ destination: { server: 'https://kubernetes.default.svc', namespace: 'production' },
174
+ syncStatus: 'out_of_sync',
175
+ healthStatus: 'healthy',
176
+ lastSyncedAt: new Date(Date.now() - 4 * 3600000),
177
+ lastSyncedRevision: 'older1234',
178
+ targetRevision: 'newer5678',
179
+ autoSync: false,
180
+ resources: [
181
+ { kind: 'Deployment', name: 'service-b', namespace: 'production', syncStatus: 'out_of_sync', healthStatus: 'healthy' },
182
+ { kind: 'Secret', name: 'service-b-secrets', namespace: 'production', syncStatus: 'out_of_sync', healthStatus: 'healthy' },
183
+ ],
184
+ },
185
+ ]
186
+
187
+ return (
188
+ <div className="p-6">
189
+ <GitOpsSyncStatus
190
+ applications={outOfSyncApps}
191
+ onSync={(app) => console.log('Sync:', app.name)}
192
+ onViewDetails={(app) => console.log('View details:', app.name)}
193
+ onRefresh={() => console.log('Refresh all')}
194
+ />
195
+ </div>
196
+ )
197
+ },
198
+ }
199
+
200
+ export const ActiveSyncing: Story = {
201
+ render: () => {
202
+ const syncingApps: GitOpsApplication[] = [
203
+ {
204
+ id: '1',
205
+ name: 'deploying-service',
206
+ project: 'production',
207
+ repo: { url: 'https://github.com/org/apps', branch: 'main', path: 'apps/deploying' },
208
+ destination: { server: 'https://kubernetes.default.svc', namespace: 'production' },
209
+ syncStatus: 'syncing',
210
+ healthStatus: 'progressing',
211
+ lastSyncedAt: new Date(Date.now() - 30000),
212
+ lastSyncedRevision: 'syncing123',
213
+ autoSync: true,
214
+ resources: [
215
+ { kind: 'Deployment', name: 'deploying-app', namespace: 'production', syncStatus: 'syncing', healthStatus: 'progressing' },
216
+ { kind: 'Service', name: 'deploying-app', namespace: 'production', syncStatus: 'synced', healthStatus: 'healthy' },
217
+ ],
218
+ },
219
+ {
220
+ id: '2',
221
+ name: 'another-sync',
222
+ project: 'staging',
223
+ repo: { url: 'https://github.com/org/apps', branch: 'develop', path: 'apps/staging' },
224
+ destination: { server: 'https://staging.k8s.example.com', namespace: 'staging' },
225
+ syncStatus: 'syncing',
226
+ healthStatus: 'progressing',
227
+ lastSyncedAt: new Date(Date.now() - 45000),
228
+ lastSyncedRevision: 'sync456',
229
+ autoSync: true,
230
+ resources: [
231
+ { kind: 'Deployment', name: 'staging-app', namespace: 'staging', syncStatus: 'syncing', healthStatus: 'progressing' },
232
+ { kind: 'ConfigMap', name: 'staging-config', namespace: 'staging', syncStatus: 'synced', healthStatus: 'healthy' },
233
+ ],
234
+ },
235
+ ...defaultGitOpsApplications.filter(a => a.syncStatus !== 'syncing'),
236
+ ]
237
+
238
+ return (
239
+ <div className="p-6">
240
+ <GitOpsSyncStatus
241
+ applications={syncingApps}
242
+ onViewDetails={(app) => console.log('View details:', app.name)}
243
+ onRefresh={() => console.log('Refresh all')}
244
+ />
245
+ </div>
246
+ )
247
+ },
248
+ }
249
+
250
+ export const SuspendedApps: Story = {
251
+ render: () => {
252
+ const suspendedApps: GitOpsApplication[] = [
253
+ {
254
+ id: '1',
255
+ name: 'suspended-for-maintenance',
256
+ project: 'production',
257
+ repo: { url: 'https://github.com/org/apps', branch: 'main', path: 'apps/maintenance' },
258
+ destination: { server: 'https://kubernetes.default.svc', namespace: 'production' },
259
+ syncStatus: 'suspended',
260
+ healthStatus: 'healthy',
261
+ lastSyncedAt: new Date(Date.now() - 24 * 3600000),
262
+ lastSyncedRevision: 'suspended1',
263
+ autoSync: true,
264
+ resources: [
265
+ { kind: 'Deployment', name: 'maintenance-app', namespace: 'production', syncStatus: 'synced', healthStatus: 'healthy' },
266
+ ],
267
+ },
268
+ {
269
+ id: '2',
270
+ name: 'manually-paused',
271
+ project: 'production',
272
+ repo: { url: 'https://github.com/org/apps', branch: 'main', path: 'apps/paused' },
273
+ destination: { server: 'https://kubernetes.default.svc', namespace: 'production' },
274
+ syncStatus: 'suspended',
275
+ healthStatus: 'healthy',
276
+ lastSyncedAt: new Date(Date.now() - 48 * 3600000),
277
+ lastSyncedRevision: 'paused123',
278
+ targetRevision: 'new456',
279
+ autoSync: false,
280
+ resources: [
281
+ { kind: 'Deployment', name: 'paused-app', namespace: 'production', syncStatus: 'out_of_sync', healthStatus: 'healthy' },
282
+ ],
283
+ },
284
+ ...defaultGitOpsApplications,
285
+ ]
286
+
287
+ return (
288
+ <div className="p-6">
289
+ <GitOpsSyncStatus
290
+ applications={suspendedApps}
291
+ onSync={(app) => console.log('Sync:', app.name)}
292
+ onSuspend={(app) => console.log('Suspend:', app.name)}
293
+ onResume={(app) => console.log('Resume:', app.name)}
294
+ onRefresh={() => console.log('Refresh all')}
295
+ />
296
+ </div>
297
+ )
298
+ },
299
+ }
300
+
301
+ export const ManyApplications: Story = {
302
+ render: () => {
303
+ const generateApp = (index: number): GitOpsApplication => {
304
+ const statuses: SyncStatus[] = ['synced', 'synced', 'synced', 'out_of_sync', 'failed']
305
+ const healthStatuses: HealthStatus[] = ['healthy', 'healthy', 'healthy', 'progressing', 'degraded']
306
+ const projects = ['production', 'staging', 'development']
307
+
308
+ return {
309
+ id: `app-${index}`,
310
+ name: `microservice-${index}`,
311
+ project: projects[index % 3],
312
+ repo: {
313
+ url: 'https://github.com/org/microservices',
314
+ branch: index % 3 === 2 ? 'develop' : 'main',
315
+ path: `services/service-${index}`,
316
+ },
317
+ destination: {
318
+ server: index % 3 === 2 ? 'https://dev.k8s.example.com' : 'https://kubernetes.default.svc',
319
+ namespace: projects[index % 3],
320
+ },
321
+ syncStatus: statuses[index % 5],
322
+ healthStatus: healthStatuses[index % 5],
323
+ lastSyncedAt: new Date(Date.now() - index * 10 * 60000),
324
+ lastSyncedRevision: `rev${index}abc123`,
325
+ autoSync: index % 2 === 0,
326
+ resources: [
327
+ { kind: 'Deployment', name: `service-${index}`, namespace: projects[index % 3], syncStatus: statuses[index % 5], healthStatus: healthStatuses[index % 5] },
328
+ { kind: 'Service', name: `service-${index}`, namespace: projects[index % 3], syncStatus: 'synced', healthStatus: 'healthy' },
329
+ ],
330
+ }
331
+ }
332
+
333
+ const manyApps = Array.from({ length: 15 }, (_, i) => generateApp(i))
334
+
335
+ return (
336
+ <div className="p-6">
337
+ <GitOpsSyncStatus
338
+ applications={manyApps}
339
+ onSync={(app) => console.log('Sync:', app.name)}
340
+ onRefresh={() => console.log('Refresh all')}
341
+ />
342
+ </div>
343
+ )
344
+ },
345
+ }
346
+
347
+ export const Empty: Story = {
348
+ render: () => (
349
+ <div className="p-6">
350
+ <GitOpsSyncStatus
351
+ applications={[]}
352
+ onRefresh={() => console.log('Refresh all')}
353
+ />
354
+ </div>
355
+ ),
356
+ }
357
+
358
+ export const Interactive: Story = {
359
+ render: () => {
360
+ const [applications, setApplications] = React.useState(defaultGitOpsApplications)
361
+
362
+ const handleSync = (app: GitOpsApplication) => {
363
+ setApplications(prev =>
364
+ prev.map(a =>
365
+ a.id === app.id
366
+ ? { ...a, syncStatus: 'syncing' as SyncStatus, healthStatus: 'progressing' as HealthStatus }
367
+ : a
368
+ )
369
+ )
370
+
371
+ // Simulate sync completion
372
+ setTimeout(() => {
373
+ setApplications(prev =>
374
+ prev.map(a =>
375
+ a.id === app.id
376
+ ? {
377
+ ...a,
378
+ syncStatus: 'synced' as SyncStatus,
379
+ healthStatus: 'healthy' as HealthStatus,
380
+ lastSyncedAt: new Date(),
381
+ lastSyncedRevision: a.targetRevision || a.lastSyncedRevision,
382
+ targetRevision: undefined,
383
+ resources: a.resources.map(r => ({
384
+ ...r,
385
+ syncStatus: 'synced' as SyncStatus,
386
+ healthStatus: 'healthy' as HealthStatus,
387
+ })),
388
+ }
389
+ : a
390
+ )
391
+ )
392
+ }, 3000)
393
+ }
394
+
395
+ const handleSuspend = (app: GitOpsApplication) => {
396
+ setApplications(prev =>
397
+ prev.map(a =>
398
+ a.id === app.id
399
+ ? { ...a, syncStatus: 'suspended' as SyncStatus }
400
+ : a
401
+ )
402
+ )
403
+ }
404
+
405
+ const handleResume = (app: GitOpsApplication) => {
406
+ setApplications(prev =>
407
+ prev.map(a =>
408
+ a.id === app.id
409
+ ? { ...a, syncStatus: 'synced' as SyncStatus }
410
+ : a
411
+ )
412
+ )
413
+ }
414
+
415
+ return (
416
+ <div className="p-6">
417
+ <GitOpsSyncStatus
418
+ applications={applications}
419
+ onSync={handleSync}
420
+ onSuspend={handleSuspend}
421
+ onResume={handleResume}
422
+ onViewDetails={(app) => alert(`Application: ${app.name}\nSync Status: ${app.syncStatus}\nHealth: ${app.healthStatus}\nResources: ${app.resources.length}`)}
423
+ onRefresh={() => setApplications([...defaultGitOpsApplications])}
424
+ />
425
+ </div>
426
+ )
427
+ },
428
+ }
429
+
430
+ export const ArgoCDDashboard: Story = {
431
+ render: () => (
432
+ <div className="min-h-screen bg-muted/30">
433
+ <header className="bg-background border-b px-6 py-4">
434
+ <div className="flex items-center justify-between">
435
+ <div>
436
+ <h1 className="font-bold text-xl">ArgoCD Dashboard</h1>
437
+ <p className="text-sm text-muted-foreground">GitOps Continuous Deployment</p>
438
+ </div>
439
+ <nav className="flex gap-4 text-sm">
440
+ <a href="#" className="text-foreground font-medium">Applications</a>
441
+ <a href="#" className="text-muted-foreground hover:text-foreground">Projects</a>
442
+ <a href="#" className="text-muted-foreground hover:text-foreground">Repositories</a>
443
+ <a href="#" className="text-muted-foreground hover:text-foreground">Clusters</a>
444
+ <a href="#" className="text-muted-foreground hover:text-foreground">Settings</a>
445
+ </nav>
446
+ </div>
447
+ </header>
448
+ <main className="p-6">
449
+ <GitOpsSyncStatus
450
+ applications={defaultGitOpsApplications}
451
+ onSync={(app) => console.log('Sync:', app.name)}
452
+ onSuspend={(app) => console.log('Suspend:', app.name)}
453
+ onResume={(app) => console.log('Resume:', app.name)}
454
+ onViewDetails={(app) => console.log('View details:', app.name)}
455
+ onRefresh={() => console.log('Refresh all')}
456
+ />
457
+ </main>
458
+ </div>
459
+ ),
460
+ }
461
+
462
+ export const FluxCDStyle: Story = {
463
+ render: () => {
464
+ const fluxApps: GitOpsApplication[] = [
465
+ {
466
+ id: '1',
467
+ name: 'flux-system',
468
+ project: 'flux-system',
469
+ repo: { url: 'https://github.com/org/flux-config', branch: 'main', path: 'clusters/production' },
470
+ destination: { server: 'https://kubernetes.default.svc', namespace: 'flux-system' },
471
+ syncStatus: 'synced',
472
+ healthStatus: 'healthy',
473
+ lastSyncedAt: new Date(Date.now() - 1 * 60000),
474
+ lastSyncedRevision: 'main@sha1:abc123',
475
+ autoSync: true,
476
+ resources: [
477
+ { kind: 'Deployment', name: 'source-controller', namespace: 'flux-system', syncStatus: 'synced', healthStatus: 'healthy' },
478
+ { kind: 'Deployment', name: 'kustomize-controller', namespace: 'flux-system', syncStatus: 'synced', healthStatus: 'healthy' },
479
+ { kind: 'Deployment', name: 'helm-controller', namespace: 'flux-system', syncStatus: 'synced', healthStatus: 'healthy' },
480
+ ],
481
+ },
482
+ {
483
+ id: '2',
484
+ name: 'infrastructure',
485
+ project: 'infrastructure',
486
+ repo: { url: 'https://github.com/org/flux-config', branch: 'main', path: 'infrastructure' },
487
+ destination: { server: 'https://kubernetes.default.svc', namespace: 'default' },
488
+ syncStatus: 'synced',
489
+ healthStatus: 'healthy',
490
+ lastSyncedAt: new Date(Date.now() - 3 * 60000),
491
+ lastSyncedRevision: 'main@sha1:def456',
492
+ autoSync: true,
493
+ resources: [
494
+ { kind: 'Deployment', name: 'ingress-nginx', namespace: 'ingress-nginx', syncStatus: 'synced', healthStatus: 'healthy' },
495
+ { kind: 'Deployment', name: 'cert-manager', namespace: 'cert-manager', syncStatus: 'synced', healthStatus: 'healthy' },
496
+ ],
497
+ },
498
+ {
499
+ id: '3',
500
+ name: 'apps',
501
+ project: 'apps',
502
+ repo: { url: 'https://github.com/org/flux-config', branch: 'main', path: 'apps/production' },
503
+ destination: { server: 'https://kubernetes.default.svc', namespace: 'production' },
504
+ syncStatus: 'out_of_sync',
505
+ healthStatus: 'healthy',
506
+ lastSyncedAt: new Date(Date.now() - 10 * 60000),
507
+ lastSyncedRevision: 'main@sha1:old789',
508
+ targetRevision: 'main@sha1:new012',
509
+ autoSync: false,
510
+ resources: [
511
+ { kind: 'Deployment', name: 'webapp', namespace: 'production', syncStatus: 'out_of_sync', healthStatus: 'healthy' },
512
+ { kind: 'Deployment', name: 'api', namespace: 'production', syncStatus: 'synced', healthStatus: 'healthy' },
513
+ ],
514
+ },
515
+ ]
516
+
517
+ return (
518
+ <div className="p-6">
519
+ <GitOpsSyncStatus
520
+ applications={fluxApps}
521
+ onSync={(app) => console.log('Reconcile:', app.name)}
522
+ onSuspend={(app) => console.log('Suspend:', app.name)}
523
+ onResume={(app) => console.log('Resume:', app.name)}
524
+ onRefresh={() => console.log('Refresh all')}
525
+ />
526
+ </div>
527
+ )
528
+ },
529
+ }