@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.
- package/dist/blocks/dashboard/index.d.ts +4 -1
- package/dist/blocks/empty-states/index.d.ts +4 -1
- package/dist/blocks/error-pages/index.d.ts +4 -1
- package/dist/blocks/index.d.ts +1 -1
- package/dist/blocks/landing/index.d.ts +4 -1
- package/dist/blocks/pricing/index.d.ts +5 -1
- package/dist/blocks/sidebar/index.d.ts +5 -1
- package/dist/index.cjs.js +130 -130
- package/dist/index.d.ts +1 -0
- package/dist/index.es.js +7905 -7856
- package/dist/stories/Button.d.ts +14 -0
- package/dist/stories/Button.stories.d.ts +8 -0
- package/dist/stories/Header.d.ts +11 -0
- package/dist/stories/Header.stories.d.ts +6 -0
- package/dist/stories/Page.d.ts +2 -0
- package/dist/stories/Page.stories.d.ts +6 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/link.d.ts +23 -0
- package/package.json +11 -3
- package/src/blocks/activity-timeline/ActivityTimeline.stories.tsx +460 -0
- package/src/blocks/apm-overview/APMOverview.stories.tsx +435 -0
- package/src/blocks/auth-2fa/Auth2FA.stories.tsx +308 -0
- package/src/blocks/calendar-view/CalendarView.stories.tsx +398 -0
- package/src/blocks/chat/Chat.stories.tsx +466 -0
- package/src/blocks/chat-interface/ChatInterface.stories.tsx +412 -0
- package/src/blocks/checkout-flow/CheckoutFlow.stories.tsx +408 -0
- package/src/blocks/cicd-builder/CICDBuilder.stories.tsx +499 -0
- package/src/blocks/cloud-cost-dashboard/CloudCostDashboard.stories.tsx +356 -0
- package/src/blocks/container-orchestrator/ContainerOrchestrator.stories.tsx +461 -0
- package/src/blocks/dashboard/Dashboard.stories.tsx +559 -0
- package/src/blocks/dashboard/index.tsx +68 -27
- package/src/blocks/dashboard-kpi/DashboardKPI.stories.tsx +422 -0
- package/src/blocks/database-admin/DatabaseAdmin.stories.tsx +393 -0
- package/src/blocks/deployment-dashboard/DeploymentDashboard.stories.tsx +457 -0
- package/src/blocks/empty-states/EmptyStates.stories.tsx +467 -0
- package/src/blocks/empty-states/index.tsx +26 -8
- package/src/blocks/error-pages/ErrorPages.stories.tsx +401 -0
- package/src/blocks/error-pages/index.tsx +26 -8
- package/src/blocks/faq/FAQ.stories.tsx +416 -0
- package/src/blocks/file-manager/FileManager.stories.tsx +413 -0
- package/src/blocks/footer/Footer.stories.tsx +328 -0
- package/src/blocks/gitops-sync-status/GitOpsSyncStatus.stories.tsx +529 -0
- package/src/blocks/header/WakaHeader.stories.tsx +455 -0
- package/src/blocks/headtab/Headtab.stories.tsx +369 -0
- package/src/blocks/i18n-editor/I18nEditor.stories.tsx +451 -0
- package/src/blocks/incident-manager/IncidentManager.stories.tsx +464 -0
- package/src/blocks/index.ts +1 -1
- package/src/blocks/infrastructure-map/InfrastructureMap.stories.tsx +533 -0
- package/src/blocks/kanban-board/KanbanBoard.stories.tsx +494 -0
- package/src/blocks/landing/WakaLanding.stories.tsx +449 -0
- package/src/blocks/landing/index.tsx +125 -66
- package/src/blocks/language-selector/LanguageSelector.stories.tsx +345 -0
- package/src/blocks/layout/Layout.stories.tsx +373 -0
- package/src/blocks/login/Login.stories.tsx +443 -0
- package/src/blocks/on-call-schedule/OnCallSchedule.stories.tsx +381 -0
- package/src/blocks/player-profile/PlayerProfile.stories.tsx +316 -0
- package/src/blocks/pricing/WakaPricing.stories.tsx +530 -0
- package/src/blocks/pricing/index.tsx +38 -4
- package/src/blocks/profile/Profile.stories.tsx +371 -0
- package/src/blocks/release-notes/ReleaseNotes.stories.tsx +431 -0
- package/src/blocks/settings/Settings.stories.tsx +520 -0
- package/src/blocks/sidebar/WakaSidebar.stories.tsx +513 -0
- package/src/blocks/sidebar/index.tsx +49 -20
- package/src/blocks/theme-creator-block/ThemeCreatorBlock.stories.tsx +370 -0
- package/src/blocks/user-management/UserManagement.stories.tsx +411 -0
- package/src/blocks/wizard/Wizard.stories.tsx +683 -0
- package/src/components/accordion/Accordion.stories.tsx +93 -0
- package/src/components/alert/Alert.stories.tsx +95 -0
- package/src/components/alert-dialog/AlertDialog.stories.tsx +126 -0
- package/src/components/aspect-ratio/AspectRatio.stories.tsx +118 -0
- package/src/components/avatar/Avatar.stories.tsx +104 -0
- package/src/components/button/Button.stories.tsx +12 -1
- package/src/components/calendar/Calendar.stories.tsx +102 -0
- package/src/components/card/Card.stories.tsx +125 -0
- package/src/components/checkbox/Checkbox.stories.tsx +100 -0
- package/src/components/code/Code.stories.tsx +402 -0
- package/src/components/collapsible/Collapsible.stories.tsx +123 -0
- package/src/components/command/Command.stories.tsx +207 -0
- package/src/components/context-menu/ContextMenu.stories.tsx +220 -0
- package/src/components/dialog/Dialog.stories.tsx +157 -0
- package/src/components/dropdown-menu/DropdownMenu.stories.tsx +225 -0
- package/src/components/form/Form.stories.tsx +413 -0
- package/src/components/hover-card/HoverCard.stories.tsx +148 -0
- package/src/components/input-otp/InputOTP.stories.tsx +255 -0
- package/src/components/label/Label.stories.tsx +68 -0
- package/src/components/menubar/Menubar.stories.tsx +278 -0
- package/src/components/navigation-menu/NavigationMenu.stories.tsx +202 -0
- package/src/components/popover/Popover.stories.tsx +199 -0
- package/src/components/progress/Progress.stories.tsx +104 -0
- package/src/components/radio-group/RadioGroup.stories.tsx +138 -0
- package/src/components/scroll-area/ScrollArea.stories.tsx +153 -0
- package/src/components/select/Select.stories.tsx +146 -0
- package/src/components/separator/Separator.stories.tsx +117 -0
- package/src/components/sheet/Sheet.stories.tsx +195 -0
- package/src/components/skeleton/Skeleton.stories.tsx +114 -0
- package/src/components/slider/Slider.stories.tsx +157 -0
- package/src/components/switch/Switch.stories.tsx +114 -0
- package/src/components/table/Table.stories.tsx +153 -0
- package/src/components/tabs/Tabs.stories.tsx +155 -0
- package/src/components/textarea/Textarea.stories.tsx +116 -0
- package/src/components/toast/Toast.stories.tsx +160 -0
- package/src/components/toggle/Toggle.stories.tsx +125 -0
- package/src/components/tooltip/Tooltip.stories.tsx +133 -0
- package/src/components/typography/Typography.stories.tsx +207 -0
- package/src/components/waka-3d-pie-chart/Waka3DPieChart.stories.tsx +308 -0
- package/src/components/waka-achievement-unlock/WakaAchievementUnlock.stories.tsx +353 -0
- package/src/components/waka-artifact-list/WakaArtifactList.stories.tsx +258 -0
- package/src/components/waka-autocomplete/WakaAutocomplete.stories.tsx +224 -0
- package/src/components/waka-badge-showcase/WakaBadgeShowcase.stories.tsx +269 -0
- package/src/components/waka-barcode/WakaBarcode.stories.tsx +227 -0
- package/src/components/waka-bottom-sheet/WakaBottomSheet.stories.tsx +408 -0
- package/src/components/waka-breadcrumb/WakaBreadcrumb.stories.tsx +237 -0
- package/src/components/waka-build-matrix/WakaBuildMatrix.stories.tsx +328 -0
- package/src/components/waka-carousel/WakaCarousel.stories.tsx +296 -0
- package/src/components/waka-charts/WakaCharts.stories.tsx +519 -0
- package/src/components/waka-color-picker/WakaColorPicker.stories.tsx +200 -0
- package/src/components/waka-combobox/WakaCombobox.stories.tsx +250 -0
- package/src/components/waka-container-list/WakaContainerList.stories.tsx +315 -0
- package/src/components/waka-contribution-graph/WakaContributionGraph.stories.tsx +354 -0
- package/src/components/waka-cost-breakdown/WakaCostBreakdown.stories.tsx +348 -0
- package/src/components/waka-daily-reward/WakaDailyReward.stories.tsx +365 -0
- package/src/components/waka-database-card/WakaDatabaseCard.stories.tsx +306 -0
- package/src/components/waka-date-range-picker/WakaDateRangePicker.stories.tsx +339 -0
- package/src/components/waka-datetime-picker/WakaDateTimePicker.stories.tsx +317 -0
- package/src/components/waka-deployment-lane/WakaDeploymentLane.stories.tsx +292 -0
- package/src/components/waka-dock/WakaDock.stories.tsx +332 -0
- package/src/components/waka-drawer/WakaDrawer.stories.tsx +437 -0
- package/src/components/waka-env-var-editor/WakaEnvVarEditor.stories.tsx +263 -0
- package/src/components/waka-error-shake/WakaErrorShake.stories.tsx +410 -0
- package/src/components/waka-file-upload/WakaFileUpload.stories.tsx +239 -0
- package/src/components/waka-flow-diagram/WakaFlowDiagram.stories.tsx +365 -0
- package/src/components/waka-funnel-chart/WakaFunnelChart.stories.tsx +281 -0
- package/src/components/waka-glow-card/WakaGlowCard.stories.tsx +274 -0
- package/src/components/waka-haptic-button/WakaHapticButton.stories.tsx +349 -0
- package/src/components/waka-health-pulse/WakaHealthPulse.stories.tsx +293 -0
- package/src/components/waka-heatmap/WakaHeatmap.stories.tsx +376 -0
- package/src/components/waka-image/WakaImage.stories.tsx +255 -0
- package/src/components/waka-incident-timeline/WakaIncidentTimeline.stories.tsx +300 -0
- package/src/components/waka-kanban/WakaKanban.stories.tsx +399 -0
- package/src/components/waka-kubernetes-overview/WakaKubernetesOverview.stories.tsx +281 -0
- package/src/components/waka-leaderboard/WakaLeaderboard.stories.tsx +300 -0
- package/src/components/waka-level-progress/WakaLevelProgress.stories.tsx +313 -0
- package/src/components/waka-loading-orbit/WakaLoadingOrbit.stories.tsx +413 -0
- package/src/components/waka-log-viewer/WakaLogViewer.stories.tsx +312 -0
- package/src/components/waka-loot-box/WakaLootBox.stories.tsx +374 -0
- package/src/components/waka-metric-sparkline/WakaMetricSparkline.stories.tsx +312 -0
- package/src/components/waka-migration-list/WakaMigrationList.stories.tsx +289 -0
- package/src/components/waka-modal/WakaModal.stories.tsx +434 -0
- package/src/components/waka-morph-button/WakaMorphButton.stories.tsx +405 -0
- package/src/components/waka-network-topology/WakaNetworkTopology.stories.tsx +364 -0
- package/src/components/waka-notifications/WakaNotifications.stories.tsx +290 -0
- package/src/components/waka-number-input/WakaNumberInput.stories.tsx +282 -0
- package/src/components/waka-pagination/WakaPagination.stories.tsx +328 -0
- package/src/components/waka-password-strength/WakaPasswordStrength.stories.tsx +318 -0
- package/src/components/waka-pipeline-view/WakaPipelineView.stories.tsx +386 -0
- package/src/components/waka-player-card/WakaPlayerCard.stories.tsx +333 -0
- package/src/components/waka-pod-card/WakaPodCard.stories.tsx +435 -0
- package/src/components/waka-qrcode/WakaQRCode.stories.tsx +232 -0
- package/src/components/waka-query-explain/WakaQueryExplain.stories.tsx +407 -0
- package/src/components/waka-quest-card/WakaQuestCard.stories.tsx +394 -0
- package/src/components/waka-quota-bar/WakaQuotaBar.stories.tsx +435 -0
- package/src/components/waka-radar-score/WakaRadarScore.stories.tsx +372 -0
- package/src/components/waka-resource-gauge/WakaResourceGauge.stories.tsx +366 -0
- package/src/components/waka-rich-text-editor/WakaRichTextEditor.stories.tsx +238 -0
- package/src/components/waka-sankey-diagram/WakaSankeyDiagram.stories.tsx +389 -0
- package/src/components/waka-scratch-card/WakaScratchCard.stories.tsx +388 -0
- package/src/components/waka-secret-card/WakaSecretCard.stories.tsx +314 -0
- package/src/components/waka-segmented-control/WakaSegmentedControl.stories.tsx +309 -0
- package/src/components/waka-server-rack/WakaServerRack.stories.tsx +382 -0
- package/src/components/waka-service-graph/WakaServiceGraph.stories.tsx +262 -0
- package/src/components/waka-skeleton-wave/WakaSkeletonWave.stories.tsx +321 -0
- package/src/components/waka-skill-tree/WakaSkillTree.stories.tsx +308 -0
- package/src/components/waka-spin-wheel/WakaSpinWheel.stories.tsx +368 -0
- package/src/components/waka-spinner/WakaSpinner.stories.tsx +156 -0
- package/src/components/waka-stat/WakaStat.stories.tsx +334 -0
- package/src/components/waka-status-matrix/WakaStatusMatrix.stories.tsx +331 -0
- package/src/components/waka-stepper/WakaStepper.stories.tsx +468 -0
- package/src/components/waka-streak-counter/WakaStreakCounter.stories.tsx +235 -0
- package/src/components/waka-success-explosion/WakaSuccessExplosion.stories.tsx +389 -0
- package/src/components/waka-tabs-morph/WakaTabsMorph.stories.tsx +471 -0
- package/src/components/waka-terminal-output/WakaTerminalOutput.stories.tsx +351 -0
- package/src/components/waka-test-report/WakaTestReport.stories.tsx +322 -0
- package/src/components/waka-tilt-card/WakaTiltCard.stories.tsx +300 -0
- package/src/components/waka-time-picker/WakaTimePicker.stories.tsx +227 -0
- package/src/components/waka-timeline/WakaTimeline.stories.tsx +383 -0
- package/src/components/waka-tournament-bracket/WakaTournamentBracket.stories.tsx +375 -0
- package/src/components/waka-trace-viewer/WakaTraceViewer.stories.tsx +445 -0
- package/src/components/waka-tree/WakaTree.stories.tsx +359 -0
- package/src/components/waka-treemap-chart/WakaTreemapChart.stories.tsx +378 -0
- package/src/components/waka-typewriter/WakaTypewriter.stories.tsx +366 -0
- package/src/components/waka-versus-card/WakaVersusCard.stories.tsx +530 -0
- package/src/components/waka-video/WakaVideo.stories.tsx +203 -0
- package/src/components/waka-virtual-list/WakaVirtualList.stories.tsx +273 -0
- 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
|
+
}
|