@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,464 @@
1
+ import type { Meta, StoryObj } from '@storybook/react'
2
+ import {
3
+ IncidentManager,
4
+ defaultIncidents,
5
+ } from './index'
6
+ import type { Incident, IncidentSeverity, IncidentStatus, IncidentResponder, IncidentEvent } from './index'
7
+ import * as React from 'react'
8
+
9
+ const meta: Meta<typeof IncidentManager> = {
10
+ title: 'Blocks/IncidentManager',
11
+ component: IncidentManager,
12
+ parameters: {
13
+ layout: 'fullscreen',
14
+ docs: {
15
+ description: {
16
+ component:
17
+ 'An incident management dashboard for tracking and responding to production incidents with severity levels, responder assignments, timeline events, and incident lifecycle management.',
18
+ },
19
+ },
20
+ },
21
+ tags: ['autodocs'],
22
+ }
23
+
24
+ export default meta
25
+ type Story = StoryObj<typeof IncidentManager>
26
+
27
+ export const Default: Story = {
28
+ render: () => (
29
+ <div className="p-6">
30
+ <IncidentManager
31
+ incidents={defaultIncidents}
32
+ onCreateIncident={() => console.log('Create incident')}
33
+ onAcknowledge={(incident) => console.log('Acknowledge:', incident.title)}
34
+ onResolve={(incident) => console.log('Resolve:', incident.title)}
35
+ onEscalate={(incident) => console.log('Escalate:', incident.title)}
36
+ />
37
+ </div>
38
+ ),
39
+ }
40
+
41
+ export const NoActiveIncidents: Story = {
42
+ render: () => {
43
+ const resolvedIncidents: Incident[] = [
44
+ {
45
+ id: '1',
46
+ title: 'API latency spike',
47
+ description: 'Resolved - Root cause was database connection pool exhaustion',
48
+ severity: 'high',
49
+ status: 'resolved',
50
+ service: 'api-gateway',
51
+ createdAt: new Date(Date.now() - 6 * 3600000),
52
+ acknowledgedAt: new Date(Date.now() - 5.5 * 3600000),
53
+ resolvedAt: new Date(Date.now() - 4 * 3600000),
54
+ responders: [
55
+ { id: '1', name: 'Alice Chen', role: 'On-Call Engineer', status: 'available' },
56
+ ],
57
+ events: [
58
+ { id: 'e1', type: 'status_change', timestamp: new Date(Date.now() - 4 * 3600000), content: 'Incident resolved' },
59
+ ],
60
+ },
61
+ {
62
+ id: '2',
63
+ title: 'Authentication service timeout',
64
+ severity: 'medium',
65
+ status: 'closed',
66
+ service: 'auth-service',
67
+ createdAt: new Date(Date.now() - 24 * 3600000),
68
+ resolvedAt: new Date(Date.now() - 20 * 3600000),
69
+ responders: [],
70
+ events: [],
71
+ },
72
+ ]
73
+
74
+ return (
75
+ <div className="p-6">
76
+ <IncidentManager
77
+ incidents={resolvedIncidents}
78
+ onCreateIncident={() => console.log('Create incident')}
79
+ />
80
+ </div>
81
+ )
82
+ },
83
+ }
84
+
85
+ export const CriticalIncident: Story = {
86
+ render: () => {
87
+ const criticalIncidents: Incident[] = [
88
+ {
89
+ id: '1',
90
+ title: 'Complete service outage - Production down',
91
+ description: 'All production services are unreachable. Users receiving 503 errors across the board.',
92
+ severity: 'critical',
93
+ status: 'investigating',
94
+ service: 'all-services',
95
+ createdAt: new Date(Date.now() - 15 * 60000),
96
+ acknowledgedAt: new Date(Date.now() - 12 * 60000),
97
+ impact: 'Total outage affecting all 50,000+ active users',
98
+ affectedUsers: 52000,
99
+ slackChannel: 'incident-critical-001',
100
+ runbookUrl: 'https://runbooks.example.com/total-outage',
101
+ responders: [
102
+ { id: '1', name: 'John Doe', role: 'Incident Commander', status: 'engaged' },
103
+ { id: '2', name: 'Jane Smith', role: 'Site Reliability Engineer', status: 'engaged' },
104
+ { id: '3', name: 'Bob Wilson', role: 'Platform Engineer', status: 'engaged' },
105
+ { id: '4', name: 'Alice Chen', role: 'Database Admin', status: 'engaged' },
106
+ ],
107
+ events: [
108
+ { id: 'e1', type: 'status_change', timestamp: new Date(Date.now() - 15 * 60000), content: 'Incident triggered by alerting system' },
109
+ { id: 'e2', type: 'escalation', timestamp: new Date(Date.now() - 14 * 60000), content: 'Escalated to all on-call teams' },
110
+ { id: 'e3', type: 'assignment', timestamp: new Date(Date.now() - 13 * 60000), content: 'John Doe assigned as Incident Commander' },
111
+ { id: 'e4', type: 'status_change', timestamp: new Date(Date.now() - 12 * 60000), content: 'Incident acknowledged' },
112
+ { id: 'e5', type: 'comment', timestamp: new Date(Date.now() - 10 * 60000), content: 'Identified: Cloud provider network issue', user: 'Jane Smith' },
113
+ { id: 'e6', type: 'runbook', timestamp: new Date(Date.now() - 8 * 60000), content: 'Executing failover runbook' },
114
+ ],
115
+ },
116
+ ...defaultIncidents.slice(1),
117
+ ]
118
+
119
+ return (
120
+ <div className="p-6">
121
+ <IncidentManager
122
+ incidents={criticalIncidents}
123
+ onAcknowledge={(incident) => console.log('Acknowledge:', incident.title)}
124
+ onResolve={(incident) => console.log('Resolve:', incident.title)}
125
+ onEscalate={(incident) => console.log('Escalate:', incident.title)}
126
+ />
127
+ </div>
128
+ )
129
+ },
130
+ }
131
+
132
+ export const MultipleActiveIncidents: Story = {
133
+ render: () => {
134
+ const manyIncidents: Incident[] = [
135
+ {
136
+ id: '1',
137
+ title: 'Database replication lag exceeds threshold',
138
+ severity: 'critical',
139
+ status: 'investigating',
140
+ service: 'postgres-replica',
141
+ createdAt: new Date(Date.now() - 30 * 60000),
142
+ affectedUsers: 8000,
143
+ responders: [
144
+ { id: '1', name: 'DBA Team', role: 'Database Admin', status: 'engaged' },
145
+ ],
146
+ events: [
147
+ { id: 'e1', type: 'status_change', timestamp: new Date(Date.now() - 30 * 60000), content: 'Incident triggered' },
148
+ ],
149
+ },
150
+ {
151
+ id: '2',
152
+ title: 'Memory leak detected in user-service',
153
+ severity: 'high',
154
+ status: 'acknowledged',
155
+ service: 'user-service',
156
+ createdAt: new Date(Date.now() - 45 * 60000),
157
+ affectedUsers: 3500,
158
+ responders: [
159
+ { id: '2', name: 'Platform Team', role: 'Platform Engineer', status: 'engaged' },
160
+ ],
161
+ events: [],
162
+ },
163
+ {
164
+ id: '3',
165
+ title: 'CDN cache miss rate spike',
166
+ severity: 'high',
167
+ status: 'triggered',
168
+ service: 'cdn',
169
+ createdAt: new Date(Date.now() - 10 * 60000),
170
+ responders: [],
171
+ events: [],
172
+ },
173
+ {
174
+ id: '4',
175
+ title: 'Elevated 5xx errors on checkout flow',
176
+ severity: 'medium',
177
+ status: 'investigating',
178
+ service: 'checkout-service',
179
+ createdAt: new Date(Date.now() - 60 * 60000),
180
+ affectedUsers: 500,
181
+ responders: [
182
+ { id: '3', name: 'Backend Team', role: 'Backend Engineer', status: 'engaged' },
183
+ ],
184
+ events: [],
185
+ },
186
+ {
187
+ id: '5',
188
+ title: 'SSL certificate expiring in 7 days',
189
+ severity: 'low',
190
+ status: 'acknowledged',
191
+ service: 'api-gateway',
192
+ createdAt: new Date(Date.now() - 2 * 3600000),
193
+ responders: [],
194
+ events: [],
195
+ },
196
+ ]
197
+
198
+ return (
199
+ <div className="p-6">
200
+ <IncidentManager
201
+ incidents={manyIncidents}
202
+ onCreateIncident={() => console.log('Create incident')}
203
+ onAcknowledge={(incident) => console.log('Acknowledge:', incident.title)}
204
+ onResolve={(incident) => console.log('Resolve:', incident.title)}
205
+ />
206
+ </div>
207
+ )
208
+ },
209
+ }
210
+
211
+ export const WithAllStatuses: Story = {
212
+ render: () => {
213
+ const allStatusIncidents: Incident[] = [
214
+ {
215
+ id: '1',
216
+ title: 'New alert: High CPU usage',
217
+ severity: 'medium',
218
+ status: 'triggered',
219
+ service: 'compute-cluster',
220
+ createdAt: new Date(Date.now() - 2 * 60000),
221
+ responders: [],
222
+ events: [],
223
+ },
224
+ {
225
+ id: '2',
226
+ title: 'API rate limiting activated',
227
+ severity: 'medium',
228
+ status: 'acknowledged',
229
+ service: 'api-gateway',
230
+ createdAt: new Date(Date.now() - 15 * 60000),
231
+ acknowledgedAt: new Date(Date.now() - 10 * 60000),
232
+ responders: [{ id: '1', name: 'On-Call', role: 'Engineer', status: 'engaged' }],
233
+ events: [],
234
+ },
235
+ {
236
+ id: '3',
237
+ title: 'Search indexing delays',
238
+ severity: 'high',
239
+ status: 'investigating',
240
+ service: 'search-service',
241
+ createdAt: new Date(Date.now() - 30 * 60000),
242
+ responders: [{ id: '2', name: 'Search Team', role: 'Engineer', status: 'engaged' }],
243
+ events: [],
244
+ },
245
+ {
246
+ id: '4',
247
+ title: 'Payment gateway timeout',
248
+ severity: 'critical',
249
+ status: 'identified',
250
+ service: 'payment-service',
251
+ createdAt: new Date(Date.now() - 45 * 60000),
252
+ impact: 'Third-party provider experiencing issues',
253
+ responders: [{ id: '3', name: 'Payments Team', role: 'Engineer', status: 'engaged' }],
254
+ events: [],
255
+ },
256
+ {
257
+ id: '5',
258
+ title: 'Cache invalidation issue',
259
+ severity: 'medium',
260
+ status: 'resolved',
261
+ service: 'redis-cluster',
262
+ createdAt: new Date(Date.now() - 3 * 3600000),
263
+ resolvedAt: new Date(Date.now() - 2 * 3600000),
264
+ responders: [],
265
+ events: [],
266
+ },
267
+ {
268
+ id: '6',
269
+ title: 'DNS resolution delays',
270
+ severity: 'low',
271
+ status: 'closed',
272
+ service: 'dns',
273
+ createdAt: new Date(Date.now() - 24 * 3600000),
274
+ resolvedAt: new Date(Date.now() - 20 * 3600000),
275
+ responders: [],
276
+ events: [],
277
+ },
278
+ ]
279
+
280
+ return (
281
+ <div className="p-6">
282
+ <IncidentManager
283
+ incidents={allStatusIncidents}
284
+ onAcknowledge={(incident) => console.log('Acknowledge:', incident.title)}
285
+ onResolve={(incident) => console.log('Resolve:', incident.title)}
286
+ />
287
+ </div>
288
+ )
289
+ },
290
+ }
291
+
292
+ export const Interactive: Story = {
293
+ render: () => {
294
+ const [incidents, setIncidents] = React.useState<Incident[]>(defaultIncidents)
295
+
296
+ const handleAcknowledge = (incident: Incident) => {
297
+ setIncidents(prev =>
298
+ prev.map(i =>
299
+ i.id === incident.id
300
+ ? {
301
+ ...i,
302
+ status: 'acknowledged' as IncidentStatus,
303
+ acknowledgedAt: new Date(),
304
+ events: [
305
+ ...i.events,
306
+ {
307
+ id: `e-${Date.now()}`,
308
+ type: 'status_change' as const,
309
+ timestamp: new Date(),
310
+ content: 'Incident acknowledged',
311
+ },
312
+ ],
313
+ }
314
+ : i
315
+ )
316
+ )
317
+ }
318
+
319
+ const handleResolve = (incident: Incident) => {
320
+ setIncidents(prev =>
321
+ prev.map(i =>
322
+ i.id === incident.id
323
+ ? {
324
+ ...i,
325
+ status: 'resolved' as IncidentStatus,
326
+ resolvedAt: new Date(),
327
+ events: [
328
+ ...i.events,
329
+ {
330
+ id: `e-${Date.now()}`,
331
+ type: 'status_change' as const,
332
+ timestamp: new Date(),
333
+ content: 'Incident resolved',
334
+ },
335
+ ],
336
+ }
337
+ : i
338
+ )
339
+ )
340
+ }
341
+
342
+ const handleCreate = () => {
343
+ const newIncident: Incident = {
344
+ id: `inc-${Date.now()}`,
345
+ title: 'New incident created',
346
+ severity: 'medium',
347
+ status: 'triggered',
348
+ service: 'unknown',
349
+ createdAt: new Date(),
350
+ responders: [],
351
+ events: [
352
+ {
353
+ id: `e-${Date.now()}`,
354
+ type: 'status_change',
355
+ timestamp: new Date(),
356
+ content: 'Incident created manually',
357
+ },
358
+ ],
359
+ }
360
+ setIncidents(prev => [newIncident, ...prev])
361
+ }
362
+
363
+ return (
364
+ <div className="p-6">
365
+ <IncidentManager
366
+ incidents={incidents}
367
+ onCreateIncident={handleCreate}
368
+ onAcknowledge={handleAcknowledge}
369
+ onResolve={handleResolve}
370
+ onEscalate={(incident) => alert(`Escalating: ${incident.title}`)}
371
+ />
372
+ </div>
373
+ )
374
+ },
375
+ }
376
+
377
+ export const OnCallDashboard: Story = {
378
+ render: () => (
379
+ <div className="min-h-screen bg-muted/30">
380
+ <header className="bg-background border-b px-6 py-4">
381
+ <div className="flex items-center justify-between">
382
+ <div>
383
+ <h1 className="font-bold text-xl">On-Call Dashboard</h1>
384
+ <p className="text-sm text-muted-foreground">Incident Response & Management</p>
385
+ </div>
386
+ <nav className="flex gap-4 text-sm">
387
+ <a href="#" className="text-foreground font-medium">Active Incidents</a>
388
+ <a href="#" className="text-muted-foreground hover:text-foreground">On-Call Schedule</a>
389
+ <a href="#" className="text-muted-foreground hover:text-foreground">Runbooks</a>
390
+ <a href="#" className="text-muted-foreground hover:text-foreground">Post-Mortems</a>
391
+ </nav>
392
+ </div>
393
+ </header>
394
+ <main className="p-6">
395
+ <IncidentManager
396
+ incidents={defaultIncidents}
397
+ onCreateIncident={() => console.log('Create incident')}
398
+ onAcknowledge={(incident) => console.log('Acknowledge:', incident.title)}
399
+ onResolve={(incident) => console.log('Resolve:', incident.title)}
400
+ onEscalate={(incident) => console.log('Escalate:', incident.title)}
401
+ />
402
+ </main>
403
+ </div>
404
+ ),
405
+ }
406
+
407
+ export const PostMortemReview: Story = {
408
+ render: () => {
409
+ const historicalIncidents: Incident[] = [
410
+ {
411
+ id: '1',
412
+ title: 'Major outage - Payment processing failure',
413
+ description: 'Complete payment system unavailable for 2 hours due to database failover issue',
414
+ severity: 'critical',
415
+ status: 'closed',
416
+ service: 'payment-service',
417
+ createdAt: new Date(Date.now() - 7 * 24 * 3600000),
418
+ acknowledgedAt: new Date(Date.now() - 7 * 24 * 3600000 + 5 * 60000),
419
+ resolvedAt: new Date(Date.now() - 7 * 24 * 3600000 + 2 * 3600000),
420
+ impact: '$250,000 in lost transactions',
421
+ affectedUsers: 45000,
422
+ responders: [
423
+ { id: '1', name: 'John Doe', role: 'Incident Commander', status: 'available' },
424
+ { id: '2', name: 'Jane Smith', role: 'DBA', status: 'available' },
425
+ ],
426
+ events: Array.from({ length: 15 }, (_, i) => ({
427
+ id: `e-${i}`,
428
+ type: 'comment' as const,
429
+ timestamp: new Date(Date.now() - 7 * 24 * 3600000 + i * 10 * 60000),
430
+ content: `Event ${i + 1} during incident response`,
431
+ })),
432
+ },
433
+ {
434
+ id: '2',
435
+ title: 'API performance degradation',
436
+ severity: 'high',
437
+ status: 'closed',
438
+ service: 'api-gateway',
439
+ createdAt: new Date(Date.now() - 14 * 24 * 3600000),
440
+ resolvedAt: new Date(Date.now() - 14 * 24 * 3600000 + 45 * 60000),
441
+ affectedUsers: 12000,
442
+ responders: [],
443
+ events: [],
444
+ },
445
+ {
446
+ id: '3',
447
+ title: 'Data sync failure',
448
+ severity: 'medium',
449
+ status: 'closed',
450
+ service: 'sync-service',
451
+ createdAt: new Date(Date.now() - 21 * 24 * 3600000),
452
+ resolvedAt: new Date(Date.now() - 21 * 24 * 3600000 + 30 * 60000),
453
+ responders: [],
454
+ events: [],
455
+ },
456
+ ]
457
+
458
+ return (
459
+ <div className="p-6">
460
+ <IncidentManager incidents={historicalIncidents} />
461
+ </div>
462
+ )
463
+ },
464
+ }
@@ -23,7 +23,7 @@ export type { LoginProps, LoginConfig, LoginColorConfig, LoginThemeConfig, Login
23
23
 
24
24
  // Sidebar
25
25
  export { WakaSidebar, useSidebar, SidebarLayout } from './sidebar'
26
- export type { WakaSidebarProps, SidebarMenuItem, SidebarUserConfig, SidebarLogoConfig, SidebarLayoutProps } from './sidebar'
26
+ export type { WakaSidebarProps, SidebarMenuItem, SidebarUserConfig, SidebarLogoConfig, SidebarLayoutProps, LinkComponentProps } from './sidebar'
27
27
 
28
28
  // Header
29
29
  export { WakaHeader } from './header'