@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,520 @@
1
+ import type { Meta, StoryObj } from '@storybook/react'
2
+ import { WakaSettings, defaultSettingsTabs } from './index'
3
+ import type { SettingsTabConfig, SettingsSectionConfig } from './index'
4
+ import * as React from 'react'
5
+ import {
6
+ User,
7
+ Bell,
8
+ Shield,
9
+ Palette,
10
+ Globe,
11
+ CreditCard,
12
+ Database,
13
+ Lock,
14
+ Mail,
15
+ Smartphone,
16
+ } from 'lucide-react'
17
+
18
+ const meta: Meta<typeof WakaSettings> = {
19
+ title: 'Blocks/Settings',
20
+ component: WakaSettings,
21
+ parameters: {
22
+ layout: 'fullscreen',
23
+ docs: {
24
+ description: {
25
+ component:
26
+ 'A settings page component with tabs, sections, and various field types (text, email, password, textarea, switch, select). Supports save actions and account deletion.',
27
+ },
28
+ },
29
+ },
30
+ tags: ['autodocs'],
31
+ argTypes: {
32
+ useTabs: {
33
+ control: 'boolean',
34
+ description: 'Use tabs for navigation',
35
+ },
36
+ showSaveButton: {
37
+ control: 'boolean',
38
+ description: 'Show save button',
39
+ },
40
+ showDeleteAccount: {
41
+ control: 'boolean',
42
+ description: 'Show delete account section',
43
+ },
44
+ },
45
+ }
46
+
47
+ export default meta
48
+ type Story = StoryObj<typeof WakaSettings>
49
+
50
+ export const Default: Story = {
51
+ render: () => (
52
+ <div className="p-6 max-w-4xl mx-auto">
53
+ <WakaSettings
54
+ tabs={defaultSettingsTabs}
55
+ values={{
56
+ name: 'Jean Dupont',
57
+ email: 'jean.dupont@example.com',
58
+ bio: 'Développeur passionné.',
59
+ 'notif-marketing': false,
60
+ 'notif-security': true,
61
+ 'notif-updates': true,
62
+ theme: 'system',
63
+ language: 'fr',
64
+ }}
65
+ onSave={(values) => {
66
+ console.log('Save:', values)
67
+ return new Promise((resolve) => setTimeout(resolve, 1000))
68
+ }}
69
+ />
70
+ </div>
71
+ ),
72
+ }
73
+
74
+ export const WithDeleteAccount: Story = {
75
+ render: () => (
76
+ <div className="p-6 max-w-4xl mx-auto">
77
+ <WakaSettings
78
+ tabs={defaultSettingsTabs}
79
+ values={{
80
+ name: 'Jean Dupont',
81
+ email: 'jean.dupont@example.com',
82
+ }}
83
+ showDeleteAccount
84
+ onSave={(values) => {
85
+ console.log('Save:', values)
86
+ return new Promise((resolve) => setTimeout(resolve, 1000))
87
+ }}
88
+ onDeleteAccount={() => {
89
+ console.log('Delete account')
90
+ alert('Account deleted!')
91
+ }}
92
+ />
93
+ </div>
94
+ ),
95
+ }
96
+
97
+ export const WithoutTabs: Story = {
98
+ render: () => {
99
+ const sections: SettingsSectionConfig[] = [
100
+ {
101
+ id: 'profile',
102
+ title: 'Profile Information',
103
+ description: 'Update your personal information.',
104
+ icon: <User className="h-5 w-5" />,
105
+ fields: [
106
+ {
107
+ id: 'name',
108
+ label: 'Full Name',
109
+ type: 'text',
110
+ placeholder: 'John Doe',
111
+ required: true,
112
+ },
113
+ {
114
+ id: 'email',
115
+ label: 'Email',
116
+ type: 'email',
117
+ placeholder: 'john@example.com',
118
+ required: true,
119
+ },
120
+ {
121
+ id: 'bio',
122
+ label: 'Bio',
123
+ type: 'textarea',
124
+ placeholder: 'Tell us about yourself...',
125
+ },
126
+ ],
127
+ },
128
+ {
129
+ id: 'notifications',
130
+ title: 'Notifications',
131
+ description: 'Manage your notification preferences.',
132
+ icon: <Bell className="h-5 w-5" />,
133
+ fields: [
134
+ {
135
+ id: 'email-notifs',
136
+ label: 'Email Notifications',
137
+ description: 'Receive notifications via email.',
138
+ type: 'switch',
139
+ },
140
+ {
141
+ id: 'push-notifs',
142
+ label: 'Push Notifications',
143
+ description: 'Receive push notifications.',
144
+ type: 'switch',
145
+ },
146
+ ],
147
+ },
148
+ ]
149
+
150
+ return (
151
+ <div className="p-6 max-w-4xl mx-auto">
152
+ <WakaSettings
153
+ useTabs={false}
154
+ sections={sections}
155
+ values={{
156
+ name: 'John Doe',
157
+ email: 'john@example.com',
158
+ 'email-notifs': true,
159
+ 'push-notifs': false,
160
+ }}
161
+ onSave={(values) => console.log('Save:', values)}
162
+ />
163
+ </div>
164
+ )
165
+ },
166
+ }
167
+
168
+ export const CustomTabs: Story = {
169
+ render: () => {
170
+ const customTabs: SettingsTabConfig[] = [
171
+ {
172
+ id: 'account',
173
+ label: 'Account',
174
+ icon: <User className="h-4 w-4" />,
175
+ sections: [
176
+ {
177
+ id: 'personal',
178
+ title: 'Personal Information',
179
+ icon: <User className="h-5 w-5" />,
180
+ fields: [
181
+ { id: 'firstName', label: 'First Name', type: 'text', placeholder: 'John' },
182
+ { id: 'lastName', label: 'Last Name', type: 'text', placeholder: 'Doe' },
183
+ { id: 'email', label: 'Email', type: 'email', placeholder: 'john@example.com', required: true },
184
+ { id: 'phone', label: 'Phone', type: 'text', placeholder: '+1 234 567 8900' },
185
+ ],
186
+ },
187
+ ],
188
+ },
189
+ {
190
+ id: 'billing',
191
+ label: 'Billing',
192
+ icon: <CreditCard className="h-4 w-4" />,
193
+ sections: [
194
+ {
195
+ id: 'payment',
196
+ title: 'Payment Method',
197
+ icon: <CreditCard className="h-5 w-5" />,
198
+ fields: [
199
+ {
200
+ id: 'plan',
201
+ label: 'Current Plan',
202
+ type: 'select',
203
+ options: [
204
+ { value: 'free', label: 'Free' },
205
+ { value: 'pro', label: 'Pro - $29/month' },
206
+ { value: 'enterprise', label: 'Enterprise - Custom' },
207
+ ],
208
+ },
209
+ {
210
+ id: 'billing-email',
211
+ label: 'Billing Email',
212
+ type: 'email',
213
+ placeholder: 'billing@example.com',
214
+ },
215
+ ],
216
+ },
217
+ ],
218
+ },
219
+ {
220
+ id: 'integrations',
221
+ label: 'Integrations',
222
+ icon: <Database className="h-4 w-4" />,
223
+ sections: [
224
+ {
225
+ id: 'apis',
226
+ title: 'API Access',
227
+ icon: <Database className="h-5 w-5" />,
228
+ fields: [
229
+ {
230
+ id: 'api-enabled',
231
+ label: 'Enable API Access',
232
+ description: 'Allow API access to your account.',
233
+ type: 'switch',
234
+ },
235
+ {
236
+ id: 'webhook-url',
237
+ label: 'Webhook URL',
238
+ type: 'text',
239
+ placeholder: 'https://your-server.com/webhook',
240
+ },
241
+ ],
242
+ },
243
+ ],
244
+ },
245
+ ]
246
+
247
+ return (
248
+ <div className="p-6 max-w-4xl mx-auto">
249
+ <WakaSettings
250
+ title="Account Settings"
251
+ description="Manage your account settings and preferences."
252
+ tabs={customTabs}
253
+ values={{
254
+ firstName: 'John',
255
+ lastName: 'Doe',
256
+ email: 'john@example.com',
257
+ plan: 'pro',
258
+ 'api-enabled': true,
259
+ }}
260
+ onSave={(values) => console.log('Save:', values)}
261
+ />
262
+ </div>
263
+ )
264
+ },
265
+ }
266
+
267
+ export const SecuritySettings: Story = {
268
+ render: () => {
269
+ const securityTabs: SettingsTabConfig[] = [
270
+ {
271
+ id: 'password',
272
+ label: 'Password',
273
+ icon: <Lock className="h-4 w-4" />,
274
+ sections: [
275
+ {
276
+ id: 'change-password',
277
+ title: 'Change Password',
278
+ description: 'Update your password regularly for better security.',
279
+ icon: <Lock className="h-5 w-5" />,
280
+ fields: [
281
+ { id: 'current-password', label: 'Current Password', type: 'password', placeholder: '••••••••' },
282
+ { id: 'new-password', label: 'New Password', type: 'password', placeholder: '••••••••' },
283
+ { id: 'confirm-password', label: 'Confirm Password', type: 'password', placeholder: '••••••••' },
284
+ ],
285
+ },
286
+ ],
287
+ },
288
+ {
289
+ id: '2fa',
290
+ label: 'Two-Factor Auth',
291
+ icon: <Smartphone className="h-4 w-4" />,
292
+ sections: [
293
+ {
294
+ id: 'two-factor',
295
+ title: 'Two-Factor Authentication',
296
+ description: 'Add an extra layer of security to your account.',
297
+ icon: <Smartphone className="h-5 w-5" />,
298
+ fields: [
299
+ {
300
+ id: '2fa-enabled',
301
+ label: 'Enable 2FA',
302
+ description: 'Use an authenticator app for additional security.',
303
+ type: 'switch',
304
+ },
305
+ {
306
+ id: '2fa-method',
307
+ label: 'Authentication Method',
308
+ type: 'select',
309
+ options: [
310
+ { value: 'app', label: 'Authenticator App' },
311
+ { value: 'sms', label: 'SMS' },
312
+ { value: 'email', label: 'Email' },
313
+ ],
314
+ },
315
+ ],
316
+ },
317
+ ],
318
+ },
319
+ {
320
+ id: 'sessions',
321
+ label: 'Sessions',
322
+ icon: <Globe className="h-4 w-4" />,
323
+ sections: [
324
+ {
325
+ id: 'active-sessions',
326
+ title: 'Active Sessions',
327
+ description: 'Manage your active sessions.',
328
+ icon: <Globe className="h-5 w-5" />,
329
+ fields: [
330
+ {
331
+ id: 'logout-all',
332
+ label: 'Log out all other sessions',
333
+ description: 'This will log you out from all devices except this one.',
334
+ type: 'switch',
335
+ },
336
+ ],
337
+ },
338
+ ],
339
+ },
340
+ ]
341
+
342
+ return (
343
+ <div className="p-6 max-w-4xl mx-auto">
344
+ <WakaSettings
345
+ title="Security Settings"
346
+ description="Manage your security preferences and protect your account."
347
+ tabs={securityTabs}
348
+ values={{
349
+ '2fa-enabled': true,
350
+ '2fa-method': 'app',
351
+ }}
352
+ showDeleteAccount
353
+ onSave={(values) => console.log('Save:', values)}
354
+ onDeleteAccount={() => alert('Account deletion requested')}
355
+ />
356
+ </div>
357
+ )
358
+ },
359
+ }
360
+
361
+ export const Interactive: Story = {
362
+ render: () => {
363
+ const [values, setValues] = React.useState({
364
+ name: 'Jean Dupont',
365
+ email: 'jean.dupont@example.com',
366
+ bio: 'Développeur passionné.',
367
+ 'notif-marketing': false,
368
+ 'notif-security': true,
369
+ 'notif-updates': true,
370
+ theme: 'system',
371
+ language: 'fr',
372
+ })
373
+ const [saving, setSaving] = React.useState(false)
374
+
375
+ const handleSave = async (newValues: Record<string, string | boolean>) => {
376
+ setSaving(true)
377
+ await new Promise((resolve) => setTimeout(resolve, 1500))
378
+ setValues(newValues as typeof values)
379
+ setSaving(false)
380
+ alert('Settings saved!')
381
+ }
382
+
383
+ return (
384
+ <div className="p-6 max-w-4xl mx-auto">
385
+ <WakaSettings
386
+ tabs={defaultSettingsTabs}
387
+ values={values}
388
+ saving={saving}
389
+ onChange={(field, value) => console.log('Change:', field, value)}
390
+ onSave={handleSave}
391
+ />
392
+ </div>
393
+ )
394
+ },
395
+ }
396
+
397
+ export const NoSaveButton: Story = {
398
+ render: () => (
399
+ <div className="p-6 max-w-4xl mx-auto">
400
+ <WakaSettings
401
+ tabs={defaultSettingsTabs}
402
+ values={{
403
+ name: 'Jean Dupont',
404
+ email: 'jean.dupont@example.com',
405
+ }}
406
+ showSaveButton={false}
407
+ onChange={(field, value) => {
408
+ console.log('Auto-save:', field, value)
409
+ }}
410
+ />
411
+ </div>
412
+ ),
413
+ }
414
+
415
+ export const ReadOnly: Story = {
416
+ render: () => {
417
+ const readOnlySections: SettingsSectionConfig[] = [
418
+ {
419
+ id: 'account',
420
+ title: 'Account Information',
421
+ icon: <User className="h-5 w-5" />,
422
+ fields: [
423
+ { id: 'name', label: 'Name', type: 'text', value: 'Jean Dupont', disabled: true },
424
+ { id: 'email', label: 'Email', type: 'email', value: 'jean.dupont@example.com', disabled: true },
425
+ { id: 'plan', label: 'Plan', type: 'text', value: 'Pro', disabled: true },
426
+ { id: 'joined', label: 'Member Since', type: 'text', value: 'January 2023', disabled: true },
427
+ ],
428
+ },
429
+ ]
430
+
431
+ return (
432
+ <div className="p-6 max-w-4xl mx-auto">
433
+ <WakaSettings
434
+ title="Account Information"
435
+ description="Your account details (read-only)."
436
+ useTabs={false}
437
+ sections={readOnlySections}
438
+ showSaveButton={false}
439
+ />
440
+ </div>
441
+ )
442
+ },
443
+ }
444
+
445
+ export const SingleSection: Story = {
446
+ render: () => {
447
+ const profileSection: SettingsSectionConfig = {
448
+ id: 'profile',
449
+ title: 'Profile Settings',
450
+ description: 'Update your public profile information.',
451
+ icon: <User className="h-5 w-5" />,
452
+ fields: [
453
+ { id: 'displayName', label: 'Display Name', type: 'text', placeholder: 'Your public name', required: true },
454
+ { id: 'username', label: 'Username', type: 'text', placeholder: '@username' },
455
+ { id: 'website', label: 'Website', type: 'text', placeholder: 'https://yoursite.com' },
456
+ { id: 'bio', label: 'Bio', type: 'textarea', placeholder: 'Tell the world about yourself...' },
457
+ {
458
+ id: 'visibility',
459
+ label: 'Profile Visibility',
460
+ type: 'select',
461
+ options: [
462
+ { value: 'public', label: 'Public' },
463
+ { value: 'private', label: 'Private' },
464
+ { value: 'friends', label: 'Friends Only' },
465
+ ],
466
+ },
467
+ ],
468
+ }
469
+
470
+ return (
471
+ <div className="p-6 max-w-2xl mx-auto">
472
+ <WakaSettings
473
+ title="Profile Settings"
474
+ useTabs={false}
475
+ sections={[profileSection]}
476
+ values={{
477
+ displayName: 'Jean Dupont',
478
+ username: '@jeandupont',
479
+ visibility: 'public',
480
+ }}
481
+ onSave={(values) => console.log('Save:', values)}
482
+ />
483
+ </div>
484
+ )
485
+ },
486
+ }
487
+
488
+ export const InPageContext: Story = {
489
+ render: () => (
490
+ <div className="min-h-screen bg-muted/30">
491
+ <header className="bg-background border-b px-6 py-4">
492
+ <div className="max-w-4xl mx-auto flex items-center justify-between">
493
+ <span className="font-bold text-xl">MyApp</span>
494
+ <nav className="flex gap-4 text-sm">
495
+ <a href="#" className="text-muted-foreground hover:text-foreground">Dashboard</a>
496
+ <a href="#" className="text-foreground font-medium">Settings</a>
497
+ <a href="#" className="text-muted-foreground hover:text-foreground">Help</a>
498
+ </nav>
499
+ </div>
500
+ </header>
501
+ <main className="p-6 max-w-4xl mx-auto">
502
+ <WakaSettings
503
+ tabs={defaultSettingsTabs}
504
+ values={{
505
+ name: 'Jean Dupont',
506
+ email: 'jean.dupont@example.com',
507
+ theme: 'system',
508
+ language: 'fr',
509
+ }}
510
+ showDeleteAccount
511
+ onSave={(values) => {
512
+ console.log('Save:', values)
513
+ return new Promise((resolve) => setTimeout(resolve, 1000))
514
+ }}
515
+ onDeleteAccount={() => console.log('Delete account')}
516
+ />
517
+ </main>
518
+ </div>
519
+ ),
520
+ }