@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,389 @@
1
+ import type { Meta, StoryObj } from '@storybook/react'
2
+ import { WakaSankeyDiagram, useSankeyDiagram } from './index'
3
+ import type { SankeyNode, SankeyLink } from './index'
4
+ import * as React from 'react'
5
+
6
+ const websiteTrafficNodes: SankeyNode[] = [
7
+ { id: 'organic', label: 'Organic Search', category: 'primary', value: 5000 },
8
+ { id: 'direct', label: 'Direct', category: 'secondary', value: 3000 },
9
+ { id: 'social', label: 'Social Media', category: 'info', value: 2000 },
10
+ { id: 'referral', label: 'Referral', category: 'success', value: 1500 },
11
+ { id: 'landing', label: 'Landing Page', value: 7000 },
12
+ { id: 'pricing', label: 'Pricing Page', value: 4000 },
13
+ { id: 'features', label: 'Features Page', value: 3500 },
14
+ { id: 'signup', label: 'Sign Up', category: 'success', value: 2500 },
15
+ { id: 'demo', label: 'Request Demo', category: 'warning', value: 1000 },
16
+ { id: 'bounce', label: 'Bounced', category: 'danger', value: 2000 },
17
+ ]
18
+
19
+ const websiteTrafficLinks: SankeyLink[] = [
20
+ { source: 'organic', target: 'landing', value: 3500 },
21
+ { source: 'organic', target: 'features', value: 1500 },
22
+ { source: 'direct', target: 'landing', value: 1500 },
23
+ { source: 'direct', target: 'pricing', value: 1500 },
24
+ { source: 'social', target: 'landing', value: 1500 },
25
+ { source: 'social', target: 'features', value: 500 },
26
+ { source: 'referral', target: 'pricing', value: 1000 },
27
+ { source: 'referral', target: 'features', value: 500 },
28
+ { source: 'landing', target: 'pricing', value: 3000 },
29
+ { source: 'landing', target: 'signup', value: 2000 },
30
+ { source: 'landing', target: 'bounce', value: 2000 },
31
+ { source: 'pricing', target: 'signup', value: 2500 },
32
+ { source: 'pricing', target: 'demo', value: 1000 },
33
+ { source: 'features', target: 'pricing', value: 2500 },
34
+ { source: 'features', target: 'signup', value: 500 },
35
+ ]
36
+
37
+ const energyFlowNodes: SankeyNode[] = [
38
+ { id: 'solar', label: 'Solar', color: '#f59e0b' },
39
+ { id: 'wind', label: 'Wind', color: '#3b82f6' },
40
+ { id: 'hydro', label: 'Hydro', color: '#06b6d4' },
41
+ { id: 'nuclear', label: 'Nuclear', color: '#8b5cf6' },
42
+ { id: 'grid', label: 'Power Grid' },
43
+ { id: 'residential', label: 'Residential', color: '#22c55e' },
44
+ { id: 'commercial', label: 'Commercial', color: '#ec4899' },
45
+ { id: 'industrial', label: 'Industrial', color: '#ef4444' },
46
+ { id: 'loss', label: 'Transmission Loss', color: '#6b7280' },
47
+ ]
48
+
49
+ const energyFlowLinks: SankeyLink[] = [
50
+ { source: 'solar', target: 'grid', value: 2500 },
51
+ { source: 'wind', target: 'grid', value: 3000 },
52
+ { source: 'hydro', target: 'grid', value: 2000 },
53
+ { source: 'nuclear', target: 'grid', value: 4000 },
54
+ { source: 'grid', target: 'residential', value: 4500 },
55
+ { source: 'grid', target: 'commercial', value: 3500 },
56
+ { source: 'grid', target: 'industrial', value: 2500 },
57
+ { source: 'grid', target: 'loss', value: 1000 },
58
+ ]
59
+
60
+ const budgetNodes: SankeyNode[] = [
61
+ { id: 'salary', label: 'Salary', category: 'primary', value: 8000 },
62
+ { id: 'freelance', label: 'Freelance', category: 'secondary', value: 2000 },
63
+ { id: 'income', label: 'Total Income' },
64
+ { id: 'needs', label: 'Needs' },
65
+ { id: 'wants', label: 'Wants' },
66
+ { id: 'savings', label: 'Savings', category: 'success' },
67
+ { id: 'rent', label: 'Rent' },
68
+ { id: 'utilities', label: 'Utilities' },
69
+ { id: 'groceries', label: 'Groceries' },
70
+ { id: 'entertainment', label: 'Entertainment' },
71
+ { id: 'dining', label: 'Dining Out' },
72
+ ]
73
+
74
+ const budgetLinks: SankeyLink[] = [
75
+ { source: 'salary', target: 'income', value: 8000 },
76
+ { source: 'freelance', target: 'income', value: 2000 },
77
+ { source: 'income', target: 'needs', value: 5000 },
78
+ { source: 'income', target: 'wants', value: 3000 },
79
+ { source: 'income', target: 'savings', value: 2000 },
80
+ { source: 'needs', target: 'rent', value: 2500 },
81
+ { source: 'needs', target: 'utilities', value: 500 },
82
+ { source: 'needs', target: 'groceries', value: 1000 },
83
+ { source: 'needs', target: 'entertainment', value: 1000 },
84
+ { source: 'wants', target: 'dining', value: 1500 },
85
+ { source: 'wants', target: 'entertainment', value: 1500 },
86
+ ]
87
+
88
+ const meta: Meta<typeof WakaSankeyDiagram> = {
89
+ title: 'Components/Charts/WakaSankeyDiagram',
90
+ component: WakaSankeyDiagram,
91
+ parameters: {
92
+ layout: 'centered',
93
+ docs: {
94
+ description: {
95
+ component: 'A Sankey diagram for visualizing flow data with support for multiple stages, categories, and interactive tooltips.',
96
+ },
97
+ },
98
+ },
99
+ tags: ['autodocs'],
100
+ argTypes: {
101
+ orientation: {
102
+ control: 'select',
103
+ options: ['horizontal', 'vertical'],
104
+ description: 'Flow orientation',
105
+ },
106
+ nodeWidth: {
107
+ control: { type: 'range', min: 10, max: 40, step: 2 },
108
+ description: 'Width of node rectangles',
109
+ },
110
+ nodePadding: {
111
+ control: { type: 'range', min: 5, max: 30, step: 5 },
112
+ description: 'Padding between nodes',
113
+ },
114
+ showValues: {
115
+ control: 'boolean',
116
+ description: 'Show value labels on nodes',
117
+ },
118
+ showTooltips: {
119
+ control: 'boolean',
120
+ description: 'Show tooltips on hover',
121
+ },
122
+ draggable: {
123
+ control: 'boolean',
124
+ description: 'Enable node dragging',
125
+ },
126
+ animated: {
127
+ control: 'boolean',
128
+ description: 'Enable animations',
129
+ },
130
+ linkOpacity: {
131
+ control: { type: 'range', min: 0.1, max: 1, step: 0.1 },
132
+ description: 'Link opacity',
133
+ },
134
+ },
135
+ }
136
+
137
+ export default meta
138
+ type Story = StoryObj<typeof WakaSankeyDiagram>
139
+
140
+ export const Default: Story = {
141
+ args: {
142
+ nodes: websiteTrafficNodes,
143
+ links: websiteTrafficLinks,
144
+ width: 800,
145
+ height: 500,
146
+ },
147
+ render: (args) => <WakaSankeyDiagram {...args} />,
148
+ }
149
+
150
+ export const Orientations: Story = {
151
+ render: () => (
152
+ <div className="space-y-8">
153
+ <div>
154
+ <p className="text-sm text-muted-foreground mb-2">Horizontal (Default)</p>
155
+ <WakaSankeyDiagram
156
+ nodes={energyFlowNodes}
157
+ links={energyFlowLinks}
158
+ orientation="horizontal"
159
+ width={700}
160
+ height={350}
161
+ />
162
+ </div>
163
+ <div>
164
+ <p className="text-sm text-muted-foreground mb-2">Vertical</p>
165
+ <WakaSankeyDiagram
166
+ nodes={energyFlowNodes}
167
+ links={energyFlowLinks}
168
+ orientation="vertical"
169
+ width={500}
170
+ height={500}
171
+ />
172
+ </div>
173
+ </div>
174
+ ),
175
+ }
176
+
177
+ export const EnergyFlow: Story = {
178
+ render: () => (
179
+ <div className="p-4">
180
+ <h3 className="text-lg font-semibold mb-2">Energy Production to Consumption</h3>
181
+ <WakaSankeyDiagram
182
+ nodes={energyFlowNodes}
183
+ links={energyFlowLinks}
184
+ width={750}
185
+ height={400}
186
+ />
187
+ </div>
188
+ ),
189
+ }
190
+
191
+ export const BudgetFlow: Story = {
192
+ render: () => (
193
+ <div className="p-4">
194
+ <h3 className="text-lg font-semibold mb-2">Monthly Budget Allocation</h3>
195
+ <WakaSankeyDiagram
196
+ nodes={budgetNodes}
197
+ links={budgetLinks}
198
+ width={800}
199
+ height={450}
200
+ />
201
+ </div>
202
+ ),
203
+ }
204
+
205
+ export const NoValues: Story = {
206
+ render: () => (
207
+ <WakaSankeyDiagram
208
+ nodes={energyFlowNodes}
209
+ links={energyFlowLinks}
210
+ showValues={false}
211
+ width={700}
212
+ height={400}
213
+ />
214
+ ),
215
+ }
216
+
217
+ export const NoTooltips: Story = {
218
+ render: () => (
219
+ <WakaSankeyDiagram
220
+ nodes={energyFlowNodes}
221
+ links={energyFlowLinks}
222
+ showTooltips={false}
223
+ width={700}
224
+ height={400}
225
+ />
226
+ ),
227
+ }
228
+
229
+ export const NoDragging: Story = {
230
+ render: () => (
231
+ <WakaSankeyDiagram
232
+ nodes={energyFlowNodes}
233
+ links={energyFlowLinks}
234
+ draggable={false}
235
+ width={700}
236
+ height={400}
237
+ />
238
+ ),
239
+ }
240
+
241
+ export const CustomNodeWidth: Story = {
242
+ render: () => (
243
+ <div className="space-y-8">
244
+ <div>
245
+ <p className="text-sm text-muted-foreground mb-2">Thin nodes (12px)</p>
246
+ <WakaSankeyDiagram
247
+ nodes={energyFlowNodes}
248
+ links={energyFlowLinks}
249
+ nodeWidth={12}
250
+ width={600}
251
+ height={300}
252
+ />
253
+ </div>
254
+ <div>
255
+ <p className="text-sm text-muted-foreground mb-2">Wide nodes (30px)</p>
256
+ <WakaSankeyDiagram
257
+ nodes={energyFlowNodes}
258
+ links={energyFlowLinks}
259
+ nodeWidth={30}
260
+ width={600}
261
+ height={300}
262
+ />
263
+ </div>
264
+ </div>
265
+ ),
266
+ }
267
+
268
+ export const LinkOpacity: Story = {
269
+ render: () => (
270
+ <div className="space-y-8">
271
+ <div>
272
+ <p className="text-sm text-muted-foreground mb-2">Low opacity (0.3)</p>
273
+ <WakaSankeyDiagram
274
+ nodes={energyFlowNodes}
275
+ links={energyFlowLinks}
276
+ linkOpacity={0.3}
277
+ width={600}
278
+ height={300}
279
+ />
280
+ </div>
281
+ <div>
282
+ <p className="text-sm text-muted-foreground mb-2">High opacity (0.7)</p>
283
+ <WakaSankeyDiagram
284
+ nodes={energyFlowNodes}
285
+ links={energyFlowLinks}
286
+ linkOpacity={0.7}
287
+ width={600}
288
+ height={300}
289
+ />
290
+ </div>
291
+ </div>
292
+ ),
293
+ }
294
+
295
+ export const Interactive: Story = {
296
+ render: () => {
297
+ const [selectedNode, setSelectedNode] = React.useState<SankeyNode | null>(null)
298
+ const [selectedLink, setSelectedLink] = React.useState<SankeyLink | null>(null)
299
+
300
+ return (
301
+ <div className="space-y-4">
302
+ <WakaSankeyDiagram
303
+ nodes={websiteTrafficNodes}
304
+ links={websiteTrafficLinks}
305
+ width={800}
306
+ height={450}
307
+ onNodeClick={(node) => {
308
+ setSelectedNode(node)
309
+ setSelectedLink(null)
310
+ }}
311
+ onLinkClick={(link) => {
312
+ setSelectedLink(link)
313
+ setSelectedNode(null)
314
+ }}
315
+ />
316
+ {(selectedNode || selectedLink) && (
317
+ <div className="p-4 border rounded-lg bg-muted/50">
318
+ {selectedNode && (
319
+ <div>
320
+ <h4 className="font-semibold">{selectedNode.label}</h4>
321
+ <p className="text-sm text-muted-foreground">
322
+ Category: {selectedNode.category || 'N/A'}
323
+ </p>
324
+ <p className="text-sm">
325
+ Incoming: {selectedNode.inValue?.toLocaleString()} | Outgoing: {selectedNode.outValue?.toLocaleString()}
326
+ </p>
327
+ </div>
328
+ )}
329
+ {selectedLink && (
330
+ <div>
331
+ <h4 className="font-semibold">
332
+ {selectedLink.source} → {selectedLink.target}
333
+ </h4>
334
+ <p className="text-2xl font-bold text-primary">
335
+ {selectedLink.value.toLocaleString()}
336
+ </p>
337
+ </div>
338
+ )}
339
+ </div>
340
+ )}
341
+ </div>
342
+ )
343
+ },
344
+ }
345
+
346
+ export const ConversionFunnel: Story = {
347
+ render: () => (
348
+ <div className="w-[850px] p-6 border rounded-lg">
349
+ <div className="mb-4">
350
+ <h3 className="text-xl font-semibold">Website Conversion Flow</h3>
351
+ <p className="text-sm text-muted-foreground">
352
+ How visitors navigate through the site to conversion
353
+ </p>
354
+ </div>
355
+ <WakaSankeyDiagram
356
+ nodes={websiteTrafficNodes}
357
+ links={websiteTrafficLinks}
358
+ width={800}
359
+ height={480}
360
+ />
361
+ <div className="mt-4 flex gap-6 justify-center text-sm">
362
+ <div className="flex items-center gap-2">
363
+ <div className="w-3 h-3 rounded-full bg-green-500" />
364
+ <span>Conversions</span>
365
+ </div>
366
+ <div className="flex items-center gap-2">
367
+ <div className="w-3 h-3 rounded-full bg-yellow-500" />
368
+ <span>Demo Requests</span>
369
+ </div>
370
+ <div className="flex items-center gap-2">
371
+ <div className="w-3 h-3 rounded-full bg-red-500" />
372
+ <span>Bounced</span>
373
+ </div>
374
+ </div>
375
+ </div>
376
+ ),
377
+ }
378
+
379
+ export const NoAnimation: Story = {
380
+ render: () => (
381
+ <WakaSankeyDiagram
382
+ nodes={energyFlowNodes}
383
+ links={energyFlowLinks}
384
+ animated={false}
385
+ width={700}
386
+ height={400}
387
+ />
388
+ ),
389
+ }