@astryxdesign/lab 0.0.0-bootstrap.0 → 0.1.2-canary.04e71b2

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 (513) hide show
  1. package/CHANGELOG.md +67 -0
  2. package/LICENSE +21 -0
  3. package/README.md +47 -1
  4. package/dist/Chart/Chart.d.ts +77 -0
  5. package/dist/Chart/Chart.d.ts.map +1 -0
  6. package/dist/Chart/Chart.js +247 -0
  7. package/dist/Chart/ChartArea.d.ts +28 -0
  8. package/dist/Chart/ChartArea.d.ts.map +1 -0
  9. package/dist/Chart/ChartArea.js +71 -0
  10. package/dist/Chart/ChartAxis.d.ts +27 -0
  11. package/dist/Chart/ChartAxis.d.ts.map +1 -0
  12. package/dist/Chart/ChartAxis.js +147 -0
  13. package/dist/Chart/ChartBar.d.ts +19 -0
  14. package/dist/Chart/ChartBar.d.ts.map +1 -0
  15. package/dist/Chart/ChartBar.js +61 -0
  16. package/dist/Chart/ChartBrush.d.ts +59 -0
  17. package/dist/Chart/ChartBrush.d.ts.map +1 -0
  18. package/dist/Chart/ChartBrush.js +197 -0
  19. package/dist/Chart/ChartCandlestick.d.ts +50 -0
  20. package/dist/Chart/ChartCandlestick.d.ts.map +1 -0
  21. package/dist/Chart/ChartCandlestick.js +138 -0
  22. package/dist/Chart/ChartContext.d.ts +5 -0
  23. package/dist/Chart/ChartContext.d.ts.map +1 -0
  24. package/dist/Chart/ChartContext.js +20 -0
  25. package/dist/Chart/ChartDot.d.ts +18 -0
  26. package/dist/Chart/ChartDot.d.ts.map +1 -0
  27. package/dist/Chart/ChartDot.js +43 -0
  28. package/dist/Chart/ChartDotGL.d.ts +16 -0
  29. package/dist/Chart/ChartDotGL.d.ts.map +1 -0
  30. package/dist/Chart/ChartDotGL.js +135 -0
  31. package/dist/Chart/ChartDotGLInteractive.d.ts +41 -0
  32. package/dist/Chart/ChartDotGLInteractive.d.ts.map +1 -0
  33. package/dist/Chart/ChartDotGLInteractive.js +446 -0
  34. package/dist/Chart/ChartErrorBar.d.ts +23 -0
  35. package/dist/Chart/ChartErrorBar.d.ts.map +1 -0
  36. package/dist/Chart/ChartErrorBar.js +68 -0
  37. package/dist/Chart/ChartGrid.d.ts +17 -0
  38. package/dist/Chart/ChartGrid.d.ts.map +1 -0
  39. package/dist/Chart/ChartGrid.js +67 -0
  40. package/dist/Chart/ChartHeatmapGL.d.ts +10 -0
  41. package/dist/Chart/ChartHeatmapGL.d.ts.map +1 -0
  42. package/dist/Chart/ChartHeatmapGL.js +171 -0
  43. package/dist/Chart/ChartLegend.d.ts +60 -0
  44. package/dist/Chart/ChartLegend.d.ts.map +1 -0
  45. package/dist/Chart/ChartLegend.js +161 -0
  46. package/dist/Chart/ChartLine.d.ts +23 -0
  47. package/dist/Chart/ChartLine.d.ts.map +1 -0
  48. package/dist/Chart/ChartLine.js +64 -0
  49. package/dist/Chart/ChartReferenceLine.d.ts +11 -0
  50. package/dist/Chart/ChartReferenceLine.d.ts.map +1 -0
  51. package/dist/Chart/ChartReferenceLine.js +109 -0
  52. package/dist/Chart/ChartSelect.d.ts +9 -0
  53. package/dist/Chart/ChartSelect.d.ts.map +1 -0
  54. package/dist/Chart/ChartSelect.js +90 -0
  55. package/dist/Chart/ChartStreamGL.d.ts +17 -0
  56. package/dist/Chart/ChartStreamGL.d.ts.map +1 -0
  57. package/dist/Chart/ChartStreamGL.js +157 -0
  58. package/dist/Chart/ChartTooltip.d.ts +85 -0
  59. package/dist/Chart/ChartTooltip.d.ts.map +1 -0
  60. package/dist/Chart/ChartTooltip.js +335 -0
  61. package/dist/Chart/ChartZoom.d.ts +23 -0
  62. package/dist/Chart/ChartZoom.d.ts.map +1 -0
  63. package/dist/Chart/ChartZoom.js +314 -0
  64. package/dist/Chart/formatters.d.ts +33 -0
  65. package/dist/Chart/formatters.d.ts.map +1 -0
  66. package/dist/Chart/formatters.js +101 -0
  67. package/dist/Chart/getChartColors.d.ts +56 -0
  68. package/dist/Chart/getChartColors.d.ts.map +1 -0
  69. package/dist/Chart/getChartColors.js +150 -0
  70. package/dist/Chart/index.d.ts +29 -0
  71. package/dist/Chart/index.d.ts.map +1 -0
  72. package/dist/Chart/index.js +29 -0
  73. package/dist/Chart/m4.d.ts +36 -0
  74. package/dist/Chart/m4.d.ts.map +1 -0
  75. package/dist/Chart/m4.js +106 -0
  76. package/dist/Chart/types.d.ts +55 -0
  77. package/dist/Chart/types.d.ts.map +1 -0
  78. package/dist/Chart/types.js +1 -0
  79. package/dist/Chart/useChartColors.d.ts +16 -0
  80. package/dist/Chart/useChartColors.d.ts.map +1 -0
  81. package/dist/Chart/useChartColors.js +30 -0
  82. package/dist/Chart/useChartRange.d.ts +50 -0
  83. package/dist/Chart/useChartRange.d.ts.map +1 -0
  84. package/dist/Chart/useChartRange.js +90 -0
  85. package/dist/Chart/utils.d.ts +15 -0
  86. package/dist/Chart/utils.d.ts.map +1 -0
  87. package/dist/Chart/utils.js +24 -0
  88. package/dist/Chart/webgl.d.ts +62 -0
  89. package/dist/Chart/webgl.d.ts.map +1 -0
  90. package/dist/Chart/webgl.js +169 -0
  91. package/dist/ChartV2/Chart.d.ts +32 -0
  92. package/dist/ChartV2/Chart.d.ts.map +1 -0
  93. package/dist/ChartV2/Chart.js +281 -0
  94. package/dist/ChartV2/ChartAxis.d.ts +36 -0
  95. package/dist/ChartV2/ChartAxis.d.ts.map +1 -0
  96. package/dist/ChartV2/ChartAxis.js +161 -0
  97. package/dist/ChartV2/ChartGrid.d.ts +20 -0
  98. package/dist/ChartV2/ChartGrid.d.ts.map +1 -0
  99. package/dist/ChartV2/ChartGrid.js +76 -0
  100. package/dist/ChartV2/ChartLegend.d.ts +14 -0
  101. package/dist/ChartV2/ChartLegend.d.ts.map +1 -0
  102. package/dist/ChartV2/ChartLegend.js +54 -0
  103. package/dist/ChartV2/ChartSwatch.d.ts +36 -0
  104. package/dist/ChartV2/ChartSwatch.d.ts.map +1 -0
  105. package/dist/ChartV2/ChartSwatch.js +82 -0
  106. package/dist/ChartV2/ChartTooltip.d.ts +46 -0
  107. package/dist/ChartV2/ChartTooltip.d.ts.map +1 -0
  108. package/dist/ChartV2/ChartTooltip.js +267 -0
  109. package/dist/ChartV2/ChartV2Context.d.ts +4 -0
  110. package/dist/ChartV2/ChartV2Context.d.ts.map +1 -0
  111. package/dist/ChartV2/ChartV2Context.js +12 -0
  112. package/dist/ChartV2/index.d.ts +13 -0
  113. package/dist/ChartV2/index.d.ts.map +1 -0
  114. package/dist/ChartV2/index.js +10 -0
  115. package/dist/ChartV2/layout.d.ts +25 -0
  116. package/dist/ChartV2/layout.d.ts.map +1 -0
  117. package/dist/ChartV2/layout.js +195 -0
  118. package/dist/ChartV2/legend.d.ts +18 -0
  119. package/dist/ChartV2/legend.d.ts.map +1 -0
  120. package/dist/ChartV2/legend.js +24 -0
  121. package/dist/ChartV2/marks/area.d.ts +19 -0
  122. package/dist/ChartV2/marks/area.d.ts.map +1 -0
  123. package/dist/ChartV2/marks/area.js +109 -0
  124. package/dist/ChartV2/marks/band.d.ts +9 -0
  125. package/dist/ChartV2/marks/band.d.ts.map +1 -0
  126. package/dist/ChartV2/marks/band.js +59 -0
  127. package/dist/ChartV2/marks/bar.d.ts +17 -0
  128. package/dist/ChartV2/marks/bar.d.ts.map +1 -0
  129. package/dist/ChartV2/marks/bar.js +120 -0
  130. package/dist/ChartV2/marks/candlestick.d.ts +15 -0
  131. package/dist/ChartV2/marks/candlestick.d.ts.map +1 -0
  132. package/dist/ChartV2/marks/candlestick.js +83 -0
  133. package/dist/ChartV2/marks/dot.d.ts +15 -0
  134. package/dist/ChartV2/marks/dot.d.ts.map +1 -0
  135. package/dist/ChartV2/marks/dot.js +65 -0
  136. package/dist/ChartV2/marks/dotGL.d.ts +16 -0
  137. package/dist/ChartV2/marks/dotGL.d.ts.map +1 -0
  138. package/dist/ChartV2/marks/dotGL.js +178 -0
  139. package/dist/ChartV2/marks/dotGLInteractive.d.ts +30 -0
  140. package/dist/ChartV2/marks/dotGLInteractive.d.ts.map +1 -0
  141. package/dist/ChartV2/marks/dotGLInteractive.js +464 -0
  142. package/dist/ChartV2/marks/errorBar.d.ts +27 -0
  143. package/dist/ChartV2/marks/errorBar.d.ts.map +1 -0
  144. package/dist/ChartV2/marks/errorBar.js +87 -0
  145. package/dist/ChartV2/marks/heatmapGL.d.ts +23 -0
  146. package/dist/ChartV2/marks/heatmapGL.d.ts.map +1 -0
  147. package/dist/ChartV2/marks/heatmapGL.js +242 -0
  148. package/dist/ChartV2/marks/index.d.ts +13 -0
  149. package/dist/ChartV2/marks/index.d.ts.map +1 -0
  150. package/dist/ChartV2/marks/index.js +14 -0
  151. package/dist/ChartV2/marks/line.d.ts +18 -0
  152. package/dist/ChartV2/marks/line.d.ts.map +1 -0
  153. package/dist/ChartV2/marks/line.js +76 -0
  154. package/dist/ChartV2/marks/referenceLine.d.ts +35 -0
  155. package/dist/ChartV2/marks/referenceLine.d.ts.map +1 -0
  156. package/dist/ChartV2/marks/referenceLine.js +186 -0
  157. package/dist/ChartV2/marks/streamGL.d.ts +36 -0
  158. package/dist/ChartV2/marks/streamGL.d.ts.map +1 -0
  159. package/dist/ChartV2/marks/streamGL.js +204 -0
  160. package/dist/ChartV2/tooltip.d.ts +38 -0
  161. package/dist/ChartV2/tooltip.d.ts.map +1 -0
  162. package/dist/ChartV2/tooltip.js +54 -0
  163. package/dist/ChartV2/types.d.ts +115 -0
  164. package/dist/ChartV2/types.d.ts.map +1 -0
  165. package/dist/ChartV2/types.js +35 -0
  166. package/dist/ChatReasoning/ChatReasoning.d.ts +51 -0
  167. package/dist/ChatReasoning/ChatReasoning.d.ts.map +1 -0
  168. package/dist/ChatReasoning/ChatReasoning.js +236 -0
  169. package/dist/CircularProgress/CircularProgress.d.ts +101 -0
  170. package/dist/CircularProgress/CircularProgress.d.ts.map +1 -0
  171. package/dist/CircularProgress/CircularProgress.js +263 -0
  172. package/dist/CircularProgress/index.d.ts +6 -0
  173. package/dist/CircularProgress/index.d.ts.map +1 -0
  174. package/dist/CircularProgress/index.js +8 -0
  175. package/dist/CodeBlock/index.d.ts +8 -0
  176. package/dist/CodeBlock/index.d.ts.map +1 -0
  177. package/dist/CodeBlock/index.js +9 -0
  178. package/dist/CodeEditor/CodeEditor.d.ts +46 -0
  179. package/dist/CodeEditor/CodeEditor.d.ts.map +1 -0
  180. package/dist/CodeEditor/CodeEditor.js +396 -0
  181. package/dist/CodeEditor/index.d.ts +6 -0
  182. package/dist/CodeEditor/index.d.ts.map +1 -0
  183. package/dist/CodeEditor/index.js +7 -0
  184. package/dist/Radial/RadialArea.d.ts +25 -0
  185. package/dist/Radial/RadialArea.d.ts.map +1 -0
  186. package/dist/Radial/RadialArea.js +91 -0
  187. package/dist/Radial/RadialAxis.d.ts +14 -0
  188. package/dist/Radial/RadialAxis.d.ts.map +1 -0
  189. package/dist/Radial/RadialAxis.js +55 -0
  190. package/dist/Radial/RadialChart.d.ts +70 -0
  191. package/dist/Radial/RadialChart.d.ts.map +1 -0
  192. package/dist/Radial/RadialChart.js +174 -0
  193. package/dist/Radial/RadialContext.d.ts +5 -0
  194. package/dist/Radial/RadialContext.d.ts.map +1 -0
  195. package/dist/Radial/RadialContext.js +19 -0
  196. package/dist/Radial/RadialGrid.d.ts +14 -0
  197. package/dist/Radial/RadialGrid.d.ts.map +1 -0
  198. package/dist/Radial/RadialGrid.js +70 -0
  199. package/dist/Radial/RadialSlice.d.ts +23 -0
  200. package/dist/Radial/RadialSlice.d.ts.map +1 -0
  201. package/dist/Radial/RadialSlice.js +85 -0
  202. package/dist/Radial/RadialTooltip.d.ts +44 -0
  203. package/dist/Radial/RadialTooltip.d.ts.map +1 -0
  204. package/dist/Radial/RadialTooltip.js +284 -0
  205. package/dist/Radial/index.d.ts +9 -0
  206. package/dist/Radial/index.d.ts.map +1 -0
  207. package/dist/Radial/index.js +9 -0
  208. package/dist/Radial/types.d.ts +39 -0
  209. package/dist/Radial/types.d.ts.map +1 -0
  210. package/dist/Radial/types.js +1 -0
  211. package/dist/SVGIcon/SVGIcon.d.ts +87 -0
  212. package/dist/SVGIcon/SVGIcon.d.ts.map +1 -0
  213. package/dist/SVGIcon/SVGIcon.js +299 -0
  214. package/dist/SVGIcon/icons.d.ts +49 -0
  215. package/dist/SVGIcon/icons.d.ts.map +1 -0
  216. package/dist/SVGIcon/icons.js +326 -0
  217. package/dist/SVGIcon/index.d.ts +15 -0
  218. package/dist/SVGIcon/index.d.ts.map +1 -0
  219. package/dist/SVGIcon/index.js +22 -0
  220. package/dist/SVGIcon/pathTransforms.d.ts +35 -0
  221. package/dist/SVGIcon/pathTransforms.d.ts.map +1 -0
  222. package/dist/SVGIcon/pathTransforms.js +644 -0
  223. package/dist/SVGIcon/tokens.stylex.d.ts +37 -0
  224. package/dist/SVGIcon/tokens.stylex.d.ts.map +1 -0
  225. package/dist/SVGIcon/tokens.stylex.js +40 -0
  226. package/dist/SVGIcon/variations.stylex.d.ts +44 -0
  227. package/dist/SVGIcon/variations.stylex.d.ts.map +1 -0
  228. package/dist/SVGIcon/variations.stylex.js +119 -0
  229. package/dist/SVGIcon/xif-examples.d.ts +22 -0
  230. package/dist/SVGIcon/xif-examples.d.ts.map +1 -0
  231. package/dist/SVGIcon/xif-examples.js +202 -0
  232. package/dist/SVGIcon/xif-types.d.ts +129 -0
  233. package/dist/SVGIcon/xif-types.d.ts.map +1 -0
  234. package/dist/SVGIcon/xif-types.js +1 -0
  235. package/dist/Sankey/SankeyChart.d.ts +72 -0
  236. package/dist/Sankey/SankeyChart.d.ts.map +1 -0
  237. package/dist/Sankey/SankeyChart.js +162 -0
  238. package/dist/Sankey/SankeyContext.d.ts +5 -0
  239. package/dist/Sankey/SankeyContext.d.ts.map +1 -0
  240. package/dist/Sankey/SankeyContext.js +20 -0
  241. package/dist/Sankey/SankeyGrid.d.ts +20 -0
  242. package/dist/Sankey/SankeyGrid.d.ts.map +1 -0
  243. package/dist/Sankey/SankeyGrid.js +53 -0
  244. package/dist/Sankey/SankeyLabel.d.ts +11 -0
  245. package/dist/Sankey/SankeyLabel.d.ts.map +1 -0
  246. package/dist/Sankey/SankeyLabel.js +179 -0
  247. package/dist/Sankey/SankeyLink.d.ts +29 -0
  248. package/dist/Sankey/SankeyLink.d.ts.map +1 -0
  249. package/dist/Sankey/SankeyLink.js +139 -0
  250. package/dist/Sankey/SankeyNode.d.ts +15 -0
  251. package/dist/Sankey/SankeyNode.d.ts.map +1 -0
  252. package/dist/Sankey/SankeyNode.js +56 -0
  253. package/dist/Sankey/index.d.ts +8 -0
  254. package/dist/Sankey/index.d.ts.map +1 -0
  255. package/dist/Sankey/index.js +8 -0
  256. package/dist/Sankey/layout.d.ts +26 -0
  257. package/dist/Sankey/layout.d.ts.map +1 -0
  258. package/dist/Sankey/layout.js +157 -0
  259. package/dist/Sankey/types.d.ts +84 -0
  260. package/dist/Sankey/types.d.ts.map +1 -0
  261. package/dist/Sankey/types.js +1 -0
  262. package/dist/Schedule/CalendarEvent.d.ts +36 -0
  263. package/dist/Schedule/CalendarEvent.d.ts.map +1 -0
  264. package/dist/Schedule/CalendarEvent.js +35 -0
  265. package/dist/Schedule/DayView.d.ts +8 -0
  266. package/dist/Schedule/DayView.d.ts.map +1 -0
  267. package/dist/Schedule/DayView.js +105 -0
  268. package/dist/Schedule/ListView.d.ts +6 -0
  269. package/dist/Schedule/ListView.d.ts.map +1 -0
  270. package/dist/Schedule/ListView.js +171 -0
  271. package/dist/Schedule/MonthlyView.d.ts +6 -0
  272. package/dist/Schedule/MonthlyView.d.ts.map +1 -0
  273. package/dist/Schedule/MonthlyView.js +270 -0
  274. package/dist/Schedule/Schedule.d.ts +22 -0
  275. package/dist/Schedule/Schedule.d.ts.map +1 -0
  276. package/dist/Schedule/Schedule.js +185 -0
  277. package/dist/Schedule/TimeGridView.d.ts +12 -0
  278. package/dist/Schedule/TimeGridView.d.ts.map +1 -0
  279. package/dist/Schedule/TimeGridView.js +364 -0
  280. package/dist/Schedule/WeeklyView.d.ts +9 -0
  281. package/dist/Schedule/WeeklyView.d.ts.map +1 -0
  282. package/dist/Schedule/WeeklyView.js +112 -0
  283. package/dist/Schedule/context.d.ts +20 -0
  284. package/dist/Schedule/context.d.ts.map +1 -0
  285. package/dist/Schedule/context.js +19 -0
  286. package/dist/Schedule/dateMath.d.ts +21 -0
  287. package/dist/Schedule/dateMath.d.ts.map +1 -0
  288. package/dist/Schedule/dateMath.js +63 -0
  289. package/dist/Schedule/index.d.ts +19 -0
  290. package/dist/Schedule/index.d.ts.map +1 -0
  291. package/dist/Schedule/index.js +17 -0
  292. package/dist/Schedule/plugins/PaginationPlugin.d.ts +7 -0
  293. package/dist/Schedule/plugins/PaginationPlugin.d.ts.map +1 -0
  294. package/dist/Schedule/plugins/PaginationPlugin.js +81 -0
  295. package/dist/Schedule/plugins/ViewSelectorPlugin.d.ts +11 -0
  296. package/dist/Schedule/plugins/ViewSelectorPlugin.d.ts.map +1 -0
  297. package/dist/Schedule/plugins/ViewSelectorPlugin.js +78 -0
  298. package/dist/Schedule/plugins/index.d.ts +5 -0
  299. package/dist/Schedule/plugins/index.d.ts.map +1 -0
  300. package/dist/Schedule/plugins/index.js +14 -0
  301. package/dist/Schedule/shared.d.ts +923 -0
  302. package/dist/Schedule/shared.d.ts.map +1 -0
  303. package/dist/Schedule/shared.js +1325 -0
  304. package/dist/Schedule/types.d.ts +51 -0
  305. package/dist/Schedule/types.d.ts.map +1 -0
  306. package/dist/Schedule/types.js +1 -0
  307. package/dist/Schedule/useCurrentTime.d.ts +3 -0
  308. package/dist/Schedule/useCurrentTime.d.ts.map +1 -0
  309. package/dist/Schedule/useCurrentTime.js +43 -0
  310. package/dist/Schedule/zonedDateTime.d.ts +20 -0
  311. package/dist/Schedule/zonedDateTime.d.ts.map +1 -0
  312. package/dist/Schedule/zonedDateTime.js +31 -0
  313. package/dist/Stepper/Step.d.ts +120 -0
  314. package/dist/Stepper/Step.d.ts.map +1 -0
  315. package/dist/Stepper/Step.js +573 -0
  316. package/dist/Stepper/StepStatus.d.ts +24 -0
  317. package/dist/Stepper/StepStatus.d.ts.map +1 -0
  318. package/dist/Stepper/StepStatus.js +1 -0
  319. package/dist/Stepper/Stepper.d.ts +77 -0
  320. package/dist/Stepper/Stepper.d.ts.map +1 -0
  321. package/dist/Stepper/Stepper.js +104 -0
  322. package/dist/Stepper/StepperContext.d.ts +12 -0
  323. package/dist/Stepper/StepperContext.d.ts.map +1 -0
  324. package/dist/Stepper/StepperContext.js +24 -0
  325. package/dist/Stepper/index.d.ts +8 -0
  326. package/dist/Stepper/index.d.ts.map +1 -0
  327. package/dist/Stepper/index.js +7 -0
  328. package/dist/ThreeD/ThreeDAxis.d.ts +6 -0
  329. package/dist/ThreeD/ThreeDAxis.d.ts.map +1 -0
  330. package/dist/ThreeD/ThreeDAxis.js +75 -0
  331. package/dist/ThreeD/ThreeDBar.d.ts +7 -0
  332. package/dist/ThreeD/ThreeDBar.d.ts.map +1 -0
  333. package/dist/ThreeD/ThreeDBar.js +98 -0
  334. package/dist/ThreeD/ThreeDChart.d.ts +24 -0
  335. package/dist/ThreeD/ThreeDChart.d.ts.map +1 -0
  336. package/dist/ThreeD/ThreeDChart.js +202 -0
  337. package/dist/ThreeD/ThreeDContext.d.ts +5 -0
  338. package/dist/ThreeD/ThreeDContext.d.ts.map +1 -0
  339. package/dist/ThreeD/ThreeDContext.js +19 -0
  340. package/dist/ThreeD/ThreeDGrid.d.ts +5 -0
  341. package/dist/ThreeD/ThreeDGrid.d.ts.map +1 -0
  342. package/dist/ThreeD/ThreeDGrid.js +55 -0
  343. package/dist/ThreeD/ThreeDScatter.d.ts +7 -0
  344. package/dist/ThreeD/ThreeDScatter.d.ts.map +1 -0
  345. package/dist/ThreeD/ThreeDScatter.js +57 -0
  346. package/dist/ThreeD/ThreeDScatterGL.d.ts +7 -0
  347. package/dist/ThreeD/ThreeDScatterGL.d.ts.map +1 -0
  348. package/dist/ThreeD/ThreeDScatterGL.js +243 -0
  349. package/dist/ThreeD/ThreeDSurface.d.ts +15 -0
  350. package/dist/ThreeD/ThreeDSurface.d.ts.map +1 -0
  351. package/dist/ThreeD/ThreeDSurface.js +97 -0
  352. package/dist/ThreeD/index.d.ts +10 -0
  353. package/dist/ThreeD/index.d.ts.map +1 -0
  354. package/dist/ThreeD/index.js +10 -0
  355. package/dist/ThreeD/types.d.ts +57 -0
  356. package/dist/ThreeD/types.d.ts.map +1 -0
  357. package/dist/ThreeD/types.js +1 -0
  358. package/dist/index.d.ts +26 -0
  359. package/dist/index.d.ts.map +1 -0
  360. package/dist/index.js +47 -0
  361. package/dist/lab.css +423 -0
  362. package/package.json +69 -4
  363. package/src/Chart/Chart.tsx +312 -0
  364. package/src/Chart/ChartArea.doc.mjs +16 -0
  365. package/src/Chart/ChartArea.tsx +91 -0
  366. package/src/Chart/ChartAxis.tsx +186 -0
  367. package/src/Chart/ChartBar.doc.mjs +16 -0
  368. package/src/Chart/ChartBar.tsx +71 -0
  369. package/src/Chart/ChartBrush.tsx +237 -0
  370. package/src/Chart/ChartCandlestick.doc.mjs +16 -0
  371. package/src/Chart/ChartCandlestick.tsx +186 -0
  372. package/src/Chart/ChartContext.ts +23 -0
  373. package/src/Chart/ChartDot.doc.mjs +16 -0
  374. package/src/Chart/ChartDot.tsx +44 -0
  375. package/src/Chart/ChartDotGL.doc.mjs +16 -0
  376. package/src/Chart/ChartDotGL.tsx +151 -0
  377. package/src/Chart/ChartDotGLInteractive.doc.mjs +16 -0
  378. package/src/Chart/ChartDotGLInteractive.tsx +519 -0
  379. package/src/Chart/ChartErrorBar.tsx +84 -0
  380. package/src/Chart/ChartGrid.tsx +86 -0
  381. package/src/Chart/ChartHeatmapGL.doc.mjs +16 -0
  382. package/src/Chart/ChartHeatmapGL.tsx +219 -0
  383. package/src/Chart/ChartLegend.tsx +181 -0
  384. package/src/Chart/ChartLine.doc.mjs +16 -0
  385. package/src/Chart/ChartLine.tsx +70 -0
  386. package/src/Chart/ChartReferenceLine.tsx +76 -0
  387. package/src/Chart/ChartSelect.tsx +111 -0
  388. package/src/Chart/ChartStreamGL.doc.mjs +16 -0
  389. package/src/Chart/ChartStreamGL.tsx +189 -0
  390. package/src/Chart/ChartTooltip.tsx +451 -0
  391. package/src/Chart/ChartZoom.tsx +400 -0
  392. package/src/Chart/formatters.ts +95 -0
  393. package/src/Chart/getChartColors.ts +249 -0
  394. package/src/Chart/index.ts +90 -0
  395. package/src/Chart/m4.test.ts +66 -0
  396. package/src/Chart/m4.ts +128 -0
  397. package/src/Chart/types.ts +64 -0
  398. package/src/Chart/useChartColors.ts +34 -0
  399. package/src/Chart/useChartRange.test.ts +101 -0
  400. package/src/Chart/useChartRange.ts +146 -0
  401. package/src/Chart/utils.ts +31 -0
  402. package/src/Chart/webgl.ts +192 -0
  403. package/src/ChartV2/Chart.tsx +348 -0
  404. package/src/ChartV2/ChartAxis.tsx +209 -0
  405. package/src/ChartV2/ChartGrid.tsx +99 -0
  406. package/src/ChartV2/ChartLegend.tsx +69 -0
  407. package/src/ChartV2/ChartSwatch.doc.mjs +17 -0
  408. package/src/ChartV2/ChartSwatch.tsx +86 -0
  409. package/src/ChartV2/ChartTooltip.tsx +382 -0
  410. package/src/ChartV2/ChartV2.doc.mjs +16 -0
  411. package/src/ChartV2/ChartV2Context.ts +15 -0
  412. package/src/ChartV2/index.ts +62 -0
  413. package/src/ChartV2/layout.ts +223 -0
  414. package/src/ChartV2/legend.ts +32 -0
  415. package/src/ChartV2/marks/area.tsx +122 -0
  416. package/src/ChartV2/marks/band.tsx +70 -0
  417. package/src/ChartV2/marks/bar.tsx +159 -0
  418. package/src/ChartV2/marks/candlestick.tsx +106 -0
  419. package/src/ChartV2/marks/dot.tsx +64 -0
  420. package/src/ChartV2/marks/dotGL.tsx +202 -0
  421. package/src/ChartV2/marks/dotGLInteractive.tsx +546 -0
  422. package/src/ChartV2/marks/errorBar.tsx +89 -0
  423. package/src/ChartV2/marks/heatmapGL.tsx +299 -0
  424. package/src/ChartV2/marks/index.ts +14 -0
  425. package/src/ChartV2/marks/line.tsx +94 -0
  426. package/src/ChartV2/marks/referenceLine.tsx +224 -0
  427. package/src/ChartV2/marks/streamGL.tsx +251 -0
  428. package/src/ChartV2/tooltip.ts +70 -0
  429. package/src/ChartV2/types.ts +129 -0
  430. package/src/ChatReasoning/ChatReasoning.doc.mjs +16 -0
  431. package/src/ChatReasoning/ChatReasoning.test.tsx +56 -0
  432. package/src/ChatReasoning/ChatReasoning.tsx +322 -0
  433. package/src/CircularProgress/CircularProgress.doc.mjs +174 -0
  434. package/src/CircularProgress/CircularProgress.test.tsx +157 -0
  435. package/src/CircularProgress/CircularProgress.tsx +373 -0
  436. package/src/CircularProgress/index.ts +15 -0
  437. package/src/CodeBlock/index.ts +10 -0
  438. package/src/CodeEditor/CodeEditor.doc.mjs +16 -0
  439. package/src/CodeEditor/CodeEditor.tsx +466 -0
  440. package/src/CodeEditor/index.ts +8 -0
  441. package/src/Radial/RadialArea.tsx +103 -0
  442. package/src/Radial/RadialAxis.tsx +60 -0
  443. package/src/Radial/RadialChart.doc.mjs +16 -0
  444. package/src/Radial/RadialChart.tsx +219 -0
  445. package/src/Radial/RadialContext.ts +22 -0
  446. package/src/Radial/RadialGrid.tsx +81 -0
  447. package/src/Radial/RadialSlice.tsx +130 -0
  448. package/src/Radial/RadialTooltip.tsx +347 -0
  449. package/src/Radial/index.ts +14 -0
  450. package/src/Radial/types.ts +46 -0
  451. package/src/SVGIcon/SVGIcon.doc.mjs +16 -0
  452. package/src/SVGIcon/SVGIcon.tsx +406 -0
  453. package/src/SVGIcon/icons.ts +283 -0
  454. package/src/SVGIcon/index.ts +73 -0
  455. package/src/SVGIcon/pathTransforms.ts +612 -0
  456. package/src/SVGIcon/tokens.stylex.ts +53 -0
  457. package/src/SVGIcon/variations.stylex.ts +122 -0
  458. package/src/SVGIcon/xif-examples.ts +191 -0
  459. package/src/SVGIcon/xif-types.ts +181 -0
  460. package/src/Sankey/SankeyChart.doc.mjs +16 -0
  461. package/src/Sankey/SankeyChart.tsx +220 -0
  462. package/src/Sankey/SankeyContext.ts +23 -0
  463. package/src/Sankey/SankeyGrid.tsx +69 -0
  464. package/src/Sankey/SankeyLabel.tsx +234 -0
  465. package/src/Sankey/SankeyLink.tsx +167 -0
  466. package/src/Sankey/SankeyNode.tsx +66 -0
  467. package/src/Sankey/index.ts +22 -0
  468. package/src/Sankey/layout.ts +219 -0
  469. package/src/Sankey/types.ts +93 -0
  470. package/src/Schedule/CalendarEvent.ts +74 -0
  471. package/src/Schedule/DayView.tsx +112 -0
  472. package/src/Schedule/ListView.tsx +236 -0
  473. package/src/Schedule/MonthlyView.tsx +401 -0
  474. package/src/Schedule/Schedule.doc.mjs +16 -0
  475. package/src/Schedule/Schedule.test.tsx +405 -0
  476. package/src/Schedule/Schedule.tsx +307 -0
  477. package/src/Schedule/TimeGridView.tsx +589 -0
  478. package/src/Schedule/WeeklyView.tsx +130 -0
  479. package/src/Schedule/context.tsx +49 -0
  480. package/src/Schedule/dateMath.ts +112 -0
  481. package/src/Schedule/index.ts +61 -0
  482. package/src/Schedule/plugins/PaginationPlugin.tsx +98 -0
  483. package/src/Schedule/plugins/ViewSelectorPlugin.tsx +128 -0
  484. package/src/Schedule/plugins/index.tsx +20 -0
  485. package/src/Schedule/shared.tsx +1304 -0
  486. package/src/Schedule/types.ts +86 -0
  487. package/src/Schedule/useCurrentTime.ts +50 -0
  488. package/src/Schedule/zonedDateTime.ts +71 -0
  489. package/src/Stepper/Step.doc.mjs +17 -0
  490. package/src/Stepper/Step.tsx +756 -0
  491. package/src/Stepper/StepStatus.ts +26 -0
  492. package/src/Stepper/Stepper.doc.mjs +265 -0
  493. package/src/Stepper/Stepper.test.tsx +281 -0
  494. package/src/Stepper/Stepper.tsx +157 -0
  495. package/src/Stepper/StepperContext.ts +43 -0
  496. package/src/Stepper/index.ts +14 -0
  497. package/src/ThreeD/3DBar.doc.mjs +16 -0
  498. package/src/ThreeD/3DChart.doc.mjs +16 -0
  499. package/src/ThreeD/3DScatter.doc.mjs +16 -0
  500. package/src/ThreeD/3DScatterGL.doc.mjs +16 -0
  501. package/src/ThreeD/3DSurface.doc.mjs +16 -0
  502. package/src/ThreeD/ThreeDAxis.tsx +86 -0
  503. package/src/ThreeD/ThreeDBar.tsx +130 -0
  504. package/src/ThreeD/ThreeDChart.tsx +262 -0
  505. package/src/ThreeD/ThreeDContext.ts +22 -0
  506. package/src/ThreeD/ThreeDGrid.tsx +68 -0
  507. package/src/ThreeD/ThreeDScatter.tsx +63 -0
  508. package/src/ThreeD/ThreeDScatterGL.tsx +270 -0
  509. package/src/ThreeD/ThreeDSurface.tsx +142 -0
  510. package/src/ThreeD/index.ts +11 -0
  511. package/src/ThreeD/projection.test.ts +132 -0
  512. package/src/ThreeD/types.ts +62 -0
  513. package/src/index.ts +250 -0
@@ -0,0 +1,589 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ 'use client';
4
+
5
+ /**
6
+ * @file TimeGridView.tsx
7
+ * @input Schedule context, visible days, timezone, and hour bounds
8
+ * @output Shared weekly/day time-grid layout
9
+ * @position Internal view primitive shared by WeeklyView and DayView
10
+ */
11
+
12
+ import * as stylex from '@stylexjs/stylex';
13
+ import {
14
+ plainDateAddDays,
15
+ plainDateFromInstant,
16
+ plainDateIsBefore,
17
+ plainDateIsEqual,
18
+ plainDateToInstant,
19
+ plainDateToISO,
20
+ type PlainDate,
21
+ } from '@astryxdesign/core/utils';
22
+ import {Heading, Text} from '@astryxdesign/core/Text';
23
+ import {useScheduleContext} from './context';
24
+ import {eventOccursOnDate, isDayEvent} from './dateMath';
25
+ import {
26
+ clamp,
27
+ EventPill,
28
+ eventPastSurfaceColorStyle,
29
+ eventSurfaceColorStyle,
30
+ eventSpansPastDay,
31
+ formatEventAccessibilityLabel,
32
+ formatDayNumber,
33
+ formatEventTime,
34
+ formatFullDate,
35
+ formatHour,
36
+ formatTimezoneAbbreviation,
37
+ formatWeekday,
38
+ getEventCategory,
39
+ getMinutesSinceStartOfDay,
40
+ isEventInPast,
41
+ styles,
42
+ } from './shared';
43
+ import {useCurrentTime} from './useCurrentTime';
44
+ import type {
45
+ CalendarDayEvent,
46
+ CalendarEvent,
47
+ CalendarInstantEvent,
48
+ ScheduleCategory,
49
+ } from './types';
50
+
51
+ export function TimeGridView({
52
+ days,
53
+ events,
54
+ focusDate,
55
+ timezoneID,
56
+ minHour,
57
+ maxHour,
58
+ hourHeight,
59
+ }: {
60
+ days: PlainDate[];
61
+ events: ReadonlyArray<CalendarEvent>;
62
+ focusDate: PlainDate;
63
+ timezoneID: string;
64
+ minHour: number;
65
+ maxHour: number;
66
+ hourHeight: number;
67
+ }) {
68
+ const {categories} = useScheduleContext();
69
+ const normalizedMinHour = Math.max(0, Math.min(23, Math.floor(minHour)));
70
+ const normalizedMaxHour = Math.max(
71
+ normalizedMinHour + 1,
72
+ Math.min(24, Math.floor(maxHour)),
73
+ );
74
+ const hours = Array.from(
75
+ {length: normalizedMaxHour - normalizedMinHour},
76
+ (_, index) => normalizedMinHour + index,
77
+ );
78
+ const allDayEvents = events.filter(isDayEvent);
79
+ const allDaySegments = getAllDayEventSegments(allDayEvents, days);
80
+ const allDayLevelCount = allDaySegments.reduce(
81
+ (levelCount, segment) => Math.max(levelCount, segment.level + 1),
82
+ 0,
83
+ );
84
+ const instantEvents = events.filter(
85
+ (event): event is CalendarInstantEvent => !isDayEvent(event),
86
+ );
87
+ const currentTime = useCurrentTime();
88
+ const currentDate = plainDateFromInstant(currentTime, timezoneID);
89
+ const timezoneLabel = formatTimezoneAbbreviation(
90
+ days[0] ?? focusDate,
91
+ timezoneID,
92
+ );
93
+
94
+ return (
95
+ <>
96
+ <TimeGridAccessibilityGrid
97
+ allDayEvents={allDayEvents}
98
+ categories={categories}
99
+ days={days}
100
+ events={instantEvents}
101
+ focusDate={focusDate}
102
+ hours={hours}
103
+ timezoneID={timezoneID}
104
+ timezoneLabel={timezoneLabel}
105
+ />
106
+ <div aria-hidden {...stylex.props(styles.timeGrid)}>
107
+ <div {...stylex.props(styles.timeGridCorner)} />
108
+ <div {...stylex.props(styles.timeGridHeader)}>
109
+ {days.map((day, index) => (
110
+ <div
111
+ key={plainDateToISO(day)}
112
+ {...stylex.props(
113
+ styles.timeGridHeaderCell,
114
+ index === days.length - 1 && styles.timeGridHeaderCellLast,
115
+ )}>
116
+ <Heading
117
+ level={4}
118
+ color="secondary"
119
+ display="block"
120
+ xstyle={styles.timeGridHeaderHeading}>
121
+ <span {...stylex.props(styles.timeGridHeaderHeadingContent)}>
122
+ {formatWeekday(day, timezoneID, 'short')}
123
+ <span
124
+ {...stylex.props(
125
+ styles.timeGridDayNumber,
126
+ plainDateIsEqual(day, focusDate) &&
127
+ styles.timeGridCurrentDayPill,
128
+ )}>
129
+ {formatDayNumber(day, timezoneID)}
130
+ </span>
131
+ </span>
132
+ </Heading>
133
+ </div>
134
+ ))}
135
+ </div>
136
+ <div {...stylex.props(styles.allDayLabel)}>
137
+ <Text type="supporting" color="secondary" weight="bold">
138
+ {timezoneLabel}
139
+ </Text>
140
+ </div>
141
+ <div {...stylex.props(styles.allDayRow)}>
142
+ <div
143
+ {...stylex.props(
144
+ styles.allDayRowSurface(days.length, allDayLevelCount),
145
+ )}>
146
+ <div {...stylex.props(styles.allDayCellGrid(days.length))}>
147
+ {days.map((day, index) => (
148
+ <div
149
+ key={plainDateToISO(day)}
150
+ {...stylex.props(
151
+ styles.allDayCell,
152
+ index === days.length - 1 && styles.allDayCellLast,
153
+ )}
154
+ />
155
+ ))}
156
+ </div>
157
+ <div {...stylex.props(styles.allDayEventOverlay(days.length))}>
158
+ {allDaySegments.map(segment => (
159
+ <div
160
+ key={`${segment.event.id}:${segment.columnStart}`}
161
+ {...stylex.props(
162
+ styles.allDayEventSpan(
163
+ segment.columnStart,
164
+ segment.columnEnd,
165
+ segment.level,
166
+ ),
167
+ )}>
168
+ <EventPill
169
+ event={segment.event}
170
+ isPast={isEventInPast(
171
+ segment.event,
172
+ currentTime,
173
+ timezoneID,
174
+ )}
175
+ />
176
+ </div>
177
+ ))}
178
+ </div>
179
+ </div>
180
+ </div>
181
+ <div {...stylex.props(styles.timeGridBody)}>
182
+ <div {...stylex.props(styles.timeLabels)}>
183
+ {hours.slice(1).map((hour, index) => (
184
+ <div
185
+ key={hour}
186
+ {...stylex.props(
187
+ styles.timeLabel,
188
+ styles.timeLabelPosition(index + 1, hourHeight),
189
+ )}>
190
+ {formatHour(hour)}
191
+ </div>
192
+ ))}
193
+ </div>
194
+ <div {...stylex.props(styles.timeColumns)}>
195
+ {days.map((day, index) => {
196
+ const currentTimeTop = getCurrentTimeTop({
197
+ currentTime,
198
+ day,
199
+ timezoneID,
200
+ minHour: normalizedMinHour,
201
+ maxHour: normalizedMaxHour,
202
+ });
203
+ return (
204
+ <div
205
+ key={plainDateToISO(day)}
206
+ {...stylex.props(
207
+ styles.timeColumn,
208
+ styles.timeColumnRows(hourHeight),
209
+ index === days.length - 1 && styles.timeColumnLast,
210
+ )}>
211
+ {hours.map((hour, index) => (
212
+ <div
213
+ key={hour}
214
+ {...stylex.props(
215
+ styles.hourSlot,
216
+ index === hours.length - 1 && styles.hourSlotLast,
217
+ )}
218
+ />
219
+ ))}
220
+ {getTimedEventLayouts({
221
+ events: instantEvents.filter(event =>
222
+ eventOccursOnDate(event, day, timezoneID),
223
+ ),
224
+ day,
225
+ timezoneID,
226
+ minHour: normalizedMinHour,
227
+ maxHour: normalizedMaxHour,
228
+ }).map(({event, height, level, top}) => {
229
+ const timeLabel = formatEventTime(event, day, timezoneID);
230
+ const category = getEventCategory(event, categories);
231
+ return (
232
+ <div
233
+ key={event.id}
234
+ {...stylex.props(
235
+ styles.timedEvent,
236
+ styles.timedEventPosition(
237
+ clamp(top, 0, 100),
238
+ clamp(height, 4, 100),
239
+ level,
240
+ ),
241
+ isEventInPast(event, currentTime, timezoneID)
242
+ ? eventPastSurfaceColorStyle(category.color)
243
+ : eventSurfaceColorStyle(category.color),
244
+ )}>
245
+ <Text
246
+ type="supporting"
247
+ color="inherit"
248
+ weight="bold"
249
+ xstyle={styles.eventTitle}>
250
+ {event.title}
251
+ </Text>
252
+ <Text
253
+ type="supporting"
254
+ color="inherit"
255
+ xstyle={styles.eventTime}>
256
+ {timeLabel}
257
+ </Text>
258
+ </div>
259
+ );
260
+ })}
261
+ {plainDateIsEqual(day, currentDate) &&
262
+ currentTimeTop != null && (
263
+ <div
264
+ aria-hidden
265
+ {...stylex.props(
266
+ styles.currentTimeLine(currentTimeTop),
267
+ )}
268
+ />
269
+ )}
270
+ </div>
271
+ );
272
+ })}
273
+ </div>
274
+ </div>
275
+ </div>
276
+ </>
277
+ );
278
+ }
279
+
280
+ function TimeGridAccessibilityGrid({
281
+ allDayEvents,
282
+ categories,
283
+ days,
284
+ events,
285
+ focusDate,
286
+ hours,
287
+ timezoneID,
288
+ timezoneLabel,
289
+ }: {
290
+ allDayEvents: ReadonlyArray<CalendarDayEvent>;
291
+ categories: ReadonlyArray<ScheduleCategory>;
292
+ days: ReadonlyArray<PlainDate>;
293
+ events: ReadonlyArray<CalendarInstantEvent>;
294
+ focusDate: PlainDate;
295
+ hours: ReadonlyArray<number>;
296
+ timezoneID: string;
297
+ timezoneLabel: string;
298
+ }) {
299
+ return (
300
+ <div
301
+ role="grid"
302
+ aria-label="Schedule time grid"
303
+ aria-readonly
304
+ {...stylex.props(styles.visuallyHidden)}>
305
+ <div role="row">
306
+ <div role="columnheader" aria-colindex={1}>
307
+ Time
308
+ </div>
309
+ {days.map((day, index) => (
310
+ <div
311
+ key={plainDateToISO(day)}
312
+ role="columnheader"
313
+ aria-colindex={index + 2}
314
+ aria-current={
315
+ plainDateIsEqual(day, focusDate) ? 'date' : undefined
316
+ }>
317
+ {formatFullDate(day, timezoneID)}
318
+ </div>
319
+ ))}
320
+ </div>
321
+ <div role="row">
322
+ <div role="rowheader" aria-colindex={1}>
323
+ {timezoneLabel} all day
324
+ </div>
325
+ {days.map((day, index) => {
326
+ const cellEvents = allDayEvents.filter(event =>
327
+ eventOccursOnDate(event, day, timezoneID),
328
+ );
329
+ return (
330
+ <div
331
+ key={plainDateToISO(day)}
332
+ role="gridcell"
333
+ aria-colindex={index + 2}
334
+ aria-label={formatTimeGridAccessibilityCellLabel({
335
+ categories,
336
+ day,
337
+ events: cellEvents,
338
+ label: `${formatFullDate(day, timezoneID)} all day`,
339
+ timezoneID,
340
+ })}
341
+ />
342
+ );
343
+ })}
344
+ </div>
345
+ {hours.map(hour => (
346
+ <div key={hour} role="row">
347
+ <div role="rowheader" aria-colindex={1}>
348
+ {formatHour(hour)}
349
+ </div>
350
+ {days.map((day, index) => {
351
+ const cellEvents = events.filter(event =>
352
+ eventOverlapsHour(event, day, hour, timezoneID),
353
+ );
354
+ return (
355
+ <div
356
+ key={plainDateToISO(day)}
357
+ role="gridcell"
358
+ aria-colindex={index + 2}
359
+ aria-label={formatTimeGridAccessibilityCellLabel({
360
+ categories,
361
+ day,
362
+ events: cellEvents,
363
+ label: `${formatFullDate(day, timezoneID)} ${formatHour(
364
+ hour,
365
+ )}`,
366
+ timezoneID,
367
+ })}
368
+ />
369
+ );
370
+ })}
371
+ </div>
372
+ ))}
373
+ </div>
374
+ );
375
+ }
376
+
377
+ function formatTimeGridAccessibilityCellLabel({
378
+ categories,
379
+ day,
380
+ events,
381
+ label,
382
+ timezoneID,
383
+ }: {
384
+ categories: ReadonlyArray<ScheduleCategory>;
385
+ day: PlainDate;
386
+ events: ReadonlyArray<CalendarEvent>;
387
+ label: string;
388
+ timezoneID: string;
389
+ }): string {
390
+ if (events.length === 0) {
391
+ return label;
392
+ }
393
+ const eventLabels = events.map(event =>
394
+ formatEventAccessibilityLabel(event, day, timezoneID, categories),
395
+ );
396
+ return `${label}. ${eventLabels.join('. ')}`;
397
+ }
398
+
399
+ function eventOverlapsHour(
400
+ event: CalendarInstantEvent,
401
+ day: PlainDate,
402
+ hour: number,
403
+ timezoneID: string,
404
+ ): boolean {
405
+ if (!eventOccursOnDate(event, day, timezoneID)) {
406
+ return false;
407
+ }
408
+ const hourStart = plainDateToInstant(day, timezoneID, hour);
409
+ const hourEnd =
410
+ hour === 23
411
+ ? plainDateToInstant(plainDateAddDays(day, 1), timezoneID)
412
+ : plainDateToInstant(day, timezoneID, hour + 1);
413
+ return event.start < hourEnd && event.end > hourStart;
414
+ }
415
+
416
+ interface AllDayEventSegment {
417
+ event: CalendarDayEvent;
418
+ columnStart: number;
419
+ columnEnd: number;
420
+ level: number;
421
+ }
422
+
423
+ function getAllDayEventSegments(
424
+ events: ReadonlyArray<CalendarDayEvent>,
425
+ days: ReadonlyArray<PlainDate>,
426
+ ): AllDayEventSegment[] {
427
+ const levels: number[] = [];
428
+ return events
429
+ .map(event => {
430
+ const startIndex = days.findIndex(
431
+ day => !plainDateIsBefore(day, event.start),
432
+ );
433
+ const endIndexFromRight = [...days]
434
+ .reverse()
435
+ .findIndex(day => !plainDateIsBefore(event.end, day));
436
+ if (startIndex < 0 || endIndexFromRight < 0) {
437
+ return null;
438
+ }
439
+ const endIndex = days.length - 1 - endIndexFromRight;
440
+ return {event, startIndex, endIndex};
441
+ })
442
+ .filter(
443
+ (
444
+ segment,
445
+ ): segment is {
446
+ event: CalendarDayEvent;
447
+ startIndex: number;
448
+ endIndex: number;
449
+ } => segment != null,
450
+ )
451
+ .sort((a, b) => {
452
+ if (a.startIndex !== b.startIndex) {
453
+ return a.startIndex - b.startIndex;
454
+ }
455
+ const aDuration = a.endIndex - a.startIndex;
456
+ const bDuration = b.endIndex - b.startIndex;
457
+ return (
458
+ bDuration - aDuration || a.event.title.localeCompare(b.event.title)
459
+ );
460
+ })
461
+ .map(({event, startIndex, endIndex}) => {
462
+ const level = getAvailableAllDayLevel(levels, startIndex);
463
+ levels[level] = endIndex;
464
+ return {
465
+ event,
466
+ columnStart: startIndex,
467
+ columnEnd: endIndex,
468
+ level,
469
+ };
470
+ });
471
+ }
472
+
473
+ function getAvailableAllDayLevel(
474
+ levels: number[],
475
+ columnStart: number,
476
+ ): number {
477
+ const level = levels.findIndex(columnEnd => columnStart > columnEnd);
478
+ return level >= 0 ? level : levels.length;
479
+ }
480
+
481
+ interface TimedEventLayout {
482
+ event: CalendarInstantEvent;
483
+ top: number;
484
+ height: number;
485
+ level: number;
486
+ }
487
+
488
+ function getTimedEventLayouts({
489
+ events,
490
+ day,
491
+ timezoneID,
492
+ minHour,
493
+ maxHour,
494
+ }: {
495
+ events: ReadonlyArray<CalendarInstantEvent>;
496
+ day: PlainDate;
497
+ timezoneID: string;
498
+ minHour: number;
499
+ maxHour: number;
500
+ }): TimedEventLayout[] {
501
+ const totalMinutes = (maxHour - minHour) * 60;
502
+ const levelEndMinutes: number[] = [];
503
+
504
+ return events
505
+ .map(event => {
506
+ const startDate = plainDateFromInstant(event.start, timezoneID);
507
+ const rawStart = plainDateIsBefore(startDate, day)
508
+ ? 0
509
+ : getMinutesSinceStartOfDay(event.start, timezoneID);
510
+ const rawEnd = eventSpansPastDay(event, day, timezoneID)
511
+ ? 24 * 60
512
+ : getMinutesSinceStartOfDay(event.end, timezoneID);
513
+ const minMinute = minHour * 60;
514
+ const maxMinute = maxHour * 60;
515
+ if (rawEnd <= minMinute || rawStart >= maxMinute) {
516
+ return null;
517
+ }
518
+ const visibleStart = Math.max(rawStart, minMinute);
519
+ const visibleEnd = Math.min(
520
+ maxMinute,
521
+ Math.max(visibleStart + 15, rawEnd),
522
+ );
523
+ return {event, visibleStart, visibleEnd};
524
+ })
525
+ .filter(
526
+ (
527
+ layout,
528
+ ): layout is {
529
+ event: CalendarInstantEvent;
530
+ visibleStart: number;
531
+ visibleEnd: number;
532
+ } => layout != null && layout.visibleEnd > layout.visibleStart,
533
+ )
534
+ .sort((a, b) => {
535
+ if (a.visibleStart !== b.visibleStart) {
536
+ return a.visibleStart - b.visibleStart;
537
+ }
538
+ return (
539
+ a.visibleEnd - b.visibleEnd ||
540
+ a.event.title.localeCompare(b.event.title)
541
+ );
542
+ })
543
+ .map(({event, visibleEnd, visibleStart}) => {
544
+ const level = getAvailableTimedEventLevel(levelEndMinutes, visibleStart);
545
+ levelEndMinutes[level] = visibleEnd;
546
+ return {
547
+ event,
548
+ level,
549
+ top: ((visibleStart - minHour * 60) / totalMinutes) * 100,
550
+ height: ((visibleEnd - visibleStart) / totalMinutes) * 100,
551
+ };
552
+ });
553
+ }
554
+
555
+ function getAvailableTimedEventLevel(
556
+ levelEndMinutes: number[],
557
+ visibleStart: number,
558
+ ): number {
559
+ const level = levelEndMinutes.findIndex(
560
+ endMinute => visibleStart >= endMinute,
561
+ );
562
+ return level >= 0 ? level : levelEndMinutes.length;
563
+ }
564
+
565
+ function getCurrentTimeTop({
566
+ currentTime,
567
+ day,
568
+ timezoneID,
569
+ minHour,
570
+ maxHour,
571
+ }: {
572
+ currentTime: number;
573
+ day: PlainDate;
574
+ timezoneID: string;
575
+ minHour: number;
576
+ maxHour: number;
577
+ }): number | null {
578
+ const currentDate = plainDateFromInstant(currentTime, timezoneID);
579
+ if (!plainDateIsEqual(day, currentDate)) {
580
+ return null;
581
+ }
582
+ const currentMinute = getMinutesSinceStartOfDay(currentTime, timezoneID);
583
+ const minMinute = minHour * 60;
584
+ const maxMinute = maxHour * 60;
585
+ if (currentMinute < minMinute || currentMinute > maxMinute) {
586
+ return null;
587
+ }
588
+ return ((currentMinute - minMinute) / (maxMinute - minMinute)) * 100;
589
+ }
@@ -0,0 +1,130 @@
1
+ // Copyright (c) Meta Platforms, Inc. and affiliates.
2
+
3
+ 'use client';
4
+
5
+ /**
6
+ * @file WeeklyView.tsx
7
+ * @input Schedule context and weekly view options
8
+ * @output Week time-grid schedule view factory
9
+ * @position Concrete schedule view; exported as createScheduleWeeklyView
10
+ */
11
+
12
+ import {plainDateAddDays, plainDateSetStartOfWeek} from '@astryxdesign/core/utils';
13
+ import {enumerateDates, getScheduleRangeFromDates} from './dateMath';
14
+ import {useScheduleContext} from './context';
15
+ import {
16
+ formatWeekTitle,
17
+ ScheduleFrame,
18
+ ScheduleRangeMonthTitle,
19
+ } from './shared';
20
+ import {TimeGridView} from './TimeGridView';
21
+ import {scheduleRangeToZonedDateTimeRange} from './zonedDateTime';
22
+ import type {
23
+ PlainDate,
24
+ ScheduleView,
25
+ ScheduleViewComponentProps,
26
+ } from './types';
27
+
28
+ export interface ScheduleWeeklyViewOptions {
29
+ weekStartsOn?: 0 | 1 | 2 | 3 | 4 | 5 | 6;
30
+ minHour?: number;
31
+ maxHour?: number;
32
+ hourHeight?: number;
33
+ }
34
+
35
+ function ScheduleWeeklyView({
36
+ options,
37
+ }: ScheduleViewComponentProps<ScheduleWeeklyViewOptions>) {
38
+ const {events, focusDate, timezoneID, range, isLoading} =
39
+ useScheduleContext();
40
+ const {minHour = 0, maxHour = 24, hourHeight = 100} = options;
41
+ const days = enumerateDates(range.startDate, range.endDate);
42
+ const highlightedDate = focusDate.toPlainDate();
43
+ const titleLabel = formatWeekTitle(
44
+ days[0],
45
+ days[days.length - 1],
46
+ timezoneID,
47
+ );
48
+
49
+ return (
50
+ <ScheduleFrame
51
+ title={
52
+ <ScheduleRangeMonthTitle
53
+ start={days[0]}
54
+ end={days[days.length - 1]}
55
+ timezoneID={timezoneID}
56
+ />
57
+ }
58
+ titleLabel={titleLabel}
59
+ isLoading={isLoading}>
60
+ <TimeGridView
61
+ days={days}
62
+ events={events}
63
+ focusDate={highlightedDate}
64
+ timezoneID={timezoneID}
65
+ minHour={minHour}
66
+ maxHour={maxHour}
67
+ hourHeight={hourHeight}
68
+ />
69
+ </ScheduleFrame>
70
+ );
71
+ }
72
+
73
+ export function createScheduleWeeklyView({
74
+ weekStartsOn = 0,
75
+ minHour = 0,
76
+ maxHour = 24,
77
+ hourHeight = 100,
78
+ }: ScheduleWeeklyViewOptions = {}): ScheduleView<ScheduleWeeklyViewOptions> {
79
+ return {
80
+ component: ScheduleWeeklyView,
81
+ options: {weekStartsOn, minHour, maxHour, hourHeight},
82
+ getDateRange: date => {
83
+ const range = getWeekDateRange({
84
+ date: date.toPlainDate(),
85
+ timezoneID: date.timezoneID,
86
+ weekStartsOn,
87
+ });
88
+ return scheduleRangeToZonedDateTimeRange(range, date.timezoneID);
89
+ },
90
+ getPreviousDateRange: date => {
91
+ const range = getWeekDateRange({
92
+ date: plainDateAddDays(date.toPlainDate(), -7),
93
+ timezoneID: date.timezoneID,
94
+ weekStartsOn,
95
+ });
96
+ return {
97
+ label: 'Previous week',
98
+ range: scheduleRangeToZonedDateTimeRange(range, date.timezoneID),
99
+ };
100
+ },
101
+ getNextDateRange: date => {
102
+ const range = getWeekDateRange({
103
+ date: plainDateAddDays(date.toPlainDate(), 7),
104
+ timezoneID: date.timezoneID,
105
+ weekStartsOn,
106
+ });
107
+ return {
108
+ label: 'Next week',
109
+ range: scheduleRangeToZonedDateTimeRange(range, date.timezoneID),
110
+ };
111
+ },
112
+ };
113
+ }
114
+
115
+ function getWeekDateRange({
116
+ date,
117
+ timezoneID,
118
+ weekStartsOn,
119
+ }: {
120
+ date: PlainDate;
121
+ timezoneID: string;
122
+ weekStartsOn: number;
123
+ }) {
124
+ const startDate = plainDateSetStartOfWeek(date, weekStartsOn);
125
+ return getScheduleRangeFromDates({
126
+ startDate,
127
+ endDate: plainDateAddDays(startDate, 7),
128
+ timezoneID,
129
+ });
130
+ }