@multiplatform.one/components 7.8.0 → 7.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (452) hide show
  1. package/README.md +98 -0
  2. package/dist/cjs/Accordion/index.cjs +3 -3
  3. package/dist/cjs/Accordion/index.native.js +4 -4
  4. package/dist/cjs/Accordion/index.native.js.map +1 -1
  5. package/dist/cjs/Chip/index.cjs +1 -1
  6. package/dist/cjs/Chip/index.native.js +1 -1
  7. package/dist/cjs/Chip/index.native.js.map +1 -1
  8. package/dist/cjs/ContextMenu/index.cjs +3 -3
  9. package/dist/cjs/ContextMenu/index.native.js +3 -3
  10. package/dist/cjs/ContextMenu/index.native.js.map +1 -1
  11. package/dist/cjs/DropdownMenu/index.cjs +3 -3
  12. package/dist/cjs/DropdownMenu/index.native.js +3 -3
  13. package/dist/cjs/DropdownMenu/index.native.js.map +1 -1
  14. package/dist/cjs/Meter/index.cjs +3 -2
  15. package/dist/cjs/Meter/index.native.js +3 -2
  16. package/dist/cjs/Meter/index.native.js.map +1 -1
  17. package/dist/cjs/Meter/meter.cjs +1 -2
  18. package/dist/cjs/Meter/meter.native.js +1 -2
  19. package/dist/cjs/Meter/meter.native.js.map +1 -1
  20. package/dist/cjs/Pagination.cjs +2 -2
  21. package/dist/cjs/Pagination.native.js +2 -2
  22. package/dist/cjs/Pagination.native.js.map +1 -1
  23. package/dist/cjs/ProgressSteps/index.cjs +3 -3
  24. package/dist/cjs/ProgressSteps/index.native.js +3 -3
  25. package/dist/cjs/ProgressSteps/index.native.js.map +1 -1
  26. package/dist/cjs/Quote/index.cjs +1 -2
  27. package/dist/cjs/Quote/index.native.js +1 -2
  28. package/dist/cjs/Quote/index.native.js.map +1 -1
  29. package/dist/cjs/SheetModal/index.cjs +22 -3
  30. package/dist/cjs/SheetModal/index.native.js +50 -10
  31. package/dist/cjs/SheetModal/index.native.js.map +1 -1
  32. package/dist/cjs/Tabs/index.cjs +34 -13
  33. package/dist/cjs/Tabs/index.native.js +38 -13
  34. package/dist/cjs/Tabs/index.native.js.map +1 -1
  35. package/dist/cjs/Toast/index.cjs +4 -5
  36. package/dist/cjs/Toast/index.native.js +4 -5
  37. package/dist/cjs/Toast/index.native.js.map +1 -1
  38. package/dist/cjs/TreeSelect/index.cjs +46 -7
  39. package/dist/cjs/TreeSelect/index.native.js +58 -7
  40. package/dist/cjs/TreeSelect/index.native.js.map +1 -1
  41. package/dist/cjs/charts/PieChart.cjs +1 -2
  42. package/dist/cjs/charts/PieChart.native.js +1 -2
  43. package/dist/cjs/charts/PieChart.native.js.map +1 -1
  44. package/dist/cjs/code/HighlightedCode/index.cjs +1 -1
  45. package/dist/cjs/code/HighlightedCode/index.native.js +1 -1
  46. package/dist/cjs/code/HighlightedCode/index.native.js.map +1 -1
  47. package/dist/cjs/componentColors.cjs +6 -4
  48. package/dist/cjs/componentColors.native.js +6 -4
  49. package/dist/cjs/componentColors.native.js.map +1 -1
  50. package/dist/cjs/images/Image/ImageFrame.cjs +4 -2
  51. package/dist/cjs/images/Image/ImageFrame.native.js +4 -2
  52. package/dist/cjs/images/Image/ImageFrame.native.js.map +1 -1
  53. package/dist/cjs/layouts/AsyncBoundary.cjs +1 -2
  54. package/dist/cjs/layouts/AsyncBoundary.native.js +1 -2
  55. package/dist/cjs/layouts/AsyncBoundary.native.js.map +1 -1
  56. package/dist/cjs/layouts/EmptyState.cjs +6 -2
  57. package/dist/cjs/layouts/EmptyState.native.js +10 -6
  58. package/dist/cjs/layouts/EmptyState.native.js.map +1 -1
  59. package/dist/cjs/layouts/attachments.cjs +4 -4
  60. package/dist/cjs/layouts/attachments.native.js +4 -4
  61. package/dist/cjs/layouts/attachments.native.js.map +1 -1
  62. package/dist/cjs/layouts/breadcrumbs.cjs +1 -2
  63. package/dist/cjs/layouts/breadcrumbs.native.js +1 -2
  64. package/dist/cjs/layouts/breadcrumbs.native.js.map +1 -1
  65. package/dist/cjs/layouts/page.cjs +2 -2
  66. package/dist/cjs/layouts/page.native.js +2 -2
  67. package/dist/cjs/layouts/page.native.js.map +1 -1
  68. package/dist/cjs/layouts/sidebar.cjs +2 -2
  69. package/dist/cjs/layouts/sidebar.native.js +2 -2
  70. package/dist/cjs/layouts/sidebar.native.js.map +1 -1
  71. package/dist/cjs/layouts/tags.cjs +6 -7
  72. package/dist/cjs/layouts/tags.native.js +6 -9
  73. package/dist/cjs/layouts/tags.native.js.map +1 -1
  74. package/dist/cjs/layouts/timeline.cjs +5 -5
  75. package/dist/cjs/layouts/timeline.native.js +5 -5
  76. package/dist/cjs/layouts/timeline.native.js.map +1 -1
  77. package/dist/cjs/surfaces.cjs +1 -0
  78. package/dist/cjs/surfaces.native.js +1 -0
  79. package/dist/cjs/surfaces.native.js.map +1 -1
  80. package/dist/cjs/views/Calendar.cjs +11 -8
  81. package/dist/cjs/views/Calendar.native.js +11 -8
  82. package/dist/cjs/views/Calendar.native.js.map +1 -1
  83. package/dist/cjs/views/Dashboard.cjs +6 -6
  84. package/dist/cjs/views/Dashboard.native.js +7 -7
  85. package/dist/cjs/views/Dashboard.native.js.map +1 -1
  86. package/dist/cjs/views/Gantt.cjs +3 -3
  87. package/dist/cjs/views/Gantt.native.js +3 -3
  88. package/dist/cjs/views/Gantt.native.js.map +1 -1
  89. package/dist/cjs/views/Kanban.cjs +2 -2
  90. package/dist/cjs/views/Kanban.native.js +2 -2
  91. package/dist/cjs/views/Kanban.native.js.map +1 -1
  92. package/dist/cjs/views/ReportBuilder.cjs +4 -4
  93. package/dist/cjs/views/ReportBuilder.native.js +4 -4
  94. package/dist/cjs/views/ReportBuilder.native.js.map +1 -1
  95. package/dist/cjs/views/TreeView.cjs +248 -19
  96. package/dist/cjs/views/TreeView.native.js +264 -20
  97. package/dist/cjs/views/TreeView.native.js.map +1 -1
  98. package/dist/cjs/views/treeViewReveal.cjs +55 -0
  99. package/dist/cjs/views/treeViewReveal.native.js +80 -0
  100. package/dist/cjs/views/treeViewReveal.native.js.map +1 -0
  101. package/dist/esm/Accordion/index.mjs +3 -3
  102. package/dist/esm/Accordion/index.mjs.map +1 -1
  103. package/dist/esm/Accordion/index.native.js +4 -4
  104. package/dist/esm/Accordion/index.native.js.map +1 -1
  105. package/dist/esm/Chip/index.mjs +1 -1
  106. package/dist/esm/Chip/index.mjs.map +1 -1
  107. package/dist/esm/Chip/index.native.js +1 -1
  108. package/dist/esm/Chip/index.native.js.map +1 -1
  109. package/dist/esm/ContextMenu/index.mjs +3 -3
  110. package/dist/esm/ContextMenu/index.mjs.map +1 -1
  111. package/dist/esm/ContextMenu/index.native.js +3 -3
  112. package/dist/esm/ContextMenu/index.native.js.map +1 -1
  113. package/dist/esm/DropdownMenu/index.mjs +3 -3
  114. package/dist/esm/DropdownMenu/index.mjs.map +1 -1
  115. package/dist/esm/DropdownMenu/index.native.js +3 -3
  116. package/dist/esm/DropdownMenu/index.native.js.map +1 -1
  117. package/dist/esm/Meter/index.mjs +3 -2
  118. package/dist/esm/Meter/index.mjs.map +1 -1
  119. package/dist/esm/Meter/index.native.js +3 -2
  120. package/dist/esm/Meter/index.native.js.map +1 -1
  121. package/dist/esm/Meter/meter.mjs +1 -2
  122. package/dist/esm/Meter/meter.mjs.map +1 -1
  123. package/dist/esm/Meter/meter.native.js +1 -2
  124. package/dist/esm/Meter/meter.native.js.map +1 -1
  125. package/dist/esm/Pagination.mjs +2 -2
  126. package/dist/esm/Pagination.mjs.map +1 -1
  127. package/dist/esm/Pagination.native.js +2 -2
  128. package/dist/esm/Pagination.native.js.map +1 -1
  129. package/dist/esm/ProgressSteps/index.mjs +3 -3
  130. package/dist/esm/ProgressSteps/index.mjs.map +1 -1
  131. package/dist/esm/ProgressSteps/index.native.js +3 -3
  132. package/dist/esm/ProgressSteps/index.native.js.map +1 -1
  133. package/dist/esm/Quote/index.mjs +1 -2
  134. package/dist/esm/Quote/index.mjs.map +1 -1
  135. package/dist/esm/Quote/index.native.js +1 -2
  136. package/dist/esm/Quote/index.native.js.map +1 -1
  137. package/dist/esm/SheetModal/index.mjs +22 -3
  138. package/dist/esm/SheetModal/index.mjs.map +1 -1
  139. package/dist/esm/SheetModal/index.native.js +51 -11
  140. package/dist/esm/SheetModal/index.native.js.map +1 -1
  141. package/dist/esm/Tabs/index.mjs +34 -13
  142. package/dist/esm/Tabs/index.mjs.map +1 -1
  143. package/dist/esm/Tabs/index.native.js +38 -13
  144. package/dist/esm/Tabs/index.native.js.map +1 -1
  145. package/dist/esm/Toast/index.mjs +4 -5
  146. package/dist/esm/Toast/index.mjs.map +1 -1
  147. package/dist/esm/Toast/index.native.js +4 -5
  148. package/dist/esm/Toast/index.native.js.map +1 -1
  149. package/dist/esm/TreeSelect/index.mjs +46 -7
  150. package/dist/esm/TreeSelect/index.mjs.map +1 -1
  151. package/dist/esm/TreeSelect/index.native.js +58 -7
  152. package/dist/esm/TreeSelect/index.native.js.map +1 -1
  153. package/dist/esm/charts/PieChart.mjs +1 -2
  154. package/dist/esm/charts/PieChart.mjs.map +1 -1
  155. package/dist/esm/charts/PieChart.native.js +1 -2
  156. package/dist/esm/charts/PieChart.native.js.map +1 -1
  157. package/dist/esm/code/HighlightedCode/index.mjs +1 -1
  158. package/dist/esm/code/HighlightedCode/index.mjs.map +1 -1
  159. package/dist/esm/code/HighlightedCode/index.native.js +1 -1
  160. package/dist/esm/code/HighlightedCode/index.native.js.map +1 -1
  161. package/dist/esm/componentColors.mjs +6 -4
  162. package/dist/esm/componentColors.mjs.map +1 -1
  163. package/dist/esm/componentColors.native.js +6 -4
  164. package/dist/esm/componentColors.native.js.map +1 -1
  165. package/dist/esm/images/Image/ImageFrame.mjs +4 -2
  166. package/dist/esm/images/Image/ImageFrame.mjs.map +1 -1
  167. package/dist/esm/images/Image/ImageFrame.native.js +4 -2
  168. package/dist/esm/images/Image/ImageFrame.native.js.map +1 -1
  169. package/dist/esm/layouts/AsyncBoundary.mjs +1 -2
  170. package/dist/esm/layouts/AsyncBoundary.mjs.map +1 -1
  171. package/dist/esm/layouts/AsyncBoundary.native.js +1 -2
  172. package/dist/esm/layouts/AsyncBoundary.native.js.map +1 -1
  173. package/dist/esm/layouts/EmptyState.mjs +7 -3
  174. package/dist/esm/layouts/EmptyState.mjs.map +1 -1
  175. package/dist/esm/layouts/EmptyState.native.js +11 -7
  176. package/dist/esm/layouts/EmptyState.native.js.map +1 -1
  177. package/dist/esm/layouts/attachments.mjs +4 -4
  178. package/dist/esm/layouts/attachments.mjs.map +1 -1
  179. package/dist/esm/layouts/attachments.native.js +4 -4
  180. package/dist/esm/layouts/attachments.native.js.map +1 -1
  181. package/dist/esm/layouts/breadcrumbs.mjs +1 -2
  182. package/dist/esm/layouts/breadcrumbs.mjs.map +1 -1
  183. package/dist/esm/layouts/breadcrumbs.native.js +1 -2
  184. package/dist/esm/layouts/breadcrumbs.native.js.map +1 -1
  185. package/dist/esm/layouts/page.mjs +2 -2
  186. package/dist/esm/layouts/page.mjs.map +1 -1
  187. package/dist/esm/layouts/page.native.js +2 -2
  188. package/dist/esm/layouts/page.native.js.map +1 -1
  189. package/dist/esm/layouts/sidebar.mjs +2 -2
  190. package/dist/esm/layouts/sidebar.mjs.map +1 -1
  191. package/dist/esm/layouts/sidebar.native.js +2 -2
  192. package/dist/esm/layouts/sidebar.native.js.map +1 -1
  193. package/dist/esm/layouts/tags.mjs +6 -7
  194. package/dist/esm/layouts/tags.mjs.map +1 -1
  195. package/dist/esm/layouts/tags.native.js +6 -9
  196. package/dist/esm/layouts/tags.native.js.map +1 -1
  197. package/dist/esm/layouts/timeline.mjs +5 -5
  198. package/dist/esm/layouts/timeline.mjs.map +1 -1
  199. package/dist/esm/layouts/timeline.native.js +5 -5
  200. package/dist/esm/layouts/timeline.native.js.map +1 -1
  201. package/dist/esm/surfaces.mjs +1 -0
  202. package/dist/esm/surfaces.mjs.map +1 -1
  203. package/dist/esm/surfaces.native.js +1 -0
  204. package/dist/esm/surfaces.native.js.map +1 -1
  205. package/dist/esm/views/Calendar.mjs +11 -8
  206. package/dist/esm/views/Calendar.mjs.map +1 -1
  207. package/dist/esm/views/Calendar.native.js +11 -8
  208. package/dist/esm/views/Calendar.native.js.map +1 -1
  209. package/dist/esm/views/Dashboard.mjs +6 -6
  210. package/dist/esm/views/Dashboard.mjs.map +1 -1
  211. package/dist/esm/views/Dashboard.native.js +7 -7
  212. package/dist/esm/views/Dashboard.native.js.map +1 -1
  213. package/dist/esm/views/Gantt.mjs +3 -3
  214. package/dist/esm/views/Gantt.mjs.map +1 -1
  215. package/dist/esm/views/Gantt.native.js +3 -3
  216. package/dist/esm/views/Gantt.native.js.map +1 -1
  217. package/dist/esm/views/Kanban.mjs +2 -2
  218. package/dist/esm/views/Kanban.mjs.map +1 -1
  219. package/dist/esm/views/Kanban.native.js +2 -2
  220. package/dist/esm/views/Kanban.native.js.map +1 -1
  221. package/dist/esm/views/ReportBuilder.mjs +4 -4
  222. package/dist/esm/views/ReportBuilder.mjs.map +1 -1
  223. package/dist/esm/views/ReportBuilder.native.js +4 -4
  224. package/dist/esm/views/ReportBuilder.native.js.map +1 -1
  225. package/dist/esm/views/TreeView.mjs +249 -20
  226. package/dist/esm/views/TreeView.mjs.map +1 -1
  227. package/dist/esm/views/TreeView.native.js +265 -21
  228. package/dist/esm/views/TreeView.native.js.map +1 -1
  229. package/dist/esm/views/treeViewReveal.mjs +29 -0
  230. package/dist/esm/views/treeViewReveal.mjs.map +1 -0
  231. package/dist/esm/views/treeViewReveal.native.js +51 -0
  232. package/dist/esm/views/treeViewReveal.native.js.map +1 -0
  233. package/dist/jsx/Accordion/index.mjs +3 -3
  234. package/dist/jsx/Accordion/index.mjs.map +1 -1
  235. package/dist/jsx/Accordion/index.native.js +4 -4
  236. package/dist/jsx/Accordion/index.native.js.map +1 -1
  237. package/dist/jsx/Chip/index.mjs +1 -1
  238. package/dist/jsx/Chip/index.mjs.map +1 -1
  239. package/dist/jsx/Chip/index.native.js +1 -1
  240. package/dist/jsx/Chip/index.native.js.map +1 -1
  241. package/dist/jsx/ContextMenu/index.mjs +3 -3
  242. package/dist/jsx/ContextMenu/index.mjs.map +1 -1
  243. package/dist/jsx/ContextMenu/index.native.js +3 -3
  244. package/dist/jsx/ContextMenu/index.native.js.map +1 -1
  245. package/dist/jsx/DropdownMenu/index.mjs +3 -3
  246. package/dist/jsx/DropdownMenu/index.mjs.map +1 -1
  247. package/dist/jsx/DropdownMenu/index.native.js +3 -3
  248. package/dist/jsx/DropdownMenu/index.native.js.map +1 -1
  249. package/dist/jsx/Meter/index.mjs +3 -2
  250. package/dist/jsx/Meter/index.mjs.map +1 -1
  251. package/dist/jsx/Meter/index.native.js +3 -2
  252. package/dist/jsx/Meter/index.native.js.map +1 -1
  253. package/dist/jsx/Meter/meter.mjs +1 -2
  254. package/dist/jsx/Meter/meter.mjs.map +1 -1
  255. package/dist/jsx/Meter/meter.native.js +1 -2
  256. package/dist/jsx/Meter/meter.native.js.map +1 -1
  257. package/dist/jsx/Pagination.mjs +2 -2
  258. package/dist/jsx/Pagination.mjs.map +1 -1
  259. package/dist/jsx/Pagination.native.js +2 -2
  260. package/dist/jsx/Pagination.native.js.map +1 -1
  261. package/dist/jsx/ProgressSteps/index.mjs +3 -3
  262. package/dist/jsx/ProgressSteps/index.mjs.map +1 -1
  263. package/dist/jsx/ProgressSteps/index.native.js +3 -3
  264. package/dist/jsx/ProgressSteps/index.native.js.map +1 -1
  265. package/dist/jsx/Quote/index.mjs +1 -2
  266. package/dist/jsx/Quote/index.mjs.map +1 -1
  267. package/dist/jsx/Quote/index.native.js +1 -2
  268. package/dist/jsx/Quote/index.native.js.map +1 -1
  269. package/dist/jsx/SheetModal/index.mjs +22 -3
  270. package/dist/jsx/SheetModal/index.mjs.map +1 -1
  271. package/dist/jsx/SheetModal/index.native.js +50 -10
  272. package/dist/jsx/SheetModal/index.native.js.map +1 -1
  273. package/dist/jsx/Tabs/index.mjs +34 -13
  274. package/dist/jsx/Tabs/index.mjs.map +1 -1
  275. package/dist/jsx/Tabs/index.native.js +38 -13
  276. package/dist/jsx/Tabs/index.native.js.map +1 -1
  277. package/dist/jsx/Toast/index.mjs +4 -5
  278. package/dist/jsx/Toast/index.mjs.map +1 -1
  279. package/dist/jsx/Toast/index.native.js +4 -5
  280. package/dist/jsx/Toast/index.native.js.map +1 -1
  281. package/dist/jsx/TreeSelect/index.mjs +46 -7
  282. package/dist/jsx/TreeSelect/index.mjs.map +1 -1
  283. package/dist/jsx/TreeSelect/index.native.js +58 -7
  284. package/dist/jsx/TreeSelect/index.native.js.map +1 -1
  285. package/dist/jsx/charts/PieChart.mjs +1 -2
  286. package/dist/jsx/charts/PieChart.mjs.map +1 -1
  287. package/dist/jsx/charts/PieChart.native.js +1 -2
  288. package/dist/jsx/charts/PieChart.native.js.map +1 -1
  289. package/dist/jsx/code/HighlightedCode/index.mjs +1 -1
  290. package/dist/jsx/code/HighlightedCode/index.mjs.map +1 -1
  291. package/dist/jsx/code/HighlightedCode/index.native.js +1 -1
  292. package/dist/jsx/code/HighlightedCode/index.native.js.map +1 -1
  293. package/dist/jsx/componentColors.mjs +6 -4
  294. package/dist/jsx/componentColors.mjs.map +1 -1
  295. package/dist/jsx/componentColors.native.js +6 -4
  296. package/dist/jsx/componentColors.native.js.map +1 -1
  297. package/dist/jsx/images/Image/ImageFrame.mjs +4 -2
  298. package/dist/jsx/images/Image/ImageFrame.mjs.map +1 -1
  299. package/dist/jsx/images/Image/ImageFrame.native.js +4 -2
  300. package/dist/jsx/images/Image/ImageFrame.native.js.map +1 -1
  301. package/dist/jsx/layouts/AsyncBoundary.mjs +1 -2
  302. package/dist/jsx/layouts/AsyncBoundary.mjs.map +1 -1
  303. package/dist/jsx/layouts/AsyncBoundary.native.js +1 -2
  304. package/dist/jsx/layouts/AsyncBoundary.native.js.map +1 -1
  305. package/dist/jsx/layouts/EmptyState.mjs +7 -3
  306. package/dist/jsx/layouts/EmptyState.mjs.map +1 -1
  307. package/dist/jsx/layouts/EmptyState.native.js +10 -6
  308. package/dist/jsx/layouts/EmptyState.native.js.map +1 -1
  309. package/dist/jsx/layouts/attachments.mjs +4 -4
  310. package/dist/jsx/layouts/attachments.mjs.map +1 -1
  311. package/dist/jsx/layouts/attachments.native.js +4 -4
  312. package/dist/jsx/layouts/attachments.native.js.map +1 -1
  313. package/dist/jsx/layouts/breadcrumbs.mjs +1 -2
  314. package/dist/jsx/layouts/breadcrumbs.mjs.map +1 -1
  315. package/dist/jsx/layouts/breadcrumbs.native.js +1 -2
  316. package/dist/jsx/layouts/breadcrumbs.native.js.map +1 -1
  317. package/dist/jsx/layouts/page.mjs +2 -2
  318. package/dist/jsx/layouts/page.mjs.map +1 -1
  319. package/dist/jsx/layouts/page.native.js +2 -2
  320. package/dist/jsx/layouts/page.native.js.map +1 -1
  321. package/dist/jsx/layouts/sidebar.mjs +2 -2
  322. package/dist/jsx/layouts/sidebar.mjs.map +1 -1
  323. package/dist/jsx/layouts/sidebar.native.js +2 -2
  324. package/dist/jsx/layouts/sidebar.native.js.map +1 -1
  325. package/dist/jsx/layouts/tags.mjs +6 -7
  326. package/dist/jsx/layouts/tags.mjs.map +1 -1
  327. package/dist/jsx/layouts/tags.native.js +6 -9
  328. package/dist/jsx/layouts/tags.native.js.map +1 -1
  329. package/dist/jsx/layouts/timeline.mjs +5 -5
  330. package/dist/jsx/layouts/timeline.mjs.map +1 -1
  331. package/dist/jsx/layouts/timeline.native.js +5 -5
  332. package/dist/jsx/layouts/timeline.native.js.map +1 -1
  333. package/dist/jsx/surfaces.mjs +1 -0
  334. package/dist/jsx/surfaces.mjs.map +1 -1
  335. package/dist/jsx/surfaces.native.js +1 -0
  336. package/dist/jsx/surfaces.native.js.map +1 -1
  337. package/dist/jsx/views/Calendar.mjs +11 -8
  338. package/dist/jsx/views/Calendar.mjs.map +1 -1
  339. package/dist/jsx/views/Calendar.native.js +11 -8
  340. package/dist/jsx/views/Calendar.native.js.map +1 -1
  341. package/dist/jsx/views/Dashboard.mjs +6 -6
  342. package/dist/jsx/views/Dashboard.mjs.map +1 -1
  343. package/dist/jsx/views/Dashboard.native.js +7 -7
  344. package/dist/jsx/views/Dashboard.native.js.map +1 -1
  345. package/dist/jsx/views/Gantt.mjs +3 -3
  346. package/dist/jsx/views/Gantt.mjs.map +1 -1
  347. package/dist/jsx/views/Gantt.native.js +3 -3
  348. package/dist/jsx/views/Gantt.native.js.map +1 -1
  349. package/dist/jsx/views/Kanban.mjs +2 -2
  350. package/dist/jsx/views/Kanban.mjs.map +1 -1
  351. package/dist/jsx/views/Kanban.native.js +2 -2
  352. package/dist/jsx/views/Kanban.native.js.map +1 -1
  353. package/dist/jsx/views/ReportBuilder.mjs +4 -4
  354. package/dist/jsx/views/ReportBuilder.mjs.map +1 -1
  355. package/dist/jsx/views/ReportBuilder.native.js +4 -4
  356. package/dist/jsx/views/ReportBuilder.native.js.map +1 -1
  357. package/dist/jsx/views/TreeView.mjs +249 -20
  358. package/dist/jsx/views/TreeView.mjs.map +1 -1
  359. package/dist/jsx/views/TreeView.native.js +264 -20
  360. package/dist/jsx/views/TreeView.native.js.map +1 -1
  361. package/dist/jsx/views/treeViewReveal.mjs +29 -0
  362. package/dist/jsx/views/treeViewReveal.mjs.map +1 -0
  363. package/dist/jsx/views/treeViewReveal.native.js +80 -0
  364. package/dist/jsx/views/treeViewReveal.native.js.map +1 -0
  365. package/package.json +11 -11
  366. package/src/Accordion/index.tsx +4 -6
  367. package/src/Chip/index.tsx +1 -1
  368. package/src/ContextMenu/index.tsx +3 -3
  369. package/src/DropdownMenu/index.tsx +3 -3
  370. package/src/Meter/Meter.spec.tsx +12 -4
  371. package/src/Meter/index.tsx +3 -2
  372. package/src/Meter/meter.ts +6 -1
  373. package/src/Pagination.tsx +2 -2
  374. package/src/ProgressSteps/index.tsx +3 -3
  375. package/src/Quote/index.tsx +1 -3
  376. package/src/SheetModal/SheetModal.fill.spec.tsx +147 -0
  377. package/src/SheetModal/SheetModal.ownedBody.spec.tsx +200 -0
  378. package/src/SheetModal/SheetModal.stories.spec.tsx +23 -2
  379. package/src/SheetModal/SheetModal.stories.tsx +275 -2
  380. package/src/SheetModal/index.native.tsx +50 -6
  381. package/src/SheetModal/index.tsx +40 -3
  382. package/src/Tabs/Tabs.lifecycle.spec.tsx +123 -0
  383. package/src/Tabs/Tabs.measurement.spec.tsx +186 -0
  384. package/src/Tabs/Tabs.stories.tsx +43 -0
  385. package/src/Tabs/index.tsx +44 -15
  386. package/src/Toast/Toast.spec.tsx +120 -48
  387. package/src/Toast/index.tsx +5 -3
  388. package/src/TreeSelect/index.tsx +61 -1
  389. package/src/charts/PieChart.tsx +1 -2
  390. package/src/code/HighlightedCode/index.tsx +1 -1
  391. package/src/componentColors.ts +6 -4
  392. package/src/images/Image/ImageFrame.tsx +2 -2
  393. package/src/layouts/AsyncBoundary.tsx +1 -2
  394. package/src/layouts/EmptyState.spec.tsx +58 -1
  395. package/src/layouts/EmptyState.tsx +11 -7
  396. package/src/layouts/KeyboardAvoidingWrapper/KeyboardAvoidingWrapper.stories.tsx +3 -3
  397. package/src/layouts/PaneScaffold.stories.tsx +3 -8
  398. package/src/layouts/SafeAreaWrapper/SafeAreaWrapper.stories.tsx +3 -3
  399. package/src/layouts/attachments.tsx +4 -4
  400. package/src/layouts/breadcrumbs.tsx +1 -2
  401. package/src/layouts/page.tsx +2 -2
  402. package/src/layouts/sidebar.tsx +2 -2
  403. package/src/layouts/tags-trigger.spec.tsx +32 -0
  404. package/src/layouts/tags.tsx +7 -9
  405. package/src/layouts/timeline.tsx +5 -5
  406. package/src/surfaces.spec.tsx +97 -3
  407. package/src/surfaces.tsx +4 -2
  408. package/src/textAccentSecondary.spec.tsx +187 -0
  409. package/src/views/Calendar.tsx +9 -8
  410. package/src/views/Dashboard.tsx +13 -8
  411. package/src/views/Gantt.tsx +3 -3
  412. package/src/views/Kanban.native.tsx +2 -2
  413. package/src/views/Kanban.tsx +2 -2
  414. package/src/views/ReportBuilder.tsx +4 -4
  415. package/src/views/TreeView.reveal.spec.tsx +174 -0
  416. package/src/views/TreeView.reveal.stories.tsx +249 -0
  417. package/src/views/TreeView.scroll-index.spec.tsx +246 -0
  418. package/src/views/TreeView.scroll.spec.tsx +857 -0
  419. package/src/views/TreeView.spec.tsx +1 -1
  420. package/src/views/TreeView.tsx +353 -29
  421. package/src/views/treeViewReveal.spec.ts +83 -0
  422. package/src/views/treeViewReveal.ts +45 -0
  423. package/src/views/views.spec.tsx +13 -12
  424. package/types/Accordion/index.d.ts.map +1 -1
  425. package/types/Meter/index.d.ts.map +1 -1
  426. package/types/Meter/meter.d.ts +5 -1
  427. package/types/Meter/meter.d.ts.map +1 -1
  428. package/types/Quote/index.d.ts.map +1 -1
  429. package/types/SheetModal/index.d.ts +8 -1
  430. package/types/SheetModal/index.d.ts.map +1 -1
  431. package/types/SheetModal/index.native.d.ts +1 -1
  432. package/types/SheetModal/index.native.d.ts.map +1 -1
  433. package/types/Tabs/index.d.ts.map +1 -1
  434. package/types/Toast/index.d.ts.map +1 -1
  435. package/types/TreeSelect/index.d.ts +9 -1
  436. package/types/TreeSelect/index.d.ts.map +1 -1
  437. package/types/charts/PieChart.d.ts.map +1 -1
  438. package/types/componentColors.d.ts +1 -4
  439. package/types/componentColors.d.ts.map +1 -1
  440. package/types/images/Image/ImageFrame.d.ts.map +1 -1
  441. package/types/layouts/AsyncBoundary.d.ts.map +1 -1
  442. package/types/layouts/EmptyState.d.ts.map +1 -1
  443. package/types/layouts/breadcrumbs.d.ts.map +1 -1
  444. package/types/layouts/tags.d.ts.map +1 -1
  445. package/types/surfaces.d.ts.map +1 -1
  446. package/types/views/Calendar.d.ts.map +1 -1
  447. package/types/views/Dashboard.d.ts +7 -3
  448. package/types/views/Dashboard.d.ts.map +1 -1
  449. package/types/views/TreeView.d.ts +19 -1
  450. package/types/views/TreeView.d.ts.map +1 -1
  451. package/types/views/treeViewReveal.d.ts +11 -0
  452. package/types/views/treeViewReveal.d.ts.map +1 -0
@@ -206,7 +206,7 @@ export function ProgressSteps({
206
206
  const markerBorder = kind === "upcoming" ? componentColors.indicator.track : markerBg;
207
207
  const markerFg =
208
208
  kind === "upcoming"
209
- ? componentColors.text.muted
209
+ ? knobProps.textAccentColor
210
210
  : kind === "error"
211
211
  ? (onError ?? "$color1")
212
212
  : kind === "completed"
@@ -293,7 +293,7 @@ export function ProgressSteps({
293
293
  kind === "error"
294
294
  ? "$red11"
295
295
  : state === "upcoming"
296
- ? componentColors.text.muted
296
+ ? knobProps.textAccentColor
297
297
  : componentColors.text.primary
298
298
  }
299
299
  textAlign={horizontal ? "center" : undefined}
@@ -305,7 +305,7 @@ export function ProgressSteps({
305
305
  <SizableText
306
306
  {...knobProps.body}
307
307
  fontSize="$1"
308
- color={kind === "error" ? "$red11" : componentColors.text.muted}
308
+ color={kind === "error" ? "$red11" : knobProps.textAccentColor}
309
309
  textAlign={horizontal ? "center" : undefined}
310
310
  numberOfLines={2}
311
311
  >
@@ -66,8 +66,6 @@ export function Quote({ children, cite, compact, ...props }: QuoteProps) {
66
66
  compact === undefined ? { component: "Quote" } : { component: "Quote", compact },
67
67
  );
68
68
  const railWidth = quoteRailWidth(knobProps.borderRadius.borderWidth);
69
- const citeColor =
70
- knobProps.textAccentColor === "$color" ? componentColors.text.muted : knobProps.textAccentColor;
71
69
 
72
70
  return (
73
71
  <QuoteFrame
@@ -106,7 +104,7 @@ export function Quote({ children, cite, compact, ...props }: QuoteProps) {
106
104
  key={key}
107
105
  render="cite"
108
106
  {...knobProps.label}
109
- color={citeColor}
107
+ color={knobProps.textAccentColor}
110
108
  fontStyle="normal"
111
109
  >
112
110
  — {label}
@@ -0,0 +1,147 @@
1
+ /**
2
+ * MPO-299 phase 2 — the `fill` sizing contract.
3
+ *
4
+ * Phase 1 measured the failure on device: a consumer-owned flexible body
5
+ * inside the native sheet was delivered height 0, so a viewport that mounts
6
+ * on its measurement mounted nothing, while a sibling with a declared 240pt
7
+ * height got the space it asked for. `fill` opts into the sheet's existing
8
+ * keyboard-aware cap as a DEFINITE height and opens every link between the
9
+ * frame and the body, so the owned viewport has something to bootstrap from.
10
+ *
11
+ * These are composition checks, not Yoga geometry: happy-dom lays nothing
12
+ * out. A missing intermediate link has to fail here, because opening only
13
+ * the outer frame reproduces the measured zero. Device acceptance is the
14
+ * parent's, on a real run.
15
+ */
16
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
17
+ import { cleanup } from "@testing-library/react";
18
+ import { afterEach, describe, expect, it, vi } from "vitest";
19
+ import { Text } from "tamagui";
20
+ import { SheetModal as WebSheetModal, type SheetModalProps } from "./index";
21
+ import { SheetModal as NativeSheetModal } from "./index.native";
22
+
23
+ vi.mock("react-native-web", async (importOriginal) => ({
24
+ ...(await importOriginal<typeof import("react-native")>()),
25
+ ActionSheetIOS: undefined,
26
+ Modal: ({ children }: { children: import("react").ReactNode }) => children,
27
+ }));
28
+
29
+ afterEach(cleanup);
30
+
31
+ /** Tamagui emits atomic classes; `flex: 1` is grow+shrink+basis together. */
32
+ const flexOne = ["_fg-1", "_fs-1", "_fb-0px"];
33
+ const minZero = "_mih-0px";
34
+
35
+ function classes(element: HTMLElement) {
36
+ return element.className.split(/\s+/);
37
+ }
38
+
39
+ function renderNative(props: Partial<SheetModalProps> = {}) {
40
+ return renderWithProviders(
41
+ <NativeSheetModal open onOpenChange={() => {}} header={<Text>Move to project</Text>} {...props}>
42
+ <Text>row</Text>
43
+ </NativeSheetModal>,
44
+ );
45
+ }
46
+
47
+ describe("native fill allocates the sheet body", () => {
48
+ it("turns the existing cap into a definite frame height only when filling", () => {
49
+ const filled = renderNative({ fill: true }).getByTestId("sheet-modal-frame");
50
+ expect(filled.style.height).not.toBe("");
51
+ expect(filled.style.height).toBe(filled.style.maxHeight);
52
+ cleanup();
53
+ const intrinsic = renderNative().getByTestId("sheet-modal-frame");
54
+ expect(intrinsic.style.height).toBe("");
55
+ expect(intrinsic.style.maxHeight).not.toBe("");
56
+ });
57
+
58
+ it("opens every link between the frame and the body, not just the outer one", () => {
59
+ const view = renderNative({ fill: true });
60
+ for (const id of ["sheet-modal-surface", "sheet-modal-content"]) {
61
+ const link = classes(view.getByTestId(id));
62
+ expect(link, `${id} grows`).toEqual(expect.arrayContaining(flexOne));
63
+ expect(link, `${id} can collapse`).toContain(minZero);
64
+ }
65
+ const body = view.getByTestId("sheet-modal-body");
66
+ expect(body.style.flexGrow).toBe("1");
67
+ expect(body.style.minHeight).toBe("0px");
68
+ });
69
+
70
+ it("leaves the default branch intrinsic, and false is the same as absent", () => {
71
+ for (const props of [{}, { fill: false }]) {
72
+ const view = renderNative(props);
73
+ expect(view.queryByTestId("sheet-modal-body")).toBeNull();
74
+ expect(classes(view.getByTestId("sheet-modal-surface"))).not.toContain("_fg-1");
75
+ expect(classes(view.getByTestId("sheet-modal-content"))).not.toContain("_fg-1");
76
+ cleanup();
77
+ }
78
+ });
79
+
80
+ it("keeps the grabber and header out of the flexible body", () => {
81
+ const view = renderNative({ fill: true });
82
+ const body = view.getByTestId("sheet-modal-body");
83
+ const grabber = view.getByTestId("sheet-modal-grabber");
84
+ expect(grabber.style.flexShrink).toBe("0");
85
+ expect(body.contains(grabber)).toBe(false);
86
+ const header = view.getByText("Move to project");
87
+ expect(body.contains(header)).toBe(false);
88
+ expect(view.getByTestId("sheet-modal-content").contains(body)).toBe(true);
89
+ });
90
+
91
+ it("adds no scroll owner when the consumer keeps scrolling, and exactly one when it does not", () => {
92
+ expect(renderNative({ fill: true }).queryAllByTestId("sheet-modal-scroll")).toHaveLength(0);
93
+ cleanup();
94
+ const scrollers = renderNative({ fill: true, scrollable: true }).getAllByTestId(
95
+ "sheet-modal-scroll",
96
+ );
97
+ expect(scrollers).toHaveLength(1);
98
+ expect(scrollers[0].style.flexGrow).toBe("1");
99
+ });
100
+
101
+ it("keeps the content-sized scroller on the default branch", () => {
102
+ const scroller = renderNative({ scrollable: true }).getByTestId("sheet-modal-scroll");
103
+ expect(scroller.style.flexGrow).toBe("0");
104
+ });
105
+ });
106
+
107
+ /*
108
+ * Web already gets a definite percent height from the Sheet's snap point, so
109
+ * fill only has to open the body chain inside it. tamagui renders the sheet
110
+ * through a portal AND inline, so every query here is plural on purpose.
111
+ */
112
+ function renderWeb(props: Partial<SheetModalProps> = {}) {
113
+ return renderWithProviders(
114
+ <WebSheetModal open onOpenChange={() => {}} header={<Text>Move to project</Text>} {...props}>
115
+ <Text>row</Text>
116
+ </WebSheetModal>,
117
+ );
118
+ }
119
+
120
+ describe("web fill opens the body inside the snapped frame", () => {
121
+ it("mounts a growing body slot only when filling", () => {
122
+ const filled = renderWeb({ fill: true }).getAllByTestId("sheet-modal-body");
123
+ expect(filled.length).toBeGreaterThan(0);
124
+ for (const slot of filled) {
125
+ expect(classes(slot)).toEqual(expect.arrayContaining(flexOne));
126
+ expect(classes(slot)).toContain(minZero);
127
+ }
128
+ cleanup();
129
+ expect(renderWeb().queryAllByTestId("sheet-modal-body")).toHaveLength(0);
130
+ });
131
+
132
+ it("hands the body slot to the sheet scroller when the sheet owns scrolling", () => {
133
+ const view = renderWeb({ fill: true, scrollable: true });
134
+ const bodies = view.getAllByTestId("sheet-modal-body");
135
+ const scrollers = view.getAllByTestId("sheet-modal-scroll");
136
+ expect(scrollers.length).toBe(bodies.length);
137
+ for (const body of bodies) {
138
+ expect(body.querySelectorAll('[data-testid="sheet-modal-scroll"]')).toHaveLength(1);
139
+ }
140
+ });
141
+
142
+ it("keeps one scroll owner and no body slot on the default branch", () => {
143
+ const view = renderWeb({ scrollable: true });
144
+ expect(view.queryAllByTestId("sheet-modal-body")).toHaveLength(0);
145
+ expect(view.getAllByTestId("sheet-modal-scroll").length).toBeGreaterThan(0);
146
+ });
147
+ });
@@ -0,0 +1,200 @@
1
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
2
+ import { act, cleanup, fireEvent } from "@testing-library/react";
3
+ import { afterEach, expect, it, vi } from "vitest";
4
+ import * as stories from "./SheetModal.stories";
5
+
6
+ const hosts = vi.hoisted(() => ({
7
+ props: new Map<string, Record<string, any>>(),
8
+ measurements: [] as Array<{ id: string; callback: (...bounds: number[]) => void }>,
9
+ }));
10
+ vi.mock("@multiplatform.one/components", async (importOriginal) => {
11
+ const actual = await importOriginal<typeof import("@multiplatform.one/components")>();
12
+ const React = await import("react");
13
+ function observed(Component: any) {
14
+ return React.forwardRef((props: Record<string, any>, ref) => {
15
+ if (props.testID) hosts.props.set(props.testID, props);
16
+ React.useImperativeHandle(ref, () => {
17
+ const host = {
18
+ measureInWindow: (callback: (...bounds: number[]) => void) => {
19
+ hosts.measurements.push({ id: props.testID, callback });
20
+ },
21
+ };
22
+ return { ...host, getNativeScrollRef: () => host };
23
+ });
24
+ return (
25
+ <Component
26
+ {...props}
27
+ onLayout={undefined}
28
+ onContentSizeChange={undefined}
29
+ onScroll={undefined}
30
+ />
31
+ );
32
+ });
33
+ }
34
+ return {
35
+ ...actual,
36
+ YStack: observed(actual.YStack),
37
+ ScrollView: observed(actual.ScrollView),
38
+ SheetModal: (props: any) => {
39
+ hosts.props.set("public-sheet-modal", props);
40
+ return props.open ? (
41
+ <>
42
+ {props.header}
43
+ {props.children}
44
+ </>
45
+ ) : null;
46
+ },
47
+ };
48
+ });
49
+ afterEach(() => {
50
+ cleanup();
51
+ hosts.props.clear();
52
+ hosts.measurements = [];
53
+ });
54
+ function sheetProps() {
55
+ return hosts.props.get("public-sheet-modal")!;
56
+ }
57
+ function renderStory(name: "OwnedMeasuredViewport" | "OwnedScrollView") {
58
+ const story = (stories as Record<string, any>)[name];
59
+ expect(story, `${name} is a registered story`).toBeDefined();
60
+ return renderWithProviders(<>{story.render(story.args ?? {}, {})}</>);
61
+ }
62
+ function layout(id: string, height: number) {
63
+ act(() =>
64
+ hosts.props.get(id)!.onLayout({ nativeEvent: { layout: { x: 0, y: 44, width: 300, height } } }),
65
+ );
66
+ }
67
+ function readings(view: ReturnType<typeof renderStory>) {
68
+ return JSON.parse(view.getByTestId("owned-sheet-readings").textContent!);
69
+ }
70
+ it("keeps the measured subject unmeasured until a delivered layout and distinguishes zero", () => {
71
+ const view = renderStory("OwnedMeasuredViewport");
72
+ fireEvent.click(view.getByText("Open flex subject"));
73
+ expect(readings(view).viewportLayout).toBe("unmeasured");
74
+ expect(hosts.props.get("owned-sheet-frame")!.height).toBeUndefined();
75
+ expect(view.queryByText("Record 60")).toBeNull();
76
+ layout("owned-sheet-viewport", 0);
77
+ expect(readings(view).viewportLayout.height).toBe(0);
78
+ expect(view.queryByText("Record 60")).toBeNull();
79
+ layout("owned-sheet-viewport", 187.5);
80
+ expect(readings(view).viewportLayout.height).toBe(187.5);
81
+ expect(view.getByText("Record 60")).toBeDefined();
82
+ });
83
+ it("provides a named fixed control without treating its declared height as a measurement", () => {
84
+ const view = renderStory("OwnedMeasuredViewport");
85
+ fireEvent.click(view.getByText("Open 240pt control"));
86
+ expect(hosts.props.get("owned-sheet-frame")!.height).toBe(240);
87
+ expect(readings(view).mode).toBe("control-240");
88
+ expect(readings(view).frameLayout).toBe("unmeasured");
89
+ layout("owned-sheet-viewport", 192);
90
+ expect(view.getByText("Record 60")).toBeDefined();
91
+ expect(hosts.props.get("owned-sheet-scroll")).toBeDefined();
92
+ });
93
+ it("mounts the owned scroller without a measurement gate and records delivered content and offset", () => {
94
+ const view = renderStory("OwnedScrollView");
95
+ fireEvent.click(view.getByText("Open flex subject"));
96
+ expect(view.getByText("Record 60")).toBeDefined();
97
+ expect(view.getAllByText(/^Record \d+$/)).toHaveLength(60);
98
+ expect(readings(view).offset).toBe("unmeasured");
99
+ const scroll = hosts.props.get("owned-sheet-scroll")!;
100
+ act(() => {
101
+ scroll.onContentSizeChange(300, 2500.5);
102
+ scroll.onScroll({ nativeEvent: { contentOffset: { x: 0, y: 123.25 } } });
103
+ });
104
+ expect(readings(view).content).toEqual({ width: 300, height: 2500.5 });
105
+ expect(readings(view).offset).toEqual({ x: 0, y: 123.25 });
106
+ fireEvent.click(view.getByText("Activate Record 60"));
107
+ expect(readings(view).tailPresses).toBe(1);
108
+ });
109
+ it("records public window-bound callbacks and rejects callbacks from a closed presentation", () => {
110
+ const view = renderStory("OwnedScrollView");
111
+ fireEvent.click(view.getByText("Open flex subject"));
112
+ fireEvent.click(view.getByText("Measure bounds"));
113
+ const pending = [...hosts.measurements];
114
+ const frame = pending.find((item) => item.id === "owned-sheet-frame")!;
115
+ expect(frame).toBeDefined();
116
+ expect(pending.some((item) => item.id === "owned-sheet-scroll")).toBe(true);
117
+ act(() => frame.callback(18, 300, 354, 240));
118
+ expect(readings(view).frameWindow).toEqual({ x: 18, y: 300, width: 354, height: 240 });
119
+ const viewport = pending.find((item) => item.id === "owned-sheet-viewport")!;
120
+ fireEvent.click(view.getByText("Close fixture"));
121
+ fireEvent.click(view.getByText("Open 240pt control"));
122
+ act(() => viewport.callback(18, 344, 354, 196));
123
+ expect(readings(view).viewportWindow).toBe("unmeasured");
124
+ expect(readings(view).frameWindow).toBe("unmeasured");
125
+ });
126
+ it("reports invalid readings rather than converting them to zero", () => {
127
+ const view = renderStory("OwnedScrollView");
128
+ fireEvent.click(view.getByText("Open flex subject"));
129
+ layout("owned-sheet-viewport", Number.NaN);
130
+ expect(readings(view).viewportLayout).toBe("invalid");
131
+ expect(readings(view).sheetFrameWindow).toBe("unavailable: SheetModal has no public frame ref");
132
+ });
133
+
134
+ it("keeps an absent measured scroller unavailable and ignores superseded samples", () => {
135
+ const view = renderStory("OwnedMeasuredViewport");
136
+ fireEvent.click(view.getByText("Open flex subject"));
137
+ fireEvent.click(view.getByText("Measure bounds"));
138
+ expect(readings(view).scrollWindow).toBe("unavailable");
139
+ expect(readings(view).tailWindow).toBe("unavailable");
140
+ expect(readings(view).frameWindow).toBe("unmeasured");
141
+ const old = hosts.measurements.find((item) => item.id === "owned-sheet-frame")!;
142
+ hosts.measurements = [];
143
+ fireEvent.click(view.getByText("Measure bounds"));
144
+ expect(readings(view).sample).toBe(2);
145
+ act(() => old.callback(18, 300, 354, 240));
146
+ expect(readings(view).frameWindow).toBe("unmeasured");
147
+ const current = hosts.measurements.find((item) => item.id === "owned-sheet-frame")!;
148
+ act(() => current.callback(18, 780, 354, 0));
149
+ expect(readings(view).frameWindow).toEqual({ x: 18, y: 780, width: 354, height: 0 });
150
+ });
151
+
152
+ it("retains the closed presentation readings and resets actual tail presses on reopening", () => {
153
+ const view = renderStory("OwnedScrollView");
154
+ fireEvent.click(view.getByText("Open 240pt control"));
155
+ layout("owned-sheet-viewport", 192);
156
+ fireEvent.click(view.getByText("Activate Record 60"));
157
+ fireEvent.click(view.getByText("Close fixture"));
158
+ layout("owned-sheet-viewport", 0);
159
+ expect(readings(view).viewportLayout.height).toBe(192);
160
+ expect(readings(view).tailPresses).toBe(1);
161
+ expect(readings(view).presentation).toBe(1);
162
+ expect(readings(view).open).toBe(false);
163
+ fireEvent.click(view.getByText("Open flex subject"));
164
+ expect(readings(view).viewportLayout).toBe("unmeasured");
165
+ expect(readings(view).tailPresses).toBe(0);
166
+ expect(readings(view).presentation).toBe(2);
167
+ expect(view.getAllByText("Generic detail 1 for this record.")).toHaveLength(60);
168
+ expect(view.getAllByText("Generic detail 4 for this record.")).toHaveLength(15);
169
+ });
170
+
171
+ it("hands the chosen fill value to the real public sheet rather than inferring it", () => {
172
+ const view = renderStory("OwnedMeasuredViewport");
173
+ fireEvent.click(view.getByText("Open flex subject"));
174
+ expect(sheetProps().fill).toBe(false);
175
+ expect(readings(view).fill).toBe(false);
176
+ fireEvent.click(view.getByText("Close fixture"));
177
+ fireEvent.click(view.getByText("Open flex subject (fill)"));
178
+ expect(sheetProps().fill).toBe(true);
179
+ expect(readings(view).fill).toBe(true);
180
+ expect(readings(view).mode).toBe("subject");
181
+ // The fixed control is a diagnostic, not the height contract: it never
182
+ // asks the sheet to allocate.
183
+ fireEvent.click(view.getByText("Close fixture"));
184
+ fireEvent.click(view.getByText("Open 240pt control"));
185
+ expect(sheetProps().fill).toBe(false);
186
+ });
187
+
188
+ it("measures the owned toolbar so the parent can subtract it from the body", () => {
189
+ const view = renderStory("OwnedScrollView");
190
+ fireEvent.click(view.getByText("Open flex subject (fill)"));
191
+ expect(readings(view).toolbarLayout).toBe("unmeasured");
192
+ layout("owned-sheet-toolbar", 44.5);
193
+ layout("owned-sheet-frame", 400);
194
+ layout("owned-sheet-viewport", 355.5);
195
+ const captured = readings(view);
196
+ expect(captured.toolbarLayout.height).toBe(44.5);
197
+ expect(captured.frameLayout.height - captured.toolbarLayout.height).toBe(
198
+ captured.viewportLayout.height,
199
+ );
200
+ });
@@ -10,9 +10,16 @@
10
10
  * open state is.
11
11
  */
12
12
  import { renderWithProviders } from "@multiplatform.one/test-utils";
13
- import { cleanup, screen } from "@testing-library/react";
13
+ import { cleanup, fireEvent, screen } from "@testing-library/react";
14
14
  import { afterEach, describe, expect, it } from "vitest";
15
- import meta, { Default, OpenOnMount, Scrollable, TallDetent } from "./SheetModal.stories";
15
+ import meta, {
16
+ Default,
17
+ OpenOnMount,
18
+ OwnedMeasuredViewport,
19
+ OwnedScrollView,
20
+ Scrollable,
21
+ TallDetent,
22
+ } from "./SheetModal.stories";
16
23
 
17
24
  afterEach(cleanup);
18
25
 
@@ -51,4 +58,18 @@ describe("SheetModal stories", () => {
51
58
  expect(screen.getAllByText("Project 1").length).toBeGreaterThan(0);
52
59
  expect(screen.getAllByText("Project 30").length).toBeGreaterThan(0);
53
60
  });
61
+
62
+ it.each([OwnedMeasuredViewport, OwnedScrollView])(
63
+ "mounts the public owned fixture and its control",
64
+ (story) => {
65
+ renderWithProviders(<>{story.render?.({} as never, {} as never)}</>);
66
+ expect(screen.getByText("Open flex subject")).toBeDefined();
67
+ fireEvent.click(screen.getByText("Open 240pt control"));
68
+ expect(screen.getAllByText("Measure bounds").length).toBeGreaterThan(0);
69
+ expect(screen.getAllByText("Close fixture").length).toBeGreaterThan(0);
70
+ expect(JSON.parse(screen.getByTestId("owned-sheet-readings").textContent!).mode).toBe(
71
+ "control-240",
72
+ );
73
+ },
74
+ );
54
75
  });