@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,408 @@
1
+ import type { Meta, StoryObj } from '@storybook/react'
2
+ import {
3
+ CheckoutFlow,
4
+ defaultCartItems,
5
+ defaultShippingMethods,
6
+ defaultPaymentMethods,
7
+ } from './index'
8
+ import type { CartItem, ShippingMethod, PaymentMethod, CheckoutAddress } from './index'
9
+ import * as React from 'react'
10
+
11
+ const meta: Meta<typeof CheckoutFlow> = {
12
+ title: 'Blocks/CheckoutFlow',
13
+ component: CheckoutFlow,
14
+ parameters: {
15
+ layout: 'fullscreen',
16
+ docs: {
17
+ description: {
18
+ component:
19
+ 'A 4-step e-commerce checkout flow with cart review, shipping address & method selection, payment method selection, and order review with coupon support.',
20
+ },
21
+ },
22
+ },
23
+ tags: ['autodocs'],
24
+ }
25
+
26
+ export default meta
27
+ type Story = StoryObj<typeof CheckoutFlow>
28
+
29
+ export const Default: Story = {
30
+ render: () => (
31
+ <div className="p-6">
32
+ <CheckoutFlow
33
+ items={defaultCartItems}
34
+ shippingMethods={defaultShippingMethods}
35
+ paymentMethods={defaultPaymentMethods}
36
+ onSubmitOrder={async (data) => {
37
+ console.log('Order submitted:', data)
38
+ await new Promise((resolve) => setTimeout(resolve, 1500))
39
+ }}
40
+ />
41
+ </div>
42
+ ),
43
+ }
44
+
45
+ export const WithDiscount: Story = {
46
+ render: () => (
47
+ <div className="p-6">
48
+ <CheckoutFlow
49
+ items={defaultCartItems}
50
+ shippingMethods={defaultShippingMethods}
51
+ paymentMethods={defaultPaymentMethods}
52
+ discount={{ code: 'SAVE20', amount: 20, type: 'percent' }}
53
+ onRemoveDiscount={() => console.log('Remove discount')}
54
+ onSubmitOrder={async (data) => {
55
+ console.log('Order submitted:', data)
56
+ }}
57
+ />
58
+ </div>
59
+ ),
60
+ }
61
+
62
+ export const LargeCart: Story = {
63
+ render: () => {
64
+ const largeCart: CartItem[] = [
65
+ {
66
+ id: '1',
67
+ name: 'MacBook Pro 16"',
68
+ description: 'Apple M3 Max chip, 48GB RAM, 1TB SSD',
69
+ price: 3499.00,
70
+ quantity: 1,
71
+ variant: 'Space Black',
72
+ },
73
+ {
74
+ id: '2',
75
+ name: 'Pro Display XDR',
76
+ description: 'Standard glass, 6K resolution',
77
+ price: 4999.00,
78
+ quantity: 1,
79
+ },
80
+ {
81
+ id: '3',
82
+ name: 'Magic Keyboard with Touch ID',
83
+ price: 199.00,
84
+ quantity: 2,
85
+ variant: 'Black Keys',
86
+ },
87
+ {
88
+ id: '4',
89
+ name: 'Magic Mouse',
90
+ price: 99.00,
91
+ quantity: 2,
92
+ variant: 'Silver',
93
+ },
94
+ {
95
+ id: '5',
96
+ name: 'USB-C to Lightning Cable',
97
+ price: 29.00,
98
+ quantity: 3,
99
+ variant: '2m',
100
+ },
101
+ {
102
+ id: '6',
103
+ name: 'AppleCare+ for MacBook Pro',
104
+ description: '3 years of hardware coverage',
105
+ price: 399.00,
106
+ quantity: 1,
107
+ },
108
+ ]
109
+
110
+ return (
111
+ <div className="p-6">
112
+ <CheckoutFlow
113
+ items={largeCart}
114
+ shippingMethods={defaultShippingMethods}
115
+ paymentMethods={defaultPaymentMethods}
116
+ onSubmitOrder={async (data) => {
117
+ console.log('Order submitted:', data)
118
+ }}
119
+ />
120
+ </div>
121
+ )
122
+ },
123
+ }
124
+
125
+ export const WithCouponHandler: Story = {
126
+ render: () => {
127
+ const [discount, setDiscount] = React.useState<{ code: string; amount: number; type: 'percent' | 'fixed' } | undefined>()
128
+
129
+ const handleApplyCoupon = async (code: string) => {
130
+ await new Promise((resolve) => setTimeout(resolve, 1000))
131
+ if (code.toUpperCase() === 'SAVE10') {
132
+ setDiscount({ code: 'SAVE10', amount: 10, type: 'percent' })
133
+ return { discount: 10, type: 'percent' as const }
134
+ }
135
+ if (code.toUpperCase() === 'FLAT50') {
136
+ setDiscount({ code: 'FLAT50', amount: 50, type: 'fixed' })
137
+ return { discount: 50, type: 'fixed' as const }
138
+ }
139
+ return null
140
+ }
141
+
142
+ return (
143
+ <div className="p-6">
144
+ <div className="mb-4 p-4 bg-muted rounded-lg text-sm">
145
+ <p className="font-medium">Try these coupon codes:</p>
146
+ <ul className="mt-2 space-y-1 text-muted-foreground">
147
+ <li><code className="bg-background px-1 rounded">SAVE10</code> - 10% off</li>
148
+ <li><code className="bg-background px-1 rounded">FLAT50</code> - $50 off</li>
149
+ </ul>
150
+ </div>
151
+ <CheckoutFlow
152
+ items={defaultCartItems}
153
+ discount={discount}
154
+ onApplyCoupon={handleApplyCoupon}
155
+ onRemoveDiscount={() => setDiscount(undefined)}
156
+ onSubmitOrder={async (data) => {
157
+ console.log('Order submitted:', data)
158
+ }}
159
+ />
160
+ </div>
161
+ )
162
+ },
163
+ }
164
+
165
+ export const CustomShippingMethods: Story = {
166
+ render: () => {
167
+ const customShipping: ShippingMethod[] = [
168
+ {
169
+ id: 'free',
170
+ name: 'Free Shipping',
171
+ description: 'Standard postal delivery',
172
+ price: 0,
173
+ estimatedDays: '7-10 business days',
174
+ },
175
+ {
176
+ id: 'economy',
177
+ name: 'Economy',
178
+ description: 'Budget-friendly option',
179
+ price: 2.99,
180
+ estimatedDays: '5-7 business days',
181
+ },
182
+ {
183
+ id: 'standard',
184
+ name: 'Standard',
185
+ description: 'Reliable delivery',
186
+ price: 6.99,
187
+ estimatedDays: '3-5 business days',
188
+ },
189
+ {
190
+ id: 'priority',
191
+ name: 'Priority',
192
+ description: 'Faster delivery with tracking',
193
+ price: 12.99,
194
+ estimatedDays: '2-3 business days',
195
+ },
196
+ {
197
+ id: 'express',
198
+ name: 'Express',
199
+ description: 'Guaranteed fast delivery',
200
+ price: 19.99,
201
+ estimatedDays: 'Next business day',
202
+ },
203
+ {
204
+ id: 'same-day',
205
+ name: 'Same Day',
206
+ description: 'Available in select areas',
207
+ price: 29.99,
208
+ estimatedDays: 'Today',
209
+ },
210
+ ]
211
+
212
+ return (
213
+ <div className="p-6">
214
+ <CheckoutFlow
215
+ items={defaultCartItems}
216
+ shippingMethods={customShipping}
217
+ paymentMethods={defaultPaymentMethods}
218
+ onSubmitOrder={async (data) => {
219
+ console.log('Order submitted:', data)
220
+ }}
221
+ />
222
+ </div>
223
+ )
224
+ },
225
+ }
226
+
227
+ export const CustomPaymentMethods: Story = {
228
+ render: () => {
229
+ const customPayments: PaymentMethod[] = [
230
+ { id: 'visa', type: 'card', label: 'Visa ending in 4242', last4: '4242' },
231
+ { id: 'mastercard', type: 'card', label: 'Mastercard ending in 8888', last4: '8888' },
232
+ { id: 'paypal', type: 'paypal', label: 'PayPal' },
233
+ { id: 'apple', type: 'apple', label: 'Apple Pay' },
234
+ { id: 'google', type: 'google', label: 'Google Pay' },
235
+ { id: 'bank', type: 'bank', label: 'Bank Transfer' },
236
+ ]
237
+
238
+ return (
239
+ <div className="p-6">
240
+ <CheckoutFlow
241
+ items={defaultCartItems}
242
+ shippingMethods={defaultShippingMethods}
243
+ paymentMethods={customPayments}
244
+ onSubmitOrder={async (data) => {
245
+ console.log('Order submitted:', data)
246
+ }}
247
+ />
248
+ </div>
249
+ )
250
+ },
251
+ }
252
+
253
+ export const EuroCheckout: Story = {
254
+ render: () => {
255
+ const euroItems: CartItem[] = [
256
+ {
257
+ id: '1',
258
+ name: 'Designer Handbag',
259
+ description: 'Italian leather, handcrafted',
260
+ price: 899.00,
261
+ quantity: 1,
262
+ variant: 'Cognac',
263
+ },
264
+ {
265
+ id: '2',
266
+ name: 'Silk Scarf',
267
+ description: 'Hand-printed silk twill',
268
+ price: 350.00,
269
+ quantity: 1,
270
+ variant: 'Floral Pattern',
271
+ },
272
+ ]
273
+
274
+ return (
275
+ <div className="p-6">
276
+ <CheckoutFlow
277
+ items={euroItems}
278
+ currency="€"
279
+ taxRate={20}
280
+ shippingMethods={defaultShippingMethods}
281
+ paymentMethods={defaultPaymentMethods}
282
+ onSubmitOrder={async (data) => {
283
+ console.log('Order submitted:', data)
284
+ }}
285
+ />
286
+ </div>
287
+ )
288
+ },
289
+ }
290
+
291
+ export const SingleItem: Story = {
292
+ render: () => {
293
+ const singleItem: CartItem[] = [
294
+ {
295
+ id: '1',
296
+ name: 'Premium Subscription',
297
+ description: 'Annual plan with all features',
298
+ price: 99.99,
299
+ quantity: 1,
300
+ },
301
+ ]
302
+
303
+ return (
304
+ <div className="p-6">
305
+ <CheckoutFlow
306
+ items={singleItem}
307
+ shippingMethods={[
308
+ {
309
+ id: 'digital',
310
+ name: 'Digital Delivery',
311
+ description: 'Instant access after payment',
312
+ price: 0,
313
+ estimatedDays: 'Immediate',
314
+ },
315
+ ]}
316
+ paymentMethods={defaultPaymentMethods}
317
+ onSubmitOrder={async (data) => {
318
+ console.log('Order submitted:', data)
319
+ }}
320
+ />
321
+ </div>
322
+ )
323
+ },
324
+ }
325
+
326
+ export const Interactive: Story = {
327
+ render: () => {
328
+ const [orderSubmitted, setOrderSubmitted] = React.useState(false)
329
+ const [submittedData, setSubmittedData] = React.useState<any>(null)
330
+
331
+ const handleSubmitOrder = async (data: {
332
+ address: CheckoutAddress
333
+ shippingMethod: string
334
+ paymentMethod: string
335
+ saveInfo: boolean
336
+ }) => {
337
+ await new Promise((resolve) => setTimeout(resolve, 2000))
338
+ setSubmittedData(data)
339
+ setOrderSubmitted(true)
340
+ }
341
+
342
+ if (orderSubmitted) {
343
+ return (
344
+ <div className="p-6 max-w-xl mx-auto">
345
+ <div className="text-center py-12">
346
+ <div className="h-16 w-16 rounded-full bg-green-500/10 mx-auto flex items-center justify-center mb-4">
347
+ <svg className="h-8 w-8 text-green-500" fill="none" stroke="currentColor" viewBox="0 0 24 24">
348
+ <path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M5 13l4 4L19 7" />
349
+ </svg>
350
+ </div>
351
+ <h2 className="text-2xl font-bold">Order Confirmed!</h2>
352
+ <p className="text-muted-foreground mt-2">Thank you for your purchase.</p>
353
+ <p className="text-sm mt-4">
354
+ Shipping to: {submittedData?.address?.firstName} {submittedData?.address?.lastName}
355
+ </p>
356
+ <button
357
+ onClick={() => setOrderSubmitted(false)}
358
+ className="mt-6 px-4 py-2 bg-primary text-primary-foreground rounded-lg"
359
+ >
360
+ Place Another Order
361
+ </button>
362
+ </div>
363
+ </div>
364
+ )
365
+ }
366
+
367
+ return (
368
+ <div className="p-6">
369
+ <CheckoutFlow
370
+ items={defaultCartItems}
371
+ shippingMethods={defaultShippingMethods}
372
+ paymentMethods={defaultPaymentMethods}
373
+ onSubmitOrder={handleSubmitOrder}
374
+ />
375
+ </div>
376
+ )
377
+ },
378
+ }
379
+
380
+ export const EcommerceCheckout: Story = {
381
+ render: () => (
382
+ <div className="min-h-screen bg-muted/30">
383
+ <header className="bg-background border-b px-6 py-4">
384
+ <div className="flex items-center justify-between max-w-6xl mx-auto">
385
+ <div>
386
+ <h1 className="font-bold text-xl">ShopName</h1>
387
+ </div>
388
+ <nav className="flex gap-4 text-sm">
389
+ <a href="#" className="text-muted-foreground hover:text-foreground">Continue Shopping</a>
390
+ <a href="#" className="text-foreground font-medium">Checkout</a>
391
+ </nav>
392
+ </div>
393
+ </header>
394
+ <main className="p-6">
395
+ <CheckoutFlow
396
+ items={defaultCartItems}
397
+ shippingMethods={defaultShippingMethods}
398
+ paymentMethods={defaultPaymentMethods}
399
+ onSubmitOrder={async (data) => {
400
+ console.log('Order submitted:', data)
401
+ await new Promise((resolve) => setTimeout(resolve, 1500))
402
+ alert('Order placed successfully!')
403
+ }}
404
+ />
405
+ </main>
406
+ </div>
407
+ ),
408
+ }