@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
@@ -28,14 +28,16 @@ afterEach(cleanup);
28
28
  // same hole MPO-40 / MPO-44 / MPO-48 all fell through, one layer further in:
29
29
  // the fragment reaches the frame and still never reaches the pixel.
30
30
 
31
- /** Reference §8, tamagui-rendered-reference.md — the one dialog shadow. */
32
- const referenceOverlayShadow = "0px 12px 24px rgba(0,0,0,0.12)";
31
+ /** Reference §8 dialog shadow: the overlay ladder's `$5` stop (MPO-99). */
32
+ const dialogStopPaint = "0 12px 24px rgba(0,0,0,0.12)";
33
33
  /** Same §8 geometry and alpha, hue inverted — LC-85 forbids a dark umbra. */
34
- const referenceOverlayShadowDark = "0px 12px 24px rgba(255,255,255,0.12)";
35
- /** `webShadowLight.$1` — the in-page control stop every Button carries. */
36
- const controlStopPaint = "0 1px 2px rgba(0,0,0,0.12), 0 0 1px rgba(0,0,0,0.08)";
37
- /** `webShadowLight.$2` — `elevatedSurface`'s own overlay paint. */
38
- const elevatedSurfacePaint = "0 3px 6px rgba(0,0,0,0.15), 0 2px 4px rgba(0,0,0,0.10)";
34
+ const dialogStopPaintDark = "0 12px 24px rgba(255,255,255,0.12)";
35
+ /** Reference §8 popper shadow: the overlay ladder's `$3` stop (MPO-99). */
36
+ const popperStopPaint = "0 4px 8px rgba(0,0,0,0.10), 0 12px 32px rgba(0,0,0,0.08)";
37
+ /** `webShadowLight.$2` — the overlay ladder's default `small` stop. */
38
+ const overlaySmallPaint = "0 3px 6px rgba(0,0,0,0.15), 0 2px 4px rgba(0,0,0,0.10)";
39
+ /** `webShadowLight.$4` — the control stop at elevation large. */
40
+ const controlLargePaint = "0 10px 20px rgba(0,0,0,0.15), 0 3px 6px rgba(0,0,0,0.10)";
39
41
 
40
42
  function frame(id: string): HTMLElement {
41
43
  const el = document.querySelector(`[data-testid="${id}"]`);
@@ -61,9 +63,9 @@ function bgAtoms(id: string): string[] {
61
63
  .filter((c) => c.startsWith("_bg-"));
62
64
  }
63
65
 
64
- function renderDialogsBesideAButton() {
66
+ function renderDialogsBesideAButton(elevation?: "small" | "medium" | "large") {
65
67
  renderWithProviders(
66
- <Preset>
68
+ <Preset overrides={elevation ? { elevation } : undefined}>
67
69
  <Button testID="control">Save</Button>
68
70
  <Dialog modal open>
69
71
  <Dialog.Portal>
@@ -79,61 +81,49 @@ function renderDialogsBesideAButton() {
79
81
  );
80
82
  }
81
83
 
82
- describe("overlay elevation is a different distance off the surface (MPO-49)", () => {
83
- it("DialogContent PAINTS the reference §8 shadow, not the $2 fragment underneath it", () => {
84
- renderDialogsBesideAButton();
85
- expect(paintedShadow("dialog")).toBe(referenceOverlayShadow);
86
- expect(paintedShadow("dialog")).not.toBe(elevatedSurfacePaint);
87
- expect(paintedShadow("dialog")).not.toBe(controlStopPaint);
84
+ describe("overlay elevation is a different distance off the surface (MPO-49, MPO-96, MPO-99)", () => {
85
+ it("DialogContent paints the overlay ladder, reaching the reference §8 dialog shadow at large", () => {
86
+ renderDialogsBesideAButton("large");
87
+ expect(paintedShadow("dialog")).toBe(dialogStopPaint);
88
+ expect(paintedShadow("dialog")).not.toBe(paintedShadow("control"));
89
+ expect(paintedShadow("control")).toBe(controlLargePaint);
90
+ });
91
+
92
+ it("at medium the overlay paints the §8 popper stop, not the control's $2", () => {
93
+ renderDialogsBesideAButton("medium");
94
+ expect(paintedShadow("dialog")).toBe(popperStopPaint);
95
+ expect(paintedShadow("dialog")).not.toBe(paintedShadow("control"));
88
96
  });
89
97
 
90
- it("the atom and the inline style agree — no dead §8 class over a live $2 paint", () => {
98
+ it("at the default stop the control is flat and the overlay still lifts", () => {
91
99
  renderDialogsBesideAButton();
92
- // The atom half alone does NOT discriminate: it reads `_bxsh-0px12px24px…`
93
- // with the defect present too, which is why a class-only probe passes
94
- // against a frame painting `$2`. Pair it with the painted value.
100
+ expect(paintedShadow("control")).toBe("");
101
+ expect(paintedShadow("dialog")).toBe(overlaySmallPaint);
102
+ });
103
+
104
+ it("the atom and the inline style agree — no dead class under a different live paint", () => {
105
+ renderDialogsBesideAButton("large");
106
+ // The atom half alone does not discriminate (a class can name one shadow
107
+ // while the inline style paints another), so pair it with the painted value.
95
108
  expect(shadowAtoms("dialog")).toHaveLength(1);
96
109
  expect(shadowAtoms("dialog")[0]).toMatch(/^_bxsh-0px12px24px/);
97
110
  expect(paintedShadow("dialog")).toContain("12px 24px");
98
- });
99
-
100
- it("the dialog shadow differs from the Button shadow, and the Button keeps the $1 stop", () => {
101
- renderDialogsBesideAButton();
102
- // "differs" alone does not discriminate: with the defect present the
103
- // dialog paints `$2` and the Button `$1`, which also differ. The §8 value
104
- // itself is pinned by the first case in this file; here the control side
105
- // is pinned to `$1` so a Button regression cannot fake this one either.
106
- expect(paintedShadow("control")).toBe(controlStopPaint);
107
- expect(paintedShadow("dialog")).not.toBe(paintedShadow("control"));
108
111
  expect(shadowAtoms("dialog")).not.toEqual(shadowAtoms("control"));
109
112
  });
110
113
 
111
- it("AlertDialogContent wears the same §8 shadow — one dialog row, one distance", () => {
114
+ it("AlertDialogContent wears the same ladder stop as DialogContent — one dialog row, one distance", () => {
112
115
  // Tamagui's AlertDialog.Content IS Dialog.Content, and reference §8
113
116
  // carries a single dialog row. confirm-dialog-{destructive,gated,warning}
114
117
  // render through this frame.
115
- renderDialogsBesideAButton();
116
- expect(paintedShadow("alertdialog")).toBe(referenceOverlayShadow);
118
+ renderDialogsBesideAButton("large");
119
+ expect(paintedShadow("alertdialog")).toBe(dialogStopPaint);
117
120
  expect(paintedShadow("alertdialog")).toBe(paintedShadow("dialog"));
118
121
  });
119
122
 
120
123
  it("dark inverts the hue and keeps the §8 geometry; the ground steps up the ramp (LC-85)", () => {
121
- renderWithProviders(
122
- <Preset>
123
- <Dialog modal open>
124
- <Dialog.Portal>
125
- <DialogContent testID="dialog">dialog</DialogContent>
126
- </Dialog.Portal>
127
- </Dialog>
128
- </Preset>,
129
- );
130
- expect(paintedShadow("dialog")).toBe(referenceOverlayShadow);
131
- expect(bgAtoms("dialog")).toEqual(["_bg-background"]);
132
- cleanup();
133
-
134
124
  renderWithProviders(
135
125
  <Theme name="dark">
136
- <Preset>
126
+ <Preset overrides={{ elevation: "large" }}>
137
127
  <Dialog modal open>
138
128
  <Dialog.Portal>
139
129
  <DialogContent testID="dialog">dialog</DialogContent>
@@ -143,12 +133,10 @@ describe("overlay elevation is a different distance off the surface (MPO-49)", (
143
133
  </Theme>,
144
134
  );
145
135
  // LC-85 DARK-ELEVATION-TINT: light-coloured shadow, never a black umbra.
146
- expect(paintedShadow("dialog")).toBe(referenceOverlayShadowDark);
147
- expect(paintedShadow("dialog")).not.toBe(referenceOverlayShadow);
136
+ expect(paintedShadow("dialog")).toBe(dialogStopPaintDark);
148
137
  expect(paintedShadow("dialog")).not.toMatch(/rgba\(0,\s*0,\s*0/);
149
138
  // resolveKnobs owns the dark ground: `overlayFill` steps the filled rest
150
- // fill up the ramp under dark + elevation (LC-85). Asserted so a later
151
- // change to that rule shows up here rather than silently on a board.
152
- expect(bgAtoms("dialog")).toEqual(["_bg-color2"]);
139
+ // fill up the ramp under dark + elevation (LC-85).
140
+ expect(bgAtoms("dialog")).toEqual(["_bg-color4"]);
153
141
  });
154
142
  });
@@ -88,14 +88,14 @@ describe("SheetFrame overlay chrome", () => {
88
88
  });
89
89
 
90
90
  describe("DialogContent overlay elevation (MPO-49)", () => {
91
- it("binds overlayElevation, elevate=false, and the §8 overlay shadow — not Tamagui $1 elevate", () => {
91
+ it("binds the overlay ladder through elevatedSurface with elevate=false, and hardcodes no shadow (MPO-99)", () => {
92
92
  const src = readFileSync(join(dirname(fileURLToPath(import.meta.url)), "surfaces.tsx"), "utf8");
93
93
  const start = src.indexOf("// ── DialogContent");
94
94
  const end = src.indexOf("// ── DialogOverlay");
95
95
  const dialog = src.slice(start, end);
96
96
  expect(dialog).toContain("elevate={false}");
97
- expect(dialog).toContain("overlayElevationShadow");
98
- expect(dialog).toContain("rgba(0,0,0,0.12)");
97
+ expect(dialog).not.toContain("overlayElevationShadow");
98
+ expect(dialog).not.toContain("rgba(0,0,0,0.12)");
99
99
  expect(dialog).toContain("elevatedSurface");
100
100
  expect(dialog).toContain("containerRadius");
101
101
  expect(dialog).toContain("panelPadding");
@@ -122,9 +122,12 @@ describe("DialogContent overlay elevation (MPO-49)", () => {
122
122
  // dialog elevation defect Button/control `$1` -> `_bxsh-0px1px2px…`
123
123
  // fixed reference §8 -> `_bxsh-0px12px24px…`
124
124
  //
125
+ // Since MPO-99 the §8 value is the overlay ladder's `$5` stop, which the
126
+ // dialog reaches at elevation large; the control paints `$4` there.
127
+ //
125
128
  // A "differs from the Button" assertion does NOT discriminate: the Button
126
129
  // paints `0 6px 12px` from its own source in both states, so that comparison
127
- // passes with the defect present. Assert against the $1 CONTROL stop.
130
+ // passes with the defect present. Assert against the CONTROL stop.
128
131
 
129
132
  function atomsWithPrefix(el: Element | null, prefix: string): string[] {
130
133
  if (!el) return [];
@@ -134,9 +137,9 @@ function atomsWithPrefix(el: Element | null, prefix: string): string[] {
134
137
  .sort();
135
138
  }
136
139
 
137
- /** The `$1` control paint — `webShadowLight.$1`, "0 1px 2px …" (resolveKnobs.ts). */
138
- const controlStopShadowAtom = /^_bxsh-0px1px2px/;
139
- /** Rendered reference §8 DialogContent — `rgba(0,0,0,0.12) 0 12px 24px`. */
140
+ /** The `$4` control paint at elevation large — `webShadowLight.$4`, "0 10px 20px …". */
141
+ const controlStopShadowAtom = /^_bxsh-0px10px20px/;
142
+ /** The `$5` overlay stop at elevation large — reference §8 dialog shadow, "0 12px 24px …". */
140
143
  const overlayStopShadowAtom = /^_bxsh-0px12px24px/;
141
144
 
142
145
  describe("surfaces address $background at the FRAME (MPO-19 X5/X6)", () => {
@@ -164,9 +167,9 @@ describe("surfaces address $background at the FRAME (MPO-19 X5/X6)", () => {
164
167
  });
165
168
 
166
169
  describe("DialogContent paints the OVERLAY elevation stop, not the control one (MPO-49)", () => {
167
- it("renders the reference §8 shadow and not the Button $1 stop", () => {
170
+ it("renders the reference §8 shadow at elevation large and not the Button $4 stop (MPO-99)", () => {
168
171
  renderWithProviders(
169
- <Preset>
172
+ <Preset overrides={{ elevation: "large" }}>
170
173
  <Button testID="mpo-button-control">Save</Button>
171
174
  <Dialog modal open>
172
175
  <Dialog.Portal>
@@ -184,7 +187,7 @@ describe("DialogContent paints the OVERLAY elevation stop, not the control one (
184
187
  const dialogShadow = atomsWithPrefix(dialog, "_bxsh-");
185
188
  expect(dialogShadow, "DialogContent paints exactly one shadow atom").toHaveLength(1);
186
189
  expect(dialogShadow[0], "dialog wears the §8 overlay shadow").toMatch(overlayStopShadowAtom);
187
- expect(dialogShadow[0], "dialog must not wear the $1 control stop").not.toMatch(
190
+ expect(dialogShadow[0], "dialog must not wear the $4 control stop").not.toMatch(
188
191
  controlStopShadowAtom,
189
192
  );
190
193
  expect(dialogShadow, "dialog and control are different distances off the surface").not.toEqual(
package/src/surfaces.tsx CHANGED
@@ -7,7 +7,6 @@ import {
7
7
  Popover,
8
8
  Sheet,
9
9
  View,
10
- isWeb,
11
10
  type DialogContentProps as TamaguiDialogContentProps,
12
11
  type DialogOverlayProps as TamaguiDialogOverlayProps,
13
12
  type TamaguiElement,
@@ -103,42 +102,16 @@ export const DialogContent = forwardRef<
103
102
  );
104
103
  });
105
104
 
106
- /**
107
- * Reference §8 overlay shadow — rgba(0,0,0,0.12) 0 12px 24px. Not Button $1,
108
- * and not the `$2` fragment `elevatedSurface` carries either: that fragment's
109
- * web paint arrives as an INLINE style (`elevationPaint` emits
110
- * `style.boxShadow`, and Tamagui stamps `!important` only on pseudo atoms),
111
- * so a shadow expressed only as `shadow*` props is a dead class atom under a
112
- * live `$2` paint. The §8 value must land on the `style` prop too, replacing
113
- * the fragment's. Dark inverts the hue and keeps the geometry — LC-85
114
- * DARK-ELEVATION-TINT forbids a black umbra on a dark ground.
115
- */
116
- const overlayElevationShadow = {
117
- light: {
118
- shadowColor: "rgba(0,0,0,0.12)",
119
- shadowOffset: { width: 0, height: 12 },
120
- shadowOpacity: 1,
121
- shadowRadius: 24,
122
- ...(isWeb ? { style: { boxShadow: "0px 12px 24px rgba(0,0,0,0.12)" } } : null),
123
- },
124
- dark: {
125
- shadowColor: "rgba(255,255,255,0.12)",
126
- shadowOffset: { width: 0, height: 12 },
127
- shadowOpacity: 1,
128
- shadowRadius: 24,
129
- ...(isWeb ? { style: { boxShadow: "0px 12px 24px rgba(255,255,255,0.12)" } } : null),
130
- },
131
- } as const;
132
-
133
105
  const DialogContentInner = forwardRef<
134
106
  TamaguiElement,
135
107
  TamaguiDialogContentProps & { children?: ReactNode }
136
108
  >(function DialogContentInner({ children, ...props }, ref) {
137
109
  const { knobProps } = useResolvedKnobs({ component: "DialogContent" });
138
110
  // ThemeableStack unstyled:false defaults `elevate: true`, which paints
139
- // getElevation(size) — `$true` is the same $1 stop every Button carries.
140
- // Bind the §8 overlay shadow instead. Geometry (panelPadding 18,
141
- // containerRadius 9, border 1px) stays on the recipe fragments below.
111
+ // getElevation(size) — `$true` is a control stop. `elevate={false}` leaves
112
+ // the overlay ladder in `elevatedSurface` as the only shadow (MPO-99).
113
+ // Geometry (panelPadding 18, containerRadius 9, border 1px) stays on the
114
+ // recipe fragments below.
142
115
  return (
143
116
  <Dialog.Content
144
117
  ref={ref}
@@ -147,7 +120,6 @@ const DialogContentInner = forwardRef<
147
120
  {...knobProps.panelPadding}
148
121
  {...knobProps.gap}
149
122
  elevate={false}
150
- {...overlayElevationShadow[knobProps.scheme]}
151
123
  transition={knobProps.transition}
152
124
  enterStyle={overlayEnterExit}
153
125
  exitStyle={overlayEnterExit}
@@ -227,7 +199,6 @@ const AlertDialogContentInner = forwardRef<
227
199
  {...knobProps.panelPadding}
228
200
  {...knobProps.gap}
229
201
  elevate={false}
230
- {...overlayElevationShadow[knobProps.scheme]}
231
202
  transition={knobProps.transition}
232
203
  enterStyle={overlayEnterExit}
233
204
  exitStyle={overlayEnterExit}
@@ -48,11 +48,11 @@ const ALLOWLIST_VALUE_NAMES = [
48
48
  // barrel and had been red ever since. MPO-78: CI runs `turbo run build`
49
49
  // only, so nothing caught it.)
50
50
  "Circle",
51
- // MPO-21 G1 / G3 / G4. Restored by MPO-148; MPO-169 locks them here so a
51
+ // MPO-21 G3 / G4. Restored by MPO-148; MPO-169 locks them here so a
52
52
  // later Adapt-style rewrite cannot drop them without this spec going red.
53
53
  // LinearGradient (G2) is not on the main tamagui barrel — see the dedicated
54
- // assertion below rather than this identity check.
55
- "Collapsible",
54
+ // assertion below rather than this identity check. Collapsible (G1) is a
55
+ // house shadow since MPO-265: its Trigger defaults to type="button".
56
56
  "Group",
57
57
  "ListItem",
58
58
  "ScrollView",
@@ -138,6 +138,7 @@ const HOUSE_SHADOWS = [
138
138
  "Avatar",
139
139
  "Button",
140
140
  "Card",
141
+ "Collapsible",
141
142
  "Fieldset",
142
143
  "H1",
143
144
  "H2",
package/src/tamagui.ts CHANGED
@@ -32,7 +32,6 @@ export {
32
32
  Circle,
33
33
  Group,
34
34
  ListItem,
35
- ScrollView,
36
35
  Spacer,
37
36
  Square,
38
37
  Unspaced,
@@ -44,6 +43,10 @@ export {
44
43
  YStack,
45
44
  } from "tamagui";
46
45
 
46
+ // Raw tamagui on web. On native ./ScrollView/index.native.tsx hands onScroll
47
+ // to the RN ScrollView, which tamagui's own styled scroller drops (MPO-368).
48
+ export { ScrollView } from "./ScrollView";
49
+
47
50
  // MPO-21 G2: LinearGradient is NOT on the main tamagui barrel — it lives
48
51
  // on the `tamagui/linear-gradient` subpath.
49
52
  export { LinearGradient } from "tamagui/linear-gradient";
@@ -18,9 +18,9 @@
18
18
  */
19
19
  import { cleanup, screen } from "@testing-library/react";
20
20
  import { renderWithProviders } from "@multiplatform.one/test-utils";
21
- import { Preset } from "@multiplatform.one/theme";
21
+ import { Preset, useResolvedKnobs } from "@multiplatform.one/theme";
22
22
  import type { ReactElement } from "react";
23
- import { Theme } from "tamagui";
23
+ import { SizableText, Theme } from "tamagui";
24
24
  import { afterEach, describe, expect, it } from "vitest";
25
25
  import { Accordion } from "./Accordion";
26
26
  import { componentColors } from "./componentColors";
@@ -177,6 +177,104 @@ describe("Meter — textAccent reaches the ok-zone value readout (MPO-154)", ()
177
177
  });
178
178
  });
179
179
 
180
+ /**
181
+ * low == medium alone also passes a surface pinned to a static step, so the
182
+ * dim stops are checked against a probe painting the resolver's own colour.
183
+ */
184
+ function restInk(el: Element): string | undefined {
185
+ for (const cls of Array.from(el.classList)) {
186
+ if (!cls.startsWith("_col-")) continue;
187
+ const value = cls.slice("_col-".length);
188
+ if (/^\d*(hover|active|focus|press|disabled)/.test(value)) continue;
189
+ return value;
190
+ }
191
+ return undefined;
192
+ }
193
+
194
+ function ResolverInk() {
195
+ const { knobProps } = useResolvedKnobs();
196
+ return (
197
+ <SizableText data-resolver-ink={knobProps.textAccentColor} color={knobProps.textAccentColor}>
198
+ resolver ink
199
+ </SizableText>
200
+ );
201
+ }
202
+
203
+ function againstResolver(
204
+ scheme: Scheme,
205
+ accent: Accent,
206
+ node: ReactElement,
207
+ pick: (container: HTMLElement) => Element | null,
208
+ ) {
209
+ const { container } = renderWithProviders(
210
+ inScheme(
211
+ scheme,
212
+ <Preset overrides={{ textAccent: accent }}>
213
+ {node}
214
+ <ResolverInk />
215
+ </Preset>,
216
+ ),
217
+ );
218
+ const surface = pick(container);
219
+ const probe = container.querySelector("[data-resolver-ink]");
220
+ const result = {
221
+ surface: surface ? restInk(surface) : undefined,
222
+ resolver: probe ? restInk(probe) : undefined,
223
+ token: probe?.getAttribute("data-resolver-ink") ?? null,
224
+ };
225
+ cleanup();
226
+ return result;
227
+ }
228
+
229
+ describe("the dim stops paint the resolver's AA floor, not a pinned step (MPO-154)", () => {
230
+ const surfaces: Array<[string, ReactElement, (container: HTMLElement) => Element | null]> = [
231
+ [
232
+ "Tabs inactive label",
233
+ <Tabs
234
+ key="tabs"
235
+ items={[
236
+ { value: "address", label: "Address & Contact", content: <>address panel</> },
237
+ { value: "settings", label: "Settings", content: <>settings panel</> },
238
+ ]}
239
+ defaultValue="address"
240
+ />,
241
+ () => screen.getByText("Settings"),
242
+ ],
243
+ [
244
+ "Accordion description",
245
+ <Accordion key="accordion" defaultValue="shipping">
246
+ <Accordion.Item value="shipping">
247
+ <Accordion.Trigger description="Where should we deliver the order?">
248
+ Shipping details
249
+ </Accordion.Trigger>
250
+ <Accordion.Content>ship</Accordion.Content>
251
+ </Accordion.Item>
252
+ </Accordion>,
253
+ () => screen.getByText("Where should we deliver the order?"),
254
+ ],
255
+ [
256
+ "Quote attribution",
257
+ <Quote key="quote" cite="Alan Kay">
258
+ The best way to predict the future.
259
+ </Quote>,
260
+ (container) => container.querySelector("cite"),
261
+ ],
262
+ ];
263
+
264
+ for (const scheme of schemes) {
265
+ for (const [name, node, pick] of surfaces) {
266
+ for (const accent of ["low", "medium"] as const) {
267
+ it(`${scheme}: ${name} at ${accent} equals the resolver's textAccentColor`, () => {
268
+ const { surface, resolver, token } = againstResolver(scheme, accent, node, pick);
269
+ expect(token).toBe("$color11");
270
+ expect(resolver).toBeDefined();
271
+ expect(surface).toBe(resolver);
272
+ });
273
+ }
274
+ }
275
+ }
276
+ });
277
+
180
278
  describe("componentColors keeps no second answer for secondary ink (MPO-154)", () => {
181
279
  it("the text table exposes no static secondary or muted step", () => {
182
280
  const text = componentColors.text as Record<string, string | undefined>;
@@ -17,8 +17,9 @@ import React, {
17
17
  type ReactNode,
18
18
  } from "react";
19
19
  import { AccessibilityInfo, Animated } from "react-native";
20
- import { ListItem, ScrollView, Text, View, XStack, YStack, type YStackProps } from "tamagui";
20
+ import { ListItem, Text, View, XStack, YStack, type YStackProps } from "tamagui";
21
21
  import { componentColors } from "../componentColors";
22
+ import { ScrollView } from "../ScrollView";
22
23
  import { AsyncBoundary, useAsyncCount } from "../layouts/AsyncBoundary";
23
24
  import { EmptyState } from "../layouts/page";
24
25
  import { Card } from "../surfaces";
@@ -838,6 +839,7 @@ function KanbanColumnView<T>({
838
839
  overflow="hidden"
839
840
  transition={knobProps.transition}
840
841
  {...knobProps.borderRadius}
842
+ {...knobProps.containerRadius}
841
843
  {...knobProps.panelPadding}
842
844
  backgroundColor={isDropTarget ? componentColors.interactive.background : "transparent"}
843
845
  data-kanban-column={column.id}
@@ -112,6 +112,21 @@ describe("Kanban design law (SB-M-302 / LC-60)", () => {
112
112
  expect(fullColumn).not.toBe(noneColumn);
113
113
  });
114
114
 
115
+ it("caps the padded column frame at its own padding (DG-RAD-04 CONTAINER-CAP)", () => {
116
+ const columnRadius = (overrides: Parameters<typeof Preset>[0]["overrides"]) => {
117
+ renderWithProviders(
118
+ <Preset overrides={overrides}>
119
+ <Kanban columns={columns} renderCard={(item) => <span>{item.title}</span>} />
120
+ </Preset>,
121
+ );
122
+ const found = radiusClassOn(document.querySelector("[data-kanban-column='todo']"));
123
+ cleanup();
124
+ return found;
125
+ };
126
+ expect(columnRadius({ borderRadius: "full", space: "medium" })).toBe("_btlr-18px");
127
+ expect(columnRadius({ borderRadius: "large", space: "small" })).toBe("_btlr-13px");
128
+ });
129
+
115
130
  it("does not paint raw input-surface borders on the column frame", () => {
116
131
  renderWithProviders(
117
132
  <Kanban columns={columns} renderCard={(item) => <span>{item.title}</span>} />,
@@ -1336,6 +1336,7 @@ function KanbanColumnView<T>({
1336
1336
  overflow="hidden"
1337
1337
  transition={knobProps.transition}
1338
1338
  {...knobProps.borderRadius}
1339
+ {...knobProps.containerRadius}
1339
1340
  {...knobProps.panelPadding}
1340
1341
  backgroundColor={
1341
1342
  isDropTarget || isActiveColumn ? componentColors.interactive.background : "transparent"
@@ -132,3 +132,53 @@ describe("ListRow ink — textAccent reaches the TEXT NODE (F11 / data-chrome ho
132
132
  expect(high).not.toEqual(low);
133
133
  });
134
134
  });
135
+
136
+ describe("List rows are a CONTAINER-CAP stack (DG-RAD-04, MPO-56)", () => {
137
+ const rows = (overrides: {
138
+ borderRadius: "none" | "large" | "full";
139
+ space: "small" | "medium";
140
+ }) => {
141
+ renderWithProviders(
142
+ <Preset overrides={overrides}>
143
+ <List
144
+ items={documents}
145
+ aria-label="Documents"
146
+ renderItem={(item) => <ListRow title={item.title} />}
147
+ height={300}
148
+ estimateSize={50}
149
+ />
150
+ </Preset>,
151
+ );
152
+ const found = screen.getAllByRole("listitem").map((row) => ({
153
+ corners: atoms(row, ["_borderStartStartRadius-", "_borderEndEndRadius-"]).filter((a) =>
154
+ /Radius-\d+px$/.test(a),
155
+ ),
156
+ container: row.getAttribute("data-constraint-container"),
157
+ position: row.getAttribute("data-stack-position"),
158
+ }));
159
+ cleanup();
160
+ return found;
161
+ };
162
+
163
+ it("caps the outer corners at the row padding at full, square inside", () => {
164
+ const [first, middle, last] = rows({ borderRadius: "full", space: "medium" });
165
+ expect(first.corners).toEqual(["_borderEndEndRadius-0px", "_borderStartStartRadius-18px"]);
166
+ expect(middle.corners).toEqual(["_borderEndEndRadius-0px", "_borderStartStartRadius-0px"]);
167
+ expect(last.corners).toEqual(["_borderEndEndRadius-18px", "_borderStartStartRadius-0px"]);
168
+ });
169
+
170
+ it("caps large at 13 under space small", () => {
171
+ const [first] = rows({ borderRadius: "large", space: "small" });
172
+ expect(first.corners).toContain("_borderStartStartRadius-13px");
173
+ });
174
+
175
+ it("declares each row a StackedRow with its position", () => {
176
+ expect(
177
+ rows({ borderRadius: "large", space: "small" }).map((r) => [r.container, r.position]),
178
+ ).toEqual([
179
+ ["StackedRow", "first"],
180
+ ["StackedRow", "middle"],
181
+ ["StackedRow", "last"],
182
+ ]);
183
+ });
184
+ });
@@ -4,6 +4,7 @@ import { Spinner } from "@multiplatform.one/forms";
4
4
  import { FlashList, type FlashListRef } from "@shopify/flash-list";
5
5
  import {
6
6
  MIN_PRESS_TARGET,
7
+ containerCapProps,
7
8
  ensureKeyboardModalityTracking,
8
9
  getGroupPosition,
9
10
  hairline,
@@ -13,6 +14,7 @@ import {
13
14
  useReadableTextOn,
14
15
  useResolvedKnobs,
15
16
  wasKeyboardFocus,
17
+ transitionProps,
16
18
  } from "@multiplatform.one/theme";
17
19
  import { useHotkey } from "@tanstack/react-hotkeys";
18
20
  import type { RegisterableHotkey } from "@tanstack/react-hotkeys";
@@ -280,7 +282,7 @@ export function List<T>({
280
282
  const estimateSize = estimateSizeProp ?? Math.max(MIN_PRESS_TARGET, knobProps.control.height);
281
283
  const rowPad = knobProps.panelPadding.padding;
282
284
  const onAccent = useReadableTextOn("$accentBackground");
283
- const cornersRadius = knobProps.borderRadius.borderRadius;
285
+ const cornersRadius = knobProps.containerRadius.borderRadius;
284
286
  // No explicit height: hug content when the list is complete (page scrolls,
285
287
  // no dead space / nested scrollbar); cap + scroll internally only while
286
288
  // more pages can stream in (FlashList needs a bounded viewport to
@@ -475,6 +477,12 @@ export function List<T>({
475
477
  {index > 0 ? <View {...hairline.line} /> : null}
476
478
  <XStack
477
479
  id={`${listId}-item-${index}`}
480
+ data-stack-position={position}
481
+ {...containerCapProps(
482
+ "StackedRow",
483
+ knobProps.borderRadius.borderRadius,
484
+ knobProps.space,
485
+ )}
478
486
  {...({
479
487
  "data-list-row": true,
480
488
  ...(isSelected ? { "data-selected": true } : {}),
@@ -486,9 +494,9 @@ export function List<T>({
486
494
  alignItems="center"
487
495
  overflow="hidden"
488
496
  // Rows form ONE stacked group: the hover/focus/selection
489
- // surface rounds with the radius knob only at the group's
490
- // outer corners; interiors stay square (LC-72). Hairlines
491
- // sit BETWEEN rows only — never after the last.
497
+ // surface rounds only at the group's outer corners, capped
498
+ // at the row padding (DG-RAD-04); interiors stay square
499
+ // (LC-72). Hairlines sit BETWEEN rows only, never after the last.
492
500
  {...corners}
493
501
  role="listitem"
494
502
  aria-selected={isSelected}
@@ -513,7 +521,7 @@ export function List<T>({
513
521
  ...corners,
514
522
  }}
515
523
  cursor="pointer"
516
- {...(knobProps.transition ? { transition: knobProps.transition } : {})}
524
+ {...transitionProps(knobProps.transition)}
517
525
  onPress={() => {
518
526
  commitSelection(index);
519
527
  onItemClick?.(item);