@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
@@ -2,11 +2,13 @@ import { useResolvedKnobs } from "@multiplatform.one/theme";
2
2
  import { useTranslation } from "../shared/i18n";
3
3
  import { Text, XStack, YStack, type YStackProps } from "tamagui";
4
4
  import { componentColors } from "../componentColors";
5
+ import { ChartDataFrame } from "./ChartDataView";
5
6
  import { ChartSurface } from "./ChartSurface";
6
- import { describeChart, describeDatum } from "./accessibility";
7
+ import { chartDatumText, describeChart, describeDatum } from "./accessibility";
7
8
  import { resolveSeriesFills } from "./composeChart";
8
- import { formatChartValue } from "./math";
9
+ import { formatChartValue, pieSlices, canMaskPieSlices } from "./math";
9
10
  import { PieSeries } from "./series";
11
+ import { chartDatumTextProps, chartWebProps } from "./svg";
10
12
  import type { ChartDatum, ChartDatumEvents } from "./types";
11
13
  import { useChartTheme } from "./useChartTheme";
12
14
 
@@ -21,7 +23,7 @@ export interface PieChartProps
21
23
  * innerRadius) — the card surface shows through on every platform.
22
24
  */
23
25
  donut?: boolean | number;
24
- /** Radians between slices (default 0). */
26
+ /** Explicit radians between slices. Omit for the default boundary mask. */
25
27
  padAngle?: number;
26
28
  /** Explicit slice colors (data values — pass through untouched). */
27
29
  colors?: string[];
@@ -51,7 +53,7 @@ export function PieChart({
51
53
  data,
52
54
  height = 200,
53
55
  donut = false,
54
- padAngle = 0,
56
+ padAngle,
55
57
  colors,
56
58
  showLegend = true,
57
59
  valueFormatter,
@@ -81,7 +83,7 @@ export function PieChart({
81
83
  const innerRatio =
82
84
  donut === false ? 0 : donut === true ? DEFAULT_DONUT_RATIO : Math.min(Math.max(donut, 0), 0.9);
83
85
 
84
- return (
86
+ const chart = (
85
87
  // LC-10: `flexShrink` + `minWidth 0` let a row parent (e.g. Card.Footer)
86
88
  // constrain the chart below its intrinsic width — the wrap then stacks
87
89
  // the legend under the pie instead of painting past the frame.
@@ -91,10 +93,25 @@ export function PieChart({
91
93
  flexShrink={1}
92
94
  minWidth={0}
93
95
  {...knobProps.gap}
96
+ {...chartWebProps({ "data-mpo-chart-owner": "true" })}
94
97
  {...stackProps}
95
98
  >
96
99
  <YStack width={height} height={height}>
97
- <ChartSurface label={ariaLabel} height={height} width={height}>
100
+ <ChartSurface
101
+ label={ariaLabel}
102
+ proof={{
103
+ kind: innerRatio > 0 ? "donut" : "pie",
104
+ separated:
105
+ padAngle === undefined
106
+ ? canMaskPieSlices(pieSlices(data), (height / 2) * innerRatio, height / 2)
107
+ : padAngle > 0,
108
+ datumText: showLegend,
109
+ datumValues: chartDatumText(data, valueFormatter),
110
+ datumCount: data.length,
111
+ }}
112
+ height={height}
113
+ width={height}
114
+ >
98
115
  {(size) => {
99
116
  const outerRadius = Math.min(size.width, size.height) / 2;
100
117
  return (
@@ -129,7 +146,13 @@ export function PieChart({
129
146
  {...{ "data-pie-legend": "true" }}
130
147
  >
131
148
  {data.map((datum, index) => (
132
- <XStack key={`${datum.label}-${index}`} gap="$2" alignItems="center" minWidth={0}>
149
+ <XStack
150
+ key={`${datum.label}-${index}`}
151
+ {...chartDatumTextProps(index)}
152
+ gap="$2"
153
+ alignItems="center"
154
+ minWidth={0}
155
+ >
133
156
  {/* Legend keys are chart CHROME, not marks: the swatch follows
134
157
  the radius knob and goes square in the `none` world (Axiom 3
135
158
  NULL). The pinned $2 arc was knob-dead (D-09 / LC-60). */}
@@ -142,10 +165,22 @@ export function PieChart({
142
165
  />
143
166
  {/* The label yields (truncates) before the value — values are
144
167
  data and never truncate (Axiom 11). */}
145
- <Text fontSize="$2" color={componentColors.text.muted} flex={1} numberOfLines={1}>
168
+ <Text
169
+ {...chartWebProps({ "data-mpo-chart-datum-label": "true" })}
170
+ {...knobProps.body}
171
+ fontSize="$2"
172
+ color={componentColors.text.muted}
173
+ flex={1}
174
+ numberOfLines={1}
175
+ >
146
176
  {datum.label}
147
177
  </Text>
148
- <Text fontSize="$2" fontWeight="500" flexShrink={0}>
178
+ <Text
179
+ {...chartWebProps({ "data-mpo-chart-datum-value": "true" })}
180
+ {...knobProps.body}
181
+ fontSize="$2"
182
+ flexShrink={0}
183
+ >
149
184
  {format(datum.value)}
150
185
  </Text>
151
186
  </XStack>
@@ -154,4 +189,11 @@ export function PieChart({
154
189
  ) : null}
155
190
  </XStack>
156
191
  );
192
+ return showLegend ? (
193
+ chart
194
+ ) : (
195
+ <ChartDataFrame data={data} title={title} valueFormatter={valueFormatter}>
196
+ {chart}
197
+ </ChartDataFrame>
198
+ );
157
199
  }
@@ -1,7 +1,7 @@
1
1
  import { useTranslation } from "../shared/i18n";
2
2
  import type { YStackProps } from "tamagui";
3
3
  import { ChartSurface } from "./ChartSurface";
4
- import { describeChart } from "./accessibility";
4
+ import { chartDatumText, describeChart } from "./accessibility";
5
5
  import { createLinearScale, createPointScale, valueDomain } from "./math";
6
6
  import { AreaSeries, LineSeries } from "./series";
7
7
  import type { ChartCurve, ChartDatum } from "./types";
@@ -24,6 +24,8 @@ export interface SparklineProps extends Omit<YStackProps, "children" | "width" |
24
24
  title?: string;
25
25
  /** Override the generated accessible summary. */
26
26
  label?: string;
27
+ /** Format spoken and complete data-view values consistently. */
28
+ valueFormatter?: (value: number) => string;
27
29
  }
28
30
 
29
31
  /**
@@ -41,6 +43,7 @@ export function Sparkline({
41
43
  strokeWidth = 1.5,
42
44
  title,
43
45
  label,
46
+ valueFormatter,
44
47
  ...stackProps
45
48
  }: SparklineProps) {
46
49
  const { t } = useTranslation();
@@ -49,10 +52,29 @@ export function Sparkline({
49
52
  const normalized: ChartDatum[] = data.map((entry, index) =>
50
53
  typeof entry === "number" ? { label: String(index + 1), value: entry } : entry,
51
54
  );
52
- const ariaLabel = label ?? describeChart({ typeLabel: t("Sparkline"), title, data: normalized });
55
+ const ariaLabel =
56
+ label ??
57
+ describeChart({
58
+ typeLabel: t("Sparkline"),
59
+ title,
60
+ data: normalized,
61
+ formatValue: valueFormatter,
62
+ });
53
63
 
54
64
  return (
55
- <ChartSurface label={ariaLabel} height={height} width={width} {...stackProps}>
65
+ <ChartSurface
66
+ label={ariaLabel}
67
+ proof={{
68
+ kind: showArea ? "area" : "line",
69
+ separated: false,
70
+ datumText: false,
71
+ datumValues: chartDatumText(normalized, valueFormatter),
72
+ datumCount: normalized.length,
73
+ }}
74
+ height={height}
75
+ width={width}
76
+ {...stackProps}
77
+ >
56
78
  {(size) => {
57
79
  if (normalized.length === 0) return null;
58
80
  const inset = strokeWidth + 1;
@@ -74,3 +74,11 @@ export function describeDatum(input: DescribeDatumInput): string {
74
74
  }
75
75
  return base;
76
76
  }
77
+
78
+ /** Exact datum text for the independently opened data view, separate from the image name. */
79
+ export function chartDatumText(
80
+ data: ChartDatum[],
81
+ formatValue = formatChartValue,
82
+ ): Array<[string, string]> {
83
+ return data.map((datum) => [datum.label.trim(), formatValue(datum.value).trim()]);
84
+ }
@@ -46,7 +46,26 @@ function targetRects(): Element[] {
46
46
  // In happy-dom onLayout never fires, so every chart passes an explicit width.
47
47
  const WIDTH = 400;
48
48
 
49
+ it("routes stock Sparkline as a declared area or line with its complete data count", () => {
50
+ const { rerender } = renderWithProviders(<Sparkline data={[1, 2, 3]} width={WIDTH} />);
51
+ expect(document.querySelector("svg")?.getAttribute("data-mpo-chart")).toBe("area");
52
+ expect(document.querySelector("svg")?.getAttribute("data-mpo-chart-datum-count")).toBe("3");
53
+ expect(document.querySelector("svg")?.getAttribute("data-mpo-chart-datum-text")).toBe("false");
54
+ rerender(<Sparkline data={[1, 2, 3]} width={WIDTH} showArea={false} />);
55
+ expect(document.querySelector("svg")?.getAttribute("data-mpo-chart")).toBe("line");
56
+ });
57
+
49
58
  describe("BarChart", () => {
59
+ it("declares chart kind and marks without claiming a complete datum alternative", () => {
60
+ renderWithProviders(<BarChart data={data} width={WIDTH} onDatumPress={vi.fn()} />);
61
+ const root = document.querySelector("svg")!;
62
+ expect(root.getAttribute("data-mpo-chart")).toBe("bar");
63
+ expect(root.getAttribute("data-mpo-chart-datum-count")).toBe(String(data.length));
64
+ expect(root.getAttribute("data-mpo-chart-datum-text")).toBe("false");
65
+ expect(root.querySelectorAll("[data-mpo-chart-mark]").length).toBe(data.length);
66
+ expect(targetRects().every((target) => !target.hasAttribute("data-mpo-chart-mark"))).toBe(true);
67
+ });
68
+
50
69
  it("renders one identity-colored bar per datum (single series, LC-27)", () => {
51
70
  const palette: { current?: ChartPalette } = {};
52
71
  renderWithProviders(
@@ -167,6 +186,12 @@ describe("BarChart", () => {
167
186
  });
168
187
 
169
188
  describe("LineChart / AreaChart", () => {
189
+ it("distinguishes area composition from a plain line", () => {
190
+ const { rerender } = renderWithProviders(<LineChart data={data} width={WIDTH} />);
191
+ expect(document.querySelector("svg")?.getAttribute("data-mpo-chart")).toBe("line");
192
+ rerender(<AreaChart data={data} width={WIDTH} />);
193
+ expect(document.querySelector("svg")?.getAttribute("data-mpo-chart")).toBe("area");
194
+ });
170
195
  it("strokes the line and dots with the palette identity", () => {
171
196
  const palette: { current?: ChartPalette } = {};
172
197
  renderWithProviders(
@@ -201,7 +226,7 @@ describe("LineChart / AreaChart", () => {
201
226
  <AreaChart data={data} width={WIDTH} />
202
227
  </>,
203
228
  );
204
- const area = Array.from(document.querySelectorAll("svg path")).find(
229
+ const area = Array.from(document.querySelectorAll("svg [data-mpo-chart-mark]")).find(
205
230
  (p) => p.getAttribute("fill") !== "none" && p.getAttribute("opacity"),
206
231
  );
207
232
  expect(area).toBeDefined();
@@ -210,12 +235,61 @@ describe("LineChart / AreaChart", () => {
210
235
  });
211
236
 
212
237
  describe("PieChart", () => {
238
+ it("exposes every datum alternative without a twelve-item cap", () => {
239
+ const many = Array.from({ length: 13 }, (_, index) => ({
240
+ label: `Region ${index}`,
241
+ value: index + 1,
242
+ }));
243
+ renderWithProviders(<PieChart data={many} donut />);
244
+ const root = document.querySelector("svg")!;
245
+ expect(root.getAttribute("data-mpo-chart")).toBe("donut");
246
+ expect(root.getAttribute("data-mpo-chart-datum-count")).toBe("13");
247
+ expect(root.getAttribute("data-mpo-chart-separated")).toBe("true");
248
+ expect(document.querySelectorAll("[data-mpo-chart-datum-label]").length).toBe(13);
249
+ expect(document.querySelectorAll("[data-mpo-chart-datum-value]").length).toBe(13);
250
+ expect(root.querySelectorAll("[data-mpo-chart-mark]").length).toBe(13);
251
+ });
252
+
213
253
  const pieData: ChartDatum[] = [
214
254
  { label: "A", value: 4 },
215
255
  { label: "B", value: 3 },
216
256
  { label: "C", value: 2 },
217
257
  ];
218
258
 
259
+ it("keeps mask IDs unique across mounted charts and preserves the actual slice path", () => {
260
+ renderWithProviders(
261
+ <>
262
+ <PieChart data={pieData} />
263
+ <PieChart data={pieData} donut />
264
+ </>,
265
+ );
266
+ const masks = Array.from(document.querySelectorAll("mask"));
267
+ expect(masks).toHaveLength(6);
268
+ expect(new Set(masks.map((mask) => mask.id)).size).toBe(6);
269
+ for (const mark of document.querySelectorAll("[data-mpo-chart-mark]")) {
270
+ const id = mark.getAttribute("mask")!.slice(5, -1);
271
+ const mask = document.getElementById(id)!;
272
+ expect(mask.getAttribute("mask-type")).toBe("luminance");
273
+ expect(mask.children[0].getAttribute("d")).toBe(mark.getAttribute("d"));
274
+ }
275
+ });
276
+
277
+ it.each([
278
+ { data: pieData, padAngle: 0 },
279
+ {
280
+ data: [
281
+ { label: "Large", value: 9999 },
282
+ { label: "Small", value: 1 },
283
+ ],
284
+ },
285
+ { data: [{ label: "Only", value: 1 }] },
286
+ ])("preserves explicit zero, thin positives and single-datum geometry: %j", (props) => {
287
+ renderWithProviders(<PieChart {...props} />);
288
+ expect(document.querySelectorAll("mask")).toHaveLength(0);
289
+ expect(document.querySelectorAll("[data-mpo-chart-mark]")).toHaveLength(props.data.length);
290
+ expect(document.querySelector("svg")?.getAttribute("data-mpo-chart-separated")).toBe("false");
291
+ });
292
+
219
293
  it("slices take the categorical palette in data order", () => {
220
294
  const palette: { current?: ChartPalette } = {};
221
295
  renderWithProviders(
@@ -224,7 +298,7 @@ describe("PieChart", () => {
224
298
  <PieChart data={pieData} showLegend={false} />
225
299
  </>,
226
300
  );
227
- const fills = Array.from(document.querySelectorAll("svg path")).map((p) =>
301
+ const fills = Array.from(document.querySelectorAll("svg [data-mpo-chart-mark]")).map((p) =>
228
302
  p.getAttribute("fill"),
229
303
  );
230
304
  expect(fills).toEqual(palette.current?.categorical.slice(0, pieData.length));
@@ -239,7 +313,7 @@ describe("PieChart", () => {
239
313
  it("per-slice press targets carry share-aware names", () => {
240
314
  const onDatumPress = vi.fn();
241
315
  renderWithProviders(<PieChart data={pieData} showLegend={false} onDatumPress={onDatumPress} />);
242
- const slices = Array.from(document.querySelectorAll("svg path"));
316
+ const slices = Array.from(document.querySelectorAll("svg [data-mpo-chart-mark]"));
243
317
  expect(slices[0].getAttribute("aria-label")).toBe("A: 4 (44%)");
244
318
  fireEvent.click(slices[1]);
245
319
  expect(onDatumPress).toHaveBeenCalledWith(pieData[1], 1);
@@ -77,3 +77,5 @@ export { BarChart, type BarChartProps } from "./BarChart";
77
77
  export { AreaChart, LineChart, type AreaChartProps, type LineChartProps } from "./LineChart";
78
78
  export { PieChart, type PieChartProps } from "./PieChart";
79
79
  export { Sparkline, type SparklineProps } from "./Sparkline";
80
+
81
+ export { ChartDataView, type ChartDataViewProps } from "./ChartDataView";
@@ -13,10 +13,29 @@ import {
13
13
  getTimeTicks,
14
14
  linePath,
15
15
  pieSlices,
16
+ canMaskPieSlices,
16
17
  truncateLabel,
17
18
  valueDomain,
18
19
  } from "./math";
19
20
 
21
+ describe("pie mask preserves a positive interior", () => {
22
+ const slices = (values: number[]) => pieSlices(values.map((value) => ({ value })));
23
+ it("accepts ordinary pie and donut slices including a wedge larger than pi", () => {
24
+ expect(canMaskPieSlices(slices([70, 20, 10]), 0, 100)).toBe(true);
25
+ expect(canMaskPieSlices(slices([70, 20, 10]), 55, 100)).toBe(true);
26
+ });
27
+ it("keeps the whole original chart when one positive slice is too thin", () => {
28
+ expect(canMaskPieSlices(slices([9999, 1]), 0, 100)).toBe(false);
29
+ expect(canMaskPieSlices(slices([9999, 1]), 55, 100)).toBe(false);
30
+ expect(canMaskPieSlices(slices([50, 50]), 99, 100)).toBe(false);
31
+ });
32
+ it("does not erode a single positive full circle or invalid geometry", () => {
33
+ expect(canMaskPieSlices(slices([100]), 0, 100)).toBe(false);
34
+ expect(canMaskPieSlices(slices([0, 100]), 55, 100)).toBe(false);
35
+ expect(canMaskPieSlices(slices([50, 50]), 0, NaN)).toBe(false);
36
+ });
37
+ });
38
+
20
39
  describe("charts/math scales", () => {
21
40
  it("band scale maps categories into the pixel range with padding", () => {
22
41
  const scale = createBandScale({ domain: ["a", "b", "c"], range: [0, 300] });
@@ -234,6 +234,42 @@ export function pieSlices<T extends { value: number }>(
234
234
  }));
235
235
  }
236
236
 
237
+ /**
238
+ * Sufficient interior witness for a two-unit boundary erosion. The bisector
239
+ * at the annulus midpoint must stay more than one unit from every boundary.
240
+ * Distance to a radial segment uses clamped projection, including its inner
241
+ * endpoint for wedges larger than pi. A small margin covers SVG's three-digit
242
+ * path rounding. One thin positive slice keeps the whole chart unmasked.
243
+ */
244
+ export function canMaskPieSlices(
245
+ slices: ReadonlyArray<{ value: number; startAngle: number; endAngle: number }>,
246
+ innerRadius: number,
247
+ outerRadius: number,
248
+ ): boolean {
249
+ const positive = slices.filter((slice) => slice.value > 0);
250
+ if (
251
+ positive.length < 2 ||
252
+ !Number.isFinite(innerRadius) ||
253
+ !Number.isFinite(outerRadius) ||
254
+ innerRadius < 0 ||
255
+ outerRadius <= innerRadius
256
+ )
257
+ return false;
258
+ const radius = (innerRadius + outerRadius) / 2;
259
+ const clearance = 1.002;
260
+ if (outerRadius - radius <= clearance || radius - innerRadius <= clearance) return false;
261
+ return positive.every((slice) => {
262
+ const span = slice.endAngle - slice.startAngle;
263
+ if (!Number.isFinite(span) || span <= 0 || span >= Math.PI * 2) return false;
264
+ const cosine = Math.cos(span / 2);
265
+ const projection = Math.min(outerRadius, Math.max(innerRadius, radius * cosine));
266
+ const radialDistance = Math.sqrt(
267
+ Math.max(0, radius ** 2 + projection ** 2 - 2 * radius * projection * cosine),
268
+ );
269
+ return radialDistance > clearance;
270
+ });
271
+ }
272
+
237
273
  export interface ArcPathInput {
238
274
  startAngle: number;
239
275
  endAngle: number;
@@ -1,7 +1,19 @@
1
1
  import { MIN_PRESS_TARGET } from "@multiplatform.one/theme";
2
2
  import type { ScaleBand, ScaleLinear } from "d3-scale";
3
- import { areaPath, arcPath, linePath, pieSlices } from "./math";
4
- import { Circle, G, Path, Rect, datumTargetProps } from "./svg";
3
+ import { useId } from "react";
4
+ import { areaPath, arcPath, linePath, pieSlices, canMaskPieSlices } from "./math";
5
+ import {
6
+ Circle,
7
+ Defs,
8
+ Mask,
9
+ G,
10
+ Path,
11
+ Rect,
12
+ datumTargetProps,
13
+ chartMarkProps,
14
+ chartWebProps,
15
+ luminanceMaskProps,
16
+ } from "./svg";
5
17
  import type {
6
18
  ChartCurve,
7
19
  ChartDatum,
@@ -79,6 +91,7 @@ export function BarSeries({ data, xScale, yScale, plot, fills, ...callbacks }: B
79
91
  return (
80
92
  <G key={`${datum.label}-${index}`}>
81
93
  <Rect
94
+ {...chartMarkProps(datum.label)}
82
95
  x={x}
83
96
  y={y}
84
97
  width={bandwidth}
@@ -147,10 +160,23 @@ export function LineSeries({
147
160
  const targetRadius = MIN_PRESS_TARGET / 2;
148
161
  return (
149
162
  <G>
150
- <Path d={linePath(points, { curve })} fill="none" stroke={color} strokeWidth={strokeWidth} />
163
+ <Path
164
+ {...chartMarkProps("series line")}
165
+ d={linePath(points, { curve })}
166
+ fill="none"
167
+ stroke={color}
168
+ strokeWidth={strokeWidth}
169
+ />
151
170
  {showPoints
152
171
  ? points.map((point, index) => (
153
- <Circle key={`point-${index}`} cx={point.x} cy={point.y} r={pointRadius} fill={color} />
172
+ <Circle
173
+ key={`point-${index}`}
174
+ {...chartMarkProps(data[index]?.label ?? `point ${index + 1}`)}
175
+ cx={point.x}
176
+ cy={point.y}
177
+ r={pointRadius}
178
+ fill={color}
179
+ />
154
180
  ))
155
181
  : null}
156
182
  {interactive
@@ -187,7 +213,14 @@ export interface AreaSeriesProps {
187
213
  * LineSeries on top, which owns points and hit targets.
188
214
  */
189
215
  export function AreaSeries({ points, baseline, color, opacity = 0.18, curve }: AreaSeriesProps) {
190
- return <Path d={areaPath(points, { baseline, curve })} fill={color} opacity={opacity} />;
216
+ return (
217
+ <Path
218
+ {...chartMarkProps("series area")}
219
+ d={areaPath(points, { baseline, curve })}
220
+ fill={color}
221
+ opacity={opacity}
222
+ />
223
+ );
191
224
  }
192
225
 
193
226
  // ── Pie / Donut ───────────────────────────────────────────────
@@ -200,7 +233,7 @@ export interface PieSeriesProps extends DatumTargetCallbacks {
200
233
  outerRadius: number;
201
234
  /** > 0 renders a donut with a true transparent hole. */
202
235
  innerRadius?: number;
203
- /** Radians between slices (default 0). */
236
+ /** Explicit radians between slices. Omit for the default boundary mask. */
204
237
  padAngle?: number;
205
238
  /** Resolved fill per datum index. */
206
239
  fills: string[];
@@ -218,28 +251,75 @@ export function PieSeries({
218
251
  cy,
219
252
  outerRadius,
220
253
  innerRadius = 0,
221
- padAngle = 0,
254
+ padAngle,
222
255
  fills,
223
256
  ...callbacks
224
257
  }: PieSeriesProps) {
258
+ const instanceId = useId().replace(/[^a-zA-Z0-9_-]/g, "_");
225
259
  const slices = pieSlices(data, { padAngle });
260
+ const maskGaps = padAngle === undefined && canMaskPieSlices(slices, innerRadius, outerRadius);
226
261
  const interactive = hasTargets(callbacks);
227
262
  return (
228
263
  <G transform={`translate(${cx}, ${cy})`}>
229
- {slices.map((slice) => (
230
- <Path
231
- key={`${slice.datum.label}-${slice.index}`}
232
- d={arcPath({
233
- startAngle: slice.startAngle,
234
- endAngle: slice.endAngle,
235
- padAngle: slice.padAngle,
236
- innerRadius,
237
- outerRadius,
238
- })}
239
- fill={fills[slice.index]}
240
- {...(interactive ? targetPropsFor(callbacks, slice.datum, slice.index) : {})}
241
- />
242
- ))}
264
+ {slices.map((slice) => {
265
+ const path = arcPath({
266
+ startAngle: slice.startAngle,
267
+ endAngle: slice.endAngle,
268
+ padAngle: slice.padAngle,
269
+ innerRadius,
270
+ outerRadius,
271
+ });
272
+ const masked = maskGaps && slice.value > 0;
273
+ const maskId = `mpo-pie-${instanceId}-${slice.index}`;
274
+ return (
275
+ <G key={`${slice.datum.label}-${slice.index}`}>
276
+ {masked ? (
277
+ <Defs>
278
+ <Mask
279
+ id={maskId}
280
+ x={-outerRadius - 2}
281
+ y={-outerRadius - 2}
282
+ width={(outerRadius + 2) * 2}
283
+ height={(outerRadius + 2) * 2}
284
+ maskUnits="userSpaceOnUse"
285
+ maskContentUnits="userSpaceOnUse"
286
+ {...luminanceMaskProps()}
287
+ >
288
+ <Path
289
+ d={path}
290
+ fill="#ffffff"
291
+ stroke="#000000"
292
+ strokeWidth={2}
293
+ strokeLinejoin="round"
294
+ strokeLinecap="round"
295
+ opacity={1}
296
+ fillOpacity={1}
297
+ strokeOpacity={1}
298
+ />
299
+ </Mask>
300
+ </Defs>
301
+ ) : null}
302
+ <Path
303
+ {...chartMarkProps(slice.datum.label)}
304
+ {...(masked
305
+ ? chartWebProps({
306
+ "data-mpo-chart-mask": "eroded-arc-v1",
307
+ "data-mpo-chart-slice": [
308
+ slice.startAngle,
309
+ slice.endAngle,
310
+ innerRadius,
311
+ outerRadius,
312
+ ].join(","),
313
+ })
314
+ : {})}
315
+ d={path}
316
+ mask={masked ? `url(#${maskId})` : undefined}
317
+ fill={fills[slice.index]}
318
+ {...(interactive ? targetPropsFor(callbacks, slice.datum, slice.index) : {})}
319
+ />
320
+ </G>
321
+ );
322
+ })}
243
323
  </G>
244
324
  );
245
325
  }
@@ -0,0 +1,28 @@
1
+ import { expect, it, vi } from "vitest";
2
+
3
+ vi.mock("@multiplatform.one/platform", () => ({ isWeb: false }));
4
+
5
+ import {
6
+ chartChromeProps,
7
+ chartDatumTextProps,
8
+ chartMarkProps,
9
+ chartRootA11yProps,
10
+ chartWebProps,
11
+ luminanceMaskProps,
12
+ } from "./svg";
13
+
14
+ it("keeps browser audit attributes off native SVG props", () => {
15
+ expect(
16
+ chartRootA11yProps("Revenue", {
17
+ kind: "bar",
18
+ separated: true,
19
+ datumText: false,
20
+ datumCount: 13,
21
+ }),
22
+ ).toEqual({ accessible: true, accessibilityRole: "image", accessibilityLabel: "Revenue" });
23
+ expect(luminanceMaskProps()).toEqual({ maskType: "luminance" });
24
+ expect(chartMarkProps("North")).toEqual({});
25
+ expect(chartChromeProps("grid")).toEqual({});
26
+ expect(chartDatumTextProps(12)).toEqual({});
27
+ expect(chartWebProps({ "data-mpo-chart-owner": "true" })).toEqual({});
28
+ });