@multiplatform.one/components 7.29.0 → 7.30.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 (537) hide show
  1. package/dist/cjs/Accordion/index.native.js +1 -1
  2. package/dist/cjs/Accordion/index.native.js.map +1 -1
  3. package/dist/cjs/Alert/index.native.js.map +1 -1
  4. package/dist/cjs/AnimateHeight/index.native.js.map +1 -1
  5. package/dist/cjs/Avatar/getInitials.native.js.map +1 -1
  6. package/dist/cjs/Avatar/index.native.js.map +1 -1
  7. package/dist/cjs/Badge/index.native.js.map +1 -1
  8. package/dist/cjs/Button.native.js.map +1 -1
  9. package/dist/cjs/Card.native.js.map +1 -1
  10. package/dist/cjs/CardFooter.native.js.map +1 -1
  11. package/dist/cjs/CardHeader.native.js.map +1 -1
  12. package/dist/cjs/Carousel/index.native.js +2 -2
  13. package/dist/cjs/Carousel/index.native.js.map +1 -1
  14. package/dist/cjs/Chip/index.native.js.map +1 -1
  15. package/dist/cjs/Collapsible.native.js.map +1 -1
  16. package/dist/cjs/ContextMenu/index.native.js.map +1 -1
  17. package/dist/cjs/CopyField/index.native.js.map +1 -1
  18. package/dist/cjs/Dialog.cjs +84 -0
  19. package/dist/cjs/Dialog.native.js +92 -0
  20. package/dist/cjs/Dialog.native.js.map +1 -0
  21. package/dist/cjs/DotIndicator/index.native.js.map +1 -1
  22. package/dist/cjs/DropdownMenu/index.native.js.map +1 -1
  23. package/dist/cjs/ErrorBoundary/index.native.js.map +1 -1
  24. package/dist/cjs/Heading.native.js.map +1 -1
  25. package/dist/cjs/Meter/index.native.js +1 -1
  26. package/dist/cjs/Meter/index.native.js.map +1 -1
  27. package/dist/cjs/Meter/meter.native.js.map +1 -1
  28. package/dist/cjs/Pagination.native.js +1 -1
  29. package/dist/cjs/Pagination.native.js.map +1 -1
  30. package/dist/cjs/ProgressSteps/index.native.js.map +1 -1
  31. package/dist/cjs/Quote/index.native.js.map +1 -1
  32. package/dist/cjs/Separator/index.native.js.map +1 -1
  33. package/dist/cjs/SheetModal/detents.native.js.map +1 -1
  34. package/dist/cjs/Skeleton/index.native.js.map +1 -1
  35. package/dist/cjs/SkipLink/index.native.js.map +1 -1
  36. package/dist/cjs/SortableList/SortableHandle.native.js.map +1 -1
  37. package/dist/cjs/SortableList/index.native.js.map +1 -1
  38. package/dist/cjs/SortableList/useSortableRows.native.js.map +1 -1
  39. package/dist/cjs/Tabs/index.native.js +1 -1
  40. package/dist/cjs/Tabs/index.native.js.map +1 -1
  41. package/dist/cjs/Text.native.js.map +1 -1
  42. package/dist/cjs/Toast/index.native.js.map +1 -1
  43. package/dist/cjs/Toast/store.native.js.map +1 -1
  44. package/dist/cjs/Tooltip/nativePress.native.js.map +1 -1
  45. package/dist/cjs/Tooltip/tooltipShared.native.js.map +1 -1
  46. package/dist/cjs/TreeSelect/index.native.js +1 -1
  47. package/dist/cjs/TreeSelect/index.native.js.map +1 -1
  48. package/dist/cjs/TreeSelect/treeSelectModel.native.js.map +1 -1
  49. package/dist/cjs/Video/PlayerChrome.native.js.map +1 -1
  50. package/dist/cjs/Video/VideoFrame.native.js.map +1 -1
  51. package/dist/cjs/Video/types.native.js.map +1 -1
  52. package/dist/cjs/Wheel/index.native.js.map +1 -1
  53. package/dist/cjs/Wizard/index.native.js +2 -2
  54. package/dist/cjs/Wizard/index.native.js.map +1 -1
  55. package/dist/cjs/actions/ActionBar.native.js.map +1 -1
  56. package/dist/cjs/actions/DestructiveAction.native.js.map +1 -1
  57. package/dist/cjs/actions/devWarn.native.js.map +1 -1
  58. package/dist/cjs/actions/index.native.js.map +1 -1
  59. package/dist/cjs/actions/severity.native.js.map +1 -1
  60. package/dist/cjs/charts/Axis.native.js.map +1 -1
  61. package/dist/cjs/charts/BarChart.native.js.map +1 -1
  62. package/dist/cjs/charts/ChartDataView.native.js +1 -1
  63. package/dist/cjs/charts/ChartDataView.native.js.map +1 -1
  64. package/dist/cjs/charts/ChartSurface.native.js.map +1 -1
  65. package/dist/cjs/charts/LineChart.native.js.map +1 -1
  66. package/dist/cjs/charts/PieChart.native.js.map +1 -1
  67. package/dist/cjs/charts/Sparkline.native.js.map +1 -1
  68. package/dist/cjs/charts/accessibility.native.js.map +1 -1
  69. package/dist/cjs/charts/composeChart.native.js.map +1 -1
  70. package/dist/cjs/charts/index.native.js.map +1 -1
  71. package/dist/cjs/charts/math.native.js.map +1 -1
  72. package/dist/cjs/charts/series.native.js.map +1 -1
  73. package/dist/cjs/charts/svg.native.js.map +1 -1
  74. package/dist/cjs/charts/types.native.js.map +1 -1
  75. package/dist/cjs/charts/useChartTheme.native.js.map +1 -1
  76. package/dist/cjs/code/Code/index.native.js.map +1 -1
  77. package/dist/cjs/code/CodeBlock/index.native.js +7 -7
  78. package/dist/cjs/code/CodeBlock/index.native.js.map +1 -1
  79. package/dist/cjs/code/HighlightedCode/index.native.js.map +1 -1
  80. package/dist/cjs/code/Highlighter/houseSyntaxTheme.cjs +288 -0
  81. package/dist/cjs/code/Highlighter/houseSyntaxTheme.native.js +291 -0
  82. package/dist/cjs/code/Highlighter/houseSyntaxTheme.native.js.map +1 -0
  83. package/dist/cjs/code/Highlighter/index.cjs +6 -6
  84. package/dist/cjs/code/Highlighter/index.native.js +6 -6
  85. package/dist/cjs/code/Highlighter/index.native.js.map +1 -1
  86. package/dist/cjs/code/Pre/index.native.js.map +1 -1
  87. package/dist/cjs/code/index.native.js +5 -5
  88. package/dist/cjs/code/index.native.js.map +1 -1
  89. package/dist/cjs/componentColors.native.js.map +1 -1
  90. package/dist/cjs/feedback/ConfirmDialog.native.js.map +1 -1
  91. package/dist/cjs/feedback/NotifyHost.native.js +2 -2
  92. package/dist/cjs/feedback/NotifyHost.native.js.map +1 -1
  93. package/dist/cjs/feedback/copy.native.js.map +1 -1
  94. package/dist/cjs/feedback/index.native.js.map +1 -1
  95. package/dist/cjs/feedback/notify.native.js.map +1 -1
  96. package/dist/cjs/feedback/route.native.js.map +1 -1
  97. package/dist/cjs/feedback/store.native.js.map +1 -1
  98. package/dist/cjs/hooks/index.native.js +1 -1
  99. package/dist/cjs/hooks/index.native.js.map +1 -1
  100. package/dist/cjs/hooks/useClipboard.native.js.map +1 -1
  101. package/dist/cjs/hooks/useDocumentTitle.native.js.map +1 -1
  102. package/dist/cjs/icons/CheckRegular.native.js.map +1 -1
  103. package/dist/cjs/icons/MinusRegular.native.js.map +1 -1
  104. package/dist/cjs/icons/index.native.js.map +1 -1
  105. package/dist/cjs/icons/lucide.native.js.map +1 -1
  106. package/dist/cjs/icons/themed.native.js.map +1 -1
  107. package/dist/cjs/images/Image/ImageFrame.native.js +1 -1
  108. package/dist/cjs/images/Image/ImageFrame.native.js.map +1 -1
  109. package/dist/cjs/images/Image/index.native.js +1 -1
  110. package/dist/cjs/images/Image/shared.native.js +1 -1
  111. package/dist/cjs/images/Image/shared.native.js.map +1 -1
  112. package/dist/cjs/images/Image/types.native.js.map +1 -1
  113. package/dist/cjs/images/index.native.js.map +1 -1
  114. package/dist/cjs/index.native.js +30 -30
  115. package/dist/cjs/index.native.js.map +1 -1
  116. package/dist/cjs/knobImmuneExports.cjs +0 -2
  117. package/dist/cjs/knobImmuneExports.native.js +0 -2
  118. package/dist/cjs/knobImmuneExports.native.js.map +1 -1
  119. package/dist/cjs/layouts/AsyncBoundary.native.js +2 -2
  120. package/dist/cjs/layouts/AsyncBoundary.native.js.map +1 -1
  121. package/dist/cjs/layouts/Debug/index.native.js.map +1 -1
  122. package/dist/cjs/layouts/EmptyState.native.js.map +1 -1
  123. package/dist/cjs/layouts/KeyboardAvoidingWrapper/behavior.native.js.map +1 -1
  124. package/dist/cjs/layouts/PageTemplates.native.js.map +1 -1
  125. package/dist/cjs/layouts/PaneScaffold.native.js.map +1 -1
  126. package/dist/cjs/layouts/SafeAreaWrapper/insets.native.js.map +1 -1
  127. package/dist/cjs/layouts/ViewSwitcher.native.js.map +1 -1
  128. package/dist/cjs/layouts/attachments.native.js +1 -1
  129. package/dist/cjs/layouts/attachments.native.js.map +1 -1
  130. package/dist/cjs/layouts/breadcrumbs.native.js.map +1 -1
  131. package/dist/cjs/layouts/index.native.js +3 -3
  132. package/dist/cjs/layouts/index.native.js.map +1 -1
  133. package/dist/cjs/layouts/page.native.js +1 -1
  134. package/dist/cjs/layouts/page.native.js.map +1 -1
  135. package/dist/cjs/layouts/pageHeadingScope.native.js.map +1 -1
  136. package/dist/cjs/layouts/sidebar.native.js +1 -1
  137. package/dist/cjs/layouts/sidebar.native.js.map +1 -1
  138. package/dist/cjs/layouts/tags.native.js +2 -2
  139. package/dist/cjs/layouts/tags.native.js.map +1 -1
  140. package/dist/cjs/layouts/timeline.native.js +2 -2
  141. package/dist/cjs/layouts/timeline.native.js.map +1 -1
  142. package/dist/cjs/layouts/toolbar.native.js +1 -1
  143. package/dist/cjs/layouts/toolbar.native.js.map +1 -1
  144. package/dist/cjs/shared/actionScan.native.js.map +1 -1
  145. package/dist/cjs/shared/i18n.native.js.map +1 -1
  146. package/dist/cjs/shared/t.native.js.map +1 -1
  147. package/dist/cjs/shared/textRidesText.native.js.map +1 -1
  148. package/dist/cjs/shared/useReturnFocusOnClose.native.js.map +1 -1
  149. package/dist/cjs/surfaces.native.js +1 -1
  150. package/dist/cjs/surfaces.native.js.map +1 -1
  151. package/dist/cjs/tamagui.cjs +3 -2
  152. package/dist/cjs/tamagui.native.js +4 -3
  153. package/dist/cjs/tamagui.native.js.map +1 -1
  154. package/dist/cjs/testSetup.native.js.map +1 -1
  155. package/dist/cjs/utils/setTinted.native.js.map +1 -1
  156. package/dist/cjs/utils/unwrapText.native.js.map +1 -1
  157. package/dist/cjs/views/Calendar.native.js +1 -1
  158. package/dist/cjs/views/Calendar.native.js.map +1 -1
  159. package/dist/cjs/views/Dashboard.native.js +2 -2
  160. package/dist/cjs/views/Dashboard.native.js.map +1 -1
  161. package/dist/cjs/views/Gantt.native.js +2 -2
  162. package/dist/cjs/views/Gantt.native.js.map +1 -1
  163. package/dist/cjs/views/ImageGrid.native.js +1 -1
  164. package/dist/cjs/views/ImageGrid.native.js.map +1 -1
  165. package/dist/cjs/views/Kanban.native.js +1 -1
  166. package/dist/cjs/views/List.native.js.map +1 -1
  167. package/dist/cjs/views/Matrix.native.js +2 -2
  168. package/dist/cjs/views/Matrix.native.js.map +1 -1
  169. package/dist/cjs/views/ReportBuilder.native.js +2 -2
  170. package/dist/cjs/views/ReportBuilder.native.js.map +1 -1
  171. package/dist/cjs/views/TreeView.native.js.map +1 -1
  172. package/dist/cjs/views/calendarMath.native.js.map +1 -1
  173. package/dist/cjs/views/ganttMath.native.js.map +1 -1
  174. package/dist/cjs/views/index.native.js +1 -1
  175. package/dist/cjs/views/index.native.js.map +1 -1
  176. package/dist/cjs/views/kanbanDnd.native.js.map +1 -1
  177. package/dist/cjs/views/matrixMath.native.js.map +1 -1
  178. package/dist/cjs/views/treeViewDnd.native.js.map +1 -1
  179. package/dist/cjs/views/treeViewLayout.native.js.map +1 -1
  180. package/dist/cjs/views/treeViewMotion.native.js.map +1 -1
  181. package/dist/cjs/views/treeViewReveal.native.js.map +1 -1
  182. package/dist/esm/Accordion/index.native.js.map +1 -1
  183. package/dist/esm/AnimateHeight/index.native.js.map +1 -1
  184. package/dist/esm/Avatar/getInitials.native.js.map +1 -1
  185. package/dist/esm/Avatar/index.native.js.map +1 -1
  186. package/dist/esm/Badge/index.native.js.map +1 -1
  187. package/dist/esm/Button.native.js.map +1 -1
  188. package/dist/esm/Carousel/index.native.js.map +1 -1
  189. package/dist/esm/Chip/index.native.js.map +1 -1
  190. package/dist/esm/Collapsible.native.js.map +1 -1
  191. package/dist/esm/ContextMenu/index.native.js.map +1 -1
  192. package/dist/esm/CopyField/index.native.js.map +1 -1
  193. package/dist/esm/Dialog.mjs +58 -0
  194. package/dist/esm/Dialog.mjs.map +1 -0
  195. package/dist/esm/Dialog.native.js +63 -0
  196. package/dist/esm/Dialog.native.js.map +1 -0
  197. package/dist/esm/DotIndicator/index.native.js.map +1 -1
  198. package/dist/esm/DropdownMenu/index.native.js.map +1 -1
  199. package/dist/esm/ErrorBoundary/index.native.js.map +1 -1
  200. package/dist/esm/Heading.native.js.map +1 -1
  201. package/dist/esm/Meter/index.native.js.map +1 -1
  202. package/dist/esm/Meter/meter.native.js.map +1 -1
  203. package/dist/esm/Pagination.native.js.map +1 -1
  204. package/dist/esm/ProgressSteps/index.native.js.map +1 -1
  205. package/dist/esm/Quote/index.native.js.map +1 -1
  206. package/dist/esm/Separator/index.native.js.map +1 -1
  207. package/dist/esm/SheetModal/detents.native.js.map +1 -1
  208. package/dist/esm/Skeleton/index.native.js.map +1 -1
  209. package/dist/esm/SkipLink/index.native.js.map +1 -1
  210. package/dist/esm/SortableList/SortableHandle.native.js.map +1 -1
  211. package/dist/esm/SortableList/index.native.js.map +1 -1
  212. package/dist/esm/SortableList/useSortableRows.native.js.map +1 -1
  213. package/dist/esm/Tabs/index.native.js.map +1 -1
  214. package/dist/esm/Text.native.js.map +1 -1
  215. package/dist/esm/Toast/index.native.js.map +1 -1
  216. package/dist/esm/Toast/store.native.js.map +1 -1
  217. package/dist/esm/Tooltip/nativePress.native.js.map +1 -1
  218. package/dist/esm/Tooltip/tooltipShared.native.js.map +1 -1
  219. package/dist/esm/TreeSelect/index.native.js.map +1 -1
  220. package/dist/esm/TreeSelect/treeSelectModel.native.js.map +1 -1
  221. package/dist/esm/Video/PlayerChrome.native.js.map +1 -1
  222. package/dist/esm/Video/VideoFrame.native.js.map +1 -1
  223. package/dist/esm/Video/types.native.js.map +1 -1
  224. package/dist/esm/Wheel/index.native.js.map +1 -1
  225. package/dist/esm/Wizard/index.native.js.map +1 -1
  226. package/dist/esm/actions/ActionBar.native.js.map +1 -1
  227. package/dist/esm/actions/DestructiveAction.native.js.map +1 -1
  228. package/dist/esm/actions/devWarn.native.js.map +1 -1
  229. package/dist/esm/actions/index.native.js.map +1 -1
  230. package/dist/esm/actions/severity.native.js.map +1 -1
  231. package/dist/esm/charts/Axis.native.js.map +1 -1
  232. package/dist/esm/charts/BarChart.native.js.map +1 -1
  233. package/dist/esm/charts/ChartDataView.native.js.map +1 -1
  234. package/dist/esm/charts/ChartSurface.native.js.map +1 -1
  235. package/dist/esm/charts/LineChart.native.js.map +1 -1
  236. package/dist/esm/charts/PieChart.native.js.map +1 -1
  237. package/dist/esm/charts/Sparkline.native.js.map +1 -1
  238. package/dist/esm/charts/accessibility.native.js.map +1 -1
  239. package/dist/esm/charts/composeChart.native.js.map +1 -1
  240. package/dist/esm/charts/index.native.js.map +1 -1
  241. package/dist/esm/charts/math.native.js.map +1 -1
  242. package/dist/esm/charts/series.native.js.map +1 -1
  243. package/dist/esm/charts/svg.native.js.map +1 -1
  244. package/dist/esm/charts/types.native.js.map +1 -1
  245. package/dist/esm/charts/useChartTheme.native.js.map +1 -1
  246. package/dist/esm/code/Code/index.native.js.map +1 -1
  247. package/dist/esm/code/CodeBlock/index.native.js.map +1 -1
  248. package/dist/esm/code/HighlightedCode/index.native.js.map +1 -1
  249. package/dist/esm/code/Highlighter/houseSyntaxTheme.mjs +263 -0
  250. package/dist/esm/code/Highlighter/houseSyntaxTheme.mjs.map +1 -0
  251. package/dist/esm/code/Highlighter/houseSyntaxTheme.native.js +263 -0
  252. package/dist/esm/code/Highlighter/houseSyntaxTheme.native.js.map +1 -0
  253. package/dist/esm/code/Highlighter/index.mjs +5 -6
  254. package/dist/esm/code/Highlighter/index.mjs.map +1 -1
  255. package/dist/esm/code/Highlighter/index.native.js +5 -6
  256. package/dist/esm/code/Highlighter/index.native.js.map +1 -1
  257. package/dist/esm/code/Pre/index.native.js.map +1 -1
  258. package/dist/esm/code/index.native.js.map +1 -1
  259. package/dist/esm/componentColors.native.js.map +1 -1
  260. package/dist/esm/feedback/ConfirmDialog.native.js.map +1 -1
  261. package/dist/esm/feedback/NotifyHost.native.js.map +1 -1
  262. package/dist/esm/feedback/copy.native.js.map +1 -1
  263. package/dist/esm/feedback/index.native.js.map +1 -1
  264. package/dist/esm/feedback/notify.native.js.map +1 -1
  265. package/dist/esm/feedback/route.native.js.map +1 -1
  266. package/dist/esm/feedback/store.native.js.map +1 -1
  267. package/dist/esm/hooks/index.native.js.map +1 -1
  268. package/dist/esm/hooks/useClipboard.native.js.map +1 -1
  269. package/dist/esm/hooks/useDocumentTitle.native.js.map +1 -1
  270. package/dist/esm/icons/CheckRegular.native.js.map +1 -1
  271. package/dist/esm/icons/MinusRegular.native.js.map +1 -1
  272. package/dist/esm/icons/index.native.js.map +1 -1
  273. package/dist/esm/icons/lucide.native.js.map +1 -1
  274. package/dist/esm/icons/themed.native.js.map +1 -1
  275. package/dist/esm/images/Image/ImageFrame.native.js.map +1 -1
  276. package/dist/esm/images/Image/shared.native.js.map +1 -1
  277. package/dist/esm/images/Image/types.native.js.map +1 -1
  278. package/dist/esm/images/index.native.js.map +1 -1
  279. package/dist/esm/index.native.js.map +1 -1
  280. package/dist/esm/knobImmuneExports.mjs +0 -2
  281. package/dist/esm/knobImmuneExports.mjs.map +1 -1
  282. package/dist/esm/knobImmuneExports.native.js +0 -2
  283. package/dist/esm/knobImmuneExports.native.js.map +1 -1
  284. package/dist/esm/layouts/AsyncBoundary.native.js.map +1 -1
  285. package/dist/esm/layouts/Debug/index.native.js.map +1 -1
  286. package/dist/esm/layouts/EmptyState.native.js.map +1 -1
  287. package/dist/esm/layouts/KeyboardAvoidingWrapper/behavior.native.js.map +1 -1
  288. package/dist/esm/layouts/PageTemplates.native.js.map +1 -1
  289. package/dist/esm/layouts/PaneScaffold.native.js.map +1 -1
  290. package/dist/esm/layouts/SafeAreaWrapper/insets.native.js.map +1 -1
  291. package/dist/esm/layouts/ViewSwitcher.native.js.map +1 -1
  292. package/dist/esm/layouts/attachments.native.js.map +1 -1
  293. package/dist/esm/layouts/breadcrumbs.native.js.map +1 -1
  294. package/dist/esm/layouts/index.native.js.map +1 -1
  295. package/dist/esm/layouts/page.native.js.map +1 -1
  296. package/dist/esm/layouts/pageHeadingScope.native.js.map +1 -1
  297. package/dist/esm/layouts/sidebar.native.js.map +1 -1
  298. package/dist/esm/layouts/tags.native.js.map +1 -1
  299. package/dist/esm/layouts/timeline.native.js.map +1 -1
  300. package/dist/esm/layouts/toolbar.native.js.map +1 -1
  301. package/dist/esm/shared/actionScan.native.js.map +1 -1
  302. package/dist/esm/shared/i18n.native.js.map +1 -1
  303. package/dist/esm/shared/t.native.js.map +1 -1
  304. package/dist/esm/shared/textRidesText.native.js.map +1 -1
  305. package/dist/esm/shared/useReturnFocusOnClose.native.js.map +1 -1
  306. package/dist/esm/surfaces.native.js.map +1 -1
  307. package/dist/esm/tamagui.mjs +2 -1
  308. package/dist/esm/tamagui.mjs.map +1 -1
  309. package/dist/esm/tamagui.native.js +2 -1
  310. package/dist/esm/tamagui.native.js.map +1 -1
  311. package/dist/esm/testSetup.native.js.map +1 -1
  312. package/dist/esm/utils/setTinted.native.js.map +1 -1
  313. package/dist/esm/utils/unwrapText.native.js.map +1 -1
  314. package/dist/esm/views/Calendar.native.js.map +1 -1
  315. package/dist/esm/views/Dashboard.native.js.map +1 -1
  316. package/dist/esm/views/Gantt.native.js.map +1 -1
  317. package/dist/esm/views/ImageGrid.native.js.map +1 -1
  318. package/dist/esm/views/List.native.js.map +1 -1
  319. package/dist/esm/views/Matrix.native.js.map +1 -1
  320. package/dist/esm/views/ReportBuilder.native.js.map +1 -1
  321. package/dist/esm/views/TreeView.native.js.map +1 -1
  322. package/dist/esm/views/calendarMath.native.js.map +1 -1
  323. package/dist/esm/views/ganttMath.native.js.map +1 -1
  324. package/dist/esm/views/index.native.js.map +1 -1
  325. package/dist/esm/views/kanbanDnd.native.js.map +1 -1
  326. package/dist/esm/views/matrixMath.native.js.map +1 -1
  327. package/dist/esm/views/treeViewDnd.native.js.map +1 -1
  328. package/dist/esm/views/treeViewLayout.native.js.map +1 -1
  329. package/dist/esm/views/treeViewMotion.native.js.map +1 -1
  330. package/dist/esm/views/treeViewReveal.native.js.map +1 -1
  331. package/dist/jsx/Accordion/index.native.js +1 -1
  332. package/dist/jsx/Accordion/index.native.js.map +1 -1
  333. package/dist/jsx/Alert/index.native.js.map +1 -1
  334. package/dist/jsx/AnimateHeight/index.native.js.map +1 -1
  335. package/dist/jsx/Avatar/getInitials.native.js.map +1 -1
  336. package/dist/jsx/Avatar/index.native.js.map +1 -1
  337. package/dist/jsx/Badge/index.native.js.map +1 -1
  338. package/dist/jsx/Button.native.js.map +1 -1
  339. package/dist/jsx/Card.native.js.map +1 -1
  340. package/dist/jsx/CardFooter.native.js.map +1 -1
  341. package/dist/jsx/CardHeader.native.js.map +1 -1
  342. package/dist/jsx/Carousel/index.native.js +2 -2
  343. package/dist/jsx/Carousel/index.native.js.map +1 -1
  344. package/dist/jsx/Chip/index.native.js.map +1 -1
  345. package/dist/jsx/Collapsible.native.js.map +1 -1
  346. package/dist/jsx/ContextMenu/index.native.js.map +1 -1
  347. package/dist/jsx/CopyField/index.native.js.map +1 -1
  348. package/dist/jsx/Dialog.mjs +58 -0
  349. package/dist/jsx/Dialog.mjs.map +1 -0
  350. package/dist/jsx/Dialog.native.js +92 -0
  351. package/dist/jsx/Dialog.native.js.map +1 -0
  352. package/dist/jsx/DotIndicator/index.native.js.map +1 -1
  353. package/dist/jsx/DropdownMenu/index.native.js.map +1 -1
  354. package/dist/jsx/ErrorBoundary/index.native.js.map +1 -1
  355. package/dist/jsx/Heading.native.js.map +1 -1
  356. package/dist/jsx/Meter/index.native.js +1 -1
  357. package/dist/jsx/Meter/index.native.js.map +1 -1
  358. package/dist/jsx/Meter/meter.native.js.map +1 -1
  359. package/dist/jsx/Pagination.native.js +1 -1
  360. package/dist/jsx/Pagination.native.js.map +1 -1
  361. package/dist/jsx/ProgressSteps/index.native.js.map +1 -1
  362. package/dist/jsx/Quote/index.native.js.map +1 -1
  363. package/dist/jsx/Separator/index.native.js.map +1 -1
  364. package/dist/jsx/SheetModal/detents.native.js.map +1 -1
  365. package/dist/jsx/Skeleton/index.native.js.map +1 -1
  366. package/dist/jsx/SkipLink/index.native.js.map +1 -1
  367. package/dist/jsx/SortableList/SortableHandle.native.js.map +1 -1
  368. package/dist/jsx/SortableList/index.native.js.map +1 -1
  369. package/dist/jsx/SortableList/useSortableRows.native.js.map +1 -1
  370. package/dist/jsx/Tabs/index.native.js +1 -1
  371. package/dist/jsx/Tabs/index.native.js.map +1 -1
  372. package/dist/jsx/Text.native.js.map +1 -1
  373. package/dist/jsx/Toast/index.native.js.map +1 -1
  374. package/dist/jsx/Toast/store.native.js.map +1 -1
  375. package/dist/jsx/Tooltip/nativePress.native.js.map +1 -1
  376. package/dist/jsx/Tooltip/tooltipShared.native.js.map +1 -1
  377. package/dist/jsx/TreeSelect/index.native.js +1 -1
  378. package/dist/jsx/TreeSelect/index.native.js.map +1 -1
  379. package/dist/jsx/TreeSelect/treeSelectModel.native.js.map +1 -1
  380. package/dist/jsx/Video/PlayerChrome.native.js.map +1 -1
  381. package/dist/jsx/Video/VideoFrame.native.js.map +1 -1
  382. package/dist/jsx/Video/types.native.js.map +1 -1
  383. package/dist/jsx/Wheel/index.native.js.map +1 -1
  384. package/dist/jsx/Wizard/index.native.js +2 -2
  385. package/dist/jsx/Wizard/index.native.js.map +1 -1
  386. package/dist/jsx/actions/ActionBar.native.js.map +1 -1
  387. package/dist/jsx/actions/DestructiveAction.native.js.map +1 -1
  388. package/dist/jsx/actions/devWarn.native.js.map +1 -1
  389. package/dist/jsx/actions/index.native.js.map +1 -1
  390. package/dist/jsx/actions/severity.native.js.map +1 -1
  391. package/dist/jsx/charts/Axis.native.js.map +1 -1
  392. package/dist/jsx/charts/BarChart.native.js.map +1 -1
  393. package/dist/jsx/charts/ChartDataView.native.js +1 -1
  394. package/dist/jsx/charts/ChartDataView.native.js.map +1 -1
  395. package/dist/jsx/charts/ChartSurface.native.js.map +1 -1
  396. package/dist/jsx/charts/LineChart.native.js.map +1 -1
  397. package/dist/jsx/charts/PieChart.native.js.map +1 -1
  398. package/dist/jsx/charts/Sparkline.native.js.map +1 -1
  399. package/dist/jsx/charts/accessibility.native.js.map +1 -1
  400. package/dist/jsx/charts/composeChart.native.js.map +1 -1
  401. package/dist/jsx/charts/index.native.js.map +1 -1
  402. package/dist/jsx/charts/math.native.js.map +1 -1
  403. package/dist/jsx/charts/series.native.js.map +1 -1
  404. package/dist/jsx/charts/svg.native.js.map +1 -1
  405. package/dist/jsx/charts/types.native.js.map +1 -1
  406. package/dist/jsx/charts/useChartTheme.native.js.map +1 -1
  407. package/dist/jsx/code/Code/index.native.js.map +1 -1
  408. package/dist/jsx/code/CodeBlock/index.native.js +7 -7
  409. package/dist/jsx/code/CodeBlock/index.native.js.map +1 -1
  410. package/dist/jsx/code/HighlightedCode/index.native.js.map +1 -1
  411. package/dist/jsx/code/Highlighter/houseSyntaxTheme.mjs +263 -0
  412. package/dist/jsx/code/Highlighter/houseSyntaxTheme.mjs.map +1 -0
  413. package/dist/jsx/code/Highlighter/houseSyntaxTheme.native.js +291 -0
  414. package/dist/jsx/code/Highlighter/houseSyntaxTheme.native.js.map +1 -0
  415. package/dist/jsx/code/Highlighter/index.mjs +5 -6
  416. package/dist/jsx/code/Highlighter/index.mjs.map +1 -1
  417. package/dist/jsx/code/Highlighter/index.native.js +6 -6
  418. package/dist/jsx/code/Highlighter/index.native.js.map +1 -1
  419. package/dist/jsx/code/Pre/index.native.js.map +1 -1
  420. package/dist/jsx/code/index.native.js +5 -5
  421. package/dist/jsx/code/index.native.js.map +1 -1
  422. package/dist/jsx/componentColors.native.js.map +1 -1
  423. package/dist/jsx/feedback/ConfirmDialog.native.js.map +1 -1
  424. package/dist/jsx/feedback/NotifyHost.native.js +2 -2
  425. package/dist/jsx/feedback/NotifyHost.native.js.map +1 -1
  426. package/dist/jsx/feedback/copy.native.js.map +1 -1
  427. package/dist/jsx/feedback/index.native.js.map +1 -1
  428. package/dist/jsx/feedback/notify.native.js.map +1 -1
  429. package/dist/jsx/feedback/route.native.js.map +1 -1
  430. package/dist/jsx/feedback/store.native.js.map +1 -1
  431. package/dist/jsx/hooks/index.native.js +1 -1
  432. package/dist/jsx/hooks/index.native.js.map +1 -1
  433. package/dist/jsx/hooks/useClipboard.native.js.map +1 -1
  434. package/dist/jsx/hooks/useDocumentTitle.native.js.map +1 -1
  435. package/dist/jsx/icons/CheckRegular.native.js.map +1 -1
  436. package/dist/jsx/icons/MinusRegular.native.js.map +1 -1
  437. package/dist/jsx/icons/index.native.js.map +1 -1
  438. package/dist/jsx/icons/lucide.native.js.map +1 -1
  439. package/dist/jsx/icons/themed.native.js.map +1 -1
  440. package/dist/jsx/images/Image/ImageFrame.native.js +1 -1
  441. package/dist/jsx/images/Image/ImageFrame.native.js.map +1 -1
  442. package/dist/jsx/images/Image/index.native.js +1 -1
  443. package/dist/jsx/images/Image/shared.native.js +1 -1
  444. package/dist/jsx/images/Image/shared.native.js.map +1 -1
  445. package/dist/jsx/images/Image/types.native.js.map +1 -1
  446. package/dist/jsx/images/index.native.js.map +1 -1
  447. package/dist/jsx/index.native.js +30 -30
  448. package/dist/jsx/knobImmuneExports.mjs +0 -2
  449. package/dist/jsx/knobImmuneExports.mjs.map +1 -1
  450. package/dist/jsx/knobImmuneExports.native.js +0 -2
  451. package/dist/jsx/knobImmuneExports.native.js.map +1 -1
  452. package/dist/jsx/layouts/AsyncBoundary.native.js +2 -2
  453. package/dist/jsx/layouts/AsyncBoundary.native.js.map +1 -1
  454. package/dist/jsx/layouts/Debug/index.native.js.map +1 -1
  455. package/dist/jsx/layouts/EmptyState.native.js.map +1 -1
  456. package/dist/jsx/layouts/KeyboardAvoidingWrapper/behavior.native.js.map +1 -1
  457. package/dist/jsx/layouts/PageTemplates.native.js.map +1 -1
  458. package/dist/jsx/layouts/PaneScaffold.native.js.map +1 -1
  459. package/dist/jsx/layouts/SafeAreaWrapper/insets.native.js.map +1 -1
  460. package/dist/jsx/layouts/ViewSwitcher.native.js.map +1 -1
  461. package/dist/jsx/layouts/attachments.native.js +1 -1
  462. package/dist/jsx/layouts/attachments.native.js.map +1 -1
  463. package/dist/jsx/layouts/breadcrumbs.native.js.map +1 -1
  464. package/dist/jsx/layouts/index.native.js +3 -3
  465. package/dist/jsx/layouts/index.native.js.map +1 -1
  466. package/dist/jsx/layouts/page.native.js +1 -1
  467. package/dist/jsx/layouts/page.native.js.map +1 -1
  468. package/dist/jsx/layouts/pageHeadingScope.native.js.map +1 -1
  469. package/dist/jsx/layouts/sidebar.native.js +1 -1
  470. package/dist/jsx/layouts/sidebar.native.js.map +1 -1
  471. package/dist/jsx/layouts/tags.native.js +2 -2
  472. package/dist/jsx/layouts/tags.native.js.map +1 -1
  473. package/dist/jsx/layouts/timeline.native.js +2 -2
  474. package/dist/jsx/layouts/timeline.native.js.map +1 -1
  475. package/dist/jsx/layouts/toolbar.native.js +1 -1
  476. package/dist/jsx/layouts/toolbar.native.js.map +1 -1
  477. package/dist/jsx/shared/actionScan.native.js.map +1 -1
  478. package/dist/jsx/shared/i18n.native.js.map +1 -1
  479. package/dist/jsx/shared/t.native.js.map +1 -1
  480. package/dist/jsx/shared/textRidesText.native.js.map +1 -1
  481. package/dist/jsx/shared/useReturnFocusOnClose.native.js.map +1 -1
  482. package/dist/jsx/surfaces.native.js +1 -1
  483. package/dist/jsx/surfaces.native.js.map +1 -1
  484. package/dist/jsx/tamagui.mjs +2 -1
  485. package/dist/jsx/tamagui.mjs.map +1 -1
  486. package/dist/jsx/tamagui.native.js +4 -3
  487. package/dist/jsx/tamagui.native.js.map +1 -1
  488. package/dist/jsx/testSetup.native.js.map +1 -1
  489. package/dist/jsx/utils/setTinted.native.js.map +1 -1
  490. package/dist/jsx/utils/unwrapText.native.js.map +1 -1
  491. package/dist/jsx/views/Calendar.native.js +1 -1
  492. package/dist/jsx/views/Calendar.native.js.map +1 -1
  493. package/dist/jsx/views/Dashboard.native.js +2 -2
  494. package/dist/jsx/views/Dashboard.native.js.map +1 -1
  495. package/dist/jsx/views/Gantt.native.js +2 -2
  496. package/dist/jsx/views/Gantt.native.js.map +1 -1
  497. package/dist/jsx/views/ImageGrid.native.js +1 -1
  498. package/dist/jsx/views/ImageGrid.native.js.map +1 -1
  499. package/dist/jsx/views/Kanban.native.js +1 -1
  500. package/dist/jsx/views/List.native.js.map +1 -1
  501. package/dist/jsx/views/Matrix.native.js +2 -2
  502. package/dist/jsx/views/Matrix.native.js.map +1 -1
  503. package/dist/jsx/views/ReportBuilder.native.js +2 -2
  504. package/dist/jsx/views/ReportBuilder.native.js.map +1 -1
  505. package/dist/jsx/views/TreeView.native.js.map +1 -1
  506. package/dist/jsx/views/calendarMath.native.js.map +1 -1
  507. package/dist/jsx/views/ganttMath.native.js.map +1 -1
  508. package/dist/jsx/views/index.native.js +1 -1
  509. package/dist/jsx/views/index.native.js.map +1 -1
  510. package/dist/jsx/views/kanbanDnd.native.js.map +1 -1
  511. package/dist/jsx/views/matrixMath.native.js.map +1 -1
  512. package/dist/jsx/views/treeViewDnd.native.js.map +1 -1
  513. package/dist/jsx/views/treeViewLayout.native.js.map +1 -1
  514. package/dist/jsx/views/treeViewMotion.native.js.map +1 -1
  515. package/dist/jsx/views/treeViewReveal.native.js.map +1 -1
  516. package/package.json +9 -9
  517. package/src/AlertDialogContent.stories.tsx +2 -1
  518. package/src/Dialog.spec.tsx +165 -0
  519. package/src/Dialog.tsx +80 -0
  520. package/src/DialogContent.stories.tsx +2 -1
  521. package/src/code/HighlightedCode/HighlightedCode.stories.tsx +18 -42
  522. package/src/code/Highlighter/houseSyntaxTheme.spec.ts +77 -0
  523. package/src/code/Highlighter/houseSyntaxTheme.ts +151 -0
  524. package/src/code/Highlighter/index.ts +7 -8
  525. package/src/code/syntaxInk.spec.tsx +50 -0
  526. package/src/knobImmuneExports.ts +0 -3
  527. package/src/tamagui.spec.ts +5 -4
  528. package/src/tamagui.ts +4 -1
  529. package/types/Dialog.d.ts +4 -0
  530. package/types/Dialog.d.ts.map +1 -0
  531. package/types/code/Highlighter/houseSyntaxTheme.d.ts +23 -0
  532. package/types/code/Highlighter/houseSyntaxTheme.d.ts.map +1 -0
  533. package/types/code/Highlighter/index.d.ts +2 -0
  534. package/types/code/Highlighter/index.d.ts.map +1 -1
  535. package/types/knobImmuneExports.d.ts.map +1 -1
  536. package/types/tamagui.d.ts +2 -1
  537. package/types/tamagui.d.ts.map +1 -1
@@ -0,0 +1,165 @@
1
+ import { renderWithProviders } from "@multiplatform.one/test-utils";
2
+ import { X } from "@tamagui/lucide-icons-2";
3
+ import { cleanup, fireEvent, screen, waitFor } from "@testing-library/react";
4
+ import type { ReactNode } from "react";
5
+ import { AlertDialog as TamaguiAlertDialog, Dialog as TamaguiDialog } from "tamagui";
6
+ import { afterEach, describe, expect, it, vi } from "vitest";
7
+ import { AlertDialog, Button, Dialog } from "./index";
8
+
9
+ const catalog = vi.hoisted(() => ({ current: {} as Record<string, string> }));
10
+
11
+ vi.mock("./shared/i18n", () => ({
12
+ useTranslation: () => ({ t: (key: string) => catalog.current[key] ?? key }),
13
+ }));
14
+
15
+ afterEach(() => {
16
+ cleanup();
17
+ catalog.current = {};
18
+ });
19
+
20
+ function OpenDialog({ children }: { children: ReactNode }) {
21
+ return (
22
+ <Dialog open>
23
+ <Dialog.Portal>
24
+ <Dialog.Content>
25
+ <Dialog.Title>Edit profile</Dialog.Title>
26
+ {children}
27
+ </Dialog.Content>
28
+ </Dialog.Portal>
29
+ </Dialog>
30
+ );
31
+ }
32
+
33
+ function OpenAlertDialog({ children }: { children: ReactNode }) {
34
+ return (
35
+ <AlertDialog open>
36
+ <AlertDialog.Portal>
37
+ <AlertDialog.Content>
38
+ <AlertDialog.Title>Delete account?</AlertDialog.Title>
39
+ {children}
40
+ </AlertDialog.Content>
41
+ </AlertDialog.Portal>
42
+ </AlertDialog>
43
+ );
44
+ }
45
+
46
+ const noDialogClose = () =>
47
+ expect(screen.queryAllByRole("button", { name: "Dialog Close" })).toHaveLength(0);
48
+
49
+ describe("house Dialog.Close is named by what it shows (MPO-476)", () => {
50
+ it("keeps each asChild button's visible label as its accessible name", () => {
51
+ renderWithProviders(
52
+ <OpenDialog>
53
+ <Dialog.Close asChild>
54
+ <Button>Cancel</Button>
55
+ </Dialog.Close>
56
+ <Dialog.Close asChild>
57
+ <Button theme="accent">Save changes</Button>
58
+ </Dialog.Close>
59
+ </OpenDialog>,
60
+ );
61
+ expect(screen.getByRole("button", { name: "Cancel" })).toBeTruthy();
62
+ expect(screen.getByRole("button", { name: "Save changes" })).toBeTruthy();
63
+ noDialogClose();
64
+ });
65
+
66
+ it("names a bare close with text by that text", () => {
67
+ renderWithProviders(
68
+ <OpenDialog>
69
+ <Dialog.Close>Done</Dialog.Close>
70
+ </OpenDialog>,
71
+ );
72
+ expect(screen.getByRole("button", { name: "Done" })).toBeTruthy();
73
+ noDialogClose();
74
+ });
75
+
76
+ it("gives an icon-only close the localized Close", () => {
77
+ catalog.current = { Close: "మూసివేయి" };
78
+ renderWithProviders(
79
+ <OpenDialog>
80
+ <Dialog.Close asChild>
81
+ <Button circular icon={X} />
82
+ </Dialog.Close>
83
+ <Dialog.Close>
84
+ <X />
85
+ </Dialog.Close>
86
+ </OpenDialog>,
87
+ );
88
+ expect(screen.getAllByRole("button", { name: "మూసివేయి" })).toHaveLength(2);
89
+ noDialogClose();
90
+ });
91
+
92
+ it("keeps an explicit label on the part or its child", () => {
93
+ renderWithProviders(
94
+ <OpenDialog>
95
+ <Dialog.Close asChild>
96
+ <Button circular icon={X} aria-label="Close dialog" />
97
+ </Dialog.Close>
98
+ <Dialog.Close aria-label="Dismiss">
99
+ <X />
100
+ </Dialog.Close>
101
+ </OpenDialog>,
102
+ );
103
+ expect(screen.getByRole("button", { name: "Close dialog" })).toBeTruthy();
104
+ expect(screen.getByRole("button", { name: "Dismiss" })).toBeTruthy();
105
+ });
106
+
107
+ it("still closes the dialog", async () => {
108
+ renderWithProviders(
109
+ <Dialog defaultOpen>
110
+ <Dialog.Portal>
111
+ <Dialog.Content>
112
+ <Dialog.Title>Edit profile</Dialog.Title>
113
+ <Dialog.Close asChild>
114
+ <Button>Cancel</Button>
115
+ </Dialog.Close>
116
+ </Dialog.Content>
117
+ </Dialog.Portal>
118
+ </Dialog>,
119
+ );
120
+ fireEvent.click(screen.getByRole("button", { name: "Cancel" }));
121
+ await waitFor(() => expect(screen.queryByText("Edit profile")).toBeNull());
122
+ });
123
+
124
+ it("changes only Close; every other part is tamagui's", () => {
125
+ expect(Dialog.Close).not.toBe(TamaguiDialog.Close);
126
+ for (const part of ["Trigger", "Portal", "Overlay", "Content", "Title", "Description"]) {
127
+ expect(Dialog[part as keyof typeof Dialog]).toBe(
128
+ TamaguiDialog[part as keyof typeof TamaguiDialog],
129
+ );
130
+ }
131
+ });
132
+ });
133
+
134
+ describe("house AlertDialog Cancel and Action are named by what they show (MPO-476)", () => {
135
+ it("keeps each asChild button's visible label as its accessible name", () => {
136
+ renderWithProviders(
137
+ <OpenAlertDialog>
138
+ <AlertDialog.Cancel asChild>
139
+ <Button>Cancel</Button>
140
+ </AlertDialog.Cancel>
141
+ <AlertDialog.Action asChild>
142
+ <Button theme="error">Yes, delete</Button>
143
+ </AlertDialog.Action>
144
+ <AlertDialog.Destructive asChild>
145
+ <Button theme="error">Delete forever</Button>
146
+ </AlertDialog.Destructive>
147
+ </OpenAlertDialog>,
148
+ );
149
+ expect(screen.getByRole("button", { name: "Cancel" })).toBeTruthy();
150
+ expect(screen.getByRole("button", { name: "Yes, delete" })).toBeTruthy();
151
+ expect(screen.getByRole("button", { name: "Delete forever" })).toBeTruthy();
152
+ noDialogClose();
153
+ });
154
+
155
+ it("changes only the close parts; every other part is tamagui's", () => {
156
+ for (const part of ["Cancel", "Action", "Destructive"] as const) {
157
+ expect(AlertDialog[part]).not.toBe(TamaguiAlertDialog[part]);
158
+ }
159
+ for (const part of ["Trigger", "Portal", "Overlay", "Content", "Title", "Description"]) {
160
+ expect(AlertDialog[part as keyof typeof AlertDialog]).toBe(
161
+ TamaguiAlertDialog[part as keyof typeof TamaguiAlertDialog],
162
+ );
163
+ }
164
+ });
165
+ });
package/src/Dialog.tsx ADDED
@@ -0,0 +1,80 @@
1
+ /**
2
+ * House Dialog and AlertDialog: the tamagui roots with their close parts named
3
+ * by what they show (MPO-476).
4
+ *
5
+ * tamagui 2.7's Dialog.Close sets `aria-label="Dialog Close"` and asChild
6
+ * merges it onto the child, so `<Dialog.Close asChild><Button>Cancel</Button>`
7
+ * was announced "Dialog Close", in English, in every locale. AlertDialog's
8
+ * Cancel, Action and Destructive render the same Close. A visible label that
9
+ * is not in the accessible name fails WCAG 2.5.3.
10
+ *
11
+ * Here a close part with text (its own, or its asChild child's) is named by
12
+ * that text. One with no text and no label of its own, an icon-only X, gets
13
+ * the catalog's localized "Close". An explicit label on the part or on its
14
+ * child still wins. Every other part is the tamagui one.
15
+ */
16
+ import { isValidElement, type ComponentType, type ReactNode } from "react";
17
+ import {
18
+ AlertDialog as TamaguiAlertDialog,
19
+ Dialog as TamaguiDialog,
20
+ withStaticProperties,
21
+ type GetProps,
22
+ } from "tamagui";
23
+ import { useTranslation } from "./shared/i18n";
24
+
25
+ type Labelled = {
26
+ "aria-label"?: unknown;
27
+ "aria-labelledby"?: unknown;
28
+ accessibilityLabel?: unknown;
29
+ };
30
+
31
+ function hasText(node: ReactNode): boolean {
32
+ if (typeof node === "string") return node.trim().length > 0;
33
+ if (typeof node === "number" || typeof node === "bigint") return true;
34
+ if (Array.isArray(node)) return node.some(hasText);
35
+ if (isValidElement<{ children?: ReactNode }>(node)) return hasText(node.props.children);
36
+ return false;
37
+ }
38
+
39
+ function isLabelled(props: Labelled): boolean {
40
+ return (
41
+ props["aria-label"] != null ||
42
+ props["aria-labelledby"] != null ||
43
+ props.accessibilityLabel != null
44
+ );
45
+ }
46
+
47
+ function needsCloseName(props: Labelled & { asChild?: unknown; children?: ReactNode }): boolean {
48
+ if (isLabelled(props)) return false;
49
+ const { asChild, children } = props;
50
+ if (asChild && isValidElement<Labelled & { children?: ReactNode }>(children)) {
51
+ return !isLabelled(children.props) && !hasText(children.props.children);
52
+ }
53
+ return !hasText(children);
54
+ }
55
+
56
+ function namedByContent<C extends ComponentType<any>>(Part: C, displayName: string) {
57
+ const Raw = Part as ComponentType<any>;
58
+
59
+ function LocalizedClose(props: GetProps<C>) {
60
+ const { t } = useTranslation();
61
+ return <Raw aria-label={t("Close")} {...props} />;
62
+ }
63
+
64
+ function Close(props: GetProps<C>) {
65
+ if (needsCloseName(props)) return <LocalizedClose {...props} />;
66
+ return <Raw aria-label={undefined} {...props} />;
67
+ }
68
+ Close.displayName = displayName;
69
+ return Close;
70
+ }
71
+
72
+ export const Dialog: typeof TamaguiDialog = withStaticProperties(TamaguiDialog, {
73
+ Close: namedByContent(TamaguiDialog.Close, "DialogClose"),
74
+ });
75
+
76
+ export const AlertDialog: typeof TamaguiAlertDialog = withStaticProperties(TamaguiAlertDialog, {
77
+ Cancel: namedByContent(TamaguiAlertDialog.Cancel, "AlertDialogCancel"),
78
+ Action: namedByContent(TamaguiAlertDialog.Action, "AlertDialogAction"),
79
+ Destructive: namedByContent(TamaguiAlertDialog.Destructive, "AlertDialogDestructive"),
80
+ });
@@ -4,7 +4,8 @@ import { useState } from "react";
4
4
  // DialogContent so it inherits the compact nested-scale step (LC-73); the
5
5
  // dialog frame itself does not ring (LC-71).
6
6
  import { Button } from "@multiplatform.one/forms";
7
- import { Dialog, Paragraph, XStack, YStack } from "tamagui";
7
+ import { Paragraph, XStack, YStack } from "tamagui";
8
+ import { Dialog } from "./Dialog";
8
9
  import { DialogContent, DialogOverlay } from "./surfaces";
9
10
 
10
11
  function DialogHarness({
@@ -1,56 +1,32 @@
1
1
  import type { Meta, StoryObj } from "@storybook/react-native-web-vite";
2
2
  import type { ComponentProps } from "react";
3
- import { YStack, useThemeName } from "tamagui";
3
+ import { YStack } from "tamagui";
4
4
  import { HighlightedCode } from "./index";
5
5
  import type { HighlightLine } from "../Highlighter";
6
6
 
7
- // one-dark-ish palette for dark scheme, github-light-ish (WCAG AA on light
8
- // surfaces) palette for light scheme
9
- const darkSampleTokens: HighlightLine[] = [
7
+ // What highlightCode returns under the house syntax theme: theme tokens, so
8
+ // one fixture reads in both schemes (MPO-474).
9
+ const sampleTokens: HighlightLine[] = [
10
10
  [
11
- { content: "const ", color: "#c678dd" },
12
- { content: "hello", color: "#e06c75" },
13
- { content: " = ", color: "#56b6c2" },
14
- { content: "'world'", color: "#98c379" },
15
- { content: ";", color: "#abb2bf" },
11
+ { content: "const", color: "$syntaxPurple" },
12
+ { content: " ", color: "$color12" },
13
+ { content: "hello", color: "$syntaxBlue" },
14
+ { content: " ", color: "$color12" },
15
+ { content: "=", color: "$syntaxPurple" },
16
+ { content: " ", color: "$color12" },
17
+ { content: "'world'", color: "$syntaxGreen" },
18
+ { content: ";", color: "$color12" },
16
19
  ],
17
20
  [
18
- { content: "console", color: "#e5c07b" },
19
- { content: ".", color: "#abb2bf" },
20
- { content: "log", color: "#61afef" },
21
- { content: "(", color: "#abb2bf" },
22
- { content: "hello", color: "#e06c75" },
23
- { content: ");", color: "#abb2bf" },
21
+ { content: "console.", color: "$color12" },
22
+ { content: "log", color: "$syntaxBlue" },
23
+ { content: "(hello);", color: "$color12" },
24
24
  ],
25
25
  ];
26
26
 
27
- const lightSampleTokens: HighlightLine[] = [
28
- [
29
- { content: "const ", color: "#cf222e" },
30
- { content: "hello", color: "#8250df" },
31
- { content: " = ", color: "#0550ae" },
32
- { content: "'world'", color: "#0a3069" },
33
- { content: ";", color: "#57606a" },
34
- ],
35
- [
36
- { content: "console", color: "#953800" },
37
- { content: ".", color: "#57606a" },
38
- { content: "log", color: "#8250df" },
39
- { content: "(", color: "#57606a" },
40
- { content: "hello", color: "#8250df" },
41
- { content: ");", color: "#57606a" },
42
- ],
43
- ];
44
-
45
- function useSampleTokens(): HighlightLine[] {
46
- const themeName = useThemeName();
47
- return themeName?.includes("dark") ? darkSampleTokens : lightSampleTokens;
48
- }
49
-
50
- const SampleHighlightedCode = (props: Omit<ComponentProps<typeof HighlightedCode>, "tokens">) => {
51
- const tokens = useSampleTokens();
52
- return <HighlightedCode tokens={tokens} {...props} />;
53
- };
27
+ const SampleHighlightedCode = (props: Omit<ComponentProps<typeof HighlightedCode>, "tokens">) => (
28
+ <HighlightedCode tokens={sampleTokens} {...props} />
29
+ );
54
30
 
55
31
  const meta: Meta<typeof HighlightedCode> = {
56
32
  title: "Components/HighlightedCode",
@@ -0,0 +1,77 @@
1
+ /**
2
+ * MPO-474: the shiki stack paints theme tokens, not GitHub hex. github-light
3
+ * measured 3.13 to 4.35:1 on the house code surfaces and github-dark's comment
4
+ * 3.77:1, and neither palette follows the scheme or the knobs.
5
+ */
6
+
7
+ import { bundledThemes } from "shiki";
8
+ import { describe, expect, it } from "vitest";
9
+ import { highlightCode, houseSyntaxTheme } from "./index";
10
+
11
+ const houseInk = /^\$(color11|color12|syntax(Purple|Green|Blue|Orange|Red))$/;
12
+
13
+ const sample = `// Greets a user
14
+ export function greet(user: User, retries = 3): string {
15
+ const label = \`Hello, \${user.name}\`;
16
+ console.log(label, true, null);
17
+ return label;
18
+ }`;
19
+
20
+ async function inkOf(code: string, language: string, content: string, theme?: string) {
21
+ const lines = await highlightCode(code, language, theme);
22
+ const token = lines.flat().find((candidate) => candidate.content.trim() === content);
23
+ expect(token, `no token ${JSON.stringify(content)}`).toBeTruthy();
24
+ return token!.color;
25
+ }
26
+
27
+ describe("MPO-474: the default highlighter theme paints the held syntax tokens", () => {
28
+ it("every token of a TypeScript sample takes a house ink", { timeout: 30000 }, async () => {
29
+ const lines = await highlightCode(sample, "typescript");
30
+ const inks = new Set(lines.flat().map((token) => token.color));
31
+ expect(inks.size).toBeGreaterThan(4);
32
+ for (const color of inks) expect(color).toMatch(houseInk);
33
+ });
34
+
35
+ it.each([
36
+ ["// Greets a user", "$color11"],
37
+ ["export", "$syntaxPurple"],
38
+ ["function", "$syntaxPurple"],
39
+ ["greet", "$syntaxBlue"],
40
+ ["User", "$syntaxBlue"],
41
+ ["3", "$syntaxBlue"],
42
+ ["true", "$syntaxBlue"],
43
+ ["string", "$syntaxOrange"],
44
+ ["retries", "$syntaxOrange"],
45
+ ["`Hello, ${", "$syntaxGreen"],
46
+ ])("%s paints %s", { timeout: 30000 }, async (content, ink) => {
47
+ expect(await inkOf(sample, "typescript", content)).toBe(ink);
48
+ });
49
+
50
+ it("diff lines paint the red and green the washes are held for", { timeout: 30000 }, async () => {
51
+ const diff = "- const retries = 1;\n+ const retries = 3;";
52
+ expect(await inkOf(diff, "diff", "- const retries = 1;")).toBe("$syntaxRed");
53
+ expect(await inkOf(diff, "diff", "+ const retries = 3;")).toBe("$syntaxGreen");
54
+ });
55
+
56
+ it("markup tags paint green like the editor's", { timeout: 30000 }, async () => {
57
+ expect(await inkOf('<a href="/x">hi</a>', "html", "a")).toBe("$syntaxGreen");
58
+ });
59
+
60
+ it("an explicit theme still ejects to its literal palette", { timeout: 30000 }, async () => {
61
+ expect((await inkOf(sample, "typescript", "export", "github-light"))?.toLowerCase()).toBe(
62
+ "#d73a49",
63
+ );
64
+ });
65
+
66
+ it("keeps github-light's scope rules one for one, painted only in house ink", async () => {
67
+ const githubLight = (await bundledThemes["github-light"]()).default;
68
+ const scopesOf = (settings: { scope?: string | string[] }[]) =>
69
+ settings.map((setting) => [setting.scope ?? []].flat().join(",")).filter(Boolean);
70
+ expect(scopesOf(houseSyntaxTheme.settings)).toEqual(
71
+ scopesOf(githubLight.tokenColors ?? githubLight.settings ?? []),
72
+ );
73
+ for (const setting of houseSyntaxTheme.settings) {
74
+ if (setting.settings.foreground) expect(setting.settings.foreground).toMatch(houseInk);
75
+ }
76
+ });
77
+ });
@@ -0,0 +1,151 @@
1
+ /**
2
+ * The house shiki theme (MPO-474): github-light's scope rules one for one,
3
+ * each painted with a theme token in the rich-text editor's roles, so code
4
+ * ink follows the scheme and tint and holds `holdSyntaxFloor`'s 4.5:1. Shiki
5
+ * passes a non-hex colour through untouched (a placeholder while tokenizing,
6
+ * restored on every token), which is what lets a theme name Tamagui tokens.
7
+ */
8
+
9
+ export interface HouseSyntaxThemeSetting {
10
+ scope?: string | string[];
11
+ settings: { foreground?: string; background?: string; fontStyle?: string };
12
+ }
13
+
14
+ export interface HouseSyntaxTheme {
15
+ name: string;
16
+ fg: string;
17
+ bg: string;
18
+ settings: HouseSyntaxThemeSetting[];
19
+ }
20
+
21
+ const ink = {
22
+ plain: "$color12",
23
+ muted: "$color11",
24
+ keyword: "$syntaxPurple",
25
+ name: "$syntaxBlue",
26
+ constant: "$syntaxBlue",
27
+ builtin: "$syntaxOrange",
28
+ variable: "$syntaxOrange",
29
+ string: "$syntaxGreen",
30
+ tag: "$syntaxGreen",
31
+ inserted: "$syntaxGreen",
32
+ deleted: "$syntaxRed",
33
+ } as const;
34
+
35
+ export const houseSyntaxTheme: HouseSyntaxTheme = {
36
+ name: "house",
37
+ fg: ink.plain,
38
+ bg: "$color3",
39
+ settings: [
40
+ { settings: { foreground: ink.plain, background: "$color3" } },
41
+ {
42
+ scope: ["comment", "punctuation.definition.comment", "string.comment"],
43
+ settings: { foreground: ink.muted },
44
+ },
45
+ {
46
+ scope: [
47
+ "constant",
48
+ "entity.name.constant",
49
+ "variable.other.constant",
50
+ "variable.other.enummember",
51
+ "variable.language",
52
+ ],
53
+ settings: { foreground: ink.constant },
54
+ },
55
+ { scope: ["entity", "entity.name"], settings: { foreground: ink.name } },
56
+ { scope: "variable.parameter.function", settings: { foreground: ink.plain } },
57
+ { scope: "entity.name.tag", settings: { foreground: ink.tag } },
58
+ { scope: "keyword", settings: { foreground: ink.keyword } },
59
+ { scope: ["storage", "storage.type"], settings: { foreground: ink.keyword } },
60
+ {
61
+ scope: ["storage.modifier.package", "storage.modifier.import", "storage.type.java"],
62
+ settings: { foreground: ink.plain },
63
+ },
64
+ {
65
+ scope: [
66
+ "string",
67
+ "punctuation.definition.string",
68
+ "string punctuation.section.embedded source",
69
+ ],
70
+ settings: { foreground: ink.string },
71
+ },
72
+ { scope: "support", settings: { foreground: ink.builtin } },
73
+ { scope: "meta.property-name", settings: { foreground: ink.constant } },
74
+ { scope: "variable", settings: { foreground: ink.variable } },
75
+ { scope: "variable.other", settings: { foreground: ink.plain } },
76
+ { scope: "invalid.broken", settings: { foreground: ink.deleted, fontStyle: "italic" } },
77
+ { scope: "invalid.deprecated", settings: { foreground: ink.deleted, fontStyle: "italic" } },
78
+ { scope: "invalid.illegal", settings: { foreground: ink.deleted, fontStyle: "italic" } },
79
+ { scope: "invalid.unimplemented", settings: { foreground: ink.deleted, fontStyle: "italic" } },
80
+ {
81
+ scope: "carriage-return",
82
+ settings: { foreground: ink.deleted, fontStyle: "italic underline" },
83
+ },
84
+ { scope: "message.error", settings: { foreground: ink.deleted } },
85
+ { scope: "string variable", settings: { foreground: ink.variable } },
86
+ { scope: ["source.regexp", "string.regexp"], settings: { foreground: ink.string } },
87
+ {
88
+ scope: [
89
+ "string.regexp.character-class",
90
+ "string.regexp constant.character.escape",
91
+ "string.regexp source.ruby.embedded",
92
+ "string.regexp string.regexp.arbitrary-repitition",
93
+ ],
94
+ settings: { foreground: ink.string },
95
+ },
96
+ {
97
+ scope: "string.regexp constant.character.escape",
98
+ settings: { foreground: ink.string, fontStyle: "bold" },
99
+ },
100
+ { scope: "support.constant", settings: { foreground: ink.builtin } },
101
+ { scope: "support.variable", settings: { foreground: ink.builtin } },
102
+ { scope: "meta.module-reference", settings: { foreground: ink.constant } },
103
+ {
104
+ scope: "punctuation.definition.list.begin.markdown",
105
+ settings: { foreground: ink.variable },
106
+ },
107
+ {
108
+ scope: ["markup.heading", "markup.heading entity.name"],
109
+ settings: { foreground: ink.name, fontStyle: "bold" },
110
+ },
111
+ { scope: "markup.quote", settings: { foreground: ink.muted } },
112
+ { scope: "markup.italic", settings: { foreground: ink.plain, fontStyle: "italic" } },
113
+ { scope: "markup.bold", settings: { foreground: ink.plain, fontStyle: "bold" } },
114
+ { scope: ["markup.underline"], settings: { fontStyle: "underline" } },
115
+ { scope: ["markup.strikethrough"], settings: { fontStyle: "strikethrough" } },
116
+ { scope: "markup.inline.raw", settings: { foreground: ink.constant } },
117
+ {
118
+ scope: ["markup.deleted", "meta.diff.header.from-file", "punctuation.definition.deleted"],
119
+ settings: { foreground: ink.deleted },
120
+ },
121
+ {
122
+ scope: ["markup.inserted", "meta.diff.header.to-file", "punctuation.definition.inserted"],
123
+ settings: { foreground: ink.inserted },
124
+ },
125
+ {
126
+ scope: ["markup.changed", "punctuation.definition.changed"],
127
+ settings: { foreground: ink.variable },
128
+ },
129
+ { scope: ["markup.ignored", "markup.untracked"], settings: { foreground: ink.constant } },
130
+ { scope: "meta.diff.range", settings: { foreground: ink.keyword, fontStyle: "bold" } },
131
+ { scope: "meta.diff.header", settings: { foreground: ink.constant } },
132
+ { scope: "meta.separator", settings: { foreground: ink.constant, fontStyle: "bold" } },
133
+ { scope: "meta.output", settings: { foreground: ink.constant } },
134
+ {
135
+ scope: [
136
+ "brackethighlighter.tag",
137
+ "brackethighlighter.curly",
138
+ "brackethighlighter.round",
139
+ "brackethighlighter.square",
140
+ "brackethighlighter.angle",
141
+ "brackethighlighter.quote",
142
+ ],
143
+ settings: { foreground: ink.muted },
144
+ },
145
+ { scope: "brackethighlighter.unmatched", settings: { foreground: ink.deleted } },
146
+ {
147
+ scope: ["constant.other.reference.link", "string.other.link"],
148
+ settings: { foreground: ink.string, fontStyle: "underline" },
149
+ },
150
+ ],
151
+ };
@@ -7,11 +7,14 @@
7
7
  */
8
8
 
9
9
  import { createContext, useContext, useEffect, useState } from "react";
10
- import { useThemeName } from "tamagui";
10
+ import { houseSyntaxTheme } from "./houseSyntaxTheme";
11
+
12
+ export * from "./houseSyntaxTheme";
11
13
 
12
14
  /** A single highlighted token with inline color */
13
15
  export interface HighlightToken {
14
16
  content: string;
17
+ /** A theme token such as `$syntaxBlue` under the house theme, or a named theme's hex */
15
18
  color?: string;
16
19
  fontStyle?: number; // 0=normal, 1=italic, 2=bold, 3=bold+italic
17
20
  }
@@ -37,11 +40,7 @@ export function useShikiTokens(
37
40
  theme?: string,
38
41
  ): HighlightLine[] | null {
39
42
  const ctx = useContext(ShikiContext);
40
- const themeName = useThemeName();
41
- // Default shiki theme follows the app scheme so light mode gets a
42
- // dark-on-light token palette instead of github-dark's light inks
43
- const schemeDefault = themeName?.includes("dark") ? "github-dark" : "github-light";
44
- const resolvedTheme = theme || ctx.theme || schemeDefault;
43
+ const resolvedTheme = theme || ctx.theme || houseSyntaxTheme.name;
45
44
  const [tokens, setTokens] = useState<HighlightLine[] | null>(null);
46
45
 
47
46
  useEffect(() => {
@@ -101,7 +100,7 @@ function getHighlighter(): Promise<any> {
101
100
  export async function highlightCode(
102
101
  code: string,
103
102
  language: string,
104
- theme = "github-dark",
103
+ theme = houseSyntaxTheme.name,
105
104
  ): Promise<HighlightLine[]> {
106
105
  try {
107
106
  const highlighter = await Promise.race([
@@ -111,7 +110,7 @@ export async function highlightCode(
111
110
  ),
112
111
  ]);
113
112
  await Promise.all([
114
- highlighter.loadTheme(theme as any),
113
+ highlighter.loadTheme((theme === houseSyntaxTheme.name ? houseSyntaxTheme : theme) as any),
115
114
  // Unknown languages fall back to plain text below; theme failures
116
115
  // reject into the catch (matching the old shorthand behavior).
117
116
  highlighter.loadLanguage(language as any).catch(() => {}),
@@ -0,0 +1,50 @@
1
+ /**
2
+ * MPO-474: every shiki surface (CodeBlock, MDXCodeBlock, markdown CodeBlock,
3
+ * CodeEditorField) tokenizes through useShikiTokens and paints through
4
+ * HighlightedCode. By default the ink is a theme token in either scheme, so
5
+ * Tamagui emits the token's class (`_col-syntaxPurpl…`), not a hex class
6
+ * (`_col-D73A4935`) that no scheme or knob can reach.
7
+ */
8
+
9
+ import { createDefaultThemeConfig } from "@multiplatform.one/theme";
10
+ import { cleanup, render, waitFor } from "@testing-library/react";
11
+ import { TamaguiProvider } from "tamagui";
12
+ import { afterEach, describe, expect, it } from "vitest";
13
+ import { HighlightedCode } from "./HighlightedCode";
14
+ import { useShikiTokens } from "./Highlighter";
15
+
16
+ afterEach(cleanup);
17
+
18
+ const houseConfig = createDefaultThemeConfig();
19
+ // Tamagui keeps a token's first 11 characters in its atomic class and hashes the rest.
20
+ const inkClass = (token: string) => new RegExp(`_col-${token.slice(0, 11)}`);
21
+
22
+ function Probe({ code, language, theme }: { code: string; language: string; theme?: string }) {
23
+ const tokens = useShikiTokens(code, language, theme);
24
+ return <HighlightedCode tokens={tokens}>{code}</HighlightedCode>;
25
+ }
26
+
27
+ function tokenSpan(container: HTMLElement, text: string) {
28
+ const matches = Array.from(container.querySelectorAll("span")).filter(
29
+ (span) => span.textContent === text,
30
+ );
31
+ return matches.find((span) => !matches.some((other) => other !== span && span.contains(other)));
32
+ }
33
+
34
+ describe("MPO-474: shiki ink is a theme token in both schemes", () => {
35
+ for (const scheme of ["light", "dark"] as const) {
36
+ it(`${scheme}: keyword, string and comment take the held tokens`, async () => {
37
+ const { container } = render(
38
+ <TamaguiProvider config={houseConfig.tamagui} defaultTheme={scheme} disableInjectCSS>
39
+ <Probe code={'// note\nconst greeting = "hi";'} language="typescript" />
40
+ </TamaguiProvider>,
41
+ );
42
+ await waitFor(
43
+ () => expect(tokenSpan(container, "const")?.className).toMatch(inkClass("syntaxPurple")),
44
+ { timeout: 30000 },
45
+ );
46
+ expect(tokenSpan(container, '"hi"')?.className).toMatch(inkClass("syntaxGreen"));
47
+ expect(tokenSpan(container, "// note")?.className).toMatch(inkClass("color11"));
48
+ }, 35000);
49
+ }
50
+ });
@@ -63,9 +63,6 @@ export const knobImmuneExports: Readonly<Record<string, string>> = {
63
63
  // Logic shells with no painted frame of their own; the knob channel lands
64
64
  // on the house content surfaces designed to fill them (DialogContent,
65
65
  // PopoverContent, SheetFrame, ConfirmDialog).
66
- Dialog: "composition root (logic/portal shell); knobs land on house DialogContent",
67
- AlertDialog:
68
- "composition root; knobs land on house ConfirmDialog / DialogContent surfaces composed inside",
69
66
  Popover: "composition root; knobs land on house PopoverContent",
70
67
  Sheet: "composition root; knobs land on house SheetFrame",
71
68
  Portal: "reparenting utility; renders children elsewhere, paints nothing",