@wakastellar/ui 2.3.5 → 3.0.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 (332) 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.d.ts +14 -0
  21. package/dist/stories/Button.stories.d.ts +8 -0
  22. package/dist/stories/Header.d.ts +11 -0
  23. package/dist/stories/Header.stories.d.ts +6 -0
  24. package/dist/stories/Page.d.ts +2 -0
  25. package/dist/stories/Page.stories.d.ts +6 -0
  26. package/dist/useDataTableImport-COVnvslz.js +9 -0
  27. package/dist/useDataTableImport-DAlxBY8w.mjs +237 -0
  28. package/dist/utils/index.d.ts +1 -0
  29. package/dist/utils/logger.d.ts +9 -0
  30. package/package.json +14 -6
  31. package/src/blocks/activity-timeline/ActivityTimeline.stories.tsx +460 -0
  32. package/src/blocks/antivirus-dashboard/AntivirusDashboard.stories.tsx +291 -0
  33. package/src/blocks/antivirus-dashboard/index.tsx +525 -0
  34. package/src/blocks/apm-overview/APMOverview.stories.tsx +435 -0
  35. package/src/blocks/auth-2fa/Auth2FA.stories.tsx +308 -0
  36. package/src/blocks/calendar-view/CalendarView.stories.tsx +398 -0
  37. package/src/blocks/chat/Chat.stories.tsx +466 -0
  38. package/src/blocks/chat-interface/ChatInterface.stories.tsx +412 -0
  39. package/src/blocks/checkout-flow/CheckoutFlow.stories.tsx +408 -0
  40. package/src/blocks/cicd-builder/CICDBuilder.stories.tsx +499 -0
  41. package/src/blocks/clamav-service-status/ClamAVServiceStatus.stories.tsx +195 -0
  42. package/src/blocks/clamav-service-status/index.tsx +370 -0
  43. package/src/blocks/cloud-cost-dashboard/CloudCostDashboard.stories.tsx +356 -0
  44. package/src/blocks/container-orchestrator/ContainerOrchestrator.stories.tsx +461 -0
  45. package/src/blocks/dashboard/Dashboard.stories.tsx +559 -0
  46. package/src/blocks/dashboard-kpi/DashboardKPI.stories.tsx +422 -0
  47. package/src/blocks/database-admin/DatabaseAdmin.stories.tsx +393 -0
  48. package/src/blocks/deployment-dashboard/DeploymentDashboard.stories.tsx +457 -0
  49. package/src/blocks/empty-states/EmptyStates.stories.tsx +467 -0
  50. package/src/blocks/error-pages/ErrorPages.stories.tsx +401 -0
  51. package/src/blocks/faq/FAQ.stories.tsx +416 -0
  52. package/src/blocks/file-manager/FileManager.stories.tsx +413 -0
  53. package/src/blocks/file-scan-uploader/FileScanUploader.stories.tsx +257 -0
  54. package/src/blocks/file-scan-uploader/index.tsx +311 -0
  55. package/src/blocks/footer/Footer.stories.tsx +328 -0
  56. package/src/blocks/gitops-sync-status/GitOpsSyncStatus.stories.tsx +529 -0
  57. package/src/blocks/header/WakaHeader.stories.tsx +455 -0
  58. package/src/blocks/headtab/Headtab.stories.tsx +369 -0
  59. package/src/blocks/i18n-editor/I18nEditor.stories.tsx +451 -0
  60. package/src/blocks/incident-manager/IncidentManager.stories.tsx +464 -0
  61. package/src/blocks/index.ts +163 -11
  62. package/src/blocks/infrastructure-map/InfrastructureMap.stories.tsx +533 -0
  63. package/src/blocks/kanban-board/KanbanBoard.stories.tsx +494 -0
  64. package/src/blocks/landing/WakaLanding.stories.tsx +449 -0
  65. package/src/blocks/language-selector/LanguageSelector.stories.tsx +345 -0
  66. package/src/blocks/layout/Layout.stories.tsx +373 -0
  67. package/src/blocks/login/Login.stories.tsx +443 -0
  68. package/src/blocks/on-call-schedule/OnCallSchedule.stories.tsx +381 -0
  69. package/src/blocks/player-profile/PlayerProfile.stories.tsx +316 -0
  70. package/src/blocks/pricing/WakaPricing.stories.tsx +530 -0
  71. package/src/blocks/profile/Profile.stories.tsx +371 -0
  72. package/src/blocks/quarantine-manager/QuarantineManager.stories.tsx +209 -0
  73. package/src/blocks/quarantine-manager/index.tsx +435 -0
  74. package/src/blocks/release-notes/ReleaseNotes.stories.tsx +431 -0
  75. package/src/blocks/scan-history-log/ScanHistoryLog.stories.tsx +231 -0
  76. package/src/blocks/scan-history-log/index.tsx +406 -0
  77. package/src/blocks/scan-policy-editor/ScanPolicyEditor.stories.tsx +106 -0
  78. package/src/blocks/scan-policy-editor/index.tsx +418 -0
  79. package/src/blocks/scan-report-generator/ScanReportGenerator.stories.tsx +232 -0
  80. package/src/blocks/scan-report-generator/index.tsx +612 -0
  81. package/src/blocks/settings/Settings.stories.tsx +520 -0
  82. package/src/blocks/sidebar/WakaSidebar.stories.tsx +513 -0
  83. package/src/blocks/sidebar/index.tsx +2 -1
  84. package/src/blocks/signature-database-manager/SignatureDatabaseManager.stories.tsx +279 -0
  85. package/src/blocks/signature-database-manager/index.tsx +470 -0
  86. package/src/blocks/theme-creator-block/ThemeCreatorBlock.stories.tsx +370 -0
  87. package/src/blocks/theme-creator-block/index.tsx +16 -2
  88. package/src/blocks/threat-alert-banner/ThreatAlertBanner.stories.tsx +152 -0
  89. package/src/blocks/threat-alert-banner/index.tsx +320 -0
  90. package/src/blocks/user-management/UserManagement.stories.tsx +411 -0
  91. package/src/blocks/wizard/Wizard.stories.tsx +683 -0
  92. package/src/components/DataTable/DataTable.stories.tsx +203 -0
  93. package/src/components/DataTable/hooks/useDataTableExport.ts +38 -31
  94. package/src/components/DataTable/hooks/useDataTableImport.ts +31 -20
  95. package/src/components/accordion/Accordion.stories.tsx +93 -0
  96. package/src/components/alert/Alert.stories.tsx +95 -0
  97. package/src/components/alert-dialog/AlertDialog.stories.tsx +126 -0
  98. package/src/components/aspect-ratio/AspectRatio.stories.tsx +118 -0
  99. package/src/components/avatar/Avatar.stories.tsx +104 -0
  100. package/src/components/button/Button.stories.tsx +12 -1
  101. package/src/components/calendar/Calendar.stories.tsx +102 -0
  102. package/src/components/card/Card.stories.tsx +125 -0
  103. package/src/components/checkbox/Checkbox.stories.tsx +100 -0
  104. package/src/components/code/Code.stories.tsx +402 -0
  105. package/src/components/collapsible/Collapsible.stories.tsx +123 -0
  106. package/src/components/command/Command.stories.tsx +207 -0
  107. package/src/components/context-menu/ContextMenu.stories.tsx +220 -0
  108. package/src/components/dialog/Dialog.stories.tsx +157 -0
  109. package/src/components/dropdown-menu/DropdownMenu.stories.tsx +225 -0
  110. package/src/components/error-boundary/ErrorBoundary.stories.tsx +125 -0
  111. package/src/components/form/Form.stories.tsx +413 -0
  112. package/src/components/hover-card/HoverCard.stories.tsx +148 -0
  113. package/src/components/index.ts +45 -4
  114. package/src/components/input-otp/InputOTP.stories.tsx +255 -0
  115. package/src/components/label/Label.stories.tsx +68 -0
  116. package/src/components/language-selector/LanguageSelector.stories.tsx +112 -0
  117. package/src/components/menubar/Menubar.stories.tsx +278 -0
  118. package/src/components/navigation-menu/NavigationMenu.stories.tsx +202 -0
  119. package/src/components/popover/Popover.stories.tsx +199 -0
  120. package/src/components/progress/Progress.stories.tsx +104 -0
  121. package/src/components/radio-group/RadioGroup.stories.tsx +138 -0
  122. package/src/components/scroll-area/ScrollArea.stories.tsx +153 -0
  123. package/src/components/select/Select.stories.tsx +146 -0
  124. package/src/components/separator/Separator.stories.tsx +117 -0
  125. package/src/components/sheet/Sheet.stories.tsx +195 -0
  126. package/src/components/skeleton/Skeleton.stories.tsx +114 -0
  127. package/src/components/slider/Slider.stories.tsx +157 -0
  128. package/src/components/switch/Switch.stories.tsx +114 -0
  129. package/src/components/table/Table.stories.tsx +153 -0
  130. package/src/components/tabs/Tabs.stories.tsx +155 -0
  131. package/src/components/textarea/Textarea.stories.tsx +116 -0
  132. package/src/components/theme-selector/ThemeSelector.stories.tsx +77 -0
  133. package/src/components/toast/Toast.stories.tsx +160 -0
  134. package/src/components/toaster/Toaster.stories.tsx +67 -0
  135. package/src/components/toggle/Toggle.stories.tsx +125 -0
  136. package/src/components/tooltip/Tooltip.stories.tsx +133 -0
  137. package/src/components/typography/Typography.stories.tsx +207 -0
  138. package/src/components/waka-3d-pie-chart/Waka3DPieChart.stories.tsx +308 -0
  139. package/src/components/waka-achievement-unlock/WakaAchievementUnlock.stories.tsx +353 -0
  140. package/src/components/waka-activity-feed/WakaActivityFeed.stories.tsx +116 -0
  141. package/src/components/waka-ad-banner/WakaAdBanner.stories.tsx +102 -0
  142. package/src/components/waka-ad-fallback/WakaAdFallback.stories.tsx +117 -0
  143. package/src/components/waka-ad-inline/WakaAdInline.stories.tsx +105 -0
  144. package/src/components/waka-ad-interstitial/WakaAdInterstitial.stories.tsx +92 -0
  145. package/src/components/waka-ad-placeholder/WakaAdPlaceholder.stories.tsx +89 -0
  146. package/src/components/waka-ad-provider/WakaAdProvider.stories.tsx +110 -0
  147. package/src/components/waka-ad-sidebar/WakaAdSidebar.stories.tsx +89 -0
  148. package/src/components/waka-ad-sidebar/index.tsx +3 -2
  149. package/src/components/waka-ad-sticky-footer/WakaAdStickyFooter.stories.tsx +88 -0
  150. package/src/components/waka-address-autocomplete/WakaAddressAutocomplete.stories.tsx +46 -0
  151. package/src/components/waka-admincrumb/WakaAdmincrumb.stories.tsx +166 -0
  152. package/src/components/waka-alert-panel/WakaAlertPanel.stories.tsx +45 -0
  153. package/src/components/waka-alert-stack/WakaAlertStack.stories.tsx +62 -0
  154. package/src/components/waka-allocation-matrix/WakaAllocationMatrix.stories.tsx +68 -0
  155. package/src/components/waka-approval-chain/WakaApprovalChain.stories.tsx +63 -0
  156. package/src/components/waka-artifact-list/WakaArtifactList.stories.tsx +258 -0
  157. package/src/components/waka-audit-log/WakaAuditLog.stories.tsx +73 -0
  158. package/src/components/waka-autocomplete/WakaAutocomplete.stories.tsx +184 -0
  159. package/src/components/waka-badge-showcase/WakaBadgeShowcase.stories.tsx +269 -0
  160. package/src/components/waka-barcode/WakaBarcode.stories.tsx +227 -0
  161. package/src/components/waka-biometric-prompt/WakaBiometricPrompt.stories.tsx +48 -0
  162. package/src/components/waka-bottom-sheet/WakaBottomSheet.stories.tsx +408 -0
  163. package/src/components/waka-breadcrumb/WakaBreadcrumb.stories.tsx +120 -0
  164. package/src/components/waka-breadcrumb-path/WakaBreadcrumbPath.stories.tsx +40 -0
  165. package/src/components/waka-budget-burn/WakaBudgetBurn.stories.tsx +86 -0
  166. package/src/components/waka-build-matrix/WakaBuildMatrix.stories.tsx +328 -0
  167. package/src/components/waka-capacity-planner/WakaCapacityPlanner.stories.tsx +273 -0
  168. package/src/components/waka-carousel/WakaCarousel.stories.tsx +296 -0
  169. package/src/components/waka-cart-summary/WakaCartSummary.stories.tsx +176 -0
  170. package/src/components/waka-cart-summary/index.tsx +19 -10
  171. package/src/components/waka-challenge-timer/WakaChallengeTimer.stories.tsx +98 -0
  172. package/src/components/waka-charts/WakaCharts.stories.tsx +519 -0
  173. package/src/components/waka-chat-bubble/WakaChatBubble.stories.tsx +118 -0
  174. package/src/components/waka-checklist/WakaChecklist.stories.tsx +71 -0
  175. package/src/components/waka-checkout-stepper/WakaCheckoutStepper.stories.tsx +102 -0
  176. package/src/components/waka-cohort-table/WakaCohortTable.stories.tsx +56 -0
  177. package/src/components/waka-color-picker/WakaColorPicker.stories.tsx +144 -0
  178. package/src/components/waka-combo-counter/WakaComboCounter.stories.tsx +128 -0
  179. package/src/components/waka-combobox/WakaCombobox.stories.tsx +250 -0
  180. package/src/components/waka-command-bar/WakaCommandBar.stories.tsx +45 -0
  181. package/src/components/waka-compare-period/WakaComparePeriod.stories.tsx +76 -0
  182. package/src/components/waka-config-comparator/WakaConfigComparator.stories.tsx +143 -0
  183. package/src/components/waka-connection-matrix/WakaConnectionMatrix.stories.tsx +52 -0
  184. package/src/components/waka-container-list/WakaContainerList.stories.tsx +315 -0
  185. package/src/components/waka-content-recommendation/WakaContentRecommendation.stories.tsx +41 -0
  186. package/src/components/waka-contribution-graph/WakaContributionGraph.stories.tsx +354 -0
  187. package/src/components/waka-cost-breakdown/WakaCostBreakdown.stories.tsx +348 -0
  188. package/src/components/waka-coupon-input/WakaCouponInput.stories.tsx +126 -0
  189. package/src/components/waka-credit-card-input/WakaCreditCardInput.stories.tsx +120 -0
  190. package/src/components/waka-daily-reward/WakaDailyReward.stories.tsx +365 -0
  191. package/src/components/waka-database-card/WakaDatabaseCard.stories.tsx +306 -0
  192. package/src/components/waka-date-range-picker/WakaDateRangePicker.stories.tsx +339 -0
  193. package/src/components/waka-datetime-picker/WakaDateTimePicker.stories.tsx +317 -0
  194. package/src/components/waka-datetime-picker.form-integration/WakaDateTimePickerForm.stories.tsx +79 -0
  195. package/src/components/waka-dependency-tree/WakaDependencyTree.stories.tsx +72 -0
  196. package/src/components/waka-deployment-lane/WakaDeploymentLane.stories.tsx +292 -0
  197. package/src/components/waka-device-trust/WakaDeviceTrust.stories.tsx +109 -0
  198. package/src/components/waka-dock/WakaDock.stories.tsx +332 -0
  199. package/src/components/waka-drawer/WakaDrawer.stories.tsx +437 -0
  200. package/src/components/waka-empty-state/WakaEmptyState.stories.tsx +87 -0
  201. package/src/components/waka-env-var-editor/WakaEnvVarEditor.stories.tsx +263 -0
  202. package/src/components/waka-error-shake/WakaErrorShake.stories.tsx +410 -0
  203. package/src/components/waka-feature-announcement/WakaFeatureAnnouncement.stories.tsx +47 -0
  204. package/src/components/waka-feature-flag-row/WakaFeatureFlagRow.stories.tsx +188 -0
  205. package/src/components/waka-file-upload/WakaFileUpload.stories.tsx +183 -0
  206. package/src/components/waka-floating-nav/WakaFloatingNav.stories.tsx +53 -0
  207. package/src/components/waka-flow-diagram/WakaFlowDiagram.stories.tsx +365 -0
  208. package/src/components/waka-funnel-chart/WakaFunnelChart.stories.tsx +281 -0
  209. package/src/components/waka-glow-card/WakaGlowCard.stories.tsx +274 -0
  210. package/src/components/waka-goal-progress/WakaGoalProgress.stories.tsx +137 -0
  211. package/src/components/waka-haptic-button/WakaHapticButton.stories.tsx +349 -0
  212. package/src/components/waka-health-pulse/WakaHealthPulse.stories.tsx +293 -0
  213. package/src/components/waka-heatmap/WakaHeatmap.stories.tsx +376 -0
  214. package/src/components/waka-hotspot/WakaHotspot.stories.tsx +56 -0
  215. package/src/components/waka-image/WakaImage.stories.tsx +255 -0
  216. package/src/components/waka-incident-timeline/WakaIncidentTimeline.stories.tsx +300 -0
  217. package/src/components/waka-invoice-preview/WakaInvoicePreview.stories.tsx +169 -0
  218. package/src/components/waka-kanban/WakaKanban.stories.tsx +399 -0
  219. package/src/components/waka-kpi-dashboard/WakaKpiDashboard.stories.tsx +46 -0
  220. package/src/components/waka-kubernetes-overview/WakaKubernetesOverview.stories.tsx +281 -0
  221. package/src/components/waka-leaderboard/WakaLeaderboard.stories.tsx +300 -0
  222. package/src/components/waka-level-progress/WakaLevelProgress.stories.tsx +332 -0
  223. package/src/components/waka-liquid-button/WakaLiquidButton.stories.tsx +45 -0
  224. package/src/components/waka-loading-orbit/WakaLoadingOrbit.stories.tsx +413 -0
  225. package/src/components/waka-log-viewer/WakaLogViewer.stories.tsx +312 -0
  226. package/src/components/waka-loot-box/WakaLootBox.stories.tsx +374 -0
  227. package/src/components/waka-magic-link/WakaMagicLink.stories.tsx +61 -0
  228. package/src/components/waka-magnetic-button/WakaMagneticButton.stories.tsx +40 -0
  229. package/src/components/waka-mention-input/WakaMentionInput.stories.tsx +140 -0
  230. package/src/components/waka-metric-sparkline/WakaMetricSparkline.stories.tsx +312 -0
  231. package/src/components/waka-migration-list/WakaMigrationList.stories.tsx +289 -0
  232. package/src/components/waka-milestone-road/WakaMilestoneRoad.stories.tsx +143 -0
  233. package/src/components/waka-modal/WakaModal.stories.tsx +434 -0
  234. package/src/components/waka-morph-button/WakaMorphButton.stories.tsx +405 -0
  235. package/src/components/waka-network-topology/WakaNetworkTopology.stories.tsx +364 -0
  236. package/src/components/waka-notifications/WakaNotifications.stories.tsx +290 -0
  237. package/src/components/waka-number-input/WakaNumberInput.stories.tsx +282 -0
  238. package/src/components/waka-orbital-menu/WakaOrbitalMenu.stories.tsx +54 -0
  239. package/src/components/waka-order-tracker/WakaOrderTracker.stories.tsx +163 -0
  240. package/src/components/waka-outstream-video/WakaOutstreamVideo.stories.tsx +94 -0
  241. package/src/components/waka-pagination/WakaPagination.stories.tsx +158 -0
  242. package/src/components/waka-password-strength/WakaPasswordStrength.stories.tsx +182 -0
  243. package/src/components/waka-payment-method-picker/WakaPaymentMethodPicker.stories.tsx +141 -0
  244. package/src/components/waka-permission-matrix/WakaPermissionMatrix.stories.tsx +124 -0
  245. package/src/components/waka-phone-input/WakaPhoneInput.stories.tsx +56 -0
  246. package/src/components/waka-pipeline-view/WakaPipelineView.stories.tsx +386 -0
  247. package/src/components/waka-player-card/WakaPlayerCard.stories.tsx +333 -0
  248. package/src/components/waka-pod-card/WakaPodCard.stories.tsx +435 -0
  249. package/src/components/waka-points-popup/WakaPointsPopup.stories.tsx +96 -0
  250. package/src/components/waka-power-up/WakaPowerUp.stories.tsx +121 -0
  251. package/src/components/waka-presence-indicator/WakaPresenceIndicator.stories.tsx +49 -0
  252. package/src/components/waka-pricing-table/WakaPricingTable.stories.tsx +159 -0
  253. package/src/components/waka-product-card/WakaProductCard.stories.tsx +202 -0
  254. package/src/components/waka-progress-onboarding/WakaProgressOnboarding.stories.tsx +57 -0
  255. package/src/components/waka-pull-to-refresh/WakaPullToRefresh.stories.tsx +51 -0
  256. package/src/components/waka-qrcode/WakaQRCode.stories.tsx +232 -0
  257. package/src/components/waka-query-explain/WakaQueryExplain.stories.tsx +407 -0
  258. package/src/components/waka-quest-card/WakaQuestCard.stories.tsx +394 -0
  259. package/src/components/waka-quota-bar/WakaQuotaBar.stories.tsx +435 -0
  260. package/src/components/waka-radar-score/WakaRadarScore.stories.tsx +372 -0
  261. package/src/components/waka-rank-badge/WakaRankBadge.stories.tsx +108 -0
  262. package/src/components/waka-rating-input/WakaRatingInput.stories.tsx +51 -0
  263. package/src/components/waka-reaction-picker/WakaReactionPicker.stories.tsx +52 -0
  264. package/src/components/waka-region-map/WakaRegionMap.stories.tsx +181 -0
  265. package/src/components/waka-resource-gauge/WakaResourceGauge.stories.tsx +366 -0
  266. package/src/components/waka-resource-pool/WakaResourcePool.stories.tsx +70 -0
  267. package/src/components/waka-rich-text-editor/WakaRichTextEditor.stories.tsx +149 -0
  268. package/src/components/waka-rollback-slider/WakaRollbackSlider.stories.tsx +41 -0
  269. package/src/components/waka-sankey-diagram/WakaSankeyDiagram.stories.tsx +389 -0
  270. package/src/components/waka-schedule-picker/WakaSchedulePicker.stories.tsx +64 -0
  271. package/src/components/waka-scratch-card/WakaScratchCard.stories.tsx +388 -0
  272. package/src/components/waka-season-pass/WakaSeasonPass.stories.tsx +107 -0
  273. package/src/components/waka-secret-card/WakaSecretCard.stories.tsx +314 -0
  274. package/src/components/waka-security-scan-result/WakaSecurityScanResult.stories.tsx +146 -0
  275. package/src/components/waka-security-score/WakaSecurityScore.stories.tsx +63 -0
  276. package/src/components/waka-segmented-control/WakaSegmentedControl.stories.tsx +309 -0
  277. package/src/components/waka-server-rack/WakaServerRack.stories.tsx +382 -0
  278. package/src/components/waka-service-graph/WakaServiceGraph.stories.tsx +262 -0
  279. package/src/components/waka-session-manager/WakaSessionManager.stories.tsx +68 -0
  280. package/src/components/waka-signature-pad/WakaSignaturePad.stories.tsx +159 -0
  281. package/src/components/waka-signature-pad/index.tsx +5 -3
  282. package/src/components/waka-skeleton-wave/WakaSkeletonWave.stories.tsx +321 -0
  283. package/src/components/waka-skill-tree/WakaSkillTree.stories.tsx +308 -0
  284. package/src/components/waka-sla-tracker/WakaSlaTracker.stories.tsx +65 -0
  285. package/src/components/waka-slider-range/WakaSliderRange.stories.tsx +66 -0
  286. package/src/components/waka-spin-wheel/WakaSpinWheel.stories.tsx +368 -0
  287. package/src/components/waka-spinner/WakaSpinner.stories.tsx +156 -0
  288. package/src/components/waka-sponsored-badge/WakaSponsoredBadge.stories.tsx +60 -0
  289. package/src/components/waka-sponsored-card/WakaSponsoredCard.stories.tsx +64 -0
  290. package/src/components/waka-sponsored-feed/WakaSponsoredFeed.stories.tsx +58 -0
  291. package/src/components/waka-spotlight/WakaSpotlight.stories.tsx +53 -0
  292. package/src/components/waka-stat/WakaStat.stories.tsx +334 -0
  293. package/src/components/waka-stats-hexagon/WakaStatsHexagon.stories.tsx +161 -0
  294. package/src/components/waka-status-matrix/WakaStatusMatrix.stories.tsx +331 -0
  295. package/src/components/waka-stepper/WakaStepper.stories.tsx +195 -0
  296. package/src/components/waka-streak-counter/WakaStreakCounter.stories.tsx +235 -0
  297. package/src/components/waka-success-explosion/WakaSuccessExplosion.stories.tsx +389 -0
  298. package/src/components/waka-swipe-card/WakaSwipeCard.stories.tsx +51 -0
  299. package/src/components/waka-tabs-morph/WakaTabsMorph.stories.tsx +471 -0
  300. package/src/components/waka-tag-input/WakaTagInput.stories.tsx +224 -0
  301. package/src/components/waka-team-banner/WakaTeamBanner.stories.tsx +50 -0
  302. package/src/components/waka-terminal-output/WakaTerminalOutput.stories.tsx +351 -0
  303. package/src/components/waka-test-report/WakaTestReport.stories.tsx +322 -0
  304. package/src/components/waka-theme-creator/WakaThemeCreator.stories.tsx +58 -0
  305. package/src/components/waka-theme-manager/WakaThemeManager.stories.tsx +298 -0
  306. package/src/components/waka-theme-manager/index.tsx +6 -11
  307. package/src/components/waka-thread-view/WakaThreadView.stories.tsx +143 -0
  308. package/src/components/waka-tilt-card/WakaTiltCard.stories.tsx +300 -0
  309. package/src/components/waka-time-picker/WakaTimePicker.stories.tsx +227 -0
  310. package/src/components/waka-timeline/WakaTimeline.stories.tsx +230 -0
  311. package/src/components/waka-tooltip-tour/WakaTooltipTour.stories.tsx +92 -0
  312. package/src/components/waka-tour-guide/WakaTourGuide.stories.tsx +89 -0
  313. package/src/components/waka-tournament-bracket/WakaTournamentBracket.stories.tsx +375 -0
  314. package/src/components/waka-trace-viewer/WakaTraceViewer.stories.tsx +445 -0
  315. package/src/components/waka-tree/WakaTree.stories.tsx +359 -0
  316. package/src/components/waka-treemap-chart/WakaTreemapChart.stories.tsx +483 -0
  317. package/src/components/waka-treemap-chart/index.tsx +2 -2
  318. package/src/components/waka-two-factor-setup/WakaTwoFactorSetup.stories.tsx +142 -0
  319. package/src/components/waka-typewriter/WakaTypewriter.stories.tsx +366 -0
  320. package/src/components/waka-typing-indicator/WakaTypingIndicator.stories.tsx +134 -0
  321. package/src/components/waka-versus-card/WakaVersusCard.stories.tsx +530 -0
  322. package/src/components/waka-video/WakaVideo.stories.tsx +203 -0
  323. package/src/components/waka-video-ad/WakaVideoAd.stories.tsx +138 -0
  324. package/src/components/waka-video-call/WakaVideoCall.stories.tsx +186 -0
  325. package/src/components/waka-video-overlay/WakaVideoOverlay.stories.tsx +100 -0
  326. package/src/components/waka-virtual-list/WakaVirtualList.stories.tsx +273 -0
  327. package/src/components/waka-voice-message/WakaVoiceMessage.stories.tsx +190 -0
  328. package/src/components/waka-welcome-modal/WakaWelcomeModal.stories.tsx +87 -0
  329. package/src/components/waka-xp-bar/WakaXPBar.stories.tsx +305 -0
  330. package/dist/useDataTableImport-D8R2HQl6.mjs +0 -229
  331. package/dist/useDataTableImport-S_hhA5Wo.js +0 -9
  332. package/src/components/DataTable/README.md +0 -446
@@ -0,0 +1,431 @@
1
+ import type { Meta, StoryObj } from '@storybook/react'
2
+ import { ReleaseNotes, defaultReleases } from './index'
3
+ import type { Release, ChangeItem, Contributor, ChangeType, ReleaseType, ReleaseStatus } from './index'
4
+ import * as React from 'react'
5
+
6
+ const meta: Meta<typeof ReleaseNotes> = {
7
+ title: 'Blocks/ReleaseNotes',
8
+ component: ReleaseNotes,
9
+ parameters: {
10
+ layout: 'fullscreen',
11
+ docs: {
12
+ description: {
13
+ component:
14
+ 'A release notes component for managing and displaying software releases with changelog, contributors, filtering, and publishing workflow.',
15
+ },
16
+ },
17
+ },
18
+ tags: ['autodocs'],
19
+ argTypes: {
20
+ showEditor: {
21
+ control: 'boolean',
22
+ },
23
+ },
24
+ }
25
+
26
+ export default meta
27
+ type Story = StoryObj<typeof ReleaseNotes>
28
+
29
+ export const Default: Story = {
30
+ render: () => (
31
+ <div className="p-6">
32
+ <ReleaseNotes
33
+ releases={defaultReleases}
34
+ onCreateRelease={() => console.log('Create release')}
35
+ onEditRelease={(release) => console.log('Edit:', release)}
36
+ onPublishRelease={(release) => console.log('Publish:', release)}
37
+ />
38
+ </div>
39
+ ),
40
+ }
41
+
42
+ export const SingleRelease: Story = {
43
+ render: () => (
44
+ <div className="p-6">
45
+ <ReleaseNotes
46
+ releases={[defaultReleases[0]]}
47
+ onEditRelease={(release) => console.log('Edit:', release)}
48
+ />
49
+ </div>
50
+ ),
51
+ }
52
+
53
+ export const ManyReleases: Story = {
54
+ render: () => {
55
+ const manyReleases: Release[] = [
56
+ ...defaultReleases,
57
+ {
58
+ id: '4',
59
+ version: 'v2.4.0',
60
+ releaseType: 'minor',
61
+ status: 'published',
62
+ publishedAt: new Date(Date.now() - 30 * 24 * 3600000),
63
+ createdAt: new Date(Date.now() - 32 * 24 * 3600000),
64
+ contributors: [],
65
+ changes: [
66
+ { id: 'c14', type: 'feature', title: 'Added export to CSV functionality' },
67
+ { id: 'c15', type: 'improvement', title: 'Improved table sorting performance' },
68
+ ],
69
+ },
70
+ {
71
+ id: '5',
72
+ version: 'v2.3.2',
73
+ releaseType: 'patch',
74
+ status: 'published',
75
+ publishedAt: new Date(Date.now() - 45 * 24 * 3600000),
76
+ createdAt: new Date(Date.now() - 46 * 24 * 3600000),
77
+ contributors: [],
78
+ changes: [
79
+ { id: 'c16', type: 'fix', title: 'Fixed tooltip position on mobile' },
80
+ ],
81
+ },
82
+ {
83
+ id: '6',
84
+ version: 'v2.3.1',
85
+ releaseType: 'patch',
86
+ status: 'published',
87
+ publishedAt: new Date(Date.now() - 60 * 24 * 3600000),
88
+ createdAt: new Date(Date.now() - 61 * 24 * 3600000),
89
+ contributors: [],
90
+ changes: [
91
+ { id: 'c17', type: 'fix', title: 'Fixed login redirect issue' },
92
+ { id: 'c18', type: 'fix', title: 'Fixed form validation messages' },
93
+ ],
94
+ },
95
+ ]
96
+
97
+ return (
98
+ <div className="p-6">
99
+ <ReleaseNotes
100
+ releases={manyReleases}
101
+ onCreateRelease={() => console.log('Create release')}
102
+ />
103
+ </div>
104
+ )
105
+ },
106
+ }
107
+
108
+ export const WithBreakingChanges: Story = {
109
+ render: () => {
110
+ const breakingRelease: Release = {
111
+ id: 'breaking',
112
+ version: 'v4.0.0',
113
+ name: 'Major Update',
114
+ releaseType: 'major',
115
+ status: 'published',
116
+ publishedAt: new Date(),
117
+ createdAt: new Date(Date.now() - 7 * 24 * 3600000),
118
+ summary: 'This major release contains breaking changes. Please review the upgrade notes carefully.',
119
+ upgradeNotes: 'Before upgrading, ensure you have migrated all deprecated API calls to the new format. Database schema changes are required - run the migration script before deploying.',
120
+ contributors: [
121
+ { id: '1', name: 'John Doe', username: 'johndoe' },
122
+ { id: '2', name: 'Jane Smith', username: 'janesmith' },
123
+ ],
124
+ changes: [
125
+ {
126
+ id: 'b1',
127
+ type: 'breaking',
128
+ title: 'Removed deprecated v1 API endpoints',
129
+ description: 'All v1 endpoints have been removed. Use v2 endpoints instead.',
130
+ breaking: true,
131
+ },
132
+ {
133
+ id: 'b2',
134
+ type: 'breaking',
135
+ title: 'Changed authentication token format',
136
+ description: 'Tokens now use JWT format. Old tokens will be invalidated on upgrade.',
137
+ breaking: true,
138
+ },
139
+ {
140
+ id: 'b3',
141
+ type: 'feature',
142
+ title: 'New plugin architecture',
143
+ description: 'Extensible plugin system for custom integrations',
144
+ },
145
+ {
146
+ id: 'b4',
147
+ type: 'security',
148
+ title: 'Enhanced encryption for sensitive data',
149
+ },
150
+ ],
151
+ }
152
+
153
+ return (
154
+ <div className="p-6">
155
+ <ReleaseNotes releases={[breakingRelease]} />
156
+ </div>
157
+ )
158
+ },
159
+ }
160
+
161
+ export const DraftRelease: Story = {
162
+ render: () => {
163
+ const draftRelease: Release = {
164
+ id: 'draft',
165
+ version: 'v2.6.0',
166
+ name: 'Upcoming Release',
167
+ releaseType: 'minor',
168
+ status: 'draft',
169
+ createdAt: new Date(),
170
+ contributors: [
171
+ { id: '1', name: 'John Doe', username: 'johndoe' },
172
+ ],
173
+ changes: [
174
+ { id: 'd1', type: 'feature', title: 'New feature in progress' },
175
+ { id: 'd2', type: 'improvement', title: 'Performance improvements' },
176
+ ],
177
+ }
178
+
179
+ return (
180
+ <div className="p-6">
181
+ <ReleaseNotes
182
+ releases={[draftRelease]}
183
+ onEditRelease={(release) => console.log('Edit:', release)}
184
+ onPublishRelease={(release) => console.log('Publish:', release)}
185
+ />
186
+ </div>
187
+ )
188
+ },
189
+ }
190
+
191
+ export const ScheduledRelease: Story = {
192
+ render: () => {
193
+ const scheduledRelease: Release = {
194
+ id: 'scheduled',
195
+ version: 'v2.5.1',
196
+ releaseType: 'patch',
197
+ status: 'scheduled',
198
+ scheduledAt: new Date(Date.now() + 3 * 24 * 3600000),
199
+ createdAt: new Date(),
200
+ contributors: [],
201
+ changes: [
202
+ { id: 's1', type: 'fix', title: 'Bug fix for date handling' },
203
+ { id: 's2', type: 'fix', title: 'Fixed memory leak in background worker' },
204
+ ],
205
+ }
206
+
207
+ return (
208
+ <div className="p-6">
209
+ <ReleaseNotes
210
+ releases={[scheduledRelease]}
211
+ onEditRelease={(release) => console.log('Edit:', release)}
212
+ />
213
+ </div>
214
+ )
215
+ },
216
+ }
217
+
218
+ export const AllChangeTypes: Story = {
219
+ render: () => {
220
+ const allTypesRelease: Release = {
221
+ id: 'all-types',
222
+ version: 'v3.0.0',
223
+ releaseType: 'major',
224
+ status: 'published',
225
+ publishedAt: new Date(),
226
+ createdAt: new Date(Date.now() - 7 * 24 * 3600000),
227
+ contributors: [
228
+ { id: '1', name: 'Developer', username: 'dev' },
229
+ ],
230
+ changes: [
231
+ { id: 't1', type: 'feature', title: 'New authentication module', description: 'Added OAuth2 and SAML support' },
232
+ { id: 't2', type: 'fix', title: 'Fixed login redirect loop' },
233
+ { id: 't3', type: 'improvement', title: 'Improved dashboard loading speed' },
234
+ { id: 't4', type: 'breaking', title: 'Changed API response format', breaking: true },
235
+ { id: 't5', type: 'security', title: 'Patched XSS vulnerability in comments' },
236
+ { id: 't6', type: 'performance', title: 'Reduced bundle size by 40%' },
237
+ { id: 't7', type: 'docs', title: 'Updated API documentation' },
238
+ { id: 't8', type: 'deprecation', title: 'Deprecated legacy theme system' },
239
+ ],
240
+ }
241
+
242
+ return (
243
+ <div className="p-6">
244
+ <ReleaseNotes releases={[allTypesRelease]} />
245
+ </div>
246
+ )
247
+ },
248
+ }
249
+
250
+ export const WithPullRequests: Story = {
251
+ render: () => {
252
+ const prRelease: Release = {
253
+ id: 'pr-release',
254
+ version: 'v2.5.2',
255
+ releaseType: 'patch',
256
+ status: 'published',
257
+ publishedAt: new Date(),
258
+ createdAt: new Date(Date.now() - 2 * 24 * 3600000),
259
+ compareUrl: 'https://github.com/example/repo/compare/v2.5.1...v2.5.2',
260
+ contributors: [
261
+ { id: '1', name: 'Alice', username: 'alice' },
262
+ { id: '2', name: 'Bob', username: 'bob' },
263
+ ],
264
+ changes: [
265
+ {
266
+ id: 'pr1',
267
+ type: 'fix',
268
+ title: 'Fixed date picker timezone issue',
269
+ pullRequest: { number: 456, url: 'https://github.com/example/repo/pull/456' },
270
+ contributors: [{ id: '1', name: 'Alice', username: 'alice' }],
271
+ },
272
+ {
273
+ id: 'pr2',
274
+ type: 'fix',
275
+ title: 'Fixed modal close animation',
276
+ pullRequest: { number: 458, url: 'https://github.com/example/repo/pull/458' },
277
+ contributors: [{ id: '2', name: 'Bob', username: 'bob' }],
278
+ },
279
+ ],
280
+ }
281
+
282
+ return (
283
+ <div className="p-6">
284
+ <ReleaseNotes releases={[prRelease]} />
285
+ </div>
286
+ )
287
+ },
288
+ }
289
+
290
+ export const EmptyState: Story = {
291
+ render: () => (
292
+ <div className="p-6">
293
+ <ReleaseNotes
294
+ releases={[]}
295
+ onCreateRelease={() => console.log('Create first release')}
296
+ />
297
+ </div>
298
+ ),
299
+ }
300
+
301
+ export const ReadOnly: Story = {
302
+ render: () => (
303
+ <div className="p-6">
304
+ <ReleaseNotes releases={defaultReleases} />
305
+ </div>
306
+ ),
307
+ }
308
+
309
+ export const Interactive: Story = {
310
+ render: () => {
311
+ const [releases, setReleases] = React.useState<Release[]>(defaultReleases)
312
+
313
+ const handleCreateRelease = () => {
314
+ const newRelease: Release = {
315
+ id: `release-${Date.now()}`,
316
+ version: 'v2.6.0',
317
+ releaseType: 'minor',
318
+ status: 'draft',
319
+ createdAt: new Date(),
320
+ contributors: [],
321
+ changes: [],
322
+ }
323
+ setReleases(prev => [newRelease, ...prev])
324
+ alert('New draft release created!')
325
+ }
326
+
327
+ const handlePublish = (release: Release) => {
328
+ setReleases(prev =>
329
+ prev.map(r =>
330
+ r.id === release.id
331
+ ? { ...r, status: 'published' as ReleaseStatus, publishedAt: new Date() }
332
+ : r
333
+ )
334
+ )
335
+ alert(`Published ${release.version}!`)
336
+ }
337
+
338
+ const handleEdit = (release: Release) => {
339
+ alert(`Editing ${release.version}...`)
340
+ }
341
+
342
+ return (
343
+ <div className="p-6">
344
+ <ReleaseNotes
345
+ releases={releases}
346
+ onCreateRelease={handleCreateRelease}
347
+ onEditRelease={handleEdit}
348
+ onPublishRelease={handlePublish}
349
+ />
350
+ </div>
351
+ )
352
+ },
353
+ }
354
+
355
+ export const ProjectChangelog: Story = {
356
+ render: () => (
357
+ <div className="min-h-screen bg-muted/30">
358
+ <header className="bg-background border-b px-6 py-4">
359
+ <div className="flex items-center justify-between max-w-5xl mx-auto">
360
+ <div>
361
+ <h1 className="font-bold text-xl">Changelog</h1>
362
+ <p className="text-sm text-muted-foreground">@wakastellar/ui</p>
363
+ </div>
364
+ <nav className="flex gap-4 text-sm">
365
+ <a href="#" className="text-muted-foreground hover:text-foreground">Documentation</a>
366
+ <a href="#" className="text-foreground font-medium">Changelog</a>
367
+ <a href="#" className="text-muted-foreground hover:text-foreground">GitHub</a>
368
+ </nav>
369
+ </div>
370
+ </header>
371
+ <main className="max-w-5xl mx-auto p-6">
372
+ <ReleaseNotes releases={defaultReleases} />
373
+ </main>
374
+ </div>
375
+ ),
376
+ }
377
+
378
+ export const WithFilters: Story = {
379
+ render: () => {
380
+ const mixedReleases: Release[] = [
381
+ {
382
+ id: '1',
383
+ version: 'v3.0.0-beta.2',
384
+ releaseType: 'prerelease',
385
+ status: 'draft',
386
+ createdAt: new Date(),
387
+ contributors: [],
388
+ changes: [{ id: 'c1', type: 'feature', title: 'Beta feature' }],
389
+ },
390
+ {
391
+ id: '2',
392
+ version: 'v2.5.0',
393
+ releaseType: 'minor',
394
+ status: 'published',
395
+ publishedAt: new Date(Date.now() - 7 * 24 * 3600000),
396
+ createdAt: new Date(Date.now() - 10 * 24 * 3600000),
397
+ contributors: [],
398
+ changes: [{ id: 'c2', type: 'feature', title: 'New feature' }],
399
+ },
400
+ {
401
+ id: '3',
402
+ version: 'v2.4.1',
403
+ releaseType: 'patch',
404
+ status: 'published',
405
+ publishedAt: new Date(Date.now() - 14 * 24 * 3600000),
406
+ createdAt: new Date(Date.now() - 15 * 24 * 3600000),
407
+ contributors: [],
408
+ changes: [{ id: 'c3', type: 'fix', title: 'Bug fix' }],
409
+ },
410
+ {
411
+ id: '4',
412
+ version: 'v2.0.0',
413
+ releaseType: 'major',
414
+ status: 'published',
415
+ publishedAt: new Date(Date.now() - 60 * 24 * 3600000),
416
+ createdAt: new Date(Date.now() - 65 * 24 * 3600000),
417
+ contributors: [],
418
+ changes: [{ id: 'c4', type: 'breaking', title: 'Breaking change', breaking: true }],
419
+ },
420
+ ]
421
+
422
+ return (
423
+ <div className="p-6">
424
+ <ReleaseNotes
425
+ releases={mixedReleases}
426
+ onCreateRelease={() => console.log('Create')}
427
+ />
428
+ </div>
429
+ )
430
+ },
431
+ }
@@ -0,0 +1,231 @@
1
+ import type { Meta, StoryObj } from "@storybook/react"
2
+ import { ScanHistoryLog, type ScanLogEntry } from "./index"
3
+
4
+ const meta = {
5
+ title: "Blocks/Antivirus/ScanHistoryLog",
6
+ component: ScanHistoryLog,
7
+ parameters: {
8
+ layout: "padded",
9
+ },
10
+ tags: ["autodocs"],
11
+ } satisfies Meta<typeof ScanHistoryLog>
12
+
13
+ export default meta
14
+ type Story = StoryObj<typeof meta>
15
+
16
+ const generateMockEntries = (): ScanLogEntry[] => {
17
+ const now = new Date()
18
+ const users = [
19
+ { id: "user-1", name: "Marie Dupont" },
20
+ { id: "user-2", name: "Jean Martin" },
21
+ { id: "user-3", name: "Sophie Bernard" },
22
+ { id: "user-4", name: "Luc Moreau" },
23
+ ]
24
+
25
+ const cleanFiles = [
26
+ "rapport-mensuel.pdf",
27
+ "presentation.pptx",
28
+ "document.docx",
29
+ "image.jpg",
30
+ "archive.zip",
31
+ "script.js",
32
+ "style.css",
33
+ "index.html",
34
+ "data.json",
35
+ "config.yaml",
36
+ ]
37
+
38
+ const infectedFiles = [
39
+ "virus.exe",
40
+ "trojan-downloader.zip",
41
+ "malware.pdf",
42
+ "ransomware.docx",
43
+ ]
44
+
45
+ const errorFiles = [
46
+ "corrupted-archive.zip",
47
+ "encrypted-file.bin",
48
+ "large-file.iso",
49
+ ]
50
+
51
+ const threats = [
52
+ "Trojan.Generic.KD.12345678",
53
+ "Win32.Malware.Agent",
54
+ "EICAR-Test-File",
55
+ "Ransom.WannaCry.Variant",
56
+ "Adware.Generic.BundleInstaller",
57
+ ]
58
+
59
+ const entries: ScanLogEntry[] = []
60
+ let idCounter = 1
61
+
62
+ // Clean files (10 entries)
63
+ for (let i = 0; i < 10; i++) {
64
+ const daysAgo = Math.floor(Math.random() * 7)
65
+ const hoursAgo = Math.floor(Math.random() * 24)
66
+ const scanDate = new Date(now)
67
+ scanDate.setDate(scanDate.getDate() - daysAgo)
68
+ scanDate.setHours(scanDate.getHours() - hoursAgo)
69
+
70
+ const user = users[Math.floor(Math.random() * users.length)]
71
+ const filename = cleanFiles[Math.floor(Math.random() * cleanFiles.length)]
72
+ const fileSize = Math.floor(Math.random() * 10000000) + 1000
73
+
74
+ entries.push({
75
+ id: `scan-${idCounter++}`,
76
+ filename,
77
+ fileSize,
78
+ fileHash: Array.from({ length: 64 }, () =>
79
+ Math.floor(Math.random() * 16).toString(16)
80
+ ).join(""),
81
+ result: "clean",
82
+ scanDate,
83
+ duration: Math.floor(Math.random() * 2000) + 100,
84
+ userId: user.id,
85
+ userName: user.name,
86
+ engineVersion: "ClamAV 1.2.1",
87
+ signatureVersion: `${Math.floor(Math.random() * 30000) + 25000}`,
88
+ })
89
+ }
90
+
91
+ // Infected files (5 entries)
92
+ for (let i = 0; i < 5; i++) {
93
+ const daysAgo = Math.floor(Math.random() * 7)
94
+ const hoursAgo = Math.floor(Math.random() * 24)
95
+ const scanDate = new Date(now)
96
+ scanDate.setDate(scanDate.getDate() - daysAgo)
97
+ scanDate.setHours(scanDate.getHours() - hoursAgo)
98
+
99
+ const user = users[Math.floor(Math.random() * users.length)]
100
+ const filename = infectedFiles[Math.floor(Math.random() * infectedFiles.length)]
101
+ const fileSize = Math.floor(Math.random() * 5000000) + 1000
102
+ const threatName = threats[Math.floor(Math.random() * threats.length)]
103
+
104
+ entries.push({
105
+ id: `scan-${idCounter++}`,
106
+ filename,
107
+ fileSize,
108
+ fileHash: Array.from({ length: 64 }, () =>
109
+ Math.floor(Math.random() * 16).toString(16)
110
+ ).join(""),
111
+ result: "infected",
112
+ threatName,
113
+ scanDate,
114
+ duration: Math.floor(Math.random() * 3000) + 500,
115
+ userId: user.id,
116
+ userName: user.name,
117
+ engineVersion: "ClamAV 1.2.1",
118
+ signatureVersion: `${Math.floor(Math.random() * 30000) + 25000}`,
119
+ })
120
+ }
121
+
122
+ // Error files (3 entries)
123
+ for (let i = 0; i < 3; i++) {
124
+ const daysAgo = Math.floor(Math.random() * 7)
125
+ const hoursAgo = Math.floor(Math.random() * 24)
126
+ const scanDate = new Date(now)
127
+ scanDate.setDate(scanDate.getDate() - daysAgo)
128
+ scanDate.setHours(scanDate.getHours() - hoursAgo)
129
+
130
+ const user = users[Math.floor(Math.random() * users.length)]
131
+ const filename = errorFiles[Math.floor(Math.random() * errorFiles.length)]
132
+ const fileSize = Math.floor(Math.random() * 50000000) + 10000000
133
+
134
+ entries.push({
135
+ id: `scan-${idCounter++}`,
136
+ filename,
137
+ fileSize,
138
+ fileHash: Array.from({ length: 64 }, () =>
139
+ Math.floor(Math.random() * 16).toString(16)
140
+ ).join(""),
141
+ result: "error",
142
+ scanDate,
143
+ duration: Math.floor(Math.random() * 5000) + 1000,
144
+ userId: user.id,
145
+ userName: user.name,
146
+ engineVersion: "ClamAV 1.2.1",
147
+ signatureVersion: `${Math.floor(Math.random() * 30000) + 25000}`,
148
+ })
149
+ }
150
+
151
+ // Sort by date (most recent first)
152
+ return entries.sort((a, b) => b.scanDate.getTime() - a.scanDate.getTime())
153
+ }
154
+
155
+ export const Default: Story = {
156
+ args: {
157
+ entries: generateMockEntries(),
158
+ totalEntries: 18,
159
+ currentPage: 1,
160
+ pageSize: 10,
161
+ periodFilter: "7d",
162
+ onPageChange: (page: number) => console.log("Page changed:", page),
163
+ onFilterChange: (filters: any) => console.log("Filters changed:", filters),
164
+ onExport: () => console.log("Export triggered"),
165
+ },
166
+ }
167
+
168
+ export const Empty: Story = {
169
+ args: {
170
+ entries: [],
171
+ totalEntries: 0,
172
+ currentPage: 1,
173
+ pageSize: 10,
174
+ periodFilter: "7d",
175
+ onPageChange: (page: number) => console.log("Page changed:", page),
176
+ onFilterChange: (filters: any) => console.log("Filters changed:", filters),
177
+ onExport: () => console.log("Export triggered"),
178
+ },
179
+ }
180
+
181
+ export const OnlyCleanScans: Story = {
182
+ args: {
183
+ entries: generateMockEntries().filter((e) => e.result === "clean"),
184
+ totalEntries: 10,
185
+ currentPage: 1,
186
+ pageSize: 10,
187
+ periodFilter: "7d",
188
+ onPageChange: (page: number) => console.log("Page changed:", page),
189
+ onFilterChange: (filters: any) => console.log("Filters changed:", filters),
190
+ onExport: () => console.log("Export triggered"),
191
+ },
192
+ }
193
+
194
+ export const WithInfections: Story = {
195
+ args: {
196
+ entries: generateMockEntries().filter((e) => e.result === "infected"),
197
+ totalEntries: 5,
198
+ currentPage: 1,
199
+ pageSize: 10,
200
+ periodFilter: "7d",
201
+ onPageChange: (page: number) => console.log("Page changed:", page),
202
+ onFilterChange: (filters: any) => console.log("Filters changed:", filters),
203
+ onExport: () => console.log("Export triggered"),
204
+ },
205
+ }
206
+
207
+ export const WithErrors: Story = {
208
+ args: {
209
+ entries: generateMockEntries().filter((e) => e.result === "error"),
210
+ totalEntries: 3,
211
+ currentPage: 1,
212
+ pageSize: 10,
213
+ periodFilter: "7d",
214
+ onPageChange: (page: number) => console.log("Page changed:", page),
215
+ onFilterChange: (filters: any) => console.log("Filters changed:", filters),
216
+ onExport: () => console.log("Export triggered"),
217
+ },
218
+ }
219
+
220
+ export const WithPagination: Story = {
221
+ args: {
222
+ entries: generateMockEntries(),
223
+ totalEntries: 50,
224
+ currentPage: 2,
225
+ pageSize: 5,
226
+ periodFilter: "30d",
227
+ onPageChange: (page: number) => console.log("Page changed:", page),
228
+ onFilterChange: (filters: any) => console.log("Filters changed:", filters),
229
+ onExport: () => console.log("Export triggered"),
230
+ },
231
+ }