@multiplatform.one/components 7.10.0 → 7.15.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 (452) hide show
  1. package/README.md +100 -2
  2. package/dist/cjs/Accordion/index.cjs +2 -6
  3. package/dist/cjs/Accordion/index.native.js +2 -6
  4. package/dist/cjs/Accordion/index.native.js.map +1 -1
  5. package/dist/cjs/AnimateHeight/index.cjs +1 -3
  6. package/dist/cjs/AnimateHeight/index.native.js +1 -3
  7. package/dist/cjs/AnimateHeight/index.native.js.map +1 -1
  8. package/dist/cjs/Chip/index.cjs +8 -1
  9. package/dist/cjs/Chip/index.native.js +8 -1
  10. package/dist/cjs/Chip/index.native.js.map +1 -1
  11. package/dist/cjs/SheetModal/index.cjs +22 -3
  12. package/dist/cjs/SheetModal/index.native.js +115 -27
  13. package/dist/cjs/SheetModal/index.native.js.map +1 -1
  14. package/dist/cjs/Tabs/index.cjs +35 -18
  15. package/dist/cjs/Tabs/index.native.js +39 -18
  16. package/dist/cjs/Tabs/index.native.js.map +1 -1
  17. package/dist/cjs/Text.cjs +2 -0
  18. package/dist/cjs/Text.native.js +2 -0
  19. package/dist/cjs/Text.native.js.map +1 -1
  20. package/dist/cjs/TreeSelect/index.cjs +55 -52
  21. package/dist/cjs/TreeSelect/index.native.js +55 -52
  22. package/dist/cjs/TreeSelect/index.native.js.map +1 -1
  23. package/dist/cjs/Video/PlayerChrome.cjs +3 -9
  24. package/dist/cjs/Video/PlayerChrome.native.js +3 -9
  25. package/dist/cjs/Video/PlayerChrome.native.js.map +1 -1
  26. package/dist/cjs/code/Code/index.cjs +6 -0
  27. package/dist/cjs/code/Code/index.native.js +7 -4
  28. package/dist/cjs/code/Code/index.native.js.map +1 -1
  29. package/dist/cjs/code/CodeBlock/index.cjs +4 -5
  30. package/dist/cjs/code/CodeBlock/index.native.js +4 -5
  31. package/dist/cjs/code/CodeBlock/index.native.js.map +1 -1
  32. package/dist/cjs/icons/themed.cjs +2 -1
  33. package/dist/cjs/icons/themed.native.js +2 -1
  34. package/dist/cjs/icons/themed.native.js.map +1 -1
  35. package/dist/cjs/knobImmuneExports.cjs +3 -3
  36. package/dist/cjs/knobImmuneExports.native.js +3 -3
  37. package/dist/cjs/layouts/PaneScaffold.cjs +70 -42
  38. package/dist/cjs/layouts/PaneScaffold.native.js +75 -48
  39. package/dist/cjs/layouts/PaneScaffold.native.js.map +1 -1
  40. package/dist/cjs/layouts/page.cjs +2 -1
  41. package/dist/cjs/layouts/page.native.js +2 -1
  42. package/dist/cjs/layouts/page.native.js.map +1 -1
  43. package/dist/cjs/layouts/sidebar.cjs +1 -3
  44. package/dist/cjs/layouts/sidebar.native.js +1 -3
  45. package/dist/cjs/layouts/sidebar.native.js.map +1 -1
  46. package/dist/cjs/layouts/tags.native.js.map +1 -1
  47. package/dist/cjs/surfaces.cjs +0 -32
  48. package/dist/cjs/surfaces.native.js +0 -32
  49. package/dist/cjs/surfaces.native.js.map +1 -1
  50. package/dist/cjs/views/List.cjs +1 -3
  51. package/dist/cjs/views/List.native.js +1 -3
  52. package/dist/cjs/views/List.native.js.map +1 -1
  53. package/dist/cjs/views/Matrix.cjs +568 -0
  54. package/dist/cjs/views/Matrix.native.js +612 -0
  55. package/dist/cjs/views/Matrix.native.js.map +1 -0
  56. package/dist/cjs/views/TreeView.cjs +175 -43
  57. package/dist/cjs/views/TreeView.native.js +181 -46
  58. package/dist/cjs/views/TreeView.native.js.map +1 -1
  59. package/dist/cjs/views/ganttMath.cjs +2 -0
  60. package/dist/cjs/views/ganttMath.native.js +2 -0
  61. package/dist/cjs/views/ganttMath.native.js.map +1 -1
  62. package/dist/cjs/views/index.cjs +16 -0
  63. package/dist/cjs/views/index.native.js +16 -0
  64. package/dist/cjs/views/index.native.js.map +1 -1
  65. package/dist/cjs/views/matrixMath.cjs +157 -0
  66. package/dist/cjs/views/matrixMath.native.js +229 -0
  67. package/dist/cjs/views/matrixMath.native.js.map +1 -0
  68. package/dist/esm/Accordion/index.mjs +3 -7
  69. package/dist/esm/Accordion/index.mjs.map +1 -1
  70. package/dist/esm/Accordion/index.native.js +3 -7
  71. package/dist/esm/Accordion/index.native.js.map +1 -1
  72. package/dist/esm/AnimateHeight/index.mjs +2 -4
  73. package/dist/esm/AnimateHeight/index.mjs.map +1 -1
  74. package/dist/esm/AnimateHeight/index.native.js +2 -4
  75. package/dist/esm/AnimateHeight/index.native.js.map +1 -1
  76. package/dist/esm/Avatar/getInitials.native.js.map +1 -1
  77. package/dist/esm/Avatar/index.native.js.map +1 -1
  78. package/dist/esm/Badge/index.native.js.map +1 -1
  79. package/dist/esm/Button.native.js.map +1 -1
  80. package/dist/esm/Carousel/index.native.js.map +1 -1
  81. package/dist/esm/Chip/index.mjs +9 -2
  82. package/dist/esm/Chip/index.mjs.map +1 -1
  83. package/dist/esm/Chip/index.native.js +9 -2
  84. package/dist/esm/Chip/index.native.js.map +1 -1
  85. package/dist/esm/Collapsible.native.js.map +1 -1
  86. package/dist/esm/ContextMenu/index.native.js.map +1 -1
  87. package/dist/esm/CopyField/index.native.js.map +1 -1
  88. package/dist/esm/DotIndicator/index.native.js.map +1 -1
  89. package/dist/esm/DropdownMenu/index.native.js.map +1 -1
  90. package/dist/esm/ErrorBoundary/index.native.js.map +1 -1
  91. package/dist/esm/Heading.native.js.map +1 -1
  92. package/dist/esm/Meter/index.native.js.map +1 -1
  93. package/dist/esm/Meter/meter.native.js.map +1 -1
  94. package/dist/esm/Pagination.native.js.map +1 -1
  95. package/dist/esm/ProgressSteps/index.native.js.map +1 -1
  96. package/dist/esm/Quote/index.native.js.map +1 -1
  97. package/dist/esm/Separator/index.native.js.map +1 -1
  98. package/dist/esm/SheetModal/detents.native.js.map +1 -1
  99. package/dist/esm/SheetModal/index.mjs +22 -3
  100. package/dist/esm/SheetModal/index.mjs.map +1 -1
  101. package/dist/esm/SheetModal/index.native.js +117 -29
  102. package/dist/esm/SheetModal/index.native.js.map +1 -1
  103. package/dist/esm/Skeleton/index.native.js.map +1 -1
  104. package/dist/esm/SkipLink/index.native.js.map +1 -1
  105. package/dist/esm/SortableList/SortableHandle.native.js.map +1 -1
  106. package/dist/esm/SortableList/index.native.js.map +1 -1
  107. package/dist/esm/SortableList/useSortableRows.native.js.map +1 -1
  108. package/dist/esm/Tabs/index.mjs +36 -19
  109. package/dist/esm/Tabs/index.mjs.map +1 -1
  110. package/dist/esm/Tabs/index.native.js +40 -19
  111. package/dist/esm/Tabs/index.native.js.map +1 -1
  112. package/dist/esm/Text.mjs +3 -1
  113. package/dist/esm/Text.mjs.map +1 -1
  114. package/dist/esm/Text.native.js +3 -1
  115. package/dist/esm/Text.native.js.map +1 -1
  116. package/dist/esm/Toast/index.native.js.map +1 -1
  117. package/dist/esm/Toast/store.native.js.map +1 -1
  118. package/dist/esm/Tooltip/nativePress.native.js.map +1 -1
  119. package/dist/esm/Tooltip/tooltipShared.native.js.map +1 -1
  120. package/dist/esm/TreeSelect/index.mjs +56 -53
  121. package/dist/esm/TreeSelect/index.mjs.map +1 -1
  122. package/dist/esm/TreeSelect/index.native.js +56 -53
  123. package/dist/esm/TreeSelect/index.native.js.map +1 -1
  124. package/dist/esm/TreeSelect/treeSelectModel.native.js.map +1 -1
  125. package/dist/esm/Video/PlayerChrome.mjs +4 -10
  126. package/dist/esm/Video/PlayerChrome.mjs.map +1 -1
  127. package/dist/esm/Video/PlayerChrome.native.js +4 -10
  128. package/dist/esm/Video/PlayerChrome.native.js.map +1 -1
  129. package/dist/esm/Video/VideoFrame.native.js.map +1 -1
  130. package/dist/esm/Video/types.native.js.map +1 -1
  131. package/dist/esm/Wheel/index.native.js.map +1 -1
  132. package/dist/esm/Wizard/index.native.js.map +1 -1
  133. package/dist/esm/actions/ActionBar.native.js.map +1 -1
  134. package/dist/esm/actions/DestructiveAction.native.js.map +1 -1
  135. package/dist/esm/actions/devWarn.native.js.map +1 -1
  136. package/dist/esm/actions/index.native.js.map +1 -1
  137. package/dist/esm/actions/severity.native.js.map +1 -1
  138. package/dist/esm/charts/Axis.native.js.map +1 -1
  139. package/dist/esm/charts/BarChart.native.js.map +1 -1
  140. package/dist/esm/charts/ChartDataView.native.js.map +1 -1
  141. package/dist/esm/charts/ChartSurface.native.js.map +1 -1
  142. package/dist/esm/charts/LineChart.native.js.map +1 -1
  143. package/dist/esm/charts/PieChart.native.js.map +1 -1
  144. package/dist/esm/charts/Sparkline.native.js.map +1 -1
  145. package/dist/esm/charts/accessibility.native.js.map +1 -1
  146. package/dist/esm/charts/composeChart.native.js.map +1 -1
  147. package/dist/esm/charts/index.native.js.map +1 -1
  148. package/dist/esm/charts/math.native.js.map +1 -1
  149. package/dist/esm/charts/series.native.js.map +1 -1
  150. package/dist/esm/charts/svg.native.js.map +1 -1
  151. package/dist/esm/charts/types.native.js.map +1 -1
  152. package/dist/esm/charts/useChartTheme.native.js.map +1 -1
  153. package/dist/esm/code/Code/index.mjs +6 -0
  154. package/dist/esm/code/Code/index.mjs.map +1 -1
  155. package/dist/esm/code/Code/index.native.js +10 -7
  156. package/dist/esm/code/Code/index.native.js.map +1 -1
  157. package/dist/esm/code/CodeBlock/index.mjs +5 -6
  158. package/dist/esm/code/CodeBlock/index.mjs.map +1 -1
  159. package/dist/esm/code/CodeBlock/index.native.js +5 -6
  160. package/dist/esm/code/CodeBlock/index.native.js.map +1 -1
  161. package/dist/esm/code/HighlightedCode/index.native.js.map +1 -1
  162. package/dist/esm/code/Highlighter/index.native.js.map +1 -1
  163. package/dist/esm/code/Pre/index.native.js.map +1 -1
  164. package/dist/esm/code/index.native.js.map +1 -1
  165. package/dist/esm/componentColors.native.js.map +1 -1
  166. package/dist/esm/feedback/ConfirmDialog.native.js.map +1 -1
  167. package/dist/esm/feedback/NotifyHost.native.js.map +1 -1
  168. package/dist/esm/feedback/copy.native.js.map +1 -1
  169. package/dist/esm/feedback/index.native.js.map +1 -1
  170. package/dist/esm/feedback/notify.native.js.map +1 -1
  171. package/dist/esm/feedback/route.native.js.map +1 -1
  172. package/dist/esm/feedback/store.native.js.map +1 -1
  173. package/dist/esm/hooks/index.native.js.map +1 -1
  174. package/dist/esm/hooks/useClipboard.native.js.map +1 -1
  175. package/dist/esm/hooks/useDocumentTitle.native.js.map +1 -1
  176. package/dist/esm/icons/CheckRegular.native.js.map +1 -1
  177. package/dist/esm/icons/MinusRegular.native.js.map +1 -1
  178. package/dist/esm/icons/index.native.js.map +1 -1
  179. package/dist/esm/icons/lucide.native.js.map +1 -1
  180. package/dist/esm/icons/themed.mjs +3 -2
  181. package/dist/esm/icons/themed.mjs.map +1 -1
  182. package/dist/esm/icons/themed.native.js +3 -2
  183. package/dist/esm/icons/themed.native.js.map +1 -1
  184. package/dist/esm/images/Image/ImageFrame.native.js.map +1 -1
  185. package/dist/esm/images/Image/shared.native.js.map +1 -1
  186. package/dist/esm/images/Image/types.native.js.map +1 -1
  187. package/dist/esm/images/index.native.js.map +1 -1
  188. package/dist/esm/index.native.js.map +1 -1
  189. package/dist/esm/knobImmuneExports.mjs +3 -3
  190. package/dist/esm/knobImmuneExports.native.js +3 -3
  191. package/dist/esm/knobImmuneExports.native.js.map +1 -1
  192. package/dist/esm/layouts/AsyncBoundary.native.js.map +1 -1
  193. package/dist/esm/layouts/Debug/index.native.js.map +1 -1
  194. package/dist/esm/layouts/EmptyState.native.js.map +1 -1
  195. package/dist/esm/layouts/KeyboardAvoidingWrapper/behavior.native.js.map +1 -1
  196. package/dist/esm/layouts/PageTemplates.native.js.map +1 -1
  197. package/dist/esm/layouts/PaneScaffold.mjs +70 -42
  198. package/dist/esm/layouts/PaneScaffold.mjs.map +1 -1
  199. package/dist/esm/layouts/PaneScaffold.native.js +75 -48
  200. package/dist/esm/layouts/PaneScaffold.native.js.map +1 -1
  201. package/dist/esm/layouts/SafeAreaWrapper/insets.native.js.map +1 -1
  202. package/dist/esm/layouts/ViewSwitcher.native.js.map +1 -1
  203. package/dist/esm/layouts/attachments.native.js.map +1 -1
  204. package/dist/esm/layouts/breadcrumbs.native.js.map +1 -1
  205. package/dist/esm/layouts/index.native.js.map +1 -1
  206. package/dist/esm/layouts/page.mjs +3 -2
  207. package/dist/esm/layouts/page.mjs.map +1 -1
  208. package/dist/esm/layouts/page.native.js +3 -2
  209. package/dist/esm/layouts/page.native.js.map +1 -1
  210. package/dist/esm/layouts/pageHeadingScope.native.js.map +1 -1
  211. package/dist/esm/layouts/sidebar.mjs +2 -4
  212. package/dist/esm/layouts/sidebar.mjs.map +1 -1
  213. package/dist/esm/layouts/sidebar.native.js +2 -4
  214. package/dist/esm/layouts/sidebar.native.js.map +1 -1
  215. package/dist/esm/layouts/tags.mjs.map +1 -1
  216. package/dist/esm/layouts/tags.native.js.map +1 -1
  217. package/dist/esm/layouts/timeline.native.js.map +1 -1
  218. package/dist/esm/layouts/toolbar.native.js.map +1 -1
  219. package/dist/esm/shared/actionScan.native.js.map +1 -1
  220. package/dist/esm/shared/i18n.native.js.map +1 -1
  221. package/dist/esm/shared/t.native.js.map +1 -1
  222. package/dist/esm/shared/textRidesText.native.js.map +1 -1
  223. package/dist/esm/shared/useReturnFocusOnClose.native.js.map +1 -1
  224. package/dist/esm/surfaces.mjs +1 -33
  225. package/dist/esm/surfaces.mjs.map +1 -1
  226. package/dist/esm/surfaces.native.js +1 -33
  227. package/dist/esm/surfaces.native.js.map +1 -1
  228. package/dist/esm/tamagui.native.js.map +1 -1
  229. package/dist/esm/testSetup.native.js.map +1 -1
  230. package/dist/esm/utils/setTinted.native.js.map +1 -1
  231. package/dist/esm/utils/unwrapText.native.js.map +1 -1
  232. package/dist/esm/views/Calendar.native.js.map +1 -1
  233. package/dist/esm/views/Dashboard.native.js.map +1 -1
  234. package/dist/esm/views/Gantt.native.js.map +1 -1
  235. package/dist/esm/views/ImageGrid.native.js.map +1 -1
  236. package/dist/esm/views/List.mjs +2 -4
  237. package/dist/esm/views/List.mjs.map +1 -1
  238. package/dist/esm/views/List.native.js +2 -4
  239. package/dist/esm/views/List.native.js.map +1 -1
  240. package/dist/esm/views/Matrix.mjs +543 -0
  241. package/dist/esm/views/Matrix.mjs.map +1 -0
  242. package/dist/esm/views/Matrix.native.js +573 -0
  243. package/dist/esm/views/Matrix.native.js.map +1 -0
  244. package/dist/esm/views/ReportBuilder.native.js.map +1 -1
  245. package/dist/esm/views/TreeView.mjs +175 -43
  246. package/dist/esm/views/TreeView.mjs.map +1 -1
  247. package/dist/esm/views/TreeView.native.js +181 -46
  248. package/dist/esm/views/TreeView.native.js.map +1 -1
  249. package/dist/esm/views/calendarMath.native.js.map +1 -1
  250. package/dist/esm/views/ganttMath.mjs +1 -1
  251. package/dist/esm/views/ganttMath.mjs.map +1 -1
  252. package/dist/esm/views/ganttMath.native.js +1 -1
  253. package/dist/esm/views/ganttMath.native.js.map +1 -1
  254. package/dist/esm/views/index.mjs +4 -2
  255. package/dist/esm/views/index.mjs.map +1 -1
  256. package/dist/esm/views/index.native.js +4 -2
  257. package/dist/esm/views/index.native.js.map +1 -1
  258. package/dist/esm/views/kanbanDnd.native.js.map +1 -1
  259. package/dist/esm/views/matrixMath.mjs +122 -0
  260. package/dist/esm/views/matrixMath.mjs.map +1 -0
  261. package/dist/esm/views/matrixMath.native.js +191 -0
  262. package/dist/esm/views/matrixMath.native.js.map +1 -0
  263. package/dist/esm/views/treeViewDnd.native.js.map +1 -1
  264. package/dist/esm/views/treeViewLayout.native.js.map +1 -1
  265. package/dist/esm/views/treeViewMotion.native.js.map +1 -1
  266. package/dist/esm/views/treeViewReveal.native.js.map +1 -1
  267. package/dist/jsx/Accordion/index.mjs +3 -7
  268. package/dist/jsx/Accordion/index.mjs.map +1 -1
  269. package/dist/jsx/Accordion/index.native.js +2 -6
  270. package/dist/jsx/Accordion/index.native.js.map +1 -1
  271. package/dist/jsx/AnimateHeight/index.mjs +2 -4
  272. package/dist/jsx/AnimateHeight/index.mjs.map +1 -1
  273. package/dist/jsx/AnimateHeight/index.native.js +1 -3
  274. package/dist/jsx/AnimateHeight/index.native.js.map +1 -1
  275. package/dist/jsx/Chip/index.mjs +9 -2
  276. package/dist/jsx/Chip/index.mjs.map +1 -1
  277. package/dist/jsx/Chip/index.native.js +8 -1
  278. package/dist/jsx/Chip/index.native.js.map +1 -1
  279. package/dist/jsx/SheetModal/index.mjs +22 -3
  280. package/dist/jsx/SheetModal/index.mjs.map +1 -1
  281. package/dist/jsx/SheetModal/index.native.js +115 -27
  282. package/dist/jsx/SheetModal/index.native.js.map +1 -1
  283. package/dist/jsx/Tabs/index.mjs +36 -19
  284. package/dist/jsx/Tabs/index.mjs.map +1 -1
  285. package/dist/jsx/Tabs/index.native.js +39 -18
  286. package/dist/jsx/Tabs/index.native.js.map +1 -1
  287. package/dist/jsx/Text.mjs +3 -1
  288. package/dist/jsx/Text.mjs.map +1 -1
  289. package/dist/jsx/Text.native.js +2 -0
  290. package/dist/jsx/Text.native.js.map +1 -1
  291. package/dist/jsx/TreeSelect/index.mjs +56 -53
  292. package/dist/jsx/TreeSelect/index.mjs.map +1 -1
  293. package/dist/jsx/TreeSelect/index.native.js +55 -52
  294. package/dist/jsx/TreeSelect/index.native.js.map +1 -1
  295. package/dist/jsx/Video/PlayerChrome.mjs +4 -10
  296. package/dist/jsx/Video/PlayerChrome.mjs.map +1 -1
  297. package/dist/jsx/Video/PlayerChrome.native.js +3 -9
  298. package/dist/jsx/Video/PlayerChrome.native.js.map +1 -1
  299. package/dist/jsx/code/Code/index.mjs +6 -0
  300. package/dist/jsx/code/Code/index.mjs.map +1 -1
  301. package/dist/jsx/code/Code/index.native.js +7 -4
  302. package/dist/jsx/code/Code/index.native.js.map +1 -1
  303. package/dist/jsx/code/CodeBlock/index.mjs +5 -6
  304. package/dist/jsx/code/CodeBlock/index.mjs.map +1 -1
  305. package/dist/jsx/code/CodeBlock/index.native.js +4 -5
  306. package/dist/jsx/code/CodeBlock/index.native.js.map +1 -1
  307. package/dist/jsx/icons/themed.mjs +3 -2
  308. package/dist/jsx/icons/themed.mjs.map +1 -1
  309. package/dist/jsx/icons/themed.native.js +2 -1
  310. package/dist/jsx/icons/themed.native.js.map +1 -1
  311. package/dist/jsx/knobImmuneExports.mjs +3 -3
  312. package/dist/jsx/knobImmuneExports.native.js +3 -3
  313. package/dist/jsx/layouts/PaneScaffold.mjs +70 -42
  314. package/dist/jsx/layouts/PaneScaffold.mjs.map +1 -1
  315. package/dist/jsx/layouts/PaneScaffold.native.js +75 -48
  316. package/dist/jsx/layouts/PaneScaffold.native.js.map +1 -1
  317. package/dist/jsx/layouts/page.mjs +3 -2
  318. package/dist/jsx/layouts/page.mjs.map +1 -1
  319. package/dist/jsx/layouts/page.native.js +2 -1
  320. package/dist/jsx/layouts/page.native.js.map +1 -1
  321. package/dist/jsx/layouts/sidebar.mjs +2 -4
  322. package/dist/jsx/layouts/sidebar.mjs.map +1 -1
  323. package/dist/jsx/layouts/sidebar.native.js +1 -3
  324. package/dist/jsx/layouts/sidebar.native.js.map +1 -1
  325. package/dist/jsx/layouts/tags.mjs.map +1 -1
  326. package/dist/jsx/layouts/tags.native.js.map +1 -1
  327. package/dist/jsx/surfaces.mjs +1 -33
  328. package/dist/jsx/surfaces.mjs.map +1 -1
  329. package/dist/jsx/surfaces.native.js +0 -32
  330. package/dist/jsx/surfaces.native.js.map +1 -1
  331. package/dist/jsx/views/List.mjs +2 -4
  332. package/dist/jsx/views/List.mjs.map +1 -1
  333. package/dist/jsx/views/List.native.js +1 -3
  334. package/dist/jsx/views/List.native.js.map +1 -1
  335. package/dist/jsx/views/Matrix.mjs +543 -0
  336. package/dist/jsx/views/Matrix.mjs.map +1 -0
  337. package/dist/jsx/views/Matrix.native.js +612 -0
  338. package/dist/jsx/views/Matrix.native.js.map +1 -0
  339. package/dist/jsx/views/TreeView.mjs +175 -43
  340. package/dist/jsx/views/TreeView.mjs.map +1 -1
  341. package/dist/jsx/views/TreeView.native.js +181 -46
  342. package/dist/jsx/views/TreeView.native.js.map +1 -1
  343. package/dist/jsx/views/ganttMath.mjs +1 -1
  344. package/dist/jsx/views/ganttMath.mjs.map +1 -1
  345. package/dist/jsx/views/ganttMath.native.js +2 -0
  346. package/dist/jsx/views/ganttMath.native.js.map +1 -1
  347. package/dist/jsx/views/index.mjs +4 -2
  348. package/dist/jsx/views/index.mjs.map +1 -1
  349. package/dist/jsx/views/index.native.js +16 -0
  350. package/dist/jsx/views/index.native.js.map +1 -1
  351. package/dist/jsx/views/matrixMath.mjs +122 -0
  352. package/dist/jsx/views/matrixMath.mjs.map +1 -0
  353. package/dist/jsx/views/matrixMath.native.js +229 -0
  354. package/dist/jsx/views/matrixMath.native.js.map +1 -0
  355. package/package.json +12 -12
  356. package/src/Accordion/Accordion.spec.tsx +20 -0
  357. package/src/Accordion/index.tsx +8 -4
  358. package/src/AnimateHeight/index.tsx +143 -142
  359. package/src/Chip/Chip.borderLadder.spec.tsx +54 -0
  360. package/src/Chip/Chip.pressSlop.spec.tsx +57 -0
  361. package/src/Chip/index.tsx +15 -1
  362. package/src/Heading.native.spec.tsx +1 -1
  363. package/src/Separator/index.tsx +3 -3
  364. package/src/SheetModal/SheetModal.detentLayout.spec.tsx +173 -0
  365. package/src/SheetModal/SheetModal.fill.spec.tsx +147 -0
  366. package/src/SheetModal/SheetModal.ownedBody.spec.tsx +200 -0
  367. package/src/SheetModal/SheetModal.stories.spec.tsx +23 -2
  368. package/src/SheetModal/SheetModal.stories.tsx +275 -2
  369. package/src/SheetModal/SheetModal.touch.spec.tsx +63 -0
  370. package/src/SheetModal/index.native.tsx +143 -21
  371. package/src/SheetModal/index.tsx +40 -3
  372. package/src/Tabs/Tabs.hydration.spec.tsx +123 -0
  373. package/src/Tabs/Tabs.lifecycle.spec.tsx +123 -0
  374. package/src/Tabs/Tabs.measurement.spec.tsx +186 -0
  375. package/src/Tabs/Tabs.stories.tsx +43 -0
  376. package/src/Tabs/index.tsx +45 -15
  377. package/src/Text.spec.tsx +32 -2
  378. package/src/Text.tsx +7 -6
  379. package/src/Toast/Toast.spec.tsx +50 -0
  380. package/src/Tooltip/Tooltip.spec.tsx +55 -2
  381. package/src/TreeSelect/TreeSelect.spec.tsx +15 -15
  382. package/src/TreeSelect/index.tsx +53 -50
  383. package/src/Video/PlayerChrome.tsx +4 -3
  384. package/src/Wheel/Wheel.spec.tsx +4 -4
  385. package/src/adjacency.l1.spec.tsx +175 -0
  386. package/src/code/Code/code.spec.tsx +2 -19
  387. package/src/code/Code/index.tsx +0 -6
  388. package/src/code/CodeBlock/index.tsx +5 -3
  389. package/src/code/highlightedCode.spec.tsx +2 -2
  390. package/src/code/hostProps.spec.tsx +55 -0
  391. package/src/icons/themed.hydration.spec.tsx +60 -0
  392. package/src/icons/themed.tsx +3 -6
  393. package/src/knobImmuneExports.ts +3 -3
  394. package/src/layouts/PaneScaffold.spec.tsx +148 -2
  395. package/src/layouts/PaneScaffold.stories.tsx +33 -1
  396. package/src/layouts/PaneScaffold.tsx +101 -48
  397. package/src/layouts/page.designLaw.spec.tsx +20 -0
  398. package/src/layouts/page.tsx +2 -0
  399. package/src/layouts/sidebar.tsx +2 -3
  400. package/src/layouts/tags.tsx +2 -1
  401. package/src/overlayElevation.spec.tsx +39 -51
  402. package/src/surfaces.spec.tsx +13 -10
  403. package/src/surfaces.tsx +4 -33
  404. package/src/tamagui.spec.ts +4 -3
  405. package/src/textAccentSecondary.spec.tsx +100 -2
  406. package/src/views/List.tsx +2 -1
  407. package/src/views/Matrix.spec.tsx +339 -0
  408. package/src/views/Matrix.stories.spec.tsx +68 -0
  409. package/src/views/Matrix.stories.tsx +153 -0
  410. package/src/views/Matrix.tsx +738 -0
  411. package/src/views/TreeView.reveal.spec.tsx +7 -0
  412. package/src/views/TreeView.reveal.stories.tsx +134 -0
  413. package/src/views/TreeView.scroll-index.spec.tsx +246 -0
  414. package/src/views/TreeView.scroll.spec.tsx +711 -50
  415. package/src/views/TreeView.tsx +230 -49
  416. package/src/views/ganttMath.ts +4 -2
  417. package/src/views/index.ts +30 -0
  418. package/src/views/matrixMath.spec.ts +237 -0
  419. package/src/views/matrixMath.ts +251 -0
  420. package/src/views/views.spec.tsx +3 -1
  421. package/types/Accordion/index.d.ts.map +1 -1
  422. package/types/AnimateHeight/index.d.ts.map +1 -1
  423. package/types/Chip/index.d.ts.map +1 -1
  424. package/types/Separator/index.d.ts +3 -3
  425. package/types/SheetModal/index.d.ts +8 -1
  426. package/types/SheetModal/index.d.ts.map +1 -1
  427. package/types/SheetModal/index.native.d.ts +1 -1
  428. package/types/SheetModal/index.native.d.ts.map +1 -1
  429. package/types/Tabs/index.d.ts.map +1 -1
  430. package/types/Text.d.ts.map +1 -1
  431. package/types/TreeSelect/index.d.ts.map +1 -1
  432. package/types/Video/PlayerChrome.d.ts.map +1 -1
  433. package/types/code/Code/index.d.ts.map +1 -1
  434. package/types/code/CodeBlock/index.d.ts.map +1 -1
  435. package/types/icons/themed.d.ts.map +1 -1
  436. package/types/layouts/PaneScaffold.d.ts +14 -1
  437. package/types/layouts/PaneScaffold.d.ts.map +1 -1
  438. package/types/layouts/page.d.ts.map +1 -1
  439. package/types/layouts/sidebar.d.ts.map +1 -1
  440. package/types/layouts/tags.d.ts.map +1 -1
  441. package/types/surfaces.d.ts.map +1 -1
  442. package/types/views/List.d.ts.map +1 -1
  443. package/types/views/Matrix.d.ts +102 -0
  444. package/types/views/Matrix.d.ts.map +1 -0
  445. package/types/views/TreeView.d.ts +10 -1
  446. package/types/views/TreeView.d.ts.map +1 -1
  447. package/types/views/ganttMath.d.ts +4 -0
  448. package/types/views/ganttMath.d.ts.map +1 -1
  449. package/types/views/index.d.ts +3 -1
  450. package/types/views/index.d.ts.map +1 -1
  451. package/types/views/matrixMath.d.ts +114 -0
  452. package/types/views/matrixMath.d.ts.map +1 -0
@@ -134,6 +134,10 @@ export interface TreeViewProps<T = unknown> extends Omit<YStackProps, "children"
134
134
  overscan?: number;
135
135
  /** Height of the scrollable container in pixels */
136
136
  height?: number;
137
+ /** Initial vertical offset in layout pixels, restored once after usable list layout. */
138
+ initialScrollOffset?: number;
139
+ /** Observed, bounded vertical offset. Does not report unacknowledged scroll commands. */
140
+ onScrollOffsetChange?: (offset: number) => void;
137
141
  /** Message shown when there are no nodes */
138
142
  emptyMessage?: string;
139
143
  /** Controlled expansion; takes precedence over initial expansion props. */
@@ -142,6 +146,8 @@ export interface TreeViewProps<T = unknown> extends Omit<YStackProps, "children"
142
146
  onExpandedIdsChange?: (ids: string[]) => void;
143
147
  /** Expand ancestors and reveal this row. Change requestId to reveal the same ID again. */
144
148
  revealRequest?: { id: string; requestId: number };
149
+ /** Called once when the current reveal target is measured, mounted and visible. */
150
+ onRevealComplete?: (request: { id: string; requestId: number }) => void;
145
151
  /** Initially expanded node IDs (wins over expandByDefault when provided) */
146
152
  defaultExpandedIds?: string[];
147
153
  /** Expand every branch on initial load */
@@ -298,11 +304,14 @@ export function TreeView<T = unknown>({
298
304
  estimateSize: estimateSizeProp,
299
305
  overscan = 10,
300
306
  height: heightProp,
307
+ initialScrollOffset,
308
+ onScrollOffsetChange,
301
309
  emptyMessage: emptyMessageProp,
302
310
  defaultExpandedIds,
303
311
  expandedIds: controlledExpandedIds,
304
312
  onExpandedIdsChange,
305
313
  revealRequest,
314
+ onRevealComplete,
306
315
  expandByDefault = false,
307
316
  display = "default",
308
317
  showExpansionArrows = true,
@@ -349,6 +358,31 @@ export function TreeView<T = unknown>({
349
358
  const treeId = useId();
350
359
  const containerRef = useRef<HTMLDivElement>(null);
351
360
  const flashListRef = useRef<FlashListRef<FlatNode<T>>>(null);
361
+ const initialScroll = useRef<
362
+ | {
363
+ offset: number;
364
+ attempted?: { target: number; width: number; height: number; contentHeight: number };
365
+ }
366
+ | undefined
367
+ >(
368
+ initialScrollOffset === undefined
369
+ ? undefined
370
+ : { offset: Number.isFinite(initialScrollOffset) ? Math.max(0, initialScrollOffset) : 0 },
371
+ );
372
+ const cancelInitialScroll = useCallback(() => {
373
+ initialScroll.current = undefined;
374
+ }, []);
375
+ const hasNodes = nodes.length > 0;
376
+ const listInstance = useMemo(
377
+ () => ({ hasNodes, attached: false, loaded: false, indexScrollRequested: false, offset: 0 }),
378
+ [hasNodes],
379
+ );
380
+ const scrollActive = useRef(true);
381
+ const lastReportedOffset = useRef<number | undefined>(undefined);
382
+ const offsetCallback = useRef(onScrollOffsetChange);
383
+ useLayoutEffect(() => {
384
+ offsetCallback.current = onScrollOffsetChange;
385
+ }, [onScrollOffsetChange]);
352
386
  const [focusedIndex, setFocusedIndex] = useState(-1);
353
387
  // LC-71: ring is a React flag, not a render-time wasKeyboardFocus() read —
354
388
  // Tab-away/Tab-back with the same activedescendant must still re-paint.
@@ -396,6 +430,7 @@ export function TreeView<T = unknown>({
396
430
 
397
431
  const toggleNode = useCallback(
398
432
  (node: TreeNode<T>) => {
433
+ cancelInitialScroll();
399
434
  const next = new Set(expandedIds);
400
435
  if (next.has(node.id)) {
401
436
  next.delete(node.id);
@@ -405,7 +440,7 @@ export function TreeView<T = unknown>({
405
440
  setExpandedIds(next);
406
441
  onNodeToggle?.(node);
407
442
  },
408
- [expandedIds, setExpandedIds, onNodeToggle],
443
+ [expandedIds, setExpandedIds, onNodeToggle, cancelInitialScroll],
409
444
  );
410
445
 
411
446
  const previousExpandedIds = useRef(expandedIds);
@@ -470,16 +505,98 @@ export function TreeView<T = unknown>({
470
505
  }
471
506
  | undefined
472
507
  >(undefined);
473
- const revealFrame = useRef<number | undefined>(undefined);
474
- const revealStep = useRef<() => void>(() => {});
508
+ const scrollFrame = useRef<number | undefined>(undefined);
509
+ const scrollStep = useRef<() => void>(() => {});
475
510
  const renderedRows = useRef(new Set<string>());
476
- const scheduleReveal = useCallback(() => {
477
- if (!revealIntent.current || revealIntent.current.complete || revealFrame.current !== undefined)
511
+ const scrollBounds = useCallback(() => {
512
+ const list = flashListRef.current;
513
+ if (!scrollActive.current || !listInstance.attached || !listInstance.loaded || !list) return;
514
+ if (isWeb) {
515
+ const rect = containerRef.current?.getBoundingClientRect();
516
+ if (!rect || !(rect.width > 0) || !(rect.height > 0)) return;
517
+ }
518
+ const viewport = list.getWindowSize();
519
+ const contentHeight = list.getChildContainerDimensions().height + list.getFirstItemOffset();
520
+ if (
521
+ !Number.isFinite(viewport.width) ||
522
+ viewport.width <= 0 ||
523
+ !Number.isFinite(viewport.height) ||
524
+ viewport.height <= 0 ||
525
+ !Number.isFinite(contentHeight) ||
526
+ contentHeight <= 0
527
+ )
528
+ return;
529
+ return {
530
+ list,
531
+ width: viewport.width,
532
+ height: viewport.height,
533
+ contentHeight,
534
+ maxOffset: Math.max(0, contentHeight - viewport.height),
535
+ };
536
+ }, [listInstance]);
537
+ const observeOffset = useCallback(
538
+ (offset: number, fromEvent = false) => {
539
+ if (!scrollActive.current || !listInstance.attached || !Number.isFinite(offset)) return;
540
+ if (
541
+ fromEvent &&
542
+ initialScroll.current?.attempted === undefined &&
543
+ offset !== listInstance.offset
544
+ ) {
545
+ cancelInitialScroll();
546
+ }
547
+ listInstance.offset = offset;
548
+ const bounds = scrollBounds();
549
+ if (!bounds) return;
550
+ const bounded = Math.max(0, Math.min(offset, bounds.maxOffset));
551
+ const initial = initialScroll.current;
552
+ if (initial) {
553
+ const target = Math.min(initial.offset, bounds.maxOffset);
554
+ if (initial.attempted ? Math.abs(bounded - target) >= 1 : bounded !== target) return;
555
+ initialScroll.current = undefined;
556
+ }
557
+ if (offsetCallback.current && lastReportedOffset.current !== bounded) {
558
+ lastReportedOffset.current = bounded;
559
+ offsetCallback.current(bounded);
560
+ }
561
+ },
562
+ [cancelInitialScroll, scrollBounds, listInstance],
563
+ );
564
+ const scheduleScroll = useCallback(() => {
565
+ if (!scrollActive.current || !listInstance.attached || scrollFrame.current !== undefined)
478
566
  return;
479
- revealFrame.current = requestAnimationFrame(() => {
480
- revealFrame.current = undefined;
481
- revealStep.current();
567
+ if (
568
+ !initialScroll.current &&
569
+ (!revealIntent.current || revealIntent.current.complete) &&
570
+ !offsetCallback.current
571
+ )
572
+ return;
573
+ scrollFrame.current = requestAnimationFrame(() => {
574
+ scrollFrame.current = undefined;
575
+ if (listInstance.attached) scrollStep.current();
482
576
  });
577
+ }, [listInstance]);
578
+ const attachList = useCallback(
579
+ (list: FlashListRef<FlatNode<T>> | null) => {
580
+ flashListRef.current = list;
581
+ listInstance.attached = list !== null;
582
+ if (!list) {
583
+ listInstance.loaded = false;
584
+ if (initialScroll.current) initialScroll.current.attempted = undefined;
585
+ if (scrollFrame.current !== undefined) cancelAnimationFrame(scrollFrame.current);
586
+ scrollFrame.current = undefined;
587
+ }
588
+ },
589
+ [listInstance],
590
+ );
591
+
592
+ useLayoutEffect(() => {
593
+ scrollActive.current = true;
594
+ return () => {
595
+ scrollActive.current = false;
596
+ revealIntent.current = undefined;
597
+ if (scrollFrame.current !== undefined) cancelAnimationFrame(scrollFrame.current);
598
+ scrollFrame.current = undefined;
599
+ };
483
600
  }, []);
484
601
 
485
602
  useLayoutEffect(() => {
@@ -489,11 +606,49 @@ export function TreeView<T = unknown>({
489
606
  revealIntent.current?.id !== revealRequest.id ||
490
607
  revealIntent.current?.requestId !== revealRequest.requestId
491
608
  ) {
609
+ cancelInitialScroll();
492
610
  revealIntent.current = { ...revealRequest, complete: false };
493
611
  }
494
- revealStep.current = () => {
612
+ const step = () => {
613
+ const currentList = flashListRef.current;
614
+ if (currentList) {
615
+ // Index preparation changes FlashList's getter before transport completes.
616
+ // Once requested, only delivered events can advance this list's observation.
617
+ observeOffset(
618
+ listInstance.indexScrollRequested
619
+ ? listInstance.offset
620
+ : currentList.getAbsoluteLastScrollOffset(),
621
+ );
622
+ }
623
+ if (!scrollActive.current) return;
624
+ if (scrollStep.current !== step) {
625
+ scheduleScroll();
626
+ return;
627
+ }
495
628
  const intent = revealIntent.current;
496
- if (!intent || intent.complete) return;
629
+ if (!intent || intent.complete) {
630
+ const initial = initialScroll.current;
631
+ const bounds = scrollBounds();
632
+ if (!initial || !bounds || flatNodes.length === 0) return;
633
+ const target = Math.min(initial.offset, bounds.maxOffset);
634
+ const attempted = initial.attempted;
635
+ if (
636
+ !attempted ||
637
+ attempted.target !== target ||
638
+ attempted.width !== bounds.width ||
639
+ attempted.height !== bounds.height ||
640
+ attempted.contentHeight !== bounds.contentHeight
641
+ ) {
642
+ initial.attempted = {
643
+ target,
644
+ width: bounds.width,
645
+ height: bounds.height,
646
+ contentHeight: bounds.contentHeight,
647
+ };
648
+ bounds.list.scrollToOffset({ offset: target, animated: false });
649
+ }
650
+ return;
651
+ }
497
652
  const next = treeRevealExpansion(nodes, expandedIds, intent.id);
498
653
  if (!next) return;
499
654
  if (next !== expandedIds) {
@@ -519,29 +674,39 @@ export function TreeView<T = unknown>({
519
674
  if (viewport.width <= 0) return;
520
675
  const layout = list.getLayout(index);
521
676
  if (!layout) return;
522
- const offset = list.getAbsoluteLastScrollOffset();
677
+ const offset = listInstance.indexScrollRequested
678
+ ? listInstance.offset
679
+ : list.getAbsoluteLastScrollOffset();
680
+ const top = layout.y + list.getFirstItemOffset();
523
681
  const nextOffset = treeRevealOffset(
524
- { y: layout.y + list.getFirstItemOffset(), height: layout.height },
682
+ { y: top, height: layout.height },
525
683
  offset,
526
684
  viewport.height,
527
685
  );
528
686
  if (nextOffset === undefined) return;
529
687
  if (Math.abs(nextOffset - offset) < 1) {
530
- const visible = list.computeVisibleIndices();
688
+ let visible = top < offset + viewport.height && top + layout.height > offset;
689
+ if (!listInstance.indexScrollRequested) {
690
+ const range = list.computeVisibleIndices();
691
+ visible = visible && index >= range.startIndex && index <= range.endIndex;
692
+ }
531
693
  if (
694
+ revealIntent.current === intent &&
532
695
  layout.isHeightMeasured &&
533
696
  renderedRows.current.has(intent.id) &&
534
- index >= visible.startIndex &&
535
- index <= visible.endIndex
536
- )
697
+ visible
698
+ ) {
537
699
  intent.complete = true;
700
+ onRevealComplete?.({ id: intent.id, requestId: intent.requestId });
701
+ }
538
702
  return;
539
703
  }
540
704
  // FlashList's scrollToIndex has uncancellable delayed steps. Immediate offsets
541
705
  // let the next layout/scroll event correct estimates using only the latest intent.
542
706
  list.scrollToOffset({ offset: nextOffset, animated: false });
543
707
  };
544
- scheduleReveal();
708
+ scrollStep.current = step;
709
+ scheduleScroll();
545
710
  }, [
546
711
  nodes,
547
712
  expandedIds,
@@ -549,27 +714,25 @@ export function TreeView<T = unknown>({
549
714
  flatNodes,
550
715
  revealRequest?.id,
551
716
  revealRequest?.requestId,
717
+ onRevealComplete,
552
718
  height,
553
719
  motion,
554
- scheduleReveal,
720
+ scheduleScroll,
721
+ cancelInitialScroll,
722
+ observeOffset,
723
+ scrollBounds,
724
+ listInstance,
555
725
  ]);
556
726
 
557
- useLayoutEffect(
558
- () => () => {
559
- revealIntent.current = undefined;
560
- if (revealFrame.current !== undefined) cancelAnimationFrame(revealFrame.current);
561
- revealFrame.current = undefined;
562
- },
563
- [],
564
- );
565
-
566
727
  const scrollToIndex = useCallback(
567
728
  (index: number) => {
568
729
  if (index >= 0 && index < flatNodes.length) {
730
+ cancelInitialScroll();
731
+ listInstance.indexScrollRequested = true;
569
732
  flashListRef.current?.scrollToIndex({ index, animated: true });
570
733
  }
571
734
  },
572
- [flatNodes.length],
735
+ [flatNodes.length, cancelInitialScroll, listInstance],
573
736
  );
574
737
 
575
738
  const focusRow = useCallback(
@@ -863,6 +1026,7 @@ export function TreeView<T = unknown>({
863
1026
  if (!container?.getBoundingClientRect) return false;
864
1027
  const session = treeKeyboardLift(nodes, flat.node.id);
865
1028
  if (!session) return false;
1029
+ cancelInitialScroll();
866
1030
  const rowRect = rowEl.getBoundingClientRect();
867
1031
  const containerRect = container.getBoundingClientRect();
868
1032
  grabOffsetRef.current = { x: clientX - rowRect.left, y: clientY - rowRect.top };
@@ -890,7 +1054,7 @@ export function TreeView<T = unknown>({
890
1054
  startAutoScroll();
891
1055
  return true;
892
1056
  },
893
- [announce, nodes, startAutoScroll],
1057
+ [announce, nodes, startAutoScroll, cancelInitialScroll],
894
1058
  );
895
1059
 
896
1060
  const handleDragHandlePointerDown = useCallback(
@@ -1037,6 +1201,7 @@ export function TreeView<T = unknown>({
1037
1201
  if (!flat) return false;
1038
1202
  const session = treeKeyboardLift(nodes, flat.node.id);
1039
1203
  if (!session) return false;
1204
+ cancelInitialScroll();
1040
1205
  const ui: TreeDragUi<T> = {
1041
1206
  mode: "keyboard",
1042
1207
  node: flat.node,
@@ -1054,7 +1219,16 @@ export function TreeView<T = unknown>({
1054
1219
  dragUiRef.current = ui;
1055
1220
  announce(describeTreeDragState("lift", session, nodes, flat.node.label));
1056
1221
  return true;
1057
- }, [announce, canReorder, dndRows, flatNodes, focusedIndex, getRowHeight, nodes]);
1222
+ }, [
1223
+ announce,
1224
+ canReorder,
1225
+ dndRows,
1226
+ flatNodes,
1227
+ focusedIndex,
1228
+ getRowHeight,
1229
+ nodes,
1230
+ cancelInitialScroll,
1231
+ ]);
1058
1232
 
1059
1233
  const moveKeyboardDrag = useCallback(
1060
1234
  (direction: "up" | "down" | "left" | "right"): boolean => {
@@ -1284,21 +1458,28 @@ export function TreeView<T = unknown>({
1284
1458
  onFocus={handleContainerFocus}
1285
1459
  onBlur={handleContainerBlur}
1286
1460
  onKeyDown={handleTreeKeyDown}
1287
- onLayout={revealRequest ? scheduleReveal : undefined}
1461
+ onLayout={scheduleScroll}
1462
+ {...(isWeb && { onWheel: cancelInitialScroll, onPointerDown: cancelInitialScroll })}
1288
1463
  position="relative"
1289
1464
  style={{
1290
1465
  height,
1291
1466
  }}
1292
1467
  >
1293
1468
  <FlashList
1294
- ref={flashListRef}
1469
+ ref={attachList}
1295
1470
  data={flatNodes}
1296
1471
  drawDistance={overscan * estimateSize}
1297
1472
  keyExtractor={(item) => item.node.id}
1298
- {...(revealRequest && {
1299
- onLoad: scheduleReveal,
1300
- onCommitLayoutEffect: scheduleReveal,
1301
- })}
1473
+ onLoad={() => {
1474
+ if (!scrollActive.current || !listInstance.attached) return;
1475
+ listInstance.loaded = true;
1476
+ scheduleScroll();
1477
+ }}
1478
+ onCommitLayoutEffect={scheduleScroll}
1479
+ onContentSizeChange={scheduleScroll}
1480
+ onScrollBeginDrag={() => {
1481
+ if (scrollActive.current && listInstance.attached) cancelInitialScroll();
1482
+ }}
1302
1483
  extraData={{
1303
1484
  focused: effectiveFocused,
1304
1485
  selectedId,
@@ -1309,17 +1490,17 @@ export function TreeView<T = unknown>({
1309
1490
  keyboardRing,
1310
1491
  collapsedSelectedAncestors,
1311
1492
  }}
1312
- {...((canReorder || revealRequest) && {
1313
- onScroll: (e: any) => {
1314
- const y = e?.nativeEvent?.contentOffset?.y;
1315
- if (typeof y === "number") {
1316
- scrollOffsetRef.current = y;
1317
- if (dragUiRef.current) setDragScrollY(y);
1318
- }
1319
- scheduleReveal();
1320
- },
1321
- scrollEventThrottle: 16,
1322
- })}
1493
+ onScroll={(e: any) => {
1494
+ if (!scrollActive.current || !listInstance.attached) return;
1495
+ const y = e?.nativeEvent?.contentOffset?.y;
1496
+ if (typeof y === "number" && Number.isFinite(y)) {
1497
+ scrollOffsetRef.current = y;
1498
+ if (dragUiRef.current) setDragScrollY(y);
1499
+ observeOffset(y, true);
1500
+ }
1501
+ scheduleScroll();
1502
+ }}
1503
+ scrollEventThrottle={16}
1323
1504
  renderItem={({ item, index }) => {
1324
1505
  const { node, depth, hasChildren, isExpanded } = item;
1325
1506
  const isFocused = effectiveFocused === index;
@@ -1379,7 +1560,7 @@ export function TreeView<T = unknown>({
1379
1560
  ref={(row) => {
1380
1561
  if (row) renderedRows.current.add(node.id);
1381
1562
  else renderedRows.current.delete(node.id);
1382
- scheduleReveal();
1563
+ scheduleScroll();
1383
1564
  }}
1384
1565
  id={`${treeId}-node-${index}`}
1385
1566
  {...{ "data-treeview-row": node.id }}
@@ -1407,7 +1588,7 @@ export function TreeView<T = unknown>({
1407
1588
  onLayout={(e: any) => {
1408
1589
  const h = e?.nativeEvent?.layout?.height;
1409
1590
  if (typeof h === "number" && h > 0) rowHeights.current.set(node.id, h);
1410
- scheduleReveal();
1591
+ scheduleScroll();
1411
1592
  }}
1412
1593
  backgroundColor={
1413
1594
  // Nest-into parent highlight wins while a drag is active
@@ -127,14 +127,16 @@ export interface GanttRange {
127
127
  end: Date;
128
128
  }
129
129
 
130
- function startOfWeek(date: Date, firstDayOfWeek: 0 | 1): Date {
130
+ /** Local start of the week containing `date` (`firstDayOfWeek`: 0 = Sunday, 1 = Monday). */
131
+ export function startOfWeek(date: Date, firstDayOfWeek: 0 | 1): Date {
131
132
  const day = startOfDay(date);
132
133
  let offset = day.getDay() - firstDayOfWeek;
133
134
  if (offset < 0) offset += 7;
134
135
  return addDays(day, -offset);
135
136
  }
136
137
 
137
- function startOfMonth(date: Date): Date {
138
+ /** Local first of the month containing `date`. */
139
+ export function startOfMonth(date: Date): Date {
138
140
  return new Date(date.getFullYear(), date.getMonth(), 1);
139
141
  }
140
142
 
@@ -130,6 +130,8 @@ export {
130
130
  shiftSpanByDays,
131
131
  spanInclusiveDays,
132
132
  startOfDay,
133
+ startOfMonth,
134
+ startOfWeek,
133
135
  todayLineX,
134
136
  xToDate,
135
137
  type GanttBarGeometry,
@@ -141,6 +143,34 @@ export {
141
143
  type GanttTick,
142
144
  type GanttZoom,
143
145
  } from "./ganttMath";
146
+ export {
147
+ MatrixView,
148
+ type MatrixViewProps,
149
+ type MatrixRow,
150
+ type MatrixCellRef,
151
+ type MatrixLegendItem,
152
+ } from "./Matrix";
153
+ // matrixMath is surfaced whole for the same reason ganttMath is: pure bucket
154
+ // math a consumer laying out its own grid on the same axis needs unchanged.
155
+ export {
156
+ alignMatrixRange,
157
+ bucketName,
158
+ bucketStart,
159
+ computeMatrixRange,
160
+ generateBuckets,
161
+ localDateKey,
162
+ matrixCellIntensity,
163
+ matrixCellKey,
164
+ matrixMaxValue,
165
+ nextBucketStart,
166
+ summarizeMatrixCells,
167
+ type MatrixBucket,
168
+ type MatrixBucketRule,
169
+ type MatrixCell,
170
+ type MatrixCellSummary,
171
+ type MatrixIntent,
172
+ type MatrixRange,
173
+ } from "./matrixMath";
144
174
  // Kanban drag maths. Only the helper other packages consume is surfaced, in
145
175
  // keeping with this barrel's curated style: @multiplatform.one/table's
146
176
  // ChildTable imports renumberIdx to renumber rows after a reorder, and failed