@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,467 @@
1
+ import type { Meta, StoryObj } from '@storybook/react'
2
+ import {
3
+ WakaEmptyState,
4
+ NoDataState,
5
+ NoResultsState,
6
+ NoMessagesState,
7
+ NoFilesState,
8
+ EmptyCartState,
9
+ NoNotificationsState,
10
+ ErrorState,
11
+ } from './index'
12
+ import type { EmptyStateType } from './index'
13
+ import * as React from 'react'
14
+ import { Plus, Upload, Search, RefreshCw, Rocket, FileText } from 'lucide-react'
15
+
16
+ const MockLink = ({ href, children, ...props }: any) => (
17
+ <a href={href} {...props} onClick={(e) => e.preventDefault()}>
18
+ {children}
19
+ </a>
20
+ )
21
+
22
+ const meta: Meta<typeof WakaEmptyState> = {
23
+ title: 'Blocks/EmptyStates',
24
+ component: WakaEmptyState,
25
+ parameters: {
26
+ layout: 'centered',
27
+ docs: {
28
+ description: {
29
+ component:
30
+ 'Empty state components for various scenarios: no data, no results, no messages, no files, empty cart, no notifications, and error states.',
31
+ },
32
+ },
33
+ },
34
+ tags: ['autodocs'],
35
+ argTypes: {
36
+ type: {
37
+ control: 'select',
38
+ options: [
39
+ 'no-data',
40
+ 'no-results',
41
+ 'no-messages',
42
+ 'no-files',
43
+ 'no-users',
44
+ 'no-cart',
45
+ 'no-notifications',
46
+ 'no-events',
47
+ 'no-images',
48
+ 'no-bookmarks',
49
+ 'no-favorites',
50
+ 'error',
51
+ 'custom',
52
+ ],
53
+ },
54
+ size: {
55
+ control: 'select',
56
+ options: ['sm', 'md', 'lg'],
57
+ },
58
+ layout: {
59
+ control: 'select',
60
+ options: ['vertical', 'horizontal'],
61
+ },
62
+ showIllustration: {
63
+ control: 'boolean',
64
+ },
65
+ centered: {
66
+ control: 'boolean',
67
+ },
68
+ },
69
+ }
70
+
71
+ export default meta
72
+ type Story = StoryObj<typeof WakaEmptyState>
73
+
74
+ export const Default: Story = {
75
+ render: () => (
76
+ <div className="w-[500px]">
77
+ <WakaEmptyState
78
+ type="no-data"
79
+ actions={[
80
+ {
81
+ label: 'Ajouter',
82
+ icon: <Plus className="h-4 w-4" />,
83
+ onClick: () => console.log('Add'),
84
+ },
85
+ ]}
86
+ />
87
+ </div>
88
+ ),
89
+ }
90
+
91
+ export const NoData: Story = {
92
+ render: () => (
93
+ <div className="w-[500px]">
94
+ <NoDataState
95
+ actions={[
96
+ {
97
+ label: 'Ajouter un élément',
98
+ icon: <Plus className="h-4 w-4" />,
99
+ onClick: () => console.log('Add'),
100
+ },
101
+ ]}
102
+ />
103
+ </div>
104
+ ),
105
+ }
106
+
107
+ export const NoResults: Story = {
108
+ render: () => (
109
+ <div className="w-[500px]">
110
+ <NoResultsState
111
+ description='Aucun résultat pour "recherche exemple"'
112
+ actions={[
113
+ {
114
+ label: 'Effacer la recherche',
115
+ variant: 'outline',
116
+ onClick: () => console.log('Clear'),
117
+ },
118
+ ]}
119
+ />
120
+ </div>
121
+ ),
122
+ }
123
+
124
+ export const NoMessages: Story = {
125
+ render: () => (
126
+ <div className="w-[500px]">
127
+ <NoMessagesState
128
+ actions={[
129
+ {
130
+ label: 'Nouveau message',
131
+ icon: <Plus className="h-4 w-4" />,
132
+ onClick: () => console.log('New message'),
133
+ },
134
+ ]}
135
+ />
136
+ </div>
137
+ ),
138
+ }
139
+
140
+ export const NoFiles: Story = {
141
+ render: () => (
142
+ <div className="w-[500px]">
143
+ <NoFilesState
144
+ actions={[
145
+ {
146
+ label: 'Importer un fichier',
147
+ icon: <Upload className="h-4 w-4" />,
148
+ onClick: () => console.log('Upload'),
149
+ },
150
+ ]}
151
+ />
152
+ </div>
153
+ ),
154
+ }
155
+
156
+ export const EmptyCart: Story = {
157
+ render: () => (
158
+ <div className="w-[500px]">
159
+ <EmptyCartState
160
+ actions={[
161
+ {
162
+ label: 'Parcourir les produits',
163
+ onClick: () => console.log('Browse'),
164
+ },
165
+ ]}
166
+ />
167
+ </div>
168
+ ),
169
+ }
170
+
171
+ export const NoNotifications: Story = {
172
+ render: () => (
173
+ <div className="w-[500px]">
174
+ <NoNotificationsState />
175
+ </div>
176
+ ),
177
+ }
178
+
179
+ export const Error: Story = {
180
+ render: () => (
181
+ <div className="w-[500px]">
182
+ <ErrorState
183
+ actions={[
184
+ {
185
+ label: 'Réessayer',
186
+ icon: <RefreshCw className="h-4 w-4" />,
187
+ onClick: () => console.log('Retry'),
188
+ },
189
+ ]}
190
+ />
191
+ </div>
192
+ ),
193
+ }
194
+
195
+ export const AllTypes: Story = {
196
+ render: () => {
197
+ const types: EmptyStateType[] = [
198
+ 'no-data',
199
+ 'no-results',
200
+ 'no-messages',
201
+ 'no-files',
202
+ 'no-users',
203
+ 'no-cart',
204
+ 'no-notifications',
205
+ 'no-events',
206
+ 'no-images',
207
+ 'no-bookmarks',
208
+ 'no-favorites',
209
+ 'error',
210
+ ]
211
+
212
+ return (
213
+ <div className="grid grid-cols-3 gap-6">
214
+ {types.map((type) => (
215
+ <div key={type} className="border rounded-lg p-4">
216
+ <WakaEmptyState type={type} size="sm" />
217
+ </div>
218
+ ))}
219
+ </div>
220
+ )
221
+ },
222
+ }
223
+
224
+ export const SmallSize: Story = {
225
+ render: () => (
226
+ <div className="w-[400px] border rounded-lg">
227
+ <WakaEmptyState
228
+ type="no-data"
229
+ size="sm"
230
+ actions={[
231
+ {
232
+ label: 'Ajouter',
233
+ onClick: () => console.log('Add'),
234
+ },
235
+ ]}
236
+ />
237
+ </div>
238
+ ),
239
+ }
240
+
241
+ export const LargeSize: Story = {
242
+ render: () => (
243
+ <div className="w-[600px]">
244
+ <WakaEmptyState
245
+ type="no-data"
246
+ size="lg"
247
+ actions={[
248
+ {
249
+ label: 'Commencer',
250
+ onClick: () => console.log('Start'),
251
+ },
252
+ ]}
253
+ />
254
+ </div>
255
+ ),
256
+ }
257
+
258
+ export const HorizontalLayout: Story = {
259
+ render: () => (
260
+ <div className="w-[600px] border rounded-lg">
261
+ <WakaEmptyState
262
+ type="no-files"
263
+ layout="horizontal"
264
+ actions={[
265
+ {
266
+ label: 'Importer',
267
+ icon: <Upload className="h-4 w-4" />,
268
+ onClick: () => console.log('Upload'),
269
+ },
270
+ ]}
271
+ />
272
+ </div>
273
+ ),
274
+ }
275
+
276
+ export const CustomContent: Story = {
277
+ render: () => (
278
+ <div className="w-[500px]">
279
+ <WakaEmptyState
280
+ type="custom"
281
+ title="Bienvenue !"
282
+ description="Commencez par créer votre premier projet."
283
+ icon={<Rocket className="h-10 w-10" />}
284
+ actions={[
285
+ {
286
+ label: 'Créer un projet',
287
+ icon: <Plus className="h-4 w-4" />,
288
+ onClick: () => console.log('Create'),
289
+ },
290
+ {
291
+ label: 'Voir la documentation',
292
+ variant: 'outline',
293
+ href: '/docs',
294
+ },
295
+ ]}
296
+ LinkComponent={MockLink}
297
+ />
298
+ </div>
299
+ ),
300
+ }
301
+
302
+ export const CustomIllustration: Story = {
303
+ render: () => (
304
+ <div className="w-[500px]">
305
+ <WakaEmptyState
306
+ type="custom"
307
+ title="Aucun projet"
308
+ description="Créez votre premier projet pour commencer."
309
+ illustration={
310
+ <div className="w-32 h-32 bg-gradient-to-br from-primary/20 to-primary/5 rounded-full flex items-center justify-center">
311
+ <span className="text-5xl">📁</span>
312
+ </div>
313
+ }
314
+ actions={[
315
+ {
316
+ label: 'Nouveau projet',
317
+ onClick: () => console.log('New project'),
318
+ },
319
+ ]}
320
+ />
321
+ </div>
322
+ ),
323
+ }
324
+
325
+ export const WithChildren: Story = {
326
+ render: () => (
327
+ <div className="w-[500px]">
328
+ <WakaEmptyState
329
+ type="no-results"
330
+ title="Aucun résultat"
331
+ description="Essayez d'ajuster vos critères de recherche."
332
+ >
333
+ <div className="flex flex-wrap gap-2 justify-center">
334
+ <span className="text-sm text-muted-foreground">Suggestions:</span>
335
+ {['React', 'TypeScript', 'Tailwind', 'Next.js'].map((tag) => (
336
+ <button
337
+ key={tag}
338
+ className="px-2 py-1 text-sm bg-muted rounded hover:bg-muted/80"
339
+ onClick={() => console.log('Search:', tag)}
340
+ >
341
+ {tag}
342
+ </button>
343
+ ))}
344
+ </div>
345
+ </WakaEmptyState>
346
+ </div>
347
+ ),
348
+ }
349
+
350
+ export const NoIllustration: Story = {
351
+ render: () => (
352
+ <div className="w-[500px]">
353
+ <WakaEmptyState
354
+ type="no-data"
355
+ showIllustration={false}
356
+ actions={[
357
+ {
358
+ label: 'Ajouter',
359
+ onClick: () => console.log('Add'),
360
+ },
361
+ ]}
362
+ />
363
+ </div>
364
+ ),
365
+ }
366
+
367
+ export const MultipleActions: Story = {
368
+ render: () => (
369
+ <div className="w-[500px]">
370
+ <WakaEmptyState
371
+ type="no-files"
372
+ actions={[
373
+ {
374
+ label: 'Importer',
375
+ icon: <Upload className="h-4 w-4" />,
376
+ variant: 'default',
377
+ onClick: () => console.log('Upload'),
378
+ },
379
+ {
380
+ label: 'Créer',
381
+ icon: <Plus className="h-4 w-4" />,
382
+ variant: 'outline',
383
+ onClick: () => console.log('Create'),
384
+ },
385
+ {
386
+ label: 'Modèles',
387
+ icon: <FileText className="h-4 w-4" />,
388
+ variant: 'ghost',
389
+ href: '/templates',
390
+ },
391
+ ]}
392
+ LinkComponent={MockLink}
393
+ />
394
+ </div>
395
+ ),
396
+ }
397
+
398
+ export const InTableContext: Story = {
399
+ render: () => (
400
+ <div className="w-[800px] border rounded-lg overflow-hidden">
401
+ <div className="bg-muted/50 px-4 py-3 border-b">
402
+ <div className="flex items-center justify-between">
403
+ <h3 className="font-semibold">Documents</h3>
404
+ <div className="flex gap-2">
405
+ <input
406
+ type="text"
407
+ placeholder="Rechercher..."
408
+ className="px-3 py-1.5 text-sm border rounded-md"
409
+ />
410
+ <button className="px-3 py-1.5 text-sm bg-primary text-primary-foreground rounded-md">
411
+ Nouveau
412
+ </button>
413
+ </div>
414
+ </div>
415
+ </div>
416
+ <WakaEmptyState
417
+ type="no-data"
418
+ size="md"
419
+ actions={[
420
+ {
421
+ label: 'Créer un document',
422
+ icon: <Plus className="h-4 w-4" />,
423
+ onClick: () => console.log('Create'),
424
+ },
425
+ ]}
426
+ />
427
+ </div>
428
+ ),
429
+ }
430
+
431
+ export const InCardContext: Story = {
432
+ render: () => (
433
+ <div className="w-[400px] border rounded-lg overflow-hidden">
434
+ <div className="px-4 py-3 border-b">
435
+ <h3 className="font-semibold">Favoris</h3>
436
+ </div>
437
+ <WakaEmptyState
438
+ type="no-favorites"
439
+ size="sm"
440
+ showIllustration={true}
441
+ />
442
+ </div>
443
+ ),
444
+ }
445
+
446
+ export const InSidebarContext: Story = {
447
+ render: () => (
448
+ <div className="w-[280px] h-[400px] border rounded-lg flex flex-col">
449
+ <div className="px-4 py-3 border-b">
450
+ <h3 className="font-semibold text-sm">Messages récents</h3>
451
+ </div>
452
+ <div className="flex-1 flex">
453
+ <WakaEmptyState
454
+ type="no-messages"
455
+ size="sm"
456
+ layout="vertical"
457
+ actions={[
458
+ {
459
+ label: 'Nouveau',
460
+ onClick: () => console.log('New'),
461
+ },
462
+ ]}
463
+ />
464
+ </div>
465
+ </div>
466
+ ),
467
+ }
@@ -2,6 +2,7 @@
2
2
 
3
3
  import * as React from "react"
4
4
  import { cn } from "../../utils"
5
+ import type { LinkComponentProps } from "../../types/link"
5
6
  import { Button } from "../../components/button"
6
7
  import {
7
8
  FileQuestion,
@@ -78,6 +79,8 @@ export interface WakaEmptyStateProps {
78
79
  children?: React.ReactNode
79
80
  /** Classes CSS additionnelles */
80
81
  className?: string
82
+ /** Composant de lien personnalisé (ex: next/link) pour navigation SPA */
83
+ LinkComponent?: React.ComponentType<LinkComponentProps>
81
84
  }
82
85
 
83
86
  // ============================================
@@ -238,6 +241,7 @@ export function WakaEmptyState({
238
241
  centered = true,
239
242
  children,
240
243
  className,
244
+ LinkComponent,
241
245
  }: WakaEmptyStateProps) {
242
246
  const config = emptyStateConfigs[type]
243
247
  const displayTitle = title ?? config.title
@@ -325,10 +329,17 @@ export function WakaEmptyState({
325
329
  asChild={!!action.href}
326
330
  >
327
331
  {action.href ? (
328
- <a href={action.href}>
329
- {action.icon && <span className="mr-2">{action.icon}</span>}
330
- {action.label}
331
- </a>
332
+ LinkComponent ? (
333
+ <LinkComponent href={action.href}>
334
+ {action.icon && <span className="mr-2">{action.icon}</span>}
335
+ {action.label}
336
+ </LinkComponent>
337
+ ) : (
338
+ <a href={action.href}>
339
+ {action.icon && <span className="mr-2">{action.icon}</span>}
340
+ {action.label}
341
+ </a>
342
+ )
332
343
  ) : (
333
344
  <>
334
345
  {action.icon && <span className="mr-2">{action.icon}</span>}
@@ -399,10 +410,17 @@ export function WakaEmptyState({
399
410
  asChild={!!action.href}
400
411
  >
401
412
  {action.href ? (
402
- <a href={action.href}>
403
- {action.icon && <span className="mr-2">{action.icon}</span>}
404
- {action.label}
405
- </a>
413
+ LinkComponent ? (
414
+ <LinkComponent href={action.href}>
415
+ {action.icon && <span className="mr-2">{action.icon}</span>}
416
+ {action.label}
417
+ </LinkComponent>
418
+ ) : (
419
+ <a href={action.href}>
420
+ {action.icon && <span className="mr-2">{action.icon}</span>}
421
+ {action.label}
422
+ </a>
423
+ )
406
424
  ) : (
407
425
  <>
408
426
  {action.icon && <span className="mr-2">{action.icon}</span>}