@multiplatform.one/components 7.11.0 → 7.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (413) 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 +2 -6
  4. package/dist/cjs/Accordion/index.native.js.map +1 -1
  5. package/dist/cjs/AnimateHeight/index.cjs +1 -3
  6. package/dist/cjs/AnimateHeight/index.native.js +1 -3
  7. package/dist/cjs/AnimateHeight/index.native.js.map +1 -1
  8. package/dist/cjs/Chip/index.cjs +8 -1
  9. package/dist/cjs/Chip/index.native.js +8 -1
  10. package/dist/cjs/Chip/index.native.js.map +1 -1
  11. package/dist/cjs/SheetModal/index.native.js +70 -22
  12. package/dist/cjs/SheetModal/index.native.js.map +1 -1
  13. package/dist/cjs/Tabs/index.cjs +2 -6
  14. package/dist/cjs/Tabs/index.native.js +2 -6
  15. package/dist/cjs/Tabs/index.native.js.map +1 -1
  16. package/dist/cjs/Text.cjs +2 -0
  17. package/dist/cjs/Text.native.js +2 -0
  18. package/dist/cjs/Text.native.js.map +1 -1
  19. package/dist/cjs/TreeSelect/index.cjs +55 -52
  20. package/dist/cjs/TreeSelect/index.native.js +55 -52
  21. package/dist/cjs/TreeSelect/index.native.js.map +1 -1
  22. package/dist/cjs/Video/PlayerChrome.cjs +3 -9
  23. package/dist/cjs/Video/PlayerChrome.native.js +3 -9
  24. package/dist/cjs/Video/PlayerChrome.native.js.map +1 -1
  25. package/dist/cjs/code/Code/index.cjs +6 -0
  26. package/dist/cjs/code/Code/index.native.js +7 -4
  27. package/dist/cjs/code/Code/index.native.js.map +1 -1
  28. package/dist/cjs/code/CodeBlock/index.cjs +4 -5
  29. package/dist/cjs/code/CodeBlock/index.native.js +4 -5
  30. package/dist/cjs/code/CodeBlock/index.native.js.map +1 -1
  31. package/dist/cjs/icons/themed.cjs +2 -1
  32. package/dist/cjs/icons/themed.native.js +2 -1
  33. package/dist/cjs/icons/themed.native.js.map +1 -1
  34. package/dist/cjs/knobImmuneExports.cjs +3 -3
  35. package/dist/cjs/knobImmuneExports.native.js +3 -3
  36. package/dist/cjs/layouts/PaneScaffold.cjs +70 -42
  37. package/dist/cjs/layouts/PaneScaffold.native.js +75 -48
  38. package/dist/cjs/layouts/PaneScaffold.native.js.map +1 -1
  39. package/dist/cjs/layouts/page.cjs +2 -1
  40. package/dist/cjs/layouts/page.native.js +2 -1
  41. package/dist/cjs/layouts/page.native.js.map +1 -1
  42. package/dist/cjs/layouts/sidebar.cjs +1 -3
  43. package/dist/cjs/layouts/sidebar.native.js +1 -3
  44. package/dist/cjs/layouts/sidebar.native.js.map +1 -1
  45. package/dist/cjs/surfaces.cjs +0 -32
  46. package/dist/cjs/surfaces.native.js +0 -32
  47. package/dist/cjs/surfaces.native.js.map +1 -1
  48. package/dist/cjs/views/List.cjs +1 -3
  49. package/dist/cjs/views/List.native.js +1 -3
  50. package/dist/cjs/views/List.native.js.map +1 -1
  51. package/dist/cjs/views/Matrix.cjs +568 -0
  52. package/dist/cjs/views/Matrix.native.js +612 -0
  53. package/dist/cjs/views/Matrix.native.js.map +1 -0
  54. package/dist/cjs/views/ganttMath.cjs +2 -0
  55. package/dist/cjs/views/ganttMath.native.js +2 -0
  56. package/dist/cjs/views/ganttMath.native.js.map +1 -1
  57. package/dist/cjs/views/index.cjs +16 -0
  58. package/dist/cjs/views/index.native.js +16 -0
  59. package/dist/cjs/views/index.native.js.map +1 -1
  60. package/dist/cjs/views/matrixMath.cjs +157 -0
  61. package/dist/cjs/views/matrixMath.native.js +229 -0
  62. package/dist/cjs/views/matrixMath.native.js.map +1 -0
  63. package/dist/esm/Accordion/index.mjs +3 -7
  64. package/dist/esm/Accordion/index.mjs.map +1 -1
  65. package/dist/esm/Accordion/index.native.js +3 -7
  66. package/dist/esm/Accordion/index.native.js.map +1 -1
  67. package/dist/esm/AnimateHeight/index.mjs +2 -4
  68. package/dist/esm/AnimateHeight/index.mjs.map +1 -1
  69. package/dist/esm/AnimateHeight/index.native.js +2 -4
  70. package/dist/esm/AnimateHeight/index.native.js.map +1 -1
  71. package/dist/esm/Avatar/getInitials.native.js.map +1 -1
  72. package/dist/esm/Avatar/index.native.js.map +1 -1
  73. package/dist/esm/Badge/index.native.js.map +1 -1
  74. package/dist/esm/Button.native.js.map +1 -1
  75. package/dist/esm/Carousel/index.native.js.map +1 -1
  76. package/dist/esm/Chip/index.mjs +9 -2
  77. package/dist/esm/Chip/index.mjs.map +1 -1
  78. package/dist/esm/Chip/index.native.js +9 -2
  79. package/dist/esm/Chip/index.native.js.map +1 -1
  80. package/dist/esm/Collapsible.native.js.map +1 -1
  81. package/dist/esm/ContextMenu/index.native.js.map +1 -1
  82. package/dist/esm/CopyField/index.native.js.map +1 -1
  83. package/dist/esm/DotIndicator/index.native.js.map +1 -1
  84. package/dist/esm/DropdownMenu/index.native.js.map +1 -1
  85. package/dist/esm/ErrorBoundary/index.native.js.map +1 -1
  86. package/dist/esm/Heading.native.js.map +1 -1
  87. package/dist/esm/Meter/index.native.js.map +1 -1
  88. package/dist/esm/Meter/meter.native.js.map +1 -1
  89. package/dist/esm/Pagination.native.js.map +1 -1
  90. package/dist/esm/ProgressSteps/index.native.js.map +1 -1
  91. package/dist/esm/Quote/index.native.js.map +1 -1
  92. package/dist/esm/Separator/index.native.js.map +1 -1
  93. package/dist/esm/SheetModal/detents.native.js.map +1 -1
  94. package/dist/esm/SheetModal/index.native.js +71 -23
  95. package/dist/esm/SheetModal/index.native.js.map +1 -1
  96. package/dist/esm/Skeleton/index.native.js.map +1 -1
  97. package/dist/esm/SkipLink/index.native.js.map +1 -1
  98. package/dist/esm/SortableList/SortableHandle.native.js.map +1 -1
  99. package/dist/esm/SortableList/index.native.js.map +1 -1
  100. package/dist/esm/SortableList/useSortableRows.native.js.map +1 -1
  101. package/dist/esm/Tabs/index.mjs +3 -7
  102. package/dist/esm/Tabs/index.mjs.map +1 -1
  103. package/dist/esm/Tabs/index.native.js +3 -7
  104. package/dist/esm/Tabs/index.native.js.map +1 -1
  105. package/dist/esm/Text.mjs +3 -1
  106. package/dist/esm/Text.mjs.map +1 -1
  107. package/dist/esm/Text.native.js +3 -1
  108. package/dist/esm/Text.native.js.map +1 -1
  109. package/dist/esm/Toast/index.native.js.map +1 -1
  110. package/dist/esm/Toast/store.native.js.map +1 -1
  111. package/dist/esm/Tooltip/nativePress.native.js.map +1 -1
  112. package/dist/esm/Tooltip/tooltipShared.native.js.map +1 -1
  113. package/dist/esm/TreeSelect/index.mjs +56 -53
  114. package/dist/esm/TreeSelect/index.mjs.map +1 -1
  115. package/dist/esm/TreeSelect/index.native.js +56 -53
  116. package/dist/esm/TreeSelect/index.native.js.map +1 -1
  117. package/dist/esm/TreeSelect/treeSelectModel.native.js.map +1 -1
  118. package/dist/esm/Video/PlayerChrome.mjs +4 -10
  119. package/dist/esm/Video/PlayerChrome.mjs.map +1 -1
  120. package/dist/esm/Video/PlayerChrome.native.js +4 -10
  121. package/dist/esm/Video/PlayerChrome.native.js.map +1 -1
  122. package/dist/esm/Video/VideoFrame.native.js.map +1 -1
  123. package/dist/esm/Video/types.native.js.map +1 -1
  124. package/dist/esm/Wheel/index.native.js.map +1 -1
  125. package/dist/esm/Wizard/index.native.js.map +1 -1
  126. package/dist/esm/actions/ActionBar.native.js.map +1 -1
  127. package/dist/esm/actions/DestructiveAction.native.js.map +1 -1
  128. package/dist/esm/actions/devWarn.native.js.map +1 -1
  129. package/dist/esm/actions/index.native.js.map +1 -1
  130. package/dist/esm/actions/severity.native.js.map +1 -1
  131. package/dist/esm/charts/Axis.native.js.map +1 -1
  132. package/dist/esm/charts/BarChart.native.js.map +1 -1
  133. package/dist/esm/charts/ChartDataView.native.js.map +1 -1
  134. package/dist/esm/charts/ChartSurface.native.js.map +1 -1
  135. package/dist/esm/charts/LineChart.native.js.map +1 -1
  136. package/dist/esm/charts/PieChart.native.js.map +1 -1
  137. package/dist/esm/charts/Sparkline.native.js.map +1 -1
  138. package/dist/esm/charts/accessibility.native.js.map +1 -1
  139. package/dist/esm/charts/composeChart.native.js.map +1 -1
  140. package/dist/esm/charts/index.native.js.map +1 -1
  141. package/dist/esm/charts/math.native.js.map +1 -1
  142. package/dist/esm/charts/series.native.js.map +1 -1
  143. package/dist/esm/charts/svg.native.js.map +1 -1
  144. package/dist/esm/charts/types.native.js.map +1 -1
  145. package/dist/esm/charts/useChartTheme.native.js.map +1 -1
  146. package/dist/esm/code/Code/index.mjs +6 -0
  147. package/dist/esm/code/Code/index.mjs.map +1 -1
  148. package/dist/esm/code/Code/index.native.js +10 -7
  149. package/dist/esm/code/Code/index.native.js.map +1 -1
  150. package/dist/esm/code/CodeBlock/index.mjs +5 -6
  151. package/dist/esm/code/CodeBlock/index.mjs.map +1 -1
  152. package/dist/esm/code/CodeBlock/index.native.js +5 -6
  153. package/dist/esm/code/CodeBlock/index.native.js.map +1 -1
  154. package/dist/esm/code/HighlightedCode/index.native.js.map +1 -1
  155. package/dist/esm/code/Highlighter/index.native.js.map +1 -1
  156. package/dist/esm/code/Pre/index.native.js.map +1 -1
  157. package/dist/esm/code/index.native.js.map +1 -1
  158. package/dist/esm/componentColors.native.js.map +1 -1
  159. package/dist/esm/feedback/ConfirmDialog.native.js.map +1 -1
  160. package/dist/esm/feedback/NotifyHost.native.js.map +1 -1
  161. package/dist/esm/feedback/copy.native.js.map +1 -1
  162. package/dist/esm/feedback/index.native.js.map +1 -1
  163. package/dist/esm/feedback/notify.native.js.map +1 -1
  164. package/dist/esm/feedback/route.native.js.map +1 -1
  165. package/dist/esm/feedback/store.native.js.map +1 -1
  166. package/dist/esm/hooks/index.native.js.map +1 -1
  167. package/dist/esm/hooks/useClipboard.native.js.map +1 -1
  168. package/dist/esm/hooks/useDocumentTitle.native.js.map +1 -1
  169. package/dist/esm/icons/CheckRegular.native.js.map +1 -1
  170. package/dist/esm/icons/MinusRegular.native.js.map +1 -1
  171. package/dist/esm/icons/index.native.js.map +1 -1
  172. package/dist/esm/icons/lucide.native.js.map +1 -1
  173. package/dist/esm/icons/themed.mjs +3 -2
  174. package/dist/esm/icons/themed.mjs.map +1 -1
  175. package/dist/esm/icons/themed.native.js +3 -2
  176. package/dist/esm/icons/themed.native.js.map +1 -1
  177. package/dist/esm/images/Image/ImageFrame.native.js.map +1 -1
  178. package/dist/esm/images/Image/shared.native.js.map +1 -1
  179. package/dist/esm/images/Image/types.native.js.map +1 -1
  180. package/dist/esm/images/index.native.js.map +1 -1
  181. package/dist/esm/index.native.js.map +1 -1
  182. package/dist/esm/knobImmuneExports.mjs +3 -3
  183. package/dist/esm/knobImmuneExports.native.js +3 -3
  184. package/dist/esm/knobImmuneExports.native.js.map +1 -1
  185. package/dist/esm/layouts/AsyncBoundary.native.js.map +1 -1
  186. package/dist/esm/layouts/Debug/index.native.js.map +1 -1
  187. package/dist/esm/layouts/EmptyState.native.js.map +1 -1
  188. package/dist/esm/layouts/KeyboardAvoidingWrapper/behavior.native.js.map +1 -1
  189. package/dist/esm/layouts/PageTemplates.native.js.map +1 -1
  190. package/dist/esm/layouts/PaneScaffold.mjs +70 -42
  191. package/dist/esm/layouts/PaneScaffold.mjs.map +1 -1
  192. package/dist/esm/layouts/PaneScaffold.native.js +75 -48
  193. package/dist/esm/layouts/PaneScaffold.native.js.map +1 -1
  194. package/dist/esm/layouts/SafeAreaWrapper/insets.native.js.map +1 -1
  195. package/dist/esm/layouts/ViewSwitcher.native.js.map +1 -1
  196. package/dist/esm/layouts/attachments.native.js.map +1 -1
  197. package/dist/esm/layouts/breadcrumbs.native.js.map +1 -1
  198. package/dist/esm/layouts/index.native.js.map +1 -1
  199. package/dist/esm/layouts/page.mjs +3 -2
  200. package/dist/esm/layouts/page.mjs.map +1 -1
  201. package/dist/esm/layouts/page.native.js +3 -2
  202. package/dist/esm/layouts/page.native.js.map +1 -1
  203. package/dist/esm/layouts/pageHeadingScope.native.js.map +1 -1
  204. package/dist/esm/layouts/sidebar.mjs +2 -4
  205. package/dist/esm/layouts/sidebar.mjs.map +1 -1
  206. package/dist/esm/layouts/sidebar.native.js +2 -4
  207. package/dist/esm/layouts/sidebar.native.js.map +1 -1
  208. package/dist/esm/layouts/tags.native.js.map +1 -1
  209. package/dist/esm/layouts/timeline.native.js.map +1 -1
  210. package/dist/esm/layouts/toolbar.native.js.map +1 -1
  211. package/dist/esm/shared/actionScan.native.js.map +1 -1
  212. package/dist/esm/shared/i18n.native.js.map +1 -1
  213. package/dist/esm/shared/t.native.js.map +1 -1
  214. package/dist/esm/shared/textRidesText.native.js.map +1 -1
  215. package/dist/esm/shared/useReturnFocusOnClose.native.js.map +1 -1
  216. package/dist/esm/surfaces.mjs +1 -33
  217. package/dist/esm/surfaces.mjs.map +1 -1
  218. package/dist/esm/surfaces.native.js +1 -33
  219. package/dist/esm/surfaces.native.js.map +1 -1
  220. package/dist/esm/tamagui.native.js.map +1 -1
  221. package/dist/esm/testSetup.native.js.map +1 -1
  222. package/dist/esm/utils/setTinted.native.js.map +1 -1
  223. package/dist/esm/utils/unwrapText.native.js.map +1 -1
  224. package/dist/esm/views/Calendar.native.js.map +1 -1
  225. package/dist/esm/views/Dashboard.native.js.map +1 -1
  226. package/dist/esm/views/Gantt.native.js.map +1 -1
  227. package/dist/esm/views/ImageGrid.native.js.map +1 -1
  228. package/dist/esm/views/List.mjs +2 -4
  229. package/dist/esm/views/List.mjs.map +1 -1
  230. package/dist/esm/views/List.native.js +2 -4
  231. package/dist/esm/views/List.native.js.map +1 -1
  232. package/dist/esm/views/Matrix.mjs +543 -0
  233. package/dist/esm/views/Matrix.mjs.map +1 -0
  234. package/dist/esm/views/Matrix.native.js +573 -0
  235. package/dist/esm/views/Matrix.native.js.map +1 -0
  236. package/dist/esm/views/ReportBuilder.native.js.map +1 -1
  237. package/dist/esm/views/TreeView.native.js.map +1 -1
  238. package/dist/esm/views/calendarMath.native.js.map +1 -1
  239. package/dist/esm/views/ganttMath.mjs +1 -1
  240. package/dist/esm/views/ganttMath.mjs.map +1 -1
  241. package/dist/esm/views/ganttMath.native.js +1 -1
  242. package/dist/esm/views/ganttMath.native.js.map +1 -1
  243. package/dist/esm/views/index.mjs +4 -2
  244. package/dist/esm/views/index.mjs.map +1 -1
  245. package/dist/esm/views/index.native.js +4 -2
  246. package/dist/esm/views/index.native.js.map +1 -1
  247. package/dist/esm/views/kanbanDnd.native.js.map +1 -1
  248. package/dist/esm/views/matrixMath.mjs +122 -0
  249. package/dist/esm/views/matrixMath.mjs.map +1 -0
  250. package/dist/esm/views/matrixMath.native.js +191 -0
  251. package/dist/esm/views/matrixMath.native.js.map +1 -0
  252. package/dist/esm/views/treeViewDnd.native.js.map +1 -1
  253. package/dist/esm/views/treeViewLayout.native.js.map +1 -1
  254. package/dist/esm/views/treeViewMotion.native.js.map +1 -1
  255. package/dist/esm/views/treeViewReveal.native.js.map +1 -1
  256. package/dist/jsx/Accordion/index.mjs +3 -7
  257. package/dist/jsx/Accordion/index.mjs.map +1 -1
  258. package/dist/jsx/Accordion/index.native.js +2 -6
  259. package/dist/jsx/Accordion/index.native.js.map +1 -1
  260. package/dist/jsx/AnimateHeight/index.mjs +2 -4
  261. package/dist/jsx/AnimateHeight/index.mjs.map +1 -1
  262. package/dist/jsx/AnimateHeight/index.native.js +1 -3
  263. package/dist/jsx/AnimateHeight/index.native.js.map +1 -1
  264. package/dist/jsx/Chip/index.mjs +9 -2
  265. package/dist/jsx/Chip/index.mjs.map +1 -1
  266. package/dist/jsx/Chip/index.native.js +8 -1
  267. package/dist/jsx/Chip/index.native.js.map +1 -1
  268. package/dist/jsx/SheetModal/index.native.js +70 -22
  269. package/dist/jsx/SheetModal/index.native.js.map +1 -1
  270. package/dist/jsx/Tabs/index.mjs +3 -7
  271. package/dist/jsx/Tabs/index.mjs.map +1 -1
  272. package/dist/jsx/Tabs/index.native.js +2 -6
  273. package/dist/jsx/Tabs/index.native.js.map +1 -1
  274. package/dist/jsx/Text.mjs +3 -1
  275. package/dist/jsx/Text.mjs.map +1 -1
  276. package/dist/jsx/Text.native.js +2 -0
  277. package/dist/jsx/Text.native.js.map +1 -1
  278. package/dist/jsx/TreeSelect/index.mjs +56 -53
  279. package/dist/jsx/TreeSelect/index.mjs.map +1 -1
  280. package/dist/jsx/TreeSelect/index.native.js +55 -52
  281. package/dist/jsx/TreeSelect/index.native.js.map +1 -1
  282. package/dist/jsx/Video/PlayerChrome.mjs +4 -10
  283. package/dist/jsx/Video/PlayerChrome.mjs.map +1 -1
  284. package/dist/jsx/Video/PlayerChrome.native.js +3 -9
  285. package/dist/jsx/Video/PlayerChrome.native.js.map +1 -1
  286. package/dist/jsx/code/Code/index.mjs +6 -0
  287. package/dist/jsx/code/Code/index.mjs.map +1 -1
  288. package/dist/jsx/code/Code/index.native.js +7 -4
  289. package/dist/jsx/code/Code/index.native.js.map +1 -1
  290. package/dist/jsx/code/CodeBlock/index.mjs +5 -6
  291. package/dist/jsx/code/CodeBlock/index.mjs.map +1 -1
  292. package/dist/jsx/code/CodeBlock/index.native.js +4 -5
  293. package/dist/jsx/code/CodeBlock/index.native.js.map +1 -1
  294. package/dist/jsx/icons/themed.mjs +3 -2
  295. package/dist/jsx/icons/themed.mjs.map +1 -1
  296. package/dist/jsx/icons/themed.native.js +2 -1
  297. package/dist/jsx/icons/themed.native.js.map +1 -1
  298. package/dist/jsx/knobImmuneExports.mjs +3 -3
  299. package/dist/jsx/knobImmuneExports.native.js +3 -3
  300. package/dist/jsx/layouts/PaneScaffold.mjs +70 -42
  301. package/dist/jsx/layouts/PaneScaffold.mjs.map +1 -1
  302. package/dist/jsx/layouts/PaneScaffold.native.js +75 -48
  303. package/dist/jsx/layouts/PaneScaffold.native.js.map +1 -1
  304. package/dist/jsx/layouts/page.mjs +3 -2
  305. package/dist/jsx/layouts/page.mjs.map +1 -1
  306. package/dist/jsx/layouts/page.native.js +2 -1
  307. package/dist/jsx/layouts/page.native.js.map +1 -1
  308. package/dist/jsx/layouts/sidebar.mjs +2 -4
  309. package/dist/jsx/layouts/sidebar.mjs.map +1 -1
  310. package/dist/jsx/layouts/sidebar.native.js +1 -3
  311. package/dist/jsx/layouts/sidebar.native.js.map +1 -1
  312. package/dist/jsx/surfaces.mjs +1 -33
  313. package/dist/jsx/surfaces.mjs.map +1 -1
  314. package/dist/jsx/surfaces.native.js +0 -32
  315. package/dist/jsx/surfaces.native.js.map +1 -1
  316. package/dist/jsx/views/List.mjs +2 -4
  317. package/dist/jsx/views/List.mjs.map +1 -1
  318. package/dist/jsx/views/List.native.js +1 -3
  319. package/dist/jsx/views/List.native.js.map +1 -1
  320. package/dist/jsx/views/Matrix.mjs +543 -0
  321. package/dist/jsx/views/Matrix.mjs.map +1 -0
  322. package/dist/jsx/views/Matrix.native.js +612 -0
  323. package/dist/jsx/views/Matrix.native.js.map +1 -0
  324. package/dist/jsx/views/ganttMath.mjs +1 -1
  325. package/dist/jsx/views/ganttMath.mjs.map +1 -1
  326. package/dist/jsx/views/ganttMath.native.js +2 -0
  327. package/dist/jsx/views/ganttMath.native.js.map +1 -1
  328. package/dist/jsx/views/index.mjs +4 -2
  329. package/dist/jsx/views/index.mjs.map +1 -1
  330. package/dist/jsx/views/index.native.js +16 -0
  331. package/dist/jsx/views/index.native.js.map +1 -1
  332. package/dist/jsx/views/matrixMath.mjs +122 -0
  333. package/dist/jsx/views/matrixMath.mjs.map +1 -0
  334. package/dist/jsx/views/matrixMath.native.js +229 -0
  335. package/dist/jsx/views/matrixMath.native.js.map +1 -0
  336. package/package.json +10 -10
  337. package/src/Accordion/Accordion.spec.tsx +20 -0
  338. package/src/Accordion/index.tsx +7 -3
  339. package/src/AnimateHeight/index.tsx +143 -142
  340. package/src/Chip/Chip.borderLadder.spec.tsx +54 -0
  341. package/src/Chip/Chip.pressSlop.spec.tsx +57 -0
  342. package/src/Chip/index.tsx +15 -1
  343. package/src/Heading.native.spec.tsx +1 -1
  344. package/src/Separator/index.tsx +3 -3
  345. package/src/SheetModal/SheetModal.detentLayout.spec.tsx +173 -0
  346. package/src/SheetModal/SheetModal.touch.spec.tsx +63 -0
  347. package/src/SheetModal/index.native.tsx +95 -17
  348. package/src/Tabs/Tabs.hydration.spec.tsx +123 -0
  349. package/src/Tabs/index.tsx +3 -2
  350. package/src/Text.spec.tsx +32 -2
  351. package/src/Text.tsx +7 -6
  352. package/src/Toast/Toast.spec.tsx +50 -0
  353. package/src/Tooltip/Tooltip.spec.tsx +55 -2
  354. package/src/TreeSelect/TreeSelect.spec.tsx +15 -15
  355. package/src/TreeSelect/index.tsx +53 -50
  356. package/src/Video/PlayerChrome.tsx +4 -3
  357. package/src/Wheel/Wheel.spec.tsx +4 -4
  358. package/src/adjacency.l1.spec.tsx +175 -0
  359. package/src/code/Code/code.spec.tsx +2 -19
  360. package/src/code/Code/index.tsx +0 -6
  361. package/src/code/CodeBlock/index.tsx +5 -3
  362. package/src/code/highlightedCode.spec.tsx +2 -2
  363. package/src/code/hostProps.spec.tsx +55 -0
  364. package/src/icons/themed.hydration.spec.tsx +60 -0
  365. package/src/icons/themed.tsx +3 -6
  366. package/src/knobImmuneExports.ts +3 -3
  367. package/src/layouts/PaneScaffold.spec.tsx +148 -2
  368. package/src/layouts/PaneScaffold.stories.tsx +33 -1
  369. package/src/layouts/PaneScaffold.tsx +101 -48
  370. package/src/layouts/page.designLaw.spec.tsx +20 -0
  371. package/src/layouts/page.tsx +2 -0
  372. package/src/layouts/sidebar.tsx +2 -3
  373. package/src/overlayElevation.spec.tsx +39 -51
  374. package/src/surfaces.spec.tsx +13 -10
  375. package/src/surfaces.tsx +4 -33
  376. package/src/tamagui.spec.ts +4 -3
  377. package/src/textAccentSecondary.spec.tsx +100 -2
  378. package/src/views/List.tsx +2 -1
  379. package/src/views/Matrix.spec.tsx +339 -0
  380. package/src/views/Matrix.stories.spec.tsx +68 -0
  381. package/src/views/Matrix.stories.tsx +153 -0
  382. package/src/views/Matrix.tsx +738 -0
  383. package/src/views/ganttMath.ts +4 -2
  384. package/src/views/index.ts +30 -0
  385. package/src/views/matrixMath.spec.ts +237 -0
  386. package/src/views/matrixMath.ts +251 -0
  387. package/src/views/views.spec.tsx +3 -1
  388. package/types/Accordion/index.d.ts.map +1 -1
  389. package/types/AnimateHeight/index.d.ts.map +1 -1
  390. package/types/Chip/index.d.ts.map +1 -1
  391. package/types/Separator/index.d.ts +3 -3
  392. package/types/SheetModal/index.native.d.ts.map +1 -1
  393. package/types/Tabs/index.d.ts.map +1 -1
  394. package/types/Text.d.ts.map +1 -1
  395. package/types/TreeSelect/index.d.ts.map +1 -1
  396. package/types/Video/PlayerChrome.d.ts.map +1 -1
  397. package/types/code/Code/index.d.ts.map +1 -1
  398. package/types/code/CodeBlock/index.d.ts.map +1 -1
  399. package/types/icons/themed.d.ts.map +1 -1
  400. package/types/layouts/PaneScaffold.d.ts +14 -1
  401. package/types/layouts/PaneScaffold.d.ts.map +1 -1
  402. package/types/layouts/page.d.ts.map +1 -1
  403. package/types/layouts/sidebar.d.ts.map +1 -1
  404. package/types/surfaces.d.ts.map +1 -1
  405. package/types/views/List.d.ts.map +1 -1
  406. package/types/views/Matrix.d.ts +102 -0
  407. package/types/views/Matrix.d.ts.map +1 -0
  408. package/types/views/ganttMath.d.ts +4 -0
  409. package/types/views/ganttMath.d.ts.map +1 -1
  410. package/types/views/index.d.ts +3 -1
  411. package/types/views/index.d.ts.map +1 -1
  412. package/types/views/matrixMath.d.ts +114 -0
  413. package/types/views/matrixMath.d.ts.map +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"names":["__defProp","Object","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toCommonJS","mod","value","matrixMath_exports","alignMatrixRange","bucketName","bucketStart","computeMatrixRange","generateBuckets","localDateKey","matrixCellIntensity","matrixCellKey","matrixMaxValue","nextBucketStart","summarizeMatrixCells","module","exports","import_theme","require","import_ganttMath","date","y","getFullYear","m","String","getMonth","padStart","d","getDate","rule","firstDayOfWeek","arguments","length","startOfDay","startOfWeek","startOfMonth","start","addDays","Date","range","lastIncluded","end","lastDay","getTime","dates","today","min","max","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","Symbol","iterator","_step","next","done","err","return","lo","hi","formatAbsoluteDate","year","formatMonthYear","aligned","majors","generateTicks","filter","tick","major","map","index","_ref","_tick_label"],"sources":["../../../src/views/matrixMath.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@multiplatform.one/components",
3
- "version": "7.11.0",
3
+ "version": "7.15.0",
4
4
  "description": "multiplatform.one ui components",
5
5
  "keywords": [
6
6
  "components",
@@ -15,7 +15,7 @@
15
15
  "license": "Apache-2.0",
16
16
  "repository": {
17
17
  "type": "git",
18
- "url": "git+https://gitlab.com/bitspur/frappe/multiplatform.one.git",
18
+ "url": "git+https://git.corp.bitspur.com/multiplatform.one/mpo.git",
19
19
  "directory": "public/components"
20
20
  },
21
21
  "source": "src/index.ts",
@@ -57,11 +57,11 @@
57
57
  },
58
58
  "dependencies": {
59
59
  "@floating-ui/react": "^0.27.19",
60
- "@multiplatform.one/forms": "7.11.0",
61
- "@multiplatform.one/i18n": "7.11.0",
62
- "@multiplatform.one/platform": "7.11.0",
63
- "@multiplatform.one/router": "7.11.0",
64
- "@multiplatform.one/theme": "7.11.0",
60
+ "@multiplatform.one/forms": "7.15.0",
61
+ "@multiplatform.one/i18n": "7.15.0",
62
+ "@multiplatform.one/platform": "7.15.0",
63
+ "@multiplatform.one/router": "7.15.0",
64
+ "@multiplatform.one/theme": "7.15.0",
65
65
  "@phosphor-icons/react": "^2.1.10",
66
66
  "@shopify/flash-list": "^2.3.1",
67
67
  "@tamagui/core": "2.7.6",
@@ -84,9 +84,9 @@
84
84
  "tamagui": "2.7.6"
85
85
  },
86
86
  "devDependencies": {
87
- "@multiplatform.one/config": "7.11.0",
88
- "@multiplatform.one/storybook": "7.11.0",
89
- "@multiplatform.one/test-utils": "7.11.0",
87
+ "@multiplatform.one/config": "7.15.0",
88
+ "@multiplatform.one/storybook": "7.15.0",
89
+ "@multiplatform.one/test-utils": "7.15.0",
90
90
  "@tamagui/build": "2.7.6",
91
91
  "@testing-library/jest-dom": "^6.9.1",
92
92
  "@testing-library/react": "^16.3.2",
@@ -245,4 +245,24 @@ describe("Accordion density — pad and gap move, control height holds (LC-76)",
245
245
  expect(atoms(compactTrigger, gap)).not.toEqual(comfortableMeasure.gap);
246
246
  expect(atoms(compactTrigger, height)).toEqual(comfortableMeasure.height);
247
247
  });
248
+ it("survives the animation knob flipping live from none to bouncy (MPO-327)", () => {
249
+ const Flip = ({ animation }: { animation: "none" | "bouncy" }) => (
250
+ <Preset overrides={{ animation }}>
251
+ <Accordion defaultValue="a">
252
+ <Accordion.Item value="a">
253
+ <Accordion.Trigger>Section A</Accordion.Trigger>
254
+ <Accordion.Content>
255
+ <Text>Content A</Text>
256
+ </Accordion.Content>
257
+ </Accordion.Item>
258
+ </Accordion>
259
+ </Preset>
260
+ );
261
+ const { container, rerender } = renderWithProviders(<Flip animation="none" />);
262
+ expect(container.textContent).toContain("Content A");
263
+
264
+ expect(() => rerender(<Flip animation="bouncy" />)).not.toThrow();
265
+ expect(container.textContent).toContain("Content A");
266
+ expect(getTriggers(container)[0].getAttribute("aria-expanded")).toBe("true");
267
+ });
248
268
  });
@@ -15,6 +15,7 @@ import {
15
15
  useResolvedKnobs,
16
16
  wasKeyboardFocus,
17
17
  type GroupPosition,
18
+ transitionProps,
18
19
  } from "@multiplatform.one/theme";
19
20
  import type { ReactNode } from "react";
20
21
  import {
@@ -254,7 +255,7 @@ function Chevron({
254
255
  rotate={open ? "180deg" : "0deg"}
255
256
  aria-hidden
256
257
  pointerEvents="none"
257
- {...(transition ? { transition } : {})}
258
+ {...transitionProps(transition)}
258
259
  >
259
260
  <ThemedCaretDown color={color} size={size} />
260
261
  </View>
@@ -550,13 +551,16 @@ const AccordionTrigger = forwardRef<TamaguiElement, AccordionTriggerProps>(
550
551
  },
551
552
  }
552
553
  : { onFocus, onBlur })}
553
- {...(knobProps.transition ? { transition: knobProps.transition } : {})}
554
+ {...transitionProps(knobProps.transition)}
554
555
  {...props}
555
556
  >
556
557
  <Chevron
557
558
  open={item.open}
558
559
  size={chevronPx}
559
- color={(item.disabled ? disabledState.textKnobProps.color : knobProps.textAccentColor) ?? knobProps.textAccentColor}
560
+ color={
561
+ (item.disabled ? disabledState.textKnobProps.color : knobProps.textAccentColor) ??
562
+ knobProps.textAccentColor
563
+ }
560
564
  transition={knobProps.transition}
561
565
  />
562
566
  {icon ? (
@@ -1,5 +1,5 @@
1
1
  import { isWeb } from "@multiplatform.one/platform";
2
- import { useResolvedKnobs } from "@multiplatform.one/theme";
2
+ import { transitionProps, useResolvedKnobs } from "@multiplatform.one/theme";
3
3
  import type { ReactNode } from "react";
4
4
  import { forwardRef, useCallback, useEffect, useLayoutEffect, useRef, useState } from "react";
5
5
  import type { LayoutChangeEvent } from "react-native";
@@ -77,163 +77,164 @@ export function settleMs(transition: TransitionProp | undefined): number {
77
77
  return (ms ?? 600) + 80;
78
78
  }
79
79
 
80
- const WebAnimateHeight = forwardRef<TamaguiElement, AnimateHeightProps>(
81
- function AnimateHeight({ open, children, transition: transitionProp, ...props }, ref) {
82
- const { knobProps } = useResolvedKnobs();
83
- // knob transition is undefined under reduced motion / animation="none"
84
- const transition = transitionProp ?? knobProps.transition;
85
- const collapsible = open !== undefined;
80
+ const WebAnimateHeight = forwardRef<TamaguiElement, AnimateHeightProps>(function AnimateHeight(
81
+ { open, children, transition: transitionProp, ...props },
82
+ ref,
83
+ ) {
84
+ const { knobProps } = useResolvedKnobs();
85
+ // knob transition is undefined under reduced motion / animation="none"
86
+ const transition = transitionProp ?? knobProps.transition;
87
+ const collapsible = open !== undefined;
86
88
 
87
- // null = natural (auto) height: initial open/follower render before the
88
- // first measurement, so there is never a flash of collapsed content.
89
- const [displayHeight, setDisplayHeight] = useState<number | null>(
90
- collapsible && !open ? 0 : null,
91
- );
92
- // Children stay mounted through the exit tween, then unmount at rest.
93
- const [exiting, setExiting] = useState(false);
94
- const [prevOpen, setPrevOpen] = useState(open);
89
+ // null = natural (auto) height: initial open/follower render before the
90
+ // first measurement, so there is never a flash of collapsed content.
91
+ const [displayHeight, setDisplayHeight] = useState<number | null>(
92
+ collapsible && !open ? 0 : null,
93
+ );
94
+ // Children stay mounted through the exit tween, then unmount at rest.
95
+ const [exiting, setExiting] = useState(false);
96
+ const [prevOpen, setPrevOpen] = useState(open);
95
97
 
96
- const measuredRef = useRef<number | null>(null);
97
- // Set on closed → open: hold height 0 until the first measurement so the
98
- // expand tweens 0 → px instead of snapping to auto.
99
- const openingRef = useRef(false);
100
- const unmountTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
101
- const rafRef = useRef<number | null>(null);
102
- const innerRef = useRef<TamaguiElement | null>(null);
98
+ const measuredRef = useRef<number | null>(null);
99
+ // Set on closed → open: hold height 0 until the first measurement so the
100
+ // expand tweens 0 → px instead of snapping to auto.
101
+ const openingRef = useRef(false);
102
+ const unmountTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
103
+ const rafRef = useRef<number | null>(null);
104
+ const innerRef = useRef<TamaguiElement | null>(null);
103
105
 
104
- // Adjust state during render (React's usePrevious pattern) so children
105
- // mount in the SAME commit `open` flips true, and stay mounted for the
106
- // exit tween when it flips false.
107
- if (collapsible && open !== prevOpen) {
108
- setPrevOpen(open);
109
- if (open) {
110
- // Hold at 0 until measurement only when children were unmounted (at
111
- // rest). Re-opening mid-exit keeps the existing measurement — the
112
- // observer will not re-fire for unchanged content — so the effect
113
- // below retargets it directly and the tween reverses in place.
114
- openingRef.current = !exiting;
115
- if (exiting) setExiting(false);
116
- } else {
117
- openingRef.current = false;
118
- setExiting(true);
119
- }
106
+ // Adjust state during render (React's usePrevious pattern) so children
107
+ // mount in the SAME commit `open` flips true, and stay mounted for the
108
+ // exit tween when it flips false.
109
+ if (collapsible && open !== prevOpen) {
110
+ setPrevOpen(open);
111
+ if (open) {
112
+ // Hold at 0 until measurement only when children were unmounted (at
113
+ // rest). Re-opening mid-exit keeps the existing measurement — the
114
+ // observer will not re-fire for unchanged content — so the effect
115
+ // below retargets it directly and the tween reverses in place.
116
+ openingRef.current = !exiting;
117
+ if (exiting) setExiting(false);
118
+ } else {
119
+ openingRef.current = false;
120
+ setExiting(true);
120
121
  }
122
+ }
121
123
 
122
- const shouldRenderChildren = !collapsible || open || exiting;
123
- const atRestClosed = collapsible && !open && !exiting;
124
+ const shouldRenderChildren = !collapsible || open || exiting;
125
+ const atRestClosed = collapsible && !open && !exiting;
124
126
 
125
- const clearPending = useCallback(() => {
126
- if (unmountTimerRef.current != null) {
127
- clearTimeout(unmountTimerRef.current);
128
- unmountTimerRef.current = null;
129
- }
130
- if (rafRef.current != null && typeof cancelAnimationFrame === "function") {
131
- cancelAnimationFrame(rafRef.current);
132
- rafRef.current = null;
133
- }
134
- }, []);
127
+ const clearPending = useCallback(() => {
128
+ if (unmountTimerRef.current != null) {
129
+ clearTimeout(unmountTimerRef.current);
130
+ unmountTimerRef.current = null;
131
+ }
132
+ if (rafRef.current != null && typeof cancelAnimationFrame === "function") {
133
+ cancelAnimationFrame(rafRef.current);
134
+ rafRef.current = null;
135
+ }
136
+ }, []);
135
137
 
136
- const handleMeasured = useCallback(
137
- (height: number) => {
138
- measuredRef.current = height;
139
- // Closing (or closed): the target stays 0 — ignore content measures.
140
- if (collapsible && !open) return;
141
- if (openingRef.current) {
142
- openingRef.current = false;
143
- // Double rAF: guarantee the browser paints the height-0 frame
144
- // before the target lands, or the 0 → px tween never runs.
138
+ const handleMeasured = useCallback(
139
+ (height: number) => {
140
+ measuredRef.current = height;
141
+ // Closing (or closed): the target stays 0 — ignore content measures.
142
+ if (collapsible && !open) return;
143
+ if (openingRef.current) {
144
+ openingRef.current = false;
145
+ // Double rAF: guarantee the browser paints the height-0 frame
146
+ // before the target lands, or the 0 → px tween never runs.
147
+ rafRef.current = requestAnimationFrame(() => {
145
148
  rafRef.current = requestAnimationFrame(() => {
146
- rafRef.current = requestAnimationFrame(() => {
147
- rafRef.current = null;
148
- setDisplayHeight(height);
149
- });
149
+ rafRef.current = null;
150
+ setDisplayHeight(height);
150
151
  });
151
- return;
152
- }
153
- setDisplayHeight(height);
154
- },
155
- [collapsible, open],
156
- );
157
- const handleMeasuredRef = useRef(handleMeasured);
158
- handleMeasuredRef.current = handleMeasured;
159
- const transitionRef = useRef(transition);
160
- transitionRef.current = transition;
152
+ });
153
+ return;
154
+ }
155
+ setDisplayHeight(height);
156
+ },
157
+ [collapsible, open],
158
+ );
159
+ const handleMeasuredRef = useRef(handleMeasured);
160
+ handleMeasuredRef.current = handleMeasured;
161
+ const transitionRef = useRef(transition);
162
+ transitionRef.current = transition;
161
163
 
162
- // Web: ResizeObserver on the content wrapper — fires on observe (initial
163
- // measure) and on any intrinsic size change while mounted.
164
- useLayoutEffect(() => {
165
- if (!isWeb || !shouldRenderChildren) return;
166
- const node = innerRef.current as unknown as HTMLElement | null;
167
- if (!node || typeof ResizeObserver === "undefined") return;
168
- const observer = new ResizeObserver(() => {
169
- // getBoundingClientRect keeps fractional text heights exact.
170
- handleMeasuredRef.current(node.getBoundingClientRect().height);
171
- });
172
- observer.observe(node);
173
- return () => observer.disconnect();
174
- }, [shouldRenderChildren]);
164
+ // Web: ResizeObserver on the content wrapper — fires on observe (initial
165
+ // measure) and on any intrinsic size change while mounted.
166
+ useLayoutEffect(() => {
167
+ if (!isWeb || !shouldRenderChildren) return;
168
+ const node = innerRef.current as unknown as HTMLElement | null;
169
+ if (!node || typeof ResizeObserver === "undefined") return;
170
+ const observer = new ResizeObserver(() => {
171
+ // getBoundingClientRect keeps fractional text heights exact.
172
+ handleMeasuredRef.current(node.getBoundingClientRect().height);
173
+ });
174
+ observer.observe(node);
175
+ return () => observer.disconnect();
176
+ }, [shouldRenderChildren]);
175
177
 
176
- // Native: onLayout on the content wrapper is the measurement source.
177
- const onInnerLayout = useCallback((event: LayoutChangeEvent) => {
178
- handleMeasuredRef.current(event.nativeEvent.layout.height);
179
- }, []);
178
+ // Native: onLayout on the content wrapper is the measurement source.
179
+ const onInnerLayout = useCallback((event: LayoutChangeEvent) => {
180
+ handleMeasuredRef.current(event.nativeEvent.layout.height);
181
+ }, []);
180
182
 
181
- // Drive the open/close targets after commit.
182
- useEffect(() => {
183
- if (!collapsible) return;
184
- clearPending();
185
- if (open) {
186
- // Opening from closed holds 0 until measurement (openingRef); if a
187
- // measurement already exists (close interrupted mid-tween), retarget
188
- // it immediately so the tween reverses from wherever it is.
189
- if (!openingRef.current && measuredRef.current != null) {
190
- setDisplayHeight(measuredRef.current);
191
- }
192
- return;
183
+ // Drive the open/close targets after commit.
184
+ useEffect(() => {
185
+ if (!collapsible) return;
186
+ clearPending();
187
+ if (open) {
188
+ // Opening from closed holds 0 until measurement (openingRef); if a
189
+ // measurement already exists (close interrupted mid-tween), retarget
190
+ // it immediately so the tween reverses from wherever it is.
191
+ if (!openingRef.current && measuredRef.current != null) {
192
+ setDisplayHeight(measuredRef.current);
193
193
  }
194
- // Closing: tween px → 0, then unmount at rest. When nothing can tween
195
- // (no transition token — reduced motion — or no real measurement, as in
196
- // non-layout test environments), finalize immediately. The transition is
197
- // read through a ref at close time only — mid-tween knob changes should
198
- // not restart the exit timer.
199
- setDisplayHeight(0);
200
- const closeTransition = transitionRef.current;
201
- const canTween = Boolean(closeTransition) && (measuredRef.current ?? 0) > 0;
202
- if (canTween) {
203
- unmountTimerRef.current = setTimeout(() => {
204
- unmountTimerRef.current = null;
205
- setExiting(false);
206
- }, settleMs(closeTransition));
207
- } else {
194
+ return;
195
+ }
196
+ // Closing: tween px → 0, then unmount at rest. When nothing can tween
197
+ // (no transition token — reduced motion — or no real measurement, as in
198
+ // non-layout test environments), finalize immediately. The transition is
199
+ // read through a ref at close time only — mid-tween knob changes should
200
+ // not restart the exit timer.
201
+ setDisplayHeight(0);
202
+ const closeTransition = transitionRef.current;
203
+ const canTween = Boolean(closeTransition) && (measuredRef.current ?? 0) > 0;
204
+ if (canTween) {
205
+ unmountTimerRef.current = setTimeout(() => {
206
+ unmountTimerRef.current = null;
208
207
  setExiting(false);
209
- }
210
- }, [collapsible, open, clearPending]);
208
+ }, settleMs(closeTransition));
209
+ } else {
210
+ setExiting(false);
211
+ }
212
+ }, [collapsible, open, clearPending]);
211
213
 
212
- useEffect(() => clearPending, [clearPending]);
214
+ useEffect(() => clearPending, [clearPending]);
213
215
 
214
- return (
215
- <View
216
- ref={ref}
217
- overflow="hidden"
218
- {...(displayHeight != null ? { height: displayHeight } : {})}
219
- {...(atRestClosed ? { display: "none" as const } : {})}
220
- {...(transition ? { transition } : {})}
221
- {...props}
222
- >
223
- {shouldRenderChildren ? (
224
- <View
225
- ref={innerRef}
226
- // keep natural height inside the clipped, height-driven outer
227
- flexShrink={0}
228
- {...(!isWeb ? { onLayout: onInnerLayout } : {})}
229
- >
230
- {children}
231
- </View>
232
- ) : null}
233
- </View>
234
- );
235
- },
236
- );
216
+ return (
217
+ <View
218
+ ref={ref}
219
+ overflow="hidden"
220
+ {...(displayHeight != null ? { height: displayHeight } : {})}
221
+ {...(atRestClosed ? { display: "none" as const } : {})}
222
+ {...transitionProps(transition)}
223
+ {...props}
224
+ >
225
+ {shouldRenderChildren ? (
226
+ <View
227
+ ref={innerRef}
228
+ // keep natural height inside the clipped, height-driven outer
229
+ flexShrink={0}
230
+ {...(!isWeb ? { onLayout: onInnerLayout } : {})}
231
+ >
232
+ {children}
233
+ </View>
234
+ ) : null}
235
+ </View>
236
+ );
237
+ });
237
238
 
238
239
  /** Native layout has no height tween, so measurement must not gate visibility. */
239
240
  const NativeAnimateHeight = forwardRef<TamaguiElement, AnimateHeightProps>(
@@ -0,0 +1,54 @@
1
+ /**
2
+ * MPO-134: the story-backed Chip (`Components/Chip`) spreads the resolver's
3
+ * borderWidth as-is. knob-laws used to describe the frame as an ignore pinned
4
+ * at 1, and the sweep measured 1 / 1 / 1 / 2 while a local `Math.max(…, 1)`
5
+ * floor was in place; that floor went with 5056bce23, so the real ladder is
6
+ * the resolver's, and the box moves with it. This pins the declared edge at
7
+ * every stop so the doc row cannot drift from the component again.
8
+ *
9
+ * Assertions read the atomic border-width class the FRAME emits.
10
+ */
11
+
12
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
13
+ import { Preset } from "@multiplatform.one/theme";
14
+ import { cleanup } from "@testing-library/react";
15
+ import { afterEach, describe, expect, it } from "vitest";
16
+ import { Chip } from "./index";
17
+
18
+ afterEach(cleanup);
19
+
20
+ const STOPS = ["none", "small", "medium", "large"] as const;
21
+
22
+ function renderAt(stop: (typeof STOPS)[number], outlined = false): string[] {
23
+ const result = renderWithProviders(
24
+ <Preset overrides={{ fillStyle: outlined ? "outlined" : "filled", borderWidth: stop }}>
25
+ <Chip variant="outlined" onPress={() => {}}>
26
+ Fire
27
+ </Chip>
28
+ </Preset>,
29
+ );
30
+ const frame = result.container.querySelector("[data-chip]") as HTMLElement;
31
+ const atoms = String(frame.className || "")
32
+ .split(/\s+/)
33
+ .filter((c) => c.startsWith("_btw-"))
34
+ .sort();
35
+ cleanup();
36
+ return atoms;
37
+ }
38
+
39
+ describe("Chip borderWidth ladder (MPO-134)", () => {
40
+ it("the frame honours the resolver's edge: 0 / 0.5 / 1 / 2", () => {
41
+ expect(renderAt("none")).toEqual(["_btw-0px"]);
42
+ expect(renderAt("small")).toEqual(["_btw-0--5px"]);
43
+ expect(renderAt("medium")).toEqual(["_btw-1px"]);
44
+ expect(renderAt("large")).toEqual(["_btw-2px"]);
45
+ });
46
+
47
+ it("medium and large differ, so the chip box moves with the stop", () => {
48
+ expect(renderAt("medium")).not.toEqual(renderAt("large"));
49
+ });
50
+
51
+ it("none under fillStyle:outlined is the resolver's hairline, not a local floor", () => {
52
+ expect(renderAt("none", true)).toEqual(["_btw-0--5px"]);
53
+ });
54
+ });
@@ -0,0 +1,57 @@
1
+ /**
2
+ * MPO-134 K12: the pressable Chip body takes the press-slop channel on the
3
+ * vertical axis only, pitch-limited so a wrapped chip row's target never
4
+ * reaches the next row's (LC-54). Rows wrap at `$2` = 7px, so each row may
5
+ * reach 3px past its painted box; the channel's pseudo-element sits on the
6
+ * padding box, so the outset carries the frame's border width on top.
7
+ */
8
+
9
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
10
+ import { Preset } from "@multiplatform.one/theme";
11
+ import { cleanup } from "@testing-library/react";
12
+ import { afterEach, describe, expect, it } from "vitest";
13
+ import { Chip } from "./index";
14
+
15
+ afterEach(cleanup);
16
+
17
+ type Stop = "none" | "small" | "medium" | "large";
18
+
19
+ function frameAt(
20
+ borderWidth: Stop,
21
+ props: { onPress?: () => void; disabled?: boolean } = { onPress: () => {} },
22
+ ) {
23
+ const result = renderWithProviders(
24
+ <Preset overrides={{ borderWidth }}>
25
+ <Chip variant="outlined" {...props}>
26
+ Fire
27
+ </Chip>
28
+ </Preset>,
29
+ );
30
+ return result.container.querySelector("[data-chip]") as HTMLElement;
31
+ }
32
+
33
+ describe("Chip pressable body slop (MPO-134, K12)", () => {
34
+ it("reaches half the chip-row gap past the painted box, vertically only", () => {
35
+ const frame = frameAt("none");
36
+ expect(frame.getAttribute("role")).toBe("button");
37
+ expect(frame.getAttribute("data-mp-press-slop")).toBe("3");
38
+ expect(frame.getAttribute("data-mp-press-axis")).toBe("vertical");
39
+ });
40
+
41
+ it("adds the frame's border back, so the reach past the box is the same at every stop", () => {
42
+ expect(frameAt("small").getAttribute("data-mp-press-slop")).toBe("4");
43
+ expect(frameAt("medium").getAttribute("data-mp-press-slop")).toBe("4");
44
+ expect(frameAt("large").getAttribute("data-mp-press-slop")).toBe("5");
45
+ });
46
+
47
+ it("a chip with no press handler has no target, so no slop", () => {
48
+ const frame = frameAt("medium", {});
49
+ expect(frame.getAttribute("role")).toBeNull();
50
+ expect(frame.getAttribute("data-mp-press-slop")).toBeNull();
51
+ });
52
+
53
+ it("a disabled chip gates its target and drops the slop", () => {
54
+ const frame = frameAt("medium", { onPress: () => {}, disabled: true });
55
+ expect(frame.getAttribute("data-mp-press-slop")).toBeNull();
56
+ });
57
+ });
@@ -1,3 +1,4 @@
1
+ import { pressSlopOutsetProps } from "@multiplatform.one/forms";
1
2
  import { isWeb } from "@multiplatform.one/platform";
2
3
  import {
3
4
  MIN_PRESS_TARGET,
@@ -20,7 +21,7 @@ import {
20
21
  } from "react";
21
22
  import { useTranslation } from "react-i18next";
22
23
  import type { ColorTokens, GetProps } from "tamagui";
23
- import { Text, View, styled } from "tamagui";
24
+ import { Text, View, getTokenValue, styled } from "tamagui";
24
25
 
25
26
  // ── Types ─────────────────────────────────────────────────────
26
27
 
@@ -290,6 +291,18 @@ const DismissRing = styled(View, {
290
291
  },
291
292
  });
292
293
 
294
+ // K12 (LC-54 pitch-limited): wrapped chip rows sit `$2` apart, so each row's
295
+ // press target may reach half that gap before it meets the next row's. The
296
+ // outset stops there rather than at 44; no chip size paints tall enough for
297
+ // the half-gap to overshoot the floor. The slop pseudo-element is placed from
298
+ // the padding box, so the frame's own border width is added back.
299
+ const CHIP_ROW_GAP = "$2";
300
+
301
+ function chipBodySlop(borderWidth: number): number {
302
+ const gap = getTokenValue(CHIP_ROW_GAP as Parameters<typeof getTokenValue>[0], "space");
303
+ return typeof gap === "number" ? Math.floor(gap / 2) + Math.ceil(borderWidth) : 0;
304
+ }
305
+
293
306
  function normalizeIcon(icon: ReactNode, size: number): ReactNode {
294
307
  if (icon == null || icon === false) return null;
295
308
  if (isValidElement(icon)) {
@@ -407,6 +420,7 @@ export function Chip({
407
420
  role: "button",
408
421
  tabIndex: 0,
409
422
  ...(selected != null ? { "aria-pressed": isSelected } : undefined),
423
+ ...pressSlopOutsetProps(chipBodySlop(knobProps.borderRadius.borderWidth), "vertical"),
410
424
  }
411
425
  : undefined)}
412
426
  {...(disabled
@@ -24,7 +24,7 @@
24
24
  * rescue is mounted in NEITHER arm; the props channel is the only channel
25
25
  * carrying the knob here, which is the channel native has. It does NOT
26
26
  * execute the React Native renderer — it is the standing substitute for a
27
- * simulator capture (`agent-os/standards/testing/falsifiability.md`), not a
27
+ * simulator capture (`docs/standards/testing/falsifiability.md`), not a
28
28
  * replacement for one.
29
29
  */
30
30
  import { cleanup, screen } from "@testing-library/react";
@@ -39,9 +39,9 @@
39
39
  * specificity `flex: 1` can turn the rule into a viewport-dependent gap
40
40
  * (the raw primitive was a `flex: 1` item, exactly that defect).
41
41
  *
42
- * Knob story: no knob channel maps to a 1px rule today. Separator WEIGHT is
43
- * an ADJUDICATION-CANDIDATE (MPO-21 G10, G0-clay R9) — until adjudicated the
44
- * thickness is the measured constant, and consumer `{...props}` stay the
42
+ * Knob story: no knob channel maps to a 1px rule, and none will. Clay ruled
43
+ * MPO-21 G10-A on 2026-09-26: there is no separator-weight knob, the rule is
44
+ * 1px and the quiet rule is opacity 0.5. Consumer `{...props}` stay the
45
45
  * explicit eject (STD-EJECT-LAST).
46
46
  */
47
47
  import type { GetProps } from "tamagui";