@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
@@ -578,7 +578,7 @@ export function Timeline({
578
578
  opacity={0.5}
579
579
  >
580
580
  <ClockIcon size={emptyIconSize} />
581
- <Text color={componentColors.text.muted} fontSize={compact ? "$2" : sz} marginTop="$2">
581
+ <Text color={knobProps.textAccentColor} fontSize={compact ? "$2" : sz} marginTop="$2">
582
582
  {noActivityLabel}
583
583
  </Text>
584
584
  </YStack>
@@ -626,7 +626,7 @@ export function Timeline({
626
626
  <YStack gap="$1" marginTop="$1">
627
627
  {changes.slice(0, 5).map((change) => (
628
628
  <XStack key={change.field} gap="$2" flexWrap="wrap">
629
- <Text fontSize="$1" color={componentColors.text.muted} fontWeight="400">
629
+ <Text fontSize="$1" color={knobProps.textAccentColor} fontWeight="400">
630
630
  {change.fieldLabel || change.field}:
631
631
  </Text>
632
632
  {change.old !== undefined && (
@@ -639,7 +639,7 @@ export function Timeline({
639
639
  </Text>
640
640
  )}
641
641
  {change.old !== undefined && change.new !== undefined && (
642
- <Text fontSize="$1" color={componentColors.text.muted}>
642
+ <Text fontSize="$1" color={knobProps.textAccentColor}>
643
643
  {"→"}
644
644
  </Text>
645
645
  )}
@@ -651,7 +651,7 @@ export function Timeline({
651
651
  </XStack>
652
652
  ))}
653
653
  {changes.length > 5 && (
654
- <Text fontSize="$1" color={componentColors.text.muted} fontStyle="italic">
654
+ <Text fontSize="$1" color={knobProps.textAccentColor} fontStyle="italic">
655
655
  +{changes.length - 5} more changes
656
656
  </Text>
657
657
  )}
@@ -996,7 +996,7 @@ export function Timeline({
996
996
  {/* Entry count hides on error so the badge can't lie (DG-ST-04).
997
997
  Bidi-isolated so RTL contexts keep "7 entries" in one run. */}
998
998
  {entries.length > 0 && !hasError && (
999
- <Text fontSize="$2" color={componentColors.text.muted}>
999
+ <Text fontSize="$2" color={knobProps.textAccentColor}>
1000
1000
  {bidiIsolate(`${entries.length} ${entries.length === 1 ? entryLabel : entriesLabel}`)}
1001
1001
  </Text>
1002
1002
  )}
@@ -1,10 +1,19 @@
1
1
  import { renderWithProviders } from "@multiplatform.one/test-utils";
2
- import { Preset } from "@multiplatform.one/theme";
3
- import { cleanup } from "@testing-library/react";
2
+ import { Preset, type Knobs } from "@multiplatform.one/theme";
3
+ import { defaultConfig } from "@tamagui/config/v5";
4
+ import { cleanup, render } from "@testing-library/react";
4
5
  import { readFileSync } from "node:fs";
5
6
  import { dirname, join } from "node:path";
6
7
  import { fileURLToPath } from "node:url";
7
- import { Card as TamaguiCard, Dialog, Popover, Sheet } from "tamagui";
8
+ import {
9
+ AlertDialog,
10
+ Card as TamaguiCard,
11
+ createTamagui,
12
+ Dialog,
13
+ Popover,
14
+ Sheet,
15
+ TamaguiProvider,
16
+ } from "tamagui";
8
17
  import { afterEach, describe, expect, it } from "vitest";
9
18
  import { Button } from "./Button";
10
19
  import * as pkg from "./index";
@@ -183,3 +192,88 @@ describe("DialogContent paints the OVERLAY elevation stop, not the control one (
183
192
  );
184
193
  });
185
194
  });
195
+
196
+ // ── Overlay child-clip cap (MPO-150) ─────────────────────────────────────
197
+ //
198
+ // Axiom 1 CLIP files "children positioned toward the corners (Card, Panel,
199
+ // Dialog)" under R-SCALE + clip cap: radius rides the scale, capped by the
200
+ // container's own padding. R-SCALE is the immunity axis, CONTAINER-CAP the
201
+ // resolution axis (Part 2 § Radius) — the Part 3 row naming only R-SCALE is
202
+ // not a second ruling. `elevatedSurface` carries the UNCAPPED scale token,
203
+ // so each padded overlay must spread `containerRadius` AFTER it; four did
204
+ // and PopoverContent did not, rendering a 50px corner on an 18px inset.
205
+
206
+ const overlayCapConfig = createTamagui(defaultConfig);
207
+
208
+ const overlayCapCorners = [
209
+ "borderTopLeftRadius",
210
+ "borderTopRightRadius",
211
+ "borderBottomRightRadius",
212
+ "borderBottomLeftRadius",
213
+ ] as const;
214
+
215
+ describe("overlay containers take the Axiom 1 child-clip cap (MPO-150)", () => {
216
+ afterEach(cleanup);
217
+
218
+ it("PopoverContent spreads containerRadius after elevatedSurface, as its four siblings do", () => {
219
+ const src = readFileSync(join(dirname(fileURLToPath(import.meta.url)), "surfaces.tsx"), "utf8");
220
+ const popover = src.slice(src.indexOf("// ── PopoverContent"), src.indexOf("// ── SheetFrame"));
221
+ const elevated = popover.indexOf("knobProps.elevatedSurface");
222
+ const capped = popover.indexOf("knobProps.containerRadius");
223
+ expect(elevated, "PopoverContent binds elevatedSurface").toBeGreaterThan(-1);
224
+ expect(capped, "PopoverContent binds containerRadius").toBeGreaterThan(-1);
225
+ expect(capped, "the cap must spread AFTER the uncapped scale token").toBeGreaterThan(elevated);
226
+ });
227
+
228
+ for (const [borderRadius, stop] of Object.entries({ medium: 9, large: 16, full: 50 })) {
229
+ for (const [space, inset] of Object.entries({ small: 13, medium: 18, large: 32 })) {
230
+ const capped = Math.min(stop, inset);
231
+ it(`caps every overlay frame at ${capped}px for borderRadius=${borderRadius}/space=${space}`, () => {
232
+ render(
233
+ <TamaguiProvider config={overlayCapConfig} defaultTheme="light">
234
+ <Preset
235
+ overrides={{
236
+ borderRadius: borderRadius as Knobs["borderRadius"],
237
+ space: space as Knobs["space"],
238
+ density: "comfortable",
239
+ }}
240
+ >
241
+ <Dialog modal open>
242
+ <Dialog.Portal>
243
+ <DialogContent testID="cap-dialog">dialog</DialogContent>
244
+ </Dialog.Portal>
245
+ </Dialog>
246
+ <AlertDialog modal open>
247
+ <AlertDialog.Portal>
248
+ <AlertDialogContent testID="cap-alertdialog">alert</AlertDialogContent>
249
+ </AlertDialog.Portal>
250
+ </AlertDialog>
251
+ <Popover open>
252
+ <PopoverContent testID="cap-popover">popover</PopoverContent>
253
+ </Popover>
254
+ <Sheet open>
255
+ <SheetFrame testID="cap-sheet">sheet</SheetFrame>
256
+ </Sheet>
257
+ <Panel testID="cap-panel">panel</Panel>
258
+ </Preset>
259
+ </TamaguiProvider>,
260
+ );
261
+
262
+ for (const id of [
263
+ "cap-dialog",
264
+ "cap-alertdialog",
265
+ "cap-popover",
266
+ "cap-sheet",
267
+ "cap-panel",
268
+ ]) {
269
+ const frame = document.querySelector(`[data-testid="${id}"]`);
270
+ expect(frame, `${id} frame`).toBeTruthy();
271
+ const style = getComputedStyle(frame as Element);
272
+ for (const corner of overlayCapCorners) {
273
+ expect(style[corner], `${id} ${corner}`).toBe(`${capped}px`);
274
+ }
275
+ }
276
+ });
277
+ }
278
+ }
279
+ });
package/src/surfaces.tsx CHANGED
@@ -267,8 +267,9 @@ export const AlertDialogOverlay = forwardRef<
267
267
  // content, start-aligned to their anchor with the shared gap (the caller's
268
268
  // tamagui <Popover offset={OVERLAY_ANCHOR_GAP}>), flipping/shifting at
269
269
  // viewport edges. This frame is the overlay's single surface owner —
270
- // border + radius come only from the elevatedSurface recipe here; children
271
- // must not draw their own outer border.
270
+ // border comes from the elevatedSurface recipe and radius from the
271
+ // containerRadius cap spread over it; children must not draw their own
272
+ // outer border.
272
273
 
273
274
  export const PopoverContent = forwardRef<TamaguiElement, ViewProps & { children?: ReactNode }>(
274
275
  function PopoverContent({ children, ...props }, ref) {
@@ -277,6 +278,7 @@ export const PopoverContent = forwardRef<TamaguiElement, ViewProps & { children?
277
278
  <Popover.Content
278
279
  ref={ref}
279
280
  {...knobProps.elevatedSurface}
281
+ {...knobProps.containerRadius}
280
282
  transition={knobProps.transition}
281
283
  enterStyle={overlayEnterExit}
282
284
  exitStyle={overlayEnterExit}
@@ -0,0 +1,187 @@
1
+ /**
2
+ * MPO-154 — `textAccent` reaches SECONDARY text, not just body text.
3
+ *
4
+ * The `secondary` / `muted` keys on componentColors' text table were a static
5
+ * `$color11` read straight into the `color` prop, so every helper, caption and
6
+ * inactive label rendered the same ink at `low`, `medium` and `high`. The resolver
7
+ * already answers this: `knobProps.textAccentColor` is `$color11` at the two
8
+ * dim stops (the AA legibility floor) and `$color` at `high`.
9
+ *
10
+ * Measurement follows the Text.spec.tsx discipline: read the TEXT NODE's
11
+ * `_col-` atomic class, compare between knob stops by identity, never against
12
+ * a hashed literal. Meter publishes its resolved value ink on
13
+ * `data-meter-value-color`, so that surface asserts the token directly.
14
+ *
15
+ * Both schemes are covered because `textAccent` is scheme-independent by
16
+ * construction — the tokens are theme-relative — and a regression that
17
+ * re-pins one scheme would show up here.
18
+ */
19
+ import { cleanup, screen } from "@testing-library/react";
20
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
21
+ import { Preset } from "@multiplatform.one/theme";
22
+ import type { ReactElement } from "react";
23
+ import { Theme } from "tamagui";
24
+ import { afterEach, describe, expect, it } from "vitest";
25
+ import { Accordion } from "./Accordion";
26
+ import { componentColors } from "./componentColors";
27
+ import { Meter } from "./Meter";
28
+ import { Quote } from "./Quote";
29
+ import { Tabs } from "./Tabs";
30
+
31
+ afterEach(cleanup);
32
+
33
+ type Accent = "low" | "medium" | "high";
34
+ type Scheme = "light" | "dark";
35
+
36
+ function inScheme(scheme: Scheme, node: ReactElement): ReactElement {
37
+ return scheme === "dark" ? <Theme name="dark">{node}</Theme> : node;
38
+ }
39
+
40
+ /** The TEXT NODE's colour atom, by identity — hashed names never asserted. */
41
+ function inkAtoms(el: Element): string[] {
42
+ return String((el as HTMLElement).className || "")
43
+ .split(" ")
44
+ .filter((c) => c.startsWith("_col-"))
45
+ .sort();
46
+ }
47
+
48
+ function inkOf(scheme: Scheme, accent: Accent, label: string, node: ReactElement): string[] {
49
+ renderWithProviders(inScheme(scheme, <Preset overrides={{ textAccent: accent }}>{node}</Preset>));
50
+ const atoms = inkAtoms(screen.getByText(label));
51
+ cleanup();
52
+ return atoms;
53
+ }
54
+
55
+ const schemes: Scheme[] = ["light", "dark"];
56
+
57
+ describe("Tabs — textAccent reaches the inactive tab label (MPO-154)", () => {
58
+ const items = [
59
+ { value: "address", label: "Address & Contact", content: <>address panel</> },
60
+ { value: "settings", label: "Settings", content: <>settings panel</> },
61
+ ];
62
+ const tabs = <Tabs items={items} defaultValue="address" />;
63
+
64
+ for (const scheme of schemes) {
65
+ it(`${scheme}: the inactive label moves between low and high`, () => {
66
+ const low = inkOf(scheme, "low", "Settings", tabs);
67
+ const high = inkOf(scheme, "high", "Settings", tabs);
68
+ expect(low).not.toHaveLength(0);
69
+ expect(high).not.toHaveLength(0);
70
+ expect(high).not.toEqual(low);
71
+ });
72
+
73
+ it(`${scheme}: the inactive label keeps the AA floor at low and medium`, () => {
74
+ expect(inkOf(scheme, "low", "Settings", tabs)).toEqual(
75
+ inkOf(scheme, "medium", "Settings", tabs),
76
+ );
77
+ });
78
+ }
79
+ });
80
+
81
+ describe("Accordion — textAccent reaches the section description (MPO-154)", () => {
82
+ const description = "Where should we deliver the order?";
83
+ const accordion = (
84
+ <Accordion defaultValue="shipping">
85
+ <Accordion.Item value="shipping">
86
+ <Accordion.Trigger description={description}>Shipping details</Accordion.Trigger>
87
+ <Accordion.Content>ship</Accordion.Content>
88
+ </Accordion.Item>
89
+ </Accordion>
90
+ );
91
+
92
+ for (const scheme of schemes) {
93
+ it(`${scheme}: the description moves between low and high`, () => {
94
+ const low = inkOf(scheme, "low", description, accordion);
95
+ const high = inkOf(scheme, "high", description, accordion);
96
+ expect(low).not.toHaveLength(0);
97
+ expect(high).not.toHaveLength(0);
98
+ expect(high).not.toEqual(low);
99
+ });
100
+
101
+ it(`${scheme}: the description keeps the AA floor at low and medium`, () => {
102
+ expect(inkOf(scheme, "low", description, accordion)).toEqual(
103
+ inkOf(scheme, "medium", description, accordion),
104
+ );
105
+ });
106
+ }
107
+ });
108
+
109
+ describe("Quote — textAccent reaches the attribution (MPO-154)", () => {
110
+ const quote = <Quote cite="Alan Kay">The best way to predict the future.</Quote>;
111
+
112
+ // The attribution renders as `<cite>— {name}</cite>`, two text runs in one
113
+ // node, so getByText cannot reach it. Read the cite element itself.
114
+ function citeInk(scheme: Scheme, accent: Accent): string[] {
115
+ const { container } = renderWithProviders(
116
+ inScheme(scheme, <Preset overrides={{ textAccent: accent }}>{quote}</Preset>),
117
+ );
118
+ const cite = container.querySelector("cite");
119
+ expect(cite?.textContent).toContain("Alan Kay");
120
+ const atoms = inkAtoms(cite as Element);
121
+ cleanup();
122
+ return atoms;
123
+ }
124
+
125
+ for (const scheme of schemes) {
126
+ it(`${scheme}: the attribution moves between low and high`, () => {
127
+ const low = citeInk(scheme, "low");
128
+ const high = citeInk(scheme, "high");
129
+ expect(low).not.toHaveLength(0);
130
+ expect(high).not.toHaveLength(0);
131
+ expect(high).not.toEqual(low);
132
+ });
133
+
134
+ it(`${scheme}: the attribution keeps the AA floor at low and medium`, () => {
135
+ expect(citeInk(scheme, "low")).toEqual(citeInk(scheme, "medium"));
136
+ });
137
+ }
138
+ });
139
+
140
+ describe("Meter — textAccent reaches the ok-zone value readout (MPO-154)", () => {
141
+ const meter = <Meter label="Disk usage" value={6.2} min={0} max={8} unit="GB" />;
142
+
143
+ function valueInk(scheme: Scheme, accent: Accent): string | null {
144
+ const { container } = renderWithProviders(
145
+ inScheme(scheme, <Preset overrides={{ textAccent: accent }}>{meter}</Preset>),
146
+ );
147
+ const token = container
148
+ .querySelector("[data-meter-value]")
149
+ ?.getAttribute("data-meter-value-color");
150
+ cleanup();
151
+ return token ?? null;
152
+ }
153
+
154
+ for (const scheme of schemes) {
155
+ it(`${scheme}: the ok value readout rides the resolver, not a static $color11`, () => {
156
+ expect(valueInk(scheme, "low")).toBe("$color11");
157
+ expect(valueInk(scheme, "medium")).toBe("$color11");
158
+ expect(valueInk(scheme, "high")).toBe("$color");
159
+ });
160
+ }
161
+
162
+ it("a verdict zone keeps its semantic ink at every stop", () => {
163
+ const warned = (accent: Accent) => {
164
+ const { container } = renderWithProviders(
165
+ <Preset overrides={{ textAccent: accent }}>
166
+ <Meter label="Disk usage" value={7.5} min={0} max={8} low={2} high={6} unit="GB" />
167
+ </Preset>,
168
+ );
169
+ const token = container
170
+ .querySelector("[data-meter-value]")
171
+ ?.getAttribute("data-meter-value-color");
172
+ cleanup();
173
+ return token;
174
+ };
175
+ expect(warned("low")).toBe("$orange11");
176
+ expect(warned("high")).toBe("$orange11");
177
+ });
178
+ });
179
+
180
+ describe("componentColors keeps no second answer for secondary ink (MPO-154)", () => {
181
+ it("the text table exposes no static secondary or muted step", () => {
182
+ const text = componentColors.text as Record<string, string | undefined>;
183
+ expect(text.secondary).toBeUndefined();
184
+ expect(text.muted).toBeUndefined();
185
+ expect(text.primary).toBe("$color");
186
+ });
187
+ });
@@ -434,6 +434,7 @@ function DayNumberDisc({
434
434
  nestedBox: NestedControlBox;
435
435
  label: NestedLabel;
436
436
  }) {
437
+ const { knobProps } = useResolvedKnobs();
437
438
  return (
438
439
  <YStack
439
440
  {...nestedBox}
@@ -455,7 +456,7 @@ function DayNumberDisc({
455
456
  {...label}
456
457
  fontWeight={today ? "700" : label.fontWeight}
457
458
  color={
458
- today ? (onAccent ?? "$accentColor") : inMonth ? "$color" : componentColors.text.muted
459
+ today ? (onAccent ?? "$accentColor") : inMonth ? "$color" : knobProps.textAccentColor
459
460
  }
460
461
  textAlign="center"
461
462
  >
@@ -1731,7 +1732,7 @@ export function Calendar({
1731
1732
  role="columnheader"
1732
1733
  {...{ backgroundColor: componentColors.surface.background }}
1733
1734
  >
1734
- <Text {...nestedKnobs.label} fontWeight="500" color={componentColors.text.muted}>
1735
+ <Text {...nestedKnobs.label} fontWeight="500" color={knobProps.textAccentColor}>
1735
1736
  {day}
1736
1737
  </Text>
1737
1738
  </YStack>
@@ -1851,7 +1852,7 @@ export function Calendar({
1851
1852
  hoverStyle={{ opacity: 0.7 }}
1852
1853
  {...{ "data-calendar-overflow": String(hiddenCount) }}
1853
1854
  >
1854
- <Text fontSize="$1" color={componentColors.text.muted}>
1855
+ <Text fontSize="$1" color={knobProps.textAccentColor}>
1855
1856
  {withInterp(t("+{{count}} more"), { count: hiddenCount })}
1856
1857
  </Text>
1857
1858
  </XStack>
@@ -2073,7 +2074,7 @@ export function Calendar({
2073
2074
  onDateSelect?.(day);
2074
2075
  }}
2075
2076
  >
2076
- <Text {...nestedKnobs.label} fontWeight="500" color={componentColors.text.muted}>
2077
+ <Text {...nestedKnobs.label} fontWeight="500" color={knobProps.textAccentColor}>
2077
2078
  {weekdayNames[day.getDay()]}
2078
2079
  </Text>
2079
2080
  <DayNumberDisc
@@ -2094,7 +2095,7 @@ export function Calendar({
2094
2095
  {/* All-day / untimed strip (also the day-granularity drop row) */}
2095
2096
  <XStack {...hairline.bottom} borderColor="$borderColor" minHeight={MIN_PRESS_TARGET}>
2096
2097
  <YStack width={56} justifyContent="center" alignItems="flex-end" paddingInlineEnd="$2">
2097
- <Text fontSize="$1" color={componentColors.text.muted}>
2098
+ <Text fontSize="$1" color={knobProps.textAccentColor}>
2098
2099
  {t("All day")}
2099
2100
  </Text>
2100
2101
  </YStack>
@@ -2135,7 +2136,7 @@ export function Calendar({
2135
2136
  <YStack width={56}>
2136
2137
  {hours.map((hour) => (
2137
2138
  <YStack key={hour} height={hourHeight} alignItems="flex-end" paddingInlineEnd="$2">
2138
- <Text fontSize="$1" color={componentColors.text.muted}>
2139
+ <Text fontSize="$1" color={knobProps.textAccentColor}>
2139
2140
  {formatHour(hour)}
2140
2141
  </Text>
2141
2142
  </YStack>
@@ -2305,13 +2306,13 @@ export function Calendar({
2305
2306
  onChangeText={setDraftTitle}
2306
2307
  inputProps={{ autoFocus: true } as any}
2307
2308
  />
2308
- <Text fontSize="$2" color={componentColors.text.muted}>
2309
+ <Text fontSize="$2" color={knobProps.textAccentColor}>
2309
2310
  {`${formatDayLong(editorHere.start)}, ${formatTimeRangeLabel(
2310
2311
  editorHere.start,
2311
2312
  editorHere.end,
2312
2313
  )}`}
2313
2314
  </Text>
2314
- <Text fontSize="$1" color={componentColors.text.muted}>
2315
+ <Text fontSize="$1" color={knobProps.textAccentColor}>
2315
2316
  {t("Changes apply when the editor closes")}
2316
2317
  </Text>
2317
2318
  </YStack>
@@ -326,15 +326,20 @@ export interface KPICardProps extends Omit<YStackProps, "children"> {
326
326
  * The one sentinel resolver for trend sentiment color (LC-36
327
327
  * TREND-SENTIMENT): color encodes sentiment — `trend × goodDirection` —
328
328
  * never direction alone. Undeclared or `"none"` sentiment renders the
329
- * neutral muted tier; a metric whose polarity the system doesn't know
330
- * must not wear a verdict color.
329
+ * neutral tier; a metric whose polarity the system doesn't know must not
330
+ * wear a verdict color.
331
+ *
332
+ * MPO-154: the neutral ink is passed in, not looked up. It is ordinary
333
+ * secondary text, so the caller hands over `knobProps.textAccentColor` —
334
+ * a static tier here could not see the `textAccent` knob.
331
335
  */
332
336
  export function resolveTrendColor(
333
337
  trend: TrendDirection | undefined,
334
338
  goodDirection: KPICardConfig["goodDirection"],
339
+ neutral: string,
335
340
  ): string {
336
- if (!trend || trend === "neutral") return componentColors.text.muted;
337
- if (!goodDirection || goodDirection === "none") return componentColors.text.muted;
341
+ if (!trend || trend === "neutral") return neutral;
342
+ if (!goodDirection || goodDirection === "none") return neutral;
338
343
  return trend === goodDirection
339
344
  ? componentColors.semantic.success
340
345
  : componentColors.semantic.error;
@@ -373,8 +378,8 @@ export function KPICard({ config, ...stackProps }: KPICardProps) {
373
378
  );
374
379
 
375
380
  const trendColor = useMemo(
376
- () => resolveTrendColor(config.trend, config.goodDirection),
377
- [config.trend, config.goodDirection],
381
+ () => resolveTrendColor(config.trend, config.goodDirection, knobProps.textAccentColor),
382
+ [config.trend, config.goodDirection, knobProps.textAccentColor],
378
383
  );
379
384
 
380
385
  const trendSymbol = useMemo(() => {
@@ -660,7 +665,7 @@ export function ShortcutCard({ config, ...stackProps }: ShortcutCardProps) {
660
665
  {...knobProps.borderRadius}
661
666
  data-nested-px={px}
662
667
  >
663
- <Text {...knobProps.label} color={componentColors.text.secondary}>
668
+ <Text {...knobProps.label} color={knobProps.textAccentColor}>
664
669
  {config.count}
665
670
  </Text>
666
671
  </XStack>
@@ -708,7 +713,7 @@ export function ListCard({ config, headingLevel = 2, ...stackProps }: ListCardPr
708
713
  {item.label}
709
714
  </Text>
710
715
  {item.meta ? (
711
- <Text {...knobProps.label} color={componentColors.text.muted}>
716
+ <Text {...knobProps.label} color={knobProps.textAccentColor}>
712
717
  {item.meta}
713
718
  </Text>
714
719
  ) : null}
@@ -1576,7 +1576,7 @@ export function GanttView({
1576
1576
  borderColor="$borderColor"
1577
1577
  {...{ backgroundColor: componentColors.surface.background }}
1578
1578
  >
1579
- <Text {...knobProps.label} color={componentColors.text.muted} numberOfLines={1}>
1579
+ <Text {...knobProps.label} color={knobProps.textAccentColor} numberOfLines={1}>
1580
1580
  {t("Task")}
1581
1581
  </Text>
1582
1582
  </XStack>
@@ -1631,7 +1631,7 @@ export function GanttView({
1631
1631
  top={2}
1632
1632
  width={Math.max(0, band.width - 8)}
1633
1633
  {...knobProps.label}
1634
- color={componentColors.text.secondary}
1634
+ color={knobProps.textAccentColor}
1635
1635
  numberOfLines={1}
1636
1636
  >
1637
1637
  {band.label}
@@ -1645,7 +1645,7 @@ export function GanttView({
1645
1645
  {...(rtl ? { right: tick.x + 4 } : { left: tick.x + 4 })}
1646
1646
  top={axisHeight / 2}
1647
1647
  {...knobProps.label}
1648
- color={tick.major ? componentColors.text.secondary : componentColors.text.muted}
1648
+ color={knobProps.textAccentColor}
1649
1649
  numberOfLines={1}
1650
1650
  >
1651
1651
  {formatDayOfMonth(tick.date)}
@@ -861,7 +861,7 @@ function KanbanColumnView<T>({
861
861
  <XStack alignItems="center" {...knobProps.gap}>
862
862
  {itemCount !== undefined && (
863
863
  <Text
864
- color={componentColors.text.muted}
864
+ color={knobProps.textAccentColor}
865
865
  {...knobProps.label}
866
866
  {...knobProps.textWeight}
867
867
  data-async-count
@@ -1004,7 +1004,7 @@ function KanbanColumnView<T>({
1004
1004
  justifyContent="center"
1005
1005
  >
1006
1006
  {column.items.length === 0 && (
1007
- <Text color={componentColors.text.muted} {...knobProps.label}>
1007
+ <Text color={knobProps.textAccentColor} {...knobProps.label}>
1008
1008
  {t("Drop here")}
1009
1009
  </Text>
1010
1010
  )}
@@ -1361,7 +1361,7 @@ function KanbanColumnView<T>({
1361
1361
  <XStack alignItems="center" {...knobProps.gap}>
1362
1362
  {itemCount !== undefined && (
1363
1363
  <Text
1364
- color={componentColors.text.muted}
1364
+ color={knobProps.textAccentColor}
1365
1365
  {...knobProps.label}
1366
1366
  {...knobProps.textWeight}
1367
1367
  data-async-count
@@ -1551,7 +1551,7 @@ function KanbanColumnView<T>({
1551
1551
  justifyContent="center"
1552
1552
  >
1553
1553
  {isEmpty && (
1554
- <Text color={componentColors.text.muted} {...knobProps.label}>
1554
+ <Text color={knobProps.textAccentColor} {...knobProps.label}>
1555
1555
  {t("Drop here")}
1556
1556
  </Text>
1557
1557
  )}
@@ -513,7 +513,7 @@ export function ReportBuilder({
513
513
  <SortIcon
514
514
  size={iconPx}
515
515
  weight="bold"
516
- color={active ? componentColors.text.primary : componentColors.text.muted}
516
+ color={active ? componentColors.text.primary : knobProps.textAccentColor}
517
517
  opacity={active ? 1 : 0.35}
518
518
  />
519
519
  </XStack>
@@ -634,7 +634,7 @@ export function ReportBuilder({
634
634
  <Text {...knobProps.label} color="$accentColor" numberOfLines={1}>
635
635
  {groupByCol?.label ?? groupBy.field}: {groupKey}
636
636
  </Text>
637
- <Text {...knobProps.label} color={componentColors.text.muted}>
637
+ <Text {...knobProps.label} color={knobProps.textAccentColor}>
638
638
  ({group.rows.length} {group.rows.length === 1 ? t("record") : t("records")})
639
639
  </Text>
640
640
  <XStack flex={1} />
@@ -902,7 +902,7 @@ export function ReportBuilder({
902
902
  {...knobProps.gapLg}
903
903
  flexWrap="wrap"
904
904
  >
905
- <Text {...knobProps.label} color={componentColors.text.muted}>
905
+ <Text {...knobProps.label} color={knobProps.textAccentColor}>
906
906
  {t("Totals")}
907
907
  </Text>
908
908
  {totals.map(({ col, value }) => (
@@ -912,7 +912,7 @@ export function ReportBuilder({
912
912
  </Text>
913
913
  ))}
914
914
  <XStack flex={1} />
915
- <Text {...knobProps.label} color={componentColors.text.muted}>
915
+ <Text {...knobProps.label} color={knobProps.textAccentColor}>
916
916
  {t("{{count}} row(s)", { count: data.length })}
917
917
  </Text>
918
918
  </XStack>