@multiplatform.one/components 7.7.6 → 7.8.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 (565) hide show
  1. package/dist/cjs/Button.native.js.map +1 -1
  2. package/dist/cjs/Card.cjs +7 -1
  3. package/dist/cjs/Card.native.js +11 -1
  4. package/dist/cjs/Card.native.js.map +1 -1
  5. package/dist/cjs/CardFooter.cjs +1 -0
  6. package/dist/cjs/CardFooter.native.js +1 -0
  7. package/dist/cjs/CardFooter.native.js.map +1 -1
  8. package/dist/cjs/CopyField/index.cjs +6 -1
  9. package/dist/cjs/CopyField/index.native.js +6 -1
  10. package/dist/cjs/CopyField/index.native.js.map +1 -1
  11. package/dist/cjs/DropdownMenu/index.cjs +31 -1
  12. package/dist/cjs/DropdownMenu/index.native.js +31 -1
  13. package/dist/cjs/DropdownMenu/index.native.js.map +1 -1
  14. package/dist/cjs/Meter/index.cjs +12 -5
  15. package/dist/cjs/Meter/index.native.js +12 -5
  16. package/dist/cjs/Meter/index.native.js.map +1 -1
  17. package/dist/cjs/Tabs/index.cjs +7 -6
  18. package/dist/cjs/Tabs/index.native.js +8 -7
  19. package/dist/cjs/Tabs/index.native.js.map +1 -1
  20. package/dist/cjs/Toast/index.cjs +53 -2
  21. package/dist/cjs/Toast/index.native.js +55 -2
  22. package/dist/cjs/Toast/index.native.js.map +1 -1
  23. package/dist/cjs/actions/DestructiveAction.cjs +7 -13
  24. package/dist/cjs/actions/DestructiveAction.native.js +7 -15
  25. package/dist/cjs/actions/DestructiveAction.native.js.map +1 -1
  26. package/dist/cjs/charts/Axis.cjs +5 -0
  27. package/dist/cjs/charts/Axis.native.js +5 -0
  28. package/dist/cjs/charts/Axis.native.js.map +1 -1
  29. package/dist/cjs/charts/BarChart.cjs +71 -57
  30. package/dist/cjs/charts/BarChart.native.js +81 -67
  31. package/dist/cjs/charts/BarChart.native.js.map +1 -1
  32. package/dist/cjs/charts/ChartDataView.cjs +212 -0
  33. package/dist/cjs/charts/ChartDataView.native.js +224 -0
  34. package/dist/cjs/charts/ChartDataView.native.js.map +1 -0
  35. package/dist/cjs/charts/ChartSurface.cjs +5 -1
  36. package/dist/cjs/charts/ChartSurface.native.js +5 -1
  37. package/dist/cjs/charts/ChartSurface.native.js.map +1 -1
  38. package/dist/cjs/charts/LineChart.cjs +81 -67
  39. package/dist/cjs/charts/LineChart.native.js +94 -80
  40. package/dist/cjs/charts/LineChart.native.js.map +1 -1
  41. package/dist/cjs/charts/PieChart.cjs +98 -73
  42. package/dist/cjs/charts/PieChart.native.js +109 -84
  43. package/dist/cjs/charts/PieChart.native.js.map +1 -1
  44. package/dist/cjs/charts/Sparkline.cjs +10 -1
  45. package/dist/cjs/charts/Sparkline.native.js +10 -1
  46. package/dist/cjs/charts/Sparkline.native.js.map +1 -1
  47. package/dist/cjs/charts/accessibility.cjs +4 -0
  48. package/dist/cjs/charts/accessibility.native.js +7 -0
  49. package/dist/cjs/charts/accessibility.native.js.map +1 -1
  50. package/dist/cjs/charts/index.cjs +3 -1
  51. package/dist/cjs/charts/index.native.js +2 -0
  52. package/dist/cjs/charts/index.native.js.map +1 -1
  53. package/dist/cjs/charts/math.cjs +16 -0
  54. package/dist/cjs/charts/math.native.js +18 -0
  55. package/dist/cjs/charts/math.native.js.map +1 -1
  56. package/dist/cjs/charts/series.cjs +49 -7
  57. package/dist/cjs/charts/series.native.js +53 -11
  58. package/dist/cjs/charts/series.native.js.map +1 -1
  59. package/dist/cjs/charts/svg.cjs +46 -3
  60. package/dist/cjs/charts/svg.native.js +46 -3
  61. package/dist/cjs/charts/svg.native.js.map +1 -1
  62. package/dist/cjs/code/CodeBlock/index.cjs +6 -1
  63. package/dist/cjs/code/CodeBlock/index.native.js +6 -1
  64. package/dist/cjs/code/CodeBlock/index.native.js.map +1 -1
  65. package/dist/cjs/feedback/ConfirmDialog.cjs +7 -21
  66. package/dist/cjs/feedback/ConfirmDialog.native.js +7 -22
  67. package/dist/cjs/feedback/ConfirmDialog.native.js.map +1 -1
  68. package/dist/cjs/feedback/NotifyHost.cjs +2 -1
  69. package/dist/cjs/feedback/NotifyHost.native.js +3 -2
  70. package/dist/cjs/feedback/NotifyHost.native.js.map +1 -1
  71. package/dist/cjs/feedback/copy.cjs +36 -4
  72. package/dist/cjs/feedback/copy.native.js +38 -4
  73. package/dist/cjs/feedback/copy.native.js.map +1 -1
  74. package/dist/cjs/feedback/index.cjs +1 -0
  75. package/dist/cjs/feedback/index.native.js +1 -0
  76. package/dist/cjs/feedback/index.native.js.map +1 -1
  77. package/dist/cjs/feedback/notify.cjs +1 -0
  78. package/dist/cjs/feedback/notify.native.js +1 -0
  79. package/dist/cjs/feedback/notify.native.js.map +1 -1
  80. package/dist/cjs/feedback/route.cjs +3 -0
  81. package/dist/cjs/feedback/route.native.js +3 -0
  82. package/dist/cjs/feedback/route.native.js.map +1 -1
  83. package/dist/cjs/feedback/store.cjs +6 -0
  84. package/dist/cjs/feedback/store.native.js +8 -0
  85. package/dist/cjs/feedback/store.native.js.map +1 -1
  86. package/dist/cjs/icons/lucide.cjs +2 -1
  87. package/dist/cjs/icons/lucide.native.js +2 -1
  88. package/dist/cjs/icons/lucide.native.js.map +1 -1
  89. package/dist/cjs/layouts/PaneScaffold.cjs +96 -41
  90. package/dist/cjs/layouts/PaneScaffold.native.js +97 -41
  91. package/dist/cjs/layouts/PaneScaffold.native.js.map +1 -1
  92. package/dist/cjs/layouts/index.cjs +2 -0
  93. package/dist/cjs/layouts/index.native.js +2 -0
  94. package/dist/cjs/layouts/index.native.js.map +1 -1
  95. package/dist/cjs/layouts/page.cjs +48 -7
  96. package/dist/cjs/layouts/page.native.js +50 -7
  97. package/dist/cjs/layouts/page.native.js.map +1 -1
  98. package/dist/cjs/shared/useKeyboardInset.cjs +1 -19
  99. package/dist/cjs/shared/useKeyboardInset.native.js +3 -3
  100. package/dist/cjs/shared/useKeyboardInset.native.js.map +1 -1
  101. package/dist/cjs/views/Dashboard.cjs +110 -17
  102. package/dist/cjs/views/Dashboard.native.js +151 -45
  103. package/dist/cjs/views/Dashboard.native.js.map +1 -1
  104. package/dist/cjs/views/Gantt.cjs +374 -91
  105. package/dist/cjs/views/Gantt.native.js +443 -94
  106. package/dist/cjs/views/Gantt.native.js.map +1 -1
  107. package/dist/cjs/views/ganttMath.cjs +91 -2
  108. package/dist/cjs/views/ganttMath.native.js +113 -3
  109. package/dist/cjs/views/ganttMath.native.js.map +1 -1
  110. package/dist/cjs/views/index.cjs +20 -1
  111. package/dist/cjs/views/index.native.js +20 -1
  112. package/dist/cjs/views/index.native.js.map +1 -1
  113. package/dist/esm/Button.mjs.map +1 -1
  114. package/dist/esm/Button.native.js.map +1 -1
  115. package/dist/esm/Card.mjs +8 -2
  116. package/dist/esm/Card.mjs.map +1 -1
  117. package/dist/esm/Card.native.js +12 -2
  118. package/dist/esm/Card.native.js.map +1 -1
  119. package/dist/esm/CardFooter.mjs +1 -0
  120. package/dist/esm/CardFooter.mjs.map +1 -1
  121. package/dist/esm/CardFooter.native.js +1 -0
  122. package/dist/esm/CardFooter.native.js.map +1 -1
  123. package/dist/esm/CopyField/index.mjs +7 -2
  124. package/dist/esm/CopyField/index.mjs.map +1 -1
  125. package/dist/esm/CopyField/index.native.js +7 -2
  126. package/dist/esm/CopyField/index.native.js.map +1 -1
  127. package/dist/esm/DropdownMenu/index.mjs +32 -2
  128. package/dist/esm/DropdownMenu/index.mjs.map +1 -1
  129. package/dist/esm/DropdownMenu/index.native.js +32 -2
  130. package/dist/esm/DropdownMenu/index.native.js.map +1 -1
  131. package/dist/esm/Meter/index.mjs +12 -5
  132. package/dist/esm/Meter/index.mjs.map +1 -1
  133. package/dist/esm/Meter/index.native.js +12 -5
  134. package/dist/esm/Meter/index.native.js.map +1 -1
  135. package/dist/esm/Tabs/index.mjs +7 -6
  136. package/dist/esm/Tabs/index.mjs.map +1 -1
  137. package/dist/esm/Tabs/index.native.js +8 -7
  138. package/dist/esm/Tabs/index.native.js.map +1 -1
  139. package/dist/esm/Toast/index.mjs +52 -3
  140. package/dist/esm/Toast/index.mjs.map +1 -1
  141. package/dist/esm/Toast/index.native.js +54 -3
  142. package/dist/esm/Toast/index.native.js.map +1 -1
  143. package/dist/esm/actions/DestructiveAction.mjs +8 -14
  144. package/dist/esm/actions/DestructiveAction.mjs.map +1 -1
  145. package/dist/esm/actions/DestructiveAction.native.js +8 -16
  146. package/dist/esm/actions/DestructiveAction.native.js.map +1 -1
  147. package/dist/esm/charts/Axis.mjs +6 -1
  148. package/dist/esm/charts/Axis.mjs.map +1 -1
  149. package/dist/esm/charts/Axis.native.js +6 -1
  150. package/dist/esm/charts/Axis.native.js.map +1 -1
  151. package/dist/esm/charts/BarChart.mjs +72 -58
  152. package/dist/esm/charts/BarChart.mjs.map +1 -1
  153. package/dist/esm/charts/BarChart.native.js +82 -68
  154. package/dist/esm/charts/BarChart.native.js.map +1 -1
  155. package/dist/esm/charts/ChartDataView.mjs +185 -0
  156. package/dist/esm/charts/ChartDataView.mjs.map +1 -0
  157. package/dist/esm/charts/ChartDataView.native.js +194 -0
  158. package/dist/esm/charts/ChartDataView.native.js.map +1 -0
  159. package/dist/esm/charts/ChartSurface.mjs +5 -1
  160. package/dist/esm/charts/ChartSurface.mjs.map +1 -1
  161. package/dist/esm/charts/ChartSurface.native.js +5 -1
  162. package/dist/esm/charts/ChartSurface.native.js.map +1 -1
  163. package/dist/esm/charts/LineChart.mjs +82 -68
  164. package/dist/esm/charts/LineChart.mjs.map +1 -1
  165. package/dist/esm/charts/LineChart.native.js +95 -81
  166. package/dist/esm/charts/LineChart.native.js.map +1 -1
  167. package/dist/esm/charts/PieChart.mjs +100 -75
  168. package/dist/esm/charts/PieChart.mjs.map +1 -1
  169. package/dist/esm/charts/PieChart.native.js +111 -86
  170. package/dist/esm/charts/PieChart.native.js.map +1 -1
  171. package/dist/esm/charts/Sparkline.mjs +11 -2
  172. package/dist/esm/charts/Sparkline.mjs.map +1 -1
  173. package/dist/esm/charts/Sparkline.native.js +11 -2
  174. package/dist/esm/charts/Sparkline.native.js.map +1 -1
  175. package/dist/esm/charts/accessibility.mjs +4 -1
  176. package/dist/esm/charts/accessibility.mjs.map +1 -1
  177. package/dist/esm/charts/accessibility.native.js +7 -1
  178. package/dist/esm/charts/accessibility.native.js.map +1 -1
  179. package/dist/esm/charts/index.mjs +2 -1
  180. package/dist/esm/charts/index.mjs.map +1 -1
  181. package/dist/esm/charts/index.native.js +2 -1
  182. package/dist/esm/charts/index.native.js.map +1 -1
  183. package/dist/esm/charts/math.mjs +16 -1
  184. package/dist/esm/charts/math.mjs.map +1 -1
  185. package/dist/esm/charts/math.native.js +18 -1
  186. package/dist/esm/charts/math.native.js.map +1 -1
  187. package/dist/esm/charts/series.mjs +51 -9
  188. package/dist/esm/charts/series.mjs.map +1 -1
  189. package/dist/esm/charts/series.native.js +55 -13
  190. package/dist/esm/charts/series.native.js.map +1 -1
  191. package/dist/esm/charts/svg.mjs +40 -4
  192. package/dist/esm/charts/svg.mjs.map +1 -1
  193. package/dist/esm/charts/svg.native.js +40 -4
  194. package/dist/esm/charts/svg.native.js.map +1 -1
  195. package/dist/esm/code/CodeBlock/index.mjs +7 -2
  196. package/dist/esm/code/CodeBlock/index.mjs.map +1 -1
  197. package/dist/esm/code/CodeBlock/index.native.js +7 -2
  198. package/dist/esm/code/CodeBlock/index.native.js.map +1 -1
  199. package/dist/esm/feedback/ConfirmDialog.mjs +8 -22
  200. package/dist/esm/feedback/ConfirmDialog.mjs.map +1 -1
  201. package/dist/esm/feedback/ConfirmDialog.native.js +8 -23
  202. package/dist/esm/feedback/ConfirmDialog.native.js.map +1 -1
  203. package/dist/esm/feedback/NotifyHost.mjs +2 -1
  204. package/dist/esm/feedback/NotifyHost.mjs.map +1 -1
  205. package/dist/esm/feedback/NotifyHost.native.js +3 -2
  206. package/dist/esm/feedback/NotifyHost.native.js.map +1 -1
  207. package/dist/esm/feedback/copy.mjs +35 -4
  208. package/dist/esm/feedback/copy.mjs.map +1 -1
  209. package/dist/esm/feedback/copy.native.js +37 -4
  210. package/dist/esm/feedback/copy.native.js.map +1 -1
  211. package/dist/esm/feedback/index.mjs +2 -2
  212. package/dist/esm/feedback/index.mjs.map +1 -1
  213. package/dist/esm/feedback/index.native.js +2 -2
  214. package/dist/esm/feedback/index.native.js.map +1 -1
  215. package/dist/esm/feedback/notify.mjs +1 -0
  216. package/dist/esm/feedback/notify.mjs.map +1 -1
  217. package/dist/esm/feedback/notify.native.js +1 -0
  218. package/dist/esm/feedback/notify.native.js.map +1 -1
  219. package/dist/esm/feedback/route.mjs +3 -0
  220. package/dist/esm/feedback/route.mjs.map +1 -1
  221. package/dist/esm/feedback/route.native.js +3 -0
  222. package/dist/esm/feedback/route.native.js.map +1 -1
  223. package/dist/esm/feedback/store.mjs +6 -1
  224. package/dist/esm/feedback/store.mjs.map +1 -1
  225. package/dist/esm/feedback/store.native.js +8 -1
  226. package/dist/esm/feedback/store.native.js.map +1 -1
  227. package/dist/esm/icons/lucide.mjs +2 -2
  228. package/dist/esm/icons/lucide.mjs.map +1 -1
  229. package/dist/esm/icons/lucide.native.js +2 -2
  230. package/dist/esm/icons/lucide.native.js.map +1 -1
  231. package/dist/esm/layouts/PaneScaffold.mjs +97 -42
  232. package/dist/esm/layouts/PaneScaffold.mjs.map +1 -1
  233. package/dist/esm/layouts/PaneScaffold.native.js +98 -42
  234. package/dist/esm/layouts/PaneScaffold.native.js.map +1 -1
  235. package/dist/esm/layouts/index.mjs +2 -1
  236. package/dist/esm/layouts/index.mjs.map +1 -1
  237. package/dist/esm/layouts/index.native.js +2 -1
  238. package/dist/esm/layouts/index.native.js.map +1 -1
  239. package/dist/esm/layouts/page.mjs +49 -8
  240. package/dist/esm/layouts/page.mjs.map +1 -1
  241. package/dist/esm/layouts/page.native.js +51 -8
  242. package/dist/esm/layouts/page.native.js.map +1 -1
  243. package/dist/esm/shared/useKeyboardInset.mjs +1 -19
  244. package/dist/esm/shared/useKeyboardInset.mjs.map +1 -1
  245. package/dist/esm/shared/useKeyboardInset.native.js.map +1 -1
  246. package/dist/esm/views/Dashboard.mjs +112 -19
  247. package/dist/esm/views/Dashboard.mjs.map +1 -1
  248. package/dist/esm/views/Dashboard.native.js +153 -47
  249. package/dist/esm/views/Dashboard.native.js.map +1 -1
  250. package/dist/esm/views/Gantt.mjs +376 -93
  251. package/dist/esm/views/Gantt.mjs.map +1 -1
  252. package/dist/esm/views/Gantt.native.js +445 -96
  253. package/dist/esm/views/Gantt.native.js.map +1 -1
  254. package/dist/esm/views/ganttMath.mjs +84 -3
  255. package/dist/esm/views/ganttMath.mjs.map +1 -1
  256. package/dist/esm/views/ganttMath.native.js +106 -4
  257. package/dist/esm/views/ganttMath.native.js.map +1 -1
  258. package/dist/esm/views/index.mjs +2 -2
  259. package/dist/esm/views/index.mjs.map +1 -1
  260. package/dist/esm/views/index.native.js +2 -2
  261. package/dist/esm/views/index.native.js.map +1 -1
  262. package/dist/jsx/Button.mjs.map +1 -1
  263. package/dist/jsx/Button.native.js.map +1 -1
  264. package/dist/jsx/Card.mjs +8 -2
  265. package/dist/jsx/Card.mjs.map +1 -1
  266. package/dist/jsx/Card.native.js +11 -1
  267. package/dist/jsx/Card.native.js.map +1 -1
  268. package/dist/jsx/CardFooter.mjs +1 -0
  269. package/dist/jsx/CardFooter.mjs.map +1 -1
  270. package/dist/jsx/CardFooter.native.js +1 -0
  271. package/dist/jsx/CardFooter.native.js.map +1 -1
  272. package/dist/jsx/CopyField/index.mjs +7 -2
  273. package/dist/jsx/CopyField/index.mjs.map +1 -1
  274. package/dist/jsx/CopyField/index.native.js +6 -1
  275. package/dist/jsx/CopyField/index.native.js.map +1 -1
  276. package/dist/jsx/DropdownMenu/index.mjs +32 -2
  277. package/dist/jsx/DropdownMenu/index.mjs.map +1 -1
  278. package/dist/jsx/DropdownMenu/index.native.js +31 -1
  279. package/dist/jsx/DropdownMenu/index.native.js.map +1 -1
  280. package/dist/jsx/Meter/index.mjs +12 -5
  281. package/dist/jsx/Meter/index.mjs.map +1 -1
  282. package/dist/jsx/Meter/index.native.js +12 -5
  283. package/dist/jsx/Meter/index.native.js.map +1 -1
  284. package/dist/jsx/Tabs/index.mjs +7 -6
  285. package/dist/jsx/Tabs/index.mjs.map +1 -1
  286. package/dist/jsx/Tabs/index.native.js +8 -7
  287. package/dist/jsx/Tabs/index.native.js.map +1 -1
  288. package/dist/jsx/Toast/index.mjs +52 -3
  289. package/dist/jsx/Toast/index.mjs.map +1 -1
  290. package/dist/jsx/Toast/index.native.js +55 -2
  291. package/dist/jsx/Toast/index.native.js.map +1 -1
  292. package/dist/jsx/actions/DestructiveAction.mjs +8 -14
  293. package/dist/jsx/actions/DestructiveAction.mjs.map +1 -1
  294. package/dist/jsx/actions/DestructiveAction.native.js +7 -15
  295. package/dist/jsx/actions/DestructiveAction.native.js.map +1 -1
  296. package/dist/jsx/charts/Axis.mjs +6 -1
  297. package/dist/jsx/charts/Axis.mjs.map +1 -1
  298. package/dist/jsx/charts/Axis.native.js +5 -0
  299. package/dist/jsx/charts/Axis.native.js.map +1 -1
  300. package/dist/jsx/charts/BarChart.mjs +72 -58
  301. package/dist/jsx/charts/BarChart.mjs.map +1 -1
  302. package/dist/jsx/charts/BarChart.native.js +81 -67
  303. package/dist/jsx/charts/BarChart.native.js.map +1 -1
  304. package/dist/jsx/charts/ChartDataView.mjs +185 -0
  305. package/dist/jsx/charts/ChartDataView.mjs.map +1 -0
  306. package/dist/jsx/charts/ChartDataView.native.js +224 -0
  307. package/dist/jsx/charts/ChartDataView.native.js.map +1 -0
  308. package/dist/jsx/charts/ChartSurface.mjs +5 -1
  309. package/dist/jsx/charts/ChartSurface.mjs.map +1 -1
  310. package/dist/jsx/charts/ChartSurface.native.js +5 -1
  311. package/dist/jsx/charts/ChartSurface.native.js.map +1 -1
  312. package/dist/jsx/charts/LineChart.mjs +82 -68
  313. package/dist/jsx/charts/LineChart.mjs.map +1 -1
  314. package/dist/jsx/charts/LineChart.native.js +94 -80
  315. package/dist/jsx/charts/LineChart.native.js.map +1 -1
  316. package/dist/jsx/charts/PieChart.mjs +100 -75
  317. package/dist/jsx/charts/PieChart.mjs.map +1 -1
  318. package/dist/jsx/charts/PieChart.native.js +109 -84
  319. package/dist/jsx/charts/PieChart.native.js.map +1 -1
  320. package/dist/jsx/charts/Sparkline.mjs +11 -2
  321. package/dist/jsx/charts/Sparkline.mjs.map +1 -1
  322. package/dist/jsx/charts/Sparkline.native.js +10 -1
  323. package/dist/jsx/charts/Sparkline.native.js.map +1 -1
  324. package/dist/jsx/charts/accessibility.mjs +4 -1
  325. package/dist/jsx/charts/accessibility.mjs.map +1 -1
  326. package/dist/jsx/charts/accessibility.native.js +7 -0
  327. package/dist/jsx/charts/accessibility.native.js.map +1 -1
  328. package/dist/jsx/charts/index.mjs +2 -1
  329. package/dist/jsx/charts/index.mjs.map +1 -1
  330. package/dist/jsx/charts/index.native.js +2 -0
  331. package/dist/jsx/charts/index.native.js.map +1 -1
  332. package/dist/jsx/charts/math.mjs +16 -1
  333. package/dist/jsx/charts/math.mjs.map +1 -1
  334. package/dist/jsx/charts/math.native.js +18 -0
  335. package/dist/jsx/charts/math.native.js.map +1 -1
  336. package/dist/jsx/charts/series.mjs +51 -9
  337. package/dist/jsx/charts/series.mjs.map +1 -1
  338. package/dist/jsx/charts/series.native.js +53 -11
  339. package/dist/jsx/charts/series.native.js.map +1 -1
  340. package/dist/jsx/charts/svg.mjs +40 -4
  341. package/dist/jsx/charts/svg.mjs.map +1 -1
  342. package/dist/jsx/charts/svg.native.js +46 -3
  343. package/dist/jsx/charts/svg.native.js.map +1 -1
  344. package/dist/jsx/code/CodeBlock/index.mjs +7 -2
  345. package/dist/jsx/code/CodeBlock/index.mjs.map +1 -1
  346. package/dist/jsx/code/CodeBlock/index.native.js +6 -1
  347. package/dist/jsx/code/CodeBlock/index.native.js.map +1 -1
  348. package/dist/jsx/feedback/ConfirmDialog.mjs +8 -22
  349. package/dist/jsx/feedback/ConfirmDialog.mjs.map +1 -1
  350. package/dist/jsx/feedback/ConfirmDialog.native.js +7 -22
  351. package/dist/jsx/feedback/ConfirmDialog.native.js.map +1 -1
  352. package/dist/jsx/feedback/NotifyHost.mjs +2 -1
  353. package/dist/jsx/feedback/NotifyHost.mjs.map +1 -1
  354. package/dist/jsx/feedback/NotifyHost.native.js +3 -2
  355. package/dist/jsx/feedback/NotifyHost.native.js.map +1 -1
  356. package/dist/jsx/feedback/copy.mjs +35 -4
  357. package/dist/jsx/feedback/copy.mjs.map +1 -1
  358. package/dist/jsx/feedback/copy.native.js +38 -4
  359. package/dist/jsx/feedback/copy.native.js.map +1 -1
  360. package/dist/jsx/feedback/index.mjs +2 -2
  361. package/dist/jsx/feedback/index.mjs.map +1 -1
  362. package/dist/jsx/feedback/index.native.js +1 -0
  363. package/dist/jsx/feedback/index.native.js.map +1 -1
  364. package/dist/jsx/feedback/notify.mjs +1 -0
  365. package/dist/jsx/feedback/notify.mjs.map +1 -1
  366. package/dist/jsx/feedback/notify.native.js +1 -0
  367. package/dist/jsx/feedback/notify.native.js.map +1 -1
  368. package/dist/jsx/feedback/route.mjs +3 -0
  369. package/dist/jsx/feedback/route.mjs.map +1 -1
  370. package/dist/jsx/feedback/route.native.js +3 -0
  371. package/dist/jsx/feedback/route.native.js.map +1 -1
  372. package/dist/jsx/feedback/store.mjs +6 -1
  373. package/dist/jsx/feedback/store.mjs.map +1 -1
  374. package/dist/jsx/feedback/store.native.js +8 -0
  375. package/dist/jsx/feedback/store.native.js.map +1 -1
  376. package/dist/jsx/icons/lucide.mjs +2 -2
  377. package/dist/jsx/icons/lucide.mjs.map +1 -1
  378. package/dist/jsx/icons/lucide.native.js +2 -1
  379. package/dist/jsx/layouts/PaneScaffold.mjs +97 -42
  380. package/dist/jsx/layouts/PaneScaffold.mjs.map +1 -1
  381. package/dist/jsx/layouts/PaneScaffold.native.js +97 -41
  382. package/dist/jsx/layouts/PaneScaffold.native.js.map +1 -1
  383. package/dist/jsx/layouts/index.mjs +2 -1
  384. package/dist/jsx/layouts/index.mjs.map +1 -1
  385. package/dist/jsx/layouts/index.native.js +2 -0
  386. package/dist/jsx/layouts/index.native.js.map +1 -1
  387. package/dist/jsx/layouts/page.mjs +49 -8
  388. package/dist/jsx/layouts/page.mjs.map +1 -1
  389. package/dist/jsx/layouts/page.native.js +50 -7
  390. package/dist/jsx/layouts/page.native.js.map +1 -1
  391. package/dist/jsx/shared/useKeyboardInset.mjs +1 -19
  392. package/dist/jsx/shared/useKeyboardInset.mjs.map +1 -1
  393. package/dist/jsx/shared/useKeyboardInset.native.js +3 -3
  394. package/dist/jsx/shared/useKeyboardInset.native.js.map +1 -1
  395. package/dist/jsx/views/Dashboard.mjs +112 -19
  396. package/dist/jsx/views/Dashboard.mjs.map +1 -1
  397. package/dist/jsx/views/Dashboard.native.js +151 -45
  398. package/dist/jsx/views/Dashboard.native.js.map +1 -1
  399. package/dist/jsx/views/Gantt.mjs +376 -93
  400. package/dist/jsx/views/Gantt.mjs.map +1 -1
  401. package/dist/jsx/views/Gantt.native.js +443 -94
  402. package/dist/jsx/views/Gantt.native.js.map +1 -1
  403. package/dist/jsx/views/ganttMath.mjs +84 -3
  404. package/dist/jsx/views/ganttMath.mjs.map +1 -1
  405. package/dist/jsx/views/ganttMath.native.js +113 -3
  406. package/dist/jsx/views/ganttMath.native.js.map +1 -1
  407. package/dist/jsx/views/index.mjs +2 -2
  408. package/dist/jsx/views/index.mjs.map +1 -1
  409. package/dist/jsx/views/index.native.js +20 -1
  410. package/dist/jsx/views/index.native.js.map +1 -1
  411. package/package.json +11 -9
  412. package/src/Button.tsx +10 -2
  413. package/src/Card.spec.tsx +76 -3
  414. package/src/Card.stories.tsx +1 -1
  415. package/src/Card.tsx +13 -1
  416. package/src/CardFooter.stories.tsx +3 -7
  417. package/src/CardFooter.tsx +3 -1
  418. package/src/CardHeader.stories.tsx +1 -3
  419. package/src/Collapsible.stories.tsx +2 -2
  420. package/src/CopyField/CopyField.spec.tsx +66 -1
  421. package/src/CopyField/index.tsx +4 -3
  422. package/src/DropdownMenu/DropdownMenu.spec.tsx +112 -1
  423. package/src/DropdownMenu/DropdownMenu.stories.tsx +1 -3
  424. package/src/DropdownMenu/index.tsx +67 -6
  425. package/src/LinearGradient.stories.tsx +2 -2
  426. package/src/Meter/Meter.spec.tsx +59 -2
  427. package/src/Meter/Meter.stories.tsx +38 -0
  428. package/src/Meter/index.tsx +9 -4
  429. package/src/Panel.stories.tsx +1 -1
  430. package/src/SortableList/SortableList.spec.tsx +3 -3
  431. package/src/Tabs/Tabs.spec.tsx +43 -3
  432. package/src/Tabs/Tabs.stories.tsx +10 -1
  433. package/src/Tabs/index.tsx +19 -13
  434. package/src/Toast/Toast.spec.tsx +56 -1
  435. package/src/Toast/index.tsx +68 -3
  436. package/src/Unspaced.stories.tsx +2 -2
  437. package/src/VisuallyHidden.stories.tsx +2 -2
  438. package/src/actions/DestructiveAction.spec.tsx +19 -3
  439. package/src/actions/DestructiveAction.tsx +9 -14
  440. package/src/charts/Axis.tsx +6 -1
  441. package/src/charts/BarChart.tsx +82 -67
  442. package/src/charts/ChartDataView.spec.tsx +104 -0
  443. package/src/charts/ChartDataView.tsx +158 -0
  444. package/src/charts/ChartSurface.tsx +7 -2
  445. package/src/charts/Charts.stories.tsx +213 -9
  446. package/src/charts/LineChart.tsx +90 -75
  447. package/src/charts/PieChart.knobs.spec.tsx +25 -0
  448. package/src/charts/PieChart.tsx +51 -9
  449. package/src/charts/Sparkline.tsx +25 -3
  450. package/src/charts/accessibility.ts +8 -0
  451. package/src/charts/charts.spec.tsx +77 -3
  452. package/src/charts/index.ts +2 -0
  453. package/src/charts/math.spec.ts +19 -0
  454. package/src/charts/math.ts +36 -0
  455. package/src/charts/series.tsx +101 -21
  456. package/src/charts/svg.spec.ts +28 -0
  457. package/src/charts/svg.ts +56 -2
  458. package/src/code/CodeBlock/CodeBlock.copy.spec.tsx +23 -0
  459. package/src/code/CodeBlock/index.tsx +4 -3
  460. package/src/feedback/ConfirmDialog.nativeFocus.spec.tsx +52 -0
  461. package/src/feedback/ConfirmDialog.spec.tsx +20 -0
  462. package/src/feedback/ConfirmDialog.tsx +9 -15
  463. package/src/feedback/NotifyHost.tsx +11 -2
  464. package/src/feedback/copy.ts +36 -4
  465. package/src/feedback/index.ts +1 -0
  466. package/src/feedback/notify.spec.ts +15 -1
  467. package/src/feedback/notify.ts +1 -0
  468. package/src/feedback/route.ts +4 -0
  469. package/src/feedback/store.ts +7 -0
  470. package/src/icons/lucide.ts +1 -1
  471. package/src/images/SvgUri/index.native.ts +11 -3
  472. package/src/layouts/EmptyState.stories.tsx +2 -2
  473. package/src/layouts/Page.weight.spec.tsx +75 -0
  474. package/src/layouts/PageHeader.stories.tsx +4 -4
  475. package/src/layouts/PageTemplates.stories.tsx +2 -2
  476. package/src/layouts/PaneScaffold.spec.tsx +144 -4
  477. package/src/layouts/PaneScaffold.stories.tsx +58 -2
  478. package/src/layouts/PaneScaffold.tsx +156 -58
  479. package/src/layouts/ScreenToolbar.stories.tsx +6 -23
  480. package/src/layouts/index.tsx +11 -0
  481. package/src/layouts/layouts.spec.tsx +51 -0
  482. package/src/layouts/page.designLaw.spec.tsx +25 -0
  483. package/src/layouts/page.tsx +46 -9
  484. package/src/shared/useKeyboardInset.native.ts +43 -0
  485. package/src/shared/useKeyboardInset.ts +2 -41
  486. package/src/tamagui.spec.ts +63 -0
  487. package/src/views/Dashboard.stories.tsx +38 -1
  488. package/src/views/Dashboard.tsx +119 -21
  489. package/src/views/Gantt.scroll.spec.tsx +120 -0
  490. package/src/views/Gantt.spec.tsx +376 -0
  491. package/src/views/Gantt.stories.tsx +75 -2
  492. package/src/views/Gantt.tsx +564 -96
  493. package/src/views/Kanban.spec.tsx +11 -0
  494. package/src/views/ganttMath.ts +142 -4
  495. package/src/views/index.ts +44 -1
  496. package/src/views/views.spec.tsx +39 -0
  497. package/types/Button.d.ts +12 -2
  498. package/types/Button.d.ts.map +1 -1
  499. package/types/Card.d.ts.map +1 -1
  500. package/types/CardFooter.d.ts +2 -1
  501. package/types/CardFooter.d.ts.map +1 -1
  502. package/types/CopyField/index.d.ts.map +1 -1
  503. package/types/DropdownMenu/index.d.ts +22 -0
  504. package/types/DropdownMenu/index.d.ts.map +1 -1
  505. package/types/Meter/index.d.ts.map +1 -1
  506. package/types/Tabs/index.d.ts +1 -1
  507. package/types/Tabs/index.d.ts.map +1 -1
  508. package/types/Toast/index.d.ts +16 -0
  509. package/types/Toast/index.d.ts.map +1 -1
  510. package/types/actions/DestructiveAction.d.ts.map +1 -1
  511. package/types/charts/Axis.d.ts.map +1 -1
  512. package/types/charts/BarChart.d.ts.map +1 -1
  513. package/types/charts/ChartDataView.d.ts +22 -0
  514. package/types/charts/ChartDataView.d.ts.map +1 -0
  515. package/types/charts/ChartSurface.d.ts +4 -1
  516. package/types/charts/ChartSurface.d.ts.map +1 -1
  517. package/types/charts/LineChart.d.ts.map +1 -1
  518. package/types/charts/PieChart.d.ts +1 -1
  519. package/types/charts/PieChart.d.ts.map +1 -1
  520. package/types/charts/Sparkline.d.ts +3 -1
  521. package/types/charts/Sparkline.d.ts.map +1 -1
  522. package/types/charts/accessibility.d.ts +3 -0
  523. package/types/charts/accessibility.d.ts.map +1 -1
  524. package/types/charts/index.d.ts +1 -0
  525. package/types/charts/index.d.ts.map +1 -1
  526. package/types/charts/math.d.ts +12 -0
  527. package/types/charts/math.d.ts.map +1 -1
  528. package/types/charts/series.d.ts +1 -1
  529. package/types/charts/series.d.ts.map +1 -1
  530. package/types/charts/svg.d.ts +18 -2
  531. package/types/charts/svg.d.ts.map +1 -1
  532. package/types/code/CodeBlock/index.d.ts.map +1 -1
  533. package/types/feedback/ConfirmDialog.d.ts.map +1 -1
  534. package/types/feedback/NotifyHost.d.ts +3 -1
  535. package/types/feedback/NotifyHost.d.ts.map +1 -1
  536. package/types/feedback/copy.d.ts +12 -2
  537. package/types/feedback/copy.d.ts.map +1 -1
  538. package/types/feedback/index.d.ts +1 -1
  539. package/types/feedback/index.d.ts.map +1 -1
  540. package/types/feedback/notify.d.ts.map +1 -1
  541. package/types/feedback/route.d.ts +3 -0
  542. package/types/feedback/route.d.ts.map +1 -1
  543. package/types/feedback/store.d.ts +2 -0
  544. package/types/feedback/store.d.ts.map +1 -1
  545. package/types/icons/lucide.d.ts +1 -1
  546. package/types/icons/lucide.d.ts.map +1 -1
  547. package/types/images/SvgUri/index.native.d.ts +4 -3
  548. package/types/images/SvgUri/index.native.d.ts.map +1 -1
  549. package/types/layouts/PaneScaffold.d.ts +27 -5
  550. package/types/layouts/PaneScaffold.d.ts.map +1 -1
  551. package/types/layouts/index.d.ts +1 -0
  552. package/types/layouts/index.d.ts.map +1 -1
  553. package/types/layouts/page.d.ts +10 -5
  554. package/types/layouts/page.d.ts.map +1 -1
  555. package/types/shared/useKeyboardInset.d.ts +1 -14
  556. package/types/shared/useKeyboardInset.d.ts.map +1 -1
  557. package/types/shared/useKeyboardInset.native.d.ts +16 -0
  558. package/types/shared/useKeyboardInset.native.d.ts.map +1 -0
  559. package/types/views/Dashboard.d.ts.map +1 -1
  560. package/types/views/Gantt.d.ts +132 -13
  561. package/types/views/Gantt.d.ts.map +1 -1
  562. package/types/views/ganttMath.d.ts +73 -0
  563. package/types/views/ganttMath.d.ts.map +1 -1
  564. package/types/views/index.d.ts +2 -2
  565. package/types/views/index.d.ts.map +1 -1
@@ -13,6 +13,37 @@ import * as Layouts from "./index";
13
13
 
14
14
  afterEach(cleanup);
15
15
 
16
+ const originalInnerWidth = window.innerWidth;
17
+
18
+ /** Drive the real size-class path from a viewport width (setup reads it at render). */
19
+ function setViewportWidth(width: number) {
20
+ Object.defineProperty(window, "innerWidth", { configurable: true, value: width });
21
+ }
22
+
23
+ afterEach(() => setViewportWidth(originalInnerWidth));
24
+
25
+ /**
26
+ * Rail | (centre | inspector) — the three-region page the kit composes from
27
+ * two scaffolds. `sizeClass` is set on the OUTER one only, so this also
28
+ * covers whether the class reaches the inner scaffold.
29
+ */
30
+ function ThreeRegionPage(props: {
31
+ sizeClass?: "compact" | "medium" | "expanded" | "large" | "xl";
32
+ }) {
33
+ return (
34
+ <PaneScaffold
35
+ sizeClass={props.sizeClass}
36
+ primary={<Paragraph>Rail</Paragraph>}
37
+ secondary={
38
+ <PaneScaffold
39
+ primary={<Paragraph>Centre</Paragraph>}
40
+ secondary={<Paragraph>Inspector</Paragraph>}
41
+ />
42
+ }
43
+ />
44
+ );
45
+ }
46
+
16
47
  describe("layouts index exports (W11)", () => {
17
48
  it("exports PaneScaffold canonical layouts + ReadingWidth", () => {
18
49
  expect(Layouts.PaneScaffold).toBe(PaneScaffold);
@@ -24,7 +55,7 @@ describe("layouts index exports (W11)", () => {
24
55
  });
25
56
 
26
57
  describe("PaneScaffold", () => {
27
- it("shows one pane on compact/medium", () => {
58
+ it("stacks both panes below the two-pane budget", () => {
28
59
  renderWithProviders(
29
60
  <PaneScaffold
30
61
  sizeClass="compact"
@@ -33,8 +64,34 @@ describe("PaneScaffold", () => {
33
64
  />,
34
65
  );
35
66
  const root = screen.getByTestId("pane-scaffold");
36
- expect(root).toHaveAttribute("data-panes", "1");
37
- expect(screen.getByText("List")).toBeInTheDocument();
67
+ expect(root).toHaveAttribute("data-panes", "2");
68
+ expect(root).toHaveAttribute("data-pane-layout", "stack");
69
+ expect(screen.getByTestId("pane-primary")).toHaveTextContent("List");
70
+ expect(screen.getByTestId("pane-secondary")).toHaveTextContent("Detail");
71
+ });
72
+
73
+ it("drops the sash when stacked (nothing to drag with a thumb)", () => {
74
+ renderWithProviders(
75
+ <PaneScaffold
76
+ sizeClass="compact"
77
+ primary={<Paragraph>List</Paragraph>}
78
+ secondary={<Paragraph>Detail</Paragraph>}
79
+ />,
80
+ );
81
+ expect(screen.getByTestId("pane-scaffold")).toHaveAttribute("data-sash", "false");
82
+ expect(screen.queryByTestId("pane-sash")).not.toBeInTheDocument();
83
+ });
84
+
85
+ it("narrowLayout=swap drops the inactive pane", () => {
86
+ renderWithProviders(
87
+ <PaneScaffold
88
+ sizeClass="compact"
89
+ narrowLayout="swap"
90
+ primary={<Paragraph>List</Paragraph>}
91
+ secondary={<Paragraph>Detail</Paragraph>}
92
+ />,
93
+ );
94
+ expect(screen.getByTestId("pane-scaffold")).toHaveAttribute("data-panes", "1");
38
95
  expect(screen.queryByText("Detail")).not.toBeInTheDocument();
39
96
  });
40
97
 
@@ -66,12 +123,27 @@ describe("PaneScaffold", () => {
66
123
  expect(screen.getByTestId("pane-secondary")).toHaveTextContent("Detail");
67
124
  });
68
125
 
69
- it("maxPanes=1 ejects to single column even when expanded", () => {
126
+ it("maxPanes=1 takes the narrow path even when expanded", () => {
70
127
  renderWithProviders(
71
128
  <PaneScaffold
72
129
  sizeClass="xl"
73
130
  maxPanes={1}
74
131
  primary={<Paragraph>Only</Paragraph>}
132
+ secondary={<Paragraph>Also</Paragraph>}
133
+ />,
134
+ );
135
+ const root = screen.getByTestId("pane-scaffold");
136
+ expect(root).toHaveAttribute("data-pane-layout", "stack");
137
+ expect(screen.getByText("Also")).toBeInTheDocument();
138
+ });
139
+
140
+ it("maxPanes=1 with activePane drops the other pane", () => {
141
+ renderWithProviders(
142
+ <PaneScaffold
143
+ sizeClass="xl"
144
+ maxPanes={1}
145
+ activePane="primary"
146
+ primary={<Paragraph>Only</Paragraph>}
75
147
  secondary={<Paragraph>Hidden</Paragraph>}
76
148
  />,
77
149
  );
@@ -80,7 +152,64 @@ describe("PaneScaffold", () => {
80
152
  });
81
153
  });
82
154
 
155
+ // MPO-235: two scaffolds are how the kit builds three regions, and a phone
156
+ // rendered only the outer primary — the centre and inspector were unreachable.
157
+ describe("PaneScaffold nesting (MPO-235)", () => {
158
+ it("renders all three regions at a 402pt viewport", () => {
159
+ setViewportWidth(402);
160
+ renderWithProviders(<ThreeRegionPage />);
161
+
162
+ expect(screen.getByText("Rail")).toBeInTheDocument();
163
+ expect(screen.getByText("Centre")).toBeInTheDocument();
164
+ expect(screen.getByText("Inspector")).toBeInTheDocument();
165
+
166
+ const scaffolds = screen.getAllByTestId("pane-scaffold");
167
+ expect(scaffolds).toHaveLength(2);
168
+ for (const node of scaffolds) {
169
+ expect(node).toHaveAttribute("data-pane-layout", "stack");
170
+ expect(node).toHaveAttribute("data-size-class", "compact");
171
+ }
172
+ expect(screen.queryAllByTestId("pane-sash")).toHaveLength(0);
173
+ });
174
+
175
+ it("passes the outer size class to the inner scaffold", () => {
176
+ // Viewport stays wide: only the outer override may narrow the inner one.
177
+ setViewportWidth(1440);
178
+ renderWithProviders(<ThreeRegionPage sizeClass="compact" />);
179
+
180
+ expect(screen.getByText("Centre")).toBeInTheDocument();
181
+ expect(screen.getByText("Inspector")).toBeInTheDocument();
182
+ for (const node of screen.getAllByTestId("pane-scaffold")) {
183
+ expect(node).toHaveAttribute("data-pane-layout", "stack");
184
+ }
185
+ });
186
+
187
+ it("still splits both scaffolds when the viewport is wide", () => {
188
+ setViewportWidth(1440);
189
+ renderWithProviders(<ThreeRegionPage />);
190
+
191
+ const scaffolds = screen.getAllByTestId("pane-scaffold");
192
+ expect(scaffolds).toHaveLength(2);
193
+ for (const node of scaffolds) {
194
+ expect(node).toHaveAttribute("data-pane-layout", "split");
195
+ }
196
+ expect(screen.getAllByTestId("pane-sash")).toHaveLength(2);
197
+ });
198
+ });
199
+
83
200
  describe("ListDetailLayout", () => {
201
+ it("keeps the swap idiom on compact: list only until an item is picked", () => {
202
+ renderWithProviders(
203
+ <ListDetailLayout
204
+ sizeClass="compact"
205
+ list={<Paragraph>Items</Paragraph>}
206
+ detail={<Paragraph>Item 1</Paragraph>}
207
+ />,
208
+ );
209
+ expect(screen.getByTestId("pane-scaffold")).toHaveAttribute("data-panes", "1");
210
+ expect(screen.queryByText("Item 1")).not.toBeInTheDocument();
211
+ });
212
+
84
213
  it("flips to detail when selected on compact", () => {
85
214
  renderWithProviders(
86
215
  <ListDetailLayout
@@ -96,6 +225,17 @@ describe("ListDetailLayout", () => {
96
225
  });
97
226
 
98
227
  describe("SupportingPaneLayout", () => {
228
+ it("stacks the supporting pane on compact instead of hiding it", () => {
229
+ renderWithProviders(
230
+ <SupportingPaneLayout sizeClass="compact" supporting={<Paragraph>Meta</Paragraph>}>
231
+ <Paragraph>Body</Paragraph>
232
+ </SupportingPaneLayout>,
233
+ );
234
+ expect(screen.getByTestId("pane-scaffold")).toHaveAttribute("data-pane-layout", "stack");
235
+ expect(screen.getByText("Body")).toBeInTheDocument();
236
+ expect(screen.getByText("Meta")).toBeInTheDocument();
237
+ });
238
+
99
239
  it("renders side-by-side at large", () => {
100
240
  renderWithProviders(
101
241
  <SupportingPaneLayout sizeClass="large" supporting={<Paragraph>Meta</Paragraph>}>
@@ -113,7 +113,7 @@ const meta: Meta<typeof PaneScaffold> = {
113
113
  docs: {
114
114
  description: {
115
115
  component:
116
- "Adaptive pane shell (DG-LAY-01/02). Size classes: compact <640, medium ≥640, expanded ≥860 (FloatingPanel), large ≥1024, xl ≥1280. Two panes from expanded up unless `maxPanes` ejects. Side-by-side uses a hairline sash (Linear / VS Code / Polaris Frame); pass `paneGap` to eject to spaced columns.",
116
+ 'Adaptive TWO-pane shell (DG-LAY-01/02) — `primary` and `secondary`, no more. Size classes: compact <640, medium ≥640, expanded ≥860 (FloatingPanel), large ≥1024, xl ≥1280. Two panes from expanded up unless `maxPanes` ejects. Side-by-side uses a hairline sash (Linear / VS Code / Polaris Frame); pass `paneGap` to eject to spaced columns. Below expanded the panes stack and the sash goes away, so nothing is hidden on a phone; `narrowLayout="swap"` (what `activePane` opts into) is the list-detail exception. Three regions come from nesting a scaffold inside a pane — see the Nested three-region story; the size class rides down, so the inner scaffold stacks with the outer.',
117
117
  },
118
118
  },
119
119
  },
@@ -123,12 +123,12 @@ const meta: Meta<typeof PaneScaffold> = {
123
123
  options: ["compact", "medium", "expanded", "large", "xl"],
124
124
  },
125
125
  activePane: { control: "radio", options: ["primary", "secondary"] },
126
+ narrowLayout: { control: "radio", options: ["stack", "swap"] },
126
127
  maxPanes: { control: "radio", options: [1, 2, undefined] },
127
128
  resizable: { control: "boolean" },
128
129
  },
129
130
  args: {
130
131
  sizeClass: "expanded",
131
- activePane: "primary",
132
132
  },
133
133
  };
134
134
  export default meta;
@@ -150,7 +150,63 @@ export const TwoPane: Story = {
150
150
  ),
151
151
  };
152
152
 
153
+ export const CompactStacked: Story = {
154
+ name: "Compact (stacked)",
155
+ args: { sizeClass: "compact" },
156
+ parameters: {
157
+ docs: {
158
+ description: {
159
+ story:
160
+ "Below the two-pane budget the secondary sits under the primary and the sash is gone. Reflow, not hide.",
161
+ },
162
+ },
163
+ },
164
+ render: (args) => (
165
+ <YStack height={400} padding="$4">
166
+ <SplitFrame>
167
+ <PaneScaffold
168
+ {...args}
169
+ primary={<PaneFill label="Primary" />}
170
+ secondary={<PaneFill label="Secondary" muted />}
171
+ />
172
+ </SplitFrame>
173
+ </YStack>
174
+ ),
175
+ };
176
+
177
+ export const NestedThreeRegion: Story = {
178
+ name: "Nested three-region",
179
+ args: { sizeClass: "compact" },
180
+ parameters: {
181
+ docs: {
182
+ description: {
183
+ story:
184
+ "Rail | (centre | inspector): the recipe for three regions. Switch `sizeClass` to `xl` for two seams side by side; on compact all three stack, none is dropped.",
185
+ },
186
+ },
187
+ },
188
+ render: (args) => (
189
+ <YStack height={520} padding="$4">
190
+ <SplitFrame height={480}>
191
+ <PaneScaffold
192
+ {...args}
193
+ paneFlex={[1, 3]}
194
+ primary={<PaneFill label="Rail" muted />}
195
+ secondary={
196
+ <PaneScaffold
197
+ paneFlex={[2, 1]}
198
+ primary={<PaneFill label="Centre" hint="Main canvas" />}
199
+ secondary={<PaneFill label="Inspector" muted />}
200
+ />
201
+ }
202
+ />
203
+ </SplitFrame>
204
+ </YStack>
205
+ ),
206
+ };
207
+
153
208
  export const CompactActiveSecondary: Story = {
209
+ name: "Compact (swap)",
154
210
  args: { sizeClass: "compact", activePane: "secondary" },
155
211
  render: (args) => (
156
212
  <YStack height={400} padding="$4">
@@ -1,6 +1,11 @@
1
1
  /**
2
2
  * PaneScaffold + canonical layouts (DG-LAY-02) — W11.
3
3
  *
4
+ * PaneScaffold is a TWO-pane scaffold: `primary` and `secondary`, no more.
5
+ * Three regions come from NESTING one scaffold inside a pane of another. The
6
+ * resolved size class rides a context down, so an inner scaffold reflows with
7
+ * the outer one instead of splitting inside a stacked column.
8
+ *
4
9
  * Devs declare pane roles; the scaffold picks 1 vs 2 columns from the
5
10
  * canonical layout size class (`expanded` @ 860 = two-pane budget).
6
11
  *
@@ -13,7 +18,10 @@
13
18
  * - **Supporting-pane**: secondary is meaningful only relative to primary.
14
19
  * - **Feed**: equal-weight cards in a responsive grid.
15
20
  *
16
- * Compact/medium show one pane; pass `activePane` to choose which.
21
+ * Below the two-pane budget the panes STACK (primary above secondary) and the
22
+ * sash goes away — a drag handle is a pointer affordance and there is nothing
23
+ * to drag with a thumb. Hiding a pane is the list-detail navigation idiom, not
24
+ * the responsive default: pass `activePane` (or `narrowLayout="swap"`) for it.
17
25
  */
18
26
 
19
27
  import {
@@ -31,7 +39,17 @@ import {
31
39
  type LayoutSizeClass,
32
40
  READING_WIDTH_CH,
33
41
  } from "@multiplatform.one/theme";
34
- import { Children, useCallback, useEffect, useId, useRef, useState, type ReactNode } from "react";
42
+ import {
43
+ Children,
44
+ createContext,
45
+ useCallback,
46
+ useContext,
47
+ useEffect,
48
+ useId,
49
+ useRef,
50
+ useState,
51
+ type ReactNode,
52
+ } from "react";
35
53
  import type { XStackProps, YStackProps } from "tamagui";
36
54
  import { isWeb, XStack, YStack } from "tamagui";
37
55
  import { useDirection } from "../hooks/useDirection";
@@ -51,10 +69,17 @@ export interface PaneScaffoldProps extends Omit<XStackProps, "children"> {
51
69
  primary: ReactNode;
52
70
  secondary?: ReactNode;
53
71
  /**
54
- * Which pane to show when only one column fits. Default: `primary`.
55
- * List-detail on compact typically flips to `secondary` once an item is selected.
72
+ * Which pane to show when `narrowLayout` is `swap`. Default: `primary`.
73
+ * List-detail on compact typically flips to `secondary` once an item is
74
+ * selected. Passing this prop opts the scaffold into `swap`.
56
75
  */
57
76
  activePane?: PaneRole;
77
+ /**
78
+ * What happens below the two-pane budget. `stack` (the default) puts
79
+ * secondary under primary so no content is unreachable; `swap` renders
80
+ * `activePane` alone, which is the list-detail navigation idiom.
81
+ */
82
+ narrowLayout?: "stack" | "swap";
58
83
  /** Override the default pane budget (compact/medium → 1, expanded+ → 2). */
59
84
  maxPanes?: 1 | 2;
60
85
  /**
@@ -82,6 +107,14 @@ export interface PaneScaffoldProps extends Omit<XStackProps, "children"> {
82
107
  sizeClass?: LayoutSizeClass;
83
108
  }
84
109
 
110
+ /**
111
+ * Resolved size class handed down to nested scaffolds. Without it an inner
112
+ * scaffold reads the WINDOW while the outer one was overridden (Storybook
113
+ * viewport, template test), so a stacked outer could still hold a split
114
+ * inner and the narrow reflow would only go one level deep.
115
+ */
116
+ const PaneSizeClassContext = createContext<LayoutSizeClass | null>(null);
117
+
85
118
  /**
86
119
  * Adaptive one-/two-pane shell. Geometry only — surface colors stay stable
87
120
  * across breakpoints (Material M-L5).
@@ -89,7 +122,8 @@ export interface PaneScaffoldProps extends Omit<XStackProps, "children"> {
89
122
  export function PaneScaffold({
90
123
  primary,
91
124
  secondary,
92
- activePane = "primary",
125
+ activePane: activePaneProp,
126
+ narrowLayout: narrowLayoutProp,
93
127
  maxPanes: maxPanesProp,
94
128
  paneFlex = [1, 1],
95
129
  paneGap,
@@ -102,23 +136,73 @@ export function PaneScaffold({
102
136
  ...rest
103
137
  }: PaneScaffoldProps) {
104
138
  const liveClass = useLayoutSizeClass();
105
- const sizeClass = sizeClassProp ?? liveClass;
139
+ const inheritedClass = useContext(PaneSizeClassContext);
140
+ const sizeClass = sizeClassProp ?? inheritedClass ?? liveClass;
106
141
  // Explicit `maxPanes` is the eject hatch (force 1 or 2 regardless of class).
107
142
  const budget = maxPanesProp ?? defaultMaxPanes(sizeClass);
108
143
  const hasSecondary = secondary !== null && secondary !== undefined;
109
- const multi = budget >= 2 && hasSecondary;
144
+ const split = budget >= 2 && hasSecondary;
110
145
  const gapped = paneGap !== undefined;
111
146
  const gap = gapped ? paneGap : undefined;
112
- const resizable = (resizableProp ?? !gapped) && multi && !gapped;
147
+ const resizable = (resizableProp ?? !gapped) && split && !gapped;
148
+ // `activePane` only decides anything when a pane is dropped, so passing it
149
+ // IS the swap opt-in. Everything else stacks: a scaffold that hides its
150
+ // secondary by default leaves that content unreachable on a phone.
151
+ const narrowLayout = narrowLayoutProp ?? (activePaneProp === undefined ? "stack" : "swap");
152
+ const stacked = !split && hasSecondary && narrowLayout === "stack";
153
+ const [primaryFlex, secondaryFlex] = paneFlex;
113
154
 
114
155
  // flexBasis auto, not the flex:1 shorthand's 0%: react-native-web resets
115
156
  // min-height to 0, so a 0% basis contributes zero intrinsic height inside
116
157
  // auto-height scroll flows (Screen scroll pages) and the scaffold collapses,
117
158
  // painting pane content over whatever follows. Bounded parents still fill
118
159
  // (grow 1) exactly as before.
119
- if (!multi) {
160
+ let content: ReactNode;
161
+ if (stacked) {
162
+ content = (
163
+ <YStack
164
+ flexGrow={1}
165
+ flexShrink={1}
166
+ flexBasis="auto"
167
+ minWidth={0}
168
+ width="100%"
169
+ gap={gap ?? 0}
170
+ data-testid="pane-scaffold"
171
+ data-panes="2"
172
+ data-pane-layout="stack"
173
+ data-size-class={sizeClass}
174
+ data-sash="false"
175
+ {...rest}
176
+ >
177
+ <YStack
178
+ flexGrow={1}
179
+ flexShrink={1}
180
+ flexBasis="auto"
181
+ minWidth={0}
182
+ minHeight={0}
183
+ width="100%"
184
+ {...(gapped ? undefined : paneHairlineBottom)}
185
+ data-testid="pane-primary"
186
+ >
187
+ {primary}
188
+ </YStack>
189
+ <YStack
190
+ flexGrow={1}
191
+ flexShrink={1}
192
+ flexBasis="auto"
193
+ minWidth={0}
194
+ minHeight={0}
195
+ width="100%"
196
+ data-testid="pane-secondary"
197
+ >
198
+ {secondary}
199
+ </YStack>
200
+ </YStack>
201
+ );
202
+ } else if (!split) {
203
+ const activePane = activePaneProp ?? "primary";
120
204
  const shown = activePane === "secondary" && hasSecondary ? secondary : primary;
121
- return (
205
+ content = (
122
206
  <YStack
123
207
  flexGrow={1}
124
208
  flexShrink={1}
@@ -127,62 +211,64 @@ export function PaneScaffold({
127
211
  width="100%"
128
212
  data-testid="pane-scaffold"
129
213
  data-panes="1"
214
+ data-pane-layout="single"
130
215
  data-size-class={sizeClass}
131
216
  {...rest}
132
217
  >
133
218
  {shown}
134
219
  </YStack>
135
220
  );
221
+ } else {
222
+ content = (
223
+ <XStack
224
+ flexGrow={1}
225
+ flexShrink={1}
226
+ flexBasis="auto"
227
+ minWidth={0}
228
+ minHeight={0}
229
+ width="100%"
230
+ alignItems="stretch"
231
+ gap={gap ?? 0}
232
+ position="relative"
233
+ data-testid="pane-scaffold"
234
+ data-panes="2"
235
+ data-pane-layout="split"
236
+ data-size-class={sizeClass}
237
+ data-sash={resizable ? "true" : "false"}
238
+ {...rest}
239
+ >
240
+ {resizable ? (
241
+ <ResizablePanes
242
+ primary={primary}
243
+ secondary={secondary}
244
+ primaryFlex={primaryFlex}
245
+ secondaryFlex={secondaryFlex}
246
+ minFraction={minPaneFraction}
247
+ maxFraction={maxPaneFraction}
248
+ fraction={primaryFractionProp}
249
+ onFractionChange={onPrimaryFractionChange}
250
+ />
251
+ ) : (
252
+ <>
253
+ <YStack
254
+ flex={primaryFlex}
255
+ minWidth={0}
256
+ minHeight={0}
257
+ {...(gapped ? undefined : paneHairlineEnd)}
258
+ data-testid="pane-primary"
259
+ >
260
+ {primary}
261
+ </YStack>
262
+ <YStack flex={secondaryFlex} minWidth={0} minHeight={0} data-testid="pane-secondary">
263
+ {secondary}
264
+ </YStack>
265
+ </>
266
+ )}
267
+ </XStack>
268
+ );
136
269
  }
137
270
 
138
- const [primaryFlex, secondaryFlex] = paneFlex;
139
-
140
- return (
141
- <XStack
142
- flexGrow={1}
143
- flexShrink={1}
144
- flexBasis="auto"
145
- minWidth={0}
146
- minHeight={0}
147
- width="100%"
148
- alignItems="stretch"
149
- gap={gap ?? 0}
150
- position="relative"
151
- data-testid="pane-scaffold"
152
- data-panes="2"
153
- data-size-class={sizeClass}
154
- data-sash={resizable ? "true" : "false"}
155
- {...rest}
156
- >
157
- {resizable ? (
158
- <ResizablePanes
159
- primary={primary}
160
- secondary={secondary}
161
- primaryFlex={primaryFlex}
162
- secondaryFlex={secondaryFlex}
163
- minFraction={minPaneFraction}
164
- maxFraction={maxPaneFraction}
165
- fraction={primaryFractionProp}
166
- onFractionChange={onPrimaryFractionChange}
167
- />
168
- ) : (
169
- <>
170
- <YStack
171
- flex={primaryFlex}
172
- minWidth={0}
173
- minHeight={0}
174
- {...(gapped ? undefined : paneHairlineEnd)}
175
- data-testid="pane-primary"
176
- >
177
- {primary}
178
- </YStack>
179
- <YStack flex={secondaryFlex} minWidth={0} minHeight={0} data-testid="pane-secondary">
180
- {secondary}
181
- </YStack>
182
- </>
183
- )}
184
- </XStack>
185
- );
271
+ return <PaneSizeClassContext.Provider value={sizeClass}>{content}</PaneSizeClassContext.Provider>;
186
272
  }
187
273
 
188
274
  const paneHairlineEnd = isWeb
@@ -194,6 +280,9 @@ const paneHairlineEnd = isWeb
194
280
  }
195
281
  : { borderEndWidth: hairlineWidth, borderColor: "$borderColor" };
196
282
 
283
+ /** Stacked seam: the horizontal twin of `paneHairlineEnd`. */
284
+ const paneHairlineBottom = { ...hairline.bottom, borderColor: "$borderColor" };
285
+
197
286
  function clampFraction(value: number, min: number, max: number): number {
198
287
  return Math.min(max, Math.max(min, value));
199
288
  }
@@ -458,12 +547,17 @@ export interface ListDetailLayoutProps extends Omit<
458
547
  * Canonical list-detail: explorative list + item detail. Detail remains
459
548
  * meaningful without the list (Material M-L4). List is the narrower pane
460
549
  * (Linear issue view / VS Code explorer), not a 50/50 split.
550
+ *
551
+ * Below the two-pane budget this SWAPS rather than stacks — list and detail
552
+ * are two steps of one navigation, so `selected` decides which is on screen.
553
+ * Pass `narrowLayout="stack"` to show both instead.
461
554
  */
462
555
  export function ListDetailLayout({
463
556
  list,
464
557
  detail,
465
558
  selected = false,
466
559
  activePane,
560
+ narrowLayout,
467
561
  ...rest
468
562
  }: ListDetailLayoutProps) {
469
563
  return (
@@ -472,6 +566,7 @@ export function ListDetailLayout({
472
566
  secondary={detail}
473
567
  paneFlex={[1, 2]}
474
568
  activePane={activePane ?? (selected ? "secondary" : "primary")}
569
+ narrowLayout={narrowLayout ?? "swap"}
475
570
  data-canonical="list-detail"
476
571
  {...rest}
477
572
  />
@@ -493,6 +588,9 @@ export interface SupportingPaneLayoutProps extends Omit<
493
588
  * Canonical supporting-pane: primary content + contextual support (~⅔ / ⅓).
494
589
  * Supporting content is only meaningful relative to primary (Material M-L4).
495
590
  * Seam is a hairline (Polaris Frame navigation / Linear properties column).
591
+ *
592
+ * Below the two-pane budget the supporting content stacks under the primary.
593
+ * It is never dropped: it has no screen of its own to be reached from.
496
594
  */
497
595
  export function SupportingPaneLayout({ children, supporting, ...rest }: SupportingPaneLayoutProps) {
498
596
  return (
@@ -26,16 +26,10 @@ export const Default: Story = {
26
26
  name: "Main",
27
27
  render: () => (
28
28
  <ScreenToolbar
29
- leading={
30
- <Button compact variant="outlined">
31
- Back
32
- </Button>
33
- }
29
+ leading={<Button compact>Back</Button>}
34
30
  trailing={
35
31
  <>
36
- <Button compact variant="outlined">
37
- Cancel
38
- </Button>
32
+ <Button compact>Cancel</Button>
39
33
  <Button compact>Save</Button>
40
34
  </>
41
35
  }
@@ -59,7 +53,6 @@ export const DisabledAndLoading: Story = {
59
53
  // the toolbar row's shared control height.
60
54
  <Button
61
55
  compact
62
- variant="outlined"
63
56
  disabled
64
57
  disabledReason="No screen to go back to"
65
58
  disabledReasonPlacement="inline"
@@ -82,22 +75,12 @@ export const ManyActionsNarrow: Story = {
82
75
  render: () => (
83
76
  <YStack maxWidth={320} borderWidth={1} borderColor="$color6" borderStyle="dashed">
84
77
  <ScreenToolbar
85
- leading={
86
- <Button compact variant="outlined">
87
- Back to the previous screen
88
- </Button>
89
- }
78
+ leading={<Button compact>Back to the previous screen</Button>}
90
79
  trailing={
91
80
  <>
92
- <Button compact variant="outlined">
93
- Duplicate
94
- </Button>
95
- <Button compact variant="outlined">
96
- Archive
97
- </Button>
98
- <Button compact variant="outlined">
99
- Delete permanently
100
- </Button>
81
+ <Button compact>Duplicate</Button>
82
+ <Button compact>Archive</Button>
83
+ <Button compact>Delete permanently</Button>
101
84
  <Button compact>Save changes</Button>
102
85
  </>
103
86
  }
@@ -12,6 +12,17 @@ export * from "./page";
12
12
  export * from "./pageHeadingScope";
13
13
  export * from "./PageTemplates";
14
14
  export * from "./PaneScaffold";
15
+ // EmptyState is NAMED here rather than left to reach the barrel through
16
+ // `export * from "./page"` (page.tsx re-exports it, so it has always been
17
+ // importable from @multiplatform.one/components — MPO-223's "not exported"
18
+ // premise was wrong, measured against published 7.7.1). Naming it is still
19
+ // worth doing: reachability that rides a transitive star through an unrelated
20
+ // module is the fragility that dropped ProgressCard twice (MPO-53, 5c7af7134),
21
+ // and it reads as absent to anyone grepping this file, which is how a consumer
22
+ // talked itself into a deep `src/layouts/EmptyState` import. `layouts.spec.tsx`
23
+ // asserts every module in this directory is reachable from here, so the next
24
+ // omission fails a test.
25
+ export { EmptyState, type EmptyStateProps } from "./EmptyState";
15
26
  export {
16
27
  AsyncBoundary,
17
28
  AsyncSkeleton,