@wakastellar/ui 1.0.12 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (436) hide show
  1. package/README.md +163 -193
  2. package/dist/charts.cjs.js +1 -0
  3. package/dist/charts.es.js +16 -0
  4. package/dist/cli/commands/add.d.ts +7 -0
  5. package/dist/cli/commands/init.d.ts +6 -0
  6. package/dist/cli/commands/list.d.ts +5 -0
  7. package/dist/cli/commands/search.d.ts +1 -0
  8. package/dist/cli/index.cjs +4844 -0
  9. package/dist/cli/index.d.ts +1 -0
  10. package/dist/cli/utils/config.d.ts +29 -0
  11. package/dist/cli/utils/logger.d.ts +20 -0
  12. package/dist/cli/utils/registry.d.ts +23 -0
  13. package/dist/cn-B-fTneHh.js +1 -0
  14. package/dist/cn-DzRe1GWm.mjs +21 -0
  15. package/dist/components/index.d.ts +122 -0
  16. package/dist/components/waka-3d-pie-chart/index.d.ts +67 -0
  17. package/dist/components/waka-achievement-unlock/index.d.ts +83 -0
  18. package/dist/components/waka-activity-feed/index.d.ts +78 -0
  19. package/dist/components/waka-address-autocomplete/index.d.ts +124 -0
  20. package/dist/components/waka-alert-stack/index.d.ts +58 -0
  21. package/dist/components/waka-allocation-matrix/index.d.ts +193 -0
  22. package/dist/components/waka-approval-chain/index.d.ts +43 -0
  23. package/dist/components/waka-audit-log/index.d.ts +142 -0
  24. package/dist/components/waka-badge-showcase/index.d.ts +51 -0
  25. package/dist/components/waka-biometric-prompt/index.d.ts +84 -0
  26. package/dist/components/waka-bottom-sheet/index.d.ts +61 -0
  27. package/dist/components/waka-breadcrumb-path/index.d.ts +46 -0
  28. package/dist/components/waka-budget-burn/index.d.ts +154 -0
  29. package/dist/components/waka-capacity-planner/index.d.ts +132 -0
  30. package/dist/components/waka-cart-summary/index.d.ts +154 -0
  31. package/dist/components/waka-challenge-timer/index.d.ts +86 -0
  32. package/dist/components/waka-chat-bubble/index.d.ts +127 -0
  33. package/dist/components/waka-checklist/index.d.ts +123 -0
  34. package/dist/components/waka-checkout-stepper/index.d.ts +154 -0
  35. package/dist/components/waka-cohort-table/index.d.ts +130 -0
  36. package/dist/components/waka-combo-counter/index.d.ts +53 -0
  37. package/dist/components/waka-command-bar/index.d.ts +45 -0
  38. package/dist/components/waka-compare-period/index.d.ts +122 -0
  39. package/dist/components/waka-connection-matrix/index.d.ts +117 -0
  40. package/dist/components/waka-contribution-graph/index.d.ts +34 -0
  41. package/dist/components/waka-cost-breakdown/index.d.ts +50 -0
  42. package/dist/components/waka-coupon-input/index.d.ts +105 -0
  43. package/dist/components/waka-credit-card-input/index.d.ts +95 -0
  44. package/dist/components/waka-daily-reward/index.d.ts +76 -0
  45. package/dist/components/waka-deployment-lane/index.d.ts +43 -0
  46. package/dist/components/waka-device-trust/index.d.ts +95 -0
  47. package/dist/components/waka-dock/index.d.ts +44 -0
  48. package/dist/components/waka-empty-state/index.d.ts +85 -0
  49. package/dist/components/waka-error-shake/index.d.ts +49 -0
  50. package/dist/components/waka-feature-announcement/index.d.ts +112 -0
  51. package/dist/components/waka-floating-nav/index.d.ts +51 -0
  52. package/dist/components/waka-flow-diagram/index.d.ts +71 -0
  53. package/dist/components/waka-funnel-chart/index.d.ts +108 -0
  54. package/dist/components/waka-glow-card/index.d.ts +32 -0
  55. package/dist/components/waka-goal-progress/index.d.ts +139 -0
  56. package/dist/components/waka-haptic-button/index.d.ts +45 -0
  57. package/dist/components/waka-health-pulse/index.d.ts +28 -0
  58. package/dist/components/waka-heatmap/index.d.ts +135 -0
  59. package/dist/components/waka-hotspot/index.d.ts +106 -0
  60. package/dist/components/waka-incident-timeline/index.d.ts +38 -0
  61. package/dist/components/waka-invoice-preview/index.d.ts +137 -0
  62. package/dist/components/waka-kpi-dashboard/index.d.ts +80 -0
  63. package/dist/components/waka-leaderboard/index.d.ts +85 -0
  64. package/dist/components/waka-level-progress/index.d.ts +89 -0
  65. package/dist/components/waka-liquid-button/index.d.ts +41 -0
  66. package/dist/components/waka-loading-orbit/index.d.ts +90 -0
  67. package/dist/components/waka-loot-box/index.d.ts +87 -0
  68. package/dist/components/waka-magic-link/index.d.ts +34 -0
  69. package/dist/components/waka-magnetic-button/index.d.ts +56 -0
  70. package/dist/components/waka-mention-input/index.d.ts +106 -0
  71. package/dist/components/waka-metric-sparkline/index.d.ts +46 -0
  72. package/dist/components/waka-milestone-road/index.d.ts +91 -0
  73. package/dist/components/waka-morph-button/index.d.ts +62 -0
  74. package/dist/components/waka-network-topology/index.d.ts +35 -0
  75. package/dist/components/waka-orbital-menu/index.d.ts +61 -0
  76. package/dist/components/waka-order-tracker/index.d.ts +121 -0
  77. package/dist/components/waka-password-strength/index.d.ts +98 -0
  78. package/dist/components/waka-payment-method-picker/index.d.ts +88 -0
  79. package/dist/components/waka-permission-matrix/index.d.ts +197 -0
  80. package/dist/components/waka-phone-input/index.d.ts +93 -0
  81. package/dist/components/waka-pipeline-view/index.d.ts +49 -0
  82. package/dist/components/waka-player-card/index.d.ts +36 -0
  83. package/dist/components/waka-points-popup/index.d.ts +75 -0
  84. package/dist/components/waka-power-up/index.d.ts +103 -0
  85. package/dist/components/waka-presence-indicator/index.d.ts +188 -0
  86. package/dist/components/waka-pricing-table/index.d.ts +77 -0
  87. package/dist/components/waka-product-card/index.d.ts +81 -0
  88. package/dist/components/waka-progress-onboarding/index.d.ts +97 -0
  89. package/dist/components/waka-pull-to-refresh/index.d.ts +45 -0
  90. package/dist/components/waka-quest-card/index.d.ts +110 -0
  91. package/dist/components/waka-quota-bar/index.d.ts +100 -0
  92. package/dist/components/waka-radar-score/index.d.ts +95 -0
  93. package/dist/components/waka-rank-badge/index.d.ts +58 -0
  94. package/dist/components/waka-rating-input/index.d.ts +110 -0
  95. package/dist/components/waka-reaction-picker/index.d.ts +77 -0
  96. package/dist/components/waka-region-map/index.d.ts +27 -0
  97. package/dist/components/waka-resource-gauge/index.d.ts +78 -0
  98. package/dist/components/waka-resource-pool/index.d.ts +81 -0
  99. package/dist/components/waka-rollback-slider/index.d.ts +79 -0
  100. package/dist/components/waka-sankey-diagram/index.d.ts +120 -0
  101. package/dist/components/waka-schedule-picker/index.d.ts +100 -0
  102. package/dist/components/waka-scratch-card/index.d.ts +87 -0
  103. package/dist/components/waka-season-pass/index.d.ts +65 -0
  104. package/dist/components/waka-security-score/index.d.ts +124 -0
  105. package/dist/components/waka-server-rack/index.d.ts +44 -0
  106. package/dist/components/waka-session-manager/index.d.ts +116 -0
  107. package/dist/components/waka-signature-pad/index.d.ts +87 -0
  108. package/dist/components/waka-skeleton-wave/index.d.ts +79 -0
  109. package/dist/components/waka-skill-tree/index.d.ts +78 -0
  110. package/dist/components/waka-sla-tracker/index.d.ts +65 -0
  111. package/dist/components/waka-slider-range/index.d.ts +88 -0
  112. package/dist/components/waka-spin-wheel/index.d.ts +51 -0
  113. package/dist/components/waka-spotlight/index.d.ts +47 -0
  114. package/dist/components/waka-stats-hexagon/index.d.ts +149 -0
  115. package/dist/components/waka-status-matrix/index.d.ts +38 -0
  116. package/dist/components/waka-streak-counter/index.d.ts +27 -0
  117. package/dist/components/waka-success-explosion/index.d.ts +51 -0
  118. package/dist/components/waka-swipe-card/index.d.ts +64 -0
  119. package/dist/components/waka-tabs-morph/index.d.ts +66 -0
  120. package/dist/components/waka-tag-input/index.d.ts +134 -0
  121. package/dist/components/waka-team-banner/index.d.ts +122 -0
  122. package/dist/components/waka-terminal-output/index.d.ts +48 -0
  123. package/dist/components/waka-thread-view/index.d.ts +101 -0
  124. package/dist/components/waka-tilt-card/index.d.ts +36 -0
  125. package/dist/components/waka-tooltip-tour/index.d.ts +118 -0
  126. package/dist/components/waka-tour-guide/index.d.ts +122 -0
  127. package/dist/components/waka-tournament-bracket/index.d.ts +101 -0
  128. package/dist/components/waka-treemap-chart/index.d.ts +104 -0
  129. package/dist/components/waka-two-factor-setup/index.d.ts +93 -0
  130. package/dist/components/waka-typewriter/index.d.ts +98 -0
  131. package/dist/components/waka-typing-indicator/index.d.ts +64 -0
  132. package/dist/components/waka-versus-card/index.d.ts +117 -0
  133. package/dist/components/waka-video-call/index.d.ts +170 -0
  134. package/dist/components/waka-voice-message/index.d.ts +117 -0
  135. package/dist/components/waka-welcome-modal/index.d.ts +120 -0
  136. package/dist/components/waka-xp-bar/index.d.ts +54 -0
  137. package/dist/export.cjs.js +1 -0
  138. package/dist/export.d.ts +3 -1
  139. package/dist/export.es.js +5 -0
  140. package/dist/index-B9GTFkji.js +1 -0
  141. package/dist/index-c0jcWyEL.mjs +466 -0
  142. package/dist/index.cjs.js +2530 -22
  143. package/dist/index.d.ts +1 -0
  144. package/dist/index.es.js +72081 -19512
  145. package/dist/rich-text.cjs.js +1 -0
  146. package/dist/rich-text.es.js +4 -0
  147. package/dist/types-BOWIoR7j.mjs +1111 -0
  148. package/dist/types-D2yCJ91P.js +1 -0
  149. package/dist/useDataTableImport-D8R2HQl6.mjs +229 -0
  150. package/dist/useDataTableImport-S_hhA5Wo.js +9 -0
  151. package/package.json +70 -22
  152. package/src/blocks/activity-timeline/index.tsx +586 -0
  153. package/src/blocks/calendar-view/index.tsx +756 -0
  154. package/src/blocks/chat/index.tsx +1018 -0
  155. package/src/blocks/chat/widget.tsx +504 -0
  156. package/src/blocks/dashboard/index.tsx +522 -0
  157. package/src/blocks/empty-states/index.tsx +452 -0
  158. package/src/blocks/error-pages/index.tsx +426 -0
  159. package/src/blocks/faq/index.tsx +479 -0
  160. package/src/blocks/file-manager/index.tsx +890 -0
  161. package/src/blocks/footer/index.tsx +133 -0
  162. package/src/blocks/header/index.tsx +357 -0
  163. package/src/blocks/headtab/index.tsx +139 -0
  164. package/src/blocks/i18n-editor/index.tsx +1016 -0
  165. package/src/blocks/index.ts +80 -0
  166. package/src/blocks/kanban-board/index.tsx +779 -0
  167. package/src/blocks/landing/index.tsx +677 -0
  168. package/src/blocks/language-selector/index.tsx +88 -0
  169. package/src/blocks/layout/index.tsx +159 -0
  170. package/src/blocks/login/index.tsx +339 -0
  171. package/src/blocks/login/types.ts +131 -0
  172. package/src/blocks/pricing/index.tsx +564 -0
  173. package/src/blocks/profile/index.tsx +746 -0
  174. package/src/blocks/settings/index.tsx +558 -0
  175. package/src/blocks/sidebar/index.tsx +713 -0
  176. package/src/blocks/theme-creator-block/index.tsx +835 -0
  177. package/src/blocks/user-management/index.tsx +1037 -0
  178. package/src/blocks/wizard/index.tsx +719 -0
  179. package/src/components/DataTable/DataTable.tsx +406 -0
  180. package/src/components/DataTable/DataTableAdvanced.tsx +720 -0
  181. package/src/components/DataTable/DataTableBody.tsx +216 -0
  182. package/src/components/DataTable/DataTableCell.tsx +172 -0
  183. package/src/components/DataTable/DataTableColumnResizer.tsx +62 -0
  184. package/src/components/DataTable/DataTableConflictResolver.tsx +478 -0
  185. package/src/components/DataTable/DataTableContextMenu.tsx +219 -0
  186. package/src/components/DataTable/DataTableEditCell.tsx +279 -0
  187. package/src/components/DataTable/DataTableFilterBuilder.tsx +519 -0
  188. package/src/components/DataTable/DataTableFilters.tsx +535 -0
  189. package/src/components/DataTable/DataTableGrouping.tsx +147 -0
  190. package/src/components/DataTable/DataTableHeader.tsx +172 -0
  191. package/src/components/DataTable/DataTablePagination.tsx +125 -0
  192. package/src/components/DataTable/DataTableSelection.tsx +269 -0
  193. package/src/components/DataTable/DataTableSyncStatus.tsx +281 -0
  194. package/src/components/DataTable/DataTableToolbar.tsx +262 -0
  195. package/src/components/DataTable/README.md +446 -0
  196. package/src/components/DataTable/__tests__/DataTableAdvanced.test.tsx +426 -0
  197. package/src/components/DataTable/__tests__/DataTableEdit.test.tsx +329 -0
  198. package/src/components/DataTable/__tests__/useDataTableAdvanced.test.ts +455 -0
  199. package/src/components/DataTable/examples/EditExample.tsx +166 -0
  200. package/src/components/DataTable/formatters/index.ts +335 -0
  201. package/src/components/DataTable/hooks/__tests__/useDataTableEdit.test.ts +239 -0
  202. package/src/components/DataTable/hooks/useDataTable.ts +145 -0
  203. package/src/components/DataTable/hooks/useDataTableAdvanced.ts +342 -0
  204. package/src/components/DataTable/hooks/useDataTableAdvancedFilters.ts +637 -0
  205. package/src/components/DataTable/hooks/useDataTableColumnTemplates.ts +186 -0
  206. package/src/components/DataTable/hooks/useDataTableEdit.ts +167 -0
  207. package/src/components/DataTable/hooks/useDataTableExport.ts +227 -0
  208. package/src/components/DataTable/hooks/useDataTableImport.ts +216 -0
  209. package/src/components/DataTable/hooks/useDataTableOffline.ts +481 -0
  210. package/src/components/DataTable/hooks/useDataTableTheme.ts +213 -0
  211. package/src/components/DataTable/hooks/useDataTableVirtualization.ts +99 -0
  212. package/src/components/DataTable/hooks/useTableLayout.ts +85 -0
  213. package/src/components/DataTable/index.ts +81 -0
  214. package/src/components/DataTable/services/IndexedDBService.ts +504 -0
  215. package/src/components/DataTable/templates/index.tsx +803 -0
  216. package/src/components/DataTable/types.ts +504 -0
  217. package/src/components/DataTable/utils.ts +164 -0
  218. package/src/components/DataTable/workers/exportWorker.ts +213 -0
  219. package/src/components/accordion/index.tsx +61 -0
  220. package/src/components/alert/index.tsx +61 -0
  221. package/src/components/alert-dialog/index.tsx +146 -0
  222. package/src/components/aspect-ratio/index.tsx +12 -0
  223. package/src/components/avatar/index.tsx +54 -0
  224. package/src/components/badge/Badge.stories.tsx +64 -0
  225. package/src/components/badge/index.tsx +38 -0
  226. package/src/components/button/Button.stories.tsx +173 -0
  227. package/src/components/button/index.tsx +56 -0
  228. package/src/components/calendar/index.tsx +73 -0
  229. package/src/components/card/index.tsx +78 -0
  230. package/src/components/checkbox/index.tsx +34 -0
  231. package/src/components/code/index.tsx +229 -0
  232. package/src/components/collapsible/index.tsx +16 -0
  233. package/src/components/command/index.tsx +162 -0
  234. package/src/components/context-menu/index.tsx +204 -0
  235. package/src/components/dialog/index.tsx +126 -0
  236. package/src/components/dropdown-menu/index.tsx +204 -0
  237. package/src/components/error-boundary/ErrorBoundary.tsx +281 -0
  238. package/src/components/error-boundary/index.ts +7 -0
  239. package/src/components/form/index.tsx +183 -0
  240. package/src/components/hover-card/index.tsx +33 -0
  241. package/src/components/index.ts +368 -0
  242. package/src/components/input/Input.stories.tsx +100 -0
  243. package/src/components/input/index.tsx +27 -0
  244. package/src/components/input-otp/index.tsx +277 -0
  245. package/src/components/label/index.tsx +30 -0
  246. package/src/components/language-selector/index.tsx +341 -0
  247. package/src/components/menubar/index.tsx +240 -0
  248. package/src/components/navigation-menu/index.tsx +134 -0
  249. package/src/components/popover/index.tsx +35 -0
  250. package/src/components/progress/index.tsx +32 -0
  251. package/src/components/radio-group/index.tsx +48 -0
  252. package/src/components/scroll-area/index.tsx +52 -0
  253. package/src/components/select/index.tsx +164 -0
  254. package/src/components/separator/index.tsx +35 -0
  255. package/src/components/sheet/index.tsx +147 -0
  256. package/src/components/skeleton/index.tsx +22 -0
  257. package/src/components/slider/index.tsx +32 -0
  258. package/src/components/switch/index.tsx +33 -0
  259. package/src/components/table/index.tsx +117 -0
  260. package/src/components/tabs/index.tsx +59 -0
  261. package/src/components/textarea/index.tsx +30 -0
  262. package/src/components/theme-selector/index.tsx +327 -0
  263. package/src/components/toast/index.tsx +133 -0
  264. package/src/components/toaster/index.tsx +34 -0
  265. package/src/components/toggle/index.tsx +49 -0
  266. package/src/components/tooltip/index.tsx +34 -0
  267. package/src/components/typography/index.tsx +276 -0
  268. package/src/components/waka-3d-pie-chart/index.tsx +486 -0
  269. package/src/components/waka-achievement-unlock/index.tsx +716 -0
  270. package/src/components/waka-activity-feed/index.tsx +686 -0
  271. package/src/components/waka-address-autocomplete/index.tsx +1202 -0
  272. package/src/components/waka-admincrumb/index.tsx +349 -0
  273. package/src/components/waka-alert-stack/index.tsx +827 -0
  274. package/src/components/waka-allocation-matrix/index.tsx +1278 -0
  275. package/src/components/waka-approval-chain/index.tsx +766 -0
  276. package/src/components/waka-audit-log/index.tsx +1475 -0
  277. package/src/components/waka-autocomplete/index.tsx +358 -0
  278. package/src/components/waka-badge-showcase/index.tsx +704 -0
  279. package/src/components/waka-barcode/index.tsx +260 -0
  280. package/src/components/waka-biometric-prompt/index.tsx +765 -0
  281. package/src/components/waka-bottom-sheet/index.tsx +495 -0
  282. package/src/components/waka-breadcrumb/index.tsx +376 -0
  283. package/src/components/waka-breadcrumb-path/index.tsx +513 -0
  284. package/src/components/waka-budget-burn/index.tsx +1234 -0
  285. package/src/components/waka-capacity-planner/index.tsx +1107 -0
  286. package/src/components/waka-carousel/index.tsx +893 -0
  287. package/src/components/waka-cart-summary/index.tsx +1055 -0
  288. package/src/components/waka-challenge-timer/index.tsx +1044 -0
  289. package/src/components/waka-charts/WakaAreaChart.tsx +251 -0
  290. package/src/components/waka-charts/WakaBarChart.tsx +222 -0
  291. package/src/components/waka-charts/WakaChart.tsx +124 -0
  292. package/src/components/waka-charts/WakaLineChart.tsx +219 -0
  293. package/src/components/waka-charts/WakaMiniChart.tsx +133 -0
  294. package/src/components/waka-charts/WakaPieChart.tsx +214 -0
  295. package/src/components/waka-charts/WakaSparkline.tsx +229 -0
  296. package/src/components/waka-charts/dataTableHelpers.ts +109 -0
  297. package/src/components/waka-charts/hooks/useChartTheme.ts +123 -0
  298. package/src/components/waka-charts/hooks/useRechartsLoader.ts +234 -0
  299. package/src/components/waka-charts/index.ts +90 -0
  300. package/src/components/waka-charts/types.ts +330 -0
  301. package/src/components/waka-chat-bubble/index.tsx +1060 -0
  302. package/src/components/waka-checklist/index.tsx +1067 -0
  303. package/src/components/waka-checkout-stepper/index.tsx +976 -0
  304. package/src/components/waka-cohort-table/index.tsx +1011 -0
  305. package/src/components/waka-color-picker/index.tsx +447 -0
  306. package/src/components/waka-combo-counter/index.tsx +864 -0
  307. package/src/components/waka-combobox/index.tsx +497 -0
  308. package/src/components/waka-command-bar/index.tsx +403 -0
  309. package/src/components/waka-compare-period/index.tsx +1230 -0
  310. package/src/components/waka-connection-matrix/index.tsx +1053 -0
  311. package/src/components/waka-contribution-graph/index.tsx +552 -0
  312. package/src/components/waka-cost-breakdown/index.tsx +1065 -0
  313. package/src/components/waka-coupon-input/index.tsx +592 -0
  314. package/src/components/waka-credit-card-input/index.tsx +982 -0
  315. package/src/components/waka-daily-reward/index.tsx +762 -0
  316. package/src/components/waka-date-range-picker/index.tsx +378 -0
  317. package/src/components/waka-datetime-picker/index.tsx +793 -0
  318. package/src/components/waka-datetime-picker.form-integration/index.tsx +402 -0
  319. package/src/components/waka-deployment-lane/index.tsx +673 -0
  320. package/src/components/waka-device-trust/index.tsx +1259 -0
  321. package/src/components/waka-dock/index.tsx +285 -0
  322. package/src/components/waka-drawer/index.tsx +319 -0
  323. package/src/components/waka-empty-state/index.tsx +545 -0
  324. package/src/components/waka-error-shake/index.tsx +398 -0
  325. package/src/components/waka-feature-announcement/index.tsx +991 -0
  326. package/src/components/waka-file-upload/index.tsx +437 -0
  327. package/src/components/waka-floating-nav/index.tsx +413 -0
  328. package/src/components/waka-flow-diagram/index.tsx +508 -0
  329. package/src/components/waka-funnel-chart/index.tsx +823 -0
  330. package/src/components/waka-glow-card/index.tsx +246 -0
  331. package/src/components/waka-goal-progress/index.tsx +1025 -0
  332. package/src/components/waka-haptic-button/index.tsx +388 -0
  333. package/src/components/waka-health-pulse/index.tsx +451 -0
  334. package/src/components/waka-heatmap/index.tsx +1026 -0
  335. package/src/components/waka-hotspot/index.tsx +682 -0
  336. package/src/components/waka-image/index.tsx +373 -0
  337. package/src/components/waka-incident-timeline/index.tsx +686 -0
  338. package/src/components/waka-invoice-preview/index.tsx +829 -0
  339. package/src/components/waka-kanban/index.tsx +646 -0
  340. package/src/components/waka-kpi-dashboard/index.tsx +755 -0
  341. package/src/components/waka-leaderboard/index.tsx +746 -0
  342. package/src/components/waka-level-progress/index.tsx +665 -0
  343. package/src/components/waka-liquid-button/index.tsx +520 -0
  344. package/src/components/waka-loading-orbit/index.tsx +478 -0
  345. package/src/components/waka-loot-box/index.tsx +1091 -0
  346. package/src/components/waka-magic-link/index.tsx +321 -0
  347. package/src/components/waka-magnetic-button/index.tsx +567 -0
  348. package/src/components/waka-mention-input/index.tsx +953 -0
  349. package/src/components/waka-metric-sparkline/index.tsx +627 -0
  350. package/src/components/waka-milestone-road/index.tsx +1064 -0
  351. package/src/components/waka-modal/index.tsx +374 -0
  352. package/src/components/waka-morph-button/index.tsx +495 -0
  353. package/src/components/waka-network-topology/index.tsx +801 -0
  354. package/src/components/waka-notifications/index.tsx +414 -0
  355. package/src/components/waka-number-input/index.tsx +373 -0
  356. package/src/components/waka-orbital-menu/index.tsx +445 -0
  357. package/src/components/waka-order-tracker/index.tsx +1041 -0
  358. package/src/components/waka-pagination/index.tsx +393 -0
  359. package/src/components/waka-password-strength/index.tsx +824 -0
  360. package/src/components/waka-payment-method-picker/index.tsx +715 -0
  361. package/src/components/waka-permission-matrix/index.tsx +1302 -0
  362. package/src/components/waka-phone-input/index.tsx +801 -0
  363. package/src/components/waka-pipeline-view/index.tsx +604 -0
  364. package/src/components/waka-player-card/index.tsx +691 -0
  365. package/src/components/waka-points-popup/index.tsx +366 -0
  366. package/src/components/waka-power-up/index.tsx +1155 -0
  367. package/src/components/waka-presence-indicator/index.tsx +1181 -0
  368. package/src/components/waka-pricing-table/index.tsx +755 -0
  369. package/src/components/waka-product-card/index.tsx +786 -0
  370. package/src/components/waka-progress-onboarding/index.tsx +878 -0
  371. package/src/components/waka-pull-to-refresh/index.tsx +451 -0
  372. package/src/components/waka-qrcode/index.tsx +232 -0
  373. package/src/components/waka-quest-card/index.tsx +1275 -0
  374. package/src/components/waka-quota-bar/index.tsx +693 -0
  375. package/src/components/waka-radar-score/index.tsx +512 -0
  376. package/src/components/waka-rank-badge/index.tsx +813 -0
  377. package/src/components/waka-rating-input/index.tsx +560 -0
  378. package/src/components/waka-reaction-picker/index.tsx +1062 -0
  379. package/src/components/waka-region-map/index.tsx +730 -0
  380. package/src/components/waka-resource-gauge/index.tsx +654 -0
  381. package/src/components/waka-resource-pool/index.tsx +1035 -0
  382. package/src/components/waka-rich-text-editor/index.tsx +594 -0
  383. package/src/components/waka-rollback-slider/index.tsx +891 -0
  384. package/src/components/waka-sankey-diagram/index.tsx +1032 -0
  385. package/src/components/waka-schedule-picker/index.tsx +1060 -0
  386. package/src/components/waka-scratch-card/index.tsx +914 -0
  387. package/src/components/waka-season-pass/index.tsx +886 -0
  388. package/src/components/waka-security-score/index.tsx +1126 -0
  389. package/src/components/waka-segmented-control/index.tsx +238 -0
  390. package/src/components/waka-server-rack/index.tsx +764 -0
  391. package/src/components/waka-session-manager/index.tsx +815 -0
  392. package/src/components/waka-signature-pad/index.tsx +744 -0
  393. package/src/components/waka-skeleton-wave/index.tsx +454 -0
  394. package/src/components/waka-skill-tree/index.tsx +1031 -0
  395. package/src/components/waka-sla-tracker/index.tsx +798 -0
  396. package/src/components/waka-slider-range/index.tsx +765 -0
  397. package/src/components/waka-spin-wheel/index.tsx +671 -0
  398. package/src/components/waka-spinner/index.tsx +284 -0
  399. package/src/components/waka-spotlight/index.tsx +410 -0
  400. package/src/components/waka-stat/index.tsx +428 -0
  401. package/src/components/waka-stats-hexagon/index.tsx +824 -0
  402. package/src/components/waka-status-matrix/index.tsx +565 -0
  403. package/src/components/waka-stepper/index.tsx +489 -0
  404. package/src/components/waka-streak-counter/index.tsx +334 -0
  405. package/src/components/waka-success-explosion/index.tsx +453 -0
  406. package/src/components/waka-swipe-card/index.tsx +574 -0
  407. package/src/components/waka-tabs-morph/index.tsx +509 -0
  408. package/src/components/waka-tag-input/index.tsx +877 -0
  409. package/src/components/waka-team-banner/index.tsx +1183 -0
  410. package/src/components/waka-terminal-output/index.tsx +836 -0
  411. package/src/components/waka-theme-creator/index.tsx +762 -0
  412. package/src/components/waka-theme-manager/index.tsx +654 -0
  413. package/src/components/waka-thread-view/index.tsx +874 -0
  414. package/src/components/waka-tilt-card/index.tsx +250 -0
  415. package/src/components/waka-time-picker/index.tsx +479 -0
  416. package/src/components/waka-timeline/index.tsx +385 -0
  417. package/src/components/waka-tooltip-tour/index.tsx +855 -0
  418. package/src/components/waka-tour-guide/index.tsx +920 -0
  419. package/src/components/waka-tournament-bracket/index.tsx +1276 -0
  420. package/src/components/waka-tree/index.tsx +557 -0
  421. package/src/components/waka-treemap-chart/index.tsx +1031 -0
  422. package/src/components/waka-two-factor-setup/index.tsx +995 -0
  423. package/src/components/waka-typewriter/index.tsx +566 -0
  424. package/src/components/waka-typing-indicator/index.tsx +649 -0
  425. package/src/components/waka-versus-card/index.tsx +1026 -0
  426. package/src/components/waka-video/index.tsx +557 -0
  427. package/src/components/waka-video-call/index.tsx +1087 -0
  428. package/src/components/waka-virtual-list/index.tsx +327 -0
  429. package/src/components/waka-voice-message/index.tsx +1019 -0
  430. package/src/components/waka-welcome-modal/index.tsx +790 -0
  431. package/src/components/waka-xp-bar/index.tsx +799 -0
  432. package/src/styles/base.css +108 -0
  433. package/src/styles/code-highlight.css +82 -86
  434. package/src/styles/globals-v3.css +9 -0
  435. package/src/styles/globals.css +57 -74
  436. package/src/styles/tailwind.preset.js +69 -0
@@ -0,0 +1,756 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import { cn } from "../../utils"
5
+ import { Button } from "../../components/button"
6
+ import { Badge } from "../../components/badge"
7
+ import { Card, CardContent, CardHeader, CardTitle } from "../../components/card"
8
+ import {
9
+ Popover,
10
+ PopoverContent,
11
+ PopoverTrigger,
12
+ } from "../../components/popover"
13
+ import {
14
+ Dialog,
15
+ DialogContent,
16
+ DialogDescription,
17
+ DialogFooter,
18
+ DialogHeader,
19
+ DialogTitle,
20
+ } from "../../components/dialog"
21
+ import { Input } from "../../components/input"
22
+ import { Label } from "../../components/label"
23
+ import { Textarea } from "../../components/textarea"
24
+ import {
25
+ Select,
26
+ SelectContent,
27
+ SelectItem,
28
+ SelectTrigger,
29
+ SelectValue,
30
+ } from "../../components/select"
31
+ import {
32
+ ChevronLeft,
33
+ ChevronRight,
34
+ Plus,
35
+ Clock,
36
+ MapPin,
37
+ Users,
38
+ Calendar as CalendarIcon,
39
+ MoreHorizontal,
40
+ Edit,
41
+ Trash2,
42
+ X,
43
+ } from "lucide-react"
44
+
45
+ // ============================================
46
+ // TYPES
47
+ // ============================================
48
+
49
+ export type CalendarViewMode = "month" | "week" | "day" | "agenda"
50
+
51
+ export type EventColor =
52
+ | "blue"
53
+ | "green"
54
+ | "red"
55
+ | "yellow"
56
+ | "purple"
57
+ | "pink"
58
+ | "orange"
59
+ | "cyan"
60
+
61
+ export interface CalendarEvent {
62
+ id: string
63
+ title: string
64
+ description?: string
65
+ start: Date | string
66
+ end: Date | string
67
+ allDay?: boolean
68
+ color?: EventColor
69
+ location?: string
70
+ attendees?: { id: string; name: string; avatar?: string }[]
71
+ recurring?: "daily" | "weekly" | "monthly" | "yearly"
72
+ metadata?: Record<string, unknown>
73
+ }
74
+
75
+ export interface WakaCalendarViewProps {
76
+ /** Événements */
77
+ events: CalendarEvent[]
78
+ /** Date courante */
79
+ currentDate?: Date
80
+ /** Callback changement de date */
81
+ onDateChange?: (date: Date) => void
82
+ /** Mode de vue */
83
+ viewMode?: CalendarViewMode
84
+ /** Callback changement de mode */
85
+ onViewModeChange?: (mode: CalendarViewMode) => void
86
+ /** Callback clic sur un événement */
87
+ onEventClick?: (event: CalendarEvent) => void
88
+ /** Callback création d'événement */
89
+ onEventCreate?: (event: Partial<CalendarEvent>) => void
90
+ /** Callback modification d'événement */
91
+ onEventEdit?: (eventId: string, data: Partial<CalendarEvent>) => void
92
+ /** Callback suppression d'événement */
93
+ onEventDelete?: (eventId: string) => void
94
+ /** Callback clic sur un jour */
95
+ onDayClick?: (date: Date) => void
96
+ /** Afficher le header */
97
+ showHeader?: boolean
98
+ /** Afficher le sélecteur de vue */
99
+ showViewSelector?: boolean
100
+ /** Afficher le bouton ajouter */
101
+ showAddButton?: boolean
102
+ /** Premier jour de la semaine (0 = dimanche, 1 = lundi) */
103
+ weekStartsOn?: 0 | 1
104
+ /** Locale */
105
+ locale?: string
106
+ /** Classes CSS additionnelles */
107
+ className?: string
108
+ }
109
+
110
+ // ============================================
111
+ // COLOR CONFIG
112
+ // ============================================
113
+
114
+ const eventColors: Record<EventColor, { bg: string; text: string; border: string }> = {
115
+ blue: { bg: "bg-blue-100", text: "text-blue-700", border: "border-blue-500" },
116
+ green: { bg: "bg-green-100", text: "text-green-700", border: "border-green-500" },
117
+ red: { bg: "bg-red-100", text: "text-red-700", border: "border-red-500" },
118
+ yellow: { bg: "bg-yellow-100", text: "text-yellow-700", border: "border-yellow-500" },
119
+ purple: { bg: "bg-purple-100", text: "text-purple-700", border: "border-purple-500" },
120
+ pink: { bg: "bg-pink-100", text: "text-pink-700", border: "border-pink-500" },
121
+ orange: { bg: "bg-orange-100", text: "text-orange-700", border: "border-orange-500" },
122
+ cyan: { bg: "bg-cyan-100", text: "text-cyan-700", border: "border-cyan-500" },
123
+ }
124
+
125
+ // ============================================
126
+ // HELPERS
127
+ // ============================================
128
+
129
+ function getDaysInMonth(year: number, month: number): Date[] {
130
+ const days: Date[] = []
131
+ const firstDay = new Date(year, month, 1)
132
+ const lastDay = new Date(year, month + 1, 0)
133
+
134
+ for (let d = 1; d <= lastDay.getDate(); d++) {
135
+ days.push(new Date(year, month, d))
136
+ }
137
+
138
+ return days
139
+ }
140
+
141
+ function getWeekDays(date: Date, weekStartsOn: 0 | 1): Date[] {
142
+ const days: Date[] = []
143
+ const day = date.getDay()
144
+ const diff = (day < weekStartsOn ? 7 : 0) + day - weekStartsOn
145
+
146
+ const start = new Date(date)
147
+ start.setDate(date.getDate() - diff)
148
+
149
+ for (let i = 0; i < 7; i++) {
150
+ const d = new Date(start)
151
+ d.setDate(start.getDate() + i)
152
+ days.push(d)
153
+ }
154
+
155
+ return days
156
+ }
157
+
158
+ function isSameDay(d1: Date, d2: Date): boolean {
159
+ return (
160
+ d1.getFullYear() === d2.getFullYear() &&
161
+ d1.getMonth() === d2.getMonth() &&
162
+ d1.getDate() === d2.getDate()
163
+ )
164
+ }
165
+
166
+ function getEventsForDay(events: CalendarEvent[], date: Date): CalendarEvent[] {
167
+ return events.filter((event) => {
168
+ const start = typeof event.start === "string" ? new Date(event.start) : event.start
169
+ const end = typeof event.end === "string" ? new Date(event.end) : event.end
170
+
171
+ if (event.allDay) {
172
+ return isSameDay(start, date) || (date >= start && date <= end)
173
+ }
174
+
175
+ return isSameDay(start, date)
176
+ })
177
+ }
178
+
179
+ // ============================================
180
+ // SUB-COMPONENTS
181
+ // ============================================
182
+
183
+ interface CalendarHeaderProps {
184
+ currentDate: Date
185
+ viewMode: CalendarViewMode
186
+ onPrevious: () => void
187
+ onNext: () => void
188
+ onToday: () => void
189
+ onViewModeChange?: (mode: CalendarViewMode) => void
190
+ onAddClick?: () => void
191
+ showViewSelector: boolean
192
+ showAddButton: boolean
193
+ locale: string
194
+ }
195
+
196
+ function CalendarHeader({
197
+ currentDate,
198
+ viewMode,
199
+ onPrevious,
200
+ onNext,
201
+ onToday,
202
+ onViewModeChange,
203
+ onAddClick,
204
+ showViewSelector,
205
+ showAddButton,
206
+ locale,
207
+ }: CalendarHeaderProps) {
208
+ const getTitle = (): string => {
209
+ switch (viewMode) {
210
+ case "month":
211
+ return currentDate.toLocaleDateString(locale, { month: "long", year: "numeric" })
212
+ case "week":
213
+ return `Semaine du ${currentDate.toLocaleDateString(locale, { day: "numeric", month: "long" })}`
214
+ case "day":
215
+ return currentDate.toLocaleDateString(locale, {
216
+ weekday: "long",
217
+ day: "numeric",
218
+ month: "long",
219
+ year: "numeric",
220
+ })
221
+ case "agenda":
222
+ return "Agenda"
223
+ default:
224
+ return ""
225
+ }
226
+ }
227
+
228
+ return (
229
+ <div className="flex items-center justify-between mb-4">
230
+ <div className="flex items-center gap-2">
231
+ <Button variant="outline" size="icon" onClick={onPrevious}>
232
+ <ChevronLeft className="h-4 w-4" />
233
+ </Button>
234
+ <Button variant="outline" size="icon" onClick={onNext}>
235
+ <ChevronRight className="h-4 w-4" />
236
+ </Button>
237
+ <Button variant="outline" size="sm" onClick={onToday}>
238
+ Aujourd'hui
239
+ </Button>
240
+ <h2 className="text-xl font-semibold ml-4 capitalize">{getTitle()}</h2>
241
+ </div>
242
+
243
+ <div className="flex items-center gap-2">
244
+ {showViewSelector && onViewModeChange && (
245
+ <Select value={viewMode} onValueChange={(v) => onViewModeChange(v as CalendarViewMode)}>
246
+ <SelectTrigger className="w-[120px]">
247
+ <SelectValue />
248
+ </SelectTrigger>
249
+ <SelectContent>
250
+ <SelectItem value="month">Mois</SelectItem>
251
+ <SelectItem value="week">Semaine</SelectItem>
252
+ <SelectItem value="day">Jour</SelectItem>
253
+ <SelectItem value="agenda">Agenda</SelectItem>
254
+ </SelectContent>
255
+ </Select>
256
+ )}
257
+ {showAddButton && onAddClick && (
258
+ <Button onClick={onAddClick}>
259
+ <Plus className="h-4 w-4 mr-2" />
260
+ Événement
261
+ </Button>
262
+ )}
263
+ </div>
264
+ </div>
265
+ )
266
+ }
267
+
268
+ interface EventBadgeProps {
269
+ event: CalendarEvent
270
+ onClick?: () => void
271
+ compact?: boolean
272
+ }
273
+
274
+ function EventBadge({ event, onClick, compact = false }: EventBadgeProps) {
275
+ const color = eventColors[event.color || "blue"]
276
+ const start = typeof event.start === "string" ? new Date(event.start) : event.start
277
+
278
+ return (
279
+ <button
280
+ onClick={(e) => {
281
+ e.stopPropagation()
282
+ onClick?.()
283
+ }}
284
+ className={cn(
285
+ "w-full text-left rounded px-1.5 py-0.5 text-xs truncate border-l-2",
286
+ color.bg,
287
+ color.text,
288
+ color.border
289
+ )}
290
+ >
291
+ {!event.allDay && !compact && (
292
+ <span className="font-medium mr-1">
293
+ {start.toLocaleTimeString("fr-FR", { hour: "2-digit", minute: "2-digit" })}
294
+ </span>
295
+ )}
296
+ {event.title}
297
+ </button>
298
+ )
299
+ }
300
+
301
+ interface EventPopoverProps {
302
+ event: CalendarEvent
303
+ onEdit?: () => void
304
+ onDelete?: () => void
305
+ }
306
+
307
+ function EventPopover({ event, onEdit, onDelete }: EventPopoverProps) {
308
+ const start = typeof event.start === "string" ? new Date(event.start) : event.start
309
+ const end = typeof event.end === "string" ? new Date(event.end) : event.end
310
+ const color = eventColors[event.color || "blue"]
311
+
312
+ return (
313
+ <div className="w-72">
314
+ <div className="flex items-start justify-between">
315
+ <div className={cn("w-3 h-3 rounded-full mt-1", color.bg.replace("100", "500"))} />
316
+ <div className="flex gap-1">
317
+ {onEdit && (
318
+ <Button variant="ghost" size="icon" className="h-7 w-7" onClick={onEdit}>
319
+ <Edit className="h-3 w-3" />
320
+ </Button>
321
+ )}
322
+ {onDelete && (
323
+ <Button variant="ghost" size="icon" className="h-7 w-7" onClick={onDelete}>
324
+ <Trash2 className="h-3 w-3" />
325
+ </Button>
326
+ )}
327
+ </div>
328
+ </div>
329
+
330
+ <h4 className="font-semibold mt-2">{event.title}</h4>
331
+
332
+ <div className="space-y-2 mt-3 text-sm text-muted-foreground">
333
+ <div className="flex items-center gap-2">
334
+ <Clock className="h-4 w-4" />
335
+ {event.allDay ? (
336
+ <span>Toute la journée</span>
337
+ ) : (
338
+ <span>
339
+ {start.toLocaleString("fr-FR", {
340
+ weekday: "short",
341
+ day: "numeric",
342
+ month: "short",
343
+ hour: "2-digit",
344
+ minute: "2-digit",
345
+ })}
346
+ {" - "}
347
+ {end.toLocaleTimeString("fr-FR", { hour: "2-digit", minute: "2-digit" })}
348
+ </span>
349
+ )}
350
+ </div>
351
+
352
+ {event.location && (
353
+ <div className="flex items-center gap-2">
354
+ <MapPin className="h-4 w-4" />
355
+ <span>{event.location}</span>
356
+ </div>
357
+ )}
358
+
359
+ {event.attendees && event.attendees.length > 0 && (
360
+ <div className="flex items-center gap-2">
361
+ <Users className="h-4 w-4" />
362
+ <span>{event.attendees.length} participant(s)</span>
363
+ </div>
364
+ )}
365
+ </div>
366
+
367
+ {event.description && (
368
+ <p className="mt-3 text-sm">{event.description}</p>
369
+ )}
370
+ </div>
371
+ )
372
+ }
373
+
374
+ interface MonthViewProps {
375
+ currentDate: Date
376
+ events: CalendarEvent[]
377
+ weekStartsOn: 0 | 1
378
+ locale: string
379
+ onDayClick?: (date: Date) => void
380
+ onEventClick?: (event: CalendarEvent) => void
381
+ onEventEdit?: (eventId: string, data: Partial<CalendarEvent>) => void
382
+ onEventDelete?: (eventId: string) => void
383
+ }
384
+
385
+ function MonthView({
386
+ currentDate,
387
+ events,
388
+ weekStartsOn,
389
+ locale,
390
+ onDayClick,
391
+ onEventClick,
392
+ onEventEdit,
393
+ onEventDelete,
394
+ }: MonthViewProps) {
395
+ const year = currentDate.getFullYear()
396
+ const month = currentDate.getMonth()
397
+ const days = getDaysInMonth(year, month)
398
+ const today = new Date()
399
+
400
+ // Get day names
401
+ const dayNames = Array.from({ length: 7 }, (_, i) => {
402
+ const d = new Date(2024, 0, weekStartsOn + i)
403
+ return d.toLocaleDateString(locale, { weekday: "short" })
404
+ })
405
+
406
+ // Get first day offset
407
+ const firstDay = new Date(year, month, 1)
408
+ const startOffset = (firstDay.getDay() - weekStartsOn + 7) % 7
409
+
410
+ // Build calendar grid
411
+ const grid: (Date | null)[] = []
412
+ for (let i = 0; i < startOffset; i++) {
413
+ grid.push(null)
414
+ }
415
+ grid.push(...days)
416
+
417
+ // Fill remaining cells
418
+ while (grid.length % 7 !== 0) {
419
+ grid.push(null)
420
+ }
421
+
422
+ return (
423
+ <div className="border rounded-lg overflow-hidden">
424
+ {/* Day headers */}
425
+ <div className="grid grid-cols-7 bg-muted">
426
+ {dayNames.map((name) => (
427
+ <div key={name} className="p-2 text-center text-sm font-medium capitalize">
428
+ {name}
429
+ </div>
430
+ ))}
431
+ </div>
432
+
433
+ {/* Calendar grid */}
434
+ <div className="grid grid-cols-7">
435
+ {grid.map((date, index) => {
436
+ const dayEvents = date ? getEventsForDay(events, date) : []
437
+ const isToday = date && isSameDay(date, today)
438
+ const isCurrentMonth = date && date.getMonth() === month
439
+
440
+ return (
441
+ <div
442
+ key={index}
443
+ className={cn(
444
+ "min-h-[100px] border-t border-l p-1 cursor-pointer hover:bg-muted/50",
445
+ !isCurrentMonth && "bg-muted/30 text-muted-foreground"
446
+ )}
447
+ onClick={() => date && onDayClick?.(date)}
448
+ >
449
+ {date && (
450
+ <>
451
+ <div
452
+ className={cn(
453
+ "text-sm font-medium mb-1 w-7 h-7 flex items-center justify-center rounded-full",
454
+ isToday && "bg-primary text-primary-foreground"
455
+ )}
456
+ >
457
+ {date.getDate()}
458
+ </div>
459
+ <div className="space-y-1">
460
+ {dayEvents.slice(0, 3).map((event) => (
461
+ <Popover key={event.id}>
462
+ <PopoverTrigger asChild>
463
+ <div>
464
+ <EventBadge
465
+ event={event}
466
+ onClick={() => onEventClick?.(event)}
467
+ compact
468
+ />
469
+ </div>
470
+ </PopoverTrigger>
471
+ <PopoverContent>
472
+ <EventPopover
473
+ event={event}
474
+ onEdit={() => onEventEdit?.(event.id, {})}
475
+ onDelete={() => onEventDelete?.(event.id)}
476
+ />
477
+ </PopoverContent>
478
+ </Popover>
479
+ ))}
480
+ {dayEvents.length > 3 && (
481
+ <button className="text-xs text-muted-foreground hover:text-foreground">
482
+ +{dayEvents.length - 3} autres
483
+ </button>
484
+ )}
485
+ </div>
486
+ </>
487
+ )}
488
+ </div>
489
+ )
490
+ })}
491
+ </div>
492
+ </div>
493
+ )
494
+ }
495
+
496
+ interface AgendaViewProps {
497
+ currentDate: Date
498
+ events: CalendarEvent[]
499
+ locale: string
500
+ onEventClick?: (event: CalendarEvent) => void
501
+ }
502
+
503
+ function AgendaView({ currentDate, events, locale, onEventClick }: AgendaViewProps) {
504
+ // Get events for the next 30 days
505
+ const upcomingEvents = events
506
+ .filter((event) => {
507
+ const start = typeof event.start === "string" ? new Date(event.start) : event.start
508
+ const thirtyDaysLater = new Date(currentDate)
509
+ thirtyDaysLater.setDate(thirtyDaysLater.getDate() + 30)
510
+ return start >= currentDate && start <= thirtyDaysLater
511
+ })
512
+ .sort((a, b) => {
513
+ const aStart = typeof a.start === "string" ? new Date(a.start) : a.start
514
+ const bStart = typeof b.start === "string" ? new Date(b.start) : b.start
515
+ return aStart.getTime() - bStart.getTime()
516
+ })
517
+
518
+ // Group by date
519
+ const groupedEvents: Record<string, CalendarEvent[]> = {}
520
+ upcomingEvents.forEach((event) => {
521
+ const start = typeof event.start === "string" ? new Date(event.start) : event.start
522
+ const key = start.toDateString()
523
+ if (!groupedEvents[key]) {
524
+ groupedEvents[key] = []
525
+ }
526
+ groupedEvents[key].push(event)
527
+ })
528
+
529
+ return (
530
+ <div className="space-y-4">
531
+ {Object.entries(groupedEvents).map(([dateKey, dayEvents]) => {
532
+ const date = new Date(dateKey)
533
+ return (
534
+ <div key={dateKey}>
535
+ <h3 className="text-sm font-medium text-muted-foreground mb-2 capitalize">
536
+ {date.toLocaleDateString(locale, {
537
+ weekday: "long",
538
+ day: "numeric",
539
+ month: "long",
540
+ })}
541
+ </h3>
542
+ <div className="space-y-2">
543
+ {dayEvents.map((event) => {
544
+ const color = eventColors[event.color || "blue"]
545
+ const start = typeof event.start === "string" ? new Date(event.start) : event.start
546
+ const end = typeof event.end === "string" ? new Date(event.end) : event.end
547
+
548
+ return (
549
+ <Card
550
+ key={event.id}
551
+ className="cursor-pointer hover:shadow-md transition-shadow"
552
+ onClick={() => onEventClick?.(event)}
553
+ >
554
+ <CardContent className="p-3 flex gap-3">
555
+ <div className={cn("w-1 rounded-full", color.bg.replace("100", "500"))} />
556
+ <div className="flex-1">
557
+ <h4 className="font-medium">{event.title}</h4>
558
+ <p className="text-sm text-muted-foreground">
559
+ {event.allDay
560
+ ? "Toute la journée"
561
+ : `${start.toLocaleTimeString(locale, { hour: "2-digit", minute: "2-digit" })} - ${end.toLocaleTimeString(locale, { hour: "2-digit", minute: "2-digit" })}`}
562
+ </p>
563
+ {event.location && (
564
+ <p className="text-sm text-muted-foreground flex items-center gap-1 mt-1">
565
+ <MapPin className="h-3 w-3" />
566
+ {event.location}
567
+ </p>
568
+ )}
569
+ </div>
570
+ </CardContent>
571
+ </Card>
572
+ )
573
+ })}
574
+ </div>
575
+ </div>
576
+ )
577
+ })}
578
+
579
+ {Object.keys(groupedEvents).length === 0 && (
580
+ <div className="text-center py-12 text-muted-foreground">
581
+ Aucun événement à venir
582
+ </div>
583
+ )}
584
+ </div>
585
+ )
586
+ }
587
+
588
+ // ============================================
589
+ // MAIN COMPONENT
590
+ // ============================================
591
+
592
+ export function WakaCalendarView({
593
+ events,
594
+ currentDate: externalCurrentDate,
595
+ onDateChange,
596
+ viewMode: externalViewMode,
597
+ onViewModeChange,
598
+ onEventClick,
599
+ onEventCreate,
600
+ onEventEdit,
601
+ onEventDelete,
602
+ onDayClick,
603
+ showHeader = true,
604
+ showViewSelector = true,
605
+ showAddButton = true,
606
+ weekStartsOn = 1,
607
+ locale = "fr-FR",
608
+ className,
609
+ }: WakaCalendarViewProps) {
610
+ const [internalCurrentDate, setInternalCurrentDate] = React.useState(new Date())
611
+ const [internalViewMode, setInternalViewMode] = React.useState<CalendarViewMode>("month")
612
+ const [isAddDialogOpen, setIsAddDialogOpen] = React.useState(false)
613
+
614
+ const currentDate = externalCurrentDate ?? internalCurrentDate
615
+ const viewMode = externalViewMode ?? internalViewMode
616
+
617
+ const handleDateChange = (date: Date) => {
618
+ if (onDateChange) {
619
+ onDateChange(date)
620
+ } else {
621
+ setInternalCurrentDate(date)
622
+ }
623
+ }
624
+
625
+ const handleViewModeChange = (mode: CalendarViewMode) => {
626
+ if (onViewModeChange) {
627
+ onViewModeChange(mode)
628
+ } else {
629
+ setInternalViewMode(mode)
630
+ }
631
+ }
632
+
633
+ const navigatePrevious = () => {
634
+ const newDate = new Date(currentDate)
635
+ switch (viewMode) {
636
+ case "month":
637
+ newDate.setMonth(newDate.getMonth() - 1)
638
+ break
639
+ case "week":
640
+ newDate.setDate(newDate.getDate() - 7)
641
+ break
642
+ case "day":
643
+ newDate.setDate(newDate.getDate() - 1)
644
+ break
645
+ }
646
+ handleDateChange(newDate)
647
+ }
648
+
649
+ const navigateNext = () => {
650
+ const newDate = new Date(currentDate)
651
+ switch (viewMode) {
652
+ case "month":
653
+ newDate.setMonth(newDate.getMonth() + 1)
654
+ break
655
+ case "week":
656
+ newDate.setDate(newDate.getDate() + 7)
657
+ break
658
+ case "day":
659
+ newDate.setDate(newDate.getDate() + 1)
660
+ break
661
+ }
662
+ handleDateChange(newDate)
663
+ }
664
+
665
+ const navigateToday = () => {
666
+ handleDateChange(new Date())
667
+ }
668
+
669
+ return (
670
+ <div className={cn("space-y-4", className)}>
671
+ {showHeader && (
672
+ <CalendarHeader
673
+ currentDate={currentDate}
674
+ viewMode={viewMode}
675
+ onPrevious={navigatePrevious}
676
+ onNext={navigateNext}
677
+ onToday={navigateToday}
678
+ onViewModeChange={handleViewModeChange}
679
+ onAddClick={() => setIsAddDialogOpen(true)}
680
+ showViewSelector={showViewSelector}
681
+ showAddButton={showAddButton}
682
+ locale={locale}
683
+ />
684
+ )}
685
+
686
+ {viewMode === "month" && (
687
+ <MonthView
688
+ currentDate={currentDate}
689
+ events={events}
690
+ weekStartsOn={weekStartsOn}
691
+ locale={locale}
692
+ onDayClick={onDayClick}
693
+ onEventClick={onEventClick}
694
+ onEventEdit={onEventEdit}
695
+ onEventDelete={onEventDelete}
696
+ />
697
+ )}
698
+
699
+ {viewMode === "agenda" && (
700
+ <AgendaView
701
+ currentDate={currentDate}
702
+ events={events}
703
+ locale={locale}
704
+ onEventClick={onEventClick}
705
+ />
706
+ )}
707
+
708
+ {(viewMode === "week" || viewMode === "day") && (
709
+ <div className="text-center py-12 text-muted-foreground">
710
+ Vue {viewMode === "week" ? "semaine" : "jour"} - À implémenter
711
+ </div>
712
+ )}
713
+ </div>
714
+ )
715
+ }
716
+
717
+ // ============================================
718
+ // PRESETS
719
+ // ============================================
720
+
721
+ export const defaultCalendarEvents: CalendarEvent[] = [
722
+ {
723
+ id: "1",
724
+ title: "Réunion d'équipe",
725
+ start: new Date(),
726
+ end: new Date(Date.now() + 1000 * 60 * 60),
727
+ color: "blue",
728
+ location: "Salle de réunion A",
729
+ },
730
+ {
731
+ id: "2",
732
+ title: "Déjeuner avec le client",
733
+ start: new Date(Date.now() + 1000 * 60 * 60 * 24),
734
+ end: new Date(Date.now() + 1000 * 60 * 60 * 25),
735
+ color: "green",
736
+ location: "Restaurant Le Gourmet",
737
+ },
738
+ {
739
+ id: "3",
740
+ title: "Formation React",
741
+ start: new Date(Date.now() + 1000 * 60 * 60 * 24 * 2),
742
+ end: new Date(Date.now() + 1000 * 60 * 60 * 24 * 2 + 1000 * 60 * 60 * 4),
743
+ color: "purple",
744
+ allDay: true,
745
+ },
746
+ {
747
+ id: "4",
748
+ title: "Deadline projet",
749
+ start: new Date(Date.now() + 1000 * 60 * 60 * 24 * 5),
750
+ end: new Date(Date.now() + 1000 * 60 * 60 * 24 * 5),
751
+ color: "red",
752
+ allDay: true,
753
+ },
754
+ ]
755
+
756
+ export default WakaCalendarView