@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,378 @@
1
+ import type { Meta, StoryObj } from '@storybook/react'
2
+ import { WakaTreemapChart, useTreemapChart } from './index'
3
+ import type { TreemapNode } from './index'
4
+ import * as React from 'react'
5
+
6
+ const diskUsageData: TreemapNode = {
7
+ id: 'root',
8
+ name: 'Disk Usage',
9
+ children: [
10
+ {
11
+ id: 'documents',
12
+ name: 'Documents',
13
+ children: [
14
+ { id: 'pdf', name: 'PDFs', value: 2500 },
15
+ { id: 'word', name: 'Word Docs', value: 1800 },
16
+ { id: 'spreadsheets', name: 'Spreadsheets', value: 1200 },
17
+ ],
18
+ },
19
+ {
20
+ id: 'media',
21
+ name: 'Media',
22
+ children: [
23
+ { id: 'photos', name: 'Photos', value: 8000 },
24
+ { id: 'videos', name: 'Videos', value: 15000 },
25
+ { id: 'music', name: 'Music', value: 3500 },
26
+ ],
27
+ },
28
+ {
29
+ id: 'apps',
30
+ name: 'Applications',
31
+ children: [
32
+ { id: 'system', name: 'System', value: 5000 },
33
+ { id: 'user', name: 'User Apps', value: 7000 },
34
+ ],
35
+ },
36
+ { id: 'other', name: 'Other', value: 2000 },
37
+ ],
38
+ }
39
+
40
+ const salesByCategoryData: TreemapNode = {
41
+ id: 'sales',
42
+ name: 'Sales',
43
+ children: [
44
+ {
45
+ id: 'electronics',
46
+ name: 'Electronics',
47
+ color: '#3b82f6',
48
+ children: [
49
+ { id: 'phones', name: 'Phones', value: 45000 },
50
+ { id: 'laptops', name: 'Laptops', value: 38000 },
51
+ { id: 'tablets', name: 'Tablets', value: 22000 },
52
+ { id: 'accessories', name: 'Accessories', value: 15000 },
53
+ ],
54
+ },
55
+ {
56
+ id: 'clothing',
57
+ name: 'Clothing',
58
+ color: '#22c55e',
59
+ children: [
60
+ { id: 'mens', name: "Men's", value: 28000 },
61
+ { id: 'womens', name: "Women's", value: 35000 },
62
+ { id: 'kids', name: 'Kids', value: 18000 },
63
+ ],
64
+ },
65
+ {
66
+ id: 'home',
67
+ name: 'Home & Garden',
68
+ color: '#f59e0b',
69
+ children: [
70
+ { id: 'furniture', name: 'Furniture', value: 32000 },
71
+ { id: 'decor', name: 'Decor', value: 12000 },
72
+ { id: 'garden', name: 'Garden', value: 8000 },
73
+ ],
74
+ },
75
+ ],
76
+ }
77
+
78
+ const portfolioData: TreemapNode = {
79
+ id: 'portfolio',
80
+ name: 'Investment Portfolio',
81
+ children: [
82
+ {
83
+ id: 'stocks',
84
+ name: 'Stocks',
85
+ children: [
86
+ { id: 'tech', name: 'Tech', value: 45000, color: '#3b82f6' },
87
+ { id: 'healthcare', name: 'Healthcare', value: 25000, color: '#22c55e' },
88
+ { id: 'finance', name: 'Finance', value: 20000, color: '#f59e0b' },
89
+ { id: 'energy', name: 'Energy', value: 10000, color: '#ef4444' },
90
+ ],
91
+ },
92
+ {
93
+ id: 'bonds',
94
+ name: 'Bonds',
95
+ children: [
96
+ { id: 'gov', name: 'Government', value: 30000, color: '#8b5cf6' },
97
+ { id: 'corp', name: 'Corporate', value: 15000, color: '#ec4899' },
98
+ ],
99
+ },
100
+ { id: 'cash', name: 'Cash', value: 20000, color: '#6b7280' },
101
+ { id: 'crypto', name: 'Crypto', value: 5000, color: '#06b6d4' },
102
+ ],
103
+ }
104
+
105
+ const meta: Meta<typeof WakaTreemapChart> = {
106
+ title: 'Components/Charts/WakaTreemapChart',
107
+ component: WakaTreemapChart,
108
+ parameters: {
109
+ layout: 'centered',
110
+ docs: {
111
+ description: {
112
+ component: 'A treemap chart for visualizing hierarchical data with nested rectangles proportional to values.',
113
+ },
114
+ },
115
+ },
116
+ tags: ['autodocs'],
117
+ argTypes: {
118
+ colorScheme: {
119
+ control: 'select',
120
+ options: ['blues', 'greens', 'purples', 'oranges', 'category'],
121
+ description: 'Color scheme for nodes',
122
+ },
123
+ showLabels: {
124
+ control: 'boolean',
125
+ description: 'Show node labels',
126
+ },
127
+ showValues: {
128
+ control: 'boolean',
129
+ description: 'Show node values',
130
+ },
131
+ enableDrillDown: {
132
+ control: 'boolean',
133
+ description: 'Enable drill-down on click',
134
+ },
135
+ animated: {
136
+ control: 'boolean',
137
+ description: 'Enable animations',
138
+ },
139
+ padding: {
140
+ control: { type: 'range', min: 0, max: 8, step: 1 },
141
+ description: 'Padding between nodes',
142
+ },
143
+ },
144
+ }
145
+
146
+ export default meta
147
+ type Story = StoryObj<typeof WakaTreemapChart>
148
+
149
+ export const Default: Story = {
150
+ args: {
151
+ data: diskUsageData,
152
+ width: 600,
153
+ height: 400,
154
+ },
155
+ render: (args) => <WakaTreemapChart {...args} />,
156
+ }
157
+
158
+ export const WithCustomColors: Story = {
159
+ render: () => <WakaTreemapChart data={salesByCategoryData} width={600} height={400} colorScheme="category" />,
160
+ }
161
+
162
+ export const ColorSchemes: Story = {
163
+ render: () => (
164
+ <div className="space-y-6">
165
+ <div>
166
+ <p className="text-sm text-muted-foreground mb-2">Blues</p>
167
+ <WakaTreemapChart data={diskUsageData} width={500} height={250} colorScheme="blues" />
168
+ </div>
169
+ <div>
170
+ <p className="text-sm text-muted-foreground mb-2">Greens</p>
171
+ <WakaTreemapChart data={diskUsageData} width={500} height={250} colorScheme="greens" />
172
+ </div>
173
+ <div>
174
+ <p className="text-sm text-muted-foreground mb-2">Purples</p>
175
+ <WakaTreemapChart data={diskUsageData} width={500} height={250} colorScheme="purples" />
176
+ </div>
177
+ </div>
178
+ ),
179
+ }
180
+
181
+ export const DrillDown: Story = {
182
+ render: () => (
183
+ <div className="space-y-4">
184
+ <p className="text-sm text-muted-foreground">Click on a category to drill down into its children</p>
185
+ <WakaTreemapChart
186
+ data={salesByCategoryData}
187
+ width={650}
188
+ height={400}
189
+ enableDrillDown
190
+ colorScheme="category"
191
+ />
192
+ </div>
193
+ ),
194
+ }
195
+
196
+ export const Sizes: Story = {
197
+ render: () => (
198
+ <div className="space-y-6">
199
+ <div>
200
+ <p className="text-sm text-muted-foreground mb-2">Small (400x250)</p>
201
+ <WakaTreemapChart data={diskUsageData} width={400} height={250} />
202
+ </div>
203
+ <div>
204
+ <p className="text-sm text-muted-foreground mb-2">Medium (600x350)</p>
205
+ <WakaTreemapChart data={diskUsageData} width={600} height={350} />
206
+ </div>
207
+ <div>
208
+ <p className="text-sm text-muted-foreground mb-2">Large (800x450)</p>
209
+ <WakaTreemapChart data={diskUsageData} width={800} height={450} />
210
+ </div>
211
+ </div>
212
+ ),
213
+ }
214
+
215
+ export const Padding: Story = {
216
+ render: () => (
217
+ <div className="flex gap-6">
218
+ <div className="text-center">
219
+ <WakaTreemapChart data={diskUsageData} width={350} height={250} padding={0} />
220
+ <p className="text-sm text-muted-foreground mt-2">No padding</p>
221
+ </div>
222
+ <div className="text-center">
223
+ <WakaTreemapChart data={diskUsageData} width={350} height={250} padding={4} />
224
+ <p className="text-sm text-muted-foreground mt-2">4px padding</p>
225
+ </div>
226
+ </div>
227
+ ),
228
+ }
229
+
230
+ export const NoLabels: Story = {
231
+ render: () => (
232
+ <div className="flex gap-6">
233
+ <div className="text-center">
234
+ <WakaTreemapChart data={diskUsageData} width={300} height={200} showLabels={false} />
235
+ <p className="text-sm text-muted-foreground mt-2">No labels</p>
236
+ </div>
237
+ <div className="text-center">
238
+ <WakaTreemapChart data={diskUsageData} width={300} height={200} showValues={false} />
239
+ <p className="text-sm text-muted-foreground mt-2">No values</p>
240
+ </div>
241
+ </div>
242
+ ),
243
+ }
244
+
245
+ export const Interactive: Story = {
246
+ render: () => {
247
+ const [selected, setSelected] = React.useState<TreemapNode | null>(null)
248
+
249
+ return (
250
+ <div className="space-y-4">
251
+ <WakaTreemapChart
252
+ data={portfolioData}
253
+ width={600}
254
+ height={350}
255
+ colorScheme="category"
256
+ onNodeClick={(node) => setSelected(node)}
257
+ />
258
+ {selected && (
259
+ <div className="p-4 border rounded-lg bg-muted/50">
260
+ <h4 className="font-semibold">{selected.name}</h4>
261
+ {selected.value && (
262
+ <p className="text-2xl font-bold text-primary">
263
+ ${selected.value.toLocaleString()}
264
+ </p>
265
+ )}
266
+ {selected.children && (
267
+ <p className="text-sm text-muted-foreground">
268
+ {selected.children.length} subcategories
269
+ </p>
270
+ )}
271
+ </div>
272
+ )}
273
+ </div>
274
+ )
275
+ },
276
+ }
277
+
278
+ export const WithHook: Story = {
279
+ render: () => {
280
+ const { currentNode, breadcrumbs, drillDown, drillUp, reset, getTotalValue } = useTreemapChart(diskUsageData)
281
+
282
+ return (
283
+ <div className="space-y-4">
284
+ <div className="flex items-center gap-2">
285
+ {breadcrumbs.map((crumb, index) => (
286
+ <React.Fragment key={crumb.id}>
287
+ {index > 0 && <span className="text-muted-foreground">/</span>}
288
+ <button
289
+ onClick={() => drillDown(crumb)}
290
+ className="text-sm hover:underline"
291
+ >
292
+ {crumb.name}
293
+ </button>
294
+ </React.Fragment>
295
+ ))}
296
+ </div>
297
+ <div className="flex gap-2">
298
+ <button
299
+ onClick={drillUp}
300
+ disabled={breadcrumbs.length <= 1}
301
+ className="px-3 py-1 text-sm border rounded hover:bg-muted disabled:opacity-50"
302
+ >
303
+ Back
304
+ </button>
305
+ <button
306
+ onClick={reset}
307
+ className="px-3 py-1 text-sm border rounded hover:bg-muted"
308
+ >
309
+ Reset
310
+ </button>
311
+ <span className="px-3 py-1 text-sm bg-muted rounded">
312
+ Total: {getTotalValue(currentNode).toLocaleString()} MB
313
+ </span>
314
+ </div>
315
+ <WakaTreemapChart
316
+ data={currentNode}
317
+ width={600}
318
+ height={350}
319
+ enableDrillDown={false}
320
+ onNodeClick={(node) => node.children && drillDown(node)}
321
+ />
322
+ </div>
323
+ )
324
+ },
325
+ }
326
+
327
+ export const PortfolioDashboard: Story = {
328
+ render: () => (
329
+ <div className="w-[700px] p-6 border rounded-lg">
330
+ <div className="flex justify-between items-start mb-4">
331
+ <div>
332
+ <h3 className="text-lg font-semibold">Investment Portfolio</h3>
333
+ <p className="text-sm text-muted-foreground">Asset allocation overview</p>
334
+ </div>
335
+ <div className="text-right">
336
+ <p className="text-2xl font-bold">$170,000</p>
337
+ <p className="text-sm text-green-600">+12.5% YTD</p>
338
+ </div>
339
+ </div>
340
+ <WakaTreemapChart
341
+ data={portfolioData}
342
+ width={650}
343
+ height={400}
344
+ colorScheme="category"
345
+ enableDrillDown
346
+ valueFormatter={(v) => `$${(v / 1000).toFixed(0)}K`}
347
+ />
348
+ </div>
349
+ ),
350
+ }
351
+
352
+ export const DiskUsageDashboard: Story = {
353
+ render: () => (
354
+ <div className="w-[700px] p-6 border rounded-lg">
355
+ <div className="flex justify-between items-start mb-4">
356
+ <div>
357
+ <h3 className="text-lg font-semibold">Storage Analysis</h3>
358
+ <p className="text-sm text-muted-foreground">46 GB used of 100 GB</p>
359
+ </div>
360
+ <div className="w-[200px] h-2 bg-muted rounded-full overflow-hidden">
361
+ <div className="h-full w-[46%] bg-primary rounded-full" />
362
+ </div>
363
+ </div>
364
+ <WakaTreemapChart
365
+ data={diskUsageData}
366
+ width={650}
367
+ height={380}
368
+ colorScheme="blues"
369
+ enableDrillDown
370
+ valueFormatter={(v) => `${(v / 1000).toFixed(1)} GB`}
371
+ />
372
+ </div>
373
+ ),
374
+ }
375
+
376
+ export const NoAnimation: Story = {
377
+ render: () => <WakaTreemapChart data={diskUsageData} width={500} height={300} animated={false} />,
378
+ }