@xjur-ui/react 1.0.6 → 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 (336) hide show
  1. package/.turbo/turbo-build.log +279 -68
  2. package/CHANGELOG.md +114 -0
  3. package/README.md +146 -0
  4. package/dist/chunk-2CM3SFOY.js +2 -0
  5. package/dist/chunk-2CM3SFOY.js.map +1 -0
  6. package/dist/chunk-2CTBH6VI.js +2 -0
  7. package/dist/chunk-2CTBH6VI.js.map +1 -0
  8. package/dist/chunk-4BGTC333.js +2 -0
  9. package/dist/chunk-4BGTC333.js.map +1 -0
  10. package/dist/chunk-5WLIDYZH.js +2 -0
  11. package/dist/chunk-5WLIDYZH.js.map +1 -0
  12. package/dist/chunk-6AD6O6II.js +2 -0
  13. package/dist/chunk-6AD6O6II.js.map +1 -0
  14. package/dist/chunk-AA6V5YEC.js +2 -0
  15. package/dist/chunk-AA6V5YEC.js.map +1 -0
  16. package/dist/chunk-BK6FP63A.js +2 -0
  17. package/dist/chunk-BK6FP63A.js.map +1 -0
  18. package/dist/chunk-BZDGWC5O.js +2 -0
  19. package/dist/chunk-BZDGWC5O.js.map +1 -0
  20. package/dist/chunk-CBFC4QME.js +2 -0
  21. package/dist/chunk-CBFC4QME.js.map +1 -0
  22. package/dist/chunk-CI3ZXWEX.js +2 -0
  23. package/dist/chunk-CI3ZXWEX.js.map +1 -0
  24. package/dist/chunk-DFXHNK5D.js +2 -0
  25. package/dist/chunk-DFXHNK5D.js.map +1 -0
  26. package/dist/chunk-EIG6CBTQ.js +2 -0
  27. package/dist/chunk-EIG6CBTQ.js.map +1 -0
  28. package/dist/chunk-EXC2XOL6.js +2 -0
  29. package/dist/chunk-EXC2XOL6.js.map +1 -0
  30. package/dist/chunk-F4DYKYWJ.js +2 -0
  31. package/dist/chunk-F4DYKYWJ.js.map +1 -0
  32. package/dist/chunk-F5ZLEQGN.js +2 -0
  33. package/dist/chunk-F5ZLEQGN.js.map +1 -0
  34. package/dist/chunk-IKL6PSXU.js +2 -0
  35. package/dist/chunk-IKL6PSXU.js.map +1 -0
  36. package/dist/chunk-IRHU7PDO.js +2 -0
  37. package/dist/chunk-IRHU7PDO.js.map +1 -0
  38. package/dist/chunk-J4X5RQTR.js +2 -0
  39. package/dist/chunk-J4X5RQTR.js.map +1 -0
  40. package/dist/chunk-KIFR5VIE.js +2 -0
  41. package/dist/chunk-KIFR5VIE.js.map +1 -0
  42. package/dist/chunk-KS6WGBHQ.js +2 -0
  43. package/dist/chunk-KS6WGBHQ.js.map +1 -0
  44. package/dist/chunk-L4ET6GIZ.js +2 -0
  45. package/dist/chunk-L4ET6GIZ.js.map +1 -0
  46. package/dist/chunk-MZSV4LNY.js +2 -0
  47. package/dist/chunk-MZSV4LNY.js.map +1 -0
  48. package/dist/chunk-NELCN6E2.js +2 -0
  49. package/dist/chunk-NELCN6E2.js.map +1 -0
  50. package/dist/chunk-OS53BV63.js +3 -0
  51. package/dist/chunk-OS53BV63.js.map +1 -0
  52. package/dist/chunk-PKCW37CJ.js +2 -0
  53. package/dist/chunk-PKCW37CJ.js.map +1 -0
  54. package/dist/chunk-RWMV7APX.js +2 -0
  55. package/dist/chunk-RWMV7APX.js.map +1 -0
  56. package/dist/chunk-SLAAEXWI.js +2 -0
  57. package/dist/chunk-SLAAEXWI.js.map +1 -0
  58. package/dist/chunk-SXGSWVMZ.js +2 -0
  59. package/dist/chunk-SXGSWVMZ.js.map +1 -0
  60. package/dist/chunk-TB6KI6CL.js +2 -0
  61. package/dist/chunk-TB6KI6CL.js.map +1 -0
  62. package/dist/chunk-TSVURBUY.js +2 -0
  63. package/dist/chunk-TSVURBUY.js.map +1 -0
  64. package/dist/chunk-UXIVZWLB.js +2 -0
  65. package/dist/chunk-UXIVZWLB.js.map +1 -0
  66. package/dist/chunk-WEBAXQID.js +2 -0
  67. package/dist/chunk-WEBAXQID.js.map +1 -0
  68. package/dist/chunk-WV7QV2PU.js +2 -0
  69. package/dist/chunk-WV7QV2PU.js.map +1 -0
  70. package/dist/chunk-Z47R2CIM.js +2 -0
  71. package/dist/chunk-Z47R2CIM.js.map +1 -0
  72. package/dist/chunk-ZVVPUP7V.js +2 -0
  73. package/dist/chunk-ZVVPUP7V.js.map +1 -0
  74. package/dist/components/avatar-group.js +2 -179
  75. package/dist/components/avatar-group.js.map +1 -0
  76. package/dist/components/avatar.js +2 -59
  77. package/dist/components/avatar.js.map +1 -0
  78. package/dist/components/badge.js +2 -111
  79. package/dist/components/badge.js.map +1 -0
  80. package/dist/components/breadcrumb.d.ts +20 -0
  81. package/dist/components/breadcrumb.js +2 -0
  82. package/dist/components/breadcrumb.js.map +1 -0
  83. package/dist/components/chip.d.ts +5 -2
  84. package/dist/components/chip.js +2 -256
  85. package/dist/components/chip.js.map +1 -0
  86. package/dist/components/collapsible.js +2 -41
  87. package/dist/components/collapsible.js.map +1 -0
  88. package/dist/components/dialog.d.ts +51 -0
  89. package/dist/components/dialog.js +2 -0
  90. package/dist/components/dialog.js.map +1 -0
  91. package/dist/components/divider.js +2 -29
  92. package/dist/components/divider.js.map +1 -0
  93. package/dist/components/drag-and-drop/drag-handle.d.ts +15 -0
  94. package/dist/components/drag-and-drop/drag-handle.js +2 -0
  95. package/dist/components/drag-and-drop/drag-handle.js.map +1 -0
  96. package/dist/components/drag-and-drop/drag-list-item.d.ts +14 -0
  97. package/dist/components/drag-and-drop/drag-list-item.js +2 -0
  98. package/dist/components/drag-and-drop/drag-list-item.js.map +1 -0
  99. package/dist/components/drag-and-drop/drag-list.d.ts +14 -0
  100. package/dist/components/drag-and-drop/drag-list.js +2 -0
  101. package/dist/components/drag-and-drop/drag-list.js.map +1 -0
  102. package/dist/components/drag-and-drop/drag-root.d.ts +6 -0
  103. package/dist/components/drag-and-drop/drag-root.js +2 -0
  104. package/dist/components/drag-and-drop/drag-root.js.map +1 -0
  105. package/dist/components/drag-and-drop/index.d.ts +10 -0
  106. package/dist/components/drag-and-drop/index.js +2 -0
  107. package/dist/components/drag-and-drop/index.js.map +1 -0
  108. package/dist/components/drag-and-drop/types/drag-item.d.ts +9 -0
  109. package/dist/components/drag-and-drop/types/drag-item.js +2 -0
  110. package/dist/components/drag-and-drop/types/drag-item.js.map +1 -0
  111. package/dist/components/dropdown-menu.js +2 -295
  112. package/dist/components/dropdown-menu.js.map +1 -0
  113. package/dist/components/form/button.js +2 -0
  114. package/dist/components/form/button.js.map +1 -0
  115. package/dist/components/form/calendar.js +2 -0
  116. package/dist/components/form/calendar.js.map +1 -0
  117. package/dist/components/form/checkbox.js +2 -0
  118. package/dist/components/form/checkbox.js.map +1 -0
  119. package/dist/components/form/context/field.context.d.ts +15 -0
  120. package/dist/components/form/context/field.context.js +2 -0
  121. package/dist/components/form/context/field.context.js.map +1 -0
  122. package/dist/components/form/date-picker.d.ts +84 -0
  123. package/dist/components/form/date-picker.js +2 -0
  124. package/dist/components/form/date-picker.js.map +1 -0
  125. package/dist/components/form/floating-label.d.ts +6 -0
  126. package/dist/components/form/floating-label.js +2 -0
  127. package/dist/components/form/floating-label.js.map +1 -0
  128. package/dist/components/form/input.d.ts +95 -0
  129. package/dist/components/form/input.js +2 -0
  130. package/dist/components/form/input.js.map +1 -0
  131. package/dist/components/form/otp-input.js +2 -0
  132. package/dist/components/form/otp-input.js.map +1 -0
  133. package/dist/components/form/radio.js +2 -0
  134. package/dist/components/form/radio.js.map +1 -0
  135. package/dist/components/{rich-editor.d.ts → form/rich-editor.d.ts} +2 -1
  136. package/dist/components/form/rich-editor.js +2 -0
  137. package/dist/components/form/rich-editor.js.map +1 -0
  138. package/dist/components/form/search-input.js +2 -0
  139. package/dist/components/form/search-input.js.map +1 -0
  140. package/dist/components/form/select.d.ts +94 -0
  141. package/dist/components/form/select.js +2 -0
  142. package/dist/components/form/select.js.map +1 -0
  143. package/dist/components/form/switch.js +2 -0
  144. package/dist/components/form/switch.js.map +1 -0
  145. package/dist/components/full-calendar/calendar-add-event.d.ts +9 -0
  146. package/dist/components/full-calendar/calendar-add-event.js +2 -0
  147. package/dist/components/full-calendar/calendar-add-event.js.map +1 -0
  148. package/dist/components/full-calendar/calendar-body.d.ts +6 -0
  149. package/dist/components/full-calendar/calendar-body.js +2 -0
  150. package/dist/components/full-calendar/calendar-body.js.map +1 -0
  151. package/dist/components/full-calendar/calendar-cell.d.ts +11 -0
  152. package/dist/components/full-calendar/calendar-cell.js +2 -0
  153. package/dist/components/full-calendar/calendar-cell.js.map +1 -0
  154. package/dist/components/full-calendar/calendar-day-view.d.ts +5 -0
  155. package/dist/components/full-calendar/calendar-day-view.js +2 -0
  156. package/dist/components/full-calendar/calendar-day-view.js.map +1 -0
  157. package/dist/components/full-calendar/calendar-event.d.ts +18 -0
  158. package/dist/components/full-calendar/calendar-event.js +2 -0
  159. package/dist/components/full-calendar/calendar-event.js.map +1 -0
  160. package/dist/components/full-calendar/calendar-header.d.ts +6 -0
  161. package/dist/components/full-calendar/calendar-header.js +2 -0
  162. package/dist/components/full-calendar/calendar-header.js.map +1 -0
  163. package/dist/components/full-calendar/calendar-month-view.d.ts +5 -0
  164. package/dist/components/full-calendar/calendar-month-view.js +2 -0
  165. package/dist/components/full-calendar/calendar-month-view.js.map +1 -0
  166. package/dist/components/full-calendar/calendar-more-events-dropdown.d.ts +9 -0
  167. package/dist/components/full-calendar/calendar-more-events-dropdown.js +2 -0
  168. package/dist/components/full-calendar/calendar-more-events-dropdown.js.map +1 -0
  169. package/dist/components/full-calendar/calendar-navigator.d.ts +5 -0
  170. package/dist/components/full-calendar/calendar-navigator.js +2 -0
  171. package/dist/components/full-calendar/calendar-navigator.js.map +1 -0
  172. package/dist/components/full-calendar/calendar-root.d.ts +30 -0
  173. package/dist/components/full-calendar/calendar-root.js +2 -0
  174. package/dist/components/full-calendar/calendar-root.js.map +1 -0
  175. package/dist/components/full-calendar/calendar-today-button.d.ts +9 -0
  176. package/dist/components/full-calendar/calendar-today-button.js +2 -0
  177. package/dist/components/full-calendar/calendar-today-button.js.map +1 -0
  178. package/dist/components/full-calendar/calendar-toggle-view.d.ts +5 -0
  179. package/dist/components/full-calendar/calendar-toggle-view.js +2 -0
  180. package/dist/components/full-calendar/calendar-toggle-view.js.map +1 -0
  181. package/dist/components/full-calendar/calendar-view-renderer.d.ts +5 -0
  182. package/dist/components/full-calendar/calendar-view-renderer.js +2 -0
  183. package/dist/components/full-calendar/calendar-view-renderer.js.map +1 -0
  184. package/dist/components/full-calendar/calendar-week-day.d.ts +10 -0
  185. package/dist/components/full-calendar/calendar-week-day.js +2 -0
  186. package/dist/components/full-calendar/calendar-week-day.js.map +1 -0
  187. package/dist/components/full-calendar/calendar-week-view.d.ts +5 -0
  188. package/dist/components/full-calendar/calendar-week-view.js +2 -0
  189. package/dist/components/full-calendar/calendar-week-view.js.map +1 -0
  190. package/dist/components/full-calendar/helpers/calendar.d.ts +25 -0
  191. package/dist/components/full-calendar/helpers/calendar.js +2 -0
  192. package/dist/components/full-calendar/helpers/calendar.js.map +1 -0
  193. package/dist/components/full-calendar/index.d.ts +18 -0
  194. package/dist/components/full-calendar/index.js +2 -0
  195. package/dist/components/full-calendar/index.js.map +1 -0
  196. package/dist/components/full-calendar/types/calendar-cell.d.ts +6 -0
  197. package/dist/components/full-calendar/types/calendar-cell.js +2 -0
  198. package/dist/components/full-calendar/types/calendar-cell.js.map +1 -0
  199. package/dist/components/full-calendar/types/calendar-event.d.ts +8 -0
  200. package/dist/components/full-calendar/types/calendar-event.js +2 -0
  201. package/dist/components/full-calendar/types/calendar-event.js.map +1 -0
  202. package/dist/components/full-calendar/types/calendar-view.d.ts +3 -0
  203. package/dist/components/full-calendar/types/calendar-view.js +2 -0
  204. package/dist/components/full-calendar/types/calendar-view.js.map +1 -0
  205. package/dist/components/full-calendar/types/calendar-week-hour.d.ts +6 -0
  206. package/dist/components/full-calendar/types/calendar-week-hour.js +2 -0
  207. package/dist/components/full-calendar/types/calendar-week-hour.js.map +1 -0
  208. package/dist/components/horizontal-scroll.d.ts +11 -0
  209. package/dist/components/horizontal-scroll.js +2 -0
  210. package/dist/components/horizontal-scroll.js.map +1 -0
  211. package/dist/components/icon.d.ts +3 -4
  212. package/dist/components/icon.js +2 -177
  213. package/dist/components/icon.js.map +1 -0
  214. package/dist/components/list.js +2 -179
  215. package/dist/components/list.js.map +1 -0
  216. package/dist/components/logo.js +2 -324
  217. package/dist/components/logo.js.map +1 -0
  218. package/dist/components/selection-bar.d.ts +57 -0
  219. package/dist/components/selection-bar.js +2 -0
  220. package/dist/components/selection-bar.js.map +1 -0
  221. package/dist/components/sheet.d.ts +8 -8
  222. package/dist/components/sheet.js +2 -251
  223. package/dist/components/sheet.js.map +1 -0
  224. package/dist/components/skeleton.js +2 -16
  225. package/dist/components/skeleton.js.map +1 -0
  226. package/dist/components/status.js +2 -111
  227. package/dist/components/status.js.map +1 -0
  228. package/dist/components/table.js +2 -196
  229. package/dist/components/table.js.map +1 -0
  230. package/dist/components/tabs.d.ts +9 -6
  231. package/dist/components/tabs.js +2 -54
  232. package/dist/components/tabs.js.map +1 -0
  233. package/dist/components/tag.d.ts +5 -2
  234. package/dist/components/tag.js +2 -189
  235. package/dist/components/tag.js.map +1 -0
  236. package/dist/components/tooltip.js +2 -58
  237. package/dist/components/tooltip.js.map +1 -0
  238. package/dist/components/typography.js +2 -78
  239. package/dist/components/typography.js.map +1 -0
  240. package/dist/components/upload.d.ts +74 -0
  241. package/dist/components/upload.js +2 -0
  242. package/dist/components/upload.js.map +1 -0
  243. package/dist/hooks/index.d.ts +7 -0
  244. package/dist/hooks/index.js +2 -0
  245. package/dist/hooks/index.js.map +1 -0
  246. package/dist/icons-CmDuL0gZ.d.ts +4 -0
  247. package/dist/index.css +2 -2322
  248. package/dist/index.css.map +1 -0
  249. package/dist/logo-PQRZORCS.js +3 -0
  250. package/dist/logo-PQRZORCS.js.map +1 -0
  251. package/package.json +60 -18
  252. package/src/components/breadcrumb.tsx +119 -0
  253. package/src/components/chip.tsx +11 -3
  254. package/src/components/dialog.tsx +242 -0
  255. package/src/components/drag-and-drop/drag-handle.tsx +46 -0
  256. package/src/components/drag-and-drop/drag-list-item.tsx +91 -0
  257. package/src/components/drag-and-drop/drag-list.tsx +47 -0
  258. package/src/components/drag-and-drop/drag-root.tsx +30 -0
  259. package/src/components/drag-and-drop/index.ts +39 -0
  260. package/src/components/drag-and-drop/types/drag-item.ts +7 -0
  261. package/src/components/{calendar.tsx → form/calendar.tsx} +9 -8
  262. package/src/components/{checkbox.tsx → form/checkbox.tsx} +2 -2
  263. package/src/components/form/context/field.context.ts +27 -0
  264. package/src/components/form/date-picker.tsx +199 -0
  265. package/src/components/form/floating-label.tsx +60 -0
  266. package/src/components/form/input.tsx +235 -0
  267. package/src/components/{radio.tsx → form/radio.tsx} +1 -1
  268. package/src/components/{rich-editor.tsx → form/rich-editor.tsx} +10 -9
  269. package/src/components/{search-input.tsx → form/search-input.tsx} +2 -2
  270. package/src/components/form/select.tsx +274 -0
  271. package/src/components/full-calendar/calendar-add-event.tsx +15 -0
  272. package/src/components/full-calendar/calendar-body.tsx +12 -0
  273. package/src/components/full-calendar/calendar-cell.tsx +120 -0
  274. package/src/components/full-calendar/calendar-day-view.tsx +76 -0
  275. package/src/components/full-calendar/calendar-event.tsx +178 -0
  276. package/src/components/full-calendar/calendar-header.tsx +14 -0
  277. package/src/components/full-calendar/calendar-month-view.tsx +69 -0
  278. package/src/components/full-calendar/calendar-more-events-dropdown.tsx +39 -0
  279. package/src/components/full-calendar/calendar-navigator.tsx +86 -0
  280. package/src/components/full-calendar/calendar-root.tsx +165 -0
  281. package/src/components/full-calendar/calendar-today-button.tsx +21 -0
  282. package/src/components/full-calendar/calendar-toggle-view.tsx +61 -0
  283. package/src/components/full-calendar/calendar-view-renderer.tsx +19 -0
  284. package/src/components/full-calendar/calendar-week-day.tsx +49 -0
  285. package/src/components/full-calendar/calendar-week-view.tsx +88 -0
  286. package/src/components/full-calendar/helpers/calendar.ts +158 -0
  287. package/src/components/full-calendar/index.ts +16 -0
  288. package/src/components/full-calendar/types/calendar-cell.ts +4 -0
  289. package/src/components/full-calendar/types/calendar-event.ts +7 -0
  290. package/src/components/full-calendar/types/calendar-view.ts +1 -0
  291. package/src/components/full-calendar/types/calendar-week-hour.ts +4 -0
  292. package/src/components/horizontal-scroll.tsx +159 -0
  293. package/src/components/icon.tsx +1 -1
  294. package/src/components/logo.tsx +25 -20
  295. package/src/components/selection-bar.tsx +273 -0
  296. package/src/components/sheet.tsx +2 -2
  297. package/src/components/tabs.tsx +56 -37
  298. package/src/components/tag.tsx +11 -3
  299. package/src/components/upload.tsx +647 -0
  300. package/src/index.css +2 -2
  301. package/src/resources/icons.ts +4 -1
  302. package/src/resources/logo/index.tsx +33 -0
  303. package/tsup.config.ts +23 -5
  304. package/dist/components/button.js +0 -98
  305. package/dist/components/calendar.js +0 -751
  306. package/dist/components/checkbox.js +0 -153
  307. package/dist/components/date-picker.d.ts +0 -20
  308. package/dist/components/date-picker.js +0 -232
  309. package/dist/components/input.d.ts +0 -32
  310. package/dist/components/input.js +0 -315
  311. package/dist/components/otp-input.js +0 -47
  312. package/dist/components/radio.js +0 -156
  313. package/dist/components/rich-editor.js +0 -723
  314. package/dist/components/search-input.js +0 -274
  315. package/dist/components/select.d.ts +0 -33
  316. package/dist/components/select.js +0 -550
  317. package/dist/components/switch.js +0 -36
  318. package/dist/components/test.d.ts +0 -5
  319. package/dist/components/test.js +0 -8
  320. package/dist/index.js +0 -0
  321. package/src/components/date-picker.tsx +0 -160
  322. package/src/components/input.tsx +0 -256
  323. package/src/components/select.tsx +0 -240
  324. package/src/components/test.tsx +0 -3
  325. package/src/index.ts +0 -1
  326. package/src/resources/logo/index.ts +0 -3
  327. /package/dist/components/{button.d.ts → form/button.d.ts} +0 -0
  328. /package/dist/components/{calendar.d.ts → form/calendar.d.ts} +0 -0
  329. /package/dist/components/{checkbox.d.ts → form/checkbox.d.ts} +0 -0
  330. /package/dist/components/{otp-input.d.ts → form/otp-input.d.ts} +0 -0
  331. /package/dist/components/{radio.d.ts → form/radio.d.ts} +0 -0
  332. /package/dist/components/{search-input.d.ts → form/search-input.d.ts} +0 -0
  333. /package/dist/components/{switch.d.ts → form/switch.d.ts} +0 -0
  334. /package/src/components/{button.tsx → form/button.tsx} +0 -0
  335. /package/src/components/{otp-input.tsx → form/otp-input.tsx} +0 -0
  336. /package/src/components/{switch.tsx → form/switch.tsx} +0 -0
@@ -0,0 +1,69 @@
1
+ import { useCallback, useMemo } from 'react'
2
+ import { cx } from '@xjur-ui/util'
3
+ import { Typography } from '../typography'
4
+ import { getDaysInMonth, getEventsForDay, WEEKDAYS } from './helpers/calendar'
5
+ import { useFullCalendar } from './calendar-root'
6
+ import { CalendarCell } from './calendar-cell'
7
+ import type { ICalendarCell } from './types/calendar-cell'
8
+
9
+ export function CalendarMonthView() {
10
+ const { selectedDate, events } = useFullCalendar()
11
+
12
+ const monthDaysCells = useMemo(
13
+ () => getDaysInMonth(selectedDate),
14
+ [selectedDate]
15
+ )
16
+
17
+ const getEventsForDayCell = useCallback(
18
+ (cell: ICalendarCell) => {
19
+ return getEventsForDay(events, cell.date)
20
+ },
21
+ [events]
22
+ )
23
+
24
+ return (
25
+ <div className="rounded-small-1x scrollbar-hide border-border-layer-2 h-full w-full border">
26
+ <div
27
+ className="bg-layer-2-hover h-large-4x rounded-t-small-1x sticky top-0 grid grid-cols-7"
28
+ data-slot="month-header"
29
+ >
30
+ {WEEKDAYS.map(weekday => (
31
+ <div
32
+ className={cx(
33
+ 'p-small b border-border-layer-2 flex items-center justify-center border-r last:border-r-0'
34
+ )}
35
+ data-slot="month-header-weekday"
36
+ key={weekday}
37
+ >
38
+ <Typography size="sm" variant="label" weight="medium">
39
+ {weekday}
40
+ </Typography>
41
+ </div>
42
+ ))}
43
+ </div>
44
+
45
+ <div
46
+ className="grid h-full grid-cols-7 overflow-hidden"
47
+ data-slot="month-day-cells"
48
+ >
49
+ {monthDaysCells.map((cell, index) => {
50
+ const isLastColumn = (index + 1) % 7 === 0
51
+ const isFirstColumn = (index + 1) % 7 === 1
52
+
53
+ return (
54
+ <div
55
+ className={cx(
56
+ 'border-border-layer-2 border-t border-r',
57
+ isLastColumn && 'pr-small-2x border-r-0',
58
+ isFirstColumn && 'pl-small-2x'
59
+ )}
60
+ key={`${cell.date.toISOString()}-${index}`}
61
+ >
62
+ <CalendarCell cell={cell} events={getEventsForDayCell(cell)} />
63
+ </div>
64
+ )
65
+ })}
66
+ </div>
67
+ </div>
68
+ )
69
+ }
@@ -0,0 +1,39 @@
1
+ import { Fragment } from 'react/jsx-runtime'
2
+ import { Button } from '../form/button'
3
+ import {
4
+ DropdownMenuRoot,
5
+ DropdownMenuList,
6
+ DropdownMenuTrigger,
7
+ DropdownMenuContent
8
+ } from '../dropdown-menu'
9
+ import { useFullCalendar } from './calendar-root'
10
+ import type { ICalendarEvent } from './types/calendar-event'
11
+
12
+ interface CalendarMoreEventsDropdownProps {
13
+ events: ICalendarEvent[]
14
+ }
15
+
16
+ export function CalendarMoreEventsDropdown({
17
+ events
18
+ }: CalendarMoreEventsDropdownProps) {
19
+ const { renderEvent } = useFullCalendar()
20
+ return (
21
+ <DropdownMenuRoot>
22
+ <DropdownMenuTrigger asChild={true}>
23
+ <Button size="sm" variant="outlined">
24
+ Mais {events.length}
25
+ </Button>
26
+ </DropdownMenuTrigger>
27
+
28
+ <DropdownMenuContent className="w-[240px]">
29
+ <DropdownMenuList>
30
+ {events.map(event => (
31
+ <Fragment key={event.eventDate.toISOString()}>
32
+ {renderEvent?.(event)}
33
+ </Fragment>
34
+ ))}
35
+ </DropdownMenuList>
36
+ </DropdownMenuContent>
37
+ </DropdownMenuRoot>
38
+ )
39
+ }
@@ -0,0 +1,86 @@
1
+ import { useCallback, useMemo } from 'react'
2
+ import {
3
+ addDays,
4
+ addMonths,
5
+ addWeeks,
6
+ format,
7
+ startOfWeek,
8
+ subDays,
9
+ subMonths,
10
+ subWeeks
11
+ } from 'date-fns'
12
+ import { ptBR } from 'date-fns/locale'
13
+ import { capitalize } from '@xjur-ui/util'
14
+ import { Typography } from '../typography'
15
+ import { Button } from '../form/button'
16
+ import { Icon } from '../icon'
17
+ import { useFullCalendar } from './calendar-root'
18
+ import { getStartAndEndDateOfWeek } from './helpers/calendar'
19
+
20
+ export function CalendarNavigator() {
21
+ const { selectedDate, calendarView, setSelectedDate } = useFullCalendar()
22
+
23
+ const viewLabel = useMemo(() => {
24
+ if (calendarView === 'month') {
25
+ return capitalize(
26
+ format(selectedDate, "MMMM 'de' yyyy", { locale: ptBR })
27
+ )
28
+ }
29
+
30
+ if (calendarView === 'week') {
31
+ const { start, end } = getStartAndEndDateOfWeek(selectedDate)
32
+ const month = format(end, 'MMMM', { locale: ptBR })
33
+ const year = format(end, 'yyyy', { locale: ptBR })
34
+ return `${start.getDate()} - ${end.getDate()} de ${month} de ${year}`
35
+ }
36
+
37
+ return format(selectedDate, "dd 'de' MMMM 'de' yyyy", { locale: ptBR })
38
+ }, [selectedDate, calendarView])
39
+
40
+ const handleNextDate = useCallback(() => {
41
+ if (calendarView === 'month') {
42
+ setSelectedDate(addMonths(selectedDate, 1))
43
+ return
44
+ }
45
+
46
+ if (calendarView === 'week') {
47
+ const nextWeek = startOfWeek(addWeeks(selectedDate, 1))
48
+ setSelectedDate(nextWeek)
49
+ return
50
+ }
51
+
52
+ const nextDay = addDays(selectedDate, 1)
53
+ setSelectedDate(nextDay)
54
+ }, [selectedDate, setSelectedDate, calendarView])
55
+
56
+ const handlePreviousDate = useCallback(() => {
57
+ if (calendarView === 'month') {
58
+ setSelectedDate(subMonths(selectedDate, 1))
59
+ return
60
+ }
61
+
62
+ if (calendarView === 'week') {
63
+ setSelectedDate(subWeeks(selectedDate, 1))
64
+ }
65
+
66
+ setSelectedDate(subDays(selectedDate, 1))
67
+ }, [selectedDate, setSelectedDate, calendarView])
68
+
69
+ return (
70
+ <div className="gap-large flex items-center">
71
+ <Typography className="text-title-neutral" size="lg" variant="title">
72
+ {viewLabel}
73
+ </Typography>
74
+
75
+ <div className="gap-small flex items-center">
76
+ <Button size="icon_md" variant="tertiary" onClick={handlePreviousDate}>
77
+ <Icon className="text-icon-neutral-3" name="chevron_left" />
78
+ </Button>
79
+
80
+ <Button size="icon_md" variant="tertiary" onClick={handleNextDate}>
81
+ <Icon className="text-icon-neutral-3" name="chevron_right" />
82
+ </Button>
83
+ </div>
84
+ </div>
85
+ )
86
+ }
@@ -0,0 +1,165 @@
1
+ import React, {
2
+ createContext,
3
+ use,
4
+ useCallback,
5
+ useMemo,
6
+ useState
7
+ } from 'react'
8
+ import {
9
+ DndContext,
10
+ closestCenter,
11
+ useSensor,
12
+ useSensors,
13
+ PointerSensor,
14
+ KeyboardSensor,
15
+ type DragEndEvent,
16
+ type DragStartEvent,
17
+ MouseSensor
18
+ } from '@dnd-kit/core'
19
+ import { sortableKeyboardCoordinates } from '@dnd-kit/sortable'
20
+ import type { ICalendarEvent } from './types/calendar-event'
21
+ import type { CalendarView } from './types/calendar-view'
22
+
23
+ interface CalendarContextType {
24
+ events: ICalendarEvent[]
25
+ selectedDate: Date
26
+ calendarView?: CalendarView
27
+ activeEventId: string | null
28
+ disableEventCreationInPast?: boolean
29
+ renderEvent: (event: ICalendarEvent) => React.ReactNode
30
+ handleChangeView: (view: CalendarView) => void
31
+ setSelectedDate: React.Dispatch<React.SetStateAction<Date>>
32
+ onEventMove?: (eventId: string, newDate: Date) => void
33
+ onAddEvent?: (date: Date) => void
34
+ }
35
+
36
+ const CalendarContext = createContext<CalendarContextType>({
37
+ events: [],
38
+ calendarView: 'month',
39
+ selectedDate: new Date(),
40
+ activeEventId: null,
41
+ disableEventCreationInPast: true,
42
+ renderEvent: () => null,
43
+ setSelectedDate: () => {},
44
+ handleChangeView: () => {},
45
+ onEventMove: () => {},
46
+ onAddEvent: () => {}
47
+ })
48
+
49
+ export function CalendarRoot({
50
+ children,
51
+ events,
52
+ calendarView: calendarViewProp = 'month',
53
+ selectedDate: selectedDateProp = new Date(),
54
+ disableEventCreationInPast = true,
55
+ renderEvent,
56
+ onEventMove,
57
+ onAddEvent
58
+ }: {
59
+ children: React.ReactNode
60
+ events: ICalendarEvent[]
61
+ selectedDate?: Date
62
+ calendarView?: CalendarView
63
+ disableEventCreationInPast?: boolean
64
+ renderEvent: (event: ICalendarEvent) => React.ReactNode
65
+ onEventMove?: (eventId: string, newDate: Date) => void
66
+ onAddEvent?: (date: Date) => void
67
+ }) {
68
+ const [selectedDate, setSelectedDate] = useState(selectedDateProp)
69
+ const [calendarView, setCalendarView] = useState(calendarViewProp)
70
+ const [activeEventId, setActiveEventId] = useState<string | null>(null)
71
+
72
+ const handleChangeView = useCallback((view: CalendarView) => {
73
+ setSelectedDate(new Date())
74
+ setCalendarView(view)
75
+ }, [])
76
+
77
+ const sensors = useSensors(
78
+ useSensor(PointerSensor, {
79
+ activationConstraint: {
80
+ distance: 8
81
+ }
82
+ }),
83
+ useSensor(KeyboardSensor, {
84
+ coordinateGetter: sortableKeyboardCoordinates
85
+ }),
86
+ useSensor(MouseSensor, {
87
+ activationConstraint: {
88
+ distance: 5,
89
+ delay: 250
90
+ }
91
+ })
92
+ )
93
+
94
+ const handleDragStart = useCallback((event: DragStartEvent) => {
95
+ const eventId = event.active.id.toString()
96
+ setActiveEventId(eventId)
97
+ }, [])
98
+
99
+ const handleDragEnd = useCallback(
100
+ (event: DragEndEvent) => {
101
+ const { active, over } = event
102
+ setActiveEventId(null)
103
+
104
+ if (!active || !over || !onEventMove) return
105
+
106
+ const eventId = active.id.toString()
107
+ const cellDate = over.data.current?.date as Date
108
+
109
+ console.log(cellDate)
110
+
111
+ if (cellDate) {
112
+ onEventMove(eventId, cellDate)
113
+ }
114
+ },
115
+ [onEventMove]
116
+ )
117
+
118
+ const providerValue = useMemo(
119
+ () => ({
120
+ events,
121
+ renderEvent,
122
+ activeEventId,
123
+ disableEventCreationInPast,
124
+ selectedDate,
125
+ setSelectedDate,
126
+
127
+ calendarView,
128
+ handleChangeView,
129
+ onEventMove,
130
+ onAddEvent
131
+ }),
132
+ [
133
+ events,
134
+ renderEvent,
135
+ activeEventId,
136
+ disableEventCreationInPast,
137
+ selectedDate,
138
+ calendarView,
139
+ handleChangeView,
140
+ onEventMove,
141
+ onAddEvent
142
+ ]
143
+ )
144
+
145
+ return (
146
+ <CalendarContext.Provider value={providerValue}>
147
+ <DndContext
148
+ collisionDetection={closestCenter}
149
+ sensors={sensors}
150
+ onDragEnd={handleDragEnd}
151
+ onDragStart={handleDragStart}
152
+ >
153
+ {children}
154
+ </DndContext>
155
+ </CalendarContext.Provider>
156
+ )
157
+ }
158
+
159
+ export function useFullCalendar() {
160
+ const context = use(CalendarContext)
161
+ if (!context) {
162
+ throw new Error('useFullCalendar must be used within a CalendarRoot')
163
+ }
164
+ return context
165
+ }
@@ -0,0 +1,21 @@
1
+ import { useCallback } from 'react'
2
+ import { Button, type ButtonProps } from '../form/button'
3
+ import { useFullCalendar } from './calendar-root'
4
+
5
+ export function CalendarTodayButton({
6
+ children = 'Hoje',
7
+ variant = 'tertiary',
8
+ ...props
9
+ }: ButtonProps) {
10
+ const { setSelectedDate } = useFullCalendar()
11
+
12
+ const handleToday = useCallback(() => {
13
+ setSelectedDate(new Date())
14
+ }, [setSelectedDate])
15
+
16
+ return (
17
+ <Button variant={variant} onClick={handleToday} {...props}>
18
+ {children}
19
+ </Button>
20
+ )
21
+ }
@@ -0,0 +1,61 @@
1
+ import { useMemo } from 'react'
2
+ import {
3
+ SelectContent,
4
+ SelectOption,
5
+ SelectRoot,
6
+ SelectTrigger,
7
+ SelectValue,
8
+ SelectOptions,
9
+ SelectOptionText,
10
+ SelectIcon
11
+ } from '../form/select'
12
+ import type { CalendarView } from './types/calendar-view'
13
+ import { useFullCalendar } from './calendar-root'
14
+
15
+ const views: Array<{ name: string; value: CalendarView }> = [
16
+ { name: 'Mês', value: 'month' },
17
+ { name: 'Semana', value: 'week' },
18
+ { name: 'Dia', value: 'day' }
19
+ ]
20
+
21
+ export function CalendarToggleView() {
22
+ const { calendarView, handleChangeView } = useFullCalendar()
23
+
24
+ const displayValue = useMemo(
25
+ () => views.find(view => view.value === calendarView)?.name,
26
+ [calendarView]
27
+ )
28
+
29
+ return (
30
+ <div className="w-[94px]">
31
+ <SelectRoot>
32
+ <SelectTrigger>
33
+ <SelectValue
34
+ displayValue={displayValue}
35
+ name="calendar-toggle-view"
36
+ value={calendarView}
37
+ />
38
+ <SelectIcon
39
+ className="text-icon-neutral-3"
40
+ name="keyboard_arrow_down"
41
+ />
42
+ </SelectTrigger>
43
+
44
+ <SelectContent>
45
+ <SelectOptions>
46
+ {views.map(view => (
47
+ <SelectOption
48
+ isActive={calendarView === view.value}
49
+ key={view.value}
50
+ value={view.value}
51
+ onClick={() => handleChangeView(view.value)}
52
+ >
53
+ <SelectOptionText>{view.name}</SelectOptionText>
54
+ </SelectOption>
55
+ ))}
56
+ </SelectOptions>
57
+ </SelectContent>
58
+ </SelectRoot>
59
+ </div>
60
+ )
61
+ }
@@ -0,0 +1,19 @@
1
+ import { useFullCalendar } from './calendar-root'
2
+ import { CalendarMonthView } from './calendar-month-view'
3
+ import { CalendarWeekView } from './calendar-week-view'
4
+ import { CalendarDayView } from './calendar-day-view'
5
+
6
+ export function CalendarViewRenderer() {
7
+ const { calendarView } = useFullCalendar()
8
+
9
+ switch (calendarView) {
10
+ case 'month':
11
+ return <CalendarMonthView />
12
+ case 'week':
13
+ return <CalendarWeekView />
14
+ case 'day':
15
+ return <CalendarDayView />
16
+ default:
17
+ return <CalendarMonthView />
18
+ }
19
+ }
@@ -0,0 +1,49 @@
1
+ import { cx } from '@xjur-ui/util'
2
+ import type { ComponentProps } from 'react'
3
+ import { Typography } from '../typography'
4
+ import { isToday, WEEKDAYS } from './helpers/calendar'
5
+
6
+ interface CalendarWeekDayProps extends ComponentProps<'div'> {
7
+ date: Date
8
+ className?: string
9
+ }
10
+
11
+ export function CalendarWeekDay({
12
+ date,
13
+ className,
14
+ ...props
15
+ }: CalendarWeekDayProps) {
16
+ const isCurrentDay = isToday(date)
17
+ const dayNumber = date.getDate()
18
+
19
+ return (
20
+ <div
21
+ className={cx(
22
+ 'p-small gap-small-1x flex w-full flex-1 flex-col items-center',
23
+ className
24
+ )}
25
+ data-slot="week-day"
26
+ key={date.toISOString()}
27
+ {...props}
28
+ >
29
+ <Typography size="sm" variant="label" weight="medium">
30
+ {WEEKDAYS[date.getDay()]}
31
+ </Typography>
32
+ <div
33
+ className={cx(
34
+ 'size-large-2x rounded-circle flex items-center justify-center',
35
+ isCurrentDay && 'bg-primary-idle'
36
+ )}
37
+ >
38
+ <Typography
39
+ className={cx(isCurrentDay && 'text-neutral-label')}
40
+ size="sm-1x"
41
+ variant="label"
42
+ weight="medium"
43
+ >
44
+ {dayNumber}
45
+ </Typography>
46
+ </div>
47
+ </div>
48
+ )
49
+ }
@@ -0,0 +1,88 @@
1
+ import { useCallback, useMemo } from 'react'
2
+ import { cx } from '@xjur-ui/util'
3
+ import { setHours } from 'date-fns'
4
+ import { Typography } from '../typography'
5
+ import {
6
+ WEEK_HOURS,
7
+ getWeekDaysInMonth,
8
+ getEventsForDayAndHour
9
+ } from './helpers/calendar'
10
+ import { useFullCalendar } from './calendar-root'
11
+ import { CalendarWeekDay } from './calendar-week-day'
12
+ import { CalendarCell } from './calendar-cell'
13
+ import type { ICalendarCell } from './types/calendar-cell'
14
+
15
+ export function CalendarWeekView() {
16
+ const { selectedDate, events } = useFullCalendar()
17
+
18
+ const monthWeekDaysCells = useMemo(
19
+ () => getWeekDaysInMonth(selectedDate),
20
+ [selectedDate]
21
+ )
22
+
23
+ const getEventsForDayAndHourCallback = useCallback(
24
+ (date: Date, hour: number) => {
25
+ return getEventsForDayAndHour(events, date, hour)
26
+ },
27
+ [events]
28
+ )
29
+
30
+ const cellsWithHour = useCallback((cell: ICalendarCell, hour: number) => {
31
+ return {
32
+ ...cell,
33
+ date: setHours(cell.date, hour)
34
+ }
35
+ }, [])
36
+
37
+ return (
38
+ <div className="bg-layer-2-hover rounded-small-1x border-border-layer-2 scrollbar-hide h-full w-full border">
39
+ <div className="flex flex-1 flex-col">
40
+ <div
41
+ className={cx(
42
+ 'bg-layer-2-hover sticky top-0 grid [grid-template-columns:64px_repeat(7,1fr)]',
43
+ '[&>*]:border-border-layer-2',
44
+ '[&>*]:border-l'
45
+ )}
46
+ data-slot="week-header"
47
+ >
48
+ {monthWeekDaysCells.map((cell, index) => (
49
+ <CalendarWeekDay
50
+ date={cell.date}
51
+ key={cell.date.getDay()}
52
+ style={{ gridColumnStart: index + 2 }}
53
+ />
54
+ ))}
55
+ </div>
56
+
57
+ <div className="overflow-hidden">
58
+ {WEEK_HOURS.map(({ hour, label }) => (
59
+ <div className="flex items-start" key={hour}>
60
+ <div className="px-small flex h-full w-[64px] items-start justify-end">
61
+ <Typography size="sm-1x" variant="label" weight="medium">
62
+ {label}
63
+ </Typography>
64
+ </div>
65
+
66
+ <div
67
+ className={cx(
68
+ 'grid flex-1 grid-cols-7',
69
+ '[&>*]:border-border-layer-2',
70
+ '[&>*]:border-t',
71
+ '[&>*]:border-l'
72
+ )}
73
+ >
74
+ {monthWeekDaysCells.map(cell => (
75
+ <CalendarCell
76
+ cell={cellsWithHour(cell, hour)}
77
+ events={getEventsForDayAndHourCallback(cell.date, hour)}
78
+ key={cell.date.toISOString()}
79
+ />
80
+ ))}
81
+ </div>
82
+ </div>
83
+ ))}
84
+ </div>
85
+ </div>
86
+ </div>
87
+ )
88
+ }