@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,435 @@
1
+ import type { Meta, StoryObj } from '@storybook/react'
2
+ import {
3
+ APMOverview,
4
+ defaultAPMServices,
5
+ defaultAPMTransactions,
6
+ } from './index'
7
+ import type { APMService, APMTransaction, TimeRange } from './index'
8
+ import * as React from 'react'
9
+
10
+ const meta: Meta<typeof APMOverview> = {
11
+ title: 'Blocks/APMOverview',
12
+ component: APMOverview,
13
+ parameters: {
14
+ layout: 'fullscreen',
15
+ docs: {
16
+ description: {
17
+ component:
18
+ 'An Application Performance Monitoring (APM) overview dashboard with service health, response times, error rates, and recent transaction tracking.',
19
+ },
20
+ },
21
+ },
22
+ tags: ['autodocs'],
23
+ }
24
+
25
+ export default meta
26
+ type Story = StoryObj<typeof APMOverview>
27
+
28
+ export const Default: Story = {
29
+ render: () => (
30
+ <div className="p-6">
31
+ <APMOverview
32
+ services={defaultAPMServices}
33
+ recentTransactions={defaultAPMTransactions}
34
+ onServiceClick={(service) => console.log('Service clicked:', service)}
35
+ onTransactionClick={(tx) => console.log('Transaction clicked:', tx)}
36
+ onRefresh={() => console.log('Refresh')}
37
+ />
38
+ </div>
39
+ ),
40
+ }
41
+
42
+ export const AllHealthy: Story = {
43
+ render: () => {
44
+ const healthyServices: APMService[] = defaultAPMServices.map(service => ({
45
+ ...service,
46
+ status: 'healthy' as const,
47
+ metrics: {
48
+ ...service.metrics,
49
+ errorRate: Math.random() * 0.5,
50
+ successRate: 99.5 + Math.random() * 0.5,
51
+ },
52
+ }))
53
+
54
+ return (
55
+ <div className="p-6">
56
+ <APMOverview
57
+ services={healthyServices}
58
+ recentTransactions={defaultAPMTransactions.filter(tx => tx.status === 'success')}
59
+ onServiceClick={(service) => console.log('Service clicked:', service)}
60
+ />
61
+ </div>
62
+ )
63
+ },
64
+ }
65
+
66
+ export const WithCriticalService: Story = {
67
+ render: () => {
68
+ const servicesWithCritical: APMService[] = [
69
+ {
70
+ id: 'critical-1',
71
+ name: 'payment-gateway',
72
+ type: 'api',
73
+ status: 'critical',
74
+ version: '1.5.0',
75
+ instances: 2,
76
+ metrics: {
77
+ requestsPerSecond: 50,
78
+ avgResponseTime: 2500,
79
+ p50ResponseTime: 1800,
80
+ p95ResponseTime: 4500,
81
+ p99ResponseTime: 8000,
82
+ errorRate: 15.5,
83
+ successRate: 84.5,
84
+ activeConnections: 200,
85
+ cpuUsage: 95,
86
+ memoryUsage: 92,
87
+ },
88
+ tags: ['production', 'payment', 'critical'],
89
+ },
90
+ ...defaultAPMServices,
91
+ ]
92
+
93
+ const transactionsWithErrors: APMTransaction[] = [
94
+ { id: 'err-1', name: 'POST /api/payments/process', service: 'payment-gateway', duration: 8500, timestamp: new Date(Date.now() - 10000), status: 'error' },
95
+ { id: 'err-2', name: 'POST /api/payments/validate', service: 'payment-gateway', duration: 5200, timestamp: new Date(Date.now() - 30000), status: 'error' },
96
+ { id: 'err-3', name: 'GET /api/payments/status', service: 'payment-gateway', duration: 3100, timestamp: new Date(Date.now() - 45000), status: 'error' },
97
+ ...defaultAPMTransactions,
98
+ ]
99
+
100
+ return (
101
+ <div className="p-6">
102
+ <APMOverview
103
+ services={servicesWithCritical}
104
+ recentTransactions={transactionsWithErrors}
105
+ onServiceClick={(service) => console.log('Service clicked:', service)}
106
+ />
107
+ </div>
108
+ )
109
+ },
110
+ }
111
+
112
+ export const HighLoad: Story = {
113
+ render: () => {
114
+ const highLoadServices: APMService[] = defaultAPMServices.map(service => ({
115
+ ...service,
116
+ metrics: {
117
+ ...service.metrics,
118
+ requestsPerSecond: service.metrics.requestsPerSecond * 10,
119
+ activeConnections: service.metrics.activeConnections * 5,
120
+ cpuUsage: Math.min(95, (service.metrics.cpuUsage || 50) + 30),
121
+ memoryUsage: Math.min(90, (service.metrics.memoryUsage || 50) + 25),
122
+ },
123
+ }))
124
+
125
+ return (
126
+ <div className="p-6">
127
+ <APMOverview
128
+ services={highLoadServices}
129
+ recentTransactions={defaultAPMTransactions}
130
+ onRefresh={() => console.log('Refresh')}
131
+ />
132
+ </div>
133
+ )
134
+ },
135
+ }
136
+
137
+ export const WithTimeRangeSelector: Story = {
138
+ render: () => {
139
+ const [timeRange, setTimeRange] = React.useState<TimeRange>('1h')
140
+
141
+ return (
142
+ <div className="p-6">
143
+ <APMOverview
144
+ services={defaultAPMServices}
145
+ recentTransactions={defaultAPMTransactions}
146
+ timeRange={timeRange}
147
+ onTimeRangeChange={setTimeRange}
148
+ onRefresh={() => console.log('Refresh for', timeRange)}
149
+ />
150
+ </div>
151
+ )
152
+ },
153
+ }
154
+
155
+ export const ManyServices: Story = {
156
+ render: () => {
157
+ const manyServices: APMService[] = [
158
+ ...defaultAPMServices,
159
+ {
160
+ id: '7',
161
+ name: 'auth-service',
162
+ type: 'api',
163
+ status: 'healthy',
164
+ version: '2.1.0',
165
+ instances: 3,
166
+ metrics: {
167
+ requestsPerSecond: 800,
168
+ avgResponseTime: 35,
169
+ p50ResponseTime: 25,
170
+ p95ResponseTime: 85,
171
+ p99ResponseTime: 150,
172
+ errorRate: 0.08,
173
+ successRate: 99.92,
174
+ activeConnections: 250,
175
+ cpuUsage: 40,
176
+ memoryUsage: 55,
177
+ },
178
+ tags: ['auth', 'production'],
179
+ },
180
+ {
181
+ id: '8',
182
+ name: 'search-service',
183
+ type: 'api',
184
+ status: 'warning',
185
+ version: '1.3.0',
186
+ instances: 4,
187
+ metrics: {
188
+ requestsPerSecond: 450,
189
+ avgResponseTime: 320,
190
+ p50ResponseTime: 200,
191
+ p95ResponseTime: 800,
192
+ p99ResponseTime: 1500,
193
+ errorRate: 1.8,
194
+ successRate: 98.2,
195
+ activeConnections: 180,
196
+ cpuUsage: 65,
197
+ memoryUsage: 70,
198
+ },
199
+ tags: ['search', 'elasticsearch'],
200
+ },
201
+ {
202
+ id: '9',
203
+ name: 'email-worker',
204
+ type: 'worker',
205
+ status: 'healthy',
206
+ instances: 2,
207
+ metrics: {
208
+ requestsPerSecond: 100,
209
+ avgResponseTime: 150,
210
+ p50ResponseTime: 100,
211
+ p95ResponseTime: 400,
212
+ p99ResponseTime: 800,
213
+ errorRate: 0.5,
214
+ successRate: 99.5,
215
+ activeConnections: 0,
216
+ cpuUsage: 20,
217
+ memoryUsage: 35,
218
+ },
219
+ },
220
+ {
221
+ id: '10',
222
+ name: 'cdn-edge',
223
+ type: 'web',
224
+ status: 'healthy',
225
+ instances: 8,
226
+ metrics: {
227
+ requestsPerSecond: 5000,
228
+ avgResponseTime: 12,
229
+ p50ResponseTime: 8,
230
+ p95ResponseTime: 35,
231
+ p99ResponseTime: 80,
232
+ errorRate: 0.01,
233
+ successRate: 99.99,
234
+ activeConnections: 2000,
235
+ },
236
+ tags: ['cdn', 'edge'],
237
+ },
238
+ ]
239
+
240
+ return (
241
+ <div className="p-6">
242
+ <APMOverview
243
+ services={manyServices}
244
+ recentTransactions={defaultAPMTransactions}
245
+ onServiceClick={(service) => console.log('Service:', service.name)}
246
+ />
247
+ </div>
248
+ )
249
+ },
250
+ }
251
+
252
+ export const DatabaseHeavy: Story = {
253
+ render: () => {
254
+ const dbServices: APMService[] = [
255
+ {
256
+ id: '1',
257
+ name: 'postgres-primary',
258
+ type: 'database',
259
+ status: 'healthy',
260
+ version: '15.4',
261
+ instances: 1,
262
+ metrics: {
263
+ requestsPerSecond: 5000,
264
+ avgResponseTime: 5,
265
+ p50ResponseTime: 3,
266
+ p95ResponseTime: 15,
267
+ p99ResponseTime: 45,
268
+ errorRate: 0.001,
269
+ successRate: 99.999,
270
+ activeConnections: 150,
271
+ cpuUsage: 45,
272
+ memoryUsage: 68,
273
+ },
274
+ tags: ['primary', 'production'],
275
+ },
276
+ {
277
+ id: '2',
278
+ name: 'postgres-replica-1',
279
+ type: 'database',
280
+ status: 'healthy',
281
+ version: '15.4',
282
+ instances: 1,
283
+ metrics: {
284
+ requestsPerSecond: 3000,
285
+ avgResponseTime: 4,
286
+ p50ResponseTime: 2,
287
+ p95ResponseTime: 12,
288
+ p99ResponseTime: 35,
289
+ errorRate: 0.001,
290
+ successRate: 99.999,
291
+ activeConnections: 80,
292
+ cpuUsage: 30,
293
+ memoryUsage: 55,
294
+ },
295
+ tags: ['replica', 'read-only'],
296
+ },
297
+ {
298
+ id: '3',
299
+ name: 'redis-cache',
300
+ type: 'cache',
301
+ status: 'healthy',
302
+ version: '7.2',
303
+ instances: 3,
304
+ metrics: {
305
+ requestsPerSecond: 25000,
306
+ avgResponseTime: 0.3,
307
+ p50ResponseTime: 0.2,
308
+ p95ResponseTime: 0.8,
309
+ p99ResponseTime: 2,
310
+ errorRate: 0.0001,
311
+ successRate: 99.9999,
312
+ activeConnections: 500,
313
+ memoryUsage: 42,
314
+ },
315
+ tags: ['cache', 'cluster'],
316
+ },
317
+ {
318
+ id: '4',
319
+ name: 'mongodb-analytics',
320
+ type: 'database',
321
+ status: 'warning',
322
+ version: '7.0',
323
+ instances: 3,
324
+ metrics: {
325
+ requestsPerSecond: 800,
326
+ avgResponseTime: 85,
327
+ p50ResponseTime: 50,
328
+ p95ResponseTime: 250,
329
+ p99ResponseTime: 500,
330
+ errorRate: 0.5,
331
+ successRate: 99.5,
332
+ activeConnections: 100,
333
+ cpuUsage: 75,
334
+ memoryUsage: 82,
335
+ },
336
+ tags: ['analytics', 'sharded'],
337
+ },
338
+ ]
339
+
340
+ return (
341
+ <div className="p-6">
342
+ <APMOverview
343
+ services={dbServices}
344
+ recentTransactions={[]}
345
+ onServiceClick={(service) => console.log('Database:', service.name)}
346
+ />
347
+ </div>
348
+ )
349
+ },
350
+ }
351
+
352
+ export const Empty: Story = {
353
+ render: () => (
354
+ <div className="p-6">
355
+ <APMOverview
356
+ services={[]}
357
+ recentTransactions={[]}
358
+ onRefresh={() => console.log('Refresh')}
359
+ />
360
+ </div>
361
+ ),
362
+ }
363
+
364
+ export const Interactive: Story = {
365
+ render: () => {
366
+ const [services, setServices] = React.useState(defaultAPMServices)
367
+ const [timeRange, setTimeRange] = React.useState<TimeRange>('1h')
368
+
369
+ // Simulate real-time updates
370
+ React.useEffect(() => {
371
+ const interval = setInterval(() => {
372
+ setServices(prev =>
373
+ prev.map(service => ({
374
+ ...service,
375
+ metrics: {
376
+ ...service.metrics,
377
+ requestsPerSecond: service.metrics.requestsPerSecond + (Math.random() - 0.5) * 50,
378
+ avgResponseTime: Math.max(1, service.metrics.avgResponseTime + (Math.random() - 0.5) * 10),
379
+ cpuUsage: service.metrics.cpuUsage
380
+ ? Math.min(100, Math.max(0, service.metrics.cpuUsage + (Math.random() - 0.5) * 5))
381
+ : undefined,
382
+ },
383
+ }))
384
+ )
385
+ }, 3000)
386
+
387
+ return () => clearInterval(interval)
388
+ }, [])
389
+
390
+ return (
391
+ <div className="p-6">
392
+ <APMOverview
393
+ services={services}
394
+ recentTransactions={defaultAPMTransactions}
395
+ timeRange={timeRange}
396
+ onTimeRangeChange={setTimeRange}
397
+ onServiceClick={(service) => alert(`Viewing details for ${service.name}`)}
398
+ onTransactionClick={(tx) => alert(`Viewing trace for ${tx.name}`)}
399
+ onRefresh={() => setServices([...defaultAPMServices])}
400
+ />
401
+ </div>
402
+ )
403
+ },
404
+ }
405
+
406
+ export const ObservabilityDashboard: Story = {
407
+ render: () => (
408
+ <div className="min-h-screen bg-muted/30">
409
+ <header className="bg-background border-b px-6 py-4">
410
+ <div className="flex items-center justify-between">
411
+ <div>
412
+ <h1 className="font-bold text-xl">Observability Platform</h1>
413
+ <p className="text-sm text-muted-foreground">Application Performance Monitoring</p>
414
+ </div>
415
+ <nav className="flex gap-4 text-sm">
416
+ <a href="#" className="text-foreground font-medium">APM</a>
417
+ <a href="#" className="text-muted-foreground hover:text-foreground">Infrastructure</a>
418
+ <a href="#" className="text-muted-foreground hover:text-foreground">Logs</a>
419
+ <a href="#" className="text-muted-foreground hover:text-foreground">Traces</a>
420
+ <a href="#" className="text-muted-foreground hover:text-foreground">Alerts</a>
421
+ </nav>
422
+ </div>
423
+ </header>
424
+ <main className="p-6">
425
+ <APMOverview
426
+ services={defaultAPMServices}
427
+ recentTransactions={defaultAPMTransactions}
428
+ onServiceClick={(service) => console.log('Service:', service)}
429
+ onTransactionClick={(tx) => console.log('Transaction:', tx)}
430
+ onRefresh={() => console.log('Refresh')}
431
+ />
432
+ </main>
433
+ </div>
434
+ ),
435
+ }