@mohou/ui 1.0.20

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 (604) hide show
  1. package/README.md +10 -0
  2. package/lib/types/blocks/activity-feed.d.ts +12 -0
  3. package/lib/types/blocks/activity-feed.d.ts.map +1 -0
  4. package/lib/types/blocks/app-shell.d.ts +17 -0
  5. package/lib/types/blocks/app-shell.d.ts.map +1 -0
  6. package/lib/types/blocks/attachment-gallery.d.ts +15 -0
  7. package/lib/types/blocks/attachment-gallery.d.ts.map +1 -0
  8. package/lib/types/blocks/bar-chart.d.ts +19 -0
  9. package/lib/types/blocks/bar-chart.d.ts.map +1 -0
  10. package/lib/types/blocks/comment-thread.d.ts +17 -0
  11. package/lib/types/blocks/comment-thread.d.ts.map +1 -0
  12. package/lib/types/blocks/dashboard-shell.d.ts +35 -0
  13. package/lib/types/blocks/dashboard-shell.d.ts.map +1 -0
  14. package/lib/types/blocks/description-list.d.ts +14 -0
  15. package/lib/types/blocks/description-list.d.ts.map +1 -0
  16. package/lib/types/blocks/detail-panel.d.ts +16 -0
  17. package/lib/types/blocks/detail-panel.d.ts.map +1 -0
  18. package/lib/types/blocks/donut-chart.d.ts +21 -0
  19. package/lib/types/blocks/donut-chart.d.ts.map +1 -0
  20. package/lib/types/blocks/env-badge.d.ts +11 -0
  21. package/lib/types/blocks/env-badge.d.ts.map +1 -0
  22. package/lib/types/blocks/env-table.d.ts +29 -0
  23. package/lib/types/blocks/env-table.d.ts.map +1 -0
  24. package/lib/types/blocks/file-tree.d.ts +12 -0
  25. package/lib/types/blocks/file-tree.d.ts.map +1 -0
  26. package/lib/types/blocks/filter-bar.d.ts +15 -0
  27. package/lib/types/blocks/filter-bar.d.ts.map +1 -0
  28. package/lib/types/blocks/form-sheet.d.ts +47 -0
  29. package/lib/types/blocks/form-sheet.d.ts.map +1 -0
  30. package/lib/types/blocks/gauge.d.ts +14 -0
  31. package/lib/types/blocks/gauge.d.ts.map +1 -0
  32. package/lib/types/blocks/list-detail.d.ts +42 -0
  33. package/lib/types/blocks/list-detail.d.ts.map +1 -0
  34. package/lib/types/blocks/notification-center.d.ts +16 -0
  35. package/lib/types/blocks/notification-center.d.ts.map +1 -0
  36. package/lib/types/blocks/page-header.d.ts +15 -0
  37. package/lib/types/blocks/page-header.d.ts.map +1 -0
  38. package/lib/types/blocks/progress-ring.d.ts +13 -0
  39. package/lib/types/blocks/progress-ring.d.ts.map +1 -0
  40. package/lib/types/blocks/radar-chart.d.ts +19 -0
  41. package/lib/types/blocks/radar-chart.d.ts.map +1 -0
  42. package/lib/types/blocks/request-inspector.d.ts +14 -0
  43. package/lib/types/blocks/request-inspector.d.ts.map +1 -0
  44. package/lib/types/blocks/reveal.d.ts +30 -0
  45. package/lib/types/blocks/reveal.d.ts.map +1 -0
  46. package/lib/types/blocks/run-timeline.d.ts +12 -0
  47. package/lib/types/blocks/run-timeline.d.ts.map +1 -0
  48. package/lib/types/blocks/scrollspy.d.ts +15 -0
  49. package/lib/types/blocks/scrollspy.d.ts.map +1 -0
  50. package/lib/types/blocks/settings-split.d.ts +47 -0
  51. package/lib/types/blocks/settings-split.d.ts.map +1 -0
  52. package/lib/types/blocks/severity-chip.d.ts +23 -0
  53. package/lib/types/blocks/severity-chip.d.ts.map +1 -0
  54. package/lib/types/blocks/sparkline.d.ts +14 -0
  55. package/lib/types/blocks/sparkline.d.ts.map +1 -0
  56. package/lib/types/blocks/stat-card.d.ts +17 -0
  57. package/lib/types/blocks/stat-card.d.ts.map +1 -0
  58. package/lib/types/blocks/status-badge.d.ts +21 -0
  59. package/lib/types/blocks/status-badge.d.ts.map +1 -0
  60. package/lib/types/blocks/table-page.d.ts +35 -0
  61. package/lib/types/blocks/table-page.d.ts.map +1 -0
  62. package/lib/types/blocks/terminal.d.ts +12 -0
  63. package/lib/types/blocks/terminal.d.ts.map +1 -0
  64. package/lib/types/blocks/test-step-list.d.ts +17 -0
  65. package/lib/types/blocks/test-step-list.d.ts.map +1 -0
  66. package/lib/types/blocks/trend-card.d.ts +20 -0
  67. package/lib/types/blocks/trend-card.d.ts.map +1 -0
  68. package/lib/types/blocks/wizard-shell.d.ts +47 -0
  69. package/lib/types/blocks/wizard-shell.d.ts.map +1 -0
  70. package/lib/types/components/accordion.d.ts +14 -0
  71. package/lib/types/components/accordion.d.ts.map +1 -0
  72. package/lib/types/components/alert-dialog.d.ts +26 -0
  73. package/lib/types/components/alert-dialog.d.ts.map +1 -0
  74. package/lib/types/components/alert.d.ts +18 -0
  75. package/lib/types/components/alert.d.ts.map +1 -0
  76. package/lib/types/components/aspect-ratio.d.ts +9 -0
  77. package/lib/types/components/aspect-ratio.d.ts.map +1 -0
  78. package/lib/types/components/attachment.d.ts +28 -0
  79. package/lib/types/components/attachment.d.ts.map +1 -0
  80. package/lib/types/components/avatar.d.ts +16 -0
  81. package/lib/types/components/avatar.d.ts.map +1 -0
  82. package/lib/types/components/badge.d.ts +15 -0
  83. package/lib/types/components/badge.d.ts.map +1 -0
  84. package/lib/types/components/breadcrumb.d.ts +15 -0
  85. package/lib/types/components/breadcrumb.d.ts.map +1 -0
  86. package/lib/types/components/bubble.d.ts +21 -0
  87. package/lib/types/components/bubble.d.ts.map +1 -0
  88. package/lib/types/components/button-group.d.ts +17 -0
  89. package/lib/types/components/button-group.d.ts.map +1 -0
  90. package/lib/types/components/button.d.ts +16 -0
  91. package/lib/types/components/button.d.ts.map +1 -0
  92. package/lib/types/components/calendar.d.ts +15 -0
  93. package/lib/types/components/calendar.d.ts.map +1 -0
  94. package/lib/types/components/card.d.ts +19 -0
  95. package/lib/types/components/card.d.ts.map +1 -0
  96. package/lib/types/components/chart.d.ts +52 -0
  97. package/lib/types/components/chart.d.ts.map +1 -0
  98. package/lib/types/components/checkbox.d.ts +9 -0
  99. package/lib/types/components/checkbox.d.ts.map +1 -0
  100. package/lib/types/components/collapsible.d.ts +10 -0
  101. package/lib/types/components/collapsible.d.ts.map +1 -0
  102. package/lib/types/components/combobox.d.ts +29 -0
  103. package/lib/types/components/combobox.d.ts.map +1 -0
  104. package/lib/types/components/command.d.ts +26 -0
  105. package/lib/types/components/command.d.ts.map +1 -0
  106. package/lib/types/components/context-menu.d.ts +34 -0
  107. package/lib/types/components/context-menu.d.ts.map +1 -0
  108. package/lib/types/components/dialog.d.ts +30 -0
  109. package/lib/types/components/dialog.d.ts.map +1 -0
  110. package/lib/types/components/drawer.d.ts +21 -0
  111. package/lib/types/components/drawer.d.ts.map +1 -0
  112. package/lib/types/components/dropdown-menu.d.ts +37 -0
  113. package/lib/types/components/dropdown-menu.d.ts.map +1 -0
  114. package/lib/types/components/empty.d.ts +24 -0
  115. package/lib/types/components/empty.d.ts.map +1 -0
  116. package/lib/types/components/field.d.ts +31 -0
  117. package/lib/types/components/field.d.ts.map +1 -0
  118. package/lib/types/components/hover-card.d.ts +10 -0
  119. package/lib/types/components/hover-card.d.ts.map +1 -0
  120. package/lib/types/components/input-group.d.ts +23 -0
  121. package/lib/types/components/input-group.d.ts.map +1 -0
  122. package/lib/types/components/input.d.ts +11 -0
  123. package/lib/types/components/input.d.ts.map +1 -0
  124. package/lib/types/components/item.d.ts +27 -0
  125. package/lib/types/components/item.d.ts.map +1 -0
  126. package/lib/types/components/kbd.d.ts +8 -0
  127. package/lib/types/components/kbd.d.ts.map +1 -0
  128. package/lib/types/components/label.d.ts +11 -0
  129. package/lib/types/components/label.d.ts.map +1 -0
  130. package/lib/types/components/marker.d.ts +15 -0
  131. package/lib/types/components/marker.d.ts.map +1 -0
  132. package/lib/types/components/menubar.d.ts +34 -0
  133. package/lib/types/components/menubar.d.ts.map +1 -0
  134. package/lib/types/components/message-scroller.d.ts +15 -0
  135. package/lib/types/components/message-scroller.d.ts.map +1 -0
  136. package/lib/types/components/message.d.ts +15 -0
  137. package/lib/types/components/message.d.ts.map +1 -0
  138. package/lib/types/components/native-select.d.ts +13 -0
  139. package/lib/types/components/native-select.d.ts.map +1 -0
  140. package/lib/types/components/navigation-menu.d.ts +16 -0
  141. package/lib/types/components/navigation-menu.d.ts.map +1 -0
  142. package/lib/types/components/pagination.d.ts +22 -0
  143. package/lib/types/components/pagination.d.ts.map +1 -0
  144. package/lib/types/components/popover.d.ts +17 -0
  145. package/lib/types/components/popover.d.ts.map +1 -0
  146. package/lib/types/components/progress.d.ts +15 -0
  147. package/lib/types/components/progress.d.ts.map +1 -0
  148. package/lib/types/components/questionnaire.d.ts +24 -0
  149. package/lib/types/components/questionnaire.d.ts.map +1 -0
  150. package/lib/types/components/radio-group.d.ts +10 -0
  151. package/lib/types/components/radio-group.d.ts.map +1 -0
  152. package/lib/types/components/resizable.d.ts +15 -0
  153. package/lib/types/components/resizable.d.ts.map +1 -0
  154. package/lib/types/components/scroll-area.d.ts +9 -0
  155. package/lib/types/components/scroll-area.d.ts.map +1 -0
  156. package/lib/types/components/select.d.ts +23 -0
  157. package/lib/types/components/select.d.ts.map +1 -0
  158. package/lib/types/components/separator.d.ts +9 -0
  159. package/lib/types/components/separator.d.ts.map +1 -0
  160. package/lib/types/components/sheet.d.ts +28 -0
  161. package/lib/types/components/sheet.d.ts.map +1 -0
  162. package/lib/types/components/sidebar.d.ts +68 -0
  163. package/lib/types/components/sidebar.d.ts.map +1 -0
  164. package/lib/types/components/skeleton.d.ts +10 -0
  165. package/lib/types/components/skeleton.d.ts.map +1 -0
  166. package/lib/types/components/slider.d.ts +8 -0
  167. package/lib/types/components/slider.d.ts.map +1 -0
  168. package/lib/types/components/spinner.d.ts +9 -0
  169. package/lib/types/components/spinner.d.ts.map +1 -0
  170. package/lib/types/components/switch.d.ts +13 -0
  171. package/lib/types/components/switch.d.ts.map +1 -0
  172. package/lib/types/components/table.d.ts +18 -0
  173. package/lib/types/components/table.d.ts.map +1 -0
  174. package/lib/types/components/tabs.d.ts +18 -0
  175. package/lib/types/components/tabs.d.ts.map +1 -0
  176. package/lib/types/components/textarea.d.ts +11 -0
  177. package/lib/types/components/textarea.d.ts.map +1 -0
  178. package/lib/types/components/toast.d.ts +35 -0
  179. package/lib/types/components/toast.d.ts.map +1 -0
  180. package/lib/types/components/toggle-group.d.ts +16 -0
  181. package/lib/types/components/toggle-group.d.ts.map +1 -0
  182. package/lib/types/components/toggle.d.ts +13 -0
  183. package/lib/types/components/toggle.d.ts.map +1 -0
  184. package/lib/types/components/tooltip.d.ts +14 -0
  185. package/lib/types/components/tooltip.d.ts.map +1 -0
  186. package/lib/types/composites/autocomplete.d.ts +15 -0
  187. package/lib/types/composites/autocomplete.d.ts.map +1 -0
  188. package/lib/types/composites/cascader.d.ts +18 -0
  189. package/lib/types/composites/cascader.d.ts.map +1 -0
  190. package/lib/types/composites/color-picker.d.ts +12 -0
  191. package/lib/types/composites/color-picker.d.ts.map +1 -0
  192. package/lib/types/composites/confirm-dialog.d.ts +17 -0
  193. package/lib/types/composites/confirm-dialog.d.ts.map +1 -0
  194. package/lib/types/composites/copyable.d.ts +12 -0
  195. package/lib/types/composites/copyable.d.ts.map +1 -0
  196. package/lib/types/composites/currency-input.d.ts +13 -0
  197. package/lib/types/composites/currency-input.d.ts.map +1 -0
  198. package/lib/types/composites/date-chrome.d.ts +8 -0
  199. package/lib/types/composites/date-chrome.d.ts.map +1 -0
  200. package/lib/types/composites/date-picker.d.ts +17 -0
  201. package/lib/types/composites/date-picker.d.ts.map +1 -0
  202. package/lib/types/composites/date-range-picker.d.ts +18 -0
  203. package/lib/types/composites/date-range-picker.d.ts.map +1 -0
  204. package/lib/types/composites/date-time-picker.d.ts +18 -0
  205. package/lib/types/composites/date-time-picker.d.ts.map +1 -0
  206. package/lib/types/composites/date-time-range-picker.d.ts +17 -0
  207. package/lib/types/composites/date-time-range-picker.d.ts.map +1 -0
  208. package/lib/types/composites/duration-input.d.ts +14 -0
  209. package/lib/types/composites/duration-input.d.ts.map +1 -0
  210. package/lib/types/composites/live-refresh.d.ts +46 -0
  211. package/lib/types/composites/live-refresh.d.ts.map +1 -0
  212. package/lib/types/composites/mini-calendar.d.ts +13 -0
  213. package/lib/types/composites/mini-calendar.d.ts.map +1 -0
  214. package/lib/types/composites/number-field.d.ts +15 -0
  215. package/lib/types/composites/number-field.d.ts.map +1 -0
  216. package/lib/types/composites/password-field.d.ts +13 -0
  217. package/lib/types/composites/password-field.d.ts.map +1 -0
  218. package/lib/types/composites/phone-input.d.ts +12 -0
  219. package/lib/types/composites/phone-input.d.ts.map +1 -0
  220. package/lib/types/composites/rating.d.ts +13 -0
  221. package/lib/types/composites/rating.d.ts.map +1 -0
  222. package/lib/types/composites/relative-date-picker.d.ts +16 -0
  223. package/lib/types/composites/relative-date-picker.d.ts.map +1 -0
  224. package/lib/types/composites/search-input.d.ts +16 -0
  225. package/lib/types/composites/search-input.d.ts.map +1 -0
  226. package/lib/types/composites/slider-range.d.ts +14 -0
  227. package/lib/types/composites/slider-range.d.ts.map +1 -0
  228. package/lib/types/composites/tag-input.d.ts +14 -0
  229. package/lib/types/composites/tag-input.d.ts.map +1 -0
  230. package/lib/types/composites/time-picker.d.ts +28 -0
  231. package/lib/types/composites/time-picker.d.ts.map +1 -0
  232. package/lib/types/composites/time-range-picker.d.ts +16 -0
  233. package/lib/types/composites/time-range-picker.d.ts.map +1 -0
  234. package/lib/types/composites/timezone-select.d.ts +22 -0
  235. package/lib/types/composites/timezone-select.d.ts.map +1 -0
  236. package/lib/types/composites/transfer.d.ts +17 -0
  237. package/lib/types/composites/transfer.d.ts.map +1 -0
  238. package/lib/types/composites/user-picker.d.ts +17 -0
  239. package/lib/types/composites/user-picker.d.ts.map +1 -0
  240. package/lib/types/hooks/use-html-dark.d.ts +4 -0
  241. package/lib/types/hooks/use-html-dark.d.ts.map +1 -0
  242. package/lib/types/hooks/use-mobile.d.ts +2 -0
  243. package/lib/types/hooks/use-mobile.d.ts.map +1 -0
  244. package/lib/types/i18n/context.d.ts +310 -0
  245. package/lib/types/i18n/context.d.ts.map +1 -0
  246. package/lib/types/i18n/en.d.ts +290 -0
  247. package/lib/types/i18n/en.d.ts.map +1 -0
  248. package/lib/types/i18n/zh.d.ts +3 -0
  249. package/lib/types/i18n/zh.d.ts.map +1 -0
  250. package/lib/types/index.d.ts +151 -0
  251. package/lib/types/index.d.ts.map +1 -0
  252. package/lib/types/lib/clipboard.d.ts +3 -0
  253. package/lib/types/lib/clipboard.d.ts.map +1 -0
  254. package/lib/types/lib/defined.d.ts +3 -0
  255. package/lib/types/lib/defined.d.ts.map +1 -0
  256. package/lib/types/lib/icons.d.ts +16 -0
  257. package/lib/types/lib/icons.d.ts.map +1 -0
  258. package/lib/types/lib/illustrations.d.ts +18 -0
  259. package/lib/types/lib/illustrations.d.ts.map +1 -0
  260. package/lib/types/lib/utils.d.ts +3 -0
  261. package/lib/types/lib/utils.d.ts.map +1 -0
  262. package/lib/types/products/cells.d.ts +13 -0
  263. package/lib/types/products/cells.d.ts.map +1 -0
  264. package/lib/types/products/code-block.d.ts +14 -0
  265. package/lib/types/products/code-block.d.ts.map +1 -0
  266. package/lib/types/products/code-editor.d.ts +21 -0
  267. package/lib/types/products/code-editor.d.ts.map +1 -0
  268. package/lib/types/products/commit-graph.d.ts +38 -0
  269. package/lib/types/products/commit-graph.d.ts.map +1 -0
  270. package/lib/types/products/data-grid.d.ts +79 -0
  271. package/lib/types/products/data-grid.d.ts.map +1 -0
  272. package/lib/types/products/diff-viewer.d.ts +15 -0
  273. package/lib/types/products/diff-viewer.d.ts.map +1 -0
  274. package/lib/types/products/event-calendar.d.ts +23 -0
  275. package/lib/types/products/event-calendar.d.ts.map +1 -0
  276. package/lib/types/products/export-csv.d.ts +2 -0
  277. package/lib/types/products/export-csv.d.ts.map +1 -0
  278. package/lib/types/products/file-dropzone.d.ts +12 -0
  279. package/lib/types/products/file-dropzone.d.ts.map +1 -0
  280. package/lib/types/products/full-calendar/animations.d.ts +12 -0
  281. package/lib/types/products/full-calendar/animations.d.ts.map +1 -0
  282. package/lib/types/products/full-calendar/calendar-body.d.ts +2 -0
  283. package/lib/types/products/full-calendar/calendar-body.d.ts.map +1 -0
  284. package/lib/types/products/full-calendar/constants.d.ts +3 -0
  285. package/lib/types/products/full-calendar/constants.d.ts.map +1 -0
  286. package/lib/types/products/full-calendar/contexts/calendar-context.d.ts +42 -0
  287. package/lib/types/products/full-calendar/contexts/calendar-context.d.ts.map +1 -0
  288. package/lib/types/products/full-calendar/contexts/dnd-context.d.ts +16 -0
  289. package/lib/types/products/full-calendar/contexts/dnd-context.d.ts.map +1 -0
  290. package/lib/types/products/full-calendar/dialogs/add-edit-event-dialog.d.ts +21 -0
  291. package/lib/types/products/full-calendar/dialogs/add-edit-event-dialog.d.ts.map +1 -0
  292. package/lib/types/products/full-calendar/dialogs/delete-event-dialog.d.ts +4 -0
  293. package/lib/types/products/full-calendar/dialogs/delete-event-dialog.d.ts.map +1 -0
  294. package/lib/types/products/full-calendar/dialogs/event-details-dialog.d.ts +7 -0
  295. package/lib/types/products/full-calendar/dialogs/event-details-dialog.d.ts.map +1 -0
  296. package/lib/types/products/full-calendar/dialogs/events-list-dialog.d.ts +9 -0
  297. package/lib/types/products/full-calendar/dialogs/events-list-dialog.d.ts.map +1 -0
  298. package/lib/types/products/full-calendar/dnd/draggable-event.d.ts +11 -0
  299. package/lib/types/products/full-calendar/dnd/draggable-event.d.ts.map +1 -0
  300. package/lib/types/products/full-calendar/dnd/droppable-area.d.ts +11 -0
  301. package/lib/types/products/full-calendar/dnd/droppable-area.d.ts.map +1 -0
  302. package/lib/types/products/full-calendar/dnd/resizable-event.d.ts +10 -0
  303. package/lib/types/products/full-calendar/dnd/resizable-event.d.ts.map +1 -0
  304. package/lib/types/products/full-calendar/header/calendar-header.d.ts +2 -0
  305. package/lib/types/products/full-calendar/header/calendar-header.d.ts.map +1 -0
  306. package/lib/types/products/full-calendar/header/date-navigator.d.ts +9 -0
  307. package/lib/types/products/full-calendar/header/date-navigator.d.ts.map +1 -0
  308. package/lib/types/products/full-calendar/header/filter.d.ts +2 -0
  309. package/lib/types/products/full-calendar/header/filter.d.ts.map +1 -0
  310. package/lib/types/products/full-calendar/header/today-button.d.ts +2 -0
  311. package/lib/types/products/full-calendar/header/today-button.d.ts.map +1 -0
  312. package/lib/types/products/full-calendar/header/user-select.d.ts +2 -0
  313. package/lib/types/products/full-calendar/header/user-select.d.ts.map +1 -0
  314. package/lib/types/products/full-calendar/header/view-tabs.d.ts +4 -0
  315. package/lib/types/products/full-calendar/header/view-tabs.d.ts.map +1 -0
  316. package/lib/types/products/full-calendar/helpers.d.ts +42 -0
  317. package/lib/types/products/full-calendar/helpers.d.ts.map +1 -0
  318. package/lib/types/products/full-calendar/hooks/use-time-range-create.d.ts +25 -0
  319. package/lib/types/products/full-calendar/hooks/use-time-range-create.d.ts.map +1 -0
  320. package/lib/types/products/full-calendar/hooks.d.ts +11 -0
  321. package/lib/types/products/full-calendar/hooks.d.ts.map +1 -0
  322. package/lib/types/products/full-calendar/interfaces.d.ts +21 -0
  323. package/lib/types/products/full-calendar/interfaces.d.ts.map +1 -0
  324. package/lib/types/products/full-calendar/settings/settings.d.ts +2 -0
  325. package/lib/types/products/full-calendar/settings/settings.d.ts.map +1 -0
  326. package/lib/types/products/full-calendar/shims/avatar-group.d.ts +7 -0
  327. package/lib/types/products/full-calendar/shims/avatar-group.d.ts.map +1 -0
  328. package/lib/types/products/full-calendar/shims/day-picker.d.ts +2 -0
  329. package/lib/types/products/full-calendar/shims/day-picker.d.ts.map +1 -0
  330. package/lib/types/products/full-calendar/shims/motion.d.ts +32 -0
  331. package/lib/types/products/full-calendar/shims/motion.d.ts.map +1 -0
  332. package/lib/types/products/full-calendar/shims/next-themes.d.ts +5 -0
  333. package/lib/types/products/full-calendar/shims/next-themes.d.ts.map +1 -0
  334. package/lib/types/products/full-calendar/shims/re-resizable.d.ts +19 -0
  335. package/lib/types/products/full-calendar/shims/re-resizable.d.ts.map +1 -0
  336. package/lib/types/products/full-calendar/shims/sonner.d.ts +5 -0
  337. package/lib/types/products/full-calendar/shims/sonner.d.ts.map +1 -0
  338. package/lib/types/products/full-calendar/types.d.ts +3 -0
  339. package/lib/types/products/full-calendar/types.d.ts.map +1 -0
  340. package/lib/types/products/full-calendar/views/agenda-view/agenda-events.d.ts +3 -0
  341. package/lib/types/products/full-calendar/views/agenda-view/agenda-events.d.ts.map +1 -0
  342. package/lib/types/products/full-calendar/views/month-view/calendar-month-view.d.ts +8 -0
  343. package/lib/types/products/full-calendar/views/month-view/calendar-month-view.d.ts.map +1 -0
  344. package/lib/types/products/full-calendar/views/month-view/day-cell.d.ts +12 -0
  345. package/lib/types/products/full-calendar/views/month-view/day-cell.d.ts.map +1 -0
  346. package/lib/types/products/full-calendar/views/month-view/event-bullet.d.ts +6 -0
  347. package/lib/types/products/full-calendar/views/month-view/event-bullet.d.ts.map +1 -0
  348. package/lib/types/products/full-calendar/views/month-view/month-event-badge.d.ts +17 -0
  349. package/lib/types/products/full-calendar/views/month-view/month-event-badge.d.ts.map +1 -0
  350. package/lib/types/products/full-calendar/views/week-and-day-view/calendar-day-view.d.ts +8 -0
  351. package/lib/types/products/full-calendar/views/week-and-day-view/calendar-day-view.d.ts.map +1 -0
  352. package/lib/types/products/full-calendar/views/week-and-day-view/calendar-time-line.d.ts +2 -0
  353. package/lib/types/products/full-calendar/views/week-and-day-view/calendar-time-line.d.ts.map +1 -0
  354. package/lib/types/products/full-calendar/views/week-and-day-view/calendar-week-view.d.ts +8 -0
  355. package/lib/types/products/full-calendar/views/week-and-day-view/calendar-week-view.d.ts.map +1 -0
  356. package/lib/types/products/full-calendar/views/week-and-day-view/day-view-multi-day-events-row.d.ts +8 -0
  357. package/lib/types/products/full-calendar/views/week-and-day-view/day-view-multi-day-events-row.d.ts.map +1 -0
  358. package/lib/types/products/full-calendar/views/week-and-day-view/event-block.d.ts +12 -0
  359. package/lib/types/products/full-calendar/views/week-and-day-view/event-block.d.ts.map +1 -0
  360. package/lib/types/products/full-calendar/views/week-and-day-view/render-grouped-events.d.ts +8 -0
  361. package/lib/types/products/full-calendar/views/week-and-day-view/render-grouped-events.d.ts.map +1 -0
  362. package/lib/types/products/full-calendar/views/week-and-day-view/week-view-multi-day-events-row.d.ts +8 -0
  363. package/lib/types/products/full-calendar/views/week-and-day-view/week-view-multi-day-events-row.d.ts.map +1 -0
  364. package/lib/types/products/full-calendar/views/year-view/calendar-year-view.d.ts +8 -0
  365. package/lib/types/products/full-calendar/views/year-view/calendar-year-view.d.ts.map +1 -0
  366. package/lib/types/products/gantt.d.ts +17 -0
  367. package/lib/types/products/gantt.d.ts.map +1 -0
  368. package/lib/types/products/jira-wiki-parse.d.ts +55 -0
  369. package/lib/types/products/jira-wiki-parse.d.ts.map +1 -0
  370. package/lib/types/products/jira-wiki.d.ts +39 -0
  371. package/lib/types/products/jira-wiki.d.ts.map +1 -0
  372. package/lib/types/products/jql-input.d.ts +22 -0
  373. package/lib/types/products/jql-input.d.ts.map +1 -0
  374. package/lib/types/products/json-viewer.d.ts +12 -0
  375. package/lib/types/products/json-viewer.d.ts.map +1 -0
  376. package/lib/types/products/kanban-issue-panel.d.ts +15 -0
  377. package/lib/types/products/kanban-issue-panel.d.ts.map +1 -0
  378. package/lib/types/products/kanban.d.ts +43 -0
  379. package/lib/types/products/kanban.d.ts.map +1 -0
  380. package/lib/types/products/log-viewer.d.ts +25 -0
  381. package/lib/types/products/log-viewer.d.ts.map +1 -0
  382. package/lib/types/products/markdown-editor.d.ts +16 -0
  383. package/lib/types/products/markdown-editor.d.ts.map +1 -0
  384. package/lib/types/products/markdown.d.ts +13 -0
  385. package/lib/types/products/markdown.d.ts.map +1 -0
  386. package/lib/types/products/rich-text-editor.d.ts +13 -0
  387. package/lib/types/products/rich-text-editor.d.ts.map +1 -0
  388. package/lib/types/products/sortable-list.d.ts +16 -0
  389. package/lib/types/products/sortable-list.d.ts.map +1 -0
  390. package/lib/types/products/stepper.d.ts +39 -0
  391. package/lib/types/products/stepper.d.ts.map +1 -0
  392. package/lib/types/products/timeline.d.ts +17 -0
  393. package/lib/types/products/timeline.d.ts.map +1 -0
  394. package/lib/types/products/tree-view.d.ts +17 -0
  395. package/lib/types/products/tree-view.d.ts.map +1 -0
  396. package/lib/types/sdk/app-error-boundary.d.ts +33 -0
  397. package/lib/types/sdk/app-error-boundary.d.ts.map +1 -0
  398. package/lib/types/sdk/app-id.d.ts +6 -0
  399. package/lib/types/sdk/app-id.d.ts.map +1 -0
  400. package/lib/types/sdk/use-app.d.ts +32 -0
  401. package/lib/types/sdk/use-app.d.ts.map +1 -0
  402. package/package.json +67 -0
  403. package/src/blocks/activity-feed.tsx +16 -0
  404. package/src/blocks/app-shell.tsx +38 -0
  405. package/src/blocks/attachment-gallery.tsx +36 -0
  406. package/src/blocks/bar-chart.tsx +46 -0
  407. package/src/blocks/comment-thread.tsx +37 -0
  408. package/src/blocks/dashboard-shell.tsx +108 -0
  409. package/src/blocks/description-list.tsx +23 -0
  410. package/src/blocks/detail-panel.tsx +43 -0
  411. package/src/blocks/donut-chart.tsx +54 -0
  412. package/src/blocks/env-badge.tsx +30 -0
  413. package/src/blocks/env-table.tsx +315 -0
  414. package/src/blocks/file-tree.tsx +12 -0
  415. package/src/blocks/filter-bar.tsx +22 -0
  416. package/src/blocks/form-sheet.tsx +159 -0
  417. package/src/blocks/gauge.tsx +36 -0
  418. package/src/blocks/list-detail.tsx +120 -0
  419. package/src/blocks/notification-center.tsx +29 -0
  420. package/src/blocks/page-header.tsx +31 -0
  421. package/src/blocks/progress-ring.tsx +43 -0
  422. package/src/blocks/radar-chart.tsx +47 -0
  423. package/src/blocks/request-inspector.tsx +41 -0
  424. package/src/blocks/reveal.tsx +56 -0
  425. package/src/blocks/run-timeline.tsx +12 -0
  426. package/src/blocks/scrollspy.tsx +48 -0
  427. package/src/blocks/settings-split.tsx +153 -0
  428. package/src/blocks/severity-chip.tsx +34 -0
  429. package/src/blocks/sparkline.tsx +27 -0
  430. package/src/blocks/stat-card.tsx +50 -0
  431. package/src/blocks/status-badge.tsx +40 -0
  432. package/src/blocks/table-page.tsx +82 -0
  433. package/src/blocks/terminal.tsx +28 -0
  434. package/src/blocks/test-step-list.tsx +26 -0
  435. package/src/blocks/trend-card.tsx +57 -0
  436. package/src/blocks/wizard-shell.tsx +131 -0
  437. package/src/cdn-modules.d.ts +5 -0
  438. package/src/components/accordion.tsx +79 -0
  439. package/src/components/alert-dialog.tsx +192 -0
  440. package/src/components/alert.tsx +83 -0
  441. package/src/components/aspect-ratio.tsx +26 -0
  442. package/src/components/attachment.tsx +211 -0
  443. package/src/components/avatar.tsx +111 -0
  444. package/src/components/badge.tsx +59 -0
  445. package/src/components/breadcrumb.tsx +129 -0
  446. package/src/components/bubble.tsx +132 -0
  447. package/src/components/button-group.tsx +93 -0
  448. package/src/components/button.tsx +65 -0
  449. package/src/components/calendar.tsx +224 -0
  450. package/src/components/card.tsx +110 -0
  451. package/src/components/chart.tsx +378 -0
  452. package/src/components/checkbox.tsx +33 -0
  453. package/src/components/collapsible.tsx +23 -0
  454. package/src/components/combobox.tsx +299 -0
  455. package/src/components/command.tsx +201 -0
  456. package/src/components/context-menu.tsx +274 -0
  457. package/src/components/dialog.tsx +179 -0
  458. package/src/components/drawer.tsx +230 -0
  459. package/src/components/dropdown-menu.tsx +274 -0
  460. package/src/components/empty.tsx +130 -0
  461. package/src/components/field.tsx +242 -0
  462. package/src/components/hover-card.tsx +53 -0
  463. package/src/components/input-group.tsx +161 -0
  464. package/src/components/input.tsx +27 -0
  465. package/src/components/item.tsx +205 -0
  466. package/src/components/kbd.tsx +30 -0
  467. package/src/components/label.tsx +26 -0
  468. package/src/components/marker.tsx +75 -0
  469. package/src/components/menubar.tsx +283 -0
  470. package/src/components/message-scroller.tsx +133 -0
  471. package/src/components/message.tsx +96 -0
  472. package/src/components/native-select.tsx +65 -0
  473. package/src/components/navigation-menu.tsx +172 -0
  474. package/src/components/pagination.tsx +138 -0
  475. package/src/components/popover.tsx +95 -0
  476. package/src/components/progress.tsx +89 -0
  477. package/src/components/questionnaire.tsx +332 -0
  478. package/src/components/radio-group.tsx +40 -0
  479. package/src/components/resizable.tsx +56 -0
  480. package/src/components/scroll-area.tsx +56 -0
  481. package/src/components/select.tsx +207 -0
  482. package/src/components/separator.tsx +28 -0
  483. package/src/components/sheet.tsx +158 -0
  484. package/src/components/sidebar.tsx +725 -0
  485. package/src/components/skeleton.tsx +20 -0
  486. package/src/components/slider.tsx +56 -0
  487. package/src/components/spinner.tsx +16 -0
  488. package/src/components/switch.tsx +38 -0
  489. package/src/components/table.tsx +121 -0
  490. package/src/components/tabs.tsx +88 -0
  491. package/src/components/textarea.tsx +25 -0
  492. package/src/components/toast.tsx +273 -0
  493. package/src/components/toggle-group.tsx +92 -0
  494. package/src/components/toggle.tsx +47 -0
  495. package/src/components/tooltip.tsx +72 -0
  496. package/src/composites/autocomplete.tsx +61 -0
  497. package/src/composites/cascader.tsx +52 -0
  498. package/src/composites/color-picker.tsx +25 -0
  499. package/src/composites/confirm-dialog.tsx +62 -0
  500. package/src/composites/copyable.tsx +44 -0
  501. package/src/composites/currency-input.tsx +37 -0
  502. package/src/composites/date-chrome.tsx +156 -0
  503. package/src/composites/date-picker.tsx +97 -0
  504. package/src/composites/date-range-picker.tsx +99 -0
  505. package/src/composites/date-time-picker.tsx +121 -0
  506. package/src/composites/date-time-range-picker.tsx +57 -0
  507. package/src/composites/duration-input.tsx +128 -0
  508. package/src/composites/live-refresh.tsx +348 -0
  509. package/src/composites/mini-calendar.tsx +30 -0
  510. package/src/composites/number-field.tsx +59 -0
  511. package/src/composites/password-field.tsx +50 -0
  512. package/src/composites/phone-input.tsx +28 -0
  513. package/src/composites/rating.tsx +45 -0
  514. package/src/composites/relative-date-picker.tsx +68 -0
  515. package/src/composites/search-input.tsx +55 -0
  516. package/src/composites/slider-range.tsx +36 -0
  517. package/src/composites/tag-input.tsx +62 -0
  518. package/src/composites/time-picker.tsx +208 -0
  519. package/src/composites/time-range-picker.tsx +31 -0
  520. package/src/composites/timezone-select.tsx +257 -0
  521. package/src/composites/transfer.tsx +58 -0
  522. package/src/composites/user-picker.tsx +46 -0
  523. package/src/hooks/use-html-dark.ts +36 -0
  524. package/src/hooks/use-mobile.ts +22 -0
  525. package/src/i18n/context.tsx +71 -0
  526. package/src/i18n/en.ts +308 -0
  527. package/src/i18n/zh.ts +290 -0
  528. package/src/index.ts +151 -0
  529. package/src/lib/clipboard.ts +10 -0
  530. package/src/lib/defined.ts +8 -0
  531. package/src/lib/icons.tsx +16 -0
  532. package/src/lib/illustrations.tsx +573 -0
  533. package/src/lib/utils.ts +6 -0
  534. package/src/products/cells.tsx +18 -0
  535. package/src/products/code-block.tsx +91 -0
  536. package/src/products/code-editor.tsx +271 -0
  537. package/src/products/column-meta.d.ts +9 -0
  538. package/src/products/commit-graph.tsx +643 -0
  539. package/src/products/data-grid.tsx +692 -0
  540. package/src/products/diff-viewer.tsx +224 -0
  541. package/src/products/event-calendar.tsx +49 -0
  542. package/src/products/export-csv.ts +26 -0
  543. package/src/products/file-dropzone.tsx +47 -0
  544. package/src/products/full-calendar/animations.ts +38 -0
  545. package/src/products/full-calendar/calendar-body.tsx +76 -0
  546. package/src/products/full-calendar/constants.ts +10 -0
  547. package/src/products/full-calendar/contexts/calendar-context.tsx +254 -0
  548. package/src/products/full-calendar/contexts/dnd-context.tsx +156 -0
  549. package/src/products/full-calendar/dialogs/add-edit-event-dialog.tsx +186 -0
  550. package/src/products/full-calendar/dialogs/delete-event-dialog.tsx +39 -0
  551. package/src/products/full-calendar/dialogs/event-details-dialog.tsx +99 -0
  552. package/src/products/full-calendar/dialogs/events-list-dialog.tsx +86 -0
  553. package/src/products/full-calendar/dnd/draggable-event.tsx +45 -0
  554. package/src/products/full-calendar/dnd/droppable-area.tsx +45 -0
  555. package/src/products/full-calendar/dnd/resizable-event.tsx +178 -0
  556. package/src/products/full-calendar/header/calendar-header.tsx +64 -0
  557. package/src/products/full-calendar/header/date-navigator.tsx +110 -0
  558. package/src/products/full-calendar/header/filter.tsx +58 -0
  559. package/src/products/full-calendar/header/today-button.tsx +45 -0
  560. package/src/products/full-calendar/header/user-select.tsx +64 -0
  561. package/src/products/full-calendar/header/view-tabs.tsx +36 -0
  562. package/src/products/full-calendar/helpers.ts +463 -0
  563. package/src/products/full-calendar/hooks/use-time-range-create.ts +152 -0
  564. package/src/products/full-calendar/hooks.ts +70 -0
  565. package/src/products/full-calendar/interfaces.ts +23 -0
  566. package/src/products/full-calendar/settings/settings.tsx +80 -0
  567. package/src/products/full-calendar/shims/avatar-group.tsx +16 -0
  568. package/src/products/full-calendar/shims/day-picker.tsx +1 -0
  569. package/src/products/full-calendar/shims/motion.tsx +97 -0
  570. package/src/products/full-calendar/shims/next-themes.ts +6 -0
  571. package/src/products/full-calendar/shims/re-resizable.tsx +25 -0
  572. package/src/products/full-calendar/shims/sonner.ts +4 -0
  573. package/src/products/full-calendar/types.ts +8 -0
  574. package/src/products/full-calendar/views/agenda-view/agenda-events.tsx +140 -0
  575. package/src/products/full-calendar/views/month-view/calendar-month-view.tsx +69 -0
  576. package/src/products/full-calendar/views/month-view/day-cell.tsx +200 -0
  577. package/src/products/full-calendar/views/month-view/event-bullet.tsx +40 -0
  578. package/src/products/full-calendar/views/month-view/month-event-badge.tsx +143 -0
  579. package/src/products/full-calendar/views/week-and-day-view/calendar-day-view.tsx +295 -0
  580. package/src/products/full-calendar/views/week-and-day-view/calendar-time-line.tsx +35 -0
  581. package/src/products/full-calendar/views/week-and-day-view/calendar-week-view.tsx +251 -0
  582. package/src/products/full-calendar/views/week-and-day-view/day-view-multi-day-events-row.tsx +73 -0
  583. package/src/products/full-calendar/views/week-and-day-view/event-block.tsx +114 -0
  584. package/src/products/full-calendar/views/week-and-day-view/render-grouped-events.tsx +49 -0
  585. package/src/products/full-calendar/views/week-and-day-view/week-view-multi-day-events-row.tsx +145 -0
  586. package/src/products/full-calendar/views/year-view/calendar-year-view.tsx +161 -0
  587. package/src/products/gantt.tsx +47 -0
  588. package/src/products/jira-wiki-parse.ts +197 -0
  589. package/src/products/jira-wiki.tsx +287 -0
  590. package/src/products/jql-input.tsx +391 -0
  591. package/src/products/json-viewer.tsx +43 -0
  592. package/src/products/kanban-issue-panel.tsx +104 -0
  593. package/src/products/kanban.tsx +245 -0
  594. package/src/products/log-viewer.tsx +404 -0
  595. package/src/products/markdown-editor.tsx +77 -0
  596. package/src/products/markdown.tsx +50 -0
  597. package/src/products/rich-text-editor.tsx +89 -0
  598. package/src/products/sortable-list.tsx +67 -0
  599. package/src/products/stepper.tsx +237 -0
  600. package/src/products/timeline.tsx +39 -0
  601. package/src/products/tree-view.tsx +62 -0
  602. package/src/sdk/app-error-boundary.tsx +240 -0
  603. package/src/sdk/app-id.ts +7 -0
  604. package/src/sdk/use-app.ts +43 -0
@@ -0,0 +1,295 @@
1
+ import { format, isWithinInterval, parseISO } from 'date-fns';
2
+ import { Calendar, Clock, User } from 'lucide-react';
3
+ import { useEffect, useRef } from 'react';
4
+ import { DayPicker } from '../../shims/day-picker';
5
+ import { ScrollArea } from '@mohou/ui/components/scroll-area';
6
+ import { useDateLocale, useLabels } from '@mohou/ui/i18n/context';
7
+ import { useCalendar } from '../../contexts/calendar-context';
8
+
9
+ import { AddEditEventDialog } from '../../dialogs/add-edit-event-dialog';
10
+ import { DroppableArea } from '../../dnd/droppable-area';
11
+ import { groupEvents, HOUR_HEIGHT_PX } from '../../helpers';
12
+ import { useTimeRangeCreate } from '../../hooks/use-time-range-create';
13
+ import type { IEvent } from '../../interfaces';
14
+ import { CalendarTimeline } from './calendar-time-line';
15
+ import { DayViewMultiDayEventsRow } from './day-view-multi-day-events-row';
16
+ import { RenderGroupedEvents } from './render-grouped-events';
17
+
18
+ interface IProps {
19
+ singleDayEvents: IEvent[]
20
+ multiDayEvents: IEvent[]
21
+ }
22
+
23
+ export function CalendarDayView({ singleDayEvents, multiDayEvents }: IProps) {
24
+ const { selectedDate, setSelectedDate, users, use24HourFormat } =
25
+ useCalendar()
26
+ const t = useLabels('eventCalendar');
27
+ const dateLocale = useDateLocale()
28
+ const scrollAreaRef = useRef<HTMLDivElement>(null)
29
+ const {
30
+ draft,
31
+ clearDraft,
32
+ overlayStyle,
33
+ onPointerDown,
34
+ onPointerMove,
35
+ onPointerUp,
36
+ } = useTimeRangeCreate()
37
+
38
+ const hours = Array.from({ length: 24 }, (_, i) => i)
39
+
40
+ useEffect(() => {
41
+ const handleDragOver = (e: DragEvent) => {
42
+ if (!scrollAreaRef.current) return
43
+
44
+ const scrollArea = scrollAreaRef.current
45
+ const rect = scrollArea.getBoundingClientRect()
46
+ const scrollSpeed = 15
47
+
48
+ const scrollContainer =
49
+ scrollArea.querySelector('[data-radix-scroll-area-viewport]') ||
50
+ scrollArea
51
+
52
+ if (e.clientY < rect.top + 60) {
53
+ scrollContainer.scrollTop -= scrollSpeed
54
+ }
55
+
56
+ if (e.clientY > rect.bottom - 60) {
57
+ scrollContainer.scrollTop += scrollSpeed
58
+ }
59
+ }
60
+
61
+ document.addEventListener('dragover', handleDragOver)
62
+ return () => {
63
+ document.removeEventListener('dragover', handleDragOver)
64
+ };
65
+ }, [])
66
+
67
+ const getCurrentEvents = (events: IEvent[]) => {
68
+ const now = new Date()
69
+
70
+ return (
71
+ events.filter(event =>
72
+ isWithinInterval(now, {
73
+ start: parseISO(event.startDate),
74
+ end: parseISO(event.endDate),
75
+ }),
76
+ ) || []
77
+ )
78
+ };
79
+
80
+ const currentEvents = getCurrentEvents(singleDayEvents)
81
+
82
+ const dayEvents = singleDayEvents.filter((event) => {
83
+ const eventDate = parseISO(event.startDate)
84
+ return (
85
+ eventDate.getDate() === selectedDate.getDate() &&
86
+ eventDate.getMonth() === selectedDate.getMonth() &&
87
+ eventDate.getFullYear() === selectedDate.getFullYear()
88
+ )
89
+ });
90
+
91
+ const groupedEvents = groupEvents(dayEvents)
92
+
93
+ return (
94
+ <div className="flex">
95
+ <div className="flex flex-1 flex-col">
96
+ <div>
97
+ <DayViewMultiDayEventsRow
98
+ selectedDate={selectedDate}
99
+ multiDayEvents={multiDayEvents}
100
+ />
101
+
102
+ {/* Day header */}
103
+ <div className="relative z-20 flex border-b">
104
+ <div className="w-18"></div>
105
+ <span className="flex-1 border-l py-2 text-center text-xs font-medium text-t-quaternary">
106
+ {format(selectedDate, 'EE')}{' '}
107
+ <span className="font-semibold text-t-secondary">
108
+ {format(selectedDate, 'd')}
109
+ </span>
110
+ </span>
111
+ </div>
112
+ </div>
113
+ <ScrollArea className="h-[800px]" ref={scrollAreaRef}>
114
+ <div className="flex">
115
+ {/* Hours column */}
116
+ <div className="relative w-18">
117
+ {hours.map((hour, index) => (
118
+ <div key={hour} className="relative" style={{ height: `${HOUR_HEIGHT_PX}px` }}>
119
+ <div className="absolute -top-3 right-2 flex h-6 items-center">
120
+ {index !== 0 && (
121
+ <span className="text-xs text-t-quaternary">
122
+ {format(
123
+ new Date().setHours(hour, 0, 0, 0),
124
+ use24HourFormat ? 'HH:00' : 'h a',
125
+ )}
126
+ </span>
127
+ )}
128
+ </div>
129
+ </div>
130
+ ))}
131
+ </div>
132
+
133
+ {/* Day grid — drag vertically to select a create range */}
134
+ <div className="relative flex-1 border-l">
135
+ <div
136
+ className="relative touch-none select-none"
137
+ data-testid="calendar-day-column"
138
+ onPointerDown={e => onPointerDown(e, selectedDate, e.currentTarget)}
139
+ onPointerMove={onPointerMove}
140
+ onPointerUp={onPointerUp}
141
+ onPointerCancel={onPointerUp}
142
+ >
143
+ {hours.map((hour, index) => (
144
+ <div
145
+ key={hour}
146
+ className="relative"
147
+ style={{ height: `${HOUR_HEIGHT_PX}px` }}
148
+ >
149
+ {index !== 0 && (
150
+ <div className="pointer-events-none absolute inset-x-0 top-0 border-b"></div>
151
+ )}
152
+
153
+ <DroppableArea
154
+ date={selectedDate}
155
+ hour={hour}
156
+ minute={0}
157
+ className="absolute inset-x-0 top-0 h-[48px]"
158
+ >
159
+ <div className="absolute inset-0" />
160
+ </DroppableArea>
161
+
162
+ <div className="pointer-events-none absolute inset-x-0 top-1/2 border-b border-dashed border-b-tertiary"></div>
163
+
164
+ <DroppableArea
165
+ date={selectedDate}
166
+ hour={hour}
167
+ minute={30}
168
+ className="absolute inset-x-0 bottom-0 h-[48px]"
169
+ >
170
+ <div className="absolute inset-0" />
171
+ </DroppableArea>
172
+ </div>
173
+ ))}
174
+
175
+ {overlayStyle ? (
176
+ <div
177
+ className="pointer-events-none absolute inset-x-1 z-10 rounded-md border border-primary/40 bg-primary/15"
178
+ data-testid="calendar-selection-overlay"
179
+ style={overlayStyle}
180
+ />
181
+ ) : null}
182
+
183
+ <div className="pointer-events-auto relative z-20">
184
+ <RenderGroupedEvents
185
+ groupedEvents={groupedEvents}
186
+ day={selectedDate}
187
+ />
188
+ </div>
189
+ </div>
190
+
191
+ <CalendarTimeline />
192
+ </div>
193
+
194
+ {draft ? (
195
+ <AddEditEventDialog
196
+ open
197
+ onOpenChange={(open) => {
198
+ if (!open) clearDraft()
199
+ }}
200
+ startDate={draft.start}
201
+ startTime={{
202
+ hour: draft.start.getHours(),
203
+ minute: draft.start.getMinutes(),
204
+ }}
205
+ endTime={{
206
+ hour: draft.end.getHours(),
207
+ minute: draft.end.getMinutes(),
208
+ }}
209
+ />
210
+ ) : null}
211
+ </div>
212
+ </ScrollArea>
213
+ </div>
214
+
215
+ <div className="hidden w-72 divide-y border-l md:block">
216
+ <DayPicker
217
+ className="mx-auto w-fit"
218
+ mode="single"
219
+ selected={selectedDate}
220
+ onSelect={date => date && setSelectedDate(date)}
221
+ />
222
+
223
+ <div className="flex-1 space-y-3">
224
+ {currentEvents.length > 0 ? (
225
+ <div className="flex items-start gap-2 px-4 pt-4">
226
+ <span className="relative mt-[5px] flex size-2.5">
227
+ <span className="absolute inline-flex size-full animate-ping rounded-full bg-green-400 opacity-75"></span>
228
+ <span className="relative inline-flex size-2.5 rounded-full bg-green-600"></span>
229
+ </span>
230
+
231
+ <p className="text-sm font-semibold text-t-secondary">
232
+ {t.happeningNow}
233
+ </p>
234
+ </div>
235
+ ) : (
236
+ <p className="p-4 text-center text-sm italic text-t-tertiary">
237
+ {t.noAppointments}
238
+ </p>
239
+ )}
240
+
241
+ {currentEvents.length > 0 && (
242
+ <ScrollArea className="h-[422px] px-4">
243
+ <div className="space-y-6 pb-4">
244
+ {currentEvents.map((event) => {
245
+ const user = users.find(user => user.id === event.user.id)
246
+
247
+ return (
248
+ <div key={event.id} className="space-y-1.5">
249
+ <p className="line-clamp-2 text-sm font-semibold">
250
+ {event.title}
251
+ </p>
252
+
253
+ {user && (
254
+ <div className="flex items-center gap-1.5">
255
+ <User className="size-4 text-t-quinary" />
256
+ <span className="text-sm text-t-tertiary">
257
+ {user.name}
258
+ </span>
259
+ </div>
260
+ )}
261
+
262
+ <div className="flex items-center gap-1.5">
263
+ <Calendar className="size-4 text-t-quinary" />
264
+ <span className="text-sm text-t-tertiary">
265
+ {format(new Date(event.startDate), 'MMM d, yyyy', {
266
+ locale: dateLocale,
267
+ })}
268
+ </span>
269
+ </div>
270
+
271
+ <div className="flex items-center gap-1.5">
272
+ <Clock className="size-4 text-t-quinary" />
273
+ <span className="text-sm text-t-tertiary">
274
+ {format(
275
+ parseISO(event.startDate),
276
+ use24HourFormat ? 'HH:mm' : 'hh:mm a',
277
+ )}{' '}
278
+ -
279
+ {format(
280
+ parseISO(event.endDate),
281
+ use24HourFormat ? 'HH:mm' : 'hh:mm a',
282
+ )}
283
+ </span>
284
+ </div>
285
+ </div>
286
+ )
287
+ })}
288
+ </div>
289
+ </ScrollArea>
290
+ )}
291
+ </div>
292
+ </div>
293
+ </div>
294
+ )
295
+ }
@@ -0,0 +1,35 @@
1
+ import { useEffect, useState } from 'react';
2
+ import { useCalendar } from '../../contexts/calendar-context';
3
+ import { formatTime } from '../../helpers';
4
+
5
+ export function CalendarTimeline() {
6
+ const { use24HourFormat } = useCalendar()
7
+ const [currentTime, setCurrentTime] = useState(new Date())
8
+
9
+ useEffect(() => {
10
+ const timer = setInterval(() => setCurrentTime(new Date()), 60 * 1000)
11
+ return () => clearInterval(timer)
12
+ }, [])
13
+
14
+ const getCurrentTimePosition = () => {
15
+ const minutes = currentTime.getHours() * 60 + currentTime.getMinutes()
16
+ return (minutes / 1440) * 100
17
+ };
18
+
19
+ const formatCurrentTime = () => {
20
+ return formatTime(currentTime, use24HourFormat)
21
+ };
22
+
23
+ return (
24
+ <div
25
+ className="pointer-events-none absolute inset-x-0 z-50 border-t border-primary"
26
+ style={{ top: `${getCurrentTimePosition()}%` }}
27
+ >
28
+ <div className="absolute -left-1.5 -top-1.5 size-3 rounded-full bg-primary"></div>
29
+
30
+ <div className="absolute -left-18 flex w-16 -translate-y-1/2 justify-end bg-background pr-1 text-xs font-medium text-primary">
31
+ {formatCurrentTime()}
32
+ </div>
33
+ </div>
34
+ )
35
+ }
@@ -0,0 +1,251 @@
1
+ import { addDays, format, isSameDay, parseISO, startOfWeek } from 'date-fns';
2
+ import { motion } from '../../shims/motion';
3
+ import { ScrollArea } from '@mohou/ui/components/scroll-area';
4
+ import {
5
+ fadeIn,
6
+ staggerContainer,
7
+ transition,
8
+ } from '../../animations';
9
+ import { useCalendar } from '../../contexts/calendar-context';
10
+ import { AddEditEventDialog } from '../../dialogs/add-edit-event-dialog';
11
+ import { DroppableArea } from '../../dnd/droppable-area';
12
+ import { groupEvents, HOUR_HEIGHT_PX } from '../../helpers';
13
+ import { useTimeRangeCreate } from '../../hooks/use-time-range-create';
14
+ import type { IEvent } from '../../interfaces';
15
+ import { CalendarTimeline } from './calendar-time-line';
16
+ import { RenderGroupedEvents } from './render-grouped-events';
17
+ import {
18
+ WeekViewMultiDayEventsRow
19
+ } from './week-view-multi-day-events-row';
20
+
21
+ interface IProps {
22
+ singleDayEvents: IEvent[]
23
+ multiDayEvents: IEvent[]
24
+ }
25
+
26
+ export function CalendarWeekView({ singleDayEvents, multiDayEvents }: IProps) {
27
+ const { selectedDate, use24HourFormat } = useCalendar()
28
+ const {
29
+ selection,
30
+ draft,
31
+ clearDraft,
32
+ overlayStyle,
33
+ onPointerDown,
34
+ onPointerMove,
35
+ onPointerUp,
36
+ } = useTimeRangeCreate()
37
+
38
+ const weekStart = startOfWeek(selectedDate)
39
+ const weekDays = Array.from({ length: 7 }, (_, i) => addDays(weekStart, i))
40
+ const hours = Array.from({ length: 24 }, (_, i) => i)
41
+
42
+ return (
43
+ <motion.div
44
+ data-testid="calendar-week-grid"
45
+ initial="initial"
46
+ animate="animate"
47
+ exit="exit"
48
+ variants={fadeIn}
49
+ transition={transition}
50
+ >
51
+ <motion.div
52
+ className="flex flex-col items-center justify-center border-b p-4 text-sm sm:hidden"
53
+ initial={{ opacity: 0, y: -20 }}
54
+ animate={{ opacity: 1, y: 0 }}
55
+ transition={transition}
56
+ >
57
+ <p>Weekly view is not recommended on smaller devices.</p>
58
+ <p>Please switch to a desktop device or use the daily view instead.</p>
59
+ </motion.div>
60
+
61
+ <motion.div
62
+ className="flex-col sm:flex"
63
+ variants={staggerContainer}
64
+ >
65
+ <div>
66
+ <WeekViewMultiDayEventsRow
67
+ selectedDate={selectedDate}
68
+ multiDayEvents={multiDayEvents}
69
+ />
70
+
71
+ {/* Week header */}
72
+ <motion.div
73
+ className="relative z-20 flex border-b"
74
+ initial={{ opacity: 0, y: -20 }}
75
+ animate={{ opacity: 1, y: 0 }}
76
+ transition={transition}
77
+ >
78
+ {/* Time column header - responsive width */}
79
+ <div className="w-18"></div>
80
+ <div className="grid flex-1 grid-cols-7 border-l">
81
+ {weekDays.map((day, index) => (
82
+ <motion.span
83
+ key={day.toISOString()}
84
+ className="py-1 sm:py-2 text-center text-xs font-medium text-t-quaternary"
85
+ initial={{ opacity: 0, y: -10 }}
86
+ animate={{ opacity: 1, y: 0 }}
87
+ transition={{ delay: index * 0.05, ...transition }}
88
+ >
89
+ {/* Mobile: Show only day abbreviation and number */}
90
+ <span className="block sm:hidden">
91
+ {format(day, 'EEE').charAt(0)}
92
+ <span className="block font-semibold text-t-secondary text-xs">
93
+ {format(day, 'd')}
94
+ </span>
95
+ </span>
96
+ {/* Desktop: Show full format */}
97
+ <span className="hidden sm:inline">
98
+ {format(day, 'EE')}{' '}
99
+ <span className="ml-1 font-semibold text-t-secondary">
100
+ {format(day, 'd')}
101
+ </span>
102
+ </span>
103
+ </motion.span>
104
+ ))}
105
+ </div>
106
+ </motion.div>
107
+
108
+ </div>
109
+
110
+ <ScrollArea className="h-[736px]">
111
+ <div className="flex">
112
+ {/* Hours column */}
113
+ <motion.div className="relative w-18" variants={staggerContainer}>
114
+ {hours.map((hour, index) => (
115
+ <motion.div
116
+ key={hour}
117
+ className="relative"
118
+ style={{ height: `${HOUR_HEIGHT_PX}px` }}
119
+ initial={{ opacity: 0, x: -20 }}
120
+ animate={{ opacity: 1, x: 0 }}
121
+ transition={{ delay: index * 0.02, ...transition }}
122
+ >
123
+ <div className="absolute -top-3 right-2 flex h-6 items-center">
124
+ {index !== 0 && (
125
+ <span className="text-xs text-t-quaternary">
126
+ {format(
127
+ new Date().setHours(hour, 0, 0, 0),
128
+ use24HourFormat ? 'HH:00' : 'h a',
129
+ )}
130
+ </span>
131
+ )}
132
+ </div>
133
+ </motion.div>
134
+ ))}
135
+ </motion.div>
136
+
137
+ {/* Week grid */}
138
+ <motion.div
139
+ className="relative flex-1 border-l"
140
+ variants={staggerContainer}
141
+ >
142
+ <div className="grid grid-cols-7 divide-x">
143
+ {weekDays.map((day, dayIndex) => {
144
+ const dayEvents = singleDayEvents.filter(
145
+ (event) =>
146
+ isSameDay(parseISO(event.startDate), day) ||
147
+ isSameDay(parseISO(event.endDate), day),
148
+ );
149
+ const groupedEvents = groupEvents(dayEvents)
150
+
151
+ const showOverlay =
152
+ selection != null &&
153
+ isSameDay(selection.day, day) &&
154
+ overlayStyle != null
155
+
156
+ return (
157
+ <motion.div
158
+ key={day.toISOString()}
159
+ className="relative touch-none select-none"
160
+ data-testid="calendar-day-column"
161
+ data-day={day.toISOString()}
162
+ initial={{ opacity: 0 }}
163
+ animate={{ opacity: 1 }}
164
+ transition={{ delay: dayIndex * 0.1, ...transition }}
165
+ onPointerDown={e => onPointerDown(e, day, e.currentTarget)}
166
+ onPointerMove={onPointerMove}
167
+ onPointerUp={onPointerUp}
168
+ onPointerCancel={onPointerUp}
169
+ >
170
+ {hours.map((hour, index) => (
171
+ <motion.div
172
+ key={hour}
173
+ className="relative"
174
+ style={{ height: `${HOUR_HEIGHT_PX}px` }}
175
+ initial={{ opacity: 0 }}
176
+ animate={{ opacity: 1 }}
177
+ transition={{ delay: index * 0.01, ...transition }}
178
+ >
179
+ {index !== 0 && (
180
+ <div
181
+ className="pointer-events-none absolute inset-x-0 top-0 border-b"></div>
182
+ )}
183
+
184
+ <DroppableArea
185
+ date={day}
186
+ hour={hour}
187
+ minute={0}
188
+ className="absolute inset-x-0 top-0 h-[48px]"
189
+ >
190
+ <div className="absolute inset-0" />
191
+ </DroppableArea>
192
+
193
+ <div
194
+ className="pointer-events-none absolute inset-x-0 top-1/2 border-b border-dashed border-b-tertiary"></div>
195
+
196
+ <DroppableArea
197
+ date={day}
198
+ hour={hour}
199
+ minute={30}
200
+ className="absolute inset-x-0 bottom-0 h-[48px]"
201
+ >
202
+ <div className="absolute inset-0" />
203
+ </DroppableArea>
204
+ </motion.div>
205
+ ))}
206
+
207
+ {showOverlay ? (
208
+ <div
209
+ className="pointer-events-none absolute inset-x-0.5 z-10 rounded-md border border-primary/40 bg-primary/15"
210
+ data-testid="calendar-selection-overlay"
211
+ style={overlayStyle}
212
+ />
213
+ ) : null}
214
+
215
+ <div className="pointer-events-auto relative z-20">
216
+ <RenderGroupedEvents
217
+ groupedEvents={groupedEvents}
218
+ day={day}
219
+ />
220
+ </div>
221
+ </motion.div>
222
+ );
223
+ })}
224
+ </div>
225
+
226
+ <CalendarTimeline/>
227
+ </motion.div>
228
+
229
+ {draft ? (
230
+ <AddEditEventDialog
231
+ open
232
+ onOpenChange={(open) => {
233
+ if (!open) clearDraft()
234
+ }}
235
+ startDate={draft.start}
236
+ startTime={{
237
+ hour: draft.start.getHours(),
238
+ minute: draft.start.getMinutes(),
239
+ }}
240
+ endTime={{
241
+ hour: draft.end.getHours(),
242
+ minute: draft.end.getMinutes(),
243
+ }}
244
+ />
245
+ ) : null}
246
+ </div>
247
+ </ScrollArea>
248
+ </motion.div>
249
+ </motion.div>
250
+ );
251
+ }
@@ -0,0 +1,73 @@
1
+ import {
2
+ differenceInDays,
3
+ endOfDay,
4
+ isWithinInterval,
5
+ parseISO,
6
+ startOfDay,
7
+ } from 'date-fns';
8
+ import type { IEvent } from '../../interfaces';
9
+ import { MonthEventBadge } from '../month-view/month-event-badge';
10
+
11
+ interface IProps {
12
+ selectedDate: Date
13
+ multiDayEvents: IEvent[]
14
+ }
15
+
16
+ export function DayViewMultiDayEventsRow({
17
+ selectedDate,
18
+ multiDayEvents,
19
+ }: IProps) {
20
+ const dayStart = startOfDay(selectedDate)
21
+ const dayEnd = endOfDay(selectedDate)
22
+
23
+ const multiDayEventsInDay = multiDayEvents
24
+ .filter((event) => {
25
+ const eventStart = parseISO(event.startDate)
26
+ const eventEnd = parseISO(event.endDate)
27
+
28
+ return (
29
+ isWithinInterval(dayStart, { start: eventStart, end: eventEnd }) ||
30
+ isWithinInterval(dayEnd, { start: eventStart, end: eventEnd }) ||
31
+ (eventStart <= dayStart && eventEnd >= dayEnd)
32
+ )
33
+ })
34
+ .sort((a, b) => {
35
+ const durationA = differenceInDays(
36
+ parseISO(a.endDate),
37
+ parseISO(a.startDate),
38
+ )
39
+ const durationB = differenceInDays(
40
+ parseISO(b.endDate),
41
+ parseISO(b.startDate),
42
+ )
43
+ return durationB - durationA
44
+ });
45
+
46
+ if (multiDayEventsInDay.length === 0) return null
47
+
48
+ return (
49
+ <div className="flex border-b">
50
+ <div className="w-18"></div>
51
+ <div className="flex flex-1 flex-col gap-1 border-l py-1">
52
+ {multiDayEventsInDay.map((event) => {
53
+ const eventStart = startOfDay(parseISO(event.startDate))
54
+ const eventEnd = startOfDay(parseISO(event.endDate))
55
+ const currentDate = startOfDay(selectedDate)
56
+
57
+ const eventTotalDays = differenceInDays(eventEnd, eventStart) + 1
58
+ const eventCurrentDay = differenceInDays(currentDate, eventStart) + 1
59
+
60
+ return (
61
+ <MonthEventBadge
62
+ key={event.id}
63
+ event={event}
64
+ cellDate={selectedDate}
65
+ eventCurrentDay={eventCurrentDay}
66
+ eventTotalDays={eventTotalDays}
67
+ />
68
+ )
69
+ })}
70
+ </div>
71
+ </div>
72
+ )
73
+ }