@multiplatform.one/components 7.7.6 → 7.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (565) hide show
  1. package/dist/cjs/Button.native.js.map +1 -1
  2. package/dist/cjs/Card.cjs +7 -1
  3. package/dist/cjs/Card.native.js +11 -1
  4. package/dist/cjs/Card.native.js.map +1 -1
  5. package/dist/cjs/CardFooter.cjs +1 -0
  6. package/dist/cjs/CardFooter.native.js +1 -0
  7. package/dist/cjs/CardFooter.native.js.map +1 -1
  8. package/dist/cjs/CopyField/index.cjs +6 -1
  9. package/dist/cjs/CopyField/index.native.js +6 -1
  10. package/dist/cjs/CopyField/index.native.js.map +1 -1
  11. package/dist/cjs/DropdownMenu/index.cjs +31 -1
  12. package/dist/cjs/DropdownMenu/index.native.js +31 -1
  13. package/dist/cjs/DropdownMenu/index.native.js.map +1 -1
  14. package/dist/cjs/Meter/index.cjs +12 -5
  15. package/dist/cjs/Meter/index.native.js +12 -5
  16. package/dist/cjs/Meter/index.native.js.map +1 -1
  17. package/dist/cjs/Tabs/index.cjs +7 -6
  18. package/dist/cjs/Tabs/index.native.js +8 -7
  19. package/dist/cjs/Tabs/index.native.js.map +1 -1
  20. package/dist/cjs/Toast/index.cjs +53 -2
  21. package/dist/cjs/Toast/index.native.js +55 -2
  22. package/dist/cjs/Toast/index.native.js.map +1 -1
  23. package/dist/cjs/actions/DestructiveAction.cjs +7 -13
  24. package/dist/cjs/actions/DestructiveAction.native.js +7 -15
  25. package/dist/cjs/actions/DestructiveAction.native.js.map +1 -1
  26. package/dist/cjs/charts/Axis.cjs +5 -0
  27. package/dist/cjs/charts/Axis.native.js +5 -0
  28. package/dist/cjs/charts/Axis.native.js.map +1 -1
  29. package/dist/cjs/charts/BarChart.cjs +71 -57
  30. package/dist/cjs/charts/BarChart.native.js +81 -67
  31. package/dist/cjs/charts/BarChart.native.js.map +1 -1
  32. package/dist/cjs/charts/ChartDataView.cjs +212 -0
  33. package/dist/cjs/charts/ChartDataView.native.js +224 -0
  34. package/dist/cjs/charts/ChartDataView.native.js.map +1 -0
  35. package/dist/cjs/charts/ChartSurface.cjs +5 -1
  36. package/dist/cjs/charts/ChartSurface.native.js +5 -1
  37. package/dist/cjs/charts/ChartSurface.native.js.map +1 -1
  38. package/dist/cjs/charts/LineChart.cjs +81 -67
  39. package/dist/cjs/charts/LineChart.native.js +94 -80
  40. package/dist/cjs/charts/LineChart.native.js.map +1 -1
  41. package/dist/cjs/charts/PieChart.cjs +98 -73
  42. package/dist/cjs/charts/PieChart.native.js +109 -84
  43. package/dist/cjs/charts/PieChart.native.js.map +1 -1
  44. package/dist/cjs/charts/Sparkline.cjs +10 -1
  45. package/dist/cjs/charts/Sparkline.native.js +10 -1
  46. package/dist/cjs/charts/Sparkline.native.js.map +1 -1
  47. package/dist/cjs/charts/accessibility.cjs +4 -0
  48. package/dist/cjs/charts/accessibility.native.js +7 -0
  49. package/dist/cjs/charts/accessibility.native.js.map +1 -1
  50. package/dist/cjs/charts/index.cjs +3 -1
  51. package/dist/cjs/charts/index.native.js +2 -0
  52. package/dist/cjs/charts/index.native.js.map +1 -1
  53. package/dist/cjs/charts/math.cjs +16 -0
  54. package/dist/cjs/charts/math.native.js +18 -0
  55. package/dist/cjs/charts/math.native.js.map +1 -1
  56. package/dist/cjs/charts/series.cjs +49 -7
  57. package/dist/cjs/charts/series.native.js +53 -11
  58. package/dist/cjs/charts/series.native.js.map +1 -1
  59. package/dist/cjs/charts/svg.cjs +46 -3
  60. package/dist/cjs/charts/svg.native.js +46 -3
  61. package/dist/cjs/charts/svg.native.js.map +1 -1
  62. package/dist/cjs/code/CodeBlock/index.cjs +6 -1
  63. package/dist/cjs/code/CodeBlock/index.native.js +6 -1
  64. package/dist/cjs/code/CodeBlock/index.native.js.map +1 -1
  65. package/dist/cjs/feedback/ConfirmDialog.cjs +7 -21
  66. package/dist/cjs/feedback/ConfirmDialog.native.js +7 -22
  67. package/dist/cjs/feedback/ConfirmDialog.native.js.map +1 -1
  68. package/dist/cjs/feedback/NotifyHost.cjs +2 -1
  69. package/dist/cjs/feedback/NotifyHost.native.js +3 -2
  70. package/dist/cjs/feedback/NotifyHost.native.js.map +1 -1
  71. package/dist/cjs/feedback/copy.cjs +36 -4
  72. package/dist/cjs/feedback/copy.native.js +38 -4
  73. package/dist/cjs/feedback/copy.native.js.map +1 -1
  74. package/dist/cjs/feedback/index.cjs +1 -0
  75. package/dist/cjs/feedback/index.native.js +1 -0
  76. package/dist/cjs/feedback/index.native.js.map +1 -1
  77. package/dist/cjs/feedback/notify.cjs +1 -0
  78. package/dist/cjs/feedback/notify.native.js +1 -0
  79. package/dist/cjs/feedback/notify.native.js.map +1 -1
  80. package/dist/cjs/feedback/route.cjs +3 -0
  81. package/dist/cjs/feedback/route.native.js +3 -0
  82. package/dist/cjs/feedback/route.native.js.map +1 -1
  83. package/dist/cjs/feedback/store.cjs +6 -0
  84. package/dist/cjs/feedback/store.native.js +8 -0
  85. package/dist/cjs/feedback/store.native.js.map +1 -1
  86. package/dist/cjs/icons/lucide.cjs +2 -1
  87. package/dist/cjs/icons/lucide.native.js +2 -1
  88. package/dist/cjs/icons/lucide.native.js.map +1 -1
  89. package/dist/cjs/layouts/PaneScaffold.cjs +96 -41
  90. package/dist/cjs/layouts/PaneScaffold.native.js +97 -41
  91. package/dist/cjs/layouts/PaneScaffold.native.js.map +1 -1
  92. package/dist/cjs/layouts/index.cjs +2 -0
  93. package/dist/cjs/layouts/index.native.js +2 -0
  94. package/dist/cjs/layouts/index.native.js.map +1 -1
  95. package/dist/cjs/layouts/page.cjs +48 -7
  96. package/dist/cjs/layouts/page.native.js +50 -7
  97. package/dist/cjs/layouts/page.native.js.map +1 -1
  98. package/dist/cjs/shared/useKeyboardInset.cjs +1 -19
  99. package/dist/cjs/shared/useKeyboardInset.native.js +3 -3
  100. package/dist/cjs/shared/useKeyboardInset.native.js.map +1 -1
  101. package/dist/cjs/views/Dashboard.cjs +110 -17
  102. package/dist/cjs/views/Dashboard.native.js +151 -45
  103. package/dist/cjs/views/Dashboard.native.js.map +1 -1
  104. package/dist/cjs/views/Gantt.cjs +374 -91
  105. package/dist/cjs/views/Gantt.native.js +443 -94
  106. package/dist/cjs/views/Gantt.native.js.map +1 -1
  107. package/dist/cjs/views/ganttMath.cjs +91 -2
  108. package/dist/cjs/views/ganttMath.native.js +113 -3
  109. package/dist/cjs/views/ganttMath.native.js.map +1 -1
  110. package/dist/cjs/views/index.cjs +20 -1
  111. package/dist/cjs/views/index.native.js +20 -1
  112. package/dist/cjs/views/index.native.js.map +1 -1
  113. package/dist/esm/Button.mjs.map +1 -1
  114. package/dist/esm/Button.native.js.map +1 -1
  115. package/dist/esm/Card.mjs +8 -2
  116. package/dist/esm/Card.mjs.map +1 -1
  117. package/dist/esm/Card.native.js +12 -2
  118. package/dist/esm/Card.native.js.map +1 -1
  119. package/dist/esm/CardFooter.mjs +1 -0
  120. package/dist/esm/CardFooter.mjs.map +1 -1
  121. package/dist/esm/CardFooter.native.js +1 -0
  122. package/dist/esm/CardFooter.native.js.map +1 -1
  123. package/dist/esm/CopyField/index.mjs +7 -2
  124. package/dist/esm/CopyField/index.mjs.map +1 -1
  125. package/dist/esm/CopyField/index.native.js +7 -2
  126. package/dist/esm/CopyField/index.native.js.map +1 -1
  127. package/dist/esm/DropdownMenu/index.mjs +32 -2
  128. package/dist/esm/DropdownMenu/index.mjs.map +1 -1
  129. package/dist/esm/DropdownMenu/index.native.js +32 -2
  130. package/dist/esm/DropdownMenu/index.native.js.map +1 -1
  131. package/dist/esm/Meter/index.mjs +12 -5
  132. package/dist/esm/Meter/index.mjs.map +1 -1
  133. package/dist/esm/Meter/index.native.js +12 -5
  134. package/dist/esm/Meter/index.native.js.map +1 -1
  135. package/dist/esm/Tabs/index.mjs +7 -6
  136. package/dist/esm/Tabs/index.mjs.map +1 -1
  137. package/dist/esm/Tabs/index.native.js +8 -7
  138. package/dist/esm/Tabs/index.native.js.map +1 -1
  139. package/dist/esm/Toast/index.mjs +52 -3
  140. package/dist/esm/Toast/index.mjs.map +1 -1
  141. package/dist/esm/Toast/index.native.js +54 -3
  142. package/dist/esm/Toast/index.native.js.map +1 -1
  143. package/dist/esm/actions/DestructiveAction.mjs +8 -14
  144. package/dist/esm/actions/DestructiveAction.mjs.map +1 -1
  145. package/dist/esm/actions/DestructiveAction.native.js +8 -16
  146. package/dist/esm/actions/DestructiveAction.native.js.map +1 -1
  147. package/dist/esm/charts/Axis.mjs +6 -1
  148. package/dist/esm/charts/Axis.mjs.map +1 -1
  149. package/dist/esm/charts/Axis.native.js +6 -1
  150. package/dist/esm/charts/Axis.native.js.map +1 -1
  151. package/dist/esm/charts/BarChart.mjs +72 -58
  152. package/dist/esm/charts/BarChart.mjs.map +1 -1
  153. package/dist/esm/charts/BarChart.native.js +82 -68
  154. package/dist/esm/charts/BarChart.native.js.map +1 -1
  155. package/dist/esm/charts/ChartDataView.mjs +185 -0
  156. package/dist/esm/charts/ChartDataView.mjs.map +1 -0
  157. package/dist/esm/charts/ChartDataView.native.js +194 -0
  158. package/dist/esm/charts/ChartDataView.native.js.map +1 -0
  159. package/dist/esm/charts/ChartSurface.mjs +5 -1
  160. package/dist/esm/charts/ChartSurface.mjs.map +1 -1
  161. package/dist/esm/charts/ChartSurface.native.js +5 -1
  162. package/dist/esm/charts/ChartSurface.native.js.map +1 -1
  163. package/dist/esm/charts/LineChart.mjs +82 -68
  164. package/dist/esm/charts/LineChart.mjs.map +1 -1
  165. package/dist/esm/charts/LineChart.native.js +95 -81
  166. package/dist/esm/charts/LineChart.native.js.map +1 -1
  167. package/dist/esm/charts/PieChart.mjs +100 -75
  168. package/dist/esm/charts/PieChart.mjs.map +1 -1
  169. package/dist/esm/charts/PieChart.native.js +111 -86
  170. package/dist/esm/charts/PieChart.native.js.map +1 -1
  171. package/dist/esm/charts/Sparkline.mjs +11 -2
  172. package/dist/esm/charts/Sparkline.mjs.map +1 -1
  173. package/dist/esm/charts/Sparkline.native.js +11 -2
  174. package/dist/esm/charts/Sparkline.native.js.map +1 -1
  175. package/dist/esm/charts/accessibility.mjs +4 -1
  176. package/dist/esm/charts/accessibility.mjs.map +1 -1
  177. package/dist/esm/charts/accessibility.native.js +7 -1
  178. package/dist/esm/charts/accessibility.native.js.map +1 -1
  179. package/dist/esm/charts/index.mjs +2 -1
  180. package/dist/esm/charts/index.mjs.map +1 -1
  181. package/dist/esm/charts/index.native.js +2 -1
  182. package/dist/esm/charts/index.native.js.map +1 -1
  183. package/dist/esm/charts/math.mjs +16 -1
  184. package/dist/esm/charts/math.mjs.map +1 -1
  185. package/dist/esm/charts/math.native.js +18 -1
  186. package/dist/esm/charts/math.native.js.map +1 -1
  187. package/dist/esm/charts/series.mjs +51 -9
  188. package/dist/esm/charts/series.mjs.map +1 -1
  189. package/dist/esm/charts/series.native.js +55 -13
  190. package/dist/esm/charts/series.native.js.map +1 -1
  191. package/dist/esm/charts/svg.mjs +40 -4
  192. package/dist/esm/charts/svg.mjs.map +1 -1
  193. package/dist/esm/charts/svg.native.js +40 -4
  194. package/dist/esm/charts/svg.native.js.map +1 -1
  195. package/dist/esm/code/CodeBlock/index.mjs +7 -2
  196. package/dist/esm/code/CodeBlock/index.mjs.map +1 -1
  197. package/dist/esm/code/CodeBlock/index.native.js +7 -2
  198. package/dist/esm/code/CodeBlock/index.native.js.map +1 -1
  199. package/dist/esm/feedback/ConfirmDialog.mjs +8 -22
  200. package/dist/esm/feedback/ConfirmDialog.mjs.map +1 -1
  201. package/dist/esm/feedback/ConfirmDialog.native.js +8 -23
  202. package/dist/esm/feedback/ConfirmDialog.native.js.map +1 -1
  203. package/dist/esm/feedback/NotifyHost.mjs +2 -1
  204. package/dist/esm/feedback/NotifyHost.mjs.map +1 -1
  205. package/dist/esm/feedback/NotifyHost.native.js +3 -2
  206. package/dist/esm/feedback/NotifyHost.native.js.map +1 -1
  207. package/dist/esm/feedback/copy.mjs +35 -4
  208. package/dist/esm/feedback/copy.mjs.map +1 -1
  209. package/dist/esm/feedback/copy.native.js +37 -4
  210. package/dist/esm/feedback/copy.native.js.map +1 -1
  211. package/dist/esm/feedback/index.mjs +2 -2
  212. package/dist/esm/feedback/index.mjs.map +1 -1
  213. package/dist/esm/feedback/index.native.js +2 -2
  214. package/dist/esm/feedback/index.native.js.map +1 -1
  215. package/dist/esm/feedback/notify.mjs +1 -0
  216. package/dist/esm/feedback/notify.mjs.map +1 -1
  217. package/dist/esm/feedback/notify.native.js +1 -0
  218. package/dist/esm/feedback/notify.native.js.map +1 -1
  219. package/dist/esm/feedback/route.mjs +3 -0
  220. package/dist/esm/feedback/route.mjs.map +1 -1
  221. package/dist/esm/feedback/route.native.js +3 -0
  222. package/dist/esm/feedback/route.native.js.map +1 -1
  223. package/dist/esm/feedback/store.mjs +6 -1
  224. package/dist/esm/feedback/store.mjs.map +1 -1
  225. package/dist/esm/feedback/store.native.js +8 -1
  226. package/dist/esm/feedback/store.native.js.map +1 -1
  227. package/dist/esm/icons/lucide.mjs +2 -2
  228. package/dist/esm/icons/lucide.mjs.map +1 -1
  229. package/dist/esm/icons/lucide.native.js +2 -2
  230. package/dist/esm/icons/lucide.native.js.map +1 -1
  231. package/dist/esm/layouts/PaneScaffold.mjs +97 -42
  232. package/dist/esm/layouts/PaneScaffold.mjs.map +1 -1
  233. package/dist/esm/layouts/PaneScaffold.native.js +98 -42
  234. package/dist/esm/layouts/PaneScaffold.native.js.map +1 -1
  235. package/dist/esm/layouts/index.mjs +2 -1
  236. package/dist/esm/layouts/index.mjs.map +1 -1
  237. package/dist/esm/layouts/index.native.js +2 -1
  238. package/dist/esm/layouts/index.native.js.map +1 -1
  239. package/dist/esm/layouts/page.mjs +49 -8
  240. package/dist/esm/layouts/page.mjs.map +1 -1
  241. package/dist/esm/layouts/page.native.js +51 -8
  242. package/dist/esm/layouts/page.native.js.map +1 -1
  243. package/dist/esm/shared/useKeyboardInset.mjs +1 -19
  244. package/dist/esm/shared/useKeyboardInset.mjs.map +1 -1
  245. package/dist/esm/shared/useKeyboardInset.native.js.map +1 -1
  246. package/dist/esm/views/Dashboard.mjs +112 -19
  247. package/dist/esm/views/Dashboard.mjs.map +1 -1
  248. package/dist/esm/views/Dashboard.native.js +153 -47
  249. package/dist/esm/views/Dashboard.native.js.map +1 -1
  250. package/dist/esm/views/Gantt.mjs +376 -93
  251. package/dist/esm/views/Gantt.mjs.map +1 -1
  252. package/dist/esm/views/Gantt.native.js +445 -96
  253. package/dist/esm/views/Gantt.native.js.map +1 -1
  254. package/dist/esm/views/ganttMath.mjs +84 -3
  255. package/dist/esm/views/ganttMath.mjs.map +1 -1
  256. package/dist/esm/views/ganttMath.native.js +106 -4
  257. package/dist/esm/views/ganttMath.native.js.map +1 -1
  258. package/dist/esm/views/index.mjs +2 -2
  259. package/dist/esm/views/index.mjs.map +1 -1
  260. package/dist/esm/views/index.native.js +2 -2
  261. package/dist/esm/views/index.native.js.map +1 -1
  262. package/dist/jsx/Button.mjs.map +1 -1
  263. package/dist/jsx/Button.native.js.map +1 -1
  264. package/dist/jsx/Card.mjs +8 -2
  265. package/dist/jsx/Card.mjs.map +1 -1
  266. package/dist/jsx/Card.native.js +11 -1
  267. package/dist/jsx/Card.native.js.map +1 -1
  268. package/dist/jsx/CardFooter.mjs +1 -0
  269. package/dist/jsx/CardFooter.mjs.map +1 -1
  270. package/dist/jsx/CardFooter.native.js +1 -0
  271. package/dist/jsx/CardFooter.native.js.map +1 -1
  272. package/dist/jsx/CopyField/index.mjs +7 -2
  273. package/dist/jsx/CopyField/index.mjs.map +1 -1
  274. package/dist/jsx/CopyField/index.native.js +6 -1
  275. package/dist/jsx/CopyField/index.native.js.map +1 -1
  276. package/dist/jsx/DropdownMenu/index.mjs +32 -2
  277. package/dist/jsx/DropdownMenu/index.mjs.map +1 -1
  278. package/dist/jsx/DropdownMenu/index.native.js +31 -1
  279. package/dist/jsx/DropdownMenu/index.native.js.map +1 -1
  280. package/dist/jsx/Meter/index.mjs +12 -5
  281. package/dist/jsx/Meter/index.mjs.map +1 -1
  282. package/dist/jsx/Meter/index.native.js +12 -5
  283. package/dist/jsx/Meter/index.native.js.map +1 -1
  284. package/dist/jsx/Tabs/index.mjs +7 -6
  285. package/dist/jsx/Tabs/index.mjs.map +1 -1
  286. package/dist/jsx/Tabs/index.native.js +8 -7
  287. package/dist/jsx/Tabs/index.native.js.map +1 -1
  288. package/dist/jsx/Toast/index.mjs +52 -3
  289. package/dist/jsx/Toast/index.mjs.map +1 -1
  290. package/dist/jsx/Toast/index.native.js +55 -2
  291. package/dist/jsx/Toast/index.native.js.map +1 -1
  292. package/dist/jsx/actions/DestructiveAction.mjs +8 -14
  293. package/dist/jsx/actions/DestructiveAction.mjs.map +1 -1
  294. package/dist/jsx/actions/DestructiveAction.native.js +7 -15
  295. package/dist/jsx/actions/DestructiveAction.native.js.map +1 -1
  296. package/dist/jsx/charts/Axis.mjs +6 -1
  297. package/dist/jsx/charts/Axis.mjs.map +1 -1
  298. package/dist/jsx/charts/Axis.native.js +5 -0
  299. package/dist/jsx/charts/Axis.native.js.map +1 -1
  300. package/dist/jsx/charts/BarChart.mjs +72 -58
  301. package/dist/jsx/charts/BarChart.mjs.map +1 -1
  302. package/dist/jsx/charts/BarChart.native.js +81 -67
  303. package/dist/jsx/charts/BarChart.native.js.map +1 -1
  304. package/dist/jsx/charts/ChartDataView.mjs +185 -0
  305. package/dist/jsx/charts/ChartDataView.mjs.map +1 -0
  306. package/dist/jsx/charts/ChartDataView.native.js +224 -0
  307. package/dist/jsx/charts/ChartDataView.native.js.map +1 -0
  308. package/dist/jsx/charts/ChartSurface.mjs +5 -1
  309. package/dist/jsx/charts/ChartSurface.mjs.map +1 -1
  310. package/dist/jsx/charts/ChartSurface.native.js +5 -1
  311. package/dist/jsx/charts/ChartSurface.native.js.map +1 -1
  312. package/dist/jsx/charts/LineChart.mjs +82 -68
  313. package/dist/jsx/charts/LineChart.mjs.map +1 -1
  314. package/dist/jsx/charts/LineChart.native.js +94 -80
  315. package/dist/jsx/charts/LineChart.native.js.map +1 -1
  316. package/dist/jsx/charts/PieChart.mjs +100 -75
  317. package/dist/jsx/charts/PieChart.mjs.map +1 -1
  318. package/dist/jsx/charts/PieChart.native.js +109 -84
  319. package/dist/jsx/charts/PieChart.native.js.map +1 -1
  320. package/dist/jsx/charts/Sparkline.mjs +11 -2
  321. package/dist/jsx/charts/Sparkline.mjs.map +1 -1
  322. package/dist/jsx/charts/Sparkline.native.js +10 -1
  323. package/dist/jsx/charts/Sparkline.native.js.map +1 -1
  324. package/dist/jsx/charts/accessibility.mjs +4 -1
  325. package/dist/jsx/charts/accessibility.mjs.map +1 -1
  326. package/dist/jsx/charts/accessibility.native.js +7 -0
  327. package/dist/jsx/charts/accessibility.native.js.map +1 -1
  328. package/dist/jsx/charts/index.mjs +2 -1
  329. package/dist/jsx/charts/index.mjs.map +1 -1
  330. package/dist/jsx/charts/index.native.js +2 -0
  331. package/dist/jsx/charts/index.native.js.map +1 -1
  332. package/dist/jsx/charts/math.mjs +16 -1
  333. package/dist/jsx/charts/math.mjs.map +1 -1
  334. package/dist/jsx/charts/math.native.js +18 -0
  335. package/dist/jsx/charts/math.native.js.map +1 -1
  336. package/dist/jsx/charts/series.mjs +51 -9
  337. package/dist/jsx/charts/series.mjs.map +1 -1
  338. package/dist/jsx/charts/series.native.js +53 -11
  339. package/dist/jsx/charts/series.native.js.map +1 -1
  340. package/dist/jsx/charts/svg.mjs +40 -4
  341. package/dist/jsx/charts/svg.mjs.map +1 -1
  342. package/dist/jsx/charts/svg.native.js +46 -3
  343. package/dist/jsx/charts/svg.native.js.map +1 -1
  344. package/dist/jsx/code/CodeBlock/index.mjs +7 -2
  345. package/dist/jsx/code/CodeBlock/index.mjs.map +1 -1
  346. package/dist/jsx/code/CodeBlock/index.native.js +6 -1
  347. package/dist/jsx/code/CodeBlock/index.native.js.map +1 -1
  348. package/dist/jsx/feedback/ConfirmDialog.mjs +8 -22
  349. package/dist/jsx/feedback/ConfirmDialog.mjs.map +1 -1
  350. package/dist/jsx/feedback/ConfirmDialog.native.js +7 -22
  351. package/dist/jsx/feedback/ConfirmDialog.native.js.map +1 -1
  352. package/dist/jsx/feedback/NotifyHost.mjs +2 -1
  353. package/dist/jsx/feedback/NotifyHost.mjs.map +1 -1
  354. package/dist/jsx/feedback/NotifyHost.native.js +3 -2
  355. package/dist/jsx/feedback/NotifyHost.native.js.map +1 -1
  356. package/dist/jsx/feedback/copy.mjs +35 -4
  357. package/dist/jsx/feedback/copy.mjs.map +1 -1
  358. package/dist/jsx/feedback/copy.native.js +38 -4
  359. package/dist/jsx/feedback/copy.native.js.map +1 -1
  360. package/dist/jsx/feedback/index.mjs +2 -2
  361. package/dist/jsx/feedback/index.mjs.map +1 -1
  362. package/dist/jsx/feedback/index.native.js +1 -0
  363. package/dist/jsx/feedback/index.native.js.map +1 -1
  364. package/dist/jsx/feedback/notify.mjs +1 -0
  365. package/dist/jsx/feedback/notify.mjs.map +1 -1
  366. package/dist/jsx/feedback/notify.native.js +1 -0
  367. package/dist/jsx/feedback/notify.native.js.map +1 -1
  368. package/dist/jsx/feedback/route.mjs +3 -0
  369. package/dist/jsx/feedback/route.mjs.map +1 -1
  370. package/dist/jsx/feedback/route.native.js +3 -0
  371. package/dist/jsx/feedback/route.native.js.map +1 -1
  372. package/dist/jsx/feedback/store.mjs +6 -1
  373. package/dist/jsx/feedback/store.mjs.map +1 -1
  374. package/dist/jsx/feedback/store.native.js +8 -0
  375. package/dist/jsx/feedback/store.native.js.map +1 -1
  376. package/dist/jsx/icons/lucide.mjs +2 -2
  377. package/dist/jsx/icons/lucide.mjs.map +1 -1
  378. package/dist/jsx/icons/lucide.native.js +2 -1
  379. package/dist/jsx/layouts/PaneScaffold.mjs +97 -42
  380. package/dist/jsx/layouts/PaneScaffold.mjs.map +1 -1
  381. package/dist/jsx/layouts/PaneScaffold.native.js +97 -41
  382. package/dist/jsx/layouts/PaneScaffold.native.js.map +1 -1
  383. package/dist/jsx/layouts/index.mjs +2 -1
  384. package/dist/jsx/layouts/index.mjs.map +1 -1
  385. package/dist/jsx/layouts/index.native.js +2 -0
  386. package/dist/jsx/layouts/index.native.js.map +1 -1
  387. package/dist/jsx/layouts/page.mjs +49 -8
  388. package/dist/jsx/layouts/page.mjs.map +1 -1
  389. package/dist/jsx/layouts/page.native.js +50 -7
  390. package/dist/jsx/layouts/page.native.js.map +1 -1
  391. package/dist/jsx/shared/useKeyboardInset.mjs +1 -19
  392. package/dist/jsx/shared/useKeyboardInset.mjs.map +1 -1
  393. package/dist/jsx/shared/useKeyboardInset.native.js +3 -3
  394. package/dist/jsx/shared/useKeyboardInset.native.js.map +1 -1
  395. package/dist/jsx/views/Dashboard.mjs +112 -19
  396. package/dist/jsx/views/Dashboard.mjs.map +1 -1
  397. package/dist/jsx/views/Dashboard.native.js +151 -45
  398. package/dist/jsx/views/Dashboard.native.js.map +1 -1
  399. package/dist/jsx/views/Gantt.mjs +376 -93
  400. package/dist/jsx/views/Gantt.mjs.map +1 -1
  401. package/dist/jsx/views/Gantt.native.js +443 -94
  402. package/dist/jsx/views/Gantt.native.js.map +1 -1
  403. package/dist/jsx/views/ganttMath.mjs +84 -3
  404. package/dist/jsx/views/ganttMath.mjs.map +1 -1
  405. package/dist/jsx/views/ganttMath.native.js +113 -3
  406. package/dist/jsx/views/ganttMath.native.js.map +1 -1
  407. package/dist/jsx/views/index.mjs +2 -2
  408. package/dist/jsx/views/index.mjs.map +1 -1
  409. package/dist/jsx/views/index.native.js +20 -1
  410. package/dist/jsx/views/index.native.js.map +1 -1
  411. package/package.json +11 -9
  412. package/src/Button.tsx +10 -2
  413. package/src/Card.spec.tsx +76 -3
  414. package/src/Card.stories.tsx +1 -1
  415. package/src/Card.tsx +13 -1
  416. package/src/CardFooter.stories.tsx +3 -7
  417. package/src/CardFooter.tsx +3 -1
  418. package/src/CardHeader.stories.tsx +1 -3
  419. package/src/Collapsible.stories.tsx +2 -2
  420. package/src/CopyField/CopyField.spec.tsx +66 -1
  421. package/src/CopyField/index.tsx +4 -3
  422. package/src/DropdownMenu/DropdownMenu.spec.tsx +112 -1
  423. package/src/DropdownMenu/DropdownMenu.stories.tsx +1 -3
  424. package/src/DropdownMenu/index.tsx +67 -6
  425. package/src/LinearGradient.stories.tsx +2 -2
  426. package/src/Meter/Meter.spec.tsx +59 -2
  427. package/src/Meter/Meter.stories.tsx +38 -0
  428. package/src/Meter/index.tsx +9 -4
  429. package/src/Panel.stories.tsx +1 -1
  430. package/src/SortableList/SortableList.spec.tsx +3 -3
  431. package/src/Tabs/Tabs.spec.tsx +43 -3
  432. package/src/Tabs/Tabs.stories.tsx +10 -1
  433. package/src/Tabs/index.tsx +19 -13
  434. package/src/Toast/Toast.spec.tsx +56 -1
  435. package/src/Toast/index.tsx +68 -3
  436. package/src/Unspaced.stories.tsx +2 -2
  437. package/src/VisuallyHidden.stories.tsx +2 -2
  438. package/src/actions/DestructiveAction.spec.tsx +19 -3
  439. package/src/actions/DestructiveAction.tsx +9 -14
  440. package/src/charts/Axis.tsx +6 -1
  441. package/src/charts/BarChart.tsx +82 -67
  442. package/src/charts/ChartDataView.spec.tsx +104 -0
  443. package/src/charts/ChartDataView.tsx +158 -0
  444. package/src/charts/ChartSurface.tsx +7 -2
  445. package/src/charts/Charts.stories.tsx +213 -9
  446. package/src/charts/LineChart.tsx +90 -75
  447. package/src/charts/PieChart.knobs.spec.tsx +25 -0
  448. package/src/charts/PieChart.tsx +51 -9
  449. package/src/charts/Sparkline.tsx +25 -3
  450. package/src/charts/accessibility.ts +8 -0
  451. package/src/charts/charts.spec.tsx +77 -3
  452. package/src/charts/index.ts +2 -0
  453. package/src/charts/math.spec.ts +19 -0
  454. package/src/charts/math.ts +36 -0
  455. package/src/charts/series.tsx +101 -21
  456. package/src/charts/svg.spec.ts +28 -0
  457. package/src/charts/svg.ts +56 -2
  458. package/src/code/CodeBlock/CodeBlock.copy.spec.tsx +23 -0
  459. package/src/code/CodeBlock/index.tsx +4 -3
  460. package/src/feedback/ConfirmDialog.nativeFocus.spec.tsx +52 -0
  461. package/src/feedback/ConfirmDialog.spec.tsx +20 -0
  462. package/src/feedback/ConfirmDialog.tsx +9 -15
  463. package/src/feedback/NotifyHost.tsx +11 -2
  464. package/src/feedback/copy.ts +36 -4
  465. package/src/feedback/index.ts +1 -0
  466. package/src/feedback/notify.spec.ts +15 -1
  467. package/src/feedback/notify.ts +1 -0
  468. package/src/feedback/route.ts +4 -0
  469. package/src/feedback/store.ts +7 -0
  470. package/src/icons/lucide.ts +1 -1
  471. package/src/images/SvgUri/index.native.ts +11 -3
  472. package/src/layouts/EmptyState.stories.tsx +2 -2
  473. package/src/layouts/Page.weight.spec.tsx +75 -0
  474. package/src/layouts/PageHeader.stories.tsx +4 -4
  475. package/src/layouts/PageTemplates.stories.tsx +2 -2
  476. package/src/layouts/PaneScaffold.spec.tsx +144 -4
  477. package/src/layouts/PaneScaffold.stories.tsx +58 -2
  478. package/src/layouts/PaneScaffold.tsx +156 -58
  479. package/src/layouts/ScreenToolbar.stories.tsx +6 -23
  480. package/src/layouts/index.tsx +11 -0
  481. package/src/layouts/layouts.spec.tsx +51 -0
  482. package/src/layouts/page.designLaw.spec.tsx +25 -0
  483. package/src/layouts/page.tsx +46 -9
  484. package/src/shared/useKeyboardInset.native.ts +43 -0
  485. package/src/shared/useKeyboardInset.ts +2 -41
  486. package/src/tamagui.spec.ts +63 -0
  487. package/src/views/Dashboard.stories.tsx +38 -1
  488. package/src/views/Dashboard.tsx +119 -21
  489. package/src/views/Gantt.scroll.spec.tsx +120 -0
  490. package/src/views/Gantt.spec.tsx +376 -0
  491. package/src/views/Gantt.stories.tsx +75 -2
  492. package/src/views/Gantt.tsx +564 -96
  493. package/src/views/Kanban.spec.tsx +11 -0
  494. package/src/views/ganttMath.ts +142 -4
  495. package/src/views/index.ts +44 -1
  496. package/src/views/views.spec.tsx +39 -0
  497. package/types/Button.d.ts +12 -2
  498. package/types/Button.d.ts.map +1 -1
  499. package/types/Card.d.ts.map +1 -1
  500. package/types/CardFooter.d.ts +2 -1
  501. package/types/CardFooter.d.ts.map +1 -1
  502. package/types/CopyField/index.d.ts.map +1 -1
  503. package/types/DropdownMenu/index.d.ts +22 -0
  504. package/types/DropdownMenu/index.d.ts.map +1 -1
  505. package/types/Meter/index.d.ts.map +1 -1
  506. package/types/Tabs/index.d.ts +1 -1
  507. package/types/Tabs/index.d.ts.map +1 -1
  508. package/types/Toast/index.d.ts +16 -0
  509. package/types/Toast/index.d.ts.map +1 -1
  510. package/types/actions/DestructiveAction.d.ts.map +1 -1
  511. package/types/charts/Axis.d.ts.map +1 -1
  512. package/types/charts/BarChart.d.ts.map +1 -1
  513. package/types/charts/ChartDataView.d.ts +22 -0
  514. package/types/charts/ChartDataView.d.ts.map +1 -0
  515. package/types/charts/ChartSurface.d.ts +4 -1
  516. package/types/charts/ChartSurface.d.ts.map +1 -1
  517. package/types/charts/LineChart.d.ts.map +1 -1
  518. package/types/charts/PieChart.d.ts +1 -1
  519. package/types/charts/PieChart.d.ts.map +1 -1
  520. package/types/charts/Sparkline.d.ts +3 -1
  521. package/types/charts/Sparkline.d.ts.map +1 -1
  522. package/types/charts/accessibility.d.ts +3 -0
  523. package/types/charts/accessibility.d.ts.map +1 -1
  524. package/types/charts/index.d.ts +1 -0
  525. package/types/charts/index.d.ts.map +1 -1
  526. package/types/charts/math.d.ts +12 -0
  527. package/types/charts/math.d.ts.map +1 -1
  528. package/types/charts/series.d.ts +1 -1
  529. package/types/charts/series.d.ts.map +1 -1
  530. package/types/charts/svg.d.ts +18 -2
  531. package/types/charts/svg.d.ts.map +1 -1
  532. package/types/code/CodeBlock/index.d.ts.map +1 -1
  533. package/types/feedback/ConfirmDialog.d.ts.map +1 -1
  534. package/types/feedback/NotifyHost.d.ts +3 -1
  535. package/types/feedback/NotifyHost.d.ts.map +1 -1
  536. package/types/feedback/copy.d.ts +12 -2
  537. package/types/feedback/copy.d.ts.map +1 -1
  538. package/types/feedback/index.d.ts +1 -1
  539. package/types/feedback/index.d.ts.map +1 -1
  540. package/types/feedback/notify.d.ts.map +1 -1
  541. package/types/feedback/route.d.ts +3 -0
  542. package/types/feedback/route.d.ts.map +1 -1
  543. package/types/feedback/store.d.ts +2 -0
  544. package/types/feedback/store.d.ts.map +1 -1
  545. package/types/icons/lucide.d.ts +1 -1
  546. package/types/icons/lucide.d.ts.map +1 -1
  547. package/types/images/SvgUri/index.native.d.ts +4 -3
  548. package/types/images/SvgUri/index.native.d.ts.map +1 -1
  549. package/types/layouts/PaneScaffold.d.ts +27 -5
  550. package/types/layouts/PaneScaffold.d.ts.map +1 -1
  551. package/types/layouts/index.d.ts +1 -0
  552. package/types/layouts/index.d.ts.map +1 -1
  553. package/types/layouts/page.d.ts +10 -5
  554. package/types/layouts/page.d.ts.map +1 -1
  555. package/types/shared/useKeyboardInset.d.ts +1 -14
  556. package/types/shared/useKeyboardInset.d.ts.map +1 -1
  557. package/types/shared/useKeyboardInset.native.d.ts +16 -0
  558. package/types/shared/useKeyboardInset.native.d.ts.map +1 -0
  559. package/types/views/Dashboard.d.ts.map +1 -1
  560. package/types/views/Gantt.d.ts +132 -13
  561. package/types/views/Gantt.d.ts.map +1 -1
  562. package/types/views/ganttMath.d.ts +73 -0
  563. package/types/views/ganttMath.d.ts.map +1 -1
  564. package/types/views/index.d.ts +2 -2
  565. package/types/views/index.d.ts.map +1 -1
@@ -0,0 +1,158 @@
1
+ import { Button } from "@multiplatform.one/forms";
2
+ import { isWeb } from "@multiplatform.one/platform";
3
+ import { useResolvedKnobs } from "@multiplatform.one/theme";
4
+ import { createContext, useContext, useId, useState, type ReactNode } from "react";
5
+ import { Dialog, Paragraph, ScrollView, XStack, YStack } from "tamagui";
6
+ import { sectionHeading } from "../componentColors";
7
+ import { useTranslation } from "../shared/i18n";
8
+ import { DialogContent, DialogOverlay } from "../surfaces";
9
+ import { describeDatum } from "./accessibility";
10
+ import { formatChartValue } from "./math";
11
+ import { chartWebProps } from "./svg";
12
+ import type { ChartDatum } from "./types";
13
+
14
+ const ChartDataContext = createContext<{ id: string; triggerId: string } | null>(null);
15
+
16
+ export interface ChartDataViewProps {
17
+ data: Array<number | ChartDatum>;
18
+ title?: string;
19
+ valueFormatter?: (value: number) => string;
20
+ /** Place the action in the chart's existing header, outside its drawing. */
21
+ children: (view: {
22
+ action: ReactNode;
23
+ data: ChartDatum[];
24
+ valueFormatter: (value: number) => string;
25
+ }) => ReactNode;
26
+ }
27
+
28
+ /** One complete, reachable data view. The ordinary chart keeps its short name. */
29
+ export function ChartDataView({ data, title, valueFormatter, children }: ChartDataViewProps) {
30
+ const { t } = useTranslation();
31
+ const { knobProps } = useResolvedKnobs();
32
+ const { knobProps: datumKnobs } = useResolvedKnobs({ compact: true });
33
+ const [open, setOpen] = useState(false);
34
+ const id = `mpo-chart-data-${useId().replace(/[^a-zA-Z0-9_-]/g, "_")}`;
35
+ const triggerId = `${id}-trigger`;
36
+ const normalized = data.map((datum, index) =>
37
+ typeof datum === "number" ? { label: String(index + 1), value: datum } : datum,
38
+ );
39
+ const format = valueFormatter ?? formatChartValue;
40
+ const actionLabel = title ? `${t("View data for")} ${title}` : t("View chart data");
41
+ const action = (
42
+ <Dialog.Trigger asChild>
43
+ <Button
44
+ compact
45
+ id={triggerId}
46
+ {...(isWeb ? { "aria-label": actionLabel } : { accessibilityLabel: actionLabel })}
47
+ {...chartWebProps({ "data-mpo-chart-data-trigger": id })}
48
+ >
49
+ {t("View data")}
50
+ </Button>
51
+ </Dialog.Trigger>
52
+ );
53
+ return (
54
+ <ChartDataContext.Provider value={{ id, triggerId }}>
55
+ <Dialog modal open={open} onOpenChange={setOpen}>
56
+ {children({ action, data: normalized, valueFormatter: format })}
57
+ <Dialog.Portal>
58
+ <DialogOverlay key="overlay" />
59
+ <DialogContent
60
+ key="content"
61
+ width="90%"
62
+ maxWidth={480}
63
+ maxHeight="80%"
64
+ {...chartWebProps({ "data-mpo-chart-data-panel": id })}
65
+ >
66
+ <Dialog.Title {...knobProps.heading} {...sectionHeading}>
67
+ {title ? `${title}: ${t("data")}` : t("Chart data")}
68
+ </Dialog.Title>
69
+ <Dialog.Description
70
+ {...knobProps.body}
71
+ >{`${normalized.length} ${t("data points")}`}</Dialog.Description>
72
+ <ScrollView flexShrink={1} minHeight={0}>
73
+ <YStack {...knobProps.gap}>
74
+ {normalized.map((datum, index) => (
75
+ <XStack
76
+ key={index}
77
+ alignItems="flex-start"
78
+ flexWrap="wrap"
79
+ {...datumKnobs.gap}
80
+ {...chartWebProps({ "data-mpo-chart-data-row": String(index) })}
81
+ {...(!isWeb
82
+ ? {
83
+ accessible: true,
84
+ accessibilityLabel: describeDatum({ datum, formatValue: format }),
85
+ }
86
+ : {})}
87
+ >
88
+ <Paragraph
89
+ flexBasis="50%"
90
+ flexGrow={1}
91
+ flexShrink={1}
92
+ minWidth={0}
93
+ {...knobProps.body}
94
+ {...chartWebProps({ "data-mpo-chart-data-label": "true" })}
95
+ >
96
+ {datum.label}
97
+ </Paragraph>
98
+ <Paragraph
99
+ flexShrink={1}
100
+ maxWidth="100%"
101
+ {...knobProps.body}
102
+ {...chartWebProps({ "data-mpo-chart-data-value": "true" })}
103
+ >
104
+ {format(datum.value)}
105
+ </Paragraph>
106
+ </XStack>
107
+ ))}
108
+ </YStack>
109
+ </ScrollView>
110
+ <XStack justifyContent="flex-end">
111
+ <Dialog.Close asChild aria-label={t("Close")}>
112
+ <Button
113
+ aria-label={t("Close")}
114
+ {...(!isWeb ? { accessibilityLabel: t("Close") } : {})}
115
+ {...chartWebProps({ "data-mpo-chart-data-close": id })}
116
+ >
117
+ {t("Close")}
118
+ </Button>
119
+ </Dialog.Close>
120
+ </XStack>
121
+ </DialogContent>
122
+ </Dialog.Portal>
123
+ </Dialog>
124
+ </ChartDataContext.Provider>
125
+ );
126
+ }
127
+
128
+ /** Shared chart implementations join a composed header instead of adding a second action. */
129
+ export function ChartDataFrame({
130
+ data,
131
+ title,
132
+ valueFormatter,
133
+ width,
134
+ children,
135
+ }: Omit<ChartDataViewProps, "children"> & { children: ReactNode; width?: number }) {
136
+ const inherited = useContext(ChartDataContext);
137
+ const { knobProps } = useResolvedKnobs();
138
+ if (inherited) return children;
139
+ return (
140
+ <ChartDataView data={data} title={title} valueFormatter={valueFormatter}>
141
+ {({ action }) => (
142
+ <YStack minWidth={0} width={width ?? "100%"} maxWidth="100%" {...knobProps.gap}>
143
+ {children}
144
+ <XStack justifyContent="flex-end">{action}</XStack>
145
+ </YStack>
146
+ )}
147
+ </ChartDataView>
148
+ );
149
+ }
150
+
151
+ export function useChartDataViewProps(): Record<string, unknown> {
152
+ const context = useContext(ChartDataContext);
153
+ if (!context) return {};
154
+ return chartWebProps({
155
+ "data-mpo-chart-data-view": context.id,
156
+ "aria-describedby": context.triggerId,
157
+ });
158
+ }
@@ -1,7 +1,8 @@
1
1
  import { useCallback, useState, type ReactNode } from "react";
2
2
  import type { LayoutChangeEvent } from "react-native";
3
3
  import { YStack, type YStackProps } from "tamagui";
4
- import { Svg, chartRootA11yProps } from "./svg";
4
+ import { Svg, chartRootA11yProps, type ChartProofDeclaration } from "./svg";
5
+ import { useChartDataViewProps } from "./ChartDataView";
5
6
  import type { ChartSize } from "./types";
6
7
  import { useChartTheme } from "./useChartTheme";
7
8
 
@@ -11,6 +12,8 @@ export interface ChartSurfaceProps extends Omit<YStackProps, "children" | "width
11
12
  * as `role="img"` + label. Build it with `describeChart()`.
12
13
  */
13
14
  label: string;
15
+ /** Explicit chart classification; low-level custom surfaces remain unclassified. */
16
+ proof?: ChartProofDeclaration;
14
17
  /** Drawing height in px (default 200). */
15
18
  height?: number;
16
19
  /**
@@ -37,11 +40,13 @@ export interface ChartSurfaceProps extends Omit<YStackProps, "children" | "width
37
40
  */
38
41
  export function ChartSurface({
39
42
  label,
43
+ proof,
40
44
  height = 200,
41
45
  width: widthProp,
42
46
  children,
43
47
  ...stackProps
44
48
  }: ChartSurfaceProps) {
49
+ const dataViewProps = useChartDataViewProps();
45
50
  const { transition, animationEnabled } = useChartTheme();
46
51
  const [measuredWidth, setMeasuredWidth] = useState(0);
47
52
  const width = widthProp ?? measuredWidth;
@@ -61,7 +66,7 @@ export function ChartSurface({
61
66
  {...stackProps}
62
67
  >
63
68
  {width > 0 ? (
64
- <Svg width={width} height={height} {...chartRootA11yProps(label)}>
69
+ <Svg width={width} height={height} {...chartRootA11yProps(label, proof)} {...dataViewProps}>
65
70
  {children({ width, height })}
66
71
  </Svg>
67
72
  ) : null}
@@ -1,11 +1,15 @@
1
+ import { useState } from "react";
2
+ import { KPICard } from "../views/Dashboard";
1
3
  import { action } from "@multiplatform.one/storybook";
2
4
  import { Preset } from "@multiplatform.one/theme";
3
5
  import type { Meta } from "@storybook/react-native-web-vite";
4
6
  import { Text, Theme, XStack, YStack } from "tamagui";
5
7
  import { Card } from "../surfaces";
6
8
  import { AreaChart, LineChart } from "./LineChart";
9
+ import { ChartDataView } from "./ChartDataView";
7
10
  import { BarChart } from "./BarChart";
8
11
  import { PieChart } from "./PieChart";
12
+ import { chartWebProps } from "./svg";
9
13
  import { Sparkline } from "./Sparkline";
10
14
  import type { ChartDatum } from "./types";
11
15
 
@@ -90,18 +94,71 @@ export const Donut = {
90
94
  ),
91
95
  };
92
96
 
97
+ export const GapBoundaries = {
98
+ render: () => (
99
+ <YStack maxWidth={560} gap="$4">
100
+ <PieChart data={categories} height={160} title="Pie boundary gaps" />
101
+ <PieChart data={categories} height={160} donut title="Donut boundary gaps" />
102
+ </YStack>
103
+ ),
104
+ };
105
+
106
+ export const GapThinSlices = {
107
+ render: () => (
108
+ <YStack maxWidth={560} gap="$4">
109
+ <PieChart
110
+ data={[
111
+ { label: "Large", value: 9999 },
112
+ { label: "Small", value: 1 },
113
+ ]}
114
+ title="Thin positive slice preserved"
115
+ />
116
+ <PieChart
117
+ data={[
118
+ { label: "Large", value: 9999 },
119
+ { label: "Small", value: 1 },
120
+ ]}
121
+ donut
122
+ title="Thin positive donut preserved"
123
+ />
124
+ </YStack>
125
+ ),
126
+ };
127
+
128
+ export const GapSingleDatum = {
129
+ render: () => <PieChart data={[{ label: "Only", value: 100 }]} title="Single full circle" />,
130
+ };
131
+
132
+ export const GapExplicitZero = {
133
+ render: () => <PieChart data={categories} padAngle={0} title="Explicit touching slices" />,
134
+ };
135
+
93
136
  export const SparklineRow = {
94
137
  name: "Sparkline",
95
138
  render: () => (
96
139
  <XStack maxWidth={560} gap="$4" alignItems="center">
97
- <YStack flex={1}>
98
- <Text fontSize="$2">Weekly active</Text>
99
- <Sparkline data={trend} title="Weekly active" />
100
- </YStack>
101
- <YStack flex={1}>
102
- <Text fontSize="$2">No area</Text>
103
- <Sparkline data={trend} showArea={false} title="Weekly active" />
104
- </YStack>
140
+ <ChartDataView data={trend} title="Weekly active">
141
+ {({ action, data }) => (
142
+ <YStack flex={1} gap="$2">
143
+ <XStack alignItems="center" justifyContent="space-between">
144
+ <Text fontSize="$2">Weekly active</Text>
145
+ {action}
146
+ </XStack>
147
+ <Sparkline data={data} title="Weekly active" />
148
+ </YStack>
149
+ )}
150
+ </ChartDataView>
151
+ <ChartDataView data={trend} title="No area">
152
+ {({ action, data }) => (
153
+ <YStack flex={1} gap="$2">
154
+ <XStack alignItems="center" justifyContent="space-between">
155
+ <Text fontSize="$2">No area</Text>
156
+ {action}
157
+ </XStack>
158
+ <Sparkline data={data} showArea={false} title="Weekly active" />
159
+ </YStack>
160
+ )}
161
+ </ChartDataView>
105
162
  </XStack>
106
163
  ),
107
164
  };
@@ -181,7 +238,154 @@ export const NarrowViewport = {
181
238
  <BarChart data={monthly} title="Revenue" />
182
239
  <LineChart data={monthly} title="Revenue" />
183
240
  <PieChart data={categories} donut title="Tickets by status" />
184
- <Sparkline data={trend} title="Weekly active" />
241
+ <ChartDataView data={trend} title="Weekly active">
242
+ {({ action, data }) => (
243
+ <YStack gap="$2">
244
+ <XStack justifyContent="space-between">
245
+ <Text>Weekly active</Text>
246
+ {action}
247
+ </XStack>
248
+ <Sparkline data={data} title="Weekly active" />
249
+ </YStack>
250
+ )}
251
+ </ChartDataView>
185
252
  </YStack>
186
253
  ),
187
254
  };
255
+
256
+ export const CompleteDataView = {
257
+ render: () => (
258
+ <YStack width="100%" maxWidth={560} gap="$4">
259
+ <BarChart
260
+ data={Array.from({ length: 13 }, (_, index) => ({
261
+ label: `Region ${index + 1}`,
262
+ value: (index + 1) * 125,
263
+ }))}
264
+ title="Regional revenue"
265
+ label="Regional revenue overview"
266
+ />
267
+ <ChartDataView
268
+ data={Array.from({ length: 80 }, (_, index) => ({
269
+ label: `Day ${index + 1}`,
270
+ value: index * 3 + 1,
271
+ }))}
272
+ title="Daily activity"
273
+ >
274
+ {({ action, data }) => (
275
+ <YStack gap="$2">
276
+ <XStack alignItems="center" justifyContent="space-between">
277
+ <Text>Daily activity</Text>
278
+ {action}
279
+ </XStack>
280
+ <Sparkline data={data} title="Daily activity" showArea={false} />
281
+ </YStack>
282
+ )}
283
+ </ChartDataView>
284
+ </YStack>
285
+ ),
286
+ };
287
+
288
+ function MetricDataHarness({
289
+ longTitle = false,
290
+ consumerPress = false,
291
+ }: {
292
+ longTitle?: boolean;
293
+ consumerPress?: boolean;
294
+ }) {
295
+ const [navigationCount, setNavigationCount] = useState(0);
296
+ const [consumerCount, setConsumerCount] = useState(0);
297
+ return (
298
+ <YStack width="100%" maxWidth={360} gap="$3">
299
+ <KPICard
300
+ config={{
301
+ id: "revenue",
302
+ title: longTitle ? "Revenue from annual enterprise subscriptions" : "Revenue",
303
+ value: 240000,
304
+ format: "currency",
305
+ sparkline: trend,
306
+ onClick: () => setNavigationCount((count) => count + 1),
307
+ }}
308
+ {...(consumerPress ? { onPress: () => setConsumerCount((count) => count + 1) } : {})}
309
+ />
310
+ <Text>{`Metric navigation count: ${navigationCount}`}</Text>
311
+ {consumerPress ? <Text>{`Consumer navigation count: ${consumerCount}`}</Text> : null}
312
+ </YStack>
313
+ );
314
+ }
315
+ export const MetricDataActions = { render: () => <MetricDataHarness /> };
316
+
317
+ export const GapPatternBackdrop = {
318
+ render: () => (
319
+ <YStack width="100%" maxWidth={560} gap="$4">
320
+ {[false, true].map((donut) => (
321
+ <YStack
322
+ key={String(donut)}
323
+ position="relative"
324
+ {...chartWebProps({ "data-mpo-chart-backdrop": "patterned" })}
325
+ >
326
+ <YStack
327
+ position="absolute"
328
+ top={0}
329
+ left={0}
330
+ width={160}
331
+ height={160}
332
+ pointerEvents="none"
333
+ >
334
+ {Array.from({ length: 10 }, (_, index) => (
335
+ <YStack key={index} height={16} backgroundColor={index % 2 ? "$color5" : "$color2"} />
336
+ ))}
337
+ </YStack>
338
+ <PieChart
339
+ data={categories}
340
+ height={160}
341
+ donut={donut}
342
+ title={donut ? "Donut on striped backdrop" : "Pie on striped backdrop"}
343
+ />
344
+ </YStack>
345
+ ))}
346
+ </YStack>
347
+ ),
348
+ };
349
+
350
+ export const MetricDataLongTitle = { render: () => <MetricDataHarness longTitle /> };
351
+ export const MetricDataPressOverride = { render: () => <MetricDataHarness consumerPress /> };
352
+
353
+ export const FixedWidthData = {
354
+ render: () => {
355
+ const data = [
356
+ {
357
+ label: "International enterprise subscriptions for the previous fiscal year",
358
+ value: 12345678901234,
359
+ },
360
+ {
361
+ label: "Domestic enterprise subscriptions for the current fiscal year",
362
+ value: 23456789012345,
363
+ },
364
+ { label: "Unbroken formatted value", value: 1 },
365
+ ];
366
+ const valueFormatter = (value: number) =>
367
+ value === 1 ? "1".repeat(120) : `${value.toFixed(2)} USD per reporting quarter`;
368
+ return (
369
+ <YStack width="100%" maxWidth={900} gap="$4">
370
+ <BarChart
371
+ width={300}
372
+ data={data}
373
+ title="Fixed width revenue"
374
+ label="Revenue bars"
375
+ valueFormatter={valueFormatter}
376
+ showXAxis={false}
377
+ showYAxis={false}
378
+ />
379
+ <LineChart
380
+ width={300}
381
+ data={data}
382
+ title="Fixed width trend"
383
+ label="Revenue trend"
384
+ valueFormatter={valueFormatter}
385
+ showXAxis={false}
386
+ showYAxis={false}
387
+ />
388
+ </YStack>
389
+ );
390
+ },
391
+ };
@@ -1,8 +1,9 @@
1
1
  import { useTranslation } from "../shared/i18n";
2
2
  import type { YStackProps } from "tamagui";
3
3
  import { XAxis, YAxis } from "./Axis";
4
+ import { ChartDataFrame } from "./ChartDataView";
4
5
  import { ChartSurface } from "./ChartSurface";
5
- import { describeChart, describeDatum } from "./accessibility";
6
+ import { chartDatumText, describeChart, describeDatum } from "./accessibility";
6
7
  import { computeCartesianPlot, thinCategories } from "./composeChart";
7
8
  import {
8
9
  createLinearScale,
@@ -89,84 +90,98 @@ export function LineChart({
89
90
  const interactive = Boolean(onDatumPress || onDatumHoverIn || onDatumHoverOut);
90
91
 
91
92
  return (
92
- <ChartSurface label={ariaLabel} height={height} width={width} {...stackProps}>
93
- {(size) => {
94
- const domain = valueDomain(data.map((datum) => datum.value));
95
- const marginScale = createLinearScale({ domain, range: [0, 1] });
96
- const tickValues = getLinearTicks(marginScale, yTicks);
97
- const plot = computeCartesianPlot(size, {
98
- showXAxis,
99
- showYAxis,
100
- yTickLabels: tickValues.map((value) => format(value)),
101
- fontSize: labelFontSize,
102
- });
103
- if (plot.width <= 0 || plot.height <= 0 || data.length === 0) return null;
104
- const xScale = createPointScale({
105
- domain: data.map((datum) => datum.label),
106
- range: [plot.x, plot.x + plot.width],
107
- padding: 0.5,
108
- });
109
- const yScale = createLinearScale({
110
- domain,
111
- range: [plot.y + plot.height, plot.y],
112
- });
113
- const points = data.map((datum) => ({
114
- x: xScale(datum.label) ?? plot.x,
115
- y: yScale(datum.value),
116
- }));
117
- return (
118
- <>
119
- {showYAxis || showGrid ? (
120
- <YAxis
121
- plot={plot}
122
- scale={yScale}
123
- ticks={yTicks}
124
- tickFormat={(value) => format(value)}
125
- showLabels={showYAxis}
126
- showGrid={showGrid}
127
- />
128
- ) : null}
129
- {showArea ? (
130
- <AreaSeries
93
+ <ChartDataFrame data={data} title={title} valueFormatter={valueFormatter} width={width}>
94
+ <ChartSurface
95
+ label={ariaLabel}
96
+ proof={{
97
+ kind: showArea ? "area" : "line",
98
+ separated: false,
99
+ datumText: false,
100
+ datumValues: chartDatumText(data, valueFormatter),
101
+ datumCount: data.length,
102
+ }}
103
+ height={height}
104
+ width={width}
105
+ {...stackProps}
106
+ >
107
+ {(size) => {
108
+ const domain = valueDomain(data.map((datum) => datum.value));
109
+ const marginScale = createLinearScale({ domain, range: [0, 1] });
110
+ const tickValues = getLinearTicks(marginScale, yTicks);
111
+ const plot = computeCartesianPlot(size, {
112
+ showXAxis,
113
+ showYAxis,
114
+ yTickLabels: tickValues.map((value) => format(value)),
115
+ fontSize: labelFontSize,
116
+ });
117
+ if (plot.width <= 0 || plot.height <= 0 || data.length === 0) return null;
118
+ const xScale = createPointScale({
119
+ domain: data.map((datum) => datum.label),
120
+ range: [plot.x, plot.x + plot.width],
121
+ padding: 0.5,
122
+ });
123
+ const yScale = createLinearScale({
124
+ domain,
125
+ range: [plot.y + plot.height, plot.y],
126
+ });
127
+ const points = data.map((datum) => ({
128
+ x: xScale(datum.label) ?? plot.x,
129
+ y: yScale(datum.value),
130
+ }));
131
+ return (
132
+ <>
133
+ {showYAxis || showGrid ? (
134
+ <YAxis
135
+ plot={plot}
136
+ scale={yScale}
137
+ ticks={yTicks}
138
+ tickFormat={(value) => format(value)}
139
+ showLabels={showYAxis}
140
+ showGrid={showGrid}
141
+ />
142
+ ) : null}
143
+ {showArea ? (
144
+ <AreaSeries
145
+ points={points}
146
+ baseline={plot.y + plot.height}
147
+ color={stroke}
148
+ opacity={areaOpacity}
149
+ curve={curve}
150
+ />
151
+ ) : null}
152
+ <LineSeries
153
+ data={data}
131
154
  points={points}
132
- baseline={plot.y + plot.height}
133
155
  color={stroke}
134
- opacity={areaOpacity}
156
+ strokeWidth={strokeWidth}
135
157
  curve={curve}
158
+ showPoints={showPoints}
159
+ bounds={size}
160
+ onDatumPress={onDatumPress}
161
+ onDatumHoverIn={onDatumHoverIn}
162
+ onDatumHoverOut={onDatumHoverOut}
163
+ datumLabel={
164
+ interactive
165
+ ? (datum) => describeDatum({ datum, formatValue: valueFormatter })
166
+ : undefined
167
+ }
136
168
  />
137
- ) : null}
138
- <LineSeries
139
- data={data}
140
- points={points}
141
- color={stroke}
142
- strokeWidth={strokeWidth}
143
- curve={curve}
144
- showPoints={showPoints}
145
- bounds={size}
146
- onDatumPress={onDatumPress}
147
- onDatumHoverIn={onDatumHoverIn}
148
- onDatumHoverOut={onDatumHoverOut}
149
- datumLabel={
150
- interactive
151
- ? (datum) => describeDatum({ datum, formatValue: valueFormatter })
152
- : undefined
153
- }
154
- />
155
- {showXAxis ? (
156
- <XAxis
157
- plot={plot}
158
- scale={xScale}
159
- tickValues={thinCategories(
160
- data.map((datum) => datum.label),
161
- plot.width,
162
- labelFontSize,
163
- )}
164
- />
165
- ) : null}
166
- </>
167
- );
168
- }}
169
- </ChartSurface>
169
+ {showXAxis ? (
170
+ <XAxis
171
+ plot={plot}
172
+ scale={xScale}
173
+ tickValues={thinCategories(
174
+ data.map((datum) => datum.label),
175
+ plot.width,
176
+ labelFontSize,
177
+ )}
178
+ />
179
+ ) : null}
180
+ </>
181
+ );
182
+ }}
183
+ </ChartSurface>
184
+ </ChartDataFrame>
170
185
  );
171
186
  }
172
187
 
@@ -0,0 +1,25 @@
1
+ import { Preset } from "@multiplatform.one/theme";
2
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
3
+ import { cleanup } from "@testing-library/react";
4
+ import { afterEach, expect, it } from "vitest";
5
+ import { PieChart } from "./PieChart";
6
+
7
+ afterEach(cleanup);
8
+
9
+ it.each(["regular", "bold"] as const)(
10
+ "propagates %s body weight to legend labels and values",
11
+ (fontWeight) => {
12
+ const { container } = renderWithProviders(
13
+ <Preset overrides={{ fontWeight, bodyFont: "mono" }}>
14
+ <PieChart data={[{ label: "Enterprise", value: 55 }]} />
15
+ </Preset>,
16
+ );
17
+ const label = container.querySelector("[data-mpo-chart-datum-label]")!;
18
+ const value = container.querySelector("[data-mpo-chart-datum-value]")!;
19
+ expect(label.textContent).toBe("Enterprise");
20
+ expect(value.textContent).toBe("55");
21
+ for (const node of [label, value]) {
22
+ expect(getComputedStyle(node).fontWeight).toBe(fontWeight === "bold" ? "700" : "400");
23
+ }
24
+ },
25
+ );