@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 { WakaSuccessExplosion, useSuccessExplosion } from './index'
3
+ import type { WakaSuccessExplosionRef } from './index'
4
+ import * as React from 'react'
5
+ import { Button } from '../button'
6
+
7
+ const meta: Meta<typeof WakaSuccessExplosion> = {
8
+ title: 'Components/Effects/WakaSuccessExplosion',
9
+ component: WakaSuccessExplosion,
10
+ parameters: {
11
+ layout: 'centered',
12
+ docs: {
13
+ description: {
14
+ component: 'A confetti explosion animation with checkmark for celebrating successful actions.',
15
+ },
16
+ },
17
+ },
18
+ tags: ['autodocs'],
19
+ argTypes: {
20
+ size: {
21
+ control: 'select',
22
+ options: ['sm', 'md', 'lg', 'xl'],
23
+ description: 'Size of the explosion',
24
+ },
25
+ particleCount: {
26
+ control: { type: 'range', min: 8, max: 50, step: 2 },
27
+ description: 'Number of confetti particles',
28
+ },
29
+ duration: {
30
+ control: { type: 'range', min: 500, max: 2000, step: 100 },
31
+ description: 'Animation duration in ms',
32
+ },
33
+ showCheckmark: {
34
+ control: 'boolean',
35
+ description: 'Show checkmark animation',
36
+ },
37
+ autoHide: {
38
+ control: 'boolean',
39
+ description: 'Auto-hide after animation',
40
+ },
41
+ },
42
+ }
43
+
44
+ export default meta
45
+ type Story = StoryObj<typeof WakaSuccessExplosion>
46
+
47
+ export const Default: Story = {
48
+ args: {},
49
+ render: (args) => {
50
+ const [trigger, setTrigger] = React.useState(false)
51
+
52
+ const handleClick = () => {
53
+ setTrigger(true)
54
+ setTimeout(() => setTrigger(false), 100)
55
+ }
56
+
57
+ return (
58
+ <div className="flex flex-col items-center gap-6">
59
+ <WakaSuccessExplosion trigger={trigger} />
60
+ <Button onClick={handleClick}>Trigger Explosion</Button>
61
+ </div>
62
+ )
63
+ },
64
+ }
65
+
66
+ export const Sizes: Story = {
67
+ render: () => {
68
+ const [triggers, setTriggers] = React.useState({
69
+ sm: false,
70
+ md: false,
71
+ lg: false,
72
+ xl: false,
73
+ })
74
+
75
+ const handleTrigger = (size: keyof typeof triggers) => {
76
+ setTriggers((prev) => ({ ...prev, [size]: true }))
77
+ setTimeout(() => setTriggers((prev) => ({ ...prev, [size]: false })), 100)
78
+ }
79
+
80
+ return (
81
+ <div className="flex gap-12">
82
+ {(['sm', 'md', 'lg', 'xl'] as const).map((size) => (
83
+ <div key={size} className="flex flex-col items-center gap-4">
84
+ <WakaSuccessExplosion trigger={triggers[size]} size={size} />
85
+ <Button size="sm" variant="outline" onClick={() => handleTrigger(size)}>
86
+ {size.toUpperCase()}
87
+ </Button>
88
+ </div>
89
+ ))}
90
+ </div>
91
+ )
92
+ },
93
+ }
94
+
95
+ export const CustomColors: Story = {
96
+ render: () => {
97
+ const [trigger, setTrigger] = React.useState(false)
98
+
99
+ return (
100
+ <div className="flex flex-col items-center gap-6">
101
+ <WakaSuccessExplosion
102
+ trigger={trigger}
103
+ primaryColor="rgb(147, 51, 234)"
104
+ secondaryColor="rgb(236, 72, 153)"
105
+ accentColor="rgb(251, 146, 60)"
106
+ checkmarkColor="rgb(147, 51, 234)"
107
+ />
108
+ <Button
109
+ onClick={() => {
110
+ setTrigger(true)
111
+ setTimeout(() => setTrigger(false), 100)
112
+ }}
113
+ >
114
+ Purple Explosion
115
+ </Button>
116
+ </div>
117
+ )
118
+ },
119
+ }
120
+
121
+ export const ParticleCounts: Story = {
122
+ render: () => {
123
+ const [triggers, setTriggers] = React.useState({
124
+ few: false,
125
+ normal: false,
126
+ many: false,
127
+ })
128
+
129
+ return (
130
+ <div className="flex gap-12">
131
+ <div className="flex flex-col items-center gap-4">
132
+ <WakaSuccessExplosion trigger={triggers.few} particleCount={12} />
133
+ <Button
134
+ variant="outline"
135
+ onClick={() => {
136
+ setTriggers((p) => ({ ...p, few: true }))
137
+ setTimeout(() => setTriggers((p) => ({ ...p, few: false })), 100)
138
+ }}
139
+ >
140
+ 12 Particles
141
+ </Button>
142
+ </div>
143
+ <div className="flex flex-col items-center gap-4">
144
+ <WakaSuccessExplosion trigger={triggers.normal} particleCount={24} />
145
+ <Button
146
+ variant="outline"
147
+ onClick={() => {
148
+ setTriggers((p) => ({ ...p, normal: true }))
149
+ setTimeout(() => setTriggers((p) => ({ ...p, normal: false })), 100)
150
+ }}
151
+ >
152
+ 24 Particles
153
+ </Button>
154
+ </div>
155
+ <div className="flex flex-col items-center gap-4">
156
+ <WakaSuccessExplosion trigger={triggers.many} particleCount={48} />
157
+ <Button
158
+ variant="outline"
159
+ onClick={() => {
160
+ setTriggers((p) => ({ ...p, many: true }))
161
+ setTimeout(() => setTriggers((p) => ({ ...p, many: false })), 100)
162
+ }}
163
+ >
164
+ 48 Particles
165
+ </Button>
166
+ </div>
167
+ </div>
168
+ )
169
+ },
170
+ }
171
+
172
+ export const NoCheckmark: Story = {
173
+ render: () => {
174
+ const [trigger, setTrigger] = React.useState(false)
175
+
176
+ return (
177
+ <div className="flex flex-col items-center gap-6">
178
+ <WakaSuccessExplosion trigger={trigger} showCheckmark={false} />
179
+ <Button
180
+ onClick={() => {
181
+ setTrigger(true)
182
+ setTimeout(() => setTrigger(false), 100)
183
+ }}
184
+ >
185
+ Confetti Only
186
+ </Button>
187
+ </div>
188
+ )
189
+ },
190
+ }
191
+
192
+ export const PersistentCheckmark: Story = {
193
+ render: () => {
194
+ const [trigger, setTrigger] = React.useState(false)
195
+
196
+ return (
197
+ <div className="flex flex-col items-center gap-6">
198
+ <WakaSuccessExplosion trigger={trigger} autoHide={false} />
199
+ <Button
200
+ onClick={() => {
201
+ setTrigger(true)
202
+ setTimeout(() => setTrigger(false), 100)
203
+ }}
204
+ >
205
+ Show (Stays Visible)
206
+ </Button>
207
+ </div>
208
+ )
209
+ },
210
+ }
211
+
212
+ export const WithRef: Story = {
213
+ render: () => {
214
+ const ref = React.useRef<WakaSuccessExplosionRef>(null)
215
+
216
+ return (
217
+ <div className="flex flex-col items-center gap-6">
218
+ <WakaSuccessExplosion ref={ref} />
219
+ <div className="flex gap-2">
220
+ <Button onClick={() => ref.current?.explode()}>Explode</Button>
221
+ <Button variant="outline" onClick={() => ref.current?.reset()}>
222
+ Reset
223
+ </Button>
224
+ </div>
225
+ </div>
226
+ )
227
+ },
228
+ }
229
+
230
+ export const WithHook: Story = {
231
+ render: () => {
232
+ const { explode, ExplosionComponent } = useSuccessExplosion({
233
+ size: 'lg',
234
+ onComplete: () => console.log('Explosion complete!'),
235
+ })
236
+
237
+ return (
238
+ <div className="flex flex-col items-center gap-6">
239
+ <ExplosionComponent />
240
+ <Button onClick={explode}>Trigger via Hook</Button>
241
+ </div>
242
+ )
243
+ },
244
+ }
245
+
246
+ export const FormSubmitExample: Story = {
247
+ render: () => {
248
+ const [submitted, setSubmitted] = React.useState(false)
249
+ const [trigger, setTrigger] = React.useState(false)
250
+
251
+ const handleSubmit = (e: React.FormEvent) => {
252
+ e.preventDefault()
253
+ setSubmitted(true)
254
+ setTrigger(true)
255
+ setTimeout(() => setTrigger(false), 100)
256
+ }
257
+
258
+ if (submitted) {
259
+ return (
260
+ <div className="text-center">
261
+ <WakaSuccessExplosion trigger={trigger} size="lg" autoHide={false} />
262
+ <p className="mt-4 text-lg font-medium">Form Submitted!</p>
263
+ <Button
264
+ variant="outline"
265
+ className="mt-4"
266
+ onClick={() => setSubmitted(false)}
267
+ >
268
+ Submit Another
269
+ </Button>
270
+ </div>
271
+ )
272
+ }
273
+
274
+ return (
275
+ <form onSubmit={handleSubmit} className="w-[300px] space-y-4">
276
+ <div>
277
+ <label className="text-sm font-medium">Email</label>
278
+ <input
279
+ type="email"
280
+ required
281
+ className="w-full mt-1 px-3 py-2 border rounded-md"
282
+ placeholder="you@example.com"
283
+ />
284
+ </div>
285
+ <div>
286
+ <label className="text-sm font-medium">Message</label>
287
+ <textarea
288
+ required
289
+ className="w-full mt-1 px-3 py-2 border rounded-md"
290
+ rows={3}
291
+ placeholder="Your message..."
292
+ />
293
+ </div>
294
+ <Button type="submit" className="w-full">
295
+ Submit
296
+ </Button>
297
+ </form>
298
+ )
299
+ },
300
+ }
301
+
302
+ export const PaymentSuccess: Story = {
303
+ render: () => {
304
+ const [trigger, setTrigger] = React.useState(false)
305
+ const [processing, setProcessing] = React.useState(false)
306
+ const [success, setSuccess] = React.useState(false)
307
+
308
+ const handlePayment = () => {
309
+ setProcessing(true)
310
+ setTimeout(() => {
311
+ setProcessing(false)
312
+ setSuccess(true)
313
+ setTrigger(true)
314
+ setTimeout(() => setTrigger(false), 100)
315
+ }, 1500)
316
+ }
317
+
318
+ if (success) {
319
+ return (
320
+ <div className="text-center p-8 border rounded-lg">
321
+ <WakaSuccessExplosion
322
+ trigger={trigger}
323
+ size="xl"
324
+ autoHide={false}
325
+ primaryColor="rgb(34, 197, 94)"
326
+ secondaryColor="rgb(250, 204, 21)"
327
+ accentColor="rgb(59, 130, 246)"
328
+ />
329
+ <h3 className="mt-4 text-xl font-bold text-green-600">Payment Successful!</h3>
330
+ <p className="text-muted-foreground">Thank you for your purchase.</p>
331
+ <Button variant="outline" className="mt-4" onClick={() => setSuccess(false)}>
332
+ Make Another Payment
333
+ </Button>
334
+ </div>
335
+ )
336
+ }
337
+
338
+ return (
339
+ <div className="w-[350px] p-6 border rounded-lg">
340
+ <h3 className="font-semibold text-lg mb-4">Complete Payment</h3>
341
+ <div className="space-y-4">
342
+ <div className="flex justify-between">
343
+ <span className="text-muted-foreground">Subtotal</span>
344
+ <span>$99.00</span>
345
+ </div>
346
+ <div className="flex justify-between">
347
+ <span className="text-muted-foreground">Tax</span>
348
+ <span>$8.91</span>
349
+ </div>
350
+ <div className="flex justify-between font-semibold border-t pt-4">
351
+ <span>Total</span>
352
+ <span>$107.91</span>
353
+ </div>
354
+ <Button className="w-full" onClick={handlePayment} disabled={processing}>
355
+ {processing ? 'Processing...' : 'Pay Now'}
356
+ </Button>
357
+ </div>
358
+ </div>
359
+ )
360
+ },
361
+ }
362
+
363
+ export const WithCallback: Story = {
364
+ render: () => {
365
+ const [trigger, setTrigger] = React.useState(false)
366
+ const [message, setMessage] = React.useState('')
367
+
368
+ return (
369
+ <div className="flex flex-col items-center gap-6">
370
+ <WakaSuccessExplosion
371
+ trigger={trigger}
372
+ onComplete={() => setMessage('Animation completed!')}
373
+ />
374
+ <Button
375
+ onClick={() => {
376
+ setMessage('')
377
+ setTrigger(true)
378
+ setTimeout(() => setTrigger(false), 100)
379
+ }}
380
+ >
381
+ Trigger
382
+ </Button>
383
+ {message && (
384
+ <p className="text-sm text-green-600 font-medium">{message}</p>
385
+ )}
386
+ </div>
387
+ )
388
+ },
389
+ }