@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,455 @@
1
+ import type { Meta, StoryObj } from '@storybook/react'
2
+ import { WakaHeader } from './index'
3
+ import type { HeaderAction, HeaderFilter, HeaderNotification, HeaderUserMenu } from './index'
4
+ import * as React from 'react'
5
+ import { Plus, Download, Upload, Filter, Settings, User, LogOut, CreditCard, HelpCircle, FileText, Calendar, Folder, LayoutGrid } from 'lucide-react'
6
+
7
+ const defaultNotifications: HeaderNotification[] = [
8
+ {
9
+ id: '1',
10
+ title: 'Nouvelle commande reçue',
11
+ description: 'Commande #1234 de Jean Dupont',
12
+ time: 'Il y a 5 minutes',
13
+ read: false,
14
+ onClick: () => console.log('Click notification 1'),
15
+ },
16
+ {
17
+ id: '2',
18
+ title: 'Paiement confirmé',
19
+ description: 'Le paiement de 250€ a été validé',
20
+ time: 'Il y a 1 heure',
21
+ read: false,
22
+ onClick: () => console.log('Click notification 2'),
23
+ },
24
+ {
25
+ id: '3',
26
+ title: 'Nouveau message',
27
+ description: 'Marie vous a envoyé un message',
28
+ time: 'Il y a 2 heures',
29
+ read: true,
30
+ onClick: () => console.log('Click notification 3'),
31
+ },
32
+ {
33
+ id: '4',
34
+ title: 'Rapport généré',
35
+ description: 'Le rapport mensuel est prêt',
36
+ time: 'Hier',
37
+ read: true,
38
+ onClick: () => console.log('Click notification 4'),
39
+ },
40
+ ]
41
+
42
+ const defaultUserMenu: HeaderUserMenu = {
43
+ name: 'Jean Dupont',
44
+ email: 'jean.dupont@example.com',
45
+ avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=Jean',
46
+ items: [
47
+ { label: 'Mon profil', icon: <User className="h-4 w-4" />, onClick: () => console.log('Profile') },
48
+ { label: 'Paramètres', icon: <Settings className="h-4 w-4" />, onClick: () => console.log('Settings') },
49
+ { label: 'Facturation', icon: <CreditCard className="h-4 w-4" />, onClick: () => console.log('Billing') },
50
+ { separator: true, label: '' },
51
+ { label: 'Aide', icon: <HelpCircle className="h-4 w-4" />, onClick: () => console.log('Help') },
52
+ { separator: true, label: '' },
53
+ { label: 'Déconnexion', icon: <LogOut className="h-4 w-4" />, onClick: () => console.log('Logout') },
54
+ ],
55
+ }
56
+
57
+ const defaultFilters: HeaderFilter[] = [
58
+ {
59
+ id: 'status',
60
+ label: 'Statut',
61
+ icon: <Filter className="h-4 w-4" />,
62
+ options: [
63
+ { value: 'all', label: 'Tous' },
64
+ { value: 'active', label: 'Actif' },
65
+ { value: 'inactive', label: 'Inactif' },
66
+ { value: 'pending', label: 'En attente' },
67
+ ],
68
+ value: 'all',
69
+ onChange: (value) => console.log('Status filter:', value),
70
+ },
71
+ {
72
+ id: 'type',
73
+ label: 'Type',
74
+ options: [
75
+ { value: 'all', label: 'Tous les types' },
76
+ { value: 'document', label: 'Document' },
77
+ { value: 'image', label: 'Image' },
78
+ { value: 'video', label: 'Vidéo' },
79
+ ],
80
+ placeholder: 'Type de fichier',
81
+ onChange: (value) => console.log('Type filter:', value),
82
+ },
83
+ {
84
+ id: 'date',
85
+ label: 'Date',
86
+ icon: <Calendar className="h-4 w-4" />,
87
+ options: [
88
+ { value: 'all', label: 'Toutes les dates' },
89
+ { value: 'today', label: "Aujourd'hui" },
90
+ { value: 'week', label: 'Cette semaine' },
91
+ { value: 'month', label: 'Ce mois' },
92
+ ],
93
+ onChange: (value) => console.log('Date filter:', value),
94
+ },
95
+ ]
96
+
97
+ const meta: Meta<typeof WakaHeader> = {
98
+ title: 'Blocks/Header',
99
+ component: WakaHeader,
100
+ parameters: {
101
+ layout: 'fullscreen',
102
+ docs: {
103
+ description: {
104
+ component:
105
+ 'A header component with search, filters, notifications, user menu, and customizable actions.',
106
+ },
107
+ },
108
+ },
109
+ tags: ['autodocs'],
110
+ argTypes: {
111
+ sticky: {
112
+ control: 'boolean',
113
+ },
114
+ showSearch: {
115
+ control: 'boolean',
116
+ },
117
+ },
118
+ }
119
+
120
+ export default meta
121
+ type Story = StoryObj<typeof WakaHeader>
122
+
123
+ export const Default: Story = {
124
+ render: () => (
125
+ <div className="min-h-[400px] bg-muted/30">
126
+ <WakaHeader
127
+ title="Tableau de bord"
128
+ showSearch
129
+ onSearchChange={(value) => console.log('Search:', value)}
130
+ userMenu={defaultUserMenu}
131
+ notifications={defaultNotifications}
132
+ unreadCount={2}
133
+ />
134
+ <div className="p-6">
135
+ <p className="text-muted-foreground">Page content goes here...</p>
136
+ </div>
137
+ </div>
138
+ ),
139
+ }
140
+
141
+ export const WithPrimaryAction: Story = {
142
+ render: () => (
143
+ <div className="min-h-[400px] bg-muted/30">
144
+ <WakaHeader
145
+ title="Documents"
146
+ primaryAction={{
147
+ id: 'new',
148
+ label: 'Nouveau document',
149
+ icon: <Plus className="h-4 w-4" />,
150
+ onClick: () => console.log('Create new'),
151
+ }}
152
+ showSearch
153
+ userMenu={defaultUserMenu}
154
+ />
155
+ <div className="p-6">
156
+ <p className="text-muted-foreground">Documents list...</p>
157
+ </div>
158
+ </div>
159
+ ),
160
+ }
161
+
162
+ export const WithSecondaryActions: Story = {
163
+ render: () => (
164
+ <div className="min-h-[400px] bg-muted/30">
165
+ <WakaHeader
166
+ title="Fichiers"
167
+ primaryAction={{
168
+ id: 'upload',
169
+ label: 'Upload',
170
+ icon: <Upload className="h-4 w-4" />,
171
+ onClick: () => console.log('Upload'),
172
+ }}
173
+ secondaryActions={[
174
+ {
175
+ id: 'download',
176
+ label: 'Télécharger',
177
+ icon: <Download className="h-4 w-4" />,
178
+ variant: 'outline',
179
+ onClick: () => console.log('Download'),
180
+ },
181
+ {
182
+ id: 'settings',
183
+ label: 'Options',
184
+ icon: <Settings className="h-4 w-4" />,
185
+ variant: 'ghost',
186
+ onClick: () => console.log('Settings'),
187
+ },
188
+ ]}
189
+ showSearch
190
+ userMenu={defaultUserMenu}
191
+ />
192
+ <div className="p-6">
193
+ <p className="text-muted-foreground">Files content...</p>
194
+ </div>
195
+ </div>
196
+ ),
197
+ }
198
+
199
+ export const WithFilters: Story = {
200
+ render: () => (
201
+ <div className="min-h-[400px] bg-muted/30">
202
+ <WakaHeader
203
+ title="Liste des fichiers"
204
+ subtitle="Gérez vos documents"
205
+ primaryAction={{
206
+ id: 'new',
207
+ label: 'Ajouter',
208
+ icon: <Plus className="h-4 w-4" />,
209
+ onClick: () => console.log('Add'),
210
+ }}
211
+ showSearch
212
+ filters={defaultFilters}
213
+ userMenu={defaultUserMenu}
214
+ />
215
+ <div className="p-6">
216
+ <p className="text-muted-foreground">Filtered content...</p>
217
+ </div>
218
+ </div>
219
+ ),
220
+ }
221
+
222
+ export const WithNotifications: Story = {
223
+ render: () => (
224
+ <div className="min-h-[400px] bg-muted/30">
225
+ <WakaHeader
226
+ title="Notifications"
227
+ notifications={defaultNotifications}
228
+ unreadCount={2}
229
+ userMenu={defaultUserMenu}
230
+ />
231
+ <div className="p-6">
232
+ <p className="text-muted-foreground">Click the bell icon to see notifications.</p>
233
+ </div>
234
+ </div>
235
+ ),
236
+ }
237
+
238
+ export const WithSubtitle: Story = {
239
+ render: () => (
240
+ <div className="min-h-[400px] bg-muted/30">
241
+ <WakaHeader
242
+ title="Projet Alpha"
243
+ subtitle="3 tâches en cours • 12 terminées"
244
+ showSearch
245
+ userMenu={defaultUserMenu}
246
+ />
247
+ <div className="p-6">
248
+ <p className="text-muted-foreground">Project content...</p>
249
+ </div>
250
+ </div>
251
+ ),
252
+ }
253
+
254
+ export const NoSearch: Story = {
255
+ render: () => (
256
+ <div className="min-h-[400px] bg-muted/30">
257
+ <WakaHeader
258
+ title="Paramètres"
259
+ showSearch={false}
260
+ userMenu={defaultUserMenu}
261
+ />
262
+ <div className="p-6">
263
+ <p className="text-muted-foreground">Settings content without search...</p>
264
+ </div>
265
+ </div>
266
+ ),
267
+ }
268
+
269
+ export const CustomLeftContent: Story = {
270
+ render: () => (
271
+ <div className="min-h-[400px] bg-muted/30">
272
+ <WakaHeader
273
+ primaryAction={{
274
+ id: 'new',
275
+ label: 'Créer',
276
+ onClick: () => console.log('Create'),
277
+ }}
278
+ leftContent={
279
+ <div className="flex items-center gap-2 ml-2">
280
+ <span className="text-sm font-medium">Filtres:</span>
281
+ <button className="px-2 py-1 text-xs bg-primary text-primary-foreground rounded-full">
282
+ Tous
283
+ </button>
284
+ <button className="px-2 py-1 text-xs bg-muted rounded-full">
285
+ Actifs
286
+ </button>
287
+ <button className="px-2 py-1 text-xs bg-muted rounded-full">
288
+ Archives
289
+ </button>
290
+ </div>
291
+ }
292
+ userMenu={defaultUserMenu}
293
+ />
294
+ <div className="p-6">
295
+ <p className="text-muted-foreground">Custom left content...</p>
296
+ </div>
297
+ </div>
298
+ ),
299
+ }
300
+
301
+ export const CustomRightContent: Story = {
302
+ render: () => (
303
+ <div className="min-h-[400px] bg-muted/30">
304
+ <WakaHeader
305
+ title="Dashboard"
306
+ showSearch
307
+ rightContent={
308
+ <div className="flex items-center gap-1">
309
+ <button className="p-2 rounded hover:bg-muted">
310
+ <LayoutGrid className="h-4 w-4" />
311
+ </button>
312
+ <button className="p-2 rounded hover:bg-muted">
313
+ <Folder className="h-4 w-4" />
314
+ </button>
315
+ </div>
316
+ }
317
+ userMenu={defaultUserMenu}
318
+ />
319
+ <div className="p-6">
320
+ <p className="text-muted-foreground">Custom view toggles...</p>
321
+ </div>
322
+ </div>
323
+ ),
324
+ }
325
+
326
+ export const NonSticky: Story = {
327
+ render: () => (
328
+ <div className="min-h-[800px] bg-muted/30">
329
+ <WakaHeader
330
+ title="Non-Sticky Header"
331
+ subtitle="Scroll down to see the difference"
332
+ sticky={false}
333
+ showSearch
334
+ userMenu={defaultUserMenu}
335
+ />
336
+ <div className="p-6 space-y-4">
337
+ {Array.from({ length: 20 }).map((_, i) => (
338
+ <div key={i} className="p-4 bg-card rounded-lg border">
339
+ Content block {i + 1}
340
+ </div>
341
+ ))}
342
+ </div>
343
+ </div>
344
+ ),
345
+ }
346
+
347
+ export const Interactive: Story = {
348
+ render: () => {
349
+ const [searchValue, setSearchValue] = React.useState('')
350
+ const [filters, setFilters] = React.useState<Record<string, string>>({
351
+ status: 'all',
352
+ type: 'all',
353
+ })
354
+
355
+ const interactiveFilters: HeaderFilter[] = [
356
+ {
357
+ id: 'status',
358
+ label: 'Statut',
359
+ options: [
360
+ { value: 'all', label: 'Tous' },
361
+ { value: 'active', label: 'Actif' },
362
+ { value: 'pending', label: 'En attente' },
363
+ ],
364
+ value: filters.status,
365
+ onChange: (value) => setFilters((prev) => ({ ...prev, status: value })),
366
+ },
367
+ {
368
+ id: 'type',
369
+ label: 'Type',
370
+ options: [
371
+ { value: 'all', label: 'Tous' },
372
+ { value: 'doc', label: 'Documents' },
373
+ { value: 'img', label: 'Images' },
374
+ ],
375
+ value: filters.type,
376
+ onChange: (value) => setFilters((prev) => ({ ...prev, type: value })),
377
+ },
378
+ ]
379
+
380
+ return (
381
+ <div className="min-h-[400px] bg-muted/30">
382
+ <WakaHeader
383
+ title="Interactive Demo"
384
+ showSearch
385
+ searchValue={searchValue}
386
+ onSearchChange={setSearchValue}
387
+ onSearchSubmit={(val) => alert(`Searching for: ${val}`)}
388
+ filters={interactiveFilters}
389
+ primaryAction={{
390
+ id: 'create',
391
+ label: 'Create',
392
+ onClick: () => alert('Create clicked'),
393
+ }}
394
+ userMenu={defaultUserMenu}
395
+ />
396
+ <div className="p-6">
397
+ <div className="bg-card p-4 rounded-lg border">
398
+ <h3 className="font-semibold mb-2">Current State:</h3>
399
+ <p className="text-sm text-muted-foreground">Search: "{searchValue}"</p>
400
+ <p className="text-sm text-muted-foreground">Filters: {JSON.stringify(filters)}</p>
401
+ </div>
402
+ </div>
403
+ </div>
404
+ )
405
+ },
406
+ }
407
+
408
+ export const FullFeatured: Story = {
409
+ render: () => (
410
+ <div className="min-h-[500px] bg-muted/30">
411
+ <WakaHeader
412
+ title="Gestion des documents"
413
+ subtitle="128 documents • 4.2 GB utilisés"
414
+ primaryAction={{
415
+ id: 'new',
416
+ label: 'Nouveau',
417
+ icon: <Plus className="h-4 w-4" />,
418
+ onClick: () => console.log('New'),
419
+ }}
420
+ secondaryActions={[
421
+ {
422
+ id: 'import',
423
+ label: 'Importer',
424
+ icon: <Upload className="h-4 w-4" />,
425
+ variant: 'outline',
426
+ onClick: () => console.log('Import'),
427
+ },
428
+ ]}
429
+ showSearch
430
+ searchPlaceholder="Rechercher un document..."
431
+ filters={defaultFilters}
432
+ notifications={defaultNotifications}
433
+ unreadCount={2}
434
+ userMenu={defaultUserMenu}
435
+ />
436
+ <div className="p-6">
437
+ <div className="grid gap-4 md:grid-cols-3">
438
+ {['Documents récents', 'Partagés avec moi', 'Favoris'].map((title) => (
439
+ <div key={title} className="p-4 bg-card rounded-lg border">
440
+ <h3 className="font-semibold mb-2">{title}</h3>
441
+ <div className="space-y-2">
442
+ {[1, 2, 3].map((i) => (
443
+ <div key={i} className="flex items-center gap-2 text-sm">
444
+ <FileText className="h-4 w-4 text-muted-foreground" />
445
+ <span>Document {i}.pdf</span>
446
+ </div>
447
+ ))}
448
+ </div>
449
+ </div>
450
+ ))}
451
+ </div>
452
+ </div>
453
+ </div>
454
+ ),
455
+ }