react-native-roster 0.0.0 → 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 (373) hide show
  1. package/NOTICE.md +29 -0
  2. package/README.md +455 -2
  3. package/dist/src/adapters/rrule/cache.d.ts +15 -0
  4. package/dist/src/adapters/rrule/cache.d.ts.map +1 -0
  5. package/dist/src/adapters/rrule/cache.js +53 -0
  6. package/dist/src/adapters/rrule/cache.js.map +1 -0
  7. package/dist/src/adapters/rrule/envelope.d.ts +3 -0
  8. package/dist/src/adapters/rrule/envelope.d.ts.map +1 -0
  9. package/dist/src/adapters/rrule/envelope.js +9 -0
  10. package/dist/src/adapters/rrule/envelope.js.map +1 -0
  11. package/dist/src/adapters/rrule/expand.d.ts +4 -0
  12. package/dist/src/adapters/rrule/expand.d.ts.map +1 -0
  13. package/dist/src/adapters/rrule/expand.js +92 -0
  14. package/dist/src/adapters/rrule/expand.js.map +1 -0
  15. package/dist/src/adapters/rrule/hash.d.ts +3 -0
  16. package/dist/src/adapters/rrule/hash.d.ts.map +1 -0
  17. package/dist/src/adapters/rrule/hash.js +15 -0
  18. package/dist/src/adapters/rrule/hash.js.map +1 -0
  19. package/dist/src/adapters/rrule/index.d.ts +5 -0
  20. package/dist/src/adapters/rrule/index.d.ts.map +1 -0
  21. package/dist/src/adapters/rrule/index.js +12 -0
  22. package/dist/src/adapters/rrule/index.js.map +1 -0
  23. package/dist/src/adapters/rrule/net.d.ts +6 -0
  24. package/dist/src/adapters/rrule/net.d.ts.map +1 -0
  25. package/dist/src/adapters/rrule/net.js +31 -0
  26. package/dist/src/adapters/rrule/net.js.map +1 -0
  27. package/dist/src/adapters/rrule/occurrences.d.ts +6 -0
  28. package/dist/src/adapters/rrule/occurrences.d.ts.map +1 -0
  29. package/dist/src/adapters/rrule/occurrences.js +252 -0
  30. package/dist/src/adapters/rrule/occurrences.js.map +1 -0
  31. package/dist/src/adapters/rrule/types.d.ts +62 -0
  32. package/dist/src/adapters/rrule/types.d.ts.map +1 -0
  33. package/dist/src/adapters/rrule/types.js +3 -0
  34. package/dist/src/adapters/rrule/types.js.map +1 -0
  35. package/dist/src/adapters/rrule/validate.d.ts +6 -0
  36. package/dist/src/adapters/rrule/validate.d.ts.map +1 -0
  37. package/dist/src/adapters/rrule/validate.js +64 -0
  38. package/dist/src/adapters/rrule/validate.js.map +1 -0
  39. package/dist/src/components/layers/layers.types.d.ts +15 -0
  40. package/dist/src/components/layers/layers.types.d.ts.map +1 -0
  41. package/dist/src/components/layers/layers.types.js +3 -0
  42. package/dist/src/components/layers/layers.types.js.map +1 -0
  43. package/dist/src/components/layers/parts/gap.d.ts +3 -0
  44. package/dist/src/components/layers/parts/gap.d.ts.map +1 -0
  45. package/dist/src/components/layers/parts/gap.js +7 -0
  46. package/dist/src/components/layers/parts/gap.js.map +1 -0
  47. package/dist/src/components/layers/parts/interval.d.ts +3 -0
  48. package/dist/src/components/layers/parts/interval.d.ts.map +1 -0
  49. package/dist/src/components/layers/parts/interval.js +22 -0
  50. package/dist/src/components/layers/parts/interval.js.map +1 -0
  51. package/dist/src/components/layers/utils/styles.d.ts +7 -0
  52. package/dist/src/components/layers/utils/styles.d.ts.map +1 -0
  53. package/dist/src/components/layers/utils/styles.js +24 -0
  54. package/dist/src/components/layers/utils/styles.js.map +1 -0
  55. package/dist/src/components/primitives/press-point.d.ts +3 -0
  56. package/dist/src/components/primitives/press-point.d.ts.map +1 -0
  57. package/dist/src/components/primitives/press-point.js +7 -0
  58. package/dist/src/components/primitives/press-point.js.map +1 -0
  59. package/dist/src/components/primitives/press-point.types.d.ts +14 -0
  60. package/dist/src/components/primitives/press-point.types.d.ts.map +1 -0
  61. package/dist/src/components/primitives/press-point.types.js +3 -0
  62. package/dist/src/components/primitives/press-point.types.js.map +1 -0
  63. package/dist/src/components/primitives/press-point.web.d.ts +3 -0
  64. package/dist/src/components/primitives/press-point.web.d.ts.map +1 -0
  65. package/dist/src/components/primitives/press-point.web.js +17 -0
  66. package/dist/src/components/primitives/press-point.web.js.map +1 -0
  67. package/dist/src/components/primitives/region-style.d.ts +9 -0
  68. package/dist/src/components/primitives/region-style.d.ts.map +1 -0
  69. package/dist/src/components/primitives/region-style.js +20 -0
  70. package/dist/src/components/primitives/region-style.js.map +1 -0
  71. package/dist/src/components/roster/body-layout.d.ts +9 -0
  72. package/dist/src/components/roster/body-layout.d.ts.map +1 -0
  73. package/dist/src/components/roster/body-layout.js +9 -0
  74. package/dist/src/components/roster/body-layout.js.map +1 -0
  75. package/dist/src/components/roster/index.d.ts +3 -0
  76. package/dist/src/components/roster/index.d.ts.map +1 -0
  77. package/dist/src/components/roster/index.js +40 -0
  78. package/dist/src/components/roster/index.js.map +1 -0
  79. package/dist/src/components/roster/lanes/interval-hover.d.ts +3 -0
  80. package/dist/src/components/roster/lanes/interval-hover.d.ts.map +1 -0
  81. package/dist/src/components/roster/lanes/interval-hover.js +7 -0
  82. package/dist/src/components/roster/lanes/interval-hover.js.map +1 -0
  83. package/dist/src/components/roster/lanes/interval-hover.types.d.ts +15 -0
  84. package/dist/src/components/roster/lanes/interval-hover.types.d.ts.map +1 -0
  85. package/dist/src/components/roster/lanes/interval-hover.types.js +3 -0
  86. package/dist/src/components/roster/lanes/interval-hover.types.js.map +1 -0
  87. package/dist/src/components/roster/lanes/interval-hover.web.d.ts +3 -0
  88. package/dist/src/components/roster/lanes/interval-hover.web.d.ts.map +1 -0
  89. package/dist/src/components/roster/lanes/interval-hover.web.js +20 -0
  90. package/dist/src/components/roster/lanes/interval-hover.web.js.map +1 -0
  91. package/dist/src/components/roster/lanes/lane.d.ts +10 -0
  92. package/dist/src/components/roster/lanes/lane.d.ts.map +1 -0
  93. package/dist/src/components/roster/lanes/lane.js +32 -0
  94. package/dist/src/components/roster/lanes/lane.js.map +1 -0
  95. package/dist/src/components/roster/lanes/parts/incomplete.d.ts +8 -0
  96. package/dist/src/components/roster/lanes/parts/incomplete.d.ts.map +1 -0
  97. package/dist/src/components/roster/lanes/parts/incomplete.js +30 -0
  98. package/dist/src/components/roster/lanes/parts/incomplete.js.map +1 -0
  99. package/dist/src/components/roster/lanes/parts/lane-label.d.ts +3 -0
  100. package/dist/src/components/roster/lanes/parts/lane-label.d.ts.map +1 -0
  101. package/dist/src/components/roster/lanes/parts/lane-label.js +18 -0
  102. package/dist/src/components/roster/lanes/parts/lane-label.js.map +1 -0
  103. package/dist/src/components/roster/layout.d.ts +17 -0
  104. package/dist/src/components/roster/layout.d.ts.map +1 -0
  105. package/dist/src/components/roster/layout.js +24 -0
  106. package/dist/src/components/roster/layout.js.map +1 -0
  107. package/dist/src/components/roster/parts/body.d.ts +7 -0
  108. package/dist/src/components/roster/parts/body.d.ts.map +1 -0
  109. package/dist/src/components/roster/parts/body.js +14 -0
  110. package/dist/src/components/roster/parts/body.js.map +1 -0
  111. package/dist/src/components/roster/parts/corner.d.ts +2 -0
  112. package/dist/src/components/roster/parts/corner.d.ts.map +1 -0
  113. package/dist/src/components/roster/parts/corner.js +7 -0
  114. package/dist/src/components/roster/parts/corner.js.map +1 -0
  115. package/dist/src/components/roster/parts/empty.d.ts +2 -0
  116. package/dist/src/components/roster/parts/empty.d.ts.map +1 -0
  117. package/dist/src/components/roster/parts/empty.js +9 -0
  118. package/dist/src/components/roster/parts/empty.js.map +1 -0
  119. package/dist/src/components/roster/parts/grid.d.ts +3 -0
  120. package/dist/src/components/roster/parts/grid.d.ts.map +1 -0
  121. package/dist/src/components/roster/parts/grid.js +16 -0
  122. package/dist/src/components/roster/parts/grid.js.map +1 -0
  123. package/dist/src/components/roster/parts/header-cell.d.ts +3 -0
  124. package/dist/src/components/roster/parts/header-cell.d.ts.map +1 -0
  125. package/dist/src/components/roster/parts/header-cell.js +9 -0
  126. package/dist/src/components/roster/parts/header-cell.js.map +1 -0
  127. package/dist/src/components/roster/parts/header.d.ts +3 -0
  128. package/dist/src/components/roster/parts/header.d.ts.map +1 -0
  129. package/dist/src/components/roster/parts/header.js +13 -0
  130. package/dist/src/components/roster/parts/header.js.map +1 -0
  131. package/dist/src/components/roster/parts/lane-label-column.d.ts +3 -0
  132. package/dist/src/components/roster/parts/lane-label-column.d.ts.map +1 -0
  133. package/dist/src/components/roster/parts/lane-label-column.js +18 -0
  134. package/dist/src/components/roster/parts/lane-label-column.js.map +1 -0
  135. package/dist/src/components/roster/parts/lane-list.d.ts +7 -0
  136. package/dist/src/components/roster/parts/lane-list.d.ts.map +1 -0
  137. package/dist/src/components/roster/parts/lane-list.js +25 -0
  138. package/dist/src/components/roster/parts/lane-list.js.map +1 -0
  139. package/dist/src/components/roster/roster.types.d.ts +145 -0
  140. package/dist/src/components/roster/roster.types.d.ts.map +1 -0
  141. package/dist/src/components/roster/roster.types.js +3 -0
  142. package/dist/src/components/roster/roster.types.js.map +1 -0
  143. package/dist/src/components/roster/use-roster.d.ts +3 -0
  144. package/dist/src/components/roster/use-roster.d.ts.map +1 -0
  145. package/dist/src/components/roster/use-roster.js +106 -0
  146. package/dist/src/components/roster/use-roster.js.map +1 -0
  147. package/dist/src/components/roster/utils/body-content-key.d.ts +3 -0
  148. package/dist/src/components/roster/utils/body-content-key.d.ts.map +1 -0
  149. package/dist/src/components/roster/utils/body-content-key.js +29 -0
  150. package/dist/src/components/roster/utils/body-content-key.js.map +1 -0
  151. package/dist/src/components/roster/utils/ticks.d.ts +4 -0
  152. package/dist/src/components/roster/utils/ticks.d.ts.map +1 -0
  153. package/dist/src/components/roster/utils/ticks.js +60 -0
  154. package/dist/src/components/roster/utils/ticks.js.map +1 -0
  155. package/dist/src/components/schedule/days/day.d.ts +20 -0
  156. package/dist/src/components/schedule/days/day.d.ts.map +1 -0
  157. package/dist/src/components/schedule/days/day.js +17 -0
  158. package/dist/src/components/schedule/days/day.js.map +1 -0
  159. package/dist/src/components/schedule/days/header-layout.d.ts +9 -0
  160. package/dist/src/components/schedule/days/header-layout.d.ts.map +1 -0
  161. package/dist/src/components/schedule/days/header-layout.js +9 -0
  162. package/dist/src/components/schedule/days/header-layout.js.map +1 -0
  163. package/dist/src/components/schedule/days/layout.d.ts +18 -0
  164. package/dist/src/components/schedule/days/layout.d.ts.map +1 -0
  165. package/dist/src/components/schedule/days/layout.js +9 -0
  166. package/dist/src/components/schedule/days/layout.js.map +1 -0
  167. package/dist/src/components/schedule/days/parts/column.d.ts +3 -0
  168. package/dist/src/components/schedule/days/parts/column.d.ts.map +1 -0
  169. package/dist/src/components/schedule/days/parts/column.js +28 -0
  170. package/dist/src/components/schedule/days/parts/column.js.map +1 -0
  171. package/dist/src/components/schedule/days/parts/day-header.d.ts +5 -0
  172. package/dist/src/components/schedule/days/parts/day-header.d.ts.map +1 -0
  173. package/dist/src/components/schedule/days/parts/day-header.js +10 -0
  174. package/dist/src/components/schedule/days/parts/day-header.js.map +1 -0
  175. package/dist/src/components/schedule/days/parts/grid.d.ts +3 -0
  176. package/dist/src/components/schedule/days/parts/grid.d.ts.map +1 -0
  177. package/dist/src/components/schedule/days/parts/grid.js +14 -0
  178. package/dist/src/components/schedule/days/parts/grid.js.map +1 -0
  179. package/dist/src/components/schedule/days/parts/now-line.d.ts +5 -0
  180. package/dist/src/components/schedule/days/parts/now-line.d.ts.map +1 -0
  181. package/dist/src/components/schedule/days/parts/now-line.js +9 -0
  182. package/dist/src/components/schedule/days/parts/now-line.js.map +1 -0
  183. package/dist/src/components/schedule/days/parts/skipped-date.d.ts +4 -0
  184. package/dist/src/components/schedule/days/parts/skipped-date.d.ts.map +1 -0
  185. package/dist/src/components/schedule/days/parts/skipped-date.js +17 -0
  186. package/dist/src/components/schedule/days/parts/skipped-date.js.map +1 -0
  187. package/dist/src/components/schedule/days/parts/transition.d.ts +3 -0
  188. package/dist/src/components/schedule/days/parts/transition.d.ts.map +1 -0
  189. package/dist/src/components/schedule/days/parts/transition.js +42 -0
  190. package/dist/src/components/schedule/days/parts/transition.js.map +1 -0
  191. package/dist/src/components/schedule/index.d.ts +3 -0
  192. package/dist/src/components/schedule/index.d.ts.map +1 -0
  193. package/dist/src/components/schedule/index.js +44 -0
  194. package/dist/src/components/schedule/index.js.map +1 -0
  195. package/dist/src/components/schedule/layout.d.ts +15 -0
  196. package/dist/src/components/schedule/layout.d.ts.map +1 -0
  197. package/dist/src/components/schedule/layout.js +10 -0
  198. package/dist/src/components/schedule/layout.js.map +1 -0
  199. package/dist/src/components/schedule/parts/gutter.d.ts +3 -0
  200. package/dist/src/components/schedule/parts/gutter.d.ts.map +1 -0
  201. package/dist/src/components/schedule/parts/gutter.js +9 -0
  202. package/dist/src/components/schedule/parts/gutter.js.map +1 -0
  203. package/dist/src/components/schedule/parts/incomplete.d.ts +6 -0
  204. package/dist/src/components/schedule/parts/incomplete.d.ts.map +1 -0
  205. package/dist/src/components/schedule/parts/incomplete.js +9 -0
  206. package/dist/src/components/schedule/parts/incomplete.js.map +1 -0
  207. package/dist/src/components/schedule/schedule.types.d.ts +109 -0
  208. package/dist/src/components/schedule/schedule.types.d.ts.map +1 -0
  209. package/dist/src/components/schedule/schedule.types.js +3 -0
  210. package/dist/src/components/schedule/schedule.types.js.map +1 -0
  211. package/dist/src/components/schedule/use-schedule-viewport.d.ts +7 -0
  212. package/dist/src/components/schedule/use-schedule-viewport.d.ts.map +1 -0
  213. package/dist/src/components/schedule/use-schedule-viewport.js +15 -0
  214. package/dist/src/components/schedule/use-schedule-viewport.js.map +1 -0
  215. package/dist/src/components/schedule/use-schedule.d.ts +3 -0
  216. package/dist/src/components/schedule/use-schedule.d.ts.map +1 -0
  217. package/dist/src/components/schedule/use-schedule.js +71 -0
  218. package/dist/src/components/schedule/use-schedule.js.map +1 -0
  219. package/dist/src/components/schedule/utils/days.d.ts +17 -0
  220. package/dist/src/components/schedule/utils/days.d.ts.map +1 -0
  221. package/dist/src/components/schedule/utils/days.js +49 -0
  222. package/dist/src/components/schedule/utils/days.js.map +1 -0
  223. package/dist/src/core/axis.d.ts +18 -0
  224. package/dist/src/core/axis.d.ts.map +1 -0
  225. package/dist/src/core/axis.js +58 -0
  226. package/dist/src/core/axis.js.map +1 -0
  227. package/dist/src/core/cache.d.ts +29 -0
  228. package/dist/src/core/cache.d.ts.map +1 -0
  229. package/dist/src/core/cache.js +33 -0
  230. package/dist/src/core/cache.js.map +1 -0
  231. package/dist/src/core/columns.d.ts +3 -0
  232. package/dist/src/core/columns.d.ts.map +1 -0
  233. package/dist/src/core/columns.js +45 -0
  234. package/dist/src/core/columns.js.map +1 -0
  235. package/dist/src/core/coverage.d.ts +3 -0
  236. package/dist/src/core/coverage.d.ts.map +1 -0
  237. package/dist/src/core/coverage.js +60 -0
  238. package/dist/src/core/coverage.js.map +1 -0
  239. package/dist/src/core/flag.d.ts +3 -0
  240. package/dist/src/core/flag.d.ts.map +1 -0
  241. package/dist/src/core/flag.js +17 -0
  242. package/dist/src/core/flag.js.map +1 -0
  243. package/dist/src/core/hash.d.ts +5 -0
  244. package/dist/src/core/hash.d.ts.map +1 -0
  245. package/dist/src/core/hash.js +29 -0
  246. package/dist/src/core/hash.js.map +1 -0
  247. package/dist/src/core/hit-test.d.ts +6 -0
  248. package/dist/src/core/hit-test.d.ts.map +1 -0
  249. package/dist/src/core/hit-test.js +23 -0
  250. package/dist/src/core/hit-test.js.map +1 -0
  251. package/dist/src/core/index.d.ts +12 -0
  252. package/dist/src/core/index.d.ts.map +1 -0
  253. package/dist/src/core/index.js +30 -0
  254. package/dist/src/core/index.js.map +1 -0
  255. package/dist/src/core/layout.d.ts +3 -0
  256. package/dist/src/core/layout.d.ts.map +1 -0
  257. package/dist/src/core/layout.js +96 -0
  258. package/dist/src/core/layout.js.map +1 -0
  259. package/dist/src/core/order.d.ts +7 -0
  260. package/dist/src/core/order.d.ts.map +1 -0
  261. package/dist/src/core/order.js +12 -0
  262. package/dist/src/core/order.js.map +1 -0
  263. package/dist/src/core/scale.d.ts +9 -0
  264. package/dist/src/core/scale.d.ts.map +1 -0
  265. package/dist/src/core/scale.js +41 -0
  266. package/dist/src/core/scale.js.map +1 -0
  267. package/dist/src/core/snap.d.ts +10 -0
  268. package/dist/src/core/snap.d.ts.map +1 -0
  269. package/dist/src/core/snap.js +43 -0
  270. package/dist/src/core/snap.js.map +1 -0
  271. package/dist/src/core/spans.d.ts +3 -0
  272. package/dist/src/core/spans.d.ts.map +1 -0
  273. package/dist/src/core/spans.js +60 -0
  274. package/dist/src/core/spans.js.map +1 -0
  275. package/dist/src/core/types.d.ts +104 -0
  276. package/dist/src/core/types.d.ts.map +1 -0
  277. package/dist/src/core/types.js +3 -0
  278. package/dist/src/core/types.js.map +1 -0
  279. package/dist/src/core/zone.d.ts +10 -0
  280. package/dist/src/core/zone.d.ts.map +1 -0
  281. package/dist/src/core/zone.js +103 -0
  282. package/dist/src/core/zone.js.map +1 -0
  283. package/dist/src/index.d.ts +29 -0
  284. package/dist/src/index.d.ts.map +1 -0
  285. package/dist/src/index.js +67 -0
  286. package/dist/src/index.js.map +1 -0
  287. package/dist/src/nativewind/index.d.ts +59 -0
  288. package/dist/src/nativewind/index.d.ts.map +1 -0
  289. package/dist/src/nativewind/index.js +24 -0
  290. package/dist/src/nativewind/index.js.map +1 -0
  291. package/docs/migrations.md +61 -0
  292. package/llms.txt +498 -0
  293. package/package.json +155 -8
  294. package/src/adapters/rrule/README.md +41 -0
  295. package/src/adapters/rrule/cache.ts +50 -0
  296. package/src/adapters/rrule/envelope.ts +7 -0
  297. package/src/adapters/rrule/expand.ts +105 -0
  298. package/src/adapters/rrule/hash.ts +13 -0
  299. package/src/adapters/rrule/index.ts +11 -0
  300. package/src/adapters/rrule/net.ts +30 -0
  301. package/src/adapters/rrule/occurrences.ts +288 -0
  302. package/src/adapters/rrule/types.ts +52 -0
  303. package/src/adapters/rrule/validate.ts +78 -0
  304. package/src/components/layers/README.md +15 -0
  305. package/src/components/layers/layers.types.ts +6 -0
  306. package/src/components/layers/parts/gap.tsx +5 -0
  307. package/src/components/layers/parts/interval.tsx +24 -0
  308. package/src/components/layers/utils/styles.ts +24 -0
  309. package/src/components/primitives/README.md +12 -0
  310. package/src/components/primitives/press-point.tsx +5 -0
  311. package/src/components/primitives/press-point.types.ts +5 -0
  312. package/src/components/primitives/press-point.web.tsx +19 -0
  313. package/src/components/primitives/region-style.ts +21 -0
  314. package/src/components/roster/README.md +29 -0
  315. package/src/components/roster/body-layout.tsx +32 -0
  316. package/src/components/roster/index.tsx +108 -0
  317. package/src/components/roster/lanes/interval-hover.tsx +5 -0
  318. package/src/components/roster/lanes/interval-hover.types.ts +11 -0
  319. package/src/components/roster/lanes/interval-hover.web.tsx +19 -0
  320. package/src/components/roster/lanes/lane.tsx +93 -0
  321. package/src/components/roster/lanes/parts/incomplete.tsx +44 -0
  322. package/src/components/roster/lanes/parts/lane-label.tsx +41 -0
  323. package/src/components/roster/layout.tsx +68 -0
  324. package/src/components/roster/parts/body.tsx +24 -0
  325. package/src/components/roster/parts/corner.tsx +3 -0
  326. package/src/components/roster/parts/empty.tsx +5 -0
  327. package/src/components/roster/parts/grid.tsx +26 -0
  328. package/src/components/roster/parts/header-cell.tsx +10 -0
  329. package/src/components/roster/parts/header.tsx +23 -0
  330. package/src/components/roster/parts/lane-label-column.tsx +31 -0
  331. package/src/components/roster/parts/lane-list.tsx +74 -0
  332. package/src/components/roster/roster.types.ts +156 -0
  333. package/src/components/roster/use-roster.ts +133 -0
  334. package/src/components/roster/utils/body-content-key.ts +46 -0
  335. package/src/components/roster/utils/ticks.ts +62 -0
  336. package/src/components/schedule/README.md +23 -0
  337. package/src/components/schedule/days/day.tsx +89 -0
  338. package/src/components/schedule/days/header-layout.tsx +12 -0
  339. package/src/components/schedule/days/layout.tsx +38 -0
  340. package/src/components/schedule/days/parts/column.tsx +59 -0
  341. package/src/components/schedule/days/parts/day-header.tsx +18 -0
  342. package/src/components/schedule/days/parts/grid.tsx +21 -0
  343. package/src/components/schedule/days/parts/now-line.tsx +11 -0
  344. package/src/components/schedule/days/parts/skipped-date.tsx +22 -0
  345. package/src/components/schedule/days/parts/transition.tsx +70 -0
  346. package/src/components/schedule/index.tsx +108 -0
  347. package/src/components/schedule/layout.tsx +42 -0
  348. package/src/components/schedule/parts/gutter.tsx +16 -0
  349. package/src/components/schedule/parts/incomplete.tsx +13 -0
  350. package/src/components/schedule/schedule.types.ts +103 -0
  351. package/src/components/schedule/use-schedule-viewport.ts +13 -0
  352. package/src/components/schedule/use-schedule.ts +75 -0
  353. package/src/components/schedule/utils/days.ts +54 -0
  354. package/src/core/README.md +25 -0
  355. package/src/core/axis.ts +58 -0
  356. package/src/core/cache.ts +38 -0
  357. package/src/core/columns.ts +49 -0
  358. package/src/core/coverage.ts +56 -0
  359. package/src/core/flag.ts +14 -0
  360. package/src/core/hash.ts +28 -0
  361. package/src/core/hit-test.ts +27 -0
  362. package/src/core/index.ts +34 -0
  363. package/src/core/layout.ts +101 -0
  364. package/src/core/order.ts +18 -0
  365. package/src/core/scale.ts +45 -0
  366. package/src/core/snap.ts +52 -0
  367. package/src/core/spans.ts +58 -0
  368. package/src/core/types.ts +92 -0
  369. package/src/core/zone.ts +100 -0
  370. package/src/index.ts +52 -0
  371. package/src/nativewind/README.md +14 -0
  372. package/src/nativewind/index.ts +30 -0
  373. package/index.js +0 -4
package/package.json CHANGED
@@ -1,19 +1,166 @@
1
1
  {
2
2
  "name": "react-native-roster",
3
- "version": "0.0.0",
4
- "description": "Layered intervals with provenance across lanes and a shared time axis for React Native. Placeholder release; the API is unreleased.",
5
- "license": "MIT",
3
+ "version": "0.1.0",
4
+ "description": "Layered intervals with provenance across lanes and a shared time axis for React Native.",
5
+ "keywords": [
6
+ "react-native",
7
+ "expo",
8
+ "roster",
9
+ "lanes",
10
+ "intervals",
11
+ "provenance",
12
+ "nativewind"
13
+ ],
6
14
  "author": "Jesse Harlin (the-simian) <info@simiancraft.com>",
15
+ "license": "MIT",
16
+ "homepage": "https://simiancraft.github.io/react-native-roster/",
7
17
  "repository": {
8
18
  "type": "git",
9
19
  "url": "git+https://github.com/simiancraft/react-native-roster.git"
10
20
  },
11
- "homepage": "https://simiancraft.github.io/react-native-roster/",
12
21
  "bugs": {
13
22
  "url": "https://github.com/simiancraft/react-native-roster/issues"
14
23
  },
15
- "keywords": ["react-native", "expo", "roster", "schedule", "timeline", "availability", "nativewind"],
16
- "main": "index.js",
17
- "files": ["index.js", "README.md", "LICENSE"],
18
- "publishConfig": { "access": "public" }
24
+ "type": "commonjs",
25
+ "sideEffects": [
26
+ "./src/nativewind/index.ts",
27
+ "./dist/src/nativewind/index.js"
28
+ ],
29
+ "main": "./src/index.ts",
30
+ "react-native": "./src/index.ts",
31
+ "types": "./dist/src/index.d.ts",
32
+ "browser": {
33
+ "./dist/src/components/primitives/press-point.js": "./dist/src/components/primitives/press-point.web.js",
34
+ "./dist/src/components/roster/lanes/interval-hover.js": "./dist/src/components/roster/lanes/interval-hover.web.js"
35
+ },
36
+ "exports": {
37
+ ".": {
38
+ "types": "./dist/src/index.d.ts",
39
+ "bun": "./src/index.ts",
40
+ "react-native": "./src/index.ts",
41
+ "default": "./dist/src/index.js"
42
+ },
43
+ "./core": {
44
+ "types": "./dist/src/core/index.d.ts",
45
+ "bun": "./src/core/index.ts",
46
+ "react-native": "./src/core/index.ts",
47
+ "default": "./dist/src/core/index.js"
48
+ },
49
+ "./rrule": {
50
+ "types": "./dist/src/adapters/rrule/index.d.ts",
51
+ "bun": "./src/adapters/rrule/index.ts",
52
+ "react-native": "./src/adapters/rrule/index.ts",
53
+ "default": "./dist/src/adapters/rrule/index.js"
54
+ },
55
+ "./nativewind": {
56
+ "types": "./dist/src/nativewind/index.d.ts",
57
+ "bun": "./src/nativewind/index.ts",
58
+ "react-native": "./src/nativewind/index.ts",
59
+ "default": "./dist/src/nativewind/index.js"
60
+ },
61
+ "./package.json": "./package.json"
62
+ },
63
+ "files": [
64
+ "src",
65
+ "dist",
66
+ "README.md",
67
+ "LICENSE",
68
+ "NOTICE.md",
69
+ "llms.txt",
70
+ "docs/migrations.md"
71
+ ],
72
+ "scripts": {
73
+ "clean": "rm -rf dist",
74
+ "build": "bun run clean && tsgo -p tsconfig.build.json",
75
+ "lint": "biome check",
76
+ "lint:fix": "biome check --write",
77
+ "format": "biome format --write .",
78
+ "typecheck": "tsgo --noEmit",
79
+ "typecheck:test": "tsgo --noEmit -p tsconfig.test.json",
80
+ "check:react-compiler": "eslint 'src/components/**/*.{ts,tsx}' 'demo/components/**/*.{ts,tsx}' 'demo/app/**/*.tsx' --no-error-on-unmatched-pattern",
81
+ "check:knip": "knip",
82
+ "check:package": "publint --strict",
83
+ "test": "bun test --coverage",
84
+ "check": "bun run lint && bun run typecheck && bun run typecheck:test && bun run typecheck:demo && bun run check:react-compiler && bun run build:web && bun run test && bun run check:knip && bun run check:package && bun run check:size && bun run check:web",
85
+ "prepare": "if command -v lefthook >/dev/null 2>&1; then lefthook install; fi",
86
+ "prepack": "bun run build",
87
+ "typecheck:demo": "tsgo --noEmit -p demo/tsconfig.json",
88
+ "build:web": "bun run build && cd demo && bunx expo export -p web",
89
+ "demo": "cd demo && bun run start",
90
+ "demo:ios": "cd demo && bun run ios",
91
+ "demo:android": "cd demo && bun run android",
92
+ "demo:web": "cd demo && bun run web",
93
+ "check:size": "size-limit",
94
+ "build:web:dev": "cd demo && bunx expo export -p web --dev --output-dir .cache/dev-dist",
95
+ "check:web": "bun run build:web:dev && bun scripts/check-web-performance.ts",
96
+ "bench:update": "bun scripts/update-performance-baseline.ts"
97
+ },
98
+ "peerDependencies": {
99
+ "@legendapp/list": ">=2.0.0",
100
+ "expo": ">=51.0.0",
101
+ "nativewind": ">=4.1.0",
102
+ "react": ">=18.2.0",
103
+ "react-native": ">=0.74.0",
104
+ "react-native-reanimated": ">=3.19.0"
105
+ },
106
+ "peerDependenciesMeta": {
107
+ "expo": {
108
+ "optional": true
109
+ },
110
+ "nativewind": {
111
+ "optional": true
112
+ },
113
+ "react-native-reanimated": {
114
+ "optional": true
115
+ }
116
+ },
117
+ "dependencies": {
118
+ "@js-temporal/polyfill": "0.5.1",
119
+ "rrule-temporal": "1.6.0"
120
+ },
121
+ "devDependencies": {
122
+ "@biomejs/biome": "2.5.12",
123
+ "@legendapp/list": "2.0.19",
124
+ "@semantic-release/changelog": "^7.0.0",
125
+ "@semantic-release/commit-analyzer": "13.0.1",
126
+ "@semantic-release/exec": "^7.1.0",
127
+ "@semantic-release/git": "^11.0.1",
128
+ "@semantic-release/github": "12.0.9",
129
+ "@semantic-release/npm": "13.1.5",
130
+ "@semantic-release/release-notes-generator": "14.1.1",
131
+ "@size-limit/preset-small-lib": "^13.0.3",
132
+ "@types/bun": "^1.3.12",
133
+ "@types/react": "~19.1.10",
134
+ "@types/react-test-renderer": "^19.1.0",
135
+ "@types/semver": "^7.7.0",
136
+ "@typescript-eslint/parser": "^8.60.1",
137
+ "@typescript/native-preview": "7.0.0-dev.20260707.2",
138
+ "eslint": "^10.4.1",
139
+ "eslint-plugin-react-compiler": "^19.1.0-rc.2",
140
+ "expo": "~54.0.37",
141
+ "knip": "^6.5.0",
142
+ "lefthook": "^2.1.9",
143
+ "nativewind": "4.1.x",
144
+ "playwright": "^1.63.0",
145
+ "publint": "^0.3.18",
146
+ "react": "19.1.0",
147
+ "react-native": "0.81.5",
148
+ "react-native-reanimated": "~3.19.5",
149
+ "react-test-renderer": "19.1.0",
150
+ "semantic-release": "^25.0.3",
151
+ "semver": "^7.7.0",
152
+ "size-limit": "^13.0.3",
153
+ "temporal-spec": "1.0.1"
154
+ },
155
+ "publishConfig": {
156
+ "access": "public",
157
+ "provenance": true
158
+ },
159
+ "engines": {
160
+ "node": ">=20"
161
+ },
162
+ "packageManager": "bun@1.4.2",
163
+ "workspaces": [
164
+ "demo"
165
+ ]
19
166
  }
@@ -0,0 +1,41 @@
1
+ # rrule adapter
2
+
3
+ The shipped adapter. It converts a `RuleSet` of RFC 5545 rules and dated
4
+ overrides into absolute intervals and gaps for one window, with exact
5
+ provenance per span.
6
+
7
+ - Public subpath: `react-native-roster/rrule`
8
+ - Exports: `expandRuleSet`, `envelopeFor`, `clearExpandCache`, `expandStats`,
9
+ `resetExpandStats`, and the `RosterRule`, `RosterDate`, `RuleSet`,
10
+ `ExpandOptions`, `ExpandResult`, and `ExpandStats` types
11
+ - Imports: `../../core` only; never components or another adapter
12
+ - Owns: `rrule-temporal` and the Temporal polyfill; root and core never load them
13
+
14
+ ## Supported input
15
+
16
+ `RosterRule` covers DAILY, WEEKLY, and MONTHLY with `interval`, `count`,
17
+ `until`, `wkst`, `byweekday`, `bymonth`, `bymonthday`, and `bysetpos`, plus
18
+ `hourstart`, `hourend`, and an IANA `timezone`. `RosterDate` is a single local
19
+ date, whole day or with hours. Both are `include` or `exclude`. YEARLY and
20
+ unbounded strings are rejected by validation.
21
+
22
+ ## File map
23
+
24
+ | File | Role |
25
+ | --- | --- |
26
+ | `index.ts` | the entry point; the only barrel |
27
+ | `types.ts` | input and result types |
28
+ | `validate.ts` | input rejection before any engine work |
29
+ | `envelope.ts` | widens a window to whole local days per rule zone |
30
+ | `occurrences.ts` | drives the engine and applies every calendar correction |
31
+ | `net.ts` | nets includes against excludes into intervals and gaps |
32
+ | `cache.ts`, `hash.ts` | retained occurrences and envelopes keyed by content |
33
+ | `expand.ts` | the orchestrator: validate, envelope, expand, cap, net, attach |
34
+
35
+ ## Reference
36
+
37
+ - [Recurrence semantics](../../../docs/recurrence.md): the rules `occurrences.ts` follows
38
+ - [Caches](../../../docs/caches.md): retention, keys, and counters
39
+ - [Adapters guide](../../../docs/adapters.md): the consumer view for any upstream shape
40
+ - [Adding an adapter](../../../docs/adding-an-adapter.md): the contributor recipe
41
+ - Tests: `test/adapters/rrule`
@@ -0,0 +1,50 @@
1
+ import type { Window } from '../../core';
2
+ import { envelopeFor } from './envelope';
3
+ import type { ExpandStats } from './types';
4
+
5
+ export type Occurrences = { spans: Window[]; capped: boolean };
6
+ export const occurrences = new Map<string, Occurrences>();
7
+ const envelopes = new Map<string, Window>();
8
+ const counts: ExpandStats = { rules: 0, dates: 0, expanded: 0, cacheHits: 0, cacheMisses: 0 };
9
+
10
+ // Map insertion order is the LRU: reads move entries to the newest end.
11
+ // Envelope retention selects bounds only; no netted result is retained.
12
+ export function touch<T>(cache: Map<string, T>, key: string, value: T): T {
13
+ cache.delete(key);
14
+ cache.set(key, value);
15
+ return value;
16
+ }
17
+
18
+ export function trim<T>(cache: Map<string, T>, limit: number): void {
19
+ while (cache.size > limit) cache.delete(cache.keys().next().value as string);
20
+ }
21
+
22
+ export function retainedEnvelope(window: Window, limit: number): Window {
23
+ trim(envelopes, limit);
24
+ for (const [id, envelope] of [...envelopes].reverse()) {
25
+ if (envelope.start <= window.start && envelope.end >= window.end) {
26
+ return touch(envelopes, id, envelope);
27
+ }
28
+ }
29
+ const envelope = envelopeFor(window);
30
+ touch(envelopes, JSON.stringify(envelope), envelope);
31
+ trim(envelopes, limit);
32
+ return envelope;
33
+ }
34
+
35
+ export function recordStats(stats: ExpandStats): void {
36
+ for (const key of Object.keys(counts) as Array<keyof ExpandStats>) counts[key] += stats[key];
37
+ }
38
+
39
+ export function expandStats(): ExpandStats {
40
+ return { ...counts };
41
+ }
42
+
43
+ export function resetExpandStats(): void {
44
+ for (const key of Object.keys(counts) as Array<keyof ExpandStats>) counts[key] = 0;
45
+ }
46
+
47
+ export function clearExpandCache(): void {
48
+ occurrences.clear();
49
+ envelopes.clear();
50
+ }
@@ -0,0 +1,7 @@
1
+ import type { Window } from '../../core';
2
+
3
+ // Absolute 48-hour padding exceeds the 26-hour difference between view zones.
4
+ // Includes, excludes, and dates share these bounds before subtraction.
5
+ export function envelopeFor(window: Window): Window {
6
+ return { start: window.start - 48 * 3_600_000, end: window.end + 48 * 3_600_000 };
7
+ }
@@ -0,0 +1,105 @@
1
+ import type { Interval, Source, Window } from '../../core';
2
+ import { occurrences, recordStats, retainedEnvelope, touch, trim } from './cache';
3
+ import { envelopeFor } from './envelope';
4
+ import { bodyKey } from './hash';
5
+ import { net } from './net';
6
+ import { enumerate, validateDates } from './occurrences';
7
+ import type {
8
+ ExpandOptions,
9
+ ExpandResult,
10
+ ExpandStats,
11
+ RosterDate,
12
+ RosterRule,
13
+ RuleSet,
14
+ } from './types';
15
+ import { nonnegativeInteger, validateInput, validateWindow } from './validate';
16
+
17
+ export function expandRuleSet(
18
+ set: RuleSet,
19
+ window: Window,
20
+ options: ExpandOptions = {},
21
+ ): ExpandResult {
22
+ validateWindow(window);
23
+ const maxEntries = nonnegativeInteger(options.cache?.maxEntries ?? 2000, 'cache.maxEntries');
24
+ const maxEnvelopes = nonnegativeInteger(options.cache?.maxEnvelopes ?? 4, 'cache.maxEnvelopes');
25
+ const cap = nonnegativeInteger(
26
+ options.caps?.perRuleOccurrences ?? 400,
27
+ 'caps.perRuleOccurrences',
28
+ );
29
+ let remaining = nonnegativeInteger(
30
+ options.caps?.totalOccurrences ?? 10000,
31
+ 'caps.totalOccurrences',
32
+ );
33
+ const rules = [...set.rules].sort(byId);
34
+ const dates = [...set.dates].sort(byId);
35
+ const ordered = [...rules, ...dates];
36
+ for (const input of ordered) {
37
+ validateInput(input);
38
+ validateDates(input);
39
+ }
40
+ const stats: ExpandStats = {
41
+ rules: set.rules.length,
42
+ dates: set.dates.length,
43
+ expanded: 0,
44
+ cacheHits: 0,
45
+ cacheMisses: 0,
46
+ };
47
+ if (window.start === window.end) {
48
+ recordStats(stats);
49
+ return {
50
+ intervals: [],
51
+ gaps: [],
52
+ envelope: envelopeFor(window),
53
+ complete: true,
54
+ truncated: [],
55
+ stats,
56
+ };
57
+ }
58
+ const envelope = retainedEnvelope(window, maxEnvelopes);
59
+ trim(occurrences, maxEntries);
60
+ const includes: Interval[] = [];
61
+ const excludes: Interval[] = [];
62
+ const truncated: ExpandResult['truncated'] = [];
63
+ let dropped = false;
64
+ for (const input of ordered) {
65
+ const key = JSON.stringify([bodyKey(input), envelope.start, envelope.end, cap]);
66
+ let list = occurrences.get(key);
67
+ if (list) {
68
+ touch(occurrences, key, list);
69
+ stats.cacheHits++;
70
+ } else {
71
+ list = enumerate(input, envelope, cap);
72
+ touch(occurrences, key, list);
73
+ trim(occurrences, maxEntries);
74
+ stats.expanded++;
75
+ stats.cacheMisses++;
76
+ }
77
+ // No partial admission: the first list that cannot fit ends the admitted
78
+ // prefix. Fetch all later lists anyway to report their exact retained counts.
79
+ dropped ||= list.spans.length > remaining;
80
+ if (dropped || list.capped) {
81
+ truncated.push({
82
+ id: input.id,
83
+ droppedAtLeast: list.capped ? 1 : list.spans.length,
84
+ });
85
+ }
86
+ if (dropped) continue;
87
+ remaining -= list.spans.length;
88
+ const source: Source = { kind: 'date' in input ? 'date' : 'rule', id: input.id };
89
+ if ('date' in input && input.note !== undefined) source.label = input.note;
90
+ const target = input.kind === 'include' ? includes : excludes;
91
+ for (const span of list.spans) target.push({ ...span, sources: [source] });
92
+ }
93
+ recordStats(stats);
94
+ return {
95
+ ...net(includes, excludes, window),
96
+ envelope: { ...envelope },
97
+ complete: truncated.length === 0,
98
+ truncated,
99
+ stats,
100
+ };
101
+ }
102
+
103
+ function byId(a: RosterRule | RosterDate, b: RosterRule | RosterDate): number {
104
+ return a.id < b.id ? -1 : a.id > b.id ? 1 : 0;
105
+ }
@@ -0,0 +1,13 @@
1
+ import { structuralKey } from '../../core/hash';
2
+ import type { RosterDate, RosterRule } from './types';
3
+
4
+ // Use the core's collision-free canonical encoding as the content hash.
5
+ // Identity and display notes are attached fresh, never cached in occurrence lists.
6
+ export function bodyKey(input: RosterRule | RosterDate): string {
7
+ const { id: _id, ...body } = input;
8
+ if ('date' in body) {
9
+ const { note: _note, ...date } = body;
10
+ return structuralKey(date);
11
+ }
12
+ return structuralKey(body);
13
+ }
@@ -0,0 +1,11 @@
1
+ export { clearExpandCache, expandStats, resetExpandStats } from './cache';
2
+ export { envelopeFor } from './envelope';
3
+ export { expandRuleSet } from './expand';
4
+ export type {
5
+ ExpandOptions,
6
+ ExpandResult,
7
+ ExpandStats,
8
+ RosterDate,
9
+ RosterRule,
10
+ RuleSet,
11
+ } from './types';
@@ -0,0 +1,30 @@
1
+ import type { Gap, Interval, Window } from '../../core';
2
+ import { sourceSpans } from '../../core/spans';
3
+
4
+ export function net(
5
+ includes: Interval[],
6
+ excludes: Interval[],
7
+ window: Window,
8
+ ): { intervals: Interval[]; gaps: Gap[] } {
9
+ const covered = sourceSpans(includes, window);
10
+ const removed = sourceSpans(excludes, window);
11
+ const intervals: Interval[] = [];
12
+ const gaps: Gap[] = [];
13
+ let first = 0;
14
+ for (const include of covered) {
15
+ let start = include.start;
16
+ while (first < removed.length && (removed[first] as Gap).end <= start) first++;
17
+ for (let i = first; i < removed.length; i++) {
18
+ const exclude = removed[i] as Gap;
19
+ if (exclude.start >= include.end) break;
20
+ if (start < exclude.start)
21
+ intervals.push({ start, end: exclude.start, sources: include.sources });
22
+ const end = Math.min(include.end, exclude.end);
23
+ gaps.push({ start: Math.max(start, exclude.start), end, sources: exclude.sources });
24
+ start = end;
25
+ }
26
+ if (start < include.end) intervals.push({ start, end: include.end, sources: include.sources });
27
+ }
28
+ // Include source changes cannot split an otherwise identical removed span.
29
+ return { intervals, gaps: sourceSpans(gaps, window) };
30
+ }