@multiplatform.one/components 7.7.6 → 7.8.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 (565) hide show
  1. package/dist/cjs/Button.native.js.map +1 -1
  2. package/dist/cjs/Card.cjs +7 -1
  3. package/dist/cjs/Card.native.js +11 -1
  4. package/dist/cjs/Card.native.js.map +1 -1
  5. package/dist/cjs/CardFooter.cjs +1 -0
  6. package/dist/cjs/CardFooter.native.js +1 -0
  7. package/dist/cjs/CardFooter.native.js.map +1 -1
  8. package/dist/cjs/CopyField/index.cjs +6 -1
  9. package/dist/cjs/CopyField/index.native.js +6 -1
  10. package/dist/cjs/CopyField/index.native.js.map +1 -1
  11. package/dist/cjs/DropdownMenu/index.cjs +31 -1
  12. package/dist/cjs/DropdownMenu/index.native.js +31 -1
  13. package/dist/cjs/DropdownMenu/index.native.js.map +1 -1
  14. package/dist/cjs/Meter/index.cjs +12 -5
  15. package/dist/cjs/Meter/index.native.js +12 -5
  16. package/dist/cjs/Meter/index.native.js.map +1 -1
  17. package/dist/cjs/Tabs/index.cjs +7 -6
  18. package/dist/cjs/Tabs/index.native.js +8 -7
  19. package/dist/cjs/Tabs/index.native.js.map +1 -1
  20. package/dist/cjs/Toast/index.cjs +53 -2
  21. package/dist/cjs/Toast/index.native.js +55 -2
  22. package/dist/cjs/Toast/index.native.js.map +1 -1
  23. package/dist/cjs/actions/DestructiveAction.cjs +7 -13
  24. package/dist/cjs/actions/DestructiveAction.native.js +7 -15
  25. package/dist/cjs/actions/DestructiveAction.native.js.map +1 -1
  26. package/dist/cjs/charts/Axis.cjs +5 -0
  27. package/dist/cjs/charts/Axis.native.js +5 -0
  28. package/dist/cjs/charts/Axis.native.js.map +1 -1
  29. package/dist/cjs/charts/BarChart.cjs +71 -57
  30. package/dist/cjs/charts/BarChart.native.js +81 -67
  31. package/dist/cjs/charts/BarChart.native.js.map +1 -1
  32. package/dist/cjs/charts/ChartDataView.cjs +212 -0
  33. package/dist/cjs/charts/ChartDataView.native.js +224 -0
  34. package/dist/cjs/charts/ChartDataView.native.js.map +1 -0
  35. package/dist/cjs/charts/ChartSurface.cjs +5 -1
  36. package/dist/cjs/charts/ChartSurface.native.js +5 -1
  37. package/dist/cjs/charts/ChartSurface.native.js.map +1 -1
  38. package/dist/cjs/charts/LineChart.cjs +81 -67
  39. package/dist/cjs/charts/LineChart.native.js +94 -80
  40. package/dist/cjs/charts/LineChart.native.js.map +1 -1
  41. package/dist/cjs/charts/PieChart.cjs +98 -73
  42. package/dist/cjs/charts/PieChart.native.js +109 -84
  43. package/dist/cjs/charts/PieChart.native.js.map +1 -1
  44. package/dist/cjs/charts/Sparkline.cjs +10 -1
  45. package/dist/cjs/charts/Sparkline.native.js +10 -1
  46. package/dist/cjs/charts/Sparkline.native.js.map +1 -1
  47. package/dist/cjs/charts/accessibility.cjs +4 -0
  48. package/dist/cjs/charts/accessibility.native.js +7 -0
  49. package/dist/cjs/charts/accessibility.native.js.map +1 -1
  50. package/dist/cjs/charts/index.cjs +3 -1
  51. package/dist/cjs/charts/index.native.js +2 -0
  52. package/dist/cjs/charts/index.native.js.map +1 -1
  53. package/dist/cjs/charts/math.cjs +16 -0
  54. package/dist/cjs/charts/math.native.js +18 -0
  55. package/dist/cjs/charts/math.native.js.map +1 -1
  56. package/dist/cjs/charts/series.cjs +49 -7
  57. package/dist/cjs/charts/series.native.js +53 -11
  58. package/dist/cjs/charts/series.native.js.map +1 -1
  59. package/dist/cjs/charts/svg.cjs +46 -3
  60. package/dist/cjs/charts/svg.native.js +46 -3
  61. package/dist/cjs/charts/svg.native.js.map +1 -1
  62. package/dist/cjs/code/CodeBlock/index.cjs +6 -1
  63. package/dist/cjs/code/CodeBlock/index.native.js +6 -1
  64. package/dist/cjs/code/CodeBlock/index.native.js.map +1 -1
  65. package/dist/cjs/feedback/ConfirmDialog.cjs +7 -21
  66. package/dist/cjs/feedback/ConfirmDialog.native.js +7 -22
  67. package/dist/cjs/feedback/ConfirmDialog.native.js.map +1 -1
  68. package/dist/cjs/feedback/NotifyHost.cjs +2 -1
  69. package/dist/cjs/feedback/NotifyHost.native.js +3 -2
  70. package/dist/cjs/feedback/NotifyHost.native.js.map +1 -1
  71. package/dist/cjs/feedback/copy.cjs +36 -4
  72. package/dist/cjs/feedback/copy.native.js +38 -4
  73. package/dist/cjs/feedback/copy.native.js.map +1 -1
  74. package/dist/cjs/feedback/index.cjs +1 -0
  75. package/dist/cjs/feedback/index.native.js +1 -0
  76. package/dist/cjs/feedback/index.native.js.map +1 -1
  77. package/dist/cjs/feedback/notify.cjs +1 -0
  78. package/dist/cjs/feedback/notify.native.js +1 -0
  79. package/dist/cjs/feedback/notify.native.js.map +1 -1
  80. package/dist/cjs/feedback/route.cjs +3 -0
  81. package/dist/cjs/feedback/route.native.js +3 -0
  82. package/dist/cjs/feedback/route.native.js.map +1 -1
  83. package/dist/cjs/feedback/store.cjs +6 -0
  84. package/dist/cjs/feedback/store.native.js +8 -0
  85. package/dist/cjs/feedback/store.native.js.map +1 -1
  86. package/dist/cjs/icons/lucide.cjs +2 -1
  87. package/dist/cjs/icons/lucide.native.js +2 -1
  88. package/dist/cjs/icons/lucide.native.js.map +1 -1
  89. package/dist/cjs/layouts/PaneScaffold.cjs +96 -41
  90. package/dist/cjs/layouts/PaneScaffold.native.js +97 -41
  91. package/dist/cjs/layouts/PaneScaffold.native.js.map +1 -1
  92. package/dist/cjs/layouts/index.cjs +2 -0
  93. package/dist/cjs/layouts/index.native.js +2 -0
  94. package/dist/cjs/layouts/index.native.js.map +1 -1
  95. package/dist/cjs/layouts/page.cjs +48 -7
  96. package/dist/cjs/layouts/page.native.js +50 -7
  97. package/dist/cjs/layouts/page.native.js.map +1 -1
  98. package/dist/cjs/shared/useKeyboardInset.cjs +1 -19
  99. package/dist/cjs/shared/useKeyboardInset.native.js +3 -3
  100. package/dist/cjs/shared/useKeyboardInset.native.js.map +1 -1
  101. package/dist/cjs/views/Dashboard.cjs +110 -17
  102. package/dist/cjs/views/Dashboard.native.js +151 -45
  103. package/dist/cjs/views/Dashboard.native.js.map +1 -1
  104. package/dist/cjs/views/Gantt.cjs +374 -91
  105. package/dist/cjs/views/Gantt.native.js +443 -94
  106. package/dist/cjs/views/Gantt.native.js.map +1 -1
  107. package/dist/cjs/views/ganttMath.cjs +91 -2
  108. package/dist/cjs/views/ganttMath.native.js +113 -3
  109. package/dist/cjs/views/ganttMath.native.js.map +1 -1
  110. package/dist/cjs/views/index.cjs +20 -1
  111. package/dist/cjs/views/index.native.js +20 -1
  112. package/dist/cjs/views/index.native.js.map +1 -1
  113. package/dist/esm/Button.mjs.map +1 -1
  114. package/dist/esm/Button.native.js.map +1 -1
  115. package/dist/esm/Card.mjs +8 -2
  116. package/dist/esm/Card.mjs.map +1 -1
  117. package/dist/esm/Card.native.js +12 -2
  118. package/dist/esm/Card.native.js.map +1 -1
  119. package/dist/esm/CardFooter.mjs +1 -0
  120. package/dist/esm/CardFooter.mjs.map +1 -1
  121. package/dist/esm/CardFooter.native.js +1 -0
  122. package/dist/esm/CardFooter.native.js.map +1 -1
  123. package/dist/esm/CopyField/index.mjs +7 -2
  124. package/dist/esm/CopyField/index.mjs.map +1 -1
  125. package/dist/esm/CopyField/index.native.js +7 -2
  126. package/dist/esm/CopyField/index.native.js.map +1 -1
  127. package/dist/esm/DropdownMenu/index.mjs +32 -2
  128. package/dist/esm/DropdownMenu/index.mjs.map +1 -1
  129. package/dist/esm/DropdownMenu/index.native.js +32 -2
  130. package/dist/esm/DropdownMenu/index.native.js.map +1 -1
  131. package/dist/esm/Meter/index.mjs +12 -5
  132. package/dist/esm/Meter/index.mjs.map +1 -1
  133. package/dist/esm/Meter/index.native.js +12 -5
  134. package/dist/esm/Meter/index.native.js.map +1 -1
  135. package/dist/esm/Tabs/index.mjs +7 -6
  136. package/dist/esm/Tabs/index.mjs.map +1 -1
  137. package/dist/esm/Tabs/index.native.js +8 -7
  138. package/dist/esm/Tabs/index.native.js.map +1 -1
  139. package/dist/esm/Toast/index.mjs +52 -3
  140. package/dist/esm/Toast/index.mjs.map +1 -1
  141. package/dist/esm/Toast/index.native.js +54 -3
  142. package/dist/esm/Toast/index.native.js.map +1 -1
  143. package/dist/esm/actions/DestructiveAction.mjs +8 -14
  144. package/dist/esm/actions/DestructiveAction.mjs.map +1 -1
  145. package/dist/esm/actions/DestructiveAction.native.js +8 -16
  146. package/dist/esm/actions/DestructiveAction.native.js.map +1 -1
  147. package/dist/esm/charts/Axis.mjs +6 -1
  148. package/dist/esm/charts/Axis.mjs.map +1 -1
  149. package/dist/esm/charts/Axis.native.js +6 -1
  150. package/dist/esm/charts/Axis.native.js.map +1 -1
  151. package/dist/esm/charts/BarChart.mjs +72 -58
  152. package/dist/esm/charts/BarChart.mjs.map +1 -1
  153. package/dist/esm/charts/BarChart.native.js +82 -68
  154. package/dist/esm/charts/BarChart.native.js.map +1 -1
  155. package/dist/esm/charts/ChartDataView.mjs +185 -0
  156. package/dist/esm/charts/ChartDataView.mjs.map +1 -0
  157. package/dist/esm/charts/ChartDataView.native.js +194 -0
  158. package/dist/esm/charts/ChartDataView.native.js.map +1 -0
  159. package/dist/esm/charts/ChartSurface.mjs +5 -1
  160. package/dist/esm/charts/ChartSurface.mjs.map +1 -1
  161. package/dist/esm/charts/ChartSurface.native.js +5 -1
  162. package/dist/esm/charts/ChartSurface.native.js.map +1 -1
  163. package/dist/esm/charts/LineChart.mjs +82 -68
  164. package/dist/esm/charts/LineChart.mjs.map +1 -1
  165. package/dist/esm/charts/LineChart.native.js +95 -81
  166. package/dist/esm/charts/LineChart.native.js.map +1 -1
  167. package/dist/esm/charts/PieChart.mjs +100 -75
  168. package/dist/esm/charts/PieChart.mjs.map +1 -1
  169. package/dist/esm/charts/PieChart.native.js +111 -86
  170. package/dist/esm/charts/PieChart.native.js.map +1 -1
  171. package/dist/esm/charts/Sparkline.mjs +11 -2
  172. package/dist/esm/charts/Sparkline.mjs.map +1 -1
  173. package/dist/esm/charts/Sparkline.native.js +11 -2
  174. package/dist/esm/charts/Sparkline.native.js.map +1 -1
  175. package/dist/esm/charts/accessibility.mjs +4 -1
  176. package/dist/esm/charts/accessibility.mjs.map +1 -1
  177. package/dist/esm/charts/accessibility.native.js +7 -1
  178. package/dist/esm/charts/accessibility.native.js.map +1 -1
  179. package/dist/esm/charts/index.mjs +2 -1
  180. package/dist/esm/charts/index.mjs.map +1 -1
  181. package/dist/esm/charts/index.native.js +2 -1
  182. package/dist/esm/charts/index.native.js.map +1 -1
  183. package/dist/esm/charts/math.mjs +16 -1
  184. package/dist/esm/charts/math.mjs.map +1 -1
  185. package/dist/esm/charts/math.native.js +18 -1
  186. package/dist/esm/charts/math.native.js.map +1 -1
  187. package/dist/esm/charts/series.mjs +51 -9
  188. package/dist/esm/charts/series.mjs.map +1 -1
  189. package/dist/esm/charts/series.native.js +55 -13
  190. package/dist/esm/charts/series.native.js.map +1 -1
  191. package/dist/esm/charts/svg.mjs +40 -4
  192. package/dist/esm/charts/svg.mjs.map +1 -1
  193. package/dist/esm/charts/svg.native.js +40 -4
  194. package/dist/esm/charts/svg.native.js.map +1 -1
  195. package/dist/esm/code/CodeBlock/index.mjs +7 -2
  196. package/dist/esm/code/CodeBlock/index.mjs.map +1 -1
  197. package/dist/esm/code/CodeBlock/index.native.js +7 -2
  198. package/dist/esm/code/CodeBlock/index.native.js.map +1 -1
  199. package/dist/esm/feedback/ConfirmDialog.mjs +8 -22
  200. package/dist/esm/feedback/ConfirmDialog.mjs.map +1 -1
  201. package/dist/esm/feedback/ConfirmDialog.native.js +8 -23
  202. package/dist/esm/feedback/ConfirmDialog.native.js.map +1 -1
  203. package/dist/esm/feedback/NotifyHost.mjs +2 -1
  204. package/dist/esm/feedback/NotifyHost.mjs.map +1 -1
  205. package/dist/esm/feedback/NotifyHost.native.js +3 -2
  206. package/dist/esm/feedback/NotifyHost.native.js.map +1 -1
  207. package/dist/esm/feedback/copy.mjs +35 -4
  208. package/dist/esm/feedback/copy.mjs.map +1 -1
  209. package/dist/esm/feedback/copy.native.js +37 -4
  210. package/dist/esm/feedback/copy.native.js.map +1 -1
  211. package/dist/esm/feedback/index.mjs +2 -2
  212. package/dist/esm/feedback/index.mjs.map +1 -1
  213. package/dist/esm/feedback/index.native.js +2 -2
  214. package/dist/esm/feedback/index.native.js.map +1 -1
  215. package/dist/esm/feedback/notify.mjs +1 -0
  216. package/dist/esm/feedback/notify.mjs.map +1 -1
  217. package/dist/esm/feedback/notify.native.js +1 -0
  218. package/dist/esm/feedback/notify.native.js.map +1 -1
  219. package/dist/esm/feedback/route.mjs +3 -0
  220. package/dist/esm/feedback/route.mjs.map +1 -1
  221. package/dist/esm/feedback/route.native.js +3 -0
  222. package/dist/esm/feedback/route.native.js.map +1 -1
  223. package/dist/esm/feedback/store.mjs +6 -1
  224. package/dist/esm/feedback/store.mjs.map +1 -1
  225. package/dist/esm/feedback/store.native.js +8 -1
  226. package/dist/esm/feedback/store.native.js.map +1 -1
  227. package/dist/esm/icons/lucide.mjs +2 -2
  228. package/dist/esm/icons/lucide.mjs.map +1 -1
  229. package/dist/esm/icons/lucide.native.js +2 -2
  230. package/dist/esm/icons/lucide.native.js.map +1 -1
  231. package/dist/esm/layouts/PaneScaffold.mjs +97 -42
  232. package/dist/esm/layouts/PaneScaffold.mjs.map +1 -1
  233. package/dist/esm/layouts/PaneScaffold.native.js +98 -42
  234. package/dist/esm/layouts/PaneScaffold.native.js.map +1 -1
  235. package/dist/esm/layouts/index.mjs +2 -1
  236. package/dist/esm/layouts/index.mjs.map +1 -1
  237. package/dist/esm/layouts/index.native.js +2 -1
  238. package/dist/esm/layouts/index.native.js.map +1 -1
  239. package/dist/esm/layouts/page.mjs +49 -8
  240. package/dist/esm/layouts/page.mjs.map +1 -1
  241. package/dist/esm/layouts/page.native.js +51 -8
  242. package/dist/esm/layouts/page.native.js.map +1 -1
  243. package/dist/esm/shared/useKeyboardInset.mjs +1 -19
  244. package/dist/esm/shared/useKeyboardInset.mjs.map +1 -1
  245. package/dist/esm/shared/useKeyboardInset.native.js.map +1 -1
  246. package/dist/esm/views/Dashboard.mjs +112 -19
  247. package/dist/esm/views/Dashboard.mjs.map +1 -1
  248. package/dist/esm/views/Dashboard.native.js +153 -47
  249. package/dist/esm/views/Dashboard.native.js.map +1 -1
  250. package/dist/esm/views/Gantt.mjs +376 -93
  251. package/dist/esm/views/Gantt.mjs.map +1 -1
  252. package/dist/esm/views/Gantt.native.js +445 -96
  253. package/dist/esm/views/Gantt.native.js.map +1 -1
  254. package/dist/esm/views/ganttMath.mjs +84 -3
  255. package/dist/esm/views/ganttMath.mjs.map +1 -1
  256. package/dist/esm/views/ganttMath.native.js +106 -4
  257. package/dist/esm/views/ganttMath.native.js.map +1 -1
  258. package/dist/esm/views/index.mjs +2 -2
  259. package/dist/esm/views/index.mjs.map +1 -1
  260. package/dist/esm/views/index.native.js +2 -2
  261. package/dist/esm/views/index.native.js.map +1 -1
  262. package/dist/jsx/Button.mjs.map +1 -1
  263. package/dist/jsx/Button.native.js.map +1 -1
  264. package/dist/jsx/Card.mjs +8 -2
  265. package/dist/jsx/Card.mjs.map +1 -1
  266. package/dist/jsx/Card.native.js +11 -1
  267. package/dist/jsx/Card.native.js.map +1 -1
  268. package/dist/jsx/CardFooter.mjs +1 -0
  269. package/dist/jsx/CardFooter.mjs.map +1 -1
  270. package/dist/jsx/CardFooter.native.js +1 -0
  271. package/dist/jsx/CardFooter.native.js.map +1 -1
  272. package/dist/jsx/CopyField/index.mjs +7 -2
  273. package/dist/jsx/CopyField/index.mjs.map +1 -1
  274. package/dist/jsx/CopyField/index.native.js +6 -1
  275. package/dist/jsx/CopyField/index.native.js.map +1 -1
  276. package/dist/jsx/DropdownMenu/index.mjs +32 -2
  277. package/dist/jsx/DropdownMenu/index.mjs.map +1 -1
  278. package/dist/jsx/DropdownMenu/index.native.js +31 -1
  279. package/dist/jsx/DropdownMenu/index.native.js.map +1 -1
  280. package/dist/jsx/Meter/index.mjs +12 -5
  281. package/dist/jsx/Meter/index.mjs.map +1 -1
  282. package/dist/jsx/Meter/index.native.js +12 -5
  283. package/dist/jsx/Meter/index.native.js.map +1 -1
  284. package/dist/jsx/Tabs/index.mjs +7 -6
  285. package/dist/jsx/Tabs/index.mjs.map +1 -1
  286. package/dist/jsx/Tabs/index.native.js +8 -7
  287. package/dist/jsx/Tabs/index.native.js.map +1 -1
  288. package/dist/jsx/Toast/index.mjs +52 -3
  289. package/dist/jsx/Toast/index.mjs.map +1 -1
  290. package/dist/jsx/Toast/index.native.js +55 -2
  291. package/dist/jsx/Toast/index.native.js.map +1 -1
  292. package/dist/jsx/actions/DestructiveAction.mjs +8 -14
  293. package/dist/jsx/actions/DestructiveAction.mjs.map +1 -1
  294. package/dist/jsx/actions/DestructiveAction.native.js +7 -15
  295. package/dist/jsx/actions/DestructiveAction.native.js.map +1 -1
  296. package/dist/jsx/charts/Axis.mjs +6 -1
  297. package/dist/jsx/charts/Axis.mjs.map +1 -1
  298. package/dist/jsx/charts/Axis.native.js +5 -0
  299. package/dist/jsx/charts/Axis.native.js.map +1 -1
  300. package/dist/jsx/charts/BarChart.mjs +72 -58
  301. package/dist/jsx/charts/BarChart.mjs.map +1 -1
  302. package/dist/jsx/charts/BarChart.native.js +81 -67
  303. package/dist/jsx/charts/BarChart.native.js.map +1 -1
  304. package/dist/jsx/charts/ChartDataView.mjs +185 -0
  305. package/dist/jsx/charts/ChartDataView.mjs.map +1 -0
  306. package/dist/jsx/charts/ChartDataView.native.js +224 -0
  307. package/dist/jsx/charts/ChartDataView.native.js.map +1 -0
  308. package/dist/jsx/charts/ChartSurface.mjs +5 -1
  309. package/dist/jsx/charts/ChartSurface.mjs.map +1 -1
  310. package/dist/jsx/charts/ChartSurface.native.js +5 -1
  311. package/dist/jsx/charts/ChartSurface.native.js.map +1 -1
  312. package/dist/jsx/charts/LineChart.mjs +82 -68
  313. package/dist/jsx/charts/LineChart.mjs.map +1 -1
  314. package/dist/jsx/charts/LineChart.native.js +94 -80
  315. package/dist/jsx/charts/LineChart.native.js.map +1 -1
  316. package/dist/jsx/charts/PieChart.mjs +100 -75
  317. package/dist/jsx/charts/PieChart.mjs.map +1 -1
  318. package/dist/jsx/charts/PieChart.native.js +109 -84
  319. package/dist/jsx/charts/PieChart.native.js.map +1 -1
  320. package/dist/jsx/charts/Sparkline.mjs +11 -2
  321. package/dist/jsx/charts/Sparkline.mjs.map +1 -1
  322. package/dist/jsx/charts/Sparkline.native.js +10 -1
  323. package/dist/jsx/charts/Sparkline.native.js.map +1 -1
  324. package/dist/jsx/charts/accessibility.mjs +4 -1
  325. package/dist/jsx/charts/accessibility.mjs.map +1 -1
  326. package/dist/jsx/charts/accessibility.native.js +7 -0
  327. package/dist/jsx/charts/accessibility.native.js.map +1 -1
  328. package/dist/jsx/charts/index.mjs +2 -1
  329. package/dist/jsx/charts/index.mjs.map +1 -1
  330. package/dist/jsx/charts/index.native.js +2 -0
  331. package/dist/jsx/charts/index.native.js.map +1 -1
  332. package/dist/jsx/charts/math.mjs +16 -1
  333. package/dist/jsx/charts/math.mjs.map +1 -1
  334. package/dist/jsx/charts/math.native.js +18 -0
  335. package/dist/jsx/charts/math.native.js.map +1 -1
  336. package/dist/jsx/charts/series.mjs +51 -9
  337. package/dist/jsx/charts/series.mjs.map +1 -1
  338. package/dist/jsx/charts/series.native.js +53 -11
  339. package/dist/jsx/charts/series.native.js.map +1 -1
  340. package/dist/jsx/charts/svg.mjs +40 -4
  341. package/dist/jsx/charts/svg.mjs.map +1 -1
  342. package/dist/jsx/charts/svg.native.js +46 -3
  343. package/dist/jsx/charts/svg.native.js.map +1 -1
  344. package/dist/jsx/code/CodeBlock/index.mjs +7 -2
  345. package/dist/jsx/code/CodeBlock/index.mjs.map +1 -1
  346. package/dist/jsx/code/CodeBlock/index.native.js +6 -1
  347. package/dist/jsx/code/CodeBlock/index.native.js.map +1 -1
  348. package/dist/jsx/feedback/ConfirmDialog.mjs +8 -22
  349. package/dist/jsx/feedback/ConfirmDialog.mjs.map +1 -1
  350. package/dist/jsx/feedback/ConfirmDialog.native.js +7 -22
  351. package/dist/jsx/feedback/ConfirmDialog.native.js.map +1 -1
  352. package/dist/jsx/feedback/NotifyHost.mjs +2 -1
  353. package/dist/jsx/feedback/NotifyHost.mjs.map +1 -1
  354. package/dist/jsx/feedback/NotifyHost.native.js +3 -2
  355. package/dist/jsx/feedback/NotifyHost.native.js.map +1 -1
  356. package/dist/jsx/feedback/copy.mjs +35 -4
  357. package/dist/jsx/feedback/copy.mjs.map +1 -1
  358. package/dist/jsx/feedback/copy.native.js +38 -4
  359. package/dist/jsx/feedback/copy.native.js.map +1 -1
  360. package/dist/jsx/feedback/index.mjs +2 -2
  361. package/dist/jsx/feedback/index.mjs.map +1 -1
  362. package/dist/jsx/feedback/index.native.js +1 -0
  363. package/dist/jsx/feedback/index.native.js.map +1 -1
  364. package/dist/jsx/feedback/notify.mjs +1 -0
  365. package/dist/jsx/feedback/notify.mjs.map +1 -1
  366. package/dist/jsx/feedback/notify.native.js +1 -0
  367. package/dist/jsx/feedback/notify.native.js.map +1 -1
  368. package/dist/jsx/feedback/route.mjs +3 -0
  369. package/dist/jsx/feedback/route.mjs.map +1 -1
  370. package/dist/jsx/feedback/route.native.js +3 -0
  371. package/dist/jsx/feedback/route.native.js.map +1 -1
  372. package/dist/jsx/feedback/store.mjs +6 -1
  373. package/dist/jsx/feedback/store.mjs.map +1 -1
  374. package/dist/jsx/feedback/store.native.js +8 -0
  375. package/dist/jsx/feedback/store.native.js.map +1 -1
  376. package/dist/jsx/icons/lucide.mjs +2 -2
  377. package/dist/jsx/icons/lucide.mjs.map +1 -1
  378. package/dist/jsx/icons/lucide.native.js +2 -1
  379. package/dist/jsx/layouts/PaneScaffold.mjs +97 -42
  380. package/dist/jsx/layouts/PaneScaffold.mjs.map +1 -1
  381. package/dist/jsx/layouts/PaneScaffold.native.js +97 -41
  382. package/dist/jsx/layouts/PaneScaffold.native.js.map +1 -1
  383. package/dist/jsx/layouts/index.mjs +2 -1
  384. package/dist/jsx/layouts/index.mjs.map +1 -1
  385. package/dist/jsx/layouts/index.native.js +2 -0
  386. package/dist/jsx/layouts/index.native.js.map +1 -1
  387. package/dist/jsx/layouts/page.mjs +49 -8
  388. package/dist/jsx/layouts/page.mjs.map +1 -1
  389. package/dist/jsx/layouts/page.native.js +50 -7
  390. package/dist/jsx/layouts/page.native.js.map +1 -1
  391. package/dist/jsx/shared/useKeyboardInset.mjs +1 -19
  392. package/dist/jsx/shared/useKeyboardInset.mjs.map +1 -1
  393. package/dist/jsx/shared/useKeyboardInset.native.js +3 -3
  394. package/dist/jsx/shared/useKeyboardInset.native.js.map +1 -1
  395. package/dist/jsx/views/Dashboard.mjs +112 -19
  396. package/dist/jsx/views/Dashboard.mjs.map +1 -1
  397. package/dist/jsx/views/Dashboard.native.js +151 -45
  398. package/dist/jsx/views/Dashboard.native.js.map +1 -1
  399. package/dist/jsx/views/Gantt.mjs +376 -93
  400. package/dist/jsx/views/Gantt.mjs.map +1 -1
  401. package/dist/jsx/views/Gantt.native.js +443 -94
  402. package/dist/jsx/views/Gantt.native.js.map +1 -1
  403. package/dist/jsx/views/ganttMath.mjs +84 -3
  404. package/dist/jsx/views/ganttMath.mjs.map +1 -1
  405. package/dist/jsx/views/ganttMath.native.js +113 -3
  406. package/dist/jsx/views/ganttMath.native.js.map +1 -1
  407. package/dist/jsx/views/index.mjs +2 -2
  408. package/dist/jsx/views/index.mjs.map +1 -1
  409. package/dist/jsx/views/index.native.js +20 -1
  410. package/dist/jsx/views/index.native.js.map +1 -1
  411. package/package.json +11 -9
  412. package/src/Button.tsx +10 -2
  413. package/src/Card.spec.tsx +76 -3
  414. package/src/Card.stories.tsx +1 -1
  415. package/src/Card.tsx +13 -1
  416. package/src/CardFooter.stories.tsx +3 -7
  417. package/src/CardFooter.tsx +3 -1
  418. package/src/CardHeader.stories.tsx +1 -3
  419. package/src/Collapsible.stories.tsx +2 -2
  420. package/src/CopyField/CopyField.spec.tsx +66 -1
  421. package/src/CopyField/index.tsx +4 -3
  422. package/src/DropdownMenu/DropdownMenu.spec.tsx +112 -1
  423. package/src/DropdownMenu/DropdownMenu.stories.tsx +1 -3
  424. package/src/DropdownMenu/index.tsx +67 -6
  425. package/src/LinearGradient.stories.tsx +2 -2
  426. package/src/Meter/Meter.spec.tsx +59 -2
  427. package/src/Meter/Meter.stories.tsx +38 -0
  428. package/src/Meter/index.tsx +9 -4
  429. package/src/Panel.stories.tsx +1 -1
  430. package/src/SortableList/SortableList.spec.tsx +3 -3
  431. package/src/Tabs/Tabs.spec.tsx +43 -3
  432. package/src/Tabs/Tabs.stories.tsx +10 -1
  433. package/src/Tabs/index.tsx +19 -13
  434. package/src/Toast/Toast.spec.tsx +56 -1
  435. package/src/Toast/index.tsx +68 -3
  436. package/src/Unspaced.stories.tsx +2 -2
  437. package/src/VisuallyHidden.stories.tsx +2 -2
  438. package/src/actions/DestructiveAction.spec.tsx +19 -3
  439. package/src/actions/DestructiveAction.tsx +9 -14
  440. package/src/charts/Axis.tsx +6 -1
  441. package/src/charts/BarChart.tsx +82 -67
  442. package/src/charts/ChartDataView.spec.tsx +104 -0
  443. package/src/charts/ChartDataView.tsx +158 -0
  444. package/src/charts/ChartSurface.tsx +7 -2
  445. package/src/charts/Charts.stories.tsx +213 -9
  446. package/src/charts/LineChart.tsx +90 -75
  447. package/src/charts/PieChart.knobs.spec.tsx +25 -0
  448. package/src/charts/PieChart.tsx +51 -9
  449. package/src/charts/Sparkline.tsx +25 -3
  450. package/src/charts/accessibility.ts +8 -0
  451. package/src/charts/charts.spec.tsx +77 -3
  452. package/src/charts/index.ts +2 -0
  453. package/src/charts/math.spec.ts +19 -0
  454. package/src/charts/math.ts +36 -0
  455. package/src/charts/series.tsx +101 -21
  456. package/src/charts/svg.spec.ts +28 -0
  457. package/src/charts/svg.ts +56 -2
  458. package/src/code/CodeBlock/CodeBlock.copy.spec.tsx +23 -0
  459. package/src/code/CodeBlock/index.tsx +4 -3
  460. package/src/feedback/ConfirmDialog.nativeFocus.spec.tsx +52 -0
  461. package/src/feedback/ConfirmDialog.spec.tsx +20 -0
  462. package/src/feedback/ConfirmDialog.tsx +9 -15
  463. package/src/feedback/NotifyHost.tsx +11 -2
  464. package/src/feedback/copy.ts +36 -4
  465. package/src/feedback/index.ts +1 -0
  466. package/src/feedback/notify.spec.ts +15 -1
  467. package/src/feedback/notify.ts +1 -0
  468. package/src/feedback/route.ts +4 -0
  469. package/src/feedback/store.ts +7 -0
  470. package/src/icons/lucide.ts +1 -1
  471. package/src/images/SvgUri/index.native.ts +11 -3
  472. package/src/layouts/EmptyState.stories.tsx +2 -2
  473. package/src/layouts/Page.weight.spec.tsx +75 -0
  474. package/src/layouts/PageHeader.stories.tsx +4 -4
  475. package/src/layouts/PageTemplates.stories.tsx +2 -2
  476. package/src/layouts/PaneScaffold.spec.tsx +144 -4
  477. package/src/layouts/PaneScaffold.stories.tsx +58 -2
  478. package/src/layouts/PaneScaffold.tsx +156 -58
  479. package/src/layouts/ScreenToolbar.stories.tsx +6 -23
  480. package/src/layouts/index.tsx +11 -0
  481. package/src/layouts/layouts.spec.tsx +51 -0
  482. package/src/layouts/page.designLaw.spec.tsx +25 -0
  483. package/src/layouts/page.tsx +46 -9
  484. package/src/shared/useKeyboardInset.native.ts +43 -0
  485. package/src/shared/useKeyboardInset.ts +2 -41
  486. package/src/tamagui.spec.ts +63 -0
  487. package/src/views/Dashboard.stories.tsx +38 -1
  488. package/src/views/Dashboard.tsx +119 -21
  489. package/src/views/Gantt.scroll.spec.tsx +120 -0
  490. package/src/views/Gantt.spec.tsx +376 -0
  491. package/src/views/Gantt.stories.tsx +75 -2
  492. package/src/views/Gantt.tsx +564 -96
  493. package/src/views/Kanban.spec.tsx +11 -0
  494. package/src/views/ganttMath.ts +142 -4
  495. package/src/views/index.ts +44 -1
  496. package/src/views/views.spec.tsx +39 -0
  497. package/types/Button.d.ts +12 -2
  498. package/types/Button.d.ts.map +1 -1
  499. package/types/Card.d.ts.map +1 -1
  500. package/types/CardFooter.d.ts +2 -1
  501. package/types/CardFooter.d.ts.map +1 -1
  502. package/types/CopyField/index.d.ts.map +1 -1
  503. package/types/DropdownMenu/index.d.ts +22 -0
  504. package/types/DropdownMenu/index.d.ts.map +1 -1
  505. package/types/Meter/index.d.ts.map +1 -1
  506. package/types/Tabs/index.d.ts +1 -1
  507. package/types/Tabs/index.d.ts.map +1 -1
  508. package/types/Toast/index.d.ts +16 -0
  509. package/types/Toast/index.d.ts.map +1 -1
  510. package/types/actions/DestructiveAction.d.ts.map +1 -1
  511. package/types/charts/Axis.d.ts.map +1 -1
  512. package/types/charts/BarChart.d.ts.map +1 -1
  513. package/types/charts/ChartDataView.d.ts +22 -0
  514. package/types/charts/ChartDataView.d.ts.map +1 -0
  515. package/types/charts/ChartSurface.d.ts +4 -1
  516. package/types/charts/ChartSurface.d.ts.map +1 -1
  517. package/types/charts/LineChart.d.ts.map +1 -1
  518. package/types/charts/PieChart.d.ts +1 -1
  519. package/types/charts/PieChart.d.ts.map +1 -1
  520. package/types/charts/Sparkline.d.ts +3 -1
  521. package/types/charts/Sparkline.d.ts.map +1 -1
  522. package/types/charts/accessibility.d.ts +3 -0
  523. package/types/charts/accessibility.d.ts.map +1 -1
  524. package/types/charts/index.d.ts +1 -0
  525. package/types/charts/index.d.ts.map +1 -1
  526. package/types/charts/math.d.ts +12 -0
  527. package/types/charts/math.d.ts.map +1 -1
  528. package/types/charts/series.d.ts +1 -1
  529. package/types/charts/series.d.ts.map +1 -1
  530. package/types/charts/svg.d.ts +18 -2
  531. package/types/charts/svg.d.ts.map +1 -1
  532. package/types/code/CodeBlock/index.d.ts.map +1 -1
  533. package/types/feedback/ConfirmDialog.d.ts.map +1 -1
  534. package/types/feedback/NotifyHost.d.ts +3 -1
  535. package/types/feedback/NotifyHost.d.ts.map +1 -1
  536. package/types/feedback/copy.d.ts +12 -2
  537. package/types/feedback/copy.d.ts.map +1 -1
  538. package/types/feedback/index.d.ts +1 -1
  539. package/types/feedback/index.d.ts.map +1 -1
  540. package/types/feedback/notify.d.ts.map +1 -1
  541. package/types/feedback/route.d.ts +3 -0
  542. package/types/feedback/route.d.ts.map +1 -1
  543. package/types/feedback/store.d.ts +2 -0
  544. package/types/feedback/store.d.ts.map +1 -1
  545. package/types/icons/lucide.d.ts +1 -1
  546. package/types/icons/lucide.d.ts.map +1 -1
  547. package/types/images/SvgUri/index.native.d.ts +4 -3
  548. package/types/images/SvgUri/index.native.d.ts.map +1 -1
  549. package/types/layouts/PaneScaffold.d.ts +27 -5
  550. package/types/layouts/PaneScaffold.d.ts.map +1 -1
  551. package/types/layouts/index.d.ts +1 -0
  552. package/types/layouts/index.d.ts.map +1 -1
  553. package/types/layouts/page.d.ts +10 -5
  554. package/types/layouts/page.d.ts.map +1 -1
  555. package/types/shared/useKeyboardInset.d.ts +1 -14
  556. package/types/shared/useKeyboardInset.d.ts.map +1 -1
  557. package/types/shared/useKeyboardInset.native.d.ts +16 -0
  558. package/types/shared/useKeyboardInset.native.d.ts.map +1 -0
  559. package/types/views/Dashboard.d.ts.map +1 -1
  560. package/types/views/Gantt.d.ts +132 -13
  561. package/types/views/Gantt.d.ts.map +1 -1
  562. package/types/views/ganttMath.d.ts +73 -0
  563. package/types/views/ganttMath.d.ts.map +1 -1
  564. package/types/views/index.d.ts +2 -2
  565. package/types/views/index.d.ts.map +1 -1
@@ -4,15 +4,35 @@ import { Skeleton } from "../Skeleton/index.mjs";
4
4
  import { ViewSwitcher } from "../layouts/ViewSwitcher.mjs";
5
5
  import { useDirection } from "../hooks/useDirection.mjs";
6
6
  import { withInterp } from "../shared/t.mjs";
7
- import { Intent, MIN_PRESS_TARGET, ensureKeyboardModalityTracking, formatDayOfMonth, formatMonthYear, hairline, hairlineWidth, keyboardFocusRingProps, useReadableTextOn, useResolvedKnobs, wasKeyboardFocus } from "@multiplatform.one/theme";
7
+ import { Intent, MIN_PRESS_TARGET, ensureKeyboardModalityTracking, formatAbsoluteDate, formatDayOfMonth, formatMonthYear, hairline, hairlineWidth, keyboardFocusRingProps, useReadableTextOn, useResolvedKnobs, wasKeyboardFocus } from "@multiplatform.one/theme";
8
8
  import { Button } from "@multiplatform.one/forms";
9
9
  import { useCallback, useEffect, useMemo, useRef, useState } from "react";
10
10
  import { useTranslation } from "../shared/i18n.mjs";
11
11
  import { ScrollView as RNScrollView } from "react-native-web";
12
12
  import { ScrollView, Text, XStack, YStack, isWeb } from "tamagui";
13
- import { addDays, barGeometry, clampResizeDayDelta, computeGanttRange, dateToX, dayDiff, dxToDayDelta, formatRangeLabel, formatSpanLabel, ganttTaskAccessibleLabel, generateTicks, rangeDays, resizeSpanByDays, shiftSpanByDays, spanInclusiveDays, startOfDay, todayLineX } from "./ganttMath.mjs";
13
+ import { addDays, barGeometry, clampResizeDayDelta, computeGanttRange, dateLineX, dateToX, dayDiff, dxToDayDelta, formatRangeLabel, formatSpanLabel, ganttTaskAccessibleLabel, generateTicks, isBoundedSpan, openBarGeometry, openSpanExtents, openSpanLabelParts, rangeDays, resizeSpanByDays, scrollAnchorX, shiftSpanByDays, spanInclusiveDays, startOfDay, todayLineX } from "./ganttMath.mjs";
14
14
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
15
15
  const CanvasScroller = isWeb ? ScrollView : RNScrollView;
16
+ function boundedSpan(ref) {
17
+ const span = ref.span;
18
+ return isBoundedSpan(span) ? {
19
+ start: span.start,
20
+ end: span.end
21
+ } : null;
22
+ }
23
+ function resolveSpans(task) {
24
+ const list = task.spans;
25
+ if (!list || list.length === 0) return [{
26
+ span: task,
27
+ index: 0,
28
+ key: task.id
29
+ }];
30
+ return list.map((span, index) => ({
31
+ span,
32
+ index,
33
+ key: span.id ?? `${task.id}#${index}`
34
+ }));
35
+ }
16
36
  const DRAG_THRESHOLD_PX = 4;
17
37
  const TOUCH_LONG_PRESS_MS = 300;
18
38
  const TOUCH_SLOP_PX = 8;
@@ -199,6 +219,10 @@ function GanttView({
199
219
  showZoomSwitcher = true,
200
220
  firstDayOfWeek = 0,
201
221
  initialDate,
222
+ markerDate,
223
+ onMarkerDateChange,
224
+ enableMarkerDrag,
225
+ markerLabel,
202
226
  ...stackProps
203
227
  }) {
204
228
  const {
@@ -230,12 +254,18 @@ function GanttView({
230
254
  const space = knobProps.space;
231
255
  const barInset = space === "small" ? 4 : space === "large" ? 9 : 6;
232
256
  const barHeight = Math.max(10, rowHeight - barInset * 2);
257
+ const railHeight = Math.max(4, Math.round(barHeight / 2));
233
258
  const transition = knobProps.transition;
234
259
  const webLayoutTransition = isWeb ? transition : void 0;
235
- const spans = useMemo(() => tasks.map(task => ({
236
- start: task.start,
237
- end: task.end
238
- })), [tasks]);
260
+ const spans = useMemo(() => {
261
+ const flat = [];
262
+ for (const task of tasks) for (const ref of resolveSpans(task)) flat.push(ref.span);
263
+ if (markerDate !== void 0) flat.push({
264
+ start: markerDate,
265
+ end: markerDate
266
+ });
267
+ return openSpanExtents(flat);
268
+ }, [tasks, markerDate]);
239
269
  const range = useMemo(() => computeGanttRange(spans, zoom, /* @__PURE__ */new Date(), firstDayOfWeek), [spans, zoom, firstDayOfWeek]);
240
270
  const chartWidth = rangeDays(range) * pxPerDay;
241
271
  const ticks = useMemo(() => generateTicks(range, zoom, pxPerDay, firstDayOfWeek), [range, zoom, pxPerDay, firstDayOfWeek]);
@@ -251,16 +281,16 @@ function GanttView({
251
281
  const hScrollRef = useRef(null);
252
282
  const axisScrollRef = useRef(null);
253
283
  const canvasViewportRef = useRef(null);
254
- const pendingRtlAnchorRef = useRef(null);
284
+ const pendingAnchorRef = useRef(null);
255
285
  const scrollToDate = useCallback((date, animated) => {
256
- const ltrX = Math.max(0, dateToX(date, range.start, pxPerDay) - labelWidth);
257
- let x = ltrX;
258
- if (rtl) {
259
- const viewport = canvasViewportRef.current;
260
- if (viewport === null) pendingRtlAnchorRef.current = date;
261
- const max = Math.max(0, chartWidth - (viewport ?? 0));
262
- x = Math.min(max, Math.max(0, max - ltrX));
263
- }
286
+ const viewportWidth = canvasViewportRef.current;
287
+ if (viewportWidth === null) pendingAnchorRef.current = date;
288
+ const x = scrollAnchorX(date, range.start, pxPerDay, {
289
+ labelWidth,
290
+ chartWidth,
291
+ viewportWidth,
292
+ rtl
293
+ });
264
294
  hScrollRef.current?.scrollTo?.({
265
295
  x,
266
296
  animated
@@ -284,11 +314,11 @@ function GanttView({
284
314
  }, []);
285
315
  const handleCanvasLayout = useCallback(event => {
286
316
  const width = event?.nativeEvent?.layout?.width;
287
- if (typeof width !== "number") return;
317
+ if (typeof width !== "number" || !Number.isFinite(width) || width <= 0) return;
288
318
  canvasViewportRef.current = width;
289
- const pending = pendingRtlAnchorRef.current;
319
+ const pending = pendingAnchorRef.current;
290
320
  if (pending) {
291
- pendingRtlAnchorRef.current = null;
321
+ pendingAnchorRef.current = null;
292
322
  scrollToDateRef.current(pending, false);
293
323
  }
294
324
  }, []);
@@ -308,16 +338,13 @@ function GanttView({
308
338
  suppressClickRef.current = false;
309
339
  }, 0);
310
340
  }, []);
311
- const commitDrag = useCallback((task, dayDelta) => {
312
- if (dayDelta !== 0) {
313
- onItemMove?.(task, shiftSpanByDays({
314
- start: task.start,
315
- end: task.end
316
- }, dayDelta));
317
- }
341
+ const commitDrag = useCallback((task, ref, span, dayDelta) => {
342
+ if (dayDelta !== 0) onItemMove?.(task, shiftSpanByDays(span, dayDelta), ref);
318
343
  }, [onItemMove]);
319
- const handleBarPointerDown = useCallback((task, e) => {
344
+ const handleBarPointerDown = useCallback((task, ref, e) => {
320
345
  if (!webDragEnabled) return;
346
+ const span = boundedSpan(ref);
347
+ if (!span) return;
321
348
  if (e.button !== void 0 && e.button !== 0) return;
322
349
  e.stopPropagation?.();
323
350
  dragCleanupRef.current?.();
@@ -336,7 +363,7 @@ function GanttView({
336
363
  prevUserSelect = document.body.style.userSelect;
337
364
  document.body.style.userSelect = "none";
338
365
  setDrag({
339
- id: task.id,
366
+ key: ref.key,
340
367
  dx,
341
368
  dayDelta: toDayDelta(dx)
342
369
  });
@@ -365,7 +392,7 @@ function GanttView({
365
392
  return;
366
393
  }
367
394
  setDrag({
368
- id: task.id,
395
+ key: ref.key,
369
396
  dx,
370
397
  dayDelta: toDayDelta(dx)
371
398
  });
@@ -376,7 +403,7 @@ function GanttView({
376
403
  teardown();
377
404
  if (!wasActive) return;
378
405
  suppressNextClick();
379
- commitDrag(task, dayDelta);
406
+ commitDrag(task, ref, span, dayDelta);
380
407
  };
381
408
  const onKey = ke => {
382
409
  if (ke.key !== "Escape" || !active) return;
@@ -400,10 +427,14 @@ function GanttView({
400
427
  window.addEventListener("keydown", onKey, true);
401
428
  dragCleanupRef.current = teardown;
402
429
  }, [webDragEnabled, pxPerDay, commitDrag, suppressNextClick]);
403
- const handleNativeGrant = useCallback((task, e) => {
430
+ const handleNativeGrant = useCallback((task, ref, e) => {
404
431
  if (!nativeDragEnabled) return;
432
+ const span = boundedSpan(ref);
433
+ if (!span) return;
405
434
  const session = {
406
435
  task,
436
+ ref,
437
+ span,
407
438
  startX: e.nativeEvent?.pageX ?? 0,
408
439
  dragging: false,
409
440
  liftTimer: null
@@ -413,7 +444,7 @@ function GanttView({
413
444
  if (nativeSessionRef.current !== session) return;
414
445
  session.dragging = true;
415
446
  setDrag({
416
- id: task.id,
447
+ key: ref.key,
417
448
  dx: 0,
418
449
  dayDelta: 0
419
450
  });
@@ -432,7 +463,7 @@ function GanttView({
432
463
  return;
433
464
  }
434
465
  setDrag({
435
- id: session.task.id,
466
+ key: session.ref.key,
436
467
  dx,
437
468
  dayDelta: dirSignRef.current * dxToDayDelta(dx, pxPerDay)
438
469
  });
@@ -448,7 +479,7 @@ function GanttView({
448
479
  }
449
480
  const dayDelta = dirSignRef.current * dxToDayDelta((e.nativeEvent?.pageX ?? 0) - session.startX, pxPerDay);
450
481
  setDrag(null);
451
- commitDrag(session.task, dayDelta);
482
+ commitDrag(session.task, session.ref, session.span, dayDelta);
452
483
  }, [onItemPress, pxPerDay, commitDrag]);
453
484
  const handleNativeTerminate = useCallback(() => {
454
485
  const session = nativeSessionRef.current;
@@ -456,15 +487,13 @@ function GanttView({
456
487
  nativeSessionRef.current = null;
457
488
  setDrag(null);
458
489
  }, []);
459
- const handleResizePointerDown = useCallback((task, edge, e) => {
490
+ const handleResizePointerDown = useCallback((task, ref, edge, e) => {
460
491
  if (!webDragEnabled) return;
492
+ const span = boundedSpan(ref);
493
+ if (!span) return;
461
494
  if (e.button !== void 0 && e.button !== 0) return;
462
495
  e.stopPropagation?.();
463
496
  dragCleanupRef.current?.();
464
- const span = {
465
- start: task.start,
466
- end: task.end
467
- };
468
497
  const maxShrinkPx = (spanInclusiveDays(span) - 1) * pxPerDay;
469
498
  const startX = e.clientX;
470
499
  const sign = dirSignRef.current;
@@ -495,7 +524,7 @@ function GanttView({
495
524
  document.body.style.userSelect = "none";
496
525
  }
497
526
  setResize({
498
- id: task.id,
527
+ key: ref.key,
499
528
  edge,
500
529
  logicalDx: clampLogicalDx(dx),
501
530
  dayDelta: toDayDelta(dx)
@@ -507,9 +536,7 @@ function GanttView({
507
536
  teardown();
508
537
  if (!wasActive) return;
509
538
  suppressNextClick();
510
- if (dayDelta !== 0) {
511
- onItemMove?.(task, resizeSpanByDays(span, edge, dayDelta));
512
- }
539
+ if (dayDelta !== 0) onItemMove?.(task, resizeSpanByDays(span, edge, dayDelta), ref);
513
540
  };
514
541
  const onKey = ke => {
515
542
  if (ke.key !== "Escape" || !active) return;
@@ -527,10 +554,11 @@ function GanttView({
527
554
  window.addEventListener("keydown", onKey, true);
528
555
  dragCleanupRef.current = teardown;
529
556
  }, [webDragEnabled, pxPerDay, onItemMove, suppressNextClick]);
530
- const getBarDragProps = useCallback(task => {
557
+ const getBarDragProps = useCallback((task, ref) => {
558
+ if (!boundedSpan(ref)) return {};
531
559
  if (webDragEnabled) {
532
560
  return {
533
- onPointerDown: e => handleBarPointerDown(task, e)
561
+ onPointerDown: e => handleBarPointerDown(task, ref, e)
534
562
  };
535
563
  }
536
564
  if (nativeDragEnabled) {
@@ -539,7 +567,7 @@ function GanttView({
539
567
  onStartShouldSetResponder: () => true,
540
568
  onMoveShouldSetResponder: () => true,
541
569
  onResponderTerminationRequest: () => !nativeSessionRef.current?.dragging,
542
- onResponderGrant: e => handleNativeGrant(task, e),
570
+ onResponderGrant: e => handleNativeGrant(task, ref, e),
543
571
  onResponderMove: handleNativeMove,
544
572
  onResponderRelease: handleNativeRelease,
545
573
  onResponderTerminate: handleNativeTerminate
@@ -547,45 +575,205 @@ function GanttView({
547
575
  }
548
576
  return {};
549
577
  }, [webDragEnabled, nativeDragEnabled, handleBarPointerDown, handleNativeGrant, handleNativeMove, handleNativeRelease, handleNativeTerminate]);
550
- const handleBarKeyboardMove = useCallback((task, key, shiftKey) => {
578
+ const handleBarKeyboardMove = useCallback((task, ref, key, shiftKey) => {
579
+ const span = boundedSpan(ref);
580
+ if (!span) return;
551
581
  const physical = key === "ArrowRight" ? 1 : -1;
552
582
  const dayDelta = physical * dirSignRef.current * (shiftKey ? 7 : 1);
553
- const next = shiftSpanByDays({
554
- start: task.start,
555
- end: task.end
556
- }, dayDelta);
557
- onItemMove?.(task, next);
583
+ const next = shiftSpanByDays(span, dayDelta);
584
+ onItemMove?.(task, next, ref);
558
585
  setAnnouncement(withInterp(t("{{title}} moved to {{range}}"), {
559
- title: task.title,
586
+ title: ref.span.title ?? task.title,
560
587
  range: formatSpanLabel(next)
561
588
  }));
562
589
  }, [onItemMove, t]);
563
- const renderBar = task => {
564
- const geom = barGeometry(task, range.start, pxPerDay);
565
- const activeDrag = drag && drag.id === task.id ? drag : null;
590
+ const markerDragEnabled = (enableMarkerDrag ?? onMarkerDateChange !== void 0) && onMarkerDateChange !== void 0;
591
+ const [markerDragging, setMarkerDragging] = useState(false);
592
+ const markerGrantRef = useRef(null);
593
+ const markerEmittedRef = useRef(null);
594
+ const markerSessionRef = useRef(null);
595
+ const emitMarker = useCallback(dayDelta => {
596
+ const base = markerGrantRef.current;
597
+ if (!base) return;
598
+ const next = addDays(base, dayDelta);
599
+ if (markerEmittedRef.current === next.getTime()) return;
600
+ markerEmittedRef.current = next.getTime();
601
+ onMarkerDateChange?.(next);
602
+ }, [onMarkerDateChange]);
603
+ const openMarkerSession = useCallback(() => {
604
+ if (markerDate === void 0) return false;
605
+ const base = startOfDay(markerDate);
606
+ markerGrantRef.current = base;
607
+ markerEmittedRef.current = base.getTime();
608
+ return true;
609
+ }, [markerDate]);
610
+ const handleMarkerPointerDown = useCallback(e => {
611
+ if (!markerDragEnabled || !hasDom) return;
612
+ if (e.button !== void 0 && e.button !== 0) return;
613
+ if (!openMarkerSession()) return;
614
+ e.stopPropagation?.();
615
+ dragCleanupRef.current?.();
616
+ const startX = e.clientX;
617
+ let active = false;
618
+ let ended = false;
619
+ let prevUserSelect = "";
620
+ const toDayDelta = dx => dirSignRef.current * dxToDayDelta(dx, pxPerDay);
621
+ const teardown = () => {
622
+ if (ended) return;
623
+ ended = true;
624
+ window.removeEventListener("pointermove", onMove);
625
+ window.removeEventListener("pointerup", onUp);
626
+ window.removeEventListener("keydown", onKey, true);
627
+ if (active) document.body.style.userSelect = prevUserSelect;
628
+ setMarkerDragging(false);
629
+ markerGrantRef.current = null;
630
+ dragCleanupRef.current = null;
631
+ };
632
+ const onMove = me => {
633
+ const dx = me.clientX - startX;
634
+ if (!active) {
635
+ if (Math.abs(dx) < DRAG_THRESHOLD_PX) return;
636
+ active = true;
637
+ prevUserSelect = document.body.style.userSelect;
638
+ document.body.style.userSelect = "none";
639
+ setMarkerDragging(true);
640
+ }
641
+ emitMarker(toDayDelta(dx));
642
+ };
643
+ const onUp = () => teardown();
644
+ const onKey = ke => {
645
+ if (ke.key !== "Escape" || !active) return;
646
+ ke.stopPropagation();
647
+ emitMarker(0);
648
+ teardown();
649
+ };
650
+ window.addEventListener("pointermove", onMove);
651
+ window.addEventListener("pointerup", onUp);
652
+ window.addEventListener("keydown", onKey, true);
653
+ dragCleanupRef.current = teardown;
654
+ }, [markerDragEnabled, hasDom, openMarkerSession, emitMarker, pxPerDay]);
655
+ const markerNativeProps = useMemo(() => {
656
+ if (!markerDragEnabled || isWeb) return {};
657
+ return {
658
+ onStartShouldSetResponder: () => true,
659
+ onMoveShouldSetResponder: () => true,
660
+ onResponderTerminationRequest: () => false,
661
+ onResponderGrant: e => {
662
+ if (!openMarkerSession()) return;
663
+ markerSessionRef.current = {
664
+ startX: e?.nativeEvent?.pageX ?? 0
665
+ };
666
+ setMarkerDragging(true);
667
+ },
668
+ onResponderMove: e => {
669
+ const session = markerSessionRef.current;
670
+ if (!session) return;
671
+ const dx = (e?.nativeEvent?.pageX ?? 0) - session.startX;
672
+ emitMarker(dirSignRef.current * dxToDayDelta(dx, pxPerDay));
673
+ },
674
+ onResponderRelease: () => {
675
+ markerSessionRef.current = null;
676
+ markerGrantRef.current = null;
677
+ setMarkerDragging(false);
678
+ },
679
+ onResponderTerminate: () => {
680
+ markerSessionRef.current = null;
681
+ markerGrantRef.current = null;
682
+ setMarkerDragging(false);
683
+ }
684
+ };
685
+ }, [markerDragEnabled, openMarkerSession, emitMarker, pxPerDay]);
686
+ const handleMarkerKeyboardMove = useCallback((key, shiftKey) => {
687
+ if (!markerDragEnabled || markerDate === void 0) return;
688
+ const physical = key === "ArrowRight" ? 1 : -1;
689
+ const dayDelta = physical * dirSignRef.current * (shiftKey ? 7 : 1);
690
+ const next = addDays(startOfDay(markerDate), dayDelta);
691
+ markerEmittedRef.current = next.getTime();
692
+ onMarkerDateChange?.(next);
693
+ setAnnouncement(withInterp(t("Marker moved to {{date}}"), {
694
+ date: formatAbsoluteDate(next)
695
+ }));
696
+ }, [markerDragEnabled, markerDate, onMarkerDateChange, t]);
697
+ const markerX = markerDate === void 0 ? null : dateLineX(range, pxPerDay, markerDate);
698
+ const markerName = markerLabel ?? t("Marker");
699
+ const spanAccessibleName = (title, span) => {
700
+ if (isBoundedSpan(span)) {
701
+ return ganttTaskAccessibleLabel({
702
+ title,
703
+ start: span.start,
704
+ end: span.end
705
+ });
706
+ }
707
+ const parts = openSpanLabelParts(span);
708
+ if (parts.start !== void 0) {
709
+ return withInterp(t("{{title}}, from {{start}}, no end"), {
710
+ title,
711
+ start: parts.start
712
+ });
713
+ }
714
+ if (parts.end !== void 0) {
715
+ return withInterp(t("{{title}}, until {{end}}, no start"), {
716
+ title,
717
+ end: parts.end
718
+ });
719
+ }
720
+ return withInterp(t("{{title}}, always, no dates"), {
721
+ title
722
+ });
723
+ };
724
+ const renderBar = (task, ref) => {
725
+ const span = ref.span;
726
+ const barKey = ref.key;
727
+ const bounded = boundedSpan(ref);
728
+ const geom = openBarGeometry(span, range, pxPerDay);
729
+ const activeDrag = drag && drag.key === barKey ? drag : null;
566
730
  const dragging = activeDrag !== null;
567
- const activeResize = resize && resize.id === task.id ? resize : null;
731
+ const activeResize = resize && resize.key === barKey ? resize : null;
568
732
  const resizing = activeResize !== null;
569
733
  const sessionLive = dragging || resizing;
570
734
  const dayDelta = activeDrag?.dayDelta ?? activeResize?.dayDelta ?? 0;
571
- const span = {
572
- start: task.start,
573
- end: task.end
574
- };
575
- const previewSpan = activeDrag ? shiftSpanByDays(span, dayDelta) : activeResize ? resizeSpanByDays(span, activeResize.edge, activeResize.dayDelta) : null;
735
+ const previewSpan = bounded && activeDrag ? shiftSpanByDays(bounded, dayDelta) : bounded && activeResize ? resizeSpanByDays(bounded, activeResize.edge, activeResize.dayDelta) : null;
576
736
  const previewGeom = previewSpan ? barGeometry(previewSpan, range.start, pxPerDay) : null;
577
737
  const liveWidth = activeResize ? Math.max(6, activeResize.edge === "end" ? geom.width + activeResize.logicalDx : geom.width - activeResize.logicalDx) : geom.width;
578
738
  const liveTransformX = activeDrag ? activeDrag.dx : activeResize && activeResize.edge === "start" ? activeResize.logicalDx * dirSign : 0;
579
- const fill = task.color ?? (task.intent && task.intent !== "accent" ? "$color9" : "$accentBackground");
580
- const progress = clampProgress(task.progress);
581
- const showLabel = liveWidth >= 44;
582
- const isBarFocused = focusedBarId === task.id;
739
+ const barColor = span.color ?? task.color;
740
+ const barIntent = span.intent ?? task.intent;
741
+ const barTitle = span.title ?? task.title;
742
+ const fill = barColor ?? (barIntent && barIntent !== "accent" ? "$color9" : "$accentBackground");
743
+ const progress = bounded ? clampProgress(span.progress ?? task.progress) : null;
744
+ const showLabel = !geom.eternal && liveWidth >= 44;
745
+ const isBarFocused = focusedBarId === barKey;
583
746
  const showHandles = hoveredId === task.id || sessionLive;
584
- const handleWidth = geom.width >= 24 ? 8 : geom.width >= 12 ? 4 : 0;
747
+ const handleWidth = bounded ? geom.width >= 24 ? 8 : geom.width >= 12 ? 4 : 0 : 0;
585
748
  const physicalLeftEdge = rtl ? "end" : "start";
586
749
  const physicalRightEdge = rtl ? "start" : "end";
750
+ const openStartSide = rtl ? {
751
+ right: 2
752
+ } : {
753
+ left: 2
754
+ };
755
+ const openEndSide = rtl ? {
756
+ left: 2
757
+ } : {
758
+ right: 2
759
+ };
760
+ const squareStart = rtl ? {
761
+ borderTopRightRadius: 0,
762
+ borderBottomRightRadius: 0
763
+ } : {
764
+ borderTopLeftRadius: 0,
765
+ borderBottomLeftRadius: 0
766
+ };
767
+ const squareEnd = rtl ? {
768
+ borderTopLeftRadius: 0,
769
+ borderBottomLeftRadius: 0
770
+ } : {
771
+ borderTopRightRadius: 0,
772
+ borderBottomRightRadius: 0
773
+ };
774
+ const height2 = geom.eternal ? railHeight : barHeight;
587
775
  return /* @__PURE__ */jsxs(BarIntentWrap, {
588
- intent: task.color ? void 0 : task.intent,
776
+ intent: barColor ? void 0 : barIntent,
589
777
  children: [sessionLive && dayDelta !== 0 && previewGeom && /* @__PURE__ */jsx(YStack, {
590
778
  position: "absolute",
591
779
  ...canvasPos(previewGeom.x),
@@ -599,40 +787,42 @@ function GanttView({
599
787
  opacity: 0.25,
600
788
  pointerEvents: "none",
601
789
  ...{
602
- "data-gantt-drop-preview": task.id
790
+ "data-gantt-drop-preview": barKey
603
791
  }
604
792
  }), /* @__PURE__ */jsxs(YStack, {
605
793
  position: "absolute",
606
794
  ...canvasPos(geom.x),
607
795
  width: liveWidth,
608
- top: barInset,
609
- height: barHeight,
796
+ top: barInset + (barHeight - height2) / 2,
797
+ height: height2,
610
798
  x: liveTransformX,
611
799
  zIndex: sessionLive ? 3 : 1,
612
800
  ...knobProps.borderRadius,
801
+ ...(geom.openStart ? squareStart : null),
802
+ ...(geom.openEnd ? squareEnd : null),
613
803
  backgroundColor: fill,
614
- opacity: sessionLive ? 0.85 : 1,
804
+ opacity: sessionLive ? 0.85 : geom.eternal ? 0.55 : 1,
615
805
  hoverStyle: {
616
- opacity: sessionLive ? 0.85 : 0.9
806
+ opacity: sessionLive ? 0.85 : geom.eternal ? 0.7 : 0.9
617
807
  },
618
808
  pressStyle: {
619
809
  opacity: 0.8
620
810
  },
621
- cursor: webDragEnabled ? "grab" : onItemPress ? "pointer" : void 0,
811
+ cursor: bounded && webDragEnabled ? "grab" : onItemPress ? "pointer" : void 0,
622
812
  justifyContent: "center",
623
813
  transition: sessionLive ? void 0 : webLayoutTransition,
624
814
  role: "button",
625
815
  tabIndex: 0,
626
- "aria-label": ganttTaskAccessibleLabel(task),
816
+ "aria-label": spanAccessibleName(barTitle, span),
627
817
  ...(isBarFocused && barKeyboardRing ? keyboardFocusRingProps : {
628
818
  outlineWidth: 0
629
819
  }),
630
820
  onFocus: () => {
631
- setFocusedBarId(task.id);
821
+ setFocusedBarId(barKey);
632
822
  setBarKeyboardRing(wasKeyboardFocus());
633
823
  },
634
824
  onBlur: () => {
635
- setFocusedBarId(id => id === task.id ? null : id);
825
+ setFocusedBarId(id => id === barKey ? null : id);
636
826
  setBarKeyboardRing(false);
637
827
  },
638
828
  ...{
@@ -646,17 +836,23 @@ function GanttView({
646
836
  onItemPress?.(task);
647
837
  return;
648
838
  }
649
- if ((ke.key === "ArrowLeft" || ke.key === "ArrowRight") && dragEnabled) {
839
+ if ((ke.key === "ArrowLeft" || ke.key === "ArrowRight") && dragEnabled && bounded) {
650
840
  ke.preventDefault?.();
651
841
  ke.stopPropagation?.();
652
- handleBarKeyboardMove(task, ke.key, ke.shiftKey === true);
842
+ handleBarKeyboardMove(task, ref, ke.key, ke.shiftKey === true);
653
843
  }
654
844
  },
655
845
  ...{
656
- "data-gantt-bar": task.id
846
+ "data-gantt-bar": barKey
657
847
  },
658
- ...(nativeDragEnabled ? null : getBarDragProps(task)),
659
- onPress: nativeDragEnabled ? void 0 : e => {
848
+ ...(geom.eternal ? {
849
+ "data-gantt-rail": "true"
850
+ } : null),
851
+ ...(geom.openStart || geom.openEnd ? {
852
+ "data-gantt-span-open": geom.eternal ? "both" : geom.openStart ? "start" : "end"
853
+ } : null),
854
+ ...(nativeDragEnabled ? null : getBarDragProps(task, ref)),
855
+ onPress: nativeDragEnabled && bounded ? void 0 : e => {
660
856
  e?.stopPropagation?.();
661
857
  if (suppressClickRef.current) return;
662
858
  onItemPress?.(task);
@@ -678,8 +874,32 @@ function GanttView({
678
874
  "data-gantt-progress": String(progress)
679
875
  }
680
876
  }), showLabel && /* @__PURE__ */jsx(GanttBarLabel, {
681
- title: task.title,
877
+ title: barTitle,
682
878
  fill
879
+ }), geom.openStart && /* @__PURE__ */jsx(Text, {
880
+ position: "absolute",
881
+ ...openStartSide,
882
+ ...knobProps.label,
883
+ color: "$color12",
884
+ opacity: 0.75,
885
+ pointerEvents: "none",
886
+ "aria-hidden": true,
887
+ ...{
888
+ "data-gantt-open-start": "true"
889
+ },
890
+ children: rtl ? "\xBB" : "\xAB"
891
+ }), geom.openEnd && /* @__PURE__ */jsx(Text, {
892
+ position: "absolute",
893
+ ...openEndSide,
894
+ ...knobProps.label,
895
+ color: "$color12",
896
+ opacity: 0.75,
897
+ pointerEvents: "none",
898
+ "aria-hidden": true,
899
+ ...{
900
+ "data-gantt-open-end": "true"
901
+ },
902
+ children: rtl ? "\xAB" : "\xBB"
683
903
  }), previewSpan && /* @__PURE__ */jsx(XStack, {
684
904
  position: "absolute",
685
905
  top: -(axisHeight - 6),
@@ -714,7 +934,7 @@ function GanttView({
714
934
  cursor: "ew-resize",
715
935
  backgroundColor: showHandles ? "$color12" : "transparent",
716
936
  opacity: showHandles ? 0.28 : 0,
717
- onPointerDown: e => handleResizePointerDown(task, physicalLeftEdge, e),
937
+ onPointerDown: e => handleResizePointerDown(task, ref, physicalLeftEdge, e),
718
938
  ...{
719
939
  "data-gantt-resize-handle": physicalLeftEdge
720
940
  }
@@ -727,24 +947,24 @@ function GanttView({
727
947
  cursor: "ew-resize",
728
948
  backgroundColor: showHandles ? "$color12" : "transparent",
729
949
  opacity: showHandles ? 0.28 : 0,
730
- onPointerDown: e => handleResizePointerDown(task, physicalRightEdge, e),
950
+ onPointerDown: e => handleResizePointerDown(task, ref, physicalRightEdge, e),
731
951
  ...{
732
952
  "data-gantt-resize-handle": physicalRightEdge
733
953
  }
734
954
  })]
735
- }), nativeDragEnabled && /* @__PURE__ */jsx(YStack, {
955
+ }), nativeDragEnabled && bounded && /* @__PURE__ */jsx(YStack, {
736
956
  position: "absolute",
737
957
  top: 0,
738
958
  left: 0,
739
959
  right: 0,
740
960
  bottom: 0,
741
961
  zIndex: 5,
742
- ...getBarDragProps(task)
962
+ ...getBarDragProps(task, ref)
743
963
  })]
744
964
  })]
745
- }, task.id);
965
+ }, barKey);
746
966
  };
747
- const scrollLocked = drag !== null || resize !== null;
967
+ const scrollLocked = drag !== null || resize !== null || markerDragging;
748
968
  const majorGridColor = "$borderColor";
749
969
  const minorGridColor = componentColors.divider;
750
970
  const scrollerDirection = {
@@ -893,6 +1113,53 @@ function GanttView({
893
1113
  height: hairlineWidth,
894
1114
  backgroundColor: componentColors.divider,
895
1115
  pointerEvents: "none"
1116
+ }), markerX !== null && /* @__PURE__ */jsxs(Fragment, {
1117
+ children: [/* @__PURE__ */jsx(YStack, {
1118
+ position: "absolute",
1119
+ ...canvasPos(markerX - 1),
1120
+ top: 0,
1121
+ bottom: 0,
1122
+ width: 2,
1123
+ backgroundColor: "$color12",
1124
+ opacity: 0.9,
1125
+ pointerEvents: "none"
1126
+ }), /* @__PURE__ */jsx(YStack, {
1127
+ position: "absolute",
1128
+ ...canvasPos(markerX - 12),
1129
+ top: 0,
1130
+ bottom: 0,
1131
+ width: 24,
1132
+ alignItems: "center",
1133
+ justifyContent: "flex-end",
1134
+ zIndex: 4,
1135
+ cursor: markerDragEnabled ? "ew-resize" : void 0,
1136
+ role: "slider",
1137
+ tabIndex: markerDragEnabled ? 0 : -1,
1138
+ "aria-label": markerName,
1139
+ "aria-valuetext": markerDate ? formatAbsoluteDate(markerDate) : void 0,
1140
+ ...(markerDragEnabled && hasDom ? {
1141
+ onPointerDown: e => handleMarkerPointerDown(e)
1142
+ } : null),
1143
+ ...markerNativeProps,
1144
+ onKeyDown: ke => {
1145
+ if (ke.key !== "ArrowLeft" && ke.key !== "ArrowRight") return;
1146
+ ke.preventDefault?.();
1147
+ ke.stopPropagation?.();
1148
+ handleMarkerKeyboardMove(ke.key, ke.shiftKey === true);
1149
+ },
1150
+ ...{
1151
+ "data-gantt-marker-handle": "true"
1152
+ },
1153
+ children: /* @__PURE__ */jsx(YStack, {
1154
+ width: 11,
1155
+ height: 9,
1156
+ marginBottom: 2,
1157
+ borderRadius: 2,
1158
+ backgroundColor: "$color12",
1159
+ opacity: markerDragging ? 1 : 0.9,
1160
+ pointerEvents: "none"
1161
+ })
1162
+ })]
896
1163
  })]
897
1164
  })
898
1165
  })]
@@ -909,9 +1176,11 @@ function GanttView({
909
1176
  ...hairlineEnd,
910
1177
  borderColor: "$borderColor",
911
1178
  children: tasks.map((task, index) => {
912
- const selected = focusedBarId === task.id;
1179
+ const refs = resolveSpans(task);
1180
+ const selected = refs.some(ref => ref.key === focusedBarId);
913
1181
  const hovered = hoveredId === task.id;
914
1182
  const last = index === tasks.length - 1;
1183
+ const firstKey = refs[0]?.key ?? task.id;
915
1184
  return /* @__PURE__ */jsx(XStack, {
916
1185
  height: rowHeight,
917
1186
  alignItems: "center",
@@ -926,11 +1195,11 @@ function GanttView({
926
1195
  },
927
1196
  onPress: onItemPress ? () => {
928
1197
  if (suppressClickRef.current) return;
929
- setFocusedBarId(task.id);
1198
+ setFocusedBarId(firstKey);
930
1199
  setBarKeyboardRing(false);
931
1200
  onItemPress(task);
932
1201
  } : () => {
933
- setFocusedBarId(task.id);
1202
+ setFocusedBarId(firstKey);
934
1203
  setBarKeyboardRing(false);
935
1204
  },
936
1205
  ...{
@@ -1001,7 +1270,8 @@ function GanttView({
1001
1270
  backgroundColor: tick.major ? majorGridColor : minorGridColor,
1002
1271
  pointerEvents: "none"
1003
1272
  }, tick.date.toISOString())), tasks.map((task, index) => {
1004
- const selected = focusedBarId === task.id;
1273
+ const refs = resolveSpans(task);
1274
+ const selected = refs.some(ref => ref.key === focusedBarId);
1005
1275
  const hovered = hoveredId === task.id;
1006
1276
  const last = index === tasks.length - 1;
1007
1277
  return /* @__PURE__ */jsx(XStack, {
@@ -1017,8 +1287,21 @@ function GanttView({
1017
1287
  ...{
1018
1288
  "data-gantt-row": task.id
1019
1289
  },
1020
- children: renderBar(task)
1290
+ children: refs.map(ref => renderBar(task, ref))
1021
1291
  }, task.id);
1292
+ }), markerX !== null && /* @__PURE__ */jsx(YStack, {
1293
+ position: "absolute",
1294
+ ...canvasPos(markerX - 1),
1295
+ top: 0,
1296
+ bottom: 0,
1297
+ width: 2,
1298
+ backgroundColor: "$color12",
1299
+ opacity: markerDragging ? 0.95 : 0.75,
1300
+ pointerEvents: "none",
1301
+ zIndex: 2,
1302
+ ...{
1303
+ "data-gantt-marker": "true"
1304
+ }
1022
1305
  }), todayX !== null && /* @__PURE__ */jsx(YStack, {
1023
1306
  position: "absolute",
1024
1307
  ...canvasPos(todayX - 1),