@multiplatform.one/components 7.7.4 → 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 (849) hide show
  1. package/dist/cjs/Accordion/index.cjs +4 -0
  2. package/dist/cjs/Accordion/index.native.js +5 -1
  3. package/dist/cjs/Accordion/index.native.js.map +1 -1
  4. package/dist/cjs/Alert/index.native.js.map +1 -1
  5. package/dist/cjs/AnimateHeight/index.cjs +29 -2
  6. package/dist/cjs/AnimateHeight/index.native.js +30 -2
  7. package/dist/cjs/AnimateHeight/index.native.js.map +1 -1
  8. package/dist/cjs/Avatar/getInitials.native.js.map +1 -1
  9. package/dist/cjs/Avatar/index.native.js.map +1 -1
  10. package/dist/cjs/Badge/index.native.js.map +1 -1
  11. package/dist/cjs/Button.native.js.map +1 -1
  12. package/dist/cjs/Card.cjs +7 -1
  13. package/dist/cjs/Card.native.js +11 -1
  14. package/dist/cjs/Card.native.js.map +1 -1
  15. package/dist/cjs/CardFooter.cjs +1 -0
  16. package/dist/cjs/CardFooter.native.js +1 -0
  17. package/dist/cjs/CardFooter.native.js.map +1 -1
  18. package/dist/cjs/CardHeader.native.js.map +1 -1
  19. package/dist/cjs/Carousel/index.native.js +1 -1
  20. package/dist/cjs/Carousel/index.native.js.map +1 -1
  21. package/dist/cjs/Chip/index.native.js.map +1 -1
  22. package/dist/cjs/Collapsible.cjs +48 -0
  23. package/dist/cjs/Collapsible.native.js +56 -0
  24. package/dist/cjs/Collapsible.native.js.map +1 -0
  25. package/dist/cjs/ContextMenu/index.native.js.map +1 -1
  26. package/dist/cjs/CopyField/index.cjs +6 -1
  27. package/dist/cjs/CopyField/index.native.js +6 -1
  28. package/dist/cjs/CopyField/index.native.js.map +1 -1
  29. package/dist/cjs/DotIndicator/index.native.js.map +1 -1
  30. package/dist/cjs/DropdownMenu/index.cjs +31 -1
  31. package/dist/cjs/DropdownMenu/index.native.js +31 -1
  32. package/dist/cjs/DropdownMenu/index.native.js.map +1 -1
  33. package/dist/cjs/ErrorBoundary/index.native.js.map +1 -1
  34. package/dist/cjs/Heading.native.js.map +1 -1
  35. package/dist/cjs/Meter/index.cjs +12 -5
  36. package/dist/cjs/Meter/index.native.js +13 -6
  37. package/dist/cjs/Meter/index.native.js.map +1 -1
  38. package/dist/cjs/Meter/meter.native.js.map +1 -1
  39. package/dist/cjs/Pagination.cjs +28 -9
  40. package/dist/cjs/Pagination.native.js +29 -10
  41. package/dist/cjs/Pagination.native.js.map +1 -1
  42. package/dist/cjs/ProgressSteps/index.native.js.map +1 -1
  43. package/dist/cjs/Quote/index.native.js.map +1 -1
  44. package/dist/cjs/Separator/index.native.js.map +1 -1
  45. package/dist/cjs/SheetModal/detents.native.js.map +1 -1
  46. package/dist/cjs/Skeleton/index.native.js.map +1 -1
  47. package/dist/cjs/SkipLink/index.native.js.map +1 -1
  48. package/dist/cjs/SortableList/SortableHandle.native.js.map +1 -1
  49. package/dist/cjs/SortableList/index.native.js.map +1 -1
  50. package/dist/cjs/SortableList/useSortableRows.native.js.map +1 -1
  51. package/dist/cjs/Tabs/index.cjs +145 -91
  52. package/dist/cjs/Tabs/index.native.js +187 -123
  53. package/dist/cjs/Tabs/index.native.js.map +1 -1
  54. package/dist/cjs/Text.native.js.map +1 -1
  55. package/dist/cjs/Toast/index.cjs +53 -2
  56. package/dist/cjs/Toast/index.native.js +55 -2
  57. package/dist/cjs/Toast/index.native.js.map +1 -1
  58. package/dist/cjs/Toast/store.native.js.map +1 -1
  59. package/dist/cjs/Tooltip/nativePress.native.js.map +1 -1
  60. package/dist/cjs/Tooltip/tooltipShared.native.js.map +1 -1
  61. package/dist/cjs/TreeSelect/index.native.js +1 -1
  62. package/dist/cjs/TreeSelect/index.native.js.map +1 -1
  63. package/dist/cjs/TreeSelect/treeSelectModel.native.js.map +1 -1
  64. package/dist/cjs/Video/PlayerChrome.native.js.map +1 -1
  65. package/dist/cjs/Video/VideoFrame.native.js.map +1 -1
  66. package/dist/cjs/Video/types.native.js.map +1 -1
  67. package/dist/cjs/Wheel/index.native.js.map +1 -1
  68. package/dist/cjs/Wizard/index.native.js +2 -2
  69. package/dist/cjs/Wizard/index.native.js.map +1 -1
  70. package/dist/cjs/actions/ActionBar.native.js.map +1 -1
  71. package/dist/cjs/actions/DestructiveAction.cjs +7 -13
  72. package/dist/cjs/actions/DestructiveAction.native.js +7 -15
  73. package/dist/cjs/actions/DestructiveAction.native.js.map +1 -1
  74. package/dist/cjs/actions/devWarn.native.js.map +1 -1
  75. package/dist/cjs/actions/index.native.js.map +1 -1
  76. package/dist/cjs/actions/severity.native.js.map +1 -1
  77. package/dist/cjs/charts/Axis.cjs +5 -0
  78. package/dist/cjs/charts/Axis.native.js +5 -0
  79. package/dist/cjs/charts/Axis.native.js.map +1 -1
  80. package/dist/cjs/charts/BarChart.cjs +71 -57
  81. package/dist/cjs/charts/BarChart.native.js +81 -67
  82. package/dist/cjs/charts/BarChart.native.js.map +1 -1
  83. package/dist/cjs/charts/ChartDataView.cjs +212 -0
  84. package/dist/cjs/charts/ChartDataView.native.js +224 -0
  85. package/dist/cjs/charts/ChartDataView.native.js.map +1 -0
  86. package/dist/cjs/charts/ChartSurface.cjs +5 -1
  87. package/dist/cjs/charts/ChartSurface.native.js +5 -1
  88. package/dist/cjs/charts/ChartSurface.native.js.map +1 -1
  89. package/dist/cjs/charts/LineChart.cjs +81 -67
  90. package/dist/cjs/charts/LineChart.native.js +94 -80
  91. package/dist/cjs/charts/LineChart.native.js.map +1 -1
  92. package/dist/cjs/charts/PieChart.cjs +98 -73
  93. package/dist/cjs/charts/PieChart.native.js +109 -84
  94. package/dist/cjs/charts/PieChart.native.js.map +1 -1
  95. package/dist/cjs/charts/Sparkline.cjs +10 -1
  96. package/dist/cjs/charts/Sparkline.native.js +10 -1
  97. package/dist/cjs/charts/Sparkline.native.js.map +1 -1
  98. package/dist/cjs/charts/accessibility.cjs +4 -0
  99. package/dist/cjs/charts/accessibility.native.js +7 -0
  100. package/dist/cjs/charts/accessibility.native.js.map +1 -1
  101. package/dist/cjs/charts/composeChart.native.js.map +1 -1
  102. package/dist/cjs/charts/index.cjs +3 -1
  103. package/dist/cjs/charts/index.native.js +2 -0
  104. package/dist/cjs/charts/index.native.js.map +1 -1
  105. package/dist/cjs/charts/math.cjs +16 -0
  106. package/dist/cjs/charts/math.native.js +18 -0
  107. package/dist/cjs/charts/math.native.js.map +1 -1
  108. package/dist/cjs/charts/series.cjs +49 -7
  109. package/dist/cjs/charts/series.native.js +53 -11
  110. package/dist/cjs/charts/series.native.js.map +1 -1
  111. package/dist/cjs/charts/svg.cjs +46 -3
  112. package/dist/cjs/charts/svg.native.js +46 -3
  113. package/dist/cjs/charts/svg.native.js.map +1 -1
  114. package/dist/cjs/charts/types.native.js.map +1 -1
  115. package/dist/cjs/charts/useChartTheme.native.js.map +1 -1
  116. package/dist/cjs/code/Code/index.native.js.map +1 -1
  117. package/dist/cjs/code/CodeBlock/index.cjs +6 -1
  118. package/dist/cjs/code/CodeBlock/index.native.js +12 -7
  119. package/dist/cjs/code/CodeBlock/index.native.js.map +1 -1
  120. package/dist/cjs/code/HighlightedCode/index.native.js.map +1 -1
  121. package/dist/cjs/code/Highlighter/index.native.js.map +1 -1
  122. package/dist/cjs/code/Pre/index.native.js.map +1 -1
  123. package/dist/cjs/code/index.native.js +5 -5
  124. package/dist/cjs/code/index.native.js.map +1 -1
  125. package/dist/cjs/componentColors.native.js.map +1 -1
  126. package/dist/cjs/feedback/ConfirmDialog.cjs +7 -21
  127. package/dist/cjs/feedback/ConfirmDialog.native.js +7 -22
  128. package/dist/cjs/feedback/ConfirmDialog.native.js.map +1 -1
  129. package/dist/cjs/feedback/NotifyHost.cjs +2 -1
  130. package/dist/cjs/feedback/NotifyHost.native.js +5 -4
  131. package/dist/cjs/feedback/NotifyHost.native.js.map +1 -1
  132. package/dist/cjs/feedback/copy.cjs +36 -4
  133. package/dist/cjs/feedback/copy.native.js +38 -4
  134. package/dist/cjs/feedback/copy.native.js.map +1 -1
  135. package/dist/cjs/feedback/index.cjs +1 -0
  136. package/dist/cjs/feedback/index.native.js +1 -0
  137. package/dist/cjs/feedback/index.native.js.map +1 -1
  138. package/dist/cjs/feedback/notify.cjs +1 -0
  139. package/dist/cjs/feedback/notify.native.js +1 -0
  140. package/dist/cjs/feedback/notify.native.js.map +1 -1
  141. package/dist/cjs/feedback/route.cjs +3 -0
  142. package/dist/cjs/feedback/route.native.js +3 -0
  143. package/dist/cjs/feedback/route.native.js.map +1 -1
  144. package/dist/cjs/feedback/store.cjs +6 -0
  145. package/dist/cjs/feedback/store.native.js +8 -0
  146. package/dist/cjs/feedback/store.native.js.map +1 -1
  147. package/dist/cjs/hooks/index.native.js +1 -1
  148. package/dist/cjs/hooks/index.native.js.map +1 -1
  149. package/dist/cjs/hooks/useClipboard.native.js.map +1 -1
  150. package/dist/cjs/hooks/useDocumentTitle.native.js.map +1 -1
  151. package/dist/cjs/icons/CheckRegular.native.js.map +1 -1
  152. package/dist/cjs/icons/MinusRegular.native.js.map +1 -1
  153. package/dist/cjs/icons/index.native.js.map +1 -1
  154. package/dist/cjs/icons/lucide.cjs +2 -1
  155. package/dist/cjs/icons/lucide.native.js +2 -1
  156. package/dist/cjs/icons/lucide.native.js.map +1 -1
  157. package/dist/cjs/icons/themed.native.js.map +1 -1
  158. package/dist/cjs/images/Image/ImageFrame.native.js +1 -1
  159. package/dist/cjs/images/Image/ImageFrame.native.js.map +1 -1
  160. package/dist/cjs/images/Image/index.native.js +1 -1
  161. package/dist/cjs/images/Image/shared.native.js +1 -1
  162. package/dist/cjs/images/Image/shared.native.js.map +1 -1
  163. package/dist/cjs/images/Image/types.native.js.map +1 -1
  164. package/dist/cjs/images/index.native.js.map +1 -1
  165. package/dist/cjs/index.native.js +29 -29
  166. package/dist/cjs/index.native.js.map +1 -1
  167. package/dist/cjs/knobImmuneExports.cjs +0 -1
  168. package/dist/cjs/knobImmuneExports.native.js +0 -1
  169. package/dist/cjs/knobImmuneExports.native.js.map +1 -1
  170. package/dist/cjs/layouts/AsyncBoundary.native.js +2 -2
  171. package/dist/cjs/layouts/AsyncBoundary.native.js.map +1 -1
  172. package/dist/cjs/layouts/Debug/index.native.js.map +1 -1
  173. package/dist/cjs/layouts/EmptyState.native.js.map +1 -1
  174. package/dist/cjs/layouts/KeyboardAvoidingWrapper/behavior.native.js.map +1 -1
  175. package/dist/cjs/layouts/PageTemplates.native.js.map +1 -1
  176. package/dist/cjs/layouts/PaneScaffold.cjs +96 -41
  177. package/dist/cjs/layouts/PaneScaffold.native.js +97 -41
  178. package/dist/cjs/layouts/PaneScaffold.native.js.map +1 -1
  179. package/dist/cjs/layouts/SafeAreaWrapper/insets.native.js.map +1 -1
  180. package/dist/cjs/layouts/ViewSwitcher.native.js.map +1 -1
  181. package/dist/cjs/layouts/attachments.native.js +1 -1
  182. package/dist/cjs/layouts/attachments.native.js.map +1 -1
  183. package/dist/cjs/layouts/breadcrumbs.native.js.map +1 -1
  184. package/dist/cjs/layouts/index.cjs +2 -0
  185. package/dist/cjs/layouts/index.native.js +5 -3
  186. package/dist/cjs/layouts/index.native.js.map +1 -1
  187. package/dist/cjs/layouts/page.cjs +48 -7
  188. package/dist/cjs/layouts/page.native.js +50 -7
  189. package/dist/cjs/layouts/page.native.js.map +1 -1
  190. package/dist/cjs/layouts/pageHeadingScope.native.js.map +1 -1
  191. package/dist/cjs/layouts/sidebar.native.js.map +1 -1
  192. package/dist/cjs/layouts/tags.native.js +1 -1
  193. package/dist/cjs/layouts/tags.native.js.map +1 -1
  194. package/dist/cjs/layouts/timeline.native.js +2 -2
  195. package/dist/cjs/layouts/timeline.native.js.map +1 -1
  196. package/dist/cjs/layouts/toolbar.native.js.map +1 -1
  197. package/dist/cjs/shared/actionScan.native.js.map +1 -1
  198. package/dist/cjs/shared/i18n.native.js.map +1 -1
  199. package/dist/cjs/shared/t.native.js.map +1 -1
  200. package/dist/cjs/shared/textRidesText.native.js.map +1 -1
  201. package/dist/cjs/shared/useKeyboardInset.cjs +1 -19
  202. package/dist/cjs/shared/useKeyboardInset.native.js +3 -3
  203. package/dist/cjs/shared/useKeyboardInset.native.js.map +1 -1
  204. package/dist/cjs/shared/useReturnFocusOnClose.native.js.map +1 -1
  205. package/dist/cjs/surfaces.native.js +1 -1
  206. package/dist/cjs/surfaces.native.js.map +1 -1
  207. package/dist/cjs/tamagui.cjs +3 -2
  208. package/dist/cjs/tamagui.native.js +2 -1
  209. package/dist/cjs/tamagui.native.js.map +1 -1
  210. package/dist/cjs/testSetup.native.js.map +1 -1
  211. package/dist/cjs/utils/setTinted.native.js.map +1 -1
  212. package/dist/cjs/utils/unwrapText.native.js.map +1 -1
  213. package/dist/cjs/views/Calendar.native.js.map +1 -1
  214. package/dist/cjs/views/Dashboard.cjs +110 -17
  215. package/dist/cjs/views/Dashboard.native.js +152 -46
  216. package/dist/cjs/views/Dashboard.native.js.map +1 -1
  217. package/dist/cjs/views/Gantt.cjs +374 -91
  218. package/dist/cjs/views/Gantt.native.js +444 -95
  219. package/dist/cjs/views/Gantt.native.js.map +1 -1
  220. package/dist/cjs/views/ImageGrid.native.js +1 -1
  221. package/dist/cjs/views/ImageGrid.native.js.map +1 -1
  222. package/dist/cjs/views/List.native.js.map +1 -1
  223. package/dist/cjs/views/ReportBuilder.native.js +1 -1
  224. package/dist/cjs/views/ReportBuilder.native.js.map +1 -1
  225. package/dist/cjs/views/TreeView.native.js.map +1 -1
  226. package/dist/cjs/views/calendarMath.native.js.map +1 -1
  227. package/dist/cjs/views/ganttMath.cjs +91 -2
  228. package/dist/cjs/views/ganttMath.native.js +113 -3
  229. package/dist/cjs/views/ganttMath.native.js.map +1 -1
  230. package/dist/cjs/views/index.cjs +20 -1
  231. package/dist/cjs/views/index.native.js +21 -2
  232. package/dist/cjs/views/index.native.js.map +1 -1
  233. package/dist/cjs/views/kanbanDnd.native.js.map +1 -1
  234. package/dist/cjs/views/treeViewDnd.native.js.map +1 -1
  235. package/dist/cjs/views/treeViewLayout.native.js.map +1 -1
  236. package/dist/cjs/views/treeViewMotion.native.js.map +1 -1
  237. package/dist/esm/Accordion/index.mjs +4 -0
  238. package/dist/esm/Accordion/index.mjs.map +1 -1
  239. package/dist/esm/Accordion/index.native.js +4 -0
  240. package/dist/esm/Accordion/index.native.js.map +1 -1
  241. package/dist/esm/AnimateHeight/index.mjs +29 -2
  242. package/dist/esm/AnimateHeight/index.mjs.map +1 -1
  243. package/dist/esm/AnimateHeight/index.native.js +30 -2
  244. package/dist/esm/AnimateHeight/index.native.js.map +1 -1
  245. package/dist/esm/Avatar/getInitials.native.js.map +1 -1
  246. package/dist/esm/Avatar/index.native.js.map +1 -1
  247. package/dist/esm/Badge/index.native.js.map +1 -1
  248. package/dist/esm/Button.mjs.map +1 -1
  249. package/dist/esm/Button.native.js.map +1 -1
  250. package/dist/esm/Card.mjs +8 -2
  251. package/dist/esm/Card.mjs.map +1 -1
  252. package/dist/esm/Card.native.js +12 -2
  253. package/dist/esm/Card.native.js.map +1 -1
  254. package/dist/esm/CardFooter.mjs +1 -0
  255. package/dist/esm/CardFooter.mjs.map +1 -1
  256. package/dist/esm/CardFooter.native.js +1 -0
  257. package/dist/esm/CardFooter.native.js.map +1 -1
  258. package/dist/esm/Carousel/index.native.js.map +1 -1
  259. package/dist/esm/Chip/index.native.js.map +1 -1
  260. package/dist/esm/Collapsible.mjs +23 -0
  261. package/dist/esm/Collapsible.mjs.map +1 -0
  262. package/dist/esm/Collapsible.native.js +28 -0
  263. package/dist/esm/Collapsible.native.js.map +1 -0
  264. package/dist/esm/ContextMenu/index.native.js.map +1 -1
  265. package/dist/esm/CopyField/index.mjs +7 -2
  266. package/dist/esm/CopyField/index.mjs.map +1 -1
  267. package/dist/esm/CopyField/index.native.js +7 -2
  268. package/dist/esm/CopyField/index.native.js.map +1 -1
  269. package/dist/esm/DotIndicator/index.native.js.map +1 -1
  270. package/dist/esm/DropdownMenu/index.mjs +32 -2
  271. package/dist/esm/DropdownMenu/index.mjs.map +1 -1
  272. package/dist/esm/DropdownMenu/index.native.js +32 -2
  273. package/dist/esm/DropdownMenu/index.native.js.map +1 -1
  274. package/dist/esm/ErrorBoundary/index.native.js.map +1 -1
  275. package/dist/esm/Heading.native.js.map +1 -1
  276. package/dist/esm/Meter/index.mjs +12 -5
  277. package/dist/esm/Meter/index.mjs.map +1 -1
  278. package/dist/esm/Meter/index.native.js +12 -5
  279. package/dist/esm/Meter/index.native.js.map +1 -1
  280. package/dist/esm/Meter/meter.native.js.map +1 -1
  281. package/dist/esm/Pagination.mjs +28 -9
  282. package/dist/esm/Pagination.mjs.map +1 -1
  283. package/dist/esm/Pagination.native.js +28 -9
  284. package/dist/esm/Pagination.native.js.map +1 -1
  285. package/dist/esm/ProgressSteps/index.native.js.map +1 -1
  286. package/dist/esm/Quote/index.native.js.map +1 -1
  287. package/dist/esm/Separator/index.native.js.map +1 -1
  288. package/dist/esm/SheetModal/detents.native.js.map +1 -1
  289. package/dist/esm/Skeleton/index.native.js.map +1 -1
  290. package/dist/esm/SkipLink/index.native.js.map +1 -1
  291. package/dist/esm/SortableList/SortableHandle.native.js.map +1 -1
  292. package/dist/esm/SortableList/index.native.js.map +1 -1
  293. package/dist/esm/SortableList/useSortableRows.native.js.map +1 -1
  294. package/dist/esm/Tabs/index.mjs +145 -91
  295. package/dist/esm/Tabs/index.mjs.map +1 -1
  296. package/dist/esm/Tabs/index.native.js +187 -123
  297. package/dist/esm/Tabs/index.native.js.map +1 -1
  298. package/dist/esm/Text.native.js.map +1 -1
  299. package/dist/esm/Toast/index.mjs +52 -3
  300. package/dist/esm/Toast/index.mjs.map +1 -1
  301. package/dist/esm/Toast/index.native.js +54 -3
  302. package/dist/esm/Toast/index.native.js.map +1 -1
  303. package/dist/esm/Toast/store.native.js.map +1 -1
  304. package/dist/esm/Tooltip/nativePress.native.js.map +1 -1
  305. package/dist/esm/Tooltip/tooltipShared.native.js.map +1 -1
  306. package/dist/esm/TreeSelect/index.native.js.map +1 -1
  307. package/dist/esm/TreeSelect/treeSelectModel.native.js.map +1 -1
  308. package/dist/esm/Video/PlayerChrome.native.js.map +1 -1
  309. package/dist/esm/Video/VideoFrame.native.js.map +1 -1
  310. package/dist/esm/Video/types.native.js.map +1 -1
  311. package/dist/esm/Wheel/index.native.js.map +1 -1
  312. package/dist/esm/Wizard/index.native.js.map +1 -1
  313. package/dist/esm/actions/ActionBar.native.js.map +1 -1
  314. package/dist/esm/actions/DestructiveAction.mjs +8 -14
  315. package/dist/esm/actions/DestructiveAction.mjs.map +1 -1
  316. package/dist/esm/actions/DestructiveAction.native.js +8 -16
  317. package/dist/esm/actions/DestructiveAction.native.js.map +1 -1
  318. package/dist/esm/actions/devWarn.native.js.map +1 -1
  319. package/dist/esm/actions/index.native.js.map +1 -1
  320. package/dist/esm/actions/severity.native.js.map +1 -1
  321. package/dist/esm/charts/Axis.mjs +6 -1
  322. package/dist/esm/charts/Axis.mjs.map +1 -1
  323. package/dist/esm/charts/Axis.native.js +6 -1
  324. package/dist/esm/charts/Axis.native.js.map +1 -1
  325. package/dist/esm/charts/BarChart.mjs +72 -58
  326. package/dist/esm/charts/BarChart.mjs.map +1 -1
  327. package/dist/esm/charts/BarChart.native.js +82 -68
  328. package/dist/esm/charts/BarChart.native.js.map +1 -1
  329. package/dist/esm/charts/ChartDataView.mjs +185 -0
  330. package/dist/esm/charts/ChartDataView.mjs.map +1 -0
  331. package/dist/esm/charts/ChartDataView.native.js +194 -0
  332. package/dist/esm/charts/ChartDataView.native.js.map +1 -0
  333. package/dist/esm/charts/ChartSurface.mjs +5 -1
  334. package/dist/esm/charts/ChartSurface.mjs.map +1 -1
  335. package/dist/esm/charts/ChartSurface.native.js +5 -1
  336. package/dist/esm/charts/ChartSurface.native.js.map +1 -1
  337. package/dist/esm/charts/LineChart.mjs +82 -68
  338. package/dist/esm/charts/LineChart.mjs.map +1 -1
  339. package/dist/esm/charts/LineChart.native.js +95 -81
  340. package/dist/esm/charts/LineChart.native.js.map +1 -1
  341. package/dist/esm/charts/PieChart.mjs +100 -75
  342. package/dist/esm/charts/PieChart.mjs.map +1 -1
  343. package/dist/esm/charts/PieChart.native.js +111 -86
  344. package/dist/esm/charts/PieChart.native.js.map +1 -1
  345. package/dist/esm/charts/Sparkline.mjs +11 -2
  346. package/dist/esm/charts/Sparkline.mjs.map +1 -1
  347. package/dist/esm/charts/Sparkline.native.js +11 -2
  348. package/dist/esm/charts/Sparkline.native.js.map +1 -1
  349. package/dist/esm/charts/accessibility.mjs +4 -1
  350. package/dist/esm/charts/accessibility.mjs.map +1 -1
  351. package/dist/esm/charts/accessibility.native.js +7 -1
  352. package/dist/esm/charts/accessibility.native.js.map +1 -1
  353. package/dist/esm/charts/composeChart.native.js.map +1 -1
  354. package/dist/esm/charts/index.mjs +2 -1
  355. package/dist/esm/charts/index.mjs.map +1 -1
  356. package/dist/esm/charts/index.native.js +2 -1
  357. package/dist/esm/charts/index.native.js.map +1 -1
  358. package/dist/esm/charts/math.mjs +16 -1
  359. package/dist/esm/charts/math.mjs.map +1 -1
  360. package/dist/esm/charts/math.native.js +18 -1
  361. package/dist/esm/charts/math.native.js.map +1 -1
  362. package/dist/esm/charts/series.mjs +51 -9
  363. package/dist/esm/charts/series.mjs.map +1 -1
  364. package/dist/esm/charts/series.native.js +55 -13
  365. package/dist/esm/charts/series.native.js.map +1 -1
  366. package/dist/esm/charts/svg.mjs +40 -4
  367. package/dist/esm/charts/svg.mjs.map +1 -1
  368. package/dist/esm/charts/svg.native.js +40 -4
  369. package/dist/esm/charts/svg.native.js.map +1 -1
  370. package/dist/esm/charts/types.native.js.map +1 -1
  371. package/dist/esm/charts/useChartTheme.native.js.map +1 -1
  372. package/dist/esm/code/CodeBlock/index.mjs +7 -2
  373. package/dist/esm/code/CodeBlock/index.mjs.map +1 -1
  374. package/dist/esm/code/CodeBlock/index.native.js +7 -2
  375. package/dist/esm/code/CodeBlock/index.native.js.map +1 -1
  376. package/dist/esm/code/HighlightedCode/index.native.js.map +1 -1
  377. package/dist/esm/code/Highlighter/index.native.js.map +1 -1
  378. package/dist/esm/code/Pre/index.native.js.map +1 -1
  379. package/dist/esm/code/index.native.js.map +1 -1
  380. package/dist/esm/componentColors.native.js.map +1 -1
  381. package/dist/esm/feedback/ConfirmDialog.mjs +8 -22
  382. package/dist/esm/feedback/ConfirmDialog.mjs.map +1 -1
  383. package/dist/esm/feedback/ConfirmDialog.native.js +8 -23
  384. package/dist/esm/feedback/ConfirmDialog.native.js.map +1 -1
  385. package/dist/esm/feedback/NotifyHost.mjs +2 -1
  386. package/dist/esm/feedback/NotifyHost.mjs.map +1 -1
  387. package/dist/esm/feedback/NotifyHost.native.js +3 -2
  388. package/dist/esm/feedback/NotifyHost.native.js.map +1 -1
  389. package/dist/esm/feedback/copy.mjs +35 -4
  390. package/dist/esm/feedback/copy.mjs.map +1 -1
  391. package/dist/esm/feedback/copy.native.js +37 -4
  392. package/dist/esm/feedback/copy.native.js.map +1 -1
  393. package/dist/esm/feedback/index.mjs +2 -2
  394. package/dist/esm/feedback/index.mjs.map +1 -1
  395. package/dist/esm/feedback/index.native.js +2 -2
  396. package/dist/esm/feedback/index.native.js.map +1 -1
  397. package/dist/esm/feedback/notify.mjs +1 -0
  398. package/dist/esm/feedback/notify.mjs.map +1 -1
  399. package/dist/esm/feedback/notify.native.js +1 -0
  400. package/dist/esm/feedback/notify.native.js.map +1 -1
  401. package/dist/esm/feedback/route.mjs +3 -0
  402. package/dist/esm/feedback/route.mjs.map +1 -1
  403. package/dist/esm/feedback/route.native.js +3 -0
  404. package/dist/esm/feedback/route.native.js.map +1 -1
  405. package/dist/esm/feedback/store.mjs +6 -1
  406. package/dist/esm/feedback/store.mjs.map +1 -1
  407. package/dist/esm/feedback/store.native.js +8 -1
  408. package/dist/esm/feedback/store.native.js.map +1 -1
  409. package/dist/esm/hooks/index.native.js.map +1 -1
  410. package/dist/esm/hooks/useClipboard.native.js.map +1 -1
  411. package/dist/esm/hooks/useDocumentTitle.native.js.map +1 -1
  412. package/dist/esm/icons/CheckRegular.native.js.map +1 -1
  413. package/dist/esm/icons/MinusRegular.native.js.map +1 -1
  414. package/dist/esm/icons/index.native.js.map +1 -1
  415. package/dist/esm/icons/lucide.mjs +2 -2
  416. package/dist/esm/icons/lucide.mjs.map +1 -1
  417. package/dist/esm/icons/lucide.native.js +2 -2
  418. package/dist/esm/icons/lucide.native.js.map +1 -1
  419. package/dist/esm/icons/themed.native.js.map +1 -1
  420. package/dist/esm/images/Image/ImageFrame.native.js.map +1 -1
  421. package/dist/esm/images/Image/shared.native.js.map +1 -1
  422. package/dist/esm/images/Image/types.native.js.map +1 -1
  423. package/dist/esm/images/index.native.js.map +1 -1
  424. package/dist/esm/index.native.js.map +1 -1
  425. package/dist/esm/knobImmuneExports.mjs +0 -1
  426. package/dist/esm/knobImmuneExports.mjs.map +1 -1
  427. package/dist/esm/knobImmuneExports.native.js +0 -1
  428. package/dist/esm/knobImmuneExports.native.js.map +1 -1
  429. package/dist/esm/layouts/AsyncBoundary.native.js.map +1 -1
  430. package/dist/esm/layouts/Debug/index.native.js.map +1 -1
  431. package/dist/esm/layouts/EmptyState.native.js.map +1 -1
  432. package/dist/esm/layouts/KeyboardAvoidingWrapper/behavior.native.js.map +1 -1
  433. package/dist/esm/layouts/PageTemplates.native.js.map +1 -1
  434. package/dist/esm/layouts/PaneScaffold.mjs +97 -42
  435. package/dist/esm/layouts/PaneScaffold.mjs.map +1 -1
  436. package/dist/esm/layouts/PaneScaffold.native.js +98 -42
  437. package/dist/esm/layouts/PaneScaffold.native.js.map +1 -1
  438. package/dist/esm/layouts/SafeAreaWrapper/insets.native.js.map +1 -1
  439. package/dist/esm/layouts/ViewSwitcher.native.js.map +1 -1
  440. package/dist/esm/layouts/attachments.native.js.map +1 -1
  441. package/dist/esm/layouts/breadcrumbs.native.js.map +1 -1
  442. package/dist/esm/layouts/index.mjs +2 -1
  443. package/dist/esm/layouts/index.mjs.map +1 -1
  444. package/dist/esm/layouts/index.native.js +2 -1
  445. package/dist/esm/layouts/index.native.js.map +1 -1
  446. package/dist/esm/layouts/page.mjs +49 -8
  447. package/dist/esm/layouts/page.mjs.map +1 -1
  448. package/dist/esm/layouts/page.native.js +51 -8
  449. package/dist/esm/layouts/page.native.js.map +1 -1
  450. package/dist/esm/layouts/pageHeadingScope.native.js.map +1 -1
  451. package/dist/esm/layouts/sidebar.native.js.map +1 -1
  452. package/dist/esm/layouts/tags.native.js.map +1 -1
  453. package/dist/esm/layouts/timeline.native.js.map +1 -1
  454. package/dist/esm/layouts/toolbar.native.js.map +1 -1
  455. package/dist/esm/shared/actionScan.native.js.map +1 -1
  456. package/dist/esm/shared/i18n.native.js.map +1 -1
  457. package/dist/esm/shared/t.native.js.map +1 -1
  458. package/dist/esm/shared/textRidesText.native.js.map +1 -1
  459. package/dist/esm/shared/useKeyboardInset.mjs +1 -19
  460. package/dist/esm/shared/useKeyboardInset.mjs.map +1 -1
  461. package/dist/esm/shared/useKeyboardInset.native.js.map +1 -1
  462. package/dist/esm/shared/useReturnFocusOnClose.native.js.map +1 -1
  463. package/dist/esm/surfaces.native.js.map +1 -1
  464. package/dist/esm/tamagui.mjs +2 -1
  465. package/dist/esm/tamagui.mjs.map +1 -1
  466. package/dist/esm/tamagui.native.js +2 -1
  467. package/dist/esm/tamagui.native.js.map +1 -1
  468. package/dist/esm/testSetup.native.js.map +1 -1
  469. package/dist/esm/utils/setTinted.native.js.map +1 -1
  470. package/dist/esm/utils/unwrapText.native.js.map +1 -1
  471. package/dist/esm/views/Calendar.native.js.map +1 -1
  472. package/dist/esm/views/Dashboard.mjs +112 -19
  473. package/dist/esm/views/Dashboard.mjs.map +1 -1
  474. package/dist/esm/views/Dashboard.native.js +153 -47
  475. package/dist/esm/views/Dashboard.native.js.map +1 -1
  476. package/dist/esm/views/Gantt.mjs +376 -93
  477. package/dist/esm/views/Gantt.mjs.map +1 -1
  478. package/dist/esm/views/Gantt.native.js +445 -96
  479. package/dist/esm/views/Gantt.native.js.map +1 -1
  480. package/dist/esm/views/ImageGrid.native.js.map +1 -1
  481. package/dist/esm/views/List.native.js.map +1 -1
  482. package/dist/esm/views/ReportBuilder.native.js.map +1 -1
  483. package/dist/esm/views/TreeView.native.js.map +1 -1
  484. package/dist/esm/views/calendarMath.native.js.map +1 -1
  485. package/dist/esm/views/ganttMath.mjs +84 -3
  486. package/dist/esm/views/ganttMath.mjs.map +1 -1
  487. package/dist/esm/views/ganttMath.native.js +106 -4
  488. package/dist/esm/views/ganttMath.native.js.map +1 -1
  489. package/dist/esm/views/index.mjs +2 -2
  490. package/dist/esm/views/index.mjs.map +1 -1
  491. package/dist/esm/views/index.native.js +2 -2
  492. package/dist/esm/views/index.native.js.map +1 -1
  493. package/dist/esm/views/kanbanDnd.native.js.map +1 -1
  494. package/dist/esm/views/treeViewDnd.native.js.map +1 -1
  495. package/dist/esm/views/treeViewLayout.native.js.map +1 -1
  496. package/dist/esm/views/treeViewMotion.native.js.map +1 -1
  497. package/dist/jsx/Accordion/index.mjs +4 -0
  498. package/dist/jsx/Accordion/index.mjs.map +1 -1
  499. package/dist/jsx/Accordion/index.native.js +4 -0
  500. package/dist/jsx/Accordion/index.native.js.map +1 -1
  501. package/dist/jsx/AnimateHeight/index.mjs +29 -2
  502. package/dist/jsx/AnimateHeight/index.mjs.map +1 -1
  503. package/dist/jsx/AnimateHeight/index.native.js +30 -2
  504. package/dist/jsx/AnimateHeight/index.native.js.map +1 -1
  505. package/dist/jsx/Button.mjs.map +1 -1
  506. package/dist/jsx/Button.native.js.map +1 -1
  507. package/dist/jsx/Card.mjs +8 -2
  508. package/dist/jsx/Card.mjs.map +1 -1
  509. package/dist/jsx/Card.native.js +11 -1
  510. package/dist/jsx/Card.native.js.map +1 -1
  511. package/dist/jsx/CardFooter.mjs +1 -0
  512. package/dist/jsx/CardFooter.mjs.map +1 -1
  513. package/dist/jsx/CardFooter.native.js +1 -0
  514. package/dist/jsx/CardFooter.native.js.map +1 -1
  515. package/dist/jsx/Collapsible.mjs +23 -0
  516. package/dist/jsx/Collapsible.mjs.map +1 -0
  517. package/dist/jsx/Collapsible.native.js +56 -0
  518. package/dist/jsx/Collapsible.native.js.map +1 -0
  519. package/dist/jsx/CopyField/index.mjs +7 -2
  520. package/dist/jsx/CopyField/index.mjs.map +1 -1
  521. package/dist/jsx/CopyField/index.native.js +6 -1
  522. package/dist/jsx/CopyField/index.native.js.map +1 -1
  523. package/dist/jsx/DropdownMenu/index.mjs +32 -2
  524. package/dist/jsx/DropdownMenu/index.mjs.map +1 -1
  525. package/dist/jsx/DropdownMenu/index.native.js +31 -1
  526. package/dist/jsx/DropdownMenu/index.native.js.map +1 -1
  527. package/dist/jsx/Meter/index.mjs +12 -5
  528. package/dist/jsx/Meter/index.mjs.map +1 -1
  529. package/dist/jsx/Meter/index.native.js +12 -5
  530. package/dist/jsx/Meter/index.native.js.map +1 -1
  531. package/dist/jsx/Pagination.mjs +28 -9
  532. package/dist/jsx/Pagination.mjs.map +1 -1
  533. package/dist/jsx/Pagination.native.js +28 -9
  534. package/dist/jsx/Pagination.native.js.map +1 -1
  535. package/dist/jsx/Tabs/index.mjs +145 -91
  536. package/dist/jsx/Tabs/index.mjs.map +1 -1
  537. package/dist/jsx/Tabs/index.native.js +187 -123
  538. package/dist/jsx/Tabs/index.native.js.map +1 -1
  539. package/dist/jsx/Toast/index.mjs +52 -3
  540. package/dist/jsx/Toast/index.mjs.map +1 -1
  541. package/dist/jsx/Toast/index.native.js +55 -2
  542. package/dist/jsx/Toast/index.native.js.map +1 -1
  543. package/dist/jsx/actions/DestructiveAction.mjs +8 -14
  544. package/dist/jsx/actions/DestructiveAction.mjs.map +1 -1
  545. package/dist/jsx/actions/DestructiveAction.native.js +7 -15
  546. package/dist/jsx/actions/DestructiveAction.native.js.map +1 -1
  547. package/dist/jsx/charts/Axis.mjs +6 -1
  548. package/dist/jsx/charts/Axis.mjs.map +1 -1
  549. package/dist/jsx/charts/Axis.native.js +5 -0
  550. package/dist/jsx/charts/Axis.native.js.map +1 -1
  551. package/dist/jsx/charts/BarChart.mjs +72 -58
  552. package/dist/jsx/charts/BarChart.mjs.map +1 -1
  553. package/dist/jsx/charts/BarChart.native.js +81 -67
  554. package/dist/jsx/charts/BarChart.native.js.map +1 -1
  555. package/dist/jsx/charts/ChartDataView.mjs +185 -0
  556. package/dist/jsx/charts/ChartDataView.mjs.map +1 -0
  557. package/dist/jsx/charts/ChartDataView.native.js +224 -0
  558. package/dist/jsx/charts/ChartDataView.native.js.map +1 -0
  559. package/dist/jsx/charts/ChartSurface.mjs +5 -1
  560. package/dist/jsx/charts/ChartSurface.mjs.map +1 -1
  561. package/dist/jsx/charts/ChartSurface.native.js +5 -1
  562. package/dist/jsx/charts/ChartSurface.native.js.map +1 -1
  563. package/dist/jsx/charts/LineChart.mjs +82 -68
  564. package/dist/jsx/charts/LineChart.mjs.map +1 -1
  565. package/dist/jsx/charts/LineChart.native.js +94 -80
  566. package/dist/jsx/charts/LineChart.native.js.map +1 -1
  567. package/dist/jsx/charts/PieChart.mjs +100 -75
  568. package/dist/jsx/charts/PieChart.mjs.map +1 -1
  569. package/dist/jsx/charts/PieChart.native.js +109 -84
  570. package/dist/jsx/charts/PieChart.native.js.map +1 -1
  571. package/dist/jsx/charts/Sparkline.mjs +11 -2
  572. package/dist/jsx/charts/Sparkline.mjs.map +1 -1
  573. package/dist/jsx/charts/Sparkline.native.js +10 -1
  574. package/dist/jsx/charts/Sparkline.native.js.map +1 -1
  575. package/dist/jsx/charts/accessibility.mjs +4 -1
  576. package/dist/jsx/charts/accessibility.mjs.map +1 -1
  577. package/dist/jsx/charts/accessibility.native.js +7 -0
  578. package/dist/jsx/charts/accessibility.native.js.map +1 -1
  579. package/dist/jsx/charts/index.mjs +2 -1
  580. package/dist/jsx/charts/index.mjs.map +1 -1
  581. package/dist/jsx/charts/index.native.js +2 -0
  582. package/dist/jsx/charts/index.native.js.map +1 -1
  583. package/dist/jsx/charts/math.mjs +16 -1
  584. package/dist/jsx/charts/math.mjs.map +1 -1
  585. package/dist/jsx/charts/math.native.js +18 -0
  586. package/dist/jsx/charts/math.native.js.map +1 -1
  587. package/dist/jsx/charts/series.mjs +51 -9
  588. package/dist/jsx/charts/series.mjs.map +1 -1
  589. package/dist/jsx/charts/series.native.js +53 -11
  590. package/dist/jsx/charts/series.native.js.map +1 -1
  591. package/dist/jsx/charts/svg.mjs +40 -4
  592. package/dist/jsx/charts/svg.mjs.map +1 -1
  593. package/dist/jsx/charts/svg.native.js +46 -3
  594. package/dist/jsx/charts/svg.native.js.map +1 -1
  595. package/dist/jsx/code/CodeBlock/index.mjs +7 -2
  596. package/dist/jsx/code/CodeBlock/index.mjs.map +1 -1
  597. package/dist/jsx/code/CodeBlock/index.native.js +6 -1
  598. package/dist/jsx/code/CodeBlock/index.native.js.map +1 -1
  599. package/dist/jsx/feedback/ConfirmDialog.mjs +8 -22
  600. package/dist/jsx/feedback/ConfirmDialog.mjs.map +1 -1
  601. package/dist/jsx/feedback/ConfirmDialog.native.js +7 -22
  602. package/dist/jsx/feedback/ConfirmDialog.native.js.map +1 -1
  603. package/dist/jsx/feedback/NotifyHost.mjs +2 -1
  604. package/dist/jsx/feedback/NotifyHost.mjs.map +1 -1
  605. package/dist/jsx/feedback/NotifyHost.native.js +3 -2
  606. package/dist/jsx/feedback/NotifyHost.native.js.map +1 -1
  607. package/dist/jsx/feedback/copy.mjs +35 -4
  608. package/dist/jsx/feedback/copy.mjs.map +1 -1
  609. package/dist/jsx/feedback/copy.native.js +38 -4
  610. package/dist/jsx/feedback/copy.native.js.map +1 -1
  611. package/dist/jsx/feedback/index.mjs +2 -2
  612. package/dist/jsx/feedback/index.mjs.map +1 -1
  613. package/dist/jsx/feedback/index.native.js +1 -0
  614. package/dist/jsx/feedback/index.native.js.map +1 -1
  615. package/dist/jsx/feedback/notify.mjs +1 -0
  616. package/dist/jsx/feedback/notify.mjs.map +1 -1
  617. package/dist/jsx/feedback/notify.native.js +1 -0
  618. package/dist/jsx/feedback/notify.native.js.map +1 -1
  619. package/dist/jsx/feedback/route.mjs +3 -0
  620. package/dist/jsx/feedback/route.mjs.map +1 -1
  621. package/dist/jsx/feedback/route.native.js +3 -0
  622. package/dist/jsx/feedback/route.native.js.map +1 -1
  623. package/dist/jsx/feedback/store.mjs +6 -1
  624. package/dist/jsx/feedback/store.mjs.map +1 -1
  625. package/dist/jsx/feedback/store.native.js +8 -0
  626. package/dist/jsx/feedback/store.native.js.map +1 -1
  627. package/dist/jsx/icons/lucide.mjs +2 -2
  628. package/dist/jsx/icons/lucide.mjs.map +1 -1
  629. package/dist/jsx/icons/lucide.native.js +2 -1
  630. package/dist/jsx/knobImmuneExports.mjs +0 -1
  631. package/dist/jsx/knobImmuneExports.mjs.map +1 -1
  632. package/dist/jsx/knobImmuneExports.native.js +0 -1
  633. package/dist/jsx/knobImmuneExports.native.js.map +1 -1
  634. package/dist/jsx/layouts/PaneScaffold.mjs +97 -42
  635. package/dist/jsx/layouts/PaneScaffold.mjs.map +1 -1
  636. package/dist/jsx/layouts/PaneScaffold.native.js +97 -41
  637. package/dist/jsx/layouts/PaneScaffold.native.js.map +1 -1
  638. package/dist/jsx/layouts/index.mjs +2 -1
  639. package/dist/jsx/layouts/index.mjs.map +1 -1
  640. package/dist/jsx/layouts/index.native.js +2 -0
  641. package/dist/jsx/layouts/index.native.js.map +1 -1
  642. package/dist/jsx/layouts/page.mjs +49 -8
  643. package/dist/jsx/layouts/page.mjs.map +1 -1
  644. package/dist/jsx/layouts/page.native.js +50 -7
  645. package/dist/jsx/layouts/page.native.js.map +1 -1
  646. package/dist/jsx/shared/useKeyboardInset.mjs +1 -19
  647. package/dist/jsx/shared/useKeyboardInset.mjs.map +1 -1
  648. package/dist/jsx/shared/useKeyboardInset.native.js +3 -3
  649. package/dist/jsx/shared/useKeyboardInset.native.js.map +1 -1
  650. package/dist/jsx/tamagui.mjs +2 -1
  651. package/dist/jsx/tamagui.mjs.map +1 -1
  652. package/dist/jsx/tamagui.native.js +2 -1
  653. package/dist/jsx/tamagui.native.js.map +1 -1
  654. package/dist/jsx/views/Dashboard.mjs +112 -19
  655. package/dist/jsx/views/Dashboard.mjs.map +1 -1
  656. package/dist/jsx/views/Dashboard.native.js +151 -45
  657. package/dist/jsx/views/Dashboard.native.js.map +1 -1
  658. package/dist/jsx/views/Gantt.mjs +376 -93
  659. package/dist/jsx/views/Gantt.mjs.map +1 -1
  660. package/dist/jsx/views/Gantt.native.js +443 -94
  661. package/dist/jsx/views/Gantt.native.js.map +1 -1
  662. package/dist/jsx/views/ganttMath.mjs +84 -3
  663. package/dist/jsx/views/ganttMath.mjs.map +1 -1
  664. package/dist/jsx/views/ganttMath.native.js +113 -3
  665. package/dist/jsx/views/ganttMath.native.js.map +1 -1
  666. package/dist/jsx/views/index.mjs +2 -2
  667. package/dist/jsx/views/index.mjs.map +1 -1
  668. package/dist/jsx/views/index.native.js +20 -1
  669. package/dist/jsx/views/index.native.js.map +1 -1
  670. package/package.json +11 -9
  671. package/src/Accordion/index.tsx +7 -1
  672. package/src/AnimateHeight/AnimateHeight.native.spec.tsx +51 -0
  673. package/src/AnimateHeight/index.tsx +30 -5
  674. package/src/Button.tsx +10 -2
  675. package/src/Card.spec.tsx +76 -3
  676. package/src/Card.stories.tsx +1 -1
  677. package/src/Card.tsx +13 -1
  678. package/src/CardFooter.stories.tsx +3 -7
  679. package/src/CardFooter.tsx +3 -1
  680. package/src/CardHeader.stories.tsx +1 -3
  681. package/src/Collapsible.stories.tsx +2 -2
  682. package/src/Collapsible.tsx +23 -0
  683. package/src/CopyField/CopyField.spec.tsx +66 -1
  684. package/src/CopyField/index.tsx +4 -3
  685. package/src/DropdownMenu/DropdownMenu.spec.tsx +112 -1
  686. package/src/DropdownMenu/DropdownMenu.stories.tsx +1 -3
  687. package/src/DropdownMenu/index.tsx +67 -6
  688. package/src/LinearGradient.stories.tsx +2 -2
  689. package/src/Meter/Meter.spec.tsx +59 -2
  690. package/src/Meter/Meter.stories.tsx +38 -0
  691. package/src/Meter/index.tsx +9 -4
  692. package/src/Pagination.simple.spec.tsx +23 -0
  693. package/src/Pagination.stories.tsx +8 -0
  694. package/src/Pagination.tsx +27 -10
  695. package/src/Panel.stories.tsx +1 -1
  696. package/src/SortableList/SortableList.spec.tsx +3 -3
  697. package/src/Tabs/Tabs.bandColor.spec.tsx +23 -0
  698. package/src/Tabs/Tabs.native.spec.tsx +35 -0
  699. package/src/Tabs/Tabs.spec.tsx +91 -1
  700. package/src/Tabs/Tabs.stories.tsx +36 -1
  701. package/src/Tabs/index.tsx +272 -187
  702. package/src/Toast/Toast.spec.tsx +56 -1
  703. package/src/Toast/index.tsx +68 -3
  704. package/src/Unspaced.stories.tsx +2 -2
  705. package/src/VisuallyHidden.stories.tsx +2 -2
  706. package/src/actions/DestructiveAction.spec.tsx +19 -3
  707. package/src/actions/DestructiveAction.tsx +9 -14
  708. package/src/charts/Axis.tsx +6 -1
  709. package/src/charts/BarChart.tsx +82 -67
  710. package/src/charts/ChartDataView.spec.tsx +104 -0
  711. package/src/charts/ChartDataView.tsx +158 -0
  712. package/src/charts/ChartSurface.tsx +7 -2
  713. package/src/charts/Charts.stories.tsx +213 -9
  714. package/src/charts/LineChart.tsx +90 -75
  715. package/src/charts/PieChart.knobs.spec.tsx +25 -0
  716. package/src/charts/PieChart.tsx +51 -9
  717. package/src/charts/Sparkline.tsx +25 -3
  718. package/src/charts/accessibility.ts +8 -0
  719. package/src/charts/charts.spec.tsx +77 -3
  720. package/src/charts/index.ts +2 -0
  721. package/src/charts/math.spec.ts +19 -0
  722. package/src/charts/math.ts +36 -0
  723. package/src/charts/series.tsx +101 -21
  724. package/src/charts/svg.spec.ts +28 -0
  725. package/src/charts/svg.ts +56 -2
  726. package/src/code/CodeBlock/CodeBlock.copy.spec.tsx +23 -0
  727. package/src/code/CodeBlock/index.tsx +4 -3
  728. package/src/disclosureForm.spec.tsx +57 -0
  729. package/src/disclosureNativeProps.spec.tsx +35 -0
  730. package/src/feedback/ConfirmDialog.nativeFocus.spec.tsx +52 -0
  731. package/src/feedback/ConfirmDialog.spec.tsx +20 -0
  732. package/src/feedback/ConfirmDialog.tsx +9 -15
  733. package/src/feedback/NotifyHost.tsx +11 -2
  734. package/src/feedback/copy.ts +36 -4
  735. package/src/feedback/index.ts +1 -0
  736. package/src/feedback/notify.spec.ts +15 -1
  737. package/src/feedback/notify.ts +1 -0
  738. package/src/feedback/route.ts +4 -0
  739. package/src/feedback/store.ts +7 -0
  740. package/src/icons/lucide.ts +1 -1
  741. package/src/images/SvgUri/index.native.ts +11 -3
  742. package/src/knobImmuneExports.ts +0 -2
  743. package/src/layouts/EmptyState.stories.tsx +2 -2
  744. package/src/layouts/Page.weight.spec.tsx +75 -0
  745. package/src/layouts/PageHeader.stories.tsx +4 -4
  746. package/src/layouts/PageTemplates.stories.tsx +2 -2
  747. package/src/layouts/PaneScaffold.spec.tsx +144 -4
  748. package/src/layouts/PaneScaffold.stories.tsx +58 -2
  749. package/src/layouts/PaneScaffold.tsx +156 -58
  750. package/src/layouts/ScreenToolbar.stories.tsx +6 -23
  751. package/src/layouts/index.tsx +11 -0
  752. package/src/layouts/layouts.spec.tsx +51 -0
  753. package/src/layouts/page.designLaw.spec.tsx +25 -0
  754. package/src/layouts/page.tsx +46 -9
  755. package/src/primitives.spec.tsx +19 -4
  756. package/src/shared/useKeyboardInset.native.ts +43 -0
  757. package/src/shared/useKeyboardInset.ts +2 -41
  758. package/src/tamagui.spec.ts +63 -0
  759. package/src/tamagui.ts +3 -1
  760. package/src/views/Dashboard.stories.tsx +38 -1
  761. package/src/views/Dashboard.tsx +119 -21
  762. package/src/views/Gantt.scroll.spec.tsx +120 -0
  763. package/src/views/Gantt.spec.tsx +376 -0
  764. package/src/views/Gantt.stories.tsx +75 -2
  765. package/src/views/Gantt.tsx +564 -96
  766. package/src/views/Kanban.spec.tsx +11 -0
  767. package/src/views/ganttMath.ts +142 -4
  768. package/src/views/index.ts +44 -1
  769. package/src/views/views.spec.tsx +39 -0
  770. package/types/Accordion/index.d.ts +2 -0
  771. package/types/Accordion/index.d.ts.map +1 -1
  772. package/types/AnimateHeight/index.d.ts +3 -4
  773. package/types/AnimateHeight/index.d.ts.map +1 -1
  774. package/types/Button.d.ts +12 -2
  775. package/types/Button.d.ts.map +1 -1
  776. package/types/Card.d.ts.map +1 -1
  777. package/types/CardFooter.d.ts +2 -1
  778. package/types/CardFooter.d.ts.map +1 -1
  779. package/types/Collapsible.d.ts +19 -0
  780. package/types/Collapsible.d.ts.map +1 -0
  781. package/types/CopyField/index.d.ts.map +1 -1
  782. package/types/DropdownMenu/index.d.ts +22 -0
  783. package/types/DropdownMenu/index.d.ts.map +1 -1
  784. package/types/Meter/index.d.ts.map +1 -1
  785. package/types/Pagination.d.ts +1 -1
  786. package/types/Pagination.d.ts.map +1 -1
  787. package/types/Tabs/index.d.ts +7 -3
  788. package/types/Tabs/index.d.ts.map +1 -1
  789. package/types/Toast/index.d.ts +16 -0
  790. package/types/Toast/index.d.ts.map +1 -1
  791. package/types/actions/DestructiveAction.d.ts.map +1 -1
  792. package/types/charts/Axis.d.ts.map +1 -1
  793. package/types/charts/BarChart.d.ts.map +1 -1
  794. package/types/charts/ChartDataView.d.ts +22 -0
  795. package/types/charts/ChartDataView.d.ts.map +1 -0
  796. package/types/charts/ChartSurface.d.ts +4 -1
  797. package/types/charts/ChartSurface.d.ts.map +1 -1
  798. package/types/charts/LineChart.d.ts.map +1 -1
  799. package/types/charts/PieChart.d.ts +1 -1
  800. package/types/charts/PieChart.d.ts.map +1 -1
  801. package/types/charts/Sparkline.d.ts +3 -1
  802. package/types/charts/Sparkline.d.ts.map +1 -1
  803. package/types/charts/accessibility.d.ts +3 -0
  804. package/types/charts/accessibility.d.ts.map +1 -1
  805. package/types/charts/index.d.ts +1 -0
  806. package/types/charts/index.d.ts.map +1 -1
  807. package/types/charts/math.d.ts +12 -0
  808. package/types/charts/math.d.ts.map +1 -1
  809. package/types/charts/series.d.ts +1 -1
  810. package/types/charts/series.d.ts.map +1 -1
  811. package/types/charts/svg.d.ts +18 -2
  812. package/types/charts/svg.d.ts.map +1 -1
  813. package/types/code/CodeBlock/index.d.ts.map +1 -1
  814. package/types/feedback/ConfirmDialog.d.ts.map +1 -1
  815. package/types/feedback/NotifyHost.d.ts +3 -1
  816. package/types/feedback/NotifyHost.d.ts.map +1 -1
  817. package/types/feedback/copy.d.ts +12 -2
  818. package/types/feedback/copy.d.ts.map +1 -1
  819. package/types/feedback/index.d.ts +1 -1
  820. package/types/feedback/index.d.ts.map +1 -1
  821. package/types/feedback/notify.d.ts.map +1 -1
  822. package/types/feedback/route.d.ts +3 -0
  823. package/types/feedback/route.d.ts.map +1 -1
  824. package/types/feedback/store.d.ts +2 -0
  825. package/types/feedback/store.d.ts.map +1 -1
  826. package/types/icons/lucide.d.ts +1 -1
  827. package/types/icons/lucide.d.ts.map +1 -1
  828. package/types/images/SvgUri/index.native.d.ts +4 -3
  829. package/types/images/SvgUri/index.native.d.ts.map +1 -1
  830. package/types/knobImmuneExports.d.ts.map +1 -1
  831. package/types/layouts/PaneScaffold.d.ts +27 -5
  832. package/types/layouts/PaneScaffold.d.ts.map +1 -1
  833. package/types/layouts/index.d.ts +1 -0
  834. package/types/layouts/index.d.ts.map +1 -1
  835. package/types/layouts/page.d.ts +10 -5
  836. package/types/layouts/page.d.ts.map +1 -1
  837. package/types/shared/useKeyboardInset.d.ts +1 -14
  838. package/types/shared/useKeyboardInset.d.ts.map +1 -1
  839. package/types/shared/useKeyboardInset.native.d.ts +16 -0
  840. package/types/shared/useKeyboardInset.native.d.ts.map +1 -0
  841. package/types/tamagui.d.ts +2 -1
  842. package/types/tamagui.d.ts.map +1 -1
  843. package/types/views/Dashboard.d.ts.map +1 -1
  844. package/types/views/Gantt.d.ts +132 -13
  845. package/types/views/Gantt.d.ts.map +1 -1
  846. package/types/views/ganttMath.d.ts +73 -0
  847. package/types/views/ganttMath.d.ts.map +1 -1
  848. package/types/views/index.d.ts +2 -2
  849. package/types/views/index.d.ts.map +1 -1
@@ -12,15 +12,16 @@
12
12
  import { Input, type InputProps } from "@multiplatform.one/forms";
13
13
  import { YStack } from "tamagui";
14
14
  import { NotifyRegion } from "../feedback/NotifyHost";
15
- import { reportCopy } from "../feedback/copy";
15
+ import { useCopyFeedback } from "../feedback/copy";
16
16
 
17
17
  export type CopyFieldProps = Omit<InputProps, "copy" | "onCopyResult" | "secureTextEntry">;
18
18
 
19
19
  export function CopyField(props: CopyFieldProps) {
20
+ const { region, report } = useCopyFeedback();
20
21
  return (
21
22
  <YStack width="100%">
22
- <Input {...props} readOnly copy onCopyResult={reportCopy} />
23
- <NotifyRegion scope="field" compact />
23
+ <Input {...props} readOnly copy onCopyResult={report} />
24
+ <NotifyRegion scope="field" region={region} compact />
24
25
  </YStack>
25
26
  );
26
27
  }
@@ -1,4 +1,5 @@
1
- import { fireEvent, waitFor } from "@testing-library/react";
1
+ import { useState } from "react";
2
+ import { act, fireEvent, waitFor } from "@testing-library/react";
2
3
  import { __resetDevWarnSeen } from "@multiplatform.one/theme";
3
4
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
4
5
  import { renderWithProviders } from "@multiplatform.one/test-utils";
@@ -509,3 +510,113 @@ describe("DropdownMenu FloatingPanel cover contract", () => {
509
510
  expect(edit.getAttribute("data-mp-ring-offset")).toBe("0");
510
511
  });
511
512
  });
513
+
514
+ describe("DropdownMenu.Content onCloseAutoFocus (MPO-29)", () => {
515
+ for (const preventRestore of [false, true]) {
516
+ it(`${preventRestore ? "suppresses" : "performs"} actual delayed trigger restoration on Escape`, async () => {
517
+ const onCloseAutoFocus = vi.fn((event) => {
518
+ if (preventRestore) event.preventDefault();
519
+ });
520
+ const result = renderWithProviders(
521
+ <DropdownMenu>
522
+ <DropdownMenu.Trigger asChild>
523
+ <Button>Heading</Button>
524
+ </DropdownMenu.Trigger>
525
+ <DropdownMenu.Content onCloseAutoFocus={onCloseAutoFocus}>
526
+ <DropdownMenu.Item>H1</DropdownMenu.Item>
527
+ </DropdownMenu.Content>
528
+ </DropdownMenu>,
529
+ );
530
+ const trigger = result.getByText("Heading").closest("button")!;
531
+ trigger.focus();
532
+ fireEvent.click(trigger);
533
+ await waitFor(() => expect(document.querySelector('[role="menuitem"]')).toBeTruthy());
534
+ const item = document.querySelector('[role="menuitem"]') as HTMLElement;
535
+ item.focus();
536
+ fireEvent.keyDown(item, { key: "Escape" });
537
+ await waitFor(() => expect(document.querySelector('[role="menu"]')).toBeFalsy());
538
+ await act(() => new Promise((resolve) => setTimeout(resolve, 400)));
539
+ expect(onCloseAutoFocus).toHaveBeenCalledTimes(1);
540
+ if (preventRestore) expect(document.activeElement).not.toBe(trigger);
541
+ else expect(document.activeElement).toBe(trigger);
542
+ });
543
+ }
544
+
545
+ it("fires once when an item select closes the menu", async () => {
546
+ const onCloseAutoFocus = vi.fn();
547
+ renderWithProviders(
548
+ <DropdownMenu defaultOpen>
549
+ <DropdownMenu.Trigger asChild>
550
+ <Button>Actions</Button>
551
+ </DropdownMenu.Trigger>
552
+ <DropdownMenu.Content onCloseAutoFocus={onCloseAutoFocus}>
553
+ <DropdownMenu.Item>Edit</DropdownMenu.Item>
554
+ </DropdownMenu.Content>
555
+ </DropdownMenu>,
556
+ );
557
+ await waitFor(() => {
558
+ expect(document.querySelector('[role="menu"]')).toBeTruthy();
559
+ });
560
+ fireEvent.click(document.querySelector('[role="menuitem"]') as HTMLElement);
561
+ await waitFor(() => {
562
+ expect(document.querySelector('[role="menu"]')).toBeFalsy();
563
+ });
564
+ expect(onCloseAutoFocus).toHaveBeenCalledTimes(1);
565
+ const event = onCloseAutoFocus.mock.calls[0][0] as {
566
+ preventDefault: () => void;
567
+ defaultPrevented: boolean;
568
+ };
569
+ expect(event.defaultPrevented).toBe(false);
570
+ event.preventDefault();
571
+ expect(event.defaultPrevented).toBe(true);
572
+ });
573
+
574
+ it("fires once when a closeOnSelect=false item closes via the parent open state", async () => {
575
+ // HeadingPicker / ListPicker / MoreDropdown: they keep closeOnSelect
576
+ // false so the item does not ctx.close(), then they setOpen(false)
577
+ // themselves after executeCommand. That is a controlled close, not
578
+ // ctx.close() and not FloatingPanel dismissing on its own.
579
+ const onCloseAutoFocus = vi.fn();
580
+ function Harness() {
581
+ const [open, setOpen] = useState(true);
582
+ return (
583
+ <DropdownMenu open={open} onOpenChange={setOpen}>
584
+ <DropdownMenu.Trigger asChild>
585
+ <Button>Heading</Button>
586
+ </DropdownMenu.Trigger>
587
+ <DropdownMenu.Content onCloseAutoFocus={onCloseAutoFocus}>
588
+ <DropdownMenu.Item closeOnSelect={false} onSelect={() => setOpen(false)}>
589
+ H1
590
+ </DropdownMenu.Item>
591
+ </DropdownMenu.Content>
592
+ </DropdownMenu>
593
+ );
594
+ }
595
+ renderWithProviders(<Harness />);
596
+ await waitFor(() => {
597
+ expect(document.querySelector('[role="menu"]')).toBeTruthy();
598
+ });
599
+ fireEvent.click(document.querySelector('[role="menuitem"]') as HTMLElement);
600
+ await waitFor(() => {
601
+ expect(document.querySelector('[role="menu"]')).toBeFalsy();
602
+ });
603
+ expect(onCloseAutoFocus).toHaveBeenCalledTimes(1);
604
+ });
605
+
606
+ it("puts Content aria-label on the role=menu node", async () => {
607
+ renderWithProviders(
608
+ <DropdownMenu defaultOpen>
609
+ <DropdownMenu.Trigger asChild>
610
+ <Button>Status</Button>
611
+ </DropdownMenu.Trigger>
612
+ <DropdownMenu.Content aria-label="Status">
613
+ <DropdownMenu.Item>Open</DropdownMenu.Item>
614
+ </DropdownMenu.Content>
615
+ </DropdownMenu>,
616
+ );
617
+ await waitFor(() => {
618
+ expect(document.querySelector('[role="menu"]')).toBeTruthy();
619
+ });
620
+ expect(document.querySelector('[role="menu"]')?.getAttribute("aria-label")).toBe("Status");
621
+ });
622
+ });
@@ -220,9 +220,7 @@ export const Controlled: Story = {
220
220
  >
221
221
  <Button>Controlled menu</Button>
222
222
  </DropdownMenu>
223
- <Button variant="outlined" onPress={() => setOpen(!open)}>
224
- Toggle from outside
225
- </Button>
223
+ <Button onPress={() => setOpen(!open)}>Toggle from outside</Button>
226
224
  </XStack>
227
225
  <Text color="$color11" fontSize="$2">
228
226
  {last ? `Last action: ${last}` : "No action selected yet"}
@@ -23,6 +23,7 @@ import {
23
23
  useCallback,
24
24
  useContext,
25
25
  useEffect,
26
+ useLayoutEffect,
26
27
  useMemo,
27
28
  useRef,
28
29
  useState,
@@ -290,10 +291,38 @@ function DropdownMenuRoot({
290
291
  });
291
292
  const pendingFocusRef = useRef<"first" | "last">("first");
292
293
 
294
+ // Content's onCloseAutoFocus, read off the Content child below during the
295
+ // same render. A ref because the child scan happens after these callbacks
296
+ // are defined, and both close paths have to reach the same handler.
297
+ const closeAutoFocusRef = useRef<DropdownMenuContentProps["onCloseAutoFocus"]>(undefined);
298
+ // Notify on the actual state transition, including parent-controlled closes.
299
+ // A rejected controlled close request must not move focus out of an open menu.
300
+ const wasOpenRef = useRef(false);
301
+ const skipReturnFocusRef = useRef(false);
302
+
303
+ const fireCloseAutoFocus = useCallback(() => {
304
+ const handler = closeAutoFocusRef.current;
305
+ if (!handler) return;
306
+ handler({
307
+ preventDefault: () => {
308
+ skipReturnFocusRef.current = true;
309
+ },
310
+ get defaultPrevented() {
311
+ return skipReturnFocusRef.current;
312
+ },
313
+ });
314
+ }, []);
315
+
293
316
  const close = useCallback(() => {
294
317
  setOpen(false);
295
318
  }, [setOpen]);
296
319
 
320
+ useLayoutEffect(() => {
321
+ if (wasOpenRef.current && !open) fireCloseAutoFocus();
322
+ wasOpenRef.current = !!open;
323
+ if (open) skipReturnFocusRef.current = false;
324
+ }, [open, fireCloseAutoFocus]);
325
+
297
326
  const ctx = useMemo<DropdownMenuContextValue>(
298
327
  () => ({ open, setOpen, close, closeOnSelect, pendingFocusRef }),
299
328
  [open, setOpen, close, closeOnSelect],
@@ -311,6 +340,8 @@ function DropdownMenuRoot({
311
340
  let body: ReactNode = null;
312
341
  let contentMaxHeight = maxHeight;
313
342
  let contentMaxWidth: number | undefined;
343
+ let contentAriaLabel: string | undefined;
344
+ closeAutoFocusRef.current = undefined;
314
345
  if (items) {
315
346
  body = renderEntries(items);
316
347
  } else if (Array.isArray(children) || isValidElement(children)) {
@@ -326,14 +357,13 @@ function DropdownMenuRoot({
326
357
  if (type === DropdownMenuTrigger) {
327
358
  triggerParts.push((child.props as { children?: ReactNode }).children);
328
359
  } else if (type === DropdownMenuContent) {
329
- const contentProps = child.props as {
330
- children?: ReactNode;
331
- maxHeight?: number;
332
- maxWidth?: number;
333
- };
360
+ const contentProps = child.props as DropdownMenuContentProps;
334
361
  contentParts.push(contentProps.children);
335
362
  if (contentProps.maxHeight != null) contentMaxHeight = contentProps.maxHeight;
336
363
  if (contentProps.maxWidth != null) contentMaxWidth = contentProps.maxWidth;
364
+ if (contentProps.onCloseAutoFocus)
365
+ closeAutoFocusRef.current = contentProps.onCloseAutoFocus;
366
+ if (contentProps["aria-label"] != null) contentAriaLabel = contentProps["aria-label"];
337
367
  } else {
338
368
  triggerParts.push(child);
339
369
  }
@@ -347,12 +377,17 @@ function DropdownMenuRoot({
347
377
  <FloatingPanel
348
378
  open={open}
349
379
  onOpenChange={setOpen}
380
+ skipReturnFocusRef={skipReturnFocusRef}
350
381
  trigger={decorateTrigger(trigger, open, onArrow)}
351
382
  contentPadding="none"
352
383
  {...coverContract}
353
384
  {...(placement ? { placement } : {})}
354
385
  >
355
- <DropdownMenuList maxHeight={contentMaxHeight} maxWidth={contentMaxWidth}>
386
+ <DropdownMenuList
387
+ maxHeight={contentMaxHeight}
388
+ maxWidth={contentMaxWidth}
389
+ aria-label={contentAriaLabel}
390
+ >
356
391
  {body}
357
392
  </DropdownMenuList>
358
393
  </FloatingPanel>
@@ -387,6 +422,29 @@ export interface DropdownMenuContentProps {
387
422
  * owns this now — kept so existing callers type-check.
388
423
  */
389
424
  minWidth?: number;
425
+ /**
426
+ * Fired as the menu closes, before focus would return to the trigger.
427
+ * Call `preventDefault()` to keep the trigger from taking focus back —
428
+ * the rich-text toolbars do exactly that and hand focus to the editor
429
+ * instead, so the user can keep typing after picking a heading or a list.
430
+ */
431
+ onCloseAutoFocus?: (event: DropdownMenuCloseAutoFocusEvent) => void;
432
+ /**
433
+ * Accessible name for the menu. Lands on the `role="menu"` element, which
434
+ * is the node a screen reader announces — a facet menu whose trigger is an
435
+ * icon has no other name. DataTableFacetMenu passes its column label.
436
+ */
437
+ "aria-label"?: string;
438
+ }
439
+
440
+ /**
441
+ * The minimal preventable event `onCloseAutoFocus` receives. Deliberately not
442
+ * a DOM event: the close can originate from a native sheet or a keyboard
443
+ * dismissal where there is no DOM event to forward.
444
+ */
445
+ export interface DropdownMenuCloseAutoFocusEvent {
446
+ preventDefault: () => void;
447
+ readonly defaultPrevented: boolean;
390
448
  }
391
449
 
392
450
  function DropdownMenuContent({ children }: DropdownMenuContentProps) {
@@ -397,10 +455,12 @@ function DropdownMenuList({
397
455
  children,
398
456
  maxHeight,
399
457
  maxWidth,
458
+ "aria-label": ariaLabel,
400
459
  }: {
401
460
  children?: ReactNode;
402
461
  maxHeight?: number;
403
462
  maxWidth?: number;
463
+ "aria-label"?: string;
404
464
  }) {
405
465
  const ctx = useDropdownMenuContext("Content");
406
466
  const innerRef = useRef<TamaguiElement | null>(null);
@@ -494,6 +554,7 @@ function DropdownMenuList({
494
554
  <YStack
495
555
  ref={innerRef}
496
556
  role="menu"
557
+ {...(ariaLabel ? { "aria-label": ariaLabel } : {})}
497
558
  data-dismiss-class="commit"
498
559
  data-mp-width-mode="at-least-trigger"
499
560
  width="100%"
@@ -1,6 +1,6 @@
1
1
  import type { Meta, StoryObj } from "@storybook/react-native-web-vite";
2
- import { Text, YStack } from "tamagui";
3
- import { LinearGradient } from "./tamagui";
2
+ import { Text } from "./Text";
3
+ import { LinearGradient, YStack } from "./tamagui";
4
4
 
5
5
  const meta: Meta<typeof LinearGradient> = {
6
6
  title: "Components/LinearGradient",
@@ -8,7 +8,7 @@
8
8
  */
9
9
  import { cleanup, screen } from "@testing-library/react";
10
10
  import { renderWithProviders } from "@multiplatform.one/test-utils";
11
- import { Preset, resolveRadiusClass } from "@multiplatform.one/theme";
11
+ import { Preset, resolveRadiusClass, type Knobs } from "@multiplatform.one/theme";
12
12
  import type { ReactElement } from "react";
13
13
  import { Theme } from "tamagui";
14
14
  import { afterEach, describe, expect, it } from "vitest";
@@ -36,7 +36,7 @@ const BATTERY = { min: 0, max: 100, low: 10, high: 20, optimum: 100 } as const;
36
36
  function renderMeter(
37
37
  ui: ReactElement,
38
38
  scheme: "light" | "dark" = "light",
39
- knobs?: { borderRadius?: "none" | "small" | "medium" | "large" | "full" },
39
+ knobs?: Partial<Pick<Knobs, "borderRadius" | "fillStyle" | "borderWidth">>,
40
40
  ) {
41
41
  return renderWithProviders(
42
42
  <Theme name={scheme}>
@@ -192,6 +192,63 @@ describe("Meter a11y and the Progress semantic line", () => {
192
192
  expect(formatMeterValue({ value: 78, min: 0, max: 100, format: "percent" })).toMatch(/%$/);
193
193
  expect(formatMeterValue({ value: undefined, min: 0, max: 8, format: "number" })).toBe("\u2014");
194
194
  });
195
+
196
+ it("outlined chrome spreads inputSurface — borderWidth is the knob, not a hardcoded 1", () => {
197
+ const { container: filled } = renderMeter(
198
+ <Meter label="Disk" value={5} min={0} max={8} />,
199
+ "light",
200
+ { fillStyle: "filled", borderWidth: "large" },
201
+ );
202
+ expect(rail(filled).getAttribute("data-meter-border-width")).toBe("0");
203
+
204
+ cleanup();
205
+ const { container: hairline } = renderMeter(
206
+ <Meter label="Disk" value={5} min={0} max={8} />,
207
+ "light",
208
+ { fillStyle: "outlined", borderWidth: "none" },
209
+ );
210
+ // LC-86: outlined + none still draws the small hairline, not 0.
211
+ expect(rail(hairline).getAttribute("data-meter-border-width")).toBe("0.5");
212
+
213
+ cleanup();
214
+ const { container: large } = renderMeter(
215
+ <Meter label="Disk" value={5} min={0} max={8} />,
216
+ "light",
217
+ { fillStyle: "outlined", borderWidth: "large" },
218
+ );
219
+ expect(rail(large).getAttribute("data-meter-border-width")).toBe("2");
220
+ });
221
+
222
+ it("loading is a skeleton, not an indeterminate meter", () => {
223
+ const { container } = renderMeter(<Meter label="Disk usage" min={0} max={8} loading />);
224
+ expect(container.querySelector("[role='meter']")).toBeNull();
225
+ expect(container.querySelector("[role='progressbar']")).toBeNull();
226
+ });
227
+
228
+ for (const discrete of [0, 5]) {
229
+ for (const [borderWidth, expected] of [
230
+ ["none", "0.5px"],
231
+ ["small", "0.5px"],
232
+ ["large", "2px"],
233
+ ] as const) {
234
+ it(`paints ${borderWidth} outline on ${discrete ? "every segment" : "the continuous rail"}`, () => {
235
+ const { container } = renderMeter(
236
+ <Meter label="Disk" value={5} min={0} max={8} segments={discrete} />,
237
+ "light",
238
+ { fillStyle: "outlined", borderWidth },
239
+ );
240
+ const parts = discrete
241
+ ? Array.from(container.querySelector("[data-meter-segments]")!.children)
242
+ : [rail(container)];
243
+ expect(parts).toHaveLength(discrete || 1);
244
+ for (const part of parts) expect(getComputedStyle(part).borderTopWidth).toBe(expected);
245
+ if (discrete) {
246
+ expect(getComputedStyle(parts[0]).backgroundColor).not.toBe("transparent");
247
+ expect(getComputedStyle(parts.at(-1)!).backgroundColor).toBe("transparent");
248
+ }
249
+ });
250
+ }
251
+ }
195
252
  });
196
253
 
197
254
  describe("barrel exports (the ProgressCard export gap)", () => {
@@ -117,3 +117,41 @@ export const Unknown: Story = {
117
117
  unit: "GB",
118
118
  },
119
119
  };
120
+
121
+ export const Loading: Story = {
122
+ args: {
123
+ label: "Disk usage",
124
+ min: 0,
125
+ max: 8,
126
+ unit: "GB",
127
+ loading: true,
128
+ },
129
+ };
130
+
131
+ export const Disabled: Story = {
132
+ args: {
133
+ label: "Disk usage",
134
+ value: 6.2,
135
+ min: 0,
136
+ max: 8,
137
+ low: 6.4,
138
+ high: 7.6,
139
+ optimum: 0,
140
+ unit: "GB",
141
+ disabled: true,
142
+ },
143
+ };
144
+
145
+ export const Inline: Story = {
146
+ args: {
147
+ label: "Disk usage",
148
+ value: 6.2,
149
+ min: 0,
150
+ max: 8,
151
+ low: 6.4,
152
+ high: 7.6,
153
+ optimum: 0,
154
+ format: "percent",
155
+ layout: "inline",
156
+ },
157
+ };
@@ -149,6 +149,11 @@ export function Meter({
149
149
  const outlined = knobProps.outlined;
150
150
  const trackH = meterTrackHeightPx(size);
151
151
  const railRadius = resolveMeterRailRadius(stop);
152
+ // Spread the fragment (AGENTS.md). Hardcoded 1px ignored the borderWidth knob.
153
+ const outlineChrome = outlined
154
+ ? { ...knobProps.inputSurface, borderColor: "$color6" as const }
155
+ : { borderWidth: 0 };
156
+ const paintedBorder = outlined ? knobProps.inputSurface.borderWidth : 0;
152
157
  const known = value != null && Number.isFinite(value);
153
158
  const zone = known
154
159
  ? resolveMeterZone({ value: value as number, min, max, low, high, optimum })
@@ -209,9 +214,8 @@ export function Meter({
209
214
  width={19}
210
215
  height={trackH}
211
216
  borderRadius={railRadius}
217
+ {...outlineChrome}
212
218
  backgroundColor={i < filledCount ? paint.fill : outlined ? "transparent" : METER_TRACK}
213
- borderWidth={outlined ? 1 : 0}
214
- borderColor={outlined ? "$color6" : undefined}
215
219
  />
216
220
  ))}
217
221
  </XStack>
@@ -220,9 +224,8 @@ export function Meter({
220
224
  height={trackH}
221
225
  minHeight={trackH}
222
226
  borderRadius={railRadius}
227
+ {...outlineChrome}
223
228
  backgroundColor={outlined ? "transparent" : METER_TRACK}
224
- borderWidth={outlined ? 1 : 0}
225
- borderColor={outlined ? "$color6" : undefined}
226
229
  opacity={disabled ? 0.5 : 1}
227
230
  role="meter"
228
231
  aria-label={label}
@@ -232,6 +235,7 @@ export function Meter({
232
235
  aria-valuetext={valuetext}
233
236
  data-meter-radius-class={METER_RADIUS_CLASS}
234
237
  data-meter-rail-radius={railRadius}
238
+ data-meter-border-width={paintedBorder}
235
239
  data-meter-zone={zone}
236
240
  data-meter-fill={known && ratio != null ? paint.fill : undefined}
237
241
  data-meter-track-height={trackH}
@@ -261,6 +265,7 @@ export function Meter({
261
265
  aria-valuetext={valuetext}
262
266
  data-meter-radius-class={METER_RADIUS_CLASS}
263
267
  data-meter-rail-radius={railRadius}
268
+ data-meter-border-width={paintedBorder}
264
269
  data-meter-zone={zone}
265
270
  data-meter-fill={known ? paint.fill : undefined}
266
271
  data-meter-track-height={trackH}
@@ -0,0 +1,23 @@
1
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
2
+ import { fireEvent, screen } from "@testing-library/react";
3
+ import { describe, expect, it, vi } from "vitest";
4
+ import { Pagination } from "./Pagination";
5
+
6
+ describe("simple page navigation", () => {
7
+ it("keeps page context without a numbered window and navigates once", () => {
8
+ const change = vi.fn();
9
+ renderWithProviders(
10
+ <Pagination variant="simple" total={100} page={50} onPageChange={change} />,
11
+ );
12
+ expect(screen.getByText(/50.*100/)).toBeInTheDocument();
13
+ expect(screen.getAllByRole("button")).toHaveLength(2);
14
+ fireEvent.click(screen.getByLabelText("Go to next page"));
15
+ expect(change).toHaveBeenCalledExactlyOnceWith(51);
16
+ });
17
+ it("disables backward navigation on the first page and forward on the last", () => {
18
+ const { rerender } = renderWithProviders(<Pagination variant="simple" total={3} page={1} />);
19
+ expect(screen.getByLabelText("Go to previous page")).toHaveAttribute("aria-disabled", "true");
20
+ rerender(<Pagination variant="simple" total={3} page={3} />);
21
+ expect(screen.getByLabelText("Go to next page")).toHaveAttribute("aria-disabled", "true");
22
+ });
23
+ });
@@ -236,3 +236,11 @@ export const AllStates: Story = {
236
236
  </YStack>
237
237
  ),
238
238
  };
239
+
240
+ export const Simple: Story = {
241
+ render: () => (
242
+ <YStack width={249}>
243
+ <Pagination variant="simple" total={100} defaultPage={50} />
244
+ </YStack>
245
+ ),
246
+ };
@@ -118,7 +118,7 @@ export interface PaginationProps extends Omit<XStackProps, "children" | "onChang
118
118
  * step) at the pager's large step — see `DotVariant` for the one rule that
119
119
  * governs a strip mark's size.
120
120
  */
121
- variant?: "dots" | "bars" | "numbered";
121
+ variant?: "dots" | "bars" | "numbered" | "simple";
122
122
  /** Total number of items across all pages (numbered summary slot) */
123
123
  totalItems?: number;
124
124
  /** Items per page (numbered summary slot) */
@@ -235,17 +235,19 @@ export function Pagination({
235
235
  ...(kbFocus === id ? FOCUS_VISIBLE_RING : restRing),
236
236
  });
237
237
 
238
+ const isSimple = variant === "simple";
238
239
  const isNumbered = variant === "numbered";
240
+ const isPageNavigation = isNumbered || isSimple;
239
241
 
240
242
  // The two idioms differ in which glyphs the controls take, whether the
241
243
  // control is circular, and whether the last step submits — not in structure.
242
244
  const canPrev = !disabled && index > 0;
243
- const canNext = isNumbered
245
+ const canNext = isPageNavigation
244
246
  ? !disabled && currentPage < total
245
247
  : // dots/bars: an onSubmit makes the last step actionable, so the forward
246
248
  // control is not dead there.
247
249
  !(disabled || (!isLastStep && index >= total - 1 && !onSubmit));
248
- const submits = !isNumbered && isLastStep;
250
+ const submits = !isPageNavigation && isLastStep;
249
251
 
250
252
  const items = isNumbered
251
253
  ? getPaginationItems(total, currentPage, siblingCount, boundaryCount)
@@ -282,6 +284,7 @@ export function Pagination({
282
284
  data-pad="panel"
283
285
  {...knobProps.panelPadding}
284
286
  {...knobProps.gap}
287
+ {...(isSimple ? { paddingHorizontal: 0, minWidth: 0, flexShrink: 1 } : undefined)}
285
288
  {...stackProps}
286
289
  >
287
290
  {isNumbered && showFirstLast && (
@@ -299,19 +302,31 @@ export function Pagination({
299
302
 
300
303
  <Button
301
304
  size={knobProps.sizeToken}
302
- circular={!isNumbered}
305
+ circular={!isPageNavigation}
303
306
  chromeless
304
- icon={isNumbered ? PrevIcon : PrevArrowIcon}
307
+ icon={isPageNavigation ? PrevIcon : PrevArrowIcon}
305
308
  onPress={handlePrev}
306
309
  disabled={!canPrev}
307
310
  // LC-40: the Button's own disabled wash owns the treatment — the
308
311
  // legacy opacity 0.3 dim stacked on top of it (double-dim).
309
- aria-label={isNumbered ? t("Go to previous page") : t("Previous page")}
312
+ aria-label={isPageNavigation ? t("Go to previous page") : t("Previous page")}
310
313
  onKeyDown={activateOnEnterSpace(handlePrev, canPrev)}
311
314
  {...pageControlProps("prev")}
312
315
  />
313
316
 
314
- {isNumbered ? (
317
+ {isSimple ? (
318
+ <Text
319
+ {...knobProps.body}
320
+ color={componentColors.text.primary}
321
+ aria-live="polite"
322
+ userSelect="none"
323
+ numberOfLines={1}
324
+ flexShrink={1}
325
+ minWidth={0}
326
+ >
327
+ {bidiIsolate(withInterp(t("{{page}} of {{total}}"), { page: currentPage, total }))}
328
+ </Text>
329
+ ) : isNumbered ? (
315
330
  <XStack alignItems="center" {...knobProps.gap}>
316
331
  {items.map((item) => {
317
332
  if (typeof item !== "number") {
@@ -374,13 +389,15 @@ export function Pagination({
374
389
 
375
390
  <Button
376
391
  size={knobProps.sizeToken}
377
- circular={!isNumbered}
392
+ circular={!isPageNavigation}
378
393
  chromeless={!submits}
379
394
  theme={submits ? "active" : undefined}
380
- icon={isNumbered ? NextIcon : submits ? CheckIcon : NextArrowIcon}
395
+ icon={isPageNavigation ? NextIcon : submits ? CheckIcon : NextArrowIcon}
381
396
  onPress={handleNext}
382
397
  disabled={!canNext}
383
- aria-label={isNumbered ? t("Go to next page") : submits ? t("Submit") : t("Next page")}
398
+ aria-label={
399
+ isPageNavigation ? t("Go to next page") : submits ? t("Submit") : t("Next page")
400
+ }
384
401
  onKeyDown={activateOnEnterSpace(handleNext, canNext)}
385
402
  {...pageControlProps(submits ? "submit" : "next")}
386
403
  />
@@ -52,7 +52,7 @@ export const InteractiveContent: Story = {
52
52
  <SizableText fontWeight="600">Interactive content</SizableText>
53
53
  <Input placeholder="Focus me" inputProps={{ "aria-label": "Focus demo" }} />
54
54
  <XStack gap="$2">
55
- <Button variant="outlined">Cancel</Button>
55
+ <Button>Cancel</Button>
56
56
  <Button>Submit</Button>
57
57
  </XStack>
58
58
  </Panel>
@@ -138,10 +138,10 @@ describe("SortableList", () => {
138
138
 
139
139
  it("renders emptyMessage when there are no rows (board 04)", () => {
140
140
  const { container } = renderWithProviders(
141
- <SortableList
141
+ <SortableList<{ id: string; label: string }>
142
142
  items={[]}
143
- getId={(item: { id: string }) => item.id}
144
- getLabel={(item: { label: string }) => item.label}
143
+ getId={(item) => item.id}
144
+ getLabel={(item) => item.label}
145
145
  emptyMessage="No rows yet"
146
146
  />,
147
147
  );
@@ -0,0 +1,23 @@
1
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
2
+ import { describe, expect, it, vi } from "vitest";
3
+ import { Tabs } from "./index";
4
+
5
+ vi.mock("@multiplatform.one/theme", async (importOriginal) => ({
6
+ ...(await importOriginal<typeof import("@multiplatform.one/theme")>()),
7
+ useReadableTextOn: () => "#fff",
8
+ }));
9
+
10
+ describe("selected tab ink follows its painted surface", () => {
11
+ it("uses page-surface ink for the band even when contained tint needs white ink", () => {
12
+ const result = renderWithProviders(
13
+ <Tabs variant="band" value="one" items={[{ value: "one", label: "Selected" }]} />,
14
+ );
15
+ expect(result.getByText("Selected").className).toContain("_col-color");
16
+ });
17
+ it("keeps contrasting tint ink for the contained indicator", () => {
18
+ const result = renderWithProviders(
19
+ <Tabs variant="contained" value="one" items={[{ value: "one", label: "Selected" }]} />,
20
+ );
21
+ expect(result.getByText("Selected").className).not.toContain("_col-color");
22
+ });
23
+ });