@multiplatform.one/components 7.11.0 → 7.16.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 (691) hide show
  1. package/README.md +2 -2
  2. package/dist/cjs/Accordion/index.cjs +2 -6
  3. package/dist/cjs/Accordion/index.native.js +3 -7
  4. package/dist/cjs/Accordion/index.native.js.map +1 -1
  5. package/dist/cjs/Alert/index.native.js.map +1 -1
  6. package/dist/cjs/AnimateHeight/index.cjs +1 -3
  7. package/dist/cjs/AnimateHeight/index.native.js +1 -3
  8. package/dist/cjs/AnimateHeight/index.native.js.map +1 -1
  9. package/dist/cjs/Avatar/getInitials.native.js.map +1 -1
  10. package/dist/cjs/Avatar/index.native.js.map +1 -1
  11. package/dist/cjs/Badge/index.native.js.map +1 -1
  12. package/dist/cjs/Button.native.js.map +1 -1
  13. package/dist/cjs/Card.native.js.map +1 -1
  14. package/dist/cjs/CardFooter.native.js.map +1 -1
  15. package/dist/cjs/CardHeader.native.js.map +1 -1
  16. package/dist/cjs/Carousel/index.cjs +2 -1
  17. package/dist/cjs/Carousel/index.native.js +3 -2
  18. package/dist/cjs/Carousel/index.native.js.map +1 -1
  19. package/dist/cjs/Chip/index.cjs +13 -3
  20. package/dist/cjs/Chip/index.native.js +13 -3
  21. package/dist/cjs/Chip/index.native.js.map +1 -1
  22. package/dist/cjs/Collapsible.native.js.map +1 -1
  23. package/dist/cjs/ContextMenu/index.native.js.map +1 -1
  24. package/dist/cjs/CopyField/index.native.js.map +1 -1
  25. package/dist/cjs/DotIndicator/index.native.js.map +1 -1
  26. package/dist/cjs/DropdownMenu/index.native.js.map +1 -1
  27. package/dist/cjs/ErrorBoundary/index.native.js.map +1 -1
  28. package/dist/cjs/Heading.native.js.map +1 -1
  29. package/dist/cjs/Meter/index.native.js +1 -1
  30. package/dist/cjs/Meter/index.native.js.map +1 -1
  31. package/dist/cjs/Meter/meter.native.js.map +1 -1
  32. package/dist/cjs/Pagination.native.js +1 -1
  33. package/dist/cjs/Pagination.native.js.map +1 -1
  34. package/dist/cjs/ProgressSteps/index.native.js.map +1 -1
  35. package/dist/cjs/Quote/index.native.js.map +1 -1
  36. package/dist/cjs/ScrollView/index.cjs +28 -0
  37. package/dist/cjs/ScrollView/index.native.js +72 -0
  38. package/dist/cjs/ScrollView/index.native.js.map +1 -0
  39. package/dist/cjs/Separator/index.native.js.map +1 -1
  40. package/dist/cjs/SheetModal/detents.native.js.map +1 -1
  41. package/dist/cjs/SheetModal/index.native.js +70 -22
  42. package/dist/cjs/SheetModal/index.native.js.map +1 -1
  43. package/dist/cjs/Skeleton/index.cjs +1 -13
  44. package/dist/cjs/Skeleton/index.native.js +1 -13
  45. package/dist/cjs/Skeleton/index.native.js.map +1 -1
  46. package/dist/cjs/SkipLink/index.native.js.map +1 -1
  47. package/dist/cjs/SortableList/SortableHandle.native.js.map +1 -1
  48. package/dist/cjs/SortableList/index.native.js.map +1 -1
  49. package/dist/cjs/SortableList/useSortableRows.native.js.map +1 -1
  50. package/dist/cjs/Tabs/index.cjs +4 -7
  51. package/dist/cjs/Tabs/index.native.js +4 -7
  52. package/dist/cjs/Tabs/index.native.js.map +1 -1
  53. package/dist/cjs/Text.cjs +2 -0
  54. package/dist/cjs/Text.native.js +2 -0
  55. package/dist/cjs/Text.native.js.map +1 -1
  56. package/dist/cjs/Toast/index.native.js.map +1 -1
  57. package/dist/cjs/Toast/store.native.js.map +1 -1
  58. package/dist/cjs/Tooltip/nativePress.native.js.map +1 -1
  59. package/dist/cjs/Tooltip/tooltipShared.native.js.map +1 -1
  60. package/dist/cjs/TreeSelect/index.cjs +55 -52
  61. package/dist/cjs/TreeSelect/index.native.js +56 -53
  62. package/dist/cjs/TreeSelect/index.native.js.map +1 -1
  63. package/dist/cjs/TreeSelect/treeSelectModel.native.js.map +1 -1
  64. package/dist/cjs/Video/PlayerChrome.cjs +3 -9
  65. package/dist/cjs/Video/PlayerChrome.native.js +3 -9
  66. package/dist/cjs/Video/PlayerChrome.native.js.map +1 -1
  67. package/dist/cjs/Video/VideoFrame.native.js.map +1 -1
  68. package/dist/cjs/Video/types.native.js.map +1 -1
  69. package/dist/cjs/Wheel/index.native.js.map +1 -1
  70. package/dist/cjs/Wizard/index.native.js +2 -2
  71. package/dist/cjs/Wizard/index.native.js.map +1 -1
  72. package/dist/cjs/actions/ActionBar.native.js.map +1 -1
  73. package/dist/cjs/actions/DestructiveAction.native.js.map +1 -1
  74. package/dist/cjs/actions/devWarn.native.js.map +1 -1
  75. package/dist/cjs/actions/index.native.js.map +1 -1
  76. package/dist/cjs/actions/severity.native.js.map +1 -1
  77. package/dist/cjs/charts/Axis.native.js.map +1 -1
  78. package/dist/cjs/charts/BarChart.native.js.map +1 -1
  79. package/dist/cjs/charts/ChartDataView.native.js.map +1 -1
  80. package/dist/cjs/charts/ChartSurface.native.js.map +1 -1
  81. package/dist/cjs/charts/LineChart.native.js.map +1 -1
  82. package/dist/cjs/charts/PieChart.native.js.map +1 -1
  83. package/dist/cjs/charts/Sparkline.native.js.map +1 -1
  84. package/dist/cjs/charts/accessibility.native.js.map +1 -1
  85. package/dist/cjs/charts/composeChart.native.js.map +1 -1
  86. package/dist/cjs/charts/index.native.js.map +1 -1
  87. package/dist/cjs/charts/math.cjs +18 -0
  88. package/dist/cjs/charts/math.native.js +18 -0
  89. package/dist/cjs/charts/math.native.js.map +1 -1
  90. package/dist/cjs/charts/series.cjs +17 -8
  91. package/dist/cjs/charts/series.native.js +17 -8
  92. package/dist/cjs/charts/series.native.js.map +1 -1
  93. package/dist/cjs/charts/svg.cjs +6 -0
  94. package/dist/cjs/charts/svg.native.js +6 -0
  95. package/dist/cjs/charts/svg.native.js.map +1 -1
  96. package/dist/cjs/charts/types.native.js.map +1 -1
  97. package/dist/cjs/charts/useChartTheme.cjs +3 -9
  98. package/dist/cjs/charts/useChartTheme.native.js +4 -10
  99. package/dist/cjs/charts/useChartTheme.native.js.map +1 -1
  100. package/dist/cjs/code/Code/index.cjs +6 -0
  101. package/dist/cjs/code/Code/index.native.js +7 -4
  102. package/dist/cjs/code/Code/index.native.js.map +1 -1
  103. package/dist/cjs/code/CodeBlock/index.cjs +4 -5
  104. package/dist/cjs/code/CodeBlock/index.native.js +10 -11
  105. package/dist/cjs/code/CodeBlock/index.native.js.map +1 -1
  106. package/dist/cjs/code/HighlightedCode/index.native.js.map +1 -1
  107. package/dist/cjs/code/Highlighter/index.native.js.map +1 -1
  108. package/dist/cjs/code/Pre/index.native.js.map +1 -1
  109. package/dist/cjs/code/index.native.js +5 -5
  110. package/dist/cjs/code/index.native.js.map +1 -1
  111. package/dist/cjs/componentColors.native.js.map +1 -1
  112. package/dist/cjs/feedback/ConfirmDialog.native.js.map +1 -1
  113. package/dist/cjs/feedback/NotifyHost.native.js +2 -2
  114. package/dist/cjs/feedback/NotifyHost.native.js.map +1 -1
  115. package/dist/cjs/feedback/copy.native.js.map +1 -1
  116. package/dist/cjs/feedback/index.native.js.map +1 -1
  117. package/dist/cjs/feedback/notify.native.js.map +1 -1
  118. package/dist/cjs/feedback/route.native.js.map +1 -1
  119. package/dist/cjs/feedback/store.native.js.map +1 -1
  120. package/dist/cjs/hooks/index.native.js +1 -1
  121. package/dist/cjs/hooks/index.native.js.map +1 -1
  122. package/dist/cjs/hooks/useClipboard.native.js.map +1 -1
  123. package/dist/cjs/hooks/useDocumentTitle.native.js.map +1 -1
  124. package/dist/cjs/icons/CheckRegular.native.js.map +1 -1
  125. package/dist/cjs/icons/MinusRegular.native.js.map +1 -1
  126. package/dist/cjs/icons/index.native.js.map +1 -1
  127. package/dist/cjs/icons/lucide.native.js.map +1 -1
  128. package/dist/cjs/icons/themed.cjs +2 -1
  129. package/dist/cjs/icons/themed.native.js +2 -1
  130. package/dist/cjs/icons/themed.native.js.map +1 -1
  131. package/dist/cjs/images/Image/ImageFrame.native.js +1 -1
  132. package/dist/cjs/images/Image/ImageFrame.native.js.map +1 -1
  133. package/dist/cjs/images/Image/index.native.js +1 -1
  134. package/dist/cjs/images/Image/shared.native.js +1 -1
  135. package/dist/cjs/images/Image/shared.native.js.map +1 -1
  136. package/dist/cjs/images/Image/types.native.js.map +1 -1
  137. package/dist/cjs/images/index.native.js.map +1 -1
  138. package/dist/cjs/index.native.js +29 -29
  139. package/dist/cjs/index.native.js.map +1 -1
  140. package/dist/cjs/knobImmuneExports.cjs +3 -3
  141. package/dist/cjs/knobImmuneExports.native.js +3 -3
  142. package/dist/cjs/knobImmuneExports.native.js.map +1 -1
  143. package/dist/cjs/layouts/AsyncBoundary.native.js +2 -2
  144. package/dist/cjs/layouts/AsyncBoundary.native.js.map +1 -1
  145. package/dist/cjs/layouts/Debug/index.native.js.map +1 -1
  146. package/dist/cjs/layouts/EmptyState.native.js.map +1 -1
  147. package/dist/cjs/layouts/KeyboardAvoidingWrapper/behavior.native.js.map +1 -1
  148. package/dist/cjs/layouts/PageTemplates.native.js.map +1 -1
  149. package/dist/cjs/layouts/PaneScaffold.cjs +70 -42
  150. package/dist/cjs/layouts/PaneScaffold.native.js +75 -48
  151. package/dist/cjs/layouts/PaneScaffold.native.js.map +1 -1
  152. package/dist/cjs/layouts/SafeAreaWrapper/insets.native.js.map +1 -1
  153. package/dist/cjs/layouts/ViewSwitcher.native.js.map +1 -1
  154. package/dist/cjs/layouts/attachments.cjs +2 -1
  155. package/dist/cjs/layouts/attachments.native.js +3 -2
  156. package/dist/cjs/layouts/attachments.native.js.map +1 -1
  157. package/dist/cjs/layouts/breadcrumbs.native.js.map +1 -1
  158. package/dist/cjs/layouts/index.native.js +3 -3
  159. package/dist/cjs/layouts/index.native.js.map +1 -1
  160. package/dist/cjs/layouts/page.cjs +2 -1
  161. package/dist/cjs/layouts/page.native.js +2 -1
  162. package/dist/cjs/layouts/page.native.js.map +1 -1
  163. package/dist/cjs/layouts/pageHeadingScope.native.js.map +1 -1
  164. package/dist/cjs/layouts/sidebar.cjs +1 -3
  165. package/dist/cjs/layouts/sidebar.native.js +1 -3
  166. package/dist/cjs/layouts/sidebar.native.js.map +1 -1
  167. package/dist/cjs/layouts/tags.native.js +1 -1
  168. package/dist/cjs/layouts/tags.native.js.map +1 -1
  169. package/dist/cjs/layouts/timeline.cjs +9 -1
  170. package/dist/cjs/layouts/timeline.native.js +11 -3
  171. package/dist/cjs/layouts/timeline.native.js.map +1 -1
  172. package/dist/cjs/layouts/toolbar.native.js.map +1 -1
  173. package/dist/cjs/shared/actionScan.native.js.map +1 -1
  174. package/dist/cjs/shared/i18n.native.js.map +1 -1
  175. package/dist/cjs/shared/t.native.js.map +1 -1
  176. package/dist/cjs/shared/textRidesText.native.js.map +1 -1
  177. package/dist/cjs/shared/useReturnFocusOnClose.native.js.map +1 -1
  178. package/dist/cjs/surfaces.cjs +0 -32
  179. package/dist/cjs/surfaces.native.js +1 -33
  180. package/dist/cjs/surfaces.native.js.map +1 -1
  181. package/dist/cjs/tamagui.cjs +2 -1
  182. package/dist/cjs/tamagui.native.js +2 -1
  183. package/dist/cjs/tamagui.native.js.map +1 -1
  184. package/dist/cjs/testSetup.native.js.map +1 -1
  185. package/dist/cjs/utils/setTinted.native.js.map +1 -1
  186. package/dist/cjs/utils/unwrapText.native.js.map +1 -1
  187. package/dist/cjs/views/Calendar.native.js.map +1 -1
  188. package/dist/cjs/views/Dashboard.native.js +1 -1
  189. package/dist/cjs/views/Dashboard.native.js.map +1 -1
  190. package/dist/cjs/views/Gantt.native.js +1 -1
  191. package/dist/cjs/views/Gantt.native.js.map +1 -1
  192. package/dist/cjs/views/ImageGrid.native.js +1 -1
  193. package/dist/cjs/views/ImageGrid.native.js.map +1 -1
  194. package/dist/cjs/views/Kanban.cjs +1 -0
  195. package/dist/cjs/views/Kanban.native.js +3 -1
  196. package/dist/cjs/views/Kanban.native.js.map +1 -1
  197. package/dist/cjs/views/List.cjs +4 -4
  198. package/dist/cjs/views/List.native.js +7 -7
  199. package/dist/cjs/views/List.native.js.map +1 -1
  200. package/dist/cjs/views/Matrix.cjs +568 -0
  201. package/dist/cjs/views/Matrix.native.js +612 -0
  202. package/dist/cjs/views/Matrix.native.js.map +1 -0
  203. package/dist/cjs/views/ReportBuilder.native.js +1 -1
  204. package/dist/cjs/views/ReportBuilder.native.js.map +1 -1
  205. package/dist/cjs/views/TreeView.native.js.map +1 -1
  206. package/dist/cjs/views/calendarMath.native.js.map +1 -1
  207. package/dist/cjs/views/ganttMath.cjs +2 -0
  208. package/dist/cjs/views/ganttMath.native.js +2 -0
  209. package/dist/cjs/views/ganttMath.native.js.map +1 -1
  210. package/dist/cjs/views/index.cjs +16 -0
  211. package/dist/cjs/views/index.native.js +17 -1
  212. package/dist/cjs/views/index.native.js.map +1 -1
  213. package/dist/cjs/views/kanbanDnd.native.js.map +1 -1
  214. package/dist/cjs/views/matrixMath.cjs +157 -0
  215. package/dist/cjs/views/matrixMath.native.js +229 -0
  216. package/dist/cjs/views/matrixMath.native.js.map +1 -0
  217. package/dist/cjs/views/treeViewDnd.native.js.map +1 -1
  218. package/dist/cjs/views/treeViewLayout.native.js.map +1 -1
  219. package/dist/cjs/views/treeViewMotion.native.js.map +1 -1
  220. package/dist/cjs/views/treeViewReveal.native.js.map +1 -1
  221. package/dist/esm/Accordion/index.mjs +3 -7
  222. package/dist/esm/Accordion/index.mjs.map +1 -1
  223. package/dist/esm/Accordion/index.native.js +3 -7
  224. package/dist/esm/Accordion/index.native.js.map +1 -1
  225. package/dist/esm/AnimateHeight/index.mjs +2 -4
  226. package/dist/esm/AnimateHeight/index.mjs.map +1 -1
  227. package/dist/esm/AnimateHeight/index.native.js +2 -4
  228. package/dist/esm/AnimateHeight/index.native.js.map +1 -1
  229. package/dist/esm/Avatar/getInitials.native.js.map +1 -1
  230. package/dist/esm/Avatar/index.native.js.map +1 -1
  231. package/dist/esm/Badge/index.native.js.map +1 -1
  232. package/dist/esm/Button.native.js.map +1 -1
  233. package/dist/esm/Carousel/index.mjs +2 -1
  234. package/dist/esm/Carousel/index.mjs.map +1 -1
  235. package/dist/esm/Carousel/index.native.js +2 -1
  236. package/dist/esm/Carousel/index.native.js.map +1 -1
  237. package/dist/esm/Chip/index.mjs +15 -5
  238. package/dist/esm/Chip/index.mjs.map +1 -1
  239. package/dist/esm/Chip/index.native.js +15 -5
  240. package/dist/esm/Chip/index.native.js.map +1 -1
  241. package/dist/esm/Collapsible.native.js.map +1 -1
  242. package/dist/esm/ContextMenu/index.native.js.map +1 -1
  243. package/dist/esm/CopyField/index.native.js.map +1 -1
  244. package/dist/esm/DotIndicator/index.native.js.map +1 -1
  245. package/dist/esm/DropdownMenu/index.native.js.map +1 -1
  246. package/dist/esm/ErrorBoundary/index.native.js.map +1 -1
  247. package/dist/esm/Heading.native.js.map +1 -1
  248. package/dist/esm/Meter/index.native.js.map +1 -1
  249. package/dist/esm/Meter/meter.native.js.map +1 -1
  250. package/dist/esm/Pagination.native.js.map +1 -1
  251. package/dist/esm/ProgressSteps/index.native.js.map +1 -1
  252. package/dist/esm/Quote/index.native.js.map +1 -1
  253. package/dist/esm/ScrollView/index.mjs +3 -0
  254. package/dist/esm/ScrollView/index.mjs.map +1 -0
  255. package/dist/esm/ScrollView/index.native.js +44 -0
  256. package/dist/esm/ScrollView/index.native.js.map +1 -0
  257. package/dist/esm/Separator/index.native.js.map +1 -1
  258. package/dist/esm/SheetModal/detents.native.js.map +1 -1
  259. package/dist/esm/SheetModal/index.native.js +71 -23
  260. package/dist/esm/SheetModal/index.native.js.map +1 -1
  261. package/dist/esm/Skeleton/index.mjs +1 -13
  262. package/dist/esm/Skeleton/index.mjs.map +1 -1
  263. package/dist/esm/Skeleton/index.native.js +1 -13
  264. package/dist/esm/Skeleton/index.native.js.map +1 -1
  265. package/dist/esm/SkipLink/index.native.js.map +1 -1
  266. package/dist/esm/SortableList/SortableHandle.native.js.map +1 -1
  267. package/dist/esm/SortableList/index.native.js.map +1 -1
  268. package/dist/esm/SortableList/useSortableRows.native.js.map +1 -1
  269. package/dist/esm/Tabs/index.mjs +5 -8
  270. package/dist/esm/Tabs/index.mjs.map +1 -1
  271. package/dist/esm/Tabs/index.native.js +5 -8
  272. package/dist/esm/Tabs/index.native.js.map +1 -1
  273. package/dist/esm/Text.mjs +3 -1
  274. package/dist/esm/Text.mjs.map +1 -1
  275. package/dist/esm/Text.native.js +3 -1
  276. package/dist/esm/Text.native.js.map +1 -1
  277. package/dist/esm/Toast/index.native.js.map +1 -1
  278. package/dist/esm/Toast/store.native.js.map +1 -1
  279. package/dist/esm/Tooltip/nativePress.native.js.map +1 -1
  280. package/dist/esm/Tooltip/tooltipShared.native.js.map +1 -1
  281. package/dist/esm/TreeSelect/index.mjs +56 -53
  282. package/dist/esm/TreeSelect/index.mjs.map +1 -1
  283. package/dist/esm/TreeSelect/index.native.js +56 -53
  284. package/dist/esm/TreeSelect/index.native.js.map +1 -1
  285. package/dist/esm/TreeSelect/treeSelectModel.native.js.map +1 -1
  286. package/dist/esm/Video/PlayerChrome.mjs +4 -10
  287. package/dist/esm/Video/PlayerChrome.mjs.map +1 -1
  288. package/dist/esm/Video/PlayerChrome.native.js +4 -10
  289. package/dist/esm/Video/PlayerChrome.native.js.map +1 -1
  290. package/dist/esm/Video/VideoFrame.native.js.map +1 -1
  291. package/dist/esm/Video/types.native.js.map +1 -1
  292. package/dist/esm/Wheel/index.native.js.map +1 -1
  293. package/dist/esm/Wizard/index.native.js.map +1 -1
  294. package/dist/esm/actions/ActionBar.native.js.map +1 -1
  295. package/dist/esm/actions/DestructiveAction.native.js.map +1 -1
  296. package/dist/esm/actions/devWarn.native.js.map +1 -1
  297. package/dist/esm/actions/index.native.js.map +1 -1
  298. package/dist/esm/actions/severity.native.js.map +1 -1
  299. package/dist/esm/charts/Axis.native.js.map +1 -1
  300. package/dist/esm/charts/BarChart.native.js.map +1 -1
  301. package/dist/esm/charts/ChartDataView.native.js.map +1 -1
  302. package/dist/esm/charts/ChartSurface.native.js.map +1 -1
  303. package/dist/esm/charts/LineChart.native.js.map +1 -1
  304. package/dist/esm/charts/PieChart.native.js.map +1 -1
  305. package/dist/esm/charts/Sparkline.native.js.map +1 -1
  306. package/dist/esm/charts/accessibility.native.js.map +1 -1
  307. package/dist/esm/charts/composeChart.native.js.map +1 -1
  308. package/dist/esm/charts/index.native.js.map +1 -1
  309. package/dist/esm/charts/math.mjs +18 -1
  310. package/dist/esm/charts/math.mjs.map +1 -1
  311. package/dist/esm/charts/math.native.js +18 -1
  312. package/dist/esm/charts/math.native.js.map +1 -1
  313. package/dist/esm/charts/series.mjs +19 -10
  314. package/dist/esm/charts/series.mjs.map +1 -1
  315. package/dist/esm/charts/series.native.js +19 -10
  316. package/dist/esm/charts/series.native.js.map +1 -1
  317. package/dist/esm/charts/svg.mjs +6 -1
  318. package/dist/esm/charts/svg.mjs.map +1 -1
  319. package/dist/esm/charts/svg.native.js +6 -1
  320. package/dist/esm/charts/svg.native.js.map +1 -1
  321. package/dist/esm/charts/types.native.js.map +1 -1
  322. package/dist/esm/charts/useChartTheme.mjs +4 -10
  323. package/dist/esm/charts/useChartTheme.mjs.map +1 -1
  324. package/dist/esm/charts/useChartTheme.native.js +5 -11
  325. package/dist/esm/charts/useChartTheme.native.js.map +1 -1
  326. package/dist/esm/code/Code/index.mjs +6 -0
  327. package/dist/esm/code/Code/index.mjs.map +1 -1
  328. package/dist/esm/code/Code/index.native.js +10 -7
  329. package/dist/esm/code/Code/index.native.js.map +1 -1
  330. package/dist/esm/code/CodeBlock/index.mjs +5 -6
  331. package/dist/esm/code/CodeBlock/index.mjs.map +1 -1
  332. package/dist/esm/code/CodeBlock/index.native.js +5 -6
  333. package/dist/esm/code/CodeBlock/index.native.js.map +1 -1
  334. package/dist/esm/code/HighlightedCode/index.native.js.map +1 -1
  335. package/dist/esm/code/Highlighter/index.native.js.map +1 -1
  336. package/dist/esm/code/Pre/index.native.js.map +1 -1
  337. package/dist/esm/code/index.native.js.map +1 -1
  338. package/dist/esm/componentColors.native.js.map +1 -1
  339. package/dist/esm/feedback/ConfirmDialog.native.js.map +1 -1
  340. package/dist/esm/feedback/NotifyHost.native.js.map +1 -1
  341. package/dist/esm/feedback/copy.native.js.map +1 -1
  342. package/dist/esm/feedback/index.native.js.map +1 -1
  343. package/dist/esm/feedback/notify.native.js.map +1 -1
  344. package/dist/esm/feedback/route.native.js.map +1 -1
  345. package/dist/esm/feedback/store.native.js.map +1 -1
  346. package/dist/esm/hooks/index.native.js.map +1 -1
  347. package/dist/esm/hooks/useClipboard.native.js.map +1 -1
  348. package/dist/esm/hooks/useDocumentTitle.native.js.map +1 -1
  349. package/dist/esm/icons/CheckRegular.native.js.map +1 -1
  350. package/dist/esm/icons/MinusRegular.native.js.map +1 -1
  351. package/dist/esm/icons/index.native.js.map +1 -1
  352. package/dist/esm/icons/lucide.native.js.map +1 -1
  353. package/dist/esm/icons/themed.mjs +3 -2
  354. package/dist/esm/icons/themed.mjs.map +1 -1
  355. package/dist/esm/icons/themed.native.js +3 -2
  356. package/dist/esm/icons/themed.native.js.map +1 -1
  357. package/dist/esm/images/Image/ImageFrame.native.js.map +1 -1
  358. package/dist/esm/images/Image/shared.native.js.map +1 -1
  359. package/dist/esm/images/Image/types.native.js.map +1 -1
  360. package/dist/esm/images/index.native.js.map +1 -1
  361. package/dist/esm/index.native.js.map +1 -1
  362. package/dist/esm/knobImmuneExports.mjs +3 -3
  363. package/dist/esm/knobImmuneExports.native.js +3 -3
  364. package/dist/esm/knobImmuneExports.native.js.map +1 -1
  365. package/dist/esm/layouts/AsyncBoundary.native.js.map +1 -1
  366. package/dist/esm/layouts/Debug/index.native.js.map +1 -1
  367. package/dist/esm/layouts/EmptyState.native.js.map +1 -1
  368. package/dist/esm/layouts/KeyboardAvoidingWrapper/behavior.native.js.map +1 -1
  369. package/dist/esm/layouts/PageTemplates.native.js.map +1 -1
  370. package/dist/esm/layouts/PaneScaffold.mjs +70 -42
  371. package/dist/esm/layouts/PaneScaffold.mjs.map +1 -1
  372. package/dist/esm/layouts/PaneScaffold.native.js +75 -48
  373. package/dist/esm/layouts/PaneScaffold.native.js.map +1 -1
  374. package/dist/esm/layouts/SafeAreaWrapper/insets.native.js.map +1 -1
  375. package/dist/esm/layouts/ViewSwitcher.native.js.map +1 -1
  376. package/dist/esm/layouts/attachments.mjs +3 -2
  377. package/dist/esm/layouts/attachments.mjs.map +1 -1
  378. package/dist/esm/layouts/attachments.native.js +3 -2
  379. package/dist/esm/layouts/attachments.native.js.map +1 -1
  380. package/dist/esm/layouts/breadcrumbs.native.js.map +1 -1
  381. package/dist/esm/layouts/index.native.js.map +1 -1
  382. package/dist/esm/layouts/page.mjs +3 -2
  383. package/dist/esm/layouts/page.mjs.map +1 -1
  384. package/dist/esm/layouts/page.native.js +3 -2
  385. package/dist/esm/layouts/page.native.js.map +1 -1
  386. package/dist/esm/layouts/pageHeadingScope.native.js.map +1 -1
  387. package/dist/esm/layouts/sidebar.mjs +2 -4
  388. package/dist/esm/layouts/sidebar.mjs.map +1 -1
  389. package/dist/esm/layouts/sidebar.native.js +2 -4
  390. package/dist/esm/layouts/sidebar.native.js.map +1 -1
  391. package/dist/esm/layouts/tags.native.js.map +1 -1
  392. package/dist/esm/layouts/timeline.mjs +11 -3
  393. package/dist/esm/layouts/timeline.mjs.map +1 -1
  394. package/dist/esm/layouts/timeline.native.js +11 -3
  395. package/dist/esm/layouts/timeline.native.js.map +1 -1
  396. package/dist/esm/layouts/toolbar.native.js.map +1 -1
  397. package/dist/esm/shared/actionScan.native.js.map +1 -1
  398. package/dist/esm/shared/i18n.native.js.map +1 -1
  399. package/dist/esm/shared/t.native.js.map +1 -1
  400. package/dist/esm/shared/textRidesText.native.js.map +1 -1
  401. package/dist/esm/shared/useReturnFocusOnClose.native.js.map +1 -1
  402. package/dist/esm/surfaces.mjs +1 -33
  403. package/dist/esm/surfaces.mjs.map +1 -1
  404. package/dist/esm/surfaces.native.js +1 -33
  405. package/dist/esm/surfaces.native.js.map +1 -1
  406. package/dist/esm/tamagui.mjs +2 -1
  407. package/dist/esm/tamagui.mjs.map +1 -1
  408. package/dist/esm/tamagui.native.js +2 -1
  409. package/dist/esm/tamagui.native.js.map +1 -1
  410. package/dist/esm/testSetup.native.js.map +1 -1
  411. package/dist/esm/utils/setTinted.native.js.map +1 -1
  412. package/dist/esm/utils/unwrapText.native.js.map +1 -1
  413. package/dist/esm/views/Calendar.native.js.map +1 -1
  414. package/dist/esm/views/Dashboard.native.js.map +1 -1
  415. package/dist/esm/views/Gantt.native.js.map +1 -1
  416. package/dist/esm/views/ImageGrid.native.js.map +1 -1
  417. package/dist/esm/views/Kanban.mjs +1 -0
  418. package/dist/esm/views/Kanban.mjs.map +1 -1
  419. package/dist/esm/views/Kanban.native.js +3 -1
  420. package/dist/esm/views/Kanban.native.js.map +1 -1
  421. package/dist/esm/views/List.mjs +5 -5
  422. package/dist/esm/views/List.mjs.map +1 -1
  423. package/dist/esm/views/List.native.js +8 -8
  424. package/dist/esm/views/List.native.js.map +1 -1
  425. package/dist/esm/views/Matrix.mjs +543 -0
  426. package/dist/esm/views/Matrix.mjs.map +1 -0
  427. package/dist/esm/views/Matrix.native.js +573 -0
  428. package/dist/esm/views/Matrix.native.js.map +1 -0
  429. package/dist/esm/views/ReportBuilder.native.js.map +1 -1
  430. package/dist/esm/views/TreeView.native.js.map +1 -1
  431. package/dist/esm/views/calendarMath.native.js.map +1 -1
  432. package/dist/esm/views/ganttMath.mjs +1 -1
  433. package/dist/esm/views/ganttMath.mjs.map +1 -1
  434. package/dist/esm/views/ganttMath.native.js +1 -1
  435. package/dist/esm/views/ganttMath.native.js.map +1 -1
  436. package/dist/esm/views/index.mjs +4 -2
  437. package/dist/esm/views/index.mjs.map +1 -1
  438. package/dist/esm/views/index.native.js +4 -2
  439. package/dist/esm/views/index.native.js.map +1 -1
  440. package/dist/esm/views/kanbanDnd.native.js.map +1 -1
  441. package/dist/esm/views/matrixMath.mjs +122 -0
  442. package/dist/esm/views/matrixMath.mjs.map +1 -0
  443. package/dist/esm/views/matrixMath.native.js +191 -0
  444. package/dist/esm/views/matrixMath.native.js.map +1 -0
  445. package/dist/esm/views/treeViewDnd.native.js.map +1 -1
  446. package/dist/esm/views/treeViewLayout.native.js.map +1 -1
  447. package/dist/esm/views/treeViewMotion.native.js.map +1 -1
  448. package/dist/esm/views/treeViewReveal.native.js.map +1 -1
  449. package/dist/jsx/Accordion/index.mjs +3 -7
  450. package/dist/jsx/Accordion/index.mjs.map +1 -1
  451. package/dist/jsx/Accordion/index.native.js +2 -6
  452. package/dist/jsx/Accordion/index.native.js.map +1 -1
  453. package/dist/jsx/AnimateHeight/index.mjs +2 -4
  454. package/dist/jsx/AnimateHeight/index.mjs.map +1 -1
  455. package/dist/jsx/AnimateHeight/index.native.js +1 -3
  456. package/dist/jsx/AnimateHeight/index.native.js.map +1 -1
  457. package/dist/jsx/Carousel/index.mjs +2 -1
  458. package/dist/jsx/Carousel/index.mjs.map +1 -1
  459. package/dist/jsx/Carousel/index.native.js +2 -1
  460. package/dist/jsx/Carousel/index.native.js.map +1 -1
  461. package/dist/jsx/Chip/index.mjs +15 -5
  462. package/dist/jsx/Chip/index.mjs.map +1 -1
  463. package/dist/jsx/Chip/index.native.js +13 -3
  464. package/dist/jsx/Chip/index.native.js.map +1 -1
  465. package/dist/jsx/ScrollView/index.mjs +3 -0
  466. package/dist/jsx/ScrollView/index.mjs.map +1 -0
  467. package/dist/jsx/ScrollView/index.native.js +72 -0
  468. package/dist/jsx/ScrollView/index.native.js.map +1 -0
  469. package/dist/jsx/SheetModal/index.native.js +70 -22
  470. package/dist/jsx/SheetModal/index.native.js.map +1 -1
  471. package/dist/jsx/Skeleton/index.mjs +1 -13
  472. package/dist/jsx/Skeleton/index.mjs.map +1 -1
  473. package/dist/jsx/Skeleton/index.native.js +1 -13
  474. package/dist/jsx/Skeleton/index.native.js.map +1 -1
  475. package/dist/jsx/Tabs/index.mjs +5 -8
  476. package/dist/jsx/Tabs/index.mjs.map +1 -1
  477. package/dist/jsx/Tabs/index.native.js +4 -7
  478. package/dist/jsx/Tabs/index.native.js.map +1 -1
  479. package/dist/jsx/Text.mjs +3 -1
  480. package/dist/jsx/Text.mjs.map +1 -1
  481. package/dist/jsx/Text.native.js +2 -0
  482. package/dist/jsx/Text.native.js.map +1 -1
  483. package/dist/jsx/TreeSelect/index.mjs +56 -53
  484. package/dist/jsx/TreeSelect/index.mjs.map +1 -1
  485. package/dist/jsx/TreeSelect/index.native.js +55 -52
  486. package/dist/jsx/TreeSelect/index.native.js.map +1 -1
  487. package/dist/jsx/Video/PlayerChrome.mjs +4 -10
  488. package/dist/jsx/Video/PlayerChrome.mjs.map +1 -1
  489. package/dist/jsx/Video/PlayerChrome.native.js +3 -9
  490. package/dist/jsx/Video/PlayerChrome.native.js.map +1 -1
  491. package/dist/jsx/charts/math.mjs +18 -1
  492. package/dist/jsx/charts/math.mjs.map +1 -1
  493. package/dist/jsx/charts/math.native.js +18 -0
  494. package/dist/jsx/charts/math.native.js.map +1 -1
  495. package/dist/jsx/charts/series.mjs +19 -10
  496. package/dist/jsx/charts/series.mjs.map +1 -1
  497. package/dist/jsx/charts/series.native.js +17 -8
  498. package/dist/jsx/charts/series.native.js.map +1 -1
  499. package/dist/jsx/charts/svg.mjs +6 -1
  500. package/dist/jsx/charts/svg.mjs.map +1 -1
  501. package/dist/jsx/charts/svg.native.js +6 -0
  502. package/dist/jsx/charts/svg.native.js.map +1 -1
  503. package/dist/jsx/charts/useChartTheme.mjs +4 -10
  504. package/dist/jsx/charts/useChartTheme.mjs.map +1 -1
  505. package/dist/jsx/charts/useChartTheme.native.js +4 -10
  506. package/dist/jsx/charts/useChartTheme.native.js.map +1 -1
  507. package/dist/jsx/code/Code/index.mjs +6 -0
  508. package/dist/jsx/code/Code/index.mjs.map +1 -1
  509. package/dist/jsx/code/Code/index.native.js +7 -4
  510. package/dist/jsx/code/Code/index.native.js.map +1 -1
  511. package/dist/jsx/code/CodeBlock/index.mjs +5 -6
  512. package/dist/jsx/code/CodeBlock/index.mjs.map +1 -1
  513. package/dist/jsx/code/CodeBlock/index.native.js +4 -5
  514. package/dist/jsx/code/CodeBlock/index.native.js.map +1 -1
  515. package/dist/jsx/icons/themed.mjs +3 -2
  516. package/dist/jsx/icons/themed.mjs.map +1 -1
  517. package/dist/jsx/icons/themed.native.js +2 -1
  518. package/dist/jsx/icons/themed.native.js.map +1 -1
  519. package/dist/jsx/knobImmuneExports.mjs +3 -3
  520. package/dist/jsx/knobImmuneExports.native.js +3 -3
  521. package/dist/jsx/layouts/PaneScaffold.mjs +70 -42
  522. package/dist/jsx/layouts/PaneScaffold.mjs.map +1 -1
  523. package/dist/jsx/layouts/PaneScaffold.native.js +75 -48
  524. package/dist/jsx/layouts/PaneScaffold.native.js.map +1 -1
  525. package/dist/jsx/layouts/attachments.mjs +3 -2
  526. package/dist/jsx/layouts/attachments.mjs.map +1 -1
  527. package/dist/jsx/layouts/attachments.native.js +2 -1
  528. package/dist/jsx/layouts/attachments.native.js.map +1 -1
  529. package/dist/jsx/layouts/page.mjs +3 -2
  530. package/dist/jsx/layouts/page.mjs.map +1 -1
  531. package/dist/jsx/layouts/page.native.js +2 -1
  532. package/dist/jsx/layouts/page.native.js.map +1 -1
  533. package/dist/jsx/layouts/sidebar.mjs +2 -4
  534. package/dist/jsx/layouts/sidebar.mjs.map +1 -1
  535. package/dist/jsx/layouts/sidebar.native.js +1 -3
  536. package/dist/jsx/layouts/sidebar.native.js.map +1 -1
  537. package/dist/jsx/layouts/timeline.mjs +11 -3
  538. package/dist/jsx/layouts/timeline.mjs.map +1 -1
  539. package/dist/jsx/layouts/timeline.native.js +9 -1
  540. package/dist/jsx/layouts/timeline.native.js.map +1 -1
  541. package/dist/jsx/surfaces.mjs +1 -33
  542. package/dist/jsx/surfaces.mjs.map +1 -1
  543. package/dist/jsx/surfaces.native.js +0 -32
  544. package/dist/jsx/surfaces.native.js.map +1 -1
  545. package/dist/jsx/tamagui.mjs +2 -1
  546. package/dist/jsx/tamagui.mjs.map +1 -1
  547. package/dist/jsx/tamagui.native.js +2 -1
  548. package/dist/jsx/tamagui.native.js.map +1 -1
  549. package/dist/jsx/views/Kanban.mjs +1 -0
  550. package/dist/jsx/views/Kanban.mjs.map +1 -1
  551. package/dist/jsx/views/Kanban.native.js +3 -1
  552. package/dist/jsx/views/Kanban.native.js.map +1 -1
  553. package/dist/jsx/views/List.mjs +5 -5
  554. package/dist/jsx/views/List.mjs.map +1 -1
  555. package/dist/jsx/views/List.native.js +7 -7
  556. package/dist/jsx/views/List.native.js.map +1 -1
  557. package/dist/jsx/views/Matrix.mjs +543 -0
  558. package/dist/jsx/views/Matrix.mjs.map +1 -0
  559. package/dist/jsx/views/Matrix.native.js +612 -0
  560. package/dist/jsx/views/Matrix.native.js.map +1 -0
  561. package/dist/jsx/views/ganttMath.mjs +1 -1
  562. package/dist/jsx/views/ganttMath.mjs.map +1 -1
  563. package/dist/jsx/views/ganttMath.native.js +2 -0
  564. package/dist/jsx/views/ganttMath.native.js.map +1 -1
  565. package/dist/jsx/views/index.mjs +4 -2
  566. package/dist/jsx/views/index.mjs.map +1 -1
  567. package/dist/jsx/views/index.native.js +16 -0
  568. package/dist/jsx/views/index.native.js.map +1 -1
  569. package/dist/jsx/views/matrixMath.mjs +122 -0
  570. package/dist/jsx/views/matrixMath.mjs.map +1 -0
  571. package/dist/jsx/views/matrixMath.native.js +229 -0
  572. package/dist/jsx/views/matrixMath.native.js.map +1 -0
  573. package/package.json +10 -10
  574. package/src/Accordion/Accordion.spec.tsx +20 -0
  575. package/src/Accordion/index.tsx +7 -3
  576. package/src/AnimateHeight/index.tsx +143 -142
  577. package/src/Carousel/index.tsx +2 -1
  578. package/src/Chip/Chip.borderLadder.spec.tsx +54 -0
  579. package/src/Chip/Chip.pressSlop.spec.tsx +57 -0
  580. package/src/Chip/Chip.spec.tsx +21 -16
  581. package/src/Chip/index.tsx +25 -3
  582. package/src/Heading.native.spec.tsx +1 -1
  583. package/src/ScrollView/ScrollView.native.spec.tsx +157 -0
  584. package/src/ScrollView/index.native.tsx +45 -0
  585. package/src/ScrollView/index.tsx +2 -0
  586. package/src/Separator/index.tsx +3 -3
  587. package/src/SheetModal/SheetModal.detentLayout.spec.tsx +173 -0
  588. package/src/SheetModal/SheetModal.touch.spec.tsx +63 -0
  589. package/src/SheetModal/index.native.tsx +95 -17
  590. package/src/Skeleton/Skeleton.spec.tsx +3 -3
  591. package/src/Skeleton/index.tsx +2 -15
  592. package/src/Tabs/Tabs.hydration.spec.tsx +123 -0
  593. package/src/Tabs/index.tsx +4 -3
  594. package/src/Text.spec.tsx +32 -2
  595. package/src/Text.tsx +7 -6
  596. package/src/Toast/Toast.spec.tsx +50 -0
  597. package/src/Tooltip/Tooltip.spec.tsx +55 -2
  598. package/src/TreeSelect/TreeSelect.spec.tsx +15 -15
  599. package/src/TreeSelect/index.tsx +53 -50
  600. package/src/Video/PlayerChrome.tsx +4 -3
  601. package/src/Wheel/Wheel.spec.tsx +4 -4
  602. package/src/adjacency.l1.spec.tsx +175 -0
  603. package/src/charts/charts.spec.tsx +49 -6
  604. package/src/charts/math.spec.ts +30 -0
  605. package/src/charts/math.ts +36 -0
  606. package/src/charts/series.tsx +14 -9
  607. package/src/charts/svg.ts +13 -0
  608. package/src/charts/useChartTheme.ts +14 -15
  609. package/src/code/Code/code.spec.tsx +2 -19
  610. package/src/code/Code/index.tsx +0 -6
  611. package/src/code/CodeBlock/index.tsx +5 -3
  612. package/src/code/highlightedCode.spec.tsx +2 -2
  613. package/src/code/hostProps.spec.tsx +55 -0
  614. package/src/icons/themed.hydration.spec.tsx +60 -0
  615. package/src/icons/themed.tsx +3 -6
  616. package/src/knobImmuneExports.ts +3 -3
  617. package/src/layouts/PaneScaffold.spec.tsx +148 -2
  618. package/src/layouts/PaneScaffold.stories.tsx +33 -1
  619. package/src/layouts/PaneScaffold.tsx +101 -48
  620. package/src/layouts/attachments.radius.spec.tsx +74 -0
  621. package/src/layouts/attachments.tsx +3 -1
  622. package/src/layouts/page.designLaw.spec.tsx +20 -0
  623. package/src/layouts/page.tsx +2 -0
  624. package/src/layouts/sidebar.tsx +2 -3
  625. package/src/layouts/timeline-radius.spec.tsx +38 -0
  626. package/src/layouts/timeline.tsx +16 -1
  627. package/src/overlayElevation.spec.tsx +39 -51
  628. package/src/surfaces.spec.tsx +13 -10
  629. package/src/surfaces.tsx +4 -33
  630. package/src/tamagui.spec.ts +4 -3
  631. package/src/tamagui.ts +4 -1
  632. package/src/textAccentSecondary.spec.tsx +100 -2
  633. package/src/views/Kanban.native.tsx +3 -1
  634. package/src/views/Kanban.spec.tsx +15 -0
  635. package/src/views/Kanban.tsx +1 -0
  636. package/src/views/List.spec.tsx +50 -0
  637. package/src/views/List.tsx +13 -5
  638. package/src/views/Matrix.spec.tsx +339 -0
  639. package/src/views/Matrix.stories.spec.tsx +68 -0
  640. package/src/views/Matrix.stories.tsx +153 -0
  641. package/src/views/Matrix.tsx +738 -0
  642. package/src/views/ganttMath.ts +4 -2
  643. package/src/views/index.ts +30 -0
  644. package/src/views/matrixMath.spec.ts +237 -0
  645. package/src/views/matrixMath.ts +251 -0
  646. package/src/views/views.spec.tsx +3 -1
  647. package/types/Accordion/index.d.ts.map +1 -1
  648. package/types/AnimateHeight/index.d.ts.map +1 -1
  649. package/types/Carousel/index.d.ts.map +1 -1
  650. package/types/Chip/index.d.ts.map +1 -1
  651. package/types/ScrollView/index.d.ts +3 -0
  652. package/types/ScrollView/index.d.ts.map +1 -0
  653. package/types/ScrollView/index.native.d.ts +4 -0
  654. package/types/ScrollView/index.native.d.ts.map +1 -0
  655. package/types/Separator/index.d.ts +3 -3
  656. package/types/SheetModal/index.native.d.ts.map +1 -1
  657. package/types/Skeleton/index.d.ts.map +1 -1
  658. package/types/Tabs/index.d.ts.map +1 -1
  659. package/types/Text.d.ts.map +1 -1
  660. package/types/TreeSelect/index.d.ts.map +1 -1
  661. package/types/Video/PlayerChrome.d.ts.map +1 -1
  662. package/types/charts/math.d.ts +18 -0
  663. package/types/charts/math.d.ts.map +1 -1
  664. package/types/charts/series.d.ts +2 -1
  665. package/types/charts/series.d.ts.map +1 -1
  666. package/types/charts/svg.d.ts +8 -0
  667. package/types/charts/svg.d.ts.map +1 -1
  668. package/types/charts/useChartTheme.d.ts +4 -3
  669. package/types/charts/useChartTheme.d.ts.map +1 -1
  670. package/types/code/Code/index.d.ts.map +1 -1
  671. package/types/code/CodeBlock/index.d.ts.map +1 -1
  672. package/types/icons/themed.d.ts.map +1 -1
  673. package/types/layouts/PaneScaffold.d.ts +14 -1
  674. package/types/layouts/PaneScaffold.d.ts.map +1 -1
  675. package/types/layouts/attachments.d.ts.map +1 -1
  676. package/types/layouts/page.d.ts.map +1 -1
  677. package/types/layouts/sidebar.d.ts.map +1 -1
  678. package/types/layouts/timeline.d.ts.map +1 -1
  679. package/types/surfaces.d.ts.map +1 -1
  680. package/types/tamagui.d.ts +2 -1
  681. package/types/tamagui.d.ts.map +1 -1
  682. package/types/views/Kanban.native.d.ts.map +1 -1
  683. package/types/views/List.d.ts.map +1 -1
  684. package/types/views/Matrix.d.ts +102 -0
  685. package/types/views/Matrix.d.ts.map +1 -0
  686. package/types/views/ganttMath.d.ts +4 -0
  687. package/types/views/ganttMath.d.ts.map +1 -1
  688. package/types/views/index.d.ts +3 -1
  689. package/types/views/index.d.ts.map +1 -1
  690. package/types/views/matrixMath.d.ts +114 -0
  691. package/types/views/matrixMath.d.ts.map +1 -0
@@ -84,7 +84,7 @@ describe("TreeSelect cover + width (MPO-53 AC-3)", () => {
84
84
  open
85
85
  />,
86
86
  );
87
- const trigger = result.container.querySelector(
87
+ const trigger = result.baseElement.querySelector(
88
88
  '[data-testid="tree-select-trigger"]',
89
89
  ) as HTMLElement;
90
90
  expect(trigger).toBeTruthy();
@@ -93,7 +93,7 @@ describe("TreeSelect cover + width (MPO-53 AC-3)", () => {
93
93
 
94
94
  try {
95
95
  await waitFor(() => {
96
- const panel = result.container.querySelector(
96
+ const panel = result.baseElement.querySelector(
97
97
  '[data-testid="tree-select-panel"]',
98
98
  ) as HTMLElement | null;
99
99
  expect(panel).toBeTruthy();
@@ -114,7 +114,7 @@ describe("TreeSelect LC-49 one tab stop", () => {
114
114
  const result = renderWithProviders(
115
115
  <TreeSelect label="Account" nodes={accounts} value="hdfc" />,
116
116
  );
117
- const closedStops = tabStops(result.container);
117
+ const closedStops = tabStops(result.baseElement);
118
118
  expect(closedStops.length).toBe(1);
119
119
  expect(closedStops[0]?.getAttribute("data-testid")).toBe("tree-select-trigger");
120
120
 
@@ -128,7 +128,7 @@ describe("TreeSelect LC-49 one tab stop", () => {
128
128
  />,
129
129
  );
130
130
  await waitFor(() => {
131
- expect(result.container.querySelector('[data-testid="tree-select-search"]')).toBeTruthy();
131
+ expect(result.baseElement.querySelector('[data-testid="tree-select-search"]')).toBeTruthy();
132
132
  });
133
133
  const openRoot = result.baseElement;
134
134
  const search = openRoot.querySelector(
@@ -169,16 +169,16 @@ describe("TreeSelect LC-21 commit vs expand", () => {
169
169
  />,
170
170
  );
171
171
  await waitFor(() => {
172
- expect(result.container.querySelector("[data-treeselect-caret]")).toBeTruthy();
172
+ expect(result.baseElement.querySelector("[data-treeselect-caret]")).toBeTruthy();
173
173
  });
174
- const caret = result.container.querySelector("[data-treeselect-caret]") as HTMLElement;
174
+ const caret = result.baseElement.querySelector("[data-treeselect-caret]") as HTMLElement;
175
175
  await act(async () => {
176
176
  fireEvent.click(caret);
177
177
  });
178
178
  expect(onChange).not.toHaveBeenCalled();
179
179
  expect(onOpenChange).not.toHaveBeenCalledWith(false);
180
180
 
181
- const cash = result.container.querySelector(
181
+ const cash = result.baseElement.querySelector(
182
182
  '[data-treeselect-row="liabilities"]',
183
183
  ) as HTMLElement;
184
184
  await act(async () => {
@@ -201,10 +201,10 @@ describe("TreeSelect sheet at <=640", () => {
201
201
  />,
202
202
  );
203
203
  await waitFor(() => {
204
- expect(desktop.container.querySelector("[data-treeselect-row]")).toBeTruthy();
204
+ expect(desktop.baseElement.querySelector("[data-treeselect-row]")).toBeTruthy();
205
205
  });
206
- const desktopTree = desktop.container.querySelector('[data-testid="tree-select-tree"]');
207
- const desktopRows = [...desktop.container.querySelectorAll("[data-treeselect-row]")].map(
206
+ const desktopTree = desktop.baseElement.querySelector('[data-testid="tree-select-tree"]');
207
+ const desktopRows = [...desktop.baseElement.querySelectorAll("[data-treeselect-row]")].map(
208
208
  (el) => ({
209
209
  id: el.getAttribute("data-treeselect-row"),
210
210
  depth: el.getAttribute("data-depth"),
@@ -226,7 +226,7 @@ describe("TreeSelect sheet at <=640", () => {
226
226
  await waitFor(() => {
227
227
  expect(mobile.baseElement.querySelector("[data-treeselect-row]")).toBeTruthy();
228
228
  });
229
- expect(mobile.container.querySelector('[data-testid="floating-panel-viewport"]')).toBeNull();
229
+ expect(mobile.baseElement.querySelector('[data-testid="floating-panel-viewport"]')).toBeNull();
230
230
  const mobileTree = mobile.baseElement.querySelector('[data-testid="tree-select-tree"]');
231
231
  const mobileRows = [...mobile.baseElement.querySelectorAll("[data-treeselect-row]")].map(
232
232
  (el) => ({
@@ -247,19 +247,19 @@ describe("TreeSelect empty filter", () => {
247
247
  <TreeSelect label="Account" nodes={accounts} open emptyMessage="No matching accounts" />,
248
248
  );
249
249
  await waitFor(() => {
250
- expect(result.container.querySelector('[data-testid="tree-select-search"]')).toBeTruthy();
250
+ expect(result.baseElement.querySelector('[data-testid="tree-select-search"]')).toBeTruthy();
251
251
  });
252
- const search = result.container.querySelector(
252
+ const search = result.baseElement.querySelector(
253
253
  '[data-testid="tree-select-search"] input',
254
254
  ) as HTMLInputElement;
255
255
  await act(async () => {
256
256
  fireEvent.change(search, { target: { value: "xyzzy" } });
257
257
  });
258
- const empty = result.container.querySelector(
258
+ const empty = result.baseElement.querySelector(
259
259
  '[data-testid="tree-select-empty"]',
260
260
  ) as HTMLElement;
261
261
  expect(empty).toBeTruthy();
262
262
  expect(empty.textContent).toContain("No matching accounts");
263
- expect(result.container.querySelector('[data-testid="empty-state"]')).toBeNull();
263
+ expect(result.baseElement.querySelector('[data-testid="empty-state"]')).toBeNull();
264
264
  });
265
265
  });
@@ -3,6 +3,7 @@ import {
3
3
  FloatingPanel,
4
4
  formCommonColors,
5
5
  InputParts,
6
+ PanelPortal,
6
7
  useFloatingPanel,
7
8
  useFormField,
8
9
  useViewportGtSm,
@@ -751,59 +752,61 @@ function FloatingTreeSelect({
751
752
  accessibilityLabel={accessibilityLabel}
752
753
  />
753
754
  {panel.mounted && (
754
- <FloatingFocusManager context={panel.context} modal={false} initialFocus={-1}>
755
- <YStack
756
- {...getFloatingProps({
757
- ref: panel.refs.setFloating,
758
- })}
759
- data-testid="tree-select-panel"
760
- data-cover=""
761
- data-width-mode={TREE_SELECT_WIDTH_MODE}
762
- data-dismiss-class="commit"
763
- data-fp-panel=""
764
- outlineWidth={0}
765
- pointerEvents={panel.visible ? "auto" : "none"}
766
- {...panel.knobProps.elevatedSurface}
767
- borderRadius={panel.dropdownRadius}
768
- overflow="hidden"
769
- style={
770
- {
771
- position: "fixed",
772
- top: overlayStyle.current?.top ?? 0,
773
- left: 0,
774
- zIndex: zIndex.dropdown,
775
- opacity: panel.visible ? 1 : 0,
776
- transform: panel.visible ? "scale(1)" : "scale(0.96)",
777
- transition: panelTransition,
778
- boxSizing: "border-box",
779
- } as Record<string, unknown>
780
- }
781
- >
782
- <SearchRow
783
- value={state.filter}
784
- placeholder={searchPlaceholder}
785
- inputRef={searchRef}
786
- onChange={state.setFilter}
787
- onKeyDown={onSearchKeyDown}
788
- treeId={treeId}
789
- activeDescendant={activeDescendant}
790
- sizeToken={sizeToken}
791
- />
792
- <YStack overflow="scroll" maxHeight={320} id={treeId}>
793
- <TreeSelectPanelBody
794
- rows={state.rows}
795
- selectedId={value}
796
- activeIndex={state.activeIndex}
797
- keyboardRing={state.keyboardRing}
755
+ <PanelPortal anchor={panel.triggerRef.current}>
756
+ <FloatingFocusManager context={panel.context} modal={false} initialFocus={-1}>
757
+ <YStack
758
+ {...getFloatingProps({
759
+ ref: panel.refs.setFloating,
760
+ })}
761
+ data-testid="tree-select-panel"
762
+ data-cover=""
763
+ data-width-mode={TREE_SELECT_WIDTH_MODE}
764
+ data-dismiss-class="commit"
765
+ data-fp-panel=""
766
+ outlineWidth={0}
767
+ pointerEvents={panel.visible ? "auto" : "none"}
768
+ {...panel.knobProps.elevatedSurface}
769
+ borderRadius={panel.dropdownRadius}
770
+ overflow="hidden"
771
+ style={
772
+ {
773
+ position: "fixed",
774
+ top: overlayStyle.current?.top ?? 0,
775
+ left: 0,
776
+ zIndex: zIndex.dropdown,
777
+ opacity: panel.visible ? 1 : 0,
778
+ transform: panel.visible ? "scale(1)" : "scale(0.96)",
779
+ transition: panelTransition,
780
+ boxSizing: "border-box",
781
+ } as Record<string, unknown>
782
+ }
783
+ >
784
+ <SearchRow
785
+ value={state.filter}
786
+ placeholder={searchPlaceholder}
787
+ inputRef={searchRef}
788
+ onChange={state.setFilter}
789
+ onKeyDown={onSearchKeyDown}
798
790
  treeId={treeId}
799
- emptyMessage={emptyMessage}
800
- loading={loading}
801
- onCommit={commit}
802
- onToggle={state.toggle}
791
+ activeDescendant={activeDescendant}
792
+ sizeToken={sizeToken}
803
793
  />
794
+ <YStack overflow="scroll" maxHeight={320} id={treeId}>
795
+ <TreeSelectPanelBody
796
+ rows={state.rows}
797
+ selectedId={value}
798
+ activeIndex={state.activeIndex}
799
+ keyboardRing={state.keyboardRing}
800
+ treeId={treeId}
801
+ emptyMessage={emptyMessage}
802
+ loading={loading}
803
+ onCommit={commit}
804
+ onToggle={state.toggle}
805
+ />
806
+ </YStack>
804
807
  </YStack>
805
- </YStack>
806
- </FloatingFocusManager>
808
+ </FloatingFocusManager>
809
+ </PanelPortal>
807
810
  )}
808
811
  </>
809
812
  );
@@ -2,6 +2,7 @@ import {
2
2
  MIN_PRESS_TARGET,
3
3
  ensureKeyboardModalityTracking,
4
4
  useResolvedKnobs,
5
+ transitionProps,
5
6
  } from "@multiplatform.one/theme";
6
7
  import {
7
8
  CornersInIcon,
@@ -83,7 +84,7 @@ function ChromeButton({
83
84
  hoverStyle={{ backgroundColor: "$color4" }}
84
85
  pressStyle={{ opacity: 0.85 }}
85
86
  focusVisibleStyle={{ ...control.focusVisibleKnobProps }}
86
- {...(knobProps.transition ? { transition: knobProps.transition } : {})}
87
+ {...transitionProps(knobProps.transition)}
87
88
  onPress={(e: { stopPropagation?: () => void }) => {
88
89
  e.stopPropagation?.();
89
90
  onPress();
@@ -205,7 +206,7 @@ function SeekBar({
205
206
  backgroundColor="$color8"
206
207
  borderRadius={radius}
207
208
  overflow="hidden"
208
- {...(knobProps.transition ? { transition: knobProps.transition } : {})}
209
+ {...transitionProps(knobProps.transition)}
209
210
  >
210
211
  <YStack
211
212
  height="100%"
@@ -300,7 +301,7 @@ export function PlayerChrome({
300
301
  onFocusChange(false);
301
302
  },
302
303
  } as Record<string, unknown>)}
303
- {...(knobProps.transition ? { transition: knobProps.transition } : {})}
304
+ {...transitionProps(knobProps.transition)}
304
305
  >
305
306
  <YStack flex={1} alignItems="center" justifyContent="center" pointerEvents="none">
306
307
  {playing ? null : (
@@ -275,7 +275,7 @@ describe("Wheel design-law (MPO-60)", () => {
275
275
  expect("default" in mod).toBe(false);
276
276
  });
277
277
 
278
- it("selected row type stays on body weight 400, never 600 (R7 / design-audit)", () => {
278
+ it("selected row type stays on the body weight channel (400/700), never 500/600 (R7 / design-audit)", () => {
279
279
  renderWithProviders(
280
280
  <Wheel items={[1, 2, 3, 4, 5]} value={3} onChange={() => {}} visibleItems={5} />,
281
281
  );
@@ -284,7 +284,7 @@ describe("Wheel design-law (MPO-60)", () => {
284
284
  .querySelector('[data-testid="wheel-item"][data-selected="true"]') as HTMLElement;
285
285
  expect(selected).toBeTruthy();
286
286
  const text = selected.querySelector("[class]") as HTMLElement;
287
- expect(text.className).toMatch(/_fow-400\b/);
287
+ expect(text.className).toMatch(/_fow-(400|700|bold)\b/);
288
288
  expect(text.className).not.toMatch(/_fow-600\b/);
289
289
  expect(text.className).not.toMatch(/_fow-500\b/);
290
290
  });
@@ -298,7 +298,7 @@ describe("Wheel design-law (MPO-60)", () => {
298
298
  const noneFrame = none.container.querySelector('[data-testid="wheel"]') as HTMLElement;
299
299
  const noneAtoms = String(noneFrame.className)
300
300
  .split(" ")
301
- .filter((c) => c.startsWith("_btlr-"));
301
+ .filter((c) => c.startsWith("_btlr-") && c !== "_btlr-0px");
302
302
  none.unmount();
303
303
 
304
304
  const full = renderWithProviders(
@@ -309,7 +309,7 @@ describe("Wheel design-law (MPO-60)", () => {
309
309
  const fullFrame = full.container.querySelector('[data-testid="wheel"]') as HTMLElement;
310
310
  const fullAtoms = String(fullFrame.className)
311
311
  .split(" ")
312
- .filter((c) => c.startsWith("_btlr-"));
312
+ .filter((c) => c.startsWith("_btlr-") && c !== "_btlr-0px");
313
313
  expect(noneAtoms).toEqual([]);
314
314
  expect(fullAtoms).toEqual([]);
315
315
  });
@@ -0,0 +1,175 @@
1
+ /**
2
+ * `00` L1 test 1, the adjacency check (MPO-23, gap ledger GL-41). A Button,
3
+ * an Input, a Select trigger and a ListItem in one `XStack` at the same size
4
+ * token, with only a `gap`, must agree on height and on radius. They differ
5
+ * only in interior padding (`00` L9f). `constraintAudit` checks that each
6
+ * value lands on a token step; nothing checked that siblings agree.
7
+ *
8
+ * The DOM here cannot lay out and does not resolve Tamagui's CSS variables,
9
+ * so each frame's box is read from the atoms it paints (`_h-44px`,
10
+ * `_btlr-t-radius-4`, `_mih-t-size-4`) and resolved through the live token
11
+ * table. That is the same box a browser computes for these frames: none of
12
+ * them grows past its height or min-height with one line of content.
13
+ *
14
+ * The law holds for height at every size stop and for the controls' radius at
15
+ * the default stop. ListItem joins the height check only: it is a flush row
16
+ * (SP-EDGE, radius 0) and never takes the controls' radius (Clay 2026-09-26,
17
+ * MPO-23 ruling 1A). Two disagreements are open and pinned below as expected
18
+ * failures, each naming its culprit. Fixing one makes its `it.fails` go red,
19
+ * which is the signal to turn it into a plain assertion.
20
+ */
21
+
22
+ import { Input, Select } from "@multiplatform.one/forms";
23
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
24
+ import { Preset, type Size } from "@multiplatform.one/theme";
25
+ import { cleanup } from "@testing-library/react";
26
+ import type { ReactElement } from "react";
27
+ import { getTokens } from "tamagui";
28
+ import { afterEach, describe, expect, it } from "vitest";
29
+ import { Button } from "./Button";
30
+ import { ListItem, XStack } from "./tamagui";
31
+
32
+ afterEach(cleanup);
33
+
34
+ type Box = { height: number; radius: number };
35
+ type Row = Record<"Button" | "Input" | "Select trigger" | "ListItem", Box>;
36
+
37
+ const stops = [
38
+ ["small", "$3"],
39
+ ["medium", "$4"],
40
+ ["large", "$5"],
41
+ ] as const satisfies readonly (readonly [Size, string])[];
42
+
43
+ function atom(el: HTMLElement, prop: string) {
44
+ for (const cls of String(el.className || "").split(/\s+/)) {
45
+ if (!cls.startsWith(`_${prop}-`)) continue;
46
+ const value = cls.slice(prop.length + 2);
47
+ if (/^-?\d+(?:\.\d+)?px$|^t-(?:size|radius)-\d+$/.test(value)) return value;
48
+ }
49
+ return undefined;
50
+ }
51
+
52
+ function px(value: string | undefined): number | undefined {
53
+ if (value === undefined) return undefined;
54
+ const literal = value.match(/^(-?\d+(?:\.\d+)?)px$/);
55
+ if (literal) return Number(literal[1]);
56
+ const [, scale, step] = value.match(/^t-(size|radius)-(\d+)$/) ?? [];
57
+ const tokens = getTokens() as unknown as Record<string, Record<string, { val: unknown }>>;
58
+ return Number.parseFloat(String(tokens[scale ?? ""]?.[`$${step}`]?.val));
59
+ }
60
+
61
+ function box(el: HTMLElement | null, name: string): Box {
62
+ if (!el) throw new Error(`${name} frame not rendered`);
63
+ const height = px(atom(el, "h") ?? atom(el, "mih"));
64
+ if (height === undefined) throw new Error(`${name} paints no height`);
65
+ return { height, radius: px(atom(el, "btlr")) ?? 0 };
66
+ }
67
+
68
+ function measure(ui: ReactElement): Row {
69
+ const { container } = renderWithProviders(ui);
70
+ const frame = (selector: string) => container.querySelector<HTMLElement>(selector);
71
+ return {
72
+ Button: box(frame("[data-mp-button-height]"), "Button"),
73
+ Input: box(frame("[data-mp-input-box]"), "Input"),
74
+ "Select trigger": box(frame('[data-testid="select-trigger"]'), "Select trigger"),
75
+ ListItem: box(frame('[data-testid="l1-list-item"]'), "ListItem"),
76
+ };
77
+ }
78
+
79
+ /** The mpo size channel: the size knob, which every house control reads. */
80
+ function atKnob(knob: Size, token: string) {
81
+ return measure(
82
+ <Preset overrides={{ size: knob }}>
83
+ <XStack gap="$2">
84
+ <Button>Save</Button>
85
+ <Input placeholder="Name" />
86
+ <Select options={[{ value: "a", label: "A" }]} placeholder="Pick" />
87
+ <ListItem size={token as "$4"} title="Row" data-testid="l1-list-item" />
88
+ </XStack>
89
+ </Preset>,
90
+ );
91
+ }
92
+
93
+ /** The same token handed to each component directly. */
94
+ function atSizeProp(token: "$3" | "$4" | "$5") {
95
+ return measure(
96
+ <XStack gap="$2">
97
+ <Button size={token}>Save</Button>
98
+ <Input size={token} placeholder="Name" />
99
+ <Select size={token} options={[{ value: "a", label: "A" }]} placeholder="Pick" />
100
+ <ListItem size={token} title="Row" data-testid="l1-list-item" />
101
+ </XStack>,
102
+ );
103
+ }
104
+
105
+ function heights(row: Row) {
106
+ return Object.fromEntries(Object.entries(row).map(([name, b]) => [name, b.height]));
107
+ }
108
+
109
+ function radii(row: Row, names: (keyof Row)[]) {
110
+ return Object.fromEntries(names.map((name) => [name, row[name].radius]));
111
+ }
112
+
113
+ function agreed(values: Record<string, number>) {
114
+ const first = Object.values(values)[0];
115
+ return Object.fromEntries(Object.keys(values).map((name) => [name, first]));
116
+ }
117
+
118
+ const controls: (keyof Row)[] = ["Button", "Input", "Select trigger"];
119
+
120
+ describe("00 L1 adjacency: Button, Input, Select trigger and ListItem at one size token", () => {
121
+ for (const [knob, token] of stops) {
122
+ it(`all four paint one height at size ${knob} (${token})`, () => {
123
+ const row = heights(atKnob(knob, token));
124
+ expect(row).toEqual(agreed(row));
125
+ });
126
+ }
127
+
128
+ it("catches a deliberate violation: a Button ejected to its own height", () => {
129
+ const row = heights(
130
+ measure(
131
+ <XStack gap="$2">
132
+ <Button height={30} sizeRecipeEscape="L1 adjacency fixture">
133
+ Save
134
+ </Button>
135
+ <Input placeholder="Name" />
136
+ <Select options={[{ value: "a", label: "A" }]} placeholder="Pick" />
137
+ <ListItem size="$4" title="Row" data-testid="l1-list-item" />
138
+ </XStack>,
139
+ ),
140
+ );
141
+ expect(row.Button).toBe(30);
142
+ expect(row).not.toEqual(agreed(row));
143
+ });
144
+
145
+ it("Button, Input and Select trigger paint one radius at the default size", () => {
146
+ const row = radii(atKnob("medium", "$4"), controls);
147
+ expect(row).toEqual(agreed(row));
148
+ expect(row.Button).toBeGreaterThan(0);
149
+ });
150
+
151
+ it("ListItem stays a flush row beside them: radius 0, never the controls' radius", () => {
152
+ const row = radii(atKnob("medium", "$4"), [...controls, "ListItem"]);
153
+ expect(row.ListItem).toBe(0);
154
+ expect(row.Button).toBeGreaterThan(0);
155
+ });
156
+
157
+ for (const [knob, token] of stops.filter(([k]) => k !== "medium")) {
158
+ it.fails(`OPEN: Button and Input paint one radius at size ${knob} (Button's radius follows size, Input's only the radius knob)`, () => {
159
+ const row = radii(atKnob(knob, token), controls);
160
+ expect(row).toEqual(agreed(row));
161
+ });
162
+ }
163
+
164
+ it("an explicit size prop agrees with itself at the default token", () => {
165
+ const row = heights(atSizeProp("$4"));
166
+ expect(row).toEqual(agreed(row));
167
+ });
168
+
169
+ for (const token of ["$3", "$5"] as const) {
170
+ it.fails(`OPEN: an explicit size=${token} moves Input and Select trigger with Button (Input paints the knob height, Select ignores size)`, () => {
171
+ const row = heights(atSizeProp(token));
172
+ expect(row).toEqual(agreed(row));
173
+ });
174
+ }
175
+ });
@@ -33,10 +33,15 @@ function PaletteProbe({ into }: { into: { current?: ChartPalette } }) {
33
33
  }
34
34
 
35
35
  function markRects(): Element[] {
36
- // Mark rects carry a resolved fill; interaction targets are transparent.
37
- return Array.from(document.querySelectorAll("svg rect")).filter(
38
- (rect) => rect.getAttribute("fill") !== "transparent",
39
- );
36
+ // Bar marks are value-end-rounded paths with a resolved fill.
37
+ return Array.from(document.querySelectorAll("svg [data-mpo-chart-bar]"));
38
+ }
39
+
40
+ function barBox(bar: Element) {
41
+ const [x, y, width, height, radius] = String(bar.getAttribute("data-mpo-chart-bar"))
42
+ .split(",")
43
+ .map(Number);
44
+ return { x, y, width, height, radius };
40
45
  }
41
46
 
42
47
  function targetRects(): Element[] {
@@ -165,13 +170,13 @@ describe("BarChart", () => {
165
170
  const { unmount: unmountShort } = renderWithProviders(
166
171
  <BarChart data={[{ label: "atk", value: 90 }]} width={WIDTH} domain={[0, 180]} />,
167
172
  );
168
- const shortHeight = Number(markRects()[0].getAttribute("height"));
173
+ const shortHeight = barBox(markRects()[0]).height;
169
174
  unmountShort();
170
175
 
171
176
  const { unmount: unmountFull } = renderWithProviders(
172
177
  <BarChart data={[{ label: "atk", value: 180 }]} width={WIDTH} domain={[0, 180]} />,
173
178
  );
174
- const fullHeight = Number(markRects()[0].getAttribute("height"));
179
+ const fullHeight = barBox(markRects()[0]).height;
175
180
  expect(fullHeight).toBeGreaterThan(0);
176
181
  expect(shortHeight / fullHeight).toBeCloseTo(0.5, 1);
177
182
  unmountFull();
@@ -461,3 +466,41 @@ describe("charts barrel", () => {
461
466
  }
462
467
  });
463
468
  });
469
+
470
+ describe("BarChart corners: DEFAULT class on the value end only (Part 2b, R-SCALE-DATA, MPO-56)", () => {
471
+ const radii = (borderRadius: "none" | "small" | "medium" | "large" | "full") => {
472
+ renderWithProviders(
473
+ <Preset overrides={{ borderRadius }}>
474
+ <BarChart data={data} width={WIDTH} />
475
+ </Preset>,
476
+ );
477
+ const boxes = markRects().map(barBox);
478
+ cleanup();
479
+ return boxes;
480
+ };
481
+
482
+ it("takes 0 / 5 / 9 / 16 px below full", () => {
483
+ expect(radii("none").map((b) => b.radius)).toEqual(data.map(() => 0));
484
+ expect(radii("small").map((b) => b.radius)).toEqual(data.map(() => 5));
485
+ expect(radii("medium").map((b) => b.radius)).toEqual(data.map(() => 9));
486
+ for (const box of radii("large")) expect(box.radius).toBe(Math.min(16, box.width / 2));
487
+ });
488
+
489
+ it("caps full at half the band, a round value end on a square foot", () => {
490
+ for (const box of radii("full")) {
491
+ expect(box.radius).toBe(Math.min(box.width / 2, box.height));
492
+ }
493
+ });
494
+
495
+ it("draws the baseline corners square", () => {
496
+ renderWithProviders(
497
+ <Preset overrides={{ borderRadius: "large" }}>
498
+ <BarChart data={data} width={WIDTH} />
499
+ </Preset>,
500
+ );
501
+ for (const bar of markRects()) {
502
+ const { x, y, height } = barBox(bar);
503
+ expect(bar.getAttribute("d")).toMatch(new RegExp(`^M${x},${y + height}V`));
504
+ }
505
+ });
506
+ });
@@ -2,6 +2,7 @@ import { describe, expect, it } from "vitest";
2
2
  import { describeChart, describeDatum } from "./accessibility";
3
3
  import {
4
4
  approximateTextWidth,
5
+ barPath,
5
6
  arcCentroid,
6
7
  arcPath,
7
8
  areaPath,
@@ -201,3 +202,32 @@ describe("charts/accessibility", () => {
201
202
  expect(describeDatum({ datum: data[1], total: 2400 })).toBe("May: 1,200 (50%)");
202
203
  });
203
204
  });
205
+
206
+ describe("charts/math barPath rounds only the value end (R-SCALE-DATA, MPO-56)", () => {
207
+ it("draws a square box at radius 0", () => {
208
+ expect(barPath({ x: 0, y: 10, width: 20, height: 40, radius: 0, valueEnd: "top" })).toBe(
209
+ "M0,10H20V50H0Z",
210
+ );
211
+ });
212
+
213
+ it("rounds the top corners of a positive bar and keeps the baseline square", () => {
214
+ expect(barPath({ x: 0, y: 10, width: 20, height: 40, radius: 5, valueEnd: "top" })).toBe(
215
+ "M0,50V15A5,5 0 0 1 5,10H15A5,5 0 0 1 20,15V50Z",
216
+ );
217
+ });
218
+
219
+ it("rounds the bottom corners of a negative bar", () => {
220
+ expect(barPath({ x: 0, y: 10, width: 20, height: 40, radius: 5, valueEnd: "bottom" })).toBe(
221
+ "M0,10H20V45A5,5 0 0 1 15,50H5A5,5 0 0 1 0,45Z",
222
+ );
223
+ });
224
+
225
+ it("clamps the radius to half the width and to the height", () => {
226
+ expect(barPath({ x: 0, y: 0, width: 20, height: 40, radius: 50, valueEnd: "top" })).toBe(
227
+ "M0,40V10A10,10 0 0 1 10,0H10A10,10 0 0 1 20,10V40Z",
228
+ );
229
+ expect(barPath({ x: 0, y: 0, width: 20, height: 4, radius: 9, valueEnd: "top" })).toBe(
230
+ "M0,4V4A4,4 0 0 1 4,0H16A4,4 0 0 1 20,4V4Z",
231
+ );
232
+ });
233
+ });
@@ -165,6 +165,42 @@ const curveFactories: Record<ChartCurve, CurveFactory> = {
165
165
  step: curveStepAfter,
166
166
  };
167
167
 
168
+ export interface BarPathInput {
169
+ x: number;
170
+ /** Top edge of the bar box (the value end for a positive bar). */
171
+ y: number;
172
+ width: number;
173
+ height: number;
174
+ /** Corner radius on the value end; the baseline corners stay square. */
175
+ radius: number;
176
+ /** The value end is the top edge (value above the baseline) or the bottom. */
177
+ valueEnd: "top" | "bottom";
178
+ }
179
+
180
+ /**
181
+ * SVG path for a bar that rounds only its value-end corners (R-SCALE-DATA):
182
+ * the baseline corners stay square so the mark sits on its axis. The radius
183
+ * is clamped to half the width and to the height, so a short bar never
184
+ * rounds past its own box.
185
+ */
186
+ export function barPath(input: BarPathInput): string {
187
+ const { x, y, width: w, height: h, valueEnd } = input;
188
+ const r = Math.max(0, Math.min(input.radius, w / 2, h));
189
+ const right = x + w;
190
+ const bottom = y + h;
191
+ if (r === 0) return `M${x},${y}H${right}V${bottom}H${x}Z`;
192
+ if (valueEnd === "top") {
193
+ return (
194
+ `M${x},${bottom}V${y + r}A${r},${r} 0 0 1 ${x + r},${y}` +
195
+ `H${right - r}A${r},${r} 0 0 1 ${right},${y + r}V${bottom}Z`
196
+ );
197
+ }
198
+ return (
199
+ `M${x},${y}H${right}V${bottom - r}A${r},${r} 0 0 1 ${right - r},${bottom}` +
200
+ `H${x + r}A${r},${r} 0 0 1 ${x},${bottom - r}Z`
201
+ );
202
+ }
203
+
168
204
  export interface LinePathOptions {
169
205
  curve?: ChartCurve;
170
206
  }