@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,533 @@
1
+ import type { Meta, StoryObj } from '@storybook/react'
2
+ import {
3
+ InfrastructureMap,
4
+ defaultInfraResources,
5
+ } from './index'
6
+ import type { InfraResource, ResourceType, ResourceStatus, CloudProvider } from './index'
7
+ import * as React from 'react'
8
+
9
+ const meta: Meta<typeof InfrastructureMap> = {
10
+ title: 'Blocks/InfrastructureMap',
11
+ component: InfrastructureMap,
12
+ parameters: {
13
+ layout: 'fullscreen',
14
+ docs: {
15
+ description: {
16
+ component:
17
+ 'An infrastructure visualization dashboard for mapping cloud resources across regions, VPCs, subnets with tree and grid views, status filtering, and resource metrics.',
18
+ },
19
+ },
20
+ },
21
+ tags: ['autodocs'],
22
+ }
23
+
24
+ export default meta
25
+ type Story = StoryObj<typeof InfrastructureMap>
26
+
27
+ export const Default: Story = {
28
+ render: () => (
29
+ <div className="p-6">
30
+ <InfrastructureMap
31
+ resources={defaultInfraResources}
32
+ onResourceClick={(resource) => console.log('Resource clicked:', resource.name)}
33
+ onRefresh={() => console.log('Refresh')}
34
+ />
35
+ </div>
36
+ ),
37
+ }
38
+
39
+ export const GridView: Story = {
40
+ render: () => (
41
+ <div className="p-6">
42
+ <InfrastructureMap
43
+ resources={defaultInfraResources}
44
+ viewMode="grid"
45
+ onResourceClick={(resource) => console.log('Resource clicked:', resource.name)}
46
+ onRefresh={() => console.log('Refresh')}
47
+ />
48
+ </div>
49
+ ),
50
+ }
51
+
52
+ export const AllHealthy: Story = {
53
+ render: () => {
54
+ const healthyResources: InfraResource[] = [
55
+ {
56
+ id: 'region-us-east-1',
57
+ name: 'us-east-1',
58
+ type: 'region',
59
+ status: 'healthy',
60
+ provider: 'aws',
61
+ region: 'N. Virginia',
62
+ children: [
63
+ {
64
+ id: 'vpc-prod',
65
+ name: 'production-vpc',
66
+ type: 'vpc',
67
+ status: 'healthy',
68
+ children: [
69
+ {
70
+ id: 'alb-1',
71
+ name: 'api-load-balancer',
72
+ type: 'loadbalancer',
73
+ status: 'healthy',
74
+ metrics: { requests: 15000, latency: 25 },
75
+ },
76
+ {
77
+ id: 'ec2-1',
78
+ name: 'api-server-1',
79
+ type: 'server',
80
+ status: 'healthy',
81
+ metrics: { cpu: 35, memory: 45 },
82
+ },
83
+ {
84
+ id: 'ec2-2',
85
+ name: 'api-server-2',
86
+ type: 'server',
87
+ status: 'healthy',
88
+ metrics: { cpu: 42, memory: 52 },
89
+ },
90
+ {
91
+ id: 'rds-1',
92
+ name: 'postgres-primary',
93
+ type: 'database',
94
+ status: 'healthy',
95
+ metrics: { cpu: 28, memory: 60 },
96
+ },
97
+ {
98
+ id: 'redis-1',
99
+ name: 'redis-cache',
100
+ type: 'cache',
101
+ status: 'healthy',
102
+ metrics: { memory: 35 },
103
+ },
104
+ ],
105
+ },
106
+ ],
107
+ },
108
+ ]
109
+
110
+ return (
111
+ <div className="p-6">
112
+ <InfrastructureMap
113
+ resources={healthyResources}
114
+ onResourceClick={(resource) => console.log('Resource:', resource.name)}
115
+ />
116
+ </div>
117
+ )
118
+ },
119
+ }
120
+
121
+ export const WithCriticalResources: Story = {
122
+ render: () => {
123
+ const criticalResources: InfraResource[] = [
124
+ {
125
+ id: 'region-us-east-1',
126
+ name: 'us-east-1',
127
+ type: 'region',
128
+ status: 'critical',
129
+ provider: 'aws',
130
+ region: 'N. Virginia',
131
+ children: [
132
+ {
133
+ id: 'vpc-prod',
134
+ name: 'production-vpc',
135
+ type: 'vpc',
136
+ status: 'critical',
137
+ children: [
138
+ {
139
+ id: 'ec2-critical',
140
+ name: 'api-server-critical',
141
+ type: 'server',
142
+ status: 'critical',
143
+ metrics: { cpu: 99, memory: 98 },
144
+ },
145
+ {
146
+ id: 'rds-critical',
147
+ name: 'postgres-overloaded',
148
+ type: 'database',
149
+ status: 'critical',
150
+ metrics: { cpu: 95, memory: 92 },
151
+ },
152
+ ],
153
+ },
154
+ ],
155
+ },
156
+ {
157
+ id: 'region-eu-west-1',
158
+ name: 'eu-west-1',
159
+ type: 'region',
160
+ status: 'warning',
161
+ provider: 'aws',
162
+ region: 'Ireland',
163
+ children: [
164
+ {
165
+ id: 'ec2-warning',
166
+ name: 'worker-server',
167
+ type: 'server',
168
+ status: 'warning',
169
+ metrics: { cpu: 82, memory: 75 },
170
+ },
171
+ ],
172
+ },
173
+ ]
174
+
175
+ return (
176
+ <div className="p-6">
177
+ <InfrastructureMap
178
+ resources={criticalResources}
179
+ onResourceClick={(resource) => console.log('Resource:', resource.name)}
180
+ />
181
+ </div>
182
+ )
183
+ },
184
+ }
185
+
186
+ export const MultiCloudInfrastructure: Story = {
187
+ render: () => {
188
+ const multiCloudResources: InfraResource[] = [
189
+ {
190
+ id: 'aws-region',
191
+ name: 'us-east-1',
192
+ type: 'region',
193
+ status: 'healthy',
194
+ provider: 'aws',
195
+ region: 'N. Virginia',
196
+ children: [
197
+ {
198
+ id: 'aws-vpc',
199
+ name: 'aws-production-vpc',
200
+ type: 'vpc',
201
+ status: 'healthy',
202
+ children: [
203
+ { id: 'aws-alb', name: 'aws-load-balancer', type: 'loadbalancer', status: 'healthy', metrics: { requests: 25000 } },
204
+ { id: 'aws-ec2-1', name: 'aws-api-1', type: 'server', status: 'healthy', metrics: { cpu: 45, memory: 60 } },
205
+ { id: 'aws-rds', name: 'aws-postgres', type: 'database', status: 'healthy', metrics: { cpu: 35, memory: 70 } },
206
+ ],
207
+ },
208
+ ],
209
+ },
210
+ {
211
+ id: 'gcp-region',
212
+ name: 'us-central1',
213
+ type: 'region',
214
+ status: 'healthy',
215
+ provider: 'gcp',
216
+ region: 'Iowa',
217
+ children: [
218
+ {
219
+ id: 'gcp-vpc',
220
+ name: 'gcp-production-vpc',
221
+ type: 'vpc',
222
+ status: 'warning',
223
+ children: [
224
+ { id: 'gcp-gke', name: 'gcp-gke-cluster', type: 'container', status: 'healthy', metrics: { cpu: 55, memory: 65 } },
225
+ { id: 'gcp-sql', name: 'cloud-sql', type: 'database', status: 'warning', metrics: { cpu: 78, memory: 82 } },
226
+ { id: 'gcp-storage', name: 'cloud-storage', type: 'storage', status: 'healthy' },
227
+ ],
228
+ },
229
+ ],
230
+ },
231
+ {
232
+ id: 'azure-region',
233
+ name: 'eastus',
234
+ type: 'region',
235
+ status: 'healthy',
236
+ provider: 'azure',
237
+ region: 'East US',
238
+ children: [
239
+ {
240
+ id: 'azure-vnet',
241
+ name: 'azure-production-vnet',
242
+ type: 'vpc',
243
+ status: 'healthy',
244
+ children: [
245
+ { id: 'azure-vm', name: 'azure-vm-scale-set', type: 'server', status: 'healthy', metrics: { cpu: 40, memory: 55 } },
246
+ { id: 'azure-sql', name: 'azure-sql-db', type: 'database', status: 'healthy', metrics: { cpu: 30, memory: 45 } },
247
+ { id: 'azure-redis', name: 'azure-cache', type: 'cache', status: 'healthy', metrics: { memory: 28 } },
248
+ ],
249
+ },
250
+ ],
251
+ },
252
+ ]
253
+
254
+ return (
255
+ <div className="p-6">
256
+ <InfrastructureMap
257
+ resources={multiCloudResources}
258
+ onResourceClick={(resource) => console.log('Resource:', resource.name)}
259
+ />
260
+ </div>
261
+ )
262
+ },
263
+ }
264
+
265
+ export const KubernetesCluster: Story = {
266
+ render: () => {
267
+ const k8sResources: InfraResource[] = [
268
+ {
269
+ id: 'k8s-cluster',
270
+ name: 'production-cluster',
271
+ type: 'container',
272
+ status: 'healthy',
273
+ provider: 'aws',
274
+ children: [
275
+ {
276
+ id: 'node-pool-1',
277
+ name: 'system-nodes',
278
+ type: 'server',
279
+ status: 'healthy',
280
+ children: [
281
+ { id: 'node-1', name: 'node-1', type: 'server', status: 'healthy', metrics: { cpu: 35, memory: 50 } },
282
+ { id: 'node-2', name: 'node-2', type: 'server', status: 'healthy', metrics: { cpu: 42, memory: 55 } },
283
+ ],
284
+ },
285
+ {
286
+ id: 'node-pool-2',
287
+ name: 'app-nodes',
288
+ type: 'server',
289
+ status: 'warning',
290
+ children: [
291
+ { id: 'node-3', name: 'app-node-1', type: 'server', status: 'healthy', metrics: { cpu: 60, memory: 70 } },
292
+ { id: 'node-4', name: 'app-node-2', type: 'server', status: 'warning', metrics: { cpu: 85, memory: 82 } },
293
+ { id: 'node-5', name: 'app-node-3', type: 'server', status: 'healthy', metrics: { cpu: 55, memory: 65 } },
294
+ ],
295
+ },
296
+ {
297
+ id: 'node-pool-3',
298
+ name: 'data-nodes',
299
+ type: 'server',
300
+ status: 'healthy',
301
+ children: [
302
+ { id: 'node-6', name: 'data-node-1', type: 'server', status: 'healthy', metrics: { cpu: 45, memory: 75 } },
303
+ { id: 'node-7', name: 'data-node-2', type: 'server', status: 'healthy', metrics: { cpu: 48, memory: 78 } },
304
+ ],
305
+ },
306
+ ],
307
+ },
308
+ ]
309
+
310
+ return (
311
+ <div className="p-6">
312
+ <InfrastructureMap
313
+ resources={k8sResources}
314
+ onResourceClick={(resource) => console.log('Resource:', resource.name)}
315
+ />
316
+ </div>
317
+ )
318
+ },
319
+ }
320
+
321
+ export const MaintenanceMode: Story = {
322
+ render: () => {
323
+ const maintenanceResources: InfraResource[] = [
324
+ {
325
+ id: 'region-us-east-1',
326
+ name: 'us-east-1',
327
+ type: 'region',
328
+ status: 'healthy',
329
+ provider: 'aws',
330
+ children: [
331
+ {
332
+ id: 'vpc-prod',
333
+ name: 'production-vpc',
334
+ type: 'vpc',
335
+ status: 'healthy',
336
+ children: [
337
+ { id: 'alb', name: 'api-lb', type: 'loadbalancer', status: 'healthy' },
338
+ { id: 'ec2-1', name: 'api-server-1', type: 'server', status: 'healthy' },
339
+ { id: 'ec2-2', name: 'api-server-2', type: 'maintenance', metrics: { cpu: 0, memory: 0 } },
340
+ { id: 'rds-primary', name: 'postgres-primary', type: 'database', status: 'healthy' },
341
+ { id: 'rds-replica', name: 'postgres-replica', type: 'database', status: 'maintenance' },
342
+ ],
343
+ },
344
+ ],
345
+ },
346
+ ]
347
+
348
+ return (
349
+ <div className="p-6">
350
+ <InfrastructureMap
351
+ resources={maintenanceResources}
352
+ onResourceClick={(resource) => console.log('Resource:', resource.name)}
353
+ />
354
+ </div>
355
+ )
356
+ },
357
+ }
358
+
359
+ export const LargeInfrastructure: Story = {
360
+ render: () => {
361
+ const generateServers = (prefix: string, count: number, baseStatus: ResourceStatus = 'healthy'): InfraResource[] =>
362
+ Array.from({ length: count }, (_, i) => ({
363
+ id: `${prefix}-${i}`,
364
+ name: `${prefix}-${i + 1}`,
365
+ type: 'server' as ResourceType,
366
+ status: i === 2 ? 'warning' : baseStatus,
367
+ metrics: {
368
+ cpu: 30 + Math.random() * 40,
369
+ memory: 40 + Math.random() * 30,
370
+ },
371
+ }))
372
+
373
+ const largeResources: InfraResource[] = [
374
+ {
375
+ id: 'region-us-east',
376
+ name: 'us-east-1',
377
+ type: 'region',
378
+ status: 'healthy',
379
+ provider: 'aws',
380
+ children: [
381
+ {
382
+ id: 'vpc-prod',
383
+ name: 'production-vpc',
384
+ type: 'vpc',
385
+ status: 'healthy',
386
+ children: [
387
+ {
388
+ id: 'subnet-web',
389
+ name: 'web-tier',
390
+ type: 'subnet',
391
+ status: 'healthy',
392
+ children: [
393
+ { id: 'alb', name: 'api-alb', type: 'loadbalancer', status: 'healthy' },
394
+ ...generateServers('web', 8),
395
+ ],
396
+ },
397
+ {
398
+ id: 'subnet-app',
399
+ name: 'app-tier',
400
+ type: 'subnet',
401
+ status: 'warning',
402
+ children: generateServers('app', 12),
403
+ },
404
+ {
405
+ id: 'subnet-data',
406
+ name: 'data-tier',
407
+ type: 'subnet',
408
+ status: 'healthy',
409
+ children: [
410
+ { id: 'rds-primary', name: 'postgres-primary', type: 'database', status: 'healthy' },
411
+ { id: 'rds-replica-1', name: 'postgres-replica-1', type: 'database', status: 'healthy' },
412
+ { id: 'rds-replica-2', name: 'postgres-replica-2', type: 'database', status: 'healthy' },
413
+ { id: 'redis-cluster', name: 'redis-cache', type: 'cache', status: 'healthy' },
414
+ ],
415
+ },
416
+ ],
417
+ },
418
+ ],
419
+ },
420
+ {
421
+ id: 'region-eu-west',
422
+ name: 'eu-west-1',
423
+ type: 'region',
424
+ status: 'healthy',
425
+ provider: 'aws',
426
+ children: [
427
+ {
428
+ id: 'vpc-eu',
429
+ name: 'eu-production-vpc',
430
+ type: 'vpc',
431
+ status: 'healthy',
432
+ children: generateServers('eu-web', 4),
433
+ },
434
+ ],
435
+ },
436
+ ]
437
+
438
+ return (
439
+ <div className="p-6">
440
+ <InfrastructureMap
441
+ resources={largeResources}
442
+ onResourceClick={(resource) => console.log('Resource:', resource.name)}
443
+ onRefresh={() => console.log('Refresh')}
444
+ />
445
+ </div>
446
+ )
447
+ },
448
+ }
449
+
450
+ export const Empty: Story = {
451
+ render: () => (
452
+ <div className="p-6">
453
+ <InfrastructureMap
454
+ resources={[]}
455
+ onRefresh={() => console.log('Refresh')}
456
+ />
457
+ </div>
458
+ ),
459
+ }
460
+
461
+ export const Interactive: Story = {
462
+ render: () => {
463
+ const [resources, setResources] = React.useState(defaultInfraResources)
464
+ const [selectedResource, setSelectedResource] = React.useState<InfraResource | null>(null)
465
+
466
+ // Simulate real-time metrics updates
467
+ React.useEffect(() => {
468
+ const interval = setInterval(() => {
469
+ const updateMetrics = (items: InfraResource[]): InfraResource[] =>
470
+ items.map(item => ({
471
+ ...item,
472
+ metrics: item.metrics
473
+ ? {
474
+ ...item.metrics,
475
+ cpu: item.metrics.cpu !== undefined
476
+ ? Math.max(0, Math.min(100, item.metrics.cpu + (Math.random() - 0.5) * 10))
477
+ : undefined,
478
+ memory: item.metrics.memory !== undefined
479
+ ? Math.max(0, Math.min(100, item.metrics.memory + (Math.random() - 0.5) * 5))
480
+ : undefined,
481
+ }
482
+ : undefined,
483
+ children: item.children ? updateMetrics(item.children) : undefined,
484
+ }))
485
+
486
+ setResources(prev => updateMetrics(prev))
487
+ }, 3000)
488
+
489
+ return () => clearInterval(interval)
490
+ }, [])
491
+
492
+ return (
493
+ <div className="p-6">
494
+ <InfrastructureMap
495
+ resources={resources}
496
+ onResourceClick={(resource) => {
497
+ setSelectedResource(resource)
498
+ alert(`Selected: ${resource.name}\nType: ${resource.type}\nStatus: ${resource.status}${resource.metrics?.cpu !== undefined ? `\nCPU: ${Math.round(resource.metrics.cpu)}%` : ''}${resource.metrics?.memory !== undefined ? `\nMemory: ${Math.round(resource.metrics.memory)}%` : ''}`)
499
+ }}
500
+ onRefresh={() => setResources([...defaultInfraResources])}
501
+ />
502
+ </div>
503
+ )
504
+ },
505
+ }
506
+
507
+ export const InfraDashboard: Story = {
508
+ render: () => (
509
+ <div className="min-h-screen bg-muted/30">
510
+ <header className="bg-background border-b px-6 py-4">
511
+ <div className="flex items-center justify-between">
512
+ <div>
513
+ <h1 className="font-bold text-xl">Infrastructure Overview</h1>
514
+ <p className="text-sm text-muted-foreground">Multi-Cloud Resource Management</p>
515
+ </div>
516
+ <nav className="flex gap-4 text-sm">
517
+ <a href="#" className="text-foreground font-medium">Resources</a>
518
+ <a href="#" className="text-muted-foreground hover:text-foreground">Networking</a>
519
+ <a href="#" className="text-muted-foreground hover:text-foreground">Security</a>
520
+ <a href="#" className="text-muted-foreground hover:text-foreground">Cost</a>
521
+ </nav>
522
+ </div>
523
+ </header>
524
+ <main className="p-6">
525
+ <InfrastructureMap
526
+ resources={defaultInfraResources}
527
+ onResourceClick={(resource) => console.log('Resource:', resource.name)}
528
+ onRefresh={() => console.log('Refresh')}
529
+ />
530
+ </main>
531
+ </div>
532
+ ),
533
+ }