@multiplatform.one/components 7.8.0 → 7.11.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 (452) hide show
  1. package/README.md +98 -0
  2. package/dist/cjs/Accordion/index.cjs +3 -3
  3. package/dist/cjs/Accordion/index.native.js +4 -4
  4. package/dist/cjs/Accordion/index.native.js.map +1 -1
  5. package/dist/cjs/Chip/index.cjs +1 -1
  6. package/dist/cjs/Chip/index.native.js +1 -1
  7. package/dist/cjs/Chip/index.native.js.map +1 -1
  8. package/dist/cjs/ContextMenu/index.cjs +3 -3
  9. package/dist/cjs/ContextMenu/index.native.js +3 -3
  10. package/dist/cjs/ContextMenu/index.native.js.map +1 -1
  11. package/dist/cjs/DropdownMenu/index.cjs +3 -3
  12. package/dist/cjs/DropdownMenu/index.native.js +3 -3
  13. package/dist/cjs/DropdownMenu/index.native.js.map +1 -1
  14. package/dist/cjs/Meter/index.cjs +3 -2
  15. package/dist/cjs/Meter/index.native.js +3 -2
  16. package/dist/cjs/Meter/index.native.js.map +1 -1
  17. package/dist/cjs/Meter/meter.cjs +1 -2
  18. package/dist/cjs/Meter/meter.native.js +1 -2
  19. package/dist/cjs/Meter/meter.native.js.map +1 -1
  20. package/dist/cjs/Pagination.cjs +2 -2
  21. package/dist/cjs/Pagination.native.js +2 -2
  22. package/dist/cjs/Pagination.native.js.map +1 -1
  23. package/dist/cjs/ProgressSteps/index.cjs +3 -3
  24. package/dist/cjs/ProgressSteps/index.native.js +3 -3
  25. package/dist/cjs/ProgressSteps/index.native.js.map +1 -1
  26. package/dist/cjs/Quote/index.cjs +1 -2
  27. package/dist/cjs/Quote/index.native.js +1 -2
  28. package/dist/cjs/Quote/index.native.js.map +1 -1
  29. package/dist/cjs/SheetModal/index.cjs +22 -3
  30. package/dist/cjs/SheetModal/index.native.js +50 -10
  31. package/dist/cjs/SheetModal/index.native.js.map +1 -1
  32. package/dist/cjs/Tabs/index.cjs +34 -13
  33. package/dist/cjs/Tabs/index.native.js +38 -13
  34. package/dist/cjs/Tabs/index.native.js.map +1 -1
  35. package/dist/cjs/Toast/index.cjs +4 -5
  36. package/dist/cjs/Toast/index.native.js +4 -5
  37. package/dist/cjs/Toast/index.native.js.map +1 -1
  38. package/dist/cjs/TreeSelect/index.cjs +46 -7
  39. package/dist/cjs/TreeSelect/index.native.js +58 -7
  40. package/dist/cjs/TreeSelect/index.native.js.map +1 -1
  41. package/dist/cjs/charts/PieChart.cjs +1 -2
  42. package/dist/cjs/charts/PieChart.native.js +1 -2
  43. package/dist/cjs/charts/PieChart.native.js.map +1 -1
  44. package/dist/cjs/code/HighlightedCode/index.cjs +1 -1
  45. package/dist/cjs/code/HighlightedCode/index.native.js +1 -1
  46. package/dist/cjs/code/HighlightedCode/index.native.js.map +1 -1
  47. package/dist/cjs/componentColors.cjs +6 -4
  48. package/dist/cjs/componentColors.native.js +6 -4
  49. package/dist/cjs/componentColors.native.js.map +1 -1
  50. package/dist/cjs/images/Image/ImageFrame.cjs +4 -2
  51. package/dist/cjs/images/Image/ImageFrame.native.js +4 -2
  52. package/dist/cjs/images/Image/ImageFrame.native.js.map +1 -1
  53. package/dist/cjs/layouts/AsyncBoundary.cjs +1 -2
  54. package/dist/cjs/layouts/AsyncBoundary.native.js +1 -2
  55. package/dist/cjs/layouts/AsyncBoundary.native.js.map +1 -1
  56. package/dist/cjs/layouts/EmptyState.cjs +6 -2
  57. package/dist/cjs/layouts/EmptyState.native.js +10 -6
  58. package/dist/cjs/layouts/EmptyState.native.js.map +1 -1
  59. package/dist/cjs/layouts/attachments.cjs +4 -4
  60. package/dist/cjs/layouts/attachments.native.js +4 -4
  61. package/dist/cjs/layouts/attachments.native.js.map +1 -1
  62. package/dist/cjs/layouts/breadcrumbs.cjs +1 -2
  63. package/dist/cjs/layouts/breadcrumbs.native.js +1 -2
  64. package/dist/cjs/layouts/breadcrumbs.native.js.map +1 -1
  65. package/dist/cjs/layouts/page.cjs +2 -2
  66. package/dist/cjs/layouts/page.native.js +2 -2
  67. package/dist/cjs/layouts/page.native.js.map +1 -1
  68. package/dist/cjs/layouts/sidebar.cjs +2 -2
  69. package/dist/cjs/layouts/sidebar.native.js +2 -2
  70. package/dist/cjs/layouts/sidebar.native.js.map +1 -1
  71. package/dist/cjs/layouts/tags.cjs +6 -7
  72. package/dist/cjs/layouts/tags.native.js +6 -9
  73. package/dist/cjs/layouts/tags.native.js.map +1 -1
  74. package/dist/cjs/layouts/timeline.cjs +5 -5
  75. package/dist/cjs/layouts/timeline.native.js +5 -5
  76. package/dist/cjs/layouts/timeline.native.js.map +1 -1
  77. package/dist/cjs/surfaces.cjs +1 -0
  78. package/dist/cjs/surfaces.native.js +1 -0
  79. package/dist/cjs/surfaces.native.js.map +1 -1
  80. package/dist/cjs/views/Calendar.cjs +11 -8
  81. package/dist/cjs/views/Calendar.native.js +11 -8
  82. package/dist/cjs/views/Calendar.native.js.map +1 -1
  83. package/dist/cjs/views/Dashboard.cjs +6 -6
  84. package/dist/cjs/views/Dashboard.native.js +7 -7
  85. package/dist/cjs/views/Dashboard.native.js.map +1 -1
  86. package/dist/cjs/views/Gantt.cjs +3 -3
  87. package/dist/cjs/views/Gantt.native.js +3 -3
  88. package/dist/cjs/views/Gantt.native.js.map +1 -1
  89. package/dist/cjs/views/Kanban.cjs +2 -2
  90. package/dist/cjs/views/Kanban.native.js +2 -2
  91. package/dist/cjs/views/Kanban.native.js.map +1 -1
  92. package/dist/cjs/views/ReportBuilder.cjs +4 -4
  93. package/dist/cjs/views/ReportBuilder.native.js +4 -4
  94. package/dist/cjs/views/ReportBuilder.native.js.map +1 -1
  95. package/dist/cjs/views/TreeView.cjs +248 -19
  96. package/dist/cjs/views/TreeView.native.js +264 -20
  97. package/dist/cjs/views/TreeView.native.js.map +1 -1
  98. package/dist/cjs/views/treeViewReveal.cjs +55 -0
  99. package/dist/cjs/views/treeViewReveal.native.js +80 -0
  100. package/dist/cjs/views/treeViewReveal.native.js.map +1 -0
  101. package/dist/esm/Accordion/index.mjs +3 -3
  102. package/dist/esm/Accordion/index.mjs.map +1 -1
  103. package/dist/esm/Accordion/index.native.js +4 -4
  104. package/dist/esm/Accordion/index.native.js.map +1 -1
  105. package/dist/esm/Chip/index.mjs +1 -1
  106. package/dist/esm/Chip/index.mjs.map +1 -1
  107. package/dist/esm/Chip/index.native.js +1 -1
  108. package/dist/esm/Chip/index.native.js.map +1 -1
  109. package/dist/esm/ContextMenu/index.mjs +3 -3
  110. package/dist/esm/ContextMenu/index.mjs.map +1 -1
  111. package/dist/esm/ContextMenu/index.native.js +3 -3
  112. package/dist/esm/ContextMenu/index.native.js.map +1 -1
  113. package/dist/esm/DropdownMenu/index.mjs +3 -3
  114. package/dist/esm/DropdownMenu/index.mjs.map +1 -1
  115. package/dist/esm/DropdownMenu/index.native.js +3 -3
  116. package/dist/esm/DropdownMenu/index.native.js.map +1 -1
  117. package/dist/esm/Meter/index.mjs +3 -2
  118. package/dist/esm/Meter/index.mjs.map +1 -1
  119. package/dist/esm/Meter/index.native.js +3 -2
  120. package/dist/esm/Meter/index.native.js.map +1 -1
  121. package/dist/esm/Meter/meter.mjs +1 -2
  122. package/dist/esm/Meter/meter.mjs.map +1 -1
  123. package/dist/esm/Meter/meter.native.js +1 -2
  124. package/dist/esm/Meter/meter.native.js.map +1 -1
  125. package/dist/esm/Pagination.mjs +2 -2
  126. package/dist/esm/Pagination.mjs.map +1 -1
  127. package/dist/esm/Pagination.native.js +2 -2
  128. package/dist/esm/Pagination.native.js.map +1 -1
  129. package/dist/esm/ProgressSteps/index.mjs +3 -3
  130. package/dist/esm/ProgressSteps/index.mjs.map +1 -1
  131. package/dist/esm/ProgressSteps/index.native.js +3 -3
  132. package/dist/esm/ProgressSteps/index.native.js.map +1 -1
  133. package/dist/esm/Quote/index.mjs +1 -2
  134. package/dist/esm/Quote/index.mjs.map +1 -1
  135. package/dist/esm/Quote/index.native.js +1 -2
  136. package/dist/esm/Quote/index.native.js.map +1 -1
  137. package/dist/esm/SheetModal/index.mjs +22 -3
  138. package/dist/esm/SheetModal/index.mjs.map +1 -1
  139. package/dist/esm/SheetModal/index.native.js +51 -11
  140. package/dist/esm/SheetModal/index.native.js.map +1 -1
  141. package/dist/esm/Tabs/index.mjs +34 -13
  142. package/dist/esm/Tabs/index.mjs.map +1 -1
  143. package/dist/esm/Tabs/index.native.js +38 -13
  144. package/dist/esm/Tabs/index.native.js.map +1 -1
  145. package/dist/esm/Toast/index.mjs +4 -5
  146. package/dist/esm/Toast/index.mjs.map +1 -1
  147. package/dist/esm/Toast/index.native.js +4 -5
  148. package/dist/esm/Toast/index.native.js.map +1 -1
  149. package/dist/esm/TreeSelect/index.mjs +46 -7
  150. package/dist/esm/TreeSelect/index.mjs.map +1 -1
  151. package/dist/esm/TreeSelect/index.native.js +58 -7
  152. package/dist/esm/TreeSelect/index.native.js.map +1 -1
  153. package/dist/esm/charts/PieChart.mjs +1 -2
  154. package/dist/esm/charts/PieChart.mjs.map +1 -1
  155. package/dist/esm/charts/PieChart.native.js +1 -2
  156. package/dist/esm/charts/PieChart.native.js.map +1 -1
  157. package/dist/esm/code/HighlightedCode/index.mjs +1 -1
  158. package/dist/esm/code/HighlightedCode/index.mjs.map +1 -1
  159. package/dist/esm/code/HighlightedCode/index.native.js +1 -1
  160. package/dist/esm/code/HighlightedCode/index.native.js.map +1 -1
  161. package/dist/esm/componentColors.mjs +6 -4
  162. package/dist/esm/componentColors.mjs.map +1 -1
  163. package/dist/esm/componentColors.native.js +6 -4
  164. package/dist/esm/componentColors.native.js.map +1 -1
  165. package/dist/esm/images/Image/ImageFrame.mjs +4 -2
  166. package/dist/esm/images/Image/ImageFrame.mjs.map +1 -1
  167. package/dist/esm/images/Image/ImageFrame.native.js +4 -2
  168. package/dist/esm/images/Image/ImageFrame.native.js.map +1 -1
  169. package/dist/esm/layouts/AsyncBoundary.mjs +1 -2
  170. package/dist/esm/layouts/AsyncBoundary.mjs.map +1 -1
  171. package/dist/esm/layouts/AsyncBoundary.native.js +1 -2
  172. package/dist/esm/layouts/AsyncBoundary.native.js.map +1 -1
  173. package/dist/esm/layouts/EmptyState.mjs +7 -3
  174. package/dist/esm/layouts/EmptyState.mjs.map +1 -1
  175. package/dist/esm/layouts/EmptyState.native.js +11 -7
  176. package/dist/esm/layouts/EmptyState.native.js.map +1 -1
  177. package/dist/esm/layouts/attachments.mjs +4 -4
  178. package/dist/esm/layouts/attachments.mjs.map +1 -1
  179. package/dist/esm/layouts/attachments.native.js +4 -4
  180. package/dist/esm/layouts/attachments.native.js.map +1 -1
  181. package/dist/esm/layouts/breadcrumbs.mjs +1 -2
  182. package/dist/esm/layouts/breadcrumbs.mjs.map +1 -1
  183. package/dist/esm/layouts/breadcrumbs.native.js +1 -2
  184. package/dist/esm/layouts/breadcrumbs.native.js.map +1 -1
  185. package/dist/esm/layouts/page.mjs +2 -2
  186. package/dist/esm/layouts/page.mjs.map +1 -1
  187. package/dist/esm/layouts/page.native.js +2 -2
  188. package/dist/esm/layouts/page.native.js.map +1 -1
  189. package/dist/esm/layouts/sidebar.mjs +2 -2
  190. package/dist/esm/layouts/sidebar.mjs.map +1 -1
  191. package/dist/esm/layouts/sidebar.native.js +2 -2
  192. package/dist/esm/layouts/sidebar.native.js.map +1 -1
  193. package/dist/esm/layouts/tags.mjs +6 -7
  194. package/dist/esm/layouts/tags.mjs.map +1 -1
  195. package/dist/esm/layouts/tags.native.js +6 -9
  196. package/dist/esm/layouts/tags.native.js.map +1 -1
  197. package/dist/esm/layouts/timeline.mjs +5 -5
  198. package/dist/esm/layouts/timeline.mjs.map +1 -1
  199. package/dist/esm/layouts/timeline.native.js +5 -5
  200. package/dist/esm/layouts/timeline.native.js.map +1 -1
  201. package/dist/esm/surfaces.mjs +1 -0
  202. package/dist/esm/surfaces.mjs.map +1 -1
  203. package/dist/esm/surfaces.native.js +1 -0
  204. package/dist/esm/surfaces.native.js.map +1 -1
  205. package/dist/esm/views/Calendar.mjs +11 -8
  206. package/dist/esm/views/Calendar.mjs.map +1 -1
  207. package/dist/esm/views/Calendar.native.js +11 -8
  208. package/dist/esm/views/Calendar.native.js.map +1 -1
  209. package/dist/esm/views/Dashboard.mjs +6 -6
  210. package/dist/esm/views/Dashboard.mjs.map +1 -1
  211. package/dist/esm/views/Dashboard.native.js +7 -7
  212. package/dist/esm/views/Dashboard.native.js.map +1 -1
  213. package/dist/esm/views/Gantt.mjs +3 -3
  214. package/dist/esm/views/Gantt.mjs.map +1 -1
  215. package/dist/esm/views/Gantt.native.js +3 -3
  216. package/dist/esm/views/Gantt.native.js.map +1 -1
  217. package/dist/esm/views/Kanban.mjs +2 -2
  218. package/dist/esm/views/Kanban.mjs.map +1 -1
  219. package/dist/esm/views/Kanban.native.js +2 -2
  220. package/dist/esm/views/Kanban.native.js.map +1 -1
  221. package/dist/esm/views/ReportBuilder.mjs +4 -4
  222. package/dist/esm/views/ReportBuilder.mjs.map +1 -1
  223. package/dist/esm/views/ReportBuilder.native.js +4 -4
  224. package/dist/esm/views/ReportBuilder.native.js.map +1 -1
  225. package/dist/esm/views/TreeView.mjs +249 -20
  226. package/dist/esm/views/TreeView.mjs.map +1 -1
  227. package/dist/esm/views/TreeView.native.js +265 -21
  228. package/dist/esm/views/TreeView.native.js.map +1 -1
  229. package/dist/esm/views/treeViewReveal.mjs +29 -0
  230. package/dist/esm/views/treeViewReveal.mjs.map +1 -0
  231. package/dist/esm/views/treeViewReveal.native.js +51 -0
  232. package/dist/esm/views/treeViewReveal.native.js.map +1 -0
  233. package/dist/jsx/Accordion/index.mjs +3 -3
  234. package/dist/jsx/Accordion/index.mjs.map +1 -1
  235. package/dist/jsx/Accordion/index.native.js +4 -4
  236. package/dist/jsx/Accordion/index.native.js.map +1 -1
  237. package/dist/jsx/Chip/index.mjs +1 -1
  238. package/dist/jsx/Chip/index.mjs.map +1 -1
  239. package/dist/jsx/Chip/index.native.js +1 -1
  240. package/dist/jsx/Chip/index.native.js.map +1 -1
  241. package/dist/jsx/ContextMenu/index.mjs +3 -3
  242. package/dist/jsx/ContextMenu/index.mjs.map +1 -1
  243. package/dist/jsx/ContextMenu/index.native.js +3 -3
  244. package/dist/jsx/ContextMenu/index.native.js.map +1 -1
  245. package/dist/jsx/DropdownMenu/index.mjs +3 -3
  246. package/dist/jsx/DropdownMenu/index.mjs.map +1 -1
  247. package/dist/jsx/DropdownMenu/index.native.js +3 -3
  248. package/dist/jsx/DropdownMenu/index.native.js.map +1 -1
  249. package/dist/jsx/Meter/index.mjs +3 -2
  250. package/dist/jsx/Meter/index.mjs.map +1 -1
  251. package/dist/jsx/Meter/index.native.js +3 -2
  252. package/dist/jsx/Meter/index.native.js.map +1 -1
  253. package/dist/jsx/Meter/meter.mjs +1 -2
  254. package/dist/jsx/Meter/meter.mjs.map +1 -1
  255. package/dist/jsx/Meter/meter.native.js +1 -2
  256. package/dist/jsx/Meter/meter.native.js.map +1 -1
  257. package/dist/jsx/Pagination.mjs +2 -2
  258. package/dist/jsx/Pagination.mjs.map +1 -1
  259. package/dist/jsx/Pagination.native.js +2 -2
  260. package/dist/jsx/Pagination.native.js.map +1 -1
  261. package/dist/jsx/ProgressSteps/index.mjs +3 -3
  262. package/dist/jsx/ProgressSteps/index.mjs.map +1 -1
  263. package/dist/jsx/ProgressSteps/index.native.js +3 -3
  264. package/dist/jsx/ProgressSteps/index.native.js.map +1 -1
  265. package/dist/jsx/Quote/index.mjs +1 -2
  266. package/dist/jsx/Quote/index.mjs.map +1 -1
  267. package/dist/jsx/Quote/index.native.js +1 -2
  268. package/dist/jsx/Quote/index.native.js.map +1 -1
  269. package/dist/jsx/SheetModal/index.mjs +22 -3
  270. package/dist/jsx/SheetModal/index.mjs.map +1 -1
  271. package/dist/jsx/SheetModal/index.native.js +50 -10
  272. package/dist/jsx/SheetModal/index.native.js.map +1 -1
  273. package/dist/jsx/Tabs/index.mjs +34 -13
  274. package/dist/jsx/Tabs/index.mjs.map +1 -1
  275. package/dist/jsx/Tabs/index.native.js +38 -13
  276. package/dist/jsx/Tabs/index.native.js.map +1 -1
  277. package/dist/jsx/Toast/index.mjs +4 -5
  278. package/dist/jsx/Toast/index.mjs.map +1 -1
  279. package/dist/jsx/Toast/index.native.js +4 -5
  280. package/dist/jsx/Toast/index.native.js.map +1 -1
  281. package/dist/jsx/TreeSelect/index.mjs +46 -7
  282. package/dist/jsx/TreeSelect/index.mjs.map +1 -1
  283. package/dist/jsx/TreeSelect/index.native.js +58 -7
  284. package/dist/jsx/TreeSelect/index.native.js.map +1 -1
  285. package/dist/jsx/charts/PieChart.mjs +1 -2
  286. package/dist/jsx/charts/PieChart.mjs.map +1 -1
  287. package/dist/jsx/charts/PieChart.native.js +1 -2
  288. package/dist/jsx/charts/PieChart.native.js.map +1 -1
  289. package/dist/jsx/code/HighlightedCode/index.mjs +1 -1
  290. package/dist/jsx/code/HighlightedCode/index.mjs.map +1 -1
  291. package/dist/jsx/code/HighlightedCode/index.native.js +1 -1
  292. package/dist/jsx/code/HighlightedCode/index.native.js.map +1 -1
  293. package/dist/jsx/componentColors.mjs +6 -4
  294. package/dist/jsx/componentColors.mjs.map +1 -1
  295. package/dist/jsx/componentColors.native.js +6 -4
  296. package/dist/jsx/componentColors.native.js.map +1 -1
  297. package/dist/jsx/images/Image/ImageFrame.mjs +4 -2
  298. package/dist/jsx/images/Image/ImageFrame.mjs.map +1 -1
  299. package/dist/jsx/images/Image/ImageFrame.native.js +4 -2
  300. package/dist/jsx/images/Image/ImageFrame.native.js.map +1 -1
  301. package/dist/jsx/layouts/AsyncBoundary.mjs +1 -2
  302. package/dist/jsx/layouts/AsyncBoundary.mjs.map +1 -1
  303. package/dist/jsx/layouts/AsyncBoundary.native.js +1 -2
  304. package/dist/jsx/layouts/AsyncBoundary.native.js.map +1 -1
  305. package/dist/jsx/layouts/EmptyState.mjs +7 -3
  306. package/dist/jsx/layouts/EmptyState.mjs.map +1 -1
  307. package/dist/jsx/layouts/EmptyState.native.js +10 -6
  308. package/dist/jsx/layouts/EmptyState.native.js.map +1 -1
  309. package/dist/jsx/layouts/attachments.mjs +4 -4
  310. package/dist/jsx/layouts/attachments.mjs.map +1 -1
  311. package/dist/jsx/layouts/attachments.native.js +4 -4
  312. package/dist/jsx/layouts/attachments.native.js.map +1 -1
  313. package/dist/jsx/layouts/breadcrumbs.mjs +1 -2
  314. package/dist/jsx/layouts/breadcrumbs.mjs.map +1 -1
  315. package/dist/jsx/layouts/breadcrumbs.native.js +1 -2
  316. package/dist/jsx/layouts/breadcrumbs.native.js.map +1 -1
  317. package/dist/jsx/layouts/page.mjs +2 -2
  318. package/dist/jsx/layouts/page.mjs.map +1 -1
  319. package/dist/jsx/layouts/page.native.js +2 -2
  320. package/dist/jsx/layouts/page.native.js.map +1 -1
  321. package/dist/jsx/layouts/sidebar.mjs +2 -2
  322. package/dist/jsx/layouts/sidebar.mjs.map +1 -1
  323. package/dist/jsx/layouts/sidebar.native.js +2 -2
  324. package/dist/jsx/layouts/sidebar.native.js.map +1 -1
  325. package/dist/jsx/layouts/tags.mjs +6 -7
  326. package/dist/jsx/layouts/tags.mjs.map +1 -1
  327. package/dist/jsx/layouts/tags.native.js +6 -9
  328. package/dist/jsx/layouts/tags.native.js.map +1 -1
  329. package/dist/jsx/layouts/timeline.mjs +5 -5
  330. package/dist/jsx/layouts/timeline.mjs.map +1 -1
  331. package/dist/jsx/layouts/timeline.native.js +5 -5
  332. package/dist/jsx/layouts/timeline.native.js.map +1 -1
  333. package/dist/jsx/surfaces.mjs +1 -0
  334. package/dist/jsx/surfaces.mjs.map +1 -1
  335. package/dist/jsx/surfaces.native.js +1 -0
  336. package/dist/jsx/surfaces.native.js.map +1 -1
  337. package/dist/jsx/views/Calendar.mjs +11 -8
  338. package/dist/jsx/views/Calendar.mjs.map +1 -1
  339. package/dist/jsx/views/Calendar.native.js +11 -8
  340. package/dist/jsx/views/Calendar.native.js.map +1 -1
  341. package/dist/jsx/views/Dashboard.mjs +6 -6
  342. package/dist/jsx/views/Dashboard.mjs.map +1 -1
  343. package/dist/jsx/views/Dashboard.native.js +7 -7
  344. package/dist/jsx/views/Dashboard.native.js.map +1 -1
  345. package/dist/jsx/views/Gantt.mjs +3 -3
  346. package/dist/jsx/views/Gantt.mjs.map +1 -1
  347. package/dist/jsx/views/Gantt.native.js +3 -3
  348. package/dist/jsx/views/Gantt.native.js.map +1 -1
  349. package/dist/jsx/views/Kanban.mjs +2 -2
  350. package/dist/jsx/views/Kanban.mjs.map +1 -1
  351. package/dist/jsx/views/Kanban.native.js +2 -2
  352. package/dist/jsx/views/Kanban.native.js.map +1 -1
  353. package/dist/jsx/views/ReportBuilder.mjs +4 -4
  354. package/dist/jsx/views/ReportBuilder.mjs.map +1 -1
  355. package/dist/jsx/views/ReportBuilder.native.js +4 -4
  356. package/dist/jsx/views/ReportBuilder.native.js.map +1 -1
  357. package/dist/jsx/views/TreeView.mjs +249 -20
  358. package/dist/jsx/views/TreeView.mjs.map +1 -1
  359. package/dist/jsx/views/TreeView.native.js +264 -20
  360. package/dist/jsx/views/TreeView.native.js.map +1 -1
  361. package/dist/jsx/views/treeViewReveal.mjs +29 -0
  362. package/dist/jsx/views/treeViewReveal.mjs.map +1 -0
  363. package/dist/jsx/views/treeViewReveal.native.js +80 -0
  364. package/dist/jsx/views/treeViewReveal.native.js.map +1 -0
  365. package/package.json +11 -11
  366. package/src/Accordion/index.tsx +4 -6
  367. package/src/Chip/index.tsx +1 -1
  368. package/src/ContextMenu/index.tsx +3 -3
  369. package/src/DropdownMenu/index.tsx +3 -3
  370. package/src/Meter/Meter.spec.tsx +12 -4
  371. package/src/Meter/index.tsx +3 -2
  372. package/src/Meter/meter.ts +6 -1
  373. package/src/Pagination.tsx +2 -2
  374. package/src/ProgressSteps/index.tsx +3 -3
  375. package/src/Quote/index.tsx +1 -3
  376. package/src/SheetModal/SheetModal.fill.spec.tsx +147 -0
  377. package/src/SheetModal/SheetModal.ownedBody.spec.tsx +200 -0
  378. package/src/SheetModal/SheetModal.stories.spec.tsx +23 -2
  379. package/src/SheetModal/SheetModal.stories.tsx +275 -2
  380. package/src/SheetModal/index.native.tsx +50 -6
  381. package/src/SheetModal/index.tsx +40 -3
  382. package/src/Tabs/Tabs.lifecycle.spec.tsx +123 -0
  383. package/src/Tabs/Tabs.measurement.spec.tsx +186 -0
  384. package/src/Tabs/Tabs.stories.tsx +43 -0
  385. package/src/Tabs/index.tsx +44 -15
  386. package/src/Toast/Toast.spec.tsx +120 -48
  387. package/src/Toast/index.tsx +5 -3
  388. package/src/TreeSelect/index.tsx +61 -1
  389. package/src/charts/PieChart.tsx +1 -2
  390. package/src/code/HighlightedCode/index.tsx +1 -1
  391. package/src/componentColors.ts +6 -4
  392. package/src/images/Image/ImageFrame.tsx +2 -2
  393. package/src/layouts/AsyncBoundary.tsx +1 -2
  394. package/src/layouts/EmptyState.spec.tsx +58 -1
  395. package/src/layouts/EmptyState.tsx +11 -7
  396. package/src/layouts/KeyboardAvoidingWrapper/KeyboardAvoidingWrapper.stories.tsx +3 -3
  397. package/src/layouts/PaneScaffold.stories.tsx +3 -8
  398. package/src/layouts/SafeAreaWrapper/SafeAreaWrapper.stories.tsx +3 -3
  399. package/src/layouts/attachments.tsx +4 -4
  400. package/src/layouts/breadcrumbs.tsx +1 -2
  401. package/src/layouts/page.tsx +2 -2
  402. package/src/layouts/sidebar.tsx +2 -2
  403. package/src/layouts/tags-trigger.spec.tsx +32 -0
  404. package/src/layouts/tags.tsx +7 -9
  405. package/src/layouts/timeline.tsx +5 -5
  406. package/src/surfaces.spec.tsx +97 -3
  407. package/src/surfaces.tsx +4 -2
  408. package/src/textAccentSecondary.spec.tsx +187 -0
  409. package/src/views/Calendar.tsx +9 -8
  410. package/src/views/Dashboard.tsx +13 -8
  411. package/src/views/Gantt.tsx +3 -3
  412. package/src/views/Kanban.native.tsx +2 -2
  413. package/src/views/Kanban.tsx +2 -2
  414. package/src/views/ReportBuilder.tsx +4 -4
  415. package/src/views/TreeView.reveal.spec.tsx +174 -0
  416. package/src/views/TreeView.reveal.stories.tsx +249 -0
  417. package/src/views/TreeView.scroll-index.spec.tsx +246 -0
  418. package/src/views/TreeView.scroll.spec.tsx +857 -0
  419. package/src/views/TreeView.spec.tsx +1 -1
  420. package/src/views/TreeView.tsx +353 -29
  421. package/src/views/treeViewReveal.spec.ts +83 -0
  422. package/src/views/treeViewReveal.ts +45 -0
  423. package/src/views/views.spec.tsx +13 -12
  424. package/types/Accordion/index.d.ts.map +1 -1
  425. package/types/Meter/index.d.ts.map +1 -1
  426. package/types/Meter/meter.d.ts +5 -1
  427. package/types/Meter/meter.d.ts.map +1 -1
  428. package/types/Quote/index.d.ts.map +1 -1
  429. package/types/SheetModal/index.d.ts +8 -1
  430. package/types/SheetModal/index.d.ts.map +1 -1
  431. package/types/SheetModal/index.native.d.ts +1 -1
  432. package/types/SheetModal/index.native.d.ts.map +1 -1
  433. package/types/Tabs/index.d.ts.map +1 -1
  434. package/types/Toast/index.d.ts.map +1 -1
  435. package/types/TreeSelect/index.d.ts +9 -1
  436. package/types/TreeSelect/index.d.ts.map +1 -1
  437. package/types/charts/PieChart.d.ts.map +1 -1
  438. package/types/componentColors.d.ts +1 -4
  439. package/types/componentColors.d.ts.map +1 -1
  440. package/types/images/Image/ImageFrame.d.ts.map +1 -1
  441. package/types/layouts/AsyncBoundary.d.ts.map +1 -1
  442. package/types/layouts/EmptyState.d.ts.map +1 -1
  443. package/types/layouts/breadcrumbs.d.ts.map +1 -1
  444. package/types/layouts/tags.d.ts.map +1 -1
  445. package/types/surfaces.d.ts.map +1 -1
  446. package/types/views/Calendar.d.ts.map +1 -1
  447. package/types/views/Dashboard.d.ts +7 -3
  448. package/types/views/Dashboard.d.ts.map +1 -1
  449. package/types/views/TreeView.d.ts +19 -1
  450. package/types/views/TreeView.d.ts.map +1 -1
  451. package/types/views/treeViewReveal.d.ts +11 -0
  452. package/types/views/treeViewReveal.d.ts.map +1 -0
@@ -66,6 +66,14 @@ export interface TreeSelectProps extends Omit<GetProps<typeof YStack>, "children
66
66
  open?: boolean;
67
67
  onOpenChange?: (open: boolean) => void;
68
68
  defaultExpandedIds?: string[];
69
+ /**
70
+ * MPO-283 — accessible name for the trigger. `GetProps<typeof YStack>`
71
+ * already admitted this prop, but it landed on the outer wrapper, which is
72
+ * not an accessibility element on iOS, so nothing read it. It is routed to
73
+ * the trigger now. `aria-label` is accepted as an alias.
74
+ */
75
+ accessibilityLabel?: string;
76
+ "aria-label"?: string;
69
77
  }
70
78
 
71
79
  function defaultNodeIcon(hasChildren: boolean, isExpanded: boolean, iconSize: number) {
@@ -134,6 +142,24 @@ function TreeSelectRows({
134
142
  aria-expanded={hasChildren ? isExpanded : undefined}
135
143
  aria-selected={isSelected}
136
144
  aria-level={depth + 1}
145
+ // MPO-283: the aria-* above are web-only. Without the RN spellings
146
+ // a row is not an accessibility element on iOS, so the whole tree
147
+ // came back as loose StaticText with no role and no selected state.
148
+ // `role` is overridden too: RN prefers it over accessibilityRole,
149
+ // and `treeitem` leaves the element out of the iOS tree the same
150
+ // way `radio` does (measured, iOS 26.2).
151
+ {...(!isWeb
152
+ ? {
153
+ accessible: true,
154
+ role: "button" as const,
155
+ accessibilityRole: "button" as const,
156
+ accessibilityLabel: node.label,
157
+ accessibilityState: {
158
+ selected: isSelected,
159
+ ...(hasChildren ? { expanded: isExpanded } : undefined),
160
+ },
161
+ }
162
+ : undefined)}
137
163
  data-treeselect-row={node.id}
138
164
  data-treeselect-index={String(index)}
139
165
  data-depth={String(depth)}
@@ -181,6 +207,16 @@ function TreeSelectRows({
181
207
  ? t("Collapse {{label}}", { label: node.label })
182
208
  : t("Expand {{label}}", { label: node.label })
183
209
  }
210
+ // MPO-283: the aria-label above never reaches native.
211
+ {...(!isWeb
212
+ ? {
213
+ accessible: true,
214
+ accessibilityRole: "button" as const,
215
+ accessibilityLabel: isExpanded
216
+ ? t("Collapse {{label}}", { label: node.label })
217
+ : t("Expand {{label}}", { label: node.label }),
218
+ }
219
+ : undefined)}
184
220
  width={expandIconSize}
185
221
  height={expandIconSize}
186
222
  alignItems="center"
@@ -321,6 +357,7 @@ function Trigger({
321
357
  triggerRef,
322
358
  sizeToken,
323
359
  borderRadius,
360
+ accessibilityLabel,
324
361
  }: {
325
362
  display?: string;
326
363
  placeholder: string;
@@ -328,6 +365,7 @@ function Trigger({
328
365
  disabled: boolean;
329
366
  id?: string;
330
367
  labelled: boolean;
368
+ accessibilityLabel?: string;
331
369
  onToggle: () => void;
332
370
  triggerRef: (node: HTMLElement | null) => void;
333
371
  sizeToken: string;
@@ -349,8 +387,21 @@ function Trigger({
349
387
  role="combobox"
350
388
  aria-haspopup="tree"
351
389
  aria-expanded={open}
352
- aria-label={labelled ? undefined : placeholder}
390
+ aria-label={accessibilityLabel ?? (labelled ? undefined : placeholder)}
353
391
  id={id}
392
+ // MPO-283 (same family as ToggleGroup / RadioGroup): every semantic on
393
+ // this trigger above is a web attribute, and tamagui does not map any
394
+ // of them onto React Native, so on iOS the control reached the
395
+ // accessibility tree with no role, no name and no expanded state.
396
+ {...(!isWeb
397
+ ? {
398
+ accessible: true,
399
+ role: "button" as const,
400
+ accessibilityRole: "button" as const,
401
+ accessibilityLabel: accessibilityLabel ?? display ?? placeholder,
402
+ accessibilityState: { disabled, expanded: open },
403
+ }
404
+ : undefined)}
354
405
  tabIndex={disabled || open ? -1 : 0}
355
406
  disabled={disabled}
356
407
  cursor={disabled ? "not-allowed" : "pointer"}
@@ -582,6 +633,7 @@ function FloatingTreeSelect({
582
633
  sizeToken,
583
634
  borderRadius,
584
635
  loading,
636
+ accessibilityLabel,
585
637
  }: {
586
638
  nodes: TreeNode[];
587
639
  value?: string;
@@ -599,6 +651,7 @@ function FloatingTreeSelect({
599
651
  sizeToken: string;
600
652
  borderRadius: number | string;
601
653
  loading?: boolean;
654
+ accessibilityLabel?: string;
602
655
  }) {
603
656
  const treeId = useId();
604
657
  const searchRef = useRef<HTMLInputElement | null>(null);
@@ -695,6 +748,7 @@ function FloatingTreeSelect({
695
748
  triggerRef={panel.setReferenceRef}
696
749
  sizeToken={sizeToken}
697
750
  borderRadius={borderRadius}
751
+ accessibilityLabel={accessibilityLabel}
698
752
  />
699
753
  {panel.mounted && (
700
754
  <FloatingFocusManager context={panel.context} modal={false} initialFocus={-1}>
@@ -772,6 +826,7 @@ function SheetTreeSelect({
772
826
  sizeToken,
773
827
  borderRadius,
774
828
  loading,
829
+ accessibilityLabel,
775
830
  }: {
776
831
  nodes: TreeNode[];
777
832
  value?: string;
@@ -789,6 +844,7 @@ function SheetTreeSelect({
789
844
  sizeToken: string;
790
845
  borderRadius: number | string;
791
846
  loading?: boolean;
847
+ accessibilityLabel?: string;
792
848
  }) {
793
849
  const treeId = useId();
794
850
  const searchRef = useRef<HTMLInputElement | null>(null);
@@ -844,6 +900,7 @@ function SheetTreeSelect({
844
900
  }}
845
901
  sizeToken={sizeToken}
846
902
  borderRadius={borderRadius}
903
+ accessibilityLabel={accessibilityLabel}
847
904
  />
848
905
  }
849
906
  header={
@@ -902,6 +959,8 @@ export function TreeSelect({
902
959
  onOpenChange,
903
960
  defaultExpandedIds,
904
961
  id: idProp,
962
+ accessibilityLabel,
963
+ "aria-label": ariaLabel,
905
964
  ...stackProps
906
965
  }: TreeSelectProps) {
907
966
  if (isWeb) ensureKeyboardModalityTracking();
@@ -965,6 +1024,7 @@ export function TreeSelect({
965
1024
  sizeToken: String(knobProps.sizeToken),
966
1025
  borderRadius: knobProps.borderRadius.borderRadius,
967
1026
  loading,
1027
+ accessibilityLabel: accessibilityLabel ?? ariaLabel,
968
1028
  };
969
1029
 
970
1030
  const core = shouldUseSheet ? (
@@ -1,7 +1,6 @@
1
1
  import { useResolvedKnobs } from "@multiplatform.one/theme";
2
2
  import { useTranslation } from "../shared/i18n";
3
3
  import { Text, XStack, YStack, type YStackProps } from "tamagui";
4
- import { componentColors } from "../componentColors";
5
4
  import { ChartDataFrame } from "./ChartDataView";
6
5
  import { ChartSurface } from "./ChartSurface";
7
6
  import { chartDatumText, describeChart, describeDatum } from "./accessibility";
@@ -169,7 +168,7 @@ export function PieChart({
169
168
  {...chartWebProps({ "data-mpo-chart-datum-label": "true" })}
170
169
  {...knobProps.body}
171
170
  fontSize="$2"
172
- color={componentColors.text.muted}
171
+ color={knobProps.textAccentColor}
173
172
  flex={1}
174
173
  numberOfLines={1}
175
174
  >
@@ -77,7 +77,7 @@ export function HighlightedCode({
77
77
  >
78
78
  {showLineNumbers && (
79
79
  <Text
80
- color={componentColors.text.secondary}
80
+ color={knobProps.textAccentColor}
81
81
  fontSize={resolvedFontSize}
82
82
  width={gutterWidth}
83
83
  data-line-number=""
@@ -30,15 +30,17 @@ export const componentColors = {
30
30
  border: "$color7",
31
31
  },
32
32
 
33
- /** Text color levels. muted sits on the $color11 tier — the lowest ramp
34
- * step that keeps secondary text AA-readable on color1/2 surfaces. */
33
+ /** Text color levels. */
35
34
  text: {
36
35
  // MPO-19 X5: was `$color12`, a second answer to what `resolveKnobs`'
37
36
  // `textAccent: high` already resolves to. `$color` IS the theme's ink,
38
37
  // and it tracks a sub-theme where the raw ramp step does not.
39
38
  primary: "$color",
40
- secondary: "$color11",
41
- muted: "$color11",
39
+ // MPO-154: `secondary` and `muted` were the same mistake one tier down —
40
+ // a static `$color11` read into 85 `color` props, which pinned every
41
+ // helper, caption and inactive label dim at `textAccent: high`. Secondary
42
+ // text takes `useResolvedKnobs().knobProps.textAccentColor`, which is
43
+ // `$color11` at low/medium (the AA floor) and `$color` at high.
42
44
  subtle: "$color8",
43
45
  },
44
46
 
@@ -11,7 +11,6 @@ import {
11
11
  type GroupPosition,
12
12
  } from "@multiplatform.one/theme";
13
13
  import { Image as TamaguiImage, View, isWeb } from "tamagui";
14
- import { componentColors } from "../../componentColors";
15
14
  import { Skeleton } from "../../Skeleton";
16
15
  import { isThumbnailSize, thumbnailPx as resolveThumbnailPx } from "./shared";
17
16
  import type { ImagePlaceholder, ImageProps } from "./types";
@@ -51,6 +50,7 @@ function glyphSize(px: number): number {
51
50
  }
52
51
 
53
52
  function DefaultFallback({ px }: { px: number }) {
53
+ const { knobProps } = useResolvedKnobs();
54
54
  return (
55
55
  <View
56
56
  data-image-fallback=""
@@ -61,7 +61,7 @@ function DefaultFallback({ px }: { px: number }) {
61
61
  justifyContent="center"
62
62
  backgroundColor="$color3"
63
63
  >
64
- <ImageIcon size={glyphSize(px)} color={componentColors.text.muted} />
64
+ <ImageIcon size={glyphSize(px)} color={knobProps.textAccentColor} />
65
65
  </View>
66
66
  );
67
67
  }
@@ -18,7 +18,6 @@ import { createContext, useContext, useEffect, useRef, type ReactNode } from "re
18
18
  import { useTranslation } from "../shared/i18n";
19
19
  import { XStack, YStack, type YStackProps } from "tamagui";
20
20
  import { Alert } from "../Alert";
21
- import { componentColors } from "../componentColors";
22
21
  import { Skeleton } from "../Skeleton";
23
22
  import { Text } from "../Text";
24
23
  import { EmptyState } from "./page";
@@ -320,7 +319,7 @@ function AsyncPendingBar() {
320
319
  {...knobProps.gap}
321
320
  >
322
321
  <Spinner size="small" aria-hidden />
323
- <Text {...knobProps.label} color={componentColors.text.muted}>
322
+ <Text {...knobProps.label} color={knobProps.textAccentColor}>
324
323
  {t("Updating...")}
325
324
  </Text>
326
325
  </XStack>
@@ -1,6 +1,20 @@
1
+ import { cleanup, screen } from "@testing-library/react";
1
2
  import { renderWithProviders } from "@multiplatform.one/test-utils";
2
- import { describe, expect, it } from "vitest";
3
+ import { Preset } from "@multiplatform.one/theme";
4
+ import { afterEach, describe, expect, it } from "vitest";
3
5
  import { EmptyState } from "./EmptyState";
6
+ import { KPICard } from "../views/Dashboard";
7
+
8
+ afterEach(cleanup);
9
+
10
+ const RADIUS_STOPS = ["none", "small", "medium", "large", "full"] as const;
11
+
12
+ function radiusAtoms(el: Element): string[] {
13
+ return String(el.className || "")
14
+ .split(" ")
15
+ .filter((c) => /^_(btlr|btrr|bbrr|bblr)-/.test(c))
16
+ .sort();
17
+ }
4
18
 
5
19
  describe("EmptyState", () => {
6
20
  it("does not pin compact, so the density knob restyles the frame", () => {
@@ -28,3 +42,46 @@ describe("EmptyState", () => {
28
42
  expect(container.textContent).toContain("Records you add will show up here.");
29
43
  });
30
44
  });
45
+
46
+ /**
47
+ * RULINGS-2026-08-28 R2e (MPO-106 D4): an icon well rides the radius scale
48
+ * (DEFAULT); R-PILL is reserved for a well that IS a count badge. EmptyState
49
+ * declared R-PILL and painted 1000, so its well stayed a circle at every
50
+ * stop while KPICard's well — the dialect the ruling picked — rode the scale.
51
+ */
52
+ describe("EmptyState icon well radius (R2e)", () => {
53
+ it.each(RADIUS_STOPS)("at radius %s the well matches KPICard's well", (borderRadius) => {
54
+ renderWithProviders(
55
+ <Preset overrides={{ borderRadius }}>
56
+ <>
57
+ <EmptyState title="Nothing here" icon={<span data-testid="empty-icon">i</span>} />
58
+ <KPICard
59
+ config={{ id: "k", title: "K", value: 1, icon: <span data-testid="kpi-icon">i</span> }}
60
+ />
61
+ </>
62
+ </Preset>,
63
+ );
64
+ const emptyWell = screen.getByTestId("empty-icon").parentElement as HTMLElement;
65
+ const kpiWell = screen.getByTestId("kpi-icon").parentElement as HTMLElement;
66
+ expect(radiusAtoms(emptyWell)).not.toHaveLength(0);
67
+ expect(radiusAtoms(emptyWell)).toEqual(radiusAtoms(kpiWell));
68
+ // A knob-immunity declaration is what licensed the circle; the well is
69
+ // not immune, so it must carry none.
70
+ expect(emptyWell.getAttribute("data-radius-class")).toBeNull();
71
+ });
72
+
73
+ it("squares at radius none rather than staying a circle", () => {
74
+ renderWithProviders(
75
+ <Preset overrides={{ borderRadius: "none" }}>
76
+ <EmptyState title="Nothing here" icon={<span data-testid="empty-icon">i</span>} />
77
+ </Preset>,
78
+ );
79
+ const well = screen.getByTestId("empty-icon").parentElement as HTMLElement;
80
+ expect(radiusAtoms(well)).toEqual([
81
+ "_bblr-t-radius-0",
82
+ "_bbrr-t-radius-0",
83
+ "_btlr-t-radius-0",
84
+ "_btrr-t-radius-0",
85
+ ]);
86
+ });
87
+ });
@@ -9,7 +9,6 @@
9
9
  */
10
10
  import {
11
11
  Intent,
12
- radiusClassProps,
13
12
  readingWidthStyle,
14
13
  useResolvedKnobs,
15
14
  warnBannedErrorWords,
@@ -69,18 +68,23 @@ export function EmptyState({
69
68
  warnBannedErrorWords(description, { component: "EmptyState" });
70
69
  }
71
70
 
71
+ const {
72
+ borderColor: _wellEdgeColor,
73
+ borderWidth: _wellEdgeWidth,
74
+ ...wellRadius
75
+ } = knobProps.borderRadius;
76
+
72
77
  const well = icon ? (
73
78
  <YStack
74
79
  alignItems="center"
75
80
  justifyContent="center"
76
81
  backgroundColor={componentColors.interactive.background}
77
- // R-PILL icon well: always a circle; its inset scales with the
78
- // size knob (spec: empty icon well consumes sizeToken). Declared so
79
- // the `radius:none` sweep licenses the circle instead of guessing
80
- // from its geometry (D-09 / LC-60).
81
- {...radiusClassProps("R-PILL", "empty icon well")}
82
+ // R2e: an icon well rides the radius scale (DEFAULT), the same
83
+ // resolution KPICard's well takes. Only the radius half of the
84
+ // fragment applies — the well paints no edge. Its inset still scales
85
+ // with the size knob (spec: empty icon well consumes sizeToken).
86
+ {...wellRadius}
82
87
  padding={knobProps.sizeToken as any}
83
- borderRadius={1000}
84
88
  aria-hidden
85
89
  {...(!isWeb ? { accessibilityElementsHidden: true } : null)}
86
90
  >
@@ -1,7 +1,7 @@
1
1
  import type { Meta, StoryObj } from "@storybook/react-native-web-vite";
2
2
  import { Input } from "@multiplatform.one/forms";
3
3
  import { Paragraph, YStack } from "tamagui";
4
- import { componentColors } from "../../componentColors";
4
+ import { Text } from "../../Text";
5
5
  import { KeyboardAvoidingWrapper } from "./index";
6
6
 
7
7
  const meta: Meta<typeof KeyboardAvoidingWrapper> = {
@@ -27,10 +27,10 @@ export const Default: Story = {
27
27
  <KeyboardAvoidingWrapper>
28
28
  <YStack>
29
29
  <Paragraph>Content inside KeyboardAvoidingWrapper</Paragraph>
30
- <Paragraph color={componentColors.text.muted}>
30
+ <Text>
31
31
  On native, this shifts content when the keyboard appears. On web, it is a simple
32
32
  passthrough wrapper.
33
- </Paragraph>
33
+ </Text>
34
34
  <Input label="Test input" placeholder="Focus to test keyboard avoidance" />
35
35
  </YStack>
36
36
  </KeyboardAvoidingWrapper>
@@ -8,6 +8,7 @@ import {
8
8
  } from "@multiplatform.one/theme";
9
9
  import type { ReactNode } from "react";
10
10
  import { Paragraph, Text, YStack } from "tamagui";
11
+ import { Text as HouseText } from "../Text";
11
12
  import { componentColors } from "../componentColors";
12
13
  import {
13
14
  FeedLayout,
@@ -43,11 +44,7 @@ function PaneFill({ label, hint, muted }: { label: string; hint?: string; muted?
43
44
  gap="$2"
44
45
  >
45
46
  <Paragraph fontWeight="600">{label}</Paragraph>
46
- {hint ? (
47
- <Text color={componentColors.text.muted} fontSize="$2">
48
- {hint}
49
- </Text>
50
- ) : null}
47
+ {hint ? <HouseText fontSize="$2">{hint}</HouseText> : null}
51
48
  </YStack>
52
49
  );
53
50
  }
@@ -274,9 +271,7 @@ export const ProseReadingWidth: StoryObj<typeof ReadingWidth> = {
274
271
  </Paragraph>
275
272
  </ReadingWidth>
276
273
  <ReadingWidth measure="none">
277
- <Paragraph color={componentColors.text.muted}>
278
- Ejected measure (full width of parent).
279
- </Paragraph>
274
+ <HouseText>Ejected measure (full width of parent).</HouseText>
280
275
  </ReadingWidth>
281
276
  </YStack>
282
277
  ),
@@ -1,6 +1,6 @@
1
1
  import type { Meta, StoryObj } from "@storybook/react-native-web-vite";
2
2
  import { Paragraph, YStack } from "tamagui";
3
- import { componentColors } from "../../componentColors";
3
+ import { Text } from "../../Text";
4
4
  import { SafeAreaWrapper } from "./index";
5
5
 
6
6
  const meta: Meta<typeof SafeAreaWrapper> = {
@@ -26,10 +26,10 @@ export const Default: Story = {
26
26
  <SafeAreaWrapper>
27
27
  <YStack>
28
28
  <Paragraph>Content inside SafeAreaWrapper</Paragraph>
29
- <Paragraph color={componentColors.text.muted}>
29
+ <Text>
30
30
  On native, this respects device safe area insets. On web, it is a simple passthrough
31
31
  wrapper.
32
- </Paragraph>
32
+ </Text>
33
33
  </YStack>
34
34
  </SafeAreaWrapper>
35
35
  ),
@@ -454,7 +454,7 @@ function AttachmentRow({
454
454
  {attachment.fileName}
455
455
  </Text>
456
456
  <XStack gap="$2" alignItems="center">
457
- <Text fontSize="$2" color={componentColors.text.muted}>
457
+ <Text fontSize="$2" color={knobProps.textAccentColor}>
458
458
  {attachment.formattedSize || formatFileSize(attachment.fileSize)}
459
459
  </Text>
460
460
  {ext ? (
@@ -627,7 +627,7 @@ export function Attachments({
627
627
  {...dropHandlers}
628
628
  >
629
629
  <PaperclipIcon size={compact ? 20 : 28} />
630
- <Text color={componentColors.text.muted} fontSize={compact ? "$2" : "$3"} marginTop="$2">
630
+ <Text color={knobProps.textAccentColor} fontSize={compact ? "$2" : "$3"} marginTop="$2">
631
631
  {noAttachmentsLabel}
632
632
  </Text>
633
633
  </YStack>
@@ -657,7 +657,7 @@ export function Attachments({
657
657
  {label}
658
658
  {/* Count hides on error so the badge can't lie (DG-ST-04) */}
659
659
  {maxAttachments > 0 && !hasError && (
660
- <Text color={componentColors.text.muted} fontSize="$2">
660
+ <Text color={knobProps.textAccentColor} fontSize="$2">
661
661
  {" "}
662
662
  ({items.length}/{maxAttachments})
663
663
  </Text>
@@ -766,7 +766,7 @@ export function Attachments({
766
766
  ) : previewFile ? (
767
767
  <YStack alignItems="center" {...knobProps.gap} paddingVertical="$4">
768
768
  {getFileIcon(previewFile, 40)}
769
- <Text color={componentColors.text.muted} textAlign="center">
769
+ <Text color={knobProps.textAccentColor} textAlign="center">
770
770
  {previewUnavailableLabel}
771
771
  </Text>
772
772
  </YStack>
@@ -23,7 +23,6 @@ import {
23
23
  import React, { useMemo, useState } from "react";
24
24
  import { useTranslation } from "react-i18next";
25
25
  import { Anchor, Text, XStack, isWeb } from "tamagui";
26
- import { componentColors } from "../componentColors";
27
26
  import { withInterp } from "../shared/t";
28
27
 
29
28
  /** Approx medium body line box before press-target padding (DG-LAY-04). */
@@ -240,7 +239,7 @@ export function Breadcrumbs({ items, onNavigate, label, maxVisible }: Breadcrumb
240
239
  ) : (
241
240
  <Text
242
241
  {...knobProps.body}
243
- color={componentColors.text.muted}
242
+ color={knobProps.textAccentColor}
244
243
  fontSize={textSize}
245
244
  fontWeight="400"
246
245
  {...(slot.isCurrent ? { "aria-current": "page" as const } : null)}
@@ -298,7 +298,7 @@ export function PageHeader({
298
298
  {titleNode}
299
299
  {subtitle ? (
300
300
  // T-HELPER on the shared body fragment — not a local size map.
301
- <Paragraph margin={0} {...knobProps.body} color={componentColors.text.muted}>
301
+ <Paragraph margin={0} {...knobProps.body} color={knobProps.textAccentColor}>
302
302
  {subtitle}
303
303
  </Paragraph>
304
304
  ) : null}
@@ -404,7 +404,7 @@ export function PageSection({
404
404
  <YStack gap="$2">
405
405
  {headingNode}
406
406
  {description ? (
407
- <Paragraph margin={0} {...knobProps.body} color={componentColors.text.muted}>
407
+ <Paragraph margin={0} {...knobProps.body} color={knobProps.textAccentColor}>
408
408
  {description}
409
409
  </Paragraph>
410
410
  ) : null}
@@ -103,7 +103,7 @@ export function Sidebar({
103
103
  fontSize="$2"
104
104
  fontWeight="400"
105
105
  textTransform="uppercase"
106
- color={componentColors.text.muted}
106
+ color={knobProps.textAccentColor}
107
107
  // Align with row text (LC-02): the inset rides as MARGIN so
108
108
  // the caption's box starts at the shared row text edge —
109
109
  // padding-based insets left the box at the panel edge, which
@@ -125,7 +125,7 @@ export function Sidebar({
125
125
  const corners = stackRadiusProps(position, knobProps.borderRadius.borderRadius);
126
126
  const itemKey = `${sectionIdx}:${String(item.value ?? item.label)}`;
127
127
  const ink = item.active && onAccent ? onAccent : componentColors.text.primary;
128
- const metaInk = item.active && onAccent ? onAccent : componentColors.text.muted;
128
+ const metaInk = item.active && onAccent ? onAccent : knobProps.textAccentColor;
129
129
  const kbFocused = kbFocusKey === itemKey;
130
130
  const pressable = Boolean(item.onPress);
131
131
  const kbRing = kbFocused
@@ -10,6 +10,7 @@
10
10
  // asserts on the atomic classes (same approach as timeline-radius.spec.tsx).
11
11
  import { cleanup, fireEvent, screen, waitFor } from "@testing-library/react";
12
12
  import { renderWithProviders } from "@multiplatform.one/test-utils";
13
+ import { Preset } from "@multiplatform.one/theme";
13
14
  import * as React from "react";
14
15
  import { afterEach, describe, expect, it, vi } from "vitest";
15
16
  import { Tags } from "./tags";
@@ -72,6 +73,37 @@ describe("Tags Add Tag trigger (chip-scale)", () => {
72
73
  expect(classesByPrefix(pill, borderPrefixes).length).toBeGreaterThan(0);
73
74
  });
74
75
 
76
+ /**
77
+ * DG-BOR-01 (MPO-106 D3): the RESOLVER owns the outlined hairline floor —
78
+ * `outlined` + `none` draws the enumerated `small` stop, 0.5 — and a
79
+ * component adds no second `Math.max(..., 1)` on top. A local floor made
80
+ * `small` measure the same as `medium` here and nowhere else, so the Tags
81
+ * row was the one outlined control the borderWidth knob could not thin.
82
+ */
83
+ it.each([
84
+ ["none", "0--5px"],
85
+ ["small", "0--5px"],
86
+ ["medium", "1px"],
87
+ ["large", "2px"],
88
+ ] as const)(
89
+ "outlined borderWidth %s resolves to %s, floored only by the resolver",
90
+ (borderWidth, px) => {
91
+ renderWithProviders(
92
+ <Preset overrides={{ borderWidth, fillStyle: "outlined" }}>
93
+ <Tags tags={tags} onAdd={vi.fn()} onRemove={vi.fn()} />
94
+ </Preset>,
95
+ );
96
+ const pill = triggerPillOf(screen.getByLabelText("Add Tag"));
97
+ const chip = chipFrameOf(screen.getByText("urgent"));
98
+ const edges = ["_btw-", "_bbw-", "_blw-", "_brw-"];
99
+ const expected = edges.map((edge) => `${edge}${px}`).sort();
100
+ expect(classesByPrefix(pill, edges)).toEqual(expected);
101
+ // The trigger and the chips it sits beside share one box at every stop;
102
+ // a floor on only one of them is what pulled their heights apart.
103
+ expect(classesByPrefix(chip, edges)).toEqual(expected);
104
+ },
105
+ );
106
+
75
107
  it("trigger wrapper carries the D-02 44px press-floor (minHeight class)", () => {
76
108
  renderTags();
77
109
  const trigger = screen.getByLabelText("Add Tag");
@@ -20,6 +20,7 @@ import {
20
20
  XStack,
21
21
  YStack,
22
22
  isWeb,
23
+ type InputProps,
23
24
  type YStackProps,
24
25
  } from "tamagui";
25
26
  import {
@@ -331,7 +332,7 @@ export function Tags({
331
332
  ) : (
332
333
  <XStack alignItems="center" gap="$2" opacity={0.5}>
333
334
  <TagIcon size={compact ? 14 : 16} />
334
- <Text color={componentColors.text.muted} fontSize={compact ? "$1" : "$2"} {...knobProps.body}>
335
+ <Text color={knobProps.textAccentColor} fontSize={compact ? "$1" : "$2"} {...knobProps.body}>
335
336
  {noTagsLabel}
336
337
  </Text>
337
338
  </XStack>
@@ -473,7 +474,7 @@ export function Tags({
473
474
  {suggestionOptions.length > 0 && (
474
475
  <Text
475
476
  fontSize="$1"
476
- color={componentColors.text.muted}
477
+ color={knobProps.textAccentColor}
477
478
  paddingHorizontal="$3"
478
479
  paddingVertical="$1.5"
479
480
  >
@@ -484,7 +485,7 @@ export function Tags({
484
485
  {showEmptyMessage && (
485
486
  <Text
486
487
  fontSize="$2"
487
- color={componentColors.text.muted}
488
+ color={knobProps.textAccentColor}
488
489
  textAlign="center"
489
490
  padding="$3"
490
491
  {...knobProps.body}
@@ -580,9 +581,6 @@ export function Tags({
580
581
  variant="outline"
581
582
  backgroundColor="transparent"
582
583
  {...knobProps.borderRadius}
583
- // Same border width the Chip paints for every tone, so the
584
- // trigger's box matches the tag chips it sits beside.
585
- borderWidth={Math.max(knobProps.borderRadius.borderWidth, 1)}
586
584
  borderColor={componentColors.interactive.border}
587
585
  gap={compact ? 0 : "$1"}
588
586
  hoverStyle={{ backgroundColor: componentColors.interactive.hover }}
@@ -590,7 +588,7 @@ export function Tags({
590
588
  {...(addKbFocus ? ensureFocusVisibleRing() : { outlineWidth: 0 })}
591
589
  >
592
590
  <PlusIcon size={chipIconSize(chipSize)} />
593
- <ChipText size={chipSize} color={componentColors.text.secondary}>
591
+ <ChipText size={chipSize} color={knobProps.textAccentColor}>
594
592
  {compact ? "\u200B" : addTagLabel}
595
593
  </ChipText>
596
594
  </ChipFrame>
@@ -625,7 +623,7 @@ export function Tags({
625
623
  // sat off the chips' optical line.
626
624
  fontSize={chipTextSize(chipSize)}
627
625
  color={componentColors.text.primary}
628
- placeholderTextColor={componentColors.text.muted}
626
+ placeholderTextColor={knobProps.textAccentColor as InputProps["placeholderTextColor"]}
629
627
  autoComplete="off"
630
628
  role="combobox"
631
629
  aria-autocomplete="list"
@@ -644,7 +642,7 @@ export function Tags({
644
642
  <Label {...knobProps.label} fontWeight="400">
645
643
  {label}
646
644
  {maxTags > 0 && (
647
- <Text color={componentColors.text.muted} fontSize="$2">
645
+ <Text color={knobProps.textAccentColor} fontSize="$2">
648
646
  {" "}
649
647
  ({tags.length}/{maxTags})
650
648
  </Text>