@multiplatform.one/components 6.4.2 → 6.6.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 (421) hide show
  1. package/dist/cjs/Alert/index.native.js.map +1 -1
  2. package/dist/cjs/Avatar/index.cjs +4 -0
  3. package/dist/cjs/Avatar/index.native.js +4 -0
  4. package/dist/cjs/Avatar/index.native.js.map +1 -1
  5. package/dist/cjs/Badge/index.cjs +3 -0
  6. package/dist/cjs/Badge/index.native.js +3 -0
  7. package/dist/cjs/Badge/index.native.js.map +1 -1
  8. package/dist/cjs/Carousel/index.cjs +29 -16
  9. package/dist/cjs/Carousel/index.native.js +35 -18
  10. package/dist/cjs/Carousel/index.native.js.map +1 -1
  11. package/dist/cjs/DotIndicator/index.cjs +95 -36
  12. package/dist/cjs/DotIndicator/index.native.js +96 -36
  13. package/dist/cjs/DotIndicator/index.native.js.map +1 -1
  14. package/dist/cjs/Pagination.cjs +112 -163
  15. package/dist/cjs/Pagination.native.js +125 -176
  16. package/dist/cjs/Pagination.native.js.map +1 -1
  17. package/dist/cjs/ProgressSteps/index.cjs +5 -3
  18. package/dist/cjs/ProgressSteps/index.native.js +5 -3
  19. package/dist/cjs/ProgressSteps/index.native.js.map +1 -1
  20. package/dist/cjs/Wheel/index.cjs +1 -1
  21. package/dist/cjs/Wheel/index.native.js +1 -1
  22. package/dist/cjs/Wheel/index.native.js.map +1 -1
  23. package/dist/cjs/charts/Axis.cjs +1 -1
  24. package/dist/cjs/charts/Axis.native.js +1 -1
  25. package/dist/cjs/charts/Axis.native.js.map +1 -1
  26. package/dist/cjs/charts/BarChart.cjs +1 -1
  27. package/dist/cjs/charts/BarChart.native.js +1 -3
  28. package/dist/cjs/charts/BarChart.native.js.map +1 -1
  29. package/dist/cjs/charts/LineChart.cjs +1 -1
  30. package/dist/cjs/charts/LineChart.native.js +1 -3
  31. package/dist/cjs/charts/LineChart.native.js.map +1 -1
  32. package/dist/cjs/charts/PieChart.cjs +3 -2
  33. package/dist/cjs/charts/PieChart.native.js +9 -5
  34. package/dist/cjs/charts/PieChart.native.js.map +1 -1
  35. package/dist/cjs/charts/accessibility.native.js.map +1 -1
  36. package/dist/cjs/charts/index.cjs +1 -0
  37. package/dist/cjs/charts/index.native.js +1 -0
  38. package/dist/cjs/charts/index.native.js.map +1 -1
  39. package/dist/cjs/charts/math.cjs +6 -1
  40. package/dist/cjs/charts/math.native.js +6 -1
  41. package/dist/cjs/charts/math.native.js.map +1 -1
  42. package/dist/cjs/componentColors.cjs +11 -3
  43. package/dist/cjs/componentColors.native.js +11 -3
  44. package/dist/cjs/componentColors.native.js.map +1 -1
  45. package/dist/cjs/feedback/ConfirmDialog.cjs +1 -3
  46. package/dist/cjs/feedback/ConfirmDialog.native.js +1 -3
  47. package/dist/cjs/feedback/ConfirmDialog.native.js.map +1 -1
  48. package/dist/cjs/index.cjs +1 -0
  49. package/dist/cjs/index.native.js +1 -0
  50. package/dist/cjs/index.native.js.map +1 -1
  51. package/dist/cjs/layouts/ViewSwitcher.cjs +19 -0
  52. package/dist/cjs/layouts/ViewSwitcher.native.js +33 -0
  53. package/dist/cjs/layouts/ViewSwitcher.native.js.map +1 -1
  54. package/dist/cjs/layouts/attachments.cjs +4 -8
  55. package/dist/cjs/layouts/attachments.native.js +5 -8
  56. package/dist/cjs/layouts/attachments.native.js.map +1 -1
  57. package/dist/cjs/layouts/page.cjs +3 -4
  58. package/dist/cjs/layouts/page.native.js +6 -5
  59. package/dist/cjs/layouts/page.native.js.map +1 -1
  60. package/dist/cjs/layouts/tags.cjs +1 -0
  61. package/dist/cjs/layouts/tags.native.js +2 -0
  62. package/dist/cjs/layouts/tags.native.js.map +1 -1
  63. package/dist/cjs/layouts/timeline.cjs +0 -6
  64. package/dist/cjs/layouts/timeline.native.js +0 -6
  65. package/dist/cjs/layouts/timeline.native.js.map +1 -1
  66. package/dist/cjs/surfaces.cjs +21 -0
  67. package/dist/cjs/surfaces.native.js +22 -0
  68. package/dist/cjs/surfaces.native.js.map +1 -1
  69. package/dist/cjs/views/Calendar.cjs +15 -38
  70. package/dist/cjs/views/Calendar.native.js +21 -44
  71. package/dist/cjs/views/Calendar.native.js.map +1 -1
  72. package/dist/cjs/views/Dashboard.cjs +10 -10
  73. package/dist/cjs/views/Dashboard.native.js +12 -10
  74. package/dist/cjs/views/Dashboard.native.js.map +1 -1
  75. package/dist/cjs/views/Kanban.cjs +22 -13
  76. package/dist/cjs/views/Kanban.native.js +1 -0
  77. package/dist/cjs/views/Kanban.native.js.map +1 -1
  78. package/dist/cjs/views/ReportBuilder.cjs +29 -11
  79. package/dist/cjs/views/ReportBuilder.native.js +29 -11
  80. package/dist/cjs/views/ReportBuilder.native.js.map +1 -1
  81. package/dist/cjs/views/TreeView.cjs +1 -1
  82. package/dist/cjs/views/TreeView.native.js +1 -1
  83. package/dist/cjs/views/TreeView.native.js.map +1 -1
  84. package/dist/cjs/views/calendarMath.cjs +3 -9
  85. package/dist/cjs/views/calendarMath.native.js +3 -9
  86. package/dist/cjs/views/calendarMath.native.js.map +1 -1
  87. package/dist/cjs/views/ganttMath.cjs +14 -19
  88. package/dist/cjs/views/ganttMath.native.js +21 -20
  89. package/dist/cjs/views/ganttMath.native.js.map +1 -1
  90. package/dist/esm/Accordion/index.mjs.map +1 -1
  91. package/dist/esm/Alert/index.mjs.map +1 -1
  92. package/dist/esm/Alert/index.native.js.map +1 -1
  93. package/dist/esm/Avatar/index.mjs +5 -1
  94. package/dist/esm/Avatar/index.mjs.map +1 -1
  95. package/dist/esm/Avatar/index.native.js +5 -1
  96. package/dist/esm/Avatar/index.native.js.map +1 -1
  97. package/dist/esm/Badge/index.mjs +4 -1
  98. package/dist/esm/Badge/index.mjs.map +1 -1
  99. package/dist/esm/Badge/index.native.js +4 -1
  100. package/dist/esm/Badge/index.native.js.map +1 -1
  101. package/dist/esm/Carousel/index.mjs +29 -16
  102. package/dist/esm/Carousel/index.mjs.map +1 -1
  103. package/dist/esm/Carousel/index.native.js +35 -18
  104. package/dist/esm/Carousel/index.native.js.map +1 -1
  105. package/dist/esm/DotIndicator/index.mjs +96 -37
  106. package/dist/esm/DotIndicator/index.mjs.map +1 -1
  107. package/dist/esm/DotIndicator/index.native.js +97 -37
  108. package/dist/esm/DotIndicator/index.native.js.map +1 -1
  109. package/dist/esm/DropdownMenu/index.mjs.map +1 -1
  110. package/dist/esm/DropdownMenu/index.native.js.map +1 -1
  111. package/dist/esm/Pagination.mjs +113 -164
  112. package/dist/esm/Pagination.mjs.map +1 -1
  113. package/dist/esm/Pagination.native.js +126 -177
  114. package/dist/esm/Pagination.native.js.map +1 -1
  115. package/dist/esm/ProgressSteps/index.mjs +6 -4
  116. package/dist/esm/ProgressSteps/index.mjs.map +1 -1
  117. package/dist/esm/ProgressSteps/index.native.js +6 -4
  118. package/dist/esm/ProgressSteps/index.native.js.map +1 -1
  119. package/dist/esm/Wheel/index.mjs +1 -1
  120. package/dist/esm/Wheel/index.mjs.map +1 -1
  121. package/dist/esm/Wheel/index.native.js +1 -1
  122. package/dist/esm/Wheel/index.native.js.map +1 -1
  123. package/dist/esm/charts/Axis.mjs +2 -2
  124. package/dist/esm/charts/Axis.mjs.map +1 -1
  125. package/dist/esm/charts/Axis.native.js +2 -2
  126. package/dist/esm/charts/Axis.native.js.map +1 -1
  127. package/dist/esm/charts/BarChart.mjs +2 -2
  128. package/dist/esm/charts/BarChart.mjs.map +1 -1
  129. package/dist/esm/charts/BarChart.native.js +2 -4
  130. package/dist/esm/charts/BarChart.native.js.map +1 -1
  131. package/dist/esm/charts/LineChart.mjs +2 -2
  132. package/dist/esm/charts/LineChart.mjs.map +1 -1
  133. package/dist/esm/charts/LineChart.native.js +2 -4
  134. package/dist/esm/charts/LineChart.native.js.map +1 -1
  135. package/dist/esm/charts/PieChart.mjs +3 -2
  136. package/dist/esm/charts/PieChart.mjs.map +1 -1
  137. package/dist/esm/charts/PieChart.native.js +9 -5
  138. package/dist/esm/charts/PieChart.native.js.map +1 -1
  139. package/dist/esm/charts/accessibility.mjs.map +1 -1
  140. package/dist/esm/charts/accessibility.native.js.map +1 -1
  141. package/dist/esm/charts/index.mjs +2 -2
  142. package/dist/esm/charts/index.mjs.map +1 -1
  143. package/dist/esm/charts/index.native.js +2 -2
  144. package/dist/esm/charts/index.native.js.map +1 -1
  145. package/dist/esm/charts/math.mjs +6 -2
  146. package/dist/esm/charts/math.mjs.map +1 -1
  147. package/dist/esm/charts/math.native.js +6 -2
  148. package/dist/esm/charts/math.native.js.map +1 -1
  149. package/dist/esm/componentColors.mjs +11 -3
  150. package/dist/esm/componentColors.mjs.map +1 -1
  151. package/dist/esm/componentColors.native.js +11 -3
  152. package/dist/esm/componentColors.native.js.map +1 -1
  153. package/dist/esm/feedback/ConfirmDialog.mjs +2 -4
  154. package/dist/esm/feedback/ConfirmDialog.mjs.map +1 -1
  155. package/dist/esm/feedback/ConfirmDialog.native.js +2 -4
  156. package/dist/esm/feedback/ConfirmDialog.native.js.map +1 -1
  157. package/dist/esm/index.mjs +2 -2
  158. package/dist/esm/index.mjs.map +1 -1
  159. package/dist/esm/index.native.js +2 -2
  160. package/dist/esm/index.native.js.map +1 -1
  161. package/dist/esm/layouts/ViewSwitcher.mjs +20 -1
  162. package/dist/esm/layouts/ViewSwitcher.mjs.map +1 -1
  163. package/dist/esm/layouts/ViewSwitcher.native.js +34 -1
  164. package/dist/esm/layouts/ViewSwitcher.native.js.map +1 -1
  165. package/dist/esm/layouts/attachments.mjs +4 -8
  166. package/dist/esm/layouts/attachments.mjs.map +1 -1
  167. package/dist/esm/layouts/attachments.native.js +5 -8
  168. package/dist/esm/layouts/attachments.native.js.map +1 -1
  169. package/dist/esm/layouts/page.mjs +4 -5
  170. package/dist/esm/layouts/page.mjs.map +1 -1
  171. package/dist/esm/layouts/page.native.js +7 -6
  172. package/dist/esm/layouts/page.native.js.map +1 -1
  173. package/dist/esm/layouts/tags.mjs +1 -0
  174. package/dist/esm/layouts/tags.mjs.map +1 -1
  175. package/dist/esm/layouts/tags.native.js +2 -0
  176. package/dist/esm/layouts/tags.native.js.map +1 -1
  177. package/dist/esm/layouts/timeline.mjs +0 -6
  178. package/dist/esm/layouts/timeline.mjs.map +1 -1
  179. package/dist/esm/layouts/timeline.native.js +0 -6
  180. package/dist/esm/layouts/timeline.native.js.map +1 -1
  181. package/dist/esm/surfaces.mjs +21 -1
  182. package/dist/esm/surfaces.mjs.map +1 -1
  183. package/dist/esm/surfaces.native.js +22 -1
  184. package/dist/esm/surfaces.native.js.map +1 -1
  185. package/dist/esm/views/Calendar.mjs +6 -29
  186. package/dist/esm/views/Calendar.mjs.map +1 -1
  187. package/dist/esm/views/Calendar.native.js +12 -35
  188. package/dist/esm/views/Calendar.native.js.map +1 -1
  189. package/dist/esm/views/Dashboard.mjs +12 -12
  190. package/dist/esm/views/Dashboard.mjs.map +1 -1
  191. package/dist/esm/views/Dashboard.native.js +14 -12
  192. package/dist/esm/views/Dashboard.native.js.map +1 -1
  193. package/dist/esm/views/Kanban.mjs +23 -14
  194. package/dist/esm/views/Kanban.mjs.map +1 -1
  195. package/dist/esm/views/Kanban.native.js +2 -1
  196. package/dist/esm/views/Kanban.native.js.map +1 -1
  197. package/dist/esm/views/ReportBuilder.mjs +30 -12
  198. package/dist/esm/views/ReportBuilder.mjs.map +1 -1
  199. package/dist/esm/views/ReportBuilder.native.js +30 -12
  200. package/dist/esm/views/ReportBuilder.native.js.map +1 -1
  201. package/dist/esm/views/TreeView.mjs +1 -1
  202. package/dist/esm/views/TreeView.mjs.map +1 -1
  203. package/dist/esm/views/TreeView.native.js +1 -1
  204. package/dist/esm/views/TreeView.native.js.map +1 -1
  205. package/dist/esm/views/calendarMath.mjs +3 -9
  206. package/dist/esm/views/calendarMath.mjs.map +1 -1
  207. package/dist/esm/views/calendarMath.native.js +3 -9
  208. package/dist/esm/views/calendarMath.native.js.map +1 -1
  209. package/dist/esm/views/ganttMath.mjs +14 -19
  210. package/dist/esm/views/ganttMath.mjs.map +1 -1
  211. package/dist/esm/views/ganttMath.native.js +21 -20
  212. package/dist/esm/views/ganttMath.native.js.map +1 -1
  213. package/dist/esm/views/kanbanDnd.mjs.map +1 -1
  214. package/dist/jsx/Accordion/index.mjs.map +1 -1
  215. package/dist/jsx/Alert/index.mjs.map +1 -1
  216. package/dist/jsx/Alert/index.native.js.map +1 -1
  217. package/dist/jsx/Avatar/index.mjs +5 -1
  218. package/dist/jsx/Avatar/index.mjs.map +1 -1
  219. package/dist/jsx/Avatar/index.native.js +4 -0
  220. package/dist/jsx/Avatar/index.native.js.map +1 -1
  221. package/dist/jsx/Badge/index.mjs +4 -1
  222. package/dist/jsx/Badge/index.mjs.map +1 -1
  223. package/dist/jsx/Badge/index.native.js +3 -0
  224. package/dist/jsx/Badge/index.native.js.map +1 -1
  225. package/dist/jsx/Carousel/index.mjs +29 -16
  226. package/dist/jsx/Carousel/index.mjs.map +1 -1
  227. package/dist/jsx/Carousel/index.native.js +35 -18
  228. package/dist/jsx/Carousel/index.native.js.map +1 -1
  229. package/dist/jsx/DotIndicator/index.mjs +96 -37
  230. package/dist/jsx/DotIndicator/index.mjs.map +1 -1
  231. package/dist/jsx/DotIndicator/index.native.js +96 -36
  232. package/dist/jsx/DotIndicator/index.native.js.map +1 -1
  233. package/dist/jsx/DropdownMenu/index.mjs.map +1 -1
  234. package/dist/jsx/Pagination.mjs +113 -164
  235. package/dist/jsx/Pagination.mjs.map +1 -1
  236. package/dist/jsx/Pagination.native.js +125 -176
  237. package/dist/jsx/Pagination.native.js.map +1 -1
  238. package/dist/jsx/ProgressSteps/index.mjs +6 -4
  239. package/dist/jsx/ProgressSteps/index.mjs.map +1 -1
  240. package/dist/jsx/ProgressSteps/index.native.js +5 -3
  241. package/dist/jsx/ProgressSteps/index.native.js.map +1 -1
  242. package/dist/jsx/Wheel/index.mjs +1 -1
  243. package/dist/jsx/Wheel/index.mjs.map +1 -1
  244. package/dist/jsx/Wheel/index.native.js +1 -1
  245. package/dist/jsx/Wheel/index.native.js.map +1 -1
  246. package/dist/jsx/charts/Axis.mjs +2 -2
  247. package/dist/jsx/charts/Axis.mjs.map +1 -1
  248. package/dist/jsx/charts/Axis.native.js +1 -1
  249. package/dist/jsx/charts/Axis.native.js.map +1 -1
  250. package/dist/jsx/charts/BarChart.mjs +2 -2
  251. package/dist/jsx/charts/BarChart.mjs.map +1 -1
  252. package/dist/jsx/charts/BarChart.native.js +1 -3
  253. package/dist/jsx/charts/BarChart.native.js.map +1 -1
  254. package/dist/jsx/charts/LineChart.mjs +2 -2
  255. package/dist/jsx/charts/LineChart.mjs.map +1 -1
  256. package/dist/jsx/charts/LineChart.native.js +1 -3
  257. package/dist/jsx/charts/LineChart.native.js.map +1 -1
  258. package/dist/jsx/charts/PieChart.mjs +3 -2
  259. package/dist/jsx/charts/PieChart.mjs.map +1 -1
  260. package/dist/jsx/charts/PieChart.native.js +9 -5
  261. package/dist/jsx/charts/PieChart.native.js.map +1 -1
  262. package/dist/jsx/charts/accessibility.mjs.map +1 -1
  263. package/dist/jsx/charts/accessibility.native.js.map +1 -1
  264. package/dist/jsx/charts/index.mjs +2 -2
  265. package/dist/jsx/charts/index.mjs.map +1 -1
  266. package/dist/jsx/charts/index.native.js +1 -0
  267. package/dist/jsx/charts/index.native.js.map +1 -1
  268. package/dist/jsx/charts/math.mjs +6 -2
  269. package/dist/jsx/charts/math.mjs.map +1 -1
  270. package/dist/jsx/charts/math.native.js +6 -1
  271. package/dist/jsx/charts/math.native.js.map +1 -1
  272. package/dist/jsx/componentColors.mjs +11 -3
  273. package/dist/jsx/componentColors.mjs.map +1 -1
  274. package/dist/jsx/componentColors.native.js +11 -3
  275. package/dist/jsx/componentColors.native.js.map +1 -1
  276. package/dist/jsx/feedback/ConfirmDialog.mjs +2 -4
  277. package/dist/jsx/feedback/ConfirmDialog.mjs.map +1 -1
  278. package/dist/jsx/feedback/ConfirmDialog.native.js +1 -3
  279. package/dist/jsx/feedback/ConfirmDialog.native.js.map +1 -1
  280. package/dist/jsx/index.js +2 -2
  281. package/dist/jsx/index.js.map +1 -1
  282. package/dist/jsx/index.mjs +2 -2
  283. package/dist/jsx/index.mjs.map +1 -1
  284. package/dist/jsx/index.native.js +1 -0
  285. package/dist/jsx/index.native.js.map +1 -1
  286. package/dist/jsx/layouts/ViewSwitcher.mjs +20 -1
  287. package/dist/jsx/layouts/ViewSwitcher.mjs.map +1 -1
  288. package/dist/jsx/layouts/ViewSwitcher.native.js +33 -0
  289. package/dist/jsx/layouts/ViewSwitcher.native.js.map +1 -1
  290. package/dist/jsx/layouts/attachments.mjs +4 -8
  291. package/dist/jsx/layouts/attachments.mjs.map +1 -1
  292. package/dist/jsx/layouts/attachments.native.js +5 -8
  293. package/dist/jsx/layouts/attachments.native.js.map +1 -1
  294. package/dist/jsx/layouts/page.mjs +4 -5
  295. package/dist/jsx/layouts/page.mjs.map +1 -1
  296. package/dist/jsx/layouts/page.native.js +6 -5
  297. package/dist/jsx/layouts/page.native.js.map +1 -1
  298. package/dist/jsx/layouts/tags.mjs +1 -0
  299. package/dist/jsx/layouts/tags.mjs.map +1 -1
  300. package/dist/jsx/layouts/tags.native.js +2 -0
  301. package/dist/jsx/layouts/tags.native.js.map +1 -1
  302. package/dist/jsx/layouts/timeline.mjs +0 -6
  303. package/dist/jsx/layouts/timeline.mjs.map +1 -1
  304. package/dist/jsx/layouts/timeline.native.js +0 -6
  305. package/dist/jsx/layouts/timeline.native.js.map +1 -1
  306. package/dist/jsx/surfaces.mjs +21 -1
  307. package/dist/jsx/surfaces.mjs.map +1 -1
  308. package/dist/jsx/surfaces.native.js +22 -0
  309. package/dist/jsx/surfaces.native.js.map +1 -1
  310. package/dist/jsx/views/Calendar.mjs +6 -29
  311. package/dist/jsx/views/Calendar.mjs.map +1 -1
  312. package/dist/jsx/views/Calendar.native.js +21 -44
  313. package/dist/jsx/views/Calendar.native.js.map +1 -1
  314. package/dist/jsx/views/Dashboard.mjs +12 -12
  315. package/dist/jsx/views/Dashboard.mjs.map +1 -1
  316. package/dist/jsx/views/Dashboard.native.js +12 -10
  317. package/dist/jsx/views/Dashboard.native.js.map +1 -1
  318. package/dist/jsx/views/Kanban.mjs +23 -14
  319. package/dist/jsx/views/Kanban.mjs.map +1 -1
  320. package/dist/jsx/views/Kanban.native.js +1 -0
  321. package/dist/jsx/views/Kanban.native.js.map +1 -1
  322. package/dist/jsx/views/ReportBuilder.mjs +30 -12
  323. package/dist/jsx/views/ReportBuilder.mjs.map +1 -1
  324. package/dist/jsx/views/ReportBuilder.native.js +29 -11
  325. package/dist/jsx/views/ReportBuilder.native.js.map +1 -1
  326. package/dist/jsx/views/TreeView.mjs +1 -1
  327. package/dist/jsx/views/TreeView.mjs.map +1 -1
  328. package/dist/jsx/views/TreeView.native.js +1 -1
  329. package/dist/jsx/views/TreeView.native.js.map +1 -1
  330. package/dist/jsx/views/calendarMath.mjs +3 -9
  331. package/dist/jsx/views/calendarMath.mjs.map +1 -1
  332. package/dist/jsx/views/calendarMath.native.js +3 -9
  333. package/dist/jsx/views/calendarMath.native.js.map +1 -1
  334. package/dist/jsx/views/ganttMath.mjs +14 -19
  335. package/dist/jsx/views/ganttMath.mjs.map +1 -1
  336. package/dist/jsx/views/ganttMath.native.js +21 -20
  337. package/dist/jsx/views/ganttMath.native.js.map +1 -1
  338. package/dist/jsx/views/kanbanDnd.mjs.map +1 -1
  339. package/package.json +12 -12
  340. package/src/Accordion/Accordion.stories.tsx +7 -2
  341. package/src/Alert/index.tsx +1 -3
  342. package/src/Avatar/Avatar.spec.tsx +31 -0
  343. package/src/Avatar/index.tsx +19 -1
  344. package/src/Badge/Badge.stories.tsx +3 -1
  345. package/src/Badge/index.tsx +4 -1
  346. package/src/Carousel/Carousel.spec.tsx +271 -0
  347. package/src/Carousel/Carousel.stories.tsx +35 -0
  348. package/src/Carousel/index.tsx +45 -20
  349. package/src/DialogContent.stories.tsx +2 -2
  350. package/src/DotIndicator/dotIndicator.spec.tsx +43 -1
  351. package/src/DotIndicator/index.tsx +170 -37
  352. package/src/Pagination.api.spec.tsx +345 -0
  353. package/src/Pagination.tsx +138 -176
  354. package/src/Panel.stories.tsx +4 -4
  355. package/src/ProgressSteps/ProgressSteps.spec.tsx +40 -1
  356. package/src/ProgressSteps/ProgressSteps.stories.tsx +3 -1
  357. package/src/ProgressSteps/index.tsx +6 -1
  358. package/src/charts/PieChart.tsx +4 -1
  359. package/src/feedback/ConfirmDialog.tsx +2 -2
  360. package/src/index.ts +1 -0
  361. package/src/layouts/PageHeader.stories.tsx +21 -3
  362. package/src/layouts/ScreenToolbar.stories.tsx +12 -5
  363. package/src/layouts/ViewSwitcher.tsx +25 -6
  364. package/src/layouts/attachments.tsx +4 -1
  365. package/src/layouts/layouts.spec.tsx +77 -1
  366. package/src/layouts/page.tsx +5 -1
  367. package/src/layouts/pageTitleScale.spec.tsx +70 -0
  368. package/src/layouts/tags.tsx +2 -0
  369. package/src/layouts/timeline-radius.spec.tsx +21 -0
  370. package/src/layouts/timeline.tsx +7 -18
  371. package/src/shared/t.spec.ts +47 -0
  372. package/src/surfaces.tsx +33 -0
  373. package/src/views/Calendar.stories.tsx +4 -2
  374. package/src/views/Calendar.tsx +6 -1
  375. package/src/views/Gantt.stories.tsx +2 -2
  376. package/src/views/Kanban.native.tsx +8 -2
  377. package/src/views/Kanban.stories.tsx +3 -1
  378. package/src/views/Kanban.tsx +42 -13
  379. package/src/views/ReportBuilder.tsx +15 -2
  380. package/src/views/ganttMath.ts +2 -6
  381. package/types/Alert/index.d.ts.map +1 -1
  382. package/types/Avatar/index.d.ts.map +1 -1
  383. package/types/Badge/index.d.ts.map +1 -1
  384. package/types/Carousel/index.d.ts.map +1 -1
  385. package/types/DotIndicator/index.d.ts +44 -3
  386. package/types/DotIndicator/index.d.ts.map +1 -1
  387. package/types/Pagination.d.ts +6 -1
  388. package/types/Pagination.d.ts.map +1 -1
  389. package/types/ProgressSteps/index.d.ts.map +1 -1
  390. package/types/charts/Axis.d.ts.map +1 -1
  391. package/types/charts/BarChart.d.ts.map +1 -1
  392. package/types/charts/LineChart.d.ts.map +1 -1
  393. package/types/charts/PieChart.d.ts.map +1 -1
  394. package/types/charts/accessibility.d.ts +3 -2
  395. package/types/charts/accessibility.d.ts.map +1 -1
  396. package/types/charts/index.d.ts +1 -1
  397. package/types/charts/index.d.ts.map +1 -1
  398. package/types/charts/math.d.ts +16 -1
  399. package/types/charts/math.d.ts.map +1 -1
  400. package/types/componentColors.d.ts +11 -3
  401. package/types/componentColors.d.ts.map +1 -1
  402. package/types/index.d.ts +1 -1
  403. package/types/index.d.ts.map +1 -1
  404. package/types/layouts/ViewSwitcher.d.ts.map +1 -1
  405. package/types/layouts/attachments.d.ts.map +1 -1
  406. package/types/layouts/page.d.ts +8 -6
  407. package/types/layouts/page.d.ts.map +1 -1
  408. package/types/layouts/tags.d.ts.map +1 -1
  409. package/types/layouts/timeline.d.ts.map +1 -1
  410. package/types/surfaces.d.ts +17 -0
  411. package/types/surfaces.d.ts.map +1 -1
  412. package/types/views/Calendar.d.ts.map +1 -1
  413. package/types/views/Dashboard.d.ts.map +1 -1
  414. package/types/views/Kanban.d.ts +13 -1
  415. package/types/views/Kanban.d.ts.map +1 -1
  416. package/types/views/ReportBuilder.d.ts.map +1 -1
  417. package/types/views/TreeView.d.ts.map +1 -1
  418. package/types/views/calendarMath.d.ts +5 -1
  419. package/types/views/calendarMath.d.ts.map +1 -1
  420. package/types/views/ganttMath.d.ts +3 -0
  421. package/types/views/ganttMath.d.ts.map +1 -1
@@ -12,7 +12,8 @@ import type React from "react";
12
12
  import { useCallback, useState } from "react";
13
13
  import { useTranslation } from "react-i18next";
14
14
  import { Button } from "@multiplatform.one/forms";
15
- import { Text, View, XStack, type XStackProps } from "tamagui";
15
+ import { Text, XStack, type XStackProps } from "tamagui";
16
+ import { DotIndicator } from "./DotIndicator";
16
17
  import { componentColors } from "./componentColors";
17
18
  import { useDirection } from "./hooks/useDirection";
18
19
  import { bidiIsolate, withInterp } from "./shared/t";
@@ -62,6 +63,21 @@ export function getPaginationItems(
62
63
  return items;
63
64
  }
64
65
 
66
+ /**
67
+ * The size the pager pins its strip at, as steps on the size-token scale.
68
+ *
69
+ * The strip itself is `DotIndicator` (LC-16: one dot-strip implementation in
70
+ * the catalog), and `DotVariant` documents the one channel a mark's size may
71
+ * come from: a host pin, else the size knob's scale. This host pins, because
72
+ * its strip is seated on a rail between 44px controls and a bare strip's knob
73
+ * geometry reads lost there. Selecting a STEP keeps the pager on that channel
74
+ * instead of authoring a second geometry under a variant name.
75
+ */
76
+ const stripSteps = {
77
+ base: { mark: "$0.75", active: "$2" },
78
+ large: { mark: "$1.5", active: "$3" },
79
+ } as const;
80
+
65
81
  export interface PaginationProps extends Omit<XStackProps, "children" | "onChange"> {
66
82
  /** Total number of pages/steps */
67
83
  total: number;
@@ -85,7 +101,12 @@ export interface PaginationProps extends Omit<XStackProps, "children" | "onChang
85
101
  onSubmit?: () => void;
86
102
  /** Disable all navigation */
87
103
  disabled?: boolean;
88
- /** Visual variant: dots/bars = carousel & wizard idiom, numbered = table & data idiom */
104
+ /**
105
+ * Visual variant: dots/bars = carousel & wizard idiom, numbered = table &
106
+ * data idiom. `bars` is the progress-tick idiom (never badges a completed
107
+ * step) at the pager's large step — see `DotVariant` for the one rule that
108
+ * governs a strip mark's size.
109
+ */
89
110
  variant?: "dots" | "bars" | "numbered";
90
111
  /** Total number of items across all pages (numbered summary slot) */
91
112
  totalItems?: number;
@@ -176,55 +197,78 @@ export function Pagination({
176
197
  }
177
198
  }) as unknown as () => void;
178
199
 
179
- if (variant === "numbered") {
180
- const items = getPaginationItems(total, currentPage, siblingCount, boundaryCount);
181
- const canPrev = !disabled && currentPage > 1;
182
- const canNext = !disabled && currentPage < total;
183
- // Bidi-isolate the whole formatted range so an RTL paragraph can't
184
- // reorder the latin/numeric runs ("1–5 of 5" ⇏ "of 5 5–1").
185
- const summary =
186
- showSummary && totalItems != null && pageSize != null
187
- ? bidiIsolate(
188
- totalItems === 0
189
- ? t("0 of 0")
190
- : withInterp(t("{{start}}–{{end}} of {{total}}"), {
191
- start: (currentPage - 1) * pageSize + 1,
192
- end: Math.min(currentPage * pageSize, totalItems),
193
- total: totalItems,
194
- }),
195
- )
196
- : undefined;
200
+ const isNumbered = variant === "numbered";
201
+
202
+ // The two idioms differ in which glyphs the controls take, whether the
203
+ // control is circular, and whether the last step submits — not in structure.
204
+ const canPrev = !disabled && index > 0;
205
+ const canNext = isNumbered
206
+ ? !disabled && currentPage < total
207
+ : // dots/bars: an onSubmit makes the last step actionable, so the forward
208
+ // control is not dead there.
209
+ !(disabled || (!isLastStep && index >= total - 1 && !onSubmit));
210
+ const submits = !isNumbered && isLastStep;
211
+
212
+ const items = isNumbered
213
+ ? getPaginationItems(total, currentPage, siblingCount, boundaryCount)
214
+ : [];
215
+
216
+ // Bidi-isolate the whole formatted range so an RTL paragraph can't
217
+ // reorder the latin/numeric runs ("1–5 of 5" ⇏ "of 5 5–1").
218
+ const summary =
219
+ isNumbered && showSummary && totalItems != null && pageSize != null
220
+ ? bidiIsolate(
221
+ totalItems === 0
222
+ ? t("0 of 0")
223
+ : withInterp(t("{{start}}–{{end}} of {{total}}"), {
224
+ start: (currentPage - 1) * pageSize + 1,
225
+ end: Math.min(currentPage * pageSize, totalItems),
226
+ total: totalItems,
227
+ }),
228
+ )
229
+ : undefined;
197
230
 
198
- return (
199
- <XStack
200
- alignItems="center"
201
- justifyContent="center"
202
- role="navigation"
203
- aria-label={t("Pagination")}
204
- {...knobProps.gap}
205
- {...stackProps}
206
- >
207
- {showFirstLast && (
208
- <Button
209
- size={knobProps.sizeToken}
210
- variant="outlined"
211
- icon={FirstIcon}
212
- onPress={() => goTo(0)}
213
- disabled={!canPrev}
214
- aria-label={t("Go to first page")}
215
- onKeyDown={activateOnEnterSpace(() => goTo(0), canPrev)}
216
- />
217
- )}
231
+ // LC-15 dial, resolved: `bars` names the progress-TICK idiom (no completion
232
+ // badge), never a geometry. The pager pins the large step for it — that pin,
233
+ // and nothing about the name, is why this strip is chunkier than a bare
234
+ // `<DotIndicator variant="bars">`.
235
+ const step = variant === "bars" ? stripSteps.large : stripSteps.base;
236
+
237
+ return (
238
+ <XStack
239
+ alignItems="center"
240
+ justifyContent="center"
241
+ role="navigation"
242
+ aria-label={t("Pagination")}
243
+ {...knobProps.gap}
244
+ {...stackProps}
245
+ >
246
+ {isNumbered && showFirstLast && (
218
247
  <Button
219
248
  size={knobProps.sizeToken}
220
249
  variant="outlined"
221
- icon={PrevIcon}
222
- onPress={handlePrev}
250
+ icon={FirstIcon}
251
+ onPress={() => goTo(0)}
223
252
  disabled={!canPrev}
224
- aria-label={t("Go to previous page")}
225
- onKeyDown={activateOnEnterSpace(handlePrev, canPrev)}
253
+ aria-label={t("Go to first page")}
254
+ onKeyDown={activateOnEnterSpace(() => goTo(0), canPrev)}
226
255
  />
256
+ )}
227
257
 
258
+ <Button
259
+ size={knobProps.sizeToken}
260
+ circular={!isNumbered}
261
+ variant="outlined"
262
+ icon={isNumbered ? PrevIcon : PrevArrowIcon}
263
+ onPress={handlePrev}
264
+ disabled={!canPrev}
265
+ // LC-40: the Button's own disabled wash owns the treatment — the
266
+ // legacy opacity 0.3 dim stacked on top of it (double-dim).
267
+ aria-label={isNumbered ? t("Go to previous page") : t("Previous page")}
268
+ onKeyDown={activateOnEnterSpace(handlePrev, canPrev)}
269
+ />
270
+
271
+ {isNumbered ? (
228
272
  <XStack alignItems="center" gap="$1">
229
273
  {items.map((item) => {
230
274
  if (typeof item !== "number") {
@@ -262,145 +306,63 @@ export function Pagination({
262
306
  );
263
307
  })}
264
308
  </XStack>
265
-
266
- <Button
267
- size={knobProps.sizeToken}
268
- variant="outlined"
269
- icon={NextIcon}
270
- onPress={handleNext}
271
- disabled={!canNext}
272
- aria-label={t("Go to next page")}
273
- onKeyDown={activateOnEnterSpace(handleNext, canNext)}
309
+ ) : (
310
+ // LC-16: the dot strip IS `DotIndicator` — this component owns the
311
+ // pager frame around it, not a second strip. `completedSteps`, the
312
+ // wizard a11y idiom and the rail all ride the primitive, so the two
313
+ // strips in the catalog cannot drift apart again.
314
+ <DotIndicator
315
+ total={total}
316
+ activeIndex={index}
317
+ variant={variant}
318
+ idiom="step"
319
+ rail
320
+ completedSteps={completedSteps}
321
+ dotSize={step.mark}
322
+ activeDotSize={step.active}
323
+ transition={motionTransition}
324
+ dotStateAttribute="data-pagination-dot"
325
+ onChange={allowJumpTo && !disabled ? goTo : undefined}
326
+ // A strip nobody can press has no disabled state — only a jumpable
327
+ // one is "interactive but blocked".
328
+ disabled={allowJumpTo && disabled}
274
329
  />
275
- {showFirstLast && (
276
- <Button
277
- size={knobProps.sizeToken}
278
- variant="outlined"
279
- icon={LastIcon}
280
- onPress={() => goTo(total - 1)}
281
- disabled={!canNext}
282
- aria-label={t("Go to last page")}
283
- onKeyDown={activateOnEnterSpace(() => goTo(total - 1), canNext)}
284
- />
285
- )}
330
+ )}
286
331
 
287
- {summary && (
288
- <Text
289
- {...knobProps.body}
290
- color={componentColors.text.muted}
291
- aria-live="polite"
292
- userSelect="none"
293
- >
294
- {summary}
295
- </Text>
296
- )}
297
- </XStack>
298
- );
299
- }
300
-
301
- const dotSize = variant === "bars" ? "$1.5" : "$0.75";
302
- const activeDotSize = variant === "bars" ? "$3" : "$2";
303
-
304
- return (
305
- <XStack alignItems="center" justifyContent="center" {...knobProps.gap} {...stackProps}>
306
332
  <Button
307
333
  size={knobProps.sizeToken}
308
- circular
309
- icon={PrevArrowIcon}
310
- onPress={handlePrev}
311
- disabled={disabled || index === 0}
312
- variant="outlined"
313
- // LC-40: the Button's own disabled wash owns the treatment — the
314
- // legacy opacity 0.3 dim stacked on top of it (double-dim).
315
- aria-label={t("Previous page")}
316
- onKeyDown={activateOnEnterSpace(handlePrev, !(disabled || index === 0))}
334
+ circular={!isNumbered}
335
+ variant={submits ? undefined : "outlined"}
336
+ theme={submits ? "active" : undefined}
337
+ icon={isNumbered ? NextIcon : submits ? CheckIcon : NextArrowIcon}
338
+ onPress={handleNext}
339
+ disabled={!canNext}
340
+ aria-label={isNumbered ? t("Go to next page") : submits ? t("Submit") : t("Next page")}
341
+ onKeyDown={activateOnEnterSpace(handleNext, canNext)}
317
342
  />
318
343
 
319
- <XStack
320
- alignItems="center"
321
- justifyContent="center"
322
- gap="$2"
323
- backgroundColor={componentColors.interactive.background}
324
- paddingHorizontal={knobProps.panelPadding.padding}
325
- height={knobProps.sizeToken}
326
- borderRadius="$10"
327
- >
328
- {Array.from({ length: total }).map((_, dotIndex) => {
329
- const isActive = dotIndex === index;
330
- const isCompleted = completedSteps?.has(dotIndex);
331
- const canJump = allowJumpTo && !disabled;
332
-
333
- const dotProps: any = {
334
- width: isActive ? activeDotSize : dotSize,
335
- height: dotSize,
336
- borderRadius: "$10",
337
- // LC-05 / D-01 rider (a): the current dot speaks the SAME selected
338
- // language as this component's numbered body (accent) — it used to
339
- // paint ink while the numbered page button painted accent, so one
340
- // component taught two meanings for "current".
341
- backgroundColor:
342
- isCompleted && !isActive
343
- ? componentColors.indicator.completed
344
- : isActive
345
- ? componentColors.indicator.selected
346
- : componentColors.indicator.track,
347
- transition: motionTransition,
348
- cursor: canJump ? "pointer" : undefined,
349
- alignItems: "center",
350
- justifyContent: "center",
351
- "aria-current": isActive ? "step" : undefined,
352
- "data-pagination-dot": isActive ? "active" : "idle",
353
- // Belt-and-suspenders for the CSS driver: named `transition` covers
354
- // Tamagui layout props; explicit width/bg ensures measurable intermediates.
355
- style: {
356
- transition: `width var(--mp-transition, 100ms) ease, height var(--mp-transition, 100ms) ease, background-color var(--mp-transition, 100ms) ease`,
357
- },
358
- ...(canJump
359
- ? {
360
- onPress: () => goTo(dotIndex),
361
- role: "button",
362
- "aria-label": withInterp(t("Go to step {{number}}"), { number: dotIndex + 1 }),
363
- tabIndex: 0,
364
- focusVisibleStyle: {
365
- outlineColor: "$outlineColor",
366
- outlineWidth: 2,
367
- outlineStyle: "solid",
368
- outlineOffset: 1,
369
- },
370
- onKeyDown: (e: React.KeyboardEvent) => {
371
- if (e.key === "Enter" || e.key === " ") {
372
- e.preventDefault();
373
- goTo(dotIndex);
374
- }
375
- },
376
- }
377
- : {}),
378
- };
379
-
380
- return (
381
- <View key={dotIndex} {...dotProps}>
382
- {isCompleted && !isActive && variant === "dots" && (
383
- <CheckIcon size={8} color="white" weight="bold" />
384
- )}
385
- </View>
386
- );
387
- })}
388
- </XStack>
344
+ {isNumbered && showFirstLast && (
345
+ <Button
346
+ size={knobProps.sizeToken}
347
+ variant="outlined"
348
+ icon={LastIcon}
349
+ onPress={() => goTo(total - 1)}
350
+ disabled={!canNext}
351
+ aria-label={t("Go to last page")}
352
+ onKeyDown={activateOnEnterSpace(() => goTo(total - 1), canNext)}
353
+ />
354
+ )}
389
355
 
390
- <Button
391
- size={knobProps.sizeToken}
392
- circular
393
- icon={isLastStep ? CheckIcon : NextArrowIcon}
394
- onPress={handleNext}
395
- disabled={disabled || (!isLastStep && index >= total - 1 && !onSubmit)}
396
- variant={isLastStep ? undefined : "outlined"}
397
- theme={isLastStep ? "active" : undefined}
398
- aria-label={isLastStep ? t("Submit") : t("Next page")}
399
- onKeyDown={activateOnEnterSpace(
400
- handleNext,
401
- !(disabled || (!isLastStep && index >= total - 1 && !onSubmit)),
402
- )}
403
- />
356
+ {summary && (
357
+ <Text
358
+ {...knobProps.body}
359
+ color={componentColors.text.muted}
360
+ aria-live="polite"
361
+ userSelect="none"
362
+ >
363
+ {summary}
364
+ </Text>
365
+ )}
404
366
  </XStack>
405
367
  );
406
368
  }
@@ -1,7 +1,7 @@
1
1
  import type { Meta, StoryObj } from "@storybook/react-native-web-vite";
2
- // Catalog Button (G-15 story honesty / LC-18, UX-P06).
3
- import { Button } from "@multiplatform.one/forms";
4
- import { Input, Paragraph, SizableText, XStack, YStack } from "tamagui";
2
+ // Catalog Button + Input (G-15 story honesty / LC-56, UX-P06).
3
+ import { Button, Input } from "@multiplatform.one/forms";
4
+ import { Paragraph, SizableText, XStack, YStack } from "tamagui";
5
5
  import { Panel } from "./surfaces";
6
6
 
7
7
  const meta: Meta<typeof Panel> = {
@@ -50,7 +50,7 @@ export const InteractiveContent: Story = {
50
50
  render: () => (
51
51
  <Panel maxWidth={420}>
52
52
  <SizableText fontWeight="600">Interactive content</SizableText>
53
- <Input placeholder="Focus me" />
53
+ <Input placeholder="Focus me" inputProps={{ "aria-label": "Focus demo" }} />
54
54
  <XStack gap="$2">
55
55
  <Button variant="outlined">Cancel</Button>
56
56
  <Button>Submit</Button>
@@ -1,10 +1,34 @@
1
1
  import { renderWithProviders } from "@multiplatform.one/test-utils";
2
- import { fireEvent } from "@testing-library/react";
2
+ import {
3
+ createThemesBuilder,
4
+ defaultAccentTheme,
5
+ defaultBaseTheme,
6
+ defaultBuilderOptions,
7
+ } from "@multiplatform.one/theme";
8
+ import { configWithoutAnimations } from "@tamagui/config";
9
+ import { animationsCSS } from "@tamagui/config/v5-css";
10
+ import { fireEvent, render } from "@testing-library/react";
11
+ import { TamaguiProvider, createTamagui } from "tamagui";
3
12
  import { describe, expect, it, vi } from "vitest";
4
13
  import { ProgressSteps } from "./index";
5
14
 
6
15
  const steps = [{ label: "One" }, { label: "Two" }, { label: "Three" }];
7
16
 
17
+ // House builder themes for the LC-05 mark assertion — created at MODULE
18
+ // scope: tamagui registers a config's theme variables globally at
19
+ // createTamagui time, and a config created after the first render (inside a
20
+ // test body) never resolves its tokens (forms Progress.spec pattern).
21
+ const houseThemes = createThemesBuilder(
22
+ defaultBaseTheme,
23
+ defaultAccentTheme,
24
+ defaultBuilderOptions,
25
+ ).themes() as Record<string, Record<string, string>>;
26
+ const houseConfig = createTamagui({
27
+ ...configWithoutAnimations,
28
+ animations: animationsCSS,
29
+ themes: houseThemes as any,
30
+ });
31
+
8
32
  describe("ProgressSteps", () => {
9
33
  it("marks the current step with aria-current=step", () => {
10
34
  const { container } = renderWithProviders(<ProgressSteps steps={steps} current={1} />);
@@ -13,6 +37,21 @@ describe("ProgressSteps", () => {
13
37
  expect(container.textContent).toContain("Two");
14
38
  });
15
39
 
40
+ // LC-05 ONE-EMPHASIS / D-01 (census addition): the current step marker is a
41
+ // selection mark, so it fills with the accent channel (indicator.selected),
42
+ // never the ink tier it used to take. House themes mounted because the
43
+ // stock test themes carry no $accentBackground.
44
+ it("paints the current marker with the accent mark", () => {
45
+ const { container } = render(
46
+ <TamaguiProvider config={houseConfig} defaultTheme="light" disableInjectCSS>
47
+ <ProgressSteps steps={steps} current={1} />
48
+ </TamaguiProvider>,
49
+ );
50
+ const current = container.querySelector('[aria-current="step"]') as HTMLElement;
51
+ expect(current).toBeTruthy();
52
+ expect(current.className).toContain("_bg-accentBackg");
53
+ });
54
+
16
55
  it("calls onStepChange when jumping to another step", () => {
17
56
  const onStepChange = vi.fn();
18
57
  const { container } = renderWithProviders(
@@ -44,7 +44,9 @@ export const Default: Story = {
44
44
 
45
45
  export const Interactive: Story = {
46
46
  render: () => {
47
- const [current, setCurrent] = useState(0);
47
+ // Rest mid-range: at step 0 the Back button is bare-disabled at rest
48
+ // (UX-P19 / DG-ST-03) and demos nothing; step 0 stays one click away.
49
+ const [current, setCurrent] = useState(1);
48
50
  return (
49
51
  <YStack gap="$4" maxWidth={720}>
50
52
  <ProgressSteps steps={demoSteps} current={current} onStepChange={setCurrent} />
@@ -69,7 +69,6 @@ const Marker = styled(View, {
69
69
  name: "ProgressStepMarker",
70
70
  alignItems: "center",
71
71
  justifyContent: "center",
72
- borderRadius: 1000,
73
72
  borderWidth: 2,
74
73
  flexShrink: 0,
75
74
  });
@@ -108,6 +107,11 @@ export function ProgressSteps({
108
107
  const markerTextSize = markerTextSizeMap[knobProps.sizeToken] ?? "$2";
109
108
  const labelSize = labelSizeMap[knobProps.sizeToken] ?? "$3";
110
109
  const gaps = stepGapMap[knobProps.space] ?? stepGapMap.medium;
110
+ // R-BINARY (Axiom 3 NULL): the step marker is a round mode-mark like a radio
111
+ // dot — square in the `none` world, a full circle at every other value. The
112
+ // fixed 1000 arc was knob-dead, an undeclared knob-immune shape the old
113
+ // geometric sweep read as an identity circle (D-09 / LC-60).
114
+ const markerRadius = knobProps.pointy ? 0 : 1000;
111
115
  const connectorThickness = 2;
112
116
  const interactive = !!onStepChange && allowJump;
113
117
  const horizontal = orientation === "horizontal";
@@ -137,6 +141,7 @@ export function ProgressSteps({
137
141
  <Marker
138
142
  width={markerSize}
139
143
  height={markerSize}
144
+ borderRadius={markerRadius}
140
145
  backgroundColor={markerBg}
141
146
  borderColor={markerBorder}
142
147
  {...(state === "current"
@@ -130,10 +130,13 @@ export function PieChart({
130
130
  >
131
131
  {data.map((datum, index) => (
132
132
  <XStack key={`${datum.label}-${index}`} gap="$2" alignItems="center" minWidth={0}>
133
+ {/* Legend keys are chart CHROME, not marks: the swatch follows
134
+ the radius knob and goes square in the `none` world (Axiom 3
135
+ NULL). The pinned $2 arc was knob-dead (D-09 / LC-60). */}
133
136
  <YStack
134
137
  width={12}
135
138
  height={12}
136
- borderRadius="$2"
139
+ borderRadius={knobProps.borderRadius.borderRadius}
137
140
  flexShrink={0}
138
141
  backgroundColor={fills[index] as never}
139
142
  />
@@ -18,7 +18,7 @@ import { useTranslation } from "react-i18next";
18
18
  import { Dialog, Paragraph, XStack, YStack } from "tamagui";
19
19
  import { countActionsInTree } from "../shared/actionScan";
20
20
  import { useReturnFocusOnClose } from "../shared/useReturnFocusOnClose";
21
- import { DialogContent } from "../surfaces";
21
+ import { DialogContent, DialogOverlay } from "../surfaces";
22
22
 
23
23
  export interface ConfirmDialogProps {
24
24
  open: boolean;
@@ -126,7 +126,7 @@ export function ConfirmDialog({
126
126
  return (
127
127
  <Dialog modal open={open} onOpenChange={handleOpenChange}>
128
128
  <Dialog.Portal>
129
- <Dialog.Overlay key="overlay" backgroundColor="$shadow6" />
129
+ <DialogOverlay key="overlay" />
130
130
  <DialogContent
131
131
  key="content"
132
132
  maxWidth={440}
package/src/index.ts CHANGED
@@ -58,6 +58,7 @@ export {
58
58
  CardHeader,
59
59
  CardFooter,
60
60
  DialogContent,
61
+ DialogOverlay,
61
62
  PopoverContent,
62
63
  SheetFrame,
63
64
  Panel,
@@ -2,6 +2,7 @@ import type { Meta, StoryObj } from "@storybook/react-native-web-vite";
2
2
  // Catalog Button (G-15 story honesty / LC-18): raw tamagui buttons ignored
3
3
  // the knobs and pinned a non-house radius (UX-P06).
4
4
  import { Button } from "@multiplatform.one/forms";
5
+ import { Preset } from "@multiplatform.one/theme";
5
6
  import { YStack } from "tamagui";
6
7
  import { PageHeader } from "./page";
7
8
 
@@ -56,12 +57,29 @@ export const TitleOnly: Story = {
56
57
  render: (args) => <PageHeader {...args} />,
57
58
  };
58
59
 
59
- /** D-11 page-title dial: product screens step down from the 64px display H1. */
60
- export const ModerateScale: Story = {
61
- args: { titleScale: "moderate", subtitle: undefined, divider: false },
60
+ /**
61
+ * D-11 page-title dial: the default is the moderate step ($8 = 32px) because a
62
+ * page title is wayfinding, not content. `titleScale="display"` is the
63
+ * per-instance eject back to the 64px hero scale for one marketing header.
64
+ */
65
+ export const DisplayScale: Story = {
66
+ args: { titleScale: "display", subtitle: undefined, divider: false },
62
67
  render: (args) => <PageHeader {...args} />,
63
68
  };
64
69
 
70
+ /**
71
+ * D-11 surface-level opt-in: the `hero` preset re-scales every page title
72
+ * inside it, so a marketing surface asks once instead of per header.
73
+ */
74
+ export const HeroPresetSurface: Story = {
75
+ args: { subtitle: undefined, divider: false },
76
+ render: (args) => (
77
+ <Preset preset="hero">
78
+ <PageHeader {...args} />
79
+ </Preset>
80
+ ),
81
+ };
82
+
65
83
  export const NoTitle: Story = {
66
84
  args: { title: undefined, subtitle: undefined },
67
85
  render: (args) => <PageHeader {...args} actions={<Button>Only action</Button>} />,
@@ -1,7 +1,7 @@
1
1
  import type { Meta, StoryObj } from "@storybook/react-native-web-vite";
2
2
  // Catalog Button (G-15 story honesty / LC-18): raw tamagui buttons pinned a
3
3
  // non-house radius and ignored every knob, poisoning the knob probes.
4
- import { Button, Spinner } from "@multiplatform.one/forms";
4
+ import { Button } from "@multiplatform.one/forms";
5
5
  import { YStack } from "tamagui";
6
6
  import { ScreenToolbar } from "./page";
7
7
 
@@ -49,14 +49,21 @@ export const DisabledAndLoading: Story = {
49
49
  render: () => (
50
50
  <ScreenToolbar
51
51
  leading={
52
- <Button variant="outlined" disabled>
52
+ // DG-ST-03: a disabled control explains itself; inline placement keeps
53
+ // the toolbar row's shared control height.
54
+ <Button
55
+ variant="outlined"
56
+ disabled
57
+ disabledReason="No screen to go back to"
58
+ disabledReasonPlacement="inline"
59
+ >
53
60
  Back
54
61
  </Button>
55
62
  }
56
63
  trailing={
57
- <Button icon={<Spinner size="small" />} disabled>
58
- Saving
59
- </Button>
64
+ // The house loading state: `loading` renders the spinner and is a
65
+ // derived (never bare) disable.
66
+ <Button loading>Saving</Button>
60
67
  }
61
68
  />
62
69
  ),
@@ -56,9 +56,15 @@ export function ViewSwitcher({ views, currentView, onViewChange }: ViewSwitcherP
56
56
  // its label/icon take the luminance-computed anchor for the actual tint.
57
57
  const selectedTint = useAccentTintedSurface();
58
58
  const onSelectedTint = useReadableTextOn(selectedTint);
59
- const selectedChip = selectedTint
60
- ? { backgroundColor: selectedTint, ...(onSelectedTint ? { color: onSelectedTint } : undefined) }
61
- : undefined;
59
+ // Fill only — NO `color` here. `color` is a key of tamagui's Toggle styled
60
+ // context, so supplying it on selection alone makes createComponent wrap the
61
+ // segment in a context Provider; the <button> then sits at a different tree
62
+ // depth in the two states and React DESTROYS and recreates it (measured: 4
63
+ // childList mutations, 0 attribute mutations). CSS cannot transition a node
64
+ // that did not exist in the previous frame, so LC-25 is unreachable until
65
+ // the segment keeps its identity. The on-tint anchor the label and icon need
66
+ // is applied on the row below, which is not a context host.
67
+ const selectedChip = selectedTint ? { backgroundColor: selectedTint } : undefined;
62
68
  const sz = knobProps.sizeToken;
63
69
  // Segment inset ~$3 at medium; size knob steps it (small→$2, large→$4).
64
70
  // Vertical pad is floored so the segment hits DG-LAY-04 (≥44) even at small.
@@ -133,11 +139,24 @@ export function ViewSwitcher({ views, currentView, onViewChange }: ViewSwitcherP
133
139
  flexGrow={0}
134
140
  alignItems="center"
135
141
  justifyContent="center"
136
- // The selected fill is re-applied through hover/press so the
142
+ // LC-25: selecting a segment is a discrete jump, so the fill
143
+ // tweens instead of snapping (undefined at animation=none).
144
+ transition={knobProps.transition}
145
+ // The selected fill is re-applied through hover/press/focus so the
137
146
  // neutral state layer never paints over the accent chip (the
138
- // LC-05 rule the checked Switch track already follows).
147
+ // LC-05 rule the checked Switch track already follows). `focus` is
148
+ // not optional: selecting a segment focuses it, and ToggleFrame's
149
+ // own active recipe carries a neutral `$backgroundActive` focus
150
+ // fill that would otherwise grey out the chip the moment it is
151
+ // chosen. The remount used to hide that by discarding the node's
152
+ // focus state along with the node.
139
153
  {...(isSelected && selectedChip
140
- ? { ...selectedChip, hoverStyle: selectedChip, pressStyle: selectedChip }
154
+ ? {
155
+ ...selectedChip,
156
+ hoverStyle: selectedChip,
157
+ pressStyle: selectedChip,
158
+ focusStyle: selectedChip,
159
+ }
141
160
  : undefined)}
142
161
  {...(isWeb
143
162
  ? {