@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
@@ -4,7 +4,7 @@
4
4
  * MPO-21 G1-G4, G6 — five primitives the house barrel could not express.
5
5
  *
6
6
  * G1 Collapsible / G2 LinearGradient / G3 VisuallyHidden / G4 Unspaced are
7
- * knob-immune raw re-exports (registry rows). G6 AlertDialogContent is a
7
+ * knob-immune primitives. Collapsible adds safe form-button defaults. G6 AlertDialogContent is a
8
8
  * house surface: `unstyled` drops Tamagui's baked elevate chrome so the
9
9
  * overlay elevation token is the only surface source.
10
10
  */
@@ -20,11 +20,11 @@ import { AlertDialogContent, AlertDialogOverlay } from "./surfaces";
20
20
  afterEach(cleanup);
21
21
 
22
22
  describe("MPO-21 G1-G4 — knob-immune primitives on the house barrel", () => {
23
- it("exports Collapsible, Unspaced, VisuallyHidden as the tamagui primitives", () => {
24
- expect(pkg.Collapsible).toBe(tamagui.Collapsible);
23
+ it("isolates the safe Collapsible adapter and preserves other primitives", () => {
24
+ expect(pkg.Collapsible).not.toBe(tamagui.Collapsible);
25
25
  expect(pkg.Unspaced).toBe(tamagui.Unspaced);
26
26
  expect(pkg.VisuallyHidden).toBe(tamagui.VisuallyHidden);
27
- expect(pkg.Collapsible.Trigger).toBe(tamagui.Collapsible.Trigger);
27
+ expect(pkg.Collapsible.Trigger).not.toBe(tamagui.Collapsible.Trigger);
28
28
  expect(pkg.Collapsible.Content).toBe(tamagui.Collapsible.Content);
29
29
  });
30
30
 
@@ -33,6 +33,21 @@ describe("MPO-21 G1-G4 — knob-immune primitives on the house barrel", () => {
33
33
  expect(pkg.LinearGradient).toBe(tamaguiLinearGradient.LinearGradient);
34
34
  });
35
35
 
36
+ it("leaves the raw trigger untouched while giving the public trigger a safe default", () => {
37
+ const result = renderWithProviders(
38
+ <>
39
+ <tamagui.Collapsible>
40
+ <tamagui.Collapsible.Trigger>Raw</tamagui.Collapsible.Trigger>
41
+ </tamagui.Collapsible>
42
+ <pkg.Collapsible>
43
+ <pkg.Collapsible.Trigger>Safe</pkg.Collapsible.Trigger>
44
+ </pkg.Collapsible>
45
+ </>,
46
+ );
47
+ expect(result.getByRole("button", { name: "Raw" }).getAttribute("type")).toBeNull();
48
+ expect(result.getByRole("button", { name: "Safe" }).getAttribute("type")).toBe("button");
49
+ });
50
+
36
51
  it("renders Collapsible open with trigger and content", () => {
37
52
  const { getByText } = renderWithProviders(
38
53
  <pkg.Collapsible defaultOpen>
@@ -0,0 +1,43 @@
1
+ /**
2
+ * How many points of the native screen the software keyboard currently covers.
3
+ *
4
+ * A sheet that ignores this draws its frame UNDER the keyboard: the last row
5
+ * is sliced mid-glyph, the rounded top edge lands on top of the autocomplete
6
+ * suggestion strip, and the field being typed into can be occluded by it
7
+ * (MPO-64). KeyboardAvoidingView is not enough inside a `Modal` — it pads the
8
+ * container but the sheet keeps whatever fixed height it was given, so it
9
+ * simply overflows off the top instead of shrinking.
10
+ *
11
+ * The number comes from the platform, never from a constant: the suggestion
12
+ * strip is exactly the band that overlapped, and its height varies with the
13
+ * field, the language and whether QuickType is on.
14
+ */
15
+
16
+ import { useEffect, useState } from "react";
17
+ import { Dimensions, Keyboard, Platform } from "react-native";
18
+
19
+ export function useKeyboardInset(): number {
20
+ const [inset, setInset] = useState(0);
21
+
22
+ useEffect(() => {
23
+ // iOS fires the *Will* pair one frame before the animation, so the sheet
24
+ // resizes with the keyboard rather than after it. Android has no *Will*.
25
+ const showEvent = Platform.OS === "ios" ? "keyboardWillChangeFrame" : "keyboardDidShow";
26
+ const hideEvent = Platform.OS === "ios" ? "keyboardWillHide" : "keyboardDidHide";
27
+
28
+ const show = Keyboard.addListener(showEvent, (event) => {
29
+ const screen = event?.endCoordinates;
30
+ if (!screen) return;
31
+ const windowHeight = Dimensions.get("window").height;
32
+ setInset(Math.max(0, Math.round(windowHeight - screen.screenY)));
33
+ });
34
+ const hide = Keyboard.addListener(hideEvent, () => setInset(0));
35
+
36
+ return () => {
37
+ show.remove();
38
+ hide.remove();
39
+ };
40
+ }, []);
41
+
42
+ return inset;
43
+ }
@@ -1,43 +1,4 @@
1
- /**
2
- * How many points of the screen the software keyboard currently covers.
3
- *
4
- * A sheet that ignores this draws its frame UNDER the keyboard: the last row
5
- * is sliced mid-glyph, the rounded top edge lands on top of the autocomplete
6
- * suggestion strip, and the field being typed into can be occluded by it
7
- * (MPO-64). KeyboardAvoidingView is not enough inside a `Modal` — it pads the
8
- * container but the sheet keeps whatever fixed height it was given, so it
9
- * simply overflows off the top instead of shrinking.
10
- *
11
- * The number comes from the platform, never from a constant: the suggestion
12
- * strip is exactly the band that overlapped, and its height varies with the
13
- * field, the language and whether QuickType is on.
14
- */
15
-
16
- import { useEffect, useState } from "react";
17
- import { Dimensions, Keyboard, Platform } from "react-native";
18
-
1
+ /** Web overlays use the browser viewport; native overlays measure the keyboard band. */
19
2
  export function useKeyboardInset(): number {
20
- const [inset, setInset] = useState(0);
21
-
22
- useEffect(() => {
23
- // iOS fires the *Will* pair one frame before the animation, so the sheet
24
- // resizes with the keyboard rather than after it. Android has no *Will*.
25
- const showEvent = Platform.OS === "ios" ? "keyboardWillChangeFrame" : "keyboardDidShow";
26
- const hideEvent = Platform.OS === "ios" ? "keyboardWillHide" : "keyboardDidHide";
27
-
28
- const show = Keyboard.addListener(showEvent, (event) => {
29
- const screen = event?.endCoordinates;
30
- if (!screen) return;
31
- const windowHeight = Dimensions.get("window").height;
32
- setInset(Math.max(0, Math.round(windowHeight - screen.screenY)));
33
- });
34
- const hide = Keyboard.addListener(hideEvent, () => setInset(0));
35
-
36
- return () => {
37
- show.remove();
38
- hide.remove();
39
- };
40
- }, []);
41
-
42
- return inset;
3
+ return 0;
43
4
  }
@@ -16,9 +16,13 @@
16
16
  * 4. House shadows (Tabs, Tooltip, Card, Toast, …) must stay the house
17
17
  * versions, not the tamagui primitives.
18
18
  */
19
+ import { readdirSync, readFileSync } from "node:fs";
20
+ import { join } from "node:path";
19
21
  import * as tamagui from "tamagui";
22
+ import * as tamaguiLinearGradient from "tamagui/linear-gradient";
20
23
  import { describe, expect, it } from "vitest";
21
24
  import * as pkg from "./index";
25
+ import * as houseTamagui from "./tamagui";
22
26
 
23
27
  const EXCLUDED_BARE_NAMES = [
24
28
  "Checkbox",
@@ -44,12 +48,19 @@ const ALLOWLIST_VALUE_NAMES = [
44
48
  // barrel and had been red ever since. MPO-78: CI runs `turbo run build`
45
49
  // only, so nothing caught it.)
46
50
  "Circle",
51
+ // MPO-21 G1 / G3 / G4. Restored by MPO-148; MPO-169 locks them here so a
52
+ // later Adapt-style rewrite cannot drop them without this spec going red.
53
+ // LinearGradient (G2) is not on the main tamagui barrel — see the dedicated
54
+ // assertion below rather than this identity check.
55
+ "Collapsible",
47
56
  "Group",
48
57
  "ListItem",
49
58
  "ScrollView",
50
59
  "Spacer",
51
60
  "Square",
61
+ "Unspaced",
52
62
  "View",
63
+ "VisuallyHidden",
53
64
  "XGroup",
54
65
  "XStack",
55
66
  "YGroup",
@@ -205,8 +216,60 @@ describe("curated tamagui surface", () => {
205
216
  ).toBe((tamagui as Record<string, unknown>)[name]);
206
217
  }
207
218
  });
219
+
220
+ it("exports LinearGradient from tamagui/linear-gradient, not the main tamagui barrel", () => {
221
+ expect((tamagui as Record<string, unknown>).LinearGradient).toBeUndefined();
222
+ expect(houseTamagui.LinearGradient).toBe(tamaguiLinearGradient.LinearGradient);
223
+ expect(pkg.LinearGradient).toBe(tamaguiLinearGradient.LinearGradient);
224
+ });
225
+
226
+ it("every Components story import from ./tamagui is a live barrel export (MPO-169)", () => {
227
+ const exported = new Set(Object.keys(houseTamagui));
228
+ const missing: string[] = [];
229
+ for (const file of walkStoryFiles(import.meta.dirname)) {
230
+ for (const name of namedValueImportsFromHouseTamagui(readFileSync(file, "utf8"))) {
231
+ if (!exported.has(name)) {
232
+ missing.push(`${file.slice(import.meta.dirname.length + 1)}:${name}`);
233
+ }
234
+ }
235
+ }
236
+ expect(
237
+ missing,
238
+ `stories import names ./tamagui.ts does not export: ${missing.join(", ")}`,
239
+ ).toEqual([]);
240
+ });
208
241
  });
209
242
 
243
+ function walkStoryFiles(dir: string): string[] {
244
+ const out: string[] = [];
245
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
246
+ const path = join(dir, entry.name);
247
+ if (entry.isDirectory()) out.push(...walkStoryFiles(path));
248
+ else if (/\.stories\.tsx?$/.test(entry.name)) out.push(path);
249
+ }
250
+ return out;
251
+ }
252
+
253
+ function namedValueImportsFromHouseTamagui(src: string): string[] {
254
+ const names: string[] = [];
255
+ const re = /import\s+(type\s+)?\{([^}]+)\}\s+from\s+["']\.\/tamagui["']/g;
256
+ for (const match of src.matchAll(re)) {
257
+ const wholeClauseIsType = Boolean(match[1]);
258
+ for (const raw of match[2].split(",")) {
259
+ const part = raw.trim();
260
+ if (!part) continue;
261
+ if (wholeClauseIsType || /^type\s/.test(part)) continue;
262
+ names.push(
263
+ part
264
+ .replace(/^type\s+/, "")
265
+ .split(/\s+as\s+/)[0]
266
+ .trim(),
267
+ );
268
+ }
269
+ }
270
+ return names;
271
+ }
272
+
210
273
  // ---------------------------------------------------------------------------
211
274
  // Type-level locks (checked by `tsc --noEmit`, not vitest): excluded Props
212
275
  // types must not be re-exported either, and allowlisted types must exist.
package/src/tamagui.ts CHANGED
@@ -30,7 +30,6 @@
30
30
  // quiet = opacity 0.5). Raw stays reachable as TamaguiSeparator below.
31
31
  export {
32
32
  Circle,
33
- Collapsible,
34
33
  Group,
35
34
  ListItem,
36
35
  ScrollView,
@@ -175,3 +174,6 @@ export {
175
174
  SizableText as TamaguiSizableText,
176
175
  Text as TamaguiText,
177
176
  } from "tamagui";
177
+
178
+ // Safe disclosure button defaults around the unpainted compound.
179
+ export { Collapsible } from "./Collapsible";
@@ -8,7 +8,8 @@ import {
8
8
  UsersIcon,
9
9
  } from "@phosphor-icons/react";
10
10
  import type { Meta } from "@storybook/react-native-web-vite";
11
- import { Dashboard, type DashboardWidget } from "./Dashboard";
11
+ import { YStack } from "tamagui";
12
+ import { Dashboard, KPICard, type DashboardWidget } from "./Dashboard";
12
13
 
13
14
  const iconSize = 16;
14
15
 
@@ -165,6 +166,42 @@ const meta: Meta = {
165
166
 
166
167
  export default meta;
167
168
 
169
+ export const TrendSentiment = {
170
+ render: () => (
171
+ <YStack width="100%" maxWidth={360} gap="$3">
172
+ <KPICard
173
+ config={{
174
+ id: "improving",
175
+ title: "Improving revenue",
176
+ value: 120,
177
+ trend: "up",
178
+ trendValue: "+12%",
179
+ goodDirection: "up",
180
+ }}
181
+ />
182
+ <KPICard
183
+ config={{
184
+ id: "worsening",
185
+ title: "Worsening revenue",
186
+ value: 96,
187
+ trend: "down",
188
+ trendValue: "-4%",
189
+ goodDirection: "up",
190
+ }}
191
+ />
192
+ <KPICard
193
+ config={{
194
+ id: "undeclared",
195
+ title: "Undeclared sentiment",
196
+ value: 102,
197
+ trend: "up",
198
+ trendValue: "2%",
199
+ }}
200
+ />
201
+ </YStack>
202
+ ),
203
+ };
204
+
168
205
  export const Default = {
169
206
  name: "Main",
170
207
  render: () => (
@@ -1,4 +1,5 @@
1
1
  import { Meter } from "../Meter";
2
+ import { ChartDataView } from "../charts/ChartDataView";
2
3
  import { BarChart } from "../charts/BarChart";
3
4
  import { LineChart } from "../charts/LineChart";
4
5
  import { PieChart } from "../charts/PieChart";
@@ -12,7 +13,7 @@ import {
12
13
  formatPercent,
13
14
  useResolvedKnobs,
14
15
  } from "@multiplatform.one/theme";
15
- import React, { useCallback, useMemo, type ReactNode } from "react";
16
+ import React, { useCallback, useMemo, useState, type ReactNode } from "react";
16
17
  import { useTranslation } from "../shared/i18n";
17
18
  import {
18
19
  ScrollView,
@@ -56,6 +57,13 @@ function trendFill(color: string): string {
56
57
  return "$color4";
57
58
  }
58
59
 
60
+ function trendInk(color: string): string {
61
+ // Step 11 clears the page, but falls below AA on the status pill's step 4 wash.
62
+ if (color === componentColors.semantic.success) return "$green12";
63
+ if (color === componentColors.semantic.error) return "$red12";
64
+ return color;
65
+ }
66
+
59
67
  // ============================================================================
60
68
  // Types
61
69
  // ============================================================================
@@ -222,7 +230,7 @@ export interface DashboardProps extends Omit<YStackProps, "children"> {
222
230
  // Shared card chrome
223
231
  // ============================================================================
224
232
 
225
- function useWidgetChrome(onPress?: () => void) {
233
+ function useWidgetChrome(onPress?: YStackProps["onPress"]) {
226
234
  const resolved = useResolvedKnobs();
227
235
  const { knobProps, control } = resolved;
228
236
  const nested = splitNestedControl(knobProps.nestedControl);
@@ -294,11 +302,11 @@ function TrendPill({
294
302
  {...radius}
295
303
  data-nested-px={px}
296
304
  >
297
- <Text {...label} color={color}>
305
+ <Text {...label} color={trendInk(color)}>
298
306
  {symbol}
299
307
  </Text>
300
308
  {value != null && value !== "" && (
301
- <Text {...label} color={color}>
309
+ <Text {...label} color={trendInk(color)}>
302
310
  {value}
303
311
  </Text>
304
312
  )}
@@ -339,8 +347,13 @@ export function resolveTrendColor(
339
347
  */
340
348
  export function KPICard({ config, ...stackProps }: KPICardProps) {
341
349
  const { t } = useTranslation();
342
- const { knobProps, nested, interactive } = useWidgetChrome(config.onClick);
350
+ const { onPress: consumerOnPress, ...cardProps } = stackProps;
351
+ const onPress = Object.hasOwn(stackProps, "onPress") ? consumerOnPress : config.onClick;
352
+ const { knobProps, nested, interactive } = useWidgetChrome(onPress);
343
353
  const { px, box } = nested;
354
+ const [dataActionSize, setDataActionSize] = useState({ width: 0, height: 44 });
355
+ const [dataHeaderHeight, setDataHeaderHeight] = useState(44);
356
+ const hasDataView = Boolean(config.sparkline?.length);
344
357
  const formatMetric = useCallback(
345
358
  (num: number) => {
346
359
  if (config.format === "currency") {
@@ -370,15 +383,16 @@ export function KPICard({ config, ...stackProps }: KPICardProps) {
370
383
  return "—";
371
384
  }, [config.trend]);
372
385
 
373
- return (
374
- <Card
375
- width="100%"
376
- elevation={knobProps.elevation}
377
- {...knobProps.surface}
378
- {...interactive}
379
- {...stackProps}
380
- >
381
- <XStack justifyContent="space-between" alignItems="flex-start">
386
+ const content = (
387
+ <>
388
+ <XStack
389
+ justifyContent="space-between"
390
+ alignItems="center"
391
+ {...knobProps.gap}
392
+ onLayout={
393
+ hasDataView ? (event) => setDataHeaderHeight(event.nativeEvent.layout.height) : undefined
394
+ }
395
+ >
382
396
  <Text {...knobProps.label} color={knobProps.textAccentColor} flex={1}>
383
397
  {config.title}
384
398
  </Text>
@@ -387,6 +401,13 @@ export function KPICard({ config, ...stackProps }: KPICardProps) {
387
401
  {config.icon}
388
402
  </NestedIconWell>
389
403
  ) : null}
404
+ {hasDataView ? (
405
+ <YStack
406
+ width={dataActionSize.width}
407
+ height={dataActionSize.height}
408
+ pointerEvents="none"
409
+ />
410
+ ) : null}
390
411
  </XStack>
391
412
 
392
413
  <Text fontSize="$8" color="$color" {...knobProps.heading}>
@@ -394,7 +415,12 @@ export function KPICard({ config, ...stackProps }: KPICardProps) {
394
415
  </Text>
395
416
 
396
417
  {config.sparkline && config.sparkline.length > 0 ? (
397
- <Sparkline data={config.sparkline} height={px} title={config.title} />
418
+ <Sparkline
419
+ data={config.sparkline}
420
+ height={px}
421
+ title={config.title}
422
+ valueFormatter={formatMetric}
423
+ />
398
424
  ) : null}
399
425
 
400
426
  {(config.trend || config.trendValue) && (
@@ -414,10 +440,70 @@ export function KPICard({ config, ...stackProps }: KPICardProps) {
414
440
  )}
415
441
  </XStack>
416
442
  )}
417
- </Card>
443
+ </>
444
+ );
445
+ if (!hasDataView)
446
+ return (
447
+ <Card
448
+ width="100%"
449
+ elevation={knobProps.elevation}
450
+ {...knobProps.surface}
451
+ {...interactive}
452
+ {...stackProps}
453
+ >
454
+ {content}
455
+ </Card>
456
+ );
457
+ return (
458
+ <ChartDataView data={config.sparkline!} title={config.title} valueFormatter={formatMetric}>
459
+ {({ action }) => (
460
+ <Card width="100%" elevation={knobProps.elevation} {...knobProps.surface} {...cardProps}>
461
+ <YStack position="relative">
462
+ <YStack
463
+ {...knobProps.gap}
464
+ {...knobProps.containerRadius}
465
+ {...interactive}
466
+ focusable={Boolean(onPress)}
467
+ {...(isWeb
468
+ ? {
469
+ "data-mpo-kpi-navigation": config.id,
470
+ tabIndex: onPress ? 0 : undefined,
471
+ onKeyDown: onPress
472
+ ? (event: React.KeyboardEvent<HTMLElement>) => {
473
+ if (event.key === "Enter" || event.key === " ") {
474
+ event.preventDefault();
475
+ if (!event.repeat) event.currentTarget.click();
476
+ }
477
+ }
478
+ : undefined,
479
+ }
480
+ : {})}
481
+ >
482
+ {content}
483
+ </YStack>
484
+ <YStack
485
+ position="absolute"
486
+ top={Math.max(0, (dataHeaderHeight - dataActionSize.height) / 2)}
487
+ right={0}
488
+ minHeight={44}
489
+ justifyContent="center"
490
+ onLayout={(event) => {
491
+ const { width, height } = event.nativeEvent.layout;
492
+ setDataActionSize((previous) =>
493
+ previous.width === width && previous.height === height
494
+ ? previous
495
+ : { width, height },
496
+ );
497
+ }}
498
+ >
499
+ {action}
500
+ </YStack>
501
+ </YStack>
502
+ </Card>
503
+ )}
504
+ </ChartDataView>
418
505
  );
419
506
  }
420
-
421
507
  // ============================================================================
422
508
  // Chart Card Component
423
509
  // ============================================================================
@@ -455,11 +541,14 @@ export function ChartCard({ config, colors, headingLevel = 2, ...stackProps }: C
455
541
  const dataColors = config.colors ?? colors;
456
542
  const showXAxis = config.showLabels !== false;
457
543
 
458
- return (
544
+ const renderCard = (action?: ReactNode) => (
459
545
  <YStack {...knobProps.gap} width="100%" {...stackProps}>
460
- <HeadingTag margin={0} {...knobProps.heading} {...sectionHeading}>
461
- {config.title}
462
- </HeadingTag>
546
+ <XStack alignItems="center" justifyContent="space-between" {...knobProps.gap}>
547
+ <HeadingTag flex={1} minWidth={0} margin={0} {...knobProps.heading} {...sectionHeading}>
548
+ {config.title}
549
+ </HeadingTag>
550
+ {action}
551
+ </XStack>
463
552
  <Card elevation={knobProps.elevation} {...knobProps.surface}>
464
553
  {config.type === "pie" ? (
465
554
  <PieChart
@@ -473,6 +562,7 @@ export function ChartCard({ config, colors, headingLevel = 2, ...stackProps }: C
473
562
  ) : config.type === "line" ? (
474
563
  <LineChart
475
564
  data={config.data}
565
+ title={config.title}
476
566
  height={config.height}
477
567
  color={dataColors?.[0]}
478
568
  showPoints
@@ -482,6 +572,7 @@ export function ChartCard({ config, colors, headingLevel = 2, ...stackProps }: C
482
572
  ) : (
483
573
  <BarChart
484
574
  data={config.data}
575
+ title={config.title}
485
576
  height={config.height}
486
577
  colors={dataColors}
487
578
  showXAxis={showXAxis}
@@ -491,6 +582,13 @@ export function ChartCard({ config, colors, headingLevel = 2, ...stackProps }: C
491
582
  </Card>
492
583
  </YStack>
493
584
  );
585
+ return config.type === "pie" && config.showLegend !== false ? (
586
+ renderCard()
587
+ ) : (
588
+ <ChartDataView data={config.data} title={config.title}>
589
+ {({ action }) => renderCard(action)}
590
+ </ChartDataView>
591
+ );
494
592
  }
495
593
 
496
594
  // ============================================================================
@@ -0,0 +1,120 @@
1
+ import { act, cleanup, fireEvent } from "@testing-library/react";
2
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
3
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
4
+ import { GanttView, type GanttTask } from "./Gantt";
5
+ import { addDays, computeGanttRange, dateToX, rangeDays, startOfDay } from "./ganttMath";
6
+
7
+ // Match the Carousel layout harness: RNW measures through ResizeObserver and
8
+ // a deferred offsetWidth read. Keep prototype patches isolated to this file.
9
+ let viewportWidth = 178;
10
+ const resizeCallbacks = new Map<Element, () => void>();
11
+ vi.stubGlobal(
12
+ "ResizeObserver",
13
+ class {
14
+ constructor(private callback: ResizeObserverCallback) {}
15
+ observe(target: Element) {
16
+ const notify = () =>
17
+ this.callback([{ target } as ResizeObserverEntry], this as unknown as ResizeObserver);
18
+ resizeCallbacks.set(target, notify);
19
+ notify();
20
+ }
21
+ unobserve(target: Element) {
22
+ resizeCallbacks.delete(target);
23
+ }
24
+ disconnect() {}
25
+ },
26
+ );
27
+ Object.defineProperty(HTMLElement.prototype, "offsetWidth", {
28
+ configurable: true,
29
+ get: () => viewportWidth,
30
+ });
31
+ Object.defineProperty(HTMLElement.prototype, "offsetHeight", {
32
+ configurable: true,
33
+ get: () => 240,
34
+ });
35
+ const scrollCalls: number[] = [];
36
+ Object.defineProperty(HTMLElement.prototype, "scroll", {
37
+ configurable: true,
38
+ writable: true,
39
+ value(options: { left?: number }) {
40
+ if (typeof options.left === "number") scrollCalls.push(options.left);
41
+ },
42
+ });
43
+
44
+ const today = startOfDay(new Date());
45
+ const tasks: GanttTask[] = [
46
+ { id: "track", title: "Track", start: addDays(today, -44), end: addDays(today, 19) },
47
+ ];
48
+ const range = computeGanttRange([{ start: tasks[0].start!, end: tasks[0].end! }], "week", today);
49
+ const chartWidth = rangeDays(range) * 24;
50
+ const anchorX = dateToX(today, range.start, 24);
51
+
52
+ async function flushLayout() {
53
+ await act(async () => new Promise((resolve) => setTimeout(resolve, 0)));
54
+ }
55
+
56
+ beforeEach(() => {
57
+ viewportWidth = 178;
58
+ scrollCalls.length = 0;
59
+ });
60
+ afterEach(() => {
61
+ cleanup();
62
+ document.documentElement.removeAttribute("dir");
63
+ });
64
+
65
+ describe("Gantt measured viewport anchoring", () => {
66
+ it("reanchors a narrow LTR mount after layout so the marker is inside the viewport", async () => {
67
+ renderWithProviders(<GanttView tasks={tasks} initialDate={today} markerDate={today} />);
68
+ await flushLayout();
69
+ const left = scrollCalls.at(-1)!;
70
+ expect(left).toBeGreaterThanOrEqual(0);
71
+ expect(left).toBeLessThanOrEqual(chartWidth - viewportWidth);
72
+ expect(anchorX + 12 - left).toBeGreaterThanOrEqual(0);
73
+ expect(anchorX + 12 - left).toBeLessThan(viewportWidth);
74
+ });
75
+
76
+ it("keeps the narrow RTL marker inside the mirrored viewport", async () => {
77
+ document.documentElement.setAttribute("dir", "rtl");
78
+ renderWithProviders(<GanttView tasks={tasks} initialDate={today} markerDate={today} />);
79
+ await flushLayout();
80
+ const markerLeft = chartWidth - anchorX - 12 - scrollCalls.at(-1)!;
81
+ expect(markerLeft).toBeGreaterThanOrEqual(0);
82
+ expect(markerLeft).toBeLessThan(viewportWidth);
83
+ });
84
+
85
+ it("retains its pending anchor through a hidden zero-width first layout", async () => {
86
+ viewportWidth = 0;
87
+ renderWithProviders(<GanttView tasks={tasks} initialDate={today} markerDate={today} />);
88
+ await flushLayout();
89
+ viewportWidth = 178;
90
+ for (const notify of resizeCallbacks.values()) notify();
91
+ await flushLayout();
92
+ const markerLeft = anchorX + 12 - scrollCalls.at(-1)!;
93
+ expect(markerLeft).toBeGreaterThanOrEqual(0);
94
+ expect(markerLeft).toBeLessThan(viewportWidth);
95
+ });
96
+
97
+ it("preserves the desktop anchor inset", async () => {
98
+ viewportWidth = 820;
99
+ renderWithProviders(<GanttView tasks={tasks} initialDate={today} />);
100
+ await flushLayout();
101
+ expect(scrollCalls.at(-1)).toBe(anchorX - 180);
102
+ });
103
+
104
+ it("clamps a range-end anchor to the measured scroll extent", async () => {
105
+ viewportWidth = 820;
106
+ renderWithProviders(<GanttView tasks={tasks} initialDate={addDays(range.end, -1)} />);
107
+ await flushLayout();
108
+ expect(scrollCalls.at(-1)).toBeLessThanOrEqual(chartWidth - viewportWidth);
109
+ });
110
+
111
+ it("uses the measured viewport for the Today action", async () => {
112
+ const result = renderWithProviders(<GanttView tasks={tasks} initialDate={range.start} />);
113
+ await flushLayout();
114
+ scrollCalls.length = 0;
115
+ fireEvent.click(result.getByRole("button", { name: "Today" }));
116
+ const markerLeft = anchorX + 12 - scrollCalls.at(-1)!;
117
+ expect(markerLeft).toBeGreaterThanOrEqual(0);
118
+ expect(markerLeft).toBeLessThan(viewportWidth);
119
+ });
120
+ });