@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
@@ -10,7 +10,15 @@
10
10
  * height with a large-detent cap. LC-71: the frame is not a control.
11
11
  */
12
12
 
13
- import { useCallback, useEffect, useMemo, useRef, useState } from "react";
13
+ import {
14
+ useCallback,
15
+ useContext,
16
+ useEffect,
17
+ useLayoutEffect,
18
+ useMemo,
19
+ useRef,
20
+ useState,
21
+ } from "react";
14
22
  import {
15
23
  Animated,
16
24
  Easing,
@@ -23,6 +31,7 @@ import {
23
31
  View as RNView,
24
32
  useWindowDimensions,
25
33
  } from "react-native";
34
+ import { SafeAreaInsetsContext, initialWindowMetrics } from "react-native-safe-area-context";
26
35
  import { useResolvedKnobs } from "@multiplatform.one/theme";
27
36
  import { minSheetHeight, resolveSheetDetents } from "./detents";
28
37
  import { useTranslation } from "../shared/i18n";
@@ -62,6 +71,7 @@ export function SheetModal({
62
71
  const { knobProps } = useResolvedKnobs();
63
72
  const { height: windowHeight } = useWindowDimensions();
64
73
  const keyboardInset = useKeyboardInset();
74
+ const topInset = useContext(SafeAreaInsetsContext)?.top ?? initialWindowMetrics?.insets.top ?? 0;
65
75
  const [backdropArmed, setBackdropArmed] = useState(false);
66
76
  const armTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
67
77
 
@@ -71,11 +81,12 @@ export function SheetModal({
71
81
  if (backdropArmed) close();
72
82
  }, [backdropArmed, close]);
73
83
 
74
- // MPO-64: the sheet ends above the keyboard rather than running under it.
84
+ // MPO-64: the sheet ends above the keyboard rather than running under it,
85
+ // and below the status bar with a strip of backdrop still showing.
75
86
  const available = Math.max(0, windowHeight - keyboardInset);
76
87
  const maxHeight = Math.max(
77
88
  minSheetHeight,
78
- Math.round(Math.min(windowHeight * sheetMaxHeightRatio, available - backdropStrip)),
89
+ Math.round(Math.min(windowHeight * sheetMaxHeightRatio, available - topInset - backdropStrip)),
79
90
  );
80
91
 
81
92
  /*
@@ -127,8 +138,59 @@ export function SheetModal({
127
138
  const presentationRef = useRef(0);
128
139
  const activeRef = useRef(false);
129
140
 
141
+ /*
142
+ * MPO-68 / MPO-299: a sheet at rest below full height is LAID OUT at that
143
+ * height. Translating a full-height frame down pushed its bottom off the
144
+ * screen, or under the keyboard, and the scroll owner inside still measured
145
+ * the full height, so the tail could never be scrolled into view.
146
+ *
147
+ * `frameCap` rides the same Animated.View as `translateY`, so the swap
148
+ * between "full height, translated" and "detent height, at 0" lands in one
149
+ * commit and the top edge does not move. `restHeightRef` is null at full
150
+ * height; a gesture always runs uncapped, in `travel` coordinates.
151
+ */
152
+ const frameCap = useRef(new Animated.Value(maxHeight)).current;
153
+ const maxHeightRef = useRef(maxHeight);
154
+ const restHeightRef = useRef<number | null>(null);
155
+ // The last uncapped layout, and whether it filled the max height. A capped
156
+ // frame measures only its cap, so when the keyboard moves the max height
157
+ // under a resting sheet, its full height is re-derived from these.
158
+ const naturalRef = useRef(0);
159
+ const filledRef = useRef(false);
160
+
161
+ useLayoutEffect(() => {
162
+ maxHeightRef.current = maxHeight;
163
+ const rest = restHeightRef.current;
164
+ frameCap.setValue(rest === null ? maxHeight : Math.min(maxHeight, rest));
165
+ if (rest !== null && naturalRef.current > 0) {
166
+ setMeasuredHeight(filledRef.current ? maxHeight : Math.min(naturalRef.current, maxHeight));
167
+ }
168
+ }, [frameCap, maxHeight]);
169
+
170
+ const restAt = useCallback(
171
+ (height: number) => {
172
+ restHeightRef.current = height;
173
+ frameCap.setValue(Math.min(maxHeightRef.current, height));
174
+ restRef.current = 0;
175
+ translateY.setValue(0);
176
+ },
177
+ [frameCap, translateY],
178
+ );
179
+
180
+ const releaseRest = useCallback(() => {
181
+ const rest = restHeightRef.current;
182
+ if (rest === null) return;
183
+ restHeightRef.current = null;
184
+ const offset = Math.max(0, travelRef.current - Math.min(maxHeightRef.current, rest));
185
+ frameCap.setValue(maxHeightRef.current);
186
+ restRef.current = offset;
187
+ translateY.setValue(offset);
188
+ }, [frameCap, translateY]);
189
+
130
190
  const settleTo = useCallback(
131
- (toValue: number, velocity = 0) => {
191
+ (height: number, velocity = 0) => {
192
+ const presentation = presentationRef.current;
193
+ const toValue = Math.max(0, travelRef.current - height);
132
194
  restRef.current = toValue;
133
195
  Animated.spring(translateY, {
134
196
  toValue,
@@ -141,9 +203,12 @@ export function SheetModal({
141
203
  // Modal does not advance on the New Architecture, and the drag path
142
204
  // already writes this value from JS.
143
205
  useNativeDriver: false,
144
- }).start();
206
+ }).start(({ finished }) => {
207
+ if (!finished || toValue === 0) return;
208
+ if (activeRef.current && presentation === presentationRef.current) restAt(height);
209
+ });
145
210
  },
146
- [translateY],
211
+ [restAt, translateY],
147
212
  );
148
213
 
149
214
  const dismiss = useCallback(
@@ -171,10 +236,15 @@ export function SheetModal({
171
236
  PanResponder.create({
172
237
  onStartShouldSetPanResponder: () => true,
173
238
  onMoveShouldSetPanResponder: (_evt, g) => Math.abs(g.dy) > 2,
239
+ // Lifting a rest cap can scroll the list inside, and a scroll lets
240
+ // any ancestor ScrollView the finger started under claim the touch,
241
+ // ending the drag and blurring a focused input on release.
242
+ onPanResponderTerminationRequest: () => false,
174
243
  onPanResponderGrant: () => {
175
244
  translateY.stopAnimation((value) => {
176
245
  if (typeof value === "number" && Number.isFinite(value)) restRef.current = value;
177
246
  });
247
+ releaseRest();
178
248
  },
179
249
  onPanResponderMove: (_evt, g) => {
180
250
  const next = restRef.current + g.dy;
@@ -199,11 +269,11 @@ export function SheetModal({
199
269
  best = height;
200
270
  }
201
271
  }
202
- settleTo(tvl - best, g.vy);
272
+ settleTo(best, g.vy);
203
273
  },
204
- onPanResponderTerminate: () => settleTo(restRef.current),
274
+ onPanResponderTerminate: () => settleTo(travelRef.current - restRef.current),
205
275
  }),
206
- [dismiss, settleTo, translateY],
276
+ [dismiss, releaseRest, settleTo, translateY],
207
277
  );
208
278
 
209
279
  /*
@@ -246,6 +316,8 @@ export function SheetModal({
246
316
  useEffect(() => {
247
317
  presentationRef.current += 1;
248
318
  activeRef.current = open;
319
+ restHeightRef.current = null;
320
+ frameCap.setValue(maxHeightRef.current);
249
321
  if (open) {
250
322
  enter();
251
323
  } else {
@@ -265,7 +337,7 @@ export function SheetModal({
265
337
  }
266
338
  translateY.stopAnimation();
267
339
  };
268
- }, [open, enter, translateY]);
340
+ }, [open, enter, frameCap, translateY]);
269
341
 
270
342
  return (
271
343
  <Modal
@@ -287,8 +359,12 @@ export function SheetModal({
287
359
  </Pressable>
288
360
  <Animated.View
289
361
  onLayout={(e) => {
362
+ if (restHeightRef.current !== null) return;
290
363
  const h = Math.round(e.nativeEvent.layout.height);
291
- if (h > 0 && h !== measuredHeight) setMeasuredHeight(h);
364
+ if (h <= 0) return;
365
+ naturalRef.current = h;
366
+ filledRef.current = h >= maxHeightRef.current - 1;
367
+ if (h !== measuredHeight) setMeasuredHeight(h);
292
368
  }}
293
369
  testID="sheet-modal-frame"
294
370
  style={{
@@ -296,10 +372,10 @@ export function SheetModal({
296
372
  // the sheet cannot give way to the keyboard.
297
373
  flexShrink: 1,
298
374
  minHeight: 0,
299
- maxHeight,
375
+ maxHeight: frameCap,
300
376
  // The cap is already keyboard- and window-aware; fill only asks
301
377
  // for it as a definite height rather than an upper bound.
302
- ...(fill ? { height: maxHeight } : null),
378
+ ...(fill ? { height: frameCap } : null),
303
379
  transform: [{ translateY }],
304
380
  }}
305
381
  >
@@ -311,13 +387,15 @@ export function SheetModal({
311
387
  borderBottomRightRadius={0}
312
388
  elevation={knobProps.elevation}
313
389
  maxHeight={maxHeight}
314
- {...(fill ? { ...fillSlot, flexShrink: 1 } : null)}
390
+ flexShrink={1}
391
+ minHeight={0}
392
+ {...(fill ? fillSlot : null)}
315
393
  paddingTop="$2"
316
394
  paddingBottom={keyboardInset > 0 ? 8 : bottomInset}
317
395
  overflow="hidden"
318
- outlineWidth={0}
319
- focusStyle={{ outlineWidth: 0 }}
320
- focusVisibleStyle={{ outlineWidth: 0 }}
396
+ // No focus or press pseudo on this surface: on native tamagui
397
+ // turns one into a touch-responder claim, and a responder here
398
+ // takes every drag from the ScrollView inside (MPO-299).
321
399
  accessibilityViewIsModal
322
400
  onAccessibilityEscape={close}
323
401
  >
@@ -108,14 +108,14 @@ describe("Skeleton — LC-20 / LC-61 announcer and motion", () => {
108
108
  });
109
109
 
110
110
  describe("Skeleton — radius classes (LC-20 / LC-60)", () => {
111
- it("text bones go square at radius:none and clamp at full (R-CLAMP)", () => {
111
+ it("text bones ride DEFAULT: square at radius:none, the token at full (MPO-56)", () => {
112
112
  const none = renderWithProviders(
113
113
  <Preset overrides={{ borderRadius: "none" }}>
114
114
  <Skeleton variant="text" width={120} />
115
115
  </Preset>,
116
116
  );
117
117
  expect(radiusClasses(none.container.querySelector("[data-skeleton]") as Element)).toEqual([
118
- "_btlr-0px",
118
+ "_btlr-t-radius-0",
119
119
  ]);
120
120
  cleanup();
121
121
 
@@ -125,7 +125,7 @@ describe("Skeleton — radius classes (LC-20 / LC-60)", () => {
125
125
  </Preset>,
126
126
  );
127
127
  expect(radiusClasses(full.container.querySelector("[data-skeleton]") as Element)).toEqual([
128
- "_btlr-t-radius-2",
128
+ "_btlr-t-radius-12",
129
129
  ]);
130
130
  });
131
131
 
@@ -4,16 +4,6 @@ import { radiusClassProps, sizeRecipeForToken, useResolvedKnobs } from "@multipl
4
4
  import type { GetProps } from "tamagui";
5
5
  import { View, styled, isWeb } from "tamagui";
6
6
 
7
- function clampTextRadius(radiusToken: string | undefined) {
8
- if (!radiusToken) return "$2";
9
- if (radiusToken === "$0") return 0;
10
- if (radiusToken.startsWith("$")) {
11
- const num = Number.parseInt(radiusToken.slice(1), 10);
12
- return Number.isFinite(num) && num > 2 ? "$2" : radiusToken;
13
- }
14
- return radiusToken;
15
- }
16
-
17
7
  export type SkeletonVariant = "text" | "circular" | "rectangular" | "rounded";
18
8
  export type SkeletonTextSize = "body" | "display";
19
9
 
@@ -106,7 +96,7 @@ export function Skeleton({
106
96
  if (isWeb) ensureShimmerStyles();
107
97
 
108
98
  const decorative = props["aria-hidden"] === true || !shouldAnnounce;
109
- // Corner-smoothing is an R-SCALE/R-CLAMP arc. Circular is R-PILL (a
99
+ // Corner-smoothing is an R-SCALE arc. Circular is R-PILL (a
110
100
  // squircle would break 1:1); rectangular is square by variant.
111
101
  const smoothingClass =
112
102
  variant === "text" || variant === "rounded" ? knobProps.borderRadius.className : undefined;
@@ -119,15 +109,12 @@ export function Skeleton({
119
109
  .filter(Boolean)
120
110
  .join(" ");
121
111
 
122
- const textRadius = knobProps.pointy ? 0 : clampTextRadius(knobProps.borderRadius.borderRadius);
123
112
  const radiusProps =
124
113
  variant === "circular"
125
114
  ? { borderRadius: 1000, ...radiusClassProps("R-PILL", "SkeletonCircle") }
126
115
  : variant === "rectangular"
127
116
  ? { borderRadius: 0 }
128
- : variant === "rounded"
129
- ? { borderRadius: knobProps.borderRadius.borderRadius }
130
- : { borderRadius: textRadius };
117
+ : { borderRadius: knobProps.borderRadius.borderRadius };
131
118
 
132
119
  return (
133
120
  <SkeletonFrame
@@ -0,0 +1,123 @@
1
+ // @vitest-environment jsdom
2
+ /**
3
+ * MPO-279: on touch mobile web the server cannot know the device, so it renders
4
+ * pointer-sized tabs. Hydration has to reproduce that markup, then adopt the
5
+ * touch floor; a first client render at touch size is an attribute mismatch
6
+ * React never patches.
7
+ */
8
+ import { TestProviders } from "@multiplatform.one/test-utils";
9
+ import { act } from "react";
10
+ import { hydrateRoot, type Root } from "react-dom/client";
11
+ import { renderToString } from "react-dom/server";
12
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
13
+ import { Tabs } from "./index";
14
+
15
+ const host = vi.hoisted(() => {
16
+ vi.stubGlobal("matchMedia", () => ({
17
+ matches: false,
18
+ addEventListener() {},
19
+ removeEventListener() {},
20
+ addListener() {},
21
+ removeListener() {},
22
+ }));
23
+ return { web: true, touch: false };
24
+ });
25
+ vi.mock("@multiplatform.one/platform", async (importOriginal) => ({
26
+ ...(await importOriginal<typeof import("@multiplatform.one/platform")>()),
27
+ get isWeb() {
28
+ return host.web;
29
+ },
30
+ get isTouchable() {
31
+ return !host.web && host.touch;
32
+ },
33
+ get isWebTouchable() {
34
+ return host.web && host.touch;
35
+ },
36
+ }));
37
+
38
+ const items = [
39
+ { value: "address", label: "Address & Contact", content: <>address panel</> },
40
+ { value: "settings", label: "Settings", content: <>settings panel</> },
41
+ ];
42
+
43
+ function Fixture() {
44
+ return (
45
+ <TestProviders>
46
+ <Tabs items={items} defaultValue="address" />
47
+ </TestProviders>
48
+ );
49
+ }
50
+
51
+ /** Every `_h-` height atom painted inside each tab, in document order. */
52
+ function tabHeights(root: ParentNode): string[][] {
53
+ return [...root.querySelectorAll('[role="tab"]')].map((tab) =>
54
+ [tab, ...tab.querySelectorAll("*")].flatMap((node) =>
55
+ [...node.classList].filter((name) => /^_h-\d/.test(name)),
56
+ ),
57
+ );
58
+ }
59
+
60
+ let container: HTMLDivElement;
61
+ let root: Root | undefined;
62
+ let errors: unknown[];
63
+
64
+ beforeEach(() => {
65
+ host.web = true;
66
+ host.touch = false;
67
+ errors = [];
68
+ vi.stubGlobal("IS_REACT_ACT_ENVIRONMENT", true);
69
+ vi.spyOn(console, "error").mockImplementation((...args) => errors.push(args));
70
+ container = document.createElement("div");
71
+ document.body.append(container);
72
+ });
73
+
74
+ afterEach(async () => {
75
+ if (root) await act(async () => root?.unmount());
76
+ root = undefined;
77
+ container.remove();
78
+ vi.restoreAllMocks();
79
+ });
80
+
81
+ async function hydrate() {
82
+ await act(async () => {
83
+ root = hydrateRoot(container, <Fixture />, {
84
+ onRecoverableError: (error) => errors.push(error),
85
+ });
86
+ });
87
+ }
88
+
89
+ const hydrationErrors = () =>
90
+ errors.filter((error) => /hydration|hydrated|didn't match/i.test(String(error)));
91
+
92
+ describe("Tabs sizing through hydration (MPO-279)", () => {
93
+ it("keeps the server's pointer-sized tabs through hydration, then adopts the touch floor", async () => {
94
+ container.innerHTML = renderToString(<Fixture />);
95
+ const serverTabs = [...container.querySelectorAll('[role="tab"]')];
96
+ const serverHeights = tabHeights(container);
97
+ expect(serverHeights.flat()).not.toHaveLength(0);
98
+
99
+ host.touch = true;
100
+ await hydrate();
101
+
102
+ expect(hydrationErrors()).toEqual([]);
103
+ expect([...container.querySelectorAll('[role="tab"]')]).toEqual(serverTabs);
104
+ const clientHeights = tabHeights(container);
105
+ expect(clientHeights).not.toEqual(serverHeights);
106
+ for (const heights of clientHeights) expect(heights).toContain("_h-48px");
107
+ });
108
+
109
+ it("leaves pointer sizing alone on a pointer device", async () => {
110
+ container.innerHTML = renderToString(<Fixture />);
111
+ const serverHeights = tabHeights(container);
112
+ await hydrate();
113
+ expect(hydrationErrors()).toEqual([]);
114
+ expect(tabHeights(container)).toEqual(serverHeights);
115
+ });
116
+
117
+ it("sizes native tabs to the touch floor on the first render", () => {
118
+ host.web = false;
119
+ host.touch = true;
120
+ container.innerHTML = renderToString(<Fixture />);
121
+ for (const heights of tabHeights(container)) expect(heights).toContain("_h-48px");
122
+ });
123
+ });
@@ -37,6 +37,7 @@ import {
37
37
  useResolvedKnobs,
38
38
  wasKeyboardFocus,
39
39
  type GroupPosition,
40
+ transitionProps,
40
41
  } from "@multiplatform.one/theme";
41
42
  import type { ReactNode } from "react";
42
43
  import React from "react";
@@ -45,7 +46,6 @@ import { useTranslation } from "../shared/i18n";
45
46
  import { wrapBareTextChildren } from "../shared/textRidesText";
46
47
  import type { GetProps, ThemeName } from "tamagui";
47
48
  import {
48
- ScrollView,
49
49
  Tabs as TamaguiTabs,
50
50
  Text,
51
51
  Theme,
@@ -56,6 +56,7 @@ import {
56
56
  withStaticProperties,
57
57
  } from "tamagui";
58
58
  import { componentColors } from "../componentColors";
59
+ import { ScrollView } from "../ScrollView";
59
60
 
60
61
  // ── Types ─────────────────────────────────────────────────────
61
62
 
@@ -492,7 +493,7 @@ function TabsRoot({
492
493
  x={activeLayout.x}
493
494
  width={activeLayout.width}
494
495
  data-tabs-indicator="underline"
495
- {...(transition ? { transition } : undefined)}
496
+ {...transitionProps(transition)}
496
497
  />
497
498
  </Theme>
498
499
  ) : (
@@ -508,7 +509,7 @@ function TabsRoot({
508
509
  {...(knobProps.elevation !== undefined
509
510
  ? { elevation: knobProps.elevation }
510
511
  : undefined)}
511
- {...(transition ? { transition } : undefined)}
512
+ {...transitionProps(transition)}
512
513
  />
513
514
  </Theme>
514
515
  )
package/src/Text.spec.tsx CHANGED
@@ -21,10 +21,10 @@
21
21
  */
22
22
  import { cleanup, screen } from "@testing-library/react";
23
23
  import { renderWithProviders } from "@multiplatform.one/test-utils";
24
- import { Preset } from "@multiplatform.one/theme";
24
+ import { Preset, useAccentOnSurface } from "@multiplatform.one/theme";
25
25
  import { XStack } from "tamagui";
26
26
  import { afterEach, describe, expect, it } from "vitest";
27
- import { Text } from "./Text";
27
+ import { Anchor, Text } from "./Text";
28
28
 
29
29
  afterEach(cleanup);
30
30
 
@@ -181,6 +181,36 @@ describe("house Text — fontWeight and bodyFont reach the text node", () => {
181
181
  });
182
182
  });
183
183
 
184
+ describe("house Anchor — link chrome is house Text's, in the accent (MPO-21 G11-A)", () => {
185
+ function AccentProbe({ onInk }: { onInk: (ink: string) => void }) {
186
+ onInk(useAccentOnSurface());
187
+ return null;
188
+ }
189
+
190
+ it("paints the AA-safe accent ink, not tamagui's link colour", () => {
191
+ let ink = "";
192
+ const anchor = renderTextClasses(
193
+ <>
194
+ <AccentProbe onInk={(value) => (ink = value)} />
195
+ <Anchor href="#">{LABEL}</Anchor>
196
+ </>,
197
+ ["_col-"],
198
+ );
199
+ expect(ink).not.toBe("");
200
+ const accented = renderTextClasses(<Anchor color={ink as never}>{LABEL}</Anchor>, ["_col-"]);
201
+ const body = renderTextClasses(<Text>{LABEL}</Text>, ["_col-"]);
202
+ expect(anchor).not.toHaveLength(0);
203
+ expect(anchor).toEqual(accented);
204
+ expect(anchor).not.toEqual(body);
205
+ });
206
+
207
+ it("a consumer colour still ejects (STD-EJECT-LAST)", () => {
208
+ const ejected = renderTextClasses(<Anchor color="$color9">{LABEL}</Anchor>, ["_col-"]);
209
+ const explicit = renderTextClasses(<Text color="$color9">{LABEL}</Text>, ["_col-"]);
210
+ expect(ejected).toEqual(explicit);
211
+ });
212
+ });
213
+
184
214
  // The NATIVE arm lives in ./Text.native.spec.tsx. It used to sit here as a
185
215
  // `vi.resetModules()` + dynamic-import block, but that returned a SPLIT module
186
216
  // graph — a fresh `renderWithProviders` over a stale `useResolvedKnobs` — and
package/src/Text.tsx CHANGED
@@ -24,10 +24,10 @@
24
24
  * 500/600 are not label weights; see tamagui-rendered-reference.md §9)
25
25
  * - textAccent → knobProps.textAccentColor (high $color / medium+low
26
26
  * $color11, the AA legibility floor) on Text/SizableText/Paragraph.
27
- * Anchor keeps tamagui's link ink: link chrome has no owning LC rule yet
28
- * (the former registry row's ADJUDICATION-CANDIDATE stands, tracked in
29
- * the MR), and painting body accent over it would silently restyle every
30
- * link before that adjudication.
27
+ * - link ink → Anchor paints the accent, as the most chromatic step of the
28
+ * theme's accent ramp that still clears AA on both page surfaces
29
+ * (`useAccentOnSurface`). House Text owns link chrome (Clay 2026-09-26,
30
+ * MPO-21 G11-A); a consumer `color` still ejects.
31
31
  *
32
32
  * Default body/label ramp (tamagui-rendered-reference.md §9, the $4 / $true
33
33
  * stop): 14px / 25px / 400. createInterFont's size+10 table yields 14/24;
@@ -38,7 +38,7 @@
38
38
  * Raw primitives stay reachable as TamaguiText / TamaguiSizableText /
39
39
  * TamaguiParagraph / TamaguiAnchor (./tamagui.ts escape hatches, LC-45).
40
40
  */
41
- import { useResolvedKnobs } from "@multiplatform.one/theme";
41
+ import { useAccentOnSurface, useResolvedKnobs } from "@multiplatform.one/theme";
42
42
  import {
43
43
  Anchor as RawAnchor,
44
44
  type AnchorProps,
@@ -81,5 +81,6 @@ export function Paragraph(props: ParagraphProps) {
81
81
 
82
82
  export function Anchor(props: AnchorProps) {
83
83
  const { knobProps } = useResolvedKnobs();
84
- return <RawAnchor {...knobProps.body} {...props} />;
84
+ const linkInk = useAccentOnSurface();
85
+ return <RawAnchor {...knobProps.body} color={linkInk} {...props} />;
85
86
  }
@@ -735,6 +735,56 @@ describe("Toast data attributes reach the DOM", () => {
735
735
  });
736
736
  });
737
737
 
738
+ describe("Toast density moves padX and gap on the host (MPO-42)", () => {
739
+ afterEach(cleanup);
740
+
741
+ const padX = ["_px-", "_pl-", "_pr-"];
742
+ const gap = ["_gap-"];
743
+
744
+ function hostAtoms(node: ReactElement) {
745
+ renderWithProviders(node);
746
+ const host = screen.getByTestId("toast");
747
+ const measured = {
748
+ density: host.getAttribute("data-density"),
749
+ padX: classesByPrefix(host, padX),
750
+ gap: classesByPrefix(host, gap),
751
+ };
752
+ cleanup();
753
+ return measured;
754
+ }
755
+
756
+ it("the density knob changes padX and gap between the two stops", () => {
757
+ const comfortable = hostAtoms(
758
+ <Preset overrides={{ density: "comfortable" }}>
759
+ <Toast title="Saved" onDismiss={() => {}} />
760
+ </Preset>,
761
+ );
762
+ const compact = hostAtoms(
763
+ <Preset overrides={{ density: "compact" }}>
764
+ <Toast title="Saved" onDismiss={() => {}} />
765
+ </Preset>,
766
+ );
767
+ expect(comfortable.density).toBe("comfortable");
768
+ expect(compact.density).toBe("compact");
769
+ expect(comfortable.padX.length).toBeGreaterThan(0);
770
+ expect(comfortable.gap.length).toBeGreaterThan(0);
771
+ expect(compact.padX).not.toEqual(comfortable.padX);
772
+ expect(compact.gap).not.toEqual(comfortable.gap);
773
+ });
774
+
775
+ it("the compact prop lands the same padX and gap as the density knob", () => {
776
+ const knob = hostAtoms(
777
+ <Preset overrides={{ density: "compact" }}>
778
+ <Toast title="Saved" onDismiss={() => {}} />
779
+ </Preset>,
780
+ );
781
+ const prop = hostAtoms(<Toast compact title="Saved" onDismiss={() => {}} />);
782
+ expect(prop.density).toBe("compact");
783
+ expect(prop.padX).toEqual(knob.padX);
784
+ expect(prop.gap).toEqual(knob.gap);
785
+ });
786
+ });
787
+
738
788
  describe("Toast action label weight and contrast (TEXT NODE)", () => {
739
789
  it("Undo is weight 400 on the TEXT NODE, never 600 (R7 / §6.1)", () => {
740
790
  const action = renderActionWeight(
@@ -2,8 +2,8 @@
2
2
  * @vitest-environment jsdom
3
3
  */
4
4
 
5
- import { fireEvent } from "@testing-library/react";
6
- import { OVERLAY_ANCHOR_GAP, __resetDevWarnSeen } from "@multiplatform.one/theme";
5
+ import { act, fireEvent } from "@testing-library/react";
6
+ import { OVERLAY_ANCHOR_GAP, Preset, __resetDevWarnSeen } from "@multiplatform.one/theme";
7
7
  import { renderWithProviders } from "@multiplatform.one/test-utils";
8
8
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
9
9
  import { Button } from "@multiplatform.one/forms";
@@ -99,6 +99,59 @@ describe("Tooltip interaction", () => {
99
99
  });
100
100
  });
101
101
 
102
+ describe("Tooltip content rides the border, elevation and animation knobs", () => {
103
+ const stops = [
104
+ { borderWidth: "none", elevation: "none", animation: "none" },
105
+ { borderWidth: "small", elevation: "small", animation: "quick" },
106
+ { borderWidth: "large", elevation: "large", animation: "slow" },
107
+ ] as const;
108
+
109
+ async function measure(stop: (typeof stops)[number]) {
110
+ const result = renderWithProviders(
111
+ <Preset overrides={stop}>
112
+ <Tooltip content="Hint" open>
113
+ <Button>Edit</Button>
114
+ </Tooltip>
115
+ </Preset>,
116
+ );
117
+ await act(async () => {
118
+ await new Promise((resolve) => setTimeout(resolve, 50));
119
+ });
120
+ const content = document.querySelector<HTMLElement>("[data-tooltip='content']");
121
+ const classes = content?.className.split(/\s+/) ?? [];
122
+ const measured = {
123
+ mounted: content !== null,
124
+ border: classes.find((c) => c.startsWith("_btw-")),
125
+ shadow: classes.find((c) => c.startsWith("_bxsh-"))?.match(/^_bxsh-\d+px\d+px\d+px/)?.[0],
126
+ transition: content?.style.transition.match(/^all \d+ms/)?.[0],
127
+ };
128
+ result.unmount();
129
+ return measured;
130
+ }
131
+
132
+ it("follows each stop on the mounted bubble, and none carries no border, shadow or motion", async () => {
133
+ const none = await measure(stops[0]);
134
+ const small = await measure(stops[1]);
135
+ const large = await measure(stops[2]);
136
+ expect(none).toEqual({
137
+ mounted: true,
138
+ border: "_btw-0px",
139
+ shadow: undefined,
140
+ transition: undefined,
141
+ });
142
+ expect(small).toMatchObject({
143
+ mounted: true,
144
+ border: "_btw-0--5px",
145
+ shadow: "_bxsh-0px3px6px",
146
+ });
147
+ // Overlay large is the ladder's own $5 dialog stop, not the control $4 (MPO-99).
148
+ expect(large).toMatchObject({ mounted: true, border: "_btw-2px", shadow: "_bxsh-0px12px24px" });
149
+ expect(small.transition).toMatch(/^all \d+ms$/);
150
+ expect(large.transition).toMatch(/^all \d+ms$/);
151
+ expect(large.transition).not.toBe(small.transition);
152
+ });
153
+ });
154
+
102
155
  describe("Tooltip native long-press open path", () => {
103
156
  beforeEach(() => {
104
157
  vi.useFakeTimers();