@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,407 @@
1
+ import type { Meta, StoryObj } from '@storybook/react'
2
+ import { WakaQueryExplain, defaultQueryPlan } from './index'
3
+ import type { QueryPlan, ExplainNode } from './index'
4
+ import * as React from 'react'
5
+
6
+ const simpleIndexScan: QueryPlan = {
7
+ query: `SELECT * FROM users WHERE id = 123;`,
8
+ planningTime: 0.05,
9
+ executionTime: 0.12,
10
+ totalCost: 8.27,
11
+ rootNode: {
12
+ id: '1',
13
+ type: 'Index Scan',
14
+ relation: 'users',
15
+ indexName: 'users_pkey',
16
+ filter: 'id = 123',
17
+ startupCost: 0.00,
18
+ totalCost: 8.27,
19
+ rows: 1,
20
+ actualRows: 1,
21
+ actualTime: 0.12,
22
+ },
23
+ }
24
+
25
+ const fullTableScan: QueryPlan = {
26
+ query: `SELECT * FROM orders WHERE status = 'pending' AND total > 100;`,
27
+ planningTime: 0.08,
28
+ executionTime: 1250.45,
29
+ totalCost: 25000.00,
30
+ rootNode: {
31
+ id: '1',
32
+ type: 'Seq Scan',
33
+ relation: 'orders',
34
+ filter: "status = 'pending' AND total > 100",
35
+ startupCost: 0.00,
36
+ totalCost: 25000.00,
37
+ rows: 5000,
38
+ actualRows: 4856,
39
+ actualTime: 1250.45,
40
+ warnings: ['Consider adding an index on orders(status, total)'],
41
+ buffers: {
42
+ sharedHit: 5000,
43
+ sharedRead: 15000,
44
+ },
45
+ },
46
+ }
47
+
48
+ const complexJoin: QueryPlan = {
49
+ query: `SELECT o.id, o.total, c.name, c.email
50
+ FROM orders o
51
+ JOIN customers c ON c.id = o.customer_id
52
+ JOIN order_items oi ON oi.order_id = o.id
53
+ WHERE o.created_at > '2024-01-01'
54
+ ORDER BY o.total DESC;`,
55
+ planningTime: 0.85,
56
+ executionTime: 125.67,
57
+ totalCost: 5420.50,
58
+ rootNode: {
59
+ id: '1',
60
+ type: 'Sort',
61
+ sortKey: ['o.total DESC'],
62
+ startupCost: 5400.00,
63
+ totalCost: 5420.50,
64
+ rows: 2500,
65
+ actualRows: 2456,
66
+ actualTime: 125.67,
67
+ children: [
68
+ {
69
+ id: '2',
70
+ type: 'Hash Join',
71
+ joinType: 'Inner',
72
+ startupCost: 100.00,
73
+ totalCost: 5350.00,
74
+ rows: 2500,
75
+ actualRows: 2456,
76
+ actualTime: 95.45,
77
+ children: [
78
+ {
79
+ id: '3',
80
+ type: 'Hash Join',
81
+ joinType: 'Inner',
82
+ startupCost: 50.00,
83
+ totalCost: 2500.00,
84
+ rows: 1000,
85
+ actualRows: 982,
86
+ actualTime: 45.20,
87
+ children: [
88
+ {
89
+ id: '4',
90
+ type: 'Index Scan',
91
+ relation: 'orders',
92
+ alias: 'o',
93
+ indexName: 'idx_orders_created_at',
94
+ filter: "created_at > '2024-01-01'",
95
+ startupCost: 0.00,
96
+ totalCost: 500.00,
97
+ rows: 1000,
98
+ actualRows: 982,
99
+ actualTime: 12.50,
100
+ },
101
+ {
102
+ id: '5',
103
+ type: 'Hash',
104
+ startupCost: 45.00,
105
+ totalCost: 45.00,
106
+ rows: 500,
107
+ actualRows: 500,
108
+ actualTime: 8.00,
109
+ children: [
110
+ {
111
+ id: '6',
112
+ type: 'Seq Scan',
113
+ relation: 'customers',
114
+ alias: 'c',
115
+ startupCost: 0.00,
116
+ totalCost: 35.00,
117
+ rows: 500,
118
+ actualRows: 500,
119
+ actualTime: 5.00,
120
+ },
121
+ ],
122
+ },
123
+ ],
124
+ },
125
+ {
126
+ id: '7',
127
+ type: 'Hash',
128
+ startupCost: 100.00,
129
+ totalCost: 100.00,
130
+ rows: 10000,
131
+ actualRows: 10000,
132
+ actualTime: 25.00,
133
+ children: [
134
+ {
135
+ id: '8',
136
+ type: 'Index Only Scan',
137
+ relation: 'order_items',
138
+ alias: 'oi',
139
+ indexName: 'idx_order_items_order_id',
140
+ startupCost: 0.00,
141
+ totalCost: 80.00,
142
+ rows: 10000,
143
+ actualRows: 10000,
144
+ actualTime: 18.00,
145
+ buffers: {
146
+ sharedHit: 500,
147
+ },
148
+ },
149
+ ],
150
+ },
151
+ ],
152
+ },
153
+ ],
154
+ },
155
+ }
156
+
157
+ const aggregateQuery: QueryPlan = {
158
+ query: `SELECT customer_id, COUNT(*), SUM(total)
159
+ FROM orders
160
+ GROUP BY customer_id
161
+ HAVING COUNT(*) > 5;`,
162
+ planningTime: 0.15,
163
+ executionTime: 85.30,
164
+ totalCost: 3500.00,
165
+ rootNode: {
166
+ id: '1',
167
+ type: 'Aggregate',
168
+ startupCost: 3200.00,
169
+ totalCost: 3500.00,
170
+ rows: 150,
171
+ actualRows: 142,
172
+ actualTime: 85.30,
173
+ filter: 'count(*) > 5',
174
+ children: [
175
+ {
176
+ id: '2',
177
+ type: 'Sort',
178
+ sortKey: ['customer_id'],
179
+ startupCost: 2500.00,
180
+ totalCost: 3000.00,
181
+ rows: 50000,
182
+ actualRows: 48500,
183
+ actualTime: 65.00,
184
+ children: [
185
+ {
186
+ id: '3',
187
+ type: 'Seq Scan',
188
+ relation: 'orders',
189
+ startupCost: 0.00,
190
+ totalCost: 2000.00,
191
+ rows: 50000,
192
+ actualRows: 48500,
193
+ actualTime: 35.00,
194
+ },
195
+ ],
196
+ },
197
+ ],
198
+ },
199
+ }
200
+
201
+ const parallelQuery: QueryPlan = {
202
+ query: `SELECT COUNT(*) FROM large_table WHERE status = 'active';`,
203
+ planningTime: 0.25,
204
+ executionTime: 450.00,
205
+ totalCost: 15000.00,
206
+ rootNode: {
207
+ id: '1',
208
+ type: 'Aggregate',
209
+ startupCost: 14500.00,
210
+ totalCost: 15000.00,
211
+ rows: 1,
212
+ actualRows: 1,
213
+ actualTime: 450.00,
214
+ children: [
215
+ {
216
+ id: '2',
217
+ type: 'Gather',
218
+ startupCost: 1000.00,
219
+ totalCost: 14000.00,
220
+ rows: 4,
221
+ actualRows: 4,
222
+ actualTime: 445.00,
223
+ children: [
224
+ {
225
+ id: '3',
226
+ type: 'Aggregate',
227
+ startupCost: 13000.00,
228
+ totalCost: 13500.00,
229
+ rows: 1,
230
+ actualRows: 1,
231
+ actualTime: 110.00,
232
+ loops: 4,
233
+ children: [
234
+ {
235
+ id: '4',
236
+ type: 'Seq Scan',
237
+ relation: 'large_table',
238
+ filter: "status = 'active'",
239
+ startupCost: 0.00,
240
+ totalCost: 12000.00,
241
+ rows: 2500000,
242
+ actualRows: 2450000,
243
+ actualTime: 95.00,
244
+ loops: 4,
245
+ },
246
+ ],
247
+ },
248
+ ],
249
+ },
250
+ ],
251
+ },
252
+ }
253
+
254
+ const meta: Meta<typeof WakaQueryExplain> = {
255
+ title: 'Components/DevOps/WakaQueryExplain',
256
+ component: WakaQueryExplain,
257
+ parameters: {
258
+ layout: 'centered',
259
+ docs: {
260
+ description: {
261
+ component: 'A SQL query explain analyzer with node tree visualization, cost bars, row estimates vs actuals, warnings, and buffer statistics.',
262
+ },
263
+ },
264
+ },
265
+ tags: ['autodocs'],
266
+ argTypes: {
267
+ showActual: {
268
+ control: 'boolean',
269
+ description: 'Show actual execution statistics',
270
+ },
271
+ showBuffers: {
272
+ control: 'boolean',
273
+ description: 'Show buffer statistics',
274
+ },
275
+ },
276
+ }
277
+
278
+ export default meta
279
+ type Story = StoryObj<typeof WakaQueryExplain>
280
+
281
+ export const Default: Story = {
282
+ args: {
283
+ plan: defaultQueryPlan,
284
+ },
285
+ render: (args) => (
286
+ <div className="w-[800px] h-[600px]">
287
+ <WakaQueryExplain
288
+ {...args}
289
+ onNodeClick={(node) => console.log('Node click:', node)}
290
+ />
291
+ </div>
292
+ ),
293
+ }
294
+
295
+ export const SimpleIndexScan: Story = {
296
+ render: () => (
297
+ <div className="w-[800px] h-[400px]">
298
+ <p className="text-sm text-muted-foreground mb-4">
299
+ Optimal query using primary key index
300
+ </p>
301
+ <WakaQueryExplain plan={simpleIndexScan} />
302
+ </div>
303
+ ),
304
+ }
305
+
306
+ export const FullTableScan: Story = {
307
+ render: () => (
308
+ <div className="w-[800px] h-[400px]">
309
+ <p className="text-sm text-muted-foreground mb-4">
310
+ Problematic query with sequential scan warning
311
+ </p>
312
+ <WakaQueryExplain plan={fullTableScan} showBuffers />
313
+ </div>
314
+ ),
315
+ }
316
+
317
+ export const ComplexJoin: Story = {
318
+ render: () => (
319
+ <div className="w-[800px] h-[700px]">
320
+ <p className="text-sm text-muted-foreground mb-4">
321
+ Multi-table join with hash joins and sorting
322
+ </p>
323
+ <WakaQueryExplain
324
+ plan={complexJoin}
325
+ showBuffers
326
+ onNodeClick={(node) => console.log('Node click:', node)}
327
+ />
328
+ </div>
329
+ ),
330
+ }
331
+
332
+ export const AggregateQuery: Story = {
333
+ render: () => (
334
+ <div className="w-[800px] h-[500px]">
335
+ <WakaQueryExplain plan={aggregateQuery} />
336
+ </div>
337
+ ),
338
+ }
339
+
340
+ export const ParallelQuery: Story = {
341
+ render: () => (
342
+ <div className="w-[800px] h-[500px]">
343
+ <p className="text-sm text-muted-foreground mb-4">
344
+ Parallel query execution with Gather node
345
+ </p>
346
+ <WakaQueryExplain plan={parallelQuery} />
347
+ </div>
348
+ ),
349
+ }
350
+
351
+ export const WithBuffers: Story = {
352
+ render: () => (
353
+ <div className="w-[900px] h-[600px]">
354
+ <WakaQueryExplain
355
+ plan={defaultQueryPlan}
356
+ showBuffers
357
+ />
358
+ </div>
359
+ ),
360
+ }
361
+
362
+ export const NoActualStats: Story = {
363
+ render: () => (
364
+ <div className="w-[800px] h-[600px]">
365
+ <p className="text-sm text-muted-foreground mb-4">
366
+ Estimated plan only (no ANALYZE data)
367
+ </p>
368
+ <WakaQueryExplain
369
+ plan={defaultQueryPlan}
370
+ showActual={false}
371
+ />
372
+ </div>
373
+ ),
374
+ }
375
+
376
+ export const QueryAnalyzer: Story = {
377
+ render: () => (
378
+ <div className="p-6 rounded-xl border bg-card">
379
+ <div className="flex items-center justify-between mb-6">
380
+ <div>
381
+ <h2 className="text-xl font-bold">Query Analyzer</h2>
382
+ <p className="text-sm text-muted-foreground">
383
+ PostgreSQL 15.4 • production-db
384
+ </p>
385
+ </div>
386
+ <div className="flex items-center gap-4 text-sm">
387
+ <div>
388
+ <span className="text-muted-foreground">Planning: </span>
389
+ <span className="font-medium">{defaultQueryPlan.planningTime?.toFixed(2)}ms</span>
390
+ </div>
391
+ <div>
392
+ <span className="text-muted-foreground">Execution: </span>
393
+ <span className="font-medium">{defaultQueryPlan.executionTime?.toFixed(2)}ms</span>
394
+ </div>
395
+ </div>
396
+ </div>
397
+
398
+ <div className="w-[750px]">
399
+ <WakaQueryExplain
400
+ plan={defaultQueryPlan}
401
+ showBuffers
402
+ onNodeClick={(node) => console.log('Node click:', node)}
403
+ />
404
+ </div>
405
+ </div>
406
+ ),
407
+ }