@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,331 @@
1
+ import type { Meta, StoryObj } from '@storybook/react'
2
+ import { WakaStatusMatrix } from './index'
3
+ import type { StatusMatrixDataPoint, StatusType } from './index'
4
+ import * as React from 'react'
5
+
6
+ // Generate contribution-style data
7
+ function generateContributionData(days: number = 365): StatusMatrixDataPoint[] {
8
+ const data: StatusMatrixDataPoint[] = []
9
+ const today = new Date()
10
+
11
+ for (let i = days - 1; i >= 0; i--) {
12
+ const date = new Date(today)
13
+ date.setDate(date.getDate() - i)
14
+
15
+ const dayOfWeek = date.getDay()
16
+ const isWeekend = dayOfWeek === 0 || dayOfWeek === 6
17
+ const baseChance = isWeekend ? 0.3 : 0.7
18
+
19
+ let value = 0
20
+ if (Math.random() < baseChance) {
21
+ const max = isWeekend ? 5 : 15
22
+ value = Math.floor(Math.random() * max)
23
+ }
24
+
25
+ data.push({
26
+ date: date.toISOString().split('T')[0],
27
+ value,
28
+ })
29
+ }
30
+
31
+ return data
32
+ }
33
+
34
+ // Generate uptime status data
35
+ function generateUptimeData(days: number = 90): StatusMatrixDataPoint[] {
36
+ const data: StatusMatrixDataPoint[] = []
37
+ const today = new Date()
38
+ const statuses: StatusType[] = ['up', 'up', 'up', 'up', 'up', 'degraded', 'down', 'maintenance']
39
+
40
+ for (let i = days - 1; i >= 0; i--) {
41
+ const date = new Date(today)
42
+ date.setDate(date.getDate() - i)
43
+
44
+ // Mostly up, occasionally issues
45
+ const randomIndex = Math.random() < 0.85 ? 0 : Math.floor(Math.random() * statuses.length)
46
+ const status = statuses[randomIndex]
47
+
48
+ data.push({
49
+ date: date.toISOString().split('T')[0],
50
+ value: status === 'up' ? 100 : status === 'degraded' ? 50 : 0,
51
+ status,
52
+ })
53
+ }
54
+
55
+ return data
56
+ }
57
+
58
+ const contributionData = generateContributionData()
59
+ const uptimeData = generateUptimeData()
60
+
61
+ const meta: Meta<typeof WakaStatusMatrix> = {
62
+ title: 'Components/Charts/WakaStatusMatrix',
63
+ component: WakaStatusMatrix,
64
+ parameters: {
65
+ layout: 'centered',
66
+ docs: {
67
+ description: {
68
+ component: 'A status matrix/heatmap for visualizing time-series data like contributions, uptime status, or activity levels over time.',
69
+ },
70
+ },
71
+ },
72
+ tags: ['autodocs'],
73
+ argTypes: {
74
+ view: {
75
+ control: 'select',
76
+ options: ['year', 'quarter', 'month', 'week'],
77
+ description: 'Time view range',
78
+ },
79
+ colorScheme: {
80
+ control: 'select',
81
+ options: ['green', 'blue', 'purple', 'orange', 'status'],
82
+ description: 'Color scheme',
83
+ },
84
+ cellSize: {
85
+ control: 'select',
86
+ options: ['sm', 'md', 'lg'],
87
+ description: 'Cell size',
88
+ },
89
+ showLabels: {
90
+ control: 'boolean',
91
+ description: 'Show month/day labels',
92
+ },
93
+ showLegend: {
94
+ control: 'boolean',
95
+ description: 'Show legend',
96
+ },
97
+ },
98
+ }
99
+
100
+ export default meta
101
+ type Story = StoryObj<typeof WakaStatusMatrix>
102
+
103
+ export const Default: Story = {
104
+ args: {
105
+ data: contributionData,
106
+ },
107
+ render: (args) => <WakaStatusMatrix {...args} />,
108
+ }
109
+
110
+ export const ColorSchemes: Story = {
111
+ render: () => (
112
+ <div className="space-y-8">
113
+ <div>
114
+ <p className="text-sm text-muted-foreground mb-2">Green (Default)</p>
115
+ <WakaStatusMatrix data={contributionData} colorScheme="green" />
116
+ </div>
117
+ <div>
118
+ <p className="text-sm text-muted-foreground mb-2">Blue</p>
119
+ <WakaStatusMatrix data={contributionData} colorScheme="blue" />
120
+ </div>
121
+ <div>
122
+ <p className="text-sm text-muted-foreground mb-2">Purple</p>
123
+ <WakaStatusMatrix data={contributionData} colorScheme="purple" />
124
+ </div>
125
+ <div>
126
+ <p className="text-sm text-muted-foreground mb-2">Orange</p>
127
+ <WakaStatusMatrix data={contributionData} colorScheme="orange" />
128
+ </div>
129
+ </div>
130
+ ),
131
+ }
132
+
133
+ export const UptimeStatus: Story = {
134
+ render: () => (
135
+ <div className="space-y-4">
136
+ <p className="text-sm text-muted-foreground">Service uptime over the last 90 days</p>
137
+ <WakaStatusMatrix
138
+ data={uptimeData}
139
+ colorScheme="status"
140
+ view="quarter"
141
+ />
142
+ </div>
143
+ ),
144
+ }
145
+
146
+ export const ViewRanges: Story = {
147
+ render: () => (
148
+ <div className="space-y-8">
149
+ <div>
150
+ <p className="text-sm text-muted-foreground mb-2">Year View</p>
151
+ <WakaStatusMatrix data={contributionData} view="year" />
152
+ </div>
153
+ <div>
154
+ <p className="text-sm text-muted-foreground mb-2">Quarter View</p>
155
+ <WakaStatusMatrix data={contributionData} view="quarter" />
156
+ </div>
157
+ <div>
158
+ <p className="text-sm text-muted-foreground mb-2">Month View</p>
159
+ <WakaStatusMatrix data={contributionData} view="month" />
160
+ </div>
161
+ </div>
162
+ ),
163
+ }
164
+
165
+ export const CellSizes: Story = {
166
+ render: () => (
167
+ <div className="space-y-8">
168
+ <div>
169
+ <p className="text-sm text-muted-foreground mb-2">Small</p>
170
+ <WakaStatusMatrix data={contributionData} cellSize="sm" view="quarter" />
171
+ </div>
172
+ <div>
173
+ <p className="text-sm text-muted-foreground mb-2">Medium (Default)</p>
174
+ <WakaStatusMatrix data={contributionData} cellSize="md" view="quarter" />
175
+ </div>
176
+ <div>
177
+ <p className="text-sm text-muted-foreground mb-2">Large</p>
178
+ <WakaStatusMatrix data={contributionData} cellSize="lg" view="quarter" />
179
+ </div>
180
+ </div>
181
+ ),
182
+ }
183
+
184
+ export const NoLabels: Story = {
185
+ render: () => (
186
+ <WakaStatusMatrix data={contributionData} showLabels={false} view="quarter" />
187
+ ),
188
+ }
189
+
190
+ export const NoLegend: Story = {
191
+ render: () => (
192
+ <WakaStatusMatrix data={contributionData} showLegend={false} view="quarter" />
193
+ ),
194
+ }
195
+
196
+ export const Interactive: Story = {
197
+ render: () => {
198
+ const [selectedDate, setSelectedDate] = React.useState<{ date: Date; value: number } | null>(null)
199
+
200
+ return (
201
+ <div className="space-y-4">
202
+ <WakaStatusMatrix
203
+ data={contributionData}
204
+ view="quarter"
205
+ onCellClick={(date, value) => setSelectedDate({ date, value })}
206
+ />
207
+ {selectedDate && (
208
+ <div className="p-4 border rounded-lg bg-muted/50">
209
+ <p className="text-sm text-muted-foreground">
210
+ {selectedDate.date.toLocaleDateString('en-US', {
211
+ weekday: 'long',
212
+ year: 'numeric',
213
+ month: 'long',
214
+ day: 'numeric',
215
+ })}
216
+ </p>
217
+ <p className="text-2xl font-bold">
218
+ {selectedDate.value} contribution{selectedDate.value !== 1 ? 's' : ''}
219
+ </p>
220
+ </div>
221
+ )}
222
+ </div>
223
+ )
224
+ },
225
+ }
226
+
227
+ export const CustomDateRange: Story = {
228
+ render: () => {
229
+ const endDate = new Date()
230
+ const startDate = new Date()
231
+ startDate.setDate(startDate.getDate() - 180) // Last 6 months
232
+
233
+ return (
234
+ <WakaStatusMatrix
235
+ data={contributionData}
236
+ startDate={startDate}
237
+ endDate={endDate}
238
+ />
239
+ )
240
+ },
241
+ }
242
+
243
+ export const ContributionProfile: Story = {
244
+ render: () => {
245
+ const totalContributions = contributionData.reduce((sum, d) => sum + d.value, 0)
246
+ const activeDays = contributionData.filter((d) => d.value > 0).length
247
+
248
+ return (
249
+ <div className="w-[900px] p-6 border rounded-lg">
250
+ <div className="flex items-center gap-4 mb-6">
251
+ <div className="w-16 h-16 rounded-full bg-gradient-to-br from-green-500 to-emerald-600" />
252
+ <div>
253
+ <h3 className="text-xl font-bold">developer_jane</h3>
254
+ <p className="text-sm text-muted-foreground">
255
+ {totalContributions.toLocaleString()} contributions in the last year
256
+ </p>
257
+ </div>
258
+ </div>
259
+ <WakaStatusMatrix data={contributionData} />
260
+ <div className="mt-4 grid grid-cols-4 gap-4 text-center">
261
+ <div className="p-3 border rounded-lg">
262
+ <p className="text-2xl font-bold">{totalContributions.toLocaleString()}</p>
263
+ <p className="text-xs text-muted-foreground">Total</p>
264
+ </div>
265
+ <div className="p-3 border rounded-lg">
266
+ <p className="text-2xl font-bold">{activeDays}</p>
267
+ <p className="text-xs text-muted-foreground">Active Days</p>
268
+ </div>
269
+ <div className="p-3 border rounded-lg">
270
+ <p className="text-2xl font-bold">
271
+ {Math.round((activeDays / 365) * 100)}%
272
+ </p>
273
+ <p className="text-xs text-muted-foreground">Activity Rate</p>
274
+ </div>
275
+ <div className="p-3 border rounded-lg">
276
+ <p className="text-2xl font-bold">
277
+ {Math.max(...contributionData.map((d) => d.value))}
278
+ </p>
279
+ <p className="text-xs text-muted-foreground">Best Day</p>
280
+ </div>
281
+ </div>
282
+ </div>
283
+ )
284
+ },
285
+ }
286
+
287
+ export const UptimeDashboard: Story = {
288
+ render: () => {
289
+ const upCount = uptimeData.filter((d) => d.status === 'up').length
290
+ const uptimePercentage = ((upCount / uptimeData.length) * 100).toFixed(2)
291
+
292
+ return (
293
+ <div className="w-[600px] p-6 border rounded-lg">
294
+ <div className="flex justify-between items-start mb-4">
295
+ <div>
296
+ <h3 className="text-lg font-semibold">API Service Uptime</h3>
297
+ <p className="text-sm text-muted-foreground">Last 90 days</p>
298
+ </div>
299
+ <div className="text-right">
300
+ <p className="text-2xl font-bold text-green-600">{uptimePercentage}%</p>
301
+ <p className="text-xs text-muted-foreground">Uptime</p>
302
+ </div>
303
+ </div>
304
+ <WakaStatusMatrix
305
+ data={uptimeData}
306
+ colorScheme="status"
307
+ view="quarter"
308
+ />
309
+ </div>
310
+ )
311
+ },
312
+ }
313
+
314
+ export const CompactWidget: Story = {
315
+ render: () => {
316
+ const recentData = contributionData.slice(-30)
317
+
318
+ return (
319
+ <div className="p-4 border rounded-lg w-fit">
320
+ <h4 className="text-sm font-medium mb-2">Recent Activity</h4>
321
+ <WakaStatusMatrix
322
+ data={recentData}
323
+ cellSize="sm"
324
+ showLabels={false}
325
+ showLegend={false}
326
+ view="month"
327
+ />
328
+ </div>
329
+ )
330
+ },
331
+ }