@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,371 @@
1
+ import type { Meta, StoryObj } from '@storybook/react'
2
+ import { WakaProfile, defaultProfileData } from './index'
3
+ import type { ProfileData, ProfileSection } from './index'
4
+ import * as React from 'react'
5
+ import { User, Briefcase, Shield, CreditCard } from 'lucide-react'
6
+
7
+ const meta: Meta<typeof WakaProfile> = {
8
+ title: 'Blocks/Profile',
9
+ component: WakaProfile,
10
+ parameters: {
11
+ layout: 'centered',
12
+ docs: {
13
+ description: {
14
+ component:
15
+ 'A user profile component with avatar, personal information, social links, stats, and editable fields. Supports card, page, and compact layouts.',
16
+ },
17
+ },
18
+ },
19
+ tags: ['autodocs'],
20
+ argTypes: {
21
+ layout: {
22
+ control: 'select',
23
+ options: ['card', 'page', 'compact'],
24
+ },
25
+ editable: {
26
+ control: 'boolean',
27
+ },
28
+ showSocialLinks: {
29
+ control: 'boolean',
30
+ },
31
+ showStats: {
32
+ control: 'boolean',
33
+ },
34
+ useTabs: {
35
+ control: 'boolean',
36
+ },
37
+ },
38
+ }
39
+
40
+ export default meta
41
+ type Story = StoryObj<typeof WakaProfile>
42
+
43
+ export const Default: Story = {
44
+ render: () => (
45
+ <div className="w-[600px]">
46
+ <WakaProfile profile={defaultProfileData} />
47
+ </div>
48
+ ),
49
+ }
50
+
51
+ export const Editable: Story = {
52
+ render: () => (
53
+ <div className="w-[600px]">
54
+ <WakaProfile
55
+ profile={defaultProfileData}
56
+ editable
57
+ onSave={(profile) => {
58
+ console.log('Save:', profile)
59
+ return new Promise((resolve) => setTimeout(resolve, 1000))
60
+ }}
61
+ onAvatarChange={(file) => console.log('Avatar changed:', file.name)}
62
+ />
63
+ </div>
64
+ ),
65
+ }
66
+
67
+ export const WithStats: Story = {
68
+ render: () => (
69
+ <div className="w-[600px]">
70
+ <WakaProfile
71
+ profile={defaultProfileData}
72
+ showStats
73
+ stats={[
74
+ { label: 'Projets', value: 42 },
75
+ { label: 'Abonnés', value: '1.2K' },
76
+ { label: 'Contributions', value: 856 },
77
+ ]}
78
+ />
79
+ </div>
80
+ ),
81
+ }
82
+
83
+ export const PageLayout: Story = {
84
+ render: () => (
85
+ <div className="w-[800px] p-6">
86
+ <WakaProfile
87
+ profile={defaultProfileData}
88
+ layout="page"
89
+ editable
90
+ showStats
91
+ stats={[
92
+ { label: 'Projects', value: 42 },
93
+ { label: 'Followers', value: '1.2K' },
94
+ { label: 'Following', value: 256 },
95
+ ]}
96
+ onSave={(profile) => {
97
+ console.log('Save:', profile)
98
+ return new Promise((resolve) => setTimeout(resolve, 1000))
99
+ }}
100
+ />
101
+ </div>
102
+ ),
103
+ }
104
+
105
+ export const PageLayoutWithTabs: Story = {
106
+ render: () => (
107
+ <div className="w-[800px] p-6">
108
+ <WakaProfile
109
+ profile={defaultProfileData}
110
+ layout="page"
111
+ useTabs
112
+ editable
113
+ onSave={(profile) => console.log('Save:', profile)}
114
+ />
115
+ </div>
116
+ ),
117
+ }
118
+
119
+ export const CompactLayout: Story = {
120
+ render: () => (
121
+ <div className="w-[400px] p-4 border rounded-lg">
122
+ <WakaProfile profile={defaultProfileData} layout="compact" />
123
+ </div>
124
+ ),
125
+ }
126
+
127
+ export const NoSocialLinks: Story = {
128
+ render: () => (
129
+ <div className="w-[600px]">
130
+ <WakaProfile
131
+ profile={{
132
+ ...defaultProfileData,
133
+ socialLinks: [],
134
+ }}
135
+ showSocialLinks={false}
136
+ />
137
+ </div>
138
+ ),
139
+ }
140
+
141
+ export const MinimalProfile: Story = {
142
+ render: () => {
143
+ const minimalProfile: ProfileData = {
144
+ displayName: 'John Doe',
145
+ email: 'john.doe@example.com',
146
+ }
147
+
148
+ return (
149
+ <div className="w-[600px]">
150
+ <WakaProfile profile={minimalProfile} />
151
+ </div>
152
+ )
153
+ },
154
+ }
155
+
156
+ export const FullProfile: Story = {
157
+ render: () => {
158
+ const fullProfile: ProfileData = {
159
+ displayName: 'Marie Martin',
160
+ firstName: 'Marie',
161
+ lastName: 'Martin',
162
+ email: 'marie.martin@example.com',
163
+ phone: '+33 6 98 76 54 32',
164
+ bio: 'Designer UX/UI passionnée avec plus de 8 ans d\'expérience. J\'aime créer des expériences numériques intuitives et élégantes.',
165
+ avatarUrl: 'https://api.dicebear.com/7.x/avataaars/svg?seed=Marie',
166
+ role: 'Senior UX Designer',
167
+ department: 'Design',
168
+ company: 'Creative Studio',
169
+ location: 'Lyon, France',
170
+ website: 'https://mariemartin.design',
171
+ joinedAt: new Date('2021-06-15'),
172
+ socialLinks: [
173
+ { id: '1', type: 'twitter', url: 'https://twitter.com/mariemartin', label: '@mariemartin' },
174
+ { id: '2', type: 'github', url: 'https://github.com/mariemartin', label: 'mariemartin' },
175
+ { id: '3', type: 'linkedin', url: 'https://linkedin.com/in/mariemartin', label: 'Marie Martin' },
176
+ { id: '4', type: 'website', url: 'https://mariemartin.design', label: 'Portfolio' },
177
+ ],
178
+ }
179
+
180
+ return (
181
+ <div className="w-[600px]">
182
+ <WakaProfile
183
+ profile={fullProfile}
184
+ showStats
185
+ stats={[
186
+ { label: 'Designs', value: 156 },
187
+ { label: 'Clients', value: 48 },
188
+ { label: 'Awards', value: 12 },
189
+ ]}
190
+ editable
191
+ onSave={(profile) => console.log('Save:', profile)}
192
+ />
193
+ </div>
194
+ )
195
+ },
196
+ }
197
+
198
+ export const CustomSections: Story = {
199
+ render: () => {
200
+ const customSections: ProfileSection[] = [
201
+ {
202
+ id: 'personal',
203
+ title: 'Personal Information',
204
+ icon: <User className="h-5 w-5" />,
205
+ fields: [
206
+ { id: 'displayName', label: 'Display Name', value: defaultProfileData.displayName, type: 'text', required: true },
207
+ { id: 'email', label: 'Email', value: defaultProfileData.email, type: 'email', required: true },
208
+ { id: 'phone', label: 'Phone', value: defaultProfileData.phone || '', type: 'tel' },
209
+ ],
210
+ },
211
+ {
212
+ id: 'security',
213
+ title: 'Security',
214
+ icon: <Shield className="h-5 w-5" />,
215
+ fields: [
216
+ { id: 'twoFactor', label: 'Two-Factor Authentication', value: 'Enabled', type: 'text', disabled: true },
217
+ { id: 'lastLogin', label: 'Last Login', value: 'Today at 10:30 AM', type: 'text', disabled: true },
218
+ ],
219
+ },
220
+ {
221
+ id: 'billing',
222
+ title: 'Billing',
223
+ icon: <CreditCard className="h-5 w-5" />,
224
+ fields: [
225
+ { id: 'plan', label: 'Current Plan', value: 'Pro', type: 'text', disabled: true },
226
+ { id: 'billingEmail', label: 'Billing Email', value: defaultProfileData.email, type: 'email' },
227
+ ],
228
+ },
229
+ ]
230
+
231
+ return (
232
+ <div className="w-[600px]">
233
+ <WakaProfile
234
+ profile={defaultProfileData}
235
+ customSections={customSections}
236
+ editable
237
+ onSave={(profile) => console.log('Save:', profile)}
238
+ />
239
+ </div>
240
+ )
241
+ },
242
+ }
243
+
244
+ export const Interactive: Story = {
245
+ render: () => {
246
+ const [profile, setProfile] = React.useState(defaultProfileData)
247
+ const [isEditing, setIsEditing] = React.useState(false)
248
+ const [saving, setSaving] = React.useState(false)
249
+
250
+ const handleSave = async (updatedProfile: ProfileData) => {
251
+ setSaving(true)
252
+ await new Promise((resolve) => setTimeout(resolve, 1500))
253
+ setProfile(updatedProfile)
254
+ setSaving(false)
255
+ alert('Profile saved!')
256
+ }
257
+
258
+ return (
259
+ <div className="w-[600px]">
260
+ <WakaProfile
261
+ profile={profile}
262
+ editable
263
+ isEditing={isEditing}
264
+ onEditToggle={setIsEditing}
265
+ saving={saving}
266
+ onSave={handleSave}
267
+ onChange={(field, value) => console.log('Change:', field, value)}
268
+ onAvatarChange={(file) => {
269
+ console.log('Avatar:', file.name)
270
+ // In real app, would upload and set new URL
271
+ }}
272
+ />
273
+ </div>
274
+ )
275
+ },
276
+ }
277
+
278
+ export const ReadOnly: Story = {
279
+ render: () => (
280
+ <div className="w-[600px]">
281
+ <WakaProfile
282
+ profile={defaultProfileData}
283
+ editable={false}
284
+ showStats
285
+ stats={[
286
+ { label: 'Projects', value: 42 },
287
+ { label: 'Followers', value: '1.2K' },
288
+ ]}
289
+ />
290
+ </div>
291
+ ),
292
+ }
293
+
294
+ export const WithAvatar: Story = {
295
+ render: () => {
296
+ const profileWithAvatar: ProfileData = {
297
+ ...defaultProfileData,
298
+ avatarUrl: 'https://api.dicebear.com/7.x/avataaars/svg?seed=Jean',
299
+ }
300
+
301
+ return (
302
+ <div className="w-[600px]">
303
+ <WakaProfile
304
+ profile={profileWithAvatar}
305
+ editable
306
+ onAvatarChange={(file) => alert(`Uploading: ${file.name}`)}
307
+ onSave={(profile) => console.log('Save:', profile)}
308
+ />
309
+ </div>
310
+ )
311
+ },
312
+ }
313
+
314
+ export const InPageContext: Story = {
315
+ render: () => (
316
+ <div className="min-h-screen bg-muted/30">
317
+ <header className="bg-background border-b px-6 py-4">
318
+ <div className="max-w-4xl mx-auto flex items-center justify-between">
319
+ <span className="font-bold text-xl">MyApp</span>
320
+ <nav className="flex gap-4 text-sm">
321
+ <a href="#" className="text-muted-foreground hover:text-foreground">Dashboard</a>
322
+ <a href="#" className="text-foreground font-medium">Profile</a>
323
+ <a href="#" className="text-muted-foreground hover:text-foreground">Settings</a>
324
+ </nav>
325
+ </div>
326
+ </header>
327
+ <main className="p-6 max-w-4xl mx-auto">
328
+ <WakaProfile
329
+ profile={{
330
+ ...defaultProfileData,
331
+ avatarUrl: 'https://api.dicebear.com/7.x/avataaars/svg?seed=Jean',
332
+ }}
333
+ layout="page"
334
+ editable
335
+ showStats
336
+ stats={[
337
+ { label: 'Projects', value: 42 },
338
+ { label: 'Followers', value: '1.2K' },
339
+ { label: 'Following', value: 256 },
340
+ ]}
341
+ onSave={(profile) => {
342
+ console.log('Save:', profile)
343
+ return new Promise((resolve) => setTimeout(resolve, 1000))
344
+ }}
345
+ />
346
+ </main>
347
+ </div>
348
+ ),
349
+ }
350
+
351
+ export const CompactInList: Story = {
352
+ render: () => {
353
+ const users: ProfileData[] = [
354
+ { displayName: 'Alice Johnson', email: 'alice@example.com', role: 'Developer', avatarUrl: 'https://api.dicebear.com/7.x/avataaars/svg?seed=Alice' },
355
+ { displayName: 'Bob Smith', email: 'bob@example.com', role: 'Designer', avatarUrl: 'https://api.dicebear.com/7.x/avataaars/svg?seed=Bob' },
356
+ { displayName: 'Carol Williams', email: 'carol@example.com', role: 'PM', avatarUrl: 'https://api.dicebear.com/7.x/avataaars/svg?seed=Carol' },
357
+ { displayName: 'David Brown', email: 'david@example.com', role: 'Engineer', avatarUrl: 'https://api.dicebear.com/7.x/avataaars/svg?seed=David' },
358
+ ]
359
+
360
+ return (
361
+ <div className="w-[400px] border rounded-lg divide-y">
362
+ <div className="px-4 py-3 font-semibold">Team Members</div>
363
+ {users.map((user, index) => (
364
+ <div key={index} className="px-4 py-3 hover:bg-muted/50 cursor-pointer">
365
+ <WakaProfile profile={user} layout="compact" />
366
+ </div>
367
+ ))}
368
+ </div>
369
+ )
370
+ },
371
+ }