@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,422 @@
1
+ import type { Meta, StoryObj } from '@storybook/react'
2
+ import { DashboardKPI, defaultKPIMetrics, defaultGoals } from './index'
3
+ import type { KPIMetric } from './index'
4
+ import * as React from 'react'
5
+ import { DollarSign, Users, ShoppingCart, Activity, TrendingUp, Eye, Clock, Zap } from 'lucide-react'
6
+
7
+ const meta: Meta<typeof DashboardKPI> = {
8
+ title: 'Blocks/DashboardKPI',
9
+ component: DashboardKPI,
10
+ parameters: {
11
+ layout: 'fullscreen',
12
+ docs: {
13
+ description: {
14
+ component:
15
+ 'A KPI dashboard component with metric cards, sparklines, goals tracking, period selector, and optional charts.',
16
+ },
17
+ },
18
+ },
19
+ tags: ['autodocs'],
20
+ argTypes: {
21
+ isLoading: {
22
+ control: 'boolean',
23
+ },
24
+ },
25
+ }
26
+
27
+ export default meta
28
+ type Story = StoryObj<typeof DashboardKPI>
29
+
30
+ // Mock chart component
31
+ const MockChart = ({ height = 300 }: { height?: number }) => (
32
+ <div
33
+ className="bg-muted/30 rounded-lg flex items-center justify-center"
34
+ style={{ height }}
35
+ >
36
+ <span className="text-muted-foreground text-sm">Chart Area</span>
37
+ </div>
38
+ )
39
+
40
+ export const Default: Story = {
41
+ render: () => (
42
+ <div className="p-6">
43
+ <DashboardKPI
44
+ title="Dashboard"
45
+ description="Key performance indicators"
46
+ metrics={defaultKPIMetrics}
47
+ selectedPeriod="30d"
48
+ onPeriodChange={(period) => console.log('Period:', period)}
49
+ onRefresh={() => console.log('Refresh')}
50
+ />
51
+ </div>
52
+ ),
53
+ }
54
+
55
+ export const WithChart: Story = {
56
+ render: () => (
57
+ <div className="p-6">
58
+ <DashboardKPI
59
+ title="Performance Overview"
60
+ description="Track your key metrics"
61
+ metrics={defaultKPIMetrics}
62
+ chart={<MockChart />}
63
+ selectedPeriod="30d"
64
+ onPeriodChange={(period) => console.log('Period:', period)}
65
+ />
66
+ </div>
67
+ ),
68
+ }
69
+
70
+ export const WithGoals: Story = {
71
+ render: () => (
72
+ <div className="p-6">
73
+ <DashboardKPI
74
+ title="Goals & Targets"
75
+ description="Track progress towards objectives"
76
+ metrics={defaultKPIMetrics}
77
+ goals={defaultGoals}
78
+ selectedPeriod="30d"
79
+ onPeriodChange={(period) => console.log('Period:', period)}
80
+ />
81
+ </div>
82
+ ),
83
+ }
84
+
85
+ export const WithSecondaryMetrics: Story = {
86
+ render: () => {
87
+ const secondaryMetrics: KPIMetric[] = [
88
+ {
89
+ id: 'bounce-rate',
90
+ label: 'Bounce Rate',
91
+ value: '42.3%',
92
+ change: -5.2,
93
+ trend: 'up',
94
+ },
95
+ {
96
+ id: 'session-duration',
97
+ label: 'Avg. Session',
98
+ value: '3m 42s',
99
+ change: 12.1,
100
+ trend: 'up',
101
+ },
102
+ {
103
+ id: 'pages-per-session',
104
+ label: 'Pages/Session',
105
+ value: '4.2',
106
+ change: 8.5,
107
+ trend: 'up',
108
+ },
109
+ ]
110
+
111
+ return (
112
+ <div className="p-6">
113
+ <DashboardKPI
114
+ title="Website Analytics"
115
+ metrics={defaultKPIMetrics}
116
+ secondaryMetrics={secondaryMetrics}
117
+ selectedPeriod="30d"
118
+ onPeriodChange={(period) => console.log('Period:', period)}
119
+ />
120
+ </div>
121
+ )
122
+ },
123
+ }
124
+
125
+ export const Complete: Story = {
126
+ render: () => {
127
+ const secondaryMetrics: KPIMetric[] = [
128
+ { id: 'cac', label: 'CAC', value: '$42', change: -8, trend: 'up' },
129
+ { id: 'ltv', label: 'LTV', value: '$890', change: 15, trend: 'up' },
130
+ { id: 'churn', label: 'Churn Rate', value: '2.1%', change: -0.3, trend: 'up' },
131
+ ]
132
+
133
+ return (
134
+ <div className="p-6">
135
+ <DashboardKPI
136
+ title="Business Metrics"
137
+ description="Complete overview of your business performance"
138
+ metrics={defaultKPIMetrics}
139
+ secondaryMetrics={secondaryMetrics}
140
+ goals={defaultGoals}
141
+ chart={<MockChart />}
142
+ selectedPeriod="30d"
143
+ onPeriodChange={(period) => console.log('Period:', period)}
144
+ onRefresh={() => console.log('Refresh')}
145
+ onExport={() => console.log('Export')}
146
+ lastUpdated={new Date()}
147
+ />
148
+ </div>
149
+ )
150
+ },
151
+ }
152
+
153
+ export const Loading: Story = {
154
+ render: () => (
155
+ <div className="p-6">
156
+ <DashboardKPI
157
+ title="Loading..."
158
+ metrics={defaultKPIMetrics}
159
+ isLoading
160
+ />
161
+ </div>
162
+ ),
163
+ }
164
+
165
+ export const WithLastUpdated: Story = {
166
+ render: () => (
167
+ <div className="p-6">
168
+ <DashboardKPI
169
+ title="Real-time Dashboard"
170
+ metrics={defaultKPIMetrics}
171
+ lastUpdated={new Date()}
172
+ onRefresh={() => console.log('Refresh')}
173
+ />
174
+ </div>
175
+ ),
176
+ }
177
+
178
+ export const CustomMetrics: Story = {
179
+ render: () => {
180
+ const customMetrics: KPIMetric[] = [
181
+ {
182
+ id: 'mrr',
183
+ label: 'Monthly Recurring Revenue',
184
+ value: '$124,500',
185
+ change: 12.5,
186
+ changeLabel: 'vs last month',
187
+ trend: 'up',
188
+ icon: <DollarSign className="h-4 w-4" />,
189
+ color: 'green',
190
+ sparkline: [80, 90, 85, 95, 100, 110, 125],
191
+ },
192
+ {
193
+ id: 'arr',
194
+ label: 'Annual Run Rate',
195
+ value: '$1.49M',
196
+ change: 18.2,
197
+ trend: 'up',
198
+ icon: <TrendingUp className="h-4 w-4" />,
199
+ color: 'blue',
200
+ sparkline: [1.1, 1.15, 1.2, 1.25, 1.3, 1.4, 1.49],
201
+ },
202
+ {
203
+ id: 'customers',
204
+ label: 'Total Customers',
205
+ value: '2,847',
206
+ change: 8.3,
207
+ trend: 'up',
208
+ icon: <Users className="h-4 w-4" />,
209
+ color: 'purple',
210
+ sparkline: [2400, 2500, 2550, 2600, 2700, 2780, 2847],
211
+ },
212
+ {
213
+ id: 'nps',
214
+ label: 'NPS Score',
215
+ value: '72',
216
+ change: 5,
217
+ trend: 'up',
218
+ icon: <Zap className="h-4 w-4" />,
219
+ color: 'yellow',
220
+ sparkline: [65, 66, 68, 67, 70, 71, 72],
221
+ },
222
+ ]
223
+
224
+ return (
225
+ <div className="p-6">
226
+ <DashboardKPI
227
+ title="SaaS Metrics"
228
+ description="Key SaaS performance indicators"
229
+ metrics={customMetrics}
230
+ selectedPeriod="30d"
231
+ onPeriodChange={(period) => console.log('Period:', period)}
232
+ />
233
+ </div>
234
+ )
235
+ },
236
+ }
237
+
238
+ export const WithTargetProgress: Story = {
239
+ render: () => {
240
+ const metricsWithTargets: KPIMetric[] = [
241
+ {
242
+ id: 'revenue',
243
+ label: 'Revenue Target',
244
+ value: '$45,000',
245
+ icon: <DollarSign className="h-4 w-4" />,
246
+ color: 'green',
247
+ target: 50000,
248
+ current: 45000,
249
+ },
250
+ {
251
+ id: 'users',
252
+ label: 'User Acquisition',
253
+ value: '1,850',
254
+ icon: <Users className="h-4 w-4" />,
255
+ color: 'blue',
256
+ target: 2000,
257
+ current: 1850,
258
+ },
259
+ {
260
+ id: 'conversion',
261
+ label: 'Conversion Rate',
262
+ value: '3.8%',
263
+ icon: <Activity className="h-4 w-4" />,
264
+ color: 'purple',
265
+ target: 5,
266
+ current: 3.8,
267
+ },
268
+ {
269
+ id: 'engagement',
270
+ label: 'Engagement Score',
271
+ value: '78',
272
+ icon: <Zap className="h-4 w-4" />,
273
+ color: 'yellow',
274
+ target: 80,
275
+ current: 78,
276
+ },
277
+ ]
278
+
279
+ return (
280
+ <div className="p-6">
281
+ <DashboardKPI
282
+ title="Quarterly Targets"
283
+ description="Progress towards Q4 goals"
284
+ metrics={metricsWithTargets}
285
+ selectedPeriod="90d"
286
+ periods={[
287
+ { value: '30d', label: 'This Month' },
288
+ { value: '90d', label: 'This Quarter' },
289
+ { value: '12m', label: 'This Year' },
290
+ ]}
291
+ onPeriodChange={(period) => console.log('Period:', period)}
292
+ />
293
+ </div>
294
+ )
295
+ },
296
+ }
297
+
298
+ export const Interactive: Story = {
299
+ render: () => {
300
+ const [period, setPeriod] = React.useState('30d')
301
+ const [loading, setLoading] = React.useState(false)
302
+
303
+ const handleRefresh = () => {
304
+ setLoading(true)
305
+ setTimeout(() => setLoading(false), 1500)
306
+ }
307
+
308
+ return (
309
+ <div className="p-6">
310
+ <DashboardKPI
311
+ title="Interactive Dashboard"
312
+ description={`Showing data for: ${period}`}
313
+ metrics={defaultKPIMetrics}
314
+ goals={defaultGoals}
315
+ selectedPeriod={period}
316
+ onPeriodChange={setPeriod}
317
+ onRefresh={handleRefresh}
318
+ onExport={() => alert('Exporting...')}
319
+ isLoading={loading}
320
+ lastUpdated={new Date()}
321
+ />
322
+ </div>
323
+ )
324
+ },
325
+ }
326
+
327
+ export const MinimalMetrics: Story = {
328
+ render: () => {
329
+ const minimalMetrics: KPIMetric[] = [
330
+ { id: '1', label: 'Total Users', value: '12,345' },
331
+ { id: '2', label: 'Active Today', value: '1,234' },
332
+ { id: '3', label: 'New Signups', value: '89' },
333
+ { id: '4', label: 'Revenue', value: '$4,567' },
334
+ ]
335
+
336
+ return (
337
+ <div className="p-6">
338
+ <DashboardKPI
339
+ title="Quick Stats"
340
+ metrics={minimalMetrics}
341
+ />
342
+ </div>
343
+ )
344
+ },
345
+ }
346
+
347
+ export const MarketingDashboard: Story = {
348
+ render: () => {
349
+ const marketingMetrics: KPIMetric[] = [
350
+ {
351
+ id: 'impressions',
352
+ label: 'Impressions',
353
+ value: '2.4M',
354
+ change: 23.5,
355
+ trend: 'up',
356
+ icon: <Eye className="h-4 w-4" />,
357
+ color: 'blue',
358
+ sparkline: [1.8, 1.9, 2.0, 2.1, 2.2, 2.3, 2.4],
359
+ },
360
+ {
361
+ id: 'clicks',
362
+ label: 'Clicks',
363
+ value: '48,320',
364
+ change: 18.2,
365
+ trend: 'up',
366
+ icon: <Activity className="h-4 w-4" />,
367
+ color: 'green',
368
+ sparkline: [35000, 38000, 40000, 42000, 45000, 47000, 48320],
369
+ },
370
+ {
371
+ id: 'ctr',
372
+ label: 'CTR',
373
+ value: '2.01%',
374
+ change: -0.15,
375
+ trend: 'down',
376
+ icon: <TrendingUp className="h-4 w-4" />,
377
+ color: 'yellow',
378
+ sparkline: [2.2, 2.18, 2.15, 2.1, 2.05, 2.02, 2.01],
379
+ },
380
+ {
381
+ id: 'cost',
382
+ label: 'Ad Spend',
383
+ value: '$12,450',
384
+ change: 5.3,
385
+ trend: 'up',
386
+ icon: <DollarSign className="h-4 w-4" />,
387
+ color: 'purple',
388
+ sparkline: [10000, 10500, 11000, 11500, 12000, 12200, 12450],
389
+ },
390
+ ]
391
+
392
+ const marketingGoals = [
393
+ { id: 'leads', label: 'Monthly Leads', current: 850, target: 1000, unit: '' },
394
+ { id: 'cpl', label: 'Cost per Lead', current: 14.6, target: 15, unit: '$' },
395
+ { id: 'roas', label: 'ROAS', current: 4.2, target: 4, unit: 'x' },
396
+ ]
397
+
398
+ return (
399
+ <div className="min-h-screen bg-muted/30">
400
+ <header className="bg-background border-b px-6 py-4">
401
+ <div className="flex items-center justify-between">
402
+ <span className="font-bold text-xl">Marketing Dashboard</span>
403
+ </div>
404
+ </header>
405
+ <main className="p-6">
406
+ <DashboardKPI
407
+ title="Campaign Performance"
408
+ description="Overview of all active marketing campaigns"
409
+ metrics={marketingMetrics}
410
+ goals={marketingGoals}
411
+ chart={<MockChart height={350} />}
412
+ selectedPeriod="30d"
413
+ onPeriodChange={(period) => console.log('Period:', period)}
414
+ onRefresh={() => console.log('Refresh')}
415
+ onExport={() => console.log('Export')}
416
+ lastUpdated={new Date()}
417
+ />
418
+ </main>
419
+ </div>
420
+ )
421
+ },
422
+ }