@dxos/react-ui 0.8.4-main.c1de068 → 0.8.4-main.c85a9c8dae

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 (433) hide show
  1. package/dist/lib/browser/chunk-2FKSMWNY.mjs +774 -0
  2. package/dist/lib/browser/chunk-2FKSMWNY.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +3931 -61
  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 +82 -60
  7. package/dist/lib/browser/testing/index.mjs.map +4 -4
  8. package/dist/lib/node-esm/chunk-ZNBLTSHI.mjs +776 -0
  9. package/dist/lib/node-esm/chunk-ZNBLTSHI.mjs.map +7 -0
  10. package/dist/lib/node-esm/index.mjs +3931 -61
  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 +82 -60
  14. package/dist/lib/node-esm/testing/index.mjs.map +4 -4
  15. package/dist/types/src/components/Avatars/Avatar.d.ts +1 -1
  16. package/dist/types/src/components/Avatars/Avatar.d.ts.map +1 -1
  17. package/dist/types/src/components/Avatars/Avatar.stories.d.ts +5 -31
  18. package/dist/types/src/components/Avatars/Avatar.stories.d.ts.map +1 -1
  19. package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts +5 -11
  20. package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts.map +1 -1
  21. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts +1 -1
  22. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  23. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts +8 -20
  24. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts.map +1 -1
  25. package/dist/types/src/components/{Buttons → Button}/Button.d.ts +2 -2
  26. package/dist/types/src/components/Button/Button.d.ts.map +1 -0
  27. package/dist/types/src/components/Button/Button.stories.d.ts +17 -0
  28. package/dist/types/src/components/Button/Button.stories.d.ts.map +1 -0
  29. package/dist/types/src/components/{Buttons → Button}/IconButton.d.ts +4 -4
  30. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -0
  31. package/dist/types/src/components/Button/IconButton.stories.d.ts +13 -0
  32. package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -0
  33. package/dist/types/src/components/Button/Toggle.d.ts.map +1 -0
  34. package/dist/types/src/components/Button/Toggle.stories.d.ts +16 -0
  35. package/dist/types/src/components/Button/Toggle.stories.d.ts.map +1 -0
  36. package/dist/types/src/components/Button/ToggleGroup.d.ts +27 -0
  37. package/dist/types/src/components/Button/ToggleGroup.d.ts.map +1 -0
  38. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts +27 -0
  39. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts.map +1 -0
  40. package/dist/types/src/components/Button/index.d.ts.map +1 -0
  41. package/dist/types/src/components/Card/Card.d.ts +121 -0
  42. package/dist/types/src/components/Card/Card.d.ts.map +1 -0
  43. package/dist/types/src/components/Card/Card.stories.d.ts +21 -0
  44. package/dist/types/src/components/Card/Card.stories.d.ts.map +1 -0
  45. package/dist/types/src/components/Card/index.d.ts +2 -0
  46. package/dist/types/src/components/Card/index.d.ts.map +1 -0
  47. package/dist/types/src/components/Clipboard/ClipboardProvider.d.ts.map +1 -1
  48. package/dist/types/src/components/Clipboard/CopyButton.d.ts +1 -1
  49. package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
  50. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts +1 -1
  51. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts.map +1 -1
  52. package/dist/types/src/components/{Dialogs → Dialog}/AlertDialog.d.ts +13 -4
  53. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -0
  54. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts +11 -0
  55. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -0
  56. package/dist/types/src/components/Dialog/Dialog.d.ts +47 -0
  57. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -0
  58. package/dist/types/src/components/Dialog/Dialog.stories.d.ts +24 -0
  59. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +1 -0
  60. package/dist/types/src/components/Dialog/index.d.ts.map +1 -0
  61. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts +1 -1
  62. package/dist/types/src/components/ElevationProvider/ElevationProvider.d.ts.map +1 -1
  63. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts +11 -0
  64. package/dist/types/src/components/ErrorFallback/ErrorFallback.d.ts.map +1 -0
  65. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts +7 -0
  66. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts.map +1 -0
  67. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts +8 -0
  68. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -0
  69. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts +9 -0
  70. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts.map +1 -0
  71. package/dist/types/src/components/ErrorFallback/index.d.ts +5 -0
  72. package/dist/types/src/components/ErrorFallback/index.d.ts.map +1 -0
  73. package/dist/types/src/components/Icon/Icon.d.ts +2 -2
  74. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  75. package/dist/types/src/components/Icon/Icon.stories.d.ts +17 -0
  76. package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -0
  77. package/dist/types/src/components/Image/Image.d.ts +14 -0
  78. package/dist/types/src/components/Image/Image.d.ts.map +1 -0
  79. package/dist/types/src/components/Image/Image.stories.d.ts +33 -0
  80. package/dist/types/src/components/Image/Image.stories.d.ts.map +1 -0
  81. package/dist/types/src/components/Image/index.d.ts +2 -0
  82. package/dist/types/src/components/Image/index.d.ts.map +1 -0
  83. package/dist/types/src/components/Input/Input.d.ts +6 -8
  84. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  85. package/dist/types/src/components/Input/Input.stories.d.ts +17 -18
  86. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  87. package/dist/types/src/components/Link/Link.stories.d.ts +8 -8
  88. package/dist/types/src/components/Link/Link.stories.d.ts.map +1 -1
  89. package/dist/types/src/components/{Lists → List}/List.d.ts +3 -3
  90. package/dist/types/src/components/List/List.d.ts.map +1 -0
  91. package/dist/types/src/components/List/List.stories.d.ts +14 -0
  92. package/dist/types/src/components/List/List.stories.d.ts.map +1 -0
  93. package/dist/types/src/components/List/ListDropIndicator.d.ts.map +1 -0
  94. package/dist/types/src/components/{Lists → List}/Tree.d.ts +1 -1
  95. package/dist/types/src/components/List/Tree.d.ts.map +1 -0
  96. package/dist/types/src/components/List/Tree.stories.d.ts +15 -0
  97. package/dist/types/src/components/List/Tree.stories.d.ts.map +1 -0
  98. package/dist/types/src/components/List/TreeDropIndicator.d.ts.map +1 -0
  99. package/dist/types/src/components/{Lists → List}/Treegrid.d.ts +1 -1
  100. package/dist/types/src/components/{Lists → List}/Treegrid.d.ts.map +1 -1
  101. package/dist/types/src/components/List/Treegrid.stories.d.ts +12 -0
  102. package/dist/types/src/components/List/Treegrid.stories.d.ts.map +1 -0
  103. package/dist/types/src/components/List/index.d.ts.map +1 -0
  104. package/dist/types/src/components/Main/Main.d.ts +18 -28
  105. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  106. package/dist/types/src/components/Main/Main.stories.d.ts +6 -10
  107. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  108. package/dist/types/src/components/{Menus → Menu}/ContextMenu.d.ts +6 -6
  109. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -0
  110. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts +12 -0
  111. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -0
  112. package/dist/types/src/components/{Menus → Menu}/DropdownMenu.d.ts +8 -8
  113. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -0
  114. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts +15 -0
  115. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -0
  116. package/dist/types/src/components/Menu/index.d.ts.map +1 -0
  117. package/dist/types/src/components/Message/Message.d.ts +1 -1
  118. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  119. package/dist/types/src/components/Message/Message.stories.d.ts +10 -20
  120. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  121. package/dist/types/src/components/Popover/Popover.d.ts +4 -3
  122. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  123. package/dist/types/src/components/Popover/Popover.stories.d.ts +6 -34
  124. package/dist/types/src/components/Popover/Popover.stories.d.ts.map +1 -1
  125. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +25 -26
  126. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  127. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +37 -25
  128. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  129. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +39 -0
  130. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -0
  131. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +24 -0
  132. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -0
  133. package/dist/types/src/components/ScrollContainer/index.d.ts +2 -0
  134. package/dist/types/src/components/ScrollContainer/index.d.ts.map +1 -0
  135. package/dist/types/src/components/Select/Select.d.ts +10 -10
  136. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  137. package/dist/types/src/components/Select/Select.stories.d.ts +4 -9
  138. package/dist/types/src/components/Select/Select.stories.d.ts.map +1 -1
  139. package/dist/types/src/components/Separator/Separator.d.ts +1 -1
  140. package/dist/types/src/components/Skeleton/Skeleton.d.ts +12 -0
  141. package/dist/types/src/components/Skeleton/Skeleton.d.ts.map +1 -0
  142. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts +17 -0
  143. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -0
  144. package/dist/types/src/components/Skeleton/index.d.ts +2 -0
  145. package/dist/types/src/components/Skeleton/index.d.ts.map +1 -0
  146. package/dist/types/src/components/Splitter/Splitter.d.ts +36 -0
  147. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -0
  148. package/dist/types/src/components/Splitter/Splitter.stories.d.ts +7 -0
  149. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -0
  150. package/dist/types/src/components/Splitter/index.d.ts +2 -0
  151. package/dist/types/src/components/Splitter/index.d.ts.map +1 -0
  152. package/dist/types/src/components/Status/Status.stories.d.ts +6 -10
  153. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  154. package/dist/types/src/components/Tag/Tag.d.ts +1 -1
  155. package/dist/types/src/components/Tag/Tag.d.ts.map +1 -1
  156. package/dist/types/src/components/Tag/Tag.stories.d.ts +8 -13
  157. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  158. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +3 -3
  159. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  160. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts +12 -0
  161. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -0
  162. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +1 -8
  163. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
  164. package/dist/types/src/components/ThemeProvider/index.d.ts +2 -1
  165. package/dist/types/src/components/ThemeProvider/index.d.ts.map +1 -1
  166. package/dist/types/src/components/Toast/Toast.d.ts +5 -5
  167. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  168. package/dist/types/src/components/Toast/Toast.stories.d.ts +6 -44
  169. package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
  170. package/dist/types/src/components/Toolbar/Toolbar.d.ts +47 -19
  171. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  172. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts +6 -50
  173. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  174. package/dist/types/src/components/Tooltip/Tooltip.d.ts +2 -4
  175. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  176. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts +8 -61
  177. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  178. package/dist/types/src/components/index.d.ts +13 -8
  179. package/dist/types/src/components/index.d.ts.map +1 -1
  180. package/dist/types/src/exemplars/generics.stories.d.ts +18 -0
  181. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -0
  182. package/dist/types/src/exemplars/slot.stories.d.ts +14 -0
  183. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -0
  184. package/dist/types/src/exemplars/tabster.stories.d.ts +8 -0
  185. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -0
  186. package/dist/types/src/exemplars/virtualizer.stories.d.ts +11 -0
  187. package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -0
  188. package/dist/types/src/hooks/useDensityContext.d.ts +1 -1
  189. package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
  190. package/dist/types/src/hooks/useElevationContext.d.ts +1 -1
  191. package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
  192. package/dist/types/src/hooks/useSafeArea.d.ts.map +1 -1
  193. package/dist/types/src/hooks/useVisualViewport.d.ts +2 -2
  194. package/dist/types/src/hooks/useVisualViewport.d.ts.map +1 -1
  195. package/dist/types/src/index.d.ts +2 -1
  196. package/dist/types/src/index.d.ts.map +1 -1
  197. package/dist/types/src/playground/Controls.stories.d.ts +5 -9
  198. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  199. package/dist/types/src/playground/Custom.stories.d.ts +12 -4
  200. package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
  201. package/dist/types/src/playground/Typography.stories.d.ts +5 -11
  202. package/dist/types/src/playground/Typography.stories.d.ts.map +1 -1
  203. package/dist/types/src/primitives/Column/Column.d.ts +32 -0
  204. package/dist/types/src/primitives/Column/Column.d.ts.map +1 -0
  205. package/dist/types/src/primitives/Column/Column.stories.d.ts +6 -0
  206. package/dist/types/src/primitives/Column/Column.stories.d.ts.map +1 -0
  207. package/dist/types/src/primitives/Column/index.d.ts +2 -0
  208. package/dist/types/src/primitives/Column/index.d.ts.map +1 -0
  209. package/dist/types/src/primitives/Flex/Flex.d.ts +8 -0
  210. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -0
  211. package/dist/types/src/primitives/Flex/Flex.stories.d.ts +8 -0
  212. package/dist/types/src/primitives/Flex/Flex.stories.d.ts.map +1 -0
  213. package/dist/types/src/primitives/Flex/index.d.ts +2 -0
  214. package/dist/types/src/primitives/Flex/index.d.ts.map +1 -0
  215. package/dist/types/src/primitives/Grid/Grid.d.ts +9 -0
  216. package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -0
  217. package/dist/types/src/primitives/Grid/Grid.stories.d.ts +8 -0
  218. package/dist/types/src/primitives/Grid/Grid.stories.d.ts.map +1 -0
  219. package/dist/types/src/primitives/Grid/index.d.ts +2 -0
  220. package/dist/types/src/primitives/Grid/index.d.ts.map +1 -0
  221. package/dist/types/src/primitives/Panel/Panel.d.ts +34 -0
  222. package/dist/types/src/primitives/Panel/Panel.d.ts.map +1 -0
  223. package/dist/types/src/primitives/Panel/Panel.stories.d.ts +6 -0
  224. package/dist/types/src/primitives/Panel/Panel.stories.d.ts.map +1 -0
  225. package/dist/types/src/primitives/Panel/index.d.ts +2 -0
  226. package/dist/types/src/primitives/Panel/index.d.ts.map +1 -0
  227. package/dist/types/src/primitives/index.d.ts +5 -0
  228. package/dist/types/src/primitives/index.d.ts.map +1 -0
  229. package/dist/types/src/testing/decorators/index.d.ts +2 -1
  230. package/dist/types/src/testing/decorators/index.d.ts.map +1 -1
  231. package/dist/types/src/testing/decorators/withLayout.d.ts +15 -0
  232. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -0
  233. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts +12 -0
  234. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -0
  235. package/dist/types/src/testing/decorators/withTheme.d.ts +5 -1
  236. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  237. package/dist/types/src/translations.d.ts +11 -0
  238. package/dist/types/src/translations.d.ts.map +1 -0
  239. package/dist/types/src/util/index.d.ts +2 -1
  240. package/dist/types/src/util/index.d.ts.map +1 -1
  241. package/dist/types/src/util/usePx.d.ts +8 -0
  242. package/dist/types/src/util/usePx.d.ts.map +1 -0
  243. package/dist/types/tsconfig.tsbuildinfo +1 -1
  244. package/package.json +43 -31
  245. package/src/components/Avatars/Avatar.stories.tsx +24 -16
  246. package/src/components/Avatars/Avatar.tsx +9 -16
  247. package/src/components/Avatars/AvatarGroup.stories.tsx +12 -8
  248. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +20 -15
  249. package/src/components/Breadcrumb/Breadcrumb.tsx +12 -38
  250. package/src/components/{Buttons → Button}/Button.stories.tsx +10 -11
  251. package/src/components/{Buttons → Button}/Button.tsx +7 -13
  252. package/src/components/{Buttons → Button}/IconButton.stories.tsx +15 -12
  253. package/src/components/{Buttons → Button}/IconButton.tsx +23 -16
  254. package/src/components/Button/Toggle.stories.tsx +37 -0
  255. package/src/components/{Buttons → Button}/ToggleGroup.stories.tsx +12 -9
  256. package/src/components/{Buttons → Button}/ToggleGroup.tsx +17 -4
  257. package/src/components/Card/Card.stories.tsx +151 -0
  258. package/src/components/Card/Card.tsx +352 -0
  259. package/src/components/Card/index.ts +5 -0
  260. package/src/components/Clipboard/ClipboardProvider.tsx +1 -1
  261. package/src/components/Clipboard/CopyButton.tsx +9 -8
  262. package/src/components/DensityProvider/DensityProvider.tsx +2 -2
  263. package/src/components/Dialog/AlertDialog.stories.tsx +69 -0
  264. package/src/components/{Dialogs → Dialog}/AlertDialog.tsx +128 -28
  265. package/src/components/Dialog/Dialog.stories.tsx +122 -0
  266. package/src/components/{Dialogs → Dialog}/Dialog.tsx +190 -60
  267. package/src/components/ElevationProvider/ElevationProvider.tsx +2 -2
  268. package/src/components/ErrorFallback/ErrorFallback.stories.tsx +50 -0
  269. package/src/components/ErrorFallback/ErrorFallback.tsx +70 -0
  270. package/src/components/ErrorFallback/ErrorStack.tsx +80 -0
  271. package/src/components/ErrorFallback/ThrowError.tsx +37 -0
  272. package/src/components/ErrorFallback/index.ts +9 -0
  273. package/src/components/Icon/Icon.stories.tsx +113 -0
  274. package/src/components/Icon/Icon.tsx +3 -3
  275. package/src/components/Image/Image.stories.tsx +86 -0
  276. package/src/components/Image/Image.tsx +223 -0
  277. package/src/components/Image/index.ts +5 -0
  278. package/src/components/Input/Input.stories.tsx +28 -49
  279. package/src/components/Input/Input.tsx +46 -82
  280. package/src/components/Link/Link.stories.tsx +12 -8
  281. package/src/components/Link/Link.tsx +2 -2
  282. package/src/components/{Lists → List}/List.stories.tsx +44 -45
  283. package/src/components/{Lists → List}/List.tsx +27 -28
  284. package/src/components/{Lists → List}/ListDropIndicator.tsx +7 -7
  285. package/src/components/{Lists → List}/Tree.stories.tsx +15 -12
  286. package/src/components/{Lists → List}/Tree.tsx +4 -3
  287. package/src/components/{Lists → List}/TreeDropIndicator.tsx +7 -7
  288. package/src/components/{Lists → List}/Treegrid.stories.tsx +15 -9
  289. package/src/components/{Lists → List}/Treegrid.tsx +67 -31
  290. package/src/components/Main/Main.stories.tsx +53 -27
  291. package/src/components/Main/Main.tsx +176 -104
  292. package/src/components/{Menus → Menu}/ContextMenu.stories.tsx +13 -10
  293. package/src/components/{Menus → Menu}/ContextMenu.tsx +10 -33
  294. package/src/components/{Menus → Menu}/DropdownMenu.stories.tsx +14 -11
  295. package/src/components/{Menus → Menu}/DropdownMenu.tsx +111 -80
  296. package/src/components/Message/Message.stories.tsx +35 -16
  297. package/src/components/Message/Message.tsx +46 -33
  298. package/src/components/Popover/Popover.stories.tsx +16 -13
  299. package/src/components/Popover/Popover.tsx +86 -64
  300. package/src/components/ScrollArea/ScrollArea.stories.tsx +163 -34
  301. package/src/components/ScrollArea/ScrollArea.tsx +84 -82
  302. package/src/components/ScrollArea/index.ts +1 -1
  303. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +89 -0
  304. package/src/components/ScrollContainer/ScrollContainer.tsx +238 -0
  305. package/src/components/ScrollContainer/index.ts +5 -0
  306. package/src/components/Select/Select.stories.tsx +15 -12
  307. package/src/components/Select/Select.tsx +16 -31
  308. package/src/components/Separator/Separator.tsx +1 -1
  309. package/src/components/Skeleton/Skeleton.stories.tsx +52 -0
  310. package/src/components/Skeleton/Skeleton.tsx +26 -0
  311. package/src/components/Skeleton/index.ts +5 -0
  312. package/src/components/Splitter/Splitter.stories.tsx +83 -0
  313. package/src/components/Splitter/Splitter.tsx +138 -0
  314. package/src/components/Splitter/index.ts +5 -0
  315. package/src/components/Status/Status.stories.tsx +30 -23
  316. package/src/components/Status/Status.tsx +2 -2
  317. package/src/components/Tag/Tag.stories.tsx +17 -13
  318. package/src/components/Tag/Tag.tsx +3 -8
  319. package/src/components/ThemeProvider/ThemeProvider.stories.tsx +32 -0
  320. package/src/components/ThemeProvider/ThemeProvider.tsx +7 -7
  321. package/src/components/ThemeProvider/TranslationsProvider.tsx +3 -18
  322. package/src/components/ThemeProvider/index.ts +3 -3
  323. package/src/components/Toast/Toast.stories.tsx +14 -11
  324. package/src/components/Toast/Toast.tsx +19 -23
  325. package/src/components/Toolbar/Toolbar.stories.tsx +16 -14
  326. package/src/components/Toolbar/Toolbar.tsx +199 -11
  327. package/src/components/Tooltip/Tooltip.stories.tsx +31 -25
  328. package/src/components/Tooltip/Tooltip.tsx +30 -26
  329. package/src/components/index.ts +14 -9
  330. package/src/exemplars/generics.stories.tsx +49 -0
  331. package/src/exemplars/slot.stories.tsx +119 -0
  332. package/src/exemplars/tabster.stories.tsx +127 -0
  333. package/src/exemplars/virtualizer.stories.tsx +137 -0
  334. package/src/hooks/useDensityContext.ts +1 -1
  335. package/src/hooks/useElevationContext.ts +1 -1
  336. package/src/hooks/useSafeArea.ts +3 -2
  337. package/src/hooks/useVisualViewport.ts +4 -4
  338. package/src/index.ts +2 -1
  339. package/src/playground/Controls.stories.tsx +12 -15
  340. package/src/playground/Custom.stories.tsx +15 -26
  341. package/src/playground/Typography.stories.tsx +11 -9
  342. package/src/primitives/Column/Column.stories.tsx +72 -0
  343. package/src/primitives/Column/Column.tsx +156 -0
  344. package/src/primitives/Column/index.ts +5 -0
  345. package/src/primitives/Flex/Flex.stories.tsx +58 -0
  346. package/src/primitives/Flex/Flex.tsx +27 -0
  347. package/src/primitives/Flex/index.ts +5 -0
  348. package/src/primitives/Grid/Grid.stories.tsx +57 -0
  349. package/src/primitives/Grid/Grid.tsx +43 -0
  350. package/src/primitives/Grid/index.ts +5 -0
  351. package/src/primitives/Panel/Panel.stories.tsx +67 -0
  352. package/src/primitives/Panel/Panel.tsx +137 -0
  353. package/src/primitives/Panel/index.ts +5 -0
  354. package/src/primitives/index.ts +8 -0
  355. package/src/testing/decorators/index.ts +2 -1
  356. package/src/testing/decorators/withLayout.tsx +77 -0
  357. package/src/testing/decorators/withLayoutVariants.tsx +48 -0
  358. package/src/testing/decorators/withTheme.tsx +34 -0
  359. package/src/translations.ts +19 -0
  360. package/src/util/index.ts +3 -1
  361. package/src/util/usePx.ts +61 -0
  362. package/dist/lib/browser/chunk-2COVUP44.mjs +0 -4373
  363. package/dist/lib/browser/chunk-2COVUP44.mjs.map +0 -7
  364. package/dist/lib/node-esm/chunk-GHXHND5V.mjs +0 -4375
  365. package/dist/lib/node-esm/chunk-GHXHND5V.mjs.map +0 -7
  366. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts +0 -15
  367. package/dist/types/src/components/AnchoredOverflow/AnchoredOverflow.d.ts.map +0 -1
  368. package/dist/types/src/components/AnchoredOverflow/index.d.ts +0 -2
  369. package/dist/types/src/components/AnchoredOverflow/index.d.ts.map +0 -1
  370. package/dist/types/src/components/Buttons/Button.d.ts.map +0 -1
  371. package/dist/types/src/components/Buttons/Button.stories.d.ts +0 -12
  372. package/dist/types/src/components/Buttons/Button.stories.d.ts.map +0 -1
  373. package/dist/types/src/components/Buttons/IconButton.d.ts.map +0 -1
  374. package/dist/types/src/components/Buttons/IconButton.stories.d.ts +0 -22
  375. package/dist/types/src/components/Buttons/IconButton.stories.d.ts.map +0 -1
  376. package/dist/types/src/components/Buttons/Toggle.d.ts.map +0 -1
  377. package/dist/types/src/components/Buttons/Toggle.stories.d.ts +0 -19
  378. package/dist/types/src/components/Buttons/Toggle.stories.d.ts.map +0 -1
  379. package/dist/types/src/components/Buttons/ToggleGroup.d.ts +0 -28
  380. package/dist/types/src/components/Buttons/ToggleGroup.d.ts.map +0 -1
  381. package/dist/types/src/components/Buttons/ToggleGroup.stories.d.ts +0 -39
  382. package/dist/types/src/components/Buttons/ToggleGroup.stories.d.ts.map +0 -1
  383. package/dist/types/src/components/Buttons/index.d.ts.map +0 -1
  384. package/dist/types/src/components/Dialogs/AlertDialog.d.ts.map +0 -1
  385. package/dist/types/src/components/Dialogs/AlertDialog.stories.d.ts +0 -43
  386. package/dist/types/src/components/Dialogs/AlertDialog.stories.d.ts.map +0 -1
  387. package/dist/types/src/components/Dialogs/Dialog.d.ts +0 -31
  388. package/dist/types/src/components/Dialogs/Dialog.d.ts.map +0 -1
  389. package/dist/types/src/components/Dialogs/Dialog.stories.d.ts +0 -48
  390. package/dist/types/src/components/Dialogs/Dialog.stories.d.ts.map +0 -1
  391. package/dist/types/src/components/Dialogs/index.d.ts.map +0 -1
  392. package/dist/types/src/components/Lists/List.d.ts.map +0 -1
  393. package/dist/types/src/components/Lists/List.stories.d.ts +0 -37
  394. package/dist/types/src/components/Lists/List.stories.d.ts.map +0 -1
  395. package/dist/types/src/components/Lists/ListDropIndicator.d.ts.map +0 -1
  396. package/dist/types/src/components/Lists/Tree.d.ts.map +0 -1
  397. package/dist/types/src/components/Lists/Tree.stories.d.ts +0 -41
  398. package/dist/types/src/components/Lists/Tree.stories.d.ts.map +0 -1
  399. package/dist/types/src/components/Lists/TreeDropIndicator.d.ts.map +0 -1
  400. package/dist/types/src/components/Lists/Treegrid.stories.d.ts +0 -10
  401. package/dist/types/src/components/Lists/Treegrid.stories.d.ts.map +0 -1
  402. package/dist/types/src/components/Lists/index.d.ts.map +0 -1
  403. package/dist/types/src/components/Menus/ContextMenu.d.ts.map +0 -1
  404. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts +0 -50
  405. package/dist/types/src/components/Menus/ContextMenu.stories.d.ts.map +0 -1
  406. package/dist/types/src/components/Menus/DropdownMenu.d.ts.map +0 -1
  407. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts +0 -50
  408. package/dist/types/src/components/Menus/DropdownMenu.stories.d.ts.map +0 -1
  409. package/dist/types/src/components/Menus/index.d.ts.map +0 -1
  410. package/dist/types/src/testing/decorators/withSurfaceVariantsLayout.d.ts +0 -12
  411. package/dist/types/src/testing/decorators/withSurfaceVariantsLayout.d.ts.map +0 -1
  412. package/dist/types/src/util/ThemedClassName.d.ts +0 -5
  413. package/dist/types/src/util/ThemedClassName.d.ts.map +0 -1
  414. package/src/components/AnchoredOverflow/AnchoredOverflow.tsx +0 -59
  415. package/src/components/AnchoredOverflow/index.ts +0 -5
  416. package/src/components/Buttons/Toggle.stories.tsx +0 -33
  417. package/src/components/Dialogs/AlertDialog.stories.tsx +0 -66
  418. package/src/components/Dialogs/Dialog.stories.tsx +0 -65
  419. package/src/testing/decorators/withSurfaceVariantsLayout.tsx +0 -51
  420. package/src/testing/decorators/withTheme.ts +0 -25
  421. package/src/util/ThemedClassName.ts +0 -7
  422. /package/dist/types/src/components/{Buttons → Button}/Toggle.d.ts +0 -0
  423. /package/dist/types/src/components/{Buttons → Button}/index.d.ts +0 -0
  424. /package/dist/types/src/components/{Dialogs → Dialog}/index.d.ts +0 -0
  425. /package/dist/types/src/components/{Lists → List}/ListDropIndicator.d.ts +0 -0
  426. /package/dist/types/src/components/{Lists → List}/TreeDropIndicator.d.ts +0 -0
  427. /package/dist/types/src/components/{Lists → List}/index.d.ts +0 -0
  428. /package/dist/types/src/components/{Menus → Menu}/index.d.ts +0 -0
  429. /package/src/components/{Buttons → Button}/Toggle.tsx +0 -0
  430. /package/src/components/{Buttons → Button}/index.ts +0 -0
  431. /package/src/components/{Dialogs → Dialog}/index.ts +0 -0
  432. /package/src/components/{Lists → List}/index.ts +0 -0
  433. /package/src/components/{Menus → Menu}/index.ts +0 -0
@@ -4,29 +4,43 @@
4
4
 
5
5
  import { createContext } from '@radix-ui/react-context';
6
6
  import {
7
- type DialogProps as DialogRootPrimitiveProps,
8
- Root as DialogRootPrimitive,
9
- DialogTrigger as DialogTriggerPrimitive,
10
- type DialogTriggerProps as DialogTriggerPrimitiveProps,
11
- DialogPortal as DialogPortalPrimitive,
12
- type DialogPortalProps as DialogPortalPrimitiveProps,
7
+ DialogClose as DialogClosePrimitive,
8
+ type DialogCloseProps as DialogClosePrimitiveProps,
9
+ DialogContent as DialogContentPrimitive,
10
+ DialogDescription as DialogDescriptionPrimitive,
11
+ type DialogDescriptionProps as DialogDescriptionPrimitiveProps,
13
12
  DialogOverlay as DialogOverlayPrimitive,
14
13
  type DialogOverlayProps as DialogOverlayPrimitiveProps,
14
+ DialogPortal as DialogPortalPrimitive,
15
+ type DialogPortalProps as DialogPortalPrimitiveProps,
16
+ Root as DialogRootPrimitive,
17
+ type DialogProps as DialogRootPrimitiveProps,
15
18
  DialogTitle as DialogTitlePrimitive,
16
19
  type DialogTitleProps as DialogTitlePrimitiveProps,
17
- DialogDescription as DialogDescriptionPrimitive,
18
- type DialogDescriptionProps as DialogDescriptionPrimitiveProps,
19
- DialogClose as DialogClosePrimitive,
20
- type DialogCloseProps as DialogClosePrimitiveProps,
21
- DialogContent as DialogContentPrimitive,
22
- type DialogContentProps as DialogContentPrimitiveProps,
20
+ DialogTrigger as DialogTriggerPrimitive,
21
+ type DialogTriggerProps as DialogTriggerPrimitiveProps,
23
22
  } from '@radix-ui/react-dialog';
24
- import React, { forwardRef, type ForwardRefExoticComponent, type FunctionComponent } from 'react';
23
+ import React, {
24
+ type ComponentPropsWithRef,
25
+ type ForwardRefExoticComponent,
26
+ type FunctionComponent,
27
+ type PropsWithChildren,
28
+ forwardRef,
29
+ } from 'react';
30
+ import { useTranslation } from 'react-i18next';
31
+
32
+ import { type DialogSize, osTranslations } from '@dxos/ui-theme';
25
33
 
26
34
  import { useThemeContext } from '../../hooks';
35
+ import { Column } from '../../primitives';
27
36
  import { type ThemedClassName } from '../../util';
37
+ import { IconButton } from '../Button';
28
38
  import { ElevationProvider } from '../ElevationProvider';
29
39
 
40
+ //
41
+ // Root
42
+ //
43
+
30
44
  type DialogRootProps = DialogRootPrimitiveProps;
31
45
 
32
46
  const DialogRoot: FunctionComponent<DialogRootProps> = (props) => (
@@ -35,52 +49,30 @@ const DialogRoot: FunctionComponent<DialogRootProps> = (props) => (
35
49
  </ElevationProvider>
36
50
  );
37
51
 
52
+ //
53
+ // Trigger
54
+ //
55
+
38
56
  type DialogTriggerProps = DialogTriggerPrimitiveProps;
39
57
 
40
58
  const DialogTrigger: FunctionComponent<DialogTriggerProps> = DialogTriggerPrimitive;
41
59
 
60
+ //
61
+ // Portal
62
+ //
63
+
42
64
  type DialogPortalProps = DialogPortalPrimitiveProps;
43
65
 
44
66
  const DialogPortal: FunctionComponent<DialogPortalProps> = DialogPortalPrimitive;
45
67
 
46
- type DialogTitleProps = ThemedClassName<DialogTitlePrimitiveProps> & { srOnly?: boolean };
47
-
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
- );
60
-
61
- type DialogDescriptionProps = ThemedClassName<DialogDescriptionPrimitiveProps> & { srOnly?: boolean };
62
-
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
- });
76
-
77
- type DialogCloseProps = DialogClosePrimitiveProps;
68
+ //
69
+ // Overlay
70
+ //
78
71
 
79
- const DialogClose: FunctionComponent<DialogCloseProps> = DialogClosePrimitive;
72
+ const DIALOG_OVERLAY_NAME = 'DialogOverlay';
80
73
 
81
74
  type OverlayLayoutContextValue = { inOverlayLayout?: boolean };
82
- const DIALOG_OVERLAY_NAME = 'DialogOverlay';
83
- const DIALOG_CONTENT_NAME = 'DialogContent';
75
+
84
76
  const [OverlayLayoutProvider, useOverlayLayoutContext] = createContext<OverlayLayoutContextValue>(
85
77
  DIALOG_OVERLAY_NAME,
86
78
  {},
@@ -95,9 +87,9 @@ const DialogOverlay: ForwardRefExoticComponent<DialogOverlayProps> = forwardRef<
95
87
  return (
96
88
  <DialogOverlayPrimitive
97
89
  {...props}
98
- className={tx('dialog.overlay', 'dialog__overlay', {}, classNames)}
99
- ref={forwardedRef}
100
90
  data-block-align={blockAlign}
91
+ className={tx('dialog.overlay', {}, classNames)}
92
+ ref={forwardedRef}
101
93
  >
102
94
  <OverlayLayoutProvider inOverlayLayout>{children}</OverlayLayoutProvider>
103
95
  </DialogOverlayPrimitive>
@@ -107,28 +99,32 @@ const DialogOverlay: ForwardRefExoticComponent<DialogOverlayProps> = forwardRef<
107
99
 
108
100
  DialogOverlay.displayName = DIALOG_OVERLAY_NAME;
109
101
 
110
- type DialogContentProps = ThemedClassName<DialogContentPrimitiveProps> & { inOverlayLayout?: boolean };
102
+ //
103
+ // Content
104
+ //
105
+
106
+ const DIALOG_CONTENT_NAME = 'DialogContent';
107
+
108
+ type DialogContentProps = ThemedClassName<ComponentPropsWithRef<typeof DialogContentPrimitive>> & {
109
+ size?: DialogSize;
110
+ inOverlayLayout?: boolean;
111
+ };
111
112
 
112
113
  const DialogContent: ForwardRefExoticComponent<DialogContentProps> = forwardRef<HTMLDivElement, DialogContentProps>(
113
- ({ classNames, children, inOverlayLayout: propsInOverlayLayout, ...props }, forwardedRef) => {
114
+ ({ classNames, children, size = 'md', inOverlayLayout: propsInOverlayLayout, ...props }, forwardedRef) => {
114
115
  const { tx } = useThemeContext();
115
116
  const { inOverlayLayout } = useOverlayLayoutContext(DIALOG_CONTENT_NAME);
116
117
 
117
118
  return (
118
119
  <DialogContentPrimitive
120
+ {...props}
119
121
  // NOTE: Radix warning unless set to undefined.
120
122
  // https://www.radix-ui.com/primitives/docs/components/dialog#description
121
123
  aria-describedby={undefined}
122
- {...props}
123
- className={tx(
124
- 'dialog.content',
125
- 'dialog',
126
- { inOverlayLayout: propsInOverlayLayout || inOverlayLayout },
127
- classNames,
128
- )}
124
+ className={tx('dialog.content', { inOverlayLayout: propsInOverlayLayout || inOverlayLayout, size }, classNames)}
129
125
  ref={forwardedRef}
130
126
  >
131
- {children}
127
+ <Column.Root>{children}</Column.Root>
132
128
  </DialogContentPrimitive>
133
129
  );
134
130
  },
@@ -136,15 +132,146 @@ const DialogContent: ForwardRefExoticComponent<DialogContentProps> = forwardRef<
136
132
 
137
133
  DialogContent.displayName = DIALOG_CONTENT_NAME;
138
134
 
135
+ //
136
+ // Header
137
+ //
138
+
139
+ type DialogHeaderProps = ThemedClassName<PropsWithChildren> & { srOnly?: boolean };
140
+
141
+ const DialogHeader: ForwardRefExoticComponent<DialogTitleProps> = forwardRef<HTMLHeadingElement, DialogTitleProps>(
142
+ ({ classNames, srOnly, ...props }, forwardedRef) => {
143
+ const { tx } = useThemeContext();
144
+ return (
145
+ <Column.Segment asChild>
146
+ <div role='heading' {...props} className={tx('dialog.header', { srOnly }, [classNames])} ref={forwardedRef} />
147
+ </Column.Segment>
148
+ );
149
+ },
150
+ );
151
+
152
+ //
153
+ // CloseIconButton
154
+ //
155
+
156
+ type DialogCloseIconButtonProps = { label?: string };
157
+
158
+ const DialogCloseIconButton = forwardRef<HTMLButtonElement, DialogCloseIconButtonProps>(
159
+ ({ label, ...props }, forwardedRef) => {
160
+ const { t } = useTranslation(osTranslations);
161
+ return (
162
+ <IconButton
163
+ {...props}
164
+ label={label ?? t('close dialog label')}
165
+ icon='ph--x--regular'
166
+ iconOnly
167
+ size={4}
168
+ density='fine'
169
+ variant='ghost'
170
+ ref={forwardedRef}
171
+ />
172
+ );
173
+ },
174
+ );
175
+
176
+ //
177
+ // Body
178
+ //
179
+
180
+ type DialogBodyProps = PropsWithChildren;
181
+
182
+ const DialogBody: ForwardRefExoticComponent<DialogBodyProps> = forwardRef<HTMLDivElement, DialogBodyProps>(
183
+ ({ children, ...props }, forwardedRef) => {
184
+ const { tx } = useThemeContext();
185
+ return (
186
+ <Column.Segment asChild>
187
+ <div role='none' {...props} className={tx('dialog.body')} ref={forwardedRef}>
188
+ {children}
189
+ </div>
190
+ </Column.Segment>
191
+ );
192
+ },
193
+ );
194
+
195
+ //
196
+ // Title
197
+ //
198
+
199
+ type DialogTitleProps = ThemedClassName<DialogTitlePrimitiveProps> & { srOnly?: boolean };
200
+
201
+ const DialogTitle: ForwardRefExoticComponent<DialogTitleProps> = forwardRef<HTMLHeadingElement, DialogTitleProps>(
202
+ ({ classNames, srOnly, ...props }, forwardedRef) => {
203
+ const { tx } = useThemeContext();
204
+ return (
205
+ <DialogTitlePrimitive {...props} className={tx('dialog.title', { srOnly }, classNames)} ref={forwardedRef} />
206
+ );
207
+ },
208
+ );
209
+
210
+ //
211
+ // Description
212
+ //
213
+
214
+ type DialogDescriptionProps = ThemedClassName<DialogDescriptionPrimitiveProps> & { srOnly?: boolean };
215
+
216
+ const DialogDescription: ForwardRefExoticComponent<DialogTitleProps> = forwardRef<
217
+ HTMLParagraphElement,
218
+ DialogDescriptionProps
219
+ >(({ classNames, srOnly, ...props }, forwardedRef) => {
220
+ const { tx } = useThemeContext();
221
+ return (
222
+ <DialogDescriptionPrimitive
223
+ {...props}
224
+ className={tx('dialog.description', { srOnly }, classNames)}
225
+ ref={forwardedRef}
226
+ />
227
+ );
228
+ });
229
+
230
+ //
231
+ // ActionBar
232
+ //
233
+
234
+ type DialogActionBarProps = ThemedClassName<PropsWithChildren>;
235
+
236
+ const DialogActionBar: ForwardRefExoticComponent<DialogActionBarProps> = forwardRef<
237
+ HTMLDivElement,
238
+ DialogActionBarProps
239
+ >(({ children, classNames, ...props }, forwardedRef) => {
240
+ const { tx } = useThemeContext();
241
+ return (
242
+ <Column.Segment asChild>
243
+ <div {...props} className={tx('dialog.actionbar', {}, classNames)} ref={forwardedRef}>
244
+ {children}
245
+ </div>
246
+ </Column.Segment>
247
+ );
248
+ });
249
+
250
+ //
251
+ // Close
252
+ //
253
+
254
+ type DialogCloseProps = DialogClosePrimitiveProps;
255
+
256
+ const DialogClose: FunctionComponent<DialogCloseProps> = DialogClosePrimitive;
257
+
258
+ //
259
+ // Dialog
260
+ //
261
+
139
262
  export const Dialog = {
140
263
  Root: DialogRoot,
141
264
  Trigger: DialogTrigger,
142
265
  Portal: DialogPortal,
143
266
  Overlay: DialogOverlay,
144
267
  Content: DialogContent,
268
+ Header: DialogHeader,
269
+ Body: DialogBody,
145
270
  Title: DialogTitle,
146
271
  Description: DialogDescription,
272
+ ActionBar: DialogActionBar,
147
273
  Close: DialogClose,
274
+ CloseIconButton: DialogCloseIconButton,
148
275
  };
149
276
 
150
277
  export type {
@@ -153,7 +280,10 @@ export type {
153
280
  DialogPortalProps,
154
281
  DialogOverlayProps,
155
282
  DialogContentProps,
283
+ DialogHeaderProps,
284
+ DialogBodyProps,
156
285
  DialogTitleProps,
157
286
  DialogDescriptionProps,
287
+ DialogActionBarProps,
158
288
  DialogCloseProps,
159
289
  };
@@ -2,9 +2,9 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import React, { createContext, type PropsWithChildren } from 'react';
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';