@multiplatform.one/components 6.7.0 → 7.1.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 (997) hide show
  1. package/dist/cjs/Accordion/index.cjs +213 -70
  2. package/dist/cjs/Accordion/index.native.js +254 -75
  3. package/dist/cjs/Accordion/index.native.js.map +1 -1
  4. package/dist/cjs/Alert/index.cjs +204 -56
  5. package/dist/cjs/Alert/index.native.js +211 -60
  6. package/dist/cjs/Alert/index.native.js.map +1 -1
  7. package/dist/cjs/AnimateHeight/index.cjs +166 -0
  8. package/dist/cjs/AnimateHeight/index.native.js +176 -0
  9. package/dist/cjs/AnimateHeight/index.native.js.map +1 -0
  10. package/dist/cjs/Avatar/getInitials.cjs +34 -0
  11. package/dist/cjs/Avatar/getInitials.native.js +34 -0
  12. package/dist/cjs/Avatar/getInitials.native.js.map +1 -1
  13. package/dist/cjs/Avatar/index.cjs +246 -62
  14. package/dist/cjs/Avatar/index.native.js +252 -68
  15. package/dist/cjs/Avatar/index.native.js.map +1 -1
  16. package/dist/cjs/Badge/index.cjs +109 -75
  17. package/dist/cjs/Badge/index.native.js +110 -76
  18. package/dist/cjs/Badge/index.native.js.map +1 -1
  19. package/dist/cjs/Button.cjs +41 -0
  20. package/dist/cjs/Button.native.js +45 -0
  21. package/dist/cjs/Button.native.js.map +1 -0
  22. package/dist/cjs/Carousel/index.cjs +184 -105
  23. package/dist/cjs/Carousel/index.native.js +212 -107
  24. package/dist/cjs/Carousel/index.native.js.map +1 -1
  25. package/dist/cjs/Chip/index.cjs +360 -5
  26. package/dist/cjs/Chip/index.native.js +374 -5
  27. package/dist/cjs/Chip/index.native.js.map +1 -1
  28. package/dist/cjs/DotIndicator/index.cjs +129 -13
  29. package/dist/cjs/DotIndicator/index.native.js +133 -13
  30. package/dist/cjs/DotIndicator/index.native.js.map +1 -1
  31. package/dist/cjs/DropdownMenu/index.cjs +110 -44
  32. package/dist/cjs/DropdownMenu/index.native.js +113 -46
  33. package/dist/cjs/DropdownMenu/index.native.js.map +1 -1
  34. package/dist/cjs/ErrorBoundary/index.cjs +2 -2
  35. package/dist/cjs/ErrorBoundary/index.native.js +2 -2
  36. package/dist/cjs/ErrorBoundary/index.native.js.map +1 -1
  37. package/dist/cjs/Pagination.cjs +40 -11
  38. package/dist/cjs/Pagination.native.js +44 -11
  39. package/dist/cjs/Pagination.native.js.map +1 -1
  40. package/dist/cjs/ProgressSteps/index.cjs +163 -107
  41. package/dist/cjs/ProgressSteps/index.native.js +171 -115
  42. package/dist/cjs/ProgressSteps/index.native.js.map +1 -1
  43. package/dist/cjs/Quote/index.cjs +58 -39
  44. package/dist/cjs/Quote/index.native.js +69 -45
  45. package/dist/cjs/Quote/index.native.js.map +1 -1
  46. package/dist/cjs/SheetModal/index.cjs +141 -4
  47. package/dist/cjs/SheetModal/index.native.js +42 -29
  48. package/dist/cjs/SheetModal/index.native.js.map +1 -1
  49. package/dist/cjs/Skeleton/index.cjs +216 -4
  50. package/dist/cjs/Skeleton/index.native.js +223 -4
  51. package/dist/cjs/Skeleton/index.native.js.map +1 -1
  52. package/dist/cjs/SkipLink/index.cjs +91 -57
  53. package/dist/cjs/SkipLink/index.native.js +92 -66
  54. package/dist/cjs/SkipLink/index.native.js.map +1 -1
  55. package/dist/cjs/Tabs/index.cjs +136 -95
  56. package/dist/cjs/Tabs/index.native.js +161 -108
  57. package/dist/cjs/Tabs/index.native.js.map +1 -1
  58. package/dist/cjs/Toast/index.cjs +229 -67
  59. package/dist/cjs/Toast/index.native.js +232 -67
  60. package/dist/cjs/Toast/index.native.js.map +1 -1
  61. package/dist/cjs/Toast/store.cjs +83 -10
  62. package/dist/cjs/Toast/store.native.js +108 -10
  63. package/dist/cjs/Toast/store.native.js.map +1 -1
  64. package/dist/cjs/Tooltip/index.cjs +159 -42
  65. package/dist/cjs/Tooltip/index.native.js +195 -43
  66. package/dist/cjs/Tooltip/index.native.js.map +1 -1
  67. package/dist/cjs/Video/PlayerChrome.cjs +403 -0
  68. package/dist/cjs/Video/PlayerChrome.native.js +436 -0
  69. package/dist/cjs/Video/PlayerChrome.native.js.map +1 -0
  70. package/dist/cjs/Video/VideoFrame.cjs +14 -5
  71. package/dist/cjs/Video/VideoFrame.native.js +16 -5
  72. package/dist/cjs/Video/VideoFrame.native.js.map +1 -1
  73. package/dist/cjs/Video/index.cjs +227 -11
  74. package/dist/cjs/Video/index.native.js +28 -13
  75. package/dist/cjs/Video/index.native.js.map +1 -1
  76. package/dist/cjs/Wheel/index.cjs +144 -93
  77. package/dist/cjs/Wheel/index.native.js +149 -96
  78. package/dist/cjs/Wheel/index.native.js.map +1 -1
  79. package/dist/cjs/actions/DestructiveAction.cjs +2 -2
  80. package/dist/cjs/actions/DestructiveAction.native.js +2 -2
  81. package/dist/cjs/actions/DestructiveAction.native.js.map +1 -1
  82. package/dist/cjs/charts/BarChart.cjs +9 -5
  83. package/dist/cjs/charts/BarChart.native.js +9 -5
  84. package/dist/cjs/charts/BarChart.native.js.map +1 -1
  85. package/dist/cjs/charts/LineChart.cjs +2 -2
  86. package/dist/cjs/charts/LineChart.native.js +2 -2
  87. package/dist/cjs/charts/LineChart.native.js.map +1 -1
  88. package/dist/cjs/charts/PieChart.cjs +2 -2
  89. package/dist/cjs/charts/PieChart.native.js +2 -2
  90. package/dist/cjs/charts/PieChart.native.js.map +1 -1
  91. package/dist/cjs/charts/Sparkline.cjs +2 -2
  92. package/dist/cjs/charts/Sparkline.native.js +2 -2
  93. package/dist/cjs/charts/Sparkline.native.js.map +1 -1
  94. package/dist/cjs/charts/index.cjs +4 -0
  95. package/dist/cjs/charts/index.native.js +4 -0
  96. package/dist/cjs/charts/index.native.js.map +1 -1
  97. package/dist/cjs/code/CodeBlock/index.cjs +34 -7
  98. package/dist/cjs/code/CodeBlock/index.native.js +36 -9
  99. package/dist/cjs/code/CodeBlock/index.native.js.map +1 -1
  100. package/dist/cjs/feedback/ConfirmDialog.cjs +92 -5
  101. package/dist/cjs/feedback/ConfirmDialog.native.js +123 -5
  102. package/dist/cjs/feedback/ConfirmDialog.native.js.map +1 -1
  103. package/dist/cjs/feedback/NotifyHost.cjs +2 -2
  104. package/dist/cjs/feedback/NotifyHost.native.js +2 -2
  105. package/dist/cjs/feedback/NotifyHost.native.js.map +1 -1
  106. package/dist/cjs/icons/themed.cjs +4 -1
  107. package/dist/cjs/icons/themed.native.js +4 -1
  108. package/dist/cjs/icons/themed.native.js.map +1 -1
  109. package/dist/cjs/images/Image/ImageFrame.cjs +242 -0
  110. package/dist/cjs/images/Image/ImageFrame.native.js +248 -0
  111. package/dist/cjs/images/Image/ImageFrame.native.js.map +1 -0
  112. package/dist/cjs/images/Image/index.cjs +93 -40
  113. package/dist/cjs/images/Image/index.native.js +146 -108
  114. package/dist/cjs/images/Image/index.native.js.map +1 -1
  115. package/dist/cjs/images/Image/shared.cjs +106 -0
  116. package/dist/cjs/images/Image/shared.native.js +109 -0
  117. package/dist/cjs/images/Image/shared.native.js.map +1 -0
  118. package/dist/cjs/index.cjs +7 -0
  119. package/dist/cjs/index.native.js +7 -0
  120. package/dist/cjs/index.native.js.map +1 -1
  121. package/dist/cjs/knobImmuneExports.cjs +95 -0
  122. package/dist/cjs/knobImmuneExports.native.js +98 -0
  123. package/dist/cjs/knobImmuneExports.native.js.map +1 -0
  124. package/dist/cjs/layouts/AsyncBoundary.cjs +163 -36
  125. package/dist/cjs/layouts/AsyncBoundary.native.js +166 -37
  126. package/dist/cjs/layouts/AsyncBoundary.native.js.map +1 -1
  127. package/dist/cjs/layouts/EmptyState.cjs +157 -0
  128. package/dist/cjs/layouts/EmptyState.native.js +165 -0
  129. package/dist/cjs/layouts/EmptyState.native.js.map +1 -0
  130. package/dist/cjs/layouts/PageTemplates.cjs +13 -5
  131. package/dist/cjs/layouts/PageTemplates.native.js +13 -5
  132. package/dist/cjs/layouts/PageTemplates.native.js.map +1 -1
  133. package/dist/cjs/layouts/PaneScaffold.cjs +273 -13
  134. package/dist/cjs/layouts/PaneScaffold.native.js +294 -13
  135. package/dist/cjs/layouts/PaneScaffold.native.js.map +1 -1
  136. package/dist/cjs/layouts/ViewSwitcher.cjs +65 -23
  137. package/dist/cjs/layouts/ViewSwitcher.native.js +78 -30
  138. package/dist/cjs/layouts/ViewSwitcher.native.js.map +1 -1
  139. package/dist/cjs/layouts/attachments.cjs +350 -185
  140. package/dist/cjs/layouts/attachments.native.js +370 -186
  141. package/dist/cjs/layouts/attachments.native.js.map +1 -1
  142. package/dist/cjs/layouts/breadcrumbs.cjs +161 -62
  143. package/dist/cjs/layouts/breadcrumbs.native.js +184 -65
  144. package/dist/cjs/layouts/breadcrumbs.native.js.map +1 -1
  145. package/dist/cjs/layouts/page.cjs +71 -111
  146. package/dist/cjs/layouts/page.native.js +82 -130
  147. package/dist/cjs/layouts/page.native.js.map +1 -1
  148. package/dist/cjs/layouts/pageHeadingScope.cjs +8 -2
  149. package/dist/cjs/layouts/pageHeadingScope.native.js +10 -2
  150. package/dist/cjs/layouts/pageHeadingScope.native.js.map +1 -1
  151. package/dist/cjs/layouts/sidebar.cjs +150 -66
  152. package/dist/cjs/layouts/sidebar.native.js +118 -47
  153. package/dist/cjs/layouts/sidebar.native.js.map +1 -1
  154. package/dist/cjs/layouts/tags.cjs +321 -138
  155. package/dist/cjs/layouts/tags.native.js +355 -158
  156. package/dist/cjs/layouts/tags.native.js.map +1 -1
  157. package/dist/cjs/layouts/timeline.cjs +129 -56
  158. package/dist/cjs/layouts/timeline.native.js +179 -55
  159. package/dist/cjs/layouts/timeline.native.js.map +1 -1
  160. package/dist/cjs/layouts/toolbar.cjs +56 -20
  161. package/dist/cjs/layouts/toolbar.native.js +62 -25
  162. package/dist/cjs/layouts/toolbar.native.js.map +1 -1
  163. package/dist/cjs/shared/i18n.cjs +46 -0
  164. package/dist/cjs/shared/i18n.native.js +52 -0
  165. package/dist/cjs/shared/i18n.native.js.map +1 -0
  166. package/dist/cjs/shared/textRidesText.cjs +57 -0
  167. package/dist/cjs/shared/textRidesText.native.js +81 -0
  168. package/dist/cjs/shared/textRidesText.native.js.map +1 -0
  169. package/dist/cjs/shared/useReturnFocusOnClose.cjs +7 -1
  170. package/dist/cjs/shared/useReturnFocusOnClose.native.js +7 -1
  171. package/dist/cjs/shared/useReturnFocusOnClose.native.js.map +1 -1
  172. package/dist/cjs/surfaces.cjs +93 -16
  173. package/dist/cjs/surfaces.native.js +95 -16
  174. package/dist/cjs/surfaces.native.js.map +1 -1
  175. package/dist/cjs/tamagui.cjs +38 -39
  176. package/dist/cjs/tamagui.native.js +37 -38
  177. package/dist/cjs/tamagui.native.js.map +1 -1
  178. package/dist/cjs/views/Calendar.cjs +101 -64
  179. package/dist/cjs/views/Calendar.native.js +105 -70
  180. package/dist/cjs/views/Calendar.native.js.map +1 -1
  181. package/dist/cjs/views/Dashboard.cjs +399 -107
  182. package/dist/cjs/views/Dashboard.native.js +408 -110
  183. package/dist/cjs/views/Dashboard.native.js.map +1 -1
  184. package/dist/cjs/views/Gantt.cjs +256 -59
  185. package/dist/cjs/views/Gantt.native.js +264 -39
  186. package/dist/cjs/views/Gantt.native.js.map +1 -1
  187. package/dist/cjs/views/ImageGrid.cjs +138 -73
  188. package/dist/cjs/views/ImageGrid.native.js +155 -71
  189. package/dist/cjs/views/ImageGrid.native.js.map +1 -1
  190. package/dist/cjs/views/Kanban.cjs +53 -31
  191. package/dist/cjs/views/Kanban.native.js +55 -41
  192. package/dist/cjs/views/Kanban.native.js.map +1 -1
  193. package/dist/cjs/views/List.cjs +280 -93
  194. package/dist/cjs/views/List.native.js +280 -101
  195. package/dist/cjs/views/List.native.js.map +1 -1
  196. package/dist/cjs/views/ReportBuilder.cjs +539 -172
  197. package/dist/cjs/views/ReportBuilder.native.js +592 -169
  198. package/dist/cjs/views/ReportBuilder.native.js.map +1 -1
  199. package/dist/cjs/views/TreeView.cjs +142 -52
  200. package/dist/cjs/views/TreeView.native.js +170 -55
  201. package/dist/cjs/views/TreeView.native.js.map +1 -1
  202. package/dist/esm/Accordion/index.mjs +216 -73
  203. package/dist/esm/Accordion/index.mjs.map +1 -1
  204. package/dist/esm/Accordion/index.native.js +257 -78
  205. package/dist/esm/Accordion/index.native.js.map +1 -1
  206. package/dist/esm/Alert/index.mjs +206 -58
  207. package/dist/esm/Alert/index.mjs.map +1 -1
  208. package/dist/esm/Alert/index.native.js +213 -62
  209. package/dist/esm/Alert/index.native.js.map +1 -1
  210. package/dist/esm/AnimateHeight/index.mjs +140 -0
  211. package/dist/esm/AnimateHeight/index.mjs.map +1 -0
  212. package/dist/esm/AnimateHeight/index.native.js +147 -0
  213. package/dist/esm/AnimateHeight/index.native.js.map +1 -0
  214. package/dist/esm/Avatar/getInitials.mjs +32 -1
  215. package/dist/esm/Avatar/getInitials.mjs.map +1 -1
  216. package/dist/esm/Avatar/getInitials.native.js +32 -1
  217. package/dist/esm/Avatar/getInitials.native.js.map +1 -1
  218. package/dist/esm/Avatar/index.mjs +249 -68
  219. package/dist/esm/Avatar/index.mjs.map +1 -1
  220. package/dist/esm/Avatar/index.native.js +255 -74
  221. package/dist/esm/Avatar/index.native.js.map +1 -1
  222. package/dist/esm/Badge/index.mjs +110 -76
  223. package/dist/esm/Badge/index.mjs.map +1 -1
  224. package/dist/esm/Badge/index.native.js +111 -77
  225. package/dist/esm/Badge/index.native.js.map +1 -1
  226. package/dist/esm/Button.mjs +16 -0
  227. package/dist/esm/Button.mjs.map +1 -0
  228. package/dist/esm/Button.native.js +17 -0
  229. package/dist/esm/Button.native.js.map +1 -0
  230. package/dist/esm/Carousel/index.mjs +185 -106
  231. package/dist/esm/Carousel/index.mjs.map +1 -1
  232. package/dist/esm/Carousel/index.native.js +213 -108
  233. package/dist/esm/Carousel/index.native.js.map +1 -1
  234. package/dist/esm/Chip/index.mjs +356 -2
  235. package/dist/esm/Chip/index.mjs.map +1 -1
  236. package/dist/esm/Chip/index.native.js +370 -2
  237. package/dist/esm/Chip/index.native.js.map +1 -1
  238. package/dist/esm/DotIndicator/index.mjs +130 -14
  239. package/dist/esm/DotIndicator/index.mjs.map +1 -1
  240. package/dist/esm/DotIndicator/index.native.js +134 -14
  241. package/dist/esm/DotIndicator/index.native.js.map +1 -1
  242. package/dist/esm/DropdownMenu/index.mjs +112 -46
  243. package/dist/esm/DropdownMenu/index.mjs.map +1 -1
  244. package/dist/esm/DropdownMenu/index.native.js +115 -48
  245. package/dist/esm/DropdownMenu/index.native.js.map +1 -1
  246. package/dist/esm/ErrorBoundary/index.mjs +1 -1
  247. package/dist/esm/ErrorBoundary/index.native.js +1 -1
  248. package/dist/esm/Pagination.mjs +41 -12
  249. package/dist/esm/Pagination.mjs.map +1 -1
  250. package/dist/esm/Pagination.native.js +45 -12
  251. package/dist/esm/Pagination.native.js.map +1 -1
  252. package/dist/esm/ProgressSteps/index.mjs +165 -109
  253. package/dist/esm/ProgressSteps/index.mjs.map +1 -1
  254. package/dist/esm/ProgressSteps/index.native.js +173 -117
  255. package/dist/esm/ProgressSteps/index.native.js.map +1 -1
  256. package/dist/esm/Quote/index.mjs +59 -40
  257. package/dist/esm/Quote/index.mjs.map +1 -1
  258. package/dist/esm/Quote/index.native.js +70 -46
  259. package/dist/esm/Quote/index.native.js.map +1 -1
  260. package/dist/esm/SheetModal/index.mjs +144 -7
  261. package/dist/esm/SheetModal/index.mjs.map +1 -1
  262. package/dist/esm/SheetModal/index.native.js +41 -28
  263. package/dist/esm/SheetModal/index.native.js.map +1 -1
  264. package/dist/esm/Skeleton/index.mjs +213 -2
  265. package/dist/esm/Skeleton/index.mjs.map +1 -1
  266. package/dist/esm/Skeleton/index.native.js +220 -2
  267. package/dist/esm/Skeleton/index.native.js.map +1 -1
  268. package/dist/esm/SkipLink/index.mjs +93 -59
  269. package/dist/esm/SkipLink/index.mjs.map +1 -1
  270. package/dist/esm/SkipLink/index.native.js +94 -68
  271. package/dist/esm/SkipLink/index.native.js.map +1 -1
  272. package/dist/esm/Tabs/index.mjs +137 -96
  273. package/dist/esm/Tabs/index.mjs.map +1 -1
  274. package/dist/esm/Tabs/index.native.js +162 -109
  275. package/dist/esm/Tabs/index.native.js.map +1 -1
  276. package/dist/esm/Toast/index.mjs +227 -68
  277. package/dist/esm/Toast/index.mjs.map +1 -1
  278. package/dist/esm/Toast/index.native.js +230 -68
  279. package/dist/esm/Toast/index.native.js.map +1 -1
  280. package/dist/esm/Toast/store.mjs +75 -11
  281. package/dist/esm/Toast/store.mjs.map +1 -1
  282. package/dist/esm/Toast/store.native.js +100 -11
  283. package/dist/esm/Toast/store.native.js.map +1 -1
  284. package/dist/esm/Tooltip/index.mjs +147 -42
  285. package/dist/esm/Tooltip/index.mjs.map +1 -1
  286. package/dist/esm/Tooltip/index.native.js +184 -44
  287. package/dist/esm/Tooltip/index.native.js.map +1 -1
  288. package/dist/esm/Video/PlayerChrome.mjs +377 -0
  289. package/dist/esm/Video/PlayerChrome.mjs.map +1 -0
  290. package/dist/esm/Video/PlayerChrome.native.js +407 -0
  291. package/dist/esm/Video/PlayerChrome.native.js.map +1 -0
  292. package/dist/esm/Video/VideoFrame.mjs +14 -5
  293. package/dist/esm/Video/VideoFrame.mjs.map +1 -1
  294. package/dist/esm/Video/VideoFrame.native.js +16 -5
  295. package/dist/esm/Video/VideoFrame.native.js.map +1 -1
  296. package/dist/esm/Video/index.mjs +227 -11
  297. package/dist/esm/Video/index.mjs.map +1 -1
  298. package/dist/esm/Video/index.native.js +28 -13
  299. package/dist/esm/Video/index.native.js.map +1 -1
  300. package/dist/esm/Wheel/index.mjs +143 -92
  301. package/dist/esm/Wheel/index.mjs.map +1 -1
  302. package/dist/esm/Wheel/index.native.js +148 -95
  303. package/dist/esm/Wheel/index.native.js.map +1 -1
  304. package/dist/esm/actions/DestructiveAction.mjs +1 -1
  305. package/dist/esm/actions/DestructiveAction.native.js +1 -1
  306. package/dist/esm/actions/DestructiveAction.native.js.map +1 -1
  307. package/dist/esm/charts/BarChart.mjs +8 -4
  308. package/dist/esm/charts/BarChart.mjs.map +1 -1
  309. package/dist/esm/charts/BarChart.native.js +8 -4
  310. package/dist/esm/charts/BarChart.native.js.map +1 -1
  311. package/dist/esm/charts/LineChart.mjs +1 -1
  312. package/dist/esm/charts/LineChart.native.js +1 -1
  313. package/dist/esm/charts/PieChart.mjs +1 -1
  314. package/dist/esm/charts/PieChart.native.js +1 -1
  315. package/dist/esm/charts/PieChart.native.js.map +1 -1
  316. package/dist/esm/charts/Sparkline.mjs +1 -1
  317. package/dist/esm/charts/Sparkline.native.js +1 -1
  318. package/dist/esm/charts/index.mjs +2 -1
  319. package/dist/esm/charts/index.mjs.map +1 -1
  320. package/dist/esm/charts/index.native.js +2 -1
  321. package/dist/esm/charts/index.native.js.map +1 -1
  322. package/dist/esm/code/CodeBlock/index.mjs +34 -7
  323. package/dist/esm/code/CodeBlock/index.mjs.map +1 -1
  324. package/dist/esm/code/CodeBlock/index.native.js +36 -9
  325. package/dist/esm/code/CodeBlock/index.native.js.map +1 -1
  326. package/dist/esm/feedback/ConfirmDialog.mjs +93 -6
  327. package/dist/esm/feedback/ConfirmDialog.mjs.map +1 -1
  328. package/dist/esm/feedback/ConfirmDialog.native.js +124 -6
  329. package/dist/esm/feedback/ConfirmDialog.native.js.map +1 -1
  330. package/dist/esm/feedback/NotifyHost.mjs +1 -1
  331. package/dist/esm/feedback/NotifyHost.native.js +1 -1
  332. package/dist/esm/icons/themed.mjs +5 -2
  333. package/dist/esm/icons/themed.mjs.map +1 -1
  334. package/dist/esm/icons/themed.native.js +5 -2
  335. package/dist/esm/icons/themed.native.js.map +1 -1
  336. package/dist/esm/images/Image/ImageFrame.mjs +216 -0
  337. package/dist/esm/images/Image/ImageFrame.mjs.map +1 -0
  338. package/dist/esm/images/Image/ImageFrame.native.js +219 -0
  339. package/dist/esm/images/Image/ImageFrame.native.js.map +1 -0
  340. package/dist/esm/images/Image/index.mjs +94 -41
  341. package/dist/esm/images/Image/index.mjs.map +1 -1
  342. package/dist/esm/images/Image/index.native.js +148 -110
  343. package/dist/esm/images/Image/index.native.js.map +1 -1
  344. package/dist/esm/images/Image/shared.mjs +76 -0
  345. package/dist/esm/images/Image/shared.mjs.map +1 -0
  346. package/dist/esm/images/Image/shared.native.js +76 -0
  347. package/dist/esm/images/Image/shared.native.js.map +1 -0
  348. package/dist/esm/index.mjs +4 -1
  349. package/dist/esm/index.mjs.map +1 -1
  350. package/dist/esm/index.native.js +4 -1
  351. package/dist/esm/index.native.js.map +1 -1
  352. package/dist/esm/knobImmuneExports.mjs +70 -0
  353. package/dist/esm/knobImmuneExports.mjs.map +1 -0
  354. package/dist/esm/knobImmuneExports.native.js +70 -0
  355. package/dist/esm/knobImmuneExports.native.js.map +1 -0
  356. package/dist/esm/layouts/AsyncBoundary.mjs +165 -38
  357. package/dist/esm/layouts/AsyncBoundary.mjs.map +1 -1
  358. package/dist/esm/layouts/AsyncBoundary.native.js +168 -39
  359. package/dist/esm/layouts/AsyncBoundary.native.js.map +1 -1
  360. package/dist/esm/layouts/EmptyState.mjs +132 -0
  361. package/dist/esm/layouts/EmptyState.mjs.map +1 -0
  362. package/dist/esm/layouts/EmptyState.native.js +137 -0
  363. package/dist/esm/layouts/EmptyState.native.js.map +1 -0
  364. package/dist/esm/layouts/PageTemplates.mjs +13 -5
  365. package/dist/esm/layouts/PageTemplates.mjs.map +1 -1
  366. package/dist/esm/layouts/PageTemplates.native.js +13 -5
  367. package/dist/esm/layouts/PageTemplates.native.js.map +1 -1
  368. package/dist/esm/layouts/PaneScaffold.mjs +277 -17
  369. package/dist/esm/layouts/PaneScaffold.mjs.map +1 -1
  370. package/dist/esm/layouts/PaneScaffold.native.js +298 -17
  371. package/dist/esm/layouts/PaneScaffold.native.js.map +1 -1
  372. package/dist/esm/layouts/ViewSwitcher.mjs +66 -24
  373. package/dist/esm/layouts/ViewSwitcher.mjs.map +1 -1
  374. package/dist/esm/layouts/ViewSwitcher.native.js +79 -31
  375. package/dist/esm/layouts/ViewSwitcher.native.js.map +1 -1
  376. package/dist/esm/layouts/attachments.mjs +351 -175
  377. package/dist/esm/layouts/attachments.mjs.map +1 -1
  378. package/dist/esm/layouts/attachments.native.js +371 -187
  379. package/dist/esm/layouts/attachments.native.js.map +1 -1
  380. package/dist/esm/layouts/breadcrumbs.mjs +163 -53
  381. package/dist/esm/layouts/breadcrumbs.mjs.map +1 -1
  382. package/dist/esm/layouts/breadcrumbs.native.js +187 -68
  383. package/dist/esm/layouts/breadcrumbs.native.js.map +1 -1
  384. package/dist/esm/layouts/page.mjs +72 -112
  385. package/dist/esm/layouts/page.mjs.map +1 -1
  386. package/dist/esm/layouts/page.native.js +83 -131
  387. package/dist/esm/layouts/page.native.js.map +1 -1
  388. package/dist/esm/layouts/pageHeadingScope.mjs +8 -3
  389. package/dist/esm/layouts/pageHeadingScope.mjs.map +1 -1
  390. package/dist/esm/layouts/pageHeadingScope.native.js +10 -3
  391. package/dist/esm/layouts/pageHeadingScope.native.js.map +1 -1
  392. package/dist/esm/layouts/sidebar.mjs +152 -68
  393. package/dist/esm/layouts/sidebar.mjs.map +1 -1
  394. package/dist/esm/layouts/sidebar.native.js +120 -49
  395. package/dist/esm/layouts/sidebar.native.js.map +1 -1
  396. package/dist/esm/layouts/tags.mjs +323 -140
  397. package/dist/esm/layouts/tags.mjs.map +1 -1
  398. package/dist/esm/layouts/tags.native.js +357 -160
  399. package/dist/esm/layouts/tags.native.js.map +1 -1
  400. package/dist/esm/layouts/timeline.mjs +129 -45
  401. package/dist/esm/layouts/timeline.mjs.map +1 -1
  402. package/dist/esm/layouts/timeline.native.js +179 -55
  403. package/dist/esm/layouts/timeline.native.js.map +1 -1
  404. package/dist/esm/layouts/toolbar.mjs +57 -21
  405. package/dist/esm/layouts/toolbar.mjs.map +1 -1
  406. package/dist/esm/layouts/toolbar.native.js +63 -26
  407. package/dist/esm/layouts/toolbar.native.js.map +1 -1
  408. package/dist/esm/shared/i18n.mjs +10 -0
  409. package/dist/esm/shared/i18n.mjs.map +1 -0
  410. package/dist/esm/shared/i18n.native.js +13 -0
  411. package/dist/esm/shared/i18n.native.js.map +1 -0
  412. package/dist/esm/shared/textRidesText.mjs +31 -0
  413. package/dist/esm/shared/textRidesText.mjs.map +1 -0
  414. package/dist/esm/shared/textRidesText.native.js +52 -0
  415. package/dist/esm/shared/textRidesText.native.js.map +1 -0
  416. package/dist/esm/shared/useReturnFocusOnClose.mjs +7 -1
  417. package/dist/esm/shared/useReturnFocusOnClose.mjs.map +1 -1
  418. package/dist/esm/shared/useReturnFocusOnClose.native.js +7 -1
  419. package/dist/esm/shared/useReturnFocusOnClose.native.js.map +1 -1
  420. package/dist/esm/surfaces.mjs +94 -17
  421. package/dist/esm/surfaces.mjs.map +1 -1
  422. package/dist/esm/surfaces.native.js +96 -17
  423. package/dist/esm/surfaces.native.js.map +1 -1
  424. package/dist/esm/tamagui.mjs +2 -3
  425. package/dist/esm/tamagui.mjs.map +1 -1
  426. package/dist/esm/tamagui.native.js +2 -3
  427. package/dist/esm/tamagui.native.js.map +1 -1
  428. package/dist/esm/views/Calendar.mjs +101 -64
  429. package/dist/esm/views/Calendar.mjs.map +1 -1
  430. package/dist/esm/views/Calendar.native.js +105 -70
  431. package/dist/esm/views/Calendar.native.js.map +1 -1
  432. package/dist/esm/views/Dashboard.mjs +396 -107
  433. package/dist/esm/views/Dashboard.mjs.map +1 -1
  434. package/dist/esm/views/Dashboard.native.js +405 -110
  435. package/dist/esm/views/Dashboard.native.js.map +1 -1
  436. package/dist/esm/views/Gantt.mjs +256 -59
  437. package/dist/esm/views/Gantt.mjs.map +1 -1
  438. package/dist/esm/views/Gantt.native.js +264 -39
  439. package/dist/esm/views/Gantt.native.js.map +1 -1
  440. package/dist/esm/views/ImageGrid.mjs +138 -73
  441. package/dist/esm/views/ImageGrid.mjs.map +1 -1
  442. package/dist/esm/views/ImageGrid.native.js +155 -71
  443. package/dist/esm/views/ImageGrid.native.js.map +1 -1
  444. package/dist/esm/views/Kanban.mjs +52 -30
  445. package/dist/esm/views/Kanban.mjs.map +1 -1
  446. package/dist/esm/views/Kanban.native.js +54 -40
  447. package/dist/esm/views/Kanban.native.js.map +1 -1
  448. package/dist/esm/views/List.mjs +268 -95
  449. package/dist/esm/views/List.mjs.map +1 -1
  450. package/dist/esm/views/List.native.js +280 -104
  451. package/dist/esm/views/List.native.js.map +1 -1
  452. package/dist/esm/views/ReportBuilder.mjs +533 -166
  453. package/dist/esm/views/ReportBuilder.mjs.map +1 -1
  454. package/dist/esm/views/ReportBuilder.native.js +585 -162
  455. package/dist/esm/views/ReportBuilder.native.js.map +1 -1
  456. package/dist/esm/views/TreeView.mjs +142 -52
  457. package/dist/esm/views/TreeView.mjs.map +1 -1
  458. package/dist/esm/views/TreeView.native.js +170 -55
  459. package/dist/esm/views/TreeView.native.js.map +1 -1
  460. package/dist/jsx/Accordion/index.mjs +216 -73
  461. package/dist/jsx/Accordion/index.mjs.map +1 -1
  462. package/dist/jsx/Accordion/index.native.js +254 -75
  463. package/dist/jsx/Accordion/index.native.js.map +1 -1
  464. package/dist/jsx/Alert/index.mjs +206 -58
  465. package/dist/jsx/Alert/index.mjs.map +1 -1
  466. package/dist/jsx/Alert/index.native.js +211 -60
  467. package/dist/jsx/Alert/index.native.js.map +1 -1
  468. package/dist/jsx/AnimateHeight/index.mjs +140 -0
  469. package/dist/jsx/AnimateHeight/index.mjs.map +1 -0
  470. package/dist/jsx/AnimateHeight/index.native.js +176 -0
  471. package/dist/jsx/AnimateHeight/index.native.js.map +1 -0
  472. package/dist/jsx/Avatar/getInitials.mjs +32 -1
  473. package/dist/jsx/Avatar/getInitials.mjs.map +1 -1
  474. package/dist/jsx/Avatar/getInitials.native.js +34 -0
  475. package/dist/jsx/Avatar/getInitials.native.js.map +1 -1
  476. package/dist/jsx/Avatar/index.mjs +249 -68
  477. package/dist/jsx/Avatar/index.mjs.map +1 -1
  478. package/dist/jsx/Avatar/index.native.js +252 -68
  479. package/dist/jsx/Avatar/index.native.js.map +1 -1
  480. package/dist/jsx/Badge/index.mjs +110 -76
  481. package/dist/jsx/Badge/index.mjs.map +1 -1
  482. package/dist/jsx/Badge/index.native.js +110 -76
  483. package/dist/jsx/Badge/index.native.js.map +1 -1
  484. package/dist/jsx/Button.mjs +16 -0
  485. package/dist/jsx/Button.mjs.map +1 -0
  486. package/dist/jsx/Button.native.js +45 -0
  487. package/dist/jsx/Button.native.js.map +1 -0
  488. package/dist/jsx/Carousel/index.mjs +185 -106
  489. package/dist/jsx/Carousel/index.mjs.map +1 -1
  490. package/dist/jsx/Carousel/index.native.js +212 -107
  491. package/dist/jsx/Carousel/index.native.js.map +1 -1
  492. package/dist/jsx/Chip/index.mjs +356 -2
  493. package/dist/jsx/Chip/index.mjs.map +1 -1
  494. package/dist/jsx/Chip/index.native.js +374 -5
  495. package/dist/jsx/Chip/index.native.js.map +1 -1
  496. package/dist/jsx/DotIndicator/index.mjs +130 -14
  497. package/dist/jsx/DotIndicator/index.mjs.map +1 -1
  498. package/dist/jsx/DotIndicator/index.native.js +133 -13
  499. package/dist/jsx/DotIndicator/index.native.js.map +1 -1
  500. package/dist/jsx/DropdownMenu/index.mjs +112 -46
  501. package/dist/jsx/DropdownMenu/index.mjs.map +1 -1
  502. package/dist/jsx/DropdownMenu/index.native.js +113 -46
  503. package/dist/jsx/DropdownMenu/index.native.js.map +1 -1
  504. package/dist/jsx/ErrorBoundary/index.mjs +1 -1
  505. package/dist/jsx/ErrorBoundary/index.native.js +2 -2
  506. package/dist/jsx/ErrorBoundary/index.native.js.map +1 -1
  507. package/dist/jsx/Pagination.mjs +41 -12
  508. package/dist/jsx/Pagination.mjs.map +1 -1
  509. package/dist/jsx/Pagination.native.js +44 -11
  510. package/dist/jsx/Pagination.native.js.map +1 -1
  511. package/dist/jsx/ProgressSteps/index.mjs +165 -109
  512. package/dist/jsx/ProgressSteps/index.mjs.map +1 -1
  513. package/dist/jsx/ProgressSteps/index.native.js +171 -115
  514. package/dist/jsx/ProgressSteps/index.native.js.map +1 -1
  515. package/dist/jsx/Quote/index.mjs +59 -40
  516. package/dist/jsx/Quote/index.mjs.map +1 -1
  517. package/dist/jsx/Quote/index.native.js +69 -45
  518. package/dist/jsx/Quote/index.native.js.map +1 -1
  519. package/dist/jsx/SheetModal/index.mjs +144 -7
  520. package/dist/jsx/SheetModal/index.mjs.map +1 -1
  521. package/dist/jsx/SheetModal/index.native.js +42 -29
  522. package/dist/jsx/SheetModal/index.native.js.map +1 -1
  523. package/dist/jsx/Skeleton/index.mjs +213 -2
  524. package/dist/jsx/Skeleton/index.mjs.map +1 -1
  525. package/dist/jsx/Skeleton/index.native.js +223 -4
  526. package/dist/jsx/Skeleton/index.native.js.map +1 -1
  527. package/dist/jsx/SkipLink/index.mjs +93 -59
  528. package/dist/jsx/SkipLink/index.mjs.map +1 -1
  529. package/dist/jsx/SkipLink/index.native.js +92 -66
  530. package/dist/jsx/SkipLink/index.native.js.map +1 -1
  531. package/dist/jsx/Tabs/index.mjs +137 -96
  532. package/dist/jsx/Tabs/index.mjs.map +1 -1
  533. package/dist/jsx/Tabs/index.native.js +161 -108
  534. package/dist/jsx/Tabs/index.native.js.map +1 -1
  535. package/dist/jsx/Toast/index.mjs +227 -68
  536. package/dist/jsx/Toast/index.mjs.map +1 -1
  537. package/dist/jsx/Toast/index.native.js +232 -67
  538. package/dist/jsx/Toast/index.native.js.map +1 -1
  539. package/dist/jsx/Toast/store.mjs +75 -11
  540. package/dist/jsx/Toast/store.mjs.map +1 -1
  541. package/dist/jsx/Toast/store.native.js +108 -10
  542. package/dist/jsx/Toast/store.native.js.map +1 -1
  543. package/dist/jsx/Tooltip/index.mjs +147 -42
  544. package/dist/jsx/Tooltip/index.mjs.map +1 -1
  545. package/dist/jsx/Tooltip/index.native.js +195 -43
  546. package/dist/jsx/Tooltip/index.native.js.map +1 -1
  547. package/dist/jsx/Video/PlayerChrome.mjs +377 -0
  548. package/dist/jsx/Video/PlayerChrome.mjs.map +1 -0
  549. package/dist/jsx/Video/PlayerChrome.native.js +436 -0
  550. package/dist/jsx/Video/PlayerChrome.native.js.map +1 -0
  551. package/dist/jsx/Video/VideoFrame.mjs +14 -5
  552. package/dist/jsx/Video/VideoFrame.mjs.map +1 -1
  553. package/dist/jsx/Video/VideoFrame.native.js +16 -5
  554. package/dist/jsx/Video/VideoFrame.native.js.map +1 -1
  555. package/dist/jsx/Video/index.mjs +227 -11
  556. package/dist/jsx/Video/index.mjs.map +1 -1
  557. package/dist/jsx/Video/index.native.js +28 -13
  558. package/dist/jsx/Video/index.native.js.map +1 -1
  559. package/dist/jsx/Wheel/index.mjs +143 -92
  560. package/dist/jsx/Wheel/index.mjs.map +1 -1
  561. package/dist/jsx/Wheel/index.native.js +149 -96
  562. package/dist/jsx/Wheel/index.native.js.map +1 -1
  563. package/dist/jsx/actions/DestructiveAction.mjs +1 -1
  564. package/dist/jsx/actions/DestructiveAction.native.js +2 -2
  565. package/dist/jsx/actions/DestructiveAction.native.js.map +1 -1
  566. package/dist/jsx/charts/BarChart.mjs +8 -4
  567. package/dist/jsx/charts/BarChart.mjs.map +1 -1
  568. package/dist/jsx/charts/BarChart.native.js +9 -5
  569. package/dist/jsx/charts/BarChart.native.js.map +1 -1
  570. package/dist/jsx/charts/LineChart.mjs +1 -1
  571. package/dist/jsx/charts/LineChart.native.js +2 -2
  572. package/dist/jsx/charts/LineChart.native.js.map +1 -1
  573. package/dist/jsx/charts/PieChart.mjs +1 -1
  574. package/dist/jsx/charts/PieChart.native.js +2 -2
  575. package/dist/jsx/charts/PieChart.native.js.map +1 -1
  576. package/dist/jsx/charts/Sparkline.mjs +1 -1
  577. package/dist/jsx/charts/Sparkline.native.js +2 -2
  578. package/dist/jsx/charts/Sparkline.native.js.map +1 -1
  579. package/dist/jsx/charts/index.mjs +2 -1
  580. package/dist/jsx/charts/index.mjs.map +1 -1
  581. package/dist/jsx/charts/index.native.js +4 -0
  582. package/dist/jsx/charts/index.native.js.map +1 -1
  583. package/dist/jsx/code/CodeBlock/index.mjs +34 -7
  584. package/dist/jsx/code/CodeBlock/index.mjs.map +1 -1
  585. package/dist/jsx/code/CodeBlock/index.native.js +36 -9
  586. package/dist/jsx/code/CodeBlock/index.native.js.map +1 -1
  587. package/dist/jsx/feedback/ConfirmDialog.mjs +93 -6
  588. package/dist/jsx/feedback/ConfirmDialog.mjs.map +1 -1
  589. package/dist/jsx/feedback/ConfirmDialog.native.js +123 -5
  590. package/dist/jsx/feedback/ConfirmDialog.native.js.map +1 -1
  591. package/dist/jsx/feedback/NotifyHost.mjs +1 -1
  592. package/dist/jsx/feedback/NotifyHost.native.js +2 -2
  593. package/dist/jsx/feedback/NotifyHost.native.js.map +1 -1
  594. package/dist/jsx/icons/themed.mjs +5 -2
  595. package/dist/jsx/icons/themed.mjs.map +1 -1
  596. package/dist/jsx/icons/themed.native.js +4 -1
  597. package/dist/jsx/icons/themed.native.js.map +1 -1
  598. package/dist/jsx/images/Image/ImageFrame.mjs +216 -0
  599. package/dist/jsx/images/Image/ImageFrame.mjs.map +1 -0
  600. package/dist/jsx/images/Image/ImageFrame.native.js +248 -0
  601. package/dist/jsx/images/Image/ImageFrame.native.js.map +1 -0
  602. package/dist/jsx/images/Image/index.mjs +94 -41
  603. package/dist/jsx/images/Image/index.mjs.map +1 -1
  604. package/dist/jsx/images/Image/index.native.js +146 -108
  605. package/dist/jsx/images/Image/index.native.js.map +1 -1
  606. package/dist/jsx/images/Image/shared.mjs +76 -0
  607. package/dist/jsx/images/Image/shared.mjs.map +1 -0
  608. package/dist/jsx/images/Image/shared.native.js +109 -0
  609. package/dist/jsx/images/Image/shared.native.js.map +1 -0
  610. package/dist/jsx/index.js +4 -1
  611. package/dist/jsx/index.js.map +1 -1
  612. package/dist/jsx/index.mjs +4 -1
  613. package/dist/jsx/index.mjs.map +1 -1
  614. package/dist/jsx/index.native.js +7 -0
  615. package/dist/jsx/index.native.js.map +1 -1
  616. package/dist/jsx/knobImmuneExports.mjs +70 -0
  617. package/dist/jsx/knobImmuneExports.mjs.map +1 -0
  618. package/dist/jsx/knobImmuneExports.native.js +98 -0
  619. package/dist/jsx/knobImmuneExports.native.js.map +1 -0
  620. package/dist/jsx/layouts/AsyncBoundary.mjs +165 -38
  621. package/dist/jsx/layouts/AsyncBoundary.mjs.map +1 -1
  622. package/dist/jsx/layouts/AsyncBoundary.native.js +166 -37
  623. package/dist/jsx/layouts/AsyncBoundary.native.js.map +1 -1
  624. package/dist/jsx/layouts/EmptyState.mjs +132 -0
  625. package/dist/jsx/layouts/EmptyState.mjs.map +1 -0
  626. package/dist/jsx/layouts/EmptyState.native.js +165 -0
  627. package/dist/jsx/layouts/EmptyState.native.js.map +1 -0
  628. package/dist/jsx/layouts/PageTemplates.mjs +13 -5
  629. package/dist/jsx/layouts/PageTemplates.mjs.map +1 -1
  630. package/dist/jsx/layouts/PageTemplates.native.js +13 -5
  631. package/dist/jsx/layouts/PageTemplates.native.js.map +1 -1
  632. package/dist/jsx/layouts/PaneScaffold.mjs +277 -17
  633. package/dist/jsx/layouts/PaneScaffold.mjs.map +1 -1
  634. package/dist/jsx/layouts/PaneScaffold.native.js +294 -13
  635. package/dist/jsx/layouts/PaneScaffold.native.js.map +1 -1
  636. package/dist/jsx/layouts/ViewSwitcher.mjs +66 -24
  637. package/dist/jsx/layouts/ViewSwitcher.mjs.map +1 -1
  638. package/dist/jsx/layouts/ViewSwitcher.native.js +78 -30
  639. package/dist/jsx/layouts/ViewSwitcher.native.js.map +1 -1
  640. package/dist/jsx/layouts/attachments.mjs +351 -175
  641. package/dist/jsx/layouts/attachments.mjs.map +1 -1
  642. package/dist/jsx/layouts/attachments.native.js +370 -186
  643. package/dist/jsx/layouts/attachments.native.js.map +1 -1
  644. package/dist/jsx/layouts/breadcrumbs.mjs +163 -53
  645. package/dist/jsx/layouts/breadcrumbs.mjs.map +1 -1
  646. package/dist/jsx/layouts/breadcrumbs.native.js +184 -65
  647. package/dist/jsx/layouts/breadcrumbs.native.js.map +1 -1
  648. package/dist/jsx/layouts/page.mjs +72 -112
  649. package/dist/jsx/layouts/page.mjs.map +1 -1
  650. package/dist/jsx/layouts/page.native.js +82 -130
  651. package/dist/jsx/layouts/page.native.js.map +1 -1
  652. package/dist/jsx/layouts/pageHeadingScope.mjs +8 -3
  653. package/dist/jsx/layouts/pageHeadingScope.mjs.map +1 -1
  654. package/dist/jsx/layouts/pageHeadingScope.native.js +10 -2
  655. package/dist/jsx/layouts/pageHeadingScope.native.js.map +1 -1
  656. package/dist/jsx/layouts/sidebar.mjs +152 -68
  657. package/dist/jsx/layouts/sidebar.mjs.map +1 -1
  658. package/dist/jsx/layouts/sidebar.native.js +118 -47
  659. package/dist/jsx/layouts/sidebar.native.js.map +1 -1
  660. package/dist/jsx/layouts/tags.mjs +323 -140
  661. package/dist/jsx/layouts/tags.mjs.map +1 -1
  662. package/dist/jsx/layouts/tags.native.js +355 -158
  663. package/dist/jsx/layouts/tags.native.js.map +1 -1
  664. package/dist/jsx/layouts/timeline.mjs +129 -45
  665. package/dist/jsx/layouts/timeline.mjs.map +1 -1
  666. package/dist/jsx/layouts/timeline.native.js +179 -55
  667. package/dist/jsx/layouts/timeline.native.js.map +1 -1
  668. package/dist/jsx/layouts/toolbar.mjs +57 -21
  669. package/dist/jsx/layouts/toolbar.mjs.map +1 -1
  670. package/dist/jsx/layouts/toolbar.native.js +62 -25
  671. package/dist/jsx/layouts/toolbar.native.js.map +1 -1
  672. package/dist/jsx/shared/i18n.mjs +10 -0
  673. package/dist/jsx/shared/i18n.mjs.map +1 -0
  674. package/dist/jsx/shared/i18n.native.js +52 -0
  675. package/dist/jsx/shared/i18n.native.js.map +1 -0
  676. package/dist/jsx/shared/textRidesText.mjs +31 -0
  677. package/dist/jsx/shared/textRidesText.mjs.map +1 -0
  678. package/dist/jsx/shared/textRidesText.native.js +81 -0
  679. package/dist/jsx/shared/textRidesText.native.js.map +1 -0
  680. package/dist/jsx/shared/useReturnFocusOnClose.mjs +7 -1
  681. package/dist/jsx/shared/useReturnFocusOnClose.mjs.map +1 -1
  682. package/dist/jsx/shared/useReturnFocusOnClose.native.js +7 -1
  683. package/dist/jsx/shared/useReturnFocusOnClose.native.js.map +1 -1
  684. package/dist/jsx/surfaces.mjs +94 -17
  685. package/dist/jsx/surfaces.mjs.map +1 -1
  686. package/dist/jsx/surfaces.native.js +95 -16
  687. package/dist/jsx/surfaces.native.js.map +1 -1
  688. package/dist/jsx/tamagui.mjs +2 -3
  689. package/dist/jsx/tamagui.mjs.map +1 -1
  690. package/dist/jsx/tamagui.native.js +37 -38
  691. package/dist/jsx/tamagui.native.js.map +1 -1
  692. package/dist/jsx/views/Calendar.mjs +101 -64
  693. package/dist/jsx/views/Calendar.mjs.map +1 -1
  694. package/dist/jsx/views/Calendar.native.js +105 -70
  695. package/dist/jsx/views/Calendar.native.js.map +1 -1
  696. package/dist/jsx/views/Dashboard.mjs +396 -107
  697. package/dist/jsx/views/Dashboard.mjs.map +1 -1
  698. package/dist/jsx/views/Dashboard.native.js +408 -110
  699. package/dist/jsx/views/Dashboard.native.js.map +1 -1
  700. package/dist/jsx/views/Gantt.mjs +256 -59
  701. package/dist/jsx/views/Gantt.mjs.map +1 -1
  702. package/dist/jsx/views/Gantt.native.js +264 -39
  703. package/dist/jsx/views/Gantt.native.js.map +1 -1
  704. package/dist/jsx/views/ImageGrid.mjs +138 -73
  705. package/dist/jsx/views/ImageGrid.mjs.map +1 -1
  706. package/dist/jsx/views/ImageGrid.native.js +155 -71
  707. package/dist/jsx/views/ImageGrid.native.js.map +1 -1
  708. package/dist/jsx/views/Kanban.mjs +52 -30
  709. package/dist/jsx/views/Kanban.mjs.map +1 -1
  710. package/dist/jsx/views/Kanban.native.js +55 -41
  711. package/dist/jsx/views/Kanban.native.js.map +1 -1
  712. package/dist/jsx/views/List.mjs +268 -95
  713. package/dist/jsx/views/List.mjs.map +1 -1
  714. package/dist/jsx/views/List.native.js +280 -101
  715. package/dist/jsx/views/List.native.js.map +1 -1
  716. package/dist/jsx/views/ReportBuilder.mjs +533 -166
  717. package/dist/jsx/views/ReportBuilder.mjs.map +1 -1
  718. package/dist/jsx/views/ReportBuilder.native.js +592 -169
  719. package/dist/jsx/views/ReportBuilder.native.js.map +1 -1
  720. package/dist/jsx/views/TreeView.mjs +142 -52
  721. package/dist/jsx/views/TreeView.mjs.map +1 -1
  722. package/dist/jsx/views/TreeView.native.js +170 -55
  723. package/dist/jsx/views/TreeView.native.js.map +1 -1
  724. package/package.json +18 -18
  725. package/src/Accordion/Accordion.lc50.spec.tsx +69 -0
  726. package/src/Accordion/Accordion.spec.tsx +36 -0
  727. package/src/Accordion/Accordion.stories.tsx +82 -36
  728. package/src/Accordion/index.tsx +296 -75
  729. package/src/Alert/Alert.spec.tsx +137 -1
  730. package/src/Alert/Alert.stories.tsx +10 -11
  731. package/src/Alert/index.tsx +244 -62
  732. package/src/AnimateHeight/AnimateHeight.spec.tsx +152 -0
  733. package/src/AnimateHeight/index.tsx +237 -0
  734. package/src/Avatar/Avatar.spec.tsx +73 -2
  735. package/src/Avatar/Avatar.stories.tsx +106 -4
  736. package/src/Avatar/getInitials.ts +29 -0
  737. package/src/Avatar/index.tsx +323 -105
  738. package/src/Badge/Badge.spec.tsx +83 -0
  739. package/src/Badge/Badge.stories.tsx +15 -1
  740. package/src/Badge/index.tsx +138 -84
  741. package/src/Button.spec.tsx +181 -0
  742. package/src/Button.stories.tsx +92 -0
  743. package/src/Button.tsx +43 -0
  744. package/src/Carousel/Carousel.spec.tsx +152 -0
  745. package/src/Carousel/index.tsx +239 -102
  746. package/src/Chip/Chip.spec.tsx +141 -0
  747. package/src/Chip/Chip.stories.tsx +163 -10
  748. package/src/Chip/index.tsx +452 -11
  749. package/src/DialogContent.stories.tsx +8 -6
  750. package/src/DotIndicator/DotIndicator.stories.tsx +18 -0
  751. package/src/DotIndicator/dotIndicator.spec.tsx +57 -2
  752. package/src/DotIndicator/index.tsx +159 -24
  753. package/src/DropdownMenu/DropdownMenu.spec.tsx +172 -0
  754. package/src/DropdownMenu/DropdownMenu.stories.tsx +35 -0
  755. package/src/DropdownMenu/index.tsx +172 -46
  756. package/src/ErrorBoundary/index.tsx +1 -1
  757. package/src/Pagination.api.spec.tsx +41 -0
  758. package/src/Pagination.tsx +49 -8
  759. package/src/PopoverContent.stories.tsx +4 -2
  760. package/src/ProgressSteps/ProgressSteps.spec.tsx +48 -1
  761. package/src/ProgressSteps/ProgressSteps.stories.tsx +48 -0
  762. package/src/ProgressSteps/index.tsx +224 -133
  763. package/src/Quote/Quote.lc50.spec.tsx +53 -0
  764. package/src/Quote/Quote.spec.tsx +9 -2
  765. package/src/Quote/Quote.stories.tsx +1 -1
  766. package/src/Quote/index.tsx +77 -60
  767. package/src/SheetModal/index.native.tsx +41 -39
  768. package/src/SheetModal/index.tsx +149 -18
  769. package/src/Skeleton/Skeleton.stories.tsx +109 -93
  770. package/src/Skeleton/SkeletonText.stories.tsx +11 -0
  771. package/src/Skeleton/index.tsx +257 -8
  772. package/src/SkipLink/SkipLink.spec.tsx +35 -0
  773. package/src/SkipLink/SkipLink.stories.tsx +1 -1
  774. package/src/SkipLink/index.tsx +120 -71
  775. package/src/Tabs/Tabs.spec.tsx +65 -0
  776. package/src/Tabs/Tabs.stories.tsx +32 -0
  777. package/src/Tabs/index.tsx +188 -133
  778. package/src/Toast/Toast.spec.tsx +208 -8
  779. package/src/Toast/Toast.stories.tsx +97 -16
  780. package/src/Toast/index.tsx +322 -78
  781. package/src/Toast/store.ts +150 -16
  782. package/src/Tooltip/Tooltip.lc50.spec.tsx +52 -0
  783. package/src/Tooltip/Tooltip.spec.tsx +99 -0
  784. package/src/Tooltip/Tooltip.stories.tsx +23 -0
  785. package/src/Tooltip/index.tsx +200 -44
  786. package/src/Video/PlayerChrome.tsx +412 -0
  787. package/src/Video/Video.spec.tsx +47 -4
  788. package/src/Video/Video.stories.tsx +2 -1
  789. package/src/Video/VideoFrame.tsx +15 -3
  790. package/src/Video/index.native.tsx +20 -12
  791. package/src/Video/index.tsx +285 -21
  792. package/src/Video/types.ts +7 -1
  793. package/src/Wheel/Wheel.spec.tsx +217 -2
  794. package/src/Wheel/Wheel.stories.tsx +39 -13
  795. package/src/Wheel/index.tsx +205 -134
  796. package/src/actions/DestructiveAction.tsx +1 -1
  797. package/src/charts/BarChart.tsx +14 -3
  798. package/src/charts/LineChart.tsx +1 -1
  799. package/src/charts/PieChart.tsx +1 -1
  800. package/src/charts/Sparkline.tsx +1 -1
  801. package/src/charts/charts.spec.tsx +25 -0
  802. package/src/charts/index.ts +9 -0
  803. package/src/code/CodeBlock/index.tsx +43 -7
  804. package/src/export-surface.spec.tsx +137 -0
  805. package/src/feedback/ConfirmDialog.spec.tsx +36 -0
  806. package/src/feedback/ConfirmDialog.stories.tsx +20 -1
  807. package/src/feedback/ConfirmDialog.tsx +121 -9
  808. package/src/feedback/NotifyHost.tsx +1 -1
  809. package/src/icons/themed.tsx +7 -2
  810. package/src/images/Image/Image.spec.tsx +136 -73
  811. package/src/images/Image/Image.stories.tsx +113 -9
  812. package/src/images/Image/ImageFrame.tsx +288 -0
  813. package/src/images/Image/index.native.tsx +177 -144
  814. package/src/images/Image/index.tsx +103 -51
  815. package/src/images/Image/shared.ts +88 -0
  816. package/src/images/Image/types.ts +32 -1
  817. package/src/index.ts +18 -0
  818. package/src/knobImmuneExports.ts +97 -0
  819. package/src/layouts/AsyncBoundary.spec.tsx +77 -0
  820. package/src/layouts/AsyncBoundary.stories.tsx +33 -1
  821. package/src/layouts/AsyncBoundary.tsx +183 -46
  822. package/src/layouts/Attachments.stories.tsx +28 -14
  823. package/src/layouts/Breadcrumbs.stories.tsx +22 -1
  824. package/src/layouts/EmptyState.stories.tsx +94 -26
  825. package/src/layouts/EmptyState.tsx +169 -0
  826. package/src/layouts/PageHeader.stories.tsx +68 -15
  827. package/src/layouts/PageTemplates.tsx +11 -6
  828. package/src/layouts/PaneScaffold.stories.tsx +132 -37
  829. package/src/layouts/PaneScaffold.tsx +354 -18
  830. package/src/layouts/ScreenToolbar.stories.tsx +36 -11
  831. package/src/layouts/Sidebar.stories.tsx +30 -7
  832. package/src/layouts/Tags.stories.tsx +31 -32
  833. package/src/layouts/Timeline.stories.tsx +2 -2
  834. package/src/layouts/Toolbar.stories.tsx +19 -0
  835. package/src/layouts/ViewSwitcher.stories.tsx +11 -3
  836. package/src/layouts/ViewSwitcher.tsx +101 -48
  837. package/src/layouts/attachments.tsx +394 -186
  838. package/src/layouts/breadcrumbs.tsx +213 -75
  839. package/src/layouts/layouts.spec.tsx +32 -0
  840. package/src/layouts/page.tsx +103 -164
  841. package/src/layouts/pageHeadingScope.tsx +28 -2
  842. package/src/layouts/sidebar.tsx +184 -91
  843. package/src/layouts/tags-trigger.spec.tsx +8 -8
  844. package/src/layouts/tags.tsx +356 -159
  845. package/src/layouts/timeline-comments.spec.tsx +17 -0
  846. package/src/layouts/timeline.tsx +179 -65
  847. package/src/layouts/toolbar.tsx +78 -27
  848. package/src/shared/i18n.ts +26 -0
  849. package/src/shared/textRidesText.ts +57 -0
  850. package/src/shared/useReturnFocusOnClose.ts +7 -1
  851. package/src/surfaces.tsx +83 -22
  852. package/src/tamagui.spec.ts +19 -4
  853. package/src/tamagui.ts +14 -6
  854. package/src/views/Calendar.stories.tsx +2 -1
  855. package/src/views/Calendar.tsx +129 -81
  856. package/src/views/Dashboard.stories.tsx +132 -1
  857. package/src/views/Dashboard.tsx +440 -127
  858. package/src/views/Gantt.stories.tsx +6 -5
  859. package/src/views/Gantt.tsx +330 -61
  860. package/src/views/ImageGrid.stories.tsx +81 -17
  861. package/src/views/ImageGrid.tsx +176 -96
  862. package/src/views/Kanban.native.tsx +73 -42
  863. package/src/views/Kanban.stories.tsx +42 -26
  864. package/src/views/Kanban.tsx +68 -40
  865. package/src/views/List.stories.tsx +107 -29
  866. package/src/views/List.tsx +335 -109
  867. package/src/views/ReportBuilder.stories.tsx +28 -1
  868. package/src/views/ReportBuilder.tsx +647 -275
  869. package/src/views/TreeView.stories.tsx +19 -0
  870. package/src/views/TreeView.tsx +194 -59
  871. package/types/Accordion/index.d.ts +10 -2
  872. package/types/Accordion/index.d.ts.map +1 -1
  873. package/types/Alert/index.d.ts +8 -2
  874. package/types/Alert/index.d.ts.map +1 -1
  875. package/types/AnimateHeight/index.d.ts +48 -0
  876. package/types/AnimateHeight/index.d.ts.map +1 -0
  877. package/types/Avatar/getInitials.d.ts +26 -0
  878. package/types/Avatar/getInitials.d.ts.map +1 -1
  879. package/types/Avatar/index.d.ts +34 -11
  880. package/types/Avatar/index.d.ts.map +1 -1
  881. package/types/Badge/index.d.ts +17 -12
  882. package/types/Badge/index.d.ts.map +1 -1
  883. package/types/Button.d.ts +42 -0
  884. package/types/Button.d.ts.map +1 -0
  885. package/types/Carousel/index.d.ts.map +1 -1
  886. package/types/Chip/index.d.ts +41 -1
  887. package/types/Chip/index.d.ts.map +1 -1
  888. package/types/DotIndicator/index.d.ts +4 -3
  889. package/types/DotIndicator/index.d.ts.map +1 -1
  890. package/types/DropdownMenu/index.d.ts +39 -5
  891. package/types/DropdownMenu/index.d.ts.map +1 -1
  892. package/types/ErrorBoundary/index.d.ts +1 -1
  893. package/types/Pagination.d.ts.map +1 -1
  894. package/types/ProgressSteps/index.d.ts +20 -5
  895. package/types/ProgressSteps/index.d.ts.map +1 -1
  896. package/types/Quote/index.d.ts +4 -3
  897. package/types/Quote/index.d.ts.map +1 -1
  898. package/types/SheetModal/index.d.ts +7 -10
  899. package/types/SheetModal/index.d.ts.map +1 -1
  900. package/types/SheetModal/index.native.d.ts +6 -13
  901. package/types/SheetModal/index.native.d.ts.map +1 -1
  902. package/types/Skeleton/index.d.ts +40 -1
  903. package/types/Skeleton/index.d.ts.map +1 -1
  904. package/types/SkipLink/index.d.ts +5 -6
  905. package/types/SkipLink/index.d.ts.map +1 -1
  906. package/types/Tabs/index.d.ts +12 -10
  907. package/types/Tabs/index.d.ts.map +1 -1
  908. package/types/Toast/index.d.ts +32 -9
  909. package/types/Toast/index.d.ts.map +1 -1
  910. package/types/Toast/store.d.ts +59 -4
  911. package/types/Toast/store.d.ts.map +1 -1
  912. package/types/Tooltip/index.d.ts +50 -5
  913. package/types/Tooltip/index.d.ts.map +1 -1
  914. package/types/Video/PlayerChrome.d.ts +24 -0
  915. package/types/Video/PlayerChrome.d.ts.map +1 -0
  916. package/types/Video/VideoFrame.d.ts.map +1 -1
  917. package/types/Video/index.d.ts +3 -2
  918. package/types/Video/index.d.ts.map +1 -1
  919. package/types/Video/index.native.d.ts +3 -2
  920. package/types/Video/index.native.d.ts.map +1 -1
  921. package/types/Video/types.d.ts +7 -1
  922. package/types/Video/types.d.ts.map +1 -1
  923. package/types/Wheel/index.d.ts +10 -1
  924. package/types/Wheel/index.d.ts.map +1 -1
  925. package/types/charts/BarChart.d.ts +7 -1
  926. package/types/charts/BarChart.d.ts.map +1 -1
  927. package/types/charts/index.d.ts +1 -0
  928. package/types/charts/index.d.ts.map +1 -1
  929. package/types/code/CodeBlock/index.d.ts.map +1 -1
  930. package/types/feedback/ConfirmDialog.d.ts +6 -0
  931. package/types/feedback/ConfirmDialog.d.ts.map +1 -1
  932. package/types/icons/themed.d.ts.map +1 -1
  933. package/types/images/Image/ImageFrame.d.ts +40 -0
  934. package/types/images/Image/ImageFrame.d.ts.map +1 -0
  935. package/types/images/Image/index.d.ts +1 -1
  936. package/types/images/Image/index.d.ts.map +1 -1
  937. package/types/images/Image/index.native.d.ts +1 -1
  938. package/types/images/Image/index.native.d.ts.map +1 -1
  939. package/types/images/Image/shared.d.ts +13 -0
  940. package/types/images/Image/shared.d.ts.map +1 -0
  941. package/types/images/Image/types.d.ts +27 -1
  942. package/types/images/Image/types.d.ts.map +1 -1
  943. package/types/index.d.ts +6 -0
  944. package/types/index.d.ts.map +1 -1
  945. package/types/knobImmuneExports.d.ts +21 -0
  946. package/types/knobImmuneExports.d.ts.map +1 -0
  947. package/types/layouts/AsyncBoundary.d.ts +20 -2
  948. package/types/layouts/AsyncBoundary.d.ts.map +1 -1
  949. package/types/layouts/EmptyState.d.ts +26 -0
  950. package/types/layouts/EmptyState.d.ts.map +1 -0
  951. package/types/layouts/PageTemplates.d.ts +5 -3
  952. package/types/layouts/PageTemplates.d.ts.map +1 -1
  953. package/types/layouts/PaneScaffold.d.ts +27 -5
  954. package/types/layouts/PaneScaffold.d.ts.map +1 -1
  955. package/types/layouts/ViewSwitcher.d.ts +7 -4
  956. package/types/layouts/ViewSwitcher.d.ts.map +1 -1
  957. package/types/layouts/attachments.d.ts +4 -2
  958. package/types/layouts/attachments.d.ts.map +1 -1
  959. package/types/layouts/breadcrumbs.d.ts +13 -5
  960. package/types/layouts/breadcrumbs.d.ts.map +1 -1
  961. package/types/layouts/page.d.ts +16 -27
  962. package/types/layouts/page.d.ts.map +1 -1
  963. package/types/layouts/pageHeadingScope.d.ts +14 -1
  964. package/types/layouts/pageHeadingScope.d.ts.map +1 -1
  965. package/types/layouts/sidebar.d.ts +3 -1
  966. package/types/layouts/sidebar.d.ts.map +1 -1
  967. package/types/layouts/tags.d.ts +4 -1
  968. package/types/layouts/tags.d.ts.map +1 -1
  969. package/types/layouts/timeline.d.ts +7 -5
  970. package/types/layouts/timeline.d.ts.map +1 -1
  971. package/types/layouts/toolbar.d.ts +1 -1
  972. package/types/layouts/toolbar.d.ts.map +1 -1
  973. package/types/shared/i18n.d.ts +14 -0
  974. package/types/shared/i18n.d.ts.map +1 -0
  975. package/types/shared/textRidesText.d.ts +20 -0
  976. package/types/shared/textRidesText.d.ts.map +1 -0
  977. package/types/shared/useReturnFocusOnClose.d.ts.map +1 -1
  978. package/types/surfaces.d.ts +0 -14
  979. package/types/surfaces.d.ts.map +1 -1
  980. package/types/tamagui.d.ts +2 -3
  981. package/types/tamagui.d.ts.map +1 -1
  982. package/types/views/Calendar.d.ts.map +1 -1
  983. package/types/views/Dashboard.d.ts +68 -6
  984. package/types/views/Dashboard.d.ts.map +1 -1
  985. package/types/views/Gantt.d.ts +5 -0
  986. package/types/views/Gantt.d.ts.map +1 -1
  987. package/types/views/ImageGrid.d.ts +4 -0
  988. package/types/views/ImageGrid.d.ts.map +1 -1
  989. package/types/views/Kanban.d.ts.map +1 -1
  990. package/types/views/Kanban.native.d.ts +12 -1
  991. package/types/views/Kanban.native.d.ts.map +1 -1
  992. package/types/views/List.d.ts +45 -6
  993. package/types/views/List.d.ts.map +1 -1
  994. package/types/views/ReportBuilder.d.ts +8 -54
  995. package/types/views/ReportBuilder.d.ts.map +1 -1
  996. package/types/views/TreeView.d.ts +13 -11
  997. package/types/views/TreeView.d.ts.map +1 -1
@@ -11,7 +11,11 @@
11
11
  *
12
12
  * Composable parts (DropdownMenu.Trigger/Content/Item/CheckboxItem/
13
13
  * Separator/Label) plus a convenience `items=[]` prop for the common
14
- * row-actions case.
14
+ * row-actions case. Dismissal follows LC-21: plain items COMMIT-close,
15
+ * checkable items COMPOSE-stay; `closeOnSelect` (entry-level, or menu-level
16
+ * on the root) opts a checkable single-select "radio-style" menu into
17
+ * close-on-pick — entries with `checked` fire BOTH `onCheckedChange` and
18
+ * `onSelect`.
15
19
  */
16
20
 
17
21
  import {
@@ -21,17 +25,23 @@ import {
21
25
  useCallback,
22
26
  useContext,
23
27
  useEffect,
28
+ useLayoutEffect,
24
29
  useMemo,
25
30
  useRef,
31
+ useState,
26
32
  type ReactNode,
27
33
  type RefObject,
28
34
  } from "react";
29
35
  import {
30
- Intent,
36
+ OVERLAY_ANCHOR_GAP,
31
37
  hairline,
38
+ keyboardFocusRingProps,
32
39
  menuRowFrame,
40
+ ensureFocusVisibleRing,
41
+ ensureKeyboardModalityTracking,
33
42
  useResolvedKnobs,
34
43
  warnBareDisabled,
44
+ wasKeyboardFocus,
35
45
  } from "@multiplatform.one/theme";
36
46
  import { CheckIcon } from "@phosphor-icons/react";
37
47
  import type { GetProps, PopoverContentProps, PopoverProps, TamaguiElement } from "tamagui";
@@ -72,8 +82,22 @@ export interface DropdownMenuItemSpec {
72
82
  destructive?: boolean;
73
83
  /** Present ⇒ renders as a checkable item (menuitemcheckbox). */
74
84
  checked?: boolean;
85
+ /** Toggle callback for checkable entries (fires with the next checked state). */
75
86
  onCheckedChange?: (checked: boolean) => void;
87
+ /**
88
+ * Fires on every activation — checkable entries included (alongside
89
+ * `onCheckedChange`), so single-select "radio-style" menus can navigate
90
+ * from the same entry that carries the check mark.
91
+ */
76
92
  onSelect?: () => void;
93
+ /**
94
+ * Close the menu after this entry activates. Defaults per LC-21 class:
95
+ * plain items close (COMMIT — the pick completes the contract), checkable
96
+ * items stay open (COMPOSE — toggles accumulate). The menu-level
97
+ * `closeOnSelect` overrides the class default; this entry-level value
98
+ * wins over both.
99
+ */
100
+ closeOnSelect?: boolean;
77
101
  }
78
102
 
79
103
  export type DropdownMenuEntry = DropdownMenuItemSpec | { separator: true };
@@ -94,6 +118,13 @@ export interface DropdownMenuProps {
94
118
  placement?: DropdownMenuPlacement;
95
119
  /** Max menu height before the list scrolls (convenience `items` path). */
96
120
  maxHeight?: number;
121
+ /**
122
+ * Menu-level close-on-activate default for every item (entry-level
123
+ * `closeOnSelect` wins). Set true on single-select "radio-style" menus —
124
+ * view/board/sort switchers whose checked pick commits and closes
125
+ * (LC-21 COMMIT) — instead of controlling `open` from the consumer.
126
+ */
127
+ closeOnSelect?: boolean;
97
128
  }
98
129
 
99
130
  // ── Context ───────────────────────────────────────────────────
@@ -103,6 +134,10 @@ interface DropdownMenuContextValue {
103
134
  setOpen: (open: boolean) => void;
104
135
  triggerRef: RefObject<TamaguiElement | null>;
105
136
  close: () => void;
137
+ /** Menu-level closeOnSelect default (entry-level values win). */
138
+ closeOnSelect?: boolean;
139
+ /** APG: ArrowUp on the trigger focuses the last item on open. */
140
+ pendingFocusRef: RefObject<"first" | "last">;
106
141
  }
107
142
 
108
143
  const DropdownMenuContext = createContext<DropdownMenuContextValue | null>(null);
@@ -124,13 +159,20 @@ const ItemRow = styled(XStack, {
124
159
  ...menuRowFrame,
125
160
  gap: "$2.5",
126
161
  cursor: "pointer",
162
+ // LC-72 CONTAINER-CLIP: rows stay square; the overlay clips outer corners.
163
+ // LC-71: rest and pointer-origin focus paint no ring. Keyboard ring is
164
+ // applied per-row via keyboardFocusRingProps (inset so overflow:hidden
165
+ // does not sever it) when wasKeyboardFocus().
166
+ outlineWidth: 0,
127
167
  hoverStyle: { backgroundColor: componentColors.interactive.hover },
128
168
  pressStyle: { backgroundColor: componentColors.interactive.active },
129
- // Focus highlight doubles as the roving-focus indicator (full-width row).
130
- focusStyle: { backgroundColor: componentColors.interactive.hover, outlineStyle: "none" as any },
169
+ focusStyle: {
170
+ backgroundColor: componentColors.interactive.hover,
171
+ outlineWidth: 0,
172
+ },
131
173
  focusVisibleStyle: {
132
174
  backgroundColor: componentColors.interactive.hover,
133
- outlineStyle: "none" as any,
175
+ outlineWidth: 0,
134
176
  },
135
177
  variants: {
136
178
  disabled: {
@@ -165,6 +207,7 @@ function DropdownMenuRoot({
165
207
  onOpenChange,
166
208
  placement = "bottom-start",
167
209
  maxHeight,
210
+ closeOnSelect,
168
211
  }: DropdownMenuProps) {
169
212
  const [open, setOpen] = useControllableState({
170
213
  prop: openProp,
@@ -172,6 +215,7 @@ function DropdownMenuRoot({
172
215
  onChange: onOpenChange,
173
216
  });
174
217
  const triggerRef = useRef<TamaguiElement | null>(null);
218
+ const pendingFocusRef = useRef<"first" | "last">("first");
175
219
 
176
220
  const close = useCallback(() => {
177
221
  setOpen(false);
@@ -184,8 +228,8 @@ function DropdownMenuRoot({
184
228
  }, [setOpen]);
185
229
 
186
230
  const ctx = useMemo<DropdownMenuContextValue>(
187
- () => ({ open, setOpen, triggerRef, close }),
188
- [open, setOpen, close],
231
+ () => ({ open, setOpen, triggerRef, close, closeOnSelect, pendingFocusRef }),
232
+ [open, setOpen, close, closeOnSelect],
189
233
  );
190
234
 
191
235
  return (
@@ -194,7 +238,7 @@ function DropdownMenuRoot({
194
238
  open={open}
195
239
  onOpenChange={setOpen}
196
240
  placement={placement}
197
- offset={4}
241
+ offset={OVERLAY_ANCHOR_GAP}
198
242
  stayInFrame
199
243
  allowFlip
200
244
  >
@@ -210,6 +254,8 @@ function DropdownMenuRoot({
210
254
  key={(entry as DropdownMenuItemSpec).key ?? index}
211
255
  checked={(entry as DropdownMenuItemSpec).checked!}
212
256
  onCheckedChange={(entry as DropdownMenuItemSpec).onCheckedChange}
257
+ onSelect={(entry as DropdownMenuItemSpec).onSelect}
258
+ closeOnSelect={(entry as DropdownMenuItemSpec).closeOnSelect}
213
259
  disabled={(entry as DropdownMenuItemSpec).disabled}
214
260
  disabledReason={(entry as DropdownMenuItemSpec).disabledReason}
215
261
  shortcut={(entry as DropdownMenuItemSpec).shortcut}
@@ -224,6 +270,7 @@ function DropdownMenuRoot({
224
270
  disabled={(entry as DropdownMenuItemSpec).disabled}
225
271
  disabledReason={(entry as DropdownMenuItemSpec).disabledReason}
226
272
  destructive={(entry as DropdownMenuItemSpec).destructive}
273
+ closeOnSelect={(entry as DropdownMenuItemSpec).closeOnSelect}
227
274
  onSelect={(entry as DropdownMenuItemSpec).onSelect}
228
275
  >
229
276
  {(entry as DropdownMenuItemSpec).label}
@@ -268,13 +315,19 @@ const DropdownMenuTrigger = forwardRef<TamaguiElement, DropdownMenuTriggerProps>
268
315
  const handleKeyDown = (e: globalThis.KeyboardEvent) => {
269
316
  (onKeyDown as unknown as ((e: globalThis.KeyboardEvent) => void) | undefined)?.(e);
270
317
  if (e.repeat) return;
271
- if (e.key === "Enter" || e.key === " " || e.key === "ArrowDown") {
318
+ if (e.key === "Enter" || e.key === " " || e.key === "ArrowDown" || e.key === "ArrowUp") {
272
319
  swallowNextKeyUp(e.key);
273
320
  if (e.defaultPrevented) return; // composed trigger already activated
274
321
  e.preventDefault();
275
322
  if (e.key === "ArrowDown") {
323
+ ctx.pendingFocusRef.current = "first";
324
+ if (!ctx.open) ctx.setOpen(true);
325
+ } else if (e.key === "ArrowUp") {
326
+ // APG / macOS / Radix: Up opens onto the last item.
327
+ ctx.pendingFocusRef.current = "last";
276
328
  if (!ctx.open) ctx.setOpen(true);
277
329
  } else {
330
+ ctx.pendingFocusRef.current = "first";
278
331
  ctx.setOpen(!ctx.open);
279
332
  }
280
333
  }
@@ -296,17 +349,38 @@ const DropdownMenuTrigger = forwardRef<TamaguiElement, DropdownMenuTriggerProps>
296
349
  export interface DropdownMenuContentProps extends PopoverContentProps {
297
350
  /** Max height before the item list scrolls. */
298
351
  maxHeight?: number;
299
- /** Minimum menu width. */
352
+ /**
353
+ * Minimum menu width. Defaults to the measured trigger width
354
+ * (OVERLAY_ANCHOR_GAP rule: anchored menus match the trigger width
355
+ * exactly and may only grow wider for content, never narrower).
356
+ */
300
357
  minWidth?: number;
301
358
  }
302
359
 
303
360
  const DropdownMenuContent = forwardRef<TamaguiElement, DropdownMenuContentProps>(
304
- function DropdownMenuContent({ children, maxHeight, minWidth = 200, ...props }, forwardedRef) {
361
+ function DropdownMenuContent({ children, maxHeight, minWidth, ...props }, forwardedRef) {
305
362
  const ctx = useDropdownMenuContext("Content");
306
363
  const { knobProps } = useResolvedKnobs();
307
364
  const innerRef = useRef<TamaguiElement | null>(null);
365
+
366
+ // OVERLAY_ANCHOR_GAP rule (theme/layoutTokens): the menu's min-width is
367
+ // the trigger's rendered width — measured on open, so the menu is never
368
+ // narrower than its trigger and content may still grow it wider.
369
+ const [triggerWidth, setTriggerWidth] = useState<number | undefined>(undefined);
370
+ useLayoutEffect(() => {
371
+ if (!isWeb || !ctx.open) return;
372
+ const node = ctx.triggerRef.current as unknown as HTMLElement | null;
373
+ if (node && typeof node.getBoundingClientRect === "function") {
374
+ // Ceil to whole CSS px: a fractional min-width could render the menu
375
+ // a hair narrower than the trigger; never-narrower wins over exact
376
+ // subpixels (and whole-px origins keep borders on device pixels).
377
+ setTriggerWidth(Math.ceil(node.getBoundingClientRect().width));
378
+ }
379
+ }, [ctx.open, ctx.triggerRef]);
380
+ const resolvedMinWidth = minWidth ?? triggerWidth;
308
381
  const composedRef = useComposedRefs(innerRef, forwardedRef);
309
382
  const typeahead = useRef({ buffer: "", at: 0 });
383
+ if (isWeb) ensureKeyboardModalityTracking();
310
384
 
311
385
  const getItems = useCallback((): HTMLElement[] => {
312
386
  const node = innerRef.current as unknown as HTMLElement | null;
@@ -320,13 +394,19 @@ const DropdownMenuContent = forwardRef<TamaguiElement, DropdownMenuContentProps>
320
394
  el?.focus();
321
395
  }, []);
322
396
 
323
- // Menu pattern: focus lands on the first item when the menu opens.
397
+ // Menu pattern: focus lands on the first item when the menu opens
398
+ // (last item when opened with ArrowUp — APG menu-button).
324
399
  const handleOpenAutoFocus = useCallback(
325
400
  (event: Event) => {
326
401
  event.preventDefault();
327
- requestAnimationFrame(() => focusItem(getItems()[0]));
402
+ const prefer = ctx.pendingFocusRef.current;
403
+ ctx.pendingFocusRef.current = "first";
404
+ requestAnimationFrame(() => {
405
+ const items = getItems();
406
+ focusItem(prefer === "last" ? items[items.length - 1] : items[0]);
407
+ });
328
408
  },
329
- [focusItem, getItems],
409
+ [ctx, focusItem, getItems],
330
410
  );
331
411
 
332
412
  // The Popover focus scope does not restore focus to the trigger on its
@@ -419,7 +499,7 @@ const DropdownMenuContent = forwardRef<TamaguiElement, DropdownMenuContentProps>
419
499
  // row highlights to the radius knob.
420
500
  padding={0}
421
501
  overflow="hidden"
422
- minWidth={minWidth}
502
+ minWidth={resolvedMinWidth}
423
503
  transition={knobProps.transition}
424
504
  enterStyle={{ opacity: 0, y: -4, scale: 0.97 }}
425
505
  exitStyle={{ opacity: 0, y: -4, scale: 0.97 }}
@@ -462,12 +542,18 @@ export interface DropdownMenuItemProps extends Omit<
462
542
  /** Error-intent row (destructive action). */
463
543
  destructive?: boolean;
464
544
  onSelect?: () => void;
465
- /** Close the menu after selecting (default true). */
545
+ /**
546
+ * Close the menu after selecting. Class default when unset: Item closes
547
+ * (LC-21 COMMIT), CheckboxItem stays open (COMPOSE); a menu-level
548
+ * `closeOnSelect` on the root overrides the class default.
549
+ */
466
550
  closeOnSelect?: boolean;
467
551
  }
468
552
 
469
553
  interface ItemBodyProps extends DropdownMenuItemProps {
470
554
  leading?: ReactNode;
555
+ /** LC-21 class default applied when neither entry nor menu set a value. */
556
+ closeOnSelectDefault?: boolean;
471
557
  }
472
558
 
473
559
  const DropdownMenuItemBody = forwardRef<TamaguiElement, ItemBodyProps>(
@@ -480,7 +566,8 @@ const DropdownMenuItemBody = forwardRef<TamaguiElement, ItemBodyProps>(
480
566
  disabledReason,
481
567
  destructive = false,
482
568
  onSelect,
483
- closeOnSelect = true,
569
+ closeOnSelect,
570
+ closeOnSelectDefault = true,
484
571
  role = "menuitem",
485
572
  leading,
486
573
  ...props
@@ -490,6 +577,9 @@ const DropdownMenuItemBody = forwardRef<TamaguiElement, ItemBodyProps>(
490
577
  const ctx = useDropdownMenuContext("Item");
491
578
  const { knobProps } = useResolvedKnobs();
492
579
  const theme = useTheme();
580
+ const [kbRing, setKbRing] = useState(false);
581
+ const [highlighted, setHighlighted] = useState(false);
582
+ const pointerIntentRef = useRef(false);
493
583
  // DG-ST-03: disabled menu items explain inline or DEV-warn.
494
584
  warnBareDisabled({
495
585
  component: "DropdownMenu.Item",
@@ -503,16 +593,35 @@ const DropdownMenuItemBody = forwardRef<TamaguiElement, ItemBodyProps>(
503
593
  | string
504
594
  | undefined;
505
595
 
596
+ // Entry-level closeOnSelect wins over the menu-level default, which wins
597
+ // over the LC-21 class default (Item COMMIT-closes, CheckboxItem
598
+ // COMPOSE-stays).
599
+ const shouldCloseOnSelect = closeOnSelect ?? ctx.closeOnSelect ?? closeOnSelectDefault;
600
+
506
601
  const handleSelect = () => {
507
602
  if (disabled) return;
508
603
  onSelect?.();
509
- if (closeOnSelect) ctx.close();
604
+ if (shouldCloseOnSelect) ctx.close();
510
605
  };
511
606
 
512
- // Destructive rows ride the error sub-theme: step-11 text on the neutral
513
- // overlay, hover highlight from the same hue's ramp.
607
+ // Destructive = red text/icon (Linear / Primer / macOS). Highlight fill
608
+ // may tint; the LC-71 ring stays the overlay `$outlineColor`, never the
609
+ // error-intent outline (which reads as a red border on the row).
514
610
  const textColor = destructive ? "$red11" : componentColors.text.primary;
515
611
 
612
+ const highlightFill =
613
+ destructive && !disabled
614
+ ? {
615
+ hoverStyle: { backgroundColor: "$red3" },
616
+ pressStyle: { backgroundColor: "$red4" },
617
+ }
618
+ : undefined;
619
+ const focusFill =
620
+ destructive && !disabled
621
+ ? { backgroundColor: "$red3" as const }
622
+ : { backgroundColor: componentColors.interactive.hover };
623
+ const ring = kbRing ? keyboardFocusRingProps : { outlineWidth: 0 as const };
624
+
516
625
  return (
517
626
  <ItemRow
518
627
  ref={forwardedRef}
@@ -522,24 +631,42 @@ const DropdownMenuItemBody = forwardRef<TamaguiElement, ItemBodyProps>(
522
631
  minHeight={knobProps.sizeToken}
523
632
  transition={knobProps.transition}
524
633
  onPress={handleSelect}
634
+ {...highlightFill}
635
+ {...(explainedDisable ? { paddingVertical: "$1.5" } : {})}
636
+ {...(props as any)}
525
637
  {...(isWeb
526
638
  ? ({
527
639
  tabIndex: -1,
528
640
  [MENU_ITEM_ATTR]: "",
529
- // Enter/Space activation is handled by the menu-level native
530
- // keydown listener in Content (single source, no double-fire).
641
+ // Radix: pointer-move moves highlight so hover and keyboard
642
+ // never paint two rows at once. LC-71: ring only when the
643
+ // focus is keyboard-origin — pointer-move sets a local flag
644
+ // so wasKeyboardFocus() (still true until pointerdown) does
645
+ // not keep the ring after the mouse takes over.
646
+ onFocus: () => {
647
+ setHighlighted(true);
648
+ setKbRing(wasKeyboardFocus() && !pointerIntentRef.current);
649
+ pointerIntentRef.current = false;
650
+ },
651
+ onBlur: () => {
652
+ setHighlighted(false);
653
+ setKbRing(false);
654
+ },
655
+ onPointerMove: (e: { pointerType?: string; currentTarget: unknown }) => {
656
+ if (disabled) return;
657
+ if (e.pointerType && e.pointerType !== "mouse") return;
658
+ const node = e.currentTarget as HTMLElement;
659
+ if (document.activeElement === node) return;
660
+ pointerIntentRef.current = true;
661
+ node.focus();
662
+ },
663
+ "data-highlighted": highlighted ? "true" : undefined,
664
+ "data-mp-kb-ring": kbRing ? "true" : undefined,
531
665
  } as any)
532
666
  : {})}
533
- {...(destructive && !disabled
534
- ? {
535
- hoverStyle: { backgroundColor: "$red3" },
536
- pressStyle: { backgroundColor: "$red4" },
537
- focusStyle: { backgroundColor: "$red3" },
538
- focusVisibleStyle: { backgroundColor: "$red3" },
539
- }
540
- : {})}
541
- {...(explainedDisable ? { paddingVertical: "$1.5" } : {})}
542
- {...(props as any)}
667
+ {...(kbRing ? keyboardFocusRingProps : { outlineWidth: 0 })}
668
+ focusStyle={{ ...focusFill, ...ring }}
669
+ focusVisibleStyle={{ ...focusFill, ...ring }}
543
670
  >
544
671
  {leading}
545
672
  {icon ? (
@@ -600,13 +727,6 @@ const DropdownMenuItemBody = forwardRef<TamaguiElement, ItemBodyProps>(
600
727
 
601
728
  const DropdownMenuItem = forwardRef<TamaguiElement, DropdownMenuItemProps>(
602
729
  function DropdownMenuItem(props, ref) {
603
- if (props.destructive) {
604
- return (
605
- <Intent name="error">
606
- <DropdownMenuItemBody ref={ref} {...props} />
607
- </Intent>
608
- );
609
- }
610
730
  return <DropdownMenuItemBody ref={ref} {...props} />;
611
731
  },
612
732
  );
@@ -615,24 +735,30 @@ const DropdownMenuItem = forwardRef<TamaguiElement, DropdownMenuItemProps>(
615
735
 
616
736
  export interface DropdownMenuCheckboxItemProps extends Omit<
617
737
  DropdownMenuItemProps,
618
- "destructive" | "icon" | "onSelect"
738
+ "destructive" | "icon"
619
739
  > {
620
740
  checked: boolean;
741
+ /** Toggle callback (fires with the next checked state on every activation). */
621
742
  onCheckedChange?: (checked: boolean) => void;
622
743
  }
623
744
 
624
745
  const DropdownMenuCheckboxItem = forwardRef<TamaguiElement, DropdownMenuCheckboxItemProps>(
625
- function DropdownMenuCheckboxItem(
626
- { checked, onCheckedChange, closeOnSelect = false, ...props },
627
- ref,
628
- ) {
746
+ function DropdownMenuCheckboxItem({ checked, onCheckedChange, onSelect, ...props }, ref) {
629
747
  return (
630
748
  <DropdownMenuItemBody
631
749
  ref={ref}
632
750
  role={"menuitemcheckbox" as any}
633
751
  aria-checked={checked}
634
- closeOnSelect={closeOnSelect}
635
- onSelect={() => onCheckedChange?.(!checked)}
752
+ // LC-21 COMPOSE class default: toggles accumulate, so the menu stays
753
+ // open unless the entry or the menu opts into close-on-select
754
+ // (single-select radio-style navigation menus do).
755
+ closeOnSelectDefault={false}
756
+ // Both callbacks fire: the toggle contract AND the activation
757
+ // contract — a checked entry's onSelect must never be dropped.
758
+ onSelect={() => {
759
+ onCheckedChange?.(!checked);
760
+ onSelect?.();
761
+ }}
636
762
  leading={
637
763
  <View
638
764
  width={18}
@@ -1,6 +1,6 @@
1
1
  import type { ErrorInfo, ReactNode } from "react";
2
2
  import { Component } from "react";
3
- import { useTranslation } from "react-i18next";
3
+ import { useTranslation } from "../shared/i18n";
4
4
  import { Button } from "@multiplatform.one/forms";
5
5
  import { H2, YStack } from "tamagui";
6
6
 
@@ -343,3 +343,44 @@ describe("Pagination selected mark (LC-05 / D-01)", () => {
343
343
  expect(other.closest(".t_accent")).toBeNull();
344
344
  });
345
345
  });
346
+
347
+ describe("Pagination LC-71 RING-ANATOMY / 44px floor", () => {
348
+ it("every numbered page control paints at least 44×44", () => {
349
+ const { container } = renderWithProviders(
350
+ <Pagination variant="numbered" total={8} page={3} showFirstLast />,
351
+ );
352
+ const labels = [
353
+ "Go to first page",
354
+ "Go to previous page",
355
+ "Page 1",
356
+ "Page 3",
357
+ "Go to next page",
358
+ "Go to last page",
359
+ ];
360
+ for (const label of labels) {
361
+ const el = byLabel(container, label) as HTMLElement;
362
+ expect(el, label).toBeTruthy();
363
+ const style = getComputedStyle(el);
364
+ expect(
365
+ parseFloat(style.minWidth) || parseFloat(style.width),
366
+ `${label} minWidth`,
367
+ ).toBeGreaterThanOrEqual(44);
368
+ expect(
369
+ parseFloat(style.minHeight) || parseFloat(style.height),
370
+ `${label} minHeight`,
371
+ ).toBeGreaterThanOrEqual(44);
372
+ }
373
+ });
374
+
375
+ it("selected page is fill, not a ring, and unselected siblings have no outline", () => {
376
+ const { container } = renderWithProviders(<Pagination variant="numbered" total={5} page={3} />);
377
+ const current = container.querySelector('[aria-current="page"]') as HTMLElement;
378
+ const other = byLabel(container, "Page 2") as HTMLElement;
379
+ expect(current.closest(".t_accent")).toBeTruthy();
380
+ expect(other.closest(".t_accent")).toBeNull();
381
+ const currentStyle = getComputedStyle(current);
382
+ const otherStyle = getComputedStyle(other);
383
+ expect(parseFloat(currentStyle.outlineWidth) || 0).toBe(0);
384
+ expect(parseFloat(otherStyle.outlineWidth) || 0).toBe(0);
385
+ });
386
+ });
@@ -1,4 +1,10 @@
1
- import { useResolvedKnobs } from "@multiplatform.one/theme";
1
+ import {
2
+ FOCUS_VISIBLE_RING,
3
+ ensureKeyboardModalityTracking,
4
+ pressTargetStyle,
5
+ useResolvedKnobs,
6
+ wasKeyboardFocus,
7
+ } from "@multiplatform.one/theme";
2
8
  import {
3
9
  ArrowLeftIcon,
4
10
  ArrowRightIcon,
@@ -10,9 +16,9 @@ import {
10
16
  } from "@phosphor-icons/react";
11
17
  import type React from "react";
12
18
  import { useCallback, useState } from "react";
13
- import { useTranslation } from "react-i18next";
19
+ import { useTranslation } from "./shared/i18n";
14
20
  import { Button } from "@multiplatform.one/forms";
15
- import { Text, XStack, type XStackProps } from "tamagui";
21
+ import { Text, XStack, isWeb, type XStackProps } from "tamagui";
16
22
  import { DotIndicator } from "./DotIndicator";
17
23
  import { componentColors } from "./componentColors";
18
24
  import { useDirection } from "./hooks/useDirection";
@@ -78,6 +84,11 @@ const stripSteps = {
78
84
  large: { mark: "$1.5", active: "$3" },
79
85
  } as const;
80
86
 
87
+ /** LC-54 / LC-71: every page control paints at least 44×44. */
88
+ const pageControlFloor = pressTargetStyle();
89
+
90
+ const restRing = { outlineWidth: 0 } as const;
91
+
81
92
  export interface PaginationProps extends Omit<XStackProps, "children" | "onChange"> {
82
93
  /** Total number of pages/steps */
83
94
  total: number;
@@ -147,6 +158,10 @@ export function Pagination({
147
158
  const { knobProps } = useResolvedKnobs();
148
159
  // LC-25: discrete page jumps tween indicator geometry/color; no continuous drag here.
149
160
  const motionTransition = (knobProps.transition as string | undefined) || "quick";
161
+ if (isWeb) ensureKeyboardModalityTracking();
162
+ // LC-71: ring rides the focused page control only, keyboard-origin, never
163
+ // mouse. Selected is fill (below), not this outline channel.
164
+ const [kbFocus, setKbFocus] = useState<string | null>(null);
150
165
 
151
166
  // Directional glyphs encode direction-of-travel (Axiom 15), so they must
152
167
  // point toward their targets in RTL too. Mechanism: swap the paired glyph
@@ -197,6 +212,27 @@ export function Pagination({
197
212
  }
198
213
  }) as unknown as () => void;
199
214
 
215
+ const pageControlProps = (id: string) => ({
216
+ ...pageControlFloor,
217
+ elevation: 0,
218
+ borderWidth: 0,
219
+ borderColor: "transparent",
220
+ shadowColor: "transparent",
221
+ focusStyle: restRing,
222
+ focusVisibleStyle: restRing,
223
+ ...(isWeb
224
+ ? {
225
+ onFocus: () => {
226
+ if (wasKeyboardFocus()) setKbFocus(id);
227
+ },
228
+ onBlur: () => {
229
+ setKbFocus((prev) => (prev === id ? null : prev));
230
+ },
231
+ }
232
+ : undefined),
233
+ ...(kbFocus === id ? FOCUS_VISIBLE_RING : restRing),
234
+ });
235
+
200
236
  const isNumbered = variant === "numbered";
201
237
 
202
238
  // The two idioms differ in which glyphs the controls take, whether the
@@ -246,19 +282,20 @@ export function Pagination({
246
282
  {isNumbered && showFirstLast && (
247
283
  <Button
248
284
  size={knobProps.sizeToken}
249
- variant="outlined"
285
+ chromeless
250
286
  icon={FirstIcon}
251
287
  onPress={() => goTo(0)}
252
288
  disabled={!canPrev}
253
289
  aria-label={t("Go to first page")}
254
290
  onKeyDown={activateOnEnterSpace(() => goTo(0), canPrev)}
291
+ {...pageControlProps("first")}
255
292
  />
256
293
  )}
257
294
 
258
295
  <Button
259
296
  size={knobProps.sizeToken}
260
297
  circular={!isNumbered}
261
- variant="outlined"
298
+ chromeless
262
299
  icon={isNumbered ? PrevIcon : PrevArrowIcon}
263
300
  onPress={handlePrev}
264
301
  disabled={!canPrev}
@@ -266,6 +303,7 @@ export function Pagination({
266
303
  // legacy opacity 0.3 dim stacked on top of it (double-dim).
267
304
  aria-label={isNumbered ? t("Go to previous page") : t("Previous page")}
268
305
  onKeyDown={activateOnEnterSpace(handlePrev, canPrev)}
306
+ {...pageControlProps("prev")}
269
307
  />
270
308
 
271
309
  {isNumbered ? (
@@ -279,6 +317,7 @@ export function Pagination({
279
317
  userSelect="none"
280
318
  textAlign="center"
281
319
  minWidth="$2"
320
+ minHeight={pageControlFloor.minHeight}
282
321
  {...knobProps.body}
283
322
  color={componentColors.text.muted}
284
323
  >
@@ -291,7 +330,6 @@ export function Pagination({
291
330
  <Button
292
331
  key={item}
293
332
  size={knobProps.sizeToken}
294
- minWidth={knobProps.sizeToken}
295
333
  paddingHorizontal="$2"
296
334
  accent={isCurrent}
297
335
  chromeless={!isCurrent}
@@ -300,6 +338,7 @@ export function Pagination({
300
338
  aria-label={withInterp(t("Page {{number}}"), { number: item })}
301
339
  aria-current={isCurrent ? "page" : undefined}
302
340
  onKeyDown={activateOnEnterSpace(() => goTo(item - 1), !disabled)}
341
+ {...pageControlProps(`page-${item}`)}
303
342
  >
304
343
  {String(item)}
305
344
  </Button>
@@ -332,24 +371,26 @@ export function Pagination({
332
371
  <Button
333
372
  size={knobProps.sizeToken}
334
373
  circular={!isNumbered}
335
- variant={submits ? undefined : "outlined"}
374
+ chromeless={!submits}
336
375
  theme={submits ? "active" : undefined}
337
376
  icon={isNumbered ? NextIcon : submits ? CheckIcon : NextArrowIcon}
338
377
  onPress={handleNext}
339
378
  disabled={!canNext}
340
379
  aria-label={isNumbered ? t("Go to next page") : submits ? t("Submit") : t("Next page")}
341
380
  onKeyDown={activateOnEnterSpace(handleNext, canNext)}
381
+ {...pageControlProps(submits ? "submit" : "next")}
342
382
  />
343
383
 
344
384
  {isNumbered && showFirstLast && (
345
385
  <Button
346
386
  size={knobProps.sizeToken}
347
- variant="outlined"
387
+ chromeless
348
388
  icon={LastIcon}
349
389
  onPress={() => goTo(total - 1)}
350
390
  disabled={!canNext}
351
391
  aria-label={t("Go to last page")}
352
392
  onKeyDown={activateOnEnterSpace(() => goTo(total - 1), canNext)}
393
+ {...pageControlProps("last")}
353
394
  />
354
395
  )}
355
396
 
@@ -2,7 +2,7 @@ import type { Meta, StoryObj } from "@storybook/react-native-web-vite";
2
2
  import { useState } from "react";
3
3
  // Catalog Button (G-15 story honesty / LC-18, UX-P06).
4
4
  import { Button } from "@multiplatform.one/forms";
5
- import { useResolvedKnobs } from "@multiplatform.one/theme";
5
+ import { OVERLAY_ANCHOR_GAP, useResolvedKnobs } from "@multiplatform.one/theme";
6
6
  import { Paragraph, Popover, SizableText, YStack } from "tamagui";
7
7
  import { PopoverContent } from "./surfaces";
8
8
 
@@ -19,7 +19,9 @@ function PopoverHarness({
19
19
  const [open, setOpen] = useState(startOpen);
20
20
  return (
21
21
  <YStack minHeight={320} alignItems="center" justifyContent="center">
22
- <Popover open={open} onOpenChange={setOpen} placement={placement}>
22
+ {/* OVERLAY_ANCHOR_GAP rule: popovers keep the shared anchored-overlay
23
+ gap between trigger edge and content (offset lives on the root). */}
24
+ <Popover open={open} onOpenChange={setOpen} placement={placement} offset={OVERLAY_ANCHOR_GAP}>
23
25
  <Popover.Trigger asChild>
24
26
  <Button>Toggle popover</Button>
25
27
  </Popover.Trigger>