@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,274 @@
1
+ import type { Meta, StoryObj } from '@storybook/react'
2
+ import { WakaGlowCard, WakaGlowCardPrimary, WakaGlowCardSuccess, WakaGlowCardWarning, WakaGlowCardDanger, WakaGlowCardRainbow, WakaGlowGrid } from './index'
3
+ import * as React from 'react'
4
+ import { Zap, Rocket, Shield, Star, Heart, Code } from 'lucide-react'
5
+
6
+ const meta: Meta<typeof WakaGlowCard> = {
7
+ title: 'Components/Effects/WakaGlowCard',
8
+ component: WakaGlowCard,
9
+ parameters: {
10
+ layout: 'centered',
11
+ docs: {
12
+ description: {
13
+ component: 'A card component with cursor-following glow effect, border glow, and various hover animations.',
14
+ },
15
+ },
16
+ },
17
+ tags: ['autodocs'],
18
+ argTypes: {
19
+ glowColor: {
20
+ control: 'color',
21
+ description: 'Glow color (CSS color value)',
22
+ },
23
+ glowIntensity: {
24
+ control: { type: 'range', min: 0, max: 1, step: 0.05 },
25
+ description: 'Glow intensity (0-1)',
26
+ },
27
+ glowSize: {
28
+ control: { type: 'range', min: 100, max: 800, step: 50 },
29
+ description: 'Glow size in pixels',
30
+ },
31
+ borderGlow: {
32
+ control: 'boolean',
33
+ description: 'Show border glow',
34
+ },
35
+ followCursor: {
36
+ control: 'boolean',
37
+ description: 'Glow follows cursor',
38
+ },
39
+ hoverEffect: {
40
+ control: 'select',
41
+ options: ['lift', 'scale', 'tilt', 'none'],
42
+ description: 'Animation on hover',
43
+ },
44
+ gradient: {
45
+ control: 'boolean',
46
+ description: 'Gradient background',
47
+ },
48
+ },
49
+ }
50
+
51
+ export default meta
52
+ type Story = StoryObj<typeof WakaGlowCard>
53
+
54
+ export const Default: Story = {
55
+ args: {
56
+ className: 'w-[350px] p-6',
57
+ },
58
+ render: (args) => (
59
+ <WakaGlowCard {...args}>
60
+ <h3 className="font-semibold text-lg mb-2">Glow Card</h3>
61
+ <p className="text-muted-foreground">
62
+ Hover over this card to see the cursor-following glow effect.
63
+ </p>
64
+ </WakaGlowCard>
65
+ ),
66
+ }
67
+
68
+ export const HoverEffects: Story = {
69
+ render: () => (
70
+ <div className="grid grid-cols-2 gap-6">
71
+ <WakaGlowCard hoverEffect="lift" className="p-6">
72
+ <h4 className="font-medium mb-2">Lift Effect</h4>
73
+ <p className="text-sm text-muted-foreground">Card lifts on hover</p>
74
+ </WakaGlowCard>
75
+ <WakaGlowCard hoverEffect="scale" className="p-6">
76
+ <h4 className="font-medium mb-2">Scale Effect</h4>
77
+ <p className="text-sm text-muted-foreground">Card scales on hover</p>
78
+ </WakaGlowCard>
79
+ <WakaGlowCard hoverEffect="tilt" className="p-6">
80
+ <h4 className="font-medium mb-2">Tilt Effect</h4>
81
+ <p className="text-sm text-muted-foreground">Card tilts with cursor</p>
82
+ </WakaGlowCard>
83
+ <WakaGlowCard hoverEffect="none" className="p-6">
84
+ <h4 className="font-medium mb-2">No Effect</h4>
85
+ <p className="text-sm text-muted-foreground">Only glow, no animation</p>
86
+ </WakaGlowCard>
87
+ </div>
88
+ ),
89
+ }
90
+
91
+ export const ColorVariants: Story = {
92
+ render: () => (
93
+ <div className="space-y-6">
94
+ <WakaGlowCardPrimary className="w-[350px] p-6">
95
+ <div className="flex items-center gap-3">
96
+ <Zap className="h-6 w-6 text-primary" />
97
+ <div>
98
+ <h4 className="font-medium">Primary</h4>
99
+ <p className="text-sm text-muted-foreground">Uses primary color</p>
100
+ </div>
101
+ </div>
102
+ </WakaGlowCardPrimary>
103
+
104
+ <WakaGlowCardSuccess className="w-[350px] p-6">
105
+ <div className="flex items-center gap-3">
106
+ <Shield className="h-6 w-6 text-green-500" />
107
+ <div>
108
+ <h4 className="font-medium">Success</h4>
109
+ <p className="text-sm text-muted-foreground">Green success glow</p>
110
+ </div>
111
+ </div>
112
+ </WakaGlowCardSuccess>
113
+
114
+ <WakaGlowCardWarning className="w-[350px] p-6">
115
+ <div className="flex items-center gap-3">
116
+ <Star className="h-6 w-6 text-yellow-500" />
117
+ <div>
118
+ <h4 className="font-medium">Warning</h4>
119
+ <p className="text-sm text-muted-foreground">Yellow warning glow</p>
120
+ </div>
121
+ </div>
122
+ </WakaGlowCardWarning>
123
+
124
+ <WakaGlowCardDanger className="w-[350px] p-6">
125
+ <div className="flex items-center gap-3">
126
+ <Heart className="h-6 w-6 text-destructive" />
127
+ <div>
128
+ <h4 className="font-medium">Danger</h4>
129
+ <p className="text-sm text-muted-foreground">Red danger glow</p>
130
+ </div>
131
+ </div>
132
+ </WakaGlowCardDanger>
133
+ </div>
134
+ ),
135
+ }
136
+
137
+ export const Rainbow: Story = {
138
+ render: () => (
139
+ <WakaGlowCardRainbow className="w-[350px] p-6">
140
+ <div className="flex items-center gap-3">
141
+ <Rocket className="h-8 w-8" />
142
+ <div>
143
+ <h3 className="font-semibold text-lg">Rainbow Card</h3>
144
+ <p className="text-sm text-muted-foreground">
145
+ Animated rainbow border effect
146
+ </p>
147
+ </div>
148
+ </div>
149
+ </WakaGlowCardRainbow>
150
+ ),
151
+ }
152
+
153
+ export const WithGradient: Story = {
154
+ render: () => (
155
+ <WakaGlowCard gradient className="w-[350px] p-6">
156
+ <h3 className="font-semibold text-lg mb-2">Gradient Background</h3>
157
+ <p className="text-muted-foreground">
158
+ This card has a subtle gradient that intensifies on hover.
159
+ </p>
160
+ </WakaGlowCard>
161
+ ),
162
+ }
163
+
164
+ export const CustomColors: Story = {
165
+ render: () => (
166
+ <div className="flex gap-6">
167
+ <WakaGlowCard glowColor="rgb(147, 51, 234)" className="w-[200px] p-6">
168
+ <h4 className="font-medium">Purple</h4>
169
+ <p className="text-sm text-muted-foreground">Custom purple glow</p>
170
+ </WakaGlowCard>
171
+ <WakaGlowCard glowColor="rgb(236, 72, 153)" className="w-[200px] p-6">
172
+ <h4 className="font-medium">Pink</h4>
173
+ <p className="text-sm text-muted-foreground">Custom pink glow</p>
174
+ </WakaGlowCard>
175
+ <WakaGlowCard glowColor="rgb(6, 182, 212)" className="w-[200px] p-6">
176
+ <h4 className="font-medium">Cyan</h4>
177
+ <p className="text-sm text-muted-foreground">Custom cyan glow</p>
178
+ </WakaGlowCard>
179
+ </div>
180
+ ),
181
+ }
182
+
183
+ export const IntensityLevels: Story = {
184
+ render: () => (
185
+ <div className="flex gap-6">
186
+ <WakaGlowCard glowIntensity={0.1} className="w-[200px] p-6">
187
+ <h4 className="font-medium">Subtle</h4>
188
+ <p className="text-sm text-muted-foreground">10% intensity</p>
189
+ </WakaGlowCard>
190
+ <WakaGlowCard glowIntensity={0.25} className="w-[200px] p-6">
191
+ <h4 className="font-medium">Medium</h4>
192
+ <p className="text-sm text-muted-foreground">25% intensity</p>
193
+ </WakaGlowCard>
194
+ <WakaGlowCard glowIntensity={0.4} className="w-[200px] p-6">
195
+ <h4 className="font-medium">Strong</h4>
196
+ <p className="text-sm text-muted-foreground">40% intensity</p>
197
+ </WakaGlowCard>
198
+ </div>
199
+ ),
200
+ }
201
+
202
+ export const GridLayout: Story = {
203
+ render: () => (
204
+ <WakaGlowGrid columns={3} gap="md">
205
+ {[
206
+ { icon: <Zap className="h-6 w-6" />, title: 'Fast', desc: 'Lightning speed' },
207
+ { icon: <Shield className="h-6 w-6" />, title: 'Secure', desc: 'Enterprise grade' },
208
+ { icon: <Star className="h-6 w-6" />, title: 'Premium', desc: 'Top quality' },
209
+ { icon: <Heart className="h-6 w-6" />, title: 'Loved', desc: 'By developers' },
210
+ { icon: <Rocket className="h-6 w-6" />, title: 'Powerful', desc: 'Feature rich' },
211
+ { icon: <Code className="h-6 w-6" />, title: 'Modern', desc: 'Latest tech' },
212
+ ].map((item, i) => (
213
+ <WakaGlowCard key={i} className="p-6">
214
+ <div className="flex items-center gap-3">
215
+ <div className="p-2 rounded-lg bg-primary/10 text-primary">{item.icon}</div>
216
+ <div>
217
+ <h4 className="font-medium">{item.title}</h4>
218
+ <p className="text-sm text-muted-foreground">{item.desc}</p>
219
+ </div>
220
+ </div>
221
+ </WakaGlowCard>
222
+ ))}
223
+ </WakaGlowGrid>
224
+ ),
225
+ }
226
+
227
+ export const ProductCard: Story = {
228
+ render: () => (
229
+ <WakaGlowCard
230
+ glowColor="rgb(124, 58, 237)"
231
+ gradient
232
+ hoverEffect="lift"
233
+ className="w-[350px] overflow-hidden"
234
+ >
235
+ <div className="aspect-video bg-gradient-to-br from-violet-500 to-purple-700" />
236
+ <div className="p-6">
237
+ <div className="flex items-center justify-between mb-2">
238
+ <span className="text-sm font-medium text-violet-500">PRO PLAN</span>
239
+ <span className="text-xs bg-violet-500/10 text-violet-500 px-2 py-1 rounded-full">Popular</span>
240
+ </div>
241
+ <h3 className="font-bold text-xl mb-2">Premium Features</h3>
242
+ <p className="text-sm text-muted-foreground mb-4">
243
+ Unlock all advanced features and get priority support.
244
+ </p>
245
+ <div className="flex items-end gap-1">
246
+ <span className="text-3xl font-bold">$49</span>
247
+ <span className="text-muted-foreground">/month</span>
248
+ </div>
249
+ </div>
250
+ </WakaGlowCard>
251
+ ),
252
+ }
253
+
254
+ export const NoBorderGlow: Story = {
255
+ render: () => (
256
+ <WakaGlowCard borderGlow={false} className="w-[350px] p-6">
257
+ <h3 className="font-semibold text-lg mb-2">No Border Glow</h3>
258
+ <p className="text-muted-foreground">
259
+ This card only has the center glow effect, no border glow.
260
+ </p>
261
+ </WakaGlowCard>
262
+ ),
263
+ }
264
+
265
+ export const StaticGlow: Story = {
266
+ render: () => (
267
+ <WakaGlowCard followCursor={false} className="w-[350px] p-6">
268
+ <h3 className="font-semibold text-lg mb-2">Static Glow</h3>
269
+ <p className="text-muted-foreground">
270
+ The glow doesn't follow the cursor - it stays centered.
271
+ </p>
272
+ </WakaGlowCard>
273
+ ),
274
+ }
@@ -0,0 +1,349 @@
1
+ import type { Meta, StoryObj } from '@storybook/react'
2
+ import { WakaHapticButton, WakaHapticIconButton } from './index'
3
+ import * as React from 'react'
4
+ import { Heart, Plus, Send, Download, Share2, Bell, Settings, Trash2, Check, X, ArrowRight, Star } from 'lucide-react'
5
+
6
+ const meta: Meta<typeof WakaHapticButton> = {
7
+ title: 'Components/Effects/WakaHapticButton',
8
+ component: WakaHapticButton,
9
+ parameters: {
10
+ layout: 'centered',
11
+ docs: {
12
+ description: {
13
+ component: 'A button component with haptic feedback, ripple effect, press animations, and multiple variants.',
14
+ },
15
+ },
16
+ },
17
+ tags: ['autodocs'],
18
+ argTypes: {
19
+ variant: {
20
+ control: 'select',
21
+ options: ['default', 'secondary', 'destructive', 'outline', 'ghost', 'glass', 'gradient', 'neon'],
22
+ description: 'Button variant',
23
+ },
24
+ size: {
25
+ control: 'select',
26
+ options: ['sm', 'default', 'lg', 'xl', 'icon', 'icon-sm', 'icon-lg'],
27
+ description: 'Button size',
28
+ },
29
+ rounded: {
30
+ control: 'select',
31
+ options: ['default', 'sm', 'lg', 'full'],
32
+ description: 'Border radius',
33
+ },
34
+ hapticEnabled: {
35
+ control: 'boolean',
36
+ description: 'Enable haptic feedback',
37
+ },
38
+ ripple: {
39
+ control: 'boolean',
40
+ description: 'Enable ripple effect',
41
+ },
42
+ pressScale: {
43
+ control: 'boolean',
44
+ description: 'Enable press scale animation',
45
+ },
46
+ glowOnPress: {
47
+ control: 'boolean',
48
+ description: 'Enable glow effect on press',
49
+ },
50
+ loading: {
51
+ control: 'boolean',
52
+ description: 'Loading state',
53
+ },
54
+ },
55
+ }
56
+
57
+ export default meta
58
+ type Story = StoryObj<typeof WakaHapticButton>
59
+
60
+ export const Default: Story = {
61
+ args: {
62
+ children: 'Click Me',
63
+ },
64
+ render: (args) => <WakaHapticButton {...args} />,
65
+ }
66
+
67
+ export const Variants: Story = {
68
+ render: () => (
69
+ <div className="flex flex-wrap gap-4">
70
+ <WakaHapticButton variant="default">Default</WakaHapticButton>
71
+ <WakaHapticButton variant="secondary">Secondary</WakaHapticButton>
72
+ <WakaHapticButton variant="destructive">Destructive</WakaHapticButton>
73
+ <WakaHapticButton variant="outline">Outline</WakaHapticButton>
74
+ <WakaHapticButton variant="ghost">Ghost</WakaHapticButton>
75
+ <WakaHapticButton variant="gradient">Gradient</WakaHapticButton>
76
+ <WakaHapticButton variant="neon">Neon</WakaHapticButton>
77
+ </div>
78
+ ),
79
+ }
80
+
81
+ export const GlassVariant: Story = {
82
+ render: () => (
83
+ <div className="p-8 rounded-xl bg-gradient-to-br from-violet-600 to-indigo-800">
84
+ <WakaHapticButton variant="glass">
85
+ Glass Button
86
+ </WakaHapticButton>
87
+ </div>
88
+ ),
89
+ }
90
+
91
+ export const Sizes: Story = {
92
+ render: () => (
93
+ <div className="flex items-center gap-4">
94
+ <WakaHapticButton size="sm">Small</WakaHapticButton>
95
+ <WakaHapticButton size="default">Default</WakaHapticButton>
96
+ <WakaHapticButton size="lg">Large</WakaHapticButton>
97
+ <WakaHapticButton size="xl">Extra Large</WakaHapticButton>
98
+ </div>
99
+ ),
100
+ }
101
+
102
+ export const Rounded: Story = {
103
+ render: () => (
104
+ <div className="flex gap-4">
105
+ <WakaHapticButton rounded="sm">Small Radius</WakaHapticButton>
106
+ <WakaHapticButton rounded="default">Default</WakaHapticButton>
107
+ <WakaHapticButton rounded="lg">Large Radius</WakaHapticButton>
108
+ <WakaHapticButton rounded="full">Full Radius</WakaHapticButton>
109
+ </div>
110
+ ),
111
+ }
112
+
113
+ export const WithIcons: Story = {
114
+ render: () => (
115
+ <div className="flex flex-wrap gap-4">
116
+ <WakaHapticButton leftIcon={<Send className="h-4 w-4" />}>
117
+ Send
118
+ </WakaHapticButton>
119
+ <WakaHapticButton rightIcon={<ArrowRight className="h-4 w-4" />}>
120
+ Continue
121
+ </WakaHapticButton>
122
+ <WakaHapticButton leftIcon={<Download className="h-4 w-4" />}>
123
+ Download
124
+ </WakaHapticButton>
125
+ <WakaHapticButton variant="destructive" leftIcon={<Trash2 className="h-4 w-4" />}>
126
+ Delete
127
+ </WakaHapticButton>
128
+ </div>
129
+ ),
130
+ }
131
+
132
+ export const IconButtons: Story = {
133
+ render: () => (
134
+ <div className="flex gap-4">
135
+ <WakaHapticIconButton icon={<Plus className="h-5 w-5" />} aria-label="Add" />
136
+ <WakaHapticIconButton icon={<Heart className="h-5 w-5" />} aria-label="Like" variant="secondary" />
137
+ <WakaHapticIconButton icon={<Bell className="h-5 w-5" />} aria-label="Notifications" variant="outline" />
138
+ <WakaHapticIconButton icon={<Settings className="h-5 w-5" />} aria-label="Settings" variant="ghost" />
139
+ <WakaHapticIconButton icon={<X className="h-5 w-5" />} aria-label="Close" variant="destructive" />
140
+ </div>
141
+ ),
142
+ }
143
+
144
+ export const IconButtonSizes: Story = {
145
+ render: () => (
146
+ <div className="flex items-center gap-4">
147
+ <WakaHapticIconButton icon={<Star className="h-4 w-4" />} aria-label="Star" size="icon-sm" />
148
+ <WakaHapticIconButton icon={<Star className="h-5 w-5" />} aria-label="Star" size="icon" />
149
+ <WakaHapticIconButton icon={<Star className="h-6 w-6" />} aria-label="Star" size="icon-lg" />
150
+ </div>
151
+ ),
152
+ }
153
+
154
+ export const HapticPatterns: Story = {
155
+ render: () => (
156
+ <div className="space-y-4">
157
+ <p className="text-sm text-muted-foreground">Test on mobile device for haptic feedback</p>
158
+ <div className="flex flex-wrap gap-4">
159
+ <WakaHapticButton hapticPattern="light">Light</WakaHapticButton>
160
+ <WakaHapticButton hapticPattern="medium">Medium</WakaHapticButton>
161
+ <WakaHapticButton hapticPattern="heavy">Heavy</WakaHapticButton>
162
+ <WakaHapticButton hapticPattern="success" variant="secondary" leftIcon={<Check className="h-4 w-4" />}>
163
+ Success
164
+ </WakaHapticButton>
165
+ <WakaHapticButton hapticPattern="warning" className="bg-orange-500 hover:bg-orange-600">
166
+ Warning
167
+ </WakaHapticButton>
168
+ <WakaHapticButton hapticPattern="error" variant="destructive">
169
+ Error
170
+ </WakaHapticButton>
171
+ </div>
172
+ </div>
173
+ ),
174
+ }
175
+
176
+ export const RippleEffect: Story = {
177
+ render: () => (
178
+ <div className="flex gap-4">
179
+ <WakaHapticButton ripple>With Ripple</WakaHapticButton>
180
+ <WakaHapticButton ripple={false}>No Ripple</WakaHapticButton>
181
+ </div>
182
+ ),
183
+ }
184
+
185
+ export const CustomRippleColor: Story = {
186
+ render: () => (
187
+ <div className="flex gap-4">
188
+ <WakaHapticButton rippleColor="rgba(255, 255, 255, 0.5)">
189
+ White Ripple
190
+ </WakaHapticButton>
191
+ <WakaHapticButton variant="secondary" rippleColor="rgba(0, 0, 0, 0.2)">
192
+ Dark Ripple
193
+ </WakaHapticButton>
194
+ <WakaHapticButton rippleColor="rgba(147, 51, 234, 0.4)">
195
+ Purple Ripple
196
+ </WakaHapticButton>
197
+ </div>
198
+ ),
199
+ }
200
+
201
+ export const PressAnimations: Story = {
202
+ render: () => (
203
+ <div className="flex gap-4">
204
+ <WakaHapticButton pressScale pressScaleFactor={0.95}>
205
+ Press Scale
206
+ </WakaHapticButton>
207
+ <WakaHapticButton pressScale={false}>
208
+ No Scale
209
+ </WakaHapticButton>
210
+ </div>
211
+ ),
212
+ }
213
+
214
+ export const GlowOnPress: Story = {
215
+ render: () => (
216
+ <div className="flex gap-4">
217
+ <WakaHapticButton glowOnPress>
218
+ Glow Effect
219
+ </WakaHapticButton>
220
+ <WakaHapticButton glowOnPress variant="secondary" glowColor="rgba(147, 51, 234, 0.5)">
221
+ Custom Glow
222
+ </WakaHapticButton>
223
+ <WakaHapticButton glowOnPress variant="destructive">
224
+ Destructive Glow
225
+ </WakaHapticButton>
226
+ </div>
227
+ ),
228
+ }
229
+
230
+ export const LoadingState: Story = {
231
+ render: () => {
232
+ const [loading, setLoading] = React.useState(false)
233
+
234
+ const handleClick = () => {
235
+ setLoading(true)
236
+ setTimeout(() => setLoading(false), 2000)
237
+ }
238
+
239
+ return (
240
+ <div className="flex gap-4">
241
+ <WakaHapticButton loading>Loading...</WakaHapticButton>
242
+ <WakaHapticButton loading={loading} onClick={handleClick}>
243
+ {loading ? 'Processing...' : 'Click to Load'}
244
+ </WakaHapticButton>
245
+ </div>
246
+ )
247
+ },
248
+ }
249
+
250
+ export const Disabled: Story = {
251
+ render: () => (
252
+ <div className="flex gap-4">
253
+ <WakaHapticButton disabled>Disabled</WakaHapticButton>
254
+ <WakaHapticButton disabled variant="secondary">Disabled</WakaHapticButton>
255
+ <WakaHapticButton disabled variant="outline">Disabled</WakaHapticButton>
256
+ </div>
257
+ ),
258
+ }
259
+
260
+ export const SubmitForm: Story = {
261
+ render: () => {
262
+ const [loading, setLoading] = React.useState(false)
263
+ const [success, setSuccess] = React.useState(false)
264
+
265
+ const handleSubmit = (e: React.FormEvent) => {
266
+ e.preventDefault()
267
+ setLoading(true)
268
+ setTimeout(() => {
269
+ setLoading(false)
270
+ setSuccess(true)
271
+ setTimeout(() => setSuccess(false), 2000)
272
+ }, 1500)
273
+ }
274
+
275
+ return (
276
+ <form onSubmit={handleSubmit} className="w-[300px] space-y-4">
277
+ <input
278
+ type="text"
279
+ className="w-full px-3 py-2 border rounded-md"
280
+ placeholder="Enter your name"
281
+ />
282
+ <WakaHapticButton
283
+ type="submit"
284
+ className="w-full"
285
+ loading={loading}
286
+ hapticPattern={success ? 'success' : 'medium'}
287
+ leftIcon={success ? <Check className="h-4 w-4" /> : undefined}
288
+ variant={success ? 'secondary' : 'default'}
289
+ >
290
+ {success ? 'Submitted!' : loading ? 'Submitting...' : 'Submit'}
291
+ </WakaHapticButton>
292
+ </form>
293
+ )
294
+ },
295
+ }
296
+
297
+ export const SocialActions: Story = {
298
+ render: () => {
299
+ const [liked, setLiked] = React.useState(false)
300
+ const [shared, setShared] = React.useState(false)
301
+
302
+ return (
303
+ <div className="flex gap-3">
304
+ <WakaHapticButton
305
+ variant={liked ? 'destructive' : 'outline'}
306
+ size="sm"
307
+ hapticPattern={liked ? 'success' : 'selection'}
308
+ leftIcon={<Heart className={`h-4 w-4 ${liked ? 'fill-current' : ''}`} />}
309
+ onClick={() => setLiked(!liked)}
310
+ >
311
+ {liked ? 'Liked' : 'Like'}
312
+ </WakaHapticButton>
313
+ <WakaHapticButton
314
+ variant={shared ? 'secondary' : 'outline'}
315
+ size="sm"
316
+ hapticPattern="selection"
317
+ leftIcon={<Share2 className="h-4 w-4" />}
318
+ onClick={() => setShared(!shared)}
319
+ >
320
+ {shared ? 'Shared' : 'Share'}
321
+ </WakaHapticButton>
322
+ </div>
323
+ )
324
+ },
325
+ }
326
+
327
+ export const ButtonGroup: Story = {
328
+ render: () => (
329
+ <div className="flex">
330
+ <WakaHapticButton rounded="sm" className="rounded-r-none border-r-0">
331
+ Previous
332
+ </WakaHapticButton>
333
+ <WakaHapticButton rounded="sm" className="rounded-none border-r-0">
334
+ Current
335
+ </WakaHapticButton>
336
+ <WakaHapticButton rounded="sm" className="rounded-l-none">
337
+ Next
338
+ </WakaHapticButton>
339
+ </div>
340
+ ),
341
+ }
342
+
343
+ export const NoHaptic: Story = {
344
+ render: () => (
345
+ <WakaHapticButton hapticEnabled={false}>
346
+ No Haptic Feedback
347
+ </WakaHapticButton>
348
+ ),
349
+ }