@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,356 @@
1
+ import type { Meta, StoryObj } from '@storybook/react'
2
+ import {
3
+ CloudCostDashboard,
4
+ defaultCloudCostSummary,
5
+ defaultCloudCostItems,
6
+ defaultCostAnomalies,
7
+ } from './index'
8
+ import type { CostSummary, CostItem, CostAnomaly, CloudProvider, TimeRange } from './index'
9
+ import * as React from 'react'
10
+
11
+ const meta: Meta<typeof CloudCostDashboard> = {
12
+ title: 'Blocks/CloudCostDashboard',
13
+ component: CloudCostDashboard,
14
+ parameters: {
15
+ layout: 'fullscreen',
16
+ docs: {
17
+ description: {
18
+ component:
19
+ 'A cloud cost management dashboard for monitoring and analyzing spending across multiple cloud providers (AWS, GCP, Azure) with category breakdowns and anomaly detection.',
20
+ },
21
+ },
22
+ },
23
+ tags: ['autodocs'],
24
+ }
25
+
26
+ export default meta
27
+ type Story = StoryObj<typeof CloudCostDashboard>
28
+
29
+ export const Default: Story = {
30
+ render: () => (
31
+ <div className="p-6">
32
+ <CloudCostDashboard
33
+ summary={defaultCloudCostSummary}
34
+ items={defaultCloudCostItems}
35
+ anomalies={defaultCostAnomalies}
36
+ onTimeRangeChange={(range) => console.log('Time range:', range)}
37
+ onProviderFilter={(provider) => console.log('Provider:', provider)}
38
+ onExport={() => console.log('Export')}
39
+ onRefresh={() => console.log('Refresh')}
40
+ />
41
+ </div>
42
+ ),
43
+ }
44
+
45
+ export const OverBudget: Story = {
46
+ render: () => {
47
+ const overBudgetSummary: CostSummary = {
48
+ totalCost: 62000,
49
+ previousTotalCost: 48000,
50
+ budget: 50000,
51
+ forecast: 75000,
52
+ byProvider: {
53
+ aws: 38000,
54
+ gcp: 18000,
55
+ azure: 6000,
56
+ all: 62000,
57
+ },
58
+ byCategory: {
59
+ compute: 32000,
60
+ storage: 12000,
61
+ database: 10000,
62
+ network: 5000,
63
+ security: 2000,
64
+ other: 1000,
65
+ },
66
+ topServices: [],
67
+ }
68
+
69
+ const criticalAnomalies: CostAnomaly[] = [
70
+ { id: '1', service: 'EC2 On-Demand', expectedCost: 8000, actualCost: 18000, deviation: 125, timestamp: new Date(), status: 'new' },
71
+ { id: '2', service: 'RDS Multi-AZ', expectedCost: 3000, actualCost: 7500, deviation: 150, timestamp: new Date(Date.now() - 3600000), status: 'new' },
72
+ { id: '3', service: 'Data Transfer OUT', expectedCost: 1500, actualCost: 4200, deviation: 180, timestamp: new Date(Date.now() - 7200000), status: 'acknowledged' },
73
+ ]
74
+
75
+ return (
76
+ <div className="p-6">
77
+ <CloudCostDashboard
78
+ summary={overBudgetSummary}
79
+ items={defaultCloudCostItems}
80
+ anomalies={criticalAnomalies}
81
+ onRefresh={() => console.log('Refresh')}
82
+ />
83
+ </div>
84
+ )
85
+ },
86
+ }
87
+
88
+ export const UnderBudget: Story = {
89
+ render: () => {
90
+ const underBudgetSummary: CostSummary = {
91
+ totalCost: 32000,
92
+ previousTotalCost: 35000,
93
+ budget: 50000,
94
+ forecast: 34000,
95
+ byProvider: {
96
+ aws: 20000,
97
+ gcp: 8000,
98
+ azure: 4000,
99
+ all: 32000,
100
+ },
101
+ byCategory: {
102
+ compute: 15000,
103
+ storage: 6000,
104
+ database: 5000,
105
+ network: 3000,
106
+ security: 2000,
107
+ other: 1000,
108
+ },
109
+ topServices: [],
110
+ }
111
+
112
+ return (
113
+ <div className="p-6">
114
+ <CloudCostDashboard
115
+ summary={underBudgetSummary}
116
+ items={defaultCloudCostItems}
117
+ anomalies={[]}
118
+ onRefresh={() => console.log('Refresh')}
119
+ />
120
+ </div>
121
+ )
122
+ },
123
+ }
124
+
125
+ export const AWSOnly: Story = {
126
+ render: () => {
127
+ const awsSummary: CostSummary = {
128
+ totalCost: 45000,
129
+ previousTotalCost: 42000,
130
+ budget: 50000,
131
+ byProvider: {
132
+ aws: 45000,
133
+ gcp: 0,
134
+ azure: 0,
135
+ all: 45000,
136
+ },
137
+ byCategory: {
138
+ compute: 22000,
139
+ storage: 10000,
140
+ database: 8000,
141
+ network: 3000,
142
+ security: 1500,
143
+ other: 500,
144
+ },
145
+ topServices: [],
146
+ }
147
+
148
+ const awsItems: CostItem[] = [
149
+ { id: '1', name: 'EC2 Instances', category: 'compute', provider: 'aws', cost: 15000, previousCost: 14000, usage: 850, unit: 'hours' },
150
+ { id: '2', name: 'S3 Storage', category: 'storage', provider: 'aws', cost: 5500, previousCost: 5000, usage: 25, unit: 'TB' },
151
+ { id: '3', name: 'RDS PostgreSQL', category: 'database', provider: 'aws', cost: 4500, previousCost: 4200 },
152
+ { id: '4', name: 'RDS MySQL', category: 'database', provider: 'aws', cost: 3500, previousCost: 3500 },
153
+ { id: '5', name: 'EBS Volumes', category: 'storage', provider: 'aws', cost: 4500, previousCost: 4000, usage: 10, unit: 'TB' },
154
+ { id: '6', name: 'CloudFront', category: 'network', provider: 'aws', cost: 2500, previousCost: 2200, usage: 150, unit: 'TB' },
155
+ { id: '7', name: 'Lambda', category: 'compute', provider: 'aws', cost: 1200, previousCost: 1000, usage: 50000000, unit: 'invocations' },
156
+ { id: '8', name: 'EKS', category: 'compute', provider: 'aws', cost: 5800, previousCost: 5500 },
157
+ ]
158
+
159
+ return (
160
+ <div className="p-6">
161
+ <CloudCostDashboard
162
+ summary={awsSummary}
163
+ items={awsItems}
164
+ anomalies={defaultCostAnomalies.filter(a => a.service.includes('EC2') || a.service.includes('Lambda'))}
165
+ onRefresh={() => console.log('Refresh')}
166
+ />
167
+ </div>
168
+ )
169
+ },
170
+ }
171
+
172
+ export const MultiCloud: Story = {
173
+ render: () => {
174
+ const multiCloudItems: CostItem[] = [
175
+ // AWS
176
+ { id: '1', name: 'EC2 Instances', category: 'compute', provider: 'aws', cost: 12500 },
177
+ { id: '2', name: 'S3 Storage', category: 'storage', provider: 'aws', cost: 3800 },
178
+ { id: '3', name: 'RDS PostgreSQL', category: 'database', provider: 'aws', cost: 4200 },
179
+ // GCP
180
+ { id: '4', name: 'GKE Clusters', category: 'compute', provider: 'gcp', cost: 8500 },
181
+ { id: '5', name: 'Cloud Storage', category: 'storage', provider: 'gcp', cost: 2200 },
182
+ { id: '6', name: 'BigQuery', category: 'database', provider: 'gcp', cost: 3800 },
183
+ { id: '7', name: 'Cloud Run', category: 'compute', provider: 'gcp', cost: 1500 },
184
+ // Azure
185
+ { id: '8', name: 'Virtual Machines', category: 'compute', provider: 'azure', cost: 5500 },
186
+ { id: '9', name: 'Blob Storage', category: 'storage', provider: 'azure', cost: 1800 },
187
+ { id: '10', name: 'Azure SQL', category: 'database', provider: 'azure', cost: 2500 },
188
+ { id: '11', name: 'Azure Functions', category: 'compute', provider: 'azure', cost: 800 },
189
+ ]
190
+
191
+ return (
192
+ <div className="p-6">
193
+ <CloudCostDashboard
194
+ summary={defaultCloudCostSummary}
195
+ items={multiCloudItems}
196
+ anomalies={defaultCostAnomalies}
197
+ onProviderFilter={(provider) => console.log('Filter:', provider)}
198
+ onRefresh={() => console.log('Refresh')}
199
+ />
200
+ </div>
201
+ )
202
+ },
203
+ }
204
+
205
+ export const WithTimeRange: Story = {
206
+ render: () => {
207
+ const [timeRange, setTimeRange] = React.useState<TimeRange>('month')
208
+
209
+ return (
210
+ <div className="p-6">
211
+ <CloudCostDashboard
212
+ summary={defaultCloudCostSummary}
213
+ items={defaultCloudCostItems}
214
+ anomalies={defaultCostAnomalies}
215
+ timeRange={timeRange}
216
+ onTimeRangeChange={setTimeRange}
217
+ onRefresh={() => console.log('Refresh for', timeRange)}
218
+ />
219
+ </div>
220
+ )
221
+ },
222
+ }
223
+
224
+ export const NoAnomalies: Story = {
225
+ render: () => (
226
+ <div className="p-6">
227
+ <CloudCostDashboard
228
+ summary={defaultCloudCostSummary}
229
+ items={defaultCloudCostItems}
230
+ anomalies={[]}
231
+ onRefresh={() => console.log('Refresh')}
232
+ />
233
+ </div>
234
+ ),
235
+ }
236
+
237
+ export const ManyAnomalies: Story = {
238
+ render: () => {
239
+ const manyAnomalies: CostAnomaly[] = [
240
+ { id: '1', service: 'EC2 Spot Instances', expectedCost: 500, actualCost: 1250, deviation: 150, timestamp: new Date(), status: 'new' },
241
+ { id: '2', service: 'Data Transfer OUT', expectedCost: 800, actualCost: 2400, deviation: 200, timestamp: new Date(Date.now() - 1800000), status: 'new' },
242
+ { id: '3', service: 'Lambda Functions', expectedCost: 200, actualCost: 520, deviation: 160, timestamp: new Date(Date.now() - 3600000), status: 'new' },
243
+ { id: '4', service: 'NAT Gateway', expectedCost: 300, actualCost: 680, deviation: 127, timestamp: new Date(Date.now() - 7200000), status: 'acknowledged' },
244
+ { id: '5', service: 'CloudWatch Logs', expectedCost: 150, actualCost: 380, deviation: 153, timestamp: new Date(Date.now() - 10800000), status: 'acknowledged' },
245
+ { id: '6', service: 'S3 Requests', expectedCost: 100, actualCost: 290, deviation: 190, timestamp: new Date(Date.now() - 14400000), status: 'resolved' },
246
+ ]
247
+
248
+ return (
249
+ <div className="p-6">
250
+ <CloudCostDashboard
251
+ summary={defaultCloudCostSummary}
252
+ items={defaultCloudCostItems}
253
+ anomalies={manyAnomalies}
254
+ onRefresh={() => console.log('Refresh')}
255
+ />
256
+ </div>
257
+ )
258
+ },
259
+ }
260
+
261
+ export const Interactive: Story = {
262
+ render: () => {
263
+ const [timeRange, setTimeRange] = React.useState<TimeRange>('month')
264
+ const [provider, setProvider] = React.useState<CloudProvider>('all')
265
+
266
+ const filteredItems = provider === 'all'
267
+ ? defaultCloudCostItems
268
+ : defaultCloudCostItems.filter(item => item.provider === provider)
269
+
270
+ return (
271
+ <div className="p-6">
272
+ <CloudCostDashboard
273
+ summary={defaultCloudCostSummary}
274
+ items={filteredItems}
275
+ anomalies={defaultCostAnomalies}
276
+ timeRange={timeRange}
277
+ onTimeRangeChange={setTimeRange}
278
+ onProviderFilter={setProvider}
279
+ onExport={() => alert('Exporting cost report...')}
280
+ onRefresh={() => alert('Refreshing data...')}
281
+ />
282
+ </div>
283
+ )
284
+ },
285
+ }
286
+
287
+ export const FinOpsDashboard: Story = {
288
+ render: () => (
289
+ <div className="min-h-screen bg-muted/30">
290
+ <header className="bg-background border-b px-6 py-4">
291
+ <div className="flex items-center justify-between">
292
+ <div>
293
+ <h1 className="font-bold text-xl">FinOps Dashboard</h1>
294
+ <p className="text-sm text-muted-foreground">Cloud Cost Management & Optimization</p>
295
+ </div>
296
+ <nav className="flex gap-4 text-sm">
297
+ <a href="#" className="text-foreground font-medium">Overview</a>
298
+ <a href="#" className="text-muted-foreground hover:text-foreground">Budgets</a>
299
+ <a href="#" className="text-muted-foreground hover:text-foreground">Recommendations</a>
300
+ <a href="#" className="text-muted-foreground hover:text-foreground">Reports</a>
301
+ </nav>
302
+ </div>
303
+ </header>
304
+ <main className="p-6">
305
+ <CloudCostDashboard
306
+ summary={defaultCloudCostSummary}
307
+ items={defaultCloudCostItems}
308
+ anomalies={defaultCostAnomalies}
309
+ onTimeRangeChange={(range) => console.log('Time range:', range)}
310
+ onProviderFilter={(provider) => console.log('Provider:', provider)}
311
+ onExport={() => console.log('Export')}
312
+ onRefresh={() => console.log('Refresh')}
313
+ />
314
+ </main>
315
+ </div>
316
+ ),
317
+ }
318
+
319
+ export const QuarterlyReview: Story = {
320
+ render: () => {
321
+ const quarterlySummary: CostSummary = {
322
+ totalCost: 135000,
323
+ previousTotalCost: 125000,
324
+ budget: 150000,
325
+ forecast: 145000,
326
+ byProvider: {
327
+ aws: 85000,
328
+ gcp: 35000,
329
+ azure: 15000,
330
+ all: 135000,
331
+ },
332
+ byCategory: {
333
+ compute: 65000,
334
+ storage: 28000,
335
+ database: 22000,
336
+ network: 12000,
337
+ security: 5000,
338
+ other: 3000,
339
+ },
340
+ topServices: [],
341
+ }
342
+
343
+ return (
344
+ <div className="p-6">
345
+ <CloudCostDashboard
346
+ summary={quarterlySummary}
347
+ items={defaultCloudCostItems}
348
+ anomalies={[]}
349
+ timeRange="quarter"
350
+ onRefresh={() => console.log('Refresh')}
351
+ onExport={() => console.log('Export quarterly report')}
352
+ />
353
+ </div>
354
+ )
355
+ },
356
+ }