react-native-roster 0.0.0 → 0.0.1

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 (362) hide show
  1. package/NOTICE.md +29 -0
  2. package/README.md +378 -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/index.d.ts +3 -0
  72. package/dist/src/components/roster/index.d.ts.map +1 -0
  73. package/dist/src/components/roster/index.js +56 -0
  74. package/dist/src/components/roster/index.js.map +1 -0
  75. package/dist/src/components/roster/lanes/interval-hover.d.ts +3 -0
  76. package/dist/src/components/roster/lanes/interval-hover.d.ts.map +1 -0
  77. package/dist/src/components/roster/lanes/interval-hover.js +7 -0
  78. package/dist/src/components/roster/lanes/interval-hover.js.map +1 -0
  79. package/dist/src/components/roster/lanes/interval-hover.types.d.ts +15 -0
  80. package/dist/src/components/roster/lanes/interval-hover.types.d.ts.map +1 -0
  81. package/dist/src/components/roster/lanes/interval-hover.types.js +3 -0
  82. package/dist/src/components/roster/lanes/interval-hover.types.js.map +1 -0
  83. package/dist/src/components/roster/lanes/interval-hover.web.d.ts +3 -0
  84. package/dist/src/components/roster/lanes/interval-hover.web.d.ts.map +1 -0
  85. package/dist/src/components/roster/lanes/interval-hover.web.js +20 -0
  86. package/dist/src/components/roster/lanes/interval-hover.web.js.map +1 -0
  87. package/dist/src/components/roster/lanes/lane.d.ts +10 -0
  88. package/dist/src/components/roster/lanes/lane.d.ts.map +1 -0
  89. package/dist/src/components/roster/lanes/lane.js +37 -0
  90. package/dist/src/components/roster/lanes/lane.js.map +1 -0
  91. package/dist/src/components/roster/lanes/parts/incomplete.d.ts +8 -0
  92. package/dist/src/components/roster/lanes/parts/incomplete.d.ts.map +1 -0
  93. package/dist/src/components/roster/lanes/parts/incomplete.js +30 -0
  94. package/dist/src/components/roster/lanes/parts/incomplete.js.map +1 -0
  95. package/dist/src/components/roster/lanes/parts/lane-label.d.ts +3 -0
  96. package/dist/src/components/roster/lanes/parts/lane-label.d.ts.map +1 -0
  97. package/dist/src/components/roster/lanes/parts/lane-label.js +18 -0
  98. package/dist/src/components/roster/lanes/parts/lane-label.js.map +1 -0
  99. package/dist/src/components/roster/layout.d.ts +17 -0
  100. package/dist/src/components/roster/layout.d.ts.map +1 -0
  101. package/dist/src/components/roster/layout.js +24 -0
  102. package/dist/src/components/roster/layout.js.map +1 -0
  103. package/dist/src/components/roster/parts/body.d.ts +7 -0
  104. package/dist/src/components/roster/parts/body.d.ts.map +1 -0
  105. package/dist/src/components/roster/parts/body.js +29 -0
  106. package/dist/src/components/roster/parts/body.js.map +1 -0
  107. package/dist/src/components/roster/parts/corner.d.ts +2 -0
  108. package/dist/src/components/roster/parts/corner.d.ts.map +1 -0
  109. package/dist/src/components/roster/parts/corner.js +7 -0
  110. package/dist/src/components/roster/parts/corner.js.map +1 -0
  111. package/dist/src/components/roster/parts/empty.d.ts +2 -0
  112. package/dist/src/components/roster/parts/empty.d.ts.map +1 -0
  113. package/dist/src/components/roster/parts/empty.js +9 -0
  114. package/dist/src/components/roster/parts/empty.js.map +1 -0
  115. package/dist/src/components/roster/parts/grid.d.ts +3 -0
  116. package/dist/src/components/roster/parts/grid.d.ts.map +1 -0
  117. package/dist/src/components/roster/parts/grid.js +16 -0
  118. package/dist/src/components/roster/parts/grid.js.map +1 -0
  119. package/dist/src/components/roster/parts/header-cell.d.ts +5 -0
  120. package/dist/src/components/roster/parts/header-cell.d.ts.map +1 -0
  121. package/dist/src/components/roster/parts/header-cell.js +9 -0
  122. package/dist/src/components/roster/parts/header-cell.js.map +1 -0
  123. package/dist/src/components/roster/parts/header.d.ts +3 -0
  124. package/dist/src/components/roster/parts/header.d.ts.map +1 -0
  125. package/dist/src/components/roster/parts/header.js +13 -0
  126. package/dist/src/components/roster/parts/header.js.map +1 -0
  127. package/dist/src/components/roster/parts/lane-label-column.d.ts +3 -0
  128. package/dist/src/components/roster/parts/lane-label-column.d.ts.map +1 -0
  129. package/dist/src/components/roster/parts/lane-label-column.js +18 -0
  130. package/dist/src/components/roster/parts/lane-label-column.js.map +1 -0
  131. package/dist/src/components/roster/roster.types.d.ts +146 -0
  132. package/dist/src/components/roster/roster.types.d.ts.map +1 -0
  133. package/dist/src/components/roster/roster.types.js +3 -0
  134. package/dist/src/components/roster/roster.types.js.map +1 -0
  135. package/dist/src/components/roster/use-roster.d.ts +3 -0
  136. package/dist/src/components/roster/use-roster.d.ts.map +1 -0
  137. package/dist/src/components/roster/use-roster.js +106 -0
  138. package/dist/src/components/roster/use-roster.js.map +1 -0
  139. package/dist/src/components/roster/utils/body-content-key.d.ts +3 -0
  140. package/dist/src/components/roster/utils/body-content-key.d.ts.map +1 -0
  141. package/dist/src/components/roster/utils/body-content-key.js +29 -0
  142. package/dist/src/components/roster/utils/body-content-key.js.map +1 -0
  143. package/dist/src/components/roster/utils/ticks.d.ts +4 -0
  144. package/dist/src/components/roster/utils/ticks.d.ts.map +1 -0
  145. package/dist/src/components/roster/utils/ticks.js +60 -0
  146. package/dist/src/components/roster/utils/ticks.js.map +1 -0
  147. package/dist/src/components/schedule/days/day.d.ts +20 -0
  148. package/dist/src/components/schedule/days/day.d.ts.map +1 -0
  149. package/dist/src/components/schedule/days/day.js +26 -0
  150. package/dist/src/components/schedule/days/day.js.map +1 -0
  151. package/dist/src/components/schedule/days/header-layout.d.ts +9 -0
  152. package/dist/src/components/schedule/days/header-layout.d.ts.map +1 -0
  153. package/dist/src/components/schedule/days/header-layout.js +9 -0
  154. package/dist/src/components/schedule/days/header-layout.js.map +1 -0
  155. package/dist/src/components/schedule/days/layout.d.ts +18 -0
  156. package/dist/src/components/schedule/days/layout.d.ts.map +1 -0
  157. package/dist/src/components/schedule/days/layout.js +9 -0
  158. package/dist/src/components/schedule/days/layout.js.map +1 -0
  159. package/dist/src/components/schedule/days/parts/column.d.ts +3 -0
  160. package/dist/src/components/schedule/days/parts/column.d.ts.map +1 -0
  161. package/dist/src/components/schedule/days/parts/column.js +33 -0
  162. package/dist/src/components/schedule/days/parts/column.js.map +1 -0
  163. package/dist/src/components/schedule/days/parts/day-header.d.ts +5 -0
  164. package/dist/src/components/schedule/days/parts/day-header.d.ts.map +1 -0
  165. package/dist/src/components/schedule/days/parts/day-header.js +10 -0
  166. package/dist/src/components/schedule/days/parts/day-header.js.map +1 -0
  167. package/dist/src/components/schedule/days/parts/grid.d.ts +3 -0
  168. package/dist/src/components/schedule/days/parts/grid.d.ts.map +1 -0
  169. package/dist/src/components/schedule/days/parts/grid.js +14 -0
  170. package/dist/src/components/schedule/days/parts/grid.js.map +1 -0
  171. package/dist/src/components/schedule/days/parts/now-line.d.ts +5 -0
  172. package/dist/src/components/schedule/days/parts/now-line.d.ts.map +1 -0
  173. package/dist/src/components/schedule/days/parts/now-line.js +9 -0
  174. package/dist/src/components/schedule/days/parts/now-line.js.map +1 -0
  175. package/dist/src/components/schedule/days/parts/skipped-date.d.ts +4 -0
  176. package/dist/src/components/schedule/days/parts/skipped-date.d.ts.map +1 -0
  177. package/dist/src/components/schedule/days/parts/skipped-date.js +17 -0
  178. package/dist/src/components/schedule/days/parts/skipped-date.js.map +1 -0
  179. package/dist/src/components/schedule/days/parts/transition.d.ts +3 -0
  180. package/dist/src/components/schedule/days/parts/transition.d.ts.map +1 -0
  181. package/dist/src/components/schedule/days/parts/transition.js +42 -0
  182. package/dist/src/components/schedule/days/parts/transition.js.map +1 -0
  183. package/dist/src/components/schedule/index.d.ts +3 -0
  184. package/dist/src/components/schedule/index.d.ts.map +1 -0
  185. package/dist/src/components/schedule/index.js +45 -0
  186. package/dist/src/components/schedule/index.js.map +1 -0
  187. package/dist/src/components/schedule/layout.d.ts +15 -0
  188. package/dist/src/components/schedule/layout.d.ts.map +1 -0
  189. package/dist/src/components/schedule/layout.js +10 -0
  190. package/dist/src/components/schedule/layout.js.map +1 -0
  191. package/dist/src/components/schedule/parts/gutter.d.ts +3 -0
  192. package/dist/src/components/schedule/parts/gutter.d.ts.map +1 -0
  193. package/dist/src/components/schedule/parts/gutter.js +9 -0
  194. package/dist/src/components/schedule/parts/gutter.js.map +1 -0
  195. package/dist/src/components/schedule/parts/incomplete.d.ts +6 -0
  196. package/dist/src/components/schedule/parts/incomplete.d.ts.map +1 -0
  197. package/dist/src/components/schedule/parts/incomplete.js +9 -0
  198. package/dist/src/components/schedule/parts/incomplete.js.map +1 -0
  199. package/dist/src/components/schedule/schedule.types.d.ts +109 -0
  200. package/dist/src/components/schedule/schedule.types.d.ts.map +1 -0
  201. package/dist/src/components/schedule/schedule.types.js +3 -0
  202. package/dist/src/components/schedule/schedule.types.js.map +1 -0
  203. package/dist/src/components/schedule/use-schedule-viewport.d.ts +7 -0
  204. package/dist/src/components/schedule/use-schedule-viewport.d.ts.map +1 -0
  205. package/dist/src/components/schedule/use-schedule-viewport.js +15 -0
  206. package/dist/src/components/schedule/use-schedule-viewport.js.map +1 -0
  207. package/dist/src/components/schedule/use-schedule.d.ts +3 -0
  208. package/dist/src/components/schedule/use-schedule.d.ts.map +1 -0
  209. package/dist/src/components/schedule/use-schedule.js +71 -0
  210. package/dist/src/components/schedule/use-schedule.js.map +1 -0
  211. package/dist/src/components/schedule/utils/days.d.ts +17 -0
  212. package/dist/src/components/schedule/utils/days.d.ts.map +1 -0
  213. package/dist/src/components/schedule/utils/days.js +49 -0
  214. package/dist/src/components/schedule/utils/days.js.map +1 -0
  215. package/dist/src/core/axis.d.ts +18 -0
  216. package/dist/src/core/axis.d.ts.map +1 -0
  217. package/dist/src/core/axis.js +58 -0
  218. package/dist/src/core/axis.js.map +1 -0
  219. package/dist/src/core/cache.d.ts +29 -0
  220. package/dist/src/core/cache.d.ts.map +1 -0
  221. package/dist/src/core/cache.js +33 -0
  222. package/dist/src/core/cache.js.map +1 -0
  223. package/dist/src/core/columns.d.ts +3 -0
  224. package/dist/src/core/columns.d.ts.map +1 -0
  225. package/dist/src/core/columns.js +45 -0
  226. package/dist/src/core/columns.js.map +1 -0
  227. package/dist/src/core/coverage.d.ts +3 -0
  228. package/dist/src/core/coverage.d.ts.map +1 -0
  229. package/dist/src/core/coverage.js +60 -0
  230. package/dist/src/core/coverage.js.map +1 -0
  231. package/dist/src/core/flag.d.ts +3 -0
  232. package/dist/src/core/flag.d.ts.map +1 -0
  233. package/dist/src/core/flag.js +17 -0
  234. package/dist/src/core/flag.js.map +1 -0
  235. package/dist/src/core/hash.d.ts +5 -0
  236. package/dist/src/core/hash.d.ts.map +1 -0
  237. package/dist/src/core/hash.js +29 -0
  238. package/dist/src/core/hash.js.map +1 -0
  239. package/dist/src/core/hit-test.d.ts +6 -0
  240. package/dist/src/core/hit-test.d.ts.map +1 -0
  241. package/dist/src/core/hit-test.js +23 -0
  242. package/dist/src/core/hit-test.js.map +1 -0
  243. package/dist/src/core/index.d.ts +12 -0
  244. package/dist/src/core/index.d.ts.map +1 -0
  245. package/dist/src/core/index.js +30 -0
  246. package/dist/src/core/index.js.map +1 -0
  247. package/dist/src/core/layout.d.ts +3 -0
  248. package/dist/src/core/layout.d.ts.map +1 -0
  249. package/dist/src/core/layout.js +96 -0
  250. package/dist/src/core/layout.js.map +1 -0
  251. package/dist/src/core/order.d.ts +7 -0
  252. package/dist/src/core/order.d.ts.map +1 -0
  253. package/dist/src/core/order.js +12 -0
  254. package/dist/src/core/order.js.map +1 -0
  255. package/dist/src/core/scale.d.ts +9 -0
  256. package/dist/src/core/scale.d.ts.map +1 -0
  257. package/dist/src/core/scale.js +41 -0
  258. package/dist/src/core/scale.js.map +1 -0
  259. package/dist/src/core/snap.d.ts +10 -0
  260. package/dist/src/core/snap.d.ts.map +1 -0
  261. package/dist/src/core/snap.js +43 -0
  262. package/dist/src/core/snap.js.map +1 -0
  263. package/dist/src/core/spans.d.ts +3 -0
  264. package/dist/src/core/spans.d.ts.map +1 -0
  265. package/dist/src/core/spans.js +60 -0
  266. package/dist/src/core/spans.js.map +1 -0
  267. package/dist/src/core/types.d.ts +104 -0
  268. package/dist/src/core/types.d.ts.map +1 -0
  269. package/dist/src/core/types.js +3 -0
  270. package/dist/src/core/types.js.map +1 -0
  271. package/dist/src/core/zone.d.ts +10 -0
  272. package/dist/src/core/zone.d.ts.map +1 -0
  273. package/dist/src/core/zone.js +103 -0
  274. package/dist/src/core/zone.js.map +1 -0
  275. package/dist/src/index.d.ts +27 -0
  276. package/dist/src/index.d.ts.map +1 -0
  277. package/dist/src/index.js +63 -0
  278. package/dist/src/index.js.map +1 -0
  279. package/dist/src/nativewind/index.d.ts +61 -0
  280. package/dist/src/nativewind/index.d.ts.map +1 -0
  281. package/dist/src/nativewind/index.js +24 -0
  282. package/dist/src/nativewind/index.js.map +1 -0
  283. package/llms.txt +481 -0
  284. package/package.json +154 -8
  285. package/src/adapters/rrule/README.md +41 -0
  286. package/src/adapters/rrule/cache.ts +50 -0
  287. package/src/adapters/rrule/envelope.ts +7 -0
  288. package/src/adapters/rrule/expand.ts +105 -0
  289. package/src/adapters/rrule/hash.ts +13 -0
  290. package/src/adapters/rrule/index.ts +11 -0
  291. package/src/adapters/rrule/net.ts +30 -0
  292. package/src/adapters/rrule/occurrences.ts +288 -0
  293. package/src/adapters/rrule/types.ts +52 -0
  294. package/src/adapters/rrule/validate.ts +78 -0
  295. package/src/components/layers/README.md +11 -0
  296. package/src/components/layers/layers.types.ts +6 -0
  297. package/src/components/layers/parts/gap.tsx +5 -0
  298. package/src/components/layers/parts/interval.tsx +24 -0
  299. package/src/components/layers/utils/styles.ts +24 -0
  300. package/src/components/primitives/README.md +12 -0
  301. package/src/components/primitives/press-point.tsx +5 -0
  302. package/src/components/primitives/press-point.types.ts +5 -0
  303. package/src/components/primitives/press-point.web.tsx +19 -0
  304. package/src/components/primitives/region-style.ts +21 -0
  305. package/src/components/roster/README.md +18 -0
  306. package/src/components/roster/index.tsx +90 -0
  307. package/src/components/roster/lanes/interval-hover.tsx +5 -0
  308. package/src/components/roster/lanes/interval-hover.types.ts +11 -0
  309. package/src/components/roster/lanes/interval-hover.web.tsx +19 -0
  310. package/src/components/roster/lanes/lane.tsx +88 -0
  311. package/src/components/roster/lanes/parts/incomplete.tsx +44 -0
  312. package/src/components/roster/lanes/parts/lane-label.tsx +41 -0
  313. package/src/components/roster/layout.tsx +68 -0
  314. package/src/components/roster/parts/body.tsx +91 -0
  315. package/src/components/roster/parts/corner.tsx +3 -0
  316. package/src/components/roster/parts/empty.tsx +5 -0
  317. package/src/components/roster/parts/grid.tsx +26 -0
  318. package/src/components/roster/parts/header-cell.tsx +10 -0
  319. package/src/components/roster/parts/header.tsx +18 -0
  320. package/src/components/roster/parts/lane-label-column.tsx +31 -0
  321. package/src/components/roster/roster.types.ts +155 -0
  322. package/src/components/roster/use-roster.ts +133 -0
  323. package/src/components/roster/utils/body-content-key.ts +46 -0
  324. package/src/components/roster/utils/ticks.ts +62 -0
  325. package/src/components/schedule/README.md +18 -0
  326. package/src/components/schedule/days/day.tsx +76 -0
  327. package/src/components/schedule/days/header-layout.tsx +12 -0
  328. package/src/components/schedule/days/layout.tsx +38 -0
  329. package/src/components/schedule/days/parts/column.tsx +59 -0
  330. package/src/components/schedule/days/parts/day-header.tsx +18 -0
  331. package/src/components/schedule/days/parts/grid.tsx +21 -0
  332. package/src/components/schedule/days/parts/now-line.tsx +11 -0
  333. package/src/components/schedule/days/parts/skipped-date.tsx +22 -0
  334. package/src/components/schedule/days/parts/transition.tsx +70 -0
  335. package/src/components/schedule/index.tsx +109 -0
  336. package/src/components/schedule/layout.tsx +42 -0
  337. package/src/components/schedule/parts/gutter.tsx +16 -0
  338. package/src/components/schedule/parts/incomplete.tsx +13 -0
  339. package/src/components/schedule/schedule.types.ts +103 -0
  340. package/src/components/schedule/use-schedule-viewport.ts +13 -0
  341. package/src/components/schedule/use-schedule.ts +75 -0
  342. package/src/components/schedule/utils/days.ts +54 -0
  343. package/src/core/README.md +25 -0
  344. package/src/core/axis.ts +58 -0
  345. package/src/core/cache.ts +38 -0
  346. package/src/core/columns.ts +49 -0
  347. package/src/core/coverage.ts +56 -0
  348. package/src/core/flag.ts +14 -0
  349. package/src/core/hash.ts +28 -0
  350. package/src/core/hit-test.ts +27 -0
  351. package/src/core/index.ts +34 -0
  352. package/src/core/layout.ts +101 -0
  353. package/src/core/order.ts +18 -0
  354. package/src/core/scale.ts +45 -0
  355. package/src/core/snap.ts +52 -0
  356. package/src/core/spans.ts +58 -0
  357. package/src/core/types.ts +92 -0
  358. package/src/core/zone.ts +100 -0
  359. package/src/index.ts +49 -0
  360. package/src/nativewind/README.md +14 -0
  361. package/src/nativewind/index.ts +30 -0
  362. package/index.js +0 -4
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.timeAtY = exports.timeAtX = exports.snapToStep = exports.byLabel = exports.byCoverage = exports.layoutLane = exports.flagFor = exports.coverageFor = exports.dayColumnsFor = exports.resetStats = exports.layoutStats = exports.coverageStats = exports.clearLayoutCache = exports.clearCoverageCache = exports.windowFor = exports.today = exports.prev = exports.next = void 0;
4
+ var axis_1 = require("./axis");
5
+ Object.defineProperty(exports, "next", { enumerable: true, get: function () { return axis_1.next; } });
6
+ Object.defineProperty(exports, "prev", { enumerable: true, get: function () { return axis_1.prev; } });
7
+ Object.defineProperty(exports, "today", { enumerable: true, get: function () { return axis_1.today; } });
8
+ Object.defineProperty(exports, "windowFor", { enumerable: true, get: function () { return axis_1.windowFor; } });
9
+ var cache_1 = require("./cache");
10
+ Object.defineProperty(exports, "clearCoverageCache", { enumerable: true, get: function () { return cache_1.clearCoverageCache; } });
11
+ Object.defineProperty(exports, "clearLayoutCache", { enumerable: true, get: function () { return cache_1.clearLayoutCache; } });
12
+ Object.defineProperty(exports, "coverageStats", { enumerable: true, get: function () { return cache_1.coverageStats; } });
13
+ Object.defineProperty(exports, "layoutStats", { enumerable: true, get: function () { return cache_1.layoutStats; } });
14
+ Object.defineProperty(exports, "resetStats", { enumerable: true, get: function () { return cache_1.resetStats; } });
15
+ var columns_1 = require("./columns");
16
+ Object.defineProperty(exports, "dayColumnsFor", { enumerable: true, get: function () { return columns_1.dayColumnsFor; } });
17
+ var coverage_1 = require("./coverage");
18
+ Object.defineProperty(exports, "coverageFor", { enumerable: true, get: function () { return coverage_1.coverageFor; } });
19
+ var flag_1 = require("./flag");
20
+ Object.defineProperty(exports, "flagFor", { enumerable: true, get: function () { return flag_1.flagFor; } });
21
+ var layout_1 = require("./layout");
22
+ Object.defineProperty(exports, "layoutLane", { enumerable: true, get: function () { return layout_1.layoutLane; } });
23
+ var order_1 = require("./order");
24
+ Object.defineProperty(exports, "byCoverage", { enumerable: true, get: function () { return order_1.byCoverage; } });
25
+ Object.defineProperty(exports, "byLabel", { enumerable: true, get: function () { return order_1.byLabel; } });
26
+ var snap_1 = require("./snap");
27
+ Object.defineProperty(exports, "snapToStep", { enumerable: true, get: function () { return snap_1.snapToStep; } });
28
+ Object.defineProperty(exports, "timeAtX", { enumerable: true, get: function () { return snap_1.timeAtX; } });
29
+ Object.defineProperty(exports, "timeAtY", { enumerable: true, get: function () { return snap_1.timeAtY; } });
30
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/index.ts"],"names":[],"mappings":";;;AACA,+BAAsD;AAA7C,4FAAA,IAAI,OAAA;AAAE,4FAAA,IAAI,OAAA;AAAE,6FAAA,KAAK,OAAA;AAAE,iGAAA,SAAS,OAAA;AACrC,iCAMiB;AALf,2GAAA,kBAAkB,OAAA;AAClB,yGAAA,gBAAgB,OAAA;AAChB,sGAAA,aAAa,OAAA;AACb,oGAAA,WAAW,OAAA;AACX,mGAAA,UAAU,OAAA;AAEZ,qCAA0C;AAAjC,wGAAA,aAAa,OAAA;AACtB,uCAAyC;AAAhC,uGAAA,WAAW,OAAA;AACpB,+BAAiC;AAAxB,+FAAA,OAAO,OAAA;AAChB,mCAAsC;AAA7B,oGAAA,UAAU,OAAA;AAEnB,iCAA8C;AAArC,mGAAA,UAAU,OAAA;AAAE,gGAAA,OAAO,OAAA;AAC5B,+BAAsD;AAA7C,kGAAA,UAAU,OAAA;AAAE,+FAAA,OAAO,OAAA;AAAE,+FAAA,OAAO,OAAA"}
@@ -0,0 +1,3 @@
1
+ import type { Lane, LaneGeometry, Projection, Window } from './types';
2
+ export declare function layoutLane(lane: Lane, window: Window, projection: Projection): LaneGeometry;
3
+ //# sourceMappingURL=layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../src/core/layout.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAY,IAAI,EAAE,YAAY,EAAS,UAAU,EAAQ,MAAM,EAAE,MAAM,SAAS,CAAC;AAE7F,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,YAAY,CAwC3F"}
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.layoutLane = layoutLane;
4
+ const cache_1 = require("./cache");
5
+ const coverage_1 = require("./coverage");
6
+ const flag_1 = require("./flag");
7
+ const hash_1 = require("./hash");
8
+ const scale_1 = require("./scale");
9
+ const spans_1 = require("./spans");
10
+ function layoutLane(lane, window, projection) {
11
+ const key = `${(0, hash_1.laneKey)(lane, window)}|${(0, hash_1.projectionKey)(projection)}`;
12
+ let cached = cache_1.layoutCache.get(key);
13
+ const coverage = (0, coverage_1.coverageFor)(lane, window);
14
+ const flag = (0, flag_1.flagFor)(lane, window);
15
+ if (cached) {
16
+ cache_1.counts.layout.cacheHits++;
17
+ }
18
+ else {
19
+ cache_1.counts.layout.runs++;
20
+ const pieces = projection.orientation === 'columns'
21
+ ? projection.days.map((day) => (0, scale_1.scalePieces)(day, projection.viewTimezone))
22
+ : [];
23
+ const rects = [];
24
+ const gapRects = [];
25
+ for (const layer of lane.layers) {
26
+ project((0, spans_1.sourceSpans)(layer.intervals, window), layer, window, projection, pieces, rects);
27
+ project((0, spans_1.sourceSpans)(layer.gaps ?? [], window), layer, window, projection, pieces, gapRects);
28
+ }
29
+ cached = { rects, gapRects, assemblies: new WeakMap() };
30
+ cache_1.layoutCache.set(key, cached);
31
+ }
32
+ // Read the current flag and coverage above, then retain each complete assembly
33
+ // by reference, including when a consumer revisits an earlier explicit flag.
34
+ let assemblies = cached.assemblies.get(coverage);
35
+ if (!assemblies) {
36
+ assemblies = new Map();
37
+ cached.assemblies.set(coverage, assemblies);
38
+ }
39
+ const previous = assemblies.get(flag);
40
+ if (previous)
41
+ return previous;
42
+ const result = {
43
+ laneId: lane.id,
44
+ rects: cached.rects,
45
+ gapRects: cached.gapRects,
46
+ coverage,
47
+ flag,
48
+ };
49
+ assemblies.set(flag, result);
50
+ return result;
51
+ }
52
+ function project(spans, layer, window, projection, columns, rects) {
53
+ const inset = layer.style.inset ?? 0;
54
+ if (projection.orientation === 'horizontal') {
55
+ for (const span of spans) {
56
+ rects.push({
57
+ x: ((span.start - window.start) / 60_000) * projection.pxPerMinute,
58
+ y: inset,
59
+ width: ((span.end - span.start) / 60_000) * projection.pxPerMinute,
60
+ height: Math.max(0, projection.rowHeight - 2 * inset),
61
+ layerId: layer.id,
62
+ z: layer.z,
63
+ sources: span.sources,
64
+ });
65
+ }
66
+ return;
67
+ }
68
+ // Both lists are ordered in absolute time; advance once through the columns.
69
+ let firstSpan = 0;
70
+ for (const [column, pieces] of columns.entries()) {
71
+ for (const piece of pieces) {
72
+ while (firstSpan < spans.length && spans[firstSpan].end <= piece.start)
73
+ firstSpan++;
74
+ for (let i = firstSpan; i < spans.length; i++) {
75
+ const span = spans[i];
76
+ if (span.start >= piece.end)
77
+ break;
78
+ const start = Math.max(span.start, piece.start);
79
+ const end = Math.min(span.end, piece.end);
80
+ rects.push({
81
+ x: inset,
82
+ y: ((piece.minute + ((start - piece.start) / 60_000) * piece.scale) *
83
+ projection.pxPerHour) /
84
+ 60,
85
+ width: Math.max(0, projection.columnWidth - 2 * inset),
86
+ height: (((end - start) / 60_000) * piece.scale * projection.pxPerHour) / 60,
87
+ layerId: layer.id,
88
+ z: layer.z,
89
+ sources: span.sources,
90
+ column,
91
+ });
92
+ }
93
+ }
94
+ }
95
+ }
96
+ //# sourceMappingURL=layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../src/core/layout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { Coverage, Lane } from './types';
2
+ export type LaneComparator = (a: Lane, b: Lane, coverage: ReadonlyMap<string, Coverage>) => number;
3
+ export declare function byLabel(a: Lane, b: Lane): number;
4
+ export declare function byCoverage({ measure, }: {
5
+ measure: 'availability' | 'availabilityMinusBooking';
6
+ }): LaneComparator;
7
+ //# sourceMappingURL=order.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"order.d.ts","sourceRoot":"","sources":["../../../src/core/order.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE9C,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,MAAM,CAAC;AAEnG,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,MAAM,CAEhD;AAED,wBAAgB,UAAU,CAAC,EACzB,OAAO,GACR,EAAE;IACD,OAAO,EAAE,cAAc,GAAG,0BAA0B,CAAC;CACtD,GAAG,cAAc,CAKjB"}
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.byLabel = byLabel;
4
+ exports.byCoverage = byCoverage;
5
+ function byLabel(a, b) {
6
+ return a.label.localeCompare(b.label);
7
+ }
8
+ function byCoverage({ measure, }) {
9
+ const field = measure === 'availability' ? 'availabilityMinutes' : 'availabilityMinusBookingMinutes';
10
+ return (a, b, coverage) => (coverage.get(b.id)?.[field] ?? 0) - (coverage.get(a.id)?.[field] ?? 0) || byLabel(a, b);
11
+ }
12
+ //# sourceMappingURL=order.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"order.js","sourceRoot":"","sources":["../../../src/core/order.ts"],"names":[],"mappings":";;;;AAIA,iBAAwB,CAAO,EAAE,CAAO;IACtC,OAAO,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AACxC,CAAC;AAED,oBAA2B,EACzB,OAAO,GAGR;IACC,MAAM,KAAK,GACT,OAAO,KAAK,cAAc,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,iCAAiC,CAAC;IACzF,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,CACxB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7F,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { DayColumn } from './types';
2
+ export type ScalePiece = {
3
+ start: number;
4
+ end: number;
5
+ minute: number;
6
+ scale: number;
7
+ };
8
+ export declare function scalePieces(day: DayColumn, timezone: string): ScalePiece[];
9
+ //# sourceMappingURL=scale.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scale.d.ts","sourceRoot":"","sources":["../../../src/core/scale.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGzC,MAAM,MAAM,UAAU,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvF,wBAAgB,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE,CAoC1E"}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.scalePieces = scalePieces;
4
+ const zone_1 = require("./zone");
5
+ function scalePieces(day, timezone) {
6
+ const boundaries = new Set([day.start, day.end]);
7
+ const addBoundary = (time) => boundaries.add(Math.max(day.start, Math.min(day.end, time)));
8
+ for (const { at, deltaMinutes } of day.transitions) {
9
+ addBoundary(at);
10
+ if (deltaMinutes < 0) {
11
+ const delta = -deltaMinutes * 60_000;
12
+ addBoundary(at - delta);
13
+ addBoundary(at + delta);
14
+ }
15
+ }
16
+ const ordered = [...boundaries].sort((a, b) => a - b);
17
+ const pieces = [];
18
+ const midnight = (0, zone_1.dateEpoch)(day.localDate);
19
+ for (let i = 0; i < ordered.length - 1; i++) {
20
+ const start = ordered[i];
21
+ const end = ordered[i + 1];
22
+ let minute = ((0, zone_1.wallTime)(start, timezone) - midnight) / 60_000;
23
+ let scale = 1;
24
+ for (const { at, deltaMinutes } of day.transitions) {
25
+ const delta = -deltaMinutes * 60_000;
26
+ if (delta > 0 && start >= at - delta && start < at + delta) {
27
+ const repeatedStart = ((0, zone_1.wallTime)(at, timezone) - midnight) / 60_000;
28
+ // Clamp a repeat crossing midnight to the top edge. Compress its
29
+ // surviving absolute span into the remaining wall-clock region so
30
+ // layout and inversion agree where ordinary wall time resumes.
31
+ const clipped = Math.max(0, -repeatedStart);
32
+ const repeatStart = at - delta + clipped * 60_000;
33
+ scale = (deltaMinutes + clipped) / (2 * deltaMinutes + clipped);
34
+ minute = repeatedStart + clipped + ((start - repeatStart) / 60_000) * scale;
35
+ }
36
+ }
37
+ pieces.push({ start, end, minute, scale });
38
+ }
39
+ return pieces;
40
+ }
41
+ //# sourceMappingURL=scale.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scale.js","sourceRoot":"","sources":["../../../src/core/scale.ts"],"names":[],"mappings":";;;AAIA,iCAA6C;AAI7C,qBAA4B,GAAc,EAAE,QAAgB;IAC1D,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACjD,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,EAAE,CACnC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/D,KAAK,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;QACnD,WAAW,CAAC,EAAE,CAAC,CAAC;QAChB,IAAI,YAAY,GAAG,CAAC,EAAE,CAAC;YACrB,MAAM,KAAK,GAAG,CAAC,YAAY,GAAG,MAAM,CAAC;YACrC,WAAW,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC;YACxB,WAAW,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACtD,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,MAAM,QAAQ,GAAG,IAAA,gBAAS,EAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAW,CAAC;QACnC,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAW,CAAC;QACrC,IAAI,MAAM,GAAG,CAAC,IAAA,eAAQ,EAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,GAAG,MAAM,CAAC;QAC7D,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;YACnD,MAAM,KAAK,GAAG,CAAC,YAAY,GAAG,MAAM,CAAC;YACrC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,EAAE,GAAG,KAAK,IAAI,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,CAAC;gBAC3D,MAAM,aAAa,GAAG,CAAC,IAAA,eAAQ,EAAC,EAAE,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,GAAG,MAAM,CAAC;gBACnE,iEAAiE;gBACjE,kEAAkE;gBAClE,+DAA+D;gBAC/D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC;gBAC5C,MAAM,WAAW,GAAG,EAAE,GAAG,KAAK,GAAG,OAAO,GAAG,MAAM,CAAC;gBAClD,KAAK,GAAG,CAAC,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,YAAY,GAAG,OAAO,CAAC,CAAC;gBAChE,MAAM,GAAG,aAAa,GAAG,OAAO,GAAG,CAAC,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,MAAM,CAAC,GAAG,KAAK,CAAC;YAC9E,CAAC;QACH,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { Projection, Window } from './types';
2
+ export declare function snapToStep(time: number, minuteStep: number, timezone: string): number;
3
+ export declare function timeAtY(projection: Extract<Projection, {
4
+ orientation: 'columns';
5
+ }>, columnIndex: number, y: number): number | null;
6
+ /** Absolute time at true elapsed length; the window supplies the projection's origin. */
7
+ export declare function timeAtX(projection: Extract<Projection, {
8
+ orientation: 'horizontal';
9
+ }>, window: Window, x: number): number;
10
+ //# sourceMappingURL=snap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snap.d.ts","sourceRoot":"","sources":["../../../src/core/snap.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAGlD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAcrF;AAED,wBAAgB,OAAO,CACrB,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE;IAAE,WAAW,EAAE,SAAS,CAAA;CAAE,CAAC,EAC3D,WAAW,EAAE,MAAM,EACnB,CAAC,EAAE,MAAM,GACR,MAAM,GAAG,IAAI,CAiBf;AAED,yFAAyF;AACzF,wBAAgB,OAAO,CACrB,UAAU,EAAE,OAAO,CAAC,UAAU,EAAE;IAAE,WAAW,EAAE,YAAY,CAAA;CAAE,CAAC,EAC9D,MAAM,EAAE,MAAM,EACd,CAAC,EAAE,MAAM,GACR,MAAM,CAER"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.snapToStep = snapToStep;
4
+ exports.timeAtY = timeAtY;
5
+ exports.timeAtX = timeAtX;
6
+ const columns_1 = require("./columns");
7
+ const scale_1 = require("./scale");
8
+ const zone_1 = require("./zone");
9
+ function snapToStep(time, minuteStep, timezone) {
10
+ if (!Number.isInteger(minuteStep) || minuteStep <= 0 || 60 % minuteStep !== 0) {
11
+ throw new RangeError('minuteStep must be a positive divisor of 60');
12
+ }
13
+ const step = minuteStep * 60_000;
14
+ const wall = (0, zone_1.wallTime)(time, timezone);
15
+ let result = time - (wall - Math.floor(wall / step) * step);
16
+ const days = (0, columns_1.dayColumnsFor)({ start: time, end: time + 1 }, timezone);
17
+ for (const day of days) {
18
+ for (const { at } of day.transitions) {
19
+ if (at <= time)
20
+ result = Math.max(result, at);
21
+ }
22
+ }
23
+ return result;
24
+ }
25
+ function timeAtY(projection, columnIndex, y) {
26
+ const day = projection.days[columnIndex];
27
+ if (!day || y < 0 || y >= 24 * projection.pxPerHour)
28
+ return null;
29
+ const minute = (y * 60) / projection.pxPerHour;
30
+ for (const piece of (0, scale_1.scalePieces)(day, projection.viewTimezone)) {
31
+ if (minute >= piece.minute &&
32
+ minute < piece.minute + ((piece.end - piece.start) / 60_000) * piece.scale) {
33
+ // Epoch addition can round an interior pointer to the exclusive boundary.
34
+ return Math.min(piece.end - 1, piece.start + ((minute - piece.minute) * 60_000) / piece.scale);
35
+ }
36
+ }
37
+ return null;
38
+ }
39
+ /** Absolute time at true elapsed length; the window supplies the projection's origin. */
40
+ function timeAtX(projection, window, x) {
41
+ return window.start + (x * 60_000) / projection.pxPerMinute;
42
+ }
43
+ //# sourceMappingURL=snap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snap.js","sourceRoot":"","sources":["../../../src/core/snap.ts"],"names":[],"mappings":";;;;;AAAA,uCAA0C;AAC1C,mCAAsC;AAEtC,iCAAkC;AAElC,oBAA2B,IAAY,EAAE,UAAkB,EAAE,QAAgB;IAC3E,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,UAAU,IAAI,CAAC,IAAI,EAAE,GAAG,UAAU,KAAK,CAAC,EAAE,CAAC;QAC9E,MAAM,IAAI,UAAU,CAAC,6CAA6C,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,IAAI,GAAG,UAAU,GAAG,MAAM,CAAC;IACjC,MAAM,IAAI,GAAG,IAAA,eAAQ,EAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACtC,IAAI,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IAC5D,MAAM,IAAI,GAAG,IAAA,uBAAa,EAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,GAAG,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IACrE,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,KAAK,MAAM,EAAE,EAAE,EAAE,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;YACrC,IAAI,EAAE,IAAI,IAAI;gBAAE,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,iBACE,UAA2D,EAC3D,WAAmB,EACnB,CAAS;IAET,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,UAAU,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IACjE,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,UAAU,CAAC,SAAS,CAAC;IAC/C,KAAK,MAAM,KAAK,IAAI,IAAA,mBAAW,EAAC,GAAG,EAAE,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAC9D,IACE,MAAM,IAAI,KAAK,CAAC,MAAM;YACtB,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,EAC1E,CAAC;YACD,0EAA0E;YAC1E,OAAO,IAAI,CAAC,GAAG,CACb,KAAK,CAAC,GAAG,GAAG,CAAC,EACb,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAC/D,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,yFAAyF;AACzF,iBACE,UAA8D,EAC9D,MAAc,EACd,CAAS;IAET,OAAO,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,UAAU,CAAC,WAAW,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Interval, Window } from './types';
2
+ export declare function sourceSpans(intervals: Interval[], window: Window): Interval[];
3
+ //# sourceMappingURL=spans.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spans.d.ts","sourceRoot":"","sources":["../../../src/core/spans.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAU,MAAM,EAAE,MAAM,SAAS,CAAC;AAIxD,wBAAgB,WAAW,CAAC,SAAS,EAAE,QAAQ,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,EAAE,CAmD7E"}
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sourceSpans = sourceSpans;
4
+ function sourceSpans(intervals, window) {
5
+ const boundaries = [];
6
+ for (const interval of intervals) {
7
+ const start = Math.max(interval.start, window.start);
8
+ const end = Math.min(interval.end, window.end);
9
+ if (start >= end)
10
+ continue;
11
+ boundaries.push({ at: start, delta: 1, sources: interval.sources });
12
+ boundaries.push({ at: end, delta: -1, sources: interval.sources });
13
+ }
14
+ boundaries.sort((a, b) => a.at - b.at);
15
+ const active = new Map();
16
+ const spans = [];
17
+ let depth = 0;
18
+ let previous = window.start;
19
+ let lastKeys = new Set();
20
+ let sourceDifference = 0;
21
+ for (let i = 0; i < boundaries.length;) {
22
+ const at = boundaries[i].at;
23
+ if (depth > 0 && previous < at) {
24
+ const last = spans.at(-1);
25
+ if (last && last.end === previous && sourceDifference === 0) {
26
+ last.end = at;
27
+ }
28
+ else {
29
+ spans.push({
30
+ start: previous,
31
+ end: at,
32
+ sources: [...active.values()].map((item) => item.source),
33
+ });
34
+ lastKeys = new Set(active.keys());
35
+ sourceDifference = 0;
36
+ }
37
+ }
38
+ while (i < boundaries.length && boundaries[i].at === at) {
39
+ const boundary = boundaries[i++];
40
+ depth += boundary.delta;
41
+ for (const source of boundary.sources) {
42
+ const key = JSON.stringify([source.kind, source.id]);
43
+ const item = active.get(key);
44
+ const count = (item?.count ?? 0) + boundary.delta;
45
+ // Track set differences incrementally so redundant overlap boundaries
46
+ // do not copy or compare the full source set on an unchanged span.
47
+ if ((count === 0) !== (item === undefined)) {
48
+ sourceDifference += lastKeys.has(key) ? -boundary.delta : boundary.delta;
49
+ }
50
+ if (count === 0)
51
+ active.delete(key);
52
+ else
53
+ active.set(key, { count, source: item?.source ?? source });
54
+ }
55
+ }
56
+ previous = at;
57
+ }
58
+ return spans;
59
+ }
60
+ //# sourceMappingURL=spans.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spans.js","sourceRoot":"","sources":["../../../src/core/spans.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,104 @@
1
+ /** Identity is (kind, id). `label` is display metadata and never participates in equality, merging, or highlighting. */
2
+ export type Source = {
3
+ kind: string;
4
+ id: string;
5
+ label?: string;
6
+ };
7
+ /** Covered time. `sources` lists the contributors that cover this exact span (for the rrule adapter: the includes). */
8
+ export type Interval = {
9
+ start: number;
10
+ end: number;
11
+ sources: Source[];
12
+ };
13
+ /** Removed time. `sources` lists what removed it (for the rrule adapter: the excludes). Survives complete subtraction. */
14
+ export type Gap = {
15
+ start: number;
16
+ end: number;
17
+ sources: Source[];
18
+ };
19
+ export type LayerRole = 'availability' | 'booking' | 'custom';
20
+ /** `inset` is a cross-axis distance in px (vertical in the horizontal projection, horizontal in columns), applied by the engine. */
21
+ export type LayerStyle = {
22
+ color: string;
23
+ highlightColor?: string;
24
+ inset?: number;
25
+ opacity?: number;
26
+ };
27
+ export type Layer = {
28
+ id: string;
29
+ role: LayerRole;
30
+ z: number;
31
+ style: LayerStyle;
32
+ intervals: Interval[];
33
+ gaps?: Gap[];
34
+ label?: string;
35
+ };
36
+ export type LaneFlag = 'none' | 'never-set' | 'empty-in-window';
37
+ export type Lane = {
38
+ id: string;
39
+ /** Bumped by the consumer when layer content changes; the engine hashes layer content when absent. */
40
+ version?: string | number;
41
+ label: string;
42
+ timezone?: string;
43
+ flag?: LaneFlag;
44
+ /** False when the lane's intervals are known to be incomplete (an adapter cap bit, #4). Default true. The hooks (#5, #11) show the incomplete label (#8) when false; the engine never infers it. */
45
+ complete?: boolean;
46
+ layers: Layer[];
47
+ meta?: unknown;
48
+ };
49
+ /** A span of absolute time. No span kind, no resolution; those are axis and component concerns (#6). */
50
+ export type Window = {
51
+ start: number;
52
+ end: number;
53
+ };
54
+ /** RFC 5545 weekday numbering: 0 = Monday through 6 = Sunday. Used by `wkst`, `byweekday`, and `windowFor`. */
55
+ export type Weekday = 0 | 1 | 2 | 3 | 4 | 5 | 6;
56
+ /** A UTC-offset change inside a column, from `dayColumnsFor` (#6). Any size, any count. */
57
+ export type Transition = {
58
+ at: number;
59
+ deltaMinutes: number;
60
+ };
61
+ /** One day column in the view zone. Always projected as 24 equal wall-clock hour bands. `localDate` is the column's calendar date in the view zone ('YYYY-MM-DD'); a local date with no instants (`Pacific/Apia`, 2011-12-30) produces no column at all (#6). */
62
+ export type DayColumn = {
63
+ start: number;
64
+ end: number;
65
+ localDate: string;
66
+ label: string;
67
+ transitions: Transition[];
68
+ };
69
+ export type Projection = {
70
+ orientation: 'horizontal';
71
+ viewTimezone: string;
72
+ pxPerMinute: number;
73
+ rowHeight: number;
74
+ } | {
75
+ orientation: 'columns';
76
+ viewTimezone: string;
77
+ pxPerHour: number;
78
+ columnWidth: number;
79
+ days: DayColumn[];
80
+ };
81
+ /** Final visible bounds, inset already applied; also the hit-test bounds (#8). */
82
+ export type Rect = {
83
+ x: number;
84
+ y: number;
85
+ width: number;
86
+ height: number;
87
+ layerId: string;
88
+ z: number;
89
+ sources: Source[];
90
+ column?: number;
91
+ };
92
+ export type Coverage = {
93
+ availabilityMinutes: number;
94
+ bookingMinutes: number;
95
+ availabilityMinusBookingMinutes: number;
96
+ };
97
+ export type LaneGeometry = {
98
+ laneId: string;
99
+ rects: Rect[];
100
+ gapRects: Rect[];
101
+ coverage: Coverage;
102
+ flag: LaneFlag;
103
+ };
104
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/core/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ import type { Transition } from './types';
2
+ export declare const dayMilliseconds = 86400000;
3
+ export declare function wallTime(time: number, timezone: string): number;
4
+ export declare function offsetAt(time: number, timezone: string): number;
5
+ export declare function localDateAt(time: number, timezone: string): string;
6
+ export declare function dateString(time: number): string;
7
+ export declare function dateEpoch(localDate: string): number;
8
+ export declare function transitionsBetween(start: number, end: number, timezone: string): Transition[];
9
+ export declare function startOfDate(localDate: string, timezone: string): number;
10
+ //# sourceMappingURL=zone.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zone.d.ts","sourceRoot":"","sources":["../../../src/core/zone.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAK1C,eAAO,MAAM,eAAe,WAAa,CAAC;AAE1C,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAuB/D;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE/D;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAElE;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAUnD;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE,CAqB7F;AAED,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiBvE"}
@@ -0,0 +1,103 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dayMilliseconds = void 0;
4
+ exports.wallTime = wallTime;
5
+ exports.offsetAt = offsetAt;
6
+ exports.localDateAt = localDateAt;
7
+ exports.dateString = dateString;
8
+ exports.dateEpoch = dateEpoch;
9
+ exports.transitionsBetween = transitionsBetween;
10
+ exports.startOfDate = startOfDate;
11
+ const formatters = new Map();
12
+ const starts = new Map();
13
+ const minute = 60_000;
14
+ exports.dayMilliseconds = 86_400_000;
15
+ function wallTime(time, timezone) {
16
+ let formatter = formatters.get(timezone);
17
+ if (!formatter) {
18
+ formatter = new Intl.DateTimeFormat('en-US-u-ca-gregory-nu-latn', {
19
+ timeZone: timezone,
20
+ era: 'short',
21
+ year: 'numeric',
22
+ month: '2-digit',
23
+ day: '2-digit',
24
+ hour: '2-digit',
25
+ minute: '2-digit',
26
+ second: '2-digit',
27
+ hourCycle: 'h23',
28
+ });
29
+ formatters.set(timezone, formatter);
30
+ }
31
+ const parts = {};
32
+ for (const part of formatter.formatToParts(time))
33
+ parts[part.type] = part.value;
34
+ const date = new Date(0);
35
+ const year = parts.era === 'BC' ? 1 - Number(parts.year) : Number(parts.year);
36
+ date.setUTCFullYear(year, Number(parts.month) - 1, Number(parts.day));
37
+ date.setUTCHours(Number(parts.hour) % 24, Number(parts.minute), Number(parts.second), 0);
38
+ return date.getTime() + (((time % 1000) + 1000) % 1000);
39
+ }
40
+ function offsetAt(time, timezone) {
41
+ return wallTime(time, timezone) - time;
42
+ }
43
+ function localDateAt(time, timezone) {
44
+ return dateString(wallTime(time, timezone));
45
+ }
46
+ function dateString(time) {
47
+ return new Date(time).toISOString().slice(0, 10);
48
+ }
49
+ function dateEpoch(localDate) {
50
+ const time = Date.parse(`${localDate}T00:00:00.000Z`);
51
+ if (!/^\d{4}-\d{2}-\d{2}$/.test(localDate) ||
52
+ !Number.isFinite(time) ||
53
+ dateString(time) !== localDate) {
54
+ throw new RangeError('Expected a valid YYYY-MM-DD local date');
55
+ }
56
+ return time;
57
+ }
58
+ function transitionsBetween(start, end, timezone) {
59
+ const transitions = [];
60
+ let cursor = start;
61
+ let offset = offsetAt(cursor, timezone);
62
+ while (cursor < end) {
63
+ const probe = Math.min(cursor + 60 * minute, end);
64
+ const nextOffset = offsetAt(probe, timezone);
65
+ if (nextOffset !== offset) {
66
+ let low = cursor;
67
+ let high = probe;
68
+ while (high - low > 1) {
69
+ const middle = Math.floor((low + high) / 2);
70
+ if (offsetAt(middle, timezone) === offset)
71
+ low = middle;
72
+ else
73
+ high = middle;
74
+ }
75
+ if (high < end)
76
+ transitions.push({ at: high, deltaMinutes: (nextOffset - offset) / minute });
77
+ }
78
+ cursor = probe;
79
+ offset = nextOffset;
80
+ }
81
+ return transitions;
82
+ }
83
+ function startOfDate(localDate, timezone) {
84
+ const key = JSON.stringify([localDate, timezone]);
85
+ const cached = starts.get(key);
86
+ if (cached !== undefined)
87
+ return cached;
88
+ const target = dateEpoch(localDate);
89
+ const start = target - 2 * exports.dayMilliseconds;
90
+ const end = target + 2 * exports.dayMilliseconds;
91
+ const boundaries = [start, ...transitionsBetween(start, end, timezone).map(({ at }) => at), end];
92
+ let result = Infinity;
93
+ for (let i = 0; i < boundaries.length - 1; i++) {
94
+ const left = boundaries[i];
95
+ const right = boundaries[i + 1];
96
+ const candidate = Math.max(left, target - offsetAt(left, timezone));
97
+ if (candidate < right)
98
+ result = Math.min(result, candidate);
99
+ }
100
+ starts.set(key, result);
101
+ return result;
102
+ }
103
+ //# sourceMappingURL=zone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zone.js","sourceRoot":"","sources":["../../../src/core/zone.ts"],"names":[],"mappings":"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"}