@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.
- package/dist/blocks/antivirus-dashboard/index.d.ts +44 -0
- package/dist/blocks/clamav-service-status/index.d.ts +35 -0
- package/dist/blocks/file-scan-uploader/index.d.ts +29 -0
- package/dist/blocks/index.d.ts +18 -9
- package/dist/blocks/quarantine-manager/index.d.ts +27 -0
- package/dist/blocks/scan-history-log/index.d.ts +28 -0
- package/dist/blocks/scan-policy-editor/index.d.ts +27 -0
- package/dist/blocks/scan-report-generator/index.d.ts +47 -0
- package/dist/blocks/signature-database-manager/index.d.ts +39 -0
- package/dist/blocks/threat-alert-banner/index.d.ts +26 -0
- package/dist/components/index.d.ts +4 -4
- package/dist/components/waka-signature-pad/index.d.ts +1 -1
- package/dist/exceljs.min-BcLLX0PC.js +29 -0
- package/dist/exceljs.min-KOayaaQ4.mjs +23013 -0
- package/dist/export.cjs.js +1 -1
- package/dist/export.d.ts +2 -2
- package/dist/export.es.js +1 -1
- package/dist/index.cjs.js +136 -136
- package/dist/index.es.js +29978 -27215
- package/dist/stories/Button.stories.d.ts +1 -1
- package/dist/stories/Header.stories.d.ts +1 -1
- package/dist/stories/Page.stories.d.ts +1 -1
- package/dist/useDataTableImport-COVnvslz.js +9 -0
- package/dist/useDataTableImport-DAlxBY8w.mjs +237 -0
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/logger.d.ts +9 -0
- package/package.json +6 -5
- package/src/blocks/antivirus-dashboard/AntivirusDashboard.stories.tsx +291 -0
- package/src/blocks/antivirus-dashboard/index.tsx +525 -0
- package/src/blocks/clamav-service-status/ClamAVServiceStatus.stories.tsx +195 -0
- package/src/blocks/clamav-service-status/index.tsx +370 -0
- package/src/blocks/file-scan-uploader/FileScanUploader.stories.tsx +257 -0
- package/src/blocks/file-scan-uploader/index.tsx +311 -0
- package/src/blocks/index.ts +163 -11
- package/src/blocks/quarantine-manager/QuarantineManager.stories.tsx +209 -0
- package/src/blocks/quarantine-manager/index.tsx +435 -0
- package/src/blocks/scan-history-log/ScanHistoryLog.stories.tsx +231 -0
- package/src/blocks/scan-history-log/index.tsx +406 -0
- package/src/blocks/scan-policy-editor/ScanPolicyEditor.stories.tsx +106 -0
- package/src/blocks/scan-policy-editor/index.tsx +418 -0
- package/src/blocks/scan-report-generator/ScanReportGenerator.stories.tsx +232 -0
- package/src/blocks/scan-report-generator/index.tsx +612 -0
- package/src/blocks/sidebar/index.tsx +2 -1
- package/src/blocks/signature-database-manager/SignatureDatabaseManager.stories.tsx +279 -0
- package/src/blocks/signature-database-manager/index.tsx +470 -0
- package/src/blocks/theme-creator-block/index.tsx +16 -2
- package/src/blocks/threat-alert-banner/ThreatAlertBanner.stories.tsx +152 -0
- package/src/blocks/threat-alert-banner/index.tsx +320 -0
- package/src/components/DataTable/DataTable.stories.tsx +203 -0
- package/src/components/DataTable/hooks/useDataTableExport.ts +38 -31
- package/src/components/DataTable/hooks/useDataTableImport.ts +31 -20
- package/src/components/error-boundary/ErrorBoundary.stories.tsx +125 -0
- package/src/components/index.ts +45 -4
- package/src/components/language-selector/LanguageSelector.stories.tsx +112 -0
- package/src/components/theme-selector/ThemeSelector.stories.tsx +77 -0
- package/src/components/toaster/Toaster.stories.tsx +67 -0
- package/src/components/waka-activity-feed/WakaActivityFeed.stories.tsx +116 -0
- package/src/components/waka-ad-banner/WakaAdBanner.stories.tsx +102 -0
- package/src/components/waka-ad-fallback/WakaAdFallback.stories.tsx +117 -0
- package/src/components/waka-ad-inline/WakaAdInline.stories.tsx +105 -0
- package/src/components/waka-ad-interstitial/WakaAdInterstitial.stories.tsx +92 -0
- package/src/components/waka-ad-placeholder/WakaAdPlaceholder.stories.tsx +89 -0
- package/src/components/waka-ad-provider/WakaAdProvider.stories.tsx +110 -0
- package/src/components/waka-ad-sidebar/WakaAdSidebar.stories.tsx +89 -0
- package/src/components/waka-ad-sidebar/index.tsx +3 -2
- package/src/components/waka-ad-sticky-footer/WakaAdStickyFooter.stories.tsx +88 -0
- package/src/components/waka-address-autocomplete/WakaAddressAutocomplete.stories.tsx +46 -0
- package/src/components/waka-admincrumb/WakaAdmincrumb.stories.tsx +166 -0
- package/src/components/waka-alert-panel/WakaAlertPanel.stories.tsx +45 -0
- package/src/components/waka-alert-stack/WakaAlertStack.stories.tsx +62 -0
- package/src/components/waka-allocation-matrix/WakaAllocationMatrix.stories.tsx +68 -0
- package/src/components/waka-approval-chain/WakaApprovalChain.stories.tsx +63 -0
- package/src/components/waka-audit-log/WakaAuditLog.stories.tsx +73 -0
- package/src/components/waka-autocomplete/WakaAutocomplete.stories.tsx +132 -172
- package/src/components/waka-biometric-prompt/WakaBiometricPrompt.stories.tsx +48 -0
- package/src/components/waka-breadcrumb/WakaBreadcrumb.stories.tsx +74 -191
- package/src/components/waka-breadcrumb-path/WakaBreadcrumbPath.stories.tsx +40 -0
- package/src/components/waka-budget-burn/WakaBudgetBurn.stories.tsx +86 -0
- package/src/components/waka-capacity-planner/WakaCapacityPlanner.stories.tsx +273 -0
- package/src/components/waka-cart-summary/WakaCartSummary.stories.tsx +176 -0
- package/src/components/waka-cart-summary/index.tsx +19 -10
- package/src/components/waka-challenge-timer/WakaChallengeTimer.stories.tsx +98 -0
- package/src/components/waka-chat-bubble/WakaChatBubble.stories.tsx +118 -0
- package/src/components/waka-checklist/WakaChecklist.stories.tsx +71 -0
- package/src/components/waka-checkout-stepper/WakaCheckoutStepper.stories.tsx +102 -0
- package/src/components/waka-cohort-table/WakaCohortTable.stories.tsx +56 -0
- package/src/components/waka-color-picker/WakaColorPicker.stories.tsx +99 -155
- package/src/components/waka-combo-counter/WakaComboCounter.stories.tsx +128 -0
- package/src/components/waka-command-bar/WakaCommandBar.stories.tsx +45 -0
- package/src/components/waka-compare-period/WakaComparePeriod.stories.tsx +76 -0
- package/src/components/waka-config-comparator/WakaConfigComparator.stories.tsx +143 -0
- package/src/components/waka-connection-matrix/WakaConnectionMatrix.stories.tsx +52 -0
- package/src/components/waka-content-recommendation/WakaContentRecommendation.stories.tsx +41 -0
- package/src/components/waka-coupon-input/WakaCouponInput.stories.tsx +126 -0
- package/src/components/waka-credit-card-input/WakaCreditCardInput.stories.tsx +120 -0
- package/src/components/waka-datetime-picker.form-integration/WakaDateTimePickerForm.stories.tsx +79 -0
- package/src/components/waka-dependency-tree/WakaDependencyTree.stories.tsx +72 -0
- package/src/components/waka-device-trust/WakaDeviceTrust.stories.tsx +109 -0
- package/src/components/waka-empty-state/WakaEmptyState.stories.tsx +87 -0
- package/src/components/waka-feature-announcement/WakaFeatureAnnouncement.stories.tsx +47 -0
- package/src/components/waka-feature-flag-row/WakaFeatureFlagRow.stories.tsx +188 -0
- package/src/components/waka-file-upload/WakaFileUpload.stories.tsx +118 -174
- package/src/components/waka-floating-nav/WakaFloatingNav.stories.tsx +53 -0
- package/src/components/waka-goal-progress/WakaGoalProgress.stories.tsx +137 -0
- package/src/components/waka-hotspot/WakaHotspot.stories.tsx +56 -0
- package/src/components/waka-invoice-preview/WakaInvoicePreview.stories.tsx +169 -0
- package/src/components/waka-kpi-dashboard/WakaKpiDashboard.stories.tsx +46 -0
- package/src/components/waka-level-progress/WakaLevelProgress.stories.tsx +94 -75
- package/src/components/waka-liquid-button/WakaLiquidButton.stories.tsx +45 -0
- package/src/components/waka-magic-link/WakaMagicLink.stories.tsx +61 -0
- package/src/components/waka-magnetic-button/WakaMagneticButton.stories.tsx +40 -0
- package/src/components/waka-mention-input/WakaMentionInput.stories.tsx +140 -0
- package/src/components/waka-milestone-road/WakaMilestoneRoad.stories.tsx +143 -0
- package/src/components/waka-orbital-menu/WakaOrbitalMenu.stories.tsx +54 -0
- package/src/components/waka-order-tracker/WakaOrderTracker.stories.tsx +163 -0
- package/src/components/waka-outstream-video/WakaOutstreamVideo.stories.tsx +94 -0
- package/src/components/waka-pagination/WakaPagination.stories.tsx +110 -280
- package/src/components/waka-password-strength/WakaPasswordStrength.stories.tsx +132 -268
- package/src/components/waka-payment-method-picker/WakaPaymentMethodPicker.stories.tsx +141 -0
- package/src/components/waka-permission-matrix/WakaPermissionMatrix.stories.tsx +124 -0
- package/src/components/waka-phone-input/WakaPhoneInput.stories.tsx +56 -0
- package/src/components/waka-points-popup/WakaPointsPopup.stories.tsx +96 -0
- package/src/components/waka-power-up/WakaPowerUp.stories.tsx +121 -0
- package/src/components/waka-presence-indicator/WakaPresenceIndicator.stories.tsx +49 -0
- package/src/components/waka-pricing-table/WakaPricingTable.stories.tsx +159 -0
- package/src/components/waka-product-card/WakaProductCard.stories.tsx +202 -0
- package/src/components/waka-progress-onboarding/WakaProgressOnboarding.stories.tsx +57 -0
- package/src/components/waka-pull-to-refresh/WakaPullToRefresh.stories.tsx +51 -0
- package/src/components/waka-rank-badge/WakaRankBadge.stories.tsx +108 -0
- package/src/components/waka-rating-input/WakaRatingInput.stories.tsx +51 -0
- package/src/components/waka-reaction-picker/WakaReactionPicker.stories.tsx +52 -0
- package/src/components/waka-region-map/WakaRegionMap.stories.tsx +181 -0
- package/src/components/waka-resource-pool/WakaResourcePool.stories.tsx +70 -0
- package/src/components/waka-rich-text-editor/WakaRichTextEditor.stories.tsx +108 -197
- package/src/components/waka-rollback-slider/WakaRollbackSlider.stories.tsx +41 -0
- package/src/components/waka-schedule-picker/WakaSchedulePicker.stories.tsx +64 -0
- package/src/components/waka-season-pass/WakaSeasonPass.stories.tsx +107 -0
- package/src/components/waka-security-scan-result/WakaSecurityScanResult.stories.tsx +146 -0
- package/src/components/waka-security-score/WakaSecurityScore.stories.tsx +63 -0
- package/src/components/waka-session-manager/WakaSessionManager.stories.tsx +68 -0
- package/src/components/waka-signature-pad/WakaSignaturePad.stories.tsx +159 -0
- package/src/components/waka-signature-pad/index.tsx +5 -3
- package/src/components/waka-sla-tracker/WakaSlaTracker.stories.tsx +65 -0
- package/src/components/waka-slider-range/WakaSliderRange.stories.tsx +66 -0
- package/src/components/waka-sponsored-badge/WakaSponsoredBadge.stories.tsx +60 -0
- package/src/components/waka-sponsored-card/WakaSponsoredCard.stories.tsx +64 -0
- package/src/components/waka-sponsored-feed/WakaSponsoredFeed.stories.tsx +58 -0
- package/src/components/waka-spotlight/WakaSpotlight.stories.tsx +53 -0
- package/src/components/waka-stats-hexagon/WakaStatsHexagon.stories.tsx +161 -0
- package/src/components/waka-stepper/WakaStepper.stories.tsx +137 -410
- package/src/components/waka-swipe-card/WakaSwipeCard.stories.tsx +51 -0
- package/src/components/waka-tag-input/WakaTagInput.stories.tsx +224 -0
- package/src/components/waka-team-banner/WakaTeamBanner.stories.tsx +50 -0
- package/src/components/waka-theme-creator/WakaThemeCreator.stories.tsx +58 -0
- package/src/components/waka-theme-manager/WakaThemeManager.stories.tsx +298 -0
- package/src/components/waka-theme-manager/index.tsx +6 -11
- package/src/components/waka-thread-view/WakaThreadView.stories.tsx +143 -0
- package/src/components/waka-timeline/WakaTimeline.stories.tsx +171 -324
- package/src/components/waka-tooltip-tour/WakaTooltipTour.stories.tsx +92 -0
- package/src/components/waka-tour-guide/WakaTourGuide.stories.tsx +89 -0
- package/src/components/waka-treemap-chart/WakaTreemapChart.stories.tsx +234 -129
- package/src/components/waka-treemap-chart/index.tsx +2 -2
- package/src/components/waka-two-factor-setup/WakaTwoFactorSetup.stories.tsx +142 -0
- package/src/components/waka-typing-indicator/WakaTypingIndicator.stories.tsx +134 -0
- package/src/components/waka-video-ad/WakaVideoAd.stories.tsx +138 -0
- package/src/components/waka-video-call/WakaVideoCall.stories.tsx +186 -0
- package/src/components/waka-video-overlay/WakaVideoOverlay.stories.tsx +100 -0
- package/src/components/waka-voice-message/WakaVoiceMessage.stories.tsx +190 -0
- package/src/components/waka-welcome-modal/WakaWelcomeModal.stories.tsx +87 -0
- package/src/components/waka-xp-bar/WakaXPBar.stories.tsx +29 -29
- package/dist/useDataTableImport-D8R2HQl6.mjs +0 -229
- package/dist/useDataTableImport-S_hhA5Wo.js +0 -9
- 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
|
|
2
|
-
import { WakaColorPicker } from
|
|
3
|
-
import
|
|
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:
|
|
6
|
+
title: "Forms/WakaColorPicker",
|
|
7
7
|
component: WakaColorPicker,
|
|
8
8
|
parameters: {
|
|
9
|
-
layout:
|
|
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: [
|
|
11
|
+
tags: ["autodocs"],
|
|
17
12
|
argTypes: {
|
|
13
|
+
value: {
|
|
14
|
+
control: "color",
|
|
15
|
+
description: "Valeur de la couleur",
|
|
16
|
+
},
|
|
18
17
|
format: {
|
|
19
|
-
control:
|
|
20
|
-
options: [
|
|
21
|
-
description:
|
|
18
|
+
control: "select",
|
|
19
|
+
options: ["hex", "rgb", "hsl"],
|
|
20
|
+
description: "Format de la couleur",
|
|
22
21
|
},
|
|
23
|
-
|
|
24
|
-
control:
|
|
25
|
-
|
|
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:
|
|
30
|
-
description:
|
|
27
|
+
control: "boolean",
|
|
28
|
+
description: "Afficher les couleurs prédéfinies",
|
|
31
29
|
},
|
|
32
30
|
showEyeDropper: {
|
|
33
|
-
control:
|
|
34
|
-
description: '
|
|
31
|
+
control: "boolean",
|
|
32
|
+
description: "Afficher l'outil EyeDropper",
|
|
35
33
|
},
|
|
36
34
|
disabled: {
|
|
37
|
-
control:
|
|
38
|
-
description:
|
|
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
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
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
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
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
|
|
132
|
-
|
|
133
|
-
|
|
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
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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
|
-
|
|
150
|
-
|
|
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
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
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
|
}
|