@spatika/react 1.0.0 → 1.2.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 (369) hide show
  1. package/AGENTS.md +71 -0
  2. package/README.md +4 -3
  3. package/dist/composites/AccentRule.d.ts +6 -0
  4. package/dist/composites/AccentRule.d.ts.map +1 -0
  5. package/dist/composites/AccentRule.js +6 -0
  6. package/dist/composites/AvailabilityBadge.d.ts +9 -0
  7. package/dist/composites/AvailabilityBadge.d.ts.map +1 -0
  8. package/dist/composites/AvailabilityBadge.js +9 -0
  9. package/dist/composites/Card.d.ts +7 -1
  10. package/dist/composites/Card.d.ts.map +1 -1
  11. package/dist/composites/Card.js +10 -0
  12. package/dist/composites/CareerCard.d.ts +20 -0
  13. package/dist/composites/CareerCard.d.ts.map +1 -0
  14. package/dist/composites/CareerCard.js +17 -0
  15. package/dist/composites/ChartDataGrid.d.ts +33 -0
  16. package/dist/composites/ChartDataGrid.d.ts.map +1 -0
  17. package/dist/composites/ChartDataGrid.js +77 -0
  18. package/dist/composites/ContactLink.d.ts +15 -0
  19. package/dist/composites/ContactLink.d.ts.map +1 -0
  20. package/dist/composites/ContactLink.js +8 -0
  21. package/dist/composites/CoverHero.d.ts +1 -1
  22. package/dist/composites/CoverHero.d.ts.map +1 -1
  23. package/dist/composites/CoverHero.js +2 -2
  24. package/dist/composites/DisplayHeading.d.ts +9 -0
  25. package/dist/composites/DisplayHeading.d.ts.map +1 -0
  26. package/dist/composites/DisplayHeading.js +6 -0
  27. package/dist/composites/EntityMediaCard.d.ts +1 -1
  28. package/dist/composites/EntityMediaCard.d.ts.map +1 -1
  29. package/dist/composites/EntityMediaCard.js +12 -4
  30. package/dist/composites/EventCalendar.d.ts +35 -0
  31. package/dist/composites/EventCalendar.d.ts.map +1 -0
  32. package/dist/composites/EventCalendar.js +339 -0
  33. package/dist/composites/EventEditor.d.ts +22 -0
  34. package/dist/composites/EventEditor.d.ts.map +1 -0
  35. package/dist/composites/EventEditor.js +86 -0
  36. package/dist/composites/EventTimeline.d.ts +24 -0
  37. package/dist/composites/EventTimeline.d.ts.map +1 -0
  38. package/dist/composites/EventTimeline.js +184 -0
  39. package/dist/composites/FloatChip.d.ts +15 -0
  40. package/dist/composites/FloatChip.d.ts.map +1 -0
  41. package/dist/composites/FloatChip.js +7 -0
  42. package/dist/composites/GradientText.d.ts +11 -0
  43. package/dist/composites/GradientText.d.ts.map +1 -0
  44. package/dist/composites/GradientText.js +6 -0
  45. package/dist/composites/IconTile.d.ts +10 -0
  46. package/dist/composites/IconTile.d.ts.map +1 -0
  47. package/dist/composites/IconTile.js +7 -0
  48. package/dist/composites/MapChart.d.ts +24 -0
  49. package/dist/composites/MapChart.d.ts.map +1 -0
  50. package/dist/composites/MapChart.js +58 -0
  51. package/dist/composites/MetaChip.d.ts +9 -0
  52. package/dist/composites/MetaChip.d.ts.map +1 -0
  53. package/dist/composites/MetaChip.js +6 -0
  54. package/dist/composites/PresenceDot.d.ts +10 -0
  55. package/dist/composites/PresenceDot.d.ts.map +1 -0
  56. package/dist/composites/PresenceDot.js +10 -0
  57. package/dist/composites/ProfileHero.d.ts +6 -4
  58. package/dist/composites/ProfileHero.d.ts.map +1 -1
  59. package/dist/composites/ProfileHero.js +8 -8
  60. package/dist/composites/ProjectCard.d.ts +12 -0
  61. package/dist/composites/ProjectCard.d.ts.map +1 -0
  62. package/dist/composites/ProjectCard.js +9 -0
  63. package/dist/composites/ScatterWebGL.d.ts +22 -0
  64. package/dist/composites/ScatterWebGL.d.ts.map +1 -0
  65. package/dist/composites/ScatterWebGL.js +45 -0
  66. package/dist/composites/SectionHeading.d.ts +16 -0
  67. package/dist/composites/SectionHeading.d.ts.map +1 -0
  68. package/dist/composites/SectionHeading.js +12 -0
  69. package/dist/composites/SiteFooter.d.ts +18 -0
  70. package/dist/composites/SiteFooter.d.ts.map +1 -0
  71. package/dist/composites/SiteFooter.js +15 -0
  72. package/dist/composites/SiteNav.d.ts +25 -0
  73. package/dist/composites/SiteNav.d.ts.map +1 -0
  74. package/dist/composites/SiteNav.js +44 -0
  75. package/dist/composites/StatCard.d.ts +7 -1
  76. package/dist/composites/StatCard.d.ts.map +1 -1
  77. package/dist/composites/StatCard.js +5 -2
  78. package/dist/composites/StatusDot.d.ts +1 -1
  79. package/dist/composites/Tag.d.ts +11 -0
  80. package/dist/composites/Tag.d.ts.map +1 -0
  81. package/dist/composites/Tag.js +33 -0
  82. package/dist/composites/Wordmark.d.ts +19 -0
  83. package/dist/composites/Wordmark.d.ts.map +1 -0
  84. package/dist/composites/Wordmark.js +15 -0
  85. package/dist/composites/cartesian-charts.d.ts +138 -0
  86. package/dist/composites/cartesian-charts.d.ts.map +1 -0
  87. package/dist/composites/cartesian-charts.js +401 -0
  88. package/dist/composites/chart-composition.d.ts +139 -0
  89. package/dist/composites/chart-composition.d.ts.map +1 -0
  90. package/dist/composites/chart-composition.js +486 -0
  91. package/dist/composites/chart-ui.d.ts +83 -0
  92. package/dist/composites/chart-ui.d.ts.map +1 -0
  93. package/dist/composites/chart-ui.js +108 -0
  94. package/dist/composites/charts-3d.d.ts +37 -0
  95. package/dist/composites/charts-3d.d.ts.map +1 -0
  96. package/dist/composites/charts-3d.js +121 -0
  97. package/dist/composites/flow-charts.d.ts +89 -0
  98. package/dist/composites/flow-charts.d.ts.map +1 -0
  99. package/dist/composites/flow-charts.js +186 -0
  100. package/dist/composites/radial-charts.d.ts +109 -0
  101. package/dist/composites/radial-charts.d.ts.map +1 -0
  102. package/dist/composites/radial-charts.js +176 -0
  103. package/dist/composites/scheduler-ui.d.ts +43 -0
  104. package/dist/composites/scheduler-ui.d.ts.map +1 -0
  105. package/dist/composites/scheduler-ui.js +71 -0
  106. package/dist/index.d.ts +83 -7
  107. package/dist/index.d.ts.map +1 -1
  108. package/dist/index.js +74 -7
  109. package/dist/lib/chart-export.d.ts +10 -0
  110. package/dist/lib/chart-export.d.ts.map +1 -0
  111. package/dist/lib/chart-export.js +102 -0
  112. package/dist/lib/charts.d.ts +235 -0
  113. package/dist/lib/charts.d.ts.map +1 -0
  114. package/dist/lib/charts.js +744 -0
  115. package/dist/lib/geo.d.ts +39 -0
  116. package/dist/lib/geo.d.ts.map +1 -0
  117. package/dist/lib/geo.js +101 -0
  118. package/dist/lib/iso.d.ts +21 -0
  119. package/dist/lib/iso.d.ts.map +1 -0
  120. package/dist/lib/iso.js +56 -0
  121. package/dist/lib/rrule.d.ts +20 -0
  122. package/dist/lib/rrule.d.ts.map +1 -0
  123. package/dist/lib/rrule.js +236 -0
  124. package/dist/lib/scheduler.d.ts +152 -0
  125. package/dist/lib/scheduler.d.ts.map +1 -0
  126. package/dist/lib/scheduler.js +501 -0
  127. package/dist/lib/webgl-scatter.d.ts +44 -0
  128. package/dist/lib/webgl-scatter.d.ts.map +1 -0
  129. package/dist/lib/webgl-scatter.js +185 -0
  130. package/dist/primitives/Accordion.d.ts +44 -20
  131. package/dist/primitives/Accordion.d.ts.map +1 -1
  132. package/dist/primitives/Accordion.js +82 -22
  133. package/dist/primitives/AppBar.d.ts +13 -0
  134. package/dist/primitives/AppBar.d.ts.map +1 -0
  135. package/dist/primitives/AppBar.js +27 -0
  136. package/dist/primitives/Autocomplete.d.ts +28 -0
  137. package/dist/primitives/Autocomplete.d.ts.map +1 -0
  138. package/dist/primitives/Autocomplete.js +118 -0
  139. package/dist/primitives/Avatar.d.ts +13 -1
  140. package/dist/primitives/Avatar.d.ts.map +1 -1
  141. package/dist/primitives/Avatar.js +17 -2
  142. package/dist/primitives/Backdrop.d.ts +17 -0
  143. package/dist/primitives/Backdrop.d.ts.map +1 -0
  144. package/dist/primitives/Backdrop.js +17 -0
  145. package/dist/primitives/BottomNavigation.d.ts +23 -0
  146. package/dist/primitives/BottomNavigation.d.ts.map +1 -0
  147. package/dist/primitives/BottomNavigation.js +30 -0
  148. package/dist/primitives/Button.d.ts +4 -4
  149. package/dist/primitives/Button.d.ts.map +1 -1
  150. package/dist/primitives/Button.js +2 -0
  151. package/dist/primitives/ButtonBase.d.ts +14 -0
  152. package/dist/primitives/ButtonBase.d.ts.map +1 -0
  153. package/dist/primitives/ButtonBase.js +13 -0
  154. package/dist/primitives/ButtonGroup.d.ts +25 -0
  155. package/dist/primitives/ButtonGroup.d.ts.map +1 -0
  156. package/dist/primitives/ButtonGroup.js +44 -0
  157. package/dist/primitives/CircularProgress.d.ts +16 -0
  158. package/dist/primitives/CircularProgress.d.ts.map +1 -0
  159. package/dist/primitives/CircularProgress.js +17 -0
  160. package/dist/primitives/ClickAwayListener.d.ts +16 -0
  161. package/dist/primitives/ClickAwayListener.d.ts.map +1 -0
  162. package/dist/primitives/ClickAwayListener.js +33 -0
  163. package/dist/primitives/Collapse.d.ts +19 -0
  164. package/dist/primitives/Collapse.d.ts.map +1 -0
  165. package/dist/primitives/Collapse.js +14 -0
  166. package/dist/primitives/Container.d.ts +13 -0
  167. package/dist/primitives/Container.d.ts.map +1 -0
  168. package/dist/primitives/Container.js +26 -0
  169. package/dist/primitives/Fab.d.ts +22 -0
  170. package/dist/primitives/Fab.d.ts.map +1 -0
  171. package/dist/primitives/Fab.js +42 -0
  172. package/dist/primitives/FormControl.d.ts +27 -0
  173. package/dist/primitives/FormControl.d.ts.map +1 -0
  174. package/dist/primitives/FormControl.js +24 -0
  175. package/dist/primitives/FormControlLabel.d.ts +18 -0
  176. package/dist/primitives/FormControlLabel.d.ts.map +1 -0
  177. package/dist/primitives/FormControlLabel.js +19 -0
  178. package/dist/primitives/Grid.d.ts +32 -0
  179. package/dist/primitives/Grid.d.ts.map +1 -0
  180. package/dist/primitives/Grid.js +50 -0
  181. package/dist/primitives/IconButton.d.ts +22 -0
  182. package/dist/primitives/IconButton.d.ts.map +1 -0
  183. package/dist/primitives/IconButton.js +39 -0
  184. package/dist/primitives/ImageList.d.ts +31 -0
  185. package/dist/primitives/ImageList.d.ts.map +1 -0
  186. package/dist/primitives/ImageList.js +33 -0
  187. package/dist/primitives/InputAdornment.d.ts +28 -0
  188. package/dist/primitives/InputAdornment.d.ts.map +1 -0
  189. package/dist/primitives/InputAdornment.js +13 -0
  190. package/dist/primitives/Link.d.ts +17 -0
  191. package/dist/primitives/Link.d.ts.map +1 -0
  192. package/dist/primitives/Link.js +29 -0
  193. package/dist/primitives/List.d.ts +41 -0
  194. package/dist/primitives/List.d.ts.map +1 -0
  195. package/dist/primitives/List.js +22 -0
  196. package/dist/primitives/Masonry.d.ts +14 -0
  197. package/dist/primitives/Masonry.d.ts.map +1 -0
  198. package/dist/primitives/Masonry.js +15 -0
  199. package/dist/primitives/Menu.d.ts +28 -0
  200. package/dist/primitives/Menu.d.ts.map +1 -0
  201. package/dist/primitives/Menu.js +54 -0
  202. package/dist/primitives/MobileStepper.d.ts +15 -0
  203. package/dist/primitives/MobileStepper.d.ts.map +1 -0
  204. package/dist/primitives/MobileStepper.js +8 -0
  205. package/dist/primitives/Modal.d.ts +18 -0
  206. package/dist/primitives/Modal.d.ts.map +1 -0
  207. package/dist/primitives/Modal.js +29 -0
  208. package/dist/primitives/NoSsr.d.ts +15 -0
  209. package/dist/primitives/NoSsr.d.ts.map +1 -0
  210. package/dist/primitives/NoSsr.js +19 -0
  211. package/dist/primitives/Paper.d.ts +22 -0
  212. package/dist/primitives/Paper.d.ts.map +1 -0
  213. package/dist/primitives/Paper.js +33 -0
  214. package/dist/primitives/Progress.d.ts +6 -2
  215. package/dist/primitives/Progress.d.ts.map +1 -1
  216. package/dist/primitives/Progress.js +8 -3
  217. package/dist/primitives/Snackbar.d.ts +23 -0
  218. package/dist/primitives/Snackbar.d.ts.map +1 -0
  219. package/dist/primitives/Snackbar.js +33 -0
  220. package/dist/primitives/SpeedDial.d.ts +26 -0
  221. package/dist/primitives/SpeedDial.d.ts.map +1 -0
  222. package/dist/primitives/SpeedDial.js +26 -0
  223. package/dist/primitives/Stack.d.ts +15 -0
  224. package/dist/primitives/Stack.d.ts.map +1 -0
  225. package/dist/primitives/Stack.js +45 -0
  226. package/dist/primitives/StarRating.d.ts +19 -1
  227. package/dist/primitives/StarRating.d.ts.map +1 -1
  228. package/dist/primitives/StarRating.js +36 -6
  229. package/dist/primitives/Stepper.d.ts +36 -0
  230. package/dist/primitives/Stepper.d.ts.map +1 -0
  231. package/dist/primitives/Stepper.js +53 -0
  232. package/dist/primitives/TablePagination.d.ts +16 -0
  233. package/dist/primitives/TablePagination.d.ts.map +1 -0
  234. package/dist/primitives/TablePagination.js +12 -0
  235. package/dist/primitives/TextField.d.ts +24 -0
  236. package/dist/primitives/TextField.d.ts.map +1 -0
  237. package/dist/primitives/TextField.js +19 -0
  238. package/dist/primitives/TextareaAutosize.d.ts +11 -0
  239. package/dist/primitives/TextareaAutosize.d.ts.map +1 -0
  240. package/dist/primitives/TextareaAutosize.js +26 -0
  241. package/dist/primitives/ToggleButton.d.ts +28 -0
  242. package/dist/primitives/ToggleButton.d.ts.map +1 -0
  243. package/dist/primitives/ToggleButton.js +56 -0
  244. package/dist/primitives/TransferList.d.ts +21 -0
  245. package/dist/primitives/TransferList.d.ts.map +1 -0
  246. package/dist/primitives/TransferList.js +40 -0
  247. package/dist/primitives/Typography.d.ts +23 -0
  248. package/dist/primitives/Typography.d.ts.map +1 -0
  249. package/dist/primitives/Typography.js +69 -0
  250. package/dist/primitives/transitions.d.ts +29 -0
  251. package/dist/primitives/transitions.d.ts.map +1 -0
  252. package/dist/primitives/transitions.js +52 -0
  253. package/package.json +30 -5
  254. package/skills/spatika-ui/SKILL.md +96 -0
  255. package/src/composites/AccentRule.tsx +12 -0
  256. package/src/composites/AvailabilityBadge.tsx +32 -0
  257. package/src/composites/Card.tsx +51 -1
  258. package/src/composites/CareerCard.tsx +111 -0
  259. package/src/composites/ChartDataGrid.test.tsx +57 -0
  260. package/src/composites/ChartDataGrid.tsx +196 -0
  261. package/src/composites/ContactLink.tsx +66 -0
  262. package/src/composites/CoverHero.test.tsx +38 -0
  263. package/src/composites/CoverHero.tsx +29 -22
  264. package/src/composites/DisplayHeading.tsx +27 -0
  265. package/src/composites/EntityMediaCard.test.tsx +58 -0
  266. package/src/composites/EntityMediaCard.tsx +31 -13
  267. package/src/composites/EventCalendar.tsx +928 -0
  268. package/src/composites/EventEditor.tsx +268 -0
  269. package/src/composites/EventTimeline.tsx +357 -0
  270. package/src/composites/FloatChip.tsx +63 -0
  271. package/src/composites/GradientText.tsx +31 -0
  272. package/src/composites/IconTile.tsx +33 -0
  273. package/src/composites/MapChart.test.tsx +39 -0
  274. package/src/composites/MapChart.tsx +130 -0
  275. package/src/composites/MetaChip.tsx +24 -0
  276. package/src/composites/PresenceDot.tsx +42 -0
  277. package/src/composites/ProfileHero.test.tsx +33 -0
  278. package/src/composites/ProfileHero.tsx +96 -79
  279. package/src/composites/ProjectCard.tsx +65 -0
  280. package/src/composites/ScatterWebGL.test.tsx +25 -0
  281. package/src/composites/ScatterWebGL.tsx +79 -0
  282. package/src/composites/SectionHeading.tsx +61 -0
  283. package/src/composites/SiteFooter.test.tsx +37 -0
  284. package/src/composites/SiteFooter.tsx +79 -0
  285. package/src/composites/SiteNav.test.tsx +46 -0
  286. package/src/composites/SiteNav.tsx +150 -0
  287. package/src/composites/StatCard.test.tsx +30 -0
  288. package/src/composites/StatCard.tsx +36 -1
  289. package/src/composites/Tag.tsx +50 -0
  290. package/src/composites/Wordmark.test.tsx +23 -0
  291. package/src/composites/Wordmark.tsx +46 -0
  292. package/src/composites/cartesian-charts.test.tsx +52 -0
  293. package/src/composites/cartesian-charts.tsx +1287 -0
  294. package/src/composites/chart-composition.test.tsx +53 -0
  295. package/src/composites/chart-composition.tsx +898 -0
  296. package/src/composites/chart-ui.tsx +328 -0
  297. package/src/composites/charts-3d.test.tsx +25 -0
  298. package/src/composites/charts-3d.tsx +318 -0
  299. package/src/composites/charts.test.tsx +254 -0
  300. package/src/composites/chrome.test.tsx +29 -0
  301. package/src/composites/flow-charts.test.tsx +79 -0
  302. package/src/composites/flow-charts.tsx +607 -0
  303. package/src/composites/marketing.test.tsx +192 -0
  304. package/src/composites/radial-charts.test.tsx +74 -0
  305. package/src/composites/radial-charts.tsx +617 -0
  306. package/src/composites/scheduler-ui.tsx +304 -0
  307. package/src/composites/scheduler.test.tsx +194 -0
  308. package/src/index.test.ts +22 -0
  309. package/src/index.ts +300 -5
  310. package/src/lib/chart-export.test.ts +20 -0
  311. package/src/lib/chart-export.ts +99 -0
  312. package/src/lib/charts-platform.test.ts +93 -0
  313. package/src/lib/charts.test.ts +132 -0
  314. package/src/lib/charts.ts +1021 -0
  315. package/src/lib/geo.test.ts +42 -0
  316. package/src/lib/geo.ts +138 -0
  317. package/src/lib/iso.test.ts +22 -0
  318. package/src/lib/iso.ts +102 -0
  319. package/src/lib/rrule.test.ts +53 -0
  320. package/src/lib/rrule.ts +281 -0
  321. package/src/lib/scheduler.test.ts +186 -0
  322. package/src/lib/scheduler.ts +688 -0
  323. package/src/lib/tokens.test.ts +2 -2
  324. package/src/lib/webgl-scatter.test.ts +36 -0
  325. package/src/lib/webgl-scatter.ts +230 -0
  326. package/src/primitives/Accordion.tsx +218 -63
  327. package/src/primitives/AppBar.tsx +39 -0
  328. package/src/primitives/Autocomplete.tsx +236 -0
  329. package/src/primitives/Avatar.tsx +52 -1
  330. package/src/primitives/Backdrop.tsx +48 -0
  331. package/src/primitives/BottomNavigation.tsx +102 -0
  332. package/src/primitives/Button.tsx +3 -0
  333. package/src/primitives/ButtonBase.tsx +34 -0
  334. package/src/primitives/ButtonGroup.tsx +90 -0
  335. package/src/primitives/CircularProgress.tsx +104 -0
  336. package/src/primitives/ClickAwayListener.tsx +46 -0
  337. package/src/primitives/Collapse.tsx +39 -0
  338. package/src/primitives/Container.tsx +40 -0
  339. package/src/primitives/Fab.tsx +62 -0
  340. package/src/primitives/FormControl.tsx +90 -0
  341. package/src/primitives/FormControlLabel.tsx +51 -0
  342. package/src/primitives/Grid.tsx +101 -0
  343. package/src/primitives/IconButton.tsx +59 -0
  344. package/src/primitives/ImageList.test.tsx +48 -0
  345. package/src/primitives/ImageList.tsx +112 -0
  346. package/src/primitives/InputAdornment.tsx +86 -0
  347. package/src/primitives/Link.tsx +48 -0
  348. package/src/primitives/List.tsx +121 -0
  349. package/src/primitives/Masonry.tsx +32 -0
  350. package/src/primitives/Menu.tsx +112 -0
  351. package/src/primitives/MobileStepper.tsx +64 -0
  352. package/src/primitives/Modal.tsx +70 -0
  353. package/src/primitives/NoSsr.tsx +28 -0
  354. package/src/primitives/Paper.tsx +55 -0
  355. package/src/primitives/Progress.tsx +25 -7
  356. package/src/primitives/Snackbar.tsx +83 -0
  357. package/src/primitives/SpeedDial.tsx +110 -0
  358. package/src/primitives/Stack.tsx +88 -0
  359. package/src/primitives/StarRating.tsx +87 -28
  360. package/src/primitives/Stepper.tsx +184 -0
  361. package/src/primitives/TablePagination.tsx +58 -0
  362. package/src/primitives/TextField.tsx +105 -0
  363. package/src/primitives/TextareaAutosize.tsx +49 -0
  364. package/src/primitives/ToggleButton.tsx +148 -0
  365. package/src/primitives/TransferList.tsx +110 -0
  366. package/src/primitives/Typography.tsx +90 -0
  367. package/src/primitives/mui-more.test.tsx +76 -0
  368. package/src/primitives/mui.test.tsx +134 -0
  369. package/src/primitives/transitions.tsx +120 -0
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Tiny GeoJSON helpers — Mercator / equirectangular, no d3-geo.
3
+ */
4
+ export type GeoPosition = [number, number];
5
+ export type GeoJsonGeometry = {
6
+ type: "Polygon";
7
+ coordinates: GeoPosition[][];
8
+ } | {
9
+ type: "MultiPolygon";
10
+ coordinates: GeoPosition[][][];
11
+ } | {
12
+ type: "Point";
13
+ coordinates: GeoPosition;
14
+ } | {
15
+ type: "LineString";
16
+ coordinates: GeoPosition[];
17
+ } | {
18
+ type: "MultiLineString";
19
+ coordinates: GeoPosition[][];
20
+ };
21
+ export type GeoJsonFeature = {
22
+ type: "Feature";
23
+ id?: string | number;
24
+ properties?: Record<string, unknown> | null;
25
+ geometry: GeoJsonGeometry | null;
26
+ };
27
+ export type GeoJsonFeatureCollection = {
28
+ type: "FeatureCollection";
29
+ features: GeoJsonFeature[];
30
+ };
31
+ export type GeoProjectionKind = "mercator" | "equirectangular";
32
+ export declare function mercator([lon, lat]: GeoPosition): [number, number];
33
+ export declare function equirectangular([lon, lat]: GeoPosition): [number, number];
34
+ export declare function projectLonLat(pos: GeoPosition, kind: GeoProjectionKind): [number, number];
35
+ export declare function featureId(feature: GeoJsonFeature, idProperty?: string): string;
36
+ export declare function walkFeatures(features: GeoJsonFeature[], visit: (pos: GeoPosition) => void): void;
37
+ export declare function geoPath(geometry: GeoJsonGeometry, project: (pos: GeoPosition) => [number, number]): string;
38
+ export declare function fitFeatures(features: GeoJsonFeature[], width: number, height: number, padding: number, kind?: GeoProjectionKind): (pos: GeoPosition) => [number, number];
39
+ //# sourceMappingURL=geo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geo.d.ts","sourceRoot":"","sources":["../../src/lib/geo.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE3C,MAAM,MAAM,eAAe,GACvB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,WAAW,EAAE,WAAW,EAAE,EAAE,CAAA;CAAE,GACjD;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,WAAW,EAAE,WAAW,EAAE,EAAE,EAAE,CAAA;CAAE,GACxD;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,WAAW,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,WAAW,EAAE,WAAW,EAAE,CAAA;CAAE,GAClD;IAAE,IAAI,EAAE,iBAAiB,CAAC;IAAC,WAAW,EAAE,WAAW,EAAE,EAAE,CAAA;CAAE,CAAC;AAE9D,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,SAAS,CAAC;IAChB,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC5C,QAAQ,EAAE,eAAe,GAAG,IAAI,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,QAAQ,EAAE,cAAc,EAAE,CAAC;CAC5B,CAAC;AAEF,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,iBAAiB,CAAC;AAE/D,wBAAgB,QAAQ,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAMlE;AAED,wBAAgB,eAAe,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAEzE;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,WAAW,EAAE,IAAI,EAAE,iBAAiB,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAEzF;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,cAAc,EAAE,UAAU,SAAO,GAAG,MAAM,CAI5E;AAsBD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,IAAI,QAIzF;AAcD,wBAAgB,OAAO,CACrB,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,CAAC,GAAG,EAAE,WAAW,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9C,MAAM,CAeR;AAED,wBAAgB,WAAW,CACzB,QAAQ,EAAE,cAAc,EAAE,EAC1B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,iBAA8B,GACnC,CAAC,GAAG,EAAE,WAAW,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,CAwBxC"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Tiny GeoJSON helpers — Mercator / equirectangular, no d3-geo.
3
+ */
4
+ export function mercator([lon, lat]) {
5
+ const x = (lon + 180) / 360;
6
+ const clamped = Math.min(85.051129, Math.max(-85.051129, lat));
7
+ const sin = Math.sin((clamped * Math.PI) / 180);
8
+ const y = 0.5 - Math.log((1 + sin) / (1 - sin)) / (4 * Math.PI);
9
+ return [x, y];
10
+ }
11
+ export function equirectangular([lon, lat]) {
12
+ return [(lon + 180) / 360, (90 - lat) / 180];
13
+ }
14
+ export function projectLonLat(pos, kind) {
15
+ return kind === "equirectangular" ? equirectangular(pos) : mercator(pos);
16
+ }
17
+ export function featureId(feature, idProperty = "id") {
18
+ if (feature.id != null)
19
+ return String(feature.id);
20
+ const value = feature.properties?.[idProperty] ?? feature.properties?.name;
21
+ return value != null ? String(value) : "";
22
+ }
23
+ function walkGeometry(geometry, visit) {
24
+ if (geometry.type === "Point") {
25
+ visit(geometry.coordinates);
26
+ return;
27
+ }
28
+ if (geometry.type === "LineString") {
29
+ geometry.coordinates.forEach(visit);
30
+ return;
31
+ }
32
+ if (geometry.type === "MultiLineString") {
33
+ geometry.coordinates.forEach((line) => line.forEach(visit));
34
+ return;
35
+ }
36
+ if (geometry.type === "Polygon") {
37
+ geometry.coordinates.forEach((ring) => ring.forEach(visit));
38
+ return;
39
+ }
40
+ geometry.coordinates.forEach((poly) => poly.forEach((ring) => ring.forEach(visit)));
41
+ }
42
+ export function walkFeatures(features, visit) {
43
+ for (const feature of features) {
44
+ if (feature.geometry)
45
+ walkGeometry(feature.geometry, visit);
46
+ }
47
+ }
48
+ function ringPath(ring, project) {
49
+ if (!ring.length)
50
+ return "";
51
+ const pts = ring.map(project);
52
+ return `M${pts.map(([x, y]) => `${x} ${y}`).join("L")}Z`;
53
+ }
54
+ function linePath(line, project) {
55
+ if (!line.length)
56
+ return "";
57
+ const pts = line.map(project);
58
+ return `M${pts.map(([x, y]) => `${x} ${y}`).join("L")}`;
59
+ }
60
+ export function geoPath(geometry, project) {
61
+ if (geometry.type === "Polygon") {
62
+ return geometry.coordinates.map((ring) => ringPath(ring, project)).join(" ");
63
+ }
64
+ if (geometry.type === "MultiPolygon") {
65
+ return geometry.coordinates
66
+ .map((poly) => poly.map((ring) => ringPath(ring, project)).join(" "))
67
+ .join(" ");
68
+ }
69
+ if (geometry.type === "LineString")
70
+ return linePath(geometry.coordinates, project);
71
+ if (geometry.type === "MultiLineString") {
72
+ return geometry.coordinates.map((line) => linePath(line, project)).join(" ");
73
+ }
74
+ const [x, y] = project(geometry.coordinates);
75
+ return `M${x} ${y}m-2 0a2 2 0 1 0 4 0a2 2 0 1 0 -4 0`;
76
+ }
77
+ export function fitFeatures(features, width, height, padding, kind = "mercator") {
78
+ const raw = (pos) => projectLonLat(pos, kind);
79
+ let minX = Infinity;
80
+ let minY = Infinity;
81
+ let maxX = -Infinity;
82
+ let maxY = -Infinity;
83
+ walkFeatures(features, (pos) => {
84
+ const [x, y] = raw(pos);
85
+ minX = Math.min(minX, x);
86
+ minY = Math.min(minY, y);
87
+ maxX = Math.max(maxX, x);
88
+ maxY = Math.max(maxY, y);
89
+ });
90
+ const bw = Math.max(1e-6, maxX - minX);
91
+ const bh = Math.max(1e-6, maxY - minY);
92
+ const innerW = Math.max(1, width - padding * 2);
93
+ const innerH = Math.max(1, height - padding * 2);
94
+ const scale = Math.min(innerW / bw, innerH / bh);
95
+ const tx = padding + (innerW - bw * scale) / 2;
96
+ const ty = padding + (innerH - bh * scale) / 2;
97
+ return (pos) => {
98
+ const [x, y] = raw(pos);
99
+ return [tx + (x - minX) * scale, ty + (y - minY) * scale];
100
+ };
101
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Isometric 2.5D helpers for SVG bar and pie charts.
3
+ */
4
+ export declare function isoPoint(x: number, y: number, z: number, originX: number, originY: number): {
5
+ x: number;
6
+ y: number;
7
+ };
8
+ export type IsoBoxFaces = {
9
+ front: string;
10
+ top: string;
11
+ side: string;
12
+ };
13
+ /** Axis-aligned box: x/z on the ground plane, y up. */
14
+ export declare function isoBoxFaces(x: number, y0: number, z: number, w: number, h: number, d: number, originX: number, originY: number): IsoBoxFaces;
15
+ export declare function ellipsePoint(cx: number, cy: number, rx: number, ry: number, angleDeg: number): {
16
+ x: number;
17
+ y: number;
18
+ };
19
+ export declare function ellipseSlicePath(cx: number, cy: number, rx: number, ry: number, startAngle: number, endAngle: number): string;
20
+ export declare function ellipseWallPath(cx: number, cy: number, rx: number, ry: number, startAngle: number, endAngle: number, thickness: number): string;
21
+ //# sourceMappingURL=iso.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iso.d.ts","sourceRoot":"","sources":["../../src/lib/iso.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,wBAAgB,QAAQ,CACtB,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAK1B;AAOD,MAAM,MAAM,WAAW,GAAG;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,uDAAuD;AACvD,wBAAgB,WAAW,CACzB,CAAC,EAAE,MAAM,EACT,EAAE,EAAE,MAAM,EACV,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,CAAC,EAAE,MAAM,EACT,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,WAAW,CAcb;AAED,wBAAgB,YAAY,CAC1B,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,MAAM,GACf;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAA;CAAE,CAG1B;AAED,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,GACf,MAAM,CAOR;AAED,wBAAgB,eAAe,CAC7B,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,GAChB,MAAM,CASR"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Isometric 2.5D helpers for SVG bar and pie charts.
3
+ */
4
+ const COS = Math.cos(Math.PI / 6);
5
+ const SIN = Math.sin(Math.PI / 6);
6
+ export function isoPoint(x, y, z, originX, originY) {
7
+ return {
8
+ x: originX + (x - z) * COS,
9
+ y: originY - y + (x + z) * SIN,
10
+ };
11
+ }
12
+ function poly(points) {
13
+ if (!points.length)
14
+ return "";
15
+ return `M${points.map((p) => `${p.x} ${p.y}`).join("L")}Z`;
16
+ }
17
+ /** Axis-aligned box: x/z on the ground plane, y up. */
18
+ export function isoBoxFaces(x, y0, z, w, h, d, originX, originY) {
19
+ const p = (px, py, pz) => isoPoint(px, py, pz, originX, originY);
20
+ const a = p(x, y0, z);
21
+ const b = p(x + w, y0, z);
22
+ const c = p(x + w, y0 + h, z);
23
+ const e = p(x, y0 + h, z);
24
+ const f = p(x + w, y0, z + d);
25
+ const g = p(x + w, y0 + h, z + d);
26
+ const k = p(x, y0 + h, z + d);
27
+ return {
28
+ front: poly([a, b, c, e]),
29
+ top: poly([e, c, g, k]),
30
+ side: poly([b, f, g, c]),
31
+ };
32
+ }
33
+ export function ellipsePoint(cx, cy, rx, ry, angleDeg) {
34
+ const rad = ((angleDeg - 90) * Math.PI) / 180;
35
+ return { x: cx + rx * Math.cos(rad), y: cy + ry * Math.sin(rad) };
36
+ }
37
+ export function ellipseSlicePath(cx, cy, rx, ry, startAngle, endAngle) {
38
+ const start = ellipsePoint(cx, cy, rx, ry, startAngle);
39
+ const end = ellipsePoint(cx, cy, rx, ry, endAngle);
40
+ const sweep = ((endAngle - startAngle) % 360 + 360) % 360;
41
+ if (sweep <= 0)
42
+ return "";
43
+ const large = sweep > 180 ? 1 : 0;
44
+ return `M${cx} ${cy} L${start.x} ${start.y} A${rx} ${ry} 0 ${large} 1 ${end.x} ${end.y} Z`;
45
+ }
46
+ export function ellipseWallPath(cx, cy, rx, ry, startAngle, endAngle, thickness) {
47
+ const top0 = ellipsePoint(cx, cy, rx, ry, startAngle);
48
+ const top1 = ellipsePoint(cx, cy, rx, ry, endAngle);
49
+ const bot0 = { x: top0.x, y: top0.y + thickness };
50
+ const bot1 = { x: top1.x, y: top1.y + thickness };
51
+ const sweep = ((endAngle - startAngle) % 360 + 360) % 360;
52
+ if (sweep <= 0)
53
+ return "";
54
+ const large = sweep > 180 ? 1 : 0;
55
+ return `M${bot0.x} ${bot0.y} L${top0.x} ${top0.y} A${rx} ${ry} 0 ${large} 1 ${top1.x} ${top1.y} L${bot1.x} ${bot1.y} A${rx} ${ry} 0 ${large} 0 ${bot0.x} ${bot0.y} Z`;
56
+ }
@@ -0,0 +1,20 @@
1
+ import type { NormalizedEvent, SchedulerEvent } from "./scheduler";
2
+ export type ParsedRRule = {
3
+ freq: "DAILY" | "WEEKLY" | "MONTHLY" | "YEARLY";
4
+ interval: number;
5
+ count?: number;
6
+ until?: Date;
7
+ byDay?: {
8
+ weekday: number;
9
+ nth?: number;
10
+ }[];
11
+ byMonthDay?: number[];
12
+ };
13
+ export declare function parseRRule(rrule: string): ParsedRRule | null;
14
+ /**
15
+ * Expand a recurring event into occurrences overlapping [rangeStart, rangeEnd).
16
+ * Non-recurring events are returned as a single occurrence.
17
+ */
18
+ export declare function expandEventOccurrences(event: NormalizedEvent, rangeStart: Date, rangeEnd: Date, source?: SchedulerEvent): NormalizedEvent[];
19
+ export declare function expandVisibleEvents(events: NormalizedEvent[], rangeStart: Date, rangeEnd: Date, sources?: SchedulerEvent[]): NormalizedEvent[];
20
+ //# sourceMappingURL=rrule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rrule.d.ts","sourceRoot":"","sources":["../../src/lib/rrule.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAyCnE,MAAM,MAAM,WAAW,GAAG;IACxB,IAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;IAChD,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,KAAK,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC5C,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB,CAAC;AAEF,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAsD5D;AAwCD;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,eAAe,EACtB,UAAU,EAAE,IAAI,EAChB,QAAQ,EAAE,IAAI,EACd,MAAM,CAAC,EAAE,cAAc,GACtB,eAAe,EAAE,CA+GnB;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,eAAe,EAAE,EACzB,UAAU,EAAE,IAAI,EAChB,QAAQ,EAAE,IAAI,EACd,OAAO,GAAE,cAAc,EAAO,GAC7B,eAAe,EAAE,CASnB"}
@@ -0,0 +1,236 @@
1
+ function toDate(value) {
2
+ if (value instanceof Date)
3
+ return new Date(value.getTime());
4
+ const dateOnly = /^(\d{4})-(\d{2})-(\d{2})$/.exec(value);
5
+ if (dateOnly) {
6
+ return new Date(Number(dateOnly[1]), Number(dateOnly[2]) - 1, Number(dateOnly[3]));
7
+ }
8
+ return new Date(value);
9
+ }
10
+ function startOfDay(date) {
11
+ return new Date(date.getFullYear(), date.getMonth(), date.getDate());
12
+ }
13
+ function addDays(date, amount) {
14
+ const next = new Date(date.getTime());
15
+ next.setDate(next.getDate() + amount);
16
+ return next;
17
+ }
18
+ function addMonths(date, amount) {
19
+ const next = new Date(date.getTime());
20
+ next.setMonth(next.getMonth() + amount);
21
+ return next;
22
+ }
23
+ function addMs(date, ms) {
24
+ return new Date(date.getTime() + ms);
25
+ }
26
+ const WEEKDAY = {
27
+ SU: 0,
28
+ MO: 1,
29
+ TU: 2,
30
+ WE: 3,
31
+ TH: 4,
32
+ FR: 5,
33
+ SA: 6,
34
+ };
35
+ export function parseRRule(rrule) {
36
+ const parts = rrule
37
+ .replace(/^RRULE:/i, "")
38
+ .split(";")
39
+ .map((part) => part.trim())
40
+ .filter(Boolean);
41
+ const map = new Map();
42
+ for (const part of parts) {
43
+ const [key, value] = part.split("=");
44
+ if (key && value)
45
+ map.set(key.toUpperCase(), value);
46
+ }
47
+ const freq = map.get("FREQ");
48
+ if (!freq || !["DAILY", "WEEKLY", "MONTHLY", "YEARLY"].includes(freq))
49
+ return null;
50
+ const untilRaw = map.get("UNTIL");
51
+ let until;
52
+ if (untilRaw) {
53
+ const compact = /^(\d{4})(\d{2})(\d{2})(?:T(\d{2})(\d{2})(\d{2})Z?)?$/.exec(untilRaw);
54
+ until = compact
55
+ ? new Date(Date.UTC(Number(compact[1]), Number(compact[2]) - 1, Number(compact[3]), Number(compact[4] ?? 23), Number(compact[5] ?? 59), Number(compact[6] ?? 59)))
56
+ : toDate(untilRaw);
57
+ }
58
+ const byDay = map.get("BYDAY")
59
+ ?.split(",")
60
+ .flatMap((token) => {
61
+ const match = /^(-?\d+)?(SU|MO|TU|WE|TH|FR|SA)$/.exec(token.trim().toUpperCase());
62
+ if (!match)
63
+ return [];
64
+ return [{ weekday: WEEKDAY[match[2]], nth: match[1] ? Number(match[1]) : undefined }];
65
+ });
66
+ const byMonthDay = map
67
+ .get("BYMONTHDAY")
68
+ ?.split(",")
69
+ .map((value) => Number(value))
70
+ .filter((value) => Number.isFinite(value));
71
+ return {
72
+ freq,
73
+ interval: Math.max(1, Number(map.get("INTERVAL") ?? 1) || 1),
74
+ count: map.get("COUNT") ? Math.max(1, Number(map.get("COUNT"))) : undefined,
75
+ until,
76
+ byDay,
77
+ byMonthDay,
78
+ };
79
+ }
80
+ function nthWeekdayOfMonth(year, month, weekday, nth) {
81
+ if (nth > 0) {
82
+ const first = new Date(year, month, 1);
83
+ const shift = (weekday - first.getDay() + 7) % 7;
84
+ const day = 1 + shift + (nth - 1) * 7;
85
+ const date = new Date(year, month, day);
86
+ return date.getMonth() === month ? date : null;
87
+ }
88
+ const last = new Date(year, month + 1, 0);
89
+ const shift = (last.getDay() - weekday + 7) % 7;
90
+ const day = last.getDate() - shift + (nth + 1) * 7;
91
+ const date = new Date(year, month, day);
92
+ return date.getMonth() === month ? date : null;
93
+ }
94
+ function matchesByDay(date, rule) {
95
+ if (!rule.byDay?.length)
96
+ return true;
97
+ return rule.byDay.some((item) => {
98
+ if (item.weekday !== date.getDay())
99
+ return false;
100
+ if (item.nth == null)
101
+ return true;
102
+ const found = nthWeekdayOfMonth(date.getFullYear(), date.getMonth(), item.weekday, item.nth);
103
+ return found ? found.getDate() === date.getDate() : false;
104
+ });
105
+ }
106
+ function exceptionSet(dates) {
107
+ const set = new Set();
108
+ for (const value of dates ?? []) {
109
+ const date = startOfDay(toDate(value));
110
+ set.add(`${date.getFullYear()}-${date.getMonth()}-${date.getDate()}`);
111
+ }
112
+ return set;
113
+ }
114
+ function dayKey(date) {
115
+ return `${date.getFullYear()}-${date.getMonth()}-${date.getDate()}`;
116
+ }
117
+ /**
118
+ * Expand a recurring event into occurrences overlapping [rangeStart, rangeEnd).
119
+ * Non-recurring events are returned as a single occurrence.
120
+ */
121
+ export function expandEventOccurrences(event, rangeStart, rangeEnd, source) {
122
+ if (!event.rrule)
123
+ return [event];
124
+ const rule = parseRRule(event.rrule);
125
+ if (!rule)
126
+ return [event];
127
+ const duration = Math.max(0, event.end.getTime() - event.start.getTime());
128
+ const exceptions = exceptionSet(source?.exceptionDates ?? event.exceptionDates);
129
+ const occurrences = [];
130
+ const seed = new Date(event.start.getTime());
131
+ let emitted = 0;
132
+ const hardCap = rule.count ?? 400;
133
+ const pushIfVisible = (start) => {
134
+ if (start.getTime() < seed.getTime() - 60_000)
135
+ return;
136
+ if (exceptions.has(dayKey(start)))
137
+ return;
138
+ if (rule.until && start.getTime() > rule.until.getTime())
139
+ return;
140
+ const end = addMs(start, duration || 3_600_000);
141
+ if (end.getTime() <= rangeStart.getTime() || start.getTime() >= rangeEnd.getTime())
142
+ return;
143
+ occurrences.push({
144
+ ...event,
145
+ start,
146
+ end,
147
+ occurrenceStart: start,
148
+ });
149
+ };
150
+ if (rule.freq === "DAILY") {
151
+ let cursor = new Date(seed.getTime());
152
+ while (emitted < hardCap && cursor.getTime() < rangeEnd.getTime() + duration) {
153
+ if (!rule.until || cursor.getTime() <= rule.until.getTime()) {
154
+ pushIfVisible(new Date(cursor.getTime()));
155
+ emitted += 1;
156
+ }
157
+ cursor = addDays(cursor, rule.interval);
158
+ if (rule.count && emitted >= rule.count)
159
+ break;
160
+ }
161
+ return occurrences;
162
+ }
163
+ if (rule.freq === "WEEKLY") {
164
+ const days = rule.byDay?.length
165
+ ? [...new Set(rule.byDay.map((item) => item.weekday))].sort()
166
+ : [seed.getDay()];
167
+ let weekStart = addDays(startOfDay(seed), -seed.getDay());
168
+ while (emitted < hardCap && weekStart.getTime() < rangeEnd.getTime()) {
169
+ for (const weekday of days) {
170
+ const start = new Date(weekStart.getFullYear(), weekStart.getMonth(), weekStart.getDate() + weekday, seed.getHours(), seed.getMinutes(), seed.getSeconds());
171
+ if (start.getTime() < seed.getTime() - 60_000)
172
+ continue;
173
+ if (rule.until && start.getTime() > rule.until.getTime())
174
+ continue;
175
+ pushIfVisible(start);
176
+ emitted += 1;
177
+ if (rule.count && emitted >= rule.count)
178
+ return occurrences;
179
+ }
180
+ weekStart = addDays(weekStart, 7 * rule.interval);
181
+ }
182
+ return occurrences;
183
+ }
184
+ if (rule.freq === "MONTHLY") {
185
+ let year = seed.getFullYear();
186
+ let month = seed.getMonth();
187
+ while (emitted < hardCap) {
188
+ const monthStart = new Date(year, month, 1);
189
+ if (monthStart.getTime() > rangeEnd.getTime())
190
+ break;
191
+ const candidates = [];
192
+ if (rule.byDay?.length) {
193
+ for (const item of rule.byDay) {
194
+ const found = nthWeekdayOfMonth(year, month, item.weekday, item.nth ?? 1);
195
+ if (found) {
196
+ candidates.push(new Date(year, month, found.getDate(), seed.getHours(), seed.getMinutes(), seed.getSeconds()));
197
+ }
198
+ }
199
+ }
200
+ else {
201
+ const days = rule.byMonthDay?.length ? rule.byMonthDay : [seed.getDate()];
202
+ for (const day of days) {
203
+ const date = new Date(year, month, day, seed.getHours(), seed.getMinutes(), seed.getSeconds());
204
+ if (date.getMonth() === month)
205
+ candidates.push(date);
206
+ }
207
+ }
208
+ for (const start of candidates.sort((a, b) => a.getTime() - b.getTime())) {
209
+ if (rule.until && start.getTime() > rule.until.getTime())
210
+ continue;
211
+ pushIfVisible(start);
212
+ emitted += 1;
213
+ if (rule.count && emitted >= rule.count)
214
+ return occurrences;
215
+ }
216
+ const next = addMonths(new Date(year, month, 1), rule.interval);
217
+ year = next.getFullYear();
218
+ month = next.getMonth();
219
+ }
220
+ return occurrences;
221
+ }
222
+ let cursor = new Date(seed.getTime());
223
+ while (emitted < hardCap && cursor.getTime() < rangeEnd.getTime() + duration) {
224
+ if (matchesByDay(cursor, rule) && (!rule.until || cursor.getTime() <= rule.until.getTime())) {
225
+ pushIfVisible(new Date(cursor.getTime()));
226
+ emitted += 1;
227
+ }
228
+ cursor = addMonths(cursor, 12 * rule.interval);
229
+ if (rule.count && emitted >= rule.count)
230
+ break;
231
+ }
232
+ return occurrences;
233
+ }
234
+ export function expandVisibleEvents(events, rangeStart, rangeEnd, sources = []) {
235
+ return events.flatMap((event) => expandEventOccurrences(event, rangeStart, rangeEnd, sources.find((item) => item.id === event.id)));
236
+ }
@@ -0,0 +1,152 @@
1
+ /**
2
+ * Date math and layout helpers for EventCalendar / EventTimeline.
3
+ * Local timezone throughout — date-only ISO strings parse as local midnight.
4
+ */
5
+ import type { CSSProperties } from "react";
6
+ export declare const SCHEDULER_COLOR_TONES: readonly ["blue", "violet", "teal", "orange", "rose", "slate"];
7
+ export type SchedulerColorTone = (typeof SCHEDULER_COLOR_TONES)[number];
8
+ export type SchedulerEvent = {
9
+ id: string;
10
+ title: string;
11
+ start: Date | string;
12
+ end: Date | string;
13
+ resourceId?: string;
14
+ allDay?: boolean;
15
+ color?: SchedulerColorTone;
16
+ description?: string;
17
+ /** RFC 5545 RRULE, e.g. `FREQ=WEEKLY;BYDAY=MO,WE`. */
18
+ rrule?: string;
19
+ /** Dates to skip from a recurring series. */
20
+ exceptionDates?: Array<Date | string>;
21
+ timezone?: string;
22
+ readOnly?: boolean;
23
+ draggable?: boolean;
24
+ resizable?: boolean;
25
+ };
26
+ export type SchedulerResource = {
27
+ id: string;
28
+ title: string;
29
+ color?: SchedulerColorTone;
30
+ };
31
+ export type CalendarView = "month" | "week" | "day" | "agenda";
32
+ export type TimelineScale = "hours" | "days" | "weeks" | "months" | "years";
33
+ export type SchedulerPreferences = {
34
+ showWeekends?: boolean;
35
+ showWeekNumber?: boolean;
36
+ ampm?: boolean;
37
+ weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;
38
+ };
39
+ export declare const DEFAULT_SCHEDULER_PREFERENCES: Required<SchedulerPreferences>;
40
+ export type NormalizedEvent = {
41
+ id: string;
42
+ title: string;
43
+ start: Date;
44
+ end: Date;
45
+ resourceId?: string;
46
+ allDay: boolean;
47
+ color: SchedulerColorTone;
48
+ description?: string;
49
+ rrule?: string;
50
+ exceptionDates?: Array<Date | string>;
51
+ timezone?: string;
52
+ readOnly?: boolean;
53
+ draggable?: boolean;
54
+ resizable?: boolean;
55
+ occurrenceStart?: Date;
56
+ };
57
+ export declare const SCHEDULER_COLOR_VARS: Record<SchedulerColorTone, string>;
58
+ export declare function toDate(value: Date | string): Date;
59
+ export declare function startOfDay(date: Date): Date;
60
+ export declare function addDays(date: Date, amount: number): Date;
61
+ export declare function addMonths(date: Date, amount: number): Date;
62
+ export declare function startOfMonth(date: Date): Date;
63
+ export declare function startOfWeek(date: Date, weekStartsOn?: number): Date;
64
+ export declare function isSameDay(a: Date, b: Date): boolean;
65
+ export declare function isSameMonth(a: Date, b: Date): boolean;
66
+ export declare function differenceInDays(later: Date, earlier: Date): number;
67
+ export declare function differenceInMs(later: Date, earlier: Date): number;
68
+ export declare function addMs(date: Date, ms: number): Date;
69
+ export declare function clampDate(date: Date, min: Date, max: Date): Date;
70
+ export declare function getMonthGrid(date: Date, weekStartsOn?: number): Date[];
71
+ export declare function getWeekDays(date: Date, weekStartsOn?: number): Date[];
72
+ export declare function weekdayLabels(weekStartsOn?: number, locale?: string): string[];
73
+ export declare function formatMonthYear(date: Date, locale?: string): string;
74
+ export declare function formatWeekRange(date: Date, weekStartsOn?: number, locale?: string): string;
75
+ export declare function formatDayHeading(date: Date, locale?: string): string;
76
+ export declare function formatTime(date: Date, locale?: string, hour12?: boolean): string;
77
+ export declare function formatHour(hour: number, locale?: string, hour12?: boolean): string;
78
+ export declare function formatDateRange(start: Date, end: Date, allDay: boolean, locale?: string, hour12?: boolean): string;
79
+ export declare function formatDateSpan(start: Date, end: Date, locale?: string): string;
80
+ export declare function occurrenceKey(event: NormalizedEvent): string;
81
+ export declare function eventCanDrag(event: Pick<NormalizedEvent, "readOnly" | "draggable">, options: {
82
+ readOnly?: boolean;
83
+ enabled?: boolean;
84
+ }): boolean;
85
+ export declare function eventCanResize(event: Pick<NormalizedEvent, "readOnly" | "resizable">, options: {
86
+ readOnly?: boolean;
87
+ enabled?: boolean;
88
+ }): boolean;
89
+ export declare function resolveEventColor(event: Pick<SchedulerEvent, "color" | "resourceId">, resources?: SchedulerResource[]): SchedulerColorTone;
90
+ export declare function normalizeEvents(events: SchedulerEvent[], resources?: SchedulerResource[]): NormalizedEvent[];
91
+ /** Last occupied instant is exclusive-end minus 1ms. */
92
+ export declare function lastInstant(event: Pick<NormalizedEvent, "end">): Date;
93
+ export declare function occupiesDay(event: NormalizedEvent, day: Date): boolean;
94
+ export declare function isMonthBar(event: NormalizedEvent): boolean;
95
+ export type SpanSegment = {
96
+ event: NormalizedEvent;
97
+ startCol: number;
98
+ span: number;
99
+ };
100
+ export type SpanLane = SpanSegment[];
101
+ export declare function weekSpanLanes(weekStart: Date, events: NormalizedEvent[]): SpanLane[];
102
+ export declare function weekSpanLanesForDays(days: Date[], events: NormalizedEvent[]): SpanLane[];
103
+ export declare function isoDay(date: Date): string;
104
+ export declare function filterWeekendDays(days: Date[], showWeekends: boolean): Date[];
105
+ export declare function weekNumber(date: Date): number;
106
+ export declare function agendaDays(date: Date, count?: number): Date[];
107
+ export declare function snapMs(ms: number, unit?: number): number;
108
+ export declare function resizeEvent(event: NormalizedEvent, edge: "start" | "end", nextInstant: Date): {
109
+ start: Date;
110
+ end: Date;
111
+ };
112
+ export declare function toDatetimeLocalValue(date: Date): string;
113
+ export declare function fromDatetimeLocalValue(value: string): Date;
114
+ export declare function createEventId(): string;
115
+ export declare function timedEventsOnDay(events: NormalizedEvent[], day: Date): NormalizedEvent[];
116
+ export type TimedLayoutItem = {
117
+ event: NormalizedEvent;
118
+ col: number;
119
+ cols: number;
120
+ top: number;
121
+ height: number;
122
+ };
123
+ export declare function layoutTimedEvents(events: NormalizedEvent[], day: Date, hourStart: number, hourEnd: number): TimedLayoutItem[];
124
+ export declare function shiftByDays(event: NormalizedEvent, days: number): {
125
+ start: Date;
126
+ end: Date;
127
+ };
128
+ export declare function shiftByMs(event: NormalizedEvent, ms: number): {
129
+ start: Date;
130
+ end: Date;
131
+ };
132
+ export declare function hoursInView(hourStart: number, hourEnd: number): number[];
133
+ export type TimelineRange = {
134
+ start: Date;
135
+ end: Date;
136
+ ticks: {
137
+ date: Date;
138
+ label: string;
139
+ }[];
140
+ };
141
+ export declare function getTimelineRange(date: Date, scale: TimelineScale, locale?: string): TimelineRange;
142
+ export declare function shiftTimelineDate(date: Date, scale: TimelineScale, direction: -1 | 1): Date;
143
+ export type TimelineBar = {
144
+ event: NormalizedEvent;
145
+ lane: number;
146
+ left: number;
147
+ width: number;
148
+ };
149
+ export declare function layoutTimelineBars(events: NormalizedEvent[], rangeStart: Date, rangeEnd: Date): TimelineBar[];
150
+ export declare function eventColorStyle(tone: SchedulerColorTone, variant: "dot" | "bar" | "block" | "wash"): CSSProperties;
151
+ export declare function visibleEvents(events: NormalizedEvent[], hiddenResourceIds: ReadonlySet<string>): NormalizedEvent[];
152
+ //# sourceMappingURL=scheduler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.d.ts","sourceRoot":"","sources":["../../src/lib/scheduler.ts"],"names":[],"mappings":"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"}