@wireservers-ui/react-natives 0.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 (414) hide show
  1. package/assets/logos/react-natives-icon-square-1024.png +0 -0
  2. package/assets/logos/react-natives-logo-1056x320.png +0 -0
  3. package/assets/logos/react-natives-logo-1280x320.png +0 -0
  4. package/assets/logos/react-natives-logo-1840x600.png +0 -0
  5. package/assets/logos/react-natives-logo-1980x600.png +0 -0
  6. package/assets/logos/react-natives-logo-2400x600.png +0 -0
  7. package/assets/logos/react-natives-logo-490x160.png +0 -0
  8. package/assets/logos/react-natives-logo-528x160.png +0 -0
  9. package/assets/logos/react-natives-logo-640x160.png +0 -0
  10. package/assets/logos/react-natives-logo-981x320.png +0 -0
  11. package/assets/logos/react-natives-logo.svg +45 -0
  12. package/assets/logos/react-natives-mark-1024.png +0 -0
  13. package/assets/logos/react-natives-mark-128.png +0 -0
  14. package/assets/logos/react-natives-mark-256.png +0 -0
  15. package/assets/logos/react-natives-mark-512.png +0 -0
  16. package/assets/logos/react-natives-mark.svg +42 -0
  17. package/package.json +57 -0
  18. package/src/accordion/accordion-content.tsx +30 -0
  19. package/src/accordion/accordion-icon.tsx +54 -0
  20. package/src/accordion/accordion-item.tsx +37 -0
  21. package/src/accordion/accordion-title-text.tsx +24 -0
  22. package/src/accordion/accordion-trigger.tsx +38 -0
  23. package/src/accordion/accordion.tsx +91 -0
  24. package/src/accordion/index.ts +24 -0
  25. package/src/accordion/styles.ts +74 -0
  26. package/src/accordion/types.ts +56 -0
  27. package/src/actionsheet/actionsheet-backdrop.tsx +23 -0
  28. package/src/actionsheet/actionsheet-content.tsx +19 -0
  29. package/src/actionsheet/actionsheet-drag-indicator-wrapper.tsx +19 -0
  30. package/src/actionsheet/actionsheet-drag-indicator.tsx +19 -0
  31. package/src/actionsheet/actionsheet-item-text.tsx +19 -0
  32. package/src/actionsheet/actionsheet-item.tsx +20 -0
  33. package/src/actionsheet/actionsheet-scroll-view.tsx +12 -0
  34. package/src/actionsheet/actionsheet.tsx +45 -0
  35. package/src/actionsheet/index.ts +20 -0
  36. package/src/actionsheet/styles.ts +25 -0
  37. package/src/actionsheet/types.ts +49 -0
  38. package/src/alert/alert-body.tsx +19 -0
  39. package/src/alert/alert-close-button.tsx +23 -0
  40. package/src/alert/alert-icon.tsx +40 -0
  41. package/src/alert/alert-text.tsx +22 -0
  42. package/src/alert/alert.tsx +33 -0
  43. package/src/alert/index.ts +15 -0
  44. package/src/alert/styles.ts +112 -0
  45. package/src/alert/types.ts +36 -0
  46. package/src/alert-dialog/alert-dialog.tsx +54 -0
  47. package/src/alert-dialog/index.ts +2 -0
  48. package/src/alert-dialog/styles.ts +40 -0
  49. package/src/alert-dialog/types.ts +40 -0
  50. package/src/aspect-ratio/aspect-ratio.tsx +20 -0
  51. package/src/aspect-ratio/index.ts +2 -0
  52. package/src/aspect-ratio/styles.ts +6 -0
  53. package/src/aspect-ratio/types.ts +7 -0
  54. package/src/avatar/avatar-badge.tsx +22 -0
  55. package/src/avatar/avatar-fallback-text.tsx +33 -0
  56. package/src/avatar/avatar-group.tsx +53 -0
  57. package/src/avatar/avatar-image.tsx +21 -0
  58. package/src/avatar/avatar.tsx +27 -0
  59. package/src/avatar/index.ts +14 -0
  60. package/src/avatar/styles.ts +94 -0
  61. package/src/avatar/types.ts +35 -0
  62. package/src/badge/badge-icon.tsx +20 -0
  63. package/src/badge/badge-text.tsx +24 -0
  64. package/src/badge/badge.tsx +39 -0
  65. package/src/badge/index.ts +11 -0
  66. package/src/badge/styles.ts +175 -0
  67. package/src/badge/types.ts +37 -0
  68. package/src/blockquote/blockquote.tsx +21 -0
  69. package/src/blockquote/index.ts +2 -0
  70. package/src/blockquote/styles.ts +11 -0
  71. package/src/blockquote/types.ts +6 -0
  72. package/src/box/box.tsx +19 -0
  73. package/src/box/index.ts +2 -0
  74. package/src/box/styles.ts +6 -0
  75. package/src/box/types.ts +6 -0
  76. package/src/breadcrumb/breadcrumb-item.tsx +20 -0
  77. package/src/breadcrumb/breadcrumb-link.tsx +20 -0
  78. package/src/breadcrumb/breadcrumb-text.tsx +19 -0
  79. package/src/breadcrumb/breadcrumb.tsx +43 -0
  80. package/src/breadcrumb/index.ts +12 -0
  81. package/src/breadcrumb/styles.ts +36 -0
  82. package/src/breadcrumb/types.ts +33 -0
  83. package/src/button/button-group.tsx +35 -0
  84. package/src/button/button-icon.tsx +37 -0
  85. package/src/button/button-spinner.tsx +12 -0
  86. package/src/button/button-text.tsx +27 -0
  87. package/src/button/button.tsx +42 -0
  88. package/src/button/index.ts +19 -0
  89. package/src/button/styles.ts +250 -0
  90. package/src/button/types.ts +67 -0
  91. package/src/calendar/calendar-day-cell.tsx +67 -0
  92. package/src/calendar/calendar-day-view.tsx +66 -0
  93. package/src/calendar/calendar-event.tsx +59 -0
  94. package/src/calendar/calendar-header.tsx +60 -0
  95. package/src/calendar/calendar-horizontal-view.tsx +372 -0
  96. package/src/calendar/calendar-legend.tsx +41 -0
  97. package/src/calendar/calendar-month-view.tsx +47 -0
  98. package/src/calendar/calendar-vertical-view.tsx +395 -0
  99. package/src/calendar/calendar-view-switcher.tsx +65 -0
  100. package/src/calendar/calendar-week-view.tsx +52 -0
  101. package/src/calendar/calendar.tsx +74 -0
  102. package/src/calendar/index.ts +27 -0
  103. package/src/calendar/styles.ts +367 -0
  104. package/src/calendar/types.ts +101 -0
  105. package/src/calendar/use-calendar.ts +170 -0
  106. package/src/calendar/utils.ts +278 -0
  107. package/src/card/card-body.tsx +22 -0
  108. package/src/card/card-footer.tsx +19 -0
  109. package/src/card/card-header.tsx +22 -0
  110. package/src/card/card.tsx +27 -0
  111. package/src/card/index.ts +13 -0
  112. package/src/card/styles.ts +54 -0
  113. package/src/card/types.ts +31 -0
  114. package/src/carousel/carousel.tsx +360 -0
  115. package/src/carousel/index.ts +2 -0
  116. package/src/carousel/styles.ts +21 -0
  117. package/src/carousel/types.ts +31 -0
  118. package/src/center/center.tsx +19 -0
  119. package/src/center/index.ts +2 -0
  120. package/src/center/styles.ts +6 -0
  121. package/src/center/types.ts +6 -0
  122. package/src/checkbox/checkbox-group.tsx +63 -0
  123. package/src/checkbox/checkbox-icon.tsx +35 -0
  124. package/src/checkbox/checkbox-indicator.tsx +30 -0
  125. package/src/checkbox/checkbox-label.tsx +24 -0
  126. package/src/checkbox/checkbox.tsx +86 -0
  127. package/src/checkbox/index.ts +14 -0
  128. package/src/checkbox/styles.ts +69 -0
  129. package/src/checkbox/types.ts +55 -0
  130. package/src/circular-progress/circular-progress.tsx +82 -0
  131. package/src/circular-progress/index.ts +2 -0
  132. package/src/circular-progress/styles.ts +31 -0
  133. package/src/circular-progress/types.ts +18 -0
  134. package/src/code/code.tsx +36 -0
  135. package/src/code/index.ts +2 -0
  136. package/src/code/styles.ts +25 -0
  137. package/src/code/types.ts +13 -0
  138. package/src/collapsible/collapsible.tsx +58 -0
  139. package/src/collapsible/index.ts +2 -0
  140. package/src/collapsible/styles.ts +5 -0
  141. package/src/collapsible/types.ts +21 -0
  142. package/src/color-picker/color-picker-box.tsx +115 -0
  143. package/src/color-picker/color-picker-slider.tsx +98 -0
  144. package/src/color-picker/color-picker.tsx +162 -0
  145. package/src/color-picker/color-utils.ts +215 -0
  146. package/src/color-picker/index.ts +34 -0
  147. package/src/color-picker/styles.ts +32 -0
  148. package/src/color-picker/types.ts +49 -0
  149. package/src/color-picker/use-pointer-drag.ts +80 -0
  150. package/src/container/container.tsx +19 -0
  151. package/src/container/index.ts +2 -0
  152. package/src/container/styles.ts +21 -0
  153. package/src/container/types.ts +10 -0
  154. package/src/date-picker/date-picker.tsx +136 -0
  155. package/src/date-picker/index.ts +15 -0
  156. package/src/date-picker/styles.ts +18 -0
  157. package/src/date-picker/types.ts +33 -0
  158. package/src/divider/divider.tsx +21 -0
  159. package/src/divider/index.ts +2 -0
  160. package/src/divider/styles.ts +14 -0
  161. package/src/divider/types.ts +7 -0
  162. package/src/drawer/drawer-backdrop.tsx +23 -0
  163. package/src/drawer/drawer-body.tsx +19 -0
  164. package/src/drawer/drawer-close-button.tsx +29 -0
  165. package/src/drawer/drawer-content.tsx +142 -0
  166. package/src/drawer/drawer-footer.tsx +19 -0
  167. package/src/drawer/drawer-header.tsx +19 -0
  168. package/src/drawer/drawer.tsx +54 -0
  169. package/src/drawer/index.ts +22 -0
  170. package/src/drawer/styles.ts +36 -0
  171. package/src/drawer/types.ts +62 -0
  172. package/src/empty/empty.tsx +53 -0
  173. package/src/empty/index.ts +2 -0
  174. package/src/empty/styles.ts +26 -0
  175. package/src/empty/types.ts +22 -0
  176. package/src/fab/fab-icon.tsx +20 -0
  177. package/src/fab/fab-label.tsx +22 -0
  178. package/src/fab/fab.tsx +45 -0
  179. package/src/fab/index.ts +11 -0
  180. package/src/fab/styles.ts +57 -0
  181. package/src/fab/types.ts +33 -0
  182. package/src/form-control/form-control-error-icon.tsx +25 -0
  183. package/src/form-control/form-control-error-message.tsx +40 -0
  184. package/src/form-control/form-control-helper-text.tsx +25 -0
  185. package/src/form-control/form-control-label-text.tsx +25 -0
  186. package/src/form-control/form-control-label.tsx +36 -0
  187. package/src/form-control/form-control.tsx +46 -0
  188. package/src/form-control/index.ts +20 -0
  189. package/src/form-control/styles.ts +105 -0
  190. package/src/form-control/types.ts +45 -0
  191. package/src/heading/heading.tsx +21 -0
  192. package/src/heading/index.ts +2 -0
  193. package/src/heading/styles.ts +24 -0
  194. package/src/heading/types.ts +19 -0
  195. package/src/icon/icon.tsx +21 -0
  196. package/src/icon/index.ts +2 -0
  197. package/src/icon/styles.ts +18 -0
  198. package/src/icon/types.ts +8 -0
  199. package/src/icon-button/icon-button.tsx +23 -0
  200. package/src/icon-button/index.ts +2 -0
  201. package/src/icon-button/styles.ts +78 -0
  202. package/src/icon-button/types.ts +15 -0
  203. package/src/image/image.tsx +20 -0
  204. package/src/image/index.ts +2 -0
  205. package/src/image/styles.ts +28 -0
  206. package/src/image/types.ts +11 -0
  207. package/src/index.ts +1039 -0
  208. package/src/input/index.ts +13 -0
  209. package/src/input/input-field.tsx +35 -0
  210. package/src/input/input-icon.tsx +25 -0
  211. package/src/input/input-slot.tsx +24 -0
  212. package/src/input/input.tsx +73 -0
  213. package/src/input/styles.ts +90 -0
  214. package/src/input/types.ts +39 -0
  215. package/src/kbd/index.ts +2 -0
  216. package/src/kbd/kbd.tsx +21 -0
  217. package/src/kbd/styles.ts +11 -0
  218. package/src/kbd/types.ts +7 -0
  219. package/src/link/index.ts +4 -0
  220. package/src/link/link-text.tsx +19 -0
  221. package/src/link/link.tsx +31 -0
  222. package/src/link/styles.ts +19 -0
  223. package/src/link/types.ts +13 -0
  224. package/src/list/index.ts +2 -0
  225. package/src/list/list.tsx +55 -0
  226. package/src/list/styles.ts +8 -0
  227. package/src/list/types.ts +17 -0
  228. package/src/menu/index.ts +2 -0
  229. package/src/menu/menu.tsx +99 -0
  230. package/src/menu/styles.ts +14 -0
  231. package/src/menu/types.ts +30 -0
  232. package/src/modal/index.ts +18 -0
  233. package/src/modal/modal-backdrop.tsx +23 -0
  234. package/src/modal/modal-body.tsx +19 -0
  235. package/src/modal/modal-close-button.tsx +29 -0
  236. package/src/modal/modal-content.tsx +22 -0
  237. package/src/modal/modal-footer.tsx +19 -0
  238. package/src/modal/modal-header.tsx +19 -0
  239. package/src/modal/modal.tsx +50 -0
  240. package/src/modal/styles.ts +37 -0
  241. package/src/modal/types.ts +49 -0
  242. package/src/nativewind-env.d.ts +1 -0
  243. package/src/number-input/index.ts +18 -0
  244. package/src/number-input/number-input.tsx +161 -0
  245. package/src/number-input/styles.ts +35 -0
  246. package/src/number-input/types.ts +44 -0
  247. package/src/overlay/index.ts +2 -0
  248. package/src/overlay/overlay.tsx +21 -0
  249. package/src/overlay/styles.ts +6 -0
  250. package/src/overlay/types.ts +7 -0
  251. package/src/pagination/index.ts +2 -0
  252. package/src/pagination/pagination.tsx +58 -0
  253. package/src/pagination/styles.ts +27 -0
  254. package/src/pagination/types.ts +19 -0
  255. package/src/password-input/index.ts +14 -0
  256. package/src/password-input/password-input.tsx +79 -0
  257. package/src/password-input/styles.ts +25 -0
  258. package/src/password-input/types.ts +24 -0
  259. package/src/pin-input/index.ts +12 -0
  260. package/src/pin-input/pin-input.tsx +96 -0
  261. package/src/pin-input/styles.ts +16 -0
  262. package/src/pin-input/types.ts +26 -0
  263. package/src/popover/index.ts +2 -0
  264. package/src/popover/popover.tsx +98 -0
  265. package/src/popover/styles.ts +31 -0
  266. package/src/popover/types.ts +46 -0
  267. package/src/portal/index.ts +2 -0
  268. package/src/portal/portal.tsx +8 -0
  269. package/src/portal/styles.ts +2 -0
  270. package/src/portal/types.ts +3 -0
  271. package/src/pressable/index.ts +2 -0
  272. package/src/pressable/pressable.tsx +20 -0
  273. package/src/pressable/styles.ts +10 -0
  274. package/src/pressable/types.ts +6 -0
  275. package/src/progress/index.ts +9 -0
  276. package/src/progress/progress-filled-track.tsx +26 -0
  277. package/src/progress/progress.tsx +52 -0
  278. package/src/progress/styles.ts +34 -0
  279. package/src/progress/types.ts +28 -0
  280. package/src/radio/index.ts +14 -0
  281. package/src/radio/radio-group.tsx +61 -0
  282. package/src/radio/radio-icon.tsx +24 -0
  283. package/src/radio/radio-indicator.tsx +30 -0
  284. package/src/radio/radio-label.tsx +24 -0
  285. package/src/radio/radio.tsx +68 -0
  286. package/src/radio/styles.ts +69 -0
  287. package/src/radio/types.ts +51 -0
  288. package/src/rating/index.ts +7 -0
  289. package/src/rating/rating.tsx +93 -0
  290. package/src/rating/styles.ts +13 -0
  291. package/src/rating/types.ts +29 -0
  292. package/src/search-input/index.ts +16 -0
  293. package/src/search-input/search-input.tsx +119 -0
  294. package/src/search-input/styles.ts +28 -0
  295. package/src/search-input/types.ts +31 -0
  296. package/src/segmented-control/index.ts +2 -0
  297. package/src/segmented-control/segmented-control.tsx +34 -0
  298. package/src/segmented-control/styles.ts +22 -0
  299. package/src/segmented-control/types.ts +22 -0
  300. package/src/select/index.ts +28 -0
  301. package/src/select/select-backdrop.tsx +25 -0
  302. package/src/select/select-content.tsx +49 -0
  303. package/src/select/select-drag-indicator.tsx +19 -0
  304. package/src/select/select-icon.tsx +25 -0
  305. package/src/select/select-input.tsx +32 -0
  306. package/src/select/select-item-text.tsx +30 -0
  307. package/src/select/select-item.tsx +72 -0
  308. package/src/select/select-portal.tsx +22 -0
  309. package/src/select/select-scroll-view.tsx +22 -0
  310. package/src/select/select-trigger.tsx +64 -0
  311. package/src/select/select.tsx +101 -0
  312. package/src/select/styles.ts +114 -0
  313. package/src/select/types.ts +92 -0
  314. package/src/skeleton/index.ts +2 -0
  315. package/src/skeleton/skeleton.tsx +29 -0
  316. package/src/skeleton/styles.ts +14 -0
  317. package/src/skeleton/types.ts +12 -0
  318. package/src/slider/index.ts +12 -0
  319. package/src/slider/slider-filled-track.tsx +31 -0
  320. package/src/slider/slider-thumb.tsx +52 -0
  321. package/src/slider/slider-track.tsx +154 -0
  322. package/src/slider/slider.tsx +193 -0
  323. package/src/slider/styles.ts +71 -0
  324. package/src/slider/types.ts +47 -0
  325. package/src/snackbar/index.ts +2 -0
  326. package/src/snackbar/snackbar.tsx +39 -0
  327. package/src/snackbar/styles.ts +29 -0
  328. package/src/snackbar/types.ts +21 -0
  329. package/src/spinner/index.ts +2 -0
  330. package/src/spinner/spinner.tsx +29 -0
  331. package/src/spinner/styles.ts +15 -0
  332. package/src/spinner/types.ts +10 -0
  333. package/src/stack/index.ts +2 -0
  334. package/src/stack/stack.tsx +49 -0
  335. package/src/stack/styles.ts +25 -0
  336. package/src/stack/types.ts +15 -0
  337. package/src/stat/index.ts +2 -0
  338. package/src/stat/stat.tsx +48 -0
  339. package/src/stat/styles.ts +34 -0
  340. package/src/stat/types.ts +24 -0
  341. package/src/stepper/index.ts +2 -0
  342. package/src/stepper/stepper.tsx +95 -0
  343. package/src/stepper/styles.ts +49 -0
  344. package/src/stepper/types.ts +20 -0
  345. package/src/switch/index.ts +2 -0
  346. package/src/switch/styles.ts +24 -0
  347. package/src/switch/switch.tsx +67 -0
  348. package/src/switch/types.ts +23 -0
  349. package/src/table/index.ts +2 -0
  350. package/src/table/styles.ts +12 -0
  351. package/src/table/table.tsx +52 -0
  352. package/src/table/types.ts +10 -0
  353. package/src/tabs/index.ts +18 -0
  354. package/src/tabs/styles.ts +113 -0
  355. package/src/tabs/tab-list.tsx +29 -0
  356. package/src/tabs/tab-panel.tsx +29 -0
  357. package/src/tabs/tab-panels.tsx +21 -0
  358. package/src/tabs/tab-text.tsx +26 -0
  359. package/src/tabs/tab.tsx +56 -0
  360. package/src/tabs/tabs.tsx +71 -0
  361. package/src/tabs/types.ts +53 -0
  362. package/src/tag/index.ts +14 -0
  363. package/src/tag/styles.ts +115 -0
  364. package/src/tag/tag-close-button.tsx +26 -0
  365. package/src/tag/tag-icon.tsx +20 -0
  366. package/src/tag/tag-text.tsx +22 -0
  367. package/src/tag/tag.tsx +40 -0
  368. package/src/tag/types.ts +33 -0
  369. package/src/tags-input/index.ts +18 -0
  370. package/src/tags-input/styles.ts +29 -0
  371. package/src/tags-input/tags-input.tsx +149 -0
  372. package/src/tags-input/types.ts +37 -0
  373. package/src/text/index.ts +2 -0
  374. package/src/text/styles.ts +54 -0
  375. package/src/text/text.tsx +51 -0
  376. package/src/text/types.ts +36 -0
  377. package/src/textarea/index.ts +2 -0
  378. package/src/textarea/styles.ts +37 -0
  379. package/src/textarea/textarea.tsx +68 -0
  380. package/src/textarea/types.ts +14 -0
  381. package/src/timeline/index.ts +2 -0
  382. package/src/timeline/styles.ts +57 -0
  383. package/src/timeline/timeline.tsx +52 -0
  384. package/src/timeline/types.ts +30 -0
  385. package/src/toast/index.ts +17 -0
  386. package/src/toast/styles.ts +118 -0
  387. package/src/toast/toast-description.tsx +22 -0
  388. package/src/toast/toast-provider.tsx +136 -0
  389. package/src/toast/toast-title.tsx +22 -0
  390. package/src/toast/toast.tsx +43 -0
  391. package/src/toast/types.ts +50 -0
  392. package/src/toast/use-toast.ts +7 -0
  393. package/src/toggle/index.ts +2 -0
  394. package/src/toggle/styles.ts +30 -0
  395. package/src/toggle/toggle.tsx +25 -0
  396. package/src/toggle/types.ts +15 -0
  397. package/src/toggle-group/index.ts +2 -0
  398. package/src/toggle-group/styles.ts +35 -0
  399. package/src/toggle-group/toggle-group.tsx +60 -0
  400. package/src/toggle-group/types.ts +29 -0
  401. package/src/tooltip/index.ts +11 -0
  402. package/src/tooltip/styles.ts +9 -0
  403. package/src/tooltip/tooltip-content.tsx +19 -0
  404. package/src/tooltip/tooltip-text.tsx +19 -0
  405. package/src/tooltip/tooltip.tsx +116 -0
  406. package/src/tooltip/types.ts +35 -0
  407. package/src/utils/brand.ts +5 -0
  408. package/src/utils/create-context.ts +17 -0
  409. package/src/utils/index.ts +8 -0
  410. package/src/utils/types.ts +20 -0
  411. package/src/visually-hidden/index.ts +2 -0
  412. package/src/visually-hidden/styles.ts +6 -0
  413. package/src/visually-hidden/types.ts +6 -0
  414. package/src/visually-hidden/visually-hidden.tsx +22 -0
@@ -0,0 +1,367 @@
1
+ import { tv } from 'tailwind-variants';
2
+
3
+ export const calendarRootStyle = tv({
4
+ base: 'bg-background-0 rounded-xl overflow-hidden border border-outline-200',
5
+ variants: {
6
+ size: {
7
+ sm: 'p-2',
8
+ md: 'p-3',
9
+ lg: 'p-4',
10
+ },
11
+ },
12
+ });
13
+
14
+ export const calendarHeaderStyle = tv({
15
+ base: 'flex-row items-center justify-between px-2 py-3',
16
+ });
17
+
18
+ export const calendarHeaderTitleStyle = tv({
19
+ base: 'text-lg font-semibold text-typography-900',
20
+ });
21
+
22
+ export const calendarNavButtonStyle = tv({
23
+ base: 'p-2 rounded-lg active:bg-background-200',
24
+ });
25
+
26
+ export const calendarViewSwitcherStyle = tv({
27
+ base: 'flex-row rounded-lg bg-background-100 p-0.5',
28
+ });
29
+
30
+ export const calendarViewButtonStyle = tv({
31
+ base: 'px-3 py-1.5 rounded-md',
32
+ variants: {
33
+ active: {
34
+ true: 'bg-background-0 shadow-hard-5',
35
+ false: 'bg-transparent',
36
+ },
37
+ },
38
+ });
39
+
40
+ export const calendarViewButtonTextStyle = tv({
41
+ base: 'text-sm font-medium',
42
+ variants: {
43
+ active: {
44
+ true: 'text-typography-900',
45
+ false: 'text-typography-500',
46
+ },
47
+ },
48
+ });
49
+
50
+ export const calendarWeekDayLabelStyle = tv({
51
+ base: 'flex-1 items-center py-2',
52
+ });
53
+
54
+ export const calendarWeekDayLabelTextStyle = tv({
55
+ base: 'text-xs font-medium text-typography-500 uppercase',
56
+ });
57
+
58
+ export const calendarDayCellStyle = tv({
59
+ base: 'flex-1 min-h-[48px] items-center py-1 border-b border-outline-100',
60
+ variants: {
61
+ isCurrentMonth: {
62
+ true: '',
63
+ false: 'opacity-40',
64
+ },
65
+ },
66
+ });
67
+
68
+ export const calendarDayNumberStyle = tv({
69
+ base: 'w-7 h-7 rounded-full items-center justify-center',
70
+ variants: {
71
+ isToday: {
72
+ true: 'bg-primary-500',
73
+ false: '',
74
+ },
75
+ isSelected: {
76
+ true: 'bg-info-500',
77
+ false: '',
78
+ },
79
+ },
80
+ });
81
+
82
+ export const calendarDayNumberTextStyle = tv({
83
+ base: 'text-sm text-typography-900',
84
+ variants: {
85
+ isToday: {
86
+ true: 'text-typography-0 font-bold',
87
+ false: '',
88
+ },
89
+ isSelected: {
90
+ true: 'text-typography-0 font-bold',
91
+ false: '',
92
+ },
93
+ isCurrentMonth: {
94
+ true: '',
95
+ false: 'text-typography-400',
96
+ },
97
+ },
98
+ });
99
+
100
+ export const calendarEventStyle = tv({
101
+ base: 'rounded px-1.5 py-0.5 mt-0.5 w-full',
102
+ variants: {
103
+ color: {
104
+ primary: '',
105
+ info: '',
106
+ success: '',
107
+ warning: '',
108
+ error: '',
109
+ tertiary: '',
110
+ },
111
+ variant: {
112
+ subtle: '',
113
+ solid: '',
114
+ },
115
+ },
116
+ compoundVariants: [
117
+ { color: 'primary', variant: 'subtle', class: 'bg-primary-100' },
118
+ { color: 'info', variant: 'subtle', class: 'bg-info-100' },
119
+ { color: 'success', variant: 'subtle', class: 'bg-success-100' },
120
+ { color: 'warning', variant: 'subtle', class: 'bg-warning-100' },
121
+ { color: 'error', variant: 'subtle', class: 'bg-error-100' },
122
+ { color: 'tertiary', variant: 'subtle', class: 'bg-tertiary-100' },
123
+ { color: 'primary', variant: 'solid', class: 'bg-primary-500' },
124
+ { color: 'info', variant: 'solid', class: 'bg-info-500' },
125
+ { color: 'success', variant: 'solid', class: 'bg-success-500' },
126
+ { color: 'warning', variant: 'solid', class: 'bg-warning-500' },
127
+ { color: 'error', variant: 'solid', class: 'bg-error-500' },
128
+ { color: 'tertiary', variant: 'solid', class: 'bg-tertiary-500' },
129
+ ],
130
+ defaultVariants: {
131
+ variant: 'subtle',
132
+ },
133
+ });
134
+
135
+ export const calendarEventTextStyle = tv({
136
+ base: 'text-2xs font-medium',
137
+ variants: {
138
+ color: {
139
+ primary: '',
140
+ info: '',
141
+ success: '',
142
+ warning: '',
143
+ error: '',
144
+ tertiary: '',
145
+ },
146
+ variant: {
147
+ subtle: '',
148
+ solid: 'text-typography-0 font-semibold',
149
+ },
150
+ },
151
+ compoundVariants: [
152
+ { color: 'primary', variant: 'subtle', class: 'text-primary-800' },
153
+ { color: 'info', variant: 'subtle', class: 'text-info-800' },
154
+ { color: 'success', variant: 'subtle', class: 'text-success-800' },
155
+ { color: 'warning', variant: 'subtle', class: 'text-warning-800' },
156
+ { color: 'error', variant: 'subtle', class: 'text-error-800' },
157
+ { color: 'tertiary', variant: 'subtle', class: 'text-tertiary-800' },
158
+ ],
159
+ defaultVariants: {
160
+ variant: 'subtle',
161
+ },
162
+ });
163
+
164
+ export const calendarTimeSlotStyle = tv({
165
+ base: 'flex-row min-h-[56px] border-b border-outline-100',
166
+ });
167
+
168
+ export const calendarTimeSlotLabelStyle = tv({
169
+ base: 'w-16 py-2 pr-2 items-end',
170
+ });
171
+
172
+ export const calendarTimeSlotLabelTextStyle = tv({
173
+ base: 'text-xs text-typography-400',
174
+ });
175
+
176
+ export const calendarTimeSlotContentStyle = tv({
177
+ base: 'flex-1 border-l border-outline-100 px-1 py-0.5',
178
+ });
179
+
180
+ // --- Horizontal view styles ---
181
+
182
+ export const calendarHorizontalMemberColumnStyle = tv({
183
+ base: 'border-r border-outline-200 bg-background-0 z-10',
184
+ });
185
+
186
+ export const calendarHorizontalMemberCellStyle = tv({
187
+ base: 'flex-row items-center px-3 py-2 border-b border-outline-100 min-h-[72px]',
188
+ });
189
+
190
+ export const calendarHorizontalAvatarStyle = tv({
191
+ base: 'w-10 h-10 rounded-full items-center justify-center mr-3',
192
+ variants: {
193
+ color: {
194
+ primary: 'bg-primary-500',
195
+ info: 'bg-info-500',
196
+ success: 'bg-success-500',
197
+ warning: 'bg-warning-500',
198
+ error: 'bg-error-500',
199
+ tertiary: 'bg-tertiary-500',
200
+ },
201
+ },
202
+ defaultVariants: {
203
+ color: 'primary',
204
+ },
205
+ });
206
+
207
+ export const calendarHorizontalAvatarTextStyle = tv({
208
+ base: 'text-xs font-bold text-typography-0',
209
+ });
210
+
211
+ export const calendarHorizontalMemberNameStyle = tv({
212
+ base: 'text-sm font-semibold text-typography-900',
213
+ });
214
+
215
+ export const calendarHorizontalMemberRoleStyle = tv({
216
+ base: 'text-2xs text-typography-400',
217
+ });
218
+
219
+ export const calendarHorizontalTimeHeaderStyle = tv({
220
+ base: 'flex-row border-b border-outline-200 bg-background-50',
221
+ });
222
+
223
+ export const calendarHorizontalTimeSlotHeaderStyle = tv({
224
+ base: 'items-center justify-center border-r border-outline-100 py-2',
225
+ });
226
+
227
+ export const calendarHorizontalTimeSlotHeaderTextStyle = tv({
228
+ base: 'text-2xs text-typography-500 font-medium',
229
+ });
230
+
231
+ export const calendarHorizontalRowStyle = tv({
232
+ base: 'flex-row border-b border-outline-100 relative min-h-[72px]',
233
+ });
234
+
235
+ export const calendarHorizontalGridCellStyle = tv({
236
+ base: 'border-r border-outline-50 min-h-[72px]',
237
+ });
238
+
239
+ export const calendarHorizontalEventStyle = tv({
240
+ base: 'absolute rounded-lg px-2 py-1 overflow-hidden justify-center',
241
+ variants: {
242
+ color: {
243
+ primary: 'bg-primary-500',
244
+ info: 'bg-info-500',
245
+ success: 'bg-success-500',
246
+ warning: 'bg-warning-500',
247
+ error: 'bg-error-500',
248
+ tertiary: 'bg-tertiary-500',
249
+ },
250
+ },
251
+ });
252
+
253
+ export const calendarHorizontalEventTitleStyle = tv({
254
+ base: 'text-xs font-semibold text-typography-0',
255
+ });
256
+
257
+ export const calendarHorizontalEventTimeStyle = tv({
258
+ base: 'text-2xs text-typography-0 opacity-80',
259
+ });
260
+
261
+ // --- Vertical view styles ---
262
+
263
+ export const calendarVerticalMemberHeaderStyle = tv({
264
+ base: 'flex-row border-b border-outline-200 bg-background-50',
265
+ });
266
+
267
+ export const calendarVerticalMemberCellStyle = tv({
268
+ base: 'items-center justify-center py-2 px-1 border-r border-outline-100',
269
+ });
270
+
271
+ export const calendarVerticalMemberNameStyle = tv({
272
+ base: 'text-xs font-semibold text-typography-900 text-center mt-1',
273
+ });
274
+
275
+ export const calendarVerticalMemberRoleStyle = tv({
276
+ base: 'text-2xs text-typography-400 text-center',
277
+ });
278
+
279
+ export const calendarVerticalTimeColumnStyle = tv({
280
+ base: 'border-r border-outline-200 bg-background-0 z-10',
281
+ });
282
+
283
+ export const calendarVerticalTimeCellStyle = tv({
284
+ base: 'justify-center items-end pr-2 border-b border-outline-100',
285
+ });
286
+
287
+ export const calendarVerticalTimeCellTextStyle = tv({
288
+ base: 'text-2xs text-typography-500 font-medium',
289
+ });
290
+
291
+ export const calendarVerticalColumnStyle = tv({
292
+ base: 'border-r border-outline-100 relative',
293
+ });
294
+
295
+ export const calendarVerticalGridCellStyle = tv({
296
+ base: 'border-b border-outline-50',
297
+ });
298
+
299
+ export const calendarVerticalEventStyle = tv({
300
+ base: 'absolute rounded-lg px-1.5 py-1 overflow-hidden left-1 right-1',
301
+ variants: {
302
+ color: {
303
+ primary: 'bg-primary-500',
304
+ info: 'bg-info-500',
305
+ success: 'bg-success-500',
306
+ warning: 'bg-warning-500',
307
+ error: 'bg-error-500',
308
+ tertiary: 'bg-tertiary-500',
309
+ },
310
+ },
311
+ });
312
+
313
+ export const calendarVerticalEventTitleStyle = tv({
314
+ base: 'text-2xs font-semibold text-typography-0',
315
+ });
316
+
317
+ export const calendarVerticalEventTimeStyle = tv({
318
+ base: 'text-2xs text-typography-0 opacity-80',
319
+ });
320
+
321
+ // --- Compact event styles (used in week/month timeline cells) ---
322
+
323
+ export const calendarCompactEventStyle = tv({
324
+ base: 'rounded px-1.5 py-0.5 mb-0.5',
325
+ variants: {
326
+ color: {
327
+ primary: 'bg-primary-500',
328
+ info: 'bg-info-500',
329
+ success: 'bg-success-500',
330
+ warning: 'bg-warning-500',
331
+ error: 'bg-error-500',
332
+ tertiary: 'bg-tertiary-500',
333
+ },
334
+ },
335
+ });
336
+
337
+ export const calendarCompactEventTextStyle = tv({
338
+ base: 'text-2xs font-medium text-typography-0',
339
+ });
340
+
341
+ // --- Legend styles ---
342
+
343
+ export const calendarLegendContainerStyle = tv({
344
+ base: 'flex-row flex-wrap gap-4 px-2 py-2',
345
+ });
346
+
347
+ export const calendarLegendItemStyle = tv({
348
+ base: 'flex-row items-center gap-1.5',
349
+ });
350
+
351
+ export const calendarLegendDotStyle = tv({
352
+ base: 'w-2.5 h-2.5 rounded-full',
353
+ variants: {
354
+ color: {
355
+ primary: 'bg-primary-500',
356
+ info: 'bg-info-500',
357
+ success: 'bg-success-500',
358
+ warning: 'bg-warning-500',
359
+ error: 'bg-error-500',
360
+ tertiary: 'bg-tertiary-500',
361
+ },
362
+ },
363
+ });
364
+
365
+ export const calendarLegendTextStyle = tv({
366
+ base: 'text-xs text-typography-600',
367
+ });
@@ -0,0 +1,101 @@
1
+ import type React from 'react';
2
+
3
+ export type CalendarLayout = 'horizontal' | 'vertical';
4
+ export type CalendarTimeRange = 'day' | 'week' | 'month';
5
+
6
+ /** @deprecated Use CalendarLayout instead */
7
+ export type CalendarView = CalendarLayout;
8
+
9
+ export type EventColor =
10
+ | 'primary'
11
+ | 'info'
12
+ | 'success'
13
+ | 'warning'
14
+ | 'error'
15
+ | 'tertiary';
16
+
17
+ export type EventVariant = 'subtle' | 'solid';
18
+
19
+ export interface CalendarEvent {
20
+ id: string;
21
+ title: string;
22
+ start: Date;
23
+ end: Date;
24
+ color?: EventColor;
25
+ allDay?: boolean;
26
+ memberId?: string;
27
+ }
28
+
29
+ export interface CalendarTeamMember {
30
+ id: string;
31
+ name: string;
32
+ role?: string;
33
+ initials: string;
34
+ avatarColor?: EventColor;
35
+ }
36
+
37
+ export interface CalendarHorizontalConfig {
38
+ startHour?: number;
39
+ endHour?: number;
40
+ slotMinutes?: number;
41
+ slotWidth?: number;
42
+ memberColumnWidth?: number;
43
+ slotHeight?: number;
44
+ timeColumnWidth?: number;
45
+ }
46
+
47
+ export interface CalendarDay {
48
+ date: Date;
49
+ isCurrentMonth: boolean;
50
+ isToday: boolean;
51
+ events: CalendarEvent[];
52
+ }
53
+
54
+ export interface CalendarWeek {
55
+ days: CalendarDay[];
56
+ }
57
+
58
+ export interface CalendarProps {
59
+ events?: CalendarEvent[];
60
+ members?: CalendarTeamMember[];
61
+ horizontalConfig?: CalendarHorizontalConfig;
62
+ initialDate?: Date;
63
+ initialLayout?: CalendarLayout;
64
+ initialTimeRange?: CalendarTimeRange;
65
+ /** @deprecated Use initialLayout instead */
66
+ initialView?: CalendarLayout;
67
+ onDateSelect?: (date: Date) => void;
68
+ onEventPress?: (event: CalendarEvent) => void;
69
+ onMonthChange?: (year: number, month: number) => void;
70
+ onViewChange?: (layout: CalendarLayout) => void;
71
+ onTimeRangeChange?: (timeRange: CalendarTimeRange) => void;
72
+ renderEvent?: (event: CalendarEvent) => React.ReactNode;
73
+ className?: string;
74
+ children?: React.ReactNode;
75
+ }
76
+
77
+ export interface CalendarContextValue {
78
+ currentDate: Date;
79
+ displayDate: Date;
80
+ layout: CalendarLayout;
81
+ timeRange: CalendarTimeRange;
82
+ /** @deprecated Use layout instead */
83
+ view: CalendarLayout;
84
+ events: CalendarEvent[];
85
+ members: CalendarTeamMember[];
86
+ horizontalConfig: Required<CalendarHorizontalConfig>;
87
+ selectedDate: Date | null;
88
+ setSelectedDate: (date: Date) => void;
89
+ setDisplayDate: (date: Date) => void;
90
+ setLayout: (layout: CalendarLayout) => void;
91
+ setTimeRange: (timeRange: CalendarTimeRange) => void;
92
+ /** @deprecated Use setLayout instead */
93
+ setView: (layout: CalendarLayout) => void;
94
+ navigateMonth: (direction: 1 | -1) => void;
95
+ navigateWeek: (direction: 1 | -1) => void;
96
+ navigateDay: (direction: 1 | -1) => void;
97
+ getEventsForDate: (date: Date) => CalendarEvent[];
98
+ getEventsForMember: (memberId: string, date: Date) => CalendarEvent[];
99
+ onEventPress?: (event: CalendarEvent) => void;
100
+ renderEvent?: (event: CalendarEvent) => React.ReactNode;
101
+ }
@@ -0,0 +1,170 @@
1
+ import { useState, useCallback, useMemo } from 'react';
2
+ import type {
3
+ CalendarEvent,
4
+ CalendarLayout,
5
+ CalendarTimeRange,
6
+ CalendarContextValue,
7
+ CalendarTeamMember,
8
+ CalendarHorizontalConfig,
9
+ } from './types';
10
+ import { addMonths, addDays, isSameDay, resolveHorizontalConfig } from './utils';
11
+
12
+ export function useCalendar(options: {
13
+ events?: CalendarEvent[];
14
+ members?: CalendarTeamMember[];
15
+ horizontalConfig?: CalendarHorizontalConfig;
16
+ initialDate?: Date;
17
+ initialLayout?: CalendarLayout;
18
+ initialTimeRange?: CalendarTimeRange;
19
+ /** @deprecated Use initialLayout */
20
+ initialView?: CalendarLayout;
21
+ onDateSelect?: (date: Date) => void;
22
+ onMonthChange?: (year: number, month: number) => void;
23
+ onViewChange?: (layout: CalendarLayout) => void;
24
+ onTimeRangeChange?: (timeRange: CalendarTimeRange) => void;
25
+ onEventPress?: (event: CalendarEvent) => void;
26
+ renderEvent?: (event: CalendarEvent) => React.ReactNode;
27
+ }): CalendarContextValue {
28
+ const {
29
+ events = [],
30
+ members = [],
31
+ horizontalConfig: horizontalConfigProp,
32
+ initialDate = new Date(),
33
+ initialLayout,
34
+ initialTimeRange = 'day',
35
+ initialView,
36
+ onDateSelect,
37
+ onMonthChange,
38
+ onViewChange,
39
+ onTimeRangeChange,
40
+ onEventPress,
41
+ renderEvent,
42
+ } = options;
43
+
44
+ const horizontalConfig = useMemo(
45
+ () => resolveHorizontalConfig(horizontalConfigProp),
46
+ [horizontalConfigProp],
47
+ );
48
+
49
+ const [displayDate, setDisplayDateState] = useState(initialDate);
50
+ const [selectedDate, setSelectedDateState] = useState<Date | null>(null);
51
+ const [layout, setLayoutState] = useState<CalendarLayout>(
52
+ initialLayout ?? initialView ?? 'horizontal',
53
+ );
54
+ const [timeRange, setTimeRangeState] = useState<CalendarTimeRange>(initialTimeRange);
55
+
56
+ const setDisplayDate = useCallback(
57
+ (date: Date) => {
58
+ setDisplayDateState(date);
59
+ onMonthChange?.(date.getFullYear(), date.getMonth());
60
+ },
61
+ [onMonthChange],
62
+ );
63
+
64
+ const setSelectedDate = useCallback(
65
+ (date: Date) => {
66
+ setSelectedDateState(date);
67
+ onDateSelect?.(date);
68
+ },
69
+ [onDateSelect],
70
+ );
71
+
72
+ const setLayout = useCallback(
73
+ (newLayout: CalendarLayout) => {
74
+ setLayoutState(newLayout);
75
+ onViewChange?.(newLayout);
76
+ },
77
+ [onViewChange],
78
+ );
79
+
80
+ const setTimeRange = useCallback(
81
+ (newTimeRange: CalendarTimeRange) => {
82
+ setTimeRangeState(newTimeRange);
83
+ onTimeRangeChange?.(newTimeRange);
84
+ },
85
+ [onTimeRangeChange],
86
+ );
87
+
88
+ const navigateMonth = useCallback(
89
+ (direction: 1 | -1) => {
90
+ setDisplayDate(addMonths(displayDate, direction));
91
+ },
92
+ [displayDate, setDisplayDate],
93
+ );
94
+
95
+ const navigateWeek = useCallback(
96
+ (direction: 1 | -1) => {
97
+ setDisplayDate(addDays(displayDate, direction * 7));
98
+ },
99
+ [displayDate, setDisplayDate],
100
+ );
101
+
102
+ const navigateDay = useCallback(
103
+ (direction: 1 | -1) => {
104
+ setDisplayDate(addDays(displayDate, direction));
105
+ },
106
+ [displayDate, setDisplayDate],
107
+ );
108
+
109
+ const getEventsForDate = useCallback(
110
+ (date: Date) => {
111
+ return events.filter((e) => isSameDay(e.start, date));
112
+ },
113
+ [events],
114
+ );
115
+
116
+ const getEventsForMember = useCallback(
117
+ (memberId: string, date: Date) => {
118
+ return events.filter(
119
+ (e) => e.memberId === memberId && isSameDay(e.start, date),
120
+ );
121
+ },
122
+ [events],
123
+ );
124
+
125
+ return useMemo(
126
+ () => ({
127
+ currentDate: new Date(),
128
+ displayDate,
129
+ layout,
130
+ timeRange,
131
+ view: layout,
132
+ events,
133
+ members,
134
+ horizontalConfig,
135
+ selectedDate,
136
+ setSelectedDate,
137
+ setDisplayDate,
138
+ setLayout,
139
+ setTimeRange,
140
+ setView: setLayout,
141
+ navigateMonth,
142
+ navigateWeek,
143
+ navigateDay,
144
+ getEventsForDate,
145
+ getEventsForMember,
146
+ onEventPress,
147
+ renderEvent,
148
+ }),
149
+ [
150
+ displayDate,
151
+ layout,
152
+ timeRange,
153
+ events,
154
+ members,
155
+ horizontalConfig,
156
+ selectedDate,
157
+ setSelectedDate,
158
+ setDisplayDate,
159
+ setLayout,
160
+ setTimeRange,
161
+ navigateMonth,
162
+ navigateWeek,
163
+ navigateDay,
164
+ getEventsForDate,
165
+ getEventsForMember,
166
+ onEventPress,
167
+ renderEvent,
168
+ ],
169
+ );
170
+ }