@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,146 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react"
|
|
2
|
+
import { WakaSecurityScanResult, type Vulnerability } from "./index"
|
|
3
|
+
|
|
4
|
+
const meta: Meta<typeof WakaSecurityScanResult> = {
|
|
5
|
+
title: "Security/WakaSecurityScanResult",
|
|
6
|
+
component: WakaSecurityScanResult,
|
|
7
|
+
parameters: { layout: "padded" },
|
|
8
|
+
tags: ["autodocs"],
|
|
9
|
+
argTypes: {
|
|
10
|
+
scanType: {
|
|
11
|
+
control: "select",
|
|
12
|
+
options: ["sast", "dast", "sca", "secret", "container", "all"],
|
|
13
|
+
description: "Type de scan",
|
|
14
|
+
},
|
|
15
|
+
title: { control: "text", description: "Titre du rapport" },
|
|
16
|
+
},
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export default meta
|
|
20
|
+
type Story = StoryObj<typeof WakaSecurityScanResult>
|
|
21
|
+
|
|
22
|
+
const vulnerabilities: Vulnerability[] = [
|
|
23
|
+
{
|
|
24
|
+
id: "1",
|
|
25
|
+
title: "SQL Injection",
|
|
26
|
+
severity: "critical",
|
|
27
|
+
type: "sast",
|
|
28
|
+
file: "src/api/users.ts",
|
|
29
|
+
line: 45,
|
|
30
|
+
cweId: "CWE-89",
|
|
31
|
+
description: "User input is not sanitized before SQL query",
|
|
32
|
+
remediation: "Use parameterized queries or prepared statements",
|
|
33
|
+
cvssScore: 9.8,
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
id: "2",
|
|
37
|
+
title: "Cross-Site Scripting (XSS)",
|
|
38
|
+
severity: "high",
|
|
39
|
+
type: "dast",
|
|
40
|
+
file: "src/components/Comment.tsx",
|
|
41
|
+
line: 23,
|
|
42
|
+
cweId: "CWE-79",
|
|
43
|
+
description: "Unsanitized HTML rendering allows script injection",
|
|
44
|
+
remediation: "Sanitize and escape all user-provided content",
|
|
45
|
+
cvssScore: 7.5,
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
id: "3",
|
|
49
|
+
title: "Insecure Dependency",
|
|
50
|
+
severity: "medium",
|
|
51
|
+
type: "sca",
|
|
52
|
+
package: "lodash",
|
|
53
|
+
version: "4.17.20",
|
|
54
|
+
fixedVersion: "4.17.21",
|
|
55
|
+
description: "Prototype pollution vulnerability in lodash",
|
|
56
|
+
remediation: "Upgrade lodash to version 4.17.21 or later",
|
|
57
|
+
cveId: "CVE-2021-23337",
|
|
58
|
+
cvssScore: 6.5,
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
id: "4",
|
|
62
|
+
title: "Hardcoded Secret",
|
|
63
|
+
severity: "high",
|
|
64
|
+
type: "secret",
|
|
65
|
+
file: "src/config.ts",
|
|
66
|
+
line: 12,
|
|
67
|
+
description: "API key found in source code",
|
|
68
|
+
remediation: "Remove the hardcoded key and use environment variables",
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
id: "5",
|
|
72
|
+
title: "Missing HTTPS",
|
|
73
|
+
severity: "low",
|
|
74
|
+
type: "dast",
|
|
75
|
+
file: "src/api/client.ts",
|
|
76
|
+
line: 8,
|
|
77
|
+
description: "HTTP connection instead of HTTPS",
|
|
78
|
+
remediation: "Use HTTPS for all API connections",
|
|
79
|
+
},
|
|
80
|
+
]
|
|
81
|
+
|
|
82
|
+
export const Default: Story = {
|
|
83
|
+
args: {
|
|
84
|
+
vulnerabilities,
|
|
85
|
+
scanType: "all",
|
|
86
|
+
scannedAt: new Date(),
|
|
87
|
+
title: "Security Scan Results",
|
|
88
|
+
},
|
|
89
|
+
render: (args) => <WakaSecurityScanResult {...args} />,
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export const Clean: Story = {
|
|
93
|
+
args: {
|
|
94
|
+
vulnerabilities: [],
|
|
95
|
+
scanType: "sast",
|
|
96
|
+
scannedAt: new Date(),
|
|
97
|
+
title: "SAST Scan Results",
|
|
98
|
+
},
|
|
99
|
+
render: (args) => <WakaSecurityScanResult {...args} />,
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export const CriticalOnly: Story = {
|
|
103
|
+
args: {
|
|
104
|
+
vulnerabilities: vulnerabilities.filter(
|
|
105
|
+
(v) => v.severity === "critical" || v.severity === "high"
|
|
106
|
+
),
|
|
107
|
+
scanType: "dast",
|
|
108
|
+
scannedAt: new Date(),
|
|
109
|
+
title: "Critical Issues",
|
|
110
|
+
},
|
|
111
|
+
render: (args) => <WakaSecurityScanResult {...args} />,
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export const DependencyScan: Story = {
|
|
115
|
+
args: {
|
|
116
|
+
vulnerabilities: [
|
|
117
|
+
{
|
|
118
|
+
id: "1",
|
|
119
|
+
title: "Prototype Pollution",
|
|
120
|
+
severity: "critical",
|
|
121
|
+
type: "sca",
|
|
122
|
+
package: "lodash",
|
|
123
|
+
version: "4.17.20",
|
|
124
|
+
fixedVersion: "4.17.21",
|
|
125
|
+
description: "Prototype pollution vulnerability allows property injection",
|
|
126
|
+
cveId: "CVE-2021-23337",
|
|
127
|
+
cvssScore: 9.1,
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
id: "2",
|
|
131
|
+
title: "ReDoS",
|
|
132
|
+
severity: "medium",
|
|
133
|
+
type: "sca",
|
|
134
|
+
package: "minimatch",
|
|
135
|
+
version: "3.0.4",
|
|
136
|
+
fixedVersion: "3.1.2",
|
|
137
|
+
description: "Regular expression denial of service vulnerability",
|
|
138
|
+
cvssScore: 5.3,
|
|
139
|
+
},
|
|
140
|
+
],
|
|
141
|
+
scanType: "sca",
|
|
142
|
+
scannedAt: new Date(),
|
|
143
|
+
title: "Dependency Scan Results",
|
|
144
|
+
},
|
|
145
|
+
render: (args) => <WakaSecurityScanResult {...args} />,
|
|
146
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react"
|
|
2
|
+
import { WakaSecurityScore } from "./index"
|
|
3
|
+
|
|
4
|
+
const meta: Meta<typeof WakaSecurityScore> = {
|
|
5
|
+
title: "Security/WakaSecurityScore",
|
|
6
|
+
component: WakaSecurityScore,
|
|
7
|
+
parameters: { layout: "centered" },
|
|
8
|
+
tags: ["autodocs"],
|
|
9
|
+
argTypes: {
|
|
10
|
+
score: { control: { type: "number", min: 0, max: 100 }, description: "Score de sécurité" },
|
|
11
|
+
showBreakdown: { control: "boolean", description: "Afficher le détail" },
|
|
12
|
+
showTrend: { control: "boolean", description: "Afficher la tendance" },
|
|
13
|
+
size: { control: "select", options: ["sm", "md", "lg"], description: "Taille" },
|
|
14
|
+
},
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export default meta
|
|
18
|
+
type Story = StoryObj<typeof WakaSecurityScore>
|
|
19
|
+
|
|
20
|
+
const breakdown = [
|
|
21
|
+
{ category: "Authentication", score: 95, maxScore: 100 },
|
|
22
|
+
{ category: "Data Protection", score: 80, maxScore: 100 },
|
|
23
|
+
{ category: "Network Security", score: 70, maxScore: 100 },
|
|
24
|
+
{ category: "Access Control", score: 85, maxScore: 100 },
|
|
25
|
+
]
|
|
26
|
+
|
|
27
|
+
export const Default: Story = {
|
|
28
|
+
args: { score: 82, showBreakdown: true, breakdown, showTrend: true, trend: "up", previousScore: 78 },
|
|
29
|
+
render: (args) => (
|
|
30
|
+
<div style={{ width: 350 }}>
|
|
31
|
+
<WakaSecurityScore {...args} />
|
|
32
|
+
</div>
|
|
33
|
+
),
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export const Excellent: Story = {
|
|
37
|
+
args: { score: 95, showBreakdown: true, breakdown: breakdown.map(b => ({ ...b, score: 90 + Math.random() * 10 })), showTrend: true, trend: "up" },
|
|
38
|
+
render: (args) => (
|
|
39
|
+
<div style={{ width: 350 }}>
|
|
40
|
+
<WakaSecurityScore {...args} />
|
|
41
|
+
</div>
|
|
42
|
+
),
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export const Poor: Story = {
|
|
46
|
+
args: { score: 45, showBreakdown: true, breakdown: breakdown.map(b => ({ ...b, score: 30 + Math.random() * 30 })), showTrend: true, trend: "down" },
|
|
47
|
+
render: (args) => (
|
|
48
|
+
<div style={{ width: 350 }}>
|
|
49
|
+
<WakaSecurityScore {...args} />
|
|
50
|
+
</div>
|
|
51
|
+
),
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export const ScoreOnly: Story = {
|
|
55
|
+
args: { score: 72, showBreakdown: false, size: "lg" },
|
|
56
|
+
render: (args) => <WakaSecurityScore {...args} />,
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export const SmallSize: Story = {
|
|
60
|
+
args: { score: 88, size: "sm" },
|
|
61
|
+
render: (args) => <WakaSecurityScore {...args} />,
|
|
62
|
+
}
|
|
63
|
+
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react"
|
|
2
|
+
import { WakaSessionManager } from "./index"
|
|
3
|
+
|
|
4
|
+
const meta: Meta<typeof WakaSessionManager> = {
|
|
5
|
+
title: "Security/WakaSessionManager",
|
|
6
|
+
component: WakaSessionManager,
|
|
7
|
+
parameters: { layout: "centered" },
|
|
8
|
+
tags: ["autodocs"],
|
|
9
|
+
argTypes: {
|
|
10
|
+
showLocation: { control: "boolean", description: "Afficher la localisation" },
|
|
11
|
+
showLogoutAll: { control: "boolean", description: "Bouton déconnexion globale" },
|
|
12
|
+
showLogoutOther: { control: "boolean", description: "Déconnexion autres sessions" },
|
|
13
|
+
},
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export default meta
|
|
17
|
+
type Story = StoryObj<typeof WakaSessionManager>
|
|
18
|
+
|
|
19
|
+
const sessions = [
|
|
20
|
+
{ id: "1", device: "Chrome on macOS", deviceType: "desktop" as const, location: { city: "Paris", country: "France" }, lastActive: new Date(), current: true, ip: "192.168.1.1" },
|
|
21
|
+
{ id: "2", device: "Safari on iPhone", deviceType: "mobile" as const, location: { city: "Lyon", country: "France" }, lastActive: new Date(Date.now() - 3600000), current: false, ip: "10.0.0.1" },
|
|
22
|
+
{ id: "3", device: "Firefox on Windows", deviceType: "desktop" as const, location: { city: "Berlin", country: "Germany" }, lastActive: new Date(Date.now() - 86400000), current: false, ip: "172.16.0.1" },
|
|
23
|
+
]
|
|
24
|
+
|
|
25
|
+
export const Default: Story = {
|
|
26
|
+
args: { sessions, showLocation: true, showLogoutAll: true, showLogoutOther: true },
|
|
27
|
+
render: (args) => (
|
|
28
|
+
<div style={{ width: 500 }}>
|
|
29
|
+
<WakaSessionManager {...args} />
|
|
30
|
+
</div>
|
|
31
|
+
),
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export const SingleSession: Story = {
|
|
35
|
+
args: { sessions: [sessions[0]], showLocation: true },
|
|
36
|
+
render: (args) => (
|
|
37
|
+
<div style={{ width: 500 }}>
|
|
38
|
+
<WakaSessionManager {...args} />
|
|
39
|
+
</div>
|
|
40
|
+
),
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export const NoLocation: Story = {
|
|
44
|
+
args: { sessions, showLocation: false, showLogoutAll: true },
|
|
45
|
+
render: (args) => (
|
|
46
|
+
<div style={{ width: 500 }}>
|
|
47
|
+
<WakaSessionManager {...args} />
|
|
48
|
+
</div>
|
|
49
|
+
),
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export const ManySessions: Story = {
|
|
53
|
+
args: {
|
|
54
|
+
sessions: [
|
|
55
|
+
...sessions,
|
|
56
|
+
{ id: "4", device: "Edge on Windows", deviceType: "desktop" as const, lastActive: new Date(Date.now() - 172800000), current: false },
|
|
57
|
+
{ id: "5", device: "Chrome on Android", deviceType: "mobile" as const, lastActive: new Date(Date.now() - 259200000), current: false },
|
|
58
|
+
],
|
|
59
|
+
showLocation: true,
|
|
60
|
+
showLogoutAll: true,
|
|
61
|
+
},
|
|
62
|
+
render: (args) => (
|
|
63
|
+
<div style={{ width: 500 }}>
|
|
64
|
+
<WakaSessionManager {...args} />
|
|
65
|
+
</div>
|
|
66
|
+
),
|
|
67
|
+
}
|
|
68
|
+
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react"
|
|
2
|
+
import { WakaSignaturePad } from "./index"
|
|
3
|
+
|
|
4
|
+
const meta: Meta<typeof WakaSignaturePad> = {
|
|
5
|
+
title: "Forms/WakaSignaturePad",
|
|
6
|
+
component: WakaSignaturePad,
|
|
7
|
+
parameters: { layout: "centered" },
|
|
8
|
+
tags: ["autodocs"],
|
|
9
|
+
argTypes: {
|
|
10
|
+
penColor: { control: "color", description: "Couleur du stylo" },
|
|
11
|
+
backgroundColor: { control: "color", description: "Couleur de fond" },
|
|
12
|
+
penSize: { control: { type: "range", min: 1, max: 10 }, description: "Taille du stylo" },
|
|
13
|
+
showToolbar: { control: "boolean", description: "Afficher la barre d'outils" },
|
|
14
|
+
showGuideLine: { control: "boolean", description: "Afficher la ligne de guidage" },
|
|
15
|
+
disabled: { control: "boolean", description: "Désactivé" },
|
|
16
|
+
readOnly: { control: "boolean", description: "Lecture seule" },
|
|
17
|
+
placeholder: { control: "text", description: "Texte placeholder" },
|
|
18
|
+
},
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export default meta
|
|
22
|
+
type Story = StoryObj<typeof WakaSignaturePad>
|
|
23
|
+
|
|
24
|
+
export const Default: Story = {
|
|
25
|
+
args: {
|
|
26
|
+
penColor: "#000000",
|
|
27
|
+
backgroundColor: "#ffffff",
|
|
28
|
+
showToolbar: true,
|
|
29
|
+
showGuideLine: true,
|
|
30
|
+
},
|
|
31
|
+
render: (args) => (
|
|
32
|
+
<div style={{ width: 400 }}>
|
|
33
|
+
<WakaSignaturePad {...args} />
|
|
34
|
+
</div>
|
|
35
|
+
),
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export const BlueInk: Story = {
|
|
39
|
+
args: {
|
|
40
|
+
penColor: "#1e40af",
|
|
41
|
+
backgroundColor: "#f8fafc",
|
|
42
|
+
showToolbar: true,
|
|
43
|
+
},
|
|
44
|
+
render: (args) => (
|
|
45
|
+
<div style={{ width: 400 }}>
|
|
46
|
+
<WakaSignaturePad {...args} />
|
|
47
|
+
</div>
|
|
48
|
+
),
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export const DarkMode: Story = {
|
|
52
|
+
args: {
|
|
53
|
+
penColor: "#ffffff",
|
|
54
|
+
backgroundColor: "#1e293b",
|
|
55
|
+
showToolbar: true,
|
|
56
|
+
showGuideLine: true,
|
|
57
|
+
guideLineColor: "#475569",
|
|
58
|
+
},
|
|
59
|
+
render: (args) => (
|
|
60
|
+
<div style={{ width: 400 }}>
|
|
61
|
+
<WakaSignaturePad {...args} />
|
|
62
|
+
</div>
|
|
63
|
+
),
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export const Disabled: Story = {
|
|
67
|
+
args: {
|
|
68
|
+
penColor: "#000000",
|
|
69
|
+
disabled: true,
|
|
70
|
+
showToolbar: true,
|
|
71
|
+
},
|
|
72
|
+
render: (args) => (
|
|
73
|
+
<div style={{ width: 400 }}>
|
|
74
|
+
<WakaSignaturePad {...args} />
|
|
75
|
+
</div>
|
|
76
|
+
),
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export const ReadOnly: Story = {
|
|
80
|
+
args: {
|
|
81
|
+
penColor: "#000000",
|
|
82
|
+
readOnly: true,
|
|
83
|
+
showToolbar: false,
|
|
84
|
+
},
|
|
85
|
+
render: (args) => (
|
|
86
|
+
<div style={{ width: 400 }}>
|
|
87
|
+
<WakaSignaturePad {...args} />
|
|
88
|
+
</div>
|
|
89
|
+
),
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export const NoToolbar: Story = {
|
|
93
|
+
args: {
|
|
94
|
+
showToolbar: false,
|
|
95
|
+
showGuideLine: true,
|
|
96
|
+
},
|
|
97
|
+
render: (args) => (
|
|
98
|
+
<div style={{ width: 300 }}>
|
|
99
|
+
<WakaSignaturePad {...args} />
|
|
100
|
+
</div>
|
|
101
|
+
),
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export const CustomPlaceholder: Story = {
|
|
105
|
+
args: {
|
|
106
|
+
placeholder: "Veuillez signer ici",
|
|
107
|
+
placeholderColor: "#6b7280",
|
|
108
|
+
showToolbar: true,
|
|
109
|
+
showGuideLine: true,
|
|
110
|
+
},
|
|
111
|
+
render: (args) => (
|
|
112
|
+
<div style={{ width: 400 }}>
|
|
113
|
+
<WakaSignaturePad {...args} />
|
|
114
|
+
</div>
|
|
115
|
+
),
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export const CustomPenOptions: Story = {
|
|
119
|
+
args: {
|
|
120
|
+
penColor: "#dc2626",
|
|
121
|
+
penSize: 3,
|
|
122
|
+
penColors: ["#000000", "#dc2626", "#2563eb", "#16a34a", "#9333ea"],
|
|
123
|
+
penSizes: [1, 2, 3, 5, 8],
|
|
124
|
+
showToolbar: true,
|
|
125
|
+
},
|
|
126
|
+
render: (args) => (
|
|
127
|
+
<div style={{ width: 400 }}>
|
|
128
|
+
<WakaSignaturePad {...args} />
|
|
129
|
+
</div>
|
|
130
|
+
),
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export const LargeSize: Story = {
|
|
134
|
+
args: {
|
|
135
|
+
width: 600,
|
|
136
|
+
height: 300,
|
|
137
|
+
showToolbar: true,
|
|
138
|
+
showGuideLine: true,
|
|
139
|
+
},
|
|
140
|
+
render: (args) => (
|
|
141
|
+
<div style={{ width: 600 }}>
|
|
142
|
+
<WakaSignaturePad {...args} />
|
|
143
|
+
</div>
|
|
144
|
+
),
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export const WithAspectRatio: Story = {
|
|
148
|
+
args: {
|
|
149
|
+
width: 500,
|
|
150
|
+
aspectRatio: 16 / 9,
|
|
151
|
+
showToolbar: true,
|
|
152
|
+
showGuideLine: true,
|
|
153
|
+
},
|
|
154
|
+
render: (args) => (
|
|
155
|
+
<div style={{ width: 500 }}>
|
|
156
|
+
<WakaSignaturePad {...args} />
|
|
157
|
+
</div>
|
|
158
|
+
),
|
|
159
|
+
}
|
|
@@ -77,7 +77,7 @@ export interface UseSignaturePadOptions {
|
|
|
77
77
|
}
|
|
78
78
|
|
|
79
79
|
export interface UseSignaturePadReturn {
|
|
80
|
-
canvasRef: React.RefObject<HTMLCanvasElement
|
|
80
|
+
canvasRef: React.RefObject<HTMLCanvasElement>
|
|
81
81
|
strokes: Stroke[]
|
|
82
82
|
currentStroke: Stroke | null
|
|
83
83
|
isDrawing: boolean
|
|
@@ -108,7 +108,7 @@ export function useSignaturePad(options: UseSignaturePadOptions = {}): UseSignat
|
|
|
108
108
|
onChange,
|
|
109
109
|
} = options
|
|
110
110
|
|
|
111
|
-
const canvasRef = React.useRef<HTMLCanvasElement
|
|
111
|
+
const canvasRef = React.useRef<HTMLCanvasElement>(null!)
|
|
112
112
|
const [strokes, setStrokes] = React.useState<Stroke[]>([])
|
|
113
113
|
const [currentStroke, setCurrentStroke] = React.useState<Stroke | null>(null)
|
|
114
114
|
const [isDrawing, setIsDrawing] = React.useState(false)
|
|
@@ -495,10 +495,12 @@ export const WakaSignaturePad = React.forwardRef<
|
|
|
495
495
|
if ("touches" in e) {
|
|
496
496
|
const touch = e.touches[0]
|
|
497
497
|
if (!touch) return null
|
|
498
|
+
// Force is a non-standard property, cast to access it safely
|
|
499
|
+
const touchWithForce = touch as Touch & { force?: number }
|
|
498
500
|
return {
|
|
499
501
|
x: (touch.clientX - rect.left) * scaleX,
|
|
500
502
|
y: (touch.clientY - rect.top) * scaleY,
|
|
501
|
-
pressure:
|
|
503
|
+
pressure: touchWithForce.force ?? 0.5,
|
|
502
504
|
}
|
|
503
505
|
}
|
|
504
506
|
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react"
|
|
2
|
+
import { WakaSLATracker } from "./index"
|
|
3
|
+
|
|
4
|
+
const meta: Meta<typeof WakaSLATracker> = {
|
|
5
|
+
title: "DevOps/WakaSLATracker",
|
|
6
|
+
component: WakaSLATracker,
|
|
7
|
+
parameters: { layout: "centered" },
|
|
8
|
+
tags: ["autodocs"],
|
|
9
|
+
argTypes: {
|
|
10
|
+
uptime: { control: { type: "number", min: 0, max: 100, step: 0.01 }, description: "Uptime actuel (%)" },
|
|
11
|
+
target: { control: { type: "number", min: 0, max: 100, step: 0.01 }, description: "Objectif SLA (%)" },
|
|
12
|
+
period: { control: "select", options: ["day", "week", "month", "quarter", "year"], description: "Période" },
|
|
13
|
+
showErrorBudget: { control: "boolean", description: "Afficher le budget d'erreur" },
|
|
14
|
+
showTrend: { control: "boolean", description: "Afficher la tendance" },
|
|
15
|
+
},
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export default meta
|
|
19
|
+
type Story = StoryObj<typeof WakaSLATracker>
|
|
20
|
+
|
|
21
|
+
export const Default: Story = {
|
|
22
|
+
args: { uptime: 99.95, target: 99.9, period: "month", showErrorBudget: true, showTrend: true },
|
|
23
|
+
render: (args) => (
|
|
24
|
+
<div style={{ width: 350 }}>
|
|
25
|
+
<WakaSLATracker {...args} />
|
|
26
|
+
</div>
|
|
27
|
+
),
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export const Healthy: Story = {
|
|
31
|
+
args: { uptime: 99.99, target: 99.9, period: "month", showErrorBudget: true, trend: "up" },
|
|
32
|
+
render: (args) => (
|
|
33
|
+
<div style={{ width: 350 }}>
|
|
34
|
+
<WakaSLATracker {...args} />
|
|
35
|
+
</div>
|
|
36
|
+
),
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export const Warning: Story = {
|
|
40
|
+
args: { uptime: 99.85, target: 99.9, period: "month", showErrorBudget: true, errorBudget: { used: 70, total: 100 } },
|
|
41
|
+
render: (args) => (
|
|
42
|
+
<div style={{ width: 350 }}>
|
|
43
|
+
<WakaSLATracker {...args} />
|
|
44
|
+
</div>
|
|
45
|
+
),
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export const Breached: Story = {
|
|
49
|
+
args: { uptime: 99.5, target: 99.9, period: "quarter", showErrorBudget: true, trend: "down" },
|
|
50
|
+
render: (args) => (
|
|
51
|
+
<div style={{ width: 350 }}>
|
|
52
|
+
<WakaSLATracker {...args} />
|
|
53
|
+
</div>
|
|
54
|
+
),
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export const YearlyView: Story = {
|
|
58
|
+
args: { uptime: 99.97, target: 99.9, period: "year", showErrorBudget: true, showTrend: true },
|
|
59
|
+
render: (args) => (
|
|
60
|
+
<div style={{ width: 350 }}>
|
|
61
|
+
<WakaSLATracker {...args} />
|
|
62
|
+
</div>
|
|
63
|
+
),
|
|
64
|
+
}
|
|
65
|
+
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react"
|
|
2
|
+
import { WakaSliderRange } from "./index"
|
|
3
|
+
|
|
4
|
+
const meta: Meta<typeof WakaSliderRange> = {
|
|
5
|
+
title: "Forms/WakaSliderRange",
|
|
6
|
+
component: WakaSliderRange,
|
|
7
|
+
parameters: { layout: "centered" },
|
|
8
|
+
tags: ["autodocs"],
|
|
9
|
+
argTypes: {
|
|
10
|
+
min: { control: "number", description: "Valeur minimale" },
|
|
11
|
+
max: { control: "number", description: "Valeur maximale" },
|
|
12
|
+
step: { control: "number", description: "Pas" },
|
|
13
|
+
showLabels: { control: "boolean", description: "Afficher les labels" },
|
|
14
|
+
showValue: { control: "boolean", description: "Afficher la valeur" },
|
|
15
|
+
disabled: { control: "boolean", description: "Désactivé" },
|
|
16
|
+
},
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export default meta
|
|
20
|
+
type Story = StoryObj<typeof WakaSliderRange>
|
|
21
|
+
|
|
22
|
+
export const Default: Story = {
|
|
23
|
+
args: { min: 0, max: 100, value: [20, 80], step: 1, showLabels: true, showValue: true },
|
|
24
|
+
render: (args) => (
|
|
25
|
+
<div style={{ width: 400 }}>
|
|
26
|
+
<WakaSliderRange {...args} />
|
|
27
|
+
</div>
|
|
28
|
+
),
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export const PriceRange: Story = {
|
|
32
|
+
args: { min: 0, max: 1000, value: [100, 500], step: 10, showLabels: true, showValue: true, formatValue: (v: number) => `${v}€` },
|
|
33
|
+
render: (args) => (
|
|
34
|
+
<div style={{ width: 400 }}>
|
|
35
|
+
<WakaSliderRange {...args} />
|
|
36
|
+
</div>
|
|
37
|
+
),
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export const SmallStep: Story = {
|
|
41
|
+
args: { min: 0, max: 1, value: [0.2, 0.8], step: 0.1, showValue: true },
|
|
42
|
+
render: (args) => (
|
|
43
|
+
<div style={{ width: 400 }}>
|
|
44
|
+
<WakaSliderRange {...args} />
|
|
45
|
+
</div>
|
|
46
|
+
),
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export const Disabled: Story = {
|
|
50
|
+
args: { min: 0, max: 100, value: [25, 75], disabled: true, showValue: true },
|
|
51
|
+
render: (args) => (
|
|
52
|
+
<div style={{ width: 400 }}>
|
|
53
|
+
<WakaSliderRange {...args} />
|
|
54
|
+
</div>
|
|
55
|
+
),
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export const NoLabels: Story = {
|
|
59
|
+
args: { min: 0, max: 100, value: [30, 70], showLabels: false, showValue: false },
|
|
60
|
+
render: (args) => (
|
|
61
|
+
<div style={{ width: 350 }}>
|
|
62
|
+
<WakaSliderRange {...args} />
|
|
63
|
+
</div>
|
|
64
|
+
),
|
|
65
|
+
}
|
|
66
|
+
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react"
|
|
2
|
+
import { WakaSponsoredBadge } from "./index"
|
|
3
|
+
|
|
4
|
+
const meta: Meta<typeof WakaSponsoredBadge> = {
|
|
5
|
+
title: "Sponsoring/WakaSponsoredBadge",
|
|
6
|
+
component: WakaSponsoredBadge,
|
|
7
|
+
parameters: { layout: "centered" },
|
|
8
|
+
tags: ["autodocs"],
|
|
9
|
+
argTypes: {
|
|
10
|
+
variant: { control: "select", options: ["default", "subtle", "outline", "dark"], description: "Variante" },
|
|
11
|
+
size: { control: "select", options: ["sm", "md", "lg"], description: "Taille" },
|
|
12
|
+
sponsor: { control: "text", description: "Nom du sponsor" },
|
|
13
|
+
label: { control: "text", description: "Label personnalisé" },
|
|
14
|
+
showIcon: { control: "boolean", description: "Afficher l'icône info" },
|
|
15
|
+
},
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export default meta
|
|
19
|
+
type Story = StoryObj<typeof WakaSponsoredBadge>
|
|
20
|
+
|
|
21
|
+
export const Default: Story = {
|
|
22
|
+
args: { variant: "default", size: "md" },
|
|
23
|
+
render: (args) => <WakaSponsoredBadge {...args} />,
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export const WithSponsor: Story = {
|
|
27
|
+
args: { variant: "default", size: "md", sponsor: "WakaStart", showIcon: true },
|
|
28
|
+
render: (args) => <WakaSponsoredBadge {...args} />,
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export const Subtle: Story = {
|
|
32
|
+
args: { variant: "subtle", size: "md", label: "Partenaire" },
|
|
33
|
+
render: (args) => <WakaSponsoredBadge {...args} />,
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export const Outline: Story = {
|
|
37
|
+
args: { variant: "outline", size: "md" },
|
|
38
|
+
render: (args) => <WakaSponsoredBadge {...args} />,
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export const Dark: Story = {
|
|
42
|
+
args: { variant: "dark", size: "md", sponsor: "Premium Partner" },
|
|
43
|
+
render: (args) => <WakaSponsoredBadge {...args} />,
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export const Small: Story = {
|
|
47
|
+
args: { variant: "default", size: "sm" },
|
|
48
|
+
render: (args) => <WakaSponsoredBadge {...args} />,
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export const Large: Story = {
|
|
52
|
+
args: { variant: "default", size: "lg", sponsor: "Sponsor Premium", showIcon: true },
|
|
53
|
+
render: (args) => <WakaSponsoredBadge {...args} />,
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export const CustomLabel: Story = {
|
|
57
|
+
args: { variant: "subtle", size: "md", label: "Contenu sponsorisé" },
|
|
58
|
+
render: (args) => <WakaSponsoredBadge {...args} />,
|
|
59
|
+
}
|
|
60
|
+
|