@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,263 @@
1
+ import type { Meta, StoryObj } from '@storybook/react'
2
+ import { WakaEnvVarEditor, defaultEnvVariables } from './index'
3
+ import type { EnvVariable } from './index'
4
+ import * as React from 'react'
5
+
6
+ const simpleVariables: EnvVariable[] = [
7
+ { key: 'NODE_ENV', value: 'development' },
8
+ { key: 'PORT', value: '3000' },
9
+ { key: 'DEBUG', value: 'true' },
10
+ ]
11
+
12
+ const productionVariables: EnvVariable[] = [
13
+ { key: 'NODE_ENV', value: 'production', isRequired: true },
14
+ { key: 'DATABASE_URL', value: 'postgresql://prod-user:secure-pass@db.example.com:5432/production', isSecret: true, isRequired: true },
15
+ { key: 'REDIS_URL', value: 'redis://redis.example.com:6379', isSecret: true },
16
+ { key: 'API_KEY', value: 'pk_live_1234567890abcdefghijklmnopqrstuvwxyz', isSecret: true, isRequired: true },
17
+ { key: 'SECRET_KEY', value: 'sk_live_9876543210zyxwvutsrqponmlkjihgfedcba', isSecret: true, isRequired: true },
18
+ { key: 'LOG_LEVEL', value: 'warn' },
19
+ { key: 'SENTRY_DSN', value: 'https://abc123@sentry.io/12345', isSecret: true },
20
+ { key: 'ENABLE_METRICS', value: 'true' },
21
+ ]
22
+
23
+ const variablesWithSources: EnvVariable[] = [
24
+ { key: 'DATABASE_URL', value: 'postgresql://localhost:5432/dev', source: 'local', isSecret: true },
25
+ { key: 'DATABASE_URL', value: 'postgresql://staging-db:5432/staging', source: 'staging', isSecret: true },
26
+ { key: 'DATABASE_URL', value: 'postgresql://prod-db:5432/production', source: 'production', isSecret: true },
27
+ { key: 'API_KEY', value: 'dev_key_123', source: 'local', isSecret: true },
28
+ { key: 'API_KEY', value: 'staging_key_456', source: 'staging', isSecret: true },
29
+ { key: 'API_KEY', value: 'prod_key_789', source: 'production', isSecret: true },
30
+ ]
31
+
32
+ const incompleteVariables: EnvVariable[] = [
33
+ { key: 'NODE_ENV', value: 'production', isRequired: true },
34
+ { key: 'DATABASE_URL', value: '', isSecret: true, isRequired: true },
35
+ { key: 'API_KEY', value: '', isSecret: true, isRequired: true },
36
+ { key: 'OPTIONAL_VAR', value: '' },
37
+ ]
38
+
39
+ const meta: Meta<typeof WakaEnvVarEditor> = {
40
+ title: 'Components/DevOps/WakaEnvVarEditor',
41
+ component: WakaEnvVarEditor,
42
+ parameters: {
43
+ layout: 'centered',
44
+ docs: {
45
+ description: {
46
+ component: 'An environment variable editor with secret masking, import/export, search, and validation for required variables.',
47
+ },
48
+ },
49
+ },
50
+ tags: ['autodocs'],
51
+ argTypes: {
52
+ readOnly: {
53
+ control: 'boolean',
54
+ description: 'Read-only mode',
55
+ },
56
+ showSource: {
57
+ control: 'boolean',
58
+ description: 'Show source column',
59
+ },
60
+ },
61
+ }
62
+
63
+ export default meta
64
+ type Story = StoryObj<typeof WakaEnvVarEditor>
65
+
66
+ export const Default: Story = {
67
+ args: {
68
+ variables: defaultEnvVariables,
69
+ },
70
+ render: (args) => (
71
+ <div className="w-[700px] h-[500px]">
72
+ <WakaEnvVarEditor
73
+ {...args}
74
+ onChange={(vars) => console.log('Change:', vars)}
75
+ onSave={(vars) => console.log('Save:', vars)}
76
+ onExport={() => console.log('Export')}
77
+ />
78
+ </div>
79
+ ),
80
+ }
81
+
82
+ export const Simple: Story = {
83
+ render: () => (
84
+ <div className="w-[700px] h-[400px]">
85
+ <WakaEnvVarEditor
86
+ variables={simpleVariables}
87
+ title="Development Variables"
88
+ onChange={(vars) => console.log('Change:', vars)}
89
+ onSave={(vars) => console.log('Save:', vars)}
90
+ />
91
+ </div>
92
+ ),
93
+ }
94
+
95
+ export const Production: Story = {
96
+ render: () => (
97
+ <div className="w-[700px] h-[500px]">
98
+ <WakaEnvVarEditor
99
+ variables={productionVariables}
100
+ title="Production Environment"
101
+ onChange={(vars) => console.log('Change:', vars)}
102
+ onSave={(vars) => console.log('Save:', vars)}
103
+ onExport={() => console.log('Export')}
104
+ />
105
+ </div>
106
+ ),
107
+ }
108
+
109
+ export const WithSources: Story = {
110
+ render: () => (
111
+ <div className="w-[750px] h-[500px]">
112
+ <p className="text-sm text-muted-foreground mb-4">
113
+ Variables from different environments
114
+ </p>
115
+ <WakaEnvVarEditor
116
+ variables={variablesWithSources}
117
+ showSource
118
+ title="Multi-Environment Variables"
119
+ onChange={(vars) => console.log('Change:', vars)}
120
+ />
121
+ </div>
122
+ ),
123
+ }
124
+
125
+ export const MissingRequired: Story = {
126
+ render: () => (
127
+ <div className="w-[700px] h-[400px]">
128
+ <p className="text-sm text-muted-foreground mb-4">
129
+ Shows warning indicators for empty required variables
130
+ </p>
131
+ <WakaEnvVarEditor
132
+ variables={incompleteVariables}
133
+ title="Incomplete Configuration"
134
+ onChange={(vars) => console.log('Change:', vars)}
135
+ onSave={(vars) => console.log('Save:', vars)}
136
+ />
137
+ </div>
138
+ ),
139
+ }
140
+
141
+ export const ReadOnly: Story = {
142
+ render: () => (
143
+ <div className="w-[700px] h-[500px]">
144
+ <WakaEnvVarEditor
145
+ variables={productionVariables}
146
+ readOnly
147
+ title="Production Variables (Read Only)"
148
+ onExport={() => console.log('Export')}
149
+ />
150
+ </div>
151
+ ),
152
+ }
153
+
154
+ export const Interactive: Story = {
155
+ render: () => {
156
+ const [variables, setVariables] = React.useState<EnvVariable[]>(simpleVariables)
157
+ const [saved, setSaved] = React.useState(false)
158
+
159
+ const handleSave = (vars: EnvVariable[]) => {
160
+ console.log('Saving:', vars)
161
+ setSaved(true)
162
+ setTimeout(() => setSaved(false), 2000)
163
+ }
164
+
165
+ return (
166
+ <div className="w-[700px] h-[500px]">
167
+ {saved && (
168
+ <div className="mb-4 p-2 bg-green-500/10 border border-green-500/30 rounded text-sm text-green-500">
169
+ Variables saved successfully!
170
+ </div>
171
+ )}
172
+ <WakaEnvVarEditor
173
+ variables={variables}
174
+ onChange={setVariables}
175
+ onSave={handleSave}
176
+ onExport={() => {
177
+ const content = variables
178
+ .map((v) => `${v.key}=${v.value}`)
179
+ .join('\n')
180
+ console.log('Export content:\n', content)
181
+ alert('Check console for exported content')
182
+ }}
183
+ title="Interactive Editor"
184
+ />
185
+ </div>
186
+ )
187
+ },
188
+ }
189
+
190
+ export const Empty: Story = {
191
+ render: () => (
192
+ <div className="w-[700px] h-[400px]">
193
+ <WakaEnvVarEditor
194
+ variables={[]}
195
+ title="No Variables"
196
+ onChange={(vars) => console.log('Change:', vars)}
197
+ onSave={(vars) => console.log('Save:', vars)}
198
+ />
199
+ </div>
200
+ ),
201
+ }
202
+
203
+ export const ManyVariables: Story = {
204
+ render: () => {
205
+ const manyVars: EnvVariable[] = Array.from({ length: 30 }, (_, i) => ({
206
+ key: `VARIABLE_${i + 1}`,
207
+ value: `value_${i + 1}`,
208
+ isSecret: i % 3 === 0,
209
+ isRequired: i % 5 === 0,
210
+ }))
211
+
212
+ return (
213
+ <div className="w-[700px] h-[600px]">
214
+ <WakaEnvVarEditor
215
+ variables={manyVars}
216
+ title="Large Configuration"
217
+ onChange={(vars) => console.log('Change:', vars)}
218
+ onSave={(vars) => console.log('Save:', vars)}
219
+ onExport={() => console.log('Export')}
220
+ />
221
+ </div>
222
+ )
223
+ },
224
+ }
225
+
226
+ export const ConfigurationPanel: Story = {
227
+ render: () => {
228
+ const [variables, setVariables] = React.useState<EnvVariable[]>(defaultEnvVariables)
229
+
230
+ return (
231
+ <div className="p-6 rounded-xl border bg-card">
232
+ <div className="flex items-center justify-between mb-6">
233
+ <div>
234
+ <h2 className="text-xl font-bold">Application Configuration</h2>
235
+ <p className="text-sm text-muted-foreground">Environment: Production</p>
236
+ </div>
237
+ <div className="flex items-center gap-2 text-sm">
238
+ <span className="text-muted-foreground">{variables.length} variables</span>
239
+ <span className="text-muted-foreground">•</span>
240
+ <span className="text-yellow-500">{variables.filter((v) => v.isSecret).length} secrets</span>
241
+ </div>
242
+ </div>
243
+
244
+ <div className="w-[650px]">
245
+ <WakaEnvVarEditor
246
+ variables={variables}
247
+ onChange={setVariables}
248
+ onSave={(vars) => {
249
+ console.log('Saving configuration:', vars)
250
+ alert(`Saved ${vars.length} variables!`)
251
+ }}
252
+ onExport={() => {
253
+ const content = variables
254
+ .map((v) => `${v.key}=${v.isSecret ? '***' : v.value}`)
255
+ .join('\n')
256
+ console.log('Export (secrets masked):\n', content)
257
+ }}
258
+ />
259
+ </div>
260
+ </div>
261
+ )
262
+ },
263
+ }
@@ -0,0 +1,410 @@
1
+ import type { Meta, StoryObj } from '@storybook/react'
2
+ import { WakaErrorShake, WakaFormFieldShake, useErrorShake } from './index'
3
+ import type { WakaErrorShakeRef } from './index'
4
+ import * as React from 'react'
5
+ import { Button } from '../button'
6
+ import { AlertCircle } from 'lucide-react'
7
+
8
+ const meta: Meta<typeof WakaErrorShake> = {
9
+ title: 'Components/Effects/WakaErrorShake',
10
+ component: WakaErrorShake,
11
+ parameters: {
12
+ layout: 'centered',
13
+ docs: {
14
+ description: {
15
+ component: 'An error shake animation component for visual feedback on errors or invalid input.',
16
+ },
17
+ },
18
+ },
19
+ tags: ['autodocs'],
20
+ argTypes: {
21
+ intensity: {
22
+ control: 'select',
23
+ options: ['light', 'medium', 'strong'],
24
+ description: 'Shake intensity',
25
+ },
26
+ duration: {
27
+ control: { type: 'range', min: 200, max: 1000, step: 50 },
28
+ description: 'Animation duration in ms',
29
+ },
30
+ glitchEffect: {
31
+ control: 'boolean',
32
+ description: 'Enable glitch/distortion effect',
33
+ },
34
+ flashEffect: {
35
+ control: 'boolean',
36
+ description: 'Enable red flash effect',
37
+ },
38
+ flashColor: {
39
+ control: 'color',
40
+ description: 'Flash color',
41
+ },
42
+ },
43
+ }
44
+
45
+ export default meta
46
+ type Story = StoryObj<typeof WakaErrorShake>
47
+
48
+ export const Default: Story = {
49
+ args: {},
50
+ render: (args) => {
51
+ const [trigger, setTrigger] = React.useState(false)
52
+
53
+ const handleShake = () => {
54
+ setTrigger(true)
55
+ setTimeout(() => setTrigger(false), 100)
56
+ }
57
+
58
+ return (
59
+ <div className="space-y-6">
60
+ <WakaErrorShake trigger={trigger}>
61
+ <div className="p-6 border rounded-lg bg-card w-[300px]">
62
+ <h3 className="font-semibold mb-2">Error Content</h3>
63
+ <p className="text-sm text-muted-foreground">
64
+ This content will shake when triggered.
65
+ </p>
66
+ </div>
67
+ </WakaErrorShake>
68
+ <Button variant="destructive" onClick={handleShake}>
69
+ Trigger Shake
70
+ </Button>
71
+ </div>
72
+ )
73
+ },
74
+ }
75
+
76
+ export const Intensities: Story = {
77
+ render: () => {
78
+ const [triggers, setTriggers] = React.useState({
79
+ light: false,
80
+ medium: false,
81
+ strong: false,
82
+ })
83
+
84
+ const handleTrigger = (intensity: keyof typeof triggers) => {
85
+ setTriggers((prev) => ({ ...prev, [intensity]: true }))
86
+ setTimeout(() => setTriggers((prev) => ({ ...prev, [intensity]: false })), 100)
87
+ }
88
+
89
+ return (
90
+ <div className="flex gap-6">
91
+ {(['light', 'medium', 'strong'] as const).map((intensity) => (
92
+ <div key={intensity} className="flex flex-col items-center gap-4">
93
+ <WakaErrorShake trigger={triggers[intensity]} intensity={intensity}>
94
+ <div className="p-4 border rounded-lg bg-card w-[150px] text-center">
95
+ <span className="capitalize">{intensity}</span>
96
+ </div>
97
+ </WakaErrorShake>
98
+ <Button size="sm" variant="outline" onClick={() => handleTrigger(intensity)}>
99
+ Shake
100
+ </Button>
101
+ </div>
102
+ ))}
103
+ </div>
104
+ )
105
+ },
106
+ }
107
+
108
+ export const WithGlitchEffect: Story = {
109
+ render: () => {
110
+ const [trigger, setTrigger] = React.useState(false)
111
+
112
+ return (
113
+ <div className="space-y-6">
114
+ <WakaErrorShake trigger={trigger} glitchEffect intensity="strong">
115
+ <div className="p-6 border rounded-lg bg-card w-[300px]">
116
+ <h3 className="font-semibold mb-2 text-destructive">Critical Error</h3>
117
+ <p className="text-sm text-muted-foreground">
118
+ This includes a glitch/distortion effect.
119
+ </p>
120
+ </div>
121
+ </WakaErrorShake>
122
+ <Button
123
+ variant="destructive"
124
+ onClick={() => {
125
+ setTrigger(true)
126
+ setTimeout(() => setTrigger(false), 100)
127
+ }}
128
+ >
129
+ Trigger Glitch
130
+ </Button>
131
+ </div>
132
+ )
133
+ },
134
+ }
135
+
136
+ export const NoFlashEffect: Story = {
137
+ render: () => {
138
+ const [trigger, setTrigger] = React.useState(false)
139
+
140
+ return (
141
+ <div className="space-y-6">
142
+ <WakaErrorShake trigger={trigger} flashEffect={false}>
143
+ <div className="p-6 border rounded-lg bg-card w-[300px]">
144
+ <h3 className="font-semibold mb-2">No Flash</h3>
145
+ <p className="text-sm text-muted-foreground">
146
+ Only shake animation, no red flash.
147
+ </p>
148
+ </div>
149
+ </WakaErrorShake>
150
+ <Button
151
+ variant="outline"
152
+ onClick={() => {
153
+ setTrigger(true)
154
+ setTimeout(() => setTrigger(false), 100)
155
+ }}
156
+ >
157
+ Shake Only
158
+ </Button>
159
+ </div>
160
+ )
161
+ },
162
+ }
163
+
164
+ export const CustomFlashColor: Story = {
165
+ render: () => {
166
+ const [trigger, setTrigger] = React.useState(false)
167
+
168
+ return (
169
+ <div className="space-y-6">
170
+ <WakaErrorShake trigger={trigger} flashColor="rgb(251, 146, 60)">
171
+ <div className="p-6 border rounded-lg bg-card w-[300px]">
172
+ <h3 className="font-semibold mb-2">Warning Flash</h3>
173
+ <p className="text-sm text-muted-foreground">
174
+ Orange flash color for warnings.
175
+ </p>
176
+ </div>
177
+ </WakaErrorShake>
178
+ <Button
179
+ className="bg-orange-500 hover:bg-orange-600"
180
+ onClick={() => {
181
+ setTrigger(true)
182
+ setTimeout(() => setTrigger(false), 100)
183
+ }}
184
+ >
185
+ Trigger Warning
186
+ </Button>
187
+ </div>
188
+ )
189
+ },
190
+ }
191
+
192
+ export const FormFieldShake: Story = {
193
+ render: () => {
194
+ const [error, setError] = React.useState(false)
195
+ const [value, setValue] = React.useState('')
196
+
197
+ const handleSubmit = (e: React.FormEvent) => {
198
+ e.preventDefault()
199
+ if (!value.includes('@')) {
200
+ setError(true)
201
+ } else {
202
+ setError(false)
203
+ alert('Submitted!')
204
+ }
205
+ }
206
+
207
+ return (
208
+ <form onSubmit={handleSubmit} className="w-[300px] space-y-4">
209
+ <div>
210
+ <label className="text-sm font-medium">Email</label>
211
+ <WakaFormFieldShake hasError={error}>
212
+ <input
213
+ type="text"
214
+ value={value}
215
+ onChange={(e) => {
216
+ setValue(e.target.value)
217
+ if (error) setError(false)
218
+ }}
219
+ className={`w-full mt-1 px-3 py-2 border rounded-md ${
220
+ error ? 'border-destructive' : ''
221
+ }`}
222
+ placeholder="Enter your email"
223
+ />
224
+ </WakaFormFieldShake>
225
+ {error && (
226
+ <p className="text-sm text-destructive mt-1 flex items-center gap-1">
227
+ <AlertCircle className="h-3 w-3" />
228
+ Please enter a valid email
229
+ </p>
230
+ )}
231
+ </div>
232
+ <Button type="submit" className="w-full">
233
+ Submit
234
+ </Button>
235
+ </form>
236
+ )
237
+ },
238
+ }
239
+
240
+ export const WithRef: Story = {
241
+ render: () => {
242
+ const ref = React.useRef<WakaErrorShakeRef>(null)
243
+
244
+ return (
245
+ <div className="space-y-6">
246
+ <WakaErrorShake ref={ref}>
247
+ <div className="p-6 border rounded-lg bg-card w-[300px]">
248
+ <h3 className="font-semibold mb-2">Controlled via Ref</h3>
249
+ <p className="text-sm text-muted-foreground">
250
+ Use the ref to trigger shake programmatically.
251
+ </p>
252
+ </div>
253
+ </WakaErrorShake>
254
+ <div className="flex gap-2">
255
+ <Button variant="destructive" onClick={() => ref.current?.shake()}>
256
+ Shake
257
+ </Button>
258
+ <Button variant="outline" onClick={() => ref.current?.reset()}>
259
+ Reset
260
+ </Button>
261
+ </div>
262
+ </div>
263
+ )
264
+ },
265
+ }
266
+
267
+ export const WithHook: Story = {
268
+ render: () => {
269
+ const { shake, ShakeWrapper } = useErrorShake({
270
+ intensity: 'medium',
271
+ onComplete: () => console.log('Shake complete!'),
272
+ })
273
+
274
+ return (
275
+ <div className="space-y-6">
276
+ <ShakeWrapper>
277
+ <div className="p-6 border rounded-lg bg-card w-[300px]">
278
+ <h3 className="font-semibold mb-2">Using Hook</h3>
279
+ <p className="text-sm text-muted-foreground">
280
+ Controlled via useErrorShake hook.
281
+ </p>
282
+ </div>
283
+ </ShakeWrapper>
284
+ <Button variant="destructive" onClick={shake}>
285
+ Trigger via Hook
286
+ </Button>
287
+ </div>
288
+ )
289
+ },
290
+ }
291
+
292
+ export const LoginFormExample: Story = {
293
+ render: () => {
294
+ const [username, setUsername] = React.useState('')
295
+ const [password, setPassword] = React.useState('')
296
+ const [errors, setErrors] = React.useState({ username: false, password: false })
297
+ const [loginError, setLoginError] = React.useState(false)
298
+
299
+ const handleSubmit = (e: React.FormEvent) => {
300
+ e.preventDefault()
301
+
302
+ const newErrors = {
303
+ username: !username,
304
+ password: !password,
305
+ }
306
+ setErrors(newErrors)
307
+
308
+ if (!newErrors.username && !newErrors.password) {
309
+ if (username !== 'admin' || password !== 'password') {
310
+ setLoginError(true)
311
+ setTimeout(() => setLoginError(false), 100)
312
+ } else {
313
+ alert('Login successful!')
314
+ }
315
+ }
316
+ }
317
+
318
+ return (
319
+ <WakaErrorShake trigger={loginError} intensity="medium">
320
+ <form onSubmit={handleSubmit} className="w-[320px] p-6 border rounded-lg bg-card">
321
+ <h2 className="text-xl font-bold mb-6 text-center">Login</h2>
322
+ <div className="space-y-4">
323
+ <div>
324
+ <label className="text-sm font-medium">Username</label>
325
+ <WakaFormFieldShake hasError={errors.username}>
326
+ <input
327
+ type="text"
328
+ value={username}
329
+ onChange={(e) => {
330
+ setUsername(e.target.value)
331
+ setErrors((p) => ({ ...p, username: false }))
332
+ }}
333
+ className={`w-full mt-1 px-3 py-2 border rounded-md ${
334
+ errors.username ? 'border-destructive' : ''
335
+ }`}
336
+ placeholder="Enter username"
337
+ />
338
+ </WakaFormFieldShake>
339
+ {errors.username && (
340
+ <p className="text-xs text-destructive mt-1">Username is required</p>
341
+ )}
342
+ </div>
343
+ <div>
344
+ <label className="text-sm font-medium">Password</label>
345
+ <WakaFormFieldShake hasError={errors.password}>
346
+ <input
347
+ type="password"
348
+ value={password}
349
+ onChange={(e) => {
350
+ setPassword(e.target.value)
351
+ setErrors((p) => ({ ...p, password: false }))
352
+ }}
353
+ className={`w-full mt-1 px-3 py-2 border rounded-md ${
354
+ errors.password ? 'border-destructive' : ''
355
+ }`}
356
+ placeholder="Enter password"
357
+ />
358
+ </WakaFormFieldShake>
359
+ {errors.password && (
360
+ <p className="text-xs text-destructive mt-1">Password is required</p>
361
+ )}
362
+ </div>
363
+ <Button type="submit" className="w-full">
364
+ Sign In
365
+ </Button>
366
+ </div>
367
+ <p className="text-xs text-muted-foreground mt-4 text-center">
368
+ Try: admin / password
369
+ </p>
370
+ </form>
371
+ </WakaErrorShake>
372
+ )
373
+ },
374
+ }
375
+
376
+ export const WithCallback: Story = {
377
+ render: () => {
378
+ const [trigger, setTrigger] = React.useState(false)
379
+ const [message, setMessage] = React.useState('')
380
+
381
+ return (
382
+ <div className="space-y-6">
383
+ <WakaErrorShake
384
+ trigger={trigger}
385
+ onComplete={() => setMessage('Shake animation completed!')}
386
+ >
387
+ <div className="p-6 border rounded-lg bg-card w-[300px]">
388
+ <h3 className="font-semibold mb-2">With Callback</h3>
389
+ <p className="text-sm text-muted-foreground">
390
+ Callback fires when animation ends.
391
+ </p>
392
+ </div>
393
+ </WakaErrorShake>
394
+ <Button
395
+ variant="destructive"
396
+ onClick={() => {
397
+ setMessage('')
398
+ setTrigger(true)
399
+ setTimeout(() => setTrigger(false), 100)
400
+ }}
401
+ >
402
+ Trigger
403
+ </Button>
404
+ {message && (
405
+ <p className="text-sm text-muted-foreground">{message}</p>
406
+ )}
407
+ </div>
408
+ )
409
+ },
410
+ }