@wakastellar/ui 2.4.0 → 3.1.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 (173) hide show
  1. package/dist/blocks/antivirus-dashboard/index.d.ts +44 -0
  2. package/dist/blocks/clamav-service-status/index.d.ts +35 -0
  3. package/dist/blocks/file-scan-uploader/index.d.ts +29 -0
  4. package/dist/blocks/index.d.ts +18 -9
  5. package/dist/blocks/quarantine-manager/index.d.ts +27 -0
  6. package/dist/blocks/scan-history-log/index.d.ts +28 -0
  7. package/dist/blocks/scan-policy-editor/index.d.ts +27 -0
  8. package/dist/blocks/scan-report-generator/index.d.ts +47 -0
  9. package/dist/blocks/signature-database-manager/index.d.ts +39 -0
  10. package/dist/blocks/threat-alert-banner/index.d.ts +26 -0
  11. package/dist/components/index.d.ts +4 -4
  12. package/dist/components/waka-signature-pad/index.d.ts +1 -1
  13. package/dist/exceljs.min-BcLLX0PC.js +29 -0
  14. package/dist/exceljs.min-KOayaaQ4.mjs +23013 -0
  15. package/dist/export.cjs.js +1 -1
  16. package/dist/export.d.ts +2 -2
  17. package/dist/export.es.js +1 -1
  18. package/dist/index.cjs.js +136 -136
  19. package/dist/index.es.js +29978 -27215
  20. package/dist/stories/Button.stories.d.ts +1 -1
  21. package/dist/stories/Header.stories.d.ts +1 -1
  22. package/dist/stories/Page.stories.d.ts +1 -1
  23. package/dist/useDataTableImport-COVnvslz.js +9 -0
  24. package/dist/useDataTableImport-DAlxBY8w.mjs +237 -0
  25. package/dist/utils/index.d.ts +1 -0
  26. package/dist/utils/logger.d.ts +9 -0
  27. package/package.json +6 -5
  28. package/src/blocks/antivirus-dashboard/AntivirusDashboard.stories.tsx +291 -0
  29. package/src/blocks/antivirus-dashboard/index.tsx +525 -0
  30. package/src/blocks/clamav-service-status/ClamAVServiceStatus.stories.tsx +195 -0
  31. package/src/blocks/clamav-service-status/index.tsx +370 -0
  32. package/src/blocks/file-scan-uploader/FileScanUploader.stories.tsx +257 -0
  33. package/src/blocks/file-scan-uploader/index.tsx +311 -0
  34. package/src/blocks/index.ts +163 -11
  35. package/src/blocks/quarantine-manager/QuarantineManager.stories.tsx +209 -0
  36. package/src/blocks/quarantine-manager/index.tsx +435 -0
  37. package/src/blocks/scan-history-log/ScanHistoryLog.stories.tsx +231 -0
  38. package/src/blocks/scan-history-log/index.tsx +406 -0
  39. package/src/blocks/scan-policy-editor/ScanPolicyEditor.stories.tsx +106 -0
  40. package/src/blocks/scan-policy-editor/index.tsx +418 -0
  41. package/src/blocks/scan-report-generator/ScanReportGenerator.stories.tsx +232 -0
  42. package/src/blocks/scan-report-generator/index.tsx +612 -0
  43. package/src/blocks/sidebar/index.tsx +2 -1
  44. package/src/blocks/signature-database-manager/SignatureDatabaseManager.stories.tsx +279 -0
  45. package/src/blocks/signature-database-manager/index.tsx +470 -0
  46. package/src/blocks/theme-creator-block/index.tsx +16 -2
  47. package/src/blocks/threat-alert-banner/ThreatAlertBanner.stories.tsx +152 -0
  48. package/src/blocks/threat-alert-banner/index.tsx +320 -0
  49. package/src/components/DataTable/DataTable.stories.tsx +203 -0
  50. package/src/components/DataTable/hooks/useDataTableExport.ts +38 -31
  51. package/src/components/DataTable/hooks/useDataTableImport.ts +31 -20
  52. package/src/components/error-boundary/ErrorBoundary.stories.tsx +125 -0
  53. package/src/components/index.ts +45 -4
  54. package/src/components/language-selector/LanguageSelector.stories.tsx +112 -0
  55. package/src/components/theme-selector/ThemeSelector.stories.tsx +77 -0
  56. package/src/components/toaster/Toaster.stories.tsx +67 -0
  57. package/src/components/waka-activity-feed/WakaActivityFeed.stories.tsx +116 -0
  58. package/src/components/waka-ad-banner/WakaAdBanner.stories.tsx +102 -0
  59. package/src/components/waka-ad-fallback/WakaAdFallback.stories.tsx +117 -0
  60. package/src/components/waka-ad-inline/WakaAdInline.stories.tsx +105 -0
  61. package/src/components/waka-ad-interstitial/WakaAdInterstitial.stories.tsx +92 -0
  62. package/src/components/waka-ad-placeholder/WakaAdPlaceholder.stories.tsx +89 -0
  63. package/src/components/waka-ad-provider/WakaAdProvider.stories.tsx +110 -0
  64. package/src/components/waka-ad-sidebar/WakaAdSidebar.stories.tsx +89 -0
  65. package/src/components/waka-ad-sidebar/index.tsx +3 -2
  66. package/src/components/waka-ad-sticky-footer/WakaAdStickyFooter.stories.tsx +88 -0
  67. package/src/components/waka-address-autocomplete/WakaAddressAutocomplete.stories.tsx +46 -0
  68. package/src/components/waka-admincrumb/WakaAdmincrumb.stories.tsx +166 -0
  69. package/src/components/waka-alert-panel/WakaAlertPanel.stories.tsx +45 -0
  70. package/src/components/waka-alert-stack/WakaAlertStack.stories.tsx +62 -0
  71. package/src/components/waka-allocation-matrix/WakaAllocationMatrix.stories.tsx +68 -0
  72. package/src/components/waka-approval-chain/WakaApprovalChain.stories.tsx +63 -0
  73. package/src/components/waka-audit-log/WakaAuditLog.stories.tsx +73 -0
  74. package/src/components/waka-autocomplete/WakaAutocomplete.stories.tsx +132 -172
  75. package/src/components/waka-biometric-prompt/WakaBiometricPrompt.stories.tsx +48 -0
  76. package/src/components/waka-breadcrumb/WakaBreadcrumb.stories.tsx +74 -191
  77. package/src/components/waka-breadcrumb-path/WakaBreadcrumbPath.stories.tsx +40 -0
  78. package/src/components/waka-budget-burn/WakaBudgetBurn.stories.tsx +86 -0
  79. package/src/components/waka-capacity-planner/WakaCapacityPlanner.stories.tsx +273 -0
  80. package/src/components/waka-cart-summary/WakaCartSummary.stories.tsx +176 -0
  81. package/src/components/waka-cart-summary/index.tsx +19 -10
  82. package/src/components/waka-challenge-timer/WakaChallengeTimer.stories.tsx +98 -0
  83. package/src/components/waka-chat-bubble/WakaChatBubble.stories.tsx +118 -0
  84. package/src/components/waka-checklist/WakaChecklist.stories.tsx +71 -0
  85. package/src/components/waka-checkout-stepper/WakaCheckoutStepper.stories.tsx +102 -0
  86. package/src/components/waka-cohort-table/WakaCohortTable.stories.tsx +56 -0
  87. package/src/components/waka-color-picker/WakaColorPicker.stories.tsx +99 -155
  88. package/src/components/waka-combo-counter/WakaComboCounter.stories.tsx +128 -0
  89. package/src/components/waka-command-bar/WakaCommandBar.stories.tsx +45 -0
  90. package/src/components/waka-compare-period/WakaComparePeriod.stories.tsx +76 -0
  91. package/src/components/waka-config-comparator/WakaConfigComparator.stories.tsx +143 -0
  92. package/src/components/waka-connection-matrix/WakaConnectionMatrix.stories.tsx +52 -0
  93. package/src/components/waka-content-recommendation/WakaContentRecommendation.stories.tsx +41 -0
  94. package/src/components/waka-coupon-input/WakaCouponInput.stories.tsx +126 -0
  95. package/src/components/waka-credit-card-input/WakaCreditCardInput.stories.tsx +120 -0
  96. package/src/components/waka-datetime-picker.form-integration/WakaDateTimePickerForm.stories.tsx +79 -0
  97. package/src/components/waka-dependency-tree/WakaDependencyTree.stories.tsx +72 -0
  98. package/src/components/waka-device-trust/WakaDeviceTrust.stories.tsx +109 -0
  99. package/src/components/waka-empty-state/WakaEmptyState.stories.tsx +87 -0
  100. package/src/components/waka-feature-announcement/WakaFeatureAnnouncement.stories.tsx +47 -0
  101. package/src/components/waka-feature-flag-row/WakaFeatureFlagRow.stories.tsx +188 -0
  102. package/src/components/waka-file-upload/WakaFileUpload.stories.tsx +118 -174
  103. package/src/components/waka-floating-nav/WakaFloatingNav.stories.tsx +53 -0
  104. package/src/components/waka-goal-progress/WakaGoalProgress.stories.tsx +137 -0
  105. package/src/components/waka-hotspot/WakaHotspot.stories.tsx +56 -0
  106. package/src/components/waka-invoice-preview/WakaInvoicePreview.stories.tsx +169 -0
  107. package/src/components/waka-kpi-dashboard/WakaKpiDashboard.stories.tsx +46 -0
  108. package/src/components/waka-level-progress/WakaLevelProgress.stories.tsx +94 -75
  109. package/src/components/waka-liquid-button/WakaLiquidButton.stories.tsx +45 -0
  110. package/src/components/waka-magic-link/WakaMagicLink.stories.tsx +61 -0
  111. package/src/components/waka-magnetic-button/WakaMagneticButton.stories.tsx +40 -0
  112. package/src/components/waka-mention-input/WakaMentionInput.stories.tsx +140 -0
  113. package/src/components/waka-milestone-road/WakaMilestoneRoad.stories.tsx +143 -0
  114. package/src/components/waka-orbital-menu/WakaOrbitalMenu.stories.tsx +54 -0
  115. package/src/components/waka-order-tracker/WakaOrderTracker.stories.tsx +163 -0
  116. package/src/components/waka-outstream-video/WakaOutstreamVideo.stories.tsx +94 -0
  117. package/src/components/waka-pagination/WakaPagination.stories.tsx +110 -280
  118. package/src/components/waka-password-strength/WakaPasswordStrength.stories.tsx +132 -268
  119. package/src/components/waka-payment-method-picker/WakaPaymentMethodPicker.stories.tsx +141 -0
  120. package/src/components/waka-permission-matrix/WakaPermissionMatrix.stories.tsx +124 -0
  121. package/src/components/waka-phone-input/WakaPhoneInput.stories.tsx +56 -0
  122. package/src/components/waka-points-popup/WakaPointsPopup.stories.tsx +96 -0
  123. package/src/components/waka-power-up/WakaPowerUp.stories.tsx +121 -0
  124. package/src/components/waka-presence-indicator/WakaPresenceIndicator.stories.tsx +49 -0
  125. package/src/components/waka-pricing-table/WakaPricingTable.stories.tsx +159 -0
  126. package/src/components/waka-product-card/WakaProductCard.stories.tsx +202 -0
  127. package/src/components/waka-progress-onboarding/WakaProgressOnboarding.stories.tsx +57 -0
  128. package/src/components/waka-pull-to-refresh/WakaPullToRefresh.stories.tsx +51 -0
  129. package/src/components/waka-rank-badge/WakaRankBadge.stories.tsx +108 -0
  130. package/src/components/waka-rating-input/WakaRatingInput.stories.tsx +51 -0
  131. package/src/components/waka-reaction-picker/WakaReactionPicker.stories.tsx +52 -0
  132. package/src/components/waka-region-map/WakaRegionMap.stories.tsx +181 -0
  133. package/src/components/waka-resource-pool/WakaResourcePool.stories.tsx +70 -0
  134. package/src/components/waka-rich-text-editor/WakaRichTextEditor.stories.tsx +108 -197
  135. package/src/components/waka-rollback-slider/WakaRollbackSlider.stories.tsx +41 -0
  136. package/src/components/waka-schedule-picker/WakaSchedulePicker.stories.tsx +64 -0
  137. package/src/components/waka-season-pass/WakaSeasonPass.stories.tsx +107 -0
  138. package/src/components/waka-security-scan-result/WakaSecurityScanResult.stories.tsx +146 -0
  139. package/src/components/waka-security-score/WakaSecurityScore.stories.tsx +63 -0
  140. package/src/components/waka-session-manager/WakaSessionManager.stories.tsx +68 -0
  141. package/src/components/waka-signature-pad/WakaSignaturePad.stories.tsx +159 -0
  142. package/src/components/waka-signature-pad/index.tsx +5 -3
  143. package/src/components/waka-sla-tracker/WakaSlaTracker.stories.tsx +65 -0
  144. package/src/components/waka-slider-range/WakaSliderRange.stories.tsx +66 -0
  145. package/src/components/waka-sponsored-badge/WakaSponsoredBadge.stories.tsx +60 -0
  146. package/src/components/waka-sponsored-card/WakaSponsoredCard.stories.tsx +64 -0
  147. package/src/components/waka-sponsored-feed/WakaSponsoredFeed.stories.tsx +58 -0
  148. package/src/components/waka-spotlight/WakaSpotlight.stories.tsx +53 -0
  149. package/src/components/waka-stats-hexagon/WakaStatsHexagon.stories.tsx +161 -0
  150. package/src/components/waka-stepper/WakaStepper.stories.tsx +137 -410
  151. package/src/components/waka-swipe-card/WakaSwipeCard.stories.tsx +51 -0
  152. package/src/components/waka-tag-input/WakaTagInput.stories.tsx +224 -0
  153. package/src/components/waka-team-banner/WakaTeamBanner.stories.tsx +50 -0
  154. package/src/components/waka-theme-creator/WakaThemeCreator.stories.tsx +58 -0
  155. package/src/components/waka-theme-manager/WakaThemeManager.stories.tsx +298 -0
  156. package/src/components/waka-theme-manager/index.tsx +6 -11
  157. package/src/components/waka-thread-view/WakaThreadView.stories.tsx +143 -0
  158. package/src/components/waka-timeline/WakaTimeline.stories.tsx +171 -324
  159. package/src/components/waka-tooltip-tour/WakaTooltipTour.stories.tsx +92 -0
  160. package/src/components/waka-tour-guide/WakaTourGuide.stories.tsx +89 -0
  161. package/src/components/waka-treemap-chart/WakaTreemapChart.stories.tsx +234 -129
  162. package/src/components/waka-treemap-chart/index.tsx +2 -2
  163. package/src/components/waka-two-factor-setup/WakaTwoFactorSetup.stories.tsx +142 -0
  164. package/src/components/waka-typing-indicator/WakaTypingIndicator.stories.tsx +134 -0
  165. package/src/components/waka-video-ad/WakaVideoAd.stories.tsx +138 -0
  166. package/src/components/waka-video-call/WakaVideoCall.stories.tsx +186 -0
  167. package/src/components/waka-video-overlay/WakaVideoOverlay.stories.tsx +100 -0
  168. package/src/components/waka-voice-message/WakaVoiceMessage.stories.tsx +190 -0
  169. package/src/components/waka-welcome-modal/WakaWelcomeModal.stories.tsx +87 -0
  170. package/src/components/waka-xp-bar/WakaXPBar.stories.tsx +29 -29
  171. package/dist/useDataTableImport-D8R2HQl6.mjs +0 -229
  172. package/dist/useDataTableImport-S_hhA5Wo.js +0 -9
  173. package/src/components/DataTable/README.md +0 -446
@@ -0,0 +1,118 @@
1
+ import type { Meta, StoryObj } from "@storybook/react"
2
+ import { WakaChatBubble } from "./index"
3
+
4
+ const meta: Meta<typeof WakaChatBubble> = {
5
+ title: "Communication/WakaChatBubble",
6
+ component: WakaChatBubble,
7
+ parameters: {
8
+ layout: "centered",
9
+ },
10
+ tags: ["autodocs"],
11
+ argTypes: {
12
+ message: {
13
+ control: "text",
14
+ description: "Le contenu du message",
15
+ },
16
+ variant: {
17
+ control: "select",
18
+ options: ["sent", "received"],
19
+ description: "Variante du bubble (envoyé/reçu)",
20
+ },
21
+ status: {
22
+ control: "select",
23
+ options: ["sending", "sent", "delivered", "read", "failed"],
24
+ description: "Statut du message",
25
+ },
26
+ timestamp: {
27
+ control: "date",
28
+ description: "Horodatage du message",
29
+ },
30
+ showAvatar: {
31
+ control: "boolean",
32
+ description: "Afficher l'avatar",
33
+ },
34
+ showStatus: {
35
+ control: "boolean",
36
+ description: "Afficher le statut",
37
+ },
38
+ showTimestamp: {
39
+ control: "boolean",
40
+ description: "Afficher l'horodatage",
41
+ },
42
+ },
43
+ }
44
+
45
+ export default meta
46
+ type Story = StoryObj<typeof WakaChatBubble>
47
+
48
+ export const Default: Story = {
49
+ args: {
50
+ message: "Bonjour ! Comment ça va ?",
51
+ variant: "received",
52
+ status: "read",
53
+ timestamp: new Date(),
54
+ showAvatar: true,
55
+ showStatus: true,
56
+ showTimestamp: true,
57
+ sender: {
58
+ id: "1",
59
+ name: "Alice",
60
+ avatar: "https://i.pravatar.cc/150?u=alice",
61
+ },
62
+ },
63
+ render: (args) => <WakaChatBubble {...args} />,
64
+ }
65
+
66
+ export const Sent: Story = {
67
+ args: {
68
+ message: "Je vais bien, merci !",
69
+ variant: "sent",
70
+ status: "delivered",
71
+ timestamp: new Date(),
72
+ showStatus: true,
73
+ showTimestamp: true,
74
+ },
75
+ render: (args) => <WakaChatBubble {...args} />,
76
+ }
77
+
78
+ export const WithReactions: Story = {
79
+ args: {
80
+ message: "Super nouvelle ! 🎉",
81
+ variant: "received",
82
+ status: "read",
83
+ timestamp: new Date(),
84
+ reactions: [
85
+ { emoji: "👍", count: 3, users: ["Alice", "Bob", "Charlie"], reacted: true },
86
+ { emoji: "❤️", count: 2, users: ["David", "Eve"], reacted: false },
87
+ ],
88
+ sender: {
89
+ id: "2",
90
+ name: "Bob",
91
+ avatar: "https://i.pravatar.cc/150?u=bob",
92
+ },
93
+ },
94
+ render: (args) => <WakaChatBubble {...args} />,
95
+ }
96
+
97
+ export const Failed: Story = {
98
+ args: {
99
+ message: "Ce message a échoué",
100
+ variant: "sent",
101
+ status: "failed",
102
+ timestamp: new Date(),
103
+ showStatus: true,
104
+ },
105
+ render: (args) => <WakaChatBubble {...args} />,
106
+ }
107
+
108
+ export const Sending: Story = {
109
+ args: {
110
+ message: "Envoi en cours...",
111
+ variant: "sent",
112
+ status: "sending",
113
+ timestamp: new Date(),
114
+ showStatus: true,
115
+ },
116
+ render: (args) => <WakaChatBubble {...args} />,
117
+ }
118
+
@@ -0,0 +1,71 @@
1
+ import type { Meta, StoryObj } from "@storybook/react"
2
+ import { WakaChecklist, type ChecklistTask } from "./index"
3
+
4
+ const meta: Meta<typeof WakaChecklist> = {
5
+ title: "Admin/WakaChecklist",
6
+ component: WakaChecklist,
7
+ parameters: { layout: "centered" },
8
+ tags: ["autodocs"],
9
+ argTypes: {
10
+ showProgress: { control: "boolean", description: "Afficher la progression" },
11
+ showSkip: { control: "boolean", description: "Permettre de passer" },
12
+ collapsible: { control: "boolean", description: "Sections réductibles" },
13
+ celebrateOnComplete: { control: "boolean", description: "Animation de fin" },
14
+ },
15
+ }
16
+
17
+ export default meta
18
+ type Story = StoryObj<typeof WakaChecklist>
19
+
20
+ const tasks: ChecklistTask[] = [
21
+ { id: "1", title: "Créer un compte", description: "Inscrivez-vous avec votre email", status: "completed" },
22
+ { id: "2", title: "Configurer le profil", description: "Ajoutez votre photo et bio", status: "completed" },
23
+ { id: "3", title: "Connecter un service", description: "Liez GitHub ou GitLab", status: "pending" },
24
+ { id: "4", title: "Inviter des collaborateurs", description: "Ajoutez votre équipe", status: "pending" },
25
+ { id: "5", title: "Créer le premier projet", description: "Démarrez votre aventure", status: "pending" },
26
+ ]
27
+
28
+ export const Default: Story = {
29
+ args: { tasks, showProgress: true, showSkip: true },
30
+ render: (args) => (
31
+ <div style={{ width: 400 }}>
32
+ <WakaChecklist {...args} />
33
+ </div>
34
+ ),
35
+ }
36
+
37
+ export const AllCompleted: Story = {
38
+ args: { tasks: tasks.map(t => ({ ...t, status: "completed" as const })), showProgress: true, celebrateOnComplete: true },
39
+ render: (args) => (
40
+ <div style={{ width: 400 }}>
41
+ <WakaChecklist {...args} />
42
+ </div>
43
+ ),
44
+ }
45
+
46
+ export const WithSkipped: Story = {
47
+ args: {
48
+ tasks: [
49
+ { ...tasks[0], status: "completed" as const },
50
+ { ...tasks[1], status: "skipped" as const },
51
+ { ...tasks[2], status: "pending" as const },
52
+ ],
53
+ showProgress: true,
54
+ showSkip: true,
55
+ },
56
+ render: (args) => (
57
+ <div style={{ width: 400 }}>
58
+ <WakaChecklist {...args} />
59
+ </div>
60
+ ),
61
+ }
62
+
63
+ export const Compact: Story = {
64
+ args: { tasks: tasks.slice(0, 3), showProgress: false, showSkip: false },
65
+ render: (args) => (
66
+ <div style={{ width: 350 }}>
67
+ <WakaChecklist {...args} />
68
+ </div>
69
+ ),
70
+ }
71
+
@@ -0,0 +1,102 @@
1
+ import type { Meta, StoryObj } from "@storybook/react"
2
+ import { WakaCheckoutStepper, type CheckoutStep } from "./index"
3
+ import { useState } from "react"
4
+
5
+ const meta: Meta<typeof WakaCheckoutStepper> = {
6
+ title: "E-commerce/WakaCheckoutStepper",
7
+ component: WakaCheckoutStepper,
8
+ parameters: {
9
+ layout: "padded",
10
+ },
11
+ tags: ["autodocs"],
12
+ argTypes: {
13
+ currentStep: {
14
+ control: { type: "number", min: 0, max: 4 },
15
+ description: "Index de l'étape courante",
16
+ },
17
+ orientation: {
18
+ control: "select",
19
+ options: ["horizontal", "vertical"],
20
+ description: "Orientation du stepper",
21
+ },
22
+ showStepContent: {
23
+ control: "boolean",
24
+ description: "Afficher le contenu des étapes",
25
+ },
26
+ allowNavigation: {
27
+ control: "boolean",
28
+ description: "Permettre la navigation entre étapes",
29
+ },
30
+ },
31
+ }
32
+
33
+ export default meta
34
+ type Story = StoryObj<typeof WakaCheckoutStepper>
35
+
36
+ const checkoutSteps: CheckoutStep[] = [
37
+ { id: "cart", title: "Panier", description: "Vérifiez vos articles" },
38
+ { id: "shipping", title: "Livraison", description: "Adresse de livraison" },
39
+ { id: "payment", title: "Paiement", description: "Mode de paiement" },
40
+ { id: "review", title: "Confirmation", description: "Vérifiez votre commande" },
41
+ ]
42
+
43
+ export const Default: Story = {
44
+ args: {
45
+ steps: checkoutSteps,
46
+ currentStep: 1,
47
+ orientation: "horizontal",
48
+ },
49
+ render: (args) => <WakaCheckoutStepper {...args} />,
50
+ }
51
+
52
+ export const Vertical: Story = {
53
+ args: {
54
+ steps: checkoutSteps,
55
+ currentStep: 2,
56
+ orientation: "vertical",
57
+ },
58
+ render: (args) => (
59
+ <div style={{ maxHeight: 400 }}>
60
+ <WakaCheckoutStepper {...args} />
61
+ </div>
62
+ ),
63
+ }
64
+
65
+ export const FirstStep: Story = {
66
+ args: {
67
+ steps: checkoutSteps,
68
+ currentStep: 0,
69
+ orientation: "horizontal",
70
+ },
71
+ render: (args) => <WakaCheckoutStepper {...args} />,
72
+ }
73
+
74
+ export const LastStep: Story = {
75
+ args: {
76
+ steps: checkoutSteps,
77
+ currentStep: 3,
78
+ orientation: "horizontal",
79
+ },
80
+ render: (args) => <WakaCheckoutStepper {...args} />,
81
+ }
82
+
83
+ export const WithError: Story = {
84
+ args: {
85
+ steps: checkoutSteps.map((step, i) =>
86
+ i === 2 ? { ...step, status: "error" as const } : step
87
+ ),
88
+ currentStep: 2,
89
+ orientation: "horizontal",
90
+ },
91
+ render: (args) => <WakaCheckoutStepper {...args} />,
92
+ }
93
+
94
+ export const AllCompleted: Story = {
95
+ args: {
96
+ steps: checkoutSteps.map(step => ({ ...step, status: "completed" as const })),
97
+ currentStep: 4,
98
+ orientation: "horizontal",
99
+ },
100
+ render: (args) => <WakaCheckoutStepper {...args} />,
101
+ }
102
+
@@ -0,0 +1,56 @@
1
+ import type { Meta, StoryObj } from "@storybook/react"
2
+ import { WakaCohortTable, type CohortRow } from "./index"
3
+
4
+ const meta: Meta<typeof WakaCohortTable> = {
5
+ title: "Admin/WakaCohortTable",
6
+ component: WakaCohortTable,
7
+ parameters: { layout: "padded" },
8
+ tags: ["autodocs"],
9
+ argTypes: {
10
+ metric: { control: "select", options: ["retention", "churn", "revenue", "engagement"], description: "Métrique" },
11
+ period: { control: "select", options: ["day", "week", "month", "quarter"], description: "Période" },
12
+ showExport: { control: "boolean", description: "Exporter" },
13
+ colorScale: { control: "select", options: ["green", "blue", "purple", "red"], description: "Échelle de couleur" },
14
+ },
15
+ }
16
+
17
+ export default meta
18
+ type Story = StoryObj<typeof WakaCohortTable>
19
+
20
+ const cohorts: CohortRow[] = [
21
+ { id: "jan", label: "Jan 2024", size: 1000, data: [{ value: 100 }, { value: 85 }, { value: 72 }, { value: 68 }, { value: 60 }] },
22
+ { id: "feb", label: "Fév 2024", size: 1200, data: [{ value: 100 }, { value: 82 }, { value: 70 }, { value: 65 }] },
23
+ { id: "mar", label: "Mar 2024", size: 950, data: [{ value: 100 }, { value: 88 }, { value: 75 }] },
24
+ { id: "apr", label: "Avr 2024", size: 1100, data: [{ value: 100 }, { value: 90 }] },
25
+ { id: "may", label: "Mai 2024", size: 1300, data: [{ value: 100 }] },
26
+ ]
27
+
28
+ export const Default: Story = {
29
+ args: { cohorts, metric: "retention", period: "month", showExport: true },
30
+ render: (args) => <WakaCohortTable {...args} />,
31
+ }
32
+
33
+ export const ChurnMetric: Story = {
34
+ args: {
35
+ cohorts: cohorts.map(c => ({ ...c, data: c.data.map((d, i) => ({ value: i === 0 ? 0 : 100 - d.value })) })),
36
+ metric: "churn",
37
+ period: "month",
38
+ colorScale: "red",
39
+ },
40
+ render: (args) => <WakaCohortTable {...args} />,
41
+ }
42
+
43
+ export const WeeklyPeriod: Story = {
44
+ args: {
45
+ cohorts: cohorts.slice(0, 4).map((c, i) => ({ ...c, id: `w${i}`, label: `Semaine ${i + 1}` })),
46
+ metric: "retention",
47
+ period: "week",
48
+ },
49
+ render: (args) => <WakaCohortTable {...args} />,
50
+ }
51
+
52
+ export const CompactView: Story = {
53
+ args: { cohorts: cohorts.slice(0, 3), metric: "retention", showExport: false },
54
+ render: (args) => <WakaCohortTable {...args} />,
55
+ }
56
+
@@ -1,41 +1,48 @@
1
- import type { Meta, StoryObj } from '@storybook/react'
2
- import { WakaColorPicker } from './index'
3
- import * as React from 'react'
1
+ import type { Meta, StoryObj } from "@storybook/react"
2
+ import { WakaColorPicker } from "./index"
3
+ import { useState } from "react"
4
4
 
5
5
  const meta: Meta<typeof WakaColorPicker> = {
6
- title: 'Components/Forms/WakaColorPicker',
6
+ title: "Forms/WakaColorPicker",
7
7
  component: WakaColorPicker,
8
8
  parameters: {
9
- layout: 'centered',
10
- docs: {
11
- description: {
12
- component: 'A color picker component with presets, EyeDropper support, and multiple formats.',
13
- },
14
- },
9
+ layout: "centered",
15
10
  },
16
- tags: ['autodocs'],
11
+ tags: ["autodocs"],
17
12
  argTypes: {
13
+ value: {
14
+ control: "color",
15
+ description: "Valeur de la couleur",
16
+ },
18
17
  format: {
19
- control: 'select',
20
- options: ['hex', 'rgb', 'hsl'],
21
- description: 'Color format',
18
+ control: "select",
19
+ options: ["hex", "rgb", "hsl"],
20
+ description: "Format de la couleur",
22
21
  },
23
- size: {
24
- control: 'select',
25
- options: ['sm', 'md', 'lg'],
26
- description: 'Size of the trigger button',
22
+ showAlpha: {
23
+ control: "boolean",
24
+ description: "Afficher le canal alpha",
27
25
  },
28
26
  showPresets: {
29
- control: 'boolean',
30
- description: 'Show preset colors',
27
+ control: "boolean",
28
+ description: "Afficher les couleurs prédéfinies",
31
29
  },
32
30
  showEyeDropper: {
33
- control: 'boolean',
34
- description: 'Show EyeDropper tool (if supported)',
31
+ control: "boolean",
32
+ description: "Afficher l'outil EyeDropper",
35
33
  },
36
34
  disabled: {
37
- control: 'boolean',
38
- description: 'Disable the picker',
35
+ control: "boolean",
36
+ description: "État désactivé",
37
+ },
38
+ placeholder: {
39
+ control: "text",
40
+ description: "Texte placeholder",
41
+ },
42
+ size: {
43
+ control: "select",
44
+ options: ["sm", "md", "lg"],
45
+ description: "Taille du composant",
39
46
  },
40
47
  },
41
48
  }
@@ -44,157 +51,94 @@ export default meta
44
51
  type Story = StoryObj<typeof WakaColorPicker>
45
52
 
46
53
  export const Default: Story = {
47
- render: function ColorPickerDemo() {
48
- const [color, setColor] = React.useState('#3b82f6')
49
-
50
- return (
51
- <div className="flex items-center gap-4">
52
- <WakaColorPicker value={color} onChange={setColor} />
53
- <span className="text-sm font-mono">{color}</span>
54
- </div>
55
- )
54
+ args: {
55
+ value: "#3b82f6",
56
+ format: "hex",
57
+ showPresets: true,
58
+ showEyeDropper: true,
59
+ size: "md",
56
60
  },
61
+ render: (args) => <WakaColorPicker {...args} />,
57
62
  }
58
63
 
59
- export const Sizes: Story = {
60
- render: function SizesDemo() {
61
- const [color, setColor] = React.useState('#ef4444')
62
-
63
- return (
64
- <div className="flex items-center gap-4">
65
- <div className="text-center">
66
- <WakaColorPicker value={color} onChange={setColor} size="sm" />
67
- <p className="text-xs text-muted-foreground mt-1">Small</p>
68
- </div>
69
- <div className="text-center">
70
- <WakaColorPicker value={color} onChange={setColor} size="md" />
71
- <p className="text-xs text-muted-foreground mt-1">Medium</p>
72
- </div>
73
- <div className="text-center">
74
- <WakaColorPicker value={color} onChange={setColor} size="lg" />
75
- <p className="text-xs text-muted-foreground mt-1">Large</p>
76
- </div>
77
- </div>
78
- )
64
+ export const WithAlpha: Story = {
65
+ args: {
66
+ value: "rgba(59, 130, 246, 0.5)",
67
+ format: "rgb",
68
+ showAlpha: true,
69
+ showPresets: true,
79
70
  },
71
+ render: (args) => <WakaColorPicker {...args} />,
80
72
  }
81
73
 
82
- export const Formats: Story = {
83
- render: function FormatsDemo() {
84
- const [hexColor, setHexColor] = React.useState('#22c55e')
85
- const [rgbColor, setRgbColor] = React.useState('rgb(34, 197, 94)')
86
- const [hslColor, setHslColor] = React.useState('hsl(142, 71%, 45%)')
74
+ export const RGBFormat: Story = {
75
+ args: {
76
+ value: "rgb(239, 68, 68)",
77
+ format: "rgb",
78
+ showPresets: true,
79
+ },
80
+ render: (args) => <WakaColorPicker {...args} />,
81
+ }
87
82
 
88
- return (
89
- <div className="space-y-4">
90
- <div className="flex items-center gap-4">
91
- <WakaColorPicker value={hexColor} onChange={setHexColor} format="hex" />
92
- <span className="text-sm font-mono">HEX: {hexColor}</span>
93
- </div>
94
- <div className="flex items-center gap-4">
95
- <WakaColorPicker value={rgbColor} onChange={setRgbColor} format="rgb" />
96
- <span className="text-sm font-mono">RGB: {rgbColor}</span>
97
- </div>
98
- <div className="flex items-center gap-4">
99
- <WakaColorPicker value={hslColor} onChange={setHslColor} format="hsl" />
100
- <span className="text-sm font-mono">HSL: {hslColor}</span>
101
- </div>
102
- </div>
103
- )
83
+ export const HSLFormat: Story = {
84
+ args: {
85
+ value: "hsl(262, 83%, 58%)",
86
+ format: "hsl",
87
+ showPresets: true,
104
88
  },
89
+ render: (args) => <WakaColorPicker {...args} />,
105
90
  }
106
91
 
107
92
  export const CustomPresets: Story = {
108
- render: function CustomPresetsDemo() {
109
- const [color, setColor] = React.useState('#8b5cf6')
110
-
111
- const customPresets = [
112
- '#000000', '#ffffff',
113
- '#ef4444', '#f97316', '#f59e0b',
114
- '#22c55e', '#14b8a6', '#3b82f6',
115
- '#8b5cf6', '#ec4899',
116
- ]
117
-
118
- return (
119
- <div className="flex items-center gap-4">
120
- <WakaColorPicker
121
- value={color}
122
- onChange={setColor}
123
- presets={customPresets}
124
- />
125
- <span className="text-sm font-mono">{color}</span>
126
- </div>
127
- )
93
+ args: {
94
+ value: "#10b981",
95
+ format: "hex",
96
+ showPresets: true,
97
+ presets: [
98
+ "#1f2937", "#374151", "#6b7280", "#9ca3af",
99
+ "#dc2626", "#ea580c", "#ca8a04", "#16a34a",
100
+ "#0891b2", "#2563eb", "#7c3aed", "#c026d3",
101
+ ],
128
102
  },
103
+ render: (args) => <WakaColorPicker {...args} />,
129
104
  }
130
105
 
131
- export const NoPresets: Story = {
132
- render: function NoPresetsDemo() {
133
- const [color, setColor] = React.useState('#0ea5e9')
106
+ export const SmallSize: Story = {
107
+ args: {
108
+ value: "#ef4444",
109
+ format: "hex",
110
+ size: "sm",
111
+ showPresets: false,
112
+ },
113
+ render: (args) => <WakaColorPicker {...args} />,
114
+ }
134
115
 
135
- return (
136
- <div className="flex items-center gap-4">
137
- <WakaColorPicker
138
- value={color}
139
- onChange={setColor}
140
- showPresets={false}
141
- />
142
- <span className="text-sm font-mono">{color}</span>
143
- </div>
144
- )
116
+ export const LargeSize: Story = {
117
+ args: {
118
+ value: "#8b5cf6",
119
+ format: "hex",
120
+ size: "lg",
121
+ showPresets: true,
122
+ showEyeDropper: true,
145
123
  },
124
+ render: (args) => <WakaColorPicker {...args} />,
146
125
  }
147
126
 
148
127
  export const Disabled: Story = {
149
- render: () => (
150
- <WakaColorPicker value="#6b7280" disabled />
151
- ),
128
+ args: {
129
+ value: "#6366f1",
130
+ format: "hex",
131
+ disabled: true,
132
+ },
133
+ render: (args) => <WakaColorPicker {...args} />,
152
134
  }
153
135
 
154
- export const InForm: Story = {
155
- render: function InFormDemo() {
156
- const [bgColor, setBgColor] = React.useState('#ffffff')
157
- const [textColor, setTextColor] = React.useState('#000000')
158
- const [accentColor, setAccentColor] = React.useState('#3b82f6')
159
-
160
- return (
161
- <div className="space-y-4 w-[300px]">
162
- <div className="space-y-2">
163
- <label className="text-sm font-medium">Background Color</label>
164
- <div className="flex items-center gap-2">
165
- <WakaColorPicker value={bgColor} onChange={setBgColor} />
166
- <span className="text-sm font-mono flex-1">{bgColor}</span>
167
- </div>
168
- </div>
169
- <div className="space-y-2">
170
- <label className="text-sm font-medium">Text Color</label>
171
- <div className="flex items-center gap-2">
172
- <WakaColorPicker value={textColor} onChange={setTextColor} />
173
- <span className="text-sm font-mono flex-1">{textColor}</span>
174
- </div>
175
- </div>
176
- <div className="space-y-2">
177
- <label className="text-sm font-medium">Accent Color</label>
178
- <div className="flex items-center gap-2">
179
- <WakaColorPicker value={accentColor} onChange={setAccentColor} />
180
- <span className="text-sm font-mono flex-1">{accentColor}</span>
181
- </div>
182
- </div>
183
-
184
- <div
185
- className="p-4 rounded-lg mt-4"
186
- style={{ backgroundColor: bgColor, color: textColor }}
187
- >
188
- <p className="font-semibold">Preview</p>
189
- <p className="text-sm mt-1">This is how your colors look together.</p>
190
- <button
191
- className="mt-2 px-3 py-1 rounded text-white text-sm"
192
- style={{ backgroundColor: accentColor }}
193
- >
194
- Accent Button
195
- </button>
196
- </div>
197
- </div>
198
- )
136
+ export const WithoutPresets: Story = {
137
+ args: {
138
+ value: "#f97316",
139
+ format: "hex",
140
+ showPresets: false,
141
+ showEyeDropper: false,
199
142
  },
143
+ render: (args) => <WakaColorPicker {...args} />,
200
144
  }