@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,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
|
+
}
|