@dxos/react-ui 0.8.4-main.8360d9e660 → 0.8.4-main.8baae0fced

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 (300) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +1 -1
  3. package/dist/lib/browser/chunk-A5QCIG5R.mjs +24 -0
  4. package/dist/lib/browser/chunk-A5QCIG5R.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-EJSGYGYH.mjs → chunk-LY5XDQR5.mjs} +84 -12
  6. package/dist/lib/browser/chunk-LY5XDQR5.mjs.map +7 -0
  7. package/dist/lib/browser/index.mjs +1322 -811
  8. package/dist/lib/browser/index.mjs.map +4 -4
  9. package/dist/lib/browser/meta.json +1 -1
  10. package/dist/lib/browser/testing/index.mjs +30 -24
  11. package/dist/lib/browser/testing/index.mjs.map +3 -3
  12. package/dist/lib/browser/translations.mjs +9 -0
  13. package/dist/lib/browser/translations.mjs.map +7 -0
  14. package/dist/lib/node-esm/{chunk-B7MXDDMJ.mjs → chunk-NGKLIKP3.mjs} +84 -12
  15. package/dist/lib/node-esm/chunk-NGKLIKP3.mjs.map +7 -0
  16. package/dist/lib/node-esm/chunk-XCFLA74M.mjs +26 -0
  17. package/dist/lib/node-esm/chunk-XCFLA74M.mjs.map +7 -0
  18. package/dist/lib/node-esm/index.mjs +1322 -811
  19. package/dist/lib/node-esm/index.mjs.map +4 -4
  20. package/dist/lib/node-esm/meta.json +1 -1
  21. package/dist/lib/node-esm/testing/index.mjs +30 -24
  22. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  23. package/dist/lib/node-esm/translations.mjs +10 -0
  24. package/dist/lib/node-esm/translations.mjs.map +7 -0
  25. package/dist/types/src/components/Avatars/Avatar.d.ts +1 -1
  26. package/dist/types/src/components/Avatars/Avatar.d.ts.map +1 -1
  27. package/dist/types/src/components/Avatars/Avatar.stories.d.ts.map +1 -1
  28. package/dist/types/src/components/Avatars/AvatarGroup.stories.d.ts.map +1 -1
  29. package/dist/types/src/components/Breadcrumb/Breadcrumb.d.ts.map +1 -1
  30. package/dist/types/src/components/Breadcrumb/Breadcrumb.stories.d.ts.map +1 -1
  31. package/dist/types/src/components/Button/Button.d.ts.map +1 -1
  32. package/dist/types/src/components/Button/Button.stories.d.ts +1 -1
  33. package/dist/types/src/components/Button/Button.stories.d.ts.map +1 -1
  34. package/dist/types/src/components/Button/IconButton.d.ts +1 -0
  35. package/dist/types/src/components/Button/IconButton.d.ts.map +1 -1
  36. package/dist/types/src/components/Button/IconButton.stories.d.ts +3 -0
  37. package/dist/types/src/components/Button/IconButton.stories.d.ts.map +1 -1
  38. package/dist/types/src/components/Button/Toggle.stories.d.ts.map +1 -1
  39. package/dist/types/src/components/Button/ToggleGroup.d.ts +2 -2
  40. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts +2 -2
  41. package/dist/types/src/components/Button/ToggleGroup.stories.d.ts.map +1 -1
  42. package/dist/types/src/components/Card/Card.d.ts +59 -42
  43. package/dist/types/src/components/Card/Card.d.ts.map +1 -1
  44. package/dist/types/src/components/Card/Card.stories.d.ts +2 -2
  45. package/dist/types/src/components/Card/Card.stories.d.ts.map +1 -1
  46. package/dist/types/src/components/Carousel/Carousel.d.ts +106 -0
  47. package/dist/types/src/components/Carousel/Carousel.d.ts.map +1 -0
  48. package/dist/types/src/components/Carousel/index.d.ts +2 -0
  49. package/dist/types/src/components/Carousel/index.d.ts.map +1 -0
  50. package/dist/types/src/components/Clipboard/ClipboardProvider.d.ts.map +1 -1
  51. package/dist/types/src/components/Clipboard/CopyButton.d.ts.map +1 -1
  52. package/dist/types/src/components/Clipboard/index.d.ts +1 -1
  53. package/dist/types/src/components/Clipboard/index.d.ts.map +1 -1
  54. package/dist/types/src/components/DensityProvider/DensityProvider.d.ts.map +1 -1
  55. package/dist/types/src/components/Dialog/AlertDialog.d.ts +34 -23
  56. package/dist/types/src/components/Dialog/AlertDialog.d.ts.map +1 -1
  57. package/dist/types/src/components/Dialog/AlertDialog.stories.d.ts.map +1 -1
  58. package/dist/types/src/components/Dialog/Dialog.d.ts +38 -21
  59. package/dist/types/src/components/Dialog/Dialog.d.ts.map +1 -1
  60. package/dist/types/src/components/Dialog/Dialog.stories.d.ts +3 -2
  61. package/dist/types/src/components/Dialog/Dialog.stories.d.ts.map +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.map +1 -1
  64. package/dist/types/src/components/ErrorFallback/ErrorFallback.stories.d.ts.map +1 -1
  65. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts +14 -3
  66. package/dist/types/src/components/ErrorFallback/ErrorStack.d.ts.map +1 -1
  67. package/dist/types/src/components/ErrorFallback/ThrowError.d.ts.map +1 -1
  68. package/dist/types/src/components/Focus/Focus.d.ts +36 -0
  69. package/dist/types/src/components/Focus/Focus.d.ts.map +1 -0
  70. package/dist/types/src/components/Focus/Focus.stories.d.ts +9 -0
  71. package/dist/types/src/components/Focus/Focus.stories.d.ts.map +1 -0
  72. package/dist/types/src/components/Focus/index.d.ts +2 -0
  73. package/dist/types/src/components/Focus/index.d.ts.map +1 -0
  74. package/dist/types/src/components/Icon/Icon.d.ts +4 -0
  75. package/dist/types/src/components/Icon/Icon.d.ts.map +1 -1
  76. package/dist/types/src/components/Icon/Icon.stories.d.ts +11 -3
  77. package/dist/types/src/components/Icon/Icon.stories.d.ts.map +1 -1
  78. package/dist/types/src/components/Image/Image.d.ts +2 -1
  79. package/dist/types/src/components/Image/Image.d.ts.map +1 -1
  80. package/dist/types/src/components/Image/Image.stories.d.ts +3 -2
  81. package/dist/types/src/components/Image/Image.stories.d.ts.map +1 -1
  82. package/dist/types/src/components/Input/Input.d.ts +12 -15
  83. package/dist/types/src/components/Input/Input.d.ts.map +1 -1
  84. package/dist/types/src/components/Input/Input.stories.d.ts +3 -3
  85. package/dist/types/src/components/Input/Input.stories.d.ts.map +1 -1
  86. package/dist/types/src/components/Link/Link.d.ts.map +1 -1
  87. package/dist/types/src/components/Link/Link.stories.d.ts.map +1 -1
  88. package/dist/types/src/components/List/List.d.ts +5 -3
  89. package/dist/types/src/components/List/List.d.ts.map +1 -1
  90. package/dist/types/src/components/List/List.stories.d.ts +3 -1
  91. package/dist/types/src/components/List/List.stories.d.ts.map +1 -1
  92. package/dist/types/src/components/List/ListDropIndicator.d.ts.map +1 -1
  93. package/dist/types/src/components/List/Tree.d.ts +2 -2
  94. package/dist/types/src/components/List/Tree.d.ts.map +1 -1
  95. package/dist/types/src/components/List/Tree.stories.d.ts.map +1 -1
  96. package/dist/types/src/components/List/TreeDropIndicator.d.ts.map +1 -1
  97. package/dist/types/src/components/List/Treegrid.d.ts +5 -9
  98. package/dist/types/src/components/List/Treegrid.d.ts.map +1 -1
  99. package/dist/types/src/components/List/Treegrid.stories.d.ts.map +1 -1
  100. package/dist/types/src/components/Main/Main.d.ts +7 -3
  101. package/dist/types/src/components/Main/Main.d.ts.map +1 -1
  102. package/dist/types/src/components/Main/Main.stories.d.ts.map +1 -1
  103. package/dist/types/src/components/Main/useSwipeToDismiss.d.ts.map +1 -1
  104. package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts +46 -0
  105. package/dist/types/src/components/MediaPlayer/MediaPlayer.d.ts.map +1 -0
  106. package/dist/types/src/components/MediaPlayer/MediaPlayer.stories.d.ts +16 -0
  107. package/dist/types/src/components/MediaPlayer/MediaPlayer.stories.d.ts.map +1 -0
  108. package/dist/types/src/components/MediaPlayer/index.d.ts +2 -0
  109. package/dist/types/src/components/MediaPlayer/index.d.ts.map +1 -0
  110. package/dist/types/src/components/Menu/ContextMenu.d.ts.map +1 -1
  111. package/dist/types/src/components/Menu/ContextMenu.stories.d.ts.map +1 -1
  112. package/dist/types/src/components/Menu/DropdownMenu.d.ts +13 -6
  113. package/dist/types/src/components/Menu/DropdownMenu.d.ts.map +1 -1
  114. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts +9 -1
  115. package/dist/types/src/components/Menu/DropdownMenu.stories.d.ts.map +1 -1
  116. package/dist/types/src/components/Message/Message.d.ts +1 -1
  117. package/dist/types/src/components/Message/Message.d.ts.map +1 -1
  118. package/dist/types/src/components/Message/Message.stories.d.ts +2 -2
  119. package/dist/types/src/components/Message/Message.stories.d.ts.map +1 -1
  120. package/dist/types/src/components/Popover/Popover.d.ts +14 -3
  121. package/dist/types/src/components/Popover/Popover.d.ts.map +1 -1
  122. package/dist/types/src/components/Popover/Popover.stories.d.ts.map +1 -1
  123. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts +12 -9
  124. package/dist/types/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  125. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts +18 -5
  126. package/dist/types/src/components/ScrollArea/ScrollArea.stories.d.ts.map +1 -1
  127. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts +42 -13
  128. package/dist/types/src/components/ScrollContainer/ScrollContainer.d.ts.map +1 -1
  129. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts +5 -6
  130. package/dist/types/src/components/ScrollContainer/ScrollContainer.stories.d.ts.map +1 -1
  131. package/dist/types/src/components/Select/Select.d.ts.map +1 -1
  132. package/dist/types/src/components/Select/Select.stories.d.ts +2 -2
  133. package/dist/types/src/components/Select/Select.stories.d.ts.map +1 -1
  134. package/dist/types/src/components/Skeleton/Skeleton.stories.d.ts.map +1 -1
  135. package/dist/types/src/components/Splitter/Splitter.d.ts +19 -17
  136. package/dist/types/src/components/Splitter/Splitter.d.ts.map +1 -1
  137. package/dist/types/src/components/Splitter/Splitter.stories.d.ts.map +1 -1
  138. package/dist/types/src/components/Status/Status.d.ts +3 -4
  139. package/dist/types/src/components/Status/Status.d.ts.map +1 -1
  140. package/dist/types/src/components/Status/Status.stories.d.ts.map +1 -1
  141. package/dist/types/src/components/Tag/Tag.stories.d.ts.map +1 -1
  142. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts +1 -1
  143. package/dist/types/src/components/ThemeProvider/ThemeProvider.d.ts.map +1 -1
  144. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts +1 -1
  145. package/dist/types/src/components/ThemeProvider/ThemeProvider.stories.d.ts.map +1 -1
  146. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts +54 -55
  147. package/dist/types/src/components/ThemeProvider/TranslationsProvider.d.ts.map +1 -1
  148. package/dist/types/src/components/ThemeProvider/index.d.ts +1 -1
  149. package/dist/types/src/components/ThemeProvider/index.d.ts.map +1 -1
  150. package/dist/types/src/components/Toast/Toast.d.ts +4 -4
  151. package/dist/types/src/components/Toast/Toast.d.ts.map +1 -1
  152. package/dist/types/src/components/Toast/Toast.stories.d.ts.map +1 -1
  153. package/dist/types/src/components/Toolbar/Toolbar.d.ts +11 -15
  154. package/dist/types/src/components/Toolbar/Toolbar.d.ts.map +1 -1
  155. package/dist/types/src/components/Toolbar/Toolbar.stories.d.ts.map +1 -1
  156. package/dist/types/src/components/Tooltip/Tooltip.d.ts +8 -8
  157. package/dist/types/src/components/Tooltip/Tooltip.d.ts.map +1 -1
  158. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts +2 -2
  159. package/dist/types/src/components/Tooltip/Tooltip.stories.d.ts.map +1 -1
  160. package/dist/types/src/components/index.d.ts +3 -0
  161. package/dist/types/src/components/index.d.ts.map +1 -1
  162. package/dist/types/src/exemplars/generics.stories.d.ts +6 -5
  163. package/dist/types/src/exemplars/generics.stories.d.ts.map +1 -1
  164. package/dist/types/src/exemplars/slot.stories.d.ts +1 -0
  165. package/dist/types/src/exemplars/slot.stories.d.ts.map +1 -1
  166. package/dist/types/src/exemplars/tabster.stories.d.ts.map +1 -1
  167. package/dist/types/src/exemplars/virtualizer.stories.d.ts.map +1 -1
  168. package/dist/types/src/hooks/useDensityContext.d.ts +1 -1
  169. package/dist/types/src/hooks/useDensityContext.d.ts.map +1 -1
  170. package/dist/types/src/hooks/useElevationContext.d.ts.map +1 -1
  171. package/dist/types/src/hooks/useIconHref.d.ts.map +1 -1
  172. package/dist/types/src/hooks/useSafeArea.d.ts.map +1 -1
  173. package/dist/types/src/hooks/useSafeCollisionPadding.d.ts.map +1 -1
  174. package/dist/types/src/hooks/useVisualViewport.d.ts.map +1 -1
  175. package/dist/types/src/playground/Controls.stories.d.ts.map +1 -1
  176. package/dist/types/src/playground/Custom.stories.d.ts +1 -1
  177. package/dist/types/src/playground/Custom.stories.d.ts.map +1 -1
  178. package/dist/types/src/playground/Typography.stories.d.ts.map +1 -1
  179. package/dist/types/src/primitives/Column/Column.d.ts +21 -14
  180. package/dist/types/src/primitives/Column/Column.d.ts.map +1 -1
  181. package/dist/types/src/primitives/Column/Column.stories.d.ts +19 -0
  182. package/dist/types/src/primitives/Column/Column.stories.d.ts.map +1 -1
  183. package/dist/types/src/primitives/Container/Container.d.ts +4 -5
  184. package/dist/types/src/primitives/Container/Container.d.ts.map +1 -1
  185. package/dist/types/src/primitives/Container/Container.stories.d.ts.map +1 -1
  186. package/dist/types/src/primitives/Flex/Flex.d.ts +5 -7
  187. package/dist/types/src/primitives/Flex/Flex.d.ts.map +1 -1
  188. package/dist/types/src/primitives/Flex/Flex.stories.d.ts.map +1 -1
  189. package/dist/types/src/primitives/Grid/Grid.d.ts +3 -8
  190. package/dist/types/src/primitives/Grid/Grid.d.ts.map +1 -1
  191. package/dist/types/src/primitives/Grid/Grid.stories.d.ts.map +1 -1
  192. package/dist/types/src/primitives/Panel/Panel.d.ts +24 -15
  193. package/dist/types/src/primitives/Panel/Panel.d.ts.map +1 -1
  194. package/dist/types/src/primitives/Panel/Panel.stories.d.ts.map +1 -1
  195. package/dist/types/src/testing/Loading.d.ts.map +1 -1
  196. package/dist/types/src/testing/decorators/withLayout.d.ts.map +1 -1
  197. package/dist/types/src/testing/decorators/withLayoutVariants.d.ts.map +1 -1
  198. package/dist/types/src/testing/decorators/withTheme.d.ts +1 -1
  199. package/dist/types/src/testing/decorators/withTheme.d.ts.map +1 -1
  200. package/dist/types/src/translations.d.ts +8 -3
  201. package/dist/types/src/translations.d.ts.map +1 -1
  202. package/dist/types/src/util/usePx.d.ts.map +1 -1
  203. package/dist/types/tsconfig.tsbuildinfo +1 -1
  204. package/package.json +29 -26
  205. package/src/components/Avatars/Avatar.stories.tsx +2 -3
  206. package/src/components/Avatars/Avatar.tsx +1 -2
  207. package/src/components/Avatars/AvatarGroup.stories.tsx +0 -1
  208. package/src/components/Breadcrumb/Breadcrumb.stories.tsx +1 -2
  209. package/src/components/Button/Button.stories.tsx +0 -1
  210. package/src/components/Button/Button.tsx +3 -11
  211. package/src/components/Button/IconButton.stories.tsx +6 -4
  212. package/src/components/Button/IconButton.tsx +3 -3
  213. package/src/components/Button/Toggle.stories.tsx +0 -1
  214. package/src/components/Button/ToggleGroup.stories.tsx +0 -1
  215. package/src/components/Card/Card.stories.tsx +15 -15
  216. package/src/components/Card/Card.tsx +190 -66
  217. package/src/components/Carousel/Carousel.tsx +379 -0
  218. package/src/components/Carousel/index.ts +5 -0
  219. package/src/components/Clipboard/CopyButton.tsx +5 -6
  220. package/src/components/Dialog/AlertDialog.stories.tsx +5 -6
  221. package/src/components/Dialog/AlertDialog.tsx +51 -93
  222. package/src/components/Dialog/Dialog.stories.tsx +64 -9
  223. package/src/components/Dialog/Dialog.tsx +66 -56
  224. package/src/components/ErrorFallback/ErrorFallback.stories.tsx +3 -8
  225. package/src/components/ErrorFallback/ErrorStack.tsx +36 -2
  226. package/src/components/Focus/AUDIT.md +43 -0
  227. package/src/components/Focus/Focus.stories.tsx +230 -0
  228. package/src/components/Focus/Focus.tsx +201 -0
  229. package/src/components/Focus/index.ts +5 -0
  230. package/src/components/Icon/Icon.stories.tsx +43 -13
  231. package/src/components/Icon/Icon.tsx +13 -3
  232. package/src/components/Image/Image.stories.tsx +3 -3
  233. package/src/components/Image/Image.tsx +31 -8
  234. package/src/components/Input/Input.stories.tsx +3 -4
  235. package/src/components/Input/Input.tsx +3 -3
  236. package/src/components/Link/Link.stories.tsx +0 -1
  237. package/src/components/Link/Link.tsx +10 -2
  238. package/src/components/List/List.stories.tsx +1 -2
  239. package/src/components/List/List.tsx +7 -6
  240. package/src/components/List/ListDropIndicator.tsx +0 -1
  241. package/src/components/List/Tree.stories.tsx +2 -3
  242. package/src/components/List/Tree.tsx +0 -1
  243. package/src/components/List/Treegrid.stories.tsx +26 -27
  244. package/src/components/List/Treegrid.tsx +14 -14
  245. package/src/components/Main/Main.stories.tsx +0 -1
  246. package/src/components/Main/Main.tsx +0 -1
  247. package/src/components/MediaPlayer/MediaPlayer.stories.tsx +50 -0
  248. package/src/components/MediaPlayer/MediaPlayer.tsx +153 -0
  249. package/src/components/MediaPlayer/index.ts +5 -0
  250. package/src/components/Menu/ContextMenu.stories.tsx +0 -1
  251. package/src/components/Menu/DropdownMenu.stories.tsx +0 -1
  252. package/src/components/Menu/DropdownMenu.tsx +3 -3
  253. package/src/components/Message/Message.stories.tsx +7 -8
  254. package/src/components/Message/Message.tsx +23 -10
  255. package/src/components/Popover/Popover.stories.tsx +4 -5
  256. package/src/components/Popover/Popover.tsx +1 -1
  257. package/src/components/ScrollArea/ScrollArea.stories.tsx +89 -30
  258. package/src/components/ScrollArea/ScrollArea.tsx +39 -23
  259. package/src/components/ScrollContainer/ScrollContainer.stories.tsx +19 -17
  260. package/src/components/ScrollContainer/ScrollContainer.tsx +199 -92
  261. package/src/components/Select/Select.stories.tsx +5 -6
  262. package/src/components/Skeleton/Skeleton.stories.tsx +0 -1
  263. package/src/components/Splitter/Splitter.stories.tsx +29 -29
  264. package/src/components/Splitter/Splitter.tsx +35 -34
  265. package/src/components/Status/Status.stories.tsx +0 -1
  266. package/src/components/Status/Status.tsx +8 -5
  267. package/src/components/Tag/Tag.stories.tsx +0 -1
  268. package/src/components/ThemeProvider/ThemeProvider.stories.tsx +0 -1
  269. package/src/components/ThemeProvider/ThemeProvider.tsx +5 -4
  270. package/src/components/ThemeProvider/index.ts +1 -1
  271. package/src/components/Toast/Toast.stories.tsx +0 -1
  272. package/src/components/Toolbar/Toolbar.stories.tsx +0 -1
  273. package/src/components/Toolbar/Toolbar.tsx +19 -15
  274. package/src/components/Tooltip/Tooltip.stories.tsx +7 -8
  275. package/src/components/Tooltip/Tooltip.tsx +14 -13
  276. package/src/components/index.ts +3 -0
  277. package/src/exemplars/generics.stories.tsx +7 -15
  278. package/src/exemplars/slot.stories.tsx +65 -57
  279. package/src/exemplars/tabster.stories.tsx +1 -1
  280. package/src/exemplars/virtualizer.stories.tsx +4 -5
  281. package/src/hooks/useDensityContext.ts +2 -2
  282. package/src/playground/Custom.stories.tsx +6 -9
  283. package/src/primitives/Column/AUDIT.md +148 -0
  284. package/src/primitives/Column/Column.stories.tsx +122 -19
  285. package/src/primitives/Column/Column.tsx +73 -41
  286. package/src/primitives/Container/Container.stories.tsx +0 -1
  287. package/src/primitives/Container/Container.tsx +5 -8
  288. package/src/primitives/Flex/Flex.stories.tsx +0 -1
  289. package/src/primitives/Flex/Flex.tsx +10 -12
  290. package/src/primitives/Grid/Grid.stories.tsx +0 -1
  291. package/src/primitives/Grid/Grid.tsx +4 -9
  292. package/src/primitives/Panel/Panel.stories.tsx +8 -7
  293. package/src/primitives/Panel/Panel.tsx +64 -63
  294. package/src/testing/Loading.tsx +25 -4
  295. package/src/testing/decorators/withLayout.tsx +7 -17
  296. package/src/testing/decorators/withTheme.tsx +10 -7
  297. package/src/translations.ts +8 -3
  298. package/src/util/usePx.ts +1 -0
  299. package/dist/lib/browser/chunk-EJSGYGYH.mjs.map +0 -7
  300. package/dist/lib/node-esm/chunk-B7MXDDMJ.mjs.map +0 -7
@@ -5,25 +5,24 @@
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import React from 'react';
7
7
 
8
- import { faker } from '@dxos/random';
8
+ import { random } from '@dxos/random';
9
9
  import { type MessageValence } from '@dxos/ui-types';
10
10
 
11
11
  import { withTheme } from '../../testing';
12
-
13
12
  import { Message } from './Message';
14
13
 
15
- faker.seed(123);
14
+ random.seed(123);
16
15
 
17
- type StoryProps = {
16
+ type DefaultStoryProps = {
18
17
  valence: MessageValence;
19
18
  title: string;
20
19
  body: string;
21
20
  };
22
21
 
23
- const DefaultStory = ({ valence, title, body }: StoryProps) => (
22
+ const DefaultStory = ({ valence, title, body }: DefaultStoryProps) => (
24
23
  <div className='w-[30rem]'>
25
24
  <Message.Root valence={valence}>
26
- {title && <Message.Title>{title}</Message.Title>}
25
+ {title && <Message.Title onClose={() => console.log('close')}>{title}</Message.Title>}
27
26
  {body && <Message.Content>{body}</Message.Content>}
28
27
  </Message.Root>
29
28
  </div>
@@ -53,7 +52,7 @@ export const Default: Story = {
53
52
  args: {
54
53
  valence: 'neutral',
55
54
  title: 'Alert title',
56
- body: faker.lorem.paragraphs(1),
55
+ body: random.lorem.paragraphs(1),
57
56
  },
58
57
  };
59
58
 
@@ -61,6 +60,6 @@ export const Error: Story = {
61
60
  args: {
62
61
  valence: 'error',
63
62
  title: 'Error title',
64
- body: faker.lorem.paragraphs(1),
63
+ body: random.lorem.paragraphs(1),
65
64
  },
66
65
  };
@@ -6,12 +6,16 @@ import { createContext } from '@radix-ui/react-context';
6
6
  import { Primitive } from '@radix-ui/react-primitive';
7
7
  import { Slot } from '@radix-ui/react-slot';
8
8
  import React, { type ComponentPropsWithRef, forwardRef } from 'react';
9
+ import { useTranslation } from 'react-i18next';
9
10
 
10
11
  import { useId } from '@dxos/react-hooks';
11
12
  import { type Elevation, type MessageValence } from '@dxos/ui-types';
12
13
 
14
+ import { translationKey } from '#translations';
15
+
13
16
  import { useElevationContext, useThemeContext } from '../../hooks';
14
17
  import { type ThemedClassName } from '../../util';
18
+ import { IconButton } from '../Button';
15
19
  import { Icon } from '../Icon';
16
20
 
17
21
  const messageIcons: Record<MessageValence, string> = {
@@ -84,27 +88,36 @@ MessageRoot.displayName = MESSAGE_NAME;
84
88
  //
85
89
 
86
90
  type MessageTitleProps = Omit<ThemedClassName<ComponentPropsWithRef<typeof Primitive.h2>>, 'id'> & {
87
- asChild?: boolean;
88
91
  icon?: string;
92
+ onClose?: () => void;
89
93
  };
90
94
 
91
95
  const MESSAGE_TITLE_NAME = 'MessageTitle';
92
96
 
93
97
  const MessageTitle = forwardRef<HTMLHeadingElement, MessageTitleProps>(
94
- ({ asChild, classNames, children, icon: iconProp, ...props }, forwardedRef) => {
98
+ ({ classNames, children, icon: iconProp, onClose }, forwardedRef) => {
99
+ const { t } = useTranslation(translationKey);
95
100
  const { tx } = useThemeContext();
96
101
  const { titleId, valence } = useMessageContext(MESSAGE_TITLE_NAME);
97
- const Comp = asChild ? Slot : Primitive.h2;
98
102
  const icon = iconProp ?? messageIcons[valence];
99
103
  return (
100
- <Comp {...props} className={tx('message.header', {}, classNames)} id={titleId} ref={forwardedRef}>
101
- {!icon && valence === 'neutral' ? (
102
- <div />
103
- ) : (
104
- <Icon size={5} icon={icon} classNames={tx('message.icon', { valence })} />
104
+ <div className={tx('message.header', {}, classNames)} id={titleId} ref={forwardedRef}>
105
+ {icon && (
106
+ <div className={tx('message.icon', { valence })}>
107
+ <Icon icon={icon} />
108
+ </div>
105
109
  )}
106
- <span className={tx('message.title', {}, classNames)}>{children}</span>
107
- </Comp>
110
+ <h2 className={tx('message.title', {}, classNames)}>{children}</h2>
111
+ {onClose && (
112
+ <IconButton
113
+ variant='ghost'
114
+ icon='ph--x--regular'
115
+ iconOnly
116
+ label={t('toolbar-close.label')}
117
+ onClick={onClose}
118
+ />
119
+ )}
120
+ </div>
108
121
  );
109
122
  },
110
123
  );
@@ -5,14 +5,13 @@
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import React, { type PropsWithChildren, type ReactNode, useRef, useState } from 'react';
7
7
 
8
- import { faker } from '@dxos/random';
8
+ import { random } from '@dxos/random';
9
9
 
10
10
  import { withTheme } from '../../testing';
11
11
  import { Button } from '../Button';
12
-
13
12
  import { Popover } from './Popover';
14
13
 
15
- faker.seed(1234);
14
+ random.seed(1234);
16
15
 
17
16
  const DefaultStory = ({ openTrigger, children }: PropsWithChildren<{ openTrigger: ReactNode }>) => {
18
17
  return (
@@ -42,7 +41,7 @@ type Story = StoryObj<typeof meta>;
42
41
  export const Default: Story = {
43
42
  args: {
44
43
  openTrigger: <Button>Open popover</Button>,
45
- children: faker.lorem.paragraphs(3),
44
+ children: random.lorem.paragraphs(3),
46
45
  },
47
46
  };
48
47
 
@@ -59,7 +58,7 @@ export const VirtualTrigger = {
59
58
  <Popover.VirtualTrigger virtualRef={buttonRef} />
60
59
  <Popover.Content>
61
60
  <Popover.Viewport>
62
- <p className='px-2 py-1 min-w-[18rem] max-w-[38rem]'>{faker.lorem.paragraphs(3)}</p>
61
+ <p className='px-2 py-1 min-w-[18rem] max-w-[38rem]'>{random.lorem.paragraphs(3)}</p>
63
62
  </Popover.Viewport>
64
63
  <Popover.Arrow />
65
64
  </Popover.Content>
@@ -232,7 +232,7 @@ type PopoverPortalProps = {
232
232
  forceMount?: true;
233
233
  };
234
234
 
235
- const PopoverPortal: FC<PopoverPortalProps> = (props: ScopedProps<PopoverPortalProps>) => {
235
+ const PopoverPortal = (props: ScopedProps<PopoverPortalProps>) => {
236
236
  const { __scopePopover, forceMount, children, container } = props;
237
237
  const context = usePopoverContext(PORTAL_NAME, __scopePopover);
238
238
  return (
@@ -2,16 +2,18 @@
2
2
  // Copyright 2026 DXOS.org
3
3
  //
4
4
 
5
- import React, { useMemo } from 'react';
5
+ import React, { PropsWithChildren, useMemo } from 'react';
6
6
 
7
- import { faker } from '@dxos/random';
7
+ import { random } from '@dxos/random';
8
8
  import { mx } from '@dxos/ui-theme';
9
+ import { ThemedClassName } from '@dxos/ui-types';
9
10
 
11
+ import { Column } from '../../primitives';
10
12
  import { withLayout, withTheme } from '../../testing';
11
-
13
+ import { Input } from '../Input';
12
14
  import { ScrollArea } from './ScrollArea';
13
15
 
14
- faker.seed(123);
16
+ random.seed(123);
15
17
 
16
18
  export default {
17
19
  title: 'ui/react-ui-core/components/ScrollArea',
@@ -22,22 +24,22 @@ export default {
22
24
  },
23
25
  };
24
26
 
25
- const Column = () => (
27
+ const List = ({ items = 50 }: { items?: number }) => (
26
28
  <div>
27
- {Array.from({ length: 50 }).map((_, index) => (
28
- <div key={index} className='px-1 text-sm cursor-pointer hover:bg-hover-surface'>
29
+ {Array.from({ length: items }).map((_, index) => (
30
+ <div key={index} className='px-1 cursor-pointer hover:bg-hover-surface'>
29
31
  Item {index + 1}
30
32
  </div>
31
33
  ))}
32
34
  </div>
33
35
  );
34
36
 
35
- const Row = () => (
37
+ const Row = ({ items = 50 }: { items?: number }) => (
36
38
  <div className='flex gap-2 w-max'>
37
- {Array.from({ length: 50 }).map((_, index) => (
39
+ {Array.from({ length: items }).map((_, index) => (
38
40
  <div
39
41
  key={index}
40
- className='shrink-0 h-20 w-20 cursor-pointer border border-separator rounded-md flex items-center justify-center text-sm hover:bg-hover-surface'
42
+ className='shrink-0 h-20 w-20 cursor-pointer border border-separator rounded-md flex items-center justify-center hover:bg-hover-surface'
41
43
  >
42
44
  {index + 1}
43
45
  </div>
@@ -45,58 +47,91 @@ const Row = () => (
45
47
  </div>
46
48
  );
47
49
 
50
+ const Container = ({ classNames, children }: ThemedClassName<PropsWithChildren>) => {
51
+ return <div className={mx('border border-separator rounded-md overflow-hidden', classNames)}>{children}</div>;
52
+ };
53
+
48
54
  export const Vertical = {
49
55
  render: () => (
50
- <div className='h-72 w-48 p-2 border border-separator rounded-md'>
51
- <ScrollArea.Root orientation='vertical' padding>
56
+ <Container classNames='h-72 w-48'>
57
+ <ScrollArea.Root orientation='vertical'>
52
58
  <ScrollArea.Viewport>
53
- <Column />
59
+ <List />
54
60
  </ScrollArea.Viewport>
55
61
  </ScrollArea.Root>
56
- </div>
62
+ </Container>
57
63
  ),
58
64
  };
59
65
 
60
66
  export const VerticalThin = {
61
67
  render: () => (
62
- <div className='h-72 w-48 p-2 border border-separator rounded-md'>
63
- <ScrollArea.Root orientation='vertical' padding thin>
68
+ <Container classNames='h-72 w-48'>
69
+ <ScrollArea.Root orientation='vertical' thin>
64
70
  <ScrollArea.Viewport>
65
- <Column />
71
+ <List />
66
72
  </ScrollArea.Viewport>
67
73
  </ScrollArea.Root>
68
- </div>
74
+ </Container>
75
+ ),
76
+ };
77
+
78
+ export const VerticalPadded = {
79
+ render: () => (
80
+ <Container classNames='h-72 w-48'>
81
+ <ScrollArea.Root orientation='vertical' centered padding thin>
82
+ <ScrollArea.Viewport>
83
+ <List />
84
+ </ScrollArea.Viewport>
85
+ </ScrollArea.Root>
86
+ </Container>
87
+ ),
88
+ };
89
+
90
+ export const VerticalColumn = {
91
+ render: () => (
92
+ <Container classNames='h-72 w-48'>
93
+ <Column.Root gutter='sm' classNames='h-full overflow-hidden'>
94
+ <ScrollArea.Root orientation='vertical' padding thin>
95
+ <ScrollArea.Viewport classNames='py-2'>
96
+ <Input.Root>
97
+ <Input.TextInput classNames='p-1' />
98
+ </Input.Root>
99
+ <List />
100
+ </ScrollArea.Viewport>
101
+ </ScrollArea.Root>
102
+ </Column.Root>
103
+ </Container>
69
104
  ),
70
105
  };
71
106
 
72
107
  export const Horizontal = {
73
108
  render: () => (
74
- <div className='w-96 p-2 border border-separator rounded-md'>
75
- <ScrollArea.Root orientation='horizontal' padding>
109
+ <Container classNames='w-96'>
110
+ <ScrollArea.Root orientation='horizontal'>
76
111
  <ScrollArea.Viewport>
77
112
  <Row />
78
113
  </ScrollArea.Viewport>
79
114
  </ScrollArea.Root>
80
- </div>
115
+ </Container>
81
116
  ),
82
117
  };
83
118
 
84
119
  export const HorizontalThin = {
85
120
  render: () => (
86
- <div className='w-96 p-2 border border-separator rounded-md'>
87
- <ScrollArea.Root orientation='horizontal' padding thin>
121
+ <Container classNames='w-96'>
122
+ <ScrollArea.Root orientation='horizontal' thin>
88
123
  <ScrollArea.Viewport>
89
124
  <Row />
90
125
  </ScrollArea.Viewport>
91
126
  </ScrollArea.Root>
92
- </div>
127
+ </Container>
93
128
  ),
94
129
  };
95
130
 
96
131
  export const Both = {
97
132
  render: () => (
98
- <div className='h-96 w-96 p-2 border border-separator rounded-md'>
99
- <ScrollArea.Root orientation='all' padding>
133
+ <Container classNames='w-96 h-96'>
134
+ <ScrollArea.Root orientation='all'>
100
135
  <ScrollArea.Viewport>
101
136
  <div className='flex flex-col gap-2'>
102
137
  {Array.from({ length: 50 }).map((_, rowIndex) => (
@@ -114,7 +149,31 @@ export const Both = {
114
149
  </div>
115
150
  </ScrollArea.Viewport>
116
151
  </ScrollArea.Root>
117
- </div>
152
+ </Container>
153
+ ),
154
+ };
155
+
156
+ export const Fullscreen = {
157
+ decorators: [withTheme(), withLayout({ layout: 'fullscreen' })],
158
+ render: () => (
159
+ <ScrollArea.Root orientation='all' thin>
160
+ <ScrollArea.Viewport>
161
+ <div className='flex flex-col gap-2'>
162
+ {Array.from({ length: 50 }).map((_, rowIndex) => (
163
+ <div key={rowIndex} className='flex gap-2'>
164
+ {Array.from({ length: 50 }).map((_, colIndex) => (
165
+ <div
166
+ key={colIndex}
167
+ className='shrink-0 h-20 w-20 flex items-center justify-center text-sm border border-separator font-mono'
168
+ >
169
+ [{colIndex}:{rowIndex}]
170
+ </div>
171
+ ))}
172
+ </div>
173
+ ))}
174
+ </div>
175
+ </ScrollArea.Viewport>
176
+ </ScrollArea.Root>
118
177
  ),
119
178
  };
120
179
 
@@ -125,13 +184,13 @@ export const NestedScrollAreas = {
125
184
  () =>
126
185
  Array.from({ length: 8 }).map((_, index) => ({
127
186
  id: String(index),
128
- count: faker.number.int({ min: 5, max: 20 }),
187
+ count: random.number.int({ min: 5, max: 20 }),
129
188
  })),
130
189
  [],
131
190
  );
132
191
 
133
192
  return (
134
- <ScrollArea.Root thin orientation='horizontal'>
193
+ <ScrollArea.Root orientation='horizontal' thin padding>
135
194
  <ScrollArea.Viewport classNames='gap-4'>
136
195
  {columns.map((column) => (
137
196
  <section
@@ -170,7 +229,7 @@ export const NativeScroll = {
170
229
  'group-hover:[&::-webkit-scrollbar-thumb]:bg-scrollbar-thumb',
171
230
  )}
172
231
  >
173
- <Column />
232
+ <List />
174
233
  </div>
175
234
  </div>
176
235
  ),
@@ -5,10 +5,10 @@
5
5
  import { createContext } from '@radix-ui/react-context';
6
6
  import { Primitive } from '@radix-ui/react-primitive';
7
7
  import { Slot } from '@radix-ui/react-slot';
8
- import React, { type HTMLAttributes, forwardRef } from 'react';
8
+ import React, { CSSProperties, useMemo } from 'react';
9
9
 
10
- import { composableProps } from '@dxos/ui-theme';
11
- import { type AllowedAxis, type SlottableProps, type ThemedClassName } from '@dxos/ui-types';
10
+ import { composableProps, scrollbar, slottable } from '@dxos/ui-theme';
11
+ import { type AllowedAxis, type SlottableProps } from '@dxos/ui-types';
12
12
 
13
13
  import { useThemeContext } from '../../hooks';
14
14
 
@@ -24,7 +24,7 @@ type ScrollAreaContextType = {
24
24
  /** Hide scrollbars when not scrolling. */
25
25
  autoHide: boolean;
26
26
  /** Apply padding to opposite side of scrollbar. */
27
- margin?: boolean;
27
+ centered?: boolean;
28
28
  /** Apply padding. */
29
29
  padding: boolean;
30
30
  /** Use thin scrollbars. */
@@ -41,19 +41,19 @@ const [ScrollAreaProvider, useScrollAreaContext] = createContext<ScrollAreaConte
41
41
 
42
42
  const SCROLLAREA_ROOT_NAME = 'ScrollArea.Root';
43
43
 
44
- type ScrollAreaRootProps = SlottableProps<HTMLDivElement, Partial<ScrollAreaContextType>>;
44
+ type ScrollAreaRootProps = Partial<ScrollAreaContextType>;
45
45
 
46
46
  /**
47
47
  * ScrollArea provides native scrollbars with custom styling.
48
48
  */
49
- const ScrollAreaRoot = forwardRef<HTMLDivElement, ScrollAreaRootProps>(
49
+ const ScrollAreaRoot = slottable<HTMLDivElement, ScrollAreaRootProps>(
50
50
  (
51
51
  {
52
52
  children,
53
53
  asChild,
54
54
  orientation = 'vertical',
55
55
  autoHide = true,
56
- margin = false,
56
+ centered = false,
57
57
  padding = false,
58
58
  thin = false,
59
59
  snap = false,
@@ -61,10 +61,13 @@ const ScrollAreaRoot = forwardRef<HTMLDivElement, ScrollAreaRootProps>(
61
61
  },
62
62
  forwardedRef,
63
63
  ) => {
64
+ const { tx } = useThemeContext();
64
65
  const { className, ...rest } = composableProps(props);
65
66
  const Comp = asChild ? Slot : Primitive.div;
66
- const { tx } = useThemeContext();
67
- const options = { orientation, autoHide, margin, padding, thin, snap };
67
+ const options = useMemo(
68
+ () => ({ orientation, autoHide, centered, padding, thin, snap }),
69
+ [orientation, autoHide, centered, padding, thin, snap],
70
+ );
68
71
 
69
72
  return (
70
73
  <ScrollAreaProvider {...options}>
@@ -84,20 +87,33 @@ ScrollAreaRoot.displayName = SCROLLAREA_ROOT_NAME;
84
87
 
85
88
  const SCROLLAREA_VIEWPORT_NAME = 'ScrollArea.Viewport';
86
89
 
87
- type ScrollAreaViewportProps = ThemedClassName<HTMLAttributes<HTMLDivElement>>;
88
-
89
- const ScrollAreaViewport = forwardRef<HTMLDivElement, ScrollAreaViewportProps>(
90
- ({ classNames, children, ...props }, forwardedRef) => {
91
- const { tx } = useThemeContext();
92
- const options = useScrollAreaContext(SCROLLAREA_VIEWPORT_NAME);
93
-
94
- return (
95
- <div {...props} className={tx('scrollArea.viewport', options, classNames)} ref={forwardedRef}>
96
- {children}
97
- </div>
98
- );
99
- },
100
- );
90
+ type ScrollAreaViewportProps = SlottableProps;
91
+
92
+ const ScrollAreaViewport = slottable<HTMLDivElement>(({ children, asChild, ...props }, forwardedRef) => {
93
+ const { tx } = useThemeContext();
94
+ const options = useScrollAreaContext(SCROLLAREA_VIEWPORT_NAME);
95
+ const density = options.thin ? scrollbar.thin : scrollbar.coarse;
96
+ const { className, ...rest } = composableProps(props);
97
+ const { style, ...restWithoutStyle } = rest as { style?: CSSProperties; [key: string]: any };
98
+ const Comp = asChild ? Slot : Primitive.div;
99
+
100
+ return (
101
+ <Comp
102
+ {...restWithoutStyle}
103
+ style={
104
+ {
105
+ '--scroll-width': `${density.size}px`,
106
+ '--scroll-padding': `${density.padding}px`,
107
+ ...style,
108
+ } as CSSProperties
109
+ }
110
+ className={tx('scrollArea.viewport', options, className)}
111
+ ref={forwardedRef}
112
+ >
113
+ {children}
114
+ </Comp>
115
+ );
116
+ });
101
117
 
102
118
  ScrollAreaViewport.displayName = SCROLLAREA_VIEWPORT_NAME;
103
119
 
@@ -5,23 +5,22 @@
5
5
  import { type Meta, type StoryObj } from '@storybook/react-vite';
6
6
  import React, { useEffect, useRef, useState } from 'react';
7
7
 
8
- import { faker } from '@dxos/random';
8
+ import { random } from '@dxos/random';
9
9
 
10
10
  import { Panel } from '../../primitives';
11
11
  import { withLayout, withTheme } from '../../testing';
12
12
  import { Button } from '../Button';
13
13
  import { Toolbar } from '../Toolbar';
14
-
15
14
  import { ScrollContainer, type ScrollContainerRootProps, type ScrollController } from './ScrollContainer';
16
15
 
17
- type StoryProps = ScrollContainerRootProps & { running?: boolean; initialLines?: number };
16
+ type DefaultStoryProps = ScrollContainerRootProps & { running?: boolean; initialLines?: number };
18
17
 
19
- const DefaultStory = ({ initialLines = 0, running: runningProp, ...props }: StoryProps) => {
18
+ const DefaultStory = ({ initialLines = 0, running: runningProp, ...props }: DefaultStoryProps) => {
20
19
  const [lines, setLines] = useState<string[]>([]);
21
20
  const [running, setRunning] = useState(runningProp);
22
21
  const scroller = useRef<ScrollController>(null);
23
22
  useEffect(() => {
24
- setLines(Array.from({ length: initialLines }, () => faker.lorem.paragraph()));
23
+ setLines(Array.from({ length: initialLines }, () => random.lorem.paragraph()));
25
24
  }, [initialLines]);
26
25
  useEffect(() => {
27
26
  if (!running) {
@@ -29,7 +28,7 @@ const DefaultStory = ({ initialLines = 0, running: runningProp, ...props }: Stor
29
28
  }
30
29
 
31
30
  const i = setInterval(() => {
32
- setLines((lines) => [...lines, faker.lorem.paragraph()]);
31
+ setLines((lines) => [...lines, random.lorem.paragraph()]);
33
32
  }, 500);
34
33
 
35
34
  return () => clearInterval(i);
@@ -45,16 +44,19 @@ const DefaultStory = ({ initialLines = 0, running: runningProp, ...props }: Stor
45
44
  <div className='px-1'>{lines.length}</div>
46
45
  </Toolbar.Root>
47
46
  </Panel.Toolbar>
48
- <Panel.Content asChild>
47
+ <Panel.Content>
49
48
  <ScrollContainer.Root {...props} ref={scroller}>
50
- <ScrollContainer.Viewport>
51
- {lines.map((line, index) => (
52
- <div key={index} className='p-2 text-description'>
53
- {line}
54
- </div>
55
- ))}
56
- </ScrollContainer.Viewport>
57
- <ScrollContainer.ScrollDownButton />
49
+ <ScrollContainer.Content>
50
+ <ScrollContainer.Viewport>
51
+ {lines.map((line, index) => (
52
+ <div key={index} className='p-2 text-description'>
53
+ {line}
54
+ </div>
55
+ ))}
56
+ </ScrollContainer.Viewport>
57
+ <ScrollContainer.ScrollDownButton />
58
+ <ScrollContainer.Fade />
59
+ </ScrollContainer.Content>
58
60
  </ScrollContainer.Root>
59
61
  </Panel.Content>
60
62
  </Panel.Root>
@@ -75,7 +77,7 @@ type Story = StoryObj<typeof meta>;
75
77
  export const Default: Story = {
76
78
  args: {
77
79
  pin: true,
78
- fade: true,
80
+
79
81
  running: true,
80
82
  },
81
83
  };
@@ -83,7 +85,7 @@ export const Default: Story = {
83
85
  export const Large: Story = {
84
86
  args: {
85
87
  pin: true,
86
- fade: true,
88
+
87
89
  initialLines: 100,
88
90
  },
89
91
  };