@dxos/react-ui 0.8.4-main.7ace549 → 0.8.4-main.8360d9e660

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 (342) hide show
  1. package/dist/lib/browser/chunk-EJSGYGYH.mjs +774 -0
  2. package/dist/lib/browser/chunk-EJSGYGYH.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +3913 -68
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +73 -61
  7. package/dist/lib/browser/testing/index.mjs.map +4 -4
  8. package/dist/lib/node-esm/chunk-B7MXDDMJ.mjs +776 -0
  9. package/dist/lib/node-esm/chunk-B7MXDDMJ.mjs.map +7 -0
  10. package/dist/lib/node-esm/index.mjs +3913 -68
  11. package/dist/lib/node-esm/index.mjs.map +4 -4
  12. package/dist/lib/node-esm/meta.json +1 -1
  13. package/dist/lib/node-esm/testing/index.mjs +73 -61
  14. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  15. package/dist/types/src/components/Avatars/Avatar.d.ts.map +1 -1
  16. package/dist/types/src/components/Avatars/Avatar.stories.d.ts.map +1 -1
  17. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  18. package/dist/types/src/components/Button/Button.d.ts +3 -3
  19. package/dist/types/src/components/Button/Button.d.ts.map +1 -1
  20. package/dist/types/src/components/Button/IconButton.d.ts +2 -1
  21. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -1
  22. package/dist/types/src/components/Button/Toggle.d.ts +2 -2
  23. package/dist/types/src/components/Button/Toggle.d.ts.map +1 -1
  24. package/dist/types/src/components/Button/ToggleGroup.d.ts +10 -10
  25. package/dist/types/src/components/Button/ToggleGroup.d.ts.map +1 -1
  26. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts +4 -4
  27. package/dist/types/src/components/Card/Card.d.ts +107 -0
  28. package/dist/types/src/components/Card/Card.d.ts.map +1 -0
  29. package/dist/types/src/components/Card/Card.stories.d.ts +21 -0
  30. package/dist/types/src/components/Card/Card.stories.d.ts.map +1 -0
  31. package/dist/types/src/components/Card/index.d.ts +2 -0
  32. package/dist/types/src/components/Card/index.d.ts.map +1 -0
  33. package/dist/types/src/components/Clipboard/index.d.ts +10 -1
  34. package/dist/types/src/components/Clipboard/index.d.ts.map +1 -1
  35. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts +1 -1
  36. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts.map +1 -1
  37. package/dist/types/src/components/Dialog/AlertDialog.d.ts +26 -17
  38. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -1
  39. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -1
  40. package/dist/types/src/components/Dialog/Dialog.d.ts +35 -19
  41. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
  42. package/dist/types/src/components/Dialog/Dialog.stories.d.ts +9 -10
  43. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -1
  44. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts +1 -1
  45. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  46. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts +11 -0
  47. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts.map +1 -0
  48. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts +7 -0
  49. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts.map +1 -0
  50. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts +8 -0
  51. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -0
  52. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts +9 -0
  53. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts.map +1 -0
  54. package/dist/types/src/components/ErrorFallback/index.d.ts +5 -0
  55. package/dist/types/src/components/ErrorFallback/index.d.ts.map +1 -0
  56. package/dist/types/src/components/Icon/Icon.d.ts +1 -1
  57. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  58. package/dist/types/src/components/Image/Image.d.ts +14 -0
  59. package/dist/types/src/components/Image/Image.d.ts.map +1 -0
  60. package/dist/types/src/components/Image/Image.stories.d.ts +33 -0
  61. package/dist/types/src/components/Image/Image.stories.d.ts.map +1 -0
  62. package/dist/types/src/components/Image/index.d.ts +2 -0
  63. package/dist/types/src/components/Image/index.d.ts.map +1 -0
  64. package/dist/types/src/components/Input/Input.d.ts +7 -7
  65. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  66. package/dist/types/src/components/Input/Input.stories.d.ts +8 -8
  67. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  68. package/dist/types/src/components/List/List.d.ts +1 -1
  69. package/dist/types/src/components/List/List.d.ts.map +1 -1
  70. package/dist/types/src/components/List/List.stories.d.ts.map +1 -1
  71. package/dist/types/src/components/List/Treegrid.d.ts.map +1 -1
  72. package/dist/types/src/components/Main/Main.d.ts +9 -10
  73. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  74. package/dist/types/src/components/Main/Main.stories.d.ts +0 -3
  75. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  76. package/dist/types/src/components/{Menus → Menu}/ContextMenu.d.ts +6 -6
  77. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -0
  78. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -0
  79. package/dist/types/src/components/{Menus → Menu}/DropdownMenu.d.ts +52 -50
  80. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -0
  81. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts +20 -0
  82. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -0
  83. package/dist/types/src/components/Menu/index.d.ts.map +1 -0
  84. package/dist/types/src/components/Message/Message.d.ts +1 -1
  85. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  86. package/dist/types/src/components/Message/Message.stories.d.ts +3 -4
  87. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  88. package/dist/types/src/components/Popover/Popover.d.ts +29 -23
  89. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  90. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +23 -26
  91. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  92. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +44 -8
  93. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  94. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +4 -2
  95. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
  96. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +8 -2
  97. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -1
  98. package/dist/types/src/components/Select/Select.d.ts +9 -9
  99. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  100. package/dist/types/src/components/Separator/Separator.d.ts +4 -4
  101. package/dist/types/src/components/Separator/Separator.d.ts.map +1 -1
  102. package/dist/types/src/components/Skeleton/Skeleton.d.ts +12 -0
  103. package/dist/types/src/components/Skeleton/Skeleton.d.ts.map +1 -0
  104. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts +17 -0
  105. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -0
  106. package/dist/types/src/components/Skeleton/index.d.ts +2 -0
  107. package/dist/types/src/components/Skeleton/index.d.ts.map +1 -0
  108. package/dist/types/src/components/Splitter/Splitter.d.ts +32 -0
  109. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -0
  110. package/dist/types/src/components/Splitter/Splitter.stories.d.ts +7 -0
  111. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -0
  112. package/dist/types/src/components/Splitter/index.d.ts +2 -0
  113. package/dist/types/src/components/Splitter/index.d.ts.map +1 -0
  114. package/dist/types/src/components/Status/Status.stories.d.ts +4 -2
  115. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  116. package/dist/types/src/components/Tag/Tag.d.ts +1 -1
  117. package/dist/types/src/components/Tag/Tag.d.ts.map +1 -1
  118. package/dist/types/src/components/Tag/Tag.stories.d.ts +0 -5
  119. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  120. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +2 -2
  121. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  122. package/dist/types/src/components/{Menus/DropdownMenu.stories.d.ts → ThemeProvider/ThemeProvider.stories.d.ts} +2 -5
  123. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -0
  124. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +1 -8
  125. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
  126. package/dist/types/src/components/ThemeProvider/index.d.ts +2 -1
  127. package/dist/types/src/components/ThemeProvider/index.d.ts.map +1 -1
  128. package/dist/types/src/components/Toast/Toast.d.ts +19 -19
  129. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  130. package/dist/types/src/components/Toolbar/Toolbar.d.ts +39 -17
  131. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  132. package/dist/types/src/components/Tooltip/Tooltip.d.ts +9 -9
  133. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  134. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  135. package/dist/types/src/components/index.d.ts +9 -5
  136. package/dist/types/src/components/index.d.ts.map +1 -1
  137. package/dist/types/src/exemplars/generics.stories.d.ts +18 -0
  138. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -0
  139. package/dist/types/src/exemplars/slot.stories.d.ts +14 -0
  140. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -0
  141. package/dist/types/src/exemplars/tabster.stories.d.ts +8 -0
  142. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -0
  143. package/dist/types/src/exemplars/virtualizer.stories.d.ts +11 -0
  144. package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -0
  145. package/dist/types/src/hooks/index.d.ts +1 -0
  146. package/dist/types/src/hooks/index.d.ts.map +1 -1
  147. package/dist/types/src/hooks/useDensityContext.d.ts +1 -1
  148. package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
  149. package/dist/types/src/hooks/useElevationContext.d.ts +1 -1
  150. package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
  151. package/dist/types/src/index.d.ts +2 -1
  152. package/dist/types/src/index.d.ts.map +1 -1
  153. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  154. package/dist/types/src/primitives/Column/Column.d.ts +26 -0
  155. package/dist/types/src/primitives/Column/Column.d.ts.map +1 -0
  156. package/dist/types/src/primitives/Column/Column.stories.d.ts +6 -0
  157. package/dist/types/src/primitives/Column/Column.stories.d.ts.map +1 -0
  158. package/dist/types/src/primitives/Column/index.d.ts +2 -0
  159. package/dist/types/src/primitives/Column/index.d.ts.map +1 -0
  160. package/dist/types/src/primitives/Container/Container.d.ts +8 -0
  161. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -0
  162. package/dist/types/src/primitives/Container/Container.stories.d.ts +6 -0
  163. package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -0
  164. package/dist/types/src/primitives/Container/index.d.ts +2 -0
  165. package/dist/types/src/primitives/Container/index.d.ts.map +1 -0
  166. package/dist/types/src/primitives/Flex/Flex.d.ts +13 -0
  167. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -0
  168. package/dist/types/src/primitives/Flex/Flex.stories.d.ts +8 -0
  169. package/dist/types/src/primitives/Flex/Flex.stories.d.ts.map +1 -0
  170. package/dist/types/src/primitives/Flex/index.d.ts +2 -0
  171. package/dist/types/src/primitives/Flex/index.d.ts.map +1 -0
  172. package/dist/types/src/primitives/Grid/Grid.d.ts +15 -0
  173. package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -0
  174. package/dist/types/src/primitives/Grid/Grid.stories.d.ts +8 -0
  175. package/dist/types/src/primitives/Grid/Grid.stories.d.ts.map +1 -0
  176. package/dist/types/src/primitives/Grid/index.d.ts +2 -0
  177. package/dist/types/src/primitives/Grid/index.d.ts.map +1 -0
  178. package/dist/types/src/primitives/Panel/Panel.d.ts +26 -0
  179. package/dist/types/src/primitives/Panel/Panel.d.ts.map +1 -0
  180. package/dist/types/src/primitives/Panel/Panel.stories.d.ts +6 -0
  181. package/dist/types/src/primitives/Panel/Panel.stories.d.ts.map +1 -0
  182. package/dist/types/src/primitives/Panel/index.d.ts +2 -0
  183. package/dist/types/src/primitives/Panel/index.d.ts.map +1 -0
  184. package/dist/types/src/primitives/index.d.ts +6 -0
  185. package/dist/types/src/primitives/index.d.ts.map +1 -0
  186. package/dist/types/src/testing/Loading.d.ts +9 -0
  187. package/dist/types/src/testing/Loading.d.ts.map +1 -0
  188. package/dist/types/src/testing/decorators/withLayout.d.ts +3 -3
  189. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -1
  190. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts +1 -1
  191. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -1
  192. package/dist/types/src/testing/decorators/withTheme.d.ts +3 -2
  193. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  194. package/dist/types/src/testing/index.d.ts +1 -0
  195. package/dist/types/src/testing/index.d.ts.map +1 -1
  196. package/dist/types/src/translations.d.ts +11 -0
  197. package/dist/types/src/translations.d.ts.map +1 -0
  198. package/dist/types/src/util/index.d.ts +1 -2
  199. package/dist/types/src/util/index.d.ts.map +1 -1
  200. package/dist/types/tsconfig.tsbuildinfo +1 -1
  201. package/package.json +40 -31
  202. package/src/components/Avatars/Avatar.stories.tsx +5 -6
  203. package/src/components/Avatars/Avatar.tsx +6 -13
  204. package/src/components/Avatars/AvatarGroup.stories.tsx +2 -2
  205. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +3 -3
  206. package/src/components/Breadcrumb/Breadcrumb.tsx +11 -37
  207. package/src/components/Button/Button.stories.tsx +3 -3
  208. package/src/components/Button/Button.tsx +9 -15
  209. package/src/components/Button/IconButton.stories.tsx +4 -4
  210. package/src/components/Button/IconButton.tsx +9 -5
  211. package/src/components/Button/Toggle.stories.tsx +2 -2
  212. package/src/components/Button/Toggle.tsx +4 -4
  213. package/src/components/Button/ToggleGroup.stories.tsx +2 -2
  214. package/src/components/Button/ToggleGroup.tsx +12 -16
  215. package/src/components/Card/Card.stories.tsx +151 -0
  216. package/src/components/Card/Card.tsx +390 -0
  217. package/src/components/Card/index.ts +5 -0
  218. package/src/components/Clipboard/CopyButton.tsx +6 -6
  219. package/src/components/DensityProvider/DensityProvider.tsx +1 -1
  220. package/src/components/Dialog/AlertDialog.stories.tsx +15 -15
  221. package/src/components/Dialog/AlertDialog.tsx +137 -54
  222. package/src/components/Dialog/Dialog.stories.tsx +83 -28
  223. package/src/components/Dialog/Dialog.tsx +191 -75
  224. package/src/components/ElevationProvider/ElevationProvider.tsx +1 -1
  225. package/src/components/ErrorFallback/ErrorFallback.stories.tsx +50 -0
  226. package/src/components/ErrorFallback/ErrorFallback.tsx +70 -0
  227. package/src/components/ErrorFallback/ErrorStack.tsx +80 -0
  228. package/src/components/ErrorFallback/ThrowError.tsx +37 -0
  229. package/src/components/ErrorFallback/index.ts +9 -0
  230. package/src/components/Icon/Icon.stories.tsx +3 -3
  231. package/src/components/Icon/Icon.tsx +4 -3
  232. package/src/components/Image/Image.stories.tsx +86 -0
  233. package/src/components/Image/Image.tsx +223 -0
  234. package/src/components/Image/index.ts +5 -0
  235. package/src/components/Input/Input.stories.tsx +21 -40
  236. package/src/components/Input/Input.tsx +36 -72
  237. package/src/components/Link/Link.stories.tsx +2 -2
  238. package/src/components/Link/Link.tsx +2 -2
  239. package/src/components/List/List.stories.tsx +30 -33
  240. package/src/components/List/List.tsx +12 -17
  241. package/src/components/List/ListDropIndicator.tsx +7 -7
  242. package/src/components/List/Tree.stories.tsx +4 -4
  243. package/src/components/List/TreeDropIndicator.tsx +6 -6
  244. package/src/components/List/Treegrid.stories.tsx +3 -3
  245. package/src/components/List/Treegrid.tsx +10 -15
  246. package/src/components/Main/Main.stories.tsx +41 -23
  247. package/src/components/Main/Main.tsx +139 -82
  248. package/src/components/{Menus → Menu}/ContextMenu.stories.tsx +2 -2
  249. package/src/components/{Menus → Menu}/ContextMenu.tsx +9 -33
  250. package/src/components/{Menus → Menu}/DropdownMenu.stories.tsx +2 -2
  251. package/src/components/{Menus → Menu}/DropdownMenu.tsx +113 -105
  252. package/src/components/Message/Message.stories.tsx +26 -11
  253. package/src/components/Message/Message.tsx +46 -33
  254. package/src/components/Popover/Popover.stories.tsx +4 -4
  255. package/src/components/Popover/Popover.tsx +96 -91
  256. package/src/components/ScrollArea/ScrollArea.stories.tsx +166 -40
  257. package/src/components/ScrollArea/ScrollArea.tsx +84 -82
  258. package/src/components/ScrollArea/index.ts +1 -1
  259. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +41 -21
  260. package/src/components/ScrollContainer/ScrollContainer.tsx +101 -94
  261. package/src/components/Select/Select.stories.tsx +2 -2
  262. package/src/components/Select/Select.tsx +11 -27
  263. package/src/components/Separator/Separator.tsx +5 -8
  264. package/src/components/Skeleton/Skeleton.stories.tsx +52 -0
  265. package/src/components/Skeleton/Skeleton.tsx +26 -0
  266. package/src/components/Skeleton/index.ts +5 -0
  267. package/src/components/Splitter/Splitter.stories.tsx +83 -0
  268. package/src/components/Splitter/Splitter.tsx +126 -0
  269. package/src/components/Splitter/index.ts +5 -0
  270. package/src/components/Status/Status.stories.tsx +21 -17
  271. package/src/components/Status/Status.tsx +2 -2
  272. package/src/components/Tag/Tag.stories.tsx +6 -11
  273. package/src/components/Tag/Tag.tsx +3 -8
  274. package/src/components/ThemeProvider/ThemeProvider.stories.tsx +32 -0
  275. package/src/components/ThemeProvider/ThemeProvider.tsx +5 -6
  276. package/src/components/ThemeProvider/TranslationsProvider.tsx +1 -16
  277. package/src/components/ThemeProvider/index.ts +3 -3
  278. package/src/components/Toast/Toast.stories.tsx +2 -2
  279. package/src/components/Toast/Toast.tsx +22 -41
  280. package/src/components/Toolbar/Toolbar.stories.tsx +2 -2
  281. package/src/components/Toolbar/Toolbar.tsx +179 -19
  282. package/src/components/Tooltip/Tooltip.stories.tsx +15 -13
  283. package/src/components/Tooltip/Tooltip.tsx +40 -38
  284. package/src/components/index.ts +10 -6
  285. package/src/exemplars/generics.stories.tsx +49 -0
  286. package/src/exemplars/slot.stories.tsx +107 -0
  287. package/src/exemplars/tabster.stories.tsx +127 -0
  288. package/src/exemplars/virtualizer.stories.tsx +137 -0
  289. package/src/hooks/index.ts +1 -0
  290. package/src/hooks/useDensityContext.ts +1 -1
  291. package/src/hooks/useElevationContext.ts +1 -1
  292. package/src/index.ts +2 -1
  293. package/src/playground/Controls.stories.tsx +3 -10
  294. package/src/playground/Custom.stories.tsx +11 -11
  295. package/src/playground/Typography.stories.tsx +3 -3
  296. package/src/primitives/Column/Column.stories.tsx +78 -0
  297. package/src/primitives/Column/Column.tsx +133 -0
  298. package/src/primitives/Column/index.ts +5 -0
  299. package/src/primitives/Container/Container.stories.tsx +30 -0
  300. package/src/primitives/Container/Container.tsx +22 -0
  301. package/src/primitives/Container/index.ts +5 -0
  302. package/src/primitives/Flex/Flex.stories.tsx +58 -0
  303. package/src/primitives/Flex/Flex.tsx +29 -0
  304. package/src/primitives/Flex/index.ts +5 -0
  305. package/src/primitives/Grid/Grid.stories.tsx +57 -0
  306. package/src/primitives/Grid/Grid.tsx +35 -0
  307. package/src/primitives/Grid/index.ts +5 -0
  308. package/src/primitives/Panel/Panel.stories.tsx +67 -0
  309. package/src/primitives/Panel/Panel.tsx +119 -0
  310. package/src/primitives/Panel/index.ts +5 -0
  311. package/src/primitives/index.ts +9 -0
  312. package/src/testing/Loading.tsx +26 -0
  313. package/src/testing/decorators/withLayout.tsx +39 -18
  314. package/src/testing/decorators/withLayoutVariants.tsx +20 -23
  315. package/src/testing/decorators/withTheme.tsx +21 -18
  316. package/src/testing/index.ts +2 -0
  317. package/src/translations.ts +19 -0
  318. package/src/util/index.ts +2 -2
  319. package/dist/lib/browser/chunk-N5GDJTT2.mjs +0 -4707
  320. package/dist/lib/browser/chunk-N5GDJTT2.mjs.map +0 -7
  321. package/dist/lib/node-esm/chunk-SP7VQH72.mjs +0 -4709
  322. package/dist/lib/node-esm/chunk-SP7VQH72.mjs.map +0 -7
  323. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts +0 -15
  324. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts.map +0 -1
  325. package/dist/types/src/components/AnchoredOverflow/index.d.ts +0 -2
  326. package/dist/types/src/components/AnchoredOverflow/index.d.ts.map +0 -1
  327. package/dist/types/src/components/Menus/ContextMenu.d.ts.map +0 -1
  328. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts.map +0 -1
  329. package/dist/types/src/components/Menus/DropdownMenu.d.ts.map +0 -1
  330. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts.map +0 -1
  331. package/dist/types/src/components/Menus/index.d.ts.map +0 -1
  332. package/dist/types/src/util/ThemedClassName.d.ts +0 -5
  333. package/dist/types/src/util/ThemedClassName.d.ts.map +0 -1
  334. package/dist/types/src/util/domino.d.ts +0 -18
  335. package/dist/types/src/util/domino.d.ts.map +0 -1
  336. package/src/components/AnchoredOverflow/AnchoredOverflow.tsx +0 -59
  337. package/src/components/AnchoredOverflow/index.ts +0 -5
  338. package/src/util/ThemedClassName.ts +0 -7
  339. package/src/util/domino.ts +0 -53
  340. /package/dist/types/src/components/{Menus → Menu}/ContextMenu.stories.d.ts +0 -0
  341. /package/dist/types/src/components/{Menus → Menu}/index.d.ts +0 -0
  342. /package/src/components/{Menus → Menu}/index.ts +0 -0
@@ -2,149 +2,262 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
+ import * as DialogPrimitive from '@radix-ui/react-dialog';
5
6
  import { createContext } from '@radix-ui/react-context';
6
- import {
7
- DialogClose as DialogClosePrimitive,
8
- type DialogCloseProps as DialogClosePrimitiveProps,
9
- DialogContent as DialogContentPrimitive,
10
- type DialogContentProps as DialogContentPrimitiveProps,
11
- DialogDescription as DialogDescriptionPrimitive,
12
- type DialogDescriptionProps as DialogDescriptionPrimitiveProps,
13
- DialogOverlay as DialogOverlayPrimitive,
14
- type DialogOverlayProps as DialogOverlayPrimitiveProps,
15
- DialogPortal as DialogPortalPrimitive,
16
- type DialogPortalProps as DialogPortalPrimitiveProps,
17
- Root as DialogRootPrimitive,
18
- type DialogProps as DialogRootPrimitiveProps,
19
- DialogTitle as DialogTitlePrimitive,
20
- type DialogTitleProps as DialogTitlePrimitiveProps,
21
- DialogTrigger as DialogTriggerPrimitive,
22
- type DialogTriggerProps as DialogTriggerPrimitiveProps,
23
- } from '@radix-ui/react-dialog';
24
- import React, { type ForwardRefExoticComponent, type FunctionComponent, forwardRef } from 'react';
7
+ import React, {
8
+ type ComponentPropsWithRef,
9
+ type ForwardRefExoticComponent,
10
+ type FunctionComponent,
11
+ type PropsWithChildren,
12
+ forwardRef,
13
+ } from 'react';
14
+ import { useTranslation } from 'react-i18next';
15
+
16
+ import { type DialogSize, osTranslations } from '@dxos/ui-theme';
25
17
 
26
18
  import { useThemeContext } from '../../hooks';
19
+ import { Column } from '../../primitives';
27
20
  import { type ThemedClassName } from '../../util';
21
+ import { IconButton } from '../Button';
28
22
  import { ElevationProvider } from '../ElevationProvider';
29
23
 
30
- type DialogRootProps = DialogRootPrimitiveProps;
24
+ //
25
+ // Root
26
+ //
27
+
28
+ type DialogRootProps = DialogPrimitive.DialogProps;
31
29
 
32
30
  const DialogRoot: FunctionComponent<DialogRootProps> = (props) => (
33
31
  <ElevationProvider elevation='dialog'>
34
- <DialogRootPrimitive {...props} />
32
+ <DialogPrimitive.Root {...props} />
35
33
  </ElevationProvider>
36
34
  );
37
35
 
38
- type DialogTriggerProps = DialogTriggerPrimitiveProps;
39
-
40
- const DialogTrigger: FunctionComponent<DialogTriggerProps> = DialogTriggerPrimitive;
41
-
42
- type DialogPortalProps = DialogPortalPrimitiveProps;
36
+ //
37
+ // Trigger
38
+ //
43
39
 
44
- const DialogPortal: FunctionComponent<DialogPortalProps> = DialogPortalPrimitive;
40
+ type DialogTriggerProps = DialogPrimitive.DialogTriggerProps;
45
41
 
46
- type DialogTitleProps = ThemedClassName<DialogTitlePrimitiveProps> & { srOnly?: boolean };
42
+ const DialogTrigger: FunctionComponent<DialogTriggerProps> = DialogPrimitive.Trigger;
47
43
 
48
- const DialogTitle: ForwardRefExoticComponent<DialogTitleProps> = forwardRef<HTMLHeadingElement, DialogTitleProps>(
49
- ({ classNames, srOnly, ...props }, forwardedRef) => {
50
- const { tx } = useThemeContext();
51
- return (
52
- <DialogTitlePrimitive
53
- {...props}
54
- className={tx('dialog.title', 'dialog__title', { srOnly }, classNames)}
55
- ref={forwardedRef}
56
- />
57
- );
58
- },
59
- );
44
+ //
45
+ // Portal
46
+ //
60
47
 
61
- type DialogDescriptionProps = ThemedClassName<DialogDescriptionPrimitiveProps> & { srOnly?: boolean };
48
+ type DialogPortalProps = DialogPrimitive.DialogPortalProps;
62
49
 
63
- const DialogDescription: ForwardRefExoticComponent<DialogTitleProps> = forwardRef<
64
- HTMLParagraphElement,
65
- DialogDescriptionProps
66
- >(({ classNames, srOnly, ...props }, forwardedRef) => {
67
- const { tx } = useThemeContext();
68
- return (
69
- <DialogDescriptionPrimitive
70
- {...props}
71
- className={tx('dialog.description', 'dialog__description', { srOnly }, classNames)}
72
- ref={forwardedRef}
73
- />
74
- );
75
- });
50
+ const DialogPortal: FunctionComponent<DialogPortalProps> = DialogPrimitive.Portal;
76
51
 
77
- type DialogCloseProps = DialogClosePrimitiveProps;
52
+ //
53
+ // Overlay
54
+ //
78
55
 
79
- const DialogClose: FunctionComponent<DialogCloseProps> = DialogClosePrimitive;
56
+ const DIALOG_OVERLAY_NAME = 'DialogOverlay';
80
57
 
81
58
  type OverlayLayoutContextValue = { inOverlayLayout?: boolean };
82
- const DIALOG_OVERLAY_NAME = 'DialogOverlay';
83
- const DIALOG_CONTENT_NAME = 'DialogContent';
59
+
84
60
  const [OverlayLayoutProvider, useOverlayLayoutContext] = createContext<OverlayLayoutContextValue>(
85
61
  DIALOG_OVERLAY_NAME,
86
62
  {},
87
63
  );
88
64
 
89
- type DialogOverlayProps = ThemedClassName<DialogOverlayPrimitiveProps & { blockAlign?: 'center' | 'start' | 'end' }>;
65
+ type DialogOverlayProps = ThemedClassName<
66
+ DialogPrimitive.DialogOverlayProps & { blockAlign?: 'center' | 'start' | 'end' }
67
+ >;
90
68
 
91
69
  const DialogOverlay: ForwardRefExoticComponent<DialogOverlayProps> = forwardRef<HTMLDivElement, DialogOverlayProps>(
92
70
  ({ classNames, children, blockAlign, ...props }, forwardedRef) => {
93
71
  const { tx } = useThemeContext();
94
72
 
95
73
  return (
96
- <DialogOverlayPrimitive
74
+ <DialogPrimitive.Overlay
97
75
  {...props}
98
- className={tx('dialog.overlay', 'dialog__overlay', {}, classNames)}
99
- ref={forwardedRef}
100
76
  data-block-align={blockAlign}
77
+ className={tx('dialog.overlay', {}, classNames)}
78
+ ref={forwardedRef}
101
79
  >
102
80
  <OverlayLayoutProvider inOverlayLayout>{children}</OverlayLayoutProvider>
103
- </DialogOverlayPrimitive>
81
+ </DialogPrimitive.Overlay>
104
82
  );
105
83
  },
106
84
  );
107
85
 
108
86
  DialogOverlay.displayName = DIALOG_OVERLAY_NAME;
109
87
 
110
- type DialogContentProps = ThemedClassName<DialogContentPrimitiveProps> & { inOverlayLayout?: boolean };
88
+ //
89
+ // Content
90
+ //
91
+
92
+ const DIALOG_CONTENT_NAME = 'DialogContent';
93
+
94
+ type DialogContentProps = ThemedClassName<ComponentPropsWithRef<typeof DialogPrimitive.Content>> & {
95
+ size?: DialogSize;
96
+ inOverlayLayout?: boolean;
97
+ };
111
98
 
112
99
  const DialogContent: ForwardRefExoticComponent<DialogContentProps> = forwardRef<HTMLDivElement, DialogContentProps>(
113
- ({ classNames, children, inOverlayLayout: propsInOverlayLayout, ...props }, forwardedRef) => {
100
+ ({ classNames, children, size = 'md', inOverlayLayout: propsInOverlayLayout, ...props }, forwardedRef) => {
114
101
  const { tx } = useThemeContext();
115
102
  const { inOverlayLayout } = useOverlayLayoutContext(DIALOG_CONTENT_NAME);
116
103
 
117
104
  return (
118
- <DialogContentPrimitive
105
+ <DialogPrimitive.Content
106
+ {...props}
119
107
  // NOTE: Radix warning unless set to undefined.
120
108
  // https://www.radix-ui.com/primitives/docs/components/dialog#description
121
109
  aria-describedby={undefined}
122
- {...props}
123
- className={tx(
124
- 'dialog.content',
125
- 'dialog',
126
- { inOverlayLayout: propsInOverlayLayout || inOverlayLayout },
127
- classNames,
128
- )}
110
+ className={tx('dialog.content', { inOverlayLayout: propsInOverlayLayout || inOverlayLayout, size }, classNames)}
129
111
  ref={forwardedRef}
130
112
  >
131
- {children}
132
- </DialogContentPrimitive>
113
+ <Column.Root gutter='md'>{children}</Column.Root>
114
+ </DialogPrimitive.Content>
133
115
  );
134
116
  },
135
117
  );
136
118
 
137
119
  DialogContent.displayName = DIALOG_CONTENT_NAME;
138
120
 
121
+ //
122
+ // Header
123
+ //
124
+
125
+ type DialogHeaderProps = ThemedClassName<PropsWithChildren> & { srOnly?: boolean };
126
+
127
+ const DialogHeader: ForwardRefExoticComponent<DialogTitleProps> = forwardRef<HTMLHeadingElement, DialogTitleProps>(
128
+ ({ classNames, srOnly, ...props }, forwardedRef) => {
129
+ const { tx } = useThemeContext();
130
+ return (
131
+ <Column.Segment asChild>
132
+ <div role='heading' {...props} className={tx('dialog.header', { srOnly }, [classNames])} ref={forwardedRef} />
133
+ </Column.Segment>
134
+ );
135
+ },
136
+ );
137
+
138
+ //
139
+ // CloseIconButton
140
+ //
141
+
142
+ type DialogCloseIconButtonProps = { label?: string };
143
+
144
+ const DialogCloseIconButton = forwardRef<HTMLButtonElement, DialogCloseIconButtonProps>(
145
+ ({ label, ...props }, forwardedRef) => {
146
+ const { t } = useTranslation(osTranslations);
147
+ return (
148
+ <IconButton
149
+ {...props}
150
+ label={label ?? t('close dialog label')}
151
+ icon='ph--x--regular'
152
+ iconOnly
153
+ size={4}
154
+ density='fine'
155
+ variant='ghost'
156
+ ref={forwardedRef}
157
+ />
158
+ );
159
+ },
160
+ );
161
+
162
+ //
163
+ // Body
164
+ //
165
+
166
+ type DialogBodyProps = PropsWithChildren;
167
+
168
+ const DialogBody: ForwardRefExoticComponent<DialogBodyProps> = forwardRef<HTMLDivElement, DialogBodyProps>(
169
+ ({ children, ...props }, forwardedRef) => {
170
+ const { tx } = useThemeContext();
171
+ return (
172
+ <Column.Segment asChild>
173
+ <div role='none' {...props} className={tx('dialog.body')} ref={forwardedRef}>
174
+ {children}
175
+ </div>
176
+ </Column.Segment>
177
+ );
178
+ },
179
+ );
180
+
181
+ //
182
+ // Title
183
+ //
184
+
185
+ type DialogTitleProps = ThemedClassName<DialogPrimitive.DialogTitleProps> & { srOnly?: boolean };
186
+
187
+ const DialogTitle: ForwardRefExoticComponent<DialogTitleProps> = forwardRef<HTMLHeadingElement, DialogTitleProps>(
188
+ ({ classNames, srOnly, ...props }, forwardedRef) => {
189
+ const { tx } = useThemeContext();
190
+ return (
191
+ <DialogPrimitive.Title {...props} className={tx('dialog.title', { srOnly }, classNames)} ref={forwardedRef} />
192
+ );
193
+ },
194
+ );
195
+
196
+ //
197
+ // Description
198
+ //
199
+
200
+ type DialogDescriptionProps = ThemedClassName<DialogPrimitive.DialogDescriptionProps> & { srOnly?: boolean };
201
+
202
+ const DialogDescription: ForwardRefExoticComponent<DialogDescriptionProps> = forwardRef<
203
+ HTMLParagraphElement,
204
+ DialogDescriptionProps
205
+ >(({ classNames, srOnly, ...props }, forwardedRef) => {
206
+ const { tx } = useThemeContext();
207
+ return (
208
+ <DialogPrimitive.Description
209
+ {...props}
210
+ className={tx('dialog.description', { srOnly }, classNames)}
211
+ ref={forwardedRef}
212
+ />
213
+ );
214
+ });
215
+
216
+ //
217
+ // ActionBar
218
+ //
219
+
220
+ type DialogActionBarProps = ThemedClassName<PropsWithChildren>;
221
+
222
+ const DialogActionBar: ForwardRefExoticComponent<DialogActionBarProps> = forwardRef<
223
+ HTMLDivElement,
224
+ DialogActionBarProps
225
+ >(({ children, classNames, ...props }, forwardedRef) => {
226
+ const { tx } = useThemeContext();
227
+ return (
228
+ <Column.Segment asChild>
229
+ <div {...props} className={tx('dialog.actionbar', {}, classNames)} ref={forwardedRef}>
230
+ {children}
231
+ </div>
232
+ </Column.Segment>
233
+ );
234
+ });
235
+
236
+ //
237
+ // Close
238
+ //
239
+
240
+ type DialogCloseProps = DialogPrimitive.DialogCloseProps;
241
+
242
+ const DialogClose: FunctionComponent<DialogCloseProps> = DialogPrimitive.Close;
243
+
244
+ //
245
+ // Dialog
246
+ //
247
+
139
248
  export const Dialog = {
140
249
  Root: DialogRoot,
141
250
  Trigger: DialogTrigger,
142
251
  Portal: DialogPortal,
143
252
  Overlay: DialogOverlay,
144
253
  Content: DialogContent,
254
+ Header: DialogHeader,
255
+ Body: DialogBody,
145
256
  Title: DialogTitle,
146
257
  Description: DialogDescription,
258
+ ActionBar: DialogActionBar,
147
259
  Close: DialogClose,
260
+ CloseIconButton: DialogCloseIconButton,
148
261
  };
149
262
 
150
263
  export type {
@@ -153,7 +266,10 @@ export type {
153
266
  DialogPortalProps,
154
267
  DialogOverlayProps,
155
268
  DialogContentProps,
269
+ DialogHeaderProps,
270
+ DialogBodyProps,
156
271
  DialogTitleProps,
157
272
  DialogDescriptionProps,
273
+ DialogActionBarProps,
158
274
  DialogCloseProps,
159
275
  };
@@ -4,7 +4,7 @@
4
4
 
5
5
  import React, { type PropsWithChildren, createContext } from 'react';
6
6
 
7
- import { type Elevation } from '@dxos/react-ui-types';
7
+ import { type Elevation } from '@dxos/ui-types';
8
8
 
9
9
  export interface ElevationContextValue {
10
10
  elevation?: Elevation;
@@ -0,0 +1,50 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React from 'react';
7
+
8
+ import { ErrorBoundary } from '@dxos/react-error-boundary';
9
+
10
+ import { withLayout, withTheme } from '../../testing';
11
+
12
+ import { ErrorFallback } from './ErrorFallback';
13
+ import { ThrowError } from './ThrowError';
14
+
15
+ const BasicStory = () => {
16
+ return (
17
+ <ErrorBoundary name='story' FallbackComponent={ErrorFallback}>
18
+ <ThrowError />
19
+ </ErrorBoundary>
20
+ );
21
+ };
22
+
23
+ const StringErrorStory = () => {
24
+ return <ErrorFallback error='This is a string error message' data={{ context: 'story' }} />;
25
+ };
26
+
27
+ const meta: Meta = {
28
+ title: 'ui/react-ui-core/components/ErrorFallback',
29
+ component: ErrorFallback,
30
+ decorators: [withTheme(), withLayout({ layout: 'column' })],
31
+ parameters: {
32
+ layout: 'fullscreen',
33
+ },
34
+ };
35
+
36
+ export default meta;
37
+
38
+ type Story = StoryObj<typeof meta>;
39
+
40
+ export const Default: Story = {
41
+ render: BasicStory,
42
+ play: async () => {
43
+ // This story intentionally renders an ErrorBoundary fallback; clear the smoke-test error flag.
44
+ (window as any).__ERROR_BOUNDARY_ERRORS__ = [];
45
+ },
46
+ };
47
+
48
+ export const StringError: Story = {
49
+ render: StringErrorStory,
50
+ };
@@ -0,0 +1,70 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import React, { type PropsWithChildren } from 'react';
6
+ import { type FallbackProps } from 'react-error-boundary';
7
+
8
+ import { safeStringify } from '@dxos/util';
9
+
10
+ import { ErrorStack } from './ErrorStack';
11
+
12
+ export type ErrorFallbackProps = PropsWithChildren<Pick<FallbackProps, 'error'> & { title?: string; data?: any }>;
13
+
14
+ /**
15
+ * Themed fallback component for `ErrorBoundary`.
16
+ */
17
+ export const ErrorFallback = ({ children, error, title, data }: ErrorFallbackProps) => {
18
+ const isDev = process.env.NODE_ENV === 'development';
19
+ const message = error instanceof Error ? error.message : String(error);
20
+
21
+ return (
22
+ <div role='alert' data-testid='error-boundary-fallback' className='flex flex-col p-4 gap-4 overflow-auto'>
23
+ <h1 className='text-lg text-info-text'>{title ?? 'Runtime Error'}</h1>
24
+ <p>{message}</p>
25
+
26
+ {isDev && error instanceof Error && (
27
+ <Section
28
+ title='Stack'
29
+ onClick={() => {
30
+ const text = error instanceof Error ? (error.stack ?? error.message) : String(error);
31
+ void navigator.clipboard.writeText(text);
32
+ }}
33
+ >
34
+ <ErrorStack error={error} />
35
+ </Section>
36
+ )}
37
+
38
+ {data && (
39
+ <Section
40
+ title='Data'
41
+ onClick={() => {
42
+ void navigator.clipboard.writeText(JSON.stringify(data, undefined, 2));
43
+ }}
44
+ >
45
+ <pre className='overflow-x-auto text-xs'>{safeStringify(data, undefined, 2)}</pre>
46
+ </Section>
47
+ )}
48
+
49
+ {children}
50
+ </div>
51
+ );
52
+ };
53
+
54
+ const Section = ({ children, title, onClick }: PropsWithChildren<{ title?: string; onClick?: () => void }>) => {
55
+ return (
56
+ <div className='flex flex-col gap-1'>
57
+ {onClick && (
58
+ <button
59
+ type='button'
60
+ onClick={onClick}
61
+ className='flex items-center gap-1 text-xs text-subdued hover:text-primary-500 transition-colors'
62
+ title={`Copy ${title}`}
63
+ >
64
+ <h2 className='text-xs uppercase text-subdued'>{title}</h2>
65
+ </button>
66
+ )}
67
+ {children}
68
+ </div>
69
+ );
70
+ };
@@ -0,0 +1,80 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import ErrorStackParser from 'error-stack-parser';
6
+ import React from 'react';
7
+
8
+ import { mx } from '@dxos/ui-theme';
9
+
10
+ type LocalFrame = { href: string; fileName: string };
11
+
12
+ /**
13
+ * Renders a parsed error stack trace with tree connector symbols and clickable vscode:// links for local frames.
14
+ */
15
+ export const ErrorStack = ({ error }: { error: Error }) => {
16
+ const frames = ErrorStackParser.parse(error);
17
+
18
+ return (
19
+ <div className='font-mono text-sm'>
20
+ {frames.map((frame, i) => {
21
+ const isLast = i === frames.length - 1;
22
+ const local = frame.fileName
23
+ ? parseLocalFrame(frame.fileName, frame.lineNumber, frame.columnNumber)
24
+ : undefined;
25
+ const name = frame.functionName ?? '<anonymous>';
26
+ return (
27
+ <div
28
+ key={i}
29
+ className={mx(
30
+ 'grid grid-cols-[16px_1fr_auto_auto] items-stretch gap-x-2',
31
+ local && 'cursor-pointer hover:bg-hover-surface',
32
+ )}
33
+ >
34
+ {/* Tree connector: vertical line full-height + horizontal branch at midpoint */}
35
+ <div className='relative'>
36
+ <div
37
+ className={mx(
38
+ 'absolute left-1/2 -translate-x-1/2 w-px bg-neutral-500',
39
+ isLast ? 'top-0 h-1/2' : 'inset-y-0',
40
+ )}
41
+ />
42
+ <div className='absolute top-1/2 -translate-y-1/2 left-1/2 right-0 h-px bg-neutral-500' />
43
+ </div>
44
+ {local ? (
45
+ <a href={local.href} className='truncate self-center'>
46
+ {name}
47
+ </a>
48
+ ) : (
49
+ <span className='text-subdued truncate self-center'>{name}</span>
50
+ )}
51
+ <span className='text-xs text-subdued truncate self-center'>{local?.fileName ?? ''}</span>
52
+ <span className='text-xs text-subdued text-right self-center'>
53
+ {local ? `${frame.lineNumber}:${frame.columnNumber}` : ''}
54
+ </span>
55
+ </div>
56
+ );
57
+ })}
58
+ </div>
59
+ );
60
+ };
61
+
62
+ /**
63
+ * Parses a Vite `/@fs/` URL into a `vscode://` deep link and short filename.
64
+ * Returns undefined if the URL cannot be resolved to a local file.
65
+ */
66
+ const parseLocalFrame = (fileUrl: string, line?: number, col?: number): LocalFrame | undefined => {
67
+ try {
68
+ const { pathname } = new URL(fileUrl);
69
+ if (!pathname.startsWith('/@fs/')) {
70
+ return undefined;
71
+ }
72
+ const localPath = pathname.slice(4); // /@fs/Users/... → /Users/...
73
+ return {
74
+ href: `vscode://file/${localPath}:${line ?? 1}:${col ?? 1}`,
75
+ fileName: pathname.split('/').pop() ?? localPath,
76
+ };
77
+ } catch {
78
+ return undefined;
79
+ }
80
+ };
@@ -0,0 +1,37 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { useEffect, useState } from 'react';
6
+
7
+ export type ThrowErrorProps = {
8
+ error?: () => Error;
9
+ delay?: number;
10
+ };
11
+
12
+ /**
13
+ * Use this to debug the error boundary.
14
+ */
15
+ export const ThrowError = ({ delay = 1_000, ...props }: ThrowErrorProps) => {
16
+ const [error, setError] = useState<Error>();
17
+ useEffect(() => {
18
+ if (delay < 0) {
19
+ return;
20
+ }
21
+
22
+ const t = setTimeout(() => {
23
+ setError(generator({ delay, ...props }));
24
+ }, delay);
25
+ return () => clearTimeout(t);
26
+ }, [delay, generator]);
27
+
28
+ if (error) {
29
+ throw error;
30
+ }
31
+
32
+ return null;
33
+ };
34
+
35
+ const generator = ({ error, delay }: ThrowErrorProps) => {
36
+ return error?.() ?? new Error(`Error generated after ${delay}ms`);
37
+ };
@@ -0,0 +1,9 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ export { ErrorBoundary, type ErrorBoundaryProps, type FallbackProps } from '@dxos/react-error-boundary';
6
+
7
+ export * from './ErrorFallback';
8
+ export * from './ErrorStack';
9
+ export * from './ThrowError';
@@ -6,7 +6,7 @@ import { IconBase, type IconProps, type IconWeight } from '@phosphor-icons/react
6
6
  import { type Meta, type StoryObj } from '@storybook/react-vite';
7
7
  import React, { type FC, type ReactElement, type SVGProps, forwardRef } from 'react';
8
8
 
9
- import { getSize, mx } from '@dxos/react-ui-theme';
9
+ import { getSize, mx } from '@dxos/ui-theme';
10
10
 
11
11
  import { withTheme } from '../../testing';
12
12
 
@@ -60,9 +60,9 @@ const DefaultStory = ({ CustomIcon }: { CustomIcon: FC<IconProps> }) => {
60
60
  };
61
61
 
62
62
  const meta = {
63
- title: 'ui/react-ui-core/Icon',
63
+ title: 'ui/react-ui-core/components/Icon',
64
64
  render: DefaultStory,
65
- decorators: [withTheme],
65
+ decorators: [withTheme()],
66
66
  parameters: {
67
67
  layout: 'centered',
68
68
  },
@@ -5,7 +5,7 @@
5
5
  import { type Primitive } from '@radix-ui/react-primitive';
6
6
  import React, { type ComponentPropsWithRef, forwardRef, memo } from 'react';
7
7
 
8
- import { type Size } from '@dxos/react-ui-types';
8
+ import { type Size } from '@dxos/ui-types';
9
9
 
10
10
  import { useIconHref, useThemeContext } from '../../hooks';
11
11
  import { type ThemedClassName } from '../../util';
@@ -16,11 +16,12 @@ export type IconProps = ThemedClassName<ComponentPropsWithRef<typeof Primitive.s
16
16
  };
17
17
 
18
18
  export const Icon = memo(
19
- forwardRef<SVGSVGElement, IconProps>(({ icon, classNames, size = 4, ...props }, forwardedRef) => {
19
+ forwardRef<SVGSVGElement, IconProps>(({ icon, classNames, size, ...props }, forwardedRef) => {
20
20
  const { tx } = useThemeContext();
21
21
  const href = useIconHref(icon);
22
+
22
23
  return (
23
- <svg {...props} className={tx('icon.root', 'icon', { size }, classNames)} ref={forwardedRef}>
24
+ <svg {...props} className={tx('icon.root', { size }, classNames)} ref={forwardedRef}>
24
25
  <use href={href} />
25
26
  </svg>
26
27
  );